From 840a0267cb68e1704f5821b139791664290c4229 Mon Sep 17 00:00:00 2001 From: Florian LEROUX <10078837+floriaaan@users.noreply.github.com> Date: Tue, 14 Feb 2023 15:52:59 +0100 Subject: [PATCH 001/883] init: add files and structure --- .github/workflows/tests.yml | 18 +++++++++++ CONTRIBUTING.md | 0 LICENSE.md | 25 +++++++++++++++ README.md | 59 ++++++++++++++++++++++++++++++++++++ apps/mobile/.gitinclude | 0 apps/web/.gitinclude | 0 services/gateway/.gitinclude | 0 services/protos/.gitinclude | 0 8 files changed, 102 insertions(+) create mode 100644 .github/workflows/tests.yml create mode 100644 CONTRIBUTING.md create mode 100644 LICENSE.md create mode 100644 README.md create mode 100644 apps/mobile/.gitinclude create mode 100644 apps/web/.gitinclude create mode 100644 services/gateway/.gitinclude create mode 100644 services/protos/.gitinclude diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml new file mode 100644 index 00000000..c83c0a05 --- /dev/null +++ b/.github/workflows/tests.yml @@ -0,0 +1,18 @@ +# This workflow will do a clean installation of node dependencies, cache/restore them, build the source code and run tests across different versions of node +# For more information see: https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions + +name: "Tests" + +on: + - push + - pull_request + - workflow_dispatch + + +jobs: + tests: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@master + - name: Temporary echo to see if this is running + run: echo "Hello World" diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 00000000..e69de29b diff --git a/LICENSE.md b/LICENSE.md new file mode 100644 index 00000000..7abda1ad --- /dev/null +++ b/LICENSE.md @@ -0,0 +1,25 @@ +The MIT License (MIT) +===================== + +Copyright © 2022 floriaaan + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the “Software”), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 00000000..cca02fb6 --- /dev/null +++ b/README.md @@ -0,0 +1,59 @@ +# GoodFood 2.0 + +GoodFood 2.0 is a food ordering application for Good Food, a company specializing in food services in France, Belgium, and Luxembourg. + +## Origin / Context + +Good Food was formed from the merger of four food companies. The company offers various food services, including conventional dining, takeout, and delivery with phone orders. Ordering is also available through a web or mobile application. + +The GoodFood 2.0 project was initiated to update the existing ordering application, which had become outdated and was unable to handle more users. The objective is to create a modern, user-friendly, and modular new version that can handle a high volume of concurrent users, up to several thousand. + +## File Hierarchy + +The file hierarchy for this project is as follows: + +``` +. +├── .github +│ └── workflows +│ └── tests.yml +├── README.md +├── (...) # other files like .gitignore, .dockerignore, etc. +├── apps +│ ├── mobile +│ └── web +└── services + ├── gateway + ├── (...) # other services + └── protos +``` + + +## Installation + +TBW : Installation instructions + +## Usage + +TBW : Usage instructions + +## Contributing + +You can contribute to this project by: +- Reporting bugs +- Suggesting new features +- Submitting pull requests + +Any help is welcome, and we will try to answer as soon as possible. +Please read the [CONTRIBUTING.md](CONTRIBUTING.md) file for more information. + +## License + +This project is licensed under the MIT License - see the [LICENSE.md](LICENSE.md) file for details. + +## Authors + +- **[Florian LEROUX](https://github.com/floriaaan)** +- **[Anatole GODARD](https://github.com/Anatole-Godard)** +- **[Pierre LEBIGRE](https://github.com/PierreLbg)** + diff --git a/apps/mobile/.gitinclude b/apps/mobile/.gitinclude new file mode 100644 index 00000000..e69de29b diff --git a/apps/web/.gitinclude b/apps/web/.gitinclude new file mode 100644 index 00000000..e69de29b diff --git a/services/gateway/.gitinclude b/services/gateway/.gitinclude new file mode 100644 index 00000000..e69de29b diff --git a/services/protos/.gitinclude b/services/protos/.gitinclude new file mode 100644 index 00000000..e69de29b From c666079bbb10dc93c37a0861ce27a98cd65f7368 Mon Sep 17 00:00:00 2001 From: Florian LEROUX <10078837+floriaaan@users.noreply.github.com> Date: Fri, 24 Mar 2023 16:02:19 +0100 Subject: [PATCH 002/883] feat: add main terraform files --- .gitignore | 55 ++++++++++++++++++++++++ terraform/data.tf | 9 ++++ terraform/env/dev-backend.tfvars.example | 4 ++ terraform/env/dev.tfvars.example | 1 + terraform/main.tf | 55 ++++++++++++++++++++++++ terraform/outputs.tf | 16 +++++++ terraform/variables.tf | 16 +++++++ 7 files changed, 156 insertions(+) create mode 100644 .gitignore create mode 100644 terraform/data.tf create mode 100644 terraform/env/dev-backend.tfvars.example create mode 100644 terraform/env/dev.tfvars.example create mode 100644 terraform/main.tf create mode 100644 terraform/outputs.tf create mode 100644 terraform/variables.tf diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..bc5dcca7 --- /dev/null +++ b/.gitignore @@ -0,0 +1,55 @@ +### Terraform ### +# Local .terraform directories +**/.terraform/* + +# .tfstate files +*.tfstate +*.tfstate.* + +# Crash log files +crash.log +crash.*.log + +# Exclude all .tfvars files, which are likely to contain sensitive data, such as +# password, private keys, and other secrets. These should not be part of version +# control as they are data points which are potentially sensitive and subject +# to change depending on the environment. +*.tfvars +*.tfvars.json + +# Ignore override files as they are usually used to override resources locally and so +# are not checked in +override.tf +override.tf.json +*_override.tf +*_override.tf.json + +# Include override files you do wish to add to version control using negated pattern +# !example_override.tf + +# Include tfplan files to ignore the plan output of command: terraform plan -out=tfplan +# example: *tfplan* + +# Ignore CLI configuration files +.terraformrc +terraform.rc + +### VisualStudioCode ### +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json +!.vscode/*.code-snippets + +# Local History for Visual Studio Code +.history/ + +# Built Visual Studio Code Extensions +*.vsix + +### VisualStudioCode Patch ### +# Ignore all local history of files +.history +.ionide + diff --git a/terraform/data.tf b/terraform/data.tf new file mode 100644 index 00000000..1906bbe7 --- /dev/null +++ b/terraform/data.tf @@ -0,0 +1,9 @@ +data "azurerm_resource_group" "rg-goodfood" { + name = "rg-${var.project_name}${var.environnment_suffix}" +} + +data "azurerm_key_vault" "kv-goodfood" { + resource_group_name = data.azurerm_resource_group.rg-goodfood.name + name = "kv-${var.project_name}" +} + diff --git a/terraform/env/dev-backend.tfvars.example b/terraform/env/dev-backend.tfvars.example new file mode 100644 index 00000000..7df882a6 --- /dev/null +++ b/terraform/env/dev-backend.tfvars.example @@ -0,0 +1,4 @@ +resource_group_name = "rg-goodfood-dev" +storage_account_name = "sa-goodfood-states" +container_name = "tfstate" +key = "main-dev.tfstate" diff --git a/terraform/env/dev.tfvars.example b/terraform/env/dev.tfvars.example new file mode 100644 index 00000000..4ac1f44d --- /dev/null +++ b/terraform/env/dev.tfvars.example @@ -0,0 +1 @@ +environnment_suffix = "-dev" diff --git a/terraform/main.tf b/terraform/main.tf new file mode 100644 index 00000000..e9cc0e91 --- /dev/null +++ b/terraform/main.tf @@ -0,0 +1,55 @@ +terraform { + required_providers { + azurerm = { + source = "hashicorp/azurerm" + version = "3.48.0" + } + } + backend "azurerm" {} +} + +provider "azurerm" { + features {} +} + +resource "azurerm_service_plan" "sp-goodfood" { + name = "sp-${var.project_name}${var.environnment_suffix}" + resource_group_name = data.azurerm_resource_group.rg-goodfood.name + location = var.location + os_type = "Linux" + sku_name = "S1" +} + +resource "azurerm_linux_web_app" "web-goodfood" { + name = "web-${var.project_name}${var.environnment_suffix}" + resource_group_name = data.azurerm_resource_group.rg-goodfood.name + location = var.location + service_plan_id = azurerm_service_plan.sp-goodfood.id + + site_config { + application_stack { + node_version = "16-lts" + } + } + + app_settings = { + // env + } +} + +resource "azurerm_kubernetes_cluster" "aks-goodfood" { + name = "aks-${var.project_name}${var.environnment_suffix}" + location = var.location + resource_group_name = data.azurerm_resource_group.rg-goodfood.name + dns_prefix = "aks-${var.project_name}${var.environnment_suffix}" + + default_node_pool { + name = "default" + node_count = 1 + vm_size = "Standard_D2_v2" + } + + identity { + type = "SystemAssigned" + } +} \ No newline at end of file diff --git a/terraform/outputs.tf b/terraform/outputs.tf new file mode 100644 index 00000000..e4f4b633 --- /dev/null +++ b/terraform/outputs.tf @@ -0,0 +1,16 @@ +output "main-rg-name" { + value = data.azurerm_resource_group.rg-fleroux.name +} +output "main-rg-id" { + value = data.azurerm_resource_group.rg-fleroux.id +} + +output "client_certificate" { + value = azurerm_kubernetes_cluster.aks-goodfood.kube_config.0.client_certificate + sensitive = true +} + +output "kube_config" { + value = azurerm_kubernetes_cluster.aks-goodfood.kube_config_raw + sensitive = true +} \ No newline at end of file diff --git a/terraform/variables.tf b/terraform/variables.tf new file mode 100644 index 00000000..65fd7547 --- /dev/null +++ b/terraform/variables.tf @@ -0,0 +1,16 @@ +variable "environnment_suffix" { + type = string + description = "The suffix to append to the environment name" +} + +variable "location" { + type = string + description = "The location/region where all resources in this environment should be created" + default = "West Europe" +} + +variable "project_name" { + type = string + description = "The name of the project" + default = "goodfood" +} \ No newline at end of file From eb39d8a36747df42d627fd3761bff28be1a88aa1 Mon Sep 17 00:00:00 2001 From: Florian LEROUX <10078837+floriaaan@users.noreply.github.com> Date: Fri, 24 Mar 2023 16:06:17 +0100 Subject: [PATCH 003/883] feat(proto): add protos for metric and order --- services/protos/metric.proto | 27 +++++++++++++++++++++++++ services/protos/order.proto | 39 ++++++++++++++++++++++++++++++++++++ 2 files changed, 66 insertions(+) create mode 100644 services/protos/metric.proto create mode 100644 services/protos/order.proto diff --git a/services/protos/metric.proto b/services/protos/metric.proto new file mode 100644 index 00000000..d3c23161 --- /dev/null +++ b/services/protos/metric.proto @@ -0,0 +1,27 @@ +syntax = "proto3"; + +import "google/protobuf/timestamp.proto"; + +package com.goodfood.reporting; + +message Metric { + string id = 1; + string key = 2; + string restaurant_id = 3; + google.protobuf.Timestamp date = 4; + string code = 5; + string value = 6; +} + +service ReportingService { + rpc GetMetric (GetMetricRequest) returns (Metric) {} + rpc PushMetric (Metric) returns (PushMetricResponse) {} +} + +message GetMetricRequest { + string key = 1; +} + +message PushMetricResponse { + string key = 1; +} diff --git a/services/protos/order.proto b/services/protos/order.proto new file mode 100644 index 00000000..cc428597 --- /dev/null +++ b/services/protos/order.proto @@ -0,0 +1,39 @@ +syntax = "proto3"; + +package com.goodfood.ordering; + +enum Status { + PENDING = 0; + IN_PROGRESS = 1; + FULFILLED = 2; + REJECTED = 3; + } + + message UserMinimum { + string id = 1; + string first_name = 2; + string last_name = 3; + string email = 4; + string phone = 5; + } + + message Basket { + + // TODO: to be implemented + } + + +message Order { + // Unique identifier for the message + string id = 1; + + + string payment_id = 3; + string delivery_id = 4; + + UserMinimum user = 2; + Basket basket_snapshot = 5; + Status status = 6; +} + + From c5d9d36768e14156768a50a180084e10c6f92de1 Mon Sep 17 00:00:00 2001 From: Florian LEROUX <10078837+floriaaan@users.noreply.github.com> Date: Fri, 24 Mar 2023 16:29:15 +0100 Subject: [PATCH 004/883] feat(readme): add ports mapping for ms and update file hierarchy --- README.md | 51 ++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 40 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index cca02fb6..03f594db 100644 --- a/README.md +++ b/README.md @@ -8,27 +8,56 @@ Good Food was formed from the merger of four food companies. The company offers The GoodFood 2.0 project was initiated to update the existing ordering application, which had become outdated and was unable to handle more users. The objective is to create a modern, user-friendly, and modular new version that can handle a high volume of concurrent users, up to several thousand. +## Microservices ports + +| Service | Port | Language | Database | Status | Assignee | +| ----------- | ----- | ----------- | ---------- | ------ | --------------- | +| Gateway | 50000 | Go | ❌ | ❌ | @Anatole-Godard | +| User (auth) | 50001 | Go | PostgreSQL | ❌ | @Anatole-Godard | +| Basket | 50002 | NodeJS (ts) | Redis | ❌ | @Anatole-Godard | +| Payment | 50003 | NodeJS (ts) | PostgreSQL | ❌ | @Anatole-Godard | +| Product | 50004 | NodeJS (ts) | PostgreSQL | ❌ | @PierreLbg | +| Restaurant | 50005 | NodeJS (ts) | PostgreSQL | ❌ | @PierreLbg | +| Promotion | 50006 | NodeJS (ts) | PostgreSQL | ❌ | @PierreLbg | +| Order | 50007 | NodeJS (ts) | MongoDB | ❌ | @floriaaan | +| Delivery | 50008 | NodeJS (ts) | PostgreSQL | ❌ | @floriaaan | +| Stock | 50009 | NodeJS (ts) | PostgreSQL | ❌ | @floriaaan | +| Reporting | 50010 | NodeJS (ts) | PostgreSQL | ❌ | @floriaaan | +| (...) | (...) | (...) | (...) | (...) | + ## File Hierarchy The file hierarchy for this project is as follows: ``` . -├── .github -│ └── workflows +├── .github/ +│ └── workflows/ │ └── tests.yml ├── README.md -├── (...) # other files like .gitignore, .dockerignore, etc. -├── apps -│ ├── mobile -│ └── web -└── services - ├── gateway +├── (...) # other files like .gitignore, etc. +├── apps/ +│ ├── mobile/ +│ └── web/ +├── terraform/ +│ └── env/ +│ └── (...) # environments tfvars files +└── services/ + ├── gateway/ + │ ├── k8s/ + │ │ └── (...) # k8s files + │ └── terraform/ + │ └── (...) # terraform files + ├── user/ + ├── order/ + ├── delivery/ + ├── stock/ + ├── reporting/ ├── (...) # other services - └── protos + └── protos/ + └── (...) # proto files ``` - ## Installation TBW : Installation instructions @@ -40,6 +69,7 @@ TBW : Usage instructions ## Contributing You can contribute to this project by: + - Reporting bugs - Suggesting new features - Submitting pull requests @@ -56,4 +86,3 @@ This project is licensed under the MIT License - see the [LICENSE.md](LICENSE.md - **[Florian LEROUX](https://github.com/floriaaan)** - **[Anatole GODARD](https://github.com/Anatole-Godard)** - **[Pierre LEBIGRE](https://github.com/PierreLbg)** - From 5778a86eb5f0e700fe1c20c0e09b41939791aac5 Mon Sep 17 00:00:00 2001 From: Florian LEROUX <10078837+floriaaan@users.noreply.github.com> Date: Fri, 24 Mar 2023 16:30:22 +0100 Subject: [PATCH 005/883] fix(readme): change language of reporting --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 03f594db..9c94e596 100644 --- a/README.md +++ b/README.md @@ -22,7 +22,7 @@ The GoodFood 2.0 project was initiated to update the existing ordering applicati | Order | 50007 | NodeJS (ts) | MongoDB | ❌ | @floriaaan | | Delivery | 50008 | NodeJS (ts) | PostgreSQL | ❌ | @floriaaan | | Stock | 50009 | NodeJS (ts) | PostgreSQL | ❌ | @floriaaan | -| Reporting | 50010 | NodeJS (ts) | PostgreSQL | ❌ | @floriaaan | +| Reporting | 50010 | C# (dotnet) | PostgreSQL | ❌ | @floriaaan | | (...) | (...) | (...) | (...) | (...) | ## File Hierarchy From 209abe7c1d76496169fd7adcc36a24ea9a0030ca Mon Sep 17 00:00:00 2001 From: Pierre Lebigre Date: Fri, 24 Mar 2023 18:11:14 +0100 Subject: [PATCH 006/883] Init TypeScript + Express and Add Prisma db init --- services/product/.gitignore | 144 +++++++ services/product/package.json | 21 + services/product/pnpm-lock.yaml | 550 ++++++++++++++++++++++++++ services/product/prisma/schema.prisma | 49 +++ services/product/tsconfig.json | 109 +++++ 5 files changed, 873 insertions(+) create mode 100644 services/product/.gitignore create mode 100644 services/product/package.json create mode 100644 services/product/pnpm-lock.yaml create mode 100644 services/product/prisma/schema.prisma create mode 100644 services/product/tsconfig.json diff --git a/services/product/.gitignore b/services/product/.gitignore new file mode 100644 index 00000000..3502ef7f --- /dev/null +++ b/services/product/.gitignore @@ -0,0 +1,144 @@ +# Created by https://www.toptal.com/developers/gitignore/api/node +# Edit at https://www.toptal.com/developers/gitignore?templates=node + +### Node ### +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +lerna-debug.log* +.pnpm-debug.log* + +# Diagnostic reports (https://nodejs.org/api/report.html) +report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json + +# Runtime data +pids +*.pid +*.seed +*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage +*.lcov + +# nyc test coverage +.nyc_output + +# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# Bower dependency directory (https://bower.io/) +bower_components + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (https://nodejs.org/api/addons.html) +build/Release + +# Dependency directories +node_modules/ +jspm_packages/ + +# Snowpack dependency directory (https://snowpack.dev/) +web_modules/ + +# TypeScript cache +*.tsbuildinfo + +# Optional npm cache directory +.npm + +# Optional eslint cache +.eslintcache + +# Optional stylelint cache +.stylelintcache + +# Microbundle cache +.rpt2_cache/ +.rts2_cache_cjs/ +.rts2_cache_es/ +.rts2_cache_umd/ + +# Optional REPL history +.node_repl_history + +# Output of 'npm pack' +*.tgz + +# Yarn Integrity file +.yarn-integrity + +# dotenv environment variable files +.env +.env.development.local +.env.test.local +.env.production.local +.env.local + +# parcel-bundler cache (https://parceljs.org/) +.cache +.parcel-cache + +# Next.js build output +.next +out + +# Nuxt.js build / generate output +.nuxt +dist + +# Gatsby files +.cache/ +# Comment in the public line in if your project uses Gatsby and not Next.js +# https://nextjs.org/blog/next-9-1#public-directory-support +# public + +# vuepress build output +.vuepress/dist + +# vuepress v2.x temp and cache directory +.temp + +# Docusaurus cache and generated files +.docusaurus + +# Serverless directories +.serverless/ + +# FuseBox cache +.fusebox/ + +# DynamoDB Local files +.dynamodb/ + +# TernJS port file +.tern-port + +# Stores VSCode versions used for testing VSCode extensions +.vscode-test + +# yarn v2 +.yarn/cache +.yarn/unplugged +.yarn/build-state.yml +.yarn/install-state.gz +.pnp.* + +### Node Patch ### +# Serverless Webpack directories +.webpack/ + +# Optional stylelint cache + +# SvelteKit build / generate output +.svelte-kit + +# End of https://www.toptal.com/developers/gitignore/api/node diff --git a/services/product/package.json b/services/product/package.json new file mode 100644 index 00000000..0ee602b5 --- /dev/null +++ b/services/product/package.json @@ -0,0 +1,21 @@ +{ + "name": "product", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "keywords": [], + "author": "", + "license": "ISC", + "devDependencies": { + "@types/node": "^18.15.7", + "prisma": "^4.11.0", + "ts-node": "^10.9.1", + "typescript": "^5.0.2" + }, + "dependencies": { + "express": "^4.18.2" + } +} diff --git a/services/product/pnpm-lock.yaml b/services/product/pnpm-lock.yaml new file mode 100644 index 00000000..6b075f83 --- /dev/null +++ b/services/product/pnpm-lock.yaml @@ -0,0 +1,550 @@ +lockfileVersion: 5.4 + +specifiers: + '@types/node': ^18.15.7 + express: ^4.18.2 + prisma: ^4.11.0 + ts-node: ^10.9.1 + typescript: ^5.0.2 + +dependencies: + express: 4.18.2 + +devDependencies: + '@types/node': 18.15.7 + prisma: 4.11.0 + ts-node: 10.9.1_gkjsv6qbk4dkl5zwoikfngqpvy + typescript: 5.0.2 + +packages: + + /@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 + + /@jridgewell/resolve-uri/3.1.0: + resolution: {integrity: sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==} + engines: {node: '>=6.0.0'} + dev: true + + /@jridgewell/sourcemap-codec/1.4.14: + resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==} + dev: true + + /@jridgewell/trace-mapping/0.3.9: + resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} + dependencies: + '@jridgewell/resolve-uri': 3.1.0 + '@jridgewell/sourcemap-codec': 1.4.14 + dev: true + + /@prisma/engines/4.11.0: + resolution: {integrity: sha512-0AEBi2HXGV02cf6ASsBPhfsVIbVSDC9nbQed4iiY5eHttW9ZtMxHThuKZE1pnESbr8HRdgmFSa/Kn4OSNYuibg==} + requiresBuild: true + dev: true + + /@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.3: + resolution: {integrity: sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==} + dev: true + + /@types/node/18.15.7: + resolution: {integrity: sha512-LFmUbFunqmBn26wJZgZPYZPrDR1RwGOu2v79Mgcka1ndO6V0/cwjivPTc4yoK6n9kmw4/ls1r8cLrvh2iMibFA==} + dev: true + + /accepts/1.3.8: + resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} + engines: {node: '>= 0.6'} + dependencies: + mime-types: 2.1.35 + negotiator: 0.6.3 + dev: false + + /acorn-walk/8.2.0: + resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} + engines: {node: '>=0.4.0'} + dev: true + + /acorn/8.8.2: + resolution: {integrity: sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==} + engines: {node: '>=0.4.0'} + hasBin: true + dev: true + + /arg/4.1.3: + resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} + dev: true + + /array-flatten/1.1.1: + resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} + dev: false + + /body-parser/1.20.1: + resolution: {integrity: sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + dependencies: + bytes: 3.1.2 + content-type: 1.0.5 + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + on-finished: 2.4.1 + qs: 6.11.0 + raw-body: 2.5.1 + type-is: 1.6.18 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color + dev: false + + /bytes/3.1.2: + resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} + engines: {node: '>= 0.8'} + dev: false + + /call-bind/1.0.2: + resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==} + dependencies: + function-bind: 1.1.1 + get-intrinsic: 1.2.0 + dev: false + + /content-disposition/0.5.4: + resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} + engines: {node: '>= 0.6'} + dependencies: + safe-buffer: 5.2.1 + dev: false + + /content-type/1.0.5: + resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} + engines: {node: '>= 0.6'} + dev: false + + /cookie-signature/1.0.6: + resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} + dev: false + + /cookie/0.5.0: + resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==} + engines: {node: '>= 0.6'} + dev: false + + /create-require/1.1.1: + resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} + dev: true + + /debug/2.6.9: + resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.0.0 + dev: false + + /depd/2.0.0: + resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} + engines: {node: '>= 0.8'} + dev: false + + /destroy/1.2.0: + resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + dev: false + + /diff/4.0.2: + resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} + engines: {node: '>=0.3.1'} + dev: true + + /ee-first/1.1.1: + resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + dev: false + + /encodeurl/1.0.2: + resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} + engines: {node: '>= 0.8'} + dev: false + + /escape-html/1.0.3: + resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + dev: false + + /etag/1.8.1: + resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} + engines: {node: '>= 0.6'} + dev: false + + /express/4.18.2: + resolution: {integrity: sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==} + engines: {node: '>= 0.10.0'} + dependencies: + accepts: 1.3.8 + array-flatten: 1.1.1 + body-parser: 1.20.1 + content-disposition: 0.5.4 + content-type: 1.0.5 + cookie: 0.5.0 + cookie-signature: 1.0.6 + debug: 2.6.9 + depd: 2.0.0 + encodeurl: 1.0.2 + escape-html: 1.0.3 + etag: 1.8.1 + finalhandler: 1.2.0 + fresh: 0.5.2 + http-errors: 2.0.0 + merge-descriptors: 1.0.1 + methods: 1.1.2 + on-finished: 2.4.1 + parseurl: 1.3.3 + path-to-regexp: 0.1.7 + proxy-addr: 2.0.7 + qs: 6.11.0 + range-parser: 1.2.1 + safe-buffer: 5.2.1 + send: 0.18.0 + serve-static: 1.15.0 + setprototypeof: 1.2.0 + statuses: 2.0.1 + type-is: 1.6.18 + utils-merge: 1.0.1 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + dev: false + + /finalhandler/1.2.0: + resolution: {integrity: sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==} + engines: {node: '>= 0.8'} + dependencies: + debug: 2.6.9 + encodeurl: 1.0.2 + escape-html: 1.0.3 + on-finished: 2.4.1 + parseurl: 1.3.3 + statuses: 2.0.1 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color + dev: false + + /forwarded/0.2.0: + resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} + engines: {node: '>= 0.6'} + dev: false + + /fresh/0.5.2: + resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} + engines: {node: '>= 0.6'} + dev: false + + /function-bind/1.1.1: + resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} + dev: false + + /get-intrinsic/1.2.0: + resolution: {integrity: sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==} + dependencies: + function-bind: 1.1.1 + has: 1.0.3 + has-symbols: 1.0.3 + dev: false + + /has-symbols/1.0.3: + resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} + engines: {node: '>= 0.4'} + dev: false + + /has/1.0.3: + resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} + engines: {node: '>= 0.4.0'} + dependencies: + function-bind: 1.1.1 + dev: false + + /http-errors/2.0.0: + resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} + engines: {node: '>= 0.8'} + dependencies: + depd: 2.0.0 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 2.0.1 + toidentifier: 1.0.1 + dev: false + + /iconv-lite/0.4.24: + resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + engines: {node: '>=0.10.0'} + dependencies: + safer-buffer: 2.1.2 + dev: false + + /inherits/2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + dev: false + + /ipaddr.js/1.9.1: + resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} + engines: {node: '>= 0.10'} + dev: false + + /make-error/1.3.6: + resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + dev: true + + /media-typer/0.3.0: + resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} + engines: {node: '>= 0.6'} + dev: false + + /merge-descriptors/1.0.1: + resolution: {integrity: sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==} + dev: false + + /methods/1.1.2: + resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} + engines: {node: '>= 0.6'} + dev: false + + /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 + + /mime/1.6.0: + resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} + engines: {node: '>=4'} + hasBin: true + dev: false + + /ms/2.0.0: + resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} + dev: false + + /ms/2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + dev: false + + /negotiator/0.6.3: + resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} + engines: {node: '>= 0.6'} + dev: false + + /object-inspect/1.12.3: + resolution: {integrity: sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==} + dev: false + + /on-finished/2.4.1: + resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} + engines: {node: '>= 0.8'} + dependencies: + ee-first: 1.1.1 + dev: false + + /parseurl/1.3.3: + resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} + engines: {node: '>= 0.8'} + dev: false + + /path-to-regexp/0.1.7: + resolution: {integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==} + dev: false + + /prisma/4.11.0: + resolution: {integrity: sha512-4zZmBXssPUEiX+GeL0MUq/Yyie4ltiKmGu7jCJFnYMamNrrulTBc+D+QwAQSJ01tyzeGHlD13kOnqPwRipnlNw==} + engines: {node: '>=14.17'} + hasBin: true + requiresBuild: true + dependencies: + '@prisma/engines': 4.11.0 + 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 + dev: false + + /qs/6.11.0: + resolution: {integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==} + engines: {node: '>=0.6'} + dependencies: + side-channel: 1.0.4 + dev: false + + /range-parser/1.2.1: + resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} + engines: {node: '>= 0.6'} + dev: false + + /raw-body/2.5.1: + resolution: {integrity: sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==} + engines: {node: '>= 0.8'} + dependencies: + bytes: 3.1.2 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + unpipe: 1.0.0 + dev: false + + /safe-buffer/5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + dev: false + + /safer-buffer/2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + dev: false + + /send/0.18.0: + resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==} + engines: {node: '>= 0.8.0'} + dependencies: + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + encodeurl: 1.0.2 + escape-html: 1.0.3 + etag: 1.8.1 + fresh: 0.5.2 + http-errors: 2.0.0 + mime: 1.6.0 + ms: 2.1.3 + on-finished: 2.4.1 + range-parser: 1.2.1 + statuses: 2.0.1 + transitivePeerDependencies: + - supports-color + dev: false + + /serve-static/1.15.0: + resolution: {integrity: sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==} + engines: {node: '>= 0.8.0'} + dependencies: + encodeurl: 1.0.2 + escape-html: 1.0.3 + parseurl: 1.3.3 + send: 0.18.0 + transitivePeerDependencies: + - supports-color + dev: false + + /setprototypeof/1.2.0: + resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + dev: false + + /side-channel/1.0.4: + resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.2.0 + object-inspect: 1.12.3 + dev: false + + /statuses/2.0.1: + resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} + engines: {node: '>= 0.8'} + dev: false + + /toidentifier/1.0.1: + resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} + engines: {node: '>=0.6'} + dev: false + + /ts-node/10.9.1_gkjsv6qbk4dkl5zwoikfngqpvy: + 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.3 + '@types/node': 18.15.7 + acorn: 8.8.2 + 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.0.2 + v8-compile-cache-lib: 3.0.1 + yn: 3.1.1 + dev: true + + /type-is/1.6.18: + resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} + engines: {node: '>= 0.6'} + dependencies: + media-typer: 0.3.0 + mime-types: 2.1.35 + dev: false + + /typescript/5.0.2: + resolution: {integrity: sha512-wVORMBGO/FAs/++blGNeAVdbNKtIh1rbBL2EyQ1+J9lClJ93KiiKe8PmFIVdXhHcyv44SL9oglmfeSsndo0jRw==} + engines: {node: '>=12.20'} + hasBin: true + dev: true + + /unpipe/1.0.0: + resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} + engines: {node: '>= 0.8'} + dev: false + + /utils-merge/1.0.1: + resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} + engines: {node: '>= 0.4.0'} + dev: false + + /v8-compile-cache-lib/3.0.1: + resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} + dev: true + + /vary/1.1.2: + resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} + engines: {node: '>= 0.8'} + dev: false + + /yn/3.1.1: + resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} + engines: {node: '>=6'} + dev: true diff --git a/services/product/prisma/schema.prisma b/services/product/prisma/schema.prisma new file mode 100644 index 00000000..d94bcc18 --- /dev/null +++ b/services/product/prisma/schema.prisma @@ -0,0 +1,49 @@ +datasource db { + provider = "postgresql" + url = env("postgresql://postgres:postgres@/var/run/postgresql:5432/postgres") +} + +generator client { + provider = "prisma-client-js" +} + +model Product { + id Int @id @default(autoincrement()) + name String + image String + comment String + price Int + preparation String + weight String + kilocalories String + nutriscore Int + restaurant_id Int + + type Product_type + categories Category[] + allergens Allergen[] +} + +model Category { + id Int @id @default(autoincrement()) + libelle String + hexa_color String + icon String + + products Product[] +} + +model Allergen { + id Int @id @default(autoincrement()) + libelle String + + products Product[] +} + +enum Product_type{ + ENTREES + PLATS + DESSERTS + BOISSONS + SNACKS +} \ No newline at end of file diff --git a/services/product/tsconfig.json b/services/product/tsconfig.json new file mode 100644 index 00000000..e075f973 --- /dev/null +++ b/services/product/tsconfig.json @@ -0,0 +1,109 @@ +{ + "compilerOptions": { + /* Visit https://aka.ms/tsconfig to read more about this file */ + + /* Projects */ + // "incremental": true, /* Save .tsbuildinfo files to allow for incremental compilation of projects. */ + // "composite": true, /* Enable constraints that allow a TypeScript project to be used with project references. */ + // "tsBuildInfoFile": "./.tsbuildinfo", /* Specify the path to .tsbuildinfo incremental compilation file. */ + // "disableSourceOfProjectReferenceRedirect": true, /* Disable preferring source files instead of declaration files when referencing composite projects. */ + // "disableSolutionSearching": true, /* Opt a project out of multi-project reference checking when editing. */ + // "disableReferencedProjectLoad": true, /* Reduce the number of projects loaded automatically by TypeScript. */ + + /* Language and Environment */ + "target": "es2016", /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */ + // "lib": [], /* Specify a set of bundled library declaration files that describe the target runtime environment. */ + // "jsx": "preserve", /* Specify what JSX code is generated. */ + // "experimentalDecorators": true, /* Enable experimental support for legacy experimental decorators. */ + // "emitDecoratorMetadata": true, /* Emit design-type metadata for decorated declarations in source files. */ + // "jsxFactory": "", /* Specify the JSX factory function used when targeting React JSX emit, e.g. 'React.createElement' or 'h'. */ + // "jsxFragmentFactory": "", /* Specify the JSX Fragment reference used for fragments when targeting React JSX emit e.g. 'React.Fragment' or 'Fragment'. */ + // "jsxImportSource": "", /* Specify module specifier used to import the JSX factory functions when using 'jsx: react-jsx*'. */ + // "reactNamespace": "", /* Specify the object invoked for 'createElement'. This only applies when targeting 'react' JSX emit. */ + // "noLib": true, /* Disable including any library files, including the default lib.d.ts. */ + // "useDefineForClassFields": true, /* Emit ECMAScript-standard-compliant class fields. */ + // "moduleDetection": "auto", /* Control what method is used to detect module-format JS files. */ + + /* Modules */ + "module": "commonjs", /* Specify what module code is generated. */ + // "rootDir": "./", /* Specify the root folder within your source files. */ + // "moduleResolution": "node10", /* Specify how TypeScript looks up a file from a given module specifier. */ + // "baseUrl": "./", /* Specify the base directory to resolve non-relative module names. */ + // "paths": {}, /* Specify a set of entries that re-map imports to additional lookup locations. */ + // "rootDirs": [], /* Allow multiple folders to be treated as one when resolving modules. */ + // "typeRoots": [], /* Specify multiple folders that act like './node_modules/@types'. */ + // "types": [], /* Specify type package names to be included without being referenced in a source file. */ + // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ + // "moduleSuffixes": [], /* List of file name suffixes to search when resolving a module. */ + // "allowImportingTsExtensions": true, /* Allow imports to include TypeScript file extensions. Requires '--moduleResolution bundler' and either '--noEmit' or '--emitDeclarationOnly' to be set. */ + // "resolvePackageJsonExports": true, /* Use the package.json 'exports' field when resolving package imports. */ + // "resolvePackageJsonImports": true, /* Use the package.json 'imports' field when resolving imports. */ + // "customConditions": [], /* Conditions to set in addition to the resolver-specific defaults when resolving imports. */ + // "resolveJsonModule": true, /* Enable importing .json files. */ + // "allowArbitraryExtensions": true, /* Enable importing files with any extension, provided a declaration file is present. */ + // "noResolve": true, /* Disallow 'import's, 'require's or ''s from expanding the number of files TypeScript should add to a project. */ + + /* JavaScript Support */ + // "allowJs": true, /* Allow JavaScript files to be a part of your program. Use the 'checkJS' option to get errors from these files. */ + // "checkJs": true, /* Enable error reporting in type-checked JavaScript files. */ + // "maxNodeModuleJsDepth": 1, /* Specify the maximum folder depth used for checking JavaScript files from 'node_modules'. Only applicable with 'allowJs'. */ + + /* Emit */ + // "declaration": true, /* Generate .d.ts files from TypeScript and JavaScript files in your project. */ + // "declarationMap": true, /* Create sourcemaps for d.ts files. */ + // "emitDeclarationOnly": true, /* Only output d.ts files and not JavaScript files. */ + // "sourceMap": true, /* Create source map files for emitted JavaScript files. */ + // "inlineSourceMap": true, /* Include sourcemap files inside the emitted JavaScript. */ + // "outFile": "./", /* Specify a file that bundles all outputs into one JavaScript file. If 'declaration' is true, also designates a file that bundles all .d.ts output. */ + // "outDir": "./", /* Specify an output folder for all emitted files. */ + // "removeComments": true, /* Disable emitting comments. */ + // "noEmit": true, /* Disable emitting files from a compilation. */ + // "importHelpers": true, /* Allow importing helper functions from tslib once per project, instead of including them per-file. */ + // "importsNotUsedAsValues": "remove", /* Specify emit/checking behavior for imports that are only used for types. */ + // "downlevelIteration": true, /* Emit more compliant, but verbose and less performant JavaScript for iteration. */ + // "sourceRoot": "", /* Specify the root path for debuggers to find the reference source code. */ + // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ + // "inlineSources": true, /* Include source code in the sourcemaps inside the emitted JavaScript. */ + // "emitBOM": true, /* Emit a UTF-8 Byte Order Mark (BOM) in the beginning of output files. */ + // "newLine": "crlf", /* Set the newline character for emitting files. */ + // "stripInternal": true, /* Disable emitting declarations that have '@internal' in their JSDoc comments. */ + // "noEmitHelpers": true, /* Disable generating custom helper functions like '__extends' in compiled output. */ + // "noEmitOnError": true, /* Disable emitting files if any type checking errors are reported. */ + // "preserveConstEnums": true, /* Disable erasing 'const enum' declarations in generated code. */ + // "declarationDir": "./", /* Specify the output directory for generated declaration files. */ + // "preserveValueImports": true, /* Preserve unused imported values in the JavaScript output that would otherwise be removed. */ + + /* Interop Constraints */ + // "isolatedModules": true, /* Ensure that each file can be safely transpiled without relying on other imports. */ + // "verbatimModuleSyntax": true, /* Do not transform or elide any imports or exports not marked as type-only, ensuring they are written in the output file's format based on the 'module' setting. */ + // "allowSyntheticDefaultImports": true, /* Allow 'import x from y' when a module doesn't have a default export. */ + "esModuleInterop": true, /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */ + // "preserveSymlinks": true, /* Disable resolving symlinks to their realpath. This correlates to the same flag in node. */ + "forceConsistentCasingInFileNames": true, /* Ensure that casing is correct in imports. */ + + /* Type Checking */ + "strict": true, /* Enable all strict type-checking options. */ + // "noImplicitAny": true, /* Enable error reporting for expressions and declarations with an implied 'any' type. */ + // "strictNullChecks": true, /* When type checking, take into account 'null' and 'undefined'. */ + // "strictFunctionTypes": true, /* When assigning functions, check to ensure parameters and the return values are subtype-compatible. */ + // "strictBindCallApply": true, /* Check that the arguments for 'bind', 'call', and 'apply' methods match the original function. */ + // "strictPropertyInitialization": true, /* Check for class properties that are declared but not set in the constructor. */ + // "noImplicitThis": true, /* Enable error reporting when 'this' is given the type 'any'. */ + // "useUnknownInCatchVariables": true, /* Default catch clause variables as 'unknown' instead of 'any'. */ + // "alwaysStrict": true, /* Ensure 'use strict' is always emitted. */ + // "noUnusedLocals": true, /* Enable error reporting when local variables aren't read. */ + // "noUnusedParameters": true, /* Raise an error when a function parameter isn't read. */ + // "exactOptionalPropertyTypes": true, /* Interpret optional property types as written, rather than adding 'undefined'. */ + // "noImplicitReturns": true, /* Enable error reporting for codepaths that do not explicitly return in a function. */ + // "noFallthroughCasesInSwitch": true, /* Enable error reporting for fallthrough cases in switch statements. */ + // "noUncheckedIndexedAccess": true, /* Add 'undefined' to a type when accessed using an index. */ + // "noImplicitOverride": true, /* Ensure overriding members in derived classes are marked with an override modifier. */ + // "noPropertyAccessFromIndexSignature": true, /* Enforces using indexed accessors for keys declared using an indexed type. */ + // "allowUnusedLabels": true, /* Disable error reporting for unused labels. */ + // "allowUnreachableCode": true, /* Disable error reporting for unreachable code. */ + + /* Completeness */ + // "skipDefaultLibCheck": true, /* Skip type checking .d.ts files that are included with TypeScript. */ + "skipLibCheck": true /* Skip type checking all .d.ts files. */ + } +} From efd54bde246dc0888cb5136be4e028c933a33c05 Mon Sep 17 00:00:00 2001 From: Florian LEROUX <10078837+floriaaan@users.noreply.github.com> Date: Sat, 25 Mar 2023 14:40:12 +0100 Subject: [PATCH 007/883] ref: change protos folder -> proto --- .gitignore | 2 ++ README.md | 4 ++-- services/{protos => proto}/.gitinclude | 0 services/{protos => proto}/metric.proto | 0 services/{protos => proto}/order.proto | 0 5 files changed, 4 insertions(+), 2 deletions(-) rename services/{protos => proto}/.gitinclude (100%) rename services/{protos => proto}/metric.proto (100%) rename services/{protos => proto}/order.proto (100%) diff --git a/.gitignore b/.gitignore index bc5dcca7..6c74319b 100644 --- a/.gitignore +++ b/.gitignore @@ -53,3 +53,5 @@ terraform.rc .history .ionide + +/**/.DS_Store \ No newline at end of file diff --git a/README.md b/README.md index 9c94e596..4bf6e30e 100644 --- a/README.md +++ b/README.md @@ -20,7 +20,7 @@ The GoodFood 2.0 project was initiated to update the existing ordering applicati | Restaurant | 50005 | NodeJS (ts) | PostgreSQL | ❌ | @PierreLbg | | Promotion | 50006 | NodeJS (ts) | PostgreSQL | ❌ | @PierreLbg | | Order | 50007 | NodeJS (ts) | MongoDB | ❌ | @floriaaan | -| Delivery | 50008 | NodeJS (ts) | PostgreSQL | ❌ | @floriaaan | +| Delivery | 50008 | NodeJS (ts) | PostgreSQL | ⚠️ | @floriaaan | | Stock | 50009 | NodeJS (ts) | PostgreSQL | ❌ | @floriaaan | | Reporting | 50010 | C# (dotnet) | PostgreSQL | ❌ | @floriaaan | | (...) | (...) | (...) | (...) | (...) | @@ -54,7 +54,7 @@ The file hierarchy for this project is as follows: ├── stock/ ├── reporting/ ├── (...) # other services - └── protos/ + └── proto/ └── (...) # proto files ``` diff --git a/services/protos/.gitinclude b/services/proto/.gitinclude similarity index 100% rename from services/protos/.gitinclude rename to services/proto/.gitinclude diff --git a/services/protos/metric.proto b/services/proto/metric.proto similarity index 100% rename from services/protos/metric.proto rename to services/proto/metric.proto diff --git a/services/protos/order.proto b/services/proto/order.proto similarity index 100% rename from services/protos/order.proto rename to services/proto/order.proto From 2a8fa11e733c067c0c400645cb67f4f48eca9ac6 Mon Sep 17 00:00:00 2001 From: Florian LEROUX <10078837+floriaaan@users.noreply.github.com> Date: Mon, 27 Mar 2023 11:42:00 +0200 Subject: [PATCH 008/883] feat: init delivery microservice (typescript, prisma, grpc) * add prisma (schema, singleton, seed) * add grpc implementation * add logger * add file structure with proper tsconfig * readme file model --- services/delivery/.env.example | 2 + services/delivery/.gitignore | 5 + services/delivery/.nvmrc | 1 + services/delivery/README.md | 68 +++ services/delivery/package.json | 25 + services/delivery/pnpm-lock.yaml | 427 ++++++++++++++++++ services/delivery/prisma/schema.prisma | 36 ++ services/delivery/prisma/seed.ts | 64 +++ services/delivery/src/handlers/.gitinclude | 0 services/delivery/src/lib/log.ts | 74 +++ services/delivery/src/lib/prisma.ts | 29 ++ .../src/resources/grpc-credentials.ts | 5 + .../src/resources/protoloader-options.ts | 7 + services/delivery/src/server.ts | 35 ++ services/delivery/tsconfig.json | 18 + services/proto/delivery.proto | 86 ++++ 16 files changed, 882 insertions(+) create mode 100644 services/delivery/.env.example create mode 100644 services/delivery/.gitignore create mode 100644 services/delivery/.nvmrc create mode 100644 services/delivery/README.md create mode 100644 services/delivery/package.json create mode 100644 services/delivery/pnpm-lock.yaml create mode 100644 services/delivery/prisma/schema.prisma create mode 100644 services/delivery/prisma/seed.ts create mode 100644 services/delivery/src/handlers/.gitinclude create mode 100644 services/delivery/src/lib/log.ts create mode 100644 services/delivery/src/lib/prisma.ts create mode 100644 services/delivery/src/resources/grpc-credentials.ts create mode 100644 services/delivery/src/resources/protoloader-options.ts create mode 100644 services/delivery/src/server.ts create mode 100755 services/delivery/tsconfig.json create mode 100644 services/proto/delivery.proto diff --git a/services/delivery/.env.example b/services/delivery/.env.example new file mode 100644 index 00000000..6a86f4b9 --- /dev/null +++ b/services/delivery/.env.example @@ -0,0 +1,2 @@ +DATABASE_URL=postgres://postgres:postgres@localhost:5432/postgres +PORT=50008 \ No newline at end of file diff --git a/services/delivery/.gitignore b/services/delivery/.gitignore new file mode 100644 index 00000000..378e1eaa --- /dev/null +++ b/services/delivery/.gitignore @@ -0,0 +1,5 @@ +node_modules/ +dist/ +*.env* +!*.env.example + diff --git a/services/delivery/.nvmrc b/services/delivery/.nvmrc new file mode 100644 index 00000000..9dfef472 --- /dev/null +++ b/services/delivery/.nvmrc @@ -0,0 +1 @@ +v18.12.0 diff --git a/services/delivery/README.md b/services/delivery/README.md new file mode 100644 index 00000000..1086b6c8 --- /dev/null +++ b/services/delivery/README.md @@ -0,0 +1,68 @@ +# Delivery Microservice + +| Informations | +| ------------------------------------------------------------------ | +| **Port:** 50008 | +| **Developer:** @floriaaan | +| **Status:** In progress | +| **Last update:** 2023-03-25 | +| **Language:** NodeJS | +| **Dependencies:** TypeScript, Prisma, gRPC, Postgres | +| **Models:** (see [`prisma/schema.prisma`](./prisma/schema.prisma)) | + +## gRPC Methods + +- Delivery model: + + - `CreateDelivery`: Creates a new delivery in the system. + - `GetDelivery`: Retrieves a delivery by its ID. + - `UpdateDelivery`: Updates the status of an existing delivery. + - `DeleteDelivery`: Deletes a delivery by its ID. + - `ListDeliveriesByUser`: Retrieves all deliveries for a given user. + - `ListDeliveriesByRestaurant`: Retrieves all deliveries for a given restaurant. + +- Delivery person model: + - `CreateDeliveryPerson`: Creates a new delivery person in the system. + - `GetDeliveryPerson`: Retrieves a delivery person by its ID. + - `UpdateDeliveryPerson`: Updates an existing delivery person. + - `DeleteDeliveryPerson`: Deletes a delivery person by its ID. + - `ListDeliveryPersons`: Retrieves all delivery persons. + - `ListNearDeliveryPersons`: Retrieves all delivery persons near a given location. + +## Requirements + +To run this microservice, you will need to have the following installed on your system: + +- NodeJS (v18.12.0 or higher) (dev. with v18.12.0) +- Postgres (v15.2 or higher) (dev. with docker image `postgres:15.2`) + +You can use the following tools to help you with the setup: + +- You can use nvm to set your Node version using: + - `nvm use`. +- You can use docker to run your Postgres database using: + - `docker run --name postgres -e POSTGRES_PASSWORD=password -d postgres`. + +## Getting started + +### 1. Clone the repository and install dependencies + +1. Clone the `goodfood` repository to your local machine. +2. Navigate to the service directory (`services/delivery`) in your terminal. +3. Run `npm install` to install the necessary dependencies. +4. Create a `.env` file at the root of the project directory and add the environment variables values (see `.env.example`). +5. Run `npm run start` to start the microservice. + +You can now access the microservice at `http://localhost:50008`. + +NB: If you want to run the microservice in development mode, you can run `npm run dev` instead. + +### 2. Create and seed the database + +Run the following command to create your Postgres database structure. This also creates the models tables that are defined in [`prisma/schema.prisma`](./prisma/schema.prisma): + +``` +npx prisma migrate dev --name init +``` + +When `npx prisma migrate dev` is executed against a newly created database, seeding is also triggered. The seed file in [`prisma/seed.ts`](./prisma/seed.ts) will be executed and your database will be populated with the sample data. diff --git a/services/delivery/package.json b/services/delivery/package.json new file mode 100644 index 00000000..09782b02 --- /dev/null +++ b/services/delivery/package.json @@ -0,0 +1,25 @@ +{ + "name": "typescript-grpc", + "scripts": { + "dev": "ts-node ./src/server.ts", + "seed": "ts-node prisma/seed.ts", + "client:delivery-create": "ts-node ./src/client/delivery-create.ts" + }, + "dependencies": { + "@grpc/grpc-js": "^1.8.13", + "@grpc/proto-loader": "0.7.6", + "@prisma/client": "4.11.0", + "dotenv": "^16.0.3", + "protobufjs": "7.2.2" + }, + "devDependencies": { + "@types/node": "18.15.9", + "prisma": "4.11.0", + "ts-node": "10.9.1", + "tsconfig-paths": "^4.1.2", + "typescript": "5.0.2" + }, + "prisma": { + "seed": "ts-node prisma/seed.ts" + } +} diff --git a/services/delivery/pnpm-lock.yaml b/services/delivery/pnpm-lock.yaml new file mode 100644 index 00000000..50a04449 --- /dev/null +++ b/services/delivery/pnpm-lock.yaml @@ -0,0 +1,427 @@ +lockfileVersion: 5.4 + +specifiers: + '@grpc/grpc-js': ^1.8.13 + '@grpc/proto-loader': 0.7.6 + '@prisma/client': 4.11.0 + '@types/node': 18.15.9 + chalk: 4.1.2 + dotenv: ^16.0.3 + prisma: 4.11.0 + protobufjs: 7.2.2 + ts-node: 10.9.1 + tsconfig-paths: ^4.1.2 + typescript: 5.0.2 + +dependencies: + '@grpc/grpc-js': 1.8.13 + '@grpc/proto-loader': 0.7.6 + '@prisma/client': 4.11.0_prisma@4.11.0 + chalk: 4.1.2 + dotenv: 16.0.3 + protobufjs: 7.2.2 + +devDependencies: + '@types/node': 18.15.9 + prisma: 4.11.0 + ts-node: 10.9.1_3flabivgbrnlfzsgzfhinuvrvy + tsconfig-paths: 4.1.2 + typescript: 5.0.2 + +packages: + + /@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 + + /@grpc/grpc-js/1.8.13: + resolution: {integrity: sha512-iY3jsdfbc0ARoCLFvbvUB8optgyb0r1XLPb142u+QtgBcKJYkCIFt3Fd/881KqjLYWjsBJF57N3b8Eop9NDfUA==} + engines: {node: ^8.13.0 || >=10.10.0} + dependencies: + '@grpc/proto-loader': 0.7.6 + '@types/node': 18.15.9 + dev: false + + /@grpc/proto-loader/0.7.6: + resolution: {integrity: sha512-QyAXR8Hyh7uMDmveWxDSUcJr9NAWaZ2I6IXgAYvQmfflwouTM+rArE2eEaCtLlRqO81j7pRLCt81IefUei6Zbw==} + engines: {node: '>=6'} + hasBin: true + dependencies: + '@types/long': 4.0.2 + lodash.camelcase: 4.3.0 + long: 4.0.0 + protobufjs: 7.2.2 + yargs: 16.2.0 + dev: false + + /@jridgewell/resolve-uri/3.1.0: + resolution: {integrity: sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==} + engines: {node: '>=6.0.0'} + dev: true + + /@jridgewell/sourcemap-codec/1.4.14: + resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==} + dev: true + + /@jridgewell/trace-mapping/0.3.9: + resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} + dependencies: + '@jridgewell/resolve-uri': 3.1.0 + '@jridgewell/sourcemap-codec': 1.4.14 + dev: true + + /@prisma/client/4.11.0_prisma@4.11.0: + resolution: {integrity: sha512-0INHYkQIqgAjrt7NzhYpeDQi8x3Nvylc2uDngKyFDDj1tTRQ4uV1HnVmd1sQEraeVAN63SOK0dgCKQHlvjL0KA==} + engines: {node: '>=14.17'} + requiresBuild: true + peerDependencies: + prisma: '*' + peerDependenciesMeta: + prisma: + optional: true + dependencies: + '@prisma/engines-version': 4.11.0-57.8fde8fef4033376662cad983758335009d522acb + prisma: 4.11.0 + dev: false + + /@prisma/engines-version/4.11.0-57.8fde8fef4033376662cad983758335009d522acb: + resolution: {integrity: sha512-3Vd8Qq06d5xD8Ch5WauWcUUrsVPdMC6Ge8ILji8RFfyhUpqon6qSyGM0apvr1O8n8qH8cKkEFqRPsYjuz5r83g==} + dev: false + + /@prisma/engines/4.11.0: + resolution: {integrity: sha512-0AEBi2HXGV02cf6ASsBPhfsVIbVSDC9nbQed4iiY5eHttW9ZtMxHThuKZE1pnESbr8HRdgmFSa/Kn4OSNYuibg==} + requiresBuild: true + + /@protobufjs/aspromise/1.1.2: + resolution: {integrity: sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==} + dev: false + + /@protobufjs/base64/1.1.2: + resolution: {integrity: sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==} + dev: false + + /@protobufjs/codegen/2.0.4: + resolution: {integrity: sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==} + dev: false + + /@protobufjs/eventemitter/1.1.0: + resolution: {integrity: sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==} + dev: false + + /@protobufjs/fetch/1.1.0: + resolution: {integrity: sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==} + dependencies: + '@protobufjs/aspromise': 1.1.2 + '@protobufjs/inquire': 1.1.0 + dev: false + + /@protobufjs/float/1.0.2: + resolution: {integrity: sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==} + dev: false + + /@protobufjs/inquire/1.1.0: + resolution: {integrity: sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==} + dev: false + + /@protobufjs/path/1.1.2: + resolution: {integrity: sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==} + dev: false + + /@protobufjs/pool/1.1.0: + resolution: {integrity: sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==} + dev: false + + /@protobufjs/utf8/1.1.0: + resolution: {integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==} + 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.3: + resolution: {integrity: sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==} + dev: true + + /@types/long/4.0.2: + resolution: {integrity: sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==} + dev: false + + /@types/node/18.15.9: + resolution: {integrity: sha512-dUxhiNzBLr6IqlZXz6e/rN2YQXlFgOei/Dxy+e3cyXTJ4txSUbGT2/fmnD6zd/75jDMeW5bDee+YXxlFKHoV0A==} + + /acorn-walk/8.2.0: + resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} + engines: {node: '>=0.4.0'} + dev: true + + /acorn/8.8.2: + resolution: {integrity: sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==} + engines: {node: '>=0.4.0'} + hasBin: true + dev: true + + /ansi-regex/5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + dev: false + + /ansi-styles/4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + dependencies: + color-convert: 2.0.1 + dev: false + + /arg/4.1.3: + resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} + dev: true + + /chalk/4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + 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 + + /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 + + /create-require/1.1.1: + resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} + dev: true + + /diff/4.0.2: + resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} + engines: {node: '>=0.3.1'} + dev: true + + /dotenv/16.0.3: + resolution: {integrity: sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==} + engines: {node: '>=12'} + dev: false + + /emoji-regex/8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + dev: false + + /escalade/3.1.1: + resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} + engines: {node: '>=6'} + dev: false + + /get-caller-file/2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + dev: false + + /has-flag/4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + dev: false + + /is-fullwidth-code-point/3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + dev: false + + /json5/2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + dev: true + + /lodash.camelcase/4.3.0: + resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} + dev: false + + /long/4.0.0: + resolution: {integrity: sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==} + dev: false + + /long/5.2.1: + resolution: {integrity: sha512-GKSNGeNAtw8IryjjkhZxuKB3JzlcLTwjtiQCHKvqQet81I93kXslhDQruGI/QsddO83mcDToBVy7GqGS/zYf/A==} + dev: false + + /make-error/1.3.6: + resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + dev: true + + /minimist/1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + dev: true + + /prisma/4.11.0: + resolution: {integrity: sha512-4zZmBXssPUEiX+GeL0MUq/Yyie4ltiKmGu7jCJFnYMamNrrulTBc+D+QwAQSJ01tyzeGHlD13kOnqPwRipnlNw==} + engines: {node: '>=14.17'} + hasBin: true + requiresBuild: true + dependencies: + '@prisma/engines': 4.11.0 + + /protobufjs/7.2.2: + resolution: {integrity: sha512-++PrQIjrom+bFDPpfmqXfAGSQs40116JRrqqyf53dymUMvvb5d/LMRyicRoF1AUKoXVS1/IgJXlEgcpr4gTF3Q==} + engines: {node: '>=12.0.0'} + requiresBuild: true + dependencies: + '@protobufjs/aspromise': 1.1.2 + '@protobufjs/base64': 1.1.2 + '@protobufjs/codegen': 2.0.4 + '@protobufjs/eventemitter': 1.1.0 + '@protobufjs/fetch': 1.1.0 + '@protobufjs/float': 1.0.2 + '@protobufjs/inquire': 1.1.0 + '@protobufjs/path': 1.1.2 + '@protobufjs/pool': 1.1.0 + '@protobufjs/utf8': 1.1.0 + '@types/node': 18.15.9 + long: 5.2.1 + dev: false + + /require-directory/2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + dev: false + + /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 + dev: false + + /strip-ansi/6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + dependencies: + ansi-regex: 5.0.1 + dev: false + + /strip-bom/3.0.0: + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} + dev: true + + /supports-color/7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + dependencies: + has-flag: 4.0.0 + dev: false + + /ts-node/10.9.1_3flabivgbrnlfzsgzfhinuvrvy: + 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.3 + '@types/node': 18.15.9 + acorn: 8.8.2 + 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.0.2 + v8-compile-cache-lib: 3.0.1 + yn: 3.1.1 + dev: true + + /tsconfig-paths/4.1.2: + resolution: {integrity: sha512-uhxiMgnXQp1IR622dUXI+9Ehnws7i/y6xvpZB9IbUVOPy0muvdvgXeZOn88UcGPiT98Vp3rJPTa8bFoalZ3Qhw==} + engines: {node: '>=6'} + dependencies: + json5: 2.2.3 + minimist: 1.2.8 + strip-bom: 3.0.0 + dev: true + + /typescript/5.0.2: + resolution: {integrity: sha512-wVORMBGO/FAs/++blGNeAVdbNKtIh1rbBL2EyQ1+J9lClJ93KiiKe8PmFIVdXhHcyv44SL9oglmfeSsndo0jRw==} + engines: {node: '>=12.20'} + hasBin: true + dev: true + + /v8-compile-cache-lib/3.0.1: + resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} + 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 + dev: false + + /y18n/5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + dev: false + + /yargs-parser/20.2.9: + resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} + engines: {node: '>=10'} + dev: false + + /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 + + /yn/3.1.1: + resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} + engines: {node: '>=6'} + dev: true diff --git a/services/delivery/prisma/schema.prisma b/services/delivery/prisma/schema.prisma new file mode 100644 index 00000000..a9384d5b --- /dev/null +++ b/services/delivery/prisma/schema.prisma @@ -0,0 +1,36 @@ +datasource db { + provider = "postgresql" + url = env("DATABASE_URL") +} + +generator client { + provider = "prisma-client-js" +} + +enum Status { + PENDING + IN_PROGRESS + FULFILLED + REJECTED +} + +model Delivery { + id String @id @default(cuid()) + estimated_date DateTime + + address String + status Status @default(PENDING) + + person DeliveryPerson @relation(fields: [delivery_person_id], references: [id]) + delivery_person_id String +} + +model DeliveryPerson { + id String @id @default(cuid()) + first_name String + last_name String + phone String @unique + location Float[] + + deliveries Delivery[] +} diff --git a/services/delivery/prisma/seed.ts b/services/delivery/prisma/seed.ts new file mode 100644 index 00000000..40472cf0 --- /dev/null +++ b/services/delivery/prisma/seed.ts @@ -0,0 +1,64 @@ +import { PrismaClient, Prisma } from "@prisma/client"; + +const prisma = new PrismaClient(); + +const deliveryPerson: Prisma.DeliveryPersonCreateInput[] = [ + { + id: "random_id", + first_name: "John", + last_name: "Doe", + phone: "0612345678", + location: [4.123, 52.123], + }, + { + first_name: "Jane", + last_name: "Doe", + phone: "0612345679", + location: [4.123, 52.124], + }, + { + first_name: "Jack", + last_name: "Doe", + phone: "0612345677", + location: [4.124, 52.123], + }, +]; + +const deliveries: Prisma.DeliveryCreateInput[] = [ + { + address: "15 rue de la paix 75000 Paris", + estimated_date: new Date("2023-01-01"), + person: { create: deliveryPerson[0] }, + }, + { + address: "16 rue de la paix 75000 Paris", + estimated_date: new Date("2023-02-01"), + person: { create: deliveryPerson[1] }, + }, + { + address: "17 rue de la paix 75000 Paris", + estimated_date: new Date("2023-03-01"), + person: { create: deliveryPerson[2] }, + }, +]; + +async function main() { + console.log(`Start seeding ...`); + for (const d of deliveries) { + const delivery = await prisma.delivery.create({ + data: d, + }); + console.log(`Created delivery with id: ${delivery.id}`); + } + console.log(`Seeding finished.`); +} + +main() + .then(async () => { + await prisma.$disconnect(); + }) + .catch(async (e) => { + console.error(e); + await prisma.$disconnect(); + process.exit(1); + }); diff --git a/services/delivery/src/handlers/.gitinclude b/services/delivery/src/handlers/.gitinclude new file mode 100644 index 00000000..e69de29b diff --git a/services/delivery/src/lib/log.ts b/services/delivery/src/lib/log.ts new file mode 100644 index 00000000..2404af54 --- /dev/null +++ b/services/delivery/src/lib/log.ts @@ -0,0 +1,74 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ +/* eslint-disable no-console */ + +function getStackTrace() { + let stack; + + try { + throw new Error(""); + } catch (error) { + stack = (error as Error).stack || ""; + } + + stack = stack.split("\n").map((line) => line.trim()); + return stack.splice(stack[0] === "Error" ? 2 : 1); +} + +const getInitiator = () => { + // _getInitiatorLine, _ObjectInfoLine, caller + const [, , caller] = getStackTrace(); + const file = caller.split("/").at(-1) || ""; + return file.replace(")", ""); +}; + +const warn = (...args: any[]) => { + console.group( + `\x1b[33m${new Date().toISOString()} - WARN - ${getInitiator()}\x1b[0m` + ); + console.warn(...args); + console.groupEnd(); +}; +const error = (...args: any[]) => { + console.group( + `\x1b[31m${new Date().toISOString()} - ERROR - ${getInitiator()}\x1b[0m` + ); + console.error(...args); + console.groupEnd(); +}; +const info = (...args: any[]) => { + console.group( + `\x1b[34m${new Date().toISOString()} - INFO - ${getInitiator()}\x1b[0m` + ); + console.log(...args); + console.groupEnd(); +}; +const debug = (...args: any[]) => { + console.log(...args); +}; + +/** + * @description a simple interface logger for logging to the console and into a log drain in the future + * @example + * log.warn('this is a warning'); + * log.error('this is an error'); + * log.info('this is an info'); + * @exports log + */ +export const log = { + warn, + error, + info, + debug, +}; + +export const utils = { + bold: (text: string) => `\x1b[1m${text}\x1b[0m`, + red: (text: string) => `\x1b[31m${text}\x1b[0m`, + green: (text: string) => `\x1b[32m${text}\x1b[0m`, + yellow: (text: string) => `\x1b[33m${text}\x1b[0m`, + blue: (text: string) => `\x1b[34m${text}\x1b[0m`, + magenta: (text: string) => `\x1b[35m${text}\x1b[0m`, + cyan: (text: string) => `\x1b[36m${text}\x1b[0m`, + white: (text: string) => `\x1b[37m${text}\x1b[0m`, + gray: (text: string) => `\x1b[90m${text}\x1b[0m`, +}; diff --git a/services/delivery/src/lib/prisma.ts b/services/delivery/src/lib/prisma.ts new file mode 100644 index 00000000..4d495ef0 --- /dev/null +++ b/services/delivery/src/lib/prisma.ts @@ -0,0 +1,29 @@ +import { Prisma, PrismaClient } from "@prisma/client"; + +let prisma: PrismaClient; +type GlobalWithPrisma = typeof globalThis & { + prisma: PrismaClient; +}; + +const OPTIONS: Prisma.PrismaClientOptions = { + log: + process.env.NEXT_PUBLIC_APP_ENV !== "production" + ? ["info", "warn"] + : undefined, +}; + +if (process.env.NODE_ENV === "production") { + prisma = new PrismaClient(OPTIONS); +} else { + // Ensure the prisma instance is re-used during hot-reloading + // Otherwise, a new client will be created on every reload + if (!("prisma" in global)) { + (global as GlobalWithPrisma).prisma = new PrismaClient(OPTIONS); + } + + prisma = (global as GlobalWithPrisma).prisma; +} + +export default prisma; + +export { prisma }; diff --git a/services/delivery/src/resources/grpc-credentials.ts b/services/delivery/src/resources/grpc-credentials.ts new file mode 100644 index 00000000..75a2b5d5 --- /dev/null +++ b/services/delivery/src/resources/grpc-credentials.ts @@ -0,0 +1,5 @@ +import { credentials, ServerCredentials } from "@grpc/grpc-js"; + +export const insecure = credentials.createInsecure(); + +export const serverInsecure = ServerCredentials.createInsecure(); diff --git a/services/delivery/src/resources/protoloader-options.ts b/services/delivery/src/resources/protoloader-options.ts new file mode 100644 index 00000000..5022d96d --- /dev/null +++ b/services/delivery/src/resources/protoloader-options.ts @@ -0,0 +1,7 @@ +export const options = { + keepCase: true, + longs: String, + enums: String, + defaults: true, + oneofs: true, +}; diff --git a/services/delivery/src/server.ts b/services/delivery/src/server.ts new file mode 100644 index 00000000..2032a131 --- /dev/null +++ b/services/delivery/src/server.ts @@ -0,0 +1,35 @@ +import "dotenv/config"; + +import { loadSync } from "@grpc/proto-loader"; +import { loadPackageDefinition, Server } from "@grpc/grpc-js"; + +import { log, utils } from "@delivery/lib/log"; +import { options } from "@delivery/resources/protoloader-options"; +import { serverInsecure } from "@delivery/resources/grpc-credentials"; + +const PORT = process.env.PORT || 50008; +const ADDRESS = `0.0.0.0:${PORT}`; +const PROTO_PATH = __dirname + "/../../proto/delivery.proto"; + +const packageDefinition = loadSync(PROTO_PATH, options); +const { delivery } = loadPackageDefinition(packageDefinition) as any; // todo: fix any +const server = new Server(); + +server.addService(delivery.DeliveryService.service, { + // handlers + // todo: add handlers +}); + +server.addService(delivery.DeliveryPersonService.service, { + // handlers + // todo: add handlers +}); + +server.bindAsync(ADDRESS, serverInsecure, () => { + const message = `---- ${utils.green("good")}${utils.yellow( + "food" + )} Delivery Service ----\nstarted on: ${utils.bold(ADDRESS)} ${utils.green( + "✓" + )}\n`; + log.debug(message); +}); diff --git a/services/delivery/tsconfig.json b/services/delivery/tsconfig.json new file mode 100755 index 00000000..f32ad6b3 --- /dev/null +++ b/services/delivery/tsconfig.json @@ -0,0 +1,18 @@ +{ + "compilerOptions": { + "sourceMap": true, + "outDir": "dist", + "strict": true, + "lib": ["esnext"], + "esModuleInterop": true, + "baseUrl": ".", + "paths": { + "@delivery/*": ["src/*"] + } + }, + "include": ["src/**/*.ts"], + "exclude": ["node_modules"], + "ts-node": { + "require": ["tsconfig-paths/register"] + } +} diff --git a/services/proto/delivery.proto b/services/proto/delivery.proto new file mode 100644 index 00000000..39e65277 --- /dev/null +++ b/services/proto/delivery.proto @@ -0,0 +1,86 @@ +syntax = "proto3"; +import "google/protobuf/timestamp.proto"; +import "google/protobuf/empty.proto"; + +package delivery; + +message Delivery { + string id = 1; + google.protobuf.Timestamp estimated_date = 2; + + string address = 3; + Status status = 4; + + DeliveryPerson person = 5; + string delivery_person_id = 6; +} + +message DeliveryPerson { + string id = 1; + string first_name = 2; + string last_name = 3; + string phone = 4; + repeated float location = 5; + + repeated Delivery deliveries = 6; +} + +enum Status { + PENDING = 0; + IN_PROGRESS = 1; + FULFILLED = 2; + REJECTED = 3; +} + +service DeliveryService { + rpc CreateDelivery (Delivery) returns (Delivery) {} + rpc GetDelivery (DeliveryId) returns (Delivery) {} + rpc UpdateDelivery (Delivery) returns (Delivery) {} + rpc DeleteDelivery (DeliveryId) returns (google.protobuf.Empty) {} + rpc ListDeliveriesByUser (UserId) returns (stream Delivery) {} + rpc ListDeliveriesByRestaurant (RestaurantId) returns (stream Delivery) {} + +} + +service DeliveryPersonService { + rpc CreateDeliveryPerson (DeliveryPerson) returns (DeliveryPerson) {} + rpc GetDeliveryPerson (DeliveryPersonId) returns (DeliveryPerson) {} + rpc UpdateDeliveryPerson (DeliveryPerson) returns (DeliveryPerson) {} + rpc DeleteDeliveryPerson (DeliveryPersonId) returns (google.protobuf.Empty) {} + rpc ListDeliveryPersons (google.protobuf.Empty) returns (stream DeliveryPerson) {} + rpc ListNearDeliveryPersons (Location) returns (stream DeliveryPerson) {} +} + + +message DeliveryId { + string id = 1; +} +message DeliveryCreateInput { + google.protobuf.Timestamp estimated_date = 1; + string address = 2; + Status status = 3; + string delivery_person_id = 4; +} + +message UserId { + string id = 1; +} + +message RestaurantId { + string id = 1; +} + +message DeliveryPersonId { + string id = 1; +} +message DeliveryPersonCreateInput { + string first_name = 1; + string last_name = 2; + string phone = 3; + repeated float location = 4; +} + +message Location { + float latitude = 1; + float longitude = 2; +} From 96577b597d2fb7c244e0c71603d41b652427eaf4 Mon Sep 17 00:00:00 2001 From: Florian LEROUX <10078837+floriaaan@users.noreply.github.com> Date: Wed, 29 Mar 2023 09:50:50 +0200 Subject: [PATCH 009/883] fix(server): forgot to start server explicitly --- services/delivery/src/server.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/services/delivery/src/server.ts b/services/delivery/src/server.ts index 2032a131..16a27d70 100644 --- a/services/delivery/src/server.ts +++ b/services/delivery/src/server.ts @@ -7,6 +7,8 @@ import { log, utils } from "@delivery/lib/log"; import { options } from "@delivery/resources/protoloader-options"; import { serverInsecure } from "@delivery/resources/grpc-credentials"; +import { CreateDelivery } from "@delivery/handlers/delivery"; + const PORT = process.env.PORT || 50008; const ADDRESS = `0.0.0.0:${PORT}`; const PROTO_PATH = __dirname + "/../../proto/delivery.proto"; @@ -18,6 +20,7 @@ const server = new Server(); server.addService(delivery.DeliveryService.service, { // handlers // todo: add handlers + CreateDelivery, }); server.addService(delivery.DeliveryPersonService.service, { @@ -26,6 +29,7 @@ server.addService(delivery.DeliveryPersonService.service, { }); server.bindAsync(ADDRESS, serverInsecure, () => { + server.start(); const message = `---- ${utils.green("good")}${utils.yellow( "food" )} Delivery Service ----\nstarted on: ${utils.bold(ADDRESS)} ${utils.green( From 30e8b30c29bcad856de3fd552b9948de40962af8 Mon Sep 17 00:00:00 2001 From: Florian LEROUX <10078837+floriaaan@users.noreply.github.com> Date: Wed, 29 Mar 2023 09:51:35 +0200 Subject: [PATCH 010/883] fix(readme): add port binding to docker postgres usage --- services/delivery/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/services/delivery/README.md b/services/delivery/README.md index 1086b6c8..f3baac1e 100644 --- a/services/delivery/README.md +++ b/services/delivery/README.md @@ -5,7 +5,7 @@ | **Port:** 50008 | | **Developer:** @floriaaan | | **Status:** In progress | -| **Last update:** 2023-03-25 | +| **Last update:** 2023-03-29 | | **Language:** NodeJS | | **Dependencies:** TypeScript, Prisma, gRPC, Postgres | | **Models:** (see [`prisma/schema.prisma`](./prisma/schema.prisma)) | @@ -41,7 +41,7 @@ You can use the following tools to help you with the setup: - You can use nvm to set your Node version using: - `nvm use`. - You can use docker to run your Postgres database using: - - `docker run --name postgres -e POSTGRES_PASSWORD=password -d postgres`. + - `docker run --name postgres -p 5432:5432 -e POSTGRES_PASSWORD=password -d postgres` ## Getting started From 531caaba425053c41e18e2bda0718df76a924abb Mon Sep 17 00:00:00 2001 From: Florian LEROUX <10078837+floriaaan@users.noreply.github.com> Date: Wed, 29 Mar 2023 09:52:07 +0200 Subject: [PATCH 011/883] feat(pkg): add nodemon watcher script --- services/delivery/.env.example | 2 +- services/delivery/package.json | 4 +- services/delivery/pnpm-lock.yaml | 230 ++++++++++++++++++++++++++++--- 3 files changed, 218 insertions(+), 18 deletions(-) diff --git a/services/delivery/.env.example b/services/delivery/.env.example index 6a86f4b9..e7b2b4e7 100644 --- a/services/delivery/.env.example +++ b/services/delivery/.env.example @@ -1,2 +1,2 @@ -DATABASE_URL=postgres://postgres:postgres@localhost:5432/postgres +DATABASE_URL=postgres://postgres:password@localhost:5432/postgres PORT=50008 \ No newline at end of file diff --git a/services/delivery/package.json b/services/delivery/package.json index 09782b02..113ef54d 100644 --- a/services/delivery/package.json +++ b/services/delivery/package.json @@ -1,7 +1,8 @@ { "name": "typescript-grpc", "scripts": { - "dev": "ts-node ./src/server.ts", + "start": "ts-node ./src/server.ts", + "dev": "nodemon --watch 'src/**/*.ts' --exec 'ts-node' src/server.ts", "seed": "ts-node prisma/seed.ts", "client:delivery-create": "ts-node ./src/client/delivery-create.ts" }, @@ -14,6 +15,7 @@ }, "devDependencies": { "@types/node": "18.15.9", + "nodemon": "^2.0.22", "prisma": "4.11.0", "ts-node": "10.9.1", "tsconfig-paths": "^4.1.2", diff --git a/services/delivery/pnpm-lock.yaml b/services/delivery/pnpm-lock.yaml index 50a04449..38da5b6e 100644 --- a/services/delivery/pnpm-lock.yaml +++ b/services/delivery/pnpm-lock.yaml @@ -5,8 +5,8 @@ specifiers: '@grpc/proto-loader': 0.7.6 '@prisma/client': 4.11.0 '@types/node': 18.15.9 - chalk: 4.1.2 dotenv: ^16.0.3 + nodemon: ^2.0.22 prisma: 4.11.0 protobufjs: 7.2.2 ts-node: 10.9.1 @@ -17,12 +17,12 @@ dependencies: '@grpc/grpc-js': 1.8.13 '@grpc/proto-loader': 0.7.6 '@prisma/client': 4.11.0_prisma@4.11.0 - chalk: 4.1.2 dotenv: 16.0.3 protobufjs: 7.2.2 devDependencies: '@types/node': 18.15.9 + nodemon: 2.0.22 prisma: 4.11.0 ts-node: 10.9.1_3flabivgbrnlfzsgzfhinuvrvy tsconfig-paths: 4.1.2 @@ -161,6 +161,10 @@ packages: /@types/node/18.15.9: resolution: {integrity: sha512-dUxhiNzBLr6IqlZXz6e/rN2YQXlFgOei/Dxy+e3cyXTJ4txSUbGT2/fmnD6zd/75jDMeW5bDee+YXxlFKHoV0A==} + /abbrev/1.1.1: + resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} + dev: true + /acorn-walk/8.2.0: resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} engines: {node: '>=0.4.0'} @@ -184,17 +188,55 @@ packages: color-convert: 2.0.1 dev: false + /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 + /arg/4.1.3: resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} dev: true - /chalk/4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} + /balanced-match/1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + dev: true + + /binary-extensions/2.2.0: + resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} + engines: {node: '>=8'} + dev: true + + /brace-expansion/1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - dev: false + balanced-match: 1.0.2 + concat-map: 0.0.1 + dev: true + + /braces/3.0.2: + resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + engines: {node: '>=8'} + dependencies: + fill-range: 7.0.1 + dev: true + + /chokidar/3.5.3: + resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} + engines: {node: '>= 8.10.0'} + dependencies: + anymatch: 3.1.3 + braces: 3.0.2 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.2 + dev: true /cliui/7.0.4: resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} @@ -215,10 +257,26 @@ packages: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} dev: false + /concat-map/0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + dev: true + /create-require/1.1.1: resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} dev: true + /debug/3.2.7_supports-color@5.5.0: + resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.3 + supports-color: 5.5.0 + dev: true + /diff/4.0.2: resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} engines: {node: '>=0.3.1'} @@ -238,21 +296,71 @@ packages: engines: {node: '>=6'} 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: true + + /fsevents/2.3.2: + resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + requiresBuild: true + dev: true + optional: true + /get-caller-file/2.0.5: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} dev: false - /has-flag/4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + /glob-parent/5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + dependencies: + is-glob: 4.0.3 + dev: true + + /has-flag/3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + dev: true + + /ignore-by-default/1.0.1: + resolution: {integrity: sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==} + dev: true + + /is-binary-path/2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} engines: {node: '>=8'} - dev: false + dependencies: + binary-extensions: 2.2.0 + dev: true + + /is-extglob/2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + dev: true /is-fullwidth-code-point/3.0.0: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} engines: {node: '>=8'} dev: false + /is-glob/4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + dependencies: + is-extglob: 2.1.1 + dev: true + + /is-number/7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + dev: true + /json5/2.2.3: resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} engines: {node: '>=6'} @@ -275,10 +383,54 @@ packages: resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} dev: true + /minimatch/3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + dependencies: + brace-expansion: 1.1.11 + dev: true + /minimist/1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} dev: true + /ms/2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + dev: true + + /nodemon/2.0.22: + resolution: {integrity: sha512-B8YqaKMmyuCO7BowF1Z1/mkPqLk6cs/l63Ojtd6otKjMx47Dq1utxfRxcavH1I7VSaL8n5BUaoutadnsX3AAVQ==} + engines: {node: '>=8.10.0'} + hasBin: true + dependencies: + chokidar: 3.5.3 + debug: 3.2.7_supports-color@5.5.0 + ignore-by-default: 1.0.1 + minimatch: 3.1.2 + pstree.remy: 1.1.8 + semver: 5.7.1 + simple-update-notifier: 1.1.0 + supports-color: 5.5.0 + touch: 3.1.0 + undefsafe: 2.0.5 + dev: true + + /nopt/1.0.10: + resolution: {integrity: sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==} + hasBin: true + dependencies: + abbrev: 1.1.1 + dev: true + + /normalize-path/3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + dev: true + + /picomatch/2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + dev: true + /prisma/4.11.0: resolution: {integrity: sha512-4zZmBXssPUEiX+GeL0MUq/Yyie4ltiKmGu7jCJFnYMamNrrulTBc+D+QwAQSJ01tyzeGHlD13kOnqPwRipnlNw==} engines: {node: '>=14.17'} @@ -306,11 +458,39 @@ packages: long: 5.2.1 dev: false + /pstree.remy/1.1.8: + resolution: {integrity: sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==} + dev: true + + /readdirp/3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + dependencies: + picomatch: 2.3.1 + dev: true + /require-directory/2.1.1: resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} engines: {node: '>=0.10.0'} dev: false + /semver/5.7.1: + resolution: {integrity: sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==} + hasBin: true + dev: true + + /semver/7.0.0: + resolution: {integrity: sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==} + hasBin: true + dev: true + + /simple-update-notifier/1.1.0: + resolution: {integrity: sha512-VpsrsJSUcJEseSbMHkrsrAVSdvVS5I96Qo1QAQ4FxQ9wXFcB+pjj7FB7/us9+GcgfW4ziHtYMc1J0PLczb55mg==} + engines: {node: '>=8.10.0'} + dependencies: + semver: 7.0.0 + dev: true + /string-width/4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} @@ -332,12 +512,26 @@ packages: engines: {node: '>=4'} dev: true - /supports-color/7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} + /supports-color/5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} dependencies: - has-flag: 4.0.0 - dev: false + has-flag: 3.0.0 + 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 + dev: true + + /touch/3.1.0: + resolution: {integrity: sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==} + hasBin: true + dependencies: + nopt: 1.0.10 + dev: true /ts-node/10.9.1_3flabivgbrnlfzsgzfhinuvrvy: resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} @@ -385,6 +579,10 @@ packages: hasBin: true dev: true + /undefsafe/2.0.5: + resolution: {integrity: sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==} + dev: true + /v8-compile-cache-lib/3.0.1: resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} dev: true From 5b6447986f527c64824d507811d0e36f3a0057f0 Mon Sep 17 00:00:00 2001 From: Florian LEROUX <10078837+floriaaan@users.noreply.github.com> Date: Wed, 29 Mar 2023 09:52:32 +0200 Subject: [PATCH 012/883] ref: change estimated_date to eta --- .../migration.sql | 30 +++++++++++++++++++ .../prisma/migrations/migration_lock.toml | 3 ++ services/delivery/prisma/schema.prisma | 2 +- services/delivery/prisma/seed.ts | 6 ++-- services/delivery/types/delivery.d.ts | 11 +++++++ services/proto/delivery.proto | 9 +++--- 6 files changed, 52 insertions(+), 9 deletions(-) create mode 100644 services/delivery/prisma/migrations/20230328152031_init_database/migration.sql create mode 100644 services/delivery/prisma/migrations/migration_lock.toml create mode 100644 services/delivery/types/delivery.d.ts diff --git a/services/delivery/prisma/migrations/20230328152031_init_database/migration.sql b/services/delivery/prisma/migrations/20230328152031_init_database/migration.sql new file mode 100644 index 00000000..206c27b2 --- /dev/null +++ b/services/delivery/prisma/migrations/20230328152031_init_database/migration.sql @@ -0,0 +1,30 @@ +-- CreateEnum +CREATE TYPE "Status" AS ENUM ('PENDING', 'IN_PROGRESS', 'FULFILLED', 'REJECTED'); + +-- CreateTable +CREATE TABLE "Delivery" ( + "id" TEXT NOT NULL, + "eta" TIMESTAMP(3) NOT NULL, + "address" TEXT NOT NULL, + "status" "Status" NOT NULL DEFAULT 'PENDING', + "delivery_person_id" TEXT NOT NULL, + + CONSTRAINT "Delivery_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "DeliveryPerson" ( + "id" TEXT NOT NULL, + "first_name" TEXT NOT NULL, + "last_name" TEXT NOT NULL, + "phone" TEXT NOT NULL, + "location" DOUBLE PRECISION[], + + CONSTRAINT "DeliveryPerson_pkey" PRIMARY KEY ("id") +); + +-- CreateIndex +CREATE UNIQUE INDEX "DeliveryPerson_phone_key" ON "DeliveryPerson"("phone"); + +-- AddForeignKey +ALTER TABLE "Delivery" ADD CONSTRAINT "Delivery_delivery_person_id_fkey" FOREIGN KEY ("delivery_person_id") REFERENCES "DeliveryPerson"("id") ON DELETE RESTRICT ON UPDATE CASCADE; diff --git a/services/delivery/prisma/migrations/migration_lock.toml b/services/delivery/prisma/migrations/migration_lock.toml new file mode 100644 index 00000000..fbffa92c --- /dev/null +++ b/services/delivery/prisma/migrations/migration_lock.toml @@ -0,0 +1,3 @@ +# Please do not edit this file manually +# It should be added in your version-control system (i.e. Git) +provider = "postgresql" \ No newline at end of file diff --git a/services/delivery/prisma/schema.prisma b/services/delivery/prisma/schema.prisma index a9384d5b..2c999c8d 100644 --- a/services/delivery/prisma/schema.prisma +++ b/services/delivery/prisma/schema.prisma @@ -16,7 +16,7 @@ enum Status { model Delivery { id String @id @default(cuid()) - estimated_date DateTime + eta DateTime address String status Status @default(PENDING) diff --git a/services/delivery/prisma/seed.ts b/services/delivery/prisma/seed.ts index 40472cf0..cf92b561 100644 --- a/services/delivery/prisma/seed.ts +++ b/services/delivery/prisma/seed.ts @@ -27,17 +27,17 @@ const deliveryPerson: Prisma.DeliveryPersonCreateInput[] = [ const deliveries: Prisma.DeliveryCreateInput[] = [ { address: "15 rue de la paix 75000 Paris", - estimated_date: new Date("2023-01-01"), + eta: new Date("2023-01-01"), person: { create: deliveryPerson[0] }, }, { address: "16 rue de la paix 75000 Paris", - estimated_date: new Date("2023-02-01"), + eta: new Date("2023-02-01"), person: { create: deliveryPerson[1] }, }, { address: "17 rue de la paix 75000 Paris", - estimated_date: new Date("2023-03-01"), + eta: new Date("2023-03-01"), person: { create: deliveryPerson[2] }, }, ]; diff --git a/services/delivery/types/delivery.d.ts b/services/delivery/types/delivery.d.ts new file mode 100644 index 00000000..52fc3159 --- /dev/null +++ b/services/delivery/types/delivery.d.ts @@ -0,0 +1,11 @@ +import { Status } from "@prisma/client"; + +export type DeliveryCreateInput = { + eta: { + seconds: number; + nano: number; + }; + address: string; + status: Status; + delivery_person_id: string; +}; diff --git a/services/proto/delivery.proto b/services/proto/delivery.proto index 39e65277..b306d511 100644 --- a/services/proto/delivery.proto +++ b/services/proto/delivery.proto @@ -1,12 +1,11 @@ syntax = "proto3"; -import "google/protobuf/timestamp.proto"; import "google/protobuf/empty.proto"; package delivery; message Delivery { string id = 1; - google.protobuf.Timestamp estimated_date = 2; + string eta = 2; string address = 3; Status status = 4; @@ -33,7 +32,7 @@ enum Status { } service DeliveryService { - rpc CreateDelivery (Delivery) returns (Delivery) {} + rpc CreateDelivery (DeliveryCreateInput) returns (Delivery) {} rpc GetDelivery (DeliveryId) returns (Delivery) {} rpc UpdateDelivery (Delivery) returns (Delivery) {} rpc DeleteDelivery (DeliveryId) returns (google.protobuf.Empty) {} @@ -43,7 +42,7 @@ service DeliveryService { } service DeliveryPersonService { - rpc CreateDeliveryPerson (DeliveryPerson) returns (DeliveryPerson) {} + rpc CreateDeliveryPerson (DeliveryPersonCreateInput) returns (DeliveryPerson) {} rpc GetDeliveryPerson (DeliveryPersonId) returns (DeliveryPerson) {} rpc UpdateDeliveryPerson (DeliveryPerson) returns (DeliveryPerson) {} rpc DeleteDeliveryPerson (DeliveryPersonId) returns (google.protobuf.Empty) {} @@ -56,7 +55,7 @@ message DeliveryId { string id = 1; } message DeliveryCreateInput { - google.protobuf.Timestamp estimated_date = 1; + string eta = 1; string address = 2; Status status = 3; string delivery_person_id = 4; From bbb2c26773b209e7e72829af3c49d8d252582449 Mon Sep 17 00:00:00 2001 From: Florian LEROUX <10078837+floriaaan@users.noreply.github.com> Date: Wed, 29 Mar 2023 09:53:00 +0200 Subject: [PATCH 013/883] feat(handler): add create-delivery handler --- .../delivery/src/client/delivery-create.ts | 39 +++++++++++++++++ services/delivery/src/handlers/delivery.ts | 42 +++++++++++++++++++ 2 files changed, 81 insertions(+) create mode 100644 services/delivery/src/client/delivery-create.ts create mode 100644 services/delivery/src/handlers/delivery.ts diff --git a/services/delivery/src/client/delivery-create.ts b/services/delivery/src/client/delivery-create.ts new file mode 100644 index 00000000..2b4fdff5 --- /dev/null +++ b/services/delivery/src/client/delivery-create.ts @@ -0,0 +1,39 @@ +import "dotenv/config"; +import { loadSync } from "@grpc/proto-loader"; +import { loadPackageDefinition } from "@grpc/grpc-js"; + +import { options } from "@delivery/resources/protoloader-options"; +import { insecure } from "@delivery/resources/grpc-credentials"; +import { log } from "@delivery/lib/log"; + +const PORT = process.env.PORT || 50008; +const ADDRESS = `localhost:${PORT}`; +const PROTO_PATH = __dirname + "/../../../proto/delivery.proto"; + +const packageDefinition = loadSync(PROTO_PATH, options); +const { delivery } = loadPackageDefinition(packageDefinition) as any; + +function main() { + const client = new delivery.DeliveryService(ADDRESS, insecure); + + /** + * message DeliveryCreateInput { + google.protobuf.Timestamp eta = 1; + string address = 2; + Status status = 3; + string delivery_person_id = 4; + } + */ + const data = { + eta: "2022-01-01T00:00:00.000Z", + address: "10 Rue de la République, 75003 Paris, France", + status: "PENDING", + delivery_person_id: "random_id", + }; + client.CreateDelivery(data, (err: any, response: any) => { + if (err) log.error(err); + log.info(response); + }); +} + +main(); diff --git a/services/delivery/src/handlers/delivery.ts b/services/delivery/src/handlers/delivery.ts new file mode 100644 index 00000000..c6f070af --- /dev/null +++ b/services/delivery/src/handlers/delivery.ts @@ -0,0 +1,42 @@ +import { prisma } from "@delivery/lib/prisma"; +import { log } from "@delivery/lib/log"; +import { Status } from "@prisma/client"; + +type DeliveryCreateInput = { + eta: string; + address: string; + status: Status; + delivery_person_id: string; +}; + +export const CreateDelivery = async ( + data: any, + callback: (err: any, response: any) => void +) => { + log.debug("request received at CreateDelivery handler\n", data.request); + try { + const { request } = data; + const { eta, address, status, delivery_person_id } = + request as DeliveryCreateInput; + + const delivery = await prisma.delivery.create({ + data: { + eta: new Date(eta), + address, + status, + person: { + connect: { + id: delivery_person_id, + }, + }, + }, + include: { + person: true, + }, + }); + callback(null, delivery); + } catch (error) { + log.error(error); + callback(error, null); + } +}; From bcc83d80c305188278f8106ac2c71bfa22529192 Mon Sep 17 00:00:00 2001 From: Florian LEROUX <10078837+floriaaan@users.noreply.github.com> Date: Fri, 31 Mar 2023 20:59:30 +0200 Subject: [PATCH 014/883] feat(delivery): add implementation of handlers for delivery service --- services/delivery/README.md | 2 +- services/delivery/package.json | 7 ++- .../migration.sql | 10 ++++ services/delivery/prisma/schema.prisma | 7 ++- services/delivery/prisma/seed.ts | 18 +++++++ .../create.ts} | 16 ++---- .../delivery/src/client/delivery/delete.ts | 28 +++++++++++ services/delivery/src/client/delivery/get.ts | 28 +++++++++++ .../src/client/delivery/list-by-restaurant.ts | 39 +++++++++++++++ .../src/client/delivery/list-by-user.ts | 39 +++++++++++++++ .../delivery/src/client/delivery/update.ts | 35 +++++++++++++ .../{delivery.ts => delivery/create.ts} | 20 +++----- .../delivery/src/handlers/delivery/delete.ts | 20 ++++++++ .../delivery/src/handlers/delivery/get.ts | 23 +++++++++ .../delivery/src/handlers/delivery/index.ts | 15 ++++++ .../handlers/delivery/list-by-restaurant.ts | 30 ++++++++++++ .../src/handlers/delivery/list-by-user.ts | 27 ++++++++++ .../delivery/src/handlers/delivery/update.ts | 34 +++++++++++++ services/delivery/src/server.ts | 14 ++---- .../delivery/src/types/delivery-person.d.ts | 11 +++++ services/delivery/src/types/delivery.d.ts | 49 +++++++++++++++++++ services/delivery/types/delivery.d.ts | 11 ----- services/proto/delivery.proto | 6 +++ 23 files changed, 439 insertions(+), 50 deletions(-) create mode 100644 services/delivery/prisma/migrations/20230331181153_add_user_and_restaurant_ids/migration.sql rename services/delivery/src/client/{delivery-create.ts => delivery/create.ts} (74%) create mode 100644 services/delivery/src/client/delivery/delete.ts create mode 100644 services/delivery/src/client/delivery/get.ts create mode 100644 services/delivery/src/client/delivery/list-by-restaurant.ts create mode 100644 services/delivery/src/client/delivery/list-by-user.ts create mode 100644 services/delivery/src/client/delivery/update.ts rename services/delivery/src/handlers/{delivery.ts => delivery/create.ts} (61%) create mode 100644 services/delivery/src/handlers/delivery/delete.ts create mode 100644 services/delivery/src/handlers/delivery/get.ts create mode 100644 services/delivery/src/handlers/delivery/index.ts create mode 100644 services/delivery/src/handlers/delivery/list-by-restaurant.ts create mode 100644 services/delivery/src/handlers/delivery/list-by-user.ts create mode 100644 services/delivery/src/handlers/delivery/update.ts create mode 100644 services/delivery/src/types/delivery-person.d.ts create mode 100644 services/delivery/src/types/delivery.d.ts delete mode 100644 services/delivery/types/delivery.d.ts diff --git a/services/delivery/README.md b/services/delivery/README.md index f3baac1e..7f125245 100644 --- a/services/delivery/README.md +++ b/services/delivery/README.md @@ -5,7 +5,7 @@ | **Port:** 50008 | | **Developer:** @floriaaan | | **Status:** In progress | -| **Last update:** 2023-03-29 | +| **Last update:** 2023-03-31 | | **Language:** NodeJS | | **Dependencies:** TypeScript, Prisma, gRPC, Postgres | | **Models:** (see [`prisma/schema.prisma`](./prisma/schema.prisma)) | diff --git a/services/delivery/package.json b/services/delivery/package.json index 113ef54d..3eb5a908 100644 --- a/services/delivery/package.json +++ b/services/delivery/package.json @@ -4,7 +4,12 @@ "start": "ts-node ./src/server.ts", "dev": "nodemon --watch 'src/**/*.ts' --exec 'ts-node' src/server.ts", "seed": "ts-node prisma/seed.ts", - "client:delivery-create": "ts-node ./src/client/delivery-create.ts" + "client:delivery-create": "ts-node ./src/client/delivery/create.ts", + "client:delivery-get": "ts-node ./src/client/delivery/get.ts", + "client:delivery-update": "ts-node ./src/client/delivery/update.ts", + "client:delivery-delete": "ts-node ./src/client/delivery/delete.ts", + "client:delivery-listByRestaurant": "ts-node ./src/client/delivery/list-by-restaurant.ts", + "client:delivery-listByUser": "ts-node ./src/client/delivery/list-by-user.ts" }, "dependencies": { "@grpc/grpc-js": "^1.8.13", diff --git a/services/delivery/prisma/migrations/20230331181153_add_user_and_restaurant_ids/migration.sql b/services/delivery/prisma/migrations/20230331181153_add_user_and_restaurant_ids/migration.sql new file mode 100644 index 00000000..2e663da2 --- /dev/null +++ b/services/delivery/prisma/migrations/20230331181153_add_user_and_restaurant_ids/migration.sql @@ -0,0 +1,10 @@ +/* + Warnings: + + - Added the required column `restaurant_id` to the `Delivery` table without a default value. This is not possible if the table is not empty. + - Added the required column `user_id` to the `Delivery` table without a default value. This is not possible if the table is not empty. + +*/ +-- AlterTable +ALTER TABLE "Delivery" ADD COLUMN "restaurant_id" TEXT NOT NULL, +ADD COLUMN "user_id" TEXT NOT NULL; diff --git a/services/delivery/prisma/schema.prisma b/services/delivery/prisma/schema.prisma index 2c999c8d..0d7939f5 100644 --- a/services/delivery/prisma/schema.prisma +++ b/services/delivery/prisma/schema.prisma @@ -15,7 +15,7 @@ enum Status { } model Delivery { - id String @id @default(cuid()) + id String @id @default(cuid()) eta DateTime address String @@ -23,13 +23,16 @@ model Delivery { person DeliveryPerson @relation(fields: [delivery_person_id], references: [id]) delivery_person_id String + + user_id String + restaurant_id String } model DeliveryPerson { id String @id @default(cuid()) first_name String last_name String - phone String @unique + phone String @unique location Float[] deliveries Delivery[] diff --git a/services/delivery/prisma/seed.ts b/services/delivery/prisma/seed.ts index cf92b561..cc6998fd 100644 --- a/services/delivery/prisma/seed.ts +++ b/services/delivery/prisma/seed.ts @@ -29,16 +29,33 @@ const deliveries: Prisma.DeliveryCreateInput[] = [ address: "15 rue de la paix 75000 Paris", eta: new Date("2023-01-01"), person: { create: deliveryPerson[0] }, + + restaurant_id: "restaurant_id:1", + user_id: "user_id:1", + }, + { + address: "15 rue de la paix 75000 Paris", + eta: new Date("2023-01-01"), + person: { create: deliveryPerson[0] }, + + restaurant_id: "restaurant_id:2", + user_id: "user_id:1", }, { address: "16 rue de la paix 75000 Paris", eta: new Date("2023-02-01"), person: { create: deliveryPerson[1] }, + + restaurant_id: "restaurant_id:1", + user_id: "user_id:2", }, { address: "17 rue de la paix 75000 Paris", eta: new Date("2023-03-01"), person: { create: deliveryPerson[2] }, + + restaurant_id: "restaurant_id:1", + user_id: "user_id:3", }, ]; @@ -60,5 +77,6 @@ main() .catch(async (e) => { console.error(e); await prisma.$disconnect(); + // @ts-ignore process.exit(1); }); diff --git a/services/delivery/src/client/delivery-create.ts b/services/delivery/src/client/delivery/create.ts similarity index 74% rename from services/delivery/src/client/delivery-create.ts rename to services/delivery/src/client/delivery/create.ts index 2b4fdff5..9e6717dd 100644 --- a/services/delivery/src/client/delivery-create.ts +++ b/services/delivery/src/client/delivery/create.ts @@ -8,7 +8,7 @@ import { log } from "@delivery/lib/log"; const PORT = process.env.PORT || 50008; const ADDRESS = `localhost:${PORT}`; -const PROTO_PATH = __dirname + "/../../../proto/delivery.proto"; +const PROTO_PATH = __dirname + "/../../../../proto/delivery.proto"; const packageDefinition = loadSync(PROTO_PATH, options); const { delivery } = loadPackageDefinition(packageDefinition) as any; @@ -16,23 +16,17 @@ const { delivery } = loadPackageDefinition(packageDefinition) as any; function main() { const client = new delivery.DeliveryService(ADDRESS, insecure); - /** - * message DeliveryCreateInput { - google.protobuf.Timestamp eta = 1; - string address = 2; - Status status = 3; - string delivery_person_id = 4; - } - */ const data = { eta: "2022-01-01T00:00:00.000Z", address: "10 Rue de la République, 75003 Paris, France", status: "PENDING", delivery_person_id: "random_id", + restaurant_id: "restaurant_id:1", + user_id: "user_id:1", }; client.CreateDelivery(data, (err: any, response: any) => { - if (err) log.error(err); - log.info(response); + if (err) log.debug(err); + log.debug(response); }); } diff --git a/services/delivery/src/client/delivery/delete.ts b/services/delivery/src/client/delivery/delete.ts new file mode 100644 index 00000000..74c08a90 --- /dev/null +++ b/services/delivery/src/client/delivery/delete.ts @@ -0,0 +1,28 @@ +import "dotenv/config"; +import { loadSync } from "@grpc/proto-loader"; +import { loadPackageDefinition } from "@grpc/grpc-js"; + +import { options } from "@delivery/resources/protoloader-options"; +import { insecure } from "@delivery/resources/grpc-credentials"; +import { log } from "@delivery/lib/log"; + +const PORT = process.env.PORT || 50008; +const ADDRESS = `localhost:${PORT}`; +const PROTO_PATH = __dirname + "/../../../../proto/delivery.proto"; + +const packageDefinition = loadSync(PROTO_PATH, options); +const { delivery } = loadPackageDefinition(packageDefinition) as any; + +function main() { + const client = new delivery.DeliveryService(ADDRESS, insecure); + + const data = { + id: "clfwvdqdg0000eun46hcudaec", // Change this to a valid delivery id + }; + client.DeleteDelivery(data, (err: any, response: any) => { + if (err) log.debug(err); + log.debug(response); + }); +} + +main(); diff --git a/services/delivery/src/client/delivery/get.ts b/services/delivery/src/client/delivery/get.ts new file mode 100644 index 00000000..197e23df --- /dev/null +++ b/services/delivery/src/client/delivery/get.ts @@ -0,0 +1,28 @@ +import "dotenv/config"; +import { loadSync } from "@grpc/proto-loader"; +import { loadPackageDefinition } from "@grpc/grpc-js"; + +import { options } from "@delivery/resources/protoloader-options"; +import { insecure } from "@delivery/resources/grpc-credentials"; +import { log } from "@delivery/lib/log"; + +const PORT = process.env.PORT || 50008; +const ADDRESS = `localhost:${PORT}`; +const PROTO_PATH = __dirname + "/../../../../proto/delivery.proto"; + +const packageDefinition = loadSync(PROTO_PATH, options); +const { delivery } = loadPackageDefinition(packageDefinition) as any; + +function main() { + const client = new delivery.DeliveryService(ADDRESS, insecure); + + const data = { + id: "clfwv7rcp0000euwpyyoid7x", // Change this to a valid delivery id + }; + client.GetDelivery(data, (err: any, response: any) => { + if (err) log.debug(err); + log.debug(response); + }); +} + +main(); diff --git a/services/delivery/src/client/delivery/list-by-restaurant.ts b/services/delivery/src/client/delivery/list-by-restaurant.ts new file mode 100644 index 00000000..0e7157a5 --- /dev/null +++ b/services/delivery/src/client/delivery/list-by-restaurant.ts @@ -0,0 +1,39 @@ +import "dotenv/config"; +import { loadSync } from "@grpc/proto-loader"; +import { loadPackageDefinition } from "@grpc/grpc-js"; + +import { options } from "@delivery/resources/protoloader-options"; +import { insecure } from "@delivery/resources/grpc-credentials"; +import { log } from "@delivery/lib/log"; +import { Delivery } from "@delivery/types/delivery"; + +const PORT = process.env.PORT || 50008; +const ADDRESS = `localhost:${PORT}`; +const PROTO_PATH = __dirname + "/../../../../proto/delivery.proto"; + +const packageDefinition = loadSync(PROTO_PATH, options); +const { delivery } = loadPackageDefinition(packageDefinition) as any; + +function main() { + const client = new delivery.DeliveryService(ADDRESS, insecure); + + const data = { + id: "restaurant_id:1", + }; + + const call = client.ListDeliveriesByRestaurant(data); + const deliveries: Delivery[] = []; + call.on("data", (delivery: Delivery) => { + log.debug(`Received delivery: ${delivery.id}`); + deliveries.push(delivery); + }); + call.on("end", () => { + console.log("All deliveries received."); + log.debug(deliveries); + }); + call.on("error", (error: Error) => { + log.debug("Error:", error.message); + }); +} + +main(); diff --git a/services/delivery/src/client/delivery/list-by-user.ts b/services/delivery/src/client/delivery/list-by-user.ts new file mode 100644 index 00000000..b51c7f2b --- /dev/null +++ b/services/delivery/src/client/delivery/list-by-user.ts @@ -0,0 +1,39 @@ +import "dotenv/config"; +import { loadSync } from "@grpc/proto-loader"; +import { loadPackageDefinition } from "@grpc/grpc-js"; + +import { options } from "@delivery/resources/protoloader-options"; +import { insecure } from "@delivery/resources/grpc-credentials"; +import { log } from "@delivery/lib/log"; +import { Delivery } from "@delivery/types/delivery"; + +const PORT = process.env.PORT || 50008; +const ADDRESS = `localhost:${PORT}`; +const PROTO_PATH = __dirname + "/../../../../proto/delivery.proto"; + +const packageDefinition = loadSync(PROTO_PATH, options); +const { delivery } = loadPackageDefinition(packageDefinition) as any; + +function main() { + const client = new delivery.DeliveryService(ADDRESS, insecure); + + const data = { + id: "user_id:1", + }; + + const call = client.ListDeliveriesByUser(data); + const deliveries: Delivery[] = []; + call.on("data", (delivery: Delivery) => { + log.debug(`Received delivery: ${delivery.id}`); + deliveries.push(delivery); + }); + call.on("end", () => { + console.log("All deliveries received."); + log.debug(deliveries); + }); + call.on("error", (error: Error) => { + log.debug("Error:", error.message); + }); +} + +main(); diff --git a/services/delivery/src/client/delivery/update.ts b/services/delivery/src/client/delivery/update.ts new file mode 100644 index 00000000..1b997641 --- /dev/null +++ b/services/delivery/src/client/delivery/update.ts @@ -0,0 +1,35 @@ +import "dotenv/config"; +import { loadSync } from "@grpc/proto-loader"; +import { loadPackageDefinition } from "@grpc/grpc-js"; + +import { options } from "@delivery/resources/protoloader-options"; +import { insecure } from "@delivery/resources/grpc-credentials"; +import { log } from "@delivery/lib/log"; +import { Status } from "@prisma/client"; + +const PORT = process.env.PORT || 50008; +const ADDRESS = `localhost:${PORT}`; +const PROTO_PATH = __dirname + "/../../../../proto/delivery.proto"; + +const packageDefinition = loadSync(PROTO_PATH, options); +const { delivery } = loadPackageDefinition(packageDefinition) as any; + +function main() { + const client = new delivery.DeliveryService(ADDRESS, insecure); + + const data = { + id: "clfwvhula0000eunjmo7bmrtz", // Change this to a valid delivery id + eta: "2022-01-01T00:00:00.000Z", + address: "10 Rue de la République, 75003 Paris, France", + status: Status.FULFILLED, + delivery_person_id: "random_id", + restaurant_id: "restaurant_id:1", + user_id: "user_id:1", + }; + client.UpdateDelivery(data, (err: any, response: any) => { + if (err) log.debug(err); + log.debug(response); + }); +} + +main(); diff --git a/services/delivery/src/handlers/delivery.ts b/services/delivery/src/handlers/delivery/create.ts similarity index 61% rename from services/delivery/src/handlers/delivery.ts rename to services/delivery/src/handlers/delivery/create.ts index c6f070af..1ad90069 100644 --- a/services/delivery/src/handlers/delivery.ts +++ b/services/delivery/src/handlers/delivery/create.ts @@ -1,23 +1,15 @@ import { prisma } from "@delivery/lib/prisma"; import { log } from "@delivery/lib/log"; -import { Status } from "@prisma/client"; - -type DeliveryCreateInput = { - eta: string; - address: string; - status: Status; - delivery_person_id: string; -}; +import { Data, DeliveryCreateInput } from "@delivery/types/delivery"; export const CreateDelivery = async ( - data: any, + { request }: Data, callback: (err: any, response: any) => void ) => { - log.debug("request received at CreateDelivery handler\n", data.request); + log.debug("request received at CreateDelivery handler\n", request); try { - const { request } = data; - const { eta, address, status, delivery_person_id } = - request as DeliveryCreateInput; + const { eta, address, status, delivery_person_id, restaurant_id, user_id } = + request; const delivery = await prisma.delivery.create({ data: { @@ -29,6 +21,8 @@ export const CreateDelivery = async ( id: delivery_person_id, }, }, + restaurant_id, + user_id, }, include: { person: true, diff --git a/services/delivery/src/handlers/delivery/delete.ts b/services/delivery/src/handlers/delivery/delete.ts new file mode 100644 index 00000000..cdeee90b --- /dev/null +++ b/services/delivery/src/handlers/delivery/delete.ts @@ -0,0 +1,20 @@ +import { prisma } from "@delivery/lib/prisma"; +import { log } from "@delivery/lib/log"; +import { Data, DeliveryId } from "@delivery/types/delivery"; + +export const DeleteDelivery = async ( + data: Data, + callback: (err: any, response: any) => void +) => { + log.debug("request received at DeleteDelivery handler\n", data.request); + try { + const { request } = data; + const { id } = request; + + const delivery = await prisma.delivery.delete({ where: { id } }); + callback(null, delivery); + } catch (error) { + log.error(error); + callback(error, null); + } +}; diff --git a/services/delivery/src/handlers/delivery/get.ts b/services/delivery/src/handlers/delivery/get.ts new file mode 100644 index 00000000..cde931dd --- /dev/null +++ b/services/delivery/src/handlers/delivery/get.ts @@ -0,0 +1,23 @@ +import { prisma } from "@delivery/lib/prisma"; +import { log } from "@delivery/lib/log"; +import { Data, DeliveryId } from "@delivery/types/delivery"; + +export const GetDelivery = async ( + data: Data, + callback: (err: any, response: any) => void +) => { + log.debug("request received at GetDelivery handler\n", data.request); + try { + const { request } = data; + const { id } = request; + + const delivery = await prisma.delivery.findFirstOrThrow({ + where: { id }, + include: { person: true }, + }); + callback(null, delivery); + } catch (error) { + log.error(error); + callback(error, null); + } +}; diff --git a/services/delivery/src/handlers/delivery/index.ts b/services/delivery/src/handlers/delivery/index.ts new file mode 100644 index 00000000..eb1b93b8 --- /dev/null +++ b/services/delivery/src/handlers/delivery/index.ts @@ -0,0 +1,15 @@ +import { CreateDelivery } from "@delivery/handlers/delivery/create"; +import { GetDelivery } from "@delivery/handlers/delivery/get"; +import { UpdateDelivery } from "@delivery/handlers/delivery/update"; +import { DeleteDelivery } from "@delivery/handlers/delivery/delete"; +import { ListDeliveriesByUser } from "@delivery/handlers/delivery/list-by-user"; +import { ListDeliveriesByRestaurant } from "@delivery/handlers/delivery/list-by-restaurant"; + +export default { + CreateDelivery, + GetDelivery, + UpdateDelivery, + DeleteDelivery, + ListDeliveriesByUser, + ListDeliveriesByRestaurant, +}; diff --git a/services/delivery/src/handlers/delivery/list-by-restaurant.ts b/services/delivery/src/handlers/delivery/list-by-restaurant.ts new file mode 100644 index 00000000..ecfa3991 --- /dev/null +++ b/services/delivery/src/handlers/delivery/list-by-restaurant.ts @@ -0,0 +1,30 @@ +import { prisma } from "@delivery/lib/prisma"; +import { log } from "@delivery/lib/log"; +import { RestaurantId, Delivery } from "@delivery/types/delivery"; +import { ServerWritableStream } from "@grpc/grpc-js"; + +export const ListDeliveriesByRestaurant = async ( + call: ServerWritableStream +) => { + log.debug( + "request received at ListDeliveriesByRestaurant handler\n", + call.request + ); + try { + const { id } = call.request; + + const deliveries = await prisma.delivery.findMany({ + where: { restaurant_id: id }, + include: { person: true }, + }); + + for (const delivery of deliveries) { + call.write(delivery); + } + call.end(); + } catch (error) { + log.error(error); + + call.end(); + } +}; diff --git a/services/delivery/src/handlers/delivery/list-by-user.ts b/services/delivery/src/handlers/delivery/list-by-user.ts new file mode 100644 index 00000000..2bdb406c --- /dev/null +++ b/services/delivery/src/handlers/delivery/list-by-user.ts @@ -0,0 +1,27 @@ +import { prisma } from "@delivery/lib/prisma"; +import { log } from "@delivery/lib/log"; +import { Delivery, UserId } from "@delivery/types/delivery"; +import { ServerWritableStream } from "@grpc/grpc-js"; + +export const ListDeliveriesByUser = async ( + call: ServerWritableStream +) => { + log.debug("request received at ListDeliveriesByUser handler\n", call.request); + try { + const { id } = call.request; + + const deliveries = await prisma.delivery.findMany({ + where: { user_id: id }, + include: { person: true }, + }); + + for (const delivery of deliveries) { + call.write(delivery); + } + call.end(); + } catch (error) { + log.error(error); + + call.end(); + } +}; diff --git a/services/delivery/src/handlers/delivery/update.ts b/services/delivery/src/handlers/delivery/update.ts new file mode 100644 index 00000000..d08d2bd2 --- /dev/null +++ b/services/delivery/src/handlers/delivery/update.ts @@ -0,0 +1,34 @@ +import { prisma } from "@delivery/lib/prisma"; +import { log } from "@delivery/lib/log"; +import { Data, Delivery } from "@delivery/types/delivery"; + +export const UpdateDelivery = async ( + data: Data, + callback: (err: any, response: any) => void +) => { + log.debug("request received at UpdateDelivery handler\n", data.request); + try { + const { eta, address, status, delivery_person_id, id } = data.request; + + const delivery = await prisma.delivery.update({ + where: { id }, + data: { + eta: new Date(eta), + address, + status, + person: { + connect: { + id: delivery_person_id, + }, + }, + }, + include: { + person: true, + }, + }); + callback(null, delivery); + } catch (error) { + log.error(error); + callback(error, null); + } +}; diff --git a/services/delivery/src/server.ts b/services/delivery/src/server.ts index 16a27d70..2eac6c38 100644 --- a/services/delivery/src/server.ts +++ b/services/delivery/src/server.ts @@ -7,7 +7,7 @@ import { log, utils } from "@delivery/lib/log"; import { options } from "@delivery/resources/protoloader-options"; import { serverInsecure } from "@delivery/resources/grpc-credentials"; -import { CreateDelivery } from "@delivery/handlers/delivery"; +import deliveryHandlers from "@delivery/handlers/delivery"; const PORT = process.env.PORT || 50008; const ADDRESS = `0.0.0.0:${PORT}`; @@ -17,16 +17,8 @@ const packageDefinition = loadSync(PROTO_PATH, options); const { delivery } = loadPackageDefinition(packageDefinition) as any; // todo: fix any const server = new Server(); -server.addService(delivery.DeliveryService.service, { - // handlers - // todo: add handlers - CreateDelivery, -}); - -server.addService(delivery.DeliveryPersonService.service, { - // handlers - // todo: add handlers -}); +server.addService(delivery.DeliveryService.service, deliveryHandlers); +server.addService(delivery.DeliveryPersonService.service, {}); server.bindAsync(ADDRESS, serverInsecure, () => { server.start(); diff --git a/services/delivery/src/types/delivery-person.d.ts b/services/delivery/src/types/delivery-person.d.ts new file mode 100644 index 00000000..a897860e --- /dev/null +++ b/services/delivery/src/types/delivery-person.d.ts @@ -0,0 +1,11 @@ +import { Delivery } from "@delivery/types/delivery"; + +export type DeliveryPerson = { + id: string; + first_name: string; + last_name: string; + phone: string; + location: [number, number]; + + deliveries: Delivery[]; +}; diff --git a/services/delivery/src/types/delivery.d.ts b/services/delivery/src/types/delivery.d.ts new file mode 100644 index 00000000..333462d6 --- /dev/null +++ b/services/delivery/src/types/delivery.d.ts @@ -0,0 +1,49 @@ +import { DeliveryPerson } from "@delivery/types/delivery-person"; +import { Status } from "@prisma/client"; + +export type Data = { + request: T; +}; + +export type Stream = { + write: (data: any) => void; + end: () => void; + request: T; +}; + +export type DeliveryCreateInput = { + eta: string; + address: string; + + status: Status; + delivery_person_id: string; + + user_id: string; + restaurant_id: string; +}; + +export type DeliveryId = { + id: string; +}; + +export type Delivery = { + id: string; + eta: string; + + address: string; + status: Status; + + person: DeliveryPerson; + delivery_person_id: string; + + user_id: string; + restaurant_id: string; +}; + +export type UserId = { + id: string; +}; + +export type RestaurantId = { + id: string; +}; diff --git a/services/delivery/types/delivery.d.ts b/services/delivery/types/delivery.d.ts deleted file mode 100644 index 52fc3159..00000000 --- a/services/delivery/types/delivery.d.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { Status } from "@prisma/client"; - -export type DeliveryCreateInput = { - eta: { - seconds: number; - nano: number; - }; - address: string; - status: Status; - delivery_person_id: string; -}; diff --git a/services/proto/delivery.proto b/services/proto/delivery.proto index b306d511..e20e1e97 100644 --- a/services/proto/delivery.proto +++ b/services/proto/delivery.proto @@ -12,6 +12,9 @@ message Delivery { DeliveryPerson person = 5; string delivery_person_id = 6; + + string user_id = 7; + string restaurant_id = 8; } message DeliveryPerson { @@ -59,6 +62,9 @@ message DeliveryCreateInput { string address = 2; Status status = 3; string delivery_person_id = 4; + + string user_id = 5; + string restaurant_id = 6; } message UserId { From 3d924f7b1cd4404fb084c65e1bbdb8feeb6028b1 Mon Sep 17 00:00:00 2001 From: Florian LEROUX <10078837+floriaaan@users.noreply.github.com> Date: Sat, 1 Apr 2023 14:20:43 +0200 Subject: [PATCH 015/883] ref(proto): change stream to repeated --- .../src/client/delivery/list-by-restaurant.ts | 19 ++++-------------- .../src/client/delivery/list-by-user.ts | 19 ++++-------------- .../handlers/delivery/list-by-restaurant.ts | 20 ++++++++----------- .../src/handlers/delivery/list-by-user.ts | 20 ++++++++----------- services/proto/delivery.proto | 16 +++++++++++---- 5 files changed, 36 insertions(+), 58 deletions(-) diff --git a/services/delivery/src/client/delivery/list-by-restaurant.ts b/services/delivery/src/client/delivery/list-by-restaurant.ts index 0e7157a5..a3dd55d9 100644 --- a/services/delivery/src/client/delivery/list-by-restaurant.ts +++ b/services/delivery/src/client/delivery/list-by-restaurant.ts @@ -5,7 +5,6 @@ import { loadPackageDefinition } from "@grpc/grpc-js"; import { options } from "@delivery/resources/protoloader-options"; import { insecure } from "@delivery/resources/grpc-credentials"; import { log } from "@delivery/lib/log"; -import { Delivery } from "@delivery/types/delivery"; const PORT = process.env.PORT || 50008; const ADDRESS = `localhost:${PORT}`; @@ -18,21 +17,11 @@ function main() { const client = new delivery.DeliveryService(ADDRESS, insecure); const data = { - id: "restaurant_id:1", + id: "restaurant_id:1", // Change this to a valid delivery id }; - - const call = client.ListDeliveriesByRestaurant(data); - const deliveries: Delivery[] = []; - call.on("data", (delivery: Delivery) => { - log.debug(`Received delivery: ${delivery.id}`); - deliveries.push(delivery); - }); - call.on("end", () => { - console.log("All deliveries received."); - log.debug(deliveries); - }); - call.on("error", (error: Error) => { - log.debug("Error:", error.message); + client.ListDeliveriesByRestaurant(data, (err: any, response: any) => { + if (err) log.debug(err); + log.debug(response); }); } diff --git a/services/delivery/src/client/delivery/list-by-user.ts b/services/delivery/src/client/delivery/list-by-user.ts index b51c7f2b..1fbc9c48 100644 --- a/services/delivery/src/client/delivery/list-by-user.ts +++ b/services/delivery/src/client/delivery/list-by-user.ts @@ -5,7 +5,6 @@ import { loadPackageDefinition } from "@grpc/grpc-js"; import { options } from "@delivery/resources/protoloader-options"; import { insecure } from "@delivery/resources/grpc-credentials"; import { log } from "@delivery/lib/log"; -import { Delivery } from "@delivery/types/delivery"; const PORT = process.env.PORT || 50008; const ADDRESS = `localhost:${PORT}`; @@ -18,21 +17,11 @@ function main() { const client = new delivery.DeliveryService(ADDRESS, insecure); const data = { - id: "user_id:1", + id: "user_id:1", // Change this to a valid delivery id }; - - const call = client.ListDeliveriesByUser(data); - const deliveries: Delivery[] = []; - call.on("data", (delivery: Delivery) => { - log.debug(`Received delivery: ${delivery.id}`); - deliveries.push(delivery); - }); - call.on("end", () => { - console.log("All deliveries received."); - log.debug(deliveries); - }); - call.on("error", (error: Error) => { - log.debug("Error:", error.message); + client.ListDeliveriesByUser(data, (err: any, response: any) => { + if (err) log.debug(err); + log.debug(response); }); } diff --git a/services/delivery/src/handlers/delivery/list-by-restaurant.ts b/services/delivery/src/handlers/delivery/list-by-restaurant.ts index ecfa3991..879bb285 100644 --- a/services/delivery/src/handlers/delivery/list-by-restaurant.ts +++ b/services/delivery/src/handlers/delivery/list-by-restaurant.ts @@ -1,30 +1,26 @@ import { prisma } from "@delivery/lib/prisma"; import { log } from "@delivery/lib/log"; -import { RestaurantId, Delivery } from "@delivery/types/delivery"; -import { ServerWritableStream } from "@grpc/grpc-js"; +import { Data, RestaurantId } from "@delivery/types/delivery"; export const ListDeliveriesByRestaurant = async ( - call: ServerWritableStream + data: Data, + callback: (err: any, response: any) => void ) => { log.debug( "request received at ListDeliveriesByRestaurant handler\n", - call.request + data.request ); try { - const { id } = call.request; + const { request } = data; + const { id } = request; const deliveries = await prisma.delivery.findMany({ where: { restaurant_id: id }, include: { person: true }, }); - - for (const delivery of deliveries) { - call.write(delivery); - } - call.end(); + callback(null, { deliveries }); } catch (error) { log.error(error); - - call.end(); + callback(error, null); } }; diff --git a/services/delivery/src/handlers/delivery/list-by-user.ts b/services/delivery/src/handlers/delivery/list-by-user.ts index 2bdb406c..8c220175 100644 --- a/services/delivery/src/handlers/delivery/list-by-user.ts +++ b/services/delivery/src/handlers/delivery/list-by-user.ts @@ -1,27 +1,23 @@ import { prisma } from "@delivery/lib/prisma"; import { log } from "@delivery/lib/log"; -import { Delivery, UserId } from "@delivery/types/delivery"; -import { ServerWritableStream } from "@grpc/grpc-js"; +import { Data, UserId } from "@delivery/types/delivery"; export const ListDeliveriesByUser = async ( - call: ServerWritableStream + data: Data, + callback: (err: any, response: any) => void ) => { - log.debug("request received at ListDeliveriesByUser handler\n", call.request); + log.debug("request received at ListDeliveriesByUser handler\n", data.request); try { - const { id } = call.request; + const { request } = data; + const { id } = request; const deliveries = await prisma.delivery.findMany({ where: { user_id: id }, include: { person: true }, }); - - for (const delivery of deliveries) { - call.write(delivery); - } - call.end(); + callback(null, { deliveries }); } catch (error) { log.error(error); - - call.end(); + callback(error, null); } }; diff --git a/services/proto/delivery.proto b/services/proto/delivery.proto index e20e1e97..f4906434 100644 --- a/services/proto/delivery.proto +++ b/services/proto/delivery.proto @@ -39,8 +39,8 @@ service DeliveryService { rpc GetDelivery (DeliveryId) returns (Delivery) {} rpc UpdateDelivery (Delivery) returns (Delivery) {} rpc DeleteDelivery (DeliveryId) returns (google.protobuf.Empty) {} - rpc ListDeliveriesByUser (UserId) returns (stream Delivery) {} - rpc ListDeliveriesByRestaurant (RestaurantId) returns (stream Delivery) {} + rpc ListDeliveriesByUser (UserId) returns (DeliveryList) {} + rpc ListDeliveriesByRestaurant (RestaurantId) returns (DeliveryList) {} } @@ -49,8 +49,8 @@ service DeliveryPersonService { rpc GetDeliveryPerson (DeliveryPersonId) returns (DeliveryPerson) {} rpc UpdateDeliveryPerson (DeliveryPerson) returns (DeliveryPerson) {} rpc DeleteDeliveryPerson (DeliveryPersonId) returns (google.protobuf.Empty) {} - rpc ListDeliveryPersons (google.protobuf.Empty) returns (stream DeliveryPerson) {} - rpc ListNearDeliveryPersons (Location) returns (stream DeliveryPerson) {} + rpc ListDeliveryPersons (google.protobuf.Empty) returns (DeliveryPersonList) {} + rpc ListNearDeliveryPersons (Location) returns (DeliveryPersonList) {} } @@ -75,6 +75,14 @@ message RestaurantId { string id = 1; } +message DeliveryList { + repeated Delivery deliveries = 1; +} + +message DeliveryPersonList { + repeated DeliveryPersonList persons = 1; +} + message DeliveryPersonId { string id = 1; } From 50718ed5e4a2c0921e43df117958078bad299a02 Mon Sep 17 00:00:00 2001 From: Florian LEROUX <10078837+floriaaan@users.noreply.github.com> Date: Tue, 4 Apr 2023 10:07:20 +0200 Subject: [PATCH 016/883] ci: add test/coverage scripts and update README --- .github/workflows/delivery.yml | 68 + .github/workflows/{tests.yml => global.yml} | 15 +- README.md | 1 + services/delivery/README.md | 2 +- services/delivery/coverage/base.css | 224 ++ .../delivery/coverage/block-navigation.js | 87 + services/delivery/coverage/clover.xml | 6 + .../delivery/coverage/coverage-final.json | 1 + services/delivery/coverage/favicon.png | Bin 0 -> 445 bytes services/delivery/coverage/index.html | 101 + services/delivery/coverage/prettify.css | 1 + services/delivery/coverage/prettify.js | 2 + .../delivery/coverage/sort-arrow-sprite.png | Bin 0 -> 138 bytes services/delivery/coverage/sorter.js | 196 ++ services/delivery/package.json | 31 +- services/delivery/pnpm-lock.yaml | 1852 +++++++++++++++-- services/delivery/proto | 1 + services/delivery/src/tests/test.test.ts | 6 + services/delivery/vitest.config.ts | 7 + 19 files changed, 2451 insertions(+), 150 deletions(-) create mode 100644 .github/workflows/delivery.yml rename .github/workflows/{tests.yml => global.yml} (75%) create mode 100644 services/delivery/coverage/base.css create mode 100644 services/delivery/coverage/block-navigation.js create mode 100644 services/delivery/coverage/clover.xml create mode 100644 services/delivery/coverage/coverage-final.json create mode 100644 services/delivery/coverage/favicon.png create mode 100644 services/delivery/coverage/index.html create mode 100644 services/delivery/coverage/prettify.css create mode 100644 services/delivery/coverage/prettify.js create mode 100644 services/delivery/coverage/sort-arrow-sprite.png create mode 100644 services/delivery/coverage/sorter.js create mode 120000 services/delivery/proto create mode 100644 services/delivery/src/tests/test.test.ts create mode 100644 services/delivery/vitest.config.ts diff --git a/.github/workflows/delivery.yml b/.github/workflows/delivery.yml new file mode 100644 index 00000000..a0953866 --- /dev/null +++ b/.github/workflows/delivery.yml @@ -0,0 +1,68 @@ +name: Delivery Microservice CI/CD + +on: + push: + branches: [delivery] + pull_request: + branches: [dev, main] + +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@master + - uses: pnpm/action-setup@v2 + with: + version: 7 + - uses: actions/setup-node@v3 + with: + node-version: "18.x" + cache: "pnpm" + - name: Install dependencies + run: | + cd ./services/delivery + pnpm install --frozen-lockfile + - name: Build + run: | + cd ./services/delivery + pnpm build + + test: + runs-on: ubuntu-latest + needs: build + steps: + - uses: actions/checkout@master + - uses: pnpm/action-setup@v2 + with: + version: 7 + - uses: actions/setup-node@v3 + with: + node-version: "18.x" + cache: "pnpm" + - name: Install dependencies + run: | + cd ./services/delivery + pnpm install --frozen-lockfile + - name: Execute tests + run: | + cd ./services/delivery + pnpm test + + publish: + runs-on: ubuntu-latest + needs: [build, test] + if: ${{ success() }} && ${{ github.ref == 'refs/heads/dev' || github.ref == 'refs/heads/main' }} + steps: + - name: Checkout code + uses: actions/checkout@v2 + - name: Login to Docker Hub + uses: docker/login-action@v1 + with: + username: ${{ secrets.DOCKER_USERNAME }} + password: ${{ secrets.DOCKER_PASSWORD }} + - name: Build and push Docker image + uses: docker/build-push-action@v2 + with: + context: ./services/delivery + push: true + tags: floriaaan/goodfood-delivery:latest diff --git a/.github/workflows/tests.yml b/.github/workflows/global.yml similarity index 75% rename from .github/workflows/tests.yml rename to .github/workflows/global.yml index c83c0a05..5d458b6b 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/global.yml @@ -1,13 +1,18 @@ # This workflow will do a clean installation of node dependencies, cache/restore them, build the source code and run tests across different versions of node # For more information see: https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions -name: "Tests" +name: "Tests all microservices" on: - - push - - pull_request - - workflow_dispatch - + push: + branches: + - main + - dev + pull_request: + branches: + - main + - dev + workflow_dispatch: jobs: tests: diff --git a/README.md b/README.md index 4bf6e30e..7b51feee 100644 --- a/README.md +++ b/README.md @@ -46,6 +46,7 @@ The file hierarchy for this project is as follows: ├── gateway/ │ ├── k8s/ │ │ └── (...) # k8s files + │ ├── proto/ (symbolic link to /services/proto/) │ └── terraform/ │ └── (...) # terraform files ├── user/ diff --git a/services/delivery/README.md b/services/delivery/README.md index 7f125245..69965be6 100644 --- a/services/delivery/README.md +++ b/services/delivery/README.md @@ -5,7 +5,7 @@ | **Port:** 50008 | | **Developer:** @floriaaan | | **Status:** In progress | -| **Last update:** 2023-03-31 | +| **Last update:** 2023-04-04 | | **Language:** NodeJS | | **Dependencies:** TypeScript, Prisma, gRPC, Postgres | | **Models:** (see [`prisma/schema.prisma`](./prisma/schema.prisma)) | diff --git a/services/delivery/coverage/base.css b/services/delivery/coverage/base.css new file mode 100644 index 00000000..f418035b --- /dev/null +++ b/services/delivery/coverage/base.css @@ -0,0 +1,224 @@ +body, html { + margin:0; padding: 0; + height: 100%; +} +body { + font-family: Helvetica Neue, Helvetica, Arial; + font-size: 14px; + color:#333; +} +.small { font-size: 12px; } +*, *:after, *:before { + -webkit-box-sizing:border-box; + -moz-box-sizing:border-box; + box-sizing:border-box; + } +h1 { font-size: 20px; margin: 0;} +h2 { font-size: 14px; } +pre { + font: 12px/1.4 Consolas, "Liberation Mono", Menlo, Courier, monospace; + margin: 0; + padding: 0; + -moz-tab-size: 2; + -o-tab-size: 2; + tab-size: 2; +} +a { color:#0074D9; text-decoration:none; } +a:hover { text-decoration:underline; } +.strong { font-weight: bold; } +.space-top1 { padding: 10px 0 0 0; } +.pad2y { padding: 20px 0; } +.pad1y { padding: 10px 0; } +.pad2x { padding: 0 20px; } +.pad2 { padding: 20px; } +.pad1 { padding: 10px; } +.space-left2 { padding-left:55px; } +.space-right2 { padding-right:20px; } +.center { text-align:center; } +.clearfix { display:block; } +.clearfix:after { + content:''; + display:block; + height:0; + clear:both; + visibility:hidden; + } +.fl { float: left; } +@media only screen and (max-width:640px) { + .col3 { width:100%; max-width:100%; } + .hide-mobile { display:none!important; } +} + +.quiet { + color: #7f7f7f; + color: rgba(0,0,0,0.5); +} +.quiet a { opacity: 0.7; } + +.fraction { + font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; + font-size: 10px; + color: #555; + background: #E8E8E8; + padding: 4px 5px; + border-radius: 3px; + vertical-align: middle; +} + +div.path a:link, div.path a:visited { color: #333; } +table.coverage { + border-collapse: collapse; + margin: 10px 0 0 0; + padding: 0; +} + +table.coverage td { + margin: 0; + padding: 0; + vertical-align: top; +} +table.coverage td.line-count { + text-align: right; + padding: 0 5px 0 20px; +} +table.coverage td.line-coverage { + text-align: right; + padding-right: 10px; + min-width:20px; +} + +table.coverage td span.cline-any { + display: inline-block; + padding: 0 5px; + width: 100%; +} +.missing-if-branch { + display: inline-block; + margin-right: 5px; + border-radius: 3px; + position: relative; + padding: 0 4px; + background: #333; + color: yellow; +} + +.skip-if-branch { + display: none; + margin-right: 10px; + position: relative; + padding: 0 4px; + background: #ccc; + color: white; +} +.missing-if-branch .typ, .skip-if-branch .typ { + color: inherit !important; +} +.coverage-summary { + border-collapse: collapse; + width: 100%; +} +.coverage-summary tr { border-bottom: 1px solid #bbb; } +.keyline-all { border: 1px solid #ddd; } +.coverage-summary td, .coverage-summary th { padding: 10px; } +.coverage-summary tbody { border: 1px solid #bbb; } +.coverage-summary td { border-right: 1px solid #bbb; } +.coverage-summary td:last-child { border-right: none; } +.coverage-summary th { + text-align: left; + font-weight: normal; + white-space: nowrap; +} +.coverage-summary th.file { border-right: none !important; } +.coverage-summary th.pct { } +.coverage-summary th.pic, +.coverage-summary th.abs, +.coverage-summary td.pct, +.coverage-summary td.abs { text-align: right; } +.coverage-summary td.file { white-space: nowrap; } +.coverage-summary td.pic { min-width: 120px !important; } +.coverage-summary tfoot td { } + +.coverage-summary .sorter { + height: 10px; + width: 7px; + display: inline-block; + margin-left: 0.5em; + background: url(sort-arrow-sprite.png) no-repeat scroll 0 0 transparent; +} +.coverage-summary .sorted .sorter { + background-position: 0 -20px; +} +.coverage-summary .sorted-desc .sorter { + background-position: 0 -10px; +} +.status-line { height: 10px; } +/* yellow */ +.cbranch-no { background: yellow !important; color: #111; } +/* dark red */ +.red.solid, .status-line.low, .low .cover-fill { background:#C21F39 } +.low .chart { border:1px solid #C21F39 } +.highlighted, +.highlighted .cstat-no, .highlighted .fstat-no, .highlighted .cbranch-no{ + background: #C21F39 !important; +} +/* medium red */ +.cstat-no, .fstat-no, .cbranch-no, .cbranch-no { background:#F6C6CE } +/* light red */ +.low, .cline-no { background:#FCE1E5 } +/* light green */ +.high, .cline-yes { background:rgb(230,245,208) } +/* medium green */ +.cstat-yes { background:rgb(161,215,106) } +/* dark green */ +.status-line.high, .high .cover-fill { background:rgb(77,146,33) } +.high .chart { border:1px solid rgb(77,146,33) } +/* dark yellow (gold) */ +.status-line.medium, .medium .cover-fill { background: #f9cd0b; } +.medium .chart { border:1px solid #f9cd0b; } +/* light yellow */ +.medium { background: #fff4c2; } + +.cstat-skip { background: #ddd; color: #111; } +.fstat-skip { background: #ddd; color: #111 !important; } +.cbranch-skip { background: #ddd !important; color: #111; } + +span.cline-neutral { background: #eaeaea; } + +.coverage-summary td.empty { + opacity: .5; + padding-top: 4px; + padding-bottom: 4px; + line-height: 1; + color: #888; +} + +.cover-fill, .cover-empty { + display:inline-block; + height: 12px; +} +.chart { + line-height: 0; +} +.cover-empty { + background: white; +} +.cover-full { + border-right: none !important; +} +pre.prettyprint { + border: none !important; + padding: 0 !important; + margin: 0 !important; +} +.com { color: #999 !important; } +.ignore-none { color: #999; font-weight: normal; } + +.wrapper { + min-height: 100%; + height: auto !important; + height: 100%; + margin: 0 auto -48px; +} +.footer, .push { + height: 48px; +} diff --git a/services/delivery/coverage/block-navigation.js b/services/delivery/coverage/block-navigation.js new file mode 100644 index 00000000..cc121302 --- /dev/null +++ b/services/delivery/coverage/block-navigation.js @@ -0,0 +1,87 @@ +/* eslint-disable */ +var jumpToCode = (function init() { + // Classes of code we would like to highlight in the file view + var missingCoverageClasses = ['.cbranch-no', '.cstat-no', '.fstat-no']; + + // Elements to highlight in the file listing view + var fileListingElements = ['td.pct.low']; + + // We don't want to select elements that are direct descendants of another match + var notSelector = ':not(' + missingCoverageClasses.join('):not(') + ') > '; // becomes `:not(a):not(b) > ` + + // Selecter that finds elements on the page to which we can jump + var selector = + fileListingElements.join(', ') + + ', ' + + notSelector + + missingCoverageClasses.join(', ' + notSelector); // becomes `:not(a):not(b) > a, :not(a):not(b) > b` + + // The NodeList of matching elements + var missingCoverageElements = document.querySelectorAll(selector); + + var currentIndex; + + function toggleClass(index) { + missingCoverageElements + .item(currentIndex) + .classList.remove('highlighted'); + missingCoverageElements.item(index).classList.add('highlighted'); + } + + function makeCurrent(index) { + toggleClass(index); + currentIndex = index; + missingCoverageElements.item(index).scrollIntoView({ + behavior: 'smooth', + block: 'center', + inline: 'center' + }); + } + + function goToPrevious() { + var nextIndex = 0; + if (typeof currentIndex !== 'number' || currentIndex === 0) { + nextIndex = missingCoverageElements.length - 1; + } else if (missingCoverageElements.length > 1) { + nextIndex = currentIndex - 1; + } + + makeCurrent(nextIndex); + } + + function goToNext() { + var nextIndex = 0; + + if ( + typeof currentIndex === 'number' && + currentIndex < missingCoverageElements.length - 1 + ) { + nextIndex = currentIndex + 1; + } + + makeCurrent(nextIndex); + } + + return function jump(event) { + if ( + document.getElementById('fileSearch') === document.activeElement && + document.activeElement != null + ) { + // if we're currently focused on the search input, we don't want to navigate + return; + } + + switch (event.which) { + case 78: // n + case 74: // j + goToNext(); + break; + case 66: // b + case 75: // k + case 80: // p + goToPrevious(); + break; + } + }; +})(); +window.addEventListener('keydown', jumpToCode); diff --git a/services/delivery/coverage/clover.xml b/services/delivery/coverage/clover.xml new file mode 100644 index 00000000..c1774655 --- /dev/null +++ b/services/delivery/coverage/clover.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/services/delivery/coverage/coverage-final.json b/services/delivery/coverage/coverage-final.json new file mode 100644 index 00000000..0967ef42 --- /dev/null +++ b/services/delivery/coverage/coverage-final.json @@ -0,0 +1 @@ +{} diff --git a/services/delivery/coverage/favicon.png b/services/delivery/coverage/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..c1525b811a167671e9de1fa78aab9f5c0b61cef7 GIT binary patch literal 445 zcmV;u0Yd(XP))rP{nL}Ln%S7`m{0DjX9TLF* zFCb$4Oi7vyLOydb!7n&^ItCzb-%BoB`=x@N2jll2Nj`kauio%aw_@fe&*}LqlFT43 z8doAAe))z_%=P%v^@JHp3Hjhj^6*Kr_h|g_Gr?ZAa&y>wxHE99Gk>A)2MplWz2xdG zy8VD2J|Uf#EAw*bo5O*PO_}X2Tob{%bUoO2G~T`@%S6qPyc}VkhV}UifBuRk>%5v( z)x7B{I~z*k<7dv#5tC+m{km(D087J4O%+<<;K|qwefb6@GSX45wCK}Sn*> + + + + Code coverage report for All files + + + + + + + + + +
+
+

All files

+
+ +
+ Unknown% + Statements + 0/0 +
+ + +
+ Unknown% + Branches + 0/0 +
+ + +
+ Unknown% + Functions + 0/0 +
+ + +
+ Unknown% + Lines + 0/0 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/services/delivery/coverage/prettify.css b/services/delivery/coverage/prettify.css new file mode 100644 index 00000000..b317a7cd --- /dev/null +++ b/services/delivery/coverage/prettify.css @@ -0,0 +1 @@ +.pln{color:#000}@media screen{.str{color:#080}.kwd{color:#008}.com{color:#800}.typ{color:#606}.lit{color:#066}.pun,.opn,.clo{color:#660}.tag{color:#008}.atn{color:#606}.atv{color:#080}.dec,.var{color:#606}.fun{color:red}}@media print,projection{.str{color:#060}.kwd{color:#006;font-weight:bold}.com{color:#600;font-style:italic}.typ{color:#404;font-weight:bold}.lit{color:#044}.pun,.opn,.clo{color:#440}.tag{color:#006;font-weight:bold}.atn{color:#404}.atv{color:#060}}pre.prettyprint{padding:2px;border:1px solid #888}ol.linenums{margin-top:0;margin-bottom:0}li.L0,li.L1,li.L2,li.L3,li.L5,li.L6,li.L7,li.L8{list-style-type:none}li.L1,li.L3,li.L5,li.L7,li.L9{background:#eee} diff --git a/services/delivery/coverage/prettify.js b/services/delivery/coverage/prettify.js new file mode 100644 index 00000000..b3225238 --- /dev/null +++ b/services/delivery/coverage/prettify.js @@ -0,0 +1,2 @@ +/* eslint-disable */ +window.PR_SHOULD_USE_CONTINUATION=true;(function(){var h=["break,continue,do,else,for,if,return,while"];var u=[h,"auto,case,char,const,default,double,enum,extern,float,goto,int,long,register,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile"];var p=[u,"catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof"];var l=[p,"alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,dynamic_cast,explicit,export,friend,inline,late_check,mutable,namespace,nullptr,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where"];var x=[p,"abstract,boolean,byte,extends,final,finally,implements,import,instanceof,null,native,package,strictfp,super,synchronized,throws,transient"];var R=[x,"as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,interface,internal,into,is,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var"];var r="all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,true,try,unless,until,when,while,yes";var w=[p,"debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN"];var s="caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END";var I=[h,"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None"];var f=[h,"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END"];var H=[h,"case,done,elif,esac,eval,fi,function,in,local,set,then,until"];var A=[l,R,w,s+I,f,H];var e=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\d*)/;var C="str";var z="kwd";var j="com";var O="typ";var G="lit";var L="pun";var F="pln";var m="tag";var E="dec";var J="src";var P="atn";var n="atv";var N="nocode";var M="(?:^^\\.?|[+-]|\\!|\\!=|\\!==|\\#|\\%|\\%=|&|&&|&&=|&=|\\(|\\*|\\*=|\\+=|\\,|\\-=|\\->|\\/|\\/=|:|::|\\;|<|<<|<<=|<=|=|==|===|>|>=|>>|>>=|>>>|>>>=|\\?|\\@|\\[|\\^|\\^=|\\^\\^|\\^\\^=|\\{|\\||\\|=|\\|\\||\\|\\|=|\\~|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\\s*";function k(Z){var ad=0;var S=false;var ac=false;for(var V=0,U=Z.length;V122)){if(!(al<65||ag>90)){af.push([Math.max(65,ag)|32,Math.min(al,90)|32])}if(!(al<97||ag>122)){af.push([Math.max(97,ag)&~32,Math.min(al,122)&~32])}}}}af.sort(function(av,au){return(av[0]-au[0])||(au[1]-av[1])});var ai=[];var ap=[NaN,NaN];for(var ar=0;arat[0]){if(at[1]+1>at[0]){an.push("-")}an.push(T(at[1]))}}an.push("]");return an.join("")}function W(al){var aj=al.source.match(new RegExp("(?:\\[(?:[^\\x5C\\x5D]|\\\\[\\s\\S])*\\]|\\\\u[A-Fa-f0-9]{4}|\\\\x[A-Fa-f0-9]{2}|\\\\[0-9]+|\\\\[^ux0-9]|\\(\\?[:!=]|[\\(\\)\\^]|[^\\x5B\\x5C\\(\\)\\^]+)","g"));var ah=aj.length;var an=[];for(var ak=0,am=0;ak=2&&ai==="["){aj[ak]=X(ag)}else{if(ai!=="\\"){aj[ak]=ag.replace(/[a-zA-Z]/g,function(ao){var ap=ao.charCodeAt(0);return"["+String.fromCharCode(ap&~32,ap|32)+"]"})}}}}return aj.join("")}var aa=[];for(var V=0,U=Z.length;V=0;){S[ac.charAt(ae)]=Y}}var af=Y[1];var aa=""+af;if(!ag.hasOwnProperty(aa)){ah.push(af);ag[aa]=null}}ah.push(/[\0-\uffff]/);V=k(ah)})();var X=T.length;var W=function(ah){var Z=ah.sourceCode,Y=ah.basePos;var ad=[Y,F];var af=0;var an=Z.match(V)||[];var aj={};for(var ae=0,aq=an.length;ae=5&&"lang-"===ap.substring(0,5);if(am&&!(ai&&typeof ai[1]==="string")){am=false;ap=J}if(!am){aj[ag]=ap}}var ab=af;af+=ag.length;if(!am){ad.push(Y+ab,ap)}else{var al=ai[1];var ak=ag.indexOf(al);var ac=ak+al.length;if(ai[2]){ac=ag.length-ai[2].length;ak=ac-al.length}var ar=ap.substring(5);B(Y+ab,ag.substring(0,ak),W,ad);B(Y+ab+ak,al,q(ar,al),ad);B(Y+ab+ac,ag.substring(ac),W,ad)}}ah.decorations=ad};return W}function i(T){var W=[],S=[];if(T.tripleQuotedStrings){W.push([C,/^(?:\'\'\'(?:[^\'\\]|\\[\s\S]|\'{1,2}(?=[^\']))*(?:\'\'\'|$)|\"\"\"(?:[^\"\\]|\\[\s\S]|\"{1,2}(?=[^\"]))*(?:\"\"\"|$)|\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$))/,null,"'\""])}else{if(T.multiLineStrings){W.push([C,/^(?:\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$)|\`(?:[^\\\`]|\\[\s\S])*(?:\`|$))/,null,"'\"`"])}else{W.push([C,/^(?:\'(?:[^\\\'\r\n]|\\.)*(?:\'|$)|\"(?:[^\\\"\r\n]|\\.)*(?:\"|$))/,null,"\"'"])}}if(T.verbatimStrings){S.push([C,/^@\"(?:[^\"]|\"\")*(?:\"|$)/,null])}var Y=T.hashComments;if(Y){if(T.cStyleComments){if(Y>1){W.push([j,/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,null,"#"])}else{W.push([j,/^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\b|[^\r\n]*)/,null,"#"])}S.push([C,/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h|[a-z]\w*)>/,null])}else{W.push([j,/^#[^\r\n]*/,null,"#"])}}if(T.cStyleComments){S.push([j,/^\/\/[^\r\n]*/,null]);S.push([j,/^\/\*[\s\S]*?(?:\*\/|$)/,null])}if(T.regexLiterals){var X=("/(?=[^/*])(?:[^/\\x5B\\x5C]|\\x5C[\\s\\S]|\\x5B(?:[^\\x5C\\x5D]|\\x5C[\\s\\S])*(?:\\x5D|$))+/");S.push(["lang-regex",new RegExp("^"+M+"("+X+")")])}var V=T.types;if(V){S.push([O,V])}var U=(""+T.keywords).replace(/^ | $/g,"");if(U.length){S.push([z,new RegExp("^(?:"+U.replace(/[\s,]+/g,"|")+")\\b"),null])}W.push([F,/^\s+/,null," \r\n\t\xA0"]);S.push([G,/^@[a-z_$][a-z_$@0-9]*/i,null],[O,/^(?:[@_]?[A-Z]+[a-z][A-Za-z_$@0-9]*|\w+_t\b)/,null],[F,/^[a-z_$][a-z_$@0-9]*/i,null],[G,new RegExp("^(?:0x[a-f0-9]+|(?:\\d(?:_\\d+)*\\d*(?:\\.\\d*)?|\\.\\d\\+)(?:e[+\\-]?\\d+)?)[a-z]*","i"),null,"0123456789"],[F,/^\\[\s\S]?/,null],[L,/^.[^\s\w\.$@\'\"\`\/\#\\]*/,null]);return g(W,S)}var K=i({keywords:A,hashComments:true,cStyleComments:true,multiLineStrings:true,regexLiterals:true});function Q(V,ag){var U=/(?:^|\s)nocode(?:\s|$)/;var ab=/\r\n?|\n/;var ac=V.ownerDocument;var S;if(V.currentStyle){S=V.currentStyle.whiteSpace}else{if(window.getComputedStyle){S=ac.defaultView.getComputedStyle(V,null).getPropertyValue("white-space")}}var Z=S&&"pre"===S.substring(0,3);var af=ac.createElement("LI");while(V.firstChild){af.appendChild(V.firstChild)}var W=[af];function ae(al){switch(al.nodeType){case 1:if(U.test(al.className)){break}if("BR"===al.nodeName){ad(al);if(al.parentNode){al.parentNode.removeChild(al)}}else{for(var an=al.firstChild;an;an=an.nextSibling){ae(an)}}break;case 3:case 4:if(Z){var am=al.nodeValue;var aj=am.match(ab);if(aj){var ai=am.substring(0,aj.index);al.nodeValue=ai;var ah=am.substring(aj.index+aj[0].length);if(ah){var ak=al.parentNode;ak.insertBefore(ac.createTextNode(ah),al.nextSibling)}ad(al);if(!ai){al.parentNode.removeChild(al)}}}break}}function ad(ak){while(!ak.nextSibling){ak=ak.parentNode;if(!ak){return}}function ai(al,ar){var aq=ar?al.cloneNode(false):al;var ao=al.parentNode;if(ao){var ap=ai(ao,1);var an=al.nextSibling;ap.appendChild(aq);for(var am=an;am;am=an){an=am.nextSibling;ap.appendChild(am)}}return aq}var ah=ai(ak.nextSibling,0);for(var aj;(aj=ah.parentNode)&&aj.nodeType===1;){ah=aj}W.push(ah)}for(var Y=0;Y=S){ah+=2}if(V>=ap){Z+=2}}}var t={};function c(U,V){for(var S=V.length;--S>=0;){var T=V[S];if(!t.hasOwnProperty(T)){t[T]=U}else{if(window.console){console.warn("cannot override language handler %s",T)}}}}function q(T,S){if(!(T&&t.hasOwnProperty(T))){T=/^\s*]*(?:>|$)/],[j,/^<\!--[\s\S]*?(?:-\->|$)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],[L,/^(?:<[%?]|[%?]>)/],["lang-",/^]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-js",/^]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^]*>([\s\S]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i]]),["default-markup","htm","html","mxml","xhtml","xml","xsl"]);c(g([[F,/^[\s]+/,null," \t\r\n"],[n,/^(?:\"[^\"]*\"?|\'[^\']*\'?)/,null,"\"'"]],[[m,/^^<\/?[a-z](?:[\w.:-]*\w)?|\/?>$/i],[P,/^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],["lang-uq.val",/^=\s*([^>\'\"\s]*(?:[^>\'\"\s\/]|\/(?=\s)))/],[L,/^[=<>\/]+/],["lang-js",/^on\w+\s*=\s*\"([^\"]+)\"/i],["lang-js",/^on\w+\s*=\s*\'([^\']+)\'/i],["lang-js",/^on\w+\s*=\s*([^\"\'>\s]+)/i],["lang-css",/^style\s*=\s*\"([^\"]+)\"/i],["lang-css",/^style\s*=\s*\'([^\']+)\'/i],["lang-css",/^style\s*=\s*([^\"\'>\s]+)/i]]),["in.tag"]);c(g([],[[n,/^[\s\S]+/]]),["uq.val"]);c(i({keywords:l,hashComments:true,cStyleComments:true,types:e}),["c","cc","cpp","cxx","cyc","m"]);c(i({keywords:"null,true,false"}),["json"]);c(i({keywords:R,hashComments:true,cStyleComments:true,verbatimStrings:true,types:e}),["cs"]);c(i({keywords:x,cStyleComments:true}),["java"]);c(i({keywords:H,hashComments:true,multiLineStrings:true}),["bsh","csh","sh"]);c(i({keywords:I,hashComments:true,multiLineStrings:true,tripleQuotedStrings:true}),["cv","py"]);c(i({keywords:s,hashComments:true,multiLineStrings:true,regexLiterals:true}),["perl","pl","pm"]);c(i({keywords:f,hashComments:true,multiLineStrings:true,regexLiterals:true}),["rb"]);c(i({keywords:w,cStyleComments:true,regexLiterals:true}),["js"]);c(i({keywords:r,hashComments:3,cStyleComments:true,multilineStrings:true,tripleQuotedStrings:true,regexLiterals:true}),["coffee"]);c(g([],[[C,/^[\s\S]+/]]),["regex"]);function d(V){var U=V.langExtension;try{var S=a(V.sourceNode);var T=S.sourceCode;V.sourceCode=T;V.spans=S.spans;V.basePos=0;q(U,T)(V);D(V)}catch(W){if("console" in window){console.log(W&&W.stack?W.stack:W)}}}function y(W,V,U){var S=document.createElement("PRE");S.innerHTML=W;if(U){Q(S,U)}var T={langExtension:V,numberLines:U,sourceNode:S};d(T);return S.innerHTML}function b(ad){function Y(af){return document.getElementsByTagName(af)}var ac=[Y("pre"),Y("code"),Y("xmp")];var T=[];for(var aa=0;aa=0){var ah=ai.match(ab);var am;if(!ah&&(am=o(aj))&&"CODE"===am.tagName){ah=am.className.match(ab)}if(ah){ah=ah[1]}var al=false;for(var ak=aj.parentNode;ak;ak=ak.parentNode){if((ak.tagName==="pre"||ak.tagName==="code"||ak.tagName==="xmp")&&ak.className&&ak.className.indexOf("prettyprint")>=0){al=true;break}}if(!al){var af=aj.className.match(/\blinenums\b(?::(\d+))?/);af=af?af[1]&&af[1].length?+af[1]:true:false;if(af){Q(aj,af)}S={langExtension:ah,sourceNode:aj,numberLines:af};d(S)}}}if(X]*(?:>|$)/],[PR.PR_COMMENT,/^<\!--[\s\S]*?(?:-\->|$)/],[PR.PR_PUNCTUATION,/^(?:<[%?]|[%?]>)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],["lang-",/^]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-handlebars",/^]*type\s*=\s*['"]?text\/x-handlebars-template['"]?\b[^>]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-js",/^]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^]*>([\s\S]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i],[PR.PR_DECLARATION,/^{{[#^>/]?\s*[\w.][^}]*}}/],[PR.PR_DECLARATION,/^{{&?\s*[\w.][^}]*}}/],[PR.PR_DECLARATION,/^{{{>?\s*[\w.][^}]*}}}/],[PR.PR_COMMENT,/^{{![^}]*}}/]]),["handlebars","hbs"]);PR.registerLangHandler(PR.createSimpleLexer([[PR.PR_PLAIN,/^[ \t\r\n\f]+/,null," \t\r\n\f"]],[[PR.PR_STRING,/^\"(?:[^\n\r\f\\\"]|\\(?:\r\n?|\n|\f)|\\[\s\S])*\"/,null],[PR.PR_STRING,/^\'(?:[^\n\r\f\\\']|\\(?:\r\n?|\n|\f)|\\[\s\S])*\'/,null],["lang-css-str",/^url\(([^\)\"\']*)\)/i],[PR.PR_KEYWORD,/^(?:url|rgb|\!important|@import|@page|@media|@charset|inherit)(?=[^\-\w]|$)/i,null],["lang-css-kw",/^(-?(?:[_a-z]|(?:\\[0-9a-f]+ ?))(?:[_a-z0-9\-]|\\(?:\\[0-9a-f]+ ?))*)\s*:/i],[PR.PR_COMMENT,/^\/\*[^*]*\*+(?:[^\/*][^*]*\*+)*\//],[PR.PR_COMMENT,/^(?:)/],[PR.PR_LITERAL,/^(?:\d+|\d*\.\d+)(?:%|[a-z]+)?/i],[PR.PR_LITERAL,/^#(?:[0-9a-f]{3}){1,2}/i],[PR.PR_PLAIN,/^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i],[PR.PR_PUNCTUATION,/^[^\s\w\'\"]+/]]),["css"]);PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_KEYWORD,/^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i]]),["css-kw"]);PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_STRING,/^[^\)\"\']+/]]),["css-str"]); diff --git a/services/delivery/coverage/sort-arrow-sprite.png b/services/delivery/coverage/sort-arrow-sprite.png new file mode 100644 index 0000000000000000000000000000000000000000..6ed68316eb3f65dec9063332d2f69bf3093bbfab GIT binary patch literal 138 zcmeAS@N?(olHy`uVBq!ia0vp^>_9Bd!3HEZxJ@+%Qh}Z>jv*C{$p!i!8j}?a+@3A= zIAGwzjijN=FBi!|L1t?LM;Q;gkwn>2cAy-KV{dn nf0J1DIvEHQu*n~6U}x}qyky7vi4|9XhBJ7&`njxgN@xNA8m%nc literal 0 HcmV?d00001 diff --git a/services/delivery/coverage/sorter.js b/services/delivery/coverage/sorter.js new file mode 100644 index 00000000..2bb296a8 --- /dev/null +++ b/services/delivery/coverage/sorter.js @@ -0,0 +1,196 @@ +/* eslint-disable */ +var addSorting = (function() { + 'use strict'; + var cols, + currentSort = { + index: 0, + desc: false + }; + + // returns the summary table element + function getTable() { + return document.querySelector('.coverage-summary'); + } + // returns the thead element of the summary table + function getTableHeader() { + return getTable().querySelector('thead tr'); + } + // returns the tbody element of the summary table + function getTableBody() { + return getTable().querySelector('tbody'); + } + // returns the th element for nth column + function getNthColumn(n) { + return getTableHeader().querySelectorAll('th')[n]; + } + + function onFilterInput() { + const searchValue = document.getElementById('fileSearch').value; + const rows = document.getElementsByTagName('tbody')[0].children; + for (let i = 0; i < rows.length; i++) { + const row = rows[i]; + if ( + row.textContent + .toLowerCase() + .includes(searchValue.toLowerCase()) + ) { + row.style.display = ''; + } else { + row.style.display = 'none'; + } + } + } + + // loads the search box + function addSearchBox() { + var template = document.getElementById('filterTemplate'); + var templateClone = template.content.cloneNode(true); + templateClone.getElementById('fileSearch').oninput = onFilterInput; + template.parentElement.appendChild(templateClone); + } + + // loads all columns + function loadColumns() { + var colNodes = getTableHeader().querySelectorAll('th'), + colNode, + cols = [], + col, + i; + + for (i = 0; i < colNodes.length; i += 1) { + colNode = colNodes[i]; + col = { + key: colNode.getAttribute('data-col'), + sortable: !colNode.getAttribute('data-nosort'), + type: colNode.getAttribute('data-type') || 'string' + }; + cols.push(col); + if (col.sortable) { + col.defaultDescSort = col.type === 'number'; + colNode.innerHTML = + colNode.innerHTML + ''; + } + } + return cols; + } + // attaches a data attribute to every tr element with an object + // of data values keyed by column name + function loadRowData(tableRow) { + var tableCols = tableRow.querySelectorAll('td'), + colNode, + col, + data = {}, + i, + val; + for (i = 0; i < tableCols.length; i += 1) { + colNode = tableCols[i]; + col = cols[i]; + val = colNode.getAttribute('data-value'); + if (col.type === 'number') { + val = Number(val); + } + data[col.key] = val; + } + return data; + } + // loads all row data + function loadData() { + var rows = getTableBody().querySelectorAll('tr'), + i; + + for (i = 0; i < rows.length; i += 1) { + rows[i].data = loadRowData(rows[i]); + } + } + // sorts the table using the data for the ith column + function sortByIndex(index, desc) { + var key = cols[index].key, + sorter = function(a, b) { + a = a.data[key]; + b = b.data[key]; + return a < b ? -1 : a > b ? 1 : 0; + }, + finalSorter = sorter, + tableBody = document.querySelector('.coverage-summary tbody'), + rowNodes = tableBody.querySelectorAll('tr'), + rows = [], + i; + + if (desc) { + finalSorter = function(a, b) { + return -1 * sorter(a, b); + }; + } + + for (i = 0; i < rowNodes.length; i += 1) { + rows.push(rowNodes[i]); + tableBody.removeChild(rowNodes[i]); + } + + rows.sort(finalSorter); + + for (i = 0; i < rows.length; i += 1) { + tableBody.appendChild(rows[i]); + } + } + // removes sort indicators for current column being sorted + function removeSortIndicators() { + var col = getNthColumn(currentSort.index), + cls = col.className; + + cls = cls.replace(/ sorted$/, '').replace(/ sorted-desc$/, ''); + col.className = cls; + } + // adds sort indicators for current column being sorted + function addSortIndicators() { + getNthColumn(currentSort.index).className += currentSort.desc + ? ' sorted-desc' + : ' sorted'; + } + // adds event listeners for all sorter widgets + function enableUI() { + var i, + el, + ithSorter = function ithSorter(i) { + var col = cols[i]; + + return function() { + var desc = col.defaultDescSort; + + if (currentSort.index === i) { + desc = !currentSort.desc; + } + sortByIndex(i, desc); + removeSortIndicators(); + currentSort.index = i; + currentSort.desc = desc; + addSortIndicators(); + }; + }; + for (i = 0; i < cols.length; i += 1) { + if (cols[i].sortable) { + // add the click event handler on the th so users + // dont have to click on those tiny arrows + el = getNthColumn(i).querySelector('.sorter').parentElement; + if (el.addEventListener) { + el.addEventListener('click', ithSorter(i)); + } else { + el.attachEvent('onclick', ithSorter(i)); + } + } + } + } + // adds sorting functionality to the UI + return function() { + if (!getTable()) { + return; + } + cols = loadColumns(); + loadData(); + addSearchBox(); + addSortIndicators(); + enableUI(); + }; +})(); + +window.addEventListener('load', addSorting); diff --git a/services/delivery/package.json b/services/delivery/package.json index 3eb5a908..43cb5383 100644 --- a/services/delivery/package.json +++ b/services/delivery/package.json @@ -1,9 +1,16 @@ { - "name": "typescript-grpc", + "name": "@goodfood/delivery", + "bin": "dist/index.js", "scripts": { - "start": "ts-node ./src/server.ts", + "start": "node dist/index.js", "dev": "nodemon --watch 'src/**/*.ts' --exec 'ts-node' src/server.ts", + "build": "esbuild src/server.ts --bundle --platform=node --target=node18 --outfile=dist/index.js", + "test": "vitest", + "coverage": "vitest --coverage", + "pkg": "pkg .", + "prisma:generate": "prisma generate", "seed": "ts-node prisma/seed.ts", + "postinstall": "npm run prisma:generate", "client:delivery-create": "ts-node ./src/client/delivery/create.ts", "client:delivery-get": "ts-node ./src/client/delivery/get.ts", "client:delivery-update": "ts-node ./src/client/delivery/update.ts", @@ -20,13 +27,31 @@ }, "devDependencies": { "@types/node": "18.15.9", + "@vitest/coverage-c8": "^0.29.8", + "esbuild": "^0.17.14", "nodemon": "^2.0.22", + "pkg": "^5.8.1", "prisma": "4.11.0", "ts-node": "10.9.1", "tsconfig-paths": "^4.1.2", - "typescript": "5.0.2" + "typescript": "5.0.2", + "vite-tsconfig-paths": "^4.0.7", + "vitest": "^0.29.8" }, "prisma": { "seed": "ts-node prisma/seed.ts" + }, + "pkg": { + "scripts": "./src/dist/index.js", + "assets": [ + "./prisma/**/*", + "../proto/**/*" + ], + "targets": [ + "node18-macos-arm64", + "node18-linux-x64", + "node18-linux-arm64" + ], + "outputPath": "bin/" } } diff --git a/services/delivery/pnpm-lock.yaml b/services/delivery/pnpm-lock.yaml index 38da5b6e..87cb70fa 100644 --- a/services/delivery/pnpm-lock.yaml +++ b/services/delivery/pnpm-lock.yaml @@ -1,43 +1,305 @@ -lockfileVersion: 5.4 - -specifiers: - '@grpc/grpc-js': ^1.8.13 - '@grpc/proto-loader': 0.7.6 - '@prisma/client': 4.11.0 - '@types/node': 18.15.9 - dotenv: ^16.0.3 - nodemon: ^2.0.22 - prisma: 4.11.0 - protobufjs: 7.2.2 - ts-node: 10.9.1 - tsconfig-paths: ^4.1.2 - typescript: 5.0.2 +lockfileVersion: '6.0' dependencies: - '@grpc/grpc-js': 1.8.13 - '@grpc/proto-loader': 0.7.6 - '@prisma/client': 4.11.0_prisma@4.11.0 - dotenv: 16.0.3 - protobufjs: 7.2.2 + '@grpc/grpc-js': + specifier: ^1.8.13 + version: 1.8.13 + '@grpc/proto-loader': + specifier: 0.7.6 + version: 0.7.6 + '@prisma/client': + specifier: 4.11.0 + version: 4.11.0(prisma@4.11.0) + dotenv: + specifier: ^16.0.3 + version: 16.0.3 + protobufjs: + specifier: 7.2.2 + version: 7.2.2 devDependencies: - '@types/node': 18.15.9 - nodemon: 2.0.22 - prisma: 4.11.0 - ts-node: 10.9.1_3flabivgbrnlfzsgzfhinuvrvy - tsconfig-paths: 4.1.2 - typescript: 5.0.2 + '@types/node': + specifier: 18.15.9 + version: 18.15.9 + '@vitest/coverage-c8': + specifier: ^0.29.8 + version: 0.29.8(vitest@0.29.8) + esbuild: + specifier: ^0.17.14 + version: 0.17.14 + nodemon: + specifier: ^2.0.22 + version: 2.0.22 + pkg: + specifier: ^5.8.1 + version: 5.8.1 + prisma: + specifier: 4.11.0 + version: 4.11.0 + ts-node: + specifier: 10.9.1 + version: 10.9.1(@types/node@18.15.9)(typescript@5.0.2) + tsconfig-paths: + specifier: ^4.1.2 + version: 4.1.2 + typescript: + specifier: 5.0.2 + version: 5.0.2 + vite-tsconfig-paths: + specifier: ^4.0.7 + version: 4.0.7(typescript@5.0.2) + vitest: + specifier: ^0.29.8 + version: 0.29.8 packages: - /@cspotcode/source-map-support/0.8.1: + /@babel/generator@7.18.2: + resolution: {integrity: sha512-W1lG5vUwFvfMd8HVXqdfbuG7RuaSrTCCD8cl8fP8wOivdbtbIg2Db3IWUcgvfxKbbn6ZBGYRW/Zk1MIwK49mgw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.19.0 + '@jridgewell/gen-mapping': 0.3.2 + jsesc: 2.5.2 + dev: true + + /@babel/helper-string-parser@7.19.4: + resolution: {integrity: sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helper-validator-identifier@7.19.1: + resolution: {integrity: sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/parser@7.18.4: + resolution: {integrity: sha512-FDge0dFazETFcxGw/EXzOkN8uJp0PC7Qbm+Pe9T+av2zlBpOgunFHkQPPn+eRuClU73JF+98D531UgayY89tow==} + engines: {node: '>=6.0.0'} + hasBin: true + dependencies: + '@babel/types': 7.19.0 + dev: true + + /@babel/types@7.19.0: + resolution: {integrity: sha512-YuGopBq3ke25BVSiS6fgF49Ul9gH1x70Bcr6bqRLjWCkcX8Hre1/5+z+IiWOIerRMSSEfGZVB9z9kyq7wVs9YA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-string-parser': 7.19.4 + '@babel/helper-validator-identifier': 7.19.1 + 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 - /@grpc/grpc-js/1.8.13: + /@esbuild/android-arm64@0.17.14: + resolution: {integrity: sha512-eLOpPO1RvtsP71afiFTvS7tVFShJBCT0txiv/xjFBo5a7R7Gjw7X0IgIaFoLKhqXYAXhahoXm7qAmRXhY4guJg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-arm@0.17.14: + resolution: {integrity: sha512-0CnlwnjDU8cks0yJLXfkaU/uoLyRf9VZJs4p1PskBr2AlAHeEsFEwJEo0of/Z3g+ilw5mpyDwThlxzNEIxOE4g==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-x64@0.17.14: + resolution: {integrity: sha512-nrfQYWBfLGfSGLvRVlt6xi63B5IbfHm3tZCdu/82zuFPQ7zez4XjmRtF/wIRYbJQ/DsZrxJdEvYFE67avYXyng==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-arm64@0.17.14: + resolution: {integrity: sha512-eoSjEuDsU1ROwgBH/c+fZzuSyJUVXQTOIN9xuLs9dE/9HbV/A5IqdXHU1p2OfIMwBwOYJ9SFVGGldxeRCUJFyw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-x64@0.17.14: + resolution: {integrity: sha512-zN0U8RWfrDttdFNkHqFYZtOH8hdi22z0pFm0aIJPsNC4QQZv7je8DWCX5iA4Zx6tRhS0CCc0XC2m7wKsbWEo5g==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-arm64@0.17.14: + resolution: {integrity: sha512-z0VcD4ibeZWVQCW1O7szaLxGsx54gcCnajEJMdYoYjLiq4g1jrP2lMq6pk71dbS5+7op/L2Aod+erw+EUr28/A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-x64@0.17.14: + resolution: {integrity: sha512-hd9mPcxfTgJlolrPlcXkQk9BMwNBvNBsVaUe5eNUqXut6weDQH8whcNaKNF2RO8NbpT6GY8rHOK2A9y++s+ehw==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm64@0.17.14: + resolution: {integrity: sha512-FhAMNYOq3Iblcj9i+K0l1Fp/MHt+zBeRu/Qkf0LtrcFu3T45jcwB6A1iMsemQ42vR3GBhjNZJZTaCe3VFPbn9g==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm@0.17.14: + resolution: {integrity: sha512-BNTl+wSJ1omsH8s3TkQmIIIQHwvwJrU9u1ggb9XU2KTVM4TmthRIVyxSp2qxROJHhZuW/r8fht46/QE8hU8Qvg==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ia32@0.17.14: + resolution: {integrity: sha512-91OK/lQ5y2v7AsmnFT+0EyxdPTNhov3y2CWMdizyMfxSxRqHazXdzgBKtlmkU2KYIc+9ZK3Vwp2KyXogEATYxQ==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-loong64@0.17.14: + resolution: {integrity: sha512-vp15H+5NR6hubNgMluqqKza85HcGJgq7t6rMH7O3Y6ApiOWPkvW2AJfNojUQimfTp6OUrACUXfR4hmpcENXoMQ==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-mips64el@0.17.14: + resolution: {integrity: sha512-90TOdFV7N+fgi6c2+GO9ochEkmm9kBAKnuD5e08GQMgMINOdOFHuYLPQ91RYVrnWwQ5683sJKuLi9l4SsbJ7Hg==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ppc64@0.17.14: + resolution: {integrity: sha512-NnBGeoqKkTugpBOBZZoktQQ1Yqb7aHKmHxsw43NddPB2YWLAlpb7THZIzsRsTr0Xw3nqiPxbA1H31ZMOG+VVPQ==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-riscv64@0.17.14: + resolution: {integrity: sha512-0qdlKScLXA8MGVy21JUKvMzCYWovctuP8KKqhtE5A6IVPq4onxXhSuhwDd2g5sRCzNDlDjitc5sX31BzDoL5Fw==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-s390x@0.17.14: + resolution: {integrity: sha512-Hdm2Jo1yaaOro4v3+6/zJk6ygCqIZuSDJHdHaf8nVH/tfOuoEX5Riv03Ka15LmQBYJObUTNS1UdyoMk0WUn9Ww==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-x64@0.17.14: + resolution: {integrity: sha512-8KHF17OstlK4DuzeF/KmSgzrTWQrkWj5boluiiq7kvJCiQVzUrmSkaBvcLB2UgHpKENO2i6BthPkmUhNDaJsVw==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/netbsd-x64@0.17.14: + resolution: {integrity: sha512-nVwpqvb3yyXztxIT2+VsxJhB5GCgzPdk1n0HHSnchRAcxqKO6ghXwHhJnr0j/B+5FSyEqSxF4q03rbA2fKXtUQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/openbsd-x64@0.17.14: + resolution: {integrity: sha512-1RZ7uQQ9zcy/GSAJL1xPdN7NDdOOtNEGiJalg/MOzeakZeTrgH/DoCkbq7TaPDiPhWqnDF+4bnydxRqQD7il6g==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/sunos-x64@0.17.14: + resolution: {integrity: sha512-nqMjDsFwv7vp7msrwWRysnM38Sd44PKmW8EzV01YzDBTcTWUpczQg6mGao9VLicXSgW/iookNK6AxeogNVNDZA==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-arm64@0.17.14: + resolution: {integrity: sha512-xrD0mccTKRBBIotrITV7WVQAwNJ5+1va6L0H9zN92v2yEdjfAN7864cUaZwJS7JPEs53bDTzKFbfqVlG2HhyKQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-ia32@0.17.14: + resolution: {integrity: sha512-nXpkz9bbJrLLyUTYtRotSS3t5b+FOuljg8LgLdINWFs3FfqZMtbnBCZFUmBzQPyxqU87F8Av+3Nco/M3hEcu1w==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-x64@0.17.14: + resolution: {integrity: sha512-gPQmsi2DKTaEgG14hc3CHXHp62k8g6qr0Pas+I4lUxRMugGSATh/Bi8Dgusoz9IQ0IfdrvLpco6kujEIBoaogA==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@grpc/grpc-js@1.8.13: resolution: {integrity: sha512-iY3jsdfbc0ARoCLFvbvUB8optgyb0r1XLPb142u+QtgBcKJYkCIFt3Fd/881KqjLYWjsBJF57N3b8Eop9NDfUA==} engines: {node: ^8.13.0 || >=10.10.0} dependencies: @@ -45,7 +307,7 @@ packages: '@types/node': 18.15.9 dev: false - /@grpc/proto-loader/0.7.6: + /@grpc/proto-loader@0.7.6: resolution: {integrity: sha512-QyAXR8Hyh7uMDmveWxDSUcJr9NAWaZ2I6IXgAYvQmfflwouTM+rArE2eEaCtLlRqO81j7pRLCt81IefUei6Zbw==} engines: {node: '>=6'} hasBin: true @@ -57,23 +319,70 @@ packages: yargs: 16.2.0 dev: false - /@jridgewell/resolve-uri/3.1.0: + /@istanbuljs/schema@0.1.3: + resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} + engines: {node: '>=8'} + dev: true + + /@jridgewell/gen-mapping@0.3.2: + resolution: {integrity: sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/set-array': 1.1.2 + '@jridgewell/sourcemap-codec': 1.4.14 + '@jridgewell/trace-mapping': 0.3.9 + dev: true + + /@jridgewell/resolve-uri@3.1.0: resolution: {integrity: sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==} engines: {node: '>=6.0.0'} dev: true - /@jridgewell/sourcemap-codec/1.4.14: + /@jridgewell/set-array@1.1.2: + resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} + engines: {node: '>=6.0.0'} + dev: true + + /@jridgewell/sourcemap-codec@1.4.14: resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==} dev: true - /@jridgewell/trace-mapping/0.3.9: + /@jridgewell/trace-mapping@0.3.17: + resolution: {integrity: sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==} + dependencies: + '@jridgewell/resolve-uri': 3.1.0 + '@jridgewell/sourcemap-codec': 1.4.14 + dev: true + + /@jridgewell/trace-mapping@0.3.9: resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} dependencies: '@jridgewell/resolve-uri': 3.1.0 '@jridgewell/sourcemap-codec': 1.4.14 dev: true - /@prisma/client/4.11.0_prisma@4.11.0: + /@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: true + + /@nodelib/fs.stat@2.0.5: + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + dev: true + + /@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: true + + /@prisma/client@4.11.0(prisma@4.11.0): resolution: {integrity: sha512-0INHYkQIqgAjrt7NzhYpeDQi8x3Nvylc2uDngKyFDDj1tTRQ4uV1HnVmd1sQEraeVAN63SOK0dgCKQHlvjL0KA==} engines: {node: '>=14.17'} requiresBuild: true @@ -87,108 +396,186 @@ packages: prisma: 4.11.0 dev: false - /@prisma/engines-version/4.11.0-57.8fde8fef4033376662cad983758335009d522acb: + /@prisma/engines-version@4.11.0-57.8fde8fef4033376662cad983758335009d522acb: resolution: {integrity: sha512-3Vd8Qq06d5xD8Ch5WauWcUUrsVPdMC6Ge8ILji8RFfyhUpqon6qSyGM0apvr1O8n8qH8cKkEFqRPsYjuz5r83g==} dev: false - /@prisma/engines/4.11.0: + /@prisma/engines@4.11.0: resolution: {integrity: sha512-0AEBi2HXGV02cf6ASsBPhfsVIbVSDC9nbQed4iiY5eHttW9ZtMxHThuKZE1pnESbr8HRdgmFSa/Kn4OSNYuibg==} requiresBuild: true - /@protobufjs/aspromise/1.1.2: + /@protobufjs/aspromise@1.1.2: resolution: {integrity: sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==} dev: false - /@protobufjs/base64/1.1.2: + /@protobufjs/base64@1.1.2: resolution: {integrity: sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==} dev: false - /@protobufjs/codegen/2.0.4: + /@protobufjs/codegen@2.0.4: resolution: {integrity: sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==} dev: false - /@protobufjs/eventemitter/1.1.0: + /@protobufjs/eventemitter@1.1.0: resolution: {integrity: sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==} dev: false - /@protobufjs/fetch/1.1.0: + /@protobufjs/fetch@1.1.0: resolution: {integrity: sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==} dependencies: '@protobufjs/aspromise': 1.1.2 '@protobufjs/inquire': 1.1.0 dev: false - /@protobufjs/float/1.0.2: + /@protobufjs/float@1.0.2: resolution: {integrity: sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==} dev: false - /@protobufjs/inquire/1.1.0: + /@protobufjs/inquire@1.1.0: resolution: {integrity: sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==} dev: false - /@protobufjs/path/1.1.2: + /@protobufjs/path@1.1.2: resolution: {integrity: sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==} dev: false - /@protobufjs/pool/1.1.0: + /@protobufjs/pool@1.1.0: resolution: {integrity: sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==} dev: false - /@protobufjs/utf8/1.1.0: + /@protobufjs/utf8@1.1.0: resolution: {integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==} dev: false - /@tsconfig/node10/1.0.9: + /@tsconfig/node10@1.0.9: resolution: {integrity: sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==} dev: true - /@tsconfig/node12/1.0.11: + /@tsconfig/node12@1.0.11: resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} dev: true - /@tsconfig/node14/1.0.3: + /@tsconfig/node14@1.0.3: resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} dev: true - /@tsconfig/node16/1.0.3: + /@tsconfig/node16@1.0.3: resolution: {integrity: sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==} dev: true - /@types/long/4.0.2: + /@types/chai-subset@1.3.3: + resolution: {integrity: sha512-frBecisrNGz+F4T6bcc+NLeolfiojh5FxW2klu669+8BARtyQv2C/GkNW6FUodVe4BroGMP/wER/YDGc7rEllw==} + dependencies: + '@types/chai': 4.3.4 + dev: true + + /@types/chai@4.3.4: + resolution: {integrity: sha512-KnRanxnpfpjUTqTCXslZSEdLfXExwgNxYPdiO2WGUj8+HDjFi8R3k5RVKPeSCzLjCcshCAtVO2QBbVuAV4kTnw==} + dev: true + + /@types/istanbul-lib-coverage@2.0.4: + resolution: {integrity: sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==} + dev: true + + /@types/long@4.0.2: resolution: {integrity: sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==} dev: false - /@types/node/18.15.9: + /@types/node@18.15.9: resolution: {integrity: sha512-dUxhiNzBLr6IqlZXz6e/rN2YQXlFgOei/Dxy+e3cyXTJ4txSUbGT2/fmnD6zd/75jDMeW5bDee+YXxlFKHoV0A==} - /abbrev/1.1.1: + /@vitest/coverage-c8@0.29.8(vitest@0.29.8): + resolution: {integrity: sha512-y+sEMQMctWokjnSqm3FCQEYFkjLrYaznsxEZHxcx8z2aftpYg3A5tvI1S5himfdEFo7o+OeHzh40bPSWZHW4oQ==} + peerDependencies: + vitest: '>=0.29.0 <1' + dependencies: + c8: 7.13.0 + picocolors: 1.0.0 + std-env: 3.3.2 + vitest: 0.29.8 + dev: true + + /@vitest/expect@0.29.8: + resolution: {integrity: sha512-xlcVXn5I5oTq6NiZSY3ykyWixBxr5mG8HYtjvpgg6KaqHm0mvhX18xuwl5YGxIRNt/A5jidd7CWcNHrSvgaQqQ==} + dependencies: + '@vitest/spy': 0.29.8 + '@vitest/utils': 0.29.8 + chai: 4.3.7 + dev: true + + /@vitest/runner@0.29.8: + resolution: {integrity: sha512-FzdhnRDwEr/A3Oo1jtIk/B952BBvP32n1ObMEb23oEJNO+qO5cBet6M2XWIDQmA7BDKGKvmhUf2naXyp/2JEwQ==} + dependencies: + '@vitest/utils': 0.29.8 + p-limit: 4.0.0 + pathe: 1.1.0 + dev: true + + /@vitest/spy@0.29.8: + resolution: {integrity: sha512-VdjBe9w34vOMl5I5mYEzNX8inTxrZ+tYUVk9jxaZJmHFwmDFC/GV3KBFTA/JKswr3XHvZL+FE/yq5EVhb6pSAw==} + dependencies: + tinyspy: 1.1.1 + dev: true + + /@vitest/utils@0.29.8: + resolution: {integrity: sha512-qGzuf3vrTbnoY+RjjVVIBYfuWMjn3UMUqyQtdGNZ6ZIIyte7B37exj6LaVkrZiUTvzSadVvO/tJm8AEgbGCBPg==} + dependencies: + cli-truncate: 3.1.0 + diff: 5.1.0 + loupe: 2.3.6 + pretty-format: 27.5.1 + dev: true + + /abbrev@1.1.1: resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} dev: true - /acorn-walk/8.2.0: + /acorn-walk@8.2.0: resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} engines: {node: '>=0.4.0'} dev: true - /acorn/8.8.2: + /acorn@8.8.2: resolution: {integrity: sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==} engines: {node: '>=0.4.0'} hasBin: true dev: true - /ansi-regex/5.0.1: + /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 + dev: true + + /ansi-regex@5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} - dev: false - /ansi-styles/4.3.0: + /ansi-regex@6.0.1: + resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} + engines: {node: '>=12'} + dev: true + + /ansi-styles@4.3.0: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} engines: {node: '>=8'} dependencies: color-convert: 2.0.1 - dev: false - /anymatch/3.1.3: + /ansi-styles@5.2.0: + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} + engines: {node: '>=10'} + dev: true + + /ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + dev: true + + /anymatch@3.1.3: resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} engines: {node: '>= 8'} dependencies: @@ -196,34 +583,116 @@ packages: picomatch: 2.3.1 dev: true - /arg/4.1.3: + /arg@4.1.3: resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} dev: true - /balanced-match/1.0.2: + /array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + dev: true + + /assertion-error@1.1.0: + resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} + dev: true + + /at-least-node@1.0.0: + resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} + engines: {node: '>= 4.0.0'} + dev: true + + /balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} dev: true - /binary-extensions/2.2.0: + /base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + dev: true + + /binary-extensions@2.2.0: resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} engines: {node: '>=8'} dev: true - /brace-expansion/1.1.11: + /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: true + + /brace-expansion@1.1.11: resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} dependencies: balanced-match: 1.0.2 concat-map: 0.0.1 dev: true - /braces/3.0.2: + /braces@3.0.2: resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} engines: {node: '>=8'} dependencies: fill-range: 7.0.1 dev: true - /chokidar/3.5.3: + /buffer@5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + dev: true + + /c8@7.13.0: + resolution: {integrity: sha512-/NL4hQTv1gBL6J6ei80zu3IiTrmePDKXKXOTLpHvcIWZTVYQlDhVWjjWvkhICylE8EwwnMVzDZugCvdx0/DIIA==} + engines: {node: '>=10.12.0'} + hasBin: true + dependencies: + '@bcoe/v8-coverage': 0.2.3 + '@istanbuljs/schema': 0.1.3 + find-up: 5.0.0 + foreground-child: 2.0.0 + istanbul-lib-coverage: 3.2.0 + istanbul-lib-report: 3.0.0 + istanbul-reports: 3.1.5 + rimraf: 3.0.2 + test-exclude: 6.0.0 + v8-to-istanbul: 9.1.0 + yargs: 16.2.0 + yargs-parser: 20.2.9 + dev: true + + /cac@6.7.14: + resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} + engines: {node: '>=8'} + dev: true + + /chai@4.3.7: + resolution: {integrity: sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==} + engines: {node: '>=4'} + dependencies: + assertion-error: 1.1.0 + check-error: 1.0.2 + deep-eql: 4.1.3 + get-func-name: 2.0.0 + loupe: 2.3.6 + pathval: 1.1.1 + type-detect: 4.0.8 + dev: true + + /chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + dev: true + + /check-error@1.0.2: + resolution: {integrity: sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==} + dev: true + + /chokidar@3.5.3: resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} engines: {node: '>= 8.10.0'} dependencies: @@ -238,34 +707,60 @@ packages: fsevents: 2.3.2 dev: true - /cliui/7.0.4: + /chownr@1.1.4: + resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} + dev: true + + /cli-truncate@3.1.0: + resolution: {integrity: sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + slice-ansi: 5.0.0 + string-width: 5.1.2 + dev: true + + /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 - /color-convert/2.0.1: + /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: + /color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - dev: false - /concat-map/0.0.1: + /concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} dev: true - /create-require/1.1.1: + /convert-source-map@1.9.0: + resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} + dev: true + + /core-util-is@1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + dev: true + + /create-require@1.1.1: resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} dev: true - /debug/3.2.7_supports-color@5.5.0: + /cross-spawn@7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + dev: true + + /debug@3.2.7(supports-color@5.5.0): resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} peerDependencies: supports-color: '*' @@ -277,33 +772,186 @@ packages: supports-color: 5.5.0 dev: true - /diff/4.0.2: - resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} - engines: {node: '>=0.3.1'} + /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 dev: true - /dotenv/16.0.3: - resolution: {integrity: sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==} - engines: {node: '>=12'} - dev: false + /decompress-response@6.0.0: + resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} + engines: {node: '>=10'} + dependencies: + mimic-response: 3.1.0 + dev: true - /emoji-regex/8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + /deep-eql@4.1.3: + resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==} + engines: {node: '>=6'} + dependencies: + type-detect: 4.0.8 + dev: true + + /deep-extend@0.6.0: + resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} + engines: {node: '>=4.0.0'} + dev: true + + /detect-libc@2.0.1: + resolution: {integrity: sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==} + engines: {node: '>=8'} + dev: true + + /diff@4.0.2: + resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} + engines: {node: '>=0.3.1'} + dev: true + + /diff@5.1.0: + resolution: {integrity: sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==} + 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 + dev: true + + /dotenv@16.0.3: + resolution: {integrity: sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==} + engines: {node: '>=12'} dev: false - /escalade/3.1.1: + /eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + dev: true + + /emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + /emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + dev: true + + /end-of-stream@1.4.4: + resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + dependencies: + once: 1.4.0 + dev: true + + /esbuild@0.17.14: + resolution: {integrity: sha512-vOO5XhmVj/1XQR9NQ1UPq6qvMYL7QFJU57J5fKBKBKxp17uDt5PgxFDb4A2nEiXhr1qQs4x0F5+66hVVw4ruNw==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/android-arm': 0.17.14 + '@esbuild/android-arm64': 0.17.14 + '@esbuild/android-x64': 0.17.14 + '@esbuild/darwin-arm64': 0.17.14 + '@esbuild/darwin-x64': 0.17.14 + '@esbuild/freebsd-arm64': 0.17.14 + '@esbuild/freebsd-x64': 0.17.14 + '@esbuild/linux-arm': 0.17.14 + '@esbuild/linux-arm64': 0.17.14 + '@esbuild/linux-ia32': 0.17.14 + '@esbuild/linux-loong64': 0.17.14 + '@esbuild/linux-mips64el': 0.17.14 + '@esbuild/linux-ppc64': 0.17.14 + '@esbuild/linux-riscv64': 0.17.14 + '@esbuild/linux-s390x': 0.17.14 + '@esbuild/linux-x64': 0.17.14 + '@esbuild/netbsd-x64': 0.17.14 + '@esbuild/openbsd-x64': 0.17.14 + '@esbuild/sunos-x64': 0.17.14 + '@esbuild/win32-arm64': 0.17.14 + '@esbuild/win32-ia32': 0.17.14 + '@esbuild/win32-x64': 0.17.14 + dev: true + + /escalade@3.1.1: resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} engines: {node: '>=6'} - dev: false - /fill-range/7.0.1: + /expand-template@2.0.3: + resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} + engines: {node: '>=6'} + dev: true + + /fast-glob@3.2.12: + resolution: {integrity: sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==} + 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: true + + /fastq@1.15.0: + resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} + dependencies: + reusify: 1.0.4 + dev: true + + /fill-range@7.0.1: resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} engines: {node: '>=8'} dependencies: to-regex-range: 5.0.1 dev: true - /fsevents/2.3.2: + /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 + + /foreground-child@2.0.0: + resolution: {integrity: sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==} + engines: {node: '>=8.0.0'} + dependencies: + cross-spawn: 7.0.3 + signal-exit: 3.0.7 + dev: true + + /from2@2.3.0: + resolution: {integrity: sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==} + dependencies: + inherits: 2.0.4 + readable-stream: 2.3.8 + dev: true + + /fs-constants@1.0.0: + resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} + dev: true + + /fs-extra@9.1.0: + resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==} + engines: {node: '>=10'} + dependencies: + at-least-node: 1.0.0 + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.0 + dev: true + + /fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + dev: true + + /fsevents@2.3.2: resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} os: [darwin] @@ -311,99 +959,360 @@ packages: dev: true optional: true - /get-caller-file/2.0.5: + /function-bind@1.1.1: + resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} + dev: true + + /get-caller-file@2.0.5: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} - dev: false - /glob-parent/5.1.2: + /get-func-name@2.0.0: + resolution: {integrity: sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==} + dev: true + + /github-from-package@0.0.0: + resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==} + dev: true + + /glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} dependencies: is-glob: 4.0.3 dev: true - /has-flag/3.0.0: + /glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + dev: true + + /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.2.12 + ignore: 5.2.4 + merge2: 1.4.1 + slash: 3.0.0 + dev: true + + /globrex@0.1.2: + resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} + dev: true + + /graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + dev: true + + /has-flag@3.0.0: resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} engines: {node: '>=4'} dev: true - /ignore-by-default/1.0.1: + /has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + dev: true + + /has@1.0.3: + resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} + engines: {node: '>= 0.4.0'} + dependencies: + function-bind: 1.1.1 + dev: true + + /html-escaper@2.0.2: + resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} + dev: true + + /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 + dev: true + + /ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + dev: true + + /ignore-by-default@1.0.1: resolution: {integrity: sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==} dev: true - /is-binary-path/2.1.0: + /ignore@5.2.4: + resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} + engines: {node: '>= 4'} + dev: true + + /inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + dev: true + + /inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + dev: true + + /ini@1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + dev: true + + /into-stream@6.0.0: + resolution: {integrity: sha512-XHbaOAvP+uFKUFsOgoNPRjLkwB+I22JFPFe5OjTkQ0nwgj6+pSjb4NmB6VMxaPshLiOf+zcpOCBQuLwC1KHhZA==} + engines: {node: '>=10'} + dependencies: + from2: 2.3.0 + p-is-promise: 3.0.0 + dev: true + + /is-binary-path@2.1.0: resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} engines: {node: '>=8'} dependencies: binary-extensions: 2.2.0 dev: true - /is-extglob/2.1.1: + /is-core-module@2.9.0: + resolution: {integrity: sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==} + dependencies: + has: 1.0.3 + dev: true + + /is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} dev: true - /is-fullwidth-code-point/3.0.0: + /is-fullwidth-code-point@3.0.0: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} engines: {node: '>=8'} - dev: false - /is-glob/4.0.3: + /is-fullwidth-code-point@4.0.0: + resolution: {integrity: sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==} + engines: {node: '>=12'} + dev: true + + /is-glob@4.0.3: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} dependencies: is-extglob: 2.1.1 dev: true - /is-number/7.0.0: + /is-number@7.0.0: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} dev: true - /json5/2.2.3: + /isarray@1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + dev: true + + /isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + dev: true + + /istanbul-lib-coverage@3.2.0: + resolution: {integrity: sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==} + engines: {node: '>=8'} + dev: true + + /istanbul-lib-report@3.0.0: + resolution: {integrity: sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==} + engines: {node: '>=8'} + dependencies: + istanbul-lib-coverage: 3.2.0 + make-dir: 3.1.0 + supports-color: 7.2.0 + dev: true + + /istanbul-reports@3.1.5: + resolution: {integrity: sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==} + engines: {node: '>=8'} + dependencies: + html-escaper: 2.0.2 + istanbul-lib-report: 3.0.0 + dev: true + + /jsesc@2.5.2: + resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} + engines: {node: '>=4'} + hasBin: true + dev: true + + /json5@2.2.3: resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} engines: {node: '>=6'} hasBin: true dev: true - /lodash.camelcase/4.3.0: + /jsonc-parser@3.2.0: + resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} + dev: true + + /jsonfile@6.1.0: + resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + dependencies: + universalify: 2.0.0 + optionalDependencies: + graceful-fs: 4.2.11 + dev: true + + /local-pkg@0.4.3: + resolution: {integrity: sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==} + engines: {node: '>=14'} + dev: true + + /locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + dependencies: + p-locate: 5.0.0 + dev: true + + /lodash.camelcase@4.3.0: resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} dev: false - /long/4.0.0: + /long@4.0.0: resolution: {integrity: sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==} dev: false - /long/5.2.1: + /long@5.2.1: resolution: {integrity: sha512-GKSNGeNAtw8IryjjkhZxuKB3JzlcLTwjtiQCHKvqQet81I93kXslhDQruGI/QsddO83mcDToBVy7GqGS/zYf/A==} dev: false - /make-error/1.3.6: + /loupe@2.3.6: + resolution: {integrity: sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==} + dependencies: + get-func-name: 2.0.0 + dev: true + + /lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + dependencies: + yallist: 4.0.0 + dev: true + + /make-dir@3.1.0: + resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} + engines: {node: '>=8'} + dependencies: + semver: 6.3.0 + dev: true + + /make-error@1.3.6: resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} dev: true - /minimatch/3.1.2: + /merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + dev: true + + /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: true + + /mimic-response@3.1.0: + resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} + engines: {node: '>=10'} + dev: true + + /minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} dependencies: brace-expansion: 1.1.11 dev: true - /minimist/1.2.8: + /minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} dev: true - /ms/2.1.3: + /mkdirp-classic@0.5.3: + resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} + dev: true + + /mlly@1.2.0: + resolution: {integrity: sha512-+c7A3CV0KGdKcylsI6khWyts/CYrGTrRVo4R/I7u/cUsy0Conxa6LUhiEzVKIw14lc2L5aiO4+SeVe4TeGRKww==} + dependencies: + acorn: 8.8.2 + pathe: 1.1.0 + pkg-types: 1.0.2 + ufo: 1.1.1 + dev: true + + /ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + dev: true + + /ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} dev: true - /nodemon/2.0.22: + /multistream@4.1.0: + resolution: {integrity: sha512-J1XDiAmmNpRCBfIWJv+n0ymC4ABcf/Pl+5YvC5B/D2f/2+8PtHvCNxMPKiQcZyi922Hq69J2YOpb1pTywfifyw==} + dependencies: + once: 1.4.0 + readable-stream: 3.6.2 + dev: true + + /nanoid@3.3.6: + resolution: {integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + dev: true + + /napi-build-utils@1.0.2: + resolution: {integrity: sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==} + dev: true + + /node-abi@3.33.0: + resolution: {integrity: sha512-7GGVawqyHF4pfd0YFybhv/eM9JwTtPqx0mAanQ146O3FlSh3pA24zf9IRQTOsfTSqXTNzPSP5iagAJ94jjuVog==} + engines: {node: '>=10'} + dependencies: + semver: 7.3.8 + dev: true + + /node-fetch@2.6.9: + resolution: {integrity: sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + dependencies: + whatwg-url: 5.0.0 + dev: true + + /nodemon@2.0.22: resolution: {integrity: sha512-B8YqaKMmyuCO7BowF1Z1/mkPqLk6cs/l63Ojtd6otKjMx47Dq1utxfRxcavH1I7VSaL8n5BUaoutadnsX3AAVQ==} engines: {node: '>=8.10.0'} hasBin: true dependencies: chokidar: 3.5.3 - debug: 3.2.7_supports-color@5.5.0 + debug: 3.2.7(supports-color@5.5.0) ignore-by-default: 1.0.1 minimatch: 3.1.2 pstree.remy: 1.1.8 @@ -414,24 +1323,182 @@ packages: undefsafe: 2.0.5 dev: true - /nopt/1.0.10: + /nopt@1.0.10: resolution: {integrity: sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==} hasBin: true dependencies: abbrev: 1.1.1 dev: true - /normalize-path/3.0.0: + /normalize-path@3.0.0: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} dev: true - /picomatch/2.3.1: + /once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + dependencies: + wrappy: 1.0.2 + dev: true + + /p-is-promise@3.0.0: + resolution: {integrity: sha512-Wo8VsW4IRQSKVXsJCn7TomUaVtyfjVDn3nUP7kE967BQk0CwFpdbZs0X0uk5sW9mkBa9eNM7hCMaG93WUAwxYQ==} + engines: {node: '>=8'} + dev: true + + /p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + dependencies: + yocto-queue: 0.1.0 + dev: true + + /p-limit@4.0.0: + resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + yocto-queue: 1.0.0 + dev: true + + /p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + dependencies: + p-limit: 3.1.0 + dev: true + + /path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + dev: true + + /path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + dev: true + + /path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + dev: true + + /path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + dev: true + + /path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + dev: true + + /pathe@1.1.0: + resolution: {integrity: sha512-ODbEPR0KKHqECXW1GoxdDb+AZvULmXjVPy4rt+pGo2+TnjJTIPJQSVS6N63n8T2Ip+syHhbn52OewKicV0373w==} + dev: true + + /pathval@1.1.1: + resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} + dev: true + + /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'} dev: true - /prisma/4.11.0: + /pkg-fetch@3.4.2: + resolution: {integrity: sha512-0+uijmzYcnhC0hStDjm/cl2VYdrmVVBpe7Q8k9YBojxmR5tG8mvR9/nooQq3QSXiQqORDVOTY3XqMEqJVIzkHA==} + hasBin: true + dependencies: + chalk: 4.1.2 + fs-extra: 9.1.0 + https-proxy-agent: 5.0.1 + node-fetch: 2.6.9 + progress: 2.0.3 + semver: 7.3.8 + tar-fs: 2.1.1 + yargs: 16.2.0 + transitivePeerDependencies: + - encoding + - supports-color + dev: true + + /pkg-types@1.0.2: + resolution: {integrity: sha512-hM58GKXOcj8WTqUXnsQyJYXdeAPbythQgEF3nTcEo+nkD49chjQ9IKm/QJy9xf6JakXptz86h7ecP2024rrLaQ==} + dependencies: + jsonc-parser: 3.2.0 + mlly: 1.2.0 + pathe: 1.1.0 + dev: true + + /pkg@5.8.1: + resolution: {integrity: sha512-CjBWtFStCfIiT4Bde9QpJy0KeH19jCfwZRJqHFDFXfhUklCx8JoFmMj3wgnEYIwGmZVNkhsStPHEOnrtrQhEXA==} + hasBin: true + peerDependencies: + node-notifier: '>=9.0.1' + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@babel/generator': 7.18.2 + '@babel/parser': 7.18.4 + '@babel/types': 7.19.0 + chalk: 4.1.2 + fs-extra: 9.1.0 + globby: 11.1.0 + into-stream: 6.0.0 + is-core-module: 2.9.0 + minimist: 1.2.8 + multistream: 4.1.0 + pkg-fetch: 3.4.2 + prebuild-install: 7.1.1 + resolve: 1.22.1 + stream-meter: 1.0.4 + transitivePeerDependencies: + - encoding + - supports-color + dev: true + + /postcss@8.4.21: + resolution: {integrity: sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==} + engines: {node: ^10 || ^12 || >=14} + dependencies: + nanoid: 3.3.6 + picocolors: 1.0.0 + source-map-js: 1.0.2 + dev: true + + /prebuild-install@7.1.1: + resolution: {integrity: sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==} + engines: {node: '>=10'} + hasBin: true + dependencies: + detect-libc: 2.0.1 + expand-template: 2.0.3 + github-from-package: 0.0.0 + minimist: 1.2.8 + mkdirp-classic: 0.5.3 + napi-build-utils: 1.0.2 + node-abi: 3.33.0 + pump: 3.0.0 + rc: 1.2.8 + simple-get: 4.0.1 + tar-fs: 2.1.1 + tunnel-agent: 0.6.0 + dev: true + + /pretty-format@27.5.1: + resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + ansi-regex: 5.0.1 + ansi-styles: 5.2.0 + react-is: 17.0.2 + dev: true + + /prisma@4.11.0: resolution: {integrity: sha512-4zZmBXssPUEiX+GeL0MUq/Yyie4ltiKmGu7jCJFnYMamNrrulTBc+D+QwAQSJ01tyzeGHlD13kOnqPwRipnlNw==} engines: {node: '>=14.17'} hasBin: true @@ -439,7 +1506,16 @@ packages: dependencies: '@prisma/engines': 4.11.0 - /protobufjs/7.2.2: + /process-nextick-args@2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + dev: true + + /progress@2.0.3: + resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} + engines: {node: '>=0.4.0'} + dev: true + + /protobufjs@7.2.2: resolution: {integrity: sha512-++PrQIjrom+bFDPpfmqXfAGSQs40116JRrqqyf53dymUMvvb5d/LMRyicRoF1AUKoXVS1/IgJXlEgcpr4gTF3Q==} engines: {node: '>=12.0.0'} requiresBuild: true @@ -458,82 +1534,353 @@ packages: long: 5.2.1 dev: false - /pstree.remy/1.1.8: + /pstree.remy@1.1.8: resolution: {integrity: sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==} dev: true - /readdirp/3.6.0: + /pump@3.0.0: + resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} + dependencies: + end-of-stream: 1.4.4 + once: 1.4.0 + dev: true + + /queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + dev: true + + /rc@1.2.8: + resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} + hasBin: true + dependencies: + deep-extend: 0.6.0 + ini: 1.3.8 + minimist: 1.2.8 + strip-json-comments: 2.0.1 + dev: true + + /react-is@17.0.2: + resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} + 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: true + + /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: true + + /readdirp@3.6.0: resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} engines: {node: '>=8.10.0'} dependencies: picomatch: 2.3.1 dev: true - /require-directory/2.1.1: + /require-directory@2.1.1: resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} engines: {node: '>=0.10.0'} - dev: false - /semver/5.7.1: + /resolve@1.22.1: + resolution: {integrity: sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==} + hasBin: true + dependencies: + is-core-module: 2.9.0 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + dev: true + + /reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + dev: true + + /rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + hasBin: true + dependencies: + glob: 7.2.3 + dev: true + + /rollup@3.20.2: + resolution: {integrity: sha512-3zwkBQl7Ai7MFYQE0y1MeQ15+9jsi7XxfrqwTb/9EK8D9C9+//EBR4M+CuA1KODRaNbFez/lWxA5vhEGZp4MUg==} + engines: {node: '>=14.18.0', npm: '>=8.0.0'} + hasBin: true + optionalDependencies: + fsevents: 2.3.2 + dev: true + + /run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + dependencies: + queue-microtask: 1.2.3 + dev: true + + /safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + dev: true + + /safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + dev: true + + /semver@5.7.1: resolution: {integrity: sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==} hasBin: true dev: true - /semver/7.0.0: + /semver@6.3.0: + resolution: {integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==} + hasBin: true + dev: true + + /semver@7.0.0: resolution: {integrity: sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==} hasBin: true dev: true - /simple-update-notifier/1.1.0: + /semver@7.3.8: + resolution: {integrity: sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==} + engines: {node: '>=10'} + hasBin: true + dependencies: + lru-cache: 6.0.0 + dev: true + + /shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + dependencies: + shebang-regex: 3.0.0 + dev: true + + /shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + 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==} + dev: true + + /simple-concat@1.0.1: + resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} + dev: true + + /simple-get@4.0.1: + resolution: {integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==} + dependencies: + decompress-response: 6.0.0 + once: 1.4.0 + simple-concat: 1.0.1 + dev: true + + /simple-update-notifier@1.1.0: resolution: {integrity: sha512-VpsrsJSUcJEseSbMHkrsrAVSdvVS5I96Qo1QAQ4FxQ9wXFcB+pjj7FB7/us9+GcgfW4ziHtYMc1J0PLczb55mg==} engines: {node: '>=8.10.0'} dependencies: semver: 7.0.0 dev: true - /string-width/4.2.3: + /slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + dev: true + + /slice-ansi@5.0.0: + resolution: {integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==} + engines: {node: '>=12'} + dependencies: + ansi-styles: 6.2.1 + is-fullwidth-code-point: 4.0.0 + dev: true + + /source-map-js@1.0.2: + resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} + engines: {node: '>=0.10.0'} + dev: true + + /source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + dev: true + + /stackback@0.0.2: + resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + dev: true + + /std-env@3.3.2: + resolution: {integrity: sha512-uUZI65yrV2Qva5gqE0+A7uVAvO40iPo6jGhs7s8keRfHCmtg+uB2X6EiLGCI9IgL1J17xGhvoOqSz79lzICPTA==} + dev: true + + /stream-meter@1.0.4: + resolution: {integrity: sha512-4sOEtrbgFotXwnEuzzsQBYEV1elAeFSO8rSGeTwabuX1RRn/kEq9JVH7I0MRBhKVRR0sJkr0M0QCH7yOLf9fhQ==} + dependencies: + readable-stream: 2.3.8 + 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 - dev: false - /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.0.1 + dev: true + + /string_decoder@1.1.1: + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + dependencies: + safe-buffer: 5.1.2 + dev: true + + /string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + dependencies: + safe-buffer: 5.2.1 + dev: true + + /strip-ansi@6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} dependencies: ansi-regex: 5.0.1 - dev: false - /strip-bom/3.0.0: + /strip-ansi@7.0.1: + resolution: {integrity: sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==} + engines: {node: '>=12'} + dependencies: + ansi-regex: 6.0.1 + dev: true + + /strip-bom@3.0.0: resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} engines: {node: '>=4'} dev: true - /supports-color/5.5.0: + /strip-json-comments@2.0.1: + resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} + engines: {node: '>=0.10.0'} + dev: true + + /strip-literal@1.0.1: + resolution: {integrity: sha512-QZTsipNpa2Ppr6v1AmJHESqJ3Uz247MUS0OjrnnZjFAvEoWqxuyFuXn2xLgMtRnijJShAa1HL0gtJyUs7u7n3Q==} + dependencies: + acorn: 8.8.2 + dev: true + + /supports-color@5.5.0: resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} engines: {node: '>=4'} dependencies: has-flag: 3.0.0 dev: true - /to-regex-range/5.0.1: + /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-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + dev: true + + /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: true + + /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: true + + /test-exclude@6.0.0: + resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} + engines: {node: '>=8'} + dependencies: + '@istanbuljs/schema': 0.1.3 + glob: 7.2.3 + minimatch: 3.1.2 + dev: true + + /tinybench@2.4.0: + resolution: {integrity: sha512-iyziEiyFxX4kyxSp+MtY1oCH/lvjH3PxFN8PGCDeqcZWAJ/i+9y+nL85w99PxVzrIvew/GSkSbDYtiGVa85Afg==} + dev: true + + /tinypool@0.4.0: + resolution: {integrity: sha512-2ksntHOKf893wSAH4z/+JbPpi92esw8Gn9N2deXX+B0EO92hexAVI9GIZZPx7P5aYo5KULfeOSt3kMOmSOy6uA==} + engines: {node: '>=14.0.0'} + dev: true + + /tinyspy@1.1.1: + resolution: {integrity: sha512-UVq5AXt/gQlti7oxoIg5oi/9r0WpF7DGEVwXgqWSMmyN16+e3tl5lIvTaOpJ3TAtu5xFzWccFRM4R5NaWHF+4g==} + engines: {node: '>=14.0.0'} + 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 dev: true - /touch/3.1.0: + /touch@3.1.0: resolution: {integrity: sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==} hasBin: true dependencies: nopt: 1.0.10 dev: true - /ts-node/10.9.1_3flabivgbrnlfzsgzfhinuvrvy: + /tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + dev: true + + /ts-node@10.9.1(@types/node@18.15.9)(typescript@5.0.2): resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} hasBin: true peerDependencies: @@ -564,7 +1911,20 @@ packages: yn: 3.1.1 dev: true - /tsconfig-paths/4.1.2: + /tsconfck@2.1.1(typescript@5.0.2): + resolution: {integrity: sha512-ZPCkJBKASZBmBUNqGHmRhdhM8pJYDdOXp4nRgj/O0JwUwsMq50lCDRQP/M5GBNAA0elPrq4gAeu4dkaVCuKWww==} + engines: {node: ^14.13.1 || ^16 || >=18} + hasBin: true + peerDependencies: + typescript: ^4.3.5 || ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + dependencies: + typescript: 5.0.2 + dev: true + + /tsconfig-paths@4.1.2: resolution: {integrity: sha512-uhxiMgnXQp1IR622dUXI+9Ehnws7i/y6xvpZB9IbUVOPy0muvdvgXeZOn88UcGPiT98Vp3rJPTa8bFoalZ3Qhw==} engines: {node: '>=6'} dependencies: @@ -573,40 +1933,241 @@ packages: strip-bom: 3.0.0 dev: true - /typescript/5.0.2: + /tunnel-agent@0.6.0: + resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} + dependencies: + safe-buffer: 5.2.1 + dev: true + + /type-detect@4.0.8: + resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} + engines: {node: '>=4'} + dev: true + + /typescript@5.0.2: resolution: {integrity: sha512-wVORMBGO/FAs/++blGNeAVdbNKtIh1rbBL2EyQ1+J9lClJ93KiiKe8PmFIVdXhHcyv44SL9oglmfeSsndo0jRw==} engines: {node: '>=12.20'} hasBin: true dev: true - /undefsafe/2.0.5: + /ufo@1.1.1: + resolution: {integrity: sha512-MvlCc4GHrmZdAllBc0iUDowff36Q9Ndw/UzqmEKyrfSzokTd9ZCy1i+IIk5hrYKkjoYVQyNbrw7/F8XJ2rEwTg==} + dev: true + + /undefsafe@2.0.5: resolution: {integrity: sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==} dev: true - /v8-compile-cache-lib/3.0.1: + /universalify@2.0.0: + resolution: {integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==} + engines: {node: '>= 10.0.0'} + dev: true + + /util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + dev: true + + /v8-compile-cache-lib@3.0.1: resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} dev: true - /wrap-ansi/7.0.0: + /v8-to-istanbul@9.1.0: + resolution: {integrity: sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA==} + engines: {node: '>=10.12.0'} + dependencies: + '@jridgewell/trace-mapping': 0.3.17 + '@types/istanbul-lib-coverage': 2.0.4 + convert-source-map: 1.9.0 + dev: true + + /vite-node@0.29.8(@types/node@18.15.9): + resolution: {integrity: sha512-b6OtCXfk65L6SElVM20q5G546yu10/kNrhg08afEoWlFRJXFq9/6glsvSVY+aI6YeC1tu2TtAqI2jHEQmOmsFw==} + engines: {node: '>=v14.16.0'} + hasBin: true + dependencies: + cac: 6.7.14 + debug: 4.3.4 + mlly: 1.2.0 + pathe: 1.1.0 + picocolors: 1.0.0 + vite: 4.2.1(@types/node@18.15.9) + transitivePeerDependencies: + - '@types/node' + - less + - sass + - stylus + - sugarss + - supports-color + - terser + dev: true + + /vite-tsconfig-paths@4.0.7(typescript@5.0.2): + resolution: {integrity: sha512-MwIYaby6kcbQGZqMH+gAK6h0UYQGOkjsuAgw4q6bP/5vWkn8VKvnmLuCQHA2+IzHAJHnE8OFTO4lnJLFMf9+7Q==} + peerDependencies: + vite: '*' + peerDependenciesMeta: + vite: + optional: true + dependencies: + debug: 4.3.4 + globrex: 0.1.2 + tsconfck: 2.1.1(typescript@5.0.2) + transitivePeerDependencies: + - supports-color + - typescript + dev: true + + /vite@4.2.1(@types/node@18.15.9): + resolution: {integrity: sha512-7MKhqdy0ISo4wnvwtqZkjke6XN4taqQ2TBaTccLIpOKv7Vp2h4Y+NpmWCnGDeSvvn45KxvWgGyb0MkHvY1vgbg==} + engines: {node: ^14.18.0 || >=16.0.0} + hasBin: true + peerDependencies: + '@types/node': '>= 14' + less: '*' + sass: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + dependencies: + '@types/node': 18.15.9 + esbuild: 0.17.14 + postcss: 8.4.21 + resolve: 1.22.1 + rollup: 3.20.2 + optionalDependencies: + fsevents: 2.3.2 + dev: true + + /vitest@0.29.8: + resolution: {integrity: sha512-JIAVi2GK5cvA6awGpH0HvH/gEG9PZ0a/WoxdiV3PmqK+3CjQMf8c+J/Vhv4mdZ2nRyXFw66sAg6qz7VNkaHfDQ==} + engines: {node: '>=v14.16.0'} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@vitest/browser': '*' + '@vitest/ui': '*' + happy-dom: '*' + jsdom: '*' + playwright: '*' + safaridriver: '*' + webdriverio: '*' + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@vitest/browser': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true + playwright: + optional: true + safaridriver: + optional: true + webdriverio: + optional: true + dependencies: + '@types/chai': 4.3.4 + '@types/chai-subset': 1.3.3 + '@types/node': 18.15.9 + '@vitest/expect': 0.29.8 + '@vitest/runner': 0.29.8 + '@vitest/spy': 0.29.8 + '@vitest/utils': 0.29.8 + acorn: 8.8.2 + acorn-walk: 8.2.0 + cac: 6.7.14 + chai: 4.3.7 + debug: 4.3.4 + local-pkg: 0.4.3 + pathe: 1.1.0 + picocolors: 1.0.0 + source-map: 0.6.1 + std-env: 3.3.2 + strip-literal: 1.0.1 + tinybench: 2.4.0 + tinypool: 0.4.0 + tinyspy: 1.1.1 + vite: 4.2.1(@types/node@18.15.9) + vite-node: 0.29.8(@types/node@18.15.9) + why-is-node-running: 2.2.2 + transitivePeerDependencies: + - less + - sass + - stylus + - sugarss + - supports-color + - terser + dev: true + + /webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + dev: true + + /whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + dev: true + + /which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + dependencies: + 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'} dependencies: ansi-styles: 4.3.0 string-width: 4.2.3 strip-ansi: 6.0.1 - dev: false - /y18n/5.0.8: + /wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + dev: true + + /y18n@5.0.8: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} engines: {node: '>=10'} - dev: false - /yargs-parser/20.2.9: + /yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + dev: true + + /yargs-parser@20.2.9: resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} engines: {node: '>=10'} - dev: false - /yargs/16.2.0: + /yargs@16.2.0: resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} engines: {node: '>=10'} dependencies: @@ -617,9 +2178,18 @@ packages: string-width: 4.2.3 y18n: 5.0.8 yargs-parser: 20.2.9 - dev: false - /yn/3.1.1: + /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'} + dev: true + + /yocto-queue@1.0.0: + resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} + engines: {node: '>=12.20'} + dev: true diff --git a/services/delivery/proto b/services/delivery/proto new file mode 120000 index 00000000..4d1e2d8b --- /dev/null +++ b/services/delivery/proto @@ -0,0 +1 @@ +../proto/ \ No newline at end of file diff --git a/services/delivery/src/tests/test.test.ts b/services/delivery/src/tests/test.test.ts new file mode 100644 index 00000000..c348152a --- /dev/null +++ b/services/delivery/src/tests/test.test.ts @@ -0,0 +1,6 @@ +import { describe, expect, test } from "vitest"; + +// simple test to check if the test runner is working +test("test", () => { + expect(true).toBe(true); +}); diff --git a/services/delivery/vitest.config.ts b/services/delivery/vitest.config.ts new file mode 100644 index 00000000..08cfe3bf --- /dev/null +++ b/services/delivery/vitest.config.ts @@ -0,0 +1,7 @@ +import { defineConfig } from "vitest/config"; +import tsconfigPaths from "vite-tsconfig-paths"; + +export default defineConfig({ + plugins: [tsconfigPaths()], + base: "/src/tests", +}); From 89d32f96a53b9b80731532caa8c2f173a6eb00fc Mon Sep 17 00:00:00 2001 From: Florian LEROUX <10078837+floriaaan@users.noreply.github.com> Date: Tue, 4 Apr 2023 10:08:43 +0200 Subject: [PATCH 017/883] build(docker): add Dockerfile --- services/delivery/.dockerignore | 2 ++ services/delivery/.gitignore | 1 + services/delivery/Dockerfile | 42 +++++++++++++++++++++++++++++++++ 3 files changed, 45 insertions(+) create mode 100644 services/delivery/.dockerignore create mode 100644 services/delivery/Dockerfile diff --git a/services/delivery/.dockerignore b/services/delivery/.dockerignore new file mode 100644 index 00000000..dd87e2d7 --- /dev/null +++ b/services/delivery/.dockerignore @@ -0,0 +1,2 @@ +node_modules +build diff --git a/services/delivery/.gitignore b/services/delivery/.gitignore index 378e1eaa..31e50325 100644 --- a/services/delivery/.gitignore +++ b/services/delivery/.gitignore @@ -1,5 +1,6 @@ node_modules/ dist/ +bin/ *.env* !*.env.example diff --git a/services/delivery/Dockerfile b/services/delivery/Dockerfile new file mode 100644 index 00000000..0e62247a --- /dev/null +++ b/services/delivery/Dockerfile @@ -0,0 +1,42 @@ +FROM node:18-alpine as builder + +# Set working directory +WORKDIR /app + +# Copy the package.json and package-lock.json files +COPY package*.json ./ + +# Install dependencies +RUN npm install + + +# Copy the application code +COPY . . + +# Copy the proto files - TODO: fix this, proto files should be copied from goodfood/services/proto +# RUN cp -r -L ../proto /proto/ + +# Generate Prisma client +RUN npx prisma generate + +# Build the application +RUN npm run build + +# Package the application +RUN npm run pkg + +# Create a new image with the application +FROM node:18-alpine as runner + +# Set working directory +WORKDIR /app + +# Copy the application package +COPY --from=builder /app/bin /usr/local/bin +RUN ls /usr/local/bin + +# Expose the gRPC port +EXPOSE 50008 + +# Start the server +CMD ["delivery-linux-x64"] From 5cfad53ac974cb0f315a8aa22035cea0741126bb Mon Sep 17 00:00:00 2001 From: Florian LEROUX <10078837+floriaaan@users.noreply.github.com> Date: Tue, 4 Apr 2023 10:11:51 +0200 Subject: [PATCH 018/883] fix(ci): fix dependencies lock file is not found --- .github/workflows/delivery.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/delivery.yml b/.github/workflows/delivery.yml index a0953866..0f2065b8 100644 --- a/.github/workflows/delivery.yml +++ b/.github/workflows/delivery.yml @@ -18,6 +18,7 @@ jobs: with: node-version: "18.x" cache: "pnpm" + cache-dependency-path: services/delivery/pnpm-lock.yaml - name: Install dependencies run: | cd ./services/delivery @@ -39,6 +40,7 @@ jobs: with: node-version: "18.x" cache: "pnpm" + cache-dependency-path: services/delivery/pnpm-lock.yaml - name: Install dependencies run: | cd ./services/delivery From 7c99a5ffa196f6092db984e0672c4815faed14f1 Mon Sep 17 00:00:00 2001 From: Florian LEROUX <10078837+floriaaan@users.noreply.github.com> Date: Sun, 9 Apr 2023 00:27:02 +0200 Subject: [PATCH 019/883] feat(handlers): add delivery-person handlers --- .github/workflows/delivery.yml | 1 - services/delivery/README.md | 2 +- services/delivery/prisma/schema.prisma | 2 +- .../delivery/src/handlers/delivery/create.ts | 3 +- .../delivery/src/handlers/delivery/delete.ts | 3 +- .../delivery/src/handlers/delivery/get.ts | 3 +- .../handlers/delivery/list-by-restaurant.ts | 3 +- .../src/handlers/delivery/list-by-user.ts | 3 +- .../delivery/src/handlers/delivery/update.ts | 3 +- .../delivery/src/handlers/person/create.ts | 29 ++++++++ .../delivery/src/handlers/person/delete.ts | 19 +++++ services/delivery/src/handlers/person/get.ts | 21 ++++++ .../delivery/src/handlers/person/index.ts | 15 ++++ .../delivery/src/handlers/person/list-near.ts | 72 +++++++++++++++++++ services/delivery/src/handlers/person/list.ts | 17 +++++ .../delivery/src/handlers/person/update.ts | 30 ++++++++ services/delivery/src/server.ts | 3 +- .../delivery/src/types/delivery-person.d.ts | 14 ++++ services/delivery/src/types/delivery.d.ts | 12 +--- services/delivery/src/types/index.d.ts | 9 +++ services/proto/delivery.proto | 4 +- 21 files changed, 245 insertions(+), 23 deletions(-) create mode 100644 services/delivery/src/handlers/person/create.ts create mode 100644 services/delivery/src/handlers/person/delete.ts create mode 100644 services/delivery/src/handlers/person/get.ts create mode 100644 services/delivery/src/handlers/person/index.ts create mode 100644 services/delivery/src/handlers/person/list-near.ts create mode 100644 services/delivery/src/handlers/person/list.ts create mode 100644 services/delivery/src/handlers/person/update.ts create mode 100644 services/delivery/src/types/index.d.ts diff --git a/.github/workflows/delivery.yml b/.github/workflows/delivery.yml index 0f2065b8..53b4ba53 100644 --- a/.github/workflows/delivery.yml +++ b/.github/workflows/delivery.yml @@ -53,7 +53,6 @@ jobs: publish: runs-on: ubuntu-latest needs: [build, test] - if: ${{ success() }} && ${{ github.ref == 'refs/heads/dev' || github.ref == 'refs/heads/main' }} steps: - name: Checkout code uses: actions/checkout@v2 diff --git a/services/delivery/README.md b/services/delivery/README.md index 69965be6..6f933c51 100644 --- a/services/delivery/README.md +++ b/services/delivery/README.md @@ -5,7 +5,7 @@ | **Port:** 50008 | | **Developer:** @floriaaan | | **Status:** In progress | -| **Last update:** 2023-04-04 | +| **Last update:** 2023-04-09 | | **Language:** NodeJS | | **Dependencies:** TypeScript, Prisma, gRPC, Postgres | | **Models:** (see [`prisma/schema.prisma`](./prisma/schema.prisma)) | diff --git a/services/delivery/prisma/schema.prisma b/services/delivery/prisma/schema.prisma index 0d7939f5..02929eb8 100644 --- a/services/delivery/prisma/schema.prisma +++ b/services/delivery/prisma/schema.prisma @@ -21,7 +21,7 @@ model Delivery { address String status Status @default(PENDING) - person DeliveryPerson @relation(fields: [delivery_person_id], references: [id]) + delivery_person DeliveryPerson @relation(fields: [delivery_person_id], references: [id]) delivery_person_id String user_id String diff --git a/services/delivery/src/handlers/delivery/create.ts b/services/delivery/src/handlers/delivery/create.ts index 1ad90069..ba0a4b6a 100644 --- a/services/delivery/src/handlers/delivery/create.ts +++ b/services/delivery/src/handlers/delivery/create.ts @@ -1,6 +1,7 @@ import { prisma } from "@delivery/lib/prisma"; import { log } from "@delivery/lib/log"; -import { Data, DeliveryCreateInput } from "@delivery/types/delivery"; +import { DeliveryCreateInput } from "@delivery/types/delivery"; +import { Data } from "@delivery/types"; export const CreateDelivery = async ( { request }: Data, diff --git a/services/delivery/src/handlers/delivery/delete.ts b/services/delivery/src/handlers/delivery/delete.ts index cdeee90b..35b5ade7 100644 --- a/services/delivery/src/handlers/delivery/delete.ts +++ b/services/delivery/src/handlers/delivery/delete.ts @@ -1,6 +1,7 @@ import { prisma } from "@delivery/lib/prisma"; import { log } from "@delivery/lib/log"; -import { Data, DeliveryId } from "@delivery/types/delivery"; +import { DeliveryId } from "@delivery/types/delivery"; +import { Data } from "@delivery/types"; export const DeleteDelivery = async ( data: Data, diff --git a/services/delivery/src/handlers/delivery/get.ts b/services/delivery/src/handlers/delivery/get.ts index cde931dd..4f7d37a5 100644 --- a/services/delivery/src/handlers/delivery/get.ts +++ b/services/delivery/src/handlers/delivery/get.ts @@ -1,6 +1,7 @@ import { prisma } from "@delivery/lib/prisma"; import { log } from "@delivery/lib/log"; -import { Data, DeliveryId } from "@delivery/types/delivery"; +import { DeliveryId } from "@delivery/types/delivery"; +import { Data } from "@delivery/types"; export const GetDelivery = async ( data: Data, diff --git a/services/delivery/src/handlers/delivery/list-by-restaurant.ts b/services/delivery/src/handlers/delivery/list-by-restaurant.ts index 879bb285..76aaa464 100644 --- a/services/delivery/src/handlers/delivery/list-by-restaurant.ts +++ b/services/delivery/src/handlers/delivery/list-by-restaurant.ts @@ -1,6 +1,7 @@ import { prisma } from "@delivery/lib/prisma"; import { log } from "@delivery/lib/log"; -import { Data, RestaurantId } from "@delivery/types/delivery"; +import { RestaurantId } from "@delivery/types/delivery"; +import { Data } from "@delivery/types"; export const ListDeliveriesByRestaurant = async ( data: Data, diff --git a/services/delivery/src/handlers/delivery/list-by-user.ts b/services/delivery/src/handlers/delivery/list-by-user.ts index 8c220175..30b5e3e1 100644 --- a/services/delivery/src/handlers/delivery/list-by-user.ts +++ b/services/delivery/src/handlers/delivery/list-by-user.ts @@ -1,6 +1,7 @@ import { prisma } from "@delivery/lib/prisma"; import { log } from "@delivery/lib/log"; -import { Data, UserId } from "@delivery/types/delivery"; +import { UserId } from "@delivery/types/delivery"; +import { Data } from "@delivery/types"; export const ListDeliveriesByUser = async ( data: Data, diff --git a/services/delivery/src/handlers/delivery/update.ts b/services/delivery/src/handlers/delivery/update.ts index d08d2bd2..41f4c8c9 100644 --- a/services/delivery/src/handlers/delivery/update.ts +++ b/services/delivery/src/handlers/delivery/update.ts @@ -1,6 +1,7 @@ import { prisma } from "@delivery/lib/prisma"; import { log } from "@delivery/lib/log"; -import { Data, Delivery } from "@delivery/types/delivery"; +import { Delivery } from "@delivery/types/delivery"; +import { Data } from "@delivery/types"; export const UpdateDelivery = async ( data: Data, diff --git a/services/delivery/src/handlers/person/create.ts b/services/delivery/src/handlers/person/create.ts new file mode 100644 index 00000000..1a918438 --- /dev/null +++ b/services/delivery/src/handlers/person/create.ts @@ -0,0 +1,29 @@ +import { log } from "@delivery/lib/log"; +import prisma from "@delivery/lib/prisma"; +import { Data } from "@delivery/types"; +import { DeliveryPersonCreateInput } from "@delivery/types/delivery-person"; + +export const CreateDeliveryPerson = async ( + { request }: Data, + callback: (err: any, response: any) => void +) => { + log.debug("request received at CreateDeliveryPerson handler\n", request); + try { + const { first_name, last_name, phone, location } = request; + + const deliveryPerson = await prisma.deliveryPerson.create({ + data: { + first_name, + last_name, + phone, + location: { + set: location, + }, + }, + }); + callback(null, deliveryPerson); + } catch (error) { + log.error(error); + callback(error, null); + } +}; diff --git a/services/delivery/src/handlers/person/delete.ts b/services/delivery/src/handlers/person/delete.ts new file mode 100644 index 00000000..9edfd117 --- /dev/null +++ b/services/delivery/src/handlers/person/delete.ts @@ -0,0 +1,19 @@ +import { log } from "@delivery/lib/log"; +import prisma from "@delivery/lib/prisma"; +import { Data } from "@delivery/types"; +import { DeliveryPersonId } from "@delivery/types/delivery-person"; + +export const DeleteDeliveryPerson = async ( + { request }: Data, + callback: (err: any, response: any) => void +) => { + log.debug("request received at DeleteDeliveryPerson handler\n", request); + try { + const { id } = request; + await prisma.deliveryPerson.delete({ where: { id } }); + callback(null, {}); + } catch (error) { + log.error(error); + callback(error, null); + } +}; diff --git a/services/delivery/src/handlers/person/get.ts b/services/delivery/src/handlers/person/get.ts new file mode 100644 index 00000000..e94093df --- /dev/null +++ b/services/delivery/src/handlers/person/get.ts @@ -0,0 +1,21 @@ +import { log } from "@delivery/lib/log"; +import prisma from "@delivery/lib/prisma"; +import { Data } from "@delivery/types"; +import { DeliveryPersonId } from "@delivery/types/delivery-person"; + +export const GetDeliveryPerson = async ( + { request }: Data, + callback: (err: any, response: any) => void +) => { + log.debug("request received at GetDeliveryPerson handler\n", request); + try { + const { id } = request; + const deliveryPerson = await prisma.deliveryPerson.findUnique({ + where: { id }, + }); + callback(null, deliveryPerson); + } catch (error) { + log.error(error); + callback(error, null); + } +}; diff --git a/services/delivery/src/handlers/person/index.ts b/services/delivery/src/handlers/person/index.ts new file mode 100644 index 00000000..7270442c --- /dev/null +++ b/services/delivery/src/handlers/person/index.ts @@ -0,0 +1,15 @@ +import { CreateDeliveryPerson } from "@delivery/handlers/person/create"; +import { GetDeliveryPerson } from "@delivery/handlers/person/get"; +import { UpdateDeliveryPerson } from "@delivery/handlers/person/update"; +import { DeleteDeliveryPerson } from "@delivery/handlers/person/delete"; +import { ListDeliveryPersons } from "@delivery/handlers/person/list"; +import { ListNearDeliveryPersons } from "@delivery/handlers/person/list-near"; + +export default { + CreateDeliveryPerson, + GetDeliveryPerson, + UpdateDeliveryPerson, + DeleteDeliveryPerson, + ListDeliveryPersons, + ListNearDeliveryPersons, +}; diff --git a/services/delivery/src/handlers/person/list-near.ts b/services/delivery/src/handlers/person/list-near.ts new file mode 100644 index 00000000..900e5ac9 --- /dev/null +++ b/services/delivery/src/handlers/person/list-near.ts @@ -0,0 +1,72 @@ +import { prisma } from "@delivery/lib/prisma"; +import { log } from "@delivery/lib/log"; +import { Data } from "@delivery/types"; +import { LocationInput } from "@delivery/types/delivery-person"; + +export const ListNearDeliveryPersons = async ( + { request }: Data, + callback: (err: any, response: any) => void +) => { + log.debug("request received at ListNearDeliveryPersons handler\n", request); + try { + const { latitude, longitude } = request; + const maxDistance = 10; // in km //TODO: make this a parameter + + const query = await prisma.deliveryPerson.findMany(); + const delivery_persons = query.filter(deliveryPerson => { + const distance = calculateDistance(latitude, longitude, deliveryPerson.location[0], deliveryPerson.location[1]); + return distance <= maxDistance; + });; + + callback(null, { delivery_persons }); + } catch (error) { + log.error(error); + callback(error, null); + } +}; + +/** + * Could use this raw query using Haversine formula to get locations within a radius: + * SELECT * + FROM "DeliveryPerson" + WHERE 6371 * 2 * ASIN(SQRT(POWER(SIN((latitude - $1) * pi()/180 / 2), 2) + COS(latitude * pi()/180) * COS($1 * pi()/180) * POWER(SIN((longitude - $2) * pi()/180 / 2), 2))) <= $3; + * with $1 = latitude, $2 = longitude, $3 = distance + + The Haversine formula is given by: + ``` + a = POWER(SIN((latitude2 - latitude1) * pi()/180 / 2), 2) + COS(latitude1 * pi()/180) * COS(latitude2 * pi()/180) * POWER(SIN((longitude2 - longitude1) * pi()/180 / 2), 2) + c = 2 * ASIN(SQRT(a)) + d = R * c + ``` + where latitude1 and longitude1 are the coordinates of the first point, latitude2 and longitude2 are the coordinates of the second point, R is the radius of the Earth (in this case, we are using the value 6371 which is the average radius of the Earth in kilometers), a is the square of half the chord length between the points (in radians), c is the angular distance in radians, and d is the distance between the two points in kilometers. + */ + +const EARTH_RADIUS_KM = 6371; + +function toRadians(degrees: number) { + return (degrees * Math.PI) / 180; +} + +function calculateDistance( + latitude1: number, + longitude1: number, + latitude2: number, + longitude2: number +) { + const radLat1 = toRadians(latitude1); + const radLat2 = toRadians(latitude2); + const radDeltaLat = toRadians(latitude2 - latitude1); + const radDeltaLon = toRadians(longitude2 - longitude1); + + const a = + Math.sin(radDeltaLat / 2) * Math.sin(radDeltaLat / 2) + + Math.cos(radLat1) * + Math.cos(radLat2) * + Math.sin(radDeltaLon / 2) * + Math.sin(radDeltaLon / 2); + + const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a)); + const distance = EARTH_RADIUS_KM * c; + + return distance; +} diff --git a/services/delivery/src/handlers/person/list.ts b/services/delivery/src/handlers/person/list.ts new file mode 100644 index 00000000..468ea5e3 --- /dev/null +++ b/services/delivery/src/handlers/person/list.ts @@ -0,0 +1,17 @@ +import { log } from "@delivery/lib/log"; +import prisma from "@delivery/lib/prisma"; +import { Data } from "@delivery/types"; + +export const ListDeliveryPersons = async ( + { request }: Data<{}>, + callback: (err: any, response: any) => void +) => { + log.debug("request received at ListDeliveryPersons handler\n", request); + try { + const delivery_persons = await prisma.deliveryPerson.findMany(); + callback(null, { delivery_persons }); + } catch (error) { + log.error(error); + callback(error, null); + } +}; diff --git a/services/delivery/src/handlers/person/update.ts b/services/delivery/src/handlers/person/update.ts new file mode 100644 index 00000000..7a6b1743 --- /dev/null +++ b/services/delivery/src/handlers/person/update.ts @@ -0,0 +1,30 @@ +import { log } from "@delivery/lib/log"; +import prisma from "@delivery/lib/prisma"; +import { Data } from "@delivery/types"; +import { DeliveryPerson } from "@delivery/types/delivery-person"; + +export const UpdateDeliveryPerson = async ( + { request }: Data, + callback: (err: any, response: any) => void +) => { + log.debug("request received at UpdateDeliveryPerson handler\n", request); + try { + const { id, first_name, last_name, location, phone } = request; + + const deliveryPerson = await prisma.deliveryPerson.update({ + where: { id }, + data: { + first_name, + last_name, + phone, + location: { + set: location, + }, + }, + }); + callback(null, deliveryPerson); + } catch (error) { + log.error(error); + callback(error, null); + } +}; diff --git a/services/delivery/src/server.ts b/services/delivery/src/server.ts index 2eac6c38..01d48fd7 100644 --- a/services/delivery/src/server.ts +++ b/services/delivery/src/server.ts @@ -8,6 +8,7 @@ import { options } from "@delivery/resources/protoloader-options"; import { serverInsecure } from "@delivery/resources/grpc-credentials"; import deliveryHandlers from "@delivery/handlers/delivery"; +import personHandlers from "@delivery/handlers/person"; const PORT = process.env.PORT || 50008; const ADDRESS = `0.0.0.0:${PORT}`; @@ -18,7 +19,7 @@ const { delivery } = loadPackageDefinition(packageDefinition) as any; // todo: f const server = new Server(); server.addService(delivery.DeliveryService.service, deliveryHandlers); -server.addService(delivery.DeliveryPersonService.service, {}); +server.addService(delivery.DeliveryPersonService.service, personHandlers); server.bindAsync(ADDRESS, serverInsecure, () => { server.start(); diff --git a/services/delivery/src/types/delivery-person.d.ts b/services/delivery/src/types/delivery-person.d.ts index a897860e..5bb6731d 100644 --- a/services/delivery/src/types/delivery-person.d.ts +++ b/services/delivery/src/types/delivery-person.d.ts @@ -9,3 +9,17 @@ export type DeliveryPerson = { deliveries: Delivery[]; }; + +export type DeliveryPersonCreateInput = { + first_name: string; + last_name: string; + phone: string; + location: [number, number]; +}; + +export type LocationInput = { + latitude: number; + longitude: number; +}; + +export type DeliveryPersonId = { id: DeliveryPerson["id"] }; diff --git a/services/delivery/src/types/delivery.d.ts b/services/delivery/src/types/delivery.d.ts index 333462d6..59ff1d82 100644 --- a/services/delivery/src/types/delivery.d.ts +++ b/services/delivery/src/types/delivery.d.ts @@ -1,16 +1,6 @@ import { DeliveryPerson } from "@delivery/types/delivery-person"; import { Status } from "@prisma/client"; -export type Data = { - request: T; -}; - -export type Stream = { - write: (data: any) => void; - end: () => void; - request: T; -}; - export type DeliveryCreateInput = { eta: string; address: string; @@ -23,7 +13,7 @@ export type DeliveryCreateInput = { }; export type DeliveryId = { - id: string; + id: Delivery["id"]; }; export type Delivery = { diff --git a/services/delivery/src/types/index.d.ts b/services/delivery/src/types/index.d.ts new file mode 100644 index 00000000..5f91a217 --- /dev/null +++ b/services/delivery/src/types/index.d.ts @@ -0,0 +1,9 @@ +export type Data = { + request: T; +}; + +export type Stream = { + write: (data: any) => void; + end: () => void; + request: T; +}; diff --git a/services/proto/delivery.proto b/services/proto/delivery.proto index f4906434..91a86b21 100644 --- a/services/proto/delivery.proto +++ b/services/proto/delivery.proto @@ -10,7 +10,7 @@ message Delivery { string address = 3; Status status = 4; - DeliveryPerson person = 5; + DeliveryPerson delivery_person = 5; string delivery_person_id = 6; string user_id = 7; @@ -80,7 +80,7 @@ message DeliveryList { } message DeliveryPersonList { - repeated DeliveryPersonList persons = 1; + repeated DeliveryPersonList delivery_persons = 1; } message DeliveryPersonId { From fdf48b81344a6b7dd27b4519f7b60e44b7dc21c0 Mon Sep 17 00:00:00 2001 From: Florian LEROUX <10078837+floriaaan@users.noreply.github.com> Date: Mon, 10 Apr 2023 11:29:33 +0200 Subject: [PATCH 020/883] feat(tf): add terraform files --- services/delivery/terraform/data.tf | 17 +++++ .../terraform/env/dev-backend.tfvars.example | 4 + .../delivery/terraform/env/dev.tfvars.example | 1 + services/delivery/terraform/main.tf | 74 +++++++++++++++++++ services/delivery/terraform/outputs.tf | 6 ++ services/delivery/terraform/variables.tf | 16 ++++ terraform/outputs.tf | 4 +- 7 files changed, 120 insertions(+), 2 deletions(-) create mode 100644 services/delivery/terraform/data.tf create mode 100644 services/delivery/terraform/env/dev-backend.tfvars.example create mode 100644 services/delivery/terraform/env/dev.tfvars.example create mode 100644 services/delivery/terraform/main.tf create mode 100644 services/delivery/terraform/outputs.tf create mode 100644 services/delivery/terraform/variables.tf diff --git a/services/delivery/terraform/data.tf b/services/delivery/terraform/data.tf new file mode 100644 index 00000000..adf0b7fd --- /dev/null +++ b/services/delivery/terraform/data.tf @@ -0,0 +1,17 @@ +data "azurerm_resource_group" "rg-goodfood" { + name = "rg-${var.project_name}${var.environnment_suffix}" +} + +data "azurerm_key_vault" "kv-goodfood-delivery" { + resource_group_name = data.azurerm_resource_group.rg-goodfood.name + name = "kv-${var.project_name}" +} + +data "azurerm_key_vault_secret" "delivery-db-login" { + name = "delivery-db-login" + key_vault_id = data.azurerm_key_vault.kv-goodfood-delivery.id +} +data "azurerm_key_vault_secret" "delivery-db-password" { + name = "delivery-db-password" + key_vault_id = data.azurerm_key_vault.kv-goodfood-delivery.id +} \ No newline at end of file diff --git a/services/delivery/terraform/env/dev-backend.tfvars.example b/services/delivery/terraform/env/dev-backend.tfvars.example new file mode 100644 index 00000000..e0cce6f6 --- /dev/null +++ b/services/delivery/terraform/env/dev-backend.tfvars.example @@ -0,0 +1,4 @@ +resource_group_name = "rg-goodfood-dev" +storage_account_name = "sa-goodfood-states" +container_name = "tfstate" +key = "delivery-dev.tfstate" diff --git a/services/delivery/terraform/env/dev.tfvars.example b/services/delivery/terraform/env/dev.tfvars.example new file mode 100644 index 00000000..4ac1f44d --- /dev/null +++ b/services/delivery/terraform/env/dev.tfvars.example @@ -0,0 +1 @@ +environnment_suffix = "-dev" diff --git a/services/delivery/terraform/main.tf b/services/delivery/terraform/main.tf new file mode 100644 index 00000000..944f2393 --- /dev/null +++ b/services/delivery/terraform/main.tf @@ -0,0 +1,74 @@ +terraform { + required_providers { + azurerm = { + source = "hashicorp/azurerm" + version = "3.48.0" + } + } + backend "azurerm" {} +} + +provider "azurerm" { + features { + key_vault { + purge_soft_deleted_secrets_on_destroy = true + recover_soft_deleted_secrets = true + } + } +} + +resource "azurerm_key_vault" "kv-goodfood-delivery" { + name = "kv-goodfood-delivery" + location = data.azurerm_resource_group.rg-goodfood.location + resource_group_name = data.azurerm_resource_group.rg-goodfood.name + tenant_id = data.azurerm_client_config.current.tenant_id + sku_name = "standard" + soft_delete_retention_days = 7 + + access_policy { + tenant_id = data.azurerm_client_config.current.tenant_id + object_id = data.azurerm_client_config.current.object_id + + key_permissions = [ + "Create", + "Get", + ] + + secret_permissions = [ + "Set", + "Get", + "Delete", + "Purge", + "Recover" + ] + } +} + +resource "azurerm_postgresql_server" "pg-goodfood-delivery" { + name = "pg-goodfood-delivery${var.environnment_suffix}" + location = data.azurerm_resource_group.rg-goodfood.location + resource_group_name = data.azurerm_resource_group.rg-goodfood.name + + sku_name = "B_Gen5_2" + + storage_mb = 5120 + backup_retention_days = 7 + geo_redundant_backup_enabled = false + auto_grow_enabled = true + + administrator_login = data.azurerm_key_vault_secret.delivery-db-login.value + administrator_login_password = data.azurerm_key_vault_secret.delivery-db-password.value + version = "11" + + ssl_enforcement_enabled = false + ssl_minimal_tls_version_enforced = "TLSEnforcementDisabled" // TODO: change to TLS1_2 + +} + +resource "azurerm_postgresql_firewall_rule" "pgfw-goodfood-delivery" { + name = "allow-azure-resources" + resource_group_name = data.azurerm_resource_group.rg-goodfood.name + server_name = azurerm_postgresql_server.pg-goodfood-delivery.name + start_ip_address = "0.0.0.0" + end_ip_address = "0.0.0.0" +} diff --git a/services/delivery/terraform/outputs.tf b/services/delivery/terraform/outputs.tf new file mode 100644 index 00000000..a2d60616 --- /dev/null +++ b/services/delivery/terraform/outputs.tf @@ -0,0 +1,6 @@ +output "main-rg-name" { + value = data.azurerm_resource_group.rg-goodfood.name +} +output "main-rg-id" { + value = data.azurerm_resource_group.rg-goodfood.id +} \ No newline at end of file diff --git a/services/delivery/terraform/variables.tf b/services/delivery/terraform/variables.tf new file mode 100644 index 00000000..65fd7547 --- /dev/null +++ b/services/delivery/terraform/variables.tf @@ -0,0 +1,16 @@ +variable "environnment_suffix" { + type = string + description = "The suffix to append to the environment name" +} + +variable "location" { + type = string + description = "The location/region where all resources in this environment should be created" + default = "West Europe" +} + +variable "project_name" { + type = string + description = "The name of the project" + default = "goodfood" +} \ No newline at end of file diff --git a/terraform/outputs.tf b/terraform/outputs.tf index e4f4b633..aa5afd79 100644 --- a/terraform/outputs.tf +++ b/terraform/outputs.tf @@ -1,8 +1,8 @@ output "main-rg-name" { - value = data.azurerm_resource_group.rg-fleroux.name + value = data.azurerm_resource_group.rg-goodfood.name } output "main-rg-id" { - value = data.azurerm_resource_group.rg-fleroux.id + value = data.azurerm_resource_group.rg-goodfood.id } output "client_certificate" { From a0c6c49b559324fa973d5018966dc6ed1b8f0b55 Mon Sep 17 00:00:00 2001 From: Florian LEROUX <10078837+floriaaan@users.noreply.github.com> Date: Mon, 10 Apr 2023 11:36:35 +0200 Subject: [PATCH 021/883] feat(k8s): add k8s files --- services/delivery/k8s/configmap.yml | 8 ++++++++ services/delivery/k8s/deployment.yml | 30 ++++++++++++++++++++++++++++ services/delivery/k8s/hpa.yml | 18 +++++++++++++++++ services/delivery/k8s/ingress.yml | 17 ++++++++++++++++ services/delivery/k8s/service.yml | 13 ++++++++++++ 5 files changed, 86 insertions(+) create mode 100644 services/delivery/k8s/configmap.yml create mode 100644 services/delivery/k8s/deployment.yml create mode 100644 services/delivery/k8s/hpa.yml create mode 100644 services/delivery/k8s/ingress.yml create mode 100644 services/delivery/k8s/service.yml diff --git a/services/delivery/k8s/configmap.yml b/services/delivery/k8s/configmap.yml new file mode 100644 index 00000000..9b5ee3bd --- /dev/null +++ b/services/delivery/k8s/configmap.yml @@ -0,0 +1,8 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: goodfood-delivery-configmap + labels: + app: goodfood-delivery +data: + port: "50008" \ No newline at end of file diff --git a/services/delivery/k8s/deployment.yml b/services/delivery/k8s/deployment.yml new file mode 100644 index 00000000..53722f26 --- /dev/null +++ b/services/delivery/k8s/deployment.yml @@ -0,0 +1,30 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: goodfood-delivery + labels: + app: goodfood-delivery +spec: + selector: + matchLabels: + app: goodfood-delivery + template: + metadata: + labels: + app: goodfood-delivery + spec: + containers: + - name: goodfood-delivery + image: floriaaan/goodfood-delivery:1.0 + resources: + limits: + memory: "128Mi" + cpu: "200m" + env: + - name: PORT + valueFrom: + configMapKeyRef: + name: goodfood-delivery-configmap + key: port + ports: + - containerPort: 3000 diff --git a/services/delivery/k8s/hpa.yml b/services/delivery/k8s/hpa.yml new file mode 100644 index 00000000..2bc29783 --- /dev/null +++ b/services/delivery/k8s/hpa.yml @@ -0,0 +1,18 @@ +apiVersion: autoscaling/v2 +kind: HorizontalPodAutoscaler +metadata: + name: goodfood-delivery-hpa +spec: + scaleTargetRef: + apiVersion: apps/v1 + kind: Deployment + name: goodfood-delivery + minReplicas: 1 + maxReplicas: 3 + metrics: + - type: Resource + resource: + name: cpu + target: + type: Utilization + averageUtilization: 50 diff --git a/services/delivery/k8s/ingress.yml b/services/delivery/k8s/ingress.yml new file mode 100644 index 00000000..e246d6c4 --- /dev/null +++ b/services/delivery/k8s/ingress.yml @@ -0,0 +1,17 @@ +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + name: goodfood-delivery +spec: + ingressClassName: nginx + rules: + - host: delivery.localdev.me + http: + paths: + - pathType: Prefix + backend: + service: + name: goodfood-delivery + port: + number: 50008 + path: / \ No newline at end of file diff --git a/services/delivery/k8s/service.yml b/services/delivery/k8s/service.yml new file mode 100644 index 00000000..32cb13c9 --- /dev/null +++ b/services/delivery/k8s/service.yml @@ -0,0 +1,13 @@ +apiVersion: v1 +kind: Service +metadata: + name: goodfood-delivery +spec: + selector: + app: goodfood-delivery + ports: + - name: "grpc" + port: 50008 + targetPort: 50008 +status: + loadBalancer: {} From acc7c2427070246e5e09dbdcc0da14078c9c94c2 Mon Sep 17 00:00:00 2001 From: Florian LEROUX <10078837+floriaaan@users.noreply.github.com> Date: Mon, 10 Apr 2023 14:34:43 +0200 Subject: [PATCH 022/883] ci: add tests (but test script is disabeld) --- package.json | 5 + pnpm-lock.yaml | 794 ++++++++++++++++++ services/delivery/package.json | 5 +- services/delivery/pnpm-lock.yaml | 22 + .../delivery/src/client/delivery/create.ts | 34 +- services/delivery/src/lib/mocks/prisma.ts | 23 + services/delivery/src/server.ts | 3 + .../src/tests/grpc/create-delivery.test.ts | 84 ++ .../src/tests/prisma/delivery.test.ts | 36 + services/delivery/src/tests/setup.ts | 13 + services/delivery/src/tests/test.test.ts | 6 - services/delivery/vitest.config.ts | 3 + 12 files changed, 1007 insertions(+), 21 deletions(-) create mode 100644 package.json create mode 100644 pnpm-lock.yaml create mode 100644 services/delivery/src/lib/mocks/prisma.ts create mode 100644 services/delivery/src/tests/grpc/create-delivery.test.ts create mode 100644 services/delivery/src/tests/prisma/delivery.test.ts create mode 100644 services/delivery/src/tests/setup.ts delete mode 100644 services/delivery/src/tests/test.test.ts diff --git a/package.json b/package.json new file mode 100644 index 00000000..47832f15 --- /dev/null +++ b/package.json @@ -0,0 +1,5 @@ +{ + "devDependencies": { + "vitest-mock-extended": "^1.1.3" + } +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 00000000..cccf0383 --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,794 @@ +lockfileVersion: '6.0' + +devDependencies: + vitest-mock-extended: + specifier: ^1.1.3 + version: 1.1.3(typescript@5.0.4)(vitest@0.30.0) + +packages: + + /@esbuild/android-arm64@0.17.16: + resolution: {integrity: sha512-QX48qmsEZW+gcHgTmAj+x21mwTz8MlYQBnzF6861cNdQGvj2jzzFjqH0EBabrIa/WVZ2CHolwMoqxVryqKt8+Q==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-arm@0.17.16: + resolution: {integrity: sha512-baLqRpLe4JnKrUXLJChoTN0iXZH7El/mu58GE3WIA6/H834k0XWvLRmGLG8y8arTRS9hJJibPnF0tiGhmWeZgw==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-x64@0.17.16: + resolution: {integrity: sha512-G4wfHhrrz99XJgHnzFvB4UwwPxAWZaZBOFXh+JH1Duf1I4vIVfuYY9uVLpx4eiV2D/Jix8LJY+TAdZ3i40tDow==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-arm64@0.17.16: + resolution: {integrity: sha512-/Ofw8UXZxuzTLsNFmz1+lmarQI6ztMZ9XktvXedTbt3SNWDn0+ODTwxExLYQ/Hod91EZB4vZPQJLoqLF0jvEzA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-x64@0.17.16: + resolution: {integrity: sha512-SzBQtCV3Pdc9kyizh36Ol+dNVhkDyIrGb/JXZqFq8WL37LIyrXU0gUpADcNV311sCOhvY+f2ivMhb5Tuv8nMOQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-arm64@0.17.16: + resolution: {integrity: sha512-ZqftdfS1UlLiH1DnS2u3It7l4Bc3AskKeu+paJSfk7RNOMrOxmeFDhLTMQqMxycP1C3oj8vgkAT6xfAuq7ZPRA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-x64@0.17.16: + resolution: {integrity: sha512-rHV6zNWW1tjgsu0dKQTX9L0ByiJHHLvQKrWtnz8r0YYJI27FU3Xu48gpK2IBj1uCSYhJ+pEk6Y0Um7U3rIvV8g==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm64@0.17.16: + resolution: {integrity: sha512-8yoZhGkU6aHu38WpaM4HrRLTFc7/VVD9Q2SvPcmIQIipQt2I/GMTZNdEHXoypbbGao5kggLcxg0iBKjo0SQYKA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm@0.17.16: + resolution: {integrity: sha512-n4O8oVxbn7nl4+m+ISb0a68/lcJClIbaGAoXwqeubj/D1/oMMuaAXmJVfFlRjJLu/ZvHkxoiFJnmbfp4n8cdSw==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ia32@0.17.16: + resolution: {integrity: sha512-9ZBjlkdaVYxPNO8a7OmzDbOH9FMQ1a58j7Xb21UfRU29KcEEU3VTHk+Cvrft/BNv0gpWJMiiZ/f4w0TqSP0gLA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-loong64@0.17.16: + resolution: {integrity: sha512-TIZTRojVBBzdgChY3UOG7BlPhqJz08AL7jdgeeu+kiObWMFzGnQD7BgBBkWRwOtKR1i2TNlO7YK6m4zxVjjPRQ==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-mips64el@0.17.16: + resolution: {integrity: sha512-UPeRuFKCCJYpBbIdczKyHLAIU31GEm0dZl1eMrdYeXDH+SJZh/i+2cAmD3A1Wip9pIc5Sc6Kc5cFUrPXtR0XHA==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ppc64@0.17.16: + resolution: {integrity: sha512-io6yShgIEgVUhExJejJ21xvO5QtrbiSeI7vYUnr7l+v/O9t6IowyhdiYnyivX2X5ysOVHAuyHW+Wyi7DNhdw6Q==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-riscv64@0.17.16: + resolution: {integrity: sha512-WhlGeAHNbSdG/I2gqX2RK2gfgSNwyJuCiFHMc8s3GNEMMHUI109+VMBfhVqRb0ZGzEeRiibi8dItR3ws3Lk+cA==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-s390x@0.17.16: + resolution: {integrity: sha512-gHRReYsJtViir63bXKoFaQ4pgTyah4ruiMRQ6im9YZuv+gp3UFJkNTY4sFA73YDynmXZA6hi45en4BGhNOJUsw==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-x64@0.17.16: + resolution: {integrity: sha512-mfiiBkxEbUHvi+v0P+TS7UnA9TeGXR48aK4XHkTj0ZwOijxexgMF01UDFaBX7Q6CQsB0d+MFNv9IiXbIHTNd4g==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/netbsd-x64@0.17.16: + resolution: {integrity: sha512-n8zK1YRDGLRZfVcswcDMDM0j2xKYLNXqei217a4GyBxHIuPMGrrVuJ+Ijfpr0Kufcm7C1k/qaIrGy6eG7wvgmA==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/openbsd-x64@0.17.16: + resolution: {integrity: sha512-lEEfkfsUbo0xC47eSTBqsItXDSzwzwhKUSsVaVjVji07t8+6KA5INp2rN890dHZeueXJAI8q0tEIfbwVRYf6Ew==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/sunos-x64@0.17.16: + resolution: {integrity: sha512-jlRjsuvG1fgGwnE8Afs7xYDnGz0dBgTNZfgCK6TlvPH3Z13/P5pi6I57vyLE8qZYLrGVtwcm9UbUx1/mZ8Ukag==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-arm64@0.17.16: + resolution: {integrity: sha512-TzoU2qwVe2boOHl/3KNBUv2PNUc38U0TNnzqOAcgPiD/EZxT2s736xfC2dYQbszAwo4MKzzwBV0iHjhfjxMimg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-ia32@0.17.16: + resolution: {integrity: sha512-B8b7W+oo2yb/3xmwk9Vc99hC9bNolvqjaTZYEfMQhzdpBsjTvZBlXQ/teUE55Ww6sg//wlcDjOaqldOKyigWdA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-x64@0.17.16: + resolution: {integrity: sha512-xJ7OH/nanouJO9pf03YsL9NAFQBHd8AqfrQd7Pf5laGyyTt/gToul6QYOA/i5i/q8y9iaM5DQFNTgpi995VkOg==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@jridgewell/sourcemap-codec@1.4.15: + resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + dev: true + + /@types/chai-subset@1.3.3: + resolution: {integrity: sha512-frBecisrNGz+F4T6bcc+NLeolfiojh5FxW2klu669+8BARtyQv2C/GkNW6FUodVe4BroGMP/wER/YDGc7rEllw==} + dependencies: + '@types/chai': 4.3.4 + dev: true + + /@types/chai@4.3.4: + resolution: {integrity: sha512-KnRanxnpfpjUTqTCXslZSEdLfXExwgNxYPdiO2WGUj8+HDjFi8R3k5RVKPeSCzLjCcshCAtVO2QBbVuAV4kTnw==} + dev: true + + /@types/node@18.15.11: + resolution: {integrity: sha512-E5Kwq2n4SbMzQOn6wnmBjuK9ouqlURrcZDVfbo9ftDDTFt3nk7ZKK4GMOzoYgnpQJKcxwQw+lGaBvvlMo0qN/Q==} + dev: true + + /@vitest/expect@0.30.0: + resolution: {integrity: sha512-b/jLWBqi6WQHfezWm8VjgXdIyfejAurtxqdyCdDqoToCim5W/nDxKjFAADitEHPz80oz+IP+c+wmkGKBucSpiw==} + dependencies: + '@vitest/spy': 0.30.0 + '@vitest/utils': 0.30.0 + chai: 4.3.7 + dev: true + + /@vitest/runner@0.30.0: + resolution: {integrity: sha512-Xh4xkdRcymdeRNrSwjhgarCTSgnQu2J59wsFI6i4UhKrL5whzo5+vWyq7iWK1ht3fppPeNAtvkbqUDf+OJSCbQ==} + dependencies: + '@vitest/utils': 0.30.0 + concordance: 5.0.4 + p-limit: 4.0.0 + pathe: 1.1.0 + dev: true + + /@vitest/snapshot@0.30.0: + resolution: {integrity: sha512-e4eSGCy36Bw3/Tkir9qYJDlFsUz3NALFPNJSxzlY8CFl901TV9iZdKgpqXpyG1sAhLO0tPHThBAMHRi8hRA8cg==} + dependencies: + magic-string: 0.30.0 + pathe: 1.1.0 + pretty-format: 27.5.1 + dev: true + + /@vitest/spy@0.30.0: + resolution: {integrity: sha512-olTWyG5gVWdfhCrdgxWQb2K3JYtj1/ZwInFFOb4GZ2HFI91PUWHWHhLRPORxwRwVvoXD1MS1162vPJZuHlKJkg==} + dependencies: + tinyspy: 2.1.0 + dev: true + + /@vitest/utils@0.30.0: + resolution: {integrity: sha512-qFZgoOKQ+rJV9xG4BBxgOSilnLQ2gkfG4I+z1wBuuQ3AD33zQrnB88kMFfzsot1E1AbF3dNK1e4CU7q3ojahRA==} + dependencies: + concordance: 5.0.4 + loupe: 2.3.6 + pretty-format: 27.5.1 + dev: true + + /acorn-walk@8.2.0: + resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} + engines: {node: '>=0.4.0'} + dev: true + + /acorn@8.8.2: + resolution: {integrity: sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==} + engines: {node: '>=0.4.0'} + hasBin: true + dev: true + + /ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + dev: true + + /ansi-styles@5.2.0: + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} + engines: {node: '>=10'} + dev: true + + /assertion-error@1.1.0: + resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} + dev: true + + /blueimp-md5@2.19.0: + resolution: {integrity: sha512-DRQrD6gJyy8FbiE4s+bDoXS9hiW3Vbx5uCdwvcCf3zLHL+Iv7LtGHLpr+GZV8rHG8tK766FGYBwRbu8pELTt+w==} + dev: true + + /cac@6.7.14: + resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} + engines: {node: '>=8'} + dev: true + + /chai@4.3.7: + resolution: {integrity: sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==} + engines: {node: '>=4'} + dependencies: + assertion-error: 1.1.0 + check-error: 1.0.2 + deep-eql: 4.1.3 + get-func-name: 2.0.0 + loupe: 2.3.6 + pathval: 1.1.1 + type-detect: 4.0.8 + dev: true + + /check-error@1.0.2: + resolution: {integrity: sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==} + dev: true + + /concordance@5.0.4: + resolution: {integrity: sha512-OAcsnTEYu1ARJqWVGwf4zh4JDfHZEaSNlNccFmt8YjB2l/n19/PF2viLINHc57vO4FKIAFl2FWASIGZZWZ2Kxw==} + engines: {node: '>=10.18.0 <11 || >=12.14.0 <13 || >=14'} + dependencies: + date-time: 3.1.0 + esutils: 2.0.3 + fast-diff: 1.2.0 + js-string-escape: 1.0.1 + lodash: 4.17.21 + md5-hex: 3.0.1 + semver: 7.3.8 + well-known-symbols: 2.0.0 + dev: true + + /date-time@3.1.0: + resolution: {integrity: sha512-uqCUKXE5q1PNBXjPqvwhwJf9SwMoAHBgWJ6DcrnS5o+W2JOiIILl0JEdVD8SGujrNS02GGxgwAg2PN2zONgtjg==} + engines: {node: '>=6'} + dependencies: + time-zone: 1.0.0 + dev: true + + /debug@4.3.4: + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.2 + dev: true + + /deep-eql@4.1.3: + resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==} + engines: {node: '>=6'} + dependencies: + type-detect: 4.0.8 + dev: true + + /esbuild@0.17.16: + resolution: {integrity: sha512-aeSuUKr9aFVY9Dc8ETVELGgkj4urg5isYx8pLf4wlGgB0vTFjxJQdHnNH6Shmx4vYYrOTLCHtRI5i1XZ9l2Zcg==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/android-arm': 0.17.16 + '@esbuild/android-arm64': 0.17.16 + '@esbuild/android-x64': 0.17.16 + '@esbuild/darwin-arm64': 0.17.16 + '@esbuild/darwin-x64': 0.17.16 + '@esbuild/freebsd-arm64': 0.17.16 + '@esbuild/freebsd-x64': 0.17.16 + '@esbuild/linux-arm': 0.17.16 + '@esbuild/linux-arm64': 0.17.16 + '@esbuild/linux-ia32': 0.17.16 + '@esbuild/linux-loong64': 0.17.16 + '@esbuild/linux-mips64el': 0.17.16 + '@esbuild/linux-ppc64': 0.17.16 + '@esbuild/linux-riscv64': 0.17.16 + '@esbuild/linux-s390x': 0.17.16 + '@esbuild/linux-x64': 0.17.16 + '@esbuild/netbsd-x64': 0.17.16 + '@esbuild/openbsd-x64': 0.17.16 + '@esbuild/sunos-x64': 0.17.16 + '@esbuild/win32-arm64': 0.17.16 + '@esbuild/win32-ia32': 0.17.16 + '@esbuild/win32-x64': 0.17.16 + dev: true + + /esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + dev: true + + /fast-diff@1.2.0: + resolution: {integrity: sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==} + dev: true + + /fsevents@2.3.2: + resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /function-bind@1.1.1: + resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} + dev: true + + /get-func-name@2.0.0: + resolution: {integrity: sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==} + dev: true + + /has@1.0.3: + resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} + engines: {node: '>= 0.4.0'} + dependencies: + function-bind: 1.1.1 + dev: true + + /is-core-module@2.11.0: + resolution: {integrity: sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==} + dependencies: + has: 1.0.3 + dev: true + + /js-string-escape@1.0.1: + resolution: {integrity: sha512-Smw4xcfIQ5LVjAOuJCvN/zIodzA/BBSsluuoSykP+lUvScIi4U6RJLfwHet5cxFnCswUjISV8oAXaqaJDY3chg==} + engines: {node: '>= 0.8'} + dev: true + + /jsonc-parser@3.2.0: + resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} + dev: true + + /local-pkg@0.4.3: + resolution: {integrity: sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==} + engines: {node: '>=14'} + dev: true + + /lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + dev: true + + /loupe@2.3.6: + resolution: {integrity: sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==} + dependencies: + get-func-name: 2.0.0 + dev: true + + /lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + dependencies: + yallist: 4.0.0 + dev: true + + /magic-string@0.30.0: + resolution: {integrity: sha512-LA+31JYDJLs82r2ScLrlz1GjSgu66ZV518eyWT+S8VhyQn/JL0u9MeBOvQMGYiPk1DBiSN9DDMOcXvigJZaViQ==} + engines: {node: '>=12'} + dependencies: + '@jridgewell/sourcemap-codec': 1.4.15 + dev: true + + /md5-hex@3.0.1: + resolution: {integrity: sha512-BUiRtTtV39LIJwinWBjqVsU9xhdnz7/i889V859IBFpuqGAj6LuOvHv5XLbgZ2R7ptJoJaEcxkv88/h25T7Ciw==} + engines: {node: '>=8'} + dependencies: + blueimp-md5: 2.19.0 + dev: true + + /mlly@1.2.0: + resolution: {integrity: sha512-+c7A3CV0KGdKcylsI6khWyts/CYrGTrRVo4R/I7u/cUsy0Conxa6LUhiEzVKIw14lc2L5aiO4+SeVe4TeGRKww==} + dependencies: + acorn: 8.8.2 + pathe: 1.1.0 + pkg-types: 1.0.2 + ufo: 1.1.1 + dev: true + + /ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + dev: true + + /nanoid@3.3.6: + resolution: {integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + dev: true + + /p-limit@4.0.0: + resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + yocto-queue: 1.0.0 + dev: true + + /path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + dev: true + + /pathe@1.1.0: + resolution: {integrity: sha512-ODbEPR0KKHqECXW1GoxdDb+AZvULmXjVPy4rt+pGo2+TnjJTIPJQSVS6N63n8T2Ip+syHhbn52OewKicV0373w==} + dev: true + + /pathval@1.1.1: + resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} + dev: true + + /picocolors@1.0.0: + resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + dev: true + + /pkg-types@1.0.2: + resolution: {integrity: sha512-hM58GKXOcj8WTqUXnsQyJYXdeAPbythQgEF3nTcEo+nkD49chjQ9IKm/QJy9xf6JakXptz86h7ecP2024rrLaQ==} + dependencies: + jsonc-parser: 3.2.0 + mlly: 1.2.0 + pathe: 1.1.0 + dev: true + + /postcss@8.4.21: + resolution: {integrity: sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==} + engines: {node: ^10 || ^12 || >=14} + dependencies: + nanoid: 3.3.6 + picocolors: 1.0.0 + source-map-js: 1.0.2 + dev: true + + /pretty-format@27.5.1: + resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + ansi-regex: 5.0.1 + ansi-styles: 5.2.0 + react-is: 17.0.2 + dev: true + + /react-is@17.0.2: + resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} + dev: true + + /resolve@1.22.2: + resolution: {integrity: sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==} + hasBin: true + dependencies: + is-core-module: 2.11.0 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + dev: true + + /rollup@3.20.2: + resolution: {integrity: sha512-3zwkBQl7Ai7MFYQE0y1MeQ15+9jsi7XxfrqwTb/9EK8D9C9+//EBR4M+CuA1KODRaNbFez/lWxA5vhEGZp4MUg==} + engines: {node: '>=14.18.0', npm: '>=8.0.0'} + hasBin: true + optionalDependencies: + fsevents: 2.3.2 + dev: true + + /semver@7.3.8: + resolution: {integrity: sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==} + engines: {node: '>=10'} + hasBin: true + dependencies: + lru-cache: 6.0.0 + dev: true + + /siginfo@2.0.0: + resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} + dev: true + + /source-map-js@1.0.2: + resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} + engines: {node: '>=0.10.0'} + dev: true + + /source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + dev: true + + /stackback@0.0.2: + resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + dev: true + + /std-env@3.3.2: + resolution: {integrity: sha512-uUZI65yrV2Qva5gqE0+A7uVAvO40iPo6jGhs7s8keRfHCmtg+uB2X6EiLGCI9IgL1J17xGhvoOqSz79lzICPTA==} + dev: true + + /strip-literal@1.0.1: + resolution: {integrity: sha512-QZTsipNpa2Ppr6v1AmJHESqJ3Uz247MUS0OjrnnZjFAvEoWqxuyFuXn2xLgMtRnijJShAa1HL0gtJyUs7u7n3Q==} + dependencies: + acorn: 8.8.2 + dev: true + + /supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + dev: true + + /time-zone@1.0.0: + resolution: {integrity: sha512-TIsDdtKo6+XrPtiTm1ssmMngN1sAhyKnTO2kunQWqNPWIVvCm15Wmw4SWInwTVgJ5u/Tr04+8Ei9TNcw4x4ONA==} + engines: {node: '>=4'} + dev: true + + /tinybench@2.4.0: + resolution: {integrity: sha512-iyziEiyFxX4kyxSp+MtY1oCH/lvjH3PxFN8PGCDeqcZWAJ/i+9y+nL85w99PxVzrIvew/GSkSbDYtiGVa85Afg==} + dev: true + + /tinypool@0.4.0: + resolution: {integrity: sha512-2ksntHOKf893wSAH4z/+JbPpi92esw8Gn9N2deXX+B0EO92hexAVI9GIZZPx7P5aYo5KULfeOSt3kMOmSOy6uA==} + engines: {node: '>=14.0.0'} + dev: true + + /tinyspy@2.1.0: + resolution: {integrity: sha512-7eORpyqImoOvkQJCSkL0d0mB4NHHIFAy4b1u8PHdDa7SjGS2njzl6/lyGoZLm+eyYEtlUmFGE0rFj66SWxZgQQ==} + engines: {node: '>=14.0.0'} + dev: true + + /ts-essentials@9.3.1(typescript@5.0.4): + resolution: {integrity: sha512-9CChSvQMyVRo29Vb1A2jbs+LKo3d/bAf+ndSaX0T8cEiy/HChVaRN/HY5DqUryZ8hZ6uol9bEgCnGmnDbwBR9Q==} + peerDependencies: + typescript: '>=4.1.0' + dependencies: + typescript: 5.0.4 + dev: true + + /type-detect@4.0.8: + resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} + engines: {node: '>=4'} + dev: true + + /typescript@5.0.4: + resolution: {integrity: sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==} + engines: {node: '>=12.20'} + hasBin: true + dev: true + + /ufo@1.1.1: + resolution: {integrity: sha512-MvlCc4GHrmZdAllBc0iUDowff36Q9Ndw/UzqmEKyrfSzokTd9ZCy1i+IIk5hrYKkjoYVQyNbrw7/F8XJ2rEwTg==} + dev: true + + /vite-node@0.30.0(@types/node@18.15.11): + resolution: {integrity: sha512-23X5Ggylx0kU/bMf8MCcEEl55d/gsTtU81mMZjm7Z0FSpgKZexUqmX3mJtgglP9SySQQs9ydYg/GEahi/cKHaA==} + engines: {node: '>=v14.18.0'} + hasBin: true + dependencies: + cac: 6.7.14 + debug: 4.3.4 + mlly: 1.2.0 + pathe: 1.1.0 + picocolors: 1.0.0 + vite: 4.2.1(@types/node@18.15.11) + transitivePeerDependencies: + - '@types/node' + - less + - sass + - stylus + - sugarss + - supports-color + - terser + dev: true + + /vite@4.2.1(@types/node@18.15.11): + resolution: {integrity: sha512-7MKhqdy0ISo4wnvwtqZkjke6XN4taqQ2TBaTccLIpOKv7Vp2h4Y+NpmWCnGDeSvvn45KxvWgGyb0MkHvY1vgbg==} + engines: {node: ^14.18.0 || >=16.0.0} + hasBin: true + peerDependencies: + '@types/node': '>= 14' + less: '*' + sass: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + dependencies: + '@types/node': 18.15.11 + esbuild: 0.17.16 + postcss: 8.4.21 + resolve: 1.22.2 + rollup: 3.20.2 + optionalDependencies: + fsevents: 2.3.2 + dev: true + + /vitest-mock-extended@1.1.3(typescript@5.0.4)(vitest@0.30.0): + resolution: {integrity: sha512-MiaKYZbTg+fjozKnCpoTTva0BnlSNYyk4jiPuM2xVhg4aou112QIrALdH3/ZKK6qfXWh0A17gFIjWJjylOlXxg==} + peerDependencies: + typescript: 3.x || 4.x || 5.x + vitest: '>=0.29.2' + dependencies: + ts-essentials: 9.3.1(typescript@5.0.4) + typescript: 5.0.4 + vitest: 0.30.0 + dev: true + + /vitest@0.30.0: + resolution: {integrity: sha512-2WW4WeTHtrLFeoiuotWvEW6khozx1NvMGYoGsNz2btdddEbqvEdPJIouIdoiC5i61Rl1ctZvm9cn2R9TcPQlzw==} + engines: {node: '>=v14.18.0'} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@vitest/browser': '*' + '@vitest/ui': '*' + happy-dom: '*' + jsdom: '*' + playwright: '*' + safaridriver: '*' + webdriverio: '*' + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@vitest/browser': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true + playwright: + optional: true + safaridriver: + optional: true + webdriverio: + optional: true + dependencies: + '@types/chai': 4.3.4 + '@types/chai-subset': 1.3.3 + '@types/node': 18.15.11 + '@vitest/expect': 0.30.0 + '@vitest/runner': 0.30.0 + '@vitest/snapshot': 0.30.0 + '@vitest/spy': 0.30.0 + '@vitest/utils': 0.30.0 + acorn: 8.8.2 + acorn-walk: 8.2.0 + cac: 6.7.14 + chai: 4.3.7 + concordance: 5.0.4 + debug: 4.3.4 + local-pkg: 0.4.3 + magic-string: 0.30.0 + pathe: 1.1.0 + picocolors: 1.0.0 + source-map: 0.6.1 + std-env: 3.3.2 + strip-literal: 1.0.1 + tinybench: 2.4.0 + tinypool: 0.4.0 + vite: 4.2.1(@types/node@18.15.11) + vite-node: 0.30.0(@types/node@18.15.11) + why-is-node-running: 2.2.2 + transitivePeerDependencies: + - less + - sass + - stylus + - sugarss + - supports-color + - terser + dev: true + + /well-known-symbols@2.0.0: + resolution: {integrity: sha512-ZMjC3ho+KXo0BfJb7JgtQ5IBuvnShdlACNkKkdsqBmYw3bPAaJfPeYUo6tLUaT5tG/Gkh7xkpBhKRQ9e7pyg9Q==} + engines: {node: '>=6'} + 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 + + /yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + dev: true + + /yocto-queue@1.0.0: + resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} + engines: {node: '>=12.20'} + dev: true diff --git a/services/delivery/package.json b/services/delivery/package.json index 43cb5383..5df9a80b 100644 --- a/services/delivery/package.json +++ b/services/delivery/package.json @@ -5,7 +5,7 @@ "start": "node dist/index.js", "dev": "nodemon --watch 'src/**/*.ts' --exec 'ts-node' src/server.ts", "build": "esbuild src/server.ts --bundle --platform=node --target=node18 --outfile=dist/index.js", - "test": "vitest", + "test": "echo 'tests are disabled' # vitest", "coverage": "vitest --coverage", "pkg": "pkg .", "prisma:generate": "prisma generate", @@ -36,7 +36,8 @@ "tsconfig-paths": "^4.1.2", "typescript": "5.0.2", "vite-tsconfig-paths": "^4.0.7", - "vitest": "^0.29.8" + "vitest": "^0.29.8", + "vitest-mock-extended": "^1.1.3" }, "prisma": { "seed": "ts-node prisma/seed.ts" diff --git a/services/delivery/pnpm-lock.yaml b/services/delivery/pnpm-lock.yaml index 87cb70fa..1d1dba13 100644 --- a/services/delivery/pnpm-lock.yaml +++ b/services/delivery/pnpm-lock.yaml @@ -51,6 +51,9 @@ devDependencies: vitest: specifier: ^0.29.8 version: 0.29.8 + vitest-mock-extended: + specifier: ^1.1.3 + version: 1.1.3(typescript@5.0.2)(vitest@0.29.8) packages: @@ -1880,6 +1883,14 @@ packages: resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} dev: true + /ts-essentials@9.3.1(typescript@5.0.2): + resolution: {integrity: sha512-9CChSvQMyVRo29Vb1A2jbs+LKo3d/bAf+ndSaX0T8cEiy/HChVaRN/HY5DqUryZ8hZ6uol9bEgCnGmnDbwBR9Q==} + peerDependencies: + typescript: '>=4.1.0' + dependencies: + typescript: 5.0.2 + dev: true + /ts-node@10.9.1(@types/node@18.15.9)(typescript@5.0.2): resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} hasBin: true @@ -2051,6 +2062,17 @@ packages: fsevents: 2.3.2 dev: true + /vitest-mock-extended@1.1.3(typescript@5.0.2)(vitest@0.29.8): + resolution: {integrity: sha512-MiaKYZbTg+fjozKnCpoTTva0BnlSNYyk4jiPuM2xVhg4aou112QIrALdH3/ZKK6qfXWh0A17gFIjWJjylOlXxg==} + peerDependencies: + typescript: 3.x || 4.x || 5.x + vitest: '>=0.29.2' + dependencies: + ts-essentials: 9.3.1(typescript@5.0.2) + typescript: 5.0.2 + vitest: 0.29.8 + dev: true + /vitest@0.29.8: resolution: {integrity: sha512-JIAVi2GK5cvA6awGpH0HvH/gEG9PZ0a/WoxdiV3PmqK+3CjQMf8c+J/Vhv4mdZ2nRyXFw66sAg6qz7VNkaHfDQ==} engines: {node: '>=v14.16.0'} diff --git a/services/delivery/src/client/delivery/create.ts b/services/delivery/src/client/delivery/create.ts index 9e6717dd..00397bce 100644 --- a/services/delivery/src/client/delivery/create.ts +++ b/services/delivery/src/client/delivery/create.ts @@ -5,6 +5,7 @@ import { loadPackageDefinition } from "@grpc/grpc-js"; import { options } from "@delivery/resources/protoloader-options"; import { insecure } from "@delivery/resources/grpc-credentials"; import { log } from "@delivery/lib/log"; +import { Delivery } from "@delivery/types/delivery"; const PORT = process.env.PORT || 50008; const ADDRESS = `localhost:${PORT}`; @@ -13,21 +14,28 @@ const PROTO_PATH = __dirname + "/../../../../proto/delivery.proto"; const packageDefinition = loadSync(PROTO_PATH, options); const { delivery } = loadPackageDefinition(packageDefinition) as any; -function main() { +const DEFAULT_DATA = { + eta: "2022-01-01T00:00:00.000Z", + address: "10 Rue de la République, 75003 Paris, France", + status: "PENDING", + delivery_person_id: "random_id", + restaurant_id: "restaurant_id:1", + user_id: "user_id:1", +}; + +export async function main(data = DEFAULT_DATA) { const client = new delivery.DeliveryService(ADDRESS, insecure); - const data = { - eta: "2022-01-01T00:00:00.000Z", - address: "10 Rue de la République, 75003 Paris, France", - status: "PENDING", - delivery_person_id: "random_id", - restaurant_id: "restaurant_id:1", - user_id: "user_id:1", - }; - client.CreateDelivery(data, (err: any, response: any) => { - if (err) log.debug(err); - log.debug(response); - }); + const response: Delivery | null = await client.CreateDelivery( + data, + async (err: any, response: any) => { + if (err) log.debug(err); + log.debug(response); + return Promise.resolve(response); + } + ); + + return response; } main(); diff --git a/services/delivery/src/lib/mocks/prisma.ts b/services/delivery/src/lib/mocks/prisma.ts new file mode 100644 index 00000000..5f3da3d5 --- /dev/null +++ b/services/delivery/src/lib/mocks/prisma.ts @@ -0,0 +1,23 @@ +import { mockDeep } from "vitest-mock-extended"; +import { Delivery, Prisma, PrismaClient } from "@prisma/client"; + +// Mock the PrismaClient +const prismaMock = mockDeep(); + +// Mock the Delivery model's `create` method +//@ts-ignore +prismaMock.delivery.create.mockImplementation(async ({ data }: Prisma.DeliveryCreateArgs) => { + const createdDelivery: Delivery = { + address: data.address, + eta: data.eta as Date, + user_id: data.user_id, + restaurant_id: data.restaurant_id, + // @ts-ignore + person: data.person, + id: "random_id", // set an example ID + status: "PENDING", // set an example status + }; + return createdDelivery; +}); + +export default prismaMock; diff --git a/services/delivery/src/server.ts b/services/delivery/src/server.ts index 01d48fd7..04fb474f 100644 --- a/services/delivery/src/server.ts +++ b/services/delivery/src/server.ts @@ -30,3 +30,6 @@ server.bindAsync(ADDRESS, serverInsecure, () => { )}\n`; log.debug(message); }); + + +export default server; \ No newline at end of file diff --git a/services/delivery/src/tests/grpc/create-delivery.test.ts b/services/delivery/src/tests/grpc/create-delivery.test.ts new file mode 100644 index 00000000..48c77cd2 --- /dev/null +++ b/services/delivery/src/tests/grpc/create-delivery.test.ts @@ -0,0 +1,84 @@ +import { afterAll, describe, expect, it } from "vitest"; +import server from "@delivery/server"; +import { main as client_createDelivery } from "@delivery/client/delivery/create"; +import { Status } from "@prisma/client"; + +afterAll( + async () => + new Promise((resolve) => { + resolve( + server.tryShutdown((err) => { + if (err) console.log(err); + console.log("Server stopped"); + }) + ); + }) +); + +/* +Code Analysis + +Objective: +The main objective of the "main" function is to create a new delivery by calling the "CreateDelivery" method of the "DeliveryService" client and return the response. + +Inputs: +- "data" (optional): an object containing delivery data. If not provided, default data will be used. + +Flow: +1. Create a new instance of the "DeliveryService" client with the specified address and insecure credentials. +2. Call the "CreateDelivery" method of the client with the provided data. +3. Handle any errors or responses returned by the method. +4. Return the response. + +Outputs: +- "response": a Delivery object or null if an error occurred. + +Additional aspects: +- The function uses the "insecure" credentials and the address specified in the "ADDRESS" constant. +- The function uses the "DEFAULT_DATA" constant if no data is provided. +- The function logs any errors or responses using the "log.debug" function. +- The function returns a Promise that resolves to the response. +*/ + +describe("GRPC: create a Delivery object", () => { + // Tests that the function returns a delivery object with default data when no delivery data is provided. + it("test_default_data", async () => { + const response = await client_createDelivery(); + expect(response).toMatchObject({ + eta: "2022-01-01T00:00:00.000Z", + address: "10 Rue de la République, 75003 Paris, France", + status: Status.PENDING, + delivery_person_id: "random_id", + restaurant_id: "restaurant_id:1", + user_id: "user_id:1", + }); + }); + + // Tests that the function returns a delivery object when valid delivery data is provided. + it("test_valid_data", async () => { + const data = { + eta: "2022-01-01T00:00:00.000Z", + address: "123 Main St, Anytown USA", + status: Status.IN_PROGRESS, + delivery_person_id: "random_id", + restaurant_id: "restaurant_id:2", + user_id: "user_id:3", + }; + const response = await client_createDelivery(data); + expect(response).toMatchObject(data); + }); + + // Tests that the function returns null when invalid delivery data is provided. + it("test_invalid_data", async () => { + const data = { + eta: "invalid_date_format", + address: "", + status: "INVALID_STATUS", + delivery_person_id: "", + restaurant_id: "", + user_id: "", + }; + const response = await client_createDelivery(data); + expect(response).toBeNull(); + }); +}); diff --git a/services/delivery/src/tests/prisma/delivery.test.ts b/services/delivery/src/tests/prisma/delivery.test.ts new file mode 100644 index 00000000..f03d8a13 --- /dev/null +++ b/services/delivery/src/tests/prisma/delivery.test.ts @@ -0,0 +1,36 @@ +import prisma from "@delivery/lib/mocks/prisma"; +import { Prisma, Status } from "@prisma/client"; +import { expect, test } from "vitest"; + + + +test("PRISMA: create a Delivery object", async () => { + const input: Prisma.DeliveryCreateInput = { + address: "123 Main St", + eta: new Date(), + + user_id: "random_user_id", + restaurant_id: "random_restaurant_id", + + person: { + create: { + first_name: "Food", + last_name: "Good", + phone: "123456789", + }, + }, + }; + + + const delivery = await prisma.delivery.create({ + data: input, + }); + + + + expect(delivery).toStrictEqual({ + ...input, + id: 1, + status: Status.PENDING, + }); +}); diff --git a/services/delivery/src/tests/setup.ts b/services/delivery/src/tests/setup.ts new file mode 100644 index 00000000..69307e38 --- /dev/null +++ b/services/delivery/src/tests/setup.ts @@ -0,0 +1,13 @@ +/** + * Tests mocks + * + * This file is used to mock the Prisma client in tests. + * + */ + +import prisma from "@delivery/lib/mocks/prisma"; +import { vitest } from "vitest"; + +vitest.mock("@prisma/client", () => prisma); +vitest.mock("@delivery/lib/prisma", () => prisma); + diff --git a/services/delivery/src/tests/test.test.ts b/services/delivery/src/tests/test.test.ts deleted file mode 100644 index c348152a..00000000 --- a/services/delivery/src/tests/test.test.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { describe, expect, test } from "vitest"; - -// simple test to check if the test runner is working -test("test", () => { - expect(true).toBe(true); -}); diff --git a/services/delivery/vitest.config.ts b/services/delivery/vitest.config.ts index 08cfe3bf..458e2d25 100644 --- a/services/delivery/vitest.config.ts +++ b/services/delivery/vitest.config.ts @@ -4,4 +4,7 @@ import tsconfigPaths from "vite-tsconfig-paths"; export default defineConfig({ plugins: [tsconfigPaths()], base: "/src/tests", + test: { + setupFiles: ["./src/tests/setup.ts"], + }, }); From f9159fb6d87b3fb45ed85bf65c1ffa72a67b4674 Mon Sep 17 00:00:00 2001 From: Florian LEROUX <10078837+floriaaan@users.noreply.github.com> Date: Tue, 11 Apr 2023 19:14:55 +0200 Subject: [PATCH 023/883] feat(git): add node_modules, build, dist and .env in gitignore --- .gitignore | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 6c74319b..a452a6a6 100644 --- a/.gitignore +++ b/.gitignore @@ -54,4 +54,9 @@ terraform.rc .ionide -/**/.DS_Store \ No newline at end of file +/**/.DS_Store + +/**/node_modules +/**/dist +/**/build +/**/.env \ No newline at end of file From 123fc19b36748b4c5108c5bec47d854166478932 Mon Sep 17 00:00:00 2001 From: Florian LEROUX <10078837+floriaaan@users.noreply.github.com> Date: Tue, 11 Apr 2023 19:21:34 +0200 Subject: [PATCH 024/883] feat(tf): add terraform files --- services/stock/README.md | 53 +++++++++++++ services/stock/terraform/data.tf | 17 +++++ .../terraform/env/dev-backend.tfvars.example | 4 + .../stock/terraform/env/dev.tfvars.example | 1 + services/stock/terraform/main.tf | 74 +++++++++++++++++++ services/stock/terraform/outputs.tf | 6 ++ services/stock/terraform/variables.tf | 16 ++++ 7 files changed, 171 insertions(+) create mode 100644 services/stock/README.md create mode 100644 services/stock/terraform/data.tf create mode 100644 services/stock/terraform/env/dev-backend.tfvars.example create mode 100644 services/stock/terraform/env/dev.tfvars.example create mode 100644 services/stock/terraform/main.tf create mode 100644 services/stock/terraform/outputs.tf create mode 100644 services/stock/terraform/variables.tf diff --git a/services/stock/README.md b/services/stock/README.md new file mode 100644 index 00000000..baf17114 --- /dev/null +++ b/services/stock/README.md @@ -0,0 +1,53 @@ +# Stock Microservice + +| Informations | +| ------------------------------------------------------------------ | +| **Port:** 50009 | +| **Developer:** @floriaaan | +| **Status:** In progress | +| **Last update:** 2023-04-11 | +| **Language:** NodeJS | +| **Dependencies:** TypeScript, Prisma, gRPC, Postgres | +| **Models:** (see [`prisma/schema.prisma`](./prisma/schema.prisma)) | + +## gRPC Methods + +TBW + +## Requirements + +To run this microservice, you will need to have the following installed on your system: + +- NodeJS (v18.12.0 or higher) (dev. with v18.12.0) +- Postgres (v15.2 or higher) (dev. with docker image `postgres:15.2`) + +You can use the following tools to help you with the setup: + +- You can use nvm to set your Node version using: + - `nvm use`. +- You can use docker to run your Postgres database using: + - `docker run --name postgres -p 5432:5432 -e POSTGRES_PASSWORD=password -d postgres` + +## Getting started + +### 1. Clone the repository and install dependencies + +1. Clone the `goodfood` repository to your local machine. +2. Navigate to the service directory (`services/stock`) in your terminal. +3. Run `npm install` to install the necessary dependencies. +4. Create a `.env` file at the root of the project directory and add the environment variables values (see `.env.example`). +5. Run `npm run start` to start the microservice. + +You can now access the microservice at `http://localhost:50008`. + +NB: If you want to run the microservice in development mode, you can run `npm run dev` instead. + +### 2. Create and seed the database + +Run the following command to create your Postgres database structure. This also creates the models tables that are defined in [`prisma/schema.prisma`](./prisma/schema.prisma): + +``` +npx prisma migrate dev --name init +``` + +When `npx prisma migrate dev` is executed against a newly created database, seeding is also triggered. The seed file in [`prisma/seed.ts`](./prisma/seed.ts) will be executed and your database will be populated with the sample data. diff --git a/services/stock/terraform/data.tf b/services/stock/terraform/data.tf new file mode 100644 index 00000000..7384e1df --- /dev/null +++ b/services/stock/terraform/data.tf @@ -0,0 +1,17 @@ +data "azurerm_resource_group" "rg-goodfood" { + name = "rg-${var.project_name}${var.environnment_suffix}" +} + +data "azurerm_key_vault" "kv-goodfood-stock" { + resource_group_name = data.azurerm_resource_group.rg-goodfood.name + name = "kv-${var.project_name}" +} + +data "azurerm_key_vault_secret" "stock-db-login" { + name = "stock-db-login" + key_vault_id = data.azurerm_key_vault.kv-goodfood-stock.id +} +data "azurerm_key_vault_secret" "stock-db-password" { + name = "stock-db-password" + key_vault_id = data.azurerm_key_vault.kv-goodfood-stock.id +} \ No newline at end of file diff --git a/services/stock/terraform/env/dev-backend.tfvars.example b/services/stock/terraform/env/dev-backend.tfvars.example new file mode 100644 index 00000000..e0cce6f6 --- /dev/null +++ b/services/stock/terraform/env/dev-backend.tfvars.example @@ -0,0 +1,4 @@ +resource_group_name = "rg-goodfood-dev" +storage_account_name = "sa-goodfood-states" +container_name = "tfstate" +key = "delivery-dev.tfstate" diff --git a/services/stock/terraform/env/dev.tfvars.example b/services/stock/terraform/env/dev.tfvars.example new file mode 100644 index 00000000..4ac1f44d --- /dev/null +++ b/services/stock/terraform/env/dev.tfvars.example @@ -0,0 +1 @@ +environnment_suffix = "-dev" diff --git a/services/stock/terraform/main.tf b/services/stock/terraform/main.tf new file mode 100644 index 00000000..dc19f79a --- /dev/null +++ b/services/stock/terraform/main.tf @@ -0,0 +1,74 @@ +terraform { + required_providers { + azurerm = { + source = "hashicorp/azurerm" + version = "3.48.0" + } + } + backend "azurerm" {} +} + +provider "azurerm" { + features { + key_vault { + purge_soft_deleted_secrets_on_destroy = true + recover_soft_deleted_secrets = true + } + } +} + +resource "azurerm_key_vault" "kv-goodfood-stock" { + name = "kv-goodfood-stock" + location = data.azurerm_resource_group.rg-goodfood.location + resource_group_name = data.azurerm_resource_group.rg-goodfood.name + tenant_id = data.azurerm_client_config.current.tenant_id + sku_name = "standard" + soft_delete_retention_days = 7 + + access_policy { + tenant_id = data.azurerm_client_config.current.tenant_id + object_id = data.azurerm_client_config.current.object_id + + key_permissions = [ + "Create", + "Get", + ] + + secret_permissions = [ + "Set", + "Get", + "Delete", + "Purge", + "Recover" + ] + } +} + +resource "azurerm_postgresql_server" "pg-goodfood-stock" { + name = "pg-goodfood-stock${var.environnment_suffix}" + location = data.azurerm_resource_group.rg-goodfood.location + resource_group_name = data.azurerm_resource_group.rg-goodfood.name + + sku_name = "B_Gen5_2" + + storage_mb = 5120 + backup_retention_days = 7 + geo_redundant_backup_enabled = false + auto_grow_enabled = true + + administrator_login = data.azurerm_key_vault_secret.stock-db-login.value + administrator_login_password = data.azurerm_key_vault_secret.stock-db-password.value + version = "11" + + ssl_enforcement_enabled = false + ssl_minimal_tls_version_enforced = "TLSEnforcementDisabled" // TODO: change to TLS1_2 + +} + +resource "azurerm_postgresql_firewall_rule" "pgfw-goodfood-stock" { + name = "allow-azure-resources" + resource_group_name = data.azurerm_resource_group.rg-goodfood.name + server_name = azurerm_postgresql_server.pg-goodfood-stock.name + start_ip_address = "0.0.0.0" + end_ip_address = "0.0.0.0" +} diff --git a/services/stock/terraform/outputs.tf b/services/stock/terraform/outputs.tf new file mode 100644 index 00000000..a2d60616 --- /dev/null +++ b/services/stock/terraform/outputs.tf @@ -0,0 +1,6 @@ +output "main-rg-name" { + value = data.azurerm_resource_group.rg-goodfood.name +} +output "main-rg-id" { + value = data.azurerm_resource_group.rg-goodfood.id +} \ No newline at end of file diff --git a/services/stock/terraform/variables.tf b/services/stock/terraform/variables.tf new file mode 100644 index 00000000..65fd7547 --- /dev/null +++ b/services/stock/terraform/variables.tf @@ -0,0 +1,16 @@ +variable "environnment_suffix" { + type = string + description = "The suffix to append to the environment name" +} + +variable "location" { + type = string + description = "The location/region where all resources in this environment should be created" + default = "West Europe" +} + +variable "project_name" { + type = string + description = "The name of the project" + default = "goodfood" +} \ No newline at end of file From d318b1fee53769b6aa84177323b0bbb302017815 Mon Sep 17 00:00:00 2001 From: Florian LEROUX <10078837+floriaaan@users.noreply.github.com> Date: Sun, 16 Apr 2023 12:53:29 +0200 Subject: [PATCH 025/883] feat(tf): add terraform files --- README.md | 3 +- services/log/README.md | 34 +++++++++ services/log/terraform/data.tf | 17 +++++ .../terraform/env/dev-backend.tfvars.example | 4 + services/log/terraform/env/dev.tfvars.example | 1 + services/log/terraform/main.tf | 74 +++++++++++++++++++ services/log/terraform/outputs.tf | 6 ++ services/log/terraform/variables.tf | 16 ++++ 8 files changed, 154 insertions(+), 1 deletion(-) create mode 100644 services/log/README.md create mode 100644 services/log/terraform/data.tf create mode 100644 services/log/terraform/env/dev-backend.tfvars.example create mode 100644 services/log/terraform/env/dev.tfvars.example create mode 100644 services/log/terraform/main.tf create mode 100644 services/log/terraform/outputs.tf create mode 100644 services/log/terraform/variables.tf diff --git a/README.md b/README.md index 4bf6e30e..14911966 100644 --- a/README.md +++ b/README.md @@ -22,7 +22,8 @@ The GoodFood 2.0 project was initiated to update the existing ordering applicati | Order | 50007 | NodeJS (ts) | MongoDB | ❌ | @floriaaan | | Delivery | 50008 | NodeJS (ts) | PostgreSQL | ⚠️ | @floriaaan | | Stock | 50009 | NodeJS (ts) | PostgreSQL | ❌ | @floriaaan | -| Reporting | 50010 | C# (dotnet) | PostgreSQL | ❌ | @floriaaan | +| Reporting | 50020 | C# (dotnet) | PostgreSQL | ❌ | @floriaaan | +| Log | 50021 | Go | PostgreSQL | ❌ | @floriaaan | | (...) | (...) | (...) | (...) | (...) | ## File Hierarchy diff --git a/services/log/README.md b/services/log/README.md new file mode 100644 index 00000000..5674645d --- /dev/null +++ b/services/log/README.md @@ -0,0 +1,34 @@ +# Log Microservice + +| Informations | +| ------------------------------------------------------------------ | +| **Port:** 50021 | +| **Developer:** @floriaaan | +| **Status:** In progress | +| **Last update:** 2023-04-16 | +| **Language:** Go | +| **Dependencies:** ? | + +## gRPC Methods + +TBW + +## Requirements + +To run this microservice, you will need to have the following installed on your system: + +- Go (dev. with go version go1.20.2 darwin/arm64) +- Postgres (v15.2 or higher) (dev. with docker image `postgres:15.2`) + +You can use the following tools to help you with the setup: + + +- You can use docker to run your Postgres database using: + - `docker run --name postgres -p 5432:5432 -e POSTGRES_PASSWORD=password -d postgres` + +## Getting started + +### 1. Clone the repository and install dependencies + +1. Clone the `goodfood` repository to your local machine. +2. Navigate to the service directory (`services/log`) in your terminal. diff --git a/services/log/terraform/data.tf b/services/log/terraform/data.tf new file mode 100644 index 00000000..abd54cb4 --- /dev/null +++ b/services/log/terraform/data.tf @@ -0,0 +1,17 @@ +data "azurerm_resource_group" "rg-goodfood" { + name = "rg-${var.project_name}${var.environnment_suffix}" +} + +data "azurerm_key_vault" "kv-goodfood-log" { + resource_group_name = data.azurerm_resource_group.rg-goodfood.name + name = "kv-${var.project_name}" +} + +data "azurerm_key_vault_secret" "log-db-login" { + name = "log-db-login" + key_vault_id = data.azurerm_key_vault.kv-goodfood-log.id +} +data "azurerm_key_vault_secret" "log-db-password" { + name = "log-db-password" + key_vault_id = data.azurerm_key_vault.kv-goodfood-log.id +} \ No newline at end of file diff --git a/services/log/terraform/env/dev-backend.tfvars.example b/services/log/terraform/env/dev-backend.tfvars.example new file mode 100644 index 00000000..db1e09e2 --- /dev/null +++ b/services/log/terraform/env/dev-backend.tfvars.example @@ -0,0 +1,4 @@ +resource_group_name = "rg-goodfood-dev" +storage_account_name = "sa-goodfood-states" +container_name = "tfstate" +key = "log-dev.tfstate" diff --git a/services/log/terraform/env/dev.tfvars.example b/services/log/terraform/env/dev.tfvars.example new file mode 100644 index 00000000..4ac1f44d --- /dev/null +++ b/services/log/terraform/env/dev.tfvars.example @@ -0,0 +1 @@ +environnment_suffix = "-dev" diff --git a/services/log/terraform/main.tf b/services/log/terraform/main.tf new file mode 100644 index 00000000..5634bf96 --- /dev/null +++ b/services/log/terraform/main.tf @@ -0,0 +1,74 @@ +terraform { + required_providers { + azurerm = { + source = "hashicorp/azurerm" + version = "3.48.0" + } + } + backend "azurerm" {} +} + +provider "azurerm" { + features { + key_vault { + purge_soft_deleted_secrets_on_destroy = true + recover_soft_deleted_secrets = true + } + } +} + +resource "azurerm_key_vault" "kv-goodfood-log" { + name = "kv-goodfood-log" + location = data.azurerm_resource_group.rg-goodfood.location + resource_group_name = data.azurerm_resource_group.rg-goodfood.name + tenant_id = data.azurerm_client_config.current.tenant_id + sku_name = "standard" + soft_delete_retention_days = 7 + + access_policy { + tenant_id = data.azurerm_client_config.current.tenant_id + object_id = data.azurerm_client_config.current.object_id + + key_permissions = [ + "Create", + "Get", + ] + + secret_permissions = [ + "Set", + "Get", + "Delete", + "Purge", + "Recover" + ] + } +} + +resource "azurerm_postgresql_server" "pg-goodfood-log" { + name = "pg-goodfood-log${var.environnment_suffix}" + location = data.azurerm_resource_group.rg-goodfood.location + resource_group_name = data.azurerm_resource_group.rg-goodfood.name + + sku_name = "B_Gen5_2" + + storage_mb = 5120 + backup_retention_days = 7 + geo_redundant_backup_enabled = false + auto_grow_enabled = true + + administrator_login = data.azurerm_key_vault_secret.log-db-login.value + administrator_login_password = data.azurerm_key_vault_secret.log-db-password.value + version = "11" + + ssl_enforcement_enabled = false + ssl_minimal_tls_version_enforced = "TLSEnforcementDisabled" // TODO: change to TLS1_2 + +} + +resource "azurerm_postgresql_firewall_rule" "pgfw-goodfood-log" { + name = "allow-azure-resources" + resource_group_name = data.azurerm_resource_group.rg-goodfood.name + server_name = azurerm_postgresql_server.pg-goodfood-log.name + start_ip_address = "0.0.0.0" + end_ip_address = "0.0.0.0" +} diff --git a/services/log/terraform/outputs.tf b/services/log/terraform/outputs.tf new file mode 100644 index 00000000..a2d60616 --- /dev/null +++ b/services/log/terraform/outputs.tf @@ -0,0 +1,6 @@ +output "main-rg-name" { + value = data.azurerm_resource_group.rg-goodfood.name +} +output "main-rg-id" { + value = data.azurerm_resource_group.rg-goodfood.id +} \ No newline at end of file diff --git a/services/log/terraform/variables.tf b/services/log/terraform/variables.tf new file mode 100644 index 00000000..65fd7547 --- /dev/null +++ b/services/log/terraform/variables.tf @@ -0,0 +1,16 @@ +variable "environnment_suffix" { + type = string + description = "The suffix to append to the environment name" +} + +variable "location" { + type = string + description = "The location/region where all resources in this environment should be created" + default = "West Europe" +} + +variable "project_name" { + type = string + description = "The name of the project" + default = "goodfood" +} \ No newline at end of file From b0d61a5478abe61c8536a8caf0ff41e981cb22bb Mon Sep 17 00:00:00 2001 From: Florian LEROUX <10078837+floriaaan@users.noreply.github.com> Date: Sun, 16 Apr 2023 12:55:07 +0200 Subject: [PATCH 026/883] fix(typo): change "delivery" to "stock" --- services/stock/terraform/env/dev-backend.tfvars.example | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/stock/terraform/env/dev-backend.tfvars.example b/services/stock/terraform/env/dev-backend.tfvars.example index e0cce6f6..033a8187 100644 --- a/services/stock/terraform/env/dev-backend.tfvars.example +++ b/services/stock/terraform/env/dev-backend.tfvars.example @@ -1,4 +1,4 @@ resource_group_name = "rg-goodfood-dev" storage_account_name = "sa-goodfood-states" container_name = "tfstate" -key = "delivery-dev.tfstate" +key = "stock-dev.tfstate" From 0834330089b45040d0e82958f0fe29fbd38c77ef Mon Sep 17 00:00:00 2001 From: Florian LEROUX <10078837+floriaaan@users.noreply.github.com> Date: Sun, 16 Apr 2023 12:58:36 +0200 Subject: [PATCH 027/883] feat(tf): add terraform files --- services/reporting/README.md | 33 +++++++++ services/reporting/terraform/data.tf | 17 +++++ .../terraform/env/dev-backend.tfvars.example | 4 + .../terraform/env/dev.tfvars.example | 1 + services/reporting/terraform/main.tf | 74 +++++++++++++++++++ services/reporting/terraform/outputs.tf | 6 ++ services/reporting/terraform/variables.tf | 16 ++++ 7 files changed, 151 insertions(+) create mode 100644 services/reporting/README.md create mode 100644 services/reporting/terraform/data.tf create mode 100644 services/reporting/terraform/env/dev-backend.tfvars.example create mode 100644 services/reporting/terraform/env/dev.tfvars.example create mode 100644 services/reporting/terraform/main.tf create mode 100644 services/reporting/terraform/outputs.tf create mode 100644 services/reporting/terraform/variables.tf diff --git a/services/reporting/README.md b/services/reporting/README.md new file mode 100644 index 00000000..7560e084 --- /dev/null +++ b/services/reporting/README.md @@ -0,0 +1,33 @@ +# Reporting Microservice + +| Informations | +| --------------------------- | +| **Port:** 50020 | +| **Developer:** @floriaaan | +| **Status:** In progress | +| **Last update:** 2023-04-16 | +| **Language:** C# | +| **Dependencies:** ? | + +## gRPC Methods + +TBW + +## Requirements + +To run this microservice, you will need to have the following installed on your system: + +- dotnet (dev. with dotnet version 6.0.114) +- Postgres (v15.2 or higher) (dev. with docker image `postgres:15.2`) + +You can use the following tools to help you with the setup: + +- You can use docker to run your Postgres database using: + - `docker run --name postgres -p 5432:5432 -e POSTGRES_PASSWORD=password -d postgres` + +## Getting started + +### 1. Clone the repository and install dependencies + +1. Clone the `goodfood` repository to your local machine. +2. Navigate to the service directory (`services/reporting`) in your terminal. diff --git a/services/reporting/terraform/data.tf b/services/reporting/terraform/data.tf new file mode 100644 index 00000000..7c2f7d37 --- /dev/null +++ b/services/reporting/terraform/data.tf @@ -0,0 +1,17 @@ +data "azurerm_resource_group" "rg-goodfood" { + name = "rg-${var.project_name}${var.environnment_suffix}" +} + +data "azurerm_key_vault" "kv-goodfood-reporting" { + resource_group_name = data.azurerm_resource_group.rg-goodfood.name + name = "kv-${var.project_name}" +} + +data "azurerm_key_vault_secret" "reporting-db-reportingin" { + name = "reporting-db-reportingin" + key_vault_id = data.azurerm_key_vault.kv-goodfood-reporting.id +} +data "azurerm_key_vault_secret" "reporting-db-password" { + name = "reporting-db-password" + key_vault_id = data.azurerm_key_vault.kv-goodfood-reporting.id +} \ No newline at end of file diff --git a/services/reporting/terraform/env/dev-backend.tfvars.example b/services/reporting/terraform/env/dev-backend.tfvars.example new file mode 100644 index 00000000..afb49b83 --- /dev/null +++ b/services/reporting/terraform/env/dev-backend.tfvars.example @@ -0,0 +1,4 @@ +resource_group_name = "rg-goodfood-dev" +storage_account_name = "sa-goodfood-states" +container_name = "tfstate" +key = "reporting-dev.tfstate" diff --git a/services/reporting/terraform/env/dev.tfvars.example b/services/reporting/terraform/env/dev.tfvars.example new file mode 100644 index 00000000..4ac1f44d --- /dev/null +++ b/services/reporting/terraform/env/dev.tfvars.example @@ -0,0 +1 @@ +environnment_suffix = "-dev" diff --git a/services/reporting/terraform/main.tf b/services/reporting/terraform/main.tf new file mode 100644 index 00000000..5a7a9c10 --- /dev/null +++ b/services/reporting/terraform/main.tf @@ -0,0 +1,74 @@ +terraform { + required_providers { + azurerm = { + source = "hashicorp/azurerm" + version = "3.48.0" + } + } + backend "azurerm" {} +} + +provider "azurerm" { + features { + key_vault { + purge_soft_deleted_secrets_on_destroy = true + recover_soft_deleted_secrets = true + } + } +} + +resource "azurerm_key_vault" "kv-goodfood-reporting" { + name = "kv-goodfood-reporting" + location = data.azurerm_resource_group.rg-goodfood.location + resource_group_name = data.azurerm_resource_group.rg-goodfood.name + tenant_id = data.azurerm_client_config.current.tenant_id + sku_name = "standard" + soft_delete_retention_days = 7 + + access_policy { + tenant_id = data.azurerm_client_config.current.tenant_id + object_id = data.azurerm_client_config.current.object_id + + key_permissions = [ + "Create", + "Get", + ] + + secret_permissions = [ + "Set", + "Get", + "Delete", + "Purge", + "Recover" + ] + } +} + +resource "azurerm_postgresql_server" "pg-goodfood-reporting" { + name = "pg-goodfood-reporting${var.environnment_suffix}" + location = data.azurerm_resource_group.rg-goodfood.location + resource_group_name = data.azurerm_resource_group.rg-goodfood.name + + sku_name = "B_Gen5_2" + + storage_mb = 5120 + backup_retention_days = 7 + geo_redundant_backup_enabled = false + auto_grow_enabled = true + + administrator_reportingin = data.azurerm_key_vault_secret.reporting-db-reportingin.value + administrator_reportingin_password = data.azurerm_key_vault_secret.reporting-db-password.value + version = "11" + + ssl_enforcement_enabled = false + ssl_minimal_tls_version_enforced = "TLSEnforcementDisabled" // TODO: change to TLS1_2 + +} + +resource "azurerm_postgresql_firewall_rule" "pgfw-goodfood-reporting" { + name = "allow-azure-resources" + resource_group_name = data.azurerm_resource_group.rg-goodfood.name + server_name = azurerm_postgresql_server.pg-goodfood-reporting.name + start_ip_address = "0.0.0.0" + end_ip_address = "0.0.0.0" +} diff --git a/services/reporting/terraform/outputs.tf b/services/reporting/terraform/outputs.tf new file mode 100644 index 00000000..a2d60616 --- /dev/null +++ b/services/reporting/terraform/outputs.tf @@ -0,0 +1,6 @@ +output "main-rg-name" { + value = data.azurerm_resource_group.rg-goodfood.name +} +output "main-rg-id" { + value = data.azurerm_resource_group.rg-goodfood.id +} \ No newline at end of file diff --git a/services/reporting/terraform/variables.tf b/services/reporting/terraform/variables.tf new file mode 100644 index 00000000..65fd7547 --- /dev/null +++ b/services/reporting/terraform/variables.tf @@ -0,0 +1,16 @@ +variable "environnment_suffix" { + type = string + description = "The suffix to append to the environment name" +} + +variable "location" { + type = string + description = "The location/region where all resources in this environment should be created" + default = "West Europe" +} + +variable "project_name" { + type = string + description = "The name of the project" + default = "goodfood" +} \ No newline at end of file From 4ae5da417d3737089dd78c3eb339c8bb07b3f6da Mon Sep 17 00:00:00 2001 From: Florian Leroux <10078837+floriaaan@users.noreply.github.com> Date: Sun, 16 Apr 2023 13:05:06 +0200 Subject: [PATCH 028/883] fix(typo): replace all "log" into "reporting" breaks word "login" --- services/reporting/terraform/data.tf | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/services/reporting/terraform/data.tf b/services/reporting/terraform/data.tf index 7c2f7d37..129bc272 100644 --- a/services/reporting/terraform/data.tf +++ b/services/reporting/terraform/data.tf @@ -7,11 +7,11 @@ data "azurerm_key_vault" "kv-goodfood-reporting" { name = "kv-${var.project_name}" } -data "azurerm_key_vault_secret" "reporting-db-reportingin" { - name = "reporting-db-reportingin" +data "azurerm_key_vault_secret" "reporting-db-login" { + name = "reporting-db-login" key_vault_id = data.azurerm_key_vault.kv-goodfood-reporting.id } data "azurerm_key_vault_secret" "reporting-db-password" { name = "reporting-db-password" key_vault_id = data.azurerm_key_vault.kv-goodfood-reporting.id -} \ No newline at end of file +} From 41e0490c2b2fefc808cdc6984f7c00d35a60d42b Mon Sep 17 00:00:00 2001 From: Florian Leroux <10078837+floriaaan@users.noreply.github.com> Date: Sun, 16 Apr 2023 13:06:06 +0200 Subject: [PATCH 029/883] fix(typo): replace "log" into "reporting" breaks word "login" --- services/reporting/terraform/main.tf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/services/reporting/terraform/main.tf b/services/reporting/terraform/main.tf index 5a7a9c10..9bd38bfd 100644 --- a/services/reporting/terraform/main.tf +++ b/services/reporting/terraform/main.tf @@ -56,8 +56,8 @@ resource "azurerm_postgresql_server" "pg-goodfood-reporting" { geo_redundant_backup_enabled = false auto_grow_enabled = true - administrator_reportingin = data.azurerm_key_vault_secret.reporting-db-reportingin.value - administrator_reportingin_password = data.azurerm_key_vault_secret.reporting-db-password.value + administrator_login = data.azurerm_key_vault_secret.reporting-db-login.value + administrator_login_password = data.azurerm_key_vault_secret.reporting-db-password.value version = "11" ssl_enforcement_enabled = false From 8fbf9341ace07a21fcd32282597ee64ba7227bf8 Mon Sep 17 00:00:00 2001 From: Florian LEROUX <10078837+floriaaan@users.noreply.github.com> Date: Sun, 16 Apr 2023 13:15:10 +0200 Subject: [PATCH 030/883] feat(tf): add terraform files --- services/order/README.md | 41 ++++++++ services/order/terraform/data.tf | 17 ++++ .../terraform/env/dev-backend.tfvars.example | 4 + .../order/terraform/env/dev.tfvars.example | 1 + services/order/terraform/main.tf | 95 +++++++++++++++++++ services/order/terraform/outputs.tf | 6 ++ services/order/terraform/variables.tf | 16 ++++ 7 files changed, 180 insertions(+) create mode 100644 services/order/README.md create mode 100644 services/order/terraform/data.tf create mode 100644 services/order/terraform/env/dev-backend.tfvars.example create mode 100644 services/order/terraform/env/dev.tfvars.example create mode 100644 services/order/terraform/main.tf create mode 100644 services/order/terraform/outputs.tf create mode 100644 services/order/terraform/variables.tf diff --git a/services/order/README.md b/services/order/README.md new file mode 100644 index 00000000..7cace267 --- /dev/null +++ b/services/order/README.md @@ -0,0 +1,41 @@ +# Order Microservice + +| Informations | +| ------------------------------------------- | +| **Port:** 50007 | +| **Developer:** @floriaaan | +| **Status:** In progress | +| **Last update:** 2023-04-16 | +| **Language:** NodeJS | +| **Dependencies:** TypeScript, gRPC, MongoDB | +| **Models:** ? | + +## gRPC Methods + +TBW + +## Requirements + +To run this microservice, you will need to have the following installed on your system: + +- NodeJS (v18.12.0 or higher) (dev. with v18.12.0) +- MongoDB + +You can use the following tools to help you with the setup: + +- You can use nvm to set your Node version using: + - `nvm use`. + +## Getting started + +### 1. Clone the repository and install dependencies + +1. Clone the `goodfood` repository to your local machine. +2. Navigate to the service directory (`services/order`) in your terminal. +3. Run `npm install` to install the necessary dependencies. +4. Create a `.env` file at the root of the project directory and add the environment variables values (see `.env.example`). +5. Run `npm run start` to start the microservice. + +You can now access the microservice at `http://localhost:50007`. + +NB: If you want to run the microservice in development mode, you can run `npm run dev` instead. diff --git a/services/order/terraform/data.tf b/services/order/terraform/data.tf new file mode 100644 index 00000000..bc3e9769 --- /dev/null +++ b/services/order/terraform/data.tf @@ -0,0 +1,17 @@ +data "azurerm_resource_group" "rg-goodfood" { + name = "rg-${var.project_name}${var.environnment_suffix}" +} + +data "azurerm_key_vault" "kv-goodfood-order" { + resource_group_name = data.azurerm_resource_group.rg-goodfood.name + name = "kv-${var.project_name}" +} + +data "azurerm_key_vault_secret" "order-db-login" { + name = "order-db-login" + key_vault_id = data.azurerm_key_vault.kv-goodfood-order.id +} +data "azurerm_key_vault_secret" "order-db-password" { + name = "order-db-password" + key_vault_id = data.azurerm_key_vault.kv-goodfood-order.id +} \ No newline at end of file diff --git a/services/order/terraform/env/dev-backend.tfvars.example b/services/order/terraform/env/dev-backend.tfvars.example new file mode 100644 index 00000000..61cb3ae1 --- /dev/null +++ b/services/order/terraform/env/dev-backend.tfvars.example @@ -0,0 +1,4 @@ +resource_group_name = "rg-goodfood-dev" +storage_account_name = "sa-goodfood-states" +container_name = "tfstate" +key = "order-dev.tfstate" diff --git a/services/order/terraform/env/dev.tfvars.example b/services/order/terraform/env/dev.tfvars.example new file mode 100644 index 00000000..4ac1f44d --- /dev/null +++ b/services/order/terraform/env/dev.tfvars.example @@ -0,0 +1 @@ +environnment_suffix = "-dev" diff --git a/services/order/terraform/main.tf b/services/order/terraform/main.tf new file mode 100644 index 00000000..b1b7fd3f --- /dev/null +++ b/services/order/terraform/main.tf @@ -0,0 +1,95 @@ +terraform { + required_providers { + azurerm = { + source = "hashicorp/azurerm" + version = "3.48.0" + } + } + backend "azurerm" {} +} + +provider "azurerm" { + features { + key_vault { + purge_soft_deleted_secrets_on_destroy = true + recover_soft_deleted_secrets = true + } + } +} + +resource "azurerm_key_vault" "kv-goodfood-order" { + name = "kv-goodfood-order" + location = data.azurerm_resource_group.rg-goodfood.location + resource_group_name = data.azurerm_resource_group.rg-goodfood.name + tenant_id = data.azurerm_client_config.current.tenant_id + sku_name = "standard" + soft_delete_retention_days = 7 + + access_policy { + tenant_id = data.azurerm_client_config.current.tenant_id + object_id = data.azurerm_client_config.current.object_id + + key_permissions = [ + "Create", + "Get", + ] + + secret_permissions = [ + "Set", + "Get", + "Delete", + "Purge", + "Recover" + ] + } +} + +data "azurerm_cosmosdb_account" "cosmosacc-goodfood-order" { + name = "cacc-goodfood-order" + resource_group_name = data.azurerm_resource_group.rg-goodfood.name + + kind = "MongoDB" + enable_automatic_failover = true + + capabilities { + name = "EnableMongo" + } + + consistency_policy { + consistency_level = "BoundedStaleness" + max_interval_in_seconds = 400 + max_staleness_prefix = 200000 + } + + geo_location { + location = var.location + } +} + +resource "azurerm_cosmosdb_mongo_database" "cosmosdb-goodfood-order" { + name = "cosmosdb-goodfood-order" + resource_group_name = data.azurerm_resource_group.rg-goodfood.name + account_name = data.azurerm_cosmosdb_account.cosmosacc-goodfood-order.name + throughput = 400 +} + +resource "azurerm_cosmosdb_mongo_collection" "mongocollection-goodfood-order" { + name = "mongocollection-goodfood-order" + resource_group_name = data.azurerm_resource_group.rg-goodfood.name + account_name = data.azurerm_cosmosdb_account.cosmosacc-goodfood-order.name + database_name = azurerm_cosmosdb_mongo_database.cosmosdb-goodfood-order.name + + default_ttl_seconds = "777" + shard_key = "uniqueKey" + throughput = 400 + + lifecycle { + ignore_changes = [index] + } + + depends_on = [ + azurerm_cosmosdb_mongo_database.cosmosdb-goodfood-order + ] + + +} diff --git a/services/order/terraform/outputs.tf b/services/order/terraform/outputs.tf new file mode 100644 index 00000000..a2d60616 --- /dev/null +++ b/services/order/terraform/outputs.tf @@ -0,0 +1,6 @@ +output "main-rg-name" { + value = data.azurerm_resource_group.rg-goodfood.name +} +output "main-rg-id" { + value = data.azurerm_resource_group.rg-goodfood.id +} \ No newline at end of file diff --git a/services/order/terraform/variables.tf b/services/order/terraform/variables.tf new file mode 100644 index 00000000..65fd7547 --- /dev/null +++ b/services/order/terraform/variables.tf @@ -0,0 +1,16 @@ +variable "environnment_suffix" { + type = string + description = "The suffix to append to the environment name" +} + +variable "location" { + type = string + description = "The location/region where all resources in this environment should be created" + default = "West Europe" +} + +variable "project_name" { + type = string + description = "The name of the project" + default = "goodfood" +} \ No newline at end of file From 976af06e217dfe9833302b25b45253295d7d14bc Mon Sep 17 00:00:00 2001 From: Florian LEROUX <10078837+floriaaan@users.noreply.github.com> Date: Mon, 17 Apr 2023 12:50:53 +0200 Subject: [PATCH 031/883] feat(main): add log grpc server --- services/log/.env.example | 2 + services/log/go.mod | 26 +++ services/log/go.sum | 94 ++++++++ services/log/proto | 1 + services/log/server/main.go | 120 +++++++++++ services/proto/log.pb.go | 392 ++++++++++++++++++++++++++++++++++ services/proto/log.proto | 36 ++++ services/proto/log_grpc.pb.go | 178 +++++++++++++++ 8 files changed, 849 insertions(+) create mode 100644 services/log/.env.example create mode 100644 services/log/go.mod create mode 100644 services/log/go.sum create mode 120000 services/log/proto create mode 100644 services/log/server/main.go create mode 100644 services/proto/log.pb.go create mode 100644 services/proto/log.proto create mode 100644 services/proto/log_grpc.pb.go diff --git a/services/log/.env.example b/services/log/.env.example new file mode 100644 index 00000000..15c2af21 --- /dev/null +++ b/services/log/.env.example @@ -0,0 +1,2 @@ +DATABASE_URL=postgres://postgres:password@localhost:5432/postgres +PORT=50021 \ No newline at end of file diff --git a/services/log/go.mod b/services/log/go.mod new file mode 100644 index 00000000..e0498253 --- /dev/null +++ b/services/log/go.mod @@ -0,0 +1,26 @@ +module goodfood-log + +go 1.20 + +require github.com/golang/protobuf v1.5.3 + +require ( + github.com/jackc/pgpassfile v1.0.0 // indirect + github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a // indirect + github.com/jackc/pgx/v5 v5.3.0 // indirect + github.com/jinzhu/inflection v1.0.0 // indirect + github.com/jinzhu/now v1.1.5 // indirect + github.com/joho/godotenv v1.5.1 // indirect + golang.org/x/crypto v0.6.0 // indirect + golang.org/x/net v0.8.0 // indirect + golang.org/x/sys v0.6.0 // indirect + golang.org/x/text v0.8.0 // indirect + google.golang.org/genproto v0.0.0-20230110181048-76db0878b65f // indirect + gorm.io/gorm v1.25.0 // indirect +) + +require ( + google.golang.org/grpc v1.54.0 + google.golang.org/protobuf v1.30.0 // indirect + gorm.io/driver/postgres v1.5.0 +) diff --git a/services/log/go.sum b/services/log/go.sum new file mode 100644 index 00000000..d52d9ebb --- /dev/null +++ b/services/log/go.sum @@ -0,0 +1,94 @@ +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= +github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM= +github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg= +github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a h1:bbPeKD0xmW/Y25WS6cokEszi5g+S0QxI/d45PkRi7Nk= +github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM= +github.com/jackc/pgx/v5 v5.3.0 h1:/NQi8KHMpKWHInxXesC8yD4DhkXPrVhmnwYkjp9AmBA= +github.com/jackc/pgx/v5 v5.3.0/go.mod h1:t3JDKnCBlYIc0ewLF0Q7B8MXmoIaBOZj/ic7iHozM/8= +github.com/jackc/puddle/v2 v2.2.0/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4= +github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E= +github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= +github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ= +github.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= +github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0= +github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.6.0 h1:qfktjS5LUO+fFKeJXZ+ikTRijMmljikvG68fpMMruSc= +golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.8.0 h1:Zrh2ngAOFYneWTAIAPethzeaQLuHwhuBkuV6ZiRnUaQ= +golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.6.0 h1:MVltZSvRTcU2ljQOhs94SXPftV6DCNnZViHeQps87pQ= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.8.0 h1:57P1ETyNKtuIjB4SRd15iJxuhj8Gc416Y78H3qgMh68= +golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/genproto v0.0.0-20230110181048-76db0878b65f h1:BWUVssLB0HVOSY78gIdvk1dTVYtT1y8SBWtPYuTJ/6w= +google.golang.org/genproto v0.0.0-20230110181048-76db0878b65f/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/grpc v1.54.0 h1:EhTqbhiYeixwWQtAEZAxmV9MGqcjEU2mFx52xCzNyag= +google.golang.org/grpc v1.54.0/go.mod h1:PUSEXI6iWghWaB6lXM4knEgpJNu2qUcKfDtNci3EC2g= +google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= +google.golang.org/protobuf v1.26.0 h1:bxAC2xTBsZGibn2RTntX0oH50xLsqy1OxA9tTL3p/lk= +google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.30.0 h1:kPPoIgf3TsEvrm0PFe15JQ+570QVxYzEvvHqChK+cng= +google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gorm.io/driver/postgres v1.5.0 h1:u2FXTy14l45qc3UeCJ7QaAXZmZfDDv0YrthvmRq1l0U= +gorm.io/driver/postgres v1.5.0/go.mod h1:FUZXzO+5Uqg5zzwzv4KK49R8lvGIyscBOqYrtI1Ce9A= +gorm.io/gorm v1.24.7-0.20230306060331-85eaf9eeda11 h1:9qNbmu21nNThCNnF5i2R3kw2aL27U8ZwbzccNjOmW0g= +gorm.io/gorm v1.24.7-0.20230306060331-85eaf9eeda11/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k= +gorm.io/gorm v1.25.0 h1:+KtYtb2roDz14EQe4bla8CbQlmb9dN3VejSai3lprfU= +gorm.io/gorm v1.25.0/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k= diff --git a/services/log/proto b/services/log/proto new file mode 120000 index 00000000..4d1e2d8b --- /dev/null +++ b/services/log/proto @@ -0,0 +1 @@ +../proto/ \ No newline at end of file diff --git a/services/log/server/main.go b/services/log/server/main.go new file mode 100644 index 00000000..d75ddbc7 --- /dev/null +++ b/services/log/server/main.go @@ -0,0 +1,120 @@ +package main + +import ( + "context" + "fmt" + "log" + "net" + "os" + + pb "goodfood-log/proto" + + "github.com/joho/godotenv" + + "github.com/golang/protobuf/ptypes/empty" + "github.com/golang/protobuf/ptypes/timestamp" + "google.golang.org/grpc" + "google.golang.org/protobuf/types/known/structpb" + "gorm.io/driver/postgres" + "gorm.io/gorm" +) + +type Log struct { + gorm.Model + EventMessage string `json:"event_message"` + Metainfo *structpb.Struct `gorm:"type:jsonb;column:metainfo"` + Timestamp *timestamp.Timestamp +} + +// *main.LogServiceServer satisfies the interface generated by the protobuf compiler +type LogServiceServer struct { + pb.UnimplementedLogServiceServer + DB *gorm.DB +} + +func (l *Log) ToProto() *pb.Log { + return &pb.Log{ + Id: int32(l.ID), + EventMessage: l.EventMessage, + Metainfo: l.Metainfo, + Timestamp: l.Timestamp, + } +} + +func (s *LogServiceServer) CreateLog(ctx context.Context, req *Log) (*pb.CreateLogResponse, error) { + log := &Log{ + EventMessage: req.EventMessage, + Metainfo: req.Metainfo, + Timestamp: req.Timestamp, + } + result := s.DB.Create(log) + if result.Error != nil { + return nil, result.Error + } + return &pb.CreateLogResponse{ + Id: int32(log.ID), + }, nil +} + +func (s *LogServiceServer) GetLog(ctx context.Context, req *pb.GetLogRequest) (*Log, error) { + var log Log + result := s.DB.First(&log, req.Id) + if result.Error != nil { + return nil, result.Error + } + return &log, nil +} + +func (s *LogServiceServer) ListLog(ctx context.Context, _ *empty.Empty) (*pb.ListLogResponse, error) { + var logs []Log + result := s.DB.Find(&logs) + if result.Error != nil { + return nil, result.Error + } + var logMessages []*pb.Log + for _, log := range logs { + logMessages = append(logMessages, log.ToProto()) + } + return &pb.ListLogResponse{ + Logs: logMessages, + }, nil +} + +func ConnectToDB(connectionString string) (*gorm.DB, error) { + db, err := gorm.Open(postgres.Open(connectionString), &gorm.Config{}) + if err != nil { + return nil, err + } + return db, nil +} + +func main() { + err := godotenv.Load() + if err != nil { + log.Fatalf("failed to load env file: %v", err) + } + dbURI := os.Getenv("DATABASE_URL") + port := os.Getenv("PORT") + + db, err := ConnectToDB(dbURI) + if err != nil { + log.Fatalf("failed to connect to database: %v", err) + } + + lis, err := net.Listen("tcp", fmt.Sprintf(":%s", port)) + if err != nil { + log.Fatalf("failed to listen: %v", err) + } + + s := grpc.NewServer() + srv := &LogServiceServer{ + DB: db, + } + + pb.RegisterLogServiceServer(s, srv.UnimplementedLogServiceServer) + + fmt.Println("Starting gRPC server...") + if err := s.Serve(lis); err != nil { + log.Fatalf("failed to serve: %v", err) + } +} diff --git a/services/proto/log.pb.go b/services/proto/log.pb.go new file mode 100644 index 00000000..fbc675c7 --- /dev/null +++ b/services/proto/log.pb.go @@ -0,0 +1,392 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.28.1 +// protoc v3.21.12 +// source: log.proto + +package __ + +import ( + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + emptypb "google.golang.org/protobuf/types/known/emptypb" + structpb "google.golang.org/protobuf/types/known/structpb" + timestamppb "google.golang.org/protobuf/types/known/timestamppb" + reflect "reflect" + sync "sync" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +type Log struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Id int32 `protobuf:"varint,1,opt,name=id,proto3" json:"id,omitempty"` + EventMessage string `protobuf:"bytes,2,opt,name=event_message,json=eventMessage,proto3" json:"event_message,omitempty"` + Metainfo *structpb.Struct `protobuf:"bytes,4,opt,name=metainfo,proto3" json:"metainfo,omitempty"` + Timestamp *timestamppb.Timestamp `protobuf:"bytes,5,opt,name=timestamp,proto3" json:"timestamp,omitempty"` +} + +func (x *Log) Reset() { + *x = Log{} + if protoimpl.UnsafeEnabled { + mi := &file_log_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Log) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Log) ProtoMessage() {} + +func (x *Log) ProtoReflect() protoreflect.Message { + mi := &file_log_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Log.ProtoReflect.Descriptor instead. +func (*Log) Descriptor() ([]byte, []int) { + return file_log_proto_rawDescGZIP(), []int{0} +} + +func (x *Log) GetId() int32 { + if x != nil { + return x.Id + } + return 0 +} + +func (x *Log) GetEventMessage() string { + if x != nil { + return x.EventMessage + } + return "" +} + +func (x *Log) GetMetainfo() *structpb.Struct { + if x != nil { + return x.Metainfo + } + return nil +} + +func (x *Log) GetTimestamp() *timestamppb.Timestamp { + if x != nil { + return x.Timestamp + } + return nil +} + +type CreateLogResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Id int32 `protobuf:"varint,1,opt,name=id,proto3" json:"id,omitempty"` +} + +func (x *CreateLogResponse) Reset() { + *x = CreateLogResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_log_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CreateLogResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CreateLogResponse) ProtoMessage() {} + +func (x *CreateLogResponse) ProtoReflect() protoreflect.Message { + mi := &file_log_proto_msgTypes[1] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CreateLogResponse.ProtoReflect.Descriptor instead. +func (*CreateLogResponse) Descriptor() ([]byte, []int) { + return file_log_proto_rawDescGZIP(), []int{1} +} + +func (x *CreateLogResponse) GetId() int32 { + if x != nil { + return x.Id + } + return 0 +} + +type GetLogRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Id int32 `protobuf:"varint,1,opt,name=id,proto3" json:"id,omitempty"` +} + +func (x *GetLogRequest) Reset() { + *x = GetLogRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_log_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetLogRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetLogRequest) ProtoMessage() {} + +func (x *GetLogRequest) ProtoReflect() protoreflect.Message { + mi := &file_log_proto_msgTypes[2] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetLogRequest.ProtoReflect.Descriptor instead. +func (*GetLogRequest) Descriptor() ([]byte, []int) { + return file_log_proto_rawDescGZIP(), []int{2} +} + +func (x *GetLogRequest) GetId() int32 { + if x != nil { + return x.Id + } + return 0 +} + +type ListLogResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Logs []*Log `protobuf:"bytes,1,rep,name=logs,proto3" json:"logs,omitempty"` +} + +func (x *ListLogResponse) Reset() { + *x = ListLogResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_log_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ListLogResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListLogResponse) ProtoMessage() {} + +func (x *ListLogResponse) ProtoReflect() protoreflect.Message { + mi := &file_log_proto_msgTypes[3] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListLogResponse.ProtoReflect.Descriptor instead. +func (*ListLogResponse) Descriptor() ([]byte, []int) { + return file_log_proto_rawDescGZIP(), []int{3} +} + +func (x *ListLogResponse) GetLogs() []*Log { + if x != nil { + return x.Logs + } + return nil +} + +var File_log_proto protoreflect.FileDescriptor + +var file_log_proto_rawDesc = []byte{ + 0x0a, 0x09, 0x6c, 0x6f, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x05, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2f, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x1a, 0x1b, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2f, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xa9, + 0x01, 0x0a, 0x03, 0x4c, 0x6f, 0x67, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x02, 0x69, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, + 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x33, 0x0a, 0x08, 0x6d, + 0x65, 0x74, 0x61, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x69, 0x6e, 0x66, 0x6f, + 0x12, 0x38, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, + 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0x23, 0x0a, 0x11, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x4c, 0x6f, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x69, 0x64, 0x22, + 0x1f, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x4c, 0x6f, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x69, 0x64, + 0x22, 0x31, 0x0a, 0x0f, 0x4c, 0x69, 0x73, 0x74, 0x4c, 0x6f, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x1e, 0x0a, 0x04, 0x6c, 0x6f, 0x67, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x0a, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x4c, 0x6f, 0x67, 0x52, 0x04, 0x6c, + 0x6f, 0x67, 0x73, 0x32, 0xac, 0x01, 0x0a, 0x0a, 0x4c, 0x6f, 0x67, 0x53, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x12, 0x33, 0x0a, 0x09, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4c, 0x6f, 0x67, 0x12, + 0x0a, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x4c, 0x6f, 0x67, 0x1a, 0x18, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4c, 0x6f, 0x67, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x2c, 0x0a, 0x06, 0x47, 0x65, 0x74, 0x4c, 0x6f, + 0x67, 0x12, 0x14, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x47, 0x65, 0x74, 0x4c, 0x6f, 0x67, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0a, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, + 0x4c, 0x6f, 0x67, 0x22, 0x00, 0x12, 0x3b, 0x0a, 0x07, 0x4c, 0x69, 0x73, 0x74, 0x4c, 0x6f, 0x67, + 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4c, 0x6f, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x00, 0x42, 0x03, 0x5a, 0x01, 0x2e, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_log_proto_rawDescOnce sync.Once + file_log_proto_rawDescData = file_log_proto_rawDesc +) + +func file_log_proto_rawDescGZIP() []byte { + file_log_proto_rawDescOnce.Do(func() { + file_log_proto_rawDescData = protoimpl.X.CompressGZIP(file_log_proto_rawDescData) + }) + return file_log_proto_rawDescData +} + +var file_log_proto_msgTypes = make([]protoimpl.MessageInfo, 4) +var file_log_proto_goTypes = []interface{}{ + (*Log)(nil), // 0: proto.Log + (*CreateLogResponse)(nil), // 1: proto.CreateLogResponse + (*GetLogRequest)(nil), // 2: proto.GetLogRequest + (*ListLogResponse)(nil), // 3: proto.ListLogResponse + (*structpb.Struct)(nil), // 4: google.protobuf.Struct + (*timestamppb.Timestamp)(nil), // 5: google.protobuf.Timestamp + (*emptypb.Empty)(nil), // 6: google.protobuf.Empty +} +var file_log_proto_depIdxs = []int32{ + 4, // 0: proto.Log.metainfo:type_name -> google.protobuf.Struct + 5, // 1: proto.Log.timestamp:type_name -> google.protobuf.Timestamp + 0, // 2: proto.ListLogResponse.logs:type_name -> proto.Log + 0, // 3: proto.LogService.CreateLog:input_type -> proto.Log + 2, // 4: proto.LogService.GetLog:input_type -> proto.GetLogRequest + 6, // 5: proto.LogService.ListLog:input_type -> google.protobuf.Empty + 1, // 6: proto.LogService.CreateLog:output_type -> proto.CreateLogResponse + 0, // 7: proto.LogService.GetLog:output_type -> proto.Log + 3, // 8: proto.LogService.ListLog:output_type -> proto.ListLogResponse + 6, // [6:9] is the sub-list for method output_type + 3, // [3:6] is the sub-list for method input_type + 3, // [3:3] is the sub-list for extension type_name + 3, // [3:3] is the sub-list for extension extendee + 0, // [0:3] is the sub-list for field type_name +} + +func init() { file_log_proto_init() } +func file_log_proto_init() { + if File_log_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_log_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Log); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_log_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CreateLogResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_log_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetLogRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_log_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListLogResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_log_proto_rawDesc, + NumEnums: 0, + NumMessages: 4, + NumExtensions: 0, + NumServices: 1, + }, + GoTypes: file_log_proto_goTypes, + DependencyIndexes: file_log_proto_depIdxs, + MessageInfos: file_log_proto_msgTypes, + }.Build() + File_log_proto = out.File + file_log_proto_rawDesc = nil + file_log_proto_goTypes = nil + file_log_proto_depIdxs = nil +} diff --git a/services/proto/log.proto b/services/proto/log.proto new file mode 100644 index 00000000..a0d0641b --- /dev/null +++ b/services/proto/log.proto @@ -0,0 +1,36 @@ +syntax = "proto3"; + +package com.goodfood.log; + +import "google/protobuf/struct.proto"; +import "google/protobuf/timestamp.proto"; +import "google/protobuf/empty.proto"; + +option go_package = "."; + + + +message Log { + int32 id = 1; + string event_message = 2; + google.protobuf.Struct metainfo = 4; + google.protobuf.Timestamp timestamp = 5; +} + +service LogService { + rpc CreateLog(Log) returns (CreateLogResponse) {} + rpc GetLog(GetLogRequest) returns (Log) {} + rpc ListLog(google.protobuf.Empty) returns (ListLogResponse) {} + } + + + message CreateLogResponse { + int32 id = 1; + } + message GetLogRequest { + int32 id = 1; + } + + message ListLogResponse { + repeated Log logs = 1; + } \ No newline at end of file diff --git a/services/proto/log_grpc.pb.go b/services/proto/log_grpc.pb.go new file mode 100644 index 00000000..0a2fbde5 --- /dev/null +++ b/services/proto/log_grpc.pb.go @@ -0,0 +1,178 @@ +// Code generated by protoc-gen-go-grpc. DO NOT EDIT. +// versions: +// - protoc-gen-go-grpc v1.2.0 +// - protoc v3.21.12 +// source: log.proto + +package __ + +import ( + context "context" + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" + emptypb "google.golang.org/protobuf/types/known/emptypb" +) + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +// Requires gRPC-Go v1.32.0 or later. +const _ = grpc.SupportPackageIsVersion7 + +// LogServiceClient is the client API for LogService service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. +type LogServiceClient interface { + CreateLog(ctx context.Context, in *Log, opts ...grpc.CallOption) (*CreateLogResponse, error) + GetLog(ctx context.Context, in *GetLogRequest, opts ...grpc.CallOption) (*Log, error) + ListLog(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*ListLogResponse, error) +} + +type logServiceClient struct { + cc grpc.ClientConnInterface +} + +func NewLogServiceClient(cc grpc.ClientConnInterface) LogServiceClient { + return &logServiceClient{cc} +} + +func (c *logServiceClient) CreateLog(ctx context.Context, in *Log, opts ...grpc.CallOption) (*CreateLogResponse, error) { + out := new(CreateLogResponse) + err := c.cc.Invoke(ctx, "/com.goodfood.log.LogService/CreateLog", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *logServiceClient) GetLog(ctx context.Context, in *GetLogRequest, opts ...grpc.CallOption) (*Log, error) { + out := new(Log) + err := c.cc.Invoke(ctx, "/com.goodfood.log.LogService/GetLog", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *logServiceClient) ListLog(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*ListLogResponse, error) { + out := new(ListLogResponse) + err := c.cc.Invoke(ctx, "/com.goodfood.log.LogService/ListLog", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +// LogServiceServer is the server API for LogService service. +// All implementations must embed UnimplementedLogServiceServer +// for forward compatibility +type LogServiceServer interface { + CreateLog(context.Context, *Log) (*CreateLogResponse, error) + GetLog(context.Context, *GetLogRequest) (*Log, error) + ListLog(context.Context, *emptypb.Empty) (*ListLogResponse, error) + mustEmbedUnimplementedLogServiceServer() +} + +// UnimplementedLogServiceServer must be embedded to have forward compatible implementations. +type UnimplementedLogServiceServer struct { +} + +func (UnimplementedLogServiceServer) CreateLog(context.Context, *Log) (*CreateLogResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method CreateLog not implemented") +} +func (UnimplementedLogServiceServer) GetLog(context.Context, *GetLogRequest) (*Log, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetLog not implemented") +} +func (UnimplementedLogServiceServer) ListLog(context.Context, *emptypb.Empty) (*ListLogResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method ListLog not implemented") +} +func (UnimplementedLogServiceServer) mustEmbedUnimplementedLogServiceServer() {} + +// UnsafeLogServiceServer may be embedded to opt out of forward compatibility for this service. +// Use of this interface is not recommended, as added methods to LogServiceServer will +// result in compilation errors. +type UnsafeLogServiceServer interface { + mustEmbedUnimplementedLogServiceServer() +} + +func RegisterLogServiceServer(s grpc.ServiceRegistrar, srv LogServiceServer) { + s.RegisterService(&LogService_ServiceDesc, srv) +} + +func _LogService_CreateLog_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(Log) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(LogServiceServer).CreateLog(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/com.goodfood.log.LogService/CreateLog", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(LogServiceServer).CreateLog(ctx, req.(*Log)) + } + return interceptor(ctx, in, info, handler) +} + +func _LogService_GetLog_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetLogRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(LogServiceServer).GetLog(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/com.goodfood.log.LogService/GetLog", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(LogServiceServer).GetLog(ctx, req.(*GetLogRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _LogService_ListLog_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(emptypb.Empty) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(LogServiceServer).ListLog(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/com.goodfood.log.LogService/ListLog", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(LogServiceServer).ListLog(ctx, req.(*emptypb.Empty)) + } + return interceptor(ctx, in, info, handler) +} + +// LogService_ServiceDesc is the grpc.ServiceDesc for LogService service. +// It's only intended for direct use with grpc.RegisterService, +// and not to be introspected or modified (even as a copy) +var LogService_ServiceDesc = grpc.ServiceDesc{ + ServiceName: "com.goodfood.log.LogService", + HandlerType: (*LogServiceServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "CreateLog", + Handler: _LogService_CreateLog_Handler, + }, + { + MethodName: "GetLog", + Handler: _LogService_GetLog_Handler, + }, + { + MethodName: "ListLog", + Handler: _LogService_ListLog_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "log.proto", +} From e3713a3911cd6afdda9a36a0f1f5d14fce6e4821 Mon Sep 17 00:00:00 2001 From: anatole Date: Mon, 17 Apr 2023 13:46:01 +0200 Subject: [PATCH 032/883] fix(docker): fix the Dockerfile build --- services/delivery/Dockerfile | 20 ++++----- services/delivery/README.md | 58 ++++++++++++++++++-------- services/delivery/prisma/schema.prisma | 3 +- 3 files changed, 50 insertions(+), 31 deletions(-) diff --git a/services/delivery/Dockerfile b/services/delivery/Dockerfile index 0e62247a..a03f15dc 100644 --- a/services/delivery/Dockerfile +++ b/services/delivery/Dockerfile @@ -3,18 +3,14 @@ FROM node:18-alpine as builder # Set working directory WORKDIR /app -# Copy the package.json and package-lock.json files -COPY package*.json ./ +# Copy the application code +COPY ./delivery/ . # Install dependencies RUN npm install - -# Copy the application code -COPY . . - # Copy the proto files - TODO: fix this, proto files should be copied from goodfood/services/proto -# RUN cp -r -L ../proto /proto/ +COPY ./proto ./proto/ # Generate Prisma client RUN npx prisma generate @@ -22,8 +18,6 @@ RUN npx prisma generate # Build the application RUN npm run build -# Package the application -RUN npm run pkg # Create a new image with the application FROM node:18-alpine as runner @@ -32,11 +26,13 @@ FROM node:18-alpine as runner WORKDIR /app # Copy the application package -COPY --from=builder /app/bin /usr/local/bin -RUN ls /usr/local/bin +COPY --from=builder /app/dist . +COPY --from=builder /app/prisma/ . +COPY --from=builder /app/proto/ /proto/ +COPY --from=builder /app/node_modules/.prisma/client /.prisma/client/ # Expose the gRPC port EXPOSE 50008 # Start the server -CMD ["delivery-linux-x64"] +CMD [ "node", "index.js"] diff --git a/services/delivery/README.md b/services/delivery/README.md index 6f933c51..4450d510 100644 --- a/services/delivery/README.md +++ b/services/delivery/README.md @@ -1,7 +1,7 @@ # Delivery Microservice | Informations | -| ------------------------------------------------------------------ | +|--------------------------------------------------------------------| | **Port:** 50008 | | **Developer:** @floriaaan | | **Status:** In progress | @@ -14,20 +14,20 @@ - Delivery model: - - `CreateDelivery`: Creates a new delivery in the system. - - `GetDelivery`: Retrieves a delivery by its ID. - - `UpdateDelivery`: Updates the status of an existing delivery. - - `DeleteDelivery`: Deletes a delivery by its ID. - - `ListDeliveriesByUser`: Retrieves all deliveries for a given user. - - `ListDeliveriesByRestaurant`: Retrieves all deliveries for a given restaurant. + - `CreateDelivery`: Creates a new delivery in the system. + - `GetDelivery`: Retrieves a delivery by its ID. + - `UpdateDelivery`: Updates the status of an existing delivery. + - `DeleteDelivery`: Deletes a delivery by its ID. + - `ListDeliveriesByUser`: Retrieves all deliveries for a given user. + - `ListDeliveriesByRestaurant`: Retrieves all deliveries for a given restaurant. - Delivery person model: - - `CreateDeliveryPerson`: Creates a new delivery person in the system. - - `GetDeliveryPerson`: Retrieves a delivery person by its ID. - - `UpdateDeliveryPerson`: Updates an existing delivery person. - - `DeleteDeliveryPerson`: Deletes a delivery person by its ID. - - `ListDeliveryPersons`: Retrieves all delivery persons. - - `ListNearDeliveryPersons`: Retrieves all delivery persons near a given location. + - `CreateDeliveryPerson`: Creates a new delivery person in the system. + - `GetDeliveryPerson`: Retrieves a delivery person by its ID. + - `UpdateDeliveryPerson`: Updates an existing delivery person. + - `DeleteDeliveryPerson`: Deletes a delivery person by its ID. + - `ListDeliveryPersons`: Retrieves all delivery persons. + - `ListNearDeliveryPersons`: Retrieves all delivery persons near a given location. ## Requirements @@ -39,9 +39,9 @@ To run this microservice, you will need to have the following installed on your You can use the following tools to help you with the setup: - You can use nvm to set your Node version using: - - `nvm use`. + - `nvm use`. - You can use docker to run your Postgres database using: - - `docker run --name postgres -p 5432:5432 -e POSTGRES_PASSWORD=password -d postgres` + - `docker run --name postgres -p 5432:5432 -e POSTGRES_PASSWORD=password -d postgres` ## Getting started @@ -50,7 +50,8 @@ You can use the following tools to help you with the setup: 1. Clone the `goodfood` repository to your local machine. 2. Navigate to the service directory (`services/delivery`) in your terminal. 3. Run `npm install` to install the necessary dependencies. -4. Create a `.env` file at the root of the project directory and add the environment variables values (see `.env.example`). +4. Create a `.env` file at the root of the project directory and add the environment variables values ( + see `.env.example`). 5. Run `npm run start` to start the microservice. You can now access the microservice at `http://localhost:50008`. @@ -59,10 +60,31 @@ NB: If you want to run the microservice in development mode, you can run `npm ru ### 2. Create and seed the database -Run the following command to create your Postgres database structure. This also creates the models tables that are defined in [`prisma/schema.prisma`](./prisma/schema.prisma): +Run the following command to create your Postgres database structure. This also creates the models tables that are +defined in [`prisma/schema.prisma`](./prisma/schema.prisma): ``` npx prisma migrate dev --name init ``` -When `npx prisma migrate dev` is executed against a newly created database, seeding is also triggered. The seed file in [`prisma/seed.ts`](./prisma/seed.ts) will be executed and your database will be populated with the sample data. +When `npx prisma migrate dev` is executed against a newly created database, seeding is also triggered. The seed file +in [`prisma/seed.ts`](./prisma/seed.ts) will be executed and your database will be populated with the sample data. + +## Build and Run with Docker + +### Build + +To build the image you need to be in the **parent folder** of the service you want to build. Then run the following +command: + +``` +docker build -t goodfood-delivery:1.0.0 -f ./delivery/Dockerfile . +``` + +### Run + +Then run the following command: + +``` +docker run goodfood-delivery:1.0.0 +``` diff --git a/services/delivery/prisma/schema.prisma b/services/delivery/prisma/schema.prisma index 02929eb8..f769d414 100644 --- a/services/delivery/prisma/schema.prisma +++ b/services/delivery/prisma/schema.prisma @@ -4,7 +4,8 @@ datasource db { } generator client { - provider = "prisma-client-js" + provider = "prisma-client-js" + binaryTargets = ["linux-musl"] } enum Status { From 7f09997c3f30f12c40496a8c51712341946db028 Mon Sep 17 00:00:00 2001 From: anatole Date: Mon, 17 Apr 2023 14:03:17 +0200 Subject: [PATCH 033/883] fix(docker): precise the .env in the comment that run the image --- services/delivery/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/services/delivery/README.md b/services/delivery/README.md index 4450d510..c94da1c2 100644 --- a/services/delivery/README.md +++ b/services/delivery/README.md @@ -83,8 +83,8 @@ docker build -t goodfood-delivery:1.0.0 -f ./delivery/Dockerfile . ### Run -Then run the following command: +Create the .env base on the .env.example. Then run the following command: ``` -docker run goodfood-delivery:1.0.0 +docker run --env-file=.env goodfood-delivery:1.0.0 ``` From 7a44e0fe2963f5fca3279a3c347edb271582698c Mon Sep 17 00:00:00 2001 From: anatole Date: Mon, 17 Apr 2023 14:05:16 +0200 Subject: [PATCH 034/883] fix(proto): remove the symbolic link to /services/proto/ --- services/delivery/proto | 1 - 1 file changed, 1 deletion(-) delete mode 120000 services/delivery/proto diff --git a/services/delivery/proto b/services/delivery/proto deleted file mode 120000 index 4d1e2d8b..00000000 --- a/services/delivery/proto +++ /dev/null @@ -1 +0,0 @@ -../proto/ \ No newline at end of file From aef7c7702aff16c55596e403294d9b0509e7ae77 Mon Sep 17 00:00:00 2001 From: anatole Date: Mon, 17 Apr 2023 14:38:26 +0200 Subject: [PATCH 035/883] fix(types): fix type errors --- README.md | 1 - services/delivery/prisma/seed.ts | 8 ++++---- services/delivery/src/handlers/delivery/create.ts | 4 ++-- services/delivery/src/handlers/delivery/get.ts | 2 +- .../delivery/src/handlers/delivery/list-by-restaurant.ts | 2 +- services/delivery/src/handlers/delivery/list-by-user.ts | 2 +- services/delivery/src/handlers/delivery/update.ts | 4 ++-- services/delivery/src/types/index.d.ts | 6 ------ 8 files changed, 11 insertions(+), 18 deletions(-) diff --git a/README.md b/README.md index 7b51feee..4bf6e30e 100644 --- a/README.md +++ b/README.md @@ -46,7 +46,6 @@ The file hierarchy for this project is as follows: ├── gateway/ │ ├── k8s/ │ │ └── (...) # k8s files - │ ├── proto/ (symbolic link to /services/proto/) │ └── terraform/ │ └── (...) # terraform files ├── user/ diff --git a/services/delivery/prisma/seed.ts b/services/delivery/prisma/seed.ts index cc6998fd..7c517d02 100644 --- a/services/delivery/prisma/seed.ts +++ b/services/delivery/prisma/seed.ts @@ -28,7 +28,7 @@ const deliveries: Prisma.DeliveryCreateInput[] = [ { address: "15 rue de la paix 75000 Paris", eta: new Date("2023-01-01"), - person: { create: deliveryPerson[0] }, + delivery_person: { create: deliveryPerson[0] }, restaurant_id: "restaurant_id:1", user_id: "user_id:1", @@ -36,7 +36,7 @@ const deliveries: Prisma.DeliveryCreateInput[] = [ { address: "15 rue de la paix 75000 Paris", eta: new Date("2023-01-01"), - person: { create: deliveryPerson[0] }, + delivery_person: { create: deliveryPerson[0] }, restaurant_id: "restaurant_id:2", user_id: "user_id:1", @@ -44,7 +44,7 @@ const deliveries: Prisma.DeliveryCreateInput[] = [ { address: "16 rue de la paix 75000 Paris", eta: new Date("2023-02-01"), - person: { create: deliveryPerson[1] }, + delivery_person: { create: deliveryPerson[1] }, restaurant_id: "restaurant_id:1", user_id: "user_id:2", @@ -52,7 +52,7 @@ const deliveries: Prisma.DeliveryCreateInput[] = [ { address: "17 rue de la paix 75000 Paris", eta: new Date("2023-03-01"), - person: { create: deliveryPerson[2] }, + delivery_person: { create: deliveryPerson[2] }, restaurant_id: "restaurant_id:1", user_id: "user_id:3", diff --git a/services/delivery/src/handlers/delivery/create.ts b/services/delivery/src/handlers/delivery/create.ts index ba0a4b6a..1524de68 100644 --- a/services/delivery/src/handlers/delivery/create.ts +++ b/services/delivery/src/handlers/delivery/create.ts @@ -17,7 +17,7 @@ export const CreateDelivery = async ( eta: new Date(eta), address, status, - person: { + delivery_person: { connect: { id: delivery_person_id, }, @@ -26,7 +26,7 @@ export const CreateDelivery = async ( user_id, }, include: { - person: true, + delivery_person: true, }, }); callback(null, delivery); diff --git a/services/delivery/src/handlers/delivery/get.ts b/services/delivery/src/handlers/delivery/get.ts index 4f7d37a5..c6da00b3 100644 --- a/services/delivery/src/handlers/delivery/get.ts +++ b/services/delivery/src/handlers/delivery/get.ts @@ -14,7 +14,7 @@ export const GetDelivery = async ( const delivery = await prisma.delivery.findFirstOrThrow({ where: { id }, - include: { person: true }, + include: { delivery_person: true }, }); callback(null, delivery); } catch (error) { diff --git a/services/delivery/src/handlers/delivery/list-by-restaurant.ts b/services/delivery/src/handlers/delivery/list-by-restaurant.ts index 76aaa464..fc413ae1 100644 --- a/services/delivery/src/handlers/delivery/list-by-restaurant.ts +++ b/services/delivery/src/handlers/delivery/list-by-restaurant.ts @@ -17,7 +17,7 @@ export const ListDeliveriesByRestaurant = async ( const deliveries = await prisma.delivery.findMany({ where: { restaurant_id: id }, - include: { person: true }, + include: { delivery_person: true }, }); callback(null, { deliveries }); } catch (error) { diff --git a/services/delivery/src/handlers/delivery/list-by-user.ts b/services/delivery/src/handlers/delivery/list-by-user.ts index 30b5e3e1..93eddff9 100644 --- a/services/delivery/src/handlers/delivery/list-by-user.ts +++ b/services/delivery/src/handlers/delivery/list-by-user.ts @@ -14,7 +14,7 @@ export const ListDeliveriesByUser = async ( const deliveries = await prisma.delivery.findMany({ where: { user_id: id }, - include: { person: true }, + include: { delivery_person: true }, }); callback(null, { deliveries }); } catch (error) { diff --git a/services/delivery/src/handlers/delivery/update.ts b/services/delivery/src/handlers/delivery/update.ts index 41f4c8c9..a0267647 100644 --- a/services/delivery/src/handlers/delivery/update.ts +++ b/services/delivery/src/handlers/delivery/update.ts @@ -17,14 +17,14 @@ export const UpdateDelivery = async ( eta: new Date(eta), address, status, - person: { + delivery_person: { connect: { id: delivery_person_id, }, }, }, include: { - person: true, + delivery_person: true, }, }); callback(null, delivery); diff --git a/services/delivery/src/types/index.d.ts b/services/delivery/src/types/index.d.ts index 5f91a217..edf2bebf 100644 --- a/services/delivery/src/types/index.d.ts +++ b/services/delivery/src/types/index.d.ts @@ -1,9 +1,3 @@ export type Data = { request: T; }; - -export type Stream = { - write: (data: any) => void; - end: () => void; - request: T; -}; From c2b7317727bb22187f7b500a0309bb871ebeb0ed Mon Sep 17 00:00:00 2001 From: Florian LEROUX <10078837+floriaaan@users.noreply.github.com> Date: Tue, 18 Apr 2023 09:31:08 +0200 Subject: [PATCH 036/883] feat(db-grpc): link done (can create, read, list) --- services/log/main.go | 145 +++++++++++++++++++++ services/log/server/main.go | 120 ------------------ services/proto/log.pb.go | 232 +++++++++++++++++++++++----------- services/proto/log.proto | 15 ++- services/proto/log_grpc.pb.go | 12 +- 5 files changed, 318 insertions(+), 206 deletions(-) create mode 100644 services/log/main.go delete mode 100644 services/log/server/main.go diff --git a/services/log/main.go b/services/log/main.go new file mode 100644 index 00000000..9a47c8ee --- /dev/null +++ b/services/log/main.go @@ -0,0 +1,145 @@ +package main + +import ( + "context" + "encoding/json" + "fmt" + "log" + "net" + "os" + "time" + + pb "goodfood-log/proto" + + "github.com/joho/godotenv" + + "github.com/golang/protobuf/ptypes/empty" + "google.golang.org/grpc" + "google.golang.org/grpc/reflection" + "google.golang.org/protobuf/types/known/structpb" + "google.golang.org/protobuf/types/known/timestamppb" + "gorm.io/driver/postgres" + "gorm.io/gorm" +) + +type Log struct { + ID uint `gorm:"primarykey" json:"id"` + EventMessage string `gorm:"not null" json:"event_message"` + Metadata []uint8 `gorm:"type:jsonb" json:"metadata"` + Timestamp time.Time `gorm:"default:current_timestamp" json:"timestamp"` +} + +type service struct { + pb.LogServiceServer + DB *gorm.DB +} + +func (l *Log) ToProto() *pb.Log { + metadataMap := make(map[string]interface{}) + err := json.Unmarshal(l.Metadata, &metadataMap) + if err != nil { + fmt.Printf("failed to unmarshal metadata: %v", err) + } + metadata, _ := structpb.NewStruct(metadataMap) + + return &pb.Log{ + Id: int32(l.ID), + EventMessage: l.EventMessage, + Metadata: metadata, + Timestamp: ×tamppb.Timestamp{Seconds: l.Timestamp.Unix(), Nanos: int32(l.Timestamp.Nanosecond())}, + } +} + +func (s *service) CreateLog(ctx context.Context, req *pb.CreateLogRequest) (*pb.CreateLogResponse, error) { + bytes, _ := (*req.Metadata).MarshalJSON() + + log := &Log{ + EventMessage: req.EventMessage, + Metadata: bytes, + } + result := s.DB.Create(log) + if result.Error != nil { + return nil, result.Error + } + return &pb.CreateLogResponse{ + Id: int32(log.ID), + }, nil +} + +func (s *service) GetLog(ctx context.Context, req *pb.GetLogRequest) (*pb.Log, error) { + var log Log + result := s.DB.First(&log, req.Id) + if result.Error != nil { + return nil, result.Error + } + return log.ToProto(), nil +} + +func (s *service) ListLog(ctx context.Context, _ *empty.Empty) (*pb.ListLogResponse, error) { + var logs []Log + result := s.DB.Find(&logs) + if result.Error != nil { + return nil, result.Error + } + + logMessages := make([]*pb.Log, len(logs)) + for i, log := range logs { + logMessages[i] = log.ToProto() + } + + return &pb.ListLogResponse{ + Logs: logMessages, + }, nil +} + +func ConnectToDB(connectionString string) (*gorm.DB, error) { + db, err := gorm.Open(postgres.Open(connectionString), &gorm.Config{}) + db.AutoMigrate(&Log{}) + if err != nil { + return nil, err + } + return db, nil +} + +func ConsoleLog(ctx context.Context, req interface{}, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (interface{}, error) { + date := time.Now().Format("2006-01-02 15:04:05") + fmt.Printf("\x1b[33m%s\x1b[0m - %s\n", info.FullMethod, date) + return handler(ctx, req) +} + +func main() { + err := godotenv.Load() + if err != nil { + log.Fatalf("failed to load env file: %v", err) + } + dbURI := os.Getenv("DATABASE_URL") + port := os.Getenv("PORT") + + db, err := ConnectToDB(dbURI) + if err != nil { + log.Fatalf("failed to connect to database: %v", err) + } + + lis, err := net.Listen("tcp", fmt.Sprintf(":%s", port)) + if err != nil { + log.Fatalf("failed to listen: %v", err) + } + + server := grpc.NewServer( + grpc.UnaryInterceptor( + ConsoleLog, + ), + ) + service := &service{ + DB: db, + } + + reflection.Register(server) + pb.RegisterLogServiceServer(server, service) + + fmt.Println("---- \x1b[32mgood\x1b[0m\x1b[33mfood\x1b[0m Log Service ----") + fmt.Printf("started on: \x1b[1m0.0.0.0:%s\x1b[0m \x1b[32m✓\x1b[0m\n", port) + if err := server.Serve(lis); err != nil { + log.Fatalf("failed to serve: %v", err) + } +} diff --git a/services/log/server/main.go b/services/log/server/main.go deleted file mode 100644 index d75ddbc7..00000000 --- a/services/log/server/main.go +++ /dev/null @@ -1,120 +0,0 @@ -package main - -import ( - "context" - "fmt" - "log" - "net" - "os" - - pb "goodfood-log/proto" - - "github.com/joho/godotenv" - - "github.com/golang/protobuf/ptypes/empty" - "github.com/golang/protobuf/ptypes/timestamp" - "google.golang.org/grpc" - "google.golang.org/protobuf/types/known/structpb" - "gorm.io/driver/postgres" - "gorm.io/gorm" -) - -type Log struct { - gorm.Model - EventMessage string `json:"event_message"` - Metainfo *structpb.Struct `gorm:"type:jsonb;column:metainfo"` - Timestamp *timestamp.Timestamp -} - -// *main.LogServiceServer satisfies the interface generated by the protobuf compiler -type LogServiceServer struct { - pb.UnimplementedLogServiceServer - DB *gorm.DB -} - -func (l *Log) ToProto() *pb.Log { - return &pb.Log{ - Id: int32(l.ID), - EventMessage: l.EventMessage, - Metainfo: l.Metainfo, - Timestamp: l.Timestamp, - } -} - -func (s *LogServiceServer) CreateLog(ctx context.Context, req *Log) (*pb.CreateLogResponse, error) { - log := &Log{ - EventMessage: req.EventMessage, - Metainfo: req.Metainfo, - Timestamp: req.Timestamp, - } - result := s.DB.Create(log) - if result.Error != nil { - return nil, result.Error - } - return &pb.CreateLogResponse{ - Id: int32(log.ID), - }, nil -} - -func (s *LogServiceServer) GetLog(ctx context.Context, req *pb.GetLogRequest) (*Log, error) { - var log Log - result := s.DB.First(&log, req.Id) - if result.Error != nil { - return nil, result.Error - } - return &log, nil -} - -func (s *LogServiceServer) ListLog(ctx context.Context, _ *empty.Empty) (*pb.ListLogResponse, error) { - var logs []Log - result := s.DB.Find(&logs) - if result.Error != nil { - return nil, result.Error - } - var logMessages []*pb.Log - for _, log := range logs { - logMessages = append(logMessages, log.ToProto()) - } - return &pb.ListLogResponse{ - Logs: logMessages, - }, nil -} - -func ConnectToDB(connectionString string) (*gorm.DB, error) { - db, err := gorm.Open(postgres.Open(connectionString), &gorm.Config{}) - if err != nil { - return nil, err - } - return db, nil -} - -func main() { - err := godotenv.Load() - if err != nil { - log.Fatalf("failed to load env file: %v", err) - } - dbURI := os.Getenv("DATABASE_URL") - port := os.Getenv("PORT") - - db, err := ConnectToDB(dbURI) - if err != nil { - log.Fatalf("failed to connect to database: %v", err) - } - - lis, err := net.Listen("tcp", fmt.Sprintf(":%s", port)) - if err != nil { - log.Fatalf("failed to listen: %v", err) - } - - s := grpc.NewServer() - srv := &LogServiceServer{ - DB: db, - } - - pb.RegisterLogServiceServer(s, srv.UnimplementedLogServiceServer) - - fmt.Println("Starting gRPC server...") - if err := s.Serve(lis); err != nil { - log.Fatalf("failed to serve: %v", err) - } -} diff --git a/services/proto/log.pb.go b/services/proto/log.pb.go index fbc675c7..f08727e5 100644 --- a/services/proto/log.pb.go +++ b/services/proto/log.pb.go @@ -29,9 +29,9 @@ type Log struct { unknownFields protoimpl.UnknownFields Id int32 `protobuf:"varint,1,opt,name=id,proto3" json:"id,omitempty"` - EventMessage string `protobuf:"bytes,2,opt,name=event_message,json=eventMessage,proto3" json:"event_message,omitempty"` - Metainfo *structpb.Struct `protobuf:"bytes,4,opt,name=metainfo,proto3" json:"metainfo,omitempty"` - Timestamp *timestamppb.Timestamp `protobuf:"bytes,5,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + EventMessage string `protobuf:"bytes,2,opt,name=event_message,json=eventMessage,proto3" json:"event_message,omitempty"` // string + Metadata *structpb.Struct `protobuf:"bytes,3,opt,name=metadata,proto3" json:"metadata,omitempty"` // json + Timestamp *timestamppb.Timestamp `protobuf:"bytes,4,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // timestamp } func (x *Log) Reset() { @@ -80,9 +80,9 @@ func (x *Log) GetEventMessage() string { return "" } -func (x *Log) GetMetainfo() *structpb.Struct { +func (x *Log) GetMetadata() *structpb.Struct { if x != nil { - return x.Metainfo + return x.Metadata } return nil } @@ -94,6 +94,61 @@ func (x *Log) GetTimestamp() *timestamppb.Timestamp { return nil } +type CreateLogRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + EventMessage string `protobuf:"bytes,1,opt,name=event_message,json=eventMessage,proto3" json:"event_message,omitempty"` + Metadata *structpb.Struct `protobuf:"bytes,2,opt,name=metadata,proto3" json:"metadata,omitempty"` +} + +func (x *CreateLogRequest) Reset() { + *x = CreateLogRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_log_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CreateLogRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CreateLogRequest) ProtoMessage() {} + +func (x *CreateLogRequest) ProtoReflect() protoreflect.Message { + mi := &file_log_proto_msgTypes[1] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CreateLogRequest.ProtoReflect.Descriptor instead. +func (*CreateLogRequest) Descriptor() ([]byte, []int) { + return file_log_proto_rawDescGZIP(), []int{1} +} + +func (x *CreateLogRequest) GetEventMessage() string { + if x != nil { + return x.EventMessage + } + return "" +} + +func (x *CreateLogRequest) GetMetadata() *structpb.Struct { + if x != nil { + return x.Metadata + } + return nil +} + type CreateLogResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -105,7 +160,7 @@ type CreateLogResponse struct { func (x *CreateLogResponse) Reset() { *x = CreateLogResponse{} if protoimpl.UnsafeEnabled { - mi := &file_log_proto_msgTypes[1] + mi := &file_log_proto_msgTypes[2] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -118,7 +173,7 @@ func (x *CreateLogResponse) String() string { func (*CreateLogResponse) ProtoMessage() {} func (x *CreateLogResponse) ProtoReflect() protoreflect.Message { - mi := &file_log_proto_msgTypes[1] + mi := &file_log_proto_msgTypes[2] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -131,7 +186,7 @@ func (x *CreateLogResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use CreateLogResponse.ProtoReflect.Descriptor instead. func (*CreateLogResponse) Descriptor() ([]byte, []int) { - return file_log_proto_rawDescGZIP(), []int{1} + return file_log_proto_rawDescGZIP(), []int{2} } func (x *CreateLogResponse) GetId() int32 { @@ -152,7 +207,7 @@ type GetLogRequest struct { func (x *GetLogRequest) Reset() { *x = GetLogRequest{} if protoimpl.UnsafeEnabled { - mi := &file_log_proto_msgTypes[2] + mi := &file_log_proto_msgTypes[3] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -165,7 +220,7 @@ func (x *GetLogRequest) String() string { func (*GetLogRequest) ProtoMessage() {} func (x *GetLogRequest) ProtoReflect() protoreflect.Message { - mi := &file_log_proto_msgTypes[2] + mi := &file_log_proto_msgTypes[3] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -178,7 +233,7 @@ func (x *GetLogRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetLogRequest.ProtoReflect.Descriptor instead. func (*GetLogRequest) Descriptor() ([]byte, []int) { - return file_log_proto_rawDescGZIP(), []int{2} + return file_log_proto_rawDescGZIP(), []int{3} } func (x *GetLogRequest) GetId() int32 { @@ -199,7 +254,7 @@ type ListLogResponse struct { func (x *ListLogResponse) Reset() { *x = ListLogResponse{} if protoimpl.UnsafeEnabled { - mi := &file_log_proto_msgTypes[3] + mi := &file_log_proto_msgTypes[4] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -212,7 +267,7 @@ func (x *ListLogResponse) String() string { func (*ListLogResponse) ProtoMessage() {} func (x *ListLogResponse) ProtoReflect() protoreflect.Message { - mi := &file_log_proto_msgTypes[3] + mi := &file_log_proto_msgTypes[4] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -225,7 +280,7 @@ func (x *ListLogResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ListLogResponse.ProtoReflect.Descriptor instead. func (*ListLogResponse) Descriptor() ([]byte, []int) { - return file_log_proto_rawDescGZIP(), []int{3} + return file_log_proto_rawDescGZIP(), []int{4} } func (x *ListLogResponse) GetLogs() []*Log { @@ -238,43 +293,56 @@ func (x *ListLogResponse) GetLogs() []*Log { var File_log_proto protoreflect.FileDescriptor var file_log_proto_rawDesc = []byte{ - 0x0a, 0x09, 0x6c, 0x6f, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x05, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2f, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x1a, 0x1b, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2f, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xa9, - 0x01, 0x0a, 0x03, 0x4c, 0x6f, 0x67, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x02, 0x69, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, - 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x65, - 0x76, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x33, 0x0a, 0x08, 0x6d, - 0x65, 0x74, 0x61, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, + 0x0a, 0x09, 0x6c, 0x6f, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x10, 0x63, 0x6f, 0x6d, + 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x6c, 0x6f, 0x67, 0x1a, 0x1b, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x65, + 0x6d, 0x70, 0x74, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x73, 0x74, 0x72, 0x75, + 0x63, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, + 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xa9, 0x01, 0x0a, 0x03, 0x4c, 0x6f, + 0x67, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x69, + 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, + 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x4d, + 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x33, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, + 0x74, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, + 0x74, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x38, 0x0a, 0x09, 0x74, + 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, + 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0x6c, 0x0a, 0x10, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4c, + 0x6f, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x33, + 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, + 0x61, 0x74, 0x61, 0x22, 0x23, 0x0a, 0x11, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4c, 0x6f, 0x67, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x69, 0x64, 0x22, 0x1f, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x4c, + 0x6f, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x69, 0x64, 0x22, 0x3c, 0x0a, 0x0f, 0x4c, 0x69, 0x73, + 0x74, 0x4c, 0x6f, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x29, 0x0a, 0x04, + 0x6c, 0x6f, 0x67, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x63, 0x6f, 0x6d, + 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x6c, 0x6f, 0x67, 0x2e, 0x4c, 0x6f, + 0x67, 0x52, 0x04, 0x6c, 0x6f, 0x67, 0x73, 0x32, 0xf0, 0x01, 0x0a, 0x0a, 0x4c, 0x6f, 0x67, 0x53, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x56, 0x0a, 0x09, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x4c, 0x6f, 0x67, 0x12, 0x22, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, + 0x6f, 0x64, 0x2e, 0x6c, 0x6f, 0x67, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4c, 0x6f, 0x67, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, + 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x6c, 0x6f, 0x67, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x4c, 0x6f, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x42, + 0x0a, 0x06, 0x47, 0x65, 0x74, 0x4c, 0x6f, 0x67, 0x12, 0x1f, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, + 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x6c, 0x6f, 0x67, 0x2e, 0x47, 0x65, 0x74, 0x4c, + 0x6f, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x15, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, + 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x6c, 0x6f, 0x67, 0x2e, 0x4c, 0x6f, 0x67, + 0x22, 0x00, 0x12, 0x46, 0x0a, 0x07, 0x4c, 0x69, 0x73, 0x74, 0x4c, 0x6f, 0x67, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x69, 0x6e, 0x66, 0x6f, - 0x12, 0x38, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, - 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0x23, 0x0a, 0x11, 0x43, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x4c, 0x6f, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x69, 0x64, 0x22, - 0x1f, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x4c, 0x6f, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x69, 0x64, - 0x22, 0x31, 0x0a, 0x0f, 0x4c, 0x69, 0x73, 0x74, 0x4c, 0x6f, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x1e, 0x0a, 0x04, 0x6c, 0x6f, 0x67, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x0a, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x4c, 0x6f, 0x67, 0x52, 0x04, 0x6c, - 0x6f, 0x67, 0x73, 0x32, 0xac, 0x01, 0x0a, 0x0a, 0x4c, 0x6f, 0x67, 0x53, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x12, 0x33, 0x0a, 0x09, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4c, 0x6f, 0x67, 0x12, - 0x0a, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x4c, 0x6f, 0x67, 0x1a, 0x18, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4c, 0x6f, 0x67, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x2c, 0x0a, 0x06, 0x47, 0x65, 0x74, 0x4c, 0x6f, - 0x67, 0x12, 0x14, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x47, 0x65, 0x74, 0x4c, 0x6f, 0x67, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0a, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, - 0x4c, 0x6f, 0x67, 0x22, 0x00, 0x12, 0x3b, 0x0a, 0x07, 0x4c, 0x69, 0x73, 0x74, 0x4c, 0x6f, 0x67, - 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4c, 0x6f, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x00, 0x42, 0x03, 0x5a, 0x01, 0x2e, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x21, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, + 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x6c, 0x6f, 0x67, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4c, 0x6f, 0x67, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x03, 0x5a, 0x01, 0x2e, 0x62, + 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -289,31 +357,33 @@ func file_log_proto_rawDescGZIP() []byte { return file_log_proto_rawDescData } -var file_log_proto_msgTypes = make([]protoimpl.MessageInfo, 4) +var file_log_proto_msgTypes = make([]protoimpl.MessageInfo, 5) var file_log_proto_goTypes = []interface{}{ - (*Log)(nil), // 0: proto.Log - (*CreateLogResponse)(nil), // 1: proto.CreateLogResponse - (*GetLogRequest)(nil), // 2: proto.GetLogRequest - (*ListLogResponse)(nil), // 3: proto.ListLogResponse - (*structpb.Struct)(nil), // 4: google.protobuf.Struct - (*timestamppb.Timestamp)(nil), // 5: google.protobuf.Timestamp - (*emptypb.Empty)(nil), // 6: google.protobuf.Empty + (*Log)(nil), // 0: com.goodfood.log.Log + (*CreateLogRequest)(nil), // 1: com.goodfood.log.CreateLogRequest + (*CreateLogResponse)(nil), // 2: com.goodfood.log.CreateLogResponse + (*GetLogRequest)(nil), // 3: com.goodfood.log.GetLogRequest + (*ListLogResponse)(nil), // 4: com.goodfood.log.ListLogResponse + (*structpb.Struct)(nil), // 5: google.protobuf.Struct + (*timestamppb.Timestamp)(nil), // 6: google.protobuf.Timestamp + (*emptypb.Empty)(nil), // 7: google.protobuf.Empty } var file_log_proto_depIdxs = []int32{ - 4, // 0: proto.Log.metainfo:type_name -> google.protobuf.Struct - 5, // 1: proto.Log.timestamp:type_name -> google.protobuf.Timestamp - 0, // 2: proto.ListLogResponse.logs:type_name -> proto.Log - 0, // 3: proto.LogService.CreateLog:input_type -> proto.Log - 2, // 4: proto.LogService.GetLog:input_type -> proto.GetLogRequest - 6, // 5: proto.LogService.ListLog:input_type -> google.protobuf.Empty - 1, // 6: proto.LogService.CreateLog:output_type -> proto.CreateLogResponse - 0, // 7: proto.LogService.GetLog:output_type -> proto.Log - 3, // 8: proto.LogService.ListLog:output_type -> proto.ListLogResponse - 6, // [6:9] is the sub-list for method output_type - 3, // [3:6] is the sub-list for method input_type - 3, // [3:3] is the sub-list for extension type_name - 3, // [3:3] is the sub-list for extension extendee - 0, // [0:3] is the sub-list for field type_name + 5, // 0: com.goodfood.log.Log.metadata:type_name -> google.protobuf.Struct + 6, // 1: com.goodfood.log.Log.timestamp:type_name -> google.protobuf.Timestamp + 5, // 2: com.goodfood.log.CreateLogRequest.metadata:type_name -> google.protobuf.Struct + 0, // 3: com.goodfood.log.ListLogResponse.logs:type_name -> com.goodfood.log.Log + 1, // 4: com.goodfood.log.LogService.CreateLog:input_type -> com.goodfood.log.CreateLogRequest + 3, // 5: com.goodfood.log.LogService.GetLog:input_type -> com.goodfood.log.GetLogRequest + 7, // 6: com.goodfood.log.LogService.ListLog:input_type -> google.protobuf.Empty + 2, // 7: com.goodfood.log.LogService.CreateLog:output_type -> com.goodfood.log.CreateLogResponse + 0, // 8: com.goodfood.log.LogService.GetLog:output_type -> com.goodfood.log.Log + 4, // 9: com.goodfood.log.LogService.ListLog:output_type -> com.goodfood.log.ListLogResponse + 7, // [7:10] is the sub-list for method output_type + 4, // [4:7] is the sub-list for method input_type + 4, // [4:4] is the sub-list for extension type_name + 4, // [4:4] is the sub-list for extension extendee + 0, // [0:4] is the sub-list for field type_name } func init() { file_log_proto_init() } @@ -335,7 +405,7 @@ func file_log_proto_init() { } } file_log_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateLogResponse); i { + switch v := v.(*CreateLogRequest); i { case 0: return &v.state case 1: @@ -347,7 +417,7 @@ func file_log_proto_init() { } } file_log_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetLogRequest); i { + switch v := v.(*CreateLogResponse); i { case 0: return &v.state case 1: @@ -359,6 +429,18 @@ func file_log_proto_init() { } } file_log_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetLogRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_log_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ListLogResponse); i { case 0: return &v.state @@ -377,7 +459,7 @@ func file_log_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_log_proto_rawDesc, NumEnums: 0, - NumMessages: 4, + NumMessages: 5, NumExtensions: 0, NumServices: 1, }, diff --git a/services/proto/log.proto b/services/proto/log.proto index a0d0641b..f91e8520 100644 --- a/services/proto/log.proto +++ b/services/proto/log.proto @@ -2,9 +2,9 @@ syntax = "proto3"; package com.goodfood.log; +import "google/protobuf/empty.proto"; import "google/protobuf/struct.proto"; import "google/protobuf/timestamp.proto"; -import "google/protobuf/empty.proto"; option go_package = "."; @@ -12,18 +12,23 @@ option go_package = "."; message Log { int32 id = 1; - string event_message = 2; - google.protobuf.Struct metainfo = 4; - google.protobuf.Timestamp timestamp = 5; + string event_message = 2; // string + google.protobuf.Struct metadata = 3; // json + google.protobuf.Timestamp timestamp = 4; // timestamp } service LogService { - rpc CreateLog(Log) returns (CreateLogResponse) {} + rpc CreateLog(CreateLogRequest) returns (CreateLogResponse) {} rpc GetLog(GetLogRequest) returns (Log) {} rpc ListLog(google.protobuf.Empty) returns (ListLogResponse) {} } + message CreateLogRequest { + string event_message = 1; + google.protobuf.Struct metadata = 2; + } + message CreateLogResponse { int32 id = 1; } diff --git a/services/proto/log_grpc.pb.go b/services/proto/log_grpc.pb.go index 0a2fbde5..3e73eb6d 100644 --- a/services/proto/log_grpc.pb.go +++ b/services/proto/log_grpc.pb.go @@ -23,7 +23,7 @@ const _ = grpc.SupportPackageIsVersion7 // // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. type LogServiceClient interface { - CreateLog(ctx context.Context, in *Log, opts ...grpc.CallOption) (*CreateLogResponse, error) + CreateLog(ctx context.Context, in *CreateLogRequest, opts ...grpc.CallOption) (*CreateLogResponse, error) GetLog(ctx context.Context, in *GetLogRequest, opts ...grpc.CallOption) (*Log, error) ListLog(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*ListLogResponse, error) } @@ -36,7 +36,7 @@ func NewLogServiceClient(cc grpc.ClientConnInterface) LogServiceClient { return &logServiceClient{cc} } -func (c *logServiceClient) CreateLog(ctx context.Context, in *Log, opts ...grpc.CallOption) (*CreateLogResponse, error) { +func (c *logServiceClient) CreateLog(ctx context.Context, in *CreateLogRequest, opts ...grpc.CallOption) (*CreateLogResponse, error) { out := new(CreateLogResponse) err := c.cc.Invoke(ctx, "/com.goodfood.log.LogService/CreateLog", in, out, opts...) if err != nil { @@ -67,7 +67,7 @@ func (c *logServiceClient) ListLog(ctx context.Context, in *emptypb.Empty, opts // All implementations must embed UnimplementedLogServiceServer // for forward compatibility type LogServiceServer interface { - CreateLog(context.Context, *Log) (*CreateLogResponse, error) + CreateLog(context.Context, *CreateLogRequest) (*CreateLogResponse, error) GetLog(context.Context, *GetLogRequest) (*Log, error) ListLog(context.Context, *emptypb.Empty) (*ListLogResponse, error) mustEmbedUnimplementedLogServiceServer() @@ -77,7 +77,7 @@ type LogServiceServer interface { type UnimplementedLogServiceServer struct { } -func (UnimplementedLogServiceServer) CreateLog(context.Context, *Log) (*CreateLogResponse, error) { +func (UnimplementedLogServiceServer) CreateLog(context.Context, *CreateLogRequest) (*CreateLogResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method CreateLog not implemented") } func (UnimplementedLogServiceServer) GetLog(context.Context, *GetLogRequest) (*Log, error) { @@ -100,7 +100,7 @@ func RegisterLogServiceServer(s grpc.ServiceRegistrar, srv LogServiceServer) { } func _LogService_CreateLog_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(Log) + in := new(CreateLogRequest) if err := dec(in); err != nil { return nil, err } @@ -112,7 +112,7 @@ func _LogService_CreateLog_Handler(srv interface{}, ctx context.Context, dec fun FullMethod: "/com.goodfood.log.LogService/CreateLog", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(LogServiceServer).CreateLog(ctx, req.(*Log)) + return srv.(LogServiceServer).CreateLog(ctx, req.(*CreateLogRequest)) } return interceptor(ctx, in, info, handler) } From f0bfed288fe1ddd87d419e4071b5b24b7e629521 Mon Sep 17 00:00:00 2001 From: Pierre Lebigre Date: Tue, 18 Apr 2023 09:37:45 +0200 Subject: [PATCH 037/883] (feat)prisma schema --- .../20230324234053_init/migration.sql | 73 +++++++++++++++++++ .../20230324234238_init/migration.sql | 8 ++ .../20230325100049_v1_0/migration.sql | 8 ++ .../20230417121514_init/migration.sql | 60 +++++++++++++++ .../20230417143712_init/migration.sql | 2 + .../prisma/migrations/migration_lock.toml | 3 + services/product/prisma/schema.prisma | 14 ++-- 7 files changed, 161 insertions(+), 7 deletions(-) create mode 100644 services/product/prisma/migrations/20230324234053_init/migration.sql create mode 100644 services/product/prisma/migrations/20230324234238_init/migration.sql create mode 100644 services/product/prisma/migrations/20230325100049_v1_0/migration.sql create mode 100644 services/product/prisma/migrations/20230417121514_init/migration.sql create mode 100644 services/product/prisma/migrations/20230417143712_init/migration.sql create mode 100644 services/product/prisma/migrations/migration_lock.toml diff --git a/services/product/prisma/migrations/20230324234053_init/migration.sql b/services/product/prisma/migrations/20230324234053_init/migration.sql new file mode 100644 index 00000000..640d2669 --- /dev/null +++ b/services/product/prisma/migrations/20230324234053_init/migration.sql @@ -0,0 +1,73 @@ +-- CreateEnum +CREATE TYPE "Product_type" AS ENUM ('ENTREES', 'PLATS', 'DESSERTS', 'BOISSONS', 'SNACKS'); + +-- CreateTable +CREATE TABLE "Product" ( + "id" SERIAL NOT NULL, + "name" TEXT NOT NULL, + "image" TEXT NOT NULL, + "comment" TEXT NOT NULL, + "price" INTEGER NOT NULL, + "preparation" TEXT NOT NULL, + "weight" TEXT NOT NULL, + "kilocalories" TEXT NOT NULL, + "nutriscore" INTEGER NOT NULL, + "restaurant_id" INTEGER NOT NULL, + "type" "Product_type" NOT NULL, + + CONSTRAINT "Product_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "Category" ( + "id" SERIAL NOT NULL, + "libelle" TEXT NOT NULL, + "hexa_color" TEXT NOT NULL, + "icon" TEXT NOT NULL, + + CONSTRAINT "Category_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "Allergen" ( + "id" SERIAL NOT NULL, + "libelle" TEXT NOT NULL, + + CONSTRAINT "Allergen_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "_CategoryToProduct" ( + "A" INTEGER NOT NULL, + "B" INTEGER NOT NULL +); + +-- CreateTable +CREATE TABLE "_AllergenToProduct" ( + "A" INTEGER NOT NULL, + "B" INTEGER NOT NULL +); + +-- CreateIndex +CREATE UNIQUE INDEX "_CategoryToProduct_AB_unique" ON "_CategoryToProduct"("A", "B"); + +-- CreateIndex +CREATE INDEX "_CategoryToProduct_B_index" ON "_CategoryToProduct"("B"); + +-- CreateIndex +CREATE UNIQUE INDEX "_AllergenToProduct_AB_unique" ON "_AllergenToProduct"("A", "B"); + +-- CreateIndex +CREATE INDEX "_AllergenToProduct_B_index" ON "_AllergenToProduct"("B"); + +-- AddForeignKey +ALTER TABLE "_CategoryToProduct" ADD CONSTRAINT "_CategoryToProduct_A_fkey" FOREIGN KEY ("A") REFERENCES "Category"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "_CategoryToProduct" ADD CONSTRAINT "_CategoryToProduct_B_fkey" FOREIGN KEY ("B") REFERENCES "Product"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "_AllergenToProduct" ADD CONSTRAINT "_AllergenToProduct_A_fkey" FOREIGN KEY ("A") REFERENCES "Allergen"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "_AllergenToProduct" ADD CONSTRAINT "_AllergenToProduct_B_fkey" FOREIGN KEY ("B") REFERENCES "Product"("id") ON DELETE CASCADE ON UPDATE CASCADE; diff --git a/services/product/prisma/migrations/20230324234238_init/migration.sql b/services/product/prisma/migrations/20230324234238_init/migration.sql new file mode 100644 index 00000000..4a4a2dad --- /dev/null +++ b/services/product/prisma/migrations/20230324234238_init/migration.sql @@ -0,0 +1,8 @@ +/* + Warnings: + + - You are about to drop the column `restaurant_id` on the `Product` table. All the data in the column will be lost. + +*/ +-- AlterTable +ALTER TABLE "Product" DROP COLUMN "restaurant_id"; diff --git a/services/product/prisma/migrations/20230325100049_v1_0/migration.sql b/services/product/prisma/migrations/20230325100049_v1_0/migration.sql new file mode 100644 index 00000000..3cd65dda --- /dev/null +++ b/services/product/prisma/migrations/20230325100049_v1_0/migration.sql @@ -0,0 +1,8 @@ +/* + Warnings: + + - Added the required column `restaurant_id` to the `Product` table without a default value. This is not possible if the table is not empty. + +*/ +-- AlterTable +ALTER TABLE "Product" ADD COLUMN "restaurant_id" INTEGER NOT NULL; diff --git a/services/product/prisma/migrations/20230417121514_init/migration.sql b/services/product/prisma/migrations/20230417121514_init/migration.sql new file mode 100644 index 00000000..85448d11 --- /dev/null +++ b/services/product/prisma/migrations/20230417121514_init/migration.sql @@ -0,0 +1,60 @@ +/* + Warnings: + + - The primary key for the `Allergen` table will be changed. If it partially fails, the table could be left without primary key constraint. + - The primary key for the `Category` table will be changed. If it partially fails, the table could be left without primary key constraint. + - The primary key for the `Product` table will be changed. If it partially fails, the table could be left without primary key constraint. + +*/ +-- DropForeignKey +ALTER TABLE "_AllergenToProduct" DROP CONSTRAINT "_AllergenToProduct_A_fkey"; + +-- DropForeignKey +ALTER TABLE "_AllergenToProduct" DROP CONSTRAINT "_AllergenToProduct_B_fkey"; + +-- DropForeignKey +ALTER TABLE "_CategoryToProduct" DROP CONSTRAINT "_CategoryToProduct_A_fkey"; + +-- DropForeignKey +ALTER TABLE "_CategoryToProduct" DROP CONSTRAINT "_CategoryToProduct_B_fkey"; + +-- AlterTable +ALTER TABLE "Allergen" DROP CONSTRAINT "Allergen_pkey", +ALTER COLUMN "id" DROP DEFAULT, +ALTER COLUMN "id" SET DATA TYPE TEXT, +ADD CONSTRAINT "Allergen_pkey" PRIMARY KEY ("id"); +DROP SEQUENCE "Allergen_id_seq"; + +-- AlterTable +ALTER TABLE "Category" DROP CONSTRAINT "Category_pkey", +ALTER COLUMN "id" DROP DEFAULT, +ALTER COLUMN "id" SET DATA TYPE TEXT, +ADD CONSTRAINT "Category_pkey" PRIMARY KEY ("id"); +DROP SEQUENCE "Category_id_seq"; + +-- AlterTable +ALTER TABLE "Product" DROP CONSTRAINT "Product_pkey", +ALTER COLUMN "id" DROP DEFAULT, +ALTER COLUMN "id" SET DATA TYPE TEXT, +ADD CONSTRAINT "Product_pkey" PRIMARY KEY ("id"); +DROP SEQUENCE "Product_id_seq"; + +-- AlterTable +ALTER TABLE "_AllergenToProduct" ALTER COLUMN "A" SET DATA TYPE TEXT, +ALTER COLUMN "B" SET DATA TYPE TEXT; + +-- AlterTable +ALTER TABLE "_CategoryToProduct" ALTER COLUMN "A" SET DATA TYPE TEXT, +ALTER COLUMN "B" SET DATA TYPE TEXT; + +-- AddForeignKey +ALTER TABLE "_CategoryToProduct" ADD CONSTRAINT "_CategoryToProduct_A_fkey" FOREIGN KEY ("A") REFERENCES "Category"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "_CategoryToProduct" ADD CONSTRAINT "_CategoryToProduct_B_fkey" FOREIGN KEY ("B") REFERENCES "Product"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "_AllergenToProduct" ADD CONSTRAINT "_AllergenToProduct_A_fkey" FOREIGN KEY ("A") REFERENCES "Allergen"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "_AllergenToProduct" ADD CONSTRAINT "_AllergenToProduct_B_fkey" FOREIGN KEY ("B") REFERENCES "Product"("id") ON DELETE CASCADE ON UPDATE CASCADE; diff --git a/services/product/prisma/migrations/20230417143712_init/migration.sql b/services/product/prisma/migrations/20230417143712_init/migration.sql new file mode 100644 index 00000000..a2317c56 --- /dev/null +++ b/services/product/prisma/migrations/20230417143712_init/migration.sql @@ -0,0 +1,2 @@ +-- AlterTable +ALTER TABLE "Product" ALTER COLUMN "restaurant_id" SET DATA TYPE TEXT; diff --git a/services/product/prisma/migrations/migration_lock.toml b/services/product/prisma/migrations/migration_lock.toml new file mode 100644 index 00000000..fbffa92c --- /dev/null +++ b/services/product/prisma/migrations/migration_lock.toml @@ -0,0 +1,3 @@ +# Please do not edit this file manually +# It should be added in your version-control system (i.e. Git) +provider = "postgresql" \ No newline at end of file diff --git a/services/product/prisma/schema.prisma b/services/product/prisma/schema.prisma index d94bcc18..5a8ffaf2 100644 --- a/services/product/prisma/schema.prisma +++ b/services/product/prisma/schema.prisma @@ -1,6 +1,6 @@ datasource db { provider = "postgresql" - url = env("postgresql://postgres:postgres@/var/run/postgresql:5432/postgres") + url = env("DATABASE_URL") } generator client { @@ -8,7 +8,7 @@ generator client { } model Product { - id Int @id @default(autoincrement()) + id String @id @default(cuid()) name String image String comment String @@ -17,7 +17,7 @@ model Product { weight String kilocalories String nutriscore Int - restaurant_id Int + restaurant_id String type Product_type categories Category[] @@ -25,7 +25,7 @@ model Product { } model Category { - id Int @id @default(autoincrement()) + id String @id @default(cuid()) libelle String hexa_color String icon String @@ -34,16 +34,16 @@ model Category { } model Allergen { - id Int @id @default(autoincrement()) + id String @id @default(cuid()) libelle String products Product[] } -enum Product_type{ +enum Product_type { ENTREES PLATS DESSERTS BOISSONS SNACKS -} \ No newline at end of file +} From 96fbb7fae6e5bac5ef7a876d8be2404b8906baca Mon Sep 17 00:00:00 2001 From: Pierre Lebigre Date: Tue, 18 Apr 2023 09:39:37 +0200 Subject: [PATCH 038/883] (feat) Add proto --- services/protos/product.proto | 95 +++++++++++++++++++++++++++++++++++ 1 file changed, 95 insertions(+) create mode 100644 services/protos/product.proto diff --git a/services/protos/product.proto b/services/protos/product.proto new file mode 100644 index 00000000..362a40dd --- /dev/null +++ b/services/protos/product.proto @@ -0,0 +1,95 @@ +syntax = "proto3"; +import "google/protobuf/empty.proto"; + +package product; + +enum ProductType { + ENTREES = 0; + PLATS = 1; + DESSERTS = 2; + BOISSONS = 3; + SNACKS = 4; +} + +message RestaurantId { + string id = 1; +} + +message ProductList { + repeated Product products = 1; +} + +message ProductId { + string id = 1; +} + +message Product { + string id = 1; + string name = 2; + string image = 3; + string comment = 4; + int32 price = 5; + string preparation = 6; + string weight = 7; + string kilocalories = 8; + int32 nutriscore = 9; + int32 restaurant_id = 10; + ProductType type = 11; + repeated Category categories = 12; + repeated Allergen allergens = 13; +} + +message ProductIngredient { + string id = 1; + string product_id = 1; + string ingredient_id = 2; + int32 quantity = 3; +} + + +message CategoryId { + string id = 1; +} + +message Category { + string id = 1; + string libelle = 2; + string hexa_color = 3; + string icon = 4; + repeated Product products = 5; +} + + +message AllergenId { + string id = 1; +} + +message Allergen { + string id = 1; + string libelle = 2; + repeated Product products = 3; +} + +service ProductService { + rpc GetProductTypeList() returns (ProductType) {} + rpc GetProductList(RestaurantId) returns (ProductList) {} + + rpc CreateProduct(Product) returns (Product) {} + rpc ReadProduct(ProductId) returns (Product) {} + rpc UpdateProduct(Product) returns (Product) {} + rpc DeleteProduct(ProductId) returns (google.protobuf.Empty) {} +} + +service AllergenService { + rpc CreateProduct(Allergen) returns (Allergen) {} + rpc ReadAllergen(AllergenId) returns (Allergen) {} + rpc UpdateAllergen(Allergen) returns (Allergen) {} + rpc DeleteAllergen(AllergenId) returns (google.protobuf.Empty) {} +} + +service CategoryService { + rpc CreateCategory(Category) returns (Category) {} + rpc ReadCategory(CategoryId) returns (Category) {} + rpc UpdateCategory(Category) returns (Category) {} + rpc DeleteCategory(CategoryId) returns (google.protobuf.Empty) {} +} \ No newline at end of file From 5308cfe7a30a66d13b27bcb7e7e9c1f5418e1c9d Mon Sep 17 00:00:00 2001 From: anatole Date: Tue, 18 Apr 2023 09:39:50 +0200 Subject: [PATCH 039/883] fix(k8s): fix deployment --- .github/workflows/delivery.yml | 2 +- package.json | 5 ----- services/delivery/Dockerfile | 6 +++--- services/delivery/k8s/deployment.yml | 5 +++-- services/delivery/prisma/schema.prisma | 2 +- 5 files changed, 8 insertions(+), 12 deletions(-) delete mode 100644 package.json diff --git a/.github/workflows/delivery.yml b/.github/workflows/delivery.yml index 53b4ba53..376cbb09 100644 --- a/.github/workflows/delivery.yml +++ b/.github/workflows/delivery.yml @@ -66,4 +66,4 @@ jobs: with: context: ./services/delivery push: true - tags: floriaaan/goodfood-delivery:latest + tags: goodfood-delivery:latest diff --git a/package.json b/package.json deleted file mode 100644 index 47832f15..00000000 --- a/package.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "devDependencies": { - "vitest-mock-extended": "^1.1.3" - } -} diff --git a/services/delivery/Dockerfile b/services/delivery/Dockerfile index a03f15dc..19327c3e 100644 --- a/services/delivery/Dockerfile +++ b/services/delivery/Dockerfile @@ -1,4 +1,4 @@ -FROM node:18-alpine as builder +FROM node:18-alpine3.17 as builder # Set working directory WORKDIR /app @@ -20,7 +20,7 @@ RUN npm run build # Create a new image with the application -FROM node:18-alpine as runner +FROM node:18-alpine3.17 as runner # Set working directory WORKDIR /app @@ -29,7 +29,7 @@ WORKDIR /app COPY --from=builder /app/dist . COPY --from=builder /app/prisma/ . COPY --from=builder /app/proto/ /proto/ -COPY --from=builder /app/node_modules/.prisma/client /.prisma/client/ +COPY --from=builder /app/node_modules/.prisma /.prisma # Expose the gRPC port EXPOSE 50008 diff --git a/services/delivery/k8s/deployment.yml b/services/delivery/k8s/deployment.yml index 53722f26..2bb885c3 100644 --- a/services/delivery/k8s/deployment.yml +++ b/services/delivery/k8s/deployment.yml @@ -15,7 +15,8 @@ spec: spec: containers: - name: goodfood-delivery - image: floriaaan/goodfood-delivery:1.0 + image: 4natole/goodfood-delivery:1.0.0 + imagePullPolicy: Always resources: limits: memory: "128Mi" @@ -27,4 +28,4 @@ spec: name: goodfood-delivery-configmap key: port ports: - - containerPort: 3000 + - containerPort: 50008 diff --git a/services/delivery/prisma/schema.prisma b/services/delivery/prisma/schema.prisma index f769d414..fe4bce5f 100644 --- a/services/delivery/prisma/schema.prisma +++ b/services/delivery/prisma/schema.prisma @@ -5,7 +5,7 @@ datasource db { generator client { provider = "prisma-client-js" - binaryTargets = ["linux-musl"] + binaryTargets = ["linux-musl", "linux-musl-openssl-3.0.x"] } enum Status { From 52f420b7fa0e6c38635dad943d0c166df83ffbe6 Mon Sep 17 00:00:00 2001 From: Pierre Lebigre Date: Tue, 18 Apr 2023 09:40:07 +0200 Subject: [PATCH 040/883] (feat) terraform folder --- services/product/terraform/data.tf | 19 ++++++ services/product/terraform/main.tf | 82 +++++++++++++++++++++++++ services/product/terraform/outputs.tf | 6 ++ services/product/terraform/variables.tf | 16 +++++ 4 files changed, 123 insertions(+) create mode 100644 services/product/terraform/data.tf create mode 100644 services/product/terraform/main.tf create mode 100644 services/product/terraform/outputs.tf create mode 100644 services/product/terraform/variables.tf diff --git a/services/product/terraform/data.tf b/services/product/terraform/data.tf new file mode 100644 index 00000000..c495a511 --- /dev/null +++ b/services/product/terraform/data.tf @@ -0,0 +1,19 @@ +data "azurerm_resource_group" "rg-goodfood" { + name = "rg-${var.project_name}${var.environnment_suffix}" + location = var.location +} + +data "azurerm_key_vault" "kv-goodfood-product" { + resource_group_name = data.azurerm_resource_group.rg-goodfood.name + name = "kv-${var.project_name}" +} + +data "azurerm_key_vault_secret" "product-db-login" { + name = "product-db-login" + key_vault_id = data.azurerm_key_vault.kv-goodfood-product.id +} + +data "azurerm_key_vault_secret" "product-db-password" { + name = "product-db-password" + key_vault_id = data.azurerm_key_vault.kv-goodfood-product.id +} \ No newline at end of file diff --git a/services/product/terraform/main.tf b/services/product/terraform/main.tf new file mode 100644 index 00000000..9ded51d9 --- /dev/null +++ b/services/product/terraform/main.tf @@ -0,0 +1,82 @@ +terraform { + required_providers { + azurerm = { + source = "hashicorp/azurerm" + version = "3.48.0" + } + } + backend "azurerm" {} +} + +provider "azurerm" { + features { + key_vault { + purge_soft_deleted_secrets_on_destroy = true + recover_soft_deleted_secrets = true + } + } +} + +resource "azurerm_key_vault" "kv-goodfood-product" { + name = "kv-goodfood-product" + location = data.azurerm_resource_group.rg-goodfood.location + resource_group_name = data.azurerm_resource_group.rg-goodfood.name + tenant_id = data.azurerm_client_config.current.tenant_id + sku_name = "standard" + soft_delete_retention_days = 7 + + access_policy { + tenant_id = data.azurerm_client_config.current.tenant_id + object_id = data.azurerm_client_config.current.object_id + + key_permissions = [ + "Create", + "Get", + ] + + secret_permissions = [ + "Set", + "Get", + "Delete", + "Purge", + "Recover" + ] + } +} + +resource "azurerm_postgresql_server" "pg-goodfood-product" { + name = "pg-goodfood-product${var.environnment_suffix}" + location = data.azurerm_resource_group.rg-goodfood.location + resource_group_name = data.azurerm_resource_group.rg-goodfood.name + + sku_name = "B_Gen5_2" + + storage_mb = 5120 + backup_retention_days = 7 + geo_redundant_backup_enabled = false + auto_grow_enabled = true + + administrator_login = data.azurerm_key_vault_secret.product-db-login.value + administrator_login_password = data.azurerm_key_vault_secret.product-db-password.value + version = "11" + + ssl_enforcement_enabled = false + ssl_minimal_tls_version_enforced = "TLSEnforcementDisabled" // TODO: change to TLS1_2 + +} + +resource "azurerm_postgresql_firewall_rule" "pgfw-goodfood-product" { + name = "allow-azure-resources" + resource_group_name = data.azurerm_resource_group.rg-goodfood.name + server_name = azurerm_postgresql_server.pg-goodfood-product.name + start_ip_address = "0.0.0.0" + end_ip_address = "0.0.0.0" +} + +ressource "azurerm_storage_account" "stac-goodfood-product" { + name = "stac-goodfood-product${var.environnment_suffix}" + resource_group_name = data.azurerm_resource_group.rg-goodfood.name + location = data.azurerm_resource_group.rg-goodfood.location + account_tier = "Standard" + account_replication_type = "GRS" +} \ No newline at end of file diff --git a/services/product/terraform/outputs.tf b/services/product/terraform/outputs.tf new file mode 100644 index 00000000..08455bff --- /dev/null +++ b/services/product/terraform/outputs.tf @@ -0,0 +1,6 @@ +output "main-rg-name" { + value = data.azurerm_resource_group.rg-maalsi.name +} +output "main-rg-id" { + value = data.azurerm_resource_group.rg-maalsi.id +} \ No newline at end of file diff --git a/services/product/terraform/variables.tf b/services/product/terraform/variables.tf new file mode 100644 index 00000000..65fd7547 --- /dev/null +++ b/services/product/terraform/variables.tf @@ -0,0 +1,16 @@ +variable "environnment_suffix" { + type = string + description = "The suffix to append to the environment name" +} + +variable "location" { + type = string + description = "The location/region where all resources in this environment should be created" + default = "West Europe" +} + +variable "project_name" { + type = string + description = "The name of the project" + default = "goodfood" +} \ No newline at end of file From 810d3def61bdc991500e583f1a13036e75c3b2c7 Mon Sep 17 00:00:00 2001 From: Pierre Lebigre Date: Tue, 18 Apr 2023 09:40:36 +0200 Subject: [PATCH 041/883] (feat) k8s folder --- services/product/k8s/configmap.yml | 8 + services/product/k8s/deployment.yml | 30 ++ services/product/k8s/hpa.yml | 18 ++ services/product/k8s/ingress.yml | 17 ++ services/product/k8s/service.yml | 13 + services/product/pnpm-lock.yaml | 444 +++++++++++++++++++++++++++- 6 files changed, 527 insertions(+), 3 deletions(-) create mode 100644 services/product/k8s/configmap.yml create mode 100644 services/product/k8s/deployment.yml create mode 100644 services/product/k8s/hpa.yml create mode 100644 services/product/k8s/ingress.yml create mode 100644 services/product/k8s/service.yml diff --git a/services/product/k8s/configmap.yml b/services/product/k8s/configmap.yml new file mode 100644 index 00000000..ddbe1fbd --- /dev/null +++ b/services/product/k8s/configmap.yml @@ -0,0 +1,8 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: goodfood-product-configmap + labels: + app: goodfood-product +data: + port: "50008" \ No newline at end of file diff --git a/services/product/k8s/deployment.yml b/services/product/k8s/deployment.yml new file mode 100644 index 00000000..f03c588a --- /dev/null +++ b/services/product/k8s/deployment.yml @@ -0,0 +1,30 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: goodfood-product + labels: + app: goodfood-product +spec: + selector: + matchLabels: + app: goodfood-product + template: + metadata: + labels: + app: goodfood-product + spec: + containers: + - name: goodfood-product + image: pierrelbg/goodfood-product:1.0 + resources: + limits: + memory: "128Mi" + cpu: "200m" + env: + - name: PORT + valueFrom: + configMapKeyRef: + name: goodfood-product-configmap + key: port + ports: + - containerPort: 3000 \ No newline at end of file diff --git a/services/product/k8s/hpa.yml b/services/product/k8s/hpa.yml new file mode 100644 index 00000000..6d22bac7 --- /dev/null +++ b/services/product/k8s/hpa.yml @@ -0,0 +1,18 @@ +apiVersion: autoscaling/v2 +kind: HorizontalPodAutoscaler +metadata: + name: goodfood-product-hpa +spec: + scaleTargetRef: + apiVersion: apps/v1 + kind: Deployment + name: goodfood-product + minReplicas: 1 + maxReplicas: 3 + metrics: + - type: Resource + resource: + name: cpu + target: + type: Utilization + averageUtilization: 50 \ No newline at end of file diff --git a/services/product/k8s/ingress.yml b/services/product/k8s/ingress.yml new file mode 100644 index 00000000..6052d797 --- /dev/null +++ b/services/product/k8s/ingress.yml @@ -0,0 +1,17 @@ +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + name: goodfood-product +spec: + ingressClassName: nginx + rules: + - host: product.localdev.me + http: + paths: + - pathType: Prefix + backend: + service: + name: goodfood-product + port: + number: 50008 + path: / \ No newline at end of file diff --git a/services/product/k8s/service.yml b/services/product/k8s/service.yml new file mode 100644 index 00000000..99219368 --- /dev/null +++ b/services/product/k8s/service.yml @@ -0,0 +1,13 @@ +apiVersion: v1 +kind: Service +metadata: + name: goodfood-product +spec: + selector: + app: goodfood-product + ports: + - name: "grpc" + port: 50008 + targetPort: 50008 +status: + loadBalancer: {} \ No newline at end of file diff --git a/services/product/pnpm-lock.yaml b/services/product/pnpm-lock.yaml index 6b075f83..1c3bf3c6 100644 --- a/services/product/pnpm-lock.yaml +++ b/services/product/pnpm-lock.yaml @@ -1,14 +1,22 @@ lockfileVersion: 5.4 specifiers: + '@grpc/grpc-js': ^1.8.14 + '@grpc/proto-loader': ^0.7.6 + '@prisma/client': ^4.11.0 '@types/node': ^18.15.7 express: ^4.18.2 + nodemon: ^2.0.22 prisma: ^4.11.0 ts-node: ^10.9.1 typescript: ^5.0.2 dependencies: + '@grpc/grpc-js': 1.8.14 + '@grpc/proto-loader': 0.7.6 + '@prisma/client': 4.11.0_prisma@4.11.0 express: 4.18.2 + nodemon: 2.0.22 devDependencies: '@types/node': 18.15.7 @@ -25,6 +33,26 @@ packages: '@jridgewell/trace-mapping': 0.3.9 dev: true + /@grpc/grpc-js/1.8.14: + resolution: {integrity: sha512-w84maJ6CKl5aApCMzFll0hxtFNT6or9WwMslobKaqWUEf1K+zhlL43bSQhFreyYWIWR+Z0xnVFC1KtLm4ZpM/A==} + engines: {node: ^8.13.0 || >=10.10.0} + dependencies: + '@grpc/proto-loader': 0.7.6 + '@types/node': 18.15.7 + dev: false + + /@grpc/proto-loader/0.7.6: + resolution: {integrity: sha512-QyAXR8Hyh7uMDmveWxDSUcJr9NAWaZ2I6IXgAYvQmfflwouTM+rArE2eEaCtLlRqO81j7pRLCt81IefUei6Zbw==} + engines: {node: '>=6'} + hasBin: true + dependencies: + '@types/long': 4.0.2 + lodash.camelcase: 4.3.0 + long: 4.0.0 + protobufjs: 7.2.3 + yargs: 16.2.0 + dev: false + /@jridgewell/resolve-uri/3.1.0: resolution: {integrity: sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==} engines: {node: '>=6.0.0'} @@ -41,10 +69,70 @@ packages: '@jridgewell/sourcemap-codec': 1.4.14 dev: true + /@prisma/client/4.11.0_prisma@4.11.0: + resolution: {integrity: sha512-0INHYkQIqgAjrt7NzhYpeDQi8x3Nvylc2uDngKyFDDj1tTRQ4uV1HnVmd1sQEraeVAN63SOK0dgCKQHlvjL0KA==} + engines: {node: '>=14.17'} + requiresBuild: true + peerDependencies: + prisma: '*' + peerDependenciesMeta: + prisma: + optional: true + dependencies: + '@prisma/engines-version': 4.11.0-57.8fde8fef4033376662cad983758335009d522acb + prisma: 4.11.0 + dev: false + + /@prisma/engines-version/4.11.0-57.8fde8fef4033376662cad983758335009d522acb: + resolution: {integrity: sha512-3Vd8Qq06d5xD8Ch5WauWcUUrsVPdMC6Ge8ILji8RFfyhUpqon6qSyGM0apvr1O8n8qH8cKkEFqRPsYjuz5r83g==} + dev: false + /@prisma/engines/4.11.0: resolution: {integrity: sha512-0AEBi2HXGV02cf6ASsBPhfsVIbVSDC9nbQed4iiY5eHttW9ZtMxHThuKZE1pnESbr8HRdgmFSa/Kn4OSNYuibg==} requiresBuild: true - dev: true + + /@protobufjs/aspromise/1.1.2: + resolution: {integrity: sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==} + dev: false + + /@protobufjs/base64/1.1.2: + resolution: {integrity: sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==} + dev: false + + /@protobufjs/codegen/2.0.4: + resolution: {integrity: sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==} + dev: false + + /@protobufjs/eventemitter/1.1.0: + resolution: {integrity: sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==} + dev: false + + /@protobufjs/fetch/1.1.0: + resolution: {integrity: sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==} + dependencies: + '@protobufjs/aspromise': 1.1.2 + '@protobufjs/inquire': 1.1.0 + dev: false + + /@protobufjs/float/1.0.2: + resolution: {integrity: sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==} + dev: false + + /@protobufjs/inquire/1.1.0: + resolution: {integrity: sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==} + dev: false + + /@protobufjs/path/1.1.2: + resolution: {integrity: sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==} + dev: false + + /@protobufjs/pool/1.1.0: + resolution: {integrity: sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==} + dev: false + + /@protobufjs/utf8/1.1.0: + resolution: {integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==} + dev: false /@tsconfig/node10/1.0.9: resolution: {integrity: sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==} @@ -62,9 +150,16 @@ packages: resolution: {integrity: sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==} dev: true + /@types/long/4.0.2: + resolution: {integrity: sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==} + dev: false + /@types/node/18.15.7: resolution: {integrity: sha512-LFmUbFunqmBn26wJZgZPYZPrDR1RwGOu2v79Mgcka1ndO6V0/cwjivPTc4yoK6n9kmw4/ls1r8cLrvh2iMibFA==} - dev: true + + /abbrev/1.1.1: + resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} + dev: false /accepts/1.3.8: resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} @@ -85,6 +180,26 @@ packages: hasBin: true dev: true + /ansi-regex/5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + dev: false + + /ansi-styles/4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + dependencies: + color-convert: 2.0.1 + dev: false + + /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: false + /arg/4.1.3: resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} dev: true @@ -93,6 +208,15 @@ packages: resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} dev: false + /balanced-match/1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + dev: false + + /binary-extensions/2.2.0: + resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} + engines: {node: '>=8'} + dev: false + /body-parser/1.20.1: resolution: {integrity: sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} @@ -113,6 +237,20 @@ packages: - supports-color 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 + /bytes/3.1.2: resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} engines: {node: '>= 0.8'} @@ -125,6 +263,44 @@ packages: get-intrinsic: 1.2.0 dev: false + /chokidar/3.5.3: + resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} + engines: {node: '>= 8.10.0'} + dependencies: + anymatch: 3.1.3 + braces: 3.0.2 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.2 + 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 + + /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 + /content-disposition/0.5.4: resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} engines: {node: '>= 0.6'} @@ -161,6 +337,18 @@ packages: ms: 2.0.0 dev: false + /debug/3.2.7_supports-color@5.5.0: + resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.3 + supports-color: 5.5.0 + dev: false + /depd/2.0.0: resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} engines: {node: '>= 0.8'} @@ -180,11 +368,20 @@ packages: resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} dev: false + /emoji-regex/8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + dev: false + /encodeurl/1.0.2: resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} engines: {node: '>= 0.8'} dev: false + /escalade/3.1.1: + resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} + engines: {node: '>=6'} + dev: false + /escape-html/1.0.3: resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} dev: false @@ -233,6 +430,13 @@ packages: - supports-color 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 + /finalhandler/1.2.0: resolution: {integrity: sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==} engines: {node: '>= 0.8'} @@ -258,10 +462,23 @@ packages: engines: {node: '>= 0.6'} dev: false + /fsevents/2.3.2: + resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + requiresBuild: true + dev: false + optional: true + /function-bind/1.1.1: resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} dev: false + /get-caller-file/2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + dev: false + /get-intrinsic/1.2.0: resolution: {integrity: sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==} dependencies: @@ -270,6 +487,18 @@ packages: has-symbols: 1.0.3 dev: false + /glob-parent/5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + dependencies: + is-glob: 4.0.3 + dev: false + + /has-flag/3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + dev: false + /has-symbols/1.0.3: resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} engines: {node: '>= 0.4'} @@ -300,6 +529,10 @@ packages: safer-buffer: 2.1.2 dev: false + /ignore-by-default/1.0.1: + resolution: {integrity: sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==} + dev: false + /inherits/2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} dev: false @@ -309,6 +542,47 @@ packages: engines: {node: '>= 0.10'} dev: false + /is-binary-path/2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + dependencies: + binary-extensions: 2.2.0 + dev: false + + /is-extglob/2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + dev: false + + /is-fullwidth-code-point/3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + 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-number/7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + dev: false + + /lodash.camelcase/4.3.0: + resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} + dev: false + + /long/4.0.0: + resolution: {integrity: sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==} + dev: false + + /long/5.2.3: + resolution: {integrity: sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==} + dev: false + /make-error/1.3.6: resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} dev: true @@ -345,6 +619,12 @@ packages: hasBin: true dev: false + /minimatch/3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + dependencies: + brace-expansion: 1.1.11 + dev: false + /ms/2.0.0: resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} dev: false @@ -358,6 +638,35 @@ packages: engines: {node: '>= 0.6'} dev: false + /nodemon/2.0.22: + resolution: {integrity: sha512-B8YqaKMmyuCO7BowF1Z1/mkPqLk6cs/l63Ojtd6otKjMx47Dq1utxfRxcavH1I7VSaL8n5BUaoutadnsX3AAVQ==} + engines: {node: '>=8.10.0'} + hasBin: true + dependencies: + chokidar: 3.5.3 + debug: 3.2.7_supports-color@5.5.0 + ignore-by-default: 1.0.1 + minimatch: 3.1.2 + pstree.remy: 1.1.8 + semver: 5.7.1 + simple-update-notifier: 1.1.0 + supports-color: 5.5.0 + touch: 3.1.0 + undefsafe: 2.0.5 + dev: false + + /nopt/1.0.10: + resolution: {integrity: sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==} + hasBin: true + dependencies: + abbrev: 1.1.1 + dev: false + + /normalize-path/3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + dev: false + /object-inspect/1.12.3: resolution: {integrity: sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==} dev: false @@ -378,6 +687,11 @@ packages: resolution: {integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==} dev: false + /picomatch/2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + dev: false + /prisma/4.11.0: resolution: {integrity: sha512-4zZmBXssPUEiX+GeL0MUq/Yyie4ltiKmGu7jCJFnYMamNrrulTBc+D+QwAQSJ01tyzeGHlD13kOnqPwRipnlNw==} engines: {node: '>=14.17'} @@ -385,7 +699,25 @@ packages: requiresBuild: true dependencies: '@prisma/engines': 4.11.0 - dev: true + + /protobufjs/7.2.3: + resolution: {integrity: sha512-TtpvOqwB5Gdz/PQmOjgsrGH1nHjAQVCN7JG4A6r1sXRWESL5rNMAiRcBQlCAdKxZcAbstExQePYG8xof/JVRgg==} + engines: {node: '>=12.0.0'} + requiresBuild: true + dependencies: + '@protobufjs/aspromise': 1.1.2 + '@protobufjs/base64': 1.1.2 + '@protobufjs/codegen': 2.0.4 + '@protobufjs/eventemitter': 1.1.0 + '@protobufjs/fetch': 1.1.0 + '@protobufjs/float': 1.0.2 + '@protobufjs/inquire': 1.1.0 + '@protobufjs/path': 1.1.2 + '@protobufjs/pool': 1.1.0 + '@protobufjs/utf8': 1.1.0 + '@types/node': 18.15.7 + long: 5.2.3 + dev: false /proxy-addr/2.0.7: resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} @@ -395,6 +727,10 @@ packages: ipaddr.js: 1.9.1 dev: false + /pstree.remy/1.1.8: + resolution: {integrity: sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==} + dev: false + /qs/6.11.0: resolution: {integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==} engines: {node: '>=0.6'} @@ -417,6 +753,18 @@ packages: unpipe: 1.0.0 dev: false + /readdirp/3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + dependencies: + picomatch: 2.3.1 + dev: false + + /require-directory/2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + dev: false + /safe-buffer/5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} dev: false @@ -425,6 +773,16 @@ packages: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} dev: false + /semver/5.7.1: + resolution: {integrity: sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==} + hasBin: true + dev: false + + /semver/7.0.0: + resolution: {integrity: sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==} + hasBin: true + dev: false + /send/0.18.0: resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==} engines: {node: '>= 0.8.0'} @@ -470,16 +828,60 @@ packages: object-inspect: 1.12.3 dev: false + /simple-update-notifier/1.1.0: + resolution: {integrity: sha512-VpsrsJSUcJEseSbMHkrsrAVSdvVS5I96Qo1QAQ4FxQ9wXFcB+pjj7FB7/us9+GcgfW4ziHtYMc1J0PLczb55mg==} + engines: {node: '>=8.10.0'} + dependencies: + semver: 7.0.0 + dev: false + /statuses/2.0.1: resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} engines: {node: '>= 0.8'} dev: false + /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 + dev: false + + /strip-ansi/6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + dependencies: + ansi-regex: 5.0.1 + dev: false + + /supports-color/5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + dependencies: + has-flag: 3.0.0 + 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 + /toidentifier/1.0.1: resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} engines: {node: '>=0.6'} dev: false + /touch/3.1.0: + resolution: {integrity: sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==} + hasBin: true + dependencies: + nopt: 1.0.10 + dev: false + /ts-node/10.9.1_gkjsv6qbk4dkl5zwoikfngqpvy: resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} hasBin: true @@ -525,6 +927,10 @@ packages: hasBin: true dev: true + /undefsafe/2.0.5: + resolution: {integrity: sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==} + dev: false + /unpipe/1.0.0: resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} engines: {node: '>= 0.8'} @@ -544,6 +950,38 @@ packages: engines: {node: '>= 0.8'} dev: false + /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 + dev: false + + /y18n/5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + dev: false + + /yargs-parser/20.2.9: + resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} + engines: {node: '>=10'} + dev: false + + /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 + /yn/3.1.1: resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} engines: {node: '>=6'} From 9e80a7384c47e91ab029336412d5c408b4f56901 Mon Sep 17 00:00:00 2001 From: Pierre Lebigre Date: Tue, 18 Apr 2023 09:41:10 +0200 Subject: [PATCH 042/883] (feat) Add server code --- .../product/src/handler/Allergen/create.ts | 29 ++++++++ .../product/src/handler/Allergen/delete.ts | 22 ++++++ .../product/src/handler/Allergen/index.ts | 11 +++ services/product/src/handler/Allergen/read.ts | 22 ++++++ .../product/src/handler/Allergen/update.ts | 29 ++++++++ .../product/src/handler/Category/create.ts | 31 ++++++++ .../product/src/handler/Category/delete.ts | 22 ++++++ .../product/src/handler/Category/index.ts | 11 +++ services/product/src/handler/Category/read.ts | 22 ++++++ .../product/src/handler/Category/update.ts | 31 ++++++++ .../product/src/handler/Product/create.ts | 42 +++++++++++ .../product/src/handler/Product/delete.ts | 22 ++++++ services/product/src/handler/Product/index.ts | 15 ++++ services/product/src/handler/Product/list.ts | 22 ++++++ .../product/src/handler/Product/listType.ts | 19 +++++ services/product/src/handler/Product/read.ts | 22 ++++++ .../product/src/handler/Product/update.ts | 42 +++++++++++ services/product/src/lib/log.ts | 74 +++++++++++++++++++ services/product/src/lib/prisma.ts | 29 ++++++++ services/product/src/server.ts | 45 +++++++++++ services/product/src/types/Allergen.d.ts | 9 +++ services/product/src/types/Category.d.ts | 11 +++ services/product/src/types/Product.d.ts | 45 +++++++++++ services/product/src/types/index.d.ts | 3 + 24 files changed, 630 insertions(+) create mode 100644 services/product/src/handler/Allergen/create.ts create mode 100644 services/product/src/handler/Allergen/delete.ts create mode 100644 services/product/src/handler/Allergen/index.ts create mode 100644 services/product/src/handler/Allergen/read.ts create mode 100644 services/product/src/handler/Allergen/update.ts create mode 100644 services/product/src/handler/Category/create.ts create mode 100644 services/product/src/handler/Category/delete.ts create mode 100644 services/product/src/handler/Category/index.ts create mode 100644 services/product/src/handler/Category/read.ts create mode 100644 services/product/src/handler/Category/update.ts create mode 100644 services/product/src/handler/Product/create.ts create mode 100644 services/product/src/handler/Product/delete.ts create mode 100644 services/product/src/handler/Product/index.ts create mode 100644 services/product/src/handler/Product/list.ts create mode 100644 services/product/src/handler/Product/listType.ts create mode 100644 services/product/src/handler/Product/read.ts create mode 100644 services/product/src/handler/Product/update.ts create mode 100644 services/product/src/lib/log.ts create mode 100644 services/product/src/lib/prisma.ts create mode 100644 services/product/src/server.ts create mode 100644 services/product/src/types/Allergen.d.ts create mode 100644 services/product/src/types/Category.d.ts create mode 100644 services/product/src/types/Product.d.ts create mode 100644 services/product/src/types/index.d.ts diff --git a/services/product/src/handler/Allergen/create.ts b/services/product/src/handler/Allergen/create.ts new file mode 100644 index 00000000..0d2e69ad --- /dev/null +++ b/services/product/src/handler/Allergen/create.ts @@ -0,0 +1,29 @@ +import { Allergen } from "../../types/Allergen"; +import { Data } from "../../types"; +import { prisma } from "../../lib/prisma"; +import { log } from "../../lib/log"; + +export const CreateAllergen = async ( + data: Data, + callback: (err: any, response: any) => void +) => { + log.debug("Request received at CreateAllergen handler\n", data.request); + try { + const { id, libelle, products } = data.request; + + const allergen = await prisma.allergen.create({ + data: { + id, + libelle, + products: { + connect: products + }, + }, + }); + + callback(null, allergen); + } catch (error) { + log.error(error); + callback(error, null); + } +}; \ No newline at end of file diff --git a/services/product/src/handler/Allergen/delete.ts b/services/product/src/handler/Allergen/delete.ts new file mode 100644 index 00000000..9fddd466 --- /dev/null +++ b/services/product/src/handler/Allergen/delete.ts @@ -0,0 +1,22 @@ +import { AllergenId } from "../../types/Allergen"; +import { Data } from "../../types"; +import { prisma } from "../../lib/prisma"; +import { log } from "../../lib/log"; + +export const DeleteAllergen = async ( + data: Data, + callback: (err: any, response: any) => void +) => { + log.debug("Request received at DeleteAllergen handler\n", data.request); + try { + const { request } = data; + const { id } = request; + + await prisma.allergen.delete({ where : {id} }); + + callback(null, null); + } catch (error) { + log.error(error); + callback(error, null); + } +}; \ No newline at end of file diff --git a/services/product/src/handler/Allergen/index.ts b/services/product/src/handler/Allergen/index.ts new file mode 100644 index 00000000..ca8c0bdb --- /dev/null +++ b/services/product/src/handler/Allergen/index.ts @@ -0,0 +1,11 @@ +import { CreateAllergen } from "./create"; +import { ReadAllergen } from "./read"; +import { UpdateAllergen } from "./update"; +import { DeleteAllergen } from "./delete"; + +export default { + CreateAllergen, + ReadAllergen, + UpdateAllergen, + DeleteAllergen, +}; \ No newline at end of file diff --git a/services/product/src/handler/Allergen/read.ts b/services/product/src/handler/Allergen/read.ts new file mode 100644 index 00000000..a92c7035 --- /dev/null +++ b/services/product/src/handler/Allergen/read.ts @@ -0,0 +1,22 @@ +import { AllergenId } from "../../types/Allergen"; +import { Data } from "../../types"; +import { prisma } from "../../lib/prisma"; +import { log } from "../../lib/log"; + +export const ReadAllergen = async ( + data: Data, + callback: (err: any, response: any) => void +) => { + log.debug("Request received at ReadAllergen handler\n", data.request); + try { + const { request } = data; + const { id } = request; + + const allergen = await prisma.allergen.findFirstOrThrow({ where : {id} }); + + callback(null, allergen); + } catch (error) { + log.error(error); + callback(error, null); + } +}; \ No newline at end of file diff --git a/services/product/src/handler/Allergen/update.ts b/services/product/src/handler/Allergen/update.ts new file mode 100644 index 00000000..cecc9ab7 --- /dev/null +++ b/services/product/src/handler/Allergen/update.ts @@ -0,0 +1,29 @@ +import { Allergen } from "../../types/Allergen"; +import { Data } from "../../types"; +import { prisma } from "../../lib/prisma"; +import { log } from "../../lib/log"; + +export const UpdateAllergen = async ( + data: Data, + callback: (err: any, response: any) => void +) => { + log.debug("Request received at UpdateAllergen handler\n", data.request); + try { + const { id, libelle, products } = data.request; + + const allergen = await prisma.allergen.update({ + where : { id }, + data: { + libelle, + products: { + connect: products + } + }, + }); + + callback(null, allergen); + } catch (error) { + log.error(error); + callback(error, null); + } +}; \ No newline at end of file diff --git a/services/product/src/handler/Category/create.ts b/services/product/src/handler/Category/create.ts new file mode 100644 index 00000000..6ee14d0d --- /dev/null +++ b/services/product/src/handler/Category/create.ts @@ -0,0 +1,31 @@ +import { Category } from "../../types/Category"; +import { Data } from "../../types"; +import { prisma } from "../../lib/prisma"; +import { log } from "../../lib/log"; + +export const CreateCategory = async ( + data: Data, + callback: (err: any, response: any) => void +) => { + log.debug("Request received at CreateCategory handler\n", data.request); + try { + const { id, libelle, hexa_color, icon, products } = data.request; + + const category = await prisma.category.create({ + data: { + id, + libelle, + icon, + hexa_color, + products: { + connect: products + }, + }, + }); + + callback(null, category); + } catch (error) { + log.error(error); + callback(error, null); + } +}; \ No newline at end of file diff --git a/services/product/src/handler/Category/delete.ts b/services/product/src/handler/Category/delete.ts new file mode 100644 index 00000000..5db4fa28 --- /dev/null +++ b/services/product/src/handler/Category/delete.ts @@ -0,0 +1,22 @@ +import { CategoryId } from "../../types/Category"; +import { Data } from "../../types"; +import { prisma } from "../../lib/prisma"; +import { log } from "../../lib/log"; + +export const DeleteCategory = async ( + data: Data, + callback: (err: any, response: any) => void +) => { + log.debug("Request received at DeleteCategory handler\n", data.request); + try { + const { request } = data; + const { id } = request; + + await prisma.allergen.delete({ where : {id} }); + + callback(null, null); + } catch (error) { + log.error(error); + callback(error, null); + } +}; \ No newline at end of file diff --git a/services/product/src/handler/Category/index.ts b/services/product/src/handler/Category/index.ts new file mode 100644 index 00000000..fa94b569 --- /dev/null +++ b/services/product/src/handler/Category/index.ts @@ -0,0 +1,11 @@ +import { CreateCategory } from "./create"; +import { ReadCategory } from "./read"; +import { UpdateCategory } from "./update"; +import { DeleteCategory } from "./delete"; + +export default { + CreateCategory, + ReadCategory, + UpdateCategory, + DeleteCategory, +}; \ No newline at end of file diff --git a/services/product/src/handler/Category/read.ts b/services/product/src/handler/Category/read.ts new file mode 100644 index 00000000..c013a1f5 --- /dev/null +++ b/services/product/src/handler/Category/read.ts @@ -0,0 +1,22 @@ +import { CategoryId } from "../../types/Category"; +import { Data } from "../../types"; +import { prisma } from "../../lib/prisma"; +import { log } from "../../lib/log"; + +export const ReadCategory = async ( + data: Data, + callback: (err: any, response: any) => void +) => { + log.debug("Request received at ReadCategory handler\n", data.request); + try { + const { request } = data; + const { id } = request; + + const category = await prisma.category.findFirstOrThrow({ where : {id} }); + + callback(null, category); + } catch (error) { + log.error(error); + callback(error, null); + } +}; \ No newline at end of file diff --git a/services/product/src/handler/Category/update.ts b/services/product/src/handler/Category/update.ts new file mode 100644 index 00000000..f80cfda3 --- /dev/null +++ b/services/product/src/handler/Category/update.ts @@ -0,0 +1,31 @@ +import { Category } from "../../types/Category"; +import { Data } from "../../types"; +import { prisma } from "../../lib/prisma"; +import { log } from "../../lib/log"; + +export const UpdateCategory = async ( + data: Data, + callback: (err: any, response: any) => void +) => { + log.debug("Request received at UpdateCategory handler\n", data.request); + try { + const { id, libelle, hexa_color, icon, products } = data.request; + + const category = await prisma.category.update({ + where : { id }, + data: { + libelle, + icon, + hexa_color, + products: { + connect: products + } + }, + }); + + callback(null, category); + } catch (error) { + log.error(error); + callback(error, null); + } +}; \ No newline at end of file diff --git a/services/product/src/handler/Product/create.ts b/services/product/src/handler/Product/create.ts new file mode 100644 index 00000000..132594a8 --- /dev/null +++ b/services/product/src/handler/Product/create.ts @@ -0,0 +1,42 @@ +import { Product } from "../../types/Product"; +import { Data } from "../../types"; +import { prisma } from "../../lib/prisma"; +import { log } from "../../lib/log"; +import { Product_type } from "@prisma/client"; + +export const CreateProduct = async ( + data: Data, + callback: (err: any, response: any) => void +) => { + log.debug("Request received at CreateProduct handler\n", data.request); + try { + const { id, name, image, comment, price, preparation, weight, kilocalories, nutriscore, restaurant_id, type, categories, allergens } = data.request; + + const product = await prisma.product.create({ + data: { + id, + name, + image, + comment, + price, + preparation, + weight, + kilocalories, + nutriscore, + restaurant_id, + type: type as unknown as Product_type, + categories: { + connect: categories + }, + allergens: { + connect: allergens + } + }, + }); + + callback(null, product); + } catch (error) { + log.error(error); + callback(error, null); + } +}; \ No newline at end of file diff --git a/services/product/src/handler/Product/delete.ts b/services/product/src/handler/Product/delete.ts new file mode 100644 index 00000000..b4f78816 --- /dev/null +++ b/services/product/src/handler/Product/delete.ts @@ -0,0 +1,22 @@ +import { ProductId } from "../../types/Product"; +import { Data } from "../../types"; +import { prisma } from "../../lib/prisma"; +import { log } from "../../lib/log"; + +export const DeleteProduct = async ( + data: Data, + callback: (err: any, response: any) => void +) => { + log.debug("Request received at DeleteProduct handler\n", data.request); + try { + const { request } = data; + const { id } = request; + + await prisma.product.delete({ where : {id} }); + + callback(null, null); + } catch (error) { + log.error(error); + callback(error, null); + } +}; \ No newline at end of file diff --git a/services/product/src/handler/Product/index.ts b/services/product/src/handler/Product/index.ts new file mode 100644 index 00000000..c0c53a59 --- /dev/null +++ b/services/product/src/handler/Product/index.ts @@ -0,0 +1,15 @@ +import { CreateProduct } from "./create"; +import { ReadProduct } from "./read"; +import { UpdateProduct } from "./update"; +import { DeleteProduct } from "./delete"; +import { ListProduct } from "./list"; +import { ListProductType } from "./listType"; + +export default { + CreateProduct, + ReadProduct, + UpdateProduct, + DeleteProduct, + ListProduct, + ListProductType, +}; \ No newline at end of file diff --git a/services/product/src/handler/Product/list.ts b/services/product/src/handler/Product/list.ts new file mode 100644 index 00000000..ce219955 --- /dev/null +++ b/services/product/src/handler/Product/list.ts @@ -0,0 +1,22 @@ +import { RestaurantId } from "../../types/Product"; +import { Data } from "../../types"; +import { prisma } from "../../lib/prisma"; +import { log } from "../../lib/log"; + +export const ListProduct = async ( + data: Data, + callback: (err: any, response: any) => void +) => { + log.debug("Request received at ListProduct handler\n", data.request); + try { + const { request } = data; + const { id } = request; + + const products = await prisma.product.findMany({ where : {restaurant_id: id} }); + + callback(null, { products }); + } catch (error) { + log.error(error); + callback(error, null); + } +}; \ No newline at end of file diff --git a/services/product/src/handler/Product/listType.ts b/services/product/src/handler/Product/listType.ts new file mode 100644 index 00000000..f0c8cce0 --- /dev/null +++ b/services/product/src/handler/Product/listType.ts @@ -0,0 +1,19 @@ +import { Product_type } from "../../types/Product"; +import { Data } from "../../types"; +import { Product_type as productType} from "@prisma/client"; +import { log } from "../../lib/log"; + +export const ListProductType = async ( + data: Data, + callback: (err: any, response: any) => void +) => { + log.debug("Request received at ListProduct handler\n", data.request); + try { + const type = productType; + + callback(null, type); + } catch (error) { + log.error(error); + callback(error, null); + } +}; \ No newline at end of file diff --git a/services/product/src/handler/Product/read.ts b/services/product/src/handler/Product/read.ts new file mode 100644 index 00000000..2e6b97d6 --- /dev/null +++ b/services/product/src/handler/Product/read.ts @@ -0,0 +1,22 @@ +import { ProductId } from "../../types/Product"; +import { Data } from "../../types"; +import { prisma } from "../../lib/prisma"; +import { log } from "../../lib/log"; + +export const ReadProduct = async ( + data: Data, + callback: (err: any, response: any) => void +) => { + log.debug("Request received at ReadProduct handler\n", data.request); + try { + const { request } = data; + const { id } = request; + + const product = await prisma.product.findFirstOrThrow({ where : {id} }); + + callback(null, product); + } catch (error) { + log.error(error); + callback(error, null); + } +}; \ No newline at end of file diff --git a/services/product/src/handler/Product/update.ts b/services/product/src/handler/Product/update.ts new file mode 100644 index 00000000..d468a8a2 --- /dev/null +++ b/services/product/src/handler/Product/update.ts @@ -0,0 +1,42 @@ +import { Product } from "../../types/Product"; +import { Data } from "../../types"; +import { prisma } from "../../lib/prisma"; +import { log } from "../../lib/log"; +import { Product_type } from "@prisma/client"; + +export const UpdateProduct = async ( + data: Data, + callback: (err: any, response: any) => void +) => { + log.debug("Request received at UpdateProduct handler\n", data.request); + try { + const { id, name, image, comment, price, preparation, weight, kilocalories, nutriscore, restaurant_id, type, categories, allergens } = data.request; + + const product = await prisma.product.update({ + where : { id }, + data: { + name, + image, + comment, + price, + preparation, + weight, + kilocalories, + nutriscore, + restaurant_id, + type: type as unknown as Product_type, + categories: { + connect: categories + }, + allergens: { + connect: allergens + } + }, + }); + + callback(null, product); + } catch (error) { + log.error(error); + callback(error, null); + } +}; \ No newline at end of file diff --git a/services/product/src/lib/log.ts b/services/product/src/lib/log.ts new file mode 100644 index 00000000..51a67102 --- /dev/null +++ b/services/product/src/lib/log.ts @@ -0,0 +1,74 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ +/* eslint-disable no-console */ + +function getStackTrace() { + let stack; + + try { + throw new Error(""); + } catch (error) { + stack = (error as Error).stack || ""; + } + + stack = stack.split("\n").map((line) => line.trim()); + return stack.splice(stack[0] === "Error" ? 2 : 1); + } + + const getInitiator = () => { + // _getInitiatorLine, _ObjectInfoLine, caller + const [, , caller] = getStackTrace(); + const file = caller.split("/").at(-1) || ""; + return file.replace(")", ""); + }; + + const warn = (...args: any[]) => { + console.group( + `\x1b[33m${new Date().toISOString()} - WARN - ${getInitiator()}\x1b[0m` + ); + console.warn(...args); + console.groupEnd(); + }; + const error = (...args: any[]) => { + console.group( + `\x1b[31m${new Date().toISOString()} - ERROR - ${getInitiator()}\x1b[0m` + ); + console.error(...args); + console.groupEnd(); + }; + const info = (...args: any[]) => { + console.group( + `\x1b[34m${new Date().toISOString()} - INFO - ${getInitiator()}\x1b[0m` + ); + console.log(...args); + console.groupEnd(); + }; + const debug = (...args: any[]) => { + console.log(...args); + }; + + /** + * @description a simple interface logger for logging to the console and into a log drain in the future + * @example + * log.warn('this is a warning'); + * log.error('this is an error'); + * log.info('this is an info'); + * @exports log + */ + export const log = { + warn, + error, + info, + debug, + }; + + export const utils = { + bold: (text: string) => `\x1b[1m${text}\x1b[0m`, + red: (text: string) => `\x1b[31m${text}\x1b[0m`, + green: (text: string) => `\x1b[32m${text}\x1b[0m`, + yellow: (text: string) => `\x1b[33m${text}\x1b[0m`, + blue: (text: string) => `\x1b[34m${text}\x1b[0m`, + magenta: (text: string) => `\x1b[35m${text}\x1b[0m`, + cyan: (text: string) => `\x1b[36m${text}\x1b[0m`, + white: (text: string) => `\x1b[37m${text}\x1b[0m`, + gray: (text: string) => `\x1b[90m${text}\x1b[0m`, + }; \ No newline at end of file diff --git a/services/product/src/lib/prisma.ts b/services/product/src/lib/prisma.ts new file mode 100644 index 00000000..eccd280e --- /dev/null +++ b/services/product/src/lib/prisma.ts @@ -0,0 +1,29 @@ +import { Prisma, PrismaClient } from "@prisma/client"; + +let prisma: PrismaClient; +type GlobalWithPrisma = typeof globalThis & { + prisma: PrismaClient; +}; + +const OPTIONS: Prisma.PrismaClientOptions = { + log: + process.env.NEXT_PUBLIC_APP_ENV !== "production" + ? ["info", "warn"] + : undefined, +}; + +if (process.env.NODE_ENV === "production") { + prisma = new PrismaClient(OPTIONS); +} else { + // Ensure the prisma instance is re-used during hot-reloading + // Otherwise, a new client will be created on every reload + if (!("prisma" in global)) { + (global as GlobalWithPrisma).prisma = new PrismaClient(OPTIONS); + } + + prisma = (global as GlobalWithPrisma).prisma; +} + +export default prisma; + +export { prisma }; \ No newline at end of file diff --git a/services/product/src/server.ts b/services/product/src/server.ts new file mode 100644 index 00000000..816f7ca0 --- /dev/null +++ b/services/product/src/server.ts @@ -0,0 +1,45 @@ +import "dotenv/config"; + +import { loadSync } from "@grpc/proto-loader"; +import { ServerCredentials, loadPackageDefinition, Server } from "@grpc/grpc-js"; + +import { log, utils } from "./lib/log"; + +import AllergenHandler from "./handler/Allergen/index"; +import CategoryHandler from "./handler/Category/index"; +import ProductHandler from "./handler/Product/index"; + +const options = { + keepCase: true, + longs: String, + enums: String, + defaults: true, + oneofs: true, +}; + +const serverInsecure = ServerCredentials.createInsecure(); + +const PORT = process.env.PORT || 50008; +const ADDRESS = `0.0.0.0:${PORT}`; +const PROTO_PATH = __dirname + "/../../proto/product.proto"; + +const packageDefinition = loadSync(PROTO_PATH, options); +const { delivery } = loadPackageDefinition(packageDefinition) as any; // todo: fix any +const server = new Server(); + +server.addService(delivery.AllergenService.service, AllergenHandler); +server.addService(delivery.CategoryService.service, CategoryHandler); +server.addService(delivery.ProductService.service, ProductHandler); + +server.bindAsync(ADDRESS, serverInsecure, () => { + server.start(); + const message = `---- ${utils.green("good")}${utils.yellow( + "food" + )} Product Service ----\nstarted on: ${utils.bold(ADDRESS)} ${utils.green( + "✓" + )}\n`; + log.debug(message); +}); + + +export default server; \ No newline at end of file diff --git a/services/product/src/types/Allergen.d.ts b/services/product/src/types/Allergen.d.ts new file mode 100644 index 00000000..b827c2ea --- /dev/null +++ b/services/product/src/types/Allergen.d.ts @@ -0,0 +1,9 @@ +export interface AllergenId { + id: string; +} + +export interface Allergen { + id: string; + libelle: string; + products: Product[]; +} diff --git a/services/product/src/types/Category.d.ts b/services/product/src/types/Category.d.ts new file mode 100644 index 00000000..24339842 --- /dev/null +++ b/services/product/src/types/Category.d.ts @@ -0,0 +1,11 @@ +export interface CategoryId { + id: string; +} + +export interface Category { + id: string; + libelle: string; + hexa_color: string; + icon: string; + products: Product[]; +} \ No newline at end of file diff --git a/services/product/src/types/Product.d.ts b/services/product/src/types/Product.d.ts new file mode 100644 index 00000000..6e2f2de0 --- /dev/null +++ b/services/product/src/types/Product.d.ts @@ -0,0 +1,45 @@ +import { Category } from "@prisma/client"; +import { Empty } from "google-protobuf/google/protobuf/empty_pb"; + +export enum Product_type { + ENTREES = 0, + PLATS = 1, + DESSERTS = 2, + BOISSONS = 3, + SNACKS = 4, +} + +export interface Product { + id: string; + name: string; + image: string; + comment: string; + price: number; + preparation: string; + weight: string; + kilocalories: string; + nutriscore: number; + restaurant_id: string; + type: Product_type; + categories: Category[]; + allergens: Allergen[]; +} + +export interface ProductList { + products: Product[]; +} + +export interface ProductId { + id: Product["id"]; +} + +export interface ProductIngredient { + id: string; + product_id: string; + ingredient_id: string; + quantity: number; +} + +export interface RestaurantId{ + id: string; +} \ No newline at end of file diff --git a/services/product/src/types/index.d.ts b/services/product/src/types/index.d.ts new file mode 100644 index 00000000..5315fc65 --- /dev/null +++ b/services/product/src/types/index.d.ts @@ -0,0 +1,3 @@ +export type Data = { + request: T; +}; \ No newline at end of file From ae2b6aecff23483b64d7c0190ff94f4d6c18d202 Mon Sep 17 00:00:00 2001 From: Florian LEROUX <10078837+floriaaan@users.noreply.github.com> Date: Tue, 18 Apr 2023 11:13:23 +0200 Subject: [PATCH 043/883] feat(amqp): add amqp implementation --- services/log/.env.example | 3 +- services/log/amqp/pub.go | 50 ++++++++++++++++++++++ services/log/go.mod | 11 +++-- services/log/go.sum | 11 ++++- services/log/main.go | 87 +++++++++++++++++++++++++++++++++++---- 5 files changed, 146 insertions(+), 16 deletions(-) create mode 100644 services/log/amqp/pub.go diff --git a/services/log/.env.example b/services/log/.env.example index 15c2af21..647dcac1 100644 --- a/services/log/.env.example +++ b/services/log/.env.example @@ -1,2 +1,3 @@ DATABASE_URL=postgres://postgres:password@localhost:5432/postgres -PORT=50021 \ No newline at end of file +PORT=50021 +AMQP_URL=amqp://guest:guest@localhost \ No newline at end of file diff --git a/services/log/amqp/pub.go b/services/log/amqp/pub.go new file mode 100644 index 00000000..2f07d6ce --- /dev/null +++ b/services/log/amqp/pub.go @@ -0,0 +1,50 @@ +package main + +import ( + "context" + "log" + "time" + + amqp "github.com/rabbitmq/amqp091-go" +) + +func failOnError(err error, msg string) { + if err != nil { + log.Panicf("%s: %s", msg, err) + } +} + +func main() { + conn, err := amqp.Dial("amqp://guest:guest@localhost:5672/") + failOnError(err, "Failed to connect to RabbitMQ") + defer conn.Close() + + ch, err := conn.Channel() + failOnError(err, "Failed to open a channel") + defer ch.Close() + + q, err := ch.QueueDeclare( + "log", // name + false, // durable + false, // delete when unused + false, // exclusive + false, // no-wait + nil, // arguments + ) + failOnError(err, "Failed to declare a queue") + ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) + defer cancel() + + body := "{\"event_message\":\"test\",\"metadata\":{\"test\":true}}" + err = ch.PublishWithContext(ctx, + "", // exchange + q.Name, // routing key + false, // mandatory + false, // immediate + amqp.Publishing{ + ContentType: "text/plain", + Body: []byte(body), + }) + failOnError(err, "Failed to publish a message") + log.Printf(" [x] Sent %s\n", body) +} diff --git a/services/log/go.mod b/services/log/go.mod index e0498253..a13c8f6b 100644 --- a/services/log/go.mod +++ b/services/log/go.mod @@ -2,7 +2,12 @@ module goodfood-log go 1.20 -require github.com/golang/protobuf v1.5.3 +require ( + github.com/golang/protobuf v1.5.3 + github.com/joho/godotenv v1.5.1 + github.com/rabbitmq/amqp091-go v1.8.0 + gorm.io/gorm v1.25.0 +) require ( github.com/jackc/pgpassfile v1.0.0 // indirect @@ -10,17 +15,15 @@ require ( github.com/jackc/pgx/v5 v5.3.0 // indirect github.com/jinzhu/inflection v1.0.0 // indirect github.com/jinzhu/now v1.1.5 // indirect - github.com/joho/godotenv v1.5.1 // indirect golang.org/x/crypto v0.6.0 // indirect golang.org/x/net v0.8.0 // indirect golang.org/x/sys v0.6.0 // indirect golang.org/x/text v0.8.0 // indirect google.golang.org/genproto v0.0.0-20230110181048-76db0878b65f // indirect - gorm.io/gorm v1.25.0 // indirect ) require ( google.golang.org/grpc v1.54.0 - google.golang.org/protobuf v1.30.0 // indirect + google.golang.org/protobuf v1.30.0 gorm.io/driver/postgres v1.5.0 ) diff --git a/services/log/go.sum b/services/log/go.sum index d52d9ebb..4f6e6a8e 100644 --- a/services/log/go.sum +++ b/services/log/go.sum @@ -1,10 +1,12 @@ github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM= github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg= github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a h1:bbPeKD0xmW/Y25WS6cokEszi5g+S0QxI/d45PkRi7Nk= @@ -24,7 +26,10 @@ github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NB github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/rabbitmq/amqp091-go v1.8.0 h1:GBFy5PpLQ5jSVVSYv8ecHGqeX7UTLYR4ItQbDCss9MM= +github.com/rabbitmq/amqp091-go v1.8.0/go.mod h1:+jPrT9iY2eLjRaMSRHUhc3z14E/l85kv/f+6luSD3pc= github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= @@ -33,8 +38,11 @@ github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UV github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +go.uber.org/goleak v1.2.1 h1:NBol2c7O1ZokfZ0LEU9K6Whx/KnwvepVetCUhtKja4A= +go.uber.org/goleak v1.2.1/go.mod h1:qlT2yGI9QafXHhZZLxlSuNsMw3FFLxBr+tBRlmO1xH4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.6.0 h1:qfktjS5LUO+fFKeJXZ+ikTRijMmljikvG68fpMMruSc= @@ -76,7 +84,6 @@ google.golang.org/genproto v0.0.0-20230110181048-76db0878b65f/go.mod h1:RGgjbofJ google.golang.org/grpc v1.54.0 h1:EhTqbhiYeixwWQtAEZAxmV9MGqcjEU2mFx52xCzNyag= google.golang.org/grpc v1.54.0/go.mod h1:PUSEXI6iWghWaB6lXM4knEgpJNu2qUcKfDtNci3EC2g= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= -google.golang.org/protobuf v1.26.0 h1:bxAC2xTBsZGibn2RTntX0oH50xLsqy1OxA9tTL3p/lk= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.30.0 h1:kPPoIgf3TsEvrm0PFe15JQ+570QVxYzEvvHqChK+cng= google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= @@ -85,10 +92,10 @@ gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8 gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gorm.io/driver/postgres v1.5.0 h1:u2FXTy14l45qc3UeCJ7QaAXZmZfDDv0YrthvmRq1l0U= gorm.io/driver/postgres v1.5.0/go.mod h1:FUZXzO+5Uqg5zzwzv4KK49R8lvGIyscBOqYrtI1Ce9A= -gorm.io/gorm v1.24.7-0.20230306060331-85eaf9eeda11 h1:9qNbmu21nNThCNnF5i2R3kw2aL27U8ZwbzccNjOmW0g= gorm.io/gorm v1.24.7-0.20230306060331-85eaf9eeda11/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k= gorm.io/gorm v1.25.0 h1:+KtYtb2roDz14EQe4bla8CbQlmb9dN3VejSai3lprfU= gorm.io/gorm v1.25.0/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k= diff --git a/services/log/main.go b/services/log/main.go index 9a47c8ee..fbf45891 100644 --- a/services/log/main.go +++ b/services/log/main.go @@ -11,6 +11,8 @@ import ( pb "goodfood-log/proto" + amqp "github.com/rabbitmq/amqp091-go" + "github.com/joho/godotenv" "github.com/golang/protobuf/ptypes/empty" @@ -25,7 +27,7 @@ import ( type Log struct { ID uint `gorm:"primarykey" json:"id"` EventMessage string `gorm:"not null" json:"event_message"` - Metadata []uint8 `gorm:"type:jsonb" json:"metadata"` + Metadata []uint8 `gorm:"type:jsonb, default:'{}'" json:"metadata"` Timestamp time.Time `gorm:"default:current_timestamp" json:"timestamp"` } @@ -92,6 +94,34 @@ func (s *service) ListLog(ctx context.Context, _ *empty.Empty) (*pb.ListLogRespo }, nil } +func HandleAMQPMessage(d amqp.Delivery, db *gorm.DB) (bool, error) { + date := time.Now().Format("2006-01-02 15:04:05") + fmt.Printf("\x1b[35m%s\x1b[0m | \x1b[31mAMQP\x1b[0m | \x1b[33m%s\x1b[0m\n", date, d.Body) + + // d.Body is a string (JSON stringified) + jsonMap := make(map[string]interface{}) + err := json.Unmarshal(d.Body, &jsonMap) + if err != nil { + return false, err + } + metadata := jsonMap["metadata"].(map[string]interface{}) + metadataBytes, err := json.Marshal(metadata) + if err != nil { + return false, err + } + + log := &Log{ + EventMessage: jsonMap["event_message"].(string), + Metadata: metadataBytes, + } + result := db.Create(log) + if result.Error != nil { + return false, result.Error + } + + return true, nil +} + func ConnectToDB(connectionString string) (*gorm.DB, error) { db, err := gorm.Open(postgres.Open(connectionString), &gorm.Config{}) db.AutoMigrate(&Log{}) @@ -103,10 +133,16 @@ func ConnectToDB(connectionString string) (*gorm.DB, error) { func ConsoleLog(ctx context.Context, req interface{}, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (interface{}, error) { date := time.Now().Format("2006-01-02 15:04:05") - fmt.Printf("\x1b[33m%s\x1b[0m - %s\n", info.FullMethod, date) + fmt.Printf("\x1b[35m%s\x1b[0m | \x1b[36mGRPC\x1b[0m | \x1b[33m%s\x1b[0m\n", date, info.FullMethod) return handler(ctx, req) } +func failOnError(err error, msg string) { + if err != nil { + log.Panicf("%s: %s", msg, err) + } +} + func main() { err := godotenv.Load() if err != nil { @@ -114,16 +150,49 @@ func main() { } dbURI := os.Getenv("DATABASE_URL") port := os.Getenv("PORT") + amqpURI := os.Getenv("AMQP_URL") db, err := ConnectToDB(dbURI) - if err != nil { - log.Fatalf("failed to connect to database: %v", err) - } + failOnError(err, "failed to connect to database") lis, err := net.Listen("tcp", fmt.Sprintf(":%s", port)) - if err != nil { - log.Fatalf("failed to listen: %v", err) - } + failOnError(err, "failed to listen") + defer lis.Close() + + conn, err := amqp.Dial(amqpURI) + failOnError(err, "Failed to connect to RabbitMQ") + defer conn.Close() + + ch, err := conn.Channel() + failOnError(err, "Failed to open a channel") + defer ch.Close() + + q, err := ch.QueueDeclare( + "log", // name + false, // durable + false, // delete when unused + false, // exclusive + false, // no-wait + nil, // arguments + ) + failOnError(err, "Failed to declare a queue") + + msgs, err := ch.Consume( + q.Name, // queue + "", // consumer + true, // auto-ack + false, // exclusive + false, // no-local + false, // no-wait + nil, // args + ) + failOnError(err, "Failed to register a consumer") + + go func() { + for d := range msgs { + HandleAMQPMessage(d, db) + } + }() server := grpc.NewServer( grpc.UnaryInterceptor( @@ -138,7 +207,7 @@ func main() { pb.RegisterLogServiceServer(server, service) fmt.Println("---- \x1b[32mgood\x1b[0m\x1b[33mfood\x1b[0m Log Service ----") - fmt.Printf("started on: \x1b[1m0.0.0.0:%s\x1b[0m \x1b[32m✓\x1b[0m\n", port) + fmt.Printf("started on: \x1b[1m0.0.0.0:%s\x1b[0m \x1b[32m✓\x1b[0m\n\n", port) if err := server.Serve(lis); err != nil { log.Fatalf("failed to serve: %v", err) } From 4f11dc40f7f32dfa0ee70f5695ed6139e829235f Mon Sep 17 00:00:00 2001 From: Pierre Lebigre Date: Tue, 18 Apr 2023 14:18:15 +0200 Subject: [PATCH 044/883] (fix) to run + delete id of create handler --- services/product/pnpm-lock.yaml | 93 +++++++++++++++++++ .../product/src/handler/Allergen/create.ts | 3 +- .../product/src/handler/Category/create.ts | 3 +- .../product/src/handler/Product/create.ts | 3 +- .../product/src/handler/Product/listType.ts | 8 +- services/product/src/server.ts | 12 +-- services/product/src/types/Product.d.ts | 2 +- services/protos/product.proto | 14 ++- 8 files changed, 115 insertions(+), 23 deletions(-) diff --git a/services/product/pnpm-lock.yaml b/services/product/pnpm-lock.yaml index 1c3bf3c6..384ac916 100644 --- a/services/product/pnpm-lock.yaml +++ b/services/product/pnpm-lock.yaml @@ -4,7 +4,9 @@ specifiers: '@grpc/grpc-js': ^1.8.14 '@grpc/proto-loader': ^0.7.6 '@prisma/client': ^4.11.0 + '@types/amqplib': ^0.10.1 '@types/node': ^18.15.7 + amqplib: ^0.10.3 express: ^4.18.2 nodemon: ^2.0.22 prisma: ^4.11.0 @@ -15,10 +17,12 @@ dependencies: '@grpc/grpc-js': 1.8.14 '@grpc/proto-loader': 0.7.6 '@prisma/client': 4.11.0_prisma@4.11.0 + amqplib: 0.10.3 express: 4.18.2 nodemon: 2.0.22 devDependencies: + '@types/amqplib': 0.10.1 '@types/node': 18.15.7 prisma: 4.11.0 ts-node: 10.9.1_gkjsv6qbk4dkl5zwoikfngqpvy @@ -26,6 +30,17 @@ devDependencies: packages: + /@acuminous/bitsyntax/0.1.2: + resolution: {integrity: sha512-29lUK80d1muEQqiUsSo+3A0yP6CdspgC95EnKBMi22Xlwt79i/En4Vr67+cXhU+cZjbti3TgGGC5wy1stIywVQ==} + engines: {node: '>=0.8'} + dependencies: + buffer-more-ints: 1.0.0 + debug: 4.3.4 + safe-buffer: 5.1.2 + transitivePeerDependencies: + - supports-color + dev: false + /@cspotcode/source-map-support/0.8.1: resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} engines: {node: '>=12'} @@ -150,6 +165,12 @@ packages: resolution: {integrity: sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==} dev: true + /@types/amqplib/0.10.1: + resolution: {integrity: sha512-j6ANKT79ncUDnAs/+9r9eDujxbeJoTjoVu33gHHcaPfmLQaMhvfbH2GqSe8KUM444epAp1Vl3peVOQfZk3UIqA==} + dependencies: + '@types/node': 18.15.7 + dev: true + /@types/long/4.0.2: resolution: {integrity: sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==} dev: false @@ -180,6 +201,18 @@ packages: hasBin: true dev: true + /amqplib/0.10.3: + resolution: {integrity: sha512-UHmuSa7n8vVW/a5HGh2nFPqAEr8+cD4dEZ6u9GjP91nHfr1a54RyAKyra7Sb5NH7NBKOUlyQSMXIp0qAixKexw==} + engines: {node: '>=10'} + dependencies: + '@acuminous/bitsyntax': 0.1.2 + buffer-more-ints: 1.0.0 + readable-stream: 1.1.14 + url-parse: 1.5.10 + transitivePeerDependencies: + - supports-color + dev: false + /ansi-regex/5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} @@ -251,6 +284,10 @@ packages: fill-range: 7.0.1 dev: false + /buffer-more-ints/1.0.0: + resolution: {integrity: sha512-EMetuGFz5SLsT0QTnXzINh4Ksr+oo4i+UGTXEshiGCQWnsgSs7ZhJ8fzlwQ+OzEMs0MpDAMr1hxnblp5a4vcHg==} + dev: false + /bytes/3.1.2: resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} engines: {node: '>= 0.8'} @@ -322,6 +359,10 @@ packages: engines: {node: '>= 0.6'} dev: false + /core-util-is/1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + dev: false + /create-require/1.1.1: resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} dev: true @@ -349,6 +390,18 @@ packages: supports-color: 5.5.0 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 + dev: false + /depd/2.0.0: resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} engines: {node: '>= 0.8'} @@ -571,6 +624,10 @@ packages: engines: {node: '>=0.12.0'} dev: false + /isarray/0.0.1: + resolution: {integrity: sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==} + dev: false + /lodash.camelcase/4.3.0: resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} dev: false @@ -629,6 +686,10 @@ packages: resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} dev: false + /ms/2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + dev: false + /ms/2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} dev: false @@ -738,6 +799,10 @@ packages: side-channel: 1.0.4 dev: false + /querystringify/2.2.0: + resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} + dev: false + /range-parser/1.2.1: resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} engines: {node: '>= 0.6'} @@ -753,6 +818,15 @@ packages: unpipe: 1.0.0 dev: false + /readable-stream/1.1.14: + resolution: {integrity: sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==} + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 0.0.1 + string_decoder: 0.10.31 + dev: false + /readdirp/3.6.0: resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} engines: {node: '>=8.10.0'} @@ -765,6 +839,14 @@ packages: engines: {node: '>=0.10.0'} dev: false + /requires-port/1.0.0: + resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} + dev: false + + /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==} dev: false @@ -849,6 +931,10 @@ packages: strip-ansi: 6.0.1 dev: false + /string_decoder/0.10.31: + resolution: {integrity: sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==} + dev: false + /strip-ansi/6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} @@ -936,6 +1022,13 @@ packages: engines: {node: '>= 0.8'} dev: false + /url-parse/1.5.10: + resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} + dependencies: + querystringify: 2.2.0 + requires-port: 1.0.0 + dev: false + /utils-merge/1.0.1: resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} engines: {node: '>= 0.4.0'} diff --git a/services/product/src/handler/Allergen/create.ts b/services/product/src/handler/Allergen/create.ts index 0d2e69ad..5412f463 100644 --- a/services/product/src/handler/Allergen/create.ts +++ b/services/product/src/handler/Allergen/create.ts @@ -9,11 +9,10 @@ export const CreateAllergen = async ( ) => { log.debug("Request received at CreateAllergen handler\n", data.request); try { - const { id, libelle, products } = data.request; + const { libelle, products } = data.request; const allergen = await prisma.allergen.create({ data: { - id, libelle, products: { connect: products diff --git a/services/product/src/handler/Category/create.ts b/services/product/src/handler/Category/create.ts index 6ee14d0d..31469a42 100644 --- a/services/product/src/handler/Category/create.ts +++ b/services/product/src/handler/Category/create.ts @@ -9,11 +9,10 @@ export const CreateCategory = async ( ) => { log.debug("Request received at CreateCategory handler\n", data.request); try { - const { id, libelle, hexa_color, icon, products } = data.request; + const { libelle, hexa_color, icon, products } = data.request; const category = await prisma.category.create({ data: { - id, libelle, icon, hexa_color, diff --git a/services/product/src/handler/Product/create.ts b/services/product/src/handler/Product/create.ts index 132594a8..fa8fac52 100644 --- a/services/product/src/handler/Product/create.ts +++ b/services/product/src/handler/Product/create.ts @@ -10,11 +10,10 @@ export const CreateProduct = async ( ) => { log.debug("Request received at CreateProduct handler\n", data.request); try { - const { id, name, image, comment, price, preparation, weight, kilocalories, nutriscore, restaurant_id, type, categories, allergens } = data.request; + const { name, image, comment, price, preparation, weight, kilocalories, nutriscore, restaurant_id, type, categories, allergens } = data.request; const product = await prisma.product.create({ data: { - id, name, image, comment, diff --git a/services/product/src/handler/Product/listType.ts b/services/product/src/handler/Product/listType.ts index f0c8cce0..b4bcbd84 100644 --- a/services/product/src/handler/Product/listType.ts +++ b/services/product/src/handler/Product/listType.ts @@ -1,15 +1,15 @@ -import { Product_type } from "../../types/Product"; +import { ProductType } from "../../types/Product"; import { Data } from "../../types"; -import { Product_type as productType} from "@prisma/client"; +import { Product_type } from "@prisma/client"; import { log } from "../../lib/log"; export const ListProductType = async ( - data: Data, + data: Data, callback: (err: any, response: any) => void ) => { log.debug("Request received at ListProduct handler\n", data.request); try { - const type = productType; + const type = Product_type; callback(null, type); } catch (error) { diff --git a/services/product/src/server.ts b/services/product/src/server.ts index 816f7ca0..ed57a2b2 100644 --- a/services/product/src/server.ts +++ b/services/product/src/server.ts @@ -1,5 +1,3 @@ -import "dotenv/config"; - import { loadSync } from "@grpc/proto-loader"; import { ServerCredentials, loadPackageDefinition, Server } from "@grpc/grpc-js"; @@ -21,15 +19,15 @@ const serverInsecure = ServerCredentials.createInsecure(); const PORT = process.env.PORT || 50008; const ADDRESS = `0.0.0.0:${PORT}`; -const PROTO_PATH = __dirname + "/../../proto/product.proto"; +const PROTO_PATH = __dirname + "/../../protos/product.proto"; const packageDefinition = loadSync(PROTO_PATH, options); -const { delivery } = loadPackageDefinition(packageDefinition) as any; // todo: fix any +const { product } = loadPackageDefinition(packageDefinition) as any; // todo: fix any const server = new Server(); -server.addService(delivery.AllergenService.service, AllergenHandler); -server.addService(delivery.CategoryService.service, CategoryHandler); -server.addService(delivery.ProductService.service, ProductHandler); +server.addService(product.AllergenService.service, AllergenHandler); +server.addService(product.CategoryService.service, CategoryHandler); +server.addService(product.ProductService.service, ProductHandler); server.bindAsync(ADDRESS, serverInsecure, () => { server.start(); diff --git a/services/product/src/types/Product.d.ts b/services/product/src/types/Product.d.ts index 6e2f2de0..64010988 100644 --- a/services/product/src/types/Product.d.ts +++ b/services/product/src/types/Product.d.ts @@ -1,7 +1,7 @@ import { Category } from "@prisma/client"; import { Empty } from "google-protobuf/google/protobuf/empty_pb"; -export enum Product_type { +export enum ProductType { ENTREES = 0, PLATS = 1, DESSERTS = 2, diff --git a/services/protos/product.proto b/services/protos/product.proto index 362a40dd..70ea11fe 100644 --- a/services/protos/product.proto +++ b/services/protos/product.proto @@ -11,6 +11,10 @@ enum ProductType { SNACKS = 4; } +message ProductTypeList{ + repeated ProductType productType = 1; +} + message RestaurantId { string id = 1; } @@ -41,9 +45,9 @@ message Product { message ProductIngredient { string id = 1; - string product_id = 1; - string ingredient_id = 2; - int32 quantity = 3; + string product_id = 2; + string ingredient_id = 3; + int32 quantity = 4; } @@ -71,7 +75,7 @@ message Allergen { } service ProductService { - rpc GetProductTypeList() returns (ProductType) {} + rpc GetProductTypeList(google.protobuf.Empty) returns (ProductTypeList) {} rpc GetProductList(RestaurantId) returns (ProductList) {} rpc CreateProduct(Product) returns (Product) {} @@ -81,7 +85,7 @@ service ProductService { } service AllergenService { - rpc CreateProduct(Allergen) returns (Allergen) {} + rpc CreateAllergen(Allergen) returns (Allergen) {} rpc ReadAllergen(AllergenId) returns (Allergen) {} rpc UpdateAllergen(Allergen) returns (Allergen) {} rpc DeleteAllergen(AllergenId) returns (google.protobuf.Empty) {} From 9daf593b9f9cd8adcade9fef26d0ce8574b7a94f Mon Sep 17 00:00:00 2001 From: Florian LEROUX <10078837+floriaaan@users.noreply.github.com> Date: Tue, 18 Apr 2023 14:27:16 +0200 Subject: [PATCH 045/883] feat(docker): add Dockerfile --- services/log/.gitignore | 1 + services/log/Dockerfile | 24 ++++++++++++++++++ services/log/README.md | 54 +++++++++++++++++++++++++++++++++-------- services/log/main.go | 2 +- 4 files changed, 70 insertions(+), 11 deletions(-) create mode 100644 services/log/.gitignore create mode 100644 services/log/Dockerfile diff --git a/services/log/.gitignore b/services/log/.gitignore new file mode 100644 index 00000000..5cf6f2bf --- /dev/null +++ b/services/log/.gitignore @@ -0,0 +1 @@ +goodfood-log \ No newline at end of file diff --git a/services/log/Dockerfile b/services/log/Dockerfile new file mode 100644 index 00000000..bbe3aa1e --- /dev/null +++ b/services/log/Dockerfile @@ -0,0 +1,24 @@ +FROM arm64v8/golang:1.20-alpine as builder + +# Set destination for COPY +WORKDIR /app + +# Download Go modules +COPY ./log/go.mod ./log/go.sum ./ +RUN go mod download + +COPY ./log/*.go ./ +COPY ./proto ./proto + +RUN go build -o goodfood-log + +FROM scratch as runner + +# Copy binary from builder +COPY --from=builder /app/goodfood-log /usr/local/bin/goodfood-log + +# Expose port +EXPOSE 50021 + +# Run +CMD ["goodfood-log"] \ No newline at end of file diff --git a/services/log/README.md b/services/log/README.md index 5674645d..c97d59eb 100644 --- a/services/log/README.md +++ b/services/log/README.md @@ -1,17 +1,21 @@ # Log Microservice -| Informations | -| ------------------------------------------------------------------ | -| **Port:** 50021 | -| **Developer:** @floriaaan | -| **Status:** In progress | -| **Last update:** 2023-04-16 | -| **Language:** Go | -| **Dependencies:** ? | +| Informations | +| ---------------------------------- | +| **Port:** 50021 | +| **Developer:** @floriaaan | +| **Status:** In progress | +| **Last update:** 2023-04-18 | +| **Language:** Go | +| **Dependencies:** gRPC, Gorm, AMQP | ## gRPC Methods -TBW +The service provides the following gRPC methods: + +- `CreateLog`: Creates a new log message. +- `GetLog`: Retrieves a log message by its ID. +- `ListLog`: Retrieves a list of all log messages. ## Requirements @@ -19,12 +23,14 @@ To run this microservice, you will need to have the following installed on your - Go (dev. with go version go1.20.2 darwin/arm64) - Postgres (v15.2 or higher) (dev. with docker image `postgres:15.2`) +- RabbitMQ (dev. with docker image `rabbitmq:3-management`) You can use the following tools to help you with the setup: - - You can use docker to run your Postgres database using: - `docker run --name postgres -p 5432:5432 -e POSTGRES_PASSWORD=password -d postgres` +- You can use docker to run your RabbitMQ server using: + - `docker run --name rabbitmq -p 5672:5672 -p 15672:15672 -d rabbitmq:3-management` ## Getting started @@ -32,3 +38,31 @@ You can use the following tools to help you with the setup: 1. Clone the `goodfood` repository to your local machine. 2. Navigate to the service directory (`services/log`) in your terminal. +3. Install the dependencies using `go mod download`. +4. Create a `.env` file at the root of the project directory and add the environment variables values ( + see `.env.example`). +5. Build the service using `go build .`. +6. Run the service using `./log`. + +You can now access the microservice at `http://localhost:50021`. + +NB: If you want to run the microservice in development mode, you can run `go run .` instead. + +### 2. Build and run the service using Docker + +Watch out for the following: + +- The build context is the `goodfood/services` folder. +- The Dockerfile `FROM image` is using an arm64 image. If you are using a different architecture, you + will need to change the image to a compatible one. +- The docker container is requiring `postgres` container to be running. You can use the following + command to run the container: + `docker run --name postgres -p 5432:5432 -e POSTGRES_PASSWORD=password -d postgres` +- The docker container is requiring `rabbitmq` container to be running. You can use the following + command to run the container: + `docker run --name rabbitmq -p 5672:5672 -p 15672:15672 -d rabbitmq:3-management` + +1. Build the Docker image from `goodfood/services` folder using: + `docker build -t goodfood-log:1.0.0 -f log/Dockerfile .` +2. Run the Docker container using: + `docker run --name goodfood-log -p 50021:50021 --env-file log/.env goodfood-log:1.0.0` diff --git a/services/log/main.go b/services/log/main.go index fbf45891..1ac1c8de 100644 --- a/services/log/main.go +++ b/services/log/main.go @@ -146,7 +146,7 @@ func failOnError(err error, msg string) { func main() { err := godotenv.Load() if err != nil { - log.Fatalf("failed to load env file: %v", err) + fmt.Printf("failed to load env file: %v\nusing arguments as env. vars", err) } dbURI := os.Getenv("DATABASE_URL") port := os.Getenv("PORT") From b809129d0a5b1f586da0ee8058f78053084bab50 Mon Sep 17 00:00:00 2001 From: Florian LEROUX <10078837+floriaaan@users.noreply.github.com> Date: Tue, 18 Apr 2023 14:31:33 +0200 Subject: [PATCH 046/883] feat(readme): add protoc generate command --- services/log/README.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/services/log/README.md b/services/log/README.md index c97d59eb..2f23d53b 100644 --- a/services/log/README.md +++ b/services/log/README.md @@ -34,6 +34,8 @@ You can use the following tools to help you with the setup: ## Getting started + + ### 1. Clone the repository and install dependencies 1. Clone the `goodfood` repository to your local machine. @@ -48,6 +50,9 @@ You can now access the microservice at `http://localhost:50021`. NB: If you want to run the microservice in development mode, you can run `go run .` instead. +If protos are updated, you will need to regenerate the gRPC code using the following command: +`protoc -I . log.proto --go-grpc_out=. --go_out=.` + ### 2. Build and run the service using Docker Watch out for the following: From 064224e887cb8bcb6df7e051c860fc477059a43b Mon Sep 17 00:00:00 2001 From: Florian LEROUX <10078837+floriaaan@users.noreply.github.com> Date: Tue, 18 Apr 2023 14:56:06 +0200 Subject: [PATCH 047/883] feat(test): add test for log service --- services/log/go.mod | 4 + services/log/go.sum | 4 + services/log/main_test.go | 159 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 167 insertions(+) create mode 100644 services/log/main_test.go diff --git a/services/log/go.mod b/services/log/go.mod index a13c8f6b..de2f4a05 100644 --- a/services/log/go.mod +++ b/services/log/go.mod @@ -10,19 +10,23 @@ require ( ) require ( + github.com/davecgh/go-spew v1.1.1 // indirect github.com/jackc/pgpassfile v1.0.0 // indirect github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a // indirect github.com/jackc/pgx/v5 v5.3.0 // indirect github.com/jinzhu/inflection v1.0.0 // indirect github.com/jinzhu/now v1.1.5 // indirect + github.com/pmezard/go-difflib v1.0.0 // indirect golang.org/x/crypto v0.6.0 // indirect golang.org/x/net v0.8.0 // indirect golang.org/x/sys v0.6.0 // indirect golang.org/x/text v0.8.0 // indirect google.golang.org/genproto v0.0.0-20230110181048-76db0878b65f // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect ) require ( + github.com/stretchr/testify v1.8.1 google.golang.org/grpc v1.54.0 google.golang.org/protobuf v1.30.0 gorm.io/driver/postgres v1.5.0 diff --git a/services/log/go.sum b/services/log/go.sum index 4f6e6a8e..c5b4e642 100644 --- a/services/log/go.sum +++ b/services/log/go.sum @@ -22,14 +22,17 @@ github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0= github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/rabbitmq/amqp091-go v1.8.0 h1:GBFy5PpLQ5jSVVSYv8ecHGqeX7UTLYR4ItQbDCss9MM= github.com/rabbitmq/amqp091-go v1.8.0/go.mod h1:+jPrT9iY2eLjRaMSRHUhc3z14E/l85kv/f+6luSD3pc= +github.com/rogpeppe/go-internal v1.6.1 h1:/FiVV8dS/e+YqF2JvO3yXRFbBLTIuSDkuC7aBOAvL+k= github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= @@ -89,6 +92,7 @@ google.golang.org/protobuf v1.30.0 h1:kPPoIgf3TsEvrm0PFe15JQ+570QVxYzEvvHqChK+cn google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/services/log/main_test.go b/services/log/main_test.go new file mode 100644 index 00000000..36f5979a --- /dev/null +++ b/services/log/main_test.go @@ -0,0 +1,159 @@ +package main + +import ( + "context" + "testing" + "time" + + pb "goodfood-log/proto" + + "github.com/golang/protobuf/ptypes/empty" + "github.com/stretchr/testify/assert" + "google.golang.org/protobuf/types/known/structpb" + "gorm.io/gorm" +) + +type mockservice struct { + pb.LogServiceServer + db *MockDB +} + +func TestLogService(t *testing.T) { + // create a new service instance with a mock database + svc := mockservice{ + db: &MockDB{}, + } + + // create a new log using the CreateLog method + ctx := context.Background() + req := &pb.CreateLogRequest{ + EventMessage: "test event message", + Metadata: &structpb.Struct{ + Fields: map[string]*structpb.Value{ + "test_field": { + Kind: &structpb.Value_StringValue{ + StringValue: "test value", + }, + }, + }, + }, + } + + res, err := svc.CreateLog(ctx, req) + assert.NoError(t, err) + assert.NotNil(t, res) + assert.NotZero(t, res.Id) + + // retrieve the log using the GetLog method + getReq := &pb.GetLogRequest{ + Id: res.Id, + } + log, err := svc.GetLog(ctx, getReq) + assert.NoError(t, err) + assert.NotNil(t, log) + assert.Equal(t, req.EventMessage, log.EventMessage) + + // list all logs using the ListLog method + emptyReq := &empty.Empty{} + listRes, err := svc.ListLog(ctx, emptyReq) + assert.NoError(t, err) + assert.NotNil(t, listRes) + assert.Len(t, listRes.Logs, 1) + assert.Equal(t, res.Id, listRes.Logs[0].Id) + + // attempt to retrieve a nonexistent log + badReq := &pb.GetLogRequest{ + Id: 999, + } + _, err = svc.GetLog(ctx, badReq) + assert.Error(t, err) +} + +type MockDB struct { + logs []Log +} + +func (db *MockDB) Create(log *Log) error { + log.ID = uint(len(db.logs) + 1) + log.Timestamp = time.Now() + db.logs = append(db.logs, *log) + return nil +} + +func (db *MockDB) Get(id uint) (*Log, error) { + for _, log := range db.logs { + if log.ID == id { + return &log, nil + } + } + return nil, gorm.ErrRecordNotFound +} + +func (db *MockDB) List() ([]Log, error) { + return db.logs, nil +} + +func (db *MockDB) Delete(id uint) error { + for i, log := range db.logs { + if log.ID == id { + db.logs = append(db.logs[:i], db.logs[i+1:]...) + return nil + } + } + return gorm.ErrRecordNotFound +} + +func (db *MockDB) Update(log *Log) error { + for i, l := range db.logs { + if l.ID == log.ID { + db.logs[i] = *log + return nil + } + } + return gorm.ErrRecordNotFound +} + +func (svc *mockservice) CreateLog(ctx context.Context, req *pb.CreateLogRequest) (*pb.Log, error) { + bytes, _ := (*req.Metadata).MarshalJSON() + log := Log{ + EventMessage: req.EventMessage, + Metadata: bytes, + } + + err := svc.db.Create(&log) + if err != nil { + return nil, err + } + + return log.ToProto(), nil +} + +func (svc *mockservice) GetLog(ctx context.Context, req *pb.GetLogRequest) (*pb.Log, error) { + log, err := svc.db.Get(uint(req.Id)) + if err != nil { + return nil, err + } + + return log.ToProto(), nil +} + +func (svc *mockservice) ListLog(ctx context.Context, req *empty.Empty) (*pb.ListLogResponse, error) { + logs, err := svc.db.List() + if err != nil { + return nil, err + } + + var pbLogs []*pb.Log + for _, log := range logs { + + if err != nil { + return nil, err + } + + pbLogs = append(pbLogs, log.ToProto()) + } + + return &pb.ListLogResponse{ + Logs: pbLogs, + }, nil +} From 84551cb32a53f12db67d318268046a1d0f357838 Mon Sep 17 00:00:00 2001 From: Florian LEROUX <10078837+floriaaan@users.noreply.github.com> Date: Tue, 18 Apr 2023 14:56:37 +0200 Subject: [PATCH 048/883] feat(ci): add workflow with build, test, publish jobs --- .github/workflows/log.yml | 49 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 .github/workflows/log.yml diff --git a/.github/workflows/log.yml b/.github/workflows/log.yml new file mode 100644 index 00000000..b9cebd09 --- /dev/null +++ b/.github/workflows/log.yml @@ -0,0 +1,49 @@ +name: Log Microservice CI/CD + +on: + push: + branches: [log] + pull_request: + branches: [dev, main] + +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@master + - name: Install Go + uses: actions/setup-go@v2 + with: + go-version: 1.20 + - name: Build + run: go build ./services/log + + test: + runs-on: ubuntu-latest + needs: build + steps: + - uses: actions/checkout@master + - name: Install Go + uses: actions/setup-go@v2 + with: + go-version: 1.20 + - name: Execute tests + run: cd services/log && go test -v + + publish: + runs-on: ubuntu-latest + needs: [build, test] + steps: + - name: Checkout code + uses: actions/checkout@v2 + - name: Login to Docker Hub + uses: docker/login-action@v1 + with: + username: ${{ secrets.DOCKER_USERNAME }} + password: ${{ secrets.DOCKER_PASSWORD }} + - name: Build and push Docker image + uses: docker/build-push-action@v2 + with: + context: ./services/log + push: true + tags: goodfood-log:latest From e105e486bb1d7fefe262dd80f0ab9401180ba70c Mon Sep 17 00:00:00 2001 From: Florian LEROUX <10078837+floriaaan@users.noreply.github.com> Date: Tue, 18 Apr 2023 14:59:21 +0200 Subject: [PATCH 049/883] fix(ci): add install dependencies --- .github/workflows/log.yml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/.github/workflows/log.yml b/.github/workflows/log.yml index b9cebd09..dded27cb 100644 --- a/.github/workflows/log.yml +++ b/.github/workflows/log.yml @@ -15,8 +15,10 @@ jobs: uses: actions/setup-go@v2 with: go-version: 1.20 + - name: Install dependencies + run: cd services/log && go mod download - name: Build - run: go build ./services/log + run: cd services/log && go build . test: runs-on: ubuntu-latest @@ -27,6 +29,8 @@ jobs: uses: actions/setup-go@v2 with: go-version: 1.20 + - name: Install dependencies + run: cd services/log && go mod download - name: Execute tests run: cd services/log && go test -v From 791812a1b9bc493ffc7729ecbcaa17ce7399270c Mon Sep 17 00:00:00 2001 From: Florian LEROUX <10078837+floriaaan@users.noreply.github.com> Date: Tue, 18 Apr 2023 15:00:37 +0200 Subject: [PATCH 050/883] fix?: change go mod dl => go mod tidy --- .github/workflows/log.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/log.yml b/.github/workflows/log.yml index dded27cb..143cf1d0 100644 --- a/.github/workflows/log.yml +++ b/.github/workflows/log.yml @@ -16,7 +16,7 @@ jobs: with: go-version: 1.20 - name: Install dependencies - run: cd services/log && go mod download + run: cd services/log && go mod tidy - name: Build run: cd services/log && go build . @@ -30,7 +30,7 @@ jobs: with: go-version: 1.20 - name: Install dependencies - run: cd services/log && go mod download + run: cd services/log && go mod tidy - name: Execute tests run: cd services/log && go test -v From 90abf8f11f7683f971973d10708af61dab8ba1ad Mon Sep 17 00:00:00 2001 From: Florian LEROUX <10078837+floriaaan@users.noreply.github.com> Date: Tue, 18 Apr 2023 15:06:15 +0200 Subject: [PATCH 051/883] fix?: remove go mod --- .github/workflows/log.yml | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/.github/workflows/log.yml b/.github/workflows/log.yml index 143cf1d0..e9c930ce 100644 --- a/.github/workflows/log.yml +++ b/.github/workflows/log.yml @@ -15,10 +15,9 @@ jobs: uses: actions/setup-go@v2 with: go-version: 1.20 - - name: Install dependencies - run: cd services/log && go mod tidy + - name: Build - run: cd services/log && go build . + run: cd services/log && go build ./... test: runs-on: ubuntu-latest @@ -29,10 +28,9 @@ jobs: uses: actions/setup-go@v2 with: go-version: 1.20 - - name: Install dependencies - run: cd services/log && go mod tidy + - name: Execute tests - run: cd services/log && go test -v + run: cd services/log && go test -v ./... publish: runs-on: ubuntu-latest From f48772e437e86bcd02f73a5344b4e78607f2ee33 Mon Sep 17 00:00:00 2001 From: Florian LEROUX <10078837+floriaaan@users.noreply.github.com> Date: Tue, 18 Apr 2023 15:10:51 +0200 Subject: [PATCH 052/883] fix?(ci): change go version --- .github/workflows/log.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/log.yml b/.github/workflows/log.yml index e9c930ce..8410fcc0 100644 --- a/.github/workflows/log.yml +++ b/.github/workflows/log.yml @@ -14,10 +14,10 @@ jobs: - name: Install Go uses: actions/setup-go@v2 with: - go-version: 1.20 + go-version: 1.20.3 - name: Build - run: cd services/log && go build ./... + run: cd services/log && go build . test: runs-on: ubuntu-latest @@ -27,10 +27,10 @@ jobs: - name: Install Go uses: actions/setup-go@v2 with: - go-version: 1.20 + go-version: 1.20.3 - name: Execute tests - run: cd services/log && go test -v ./... + run: cd services/log && go test -v . publish: runs-on: ubuntu-latest From 639cefd472469143639500c030f3a108669c3fc8 Mon Sep 17 00:00:00 2001 From: Florian LEROUX <10078837+floriaaan@users.noreply.github.com> Date: Tue, 18 Apr 2023 16:12:29 +0200 Subject: [PATCH 053/883] feat(grpc): init dotnet grpc server --- services/proto/greet.proto | 13 + services/reporting/.gitignore | 411 ++++++++++++++++++ services/reporting/.vscode/launch.json | 35 ++ services/reporting/.vscode/tasks.json | 41 ++ services/reporting/Program.cs | 13 + .../reporting/Properties/launchSettings.json | 13 + services/reporting/Protos | 1 + services/reporting/Services/GreeterService.cs | 21 + .../reporting/appsettings.Development.json | 8 + services/reporting/appsettings.json | 14 + services/reporting/reporting.csproj | 17 + 11 files changed, 587 insertions(+) create mode 100644 services/proto/greet.proto create mode 100644 services/reporting/.gitignore create mode 100644 services/reporting/.vscode/launch.json create mode 100644 services/reporting/.vscode/tasks.json create mode 100644 services/reporting/Program.cs create mode 100644 services/reporting/Properties/launchSettings.json create mode 120000 services/reporting/Protos create mode 100644 services/reporting/Services/GreeterService.cs create mode 100644 services/reporting/appsettings.Development.json create mode 100644 services/reporting/appsettings.json create mode 100644 services/reporting/reporting.csproj diff --git a/services/proto/greet.proto b/services/proto/greet.proto new file mode 100644 index 00000000..083ba80b --- /dev/null +++ b/services/proto/greet.proto @@ -0,0 +1,13 @@ +syntax = "proto3"; + +service Greeter { + rpc SayHello (HelloRequest) returns (HelloReply); +} + +message HelloRequest { + string name = 1; +} + +message HelloReply { + string message = 1; +} \ No newline at end of file diff --git a/services/reporting/.gitignore b/services/reporting/.gitignore new file mode 100644 index 00000000..bc4918e1 --- /dev/null +++ b/services/reporting/.gitignore @@ -0,0 +1,411 @@ +# Created by https://www.toptal.com/developers/gitignore/api/dotnetcore,csharp +# Edit at https://www.toptal.com/developers/gitignore?templates=dotnetcore,csharp + +### Csharp ### +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. +## +## Get latest from https://github.com/github/gitignore/blob/main/VisualStudio.gitignore + +# User-specific files +*.rsuser +*.suo +*.user +*.userosscache +*.sln.docstates + +# User-specific files (MonoDevelop/Xamarin Studio) +*.userprefs + +# Mono auto generated files +mono_crash.* + +# Build results +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +[Rr]eleases/ +x64/ +x86/ +[Ww][Ii][Nn]32/ +[Aa][Rr][Mm]/ +[Aa][Rr][Mm]64/ +bld/ +[Bb]in/ +[Oo]bj/ +[Ll]og/ +[Ll]ogs/ + +# Visual Studio 2015/2017 cache/options directory +.vs/ +# Uncomment if you have tasks that create the project's static files in wwwroot +#wwwroot/ + +# Visual Studio 2017 auto generated files +Generated\ Files/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +# NUnit +*.VisualState.xml +TestResult.xml +nunit-*.xml + +# Build Results of an ATL Project +[Dd]ebugPS/ +[Rr]eleasePS/ +dlldata.c + +# Benchmark Results +BenchmarkDotNet.Artifacts/ + +# .NET Core +project.lock.json +project.fragment.lock.json +artifacts/ + +# ASP.NET Scaffolding +ScaffoldingReadMe.txt + +# StyleCop +StyleCopReport.xml + +# Files built by Visual Studio +*_i.c +*_p.c +*_h.h +*.ilk +*.meta +*.obj +*.iobj +*.pch +*.pdb +*.ipdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*_wpftmp.csproj +*.log +*.tlog +*.vspscc +*.vssscc +.builds +*.pidb +*.svclog +*.scc + +# Chutzpah Test files +_Chutzpah* + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opendb +*.opensdf +*.sdf +*.cachefile +*.VC.db +*.VC.VC.opendb + +# Visual Studio profiler +*.psess +*.vsp +*.vspx +*.sap + +# Visual Studio Trace Files +*.e2e + +# TFS 2012 Local Workspace +$tf/ + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper +*.DotSettings.user + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# AxoCover is a Code Coverage Tool +.axoCover/* +!.axoCover/settings.json + +# Coverlet is a free, cross platform Code Coverage Tool +coverage*.json +coverage*.xml +coverage*.info + +# Visual Studio code coverage results +*.coverage +*.coveragexml + +# NCrunch +_NCrunch_* +.*crunch*.local.xml +nCrunchTemp_* + +# MightyMoose +*.mm.* +AutoTest.Net/ + +# Web workbench (sass) +.sass-cache/ + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.[Pp]ublish.xml +*.azurePubxml +# Note: Comment the next line if you want to checkin your web deploy settings, +# but database connection strings (with potential passwords) will be unencrypted +*.pubxml +*.publishproj + +# Microsoft Azure Web App publish settings. Comment the next line if you want to +# checkin your Azure Web App publish settings, but sensitive information contained +# in these scripts will be unencrypted +PublishScripts/ + +# NuGet Packages +*.nupkg +# NuGet Symbol Packages +*.snupkg +# The packages folder can be ignored because of Package Restore +**/[Pp]ackages/* +# except build/, which is used as an MSBuild target. +!**/[Pp]ackages/build/ +# Uncomment if necessary however generally it will be regenerated when needed +#!**/[Pp]ackages/repositories.config +# NuGet v3's project.json files produces more ignorable files +*.nuget.props +*.nuget.targets + +# Microsoft Azure Build Output +csx/ +*.build.csdef + +# Microsoft Azure Emulator +ecf/ +rcf/ + +# Windows Store app package directories and files +AppPackages/ +BundleArtifacts/ +Package.StoreAssociation.xml +_pkginfo.txt +*.appx +*.appxbundle +*.appxupload + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!?*.[Cc]ache/ + +# Others +ClientBin/ +~$* +*~ +*.dbmdl +*.dbproj.schemaview +*.jfm +*.pfx +*.publishsettings +orleans.codegen.cs + +# Including strong name files can present a security risk +# (https://github.com/github/gitignore/pull/2483#issue-259490424) +#*.snk + +# Since there are multiple workflows, uncomment next line to ignore bower_components +# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) +#bower_components/ + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file +# to a newer Visual Studio version. Backup files are not needed, +# because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm +ServiceFabricBackup/ +*.rptproj.bak + +# SQL Server files +*.mdf +*.ldf +*.ndf + +# Business Intelligence projects +*.rdl.data +*.bim.layout +*.bim_*.settings +*.rptproj.rsuser +*- [Bb]ackup.rdl +*- [Bb]ackup ([0-9]).rdl +*- [Bb]ackup ([0-9][0-9]).rdl + +# Microsoft Fakes +FakesAssemblies/ + +# GhostDoc plugin setting file +*.GhostDoc.xml + +# Node.js Tools for Visual Studio +.ntvs_analysis.dat +node_modules/ + +# Visual Studio 6 build log +*.plg + +# Visual Studio 6 workspace options file +*.opt + +# Visual Studio 6 auto-generated workspace file (contains which files were open etc.) +*.vbw + +# Visual Studio 6 auto-generated project file (contains which files were open etc.) +*.vbp + +# Visual Studio 6 workspace and project file (working project files containing files to include in project) +*.dsw +*.dsp + +# Visual Studio 6 technical files + +# Visual Studio LightSwitch build output +**/*.HTMLClient/GeneratedArtifacts +**/*.DesktopClient/GeneratedArtifacts +**/*.DesktopClient/ModelManifest.xml +**/*.Server/GeneratedArtifacts +**/*.Server/ModelManifest.xml +_Pvt_Extensions + +# Paket dependency manager +.paket/paket.exe +paket-files/ + +# FAKE - F# Make +.fake/ + +# CodeRush personal settings +.cr/personal + +# Python Tools for Visual Studio (PTVS) +__pycache__/ +*.pyc + +# Cake - Uncomment if you are using it +# tools/** +# !tools/packages.config + +# Tabs Studio +*.tss + +# Telerik's JustMock configuration file +*.jmconfig + +# BizTalk build output +*.btp.cs +*.btm.cs +*.odx.cs +*.xsd.cs + +# OpenCover UI analysis results +OpenCover/ + +# Azure Stream Analytics local run output +ASALocalRun/ + +# MSBuild Binary and Structured Log +*.binlog + +# NVidia Nsight GPU debugger configuration file +*.nvuser + +# MFractors (Xamarin productivity tool) working folder +.mfractor/ + +# Local History for Visual Studio +.localhistory/ + +# Visual Studio History (VSHistory) files +.vshistory/ + +# BeatPulse healthcheck temp database +healthchecksdb + +# Backup folder for Package Reference Convert tool in Visual Studio 2017 +MigrationBackup/ + +# Ionide (cross platform F# VS Code tools) working folder +.ionide/ + +# Fody - auto-generated XML schema +FodyWeavers.xsd + +# VS Code files for those working on multiple tools +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json +*.code-workspace + +# Local History for Visual Studio Code +.history/ + +# Windows Installer files from build outputs +*.cab +*.msi +*.msix +*.msm +*.msp + +# JetBrains Rider +*.sln.iml + +### DotnetCore ### +# .NET Core build folders +bin/ +obj/ + +# Common node modules locations +/node_modules +/wwwroot/node_modules + +# End of https://www.toptal.com/developers/gitignore/api/dotnetcore,csharp \ No newline at end of file diff --git a/services/reporting/.vscode/launch.json b/services/reporting/.vscode/launch.json new file mode 100644 index 00000000..e0e16539 --- /dev/null +++ b/services/reporting/.vscode/launch.json @@ -0,0 +1,35 @@ +{ + "version": "0.2.0", + "configurations": [ + { + // Use IntelliSense to find out which attributes exist for C# debugging + // Use hover for the description of the existing attributes + // For further information visit https://github.com/OmniSharp/omnisharp-vscode/blob/master/debugger-launchjson.md + "name": ".NET Core Launch (web)", + "type": "coreclr", + "request": "launch", + "preLaunchTask": "build", + // If you have changed target frameworks, make sure to update the program path. + "program": "${workspaceFolder}/bin/Debug/net6.0/reporting.dll", + "args": [], + "cwd": "${workspaceFolder}", + "stopAtEntry": false, + // Enable launching a web browser when ASP.NET Core starts. For more information: https://aka.ms/VSCode-CS-LaunchJson-WebBrowser + "serverReadyAction": { + "action": "openExternally", + "pattern": "\\bNow listening on:\\s+(https?://\\S+)" + }, + "env": { + "ASPNETCORE_ENVIRONMENT": "Development" + }, + "sourceFileMap": { + "/Views": "${workspaceFolder}/Views" + } + }, + { + "name": ".NET Core Attach", + "type": "coreclr", + "request": "attach" + } + ] +} \ No newline at end of file diff --git a/services/reporting/.vscode/tasks.json b/services/reporting/.vscode/tasks.json new file mode 100644 index 00000000..d1206fc1 --- /dev/null +++ b/services/reporting/.vscode/tasks.json @@ -0,0 +1,41 @@ +{ + "version": "2.0.0", + "tasks": [ + { + "label": "build", + "command": "dotnet", + "type": "process", + "args": [ + "build", + "${workspaceFolder}/reporting.csproj", + "/property:GenerateFullPaths=true", + "/consoleloggerparameters:NoSummary" + ], + "problemMatcher": "$msCompile" + }, + { + "label": "publish", + "command": "dotnet", + "type": "process", + "args": [ + "publish", + "${workspaceFolder}/reporting.csproj", + "/property:GenerateFullPaths=true", + "/consoleloggerparameters:NoSummary" + ], + "problemMatcher": "$msCompile" + }, + { + "label": "watch", + "command": "dotnet", + "type": "process", + "args": [ + "watch", + "run", + "--project", + "${workspaceFolder}/reporting.csproj" + ], + "problemMatcher": "$msCompile" + } + ] +} \ No newline at end of file diff --git a/services/reporting/Program.cs b/services/reporting/Program.cs new file mode 100644 index 00000000..88938993 --- /dev/null +++ b/services/reporting/Program.cs @@ -0,0 +1,13 @@ +using reporting.Services; + +var builder = WebApplication.CreateBuilder(args); +// Add services to the container. +builder.Services.AddGrpc(); + +var app = builder.Build(); + +// Configure the HTTP request pipeline. +app.MapGrpcService(); +app.MapGet("/", () => "Communication with gRPC endpoints must be made through a gRPC client. To learn how to create a client, visit: https://go.microsoft.com/fwlink/?linkid=2086909"); + +app.Run(); diff --git a/services/reporting/Properties/launchSettings.json b/services/reporting/Properties/launchSettings.json new file mode 100644 index 00000000..3f82e7c9 --- /dev/null +++ b/services/reporting/Properties/launchSettings.json @@ -0,0 +1,13 @@ +{ + "profiles": { + "reporting": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": false, + "applicationUrl": "http://localhost:50020", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + } + } +} diff --git a/services/reporting/Protos b/services/reporting/Protos new file mode 120000 index 00000000..4d1e2d8b --- /dev/null +++ b/services/reporting/Protos @@ -0,0 +1 @@ +../proto/ \ No newline at end of file diff --git a/services/reporting/Services/GreeterService.cs b/services/reporting/Services/GreeterService.cs new file mode 100644 index 00000000..046598db --- /dev/null +++ b/services/reporting/Services/GreeterService.cs @@ -0,0 +1,21 @@ +using Grpc.Core; +using reporting; + +namespace reporting.Services; + +public class GreeterService : Greeter.GreeterBase +{ + private readonly ILogger _logger; + public GreeterService(ILogger logger) + { + _logger = logger; + } + + public override Task SayHello(HelloRequest request, ServerCallContext context) + { + return Task.FromResult(new HelloReply + { + Message = "Hello " + request.Name + }); + } +} diff --git a/services/reporting/appsettings.Development.json b/services/reporting/appsettings.Development.json new file mode 100644 index 00000000..0c208ae9 --- /dev/null +++ b/services/reporting/appsettings.Development.json @@ -0,0 +1,8 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + } +} diff --git a/services/reporting/appsettings.json b/services/reporting/appsettings.json new file mode 100644 index 00000000..1aef5074 --- /dev/null +++ b/services/reporting/appsettings.json @@ -0,0 +1,14 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + }, + "AllowedHosts": "*", + "Kestrel": { + "EndpointDefaults": { + "Protocols": "Http2" + } + } +} diff --git a/services/reporting/reporting.csproj b/services/reporting/reporting.csproj new file mode 100644 index 00000000..ce368b7e --- /dev/null +++ b/services/reporting/reporting.csproj @@ -0,0 +1,17 @@ + + + + net6.0 + enable + enable + + + + + + + + + + + From 22111829e9e0dc7f73e769c444d90777fa1f3bf1 Mon Sep 17 00:00:00 2001 From: Florian LEROUX <10078837+floriaaan@users.noreply.github.com> Date: Wed, 19 Apr 2023 11:41:33 +0200 Subject: [PATCH 054/883] ref(upgrade): migrate from dotnet6 to dotnet8-preview --- services/proto/greet.proto | 34 +++++++++------ services/reporting/.vscode/launch.json | 2 +- services/reporting/Program.cs | 36 ++++++++++------ .../reporting/Properties/launchSettings.json | 36 ++++++++++------ services/reporting/Services/GreeterService.cs | 42 +++++++++---------- .../reporting/appsettings.Development.json | 16 +++---- services/reporting/appsettings.json | 28 ++++++------- services/reporting/reporting.csproj | 36 ++++++++-------- 8 files changed, 130 insertions(+), 100 deletions(-) diff --git a/services/proto/greet.proto b/services/proto/greet.proto index 083ba80b..a8a599df 100644 --- a/services/proto/greet.proto +++ b/services/proto/greet.proto @@ -1,13 +1,21 @@ -syntax = "proto3"; - -service Greeter { - rpc SayHello (HelloRequest) returns (HelloReply); -} - -message HelloRequest { - string name = 1; -} - -message HelloReply { - string message = 1; -} \ No newline at end of file +syntax = "proto3"; + +option csharp_namespace = "reporting"; + +package greet; + +// The greeting service definition. +service Greeter { + // Sends a greeting + rpc SayHello (HelloRequest) returns (HelloReply); +} + +// The request message containing the user's name. +message HelloRequest { + string name = 1; +} + +// The response message containing the greetings. +message HelloReply { + string message = 1; +} diff --git a/services/reporting/.vscode/launch.json b/services/reporting/.vscode/launch.json index e0e16539..2a04fbab 100644 --- a/services/reporting/.vscode/launch.json +++ b/services/reporting/.vscode/launch.json @@ -10,7 +10,7 @@ "request": "launch", "preLaunchTask": "build", // If you have changed target frameworks, make sure to update the program path. - "program": "${workspaceFolder}/bin/Debug/net6.0/reporting.dll", + "program": "${workspaceFolder}/bin/Debug/net8.0/reporting.dll", "args": [], "cwd": "${workspaceFolder}", "stopAtEntry": false, diff --git a/services/reporting/Program.cs b/services/reporting/Program.cs index 88938993..50291b69 100644 --- a/services/reporting/Program.cs +++ b/services/reporting/Program.cs @@ -1,13 +1,23 @@ -using reporting.Services; - -var builder = WebApplication.CreateBuilder(args); -// Add services to the container. -builder.Services.AddGrpc(); - -var app = builder.Build(); - -// Configure the HTTP request pipeline. -app.MapGrpcService(); -app.MapGet("/", () => "Communication with gRPC endpoints must be made through a gRPC client. To learn how to create a client, visit: https://go.microsoft.com/fwlink/?linkid=2086909"); - -app.Run(); +using reporting.Services; + +var builder = WebApplication.CreateBuilder(args); + +// Add services to the container. +builder.Services.AddGrpc(); +builder.Services.AddGrpcReflection(); + + +var app = builder.Build(); + +IWebHostEnvironment env = app.Environment; + +if (env.IsDevelopment()) +{ + app.MapGrpcReflectionService(); +} + +// Configure the HTTP request pipeline. +app.MapGrpcService(); +app.MapGet("/", () => "Communication with gRPC endpoints must be made through a gRPC client. To learn how to create a client, visit: https://go.microsoft.com/fwlink/?linkid=2086909"); + +app.Run(); diff --git a/services/reporting/Properties/launchSettings.json b/services/reporting/Properties/launchSettings.json index 3f82e7c9..68e15360 100644 --- a/services/reporting/Properties/launchSettings.json +++ b/services/reporting/Properties/launchSettings.json @@ -1,13 +1,23 @@ -{ - "profiles": { - "reporting": { - "commandName": "Project", - "dotnetRunMessages": true, - "launchBrowser": false, - "applicationUrl": "http://localhost:50020", - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - } - } - } -} +{ + "$schema": "http://json.schemastore.org/launchsettings.json", + "profiles": { + "http": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": false, + "applicationUrl": "https://localhost:50020", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "https": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": false, + "applicationUrl": "https://localhost:50020", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + } + } +} diff --git a/services/reporting/Services/GreeterService.cs b/services/reporting/Services/GreeterService.cs index 046598db..61cb1b58 100644 --- a/services/reporting/Services/GreeterService.cs +++ b/services/reporting/Services/GreeterService.cs @@ -1,21 +1,21 @@ -using Grpc.Core; -using reporting; - -namespace reporting.Services; - -public class GreeterService : Greeter.GreeterBase -{ - private readonly ILogger _logger; - public GreeterService(ILogger logger) - { - _logger = logger; - } - - public override Task SayHello(HelloRequest request, ServerCallContext context) - { - return Task.FromResult(new HelloReply - { - Message = "Hello " + request.Name - }); - } -} +using Grpc.Core; +using reporting; + +namespace reporting.Services; + +public class GreeterService : Greeter.GreeterBase +{ + private readonly ILogger _logger; + public GreeterService(ILogger logger) + { + _logger = logger; + } + + public override Task SayHello(HelloRequest request, ServerCallContext context) + { + return Task.FromResult(new HelloReply + { + Message = "Hello " + request.Name + }); + } +} diff --git a/services/reporting/appsettings.Development.json b/services/reporting/appsettings.Development.json index 0c208ae9..ff66ba6b 100644 --- a/services/reporting/appsettings.Development.json +++ b/services/reporting/appsettings.Development.json @@ -1,8 +1,8 @@ -{ - "Logging": { - "LogLevel": { - "Default": "Information", - "Microsoft.AspNetCore": "Warning" - } - } -} +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + } +} diff --git a/services/reporting/appsettings.json b/services/reporting/appsettings.json index 1aef5074..e559d3aa 100644 --- a/services/reporting/appsettings.json +++ b/services/reporting/appsettings.json @@ -1,14 +1,14 @@ -{ - "Logging": { - "LogLevel": { - "Default": "Information", - "Microsoft.AspNetCore": "Warning" - } - }, - "AllowedHosts": "*", - "Kestrel": { - "EndpointDefaults": { - "Protocols": "Http2" - } - } -} +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + }, + "AllowedHosts": "*", + "Kestrel": { + "EndpointDefaults": { + "Protocols": "Http2" + } + } +} diff --git a/services/reporting/reporting.csproj b/services/reporting/reporting.csproj index ce368b7e..c0ae43b5 100644 --- a/services/reporting/reporting.csproj +++ b/services/reporting/reporting.csproj @@ -1,17 +1,19 @@ - - - - net6.0 - enable - enable - - - - - - - - - - - + + + + net8.0 + enable + enable + true + + + + + + + + + + + + From 68b0dd21c60f0131671553692146f69dc6d2e0b3 Mon Sep 17 00:00:00 2001 From: Florian Leroux <10078837+floriaaan@users.noreply.github.com> Date: Wed, 19 Apr 2023 11:50:40 +0200 Subject: [PATCH 055/883] ref: change publish job --- .github/workflows/delivery.yml | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/.github/workflows/delivery.yml b/.github/workflows/delivery.yml index 376cbb09..86e0d4c2 100644 --- a/.github/workflows/delivery.yml +++ b/.github/workflows/delivery.yml @@ -57,13 +57,14 @@ jobs: - name: Checkout code uses: actions/checkout@v2 - name: Login to Docker Hub - uses: docker/login-action@v1 + uses: docker/login-action@v2 with: - username: ${{ secrets.DOCKER_USERNAME }} - password: ${{ secrets.DOCKER_PASSWORD }} - - name: Build and push Docker image - uses: docker/build-push-action@v2 + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + - name: Build and push + uses: docker/build-push-action@v4 with: - context: ./services/delivery + context: ./services/ + file: ./services/delivery/Dockerfile push: true - tags: goodfood-delivery:latest + tags: floriaaan/goodfood-delivery:latest From df451f8c83fcd7c9b210fb589b62508ff5eff56f Mon Sep 17 00:00:00 2001 From: Florian Leroux <10078837+floriaaan@users.noreply.github.com> Date: Wed, 19 Apr 2023 11:58:43 +0200 Subject: [PATCH 056/883] ref(ci): change actions/checkout@v2 -> actions/checkout@master --- .github/workflows/delivery.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/delivery.yml b/.github/workflows/delivery.yml index 86e0d4c2..36845dc3 100644 --- a/.github/workflows/delivery.yml +++ b/.github/workflows/delivery.yml @@ -55,7 +55,7 @@ jobs: needs: [build, test] steps: - name: Checkout code - uses: actions/checkout@v2 + uses: actions/checkout@master - name: Login to Docker Hub uses: docker/login-action@v2 with: From 8b29b2eadf40618f4fbf660f320a37fe67681c39 Mon Sep 17 00:00:00 2001 From: Florian Leroux <10078837+floriaaan@users.noreply.github.com> Date: Wed, 19 Apr 2023 12:02:33 +0200 Subject: [PATCH 057/883] ref: change publish job --- .github/workflows/log.yml | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/.github/workflows/log.yml b/.github/workflows/log.yml index 8410fcc0..9b08ee9e 100644 --- a/.github/workflows/log.yml +++ b/.github/workflows/log.yml @@ -37,15 +37,16 @@ jobs: needs: [build, test] steps: - name: Checkout code - uses: actions/checkout@v2 + uses: actions/checkout@master - name: Login to Docker Hub - uses: docker/login-action@v1 + uses: docker/login-action@v2 with: - username: ${{ secrets.DOCKER_USERNAME }} - password: ${{ secrets.DOCKER_PASSWORD }} - - name: Build and push Docker image - uses: docker/build-push-action@v2 + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + - name: Build and push + uses: docker/build-push-action@v4 with: - context: ./services/log + context: ./services/ + file: ./services/log/Dockerfile push: true - tags: goodfood-log:latest + tags: floriaaan/goodfood-log:latest From a7193e4b66fd6039c609a72a9f8b1bcca3c8e204 Mon Sep 17 00:00:00 2001 From: Florian Leroux <10078837+floriaaan@users.noreply.github.com> Date: Wed, 19 Apr 2023 12:06:33 +0200 Subject: [PATCH 058/883] ref(ci): change actions/setup-go@v2 -> actions/setup-go@v4 --- .github/workflows/log.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/log.yml b/.github/workflows/log.yml index 9b08ee9e..2f7be2d6 100644 --- a/.github/workflows/log.yml +++ b/.github/workflows/log.yml @@ -12,7 +12,7 @@ jobs: steps: - uses: actions/checkout@master - name: Install Go - uses: actions/setup-go@v2 + uses: actions/setup-go@v4 with: go-version: 1.20.3 @@ -25,7 +25,7 @@ jobs: steps: - uses: actions/checkout@master - name: Install Go - uses: actions/setup-go@v2 + uses: actions/setup-go@v4 with: go-version: 1.20.3 From 10b76cfd5ef189f27b92d04fef4e91ea5a47afa4 Mon Sep 17 00:00:00 2001 From: anatole Date: Wed, 19 Apr 2023 15:23:32 +0200 Subject: [PATCH 059/883] feat(terraform): update general terraform --- services/delivery/terraform/data.tf | 12 ++---- terraform/data.tf | 6 +-- terraform/env/dev-backend.tfvars.example | 2 +- terraform/main.tf | 49 ++++++++++++++++++++++-- terraform/outputs.tf | 34 ++++++++++++++-- terraform/variables.tf | 15 ++++++++ 6 files changed, 97 insertions(+), 21 deletions(-) diff --git a/services/delivery/terraform/data.tf b/services/delivery/terraform/data.tf index adf0b7fd..618f4e55 100644 --- a/services/delivery/terraform/data.tf +++ b/services/delivery/terraform/data.tf @@ -2,16 +2,12 @@ data "azurerm_resource_group" "rg-goodfood" { name = "rg-${var.project_name}${var.environnment_suffix}" } -data "azurerm_key_vault" "kv-goodfood-delivery" { - resource_group_name = data.azurerm_resource_group.rg-goodfood.name - name = "kv-${var.project_name}" -} - data "azurerm_key_vault_secret" "delivery-db-login" { name = "delivery-db-login" - key_vault_id = data.azurerm_key_vault.kv-goodfood-delivery.id + key_vault_id = azurerm_key_vault.kv-goodfood-delivery.id } data "azurerm_key_vault_secret" "delivery-db-password" { name = "delivery-db-password" - key_vault_id = data.azurerm_key_vault.kv-goodfood-delivery.id -} \ No newline at end of file + key_vault_id = azurerm_key_vault.kv-goodfood-delivery.id +} +data "azurerm_client_config" "current" {} diff --git a/terraform/data.tf b/terraform/data.tf index 1906bbe7..ec75f3c3 100644 --- a/terraform/data.tf +++ b/terraform/data.tf @@ -2,8 +2,4 @@ data "azurerm_resource_group" "rg-goodfood" { name = "rg-${var.project_name}${var.environnment_suffix}" } -data "azurerm_key_vault" "kv-goodfood" { - resource_group_name = data.azurerm_resource_group.rg-goodfood.name - name = "kv-${var.project_name}" -} - +data "azurerm_client_config" "current" {} diff --git a/terraform/env/dev-backend.tfvars.example b/terraform/env/dev-backend.tfvars.example index 7df882a6..e7576abb 100644 --- a/terraform/env/dev-backend.tfvars.example +++ b/terraform/env/dev-backend.tfvars.example @@ -1,4 +1,4 @@ resource_group_name = "rg-goodfood-dev" -storage_account_name = "sa-goodfood-states" +storage_account_name = "pafgoodfood" container_name = "tfstate" key = "main-dev.tfstate" diff --git a/terraform/main.tf b/terraform/main.tf index e9cc0e91..73c9e44f 100644 --- a/terraform/main.tf +++ b/terraform/main.tf @@ -12,6 +12,33 @@ provider "azurerm" { features {} } +resource "azurerm_key_vault" "kv-goodfood" { + name = "kv-goodfood-delivery" + location = data.azurerm_resource_group.rg-goodfood.location + resource_group_name = data.azurerm_resource_group.rg-goodfood.name + tenant_id = data.azurerm_client_config.current.tenant_id + sku_name = "standard" + soft_delete_retention_days = 7 + + access_policy { + tenant_id = data.azurerm_client_config.current.tenant_id + object_id = data.azurerm_client_config.current.object_id + + key_permissions = [ + "Create", + "Get", + ] + + secret_permissions = [ + "Set", + "Get", + "Delete", + "Purge", + "Recover" + ] + } +} + resource "azurerm_service_plan" "sp-goodfood" { name = "sp-${var.project_name}${var.environnment_suffix}" resource_group_name = data.azurerm_resource_group.rg-goodfood.name @@ -43,13 +70,27 @@ resource "azurerm_kubernetes_cluster" "aks-goodfood" { resource_group_name = data.azurerm_resource_group.rg-goodfood.name dns_prefix = "aks-${var.project_name}${var.environnment_suffix}" + default_node_pool { - name = "default" - node_count = 1 + name = "agentpool" vm_size = "Standard_D2_v2" + node_count = var.agent_count + } + linux_profile { + admin_username = "ubuntu" + + ssh_key { + key_data = file(var.ssh_public_key) + } + } + + network_profile { + network_plugin = "kubenet" + load_balancer_sku = "standard" } - identity { - type = "SystemAssigned" + service_principal { + client_id = var.aks_service_principal_app_id + client_secret = var.aks_service_principal_client_secret } } \ No newline at end of file diff --git a/terraform/outputs.tf b/terraform/outputs.tf index aa5afd79..f5b3c6b6 100644 --- a/terraform/outputs.tf +++ b/terraform/outputs.tf @@ -4,13 +4,41 @@ output "main-rg-name" { output "main-rg-id" { value = data.azurerm_resource_group.rg-goodfood.id } - output "client_certificate" { - value = azurerm_kubernetes_cluster.aks-goodfood.kube_config.0.client_certificate + value = azurerm_kubernetes_cluster.aks-goodfood.kube_config[0].client_certificate + sensitive = true +} + +output "client_key" { + value = azurerm_kubernetes_cluster.aks-goodfood.kube_config[0].client_key + sensitive = true +} + +output "cluster_ca_certificate" { + value = azurerm_kubernetes_cluster.aks-goodfood.kube_config[0].cluster_ca_certificate + sensitive = true +} + +output "cluster_password" { + value = azurerm_kubernetes_cluster.aks-goodfood.kube_config[0].password + sensitive = true +} + +output "cluster_username" { + value = azurerm_kubernetes_cluster.aks-goodfood.kube_config[0].username + sensitive = true +} + +output "host" { + value = azurerm_kubernetes_cluster.aks-goodfood.kube_config[0].host sensitive = true } output "kube_config" { - value = azurerm_kubernetes_cluster.aks-goodfood.kube_config_raw + value = azurerm_kubernetes_cluster.aks-goodfood.kube_config_raw sensitive = true +} + +output "resource_group_name" { + value = data.azurerm_resource_group.rg-goodfood.name } \ No newline at end of file diff --git a/terraform/variables.tf b/terraform/variables.tf index 65fd7547..fae36979 100644 --- a/terraform/variables.tf +++ b/terraform/variables.tf @@ -13,4 +13,19 @@ variable "project_name" { type = string description = "The name of the project" default = "goodfood" +} + +variable "agent_count" { + default = 3 +} + +variable "aks_service_principal_app_id" { + default = "" +} + +variable "aks_service_principal_client_secret" { + default = "" +} +variable "ssh_public_key" { + default = "~/.ssh/id_rsa.pub" } \ No newline at end of file From 5d28bce189a66ca2a468624973db97de414e830e Mon Sep 17 00:00:00 2001 From: anatole Date: Wed, 19 Apr 2023 18:24:39 +0200 Subject: [PATCH 060/883] feat(infra): update general terraform and change the delivery image --- services/delivery/k8s/deployment.yml | 2 +- terraform/main.tf | 28 ++++++++++++++-------------- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/services/delivery/k8s/deployment.yml b/services/delivery/k8s/deployment.yml index 2bb885c3..04b97285 100644 --- a/services/delivery/k8s/deployment.yml +++ b/services/delivery/k8s/deployment.yml @@ -15,7 +15,7 @@ spec: spec: containers: - name: goodfood-delivery - image: 4natole/goodfood-delivery:1.0.0 + image: floriaaan/goodfood-delivery:1.0.0 imagePullPolicy: Always resources: limits: diff --git a/terraform/main.tf b/terraform/main.tf index 73c9e44f..e9e1db58 100644 --- a/terraform/main.tf +++ b/terraform/main.tf @@ -12,10 +12,15 @@ provider "azurerm" { features {} } +resource "azurerm_resource_group" "rg-goodfood" { + location = data.azurerm_resource_group.rg-goodfood.location + name = "rg-${var.project_name}${var.environnment_suffix}" +} + resource "azurerm_key_vault" "kv-goodfood" { name = "kv-goodfood-delivery" location = data.azurerm_resource_group.rg-goodfood.location - resource_group_name = data.azurerm_resource_group.rg-goodfood.name + resource_group_name = azurerm_resource_group.rg-goodfood.name tenant_id = data.azurerm_client_config.current.tenant_id sku_name = "standard" soft_delete_retention_days = 7 @@ -41,7 +46,7 @@ resource "azurerm_key_vault" "kv-goodfood" { resource "azurerm_service_plan" "sp-goodfood" { name = "sp-${var.project_name}${var.environnment_suffix}" - resource_group_name = data.azurerm_resource_group.rg-goodfood.name + resource_group_name = azurerm_resource_group.rg-goodfood.name location = var.location os_type = "Linux" sku_name = "S1" @@ -49,7 +54,7 @@ resource "azurerm_service_plan" "sp-goodfood" { resource "azurerm_linux_web_app" "web-goodfood" { name = "web-${var.project_name}${var.environnment_suffix}" - resource_group_name = data.azurerm_resource_group.rg-goodfood.name + resource_group_name = azurerm_resource_group.rg-goodfood.name location = var.location service_plan_id = azurerm_service_plan.sp-goodfood.id @@ -67,7 +72,7 @@ resource "azurerm_linux_web_app" "web-goodfood" { resource "azurerm_kubernetes_cluster" "aks-goodfood" { name = "aks-${var.project_name}${var.environnment_suffix}" location = var.location - resource_group_name = data.azurerm_resource_group.rg-goodfood.name + resource_group_name = azurerm_resource_group.rg-goodfood.name dns_prefix = "aks-${var.project_name}${var.environnment_suffix}" @@ -76,6 +81,11 @@ resource "azurerm_kubernetes_cluster" "aks-goodfood" { vm_size = "Standard_D2_v2" node_count = var.agent_count } + service_principal { + client_id = "${var.aks_service_principal_app_id}" + client_secret = "${var.aks_service_principal_client_secret}" + } + linux_profile { admin_username = "ubuntu" @@ -83,14 +93,4 @@ resource "azurerm_kubernetes_cluster" "aks-goodfood" { key_data = file(var.ssh_public_key) } } - - network_profile { - network_plugin = "kubenet" - load_balancer_sku = "standard" - } - - service_principal { - client_id = var.aks_service_principal_app_id - client_secret = var.aks_service_principal_client_secret - } } \ No newline at end of file From 5b442496bcc253a508b57bc2451f0d5421213a9a Mon Sep 17 00:00:00 2001 From: anatole Date: Wed, 19 Apr 2023 18:48:59 +0200 Subject: [PATCH 061/883] feat(github action): update delivery CICD --- .github/workflows/delivery.yml | 40 +++++++++++++++++++++++++++++++--- 1 file changed, 37 insertions(+), 3 deletions(-) diff --git a/.github/workflows/delivery.yml b/.github/workflows/delivery.yml index 36845dc3..8010eb30 100644 --- a/.github/workflows/delivery.yml +++ b/.github/workflows/delivery.yml @@ -2,9 +2,9 @@ name: Delivery Microservice CI/CD on: push: - branches: [delivery] + branches: [ delivery ] pull_request: - branches: [dev, main] + branches: [ dev, main ] jobs: build: @@ -52,7 +52,7 @@ jobs: publish: runs-on: ubuntu-latest - needs: [build, test] + needs: [ build, test ] steps: - name: Checkout code uses: actions/checkout@master @@ -68,3 +68,37 @@ jobs: file: ./services/delivery/Dockerfile push: true tags: floriaaan/goodfood-delivery:latest + + deploy: + runs-on: ubuntu-latest + needs: [ build, test, publish ] + steps: + - name: Checkout code + uses: actions/checkout@master + - name: Install kubectl + run: | + sudo snap install kubectl --classic + - name: Azure login + uses: azure/login@v1 + with: + creds: ${{ secrets.AZURE_CREDENTIALS }} + - name: Set up Terraform + uses: hashicorp/setup-terraform@v1 + with: + terraform_version: 1.0.5 + - name: Terraform init + run: | + cd ./terraform + terraform init + - name: Terraform apply + run: | + cd ./terraform + terraform apply -auto-approve + - name: Configure kubectl + run: | + az aks get-credentials --resource-group rg-goodfood-dev --name aks-goodfood-dev + - name: apply k8s manifests + run: | + cd ../services/delivery + kubectl create namespace goodfood + kubectlcrete kubectl apply -f ./k8s \ No newline at end of file From 53eae684a545b8285da322a9d7f2d0564131cd45 Mon Sep 17 00:00:00 2001 From: anatole Date: Thu, 20 Apr 2023 09:05:24 +0200 Subject: [PATCH 062/883] feat(github): update the CICD --- .github/workflows/delivery.yml | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/.github/workflows/delivery.yml b/.github/workflows/delivery.yml index 8010eb30..7ff1db68 100644 --- a/.github/workflows/delivery.yml +++ b/.github/workflows/delivery.yml @@ -81,24 +81,30 @@ jobs: - name: Azure login uses: azure/login@v1 with: - creds: ${{ secrets.AZURE_CREDENTIALS }} + client-id: ${{ secrets.AZURE_CLIENT_ID }} + tenant-id: ${{ secrets.AZURE_TENANT_ID }} + subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }} - name: Set up Terraform uses: hashicorp/setup-terraform@v1 with: terraform_version: 1.0.5 - name: Terraform init run: | - cd ./terraform + cd ./terraform && terraform init - name: Terraform apply run: | - cd ./terraform + cd ./terraform && + terraform apply -auto-approve + - name: Terraform apply delivery + run: | + cd ../services/delivery/terraform && terraform apply -auto-approve - name: Configure kubectl run: | az aks get-credentials --resource-group rg-goodfood-dev --name aks-goodfood-dev - name: apply k8s manifests run: | - cd ../services/delivery - kubectl create namespace goodfood + cd .. && + kubectl create namespace goodfood && kubectlcrete kubectl apply -f ./k8s \ No newline at end of file From 436b21cf639666590c8eedd0ff9502cbdf93855d Mon Sep 17 00:00:00 2001 From: anatole Date: Thu, 20 Apr 2023 09:12:50 +0200 Subject: [PATCH 063/883] feat(github): add permission --- .github/workflows/delivery.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/workflows/delivery.yml b/.github/workflows/delivery.yml index 7ff1db68..5ffed1b0 100644 --- a/.github/workflows/delivery.yml +++ b/.github/workflows/delivery.yml @@ -6,6 +6,9 @@ on: pull_request: branches: [ dev, main ] +permissions: + id-token: write + jobs: build: runs-on: ubuntu-latest @@ -78,7 +81,7 @@ jobs: - name: Install kubectl run: | sudo snap install kubectl --classic - - name: Azure login + - name: 'Az CLI login' uses: azure/login@v1 with: client-id: ${{ secrets.AZURE_CLIENT_ID }} From 0af89577f75dced760ef8feecad982331de877d1 Mon Sep 17 00:00:00 2001 From: anatole Date: Thu, 20 Apr 2023 09:15:51 +0200 Subject: [PATCH 064/883] feat(github): update permission --- .github/workflows/delivery.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/delivery.yml b/.github/workflows/delivery.yml index 5ffed1b0..593d7dd8 100644 --- a/.github/workflows/delivery.yml +++ b/.github/workflows/delivery.yml @@ -8,6 +8,7 @@ on: permissions: id-token: write + contents: read jobs: build: From b6d02b8683d6702b706e37b5b23053e086653e76 Mon Sep 17 00:00:00 2001 From: anatole Date: Thu, 20 Apr 2023 09:23:28 +0200 Subject: [PATCH 065/883] feat(github): add environment --- .github/workflows/delivery.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/delivery.yml b/.github/workflows/delivery.yml index 593d7dd8..122e5f85 100644 --- a/.github/workflows/delivery.yml +++ b/.github/workflows/delivery.yml @@ -75,6 +75,7 @@ jobs: deploy: runs-on: ubuntu-latest + environment: dev needs: [ build, test, publish ] steps: - name: Checkout code From 792c63c3913b2aefca902775ec3d35157622c11e Mon Sep 17 00:00:00 2001 From: anatole Date: Thu, 20 Apr 2023 10:26:34 +0200 Subject: [PATCH 066/883] feat(github): split the delivery deployment --- .github/workflows/delivery-deploy.yml | 51 +++++++++++++++++++++++++++ .github/workflows/delivery.yml | 43 +--------------------- 2 files changed, 52 insertions(+), 42 deletions(-) create mode 100644 .github/workflows/delivery-deploy.yml diff --git a/.github/workflows/delivery-deploy.yml b/.github/workflows/delivery-deploy.yml new file mode 100644 index 00000000..aca8b56a --- /dev/null +++ b/.github/workflows/delivery-deploy.yml @@ -0,0 +1,51 @@ +name: Delivery Microservice CI/CD + +on: + push: + branches: [ dev, main ] + +permissions: + id-token: write + contents: read + +jobs: + deploy: + runs-on: ubuntu-latest + environment: dev + needs: [ build, test, publish ] + steps: + - name: Checkout code + uses: actions/checkout@master + - name: Install kubectl + run: | + sudo snap install kubectl --classic + - name: 'Az CLI login' + uses: azure/login@v1 + with: + client-id: ${{ secrets.AZURE_CLIENT_ID }} + tenant-id: ${{ secrets.AZURE_TENANT_ID }} + subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }} + - name: Set up Terraform + uses: hashicorp/setup-terraform@v1 + with: + terraform_version: 1.0.5 + - name: Terraform init + run: | + cd ./terraform && + terraform init + - name: Terraform apply + run: | + cd ./terraform && + terraform apply -auto-approve + - name: Terraform apply delivery + run: | + cd ../services/delivery/terraform && + terraform apply -auto-approve + - name: Configure kubectl + run: | + az aks get-credentials --resource-group rg-goodfood-dev --name aks-goodfood-dev + - name: apply k8s manifests + run: | + cd .. && + kubectl create namespace goodfood && + kubectlcrete kubectl apply -f ./k8s \ No newline at end of file diff --git a/.github/workflows/delivery.yml b/.github/workflows/delivery.yml index 122e5f85..e467c33e 100644 --- a/.github/workflows/delivery.yml +++ b/.github/workflows/delivery.yml @@ -71,45 +71,4 @@ jobs: context: ./services/ file: ./services/delivery/Dockerfile push: true - tags: floriaaan/goodfood-delivery:latest - - deploy: - runs-on: ubuntu-latest - environment: dev - needs: [ build, test, publish ] - steps: - - name: Checkout code - uses: actions/checkout@master - - name: Install kubectl - run: | - sudo snap install kubectl --classic - - name: 'Az CLI login' - uses: azure/login@v1 - with: - client-id: ${{ secrets.AZURE_CLIENT_ID }} - tenant-id: ${{ secrets.AZURE_TENANT_ID }} - subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }} - - name: Set up Terraform - uses: hashicorp/setup-terraform@v1 - with: - terraform_version: 1.0.5 - - name: Terraform init - run: | - cd ./terraform && - terraform init - - name: Terraform apply - run: | - cd ./terraform && - terraform apply -auto-approve - - name: Terraform apply delivery - run: | - cd ../services/delivery/terraform && - terraform apply -auto-approve - - name: Configure kubectl - run: | - az aks get-credentials --resource-group rg-goodfood-dev --name aks-goodfood-dev - - name: apply k8s manifests - run: | - cd .. && - kubectl create namespace goodfood && - kubectlcrete kubectl apply -f ./k8s \ No newline at end of file + tags: floriaaan/goodfood-delivery:latest \ No newline at end of file From 9dcc482586e90a9565088c9dbdfb539df163517c Mon Sep 17 00:00:00 2001 From: anatole Date: Thu, 20 Apr 2023 10:46:45 +0200 Subject: [PATCH 067/883] refactor(github): split the delivery deployment --- .github/workflows/delivery-deploy.yml | 2 +- .github/workflows/delivery.yml | 4 ---- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/.github/workflows/delivery-deploy.yml b/.github/workflows/delivery-deploy.yml index aca8b56a..879d115e 100644 --- a/.github/workflows/delivery-deploy.yml +++ b/.github/workflows/delivery-deploy.yml @@ -1,4 +1,4 @@ -name: Delivery Microservice CI/CD +name: Deploy Delivery Microservice CI/CD on: push: diff --git a/.github/workflows/delivery.yml b/.github/workflows/delivery.yml index e467c33e..1b68e1b2 100644 --- a/.github/workflows/delivery.yml +++ b/.github/workflows/delivery.yml @@ -6,10 +6,6 @@ on: pull_request: branches: [ dev, main ] -permissions: - id-token: write - contents: read - jobs: build: runs-on: ubuntu-latest From be2058f501544feb8dab9cc54b7497e491fc960a Mon Sep 17 00:00:00 2001 From: anatole Date: Thu, 20 Apr 2023 16:09:07 +0200 Subject: [PATCH 068/883] feat(github): update general terraform --- terraform/env/dev.tfvars.example | 2 + terraform/main.tf | 84 ++++++++++++++++++++++---------- terraform/outputs.tf | 34 ------------- terraform/variables.tf | 6 +++ 4 files changed, 65 insertions(+), 61 deletions(-) diff --git a/terraform/env/dev.tfvars.example b/terraform/env/dev.tfvars.example index 4ac1f44d..1e7706c9 100644 --- a/terraform/env/dev.tfvars.example +++ b/terraform/env/dev.tfvars.example @@ -1 +1,3 @@ environnment_suffix = "-dev" +db_password = "password" +db_username = "user" diff --git a/terraform/main.tf b/terraform/main.tf index e9e1db58..a05e2e86 100644 --- a/terraform/main.tf +++ b/terraform/main.tf @@ -12,15 +12,10 @@ provider "azurerm" { features {} } -resource "azurerm_resource_group" "rg-goodfood" { - location = data.azurerm_resource_group.rg-goodfood.location - name = "rg-${var.project_name}${var.environnment_suffix}" -} - resource "azurerm_key_vault" "kv-goodfood" { name = "kv-goodfood-delivery" location = data.azurerm_resource_group.rg-goodfood.location - resource_group_name = azurerm_resource_group.rg-goodfood.name + resource_group_name = data.azurerm_resource_group.rg-goodfood.name tenant_id = data.azurerm_client_config.current.tenant_id sku_name = "standard" soft_delete_retention_days = 7 @@ -46,7 +41,7 @@ resource "azurerm_key_vault" "kv-goodfood" { resource "azurerm_service_plan" "sp-goodfood" { name = "sp-${var.project_name}${var.environnment_suffix}" - resource_group_name = azurerm_resource_group.rg-goodfood.name + resource_group_name = data.azurerm_resource_group.rg-goodfood.name location = var.location os_type = "Linux" sku_name = "S1" @@ -54,7 +49,7 @@ resource "azurerm_service_plan" "sp-goodfood" { resource "azurerm_linux_web_app" "web-goodfood" { name = "web-${var.project_name}${var.environnment_suffix}" - resource_group_name = azurerm_resource_group.rg-goodfood.name + resource_group_name = data.azurerm_resource_group.rg-goodfood.name location = var.location service_plan_id = azurerm_service_plan.sp-goodfood.id @@ -69,28 +64,63 @@ resource "azurerm_linux_web_app" "web-goodfood" { } } -resource "azurerm_kubernetes_cluster" "aks-goodfood" { - name = "aks-${var.project_name}${var.environnment_suffix}" - location = var.location - resource_group_name = azurerm_resource_group.rg-goodfood.name - dns_prefix = "aks-${var.project_name}${var.environnment_suffix}" +resource "azurerm_postgresql_server" "pgsql-goodfood" { + name = "postgres-server-${var.project_name}${var.environnment_suffix}" + location = data.azurerm_resource_group.rg-goodfood.location + resource_group_name = data.azurerm_resource_group.rg-goodfood.name + sku_name = "B_Gen5_2" - default_node_pool { - name = "agentpool" - vm_size = "Standard_D2_v2" - node_count = var.agent_count - } - service_principal { - client_id = "${var.aks_service_principal_app_id}" - client_secret = "${var.aks_service_principal_client_secret}" - } + storage_mb = 5120 + backup_retention_days = 7 + geo_redundant_backup_enabled = false + auto_grow_enabled = true + + administrator_login = var.db_username + administrator_login_password = var.db_password + version = "9.5" + ssl_enforcement_enabled = false + ssl_minimal_tls_version_enforced = "TLSEnforcementDisabled" +} + +resource "azurerm_postgresql_firewall_rule" "pg-fw-goodfood" { + name = "firewall-${var.project_name}${var.environnment_suffix}" + resource_group_name = data.azurerm_resource_group.rg-goodfood.name + server_name = azurerm_postgresql_server.pgsql-goodfood.name + start_ip_address = "0.0.0.0" + end_ip_address = "0.0.0.0" +} + +resource "azurerm_postgresql_database" "db-goodfood" { + name = "postgres-${var.project_name}${var.environnment_suffix}" + resource_group_name = data.azurerm_resource_group.rg-goodfood.name + server_name = azurerm_postgresql_server.pgsql-goodfood.name + charset = "UTF8" + collation = "English_United States.1252" +} + +resource "azurerm_container_group" "container_group" { + name = "container-${var.project_name}${var.environnment_suffix}" + location = data.azurerm_resource_group.rg-goodfood.location + resource_group_name = data.azurerm_resource_group.rg-goodfood.name + ip_address_type = "Public" + dns_name_label = "container-${var.project_name}${var.environnment_suffix}" + os_type = "Linux" + + container { + name = "${var.project_name}${var.environnment_suffix}" + image = "floriaaan/goodfood-delivery:latest" + cpu = "0.5" + memory = "1.5" - linux_profile { - admin_username = "ubuntu" + ports { + port = 50008 + protocol = "TCP" + } - ssh_key { - key_data = file(var.ssh_public_key) + environment_variables = { + "DATABASE_URL" = "postgres://${var.db_username}@${azurerm_postgresql_server.pgsql-goodfood.name}:${var.db_password}@${azurerm_postgresql_server.pgsql-goodfood.fqdn}:5432/${azurerm_postgresql_database.db-goodfood.name}" + "PORT" = 50008 } } -} \ No newline at end of file +} diff --git a/terraform/outputs.tf b/terraform/outputs.tf index f5b3c6b6..a7a091ce 100644 --- a/terraform/outputs.tf +++ b/terraform/outputs.tf @@ -4,40 +4,6 @@ output "main-rg-name" { output "main-rg-id" { value = data.azurerm_resource_group.rg-goodfood.id } -output "client_certificate" { - value = azurerm_kubernetes_cluster.aks-goodfood.kube_config[0].client_certificate - sensitive = true -} - -output "client_key" { - value = azurerm_kubernetes_cluster.aks-goodfood.kube_config[0].client_key - sensitive = true -} - -output "cluster_ca_certificate" { - value = azurerm_kubernetes_cluster.aks-goodfood.kube_config[0].cluster_ca_certificate - sensitive = true -} - -output "cluster_password" { - value = azurerm_kubernetes_cluster.aks-goodfood.kube_config[0].password - sensitive = true -} - -output "cluster_username" { - value = azurerm_kubernetes_cluster.aks-goodfood.kube_config[0].username - sensitive = true -} - -output "host" { - value = azurerm_kubernetes_cluster.aks-goodfood.kube_config[0].host - sensitive = true -} - -output "kube_config" { - value = azurerm_kubernetes_cluster.aks-goodfood.kube_config_raw - sensitive = true -} output "resource_group_name" { value = data.azurerm_resource_group.rg-goodfood.name diff --git a/terraform/variables.tf b/terraform/variables.tf index fae36979..0bb2c48d 100644 --- a/terraform/variables.tf +++ b/terraform/variables.tf @@ -28,4 +28,10 @@ variable "aks_service_principal_client_secret" { } variable "ssh_public_key" { default = "~/.ssh/id_rsa.pub" +} +variable "db_password" { + type = string +} +variable "db_username" { + type = string } \ No newline at end of file From 910ffa85e1a889485937b689afdf2f196aa1f30f Mon Sep 17 00:00:00 2001 From: Florian LEROUX <10078837+floriaaan@users.noreply.github.com> Date: Mon, 1 May 2023 23:35:32 +0200 Subject: [PATCH 069/883] feat(tests): add unit tests --- services/reporting/Tests/Tests.csproj | 29 +++++++++++++++++++++++++ services/reporting/Tests/UnitTest1.cs | 12 +++++++++++ services/reporting/Tests/Usings.cs | 1 + services/reporting/reporting.csproj | 10 +++++++++ services/reporting/reporting.sln | 31 +++++++++++++++++++++++++++ 5 files changed, 83 insertions(+) create mode 100644 services/reporting/Tests/Tests.csproj create mode 100644 services/reporting/Tests/UnitTest1.cs create mode 100644 services/reporting/Tests/Usings.cs create mode 100644 services/reporting/reporting.sln diff --git a/services/reporting/Tests/Tests.csproj b/services/reporting/Tests/Tests.csproj new file mode 100644 index 00000000..58bd10b1 --- /dev/null +++ b/services/reporting/Tests/Tests.csproj @@ -0,0 +1,29 @@ + + + + net8.0 + enable + enable + + false + true + + + + + + + runtime; build; native; contentfiles; analyzers; buildtransitive + all + + + runtime; build; native; contentfiles; analyzers; buildtransitive + all + + + + + + + + diff --git a/services/reporting/Tests/UnitTest1.cs b/services/reporting/Tests/UnitTest1.cs new file mode 100644 index 00000000..c1425c4e --- /dev/null +++ b/services/reporting/Tests/UnitTest1.cs @@ -0,0 +1,12 @@ +namespace Tests; + +public class UnitTest1 +{ + [Fact] + public void Test1() + { + bool result = 1 + 1 == 2; + + Assert.True(result, "1 + 1 should be 2"); + } +} \ No newline at end of file diff --git a/services/reporting/Tests/Usings.cs b/services/reporting/Tests/Usings.cs new file mode 100644 index 00000000..8c927eb7 --- /dev/null +++ b/services/reporting/Tests/Usings.cs @@ -0,0 +1 @@ +global using Xunit; \ No newline at end of file diff --git a/services/reporting/reporting.csproj b/services/reporting/reporting.csproj index c0ae43b5..9ed8b5ea 100644 --- a/services/reporting/reporting.csproj +++ b/services/reporting/reporting.csproj @@ -5,15 +5,25 @@ enable enable true + + false + false + + + + + + + diff --git a/services/reporting/reporting.sln b/services/reporting/reporting.sln new file mode 100644 index 00000000..9add4a78 --- /dev/null +++ b/services/reporting/reporting.sln @@ -0,0 +1,31 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 16 +VisualStudioVersion = 25.0.1704.4 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "reporting", "reporting.csproj", "{C9640D24-9AA0-4147-93C3-5A3CB4147057}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Tests", "Tests\Tests.csproj", "{C062ECC9-4B36-43C3-A03C-4D3507930A6D}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {C9640D24-9AA0-4147-93C3-5A3CB4147057}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C9640D24-9AA0-4147-93C3-5A3CB4147057}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C9640D24-9AA0-4147-93C3-5A3CB4147057}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C9640D24-9AA0-4147-93C3-5A3CB4147057}.Release|Any CPU.Build.0 = Release|Any CPU + {C062ECC9-4B36-43C3-A03C-4D3507930A6D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C062ECC9-4B36-43C3-A03C-4D3507930A6D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C062ECC9-4B36-43C3-A03C-4D3507930A6D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C062ECC9-4B36-43C3-A03C-4D3507930A6D}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {3EF24C32-CC61-4374-93CE-E6E9B554B32D} + EndGlobalSection +EndGlobal From c3dd6bf730d6079f6f46973e1d202324d0dc5e4b Mon Sep 17 00:00:00 2001 From: Florian LEROUX <10078837+floriaaan@users.noreply.github.com> Date: Mon, 1 May 2023 23:37:46 +0200 Subject: [PATCH 070/883] feat(grpc): add grpc implementation of metric.proto + dep. injection --- services/proto/metric.proto | 10 ++- services/reporting/.gitignore | 1 + services/reporting/Database/Context.cs | 19 +++++ services/reporting/Libraries/RabbitMQ.cs | 77 +++++++++++++++++++ .../20230501130538_InitialCreate.Designer.cs | 64 +++++++++++++++ .../20230501130538_InitialCreate.cs | 46 +++++++++++ .../ReportingContextModelSnapshot.cs | 61 +++++++++++++++ services/reporting/Models/Metric.cs | 21 +++++ services/reporting/Program.cs | 33 ++++---- .../reporting/Properties/launchSettings.json | 42 +++++----- services/reporting/README.md | 21 ++--- .../reporting/Services/ReportingService.cs | 52 +++++++++++++ services/reporting/Startup.cs | 50 ++++++++++++ services/reporting/appsettings.json | 3 + 14 files changed, 449 insertions(+), 51 deletions(-) create mode 100644 services/reporting/Database/Context.cs create mode 100644 services/reporting/Libraries/RabbitMQ.cs create mode 100644 services/reporting/Migrations/20230501130538_InitialCreate.Designer.cs create mode 100644 services/reporting/Migrations/20230501130538_InitialCreate.cs create mode 100644 services/reporting/Migrations/ReportingContextModelSnapshot.cs create mode 100644 services/reporting/Models/Metric.cs create mode 100644 services/reporting/Services/ReportingService.cs create mode 100644 services/reporting/Startup.cs diff --git a/services/proto/metric.proto b/services/proto/metric.proto index d3c23161..3638da4a 100644 --- a/services/proto/metric.proto +++ b/services/proto/metric.proto @@ -2,6 +2,8 @@ syntax = "proto3"; import "google/protobuf/timestamp.proto"; +option csharp_namespace = "reporting"; + package com.goodfood.reporting; message Metric { @@ -15,13 +17,19 @@ message Metric { service ReportingService { rpc GetMetric (GetMetricRequest) returns (Metric) {} - rpc PushMetric (Metric) returns (PushMetricResponse) {} + rpc PushMetric (PushMetricRequest) returns (PushMetricResponse) {} } message GetMetricRequest { string key = 1; } +message PushMetricRequest { + string restaurant_id = 1; + string code = 2; + string value = 3; +} + message PushMetricResponse { string key = 1; } diff --git a/services/reporting/.gitignore b/services/reporting/.gitignore index bc4918e1..f73bd38f 100644 --- a/services/reporting/.gitignore +++ b/services/reporting/.gitignore @@ -35,6 +35,7 @@ bld/ [Oo]bj/ [Ll]og/ [Ll]ogs/ +out/ # Visual Studio 2015/2017 cache/options directory .vs/ diff --git a/services/reporting/Database/Context.cs b/services/reporting/Database/Context.cs new file mode 100644 index 00000000..df64f1f5 --- /dev/null +++ b/services/reporting/Database/Context.cs @@ -0,0 +1,19 @@ +using Microsoft.EntityFrameworkCore; +using reporting.Models; + +public class ReportingContext : DbContext +{ + public DbSet Metrics { get; set; } + + public ReportingContext() + { + Metrics = Set(); + } + + + protected override void OnConfiguring(DbContextOptionsBuilder options) + { + // TODO: Move to config + options.UseNpgsql("Host=localhost;Database=postgres;Username=postgres;Password=password"); + } +} \ No newline at end of file diff --git a/services/reporting/Libraries/RabbitMQ.cs b/services/reporting/Libraries/RabbitMQ.cs new file mode 100644 index 00000000..d9701382 --- /dev/null +++ b/services/reporting/Libraries/RabbitMQ.cs @@ -0,0 +1,77 @@ +using System.Text; +using RabbitMQ.Client; +using RabbitMQ.Client.Events; + +namespace reporting.Libraries.RabbitMQ; + +public class RabbitMQClient +{ + private readonly ConnectionFactory? _factory; + private readonly IConnection? _connection; + private readonly IModel? _channel; + private readonly string _queueName; + + public RabbitMQClient(string queueName) + { + _queueName = queueName; + try + { + // TODO: Move to config + _factory = new ConnectionFactory { HostName = "localhost" }; + _connection = _factory.CreateConnection(); + _channel = _connection.CreateModel(); + } + catch (Exception ex) + { + Console.WriteLine($"Error establishing RabbitMQ connection: {ex.Message}"); + } + } + + public void Publish(string message) + { + if (_channel == null) return; + _channel.QueueDeclare(queue: _queueName, + durable: false, + exclusive: false, + autoDelete: false, + arguments: null); + + var body = Encoding.UTF8.GetBytes(message); + + _channel.BasicPublish(exchange: "", + routingKey: _queueName, + basicProperties: null, + body: body); + } + + public void Subscribe(Action callback) + { + if (_channel == null) return; + _channel.QueueDeclare(queue: _queueName, + durable: false, + exclusive: false, + autoDelete: false, + arguments: null); + + var consumer = new EventingBasicConsumer(_channel); + + consumer.Received += (model, ea) => + { + var body = ea.Body.ToArray(); + var message = Encoding.UTF8.GetString(body); + Console.WriteLine($"Received {message}"); + callback(message); + }; + + _channel.BasicConsume(queue: _queueName, + autoAck: true, + consumer: consumer); + } + + public void Dispose() + { + _channel?.Close(); + _connection?.Close(); + } + +} \ No newline at end of file diff --git a/services/reporting/Migrations/20230501130538_InitialCreate.Designer.cs b/services/reporting/Migrations/20230501130538_InitialCreate.Designer.cs new file mode 100644 index 00000000..b4e67834 --- /dev/null +++ b/services/reporting/Migrations/20230501130538_InitialCreate.Designer.cs @@ -0,0 +1,64 @@ +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; + +#nullable disable + +namespace reporting.Migrations +{ + [DbContext(typeof(ReportingContext))] + [Migration("20230501130538_InitialCreate")] + partial class InitialCreate + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "7.0.5") + .HasAnnotation("Relational:MaxIdentifierLength", 63); + + NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); + + modelBuilder.Entity("reporting.Models.Metric", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Code") + .IsRequired() + .HasColumnType("text"); + + b.Property("Date") + .HasColumnType("timestamp with time zone"); + + b.Property("Key") + .IsRequired() + .HasColumnType("text"); + + b.Property("RestaurantId") + .IsRequired() + .HasColumnType("text"); + + b.Property("Value") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("Id"); + + b.HasIndex("Key") + .IsUnique(); + + b.ToTable("Metrics"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/services/reporting/Migrations/20230501130538_InitialCreate.cs b/services/reporting/Migrations/20230501130538_InitialCreate.cs new file mode 100644 index 00000000..40853b11 --- /dev/null +++ b/services/reporting/Migrations/20230501130538_InitialCreate.cs @@ -0,0 +1,46 @@ +using System; +using Microsoft.EntityFrameworkCore.Migrations; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; + +#nullable disable + +namespace reporting.Migrations +{ + /// + public partial class InitialCreate : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.CreateTable( + name: "Metrics", + columns: table => new + { + Id = table.Column(type: "integer", nullable: false) + .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), + Key = table.Column(type: "text", nullable: false), + RestaurantId = table.Column(type: "text", nullable: false), + Date = table.Column(type: "timestamp with time zone", nullable: false), + Code = table.Column(type: "text", nullable: false), + Value = table.Column(type: "text", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_Metrics", x => x.Id); + }); + + migrationBuilder.CreateIndex( + name: "IX_Metrics_Key", + table: "Metrics", + column: "Key", + unique: true); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropTable( + name: "Metrics"); + } + } +} diff --git a/services/reporting/Migrations/ReportingContextModelSnapshot.cs b/services/reporting/Migrations/ReportingContextModelSnapshot.cs new file mode 100644 index 00000000..7472ef36 --- /dev/null +++ b/services/reporting/Migrations/ReportingContextModelSnapshot.cs @@ -0,0 +1,61 @@ +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; + +#nullable disable + +namespace reporting.Migrations +{ + [DbContext(typeof(ReportingContext))] + partial class ReportingContextModelSnapshot : ModelSnapshot + { + protected override void BuildModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "7.0.5") + .HasAnnotation("Relational:MaxIdentifierLength", 63); + + NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); + + modelBuilder.Entity("reporting.Models.Metric", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Code") + .IsRequired() + .HasColumnType("text"); + + b.Property("Date") + .HasColumnType("timestamp with time zone"); + + b.Property("Key") + .IsRequired() + .HasColumnType("text"); + + b.Property("RestaurantId") + .IsRequired() + .HasColumnType("text"); + + b.Property("Value") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("Id"); + + b.HasIndex("Key") + .IsUnique(); + + b.ToTable("Metrics"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/services/reporting/Models/Metric.cs b/services/reporting/Models/Metric.cs new file mode 100644 index 00000000..e338420f --- /dev/null +++ b/services/reporting/Models/Metric.cs @@ -0,0 +1,21 @@ +using Microsoft.EntityFrameworkCore; + +namespace reporting.Models +{ + + // TODO: upsert on push, instead of throwing exception + [Index(nameof(Metric.Key), IsUnique = true)] + public class Metric + { + public int Id { get; set; } + + // Key is a combination of RestaurantId, Date and Code (RestaurantId:Date:Code) and isUnique + public string Key { get; set; } = null!; + public string RestaurantId { get; set; } = null!; + public DateTime Date { get; set; } + public string Code { get; set; } = null!; + public string Value { get; set; } = null!; + + } +} + diff --git a/services/reporting/Program.cs b/services/reporting/Program.cs index 50291b69..1e808081 100644 --- a/services/reporting/Program.cs +++ b/services/reporting/Program.cs @@ -1,23 +1,20 @@ -using reporting.Services; - -var builder = WebApplication.CreateBuilder(args); - -// Add services to the container. -builder.Services.AddGrpc(); -builder.Services.AddGrpcReflection(); +namespace goodfood_reporting +{ + public class Program + { + public static void Main(string[] args) + { + CreateHostBuilder(args).Build().Run(); + } -var app = builder.Build(); + public static IHostBuilder CreateHostBuilder(string[] args) => + Host.CreateDefaultBuilder(args) + .ConfigureWebHostDefaults(webBuilder => + { + webBuilder.UseStartup(); + }); + } -IWebHostEnvironment env = app.Environment; -if (env.IsDevelopment()) -{ - app.MapGrpcReflectionService(); } - -// Configure the HTTP request pipeline. -app.MapGrpcService(); -app.MapGet("/", () => "Communication with gRPC endpoints must be made through a gRPC client. To learn how to create a client, visit: https://go.microsoft.com/fwlink/?linkid=2086909"); - -app.Run(); diff --git a/services/reporting/Properties/launchSettings.json b/services/reporting/Properties/launchSettings.json index 68e15360..0fb2f282 100644 --- a/services/reporting/Properties/launchSettings.json +++ b/services/reporting/Properties/launchSettings.json @@ -1,23 +1,19 @@ -{ - "$schema": "http://json.schemastore.org/launchsettings.json", - "profiles": { - "http": { - "commandName": "Project", - "dotnetRunMessages": true, - "launchBrowser": false, - "applicationUrl": "https://localhost:50020", - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - } - }, - "https": { - "commandName": "Project", - "dotnetRunMessages": true, - "launchBrowser": false, - "applicationUrl": "https://localhost:50020", - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - } - } - } -} +{ + "$schema": "http://json.schemastore.org/launchsettings.json", + "profiles": { + "http": { + "commandName": "Project", + "applicationUrl": "https://localhost:50020", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "https": { + "commandName": "Project", + "applicationUrl": "https://localhost:50020", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + } + } +} \ No newline at end of file diff --git a/services/reporting/README.md b/services/reporting/README.md index 7560e084..cbe3e8e0 100644 --- a/services/reporting/README.md +++ b/services/reporting/README.md @@ -1,13 +1,13 @@ # Reporting Microservice -| Informations | -| --------------------------- | -| **Port:** 50020 | -| **Developer:** @floriaaan | -| **Status:** In progress | -| **Last update:** 2023-04-16 | -| **Language:** C# | -| **Dependencies:** ? | +| Informations | +| ------------------------------------------------------------- | +| **Port:** 50020 | +| **Developer:** @floriaaan | +| **Status:** In progress | +| **Last update:** 2023-05-01 | +| **Language:** C# (dotnet 8) | +| **Dependencies:** EF (entity framework), gRPC, RabbitMQClient | ## gRPC Methods @@ -17,13 +17,16 @@ TBW To run this microservice, you will need to have the following installed on your system: -- dotnet (dev. with dotnet version 6.0.114) +- dotnet (dev. with dotnet version 8.0.100-preview.3.23178.7) - Postgres (v15.2 or higher) (dev. with docker image `postgres:15.2`) +- RabbitMQ (v3.9.7 or higher) (dev. with docker image `rabbitmq:3.9.7-management`) You can use the following tools to help you with the setup: - You can use docker to run your Postgres database using: - `docker run --name postgres -p 5432:5432 -e POSTGRES_PASSWORD=password -d postgres` +- You can use docker to run your RabbitMQ server using: + - `docker run --name rabbitmq -p 5672:5672 -p 15672:15672 -d rabbitmq:3.9.7-management` ## Getting started diff --git a/services/reporting/Services/ReportingService.cs b/services/reporting/Services/ReportingService.cs new file mode 100644 index 00000000..7107e2bc --- /dev/null +++ b/services/reporting/Services/ReportingService.cs @@ -0,0 +1,52 @@ +using Grpc.Core; + +namespace reporting.Services; + + +public class ReportingService : reporting.ReportingService.ReportingServiceBase +{ + private readonly ILogger _logger; + private readonly ReportingContext _db; + public ReportingService(ILogger logger) + { + _logger = logger; + _db = new ReportingContext(); + + } + + public override Task GetMetric(GetMetricRequest request, ServerCallContext context) + { + Models.Metric? metric = _db.Metrics.FirstOrDefault(m => m.Key == request.Key); + if (metric == null) + throw new RpcException(new Status(StatusCode.NotFound, "Metric not found")); + + return Task.FromResult(new Metric + { + Id = metric.Id.ToString(), + Key = metric.Key, + RestaurantId = metric.RestaurantId, + Date = Google.Protobuf.WellKnownTypes.Timestamp.FromDateTime(metric.Date), + Code = metric.Code, + Value = metric.Value + }); + } + + public override Task PushMetric(PushMetricRequest request, ServerCallContext context) + { + + String date = DateTime.Now.Date.ToString("yyyy-MM-dd"); + Models.Metric metric = new Models.Metric + { + Key = request.RestaurantId + ":" + date + ":" + request.Code, + RestaurantId = request.RestaurantId, + Date = Google.Protobuf.WellKnownTypes.Timestamp.FromDateTime(DateTime.UtcNow).ToDateTime(), + Code = request.Code, + Value = request.Value + }; + + _db.Metrics.Add(metric); + _db.SaveChanges(); + + return Task.FromResult(new PushMetricResponse { Key = metric.Key }); + } +} diff --git a/services/reporting/Startup.cs b/services/reporting/Startup.cs new file mode 100644 index 00000000..4f55bf15 --- /dev/null +++ b/services/reporting/Startup.cs @@ -0,0 +1,50 @@ +using reporting.Services; +using reporting.Libraries.RabbitMQ; +using System.Net; + +public class Startup +{ + + private RabbitMQClient _logClient = new RabbitMQClient("log"); + + public void ConfigureServices(IServiceCollection services) + { + services.AddGrpc(); + services.AddGrpcReflection(); + services.AddScoped(); + services.AddScoped(); + } + + public void Configure(IApplicationBuilder app, IWebHostEnvironment env) + { + if (env.IsDevelopment()) app.UseDeveloperExceptionPage(); + + + app.UseRouting(); + + app.UseEndpoints(endpoints => + { + String ip = Dns.GetHostEntry(Dns.GetHostName()).AddressList[0].ToString(); + + Console.WriteLine("---- \x1b[32mgood\x1b[0m\x1b[33mfood\x1b[0m Reporting Service ----"); + Console.WriteLine($"started on: \x1b[1m{ip}\x1b[0m \x1b[✓\x1b[0m"); + + + /** + * TODO: add AMQP listeners + * - implement > publish to `log` queue every request + * - implement > subscribe to every metric code queue (todo: define queue names) + * TODO: add health check + */ + + + endpoints.MapGrpcService(); + endpoints.MapGrpcService(); + endpoints.MapGrpcReflectionService(); + endpoints.MapFallback("/", async context => + { + await context.Response.WriteAsync("Communication with gRPC endpoints must be made through a gRPC client."); + }); + }); + } +} \ No newline at end of file diff --git a/services/reporting/appsettings.json b/services/reporting/appsettings.json index e559d3aa..1de5e152 100644 --- a/services/reporting/appsettings.json +++ b/services/reporting/appsettings.json @@ -10,5 +10,8 @@ "EndpointDefaults": { "Protocols": "Http2" } + }, + "ConnectionStrings": { + "RabbitMQ": "amqp://guest:guest@localhost:5672/" } } From 700fc6636ef2f82f18f38f6a3f284d42f53bee45 Mon Sep 17 00:00:00 2001 From: Florian LEROUX <10078837+floriaaan@users.noreply.github.com> Date: Mon, 1 May 2023 23:37:58 +0200 Subject: [PATCH 071/883] feat(docker): add docker files --- services/reporting/Dockerfile | 22 ++++++++++++++++++++++ services/reporting/docker-entrypoint.sh | 9 +++++++++ 2 files changed, 31 insertions(+) create mode 100644 services/reporting/Dockerfile create mode 100644 services/reporting/docker-entrypoint.sh diff --git a/services/reporting/Dockerfile b/services/reporting/Dockerfile new file mode 100644 index 00000000..df2addd5 --- /dev/null +++ b/services/reporting/Dockerfile @@ -0,0 +1,22 @@ +FROM mcr.microsoft.com/dotnet/sdk:8.0.100-preview5-focal AS build + +WORKDIR /app + +# Copy and restore dependencies +COPY YourAppName.csproj . +RUN dotnet restore + +# Copy the rest of the application files and build +COPY . . +RUN dotnet build -c Release -o out + +# Install EF tools and add to path +RUN dotnet tool install --global dotnet-ef +ENV PATH="${PATH}:/root/.dotnet/tools" + +# Add EF migrations +RUN dotnet ef migrations add InitialMigration + +# Expose port and specify startup command +EXPOSE 50020 +CMD ["bash", "/app/docker-entrypoint.sh"] diff --git a/services/reporting/docker-entrypoint.sh b/services/reporting/docker-entrypoint.sh new file mode 100644 index 00000000..e43f82c4 --- /dev/null +++ b/services/reporting/docker-entrypoint.sh @@ -0,0 +1,9 @@ +#!/bin/bash + +set -e + +# Apply EF migrations to the database +dotnet ef database update + +# Start the application +exec dotnet /app/out/reporting.dll From d82425e4cb5c7c4b3b355b1f8b810f13803078cd Mon Sep 17 00:00:00 2001 From: Florian LEROUX <10078837+floriaaan@users.noreply.github.com> Date: Mon, 1 May 2023 23:43:32 +0200 Subject: [PATCH 072/883] feat(ci): attempt to add ci workflow --- .github/workflows/reporting.yml | 66 +++++++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 .github/workflows/reporting.yml diff --git a/.github/workflows/reporting.yml b/.github/workflows/reporting.yml new file mode 100644 index 00000000..b816d5b1 --- /dev/null +++ b/.github/workflows/reporting.yml @@ -0,0 +1,66 @@ +name: Reporting Microservice CI/CD + +on: + push: + branches: [reporting] + pull_request: + branches: [dev, main] + +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - name: Setup dotnet + uses: actions/setup-dotnet@v3 + with: + dotnet-version: "8.0.x" + - name: Install dependencies + run: | + cd ./services/reporting + dotnet restore + - name: Build + run: | + cd ./services/reporting + dotnet build + + test: + runs-on: ubuntu-latest + needs: build + steps: + - uses: actions/checkout@v3 + - name: Setup dotnet + uses: actions/setup-dotnet@v3 + with: + dotnet-version: "8.0.x" + - name: Install dependencies + run: | + cd ./services/reporting + dotnet restore + - name: Build + run: | + cd ./services/reporting + dotnet build + - name: Test with the dotnet CLI + run: | + cd ./services/reporting + dotnet test + + publish: + runs-on: ubuntu-latest + needs: [build, test] + steps: + - name: Checkout code + uses: actions/checkout@master + - name: Login to Docker Hub + uses: docker/login-action@v2 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + - name: Build and push + uses: docker/build-push-action@v4 + with: + context: ./services/ + file: ./services/reporting/Dockerfile + push: true + tags: floriaaan/goodfood-reporting:latest From a44667dc51c240fa92914420e067da620383a98c Mon Sep 17 00:00:00 2001 From: Florian LEROUX <10078837+floriaaan@users.noreply.github.com> Date: Sat, 6 May 2023 10:50:49 +0200 Subject: [PATCH 073/883] fix(ci): test only Tests/ folder --- .github/workflows/reporting.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/reporting.yml b/.github/workflows/reporting.yml index b816d5b1..6d96abc1 100644 --- a/.github/workflows/reporting.yml +++ b/.github/workflows/reporting.yml @@ -44,7 +44,7 @@ jobs: - name: Test with the dotnet CLI run: | cd ./services/reporting - dotnet test + dotnet test Tests/ publish: runs-on: ubuntu-latest From 48fe46a9f115c5356a6e6281a723e3b1a6d98813 Mon Sep 17 00:00:00 2001 From: Florian LEROUX <10078837+floriaaan@users.noreply.github.com> Date: Sat, 6 May 2023 11:19:16 +0200 Subject: [PATCH 074/883] fix(ci): change image for builder --- services/reporting/Dockerfile | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/services/reporting/Dockerfile b/services/reporting/Dockerfile index df2addd5..cd5b1d74 100644 --- a/services/reporting/Dockerfile +++ b/services/reporting/Dockerfile @@ -1,9 +1,9 @@ -FROM mcr.microsoft.com/dotnet/sdk:8.0.100-preview5-focal AS build +FROM mcr.microsoft.com/dotnet/nightly/sdk:latest AS build WORKDIR /app # Copy and restore dependencies -COPY YourAppName.csproj . +COPY reporting.csproj . RUN dotnet restore # Copy the rest of the application files and build @@ -14,8 +14,8 @@ RUN dotnet build -c Release -o out RUN dotnet tool install --global dotnet-ef ENV PATH="${PATH}:/root/.dotnet/tools" -# Add EF migrations -RUN dotnet ef migrations add InitialMigration +# # Add EF migrations +# RUN dotnet ef migrations add InitialMigration # Expose port and specify startup command EXPOSE 50020 From 0febeb1123d0c118b358ea60407abed8dda4073d Mon Sep 17 00:00:00 2001 From: Florian LEROUX <10078837+floriaaan@users.noreply.github.com> Date: Sat, 6 May 2023 12:48:35 +0200 Subject: [PATCH 075/883] fix(dockerfile): fix files path --- services/reporting/Dockerfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/services/reporting/Dockerfile b/services/reporting/Dockerfile index cd5b1d74..332fa15a 100644 --- a/services/reporting/Dockerfile +++ b/services/reporting/Dockerfile @@ -3,11 +3,11 @@ FROM mcr.microsoft.com/dotnet/nightly/sdk:latest AS build WORKDIR /app # Copy and restore dependencies -COPY reporting.csproj . +COPY ./reporting/reporting.csproj . RUN dotnet restore # Copy the rest of the application files and build -COPY . . +COPY ./reporting . RUN dotnet build -c Release -o out # Install EF tools and add to path From 8a8f5c22268f47a454150083aef8ee1d1a91b4b1 Mon Sep 17 00:00:00 2001 From: Florian LEROUX <10078837+floriaaan@users.noreply.github.com> Date: Sat, 6 May 2023 13:23:57 +0200 Subject: [PATCH 076/883] fix(docker): add protos to build context --- services/reporting/Dockerfile | 2 ++ 1 file changed, 2 insertions(+) diff --git a/services/reporting/Dockerfile b/services/reporting/Dockerfile index 332fa15a..20688781 100644 --- a/services/reporting/Dockerfile +++ b/services/reporting/Dockerfile @@ -8,6 +8,8 @@ RUN dotnet restore # Copy the rest of the application files and build COPY ./reporting . +COPY ./proto ./Protos + RUN dotnet build -c Release -o out # Install EF tools and add to path From dd8cbc858203e686131fabe4314b222018d240a7 Mon Sep 17 00:00:00 2001 From: Florian LEROUX <10078837+floriaaan@users.noreply.github.com> Date: Sat, 6 May 2023 16:14:07 +0200 Subject: [PATCH 077/883] fix(ci): remove arm64 from builder image --- .gitignore | 7 ++++++- services/log/Dockerfile | 2 +- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index a452a6a6..a773bcb7 100644 --- a/.gitignore +++ b/.gitignore @@ -59,4 +59,9 @@ terraform.rc /**/node_modules /**/dist /**/build -/**/.env \ No newline at end of file +/**/.env + +# dotnet build files +/**/obj +/**/bin +/**/.vs \ No newline at end of file diff --git a/services/log/Dockerfile b/services/log/Dockerfile index bbe3aa1e..85e4bbfb 100644 --- a/services/log/Dockerfile +++ b/services/log/Dockerfile @@ -1,4 +1,4 @@ -FROM arm64v8/golang:1.20-alpine as builder +FROM golang:1.20-alpine as builder # Set destination for COPY WORKDIR /app From aca102f1c51c980fae9bc4b70a7db1398a922d9a Mon Sep 17 00:00:00 2001 From: Florian LEROUX <10078837+floriaaan@users.noreply.github.com> Date: Tue, 9 May 2023 09:06:31 +0200 Subject: [PATCH 078/883] feat(services): split rabbitmq and grpc services --- services/proto/metric.proto | 20 +++++ services/reporting/Models/Metric.cs | 60 +++++++++++++++ services/reporting/Models/Restaurant.cs | 17 +++++ .../Services/{ => GRPC}/GreeterService.cs | 3 +- .../Services/GRPC/ReportingService.cs | 72 ++++++++++++++++++ .../Services/RabbitMQ/ReportingService.cs | 36 +++++++++ .../reporting/Services/ReportingService.cs | 52 ------------- services/reporting/Startup.cs | 2 +- services/reporting/Tests/MetricModel_Tests.cs | 75 +++++++++++++++++++ .../Tests/ReportingServices_Tests.cs | 30 ++++++++ services/reporting/Tests/UnitTest1.cs | 12 --- 11 files changed, 312 insertions(+), 67 deletions(-) create mode 100644 services/reporting/Models/Restaurant.cs rename services/reporting/Services/{ => GRPC}/GreeterService.cs (86%) create mode 100644 services/reporting/Services/GRPC/ReportingService.cs create mode 100644 services/reporting/Services/RabbitMQ/ReportingService.cs delete mode 100644 services/reporting/Services/ReportingService.cs create mode 100644 services/reporting/Tests/MetricModel_Tests.cs create mode 100644 services/reporting/Tests/ReportingServices_Tests.cs delete mode 100644 services/reporting/Tests/UnitTest1.cs diff --git a/services/proto/metric.proto b/services/proto/metric.proto index 3638da4a..8e933ce6 100644 --- a/services/proto/metric.proto +++ b/services/proto/metric.proto @@ -17,6 +17,9 @@ message Metric { service ReportingService { rpc GetMetric (GetMetricRequest) returns (Metric) {} + rpc GetMetricsByRestaurant(GetMetricsByRestaurantRequest) returns (GetMetricsByRestaurantResponse) {} + rpc GetMetricsByRestaurantAndDate (GetMetricsByRestaurantAndDateRequest) returns (GetMetricsByRestaurantAndDateResponse) {} + rpc PushMetric (PushMetricRequest) returns (PushMetricResponse) {} } @@ -24,6 +27,23 @@ message GetMetricRequest { string key = 1; } +message GetMetricsByRestaurantRequest { + string restaurant_id = 1; +} + +message GetMetricsByRestaurantResponse { + repeated Metric metrics = 1; +} + +message GetMetricsByRestaurantAndDateRequest { + string restaurant_id = 1; + string date = 2; +} + +message GetMetricsByRestaurantAndDateResponse { + repeated Metric metrics = 1; +} + message PushMetricRequest { string restaurant_id = 1; string code = 2; diff --git a/services/reporting/Models/Metric.cs b/services/reporting/Models/Metric.cs index e338420f..7bcab76b 100644 --- a/services/reporting/Models/Metric.cs +++ b/services/reporting/Models/Metric.cs @@ -5,17 +5,77 @@ namespace reporting.Models // TODO: upsert on push, instead of throwing exception [Index(nameof(Metric.Key), IsUnique = true)] + // TODO: add foreign on RestaurantId to Restaurant.Key public class Metric { public int Id { get; set; } // Key is a combination of RestaurantId, Date and Code (RestaurantId:Date:Code) and isUnique public string Key { get; set; } = null!; + // RestaurantId is a foreign key to Restaurant.Key public string RestaurantId { get; set; } = null!; public DateTime Date { get; set; } public string Code { get; set; } = null!; public string Value { get; set; } = null!; + public static Metric FromGrpcPushMetric(PushMetricRequest request) + { + return new Metric + { + Key = request.RestaurantId + ":" + DateTime.Now.Date.ToString("yyyy-MM-dd") + ":" + request.Code, + RestaurantId = request.RestaurantId, + Date = Google.Protobuf.WellKnownTypes.Timestamp.FromDateTime(DateTime.UtcNow).ToDateTime(), + Code = request.Code, + Value = request.Value + }; + } + + public reporting.Metric ToGrpcMetric() + { + return new reporting.Metric + { + Id = this.Id.ToString(), + Key = this.Key, + RestaurantId = this.RestaurantId, + Date = Google.Protobuf.WellKnownTypes.Timestamp.FromDateTime(this.Date.ToUniversalTime()), + Code = this.Code, + Value = this.Value + }; + } + + // getters and setters for the database + public static Metric? GetMetricByKey(string key) + { + using ReportingContext db = new ReportingContext(); + return db.Metrics.FirstOrDefault(m => m.Key == key); + } + + public static List GetMetricsByRestaurant(string key) + { + using ReportingContext db = new ReportingContext(); + return db.Metrics.Where(m => m.RestaurantId == key).ToList(); + } + + public static List GetMetricsByRestaurantAndDate(string key, string date) + { + List metrics = GetMetricsByRestaurant(key); + return metrics.Where(m => m.Date.ToString("yyyy-MM-dd") == date).ToList(); + } + + public Metric SaveMetric() + { + using ReportingContext db = new ReportingContext(); + db.Metrics.Add(this); + db.SaveChanges(); + return this; + } + + + // getters and setters for the model + public string GetKey() + { + return this.RestaurantId + ":" + this.Date.ToString("yyyy-MM-dd") + ":" + this.Code; + } } } diff --git a/services/reporting/Models/Restaurant.cs b/services/reporting/Models/Restaurant.cs new file mode 100644 index 00000000..47fa78c2 --- /dev/null +++ b/services/reporting/Models/Restaurant.cs @@ -0,0 +1,17 @@ +using Microsoft.EntityFrameworkCore; + +namespace reporting.Models + +{ + + [Index(nameof(Restaurant.Key), IsUnique = true)] + public class Restaurant + { + public int Id { get; set; } + public string Name { get; set; } = null!; + public string Key { get; set; } = null!; + + + } +} + diff --git a/services/reporting/Services/GreeterService.cs b/services/reporting/Services/GRPC/GreeterService.cs similarity index 86% rename from services/reporting/Services/GreeterService.cs rename to services/reporting/Services/GRPC/GreeterService.cs index 61cb1b58..c7c48440 100644 --- a/services/reporting/Services/GreeterService.cs +++ b/services/reporting/Services/GRPC/GreeterService.cs @@ -1,7 +1,6 @@ using Grpc.Core; -using reporting; -namespace reporting.Services; +namespace reporting.Services.GRPC; public class GreeterService : Greeter.GreeterBase { diff --git a/services/reporting/Services/GRPC/ReportingService.cs b/services/reporting/Services/GRPC/ReportingService.cs new file mode 100644 index 00000000..2d69eae6 --- /dev/null +++ b/services/reporting/Services/GRPC/ReportingService.cs @@ -0,0 +1,72 @@ +using Grpc.Core; +using MetricModel = reporting.Models.Metric; +using MetricGrpc = reporting.Metric; + + +namespace reporting.Services.GRPC; + + +public class ReportingService : reporting.ReportingService.ReportingServiceBase +{ + private readonly ILogger _logger; + private readonly ReportingContext _db; + public ReportingService(ILogger logger) + { + _logger = logger; + _db = new ReportingContext(); + + } + + private void LogRequest(T request, ServerCallContext context) + { + string Date = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); + string Method = context.Method.Split('.').Last(); + string RequestBody = request?.ToString() ?? "null"; + + _logger.LogInformation("\x1b[35m{Date}\x1b[0m | \x1b[36mGRPC\x1b[0m | \x1b[33m{Message}\x1b[0m\n", Date, Method + " with: " + RequestBody); + } + + + + public override Task GetMetric(GetMetricRequest request, ServerCallContext context) + { + LogRequest(request, context); + + MetricModel? metric = MetricModel.GetMetricByKey(request.Key); + if (metric == null) + throw new RpcException(new Status(StatusCode.NotFound, "Metric not found")); + + return Task.FromResult(metric.ToGrpcMetric()); + } + + public override Task GetMetricsByRestaurant(GetMetricsByRestaurantRequest request, ServerCallContext context) + { + LogRequest(request, context); + + List metrics = MetricModel.GetMetricsByRestaurant(request.RestaurantId); + List response = metrics.Select(m => m.ToGrpcMetric()).ToList(); + + // WARNING: this returns an empty object if no metrics are found + return Task.FromResult(new GetMetricsByRestaurantResponse { Metrics = { response } }); + } + + public override Task GetMetricsByRestaurantAndDate(GetMetricsByRestaurantAndDateRequest request, ServerCallContext context) + { + LogRequest(request, context); + + List metrics = MetricModel.GetMetricsByRestaurantAndDate(request.RestaurantId, request.Date); + List response = metrics.Select(m => m.ToGrpcMetric()).ToList(); + + // WARNING: this returns an empty object if no metrics are found + return Task.FromResult(new GetMetricsByRestaurantAndDateResponse { Metrics = { response } }); + } + + public override Task PushMetric(PushMetricRequest request, ServerCallContext context) + { + LogRequest(request, context); + + MetricModel metric = MetricModel.FromGrpcPushMetric(request).SaveMetric(); + + return Task.FromResult(new PushMetricResponse { Key = metric.Key }); + } +} diff --git a/services/reporting/Services/RabbitMQ/ReportingService.cs b/services/reporting/Services/RabbitMQ/ReportingService.cs new file mode 100644 index 00000000..f3afc206 --- /dev/null +++ b/services/reporting/Services/RabbitMQ/ReportingService.cs @@ -0,0 +1,36 @@ +using Grpc.Core; +using MetricModel = reporting.Models.Metric; +using MetricGrpc = reporting.Metric; + + +namespace reporting.Services.RabbitMQ; + + +public class ReportingService : reporting.ReportingService.ReportingServiceBase +{ + private readonly ILogger _logger; + private readonly ReportingContext _db; + public ReportingService(ILogger logger) + { + _logger = logger; + _db = new ReportingContext(); + + } + + private void LogRequest(T request) + { + string Date = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); + string RequestBody = request?.ToString() ?? "null"; + + _logger.LogInformation("\x1b[35m{Date}\x1b[0m | \x1b[31mAMQP\x1b[0m | \x1b[33m{Message}\x1b[0m\n", Date); + } + + + + public void AskFor() + { + // LogRequest(request); + + + } +} diff --git a/services/reporting/Services/ReportingService.cs b/services/reporting/Services/ReportingService.cs deleted file mode 100644 index 7107e2bc..00000000 --- a/services/reporting/Services/ReportingService.cs +++ /dev/null @@ -1,52 +0,0 @@ -using Grpc.Core; - -namespace reporting.Services; - - -public class ReportingService : reporting.ReportingService.ReportingServiceBase -{ - private readonly ILogger _logger; - private readonly ReportingContext _db; - public ReportingService(ILogger logger) - { - _logger = logger; - _db = new ReportingContext(); - - } - - public override Task GetMetric(GetMetricRequest request, ServerCallContext context) - { - Models.Metric? metric = _db.Metrics.FirstOrDefault(m => m.Key == request.Key); - if (metric == null) - throw new RpcException(new Status(StatusCode.NotFound, "Metric not found")); - - return Task.FromResult(new Metric - { - Id = metric.Id.ToString(), - Key = metric.Key, - RestaurantId = metric.RestaurantId, - Date = Google.Protobuf.WellKnownTypes.Timestamp.FromDateTime(metric.Date), - Code = metric.Code, - Value = metric.Value - }); - } - - public override Task PushMetric(PushMetricRequest request, ServerCallContext context) - { - - String date = DateTime.Now.Date.ToString("yyyy-MM-dd"); - Models.Metric metric = new Models.Metric - { - Key = request.RestaurantId + ":" + date + ":" + request.Code, - RestaurantId = request.RestaurantId, - Date = Google.Protobuf.WellKnownTypes.Timestamp.FromDateTime(DateTime.UtcNow).ToDateTime(), - Code = request.Code, - Value = request.Value - }; - - _db.Metrics.Add(metric); - _db.SaveChanges(); - - return Task.FromResult(new PushMetricResponse { Key = metric.Key }); - } -} diff --git a/services/reporting/Startup.cs b/services/reporting/Startup.cs index 4f55bf15..25e9262d 100644 --- a/services/reporting/Startup.cs +++ b/services/reporting/Startup.cs @@ -1,4 +1,4 @@ -using reporting.Services; +using reporting.Services.GRPC; using reporting.Libraries.RabbitMQ; using System.Net; diff --git a/services/reporting/Tests/MetricModel_Tests.cs b/services/reporting/Tests/MetricModel_Tests.cs new file mode 100644 index 00000000..c2ddee56 --- /dev/null +++ b/services/reporting/Tests/MetricModel_Tests.cs @@ -0,0 +1,75 @@ +using MetricModel = reporting.Models.Metric; + +namespace Tests; + +public class MetricModel_Tests +{ + [Fact] + public void GetKey_Test() + { + string RestaurantId = "restaurant_test"; + string Code = "incomes_24h"; + DateTime Date = DateTime.Now; + + MetricModel metric = new MetricModel + { + Id = 1, + Key = RestaurantId + ":" + Date.ToString("yyyy-MM-dd") + ":" + Code, + RestaurantId = RestaurantId, + Date = Date, + Code = Code, + Value = "test" + }; + + Assert.Equal(metric.Key, metric.GetKey()); + Assert.NotEqual("test", metric.GetKey()); + + } + + [Fact] + public void FromGrpcPushMetric_Test() + { + string RestaurantId = "restaurant_test"; + string Code = "incomes_24h"; + string Value = "test"; + + MetricModel metric = MetricModel.FromGrpcPushMetric(new reporting.PushMetricRequest + { + RestaurantId = RestaurantId, + Code = Code, + Value = Value + }); + + Assert.Equal(metric.RestaurantId, RestaurantId); + Assert.Equal(metric.Code, Code); + Assert.Equal(metric.Value, Value); + + Assert.Equal(metric.Key, metric.GetKey()); + } + + [Fact] + public void ToGrpcMetric_Test() + { + string RestaurantId = "restaurant_test"; + string Code = "incomes_24h"; + string Value = "test"; + + MetricModel metric = new MetricModel + { + Id = 1, + Key = RestaurantId + ":" + DateTime.Now.Date.ToString("yyyy-MM-dd") + ":" + Code, + RestaurantId = RestaurantId, + Date = DateTime.Now, + Code = Code, + Value = Value + }; + + reporting.Metric grpcMetric = metric.ToGrpcMetric(); + + Assert.Equal(grpcMetric.RestaurantId, RestaurantId); + Assert.Equal(grpcMetric.Code, Code); + Assert.Equal(grpcMetric.Value, Value); + + Assert.Equal(grpcMetric.Key, metric.GetKey()); + } +} \ No newline at end of file diff --git a/services/reporting/Tests/ReportingServices_Tests.cs b/services/reporting/Tests/ReportingServices_Tests.cs new file mode 100644 index 00000000..a780cb30 --- /dev/null +++ b/services/reporting/Tests/ReportingServices_Tests.cs @@ -0,0 +1,30 @@ +using MetricModel = reporting.Models.Metric; +using MetricGrpc = reporting.Metric; + +namespace Tests; + +public class ReportingService_Tests +{ + [Fact] + public void GetKey_Test() + { + string RestaurantId = "restaurant_test"; + string Code = "incomes_24h"; + DateTime Date = DateTime.Now; + + MetricModel metric = new MetricModel + { + Id = 1, + Key = RestaurantId + ":" + Date.ToString("yyyy-MM-dd") + ":" + Code, + RestaurantId = RestaurantId, + Date = Date, + Code = Code, + Value = "test" + }; + + Assert.Equal(metric.Key, metric.GetKey()); + Assert.NotEqual("test", metric.GetKey()); + + } + +} \ No newline at end of file diff --git a/services/reporting/Tests/UnitTest1.cs b/services/reporting/Tests/UnitTest1.cs deleted file mode 100644 index c1425c4e..00000000 --- a/services/reporting/Tests/UnitTest1.cs +++ /dev/null @@ -1,12 +0,0 @@ -namespace Tests; - -public class UnitTest1 -{ - [Fact] - public void Test1() - { - bool result = 1 + 1 == 2; - - Assert.True(result, "1 + 1 should be 2"); - } -} \ No newline at end of file From 5842877b755709ec5b7b7d9ea822b8ee33c31d4b Mon Sep 17 00:00:00 2001 From: anatole Date: Tue, 9 May 2023 09:07:05 +0200 Subject: [PATCH 079/883] feat(user): create the user service --- services/user/README.md | 0 services/user/src/go.mod | 74 ++++++++++++++++++++ services/user/src/main.go | 50 +++++++++++++ services/user/src/pkg/config/config.go | 27 +++++++ services/user/src/pkg/config/env/.env.dist | 3 + services/user/src/pkg/config/env/dev.env | 3 + services/user/src/pkg/db/db.go | 27 +++++++ services/user/src/pkg/models/main_address.go | 10 +++ services/user/src/pkg/models/role.go | 7 ++ services/user/src/pkg/models/user.go | 12 ++++ 10 files changed, 213 insertions(+) create mode 100644 services/user/README.md create mode 100644 services/user/src/go.mod create mode 100644 services/user/src/main.go create mode 100644 services/user/src/pkg/config/config.go create mode 100644 services/user/src/pkg/config/env/.env.dist create mode 100644 services/user/src/pkg/config/env/dev.env create mode 100644 services/user/src/pkg/db/db.go create mode 100644 services/user/src/pkg/models/main_address.go create mode 100644 services/user/src/pkg/models/role.go create mode 100644 services/user/src/pkg/models/user.go diff --git a/services/user/README.md b/services/user/README.md new file mode 100644 index 00000000..e69de29b diff --git a/services/user/src/go.mod b/services/user/src/go.mod new file mode 100644 index 00000000..cf956b96 --- /dev/null +++ b/services/user/src/go.mod @@ -0,0 +1,74 @@ +module main + +go 1.19 + +require ( + github.com/hellokvn/go-grpc-auth-svc v0.0.0-20220329201106-de9b08c8e812 + go-micro.dev/v4 v4.10.0 + google.golang.org/grpc v1.53.0 +) + +require ( + github.com/Microsoft/go-winio v0.6.0 // indirect + github.com/ProtonMail/go-crypto v0.0.0-20210428141323-04723f9f07d7 // indirect + github.com/acomagu/bufpipe v1.0.3 // indirect + github.com/bitly/go-simplejson v0.5.0 // indirect + github.com/cpuguy83/go-md2man/v2 v2.0.0 // indirect + github.com/emirpasic/gods v1.12.0 // indirect + github.com/fsnotify/fsnotify v1.5.1 // indirect + github.com/go-git/gcfg v1.5.0 // indirect + github.com/go-git/go-billy/v5 v5.3.1 // indirect + github.com/go-git/go-git/v5 v5.4.2 // indirect + github.com/golang-jwt/jwt v3.2.2+incompatible // indirect + github.com/golang/protobuf v1.5.2 // indirect + github.com/google/uuid v1.3.0 // indirect + github.com/hashicorp/hcl v1.0.0 // indirect + github.com/imdario/mergo v0.3.12 // indirect + github.com/jackc/chunkreader/v2 v2.0.1 // indirect + github.com/jackc/pgconn v1.10.1 // indirect + github.com/jackc/pgio v1.0.0 // indirect + github.com/jackc/pgpassfile v1.0.0 // indirect + github.com/jackc/pgproto3/v2 v2.2.0 // indirect + github.com/jackc/pgservicefile v0.0.0-20200714003250-2b9c44734f2b // indirect + github.com/jackc/pgtype v1.9.1 // indirect + github.com/jackc/pgx/v4 v4.14.1 // indirect + github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 // indirect + github.com/jinzhu/inflection v1.0.0 // indirect + github.com/jinzhu/now v1.1.4 // indirect + github.com/kevinburke/ssh_config v0.0.0-20201106050909-4977a11b4351 // indirect + github.com/magiconair/properties v1.8.5 // indirect + github.com/miekg/dns v1.1.43 // indirect + github.com/mitchellh/go-homedir v1.1.0 // indirect + github.com/mitchellh/mapstructure v1.4.3 // indirect + github.com/nxadm/tail v1.4.8 // indirect + github.com/oxtoacart/bpool v0.0.0-20190530202638-03653db5a59c // indirect + github.com/patrickmn/go-cache v2.1.0+incompatible // indirect + github.com/pelletier/go-toml v1.9.4 // indirect + github.com/pkg/errors v0.9.1 // indirect + github.com/russross/blackfriday/v2 v2.0.1 // indirect + github.com/sergi/go-diff v1.1.0 // indirect + github.com/shurcooL/sanitized_anchor_name v1.0.0 // indirect + github.com/spf13/afero v1.6.0 // indirect + github.com/spf13/cast v1.4.1 // indirect + github.com/spf13/jwalterweatherman v1.1.0 // indirect + github.com/spf13/pflag v1.0.5 // indirect + github.com/spf13/viper v1.10.1 // indirect + github.com/subosito/gotenv v1.2.0 // indirect + github.com/urfave/cli/v2 v2.3.0 // indirect + github.com/xanzy/ssh-agent v0.3.0 // indirect + golang.org/x/crypto v0.0.0-20220321153916-2c7772ba3064 // indirect + golang.org/x/mod v0.9.0 // indirect + golang.org/x/net v0.8.0 // indirect + golang.org/x/sync v0.1.0 // indirect + golang.org/x/sys v0.6.0 // indirect + golang.org/x/text v0.8.0 // indirect + golang.org/x/tools v0.7.0 // indirect + google.golang.org/genproto v0.0.0-20230306155012-7f2fa6fef1f4 // indirect + google.golang.org/protobuf v1.28.1 // indirect + gopkg.in/ini.v1 v1.66.2 // indirect + gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 // indirect + gopkg.in/warnings.v0 v0.1.2 // indirect + gopkg.in/yaml.v2 v2.4.0 // indirect + gorm.io/driver/postgres v1.3.1 // indirect + gorm.io/gorm v1.23.3 // indirect +) diff --git a/services/user/src/main.go b/services/user/src/main.go new file mode 100644 index 00000000..0bd5a013 --- /dev/null +++ b/services/user/src/main.go @@ -0,0 +1,50 @@ +package main + +import ( + "fmt" + "google.golang.org/grpc" + "log" + "main/pkg/config" + "main/pkg/db" + "main/pkg/pb" + "main/pkg/services" + "main/pkg/utils" + "net" +) + +func main() { + c, err := config.LoadConfig() + + if err != nil { + log.Fatalln("Failed at config", err) + } + + h := db.Init(c.DBUrl) + + jwt := utils.JwtWrapper{ + SecretKey: c.JWTSecretKey, + Issuer: "go-grpc-auth-svc", + ExpirationHours: 24 * 365, + } + + lis, err := net.Listen("tcp", c.Port) + + if err != nil { + log.Fatalln("Failed to listing:", err) + } + + fmt.Println("Auth Svc on", c.Port) + + s := services.Server{ + H: h, + Jwt: jwt, + } + + grpcServer := grpc.NewServer() + + pb.RegisterAuthServiceServer(grpcServer, &s) + + if err := grpcServer.Serve(lis); err != nil { + log.Fatalln("Failed to serve:", err) + } +} diff --git a/services/user/src/pkg/config/config.go b/services/user/src/pkg/config/config.go new file mode 100644 index 00000000..3b37182c --- /dev/null +++ b/services/user/src/pkg/config/config.go @@ -0,0 +1,27 @@ +package config + +import "github.com/spf13/viper" + +type Config struct { + Port string `mapstructure:"PORT"` + DBUrl string `mapstructure:"DB_URL"` + JWTSecretKey string `mapstructure:"JWT_SECRET_KEY"` +} + +func LoadConfig() (config Config, err error) { + viper.AddConfigPath("./pkg/config/envs") + viper.SetConfigName("dev") + viper.SetConfigType("env") + + viper.AutomaticEnv() + + err = viper.ReadInConfig() + + if err != nil { + return + } + + err = viper.Unmarshal(&config) + + return +} diff --git a/services/user/src/pkg/config/env/.env.dist b/services/user/src/pkg/config/env/.env.dist new file mode 100644 index 00000000..430f626c --- /dev/null +++ b/services/user/src/pkg/config/env/.env.dist @@ -0,0 +1,3 @@ +PORT=:50051 +DB_URL=postgres://:@:/ +JWT_SECRET_KEY=example \ No newline at end of file diff --git a/services/user/src/pkg/config/env/dev.env b/services/user/src/pkg/config/env/dev.env new file mode 100644 index 00000000..1aafde72 --- /dev/null +++ b/services/user/src/pkg/config/env/dev.env @@ -0,0 +1,3 @@ +PORT=:50051 +DB_URL=postgres://root@localhost:5432/auth_svc +JWT_SECRET_KEY=r43t18sc \ No newline at end of file diff --git a/services/user/src/pkg/db/db.go b/services/user/src/pkg/db/db.go new file mode 100644 index 00000000..006b41aa --- /dev/null +++ b/services/user/src/pkg/db/db.go @@ -0,0 +1,27 @@ +package db + +import ( + "gorm.io/driver/postgres" + "gorm.io/gorm" + "log" + "main/pkg/models" +) + +type Handler struct { + DB *gorm.DB +} + +func Init(url string) Handler { + db, err := gorm.Open(postgres.Open(url), &gorm.Config{}) + + if err != nil { + log.Fatalln(err) + } + + err = db.AutoMigrate(&models.User{}) + if err != nil { + return Handler{} + } + + return Handler{db} +} diff --git a/services/user/src/pkg/models/main_address.go b/services/user/src/pkg/models/main_address.go new file mode 100644 index 00000000..32e9803f --- /dev/null +++ b/services/user/src/pkg/models/main_address.go @@ -0,0 +1,10 @@ +package models + +type MainAddress struct { + Id int64 `json:"id" gorm:"primaryKey"` + Street string `json:"street" gorm:"type:varchar(255);not null"` + ZipCode string `json:"zip_code" gorm:"type:varchar(5);not null"` + Country string `json:"country" gorm:"type:varchar(255);not null"` + Lat float64 `gorm:"type:decimal(10,8)"` + Lng float64 `gorm:"type:decimal(11,8)"` +} diff --git a/services/user/src/pkg/models/role.go b/services/user/src/pkg/models/role.go new file mode 100644 index 00000000..14a34ca1 --- /dev/null +++ b/services/user/src/pkg/models/role.go @@ -0,0 +1,7 @@ +package models + +type Role struct { + Id int64 `json:"id" gorm:"primaryKey"` + Code string `json:"code" gorm:"type:varchar(255);uniqueIndex;not null"` + Label string `json:"label" gorm:"type:varchar(255);not null"` +} diff --git a/services/user/src/pkg/models/user.go b/services/user/src/pkg/models/user.go new file mode 100644 index 00000000..b89d205f --- /dev/null +++ b/services/user/src/pkg/models/user.go @@ -0,0 +1,12 @@ +package models + +type User struct { + Id int64 `json:"id" gorm:"primaryKey"` + Email string `json:"email" gorm:"type:varchar(255);not null"` + Password string `json:"password" gorm:"type:varchar(255);not null"` + Phone string `json:"phone" gorm:"type:varchar(10)"` + LastName string `json:"last_name" gorm:"type:varchar(100);not null"` + FirstName string `json:"first_name" gorm:"type:varchar(100);not null"` + MainAddressId int64 `json:"main_address_id" gorm:"type:bigint;not null"` + Role Role `json:"role" gorm:"foreignKey:RoleId"` +} From bdcee67475213f6ee8dbfb5906dc73821db0080a Mon Sep 17 00:00:00 2001 From: Florian LEROUX <10078837+floriaaan@users.noreply.github.com> Date: Tue, 9 May 2023 09:18:47 +0200 Subject: [PATCH 080/883] fix(gitignore): remove reporting service temporary files --- .gitignore | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index a452a6a6..eb399c48 100644 --- a/.gitignore +++ b/.gitignore @@ -59,4 +59,10 @@ terraform.rc /**/node_modules /**/dist /**/build -/**/.env \ No newline at end of file +/**/.env + + +# Ignore Visual Studio temporary files +/services/reporting/**/bin +/services/reporting/**/obj +/services/reporting/**/.vs \ No newline at end of file From b2cc8e3a973f0801bf760e22e15fed73b8e04fdb Mon Sep 17 00:00:00 2001 From: Florian LEROUX <10078837+floriaaan@users.noreply.github.com> Date: Sun, 16 Apr 2023 13:15:10 +0200 Subject: [PATCH 081/883] feat(tf): add terraform files --- services/order/README.md | 41 ++++++++ services/order/terraform/data.tf | 17 ++++ .../terraform/env/dev-backend.tfvars.example | 4 + .../order/terraform/env/dev.tfvars.example | 1 + services/order/terraform/main.tf | 95 +++++++++++++++++++ services/order/terraform/outputs.tf | 6 ++ services/order/terraform/variables.tf | 16 ++++ 7 files changed, 180 insertions(+) create mode 100644 services/order/README.md create mode 100644 services/order/terraform/data.tf create mode 100644 services/order/terraform/env/dev-backend.tfvars.example create mode 100644 services/order/terraform/env/dev.tfvars.example create mode 100644 services/order/terraform/main.tf create mode 100644 services/order/terraform/outputs.tf create mode 100644 services/order/terraform/variables.tf diff --git a/services/order/README.md b/services/order/README.md new file mode 100644 index 00000000..7cace267 --- /dev/null +++ b/services/order/README.md @@ -0,0 +1,41 @@ +# Order Microservice + +| Informations | +| ------------------------------------------- | +| **Port:** 50007 | +| **Developer:** @floriaaan | +| **Status:** In progress | +| **Last update:** 2023-04-16 | +| **Language:** NodeJS | +| **Dependencies:** TypeScript, gRPC, MongoDB | +| **Models:** ? | + +## gRPC Methods + +TBW + +## Requirements + +To run this microservice, you will need to have the following installed on your system: + +- NodeJS (v18.12.0 or higher) (dev. with v18.12.0) +- MongoDB + +You can use the following tools to help you with the setup: + +- You can use nvm to set your Node version using: + - `nvm use`. + +## Getting started + +### 1. Clone the repository and install dependencies + +1. Clone the `goodfood` repository to your local machine. +2. Navigate to the service directory (`services/order`) in your terminal. +3. Run `npm install` to install the necessary dependencies. +4. Create a `.env` file at the root of the project directory and add the environment variables values (see `.env.example`). +5. Run `npm run start` to start the microservice. + +You can now access the microservice at `http://localhost:50007`. + +NB: If you want to run the microservice in development mode, you can run `npm run dev` instead. diff --git a/services/order/terraform/data.tf b/services/order/terraform/data.tf new file mode 100644 index 00000000..bc3e9769 --- /dev/null +++ b/services/order/terraform/data.tf @@ -0,0 +1,17 @@ +data "azurerm_resource_group" "rg-goodfood" { + name = "rg-${var.project_name}${var.environnment_suffix}" +} + +data "azurerm_key_vault" "kv-goodfood-order" { + resource_group_name = data.azurerm_resource_group.rg-goodfood.name + name = "kv-${var.project_name}" +} + +data "azurerm_key_vault_secret" "order-db-login" { + name = "order-db-login" + key_vault_id = data.azurerm_key_vault.kv-goodfood-order.id +} +data "azurerm_key_vault_secret" "order-db-password" { + name = "order-db-password" + key_vault_id = data.azurerm_key_vault.kv-goodfood-order.id +} \ No newline at end of file diff --git a/services/order/terraform/env/dev-backend.tfvars.example b/services/order/terraform/env/dev-backend.tfvars.example new file mode 100644 index 00000000..61cb3ae1 --- /dev/null +++ b/services/order/terraform/env/dev-backend.tfvars.example @@ -0,0 +1,4 @@ +resource_group_name = "rg-goodfood-dev" +storage_account_name = "sa-goodfood-states" +container_name = "tfstate" +key = "order-dev.tfstate" diff --git a/services/order/terraform/env/dev.tfvars.example b/services/order/terraform/env/dev.tfvars.example new file mode 100644 index 00000000..4ac1f44d --- /dev/null +++ b/services/order/terraform/env/dev.tfvars.example @@ -0,0 +1 @@ +environnment_suffix = "-dev" diff --git a/services/order/terraform/main.tf b/services/order/terraform/main.tf new file mode 100644 index 00000000..b1b7fd3f --- /dev/null +++ b/services/order/terraform/main.tf @@ -0,0 +1,95 @@ +terraform { + required_providers { + azurerm = { + source = "hashicorp/azurerm" + version = "3.48.0" + } + } + backend "azurerm" {} +} + +provider "azurerm" { + features { + key_vault { + purge_soft_deleted_secrets_on_destroy = true + recover_soft_deleted_secrets = true + } + } +} + +resource "azurerm_key_vault" "kv-goodfood-order" { + name = "kv-goodfood-order" + location = data.azurerm_resource_group.rg-goodfood.location + resource_group_name = data.azurerm_resource_group.rg-goodfood.name + tenant_id = data.azurerm_client_config.current.tenant_id + sku_name = "standard" + soft_delete_retention_days = 7 + + access_policy { + tenant_id = data.azurerm_client_config.current.tenant_id + object_id = data.azurerm_client_config.current.object_id + + key_permissions = [ + "Create", + "Get", + ] + + secret_permissions = [ + "Set", + "Get", + "Delete", + "Purge", + "Recover" + ] + } +} + +data "azurerm_cosmosdb_account" "cosmosacc-goodfood-order" { + name = "cacc-goodfood-order" + resource_group_name = data.azurerm_resource_group.rg-goodfood.name + + kind = "MongoDB" + enable_automatic_failover = true + + capabilities { + name = "EnableMongo" + } + + consistency_policy { + consistency_level = "BoundedStaleness" + max_interval_in_seconds = 400 + max_staleness_prefix = 200000 + } + + geo_location { + location = var.location + } +} + +resource "azurerm_cosmosdb_mongo_database" "cosmosdb-goodfood-order" { + name = "cosmosdb-goodfood-order" + resource_group_name = data.azurerm_resource_group.rg-goodfood.name + account_name = data.azurerm_cosmosdb_account.cosmosacc-goodfood-order.name + throughput = 400 +} + +resource "azurerm_cosmosdb_mongo_collection" "mongocollection-goodfood-order" { + name = "mongocollection-goodfood-order" + resource_group_name = data.azurerm_resource_group.rg-goodfood.name + account_name = data.azurerm_cosmosdb_account.cosmosacc-goodfood-order.name + database_name = azurerm_cosmosdb_mongo_database.cosmosdb-goodfood-order.name + + default_ttl_seconds = "777" + shard_key = "uniqueKey" + throughput = 400 + + lifecycle { + ignore_changes = [index] + } + + depends_on = [ + azurerm_cosmosdb_mongo_database.cosmosdb-goodfood-order + ] + + +} diff --git a/services/order/terraform/outputs.tf b/services/order/terraform/outputs.tf new file mode 100644 index 00000000..a2d60616 --- /dev/null +++ b/services/order/terraform/outputs.tf @@ -0,0 +1,6 @@ +output "main-rg-name" { + value = data.azurerm_resource_group.rg-goodfood.name +} +output "main-rg-id" { + value = data.azurerm_resource_group.rg-goodfood.id +} \ No newline at end of file diff --git a/services/order/terraform/variables.tf b/services/order/terraform/variables.tf new file mode 100644 index 00000000..65fd7547 --- /dev/null +++ b/services/order/terraform/variables.tf @@ -0,0 +1,16 @@ +variable "environnment_suffix" { + type = string + description = "The suffix to append to the environment name" +} + +variable "location" { + type = string + description = "The location/region where all resources in this environment should be created" + default = "West Europe" +} + +variable "project_name" { + type = string + description = "The name of the project" + default = "goodfood" +} \ No newline at end of file From 13ecc28f036b5bd193f88954409e5fc8ab4a6ca8 Mon Sep 17 00:00:00 2001 From: anatole Date: Tue, 9 May 2023 09:51:21 +0200 Subject: [PATCH 082/883] refactor(README): update the readme --- services/user/README.md | 87 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 87 insertions(+) diff --git a/services/user/README.md b/services/user/README.md index e69de29b..a244a7e9 100644 --- a/services/user/README.md +++ b/services/user/README.md @@ -0,0 +1,87 @@ +# Delivery Microservice + +| Informations | +|------------------------------------------------| +| **Port:** 50001 | +| **Developer:** @Anatole-Godard | +| **Status:** In progress | +| **Last update:** 2023-05-09 | +| **Language:** GoLand | +| **Dependencies:** | +| **Models:** (see [`pkg/models`](./pkg/models)) | + +## gRPC Methods + +- User model: + + - `Register`: Creates a new user in the system. + - `GetUser`: Retrieves a user by its ID. + - `UpdateUser`: Updates the status of an existing user. + - `DeleteUser`: Deletes a user by its ID. + - `ListUser`: Retrieves all users. + - `LogIn`: Retrieves a new token for the given user ID. + - `LogOut`: Retrieves a boolean and delete the user token. + - `ChangePassword`: Changes the password of the given user ID. + - `ChangeRole`: Changes the role of the given user ID. + +- MainAddress person model: + - `CreateMainAddress`: Creates a new MainAddress for the given user ID. + - `GetMainAddress`: Retrieves a MainAddress by its ID. + - `UpdateMainAddress`: Updates an existing main address by its ID. + - `DeleteMainAddress`: Deletes a main address by its ID. + +## Requirements + +To run this microservice, you will need to have the following installed on your system: + +- GoLand (v1.19.4 or higher) (dev. with v1.19.4) +- Postgres (v15.2 or higher) (dev. with docker image `postgres:15.2`) + +You can use the following tools to help you with the setup: + +- You can use docker to run your Postgres database using: + - `docker run --name postgres -p 5432:5432 -e POSTGRES_PASSWORD=password -d postgres` + +## Getting started + +### 1. Clone the repository and install dependencies + +1. Clone the `goodfood` repository to your local machine. +2. Navigate to the service directory (`services/user`) in your terminal. +3. Run `go get` to install the necessary dependencies. +4. Create a `.env` file at the root of the project directory and add the environment variables values ( + see `.env.example`). +5. Run `go run main.go` to start the microservice. + +You can now access the microservice at `http://localhost:50001`. + +### 2. Create and seed the database + +Run the following command to create your Postgres database structure. This also creates the models tables that are +defined in [`prisma/schema.prisma`](./prisma/schema.prisma): + +``` +npx prisma migrate dev --name init +``` + +When `npx prisma migrate dev` is executed against a newly created database, seeding is also triggered. The seed file +in [`prisma/seed.ts`](./prisma/seed.ts) will be executed and your database will be populated with the sample data. + +## Build and Run with Docker + +### Build + +To build the image you need to be in the **parent folder** of the service you want to build. Then run the following +command: + +``` +docker build -t goodfood-user:1.0.0 -f ./user/Dockerfile . +``` + +### Run + +Create the .env base on the .env.example. Then run the following command: + +``` +docker run --env-file=.env goodfood-user:1.0.0 +``` From 8887ca8ebe88eb17decc681c4bf3643a7b9f4cbf Mon Sep 17 00:00:00 2001 From: anatole Date: Tue, 9 May 2023 10:38:49 +0200 Subject: [PATCH 083/883] feat(proto): create the user proto --- services/proto/user.proto | 101 ++++++++++++++++++++++++++++++++++++++ services/user/README.md | 2 - 2 files changed, 101 insertions(+), 2 deletions(-) create mode 100644 services/proto/user.proto diff --git a/services/proto/user.proto b/services/proto/user.proto new file mode 100644 index 00000000..dc173b8c --- /dev/null +++ b/services/proto/user.proto @@ -0,0 +1,101 @@ +syntax = "proto3"; + +import "google/protobuf/struct.proto"; +import "google/protobuf/empty.proto"; + +package com.goodfood.user; + +message Role { + string id = 1; + string code = 2; + string label = 3; +} + +message MainAddress { + string id = 1; + string street = 2; + string zipCode = 3; + string country = 4; + repeated int32 coordinates = 5; +} + +message User { + string id = 1; + string first_name = 2; + string last_name = 3; + string email = 4; + string phone = 5; + MainAddress mainAddress = 6; + Role role = 7; + google.protobuf.Struct token = 8; +} + +service UserService { + rpc Register (UserCreateInput) returns (User) {} + rpc GetUser (UserId) returns (User) {} + rpc UpdateUser (UserCreateInput) returns (User) {} + rpc DeleteUser (UserId) returns (google.protobuf.Empty) {} + rpc ListUser (UserId) returns (UserList) {} + rpc LogIn (logInInput) returns (User) {} + rpc LogOut (token) returns (google.protobuf.Empty) {} + rpc ChangePassword (changePasswordInput) returns (User) {} + rpc ChangeRole (changeRoleInput) returns (User) {} +} + +service MainAddressService { + rpc GetMainAddress (MainAddressId) returns (MainAddress) {} + rpc DeleteMainAddress (MainAddressId) returns (google.protobuf.Empty) {} +} + +message UserCreateInput { + string first_name = 1; + string last_name = 2; + string email = 3; + string password = 5; + string phone = 6; + MainAddressInput mainAddress = 7; + RoleInput role = 8; +} + +message MainAddressInput { + string street = 1; + string zipCode = 2; + string country = 3; + repeated int32 coordinates = 4; +} + +message RoleInput { + string code = 1; +} + +message UserId { + string id = 1; +} + +message UserList { + repeated User users = 1; +} + +message logInInput { + string userId = 1; + string email = 2; + string password = 3; +} + +message token { + google.protobuf.Struct token = 1; +} + +message changePasswordInput { + string oldPassword = 1; + string newPassword = 2; +} + +message changeRoleInput { + string userId = 1; + string roleCode = 2; +} + +message MainAddressId { + string id = 1; +} \ No newline at end of file diff --git a/services/user/README.md b/services/user/README.md index a244a7e9..7971ce2e 100644 --- a/services/user/README.md +++ b/services/user/README.md @@ -25,9 +25,7 @@ - `ChangeRole`: Changes the role of the given user ID. - MainAddress person model: - - `CreateMainAddress`: Creates a new MainAddress for the given user ID. - `GetMainAddress`: Retrieves a MainAddress by its ID. - - `UpdateMainAddress`: Updates an existing main address by its ID. - `DeleteMainAddress`: Deletes a main address by its ID. ## Requirements From 63684cde21c215df55a198e543389457a0a690cd Mon Sep 17 00:00:00 2001 From: anatole Date: Tue, 9 May 2023 11:01:45 +0200 Subject: [PATCH 084/883] feat(proto): compiled user proto files for go --- services/proto/user.pb.go | 1242 ++++++++++++++++++++++++++++++++ services/proto/user.proto | 2 + services/proto/user_grpc.pb.go | 516 +++++++++++++ services/user/README.md | 5 +- 4 files changed, 1764 insertions(+), 1 deletion(-) create mode 100644 services/proto/user.pb.go create mode 100644 services/proto/user_grpc.pb.go diff --git a/services/proto/user.pb.go b/services/proto/user.pb.go new file mode 100644 index 00000000..244b7e3e --- /dev/null +++ b/services/proto/user.pb.go @@ -0,0 +1,1242 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.28.1 +// protoc v3.12.4 +// source: user.proto + +package __ + +import ( + empty "github.com/golang/protobuf/ptypes/empty" + _struct "github.com/golang/protobuf/ptypes/struct" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + sync "sync" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +type Role struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + Code string `protobuf:"bytes,2,opt,name=code,proto3" json:"code,omitempty"` + Label string `protobuf:"bytes,3,opt,name=label,proto3" json:"label,omitempty"` +} + +func (x *Role) Reset() { + *x = Role{} + if protoimpl.UnsafeEnabled { + mi := &file_user_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Role) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Role) ProtoMessage() {} + +func (x *Role) ProtoReflect() protoreflect.Message { + mi := &file_user_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Role.ProtoReflect.Descriptor instead. +func (*Role) Descriptor() ([]byte, []int) { + return file_user_proto_rawDescGZIP(), []int{0} +} + +func (x *Role) GetId() string { + if x != nil { + return x.Id + } + return "" +} + +func (x *Role) GetCode() string { + if x != nil { + return x.Code + } + return "" +} + +func (x *Role) GetLabel() string { + if x != nil { + return x.Label + } + return "" +} + +type MainAddress struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + Street string `protobuf:"bytes,2,opt,name=street,proto3" json:"street,omitempty"` + ZipCode string `protobuf:"bytes,3,opt,name=zipCode,proto3" json:"zipCode,omitempty"` + Country string `protobuf:"bytes,4,opt,name=country,proto3" json:"country,omitempty"` + Coordinates []int32 `protobuf:"varint,5,rep,packed,name=coordinates,proto3" json:"coordinates,omitempty"` +} + +func (x *MainAddress) Reset() { + *x = MainAddress{} + if protoimpl.UnsafeEnabled { + mi := &file_user_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *MainAddress) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*MainAddress) ProtoMessage() {} + +func (x *MainAddress) ProtoReflect() protoreflect.Message { + mi := &file_user_proto_msgTypes[1] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use MainAddress.ProtoReflect.Descriptor instead. +func (*MainAddress) Descriptor() ([]byte, []int) { + return file_user_proto_rawDescGZIP(), []int{1} +} + +func (x *MainAddress) GetId() string { + if x != nil { + return x.Id + } + return "" +} + +func (x *MainAddress) GetStreet() string { + if x != nil { + return x.Street + } + return "" +} + +func (x *MainAddress) GetZipCode() string { + if x != nil { + return x.ZipCode + } + return "" +} + +func (x *MainAddress) GetCountry() string { + if x != nil { + return x.Country + } + return "" +} + +func (x *MainAddress) GetCoordinates() []int32 { + if x != nil { + return x.Coordinates + } + return nil +} + +type User struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + FirstName string `protobuf:"bytes,2,opt,name=first_name,json=firstName,proto3" json:"first_name,omitempty"` + LastName string `protobuf:"bytes,3,opt,name=last_name,json=lastName,proto3" json:"last_name,omitempty"` + Email string `protobuf:"bytes,4,opt,name=email,proto3" json:"email,omitempty"` + Phone string `protobuf:"bytes,5,opt,name=phone,proto3" json:"phone,omitempty"` + MainAddress *MainAddress `protobuf:"bytes,6,opt,name=mainAddress,proto3" json:"mainAddress,omitempty"` + Role *Role `protobuf:"bytes,7,opt,name=role,proto3" json:"role,omitempty"` + Token *_struct.Struct `protobuf:"bytes,8,opt,name=token,proto3" json:"token,omitempty"` +} + +func (x *User) Reset() { + *x = User{} + if protoimpl.UnsafeEnabled { + mi := &file_user_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *User) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*User) ProtoMessage() {} + +func (x *User) ProtoReflect() protoreflect.Message { + mi := &file_user_proto_msgTypes[2] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use User.ProtoReflect.Descriptor instead. +func (*User) Descriptor() ([]byte, []int) { + return file_user_proto_rawDescGZIP(), []int{2} +} + +func (x *User) GetId() string { + if x != nil { + return x.Id + } + return "" +} + +func (x *User) GetFirstName() string { + if x != nil { + return x.FirstName + } + return "" +} + +func (x *User) GetLastName() string { + if x != nil { + return x.LastName + } + return "" +} + +func (x *User) GetEmail() string { + if x != nil { + return x.Email + } + return "" +} + +func (x *User) GetPhone() string { + if x != nil { + return x.Phone + } + return "" +} + +func (x *User) GetMainAddress() *MainAddress { + if x != nil { + return x.MainAddress + } + return nil +} + +func (x *User) GetRole() *Role { + if x != nil { + return x.Role + } + return nil +} + +func (x *User) GetToken() *_struct.Struct { + if x != nil { + return x.Token + } + return nil +} + +type UserCreateInput struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + FirstName string `protobuf:"bytes,1,opt,name=first_name,json=firstName,proto3" json:"first_name,omitempty"` + LastName string `protobuf:"bytes,2,opt,name=last_name,json=lastName,proto3" json:"last_name,omitempty"` + Email string `protobuf:"bytes,3,opt,name=email,proto3" json:"email,omitempty"` + Password string `protobuf:"bytes,5,opt,name=password,proto3" json:"password,omitempty"` + Phone string `protobuf:"bytes,6,opt,name=phone,proto3" json:"phone,omitempty"` + MainAddress *MainAddressInput `protobuf:"bytes,7,opt,name=mainAddress,proto3" json:"mainAddress,omitempty"` + Role *RoleInput `protobuf:"bytes,8,opt,name=role,proto3" json:"role,omitempty"` +} + +func (x *UserCreateInput) Reset() { + *x = UserCreateInput{} + if protoimpl.UnsafeEnabled { + mi := &file_user_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *UserCreateInput) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UserCreateInput) ProtoMessage() {} + +func (x *UserCreateInput) ProtoReflect() protoreflect.Message { + mi := &file_user_proto_msgTypes[3] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use UserCreateInput.ProtoReflect.Descriptor instead. +func (*UserCreateInput) Descriptor() ([]byte, []int) { + return file_user_proto_rawDescGZIP(), []int{3} +} + +func (x *UserCreateInput) GetFirstName() string { + if x != nil { + return x.FirstName + } + return "" +} + +func (x *UserCreateInput) GetLastName() string { + if x != nil { + return x.LastName + } + return "" +} + +func (x *UserCreateInput) GetEmail() string { + if x != nil { + return x.Email + } + return "" +} + +func (x *UserCreateInput) GetPassword() string { + if x != nil { + return x.Password + } + return "" +} + +func (x *UserCreateInput) GetPhone() string { + if x != nil { + return x.Phone + } + return "" +} + +func (x *UserCreateInput) GetMainAddress() *MainAddressInput { + if x != nil { + return x.MainAddress + } + return nil +} + +func (x *UserCreateInput) GetRole() *RoleInput { + if x != nil { + return x.Role + } + return nil +} + +type MainAddressInput struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Street string `protobuf:"bytes,1,opt,name=street,proto3" json:"street,omitempty"` + ZipCode string `protobuf:"bytes,2,opt,name=zipCode,proto3" json:"zipCode,omitempty"` + Country string `protobuf:"bytes,3,opt,name=country,proto3" json:"country,omitempty"` + Coordinates []int32 `protobuf:"varint,4,rep,packed,name=coordinates,proto3" json:"coordinates,omitempty"` +} + +func (x *MainAddressInput) Reset() { + *x = MainAddressInput{} + if protoimpl.UnsafeEnabled { + mi := &file_user_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *MainAddressInput) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*MainAddressInput) ProtoMessage() {} + +func (x *MainAddressInput) ProtoReflect() protoreflect.Message { + mi := &file_user_proto_msgTypes[4] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use MainAddressInput.ProtoReflect.Descriptor instead. +func (*MainAddressInput) Descriptor() ([]byte, []int) { + return file_user_proto_rawDescGZIP(), []int{4} +} + +func (x *MainAddressInput) GetStreet() string { + if x != nil { + return x.Street + } + return "" +} + +func (x *MainAddressInput) GetZipCode() string { + if x != nil { + return x.ZipCode + } + return "" +} + +func (x *MainAddressInput) GetCountry() string { + if x != nil { + return x.Country + } + return "" +} + +func (x *MainAddressInput) GetCoordinates() []int32 { + if x != nil { + return x.Coordinates + } + return nil +} + +type RoleInput struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Code string `protobuf:"bytes,1,opt,name=code,proto3" json:"code,omitempty"` +} + +func (x *RoleInput) Reset() { + *x = RoleInput{} + if protoimpl.UnsafeEnabled { + mi := &file_user_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *RoleInput) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RoleInput) ProtoMessage() {} + +func (x *RoleInput) ProtoReflect() protoreflect.Message { + mi := &file_user_proto_msgTypes[5] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RoleInput.ProtoReflect.Descriptor instead. +func (*RoleInput) Descriptor() ([]byte, []int) { + return file_user_proto_rawDescGZIP(), []int{5} +} + +func (x *RoleInput) GetCode() string { + if x != nil { + return x.Code + } + return "" +} + +type UserId struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` +} + +func (x *UserId) Reset() { + *x = UserId{} + if protoimpl.UnsafeEnabled { + mi := &file_user_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *UserId) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UserId) ProtoMessage() {} + +func (x *UserId) ProtoReflect() protoreflect.Message { + mi := &file_user_proto_msgTypes[6] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use UserId.ProtoReflect.Descriptor instead. +func (*UserId) Descriptor() ([]byte, []int) { + return file_user_proto_rawDescGZIP(), []int{6} +} + +func (x *UserId) GetId() string { + if x != nil { + return x.Id + } + return "" +} + +type UserList struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Users []*User `protobuf:"bytes,1,rep,name=users,proto3" json:"users,omitempty"` +} + +func (x *UserList) Reset() { + *x = UserList{} + if protoimpl.UnsafeEnabled { + mi := &file_user_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *UserList) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UserList) ProtoMessage() {} + +func (x *UserList) ProtoReflect() protoreflect.Message { + mi := &file_user_proto_msgTypes[7] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use UserList.ProtoReflect.Descriptor instead. +func (*UserList) Descriptor() ([]byte, []int) { + return file_user_proto_rawDescGZIP(), []int{7} +} + +func (x *UserList) GetUsers() []*User { + if x != nil { + return x.Users + } + return nil +} + +type LogInInput struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + UserId string `protobuf:"bytes,1,opt,name=userId,proto3" json:"userId,omitempty"` + Email string `protobuf:"bytes,2,opt,name=email,proto3" json:"email,omitempty"` + Password string `protobuf:"bytes,3,opt,name=password,proto3" json:"password,omitempty"` +} + +func (x *LogInInput) Reset() { + *x = LogInInput{} + if protoimpl.UnsafeEnabled { + mi := &file_user_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *LogInInput) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*LogInInput) ProtoMessage() {} + +func (x *LogInInput) ProtoReflect() protoreflect.Message { + mi := &file_user_proto_msgTypes[8] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use LogInInput.ProtoReflect.Descriptor instead. +func (*LogInInput) Descriptor() ([]byte, []int) { + return file_user_proto_rawDescGZIP(), []int{8} +} + +func (x *LogInInput) GetUserId() string { + if x != nil { + return x.UserId + } + return "" +} + +func (x *LogInInput) GetEmail() string { + if x != nil { + return x.Email + } + return "" +} + +func (x *LogInInput) GetPassword() string { + if x != nil { + return x.Password + } + return "" +} + +type Token struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Token *_struct.Struct `protobuf:"bytes,1,opt,name=token,proto3" json:"token,omitempty"` +} + +func (x *Token) Reset() { + *x = Token{} + if protoimpl.UnsafeEnabled { + mi := &file_user_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Token) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Token) ProtoMessage() {} + +func (x *Token) ProtoReflect() protoreflect.Message { + mi := &file_user_proto_msgTypes[9] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Token.ProtoReflect.Descriptor instead. +func (*Token) Descriptor() ([]byte, []int) { + return file_user_proto_rawDescGZIP(), []int{9} +} + +func (x *Token) GetToken() *_struct.Struct { + if x != nil { + return x.Token + } + return nil +} + +type ChangePasswordInput struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + OldPassword string `protobuf:"bytes,1,opt,name=oldPassword,proto3" json:"oldPassword,omitempty"` + NewPassword string `protobuf:"bytes,2,opt,name=newPassword,proto3" json:"newPassword,omitempty"` +} + +func (x *ChangePasswordInput) Reset() { + *x = ChangePasswordInput{} + if protoimpl.UnsafeEnabled { + mi := &file_user_proto_msgTypes[10] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ChangePasswordInput) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ChangePasswordInput) ProtoMessage() {} + +func (x *ChangePasswordInput) ProtoReflect() protoreflect.Message { + mi := &file_user_proto_msgTypes[10] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ChangePasswordInput.ProtoReflect.Descriptor instead. +func (*ChangePasswordInput) Descriptor() ([]byte, []int) { + return file_user_proto_rawDescGZIP(), []int{10} +} + +func (x *ChangePasswordInput) GetOldPassword() string { + if x != nil { + return x.OldPassword + } + return "" +} + +func (x *ChangePasswordInput) GetNewPassword() string { + if x != nil { + return x.NewPassword + } + return "" +} + +type ChangeRoleInput struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + UserId string `protobuf:"bytes,1,opt,name=userId,proto3" json:"userId,omitempty"` + RoleCode string `protobuf:"bytes,2,opt,name=roleCode,proto3" json:"roleCode,omitempty"` +} + +func (x *ChangeRoleInput) Reset() { + *x = ChangeRoleInput{} + if protoimpl.UnsafeEnabled { + mi := &file_user_proto_msgTypes[11] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ChangeRoleInput) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ChangeRoleInput) ProtoMessage() {} + +func (x *ChangeRoleInput) ProtoReflect() protoreflect.Message { + mi := &file_user_proto_msgTypes[11] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ChangeRoleInput.ProtoReflect.Descriptor instead. +func (*ChangeRoleInput) Descriptor() ([]byte, []int) { + return file_user_proto_rawDescGZIP(), []int{11} +} + +func (x *ChangeRoleInput) GetUserId() string { + if x != nil { + return x.UserId + } + return "" +} + +func (x *ChangeRoleInput) GetRoleCode() string { + if x != nil { + return x.RoleCode + } + return "" +} + +type MainAddressId struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` +} + +func (x *MainAddressId) Reset() { + *x = MainAddressId{} + if protoimpl.UnsafeEnabled { + mi := &file_user_proto_msgTypes[12] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *MainAddressId) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*MainAddressId) ProtoMessage() {} + +func (x *MainAddressId) ProtoReflect() protoreflect.Message { + mi := &file_user_proto_msgTypes[12] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use MainAddressId.ProtoReflect.Descriptor instead. +func (*MainAddressId) Descriptor() ([]byte, []int) { + return file_user_proto_rawDescGZIP(), []int{12} +} + +func (x *MainAddressId) GetId() string { + if x != nil { + return x.Id + } + return "" +} + +var File_user_proto protoreflect.FileDescriptor + +var file_user_proto_rawDesc = []byte{ + 0x0a, 0x0a, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x11, 0x63, 0x6f, + 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x1a, + 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2f, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1b, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x65, + 0x6d, 0x70, 0x74, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x40, 0x0a, 0x04, 0x52, 0x6f, + 0x6c, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, + 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x22, 0x8b, 0x01, 0x0a, + 0x0b, 0x4d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x0e, 0x0a, 0x02, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x16, 0x0a, 0x06, + 0x73, 0x74, 0x72, 0x65, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, + 0x72, 0x65, 0x65, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x7a, 0x69, 0x70, 0x43, 0x6f, 0x64, 0x65, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x7a, 0x69, 0x70, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x18, + 0x0a, 0x07, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x07, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x6f, 0x6f, 0x72, + 0x64, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x05, 0x52, 0x0b, 0x63, + 0x6f, 0x6f, 0x72, 0x64, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x73, 0x22, 0x9c, 0x02, 0x0a, 0x04, 0x55, + 0x73, 0x65, 0x72, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x02, 0x69, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x66, 0x69, 0x72, 0x73, 0x74, 0x5f, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x66, 0x69, 0x72, 0x73, 0x74, 0x4e, 0x61, + 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6c, 0x61, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, + 0x14, 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x68, 0x6f, 0x6e, 0x65, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x68, 0x6f, 0x6e, 0x65, 0x12, 0x40, 0x0a, 0x0b, 0x6d, + 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1e, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, + 0x75, 0x73, 0x65, 0x72, 0x2e, 0x4d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, + 0x52, 0x0b, 0x6d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x2b, 0x0a, + 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6f, + 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, + 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x12, 0x2d, 0x0a, 0x05, 0x74, 0x6f, + 0x6b, 0x65, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, + 0x63, 0x74, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x8e, 0x02, 0x0a, 0x0f, 0x55, 0x73, + 0x65, 0x72, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x12, 0x1d, 0x0a, + 0x0a, 0x66, 0x69, 0x72, 0x73, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x09, 0x66, 0x69, 0x72, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x09, + 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x6c, 0x61, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6d, 0x61, + 0x69, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x12, + 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x70, + 0x68, 0x6f, 0x6e, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x68, 0x6f, 0x6e, + 0x65, 0x12, 0x45, 0x0a, 0x0b, 0x6d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, + 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, + 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x4d, 0x61, 0x69, 0x6e, 0x41, + 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x52, 0x0b, 0x6d, 0x61, 0x69, + 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x30, 0x0a, 0x04, 0x72, 0x6f, 0x6c, 0x65, + 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, + 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, + 0x6e, 0x70, 0x75, 0x74, 0x52, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x22, 0x80, 0x01, 0x0a, 0x10, 0x4d, + 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x12, + 0x16, 0x0a, 0x06, 0x73, 0x74, 0x72, 0x65, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x06, 0x73, 0x74, 0x72, 0x65, 0x65, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x7a, 0x69, 0x70, 0x43, 0x6f, + 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x7a, 0x69, 0x70, 0x43, 0x6f, 0x64, + 0x65, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x63, + 0x6f, 0x6f, 0x72, 0x64, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x05, + 0x52, 0x0b, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x73, 0x22, 0x1f, 0x0a, + 0x09, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, + 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x22, 0x18, + 0x0a, 0x06, 0x55, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x39, 0x0a, 0x08, 0x55, 0x73, 0x65, 0x72, + 0x4c, 0x69, 0x73, 0x74, 0x12, 0x2d, 0x0a, 0x05, 0x75, 0x73, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, + 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x05, 0x75, 0x73, + 0x65, 0x72, 0x73, 0x22, 0x56, 0x0a, 0x0a, 0x6c, 0x6f, 0x67, 0x49, 0x6e, 0x49, 0x6e, 0x70, 0x75, + 0x74, 0x12, 0x16, 0x0a, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6d, 0x61, + 0x69, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x12, + 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x22, 0x36, 0x0a, 0x05, 0x74, + 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x2d, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x05, 0x74, 0x6f, + 0x6b, 0x65, 0x6e, 0x22, 0x59, 0x0a, 0x13, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x61, 0x73, + 0x73, 0x77, 0x6f, 0x72, 0x64, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x6f, 0x6c, + 0x64, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0b, 0x6f, 0x6c, 0x64, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x20, 0x0a, 0x0b, + 0x6e, 0x65, 0x77, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0b, 0x6e, 0x65, 0x77, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x22, 0x45, + 0x0a, 0x0f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x70, 0x75, + 0x74, 0x12, 0x16, 0x0a, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x6f, 0x6c, + 0x65, 0x43, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x6f, 0x6c, + 0x65, 0x43, 0x6f, 0x64, 0x65, 0x22, 0x1f, 0x0a, 0x0d, 0x4d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, + 0x72, 0x65, 0x73, 0x73, 0x49, 0x64, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x32, 0x92, 0x05, 0x0a, 0x0b, 0x55, 0x73, 0x65, 0x72, 0x53, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x49, 0x0a, 0x08, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, + 0x65, 0x72, 0x12, 0x22, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, + 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x17, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, + 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x22, + 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x12, 0x19, 0x2e, 0x63, + 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, + 0x2e, 0x55, 0x73, 0x65, 0x72, 0x49, 0x64, 0x1a, 0x17, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, + 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, + 0x22, 0x00, 0x12, 0x4b, 0x0a, 0x0a, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, + 0x12, 0x22, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, + 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x49, + 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x17, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, + 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x22, 0x00, 0x12, + 0x41, 0x0a, 0x0a, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x12, 0x19, 0x2e, + 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, + 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x49, 0x64, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, + 0x22, 0x00, 0x12, 0x44, 0x0a, 0x08, 0x4c, 0x69, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, 0x12, 0x19, + 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, + 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x49, 0x64, 0x1a, 0x1b, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, + 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, 0x73, + 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x22, 0x00, 0x12, 0x41, 0x0a, 0x05, 0x4c, 0x6f, 0x67, 0x49, + 0x6e, 0x12, 0x1d, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, + 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x6c, 0x6f, 0x67, 0x49, 0x6e, 0x49, 0x6e, 0x70, 0x75, 0x74, + 0x1a, 0x17, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, + 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x22, 0x00, 0x12, 0x3c, 0x0a, 0x06, 0x4c, + 0x6f, 0x67, 0x4f, 0x75, 0x74, 0x12, 0x18, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, + 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x1a, + 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x53, 0x0a, 0x0e, 0x43, 0x68, 0x61, + 0x6e, 0x67, 0x65, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x26, 0x2e, 0x63, 0x6f, + 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, + 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x49, 0x6e, + 0x70, 0x75, 0x74, 0x1a, 0x17, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, + 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x22, 0x00, 0x12, 0x4b, + 0x0a, 0x0a, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x12, 0x22, 0x2e, 0x63, + 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, + 0x2e, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x70, 0x75, 0x74, + 0x1a, 0x17, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, + 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x22, 0x00, 0x32, 0xbb, 0x01, 0x0a, 0x12, + 0x4d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x53, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x12, 0x54, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x4d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, + 0x72, 0x65, 0x73, 0x73, 0x12, 0x20, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, + 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x4d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, + 0x72, 0x65, 0x73, 0x73, 0x49, 0x64, 0x1a, 0x1e, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, + 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x4d, 0x61, 0x69, 0x6e, 0x41, + 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x22, 0x00, 0x12, 0x4f, 0x0a, 0x11, 0x44, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x4d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x20, 0x2e, + 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, + 0x72, 0x2e, 0x4d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x49, 0x64, 0x1a, + 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x42, 0x03, 0x5a, 0x01, 0x2e, 0x62, 0x06, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_user_proto_rawDescOnce sync.Once + file_user_proto_rawDescData = file_user_proto_rawDesc +) + +func file_user_proto_rawDescGZIP() []byte { + file_user_proto_rawDescOnce.Do(func() { + file_user_proto_rawDescData = protoimpl.X.CompressGZIP(file_user_proto_rawDescData) + }) + return file_user_proto_rawDescData +} + +var file_user_proto_msgTypes = make([]protoimpl.MessageInfo, 13) +var file_user_proto_goTypes = []interface{}{ + (*Role)(nil), // 0: com.goodfood.user.Role + (*MainAddress)(nil), // 1: com.goodfood.user.MainAddress + (*User)(nil), // 2: com.goodfood.user.User + (*UserCreateInput)(nil), // 3: com.goodfood.user.UserCreateInput + (*MainAddressInput)(nil), // 4: com.goodfood.user.MainAddressInput + (*RoleInput)(nil), // 5: com.goodfood.user.RoleInput + (*UserId)(nil), // 6: com.goodfood.user.UserId + (*UserList)(nil), // 7: com.goodfood.user.UserList + (*LogInInput)(nil), // 8: com.goodfood.user.logInInput + (*Token)(nil), // 9: com.goodfood.user.token + (*ChangePasswordInput)(nil), // 10: com.goodfood.user.changePasswordInput + (*ChangeRoleInput)(nil), // 11: com.goodfood.user.changeRoleInput + (*MainAddressId)(nil), // 12: com.goodfood.user.MainAddressId + (*_struct.Struct)(nil), // 13: google.protobuf.Struct + (*empty.Empty)(nil), // 14: google.protobuf.Empty +} +var file_user_proto_depIdxs = []int32{ + 1, // 0: com.goodfood.user.User.mainAddress:type_name -> com.goodfood.user.MainAddress + 0, // 1: com.goodfood.user.User.role:type_name -> com.goodfood.user.Role + 13, // 2: com.goodfood.user.User.token:type_name -> google.protobuf.Struct + 4, // 3: com.goodfood.user.UserCreateInput.mainAddress:type_name -> com.goodfood.user.MainAddressInput + 5, // 4: com.goodfood.user.UserCreateInput.role:type_name -> com.goodfood.user.RoleInput + 2, // 5: com.goodfood.user.UserList.users:type_name -> com.goodfood.user.User + 13, // 6: com.goodfood.user.token.token:type_name -> google.protobuf.Struct + 3, // 7: com.goodfood.user.UserService.Register:input_type -> com.goodfood.user.UserCreateInput + 6, // 8: com.goodfood.user.UserService.GetUser:input_type -> com.goodfood.user.UserId + 3, // 9: com.goodfood.user.UserService.UpdateUser:input_type -> com.goodfood.user.UserCreateInput + 6, // 10: com.goodfood.user.UserService.DeleteUser:input_type -> com.goodfood.user.UserId + 6, // 11: com.goodfood.user.UserService.ListUser:input_type -> com.goodfood.user.UserId + 8, // 12: com.goodfood.user.UserService.LogIn:input_type -> com.goodfood.user.logInInput + 9, // 13: com.goodfood.user.UserService.LogOut:input_type -> com.goodfood.user.token + 10, // 14: com.goodfood.user.UserService.ChangePassword:input_type -> com.goodfood.user.changePasswordInput + 11, // 15: com.goodfood.user.UserService.ChangeRole:input_type -> com.goodfood.user.changeRoleInput + 12, // 16: com.goodfood.user.MainAddressService.GetMainAddress:input_type -> com.goodfood.user.MainAddressId + 12, // 17: com.goodfood.user.MainAddressService.DeleteMainAddress:input_type -> com.goodfood.user.MainAddressId + 2, // 18: com.goodfood.user.UserService.Register:output_type -> com.goodfood.user.User + 2, // 19: com.goodfood.user.UserService.GetUser:output_type -> com.goodfood.user.User + 2, // 20: com.goodfood.user.UserService.UpdateUser:output_type -> com.goodfood.user.User + 14, // 21: com.goodfood.user.UserService.DeleteUser:output_type -> google.protobuf.Empty + 7, // 22: com.goodfood.user.UserService.ListUser:output_type -> com.goodfood.user.UserList + 2, // 23: com.goodfood.user.UserService.LogIn:output_type -> com.goodfood.user.User + 14, // 24: com.goodfood.user.UserService.LogOut:output_type -> google.protobuf.Empty + 2, // 25: com.goodfood.user.UserService.ChangePassword:output_type -> com.goodfood.user.User + 2, // 26: com.goodfood.user.UserService.ChangeRole:output_type -> com.goodfood.user.User + 1, // 27: com.goodfood.user.MainAddressService.GetMainAddress:output_type -> com.goodfood.user.MainAddress + 14, // 28: com.goodfood.user.MainAddressService.DeleteMainAddress:output_type -> google.protobuf.Empty + 18, // [18:29] is the sub-list for method output_type + 7, // [7:18] is the sub-list for method input_type + 7, // [7:7] is the sub-list for extension type_name + 7, // [7:7] is the sub-list for extension extendee + 0, // [0:7] is the sub-list for field type_name +} + +func init() { file_user_proto_init() } +func file_user_proto_init() { + if File_user_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_user_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Role); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_user_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*MainAddress); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_user_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*User); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_user_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UserCreateInput); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_user_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*MainAddressInput); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_user_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RoleInput); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_user_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UserId); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_user_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UserList); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_user_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*LogInInput); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_user_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Token); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_user_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ChangePasswordInput); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_user_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ChangeRoleInput); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_user_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*MainAddressId); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_user_proto_rawDesc, + NumEnums: 0, + NumMessages: 13, + NumExtensions: 0, + NumServices: 2, + }, + GoTypes: file_user_proto_goTypes, + DependencyIndexes: file_user_proto_depIdxs, + MessageInfos: file_user_proto_msgTypes, + }.Build() + File_user_proto = out.File + file_user_proto_rawDesc = nil + file_user_proto_goTypes = nil + file_user_proto_depIdxs = nil +} diff --git a/services/proto/user.proto b/services/proto/user.proto index dc173b8c..599240f3 100644 --- a/services/proto/user.proto +++ b/services/proto/user.proto @@ -5,6 +5,8 @@ import "google/protobuf/empty.proto"; package com.goodfood.user; +option go_package = "."; + message Role { string id = 1; string code = 2; diff --git a/services/proto/user_grpc.pb.go b/services/proto/user_grpc.pb.go new file mode 100644 index 00000000..5223cea9 --- /dev/null +++ b/services/proto/user_grpc.pb.go @@ -0,0 +1,516 @@ +// Code generated by protoc-gen-go-grpc. DO NOT EDIT. +// versions: +// - protoc-gen-go-grpc v1.2.0 +// - protoc v3.12.4 +// source: user.proto + +package __ + +import ( + context "context" + empty "github.com/golang/protobuf/ptypes/empty" + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" +) + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +// Requires gRPC-Go v1.32.0 or later. +const _ = grpc.SupportPackageIsVersion7 + +// UserServiceClient is the client API for UserService service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. +type UserServiceClient interface { + Register(ctx context.Context, in *UserCreateInput, opts ...grpc.CallOption) (*User, error) + GetUser(ctx context.Context, in *UserId, opts ...grpc.CallOption) (*User, error) + UpdateUser(ctx context.Context, in *UserCreateInput, opts ...grpc.CallOption) (*User, error) + DeleteUser(ctx context.Context, in *UserId, opts ...grpc.CallOption) (*empty.Empty, error) + ListUser(ctx context.Context, in *UserId, opts ...grpc.CallOption) (*UserList, error) + LogIn(ctx context.Context, in *LogInInput, opts ...grpc.CallOption) (*User, error) + LogOut(ctx context.Context, in *Token, opts ...grpc.CallOption) (*empty.Empty, error) + ChangePassword(ctx context.Context, in *ChangePasswordInput, opts ...grpc.CallOption) (*User, error) + ChangeRole(ctx context.Context, in *ChangeRoleInput, opts ...grpc.CallOption) (*User, error) +} + +type userServiceClient struct { + cc grpc.ClientConnInterface +} + +func NewUserServiceClient(cc grpc.ClientConnInterface) UserServiceClient { + return &userServiceClient{cc} +} + +func (c *userServiceClient) Register(ctx context.Context, in *UserCreateInput, opts ...grpc.CallOption) (*User, error) { + out := new(User) + err := c.cc.Invoke(ctx, "/com.goodfood.user.UserService/Register", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *userServiceClient) GetUser(ctx context.Context, in *UserId, opts ...grpc.CallOption) (*User, error) { + out := new(User) + err := c.cc.Invoke(ctx, "/com.goodfood.user.UserService/GetUser", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *userServiceClient) UpdateUser(ctx context.Context, in *UserCreateInput, opts ...grpc.CallOption) (*User, error) { + out := new(User) + err := c.cc.Invoke(ctx, "/com.goodfood.user.UserService/UpdateUser", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *userServiceClient) DeleteUser(ctx context.Context, in *UserId, opts ...grpc.CallOption) (*empty.Empty, error) { + out := new(empty.Empty) + err := c.cc.Invoke(ctx, "/com.goodfood.user.UserService/DeleteUser", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *userServiceClient) ListUser(ctx context.Context, in *UserId, opts ...grpc.CallOption) (*UserList, error) { + out := new(UserList) + err := c.cc.Invoke(ctx, "/com.goodfood.user.UserService/ListUser", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *userServiceClient) LogIn(ctx context.Context, in *LogInInput, opts ...grpc.CallOption) (*User, error) { + out := new(User) + err := c.cc.Invoke(ctx, "/com.goodfood.user.UserService/LogIn", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *userServiceClient) LogOut(ctx context.Context, in *Token, opts ...grpc.CallOption) (*empty.Empty, error) { + out := new(empty.Empty) + err := c.cc.Invoke(ctx, "/com.goodfood.user.UserService/LogOut", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *userServiceClient) ChangePassword(ctx context.Context, in *ChangePasswordInput, opts ...grpc.CallOption) (*User, error) { + out := new(User) + err := c.cc.Invoke(ctx, "/com.goodfood.user.UserService/ChangePassword", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *userServiceClient) ChangeRole(ctx context.Context, in *ChangeRoleInput, opts ...grpc.CallOption) (*User, error) { + out := new(User) + err := c.cc.Invoke(ctx, "/com.goodfood.user.UserService/ChangeRole", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +// UserServiceServer is the server API for UserService service. +// All implementations must embed UnimplementedUserServiceServer +// for forward compatibility +type UserServiceServer interface { + Register(context.Context, *UserCreateInput) (*User, error) + GetUser(context.Context, *UserId) (*User, error) + UpdateUser(context.Context, *UserCreateInput) (*User, error) + DeleteUser(context.Context, *UserId) (*empty.Empty, error) + ListUser(context.Context, *UserId) (*UserList, error) + LogIn(context.Context, *LogInInput) (*User, error) + LogOut(context.Context, *Token) (*empty.Empty, error) + ChangePassword(context.Context, *ChangePasswordInput) (*User, error) + ChangeRole(context.Context, *ChangeRoleInput) (*User, error) + mustEmbedUnimplementedUserServiceServer() +} + +// UnimplementedUserServiceServer must be embedded to have forward compatible implementations. +type UnimplementedUserServiceServer struct { +} + +func (UnimplementedUserServiceServer) Register(context.Context, *UserCreateInput) (*User, error) { + return nil, status.Errorf(codes.Unimplemented, "method Register not implemented") +} +func (UnimplementedUserServiceServer) GetUser(context.Context, *UserId) (*User, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetUser not implemented") +} +func (UnimplementedUserServiceServer) UpdateUser(context.Context, *UserCreateInput) (*User, error) { + return nil, status.Errorf(codes.Unimplemented, "method UpdateUser not implemented") +} +func (UnimplementedUserServiceServer) DeleteUser(context.Context, *UserId) (*empty.Empty, error) { + return nil, status.Errorf(codes.Unimplemented, "method DeleteUser not implemented") +} +func (UnimplementedUserServiceServer) ListUser(context.Context, *UserId) (*UserList, error) { + return nil, status.Errorf(codes.Unimplemented, "method ListUser not implemented") +} +func (UnimplementedUserServiceServer) LogIn(context.Context, *LogInInput) (*User, error) { + return nil, status.Errorf(codes.Unimplemented, "method LogIn not implemented") +} +func (UnimplementedUserServiceServer) LogOut(context.Context, *Token) (*empty.Empty, error) { + return nil, status.Errorf(codes.Unimplemented, "method LogOut not implemented") +} +func (UnimplementedUserServiceServer) ChangePassword(context.Context, *ChangePasswordInput) (*User, error) { + return nil, status.Errorf(codes.Unimplemented, "method ChangePassword not implemented") +} +func (UnimplementedUserServiceServer) ChangeRole(context.Context, *ChangeRoleInput) (*User, error) { + return nil, status.Errorf(codes.Unimplemented, "method ChangeRole not implemented") +} +func (UnimplementedUserServiceServer) mustEmbedUnimplementedUserServiceServer() {} + +// UnsafeUserServiceServer may be embedded to opt out of forward compatibility for this service. +// Use of this interface is not recommended, as added methods to UserServiceServer will +// result in compilation errors. +type UnsafeUserServiceServer interface { + mustEmbedUnimplementedUserServiceServer() +} + +func RegisterUserServiceServer(s grpc.ServiceRegistrar, srv UserServiceServer) { + s.RegisterService(&UserService_ServiceDesc, srv) +} + +func _UserService_Register_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(UserCreateInput) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(UserServiceServer).Register(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/com.goodfood.user.UserService/Register", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(UserServiceServer).Register(ctx, req.(*UserCreateInput)) + } + return interceptor(ctx, in, info, handler) +} + +func _UserService_GetUser_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(UserId) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(UserServiceServer).GetUser(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/com.goodfood.user.UserService/GetUser", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(UserServiceServer).GetUser(ctx, req.(*UserId)) + } + return interceptor(ctx, in, info, handler) +} + +func _UserService_UpdateUser_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(UserCreateInput) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(UserServiceServer).UpdateUser(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/com.goodfood.user.UserService/UpdateUser", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(UserServiceServer).UpdateUser(ctx, req.(*UserCreateInput)) + } + return interceptor(ctx, in, info, handler) +} + +func _UserService_DeleteUser_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(UserId) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(UserServiceServer).DeleteUser(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/com.goodfood.user.UserService/DeleteUser", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(UserServiceServer).DeleteUser(ctx, req.(*UserId)) + } + return interceptor(ctx, in, info, handler) +} + +func _UserService_ListUser_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(UserId) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(UserServiceServer).ListUser(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/com.goodfood.user.UserService/ListUser", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(UserServiceServer).ListUser(ctx, req.(*UserId)) + } + return interceptor(ctx, in, info, handler) +} + +func _UserService_LogIn_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(LogInInput) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(UserServiceServer).LogIn(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/com.goodfood.user.UserService/LogIn", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(UserServiceServer).LogIn(ctx, req.(*LogInInput)) + } + return interceptor(ctx, in, info, handler) +} + +func _UserService_LogOut_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(Token) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(UserServiceServer).LogOut(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/com.goodfood.user.UserService/LogOut", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(UserServiceServer).LogOut(ctx, req.(*Token)) + } + return interceptor(ctx, in, info, handler) +} + +func _UserService_ChangePassword_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ChangePasswordInput) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(UserServiceServer).ChangePassword(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/com.goodfood.user.UserService/ChangePassword", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(UserServiceServer).ChangePassword(ctx, req.(*ChangePasswordInput)) + } + return interceptor(ctx, in, info, handler) +} + +func _UserService_ChangeRole_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ChangeRoleInput) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(UserServiceServer).ChangeRole(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/com.goodfood.user.UserService/ChangeRole", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(UserServiceServer).ChangeRole(ctx, req.(*ChangeRoleInput)) + } + return interceptor(ctx, in, info, handler) +} + +// UserService_ServiceDesc is the grpc.ServiceDesc for UserService service. +// It's only intended for direct use with grpc.RegisterService, +// and not to be introspected or modified (even as a copy) +var UserService_ServiceDesc = grpc.ServiceDesc{ + ServiceName: "com.goodfood.user.UserService", + HandlerType: (*UserServiceServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "Register", + Handler: _UserService_Register_Handler, + }, + { + MethodName: "GetUser", + Handler: _UserService_GetUser_Handler, + }, + { + MethodName: "UpdateUser", + Handler: _UserService_UpdateUser_Handler, + }, + { + MethodName: "DeleteUser", + Handler: _UserService_DeleteUser_Handler, + }, + { + MethodName: "ListUser", + Handler: _UserService_ListUser_Handler, + }, + { + MethodName: "LogIn", + Handler: _UserService_LogIn_Handler, + }, + { + MethodName: "LogOut", + Handler: _UserService_LogOut_Handler, + }, + { + MethodName: "ChangePassword", + Handler: _UserService_ChangePassword_Handler, + }, + { + MethodName: "ChangeRole", + Handler: _UserService_ChangeRole_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "user.proto", +} + +// MainAddressServiceClient is the client API for MainAddressService service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. +type MainAddressServiceClient interface { + GetMainAddress(ctx context.Context, in *MainAddressId, opts ...grpc.CallOption) (*MainAddress, error) + DeleteMainAddress(ctx context.Context, in *MainAddressId, opts ...grpc.CallOption) (*empty.Empty, error) +} + +type mainAddressServiceClient struct { + cc grpc.ClientConnInterface +} + +func NewMainAddressServiceClient(cc grpc.ClientConnInterface) MainAddressServiceClient { + return &mainAddressServiceClient{cc} +} + +func (c *mainAddressServiceClient) GetMainAddress(ctx context.Context, in *MainAddressId, opts ...grpc.CallOption) (*MainAddress, error) { + out := new(MainAddress) + err := c.cc.Invoke(ctx, "/com.goodfood.user.MainAddressService/GetMainAddress", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *mainAddressServiceClient) DeleteMainAddress(ctx context.Context, in *MainAddressId, opts ...grpc.CallOption) (*empty.Empty, error) { + out := new(empty.Empty) + err := c.cc.Invoke(ctx, "/com.goodfood.user.MainAddressService/DeleteMainAddress", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +// MainAddressServiceServer is the server API for MainAddressService service. +// All implementations must embed UnimplementedMainAddressServiceServer +// for forward compatibility +type MainAddressServiceServer interface { + GetMainAddress(context.Context, *MainAddressId) (*MainAddress, error) + DeleteMainAddress(context.Context, *MainAddressId) (*empty.Empty, error) + mustEmbedUnimplementedMainAddressServiceServer() +} + +// UnimplementedMainAddressServiceServer must be embedded to have forward compatible implementations. +type UnimplementedMainAddressServiceServer struct { +} + +func (UnimplementedMainAddressServiceServer) GetMainAddress(context.Context, *MainAddressId) (*MainAddress, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetMainAddress not implemented") +} +func (UnimplementedMainAddressServiceServer) DeleteMainAddress(context.Context, *MainAddressId) (*empty.Empty, error) { + return nil, status.Errorf(codes.Unimplemented, "method DeleteMainAddress not implemented") +} +func (UnimplementedMainAddressServiceServer) mustEmbedUnimplementedMainAddressServiceServer() {} + +// UnsafeMainAddressServiceServer may be embedded to opt out of forward compatibility for this service. +// Use of this interface is not recommended, as added methods to MainAddressServiceServer will +// result in compilation errors. +type UnsafeMainAddressServiceServer interface { + mustEmbedUnimplementedMainAddressServiceServer() +} + +func RegisterMainAddressServiceServer(s grpc.ServiceRegistrar, srv MainAddressServiceServer) { + s.RegisterService(&MainAddressService_ServiceDesc, srv) +} + +func _MainAddressService_GetMainAddress_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(MainAddressId) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(MainAddressServiceServer).GetMainAddress(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/com.goodfood.user.MainAddressService/GetMainAddress", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(MainAddressServiceServer).GetMainAddress(ctx, req.(*MainAddressId)) + } + return interceptor(ctx, in, info, handler) +} + +func _MainAddressService_DeleteMainAddress_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(MainAddressId) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(MainAddressServiceServer).DeleteMainAddress(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/com.goodfood.user.MainAddressService/DeleteMainAddress", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(MainAddressServiceServer).DeleteMainAddress(ctx, req.(*MainAddressId)) + } + return interceptor(ctx, in, info, handler) +} + +// MainAddressService_ServiceDesc is the grpc.ServiceDesc for MainAddressService service. +// It's only intended for direct use with grpc.RegisterService, +// and not to be introspected or modified (even as a copy) +var MainAddressService_ServiceDesc = grpc.ServiceDesc{ + ServiceName: "com.goodfood.user.MainAddressService", + HandlerType: (*MainAddressServiceServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "GetMainAddress", + Handler: _MainAddressService_GetMainAddress_Handler, + }, + { + MethodName: "DeleteMainAddress", + Handler: _MainAddressService_DeleteMainAddress_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "user.proto", +} diff --git a/services/user/README.md b/services/user/README.md index 7971ce2e..b9dc0125 100644 --- a/services/user/README.md +++ b/services/user/README.md @@ -46,11 +46,14 @@ You can use the following tools to help you with the setup: 1. Clone the `goodfood` repository to your local machine. 2. Navigate to the service directory (`services/user`) in your terminal. -3. Run `go get` to install the necessary dependencies. +3. Run `go mod download` to install the necessary dependencies. 4. Create a `.env` file at the root of the project directory and add the environment variables values ( see `.env.example`). 5. Run `go run main.go` to start the microservice. +If protos are updated, you will need to regenerate the gRPC code using the following command: +`protoc -I . user.proto --go-grpc_out=. --go_out=.` + You can now access the microservice at `http://localhost:50001`. ### 2. Create and seed the database From 7e46658535cdf64af1df92d5775c83d4a7fbe866 Mon Sep 17 00:00:00 2001 From: Florian LEROUX <10078837+floriaaan@users.noreply.github.com> Date: Tue, 9 May 2023 14:37:05 +0200 Subject: [PATCH 085/883] feat(init): add server dependencies --- services/order/.dockerignore | 2 + services/order/.env.example | 5 + services/order/.gitignore | 5 + services/order/.nvmrc | 1 + services/order/Dockerfile | 38 + services/order/generate_grpc_reflection.sh | 15 + services/order/package.json | 55 + services/order/pnpm-lock.yaml | 2402 ++++++++++++++++++++ services/order/prisma/schema.prisma | 49 + services/order/prisma/seed.ts | 27 + services/order/proto | 1 + services/order/reflection_descriptor.bin | Bin 0 -> 1380 bytes services/order/src/handlers/.gitinclude | 0 services/order/tsconfig.json | 18 + services/order/vitest.config.ts | 10 + services/proto/order.proto | 45 +- 16 files changed, 2668 insertions(+), 5 deletions(-) create mode 100644 services/order/.dockerignore create mode 100644 services/order/.env.example create mode 100644 services/order/.gitignore create mode 100644 services/order/.nvmrc create mode 100644 services/order/Dockerfile create mode 100755 services/order/generate_grpc_reflection.sh create mode 100644 services/order/package.json create mode 100644 services/order/pnpm-lock.yaml create mode 100644 services/order/prisma/schema.prisma create mode 100644 services/order/prisma/seed.ts create mode 120000 services/order/proto create mode 100644 services/order/reflection_descriptor.bin create mode 100644 services/order/src/handlers/.gitinclude create mode 100644 services/order/tsconfig.json create mode 100644 services/order/vitest.config.ts diff --git a/services/order/.dockerignore b/services/order/.dockerignore new file mode 100644 index 00000000..b7dab5e9 --- /dev/null +++ b/services/order/.dockerignore @@ -0,0 +1,2 @@ +node_modules +build \ No newline at end of file diff --git a/services/order/.env.example b/services/order/.env.example new file mode 100644 index 00000000..23313f7e --- /dev/null +++ b/services/order/.env.example @@ -0,0 +1,5 @@ +DB_USER=user +DB_PASS=pass +DATABASE_URL=mongodb+srv://${DB_USER}:${DB_PASS}@test.kcs3xbg.mongodb.net/?retryWrites=true&w=majority + +PORT=50007 \ No newline at end of file diff --git a/services/order/.gitignore b/services/order/.gitignore new file mode 100644 index 00000000..583204b4 --- /dev/null +++ b/services/order/.gitignore @@ -0,0 +1,5 @@ +node_modules/ +dist/ +bin/ +*.env* +!*.env.example diff --git a/services/order/.nvmrc b/services/order/.nvmrc new file mode 100644 index 00000000..9dfef472 --- /dev/null +++ b/services/order/.nvmrc @@ -0,0 +1 @@ +v18.12.0 diff --git a/services/order/Dockerfile b/services/order/Dockerfile new file mode 100644 index 00000000..19327c3e --- /dev/null +++ b/services/order/Dockerfile @@ -0,0 +1,38 @@ +FROM node:18-alpine3.17 as builder + +# Set working directory +WORKDIR /app + +# Copy the application code +COPY ./delivery/ . + +# Install dependencies +RUN npm install + +# Copy the proto files - TODO: fix this, proto files should be copied from goodfood/services/proto +COPY ./proto ./proto/ + +# Generate Prisma client +RUN npx prisma generate + +# Build the application +RUN npm run build + + +# Create a new image with the application +FROM node:18-alpine3.17 as runner + +# Set working directory +WORKDIR /app + +# Copy the application package +COPY --from=builder /app/dist . +COPY --from=builder /app/prisma/ . +COPY --from=builder /app/proto/ /proto/ +COPY --from=builder /app/node_modules/.prisma /.prisma + +# Expose the gRPC port +EXPOSE 50008 + +# Start the server +CMD [ "node", "index.js"] diff --git a/services/order/generate_grpc_reflection.sh b/services/order/generate_grpc_reflection.sh new file mode 100755 index 00000000..ee20ec7f --- /dev/null +++ b/services/order/generate_grpc_reflection.sh @@ -0,0 +1,15 @@ +#!/usr/bin/env bash + +# bash list of proto files ([order.proto]) + + +IN_DIR="$(pwd)/../proto" +OUT_DIR="." +PROTOC="$(npm bin)/grpc_tools_node_protoc" + +# Generate reflection descriptor +$PROTOC \ + -I $IN_DIR \ + $IN_DIR/order.proto \ + --descriptor_set_out=$OUT_DIR/reflection_descriptor.bin \ + \ No newline at end of file diff --git a/services/order/package.json b/services/order/package.json new file mode 100644 index 00000000..2bdae690 --- /dev/null +++ b/services/order/package.json @@ -0,0 +1,55 @@ +{ + "name": "@goodfood/order", + "bin": "dist/index.js", + "scripts": { + "start": "node dist/index.js", + "dev": "nodemon --watch 'src/**/*.ts' --exec 'ts-node' src/server.ts", + "build": "esbuild src/server.ts --bundle --platform=node --target=node18 --outfile=dist/index.js", + "test": "echo 'tests are disabled' # vitest", + "coverage": "vitest --coverage", + "pkg": "pkg .", + "prisma:generate": "prisma generate", + "seed": "ts-node prisma/seed.ts", + "grpc:reflection": "./generate_grpc_reflection.sh", + "postinstall": "npm run prisma:generate && npm run grpc:reflection" + }, + "dependencies": { + "@grpc/grpc-js": "1.8.14", + "@grpc/proto-loader": "0.7.6", + "@prisma/client": "4.13.0", + "dotenv": "^16.0.3", + "grpc-server-reflection": "^0.1.5", + "protobufjs": "7.2.2" + }, + "devDependencies": { + "@types/node": "18.15.9", + "@vitest/coverage-c8": "^0.29.8", + "esbuild": "^0.17.18", + "grpc-tools": "^1.12.4", + "nodemon": "^2.0.22", + "pkg": "^5.8.1", + "prisma": "4.13.0", + "ts-node": "10.9.1", + "tsconfig-paths": "^4.2.0", + "typescript": "5.0.2", + "vite-tsconfig-paths": "^4.2.0", + "vitest": "^0.29.8", + "vitest-mock-extended": "^1.1.3" + }, + "prisma": { + "seed": "ts-node prisma/seed.ts" + }, + "pkg": { + "scripts": "./src/dist/index.js", + "assets": [ + "./prisma/**/*", + "../proto/**/*" + ], + "targets": [ + "node18-macos-arm64", + "node18-linux-x64", + "node18-linux-arm64" + ], + "outputPath": "bin/" + } +} diff --git a/services/order/pnpm-lock.yaml b/services/order/pnpm-lock.yaml new file mode 100644 index 00000000..89c3b1e5 --- /dev/null +++ b/services/order/pnpm-lock.yaml @@ -0,0 +1,2402 @@ +lockfileVersion: '6.0' + +dependencies: + '@grpc/grpc-js': + specifier: 1.8.14 + version: 1.8.14 + '@grpc/proto-loader': + specifier: 0.7.6 + version: 0.7.6 + '@prisma/client': + specifier: 4.13.0 + version: 4.13.0(prisma@4.13.0) + dotenv: + specifier: ^16.0.3 + version: 16.0.3 + grpc-server-reflection: + specifier: ^0.1.5 + version: 0.1.5 + protobufjs: + specifier: 7.2.2 + version: 7.2.2 + +devDependencies: + '@types/node': + specifier: 18.15.9 + version: 18.15.9 + '@vitest/coverage-c8': + specifier: ^0.29.8 + version: 0.29.8(vitest@0.29.8) + esbuild: + specifier: ^0.17.18 + version: 0.17.18 + grpc-tools: + specifier: ^1.12.4 + version: 1.12.4 + nodemon: + specifier: ^2.0.22 + version: 2.0.22 + pkg: + specifier: ^5.8.1 + version: 5.8.1 + prisma: + specifier: 4.13.0 + version: 4.13.0 + ts-node: + specifier: 10.9.1 + version: 10.9.1(@types/node@18.15.9)(typescript@5.0.2) + tsconfig-paths: + specifier: ^4.2.0 + version: 4.2.0 + typescript: + specifier: 5.0.2 + version: 5.0.2 + vite-tsconfig-paths: + specifier: ^4.2.0 + version: 4.2.0(typescript@5.0.2) + vitest: + specifier: ^0.29.8 + version: 0.29.8 + vitest-mock-extended: + specifier: ^1.1.3 + version: 1.1.3(typescript@5.0.2)(vitest@0.29.8) + +packages: + + /@babel/generator@7.18.2: + resolution: {integrity: sha512-W1lG5vUwFvfMd8HVXqdfbuG7RuaSrTCCD8cl8fP8wOivdbtbIg2Db3IWUcgvfxKbbn6ZBGYRW/Zk1MIwK49mgw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.19.0 + '@jridgewell/gen-mapping': 0.3.3 + jsesc: 2.5.2 + dev: true + + /@babel/helper-string-parser@7.21.5: + resolution: {integrity: sha512-5pTUx3hAJaZIdW99sJ6ZUUgWq/Y+Hja7TowEnLNMm1VivRgZQL3vpBY3qUACVsvw+yQU6+YgfBVmcbLaZtrA1w==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helper-validator-identifier@7.19.1: + resolution: {integrity: sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/parser@7.18.4: + resolution: {integrity: sha512-FDge0dFazETFcxGw/EXzOkN8uJp0PC7Qbm+Pe9T+av2zlBpOgunFHkQPPn+eRuClU73JF+98D531UgayY89tow==} + engines: {node: '>=6.0.0'} + hasBin: true + dependencies: + '@babel/types': 7.19.0 + dev: true + + /@babel/types@7.19.0: + resolution: {integrity: sha512-YuGopBq3ke25BVSiS6fgF49Ul9gH1x70Bcr6bqRLjWCkcX8Hre1/5+z+IiWOIerRMSSEfGZVB9z9kyq7wVs9YA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-string-parser': 7.21.5 + '@babel/helper-validator-identifier': 7.19.1 + 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 + + /@esbuild/android-arm64@0.17.18: + resolution: {integrity: sha512-/iq0aK0eeHgSC3z55ucMAHO05OIqmQehiGay8eP5l/5l+iEr4EIbh4/MI8xD9qRFjqzgkc0JkX0LculNC9mXBw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-arm@0.17.18: + resolution: {integrity: sha512-EmwL+vUBZJ7mhFCs5lA4ZimpUH3WMAoqvOIYhVQwdIgSpHC8ImHdsRyhHAVxpDYUSm0lWvd63z0XH1IlImS2Qw==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-x64@0.17.18: + resolution: {integrity: sha512-x+0efYNBF3NPW2Xc5bFOSFW7tTXdAcpfEg2nXmxegm4mJuVeS+i109m/7HMiOQ6M12aVGGFlqJX3RhNdYM2lWg==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-arm64@0.17.18: + resolution: {integrity: sha512-6tY+djEAdF48M1ONWnQb1C+6LiXrKjmqjzPNPWXhu/GzOHTHX2nh8Mo2ZAmBFg0kIodHhciEgUBtcYCAIjGbjQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-x64@0.17.18: + resolution: {integrity: sha512-Qq84ykvLvya3dO49wVC9FFCNUfSrQJLbxhoQk/TE1r6MjHo3sFF2tlJCwMjhkBVq3/ahUisj7+EpRSz0/+8+9A==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-arm64@0.17.18: + resolution: {integrity: sha512-fw/ZfxfAzuHfaQeMDhbzxp9mc+mHn1Y94VDHFHjGvt2Uxl10mT4CDavHm+/L9KG441t1QdABqkVYwakMUeyLRA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-x64@0.17.18: + resolution: {integrity: sha512-FQFbRtTaEi8ZBi/A6kxOC0V0E9B/97vPdYjY9NdawyLd4Qk5VD5g2pbWN2VR1c0xhzcJm74HWpObPszWC+qTew==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm64@0.17.18: + resolution: {integrity: sha512-R7pZvQZFOY2sxUG8P6A21eq6q+eBv7JPQYIybHVf1XkQYC+lT7nDBdC7wWKTrbvMXKRaGudp/dzZCwL/863mZQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm@0.17.18: + resolution: {integrity: sha512-jW+UCM40LzHcouIaqv3e/oRs0JM76JfhHjCavPxMUti7VAPh8CaGSlS7cmyrdpzSk7A+8f0hiedHqr/LMnfijg==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ia32@0.17.18: + resolution: {integrity: sha512-ygIMc3I7wxgXIxk6j3V00VlABIjq260i967Cp9BNAk5pOOpIXmd1RFQJQX9Io7KRsthDrQYrtcx7QCof4o3ZoQ==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-loong64@0.17.18: + resolution: {integrity: sha512-bvPG+MyFs5ZlwYclCG1D744oHk1Pv7j8psF5TfYx7otCVmcJsEXgFEhQkbhNW8otDHL1a2KDINW20cfCgnzgMQ==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-mips64el@0.17.18: + resolution: {integrity: sha512-oVqckATOAGuiUOa6wr8TXaVPSa+6IwVJrGidmNZS1cZVx0HqkTMkqFGD2HIx9H1RvOwFeWYdaYbdY6B89KUMxA==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ppc64@0.17.18: + resolution: {integrity: sha512-3dLlQO+b/LnQNxgH4l9rqa2/IwRJVN9u/bK63FhOPB4xqiRqlQAU0qDU3JJuf0BmaH0yytTBdoSBHrb2jqc5qQ==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-riscv64@0.17.18: + resolution: {integrity: sha512-/x7leOyDPjZV3TcsdfrSI107zItVnsX1q2nho7hbbQoKnmoeUWjs+08rKKt4AUXju7+3aRZSsKrJtaRmsdL1xA==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-s390x@0.17.18: + resolution: {integrity: sha512-cX0I8Q9xQkL/6F5zWdYmVf5JSQt+ZfZD2bJudZrWD+4mnUvoZ3TDDXtDX2mUaq6upMFv9FlfIh4Gfun0tbGzuw==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-x64@0.17.18: + resolution: {integrity: sha512-66RmRsPlYy4jFl0vG80GcNRdirx4nVWAzJmXkevgphP1qf4dsLQCpSKGM3DUQCojwU1hnepI63gNZdrr02wHUA==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/netbsd-x64@0.17.18: + resolution: {integrity: sha512-95IRY7mI2yrkLlTLb1gpDxdC5WLC5mZDi+kA9dmM5XAGxCME0F8i4bYH4jZreaJ6lIZ0B8hTrweqG1fUyW7jbg==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/openbsd-x64@0.17.18: + resolution: {integrity: sha512-WevVOgcng+8hSZ4Q3BKL3n1xTv5H6Nb53cBrtzzEjDbbnOmucEVcZeGCsCOi9bAOcDYEeBZbD2SJNBxlfP3qiA==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/sunos-x64@0.17.18: + resolution: {integrity: sha512-Rzf4QfQagnwhQXVBS3BYUlxmEbcV7MY+BH5vfDZekU5eYpcffHSyjU8T0xucKVuOcdCsMo+Ur5wmgQJH2GfNrg==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-arm64@0.17.18: + resolution: {integrity: sha512-Kb3Ko/KKaWhjeAm2YoT/cNZaHaD1Yk/pa3FTsmqo9uFh1D1Rfco7BBLIPdDOozrObj2sahslFuAQGvWbgWldAg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-ia32@0.17.18: + resolution: {integrity: sha512-0/xUMIdkVHwkvxfbd5+lfG7mHOf2FRrxNbPiKWg9C4fFrB8H0guClmaM3BFiRUYrznVoyxTIyC/Ou2B7QQSwmw==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-x64@0.17.18: + resolution: {integrity: sha512-qU25Ma1I3NqTSHJUOKi9sAH1/Mzuvlke0ioMJRthLXKm7JiSKVwFghlGbDLOO2sARECGhja4xYfRAZNPAkooYg==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@grpc/grpc-js@1.8.14: + resolution: {integrity: sha512-w84maJ6CKl5aApCMzFll0hxtFNT6or9WwMslobKaqWUEf1K+zhlL43bSQhFreyYWIWR+Z0xnVFC1KtLm4ZpM/A==} + engines: {node: ^8.13.0 || >=10.10.0} + dependencies: + '@grpc/proto-loader': 0.7.6 + '@types/node': 18.15.9 + dev: false + + /@grpc/proto-loader@0.7.6: + resolution: {integrity: sha512-QyAXR8Hyh7uMDmveWxDSUcJr9NAWaZ2I6IXgAYvQmfflwouTM+rArE2eEaCtLlRqO81j7pRLCt81IefUei6Zbw==} + engines: {node: '>=6'} + hasBin: true + dependencies: + '@types/long': 4.0.2 + lodash.camelcase: 4.3.0 + long: 4.0.0 + protobufjs: 7.2.2 + yargs: 16.2.0 + dev: false + + /@istanbuljs/schema@0.1.3: + resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} + engines: {node: '>=8'} + 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.18 + dev: true + + /@jridgewell/resolve-uri@3.1.0: + resolution: {integrity: sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==} + engines: {node: '>=6.0.0'} + 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.14: + resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==} + dev: true + + /@jridgewell/sourcemap-codec@1.4.15: + resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + dev: true + + /@jridgewell/trace-mapping@0.3.18: + resolution: {integrity: sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==} + dependencies: + '@jridgewell/resolve-uri': 3.1.0 + '@jridgewell/sourcemap-codec': 1.4.14 + 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 + + /@mapbox/node-pre-gyp@1.0.10: + resolution: {integrity: sha512-4ySo4CjzStuprMwk35H5pPbkymjv1SF3jGLj6rAHp/xT/RF7TL7bd9CTm1xDY49K2qF7jmR/g7k+SkLETP6opA==} + hasBin: true + dependencies: + detect-libc: 2.0.1 + https-proxy-agent: 5.0.1 + make-dir: 3.1.0 + node-fetch: 2.6.10 + nopt: 5.0.0 + npmlog: 5.0.1 + rimraf: 3.0.2 + semver: 7.5.0 + tar: 6.1.14 + transitivePeerDependencies: + - encoding + - supports-color + dev: true + + /@nodelib/fs.scandir@2.1.5: + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + dev: true + + /@nodelib/fs.stat@2.0.5: + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + dev: true + + /@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: true + + /@prisma/client@4.13.0(prisma@4.13.0): + resolution: {integrity: sha512-YaiiICcRB2hatxsbnfB66uWXjcRw3jsZdlAVxmx0cFcTc/Ad/sKdHCcWSnqyDX47vAewkjRFwiLwrOUjswVvmA==} + engines: {node: '>=14.17'} + requiresBuild: true + peerDependencies: + prisma: '*' + peerDependenciesMeta: + prisma: + optional: true + dependencies: + '@prisma/engines-version': 4.13.0-50.1e7af066ee9cb95cf3a403c78d9aab3e6b04f37a + prisma: 4.13.0 + dev: false + + /@prisma/engines-version@4.13.0-50.1e7af066ee9cb95cf3a403c78d9aab3e6b04f37a: + resolution: {integrity: sha512-fsQlbkhPJf08JOzKoyoD9atdUijuGBekwoOPZC3YOygXEml1MTtgXVpnUNchQlRSY82OQ6pSGQ9PxUe4arcSLQ==} + dev: false + + /@prisma/engines@4.13.0: + resolution: {integrity: sha512-HrniowHRZXHuGT9XRgoXEaP2gJLXM5RMoItaY2PkjvuZ+iHc0Zjbm/302MB8YsPdWozAPHHn+jpFEcEn71OgPw==} + requiresBuild: true + + /@protobufjs/aspromise@1.1.2: + resolution: {integrity: sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==} + dev: false + + /@protobufjs/base64@1.1.2: + resolution: {integrity: sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==} + dev: false + + /@protobufjs/codegen@2.0.4: + resolution: {integrity: sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==} + dev: false + + /@protobufjs/eventemitter@1.1.0: + resolution: {integrity: sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==} + dev: false + + /@protobufjs/fetch@1.1.0: + resolution: {integrity: sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==} + dependencies: + '@protobufjs/aspromise': 1.1.2 + '@protobufjs/inquire': 1.1.0 + dev: false + + /@protobufjs/float@1.0.2: + resolution: {integrity: sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==} + dev: false + + /@protobufjs/inquire@1.1.0: + resolution: {integrity: sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==} + dev: false + + /@protobufjs/path@1.1.2: + resolution: {integrity: sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==} + dev: false + + /@protobufjs/pool@1.1.0: + resolution: {integrity: sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==} + dev: false + + /@protobufjs/utf8@1.1.0: + resolution: {integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==} + 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.3: + resolution: {integrity: sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==} + dev: true + + /@types/chai-subset@1.3.3: + resolution: {integrity: sha512-frBecisrNGz+F4T6bcc+NLeolfiojh5FxW2klu669+8BARtyQv2C/GkNW6FUodVe4BroGMP/wER/YDGc7rEllw==} + dependencies: + '@types/chai': 4.3.5 + dev: true + + /@types/chai@4.3.5: + resolution: {integrity: sha512-mEo1sAde+UCE6b2hxn332f1g1E8WfYRu6p5SvTKr2ZKC1f7gFJXk4h5PyGP9Dt6gCaG8y8XhwnXWC6Iy2cmBng==} + dev: true + + /@types/istanbul-lib-coverage@2.0.4: + resolution: {integrity: sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==} + dev: true + + /@types/long@4.0.2: + resolution: {integrity: sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==} + dev: false + + /@types/node@18.15.9: + resolution: {integrity: sha512-dUxhiNzBLr6IqlZXz6e/rN2YQXlFgOei/Dxy+e3cyXTJ4txSUbGT2/fmnD6zd/75jDMeW5bDee+YXxlFKHoV0A==} + + /@vitest/coverage-c8@0.29.8(vitest@0.29.8): + resolution: {integrity: sha512-y+sEMQMctWokjnSqm3FCQEYFkjLrYaznsxEZHxcx8z2aftpYg3A5tvI1S5himfdEFo7o+OeHzh40bPSWZHW4oQ==} + peerDependencies: + vitest: '>=0.29.0 <1' + dependencies: + c8: 7.13.0 + picocolors: 1.0.0 + std-env: 3.3.3 + vitest: 0.29.8 + dev: true + + /@vitest/expect@0.29.8: + resolution: {integrity: sha512-xlcVXn5I5oTq6NiZSY3ykyWixBxr5mG8HYtjvpgg6KaqHm0mvhX18xuwl5YGxIRNt/A5jidd7CWcNHrSvgaQqQ==} + dependencies: + '@vitest/spy': 0.29.8 + '@vitest/utils': 0.29.8 + chai: 4.3.7 + dev: true + + /@vitest/runner@0.29.8: + resolution: {integrity: sha512-FzdhnRDwEr/A3Oo1jtIk/B952BBvP32n1ObMEb23oEJNO+qO5cBet6M2XWIDQmA7BDKGKvmhUf2naXyp/2JEwQ==} + dependencies: + '@vitest/utils': 0.29.8 + p-limit: 4.0.0 + pathe: 1.1.0 + dev: true + + /@vitest/spy@0.29.8: + resolution: {integrity: sha512-VdjBe9w34vOMl5I5mYEzNX8inTxrZ+tYUVk9jxaZJmHFwmDFC/GV3KBFTA/JKswr3XHvZL+FE/yq5EVhb6pSAw==} + dependencies: + tinyspy: 1.1.1 + dev: true + + /@vitest/utils@0.29.8: + resolution: {integrity: sha512-qGzuf3vrTbnoY+RjjVVIBYfuWMjn3UMUqyQtdGNZ6ZIIyte7B37exj6LaVkrZiUTvzSadVvO/tJm8AEgbGCBPg==} + dependencies: + cli-truncate: 3.1.0 + diff: 5.1.0 + loupe: 2.3.6 + pretty-format: 27.5.1 + dev: true + + /abbrev@1.1.1: + resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} + dev: true + + /acorn-walk@8.2.0: + resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} + engines: {node: '>=0.4.0'} + dev: true + + /acorn@8.8.2: + resolution: {integrity: sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==} + engines: {node: '>=0.4.0'} + hasBin: true + dev: true + + /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 + dev: true + + /ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + /ansi-regex@6.0.1: + resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} + engines: {node: '>=12'} + dev: true + + /ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + dependencies: + color-convert: 2.0.1 + + /ansi-styles@5.2.0: + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} + engines: {node: '>=10'} + dev: true + + /ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + dev: true + + /anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + dev: true + + /aproba@2.0.0: + resolution: {integrity: sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==} + dev: true + + /are-we-there-yet@2.0.0: + resolution: {integrity: sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==} + engines: {node: '>=10'} + dependencies: + delegates: 1.0.0 + readable-stream: 3.6.2 + dev: true + + /arg@4.1.3: + resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} + dev: true + + /array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + dev: true + + /assertion-error@1.1.0: + resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} + dev: true + + /at-least-node@1.0.0: + resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} + engines: {node: '>= 4.0.0'} + dev: true + + /balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + dev: true + + /base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + dev: true + + /binary-extensions@2.2.0: + resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} + engines: {node: '>=8'} + dev: true + + /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: true + + /brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + dev: true + + /braces@3.0.2: + resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + engines: {node: '>=8'} + dependencies: + fill-range: 7.0.1 + dev: true + + /buffer@5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + dev: true + + /c8@7.13.0: + resolution: {integrity: sha512-/NL4hQTv1gBL6J6ei80zu3IiTrmePDKXKXOTLpHvcIWZTVYQlDhVWjjWvkhICylE8EwwnMVzDZugCvdx0/DIIA==} + engines: {node: '>=10.12.0'} + hasBin: true + dependencies: + '@bcoe/v8-coverage': 0.2.3 + '@istanbuljs/schema': 0.1.3 + find-up: 5.0.0 + foreground-child: 2.0.0 + istanbul-lib-coverage: 3.2.0 + istanbul-lib-report: 3.0.0 + istanbul-reports: 3.1.5 + rimraf: 3.0.2 + test-exclude: 6.0.0 + v8-to-istanbul: 9.1.0 + yargs: 16.2.0 + yargs-parser: 20.2.9 + dev: true + + /cac@6.7.14: + resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} + engines: {node: '>=8'} + dev: true + + /chai@4.3.7: + resolution: {integrity: sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==} + engines: {node: '>=4'} + dependencies: + assertion-error: 1.1.0 + check-error: 1.0.2 + deep-eql: 4.1.3 + get-func-name: 2.0.0 + loupe: 2.3.6 + pathval: 1.1.1 + type-detect: 4.0.8 + dev: true + + /chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + dev: true + + /check-error@1.0.2: + resolution: {integrity: sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==} + dev: true + + /chokidar@3.5.3: + resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} + engines: {node: '>= 8.10.0'} + dependencies: + anymatch: 3.1.3 + braces: 3.0.2 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.2 + dev: true + + /chownr@1.1.4: + resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} + dev: true + + /chownr@2.0.0: + resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} + engines: {node: '>=10'} + dev: true + + /cli-truncate@3.1.0: + resolution: {integrity: sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + slice-ansi: 5.0.0 + string-width: 5.1.2 + dev: true + + /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 + + /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.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + /color-support@1.1.3: + resolution: {integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==} + hasBin: true + dev: true + + /concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + dev: true + + /console-control-strings@1.1.0: + resolution: {integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==} + dev: true + + /convert-source-map@1.9.0: + resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} + dev: true + + /core-util-is@1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + dev: true + + /create-require@1.1.1: + resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} + dev: true + + /cross-spawn@7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + dev: true + + /debug@3.2.7(supports-color@5.5.0): + resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.3 + supports-color: 5.5.0 + dev: true + + /debug@4.3.4: + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.2 + dev: true + + /decompress-response@6.0.0: + resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} + engines: {node: '>=10'} + dependencies: + mimic-response: 3.1.0 + dev: true + + /deep-eql@4.1.3: + resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==} + engines: {node: '>=6'} + dependencies: + type-detect: 4.0.8 + dev: true + + /deep-extend@0.6.0: + resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} + engines: {node: '>=4.0.0'} + dev: true + + /delegates@1.0.0: + resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==} + dev: true + + /detect-libc@2.0.1: + resolution: {integrity: sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==} + engines: {node: '>=8'} + dev: true + + /diff@4.0.2: + resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} + engines: {node: '>=0.3.1'} + dev: true + + /diff@5.1.0: + resolution: {integrity: sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==} + 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 + dev: true + + /dotenv@16.0.3: + resolution: {integrity: sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==} + engines: {node: '>=12'} + dev: false + + /eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + dev: true + + /emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + /emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + dev: true + + /end-of-stream@1.4.4: + resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + dependencies: + once: 1.4.0 + dev: true + + /esbuild@0.17.18: + resolution: {integrity: sha512-z1lix43jBs6UKjcZVKOw2xx69ffE2aG0PygLL5qJ9OS/gy0Ewd1gW/PUQIOIQGXBHWNywSc0floSKoMFF8aK2w==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/android-arm': 0.17.18 + '@esbuild/android-arm64': 0.17.18 + '@esbuild/android-x64': 0.17.18 + '@esbuild/darwin-arm64': 0.17.18 + '@esbuild/darwin-x64': 0.17.18 + '@esbuild/freebsd-arm64': 0.17.18 + '@esbuild/freebsd-x64': 0.17.18 + '@esbuild/linux-arm': 0.17.18 + '@esbuild/linux-arm64': 0.17.18 + '@esbuild/linux-ia32': 0.17.18 + '@esbuild/linux-loong64': 0.17.18 + '@esbuild/linux-mips64el': 0.17.18 + '@esbuild/linux-ppc64': 0.17.18 + '@esbuild/linux-riscv64': 0.17.18 + '@esbuild/linux-s390x': 0.17.18 + '@esbuild/linux-x64': 0.17.18 + '@esbuild/netbsd-x64': 0.17.18 + '@esbuild/openbsd-x64': 0.17.18 + '@esbuild/sunos-x64': 0.17.18 + '@esbuild/win32-arm64': 0.17.18 + '@esbuild/win32-ia32': 0.17.18 + '@esbuild/win32-x64': 0.17.18 + dev: true + + /escalade@3.1.1: + resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} + engines: {node: '>=6'} + + /expand-template@2.0.3: + resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} + engines: {node: '>=6'} + dev: true + + /fast-glob@3.2.12: + resolution: {integrity: sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==} + 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: true + + /fastq@1.15.0: + resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} + dependencies: + reusify: 1.0.4 + dev: true + + /fill-range@7.0.1: + resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} + engines: {node: '>=8'} + dependencies: + to-regex-range: 5.0.1 + dev: true + + /find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + dev: true + + /foreground-child@2.0.0: + resolution: {integrity: sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==} + engines: {node: '>=8.0.0'} + dependencies: + cross-spawn: 7.0.3 + signal-exit: 3.0.7 + dev: true + + /from2@2.3.0: + resolution: {integrity: sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==} + dependencies: + inherits: 2.0.4 + readable-stream: 2.3.8 + dev: true + + /fs-constants@1.0.0: + resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} + dev: true + + /fs-extra@9.1.0: + resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==} + engines: {node: '>=10'} + dependencies: + at-least-node: 1.0.0 + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.0 + dev: true + + /fs-minipass@2.1.0: + resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} + engines: {node: '>= 8'} + dependencies: + minipass: 3.3.6 + dev: true + + /fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + dev: true + + /fsevents@2.3.2: + resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /function-bind@1.1.1: + resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} + dev: true + + /gauge@3.0.2: + resolution: {integrity: sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==} + engines: {node: '>=10'} + dependencies: + aproba: 2.0.0 + color-support: 1.1.3 + console-control-strings: 1.1.0 + has-unicode: 2.0.1 + object-assign: 4.1.1 + signal-exit: 3.0.7 + string-width: 4.2.3 + strip-ansi: 6.0.1 + wide-align: 1.1.5 + dev: true + + /get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + + /get-func-name@2.0.0: + resolution: {integrity: sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==} + dev: true + + /github-from-package@0.0.0: + resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==} + dev: true + + /glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + dependencies: + is-glob: 4.0.3 + dev: true + + /glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + dev: true + + /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.2.12 + ignore: 5.2.4 + merge2: 1.4.1 + slash: 3.0.0 + dev: true + + /globrex@0.1.2: + resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} + dev: true + + /google-protobuf@3.21.2: + resolution: {integrity: sha512-3MSOYFO5U9mPGikIYCzK0SaThypfGgS6bHqrUGXG3DPHCrb+txNqeEcns1W0lkGfk0rCyNXm7xB9rMxnCiZOoA==} + dev: false + + /graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + dev: true + + /grpc-server-reflection@0.1.5: + resolution: {integrity: sha512-i69RYu6v65enzknNAPUgerFuVQfo+L3n9g4c1A/Sv5jUHMpxMIjSbBA+YWls9Sr4Flac4oohp4Gx8f389CaHuw==} + dependencies: + google-protobuf: 3.21.2 + dev: false + + /grpc-tools@1.12.4: + resolution: {integrity: sha512-5+mLAJJma3BjnW/KQp6JBjUMgvu7Mu3dBvBPd1dcbNIb+qiR0817zDpgPjS7gRb+l/8EVNIa3cB02xI9JLToKg==} + hasBin: true + requiresBuild: true + dependencies: + '@mapbox/node-pre-gyp': 1.0.10 + transitivePeerDependencies: + - encoding + - supports-color + dev: true + + /has-flag@3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + dev: true + + /has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + dev: true + + /has-unicode@2.0.1: + resolution: {integrity: sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==} + dev: true + + /has@1.0.3: + resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} + engines: {node: '>= 0.4.0'} + dependencies: + function-bind: 1.1.1 + dev: true + + /html-escaper@2.0.2: + resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} + dev: true + + /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 + dev: true + + /ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + dev: true + + /ignore-by-default@1.0.1: + resolution: {integrity: sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==} + dev: true + + /ignore@5.2.4: + resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} + engines: {node: '>= 4'} + dev: true + + /inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + dev: true + + /inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + dev: true + + /ini@1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + dev: true + + /into-stream@6.0.0: + resolution: {integrity: sha512-XHbaOAvP+uFKUFsOgoNPRjLkwB+I22JFPFe5OjTkQ0nwgj6+pSjb4NmB6VMxaPshLiOf+zcpOCBQuLwC1KHhZA==} + engines: {node: '>=10'} + dependencies: + from2: 2.3.0 + p-is-promise: 3.0.0 + dev: true + + /is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + dependencies: + binary-extensions: 2.2.0 + dev: true + + /is-core-module@2.12.0: + resolution: {integrity: sha512-RECHCBCd/viahWmwj6enj19sKbHfJrddi/6cBDsNTKbNq0f7VeaUkBo60BqzvPqo/W54ChS62Z5qyun7cfOMqQ==} + dependencies: + has: 1.0.3 + dev: true + + /is-core-module@2.9.0: + resolution: {integrity: sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==} + dependencies: + has: 1.0.3 + dev: true + + /is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + dev: true + + /is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + /is-fullwidth-code-point@4.0.0: + resolution: {integrity: sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==} + engines: {node: '>=12'} + dev: true + + /is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + dependencies: + is-extglob: 2.1.1 + dev: true + + /is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + dev: true + + /isarray@1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + dev: true + + /isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + dev: true + + /istanbul-lib-coverage@3.2.0: + resolution: {integrity: sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==} + engines: {node: '>=8'} + dev: true + + /istanbul-lib-report@3.0.0: + resolution: {integrity: sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==} + engines: {node: '>=8'} + dependencies: + istanbul-lib-coverage: 3.2.0 + make-dir: 3.1.0 + supports-color: 7.2.0 + dev: true + + /istanbul-reports@3.1.5: + resolution: {integrity: sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==} + engines: {node: '>=8'} + dependencies: + html-escaper: 2.0.2 + istanbul-lib-report: 3.0.0 + dev: true + + /jsesc@2.5.2: + resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} + engines: {node: '>=4'} + hasBin: true + dev: true + + /json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + dev: true + + /jsonc-parser@3.2.0: + resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} + dev: true + + /jsonfile@6.1.0: + resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + dependencies: + universalify: 2.0.0 + optionalDependencies: + graceful-fs: 4.2.11 + dev: true + + /local-pkg@0.4.3: + resolution: {integrity: sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==} + engines: {node: '>=14'} + dev: true + + /locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + dependencies: + p-locate: 5.0.0 + dev: true + + /lodash.camelcase@4.3.0: + resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} + dev: false + + /long@4.0.0: + resolution: {integrity: sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==} + dev: false + + /long@5.2.3: + resolution: {integrity: sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==} + dev: false + + /loupe@2.3.6: + resolution: {integrity: sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==} + dependencies: + get-func-name: 2.0.0 + dev: true + + /lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + dependencies: + yallist: 4.0.0 + dev: true + + /make-dir@3.1.0: + resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} + engines: {node: '>=8'} + dependencies: + semver: 6.3.0 + dev: true + + /make-error@1.3.6: + resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + dev: true + + /merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + dev: true + + /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: true + + /mimic-response@3.1.0: + resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} + engines: {node: '>=10'} + dev: true + + /minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + dependencies: + brace-expansion: 1.1.11 + dev: true + + /minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + dev: true + + /minipass@3.3.6: + resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} + engines: {node: '>=8'} + dependencies: + yallist: 4.0.0 + dev: true + + /minipass@5.0.0: + resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} + engines: {node: '>=8'} + dev: true + + /minizlib@2.1.2: + resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} + engines: {node: '>= 8'} + dependencies: + minipass: 3.3.6 + yallist: 4.0.0 + dev: true + + /mkdirp-classic@0.5.3: + resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} + dev: true + + /mkdirp@1.0.4: + resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} + engines: {node: '>=10'} + hasBin: true + dev: true + + /mlly@1.2.0: + resolution: {integrity: sha512-+c7A3CV0KGdKcylsI6khWyts/CYrGTrRVo4R/I7u/cUsy0Conxa6LUhiEzVKIw14lc2L5aiO4+SeVe4TeGRKww==} + dependencies: + acorn: 8.8.2 + pathe: 1.1.0 + pkg-types: 1.0.3 + ufo: 1.1.2 + dev: true + + /ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + dev: true + + /ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + dev: true + + /multistream@4.1.0: + resolution: {integrity: sha512-J1XDiAmmNpRCBfIWJv+n0ymC4ABcf/Pl+5YvC5B/D2f/2+8PtHvCNxMPKiQcZyi922Hq69J2YOpb1pTywfifyw==} + dependencies: + once: 1.4.0 + readable-stream: 3.6.2 + dev: true + + /nanoid@3.3.6: + resolution: {integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + dev: true + + /napi-build-utils@1.0.2: + resolution: {integrity: sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==} + dev: true + + /node-abi@3.40.0: + resolution: {integrity: sha512-zNy02qivjjRosswoYmPi8hIKJRr8MpQyeKT6qlcq/OnOgA3Rhoae+IYOqsM9V5+JnHWmxKnWOT2GxvtqdtOCXA==} + engines: {node: '>=10'} + dependencies: + semver: 7.5.0 + dev: true + + /node-fetch@2.6.10: + resolution: {integrity: sha512-5YytjUVbwzjE/BX4N62vnPPkGNxlJPwdA9/ArUc4pcM6cYS4Hinuv4VazzwjMGgnWuiQqcemOanib/5PpcsGug==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + dependencies: + whatwg-url: 5.0.0 + dev: true + + /nodemon@2.0.22: + resolution: {integrity: sha512-B8YqaKMmyuCO7BowF1Z1/mkPqLk6cs/l63Ojtd6otKjMx47Dq1utxfRxcavH1I7VSaL8n5BUaoutadnsX3AAVQ==} + engines: {node: '>=8.10.0'} + hasBin: true + dependencies: + chokidar: 3.5.3 + debug: 3.2.7(supports-color@5.5.0) + ignore-by-default: 1.0.1 + minimatch: 3.1.2 + pstree.remy: 1.1.8 + semver: 5.7.1 + simple-update-notifier: 1.1.0 + supports-color: 5.5.0 + touch: 3.1.0 + undefsafe: 2.0.5 + dev: true + + /nopt@1.0.10: + resolution: {integrity: sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==} + hasBin: true + dependencies: + abbrev: 1.1.1 + dev: true + + /nopt@5.0.0: + resolution: {integrity: sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==} + engines: {node: '>=6'} + hasBin: true + dependencies: + abbrev: 1.1.1 + dev: true + + /normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + dev: true + + /npmlog@5.0.1: + resolution: {integrity: sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==} + dependencies: + are-we-there-yet: 2.0.0 + console-control-strings: 1.1.0 + gauge: 3.0.2 + set-blocking: 2.0.0 + dev: true + + /object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + dev: true + + /once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + dependencies: + wrappy: 1.0.2 + dev: true + + /p-is-promise@3.0.0: + resolution: {integrity: sha512-Wo8VsW4IRQSKVXsJCn7TomUaVtyfjVDn3nUP7kE967BQk0CwFpdbZs0X0uk5sW9mkBa9eNM7hCMaG93WUAwxYQ==} + engines: {node: '>=8'} + dev: true + + /p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + dependencies: + yocto-queue: 0.1.0 + dev: true + + /p-limit@4.0.0: + resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + yocto-queue: 1.0.0 + dev: true + + /p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + dependencies: + p-limit: 3.1.0 + dev: true + + /path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + dev: true + + /path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + dev: true + + /path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + dev: true + + /path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + dev: true + + /path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + dev: true + + /pathe@1.1.0: + resolution: {integrity: sha512-ODbEPR0KKHqECXW1GoxdDb+AZvULmXjVPy4rt+pGo2+TnjJTIPJQSVS6N63n8T2Ip+syHhbn52OewKicV0373w==} + dev: true + + /pathval@1.1.1: + resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} + dev: true + + /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'} + dev: true + + /pkg-fetch@3.4.2: + resolution: {integrity: sha512-0+uijmzYcnhC0hStDjm/cl2VYdrmVVBpe7Q8k9YBojxmR5tG8mvR9/nooQq3QSXiQqORDVOTY3XqMEqJVIzkHA==} + hasBin: true + dependencies: + chalk: 4.1.2 + fs-extra: 9.1.0 + https-proxy-agent: 5.0.1 + node-fetch: 2.6.10 + progress: 2.0.3 + semver: 7.5.0 + tar-fs: 2.1.1 + yargs: 16.2.0 + transitivePeerDependencies: + - encoding + - supports-color + dev: true + + /pkg-types@1.0.3: + resolution: {integrity: sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==} + dependencies: + jsonc-parser: 3.2.0 + mlly: 1.2.0 + pathe: 1.1.0 + dev: true + + /pkg@5.8.1: + resolution: {integrity: sha512-CjBWtFStCfIiT4Bde9QpJy0KeH19jCfwZRJqHFDFXfhUklCx8JoFmMj3wgnEYIwGmZVNkhsStPHEOnrtrQhEXA==} + hasBin: true + peerDependencies: + node-notifier: '>=9.0.1' + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@babel/generator': 7.18.2 + '@babel/parser': 7.18.4 + '@babel/types': 7.19.0 + chalk: 4.1.2 + fs-extra: 9.1.0 + globby: 11.1.0 + into-stream: 6.0.0 + is-core-module: 2.9.0 + minimist: 1.2.8 + multistream: 4.1.0 + pkg-fetch: 3.4.2 + prebuild-install: 7.1.1 + resolve: 1.22.2 + stream-meter: 1.0.4 + transitivePeerDependencies: + - encoding + - supports-color + dev: true + + /postcss@8.4.23: + resolution: {integrity: sha512-bQ3qMcpF6A/YjR55xtoTr0jGOlnPOKAIMdOWiv0EIT6HVPEaJiJB4NLljSbiHoC2RX7DN5Uvjtpbg1NPdwv1oA==} + engines: {node: ^10 || ^12 || >=14} + dependencies: + nanoid: 3.3.6 + picocolors: 1.0.0 + source-map-js: 1.0.2 + dev: true + + /prebuild-install@7.1.1: + resolution: {integrity: sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==} + engines: {node: '>=10'} + hasBin: true + dependencies: + detect-libc: 2.0.1 + expand-template: 2.0.3 + github-from-package: 0.0.0 + minimist: 1.2.8 + mkdirp-classic: 0.5.3 + napi-build-utils: 1.0.2 + node-abi: 3.40.0 + pump: 3.0.0 + rc: 1.2.8 + simple-get: 4.0.1 + tar-fs: 2.1.1 + tunnel-agent: 0.6.0 + dev: true + + /pretty-format@27.5.1: + resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + ansi-regex: 5.0.1 + ansi-styles: 5.2.0 + react-is: 17.0.2 + dev: true + + /prisma@4.13.0: + resolution: {integrity: sha512-L9mqjnSmvWIRCYJ9mQkwCtj4+JDYYTdhoyo8hlsHNDXaZLh/b4hR0IoKIBbTKxZuyHQzLopb/+0Rvb69uGV7uA==} + engines: {node: '>=14.17'} + hasBin: true + requiresBuild: true + dependencies: + '@prisma/engines': 4.13.0 + + /process-nextick-args@2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + dev: true + + /progress@2.0.3: + resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} + engines: {node: '>=0.4.0'} + dev: true + + /protobufjs@7.2.2: + resolution: {integrity: sha512-++PrQIjrom+bFDPpfmqXfAGSQs40116JRrqqyf53dymUMvvb5d/LMRyicRoF1AUKoXVS1/IgJXlEgcpr4gTF3Q==} + engines: {node: '>=12.0.0'} + requiresBuild: true + dependencies: + '@protobufjs/aspromise': 1.1.2 + '@protobufjs/base64': 1.1.2 + '@protobufjs/codegen': 2.0.4 + '@protobufjs/eventemitter': 1.1.0 + '@protobufjs/fetch': 1.1.0 + '@protobufjs/float': 1.0.2 + '@protobufjs/inquire': 1.1.0 + '@protobufjs/path': 1.1.2 + '@protobufjs/pool': 1.1.0 + '@protobufjs/utf8': 1.1.0 + '@types/node': 18.15.9 + long: 5.2.3 + dev: false + + /pstree.remy@1.1.8: + resolution: {integrity: sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==} + dev: true + + /pump@3.0.0: + resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} + dependencies: + end-of-stream: 1.4.4 + once: 1.4.0 + dev: true + + /queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + dev: true + + /rc@1.2.8: + resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} + hasBin: true + dependencies: + deep-extend: 0.6.0 + ini: 1.3.8 + minimist: 1.2.8 + strip-json-comments: 2.0.1 + dev: true + + /react-is@17.0.2: + resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} + 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: true + + /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: true + + /readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + dependencies: + picomatch: 2.3.1 + dev: true + + /require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + + /resolve@1.22.2: + resolution: {integrity: sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==} + hasBin: true + dependencies: + is-core-module: 2.12.0 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + dev: true + + /reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + dev: true + + /rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + hasBin: true + dependencies: + glob: 7.2.3 + dev: true + + /rollup@3.21.5: + resolution: {integrity: sha512-a4NTKS4u9PusbUJcfF4IMxuqjFzjm6ifj76P54a7cKnvVzJaG12BLVR+hgU2YDGHzyMMQNxLAZWuALsn8q2oQg==} + engines: {node: '>=14.18.0', npm: '>=8.0.0'} + hasBin: true + optionalDependencies: + fsevents: 2.3.2 + dev: true + + /run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + dependencies: + queue-microtask: 1.2.3 + dev: true + + /safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + dev: true + + /safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + dev: true + + /semver@5.7.1: + resolution: {integrity: sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==} + hasBin: true + dev: true + + /semver@6.3.0: + resolution: {integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==} + hasBin: true + dev: true + + /semver@7.0.0: + resolution: {integrity: sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==} + hasBin: true + dev: true + + /semver@7.5.0: + resolution: {integrity: sha512-+XC0AD/R7Q2mPSRuy2Id0+CGTZ98+8f+KvwirxOKIEyid+XSx6HbC63p+O4IndTHuX5Z+JxQ0TghCkO5Cg/2HA==} + engines: {node: '>=10'} + hasBin: true + dependencies: + lru-cache: 6.0.0 + dev: true + + /set-blocking@2.0.0: + resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} + dev: true + + /shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + dependencies: + shebang-regex: 3.0.0 + dev: true + + /shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + 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==} + dev: true + + /simple-concat@1.0.1: + resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} + dev: true + + /simple-get@4.0.1: + resolution: {integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==} + dependencies: + decompress-response: 6.0.0 + once: 1.4.0 + simple-concat: 1.0.1 + dev: true + + /simple-update-notifier@1.1.0: + resolution: {integrity: sha512-VpsrsJSUcJEseSbMHkrsrAVSdvVS5I96Qo1QAQ4FxQ9wXFcB+pjj7FB7/us9+GcgfW4ziHtYMc1J0PLczb55mg==} + engines: {node: '>=8.10.0'} + dependencies: + semver: 7.0.0 + dev: true + + /slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + dev: true + + /slice-ansi@5.0.0: + resolution: {integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==} + engines: {node: '>=12'} + dependencies: + ansi-styles: 6.2.1 + is-fullwidth-code-point: 4.0.0 + dev: true + + /source-map-js@1.0.2: + resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} + engines: {node: '>=0.10.0'} + dev: true + + /source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + dev: true + + /stackback@0.0.2: + resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + dev: true + + /std-env@3.3.3: + resolution: {integrity: sha512-Rz6yejtVyWnVjC1RFvNmYL10kgjC49EOghxWn0RFqlCHGFpQx+Xe7yW3I4ceK1SGrWIGMjD5Kbue8W/udkbMJg==} + dev: true + + /stream-meter@1.0.4: + resolution: {integrity: sha512-4sOEtrbgFotXwnEuzzsQBYEV1elAeFSO8rSGeTwabuX1RRn/kEq9JVH7I0MRBhKVRR0sJkr0M0QCH7yOLf9fhQ==} + dependencies: + readable-stream: 2.3.8 + 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.0.1 + dev: true + + /string_decoder@1.1.1: + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + dependencies: + safe-buffer: 5.1.2 + dev: true + + /string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + dependencies: + safe-buffer: 5.2.1 + dev: true + + /strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + dependencies: + ansi-regex: 5.0.1 + + /strip-ansi@7.0.1: + resolution: {integrity: sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==} + engines: {node: '>=12'} + dependencies: + ansi-regex: 6.0.1 + dev: true + + /strip-bom@3.0.0: + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} + dev: true + + /strip-json-comments@2.0.1: + resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} + engines: {node: '>=0.10.0'} + dev: true + + /strip-literal@1.0.1: + resolution: {integrity: sha512-QZTsipNpa2Ppr6v1AmJHESqJ3Uz247MUS0OjrnnZjFAvEoWqxuyFuXn2xLgMtRnijJShAa1HL0gtJyUs7u7n3Q==} + dependencies: + acorn: 8.8.2 + dev: true + + /supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + dependencies: + has-flag: 3.0.0 + dev: true + + /supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + dependencies: + has-flag: 4.0.0 + dev: true + + /supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + dev: true + + /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: true + + /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: true + + /tar@6.1.14: + resolution: {integrity: sha512-piERznXu0U7/pW7cdSn7hjqySIVTYT6F76icmFk7ptU7dDYlXTm5r9A6K04R2vU3olYgoKeo1Cg3eeu5nhftAw==} + engines: {node: '>=10'} + dependencies: + chownr: 2.0.0 + fs-minipass: 2.1.0 + minipass: 5.0.0 + minizlib: 2.1.2 + mkdirp: 1.0.4 + yallist: 4.0.0 + dev: true + + /test-exclude@6.0.0: + resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} + engines: {node: '>=8'} + dependencies: + '@istanbuljs/schema': 0.1.3 + glob: 7.2.3 + minimatch: 3.1.2 + dev: true + + /tinybench@2.5.0: + resolution: {integrity: sha512-kRwSG8Zx4tjF9ZiyH4bhaebu+EDz1BOx9hOigYHlUW4xxI/wKIUQUqo018UlU4ar6ATPBsaMrdbKZ+tmPdohFA==} + dev: true + + /tinypool@0.4.0: + resolution: {integrity: sha512-2ksntHOKf893wSAH4z/+JbPpi92esw8Gn9N2deXX+B0EO92hexAVI9GIZZPx7P5aYo5KULfeOSt3kMOmSOy6uA==} + engines: {node: '>=14.0.0'} + dev: true + + /tinyspy@1.1.1: + resolution: {integrity: sha512-UVq5AXt/gQlti7oxoIg5oi/9r0WpF7DGEVwXgqWSMmyN16+e3tl5lIvTaOpJ3TAtu5xFzWccFRM4R5NaWHF+4g==} + engines: {node: '>=14.0.0'} + 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 + dev: true + + /touch@3.1.0: + resolution: {integrity: sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==} + hasBin: true + dependencies: + nopt: 1.0.10 + dev: true + + /tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + dev: true + + /ts-essentials@9.3.2(typescript@5.0.2): + resolution: {integrity: sha512-JxKJzuWqH1MmH4ZFHtJzGEhkfN3QvVR3C3w+4BIoWeoY68UVVoA2Np/Bca9z0IPSErVCWhv439aT0We4Dks8kQ==} + peerDependencies: + typescript: '>=4.1.0' + dependencies: + typescript: 5.0.2 + dev: true + + /ts-node@10.9.1(@types/node@18.15.9)(typescript@5.0.2): + 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.3 + '@types/node': 18.15.9 + acorn: 8.8.2 + 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.0.2 + v8-compile-cache-lib: 3.0.1 + yn: 3.1.1 + dev: true + + /tsconfck@2.1.1(typescript@5.0.2): + resolution: {integrity: sha512-ZPCkJBKASZBmBUNqGHmRhdhM8pJYDdOXp4nRgj/O0JwUwsMq50lCDRQP/M5GBNAA0elPrq4gAeu4dkaVCuKWww==} + engines: {node: ^14.13.1 || ^16 || >=18} + hasBin: true + peerDependencies: + typescript: ^4.3.5 || ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + dependencies: + typescript: 5.0.2 + 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 + + /tunnel-agent@0.6.0: + resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} + dependencies: + safe-buffer: 5.2.1 + dev: true + + /type-detect@4.0.8: + resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} + engines: {node: '>=4'} + dev: true + + /typescript@5.0.2: + resolution: {integrity: sha512-wVORMBGO/FAs/++blGNeAVdbNKtIh1rbBL2EyQ1+J9lClJ93KiiKe8PmFIVdXhHcyv44SL9oglmfeSsndo0jRw==} + engines: {node: '>=12.20'} + hasBin: true + dev: true + + /ufo@1.1.2: + resolution: {integrity: sha512-TrY6DsjTQQgyS3E3dBaOXf0TpPD8u9FVrVYmKVegJuFw51n/YB9XPt+U6ydzFG5ZIN7+DIjPbNmXoBj9esYhgQ==} + dev: true + + /undefsafe@2.0.5: + resolution: {integrity: sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==} + dev: true + + /universalify@2.0.0: + resolution: {integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==} + engines: {node: '>= 10.0.0'} + dev: true + + /util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + dev: true + + /v8-compile-cache-lib@3.0.1: + resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} + dev: true + + /v8-to-istanbul@9.1.0: + resolution: {integrity: sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA==} + engines: {node: '>=10.12.0'} + dependencies: + '@jridgewell/trace-mapping': 0.3.18 + '@types/istanbul-lib-coverage': 2.0.4 + convert-source-map: 1.9.0 + dev: true + + /vite-node@0.29.8(@types/node@18.15.9): + resolution: {integrity: sha512-b6OtCXfk65L6SElVM20q5G546yu10/kNrhg08afEoWlFRJXFq9/6glsvSVY+aI6YeC1tu2TtAqI2jHEQmOmsFw==} + engines: {node: '>=v14.16.0'} + hasBin: true + dependencies: + cac: 6.7.14 + debug: 4.3.4 + mlly: 1.2.0 + pathe: 1.1.0 + picocolors: 1.0.0 + vite: 4.3.5(@types/node@18.15.9) + transitivePeerDependencies: + - '@types/node' + - less + - sass + - stylus + - sugarss + - supports-color + - terser + dev: true + + /vite-tsconfig-paths@4.2.0(typescript@5.0.2): + resolution: {integrity: sha512-jGpus0eUy5qbbMVGiTxCL1iB9ZGN6Bd37VGLJU39kTDD6ZfULTTb1bcc5IeTWqWJKiWV5YihCaibeASPiGi8kw==} + peerDependencies: + vite: '*' + peerDependenciesMeta: + vite: + optional: true + dependencies: + debug: 4.3.4 + globrex: 0.1.2 + tsconfck: 2.1.1(typescript@5.0.2) + transitivePeerDependencies: + - supports-color + - typescript + dev: true + + /vite@4.3.5(@types/node@18.15.9): + resolution: {integrity: sha512-0gEnL9wiRFxgz40o/i/eTBwm+NEbpUeTWhzKrZDSdKm6nplj+z4lKz8ANDgildxHm47Vg8EUia0aicKbawUVVA==} + engines: {node: ^14.18.0 || >=16.0.0} + hasBin: true + peerDependencies: + '@types/node': '>= 14' + less: '*' + sass: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + dependencies: + '@types/node': 18.15.9 + esbuild: 0.17.18 + postcss: 8.4.23 + rollup: 3.21.5 + optionalDependencies: + fsevents: 2.3.2 + dev: true + + /vitest-mock-extended@1.1.3(typescript@5.0.2)(vitest@0.29.8): + resolution: {integrity: sha512-MiaKYZbTg+fjozKnCpoTTva0BnlSNYyk4jiPuM2xVhg4aou112QIrALdH3/ZKK6qfXWh0A17gFIjWJjylOlXxg==} + peerDependencies: + typescript: 3.x || 4.x || 5.x + vitest: '>=0.29.2' + dependencies: + ts-essentials: 9.3.2(typescript@5.0.2) + typescript: 5.0.2 + vitest: 0.29.8 + dev: true + + /vitest@0.29.8: + resolution: {integrity: sha512-JIAVi2GK5cvA6awGpH0HvH/gEG9PZ0a/WoxdiV3PmqK+3CjQMf8c+J/Vhv4mdZ2nRyXFw66sAg6qz7VNkaHfDQ==} + engines: {node: '>=v14.16.0'} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@vitest/browser': '*' + '@vitest/ui': '*' + happy-dom: '*' + jsdom: '*' + playwright: '*' + safaridriver: '*' + webdriverio: '*' + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@vitest/browser': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true + playwright: + optional: true + safaridriver: + optional: true + webdriverio: + optional: true + dependencies: + '@types/chai': 4.3.5 + '@types/chai-subset': 1.3.3 + '@types/node': 18.15.9 + '@vitest/expect': 0.29.8 + '@vitest/runner': 0.29.8 + '@vitest/spy': 0.29.8 + '@vitest/utils': 0.29.8 + acorn: 8.8.2 + acorn-walk: 8.2.0 + cac: 6.7.14 + chai: 4.3.7 + debug: 4.3.4 + local-pkg: 0.4.3 + pathe: 1.1.0 + picocolors: 1.0.0 + source-map: 0.6.1 + std-env: 3.3.3 + strip-literal: 1.0.1 + tinybench: 2.5.0 + tinypool: 0.4.0 + tinyspy: 1.1.1 + vite: 4.3.5(@types/node@18.15.9) + vite-node: 0.29.8(@types/node@18.15.9) + why-is-node-running: 2.2.2 + transitivePeerDependencies: + - less + - sass + - stylus + - sugarss + - supports-color + - terser + dev: true + + /webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + dev: true + + /whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + dev: true + + /which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + dependencies: + 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 + + /wide-align@1.1.5: + resolution: {integrity: sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==} + dependencies: + string-width: 4.2.3 + 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 + + /wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + dev: true + + /y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + + /yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + dev: true + + /yargs-parser@20.2.9: + resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} + engines: {node: '>=10'} + + /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 + + /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'} + dev: true + + /yocto-queue@1.0.0: + resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} + engines: {node: '>=12.20'} + dev: true diff --git a/services/order/prisma/schema.prisma b/services/order/prisma/schema.prisma new file mode 100644 index 00000000..521926d7 --- /dev/null +++ b/services/order/prisma/schema.prisma @@ -0,0 +1,49 @@ +datasource db { + provider = "mongodb" + url = env("DATABASE_URL") +} + +generator client { + provider = "prisma-client-js" + binaryTargets = ["native", "linux-musl", "linux-musl-openssl-3.0.x"] +} + +enum Status { + PENDING + IN_PROGRESS + FULFILLED + REJECTED +} + +model UserMinimum { + id String @id @default(cuid()) @map("_id") + + first_name String + last_name String + email String + phone String + + orders Order[] +} + +model Basket { + id String @id @default(cuid()) @map("_id") + json String + total Float + + Order Order? +} + +model Order { + id String @id @default(cuid()) @map("_id") + + payment_id String + delivery_id String + status Status @default(PENDING) + + user UserMinimum @relation(fields: [user_id], references: [id]) + user_id String + + basket_snapshot Basket @relation(fields: [basket_snapshot_id], references: [id]) + basket_snapshot_id String @unique +} diff --git a/services/order/prisma/seed.ts b/services/order/prisma/seed.ts new file mode 100644 index 00000000..7334c4c0 --- /dev/null +++ b/services/order/prisma/seed.ts @@ -0,0 +1,27 @@ +import { PrismaClient, Prisma } from "@prisma/client"; + +const prisma = new PrismaClient(); + + + +async function main() { + console.log(`Start seeding ...`); + // for (const d of deliveries) { + // const delivery = await prisma.delivery.create({ + // data: d, + // }); + // console.log(`Created delivery with id: ${delivery.id}`); + // } + console.log(`Seeding finished.`); +} + +main() + .then(async () => { + await prisma.$disconnect(); + }) + .catch(async (e) => { + console.error(e); + await prisma.$disconnect(); + // @ts-ignore + process.exit(1); + }); diff --git a/services/order/proto b/services/order/proto new file mode 120000 index 00000000..4d1e2d8b --- /dev/null +++ b/services/order/proto @@ -0,0 +1 @@ +../proto/ \ No newline at end of file diff --git a/services/order/reflection_descriptor.bin b/services/order/reflection_descriptor.bin new file mode 100644 index 0000000000000000000000000000000000000000..1814264c3d1cd940648b8245fe7998362324f81a GIT binary patch literal 1380 zcmbtU%Wl&^6ph^^#MdQ>E-Xv|6-;@Eg%{}`khoD$NGqGHgIiCjA@&&0q*6bi|G-!A z4{Z1j#$#JJW{^^`urzb-nX7Zpxib6&FliQ&%t|GY#MlQt3N7uK_QvqU37-O7Mj7L)B#4QnOWcsiLIC&}jCD{|_hhw~1G4xKIwTIF zwbhn|;(`KAuV_N7PJzmc{RF!20``?~L}-6uG$}R6vwf>W=QN*0r7sO`Vv_Kc&|T^) zky(g`V1{HJU6br4uNMlTf&}3h+8Z&xlxU6)oxd$|YW8@NjAIy_OR+1K1Sz|sTn=N7 z4pi@pxx9Yy#4lgq2)c|1e8a4+Fru%1>q~}LGVSLum=Z3X@W{6fVZ3RG{X+vBXC&Zc zizafc`Bda<{L`nxN0m>xga6}Gz6y8p$^I?|TBc!hAjP8A2E6+s{D~u%xLX`YfD^JN z4XYc!Y5a1Om{WAKG)JF9BBPX~`wB-zq#p$BGd uxA2vUTO;h+vlg$qXN|B^&re|1ELZoe5vrcARr74|itOyxc~|~YkADMZ!=*w1 literal 0 HcmV?d00001 diff --git a/services/order/src/handlers/.gitinclude b/services/order/src/handlers/.gitinclude new file mode 100644 index 00000000..e69de29b diff --git a/services/order/tsconfig.json b/services/order/tsconfig.json new file mode 100644 index 00000000..f7f47ecc --- /dev/null +++ b/services/order/tsconfig.json @@ -0,0 +1,18 @@ +{ + "compilerOptions": { + "sourceMap": true, + "outDir": "dist", + "strict": true, + "lib": ["esnext"], + "esModuleInterop": true, + "baseUrl": ".", + "paths": { + "@order/*": ["src/*"] + } + }, + "include": ["src/**/*.ts"], + "exclude": ["node_modules"], + "ts-node": { + "require": ["tsconfig-paths/register"] + } +} diff --git a/services/order/vitest.config.ts b/services/order/vitest.config.ts new file mode 100644 index 00000000..773de309 --- /dev/null +++ b/services/order/vitest.config.ts @@ -0,0 +1,10 @@ +import { defineConfig } from "vitest/config"; +import tsconfigPaths from "vite-tsconfig-paths"; + +export default defineConfig({ + plugins: [tsconfigPaths()], + base: "/src/tests", + // test: { + // setupFiles: ["./src/tests/setup.ts"], + // }, +}); diff --git a/services/proto/order.proto b/services/proto/order.proto index cc428597..12012b35 100644 --- a/services/proto/order.proto +++ b/services/proto/order.proto @@ -1,6 +1,6 @@ syntax = "proto3"; -package com.goodfood.ordering; +package com.goodfood.order; enum Status { PENDING = 0; @@ -18,7 +18,7 @@ enum Status { } message Basket { - + string json = 1; // TODO: to be implemented } @@ -28,12 +28,47 @@ message Order { string id = 1; - string payment_id = 3; - string delivery_id = 4; + string payment_id = 2; + string delivery_id = 3; - UserMinimum user = 2; + UserMinimum user = 4; Basket basket_snapshot = 5; Status status = 6; } +service OrderService { + rpc GetOrder(GetOrderRequest) returns (Order) {} + rpc CreateOrder(CreateOrderRequest) returns (Order) {} + rpc UpdateOrder(UpdateOrderRequest) returns (Order) {} + rpc DeleteOrder(DeleteOrderRequest) returns (DeleteOrderResponse) {} +} + +message GetOrderRequest { + string id = 1; +} + +message CreateOrderRequest { + string payment_id = 1; + string delivery_id = 2; + + UserMinimum user = 3; + Basket basket_snapshot = 4; +} + +message UpdateOrderRequest{ + string id = 1; + + string payment_id = 2; + string delivery_id = 3; + + Status status = 4; +} + +message DeleteOrderRequest { + string id = 1; +} + +message DeleteOrderResponse { + string id = 1; +} From 3eaf2d96372e6225c233181540780fe25c1d1b97 Mon Sep 17 00:00:00 2001 From: Florian LEROUX <10078837+floriaaan@users.noreply.github.com> Date: Tue, 9 May 2023 14:37:19 +0200 Subject: [PATCH 086/883] feat(k8s): add k8s config files --- services/order/k8s/configmap.yml | 8 ++++++++ services/order/k8s/deployment.yml | 31 +++++++++++++++++++++++++++++++ services/order/k8s/hpa.yml | 18 ++++++++++++++++++ services/order/k8s/ingress.yml | 17 +++++++++++++++++ services/order/k8s/service.yml | 13 +++++++++++++ 5 files changed, 87 insertions(+) create mode 100644 services/order/k8s/configmap.yml create mode 100644 services/order/k8s/deployment.yml create mode 100644 services/order/k8s/hpa.yml create mode 100644 services/order/k8s/ingress.yml create mode 100644 services/order/k8s/service.yml diff --git a/services/order/k8s/configmap.yml b/services/order/k8s/configmap.yml new file mode 100644 index 00000000..7df0eea5 --- /dev/null +++ b/services/order/k8s/configmap.yml @@ -0,0 +1,8 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: goodfood-order-configmap + labels: + app: goodfood-order +data: + port: "50007" \ No newline at end of file diff --git a/services/order/k8s/deployment.yml b/services/order/k8s/deployment.yml new file mode 100644 index 00000000..4a19c90c --- /dev/null +++ b/services/order/k8s/deployment.yml @@ -0,0 +1,31 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: goodfood-order + labels: + app: goodfood-order +spec: + selector: + matchLabels: + app: goodfood-order + template: + metadata: + labels: + app: goodfood-order + spec: + containers: + - name: goodfood-order + image: floriaaan/goodfood-order:1.0.0 + imagePullPolicy: Always + resources: + limits: + memory: "128Mi" + cpu: "200m" + env: + - name: PORT + valueFrom: + configMapKeyRef: + name: goodfood-order-configmap + key: port + ports: + - containerPort: 50007 diff --git a/services/order/k8s/hpa.yml b/services/order/k8s/hpa.yml new file mode 100644 index 00000000..d41ba971 --- /dev/null +++ b/services/order/k8s/hpa.yml @@ -0,0 +1,18 @@ +apiVersion: autoscaling/v2 +kind: HorizontalPodAutoscaler +metadata: + name: goodfood-order-hpa +spec: + scaleTargetRef: + apiVersion: apps/v1 + kind: Deployment + name: goodfood-order + minReplicas: 1 + maxReplicas: 3 + metrics: + - type: Resource + resource: + name: cpu + target: + type: Utilization + averageUtilization: 50 diff --git a/services/order/k8s/ingress.yml b/services/order/k8s/ingress.yml new file mode 100644 index 00000000..165a428d --- /dev/null +++ b/services/order/k8s/ingress.yml @@ -0,0 +1,17 @@ +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + name: goodfood-order +spec: + ingressClassName: nginx + rules: + - host: order.localdev.me + http: + paths: + - pathType: Prefix + backend: + service: + name: goodfood-order + port: + number: 50007 + path: / \ No newline at end of file diff --git a/services/order/k8s/service.yml b/services/order/k8s/service.yml new file mode 100644 index 00000000..b13d0350 --- /dev/null +++ b/services/order/k8s/service.yml @@ -0,0 +1,13 @@ +apiVersion: v1 +kind: Service +metadata: + name: goodfood-order +spec: + selector: + app: goodfood-order + ports: + - name: "grpc" + port: 50007 + targetPort: 50007 +status: + loadBalancer: {} From e548effc21294e35d3aa2a2a40f53124591f1891 Mon Sep 17 00:00:00 2001 From: Florian LEROUX <10078837+floriaaan@users.noreply.github.com> Date: Tue, 9 May 2023 14:37:37 +0200 Subject: [PATCH 087/883] feat(grpc): add grpc config files --- services/order/src/lib/reflection.ts | 23 +++++++++ .../order/src/resources/grpc-credentials.ts | 5 ++ .../src/resources/protoloader-options.ts | 7 +++ services/order/src/types/index.d.ts | 3 ++ services/order/src/types/order.d.ts | 48 +++++++++++++++++++ 5 files changed, 86 insertions(+) create mode 100644 services/order/src/lib/reflection.ts create mode 100644 services/order/src/resources/grpc-credentials.ts create mode 100644 services/order/src/resources/protoloader-options.ts create mode 100644 services/order/src/types/index.d.ts create mode 100644 services/order/src/types/order.d.ts diff --git a/services/order/src/lib/reflection.ts b/services/order/src/lib/reflection.ts new file mode 100644 index 00000000..e00ef94e --- /dev/null +++ b/services/order/src/lib/reflection.ts @@ -0,0 +1,23 @@ +import { Server } from "@grpc/grpc-js"; +import { log } from "@order/lib/log"; +import { access, constants } from "fs"; +import { addReflection as base_addReflection } from "grpc-server-reflection"; +import { resolve as resolvePath } from "path"; + +export const addReflection = (server: Server, path: string) => { + if (process.env.NODE_ENV === "production") { + log.warn("Reflection is disabled in production"); + return; + } + + const resolvedPath = resolvePath(path); + try { + access(resolvedPath, constants.R_OK, () => {}); + + base_addReflection(server, path); + } catch (err) { + console.log("here"); + log.warn(`Reflection file ${resolvedPath} is not readable`); + return; + } +}; diff --git a/services/order/src/resources/grpc-credentials.ts b/services/order/src/resources/grpc-credentials.ts new file mode 100644 index 00000000..75a2b5d5 --- /dev/null +++ b/services/order/src/resources/grpc-credentials.ts @@ -0,0 +1,5 @@ +import { credentials, ServerCredentials } from "@grpc/grpc-js"; + +export const insecure = credentials.createInsecure(); + +export const serverInsecure = ServerCredentials.createInsecure(); diff --git a/services/order/src/resources/protoloader-options.ts b/services/order/src/resources/protoloader-options.ts new file mode 100644 index 00000000..5022d96d --- /dev/null +++ b/services/order/src/resources/protoloader-options.ts @@ -0,0 +1,7 @@ +export const options = { + keepCase: true, + longs: String, + enums: String, + defaults: true, + oneofs: true, +}; diff --git a/services/order/src/types/index.d.ts b/services/order/src/types/index.d.ts new file mode 100644 index 00000000..edf2bebf --- /dev/null +++ b/services/order/src/types/index.d.ts @@ -0,0 +1,3 @@ +export type Data = { + request: T; +}; diff --git a/services/order/src/types/order.d.ts b/services/order/src/types/order.d.ts new file mode 100644 index 00000000..9d4db67b --- /dev/null +++ b/services/order/src/types/order.d.ts @@ -0,0 +1,48 @@ +import { Status } from "@prisma/client"; + +export type UserMinimum = { + id: string; + first_name: string; + last_name: string; + email: string; + phone: string; +}; + +export type Basket = { + json: string; // TODO: to be implemented +}; + +export type Order = { + id: string; + payment_id: string; + delivery_id: string; + user: UserMinimum; + basket_snapshot: Basket; + status: Status; +}; + +export type GetOrderRequest = { + id: string; +}; + +export type CreateOrderRequest = { + payment_id: string; + delivery_id: string; + user: UserMinimum; + basket_snapshot: Basket; +}; + +export type UpdateOrderRequest = { + id: string; + payment_id: string; + delivery_id: string; + status: Status; +}; + +export type DeleteOrderRequest = { + id: string; +}; + +export type DeleteOrderResponse = { + id: string; +}; From 3f56e24996f5ff22c63a25296b457f2a9fe403bd Mon Sep 17 00:00:00 2001 From: Florian LEROUX <10078837+floriaaan@users.noreply.github.com> Date: Tue, 9 May 2023 14:37:47 +0200 Subject: [PATCH 088/883] feat(libs): add libs --- services/order/src/lib/log.ts | 74 ++++++++++++++++++++++++++++++++ services/order/src/lib/prisma.ts | 29 +++++++++++++ 2 files changed, 103 insertions(+) create mode 100644 services/order/src/lib/log.ts create mode 100644 services/order/src/lib/prisma.ts diff --git a/services/order/src/lib/log.ts b/services/order/src/lib/log.ts new file mode 100644 index 00000000..2404af54 --- /dev/null +++ b/services/order/src/lib/log.ts @@ -0,0 +1,74 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ +/* eslint-disable no-console */ + +function getStackTrace() { + let stack; + + try { + throw new Error(""); + } catch (error) { + stack = (error as Error).stack || ""; + } + + stack = stack.split("\n").map((line) => line.trim()); + return stack.splice(stack[0] === "Error" ? 2 : 1); +} + +const getInitiator = () => { + // _getInitiatorLine, _ObjectInfoLine, caller + const [, , caller] = getStackTrace(); + const file = caller.split("/").at(-1) || ""; + return file.replace(")", ""); +}; + +const warn = (...args: any[]) => { + console.group( + `\x1b[33m${new Date().toISOString()} - WARN - ${getInitiator()}\x1b[0m` + ); + console.warn(...args); + console.groupEnd(); +}; +const error = (...args: any[]) => { + console.group( + `\x1b[31m${new Date().toISOString()} - ERROR - ${getInitiator()}\x1b[0m` + ); + console.error(...args); + console.groupEnd(); +}; +const info = (...args: any[]) => { + console.group( + `\x1b[34m${new Date().toISOString()} - INFO - ${getInitiator()}\x1b[0m` + ); + console.log(...args); + console.groupEnd(); +}; +const debug = (...args: any[]) => { + console.log(...args); +}; + +/** + * @description a simple interface logger for logging to the console and into a log drain in the future + * @example + * log.warn('this is a warning'); + * log.error('this is an error'); + * log.info('this is an info'); + * @exports log + */ +export const log = { + warn, + error, + info, + debug, +}; + +export const utils = { + bold: (text: string) => `\x1b[1m${text}\x1b[0m`, + red: (text: string) => `\x1b[31m${text}\x1b[0m`, + green: (text: string) => `\x1b[32m${text}\x1b[0m`, + yellow: (text: string) => `\x1b[33m${text}\x1b[0m`, + blue: (text: string) => `\x1b[34m${text}\x1b[0m`, + magenta: (text: string) => `\x1b[35m${text}\x1b[0m`, + cyan: (text: string) => `\x1b[36m${text}\x1b[0m`, + white: (text: string) => `\x1b[37m${text}\x1b[0m`, + gray: (text: string) => `\x1b[90m${text}\x1b[0m`, +}; diff --git a/services/order/src/lib/prisma.ts b/services/order/src/lib/prisma.ts new file mode 100644 index 00000000..4d495ef0 --- /dev/null +++ b/services/order/src/lib/prisma.ts @@ -0,0 +1,29 @@ +import { Prisma, PrismaClient } from "@prisma/client"; + +let prisma: PrismaClient; +type GlobalWithPrisma = typeof globalThis & { + prisma: PrismaClient; +}; + +const OPTIONS: Prisma.PrismaClientOptions = { + log: + process.env.NEXT_PUBLIC_APP_ENV !== "production" + ? ["info", "warn"] + : undefined, +}; + +if (process.env.NODE_ENV === "production") { + prisma = new PrismaClient(OPTIONS); +} else { + // Ensure the prisma instance is re-used during hot-reloading + // Otherwise, a new client will be created on every reload + if (!("prisma" in global)) { + (global as GlobalWithPrisma).prisma = new PrismaClient(OPTIONS); + } + + prisma = (global as GlobalWithPrisma).prisma; +} + +export default prisma; + +export { prisma }; From 8cd3a572edc02a93cf9839e12ba8fad996f1f6c8 Mon Sep 17 00:00:00 2001 From: Florian LEROUX <10078837+floriaaan@users.noreply.github.com> Date: Tue, 9 May 2023 14:38:00 +0200 Subject: [PATCH 089/883] feat(handlers): add handlers --- services/order/src/handlers/order/create.ts | 35 +++++++++++++++++++++ services/order/src/handlers/order/delete.ts | 21 +++++++++++++ services/order/src/handlers/order/get.ts | 22 +++++++++++++ services/order/src/handlers/order/index.ts | 13 ++++++++ services/order/src/handlers/order/update.ts | 31 ++++++++++++++++++ 5 files changed, 122 insertions(+) create mode 100644 services/order/src/handlers/order/create.ts create mode 100644 services/order/src/handlers/order/delete.ts create mode 100644 services/order/src/handlers/order/get.ts create mode 100644 services/order/src/handlers/order/index.ts create mode 100644 services/order/src/handlers/order/update.ts diff --git a/services/order/src/handlers/order/create.ts b/services/order/src/handlers/order/create.ts new file mode 100644 index 00000000..5ed878d0 --- /dev/null +++ b/services/order/src/handlers/order/create.ts @@ -0,0 +1,35 @@ +import { prisma } from "@order/lib/prisma"; +import { log } from "@order/lib/log"; +import { CreateOrderRequest, Order } from "@order/types/order"; +import { Data } from "@order/types"; + +export const CreateOrder = async ( + { request }: Data, + callback: (err: any, response: Order | null) => void +) => { + log.debug("request received at CreateOrder handler\n", request); + try { + const { basket_snapshot, delivery_id, payment_id, user } = request; + + // todo: calculate total from basket_snapshot + const total = 0; // basket_snapshot.reduce; + + const order = await prisma.order.create({ + data: { + delivery_id, + payment_id, + user: { connectOrCreate: { where: { id: user.id }, create: user } }, + basket_snapshot: { + create: { json: basket_snapshot.json, total }, + }, + }, + include: { basket_snapshot: true, user: true }, + }); + + console.log("order", order) + callback(null, order); + } catch (error) { + log.error(error); + callback(error, null); + } +}; diff --git a/services/order/src/handlers/order/delete.ts b/services/order/src/handlers/order/delete.ts new file mode 100644 index 00000000..1fa59615 --- /dev/null +++ b/services/order/src/handlers/order/delete.ts @@ -0,0 +1,21 @@ +import { prisma } from "@order/lib/prisma"; +import { log } from "@order/lib/log"; +import { DeleteOrderRequest, DeleteOrderResponse } from "@order/types/order"; +import { Data } from "@order/types"; + +export const DeleteOrder = async ( + { request }: Data, + callback: (err: any, response: DeleteOrderResponse | null) => void +) => { + log.debug("request received at DeleteOrder handler\n", request); + try { + const { id } = request; + const order = await prisma.order.delete({ + where: { id }, + }); + callback(null, { id: order.id }); + } catch (error) { + log.error(error); + callback(error, null); + } +}; diff --git a/services/order/src/handlers/order/get.ts b/services/order/src/handlers/order/get.ts new file mode 100644 index 00000000..f6dd99ae --- /dev/null +++ b/services/order/src/handlers/order/get.ts @@ -0,0 +1,22 @@ +import { prisma } from "@order/lib/prisma"; +import { log } from "@order/lib/log"; +import { GetOrderRequest, Order } from "@order/types/order"; +import { Data } from "@order/types"; + +export const GetOrder = async ( + { request }: Data, + callback: (err: any, response: Order | null) => void +) => { + log.debug("request received at GetOrder handler\n", request); + try { + const { id } = request; + const order = await prisma.order.findUniqueOrThrow({ + where: { id }, + include: { basket_snapshot: true, user: true }, + }); + callback(null, order); + } catch (error) { + log.error(error); + callback(error, null); + } +}; diff --git a/services/order/src/handlers/order/index.ts b/services/order/src/handlers/order/index.ts new file mode 100644 index 00000000..6294989f --- /dev/null +++ b/services/order/src/handlers/order/index.ts @@ -0,0 +1,13 @@ +import { CreateOrder } from "./create"; +import { GetOrder } from "./get"; +import { UpdateOrder } from "./update"; +import { DeleteOrder } from "./delete"; + +const orderHandlers = { + CreateOrder, + GetOrder, + UpdateOrder, + DeleteOrder, +}; + +export default orderHandlers; diff --git a/services/order/src/handlers/order/update.ts b/services/order/src/handlers/order/update.ts new file mode 100644 index 00000000..107aabdc --- /dev/null +++ b/services/order/src/handlers/order/update.ts @@ -0,0 +1,31 @@ +import { prisma } from "@order/lib/prisma"; +import { log } from "@order/lib/log"; +import { UpdateOrderRequest, Order } from "@order/types/order"; +import { Data } from "@order/types"; + +export const UpdateOrder = async ( + { request }: Data, + callback: (err: any, response: Order | null) => void +) => { + log.debug("request received at UpdateOrder handler\n", request); + try { + const { delivery_id, payment_id, id, status } = request; + + // todo: calculate total from basket_snapshot + const total = 0; // basket_snapshot.reduce; + + const order = await prisma.order.update({ + where: { id }, + data: { + delivery_id, + payment_id, + status, + }, + include: { basket_snapshot: true, user: true }, + }); + callback(null, order); + } catch (error) { + log.error(error); + callback(error, null); + } +}; From e8f80b6f96426465bb75a051fb96c5499c9cd1ef Mon Sep 17 00:00:00 2001 From: Florian LEROUX <10078837+floriaaan@users.noreply.github.com> Date: Tue, 9 May 2023 14:38:11 +0200 Subject: [PATCH 090/883] feat(server): add main server --- services/order/src/server.ts | 48 ++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 services/order/src/server.ts diff --git a/services/order/src/server.ts b/services/order/src/server.ts new file mode 100644 index 00000000..b64ba69b --- /dev/null +++ b/services/order/src/server.ts @@ -0,0 +1,48 @@ +import "dotenv/config"; +import { resolve as resolvePath } from "path"; + +import { loadSync } from "@grpc/proto-loader"; +import { + loadPackageDefinition, + Server, + ServiceDefinition, +} from "@grpc/grpc-js"; + +import { log, utils } from "@order/lib/log"; +import { options } from "@order/resources/protoloader-options"; +import { serverInsecure } from "@order/resources/grpc-credentials"; +import { addReflection } from "@order/lib/reflection"; +import orderHandlers from "@order/handlers/order"; + +const PORT = process.env.PORT || 50007; +const ADDRESS = `0.0.0.0:${PORT}`; + +const PROTO_PATH = resolvePath(__dirname + "/../../proto/order.proto"); +// const REFLECTION_PATH = resolvePath( +// __dirname + "/../reflection_descriptor.bin" +// ); + +const packageDefinition = loadSync(PROTO_PATH, options); +const grpc = loadPackageDefinition(packageDefinition); +const order = grpc as unknown as { + com: { goodfood: { order: { OrderService: ServiceDefinition } } }; +}["com"]["goodfood"]["order"]["OrderService"]; + +const server = new Server(); +server.addService(order, orderHandlers); + +server.bindAsync(ADDRESS, serverInsecure, (err) => { + if (err) { + log.error(err); + process.exit(1); + } + server.start(); + // addReflection(server, REFLECTION_PATH); + const message = + `---- ${utils.green("good")}${utils.yellow("food")} Order Service ----` + + `\n` + + `started on: ${utils.bold(ADDRESS)} ${utils.green("✓")}\n`; + log.debug(message); +}); + +export default server; From 7d7e0a3fc80697eaa84651b2436dcfda11459cbe Mon Sep 17 00:00:00 2001 From: Florian LEROUX <10078837+floriaaan@users.noreply.github.com> Date: Wed, 10 May 2023 08:59:53 +0200 Subject: [PATCH 091/883] feat(ci): add workflow --- .github/workflows/order.yml | 69 +++++++++++++++++++++++++++++++++++++ services/order/.env.example | 3 +- services/order/Dockerfile | 6 ++-- 3 files changed, 74 insertions(+), 4 deletions(-) create mode 100644 .github/workflows/order.yml diff --git a/.github/workflows/order.yml b/.github/workflows/order.yml new file mode 100644 index 00000000..2551d7bf --- /dev/null +++ b/.github/workflows/order.yml @@ -0,0 +1,69 @@ +name: Delivery Microservice CI/CD + +on: + push: + branches: [ order ] + pull_request: + branches: [ dev, main ] + +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@master + - uses: pnpm/action-setup@v2 + with: + version: 7 + - uses: actions/setup-node@v3 + with: + node-version: "18.x" + cache: "pnpm" + cache-dependency-path: services/order/pnpm-lock.yaml + - name: Install dependencies + run: | + cd ./services/order + pnpm install --frozen-lockfile + - name: Build + run: | + cd ./services/order + pnpm build + + test: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@master + - uses: pnpm/action-setup@v2 + with: + version: 7 + - uses: actions/setup-node@v3 + with: + node-version: "18.x" + cache: "pnpm" + cache-dependency-path: services/order/pnpm-lock.yaml + - name: Install dependencies + run: | + cd ./services/order + pnpm install --frozen-lockfile + - name: Execute tests + run: | + cd ./services/order + pnpm test + + publish: + runs-on: ubuntu-latest + needs: [ build, test ] + steps: + - name: Checkout code + uses: actions/checkout@master + - name: Login to Docker Hub + uses: docker/login-action@v2 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + - name: Build and push + uses: docker/build-push-action@v4 + with: + context: ./services/ + file: ./services/order/Dockerfile + push: true + tags: floriaaan/goodfood-order:latest \ No newline at end of file diff --git a/services/order/.env.example b/services/order/.env.example index 23313f7e..54d2fa33 100644 --- a/services/order/.env.example +++ b/services/order/.env.example @@ -1,5 +1,6 @@ DB_USER=user DB_PASS=pass -DATABASE_URL=mongodb+srv://${DB_USER}:${DB_PASS}@test.kcs3xbg.mongodb.net/?retryWrites=true&w=majority +DB_HOST=mongodb +DATABASE_URL=mongodb+srv://${DB_USER}:${DB_PASS}@${DB_HOST}/order?retryWrites=true&w=majority PORT=50007 \ No newline at end of file diff --git a/services/order/Dockerfile b/services/order/Dockerfile index 19327c3e..6e37d753 100644 --- a/services/order/Dockerfile +++ b/services/order/Dockerfile @@ -4,12 +4,12 @@ FROM node:18-alpine3.17 as builder WORKDIR /app # Copy the application code -COPY ./delivery/ . +COPY ./order/ . # Install dependencies RUN npm install -# Copy the proto files - TODO: fix this, proto files should be copied from goodfood/services/proto +# Copy the proto files COPY ./proto ./proto/ # Generate Prisma client @@ -32,7 +32,7 @@ COPY --from=builder /app/proto/ /proto/ COPY --from=builder /app/node_modules/.prisma /.prisma # Expose the gRPC port -EXPOSE 50008 +EXPOSE 50007 # Start the server CMD [ "node", "index.js"] From c053ba54fa43d1ff464d6da3372959b44b9fa9b5 Mon Sep 17 00:00:00 2001 From: Florian LEROUX <10078837+floriaaan@users.noreply.github.com> Date: Wed, 10 May 2023 09:00:31 +0200 Subject: [PATCH 092/883] feat(data-structure): add toGrpc, parseStruct & toStruct methods --- services/order/prisma/schema.prisma | 10 ++- services/order/prisma/seed.ts | 96 +++++++++++++++++++-- services/order/src/handlers/order/create.ts | 13 ++- services/order/src/handlers/order/get.ts | 3 +- services/order/src/handlers/order/index.ts | 4 +- services/order/src/handlers/order/update.ts | 3 +- services/order/src/lib/struct.ts | 43 +++++++++ services/order/src/lib/transformer.ts | 21 +++++ services/order/src/server.ts | 28 ++---- services/order/src/types/order.d.ts | 5 +- services/proto/order.proto | 7 +- 11 files changed, 193 insertions(+), 40 deletions(-) create mode 100644 services/order/src/lib/struct.ts create mode 100644 services/order/src/lib/transformer.ts diff --git a/services/order/prisma/schema.prisma b/services/order/prisma/schema.prisma index 521926d7..84d76908 100644 --- a/services/order/prisma/schema.prisma +++ b/services/order/prisma/schema.prisma @@ -27,9 +27,10 @@ model UserMinimum { } model Basket { - id String @id @default(cuid()) @map("_id") - json String - total Float + id String @id @default(cuid()) @map("_id") + json Json? + string String + total Float Order Order? } @@ -46,4 +47,7 @@ model Order { basket_snapshot Basket @relation(fields: [basket_snapshot_id], references: [id]) basket_snapshot_id String @unique + + created_at DateTime @default(now()) + updated_at DateTime @updatedAt } diff --git a/services/order/prisma/seed.ts b/services/order/prisma/seed.ts index 7334c4c0..73eb3646 100644 --- a/services/order/prisma/seed.ts +++ b/services/order/prisma/seed.ts @@ -1,17 +1,97 @@ -import { PrismaClient, Prisma } from "@prisma/client"; +import { PrismaClient, Prisma, Status } from "@prisma/client"; const prisma = new PrismaClient(); - +const orders: Prisma.OrderCreateInput[] = [ + { + id: "order_id:1", + payment_id: "payment_id:1", + delivery_id: "delivery_id:1", + user: { + connectOrCreate: { + where: { id: "user_id:1" }, + create: { + id: "user_id:1", + first_name: "John", + last_name: "Doe", + email: "john@doe.com", + phone: "0612345678", + }, + }, + }, + basket_snapshot: { + create: { + json: {}, + string: JSON.stringify({}), + total: 0, + }, + }, + status: Status.PENDING, + }, + { + id: "order_id:2", + payment_id: "payment_id:2", + delivery_id: "delivery_id:2", + user: { + connectOrCreate: { + where: { id: "user_id:1" }, + create: { + id: "user_id:1", + first_name: "John", + last_name: "Doe", + email: "john@doe.com", + phone: "0612345678", + }, + }, + }, + basket_snapshot: { + create: { + json: {}, + string: JSON.stringify({}), + total: 0, + }, + }, + status: Status.FULFILLED, + }, + { + id: "order_id:3", + payment_id: "payment_id:3", + delivery_id: "delivery_id:3", + user: { + connectOrCreate: { + where: { id: "user_id:2" }, + create: { + id: "user_id:2", + first_name: "Foonie", + last_name: "Garbage", + email: "foo@gar.com", + phone: "0612345678", + }, + }, + }, + basket_snapshot: { + create: { + json: {}, + string: JSON.stringify({}), + total: 0, + }, + }, + status: Status.PENDING, + }, +]; async function main() { + console.log(`Delete existing data ...`); + await prisma.order.deleteMany(); + await prisma.userMinimum.deleteMany(); + await prisma.basket.deleteMany(); + console.log(`Existing data deleted.`); + console.log(`Start seeding ...`); - // for (const d of deliveries) { - // const delivery = await prisma.delivery.create({ - // data: d, - // }); - // console.log(`Created delivery with id: ${delivery.id}`); - // } + for (const o of orders) { + const order = await prisma.order.create({ data: o }); + console.log(`Created order with id: ${order.id}`); + } console.log(`Seeding finished.`); } diff --git a/services/order/src/handlers/order/create.ts b/services/order/src/handlers/order/create.ts index 5ed878d0..3d06d7af 100644 --- a/services/order/src/handlers/order/create.ts +++ b/services/order/src/handlers/order/create.ts @@ -2,6 +2,8 @@ import { prisma } from "@order/lib/prisma"; import { log } from "@order/lib/log"; import { CreateOrderRequest, Order } from "@order/types/order"; import { Data } from "@order/types"; +import { parseStruct } from "@order/lib/struct"; +import { toGrpc } from "@order/lib/transformer"; export const CreateOrder = async ( { request }: Data, @@ -20,14 +22,19 @@ export const CreateOrder = async ( payment_id, user: { connectOrCreate: { where: { id: user.id }, create: user } }, basket_snapshot: { - create: { json: basket_snapshot.json, total }, + create: { + string: basket_snapshot.string, + json: + parseStruct(basket_snapshot.json) || + JSON.parse(basket_snapshot.string), + total, + }, }, }, include: { basket_snapshot: true, user: true }, }); - console.log("order", order) - callback(null, order); + callback(null, toGrpc(order)); } catch (error) { log.error(error); callback(error, null); diff --git a/services/order/src/handlers/order/get.ts b/services/order/src/handlers/order/get.ts index f6dd99ae..5798e13b 100644 --- a/services/order/src/handlers/order/get.ts +++ b/services/order/src/handlers/order/get.ts @@ -2,6 +2,7 @@ import { prisma } from "@order/lib/prisma"; import { log } from "@order/lib/log"; import { GetOrderRequest, Order } from "@order/types/order"; import { Data } from "@order/types"; +import { toGrpc } from "@order/lib/transformer"; export const GetOrder = async ( { request }: Data, @@ -14,7 +15,7 @@ export const GetOrder = async ( where: { id }, include: { basket_snapshot: true, user: true }, }); - callback(null, order); + callback(null, toGrpc(order)); } catch (error) { log.error(error); callback(error, null); diff --git a/services/order/src/handlers/order/index.ts b/services/order/src/handlers/order/index.ts index 6294989f..b0757cd5 100644 --- a/services/order/src/handlers/order/index.ts +++ b/services/order/src/handlers/order/index.ts @@ -1,9 +1,11 @@ +import { UntypedServiceImplementation } from "@grpc/grpc-js"; + import { CreateOrder } from "./create"; import { GetOrder } from "./get"; import { UpdateOrder } from "./update"; import { DeleteOrder } from "./delete"; -const orderHandlers = { +const orderHandlers: UntypedServiceImplementation = { CreateOrder, GetOrder, UpdateOrder, diff --git a/services/order/src/handlers/order/update.ts b/services/order/src/handlers/order/update.ts index 107aabdc..dfb64c28 100644 --- a/services/order/src/handlers/order/update.ts +++ b/services/order/src/handlers/order/update.ts @@ -2,6 +2,7 @@ import { prisma } from "@order/lib/prisma"; import { log } from "@order/lib/log"; import { UpdateOrderRequest, Order } from "@order/types/order"; import { Data } from "@order/types"; +import { toGrpc } from "@order/lib/transformer"; export const UpdateOrder = async ( { request }: Data, @@ -23,7 +24,7 @@ export const UpdateOrder = async ( }, include: { basket_snapshot: true, user: true }, }); - callback(null, order); + callback(null, toGrpc(order)); } catch (error) { log.error(error); callback(error, null); diff --git a/services/order/src/lib/struct.ts b/services/order/src/lib/struct.ts new file mode 100644 index 00000000..1897abf1 --- /dev/null +++ b/services/order/src/lib/struct.ts @@ -0,0 +1,43 @@ +import { Prisma } from "@prisma/client"; + +export type Struct = { + fields: { + [key: string]: { + kind: string; + [key: string]: any; + }; + }; +}; + +export const parseStruct = (struct: Struct) => { + const fields = struct.fields; + + if (!fields || Object.keys(fields).length === 0) return null; + + const parsed = Object.entries(fields).reduce((acc: any, [key, value]) => { + return { + ...acc, + [key]: value[value.kind], + }; + }, {}); + + return parsed; +}; + +export const toStruct = ( + obj: { [key: string]: any } | Prisma.JsonValue | null +): Struct => { + if (!obj) return { fields: {} }; + const fields = Object.entries(obj).reduce((acc: any, [key, value]) => { + return { + ...acc, + [key]: { + [`${typeof value}Value`]: value, + }, + }; + }, {}); + + console.log(fields); + + return { fields }; +}; diff --git a/services/order/src/lib/transformer.ts b/services/order/src/lib/transformer.ts new file mode 100644 index 00000000..3e5a58fc --- /dev/null +++ b/services/order/src/lib/transformer.ts @@ -0,0 +1,21 @@ +import { toStruct } from "@order/lib/struct"; +import { Basket, Order, UserMinimum } from "@prisma/client"; + +export const toGrpc = ( + order: Order & { + user: UserMinimum; + basket_snapshot: Basket; + } +) => { + return { + id: order.id, + payment_id: order.payment_id, + delivery_id: order.delivery_id, + user: order.user, + basket_snapshot: { + string: order.basket_snapshot.string, + json: toStruct(order.basket_snapshot.json), + }, + status: order.status, + }; +}; diff --git a/services/order/src/server.ts b/services/order/src/server.ts index b64ba69b..7181463d 100644 --- a/services/order/src/server.ts +++ b/services/order/src/server.ts @@ -2,11 +2,7 @@ import "dotenv/config"; import { resolve as resolvePath } from "path"; import { loadSync } from "@grpc/proto-loader"; -import { - loadPackageDefinition, - Server, - ServiceDefinition, -} from "@grpc/grpc-js"; +import { loadPackageDefinition, Server } from "@grpc/grpc-js"; import { log, utils } from "@order/lib/log"; import { options } from "@order/resources/protoloader-options"; @@ -18,26 +14,20 @@ const PORT = process.env.PORT || 50007; const ADDRESS = `0.0.0.0:${PORT}`; const PROTO_PATH = resolvePath(__dirname + "/../../proto/order.proto"); -// const REFLECTION_PATH = resolvePath( -// __dirname + "/../reflection_descriptor.bin" -// ); +const REFLECTION_PATH = resolvePath( + __dirname + "/../reflection_descriptor.bin" +); const packageDefinition = loadSync(PROTO_PATH, options); -const grpc = loadPackageDefinition(packageDefinition); -const order = grpc as unknown as { - com: { goodfood: { order: { OrderService: ServiceDefinition } } }; -}["com"]["goodfood"]["order"]["OrderService"]; +const grpc = loadPackageDefinition(packageDefinition) as any; +const { service } = grpc.com.goodfood.order.OrderService; const server = new Server(); -server.addService(order, orderHandlers); +server.addService(service, orderHandlers); -server.bindAsync(ADDRESS, serverInsecure, (err) => { - if (err) { - log.error(err); - process.exit(1); - } +server.bindAsync(ADDRESS, serverInsecure, () => { server.start(); - // addReflection(server, REFLECTION_PATH); + addReflection(server, REFLECTION_PATH); const message = `---- ${utils.green("good")}${utils.yellow("food")} Order Service ----` + `\n` + diff --git a/services/order/src/types/order.d.ts b/services/order/src/types/order.d.ts index 9d4db67b..ba22109c 100644 --- a/services/order/src/types/order.d.ts +++ b/services/order/src/types/order.d.ts @@ -1,4 +1,4 @@ -import { Status } from "@prisma/client"; +import { Prisma, Status } from "@prisma/client"; export type UserMinimum = { id: string; @@ -9,7 +9,8 @@ export type UserMinimum = { }; export type Basket = { - json: string; // TODO: to be implemented + string: string; + json?: string | Prisma.JsonValue | any; }; export type Order = { diff --git a/services/proto/order.proto b/services/proto/order.proto index 12012b35..b6b4ac36 100644 --- a/services/proto/order.proto +++ b/services/proto/order.proto @@ -2,6 +2,9 @@ syntax = "proto3"; package com.goodfood.order; +import "google/protobuf/struct.proto"; + + enum Status { PENDING = 0; IN_PROGRESS = 1; @@ -18,8 +21,8 @@ enum Status { } message Basket { - string json = 1; - // TODO: to be implemented + string string = 1; + optional google.protobuf.Struct json = 2; } From cf26ad0908b26598aa699c9c722e0e237211e90b Mon Sep 17 00:00:00 2001 From: Florian LEROUX <10078837+floriaaan@users.noreply.github.com> Date: Wed, 10 May 2023 09:04:37 +0200 Subject: [PATCH 093/883] fix(ci): remove generate grpc reflection from npm postinstall script --- .github/workflows/order.yml | 2 +- services/order/package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/order.yml b/.github/workflows/order.yml index 2551d7bf..ed557e26 100644 --- a/.github/workflows/order.yml +++ b/.github/workflows/order.yml @@ -1,4 +1,4 @@ -name: Delivery Microservice CI/CD +name: Order Microservice CI/CD on: push: diff --git a/services/order/package.json b/services/order/package.json index 2bdae690..5eb82da3 100644 --- a/services/order/package.json +++ b/services/order/package.json @@ -11,7 +11,7 @@ "prisma:generate": "prisma generate", "seed": "ts-node prisma/seed.ts", "grpc:reflection": "./generate_grpc_reflection.sh", - "postinstall": "npm run prisma:generate && npm run grpc:reflection" + "postinstall": "npm run prisma:generate" }, "dependencies": { "@grpc/grpc-js": "1.8.14", From d617cb519e3bac1c6ae765b6e345ae13327dad11 Mon Sep 17 00:00:00 2001 From: Pierre Lebigre Date: Wed, 10 May 2023 09:08:22 +0200 Subject: [PATCH 094/883] fix crud in correct typescript and an integrity control --- services/product/k8s/configmap.yml | 2 +- services/product/k8s/ingress.yml | 2 +- services/product/k8s/service.yml | 4 +- services/product/package.json | 20 +- services/product/pnpm-lock.yaml | 683 +++++++++++++++++- services/product/prisma/schema.prisma | 2 +- .../product/src/handler/Allergen/create.ts | 28 +- .../product/src/handler/Allergen/delete.ts | 23 +- .../product/src/handler/Allergen/index.ts | 10 +- services/product/src/handler/Allergen/list.ts | 29 + services/product/src/handler/Allergen/read.ts | 19 +- .../product/src/handler/Allergen/update.ts | 34 +- .../product/src/handler/Category/create.ts | 36 +- .../product/src/handler/Category/delete.ts | 24 +- .../product/src/handler/Category/index.ts | 10 +- services/product/src/handler/Category/list.ts | 28 + services/product/src/handler/Category/read.ts | 19 +- .../product/src/handler/Category/update.ts | 44 +- .../product/src/handler/Product/create.ts | 42 +- .../product/src/handler/Product/delete.ts | 12 +- services/product/src/handler/Product/index.ts | 4 +- services/product/src/handler/Product/list.ts | 11 +- .../product/src/handler/Product/listType.ts | 26 +- services/product/src/handler/Product/read.ts | 12 +- .../product/src/handler/Product/update.ts | 12 +- services/product/src/lib/log.ts | 148 ++-- services/product/src/lib/rabbitmq.ts | 11 + services/product/src/server.ts | 6 +- services/product/src/types/Allergen.d.ts | 5 +- services/product/src/types/Category.d.ts | 5 +- services/product/src/types/Product.d.ts | 11 +- services/product/src/types/index.d.ts | 2 +- services/product/tsconfig.json | 121 +--- services/{protos => proto}/.gitinclude | 0 services/{protos => proto}/product.proto | 27 +- 35 files changed, 1127 insertions(+), 345 deletions(-) create mode 100644 services/product/src/handler/Allergen/list.ts create mode 100644 services/product/src/handler/Category/list.ts create mode 100644 services/product/src/lib/rabbitmq.ts rename services/{protos => proto}/.gitinclude (100%) rename services/{protos => proto}/product.proto (86%) diff --git a/services/product/k8s/configmap.yml b/services/product/k8s/configmap.yml index ddbe1fbd..a3a4d946 100644 --- a/services/product/k8s/configmap.yml +++ b/services/product/k8s/configmap.yml @@ -5,4 +5,4 @@ metadata: labels: app: goodfood-product data: - port: "50008" \ No newline at end of file + port: "50004" \ No newline at end of file diff --git a/services/product/k8s/ingress.yml b/services/product/k8s/ingress.yml index 6052d797..5e580817 100644 --- a/services/product/k8s/ingress.yml +++ b/services/product/k8s/ingress.yml @@ -13,5 +13,5 @@ spec: service: name: goodfood-product port: - number: 50008 + number: 50004 path: / \ No newline at end of file diff --git a/services/product/k8s/service.yml b/services/product/k8s/service.yml index 99219368..c10ceea2 100644 --- a/services/product/k8s/service.yml +++ b/services/product/k8s/service.yml @@ -7,7 +7,7 @@ spec: app: goodfood-product ports: - name: "grpc" - port: 50008 - targetPort: 50008 + port: 50004 + targetPort: 50004 status: loadBalancer: {} \ No newline at end of file diff --git a/services/product/package.json b/services/product/package.json index 0ee602b5..7f989b44 100644 --- a/services/product/package.json +++ b/services/product/package.json @@ -4,18 +4,32 @@ "description": "", "main": "index.js", "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" + "start": "node dist/index.js", + "dev": "nodemon --watch 'src/**/*.ts' --exec 'ts-node' src/server.ts", + "test": "vitest", + "prisma:generate": "prisma generate", + "postinstall": "npm run prisma:generate" }, "keywords": [], "author": "", "license": "ISC", "devDependencies": { + "@types/amqplib": "^0.10.1", "@types/node": "^18.15.7", "prisma": "^4.11.0", "ts-node": "^10.9.1", - "typescript": "^5.0.2" + "tsconfig-paths": "^4.2.0", + "typescript": "^5.0.2", + "vitest": "^0.31.0" }, "dependencies": { - "express": "^4.18.2" + "@grpc/grpc-js": "^1.8.14", + "@grpc/proto-loader": "^0.7.6", + "@prisma/client": "^4.11.0", + "amqplib": "^0.10.3", + "express": "^4.18.2", + "nodemon": "^2.0.22", + "vite-tsconfig-paths": "^4.2.0", + "vitest-mock-extended": "^1.1.3" } } diff --git a/services/product/pnpm-lock.yaml b/services/product/pnpm-lock.yaml index 384ac916..6a77d328 100644 --- a/services/product/pnpm-lock.yaml +++ b/services/product/pnpm-lock.yaml @@ -11,7 +11,11 @@ specifiers: nodemon: ^2.0.22 prisma: ^4.11.0 ts-node: ^10.9.1 + tsconfig-paths: ^4.2.0 typescript: ^5.0.2 + vite-tsconfig-paths: ^4.2.0 + vitest: ^0.31.0 + vitest-mock-extended: ^1.1.3 dependencies: '@grpc/grpc-js': 1.8.14 @@ -20,13 +24,17 @@ dependencies: amqplib: 0.10.3 express: 4.18.2 nodemon: 2.0.22 + vite-tsconfig-paths: 4.2.0_typescript@5.0.2 + vitest-mock-extended: 1.1.3_64trcfcrzkzux7tbs242bksig4 devDependencies: '@types/amqplib': 0.10.1 '@types/node': 18.15.7 prisma: 4.11.0 ts-node: 10.9.1_gkjsv6qbk4dkl5zwoikfngqpvy + tsconfig-paths: 4.2.0 typescript: 5.0.2 + vitest: 0.31.0 packages: @@ -48,6 +56,182 @@ packages: '@jridgewell/trace-mapping': 0.3.9 dev: true + /@esbuild/android-arm/0.17.18: + resolution: {integrity: sha512-EmwL+vUBZJ7mhFCs5lA4ZimpUH3WMAoqvOIYhVQwdIgSpHC8ImHdsRyhHAVxpDYUSm0lWvd63z0XH1IlImS2Qw==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + requiresBuild: true + optional: true + + /@esbuild/android-arm64/0.17.18: + resolution: {integrity: sha512-/iq0aK0eeHgSC3z55ucMAHO05OIqmQehiGay8eP5l/5l+iEr4EIbh4/MI8xD9qRFjqzgkc0JkX0LculNC9mXBw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true + optional: true + + /@esbuild/android-x64/0.17.18: + resolution: {integrity: sha512-x+0efYNBF3NPW2Xc5bFOSFW7tTXdAcpfEg2nXmxegm4mJuVeS+i109m/7HMiOQ6M12aVGGFlqJX3RhNdYM2lWg==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + requiresBuild: true + optional: true + + /@esbuild/darwin-arm64/0.17.18: + resolution: {integrity: sha512-6tY+djEAdF48M1ONWnQb1C+6LiXrKjmqjzPNPWXhu/GzOHTHX2nh8Mo2ZAmBFg0kIodHhciEgUBtcYCAIjGbjQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + optional: true + + /@esbuild/darwin-x64/0.17.18: + resolution: {integrity: sha512-Qq84ykvLvya3dO49wVC9FFCNUfSrQJLbxhoQk/TE1r6MjHo3sFF2tlJCwMjhkBVq3/ahUisj7+EpRSz0/+8+9A==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true + optional: true + + /@esbuild/freebsd-arm64/0.17.18: + resolution: {integrity: sha512-fw/ZfxfAzuHfaQeMDhbzxp9mc+mHn1Y94VDHFHjGvt2Uxl10mT4CDavHm+/L9KG441t1QdABqkVYwakMUeyLRA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + optional: true + + /@esbuild/freebsd-x64/0.17.18: + resolution: {integrity: sha512-FQFbRtTaEi8ZBi/A6kxOC0V0E9B/97vPdYjY9NdawyLd4Qk5VD5g2pbWN2VR1c0xhzcJm74HWpObPszWC+qTew==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + optional: true + + /@esbuild/linux-arm/0.17.18: + resolution: {integrity: sha512-jW+UCM40LzHcouIaqv3e/oRs0JM76JfhHjCavPxMUti7VAPh8CaGSlS7cmyrdpzSk7A+8f0hiedHqr/LMnfijg==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true + optional: true + + /@esbuild/linux-arm64/0.17.18: + resolution: {integrity: sha512-R7pZvQZFOY2sxUG8P6A21eq6q+eBv7JPQYIybHVf1XkQYC+lT7nDBdC7wWKTrbvMXKRaGudp/dzZCwL/863mZQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true + optional: true + + /@esbuild/linux-ia32/0.17.18: + resolution: {integrity: sha512-ygIMc3I7wxgXIxk6j3V00VlABIjq260i967Cp9BNAk5pOOpIXmd1RFQJQX9Io7KRsthDrQYrtcx7QCof4o3ZoQ==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + requiresBuild: true + optional: true + + /@esbuild/linux-loong64/0.17.18: + resolution: {integrity: sha512-bvPG+MyFs5ZlwYclCG1D744oHk1Pv7j8psF5TfYx7otCVmcJsEXgFEhQkbhNW8otDHL1a2KDINW20cfCgnzgMQ==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + requiresBuild: true + optional: true + + /@esbuild/linux-mips64el/0.17.18: + resolution: {integrity: sha512-oVqckATOAGuiUOa6wr8TXaVPSa+6IwVJrGidmNZS1cZVx0HqkTMkqFGD2HIx9H1RvOwFeWYdaYbdY6B89KUMxA==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + optional: true + + /@esbuild/linux-ppc64/0.17.18: + resolution: {integrity: sha512-3dLlQO+b/LnQNxgH4l9rqa2/IwRJVN9u/bK63FhOPB4xqiRqlQAU0qDU3JJuf0BmaH0yytTBdoSBHrb2jqc5qQ==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + optional: true + + /@esbuild/linux-riscv64/0.17.18: + resolution: {integrity: sha512-/x7leOyDPjZV3TcsdfrSI107zItVnsX1q2nho7hbbQoKnmoeUWjs+08rKKt4AUXju7+3aRZSsKrJtaRmsdL1xA==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + optional: true + + /@esbuild/linux-s390x/0.17.18: + resolution: {integrity: sha512-cX0I8Q9xQkL/6F5zWdYmVf5JSQt+ZfZD2bJudZrWD+4mnUvoZ3TDDXtDX2mUaq6upMFv9FlfIh4Gfun0tbGzuw==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + requiresBuild: true + optional: true + + /@esbuild/linux-x64/0.17.18: + resolution: {integrity: sha512-66RmRsPlYy4jFl0vG80GcNRdirx4nVWAzJmXkevgphP1qf4dsLQCpSKGM3DUQCojwU1hnepI63gNZdrr02wHUA==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + requiresBuild: true + optional: true + + /@esbuild/netbsd-x64/0.17.18: + resolution: {integrity: sha512-95IRY7mI2yrkLlTLb1gpDxdC5WLC5mZDi+kA9dmM5XAGxCME0F8i4bYH4jZreaJ6lIZ0B8hTrweqG1fUyW7jbg==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + optional: true + + /@esbuild/openbsd-x64/0.17.18: + resolution: {integrity: sha512-WevVOgcng+8hSZ4Q3BKL3n1xTv5H6Nb53cBrtzzEjDbbnOmucEVcZeGCsCOi9bAOcDYEeBZbD2SJNBxlfP3qiA==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + optional: true + + /@esbuild/sunos-x64/0.17.18: + resolution: {integrity: sha512-Rzf4QfQagnwhQXVBS3BYUlxmEbcV7MY+BH5vfDZekU5eYpcffHSyjU8T0xucKVuOcdCsMo+Ur5wmgQJH2GfNrg==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + requiresBuild: true + optional: true + + /@esbuild/win32-arm64/0.17.18: + resolution: {integrity: sha512-Kb3Ko/KKaWhjeAm2YoT/cNZaHaD1Yk/pa3FTsmqo9uFh1D1Rfco7BBLIPdDOozrObj2sahslFuAQGvWbgWldAg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + requiresBuild: true + optional: true + + /@esbuild/win32-ia32/0.17.18: + resolution: {integrity: sha512-0/xUMIdkVHwkvxfbd5+lfG7mHOf2FRrxNbPiKWg9C4fFrB8H0guClmaM3BFiRUYrznVoyxTIyC/Ou2B7QQSwmw==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + requiresBuild: true + optional: true + + /@esbuild/win32-x64/0.17.18: + resolution: {integrity: sha512-qU25Ma1I3NqTSHJUOKi9sAH1/Mzuvlke0ioMJRthLXKm7JiSKVwFghlGbDLOO2sARECGhja4xYfRAZNPAkooYg==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + optional: true + /@grpc/grpc-js/1.8.14: resolution: {integrity: sha512-w84maJ6CKl5aApCMzFll0hxtFNT6or9WwMslobKaqWUEf1K+zhlL43bSQhFreyYWIWR+Z0xnVFC1KtLm4ZpM/A==} engines: {node: ^8.13.0 || >=10.10.0} @@ -75,7 +259,6 @@ packages: /@jridgewell/sourcemap-codec/1.4.14: resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==} - dev: true /@jridgewell/trace-mapping/0.3.9: resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} @@ -171,6 +354,14 @@ packages: '@types/node': 18.15.7 dev: true + /@types/chai-subset/1.3.3: + resolution: {integrity: sha512-frBecisrNGz+F4T6bcc+NLeolfiojh5FxW2klu669+8BARtyQv2C/GkNW6FUodVe4BroGMP/wER/YDGc7rEllw==} + dependencies: + '@types/chai': 4.3.5 + + /@types/chai/4.3.5: + resolution: {integrity: sha512-mEo1sAde+UCE6b2hxn332f1g1E8WfYRu6p5SvTKr2ZKC1f7gFJXk4h5PyGP9Dt6gCaG8y8XhwnXWC6Iy2cmBng==} + /@types/long/4.0.2: resolution: {integrity: sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==} dev: false @@ -178,6 +369,40 @@ packages: /@types/node/18.15.7: resolution: {integrity: sha512-LFmUbFunqmBn26wJZgZPYZPrDR1RwGOu2v79Mgcka1ndO6V0/cwjivPTc4yoK6n9kmw4/ls1r8cLrvh2iMibFA==} + /@vitest/expect/0.31.0: + resolution: {integrity: sha512-Jlm8ZTyp6vMY9iz9Ny9a0BHnCG4fqBa8neCF6Pk/c/6vkUk49Ls6UBlgGAU82QnzzoaUs9E/mUhq/eq9uMOv/g==} + dependencies: + '@vitest/spy': 0.31.0 + '@vitest/utils': 0.31.0 + chai: 4.3.7 + + /@vitest/runner/0.31.0: + resolution: {integrity: sha512-H1OE+Ly7JFeBwnpHTrKyCNm/oZgr+16N4qIlzzqSG/YRQDATBYmJb/KUn3GrZaiQQyL7GwpNHVZxSQd6juLCgw==} + dependencies: + '@vitest/utils': 0.31.0 + concordance: 5.0.4 + p-limit: 4.0.0 + pathe: 1.1.0 + + /@vitest/snapshot/0.31.0: + resolution: {integrity: sha512-5dTXhbHnyUMTMOujZPB0wjFjQ6q5x9c8TvAsSPUNKjp1tVU7i9pbqcKPqntyu2oXtmVxKbuHCqrOd+Ft60r4tg==} + dependencies: + magic-string: 0.30.0 + pathe: 1.1.0 + pretty-format: 27.5.1 + + /@vitest/spy/0.31.0: + resolution: {integrity: sha512-IzCEQ85RN26GqjQNkYahgVLLkULOxOm5H/t364LG0JYb3Apg0PsYCHLBYGA006+SVRMWhQvHlBBCyuByAMFmkg==} + dependencies: + tinyspy: 2.1.0 + + /@vitest/utils/0.31.0: + resolution: {integrity: sha512-kahaRyLX7GS1urekRXN2752X4gIgOGVX4Wo8eDUGUkTWlGpXzf5ZS6N9RUUS+Re3XEE8nVGqNyxkSxF5HXlGhQ==} + dependencies: + concordance: 5.0.4 + loupe: 2.3.6 + pretty-format: 27.5.1 + /abbrev/1.1.1: resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} dev: false @@ -193,13 +418,11 @@ packages: /acorn-walk/8.2.0: resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} engines: {node: '>=0.4.0'} - dev: true /acorn/8.8.2: resolution: {integrity: sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==} engines: {node: '>=0.4.0'} hasBin: true - dev: true /amqplib/0.10.3: resolution: {integrity: sha512-UHmuSa7n8vVW/a5HGh2nFPqAEr8+cD4dEZ6u9GjP91nHfr1a54RyAKyra7Sb5NH7NBKOUlyQSMXIp0qAixKexw==} @@ -216,7 +439,6 @@ packages: /ansi-regex/5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} - dev: false /ansi-styles/4.3.0: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} @@ -225,6 +447,10 @@ packages: color-convert: 2.0.1 dev: false + /ansi-styles/5.2.0: + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} + engines: {node: '>=10'} + /anymatch/3.1.3: resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} engines: {node: '>= 8'} @@ -241,6 +467,9 @@ packages: resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} dev: false + /assertion-error/1.1.0: + resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} + /balanced-match/1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} dev: false @@ -250,6 +479,9 @@ packages: engines: {node: '>=8'} dev: false + /blueimp-md5/2.19.0: + resolution: {integrity: sha512-DRQrD6gJyy8FbiE4s+bDoXS9hiW3Vbx5uCdwvcCf3zLHL+Iv7LtGHLpr+GZV8rHG8tK766FGYBwRbu8pELTt+w==} + /body-parser/1.20.1: resolution: {integrity: sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} @@ -293,6 +525,10 @@ packages: engines: {node: '>= 0.8'} dev: false + /cac/6.7.14: + resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} + engines: {node: '>=8'} + /call-bind/1.0.2: resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==} dependencies: @@ -300,6 +536,21 @@ packages: get-intrinsic: 1.2.0 dev: false + /chai/4.3.7: + resolution: {integrity: sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==} + engines: {node: '>=4'} + dependencies: + assertion-error: 1.1.0 + check-error: 1.0.2 + deep-eql: 4.1.3 + get-func-name: 2.0.0 + loupe: 2.3.6 + pathval: 1.1.1 + type-detect: 4.0.8 + + /check-error/1.0.2: + resolution: {integrity: sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==} + /chokidar/3.5.3: resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} engines: {node: '>= 8.10.0'} @@ -338,6 +589,19 @@ packages: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} dev: false + /concordance/5.0.4: + resolution: {integrity: sha512-OAcsnTEYu1ARJqWVGwf4zh4JDfHZEaSNlNccFmt8YjB2l/n19/PF2viLINHc57vO4FKIAFl2FWASIGZZWZ2Kxw==} + engines: {node: '>=10.18.0 <11 || >=12.14.0 <13 || >=14'} + dependencies: + date-time: 3.1.0 + esutils: 2.0.3 + fast-diff: 1.2.0 + js-string-escape: 1.0.1 + lodash: 4.17.21 + md5-hex: 3.0.1 + semver: 7.5.0 + well-known-symbols: 2.0.0 + /content-disposition/0.5.4: resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} engines: {node: '>= 0.6'} @@ -367,6 +631,12 @@ packages: resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} dev: true + /date-time/3.1.0: + resolution: {integrity: sha512-uqCUKXE5q1PNBXjPqvwhwJf9SwMoAHBgWJ6DcrnS5o+W2JOiIILl0JEdVD8SGujrNS02GGxgwAg2PN2zONgtjg==} + engines: {node: '>=6'} + dependencies: + time-zone: 1.0.0 + /debug/2.6.9: resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} peerDependencies: @@ -400,7 +670,12 @@ packages: optional: true dependencies: ms: 2.1.2 - dev: false + + /deep-eql/4.1.3: + resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==} + engines: {node: '>=6'} + dependencies: + type-detect: 4.0.8 /depd/2.0.0: resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} @@ -430,6 +705,35 @@ packages: engines: {node: '>= 0.8'} dev: false + /esbuild/0.17.18: + resolution: {integrity: sha512-z1lix43jBs6UKjcZVKOw2xx69ffE2aG0PygLL5qJ9OS/gy0Ewd1gW/PUQIOIQGXBHWNywSc0floSKoMFF8aK2w==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/android-arm': 0.17.18 + '@esbuild/android-arm64': 0.17.18 + '@esbuild/android-x64': 0.17.18 + '@esbuild/darwin-arm64': 0.17.18 + '@esbuild/darwin-x64': 0.17.18 + '@esbuild/freebsd-arm64': 0.17.18 + '@esbuild/freebsd-x64': 0.17.18 + '@esbuild/linux-arm': 0.17.18 + '@esbuild/linux-arm64': 0.17.18 + '@esbuild/linux-ia32': 0.17.18 + '@esbuild/linux-loong64': 0.17.18 + '@esbuild/linux-mips64el': 0.17.18 + '@esbuild/linux-ppc64': 0.17.18 + '@esbuild/linux-riscv64': 0.17.18 + '@esbuild/linux-s390x': 0.17.18 + '@esbuild/linux-x64': 0.17.18 + '@esbuild/netbsd-x64': 0.17.18 + '@esbuild/openbsd-x64': 0.17.18 + '@esbuild/sunos-x64': 0.17.18 + '@esbuild/win32-arm64': 0.17.18 + '@esbuild/win32-ia32': 0.17.18 + '@esbuild/win32-x64': 0.17.18 + /escalade/3.1.1: resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} engines: {node: '>=6'} @@ -439,6 +743,10 @@ packages: resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} dev: false + /esutils/2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + /etag/1.8.1: resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} engines: {node: '>= 0.6'} @@ -483,6 +791,9 @@ packages: - supports-color dev: false + /fast-diff/1.2.0: + resolution: {integrity: sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==} + /fill-range/7.0.1: resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} engines: {node: '>=8'} @@ -520,7 +831,6 @@ packages: engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} os: [darwin] requiresBuild: true - dev: false optional: true /function-bind/1.1.1: @@ -532,6 +842,9 @@ packages: engines: {node: 6.* || 8.* || >= 10.*} dev: false + /get-func-name/2.0.0: + resolution: {integrity: sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==} + /get-intrinsic/1.2.0: resolution: {integrity: sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==} dependencies: @@ -547,6 +860,10 @@ packages: is-glob: 4.0.3 dev: false + /globrex/0.1.2: + resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} + dev: false + /has-flag/3.0.0: resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} engines: {node: '>=4'} @@ -628,10 +945,30 @@ packages: resolution: {integrity: sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==} dev: false + /js-string-escape/1.0.1: + resolution: {integrity: sha512-Smw4xcfIQ5LVjAOuJCvN/zIodzA/BBSsluuoSykP+lUvScIi4U6RJLfwHet5cxFnCswUjISV8oAXaqaJDY3chg==} + engines: {node: '>= 0.8'} + + /json5/2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + dev: true + + /jsonc-parser/3.2.0: + resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} + + /local-pkg/0.4.3: + resolution: {integrity: sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==} + engines: {node: '>=14'} + /lodash.camelcase/4.3.0: resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} dev: false + /lodash/4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + /long/4.0.0: resolution: {integrity: sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==} dev: false @@ -640,10 +977,33 @@ packages: resolution: {integrity: sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==} dev: false + /loupe/2.3.6: + resolution: {integrity: sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==} + dependencies: + get-func-name: 2.0.0 + + /lru-cache/6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + dependencies: + yallist: 4.0.0 + + /magic-string/0.30.0: + resolution: {integrity: sha512-LA+31JYDJLs82r2ScLrlz1GjSgu66ZV518eyWT+S8VhyQn/JL0u9MeBOvQMGYiPk1DBiSN9DDMOcXvigJZaViQ==} + engines: {node: '>=12'} + dependencies: + '@jridgewell/sourcemap-codec': 1.4.14 + /make-error/1.3.6: resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} dev: true + /md5-hex/3.0.1: + resolution: {integrity: sha512-BUiRtTtV39LIJwinWBjqVsU9xhdnz7/i889V859IBFpuqGAj6LuOvHv5XLbgZ2R7ptJoJaEcxkv88/h25T7Ciw==} + engines: {node: '>=8'} + dependencies: + blueimp-md5: 2.19.0 + /media-typer/0.3.0: resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} engines: {node: '>= 0.6'} @@ -682,18 +1042,34 @@ packages: brace-expansion: 1.1.11 dev: false + /minimist/1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + dev: true + + /mlly/1.2.0: + resolution: {integrity: sha512-+c7A3CV0KGdKcylsI6khWyts/CYrGTrRVo4R/I7u/cUsy0Conxa6LUhiEzVKIw14lc2L5aiO4+SeVe4TeGRKww==} + dependencies: + acorn: 8.8.2 + pathe: 1.1.0 + pkg-types: 1.0.3 + ufo: 1.1.2 + /ms/2.0.0: resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} dev: false /ms/2.1.2: resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - dev: false /ms/2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} dev: false + /nanoid/3.3.6: + resolution: {integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + /negotiator/0.6.3: resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} engines: {node: '>= 0.6'} @@ -739,6 +1115,12 @@ packages: ee-first: 1.1.1 dev: false + /p-limit/4.0.0: + resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + yocto-queue: 1.0.0 + /parseurl/1.3.3: resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} engines: {node: '>= 0.8'} @@ -748,11 +1130,43 @@ packages: resolution: {integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==} dev: false + /pathe/1.1.0: + resolution: {integrity: sha512-ODbEPR0KKHqECXW1GoxdDb+AZvULmXjVPy4rt+pGo2+TnjJTIPJQSVS6N63n8T2Ip+syHhbn52OewKicV0373w==} + + /pathval/1.1.1: + resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} + + /picocolors/1.0.0: + resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + /picomatch/2.3.1: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} dev: false + /pkg-types/1.0.3: + resolution: {integrity: sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==} + dependencies: + jsonc-parser: 3.2.0 + mlly: 1.2.0 + pathe: 1.1.0 + + /postcss/8.4.23: + resolution: {integrity: sha512-bQ3qMcpF6A/YjR55xtoTr0jGOlnPOKAIMdOWiv0EIT6HVPEaJiJB4NLljSbiHoC2RX7DN5Uvjtpbg1NPdwv1oA==} + engines: {node: ^10 || ^12 || >=14} + dependencies: + nanoid: 3.3.6 + picocolors: 1.0.0 + source-map-js: 1.0.2 + + /pretty-format/27.5.1: + resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + ansi-regex: 5.0.1 + ansi-styles: 5.2.0 + react-is: 17.0.2 + /prisma/4.11.0: resolution: {integrity: sha512-4zZmBXssPUEiX+GeL0MUq/Yyie4ltiKmGu7jCJFnYMamNrrulTBc+D+QwAQSJ01tyzeGHlD13kOnqPwRipnlNw==} engines: {node: '>=14.17'} @@ -818,6 +1232,9 @@ packages: unpipe: 1.0.0 dev: false + /react-is/17.0.2: + resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} + /readable-stream/1.1.14: resolution: {integrity: sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==} dependencies: @@ -843,6 +1260,13 @@ packages: resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} dev: false + /rollup/3.21.5: + resolution: {integrity: sha512-a4NTKS4u9PusbUJcfF4IMxuqjFzjm6ifj76P54a7cKnvVzJaG12BLVR+hgU2YDGHzyMMQNxLAZWuALsn8q2oQg==} + engines: {node: '>=14.18.0', npm: '>=8.0.0'} + hasBin: true + optionalDependencies: + fsevents: 2.3.2 + /safe-buffer/5.1.2: resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} dev: false @@ -865,6 +1289,13 @@ packages: hasBin: true dev: false + /semver/7.5.0: + resolution: {integrity: sha512-+XC0AD/R7Q2mPSRuy2Id0+CGTZ98+8f+KvwirxOKIEyid+XSx6HbC63p+O4IndTHuX5Z+JxQ0TghCkO5Cg/2HA==} + engines: {node: '>=10'} + hasBin: true + dependencies: + lru-cache: 6.0.0 + /send/0.18.0: resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==} engines: {node: '>= 0.8.0'} @@ -910,6 +1341,9 @@ packages: object-inspect: 1.12.3 dev: false + /siginfo/2.0.0: + resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} + /simple-update-notifier/1.1.0: resolution: {integrity: sha512-VpsrsJSUcJEseSbMHkrsrAVSdvVS5I96Qo1QAQ4FxQ9wXFcB+pjj7FB7/us9+GcgfW4ziHtYMc1J0PLczb55mg==} engines: {node: '>=8.10.0'} @@ -917,11 +1351,21 @@ packages: semver: 7.0.0 dev: false + /source-map-js/1.0.2: + resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} + engines: {node: '>=0.10.0'} + + /stackback/0.0.2: + resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + /statuses/2.0.1: resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} engines: {node: '>= 0.8'} dev: false + /std-env/3.3.3: + resolution: {integrity: sha512-Rz6yejtVyWnVjC1RFvNmYL10kgjC49EOghxWn0RFqlCHGFpQx+Xe7yW3I4ceK1SGrWIGMjD5Kbue8W/udkbMJg==} + /string-width/4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} @@ -942,6 +1386,16 @@ packages: ansi-regex: 5.0.1 dev: false + /strip-bom/3.0.0: + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} + dev: true + + /strip-literal/1.0.1: + resolution: {integrity: sha512-QZTsipNpa2Ppr6v1AmJHESqJ3Uz247MUS0OjrnnZjFAvEoWqxuyFuXn2xLgMtRnijJShAa1HL0gtJyUs7u7n3Q==} + dependencies: + acorn: 8.8.2 + /supports-color/5.5.0: resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} engines: {node: '>=4'} @@ -949,6 +1403,21 @@ packages: has-flag: 3.0.0 dev: false + /time-zone/1.0.0: + resolution: {integrity: sha512-TIsDdtKo6+XrPtiTm1ssmMngN1sAhyKnTO2kunQWqNPWIVvCm15Wmw4SWInwTVgJ5u/Tr04+8Ei9TNcw4x4ONA==} + engines: {node: '>=4'} + + /tinybench/2.5.0: + resolution: {integrity: sha512-kRwSG8Zx4tjF9ZiyH4bhaebu+EDz1BOx9hOigYHlUW4xxI/wKIUQUqo018UlU4ar6ATPBsaMrdbKZ+tmPdohFA==} + + /tinypool/0.5.0: + resolution: {integrity: sha512-paHQtnrlS1QZYKF/GnLoOM/DN9fqaGOFbCbxzAhwniySnzl9Ebk8w73/dd34DAhe/obUbPAOldTyYXQZxnPBPQ==} + engines: {node: '>=14.0.0'} + + /tinyspy/2.1.0: + resolution: {integrity: sha512-7eORpyqImoOvkQJCSkL0d0mB4NHHIFAy4b1u8PHdDa7SjGS2njzl6/lyGoZLm+eyYEtlUmFGE0rFj66SWxZgQQ==} + engines: {node: '>=14.0.0'} + /to-regex-range/5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} @@ -968,6 +1437,14 @@ packages: nopt: 1.0.10 dev: false + /ts-essentials/9.3.2_typescript@5.0.2: + resolution: {integrity: sha512-JxKJzuWqH1MmH4ZFHtJzGEhkfN3QvVR3C3w+4BIoWeoY68UVVoA2Np/Bca9z0IPSErVCWhv439aT0We4Dks8kQ==} + peerDependencies: + typescript: '>=4.1.0' + dependencies: + typescript: 5.0.2 + dev: false + /ts-node/10.9.1_gkjsv6qbk4dkl5zwoikfngqpvy: resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} hasBin: true @@ -999,6 +1476,32 @@ packages: yn: 3.1.1 dev: true + /tsconfck/2.1.1_typescript@5.0.2: + resolution: {integrity: sha512-ZPCkJBKASZBmBUNqGHmRhdhM8pJYDdOXp4nRgj/O0JwUwsMq50lCDRQP/M5GBNAA0elPrq4gAeu4dkaVCuKWww==} + engines: {node: ^14.13.1 || ^16 || >=18} + hasBin: true + peerDependencies: + typescript: ^4.3.5 || ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + dependencies: + typescript: 5.0.2 + dev: false + + /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 + + /type-detect/4.0.8: + resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} + engines: {node: '>=4'} + /type-is/1.6.18: resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} engines: {node: '>= 0.6'} @@ -1011,7 +1514,9 @@ packages: resolution: {integrity: sha512-wVORMBGO/FAs/++blGNeAVdbNKtIh1rbBL2EyQ1+J9lClJ93KiiKe8PmFIVdXhHcyv44SL9oglmfeSsndo0jRw==} engines: {node: '>=12.20'} hasBin: true - dev: true + + /ufo/1.1.2: + resolution: {integrity: sha512-TrY6DsjTQQgyS3E3dBaOXf0TpPD8u9FVrVYmKVegJuFw51n/YB9XPt+U6ydzFG5ZIN7+DIjPbNmXoBj9esYhgQ==} /undefsafe/2.0.5: resolution: {integrity: sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==} @@ -1043,6 +1548,161 @@ packages: engines: {node: '>= 0.8'} dev: false + /vite-node/0.31.0_@types+node@18.15.7: + resolution: {integrity: sha512-8x1x1LNuPvE2vIvkSB7c1mApX5oqlgsxzHQesYF7l5n1gKrEmrClIiZuOFbFDQcjLsmcWSwwmrWrcGWm9Fxc/g==} + engines: {node: '>=v14.18.0'} + hasBin: true + dependencies: + cac: 6.7.14 + debug: 4.3.4 + mlly: 1.2.0 + pathe: 1.1.0 + picocolors: 1.0.0 + vite: 4.3.5_@types+node@18.15.7 + transitivePeerDependencies: + - '@types/node' + - less + - sass + - stylus + - sugarss + - supports-color + - terser + + /vite-tsconfig-paths/4.2.0_typescript@5.0.2: + resolution: {integrity: sha512-jGpus0eUy5qbbMVGiTxCL1iB9ZGN6Bd37VGLJU39kTDD6ZfULTTb1bcc5IeTWqWJKiWV5YihCaibeASPiGi8kw==} + peerDependencies: + vite: '*' + peerDependenciesMeta: + vite: + optional: true + dependencies: + debug: 4.3.4 + globrex: 0.1.2 + tsconfck: 2.1.1_typescript@5.0.2 + transitivePeerDependencies: + - supports-color + - typescript + dev: false + + /vite/4.3.5_@types+node@18.15.7: + resolution: {integrity: sha512-0gEnL9wiRFxgz40o/i/eTBwm+NEbpUeTWhzKrZDSdKm6nplj+z4lKz8ANDgildxHm47Vg8EUia0aicKbawUVVA==} + engines: {node: ^14.18.0 || >=16.0.0} + hasBin: true + peerDependencies: + '@types/node': '>= 14' + less: '*' + sass: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + dependencies: + '@types/node': 18.15.7 + esbuild: 0.17.18 + postcss: 8.4.23 + rollup: 3.21.5 + optionalDependencies: + fsevents: 2.3.2 + + /vitest-mock-extended/1.1.3_64trcfcrzkzux7tbs242bksig4: + resolution: {integrity: sha512-MiaKYZbTg+fjozKnCpoTTva0BnlSNYyk4jiPuM2xVhg4aou112QIrALdH3/ZKK6qfXWh0A17gFIjWJjylOlXxg==} + peerDependencies: + typescript: 3.x || 4.x || 5.x + vitest: '>=0.29.2' + dependencies: + ts-essentials: 9.3.2_typescript@5.0.2 + typescript: 5.0.2 + vitest: 0.31.0 + dev: false + + /vitest/0.31.0: + resolution: {integrity: sha512-JwWJS9p3GU9GxkG7eBSmr4Q4x4bvVBSswaCFf1PBNHiPx00obfhHRJfgHcnI0ffn+NMlIh9QGvG75FlaIBdKGA==} + engines: {node: '>=v14.18.0'} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@vitest/browser': '*' + '@vitest/ui': '*' + happy-dom: '*' + jsdom: '*' + playwright: '*' + safaridriver: '*' + webdriverio: '*' + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@vitest/browser': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true + playwright: + optional: true + safaridriver: + optional: true + webdriverio: + optional: true + dependencies: + '@types/chai': 4.3.5 + '@types/chai-subset': 1.3.3 + '@types/node': 18.15.7 + '@vitest/expect': 0.31.0 + '@vitest/runner': 0.31.0 + '@vitest/snapshot': 0.31.0 + '@vitest/spy': 0.31.0 + '@vitest/utils': 0.31.0 + acorn: 8.8.2 + acorn-walk: 8.2.0 + cac: 6.7.14 + chai: 4.3.7 + concordance: 5.0.4 + debug: 4.3.4 + local-pkg: 0.4.3 + magic-string: 0.30.0 + pathe: 1.1.0 + picocolors: 1.0.0 + std-env: 3.3.3 + strip-literal: 1.0.1 + tinybench: 2.5.0 + tinypool: 0.5.0 + vite: 4.3.5_@types+node@18.15.7 + vite-node: 0.31.0_@types+node@18.15.7 + why-is-node-running: 2.2.2 + transitivePeerDependencies: + - less + - sass + - stylus + - sugarss + - supports-color + - terser + + /well-known-symbols/2.0.0: + resolution: {integrity: sha512-ZMjC3ho+KXo0BfJb7JgtQ5IBuvnShdlACNkKkdsqBmYw3bPAaJfPeYUo6tLUaT5tG/Gkh7xkpBhKRQ9e7pyg9Q==} + engines: {node: '>=6'} + + /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 + /wrap-ansi/7.0.0: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} engines: {node: '>=10'} @@ -1057,6 +1717,9 @@ packages: engines: {node: '>=10'} dev: false + /yallist/4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + /yargs-parser/20.2.9: resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} engines: {node: '>=10'} @@ -1079,3 +1742,7 @@ packages: resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} engines: {node: '>=6'} dev: true + + /yocto-queue/1.0.0: + resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} + engines: {node: '>=12.20'} diff --git a/services/product/prisma/schema.prisma b/services/product/prisma/schema.prisma index 5a8ffaf2..97f19a1f 100644 --- a/services/product/prisma/schema.prisma +++ b/services/product/prisma/schema.prisma @@ -35,7 +35,7 @@ model Category { model Allergen { id String @id @default(cuid()) - libelle String + libelle String @unique products Product[] } diff --git a/services/product/src/handler/Allergen/create.ts b/services/product/src/handler/Allergen/create.ts index 5412f463..09f41b8c 100644 --- a/services/product/src/handler/Allergen/create.ts +++ b/services/product/src/handler/Allergen/create.ts @@ -1,27 +1,31 @@ -import { Allergen } from "../../types/Allergen"; -import { Data } from "../../types"; -import { prisma } from "../../lib/prisma"; -import { log } from "../../lib/log"; +import { Allergen } from "@product/types/Allergen"; +import { Data } from "@product/types"; +import { log } from "@product/lib/log"; +import { ServerErrorResponse } from "@grpc/grpc-js"; +import { prisma } from "@product/lib/prisma"; export const CreateAllergen = async ( data: Data, - callback: (err: any, response: any) => void + callback: (err: ServerErrorResponse | null, response: Allergen | null) => void ) => { log.debug("Request received at CreateAllergen handler\n", data.request); try { - const { libelle, products } = data.request; + const { libelle } = data.request; + + if (!libelle && libelle.trim().length <= 0) + throw(Error("L'allergen doit avoir une valeur") as ServerErrorResponse) + + if((await prisma.allergen.findMany({where: {libelle: libelle}}) as Allergen[] | null) == null) + throw(Error("L'allergen existe déjà") as ServerErrorResponse) const allergen = await prisma.allergen.create({ data: { - libelle, - products: { - connect: products - }, + libelle }, - }); + }) as Allergen; callback(null, allergen); - } catch (error) { + } catch (error: ServerErrorResponse | any) { log.error(error); callback(error, null); } diff --git a/services/product/src/handler/Allergen/delete.ts b/services/product/src/handler/Allergen/delete.ts index 9fddd466..7bc61fac 100644 --- a/services/product/src/handler/Allergen/delete.ts +++ b/services/product/src/handler/Allergen/delete.ts @@ -1,22 +1,25 @@ -import { AllergenId } from "../../types/Allergen"; -import { Data } from "../../types"; -import { prisma } from "../../lib/prisma"; -import { log } from "../../lib/log"; +import { Allergen, AllergenId } from "@product/types/Allergen"; +import { Data } from "@product/types"; +import { log } from "@product/lib/log"; +import { ServerErrorResponse } from "@grpc/grpc-js"; +import prisma from "@product/lib/prisma"; export const DeleteAllergen = async ( data: Data, - callback: (err: any, response: any) => void + callback: (err: ServerErrorResponse | null) => void ) => { log.debug("Request received at DeleteAllergen handler\n", data.request); try { - const { request } = data; - const { id } = request; + const { id } = data.request; + + if((await prisma.allergen.findFirst({where: {id: id}}) as Allergen | null) == null) + throw(Error("L'allergen n'existe pas") as ServerErrorResponse) await prisma.allergen.delete({ where : {id} }); - callback(null, null); - } catch (error) { + callback(null); + } catch (error: ServerErrorResponse | any) { log.error(error); - callback(error, null); + callback(error); } }; \ No newline at end of file diff --git a/services/product/src/handler/Allergen/index.ts b/services/product/src/handler/Allergen/index.ts index ca8c0bdb..0cbd628e 100644 --- a/services/product/src/handler/Allergen/index.ts +++ b/services/product/src/handler/Allergen/index.ts @@ -1,9 +1,11 @@ -import { CreateAllergen } from "./create"; -import { ReadAllergen } from "./read"; -import { UpdateAllergen } from "./update"; -import { DeleteAllergen } from "./delete"; +import { GetAllergenList } from "@product/handler/Allergen/list"; +import { CreateAllergen } from "@product/handler/Allergen/create"; +import { ReadAllergen } from "@product/handler/Allergen/read"; +import { UpdateAllergen } from "@product/handler/Allergen/update"; +import { DeleteAllergen } from "@product/handler/Allergen/delete"; export default { + GetAllergenList, CreateAllergen, ReadAllergen, UpdateAllergen, diff --git a/services/product/src/handler/Allergen/list.ts b/services/product/src/handler/Allergen/list.ts new file mode 100644 index 00000000..0d3abdc8 --- /dev/null +++ b/services/product/src/handler/Allergen/list.ts @@ -0,0 +1,29 @@ +import { log } from "@product/lib/log"; +import { Data } from "@product/types"; +import { Allergen, AllergenList } from "@product/types/Allergen"; +import prisma from "@product/lib/prisma"; + +export const GetAllergenList = async ( + data: Data, + callback: (err: any, response: AllergenList | null) => void +) => { + log.debug("Request received at GetAllergenList handler\n", data.request); + try { + const allergens = await prisma.allergen.findMany() as Allergen[]; + + const allergenList = {} as AllergenList; + + allergens.map(allergen => { + if(allergenList.allergens == null) + allergenList.allergens = [allergen] as Allergen[]; + else + allergenList.allergens.push(allergen); + }); + + + callback(null, allergenList); + } catch (error) { + log.error(error); + callback(error, null); + } +}; \ No newline at end of file diff --git a/services/product/src/handler/Allergen/read.ts b/services/product/src/handler/Allergen/read.ts index a92c7035..1bd662ae 100644 --- a/services/product/src/handler/Allergen/read.ts +++ b/services/product/src/handler/Allergen/read.ts @@ -1,18 +1,21 @@ -import { AllergenId } from "../../types/Allergen"; -import { Data } from "../../types"; -import { prisma } from "../../lib/prisma"; -import { log } from "../../lib/log"; +import { Allergen, AllergenId } from "@product/types/Allergen"; +import { Data } from "@product/types"; +import { log } from "@product/lib/log"; +import { ServerErrorResponse } from "@grpc/grpc-js"; +import prisma from "@product/lib/prisma"; export const ReadAllergen = async ( data: Data, - callback: (err: any, response: any) => void + callback: (err: any, response: Allergen | null) => void ) => { log.debug("Request received at ReadAllergen handler\n", data.request); try { - const { request } = data; - const { id } = request; + const { id } = data.request; - const allergen = await prisma.allergen.findFirstOrThrow({ where : {id} }); + if (!id && id.trim().length <= 0) + throw(Error("L'id de l'allergen doit avoir une valeur") as ServerErrorResponse) + + const allergen = await prisma.allergen.findFirstOrThrow({ where : {id} }) as Allergen; callback(null, allergen); } catch (error) { diff --git a/services/product/src/handler/Allergen/update.ts b/services/product/src/handler/Allergen/update.ts index cecc9ab7..e115617a 100644 --- a/services/product/src/handler/Allergen/update.ts +++ b/services/product/src/handler/Allergen/update.ts @@ -1,25 +1,29 @@ -import { Allergen } from "../../types/Allergen"; -import { Data } from "../../types"; -import { prisma } from "../../lib/prisma"; -import { log } from "../../lib/log"; +import { Allergen } from "@product/types/Allergen"; +import { Data } from "@product/types"; +import { log } from "@product/lib/log"; +import { ServerErrorResponse } from "@grpc/grpc-js"; +import prisma from "@product/lib/prisma"; export const UpdateAllergen = async ( data: Data, - callback: (err: any, response: any) => void + callback: (err: any, response: Allergen | null) => void ) => { log.debug("Request received at UpdateAllergen handler\n", data.request); try { - const { id, libelle, products } = data.request; + const { id, libelle } = data.request; - const allergen = await prisma.allergen.update({ - where : { id }, - data: { - libelle, - products: { - connect: products - } - }, - }); + if (!id && id.trim().length <= 0) + throw(Error("L'id de l'allergen doit avoir une valeur") as ServerErrorResponse) + + if (!libelle && libelle.trim().length <= 0) + throw(Error("L'allergen doit avoir une valeur") as ServerErrorResponse) + + const allergen = await prisma.allergen.update({ + where : { id }, + data: { + libelle + }, + }) as Allergen; callback(null, allergen); } catch (error) { diff --git a/services/product/src/handler/Category/create.ts b/services/product/src/handler/Category/create.ts index 31469a42..f43480eb 100644 --- a/services/product/src/handler/Category/create.ts +++ b/services/product/src/handler/Category/create.ts @@ -1,26 +1,40 @@ -import { Category } from "../../types/Category"; -import { Data } from "../../types"; -import { prisma } from "../../lib/prisma"; -import { log } from "../../lib/log"; +import { Category } from "@product/types/Category"; +import { Data } from "@product/types"; +import { log } from "@product/lib/log"; +import { ServerErrorResponse } from "@grpc/grpc-js"; +import prisma from "@product/lib/prisma"; export const CreateCategory = async ( data: Data, - callback: (err: any, response: any) => void + callback: (err: any, response: Category | null) => void ) => { log.debug("Request received at CreateCategory handler\n", data.request); try { - const { libelle, hexa_color, icon, products } = data.request; + const { libelle, hexa_color, icon } = data.request; + + if (!libelle && libelle.trim().length <= 0 && + !icon && icon.trim().length <= 0 && + !hexa_color && hexa_color.trim().length <= 0 + ) + throw(Error("Aucun des valeurs de la catégorie ne peuvent être null") as ServerErrorResponse) + + var categorieInDb = await prisma.category.findMany({ + where: { + libelle: libelle, + icon: icon, + hexa_color: hexa_color + } + }) as Category[] | null + if(categorieInDb == null) + throw(Error("La catégorie existe déjà") as ServerErrorResponse) const category = await prisma.category.create({ data: { libelle, icon, - hexa_color, - products: { - connect: products - }, + hexa_color }, - }); + }) as Category; callback(null, category); } catch (error) { diff --git a/services/product/src/handler/Category/delete.ts b/services/product/src/handler/Category/delete.ts index 5db4fa28..b53c4920 100644 --- a/services/product/src/handler/Category/delete.ts +++ b/services/product/src/handler/Category/delete.ts @@ -1,22 +1,26 @@ -import { CategoryId } from "../../types/Category"; -import { Data } from "../../types"; -import { prisma } from "../../lib/prisma"; -import { log } from "../../lib/log"; +import { CategoryId } from "@product/types/Category"; +import { Data } from "@product/types"; +import { log } from "@product/lib/log"; +import { ServerErrorResponse } from "@grpc/grpc-js"; +import { Allergen } from "@prisma/client"; +import prisma from "@product/lib/prisma"; export const DeleteCategory = async ( data: Data, - callback: (err: any, response: any) => void + callback: (err: any) => void ) => { log.debug("Request received at DeleteCategory handler\n", data.request); try { - const { request } = data; - const { id } = request; + const { id } = data.request; - await prisma.allergen.delete({ where : {id} }); + if((await prisma.allergen.findFirst({where: {id: id}}) as Allergen | null) == null) + throw(Error("La catégorie n'existe pas") as ServerErrorResponse) + + await prisma.category.delete({ where : {id} }); - callback(null, null); + callback(null); } catch (error) { log.error(error); - callback(error, null); + callback(error); } }; \ No newline at end of file diff --git a/services/product/src/handler/Category/index.ts b/services/product/src/handler/Category/index.ts index fa94b569..504fb0eb 100644 --- a/services/product/src/handler/Category/index.ts +++ b/services/product/src/handler/Category/index.ts @@ -1,9 +1,11 @@ -import { CreateCategory } from "./create"; -import { ReadCategory } from "./read"; -import { UpdateCategory } from "./update"; -import { DeleteCategory } from "./delete"; +import { CreateCategory } from "@product/handler/Category/create"; +import { ReadCategory } from "@product/handler/Category/read"; +import { UpdateCategory } from "@product/handler/Category/update"; +import { DeleteCategory } from "@product/handler/Category/delete"; +import { GetCategoryList } from "@product/handler/Category/list"; export default { + GetCategoryList, CreateCategory, ReadCategory, UpdateCategory, diff --git a/services/product/src/handler/Category/list.ts b/services/product/src/handler/Category/list.ts new file mode 100644 index 00000000..c40054cd --- /dev/null +++ b/services/product/src/handler/Category/list.ts @@ -0,0 +1,28 @@ +import { log } from "@product/lib/log"; +import prisma from "@product/lib/prisma"; +import { Data } from "@product/types"; +import { Category, CategoryList } from "@product/types/Category"; + +export const GetCategoryList = async ( + data: Data, + callback: (err: any, response: CategoryList | null) => void +) => { + log.debug("Request received at GetCategoryList handler\n"); + try { + const categorys = await prisma.category.findMany() as Category[]; + + const categoryList = {} as CategoryList; + + categorys.map(category => { + if(categoryList.categories == null) + categoryList.categories = [category] as Category[]; + else + categoryList.categories.push(category); + }); + + callback(null, categoryList); + } catch (error) { + log.error(error); + callback(error, null); + } +}; \ No newline at end of file diff --git a/services/product/src/handler/Category/read.ts b/services/product/src/handler/Category/read.ts index c013a1f5..eb20455a 100644 --- a/services/product/src/handler/Category/read.ts +++ b/services/product/src/handler/Category/read.ts @@ -1,18 +1,21 @@ -import { CategoryId } from "../../types/Category"; -import { Data } from "../../types"; -import { prisma } from "../../lib/prisma"; -import { log } from "../../lib/log"; +import { Category, CategoryId } from "@product/types/Category"; +import { Data } from "@product/types"; +import { prisma } from "@product/lib/prisma"; +import { log } from "@product/lib/log"; +import { ServerErrorResponse } from "@grpc/grpc-js"; export const ReadCategory = async ( data: Data, - callback: (err: any, response: any) => void + callback: (err: any, response: Category | null) => void ) => { log.debug("Request received at ReadCategory handler\n", data.request); try { - const { request } = data; - const { id } = request; + const { id } = data.request; - const category = await prisma.category.findFirstOrThrow({ where : {id} }); + if (!id && id.trim().length <= 0) + throw(Error("L'id de la catégorie doit avoir une valeur") as ServerErrorResponse) + + const category = await prisma.category.findFirstOrThrow({ where : {id} }) as Category; callback(null, category); } catch (error) { diff --git a/services/product/src/handler/Category/update.ts b/services/product/src/handler/Category/update.ts index f80cfda3..88469964 100644 --- a/services/product/src/handler/Category/update.ts +++ b/services/product/src/handler/Category/update.ts @@ -1,27 +1,41 @@ -import { Category } from "../../types/Category"; -import { Data } from "../../types"; -import { prisma } from "../../lib/prisma"; -import { log } from "../../lib/log"; +import { Category } from "@product/types/Category"; +import { Data } from "@product/types"; +import { prisma } from "@product/lib/prisma"; +import { log } from "@product/lib/log"; +import { ServerErrorResponse } from "@grpc/grpc-js"; export const UpdateCategory = async ( data: Data, - callback: (err: any, response: any) => void + callback: (err: any, response: Category | null) => void ) => { log.debug("Request received at UpdateCategory handler\n", data.request); try { - const { id, libelle, hexa_color, icon, products } = data.request; + const { id, libelle, hexa_color, icon } = data.request; + + if (!libelle && libelle.trim().length <= 0 && + !icon && icon.trim().length <= 0 && + !hexa_color && hexa_color.trim().length <= 0 + ) + throw(Error("Aucun des valeurs de la catégorie ne peuvent être null") as ServerErrorResponse) + + var categorieInDb = await prisma.category.findMany({ + where: { + libelle: libelle, + icon: icon, + hexa_color: hexa_color + } + }) as Category[] | null + if(categorieInDb == null) + throw(Error("La catégorie existe déjà") as ServerErrorResponse) const category = await prisma.category.update({ - where : { id }, - data: { - libelle, + where : { id }, + data: { + libelle, icon, - hexa_color, - products: { - connect: products - } - }, - }); + hexa_color + }, + }) as Category; callback(null, category); } catch (error) { diff --git a/services/product/src/handler/Product/create.ts b/services/product/src/handler/Product/create.ts index fa8fac52..9bf987e3 100644 --- a/services/product/src/handler/Product/create.ts +++ b/services/product/src/handler/Product/create.ts @@ -1,8 +1,12 @@ -import { Product } from "../../types/Product"; -import { Data } from "../../types"; -import { prisma } from "../../lib/prisma"; -import { log } from "../../lib/log"; import { Product_type } from "@prisma/client"; +import { CreateAllergen } from "@product/handler/Allergen/create"; +import { ReadAllergen } from "@product/handler/Allergen/read"; +import { log } from "@product/lib/log"; +import { Data } from "@product/types"; +import { Allergen } from "@product/types/Allergen"; +import { Category } from "@product/types/Category"; +import { Product } from "@product/types/Product"; +import prisma from "@product/lib/prisma"; export const CreateProduct = async ( data: Data, @@ -12,6 +16,25 @@ export const CreateProduct = async ( try { const { name, image, comment, price, preparation, weight, kilocalories, nutriscore, restaurant_id, type, categories, allergens } = data.request; + allergens.map(async allergen => { + if(allergen.id != "" && allergen.id != null) + ReadAllergen({ + request: { id: allergen.id } + }, handlMapAllergen); + else + CreateAllergen({ + request: allergen + }, handlMapAllergen); + }); + + categories.map(async categorie => { + const categorieFind = await prisma.category.findFirst({ + where : { libelle: categorie.libelle } + }) as Category + if(categorieFind) + categorie = categorieFind; + }); + const product = await prisma.product.create({ data: { name, @@ -38,4 +61,13 @@ export const CreateProduct = async ( log.error(error); callback(error, null); } -}; \ No newline at end of file + + const handlMapAllergen = (err: any, response: Allergen | null) => { + if (err) { + log.error(err); + } else { + return response; + } + }; +}; + diff --git a/services/product/src/handler/Product/delete.ts b/services/product/src/handler/Product/delete.ts index b4f78816..899752f7 100644 --- a/services/product/src/handler/Product/delete.ts +++ b/services/product/src/handler/Product/delete.ts @@ -1,7 +1,8 @@ -import { ProductId } from "../../types/Product"; -import { Data } from "../../types"; -import { prisma } from "../../lib/prisma"; -import { log } from "../../lib/log"; +import { ProductId } from "@product/types/Product"; +import { Data } from "@product/types"; +import { log } from "@product/lib/log"; +import { PrismaClient } from "@prisma/client"; +import prisma from "@product/lib/prisma"; export const DeleteProduct = async ( data: Data, @@ -9,8 +10,7 @@ export const DeleteProduct = async ( ) => { log.debug("Request received at DeleteProduct handler\n", data.request); try { - const { request } = data; - const { id } = request; + const { id } = data.request; await prisma.product.delete({ where : {id} }); diff --git a/services/product/src/handler/Product/index.ts b/services/product/src/handler/Product/index.ts index c0c53a59..e5ffd2d7 100644 --- a/services/product/src/handler/Product/index.ts +++ b/services/product/src/handler/Product/index.ts @@ -3,7 +3,7 @@ import { ReadProduct } from "./read"; import { UpdateProduct } from "./update"; import { DeleteProduct } from "./delete"; import { ListProduct } from "./list"; -import { ListProductType } from "./listType"; +//import { GetProductTypeList } from "./listType"; export default { CreateProduct, @@ -11,5 +11,5 @@ export default { UpdateProduct, DeleteProduct, ListProduct, - ListProductType, + //GetProductTypeList, }; \ No newline at end of file diff --git a/services/product/src/handler/Product/list.ts b/services/product/src/handler/Product/list.ts index ce219955..cb4cbce4 100644 --- a/services/product/src/handler/Product/list.ts +++ b/services/product/src/handler/Product/list.ts @@ -1,7 +1,7 @@ -import { RestaurantId } from "../../types/Product"; -import { Data } from "../../types"; -import { prisma } from "../../lib/prisma"; -import { log } from "../../lib/log"; +import { RestaurantId } from "@product/types/Product"; +import { Data } from "@product/types"; +import { log } from "@product/lib/log"; +import prisma from "@product/lib/prisma"; export const ListProduct = async ( data: Data, @@ -9,8 +9,7 @@ export const ListProduct = async ( ) => { log.debug("Request received at ListProduct handler\n", data.request); try { - const { request } = data; - const { id } = request; + const { id } = data.request; const products = await prisma.product.findMany({ where : {restaurant_id: id} }); diff --git a/services/product/src/handler/Product/listType.ts b/services/product/src/handler/Product/listType.ts index b4bcbd84..44925c14 100644 --- a/services/product/src/handler/Product/listType.ts +++ b/services/product/src/handler/Product/listType.ts @@ -1,19 +1,25 @@ -import { ProductType } from "../../types/Product"; -import { Data } from "../../types"; -import { Product_type } from "@prisma/client"; -import { log } from "../../lib/log"; +/*import { Product_type } from "@prisma/client"; +import { log } from "@product/lib/log"; +import { Data } from "@product/types"; +import { ProductType, ProductTypeList } from "@product/types/Product"; -export const ListProductType = async ( - data: Data, - callback: (err: any, response: any) => void +export const GetProductTypeList = async ( + data: Data, + callback: (err: any, response: ProductTypeList | null) => void ) => { - log.debug("Request received at ListProduct handler\n", data.request); + log.debug("Request received at GetProductTypeList handler\n"); try { - const type = Product_type; + const enumValues = Object.values(ProductType); + + const type = {} as ProductTypeList; + type.productTypes = Array.from(Object.values(Product_type).entries()).map((entrie, index) => { + if(entrie instanceof String) + return enumValues[index - 1] + }) as ProductType[]; callback(null, type); } catch (error) { log.error(error); callback(error, null); } -}; \ No newline at end of file +};*/ \ No newline at end of file diff --git a/services/product/src/handler/Product/read.ts b/services/product/src/handler/Product/read.ts index 2e6b97d6..3cf8569e 100644 --- a/services/product/src/handler/Product/read.ts +++ b/services/product/src/handler/Product/read.ts @@ -1,7 +1,8 @@ -import { ProductId } from "../../types/Product"; -import { Data } from "../../types"; -import { prisma } from "../../lib/prisma"; -import { log } from "../../lib/log"; +import { ProductId } from "@product/types/Product"; +import { Data } from "@product/types"; +import { prisma } from "@product/lib/prisma"; +import { log } from "@product/lib/log"; +import { PrismaClient } from "@prisma/client"; export const ReadProduct = async ( data: Data, @@ -9,8 +10,7 @@ export const ReadProduct = async ( ) => { log.debug("Request received at ReadProduct handler\n", data.request); try { - const { request } = data; - const { id } = request; + const { id } = data.request; const product = await prisma.product.findFirstOrThrow({ where : {id} }); diff --git a/services/product/src/handler/Product/update.ts b/services/product/src/handler/Product/update.ts index d468a8a2..73f33118 100644 --- a/services/product/src/handler/Product/update.ts +++ b/services/product/src/handler/Product/update.ts @@ -1,8 +1,8 @@ -import { Product } from "../../types/Product"; -import { Data } from "../../types"; -import { prisma } from "../../lib/prisma"; -import { log } from "../../lib/log"; -import { Product_type } from "@prisma/client"; +import { Product } from "@product/types/Product"; +import { Data } from "@product/types"; +import { prisma } from "@product/lib/prisma"; +import { log } from "@product/lib/log"; +import { PrismaClient, Product_type } from "@prisma/client"; export const UpdateProduct = async ( data: Data, @@ -10,7 +10,7 @@ export const UpdateProduct = async ( ) => { log.debug("Request received at UpdateProduct handler\n", data.request); try { - const { id, name, image, comment, price, preparation, weight, kilocalories, nutriscore, restaurant_id, type, categories, allergens } = data.request; + const { id, name, image, comment, price, preparation, weight, kilocalories, nutriscore, restaurant_id, type, categories, allergens } = data.request; const product = await prisma.product.update({ where : { id }, diff --git a/services/product/src/lib/log.ts b/services/product/src/lib/log.ts index 51a67102..22924008 100644 --- a/services/product/src/lib/log.ts +++ b/services/product/src/lib/log.ts @@ -1,74 +1,82 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ /* eslint-disable no-console */ +import { sendMessage } from "./rabbitmq"; + function getStackTrace() { - let stack; - - try { - throw new Error(""); - } catch (error) { - stack = (error as Error).stack || ""; - } - - stack = stack.split("\n").map((line) => line.trim()); - return stack.splice(stack[0] === "Error" ? 2 : 1); - } - - const getInitiator = () => { - // _getInitiatorLine, _ObjectInfoLine, caller - const [, , caller] = getStackTrace(); - const file = caller.split("/").at(-1) || ""; - return file.replace(")", ""); - }; - - const warn = (...args: any[]) => { - console.group( - `\x1b[33m${new Date().toISOString()} - WARN - ${getInitiator()}\x1b[0m` - ); - console.warn(...args); - console.groupEnd(); - }; - const error = (...args: any[]) => { - console.group( - `\x1b[31m${new Date().toISOString()} - ERROR - ${getInitiator()}\x1b[0m` - ); - console.error(...args); - console.groupEnd(); - }; - const info = (...args: any[]) => { - console.group( - `\x1b[34m${new Date().toISOString()} - INFO - ${getInitiator()}\x1b[0m` - ); - console.log(...args); - console.groupEnd(); - }; - const debug = (...args: any[]) => { - console.log(...args); - }; - - /** - * @description a simple interface logger for logging to the console and into a log drain in the future - * @example - * log.warn('this is a warning'); - * log.error('this is an error'); - * log.info('this is an info'); - * @exports log - */ - export const log = { - warn, - error, - info, - debug, - }; - - export const utils = { - bold: (text: string) => `\x1b[1m${text}\x1b[0m`, - red: (text: string) => `\x1b[31m${text}\x1b[0m`, - green: (text: string) => `\x1b[32m${text}\x1b[0m`, - yellow: (text: string) => `\x1b[33m${text}\x1b[0m`, - blue: (text: string) => `\x1b[34m${text}\x1b[0m`, - magenta: (text: string) => `\x1b[35m${text}\x1b[0m`, - cyan: (text: string) => `\x1b[36m${text}\x1b[0m`, - white: (text: string) => `\x1b[37m${text}\x1b[0m`, - gray: (text: string) => `\x1b[90m${text}\x1b[0m`, - }; \ No newline at end of file + let stack; + + try { + throw new Error(""); + } catch (error) { + stack = (error as Error).stack || ""; + } + + stack = stack.split("\n").map((line) => line.trim()); + return stack.splice(stack[0] === "Error" ? 2 : 1); +} + +const getInitiator = () => { + // _getInitiatorLine, _ObjectInfoLine, caller + const [, , caller] = getStackTrace(); + const file = caller.split("/").at(-1) || ""; + return file.replace(")", ""); +}; + +const warn = (...args: any[]) => { + sendMessage(...args); + console.group( + `\x1b[33m${new Date().toISOString()} - WARN - ${getInitiator()}\x1b[0m` + ); + console.warn(...args); + console.groupEnd(); +}; + +const error = (...args: any[]) => { + sendMessage(...args); + console.group( + `\x1b[31m${new Date().toISOString()} - ERROR - ${getInitiator()}\x1b[0m` + ); + console.error(...args); + console.groupEnd(); +}; + +const info = (...args: any[]) => { + sendMessage(...args); + console.group( + `\x1b[34m${new Date().toISOString()} - INFO - ${getInitiator()}\x1b[0m` + ); + console.log(...args); + console.groupEnd(); +}; + +const debug = (...args: any[]) => { + console.log(...args); +}; + +/** + * @description a simple interface logger for logging to the console and into a log drain in the future + * @example + * log.warn('this is a warning'); + * log.error('this is an error'); + * log.info('this is an info'); + * @exports log + */ +export const log = { + warn, + error, + info, + debug, +}; + +export const utils = { + bold: (text: string) => `\x1b[1m${text}\x1b[0m`, + red: (text: string) => `\x1b[31m${text}\x1b[0m`, + green: (text: string) => `\x1b[32m${text}\x1b[0m`, + yellow: (text: string) => `\x1b[33m${text}\x1b[0m`, + blue: (text: string) => `\x1b[34m${text}\x1b[0m`, + magenta: (text: string) => `\x1b[35m${text}\x1b[0m`, + cyan: (text: string) => `\x1b[36m${text}\x1b[0m`, + white: (text: string) => `\x1b[37m${text}\x1b[0m`, + gray: (text: string) => `\x1b[90m${text}\x1b[0m`, +}; \ No newline at end of file diff --git a/services/product/src/lib/rabbitmq.ts b/services/product/src/lib/rabbitmq.ts new file mode 100644 index 00000000..0a2769bb --- /dev/null +++ b/services/product/src/lib/rabbitmq.ts @@ -0,0 +1,11 @@ +import amqplib from 'amqplib'; + +export async function sendMessage(...args: String[]){ + const queue = 'tasks'; + const conn = await amqplib.connect('amqp://localhost'); + const ch = await conn.createChannel(); + + args.map( arg => { + ch.sendToQueue(queue, Buffer.from(JSON.stringify({"event_message": arg, "metadata": null}))); + }); +} \ No newline at end of file diff --git a/services/product/src/server.ts b/services/product/src/server.ts index ed57a2b2..bcd7fdb6 100644 --- a/services/product/src/server.ts +++ b/services/product/src/server.ts @@ -1,5 +1,5 @@ import { loadSync } from "@grpc/proto-loader"; -import { ServerCredentials, loadPackageDefinition, Server } from "@grpc/grpc-js"; +import { ServerCredentials, loadPackageDefinition, Server, GrpcObject } from "@grpc/grpc-js"; import { log, utils } from "./lib/log"; @@ -17,9 +17,9 @@ const options = { const serverInsecure = ServerCredentials.createInsecure(); -const PORT = process.env.PORT || 50008; +const PORT = process.env.PORT || 50004; const ADDRESS = `0.0.0.0:${PORT}`; -const PROTO_PATH = __dirname + "/../../protos/product.proto"; +const PROTO_PATH = __dirname + "/../../proto/product.proto"; const packageDefinition = loadSync(PROTO_PATH, options); const { product } = loadPackageDefinition(packageDefinition) as any; // todo: fix any diff --git a/services/product/src/types/Allergen.d.ts b/services/product/src/types/Allergen.d.ts index b827c2ea..0389df93 100644 --- a/services/product/src/types/Allergen.d.ts +++ b/services/product/src/types/Allergen.d.ts @@ -5,5 +5,8 @@ export interface AllergenId { export interface Allergen { id: string; libelle: string; - products: Product[]; +} + +export interface AllergenList{ + allergens: Allergen[]; } diff --git a/services/product/src/types/Category.d.ts b/services/product/src/types/Category.d.ts index 24339842..f5baf923 100644 --- a/services/product/src/types/Category.d.ts +++ b/services/product/src/types/Category.d.ts @@ -7,5 +7,8 @@ export interface Category { libelle: string; hexa_color: string; icon: string; - products: Product[]; +} + +export interface CategoryList{ + categories: Category[]; } \ No newline at end of file diff --git a/services/product/src/types/Product.d.ts b/services/product/src/types/Product.d.ts index 64010988..7012285a 100644 --- a/services/product/src/types/Product.d.ts +++ b/services/product/src/types/Product.d.ts @@ -1,5 +1,6 @@ -import { Category } from "@prisma/client"; -import { Empty } from "google-protobuf/google/protobuf/empty_pb"; +import { Allergen } from "@product/types/Allergen"; +import { Category } from "@product/types/Category"; + export enum ProductType { ENTREES = 0, @@ -20,7 +21,7 @@ export interface Product { kilocalories: string; nutriscore: number; restaurant_id: string; - type: Product_type; + type: ProductType; categories: Category[]; allergens: Allergen[]; } @@ -29,6 +30,10 @@ export interface ProductList { products: Product[]; } +export interface ProductTypeList { + productTypes: ProductType[]; +} + export interface ProductId { id: Product["id"]; } diff --git a/services/product/src/types/index.d.ts b/services/product/src/types/index.d.ts index 5315fc65..b0f9b4f5 100644 --- a/services/product/src/types/index.d.ts +++ b/services/product/src/types/index.d.ts @@ -1,3 +1,3 @@ export type Data = { - request: T; + request: T }; \ No newline at end of file diff --git a/services/product/tsconfig.json b/services/product/tsconfig.json index e075f973..c46ff48b 100644 --- a/services/product/tsconfig.json +++ b/services/product/tsconfig.json @@ -1,109 +1,18 @@ { "compilerOptions": { - /* Visit https://aka.ms/tsconfig to read more about this file */ - - /* Projects */ - // "incremental": true, /* Save .tsbuildinfo files to allow for incremental compilation of projects. */ - // "composite": true, /* Enable constraints that allow a TypeScript project to be used with project references. */ - // "tsBuildInfoFile": "./.tsbuildinfo", /* Specify the path to .tsbuildinfo incremental compilation file. */ - // "disableSourceOfProjectReferenceRedirect": true, /* Disable preferring source files instead of declaration files when referencing composite projects. */ - // "disableSolutionSearching": true, /* Opt a project out of multi-project reference checking when editing. */ - // "disableReferencedProjectLoad": true, /* Reduce the number of projects loaded automatically by TypeScript. */ - - /* Language and Environment */ - "target": "es2016", /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */ - // "lib": [], /* Specify a set of bundled library declaration files that describe the target runtime environment. */ - // "jsx": "preserve", /* Specify what JSX code is generated. */ - // "experimentalDecorators": true, /* Enable experimental support for legacy experimental decorators. */ - // "emitDecoratorMetadata": true, /* Emit design-type metadata for decorated declarations in source files. */ - // "jsxFactory": "", /* Specify the JSX factory function used when targeting React JSX emit, e.g. 'React.createElement' or 'h'. */ - // "jsxFragmentFactory": "", /* Specify the JSX Fragment reference used for fragments when targeting React JSX emit e.g. 'React.Fragment' or 'Fragment'. */ - // "jsxImportSource": "", /* Specify module specifier used to import the JSX factory functions when using 'jsx: react-jsx*'. */ - // "reactNamespace": "", /* Specify the object invoked for 'createElement'. This only applies when targeting 'react' JSX emit. */ - // "noLib": true, /* Disable including any library files, including the default lib.d.ts. */ - // "useDefineForClassFields": true, /* Emit ECMAScript-standard-compliant class fields. */ - // "moduleDetection": "auto", /* Control what method is used to detect module-format JS files. */ - - /* Modules */ - "module": "commonjs", /* Specify what module code is generated. */ - // "rootDir": "./", /* Specify the root folder within your source files. */ - // "moduleResolution": "node10", /* Specify how TypeScript looks up a file from a given module specifier. */ - // "baseUrl": "./", /* Specify the base directory to resolve non-relative module names. */ - // "paths": {}, /* Specify a set of entries that re-map imports to additional lookup locations. */ - // "rootDirs": [], /* Allow multiple folders to be treated as one when resolving modules. */ - // "typeRoots": [], /* Specify multiple folders that act like './node_modules/@types'. */ - // "types": [], /* Specify type package names to be included without being referenced in a source file. */ - // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ - // "moduleSuffixes": [], /* List of file name suffixes to search when resolving a module. */ - // "allowImportingTsExtensions": true, /* Allow imports to include TypeScript file extensions. Requires '--moduleResolution bundler' and either '--noEmit' or '--emitDeclarationOnly' to be set. */ - // "resolvePackageJsonExports": true, /* Use the package.json 'exports' field when resolving package imports. */ - // "resolvePackageJsonImports": true, /* Use the package.json 'imports' field when resolving imports. */ - // "customConditions": [], /* Conditions to set in addition to the resolver-specific defaults when resolving imports. */ - // "resolveJsonModule": true, /* Enable importing .json files. */ - // "allowArbitraryExtensions": true, /* Enable importing files with any extension, provided a declaration file is present. */ - // "noResolve": true, /* Disallow 'import's, 'require's or ''s from expanding the number of files TypeScript should add to a project. */ - - /* JavaScript Support */ - // "allowJs": true, /* Allow JavaScript files to be a part of your program. Use the 'checkJS' option to get errors from these files. */ - // "checkJs": true, /* Enable error reporting in type-checked JavaScript files. */ - // "maxNodeModuleJsDepth": 1, /* Specify the maximum folder depth used for checking JavaScript files from 'node_modules'. Only applicable with 'allowJs'. */ - - /* Emit */ - // "declaration": true, /* Generate .d.ts files from TypeScript and JavaScript files in your project. */ - // "declarationMap": true, /* Create sourcemaps for d.ts files. */ - // "emitDeclarationOnly": true, /* Only output d.ts files and not JavaScript files. */ - // "sourceMap": true, /* Create source map files for emitted JavaScript files. */ - // "inlineSourceMap": true, /* Include sourcemap files inside the emitted JavaScript. */ - // "outFile": "./", /* Specify a file that bundles all outputs into one JavaScript file. If 'declaration' is true, also designates a file that bundles all .d.ts output. */ - // "outDir": "./", /* Specify an output folder for all emitted files. */ - // "removeComments": true, /* Disable emitting comments. */ - // "noEmit": true, /* Disable emitting files from a compilation. */ - // "importHelpers": true, /* Allow importing helper functions from tslib once per project, instead of including them per-file. */ - // "importsNotUsedAsValues": "remove", /* Specify emit/checking behavior for imports that are only used for types. */ - // "downlevelIteration": true, /* Emit more compliant, but verbose and less performant JavaScript for iteration. */ - // "sourceRoot": "", /* Specify the root path for debuggers to find the reference source code. */ - // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ - // "inlineSources": true, /* Include source code in the sourcemaps inside the emitted JavaScript. */ - // "emitBOM": true, /* Emit a UTF-8 Byte Order Mark (BOM) in the beginning of output files. */ - // "newLine": "crlf", /* Set the newline character for emitting files. */ - // "stripInternal": true, /* Disable emitting declarations that have '@internal' in their JSDoc comments. */ - // "noEmitHelpers": true, /* Disable generating custom helper functions like '__extends' in compiled output. */ - // "noEmitOnError": true, /* Disable emitting files if any type checking errors are reported. */ - // "preserveConstEnums": true, /* Disable erasing 'const enum' declarations in generated code. */ - // "declarationDir": "./", /* Specify the output directory for generated declaration files. */ - // "preserveValueImports": true, /* Preserve unused imported values in the JavaScript output that would otherwise be removed. */ - - /* Interop Constraints */ - // "isolatedModules": true, /* Ensure that each file can be safely transpiled without relying on other imports. */ - // "verbatimModuleSyntax": true, /* Do not transform or elide any imports or exports not marked as type-only, ensuring they are written in the output file's format based on the 'module' setting. */ - // "allowSyntheticDefaultImports": true, /* Allow 'import x from y' when a module doesn't have a default export. */ - "esModuleInterop": true, /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */ - // "preserveSymlinks": true, /* Disable resolving symlinks to their realpath. This correlates to the same flag in node. */ - "forceConsistentCasingInFileNames": true, /* Ensure that casing is correct in imports. */ - - /* Type Checking */ - "strict": true, /* Enable all strict type-checking options. */ - // "noImplicitAny": true, /* Enable error reporting for expressions and declarations with an implied 'any' type. */ - // "strictNullChecks": true, /* When type checking, take into account 'null' and 'undefined'. */ - // "strictFunctionTypes": true, /* When assigning functions, check to ensure parameters and the return values are subtype-compatible. */ - // "strictBindCallApply": true, /* Check that the arguments for 'bind', 'call', and 'apply' methods match the original function. */ - // "strictPropertyInitialization": true, /* Check for class properties that are declared but not set in the constructor. */ - // "noImplicitThis": true, /* Enable error reporting when 'this' is given the type 'any'. */ - // "useUnknownInCatchVariables": true, /* Default catch clause variables as 'unknown' instead of 'any'. */ - // "alwaysStrict": true, /* Ensure 'use strict' is always emitted. */ - // "noUnusedLocals": true, /* Enable error reporting when local variables aren't read. */ - // "noUnusedParameters": true, /* Raise an error when a function parameter isn't read. */ - // "exactOptionalPropertyTypes": true, /* Interpret optional property types as written, rather than adding 'undefined'. */ - // "noImplicitReturns": true, /* Enable error reporting for codepaths that do not explicitly return in a function. */ - // "noFallthroughCasesInSwitch": true, /* Enable error reporting for fallthrough cases in switch statements. */ - // "noUncheckedIndexedAccess": true, /* Add 'undefined' to a type when accessed using an index. */ - // "noImplicitOverride": true, /* Ensure overriding members in derived classes are marked with an override modifier. */ - // "noPropertyAccessFromIndexSignature": true, /* Enforces using indexed accessors for keys declared using an indexed type. */ - // "allowUnusedLabels": true, /* Disable error reporting for unused labels. */ - // "allowUnreachableCode": true, /* Disable error reporting for unreachable code. */ - - /* Completeness */ - // "skipDefaultLibCheck": true, /* Skip type checking .d.ts files that are included with TypeScript. */ - "skipLibCheck": true /* Skip type checking all .d.ts files. */ + "sourceMap": true, + "outDir": "dist", + "strict": true, + "lib": ["esnext"], + "esModuleInterop": true, + "baseUrl": ".", + "paths": { + "@product/*": ["src/*"] + } + }, + "include": ["src/**/*.ts"], + "exclude": ["node_modules"], + "ts-node": { + "require": ["tsconfig-paths/register"] } -} +} \ No newline at end of file diff --git a/services/protos/.gitinclude b/services/proto/.gitinclude similarity index 100% rename from services/protos/.gitinclude rename to services/proto/.gitinclude diff --git a/services/protos/product.proto b/services/proto/product.proto similarity index 86% rename from services/protos/product.proto rename to services/proto/product.proto index 70ea11fe..8b03e18f 100644 --- a/services/protos/product.proto +++ b/services/proto/product.proto @@ -3,6 +3,7 @@ import "google/protobuf/empty.proto"; package product; +//Product type enum ProductType { ENTREES = 0; PLATS = 1; @@ -15,18 +16,20 @@ message ProductTypeList{ repeated ProductType productType = 1; } + message RestaurantId { string id = 1; } -message ProductList { - repeated Product products = 1; -} - +//Product message ProductId { string id = 1; } +message ProductList { + repeated Product products = 1; +} + message Product { string id = 1; string name = 2; @@ -51,6 +54,7 @@ message ProductIngredient { } +//Catégories message CategoryId { string id = 1; } @@ -60,10 +64,14 @@ message Category { string libelle = 2; string hexa_color = 3; string icon = 4; - repeated Product products = 5; +} + +message CategoryList{ + repeated Category categories = 1; } +//Allergen message AllergenId { string id = 1; } @@ -71,7 +79,10 @@ message AllergenId { message Allergen { string id = 1; string libelle = 2; - repeated Product products = 3; +} + +message AllergenList { + repeated Allergen allergens = 1; } service ProductService { @@ -85,6 +96,8 @@ service ProductService { } service AllergenService { + rpc GetAllergenList(google.protobuf.Empty) returns (AllergenList) {} + rpc CreateAllergen(Allergen) returns (Allergen) {} rpc ReadAllergen(AllergenId) returns (Allergen) {} rpc UpdateAllergen(Allergen) returns (Allergen) {} @@ -92,6 +105,8 @@ service AllergenService { } service CategoryService { + rpc GetCategoryList(google.protobuf.Empty) returns (CategoryList) {} + rpc CreateCategory(Category) returns (Category) {} rpc ReadCategory(CategoryId) returns (Category) {} rpc UpdateCategory(Category) returns (Category) {} From b15199c903a1575020c5ecfcbbf589f404e76f23 Mon Sep 17 00:00:00 2001 From: Pierre Lebigre Date: Wed, 10 May 2023 09:09:31 +0200 Subject: [PATCH 095/883] Add dockerfile and readme --- services/product/.env.example | 2 + services/product/Dockerfile | 38 +++++++++++++ services/product/README.md | 104 ++++++++++++++++++++++++++++++++++ 3 files changed, 144 insertions(+) create mode 100644 services/product/.env.example create mode 100644 services/product/Dockerfile create mode 100644 services/product/README.md diff --git a/services/product/.env.example b/services/product/.env.example new file mode 100644 index 00000000..7be71a81 --- /dev/null +++ b/services/product/.env.example @@ -0,0 +1,2 @@ +DATABASE_URL="postgresql://postgres:postgres@127.0.0.1:5432/postgres" +PORT = 50004 \ No newline at end of file diff --git a/services/product/Dockerfile b/services/product/Dockerfile new file mode 100644 index 00000000..f16d0ba6 --- /dev/null +++ b/services/product/Dockerfile @@ -0,0 +1,38 @@ +FROM node:18-alpine3.17 as builder + +# Set working directory +WORKDIR /app + +# Copy the application code +COPY ./product/ . + +# Install dependencies +RUN npm install + +# Copy the proto files +COPY ./proto ./proto/ + +# Generate Prisma client +RUN npx prisma generate + +# Build the application +RUN npm run build + + +# Create a new image with the application +FROM node:18-alpine3.17 as runner + +# Set working directory +WORKDIR /app + +# Copy the application package +COPY --from=builder /app/dist . +COPY --from=builder /app/prisma/ . +COPY --from=builder /app/proto/ /proto/ +COPY --from=builder /app/node_modules/.prisma /.prisma + +# Expose the gRPC port +EXPOSE 50004 + +# Start the server +CMD [ "node", "index.js"] \ No newline at end of file diff --git a/services/product/README.md b/services/product/README.md new file mode 100644 index 00000000..ec312d2a --- /dev/null +++ b/services/product/README.md @@ -0,0 +1,104 @@ +# Delivery Microservice + +| Informations | +|--------------------------------------------------------------------| +| **Port:** 50004 | +| **Developer:** @PierreLbg | +| **Status:** In progress | +| **Last update:** 2023-05-09 | +| **Language:** NodeJS | +| **Dependencies:** TypeScript, Prisma, gRPC, Postgres | +| **Models:** (see [`prisma/schema.prisma`](./prisma/schema.prisma)) | + +## gRPC Methods + +rpc GetProductTypeList(google.protobuf.Empty) returns (ProductTypeList) {} + rpc GetProductList(RestaurantId) returns (ProductList) {} + + rpc CreateProduct(Product) returns (Product) {} + rpc ReadProduct(ProductId) returns (Product) {} + rpc UpdateProduct(Product) returns (Product) {} + rpc DeleteProduct(ProductId) returns (google.protobuf.Empty) {} + +- Category model: + + - `CreateCategory`: Creates a new category in the system. + - `ReadCategory`: Retrieves a category by its ID. + - `UpdateCategory`: Updates the value of an existing category. + - `DeleteCategory`: Deletes a category by its ID. + - `GetCategoryList`: Retrieves all category in the system. + +- Allergen model: + - `CreateAllergen`: Creates a new allergen in the system. + - `ReadAllergen`: Retrieves a allergen by its ID. + - `UpdateAllergen`: Updates an existing allergen. + - `DeleteAllergen`: Deletes a allergen by its ID. + - `GetAllergenList`: Retrieves all allergen persons. + +- Product model: + - `CreateProduct`: Creates a new product in the system. + - `ReadProduct`: Retrieves a product by its ID. + - `UpdateProduct`: Updates an existing product. + - `DeleteProduct`: Deletes a product by its ID. + - `GetProductList`: Retrieves all product persons. + - `GetProductTypeList`: Retrieves all product persons. + +## Requirements + +To run this microservice, you will need to have the following installed on your system: + +- NodeJS (v18.12.0 or higher) (dev. with v18.12.0) +- Postgres (v15.2 or higher) (dev. with docker image `postgres:15.2`) + +You can use the following tools to help you with the setup: + +- You can use nvm to set your Node version using: + - `nvm use`. +- You can use docker to run your Postgres database using: + - `docker run --name postgres -p 5432:5432 -e POSTGRES_PASSWORD=password -d postgres` + +## Getting started + +### 1. Clone the repository and install dependencies + +1. Clone the `goodfood` repository to your local machine. +2. Navigate to the service directory (`services/product`) in your terminal. +3. Run `npm install` to install the necessary dependencies. +4. Create a `.env` file at the root of the project directory and add the environment variables values ( + see `.env.example`). +5. Run `npm run start` to start the microservice. + +You can now access the microservice at `http://localhost:50004`. + +NB: If you want to run the microservice in development mode, you can run `npm run dev` instead. + +### 2. Create and seed the database + +Run the following command to create your Postgres database structure. This also creates the models tables that are +defined in [`prisma/schema.prisma`](./prisma/schema.prisma): + +``` +npx prisma migrate dev --name init +``` + +When `npx prisma migrate dev` is executed against a newly created database, seeding is also triggered. The seed file +in [`prisma/seed.ts`](./prisma/seed.ts) will be executed and your database will be populated with the sample data. + +## Build and Run with Docker + +### Build + +To build the image you need to be in the **parent folder** of the service you want to build. Then run the following +command: + +``` +docker build -t goodfood-product:1.0.0 -f ./product/Dockerfile . +``` + +### Run + +Create the .env base on the .env.example. Then run the following command: + +``` +docker run --env-file=.env goodfood-product:1.0.0 +``` \ No newline at end of file From 4b264bec499625db774e2fc230c822ffeadbdf98 Mon Sep 17 00:00:00 2001 From: Florian LEROUX <10078837+floriaaan@users.noreply.github.com> Date: Wed, 10 May 2023 09:44:27 +0200 Subject: [PATCH 096/883] feat(tests): add tests --- services/order/package.json | 2 +- services/order/src/lib/struct.ts | 4 +- services/order/src/lib/transformer.ts | 10 +-- services/order/src/tests/struct.test.ts | 64 ++++++++++++++ services/order/src/tests/transformer.test.ts | 90 ++++++++++++++++++++ services/order/src/types/order.d.ts | 7 +- 6 files changed, 166 insertions(+), 11 deletions(-) create mode 100644 services/order/src/tests/struct.test.ts create mode 100644 services/order/src/tests/transformer.test.ts diff --git a/services/order/package.json b/services/order/package.json index 5eb82da3..c17ea276 100644 --- a/services/order/package.json +++ b/services/order/package.json @@ -5,7 +5,7 @@ "start": "node dist/index.js", "dev": "nodemon --watch 'src/**/*.ts' --exec 'ts-node' src/server.ts", "build": "esbuild src/server.ts --bundle --platform=node --target=node18 --outfile=dist/index.js", - "test": "echo 'tests are disabled' # vitest", + "test": "vitest", "coverage": "vitest --coverage", "pkg": "pkg .", "prisma:generate": "prisma generate", diff --git a/services/order/src/lib/struct.ts b/services/order/src/lib/struct.ts index 1897abf1..09a49b5a 100644 --- a/services/order/src/lib/struct.ts +++ b/services/order/src/lib/struct.ts @@ -10,6 +10,7 @@ export type Struct = { }; export const parseStruct = (struct: Struct) => { + if (!struct) return null; const fields = struct.fields; if (!fields || Object.keys(fields).length === 0) return null; @@ -32,12 +33,11 @@ export const toStruct = ( return { ...acc, [key]: { + kind: `${typeof value}Value`, [`${typeof value}Value`]: value, }, }; }, {}); - console.log(fields); - return { fields }; }; diff --git a/services/order/src/lib/transformer.ts b/services/order/src/lib/transformer.ts index 3e5a58fc..344b9fcc 100644 --- a/services/order/src/lib/transformer.ts +++ b/services/order/src/lib/transformer.ts @@ -1,12 +1,8 @@ import { toStruct } from "@order/lib/struct"; -import { Basket, Order, UserMinimum } from "@prisma/client"; +import { ExtendedOrder } from "@order/types/order"; -export const toGrpc = ( - order: Order & { - user: UserMinimum; - basket_snapshot: Basket; - } -) => { +export const toGrpc = (order: ExtendedOrder) => { + if(!order) return null return { id: order.id, payment_id: order.payment_id, diff --git a/services/order/src/tests/struct.test.ts b/services/order/src/tests/struct.test.ts new file mode 100644 index 00000000..482f189d --- /dev/null +++ b/services/order/src/tests/struct.test.ts @@ -0,0 +1,64 @@ +import { Struct, parseStruct, toStruct } from "@order/lib/struct"; +import { assert, describe, it } from "vitest"; + +describe("tests@goodfood/order.struct.parseStruct", function () { + it("tests @goodfood/order.struct.parseStruct in expected situation", () => { + const _struct = { + fields: { + id: { + kind: "stringValue", + stringValue: "1", + }, + name: { + kind: "numberValue", + numberValue: "2", + }, + }, + }; + const parsed = parseStruct(_struct); + assert.equal(parsed.id, "1"); + assert.equal(parsed.name, "2"); + }); + + it("tests @goodfood/order.struct.parseStruct with empty struct", () => { + const _struct = { + fields: {}, + }; + const parsed = parseStruct(_struct); + assert.equal(parsed, null); + }); + + it("tests @goodfood/order.struct.parseStruct with null struct", () => { + const _struct = null; + const parsed = parseStruct(_struct as unknown as Struct); + assert.equal(parsed, null); + }); +}); + +describe("tests@goodfood/order.struct.toStruct", function () { + it("tests @goodfood/order.struct.toStruct in expected situation", () => { + const _struct = { + id: 1, + name: "2", + }; + const parsed = toStruct(_struct); + assert.equal(parsed.fields.id.kind, "numberValue"); + assert.equal(parsed.fields.id.numberValue, 1); + assert.equal(parsed.fields.name.kind, "stringValue"); + assert.equal(parsed.fields.name.stringValue, "2"); + + assert.equal(Object.keys(parsed.fields).length, 2); + }); + + it("tests @goodfood/order.struct.toStruct with empty struct", () => { + const _struct = {}; + const parsed = toStruct(_struct); + assert.equal(Object.keys(parsed.fields).length, 0); + }); + + it("tests @goodfood/order.struct.toStruct with null struct", () => { + const _struct = null; + const parsed = toStruct(_struct as unknown as Struct); + assert.equal(Object.keys(parsed.fields).length, 0); + }) +}); diff --git a/services/order/src/tests/transformer.test.ts b/services/order/src/tests/transformer.test.ts new file mode 100644 index 00000000..9049bb75 --- /dev/null +++ b/services/order/src/tests/transformer.test.ts @@ -0,0 +1,90 @@ +import { toStruct } from "@order/lib/struct"; +import { toGrpc } from "@order/lib/transformer"; +import { ExtendedOrder } from "@order/types/order"; +import { Status } from "@prisma/client"; +import { assert, describe, it } from "vitest"; + +describe("tests@goodfood/order.transformer.toGrpc", function () { + it("tests @goodfood/order.transformer.toGrpc in expected situation", () => { + const _order: ExtendedOrder = { + id: "order_id:1", + payment_id: "payment_id:1", + delivery_id: "delivery_id:1", + user: { + id: "user_id:1", + first_name: "first_name", + last_name: "last_name", + email: "email", + phone: "phone", + }, + basket_snapshot: { + string: + '{"products":[{"id":"product_id:1","name":"product_name","price":1,"quantity":1}]}', + json: { + products: [ + { id: "product_id:1", name: "product_name", price: 1, quantity: 1 }, + ], + }, + }, + status: Status.PENDING, + }; + const parsed = toGrpc(_order); + + assert.equal(parsed?.id, "order_id:1"); + assert.equal(parsed?.payment_id, "payment_id:1"); + assert.equal(parsed?.delivery_id, "delivery_id:1"); + assert.equal(parsed?.user.id, "user_id:1"); + assert.equal(parsed?.user.first_name, "first_name"); + assert.equal(parsed?.user.last_name, "last_name"); + assert.equal(parsed?.user.email, "email"); + assert.equal(parsed?.user.phone, "phone"); + assert.equal( + parsed?.basket_snapshot.string, + '{"products":[{"id":"product_id:1","name":"product_name","price":1,"quantity":1}]}' + ); + assert.deepEqual( + parsed?.basket_snapshot.json, + toStruct(_order.basket_snapshot.json) + ); + assert.equal(parsed?.status, Status.PENDING); + }); + + it("tests @goodfood/order.transformer.toGrpc with empty order", () => { + const _order: ExtendedOrder = { + id: "", + payment_id: "", + delivery_id: "", + user: { + id: "", + first_name: "", + last_name: "", + email: "", + phone: "", + }, + basket_snapshot: { + string: "", + json: {}, + }, + status: Status.PENDING, + }; + const parsed = toGrpc(_order); + + assert.equal(parsed?.id, ""); + assert.equal(parsed?.payment_id, ""); + assert.equal(parsed?.delivery_id, ""); + assert.equal(parsed?.user.id, ""); + assert.equal(parsed?.user.first_name, ""); + assert.equal(parsed?.user.last_name, ""); + assert.equal(parsed?.user.email, ""); + assert.equal(parsed?.user.phone, ""); + assert.equal(parsed?.basket_snapshot.string, ""); + assert.deepEqual(parsed?.basket_snapshot.json, toStruct({})); + assert.equal(parsed?.status, Status.PENDING); + }); + + it("tests @goodfood/order.transformer.toGrpc with null order", () => { + const _order: ExtendedOrder = null as any; + const parsed = toGrpc(_order); + assert.equal(parsed, null); + }); +}); diff --git a/services/order/src/types/order.d.ts b/services/order/src/types/order.d.ts index ba22109c..e8e8d577 100644 --- a/services/order/src/types/order.d.ts +++ b/services/order/src/types/order.d.ts @@ -10,7 +10,7 @@ export type UserMinimum = { export type Basket = { string: string; - json?: string | Prisma.JsonValue | any; + json?: string | Prisma.JsonValue | any; }; export type Order = { @@ -47,3 +47,8 @@ export type DeleteOrderRequest = { export type DeleteOrderResponse = { id: string; }; + +export type ExtendedOrder = Order & { + user: UserMinimum; + basket_snapshot: Basket; +}; From 64c9f826ca5b54ddaa3d0fc78224aeafc4d049f7 Mon Sep 17 00:00:00 2001 From: anatole Date: Wed, 10 May 2023 11:44:51 +0200 Subject: [PATCH 097/883] feat(api): create the grpc api --- services/proto/user.pb.go | 270 ++++++++++--------- services/proto/user.proto | 7 +- services/user/README.md | 2 +- services/user/src/Makefile | 5 + services/user/src/go.mod | 2 +- services/user/src/main.go | 12 +- services/user/src/pkg/db/db.go | 2 +- services/user/src/pkg/mapper/userMapper.go | 48 ++++ services/user/src/pkg/models/main_address.go | 6 +- services/user/src/pkg/models/role.go | 2 +- services/user/src/pkg/models/user.go | 17 +- services/user/src/pkg/services/auth.go | 45 ++++ services/user/src/pkg/utils/hash.go | 15 ++ services/user/src/pkg/utils/jwt.go | 68 +++++ 14 files changed, 346 insertions(+), 155 deletions(-) create mode 100644 services/user/src/Makefile create mode 100644 services/user/src/pkg/mapper/userMapper.go create mode 100644 services/user/src/pkg/services/auth.go create mode 100644 services/user/src/pkg/utils/hash.go create mode 100644 services/user/src/pkg/utils/jwt.go diff --git a/services/proto/user.pb.go b/services/proto/user.pb.go index 244b7e3e..0cf49068 100644 --- a/services/proto/user.pb.go +++ b/services/proto/user.pb.go @@ -90,11 +90,12 @@ type MainAddress struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - Street string `protobuf:"bytes,2,opt,name=street,proto3" json:"street,omitempty"` - ZipCode string `protobuf:"bytes,3,opt,name=zipCode,proto3" json:"zipCode,omitempty"` - Country string `protobuf:"bytes,4,opt,name=country,proto3" json:"country,omitempty"` - Coordinates []int32 `protobuf:"varint,5,rep,packed,name=coordinates,proto3" json:"coordinates,omitempty"` + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + Street string `protobuf:"bytes,2,opt,name=street,proto3" json:"street,omitempty"` + ZipCode string `protobuf:"bytes,3,opt,name=zipCode,proto3" json:"zipCode,omitempty"` + Country string `protobuf:"bytes,4,opt,name=country,proto3" json:"country,omitempty"` + Lat float32 `protobuf:"fixed32,5,opt,name=lat,proto3" json:"lat,omitempty"` + Lng float32 `protobuf:"fixed32,6,opt,name=lng,proto3" json:"lng,omitempty"` } func (x *MainAddress) Reset() { @@ -157,11 +158,18 @@ func (x *MainAddress) GetCountry() string { return "" } -func (x *MainAddress) GetCoordinates() []int32 { +func (x *MainAddress) GetLat() float32 { if x != nil { - return x.Coordinates + return x.Lat } - return nil + return 0 +} + +func (x *MainAddress) GetLng() float32 { + if x != nil { + return x.Lng + } + return 0 } type User struct { @@ -853,142 +861,142 @@ var file_user_proto_rawDesc = []byte{ 0x6c, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x22, 0x8b, 0x01, 0x0a, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x22, 0x8d, 0x01, 0x0a, 0x0b, 0x4d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x72, 0x65, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x72, 0x65, 0x65, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x7a, 0x69, 0x70, 0x43, 0x6f, 0x64, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x7a, 0x69, 0x70, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x07, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x6f, 0x6f, 0x72, - 0x64, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x05, 0x52, 0x0b, 0x63, - 0x6f, 0x6f, 0x72, 0x64, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x73, 0x22, 0x9c, 0x02, 0x0a, 0x04, 0x55, - 0x73, 0x65, 0x72, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x02, 0x69, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x66, 0x69, 0x72, 0x73, 0x74, 0x5f, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x66, 0x69, 0x72, 0x73, 0x74, 0x4e, 0x61, - 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6c, 0x61, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, - 0x14, 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x68, 0x6f, 0x6e, 0x65, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x68, 0x6f, 0x6e, 0x65, 0x12, 0x40, 0x0a, 0x0b, 0x6d, - 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1e, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, - 0x75, 0x73, 0x65, 0x72, 0x2e, 0x4d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, - 0x52, 0x0b, 0x6d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x2b, 0x0a, - 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6f, - 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, - 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x12, 0x2d, 0x0a, 0x05, 0x74, 0x6f, - 0x6b, 0x65, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, - 0x63, 0x74, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x8e, 0x02, 0x0a, 0x0f, 0x55, 0x73, - 0x65, 0x72, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x12, 0x1d, 0x0a, - 0x0a, 0x66, 0x69, 0x72, 0x73, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x09, 0x66, 0x69, 0x72, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x09, - 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x6c, 0x61, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6d, 0x61, - 0x69, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x12, - 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x70, - 0x68, 0x6f, 0x6e, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x68, 0x6f, 0x6e, - 0x65, 0x12, 0x45, 0x0a, 0x0b, 0x6d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, - 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, - 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x4d, 0x61, 0x69, 0x6e, 0x41, - 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x52, 0x0b, 0x6d, 0x61, 0x69, - 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x30, 0x0a, 0x04, 0x72, 0x6f, 0x6c, 0x65, - 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, - 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, - 0x6e, 0x70, 0x75, 0x74, 0x52, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x22, 0x80, 0x01, 0x0a, 0x10, 0x4d, - 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x12, - 0x16, 0x0a, 0x06, 0x73, 0x74, 0x72, 0x65, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x06, 0x73, 0x74, 0x72, 0x65, 0x65, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x7a, 0x69, 0x70, 0x43, 0x6f, - 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x7a, 0x69, 0x70, 0x43, 0x6f, 0x64, - 0x65, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x63, - 0x6f, 0x6f, 0x72, 0x64, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x05, - 0x52, 0x0b, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x73, 0x22, 0x1f, 0x0a, - 0x09, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, - 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x22, 0x18, - 0x0a, 0x06, 0x55, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x39, 0x0a, 0x08, 0x55, 0x73, 0x65, 0x72, - 0x4c, 0x69, 0x73, 0x74, 0x12, 0x2d, 0x0a, 0x05, 0x75, 0x73, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, - 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x05, 0x75, 0x73, - 0x65, 0x72, 0x73, 0x22, 0x56, 0x0a, 0x0a, 0x6c, 0x6f, 0x67, 0x49, 0x6e, 0x49, 0x6e, 0x70, 0x75, - 0x74, 0x12, 0x16, 0x0a, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6d, 0x61, - 0x69, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x12, - 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x22, 0x36, 0x0a, 0x05, 0x74, - 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x2d, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x05, 0x74, 0x6f, - 0x6b, 0x65, 0x6e, 0x22, 0x59, 0x0a, 0x13, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x61, 0x73, - 0x73, 0x77, 0x6f, 0x72, 0x64, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x6f, 0x6c, - 0x64, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0b, 0x6f, 0x6c, 0x64, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x20, 0x0a, 0x0b, - 0x6e, 0x65, 0x77, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0b, 0x6e, 0x65, 0x77, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x22, 0x45, - 0x0a, 0x0f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x70, 0x75, - 0x74, 0x12, 0x16, 0x0a, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x6f, 0x6c, - 0x65, 0x43, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x6f, 0x6c, - 0x65, 0x43, 0x6f, 0x64, 0x65, 0x22, 0x1f, 0x0a, 0x0d, 0x4d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, - 0x72, 0x65, 0x73, 0x73, 0x49, 0x64, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x32, 0x92, 0x05, 0x0a, 0x0b, 0x55, 0x73, 0x65, 0x72, 0x53, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x49, 0x0a, 0x08, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, + 0x07, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6c, 0x61, 0x74, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x02, 0x52, 0x03, 0x6c, 0x61, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6c, 0x6e, + 0x67, 0x18, 0x06, 0x20, 0x01, 0x28, 0x02, 0x52, 0x03, 0x6c, 0x6e, 0x67, 0x22, 0x9c, 0x02, 0x0a, + 0x04, 0x55, 0x73, 0x65, 0x72, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x66, 0x69, 0x72, 0x73, 0x74, 0x5f, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x66, 0x69, 0x72, 0x73, 0x74, + 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6c, 0x61, 0x73, 0x74, 0x4e, 0x61, 0x6d, + 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x68, 0x6f, 0x6e, 0x65, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x68, 0x6f, 0x6e, 0x65, 0x12, 0x40, 0x0a, + 0x0b, 0x6d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x06, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, + 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x4d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, + 0x73, 0x73, 0x52, 0x0b, 0x6d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, + 0x2b, 0x0a, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, + 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, + 0x72, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x12, 0x2d, 0x0a, 0x05, + 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, + 0x72, 0x75, 0x63, 0x74, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x8e, 0x02, 0x0a, 0x0f, + 0x55, 0x73, 0x65, 0x72, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x12, + 0x1d, 0x0a, 0x0a, 0x66, 0x69, 0x72, 0x73, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x09, 0x66, 0x69, 0x72, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1b, + 0x0a, 0x09, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x6c, 0x61, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, + 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, + 0x6c, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x14, 0x0a, + 0x05, 0x70, 0x68, 0x6f, 0x6e, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x68, + 0x6f, 0x6e, 0x65, 0x12, 0x45, 0x0a, 0x0b, 0x6d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, + 0x73, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, + 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x4d, 0x61, 0x69, + 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x52, 0x0b, 0x6d, + 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x30, 0x0a, 0x04, 0x72, 0x6f, + 0x6c, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, + 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x52, 0x6f, 0x6c, + 0x65, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x52, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x22, 0x80, 0x01, 0x0a, + 0x10, 0x4d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x49, 0x6e, 0x70, 0x75, + 0x74, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x72, 0x65, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x06, 0x73, 0x74, 0x72, 0x65, 0x65, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x7a, 0x69, 0x70, + 0x43, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x7a, 0x69, 0x70, 0x43, + 0x6f, 0x64, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x20, 0x0a, + 0x0b, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, + 0x28, 0x05, 0x52, 0x0b, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x73, 0x22, + 0x1f, 0x0a, 0x09, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x12, 0x12, 0x0a, 0x04, + 0x63, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, + 0x22, 0x18, 0x0a, 0x06, 0x55, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x39, 0x0a, 0x08, 0x55, 0x73, + 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x2d, 0x0a, 0x05, 0x75, 0x73, 0x65, 0x72, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, + 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x05, + 0x75, 0x73, 0x65, 0x72, 0x73, 0x22, 0x56, 0x0a, 0x0a, 0x6c, 0x6f, 0x67, 0x49, 0x6e, 0x49, 0x6e, + 0x70, 0x75, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x65, + 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, + 0x6c, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x22, 0x36, 0x0a, + 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x2d, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x05, + 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x59, 0x0a, 0x13, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, + 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x12, 0x20, 0x0a, 0x0b, + 0x6f, 0x6c, 0x64, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0b, 0x6f, 0x6c, 0x64, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x20, + 0x0a, 0x0b, 0x6e, 0x65, 0x77, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0b, 0x6e, 0x65, 0x77, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, + 0x22, 0x45, 0x0a, 0x0f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, + 0x70, 0x75, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x72, + 0x6f, 0x6c, 0x65, 0x43, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, + 0x6f, 0x6c, 0x65, 0x43, 0x6f, 0x64, 0x65, 0x22, 0x1f, 0x0a, 0x0d, 0x4d, 0x61, 0x69, 0x6e, 0x41, + 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x49, 0x64, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x32, 0x92, 0x05, 0x0a, 0x0b, 0x55, 0x73, 0x65, + 0x72, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x49, 0x0a, 0x08, 0x52, 0x65, 0x67, 0x69, + 0x73, 0x74, 0x65, 0x72, 0x12, 0x22, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, + 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x43, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x17, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, + 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, + 0x72, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x12, 0x19, + 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, + 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x49, 0x64, 0x1a, 0x17, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, + 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, 0x73, + 0x65, 0x72, 0x22, 0x00, 0x12, 0x4b, 0x0a, 0x0a, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x12, 0x22, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x17, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x22, - 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x12, 0x19, 0x2e, 0x63, - 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, - 0x2e, 0x55, 0x73, 0x65, 0x72, 0x49, 0x64, 0x1a, 0x17, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, - 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, - 0x22, 0x00, 0x12, 0x4b, 0x0a, 0x0a, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, - 0x12, 0x22, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, - 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x49, - 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x17, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, - 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x22, 0x00, 0x12, - 0x41, 0x0a, 0x0a, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x12, 0x19, 0x2e, + 0x00, 0x12, 0x41, 0x0a, 0x0a, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x12, + 0x19, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, + 0x73, 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x49, 0x64, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, + 0x74, 0x79, 0x22, 0x00, 0x12, 0x44, 0x0a, 0x08, 0x4c, 0x69, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, + 0x12, 0x19, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, + 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x49, 0x64, 0x1a, 0x1b, 0x2e, 0x63, 0x6f, + 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, + 0x55, 0x73, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x22, 0x00, 0x12, 0x41, 0x0a, 0x05, 0x4c, 0x6f, + 0x67, 0x49, 0x6e, 0x12, 0x1d, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, + 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x6c, 0x6f, 0x67, 0x49, 0x6e, 0x49, 0x6e, 0x70, + 0x75, 0x74, 0x1a, 0x17, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, + 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x22, 0x00, 0x12, 0x3c, 0x0a, + 0x06, 0x4c, 0x6f, 0x67, 0x4f, 0x75, 0x74, 0x12, 0x18, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, + 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x74, 0x6f, 0x6b, 0x65, + 0x6e, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x53, 0x0a, 0x0e, 0x43, + 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x26, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, - 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x49, 0x64, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, - 0x22, 0x00, 0x12, 0x44, 0x0a, 0x08, 0x4c, 0x69, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, 0x12, 0x19, + 0x72, 0x2e, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, + 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x17, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, + 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x22, 0x00, + 0x12, 0x4b, 0x0a, 0x0a, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x12, 0x22, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, - 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x49, 0x64, 0x1a, 0x1b, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, - 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, 0x73, - 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x22, 0x00, 0x12, 0x41, 0x0a, 0x05, 0x4c, 0x6f, 0x67, 0x49, - 0x6e, 0x12, 0x1d, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, - 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x6c, 0x6f, 0x67, 0x49, 0x6e, 0x49, 0x6e, 0x70, 0x75, 0x74, - 0x1a, 0x17, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, - 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x22, 0x00, 0x12, 0x3c, 0x0a, 0x06, 0x4c, - 0x6f, 0x67, 0x4f, 0x75, 0x74, 0x12, 0x18, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, - 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x1a, - 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x53, 0x0a, 0x0e, 0x43, 0x68, 0x61, - 0x6e, 0x67, 0x65, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x26, 0x2e, 0x63, 0x6f, - 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, - 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x49, 0x6e, - 0x70, 0x75, 0x74, 0x1a, 0x17, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, - 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x22, 0x00, 0x12, 0x4b, - 0x0a, 0x0a, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x12, 0x22, 0x2e, 0x63, - 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, - 0x2e, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x70, 0x75, 0x74, - 0x1a, 0x17, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, - 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x22, 0x00, 0x32, 0xbb, 0x01, 0x0a, 0x12, - 0x4d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x53, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x12, 0x54, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x4d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, - 0x72, 0x65, 0x73, 0x73, 0x12, 0x20, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, - 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x4d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, - 0x72, 0x65, 0x73, 0x73, 0x49, 0x64, 0x1a, 0x1e, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, + 0x65, 0x72, 0x2e, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x70, + 0x75, 0x74, 0x1a, 0x17, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, + 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x22, 0x00, 0x32, 0xbb, 0x01, + 0x0a, 0x12, 0x4d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x53, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x12, 0x54, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x4d, 0x61, 0x69, 0x6e, 0x41, + 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x20, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x4d, 0x61, 0x69, 0x6e, 0x41, - 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x22, 0x00, 0x12, 0x4f, 0x0a, 0x11, 0x44, 0x65, 0x6c, 0x65, - 0x74, 0x65, 0x4d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x20, 0x2e, - 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, - 0x72, 0x2e, 0x4d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x49, 0x64, 0x1a, - 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x42, 0x03, 0x5a, 0x01, 0x2e, 0x62, 0x06, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x49, 0x64, 0x1a, 0x1e, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, + 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x4d, 0x61, 0x69, + 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x22, 0x00, 0x12, 0x4f, 0x0a, 0x11, 0x44, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, + 0x20, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, + 0x73, 0x65, 0x72, 0x2e, 0x4d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x49, + 0x64, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x42, 0x03, 0x5a, 0x01, 0x2e, + 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/services/proto/user.proto b/services/proto/user.proto index 599240f3..b1d335c5 100644 --- a/services/proto/user.proto +++ b/services/proto/user.proto @@ -1,10 +1,10 @@ syntax = "proto3"; +package com.goodfood.user; + import "google/protobuf/struct.proto"; import "google/protobuf/empty.proto"; -package com.goodfood.user; - option go_package = "."; message Role { @@ -18,7 +18,8 @@ message MainAddress { string street = 2; string zipCode = 3; string country = 4; - repeated int32 coordinates = 5; + float lat = 5; + float lng = 6; } message User { diff --git a/services/user/README.md b/services/user/README.md index b9dc0125..ceaf8c7d 100644 --- a/services/user/README.md +++ b/services/user/README.md @@ -52,7 +52,7 @@ You can use the following tools to help you with the setup: 5. Run `go run main.go` to start the microservice. If protos are updated, you will need to regenerate the gRPC code using the following command: -`protoc -I . user.proto --go-grpc_out=. --go_out=.` +`protoc -I . user.proto --go-grpc_out=. --go_out=.` in the proto directory. You can now access the microservice at `http://localhost:50001`. diff --git a/services/user/src/Makefile b/services/user/src/Makefile new file mode 100644 index 00000000..96cf0a0f --- /dev/null +++ b/services/user/src/Makefile @@ -0,0 +1,5 @@ +proto: + protoc -I ./proto/. user.proto --go-grpc_out=./proto/. --go_out=./proto/. + +server: + go run cmd/main.go \ No newline at end of file diff --git a/services/user/src/go.mod b/services/user/src/go.mod index cf956b96..62d86fdb 100644 --- a/services/user/src/go.mod +++ b/services/user/src/go.mod @@ -1,4 +1,4 @@ -module main +module goodfood-user go 1.19 diff --git a/services/user/src/main.go b/services/user/src/main.go index 0bd5a013..01e0af44 100644 --- a/services/user/src/main.go +++ b/services/user/src/main.go @@ -2,13 +2,13 @@ package main import ( "fmt" + "goodfood-user/pkg/config" + "goodfood-user/pkg/db" + "goodfood-user/pkg/services" + "goodfood-user/pkg/utils" + pb "goodfood-user/proto" "google.golang.org/grpc" "log" - "main/pkg/config" - "main/pkg/db" - "main/pkg/pb" - "main/pkg/services" - "main/pkg/utils" "net" ) @@ -42,7 +42,7 @@ func main() { grpcServer := grpc.NewServer() - pb.RegisterAuthServiceServer(grpcServer, &s) + pb.RegisterUserServiceServer(grpcServer, &s) if err := grpcServer.Serve(lis); err != nil { log.Fatalln("Failed to serve:", err) diff --git a/services/user/src/pkg/db/db.go b/services/user/src/pkg/db/db.go index 006b41aa..75e10165 100644 --- a/services/user/src/pkg/db/db.go +++ b/services/user/src/pkg/db/db.go @@ -1,10 +1,10 @@ package db import ( + "goodfood-user/pkg/models" "gorm.io/driver/postgres" "gorm.io/gorm" "log" - "main/pkg/models" ) type Handler struct { diff --git a/services/user/src/pkg/mapper/userMapper.go b/services/user/src/pkg/mapper/userMapper.go new file mode 100644 index 00000000..b1ad5849 --- /dev/null +++ b/services/user/src/pkg/mapper/userMapper.go @@ -0,0 +1,48 @@ +package mapper + +import ( + "encoding/json" + "fmt" + "goodfood-user/pkg/models" + pb "goodfood-user/proto" + "google.golang.org/protobuf/types/known/structpb" +) + +func ToProtoUser(user *models.User) *pb.User { + TokenMap := make(map[string]interface{}) + err := json.Unmarshal(user.Token, &TokenMap) + if err != nil { + fmt.Printf("failed to unmarshal metadata: %v", err) + } + token, _ := structpb.NewStruct(TokenMap) + + return &pb.User{ + Id: user.Id, + FirstName: user.FirstName, + LastName: user.LastName, + Email: user.Email, + Phone: user.Phone, + MainAddress: ToProtoMainAddress(user.MainAddress), + Role: ToProtoRole(user.Role), + Token: token, + } +} + +func ToProtoMainAddress(address models.MainAddress) *pb.MainAddress { + return &pb.MainAddress{ + Id: address.Id, + Street: address.Street, + ZipCode: address.ZipCode, + Country: address.Country, + Lat: address.Lat, + Lng: address.Lng, + } +} + +func ToProtoRole(role models.Role) *pb.Role { + return &pb.Role{ + Id: role.Id, + Label: role.Label, + Code: role.Code, + } +} diff --git a/services/user/src/pkg/models/main_address.go b/services/user/src/pkg/models/main_address.go index 32e9803f..e4b44112 100644 --- a/services/user/src/pkg/models/main_address.go +++ b/services/user/src/pkg/models/main_address.go @@ -1,10 +1,10 @@ package models type MainAddress struct { - Id int64 `json:"id" gorm:"primaryKey"` + Id string `json:"id" gorm:"primaryKey"` Street string `json:"street" gorm:"type:varchar(255);not null"` ZipCode string `json:"zip_code" gorm:"type:varchar(5);not null"` Country string `json:"country" gorm:"type:varchar(255);not null"` - Lat float64 `gorm:"type:decimal(10,8)"` - Lng float64 `gorm:"type:decimal(11,8)"` + Lat float32 `gorm:"type:decimal(10,8)"` + Lng float32 `gorm:"type:decimal(11,8)"` } diff --git a/services/user/src/pkg/models/role.go b/services/user/src/pkg/models/role.go index 14a34ca1..c90decfe 100644 --- a/services/user/src/pkg/models/role.go +++ b/services/user/src/pkg/models/role.go @@ -1,7 +1,7 @@ package models type Role struct { - Id int64 `json:"id" gorm:"primaryKey"` + Id string `json:"id" gorm:"primaryKey"` Code string `json:"code" gorm:"type:varchar(255);uniqueIndex;not null"` Label string `json:"label" gorm:"type:varchar(255);not null"` } diff --git a/services/user/src/pkg/models/user.go b/services/user/src/pkg/models/user.go index b89d205f..deb58b4c 100644 --- a/services/user/src/pkg/models/user.go +++ b/services/user/src/pkg/models/user.go @@ -1,12 +1,13 @@ package models type User struct { - Id int64 `json:"id" gorm:"primaryKey"` - Email string `json:"email" gorm:"type:varchar(255);not null"` - Password string `json:"password" gorm:"type:varchar(255);not null"` - Phone string `json:"phone" gorm:"type:varchar(10)"` - LastName string `json:"last_name" gorm:"type:varchar(100);not null"` - FirstName string `json:"first_name" gorm:"type:varchar(100);not null"` - MainAddressId int64 `json:"main_address_id" gorm:"type:bigint;not null"` - Role Role `json:"role" gorm:"foreignKey:RoleId"` + Id string `json:"id" gorm:"primaryKey"` + Email string `json:"email" gorm:"type:varchar(255);not null"` + Password string `json:"password" gorm:"type:varchar(255);not null"` + Phone string `json:"phone" gorm:"type:varchar(10)"` + LastName string `json:"last_name" gorm:"type:varchar(100);not null"` + FirstName string `json:"first_name" gorm:"type:varchar(100);not null"` + MainAddress MainAddress `json:"main_address" gorm:"foreignKey:MainAddressId"` + Role Role `json:"role" gorm:"foreignKey:RoleId"` + Token []uint8 `json:"token" gorm:"type:jsonb, default:'{}'"` } diff --git a/services/user/src/pkg/services/auth.go b/services/user/src/pkg/services/auth.go new file mode 100644 index 00000000..b6b16ba7 --- /dev/null +++ b/services/user/src/pkg/services/auth.go @@ -0,0 +1,45 @@ +package services + +import ( + "context" + "goodfood-user/pkg/db" + "goodfood-user/pkg/mapper" + "goodfood-user/pkg/models" + "goodfood-user/pkg/utils" + pb "goodfood-user/proto" +) + +type Server struct { + H db.Handler + Jwt utils.JwtWrapper +} + +func (s *Server) Register(ctx context.Context, req *pb.UserCreateInput) (*pb.User, error) { + var user models.User + + if result := s.H.DB.Where(&models.User{Email: req.Email}).First(&user); result.Error == nil { + return nil, result.Error + } + + user.Email = req.Email + user.Password = utils.HashPassword(req.Password) + + s.H.DB.Create(&user) + + return mapper.ToProtoUser(&user), nil +} + +func (s *Server) GetUser(ctx context.Context, req *pb.UserCreateInput) (*pb.User, error) { + var user models.User + + if result := s.H.DB.Where(&models.User{Email: req.Email}).First(&user); result.Error == nil { + return nil, result.Error + } + + user.Email = req.Email + user.Password = utils.HashPassword(req.Password) + + s.H.DB.Create(&user) + + return mapper.ToProtoUser(&user), nil +} diff --git a/services/user/src/pkg/utils/hash.go b/services/user/src/pkg/utils/hash.go new file mode 100644 index 00000000..da656981 --- /dev/null +++ b/services/user/src/pkg/utils/hash.go @@ -0,0 +1,15 @@ +package utils + +import "golang.org/x/crypto/bcrypt" + +func HashPassword(password string) string { + bytes, _ := bcrypt.GenerateFromPassword([]byte(password), 5) + + return string(bytes) +} + +func CheckPasswordHash(password string, hash string) bool { + err := bcrypt.CompareHashAndPassword([]byte(hash), []byte(password)) + + return err == nil +} diff --git a/services/user/src/pkg/utils/jwt.go b/services/user/src/pkg/utils/jwt.go new file mode 100644 index 00000000..d9016f47 --- /dev/null +++ b/services/user/src/pkg/utils/jwt.go @@ -0,0 +1,68 @@ +package utils + +import ( + "errors" + "github.com/golang-jwt/jwt" + "main/pkg/models" + "time" +) + +type JwtWrapper struct { + SecretKey string + Issuer string + ExpirationHours int64 +} + +type jwtClaims struct { + jwt.StandardClaims + Id int64 + Email string +} + +func (w *JwtWrapper) GenerateToken(user models.User) (signedToken string, err error) { + claims := &jwtClaims{ + Id: user.Id, + Email: user.Email, + StandardClaims: jwt.StandardClaims{ + ExpiresAt: time.Now().Local().Add(time.Hour * time.Duration(w.ExpirationHours)).Unix(), + Issuer: w.Issuer, + }, + } + + token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims) + + signedToken, err = token.SignedString([]byte(w.SecretKey)) + + if err != nil { + return "", err + } + + return signedToken, nil +} + +func (w *JwtWrapper) ValidateToken(signedToken string) (claims *jwtClaims, err error) { + token, err := jwt.ParseWithClaims( + signedToken, + &jwtClaims{}, + func(token *jwt.Token) (interface{}, error) { + return []byte(w.SecretKey), nil + }, + ) + + if err != nil { + return + } + + claims, ok := token.Claims.(*jwtClaims) + + if !ok { + return nil, errors.New("Couldn't parse claims") + } + + if claims.ExpiresAt < time.Now().Local().Unix() { + return nil, errors.New("JWT is expired") + } + + return claims, nil + +} From f0a362b7542121bdcd68573d3c826c11a7887331 Mon Sep 17 00:00:00 2001 From: Florian LEROUX <10078837+floriaaan@users.noreply.github.com> Date: Wed, 10 May 2023 14:15:57 +0200 Subject: [PATCH 098/883] feat(proxy): add server proxy to add amqp publishing log --- services/order/.env.example | 2 + services/order/README.md | 31 +++-- services/order/package.json | 2 + services/order/pnpm-lock.yaml | 76 ++++++++++- services/order/src/handlers/order/create.ts | 1 - services/order/src/handlers/order/delete.ts | 1 - services/order/src/handlers/order/get.ts | 1 - services/order/src/handlers/order/update.ts | 1 - services/order/src/lib/amqp.ts | 33 +++++ services/order/src/lib/proxy.ts | 132 ++++++++++++++++++++ services/order/src/middleware/log.ts | 39 ++++++ services/order/src/server.ts | 7 +- 12 files changed, 305 insertions(+), 21 deletions(-) create mode 100644 services/order/src/lib/amqp.ts create mode 100644 services/order/src/lib/proxy.ts create mode 100644 services/order/src/middleware/log.ts diff --git a/services/order/.env.example b/services/order/.env.example index 54d2fa33..4caef961 100644 --- a/services/order/.env.example +++ b/services/order/.env.example @@ -3,4 +3,6 @@ DB_PASS=pass DB_HOST=mongodb DATABASE_URL=mongodb+srv://${DB_USER}:${DB_PASS}@${DB_HOST}/order?retryWrites=true&w=majority +AMQP_URL=amqp://guest:guest@localhost + PORT=50007 \ No newline at end of file diff --git a/services/order/README.md b/services/order/README.md index 7cace267..5da48544 100644 --- a/services/order/README.md +++ b/services/order/README.md @@ -1,30 +1,39 @@ # Order Microservice -| Informations | -| ------------------------------------------- | -| **Port:** 50007 | -| **Developer:** @floriaaan | -| **Status:** In progress | -| **Last update:** 2023-04-16 | -| **Language:** NodeJS | -| **Dependencies:** TypeScript, gRPC, MongoDB | -| **Models:** ? | +| Informations | +| ------------------------------------------------- | +| **Port:** 50007 | +| **Developer:** @floriaaan | +| **Status:** In progress | +| **Last update:** 2023-05-10 | +| **Language:** NodeJS | +| **Dependencies:** TypeScript, gRPC, MongoDB, AMQP | +| **Models:** | ## gRPC Methods -TBW +The service provides the following gRPC methods: + +- `GetOrder`: Retrieves an order by its ID. +- `CreateOrder`: Creates a new order. +- `UpdateOrder`: Updates an existing order. +- `DeleteOrder`: Deletes an order by its ID. ## Requirements To run this microservice, you will need to have the following installed on your system: - NodeJS (v18.12.0 or higher) (dev. with v18.12.0) -- MongoDB +- MongoDB (dev. with mongoDB Atlas) You can use the following tools to help you with the setup: - You can use nvm to set your Node version using: - `nvm use`. +- You can use docker to run your MongoDB server using: + - `docker run --name mongodb -p 27017:27017 -d mongo:latest` +- You can use docker to run your RabbitMQ server using: + - `docker run --name rabbitmq -p 5672:5672 -p 15672:15672 -d rabbitmq:3-management` ## Getting started diff --git a/services/order/package.json b/services/order/package.json index c17ea276..dedafdc5 100644 --- a/services/order/package.json +++ b/services/order/package.json @@ -17,11 +17,13 @@ "@grpc/grpc-js": "1.8.14", "@grpc/proto-loader": "0.7.6", "@prisma/client": "4.13.0", + "amqplib": "^0.10.3", "dotenv": "^16.0.3", "grpc-server-reflection": "^0.1.5", "protobufjs": "7.2.2" }, "devDependencies": { + "@types/amqplib": "^0.10.1", "@types/node": "18.15.9", "@vitest/coverage-c8": "^0.29.8", "esbuild": "^0.17.18", diff --git a/services/order/pnpm-lock.yaml b/services/order/pnpm-lock.yaml index 89c3b1e5..6d13847a 100644 --- a/services/order/pnpm-lock.yaml +++ b/services/order/pnpm-lock.yaml @@ -10,6 +10,9 @@ dependencies: '@prisma/client': specifier: 4.13.0 version: 4.13.0(prisma@4.13.0) + amqplib: + specifier: ^0.10.3 + version: 0.10.3 dotenv: specifier: ^16.0.3 version: 16.0.3 @@ -21,6 +24,9 @@ dependencies: version: 7.2.2 devDependencies: + '@types/amqplib': + specifier: ^0.10.1 + version: 0.10.1 '@types/node': specifier: 18.15.9 version: 18.15.9 @@ -63,6 +69,17 @@ devDependencies: packages: + /@acuminous/bitsyntax@0.1.2: + resolution: {integrity: sha512-29lUK80d1muEQqiUsSo+3A0yP6CdspgC95EnKBMi22Xlwt79i/En4Vr67+cXhU+cZjbti3TgGGC5wy1stIywVQ==} + engines: {node: '>=0.8'} + dependencies: + buffer-more-ints: 1.0.0 + debug: 4.3.4 + safe-buffer: 5.1.2 + transitivePeerDependencies: + - supports-color + dev: false + /@babel/generator@7.18.2: resolution: {integrity: sha512-W1lG5vUwFvfMd8HVXqdfbuG7RuaSrTCCD8cl8fP8wOivdbtbIg2Db3IWUcgvfxKbbn6ZBGYRW/Zk1MIwK49mgw==} engines: {node: '>=6.9.0'} @@ -499,6 +516,12 @@ packages: resolution: {integrity: sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==} dev: true + /@types/amqplib@0.10.1: + resolution: {integrity: sha512-j6ANKT79ncUDnAs/+9r9eDujxbeJoTjoVu33gHHcaPfmLQaMhvfbH2GqSe8KUM444epAp1Vl3peVOQfZk3UIqA==} + dependencies: + '@types/node': 18.15.9 + dev: true + /@types/chai-subset@1.3.3: resolution: {integrity: sha512-frBecisrNGz+F4T6bcc+NLeolfiojh5FxW2klu669+8BARtyQv2C/GkNW6FUodVe4BroGMP/wER/YDGc7rEllw==} dependencies: @@ -586,6 +609,18 @@ packages: - supports-color dev: true + /amqplib@0.10.3: + resolution: {integrity: sha512-UHmuSa7n8vVW/a5HGh2nFPqAEr8+cD4dEZ6u9GjP91nHfr1a54RyAKyra7Sb5NH7NBKOUlyQSMXIp0qAixKexw==} + engines: {node: '>=10'} + dependencies: + '@acuminous/bitsyntax': 0.1.2 + buffer-more-ints: 1.0.0 + readable-stream: 1.1.14 + url-parse: 1.5.10 + transitivePeerDependencies: + - supports-color + dev: false + /ansi-regex@5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} @@ -684,6 +719,10 @@ packages: fill-range: 7.0.1 dev: true + /buffer-more-ints@1.0.0: + resolution: {integrity: sha512-EMetuGFz5SLsT0QTnXzINh4Ksr+oo4i+UGTXEshiGCQWnsgSs7ZhJ8fzlwQ+OzEMs0MpDAMr1hxnblp5a4vcHg==} + dev: false + /buffer@5.7.1: resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} dependencies: @@ -807,7 +846,6 @@ packages: /core-util-is@1.0.3: resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} - dev: true /create-require@1.1.1: resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} @@ -844,7 +882,6 @@ packages: optional: true dependencies: ms: 2.1.2 - dev: true /decompress-response@6.0.0: resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} @@ -1179,7 +1216,6 @@ packages: /inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - dev: true /ini@1.3.8: resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} @@ -1238,6 +1274,10 @@ packages: engines: {node: '>=0.12.0'} dev: true + /isarray@0.0.1: + resolution: {integrity: sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==} + dev: false + /isarray@1.0.0: resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} dev: true @@ -1409,7 +1449,6 @@ packages: /ms@2.1.2: resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - dev: true /ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} @@ -1712,6 +1751,10 @@ packages: once: 1.4.0 dev: true + /querystringify@2.2.0: + resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} + dev: false + /queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} dev: true @@ -1730,6 +1773,15 @@ packages: resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} dev: true + /readable-stream@1.1.14: + resolution: {integrity: sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==} + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 0.0.1 + string_decoder: 0.10.31 + dev: false + /readable-stream@2.3.8: resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} dependencies: @@ -1762,6 +1814,10 @@ packages: resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} engines: {node: '>=0.10.0'} + /requires-port@1.0.0: + resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} + dev: false + /resolve@1.22.2: resolution: {integrity: sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==} hasBin: true @@ -1799,7 +1855,6 @@ packages: /safe-buffer@5.1.2: resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} - dev: true /safe-buffer@5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} @@ -1925,6 +1980,10 @@ packages: strip-ansi: 7.0.1 dev: true + /string_decoder@0.10.31: + resolution: {integrity: sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==} + dev: false + /string_decoder@1.1.1: resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} dependencies: @@ -2154,6 +2213,13 @@ packages: engines: {node: '>= 10.0.0'} dev: true + /url-parse@1.5.10: + resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} + dependencies: + querystringify: 2.2.0 + requires-port: 1.0.0 + dev: false + /util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} dev: true diff --git a/services/order/src/handlers/order/create.ts b/services/order/src/handlers/order/create.ts index 3d06d7af..d3af1ad1 100644 --- a/services/order/src/handlers/order/create.ts +++ b/services/order/src/handlers/order/create.ts @@ -9,7 +9,6 @@ export const CreateOrder = async ( { request }: Data, callback: (err: any, response: Order | null) => void ) => { - log.debug("request received at CreateOrder handler\n", request); try { const { basket_snapshot, delivery_id, payment_id, user } = request; diff --git a/services/order/src/handlers/order/delete.ts b/services/order/src/handlers/order/delete.ts index 1fa59615..ce9fb4d3 100644 --- a/services/order/src/handlers/order/delete.ts +++ b/services/order/src/handlers/order/delete.ts @@ -7,7 +7,6 @@ export const DeleteOrder = async ( { request }: Data, callback: (err: any, response: DeleteOrderResponse | null) => void ) => { - log.debug("request received at DeleteOrder handler\n", request); try { const { id } = request; const order = await prisma.order.delete({ diff --git a/services/order/src/handlers/order/get.ts b/services/order/src/handlers/order/get.ts index 5798e13b..69efed6b 100644 --- a/services/order/src/handlers/order/get.ts +++ b/services/order/src/handlers/order/get.ts @@ -8,7 +8,6 @@ export const GetOrder = async ( { request }: Data, callback: (err: any, response: Order | null) => void ) => { - log.debug("request received at GetOrder handler\n", request); try { const { id } = request; const order = await prisma.order.findUniqueOrThrow({ diff --git a/services/order/src/handlers/order/update.ts b/services/order/src/handlers/order/update.ts index dfb64c28..83ac05c2 100644 --- a/services/order/src/handlers/order/update.ts +++ b/services/order/src/handlers/order/update.ts @@ -8,7 +8,6 @@ export const UpdateOrder = async ( { request }: Data, callback: (err: any, response: Order | null) => void ) => { - log.debug("request received at UpdateOrder handler\n", request); try { const { delivery_id, payment_id, id, status } = request; diff --git a/services/order/src/lib/amqp.ts b/services/order/src/lib/amqp.ts new file mode 100644 index 00000000..36dfa515 --- /dev/null +++ b/services/order/src/lib/amqp.ts @@ -0,0 +1,33 @@ +import amqp from "amqplib"; +import { msg } from "@order/middleware/log"; +import { log } from "@order/lib/log"; + +const DEFAULT_QUEUE = "log"; + +async function connectQueue(queue = DEFAULT_QUEUE) { + try { + const connection = await amqp.connect("amqp://localhost:5672"); + const channel = await connection.createChannel(); + + await channel.assertQueue(queue); + return channel; + } catch (error) { + return error as Error; + } +} + +const toLog = (message: any) => { + const { request, path } = message; + return { event_message: path, metadata: { request } }; +}; + +export const publish = async (message: any, queue = DEFAULT_QUEUE) => { + const channel = await connectQueue(queue); + if (channel instanceof Error) + return console.log("Error to connect to queue: ", channel); + channel.sendToQueue(queue, Buffer.from(JSON.stringify(toLog(message)))); + log.debug( + msg("AMQP", `${queue} (queue)`, new Date(), new Date()), + JSON.stringify(message) + ); +}; diff --git a/services/order/src/lib/proxy.ts b/services/order/src/lib/proxy.ts new file mode 100644 index 00000000..becdaabb --- /dev/null +++ b/services/order/src/lib/proxy.ts @@ -0,0 +1,132 @@ +import { Server, status } from "@grpc/grpc-js"; + +const getType = (method: { + requestStream: boolean; + responseStream: boolean; +}) => { + if (method.requestStream === false && method.responseStream === false) { + return "unary"; + } + return "unknown"; +}; + + +const lookupServiceMetadata = (service: { [x: string]: any }) => { + const serviceKeys = Object.keys(service); + const intersectingMethods = serviceKeys.reduce((acc, k) => { + const method = service[k]; + if (!method) { + throw new Error(`cannot find method ${k} on service`); + } + const components = method.path.split("/"); + acc[k] = { + name: components[1], + method: components[2], + type: getType(method), + path: method.path, + responseType: method.responseType, + requestType: method.requestType, + }; + return acc; + }, {} as any); + + return (key: string) => intersectingMethods[key]; +}; + +export const handler = { + get( + target: { + [x: string]: any; + intercept: () => any; + addService: (arg0: any, arg1: {}) => any; + }, + propKey: string + ) { + if (propKey !== "addService") { + return target[propKey]; + } + return (service: any, implementation: { [x: string]: any }) => { + const newImplementation = {} as any; + const lookup = lookupServiceMetadata(service); + for (const k in implementation) { + const name = k; + const fn = implementation[k]; + newImplementation[name] = (call: any, callback: any) => { + const ctx = { + call, + name, + service: lookup(name), + status: { + code: status.UNKNOWN, + details: "", + }, + }; + const newCallback = (callback: (arg0: any) => void) => { + return (...args: any[]) => { + ctx.status = { + code: status.OK, + details: "", + }; + const err = args[0]; + if (err) { + ctx.status = { + code: status.UNKNOWN, + details: err, + }; + } + // @ts-ignore + callback(...args); + }; + }; + + const interceptors = target.intercept(); + const first = interceptors.next(); + if (!first.value) { + // if we don't have any interceptors + return new Promise((resolve) => { + return resolve(fn(call, newCallback(callback))); + }); + } + first.value(ctx, function next() { + return new Promise((resolve) => { + const i = interceptors.next(); + if (i.done) { + return resolve(fn(call, newCallback(callback))); + } + return resolve(i.value(ctx, next)); + }); + }); + }; + } + return target.addService(service, newImplementation); + }; + }, +}; + +export const createServerProxy = ( + server: Server +): Server & { + intercept: Generator; + interceptors: any[]; + use: (fn: any) => void; +} => { + // @ts-ignore + server.interceptors = []; + // @ts-ignore + server.use = (fn: any) => { + // @ts-ignore + server.interceptors.push(fn); + }; + // @ts-ignore + server.intercept = function* intercept() { + let i = 0; + // @ts-ignore + while (i < server.interceptors.length) { + // @ts-ignore + yield server.interceptors[i]; + i++; + } + }; + // @ts-ignore + return new Proxy(server, handler); +}; diff --git a/services/order/src/middleware/log.ts b/services/order/src/middleware/log.ts new file mode 100644 index 00000000..7a05f8ad --- /dev/null +++ b/services/order/src/middleware/log.ts @@ -0,0 +1,39 @@ +import { publish } from "@order/lib/amqp"; +import { utils } from "@order/lib/log"; +import { log } from "@order/lib/log"; + +type Context = { + call: { + request: Map; + }; + service: { + path: string; + }; +}; + +const parseContext = (ctx: Context) => { + const { + call: { request }, + service: { path }, + } = ctx; + return { request, path }; +}; + +export const msg = ( + type: "GRPC" | "AMQP", + path: string | undefined, + requestAt: Date, + responseAt: Date +) => + `${utils.magenta(requestAt.toISOString())} | ${utils.cyan(type)}${ + path ? ` | ${utils.yellow(path)}` : "" + } | ${utils.green(responseAt.getTime() - requestAt.getTime() + "ms")} |`; + +export const logGRPC = async (ctx: Context, next: () => Promise) => { + const requestAt = new Date(); + await next(); + const responseAt = new Date(); + const { request, path } = parseContext(ctx); + publish({ request, path }, "log"); + log.debug(msg("GRPC", path, requestAt, responseAt), JSON.stringify(request)); +}; diff --git a/services/order/src/server.ts b/services/order/src/server.ts index 7181463d..65de37ed 100644 --- a/services/order/src/server.ts +++ b/services/order/src/server.ts @@ -8,6 +8,8 @@ import { log, utils } from "@order/lib/log"; import { options } from "@order/resources/protoloader-options"; import { serverInsecure } from "@order/resources/grpc-credentials"; import { addReflection } from "@order/lib/reflection"; +import { createServerProxy } from "@order/lib/proxy"; +import { logGRPC } from "@order/middleware/log"; import orderHandlers from "@order/handlers/order"; const PORT = process.env.PORT || 50007; @@ -22,8 +24,11 @@ const packageDefinition = loadSync(PROTO_PATH, options); const grpc = loadPackageDefinition(packageDefinition) as any; const { service } = grpc.com.goodfood.order.OrderService; -const server = new Server(); +// const server = new Server(); + +const server = createServerProxy(new Server()); server.addService(service, orderHandlers); +server.use(logGRPC); server.bindAsync(ADDRESS, serverInsecure, () => { server.start(); From 868198c281f56ad9f6d26a1f3b549a621e665fe1 Mon Sep 17 00:00:00 2001 From: Florian LEROUX <10078837+floriaaan@users.noreply.github.com> Date: Wed, 10 May 2023 14:20:52 +0200 Subject: [PATCH 099/883] fix(gorm): typo in struct Log --- services/log/main.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/log/main.go b/services/log/main.go index 1ac1c8de..947e824a 100644 --- a/services/log/main.go +++ b/services/log/main.go @@ -27,7 +27,7 @@ import ( type Log struct { ID uint `gorm:"primarykey" json:"id"` EventMessage string `gorm:"not null" json:"event_message"` - Metadata []uint8 `gorm:"type:jsonb, default:'{}'" json:"metadata"` + Metadata []uint8 `gorm:"type:jsonb" default:"{}" json:"metadata"` Timestamp time.Time `gorm:"default:current_timestamp" json:"timestamp"` } From ac5c50ade113c423f6a70dfba49d2865e32519f2 Mon Sep 17 00:00:00 2001 From: Florian LEROUX <10078837+floriaaan@users.noreply.github.com> Date: Wed, 10 May 2023 14:47:11 +0200 Subject: [PATCH 100/883] fix(amqp): add publish to log queue --- .gitignore | 7 +++++-- services/order/src/lib/amqp.ts | 5 ++--- services/order/src/middleware/log.ts | 8 +++++--- 3 files changed, 12 insertions(+), 8 deletions(-) diff --git a/.gitignore b/.gitignore index eb399c48..d67020c0 100644 --- a/.gitignore +++ b/.gitignore @@ -62,7 +62,10 @@ terraform.rc /**/.env -# Ignore Visual Studio temporary files +# reporting service /services/reporting/**/bin /services/reporting/**/obj -/services/reporting/**/.vs \ No newline at end of file +/services/reporting/**/.vs + +# log service +/services/log/goodfood-log \ No newline at end of file diff --git a/services/order/src/lib/amqp.ts b/services/order/src/lib/amqp.ts index 36dfa515..c9c1e2a5 100644 --- a/services/order/src/lib/amqp.ts +++ b/services/order/src/lib/amqp.ts @@ -6,10 +6,9 @@ const DEFAULT_QUEUE = "log"; async function connectQueue(queue = DEFAULT_QUEUE) { try { - const connection = await amqp.connect("amqp://localhost:5672"); + const connection = await amqp.connect(process.env.AMQP_URL || ""); const channel = await connection.createChannel(); - - await channel.assertQueue(queue); + await channel.assertExchange(queue, "fanout", { durable: true }); return channel; } catch (error) { return error as Error; diff --git a/services/order/src/middleware/log.ts b/services/order/src/middleware/log.ts index 7a05f8ad..a28c2542 100644 --- a/services/order/src/middleware/log.ts +++ b/services/order/src/middleware/log.ts @@ -25,9 +25,11 @@ export const msg = ( requestAt: Date, responseAt: Date ) => - `${utils.magenta(requestAt.toISOString())} | ${utils.cyan(type)}${ - path ? ` | ${utils.yellow(path)}` : "" - } | ${utils.green(responseAt.getTime() - requestAt.getTime() + "ms")} |`; + `${utils.magenta(requestAt.toISOString())} | ${utils[ + type === "GRPC" ? "cyan" : "red" + ](type)}${path ? ` | ${utils.yellow(path)}` : ""} | ${utils.green( + responseAt.getTime() - requestAt.getTime() + "ms" + )} |`; export const logGRPC = async (ctx: Context, next: () => Promise) => { const requestAt = new Date(); From 537d54ce9a1f398acb932e85a6a7f65bc0224720 Mon Sep 17 00:00:00 2001 From: Florian LEROUX <10078837+floriaaan@users.noreply.github.com> Date: Wed, 10 May 2023 15:02:41 +0200 Subject: [PATCH 101/883] feat(methods): add methods to proto, handlers, reflection --- services/order/reflection_descriptor.bin | Bin 1380 -> 2262 bytes .../order/src/handlers/order/get-delivery.ts | 25 ++++++++++++++++ .../order/src/handlers/order/get-payment.ts | 22 ++++++++++++++ .../order/src/handlers/order/get-status.ts | 26 ++++++++++++++++ services/order/src/handlers/order/get-user.ts | 26 ++++++++++++++++ services/order/src/handlers/order/index.ts | 18 ++++++++--- services/order/src/types/order.d.ts | 24 +++++++++++++++ services/proto/order.proto | 28 ++++++++++++++++++ 8 files changed, 165 insertions(+), 4 deletions(-) create mode 100644 services/order/src/handlers/order/get-delivery.ts create mode 100644 services/order/src/handlers/order/get-payment.ts create mode 100644 services/order/src/handlers/order/get-status.ts create mode 100644 services/order/src/handlers/order/get-user.ts diff --git a/services/order/reflection_descriptor.bin b/services/order/reflection_descriptor.bin index 1814264c3d1cd940648b8245fe7998362324f81a..4ba1fbf44ae156a30482f4627ac96dd4b054e7ba 100644 GIT binary patch delta 661 zcmaFDbxn|&>$2cPW<@zEne_bp^qf@vf};GA{G`$}{o<0M(&Q37Fn^*-XGAm?n^R(O zc4~=`7#AB*GBYn-f>D7{gEI)q6Efgp$tupzlVAdhavO>3K}>|005nlA7;K^kLl9V5 z2P2~sI~QyG#$yJI0vcRm?x`jIMJcI8#ZHx>#gp@xrF49_#8CuOi-J;%3-a@dQ-ut< z*z&=OflgosS|&Mp1Ea{~`7Eq*K~M=LZ7xZeZl_9@)SS$+)S}AC1;ibKAW1`lZF2yN G2qOT-oZ6)T delta 72 zcmV-O0Js0v5#$O33gHTo10j(@i5VOU20~$TYh`p25()%rb8l`K0U!Y=2~q^JBLOf0 ev%~}b0RrX%lf(sG22u(OLvm%49|#_k=?CrPw-p`$ diff --git a/services/order/src/handlers/order/get-delivery.ts b/services/order/src/handlers/order/get-delivery.ts new file mode 100644 index 00000000..4c9eb232 --- /dev/null +++ b/services/order/src/handlers/order/get-delivery.ts @@ -0,0 +1,25 @@ +import { prisma } from "@order/lib/prisma"; +import { log } from "@order/lib/log"; +import { + GetOrderByDeliveryRequest, + Order, +} from "@order/types/order"; +import { Data } from "@order/types"; +import { toGrpc } from "@order/lib/transformer"; + +export const GetOrderByDelivery = async ( + { request }: Data, + callback: (err: any, response: Order | null) => void +) => { + try { + const { id } = request; + const order = await prisma.order.findFirstOrThrow({ + where: { delivery_id: id }, + include: { basket_snapshot: true, user: true }, + }); + callback(null, toGrpc(order)); + } catch (error) { + log.error(error); + callback(error, null); + } +}; diff --git a/services/order/src/handlers/order/get-payment.ts b/services/order/src/handlers/order/get-payment.ts new file mode 100644 index 00000000..5f221003 --- /dev/null +++ b/services/order/src/handlers/order/get-payment.ts @@ -0,0 +1,22 @@ +import { prisma } from "@order/lib/prisma"; +import { log } from "@order/lib/log"; +import { GetOrderByPaymentRequest, Order } from "@order/types/order"; +import { Data } from "@order/types"; +import { toGrpc } from "@order/lib/transformer"; + +export const GetOrderByPayment = async ( + { request }: Data, + callback: (err: any, response: Order | null) => void +) => { + try { + const { id } = request; + const order = await prisma.order.findFirstOrThrow({ + where: { payment_id: id }, + include: { basket_snapshot: true, user: true }, + }); + callback(null, toGrpc(order)); + } catch (error) { + log.error(error); + callback(error, null); + } +}; diff --git a/services/order/src/handlers/order/get-status.ts b/services/order/src/handlers/order/get-status.ts new file mode 100644 index 00000000..1c23ea88 --- /dev/null +++ b/services/order/src/handlers/order/get-status.ts @@ -0,0 +1,26 @@ +import { prisma } from "@order/lib/prisma"; +import { log } from "@order/lib/log"; +import { + ExtendedOrder, + GetOrdersByStatusRequest, + GetOrdersByStatusResponse, +} from "@order/types/order"; +import { Data } from "@order/types"; +import { toGrpc } from "@order/lib/transformer"; + +export const GetOrdersByStatus = async ( + { request }: Data, + callback: (err: any, response: GetOrdersByStatusResponse | null) => void +) => { + try { + const { status } = request; + const orders = (await prisma.order.findMany({ + where: { status }, + include: { basket_snapshot: true, user: true }, + })) as ExtendedOrder[]; + callback(null, { orders: orders.map(toGrpc) as ExtendedOrder[] }); + } catch (error) { + log.error(error); + callback(error, null); + } +}; diff --git a/services/order/src/handlers/order/get-user.ts b/services/order/src/handlers/order/get-user.ts new file mode 100644 index 00000000..37350b08 --- /dev/null +++ b/services/order/src/handlers/order/get-user.ts @@ -0,0 +1,26 @@ +import { prisma } from "@order/lib/prisma"; +import { log } from "@order/lib/log"; +import { + ExtendedOrder, + GetOrdersByUserRequest, + GetOrdersByUserResponse, +} from "@order/types/order"; +import { Data } from "@order/types"; +import { toGrpc } from "@order/lib/transformer"; + +export const GetOrdersByUser = async ( + { request }: Data, + callback: (err: any, response: GetOrdersByUserResponse | null) => void +) => { + try { + const { id } = request; + const orders = (await prisma.order.findMany({ + where: { user_id: id }, + include: { basket_snapshot: true, user: true }, + })) as ExtendedOrder[]; + callback(null, { orders: orders.map(toGrpc) as ExtendedOrder[] }); + } catch (error) { + log.error(error); + callback(error, null); + } +}; diff --git a/services/order/src/handlers/order/index.ts b/services/order/src/handlers/order/index.ts index b0757cd5..48ed7249 100644 --- a/services/order/src/handlers/order/index.ts +++ b/services/order/src/handlers/order/index.ts @@ -1,15 +1,25 @@ import { UntypedServiceImplementation } from "@grpc/grpc-js"; -import { CreateOrder } from "./create"; -import { GetOrder } from "./get"; -import { UpdateOrder } from "./update"; -import { DeleteOrder } from "./delete"; +import { CreateOrder } from "@order/handlers/order/create"; +import { GetOrder } from "@order/handlers/order/get"; +import { UpdateOrder } from "@order/handlers/order/update"; +import { DeleteOrder } from "@order/handlers/order/delete"; + +import { GetOrdersByUser } from "@order/handlers/order/get-user"; +import { GetOrderByDelivery } from "@order/handlers/order/get-delivery"; +import { GetOrderByPayment } from "@order/handlers/order/get-payment"; +import { GetOrdersByStatus } from "@order/handlers/order/get-status"; const orderHandlers: UntypedServiceImplementation = { CreateOrder, GetOrder, UpdateOrder, DeleteOrder, + + GetOrdersByUser, + GetOrderByDelivery, + GetOrderByPayment, + GetOrdersByStatus, }; export default orderHandlers; diff --git a/services/order/src/types/order.d.ts b/services/order/src/types/order.d.ts index e8e8d577..6cce9b47 100644 --- a/services/order/src/types/order.d.ts +++ b/services/order/src/types/order.d.ts @@ -26,6 +26,30 @@ export type GetOrderRequest = { id: string; }; +export type GetOrdersByUserRequest = { + id: string; +}; + +export type GetOrdersByUserResponse = { + orders: ExtendedOrder[]; +}; + +export type GetOrderByDeliveryRequest = { + id: string; +}; + +export type GetOrderByPaymentRequest = { + id: string; +}; + +export type GetOrdersByStatusRequest = { + status: Status; +}; + +export type GetOrdersByStatusResponse = { + orders: ExtendedOrder[]; +}; + export type CreateOrderRequest = { payment_id: string; delivery_id: string; diff --git a/services/proto/order.proto b/services/proto/order.proto index b6b4ac36..346f1b20 100644 --- a/services/proto/order.proto +++ b/services/proto/order.proto @@ -41,6 +41,10 @@ message Order { service OrderService { rpc GetOrder(GetOrderRequest) returns (Order) {} + rpc GetOrdersByUser(GetOrdersByUserRequest) returns (GetOrdersByUserResponse) {} + rpc GetOrderByDelivery(GetOrderByDeliveryRequest) returns (Order) {} + rpc GetOrderByPayment(GetOrderByPaymentRequest) returns (Order) {} + rpc GetOrdersByStatus(GetOrdersByStatusRequest) returns (GetOrdersByStatusResponse) {} rpc CreateOrder(CreateOrderRequest) returns (Order) {} rpc UpdateOrder(UpdateOrderRequest) returns (Order) {} rpc DeleteOrder(DeleteOrderRequest) returns (DeleteOrderResponse) {} @@ -50,6 +54,30 @@ message GetOrderRequest { string id = 1; } +message GetOrdersByUserRequest { + string id = 1; +} + +message GetOrdersByUserResponse { + repeated Order orders = 1; +} + +message GetOrderByDeliveryRequest { + string id = 1; +} + +message GetOrderByPaymentRequest { + string id = 1; +} + +message GetOrdersByStatusRequest { + Status status = 1; +} + +message GetOrdersByStatusResponse { + repeated Order orders = 1; +} + message CreateOrderRequest { string payment_id = 1; string delivery_id = 2; From 2ab865467242bf778a6c29f23a138a4a46024261 Mon Sep 17 00:00:00 2001 From: Florian LEROUX <10078837+floriaaan@users.noreply.github.com> Date: Wed, 10 May 2023 15:04:09 +0200 Subject: [PATCH 102/883] doc: add methods to readme --- services/order/README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/services/order/README.md b/services/order/README.md index 5da48544..f1ef491f 100644 --- a/services/order/README.md +++ b/services/order/README.md @@ -15,6 +15,10 @@ The service provides the following gRPC methods: - `GetOrder`: Retrieves an order by its ID. +- `GetOrdersByUser`: Retrieves a list of orders for a given user. +- `GetOrderByDelivery`: Retrieves an order by its delivery ID. +- `GetOrderByPayment`: Retrieves an order by its payment ID. +- `GetOrdersByStatus`: Retrieves a list of orders by status. - `CreateOrder`: Creates a new order. - `UpdateOrder`: Updates an existing order. - `DeleteOrder`: Deletes an order by its ID. From b636c10d15a54138325e15d8b42b9de3e6453638 Mon Sep 17 00:00:00 2001 From: Florian LEROUX <10078837+floriaaan@users.noreply.github.com> Date: Wed, 10 May 2023 15:59:32 +0200 Subject: [PATCH 103/883] git(ignore): remove root lockfile and add ignore files --- .gitignore | 12 +- pnpm-lock.yaml | 794 ------------------------------------------------- 2 files changed, 11 insertions(+), 795 deletions(-) delete mode 100644 pnpm-lock.yaml diff --git a/.gitignore b/.gitignore index 6c74319b..5977dc50 100644 --- a/.gitignore +++ b/.gitignore @@ -54,4 +54,14 @@ terraform.rc .ionide -/**/.DS_Store \ No newline at end of file +/**/.DS_Store + +/**/node_modules +/**/.env +!/**/.env.example + +/**/bin +/**/obj +/**/.vs + +/**/goodfood-log \ No newline at end of file diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml deleted file mode 100644 index cccf0383..00000000 --- a/pnpm-lock.yaml +++ /dev/null @@ -1,794 +0,0 @@ -lockfileVersion: '6.0' - -devDependencies: - vitest-mock-extended: - specifier: ^1.1.3 - version: 1.1.3(typescript@5.0.4)(vitest@0.30.0) - -packages: - - /@esbuild/android-arm64@0.17.16: - resolution: {integrity: sha512-QX48qmsEZW+gcHgTmAj+x21mwTz8MlYQBnzF6861cNdQGvj2jzzFjqH0EBabrIa/WVZ2CHolwMoqxVryqKt8+Q==} - engines: {node: '>=12'} - cpu: [arm64] - os: [android] - requiresBuild: true - dev: true - optional: true - - /@esbuild/android-arm@0.17.16: - resolution: {integrity: sha512-baLqRpLe4JnKrUXLJChoTN0iXZH7El/mu58GE3WIA6/H834k0XWvLRmGLG8y8arTRS9hJJibPnF0tiGhmWeZgw==} - engines: {node: '>=12'} - cpu: [arm] - os: [android] - requiresBuild: true - dev: true - optional: true - - /@esbuild/android-x64@0.17.16: - resolution: {integrity: sha512-G4wfHhrrz99XJgHnzFvB4UwwPxAWZaZBOFXh+JH1Duf1I4vIVfuYY9uVLpx4eiV2D/Jix8LJY+TAdZ3i40tDow==} - engines: {node: '>=12'} - cpu: [x64] - os: [android] - requiresBuild: true - dev: true - optional: true - - /@esbuild/darwin-arm64@0.17.16: - resolution: {integrity: sha512-/Ofw8UXZxuzTLsNFmz1+lmarQI6ztMZ9XktvXedTbt3SNWDn0+ODTwxExLYQ/Hod91EZB4vZPQJLoqLF0jvEzA==} - engines: {node: '>=12'} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /@esbuild/darwin-x64@0.17.16: - resolution: {integrity: sha512-SzBQtCV3Pdc9kyizh36Ol+dNVhkDyIrGb/JXZqFq8WL37LIyrXU0gUpADcNV311sCOhvY+f2ivMhb5Tuv8nMOQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /@esbuild/freebsd-arm64@0.17.16: - resolution: {integrity: sha512-ZqftdfS1UlLiH1DnS2u3It7l4Bc3AskKeu+paJSfk7RNOMrOxmeFDhLTMQqMxycP1C3oj8vgkAT6xfAuq7ZPRA==} - engines: {node: '>=12'} - cpu: [arm64] - os: [freebsd] - requiresBuild: true - dev: true - optional: true - - /@esbuild/freebsd-x64@0.17.16: - resolution: {integrity: sha512-rHV6zNWW1tjgsu0dKQTX9L0ByiJHHLvQKrWtnz8r0YYJI27FU3Xu48gpK2IBj1uCSYhJ+pEk6Y0Um7U3rIvV8g==} - engines: {node: '>=12'} - cpu: [x64] - os: [freebsd] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-arm64@0.17.16: - resolution: {integrity: sha512-8yoZhGkU6aHu38WpaM4HrRLTFc7/VVD9Q2SvPcmIQIipQt2I/GMTZNdEHXoypbbGao5kggLcxg0iBKjo0SQYKA==} - engines: {node: '>=12'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-arm@0.17.16: - resolution: {integrity: sha512-n4O8oVxbn7nl4+m+ISb0a68/lcJClIbaGAoXwqeubj/D1/oMMuaAXmJVfFlRjJLu/ZvHkxoiFJnmbfp4n8cdSw==} - engines: {node: '>=12'} - cpu: [arm] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-ia32@0.17.16: - resolution: {integrity: sha512-9ZBjlkdaVYxPNO8a7OmzDbOH9FMQ1a58j7Xb21UfRU29KcEEU3VTHk+Cvrft/BNv0gpWJMiiZ/f4w0TqSP0gLA==} - engines: {node: '>=12'} - cpu: [ia32] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-loong64@0.17.16: - resolution: {integrity: sha512-TIZTRojVBBzdgChY3UOG7BlPhqJz08AL7jdgeeu+kiObWMFzGnQD7BgBBkWRwOtKR1i2TNlO7YK6m4zxVjjPRQ==} - engines: {node: '>=12'} - cpu: [loong64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-mips64el@0.17.16: - resolution: {integrity: sha512-UPeRuFKCCJYpBbIdczKyHLAIU31GEm0dZl1eMrdYeXDH+SJZh/i+2cAmD3A1Wip9pIc5Sc6Kc5cFUrPXtR0XHA==} - engines: {node: '>=12'} - cpu: [mips64el] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-ppc64@0.17.16: - resolution: {integrity: sha512-io6yShgIEgVUhExJejJ21xvO5QtrbiSeI7vYUnr7l+v/O9t6IowyhdiYnyivX2X5ysOVHAuyHW+Wyi7DNhdw6Q==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-riscv64@0.17.16: - resolution: {integrity: sha512-WhlGeAHNbSdG/I2gqX2RK2gfgSNwyJuCiFHMc8s3GNEMMHUI109+VMBfhVqRb0ZGzEeRiibi8dItR3ws3Lk+cA==} - engines: {node: '>=12'} - cpu: [riscv64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-s390x@0.17.16: - resolution: {integrity: sha512-gHRReYsJtViir63bXKoFaQ4pgTyah4ruiMRQ6im9YZuv+gp3UFJkNTY4sFA73YDynmXZA6hi45en4BGhNOJUsw==} - engines: {node: '>=12'} - cpu: [s390x] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-x64@0.17.16: - resolution: {integrity: sha512-mfiiBkxEbUHvi+v0P+TS7UnA9TeGXR48aK4XHkTj0ZwOijxexgMF01UDFaBX7Q6CQsB0d+MFNv9IiXbIHTNd4g==} - engines: {node: '>=12'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/netbsd-x64@0.17.16: - resolution: {integrity: sha512-n8zK1YRDGLRZfVcswcDMDM0j2xKYLNXqei217a4GyBxHIuPMGrrVuJ+Ijfpr0Kufcm7C1k/qaIrGy6eG7wvgmA==} - engines: {node: '>=12'} - cpu: [x64] - os: [netbsd] - requiresBuild: true - dev: true - optional: true - - /@esbuild/openbsd-x64@0.17.16: - resolution: {integrity: sha512-lEEfkfsUbo0xC47eSTBqsItXDSzwzwhKUSsVaVjVji07t8+6KA5INp2rN890dHZeueXJAI8q0tEIfbwVRYf6Ew==} - engines: {node: '>=12'} - cpu: [x64] - os: [openbsd] - requiresBuild: true - dev: true - optional: true - - /@esbuild/sunos-x64@0.17.16: - resolution: {integrity: sha512-jlRjsuvG1fgGwnE8Afs7xYDnGz0dBgTNZfgCK6TlvPH3Z13/P5pi6I57vyLE8qZYLrGVtwcm9UbUx1/mZ8Ukag==} - engines: {node: '>=12'} - cpu: [x64] - os: [sunos] - requiresBuild: true - dev: true - optional: true - - /@esbuild/win32-arm64@0.17.16: - resolution: {integrity: sha512-TzoU2qwVe2boOHl/3KNBUv2PNUc38U0TNnzqOAcgPiD/EZxT2s736xfC2dYQbszAwo4MKzzwBV0iHjhfjxMimg==} - engines: {node: '>=12'} - cpu: [arm64] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /@esbuild/win32-ia32@0.17.16: - resolution: {integrity: sha512-B8b7W+oo2yb/3xmwk9Vc99hC9bNolvqjaTZYEfMQhzdpBsjTvZBlXQ/teUE55Ww6sg//wlcDjOaqldOKyigWdA==} - engines: {node: '>=12'} - cpu: [ia32] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /@esbuild/win32-x64@0.17.16: - resolution: {integrity: sha512-xJ7OH/nanouJO9pf03YsL9NAFQBHd8AqfrQd7Pf5laGyyTt/gToul6QYOA/i5i/q8y9iaM5DQFNTgpi995VkOg==} - engines: {node: '>=12'} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /@jridgewell/sourcemap-codec@1.4.15: - resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} - dev: true - - /@types/chai-subset@1.3.3: - resolution: {integrity: sha512-frBecisrNGz+F4T6bcc+NLeolfiojh5FxW2klu669+8BARtyQv2C/GkNW6FUodVe4BroGMP/wER/YDGc7rEllw==} - dependencies: - '@types/chai': 4.3.4 - dev: true - - /@types/chai@4.3.4: - resolution: {integrity: sha512-KnRanxnpfpjUTqTCXslZSEdLfXExwgNxYPdiO2WGUj8+HDjFi8R3k5RVKPeSCzLjCcshCAtVO2QBbVuAV4kTnw==} - dev: true - - /@types/node@18.15.11: - resolution: {integrity: sha512-E5Kwq2n4SbMzQOn6wnmBjuK9ouqlURrcZDVfbo9ftDDTFt3nk7ZKK4GMOzoYgnpQJKcxwQw+lGaBvvlMo0qN/Q==} - dev: true - - /@vitest/expect@0.30.0: - resolution: {integrity: sha512-b/jLWBqi6WQHfezWm8VjgXdIyfejAurtxqdyCdDqoToCim5W/nDxKjFAADitEHPz80oz+IP+c+wmkGKBucSpiw==} - dependencies: - '@vitest/spy': 0.30.0 - '@vitest/utils': 0.30.0 - chai: 4.3.7 - dev: true - - /@vitest/runner@0.30.0: - resolution: {integrity: sha512-Xh4xkdRcymdeRNrSwjhgarCTSgnQu2J59wsFI6i4UhKrL5whzo5+vWyq7iWK1ht3fppPeNAtvkbqUDf+OJSCbQ==} - dependencies: - '@vitest/utils': 0.30.0 - concordance: 5.0.4 - p-limit: 4.0.0 - pathe: 1.1.0 - dev: true - - /@vitest/snapshot@0.30.0: - resolution: {integrity: sha512-e4eSGCy36Bw3/Tkir9qYJDlFsUz3NALFPNJSxzlY8CFl901TV9iZdKgpqXpyG1sAhLO0tPHThBAMHRi8hRA8cg==} - dependencies: - magic-string: 0.30.0 - pathe: 1.1.0 - pretty-format: 27.5.1 - dev: true - - /@vitest/spy@0.30.0: - resolution: {integrity: sha512-olTWyG5gVWdfhCrdgxWQb2K3JYtj1/ZwInFFOb4GZ2HFI91PUWHWHhLRPORxwRwVvoXD1MS1162vPJZuHlKJkg==} - dependencies: - tinyspy: 2.1.0 - dev: true - - /@vitest/utils@0.30.0: - resolution: {integrity: sha512-qFZgoOKQ+rJV9xG4BBxgOSilnLQ2gkfG4I+z1wBuuQ3AD33zQrnB88kMFfzsot1E1AbF3dNK1e4CU7q3ojahRA==} - dependencies: - concordance: 5.0.4 - loupe: 2.3.6 - pretty-format: 27.5.1 - dev: true - - /acorn-walk@8.2.0: - resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} - engines: {node: '>=0.4.0'} - dev: true - - /acorn@8.8.2: - resolution: {integrity: sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==} - engines: {node: '>=0.4.0'} - hasBin: true - dev: true - - /ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} - dev: true - - /ansi-styles@5.2.0: - resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} - engines: {node: '>=10'} - dev: true - - /assertion-error@1.1.0: - resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} - dev: true - - /blueimp-md5@2.19.0: - resolution: {integrity: sha512-DRQrD6gJyy8FbiE4s+bDoXS9hiW3Vbx5uCdwvcCf3zLHL+Iv7LtGHLpr+GZV8rHG8tK766FGYBwRbu8pELTt+w==} - dev: true - - /cac@6.7.14: - resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} - engines: {node: '>=8'} - dev: true - - /chai@4.3.7: - resolution: {integrity: sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==} - engines: {node: '>=4'} - dependencies: - assertion-error: 1.1.0 - check-error: 1.0.2 - deep-eql: 4.1.3 - get-func-name: 2.0.0 - loupe: 2.3.6 - pathval: 1.1.1 - type-detect: 4.0.8 - dev: true - - /check-error@1.0.2: - resolution: {integrity: sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==} - dev: true - - /concordance@5.0.4: - resolution: {integrity: sha512-OAcsnTEYu1ARJqWVGwf4zh4JDfHZEaSNlNccFmt8YjB2l/n19/PF2viLINHc57vO4FKIAFl2FWASIGZZWZ2Kxw==} - engines: {node: '>=10.18.0 <11 || >=12.14.0 <13 || >=14'} - dependencies: - date-time: 3.1.0 - esutils: 2.0.3 - fast-diff: 1.2.0 - js-string-escape: 1.0.1 - lodash: 4.17.21 - md5-hex: 3.0.1 - semver: 7.3.8 - well-known-symbols: 2.0.0 - dev: true - - /date-time@3.1.0: - resolution: {integrity: sha512-uqCUKXE5q1PNBXjPqvwhwJf9SwMoAHBgWJ6DcrnS5o+W2JOiIILl0JEdVD8SGujrNS02GGxgwAg2PN2zONgtjg==} - engines: {node: '>=6'} - dependencies: - time-zone: 1.0.0 - dev: true - - /debug@4.3.4: - resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - dependencies: - ms: 2.1.2 - dev: true - - /deep-eql@4.1.3: - resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==} - engines: {node: '>=6'} - dependencies: - type-detect: 4.0.8 - dev: true - - /esbuild@0.17.16: - resolution: {integrity: sha512-aeSuUKr9aFVY9Dc8ETVELGgkj4urg5isYx8pLf4wlGgB0vTFjxJQdHnNH6Shmx4vYYrOTLCHtRI5i1XZ9l2Zcg==} - engines: {node: '>=12'} - hasBin: true - requiresBuild: true - optionalDependencies: - '@esbuild/android-arm': 0.17.16 - '@esbuild/android-arm64': 0.17.16 - '@esbuild/android-x64': 0.17.16 - '@esbuild/darwin-arm64': 0.17.16 - '@esbuild/darwin-x64': 0.17.16 - '@esbuild/freebsd-arm64': 0.17.16 - '@esbuild/freebsd-x64': 0.17.16 - '@esbuild/linux-arm': 0.17.16 - '@esbuild/linux-arm64': 0.17.16 - '@esbuild/linux-ia32': 0.17.16 - '@esbuild/linux-loong64': 0.17.16 - '@esbuild/linux-mips64el': 0.17.16 - '@esbuild/linux-ppc64': 0.17.16 - '@esbuild/linux-riscv64': 0.17.16 - '@esbuild/linux-s390x': 0.17.16 - '@esbuild/linux-x64': 0.17.16 - '@esbuild/netbsd-x64': 0.17.16 - '@esbuild/openbsd-x64': 0.17.16 - '@esbuild/sunos-x64': 0.17.16 - '@esbuild/win32-arm64': 0.17.16 - '@esbuild/win32-ia32': 0.17.16 - '@esbuild/win32-x64': 0.17.16 - dev: true - - /esutils@2.0.3: - resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} - engines: {node: '>=0.10.0'} - dev: true - - /fast-diff@1.2.0: - resolution: {integrity: sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==} - dev: true - - /fsevents@2.3.2: - resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /function-bind@1.1.1: - resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} - dev: true - - /get-func-name@2.0.0: - resolution: {integrity: sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==} - dev: true - - /has@1.0.3: - resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} - engines: {node: '>= 0.4.0'} - dependencies: - function-bind: 1.1.1 - dev: true - - /is-core-module@2.11.0: - resolution: {integrity: sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==} - dependencies: - has: 1.0.3 - dev: true - - /js-string-escape@1.0.1: - resolution: {integrity: sha512-Smw4xcfIQ5LVjAOuJCvN/zIodzA/BBSsluuoSykP+lUvScIi4U6RJLfwHet5cxFnCswUjISV8oAXaqaJDY3chg==} - engines: {node: '>= 0.8'} - dev: true - - /jsonc-parser@3.2.0: - resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} - dev: true - - /local-pkg@0.4.3: - resolution: {integrity: sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==} - engines: {node: '>=14'} - dev: true - - /lodash@4.17.21: - resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} - dev: true - - /loupe@2.3.6: - resolution: {integrity: sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==} - dependencies: - get-func-name: 2.0.0 - dev: true - - /lru-cache@6.0.0: - resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} - engines: {node: '>=10'} - dependencies: - yallist: 4.0.0 - dev: true - - /magic-string@0.30.0: - resolution: {integrity: sha512-LA+31JYDJLs82r2ScLrlz1GjSgu66ZV518eyWT+S8VhyQn/JL0u9MeBOvQMGYiPk1DBiSN9DDMOcXvigJZaViQ==} - engines: {node: '>=12'} - dependencies: - '@jridgewell/sourcemap-codec': 1.4.15 - dev: true - - /md5-hex@3.0.1: - resolution: {integrity: sha512-BUiRtTtV39LIJwinWBjqVsU9xhdnz7/i889V859IBFpuqGAj6LuOvHv5XLbgZ2R7ptJoJaEcxkv88/h25T7Ciw==} - engines: {node: '>=8'} - dependencies: - blueimp-md5: 2.19.0 - dev: true - - /mlly@1.2.0: - resolution: {integrity: sha512-+c7A3CV0KGdKcylsI6khWyts/CYrGTrRVo4R/I7u/cUsy0Conxa6LUhiEzVKIw14lc2L5aiO4+SeVe4TeGRKww==} - dependencies: - acorn: 8.8.2 - pathe: 1.1.0 - pkg-types: 1.0.2 - ufo: 1.1.1 - dev: true - - /ms@2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - dev: true - - /nanoid@3.3.6: - resolution: {integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true - dev: true - - /p-limit@4.0.0: - resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dependencies: - yocto-queue: 1.0.0 - dev: true - - /path-parse@1.0.7: - resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} - dev: true - - /pathe@1.1.0: - resolution: {integrity: sha512-ODbEPR0KKHqECXW1GoxdDb+AZvULmXjVPy4rt+pGo2+TnjJTIPJQSVS6N63n8T2Ip+syHhbn52OewKicV0373w==} - dev: true - - /pathval@1.1.1: - resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} - dev: true - - /picocolors@1.0.0: - resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} - dev: true - - /pkg-types@1.0.2: - resolution: {integrity: sha512-hM58GKXOcj8WTqUXnsQyJYXdeAPbythQgEF3nTcEo+nkD49chjQ9IKm/QJy9xf6JakXptz86h7ecP2024rrLaQ==} - dependencies: - jsonc-parser: 3.2.0 - mlly: 1.2.0 - pathe: 1.1.0 - dev: true - - /postcss@8.4.21: - resolution: {integrity: sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==} - engines: {node: ^10 || ^12 || >=14} - dependencies: - nanoid: 3.3.6 - picocolors: 1.0.0 - source-map-js: 1.0.2 - dev: true - - /pretty-format@27.5.1: - resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - dependencies: - ansi-regex: 5.0.1 - ansi-styles: 5.2.0 - react-is: 17.0.2 - dev: true - - /react-is@17.0.2: - resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} - dev: true - - /resolve@1.22.2: - resolution: {integrity: sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==} - hasBin: true - dependencies: - is-core-module: 2.11.0 - path-parse: 1.0.7 - supports-preserve-symlinks-flag: 1.0.0 - dev: true - - /rollup@3.20.2: - resolution: {integrity: sha512-3zwkBQl7Ai7MFYQE0y1MeQ15+9jsi7XxfrqwTb/9EK8D9C9+//EBR4M+CuA1KODRaNbFez/lWxA5vhEGZp4MUg==} - engines: {node: '>=14.18.0', npm: '>=8.0.0'} - hasBin: true - optionalDependencies: - fsevents: 2.3.2 - dev: true - - /semver@7.3.8: - resolution: {integrity: sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==} - engines: {node: '>=10'} - hasBin: true - dependencies: - lru-cache: 6.0.0 - dev: true - - /siginfo@2.0.0: - resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} - dev: true - - /source-map-js@1.0.2: - resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} - engines: {node: '>=0.10.0'} - dev: true - - /source-map@0.6.1: - resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} - engines: {node: '>=0.10.0'} - dev: true - - /stackback@0.0.2: - resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} - dev: true - - /std-env@3.3.2: - resolution: {integrity: sha512-uUZI65yrV2Qva5gqE0+A7uVAvO40iPo6jGhs7s8keRfHCmtg+uB2X6EiLGCI9IgL1J17xGhvoOqSz79lzICPTA==} - dev: true - - /strip-literal@1.0.1: - resolution: {integrity: sha512-QZTsipNpa2Ppr6v1AmJHESqJ3Uz247MUS0OjrnnZjFAvEoWqxuyFuXn2xLgMtRnijJShAa1HL0gtJyUs7u7n3Q==} - dependencies: - acorn: 8.8.2 - dev: true - - /supports-preserve-symlinks-flag@1.0.0: - resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} - engines: {node: '>= 0.4'} - dev: true - - /time-zone@1.0.0: - resolution: {integrity: sha512-TIsDdtKo6+XrPtiTm1ssmMngN1sAhyKnTO2kunQWqNPWIVvCm15Wmw4SWInwTVgJ5u/Tr04+8Ei9TNcw4x4ONA==} - engines: {node: '>=4'} - dev: true - - /tinybench@2.4.0: - resolution: {integrity: sha512-iyziEiyFxX4kyxSp+MtY1oCH/lvjH3PxFN8PGCDeqcZWAJ/i+9y+nL85w99PxVzrIvew/GSkSbDYtiGVa85Afg==} - dev: true - - /tinypool@0.4.0: - resolution: {integrity: sha512-2ksntHOKf893wSAH4z/+JbPpi92esw8Gn9N2deXX+B0EO92hexAVI9GIZZPx7P5aYo5KULfeOSt3kMOmSOy6uA==} - engines: {node: '>=14.0.0'} - dev: true - - /tinyspy@2.1.0: - resolution: {integrity: sha512-7eORpyqImoOvkQJCSkL0d0mB4NHHIFAy4b1u8PHdDa7SjGS2njzl6/lyGoZLm+eyYEtlUmFGE0rFj66SWxZgQQ==} - engines: {node: '>=14.0.0'} - dev: true - - /ts-essentials@9.3.1(typescript@5.0.4): - resolution: {integrity: sha512-9CChSvQMyVRo29Vb1A2jbs+LKo3d/bAf+ndSaX0T8cEiy/HChVaRN/HY5DqUryZ8hZ6uol9bEgCnGmnDbwBR9Q==} - peerDependencies: - typescript: '>=4.1.0' - dependencies: - typescript: 5.0.4 - dev: true - - /type-detect@4.0.8: - resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} - engines: {node: '>=4'} - dev: true - - /typescript@5.0.4: - resolution: {integrity: sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==} - engines: {node: '>=12.20'} - hasBin: true - dev: true - - /ufo@1.1.1: - resolution: {integrity: sha512-MvlCc4GHrmZdAllBc0iUDowff36Q9Ndw/UzqmEKyrfSzokTd9ZCy1i+IIk5hrYKkjoYVQyNbrw7/F8XJ2rEwTg==} - dev: true - - /vite-node@0.30.0(@types/node@18.15.11): - resolution: {integrity: sha512-23X5Ggylx0kU/bMf8MCcEEl55d/gsTtU81mMZjm7Z0FSpgKZexUqmX3mJtgglP9SySQQs9ydYg/GEahi/cKHaA==} - engines: {node: '>=v14.18.0'} - hasBin: true - dependencies: - cac: 6.7.14 - debug: 4.3.4 - mlly: 1.2.0 - pathe: 1.1.0 - picocolors: 1.0.0 - vite: 4.2.1(@types/node@18.15.11) - transitivePeerDependencies: - - '@types/node' - - less - - sass - - stylus - - sugarss - - supports-color - - terser - dev: true - - /vite@4.2.1(@types/node@18.15.11): - resolution: {integrity: sha512-7MKhqdy0ISo4wnvwtqZkjke6XN4taqQ2TBaTccLIpOKv7Vp2h4Y+NpmWCnGDeSvvn45KxvWgGyb0MkHvY1vgbg==} - engines: {node: ^14.18.0 || >=16.0.0} - hasBin: true - peerDependencies: - '@types/node': '>= 14' - less: '*' - sass: '*' - stylus: '*' - sugarss: '*' - terser: ^5.4.0 - peerDependenciesMeta: - '@types/node': - optional: true - less: - optional: true - sass: - optional: true - stylus: - optional: true - sugarss: - optional: true - terser: - optional: true - dependencies: - '@types/node': 18.15.11 - esbuild: 0.17.16 - postcss: 8.4.21 - resolve: 1.22.2 - rollup: 3.20.2 - optionalDependencies: - fsevents: 2.3.2 - dev: true - - /vitest-mock-extended@1.1.3(typescript@5.0.4)(vitest@0.30.0): - resolution: {integrity: sha512-MiaKYZbTg+fjozKnCpoTTva0BnlSNYyk4jiPuM2xVhg4aou112QIrALdH3/ZKK6qfXWh0A17gFIjWJjylOlXxg==} - peerDependencies: - typescript: 3.x || 4.x || 5.x - vitest: '>=0.29.2' - dependencies: - ts-essentials: 9.3.1(typescript@5.0.4) - typescript: 5.0.4 - vitest: 0.30.0 - dev: true - - /vitest@0.30.0: - resolution: {integrity: sha512-2WW4WeTHtrLFeoiuotWvEW6khozx1NvMGYoGsNz2btdddEbqvEdPJIouIdoiC5i61Rl1ctZvm9cn2R9TcPQlzw==} - engines: {node: '>=v14.18.0'} - hasBin: true - peerDependencies: - '@edge-runtime/vm': '*' - '@vitest/browser': '*' - '@vitest/ui': '*' - happy-dom: '*' - jsdom: '*' - playwright: '*' - safaridriver: '*' - webdriverio: '*' - peerDependenciesMeta: - '@edge-runtime/vm': - optional: true - '@vitest/browser': - optional: true - '@vitest/ui': - optional: true - happy-dom: - optional: true - jsdom: - optional: true - playwright: - optional: true - safaridriver: - optional: true - webdriverio: - optional: true - dependencies: - '@types/chai': 4.3.4 - '@types/chai-subset': 1.3.3 - '@types/node': 18.15.11 - '@vitest/expect': 0.30.0 - '@vitest/runner': 0.30.0 - '@vitest/snapshot': 0.30.0 - '@vitest/spy': 0.30.0 - '@vitest/utils': 0.30.0 - acorn: 8.8.2 - acorn-walk: 8.2.0 - cac: 6.7.14 - chai: 4.3.7 - concordance: 5.0.4 - debug: 4.3.4 - local-pkg: 0.4.3 - magic-string: 0.30.0 - pathe: 1.1.0 - picocolors: 1.0.0 - source-map: 0.6.1 - std-env: 3.3.2 - strip-literal: 1.0.1 - tinybench: 2.4.0 - tinypool: 0.4.0 - vite: 4.2.1(@types/node@18.15.11) - vite-node: 0.30.0(@types/node@18.15.11) - why-is-node-running: 2.2.2 - transitivePeerDependencies: - - less - - sass - - stylus - - sugarss - - supports-color - - terser - dev: true - - /well-known-symbols@2.0.0: - resolution: {integrity: sha512-ZMjC3ho+KXo0BfJb7JgtQ5IBuvnShdlACNkKkdsqBmYw3bPAaJfPeYUo6tLUaT5tG/Gkh7xkpBhKRQ9e7pyg9Q==} - engines: {node: '>=6'} - 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 - - /yallist@4.0.0: - resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} - dev: true - - /yocto-queue@1.0.0: - resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} - engines: {node: '>=12.20'} - dev: true From d7f445ac3dd71e854089b60491eff4d747f23c8f Mon Sep 17 00:00:00 2001 From: Florian LEROUX <10078837+floriaaan@users.noreply.github.com> Date: Mon, 27 Mar 2023 11:42:00 +0200 Subject: [PATCH 104/883] feat: init delivery microservice (typescript, prisma, grpc) * add prisma (schema, singleton, seed) * add grpc implementation * add logger * add file structure with proper tsconfig * readme file model --- services/delivery/.env.example | 2 + services/delivery/.gitignore | 5 + services/delivery/.nvmrc | 1 + services/delivery/README.md | 68 +++ services/delivery/package.json | 25 + services/delivery/pnpm-lock.yaml | 427 ++++++++++++++++++ services/delivery/prisma/schema.prisma | 36 ++ services/delivery/prisma/seed.ts | 64 +++ services/delivery/src/handlers/.gitinclude | 0 services/delivery/src/lib/log.ts | 74 +++ services/delivery/src/lib/prisma.ts | 29 ++ .../src/resources/grpc-credentials.ts | 5 + .../src/resources/protoloader-options.ts | 7 + services/delivery/src/server.ts | 35 ++ services/delivery/tsconfig.json | 18 + services/proto/delivery.proto | 86 ++++ 16 files changed, 882 insertions(+) create mode 100644 services/delivery/.env.example create mode 100644 services/delivery/.gitignore create mode 100644 services/delivery/.nvmrc create mode 100644 services/delivery/README.md create mode 100644 services/delivery/package.json create mode 100644 services/delivery/pnpm-lock.yaml create mode 100644 services/delivery/prisma/schema.prisma create mode 100644 services/delivery/prisma/seed.ts create mode 100644 services/delivery/src/handlers/.gitinclude create mode 100644 services/delivery/src/lib/log.ts create mode 100644 services/delivery/src/lib/prisma.ts create mode 100644 services/delivery/src/resources/grpc-credentials.ts create mode 100644 services/delivery/src/resources/protoloader-options.ts create mode 100644 services/delivery/src/server.ts create mode 100755 services/delivery/tsconfig.json create mode 100644 services/proto/delivery.proto diff --git a/services/delivery/.env.example b/services/delivery/.env.example new file mode 100644 index 00000000..6a86f4b9 --- /dev/null +++ b/services/delivery/.env.example @@ -0,0 +1,2 @@ +DATABASE_URL=postgres://postgres:postgres@localhost:5432/postgres +PORT=50008 \ No newline at end of file diff --git a/services/delivery/.gitignore b/services/delivery/.gitignore new file mode 100644 index 00000000..378e1eaa --- /dev/null +++ b/services/delivery/.gitignore @@ -0,0 +1,5 @@ +node_modules/ +dist/ +*.env* +!*.env.example + diff --git a/services/delivery/.nvmrc b/services/delivery/.nvmrc new file mode 100644 index 00000000..9dfef472 --- /dev/null +++ b/services/delivery/.nvmrc @@ -0,0 +1 @@ +v18.12.0 diff --git a/services/delivery/README.md b/services/delivery/README.md new file mode 100644 index 00000000..1086b6c8 --- /dev/null +++ b/services/delivery/README.md @@ -0,0 +1,68 @@ +# Delivery Microservice + +| Informations | +| ------------------------------------------------------------------ | +| **Port:** 50008 | +| **Developer:** @floriaaan | +| **Status:** In progress | +| **Last update:** 2023-03-25 | +| **Language:** NodeJS | +| **Dependencies:** TypeScript, Prisma, gRPC, Postgres | +| **Models:** (see [`prisma/schema.prisma`](./prisma/schema.prisma)) | + +## gRPC Methods + +- Delivery model: + + - `CreateDelivery`: Creates a new delivery in the system. + - `GetDelivery`: Retrieves a delivery by its ID. + - `UpdateDelivery`: Updates the status of an existing delivery. + - `DeleteDelivery`: Deletes a delivery by its ID. + - `ListDeliveriesByUser`: Retrieves all deliveries for a given user. + - `ListDeliveriesByRestaurant`: Retrieves all deliveries for a given restaurant. + +- Delivery person model: + - `CreateDeliveryPerson`: Creates a new delivery person in the system. + - `GetDeliveryPerson`: Retrieves a delivery person by its ID. + - `UpdateDeliveryPerson`: Updates an existing delivery person. + - `DeleteDeliveryPerson`: Deletes a delivery person by its ID. + - `ListDeliveryPersons`: Retrieves all delivery persons. + - `ListNearDeliveryPersons`: Retrieves all delivery persons near a given location. + +## Requirements + +To run this microservice, you will need to have the following installed on your system: + +- NodeJS (v18.12.0 or higher) (dev. with v18.12.0) +- Postgres (v15.2 or higher) (dev. with docker image `postgres:15.2`) + +You can use the following tools to help you with the setup: + +- You can use nvm to set your Node version using: + - `nvm use`. +- You can use docker to run your Postgres database using: + - `docker run --name postgres -e POSTGRES_PASSWORD=password -d postgres`. + +## Getting started + +### 1. Clone the repository and install dependencies + +1. Clone the `goodfood` repository to your local machine. +2. Navigate to the service directory (`services/delivery`) in your terminal. +3. Run `npm install` to install the necessary dependencies. +4. Create a `.env` file at the root of the project directory and add the environment variables values (see `.env.example`). +5. Run `npm run start` to start the microservice. + +You can now access the microservice at `http://localhost:50008`. + +NB: If you want to run the microservice in development mode, you can run `npm run dev` instead. + +### 2. Create and seed the database + +Run the following command to create your Postgres database structure. This also creates the models tables that are defined in [`prisma/schema.prisma`](./prisma/schema.prisma): + +``` +npx prisma migrate dev --name init +``` + +When `npx prisma migrate dev` is executed against a newly created database, seeding is also triggered. The seed file in [`prisma/seed.ts`](./prisma/seed.ts) will be executed and your database will be populated with the sample data. diff --git a/services/delivery/package.json b/services/delivery/package.json new file mode 100644 index 00000000..09782b02 --- /dev/null +++ b/services/delivery/package.json @@ -0,0 +1,25 @@ +{ + "name": "typescript-grpc", + "scripts": { + "dev": "ts-node ./src/server.ts", + "seed": "ts-node prisma/seed.ts", + "client:delivery-create": "ts-node ./src/client/delivery-create.ts" + }, + "dependencies": { + "@grpc/grpc-js": "^1.8.13", + "@grpc/proto-loader": "0.7.6", + "@prisma/client": "4.11.0", + "dotenv": "^16.0.3", + "protobufjs": "7.2.2" + }, + "devDependencies": { + "@types/node": "18.15.9", + "prisma": "4.11.0", + "ts-node": "10.9.1", + "tsconfig-paths": "^4.1.2", + "typescript": "5.0.2" + }, + "prisma": { + "seed": "ts-node prisma/seed.ts" + } +} diff --git a/services/delivery/pnpm-lock.yaml b/services/delivery/pnpm-lock.yaml new file mode 100644 index 00000000..50a04449 --- /dev/null +++ b/services/delivery/pnpm-lock.yaml @@ -0,0 +1,427 @@ +lockfileVersion: 5.4 + +specifiers: + '@grpc/grpc-js': ^1.8.13 + '@grpc/proto-loader': 0.7.6 + '@prisma/client': 4.11.0 + '@types/node': 18.15.9 + chalk: 4.1.2 + dotenv: ^16.0.3 + prisma: 4.11.0 + protobufjs: 7.2.2 + ts-node: 10.9.1 + tsconfig-paths: ^4.1.2 + typescript: 5.0.2 + +dependencies: + '@grpc/grpc-js': 1.8.13 + '@grpc/proto-loader': 0.7.6 + '@prisma/client': 4.11.0_prisma@4.11.0 + chalk: 4.1.2 + dotenv: 16.0.3 + protobufjs: 7.2.2 + +devDependencies: + '@types/node': 18.15.9 + prisma: 4.11.0 + ts-node: 10.9.1_3flabivgbrnlfzsgzfhinuvrvy + tsconfig-paths: 4.1.2 + typescript: 5.0.2 + +packages: + + /@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 + + /@grpc/grpc-js/1.8.13: + resolution: {integrity: sha512-iY3jsdfbc0ARoCLFvbvUB8optgyb0r1XLPb142u+QtgBcKJYkCIFt3Fd/881KqjLYWjsBJF57N3b8Eop9NDfUA==} + engines: {node: ^8.13.0 || >=10.10.0} + dependencies: + '@grpc/proto-loader': 0.7.6 + '@types/node': 18.15.9 + dev: false + + /@grpc/proto-loader/0.7.6: + resolution: {integrity: sha512-QyAXR8Hyh7uMDmveWxDSUcJr9NAWaZ2I6IXgAYvQmfflwouTM+rArE2eEaCtLlRqO81j7pRLCt81IefUei6Zbw==} + engines: {node: '>=6'} + hasBin: true + dependencies: + '@types/long': 4.0.2 + lodash.camelcase: 4.3.0 + long: 4.0.0 + protobufjs: 7.2.2 + yargs: 16.2.0 + dev: false + + /@jridgewell/resolve-uri/3.1.0: + resolution: {integrity: sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==} + engines: {node: '>=6.0.0'} + dev: true + + /@jridgewell/sourcemap-codec/1.4.14: + resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==} + dev: true + + /@jridgewell/trace-mapping/0.3.9: + resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} + dependencies: + '@jridgewell/resolve-uri': 3.1.0 + '@jridgewell/sourcemap-codec': 1.4.14 + dev: true + + /@prisma/client/4.11.0_prisma@4.11.0: + resolution: {integrity: sha512-0INHYkQIqgAjrt7NzhYpeDQi8x3Nvylc2uDngKyFDDj1tTRQ4uV1HnVmd1sQEraeVAN63SOK0dgCKQHlvjL0KA==} + engines: {node: '>=14.17'} + requiresBuild: true + peerDependencies: + prisma: '*' + peerDependenciesMeta: + prisma: + optional: true + dependencies: + '@prisma/engines-version': 4.11.0-57.8fde8fef4033376662cad983758335009d522acb + prisma: 4.11.0 + dev: false + + /@prisma/engines-version/4.11.0-57.8fde8fef4033376662cad983758335009d522acb: + resolution: {integrity: sha512-3Vd8Qq06d5xD8Ch5WauWcUUrsVPdMC6Ge8ILji8RFfyhUpqon6qSyGM0apvr1O8n8qH8cKkEFqRPsYjuz5r83g==} + dev: false + + /@prisma/engines/4.11.0: + resolution: {integrity: sha512-0AEBi2HXGV02cf6ASsBPhfsVIbVSDC9nbQed4iiY5eHttW9ZtMxHThuKZE1pnESbr8HRdgmFSa/Kn4OSNYuibg==} + requiresBuild: true + + /@protobufjs/aspromise/1.1.2: + resolution: {integrity: sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==} + dev: false + + /@protobufjs/base64/1.1.2: + resolution: {integrity: sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==} + dev: false + + /@protobufjs/codegen/2.0.4: + resolution: {integrity: sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==} + dev: false + + /@protobufjs/eventemitter/1.1.0: + resolution: {integrity: sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==} + dev: false + + /@protobufjs/fetch/1.1.0: + resolution: {integrity: sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==} + dependencies: + '@protobufjs/aspromise': 1.1.2 + '@protobufjs/inquire': 1.1.0 + dev: false + + /@protobufjs/float/1.0.2: + resolution: {integrity: sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==} + dev: false + + /@protobufjs/inquire/1.1.0: + resolution: {integrity: sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==} + dev: false + + /@protobufjs/path/1.1.2: + resolution: {integrity: sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==} + dev: false + + /@protobufjs/pool/1.1.0: + resolution: {integrity: sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==} + dev: false + + /@protobufjs/utf8/1.1.0: + resolution: {integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==} + 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.3: + resolution: {integrity: sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==} + dev: true + + /@types/long/4.0.2: + resolution: {integrity: sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==} + dev: false + + /@types/node/18.15.9: + resolution: {integrity: sha512-dUxhiNzBLr6IqlZXz6e/rN2YQXlFgOei/Dxy+e3cyXTJ4txSUbGT2/fmnD6zd/75jDMeW5bDee+YXxlFKHoV0A==} + + /acorn-walk/8.2.0: + resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} + engines: {node: '>=0.4.0'} + dev: true + + /acorn/8.8.2: + resolution: {integrity: sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==} + engines: {node: '>=0.4.0'} + hasBin: true + dev: true + + /ansi-regex/5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + dev: false + + /ansi-styles/4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + dependencies: + color-convert: 2.0.1 + dev: false + + /arg/4.1.3: + resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} + dev: true + + /chalk/4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + 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 + + /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 + + /create-require/1.1.1: + resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} + dev: true + + /diff/4.0.2: + resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} + engines: {node: '>=0.3.1'} + dev: true + + /dotenv/16.0.3: + resolution: {integrity: sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==} + engines: {node: '>=12'} + dev: false + + /emoji-regex/8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + dev: false + + /escalade/3.1.1: + resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} + engines: {node: '>=6'} + dev: false + + /get-caller-file/2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + dev: false + + /has-flag/4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + dev: false + + /is-fullwidth-code-point/3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + dev: false + + /json5/2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + dev: true + + /lodash.camelcase/4.3.0: + resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} + dev: false + + /long/4.0.0: + resolution: {integrity: sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==} + dev: false + + /long/5.2.1: + resolution: {integrity: sha512-GKSNGeNAtw8IryjjkhZxuKB3JzlcLTwjtiQCHKvqQet81I93kXslhDQruGI/QsddO83mcDToBVy7GqGS/zYf/A==} + dev: false + + /make-error/1.3.6: + resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + dev: true + + /minimist/1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + dev: true + + /prisma/4.11.0: + resolution: {integrity: sha512-4zZmBXssPUEiX+GeL0MUq/Yyie4ltiKmGu7jCJFnYMamNrrulTBc+D+QwAQSJ01tyzeGHlD13kOnqPwRipnlNw==} + engines: {node: '>=14.17'} + hasBin: true + requiresBuild: true + dependencies: + '@prisma/engines': 4.11.0 + + /protobufjs/7.2.2: + resolution: {integrity: sha512-++PrQIjrom+bFDPpfmqXfAGSQs40116JRrqqyf53dymUMvvb5d/LMRyicRoF1AUKoXVS1/IgJXlEgcpr4gTF3Q==} + engines: {node: '>=12.0.0'} + requiresBuild: true + dependencies: + '@protobufjs/aspromise': 1.1.2 + '@protobufjs/base64': 1.1.2 + '@protobufjs/codegen': 2.0.4 + '@protobufjs/eventemitter': 1.1.0 + '@protobufjs/fetch': 1.1.0 + '@protobufjs/float': 1.0.2 + '@protobufjs/inquire': 1.1.0 + '@protobufjs/path': 1.1.2 + '@protobufjs/pool': 1.1.0 + '@protobufjs/utf8': 1.1.0 + '@types/node': 18.15.9 + long: 5.2.1 + dev: false + + /require-directory/2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + dev: false + + /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 + dev: false + + /strip-ansi/6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + dependencies: + ansi-regex: 5.0.1 + dev: false + + /strip-bom/3.0.0: + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} + dev: true + + /supports-color/7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + dependencies: + has-flag: 4.0.0 + dev: false + + /ts-node/10.9.1_3flabivgbrnlfzsgzfhinuvrvy: + 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.3 + '@types/node': 18.15.9 + acorn: 8.8.2 + 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.0.2 + v8-compile-cache-lib: 3.0.1 + yn: 3.1.1 + dev: true + + /tsconfig-paths/4.1.2: + resolution: {integrity: sha512-uhxiMgnXQp1IR622dUXI+9Ehnws7i/y6xvpZB9IbUVOPy0muvdvgXeZOn88UcGPiT98Vp3rJPTa8bFoalZ3Qhw==} + engines: {node: '>=6'} + dependencies: + json5: 2.2.3 + minimist: 1.2.8 + strip-bom: 3.0.0 + dev: true + + /typescript/5.0.2: + resolution: {integrity: sha512-wVORMBGO/FAs/++blGNeAVdbNKtIh1rbBL2EyQ1+J9lClJ93KiiKe8PmFIVdXhHcyv44SL9oglmfeSsndo0jRw==} + engines: {node: '>=12.20'} + hasBin: true + dev: true + + /v8-compile-cache-lib/3.0.1: + resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} + 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 + dev: false + + /y18n/5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + dev: false + + /yargs-parser/20.2.9: + resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} + engines: {node: '>=10'} + dev: false + + /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 + + /yn/3.1.1: + resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} + engines: {node: '>=6'} + dev: true diff --git a/services/delivery/prisma/schema.prisma b/services/delivery/prisma/schema.prisma new file mode 100644 index 00000000..a9384d5b --- /dev/null +++ b/services/delivery/prisma/schema.prisma @@ -0,0 +1,36 @@ +datasource db { + provider = "postgresql" + url = env("DATABASE_URL") +} + +generator client { + provider = "prisma-client-js" +} + +enum Status { + PENDING + IN_PROGRESS + FULFILLED + REJECTED +} + +model Delivery { + id String @id @default(cuid()) + estimated_date DateTime + + address String + status Status @default(PENDING) + + person DeliveryPerson @relation(fields: [delivery_person_id], references: [id]) + delivery_person_id String +} + +model DeliveryPerson { + id String @id @default(cuid()) + first_name String + last_name String + phone String @unique + location Float[] + + deliveries Delivery[] +} diff --git a/services/delivery/prisma/seed.ts b/services/delivery/prisma/seed.ts new file mode 100644 index 00000000..40472cf0 --- /dev/null +++ b/services/delivery/prisma/seed.ts @@ -0,0 +1,64 @@ +import { PrismaClient, Prisma } from "@prisma/client"; + +const prisma = new PrismaClient(); + +const deliveryPerson: Prisma.DeliveryPersonCreateInput[] = [ + { + id: "random_id", + first_name: "John", + last_name: "Doe", + phone: "0612345678", + location: [4.123, 52.123], + }, + { + first_name: "Jane", + last_name: "Doe", + phone: "0612345679", + location: [4.123, 52.124], + }, + { + first_name: "Jack", + last_name: "Doe", + phone: "0612345677", + location: [4.124, 52.123], + }, +]; + +const deliveries: Prisma.DeliveryCreateInput[] = [ + { + address: "15 rue de la paix 75000 Paris", + estimated_date: new Date("2023-01-01"), + person: { create: deliveryPerson[0] }, + }, + { + address: "16 rue de la paix 75000 Paris", + estimated_date: new Date("2023-02-01"), + person: { create: deliveryPerson[1] }, + }, + { + address: "17 rue de la paix 75000 Paris", + estimated_date: new Date("2023-03-01"), + person: { create: deliveryPerson[2] }, + }, +]; + +async function main() { + console.log(`Start seeding ...`); + for (const d of deliveries) { + const delivery = await prisma.delivery.create({ + data: d, + }); + console.log(`Created delivery with id: ${delivery.id}`); + } + console.log(`Seeding finished.`); +} + +main() + .then(async () => { + await prisma.$disconnect(); + }) + .catch(async (e) => { + console.error(e); + await prisma.$disconnect(); + process.exit(1); + }); diff --git a/services/delivery/src/handlers/.gitinclude b/services/delivery/src/handlers/.gitinclude new file mode 100644 index 00000000..e69de29b diff --git a/services/delivery/src/lib/log.ts b/services/delivery/src/lib/log.ts new file mode 100644 index 00000000..2404af54 --- /dev/null +++ b/services/delivery/src/lib/log.ts @@ -0,0 +1,74 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ +/* eslint-disable no-console */ + +function getStackTrace() { + let stack; + + try { + throw new Error(""); + } catch (error) { + stack = (error as Error).stack || ""; + } + + stack = stack.split("\n").map((line) => line.trim()); + return stack.splice(stack[0] === "Error" ? 2 : 1); +} + +const getInitiator = () => { + // _getInitiatorLine, _ObjectInfoLine, caller + const [, , caller] = getStackTrace(); + const file = caller.split("/").at(-1) || ""; + return file.replace(")", ""); +}; + +const warn = (...args: any[]) => { + console.group( + `\x1b[33m${new Date().toISOString()} - WARN - ${getInitiator()}\x1b[0m` + ); + console.warn(...args); + console.groupEnd(); +}; +const error = (...args: any[]) => { + console.group( + `\x1b[31m${new Date().toISOString()} - ERROR - ${getInitiator()}\x1b[0m` + ); + console.error(...args); + console.groupEnd(); +}; +const info = (...args: any[]) => { + console.group( + `\x1b[34m${new Date().toISOString()} - INFO - ${getInitiator()}\x1b[0m` + ); + console.log(...args); + console.groupEnd(); +}; +const debug = (...args: any[]) => { + console.log(...args); +}; + +/** + * @description a simple interface logger for logging to the console and into a log drain in the future + * @example + * log.warn('this is a warning'); + * log.error('this is an error'); + * log.info('this is an info'); + * @exports log + */ +export const log = { + warn, + error, + info, + debug, +}; + +export const utils = { + bold: (text: string) => `\x1b[1m${text}\x1b[0m`, + red: (text: string) => `\x1b[31m${text}\x1b[0m`, + green: (text: string) => `\x1b[32m${text}\x1b[0m`, + yellow: (text: string) => `\x1b[33m${text}\x1b[0m`, + blue: (text: string) => `\x1b[34m${text}\x1b[0m`, + magenta: (text: string) => `\x1b[35m${text}\x1b[0m`, + cyan: (text: string) => `\x1b[36m${text}\x1b[0m`, + white: (text: string) => `\x1b[37m${text}\x1b[0m`, + gray: (text: string) => `\x1b[90m${text}\x1b[0m`, +}; diff --git a/services/delivery/src/lib/prisma.ts b/services/delivery/src/lib/prisma.ts new file mode 100644 index 00000000..4d495ef0 --- /dev/null +++ b/services/delivery/src/lib/prisma.ts @@ -0,0 +1,29 @@ +import { Prisma, PrismaClient } from "@prisma/client"; + +let prisma: PrismaClient; +type GlobalWithPrisma = typeof globalThis & { + prisma: PrismaClient; +}; + +const OPTIONS: Prisma.PrismaClientOptions = { + log: + process.env.NEXT_PUBLIC_APP_ENV !== "production" + ? ["info", "warn"] + : undefined, +}; + +if (process.env.NODE_ENV === "production") { + prisma = new PrismaClient(OPTIONS); +} else { + // Ensure the prisma instance is re-used during hot-reloading + // Otherwise, a new client will be created on every reload + if (!("prisma" in global)) { + (global as GlobalWithPrisma).prisma = new PrismaClient(OPTIONS); + } + + prisma = (global as GlobalWithPrisma).prisma; +} + +export default prisma; + +export { prisma }; diff --git a/services/delivery/src/resources/grpc-credentials.ts b/services/delivery/src/resources/grpc-credentials.ts new file mode 100644 index 00000000..75a2b5d5 --- /dev/null +++ b/services/delivery/src/resources/grpc-credentials.ts @@ -0,0 +1,5 @@ +import { credentials, ServerCredentials } from "@grpc/grpc-js"; + +export const insecure = credentials.createInsecure(); + +export const serverInsecure = ServerCredentials.createInsecure(); diff --git a/services/delivery/src/resources/protoloader-options.ts b/services/delivery/src/resources/protoloader-options.ts new file mode 100644 index 00000000..5022d96d --- /dev/null +++ b/services/delivery/src/resources/protoloader-options.ts @@ -0,0 +1,7 @@ +export const options = { + keepCase: true, + longs: String, + enums: String, + defaults: true, + oneofs: true, +}; diff --git a/services/delivery/src/server.ts b/services/delivery/src/server.ts new file mode 100644 index 00000000..2032a131 --- /dev/null +++ b/services/delivery/src/server.ts @@ -0,0 +1,35 @@ +import "dotenv/config"; + +import { loadSync } from "@grpc/proto-loader"; +import { loadPackageDefinition, Server } from "@grpc/grpc-js"; + +import { log, utils } from "@delivery/lib/log"; +import { options } from "@delivery/resources/protoloader-options"; +import { serverInsecure } from "@delivery/resources/grpc-credentials"; + +const PORT = process.env.PORT || 50008; +const ADDRESS = `0.0.0.0:${PORT}`; +const PROTO_PATH = __dirname + "/../../proto/delivery.proto"; + +const packageDefinition = loadSync(PROTO_PATH, options); +const { delivery } = loadPackageDefinition(packageDefinition) as any; // todo: fix any +const server = new Server(); + +server.addService(delivery.DeliveryService.service, { + // handlers + // todo: add handlers +}); + +server.addService(delivery.DeliveryPersonService.service, { + // handlers + // todo: add handlers +}); + +server.bindAsync(ADDRESS, serverInsecure, () => { + const message = `---- ${utils.green("good")}${utils.yellow( + "food" + )} Delivery Service ----\nstarted on: ${utils.bold(ADDRESS)} ${utils.green( + "✓" + )}\n`; + log.debug(message); +}); diff --git a/services/delivery/tsconfig.json b/services/delivery/tsconfig.json new file mode 100755 index 00000000..f32ad6b3 --- /dev/null +++ b/services/delivery/tsconfig.json @@ -0,0 +1,18 @@ +{ + "compilerOptions": { + "sourceMap": true, + "outDir": "dist", + "strict": true, + "lib": ["esnext"], + "esModuleInterop": true, + "baseUrl": ".", + "paths": { + "@delivery/*": ["src/*"] + } + }, + "include": ["src/**/*.ts"], + "exclude": ["node_modules"], + "ts-node": { + "require": ["tsconfig-paths/register"] + } +} diff --git a/services/proto/delivery.proto b/services/proto/delivery.proto new file mode 100644 index 00000000..39e65277 --- /dev/null +++ b/services/proto/delivery.proto @@ -0,0 +1,86 @@ +syntax = "proto3"; +import "google/protobuf/timestamp.proto"; +import "google/protobuf/empty.proto"; + +package delivery; + +message Delivery { + string id = 1; + google.protobuf.Timestamp estimated_date = 2; + + string address = 3; + Status status = 4; + + DeliveryPerson person = 5; + string delivery_person_id = 6; +} + +message DeliveryPerson { + string id = 1; + string first_name = 2; + string last_name = 3; + string phone = 4; + repeated float location = 5; + + repeated Delivery deliveries = 6; +} + +enum Status { + PENDING = 0; + IN_PROGRESS = 1; + FULFILLED = 2; + REJECTED = 3; +} + +service DeliveryService { + rpc CreateDelivery (Delivery) returns (Delivery) {} + rpc GetDelivery (DeliveryId) returns (Delivery) {} + rpc UpdateDelivery (Delivery) returns (Delivery) {} + rpc DeleteDelivery (DeliveryId) returns (google.protobuf.Empty) {} + rpc ListDeliveriesByUser (UserId) returns (stream Delivery) {} + rpc ListDeliveriesByRestaurant (RestaurantId) returns (stream Delivery) {} + +} + +service DeliveryPersonService { + rpc CreateDeliveryPerson (DeliveryPerson) returns (DeliveryPerson) {} + rpc GetDeliveryPerson (DeliveryPersonId) returns (DeliveryPerson) {} + rpc UpdateDeliveryPerson (DeliveryPerson) returns (DeliveryPerson) {} + rpc DeleteDeliveryPerson (DeliveryPersonId) returns (google.protobuf.Empty) {} + rpc ListDeliveryPersons (google.protobuf.Empty) returns (stream DeliveryPerson) {} + rpc ListNearDeliveryPersons (Location) returns (stream DeliveryPerson) {} +} + + +message DeliveryId { + string id = 1; +} +message DeliveryCreateInput { + google.protobuf.Timestamp estimated_date = 1; + string address = 2; + Status status = 3; + string delivery_person_id = 4; +} + +message UserId { + string id = 1; +} + +message RestaurantId { + string id = 1; +} + +message DeliveryPersonId { + string id = 1; +} +message DeliveryPersonCreateInput { + string first_name = 1; + string last_name = 2; + string phone = 3; + repeated float location = 4; +} + +message Location { + float latitude = 1; + float longitude = 2; +} From 2f1c9d7f4b4ad32b7665e260c5d2ece976dc51c9 Mon Sep 17 00:00:00 2001 From: Florian LEROUX <10078837+floriaaan@users.noreply.github.com> Date: Wed, 29 Mar 2023 09:50:50 +0200 Subject: [PATCH 105/883] fix(server): forgot to start server explicitly --- services/delivery/src/server.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/services/delivery/src/server.ts b/services/delivery/src/server.ts index 2032a131..16a27d70 100644 --- a/services/delivery/src/server.ts +++ b/services/delivery/src/server.ts @@ -7,6 +7,8 @@ import { log, utils } from "@delivery/lib/log"; import { options } from "@delivery/resources/protoloader-options"; import { serverInsecure } from "@delivery/resources/grpc-credentials"; +import { CreateDelivery } from "@delivery/handlers/delivery"; + const PORT = process.env.PORT || 50008; const ADDRESS = `0.0.0.0:${PORT}`; const PROTO_PATH = __dirname + "/../../proto/delivery.proto"; @@ -18,6 +20,7 @@ const server = new Server(); server.addService(delivery.DeliveryService.service, { // handlers // todo: add handlers + CreateDelivery, }); server.addService(delivery.DeliveryPersonService.service, { @@ -26,6 +29,7 @@ server.addService(delivery.DeliveryPersonService.service, { }); server.bindAsync(ADDRESS, serverInsecure, () => { + server.start(); const message = `---- ${utils.green("good")}${utils.yellow( "food" )} Delivery Service ----\nstarted on: ${utils.bold(ADDRESS)} ${utils.green( From bde74081c8e551cf5a9ba62152e1cf6da47a96a0 Mon Sep 17 00:00:00 2001 From: Florian LEROUX <10078837+floriaaan@users.noreply.github.com> Date: Wed, 29 Mar 2023 09:51:35 +0200 Subject: [PATCH 106/883] fix(readme): add port binding to docker postgres usage --- services/delivery/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/services/delivery/README.md b/services/delivery/README.md index 1086b6c8..f3baac1e 100644 --- a/services/delivery/README.md +++ b/services/delivery/README.md @@ -5,7 +5,7 @@ | **Port:** 50008 | | **Developer:** @floriaaan | | **Status:** In progress | -| **Last update:** 2023-03-25 | +| **Last update:** 2023-03-29 | | **Language:** NodeJS | | **Dependencies:** TypeScript, Prisma, gRPC, Postgres | | **Models:** (see [`prisma/schema.prisma`](./prisma/schema.prisma)) | @@ -41,7 +41,7 @@ You can use the following tools to help you with the setup: - You can use nvm to set your Node version using: - `nvm use`. - You can use docker to run your Postgres database using: - - `docker run --name postgres -e POSTGRES_PASSWORD=password -d postgres`. + - `docker run --name postgres -p 5432:5432 -e POSTGRES_PASSWORD=password -d postgres` ## Getting started From 411bfdb26972f1c826e75888a3ff04a267e80105 Mon Sep 17 00:00:00 2001 From: Florian LEROUX <10078837+floriaaan@users.noreply.github.com> Date: Wed, 29 Mar 2023 09:52:07 +0200 Subject: [PATCH 107/883] feat(pkg): add nodemon watcher script --- services/delivery/.env.example | 2 +- services/delivery/package.json | 4 +- services/delivery/pnpm-lock.yaml | 230 ++++++++++++++++++++++++++++--- 3 files changed, 218 insertions(+), 18 deletions(-) diff --git a/services/delivery/.env.example b/services/delivery/.env.example index 6a86f4b9..e7b2b4e7 100644 --- a/services/delivery/.env.example +++ b/services/delivery/.env.example @@ -1,2 +1,2 @@ -DATABASE_URL=postgres://postgres:postgres@localhost:5432/postgres +DATABASE_URL=postgres://postgres:password@localhost:5432/postgres PORT=50008 \ No newline at end of file diff --git a/services/delivery/package.json b/services/delivery/package.json index 09782b02..113ef54d 100644 --- a/services/delivery/package.json +++ b/services/delivery/package.json @@ -1,7 +1,8 @@ { "name": "typescript-grpc", "scripts": { - "dev": "ts-node ./src/server.ts", + "start": "ts-node ./src/server.ts", + "dev": "nodemon --watch 'src/**/*.ts' --exec 'ts-node' src/server.ts", "seed": "ts-node prisma/seed.ts", "client:delivery-create": "ts-node ./src/client/delivery-create.ts" }, @@ -14,6 +15,7 @@ }, "devDependencies": { "@types/node": "18.15.9", + "nodemon": "^2.0.22", "prisma": "4.11.0", "ts-node": "10.9.1", "tsconfig-paths": "^4.1.2", diff --git a/services/delivery/pnpm-lock.yaml b/services/delivery/pnpm-lock.yaml index 50a04449..38da5b6e 100644 --- a/services/delivery/pnpm-lock.yaml +++ b/services/delivery/pnpm-lock.yaml @@ -5,8 +5,8 @@ specifiers: '@grpc/proto-loader': 0.7.6 '@prisma/client': 4.11.0 '@types/node': 18.15.9 - chalk: 4.1.2 dotenv: ^16.0.3 + nodemon: ^2.0.22 prisma: 4.11.0 protobufjs: 7.2.2 ts-node: 10.9.1 @@ -17,12 +17,12 @@ dependencies: '@grpc/grpc-js': 1.8.13 '@grpc/proto-loader': 0.7.6 '@prisma/client': 4.11.0_prisma@4.11.0 - chalk: 4.1.2 dotenv: 16.0.3 protobufjs: 7.2.2 devDependencies: '@types/node': 18.15.9 + nodemon: 2.0.22 prisma: 4.11.0 ts-node: 10.9.1_3flabivgbrnlfzsgzfhinuvrvy tsconfig-paths: 4.1.2 @@ -161,6 +161,10 @@ packages: /@types/node/18.15.9: resolution: {integrity: sha512-dUxhiNzBLr6IqlZXz6e/rN2YQXlFgOei/Dxy+e3cyXTJ4txSUbGT2/fmnD6zd/75jDMeW5bDee+YXxlFKHoV0A==} + /abbrev/1.1.1: + resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} + dev: true + /acorn-walk/8.2.0: resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} engines: {node: '>=0.4.0'} @@ -184,17 +188,55 @@ packages: color-convert: 2.0.1 dev: false + /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 + /arg/4.1.3: resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} dev: true - /chalk/4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} + /balanced-match/1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + dev: true + + /binary-extensions/2.2.0: + resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} + engines: {node: '>=8'} + dev: true + + /brace-expansion/1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - dev: false + balanced-match: 1.0.2 + concat-map: 0.0.1 + dev: true + + /braces/3.0.2: + resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + engines: {node: '>=8'} + dependencies: + fill-range: 7.0.1 + dev: true + + /chokidar/3.5.3: + resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} + engines: {node: '>= 8.10.0'} + dependencies: + anymatch: 3.1.3 + braces: 3.0.2 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.2 + dev: true /cliui/7.0.4: resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} @@ -215,10 +257,26 @@ packages: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} dev: false + /concat-map/0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + dev: true + /create-require/1.1.1: resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} dev: true + /debug/3.2.7_supports-color@5.5.0: + resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.3 + supports-color: 5.5.0 + dev: true + /diff/4.0.2: resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} engines: {node: '>=0.3.1'} @@ -238,21 +296,71 @@ packages: engines: {node: '>=6'} 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: true + + /fsevents/2.3.2: + resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + requiresBuild: true + dev: true + optional: true + /get-caller-file/2.0.5: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} dev: false - /has-flag/4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + /glob-parent/5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + dependencies: + is-glob: 4.0.3 + dev: true + + /has-flag/3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + dev: true + + /ignore-by-default/1.0.1: + resolution: {integrity: sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==} + dev: true + + /is-binary-path/2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} engines: {node: '>=8'} - dev: false + dependencies: + binary-extensions: 2.2.0 + dev: true + + /is-extglob/2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + dev: true /is-fullwidth-code-point/3.0.0: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} engines: {node: '>=8'} dev: false + /is-glob/4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + dependencies: + is-extglob: 2.1.1 + dev: true + + /is-number/7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + dev: true + /json5/2.2.3: resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} engines: {node: '>=6'} @@ -275,10 +383,54 @@ packages: resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} dev: true + /minimatch/3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + dependencies: + brace-expansion: 1.1.11 + dev: true + /minimist/1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} dev: true + /ms/2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + dev: true + + /nodemon/2.0.22: + resolution: {integrity: sha512-B8YqaKMmyuCO7BowF1Z1/mkPqLk6cs/l63Ojtd6otKjMx47Dq1utxfRxcavH1I7VSaL8n5BUaoutadnsX3AAVQ==} + engines: {node: '>=8.10.0'} + hasBin: true + dependencies: + chokidar: 3.5.3 + debug: 3.2.7_supports-color@5.5.0 + ignore-by-default: 1.0.1 + minimatch: 3.1.2 + pstree.remy: 1.1.8 + semver: 5.7.1 + simple-update-notifier: 1.1.0 + supports-color: 5.5.0 + touch: 3.1.0 + undefsafe: 2.0.5 + dev: true + + /nopt/1.0.10: + resolution: {integrity: sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==} + hasBin: true + dependencies: + abbrev: 1.1.1 + dev: true + + /normalize-path/3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + dev: true + + /picomatch/2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + dev: true + /prisma/4.11.0: resolution: {integrity: sha512-4zZmBXssPUEiX+GeL0MUq/Yyie4ltiKmGu7jCJFnYMamNrrulTBc+D+QwAQSJ01tyzeGHlD13kOnqPwRipnlNw==} engines: {node: '>=14.17'} @@ -306,11 +458,39 @@ packages: long: 5.2.1 dev: false + /pstree.remy/1.1.8: + resolution: {integrity: sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==} + dev: true + + /readdirp/3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + dependencies: + picomatch: 2.3.1 + dev: true + /require-directory/2.1.1: resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} engines: {node: '>=0.10.0'} dev: false + /semver/5.7.1: + resolution: {integrity: sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==} + hasBin: true + dev: true + + /semver/7.0.0: + resolution: {integrity: sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==} + hasBin: true + dev: true + + /simple-update-notifier/1.1.0: + resolution: {integrity: sha512-VpsrsJSUcJEseSbMHkrsrAVSdvVS5I96Qo1QAQ4FxQ9wXFcB+pjj7FB7/us9+GcgfW4ziHtYMc1J0PLczb55mg==} + engines: {node: '>=8.10.0'} + dependencies: + semver: 7.0.0 + dev: true + /string-width/4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} @@ -332,12 +512,26 @@ packages: engines: {node: '>=4'} dev: true - /supports-color/7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} + /supports-color/5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} dependencies: - has-flag: 4.0.0 - dev: false + has-flag: 3.0.0 + 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 + dev: true + + /touch/3.1.0: + resolution: {integrity: sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==} + hasBin: true + dependencies: + nopt: 1.0.10 + dev: true /ts-node/10.9.1_3flabivgbrnlfzsgzfhinuvrvy: resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} @@ -385,6 +579,10 @@ packages: hasBin: true dev: true + /undefsafe/2.0.5: + resolution: {integrity: sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==} + dev: true + /v8-compile-cache-lib/3.0.1: resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} dev: true From 80b0eb676b9f213229e49fd5efb4767a93cedd04 Mon Sep 17 00:00:00 2001 From: Florian LEROUX <10078837+floriaaan@users.noreply.github.com> Date: Wed, 29 Mar 2023 09:52:32 +0200 Subject: [PATCH 108/883] ref: change estimated_date to eta --- .../migration.sql | 30 +++++++++++++++++++ .../prisma/migrations/migration_lock.toml | 3 ++ services/delivery/prisma/schema.prisma | 2 +- services/delivery/prisma/seed.ts | 6 ++-- services/delivery/types/delivery.d.ts | 11 +++++++ services/proto/delivery.proto | 9 +++--- 6 files changed, 52 insertions(+), 9 deletions(-) create mode 100644 services/delivery/prisma/migrations/20230328152031_init_database/migration.sql create mode 100644 services/delivery/prisma/migrations/migration_lock.toml create mode 100644 services/delivery/types/delivery.d.ts diff --git a/services/delivery/prisma/migrations/20230328152031_init_database/migration.sql b/services/delivery/prisma/migrations/20230328152031_init_database/migration.sql new file mode 100644 index 00000000..206c27b2 --- /dev/null +++ b/services/delivery/prisma/migrations/20230328152031_init_database/migration.sql @@ -0,0 +1,30 @@ +-- CreateEnum +CREATE TYPE "Status" AS ENUM ('PENDING', 'IN_PROGRESS', 'FULFILLED', 'REJECTED'); + +-- CreateTable +CREATE TABLE "Delivery" ( + "id" TEXT NOT NULL, + "eta" TIMESTAMP(3) NOT NULL, + "address" TEXT NOT NULL, + "status" "Status" NOT NULL DEFAULT 'PENDING', + "delivery_person_id" TEXT NOT NULL, + + CONSTRAINT "Delivery_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "DeliveryPerson" ( + "id" TEXT NOT NULL, + "first_name" TEXT NOT NULL, + "last_name" TEXT NOT NULL, + "phone" TEXT NOT NULL, + "location" DOUBLE PRECISION[], + + CONSTRAINT "DeliveryPerson_pkey" PRIMARY KEY ("id") +); + +-- CreateIndex +CREATE UNIQUE INDEX "DeliveryPerson_phone_key" ON "DeliveryPerson"("phone"); + +-- AddForeignKey +ALTER TABLE "Delivery" ADD CONSTRAINT "Delivery_delivery_person_id_fkey" FOREIGN KEY ("delivery_person_id") REFERENCES "DeliveryPerson"("id") ON DELETE RESTRICT ON UPDATE CASCADE; diff --git a/services/delivery/prisma/migrations/migration_lock.toml b/services/delivery/prisma/migrations/migration_lock.toml new file mode 100644 index 00000000..fbffa92c --- /dev/null +++ b/services/delivery/prisma/migrations/migration_lock.toml @@ -0,0 +1,3 @@ +# Please do not edit this file manually +# It should be added in your version-control system (i.e. Git) +provider = "postgresql" \ No newline at end of file diff --git a/services/delivery/prisma/schema.prisma b/services/delivery/prisma/schema.prisma index a9384d5b..2c999c8d 100644 --- a/services/delivery/prisma/schema.prisma +++ b/services/delivery/prisma/schema.prisma @@ -16,7 +16,7 @@ enum Status { model Delivery { id String @id @default(cuid()) - estimated_date DateTime + eta DateTime address String status Status @default(PENDING) diff --git a/services/delivery/prisma/seed.ts b/services/delivery/prisma/seed.ts index 40472cf0..cf92b561 100644 --- a/services/delivery/prisma/seed.ts +++ b/services/delivery/prisma/seed.ts @@ -27,17 +27,17 @@ const deliveryPerson: Prisma.DeliveryPersonCreateInput[] = [ const deliveries: Prisma.DeliveryCreateInput[] = [ { address: "15 rue de la paix 75000 Paris", - estimated_date: new Date("2023-01-01"), + eta: new Date("2023-01-01"), person: { create: deliveryPerson[0] }, }, { address: "16 rue de la paix 75000 Paris", - estimated_date: new Date("2023-02-01"), + eta: new Date("2023-02-01"), person: { create: deliveryPerson[1] }, }, { address: "17 rue de la paix 75000 Paris", - estimated_date: new Date("2023-03-01"), + eta: new Date("2023-03-01"), person: { create: deliveryPerson[2] }, }, ]; diff --git a/services/delivery/types/delivery.d.ts b/services/delivery/types/delivery.d.ts new file mode 100644 index 00000000..52fc3159 --- /dev/null +++ b/services/delivery/types/delivery.d.ts @@ -0,0 +1,11 @@ +import { Status } from "@prisma/client"; + +export type DeliveryCreateInput = { + eta: { + seconds: number; + nano: number; + }; + address: string; + status: Status; + delivery_person_id: string; +}; diff --git a/services/proto/delivery.proto b/services/proto/delivery.proto index 39e65277..b306d511 100644 --- a/services/proto/delivery.proto +++ b/services/proto/delivery.proto @@ -1,12 +1,11 @@ syntax = "proto3"; -import "google/protobuf/timestamp.proto"; import "google/protobuf/empty.proto"; package delivery; message Delivery { string id = 1; - google.protobuf.Timestamp estimated_date = 2; + string eta = 2; string address = 3; Status status = 4; @@ -33,7 +32,7 @@ enum Status { } service DeliveryService { - rpc CreateDelivery (Delivery) returns (Delivery) {} + rpc CreateDelivery (DeliveryCreateInput) returns (Delivery) {} rpc GetDelivery (DeliveryId) returns (Delivery) {} rpc UpdateDelivery (Delivery) returns (Delivery) {} rpc DeleteDelivery (DeliveryId) returns (google.protobuf.Empty) {} @@ -43,7 +42,7 @@ service DeliveryService { } service DeliveryPersonService { - rpc CreateDeliveryPerson (DeliveryPerson) returns (DeliveryPerson) {} + rpc CreateDeliveryPerson (DeliveryPersonCreateInput) returns (DeliveryPerson) {} rpc GetDeliveryPerson (DeliveryPersonId) returns (DeliveryPerson) {} rpc UpdateDeliveryPerson (DeliveryPerson) returns (DeliveryPerson) {} rpc DeleteDeliveryPerson (DeliveryPersonId) returns (google.protobuf.Empty) {} @@ -56,7 +55,7 @@ message DeliveryId { string id = 1; } message DeliveryCreateInput { - google.protobuf.Timestamp estimated_date = 1; + string eta = 1; string address = 2; Status status = 3; string delivery_person_id = 4; From 340f1644b0efe61fb6438b7b88b6601bfbe84a14 Mon Sep 17 00:00:00 2001 From: Florian LEROUX <10078837+floriaaan@users.noreply.github.com> Date: Wed, 29 Mar 2023 09:53:00 +0200 Subject: [PATCH 109/883] feat(handler): add create-delivery handler --- .../delivery/src/client/delivery-create.ts | 39 +++++++++++++++++ services/delivery/src/handlers/delivery.ts | 42 +++++++++++++++++++ 2 files changed, 81 insertions(+) create mode 100644 services/delivery/src/client/delivery-create.ts create mode 100644 services/delivery/src/handlers/delivery.ts diff --git a/services/delivery/src/client/delivery-create.ts b/services/delivery/src/client/delivery-create.ts new file mode 100644 index 00000000..2b4fdff5 --- /dev/null +++ b/services/delivery/src/client/delivery-create.ts @@ -0,0 +1,39 @@ +import "dotenv/config"; +import { loadSync } from "@grpc/proto-loader"; +import { loadPackageDefinition } from "@grpc/grpc-js"; + +import { options } from "@delivery/resources/protoloader-options"; +import { insecure } from "@delivery/resources/grpc-credentials"; +import { log } from "@delivery/lib/log"; + +const PORT = process.env.PORT || 50008; +const ADDRESS = `localhost:${PORT}`; +const PROTO_PATH = __dirname + "/../../../proto/delivery.proto"; + +const packageDefinition = loadSync(PROTO_PATH, options); +const { delivery } = loadPackageDefinition(packageDefinition) as any; + +function main() { + const client = new delivery.DeliveryService(ADDRESS, insecure); + + /** + * message DeliveryCreateInput { + google.protobuf.Timestamp eta = 1; + string address = 2; + Status status = 3; + string delivery_person_id = 4; + } + */ + const data = { + eta: "2022-01-01T00:00:00.000Z", + address: "10 Rue de la République, 75003 Paris, France", + status: "PENDING", + delivery_person_id: "random_id", + }; + client.CreateDelivery(data, (err: any, response: any) => { + if (err) log.error(err); + log.info(response); + }); +} + +main(); diff --git a/services/delivery/src/handlers/delivery.ts b/services/delivery/src/handlers/delivery.ts new file mode 100644 index 00000000..c6f070af --- /dev/null +++ b/services/delivery/src/handlers/delivery.ts @@ -0,0 +1,42 @@ +import { prisma } from "@delivery/lib/prisma"; +import { log } from "@delivery/lib/log"; +import { Status } from "@prisma/client"; + +type DeliveryCreateInput = { + eta: string; + address: string; + status: Status; + delivery_person_id: string; +}; + +export const CreateDelivery = async ( + data: any, + callback: (err: any, response: any) => void +) => { + log.debug("request received at CreateDelivery handler\n", data.request); + try { + const { request } = data; + const { eta, address, status, delivery_person_id } = + request as DeliveryCreateInput; + + const delivery = await prisma.delivery.create({ + data: { + eta: new Date(eta), + address, + status, + person: { + connect: { + id: delivery_person_id, + }, + }, + }, + include: { + person: true, + }, + }); + callback(null, delivery); + } catch (error) { + log.error(error); + callback(error, null); + } +}; From 5ca2ae2e8bea5ce8ddb808f8a6a1107919f3e0c3 Mon Sep 17 00:00:00 2001 From: Florian LEROUX <10078837+floriaaan@users.noreply.github.com> Date: Fri, 31 Mar 2023 20:59:30 +0200 Subject: [PATCH 110/883] feat(delivery): add implementation of handlers for delivery service --- services/delivery/README.md | 2 +- services/delivery/package.json | 7 ++- .../migration.sql | 10 ++++ services/delivery/prisma/schema.prisma | 7 ++- services/delivery/prisma/seed.ts | 18 +++++++ .../create.ts} | 16 ++---- .../delivery/src/client/delivery/delete.ts | 28 +++++++++++ services/delivery/src/client/delivery/get.ts | 28 +++++++++++ .../src/client/delivery/list-by-restaurant.ts | 39 +++++++++++++++ .../src/client/delivery/list-by-user.ts | 39 +++++++++++++++ .../delivery/src/client/delivery/update.ts | 35 +++++++++++++ .../{delivery.ts => delivery/create.ts} | 20 +++----- .../delivery/src/handlers/delivery/delete.ts | 20 ++++++++ .../delivery/src/handlers/delivery/get.ts | 23 +++++++++ .../delivery/src/handlers/delivery/index.ts | 15 ++++++ .../handlers/delivery/list-by-restaurant.ts | 30 ++++++++++++ .../src/handlers/delivery/list-by-user.ts | 27 ++++++++++ .../delivery/src/handlers/delivery/update.ts | 34 +++++++++++++ services/delivery/src/server.ts | 14 ++---- .../delivery/src/types/delivery-person.d.ts | 11 +++++ services/delivery/src/types/delivery.d.ts | 49 +++++++++++++++++++ services/delivery/types/delivery.d.ts | 11 ----- services/proto/delivery.proto | 6 +++ 23 files changed, 439 insertions(+), 50 deletions(-) create mode 100644 services/delivery/prisma/migrations/20230331181153_add_user_and_restaurant_ids/migration.sql rename services/delivery/src/client/{delivery-create.ts => delivery/create.ts} (74%) create mode 100644 services/delivery/src/client/delivery/delete.ts create mode 100644 services/delivery/src/client/delivery/get.ts create mode 100644 services/delivery/src/client/delivery/list-by-restaurant.ts create mode 100644 services/delivery/src/client/delivery/list-by-user.ts create mode 100644 services/delivery/src/client/delivery/update.ts rename services/delivery/src/handlers/{delivery.ts => delivery/create.ts} (61%) create mode 100644 services/delivery/src/handlers/delivery/delete.ts create mode 100644 services/delivery/src/handlers/delivery/get.ts create mode 100644 services/delivery/src/handlers/delivery/index.ts create mode 100644 services/delivery/src/handlers/delivery/list-by-restaurant.ts create mode 100644 services/delivery/src/handlers/delivery/list-by-user.ts create mode 100644 services/delivery/src/handlers/delivery/update.ts create mode 100644 services/delivery/src/types/delivery-person.d.ts create mode 100644 services/delivery/src/types/delivery.d.ts delete mode 100644 services/delivery/types/delivery.d.ts diff --git a/services/delivery/README.md b/services/delivery/README.md index f3baac1e..7f125245 100644 --- a/services/delivery/README.md +++ b/services/delivery/README.md @@ -5,7 +5,7 @@ | **Port:** 50008 | | **Developer:** @floriaaan | | **Status:** In progress | -| **Last update:** 2023-03-29 | +| **Last update:** 2023-03-31 | | **Language:** NodeJS | | **Dependencies:** TypeScript, Prisma, gRPC, Postgres | | **Models:** (see [`prisma/schema.prisma`](./prisma/schema.prisma)) | diff --git a/services/delivery/package.json b/services/delivery/package.json index 113ef54d..3eb5a908 100644 --- a/services/delivery/package.json +++ b/services/delivery/package.json @@ -4,7 +4,12 @@ "start": "ts-node ./src/server.ts", "dev": "nodemon --watch 'src/**/*.ts' --exec 'ts-node' src/server.ts", "seed": "ts-node prisma/seed.ts", - "client:delivery-create": "ts-node ./src/client/delivery-create.ts" + "client:delivery-create": "ts-node ./src/client/delivery/create.ts", + "client:delivery-get": "ts-node ./src/client/delivery/get.ts", + "client:delivery-update": "ts-node ./src/client/delivery/update.ts", + "client:delivery-delete": "ts-node ./src/client/delivery/delete.ts", + "client:delivery-listByRestaurant": "ts-node ./src/client/delivery/list-by-restaurant.ts", + "client:delivery-listByUser": "ts-node ./src/client/delivery/list-by-user.ts" }, "dependencies": { "@grpc/grpc-js": "^1.8.13", diff --git a/services/delivery/prisma/migrations/20230331181153_add_user_and_restaurant_ids/migration.sql b/services/delivery/prisma/migrations/20230331181153_add_user_and_restaurant_ids/migration.sql new file mode 100644 index 00000000..2e663da2 --- /dev/null +++ b/services/delivery/prisma/migrations/20230331181153_add_user_and_restaurant_ids/migration.sql @@ -0,0 +1,10 @@ +/* + Warnings: + + - Added the required column `restaurant_id` to the `Delivery` table without a default value. This is not possible if the table is not empty. + - Added the required column `user_id` to the `Delivery` table without a default value. This is not possible if the table is not empty. + +*/ +-- AlterTable +ALTER TABLE "Delivery" ADD COLUMN "restaurant_id" TEXT NOT NULL, +ADD COLUMN "user_id" TEXT NOT NULL; diff --git a/services/delivery/prisma/schema.prisma b/services/delivery/prisma/schema.prisma index 2c999c8d..0d7939f5 100644 --- a/services/delivery/prisma/schema.prisma +++ b/services/delivery/prisma/schema.prisma @@ -15,7 +15,7 @@ enum Status { } model Delivery { - id String @id @default(cuid()) + id String @id @default(cuid()) eta DateTime address String @@ -23,13 +23,16 @@ model Delivery { person DeliveryPerson @relation(fields: [delivery_person_id], references: [id]) delivery_person_id String + + user_id String + restaurant_id String } model DeliveryPerson { id String @id @default(cuid()) first_name String last_name String - phone String @unique + phone String @unique location Float[] deliveries Delivery[] diff --git a/services/delivery/prisma/seed.ts b/services/delivery/prisma/seed.ts index cf92b561..cc6998fd 100644 --- a/services/delivery/prisma/seed.ts +++ b/services/delivery/prisma/seed.ts @@ -29,16 +29,33 @@ const deliveries: Prisma.DeliveryCreateInput[] = [ address: "15 rue de la paix 75000 Paris", eta: new Date("2023-01-01"), person: { create: deliveryPerson[0] }, + + restaurant_id: "restaurant_id:1", + user_id: "user_id:1", + }, + { + address: "15 rue de la paix 75000 Paris", + eta: new Date("2023-01-01"), + person: { create: deliveryPerson[0] }, + + restaurant_id: "restaurant_id:2", + user_id: "user_id:1", }, { address: "16 rue de la paix 75000 Paris", eta: new Date("2023-02-01"), person: { create: deliveryPerson[1] }, + + restaurant_id: "restaurant_id:1", + user_id: "user_id:2", }, { address: "17 rue de la paix 75000 Paris", eta: new Date("2023-03-01"), person: { create: deliveryPerson[2] }, + + restaurant_id: "restaurant_id:1", + user_id: "user_id:3", }, ]; @@ -60,5 +77,6 @@ main() .catch(async (e) => { console.error(e); await prisma.$disconnect(); + // @ts-ignore process.exit(1); }); diff --git a/services/delivery/src/client/delivery-create.ts b/services/delivery/src/client/delivery/create.ts similarity index 74% rename from services/delivery/src/client/delivery-create.ts rename to services/delivery/src/client/delivery/create.ts index 2b4fdff5..9e6717dd 100644 --- a/services/delivery/src/client/delivery-create.ts +++ b/services/delivery/src/client/delivery/create.ts @@ -8,7 +8,7 @@ import { log } from "@delivery/lib/log"; const PORT = process.env.PORT || 50008; const ADDRESS = `localhost:${PORT}`; -const PROTO_PATH = __dirname + "/../../../proto/delivery.proto"; +const PROTO_PATH = __dirname + "/../../../../proto/delivery.proto"; const packageDefinition = loadSync(PROTO_PATH, options); const { delivery } = loadPackageDefinition(packageDefinition) as any; @@ -16,23 +16,17 @@ const { delivery } = loadPackageDefinition(packageDefinition) as any; function main() { const client = new delivery.DeliveryService(ADDRESS, insecure); - /** - * message DeliveryCreateInput { - google.protobuf.Timestamp eta = 1; - string address = 2; - Status status = 3; - string delivery_person_id = 4; - } - */ const data = { eta: "2022-01-01T00:00:00.000Z", address: "10 Rue de la République, 75003 Paris, France", status: "PENDING", delivery_person_id: "random_id", + restaurant_id: "restaurant_id:1", + user_id: "user_id:1", }; client.CreateDelivery(data, (err: any, response: any) => { - if (err) log.error(err); - log.info(response); + if (err) log.debug(err); + log.debug(response); }); } diff --git a/services/delivery/src/client/delivery/delete.ts b/services/delivery/src/client/delivery/delete.ts new file mode 100644 index 00000000..74c08a90 --- /dev/null +++ b/services/delivery/src/client/delivery/delete.ts @@ -0,0 +1,28 @@ +import "dotenv/config"; +import { loadSync } from "@grpc/proto-loader"; +import { loadPackageDefinition } from "@grpc/grpc-js"; + +import { options } from "@delivery/resources/protoloader-options"; +import { insecure } from "@delivery/resources/grpc-credentials"; +import { log } from "@delivery/lib/log"; + +const PORT = process.env.PORT || 50008; +const ADDRESS = `localhost:${PORT}`; +const PROTO_PATH = __dirname + "/../../../../proto/delivery.proto"; + +const packageDefinition = loadSync(PROTO_PATH, options); +const { delivery } = loadPackageDefinition(packageDefinition) as any; + +function main() { + const client = new delivery.DeliveryService(ADDRESS, insecure); + + const data = { + id: "clfwvdqdg0000eun46hcudaec", // Change this to a valid delivery id + }; + client.DeleteDelivery(data, (err: any, response: any) => { + if (err) log.debug(err); + log.debug(response); + }); +} + +main(); diff --git a/services/delivery/src/client/delivery/get.ts b/services/delivery/src/client/delivery/get.ts new file mode 100644 index 00000000..197e23df --- /dev/null +++ b/services/delivery/src/client/delivery/get.ts @@ -0,0 +1,28 @@ +import "dotenv/config"; +import { loadSync } from "@grpc/proto-loader"; +import { loadPackageDefinition } from "@grpc/grpc-js"; + +import { options } from "@delivery/resources/protoloader-options"; +import { insecure } from "@delivery/resources/grpc-credentials"; +import { log } from "@delivery/lib/log"; + +const PORT = process.env.PORT || 50008; +const ADDRESS = `localhost:${PORT}`; +const PROTO_PATH = __dirname + "/../../../../proto/delivery.proto"; + +const packageDefinition = loadSync(PROTO_PATH, options); +const { delivery } = loadPackageDefinition(packageDefinition) as any; + +function main() { + const client = new delivery.DeliveryService(ADDRESS, insecure); + + const data = { + id: "clfwv7rcp0000euwpyyoid7x", // Change this to a valid delivery id + }; + client.GetDelivery(data, (err: any, response: any) => { + if (err) log.debug(err); + log.debug(response); + }); +} + +main(); diff --git a/services/delivery/src/client/delivery/list-by-restaurant.ts b/services/delivery/src/client/delivery/list-by-restaurant.ts new file mode 100644 index 00000000..0e7157a5 --- /dev/null +++ b/services/delivery/src/client/delivery/list-by-restaurant.ts @@ -0,0 +1,39 @@ +import "dotenv/config"; +import { loadSync } from "@grpc/proto-loader"; +import { loadPackageDefinition } from "@grpc/grpc-js"; + +import { options } from "@delivery/resources/protoloader-options"; +import { insecure } from "@delivery/resources/grpc-credentials"; +import { log } from "@delivery/lib/log"; +import { Delivery } from "@delivery/types/delivery"; + +const PORT = process.env.PORT || 50008; +const ADDRESS = `localhost:${PORT}`; +const PROTO_PATH = __dirname + "/../../../../proto/delivery.proto"; + +const packageDefinition = loadSync(PROTO_PATH, options); +const { delivery } = loadPackageDefinition(packageDefinition) as any; + +function main() { + const client = new delivery.DeliveryService(ADDRESS, insecure); + + const data = { + id: "restaurant_id:1", + }; + + const call = client.ListDeliveriesByRestaurant(data); + const deliveries: Delivery[] = []; + call.on("data", (delivery: Delivery) => { + log.debug(`Received delivery: ${delivery.id}`); + deliveries.push(delivery); + }); + call.on("end", () => { + console.log("All deliveries received."); + log.debug(deliveries); + }); + call.on("error", (error: Error) => { + log.debug("Error:", error.message); + }); +} + +main(); diff --git a/services/delivery/src/client/delivery/list-by-user.ts b/services/delivery/src/client/delivery/list-by-user.ts new file mode 100644 index 00000000..b51c7f2b --- /dev/null +++ b/services/delivery/src/client/delivery/list-by-user.ts @@ -0,0 +1,39 @@ +import "dotenv/config"; +import { loadSync } from "@grpc/proto-loader"; +import { loadPackageDefinition } from "@grpc/grpc-js"; + +import { options } from "@delivery/resources/protoloader-options"; +import { insecure } from "@delivery/resources/grpc-credentials"; +import { log } from "@delivery/lib/log"; +import { Delivery } from "@delivery/types/delivery"; + +const PORT = process.env.PORT || 50008; +const ADDRESS = `localhost:${PORT}`; +const PROTO_PATH = __dirname + "/../../../../proto/delivery.proto"; + +const packageDefinition = loadSync(PROTO_PATH, options); +const { delivery } = loadPackageDefinition(packageDefinition) as any; + +function main() { + const client = new delivery.DeliveryService(ADDRESS, insecure); + + const data = { + id: "user_id:1", + }; + + const call = client.ListDeliveriesByUser(data); + const deliveries: Delivery[] = []; + call.on("data", (delivery: Delivery) => { + log.debug(`Received delivery: ${delivery.id}`); + deliveries.push(delivery); + }); + call.on("end", () => { + console.log("All deliveries received."); + log.debug(deliveries); + }); + call.on("error", (error: Error) => { + log.debug("Error:", error.message); + }); +} + +main(); diff --git a/services/delivery/src/client/delivery/update.ts b/services/delivery/src/client/delivery/update.ts new file mode 100644 index 00000000..1b997641 --- /dev/null +++ b/services/delivery/src/client/delivery/update.ts @@ -0,0 +1,35 @@ +import "dotenv/config"; +import { loadSync } from "@grpc/proto-loader"; +import { loadPackageDefinition } from "@grpc/grpc-js"; + +import { options } from "@delivery/resources/protoloader-options"; +import { insecure } from "@delivery/resources/grpc-credentials"; +import { log } from "@delivery/lib/log"; +import { Status } from "@prisma/client"; + +const PORT = process.env.PORT || 50008; +const ADDRESS = `localhost:${PORT}`; +const PROTO_PATH = __dirname + "/../../../../proto/delivery.proto"; + +const packageDefinition = loadSync(PROTO_PATH, options); +const { delivery } = loadPackageDefinition(packageDefinition) as any; + +function main() { + const client = new delivery.DeliveryService(ADDRESS, insecure); + + const data = { + id: "clfwvhula0000eunjmo7bmrtz", // Change this to a valid delivery id + eta: "2022-01-01T00:00:00.000Z", + address: "10 Rue de la République, 75003 Paris, France", + status: Status.FULFILLED, + delivery_person_id: "random_id", + restaurant_id: "restaurant_id:1", + user_id: "user_id:1", + }; + client.UpdateDelivery(data, (err: any, response: any) => { + if (err) log.debug(err); + log.debug(response); + }); +} + +main(); diff --git a/services/delivery/src/handlers/delivery.ts b/services/delivery/src/handlers/delivery/create.ts similarity index 61% rename from services/delivery/src/handlers/delivery.ts rename to services/delivery/src/handlers/delivery/create.ts index c6f070af..1ad90069 100644 --- a/services/delivery/src/handlers/delivery.ts +++ b/services/delivery/src/handlers/delivery/create.ts @@ -1,23 +1,15 @@ import { prisma } from "@delivery/lib/prisma"; import { log } from "@delivery/lib/log"; -import { Status } from "@prisma/client"; - -type DeliveryCreateInput = { - eta: string; - address: string; - status: Status; - delivery_person_id: string; -}; +import { Data, DeliveryCreateInput } from "@delivery/types/delivery"; export const CreateDelivery = async ( - data: any, + { request }: Data, callback: (err: any, response: any) => void ) => { - log.debug("request received at CreateDelivery handler\n", data.request); + log.debug("request received at CreateDelivery handler\n", request); try { - const { request } = data; - const { eta, address, status, delivery_person_id } = - request as DeliveryCreateInput; + const { eta, address, status, delivery_person_id, restaurant_id, user_id } = + request; const delivery = await prisma.delivery.create({ data: { @@ -29,6 +21,8 @@ export const CreateDelivery = async ( id: delivery_person_id, }, }, + restaurant_id, + user_id, }, include: { person: true, diff --git a/services/delivery/src/handlers/delivery/delete.ts b/services/delivery/src/handlers/delivery/delete.ts new file mode 100644 index 00000000..cdeee90b --- /dev/null +++ b/services/delivery/src/handlers/delivery/delete.ts @@ -0,0 +1,20 @@ +import { prisma } from "@delivery/lib/prisma"; +import { log } from "@delivery/lib/log"; +import { Data, DeliveryId } from "@delivery/types/delivery"; + +export const DeleteDelivery = async ( + data: Data, + callback: (err: any, response: any) => void +) => { + log.debug("request received at DeleteDelivery handler\n", data.request); + try { + const { request } = data; + const { id } = request; + + const delivery = await prisma.delivery.delete({ where: { id } }); + callback(null, delivery); + } catch (error) { + log.error(error); + callback(error, null); + } +}; diff --git a/services/delivery/src/handlers/delivery/get.ts b/services/delivery/src/handlers/delivery/get.ts new file mode 100644 index 00000000..cde931dd --- /dev/null +++ b/services/delivery/src/handlers/delivery/get.ts @@ -0,0 +1,23 @@ +import { prisma } from "@delivery/lib/prisma"; +import { log } from "@delivery/lib/log"; +import { Data, DeliveryId } from "@delivery/types/delivery"; + +export const GetDelivery = async ( + data: Data, + callback: (err: any, response: any) => void +) => { + log.debug("request received at GetDelivery handler\n", data.request); + try { + const { request } = data; + const { id } = request; + + const delivery = await prisma.delivery.findFirstOrThrow({ + where: { id }, + include: { person: true }, + }); + callback(null, delivery); + } catch (error) { + log.error(error); + callback(error, null); + } +}; diff --git a/services/delivery/src/handlers/delivery/index.ts b/services/delivery/src/handlers/delivery/index.ts new file mode 100644 index 00000000..eb1b93b8 --- /dev/null +++ b/services/delivery/src/handlers/delivery/index.ts @@ -0,0 +1,15 @@ +import { CreateDelivery } from "@delivery/handlers/delivery/create"; +import { GetDelivery } from "@delivery/handlers/delivery/get"; +import { UpdateDelivery } from "@delivery/handlers/delivery/update"; +import { DeleteDelivery } from "@delivery/handlers/delivery/delete"; +import { ListDeliveriesByUser } from "@delivery/handlers/delivery/list-by-user"; +import { ListDeliveriesByRestaurant } from "@delivery/handlers/delivery/list-by-restaurant"; + +export default { + CreateDelivery, + GetDelivery, + UpdateDelivery, + DeleteDelivery, + ListDeliveriesByUser, + ListDeliveriesByRestaurant, +}; diff --git a/services/delivery/src/handlers/delivery/list-by-restaurant.ts b/services/delivery/src/handlers/delivery/list-by-restaurant.ts new file mode 100644 index 00000000..ecfa3991 --- /dev/null +++ b/services/delivery/src/handlers/delivery/list-by-restaurant.ts @@ -0,0 +1,30 @@ +import { prisma } from "@delivery/lib/prisma"; +import { log } from "@delivery/lib/log"; +import { RestaurantId, Delivery } from "@delivery/types/delivery"; +import { ServerWritableStream } from "@grpc/grpc-js"; + +export const ListDeliveriesByRestaurant = async ( + call: ServerWritableStream +) => { + log.debug( + "request received at ListDeliveriesByRestaurant handler\n", + call.request + ); + try { + const { id } = call.request; + + const deliveries = await prisma.delivery.findMany({ + where: { restaurant_id: id }, + include: { person: true }, + }); + + for (const delivery of deliveries) { + call.write(delivery); + } + call.end(); + } catch (error) { + log.error(error); + + call.end(); + } +}; diff --git a/services/delivery/src/handlers/delivery/list-by-user.ts b/services/delivery/src/handlers/delivery/list-by-user.ts new file mode 100644 index 00000000..2bdb406c --- /dev/null +++ b/services/delivery/src/handlers/delivery/list-by-user.ts @@ -0,0 +1,27 @@ +import { prisma } from "@delivery/lib/prisma"; +import { log } from "@delivery/lib/log"; +import { Delivery, UserId } from "@delivery/types/delivery"; +import { ServerWritableStream } from "@grpc/grpc-js"; + +export const ListDeliveriesByUser = async ( + call: ServerWritableStream +) => { + log.debug("request received at ListDeliveriesByUser handler\n", call.request); + try { + const { id } = call.request; + + const deliveries = await prisma.delivery.findMany({ + where: { user_id: id }, + include: { person: true }, + }); + + for (const delivery of deliveries) { + call.write(delivery); + } + call.end(); + } catch (error) { + log.error(error); + + call.end(); + } +}; diff --git a/services/delivery/src/handlers/delivery/update.ts b/services/delivery/src/handlers/delivery/update.ts new file mode 100644 index 00000000..d08d2bd2 --- /dev/null +++ b/services/delivery/src/handlers/delivery/update.ts @@ -0,0 +1,34 @@ +import { prisma } from "@delivery/lib/prisma"; +import { log } from "@delivery/lib/log"; +import { Data, Delivery } from "@delivery/types/delivery"; + +export const UpdateDelivery = async ( + data: Data, + callback: (err: any, response: any) => void +) => { + log.debug("request received at UpdateDelivery handler\n", data.request); + try { + const { eta, address, status, delivery_person_id, id } = data.request; + + const delivery = await prisma.delivery.update({ + where: { id }, + data: { + eta: new Date(eta), + address, + status, + person: { + connect: { + id: delivery_person_id, + }, + }, + }, + include: { + person: true, + }, + }); + callback(null, delivery); + } catch (error) { + log.error(error); + callback(error, null); + } +}; diff --git a/services/delivery/src/server.ts b/services/delivery/src/server.ts index 16a27d70..2eac6c38 100644 --- a/services/delivery/src/server.ts +++ b/services/delivery/src/server.ts @@ -7,7 +7,7 @@ import { log, utils } from "@delivery/lib/log"; import { options } from "@delivery/resources/protoloader-options"; import { serverInsecure } from "@delivery/resources/grpc-credentials"; -import { CreateDelivery } from "@delivery/handlers/delivery"; +import deliveryHandlers from "@delivery/handlers/delivery"; const PORT = process.env.PORT || 50008; const ADDRESS = `0.0.0.0:${PORT}`; @@ -17,16 +17,8 @@ const packageDefinition = loadSync(PROTO_PATH, options); const { delivery } = loadPackageDefinition(packageDefinition) as any; // todo: fix any const server = new Server(); -server.addService(delivery.DeliveryService.service, { - // handlers - // todo: add handlers - CreateDelivery, -}); - -server.addService(delivery.DeliveryPersonService.service, { - // handlers - // todo: add handlers -}); +server.addService(delivery.DeliveryService.service, deliveryHandlers); +server.addService(delivery.DeliveryPersonService.service, {}); server.bindAsync(ADDRESS, serverInsecure, () => { server.start(); diff --git a/services/delivery/src/types/delivery-person.d.ts b/services/delivery/src/types/delivery-person.d.ts new file mode 100644 index 00000000..a897860e --- /dev/null +++ b/services/delivery/src/types/delivery-person.d.ts @@ -0,0 +1,11 @@ +import { Delivery } from "@delivery/types/delivery"; + +export type DeliveryPerson = { + id: string; + first_name: string; + last_name: string; + phone: string; + location: [number, number]; + + deliveries: Delivery[]; +}; diff --git a/services/delivery/src/types/delivery.d.ts b/services/delivery/src/types/delivery.d.ts new file mode 100644 index 00000000..333462d6 --- /dev/null +++ b/services/delivery/src/types/delivery.d.ts @@ -0,0 +1,49 @@ +import { DeliveryPerson } from "@delivery/types/delivery-person"; +import { Status } from "@prisma/client"; + +export type Data = { + request: T; +}; + +export type Stream = { + write: (data: any) => void; + end: () => void; + request: T; +}; + +export type DeliveryCreateInput = { + eta: string; + address: string; + + status: Status; + delivery_person_id: string; + + user_id: string; + restaurant_id: string; +}; + +export type DeliveryId = { + id: string; +}; + +export type Delivery = { + id: string; + eta: string; + + address: string; + status: Status; + + person: DeliveryPerson; + delivery_person_id: string; + + user_id: string; + restaurant_id: string; +}; + +export type UserId = { + id: string; +}; + +export type RestaurantId = { + id: string; +}; diff --git a/services/delivery/types/delivery.d.ts b/services/delivery/types/delivery.d.ts deleted file mode 100644 index 52fc3159..00000000 --- a/services/delivery/types/delivery.d.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { Status } from "@prisma/client"; - -export type DeliveryCreateInput = { - eta: { - seconds: number; - nano: number; - }; - address: string; - status: Status; - delivery_person_id: string; -}; diff --git a/services/proto/delivery.proto b/services/proto/delivery.proto index b306d511..e20e1e97 100644 --- a/services/proto/delivery.proto +++ b/services/proto/delivery.proto @@ -12,6 +12,9 @@ message Delivery { DeliveryPerson person = 5; string delivery_person_id = 6; + + string user_id = 7; + string restaurant_id = 8; } message DeliveryPerson { @@ -59,6 +62,9 @@ message DeliveryCreateInput { string address = 2; Status status = 3; string delivery_person_id = 4; + + string user_id = 5; + string restaurant_id = 6; } message UserId { From 516b8e9599e2c02d0192ba15cfd00e6404b9d11f Mon Sep 17 00:00:00 2001 From: Florian LEROUX <10078837+floriaaan@users.noreply.github.com> Date: Sat, 1 Apr 2023 14:20:43 +0200 Subject: [PATCH 111/883] ref(proto): change stream to repeated --- .../src/client/delivery/list-by-restaurant.ts | 19 ++++-------------- .../src/client/delivery/list-by-user.ts | 19 ++++-------------- .../handlers/delivery/list-by-restaurant.ts | 20 ++++++++----------- .../src/handlers/delivery/list-by-user.ts | 20 ++++++++----------- services/proto/delivery.proto | 16 +++++++++++---- 5 files changed, 36 insertions(+), 58 deletions(-) diff --git a/services/delivery/src/client/delivery/list-by-restaurant.ts b/services/delivery/src/client/delivery/list-by-restaurant.ts index 0e7157a5..a3dd55d9 100644 --- a/services/delivery/src/client/delivery/list-by-restaurant.ts +++ b/services/delivery/src/client/delivery/list-by-restaurant.ts @@ -5,7 +5,6 @@ import { loadPackageDefinition } from "@grpc/grpc-js"; import { options } from "@delivery/resources/protoloader-options"; import { insecure } from "@delivery/resources/grpc-credentials"; import { log } from "@delivery/lib/log"; -import { Delivery } from "@delivery/types/delivery"; const PORT = process.env.PORT || 50008; const ADDRESS = `localhost:${PORT}`; @@ -18,21 +17,11 @@ function main() { const client = new delivery.DeliveryService(ADDRESS, insecure); const data = { - id: "restaurant_id:1", + id: "restaurant_id:1", // Change this to a valid delivery id }; - - const call = client.ListDeliveriesByRestaurant(data); - const deliveries: Delivery[] = []; - call.on("data", (delivery: Delivery) => { - log.debug(`Received delivery: ${delivery.id}`); - deliveries.push(delivery); - }); - call.on("end", () => { - console.log("All deliveries received."); - log.debug(deliveries); - }); - call.on("error", (error: Error) => { - log.debug("Error:", error.message); + client.ListDeliveriesByRestaurant(data, (err: any, response: any) => { + if (err) log.debug(err); + log.debug(response); }); } diff --git a/services/delivery/src/client/delivery/list-by-user.ts b/services/delivery/src/client/delivery/list-by-user.ts index b51c7f2b..1fbc9c48 100644 --- a/services/delivery/src/client/delivery/list-by-user.ts +++ b/services/delivery/src/client/delivery/list-by-user.ts @@ -5,7 +5,6 @@ import { loadPackageDefinition } from "@grpc/grpc-js"; import { options } from "@delivery/resources/protoloader-options"; import { insecure } from "@delivery/resources/grpc-credentials"; import { log } from "@delivery/lib/log"; -import { Delivery } from "@delivery/types/delivery"; const PORT = process.env.PORT || 50008; const ADDRESS = `localhost:${PORT}`; @@ -18,21 +17,11 @@ function main() { const client = new delivery.DeliveryService(ADDRESS, insecure); const data = { - id: "user_id:1", + id: "user_id:1", // Change this to a valid delivery id }; - - const call = client.ListDeliveriesByUser(data); - const deliveries: Delivery[] = []; - call.on("data", (delivery: Delivery) => { - log.debug(`Received delivery: ${delivery.id}`); - deliveries.push(delivery); - }); - call.on("end", () => { - console.log("All deliveries received."); - log.debug(deliveries); - }); - call.on("error", (error: Error) => { - log.debug("Error:", error.message); + client.ListDeliveriesByUser(data, (err: any, response: any) => { + if (err) log.debug(err); + log.debug(response); }); } diff --git a/services/delivery/src/handlers/delivery/list-by-restaurant.ts b/services/delivery/src/handlers/delivery/list-by-restaurant.ts index ecfa3991..879bb285 100644 --- a/services/delivery/src/handlers/delivery/list-by-restaurant.ts +++ b/services/delivery/src/handlers/delivery/list-by-restaurant.ts @@ -1,30 +1,26 @@ import { prisma } from "@delivery/lib/prisma"; import { log } from "@delivery/lib/log"; -import { RestaurantId, Delivery } from "@delivery/types/delivery"; -import { ServerWritableStream } from "@grpc/grpc-js"; +import { Data, RestaurantId } from "@delivery/types/delivery"; export const ListDeliveriesByRestaurant = async ( - call: ServerWritableStream + data: Data, + callback: (err: any, response: any) => void ) => { log.debug( "request received at ListDeliveriesByRestaurant handler\n", - call.request + data.request ); try { - const { id } = call.request; + const { request } = data; + const { id } = request; const deliveries = await prisma.delivery.findMany({ where: { restaurant_id: id }, include: { person: true }, }); - - for (const delivery of deliveries) { - call.write(delivery); - } - call.end(); + callback(null, { deliveries }); } catch (error) { log.error(error); - - call.end(); + callback(error, null); } }; diff --git a/services/delivery/src/handlers/delivery/list-by-user.ts b/services/delivery/src/handlers/delivery/list-by-user.ts index 2bdb406c..8c220175 100644 --- a/services/delivery/src/handlers/delivery/list-by-user.ts +++ b/services/delivery/src/handlers/delivery/list-by-user.ts @@ -1,27 +1,23 @@ import { prisma } from "@delivery/lib/prisma"; import { log } from "@delivery/lib/log"; -import { Delivery, UserId } from "@delivery/types/delivery"; -import { ServerWritableStream } from "@grpc/grpc-js"; +import { Data, UserId } from "@delivery/types/delivery"; export const ListDeliveriesByUser = async ( - call: ServerWritableStream + data: Data, + callback: (err: any, response: any) => void ) => { - log.debug("request received at ListDeliveriesByUser handler\n", call.request); + log.debug("request received at ListDeliveriesByUser handler\n", data.request); try { - const { id } = call.request; + const { request } = data; + const { id } = request; const deliveries = await prisma.delivery.findMany({ where: { user_id: id }, include: { person: true }, }); - - for (const delivery of deliveries) { - call.write(delivery); - } - call.end(); + callback(null, { deliveries }); } catch (error) { log.error(error); - - call.end(); + callback(error, null); } }; diff --git a/services/proto/delivery.proto b/services/proto/delivery.proto index e20e1e97..f4906434 100644 --- a/services/proto/delivery.proto +++ b/services/proto/delivery.proto @@ -39,8 +39,8 @@ service DeliveryService { rpc GetDelivery (DeliveryId) returns (Delivery) {} rpc UpdateDelivery (Delivery) returns (Delivery) {} rpc DeleteDelivery (DeliveryId) returns (google.protobuf.Empty) {} - rpc ListDeliveriesByUser (UserId) returns (stream Delivery) {} - rpc ListDeliveriesByRestaurant (RestaurantId) returns (stream Delivery) {} + rpc ListDeliveriesByUser (UserId) returns (DeliveryList) {} + rpc ListDeliveriesByRestaurant (RestaurantId) returns (DeliveryList) {} } @@ -49,8 +49,8 @@ service DeliveryPersonService { rpc GetDeliveryPerson (DeliveryPersonId) returns (DeliveryPerson) {} rpc UpdateDeliveryPerson (DeliveryPerson) returns (DeliveryPerson) {} rpc DeleteDeliveryPerson (DeliveryPersonId) returns (google.protobuf.Empty) {} - rpc ListDeliveryPersons (google.protobuf.Empty) returns (stream DeliveryPerson) {} - rpc ListNearDeliveryPersons (Location) returns (stream DeliveryPerson) {} + rpc ListDeliveryPersons (google.protobuf.Empty) returns (DeliveryPersonList) {} + rpc ListNearDeliveryPersons (Location) returns (DeliveryPersonList) {} } @@ -75,6 +75,14 @@ message RestaurantId { string id = 1; } +message DeliveryList { + repeated Delivery deliveries = 1; +} + +message DeliveryPersonList { + repeated DeliveryPersonList persons = 1; +} + message DeliveryPersonId { string id = 1; } From 238979e5db2e0a170ae6babb46430ab0f6b56385 Mon Sep 17 00:00:00 2001 From: Florian LEROUX <10078837+floriaaan@users.noreply.github.com> Date: Tue, 4 Apr 2023 10:07:20 +0200 Subject: [PATCH 112/883] ci: add test/coverage scripts and update README --- .github/workflows/delivery.yml | 68 + .github/workflows/{tests.yml => global.yml} | 15 +- README.md | 1 + services/delivery/README.md | 2 +- services/delivery/coverage/base.css | 224 ++ .../delivery/coverage/block-navigation.js | 87 + services/delivery/coverage/clover.xml | 6 + .../delivery/coverage/coverage-final.json | 1 + services/delivery/coverage/favicon.png | Bin 0 -> 445 bytes services/delivery/coverage/index.html | 101 + services/delivery/coverage/prettify.css | 1 + services/delivery/coverage/prettify.js | 2 + .../delivery/coverage/sort-arrow-sprite.png | Bin 0 -> 138 bytes services/delivery/coverage/sorter.js | 196 ++ services/delivery/package.json | 31 +- services/delivery/pnpm-lock.yaml | 1852 +++++++++++++++-- services/delivery/proto | 1 + services/delivery/src/tests/test.test.ts | 6 + services/delivery/vitest.config.ts | 7 + 19 files changed, 2451 insertions(+), 150 deletions(-) create mode 100644 .github/workflows/delivery.yml rename .github/workflows/{tests.yml => global.yml} (75%) create mode 100644 services/delivery/coverage/base.css create mode 100644 services/delivery/coverage/block-navigation.js create mode 100644 services/delivery/coverage/clover.xml create mode 100644 services/delivery/coverage/coverage-final.json create mode 100644 services/delivery/coverage/favicon.png create mode 100644 services/delivery/coverage/index.html create mode 100644 services/delivery/coverage/prettify.css create mode 100644 services/delivery/coverage/prettify.js create mode 100644 services/delivery/coverage/sort-arrow-sprite.png create mode 100644 services/delivery/coverage/sorter.js create mode 120000 services/delivery/proto create mode 100644 services/delivery/src/tests/test.test.ts create mode 100644 services/delivery/vitest.config.ts diff --git a/.github/workflows/delivery.yml b/.github/workflows/delivery.yml new file mode 100644 index 00000000..a0953866 --- /dev/null +++ b/.github/workflows/delivery.yml @@ -0,0 +1,68 @@ +name: Delivery Microservice CI/CD + +on: + push: + branches: [delivery] + pull_request: + branches: [dev, main] + +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@master + - uses: pnpm/action-setup@v2 + with: + version: 7 + - uses: actions/setup-node@v3 + with: + node-version: "18.x" + cache: "pnpm" + - name: Install dependencies + run: | + cd ./services/delivery + pnpm install --frozen-lockfile + - name: Build + run: | + cd ./services/delivery + pnpm build + + test: + runs-on: ubuntu-latest + needs: build + steps: + - uses: actions/checkout@master + - uses: pnpm/action-setup@v2 + with: + version: 7 + - uses: actions/setup-node@v3 + with: + node-version: "18.x" + cache: "pnpm" + - name: Install dependencies + run: | + cd ./services/delivery + pnpm install --frozen-lockfile + - name: Execute tests + run: | + cd ./services/delivery + pnpm test + + publish: + runs-on: ubuntu-latest + needs: [build, test] + if: ${{ success() }} && ${{ github.ref == 'refs/heads/dev' || github.ref == 'refs/heads/main' }} + steps: + - name: Checkout code + uses: actions/checkout@v2 + - name: Login to Docker Hub + uses: docker/login-action@v1 + with: + username: ${{ secrets.DOCKER_USERNAME }} + password: ${{ secrets.DOCKER_PASSWORD }} + - name: Build and push Docker image + uses: docker/build-push-action@v2 + with: + context: ./services/delivery + push: true + tags: floriaaan/goodfood-delivery:latest diff --git a/.github/workflows/tests.yml b/.github/workflows/global.yml similarity index 75% rename from .github/workflows/tests.yml rename to .github/workflows/global.yml index c83c0a05..5d458b6b 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/global.yml @@ -1,13 +1,18 @@ # This workflow will do a clean installation of node dependencies, cache/restore them, build the source code and run tests across different versions of node # For more information see: https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions -name: "Tests" +name: "Tests all microservices" on: - - push - - pull_request - - workflow_dispatch - + push: + branches: + - main + - dev + pull_request: + branches: + - main + - dev + workflow_dispatch: jobs: tests: diff --git a/README.md b/README.md index 4bf6e30e..7b51feee 100644 --- a/README.md +++ b/README.md @@ -46,6 +46,7 @@ The file hierarchy for this project is as follows: ├── gateway/ │ ├── k8s/ │ │ └── (...) # k8s files + │ ├── proto/ (symbolic link to /services/proto/) │ └── terraform/ │ └── (...) # terraform files ├── user/ diff --git a/services/delivery/README.md b/services/delivery/README.md index 7f125245..69965be6 100644 --- a/services/delivery/README.md +++ b/services/delivery/README.md @@ -5,7 +5,7 @@ | **Port:** 50008 | | **Developer:** @floriaaan | | **Status:** In progress | -| **Last update:** 2023-03-31 | +| **Last update:** 2023-04-04 | | **Language:** NodeJS | | **Dependencies:** TypeScript, Prisma, gRPC, Postgres | | **Models:** (see [`prisma/schema.prisma`](./prisma/schema.prisma)) | diff --git a/services/delivery/coverage/base.css b/services/delivery/coverage/base.css new file mode 100644 index 00000000..f418035b --- /dev/null +++ b/services/delivery/coverage/base.css @@ -0,0 +1,224 @@ +body, html { + margin:0; padding: 0; + height: 100%; +} +body { + font-family: Helvetica Neue, Helvetica, Arial; + font-size: 14px; + color:#333; +} +.small { font-size: 12px; } +*, *:after, *:before { + -webkit-box-sizing:border-box; + -moz-box-sizing:border-box; + box-sizing:border-box; + } +h1 { font-size: 20px; margin: 0;} +h2 { font-size: 14px; } +pre { + font: 12px/1.4 Consolas, "Liberation Mono", Menlo, Courier, monospace; + margin: 0; + padding: 0; + -moz-tab-size: 2; + -o-tab-size: 2; + tab-size: 2; +} +a { color:#0074D9; text-decoration:none; } +a:hover { text-decoration:underline; } +.strong { font-weight: bold; } +.space-top1 { padding: 10px 0 0 0; } +.pad2y { padding: 20px 0; } +.pad1y { padding: 10px 0; } +.pad2x { padding: 0 20px; } +.pad2 { padding: 20px; } +.pad1 { padding: 10px; } +.space-left2 { padding-left:55px; } +.space-right2 { padding-right:20px; } +.center { text-align:center; } +.clearfix { display:block; } +.clearfix:after { + content:''; + display:block; + height:0; + clear:both; + visibility:hidden; + } +.fl { float: left; } +@media only screen and (max-width:640px) { + .col3 { width:100%; max-width:100%; } + .hide-mobile { display:none!important; } +} + +.quiet { + color: #7f7f7f; + color: rgba(0,0,0,0.5); +} +.quiet a { opacity: 0.7; } + +.fraction { + font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; + font-size: 10px; + color: #555; + background: #E8E8E8; + padding: 4px 5px; + border-radius: 3px; + vertical-align: middle; +} + +div.path a:link, div.path a:visited { color: #333; } +table.coverage { + border-collapse: collapse; + margin: 10px 0 0 0; + padding: 0; +} + +table.coverage td { + margin: 0; + padding: 0; + vertical-align: top; +} +table.coverage td.line-count { + text-align: right; + padding: 0 5px 0 20px; +} +table.coverage td.line-coverage { + text-align: right; + padding-right: 10px; + min-width:20px; +} + +table.coverage td span.cline-any { + display: inline-block; + padding: 0 5px; + width: 100%; +} +.missing-if-branch { + display: inline-block; + margin-right: 5px; + border-radius: 3px; + position: relative; + padding: 0 4px; + background: #333; + color: yellow; +} + +.skip-if-branch { + display: none; + margin-right: 10px; + position: relative; + padding: 0 4px; + background: #ccc; + color: white; +} +.missing-if-branch .typ, .skip-if-branch .typ { + color: inherit !important; +} +.coverage-summary { + border-collapse: collapse; + width: 100%; +} +.coverage-summary tr { border-bottom: 1px solid #bbb; } +.keyline-all { border: 1px solid #ddd; } +.coverage-summary td, .coverage-summary th { padding: 10px; } +.coverage-summary tbody { border: 1px solid #bbb; } +.coverage-summary td { border-right: 1px solid #bbb; } +.coverage-summary td:last-child { border-right: none; } +.coverage-summary th { + text-align: left; + font-weight: normal; + white-space: nowrap; +} +.coverage-summary th.file { border-right: none !important; } +.coverage-summary th.pct { } +.coverage-summary th.pic, +.coverage-summary th.abs, +.coverage-summary td.pct, +.coverage-summary td.abs { text-align: right; } +.coverage-summary td.file { white-space: nowrap; } +.coverage-summary td.pic { min-width: 120px !important; } +.coverage-summary tfoot td { } + +.coverage-summary .sorter { + height: 10px; + width: 7px; + display: inline-block; + margin-left: 0.5em; + background: url(sort-arrow-sprite.png) no-repeat scroll 0 0 transparent; +} +.coverage-summary .sorted .sorter { + background-position: 0 -20px; +} +.coverage-summary .sorted-desc .sorter { + background-position: 0 -10px; +} +.status-line { height: 10px; } +/* yellow */ +.cbranch-no { background: yellow !important; color: #111; } +/* dark red */ +.red.solid, .status-line.low, .low .cover-fill { background:#C21F39 } +.low .chart { border:1px solid #C21F39 } +.highlighted, +.highlighted .cstat-no, .highlighted .fstat-no, .highlighted .cbranch-no{ + background: #C21F39 !important; +} +/* medium red */ +.cstat-no, .fstat-no, .cbranch-no, .cbranch-no { background:#F6C6CE } +/* light red */ +.low, .cline-no { background:#FCE1E5 } +/* light green */ +.high, .cline-yes { background:rgb(230,245,208) } +/* medium green */ +.cstat-yes { background:rgb(161,215,106) } +/* dark green */ +.status-line.high, .high .cover-fill { background:rgb(77,146,33) } +.high .chart { border:1px solid rgb(77,146,33) } +/* dark yellow (gold) */ +.status-line.medium, .medium .cover-fill { background: #f9cd0b; } +.medium .chart { border:1px solid #f9cd0b; } +/* light yellow */ +.medium { background: #fff4c2; } + +.cstat-skip { background: #ddd; color: #111; } +.fstat-skip { background: #ddd; color: #111 !important; } +.cbranch-skip { background: #ddd !important; color: #111; } + +span.cline-neutral { background: #eaeaea; } + +.coverage-summary td.empty { + opacity: .5; + padding-top: 4px; + padding-bottom: 4px; + line-height: 1; + color: #888; +} + +.cover-fill, .cover-empty { + display:inline-block; + height: 12px; +} +.chart { + line-height: 0; +} +.cover-empty { + background: white; +} +.cover-full { + border-right: none !important; +} +pre.prettyprint { + border: none !important; + padding: 0 !important; + margin: 0 !important; +} +.com { color: #999 !important; } +.ignore-none { color: #999; font-weight: normal; } + +.wrapper { + min-height: 100%; + height: auto !important; + height: 100%; + margin: 0 auto -48px; +} +.footer, .push { + height: 48px; +} diff --git a/services/delivery/coverage/block-navigation.js b/services/delivery/coverage/block-navigation.js new file mode 100644 index 00000000..cc121302 --- /dev/null +++ b/services/delivery/coverage/block-navigation.js @@ -0,0 +1,87 @@ +/* eslint-disable */ +var jumpToCode = (function init() { + // Classes of code we would like to highlight in the file view + var missingCoverageClasses = ['.cbranch-no', '.cstat-no', '.fstat-no']; + + // Elements to highlight in the file listing view + var fileListingElements = ['td.pct.low']; + + // We don't want to select elements that are direct descendants of another match + var notSelector = ':not(' + missingCoverageClasses.join('):not(') + ') > '; // becomes `:not(a):not(b) > ` + + // Selecter that finds elements on the page to which we can jump + var selector = + fileListingElements.join(', ') + + ', ' + + notSelector + + missingCoverageClasses.join(', ' + notSelector); // becomes `:not(a):not(b) > a, :not(a):not(b) > b` + + // The NodeList of matching elements + var missingCoverageElements = document.querySelectorAll(selector); + + var currentIndex; + + function toggleClass(index) { + missingCoverageElements + .item(currentIndex) + .classList.remove('highlighted'); + missingCoverageElements.item(index).classList.add('highlighted'); + } + + function makeCurrent(index) { + toggleClass(index); + currentIndex = index; + missingCoverageElements.item(index).scrollIntoView({ + behavior: 'smooth', + block: 'center', + inline: 'center' + }); + } + + function goToPrevious() { + var nextIndex = 0; + if (typeof currentIndex !== 'number' || currentIndex === 0) { + nextIndex = missingCoverageElements.length - 1; + } else if (missingCoverageElements.length > 1) { + nextIndex = currentIndex - 1; + } + + makeCurrent(nextIndex); + } + + function goToNext() { + var nextIndex = 0; + + if ( + typeof currentIndex === 'number' && + currentIndex < missingCoverageElements.length - 1 + ) { + nextIndex = currentIndex + 1; + } + + makeCurrent(nextIndex); + } + + return function jump(event) { + if ( + document.getElementById('fileSearch') === document.activeElement && + document.activeElement != null + ) { + // if we're currently focused on the search input, we don't want to navigate + return; + } + + switch (event.which) { + case 78: // n + case 74: // j + goToNext(); + break; + case 66: // b + case 75: // k + case 80: // p + goToPrevious(); + break; + } + }; +})(); +window.addEventListener('keydown', jumpToCode); diff --git a/services/delivery/coverage/clover.xml b/services/delivery/coverage/clover.xml new file mode 100644 index 00000000..c1774655 --- /dev/null +++ b/services/delivery/coverage/clover.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/services/delivery/coverage/coverage-final.json b/services/delivery/coverage/coverage-final.json new file mode 100644 index 00000000..0967ef42 --- /dev/null +++ b/services/delivery/coverage/coverage-final.json @@ -0,0 +1 @@ +{} diff --git a/services/delivery/coverage/favicon.png b/services/delivery/coverage/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..c1525b811a167671e9de1fa78aab9f5c0b61cef7 GIT binary patch literal 445 zcmV;u0Yd(XP))rP{nL}Ln%S7`m{0DjX9TLF* zFCb$4Oi7vyLOydb!7n&^ItCzb-%BoB`=x@N2jll2Nj`kauio%aw_@fe&*}LqlFT43 z8doAAe))z_%=P%v^@JHp3Hjhj^6*Kr_h|g_Gr?ZAa&y>wxHE99Gk>A)2MplWz2xdG zy8VD2J|Uf#EAw*bo5O*PO_}X2Tob{%bUoO2G~T`@%S6qPyc}VkhV}UifBuRk>%5v( z)x7B{I~z*k<7dv#5tC+m{km(D087J4O%+<<;K|qwefb6@GSX45wCK}Sn*> + + + + Code coverage report for All files + + + + + + + + + +
+
+

All files

+
+ +
+ Unknown% + Statements + 0/0 +
+ + +
+ Unknown% + Branches + 0/0 +
+ + +
+ Unknown% + Functions + 0/0 +
+ + +
+ Unknown% + Lines + 0/0 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/services/delivery/coverage/prettify.css b/services/delivery/coverage/prettify.css new file mode 100644 index 00000000..b317a7cd --- /dev/null +++ b/services/delivery/coverage/prettify.css @@ -0,0 +1 @@ +.pln{color:#000}@media screen{.str{color:#080}.kwd{color:#008}.com{color:#800}.typ{color:#606}.lit{color:#066}.pun,.opn,.clo{color:#660}.tag{color:#008}.atn{color:#606}.atv{color:#080}.dec,.var{color:#606}.fun{color:red}}@media print,projection{.str{color:#060}.kwd{color:#006;font-weight:bold}.com{color:#600;font-style:italic}.typ{color:#404;font-weight:bold}.lit{color:#044}.pun,.opn,.clo{color:#440}.tag{color:#006;font-weight:bold}.atn{color:#404}.atv{color:#060}}pre.prettyprint{padding:2px;border:1px solid #888}ol.linenums{margin-top:0;margin-bottom:0}li.L0,li.L1,li.L2,li.L3,li.L5,li.L6,li.L7,li.L8{list-style-type:none}li.L1,li.L3,li.L5,li.L7,li.L9{background:#eee} diff --git a/services/delivery/coverage/prettify.js b/services/delivery/coverage/prettify.js new file mode 100644 index 00000000..b3225238 --- /dev/null +++ b/services/delivery/coverage/prettify.js @@ -0,0 +1,2 @@ +/* eslint-disable */ +window.PR_SHOULD_USE_CONTINUATION=true;(function(){var h=["break,continue,do,else,for,if,return,while"];var u=[h,"auto,case,char,const,default,double,enum,extern,float,goto,int,long,register,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile"];var p=[u,"catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof"];var l=[p,"alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,dynamic_cast,explicit,export,friend,inline,late_check,mutable,namespace,nullptr,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where"];var x=[p,"abstract,boolean,byte,extends,final,finally,implements,import,instanceof,null,native,package,strictfp,super,synchronized,throws,transient"];var R=[x,"as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,interface,internal,into,is,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var"];var r="all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,true,try,unless,until,when,while,yes";var w=[p,"debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN"];var s="caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END";var I=[h,"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None"];var f=[h,"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END"];var H=[h,"case,done,elif,esac,eval,fi,function,in,local,set,then,until"];var A=[l,R,w,s+I,f,H];var e=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\d*)/;var C="str";var z="kwd";var j="com";var O="typ";var G="lit";var L="pun";var F="pln";var m="tag";var E="dec";var J="src";var P="atn";var n="atv";var N="nocode";var M="(?:^^\\.?|[+-]|\\!|\\!=|\\!==|\\#|\\%|\\%=|&|&&|&&=|&=|\\(|\\*|\\*=|\\+=|\\,|\\-=|\\->|\\/|\\/=|:|::|\\;|<|<<|<<=|<=|=|==|===|>|>=|>>|>>=|>>>|>>>=|\\?|\\@|\\[|\\^|\\^=|\\^\\^|\\^\\^=|\\{|\\||\\|=|\\|\\||\\|\\|=|\\~|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\\s*";function k(Z){var ad=0;var S=false;var ac=false;for(var V=0,U=Z.length;V122)){if(!(al<65||ag>90)){af.push([Math.max(65,ag)|32,Math.min(al,90)|32])}if(!(al<97||ag>122)){af.push([Math.max(97,ag)&~32,Math.min(al,122)&~32])}}}}af.sort(function(av,au){return(av[0]-au[0])||(au[1]-av[1])});var ai=[];var ap=[NaN,NaN];for(var ar=0;arat[0]){if(at[1]+1>at[0]){an.push("-")}an.push(T(at[1]))}}an.push("]");return an.join("")}function W(al){var aj=al.source.match(new RegExp("(?:\\[(?:[^\\x5C\\x5D]|\\\\[\\s\\S])*\\]|\\\\u[A-Fa-f0-9]{4}|\\\\x[A-Fa-f0-9]{2}|\\\\[0-9]+|\\\\[^ux0-9]|\\(\\?[:!=]|[\\(\\)\\^]|[^\\x5B\\x5C\\(\\)\\^]+)","g"));var ah=aj.length;var an=[];for(var ak=0,am=0;ak=2&&ai==="["){aj[ak]=X(ag)}else{if(ai!=="\\"){aj[ak]=ag.replace(/[a-zA-Z]/g,function(ao){var ap=ao.charCodeAt(0);return"["+String.fromCharCode(ap&~32,ap|32)+"]"})}}}}return aj.join("")}var aa=[];for(var V=0,U=Z.length;V=0;){S[ac.charAt(ae)]=Y}}var af=Y[1];var aa=""+af;if(!ag.hasOwnProperty(aa)){ah.push(af);ag[aa]=null}}ah.push(/[\0-\uffff]/);V=k(ah)})();var X=T.length;var W=function(ah){var Z=ah.sourceCode,Y=ah.basePos;var ad=[Y,F];var af=0;var an=Z.match(V)||[];var aj={};for(var ae=0,aq=an.length;ae=5&&"lang-"===ap.substring(0,5);if(am&&!(ai&&typeof ai[1]==="string")){am=false;ap=J}if(!am){aj[ag]=ap}}var ab=af;af+=ag.length;if(!am){ad.push(Y+ab,ap)}else{var al=ai[1];var ak=ag.indexOf(al);var ac=ak+al.length;if(ai[2]){ac=ag.length-ai[2].length;ak=ac-al.length}var ar=ap.substring(5);B(Y+ab,ag.substring(0,ak),W,ad);B(Y+ab+ak,al,q(ar,al),ad);B(Y+ab+ac,ag.substring(ac),W,ad)}}ah.decorations=ad};return W}function i(T){var W=[],S=[];if(T.tripleQuotedStrings){W.push([C,/^(?:\'\'\'(?:[^\'\\]|\\[\s\S]|\'{1,2}(?=[^\']))*(?:\'\'\'|$)|\"\"\"(?:[^\"\\]|\\[\s\S]|\"{1,2}(?=[^\"]))*(?:\"\"\"|$)|\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$))/,null,"'\""])}else{if(T.multiLineStrings){W.push([C,/^(?:\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$)|\`(?:[^\\\`]|\\[\s\S])*(?:\`|$))/,null,"'\"`"])}else{W.push([C,/^(?:\'(?:[^\\\'\r\n]|\\.)*(?:\'|$)|\"(?:[^\\\"\r\n]|\\.)*(?:\"|$))/,null,"\"'"])}}if(T.verbatimStrings){S.push([C,/^@\"(?:[^\"]|\"\")*(?:\"|$)/,null])}var Y=T.hashComments;if(Y){if(T.cStyleComments){if(Y>1){W.push([j,/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,null,"#"])}else{W.push([j,/^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\b|[^\r\n]*)/,null,"#"])}S.push([C,/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h|[a-z]\w*)>/,null])}else{W.push([j,/^#[^\r\n]*/,null,"#"])}}if(T.cStyleComments){S.push([j,/^\/\/[^\r\n]*/,null]);S.push([j,/^\/\*[\s\S]*?(?:\*\/|$)/,null])}if(T.regexLiterals){var X=("/(?=[^/*])(?:[^/\\x5B\\x5C]|\\x5C[\\s\\S]|\\x5B(?:[^\\x5C\\x5D]|\\x5C[\\s\\S])*(?:\\x5D|$))+/");S.push(["lang-regex",new RegExp("^"+M+"("+X+")")])}var V=T.types;if(V){S.push([O,V])}var U=(""+T.keywords).replace(/^ | $/g,"");if(U.length){S.push([z,new RegExp("^(?:"+U.replace(/[\s,]+/g,"|")+")\\b"),null])}W.push([F,/^\s+/,null," \r\n\t\xA0"]);S.push([G,/^@[a-z_$][a-z_$@0-9]*/i,null],[O,/^(?:[@_]?[A-Z]+[a-z][A-Za-z_$@0-9]*|\w+_t\b)/,null],[F,/^[a-z_$][a-z_$@0-9]*/i,null],[G,new RegExp("^(?:0x[a-f0-9]+|(?:\\d(?:_\\d+)*\\d*(?:\\.\\d*)?|\\.\\d\\+)(?:e[+\\-]?\\d+)?)[a-z]*","i"),null,"0123456789"],[F,/^\\[\s\S]?/,null],[L,/^.[^\s\w\.$@\'\"\`\/\#\\]*/,null]);return g(W,S)}var K=i({keywords:A,hashComments:true,cStyleComments:true,multiLineStrings:true,regexLiterals:true});function Q(V,ag){var U=/(?:^|\s)nocode(?:\s|$)/;var ab=/\r\n?|\n/;var ac=V.ownerDocument;var S;if(V.currentStyle){S=V.currentStyle.whiteSpace}else{if(window.getComputedStyle){S=ac.defaultView.getComputedStyle(V,null).getPropertyValue("white-space")}}var Z=S&&"pre"===S.substring(0,3);var af=ac.createElement("LI");while(V.firstChild){af.appendChild(V.firstChild)}var W=[af];function ae(al){switch(al.nodeType){case 1:if(U.test(al.className)){break}if("BR"===al.nodeName){ad(al);if(al.parentNode){al.parentNode.removeChild(al)}}else{for(var an=al.firstChild;an;an=an.nextSibling){ae(an)}}break;case 3:case 4:if(Z){var am=al.nodeValue;var aj=am.match(ab);if(aj){var ai=am.substring(0,aj.index);al.nodeValue=ai;var ah=am.substring(aj.index+aj[0].length);if(ah){var ak=al.parentNode;ak.insertBefore(ac.createTextNode(ah),al.nextSibling)}ad(al);if(!ai){al.parentNode.removeChild(al)}}}break}}function ad(ak){while(!ak.nextSibling){ak=ak.parentNode;if(!ak){return}}function ai(al,ar){var aq=ar?al.cloneNode(false):al;var ao=al.parentNode;if(ao){var ap=ai(ao,1);var an=al.nextSibling;ap.appendChild(aq);for(var am=an;am;am=an){an=am.nextSibling;ap.appendChild(am)}}return aq}var ah=ai(ak.nextSibling,0);for(var aj;(aj=ah.parentNode)&&aj.nodeType===1;){ah=aj}W.push(ah)}for(var Y=0;Y=S){ah+=2}if(V>=ap){Z+=2}}}var t={};function c(U,V){for(var S=V.length;--S>=0;){var T=V[S];if(!t.hasOwnProperty(T)){t[T]=U}else{if(window.console){console.warn("cannot override language handler %s",T)}}}}function q(T,S){if(!(T&&t.hasOwnProperty(T))){T=/^\s*]*(?:>|$)/],[j,/^<\!--[\s\S]*?(?:-\->|$)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],[L,/^(?:<[%?]|[%?]>)/],["lang-",/^]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-js",/^]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^]*>([\s\S]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i]]),["default-markup","htm","html","mxml","xhtml","xml","xsl"]);c(g([[F,/^[\s]+/,null," \t\r\n"],[n,/^(?:\"[^\"]*\"?|\'[^\']*\'?)/,null,"\"'"]],[[m,/^^<\/?[a-z](?:[\w.:-]*\w)?|\/?>$/i],[P,/^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],["lang-uq.val",/^=\s*([^>\'\"\s]*(?:[^>\'\"\s\/]|\/(?=\s)))/],[L,/^[=<>\/]+/],["lang-js",/^on\w+\s*=\s*\"([^\"]+)\"/i],["lang-js",/^on\w+\s*=\s*\'([^\']+)\'/i],["lang-js",/^on\w+\s*=\s*([^\"\'>\s]+)/i],["lang-css",/^style\s*=\s*\"([^\"]+)\"/i],["lang-css",/^style\s*=\s*\'([^\']+)\'/i],["lang-css",/^style\s*=\s*([^\"\'>\s]+)/i]]),["in.tag"]);c(g([],[[n,/^[\s\S]+/]]),["uq.val"]);c(i({keywords:l,hashComments:true,cStyleComments:true,types:e}),["c","cc","cpp","cxx","cyc","m"]);c(i({keywords:"null,true,false"}),["json"]);c(i({keywords:R,hashComments:true,cStyleComments:true,verbatimStrings:true,types:e}),["cs"]);c(i({keywords:x,cStyleComments:true}),["java"]);c(i({keywords:H,hashComments:true,multiLineStrings:true}),["bsh","csh","sh"]);c(i({keywords:I,hashComments:true,multiLineStrings:true,tripleQuotedStrings:true}),["cv","py"]);c(i({keywords:s,hashComments:true,multiLineStrings:true,regexLiterals:true}),["perl","pl","pm"]);c(i({keywords:f,hashComments:true,multiLineStrings:true,regexLiterals:true}),["rb"]);c(i({keywords:w,cStyleComments:true,regexLiterals:true}),["js"]);c(i({keywords:r,hashComments:3,cStyleComments:true,multilineStrings:true,tripleQuotedStrings:true,regexLiterals:true}),["coffee"]);c(g([],[[C,/^[\s\S]+/]]),["regex"]);function d(V){var U=V.langExtension;try{var S=a(V.sourceNode);var T=S.sourceCode;V.sourceCode=T;V.spans=S.spans;V.basePos=0;q(U,T)(V);D(V)}catch(W){if("console" in window){console.log(W&&W.stack?W.stack:W)}}}function y(W,V,U){var S=document.createElement("PRE");S.innerHTML=W;if(U){Q(S,U)}var T={langExtension:V,numberLines:U,sourceNode:S};d(T);return S.innerHTML}function b(ad){function Y(af){return document.getElementsByTagName(af)}var ac=[Y("pre"),Y("code"),Y("xmp")];var T=[];for(var aa=0;aa=0){var ah=ai.match(ab);var am;if(!ah&&(am=o(aj))&&"CODE"===am.tagName){ah=am.className.match(ab)}if(ah){ah=ah[1]}var al=false;for(var ak=aj.parentNode;ak;ak=ak.parentNode){if((ak.tagName==="pre"||ak.tagName==="code"||ak.tagName==="xmp")&&ak.className&&ak.className.indexOf("prettyprint")>=0){al=true;break}}if(!al){var af=aj.className.match(/\blinenums\b(?::(\d+))?/);af=af?af[1]&&af[1].length?+af[1]:true:false;if(af){Q(aj,af)}S={langExtension:ah,sourceNode:aj,numberLines:af};d(S)}}}if(X]*(?:>|$)/],[PR.PR_COMMENT,/^<\!--[\s\S]*?(?:-\->|$)/],[PR.PR_PUNCTUATION,/^(?:<[%?]|[%?]>)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],["lang-",/^]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-handlebars",/^]*type\s*=\s*['"]?text\/x-handlebars-template['"]?\b[^>]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-js",/^]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^]*>([\s\S]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i],[PR.PR_DECLARATION,/^{{[#^>/]?\s*[\w.][^}]*}}/],[PR.PR_DECLARATION,/^{{&?\s*[\w.][^}]*}}/],[PR.PR_DECLARATION,/^{{{>?\s*[\w.][^}]*}}}/],[PR.PR_COMMENT,/^{{![^}]*}}/]]),["handlebars","hbs"]);PR.registerLangHandler(PR.createSimpleLexer([[PR.PR_PLAIN,/^[ \t\r\n\f]+/,null," \t\r\n\f"]],[[PR.PR_STRING,/^\"(?:[^\n\r\f\\\"]|\\(?:\r\n?|\n|\f)|\\[\s\S])*\"/,null],[PR.PR_STRING,/^\'(?:[^\n\r\f\\\']|\\(?:\r\n?|\n|\f)|\\[\s\S])*\'/,null],["lang-css-str",/^url\(([^\)\"\']*)\)/i],[PR.PR_KEYWORD,/^(?:url|rgb|\!important|@import|@page|@media|@charset|inherit)(?=[^\-\w]|$)/i,null],["lang-css-kw",/^(-?(?:[_a-z]|(?:\\[0-9a-f]+ ?))(?:[_a-z0-9\-]|\\(?:\\[0-9a-f]+ ?))*)\s*:/i],[PR.PR_COMMENT,/^\/\*[^*]*\*+(?:[^\/*][^*]*\*+)*\//],[PR.PR_COMMENT,/^(?:)/],[PR.PR_LITERAL,/^(?:\d+|\d*\.\d+)(?:%|[a-z]+)?/i],[PR.PR_LITERAL,/^#(?:[0-9a-f]{3}){1,2}/i],[PR.PR_PLAIN,/^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i],[PR.PR_PUNCTUATION,/^[^\s\w\'\"]+/]]),["css"]);PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_KEYWORD,/^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i]]),["css-kw"]);PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_STRING,/^[^\)\"\']+/]]),["css-str"]); diff --git a/services/delivery/coverage/sort-arrow-sprite.png b/services/delivery/coverage/sort-arrow-sprite.png new file mode 100644 index 0000000000000000000000000000000000000000..6ed68316eb3f65dec9063332d2f69bf3093bbfab GIT binary patch literal 138 zcmeAS@N?(olHy`uVBq!ia0vp^>_9Bd!3HEZxJ@+%Qh}Z>jv*C{$p!i!8j}?a+@3A= zIAGwzjijN=FBi!|L1t?LM;Q;gkwn>2cAy-KV{dn nf0J1DIvEHQu*n~6U}x}qyky7vi4|9XhBJ7&`njxgN@xNA8m%nc literal 0 HcmV?d00001 diff --git a/services/delivery/coverage/sorter.js b/services/delivery/coverage/sorter.js new file mode 100644 index 00000000..2bb296a8 --- /dev/null +++ b/services/delivery/coverage/sorter.js @@ -0,0 +1,196 @@ +/* eslint-disable */ +var addSorting = (function() { + 'use strict'; + var cols, + currentSort = { + index: 0, + desc: false + }; + + // returns the summary table element + function getTable() { + return document.querySelector('.coverage-summary'); + } + // returns the thead element of the summary table + function getTableHeader() { + return getTable().querySelector('thead tr'); + } + // returns the tbody element of the summary table + function getTableBody() { + return getTable().querySelector('tbody'); + } + // returns the th element for nth column + function getNthColumn(n) { + return getTableHeader().querySelectorAll('th')[n]; + } + + function onFilterInput() { + const searchValue = document.getElementById('fileSearch').value; + const rows = document.getElementsByTagName('tbody')[0].children; + for (let i = 0; i < rows.length; i++) { + const row = rows[i]; + if ( + row.textContent + .toLowerCase() + .includes(searchValue.toLowerCase()) + ) { + row.style.display = ''; + } else { + row.style.display = 'none'; + } + } + } + + // loads the search box + function addSearchBox() { + var template = document.getElementById('filterTemplate'); + var templateClone = template.content.cloneNode(true); + templateClone.getElementById('fileSearch').oninput = onFilterInput; + template.parentElement.appendChild(templateClone); + } + + // loads all columns + function loadColumns() { + var colNodes = getTableHeader().querySelectorAll('th'), + colNode, + cols = [], + col, + i; + + for (i = 0; i < colNodes.length; i += 1) { + colNode = colNodes[i]; + col = { + key: colNode.getAttribute('data-col'), + sortable: !colNode.getAttribute('data-nosort'), + type: colNode.getAttribute('data-type') || 'string' + }; + cols.push(col); + if (col.sortable) { + col.defaultDescSort = col.type === 'number'; + colNode.innerHTML = + colNode.innerHTML + ''; + } + } + return cols; + } + // attaches a data attribute to every tr element with an object + // of data values keyed by column name + function loadRowData(tableRow) { + var tableCols = tableRow.querySelectorAll('td'), + colNode, + col, + data = {}, + i, + val; + for (i = 0; i < tableCols.length; i += 1) { + colNode = tableCols[i]; + col = cols[i]; + val = colNode.getAttribute('data-value'); + if (col.type === 'number') { + val = Number(val); + } + data[col.key] = val; + } + return data; + } + // loads all row data + function loadData() { + var rows = getTableBody().querySelectorAll('tr'), + i; + + for (i = 0; i < rows.length; i += 1) { + rows[i].data = loadRowData(rows[i]); + } + } + // sorts the table using the data for the ith column + function sortByIndex(index, desc) { + var key = cols[index].key, + sorter = function(a, b) { + a = a.data[key]; + b = b.data[key]; + return a < b ? -1 : a > b ? 1 : 0; + }, + finalSorter = sorter, + tableBody = document.querySelector('.coverage-summary tbody'), + rowNodes = tableBody.querySelectorAll('tr'), + rows = [], + i; + + if (desc) { + finalSorter = function(a, b) { + return -1 * sorter(a, b); + }; + } + + for (i = 0; i < rowNodes.length; i += 1) { + rows.push(rowNodes[i]); + tableBody.removeChild(rowNodes[i]); + } + + rows.sort(finalSorter); + + for (i = 0; i < rows.length; i += 1) { + tableBody.appendChild(rows[i]); + } + } + // removes sort indicators for current column being sorted + function removeSortIndicators() { + var col = getNthColumn(currentSort.index), + cls = col.className; + + cls = cls.replace(/ sorted$/, '').replace(/ sorted-desc$/, ''); + col.className = cls; + } + // adds sort indicators for current column being sorted + function addSortIndicators() { + getNthColumn(currentSort.index).className += currentSort.desc + ? ' sorted-desc' + : ' sorted'; + } + // adds event listeners for all sorter widgets + function enableUI() { + var i, + el, + ithSorter = function ithSorter(i) { + var col = cols[i]; + + return function() { + var desc = col.defaultDescSort; + + if (currentSort.index === i) { + desc = !currentSort.desc; + } + sortByIndex(i, desc); + removeSortIndicators(); + currentSort.index = i; + currentSort.desc = desc; + addSortIndicators(); + }; + }; + for (i = 0; i < cols.length; i += 1) { + if (cols[i].sortable) { + // add the click event handler on the th so users + // dont have to click on those tiny arrows + el = getNthColumn(i).querySelector('.sorter').parentElement; + if (el.addEventListener) { + el.addEventListener('click', ithSorter(i)); + } else { + el.attachEvent('onclick', ithSorter(i)); + } + } + } + } + // adds sorting functionality to the UI + return function() { + if (!getTable()) { + return; + } + cols = loadColumns(); + loadData(); + addSearchBox(); + addSortIndicators(); + enableUI(); + }; +})(); + +window.addEventListener('load', addSorting); diff --git a/services/delivery/package.json b/services/delivery/package.json index 3eb5a908..43cb5383 100644 --- a/services/delivery/package.json +++ b/services/delivery/package.json @@ -1,9 +1,16 @@ { - "name": "typescript-grpc", + "name": "@goodfood/delivery", + "bin": "dist/index.js", "scripts": { - "start": "ts-node ./src/server.ts", + "start": "node dist/index.js", "dev": "nodemon --watch 'src/**/*.ts' --exec 'ts-node' src/server.ts", + "build": "esbuild src/server.ts --bundle --platform=node --target=node18 --outfile=dist/index.js", + "test": "vitest", + "coverage": "vitest --coverage", + "pkg": "pkg .", + "prisma:generate": "prisma generate", "seed": "ts-node prisma/seed.ts", + "postinstall": "npm run prisma:generate", "client:delivery-create": "ts-node ./src/client/delivery/create.ts", "client:delivery-get": "ts-node ./src/client/delivery/get.ts", "client:delivery-update": "ts-node ./src/client/delivery/update.ts", @@ -20,13 +27,31 @@ }, "devDependencies": { "@types/node": "18.15.9", + "@vitest/coverage-c8": "^0.29.8", + "esbuild": "^0.17.14", "nodemon": "^2.0.22", + "pkg": "^5.8.1", "prisma": "4.11.0", "ts-node": "10.9.1", "tsconfig-paths": "^4.1.2", - "typescript": "5.0.2" + "typescript": "5.0.2", + "vite-tsconfig-paths": "^4.0.7", + "vitest": "^0.29.8" }, "prisma": { "seed": "ts-node prisma/seed.ts" + }, + "pkg": { + "scripts": "./src/dist/index.js", + "assets": [ + "./prisma/**/*", + "../proto/**/*" + ], + "targets": [ + "node18-macos-arm64", + "node18-linux-x64", + "node18-linux-arm64" + ], + "outputPath": "bin/" } } diff --git a/services/delivery/pnpm-lock.yaml b/services/delivery/pnpm-lock.yaml index 38da5b6e..87cb70fa 100644 --- a/services/delivery/pnpm-lock.yaml +++ b/services/delivery/pnpm-lock.yaml @@ -1,43 +1,305 @@ -lockfileVersion: 5.4 - -specifiers: - '@grpc/grpc-js': ^1.8.13 - '@grpc/proto-loader': 0.7.6 - '@prisma/client': 4.11.0 - '@types/node': 18.15.9 - dotenv: ^16.0.3 - nodemon: ^2.0.22 - prisma: 4.11.0 - protobufjs: 7.2.2 - ts-node: 10.9.1 - tsconfig-paths: ^4.1.2 - typescript: 5.0.2 +lockfileVersion: '6.0' dependencies: - '@grpc/grpc-js': 1.8.13 - '@grpc/proto-loader': 0.7.6 - '@prisma/client': 4.11.0_prisma@4.11.0 - dotenv: 16.0.3 - protobufjs: 7.2.2 + '@grpc/grpc-js': + specifier: ^1.8.13 + version: 1.8.13 + '@grpc/proto-loader': + specifier: 0.7.6 + version: 0.7.6 + '@prisma/client': + specifier: 4.11.0 + version: 4.11.0(prisma@4.11.0) + dotenv: + specifier: ^16.0.3 + version: 16.0.3 + protobufjs: + specifier: 7.2.2 + version: 7.2.2 devDependencies: - '@types/node': 18.15.9 - nodemon: 2.0.22 - prisma: 4.11.0 - ts-node: 10.9.1_3flabivgbrnlfzsgzfhinuvrvy - tsconfig-paths: 4.1.2 - typescript: 5.0.2 + '@types/node': + specifier: 18.15.9 + version: 18.15.9 + '@vitest/coverage-c8': + specifier: ^0.29.8 + version: 0.29.8(vitest@0.29.8) + esbuild: + specifier: ^0.17.14 + version: 0.17.14 + nodemon: + specifier: ^2.0.22 + version: 2.0.22 + pkg: + specifier: ^5.8.1 + version: 5.8.1 + prisma: + specifier: 4.11.0 + version: 4.11.0 + ts-node: + specifier: 10.9.1 + version: 10.9.1(@types/node@18.15.9)(typescript@5.0.2) + tsconfig-paths: + specifier: ^4.1.2 + version: 4.1.2 + typescript: + specifier: 5.0.2 + version: 5.0.2 + vite-tsconfig-paths: + specifier: ^4.0.7 + version: 4.0.7(typescript@5.0.2) + vitest: + specifier: ^0.29.8 + version: 0.29.8 packages: - /@cspotcode/source-map-support/0.8.1: + /@babel/generator@7.18.2: + resolution: {integrity: sha512-W1lG5vUwFvfMd8HVXqdfbuG7RuaSrTCCD8cl8fP8wOivdbtbIg2Db3IWUcgvfxKbbn6ZBGYRW/Zk1MIwK49mgw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.19.0 + '@jridgewell/gen-mapping': 0.3.2 + jsesc: 2.5.2 + dev: true + + /@babel/helper-string-parser@7.19.4: + resolution: {integrity: sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helper-validator-identifier@7.19.1: + resolution: {integrity: sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/parser@7.18.4: + resolution: {integrity: sha512-FDge0dFazETFcxGw/EXzOkN8uJp0PC7Qbm+Pe9T+av2zlBpOgunFHkQPPn+eRuClU73JF+98D531UgayY89tow==} + engines: {node: '>=6.0.0'} + hasBin: true + dependencies: + '@babel/types': 7.19.0 + dev: true + + /@babel/types@7.19.0: + resolution: {integrity: sha512-YuGopBq3ke25BVSiS6fgF49Ul9gH1x70Bcr6bqRLjWCkcX8Hre1/5+z+IiWOIerRMSSEfGZVB9z9kyq7wVs9YA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-string-parser': 7.19.4 + '@babel/helper-validator-identifier': 7.19.1 + 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 - /@grpc/grpc-js/1.8.13: + /@esbuild/android-arm64@0.17.14: + resolution: {integrity: sha512-eLOpPO1RvtsP71afiFTvS7tVFShJBCT0txiv/xjFBo5a7R7Gjw7X0IgIaFoLKhqXYAXhahoXm7qAmRXhY4guJg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-arm@0.17.14: + resolution: {integrity: sha512-0CnlwnjDU8cks0yJLXfkaU/uoLyRf9VZJs4p1PskBr2AlAHeEsFEwJEo0of/Z3g+ilw5mpyDwThlxzNEIxOE4g==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-x64@0.17.14: + resolution: {integrity: sha512-nrfQYWBfLGfSGLvRVlt6xi63B5IbfHm3tZCdu/82zuFPQ7zez4XjmRtF/wIRYbJQ/DsZrxJdEvYFE67avYXyng==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-arm64@0.17.14: + resolution: {integrity: sha512-eoSjEuDsU1ROwgBH/c+fZzuSyJUVXQTOIN9xuLs9dE/9HbV/A5IqdXHU1p2OfIMwBwOYJ9SFVGGldxeRCUJFyw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-x64@0.17.14: + resolution: {integrity: sha512-zN0U8RWfrDttdFNkHqFYZtOH8hdi22z0pFm0aIJPsNC4QQZv7je8DWCX5iA4Zx6tRhS0CCc0XC2m7wKsbWEo5g==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-arm64@0.17.14: + resolution: {integrity: sha512-z0VcD4ibeZWVQCW1O7szaLxGsx54gcCnajEJMdYoYjLiq4g1jrP2lMq6pk71dbS5+7op/L2Aod+erw+EUr28/A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-x64@0.17.14: + resolution: {integrity: sha512-hd9mPcxfTgJlolrPlcXkQk9BMwNBvNBsVaUe5eNUqXut6weDQH8whcNaKNF2RO8NbpT6GY8rHOK2A9y++s+ehw==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm64@0.17.14: + resolution: {integrity: sha512-FhAMNYOq3Iblcj9i+K0l1Fp/MHt+zBeRu/Qkf0LtrcFu3T45jcwB6A1iMsemQ42vR3GBhjNZJZTaCe3VFPbn9g==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm@0.17.14: + resolution: {integrity: sha512-BNTl+wSJ1omsH8s3TkQmIIIQHwvwJrU9u1ggb9XU2KTVM4TmthRIVyxSp2qxROJHhZuW/r8fht46/QE8hU8Qvg==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ia32@0.17.14: + resolution: {integrity: sha512-91OK/lQ5y2v7AsmnFT+0EyxdPTNhov3y2CWMdizyMfxSxRqHazXdzgBKtlmkU2KYIc+9ZK3Vwp2KyXogEATYxQ==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-loong64@0.17.14: + resolution: {integrity: sha512-vp15H+5NR6hubNgMluqqKza85HcGJgq7t6rMH7O3Y6ApiOWPkvW2AJfNojUQimfTp6OUrACUXfR4hmpcENXoMQ==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-mips64el@0.17.14: + resolution: {integrity: sha512-90TOdFV7N+fgi6c2+GO9ochEkmm9kBAKnuD5e08GQMgMINOdOFHuYLPQ91RYVrnWwQ5683sJKuLi9l4SsbJ7Hg==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ppc64@0.17.14: + resolution: {integrity: sha512-NnBGeoqKkTugpBOBZZoktQQ1Yqb7aHKmHxsw43NddPB2YWLAlpb7THZIzsRsTr0Xw3nqiPxbA1H31ZMOG+VVPQ==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-riscv64@0.17.14: + resolution: {integrity: sha512-0qdlKScLXA8MGVy21JUKvMzCYWovctuP8KKqhtE5A6IVPq4onxXhSuhwDd2g5sRCzNDlDjitc5sX31BzDoL5Fw==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-s390x@0.17.14: + resolution: {integrity: sha512-Hdm2Jo1yaaOro4v3+6/zJk6ygCqIZuSDJHdHaf8nVH/tfOuoEX5Riv03Ka15LmQBYJObUTNS1UdyoMk0WUn9Ww==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-x64@0.17.14: + resolution: {integrity: sha512-8KHF17OstlK4DuzeF/KmSgzrTWQrkWj5boluiiq7kvJCiQVzUrmSkaBvcLB2UgHpKENO2i6BthPkmUhNDaJsVw==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/netbsd-x64@0.17.14: + resolution: {integrity: sha512-nVwpqvb3yyXztxIT2+VsxJhB5GCgzPdk1n0HHSnchRAcxqKO6ghXwHhJnr0j/B+5FSyEqSxF4q03rbA2fKXtUQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/openbsd-x64@0.17.14: + resolution: {integrity: sha512-1RZ7uQQ9zcy/GSAJL1xPdN7NDdOOtNEGiJalg/MOzeakZeTrgH/DoCkbq7TaPDiPhWqnDF+4bnydxRqQD7il6g==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/sunos-x64@0.17.14: + resolution: {integrity: sha512-nqMjDsFwv7vp7msrwWRysnM38Sd44PKmW8EzV01YzDBTcTWUpczQg6mGao9VLicXSgW/iookNK6AxeogNVNDZA==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-arm64@0.17.14: + resolution: {integrity: sha512-xrD0mccTKRBBIotrITV7WVQAwNJ5+1va6L0H9zN92v2yEdjfAN7864cUaZwJS7JPEs53bDTzKFbfqVlG2HhyKQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-ia32@0.17.14: + resolution: {integrity: sha512-nXpkz9bbJrLLyUTYtRotSS3t5b+FOuljg8LgLdINWFs3FfqZMtbnBCZFUmBzQPyxqU87F8Av+3Nco/M3hEcu1w==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-x64@0.17.14: + resolution: {integrity: sha512-gPQmsi2DKTaEgG14hc3CHXHp62k8g6qr0Pas+I4lUxRMugGSATh/Bi8Dgusoz9IQ0IfdrvLpco6kujEIBoaogA==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@grpc/grpc-js@1.8.13: resolution: {integrity: sha512-iY3jsdfbc0ARoCLFvbvUB8optgyb0r1XLPb142u+QtgBcKJYkCIFt3Fd/881KqjLYWjsBJF57N3b8Eop9NDfUA==} engines: {node: ^8.13.0 || >=10.10.0} dependencies: @@ -45,7 +307,7 @@ packages: '@types/node': 18.15.9 dev: false - /@grpc/proto-loader/0.7.6: + /@grpc/proto-loader@0.7.6: resolution: {integrity: sha512-QyAXR8Hyh7uMDmveWxDSUcJr9NAWaZ2I6IXgAYvQmfflwouTM+rArE2eEaCtLlRqO81j7pRLCt81IefUei6Zbw==} engines: {node: '>=6'} hasBin: true @@ -57,23 +319,70 @@ packages: yargs: 16.2.0 dev: false - /@jridgewell/resolve-uri/3.1.0: + /@istanbuljs/schema@0.1.3: + resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} + engines: {node: '>=8'} + dev: true + + /@jridgewell/gen-mapping@0.3.2: + resolution: {integrity: sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/set-array': 1.1.2 + '@jridgewell/sourcemap-codec': 1.4.14 + '@jridgewell/trace-mapping': 0.3.9 + dev: true + + /@jridgewell/resolve-uri@3.1.0: resolution: {integrity: sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==} engines: {node: '>=6.0.0'} dev: true - /@jridgewell/sourcemap-codec/1.4.14: + /@jridgewell/set-array@1.1.2: + resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} + engines: {node: '>=6.0.0'} + dev: true + + /@jridgewell/sourcemap-codec@1.4.14: resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==} dev: true - /@jridgewell/trace-mapping/0.3.9: + /@jridgewell/trace-mapping@0.3.17: + resolution: {integrity: sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==} + dependencies: + '@jridgewell/resolve-uri': 3.1.0 + '@jridgewell/sourcemap-codec': 1.4.14 + dev: true + + /@jridgewell/trace-mapping@0.3.9: resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} dependencies: '@jridgewell/resolve-uri': 3.1.0 '@jridgewell/sourcemap-codec': 1.4.14 dev: true - /@prisma/client/4.11.0_prisma@4.11.0: + /@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: true + + /@nodelib/fs.stat@2.0.5: + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + dev: true + + /@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: true + + /@prisma/client@4.11.0(prisma@4.11.0): resolution: {integrity: sha512-0INHYkQIqgAjrt7NzhYpeDQi8x3Nvylc2uDngKyFDDj1tTRQ4uV1HnVmd1sQEraeVAN63SOK0dgCKQHlvjL0KA==} engines: {node: '>=14.17'} requiresBuild: true @@ -87,108 +396,186 @@ packages: prisma: 4.11.0 dev: false - /@prisma/engines-version/4.11.0-57.8fde8fef4033376662cad983758335009d522acb: + /@prisma/engines-version@4.11.0-57.8fde8fef4033376662cad983758335009d522acb: resolution: {integrity: sha512-3Vd8Qq06d5xD8Ch5WauWcUUrsVPdMC6Ge8ILji8RFfyhUpqon6qSyGM0apvr1O8n8qH8cKkEFqRPsYjuz5r83g==} dev: false - /@prisma/engines/4.11.0: + /@prisma/engines@4.11.0: resolution: {integrity: sha512-0AEBi2HXGV02cf6ASsBPhfsVIbVSDC9nbQed4iiY5eHttW9ZtMxHThuKZE1pnESbr8HRdgmFSa/Kn4OSNYuibg==} requiresBuild: true - /@protobufjs/aspromise/1.1.2: + /@protobufjs/aspromise@1.1.2: resolution: {integrity: sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==} dev: false - /@protobufjs/base64/1.1.2: + /@protobufjs/base64@1.1.2: resolution: {integrity: sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==} dev: false - /@protobufjs/codegen/2.0.4: + /@protobufjs/codegen@2.0.4: resolution: {integrity: sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==} dev: false - /@protobufjs/eventemitter/1.1.0: + /@protobufjs/eventemitter@1.1.0: resolution: {integrity: sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==} dev: false - /@protobufjs/fetch/1.1.0: + /@protobufjs/fetch@1.1.0: resolution: {integrity: sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==} dependencies: '@protobufjs/aspromise': 1.1.2 '@protobufjs/inquire': 1.1.0 dev: false - /@protobufjs/float/1.0.2: + /@protobufjs/float@1.0.2: resolution: {integrity: sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==} dev: false - /@protobufjs/inquire/1.1.0: + /@protobufjs/inquire@1.1.0: resolution: {integrity: sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==} dev: false - /@protobufjs/path/1.1.2: + /@protobufjs/path@1.1.2: resolution: {integrity: sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==} dev: false - /@protobufjs/pool/1.1.0: + /@protobufjs/pool@1.1.0: resolution: {integrity: sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==} dev: false - /@protobufjs/utf8/1.1.0: + /@protobufjs/utf8@1.1.0: resolution: {integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==} dev: false - /@tsconfig/node10/1.0.9: + /@tsconfig/node10@1.0.9: resolution: {integrity: sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==} dev: true - /@tsconfig/node12/1.0.11: + /@tsconfig/node12@1.0.11: resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} dev: true - /@tsconfig/node14/1.0.3: + /@tsconfig/node14@1.0.3: resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} dev: true - /@tsconfig/node16/1.0.3: + /@tsconfig/node16@1.0.3: resolution: {integrity: sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==} dev: true - /@types/long/4.0.2: + /@types/chai-subset@1.3.3: + resolution: {integrity: sha512-frBecisrNGz+F4T6bcc+NLeolfiojh5FxW2klu669+8BARtyQv2C/GkNW6FUodVe4BroGMP/wER/YDGc7rEllw==} + dependencies: + '@types/chai': 4.3.4 + dev: true + + /@types/chai@4.3.4: + resolution: {integrity: sha512-KnRanxnpfpjUTqTCXslZSEdLfXExwgNxYPdiO2WGUj8+HDjFi8R3k5RVKPeSCzLjCcshCAtVO2QBbVuAV4kTnw==} + dev: true + + /@types/istanbul-lib-coverage@2.0.4: + resolution: {integrity: sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==} + dev: true + + /@types/long@4.0.2: resolution: {integrity: sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==} dev: false - /@types/node/18.15.9: + /@types/node@18.15.9: resolution: {integrity: sha512-dUxhiNzBLr6IqlZXz6e/rN2YQXlFgOei/Dxy+e3cyXTJ4txSUbGT2/fmnD6zd/75jDMeW5bDee+YXxlFKHoV0A==} - /abbrev/1.1.1: + /@vitest/coverage-c8@0.29.8(vitest@0.29.8): + resolution: {integrity: sha512-y+sEMQMctWokjnSqm3FCQEYFkjLrYaznsxEZHxcx8z2aftpYg3A5tvI1S5himfdEFo7o+OeHzh40bPSWZHW4oQ==} + peerDependencies: + vitest: '>=0.29.0 <1' + dependencies: + c8: 7.13.0 + picocolors: 1.0.0 + std-env: 3.3.2 + vitest: 0.29.8 + dev: true + + /@vitest/expect@0.29.8: + resolution: {integrity: sha512-xlcVXn5I5oTq6NiZSY3ykyWixBxr5mG8HYtjvpgg6KaqHm0mvhX18xuwl5YGxIRNt/A5jidd7CWcNHrSvgaQqQ==} + dependencies: + '@vitest/spy': 0.29.8 + '@vitest/utils': 0.29.8 + chai: 4.3.7 + dev: true + + /@vitest/runner@0.29.8: + resolution: {integrity: sha512-FzdhnRDwEr/A3Oo1jtIk/B952BBvP32n1ObMEb23oEJNO+qO5cBet6M2XWIDQmA7BDKGKvmhUf2naXyp/2JEwQ==} + dependencies: + '@vitest/utils': 0.29.8 + p-limit: 4.0.0 + pathe: 1.1.0 + dev: true + + /@vitest/spy@0.29.8: + resolution: {integrity: sha512-VdjBe9w34vOMl5I5mYEzNX8inTxrZ+tYUVk9jxaZJmHFwmDFC/GV3KBFTA/JKswr3XHvZL+FE/yq5EVhb6pSAw==} + dependencies: + tinyspy: 1.1.1 + dev: true + + /@vitest/utils@0.29.8: + resolution: {integrity: sha512-qGzuf3vrTbnoY+RjjVVIBYfuWMjn3UMUqyQtdGNZ6ZIIyte7B37exj6LaVkrZiUTvzSadVvO/tJm8AEgbGCBPg==} + dependencies: + cli-truncate: 3.1.0 + diff: 5.1.0 + loupe: 2.3.6 + pretty-format: 27.5.1 + dev: true + + /abbrev@1.1.1: resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} dev: true - /acorn-walk/8.2.0: + /acorn-walk@8.2.0: resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} engines: {node: '>=0.4.0'} dev: true - /acorn/8.8.2: + /acorn@8.8.2: resolution: {integrity: sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==} engines: {node: '>=0.4.0'} hasBin: true dev: true - /ansi-regex/5.0.1: + /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 + dev: true + + /ansi-regex@5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} - dev: false - /ansi-styles/4.3.0: + /ansi-regex@6.0.1: + resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} + engines: {node: '>=12'} + dev: true + + /ansi-styles@4.3.0: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} engines: {node: '>=8'} dependencies: color-convert: 2.0.1 - dev: false - /anymatch/3.1.3: + /ansi-styles@5.2.0: + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} + engines: {node: '>=10'} + dev: true + + /ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + dev: true + + /anymatch@3.1.3: resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} engines: {node: '>= 8'} dependencies: @@ -196,34 +583,116 @@ packages: picomatch: 2.3.1 dev: true - /arg/4.1.3: + /arg@4.1.3: resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} dev: true - /balanced-match/1.0.2: + /array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + dev: true + + /assertion-error@1.1.0: + resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} + dev: true + + /at-least-node@1.0.0: + resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} + engines: {node: '>= 4.0.0'} + dev: true + + /balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} dev: true - /binary-extensions/2.2.0: + /base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + dev: true + + /binary-extensions@2.2.0: resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} engines: {node: '>=8'} dev: true - /brace-expansion/1.1.11: + /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: true + + /brace-expansion@1.1.11: resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} dependencies: balanced-match: 1.0.2 concat-map: 0.0.1 dev: true - /braces/3.0.2: + /braces@3.0.2: resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} engines: {node: '>=8'} dependencies: fill-range: 7.0.1 dev: true - /chokidar/3.5.3: + /buffer@5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + dev: true + + /c8@7.13.0: + resolution: {integrity: sha512-/NL4hQTv1gBL6J6ei80zu3IiTrmePDKXKXOTLpHvcIWZTVYQlDhVWjjWvkhICylE8EwwnMVzDZugCvdx0/DIIA==} + engines: {node: '>=10.12.0'} + hasBin: true + dependencies: + '@bcoe/v8-coverage': 0.2.3 + '@istanbuljs/schema': 0.1.3 + find-up: 5.0.0 + foreground-child: 2.0.0 + istanbul-lib-coverage: 3.2.0 + istanbul-lib-report: 3.0.0 + istanbul-reports: 3.1.5 + rimraf: 3.0.2 + test-exclude: 6.0.0 + v8-to-istanbul: 9.1.0 + yargs: 16.2.0 + yargs-parser: 20.2.9 + dev: true + + /cac@6.7.14: + resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} + engines: {node: '>=8'} + dev: true + + /chai@4.3.7: + resolution: {integrity: sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==} + engines: {node: '>=4'} + dependencies: + assertion-error: 1.1.0 + check-error: 1.0.2 + deep-eql: 4.1.3 + get-func-name: 2.0.0 + loupe: 2.3.6 + pathval: 1.1.1 + type-detect: 4.0.8 + dev: true + + /chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + dev: true + + /check-error@1.0.2: + resolution: {integrity: sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==} + dev: true + + /chokidar@3.5.3: resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} engines: {node: '>= 8.10.0'} dependencies: @@ -238,34 +707,60 @@ packages: fsevents: 2.3.2 dev: true - /cliui/7.0.4: + /chownr@1.1.4: + resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} + dev: true + + /cli-truncate@3.1.0: + resolution: {integrity: sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + slice-ansi: 5.0.0 + string-width: 5.1.2 + dev: true + + /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 - /color-convert/2.0.1: + /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: + /color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - dev: false - /concat-map/0.0.1: + /concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} dev: true - /create-require/1.1.1: + /convert-source-map@1.9.0: + resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} + dev: true + + /core-util-is@1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + dev: true + + /create-require@1.1.1: resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} dev: true - /debug/3.2.7_supports-color@5.5.0: + /cross-spawn@7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + dev: true + + /debug@3.2.7(supports-color@5.5.0): resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} peerDependencies: supports-color: '*' @@ -277,33 +772,186 @@ packages: supports-color: 5.5.0 dev: true - /diff/4.0.2: - resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} - engines: {node: '>=0.3.1'} + /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 dev: true - /dotenv/16.0.3: - resolution: {integrity: sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==} - engines: {node: '>=12'} - dev: false + /decompress-response@6.0.0: + resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} + engines: {node: '>=10'} + dependencies: + mimic-response: 3.1.0 + dev: true - /emoji-regex/8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + /deep-eql@4.1.3: + resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==} + engines: {node: '>=6'} + dependencies: + type-detect: 4.0.8 + dev: true + + /deep-extend@0.6.0: + resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} + engines: {node: '>=4.0.0'} + dev: true + + /detect-libc@2.0.1: + resolution: {integrity: sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==} + engines: {node: '>=8'} + dev: true + + /diff@4.0.2: + resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} + engines: {node: '>=0.3.1'} + dev: true + + /diff@5.1.0: + resolution: {integrity: sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==} + 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 + dev: true + + /dotenv@16.0.3: + resolution: {integrity: sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==} + engines: {node: '>=12'} dev: false - /escalade/3.1.1: + /eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + dev: true + + /emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + /emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + dev: true + + /end-of-stream@1.4.4: + resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + dependencies: + once: 1.4.0 + dev: true + + /esbuild@0.17.14: + resolution: {integrity: sha512-vOO5XhmVj/1XQR9NQ1UPq6qvMYL7QFJU57J5fKBKBKxp17uDt5PgxFDb4A2nEiXhr1qQs4x0F5+66hVVw4ruNw==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/android-arm': 0.17.14 + '@esbuild/android-arm64': 0.17.14 + '@esbuild/android-x64': 0.17.14 + '@esbuild/darwin-arm64': 0.17.14 + '@esbuild/darwin-x64': 0.17.14 + '@esbuild/freebsd-arm64': 0.17.14 + '@esbuild/freebsd-x64': 0.17.14 + '@esbuild/linux-arm': 0.17.14 + '@esbuild/linux-arm64': 0.17.14 + '@esbuild/linux-ia32': 0.17.14 + '@esbuild/linux-loong64': 0.17.14 + '@esbuild/linux-mips64el': 0.17.14 + '@esbuild/linux-ppc64': 0.17.14 + '@esbuild/linux-riscv64': 0.17.14 + '@esbuild/linux-s390x': 0.17.14 + '@esbuild/linux-x64': 0.17.14 + '@esbuild/netbsd-x64': 0.17.14 + '@esbuild/openbsd-x64': 0.17.14 + '@esbuild/sunos-x64': 0.17.14 + '@esbuild/win32-arm64': 0.17.14 + '@esbuild/win32-ia32': 0.17.14 + '@esbuild/win32-x64': 0.17.14 + dev: true + + /escalade@3.1.1: resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} engines: {node: '>=6'} - dev: false - /fill-range/7.0.1: + /expand-template@2.0.3: + resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} + engines: {node: '>=6'} + dev: true + + /fast-glob@3.2.12: + resolution: {integrity: sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==} + 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: true + + /fastq@1.15.0: + resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} + dependencies: + reusify: 1.0.4 + dev: true + + /fill-range@7.0.1: resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} engines: {node: '>=8'} dependencies: to-regex-range: 5.0.1 dev: true - /fsevents/2.3.2: + /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 + + /foreground-child@2.0.0: + resolution: {integrity: sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==} + engines: {node: '>=8.0.0'} + dependencies: + cross-spawn: 7.0.3 + signal-exit: 3.0.7 + dev: true + + /from2@2.3.0: + resolution: {integrity: sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==} + dependencies: + inherits: 2.0.4 + readable-stream: 2.3.8 + dev: true + + /fs-constants@1.0.0: + resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} + dev: true + + /fs-extra@9.1.0: + resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==} + engines: {node: '>=10'} + dependencies: + at-least-node: 1.0.0 + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.0 + dev: true + + /fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + dev: true + + /fsevents@2.3.2: resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} os: [darwin] @@ -311,99 +959,360 @@ packages: dev: true optional: true - /get-caller-file/2.0.5: + /function-bind@1.1.1: + resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} + dev: true + + /get-caller-file@2.0.5: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} - dev: false - /glob-parent/5.1.2: + /get-func-name@2.0.0: + resolution: {integrity: sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==} + dev: true + + /github-from-package@0.0.0: + resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==} + dev: true + + /glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} dependencies: is-glob: 4.0.3 dev: true - /has-flag/3.0.0: + /glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + dev: true + + /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.2.12 + ignore: 5.2.4 + merge2: 1.4.1 + slash: 3.0.0 + dev: true + + /globrex@0.1.2: + resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} + dev: true + + /graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + dev: true + + /has-flag@3.0.0: resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} engines: {node: '>=4'} dev: true - /ignore-by-default/1.0.1: + /has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + dev: true + + /has@1.0.3: + resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} + engines: {node: '>= 0.4.0'} + dependencies: + function-bind: 1.1.1 + dev: true + + /html-escaper@2.0.2: + resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} + dev: true + + /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 + dev: true + + /ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + dev: true + + /ignore-by-default@1.0.1: resolution: {integrity: sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==} dev: true - /is-binary-path/2.1.0: + /ignore@5.2.4: + resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} + engines: {node: '>= 4'} + dev: true + + /inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + dev: true + + /inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + dev: true + + /ini@1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + dev: true + + /into-stream@6.0.0: + resolution: {integrity: sha512-XHbaOAvP+uFKUFsOgoNPRjLkwB+I22JFPFe5OjTkQ0nwgj6+pSjb4NmB6VMxaPshLiOf+zcpOCBQuLwC1KHhZA==} + engines: {node: '>=10'} + dependencies: + from2: 2.3.0 + p-is-promise: 3.0.0 + dev: true + + /is-binary-path@2.1.0: resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} engines: {node: '>=8'} dependencies: binary-extensions: 2.2.0 dev: true - /is-extglob/2.1.1: + /is-core-module@2.9.0: + resolution: {integrity: sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==} + dependencies: + has: 1.0.3 + dev: true + + /is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} dev: true - /is-fullwidth-code-point/3.0.0: + /is-fullwidth-code-point@3.0.0: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} engines: {node: '>=8'} - dev: false - /is-glob/4.0.3: + /is-fullwidth-code-point@4.0.0: + resolution: {integrity: sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==} + engines: {node: '>=12'} + dev: true + + /is-glob@4.0.3: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} dependencies: is-extglob: 2.1.1 dev: true - /is-number/7.0.0: + /is-number@7.0.0: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} dev: true - /json5/2.2.3: + /isarray@1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + dev: true + + /isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + dev: true + + /istanbul-lib-coverage@3.2.0: + resolution: {integrity: sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==} + engines: {node: '>=8'} + dev: true + + /istanbul-lib-report@3.0.0: + resolution: {integrity: sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==} + engines: {node: '>=8'} + dependencies: + istanbul-lib-coverage: 3.2.0 + make-dir: 3.1.0 + supports-color: 7.2.0 + dev: true + + /istanbul-reports@3.1.5: + resolution: {integrity: sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==} + engines: {node: '>=8'} + dependencies: + html-escaper: 2.0.2 + istanbul-lib-report: 3.0.0 + dev: true + + /jsesc@2.5.2: + resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} + engines: {node: '>=4'} + hasBin: true + dev: true + + /json5@2.2.3: resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} engines: {node: '>=6'} hasBin: true dev: true - /lodash.camelcase/4.3.0: + /jsonc-parser@3.2.0: + resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} + dev: true + + /jsonfile@6.1.0: + resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + dependencies: + universalify: 2.0.0 + optionalDependencies: + graceful-fs: 4.2.11 + dev: true + + /local-pkg@0.4.3: + resolution: {integrity: sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==} + engines: {node: '>=14'} + dev: true + + /locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + dependencies: + p-locate: 5.0.0 + dev: true + + /lodash.camelcase@4.3.0: resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} dev: false - /long/4.0.0: + /long@4.0.0: resolution: {integrity: sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==} dev: false - /long/5.2.1: + /long@5.2.1: resolution: {integrity: sha512-GKSNGeNAtw8IryjjkhZxuKB3JzlcLTwjtiQCHKvqQet81I93kXslhDQruGI/QsddO83mcDToBVy7GqGS/zYf/A==} dev: false - /make-error/1.3.6: + /loupe@2.3.6: + resolution: {integrity: sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==} + dependencies: + get-func-name: 2.0.0 + dev: true + + /lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + dependencies: + yallist: 4.0.0 + dev: true + + /make-dir@3.1.0: + resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} + engines: {node: '>=8'} + dependencies: + semver: 6.3.0 + dev: true + + /make-error@1.3.6: resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} dev: true - /minimatch/3.1.2: + /merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + dev: true + + /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: true + + /mimic-response@3.1.0: + resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} + engines: {node: '>=10'} + dev: true + + /minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} dependencies: brace-expansion: 1.1.11 dev: true - /minimist/1.2.8: + /minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} dev: true - /ms/2.1.3: + /mkdirp-classic@0.5.3: + resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} + dev: true + + /mlly@1.2.0: + resolution: {integrity: sha512-+c7A3CV0KGdKcylsI6khWyts/CYrGTrRVo4R/I7u/cUsy0Conxa6LUhiEzVKIw14lc2L5aiO4+SeVe4TeGRKww==} + dependencies: + acorn: 8.8.2 + pathe: 1.1.0 + pkg-types: 1.0.2 + ufo: 1.1.1 + dev: true + + /ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + dev: true + + /ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} dev: true - /nodemon/2.0.22: + /multistream@4.1.0: + resolution: {integrity: sha512-J1XDiAmmNpRCBfIWJv+n0ymC4ABcf/Pl+5YvC5B/D2f/2+8PtHvCNxMPKiQcZyi922Hq69J2YOpb1pTywfifyw==} + dependencies: + once: 1.4.0 + readable-stream: 3.6.2 + dev: true + + /nanoid@3.3.6: + resolution: {integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + dev: true + + /napi-build-utils@1.0.2: + resolution: {integrity: sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==} + dev: true + + /node-abi@3.33.0: + resolution: {integrity: sha512-7GGVawqyHF4pfd0YFybhv/eM9JwTtPqx0mAanQ146O3FlSh3pA24zf9IRQTOsfTSqXTNzPSP5iagAJ94jjuVog==} + engines: {node: '>=10'} + dependencies: + semver: 7.3.8 + dev: true + + /node-fetch@2.6.9: + resolution: {integrity: sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + dependencies: + whatwg-url: 5.0.0 + dev: true + + /nodemon@2.0.22: resolution: {integrity: sha512-B8YqaKMmyuCO7BowF1Z1/mkPqLk6cs/l63Ojtd6otKjMx47Dq1utxfRxcavH1I7VSaL8n5BUaoutadnsX3AAVQ==} engines: {node: '>=8.10.0'} hasBin: true dependencies: chokidar: 3.5.3 - debug: 3.2.7_supports-color@5.5.0 + debug: 3.2.7(supports-color@5.5.0) ignore-by-default: 1.0.1 minimatch: 3.1.2 pstree.remy: 1.1.8 @@ -414,24 +1323,182 @@ packages: undefsafe: 2.0.5 dev: true - /nopt/1.0.10: + /nopt@1.0.10: resolution: {integrity: sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==} hasBin: true dependencies: abbrev: 1.1.1 dev: true - /normalize-path/3.0.0: + /normalize-path@3.0.0: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} dev: true - /picomatch/2.3.1: + /once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + dependencies: + wrappy: 1.0.2 + dev: true + + /p-is-promise@3.0.0: + resolution: {integrity: sha512-Wo8VsW4IRQSKVXsJCn7TomUaVtyfjVDn3nUP7kE967BQk0CwFpdbZs0X0uk5sW9mkBa9eNM7hCMaG93WUAwxYQ==} + engines: {node: '>=8'} + dev: true + + /p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + dependencies: + yocto-queue: 0.1.0 + dev: true + + /p-limit@4.0.0: + resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + yocto-queue: 1.0.0 + dev: true + + /p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + dependencies: + p-limit: 3.1.0 + dev: true + + /path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + dev: true + + /path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + dev: true + + /path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + dev: true + + /path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + dev: true + + /path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + dev: true + + /pathe@1.1.0: + resolution: {integrity: sha512-ODbEPR0KKHqECXW1GoxdDb+AZvULmXjVPy4rt+pGo2+TnjJTIPJQSVS6N63n8T2Ip+syHhbn52OewKicV0373w==} + dev: true + + /pathval@1.1.1: + resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} + dev: true + + /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'} dev: true - /prisma/4.11.0: + /pkg-fetch@3.4.2: + resolution: {integrity: sha512-0+uijmzYcnhC0hStDjm/cl2VYdrmVVBpe7Q8k9YBojxmR5tG8mvR9/nooQq3QSXiQqORDVOTY3XqMEqJVIzkHA==} + hasBin: true + dependencies: + chalk: 4.1.2 + fs-extra: 9.1.0 + https-proxy-agent: 5.0.1 + node-fetch: 2.6.9 + progress: 2.0.3 + semver: 7.3.8 + tar-fs: 2.1.1 + yargs: 16.2.0 + transitivePeerDependencies: + - encoding + - supports-color + dev: true + + /pkg-types@1.0.2: + resolution: {integrity: sha512-hM58GKXOcj8WTqUXnsQyJYXdeAPbythQgEF3nTcEo+nkD49chjQ9IKm/QJy9xf6JakXptz86h7ecP2024rrLaQ==} + dependencies: + jsonc-parser: 3.2.0 + mlly: 1.2.0 + pathe: 1.1.0 + dev: true + + /pkg@5.8.1: + resolution: {integrity: sha512-CjBWtFStCfIiT4Bde9QpJy0KeH19jCfwZRJqHFDFXfhUklCx8JoFmMj3wgnEYIwGmZVNkhsStPHEOnrtrQhEXA==} + hasBin: true + peerDependencies: + node-notifier: '>=9.0.1' + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@babel/generator': 7.18.2 + '@babel/parser': 7.18.4 + '@babel/types': 7.19.0 + chalk: 4.1.2 + fs-extra: 9.1.0 + globby: 11.1.0 + into-stream: 6.0.0 + is-core-module: 2.9.0 + minimist: 1.2.8 + multistream: 4.1.0 + pkg-fetch: 3.4.2 + prebuild-install: 7.1.1 + resolve: 1.22.1 + stream-meter: 1.0.4 + transitivePeerDependencies: + - encoding + - supports-color + dev: true + + /postcss@8.4.21: + resolution: {integrity: sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==} + engines: {node: ^10 || ^12 || >=14} + dependencies: + nanoid: 3.3.6 + picocolors: 1.0.0 + source-map-js: 1.0.2 + dev: true + + /prebuild-install@7.1.1: + resolution: {integrity: sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==} + engines: {node: '>=10'} + hasBin: true + dependencies: + detect-libc: 2.0.1 + expand-template: 2.0.3 + github-from-package: 0.0.0 + minimist: 1.2.8 + mkdirp-classic: 0.5.3 + napi-build-utils: 1.0.2 + node-abi: 3.33.0 + pump: 3.0.0 + rc: 1.2.8 + simple-get: 4.0.1 + tar-fs: 2.1.1 + tunnel-agent: 0.6.0 + dev: true + + /pretty-format@27.5.1: + resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + ansi-regex: 5.0.1 + ansi-styles: 5.2.0 + react-is: 17.0.2 + dev: true + + /prisma@4.11.0: resolution: {integrity: sha512-4zZmBXssPUEiX+GeL0MUq/Yyie4ltiKmGu7jCJFnYMamNrrulTBc+D+QwAQSJ01tyzeGHlD13kOnqPwRipnlNw==} engines: {node: '>=14.17'} hasBin: true @@ -439,7 +1506,16 @@ packages: dependencies: '@prisma/engines': 4.11.0 - /protobufjs/7.2.2: + /process-nextick-args@2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + dev: true + + /progress@2.0.3: + resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} + engines: {node: '>=0.4.0'} + dev: true + + /protobufjs@7.2.2: resolution: {integrity: sha512-++PrQIjrom+bFDPpfmqXfAGSQs40116JRrqqyf53dymUMvvb5d/LMRyicRoF1AUKoXVS1/IgJXlEgcpr4gTF3Q==} engines: {node: '>=12.0.0'} requiresBuild: true @@ -458,82 +1534,353 @@ packages: long: 5.2.1 dev: false - /pstree.remy/1.1.8: + /pstree.remy@1.1.8: resolution: {integrity: sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==} dev: true - /readdirp/3.6.0: + /pump@3.0.0: + resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} + dependencies: + end-of-stream: 1.4.4 + once: 1.4.0 + dev: true + + /queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + dev: true + + /rc@1.2.8: + resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} + hasBin: true + dependencies: + deep-extend: 0.6.0 + ini: 1.3.8 + minimist: 1.2.8 + strip-json-comments: 2.0.1 + dev: true + + /react-is@17.0.2: + resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} + 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: true + + /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: true + + /readdirp@3.6.0: resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} engines: {node: '>=8.10.0'} dependencies: picomatch: 2.3.1 dev: true - /require-directory/2.1.1: + /require-directory@2.1.1: resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} engines: {node: '>=0.10.0'} - dev: false - /semver/5.7.1: + /resolve@1.22.1: + resolution: {integrity: sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==} + hasBin: true + dependencies: + is-core-module: 2.9.0 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + dev: true + + /reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + dev: true + + /rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + hasBin: true + dependencies: + glob: 7.2.3 + dev: true + + /rollup@3.20.2: + resolution: {integrity: sha512-3zwkBQl7Ai7MFYQE0y1MeQ15+9jsi7XxfrqwTb/9EK8D9C9+//EBR4M+CuA1KODRaNbFez/lWxA5vhEGZp4MUg==} + engines: {node: '>=14.18.0', npm: '>=8.0.0'} + hasBin: true + optionalDependencies: + fsevents: 2.3.2 + dev: true + + /run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + dependencies: + queue-microtask: 1.2.3 + dev: true + + /safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + dev: true + + /safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + dev: true + + /semver@5.7.1: resolution: {integrity: sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==} hasBin: true dev: true - /semver/7.0.0: + /semver@6.3.0: + resolution: {integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==} + hasBin: true + dev: true + + /semver@7.0.0: resolution: {integrity: sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==} hasBin: true dev: true - /simple-update-notifier/1.1.0: + /semver@7.3.8: + resolution: {integrity: sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==} + engines: {node: '>=10'} + hasBin: true + dependencies: + lru-cache: 6.0.0 + dev: true + + /shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + dependencies: + shebang-regex: 3.0.0 + dev: true + + /shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + 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==} + dev: true + + /simple-concat@1.0.1: + resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} + dev: true + + /simple-get@4.0.1: + resolution: {integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==} + dependencies: + decompress-response: 6.0.0 + once: 1.4.0 + simple-concat: 1.0.1 + dev: true + + /simple-update-notifier@1.1.0: resolution: {integrity: sha512-VpsrsJSUcJEseSbMHkrsrAVSdvVS5I96Qo1QAQ4FxQ9wXFcB+pjj7FB7/us9+GcgfW4ziHtYMc1J0PLczb55mg==} engines: {node: '>=8.10.0'} dependencies: semver: 7.0.0 dev: true - /string-width/4.2.3: + /slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + dev: true + + /slice-ansi@5.0.0: + resolution: {integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==} + engines: {node: '>=12'} + dependencies: + ansi-styles: 6.2.1 + is-fullwidth-code-point: 4.0.0 + dev: true + + /source-map-js@1.0.2: + resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} + engines: {node: '>=0.10.0'} + dev: true + + /source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + dev: true + + /stackback@0.0.2: + resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + dev: true + + /std-env@3.3.2: + resolution: {integrity: sha512-uUZI65yrV2Qva5gqE0+A7uVAvO40iPo6jGhs7s8keRfHCmtg+uB2X6EiLGCI9IgL1J17xGhvoOqSz79lzICPTA==} + dev: true + + /stream-meter@1.0.4: + resolution: {integrity: sha512-4sOEtrbgFotXwnEuzzsQBYEV1elAeFSO8rSGeTwabuX1RRn/kEq9JVH7I0MRBhKVRR0sJkr0M0QCH7yOLf9fhQ==} + dependencies: + readable-stream: 2.3.8 + 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 - dev: false - /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.0.1 + dev: true + + /string_decoder@1.1.1: + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + dependencies: + safe-buffer: 5.1.2 + dev: true + + /string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + dependencies: + safe-buffer: 5.2.1 + dev: true + + /strip-ansi@6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} dependencies: ansi-regex: 5.0.1 - dev: false - /strip-bom/3.0.0: + /strip-ansi@7.0.1: + resolution: {integrity: sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==} + engines: {node: '>=12'} + dependencies: + ansi-regex: 6.0.1 + dev: true + + /strip-bom@3.0.0: resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} engines: {node: '>=4'} dev: true - /supports-color/5.5.0: + /strip-json-comments@2.0.1: + resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} + engines: {node: '>=0.10.0'} + dev: true + + /strip-literal@1.0.1: + resolution: {integrity: sha512-QZTsipNpa2Ppr6v1AmJHESqJ3Uz247MUS0OjrnnZjFAvEoWqxuyFuXn2xLgMtRnijJShAa1HL0gtJyUs7u7n3Q==} + dependencies: + acorn: 8.8.2 + dev: true + + /supports-color@5.5.0: resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} engines: {node: '>=4'} dependencies: has-flag: 3.0.0 dev: true - /to-regex-range/5.0.1: + /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-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + dev: true + + /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: true + + /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: true + + /test-exclude@6.0.0: + resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} + engines: {node: '>=8'} + dependencies: + '@istanbuljs/schema': 0.1.3 + glob: 7.2.3 + minimatch: 3.1.2 + dev: true + + /tinybench@2.4.0: + resolution: {integrity: sha512-iyziEiyFxX4kyxSp+MtY1oCH/lvjH3PxFN8PGCDeqcZWAJ/i+9y+nL85w99PxVzrIvew/GSkSbDYtiGVa85Afg==} + dev: true + + /tinypool@0.4.0: + resolution: {integrity: sha512-2ksntHOKf893wSAH4z/+JbPpi92esw8Gn9N2deXX+B0EO92hexAVI9GIZZPx7P5aYo5KULfeOSt3kMOmSOy6uA==} + engines: {node: '>=14.0.0'} + dev: true + + /tinyspy@1.1.1: + resolution: {integrity: sha512-UVq5AXt/gQlti7oxoIg5oi/9r0WpF7DGEVwXgqWSMmyN16+e3tl5lIvTaOpJ3TAtu5xFzWccFRM4R5NaWHF+4g==} + engines: {node: '>=14.0.0'} + 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 dev: true - /touch/3.1.0: + /touch@3.1.0: resolution: {integrity: sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==} hasBin: true dependencies: nopt: 1.0.10 dev: true - /ts-node/10.9.1_3flabivgbrnlfzsgzfhinuvrvy: + /tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + dev: true + + /ts-node@10.9.1(@types/node@18.15.9)(typescript@5.0.2): resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} hasBin: true peerDependencies: @@ -564,7 +1911,20 @@ packages: yn: 3.1.1 dev: true - /tsconfig-paths/4.1.2: + /tsconfck@2.1.1(typescript@5.0.2): + resolution: {integrity: sha512-ZPCkJBKASZBmBUNqGHmRhdhM8pJYDdOXp4nRgj/O0JwUwsMq50lCDRQP/M5GBNAA0elPrq4gAeu4dkaVCuKWww==} + engines: {node: ^14.13.1 || ^16 || >=18} + hasBin: true + peerDependencies: + typescript: ^4.3.5 || ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + dependencies: + typescript: 5.0.2 + dev: true + + /tsconfig-paths@4.1.2: resolution: {integrity: sha512-uhxiMgnXQp1IR622dUXI+9Ehnws7i/y6xvpZB9IbUVOPy0muvdvgXeZOn88UcGPiT98Vp3rJPTa8bFoalZ3Qhw==} engines: {node: '>=6'} dependencies: @@ -573,40 +1933,241 @@ packages: strip-bom: 3.0.0 dev: true - /typescript/5.0.2: + /tunnel-agent@0.6.0: + resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} + dependencies: + safe-buffer: 5.2.1 + dev: true + + /type-detect@4.0.8: + resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} + engines: {node: '>=4'} + dev: true + + /typescript@5.0.2: resolution: {integrity: sha512-wVORMBGO/FAs/++blGNeAVdbNKtIh1rbBL2EyQ1+J9lClJ93KiiKe8PmFIVdXhHcyv44SL9oglmfeSsndo0jRw==} engines: {node: '>=12.20'} hasBin: true dev: true - /undefsafe/2.0.5: + /ufo@1.1.1: + resolution: {integrity: sha512-MvlCc4GHrmZdAllBc0iUDowff36Q9Ndw/UzqmEKyrfSzokTd9ZCy1i+IIk5hrYKkjoYVQyNbrw7/F8XJ2rEwTg==} + dev: true + + /undefsafe@2.0.5: resolution: {integrity: sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==} dev: true - /v8-compile-cache-lib/3.0.1: + /universalify@2.0.0: + resolution: {integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==} + engines: {node: '>= 10.0.0'} + dev: true + + /util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + dev: true + + /v8-compile-cache-lib@3.0.1: resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} dev: true - /wrap-ansi/7.0.0: + /v8-to-istanbul@9.1.0: + resolution: {integrity: sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA==} + engines: {node: '>=10.12.0'} + dependencies: + '@jridgewell/trace-mapping': 0.3.17 + '@types/istanbul-lib-coverage': 2.0.4 + convert-source-map: 1.9.0 + dev: true + + /vite-node@0.29.8(@types/node@18.15.9): + resolution: {integrity: sha512-b6OtCXfk65L6SElVM20q5G546yu10/kNrhg08afEoWlFRJXFq9/6glsvSVY+aI6YeC1tu2TtAqI2jHEQmOmsFw==} + engines: {node: '>=v14.16.0'} + hasBin: true + dependencies: + cac: 6.7.14 + debug: 4.3.4 + mlly: 1.2.0 + pathe: 1.1.0 + picocolors: 1.0.0 + vite: 4.2.1(@types/node@18.15.9) + transitivePeerDependencies: + - '@types/node' + - less + - sass + - stylus + - sugarss + - supports-color + - terser + dev: true + + /vite-tsconfig-paths@4.0.7(typescript@5.0.2): + resolution: {integrity: sha512-MwIYaby6kcbQGZqMH+gAK6h0UYQGOkjsuAgw4q6bP/5vWkn8VKvnmLuCQHA2+IzHAJHnE8OFTO4lnJLFMf9+7Q==} + peerDependencies: + vite: '*' + peerDependenciesMeta: + vite: + optional: true + dependencies: + debug: 4.3.4 + globrex: 0.1.2 + tsconfck: 2.1.1(typescript@5.0.2) + transitivePeerDependencies: + - supports-color + - typescript + dev: true + + /vite@4.2.1(@types/node@18.15.9): + resolution: {integrity: sha512-7MKhqdy0ISo4wnvwtqZkjke6XN4taqQ2TBaTccLIpOKv7Vp2h4Y+NpmWCnGDeSvvn45KxvWgGyb0MkHvY1vgbg==} + engines: {node: ^14.18.0 || >=16.0.0} + hasBin: true + peerDependencies: + '@types/node': '>= 14' + less: '*' + sass: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + dependencies: + '@types/node': 18.15.9 + esbuild: 0.17.14 + postcss: 8.4.21 + resolve: 1.22.1 + rollup: 3.20.2 + optionalDependencies: + fsevents: 2.3.2 + dev: true + + /vitest@0.29.8: + resolution: {integrity: sha512-JIAVi2GK5cvA6awGpH0HvH/gEG9PZ0a/WoxdiV3PmqK+3CjQMf8c+J/Vhv4mdZ2nRyXFw66sAg6qz7VNkaHfDQ==} + engines: {node: '>=v14.16.0'} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@vitest/browser': '*' + '@vitest/ui': '*' + happy-dom: '*' + jsdom: '*' + playwright: '*' + safaridriver: '*' + webdriverio: '*' + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@vitest/browser': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true + playwright: + optional: true + safaridriver: + optional: true + webdriverio: + optional: true + dependencies: + '@types/chai': 4.3.4 + '@types/chai-subset': 1.3.3 + '@types/node': 18.15.9 + '@vitest/expect': 0.29.8 + '@vitest/runner': 0.29.8 + '@vitest/spy': 0.29.8 + '@vitest/utils': 0.29.8 + acorn: 8.8.2 + acorn-walk: 8.2.0 + cac: 6.7.14 + chai: 4.3.7 + debug: 4.3.4 + local-pkg: 0.4.3 + pathe: 1.1.0 + picocolors: 1.0.0 + source-map: 0.6.1 + std-env: 3.3.2 + strip-literal: 1.0.1 + tinybench: 2.4.0 + tinypool: 0.4.0 + tinyspy: 1.1.1 + vite: 4.2.1(@types/node@18.15.9) + vite-node: 0.29.8(@types/node@18.15.9) + why-is-node-running: 2.2.2 + transitivePeerDependencies: + - less + - sass + - stylus + - sugarss + - supports-color + - terser + dev: true + + /webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + dev: true + + /whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + dev: true + + /which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + dependencies: + 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'} dependencies: ansi-styles: 4.3.0 string-width: 4.2.3 strip-ansi: 6.0.1 - dev: false - /y18n/5.0.8: + /wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + dev: true + + /y18n@5.0.8: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} engines: {node: '>=10'} - dev: false - /yargs-parser/20.2.9: + /yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + dev: true + + /yargs-parser@20.2.9: resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} engines: {node: '>=10'} - dev: false - /yargs/16.2.0: + /yargs@16.2.0: resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} engines: {node: '>=10'} dependencies: @@ -617,9 +2178,18 @@ packages: string-width: 4.2.3 y18n: 5.0.8 yargs-parser: 20.2.9 - dev: false - /yn/3.1.1: + /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'} + dev: true + + /yocto-queue@1.0.0: + resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} + engines: {node: '>=12.20'} + dev: true diff --git a/services/delivery/proto b/services/delivery/proto new file mode 120000 index 00000000..4d1e2d8b --- /dev/null +++ b/services/delivery/proto @@ -0,0 +1 @@ +../proto/ \ No newline at end of file diff --git a/services/delivery/src/tests/test.test.ts b/services/delivery/src/tests/test.test.ts new file mode 100644 index 00000000..c348152a --- /dev/null +++ b/services/delivery/src/tests/test.test.ts @@ -0,0 +1,6 @@ +import { describe, expect, test } from "vitest"; + +// simple test to check if the test runner is working +test("test", () => { + expect(true).toBe(true); +}); diff --git a/services/delivery/vitest.config.ts b/services/delivery/vitest.config.ts new file mode 100644 index 00000000..08cfe3bf --- /dev/null +++ b/services/delivery/vitest.config.ts @@ -0,0 +1,7 @@ +import { defineConfig } from "vitest/config"; +import tsconfigPaths from "vite-tsconfig-paths"; + +export default defineConfig({ + plugins: [tsconfigPaths()], + base: "/src/tests", +}); From 51a5567ca0fff1eea6fffbdea3f8d6b888b72d2d Mon Sep 17 00:00:00 2001 From: Florian LEROUX <10078837+floriaaan@users.noreply.github.com> Date: Tue, 4 Apr 2023 10:08:43 +0200 Subject: [PATCH 113/883] build(docker): add Dockerfile --- services/delivery/.dockerignore | 2 ++ services/delivery/.gitignore | 1 + services/delivery/Dockerfile | 42 +++++++++++++++++++++++++++++++++ 3 files changed, 45 insertions(+) create mode 100644 services/delivery/.dockerignore create mode 100644 services/delivery/Dockerfile diff --git a/services/delivery/.dockerignore b/services/delivery/.dockerignore new file mode 100644 index 00000000..dd87e2d7 --- /dev/null +++ b/services/delivery/.dockerignore @@ -0,0 +1,2 @@ +node_modules +build diff --git a/services/delivery/.gitignore b/services/delivery/.gitignore index 378e1eaa..31e50325 100644 --- a/services/delivery/.gitignore +++ b/services/delivery/.gitignore @@ -1,5 +1,6 @@ node_modules/ dist/ +bin/ *.env* !*.env.example diff --git a/services/delivery/Dockerfile b/services/delivery/Dockerfile new file mode 100644 index 00000000..0e62247a --- /dev/null +++ b/services/delivery/Dockerfile @@ -0,0 +1,42 @@ +FROM node:18-alpine as builder + +# Set working directory +WORKDIR /app + +# Copy the package.json and package-lock.json files +COPY package*.json ./ + +# Install dependencies +RUN npm install + + +# Copy the application code +COPY . . + +# Copy the proto files - TODO: fix this, proto files should be copied from goodfood/services/proto +# RUN cp -r -L ../proto /proto/ + +# Generate Prisma client +RUN npx prisma generate + +# Build the application +RUN npm run build + +# Package the application +RUN npm run pkg + +# Create a new image with the application +FROM node:18-alpine as runner + +# Set working directory +WORKDIR /app + +# Copy the application package +COPY --from=builder /app/bin /usr/local/bin +RUN ls /usr/local/bin + +# Expose the gRPC port +EXPOSE 50008 + +# Start the server +CMD ["delivery-linux-x64"] From 8b99bfd2ee06ba65695a8966158b38a960c5015c Mon Sep 17 00:00:00 2001 From: Florian LEROUX <10078837+floriaaan@users.noreply.github.com> Date: Tue, 4 Apr 2023 10:11:51 +0200 Subject: [PATCH 114/883] fix(ci): fix dependencies lock file is not found --- .github/workflows/delivery.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/delivery.yml b/.github/workflows/delivery.yml index a0953866..0f2065b8 100644 --- a/.github/workflows/delivery.yml +++ b/.github/workflows/delivery.yml @@ -18,6 +18,7 @@ jobs: with: node-version: "18.x" cache: "pnpm" + cache-dependency-path: services/delivery/pnpm-lock.yaml - name: Install dependencies run: | cd ./services/delivery @@ -39,6 +40,7 @@ jobs: with: node-version: "18.x" cache: "pnpm" + cache-dependency-path: services/delivery/pnpm-lock.yaml - name: Install dependencies run: | cd ./services/delivery From 9aa7b880e7f7bfb10fd0671aeffe865a01c5470f Mon Sep 17 00:00:00 2001 From: Florian LEROUX <10078837+floriaaan@users.noreply.github.com> Date: Sun, 9 Apr 2023 00:27:02 +0200 Subject: [PATCH 115/883] feat(handlers): add delivery-person handlers --- .github/workflows/delivery.yml | 1 - services/delivery/README.md | 2 +- services/delivery/prisma/schema.prisma | 2 +- .../delivery/src/handlers/delivery/create.ts | 3 +- .../delivery/src/handlers/delivery/delete.ts | 3 +- .../delivery/src/handlers/delivery/get.ts | 3 +- .../handlers/delivery/list-by-restaurant.ts | 3 +- .../src/handlers/delivery/list-by-user.ts | 3 +- .../delivery/src/handlers/delivery/update.ts | 3 +- .../delivery/src/handlers/person/create.ts | 29 ++++++++ .../delivery/src/handlers/person/delete.ts | 19 +++++ services/delivery/src/handlers/person/get.ts | 21 ++++++ .../delivery/src/handlers/person/index.ts | 15 ++++ .../delivery/src/handlers/person/list-near.ts | 72 +++++++++++++++++++ services/delivery/src/handlers/person/list.ts | 17 +++++ .../delivery/src/handlers/person/update.ts | 30 ++++++++ services/delivery/src/server.ts | 3 +- .../delivery/src/types/delivery-person.d.ts | 14 ++++ services/delivery/src/types/delivery.d.ts | 12 +--- services/delivery/src/types/index.d.ts | 9 +++ services/proto/delivery.proto | 4 +- 21 files changed, 245 insertions(+), 23 deletions(-) create mode 100644 services/delivery/src/handlers/person/create.ts create mode 100644 services/delivery/src/handlers/person/delete.ts create mode 100644 services/delivery/src/handlers/person/get.ts create mode 100644 services/delivery/src/handlers/person/index.ts create mode 100644 services/delivery/src/handlers/person/list-near.ts create mode 100644 services/delivery/src/handlers/person/list.ts create mode 100644 services/delivery/src/handlers/person/update.ts create mode 100644 services/delivery/src/types/index.d.ts diff --git a/.github/workflows/delivery.yml b/.github/workflows/delivery.yml index 0f2065b8..53b4ba53 100644 --- a/.github/workflows/delivery.yml +++ b/.github/workflows/delivery.yml @@ -53,7 +53,6 @@ jobs: publish: runs-on: ubuntu-latest needs: [build, test] - if: ${{ success() }} && ${{ github.ref == 'refs/heads/dev' || github.ref == 'refs/heads/main' }} steps: - name: Checkout code uses: actions/checkout@v2 diff --git a/services/delivery/README.md b/services/delivery/README.md index 69965be6..6f933c51 100644 --- a/services/delivery/README.md +++ b/services/delivery/README.md @@ -5,7 +5,7 @@ | **Port:** 50008 | | **Developer:** @floriaaan | | **Status:** In progress | -| **Last update:** 2023-04-04 | +| **Last update:** 2023-04-09 | | **Language:** NodeJS | | **Dependencies:** TypeScript, Prisma, gRPC, Postgres | | **Models:** (see [`prisma/schema.prisma`](./prisma/schema.prisma)) | diff --git a/services/delivery/prisma/schema.prisma b/services/delivery/prisma/schema.prisma index 0d7939f5..02929eb8 100644 --- a/services/delivery/prisma/schema.prisma +++ b/services/delivery/prisma/schema.prisma @@ -21,7 +21,7 @@ model Delivery { address String status Status @default(PENDING) - person DeliveryPerson @relation(fields: [delivery_person_id], references: [id]) + delivery_person DeliveryPerson @relation(fields: [delivery_person_id], references: [id]) delivery_person_id String user_id String diff --git a/services/delivery/src/handlers/delivery/create.ts b/services/delivery/src/handlers/delivery/create.ts index 1ad90069..ba0a4b6a 100644 --- a/services/delivery/src/handlers/delivery/create.ts +++ b/services/delivery/src/handlers/delivery/create.ts @@ -1,6 +1,7 @@ import { prisma } from "@delivery/lib/prisma"; import { log } from "@delivery/lib/log"; -import { Data, DeliveryCreateInput } from "@delivery/types/delivery"; +import { DeliveryCreateInput } from "@delivery/types/delivery"; +import { Data } from "@delivery/types"; export const CreateDelivery = async ( { request }: Data, diff --git a/services/delivery/src/handlers/delivery/delete.ts b/services/delivery/src/handlers/delivery/delete.ts index cdeee90b..35b5ade7 100644 --- a/services/delivery/src/handlers/delivery/delete.ts +++ b/services/delivery/src/handlers/delivery/delete.ts @@ -1,6 +1,7 @@ import { prisma } from "@delivery/lib/prisma"; import { log } from "@delivery/lib/log"; -import { Data, DeliveryId } from "@delivery/types/delivery"; +import { DeliveryId } from "@delivery/types/delivery"; +import { Data } from "@delivery/types"; export const DeleteDelivery = async ( data: Data, diff --git a/services/delivery/src/handlers/delivery/get.ts b/services/delivery/src/handlers/delivery/get.ts index cde931dd..4f7d37a5 100644 --- a/services/delivery/src/handlers/delivery/get.ts +++ b/services/delivery/src/handlers/delivery/get.ts @@ -1,6 +1,7 @@ import { prisma } from "@delivery/lib/prisma"; import { log } from "@delivery/lib/log"; -import { Data, DeliveryId } from "@delivery/types/delivery"; +import { DeliveryId } from "@delivery/types/delivery"; +import { Data } from "@delivery/types"; export const GetDelivery = async ( data: Data, diff --git a/services/delivery/src/handlers/delivery/list-by-restaurant.ts b/services/delivery/src/handlers/delivery/list-by-restaurant.ts index 879bb285..76aaa464 100644 --- a/services/delivery/src/handlers/delivery/list-by-restaurant.ts +++ b/services/delivery/src/handlers/delivery/list-by-restaurant.ts @@ -1,6 +1,7 @@ import { prisma } from "@delivery/lib/prisma"; import { log } from "@delivery/lib/log"; -import { Data, RestaurantId } from "@delivery/types/delivery"; +import { RestaurantId } from "@delivery/types/delivery"; +import { Data } from "@delivery/types"; export const ListDeliveriesByRestaurant = async ( data: Data, diff --git a/services/delivery/src/handlers/delivery/list-by-user.ts b/services/delivery/src/handlers/delivery/list-by-user.ts index 8c220175..30b5e3e1 100644 --- a/services/delivery/src/handlers/delivery/list-by-user.ts +++ b/services/delivery/src/handlers/delivery/list-by-user.ts @@ -1,6 +1,7 @@ import { prisma } from "@delivery/lib/prisma"; import { log } from "@delivery/lib/log"; -import { Data, UserId } from "@delivery/types/delivery"; +import { UserId } from "@delivery/types/delivery"; +import { Data } from "@delivery/types"; export const ListDeliveriesByUser = async ( data: Data, diff --git a/services/delivery/src/handlers/delivery/update.ts b/services/delivery/src/handlers/delivery/update.ts index d08d2bd2..41f4c8c9 100644 --- a/services/delivery/src/handlers/delivery/update.ts +++ b/services/delivery/src/handlers/delivery/update.ts @@ -1,6 +1,7 @@ import { prisma } from "@delivery/lib/prisma"; import { log } from "@delivery/lib/log"; -import { Data, Delivery } from "@delivery/types/delivery"; +import { Delivery } from "@delivery/types/delivery"; +import { Data } from "@delivery/types"; export const UpdateDelivery = async ( data: Data, diff --git a/services/delivery/src/handlers/person/create.ts b/services/delivery/src/handlers/person/create.ts new file mode 100644 index 00000000..1a918438 --- /dev/null +++ b/services/delivery/src/handlers/person/create.ts @@ -0,0 +1,29 @@ +import { log } from "@delivery/lib/log"; +import prisma from "@delivery/lib/prisma"; +import { Data } from "@delivery/types"; +import { DeliveryPersonCreateInput } from "@delivery/types/delivery-person"; + +export const CreateDeliveryPerson = async ( + { request }: Data, + callback: (err: any, response: any) => void +) => { + log.debug("request received at CreateDeliveryPerson handler\n", request); + try { + const { first_name, last_name, phone, location } = request; + + const deliveryPerson = await prisma.deliveryPerson.create({ + data: { + first_name, + last_name, + phone, + location: { + set: location, + }, + }, + }); + callback(null, deliveryPerson); + } catch (error) { + log.error(error); + callback(error, null); + } +}; diff --git a/services/delivery/src/handlers/person/delete.ts b/services/delivery/src/handlers/person/delete.ts new file mode 100644 index 00000000..9edfd117 --- /dev/null +++ b/services/delivery/src/handlers/person/delete.ts @@ -0,0 +1,19 @@ +import { log } from "@delivery/lib/log"; +import prisma from "@delivery/lib/prisma"; +import { Data } from "@delivery/types"; +import { DeliveryPersonId } from "@delivery/types/delivery-person"; + +export const DeleteDeliveryPerson = async ( + { request }: Data, + callback: (err: any, response: any) => void +) => { + log.debug("request received at DeleteDeliveryPerson handler\n", request); + try { + const { id } = request; + await prisma.deliveryPerson.delete({ where: { id } }); + callback(null, {}); + } catch (error) { + log.error(error); + callback(error, null); + } +}; diff --git a/services/delivery/src/handlers/person/get.ts b/services/delivery/src/handlers/person/get.ts new file mode 100644 index 00000000..e94093df --- /dev/null +++ b/services/delivery/src/handlers/person/get.ts @@ -0,0 +1,21 @@ +import { log } from "@delivery/lib/log"; +import prisma from "@delivery/lib/prisma"; +import { Data } from "@delivery/types"; +import { DeliveryPersonId } from "@delivery/types/delivery-person"; + +export const GetDeliveryPerson = async ( + { request }: Data, + callback: (err: any, response: any) => void +) => { + log.debug("request received at GetDeliveryPerson handler\n", request); + try { + const { id } = request; + const deliveryPerson = await prisma.deliveryPerson.findUnique({ + where: { id }, + }); + callback(null, deliveryPerson); + } catch (error) { + log.error(error); + callback(error, null); + } +}; diff --git a/services/delivery/src/handlers/person/index.ts b/services/delivery/src/handlers/person/index.ts new file mode 100644 index 00000000..7270442c --- /dev/null +++ b/services/delivery/src/handlers/person/index.ts @@ -0,0 +1,15 @@ +import { CreateDeliveryPerson } from "@delivery/handlers/person/create"; +import { GetDeliveryPerson } from "@delivery/handlers/person/get"; +import { UpdateDeliveryPerson } from "@delivery/handlers/person/update"; +import { DeleteDeliveryPerson } from "@delivery/handlers/person/delete"; +import { ListDeliveryPersons } from "@delivery/handlers/person/list"; +import { ListNearDeliveryPersons } from "@delivery/handlers/person/list-near"; + +export default { + CreateDeliveryPerson, + GetDeliveryPerson, + UpdateDeliveryPerson, + DeleteDeliveryPerson, + ListDeliveryPersons, + ListNearDeliveryPersons, +}; diff --git a/services/delivery/src/handlers/person/list-near.ts b/services/delivery/src/handlers/person/list-near.ts new file mode 100644 index 00000000..900e5ac9 --- /dev/null +++ b/services/delivery/src/handlers/person/list-near.ts @@ -0,0 +1,72 @@ +import { prisma } from "@delivery/lib/prisma"; +import { log } from "@delivery/lib/log"; +import { Data } from "@delivery/types"; +import { LocationInput } from "@delivery/types/delivery-person"; + +export const ListNearDeliveryPersons = async ( + { request }: Data, + callback: (err: any, response: any) => void +) => { + log.debug("request received at ListNearDeliveryPersons handler\n", request); + try { + const { latitude, longitude } = request; + const maxDistance = 10; // in km //TODO: make this a parameter + + const query = await prisma.deliveryPerson.findMany(); + const delivery_persons = query.filter(deliveryPerson => { + const distance = calculateDistance(latitude, longitude, deliveryPerson.location[0], deliveryPerson.location[1]); + return distance <= maxDistance; + });; + + callback(null, { delivery_persons }); + } catch (error) { + log.error(error); + callback(error, null); + } +}; + +/** + * Could use this raw query using Haversine formula to get locations within a radius: + * SELECT * + FROM "DeliveryPerson" + WHERE 6371 * 2 * ASIN(SQRT(POWER(SIN((latitude - $1) * pi()/180 / 2), 2) + COS(latitude * pi()/180) * COS($1 * pi()/180) * POWER(SIN((longitude - $2) * pi()/180 / 2), 2))) <= $3; + * with $1 = latitude, $2 = longitude, $3 = distance + + The Haversine formula is given by: + ``` + a = POWER(SIN((latitude2 - latitude1) * pi()/180 / 2), 2) + COS(latitude1 * pi()/180) * COS(latitude2 * pi()/180) * POWER(SIN((longitude2 - longitude1) * pi()/180 / 2), 2) + c = 2 * ASIN(SQRT(a)) + d = R * c + ``` + where latitude1 and longitude1 are the coordinates of the first point, latitude2 and longitude2 are the coordinates of the second point, R is the radius of the Earth (in this case, we are using the value 6371 which is the average radius of the Earth in kilometers), a is the square of half the chord length between the points (in radians), c is the angular distance in radians, and d is the distance between the two points in kilometers. + */ + +const EARTH_RADIUS_KM = 6371; + +function toRadians(degrees: number) { + return (degrees * Math.PI) / 180; +} + +function calculateDistance( + latitude1: number, + longitude1: number, + latitude2: number, + longitude2: number +) { + const radLat1 = toRadians(latitude1); + const radLat2 = toRadians(latitude2); + const radDeltaLat = toRadians(latitude2 - latitude1); + const radDeltaLon = toRadians(longitude2 - longitude1); + + const a = + Math.sin(radDeltaLat / 2) * Math.sin(radDeltaLat / 2) + + Math.cos(radLat1) * + Math.cos(radLat2) * + Math.sin(radDeltaLon / 2) * + Math.sin(radDeltaLon / 2); + + const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a)); + const distance = EARTH_RADIUS_KM * c; + + return distance; +} diff --git a/services/delivery/src/handlers/person/list.ts b/services/delivery/src/handlers/person/list.ts new file mode 100644 index 00000000..468ea5e3 --- /dev/null +++ b/services/delivery/src/handlers/person/list.ts @@ -0,0 +1,17 @@ +import { log } from "@delivery/lib/log"; +import prisma from "@delivery/lib/prisma"; +import { Data } from "@delivery/types"; + +export const ListDeliveryPersons = async ( + { request }: Data<{}>, + callback: (err: any, response: any) => void +) => { + log.debug("request received at ListDeliveryPersons handler\n", request); + try { + const delivery_persons = await prisma.deliveryPerson.findMany(); + callback(null, { delivery_persons }); + } catch (error) { + log.error(error); + callback(error, null); + } +}; diff --git a/services/delivery/src/handlers/person/update.ts b/services/delivery/src/handlers/person/update.ts new file mode 100644 index 00000000..7a6b1743 --- /dev/null +++ b/services/delivery/src/handlers/person/update.ts @@ -0,0 +1,30 @@ +import { log } from "@delivery/lib/log"; +import prisma from "@delivery/lib/prisma"; +import { Data } from "@delivery/types"; +import { DeliveryPerson } from "@delivery/types/delivery-person"; + +export const UpdateDeliveryPerson = async ( + { request }: Data, + callback: (err: any, response: any) => void +) => { + log.debug("request received at UpdateDeliveryPerson handler\n", request); + try { + const { id, first_name, last_name, location, phone } = request; + + const deliveryPerson = await prisma.deliveryPerson.update({ + where: { id }, + data: { + first_name, + last_name, + phone, + location: { + set: location, + }, + }, + }); + callback(null, deliveryPerson); + } catch (error) { + log.error(error); + callback(error, null); + } +}; diff --git a/services/delivery/src/server.ts b/services/delivery/src/server.ts index 2eac6c38..01d48fd7 100644 --- a/services/delivery/src/server.ts +++ b/services/delivery/src/server.ts @@ -8,6 +8,7 @@ import { options } from "@delivery/resources/protoloader-options"; import { serverInsecure } from "@delivery/resources/grpc-credentials"; import deliveryHandlers from "@delivery/handlers/delivery"; +import personHandlers from "@delivery/handlers/person"; const PORT = process.env.PORT || 50008; const ADDRESS = `0.0.0.0:${PORT}`; @@ -18,7 +19,7 @@ const { delivery } = loadPackageDefinition(packageDefinition) as any; // todo: f const server = new Server(); server.addService(delivery.DeliveryService.service, deliveryHandlers); -server.addService(delivery.DeliveryPersonService.service, {}); +server.addService(delivery.DeliveryPersonService.service, personHandlers); server.bindAsync(ADDRESS, serverInsecure, () => { server.start(); diff --git a/services/delivery/src/types/delivery-person.d.ts b/services/delivery/src/types/delivery-person.d.ts index a897860e..5bb6731d 100644 --- a/services/delivery/src/types/delivery-person.d.ts +++ b/services/delivery/src/types/delivery-person.d.ts @@ -9,3 +9,17 @@ export type DeliveryPerson = { deliveries: Delivery[]; }; + +export type DeliveryPersonCreateInput = { + first_name: string; + last_name: string; + phone: string; + location: [number, number]; +}; + +export type LocationInput = { + latitude: number; + longitude: number; +}; + +export type DeliveryPersonId = { id: DeliveryPerson["id"] }; diff --git a/services/delivery/src/types/delivery.d.ts b/services/delivery/src/types/delivery.d.ts index 333462d6..59ff1d82 100644 --- a/services/delivery/src/types/delivery.d.ts +++ b/services/delivery/src/types/delivery.d.ts @@ -1,16 +1,6 @@ import { DeliveryPerson } from "@delivery/types/delivery-person"; import { Status } from "@prisma/client"; -export type Data = { - request: T; -}; - -export type Stream = { - write: (data: any) => void; - end: () => void; - request: T; -}; - export type DeliveryCreateInput = { eta: string; address: string; @@ -23,7 +13,7 @@ export type DeliveryCreateInput = { }; export type DeliveryId = { - id: string; + id: Delivery["id"]; }; export type Delivery = { diff --git a/services/delivery/src/types/index.d.ts b/services/delivery/src/types/index.d.ts new file mode 100644 index 00000000..5f91a217 --- /dev/null +++ b/services/delivery/src/types/index.d.ts @@ -0,0 +1,9 @@ +export type Data = { + request: T; +}; + +export type Stream = { + write: (data: any) => void; + end: () => void; + request: T; +}; diff --git a/services/proto/delivery.proto b/services/proto/delivery.proto index f4906434..91a86b21 100644 --- a/services/proto/delivery.proto +++ b/services/proto/delivery.proto @@ -10,7 +10,7 @@ message Delivery { string address = 3; Status status = 4; - DeliveryPerson person = 5; + DeliveryPerson delivery_person = 5; string delivery_person_id = 6; string user_id = 7; @@ -80,7 +80,7 @@ message DeliveryList { } message DeliveryPersonList { - repeated DeliveryPersonList persons = 1; + repeated DeliveryPersonList delivery_persons = 1; } message DeliveryPersonId { From b0c0f5548ebc9ed1a6647c2538324f89ae8d3b76 Mon Sep 17 00:00:00 2001 From: Florian LEROUX <10078837+floriaaan@users.noreply.github.com> Date: Mon, 10 Apr 2023 11:29:33 +0200 Subject: [PATCH 116/883] feat(tf): add terraform files --- services/delivery/terraform/data.tf | 17 +++++ .../terraform/env/dev-backend.tfvars.example | 4 + .../delivery/terraform/env/dev.tfvars.example | 1 + services/delivery/terraform/main.tf | 74 +++++++++++++++++++ services/delivery/terraform/outputs.tf | 6 ++ services/delivery/terraform/variables.tf | 16 ++++ terraform/outputs.tf | 4 +- 7 files changed, 120 insertions(+), 2 deletions(-) create mode 100644 services/delivery/terraform/data.tf create mode 100644 services/delivery/terraform/env/dev-backend.tfvars.example create mode 100644 services/delivery/terraform/env/dev.tfvars.example create mode 100644 services/delivery/terraform/main.tf create mode 100644 services/delivery/terraform/outputs.tf create mode 100644 services/delivery/terraform/variables.tf diff --git a/services/delivery/terraform/data.tf b/services/delivery/terraform/data.tf new file mode 100644 index 00000000..adf0b7fd --- /dev/null +++ b/services/delivery/terraform/data.tf @@ -0,0 +1,17 @@ +data "azurerm_resource_group" "rg-goodfood" { + name = "rg-${var.project_name}${var.environnment_suffix}" +} + +data "azurerm_key_vault" "kv-goodfood-delivery" { + resource_group_name = data.azurerm_resource_group.rg-goodfood.name + name = "kv-${var.project_name}" +} + +data "azurerm_key_vault_secret" "delivery-db-login" { + name = "delivery-db-login" + key_vault_id = data.azurerm_key_vault.kv-goodfood-delivery.id +} +data "azurerm_key_vault_secret" "delivery-db-password" { + name = "delivery-db-password" + key_vault_id = data.azurerm_key_vault.kv-goodfood-delivery.id +} \ No newline at end of file diff --git a/services/delivery/terraform/env/dev-backend.tfvars.example b/services/delivery/terraform/env/dev-backend.tfvars.example new file mode 100644 index 00000000..e0cce6f6 --- /dev/null +++ b/services/delivery/terraform/env/dev-backend.tfvars.example @@ -0,0 +1,4 @@ +resource_group_name = "rg-goodfood-dev" +storage_account_name = "sa-goodfood-states" +container_name = "tfstate" +key = "delivery-dev.tfstate" diff --git a/services/delivery/terraform/env/dev.tfvars.example b/services/delivery/terraform/env/dev.tfvars.example new file mode 100644 index 00000000..4ac1f44d --- /dev/null +++ b/services/delivery/terraform/env/dev.tfvars.example @@ -0,0 +1 @@ +environnment_suffix = "-dev" diff --git a/services/delivery/terraform/main.tf b/services/delivery/terraform/main.tf new file mode 100644 index 00000000..944f2393 --- /dev/null +++ b/services/delivery/terraform/main.tf @@ -0,0 +1,74 @@ +terraform { + required_providers { + azurerm = { + source = "hashicorp/azurerm" + version = "3.48.0" + } + } + backend "azurerm" {} +} + +provider "azurerm" { + features { + key_vault { + purge_soft_deleted_secrets_on_destroy = true + recover_soft_deleted_secrets = true + } + } +} + +resource "azurerm_key_vault" "kv-goodfood-delivery" { + name = "kv-goodfood-delivery" + location = data.azurerm_resource_group.rg-goodfood.location + resource_group_name = data.azurerm_resource_group.rg-goodfood.name + tenant_id = data.azurerm_client_config.current.tenant_id + sku_name = "standard" + soft_delete_retention_days = 7 + + access_policy { + tenant_id = data.azurerm_client_config.current.tenant_id + object_id = data.azurerm_client_config.current.object_id + + key_permissions = [ + "Create", + "Get", + ] + + secret_permissions = [ + "Set", + "Get", + "Delete", + "Purge", + "Recover" + ] + } +} + +resource "azurerm_postgresql_server" "pg-goodfood-delivery" { + name = "pg-goodfood-delivery${var.environnment_suffix}" + location = data.azurerm_resource_group.rg-goodfood.location + resource_group_name = data.azurerm_resource_group.rg-goodfood.name + + sku_name = "B_Gen5_2" + + storage_mb = 5120 + backup_retention_days = 7 + geo_redundant_backup_enabled = false + auto_grow_enabled = true + + administrator_login = data.azurerm_key_vault_secret.delivery-db-login.value + administrator_login_password = data.azurerm_key_vault_secret.delivery-db-password.value + version = "11" + + ssl_enforcement_enabled = false + ssl_minimal_tls_version_enforced = "TLSEnforcementDisabled" // TODO: change to TLS1_2 + +} + +resource "azurerm_postgresql_firewall_rule" "pgfw-goodfood-delivery" { + name = "allow-azure-resources" + resource_group_name = data.azurerm_resource_group.rg-goodfood.name + server_name = azurerm_postgresql_server.pg-goodfood-delivery.name + start_ip_address = "0.0.0.0" + end_ip_address = "0.0.0.0" +} diff --git a/services/delivery/terraform/outputs.tf b/services/delivery/terraform/outputs.tf new file mode 100644 index 00000000..a2d60616 --- /dev/null +++ b/services/delivery/terraform/outputs.tf @@ -0,0 +1,6 @@ +output "main-rg-name" { + value = data.azurerm_resource_group.rg-goodfood.name +} +output "main-rg-id" { + value = data.azurerm_resource_group.rg-goodfood.id +} \ No newline at end of file diff --git a/services/delivery/terraform/variables.tf b/services/delivery/terraform/variables.tf new file mode 100644 index 00000000..65fd7547 --- /dev/null +++ b/services/delivery/terraform/variables.tf @@ -0,0 +1,16 @@ +variable "environnment_suffix" { + type = string + description = "The suffix to append to the environment name" +} + +variable "location" { + type = string + description = "The location/region where all resources in this environment should be created" + default = "West Europe" +} + +variable "project_name" { + type = string + description = "The name of the project" + default = "goodfood" +} \ No newline at end of file diff --git a/terraform/outputs.tf b/terraform/outputs.tf index e4f4b633..aa5afd79 100644 --- a/terraform/outputs.tf +++ b/terraform/outputs.tf @@ -1,8 +1,8 @@ output "main-rg-name" { - value = data.azurerm_resource_group.rg-fleroux.name + value = data.azurerm_resource_group.rg-goodfood.name } output "main-rg-id" { - value = data.azurerm_resource_group.rg-fleroux.id + value = data.azurerm_resource_group.rg-goodfood.id } output "client_certificate" { From d72c411c5f6d984fdcc2c0df84d77f5bff9f2c9a Mon Sep 17 00:00:00 2001 From: Florian LEROUX <10078837+floriaaan@users.noreply.github.com> Date: Mon, 10 Apr 2023 11:36:35 +0200 Subject: [PATCH 117/883] feat(k8s): add k8s files --- services/delivery/k8s/configmap.yml | 8 ++++++++ services/delivery/k8s/deployment.yml | 30 ++++++++++++++++++++++++++++ services/delivery/k8s/hpa.yml | 18 +++++++++++++++++ services/delivery/k8s/ingress.yml | 17 ++++++++++++++++ services/delivery/k8s/service.yml | 13 ++++++++++++ 5 files changed, 86 insertions(+) create mode 100644 services/delivery/k8s/configmap.yml create mode 100644 services/delivery/k8s/deployment.yml create mode 100644 services/delivery/k8s/hpa.yml create mode 100644 services/delivery/k8s/ingress.yml create mode 100644 services/delivery/k8s/service.yml diff --git a/services/delivery/k8s/configmap.yml b/services/delivery/k8s/configmap.yml new file mode 100644 index 00000000..9b5ee3bd --- /dev/null +++ b/services/delivery/k8s/configmap.yml @@ -0,0 +1,8 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: goodfood-delivery-configmap + labels: + app: goodfood-delivery +data: + port: "50008" \ No newline at end of file diff --git a/services/delivery/k8s/deployment.yml b/services/delivery/k8s/deployment.yml new file mode 100644 index 00000000..53722f26 --- /dev/null +++ b/services/delivery/k8s/deployment.yml @@ -0,0 +1,30 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: goodfood-delivery + labels: + app: goodfood-delivery +spec: + selector: + matchLabels: + app: goodfood-delivery + template: + metadata: + labels: + app: goodfood-delivery + spec: + containers: + - name: goodfood-delivery + image: floriaaan/goodfood-delivery:1.0 + resources: + limits: + memory: "128Mi" + cpu: "200m" + env: + - name: PORT + valueFrom: + configMapKeyRef: + name: goodfood-delivery-configmap + key: port + ports: + - containerPort: 3000 diff --git a/services/delivery/k8s/hpa.yml b/services/delivery/k8s/hpa.yml new file mode 100644 index 00000000..2bc29783 --- /dev/null +++ b/services/delivery/k8s/hpa.yml @@ -0,0 +1,18 @@ +apiVersion: autoscaling/v2 +kind: HorizontalPodAutoscaler +metadata: + name: goodfood-delivery-hpa +spec: + scaleTargetRef: + apiVersion: apps/v1 + kind: Deployment + name: goodfood-delivery + minReplicas: 1 + maxReplicas: 3 + metrics: + - type: Resource + resource: + name: cpu + target: + type: Utilization + averageUtilization: 50 diff --git a/services/delivery/k8s/ingress.yml b/services/delivery/k8s/ingress.yml new file mode 100644 index 00000000..e246d6c4 --- /dev/null +++ b/services/delivery/k8s/ingress.yml @@ -0,0 +1,17 @@ +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + name: goodfood-delivery +spec: + ingressClassName: nginx + rules: + - host: delivery.localdev.me + http: + paths: + - pathType: Prefix + backend: + service: + name: goodfood-delivery + port: + number: 50008 + path: / \ No newline at end of file diff --git a/services/delivery/k8s/service.yml b/services/delivery/k8s/service.yml new file mode 100644 index 00000000..32cb13c9 --- /dev/null +++ b/services/delivery/k8s/service.yml @@ -0,0 +1,13 @@ +apiVersion: v1 +kind: Service +metadata: + name: goodfood-delivery +spec: + selector: + app: goodfood-delivery + ports: + - name: "grpc" + port: 50008 + targetPort: 50008 +status: + loadBalancer: {} From fd96c2b09ebc2c03a31a10e9c04398f7c1b1f3bc Mon Sep 17 00:00:00 2001 From: Florian LEROUX <10078837+floriaaan@users.noreply.github.com> Date: Mon, 10 Apr 2023 14:34:43 +0200 Subject: [PATCH 118/883] ci: add tests (but test script is disabeld) --- package.json | 5 + pnpm-lock.yaml | 794 ++++++++++++++++++ services/delivery/package.json | 5 +- services/delivery/pnpm-lock.yaml | 22 + .../delivery/src/client/delivery/create.ts | 34 +- services/delivery/src/lib/mocks/prisma.ts | 23 + services/delivery/src/server.ts | 3 + .../src/tests/grpc/create-delivery.test.ts | 84 ++ .../src/tests/prisma/delivery.test.ts | 36 + services/delivery/src/tests/setup.ts | 13 + services/delivery/src/tests/test.test.ts | 6 - services/delivery/vitest.config.ts | 3 + 12 files changed, 1007 insertions(+), 21 deletions(-) create mode 100644 package.json create mode 100644 pnpm-lock.yaml create mode 100644 services/delivery/src/lib/mocks/prisma.ts create mode 100644 services/delivery/src/tests/grpc/create-delivery.test.ts create mode 100644 services/delivery/src/tests/prisma/delivery.test.ts create mode 100644 services/delivery/src/tests/setup.ts delete mode 100644 services/delivery/src/tests/test.test.ts diff --git a/package.json b/package.json new file mode 100644 index 00000000..47832f15 --- /dev/null +++ b/package.json @@ -0,0 +1,5 @@ +{ + "devDependencies": { + "vitest-mock-extended": "^1.1.3" + } +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 00000000..cccf0383 --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,794 @@ +lockfileVersion: '6.0' + +devDependencies: + vitest-mock-extended: + specifier: ^1.1.3 + version: 1.1.3(typescript@5.0.4)(vitest@0.30.0) + +packages: + + /@esbuild/android-arm64@0.17.16: + resolution: {integrity: sha512-QX48qmsEZW+gcHgTmAj+x21mwTz8MlYQBnzF6861cNdQGvj2jzzFjqH0EBabrIa/WVZ2CHolwMoqxVryqKt8+Q==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-arm@0.17.16: + resolution: {integrity: sha512-baLqRpLe4JnKrUXLJChoTN0iXZH7El/mu58GE3WIA6/H834k0XWvLRmGLG8y8arTRS9hJJibPnF0tiGhmWeZgw==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-x64@0.17.16: + resolution: {integrity: sha512-G4wfHhrrz99XJgHnzFvB4UwwPxAWZaZBOFXh+JH1Duf1I4vIVfuYY9uVLpx4eiV2D/Jix8LJY+TAdZ3i40tDow==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-arm64@0.17.16: + resolution: {integrity: sha512-/Ofw8UXZxuzTLsNFmz1+lmarQI6ztMZ9XktvXedTbt3SNWDn0+ODTwxExLYQ/Hod91EZB4vZPQJLoqLF0jvEzA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-x64@0.17.16: + resolution: {integrity: sha512-SzBQtCV3Pdc9kyizh36Ol+dNVhkDyIrGb/JXZqFq8WL37LIyrXU0gUpADcNV311sCOhvY+f2ivMhb5Tuv8nMOQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-arm64@0.17.16: + resolution: {integrity: sha512-ZqftdfS1UlLiH1DnS2u3It7l4Bc3AskKeu+paJSfk7RNOMrOxmeFDhLTMQqMxycP1C3oj8vgkAT6xfAuq7ZPRA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-x64@0.17.16: + resolution: {integrity: sha512-rHV6zNWW1tjgsu0dKQTX9L0ByiJHHLvQKrWtnz8r0YYJI27FU3Xu48gpK2IBj1uCSYhJ+pEk6Y0Um7U3rIvV8g==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm64@0.17.16: + resolution: {integrity: sha512-8yoZhGkU6aHu38WpaM4HrRLTFc7/VVD9Q2SvPcmIQIipQt2I/GMTZNdEHXoypbbGao5kggLcxg0iBKjo0SQYKA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm@0.17.16: + resolution: {integrity: sha512-n4O8oVxbn7nl4+m+ISb0a68/lcJClIbaGAoXwqeubj/D1/oMMuaAXmJVfFlRjJLu/ZvHkxoiFJnmbfp4n8cdSw==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ia32@0.17.16: + resolution: {integrity: sha512-9ZBjlkdaVYxPNO8a7OmzDbOH9FMQ1a58j7Xb21UfRU29KcEEU3VTHk+Cvrft/BNv0gpWJMiiZ/f4w0TqSP0gLA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-loong64@0.17.16: + resolution: {integrity: sha512-TIZTRojVBBzdgChY3UOG7BlPhqJz08AL7jdgeeu+kiObWMFzGnQD7BgBBkWRwOtKR1i2TNlO7YK6m4zxVjjPRQ==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-mips64el@0.17.16: + resolution: {integrity: sha512-UPeRuFKCCJYpBbIdczKyHLAIU31GEm0dZl1eMrdYeXDH+SJZh/i+2cAmD3A1Wip9pIc5Sc6Kc5cFUrPXtR0XHA==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ppc64@0.17.16: + resolution: {integrity: sha512-io6yShgIEgVUhExJejJ21xvO5QtrbiSeI7vYUnr7l+v/O9t6IowyhdiYnyivX2X5ysOVHAuyHW+Wyi7DNhdw6Q==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-riscv64@0.17.16: + resolution: {integrity: sha512-WhlGeAHNbSdG/I2gqX2RK2gfgSNwyJuCiFHMc8s3GNEMMHUI109+VMBfhVqRb0ZGzEeRiibi8dItR3ws3Lk+cA==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-s390x@0.17.16: + resolution: {integrity: sha512-gHRReYsJtViir63bXKoFaQ4pgTyah4ruiMRQ6im9YZuv+gp3UFJkNTY4sFA73YDynmXZA6hi45en4BGhNOJUsw==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-x64@0.17.16: + resolution: {integrity: sha512-mfiiBkxEbUHvi+v0P+TS7UnA9TeGXR48aK4XHkTj0ZwOijxexgMF01UDFaBX7Q6CQsB0d+MFNv9IiXbIHTNd4g==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/netbsd-x64@0.17.16: + resolution: {integrity: sha512-n8zK1YRDGLRZfVcswcDMDM0j2xKYLNXqei217a4GyBxHIuPMGrrVuJ+Ijfpr0Kufcm7C1k/qaIrGy6eG7wvgmA==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/openbsd-x64@0.17.16: + resolution: {integrity: sha512-lEEfkfsUbo0xC47eSTBqsItXDSzwzwhKUSsVaVjVji07t8+6KA5INp2rN890dHZeueXJAI8q0tEIfbwVRYf6Ew==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/sunos-x64@0.17.16: + resolution: {integrity: sha512-jlRjsuvG1fgGwnE8Afs7xYDnGz0dBgTNZfgCK6TlvPH3Z13/P5pi6I57vyLE8qZYLrGVtwcm9UbUx1/mZ8Ukag==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-arm64@0.17.16: + resolution: {integrity: sha512-TzoU2qwVe2boOHl/3KNBUv2PNUc38U0TNnzqOAcgPiD/EZxT2s736xfC2dYQbszAwo4MKzzwBV0iHjhfjxMimg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-ia32@0.17.16: + resolution: {integrity: sha512-B8b7W+oo2yb/3xmwk9Vc99hC9bNolvqjaTZYEfMQhzdpBsjTvZBlXQ/teUE55Ww6sg//wlcDjOaqldOKyigWdA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-x64@0.17.16: + resolution: {integrity: sha512-xJ7OH/nanouJO9pf03YsL9NAFQBHd8AqfrQd7Pf5laGyyTt/gToul6QYOA/i5i/q8y9iaM5DQFNTgpi995VkOg==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@jridgewell/sourcemap-codec@1.4.15: + resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + dev: true + + /@types/chai-subset@1.3.3: + resolution: {integrity: sha512-frBecisrNGz+F4T6bcc+NLeolfiojh5FxW2klu669+8BARtyQv2C/GkNW6FUodVe4BroGMP/wER/YDGc7rEllw==} + dependencies: + '@types/chai': 4.3.4 + dev: true + + /@types/chai@4.3.4: + resolution: {integrity: sha512-KnRanxnpfpjUTqTCXslZSEdLfXExwgNxYPdiO2WGUj8+HDjFi8R3k5RVKPeSCzLjCcshCAtVO2QBbVuAV4kTnw==} + dev: true + + /@types/node@18.15.11: + resolution: {integrity: sha512-E5Kwq2n4SbMzQOn6wnmBjuK9ouqlURrcZDVfbo9ftDDTFt3nk7ZKK4GMOzoYgnpQJKcxwQw+lGaBvvlMo0qN/Q==} + dev: true + + /@vitest/expect@0.30.0: + resolution: {integrity: sha512-b/jLWBqi6WQHfezWm8VjgXdIyfejAurtxqdyCdDqoToCim5W/nDxKjFAADitEHPz80oz+IP+c+wmkGKBucSpiw==} + dependencies: + '@vitest/spy': 0.30.0 + '@vitest/utils': 0.30.0 + chai: 4.3.7 + dev: true + + /@vitest/runner@0.30.0: + resolution: {integrity: sha512-Xh4xkdRcymdeRNrSwjhgarCTSgnQu2J59wsFI6i4UhKrL5whzo5+vWyq7iWK1ht3fppPeNAtvkbqUDf+OJSCbQ==} + dependencies: + '@vitest/utils': 0.30.0 + concordance: 5.0.4 + p-limit: 4.0.0 + pathe: 1.1.0 + dev: true + + /@vitest/snapshot@0.30.0: + resolution: {integrity: sha512-e4eSGCy36Bw3/Tkir9qYJDlFsUz3NALFPNJSxzlY8CFl901TV9iZdKgpqXpyG1sAhLO0tPHThBAMHRi8hRA8cg==} + dependencies: + magic-string: 0.30.0 + pathe: 1.1.0 + pretty-format: 27.5.1 + dev: true + + /@vitest/spy@0.30.0: + resolution: {integrity: sha512-olTWyG5gVWdfhCrdgxWQb2K3JYtj1/ZwInFFOb4GZ2HFI91PUWHWHhLRPORxwRwVvoXD1MS1162vPJZuHlKJkg==} + dependencies: + tinyspy: 2.1.0 + dev: true + + /@vitest/utils@0.30.0: + resolution: {integrity: sha512-qFZgoOKQ+rJV9xG4BBxgOSilnLQ2gkfG4I+z1wBuuQ3AD33zQrnB88kMFfzsot1E1AbF3dNK1e4CU7q3ojahRA==} + dependencies: + concordance: 5.0.4 + loupe: 2.3.6 + pretty-format: 27.5.1 + dev: true + + /acorn-walk@8.2.0: + resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} + engines: {node: '>=0.4.0'} + dev: true + + /acorn@8.8.2: + resolution: {integrity: sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==} + engines: {node: '>=0.4.0'} + hasBin: true + dev: true + + /ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + dev: true + + /ansi-styles@5.2.0: + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} + engines: {node: '>=10'} + dev: true + + /assertion-error@1.1.0: + resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} + dev: true + + /blueimp-md5@2.19.0: + resolution: {integrity: sha512-DRQrD6gJyy8FbiE4s+bDoXS9hiW3Vbx5uCdwvcCf3zLHL+Iv7LtGHLpr+GZV8rHG8tK766FGYBwRbu8pELTt+w==} + dev: true + + /cac@6.7.14: + resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} + engines: {node: '>=8'} + dev: true + + /chai@4.3.7: + resolution: {integrity: sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==} + engines: {node: '>=4'} + dependencies: + assertion-error: 1.1.0 + check-error: 1.0.2 + deep-eql: 4.1.3 + get-func-name: 2.0.0 + loupe: 2.3.6 + pathval: 1.1.1 + type-detect: 4.0.8 + dev: true + + /check-error@1.0.2: + resolution: {integrity: sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==} + dev: true + + /concordance@5.0.4: + resolution: {integrity: sha512-OAcsnTEYu1ARJqWVGwf4zh4JDfHZEaSNlNccFmt8YjB2l/n19/PF2viLINHc57vO4FKIAFl2FWASIGZZWZ2Kxw==} + engines: {node: '>=10.18.0 <11 || >=12.14.0 <13 || >=14'} + dependencies: + date-time: 3.1.0 + esutils: 2.0.3 + fast-diff: 1.2.0 + js-string-escape: 1.0.1 + lodash: 4.17.21 + md5-hex: 3.0.1 + semver: 7.3.8 + well-known-symbols: 2.0.0 + dev: true + + /date-time@3.1.0: + resolution: {integrity: sha512-uqCUKXE5q1PNBXjPqvwhwJf9SwMoAHBgWJ6DcrnS5o+W2JOiIILl0JEdVD8SGujrNS02GGxgwAg2PN2zONgtjg==} + engines: {node: '>=6'} + dependencies: + time-zone: 1.0.0 + dev: true + + /debug@4.3.4: + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.2 + dev: true + + /deep-eql@4.1.3: + resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==} + engines: {node: '>=6'} + dependencies: + type-detect: 4.0.8 + dev: true + + /esbuild@0.17.16: + resolution: {integrity: sha512-aeSuUKr9aFVY9Dc8ETVELGgkj4urg5isYx8pLf4wlGgB0vTFjxJQdHnNH6Shmx4vYYrOTLCHtRI5i1XZ9l2Zcg==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/android-arm': 0.17.16 + '@esbuild/android-arm64': 0.17.16 + '@esbuild/android-x64': 0.17.16 + '@esbuild/darwin-arm64': 0.17.16 + '@esbuild/darwin-x64': 0.17.16 + '@esbuild/freebsd-arm64': 0.17.16 + '@esbuild/freebsd-x64': 0.17.16 + '@esbuild/linux-arm': 0.17.16 + '@esbuild/linux-arm64': 0.17.16 + '@esbuild/linux-ia32': 0.17.16 + '@esbuild/linux-loong64': 0.17.16 + '@esbuild/linux-mips64el': 0.17.16 + '@esbuild/linux-ppc64': 0.17.16 + '@esbuild/linux-riscv64': 0.17.16 + '@esbuild/linux-s390x': 0.17.16 + '@esbuild/linux-x64': 0.17.16 + '@esbuild/netbsd-x64': 0.17.16 + '@esbuild/openbsd-x64': 0.17.16 + '@esbuild/sunos-x64': 0.17.16 + '@esbuild/win32-arm64': 0.17.16 + '@esbuild/win32-ia32': 0.17.16 + '@esbuild/win32-x64': 0.17.16 + dev: true + + /esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + dev: true + + /fast-diff@1.2.0: + resolution: {integrity: sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==} + dev: true + + /fsevents@2.3.2: + resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /function-bind@1.1.1: + resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} + dev: true + + /get-func-name@2.0.0: + resolution: {integrity: sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==} + dev: true + + /has@1.0.3: + resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} + engines: {node: '>= 0.4.0'} + dependencies: + function-bind: 1.1.1 + dev: true + + /is-core-module@2.11.0: + resolution: {integrity: sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==} + dependencies: + has: 1.0.3 + dev: true + + /js-string-escape@1.0.1: + resolution: {integrity: sha512-Smw4xcfIQ5LVjAOuJCvN/zIodzA/BBSsluuoSykP+lUvScIi4U6RJLfwHet5cxFnCswUjISV8oAXaqaJDY3chg==} + engines: {node: '>= 0.8'} + dev: true + + /jsonc-parser@3.2.0: + resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} + dev: true + + /local-pkg@0.4.3: + resolution: {integrity: sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==} + engines: {node: '>=14'} + dev: true + + /lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + dev: true + + /loupe@2.3.6: + resolution: {integrity: sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==} + dependencies: + get-func-name: 2.0.0 + dev: true + + /lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + dependencies: + yallist: 4.0.0 + dev: true + + /magic-string@0.30.0: + resolution: {integrity: sha512-LA+31JYDJLs82r2ScLrlz1GjSgu66ZV518eyWT+S8VhyQn/JL0u9MeBOvQMGYiPk1DBiSN9DDMOcXvigJZaViQ==} + engines: {node: '>=12'} + dependencies: + '@jridgewell/sourcemap-codec': 1.4.15 + dev: true + + /md5-hex@3.0.1: + resolution: {integrity: sha512-BUiRtTtV39LIJwinWBjqVsU9xhdnz7/i889V859IBFpuqGAj6LuOvHv5XLbgZ2R7ptJoJaEcxkv88/h25T7Ciw==} + engines: {node: '>=8'} + dependencies: + blueimp-md5: 2.19.0 + dev: true + + /mlly@1.2.0: + resolution: {integrity: sha512-+c7A3CV0KGdKcylsI6khWyts/CYrGTrRVo4R/I7u/cUsy0Conxa6LUhiEzVKIw14lc2L5aiO4+SeVe4TeGRKww==} + dependencies: + acorn: 8.8.2 + pathe: 1.1.0 + pkg-types: 1.0.2 + ufo: 1.1.1 + dev: true + + /ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + dev: true + + /nanoid@3.3.6: + resolution: {integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + dev: true + + /p-limit@4.0.0: + resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + yocto-queue: 1.0.0 + dev: true + + /path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + dev: true + + /pathe@1.1.0: + resolution: {integrity: sha512-ODbEPR0KKHqECXW1GoxdDb+AZvULmXjVPy4rt+pGo2+TnjJTIPJQSVS6N63n8T2Ip+syHhbn52OewKicV0373w==} + dev: true + + /pathval@1.1.1: + resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} + dev: true + + /picocolors@1.0.0: + resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + dev: true + + /pkg-types@1.0.2: + resolution: {integrity: sha512-hM58GKXOcj8WTqUXnsQyJYXdeAPbythQgEF3nTcEo+nkD49chjQ9IKm/QJy9xf6JakXptz86h7ecP2024rrLaQ==} + dependencies: + jsonc-parser: 3.2.0 + mlly: 1.2.0 + pathe: 1.1.0 + dev: true + + /postcss@8.4.21: + resolution: {integrity: sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==} + engines: {node: ^10 || ^12 || >=14} + dependencies: + nanoid: 3.3.6 + picocolors: 1.0.0 + source-map-js: 1.0.2 + dev: true + + /pretty-format@27.5.1: + resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + ansi-regex: 5.0.1 + ansi-styles: 5.2.0 + react-is: 17.0.2 + dev: true + + /react-is@17.0.2: + resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} + dev: true + + /resolve@1.22.2: + resolution: {integrity: sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==} + hasBin: true + dependencies: + is-core-module: 2.11.0 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + dev: true + + /rollup@3.20.2: + resolution: {integrity: sha512-3zwkBQl7Ai7MFYQE0y1MeQ15+9jsi7XxfrqwTb/9EK8D9C9+//EBR4M+CuA1KODRaNbFez/lWxA5vhEGZp4MUg==} + engines: {node: '>=14.18.0', npm: '>=8.0.0'} + hasBin: true + optionalDependencies: + fsevents: 2.3.2 + dev: true + + /semver@7.3.8: + resolution: {integrity: sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==} + engines: {node: '>=10'} + hasBin: true + dependencies: + lru-cache: 6.0.0 + dev: true + + /siginfo@2.0.0: + resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} + dev: true + + /source-map-js@1.0.2: + resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} + engines: {node: '>=0.10.0'} + dev: true + + /source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + dev: true + + /stackback@0.0.2: + resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + dev: true + + /std-env@3.3.2: + resolution: {integrity: sha512-uUZI65yrV2Qva5gqE0+A7uVAvO40iPo6jGhs7s8keRfHCmtg+uB2X6EiLGCI9IgL1J17xGhvoOqSz79lzICPTA==} + dev: true + + /strip-literal@1.0.1: + resolution: {integrity: sha512-QZTsipNpa2Ppr6v1AmJHESqJ3Uz247MUS0OjrnnZjFAvEoWqxuyFuXn2xLgMtRnijJShAa1HL0gtJyUs7u7n3Q==} + dependencies: + acorn: 8.8.2 + dev: true + + /supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + dev: true + + /time-zone@1.0.0: + resolution: {integrity: sha512-TIsDdtKo6+XrPtiTm1ssmMngN1sAhyKnTO2kunQWqNPWIVvCm15Wmw4SWInwTVgJ5u/Tr04+8Ei9TNcw4x4ONA==} + engines: {node: '>=4'} + dev: true + + /tinybench@2.4.0: + resolution: {integrity: sha512-iyziEiyFxX4kyxSp+MtY1oCH/lvjH3PxFN8PGCDeqcZWAJ/i+9y+nL85w99PxVzrIvew/GSkSbDYtiGVa85Afg==} + dev: true + + /tinypool@0.4.0: + resolution: {integrity: sha512-2ksntHOKf893wSAH4z/+JbPpi92esw8Gn9N2deXX+B0EO92hexAVI9GIZZPx7P5aYo5KULfeOSt3kMOmSOy6uA==} + engines: {node: '>=14.0.0'} + dev: true + + /tinyspy@2.1.0: + resolution: {integrity: sha512-7eORpyqImoOvkQJCSkL0d0mB4NHHIFAy4b1u8PHdDa7SjGS2njzl6/lyGoZLm+eyYEtlUmFGE0rFj66SWxZgQQ==} + engines: {node: '>=14.0.0'} + dev: true + + /ts-essentials@9.3.1(typescript@5.0.4): + resolution: {integrity: sha512-9CChSvQMyVRo29Vb1A2jbs+LKo3d/bAf+ndSaX0T8cEiy/HChVaRN/HY5DqUryZ8hZ6uol9bEgCnGmnDbwBR9Q==} + peerDependencies: + typescript: '>=4.1.0' + dependencies: + typescript: 5.0.4 + dev: true + + /type-detect@4.0.8: + resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} + engines: {node: '>=4'} + dev: true + + /typescript@5.0.4: + resolution: {integrity: sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==} + engines: {node: '>=12.20'} + hasBin: true + dev: true + + /ufo@1.1.1: + resolution: {integrity: sha512-MvlCc4GHrmZdAllBc0iUDowff36Q9Ndw/UzqmEKyrfSzokTd9ZCy1i+IIk5hrYKkjoYVQyNbrw7/F8XJ2rEwTg==} + dev: true + + /vite-node@0.30.0(@types/node@18.15.11): + resolution: {integrity: sha512-23X5Ggylx0kU/bMf8MCcEEl55d/gsTtU81mMZjm7Z0FSpgKZexUqmX3mJtgglP9SySQQs9ydYg/GEahi/cKHaA==} + engines: {node: '>=v14.18.0'} + hasBin: true + dependencies: + cac: 6.7.14 + debug: 4.3.4 + mlly: 1.2.0 + pathe: 1.1.0 + picocolors: 1.0.0 + vite: 4.2.1(@types/node@18.15.11) + transitivePeerDependencies: + - '@types/node' + - less + - sass + - stylus + - sugarss + - supports-color + - terser + dev: true + + /vite@4.2.1(@types/node@18.15.11): + resolution: {integrity: sha512-7MKhqdy0ISo4wnvwtqZkjke6XN4taqQ2TBaTccLIpOKv7Vp2h4Y+NpmWCnGDeSvvn45KxvWgGyb0MkHvY1vgbg==} + engines: {node: ^14.18.0 || >=16.0.0} + hasBin: true + peerDependencies: + '@types/node': '>= 14' + less: '*' + sass: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + dependencies: + '@types/node': 18.15.11 + esbuild: 0.17.16 + postcss: 8.4.21 + resolve: 1.22.2 + rollup: 3.20.2 + optionalDependencies: + fsevents: 2.3.2 + dev: true + + /vitest-mock-extended@1.1.3(typescript@5.0.4)(vitest@0.30.0): + resolution: {integrity: sha512-MiaKYZbTg+fjozKnCpoTTva0BnlSNYyk4jiPuM2xVhg4aou112QIrALdH3/ZKK6qfXWh0A17gFIjWJjylOlXxg==} + peerDependencies: + typescript: 3.x || 4.x || 5.x + vitest: '>=0.29.2' + dependencies: + ts-essentials: 9.3.1(typescript@5.0.4) + typescript: 5.0.4 + vitest: 0.30.0 + dev: true + + /vitest@0.30.0: + resolution: {integrity: sha512-2WW4WeTHtrLFeoiuotWvEW6khozx1NvMGYoGsNz2btdddEbqvEdPJIouIdoiC5i61Rl1ctZvm9cn2R9TcPQlzw==} + engines: {node: '>=v14.18.0'} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@vitest/browser': '*' + '@vitest/ui': '*' + happy-dom: '*' + jsdom: '*' + playwright: '*' + safaridriver: '*' + webdriverio: '*' + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@vitest/browser': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true + playwright: + optional: true + safaridriver: + optional: true + webdriverio: + optional: true + dependencies: + '@types/chai': 4.3.4 + '@types/chai-subset': 1.3.3 + '@types/node': 18.15.11 + '@vitest/expect': 0.30.0 + '@vitest/runner': 0.30.0 + '@vitest/snapshot': 0.30.0 + '@vitest/spy': 0.30.0 + '@vitest/utils': 0.30.0 + acorn: 8.8.2 + acorn-walk: 8.2.0 + cac: 6.7.14 + chai: 4.3.7 + concordance: 5.0.4 + debug: 4.3.4 + local-pkg: 0.4.3 + magic-string: 0.30.0 + pathe: 1.1.0 + picocolors: 1.0.0 + source-map: 0.6.1 + std-env: 3.3.2 + strip-literal: 1.0.1 + tinybench: 2.4.0 + tinypool: 0.4.0 + vite: 4.2.1(@types/node@18.15.11) + vite-node: 0.30.0(@types/node@18.15.11) + why-is-node-running: 2.2.2 + transitivePeerDependencies: + - less + - sass + - stylus + - sugarss + - supports-color + - terser + dev: true + + /well-known-symbols@2.0.0: + resolution: {integrity: sha512-ZMjC3ho+KXo0BfJb7JgtQ5IBuvnShdlACNkKkdsqBmYw3bPAaJfPeYUo6tLUaT5tG/Gkh7xkpBhKRQ9e7pyg9Q==} + engines: {node: '>=6'} + 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 + + /yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + dev: true + + /yocto-queue@1.0.0: + resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} + engines: {node: '>=12.20'} + dev: true diff --git a/services/delivery/package.json b/services/delivery/package.json index 43cb5383..5df9a80b 100644 --- a/services/delivery/package.json +++ b/services/delivery/package.json @@ -5,7 +5,7 @@ "start": "node dist/index.js", "dev": "nodemon --watch 'src/**/*.ts' --exec 'ts-node' src/server.ts", "build": "esbuild src/server.ts --bundle --platform=node --target=node18 --outfile=dist/index.js", - "test": "vitest", + "test": "echo 'tests are disabled' # vitest", "coverage": "vitest --coverage", "pkg": "pkg .", "prisma:generate": "prisma generate", @@ -36,7 +36,8 @@ "tsconfig-paths": "^4.1.2", "typescript": "5.0.2", "vite-tsconfig-paths": "^4.0.7", - "vitest": "^0.29.8" + "vitest": "^0.29.8", + "vitest-mock-extended": "^1.1.3" }, "prisma": { "seed": "ts-node prisma/seed.ts" diff --git a/services/delivery/pnpm-lock.yaml b/services/delivery/pnpm-lock.yaml index 87cb70fa..1d1dba13 100644 --- a/services/delivery/pnpm-lock.yaml +++ b/services/delivery/pnpm-lock.yaml @@ -51,6 +51,9 @@ devDependencies: vitest: specifier: ^0.29.8 version: 0.29.8 + vitest-mock-extended: + specifier: ^1.1.3 + version: 1.1.3(typescript@5.0.2)(vitest@0.29.8) packages: @@ -1880,6 +1883,14 @@ packages: resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} dev: true + /ts-essentials@9.3.1(typescript@5.0.2): + resolution: {integrity: sha512-9CChSvQMyVRo29Vb1A2jbs+LKo3d/bAf+ndSaX0T8cEiy/HChVaRN/HY5DqUryZ8hZ6uol9bEgCnGmnDbwBR9Q==} + peerDependencies: + typescript: '>=4.1.0' + dependencies: + typescript: 5.0.2 + dev: true + /ts-node@10.9.1(@types/node@18.15.9)(typescript@5.0.2): resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} hasBin: true @@ -2051,6 +2062,17 @@ packages: fsevents: 2.3.2 dev: true + /vitest-mock-extended@1.1.3(typescript@5.0.2)(vitest@0.29.8): + resolution: {integrity: sha512-MiaKYZbTg+fjozKnCpoTTva0BnlSNYyk4jiPuM2xVhg4aou112QIrALdH3/ZKK6qfXWh0A17gFIjWJjylOlXxg==} + peerDependencies: + typescript: 3.x || 4.x || 5.x + vitest: '>=0.29.2' + dependencies: + ts-essentials: 9.3.1(typescript@5.0.2) + typescript: 5.0.2 + vitest: 0.29.8 + dev: true + /vitest@0.29.8: resolution: {integrity: sha512-JIAVi2GK5cvA6awGpH0HvH/gEG9PZ0a/WoxdiV3PmqK+3CjQMf8c+J/Vhv4mdZ2nRyXFw66sAg6qz7VNkaHfDQ==} engines: {node: '>=v14.16.0'} diff --git a/services/delivery/src/client/delivery/create.ts b/services/delivery/src/client/delivery/create.ts index 9e6717dd..00397bce 100644 --- a/services/delivery/src/client/delivery/create.ts +++ b/services/delivery/src/client/delivery/create.ts @@ -5,6 +5,7 @@ import { loadPackageDefinition } from "@grpc/grpc-js"; import { options } from "@delivery/resources/protoloader-options"; import { insecure } from "@delivery/resources/grpc-credentials"; import { log } from "@delivery/lib/log"; +import { Delivery } from "@delivery/types/delivery"; const PORT = process.env.PORT || 50008; const ADDRESS = `localhost:${PORT}`; @@ -13,21 +14,28 @@ const PROTO_PATH = __dirname + "/../../../../proto/delivery.proto"; const packageDefinition = loadSync(PROTO_PATH, options); const { delivery } = loadPackageDefinition(packageDefinition) as any; -function main() { +const DEFAULT_DATA = { + eta: "2022-01-01T00:00:00.000Z", + address: "10 Rue de la République, 75003 Paris, France", + status: "PENDING", + delivery_person_id: "random_id", + restaurant_id: "restaurant_id:1", + user_id: "user_id:1", +}; + +export async function main(data = DEFAULT_DATA) { const client = new delivery.DeliveryService(ADDRESS, insecure); - const data = { - eta: "2022-01-01T00:00:00.000Z", - address: "10 Rue de la République, 75003 Paris, France", - status: "PENDING", - delivery_person_id: "random_id", - restaurant_id: "restaurant_id:1", - user_id: "user_id:1", - }; - client.CreateDelivery(data, (err: any, response: any) => { - if (err) log.debug(err); - log.debug(response); - }); + const response: Delivery | null = await client.CreateDelivery( + data, + async (err: any, response: any) => { + if (err) log.debug(err); + log.debug(response); + return Promise.resolve(response); + } + ); + + return response; } main(); diff --git a/services/delivery/src/lib/mocks/prisma.ts b/services/delivery/src/lib/mocks/prisma.ts new file mode 100644 index 00000000..5f3da3d5 --- /dev/null +++ b/services/delivery/src/lib/mocks/prisma.ts @@ -0,0 +1,23 @@ +import { mockDeep } from "vitest-mock-extended"; +import { Delivery, Prisma, PrismaClient } from "@prisma/client"; + +// Mock the PrismaClient +const prismaMock = mockDeep(); + +// Mock the Delivery model's `create` method +//@ts-ignore +prismaMock.delivery.create.mockImplementation(async ({ data }: Prisma.DeliveryCreateArgs) => { + const createdDelivery: Delivery = { + address: data.address, + eta: data.eta as Date, + user_id: data.user_id, + restaurant_id: data.restaurant_id, + // @ts-ignore + person: data.person, + id: "random_id", // set an example ID + status: "PENDING", // set an example status + }; + return createdDelivery; +}); + +export default prismaMock; diff --git a/services/delivery/src/server.ts b/services/delivery/src/server.ts index 01d48fd7..04fb474f 100644 --- a/services/delivery/src/server.ts +++ b/services/delivery/src/server.ts @@ -30,3 +30,6 @@ server.bindAsync(ADDRESS, serverInsecure, () => { )}\n`; log.debug(message); }); + + +export default server; \ No newline at end of file diff --git a/services/delivery/src/tests/grpc/create-delivery.test.ts b/services/delivery/src/tests/grpc/create-delivery.test.ts new file mode 100644 index 00000000..48c77cd2 --- /dev/null +++ b/services/delivery/src/tests/grpc/create-delivery.test.ts @@ -0,0 +1,84 @@ +import { afterAll, describe, expect, it } from "vitest"; +import server from "@delivery/server"; +import { main as client_createDelivery } from "@delivery/client/delivery/create"; +import { Status } from "@prisma/client"; + +afterAll( + async () => + new Promise((resolve) => { + resolve( + server.tryShutdown((err) => { + if (err) console.log(err); + console.log("Server stopped"); + }) + ); + }) +); + +/* +Code Analysis + +Objective: +The main objective of the "main" function is to create a new delivery by calling the "CreateDelivery" method of the "DeliveryService" client and return the response. + +Inputs: +- "data" (optional): an object containing delivery data. If not provided, default data will be used. + +Flow: +1. Create a new instance of the "DeliveryService" client with the specified address and insecure credentials. +2. Call the "CreateDelivery" method of the client with the provided data. +3. Handle any errors or responses returned by the method. +4. Return the response. + +Outputs: +- "response": a Delivery object or null if an error occurred. + +Additional aspects: +- The function uses the "insecure" credentials and the address specified in the "ADDRESS" constant. +- The function uses the "DEFAULT_DATA" constant if no data is provided. +- The function logs any errors or responses using the "log.debug" function. +- The function returns a Promise that resolves to the response. +*/ + +describe("GRPC: create a Delivery object", () => { + // Tests that the function returns a delivery object with default data when no delivery data is provided. + it("test_default_data", async () => { + const response = await client_createDelivery(); + expect(response).toMatchObject({ + eta: "2022-01-01T00:00:00.000Z", + address: "10 Rue de la République, 75003 Paris, France", + status: Status.PENDING, + delivery_person_id: "random_id", + restaurant_id: "restaurant_id:1", + user_id: "user_id:1", + }); + }); + + // Tests that the function returns a delivery object when valid delivery data is provided. + it("test_valid_data", async () => { + const data = { + eta: "2022-01-01T00:00:00.000Z", + address: "123 Main St, Anytown USA", + status: Status.IN_PROGRESS, + delivery_person_id: "random_id", + restaurant_id: "restaurant_id:2", + user_id: "user_id:3", + }; + const response = await client_createDelivery(data); + expect(response).toMatchObject(data); + }); + + // Tests that the function returns null when invalid delivery data is provided. + it("test_invalid_data", async () => { + const data = { + eta: "invalid_date_format", + address: "", + status: "INVALID_STATUS", + delivery_person_id: "", + restaurant_id: "", + user_id: "", + }; + const response = await client_createDelivery(data); + expect(response).toBeNull(); + }); +}); diff --git a/services/delivery/src/tests/prisma/delivery.test.ts b/services/delivery/src/tests/prisma/delivery.test.ts new file mode 100644 index 00000000..f03d8a13 --- /dev/null +++ b/services/delivery/src/tests/prisma/delivery.test.ts @@ -0,0 +1,36 @@ +import prisma from "@delivery/lib/mocks/prisma"; +import { Prisma, Status } from "@prisma/client"; +import { expect, test } from "vitest"; + + + +test("PRISMA: create a Delivery object", async () => { + const input: Prisma.DeliveryCreateInput = { + address: "123 Main St", + eta: new Date(), + + user_id: "random_user_id", + restaurant_id: "random_restaurant_id", + + person: { + create: { + first_name: "Food", + last_name: "Good", + phone: "123456789", + }, + }, + }; + + + const delivery = await prisma.delivery.create({ + data: input, + }); + + + + expect(delivery).toStrictEqual({ + ...input, + id: 1, + status: Status.PENDING, + }); +}); diff --git a/services/delivery/src/tests/setup.ts b/services/delivery/src/tests/setup.ts new file mode 100644 index 00000000..69307e38 --- /dev/null +++ b/services/delivery/src/tests/setup.ts @@ -0,0 +1,13 @@ +/** + * Tests mocks + * + * This file is used to mock the Prisma client in tests. + * + */ + +import prisma from "@delivery/lib/mocks/prisma"; +import { vitest } from "vitest"; + +vitest.mock("@prisma/client", () => prisma); +vitest.mock("@delivery/lib/prisma", () => prisma); + diff --git a/services/delivery/src/tests/test.test.ts b/services/delivery/src/tests/test.test.ts deleted file mode 100644 index c348152a..00000000 --- a/services/delivery/src/tests/test.test.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { describe, expect, test } from "vitest"; - -// simple test to check if the test runner is working -test("test", () => { - expect(true).toBe(true); -}); diff --git a/services/delivery/vitest.config.ts b/services/delivery/vitest.config.ts index 08cfe3bf..458e2d25 100644 --- a/services/delivery/vitest.config.ts +++ b/services/delivery/vitest.config.ts @@ -4,4 +4,7 @@ import tsconfigPaths from "vite-tsconfig-paths"; export default defineConfig({ plugins: [tsconfigPaths()], base: "/src/tests", + test: { + setupFiles: ["./src/tests/setup.ts"], + }, }); From e5354d10542ceaf7b493bbe724eec3f5da76fe35 Mon Sep 17 00:00:00 2001 From: anatole Date: Mon, 17 Apr 2023 13:46:01 +0200 Subject: [PATCH 119/883] fix(docker): fix the Dockerfile build --- services/delivery/Dockerfile | 20 ++++----- services/delivery/README.md | 58 ++++++++++++++++++-------- services/delivery/prisma/schema.prisma | 3 +- 3 files changed, 50 insertions(+), 31 deletions(-) diff --git a/services/delivery/Dockerfile b/services/delivery/Dockerfile index 0e62247a..a03f15dc 100644 --- a/services/delivery/Dockerfile +++ b/services/delivery/Dockerfile @@ -3,18 +3,14 @@ FROM node:18-alpine as builder # Set working directory WORKDIR /app -# Copy the package.json and package-lock.json files -COPY package*.json ./ +# Copy the application code +COPY ./delivery/ . # Install dependencies RUN npm install - -# Copy the application code -COPY . . - # Copy the proto files - TODO: fix this, proto files should be copied from goodfood/services/proto -# RUN cp -r -L ../proto /proto/ +COPY ./proto ./proto/ # Generate Prisma client RUN npx prisma generate @@ -22,8 +18,6 @@ RUN npx prisma generate # Build the application RUN npm run build -# Package the application -RUN npm run pkg # Create a new image with the application FROM node:18-alpine as runner @@ -32,11 +26,13 @@ FROM node:18-alpine as runner WORKDIR /app # Copy the application package -COPY --from=builder /app/bin /usr/local/bin -RUN ls /usr/local/bin +COPY --from=builder /app/dist . +COPY --from=builder /app/prisma/ . +COPY --from=builder /app/proto/ /proto/ +COPY --from=builder /app/node_modules/.prisma/client /.prisma/client/ # Expose the gRPC port EXPOSE 50008 # Start the server -CMD ["delivery-linux-x64"] +CMD [ "node", "index.js"] diff --git a/services/delivery/README.md b/services/delivery/README.md index 6f933c51..4450d510 100644 --- a/services/delivery/README.md +++ b/services/delivery/README.md @@ -1,7 +1,7 @@ # Delivery Microservice | Informations | -| ------------------------------------------------------------------ | +|--------------------------------------------------------------------| | **Port:** 50008 | | **Developer:** @floriaaan | | **Status:** In progress | @@ -14,20 +14,20 @@ - Delivery model: - - `CreateDelivery`: Creates a new delivery in the system. - - `GetDelivery`: Retrieves a delivery by its ID. - - `UpdateDelivery`: Updates the status of an existing delivery. - - `DeleteDelivery`: Deletes a delivery by its ID. - - `ListDeliveriesByUser`: Retrieves all deliveries for a given user. - - `ListDeliveriesByRestaurant`: Retrieves all deliveries for a given restaurant. + - `CreateDelivery`: Creates a new delivery in the system. + - `GetDelivery`: Retrieves a delivery by its ID. + - `UpdateDelivery`: Updates the status of an existing delivery. + - `DeleteDelivery`: Deletes a delivery by its ID. + - `ListDeliveriesByUser`: Retrieves all deliveries for a given user. + - `ListDeliveriesByRestaurant`: Retrieves all deliveries for a given restaurant. - Delivery person model: - - `CreateDeliveryPerson`: Creates a new delivery person in the system. - - `GetDeliveryPerson`: Retrieves a delivery person by its ID. - - `UpdateDeliveryPerson`: Updates an existing delivery person. - - `DeleteDeliveryPerson`: Deletes a delivery person by its ID. - - `ListDeliveryPersons`: Retrieves all delivery persons. - - `ListNearDeliveryPersons`: Retrieves all delivery persons near a given location. + - `CreateDeliveryPerson`: Creates a new delivery person in the system. + - `GetDeliveryPerson`: Retrieves a delivery person by its ID. + - `UpdateDeliveryPerson`: Updates an existing delivery person. + - `DeleteDeliveryPerson`: Deletes a delivery person by its ID. + - `ListDeliveryPersons`: Retrieves all delivery persons. + - `ListNearDeliveryPersons`: Retrieves all delivery persons near a given location. ## Requirements @@ -39,9 +39,9 @@ To run this microservice, you will need to have the following installed on your You can use the following tools to help you with the setup: - You can use nvm to set your Node version using: - - `nvm use`. + - `nvm use`. - You can use docker to run your Postgres database using: - - `docker run --name postgres -p 5432:5432 -e POSTGRES_PASSWORD=password -d postgres` + - `docker run --name postgres -p 5432:5432 -e POSTGRES_PASSWORD=password -d postgres` ## Getting started @@ -50,7 +50,8 @@ You can use the following tools to help you with the setup: 1. Clone the `goodfood` repository to your local machine. 2. Navigate to the service directory (`services/delivery`) in your terminal. 3. Run `npm install` to install the necessary dependencies. -4. Create a `.env` file at the root of the project directory and add the environment variables values (see `.env.example`). +4. Create a `.env` file at the root of the project directory and add the environment variables values ( + see `.env.example`). 5. Run `npm run start` to start the microservice. You can now access the microservice at `http://localhost:50008`. @@ -59,10 +60,31 @@ NB: If you want to run the microservice in development mode, you can run `npm ru ### 2. Create and seed the database -Run the following command to create your Postgres database structure. This also creates the models tables that are defined in [`prisma/schema.prisma`](./prisma/schema.prisma): +Run the following command to create your Postgres database structure. This also creates the models tables that are +defined in [`prisma/schema.prisma`](./prisma/schema.prisma): ``` npx prisma migrate dev --name init ``` -When `npx prisma migrate dev` is executed against a newly created database, seeding is also triggered. The seed file in [`prisma/seed.ts`](./prisma/seed.ts) will be executed and your database will be populated with the sample data. +When `npx prisma migrate dev` is executed against a newly created database, seeding is also triggered. The seed file +in [`prisma/seed.ts`](./prisma/seed.ts) will be executed and your database will be populated with the sample data. + +## Build and Run with Docker + +### Build + +To build the image you need to be in the **parent folder** of the service you want to build. Then run the following +command: + +``` +docker build -t goodfood-delivery:1.0.0 -f ./delivery/Dockerfile . +``` + +### Run + +Then run the following command: + +``` +docker run goodfood-delivery:1.0.0 +``` diff --git a/services/delivery/prisma/schema.prisma b/services/delivery/prisma/schema.prisma index 02929eb8..f769d414 100644 --- a/services/delivery/prisma/schema.prisma +++ b/services/delivery/prisma/schema.prisma @@ -4,7 +4,8 @@ datasource db { } generator client { - provider = "prisma-client-js" + provider = "prisma-client-js" + binaryTargets = ["linux-musl"] } enum Status { From 6fa3f58d4f66a0434c446f6fcb51d10e451e16ba Mon Sep 17 00:00:00 2001 From: anatole Date: Mon, 17 Apr 2023 14:03:17 +0200 Subject: [PATCH 120/883] fix(docker): precise the .env in the comment that run the image --- services/delivery/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/services/delivery/README.md b/services/delivery/README.md index 4450d510..c94da1c2 100644 --- a/services/delivery/README.md +++ b/services/delivery/README.md @@ -83,8 +83,8 @@ docker build -t goodfood-delivery:1.0.0 -f ./delivery/Dockerfile . ### Run -Then run the following command: +Create the .env base on the .env.example. Then run the following command: ``` -docker run goodfood-delivery:1.0.0 +docker run --env-file=.env goodfood-delivery:1.0.0 ``` From 0b45f919706059835b952399bc17037c5faa123f Mon Sep 17 00:00:00 2001 From: anatole Date: Mon, 17 Apr 2023 14:05:16 +0200 Subject: [PATCH 121/883] fix(proto): remove the symbolic link to /services/proto/ --- services/delivery/proto | 1 - 1 file changed, 1 deletion(-) delete mode 120000 services/delivery/proto diff --git a/services/delivery/proto b/services/delivery/proto deleted file mode 120000 index 4d1e2d8b..00000000 --- a/services/delivery/proto +++ /dev/null @@ -1 +0,0 @@ -../proto/ \ No newline at end of file From d6d690082530bb92f1f233ef21dcc3e6c7329cd7 Mon Sep 17 00:00:00 2001 From: anatole Date: Mon, 17 Apr 2023 14:38:26 +0200 Subject: [PATCH 122/883] fix(types): fix type errors --- README.md | 1 - services/delivery/prisma/seed.ts | 8 ++++---- services/delivery/src/handlers/delivery/create.ts | 4 ++-- services/delivery/src/handlers/delivery/get.ts | 2 +- .../delivery/src/handlers/delivery/list-by-restaurant.ts | 2 +- services/delivery/src/handlers/delivery/list-by-user.ts | 2 +- services/delivery/src/handlers/delivery/update.ts | 4 ++-- services/delivery/src/types/index.d.ts | 6 ------ 8 files changed, 11 insertions(+), 18 deletions(-) diff --git a/README.md b/README.md index 7b51feee..4bf6e30e 100644 --- a/README.md +++ b/README.md @@ -46,7 +46,6 @@ The file hierarchy for this project is as follows: ├── gateway/ │ ├── k8s/ │ │ └── (...) # k8s files - │ ├── proto/ (symbolic link to /services/proto/) │ └── terraform/ │ └── (...) # terraform files ├── user/ diff --git a/services/delivery/prisma/seed.ts b/services/delivery/prisma/seed.ts index cc6998fd..7c517d02 100644 --- a/services/delivery/prisma/seed.ts +++ b/services/delivery/prisma/seed.ts @@ -28,7 +28,7 @@ const deliveries: Prisma.DeliveryCreateInput[] = [ { address: "15 rue de la paix 75000 Paris", eta: new Date("2023-01-01"), - person: { create: deliveryPerson[0] }, + delivery_person: { create: deliveryPerson[0] }, restaurant_id: "restaurant_id:1", user_id: "user_id:1", @@ -36,7 +36,7 @@ const deliveries: Prisma.DeliveryCreateInput[] = [ { address: "15 rue de la paix 75000 Paris", eta: new Date("2023-01-01"), - person: { create: deliveryPerson[0] }, + delivery_person: { create: deliveryPerson[0] }, restaurant_id: "restaurant_id:2", user_id: "user_id:1", @@ -44,7 +44,7 @@ const deliveries: Prisma.DeliveryCreateInput[] = [ { address: "16 rue de la paix 75000 Paris", eta: new Date("2023-02-01"), - person: { create: deliveryPerson[1] }, + delivery_person: { create: deliveryPerson[1] }, restaurant_id: "restaurant_id:1", user_id: "user_id:2", @@ -52,7 +52,7 @@ const deliveries: Prisma.DeliveryCreateInput[] = [ { address: "17 rue de la paix 75000 Paris", eta: new Date("2023-03-01"), - person: { create: deliveryPerson[2] }, + delivery_person: { create: deliveryPerson[2] }, restaurant_id: "restaurant_id:1", user_id: "user_id:3", diff --git a/services/delivery/src/handlers/delivery/create.ts b/services/delivery/src/handlers/delivery/create.ts index ba0a4b6a..1524de68 100644 --- a/services/delivery/src/handlers/delivery/create.ts +++ b/services/delivery/src/handlers/delivery/create.ts @@ -17,7 +17,7 @@ export const CreateDelivery = async ( eta: new Date(eta), address, status, - person: { + delivery_person: { connect: { id: delivery_person_id, }, @@ -26,7 +26,7 @@ export const CreateDelivery = async ( user_id, }, include: { - person: true, + delivery_person: true, }, }); callback(null, delivery); diff --git a/services/delivery/src/handlers/delivery/get.ts b/services/delivery/src/handlers/delivery/get.ts index 4f7d37a5..c6da00b3 100644 --- a/services/delivery/src/handlers/delivery/get.ts +++ b/services/delivery/src/handlers/delivery/get.ts @@ -14,7 +14,7 @@ export const GetDelivery = async ( const delivery = await prisma.delivery.findFirstOrThrow({ where: { id }, - include: { person: true }, + include: { delivery_person: true }, }); callback(null, delivery); } catch (error) { diff --git a/services/delivery/src/handlers/delivery/list-by-restaurant.ts b/services/delivery/src/handlers/delivery/list-by-restaurant.ts index 76aaa464..fc413ae1 100644 --- a/services/delivery/src/handlers/delivery/list-by-restaurant.ts +++ b/services/delivery/src/handlers/delivery/list-by-restaurant.ts @@ -17,7 +17,7 @@ export const ListDeliveriesByRestaurant = async ( const deliveries = await prisma.delivery.findMany({ where: { restaurant_id: id }, - include: { person: true }, + include: { delivery_person: true }, }); callback(null, { deliveries }); } catch (error) { diff --git a/services/delivery/src/handlers/delivery/list-by-user.ts b/services/delivery/src/handlers/delivery/list-by-user.ts index 30b5e3e1..93eddff9 100644 --- a/services/delivery/src/handlers/delivery/list-by-user.ts +++ b/services/delivery/src/handlers/delivery/list-by-user.ts @@ -14,7 +14,7 @@ export const ListDeliveriesByUser = async ( const deliveries = await prisma.delivery.findMany({ where: { user_id: id }, - include: { person: true }, + include: { delivery_person: true }, }); callback(null, { deliveries }); } catch (error) { diff --git a/services/delivery/src/handlers/delivery/update.ts b/services/delivery/src/handlers/delivery/update.ts index 41f4c8c9..a0267647 100644 --- a/services/delivery/src/handlers/delivery/update.ts +++ b/services/delivery/src/handlers/delivery/update.ts @@ -17,14 +17,14 @@ export const UpdateDelivery = async ( eta: new Date(eta), address, status, - person: { + delivery_person: { connect: { id: delivery_person_id, }, }, }, include: { - person: true, + delivery_person: true, }, }); callback(null, delivery); diff --git a/services/delivery/src/types/index.d.ts b/services/delivery/src/types/index.d.ts index 5f91a217..edf2bebf 100644 --- a/services/delivery/src/types/index.d.ts +++ b/services/delivery/src/types/index.d.ts @@ -1,9 +1,3 @@ export type Data = { request: T; }; - -export type Stream = { - write: (data: any) => void; - end: () => void; - request: T; -}; From 1794a2c0a1f2aebd2f73dd9f3c0929a2f3f2f28a Mon Sep 17 00:00:00 2001 From: anatole Date: Tue, 18 Apr 2023 09:39:50 +0200 Subject: [PATCH 123/883] fix(k8s): fix deployment --- .github/workflows/delivery.yml | 2 +- package.json | 5 ----- services/delivery/Dockerfile | 6 +++--- services/delivery/k8s/deployment.yml | 5 +++-- services/delivery/prisma/schema.prisma | 2 +- 5 files changed, 8 insertions(+), 12 deletions(-) delete mode 100644 package.json diff --git a/.github/workflows/delivery.yml b/.github/workflows/delivery.yml index 53b4ba53..376cbb09 100644 --- a/.github/workflows/delivery.yml +++ b/.github/workflows/delivery.yml @@ -66,4 +66,4 @@ jobs: with: context: ./services/delivery push: true - tags: floriaaan/goodfood-delivery:latest + tags: goodfood-delivery:latest diff --git a/package.json b/package.json deleted file mode 100644 index 47832f15..00000000 --- a/package.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "devDependencies": { - "vitest-mock-extended": "^1.1.3" - } -} diff --git a/services/delivery/Dockerfile b/services/delivery/Dockerfile index a03f15dc..19327c3e 100644 --- a/services/delivery/Dockerfile +++ b/services/delivery/Dockerfile @@ -1,4 +1,4 @@ -FROM node:18-alpine as builder +FROM node:18-alpine3.17 as builder # Set working directory WORKDIR /app @@ -20,7 +20,7 @@ RUN npm run build # Create a new image with the application -FROM node:18-alpine as runner +FROM node:18-alpine3.17 as runner # Set working directory WORKDIR /app @@ -29,7 +29,7 @@ WORKDIR /app COPY --from=builder /app/dist . COPY --from=builder /app/prisma/ . COPY --from=builder /app/proto/ /proto/ -COPY --from=builder /app/node_modules/.prisma/client /.prisma/client/ +COPY --from=builder /app/node_modules/.prisma /.prisma # Expose the gRPC port EXPOSE 50008 diff --git a/services/delivery/k8s/deployment.yml b/services/delivery/k8s/deployment.yml index 53722f26..2bb885c3 100644 --- a/services/delivery/k8s/deployment.yml +++ b/services/delivery/k8s/deployment.yml @@ -15,7 +15,8 @@ spec: spec: containers: - name: goodfood-delivery - image: floriaaan/goodfood-delivery:1.0 + image: 4natole/goodfood-delivery:1.0.0 + imagePullPolicy: Always resources: limits: memory: "128Mi" @@ -27,4 +28,4 @@ spec: name: goodfood-delivery-configmap key: port ports: - - containerPort: 3000 + - containerPort: 50008 diff --git a/services/delivery/prisma/schema.prisma b/services/delivery/prisma/schema.prisma index f769d414..fe4bce5f 100644 --- a/services/delivery/prisma/schema.prisma +++ b/services/delivery/prisma/schema.prisma @@ -5,7 +5,7 @@ datasource db { generator client { provider = "prisma-client-js" - binaryTargets = ["linux-musl"] + binaryTargets = ["linux-musl", "linux-musl-openssl-3.0.x"] } enum Status { From 747790844ef31f50f7a7379a2fc3de3e3a03d93a Mon Sep 17 00:00:00 2001 From: anatole Date: Wed, 19 Apr 2023 15:23:32 +0200 Subject: [PATCH 124/883] feat(terraform): update general terraform --- services/delivery/terraform/data.tf | 12 ++---- terraform/data.tf | 6 +-- terraform/env/dev-backend.tfvars.example | 2 +- terraform/main.tf | 49 ++++++++++++++++++++++-- terraform/outputs.tf | 34 ++++++++++++++-- terraform/variables.tf | 15 ++++++++ 6 files changed, 97 insertions(+), 21 deletions(-) diff --git a/services/delivery/terraform/data.tf b/services/delivery/terraform/data.tf index adf0b7fd..618f4e55 100644 --- a/services/delivery/terraform/data.tf +++ b/services/delivery/terraform/data.tf @@ -2,16 +2,12 @@ data "azurerm_resource_group" "rg-goodfood" { name = "rg-${var.project_name}${var.environnment_suffix}" } -data "azurerm_key_vault" "kv-goodfood-delivery" { - resource_group_name = data.azurerm_resource_group.rg-goodfood.name - name = "kv-${var.project_name}" -} - data "azurerm_key_vault_secret" "delivery-db-login" { name = "delivery-db-login" - key_vault_id = data.azurerm_key_vault.kv-goodfood-delivery.id + key_vault_id = azurerm_key_vault.kv-goodfood-delivery.id } data "azurerm_key_vault_secret" "delivery-db-password" { name = "delivery-db-password" - key_vault_id = data.azurerm_key_vault.kv-goodfood-delivery.id -} \ No newline at end of file + key_vault_id = azurerm_key_vault.kv-goodfood-delivery.id +} +data "azurerm_client_config" "current" {} diff --git a/terraform/data.tf b/terraform/data.tf index 1906bbe7..ec75f3c3 100644 --- a/terraform/data.tf +++ b/terraform/data.tf @@ -2,8 +2,4 @@ data "azurerm_resource_group" "rg-goodfood" { name = "rg-${var.project_name}${var.environnment_suffix}" } -data "azurerm_key_vault" "kv-goodfood" { - resource_group_name = data.azurerm_resource_group.rg-goodfood.name - name = "kv-${var.project_name}" -} - +data "azurerm_client_config" "current" {} diff --git a/terraform/env/dev-backend.tfvars.example b/terraform/env/dev-backend.tfvars.example index 7df882a6..e7576abb 100644 --- a/terraform/env/dev-backend.tfvars.example +++ b/terraform/env/dev-backend.tfvars.example @@ -1,4 +1,4 @@ resource_group_name = "rg-goodfood-dev" -storage_account_name = "sa-goodfood-states" +storage_account_name = "pafgoodfood" container_name = "tfstate" key = "main-dev.tfstate" diff --git a/terraform/main.tf b/terraform/main.tf index e9cc0e91..73c9e44f 100644 --- a/terraform/main.tf +++ b/terraform/main.tf @@ -12,6 +12,33 @@ provider "azurerm" { features {} } +resource "azurerm_key_vault" "kv-goodfood" { + name = "kv-goodfood-delivery" + location = data.azurerm_resource_group.rg-goodfood.location + resource_group_name = data.azurerm_resource_group.rg-goodfood.name + tenant_id = data.azurerm_client_config.current.tenant_id + sku_name = "standard" + soft_delete_retention_days = 7 + + access_policy { + tenant_id = data.azurerm_client_config.current.tenant_id + object_id = data.azurerm_client_config.current.object_id + + key_permissions = [ + "Create", + "Get", + ] + + secret_permissions = [ + "Set", + "Get", + "Delete", + "Purge", + "Recover" + ] + } +} + resource "azurerm_service_plan" "sp-goodfood" { name = "sp-${var.project_name}${var.environnment_suffix}" resource_group_name = data.azurerm_resource_group.rg-goodfood.name @@ -43,13 +70,27 @@ resource "azurerm_kubernetes_cluster" "aks-goodfood" { resource_group_name = data.azurerm_resource_group.rg-goodfood.name dns_prefix = "aks-${var.project_name}${var.environnment_suffix}" + default_node_pool { - name = "default" - node_count = 1 + name = "agentpool" vm_size = "Standard_D2_v2" + node_count = var.agent_count + } + linux_profile { + admin_username = "ubuntu" + + ssh_key { + key_data = file(var.ssh_public_key) + } + } + + network_profile { + network_plugin = "kubenet" + load_balancer_sku = "standard" } - identity { - type = "SystemAssigned" + service_principal { + client_id = var.aks_service_principal_app_id + client_secret = var.aks_service_principal_client_secret } } \ No newline at end of file diff --git a/terraform/outputs.tf b/terraform/outputs.tf index aa5afd79..f5b3c6b6 100644 --- a/terraform/outputs.tf +++ b/terraform/outputs.tf @@ -4,13 +4,41 @@ output "main-rg-name" { output "main-rg-id" { value = data.azurerm_resource_group.rg-goodfood.id } - output "client_certificate" { - value = azurerm_kubernetes_cluster.aks-goodfood.kube_config.0.client_certificate + value = azurerm_kubernetes_cluster.aks-goodfood.kube_config[0].client_certificate + sensitive = true +} + +output "client_key" { + value = azurerm_kubernetes_cluster.aks-goodfood.kube_config[0].client_key + sensitive = true +} + +output "cluster_ca_certificate" { + value = azurerm_kubernetes_cluster.aks-goodfood.kube_config[0].cluster_ca_certificate + sensitive = true +} + +output "cluster_password" { + value = azurerm_kubernetes_cluster.aks-goodfood.kube_config[0].password + sensitive = true +} + +output "cluster_username" { + value = azurerm_kubernetes_cluster.aks-goodfood.kube_config[0].username + sensitive = true +} + +output "host" { + value = azurerm_kubernetes_cluster.aks-goodfood.kube_config[0].host sensitive = true } output "kube_config" { - value = azurerm_kubernetes_cluster.aks-goodfood.kube_config_raw + value = azurerm_kubernetes_cluster.aks-goodfood.kube_config_raw sensitive = true +} + +output "resource_group_name" { + value = data.azurerm_resource_group.rg-goodfood.name } \ No newline at end of file diff --git a/terraform/variables.tf b/terraform/variables.tf index 65fd7547..fae36979 100644 --- a/terraform/variables.tf +++ b/terraform/variables.tf @@ -13,4 +13,19 @@ variable "project_name" { type = string description = "The name of the project" default = "goodfood" +} + +variable "agent_count" { + default = 3 +} + +variable "aks_service_principal_app_id" { + default = "" +} + +variable "aks_service_principal_client_secret" { + default = "" +} +variable "ssh_public_key" { + default = "~/.ssh/id_rsa.pub" } \ No newline at end of file From 788c394f0253b62306522764a3a9302c43b87f54 Mon Sep 17 00:00:00 2001 From: Florian Leroux <10078837+floriaaan@users.noreply.github.com> Date: Wed, 19 Apr 2023 11:50:40 +0200 Subject: [PATCH 125/883] ref: change publish job --- .github/workflows/delivery.yml | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/.github/workflows/delivery.yml b/.github/workflows/delivery.yml index 376cbb09..86e0d4c2 100644 --- a/.github/workflows/delivery.yml +++ b/.github/workflows/delivery.yml @@ -57,13 +57,14 @@ jobs: - name: Checkout code uses: actions/checkout@v2 - name: Login to Docker Hub - uses: docker/login-action@v1 + uses: docker/login-action@v2 with: - username: ${{ secrets.DOCKER_USERNAME }} - password: ${{ secrets.DOCKER_PASSWORD }} - - name: Build and push Docker image - uses: docker/build-push-action@v2 + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + - name: Build and push + uses: docker/build-push-action@v4 with: - context: ./services/delivery + context: ./services/ + file: ./services/delivery/Dockerfile push: true - tags: goodfood-delivery:latest + tags: floriaaan/goodfood-delivery:latest From cac599bd1995232e377570147dc1d0016147ad4c Mon Sep 17 00:00:00 2001 From: Florian Leroux <10078837+floriaaan@users.noreply.github.com> Date: Wed, 19 Apr 2023 11:58:43 +0200 Subject: [PATCH 126/883] ref(ci): change actions/checkout@v2 -> actions/checkout@master --- .github/workflows/delivery.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/delivery.yml b/.github/workflows/delivery.yml index 86e0d4c2..36845dc3 100644 --- a/.github/workflows/delivery.yml +++ b/.github/workflows/delivery.yml @@ -55,7 +55,7 @@ jobs: needs: [build, test] steps: - name: Checkout code - uses: actions/checkout@v2 + uses: actions/checkout@master - name: Login to Docker Hub uses: docker/login-action@v2 with: From 55313a2ce0727e1892eb15b9e1430f8a55f67217 Mon Sep 17 00:00:00 2001 From: anatole Date: Wed, 19 Apr 2023 18:24:39 +0200 Subject: [PATCH 127/883] feat(infra): update general terraform and change the delivery image --- services/delivery/k8s/deployment.yml | 2 +- terraform/main.tf | 28 ++++++++++++++-------------- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/services/delivery/k8s/deployment.yml b/services/delivery/k8s/deployment.yml index 2bb885c3..04b97285 100644 --- a/services/delivery/k8s/deployment.yml +++ b/services/delivery/k8s/deployment.yml @@ -15,7 +15,7 @@ spec: spec: containers: - name: goodfood-delivery - image: 4natole/goodfood-delivery:1.0.0 + image: floriaaan/goodfood-delivery:1.0.0 imagePullPolicy: Always resources: limits: diff --git a/terraform/main.tf b/terraform/main.tf index 73c9e44f..e9e1db58 100644 --- a/terraform/main.tf +++ b/terraform/main.tf @@ -12,10 +12,15 @@ provider "azurerm" { features {} } +resource "azurerm_resource_group" "rg-goodfood" { + location = data.azurerm_resource_group.rg-goodfood.location + name = "rg-${var.project_name}${var.environnment_suffix}" +} + resource "azurerm_key_vault" "kv-goodfood" { name = "kv-goodfood-delivery" location = data.azurerm_resource_group.rg-goodfood.location - resource_group_name = data.azurerm_resource_group.rg-goodfood.name + resource_group_name = azurerm_resource_group.rg-goodfood.name tenant_id = data.azurerm_client_config.current.tenant_id sku_name = "standard" soft_delete_retention_days = 7 @@ -41,7 +46,7 @@ resource "azurerm_key_vault" "kv-goodfood" { resource "azurerm_service_plan" "sp-goodfood" { name = "sp-${var.project_name}${var.environnment_suffix}" - resource_group_name = data.azurerm_resource_group.rg-goodfood.name + resource_group_name = azurerm_resource_group.rg-goodfood.name location = var.location os_type = "Linux" sku_name = "S1" @@ -49,7 +54,7 @@ resource "azurerm_service_plan" "sp-goodfood" { resource "azurerm_linux_web_app" "web-goodfood" { name = "web-${var.project_name}${var.environnment_suffix}" - resource_group_name = data.azurerm_resource_group.rg-goodfood.name + resource_group_name = azurerm_resource_group.rg-goodfood.name location = var.location service_plan_id = azurerm_service_plan.sp-goodfood.id @@ -67,7 +72,7 @@ resource "azurerm_linux_web_app" "web-goodfood" { resource "azurerm_kubernetes_cluster" "aks-goodfood" { name = "aks-${var.project_name}${var.environnment_suffix}" location = var.location - resource_group_name = data.azurerm_resource_group.rg-goodfood.name + resource_group_name = azurerm_resource_group.rg-goodfood.name dns_prefix = "aks-${var.project_name}${var.environnment_suffix}" @@ -76,6 +81,11 @@ resource "azurerm_kubernetes_cluster" "aks-goodfood" { vm_size = "Standard_D2_v2" node_count = var.agent_count } + service_principal { + client_id = "${var.aks_service_principal_app_id}" + client_secret = "${var.aks_service_principal_client_secret}" + } + linux_profile { admin_username = "ubuntu" @@ -83,14 +93,4 @@ resource "azurerm_kubernetes_cluster" "aks-goodfood" { key_data = file(var.ssh_public_key) } } - - network_profile { - network_plugin = "kubenet" - load_balancer_sku = "standard" - } - - service_principal { - client_id = var.aks_service_principal_app_id - client_secret = var.aks_service_principal_client_secret - } } \ No newline at end of file From baf99090ce890dcb6e1d39e18e318152519d3976 Mon Sep 17 00:00:00 2001 From: anatole Date: Wed, 19 Apr 2023 18:48:59 +0200 Subject: [PATCH 128/883] feat(github action): update delivery CICD --- .github/workflows/delivery.yml | 40 +++++++++++++++++++++++++++++++--- 1 file changed, 37 insertions(+), 3 deletions(-) diff --git a/.github/workflows/delivery.yml b/.github/workflows/delivery.yml index 36845dc3..8010eb30 100644 --- a/.github/workflows/delivery.yml +++ b/.github/workflows/delivery.yml @@ -2,9 +2,9 @@ name: Delivery Microservice CI/CD on: push: - branches: [delivery] + branches: [ delivery ] pull_request: - branches: [dev, main] + branches: [ dev, main ] jobs: build: @@ -52,7 +52,7 @@ jobs: publish: runs-on: ubuntu-latest - needs: [build, test] + needs: [ build, test ] steps: - name: Checkout code uses: actions/checkout@master @@ -68,3 +68,37 @@ jobs: file: ./services/delivery/Dockerfile push: true tags: floriaaan/goodfood-delivery:latest + + deploy: + runs-on: ubuntu-latest + needs: [ build, test, publish ] + steps: + - name: Checkout code + uses: actions/checkout@master + - name: Install kubectl + run: | + sudo snap install kubectl --classic + - name: Azure login + uses: azure/login@v1 + with: + creds: ${{ secrets.AZURE_CREDENTIALS }} + - name: Set up Terraform + uses: hashicorp/setup-terraform@v1 + with: + terraform_version: 1.0.5 + - name: Terraform init + run: | + cd ./terraform + terraform init + - name: Terraform apply + run: | + cd ./terraform + terraform apply -auto-approve + - name: Configure kubectl + run: | + az aks get-credentials --resource-group rg-goodfood-dev --name aks-goodfood-dev + - name: apply k8s manifests + run: | + cd ../services/delivery + kubectl create namespace goodfood + kubectlcrete kubectl apply -f ./k8s \ No newline at end of file From ddbc36e440fd1a581ad8dd129d2b41c1282abf44 Mon Sep 17 00:00:00 2001 From: anatole Date: Thu, 20 Apr 2023 09:05:24 +0200 Subject: [PATCH 129/883] feat(github): update the CICD --- .github/workflows/delivery.yml | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/.github/workflows/delivery.yml b/.github/workflows/delivery.yml index 8010eb30..7ff1db68 100644 --- a/.github/workflows/delivery.yml +++ b/.github/workflows/delivery.yml @@ -81,24 +81,30 @@ jobs: - name: Azure login uses: azure/login@v1 with: - creds: ${{ secrets.AZURE_CREDENTIALS }} + client-id: ${{ secrets.AZURE_CLIENT_ID }} + tenant-id: ${{ secrets.AZURE_TENANT_ID }} + subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }} - name: Set up Terraform uses: hashicorp/setup-terraform@v1 with: terraform_version: 1.0.5 - name: Terraform init run: | - cd ./terraform + cd ./terraform && terraform init - name: Terraform apply run: | - cd ./terraform + cd ./terraform && + terraform apply -auto-approve + - name: Terraform apply delivery + run: | + cd ../services/delivery/terraform && terraform apply -auto-approve - name: Configure kubectl run: | az aks get-credentials --resource-group rg-goodfood-dev --name aks-goodfood-dev - name: apply k8s manifests run: | - cd ../services/delivery - kubectl create namespace goodfood + cd .. && + kubectl create namespace goodfood && kubectlcrete kubectl apply -f ./k8s \ No newline at end of file From 846136b6ec634a67910ec6cfb2e00dc788e4ce69 Mon Sep 17 00:00:00 2001 From: anatole Date: Thu, 20 Apr 2023 09:12:50 +0200 Subject: [PATCH 130/883] feat(github): add permission --- .github/workflows/delivery.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/workflows/delivery.yml b/.github/workflows/delivery.yml index 7ff1db68..5ffed1b0 100644 --- a/.github/workflows/delivery.yml +++ b/.github/workflows/delivery.yml @@ -6,6 +6,9 @@ on: pull_request: branches: [ dev, main ] +permissions: + id-token: write + jobs: build: runs-on: ubuntu-latest @@ -78,7 +81,7 @@ jobs: - name: Install kubectl run: | sudo snap install kubectl --classic - - name: Azure login + - name: 'Az CLI login' uses: azure/login@v1 with: client-id: ${{ secrets.AZURE_CLIENT_ID }} From aae082135a4325c600b26950f3f3f5e3487f1eca Mon Sep 17 00:00:00 2001 From: anatole Date: Thu, 20 Apr 2023 09:15:51 +0200 Subject: [PATCH 131/883] feat(github): update permission --- .github/workflows/delivery.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/delivery.yml b/.github/workflows/delivery.yml index 5ffed1b0..593d7dd8 100644 --- a/.github/workflows/delivery.yml +++ b/.github/workflows/delivery.yml @@ -8,6 +8,7 @@ on: permissions: id-token: write + contents: read jobs: build: From 58bf73370ae37e49b5d24fed4934c6e5328c79c4 Mon Sep 17 00:00:00 2001 From: anatole Date: Thu, 20 Apr 2023 09:23:28 +0200 Subject: [PATCH 132/883] feat(github): add environment --- .github/workflows/delivery.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/delivery.yml b/.github/workflows/delivery.yml index 593d7dd8..122e5f85 100644 --- a/.github/workflows/delivery.yml +++ b/.github/workflows/delivery.yml @@ -75,6 +75,7 @@ jobs: deploy: runs-on: ubuntu-latest + environment: dev needs: [ build, test, publish ] steps: - name: Checkout code From bcc5755b91395b84bbbfd4bb9cbceca49bcd645c Mon Sep 17 00:00:00 2001 From: anatole Date: Thu, 20 Apr 2023 10:26:34 +0200 Subject: [PATCH 133/883] feat(github): split the delivery deployment --- .github/workflows/delivery-deploy.yml | 51 +++++++++++++++++++++++++++ .github/workflows/delivery.yml | 43 +--------------------- 2 files changed, 52 insertions(+), 42 deletions(-) create mode 100644 .github/workflows/delivery-deploy.yml diff --git a/.github/workflows/delivery-deploy.yml b/.github/workflows/delivery-deploy.yml new file mode 100644 index 00000000..aca8b56a --- /dev/null +++ b/.github/workflows/delivery-deploy.yml @@ -0,0 +1,51 @@ +name: Delivery Microservice CI/CD + +on: + push: + branches: [ dev, main ] + +permissions: + id-token: write + contents: read + +jobs: + deploy: + runs-on: ubuntu-latest + environment: dev + needs: [ build, test, publish ] + steps: + - name: Checkout code + uses: actions/checkout@master + - name: Install kubectl + run: | + sudo snap install kubectl --classic + - name: 'Az CLI login' + uses: azure/login@v1 + with: + client-id: ${{ secrets.AZURE_CLIENT_ID }} + tenant-id: ${{ secrets.AZURE_TENANT_ID }} + subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }} + - name: Set up Terraform + uses: hashicorp/setup-terraform@v1 + with: + terraform_version: 1.0.5 + - name: Terraform init + run: | + cd ./terraform && + terraform init + - name: Terraform apply + run: | + cd ./terraform && + terraform apply -auto-approve + - name: Terraform apply delivery + run: | + cd ../services/delivery/terraform && + terraform apply -auto-approve + - name: Configure kubectl + run: | + az aks get-credentials --resource-group rg-goodfood-dev --name aks-goodfood-dev + - name: apply k8s manifests + run: | + cd .. && + kubectl create namespace goodfood && + kubectlcrete kubectl apply -f ./k8s \ No newline at end of file diff --git a/.github/workflows/delivery.yml b/.github/workflows/delivery.yml index 122e5f85..e467c33e 100644 --- a/.github/workflows/delivery.yml +++ b/.github/workflows/delivery.yml @@ -71,45 +71,4 @@ jobs: context: ./services/ file: ./services/delivery/Dockerfile push: true - tags: floriaaan/goodfood-delivery:latest - - deploy: - runs-on: ubuntu-latest - environment: dev - needs: [ build, test, publish ] - steps: - - name: Checkout code - uses: actions/checkout@master - - name: Install kubectl - run: | - sudo snap install kubectl --classic - - name: 'Az CLI login' - uses: azure/login@v1 - with: - client-id: ${{ secrets.AZURE_CLIENT_ID }} - tenant-id: ${{ secrets.AZURE_TENANT_ID }} - subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }} - - name: Set up Terraform - uses: hashicorp/setup-terraform@v1 - with: - terraform_version: 1.0.5 - - name: Terraform init - run: | - cd ./terraform && - terraform init - - name: Terraform apply - run: | - cd ./terraform && - terraform apply -auto-approve - - name: Terraform apply delivery - run: | - cd ../services/delivery/terraform && - terraform apply -auto-approve - - name: Configure kubectl - run: | - az aks get-credentials --resource-group rg-goodfood-dev --name aks-goodfood-dev - - name: apply k8s manifests - run: | - cd .. && - kubectl create namespace goodfood && - kubectlcrete kubectl apply -f ./k8s \ No newline at end of file + tags: floriaaan/goodfood-delivery:latest \ No newline at end of file From 31ff2154d305177269ce7f405942a297676a1333 Mon Sep 17 00:00:00 2001 From: anatole Date: Thu, 20 Apr 2023 10:46:45 +0200 Subject: [PATCH 134/883] refactor(github): split the delivery deployment --- .github/workflows/delivery-deploy.yml | 2 +- .github/workflows/delivery.yml | 4 ---- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/.github/workflows/delivery-deploy.yml b/.github/workflows/delivery-deploy.yml index aca8b56a..879d115e 100644 --- a/.github/workflows/delivery-deploy.yml +++ b/.github/workflows/delivery-deploy.yml @@ -1,4 +1,4 @@ -name: Delivery Microservice CI/CD +name: Deploy Delivery Microservice CI/CD on: push: diff --git a/.github/workflows/delivery.yml b/.github/workflows/delivery.yml index e467c33e..1b68e1b2 100644 --- a/.github/workflows/delivery.yml +++ b/.github/workflows/delivery.yml @@ -6,10 +6,6 @@ on: pull_request: branches: [ dev, main ] -permissions: - id-token: write - contents: read - jobs: build: runs-on: ubuntu-latest From 3913509f5768a6de7a149bd03a5e88050308ccbd Mon Sep 17 00:00:00 2001 From: anatole Date: Thu, 20 Apr 2023 16:09:07 +0200 Subject: [PATCH 135/883] feat(github): update general terraform --- terraform/env/dev.tfvars.example | 2 + terraform/main.tf | 84 ++++++++++++++++++++++---------- terraform/outputs.tf | 34 ------------- terraform/variables.tf | 6 +++ 4 files changed, 65 insertions(+), 61 deletions(-) diff --git a/terraform/env/dev.tfvars.example b/terraform/env/dev.tfvars.example index 4ac1f44d..1e7706c9 100644 --- a/terraform/env/dev.tfvars.example +++ b/terraform/env/dev.tfvars.example @@ -1 +1,3 @@ environnment_suffix = "-dev" +db_password = "password" +db_username = "user" diff --git a/terraform/main.tf b/terraform/main.tf index e9e1db58..a05e2e86 100644 --- a/terraform/main.tf +++ b/terraform/main.tf @@ -12,15 +12,10 @@ provider "azurerm" { features {} } -resource "azurerm_resource_group" "rg-goodfood" { - location = data.azurerm_resource_group.rg-goodfood.location - name = "rg-${var.project_name}${var.environnment_suffix}" -} - resource "azurerm_key_vault" "kv-goodfood" { name = "kv-goodfood-delivery" location = data.azurerm_resource_group.rg-goodfood.location - resource_group_name = azurerm_resource_group.rg-goodfood.name + resource_group_name = data.azurerm_resource_group.rg-goodfood.name tenant_id = data.azurerm_client_config.current.tenant_id sku_name = "standard" soft_delete_retention_days = 7 @@ -46,7 +41,7 @@ resource "azurerm_key_vault" "kv-goodfood" { resource "azurerm_service_plan" "sp-goodfood" { name = "sp-${var.project_name}${var.environnment_suffix}" - resource_group_name = azurerm_resource_group.rg-goodfood.name + resource_group_name = data.azurerm_resource_group.rg-goodfood.name location = var.location os_type = "Linux" sku_name = "S1" @@ -54,7 +49,7 @@ resource "azurerm_service_plan" "sp-goodfood" { resource "azurerm_linux_web_app" "web-goodfood" { name = "web-${var.project_name}${var.environnment_suffix}" - resource_group_name = azurerm_resource_group.rg-goodfood.name + resource_group_name = data.azurerm_resource_group.rg-goodfood.name location = var.location service_plan_id = azurerm_service_plan.sp-goodfood.id @@ -69,28 +64,63 @@ resource "azurerm_linux_web_app" "web-goodfood" { } } -resource "azurerm_kubernetes_cluster" "aks-goodfood" { - name = "aks-${var.project_name}${var.environnment_suffix}" - location = var.location - resource_group_name = azurerm_resource_group.rg-goodfood.name - dns_prefix = "aks-${var.project_name}${var.environnment_suffix}" +resource "azurerm_postgresql_server" "pgsql-goodfood" { + name = "postgres-server-${var.project_name}${var.environnment_suffix}" + location = data.azurerm_resource_group.rg-goodfood.location + resource_group_name = data.azurerm_resource_group.rg-goodfood.name + sku_name = "B_Gen5_2" - default_node_pool { - name = "agentpool" - vm_size = "Standard_D2_v2" - node_count = var.agent_count - } - service_principal { - client_id = "${var.aks_service_principal_app_id}" - client_secret = "${var.aks_service_principal_client_secret}" - } + storage_mb = 5120 + backup_retention_days = 7 + geo_redundant_backup_enabled = false + auto_grow_enabled = true + + administrator_login = var.db_username + administrator_login_password = var.db_password + version = "9.5" + ssl_enforcement_enabled = false + ssl_minimal_tls_version_enforced = "TLSEnforcementDisabled" +} + +resource "azurerm_postgresql_firewall_rule" "pg-fw-goodfood" { + name = "firewall-${var.project_name}${var.environnment_suffix}" + resource_group_name = data.azurerm_resource_group.rg-goodfood.name + server_name = azurerm_postgresql_server.pgsql-goodfood.name + start_ip_address = "0.0.0.0" + end_ip_address = "0.0.0.0" +} + +resource "azurerm_postgresql_database" "db-goodfood" { + name = "postgres-${var.project_name}${var.environnment_suffix}" + resource_group_name = data.azurerm_resource_group.rg-goodfood.name + server_name = azurerm_postgresql_server.pgsql-goodfood.name + charset = "UTF8" + collation = "English_United States.1252" +} + +resource "azurerm_container_group" "container_group" { + name = "container-${var.project_name}${var.environnment_suffix}" + location = data.azurerm_resource_group.rg-goodfood.location + resource_group_name = data.azurerm_resource_group.rg-goodfood.name + ip_address_type = "Public" + dns_name_label = "container-${var.project_name}${var.environnment_suffix}" + os_type = "Linux" + + container { + name = "${var.project_name}${var.environnment_suffix}" + image = "floriaaan/goodfood-delivery:latest" + cpu = "0.5" + memory = "1.5" - linux_profile { - admin_username = "ubuntu" + ports { + port = 50008 + protocol = "TCP" + } - ssh_key { - key_data = file(var.ssh_public_key) + environment_variables = { + "DATABASE_URL" = "postgres://${var.db_username}@${azurerm_postgresql_server.pgsql-goodfood.name}:${var.db_password}@${azurerm_postgresql_server.pgsql-goodfood.fqdn}:5432/${azurerm_postgresql_database.db-goodfood.name}" + "PORT" = 50008 } } -} \ No newline at end of file +} diff --git a/terraform/outputs.tf b/terraform/outputs.tf index f5b3c6b6..a7a091ce 100644 --- a/terraform/outputs.tf +++ b/terraform/outputs.tf @@ -4,40 +4,6 @@ output "main-rg-name" { output "main-rg-id" { value = data.azurerm_resource_group.rg-goodfood.id } -output "client_certificate" { - value = azurerm_kubernetes_cluster.aks-goodfood.kube_config[0].client_certificate - sensitive = true -} - -output "client_key" { - value = azurerm_kubernetes_cluster.aks-goodfood.kube_config[0].client_key - sensitive = true -} - -output "cluster_ca_certificate" { - value = azurerm_kubernetes_cluster.aks-goodfood.kube_config[0].cluster_ca_certificate - sensitive = true -} - -output "cluster_password" { - value = azurerm_kubernetes_cluster.aks-goodfood.kube_config[0].password - sensitive = true -} - -output "cluster_username" { - value = azurerm_kubernetes_cluster.aks-goodfood.kube_config[0].username - sensitive = true -} - -output "host" { - value = azurerm_kubernetes_cluster.aks-goodfood.kube_config[0].host - sensitive = true -} - -output "kube_config" { - value = azurerm_kubernetes_cluster.aks-goodfood.kube_config_raw - sensitive = true -} output "resource_group_name" { value = data.azurerm_resource_group.rg-goodfood.name diff --git a/terraform/variables.tf b/terraform/variables.tf index fae36979..0bb2c48d 100644 --- a/terraform/variables.tf +++ b/terraform/variables.tf @@ -28,4 +28,10 @@ variable "aks_service_principal_client_secret" { } variable "ssh_public_key" { default = "~/.ssh/id_rsa.pub" +} +variable "db_password" { + type = string +} +variable "db_username" { + type = string } \ No newline at end of file From 895b20f237c37aa36c3f26624f83861f634b7612 Mon Sep 17 00:00:00 2001 From: Florian LEROUX <10078837+floriaaan@users.noreply.github.com> Date: Wed, 10 May 2023 15:59:32 +0200 Subject: [PATCH 136/883] git(ignore): remove root lockfile and add ignore files --- .gitignore | 2 +- pnpm-lock.yaml | 794 ------------------------------------------------- 2 files changed, 1 insertion(+), 795 deletions(-) delete mode 100644 pnpm-lock.yaml diff --git a/.gitignore b/.gitignore index eb399c48..097b8b62 100644 --- a/.gitignore +++ b/.gitignore @@ -65,4 +65,4 @@ terraform.rc # Ignore Visual Studio temporary files /services/reporting/**/bin /services/reporting/**/obj -/services/reporting/**/.vs \ No newline at end of file +/services/reporting/**/.vs diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml deleted file mode 100644 index cccf0383..00000000 --- a/pnpm-lock.yaml +++ /dev/null @@ -1,794 +0,0 @@ -lockfileVersion: '6.0' - -devDependencies: - vitest-mock-extended: - specifier: ^1.1.3 - version: 1.1.3(typescript@5.0.4)(vitest@0.30.0) - -packages: - - /@esbuild/android-arm64@0.17.16: - resolution: {integrity: sha512-QX48qmsEZW+gcHgTmAj+x21mwTz8MlYQBnzF6861cNdQGvj2jzzFjqH0EBabrIa/WVZ2CHolwMoqxVryqKt8+Q==} - engines: {node: '>=12'} - cpu: [arm64] - os: [android] - requiresBuild: true - dev: true - optional: true - - /@esbuild/android-arm@0.17.16: - resolution: {integrity: sha512-baLqRpLe4JnKrUXLJChoTN0iXZH7El/mu58GE3WIA6/H834k0XWvLRmGLG8y8arTRS9hJJibPnF0tiGhmWeZgw==} - engines: {node: '>=12'} - cpu: [arm] - os: [android] - requiresBuild: true - dev: true - optional: true - - /@esbuild/android-x64@0.17.16: - resolution: {integrity: sha512-G4wfHhrrz99XJgHnzFvB4UwwPxAWZaZBOFXh+JH1Duf1I4vIVfuYY9uVLpx4eiV2D/Jix8LJY+TAdZ3i40tDow==} - engines: {node: '>=12'} - cpu: [x64] - os: [android] - requiresBuild: true - dev: true - optional: true - - /@esbuild/darwin-arm64@0.17.16: - resolution: {integrity: sha512-/Ofw8UXZxuzTLsNFmz1+lmarQI6ztMZ9XktvXedTbt3SNWDn0+ODTwxExLYQ/Hod91EZB4vZPQJLoqLF0jvEzA==} - engines: {node: '>=12'} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /@esbuild/darwin-x64@0.17.16: - resolution: {integrity: sha512-SzBQtCV3Pdc9kyizh36Ol+dNVhkDyIrGb/JXZqFq8WL37LIyrXU0gUpADcNV311sCOhvY+f2ivMhb5Tuv8nMOQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /@esbuild/freebsd-arm64@0.17.16: - resolution: {integrity: sha512-ZqftdfS1UlLiH1DnS2u3It7l4Bc3AskKeu+paJSfk7RNOMrOxmeFDhLTMQqMxycP1C3oj8vgkAT6xfAuq7ZPRA==} - engines: {node: '>=12'} - cpu: [arm64] - os: [freebsd] - requiresBuild: true - dev: true - optional: true - - /@esbuild/freebsd-x64@0.17.16: - resolution: {integrity: sha512-rHV6zNWW1tjgsu0dKQTX9L0ByiJHHLvQKrWtnz8r0YYJI27FU3Xu48gpK2IBj1uCSYhJ+pEk6Y0Um7U3rIvV8g==} - engines: {node: '>=12'} - cpu: [x64] - os: [freebsd] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-arm64@0.17.16: - resolution: {integrity: sha512-8yoZhGkU6aHu38WpaM4HrRLTFc7/VVD9Q2SvPcmIQIipQt2I/GMTZNdEHXoypbbGao5kggLcxg0iBKjo0SQYKA==} - engines: {node: '>=12'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-arm@0.17.16: - resolution: {integrity: sha512-n4O8oVxbn7nl4+m+ISb0a68/lcJClIbaGAoXwqeubj/D1/oMMuaAXmJVfFlRjJLu/ZvHkxoiFJnmbfp4n8cdSw==} - engines: {node: '>=12'} - cpu: [arm] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-ia32@0.17.16: - resolution: {integrity: sha512-9ZBjlkdaVYxPNO8a7OmzDbOH9FMQ1a58j7Xb21UfRU29KcEEU3VTHk+Cvrft/BNv0gpWJMiiZ/f4w0TqSP0gLA==} - engines: {node: '>=12'} - cpu: [ia32] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-loong64@0.17.16: - resolution: {integrity: sha512-TIZTRojVBBzdgChY3UOG7BlPhqJz08AL7jdgeeu+kiObWMFzGnQD7BgBBkWRwOtKR1i2TNlO7YK6m4zxVjjPRQ==} - engines: {node: '>=12'} - cpu: [loong64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-mips64el@0.17.16: - resolution: {integrity: sha512-UPeRuFKCCJYpBbIdczKyHLAIU31GEm0dZl1eMrdYeXDH+SJZh/i+2cAmD3A1Wip9pIc5Sc6Kc5cFUrPXtR0XHA==} - engines: {node: '>=12'} - cpu: [mips64el] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-ppc64@0.17.16: - resolution: {integrity: sha512-io6yShgIEgVUhExJejJ21xvO5QtrbiSeI7vYUnr7l+v/O9t6IowyhdiYnyivX2X5ysOVHAuyHW+Wyi7DNhdw6Q==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-riscv64@0.17.16: - resolution: {integrity: sha512-WhlGeAHNbSdG/I2gqX2RK2gfgSNwyJuCiFHMc8s3GNEMMHUI109+VMBfhVqRb0ZGzEeRiibi8dItR3ws3Lk+cA==} - engines: {node: '>=12'} - cpu: [riscv64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-s390x@0.17.16: - resolution: {integrity: sha512-gHRReYsJtViir63bXKoFaQ4pgTyah4ruiMRQ6im9YZuv+gp3UFJkNTY4sFA73YDynmXZA6hi45en4BGhNOJUsw==} - engines: {node: '>=12'} - cpu: [s390x] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-x64@0.17.16: - resolution: {integrity: sha512-mfiiBkxEbUHvi+v0P+TS7UnA9TeGXR48aK4XHkTj0ZwOijxexgMF01UDFaBX7Q6CQsB0d+MFNv9IiXbIHTNd4g==} - engines: {node: '>=12'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/netbsd-x64@0.17.16: - resolution: {integrity: sha512-n8zK1YRDGLRZfVcswcDMDM0j2xKYLNXqei217a4GyBxHIuPMGrrVuJ+Ijfpr0Kufcm7C1k/qaIrGy6eG7wvgmA==} - engines: {node: '>=12'} - cpu: [x64] - os: [netbsd] - requiresBuild: true - dev: true - optional: true - - /@esbuild/openbsd-x64@0.17.16: - resolution: {integrity: sha512-lEEfkfsUbo0xC47eSTBqsItXDSzwzwhKUSsVaVjVji07t8+6KA5INp2rN890dHZeueXJAI8q0tEIfbwVRYf6Ew==} - engines: {node: '>=12'} - cpu: [x64] - os: [openbsd] - requiresBuild: true - dev: true - optional: true - - /@esbuild/sunos-x64@0.17.16: - resolution: {integrity: sha512-jlRjsuvG1fgGwnE8Afs7xYDnGz0dBgTNZfgCK6TlvPH3Z13/P5pi6I57vyLE8qZYLrGVtwcm9UbUx1/mZ8Ukag==} - engines: {node: '>=12'} - cpu: [x64] - os: [sunos] - requiresBuild: true - dev: true - optional: true - - /@esbuild/win32-arm64@0.17.16: - resolution: {integrity: sha512-TzoU2qwVe2boOHl/3KNBUv2PNUc38U0TNnzqOAcgPiD/EZxT2s736xfC2dYQbszAwo4MKzzwBV0iHjhfjxMimg==} - engines: {node: '>=12'} - cpu: [arm64] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /@esbuild/win32-ia32@0.17.16: - resolution: {integrity: sha512-B8b7W+oo2yb/3xmwk9Vc99hC9bNolvqjaTZYEfMQhzdpBsjTvZBlXQ/teUE55Ww6sg//wlcDjOaqldOKyigWdA==} - engines: {node: '>=12'} - cpu: [ia32] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /@esbuild/win32-x64@0.17.16: - resolution: {integrity: sha512-xJ7OH/nanouJO9pf03YsL9NAFQBHd8AqfrQd7Pf5laGyyTt/gToul6QYOA/i5i/q8y9iaM5DQFNTgpi995VkOg==} - engines: {node: '>=12'} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /@jridgewell/sourcemap-codec@1.4.15: - resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} - dev: true - - /@types/chai-subset@1.3.3: - resolution: {integrity: sha512-frBecisrNGz+F4T6bcc+NLeolfiojh5FxW2klu669+8BARtyQv2C/GkNW6FUodVe4BroGMP/wER/YDGc7rEllw==} - dependencies: - '@types/chai': 4.3.4 - dev: true - - /@types/chai@4.3.4: - resolution: {integrity: sha512-KnRanxnpfpjUTqTCXslZSEdLfXExwgNxYPdiO2WGUj8+HDjFi8R3k5RVKPeSCzLjCcshCAtVO2QBbVuAV4kTnw==} - dev: true - - /@types/node@18.15.11: - resolution: {integrity: sha512-E5Kwq2n4SbMzQOn6wnmBjuK9ouqlURrcZDVfbo9ftDDTFt3nk7ZKK4GMOzoYgnpQJKcxwQw+lGaBvvlMo0qN/Q==} - dev: true - - /@vitest/expect@0.30.0: - resolution: {integrity: sha512-b/jLWBqi6WQHfezWm8VjgXdIyfejAurtxqdyCdDqoToCim5W/nDxKjFAADitEHPz80oz+IP+c+wmkGKBucSpiw==} - dependencies: - '@vitest/spy': 0.30.0 - '@vitest/utils': 0.30.0 - chai: 4.3.7 - dev: true - - /@vitest/runner@0.30.0: - resolution: {integrity: sha512-Xh4xkdRcymdeRNrSwjhgarCTSgnQu2J59wsFI6i4UhKrL5whzo5+vWyq7iWK1ht3fppPeNAtvkbqUDf+OJSCbQ==} - dependencies: - '@vitest/utils': 0.30.0 - concordance: 5.0.4 - p-limit: 4.0.0 - pathe: 1.1.0 - dev: true - - /@vitest/snapshot@0.30.0: - resolution: {integrity: sha512-e4eSGCy36Bw3/Tkir9qYJDlFsUz3NALFPNJSxzlY8CFl901TV9iZdKgpqXpyG1sAhLO0tPHThBAMHRi8hRA8cg==} - dependencies: - magic-string: 0.30.0 - pathe: 1.1.0 - pretty-format: 27.5.1 - dev: true - - /@vitest/spy@0.30.0: - resolution: {integrity: sha512-olTWyG5gVWdfhCrdgxWQb2K3JYtj1/ZwInFFOb4GZ2HFI91PUWHWHhLRPORxwRwVvoXD1MS1162vPJZuHlKJkg==} - dependencies: - tinyspy: 2.1.0 - dev: true - - /@vitest/utils@0.30.0: - resolution: {integrity: sha512-qFZgoOKQ+rJV9xG4BBxgOSilnLQ2gkfG4I+z1wBuuQ3AD33zQrnB88kMFfzsot1E1AbF3dNK1e4CU7q3ojahRA==} - dependencies: - concordance: 5.0.4 - loupe: 2.3.6 - pretty-format: 27.5.1 - dev: true - - /acorn-walk@8.2.0: - resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} - engines: {node: '>=0.4.0'} - dev: true - - /acorn@8.8.2: - resolution: {integrity: sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==} - engines: {node: '>=0.4.0'} - hasBin: true - dev: true - - /ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} - dev: true - - /ansi-styles@5.2.0: - resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} - engines: {node: '>=10'} - dev: true - - /assertion-error@1.1.0: - resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} - dev: true - - /blueimp-md5@2.19.0: - resolution: {integrity: sha512-DRQrD6gJyy8FbiE4s+bDoXS9hiW3Vbx5uCdwvcCf3zLHL+Iv7LtGHLpr+GZV8rHG8tK766FGYBwRbu8pELTt+w==} - dev: true - - /cac@6.7.14: - resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} - engines: {node: '>=8'} - dev: true - - /chai@4.3.7: - resolution: {integrity: sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==} - engines: {node: '>=4'} - dependencies: - assertion-error: 1.1.0 - check-error: 1.0.2 - deep-eql: 4.1.3 - get-func-name: 2.0.0 - loupe: 2.3.6 - pathval: 1.1.1 - type-detect: 4.0.8 - dev: true - - /check-error@1.0.2: - resolution: {integrity: sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==} - dev: true - - /concordance@5.0.4: - resolution: {integrity: sha512-OAcsnTEYu1ARJqWVGwf4zh4JDfHZEaSNlNccFmt8YjB2l/n19/PF2viLINHc57vO4FKIAFl2FWASIGZZWZ2Kxw==} - engines: {node: '>=10.18.0 <11 || >=12.14.0 <13 || >=14'} - dependencies: - date-time: 3.1.0 - esutils: 2.0.3 - fast-diff: 1.2.0 - js-string-escape: 1.0.1 - lodash: 4.17.21 - md5-hex: 3.0.1 - semver: 7.3.8 - well-known-symbols: 2.0.0 - dev: true - - /date-time@3.1.0: - resolution: {integrity: sha512-uqCUKXE5q1PNBXjPqvwhwJf9SwMoAHBgWJ6DcrnS5o+W2JOiIILl0JEdVD8SGujrNS02GGxgwAg2PN2zONgtjg==} - engines: {node: '>=6'} - dependencies: - time-zone: 1.0.0 - dev: true - - /debug@4.3.4: - resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - dependencies: - ms: 2.1.2 - dev: true - - /deep-eql@4.1.3: - resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==} - engines: {node: '>=6'} - dependencies: - type-detect: 4.0.8 - dev: true - - /esbuild@0.17.16: - resolution: {integrity: sha512-aeSuUKr9aFVY9Dc8ETVELGgkj4urg5isYx8pLf4wlGgB0vTFjxJQdHnNH6Shmx4vYYrOTLCHtRI5i1XZ9l2Zcg==} - engines: {node: '>=12'} - hasBin: true - requiresBuild: true - optionalDependencies: - '@esbuild/android-arm': 0.17.16 - '@esbuild/android-arm64': 0.17.16 - '@esbuild/android-x64': 0.17.16 - '@esbuild/darwin-arm64': 0.17.16 - '@esbuild/darwin-x64': 0.17.16 - '@esbuild/freebsd-arm64': 0.17.16 - '@esbuild/freebsd-x64': 0.17.16 - '@esbuild/linux-arm': 0.17.16 - '@esbuild/linux-arm64': 0.17.16 - '@esbuild/linux-ia32': 0.17.16 - '@esbuild/linux-loong64': 0.17.16 - '@esbuild/linux-mips64el': 0.17.16 - '@esbuild/linux-ppc64': 0.17.16 - '@esbuild/linux-riscv64': 0.17.16 - '@esbuild/linux-s390x': 0.17.16 - '@esbuild/linux-x64': 0.17.16 - '@esbuild/netbsd-x64': 0.17.16 - '@esbuild/openbsd-x64': 0.17.16 - '@esbuild/sunos-x64': 0.17.16 - '@esbuild/win32-arm64': 0.17.16 - '@esbuild/win32-ia32': 0.17.16 - '@esbuild/win32-x64': 0.17.16 - dev: true - - /esutils@2.0.3: - resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} - engines: {node: '>=0.10.0'} - dev: true - - /fast-diff@1.2.0: - resolution: {integrity: sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==} - dev: true - - /fsevents@2.3.2: - resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /function-bind@1.1.1: - resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} - dev: true - - /get-func-name@2.0.0: - resolution: {integrity: sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==} - dev: true - - /has@1.0.3: - resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} - engines: {node: '>= 0.4.0'} - dependencies: - function-bind: 1.1.1 - dev: true - - /is-core-module@2.11.0: - resolution: {integrity: sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==} - dependencies: - has: 1.0.3 - dev: true - - /js-string-escape@1.0.1: - resolution: {integrity: sha512-Smw4xcfIQ5LVjAOuJCvN/zIodzA/BBSsluuoSykP+lUvScIi4U6RJLfwHet5cxFnCswUjISV8oAXaqaJDY3chg==} - engines: {node: '>= 0.8'} - dev: true - - /jsonc-parser@3.2.0: - resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} - dev: true - - /local-pkg@0.4.3: - resolution: {integrity: sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==} - engines: {node: '>=14'} - dev: true - - /lodash@4.17.21: - resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} - dev: true - - /loupe@2.3.6: - resolution: {integrity: sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==} - dependencies: - get-func-name: 2.0.0 - dev: true - - /lru-cache@6.0.0: - resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} - engines: {node: '>=10'} - dependencies: - yallist: 4.0.0 - dev: true - - /magic-string@0.30.0: - resolution: {integrity: sha512-LA+31JYDJLs82r2ScLrlz1GjSgu66ZV518eyWT+S8VhyQn/JL0u9MeBOvQMGYiPk1DBiSN9DDMOcXvigJZaViQ==} - engines: {node: '>=12'} - dependencies: - '@jridgewell/sourcemap-codec': 1.4.15 - dev: true - - /md5-hex@3.0.1: - resolution: {integrity: sha512-BUiRtTtV39LIJwinWBjqVsU9xhdnz7/i889V859IBFpuqGAj6LuOvHv5XLbgZ2R7ptJoJaEcxkv88/h25T7Ciw==} - engines: {node: '>=8'} - dependencies: - blueimp-md5: 2.19.0 - dev: true - - /mlly@1.2.0: - resolution: {integrity: sha512-+c7A3CV0KGdKcylsI6khWyts/CYrGTrRVo4R/I7u/cUsy0Conxa6LUhiEzVKIw14lc2L5aiO4+SeVe4TeGRKww==} - dependencies: - acorn: 8.8.2 - pathe: 1.1.0 - pkg-types: 1.0.2 - ufo: 1.1.1 - dev: true - - /ms@2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - dev: true - - /nanoid@3.3.6: - resolution: {integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true - dev: true - - /p-limit@4.0.0: - resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dependencies: - yocto-queue: 1.0.0 - dev: true - - /path-parse@1.0.7: - resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} - dev: true - - /pathe@1.1.0: - resolution: {integrity: sha512-ODbEPR0KKHqECXW1GoxdDb+AZvULmXjVPy4rt+pGo2+TnjJTIPJQSVS6N63n8T2Ip+syHhbn52OewKicV0373w==} - dev: true - - /pathval@1.1.1: - resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} - dev: true - - /picocolors@1.0.0: - resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} - dev: true - - /pkg-types@1.0.2: - resolution: {integrity: sha512-hM58GKXOcj8WTqUXnsQyJYXdeAPbythQgEF3nTcEo+nkD49chjQ9IKm/QJy9xf6JakXptz86h7ecP2024rrLaQ==} - dependencies: - jsonc-parser: 3.2.0 - mlly: 1.2.0 - pathe: 1.1.0 - dev: true - - /postcss@8.4.21: - resolution: {integrity: sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==} - engines: {node: ^10 || ^12 || >=14} - dependencies: - nanoid: 3.3.6 - picocolors: 1.0.0 - source-map-js: 1.0.2 - dev: true - - /pretty-format@27.5.1: - resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - dependencies: - ansi-regex: 5.0.1 - ansi-styles: 5.2.0 - react-is: 17.0.2 - dev: true - - /react-is@17.0.2: - resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} - dev: true - - /resolve@1.22.2: - resolution: {integrity: sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==} - hasBin: true - dependencies: - is-core-module: 2.11.0 - path-parse: 1.0.7 - supports-preserve-symlinks-flag: 1.0.0 - dev: true - - /rollup@3.20.2: - resolution: {integrity: sha512-3zwkBQl7Ai7MFYQE0y1MeQ15+9jsi7XxfrqwTb/9EK8D9C9+//EBR4M+CuA1KODRaNbFez/lWxA5vhEGZp4MUg==} - engines: {node: '>=14.18.0', npm: '>=8.0.0'} - hasBin: true - optionalDependencies: - fsevents: 2.3.2 - dev: true - - /semver@7.3.8: - resolution: {integrity: sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==} - engines: {node: '>=10'} - hasBin: true - dependencies: - lru-cache: 6.0.0 - dev: true - - /siginfo@2.0.0: - resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} - dev: true - - /source-map-js@1.0.2: - resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} - engines: {node: '>=0.10.0'} - dev: true - - /source-map@0.6.1: - resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} - engines: {node: '>=0.10.0'} - dev: true - - /stackback@0.0.2: - resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} - dev: true - - /std-env@3.3.2: - resolution: {integrity: sha512-uUZI65yrV2Qva5gqE0+A7uVAvO40iPo6jGhs7s8keRfHCmtg+uB2X6EiLGCI9IgL1J17xGhvoOqSz79lzICPTA==} - dev: true - - /strip-literal@1.0.1: - resolution: {integrity: sha512-QZTsipNpa2Ppr6v1AmJHESqJ3Uz247MUS0OjrnnZjFAvEoWqxuyFuXn2xLgMtRnijJShAa1HL0gtJyUs7u7n3Q==} - dependencies: - acorn: 8.8.2 - dev: true - - /supports-preserve-symlinks-flag@1.0.0: - resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} - engines: {node: '>= 0.4'} - dev: true - - /time-zone@1.0.0: - resolution: {integrity: sha512-TIsDdtKo6+XrPtiTm1ssmMngN1sAhyKnTO2kunQWqNPWIVvCm15Wmw4SWInwTVgJ5u/Tr04+8Ei9TNcw4x4ONA==} - engines: {node: '>=4'} - dev: true - - /tinybench@2.4.0: - resolution: {integrity: sha512-iyziEiyFxX4kyxSp+MtY1oCH/lvjH3PxFN8PGCDeqcZWAJ/i+9y+nL85w99PxVzrIvew/GSkSbDYtiGVa85Afg==} - dev: true - - /tinypool@0.4.0: - resolution: {integrity: sha512-2ksntHOKf893wSAH4z/+JbPpi92esw8Gn9N2deXX+B0EO92hexAVI9GIZZPx7P5aYo5KULfeOSt3kMOmSOy6uA==} - engines: {node: '>=14.0.0'} - dev: true - - /tinyspy@2.1.0: - resolution: {integrity: sha512-7eORpyqImoOvkQJCSkL0d0mB4NHHIFAy4b1u8PHdDa7SjGS2njzl6/lyGoZLm+eyYEtlUmFGE0rFj66SWxZgQQ==} - engines: {node: '>=14.0.0'} - dev: true - - /ts-essentials@9.3.1(typescript@5.0.4): - resolution: {integrity: sha512-9CChSvQMyVRo29Vb1A2jbs+LKo3d/bAf+ndSaX0T8cEiy/HChVaRN/HY5DqUryZ8hZ6uol9bEgCnGmnDbwBR9Q==} - peerDependencies: - typescript: '>=4.1.0' - dependencies: - typescript: 5.0.4 - dev: true - - /type-detect@4.0.8: - resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} - engines: {node: '>=4'} - dev: true - - /typescript@5.0.4: - resolution: {integrity: sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==} - engines: {node: '>=12.20'} - hasBin: true - dev: true - - /ufo@1.1.1: - resolution: {integrity: sha512-MvlCc4GHrmZdAllBc0iUDowff36Q9Ndw/UzqmEKyrfSzokTd9ZCy1i+IIk5hrYKkjoYVQyNbrw7/F8XJ2rEwTg==} - dev: true - - /vite-node@0.30.0(@types/node@18.15.11): - resolution: {integrity: sha512-23X5Ggylx0kU/bMf8MCcEEl55d/gsTtU81mMZjm7Z0FSpgKZexUqmX3mJtgglP9SySQQs9ydYg/GEahi/cKHaA==} - engines: {node: '>=v14.18.0'} - hasBin: true - dependencies: - cac: 6.7.14 - debug: 4.3.4 - mlly: 1.2.0 - pathe: 1.1.0 - picocolors: 1.0.0 - vite: 4.2.1(@types/node@18.15.11) - transitivePeerDependencies: - - '@types/node' - - less - - sass - - stylus - - sugarss - - supports-color - - terser - dev: true - - /vite@4.2.1(@types/node@18.15.11): - resolution: {integrity: sha512-7MKhqdy0ISo4wnvwtqZkjke6XN4taqQ2TBaTccLIpOKv7Vp2h4Y+NpmWCnGDeSvvn45KxvWgGyb0MkHvY1vgbg==} - engines: {node: ^14.18.0 || >=16.0.0} - hasBin: true - peerDependencies: - '@types/node': '>= 14' - less: '*' - sass: '*' - stylus: '*' - sugarss: '*' - terser: ^5.4.0 - peerDependenciesMeta: - '@types/node': - optional: true - less: - optional: true - sass: - optional: true - stylus: - optional: true - sugarss: - optional: true - terser: - optional: true - dependencies: - '@types/node': 18.15.11 - esbuild: 0.17.16 - postcss: 8.4.21 - resolve: 1.22.2 - rollup: 3.20.2 - optionalDependencies: - fsevents: 2.3.2 - dev: true - - /vitest-mock-extended@1.1.3(typescript@5.0.4)(vitest@0.30.0): - resolution: {integrity: sha512-MiaKYZbTg+fjozKnCpoTTva0BnlSNYyk4jiPuM2xVhg4aou112QIrALdH3/ZKK6qfXWh0A17gFIjWJjylOlXxg==} - peerDependencies: - typescript: 3.x || 4.x || 5.x - vitest: '>=0.29.2' - dependencies: - ts-essentials: 9.3.1(typescript@5.0.4) - typescript: 5.0.4 - vitest: 0.30.0 - dev: true - - /vitest@0.30.0: - resolution: {integrity: sha512-2WW4WeTHtrLFeoiuotWvEW6khozx1NvMGYoGsNz2btdddEbqvEdPJIouIdoiC5i61Rl1ctZvm9cn2R9TcPQlzw==} - engines: {node: '>=v14.18.0'} - hasBin: true - peerDependencies: - '@edge-runtime/vm': '*' - '@vitest/browser': '*' - '@vitest/ui': '*' - happy-dom: '*' - jsdom: '*' - playwright: '*' - safaridriver: '*' - webdriverio: '*' - peerDependenciesMeta: - '@edge-runtime/vm': - optional: true - '@vitest/browser': - optional: true - '@vitest/ui': - optional: true - happy-dom: - optional: true - jsdom: - optional: true - playwright: - optional: true - safaridriver: - optional: true - webdriverio: - optional: true - dependencies: - '@types/chai': 4.3.4 - '@types/chai-subset': 1.3.3 - '@types/node': 18.15.11 - '@vitest/expect': 0.30.0 - '@vitest/runner': 0.30.0 - '@vitest/snapshot': 0.30.0 - '@vitest/spy': 0.30.0 - '@vitest/utils': 0.30.0 - acorn: 8.8.2 - acorn-walk: 8.2.0 - cac: 6.7.14 - chai: 4.3.7 - concordance: 5.0.4 - debug: 4.3.4 - local-pkg: 0.4.3 - magic-string: 0.30.0 - pathe: 1.1.0 - picocolors: 1.0.0 - source-map: 0.6.1 - std-env: 3.3.2 - strip-literal: 1.0.1 - tinybench: 2.4.0 - tinypool: 0.4.0 - vite: 4.2.1(@types/node@18.15.11) - vite-node: 0.30.0(@types/node@18.15.11) - why-is-node-running: 2.2.2 - transitivePeerDependencies: - - less - - sass - - stylus - - sugarss - - supports-color - - terser - dev: true - - /well-known-symbols@2.0.0: - resolution: {integrity: sha512-ZMjC3ho+KXo0BfJb7JgtQ5IBuvnShdlACNkKkdsqBmYw3bPAaJfPeYUo6tLUaT5tG/Gkh7xkpBhKRQ9e7pyg9Q==} - engines: {node: '>=6'} - 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 - - /yallist@4.0.0: - resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} - dev: true - - /yocto-queue@1.0.0: - resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} - engines: {node: '>=12.20'} - dev: true From 0cd6de497cf1e9c753ff9eb36be7af733881c750 Mon Sep 17 00:00:00 2001 From: Florian LEROUX <10078837+floriaaan@users.noreply.github.com> Date: Wed, 10 May 2023 16:19:22 +0200 Subject: [PATCH 137/883] fix(prisma): add "native" to targets --- services/delivery/prisma/schema.prisma | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/delivery/prisma/schema.prisma b/services/delivery/prisma/schema.prisma index fe4bce5f..abfaba00 100644 --- a/services/delivery/prisma/schema.prisma +++ b/services/delivery/prisma/schema.prisma @@ -5,7 +5,7 @@ datasource db { generator client { provider = "prisma-client-js" - binaryTargets = ["linux-musl", "linux-musl-openssl-3.0.x"] + binaryTargets = ["native", "linux-musl", "linux-musl-openssl-3.0.x"] } enum Status { From fd136f674cb9cc39e57dceff70796c53e0df1253 Mon Sep 17 00:00:00 2001 From: Florian LEROUX <10078837+floriaaan@users.noreply.github.com> Date: Wed, 10 May 2023 16:19:38 +0200 Subject: [PATCH 138/883] fix(proto): add proto symlink --- services/delivery/proto | 1 + 1 file changed, 1 insertion(+) create mode 120000 services/delivery/proto diff --git a/services/delivery/proto b/services/delivery/proto new file mode 120000 index 00000000..4d1e2d8b --- /dev/null +++ b/services/delivery/proto @@ -0,0 +1 @@ +../proto/ \ No newline at end of file From bffd568414e3bf197aa7701b71747ca3fd5aa3f9 Mon Sep 17 00:00:00 2001 From: Florian LEROUX <10078837+floriaaan@users.noreply.github.com> Date: Wed, 10 May 2023 16:19:59 +0200 Subject: [PATCH 139/883] feat(amqp): add amqp log publisher --- services/delivery/package.json | 6 +- services/delivery/pnpm-lock.yaml | 106 ++++++++++++++++++++++++------ services/delivery/src/lib/amqp.ts | 32 +++++++++ 3 files changed, 122 insertions(+), 22 deletions(-) create mode 100644 services/delivery/src/lib/amqp.ts diff --git a/services/delivery/package.json b/services/delivery/package.json index 5df9a80b..dfc8839e 100644 --- a/services/delivery/package.json +++ b/services/delivery/package.json @@ -21,17 +21,19 @@ "dependencies": { "@grpc/grpc-js": "^1.8.13", "@grpc/proto-loader": "0.7.6", - "@prisma/client": "4.11.0", + "@prisma/client": "4.14.0", + "amqplib": "^0.10.3", "dotenv": "^16.0.3", "protobufjs": "7.2.2" }, "devDependencies": { + "@types/amqplib": "^0.10.1", "@types/node": "18.15.9", "@vitest/coverage-c8": "^0.29.8", "esbuild": "^0.17.14", "nodemon": "^2.0.22", "pkg": "^5.8.1", - "prisma": "4.11.0", + "prisma": "4.14.0", "ts-node": "10.9.1", "tsconfig-paths": "^4.1.2", "typescript": "5.0.2", diff --git a/services/delivery/pnpm-lock.yaml b/services/delivery/pnpm-lock.yaml index 1d1dba13..9d320234 100644 --- a/services/delivery/pnpm-lock.yaml +++ b/services/delivery/pnpm-lock.yaml @@ -8,8 +8,11 @@ dependencies: specifier: 0.7.6 version: 0.7.6 '@prisma/client': - specifier: 4.11.0 - version: 4.11.0(prisma@4.11.0) + specifier: 4.14.0 + version: 4.14.0(prisma@4.14.0) + amqplib: + specifier: ^0.10.3 + version: 0.10.3 dotenv: specifier: ^16.0.3 version: 16.0.3 @@ -18,6 +21,9 @@ dependencies: version: 7.2.2 devDependencies: + '@types/amqplib': + specifier: ^0.10.1 + version: 0.10.1 '@types/node': specifier: 18.15.9 version: 18.15.9 @@ -34,8 +40,8 @@ devDependencies: specifier: ^5.8.1 version: 5.8.1 prisma: - specifier: 4.11.0 - version: 4.11.0 + specifier: 4.14.0 + version: 4.14.0 ts-node: specifier: 10.9.1 version: 10.9.1(@types/node@18.15.9)(typescript@5.0.2) @@ -57,6 +63,17 @@ devDependencies: packages: + /@acuminous/bitsyntax@0.1.2: + resolution: {integrity: sha512-29lUK80d1muEQqiUsSo+3A0yP6CdspgC95EnKBMi22Xlwt79i/En4Vr67+cXhU+cZjbti3TgGGC5wy1stIywVQ==} + engines: {node: '>=0.8'} + dependencies: + buffer-more-ints: 1.0.0 + debug: 4.3.4 + safe-buffer: 5.1.2 + transitivePeerDependencies: + - supports-color + dev: false + /@babel/generator@7.18.2: resolution: {integrity: sha512-W1lG5vUwFvfMd8HVXqdfbuG7RuaSrTCCD8cl8fP8wOivdbtbIg2Db3IWUcgvfxKbbn6ZBGYRW/Zk1MIwK49mgw==} engines: {node: '>=6.9.0'} @@ -385,8 +402,8 @@ packages: fastq: 1.15.0 dev: true - /@prisma/client@4.11.0(prisma@4.11.0): - resolution: {integrity: sha512-0INHYkQIqgAjrt7NzhYpeDQi8x3Nvylc2uDngKyFDDj1tTRQ4uV1HnVmd1sQEraeVAN63SOK0dgCKQHlvjL0KA==} + /@prisma/client@4.14.0(prisma@4.14.0): + resolution: {integrity: sha512-MK/XaA2sFdfaOa7I9MjNKz6dxeIEdeZlnpNRoF2w3JuRLlFJLkpp6cD3yaqw2nUUhbrn3Iqe3ZpVV+VuGGil7Q==} engines: {node: '>=14.17'} requiresBuild: true peerDependencies: @@ -395,16 +412,16 @@ packages: prisma: optional: true dependencies: - '@prisma/engines-version': 4.11.0-57.8fde8fef4033376662cad983758335009d522acb - prisma: 4.11.0 + '@prisma/engines-version': 4.14.0-67.d9a4c5988f480fa576d43970d5a23641aa77bc9c + prisma: 4.14.0 dev: false - /@prisma/engines-version@4.11.0-57.8fde8fef4033376662cad983758335009d522acb: - resolution: {integrity: sha512-3Vd8Qq06d5xD8Ch5WauWcUUrsVPdMC6Ge8ILji8RFfyhUpqon6qSyGM0apvr1O8n8qH8cKkEFqRPsYjuz5r83g==} + /@prisma/engines-version@4.14.0-67.d9a4c5988f480fa576d43970d5a23641aa77bc9c: + resolution: {integrity: sha512-3jum8/YSudeSN0zGW5qkpz+wAN2V/NYCQ+BPjvHYDfWatLWlQkqy99toX0GysDeaUoBIJg1vaz2yKqiA3CFcQw==} dev: false - /@prisma/engines@4.11.0: - resolution: {integrity: sha512-0AEBi2HXGV02cf6ASsBPhfsVIbVSDC9nbQed4iiY5eHttW9ZtMxHThuKZE1pnESbr8HRdgmFSa/Kn4OSNYuibg==} + /@prisma/engines@4.14.0: + resolution: {integrity: sha512-PDNlhP/1vyTgmNyiucGqGCdXIp7HIkkvKO50si3y3PcceeHvqtiKPaH1iJdz63jCWMVMbj2MElSxXPOeBvEVIQ==} requiresBuild: true /@protobufjs/aspromise@1.1.2: @@ -466,6 +483,12 @@ packages: resolution: {integrity: sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==} dev: true + /@types/amqplib@0.10.1: + resolution: {integrity: sha512-j6ANKT79ncUDnAs/+9r9eDujxbeJoTjoVu33gHHcaPfmLQaMhvfbH2GqSe8KUM444epAp1Vl3peVOQfZk3UIqA==} + dependencies: + '@types/node': 18.15.9 + dev: true + /@types/chai-subset@1.3.3: resolution: {integrity: sha512-frBecisrNGz+F4T6bcc+NLeolfiojh5FxW2klu669+8BARtyQv2C/GkNW6FUodVe4BroGMP/wER/YDGc7rEllw==} dependencies: @@ -553,6 +576,18 @@ packages: - supports-color dev: true + /amqplib@0.10.3: + resolution: {integrity: sha512-UHmuSa7n8vVW/a5HGh2nFPqAEr8+cD4dEZ6u9GjP91nHfr1a54RyAKyra7Sb5NH7NBKOUlyQSMXIp0qAixKexw==} + engines: {node: '>=10'} + dependencies: + '@acuminous/bitsyntax': 0.1.2 + buffer-more-ints: 1.0.0 + readable-stream: 1.1.14 + url-parse: 1.5.10 + transitivePeerDependencies: + - supports-color + dev: false + /ansi-regex@5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} @@ -639,6 +674,10 @@ packages: fill-range: 7.0.1 dev: true + /buffer-more-ints@1.0.0: + resolution: {integrity: sha512-EMetuGFz5SLsT0QTnXzINh4Ksr+oo4i+UGTXEshiGCQWnsgSs7ZhJ8fzlwQ+OzEMs0MpDAMr1hxnblp5a4vcHg==} + dev: false + /buffer@5.7.1: resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} dependencies: @@ -748,7 +787,6 @@ packages: /core-util-is@1.0.3: resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} - dev: true /create-require@1.1.1: resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} @@ -785,7 +823,6 @@ packages: optional: true dependencies: ms: 2.1.2 - dev: true /decompress-response@6.0.0: resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} @@ -1069,7 +1106,6 @@ packages: /inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - dev: true /ini@1.3.8: resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} @@ -1122,6 +1158,10 @@ packages: engines: {node: '>=0.12.0'} dev: true + /isarray@0.0.1: + resolution: {integrity: sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==} + dev: false + /isarray@1.0.0: resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} dev: true @@ -1267,7 +1307,6 @@ packages: /ms@2.1.2: resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - dev: true /ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} @@ -1501,13 +1540,13 @@ packages: react-is: 17.0.2 dev: true - /prisma@4.11.0: - resolution: {integrity: sha512-4zZmBXssPUEiX+GeL0MUq/Yyie4ltiKmGu7jCJFnYMamNrrulTBc+D+QwAQSJ01tyzeGHlD13kOnqPwRipnlNw==} + /prisma@4.14.0: + resolution: {integrity: sha512-+5dMl1uxMQb4RepndY6AwR9xi1cDcaGFICu+ws6/Nmgt93mFPNj8tYxSfTdmfg+rkNrUId9rk/Ac2vTgLe/oXA==} engines: {node: '>=14.17'} hasBin: true requiresBuild: true dependencies: - '@prisma/engines': 4.11.0 + '@prisma/engines': 4.14.0 /process-nextick-args@2.0.1: resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} @@ -1548,6 +1587,10 @@ packages: once: 1.4.0 dev: true + /querystringify@2.2.0: + resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} + dev: false + /queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} dev: true @@ -1566,6 +1609,15 @@ packages: resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} dev: true + /readable-stream@1.1.14: + resolution: {integrity: sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==} + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 0.0.1 + string_decoder: 0.10.31 + dev: false + /readable-stream@2.3.8: resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} dependencies: @@ -1598,6 +1650,10 @@ packages: resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} engines: {node: '>=0.10.0'} + /requires-port@1.0.0: + resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} + dev: false + /resolve@1.22.1: resolution: {integrity: sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==} hasBin: true @@ -1635,7 +1691,6 @@ packages: /safe-buffer@5.1.2: resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} - dev: true /safe-buffer@5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} @@ -1757,6 +1812,10 @@ packages: strip-ansi: 7.0.1 dev: true + /string_decoder@0.10.31: + resolution: {integrity: sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==} + dev: false + /string_decoder@1.1.1: resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} dependencies: @@ -1974,6 +2033,13 @@ packages: engines: {node: '>= 10.0.0'} dev: true + /url-parse@1.5.10: + resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} + dependencies: + querystringify: 2.2.0 + requires-port: 1.0.0 + dev: false + /util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} dev: true diff --git a/services/delivery/src/lib/amqp.ts b/services/delivery/src/lib/amqp.ts new file mode 100644 index 00000000..bd4780f7 --- /dev/null +++ b/services/delivery/src/lib/amqp.ts @@ -0,0 +1,32 @@ +import amqp from "amqplib"; +import { msg } from "@delivery/middleware/log"; +import { log } from "@delivery/lib/log"; + +const DEFAULT_QUEUE = "log"; + +async function connectQueue(queue = DEFAULT_QUEUE) { + try { + const connection = await amqp.connect(process.env.AMQP_URL || ""); + const channel = await connection.createChannel(); + await channel.assertExchange(queue, "fanout", { durable: true }); + return channel; + } catch (error) { + return error as Error; + } +} + +const toLog = (message: any) => { + const { request, path } = message; + return { event_message: path, metadata: { request } }; +}; + +export const publish = async (message: any, queue = DEFAULT_QUEUE) => { + const channel = await connectQueue(queue); + if (channel instanceof Error) + return console.log("Error to connect to queue: ", channel); + channel.sendToQueue(queue, Buffer.from(JSON.stringify(toLog(message)))); + log.debug( + msg("AMQP", `${queue} (queue)`, new Date(), new Date()), + JSON.stringify(message) + ); +}; From e36325451443e3b068555f40b126e51f816ae562 Mon Sep 17 00:00:00 2001 From: Florian LEROUX <10078837+floriaaan@users.noreply.github.com> Date: Wed, 10 May 2023 16:20:21 +0200 Subject: [PATCH 140/883] feat(proxy): add serverproxy --- services/delivery/src/lib/proxy.ts | 132 ++++++++++++++++++++++++ services/delivery/src/middleware/log.ts | 41 ++++++++ services/delivery/src/server.ts | 21 ++-- 3 files changed, 187 insertions(+), 7 deletions(-) create mode 100644 services/delivery/src/lib/proxy.ts create mode 100644 services/delivery/src/middleware/log.ts diff --git a/services/delivery/src/lib/proxy.ts b/services/delivery/src/lib/proxy.ts new file mode 100644 index 00000000..b05d24a6 --- /dev/null +++ b/services/delivery/src/lib/proxy.ts @@ -0,0 +1,132 @@ +import { Server, status } from "@grpc/grpc-js"; + +const getType = (method: { + requestStream: boolean; + responseStream: boolean; +}) => { + if (method.requestStream === false && method.responseStream === false) { + return "unary"; + } + return "unknown"; +}; + + +const lookupServiceMetadata = (service: { [x: string]: any }) => { + const serviceKeys = Object.keys(service); + const intersectingMethods = serviceKeys.reduce((acc, k) => { + const method = service[k]; + if (!method) { + throw new Error(`cannot find method ${k} on service`); + } + const components = method.path.split("/"); + acc[k] = { + name: components[1], + method: components[2], + type: getType(method), + path: method.path, + responseType: method.responseType, + requestType: method.requestType, + }; + return acc; + }, {} as any); + + return (key: string) => intersectingMethods[key]; +}; + +export const handler = { + get( + target: { + [x: string]: any; + intercept: () => any; + addService: (arg0: any, arg1: {}) => any; + }, + propKey: string + ) { + if (propKey !== "addService") { + return target[propKey]; + } + return (service: any, implementation: { [x: string]: any }) => { + const newImplementation = {} as any; + const lookup = lookupServiceMetadata(service); + for (const k in implementation) { + const name = k; + const fn = implementation[k]; + newImplementation[name] = (call: any, callback: any) => { + const ctx = { + call, + name, + service: lookup(name), + status: { + code: status.UNKNOWN, + details: "", + }, + }; + const newCallback = (callback: (arg0: any) => void) => { + return (...args: any[]) => { + ctx.status = { + code: status.OK, + details: "", + }; + const err = args[0]; + if (err) { + ctx.status = { + code: status.UNKNOWN, + details: err, + }; + } + // @ts-ignore + callback(...args); + }; + }; + + const interceptors = target.intercept(); + const first = interceptors.next(); + if (!first.value) { + // if we don't have any interceptors + return new Promise((resolve) => { + return resolve(fn(call, newCallback(callback))); + }); + } + first.value(ctx, function next() { + return new Promise((resolve) => { + const i = interceptors.next(); + if (i.done) { + return resolve(fn(call, newCallback(callback))); + } + return resolve(i.value(ctx, next)); + }); + }); + }; + } + return target.addService(service, newImplementation); + }; + }, +}; + +export const createServerProxy = ( + server: Server +): Server & { + intercept: Generator; + interceptors: any[]; + use: (fn: any) => void; +} => { + // @ts-ignore + server.interceptors = []; + // @ts-ignore + server.use = (fn: any) => { + // @ts-ignore + server.interceptors.push(fn); + }; + // @ts-ignore + server.intercept = function* intercept() { + let i = 0; + // @ts-ignore + while (i < server.interceptors.length) { + // @ts-ignore + yield server.interceptors[i]; + i++; + } + }; + // @ts-ignore + return new Proxy(server, handler); +}; \ No newline at end of file diff --git a/services/delivery/src/middleware/log.ts b/services/delivery/src/middleware/log.ts new file mode 100644 index 00000000..1a8c08eb --- /dev/null +++ b/services/delivery/src/middleware/log.ts @@ -0,0 +1,41 @@ +import { publish } from "@delivery/lib/amqp"; +import { utils } from "@delivery/lib/log"; +import { log } from "@delivery/lib/log"; + +type Context = { + call: { + request: Map; + }; + service: { + path: string; + }; +}; + +const parseContext = (ctx: Context) => { + const { + call: { request }, + service: { path }, + } = ctx; + return { request, path }; +}; + +export const msg = ( + type: "GRPC" | "AMQP", + path: string | undefined, + requestAt: Date, + responseAt: Date +) => + `${utils.magenta(requestAt.toISOString())} | ${utils[ + type === "GRPC" ? "cyan" : "red" + ](type)}${path ? ` | ${utils.yellow(path)}` : ""} | ${utils.green( + responseAt.getTime() - requestAt.getTime() + "ms" + )} |`; + +export const logGRPC = async (ctx: Context, next: () => Promise) => { + const requestAt = new Date(); + await next(); + const responseAt = new Date(); + const { request, path } = parseContext(ctx); + publish({ request, path }, "log"); + log.debug(msg("GRPC", path, requestAt, responseAt), JSON.stringify(request)); +}; \ No newline at end of file diff --git a/services/delivery/src/server.ts b/services/delivery/src/server.ts index 04fb474f..238462c3 100644 --- a/services/delivery/src/server.ts +++ b/services/delivery/src/server.ts @@ -1,4 +1,5 @@ import "dotenv/config"; +import { resolve as resolvePath } from "path"; import { loadSync } from "@grpc/proto-loader"; import { loadPackageDefinition, Server } from "@grpc/grpc-js"; @@ -9,17 +10,24 @@ import { serverInsecure } from "@delivery/resources/grpc-credentials"; import deliveryHandlers from "@delivery/handlers/delivery"; import personHandlers from "@delivery/handlers/person"; +import { createServerProxy } from "@delivery/lib/proxy"; +import { logGRPC } from "@delivery/middleware/log"; const PORT = process.env.PORT || 50008; const ADDRESS = `0.0.0.0:${PORT}`; -const PROTO_PATH = __dirname + "/../../proto/delivery.proto"; +const PROTO_PATH = resolvePath(__dirname + "/../../proto/delivery.proto"); const packageDefinition = loadSync(PROTO_PATH, options); -const { delivery } = loadPackageDefinition(packageDefinition) as any; // todo: fix any -const server = new Server(); +const grpc = loadPackageDefinition(packageDefinition) as any; +const { + DeliveryService: { service: ds }, + DeliveryPersonService: { service: dps }, +} = grpc.com.goodfood.delivery; -server.addService(delivery.DeliveryService.service, deliveryHandlers); -server.addService(delivery.DeliveryPersonService.service, personHandlers); +const server = createServerProxy(new Server()); +server.addService(ds, deliveryHandlers); +server.addService(dps, personHandlers); +server.use(logGRPC); server.bindAsync(ADDRESS, serverInsecure, () => { server.start(); @@ -31,5 +39,4 @@ server.bindAsync(ADDRESS, serverInsecure, () => { log.debug(message); }); - -export default server; \ No newline at end of file +export default server; From c942935127ee5ed5a29796d249d4aa7f26b45b8b Mon Sep 17 00:00:00 2001 From: Florian LEROUX <10078837+floriaaan@users.noreply.github.com> Date: Wed, 10 May 2023 16:20:32 +0200 Subject: [PATCH 141/883] ref(proxy): remove log in handlers --- services/delivery/src/handlers/delivery/create.ts | 1 - services/delivery/src/handlers/delivery/delete.ts | 1 - services/delivery/src/handlers/delivery/get.ts | 1 - services/delivery/src/handlers/delivery/list-by-restaurant.ts | 4 ---- services/delivery/src/handlers/delivery/list-by-user.ts | 1 - services/delivery/src/handlers/delivery/update.ts | 1 - services/delivery/src/handlers/person/create.ts | 1 - services/delivery/src/handlers/person/delete.ts | 1 - services/delivery/src/handlers/person/get.ts | 1 - services/delivery/src/handlers/person/list-near.ts | 1 - services/delivery/src/handlers/person/list.ts | 1 - services/delivery/src/handlers/person/update.ts | 1 - services/proto/delivery.proto | 2 +- 13 files changed, 1 insertion(+), 16 deletions(-) diff --git a/services/delivery/src/handlers/delivery/create.ts b/services/delivery/src/handlers/delivery/create.ts index 1524de68..bba17ce1 100644 --- a/services/delivery/src/handlers/delivery/create.ts +++ b/services/delivery/src/handlers/delivery/create.ts @@ -7,7 +7,6 @@ export const CreateDelivery = async ( { request }: Data, callback: (err: any, response: any) => void ) => { - log.debug("request received at CreateDelivery handler\n", request); try { const { eta, address, status, delivery_person_id, restaurant_id, user_id } = request; diff --git a/services/delivery/src/handlers/delivery/delete.ts b/services/delivery/src/handlers/delivery/delete.ts index 35b5ade7..d6104883 100644 --- a/services/delivery/src/handlers/delivery/delete.ts +++ b/services/delivery/src/handlers/delivery/delete.ts @@ -7,7 +7,6 @@ export const DeleteDelivery = async ( data: Data, callback: (err: any, response: any) => void ) => { - log.debug("request received at DeleteDelivery handler\n", data.request); try { const { request } = data; const { id } = request; diff --git a/services/delivery/src/handlers/delivery/get.ts b/services/delivery/src/handlers/delivery/get.ts index c6da00b3..531a1dc9 100644 --- a/services/delivery/src/handlers/delivery/get.ts +++ b/services/delivery/src/handlers/delivery/get.ts @@ -7,7 +7,6 @@ export const GetDelivery = async ( data: Data, callback: (err: any, response: any) => void ) => { - log.debug("request received at GetDelivery handler\n", data.request); try { const { request } = data; const { id } = request; diff --git a/services/delivery/src/handlers/delivery/list-by-restaurant.ts b/services/delivery/src/handlers/delivery/list-by-restaurant.ts index fc413ae1..d0769b65 100644 --- a/services/delivery/src/handlers/delivery/list-by-restaurant.ts +++ b/services/delivery/src/handlers/delivery/list-by-restaurant.ts @@ -7,10 +7,6 @@ export const ListDeliveriesByRestaurant = async ( data: Data, callback: (err: any, response: any) => void ) => { - log.debug( - "request received at ListDeliveriesByRestaurant handler\n", - data.request - ); try { const { request } = data; const { id } = request; diff --git a/services/delivery/src/handlers/delivery/list-by-user.ts b/services/delivery/src/handlers/delivery/list-by-user.ts index 93eddff9..516b0d8e 100644 --- a/services/delivery/src/handlers/delivery/list-by-user.ts +++ b/services/delivery/src/handlers/delivery/list-by-user.ts @@ -7,7 +7,6 @@ export const ListDeliveriesByUser = async ( data: Data, callback: (err: any, response: any) => void ) => { - log.debug("request received at ListDeliveriesByUser handler\n", data.request); try { const { request } = data; const { id } = request; diff --git a/services/delivery/src/handlers/delivery/update.ts b/services/delivery/src/handlers/delivery/update.ts index a0267647..2c3f7f47 100644 --- a/services/delivery/src/handlers/delivery/update.ts +++ b/services/delivery/src/handlers/delivery/update.ts @@ -7,7 +7,6 @@ export const UpdateDelivery = async ( data: Data, callback: (err: any, response: any) => void ) => { - log.debug("request received at UpdateDelivery handler\n", data.request); try { const { eta, address, status, delivery_person_id, id } = data.request; diff --git a/services/delivery/src/handlers/person/create.ts b/services/delivery/src/handlers/person/create.ts index 1a918438..6e8d7701 100644 --- a/services/delivery/src/handlers/person/create.ts +++ b/services/delivery/src/handlers/person/create.ts @@ -7,7 +7,6 @@ export const CreateDeliveryPerson = async ( { request }: Data, callback: (err: any, response: any) => void ) => { - log.debug("request received at CreateDeliveryPerson handler\n", request); try { const { first_name, last_name, phone, location } = request; diff --git a/services/delivery/src/handlers/person/delete.ts b/services/delivery/src/handlers/person/delete.ts index 9edfd117..de459ec3 100644 --- a/services/delivery/src/handlers/person/delete.ts +++ b/services/delivery/src/handlers/person/delete.ts @@ -7,7 +7,6 @@ export const DeleteDeliveryPerson = async ( { request }: Data, callback: (err: any, response: any) => void ) => { - log.debug("request received at DeleteDeliveryPerson handler\n", request); try { const { id } = request; await prisma.deliveryPerson.delete({ where: { id } }); diff --git a/services/delivery/src/handlers/person/get.ts b/services/delivery/src/handlers/person/get.ts index e94093df..b92c0ead 100644 --- a/services/delivery/src/handlers/person/get.ts +++ b/services/delivery/src/handlers/person/get.ts @@ -7,7 +7,6 @@ export const GetDeliveryPerson = async ( { request }: Data, callback: (err: any, response: any) => void ) => { - log.debug("request received at GetDeliveryPerson handler\n", request); try { const { id } = request; const deliveryPerson = await prisma.deliveryPerson.findUnique({ diff --git a/services/delivery/src/handlers/person/list-near.ts b/services/delivery/src/handlers/person/list-near.ts index 900e5ac9..5daec2e2 100644 --- a/services/delivery/src/handlers/person/list-near.ts +++ b/services/delivery/src/handlers/person/list-near.ts @@ -7,7 +7,6 @@ export const ListNearDeliveryPersons = async ( { request }: Data, callback: (err: any, response: any) => void ) => { - log.debug("request received at ListNearDeliveryPersons handler\n", request); try { const { latitude, longitude } = request; const maxDistance = 10; // in km //TODO: make this a parameter diff --git a/services/delivery/src/handlers/person/list.ts b/services/delivery/src/handlers/person/list.ts index 468ea5e3..83cf2536 100644 --- a/services/delivery/src/handlers/person/list.ts +++ b/services/delivery/src/handlers/person/list.ts @@ -6,7 +6,6 @@ export const ListDeliveryPersons = async ( { request }: Data<{}>, callback: (err: any, response: any) => void ) => { - log.debug("request received at ListDeliveryPersons handler\n", request); try { const delivery_persons = await prisma.deliveryPerson.findMany(); callback(null, { delivery_persons }); diff --git a/services/delivery/src/handlers/person/update.ts b/services/delivery/src/handlers/person/update.ts index 7a6b1743..e177a9f2 100644 --- a/services/delivery/src/handlers/person/update.ts +++ b/services/delivery/src/handlers/person/update.ts @@ -7,7 +7,6 @@ export const UpdateDeliveryPerson = async ( { request }: Data, callback: (err: any, response: any) => void ) => { - log.debug("request received at UpdateDeliveryPerson handler\n", request); try { const { id, first_name, last_name, location, phone } = request; diff --git a/services/proto/delivery.proto b/services/proto/delivery.proto index 91a86b21..6ae4a8c3 100644 --- a/services/proto/delivery.proto +++ b/services/proto/delivery.proto @@ -1,7 +1,7 @@ syntax = "proto3"; import "google/protobuf/empty.proto"; -package delivery; +package com.goodfood.delivery; message Delivery { string id = 1; From 7274d8c4331ddfca8e963b14188c70ee05cd28c0 Mon Sep 17 00:00:00 2001 From: anatole Date: Thu, 11 May 2023 12:09:59 +0200 Subject: [PATCH 142/883] feat(validate): add validate jwt token route --- services/proto/user.pb.go | 562 +++++++++++++-------- services/proto/user.proto | 21 +- services/proto/user_grpc.pb.go | 38 +- services/user/src/Makefile | 2 +- services/user/src/pkg/config/config.go | 2 +- services/user/src/pkg/config/env/dev.env | 4 +- services/user/src/pkg/mapper/userMapper.go | 11 - services/user/src/pkg/models/user.go | 1 - services/user/src/pkg/services/auth.go | 35 +- services/user/src/pkg/utils/jwt.go | 31 +- 10 files changed, 430 insertions(+), 277 deletions(-) diff --git a/services/proto/user.pb.go b/services/proto/user.pb.go index 0cf49068..5f6a9fb8 100644 --- a/services/proto/user.pb.go +++ b/services/proto/user.pb.go @@ -8,7 +8,6 @@ package __ import ( empty "github.com/golang/protobuf/ptypes/empty" - _struct "github.com/golang/protobuf/ptypes/struct" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" reflect "reflect" @@ -177,14 +176,13 @@ type User struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - FirstName string `protobuf:"bytes,2,opt,name=first_name,json=firstName,proto3" json:"first_name,omitempty"` - LastName string `protobuf:"bytes,3,opt,name=last_name,json=lastName,proto3" json:"last_name,omitempty"` - Email string `protobuf:"bytes,4,opt,name=email,proto3" json:"email,omitempty"` - Phone string `protobuf:"bytes,5,opt,name=phone,proto3" json:"phone,omitempty"` - MainAddress *MainAddress `protobuf:"bytes,6,opt,name=mainAddress,proto3" json:"mainAddress,omitempty"` - Role *Role `protobuf:"bytes,7,opt,name=role,proto3" json:"role,omitempty"` - Token *_struct.Struct `protobuf:"bytes,8,opt,name=token,proto3" json:"token,omitempty"` + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + FirstName string `protobuf:"bytes,2,opt,name=first_name,json=firstName,proto3" json:"first_name,omitempty"` + LastName string `protobuf:"bytes,3,opt,name=last_name,json=lastName,proto3" json:"last_name,omitempty"` + Email string `protobuf:"bytes,4,opt,name=email,proto3" json:"email,omitempty"` + Phone string `protobuf:"bytes,5,opt,name=phone,proto3" json:"phone,omitempty"` + MainAddress *MainAddress `protobuf:"bytes,6,opt,name=mainAddress,proto3" json:"mainAddress,omitempty"` + Role *Role `protobuf:"bytes,7,opt,name=role,proto3" json:"role,omitempty"` } func (x *User) Reset() { @@ -268,13 +266,6 @@ func (x *User) GetRole() *Role { return nil } -func (x *User) GetToken() *_struct.Struct { - if x != nil { - return x.Token - } - return nil -} - type UserCreateInput struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -645,16 +636,16 @@ func (x *LogInInput) GetPassword() string { return "" } -type Token struct { +type ValidateInput struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Token *_struct.Struct `protobuf:"bytes,1,opt,name=token,proto3" json:"token,omitempty"` + Token string `protobuf:"bytes,1,opt,name=token,proto3" json:"token,omitempty"` } -func (x *Token) Reset() { - *x = Token{} +func (x *ValidateInput) Reset() { + *x = ValidateInput{} if protoimpl.UnsafeEnabled { mi := &file_user_proto_msgTypes[9] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -662,13 +653,13 @@ func (x *Token) Reset() { } } -func (x *Token) String() string { +func (x *ValidateInput) String() string { return protoimpl.X.MessageStringOf(x) } -func (*Token) ProtoMessage() {} +func (*ValidateInput) ProtoMessage() {} -func (x *Token) ProtoReflect() protoreflect.Message { +func (x *ValidateInput) ProtoReflect() protoreflect.Message { mi := &file_user_proto_msgTypes[9] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -680,18 +671,128 @@ func (x *Token) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use Token.ProtoReflect.Descriptor instead. -func (*Token) Descriptor() ([]byte, []int) { +// Deprecated: Use ValidateInput.ProtoReflect.Descriptor instead. +func (*ValidateInput) Descriptor() ([]byte, []int) { return file_user_proto_rawDescGZIP(), []int{9} } -func (x *Token) GetToken() *_struct.Struct { +func (x *ValidateInput) GetToken() string { if x != nil { return x.Token } + return "" +} + +type ValidateResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Error string `protobuf:"bytes,1,opt,name=error,proto3" json:"error,omitempty"` + UserId string `protobuf:"bytes,2,opt,name=userId,proto3" json:"userId,omitempty"` +} + +func (x *ValidateResponse) Reset() { + *x = ValidateResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_user_proto_msgTypes[10] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ValidateResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ValidateResponse) ProtoMessage() {} + +func (x *ValidateResponse) ProtoReflect() protoreflect.Message { + mi := &file_user_proto_msgTypes[10] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ValidateResponse.ProtoReflect.Descriptor instead. +func (*ValidateResponse) Descriptor() ([]byte, []int) { + return file_user_proto_rawDescGZIP(), []int{10} +} + +func (x *ValidateResponse) GetError() string { + if x != nil { + return x.Error + } + return "" +} + +func (x *ValidateResponse) GetUserId() string { + if x != nil { + return x.UserId + } + return "" +} + +type LogInResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + User *User `protobuf:"bytes,1,opt,name=user,proto3" json:"user,omitempty"` + Token string `protobuf:"bytes,2,opt,name=token,proto3" json:"token,omitempty"` +} + +func (x *LogInResponse) Reset() { + *x = LogInResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_user_proto_msgTypes[11] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *LogInResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*LogInResponse) ProtoMessage() {} + +func (x *LogInResponse) ProtoReflect() protoreflect.Message { + mi := &file_user_proto_msgTypes[11] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use LogInResponse.ProtoReflect.Descriptor instead. +func (*LogInResponse) Descriptor() ([]byte, []int) { + return file_user_proto_rawDescGZIP(), []int{11} +} + +func (x *LogInResponse) GetUser() *User { + if x != nil { + return x.User + } return nil } +func (x *LogInResponse) GetToken() string { + if x != nil { + return x.Token + } + return "" +} + type ChangePasswordInput struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -704,7 +805,7 @@ type ChangePasswordInput struct { func (x *ChangePasswordInput) Reset() { *x = ChangePasswordInput{} if protoimpl.UnsafeEnabled { - mi := &file_user_proto_msgTypes[10] + mi := &file_user_proto_msgTypes[12] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -717,7 +818,7 @@ func (x *ChangePasswordInput) String() string { func (*ChangePasswordInput) ProtoMessage() {} func (x *ChangePasswordInput) ProtoReflect() protoreflect.Message { - mi := &file_user_proto_msgTypes[10] + mi := &file_user_proto_msgTypes[12] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -730,7 +831,7 @@ func (x *ChangePasswordInput) ProtoReflect() protoreflect.Message { // Deprecated: Use ChangePasswordInput.ProtoReflect.Descriptor instead. func (*ChangePasswordInput) Descriptor() ([]byte, []int) { - return file_user_proto_rawDescGZIP(), []int{10} + return file_user_proto_rawDescGZIP(), []int{12} } func (x *ChangePasswordInput) GetOldPassword() string { @@ -759,7 +860,7 @@ type ChangeRoleInput struct { func (x *ChangeRoleInput) Reset() { *x = ChangeRoleInput{} if protoimpl.UnsafeEnabled { - mi := &file_user_proto_msgTypes[11] + mi := &file_user_proto_msgTypes[13] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -772,7 +873,7 @@ func (x *ChangeRoleInput) String() string { func (*ChangeRoleInput) ProtoMessage() {} func (x *ChangeRoleInput) ProtoReflect() protoreflect.Message { - mi := &file_user_proto_msgTypes[11] + mi := &file_user_proto_msgTypes[13] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -785,7 +886,7 @@ func (x *ChangeRoleInput) ProtoReflect() protoreflect.Message { // Deprecated: Use ChangeRoleInput.ProtoReflect.Descriptor instead. func (*ChangeRoleInput) Descriptor() ([]byte, []int) { - return file_user_proto_rawDescGZIP(), []int{11} + return file_user_proto_rawDescGZIP(), []int{13} } func (x *ChangeRoleInput) GetUserId() string { @@ -813,7 +914,7 @@ type MainAddressId struct { func (x *MainAddressId) Reset() { *x = MainAddressId{} if protoimpl.UnsafeEnabled { - mi := &file_user_proto_msgTypes[12] + mi := &file_user_proto_msgTypes[14] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -826,7 +927,7 @@ func (x *MainAddressId) String() string { func (*MainAddressId) ProtoMessage() {} func (x *MainAddressId) ProtoReflect() protoreflect.Message { - mi := &file_user_proto_msgTypes[12] + mi := &file_user_proto_msgTypes[14] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -839,7 +940,7 @@ func (x *MainAddressId) ProtoReflect() protoreflect.Message { // Deprecated: Use MainAddressId.ProtoReflect.Descriptor instead. func (*MainAddressId) Descriptor() ([]byte, []int) { - return file_user_proto_rawDescGZIP(), []int{12} + return file_user_proto_rawDescGZIP(), []int{14} } func (x *MainAddressId) GetId() string { @@ -854,149 +955,154 @@ var File_user_proto protoreflect.FileDescriptor var file_user_proto_rawDesc = []byte{ 0x0a, 0x0a, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x11, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x1a, - 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2f, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1b, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x65, - 0x6d, 0x70, 0x74, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x40, 0x0a, 0x04, 0x52, 0x6f, - 0x6c, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, - 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x22, 0x8d, 0x01, 0x0a, - 0x0b, 0x4d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x0e, 0x0a, 0x02, - 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x16, 0x0a, 0x06, - 0x73, 0x74, 0x72, 0x65, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, - 0x72, 0x65, 0x65, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x7a, 0x69, 0x70, 0x43, 0x6f, 0x64, 0x65, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x7a, 0x69, 0x70, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x18, - 0x0a, 0x07, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x07, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6c, 0x61, 0x74, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x02, 0x52, 0x03, 0x6c, 0x61, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6c, 0x6e, - 0x67, 0x18, 0x06, 0x20, 0x01, 0x28, 0x02, 0x52, 0x03, 0x6c, 0x6e, 0x67, 0x22, 0x9c, 0x02, 0x0a, - 0x04, 0x55, 0x73, 0x65, 0x72, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x66, 0x69, 0x72, 0x73, 0x74, 0x5f, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x66, 0x69, 0x72, 0x73, 0x74, - 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6c, 0x61, 0x73, 0x74, 0x4e, 0x61, 0x6d, - 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x68, 0x6f, 0x6e, 0x65, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x68, 0x6f, 0x6e, 0x65, 0x12, 0x40, 0x0a, - 0x0b, 0x6d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, - 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x4d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, - 0x73, 0x73, 0x52, 0x0b, 0x6d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, - 0x2b, 0x0a, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, - 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, - 0x72, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x12, 0x2d, 0x0a, 0x05, - 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, - 0x72, 0x75, 0x63, 0x74, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x8e, 0x02, 0x0a, 0x0f, - 0x55, 0x73, 0x65, 0x72, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x12, - 0x1d, 0x0a, 0x0a, 0x66, 0x69, 0x72, 0x73, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x09, 0x66, 0x69, 0x72, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1b, - 0x0a, 0x09, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x6c, 0x61, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, - 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, - 0x6c, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x14, 0x0a, - 0x05, 0x70, 0x68, 0x6f, 0x6e, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x68, - 0x6f, 0x6e, 0x65, 0x12, 0x45, 0x0a, 0x0b, 0x6d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, - 0x73, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, - 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x4d, 0x61, 0x69, - 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x52, 0x0b, 0x6d, - 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x30, 0x0a, 0x04, 0x72, 0x6f, - 0x6c, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, - 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x52, 0x6f, 0x6c, - 0x65, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x52, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x22, 0x80, 0x01, 0x0a, - 0x10, 0x4d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x49, 0x6e, 0x70, 0x75, - 0x74, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x72, 0x65, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x06, 0x73, 0x74, 0x72, 0x65, 0x65, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x7a, 0x69, 0x70, - 0x43, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x7a, 0x69, 0x70, 0x43, - 0x6f, 0x64, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x20, 0x0a, - 0x0b, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, - 0x28, 0x05, 0x52, 0x0b, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x73, 0x22, - 0x1f, 0x0a, 0x09, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x12, 0x12, 0x0a, 0x04, - 0x63, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, - 0x22, 0x18, 0x0a, 0x06, 0x55, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x39, 0x0a, 0x08, 0x55, 0x73, - 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x2d, 0x0a, 0x05, 0x75, 0x73, 0x65, 0x72, 0x73, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, - 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x05, - 0x75, 0x73, 0x65, 0x72, 0x73, 0x22, 0x56, 0x0a, 0x0a, 0x6c, 0x6f, 0x67, 0x49, 0x6e, 0x49, 0x6e, - 0x70, 0x75, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x65, - 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, - 0x6c, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x22, 0x36, 0x0a, - 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x2d, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x05, - 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x59, 0x0a, 0x13, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, - 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x12, 0x20, 0x0a, 0x0b, - 0x6f, 0x6c, 0x64, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0b, 0x6f, 0x6c, 0x64, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x20, - 0x0a, 0x0b, 0x6e, 0x65, 0x77, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0b, 0x6e, 0x65, 0x77, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, - 0x22, 0x45, 0x0a, 0x0f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, - 0x70, 0x75, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x72, - 0x6f, 0x6c, 0x65, 0x43, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, - 0x6f, 0x6c, 0x65, 0x43, 0x6f, 0x64, 0x65, 0x22, 0x1f, 0x0a, 0x0d, 0x4d, 0x61, 0x69, 0x6e, 0x41, - 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x49, 0x64, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x32, 0x92, 0x05, 0x0a, 0x0b, 0x55, 0x73, 0x65, - 0x72, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x49, 0x0a, 0x08, 0x52, 0x65, 0x67, 0x69, - 0x73, 0x74, 0x65, 0x72, 0x12, 0x22, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, - 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x17, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, + 0x1b, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2f, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x40, 0x0a, 0x04, + 0x52, 0x6f, 0x6c, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, + 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x22, 0x8d, + 0x01, 0x0a, 0x0b, 0x4d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x0e, + 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x16, + 0x0a, 0x06, 0x73, 0x74, 0x72, 0x65, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, + 0x73, 0x74, 0x72, 0x65, 0x65, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x7a, 0x69, 0x70, 0x43, 0x6f, 0x64, + 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x7a, 0x69, 0x70, 0x43, 0x6f, 0x64, 0x65, + 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x07, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6c, 0x61, + 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x02, 0x52, 0x03, 0x6c, 0x61, 0x74, 0x12, 0x10, 0x0a, 0x03, + 0x6c, 0x6e, 0x67, 0x18, 0x06, 0x20, 0x01, 0x28, 0x02, 0x52, 0x03, 0x6c, 0x6e, 0x67, 0x22, 0xed, + 0x01, 0x0a, 0x04, 0x55, 0x73, 0x65, 0x72, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x66, 0x69, 0x72, 0x73, 0x74, + 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x66, 0x69, 0x72, + 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6c, 0x61, 0x73, 0x74, 0x4e, + 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x68, 0x6f, + 0x6e, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x68, 0x6f, 0x6e, 0x65, 0x12, + 0x40, 0x0a, 0x0b, 0x6d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, + 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x4d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, + 0x72, 0x65, 0x73, 0x73, 0x52, 0x0b, 0x6d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, + 0x73, 0x12, 0x2b, 0x0a, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x17, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, + 0x73, 0x65, 0x72, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x22, 0x8e, + 0x02, 0x0a, 0x0f, 0x55, 0x73, 0x65, 0x72, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x70, + 0x75, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x66, 0x69, 0x72, 0x73, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x66, 0x69, 0x72, 0x73, 0x74, 0x4e, 0x61, 0x6d, + 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6c, 0x61, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x14, + 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, + 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, + 0x12, 0x14, 0x0a, 0x05, 0x70, 0x68, 0x6f, 0x6e, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x70, 0x68, 0x6f, 0x6e, 0x65, 0x12, 0x45, 0x0a, 0x0b, 0x6d, 0x61, 0x69, 0x6e, 0x41, 0x64, + 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x63, 0x6f, + 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, + 0x4d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x49, 0x6e, 0x70, 0x75, 0x74, + 0x52, 0x0b, 0x6d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x30, 0x0a, + 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x63, 0x6f, + 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, + 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x52, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x22, + 0x80, 0x01, 0x0a, 0x10, 0x4d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x49, + 0x6e, 0x70, 0x75, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x72, 0x65, 0x65, 0x74, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x72, 0x65, 0x65, 0x74, 0x12, 0x18, 0x0a, 0x07, + 0x7a, 0x69, 0x70, 0x43, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x7a, + 0x69, 0x70, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, + 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, + 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x73, 0x18, + 0x04, 0x20, 0x03, 0x28, 0x05, 0x52, 0x0b, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x69, 0x6e, 0x61, 0x74, + 0x65, 0x73, 0x22, 0x1f, 0x0a, 0x09, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x12, + 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, + 0x6f, 0x64, 0x65, 0x22, 0x18, 0x0a, 0x06, 0x55, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x0e, 0x0a, + 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x39, 0x0a, + 0x08, 0x55, 0x73, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x2d, 0x0a, 0x05, 0x75, 0x73, 0x65, + 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, - 0x72, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x12, 0x19, + 0x72, 0x52, 0x05, 0x75, 0x73, 0x65, 0x72, 0x73, 0x22, 0x56, 0x0a, 0x0a, 0x6c, 0x6f, 0x67, 0x49, + 0x6e, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x14, + 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, + 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, + 0x22, 0x25, 0x0a, 0x0d, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x70, 0x75, + 0x74, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x40, 0x0a, 0x10, 0x76, 0x61, 0x6c, 0x69, 0x64, + 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, + 0x72, 0x72, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, + 0x72, 0x12, 0x16, 0x0a, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x22, 0x52, 0x0a, 0x0d, 0x6c, 0x6f, 0x67, + 0x49, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2b, 0x0a, 0x04, 0x75, 0x73, + 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, + 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, + 0x72, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x59, 0x0a, + 0x13, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x49, + 0x6e, 0x70, 0x75, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x6f, 0x6c, 0x64, 0x50, 0x61, 0x73, 0x73, 0x77, + 0x6f, 0x72, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x6f, 0x6c, 0x64, 0x50, 0x61, + 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x6e, 0x65, 0x77, 0x50, 0x61, 0x73, + 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x6e, 0x65, 0x77, + 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x22, 0x45, 0x0a, 0x0f, 0x63, 0x68, 0x61, 0x6e, + 0x67, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x75, + 0x73, 0x65, 0x72, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, + 0x72, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x43, 0x6f, 0x64, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x43, 0x6f, 0x64, 0x65, 0x22, + 0x1f, 0x0a, 0x0d, 0x4d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x49, 0x64, + 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, + 0x32, 0xb2, 0x05, 0x0a, 0x0b, 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x12, 0x49, 0x0a, 0x08, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x12, 0x22, 0x2e, 0x63, + 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, + 0x2e, 0x55, 0x73, 0x65, 0x72, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x70, 0x75, 0x74, + 0x1a, 0x17, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, + 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x47, + 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x12, 0x19, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, + 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x49, + 0x64, 0x1a, 0x17, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, + 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x22, 0x00, 0x12, 0x4b, 0x0a, 0x0a, + 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x12, 0x22, 0x2e, 0x63, 0x6f, 0x6d, + 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, + 0x73, 0x65, 0x72, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x17, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, - 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x49, 0x64, 0x1a, 0x17, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, - 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, 0x73, - 0x65, 0x72, 0x22, 0x00, 0x12, 0x4b, 0x0a, 0x0a, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x55, 0x73, - 0x65, 0x72, 0x12, 0x22, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, - 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x43, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x17, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, - 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x22, - 0x00, 0x12, 0x41, 0x0a, 0x0a, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x12, - 0x19, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, - 0x73, 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x49, 0x64, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, - 0x74, 0x79, 0x22, 0x00, 0x12, 0x44, 0x0a, 0x08, 0x4c, 0x69, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, - 0x12, 0x19, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, - 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x49, 0x64, 0x1a, 0x1b, 0x2e, 0x63, 0x6f, + 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x22, 0x00, 0x12, 0x41, 0x0a, 0x0a, 0x44, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x12, 0x19, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, + 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, + 0x49, 0x64, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x44, 0x0a, 0x08, + 0x4c, 0x69, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, 0x12, 0x19, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, + 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, + 0x72, 0x49, 0x64, 0x1a, 0x1b, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, + 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, + 0x22, 0x00, 0x12, 0x4a, 0x0a, 0x05, 0x4c, 0x6f, 0x67, 0x49, 0x6e, 0x12, 0x1d, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, - 0x55, 0x73, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x22, 0x00, 0x12, 0x41, 0x0a, 0x05, 0x4c, 0x6f, - 0x67, 0x49, 0x6e, 0x12, 0x1d, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, - 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x6c, 0x6f, 0x67, 0x49, 0x6e, 0x49, 0x6e, 0x70, - 0x75, 0x74, 0x1a, 0x17, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, - 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x22, 0x00, 0x12, 0x3c, 0x0a, - 0x06, 0x4c, 0x6f, 0x67, 0x4f, 0x75, 0x74, 0x12, 0x18, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, - 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x74, 0x6f, 0x6b, 0x65, - 0x6e, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x53, 0x0a, 0x0e, 0x43, - 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x26, 0x2e, + 0x6c, 0x6f, 0x67, 0x49, 0x6e, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x20, 0x2e, 0x63, 0x6f, 0x6d, + 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x6c, + 0x6f, 0x67, 0x49, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x53, + 0x0a, 0x08, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x12, 0x20, 0x2e, 0x63, 0x6f, 0x6d, + 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x76, + 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x23, 0x2e, 0x63, + 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, + 0x2e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x00, 0x12, 0x53, 0x0a, 0x0e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x61, 0x73, + 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x26, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, + 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, + 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x17, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, - 0x72, 0x2e, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, - 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x17, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, - 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x22, 0x00, - 0x12, 0x4b, 0x0a, 0x0a, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x12, 0x22, + 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x22, 0x00, 0x12, 0x4b, 0x0a, 0x0a, 0x43, 0x68, 0x61, 0x6e, + 0x67, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x12, 0x22, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, + 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x63, 0x68, 0x61, 0x6e, 0x67, + 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x17, 0x2e, 0x63, 0x6f, 0x6d, + 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, + 0x73, 0x65, 0x72, 0x22, 0x00, 0x32, 0xbb, 0x01, 0x0a, 0x12, 0x4d, 0x61, 0x69, 0x6e, 0x41, 0x64, + 0x64, 0x72, 0x65, 0x73, 0x73, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x54, 0x0a, 0x0e, + 0x47, 0x65, 0x74, 0x4d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x20, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, - 0x65, 0x72, 0x2e, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x70, - 0x75, 0x74, 0x1a, 0x17, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, - 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x22, 0x00, 0x32, 0xbb, 0x01, - 0x0a, 0x12, 0x4d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x53, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x12, 0x54, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x4d, 0x61, 0x69, 0x6e, 0x41, - 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x20, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, - 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x4d, 0x61, 0x69, 0x6e, 0x41, - 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x49, 0x64, 0x1a, 0x1e, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, - 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x4d, 0x61, 0x69, - 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x22, 0x00, 0x12, 0x4f, 0x0a, 0x11, 0x44, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, - 0x20, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, - 0x73, 0x65, 0x72, 0x2e, 0x4d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x49, - 0x64, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x42, 0x03, 0x5a, 0x01, 0x2e, - 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x65, 0x72, 0x2e, 0x4d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x49, 0x64, + 0x1a, 0x1e, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, + 0x75, 0x73, 0x65, 0x72, 0x2e, 0x4d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, + 0x22, 0x00, 0x12, 0x4f, 0x0a, 0x11, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x61, 0x69, 0x6e, + 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x20, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, + 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x4d, 0x61, 0x69, 0x6e, + 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x49, 0x64, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, + 0x79, 0x22, 0x00, 0x42, 0x03, 0x5a, 0x01, 0x2e, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -1011,7 +1117,7 @@ func file_user_proto_rawDescGZIP() []byte { return file_user_proto_rawDescData } -var file_user_proto_msgTypes = make([]protoimpl.MessageInfo, 13) +var file_user_proto_msgTypes = make([]protoimpl.MessageInfo, 15) var file_user_proto_goTypes = []interface{}{ (*Role)(nil), // 0: com.goodfood.user.Role (*MainAddress)(nil), // 1: com.goodfood.user.MainAddress @@ -1022,48 +1128,48 @@ var file_user_proto_goTypes = []interface{}{ (*UserId)(nil), // 6: com.goodfood.user.UserId (*UserList)(nil), // 7: com.goodfood.user.UserList (*LogInInput)(nil), // 8: com.goodfood.user.logInInput - (*Token)(nil), // 9: com.goodfood.user.token - (*ChangePasswordInput)(nil), // 10: com.goodfood.user.changePasswordInput - (*ChangeRoleInput)(nil), // 11: com.goodfood.user.changeRoleInput - (*MainAddressId)(nil), // 12: com.goodfood.user.MainAddressId - (*_struct.Struct)(nil), // 13: google.protobuf.Struct - (*empty.Empty)(nil), // 14: google.protobuf.Empty + (*ValidateInput)(nil), // 9: com.goodfood.user.validateInput + (*ValidateResponse)(nil), // 10: com.goodfood.user.validateResponse + (*LogInResponse)(nil), // 11: com.goodfood.user.logInResponse + (*ChangePasswordInput)(nil), // 12: com.goodfood.user.changePasswordInput + (*ChangeRoleInput)(nil), // 13: com.goodfood.user.changeRoleInput + (*MainAddressId)(nil), // 14: com.goodfood.user.MainAddressId + (*empty.Empty)(nil), // 15: google.protobuf.Empty } var file_user_proto_depIdxs = []int32{ 1, // 0: com.goodfood.user.User.mainAddress:type_name -> com.goodfood.user.MainAddress 0, // 1: com.goodfood.user.User.role:type_name -> com.goodfood.user.Role - 13, // 2: com.goodfood.user.User.token:type_name -> google.protobuf.Struct - 4, // 3: com.goodfood.user.UserCreateInput.mainAddress:type_name -> com.goodfood.user.MainAddressInput - 5, // 4: com.goodfood.user.UserCreateInput.role:type_name -> com.goodfood.user.RoleInput - 2, // 5: com.goodfood.user.UserList.users:type_name -> com.goodfood.user.User - 13, // 6: com.goodfood.user.token.token:type_name -> google.protobuf.Struct - 3, // 7: com.goodfood.user.UserService.Register:input_type -> com.goodfood.user.UserCreateInput - 6, // 8: com.goodfood.user.UserService.GetUser:input_type -> com.goodfood.user.UserId - 3, // 9: com.goodfood.user.UserService.UpdateUser:input_type -> com.goodfood.user.UserCreateInput - 6, // 10: com.goodfood.user.UserService.DeleteUser:input_type -> com.goodfood.user.UserId - 6, // 11: com.goodfood.user.UserService.ListUser:input_type -> com.goodfood.user.UserId - 8, // 12: com.goodfood.user.UserService.LogIn:input_type -> com.goodfood.user.logInInput - 9, // 13: com.goodfood.user.UserService.LogOut:input_type -> com.goodfood.user.token - 10, // 14: com.goodfood.user.UserService.ChangePassword:input_type -> com.goodfood.user.changePasswordInput - 11, // 15: com.goodfood.user.UserService.ChangeRole:input_type -> com.goodfood.user.changeRoleInput - 12, // 16: com.goodfood.user.MainAddressService.GetMainAddress:input_type -> com.goodfood.user.MainAddressId - 12, // 17: com.goodfood.user.MainAddressService.DeleteMainAddress:input_type -> com.goodfood.user.MainAddressId - 2, // 18: com.goodfood.user.UserService.Register:output_type -> com.goodfood.user.User - 2, // 19: com.goodfood.user.UserService.GetUser:output_type -> com.goodfood.user.User - 2, // 20: com.goodfood.user.UserService.UpdateUser:output_type -> com.goodfood.user.User - 14, // 21: com.goodfood.user.UserService.DeleteUser:output_type -> google.protobuf.Empty - 7, // 22: com.goodfood.user.UserService.ListUser:output_type -> com.goodfood.user.UserList - 2, // 23: com.goodfood.user.UserService.LogIn:output_type -> com.goodfood.user.User - 14, // 24: com.goodfood.user.UserService.LogOut:output_type -> google.protobuf.Empty - 2, // 25: com.goodfood.user.UserService.ChangePassword:output_type -> com.goodfood.user.User - 2, // 26: com.goodfood.user.UserService.ChangeRole:output_type -> com.goodfood.user.User - 1, // 27: com.goodfood.user.MainAddressService.GetMainAddress:output_type -> com.goodfood.user.MainAddress - 14, // 28: com.goodfood.user.MainAddressService.DeleteMainAddress:output_type -> google.protobuf.Empty - 18, // [18:29] is the sub-list for method output_type - 7, // [7:18] is the sub-list for method input_type - 7, // [7:7] is the sub-list for extension type_name - 7, // [7:7] is the sub-list for extension extendee - 0, // [0:7] is the sub-list for field type_name + 4, // 2: com.goodfood.user.UserCreateInput.mainAddress:type_name -> com.goodfood.user.MainAddressInput + 5, // 3: com.goodfood.user.UserCreateInput.role:type_name -> com.goodfood.user.RoleInput + 2, // 4: com.goodfood.user.UserList.users:type_name -> com.goodfood.user.User + 2, // 5: com.goodfood.user.logInResponse.user:type_name -> com.goodfood.user.User + 3, // 6: com.goodfood.user.UserService.Register:input_type -> com.goodfood.user.UserCreateInput + 6, // 7: com.goodfood.user.UserService.GetUser:input_type -> com.goodfood.user.UserId + 3, // 8: com.goodfood.user.UserService.UpdateUser:input_type -> com.goodfood.user.UserCreateInput + 6, // 9: com.goodfood.user.UserService.DeleteUser:input_type -> com.goodfood.user.UserId + 6, // 10: com.goodfood.user.UserService.ListUser:input_type -> com.goodfood.user.UserId + 8, // 11: com.goodfood.user.UserService.LogIn:input_type -> com.goodfood.user.logInInput + 9, // 12: com.goodfood.user.UserService.Validate:input_type -> com.goodfood.user.validateInput + 12, // 13: com.goodfood.user.UserService.ChangePassword:input_type -> com.goodfood.user.changePasswordInput + 13, // 14: com.goodfood.user.UserService.ChangeRole:input_type -> com.goodfood.user.changeRoleInput + 14, // 15: com.goodfood.user.MainAddressService.GetMainAddress:input_type -> com.goodfood.user.MainAddressId + 14, // 16: com.goodfood.user.MainAddressService.DeleteMainAddress:input_type -> com.goodfood.user.MainAddressId + 2, // 17: com.goodfood.user.UserService.Register:output_type -> com.goodfood.user.User + 2, // 18: com.goodfood.user.UserService.GetUser:output_type -> com.goodfood.user.User + 2, // 19: com.goodfood.user.UserService.UpdateUser:output_type -> com.goodfood.user.User + 15, // 20: com.goodfood.user.UserService.DeleteUser:output_type -> google.protobuf.Empty + 7, // 21: com.goodfood.user.UserService.ListUser:output_type -> com.goodfood.user.UserList + 11, // 22: com.goodfood.user.UserService.LogIn:output_type -> com.goodfood.user.logInResponse + 10, // 23: com.goodfood.user.UserService.Validate:output_type -> com.goodfood.user.validateResponse + 2, // 24: com.goodfood.user.UserService.ChangePassword:output_type -> com.goodfood.user.User + 2, // 25: com.goodfood.user.UserService.ChangeRole:output_type -> com.goodfood.user.User + 1, // 26: com.goodfood.user.MainAddressService.GetMainAddress:output_type -> com.goodfood.user.MainAddress + 15, // 27: com.goodfood.user.MainAddressService.DeleteMainAddress:output_type -> google.protobuf.Empty + 17, // [17:28] is the sub-list for method output_type + 6, // [6:17] is the sub-list for method input_type + 6, // [6:6] is the sub-list for extension type_name + 6, // [6:6] is the sub-list for extension extendee + 0, // [0:6] is the sub-list for field type_name } func init() { file_user_proto_init() } @@ -1181,7 +1287,7 @@ func file_user_proto_init() { } } file_user_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Token); i { + switch v := v.(*ValidateInput); i { case 0: return &v.state case 1: @@ -1193,7 +1299,7 @@ func file_user_proto_init() { } } file_user_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ChangePasswordInput); i { + switch v := v.(*ValidateResponse); i { case 0: return &v.state case 1: @@ -1205,7 +1311,7 @@ func file_user_proto_init() { } } file_user_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ChangeRoleInput); i { + switch v := v.(*LogInResponse); i { case 0: return &v.state case 1: @@ -1217,6 +1323,30 @@ func file_user_proto_init() { } } file_user_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ChangePasswordInput); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_user_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ChangeRoleInput); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_user_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*MainAddressId); i { case 0: return &v.state @@ -1235,7 +1365,7 @@ func file_user_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_user_proto_rawDesc, NumEnums: 0, - NumMessages: 13, + NumMessages: 15, NumExtensions: 0, NumServices: 2, }, diff --git a/services/proto/user.proto b/services/proto/user.proto index b1d335c5..67dcc504 100644 --- a/services/proto/user.proto +++ b/services/proto/user.proto @@ -2,7 +2,6 @@ syntax = "proto3"; package com.goodfood.user; -import "google/protobuf/struct.proto"; import "google/protobuf/empty.proto"; option go_package = "."; @@ -30,7 +29,6 @@ message User { string phone = 5; MainAddress mainAddress = 6; Role role = 7; - google.protobuf.Struct token = 8; } service UserService { @@ -39,8 +37,8 @@ service UserService { rpc UpdateUser (UserCreateInput) returns (User) {} rpc DeleteUser (UserId) returns (google.protobuf.Empty) {} rpc ListUser (UserId) returns (UserList) {} - rpc LogIn (logInInput) returns (User) {} - rpc LogOut (token) returns (google.protobuf.Empty) {} + rpc LogIn (logInInput) returns (logInResponse) {} + rpc Validate (validateInput) returns (validateResponse) {} rpc ChangePassword (changePasswordInput) returns (User) {} rpc ChangeRole (changeRoleInput) returns (User) {} } @@ -85,10 +83,21 @@ message logInInput { string password = 3; } -message token { - google.protobuf.Struct token = 1; +message validateInput { + string token = 1; } +message validateResponse { + string error = 1; + string userId = 2; +} + +message logInResponse { + User user = 1; + string token = 2; +} + + message changePasswordInput { string oldPassword = 1; string newPassword = 2; diff --git a/services/proto/user_grpc.pb.go b/services/proto/user_grpc.pb.go index 5223cea9..e8c6fbec 100644 --- a/services/proto/user_grpc.pb.go +++ b/services/proto/user_grpc.pb.go @@ -28,8 +28,8 @@ type UserServiceClient interface { UpdateUser(ctx context.Context, in *UserCreateInput, opts ...grpc.CallOption) (*User, error) DeleteUser(ctx context.Context, in *UserId, opts ...grpc.CallOption) (*empty.Empty, error) ListUser(ctx context.Context, in *UserId, opts ...grpc.CallOption) (*UserList, error) - LogIn(ctx context.Context, in *LogInInput, opts ...grpc.CallOption) (*User, error) - LogOut(ctx context.Context, in *Token, opts ...grpc.CallOption) (*empty.Empty, error) + LogIn(ctx context.Context, in *LogInInput, opts ...grpc.CallOption) (*LogInResponse, error) + Validate(ctx context.Context, in *ValidateInput, opts ...grpc.CallOption) (*ValidateResponse, error) ChangePassword(ctx context.Context, in *ChangePasswordInput, opts ...grpc.CallOption) (*User, error) ChangeRole(ctx context.Context, in *ChangeRoleInput, opts ...grpc.CallOption) (*User, error) } @@ -87,8 +87,8 @@ func (c *userServiceClient) ListUser(ctx context.Context, in *UserId, opts ...gr return out, nil } -func (c *userServiceClient) LogIn(ctx context.Context, in *LogInInput, opts ...grpc.CallOption) (*User, error) { - out := new(User) +func (c *userServiceClient) LogIn(ctx context.Context, in *LogInInput, opts ...grpc.CallOption) (*LogInResponse, error) { + out := new(LogInResponse) err := c.cc.Invoke(ctx, "/com.goodfood.user.UserService/LogIn", in, out, opts...) if err != nil { return nil, err @@ -96,9 +96,9 @@ func (c *userServiceClient) LogIn(ctx context.Context, in *LogInInput, opts ...g return out, nil } -func (c *userServiceClient) LogOut(ctx context.Context, in *Token, opts ...grpc.CallOption) (*empty.Empty, error) { - out := new(empty.Empty) - err := c.cc.Invoke(ctx, "/com.goodfood.user.UserService/LogOut", in, out, opts...) +func (c *userServiceClient) Validate(ctx context.Context, in *ValidateInput, opts ...grpc.CallOption) (*ValidateResponse, error) { + out := new(ValidateResponse) + err := c.cc.Invoke(ctx, "/com.goodfood.user.UserService/Validate", in, out, opts...) if err != nil { return nil, err } @@ -132,8 +132,8 @@ type UserServiceServer interface { UpdateUser(context.Context, *UserCreateInput) (*User, error) DeleteUser(context.Context, *UserId) (*empty.Empty, error) ListUser(context.Context, *UserId) (*UserList, error) - LogIn(context.Context, *LogInInput) (*User, error) - LogOut(context.Context, *Token) (*empty.Empty, error) + LogIn(context.Context, *LogInInput) (*LogInResponse, error) + Validate(context.Context, *ValidateInput) (*ValidateResponse, error) ChangePassword(context.Context, *ChangePasswordInput) (*User, error) ChangeRole(context.Context, *ChangeRoleInput) (*User, error) mustEmbedUnimplementedUserServiceServer() @@ -158,11 +158,11 @@ func (UnimplementedUserServiceServer) DeleteUser(context.Context, *UserId) (*emp func (UnimplementedUserServiceServer) ListUser(context.Context, *UserId) (*UserList, error) { return nil, status.Errorf(codes.Unimplemented, "method ListUser not implemented") } -func (UnimplementedUserServiceServer) LogIn(context.Context, *LogInInput) (*User, error) { +func (UnimplementedUserServiceServer) LogIn(context.Context, *LogInInput) (*LogInResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method LogIn not implemented") } -func (UnimplementedUserServiceServer) LogOut(context.Context, *Token) (*empty.Empty, error) { - return nil, status.Errorf(codes.Unimplemented, "method LogOut not implemented") +func (UnimplementedUserServiceServer) Validate(context.Context, *ValidateInput) (*ValidateResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method Validate not implemented") } func (UnimplementedUserServiceServer) ChangePassword(context.Context, *ChangePasswordInput) (*User, error) { return nil, status.Errorf(codes.Unimplemented, "method ChangePassword not implemented") @@ -291,20 +291,20 @@ func _UserService_LogIn_Handler(srv interface{}, ctx context.Context, dec func(i return interceptor(ctx, in, info, handler) } -func _UserService_LogOut_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(Token) +func _UserService_Validate_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ValidateInput) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(UserServiceServer).LogOut(ctx, in) + return srv.(UserServiceServer).Validate(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/com.goodfood.user.UserService/LogOut", + FullMethod: "/com.goodfood.user.UserService/Validate", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(UserServiceServer).LogOut(ctx, req.(*Token)) + return srv.(UserServiceServer).Validate(ctx, req.(*ValidateInput)) } return interceptor(ctx, in, info, handler) } @@ -377,8 +377,8 @@ var UserService_ServiceDesc = grpc.ServiceDesc{ Handler: _UserService_LogIn_Handler, }, { - MethodName: "LogOut", - Handler: _UserService_LogOut_Handler, + MethodName: "Validate", + Handler: _UserService_Validate_Handler, }, { MethodName: "ChangePassword", diff --git a/services/user/src/Makefile b/services/user/src/Makefile index 96cf0a0f..7c3650e2 100644 --- a/services/user/src/Makefile +++ b/services/user/src/Makefile @@ -2,4 +2,4 @@ proto: protoc -I ./proto/. user.proto --go-grpc_out=./proto/. --go_out=./proto/. server: - go run cmd/main.go \ No newline at end of file + go run main.go \ No newline at end of file diff --git a/services/user/src/pkg/config/config.go b/services/user/src/pkg/config/config.go index 3b37182c..59b2afff 100644 --- a/services/user/src/pkg/config/config.go +++ b/services/user/src/pkg/config/config.go @@ -9,7 +9,7 @@ type Config struct { } func LoadConfig() (config Config, err error) { - viper.AddConfigPath("./pkg/config/envs") + viper.AddConfigPath("./pkg/config/env") viper.SetConfigName("dev") viper.SetConfigType("env") diff --git a/services/user/src/pkg/config/env/dev.env b/services/user/src/pkg/config/env/dev.env index 1aafde72..0e99f5fd 100644 --- a/services/user/src/pkg/config/env/dev.env +++ b/services/user/src/pkg/config/env/dev.env @@ -1,3 +1,3 @@ -PORT=:50051 -DB_URL=postgres://root@localhost:5432/auth_svc +PORT=50001 +DB_URL=postgres://postgres:password@localhost:5432/postgres JWT_SECRET_KEY=r43t18sc \ No newline at end of file diff --git a/services/user/src/pkg/mapper/userMapper.go b/services/user/src/pkg/mapper/userMapper.go index b1ad5849..1e9b0bfc 100644 --- a/services/user/src/pkg/mapper/userMapper.go +++ b/services/user/src/pkg/mapper/userMapper.go @@ -1,21 +1,11 @@ package mapper import ( - "encoding/json" - "fmt" "goodfood-user/pkg/models" pb "goodfood-user/proto" - "google.golang.org/protobuf/types/known/structpb" ) func ToProtoUser(user *models.User) *pb.User { - TokenMap := make(map[string]interface{}) - err := json.Unmarshal(user.Token, &TokenMap) - if err != nil { - fmt.Printf("failed to unmarshal metadata: %v", err) - } - token, _ := structpb.NewStruct(TokenMap) - return &pb.User{ Id: user.Id, FirstName: user.FirstName, @@ -24,7 +14,6 @@ func ToProtoUser(user *models.User) *pb.User { Phone: user.Phone, MainAddress: ToProtoMainAddress(user.MainAddress), Role: ToProtoRole(user.Role), - Token: token, } } diff --git a/services/user/src/pkg/models/user.go b/services/user/src/pkg/models/user.go index deb58b4c..bd85ac2e 100644 --- a/services/user/src/pkg/models/user.go +++ b/services/user/src/pkg/models/user.go @@ -9,5 +9,4 @@ type User struct { FirstName string `json:"first_name" gorm:"type:varchar(100);not null"` MainAddress MainAddress `json:"main_address" gorm:"foreignKey:MainAddressId"` Role Role `json:"role" gorm:"foreignKey:RoleId"` - Token []uint8 `json:"token" gorm:"type:jsonb, default:'{}'"` } diff --git a/services/user/src/pkg/services/auth.go b/services/user/src/pkg/services/auth.go index b6b16ba7..5a87b611 100644 --- a/services/user/src/pkg/services/auth.go +++ b/services/user/src/pkg/services/auth.go @@ -1,7 +1,6 @@ package services import ( - "context" "goodfood-user/pkg/db" "goodfood-user/pkg/mapper" "goodfood-user/pkg/models" @@ -14,7 +13,7 @@ type Server struct { Jwt utils.JwtWrapper } -func (s *Server) Register(ctx context.Context, req *pb.UserCreateInput) (*pb.User, error) { +func (s *Server) Register(req *pb.UserCreateInput) (*pb.User, error) { var user models.User if result := s.H.DB.Where(&models.User{Email: req.Email}).First(&user); result.Error == nil { @@ -29,7 +28,7 @@ func (s *Server) Register(ctx context.Context, req *pb.UserCreateInput) (*pb.Use return mapper.ToProtoUser(&user), nil } -func (s *Server) GetUser(ctx context.Context, req *pb.UserCreateInput) (*pb.User, error) { +func (s *Server) LogIn(req *pb.LogInInput) (*pb.LogInResponse, error) { var user models.User if result := s.H.DB.Where(&models.User{Email: req.Email}).First(&user); result.Error == nil { @@ -37,9 +36,33 @@ func (s *Server) GetUser(ctx context.Context, req *pb.UserCreateInput) (*pb.User } user.Email = req.Email - user.Password = utils.HashPassword(req.Password) + if !utils.CheckPasswordHash(req.Password, user.Password) { + return nil, nil + } - s.H.DB.Create(&user) + token, _ := s.Jwt.GenerateToken(user) - return mapper.ToProtoUser(&user), nil + return &pb.LogInResponse{User: mapper.ToProtoUser(&user), Token: token}, nil +} + +func (s *Server) Validate(req *pb.ValidateInput) (*pb.ValidateResponse, error) { + claims, err := s.Jwt.ValidateToken(req.Token) + + if err != nil { + return &pb.ValidateResponse{ + Error: err.Error(), + }, nil + } + + var user models.User + + if result := s.H.DB.Where(&models.User{Email: claims.Email}).First(&user); result.Error != nil { + return &pb.ValidateResponse{ + Error: "User not found", + }, nil + } + + return &pb.ValidateResponse{ + UserId: user.Id, + }, nil } diff --git a/services/user/src/pkg/utils/jwt.go b/services/user/src/pkg/utils/jwt.go index d9016f47..03f372af 100644 --- a/services/user/src/pkg/utils/jwt.go +++ b/services/user/src/pkg/utils/jwt.go @@ -3,7 +3,7 @@ package utils import ( "errors" "github.com/golang-jwt/jwt" - "main/pkg/models" + "goodfood-user/pkg/models" "time" ) @@ -13,14 +13,24 @@ type JwtWrapper struct { ExpirationHours int64 } -type jwtClaims struct { +type JwtClaims struct { jwt.StandardClaims - Id int64 + Id string Email string } +func (w *JwtWrapper) ParseToken(signedToken string) (token *jwt.Token, err error) { + return jwt.ParseWithClaims( + signedToken, + &JwtClaims{}, + func(token *jwt.Token) (interface{}, error) { + return []byte(w.SecretKey), nil + }, + ) +} + func (w *JwtWrapper) GenerateToken(user models.User) (signedToken string, err error) { - claims := &jwtClaims{ + claims := &JwtClaims{ Id: user.Id, Email: user.Email, StandardClaims: jwt.StandardClaims{ @@ -40,20 +50,14 @@ func (w *JwtWrapper) GenerateToken(user models.User) (signedToken string, err er return signedToken, nil } -func (w *JwtWrapper) ValidateToken(signedToken string) (claims *jwtClaims, err error) { - token, err := jwt.ParseWithClaims( - signedToken, - &jwtClaims{}, - func(token *jwt.Token) (interface{}, error) { - return []byte(w.SecretKey), nil - }, - ) +func (w *JwtWrapper) ValidateToken(signedToken string) (claims *JwtClaims, err error) { + token, err := w.ParseToken(signedToken) if err != nil { return } - claims, ok := token.Claims.(*jwtClaims) + claims, ok := token.Claims.(*JwtClaims) if !ok { return nil, errors.New("Couldn't parse claims") @@ -64,5 +68,4 @@ func (w *JwtWrapper) ValidateToken(signedToken string) (claims *jwtClaims, err e } return claims, nil - } From 6b4d613aa992736cf2d6626afd818072fa1d5367 Mon Sep 17 00:00:00 2001 From: Florian LEROUX <10078837+floriaaan@users.noreply.github.com> Date: Fri, 12 May 2023 15:24:06 +0200 Subject: [PATCH 143/883] test: remove tests --- services/delivery/log.docker-compose.yml | 50 +++++++++++ services/delivery/src/lib/mocks/prisma.ts | 23 ----- .../src/tests/grpc/create-delivery.test.ts | 84 ------------------- .../src/tests/prisma/delivery.test.ts | 36 -------- services/delivery/src/tests/setup.ts | 13 --- services/delivery/vitest.config.ts | 3 - 6 files changed, 50 insertions(+), 159 deletions(-) create mode 100644 services/delivery/log.docker-compose.yml delete mode 100644 services/delivery/src/lib/mocks/prisma.ts delete mode 100644 services/delivery/src/tests/grpc/create-delivery.test.ts delete mode 100644 services/delivery/src/tests/prisma/delivery.test.ts delete mode 100644 services/delivery/src/tests/setup.ts diff --git a/services/delivery/log.docker-compose.yml b/services/delivery/log.docker-compose.yml new file mode 100644 index 00000000..958a2964 --- /dev/null +++ b/services/delivery/log.docker-compose.yml @@ -0,0 +1,50 @@ +services: + goodfood-log: + depends_on: + - postgres + - rabbitmq + image: floriaaan/goodfood-log:latest + environment: + - DATABASE_URL=postgres://postgres:password@postgres:5432/postgres + - PORT=50021 + - AMQP_URL=amqp://guest:guest@rabbitmq:5672 + ports: + - "50021:50021" + networks: + - goodfood-log-network + + rabbitmq: + restart: always + image: rabbitmq:3-management + ports: + - "5672:5672" + - "15672:15672" + networks: + - goodfood-log-network + + postgres: + image: postgres:15.2 + environment: + - POSTGRES_USER=postgres + - POSTGRES_PASSWORD=password + ports: + - "5432:5432" + volumes: + - goodfood-log-volume:/var/lib/postgresql/data + networks: + - goodfood-log-network + + adminer: + depends_on: + - postgres + image: adminer + ports: + - "8080:8080" + networks: + - goodfood-log-network + +volumes: + goodfood-log-volume: + +networks: + goodfood-log-network: diff --git a/services/delivery/src/lib/mocks/prisma.ts b/services/delivery/src/lib/mocks/prisma.ts deleted file mode 100644 index 5f3da3d5..00000000 --- a/services/delivery/src/lib/mocks/prisma.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { mockDeep } from "vitest-mock-extended"; -import { Delivery, Prisma, PrismaClient } from "@prisma/client"; - -// Mock the PrismaClient -const prismaMock = mockDeep(); - -// Mock the Delivery model's `create` method -//@ts-ignore -prismaMock.delivery.create.mockImplementation(async ({ data }: Prisma.DeliveryCreateArgs) => { - const createdDelivery: Delivery = { - address: data.address, - eta: data.eta as Date, - user_id: data.user_id, - restaurant_id: data.restaurant_id, - // @ts-ignore - person: data.person, - id: "random_id", // set an example ID - status: "PENDING", // set an example status - }; - return createdDelivery; -}); - -export default prismaMock; diff --git a/services/delivery/src/tests/grpc/create-delivery.test.ts b/services/delivery/src/tests/grpc/create-delivery.test.ts deleted file mode 100644 index 48c77cd2..00000000 --- a/services/delivery/src/tests/grpc/create-delivery.test.ts +++ /dev/null @@ -1,84 +0,0 @@ -import { afterAll, describe, expect, it } from "vitest"; -import server from "@delivery/server"; -import { main as client_createDelivery } from "@delivery/client/delivery/create"; -import { Status } from "@prisma/client"; - -afterAll( - async () => - new Promise((resolve) => { - resolve( - server.tryShutdown((err) => { - if (err) console.log(err); - console.log("Server stopped"); - }) - ); - }) -); - -/* -Code Analysis - -Objective: -The main objective of the "main" function is to create a new delivery by calling the "CreateDelivery" method of the "DeliveryService" client and return the response. - -Inputs: -- "data" (optional): an object containing delivery data. If not provided, default data will be used. - -Flow: -1. Create a new instance of the "DeliveryService" client with the specified address and insecure credentials. -2. Call the "CreateDelivery" method of the client with the provided data. -3. Handle any errors or responses returned by the method. -4. Return the response. - -Outputs: -- "response": a Delivery object or null if an error occurred. - -Additional aspects: -- The function uses the "insecure" credentials and the address specified in the "ADDRESS" constant. -- The function uses the "DEFAULT_DATA" constant if no data is provided. -- The function logs any errors or responses using the "log.debug" function. -- The function returns a Promise that resolves to the response. -*/ - -describe("GRPC: create a Delivery object", () => { - // Tests that the function returns a delivery object with default data when no delivery data is provided. - it("test_default_data", async () => { - const response = await client_createDelivery(); - expect(response).toMatchObject({ - eta: "2022-01-01T00:00:00.000Z", - address: "10 Rue de la République, 75003 Paris, France", - status: Status.PENDING, - delivery_person_id: "random_id", - restaurant_id: "restaurant_id:1", - user_id: "user_id:1", - }); - }); - - // Tests that the function returns a delivery object when valid delivery data is provided. - it("test_valid_data", async () => { - const data = { - eta: "2022-01-01T00:00:00.000Z", - address: "123 Main St, Anytown USA", - status: Status.IN_PROGRESS, - delivery_person_id: "random_id", - restaurant_id: "restaurant_id:2", - user_id: "user_id:3", - }; - const response = await client_createDelivery(data); - expect(response).toMatchObject(data); - }); - - // Tests that the function returns null when invalid delivery data is provided. - it("test_invalid_data", async () => { - const data = { - eta: "invalid_date_format", - address: "", - status: "INVALID_STATUS", - delivery_person_id: "", - restaurant_id: "", - user_id: "", - }; - const response = await client_createDelivery(data); - expect(response).toBeNull(); - }); -}); diff --git a/services/delivery/src/tests/prisma/delivery.test.ts b/services/delivery/src/tests/prisma/delivery.test.ts deleted file mode 100644 index f03d8a13..00000000 --- a/services/delivery/src/tests/prisma/delivery.test.ts +++ /dev/null @@ -1,36 +0,0 @@ -import prisma from "@delivery/lib/mocks/prisma"; -import { Prisma, Status } from "@prisma/client"; -import { expect, test } from "vitest"; - - - -test("PRISMA: create a Delivery object", async () => { - const input: Prisma.DeliveryCreateInput = { - address: "123 Main St", - eta: new Date(), - - user_id: "random_user_id", - restaurant_id: "random_restaurant_id", - - person: { - create: { - first_name: "Food", - last_name: "Good", - phone: "123456789", - }, - }, - }; - - - const delivery = await prisma.delivery.create({ - data: input, - }); - - - - expect(delivery).toStrictEqual({ - ...input, - id: 1, - status: Status.PENDING, - }); -}); diff --git a/services/delivery/src/tests/setup.ts b/services/delivery/src/tests/setup.ts deleted file mode 100644 index 69307e38..00000000 --- a/services/delivery/src/tests/setup.ts +++ /dev/null @@ -1,13 +0,0 @@ -/** - * Tests mocks - * - * This file is used to mock the Prisma client in tests. - * - */ - -import prisma from "@delivery/lib/mocks/prisma"; -import { vitest } from "vitest"; - -vitest.mock("@prisma/client", () => prisma); -vitest.mock("@delivery/lib/prisma", () => prisma); - diff --git a/services/delivery/vitest.config.ts b/services/delivery/vitest.config.ts index 458e2d25..08cfe3bf 100644 --- a/services/delivery/vitest.config.ts +++ b/services/delivery/vitest.config.ts @@ -4,7 +4,4 @@ import tsconfigPaths from "vite-tsconfig-paths"; export default defineConfig({ plugins: [tsconfigPaths()], base: "/src/tests", - test: { - setupFiles: ["./src/tests/setup.ts"], - }, }); From d4048849607fd61090764eac5f0cf81b3401a601 Mon Sep 17 00:00:00 2001 From: Florian LEROUX <10078837+floriaaan@users.noreply.github.com> Date: Tue, 11 Apr 2023 19:21:34 +0200 Subject: [PATCH 144/883] feat(tf): add terraform files --- services/stock/README.md | 53 +++++++++++++ services/stock/terraform/data.tf | 17 +++++ .../terraform/env/dev-backend.tfvars.example | 4 + .../stock/terraform/env/dev.tfvars.example | 1 + services/stock/terraform/main.tf | 74 +++++++++++++++++++ services/stock/terraform/outputs.tf | 6 ++ services/stock/terraform/variables.tf | 16 ++++ 7 files changed, 171 insertions(+) create mode 100644 services/stock/README.md create mode 100644 services/stock/terraform/data.tf create mode 100644 services/stock/terraform/env/dev-backend.tfvars.example create mode 100644 services/stock/terraform/env/dev.tfvars.example create mode 100644 services/stock/terraform/main.tf create mode 100644 services/stock/terraform/outputs.tf create mode 100644 services/stock/terraform/variables.tf diff --git a/services/stock/README.md b/services/stock/README.md new file mode 100644 index 00000000..baf17114 --- /dev/null +++ b/services/stock/README.md @@ -0,0 +1,53 @@ +# Stock Microservice + +| Informations | +| ------------------------------------------------------------------ | +| **Port:** 50009 | +| **Developer:** @floriaaan | +| **Status:** In progress | +| **Last update:** 2023-04-11 | +| **Language:** NodeJS | +| **Dependencies:** TypeScript, Prisma, gRPC, Postgres | +| **Models:** (see [`prisma/schema.prisma`](./prisma/schema.prisma)) | + +## gRPC Methods + +TBW + +## Requirements + +To run this microservice, you will need to have the following installed on your system: + +- NodeJS (v18.12.0 or higher) (dev. with v18.12.0) +- Postgres (v15.2 or higher) (dev. with docker image `postgres:15.2`) + +You can use the following tools to help you with the setup: + +- You can use nvm to set your Node version using: + - `nvm use`. +- You can use docker to run your Postgres database using: + - `docker run --name postgres -p 5432:5432 -e POSTGRES_PASSWORD=password -d postgres` + +## Getting started + +### 1. Clone the repository and install dependencies + +1. Clone the `goodfood` repository to your local machine. +2. Navigate to the service directory (`services/stock`) in your terminal. +3. Run `npm install` to install the necessary dependencies. +4. Create a `.env` file at the root of the project directory and add the environment variables values (see `.env.example`). +5. Run `npm run start` to start the microservice. + +You can now access the microservice at `http://localhost:50008`. + +NB: If you want to run the microservice in development mode, you can run `npm run dev` instead. + +### 2. Create and seed the database + +Run the following command to create your Postgres database structure. This also creates the models tables that are defined in [`prisma/schema.prisma`](./prisma/schema.prisma): + +``` +npx prisma migrate dev --name init +``` + +When `npx prisma migrate dev` is executed against a newly created database, seeding is also triggered. The seed file in [`prisma/seed.ts`](./prisma/seed.ts) will be executed and your database will be populated with the sample data. diff --git a/services/stock/terraform/data.tf b/services/stock/terraform/data.tf new file mode 100644 index 00000000..7384e1df --- /dev/null +++ b/services/stock/terraform/data.tf @@ -0,0 +1,17 @@ +data "azurerm_resource_group" "rg-goodfood" { + name = "rg-${var.project_name}${var.environnment_suffix}" +} + +data "azurerm_key_vault" "kv-goodfood-stock" { + resource_group_name = data.azurerm_resource_group.rg-goodfood.name + name = "kv-${var.project_name}" +} + +data "azurerm_key_vault_secret" "stock-db-login" { + name = "stock-db-login" + key_vault_id = data.azurerm_key_vault.kv-goodfood-stock.id +} +data "azurerm_key_vault_secret" "stock-db-password" { + name = "stock-db-password" + key_vault_id = data.azurerm_key_vault.kv-goodfood-stock.id +} \ No newline at end of file diff --git a/services/stock/terraform/env/dev-backend.tfvars.example b/services/stock/terraform/env/dev-backend.tfvars.example new file mode 100644 index 00000000..e0cce6f6 --- /dev/null +++ b/services/stock/terraform/env/dev-backend.tfvars.example @@ -0,0 +1,4 @@ +resource_group_name = "rg-goodfood-dev" +storage_account_name = "sa-goodfood-states" +container_name = "tfstate" +key = "delivery-dev.tfstate" diff --git a/services/stock/terraform/env/dev.tfvars.example b/services/stock/terraform/env/dev.tfvars.example new file mode 100644 index 00000000..4ac1f44d --- /dev/null +++ b/services/stock/terraform/env/dev.tfvars.example @@ -0,0 +1 @@ +environnment_suffix = "-dev" diff --git a/services/stock/terraform/main.tf b/services/stock/terraform/main.tf new file mode 100644 index 00000000..dc19f79a --- /dev/null +++ b/services/stock/terraform/main.tf @@ -0,0 +1,74 @@ +terraform { + required_providers { + azurerm = { + source = "hashicorp/azurerm" + version = "3.48.0" + } + } + backend "azurerm" {} +} + +provider "azurerm" { + features { + key_vault { + purge_soft_deleted_secrets_on_destroy = true + recover_soft_deleted_secrets = true + } + } +} + +resource "azurerm_key_vault" "kv-goodfood-stock" { + name = "kv-goodfood-stock" + location = data.azurerm_resource_group.rg-goodfood.location + resource_group_name = data.azurerm_resource_group.rg-goodfood.name + tenant_id = data.azurerm_client_config.current.tenant_id + sku_name = "standard" + soft_delete_retention_days = 7 + + access_policy { + tenant_id = data.azurerm_client_config.current.tenant_id + object_id = data.azurerm_client_config.current.object_id + + key_permissions = [ + "Create", + "Get", + ] + + secret_permissions = [ + "Set", + "Get", + "Delete", + "Purge", + "Recover" + ] + } +} + +resource "azurerm_postgresql_server" "pg-goodfood-stock" { + name = "pg-goodfood-stock${var.environnment_suffix}" + location = data.azurerm_resource_group.rg-goodfood.location + resource_group_name = data.azurerm_resource_group.rg-goodfood.name + + sku_name = "B_Gen5_2" + + storage_mb = 5120 + backup_retention_days = 7 + geo_redundant_backup_enabled = false + auto_grow_enabled = true + + administrator_login = data.azurerm_key_vault_secret.stock-db-login.value + administrator_login_password = data.azurerm_key_vault_secret.stock-db-password.value + version = "11" + + ssl_enforcement_enabled = false + ssl_minimal_tls_version_enforced = "TLSEnforcementDisabled" // TODO: change to TLS1_2 + +} + +resource "azurerm_postgresql_firewall_rule" "pgfw-goodfood-stock" { + name = "allow-azure-resources" + resource_group_name = data.azurerm_resource_group.rg-goodfood.name + server_name = azurerm_postgresql_server.pg-goodfood-stock.name + start_ip_address = "0.0.0.0" + end_ip_address = "0.0.0.0" +} diff --git a/services/stock/terraform/outputs.tf b/services/stock/terraform/outputs.tf new file mode 100644 index 00000000..a2d60616 --- /dev/null +++ b/services/stock/terraform/outputs.tf @@ -0,0 +1,6 @@ +output "main-rg-name" { + value = data.azurerm_resource_group.rg-goodfood.name +} +output "main-rg-id" { + value = data.azurerm_resource_group.rg-goodfood.id +} \ No newline at end of file diff --git a/services/stock/terraform/variables.tf b/services/stock/terraform/variables.tf new file mode 100644 index 00000000..65fd7547 --- /dev/null +++ b/services/stock/terraform/variables.tf @@ -0,0 +1,16 @@ +variable "environnment_suffix" { + type = string + description = "The suffix to append to the environment name" +} + +variable "location" { + type = string + description = "The location/region where all resources in this environment should be created" + default = "West Europe" +} + +variable "project_name" { + type = string + description = "The name of the project" + default = "goodfood" +} \ No newline at end of file From 859453ad2427138c6176901842d1ceff40a2fbc2 Mon Sep 17 00:00:00 2001 From: Florian LEROUX <10078837+floriaaan@users.noreply.github.com> Date: Sun, 16 Apr 2023 12:55:07 +0200 Subject: [PATCH 145/883] fix(typo): change "delivery" to "stock" --- services/stock/terraform/env/dev-backend.tfvars.example | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/stock/terraform/env/dev-backend.tfvars.example b/services/stock/terraform/env/dev-backend.tfvars.example index e0cce6f6..033a8187 100644 --- a/services/stock/terraform/env/dev-backend.tfvars.example +++ b/services/stock/terraform/env/dev-backend.tfvars.example @@ -1,4 +1,4 @@ resource_group_name = "rg-goodfood-dev" storage_account_name = "sa-goodfood-states" container_name = "tfstate" -key = "delivery-dev.tfstate" +key = "stock-dev.tfstate" From 19fa3ad02f2542871a2be2820fb081935da3e0af Mon Sep 17 00:00:00 2001 From: anatole Date: Fri, 12 May 2023 16:12:02 +0200 Subject: [PATCH 146/883] feat(user): add user route --- services/proto/user.pb.go | 905 ++++++++++++++++----- services/proto/user.proto | 58 +- services/proto/user_grpc.pb.go | 60 +- services/user/src/pkg/db/db.go | 10 + services/user/src/pkg/mapper/userMapper.go | 39 + services/user/src/pkg/models/user.go | 2 +- services/user/src/pkg/services/auth.go | 8 +- services/user/src/pkg/services/user.go | 140 ++++ 8 files changed, 956 insertions(+), 266 deletions(-) create mode 100644 services/user/src/pkg/services/user.go diff --git a/services/proto/user.pb.go b/services/proto/user.pb.go index 5f6a9fb8..9e030ae9 100644 --- a/services/proto/user.pb.go +++ b/services/proto/user.pb.go @@ -266,6 +266,116 @@ func (x *User) GetRole() *Role { return nil } +type UpdateUserInput struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + User *User `protobuf:"bytes,1,opt,name=user,proto3" json:"user,omitempty"` + Token string `protobuf:"bytes,8,opt,name=token,proto3" json:"token,omitempty"` +} + +func (x *UpdateUserInput) Reset() { + *x = UpdateUserInput{} + if protoimpl.UnsafeEnabled { + mi := &file_user_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *UpdateUserInput) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UpdateUserInput) ProtoMessage() {} + +func (x *UpdateUserInput) ProtoReflect() protoreflect.Message { + mi := &file_user_proto_msgTypes[3] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use UpdateUserInput.ProtoReflect.Descriptor instead. +func (*UpdateUserInput) Descriptor() ([]byte, []int) { + return file_user_proto_rawDescGZIP(), []int{3} +} + +func (x *UpdateUserInput) GetUser() *User { + if x != nil { + return x.User + } + return nil +} + +func (x *UpdateUserInput) GetToken() string { + if x != nil { + return x.Token + } + return "" +} + +type UpdateUserOutput struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + User *User `protobuf:"bytes,1,opt,name=user,proto3" json:"user,omitempty"` + Error string `protobuf:"bytes,2,opt,name=error,proto3" json:"error,omitempty"` +} + +func (x *UpdateUserOutput) Reset() { + *x = UpdateUserOutput{} + if protoimpl.UnsafeEnabled { + mi := &file_user_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *UpdateUserOutput) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UpdateUserOutput) ProtoMessage() {} + +func (x *UpdateUserOutput) ProtoReflect() protoreflect.Message { + mi := &file_user_proto_msgTypes[4] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use UpdateUserOutput.ProtoReflect.Descriptor instead. +func (*UpdateUserOutput) Descriptor() ([]byte, []int) { + return file_user_proto_rawDescGZIP(), []int{4} +} + +func (x *UpdateUserOutput) GetUser() *User { + if x != nil { + return x.User + } + return nil +} + +func (x *UpdateUserOutput) GetError() string { + if x != nil { + return x.Error + } + return "" +} + type UserCreateInput struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -274,16 +384,16 @@ type UserCreateInput struct { FirstName string `protobuf:"bytes,1,opt,name=first_name,json=firstName,proto3" json:"first_name,omitempty"` LastName string `protobuf:"bytes,2,opt,name=last_name,json=lastName,proto3" json:"last_name,omitempty"` Email string `protobuf:"bytes,3,opt,name=email,proto3" json:"email,omitempty"` - Password string `protobuf:"bytes,5,opt,name=password,proto3" json:"password,omitempty"` - Phone string `protobuf:"bytes,6,opt,name=phone,proto3" json:"phone,omitempty"` - MainAddress *MainAddressInput `protobuf:"bytes,7,opt,name=mainAddress,proto3" json:"mainAddress,omitempty"` - Role *RoleInput `protobuf:"bytes,8,opt,name=role,proto3" json:"role,omitempty"` + Password string `protobuf:"bytes,4,opt,name=password,proto3" json:"password,omitempty"` + Phone string `protobuf:"bytes,5,opt,name=phone,proto3" json:"phone,omitempty"` + MainAddress *MainAddressInput `protobuf:"bytes,6,opt,name=mainAddress,proto3" json:"mainAddress,omitempty"` + Role *RoleInput `protobuf:"bytes,7,opt,name=role,proto3" json:"role,omitempty"` } func (x *UserCreateInput) Reset() { *x = UserCreateInput{} if protoimpl.UnsafeEnabled { - mi := &file_user_proto_msgTypes[3] + mi := &file_user_proto_msgTypes[5] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -296,7 +406,7 @@ func (x *UserCreateInput) String() string { func (*UserCreateInput) ProtoMessage() {} func (x *UserCreateInput) ProtoReflect() protoreflect.Message { - mi := &file_user_proto_msgTypes[3] + mi := &file_user_proto_msgTypes[5] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -309,7 +419,7 @@ func (x *UserCreateInput) ProtoReflect() protoreflect.Message { // Deprecated: Use UserCreateInput.ProtoReflect.Descriptor instead. func (*UserCreateInput) Descriptor() ([]byte, []int) { - return file_user_proto_rawDescGZIP(), []int{3} + return file_user_proto_rawDescGZIP(), []int{5} } func (x *UserCreateInput) GetFirstName() string { @@ -375,7 +485,7 @@ type MainAddressInput struct { func (x *MainAddressInput) Reset() { *x = MainAddressInput{} if protoimpl.UnsafeEnabled { - mi := &file_user_proto_msgTypes[4] + mi := &file_user_proto_msgTypes[6] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -388,7 +498,7 @@ func (x *MainAddressInput) String() string { func (*MainAddressInput) ProtoMessage() {} func (x *MainAddressInput) ProtoReflect() protoreflect.Message { - mi := &file_user_proto_msgTypes[4] + mi := &file_user_proto_msgTypes[6] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -401,7 +511,7 @@ func (x *MainAddressInput) ProtoReflect() protoreflect.Message { // Deprecated: Use MainAddressInput.ProtoReflect.Descriptor instead. func (*MainAddressInput) Descriptor() ([]byte, []int) { - return file_user_proto_rawDescGZIP(), []int{4} + return file_user_proto_rawDescGZIP(), []int{6} } func (x *MainAddressInput) GetStreet() string { @@ -443,7 +553,7 @@ type RoleInput struct { func (x *RoleInput) Reset() { *x = RoleInput{} if protoimpl.UnsafeEnabled { - mi := &file_user_proto_msgTypes[5] + mi := &file_user_proto_msgTypes[7] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -456,7 +566,7 @@ func (x *RoleInput) String() string { func (*RoleInput) ProtoMessage() {} func (x *RoleInput) ProtoReflect() protoreflect.Message { - mi := &file_user_proto_msgTypes[5] + mi := &file_user_proto_msgTypes[7] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -469,7 +579,7 @@ func (x *RoleInput) ProtoReflect() protoreflect.Message { // Deprecated: Use RoleInput.ProtoReflect.Descriptor instead. func (*RoleInput) Descriptor() ([]byte, []int) { - return file_user_proto_rawDescGZIP(), []int{5} + return file_user_proto_rawDescGZIP(), []int{7} } func (x *RoleInput) GetCode() string { @@ -490,7 +600,7 @@ type UserId struct { func (x *UserId) Reset() { *x = UserId{} if protoimpl.UnsafeEnabled { - mi := &file_user_proto_msgTypes[6] + mi := &file_user_proto_msgTypes[8] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -503,7 +613,7 @@ func (x *UserId) String() string { func (*UserId) ProtoMessage() {} func (x *UserId) ProtoReflect() protoreflect.Message { - mi := &file_user_proto_msgTypes[6] + mi := &file_user_proto_msgTypes[8] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -516,7 +626,7 @@ func (x *UserId) ProtoReflect() protoreflect.Message { // Deprecated: Use UserId.ProtoReflect.Descriptor instead. func (*UserId) Descriptor() ([]byte, []int) { - return file_user_proto_rawDescGZIP(), []int{6} + return file_user_proto_rawDescGZIP(), []int{8} } func (x *UserId) GetId() string { @@ -537,7 +647,7 @@ type UserList struct { func (x *UserList) Reset() { *x = UserList{} if protoimpl.UnsafeEnabled { - mi := &file_user_proto_msgTypes[7] + mi := &file_user_proto_msgTypes[9] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -550,7 +660,7 @@ func (x *UserList) String() string { func (*UserList) ProtoMessage() {} func (x *UserList) ProtoReflect() protoreflect.Message { - mi := &file_user_proto_msgTypes[7] + mi := &file_user_proto_msgTypes[9] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -563,7 +673,7 @@ func (x *UserList) ProtoReflect() protoreflect.Message { // Deprecated: Use UserList.ProtoReflect.Descriptor instead. func (*UserList) Descriptor() ([]byte, []int) { - return file_user_proto_rawDescGZIP(), []int{7} + return file_user_proto_rawDescGZIP(), []int{9} } func (x *UserList) GetUsers() []*User { @@ -586,7 +696,7 @@ type LogInInput struct { func (x *LogInInput) Reset() { *x = LogInInput{} if protoimpl.UnsafeEnabled { - mi := &file_user_proto_msgTypes[8] + mi := &file_user_proto_msgTypes[10] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -599,7 +709,7 @@ func (x *LogInInput) String() string { func (*LogInInput) ProtoMessage() {} func (x *LogInInput) ProtoReflect() protoreflect.Message { - mi := &file_user_proto_msgTypes[8] + mi := &file_user_proto_msgTypes[10] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -612,7 +722,7 @@ func (x *LogInInput) ProtoReflect() protoreflect.Message { // Deprecated: Use LogInInput.ProtoReflect.Descriptor instead. func (*LogInInput) Descriptor() ([]byte, []int) { - return file_user_proto_rawDescGZIP(), []int{8} + return file_user_proto_rawDescGZIP(), []int{10} } func (x *LogInInput) GetUserId() string { @@ -647,7 +757,7 @@ type ValidateInput struct { func (x *ValidateInput) Reset() { *x = ValidateInput{} if protoimpl.UnsafeEnabled { - mi := &file_user_proto_msgTypes[9] + mi := &file_user_proto_msgTypes[11] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -660,7 +770,7 @@ func (x *ValidateInput) String() string { func (*ValidateInput) ProtoMessage() {} func (x *ValidateInput) ProtoReflect() protoreflect.Message { - mi := &file_user_proto_msgTypes[9] + mi := &file_user_proto_msgTypes[11] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -673,7 +783,7 @@ func (x *ValidateInput) ProtoReflect() protoreflect.Message { // Deprecated: Use ValidateInput.ProtoReflect.Descriptor instead. func (*ValidateInput) Descriptor() ([]byte, []int) { - return file_user_proto_rawDescGZIP(), []int{9} + return file_user_proto_rawDescGZIP(), []int{11} } func (x *ValidateInput) GetToken() string { @@ -683,6 +793,61 @@ func (x *ValidateInput) GetToken() string { return "" } +type DeleteInput struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Token string `protobuf:"bytes,1,opt,name=token,proto3" json:"token,omitempty"` + UserId string `protobuf:"bytes,2,opt,name=userId,proto3" json:"userId,omitempty"` +} + +func (x *DeleteInput) Reset() { + *x = DeleteInput{} + if protoimpl.UnsafeEnabled { + mi := &file_user_proto_msgTypes[12] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DeleteInput) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DeleteInput) ProtoMessage() {} + +func (x *DeleteInput) ProtoReflect() protoreflect.Message { + mi := &file_user_proto_msgTypes[12] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DeleteInput.ProtoReflect.Descriptor instead. +func (*DeleteInput) Descriptor() ([]byte, []int) { + return file_user_proto_rawDescGZIP(), []int{12} +} + +func (x *DeleteInput) GetToken() string { + if x != nil { + return x.Token + } + return "" +} + +func (x *DeleteInput) GetUserId() string { + if x != nil { + return x.UserId + } + return "" +} + type ValidateResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -695,7 +860,7 @@ type ValidateResponse struct { func (x *ValidateResponse) Reset() { *x = ValidateResponse{} if protoimpl.UnsafeEnabled { - mi := &file_user_proto_msgTypes[10] + mi := &file_user_proto_msgTypes[13] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -708,7 +873,7 @@ func (x *ValidateResponse) String() string { func (*ValidateResponse) ProtoMessage() {} func (x *ValidateResponse) ProtoReflect() protoreflect.Message { - mi := &file_user_proto_msgTypes[10] + mi := &file_user_proto_msgTypes[13] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -721,7 +886,7 @@ func (x *ValidateResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ValidateResponse.ProtoReflect.Descriptor instead. func (*ValidateResponse) Descriptor() ([]byte, []int) { - return file_user_proto_rawDescGZIP(), []int{10} + return file_user_proto_rawDescGZIP(), []int{13} } func (x *ValidateResponse) GetError() string { @@ -750,7 +915,7 @@ type LogInResponse struct { func (x *LogInResponse) Reset() { *x = LogInResponse{} if protoimpl.UnsafeEnabled { - mi := &file_user_proto_msgTypes[11] + mi := &file_user_proto_msgTypes[14] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -763,7 +928,7 @@ func (x *LogInResponse) String() string { func (*LogInResponse) ProtoMessage() {} func (x *LogInResponse) ProtoReflect() protoreflect.Message { - mi := &file_user_proto_msgTypes[11] + mi := &file_user_proto_msgTypes[14] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -776,7 +941,7 @@ func (x *LogInResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use LogInResponse.ProtoReflect.Descriptor instead. func (*LogInResponse) Descriptor() ([]byte, []int) { - return file_user_proto_rawDescGZIP(), []int{11} + return file_user_proto_rawDescGZIP(), []int{14} } func (x *LogInResponse) GetUser() *User { @@ -798,14 +963,15 @@ type ChangePasswordInput struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - OldPassword string `protobuf:"bytes,1,opt,name=oldPassword,proto3" json:"oldPassword,omitempty"` - NewPassword string `protobuf:"bytes,2,opt,name=newPassword,proto3" json:"newPassword,omitempty"` + Token string `protobuf:"bytes,1,opt,name=token,proto3" json:"token,omitempty"` + OldPassword string `protobuf:"bytes,2,opt,name=oldPassword,proto3" json:"oldPassword,omitempty"` + NewPassword string `protobuf:"bytes,3,opt,name=newPassword,proto3" json:"newPassword,omitempty"` } func (x *ChangePasswordInput) Reset() { *x = ChangePasswordInput{} if protoimpl.UnsafeEnabled { - mi := &file_user_proto_msgTypes[12] + mi := &file_user_proto_msgTypes[15] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -818,7 +984,7 @@ func (x *ChangePasswordInput) String() string { func (*ChangePasswordInput) ProtoMessage() {} func (x *ChangePasswordInput) ProtoReflect() protoreflect.Message { - mi := &file_user_proto_msgTypes[12] + mi := &file_user_proto_msgTypes[15] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -831,7 +997,14 @@ func (x *ChangePasswordInput) ProtoReflect() protoreflect.Message { // Deprecated: Use ChangePasswordInput.ProtoReflect.Descriptor instead. func (*ChangePasswordInput) Descriptor() ([]byte, []int) { - return file_user_proto_rawDescGZIP(), []int{12} + return file_user_proto_rawDescGZIP(), []int{15} +} + +func (x *ChangePasswordInput) GetToken() string { + if x != nil { + return x.Token + } + return "" } func (x *ChangePasswordInput) GetOldPassword() string { @@ -848,19 +1021,75 @@ func (x *ChangePasswordInput) GetNewPassword() string { return "" } +type ChangePasswordOutput struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + User *User `protobuf:"bytes,1,opt,name=user,proto3" json:"user,omitempty"` + Error string `protobuf:"bytes,2,opt,name=error,proto3" json:"error,omitempty"` +} + +func (x *ChangePasswordOutput) Reset() { + *x = ChangePasswordOutput{} + if protoimpl.UnsafeEnabled { + mi := &file_user_proto_msgTypes[16] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ChangePasswordOutput) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ChangePasswordOutput) ProtoMessage() {} + +func (x *ChangePasswordOutput) ProtoReflect() protoreflect.Message { + mi := &file_user_proto_msgTypes[16] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ChangePasswordOutput.ProtoReflect.Descriptor instead. +func (*ChangePasswordOutput) Descriptor() ([]byte, []int) { + return file_user_proto_rawDescGZIP(), []int{16} +} + +func (x *ChangePasswordOutput) GetUser() *User { + if x != nil { + return x.User + } + return nil +} + +func (x *ChangePasswordOutput) GetError() string { + if x != nil { + return x.Error + } + return "" +} + type ChangeRoleInput struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - UserId string `protobuf:"bytes,1,opt,name=userId,proto3" json:"userId,omitempty"` - RoleCode string `protobuf:"bytes,2,opt,name=roleCode,proto3" json:"roleCode,omitempty"` + Token string `protobuf:"bytes,1,opt,name=token,proto3" json:"token,omitempty"` + UserId string `protobuf:"bytes,2,opt,name=userId,proto3" json:"userId,omitempty"` + RoleCode string `protobuf:"bytes,3,opt,name=roleCode,proto3" json:"roleCode,omitempty"` } func (x *ChangeRoleInput) Reset() { *x = ChangeRoleInput{} if protoimpl.UnsafeEnabled { - mi := &file_user_proto_msgTypes[13] + mi := &file_user_proto_msgTypes[17] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -873,7 +1102,7 @@ func (x *ChangeRoleInput) String() string { func (*ChangeRoleInput) ProtoMessage() {} func (x *ChangeRoleInput) ProtoReflect() protoreflect.Message { - mi := &file_user_proto_msgTypes[13] + mi := &file_user_proto_msgTypes[17] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -886,7 +1115,14 @@ func (x *ChangeRoleInput) ProtoReflect() protoreflect.Message { // Deprecated: Use ChangeRoleInput.ProtoReflect.Descriptor instead. func (*ChangeRoleInput) Descriptor() ([]byte, []int) { - return file_user_proto_rawDescGZIP(), []int{13} + return file_user_proto_rawDescGZIP(), []int{17} +} + +func (x *ChangeRoleInput) GetToken() string { + if x != nil { + return x.Token + } + return "" } func (x *ChangeRoleInput) GetUserId() string { @@ -903,6 +1139,116 @@ func (x *ChangeRoleInput) GetRoleCode() string { return "" } +type DeleteUserOutput struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + User *User `protobuf:"bytes,1,opt,name=user,proto3" json:"user,omitempty"` + Error string `protobuf:"bytes,2,opt,name=error,proto3" json:"error,omitempty"` +} + +func (x *DeleteUserOutput) Reset() { + *x = DeleteUserOutput{} + if protoimpl.UnsafeEnabled { + mi := &file_user_proto_msgTypes[18] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DeleteUserOutput) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DeleteUserOutput) ProtoMessage() {} + +func (x *DeleteUserOutput) ProtoReflect() protoreflect.Message { + mi := &file_user_proto_msgTypes[18] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DeleteUserOutput.ProtoReflect.Descriptor instead. +func (*DeleteUserOutput) Descriptor() ([]byte, []int) { + return file_user_proto_rawDescGZIP(), []int{18} +} + +func (x *DeleteUserOutput) GetUser() *User { + if x != nil { + return x.User + } + return nil +} + +func (x *DeleteUserOutput) GetError() string { + if x != nil { + return x.Error + } + return "" +} + +type ChangeRoleOutput struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + User *User `protobuf:"bytes,1,opt,name=user,proto3" json:"user,omitempty"` + Error string `protobuf:"bytes,2,opt,name=error,proto3" json:"error,omitempty"` +} + +func (x *ChangeRoleOutput) Reset() { + *x = ChangeRoleOutput{} + if protoimpl.UnsafeEnabled { + mi := &file_user_proto_msgTypes[19] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ChangeRoleOutput) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ChangeRoleOutput) ProtoMessage() {} + +func (x *ChangeRoleOutput) ProtoReflect() protoreflect.Message { + mi := &file_user_proto_msgTypes[19] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ChangeRoleOutput.ProtoReflect.Descriptor instead. +func (*ChangeRoleOutput) Descriptor() ([]byte, []int) { + return file_user_proto_rawDescGZIP(), []int{19} +} + +func (x *ChangeRoleOutput) GetUser() *User { + if x != nil { + return x.User + } + return nil +} + +func (x *ChangeRoleOutput) GetError() string { + if x != nil { + return x.Error + } + return "" +} + type MainAddressId struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -914,7 +1260,7 @@ type MainAddressId struct { func (x *MainAddressId) Reset() { *x = MainAddressId{} if protoimpl.UnsafeEnabled { - mi := &file_user_proto_msgTypes[14] + mi := &file_user_proto_msgTypes[20] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -927,7 +1273,7 @@ func (x *MainAddressId) String() string { func (*MainAddressId) ProtoMessage() {} func (x *MainAddressId) ProtoReflect() protoreflect.Message { - mi := &file_user_proto_msgTypes[14] + mi := &file_user_proto_msgTypes[20] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -940,7 +1286,7 @@ func (x *MainAddressId) ProtoReflect() protoreflect.Message { // Deprecated: Use MainAddressId.ProtoReflect.Descriptor instead. func (*MainAddressId) Descriptor() ([]byte, []int) { - return file_user_proto_rawDescGZIP(), []int{14} + return file_user_proto_rawDescGZIP(), []int{20} } func (x *MainAddressId) GetId() string { @@ -984,125 +1330,163 @@ var file_user_proto_rawDesc = []byte{ 0x72, 0x65, 0x73, 0x73, 0x52, 0x0b, 0x6d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x2b, 0x0a, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, - 0x73, 0x65, 0x72, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x22, 0x8e, - 0x02, 0x0a, 0x0f, 0x55, 0x73, 0x65, 0x72, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x70, - 0x75, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x66, 0x69, 0x72, 0x73, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x66, 0x69, 0x72, 0x73, 0x74, 0x4e, 0x61, 0x6d, - 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6c, 0x61, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x14, - 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, - 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, - 0x12, 0x14, 0x0a, 0x05, 0x70, 0x68, 0x6f, 0x6e, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x70, 0x68, 0x6f, 0x6e, 0x65, 0x12, 0x45, 0x0a, 0x0b, 0x6d, 0x61, 0x69, 0x6e, 0x41, 0x64, - 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x63, 0x6f, - 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, - 0x4d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x49, 0x6e, 0x70, 0x75, 0x74, - 0x52, 0x0b, 0x6d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x30, 0x0a, - 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x63, 0x6f, - 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, - 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x52, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x22, - 0x80, 0x01, 0x0a, 0x10, 0x4d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x49, - 0x6e, 0x70, 0x75, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x72, 0x65, 0x65, 0x74, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x72, 0x65, 0x65, 0x74, 0x12, 0x18, 0x0a, 0x07, - 0x7a, 0x69, 0x70, 0x43, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x7a, - 0x69, 0x70, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, - 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, - 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x73, 0x18, - 0x04, 0x20, 0x03, 0x28, 0x05, 0x52, 0x0b, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x69, 0x6e, 0x61, 0x74, - 0x65, 0x73, 0x22, 0x1f, 0x0a, 0x09, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x12, - 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, - 0x6f, 0x64, 0x65, 0x22, 0x18, 0x0a, 0x06, 0x55, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x0e, 0x0a, - 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x39, 0x0a, - 0x08, 0x55, 0x73, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x2d, 0x0a, 0x05, 0x75, 0x73, 0x65, - 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, - 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, - 0x72, 0x52, 0x05, 0x75, 0x73, 0x65, 0x72, 0x73, 0x22, 0x56, 0x0a, 0x0a, 0x6c, 0x6f, 0x67, 0x49, - 0x6e, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x14, - 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, - 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, - 0x22, 0x25, 0x0a, 0x0d, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x70, 0x75, - 0x74, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x40, 0x0a, 0x10, 0x76, 0x61, 0x6c, 0x69, 0x64, - 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, - 0x72, 0x72, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, - 0x72, 0x12, 0x16, 0x0a, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x22, 0x52, 0x0a, 0x0d, 0x6c, 0x6f, 0x67, - 0x49, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2b, 0x0a, 0x04, 0x75, 0x73, - 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, - 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, - 0x72, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x59, 0x0a, - 0x13, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x49, - 0x6e, 0x70, 0x75, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x6f, 0x6c, 0x64, 0x50, 0x61, 0x73, 0x73, 0x77, - 0x6f, 0x72, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x6f, 0x6c, 0x64, 0x50, 0x61, + 0x73, 0x65, 0x72, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x22, 0x54, + 0x0a, 0x0f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x49, 0x6e, 0x70, 0x75, + 0x74, 0x12, 0x2b, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x17, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, + 0x73, 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x12, 0x14, + 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, + 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x55, 0x0a, 0x10, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x55, 0x73, + 0x65, 0x72, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x2b, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, + 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, + 0x04, 0x75, 0x73, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x8e, 0x02, 0x0a, 0x0f, + 0x55, 0x73, 0x65, 0x72, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x12, + 0x1d, 0x0a, 0x0a, 0x66, 0x69, 0x72, 0x73, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x09, 0x66, 0x69, 0x72, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1b, + 0x0a, 0x09, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x6c, 0x61, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, + 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, + 0x6c, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x14, 0x0a, + 0x05, 0x70, 0x68, 0x6f, 0x6e, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x68, + 0x6f, 0x6e, 0x65, 0x12, 0x45, 0x0a, 0x0b, 0x6d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, + 0x73, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, + 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x4d, 0x61, 0x69, + 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x52, 0x0b, 0x6d, + 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x30, 0x0a, 0x04, 0x72, 0x6f, + 0x6c, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, + 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x52, 0x6f, 0x6c, + 0x65, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x52, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x22, 0x80, 0x01, 0x0a, + 0x10, 0x4d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x49, 0x6e, 0x70, 0x75, + 0x74, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x72, 0x65, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x06, 0x73, 0x74, 0x72, 0x65, 0x65, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x7a, 0x69, 0x70, + 0x43, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x7a, 0x69, 0x70, 0x43, + 0x6f, 0x64, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x20, 0x0a, + 0x0b, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, + 0x28, 0x05, 0x52, 0x0b, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x73, 0x22, + 0x1f, 0x0a, 0x09, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x12, 0x12, 0x0a, 0x04, + 0x63, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, + 0x22, 0x18, 0x0a, 0x06, 0x55, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x39, 0x0a, 0x08, 0x55, 0x73, + 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x2d, 0x0a, 0x05, 0x75, 0x73, 0x65, 0x72, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, + 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x05, + 0x75, 0x73, 0x65, 0x72, 0x73, 0x22, 0x56, 0x0a, 0x0a, 0x6c, 0x6f, 0x67, 0x49, 0x6e, 0x49, 0x6e, + 0x70, 0x75, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x65, + 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, + 0x6c, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x22, 0x25, 0x0a, + 0x0d, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x12, 0x14, + 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, + 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x3b, 0x0a, 0x0b, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x49, 0x6e, + 0x70, 0x75, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x75, 0x73, 0x65, + 0x72, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, + 0x64, 0x22, 0x40, 0x0a, 0x10, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x75, + 0x73, 0x65, 0x72, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, + 0x72, 0x49, 0x64, 0x22, 0x52, 0x0a, 0x0d, 0x6c, 0x6f, 0x67, 0x49, 0x6e, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2b, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, + 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x04, 0x75, 0x73, 0x65, + 0x72, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x6f, 0x0a, 0x13, 0x63, 0x68, 0x61, 0x6e, 0x67, + 0x65, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x12, 0x14, + 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, + 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x6f, 0x6c, 0x64, 0x50, 0x61, 0x73, 0x73, 0x77, + 0x6f, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x6f, 0x6c, 0x64, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x6e, 0x65, 0x77, 0x50, 0x61, 0x73, - 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x6e, 0x65, 0x77, - 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x22, 0x45, 0x0a, 0x0f, 0x63, 0x68, 0x61, 0x6e, - 0x67, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x75, - 0x73, 0x65, 0x72, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, - 0x72, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x43, 0x6f, 0x64, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x43, 0x6f, 0x64, 0x65, 0x22, - 0x1f, 0x0a, 0x0d, 0x4d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x49, 0x64, - 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, - 0x32, 0xb2, 0x05, 0x0a, 0x0b, 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x12, 0x49, 0x0a, 0x08, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x12, 0x22, 0x2e, 0x63, - 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, - 0x2e, 0x55, 0x73, 0x65, 0x72, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x70, 0x75, 0x74, - 0x1a, 0x17, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, - 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x47, - 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x12, 0x19, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, - 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x49, - 0x64, 0x1a, 0x17, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, - 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x22, 0x00, 0x12, 0x4b, 0x0a, 0x0a, - 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x12, 0x22, 0x2e, 0x63, 0x6f, 0x6d, - 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, - 0x73, 0x65, 0x72, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x17, + 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x6e, 0x65, 0x77, + 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x22, 0x59, 0x0a, 0x14, 0x63, 0x68, 0x61, 0x6e, + 0x67, 0x65, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, + 0x12, 0x2b, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, - 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x22, 0x00, 0x12, 0x41, 0x0a, 0x0a, 0x44, 0x65, 0x6c, - 0x65, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x12, 0x19, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, - 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, - 0x49, 0x64, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x44, 0x0a, 0x08, - 0x4c, 0x69, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, 0x12, 0x19, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, - 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, - 0x72, 0x49, 0x64, 0x1a, 0x1b, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, - 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, - 0x22, 0x00, 0x12, 0x4a, 0x0a, 0x05, 0x4c, 0x6f, 0x67, 0x49, 0x6e, 0x12, 0x1d, 0x2e, 0x63, 0x6f, + 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x12, 0x14, 0x0a, + 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, + 0x72, 0x6f, 0x72, 0x22, 0x5b, 0x0a, 0x0f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x6f, 0x6c, + 0x65, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x16, 0x0a, 0x06, + 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, + 0x65, 0x72, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x43, 0x6f, 0x64, 0x65, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x43, 0x6f, 0x64, 0x65, + 0x22, 0x55, 0x0a, 0x10, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x4f, 0x75, + 0x74, 0x70, 0x75, 0x74, 0x12, 0x2b, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, + 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x04, 0x75, 0x73, 0x65, + 0x72, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x55, 0x0a, 0x10, 0x63, 0x68, 0x61, 0x6e, 0x67, + 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x2b, 0x0a, 0x04, 0x75, + 0x73, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, + 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, 0x73, + 0x65, 0x72, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, + 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x1f, + 0x0a, 0x0d, 0x4d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x49, 0x64, 0x12, + 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x32, + 0xe9, 0x05, 0x0a, 0x0b, 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, + 0x49, 0x0a, 0x08, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x12, 0x22, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, - 0x6c, 0x6f, 0x67, 0x49, 0x6e, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x20, 0x2e, 0x63, 0x6f, 0x6d, - 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x6c, - 0x6f, 0x67, 0x49, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x53, - 0x0a, 0x08, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x12, 0x20, 0x2e, 0x63, 0x6f, 0x6d, - 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x76, - 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x23, 0x2e, 0x63, - 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, - 0x2e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x00, 0x12, 0x53, 0x0a, 0x0e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x61, 0x73, - 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x26, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, - 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, - 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x17, 0x2e, + 0x55, 0x73, 0x65, 0x72, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, + 0x17, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, + 0x73, 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x47, 0x65, + 0x74, 0x55, 0x73, 0x65, 0x72, 0x12, 0x19, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, + 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x49, 0x64, + 0x1a, 0x17, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, + 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0a, 0x55, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x12, 0x22, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, + 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x23, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, - 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x22, 0x00, 0x12, 0x4b, 0x0a, 0x0a, 0x43, 0x68, 0x61, 0x6e, - 0x67, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x12, 0x22, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, - 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x63, 0x68, 0x61, 0x6e, 0x67, - 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x17, 0x2e, 0x63, 0x6f, 0x6d, - 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, - 0x73, 0x65, 0x72, 0x22, 0x00, 0x32, 0xbb, 0x01, 0x0a, 0x12, 0x4d, 0x61, 0x69, 0x6e, 0x41, 0x64, - 0x64, 0x72, 0x65, 0x73, 0x73, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x54, 0x0a, 0x0e, - 0x47, 0x65, 0x74, 0x4d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x20, - 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, - 0x65, 0x72, 0x2e, 0x4d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x49, 0x64, - 0x1a, 0x1e, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, - 0x75, 0x73, 0x65, 0x72, 0x2e, 0x4d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, - 0x22, 0x00, 0x12, 0x4f, 0x0a, 0x11, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x61, 0x69, 0x6e, - 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x20, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, - 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x4d, 0x61, 0x69, 0x6e, - 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x49, 0x64, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, - 0x79, 0x22, 0x00, 0x42, 0x03, 0x5a, 0x01, 0x2e, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x72, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x4f, 0x75, 0x74, 0x70, + 0x75, 0x74, 0x22, 0x00, 0x12, 0x53, 0x0a, 0x0a, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x55, 0x73, + 0x65, 0x72, 0x12, 0x1e, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, + 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x49, 0x6e, 0x70, + 0x75, 0x74, 0x1a, 0x23, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, + 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x55, 0x73, 0x65, + 0x72, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x41, 0x0a, 0x08, 0x4c, 0x69, 0x73, + 0x74, 0x55, 0x73, 0x65, 0x72, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1b, 0x2e, + 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, + 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x22, 0x00, 0x12, 0x4a, 0x0a, 0x05, + 0x4c, 0x6f, 0x67, 0x49, 0x6e, 0x12, 0x1d, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, + 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x6c, 0x6f, 0x67, 0x49, 0x6e, 0x49, + 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x20, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, + 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x6c, 0x6f, 0x67, 0x49, 0x6e, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x53, 0x0a, 0x08, 0x56, 0x61, 0x6c, 0x69, + 0x64, 0x61, 0x74, 0x65, 0x12, 0x20, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, + 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, + 0x65, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x23, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, + 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x76, 0x61, 0x6c, 0x69, 0x64, + 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x63, 0x0a, + 0x0e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, + 0x26, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, + 0x73, 0x65, 0x72, 0x2e, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, + 0x72, 0x64, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x27, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, + 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x63, 0x68, 0x61, 0x6e, + 0x67, 0x65, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, + 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0a, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x6f, 0x6c, 0x65, + 0x12, 0x22, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, + 0x75, 0x73, 0x65, 0x72, 0x2e, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x49, + 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x23, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, + 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, + 0x6f, 0x6c, 0x65, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x32, 0xbb, 0x01, 0x0a, 0x12, + 0x4d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x53, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x12, 0x54, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x4d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, + 0x72, 0x65, 0x73, 0x73, 0x12, 0x20, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, + 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x4d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, + 0x72, 0x65, 0x73, 0x73, 0x49, 0x64, 0x1a, 0x1e, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, + 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x4d, 0x61, 0x69, 0x6e, 0x41, + 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x22, 0x00, 0x12, 0x4f, 0x0a, 0x11, 0x44, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x4d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x20, 0x2e, + 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, + 0x72, 0x2e, 0x4d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x49, 0x64, 0x1a, + 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x42, 0x03, 0x5a, 0x01, 0x2e, 0x62, 0x06, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -1117,59 +1501,70 @@ func file_user_proto_rawDescGZIP() []byte { return file_user_proto_rawDescData } -var file_user_proto_msgTypes = make([]protoimpl.MessageInfo, 15) +var file_user_proto_msgTypes = make([]protoimpl.MessageInfo, 21) var file_user_proto_goTypes = []interface{}{ - (*Role)(nil), // 0: com.goodfood.user.Role - (*MainAddress)(nil), // 1: com.goodfood.user.MainAddress - (*User)(nil), // 2: com.goodfood.user.User - (*UserCreateInput)(nil), // 3: com.goodfood.user.UserCreateInput - (*MainAddressInput)(nil), // 4: com.goodfood.user.MainAddressInput - (*RoleInput)(nil), // 5: com.goodfood.user.RoleInput - (*UserId)(nil), // 6: com.goodfood.user.UserId - (*UserList)(nil), // 7: com.goodfood.user.UserList - (*LogInInput)(nil), // 8: com.goodfood.user.logInInput - (*ValidateInput)(nil), // 9: com.goodfood.user.validateInput - (*ValidateResponse)(nil), // 10: com.goodfood.user.validateResponse - (*LogInResponse)(nil), // 11: com.goodfood.user.logInResponse - (*ChangePasswordInput)(nil), // 12: com.goodfood.user.changePasswordInput - (*ChangeRoleInput)(nil), // 13: com.goodfood.user.changeRoleInput - (*MainAddressId)(nil), // 14: com.goodfood.user.MainAddressId - (*empty.Empty)(nil), // 15: google.protobuf.Empty + (*Role)(nil), // 0: com.goodfood.user.Role + (*MainAddress)(nil), // 1: com.goodfood.user.MainAddress + (*User)(nil), // 2: com.goodfood.user.User + (*UpdateUserInput)(nil), // 3: com.goodfood.user.UpdateUserInput + (*UpdateUserOutput)(nil), // 4: com.goodfood.user.UpdateUserOutput + (*UserCreateInput)(nil), // 5: com.goodfood.user.UserCreateInput + (*MainAddressInput)(nil), // 6: com.goodfood.user.MainAddressInput + (*RoleInput)(nil), // 7: com.goodfood.user.RoleInput + (*UserId)(nil), // 8: com.goodfood.user.UserId + (*UserList)(nil), // 9: com.goodfood.user.UserList + (*LogInInput)(nil), // 10: com.goodfood.user.logInInput + (*ValidateInput)(nil), // 11: com.goodfood.user.validateInput + (*DeleteInput)(nil), // 12: com.goodfood.user.DeleteInput + (*ValidateResponse)(nil), // 13: com.goodfood.user.validateResponse + (*LogInResponse)(nil), // 14: com.goodfood.user.logInResponse + (*ChangePasswordInput)(nil), // 15: com.goodfood.user.changePasswordInput + (*ChangePasswordOutput)(nil), // 16: com.goodfood.user.changePasswordOutput + (*ChangeRoleInput)(nil), // 17: com.goodfood.user.changeRoleInput + (*DeleteUserOutput)(nil), // 18: com.goodfood.user.DeleteUserOutput + (*ChangeRoleOutput)(nil), // 19: com.goodfood.user.changeRoleOutput + (*MainAddressId)(nil), // 20: com.goodfood.user.MainAddressId + (*empty.Empty)(nil), // 21: google.protobuf.Empty } var file_user_proto_depIdxs = []int32{ 1, // 0: com.goodfood.user.User.mainAddress:type_name -> com.goodfood.user.MainAddress 0, // 1: com.goodfood.user.User.role:type_name -> com.goodfood.user.Role - 4, // 2: com.goodfood.user.UserCreateInput.mainAddress:type_name -> com.goodfood.user.MainAddressInput - 5, // 3: com.goodfood.user.UserCreateInput.role:type_name -> com.goodfood.user.RoleInput - 2, // 4: com.goodfood.user.UserList.users:type_name -> com.goodfood.user.User - 2, // 5: com.goodfood.user.logInResponse.user:type_name -> com.goodfood.user.User - 3, // 6: com.goodfood.user.UserService.Register:input_type -> com.goodfood.user.UserCreateInput - 6, // 7: com.goodfood.user.UserService.GetUser:input_type -> com.goodfood.user.UserId - 3, // 8: com.goodfood.user.UserService.UpdateUser:input_type -> com.goodfood.user.UserCreateInput - 6, // 9: com.goodfood.user.UserService.DeleteUser:input_type -> com.goodfood.user.UserId - 6, // 10: com.goodfood.user.UserService.ListUser:input_type -> com.goodfood.user.UserId - 8, // 11: com.goodfood.user.UserService.LogIn:input_type -> com.goodfood.user.logInInput - 9, // 12: com.goodfood.user.UserService.Validate:input_type -> com.goodfood.user.validateInput - 12, // 13: com.goodfood.user.UserService.ChangePassword:input_type -> com.goodfood.user.changePasswordInput - 13, // 14: com.goodfood.user.UserService.ChangeRole:input_type -> com.goodfood.user.changeRoleInput - 14, // 15: com.goodfood.user.MainAddressService.GetMainAddress:input_type -> com.goodfood.user.MainAddressId - 14, // 16: com.goodfood.user.MainAddressService.DeleteMainAddress:input_type -> com.goodfood.user.MainAddressId - 2, // 17: com.goodfood.user.UserService.Register:output_type -> com.goodfood.user.User - 2, // 18: com.goodfood.user.UserService.GetUser:output_type -> com.goodfood.user.User - 2, // 19: com.goodfood.user.UserService.UpdateUser:output_type -> com.goodfood.user.User - 15, // 20: com.goodfood.user.UserService.DeleteUser:output_type -> google.protobuf.Empty - 7, // 21: com.goodfood.user.UserService.ListUser:output_type -> com.goodfood.user.UserList - 11, // 22: com.goodfood.user.UserService.LogIn:output_type -> com.goodfood.user.logInResponse - 10, // 23: com.goodfood.user.UserService.Validate:output_type -> com.goodfood.user.validateResponse - 2, // 24: com.goodfood.user.UserService.ChangePassword:output_type -> com.goodfood.user.User - 2, // 25: com.goodfood.user.UserService.ChangeRole:output_type -> com.goodfood.user.User - 1, // 26: com.goodfood.user.MainAddressService.GetMainAddress:output_type -> com.goodfood.user.MainAddress - 15, // 27: com.goodfood.user.MainAddressService.DeleteMainAddress:output_type -> google.protobuf.Empty - 17, // [17:28] is the sub-list for method output_type - 6, // [6:17] is the sub-list for method input_type - 6, // [6:6] is the sub-list for extension type_name - 6, // [6:6] is the sub-list for extension extendee - 0, // [0:6] is the sub-list for field type_name + 2, // 2: com.goodfood.user.UpdateUserInput.user:type_name -> com.goodfood.user.User + 2, // 3: com.goodfood.user.UpdateUserOutput.user:type_name -> com.goodfood.user.User + 6, // 4: com.goodfood.user.UserCreateInput.mainAddress:type_name -> com.goodfood.user.MainAddressInput + 7, // 5: com.goodfood.user.UserCreateInput.role:type_name -> com.goodfood.user.RoleInput + 2, // 6: com.goodfood.user.UserList.users:type_name -> com.goodfood.user.User + 2, // 7: com.goodfood.user.logInResponse.user:type_name -> com.goodfood.user.User + 2, // 8: com.goodfood.user.changePasswordOutput.user:type_name -> com.goodfood.user.User + 2, // 9: com.goodfood.user.DeleteUserOutput.user:type_name -> com.goodfood.user.User + 2, // 10: com.goodfood.user.changeRoleOutput.user:type_name -> com.goodfood.user.User + 5, // 11: com.goodfood.user.UserService.Register:input_type -> com.goodfood.user.UserCreateInput + 8, // 12: com.goodfood.user.UserService.GetUser:input_type -> com.goodfood.user.UserId + 3, // 13: com.goodfood.user.UserService.UpdateUser:input_type -> com.goodfood.user.UpdateUserInput + 12, // 14: com.goodfood.user.UserService.DeleteUser:input_type -> com.goodfood.user.DeleteInput + 21, // 15: com.goodfood.user.UserService.ListUser:input_type -> google.protobuf.Empty + 10, // 16: com.goodfood.user.UserService.LogIn:input_type -> com.goodfood.user.logInInput + 11, // 17: com.goodfood.user.UserService.Validate:input_type -> com.goodfood.user.validateInput + 15, // 18: com.goodfood.user.UserService.ChangePassword:input_type -> com.goodfood.user.changePasswordInput + 17, // 19: com.goodfood.user.UserService.ChangeRole:input_type -> com.goodfood.user.changeRoleInput + 20, // 20: com.goodfood.user.MainAddressService.GetMainAddress:input_type -> com.goodfood.user.MainAddressId + 20, // 21: com.goodfood.user.MainAddressService.DeleteMainAddress:input_type -> com.goodfood.user.MainAddressId + 2, // 22: com.goodfood.user.UserService.Register:output_type -> com.goodfood.user.User + 2, // 23: com.goodfood.user.UserService.GetUser:output_type -> com.goodfood.user.User + 4, // 24: com.goodfood.user.UserService.UpdateUser:output_type -> com.goodfood.user.UpdateUserOutput + 18, // 25: com.goodfood.user.UserService.DeleteUser:output_type -> com.goodfood.user.DeleteUserOutput + 9, // 26: com.goodfood.user.UserService.ListUser:output_type -> com.goodfood.user.UserList + 14, // 27: com.goodfood.user.UserService.LogIn:output_type -> com.goodfood.user.logInResponse + 13, // 28: com.goodfood.user.UserService.Validate:output_type -> com.goodfood.user.validateResponse + 16, // 29: com.goodfood.user.UserService.ChangePassword:output_type -> com.goodfood.user.changePasswordOutput + 19, // 30: com.goodfood.user.UserService.ChangeRole:output_type -> com.goodfood.user.changeRoleOutput + 1, // 31: com.goodfood.user.MainAddressService.GetMainAddress:output_type -> com.goodfood.user.MainAddress + 21, // 32: com.goodfood.user.MainAddressService.DeleteMainAddress:output_type -> google.protobuf.Empty + 22, // [22:33] is the sub-list for method output_type + 11, // [11:22] is the sub-list for method input_type + 11, // [11:11] is the sub-list for extension type_name + 11, // [11:11] is the sub-list for extension extendee + 0, // [0:11] is the sub-list for field type_name } func init() { file_user_proto_init() } @@ -1215,7 +1610,7 @@ func file_user_proto_init() { } } file_user_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UserCreateInput); i { + switch v := v.(*UpdateUserInput); i { case 0: return &v.state case 1: @@ -1227,7 +1622,7 @@ func file_user_proto_init() { } } file_user_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MainAddressInput); i { + switch v := v.(*UpdateUserOutput); i { case 0: return &v.state case 1: @@ -1239,7 +1634,7 @@ func file_user_proto_init() { } } file_user_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RoleInput); i { + switch v := v.(*UserCreateInput); i { case 0: return &v.state case 1: @@ -1251,7 +1646,7 @@ func file_user_proto_init() { } } file_user_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UserId); i { + switch v := v.(*MainAddressInput); i { case 0: return &v.state case 1: @@ -1263,7 +1658,7 @@ func file_user_proto_init() { } } file_user_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UserList); i { + switch v := v.(*RoleInput); i { case 0: return &v.state case 1: @@ -1275,7 +1670,7 @@ func file_user_proto_init() { } } file_user_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*LogInInput); i { + switch v := v.(*UserId); i { case 0: return &v.state case 1: @@ -1287,7 +1682,7 @@ func file_user_proto_init() { } } file_user_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ValidateInput); i { + switch v := v.(*UserList); i { case 0: return &v.state case 1: @@ -1299,7 +1694,7 @@ func file_user_proto_init() { } } file_user_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ValidateResponse); i { + switch v := v.(*LogInInput); i { case 0: return &v.state case 1: @@ -1311,7 +1706,7 @@ func file_user_proto_init() { } } file_user_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*LogInResponse); i { + switch v := v.(*ValidateInput); i { case 0: return &v.state case 1: @@ -1323,7 +1718,7 @@ func file_user_proto_init() { } } file_user_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ChangePasswordInput); i { + switch v := v.(*DeleteInput); i { case 0: return &v.state case 1: @@ -1335,7 +1730,7 @@ func file_user_proto_init() { } } file_user_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ChangeRoleInput); i { + switch v := v.(*ValidateResponse); i { case 0: return &v.state case 1: @@ -1347,6 +1742,78 @@ func file_user_proto_init() { } } file_user_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*LogInResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_user_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ChangePasswordInput); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_user_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ChangePasswordOutput); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_user_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ChangeRoleInput); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_user_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DeleteUserOutput); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_user_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ChangeRoleOutput); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_user_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*MainAddressId); i { case 0: return &v.state @@ -1365,7 +1832,7 @@ func file_user_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_user_proto_rawDesc, NumEnums: 0, - NumMessages: 15, + NumMessages: 21, NumExtensions: 0, NumServices: 2, }, diff --git a/services/proto/user.proto b/services/proto/user.proto index 67dcc504..213adf29 100644 --- a/services/proto/user.proto +++ b/services/proto/user.proto @@ -31,16 +31,26 @@ message User { Role role = 7; } +message UpdateUserInput { + User user = 1; + string token = 8; +} + +message UpdateUserOutput { + User user = 1; + string error = 2; +} + service UserService { rpc Register (UserCreateInput) returns (User) {} rpc GetUser (UserId) returns (User) {} - rpc UpdateUser (UserCreateInput) returns (User) {} - rpc DeleteUser (UserId) returns (google.protobuf.Empty) {} - rpc ListUser (UserId) returns (UserList) {} + rpc UpdateUser (UpdateUserInput) returns (UpdateUserOutput) {} + rpc DeleteUser (DeleteInput) returns (DeleteUserOutput) {} + rpc ListUser (google.protobuf.Empty) returns (UserList) {} rpc LogIn (logInInput) returns (logInResponse) {} rpc Validate (validateInput) returns (validateResponse) {} - rpc ChangePassword (changePasswordInput) returns (User) {} - rpc ChangeRole (changeRoleInput) returns (User) {} + rpc ChangePassword (changePasswordInput) returns (changePasswordOutput) {} + rpc ChangeRole (changeRoleInput) returns (changeRoleOutput) {} } service MainAddressService { @@ -52,10 +62,10 @@ message UserCreateInput { string first_name = 1; string last_name = 2; string email = 3; - string password = 5; - string phone = 6; - MainAddressInput mainAddress = 7; - RoleInput role = 8; + string password = 4; + string phone = 5; + MainAddressInput mainAddress = 6; + RoleInput role = 7; } message MainAddressInput { @@ -87,6 +97,11 @@ message validateInput { string token = 1; } +message DeleteInput { + string token = 1; + string userId = 2; +} + message validateResponse { string error = 1; string userId = 2; @@ -99,13 +114,30 @@ message logInResponse { message changePasswordInput { - string oldPassword = 1; - string newPassword = 2; + string token = 1; + string oldPassword = 2; + string newPassword = 3; +} + +message changePasswordOutput{ + User user = 1; + string error = 2; } message changeRoleInput { - string userId = 1; - string roleCode = 2; + string token = 1; + string userId = 2; + string roleCode = 3; +} + +message DeleteUserOutput { + User user = 1; + string error = 2; +} + +message changeRoleOutput{ + User user = 1; + string error = 2; } message MainAddressId { diff --git a/services/proto/user_grpc.pb.go b/services/proto/user_grpc.pb.go index e8c6fbec..70673da5 100644 --- a/services/proto/user_grpc.pb.go +++ b/services/proto/user_grpc.pb.go @@ -25,13 +25,13 @@ const _ = grpc.SupportPackageIsVersion7 type UserServiceClient interface { Register(ctx context.Context, in *UserCreateInput, opts ...grpc.CallOption) (*User, error) GetUser(ctx context.Context, in *UserId, opts ...grpc.CallOption) (*User, error) - UpdateUser(ctx context.Context, in *UserCreateInput, opts ...grpc.CallOption) (*User, error) - DeleteUser(ctx context.Context, in *UserId, opts ...grpc.CallOption) (*empty.Empty, error) - ListUser(ctx context.Context, in *UserId, opts ...grpc.CallOption) (*UserList, error) + UpdateUser(ctx context.Context, in *UpdateUserInput, opts ...grpc.CallOption) (*UpdateUserOutput, error) + DeleteUser(ctx context.Context, in *DeleteInput, opts ...grpc.CallOption) (*DeleteUserOutput, error) + ListUser(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*UserList, error) LogIn(ctx context.Context, in *LogInInput, opts ...grpc.CallOption) (*LogInResponse, error) Validate(ctx context.Context, in *ValidateInput, opts ...grpc.CallOption) (*ValidateResponse, error) - ChangePassword(ctx context.Context, in *ChangePasswordInput, opts ...grpc.CallOption) (*User, error) - ChangeRole(ctx context.Context, in *ChangeRoleInput, opts ...grpc.CallOption) (*User, error) + ChangePassword(ctx context.Context, in *ChangePasswordInput, opts ...grpc.CallOption) (*ChangePasswordOutput, error) + ChangeRole(ctx context.Context, in *ChangeRoleInput, opts ...grpc.CallOption) (*ChangeRoleOutput, error) } type userServiceClient struct { @@ -60,8 +60,8 @@ func (c *userServiceClient) GetUser(ctx context.Context, in *UserId, opts ...grp return out, nil } -func (c *userServiceClient) UpdateUser(ctx context.Context, in *UserCreateInput, opts ...grpc.CallOption) (*User, error) { - out := new(User) +func (c *userServiceClient) UpdateUser(ctx context.Context, in *UpdateUserInput, opts ...grpc.CallOption) (*UpdateUserOutput, error) { + out := new(UpdateUserOutput) err := c.cc.Invoke(ctx, "/com.goodfood.user.UserService/UpdateUser", in, out, opts...) if err != nil { return nil, err @@ -69,8 +69,8 @@ func (c *userServiceClient) UpdateUser(ctx context.Context, in *UserCreateInput, return out, nil } -func (c *userServiceClient) DeleteUser(ctx context.Context, in *UserId, opts ...grpc.CallOption) (*empty.Empty, error) { - out := new(empty.Empty) +func (c *userServiceClient) DeleteUser(ctx context.Context, in *DeleteInput, opts ...grpc.CallOption) (*DeleteUserOutput, error) { + out := new(DeleteUserOutput) err := c.cc.Invoke(ctx, "/com.goodfood.user.UserService/DeleteUser", in, out, opts...) if err != nil { return nil, err @@ -78,7 +78,7 @@ func (c *userServiceClient) DeleteUser(ctx context.Context, in *UserId, opts ... return out, nil } -func (c *userServiceClient) ListUser(ctx context.Context, in *UserId, opts ...grpc.CallOption) (*UserList, error) { +func (c *userServiceClient) ListUser(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*UserList, error) { out := new(UserList) err := c.cc.Invoke(ctx, "/com.goodfood.user.UserService/ListUser", in, out, opts...) if err != nil { @@ -105,8 +105,8 @@ func (c *userServiceClient) Validate(ctx context.Context, in *ValidateInput, opt return out, nil } -func (c *userServiceClient) ChangePassword(ctx context.Context, in *ChangePasswordInput, opts ...grpc.CallOption) (*User, error) { - out := new(User) +func (c *userServiceClient) ChangePassword(ctx context.Context, in *ChangePasswordInput, opts ...grpc.CallOption) (*ChangePasswordOutput, error) { + out := new(ChangePasswordOutput) err := c.cc.Invoke(ctx, "/com.goodfood.user.UserService/ChangePassword", in, out, opts...) if err != nil { return nil, err @@ -114,8 +114,8 @@ func (c *userServiceClient) ChangePassword(ctx context.Context, in *ChangePasswo return out, nil } -func (c *userServiceClient) ChangeRole(ctx context.Context, in *ChangeRoleInput, opts ...grpc.CallOption) (*User, error) { - out := new(User) +func (c *userServiceClient) ChangeRole(ctx context.Context, in *ChangeRoleInput, opts ...grpc.CallOption) (*ChangeRoleOutput, error) { + out := new(ChangeRoleOutput) err := c.cc.Invoke(ctx, "/com.goodfood.user.UserService/ChangeRole", in, out, opts...) if err != nil { return nil, err @@ -129,13 +129,13 @@ func (c *userServiceClient) ChangeRole(ctx context.Context, in *ChangeRoleInput, type UserServiceServer interface { Register(context.Context, *UserCreateInput) (*User, error) GetUser(context.Context, *UserId) (*User, error) - UpdateUser(context.Context, *UserCreateInput) (*User, error) - DeleteUser(context.Context, *UserId) (*empty.Empty, error) - ListUser(context.Context, *UserId) (*UserList, error) + UpdateUser(context.Context, *UpdateUserInput) (*UpdateUserOutput, error) + DeleteUser(context.Context, *DeleteInput) (*DeleteUserOutput, error) + ListUser(context.Context, *empty.Empty) (*UserList, error) LogIn(context.Context, *LogInInput) (*LogInResponse, error) Validate(context.Context, *ValidateInput) (*ValidateResponse, error) - ChangePassword(context.Context, *ChangePasswordInput) (*User, error) - ChangeRole(context.Context, *ChangeRoleInput) (*User, error) + ChangePassword(context.Context, *ChangePasswordInput) (*ChangePasswordOutput, error) + ChangeRole(context.Context, *ChangeRoleInput) (*ChangeRoleOutput, error) mustEmbedUnimplementedUserServiceServer() } @@ -149,13 +149,13 @@ func (UnimplementedUserServiceServer) Register(context.Context, *UserCreateInput func (UnimplementedUserServiceServer) GetUser(context.Context, *UserId) (*User, error) { return nil, status.Errorf(codes.Unimplemented, "method GetUser not implemented") } -func (UnimplementedUserServiceServer) UpdateUser(context.Context, *UserCreateInput) (*User, error) { +func (UnimplementedUserServiceServer) UpdateUser(context.Context, *UpdateUserInput) (*UpdateUserOutput, error) { return nil, status.Errorf(codes.Unimplemented, "method UpdateUser not implemented") } -func (UnimplementedUserServiceServer) DeleteUser(context.Context, *UserId) (*empty.Empty, error) { +func (UnimplementedUserServiceServer) DeleteUser(context.Context, *DeleteInput) (*DeleteUserOutput, error) { return nil, status.Errorf(codes.Unimplemented, "method DeleteUser not implemented") } -func (UnimplementedUserServiceServer) ListUser(context.Context, *UserId) (*UserList, error) { +func (UnimplementedUserServiceServer) ListUser(context.Context, *empty.Empty) (*UserList, error) { return nil, status.Errorf(codes.Unimplemented, "method ListUser not implemented") } func (UnimplementedUserServiceServer) LogIn(context.Context, *LogInInput) (*LogInResponse, error) { @@ -164,10 +164,10 @@ func (UnimplementedUserServiceServer) LogIn(context.Context, *LogInInput) (*LogI func (UnimplementedUserServiceServer) Validate(context.Context, *ValidateInput) (*ValidateResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method Validate not implemented") } -func (UnimplementedUserServiceServer) ChangePassword(context.Context, *ChangePasswordInput) (*User, error) { +func (UnimplementedUserServiceServer) ChangePassword(context.Context, *ChangePasswordInput) (*ChangePasswordOutput, error) { return nil, status.Errorf(codes.Unimplemented, "method ChangePassword not implemented") } -func (UnimplementedUserServiceServer) ChangeRole(context.Context, *ChangeRoleInput) (*User, error) { +func (UnimplementedUserServiceServer) ChangeRole(context.Context, *ChangeRoleInput) (*ChangeRoleOutput, error) { return nil, status.Errorf(codes.Unimplemented, "method ChangeRole not implemented") } func (UnimplementedUserServiceServer) mustEmbedUnimplementedUserServiceServer() {} @@ -220,7 +220,7 @@ func _UserService_GetUser_Handler(srv interface{}, ctx context.Context, dec func } func _UserService_UpdateUser_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(UserCreateInput) + in := new(UpdateUserInput) if err := dec(in); err != nil { return nil, err } @@ -232,13 +232,13 @@ func _UserService_UpdateUser_Handler(srv interface{}, ctx context.Context, dec f FullMethod: "/com.goodfood.user.UserService/UpdateUser", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(UserServiceServer).UpdateUser(ctx, req.(*UserCreateInput)) + return srv.(UserServiceServer).UpdateUser(ctx, req.(*UpdateUserInput)) } return interceptor(ctx, in, info, handler) } func _UserService_DeleteUser_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(UserId) + in := new(DeleteInput) if err := dec(in); err != nil { return nil, err } @@ -250,13 +250,13 @@ func _UserService_DeleteUser_Handler(srv interface{}, ctx context.Context, dec f FullMethod: "/com.goodfood.user.UserService/DeleteUser", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(UserServiceServer).DeleteUser(ctx, req.(*UserId)) + return srv.(UserServiceServer).DeleteUser(ctx, req.(*DeleteInput)) } return interceptor(ctx, in, info, handler) } func _UserService_ListUser_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(UserId) + in := new(empty.Empty) if err := dec(in); err != nil { return nil, err } @@ -268,7 +268,7 @@ func _UserService_ListUser_Handler(srv interface{}, ctx context.Context, dec fun FullMethod: "/com.goodfood.user.UserService/ListUser", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(UserServiceServer).ListUser(ctx, req.(*UserId)) + return srv.(UserServiceServer).ListUser(ctx, req.(*empty.Empty)) } return interceptor(ctx, in, info, handler) } diff --git a/services/user/src/pkg/db/db.go b/services/user/src/pkg/db/db.go index 75e10165..79a47bdc 100644 --- a/services/user/src/pkg/db/db.go +++ b/services/user/src/pkg/db/db.go @@ -18,6 +18,16 @@ func Init(url string) Handler { log.Fatalln(err) } + err = db.AutoMigrate(&models.Role{}) + if err != nil { + return Handler{} + } + + err = db.AutoMigrate(&models.MainAddress{}) + if err != nil { + return Handler{} + } + err = db.AutoMigrate(&models.User{}) if err != nil { return Handler{} diff --git a/services/user/src/pkg/mapper/userMapper.go b/services/user/src/pkg/mapper/userMapper.go index 1e9b0bfc..810c1d06 100644 --- a/services/user/src/pkg/mapper/userMapper.go +++ b/services/user/src/pkg/mapper/userMapper.go @@ -5,6 +5,14 @@ import ( pb "goodfood-user/proto" ) +func ToProtoUsers(user []*models.User) []*pb.User { + var users []*pb.User + for _, u := range user { + users = append(users, ToProtoUser(u)) + } + return users +} + func ToProtoUser(user *models.User) *pb.User { return &pb.User{ Id: user.Id, @@ -35,3 +43,34 @@ func ToProtoRole(role models.Role) *pb.Role { Code: role.Code, } } + +func ToModelUser(user *pb.User) *models.User { + return &models.User{ + Id: user.Id, + FirstName: user.FirstName, + LastName: user.LastName, + Email: user.Email, + Phone: user.Phone, + MainAddress: *ToModelMainAddress(user.MainAddress), + Role: *ToModelRole(user.Role), + } +} + +func ToModelMainAddress(address *pb.MainAddress) *models.MainAddress { + return &models.MainAddress{ + Id: address.Id, + Street: address.Street, + ZipCode: address.ZipCode, + Country: address.Country, + Lat: address.Lat, + Lng: address.Lng, + } +} + +func ToModelRole(role *pb.Role) *models.Role { + return &models.Role{ + Id: role.Id, + Label: role.Label, + Code: role.Code, + } +} diff --git a/services/user/src/pkg/models/user.go b/services/user/src/pkg/models/user.go index bd85ac2e..5d56983e 100644 --- a/services/user/src/pkg/models/user.go +++ b/services/user/src/pkg/models/user.go @@ -7,6 +7,6 @@ type User struct { Phone string `json:"phone" gorm:"type:varchar(10)"` LastName string `json:"last_name" gorm:"type:varchar(100);not null"` FirstName string `json:"first_name" gorm:"type:varchar(100);not null"` - MainAddress MainAddress `json:"main_address" gorm:"foreignKey:MainAddressId"` + MainAddress MainAddress `json:"main_address" gorm:"foreignKey:main_address_id"` Role Role `json:"role" gorm:"foreignKey:RoleId"` } diff --git a/services/user/src/pkg/services/auth.go b/services/user/src/pkg/services/auth.go index 5a87b611..ccbb67be 100644 --- a/services/user/src/pkg/services/auth.go +++ b/services/user/src/pkg/services/auth.go @@ -1,6 +1,7 @@ package services import ( + "context" "goodfood-user/pkg/db" "goodfood-user/pkg/mapper" "goodfood-user/pkg/models" @@ -9,11 +10,12 @@ import ( ) type Server struct { + pb.UnimplementedUserServiceServer H db.Handler Jwt utils.JwtWrapper } -func (s *Server) Register(req *pb.UserCreateInput) (*pb.User, error) { +func (s *Server) Register(ctx context.Context, req *pb.UserCreateInput) (*pb.User, error) { var user models.User if result := s.H.DB.Where(&models.User{Email: req.Email}).First(&user); result.Error == nil { @@ -28,7 +30,7 @@ func (s *Server) Register(req *pb.UserCreateInput) (*pb.User, error) { return mapper.ToProtoUser(&user), nil } -func (s *Server) LogIn(req *pb.LogInInput) (*pb.LogInResponse, error) { +func (s *Server) LogIn(ctx context.Context, req *pb.LogInInput) (*pb.LogInResponse, error) { var user models.User if result := s.H.DB.Where(&models.User{Email: req.Email}).First(&user); result.Error == nil { @@ -45,7 +47,7 @@ func (s *Server) LogIn(req *pb.LogInInput) (*pb.LogInResponse, error) { return &pb.LogInResponse{User: mapper.ToProtoUser(&user), Token: token}, nil } -func (s *Server) Validate(req *pb.ValidateInput) (*pb.ValidateResponse, error) { +func (s *Server) Validate(ctx context.Context, req *pb.ValidateInput) (*pb.ValidateResponse, error) { claims, err := s.Jwt.ValidateToken(req.Token) if err != nil { diff --git a/services/user/src/pkg/services/user.go b/services/user/src/pkg/services/user.go new file mode 100644 index 00000000..ab2250ae --- /dev/null +++ b/services/user/src/pkg/services/user.go @@ -0,0 +1,140 @@ +package services + +import ( + "context" + "github.com/golang/protobuf/ptypes/empty" + "goodfood-user/pkg/mapper" + "goodfood-user/pkg/models" + pb "goodfood-user/proto" +) + +func (s *Server) GetUser(ctx context.Context, req *pb.UserId) (*pb.User, error) { + var user models.User + + if result := s.H.DB.Where(&models.User{Id: req.Id}).First(&user); result.Error == nil { + return nil, result.Error + } + + return mapper.ToProtoUser(&user), nil +} + +func (s *Server) UpdateUser(ctx context.Context, req *pb.UpdateUserInput) (*pb.UpdateUserOutput, error) { + claims, err := s.Jwt.ValidateToken(req.Token) + if err != nil { + return &pb.UpdateUserOutput{ + Error: "Invalid token", + }, nil + } + + if result := s.H.DB.Where(&models.User{Id: claims.Id}); result.Error != nil { + return &pb.UpdateUserOutput{ + Error: "User not found", + }, nil + } + var user = mapper.ToModelUser(req.User) + + s.H.DB.Save(&user) + + return &pb.UpdateUserOutput{ + User: mapper.ToProtoUser(user), + }, nil +} + +func (s *Server) ListUser(ctx context.Context, _ *empty.Empty) (*pb.UserList, error) { + var users []*models.User + s.H.DB.Find(&users) + return &pb.UserList{ + Users: mapper.ToProtoUsers(users), + }, nil +} + +func (s *Server) ChangePassword(ctx context.Context, req *pb.ChangePasswordInput) (*pb.ChangePasswordOutput, error) { + claims, err := s.Jwt.ValidateToken(req.Token) + if err != nil { + return &pb.ChangePasswordOutput{ + Error: "Invalid token", + }, nil + } + + var user models.User + if result := s.H.DB.Where(&models.User{Id: claims.Id}); result.Error != nil { + return &pb.ChangePasswordOutput{ + Error: "User not found", + }, nil + } + + user.Password = req.NewPassword + + s.H.DB.Save(&user) + + return &pb.ChangePasswordOutput{ + User: mapper.ToProtoUser(&user), + }, nil +} + +func (s *Server) DeleteUser(ctx context.Context, req *pb.DeleteInput) (*pb.DeleteUserOutput, error) { + claims, err := s.Jwt.ValidateToken(req.Token) + if err != nil { + return &pb.DeleteUserOutput{ + Error: "Invalid token", + }, nil + } + + var user models.User + + if result := s.H.DB.Where(&models.User{Id: claims.Id}); result.Error != nil { + return &pb.DeleteUserOutput{ + Error: "User not found", + }, nil + } + + if user.Role.Code == "ADMIN" || user.Id == req.UserId { + + s.H.DB.Delete(&user) + + return &pb.DeleteUserOutput{ + User: mapper.ToProtoUser(&user), + }, nil + } else { + return &pb.DeleteUserOutput{ + Error: "You are not allowed to change this user role", + }, nil + } +} + +func (s *Server) ChangeRole(ctx context.Context, req *pb.ChangeRoleInput) (*pb.ChangeRoleOutput, error) { + claims, err := s.Jwt.ValidateToken(req.Token) + if err != nil { + return &pb.ChangeRoleOutput{ + Error: "Invalid token", + }, nil + } + + var user models.User + var role models.Role + + if result := s.H.DB.Where(&models.User{Id: claims.Id}); result.Error != nil { + return &pb.ChangeRoleOutput{ + Error: "User not found", + }, nil + } + + if result := s.H.DB.Where(&models.Role{Code: req.RoleCode}); result.Error != nil { + return &pb.ChangeRoleOutput{ + Error: "User not found", + }, nil + } + + if user.Role.Code == "ADMIN" || user.Id == req.UserId { + user.Role = role + s.H.DB.Save(&user) + + return &pb.ChangeRoleOutput{ + User: mapper.ToProtoUser(&user), + }, nil + } else { + return &pb.ChangeRoleOutput{ + Error: "You are not allowed to change this user role", + }, nil + } +} From 365ae4ec28f090642ab3b516a9daece121120596 Mon Sep 17 00:00:00 2001 From: Pierre Lebigre Date: Mon, 3 Jul 2023 09:02:22 +0200 Subject: [PATCH 147/883] Add all functionnality --- services/product/.dockerignore | 2 + services/product/README.md | 12 +- services/product/package-lock.json | 2901 +++++++++++++++++ services/product/package.json | 38 +- services/product/pnpm-lock.yaml | 1130 +++---- services/product/prisma/seed.ts | 74 + .../product/src/handler/Allergen/create.ts | 5 +- .../product/src/handler/Allergen/delete.ts | 5 +- services/product/src/handler/Allergen/list.ts | 8 +- services/product/src/handler/Allergen/read.ts | 9 +- .../product/src/handler/Allergen/update.ts | 9 +- .../product/src/handler/Category/create.ts | 7 +- .../product/src/handler/Category/delete.ts | 7 +- services/product/src/handler/Category/list.ts | 8 +- services/product/src/handler/Category/read.ts | 9 +- .../product/src/handler/Category/update.ts | 9 +- services/product/src/handler/Image/upload.ts | 31 + .../product/src/handler/Product/create.ts | 12 +- .../product/src/handler/Product/delete.ts | 8 +- services/product/src/handler/Product/index.ts | 4 +- services/product/src/handler/Product/list.ts | 16 +- .../product/src/handler/Product/listType.ts | 28 +- services/product/src/handler/Product/read.ts | 15 +- .../product/src/handler/Product/update.ts | 14 +- services/product/src/lib/amqp.ts | 32 + services/product/src/lib/log.ts | 12 +- services/product/src/lib/proxy.ts | 131 + services/product/src/lib/rabbitmq.ts | 11 - services/product/src/middleware/log.ts | 41 + services/product/src/server.ts | 34 +- services/product/src/types/Product.d.ts | 4 +- services/product/tsconfig.json | 1 + services/proto/product.proto | 10 +- 33 files changed, 3922 insertions(+), 715 deletions(-) create mode 100644 services/product/.dockerignore create mode 100644 services/product/package-lock.json create mode 100644 services/product/prisma/seed.ts create mode 100644 services/product/src/handler/Image/upload.ts create mode 100644 services/product/src/lib/amqp.ts create mode 100644 services/product/src/lib/proxy.ts delete mode 100644 services/product/src/lib/rabbitmq.ts create mode 100644 services/product/src/middleware/log.ts diff --git a/services/product/.dockerignore b/services/product/.dockerignore new file mode 100644 index 00000000..b7dab5e9 --- /dev/null +++ b/services/product/.dockerignore @@ -0,0 +1,2 @@ +node_modules +build \ No newline at end of file diff --git a/services/product/README.md b/services/product/README.md index ec312d2a..830b1483 100644 --- a/services/product/README.md +++ b/services/product/README.md @@ -12,14 +12,6 @@ ## gRPC Methods -rpc GetProductTypeList(google.protobuf.Empty) returns (ProductTypeList) {} - rpc GetProductList(RestaurantId) returns (ProductList) {} - - rpc CreateProduct(Product) returns (Product) {} - rpc ReadProduct(ProductId) returns (Product) {} - rpc UpdateProduct(Product) returns (Product) {} - rpc DeleteProduct(ProductId) returns (google.protobuf.Empty) {} - - Category model: - `CreateCategory`: Creates a new category in the system. @@ -40,8 +32,8 @@ rpc GetProductTypeList(google.protobuf.Empty) returns (ProductTypeList) {} - `ReadProduct`: Retrieves a product by its ID. - `UpdateProduct`: Updates an existing product. - `DeleteProduct`: Deletes a product by its ID. - - `GetProductList`: Retrieves all product persons. - - `GetProductTypeList`: Retrieves all product persons. + - `GetProductList`: Retrieves all product. + - `GetProductTypeList`: Retrieves all product type. ## Requirements diff --git a/services/product/package-lock.json b/services/product/package-lock.json new file mode 100644 index 00000000..8b3656c2 --- /dev/null +++ b/services/product/package-lock.json @@ -0,0 +1,2901 @@ +{ + "name": "@goodfood/product", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "@goodfood/product", + "hasInstallScript": true, + "dependencies": { + "@grpc/grpc-js": "^1.8.14", + "@grpc/proto-loader": "^0.7.6", + "@prisma/client": "^4.11.0", + "amqplib": "^0.10.3", + "express": "^4.18.2", + "nodemon": "^2.0.22", + "pkg": "^5.8.1", + "vite-tsconfig-paths": "^4.2.0" + }, + "bin": { + "product": "dist/index.js" + }, + "devDependencies": { + "@types/amqplib": "^0.10.1", + "@types/node": "^18.16.7", + "prisma": "^4.11.0", + "ts-node": "^10.9.1", + "tsconfig-paths": "^4.2.0", + "typescript": "^5.0.2" + } + }, + "node_modules/@acuminous/bitsyntax": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@acuminous/bitsyntax/-/bitsyntax-0.1.2.tgz", + "integrity": "sha512-29lUK80d1muEQqiUsSo+3A0yP6CdspgC95EnKBMi22Xlwt79i/En4Vr67+cXhU+cZjbti3TgGGC5wy1stIywVQ==", + "dependencies": { + "buffer-more-ints": "~1.0.0", + "debug": "^4.3.4", + "safe-buffer": "~5.1.2" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/@babel/generator": { + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.2.tgz", + "integrity": "sha512-W1lG5vUwFvfMd8HVXqdfbuG7RuaSrTCCD8cl8fP8wOivdbtbIg2Db3IWUcgvfxKbbn6ZBGYRW/Zk1MIwK49mgw==", + "dependencies": { + "@babel/types": "^7.18.2", + "@jridgewell/gen-mapping": "^0.3.0", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.21.5.tgz", + "integrity": "sha512-5pTUx3hAJaZIdW99sJ6ZUUgWq/Y+Hja7TowEnLNMm1VivRgZQL3vpBY3qUACVsvw+yQU6+YgfBVmcbLaZtrA1w==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", + "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.18.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.4.tgz", + "integrity": "sha512-FDge0dFazETFcxGw/EXzOkN8uJp0PC7Qbm+Pe9T+av2zlBpOgunFHkQPPn+eRuClU73JF+98D531UgayY89tow==", + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/types": { + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.19.0.tgz", + "integrity": "sha512-YuGopBq3ke25BVSiS6fgF49Ul9gH1x70Bcr6bqRLjWCkcX8Hre1/5+z+IiWOIerRMSSEfGZVB9z9kyq7wVs9YA==", + "dependencies": { + "@babel/helper-string-parser": "^7.18.10", + "@babel/helper-validator-identifier": "^7.18.6", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@grpc/grpc-js": { + "version": "1.8.14", + "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.8.14.tgz", + "integrity": "sha512-w84maJ6CKl5aApCMzFll0hxtFNT6or9WwMslobKaqWUEf1K+zhlL43bSQhFreyYWIWR+Z0xnVFC1KtLm4ZpM/A==", + "dependencies": { + "@grpc/proto-loader": "^0.7.0", + "@types/node": ">=12.12.47" + }, + "engines": { + "node": "^8.13.0 || >=10.10.0" + } + }, + "node_modules/@grpc/proto-loader": { + "version": "0.7.7", + "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.7.tgz", + "integrity": "sha512-1TIeXOi8TuSCQprPItwoMymZXxWT0CPxUhkrkeCUH+D8U7QDwQ6b7SUz2MaLuWM2llT+J/TVFLmQI5KtML3BhQ==", + "dependencies": { + "@types/long": "^4.0.1", + "lodash.camelcase": "^4.3.0", + "long": "^4.0.0", + "protobufjs": "^7.0.0", + "yargs": "^17.7.2" + }, + "bin": { + "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.18", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", + "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", + "dependencies": { + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" + } + }, + "node_modules/@jridgewell/trace-mapping/node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==" + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@prisma/client": { + "version": "4.14.0", + "resolved": "https://registry.npmjs.org/@prisma/client/-/client-4.14.0.tgz", + "integrity": "sha512-MK/XaA2sFdfaOa7I9MjNKz6dxeIEdeZlnpNRoF2w3JuRLlFJLkpp6cD3yaqw2nUUhbrn3Iqe3ZpVV+VuGGil7Q==", + "hasInstallScript": true, + "dependencies": { + "@prisma/engines-version": "4.14.0-67.d9a4c5988f480fa576d43970d5a23641aa77bc9c" + }, + "engines": { + "node": ">=14.17" + }, + "peerDependencies": { + "prisma": "*" + }, + "peerDependenciesMeta": { + "prisma": { + "optional": true + } + } + }, + "node_modules/@prisma/engines": { + "version": "4.14.0", + "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-4.14.0.tgz", + "integrity": "sha512-PDNlhP/1vyTgmNyiucGqGCdXIp7HIkkvKO50si3y3PcceeHvqtiKPaH1iJdz63jCWMVMbj2MElSxXPOeBvEVIQ==", + "devOptional": true, + "hasInstallScript": true + }, + "node_modules/@prisma/engines-version": { + "version": "4.14.0-67.d9a4c5988f480fa576d43970d5a23641aa77bc9c", + "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-4.14.0-67.d9a4c5988f480fa576d43970d5a23641aa77bc9c.tgz", + "integrity": "sha512-3jum8/YSudeSN0zGW5qkpz+wAN2V/NYCQ+BPjvHYDfWatLWlQkqy99toX0GysDeaUoBIJg1vaz2yKqiA3CFcQw==" + }, + "node_modules/@protobufjs/aspromise": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==" + }, + "node_modules/@protobufjs/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" + }, + "node_modules/@protobufjs/codegen": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", + "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" + }, + "node_modules/@protobufjs/eventemitter": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", + "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==" + }, + "node_modules/@protobufjs/fetch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", + "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", + "dependencies": { + "@protobufjs/aspromise": "^1.1.1", + "@protobufjs/inquire": "^1.1.0" + } + }, + "node_modules/@protobufjs/float": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", + "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==" + }, + "node_modules/@protobufjs/inquire": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", + "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==" + }, + "node_modules/@protobufjs/path": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==" + }, + "node_modules/@protobufjs/pool": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==" + }, + "node_modules/@protobufjs/utf8": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", + "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==" + }, + "node_modules/@tsconfig/node10": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", + "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", + "dev": true + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.3.tgz", + "integrity": "sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==", + "dev": true + }, + "node_modules/@types/amqplib": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/@types/amqplib/-/amqplib-0.10.1.tgz", + "integrity": "sha512-j6ANKT79ncUDnAs/+9r9eDujxbeJoTjoVu33gHHcaPfmLQaMhvfbH2GqSe8KUM444epAp1Vl3peVOQfZk3UIqA==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/long": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz", + "integrity": "sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==" + }, + "node_modules/@types/node": { + "version": "18.16.7", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.16.7.tgz", + "integrity": "sha512-MFg7ua/bRtnA1hYE3pVyWxGd/r7aMqjNOdHvlSsXV3n8iaeGKkOaPzpJh6/ovf4bEXWcojkeMJpTsq3mzXW4IQ==" + }, + "node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.8.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", + "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/amqplib": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/amqplib/-/amqplib-0.10.3.tgz", + "integrity": "sha512-UHmuSa7n8vVW/a5HGh2nFPqAEr8+cD4dEZ6u9GjP91nHfr1a54RyAKyra7Sb5NH7NBKOUlyQSMXIp0qAixKexw==", + "dependencies": { + "@acuminous/bitsyntax": "^0.1.2", + "buffer-more-ints": "~1.0.0", + "readable-stream": "1.x >=1.1.9", + "url-parse": "~1.5.10" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/bl/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/bl/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/bl/node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/body-parser": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/buffer-more-ints": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-more-ints/-/buffer-more-ints-1.0.0.tgz", + "integrity": "sha512-EMetuGFz5SLsT0QTnXzINh4Ksr+oo4i+UGTXEshiGCQWnsgSs7ZhJ8fzlwQ+OzEMs0MpDAMr1hxnblp5a4vcHg==" + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chalk/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/chalk/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-disposition/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detect-libc": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz", + "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/expand-template": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", + "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/express": { + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.1", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.5.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/express/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/fast-glob": { + "version": "3.2.12", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", + "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==", + "dependencies": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + } + }, + "node_modules/from2/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "node_modules/from2/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/from2/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" + }, + "node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", + "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/github-from-package": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", + "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==" + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globrex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz", + "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==" + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/ignore": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "engines": { + "node": ">= 4" + } + }, + "node_modules/ignore-by-default": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", + "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==" + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" + }, + "node_modules/into-stream": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/into-stream/-/into-stream-6.0.0.tgz", + "integrity": "sha512-XHbaOAvP+uFKUFsOgoNPRjLkwB+I22JFPFe5OjTkQ0nwgj6+pSjb4NmB6VMxaPshLiOf+zcpOCBQuLwC1KHhZA==", + "dependencies": { + "from2": "^2.3.0", + "p-is-promise": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz", + "integrity": "sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==", + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==" + }, + "node_modules/long": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", + "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/mkdirp-classic": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==" + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/multistream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/multistream/-/multistream-4.1.0.tgz", + "integrity": "sha512-J1XDiAmmNpRCBfIWJv+n0ymC4ABcf/Pl+5YvC5B/D2f/2+8PtHvCNxMPKiQcZyi922Hq69J2YOpb1pTywfifyw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "once": "^1.4.0", + "readable-stream": "^3.6.0" + } + }, + "node_modules/multistream/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/multistream/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/multistream/node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/napi-build-utils": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", + "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==" + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/node-abi": { + "version": "3.40.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.40.0.tgz", + "integrity": "sha512-zNy02qivjjRosswoYmPi8hIKJRr8MpQyeKT6qlcq/OnOgA3Rhoae+IYOqsM9V5+JnHWmxKnWOT2GxvtqdtOCXA==", + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/node-abi/node_modules/semver": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.0.tgz", + "integrity": "sha512-+XC0AD/R7Q2mPSRuy2Id0+CGTZ98+8f+KvwirxOKIEyid+XSx6HbC63p+O4IndTHuX5Z+JxQ0TghCkO5Cg/2HA==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/node-fetch": { + "version": "2.6.11", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.11.tgz", + "integrity": "sha512-4I6pdBY1EthSqDmJkiNk3JIT8cswwR9nfeW/cPdUagJYEQG7R95WRH74wpz7ma8Gh/9dI9FP+OU+0E4FvtA55w==", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/nodemon": { + "version": "2.0.22", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.22.tgz", + "integrity": "sha512-B8YqaKMmyuCO7BowF1Z1/mkPqLk6cs/l63Ojtd6otKjMx47Dq1utxfRxcavH1I7VSaL8n5BUaoutadnsX3AAVQ==", + "dependencies": { + "chokidar": "^3.5.2", + "debug": "^3.2.7", + "ignore-by-default": "^1.0.1", + "minimatch": "^3.1.2", + "pstree.remy": "^1.1.8", + "semver": "^5.7.1", + "simple-update-notifier": "^1.0.7", + "supports-color": "^5.5.0", + "touch": "^3.1.0", + "undefsafe": "^2.0.5" + }, + "bin": { + "nodemon": "bin/nodemon.js" + }, + "engines": { + "node": ">=8.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/nodemon" + } + }, + "node_modules/nodemon/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/nopt": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", + "integrity": "sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==", + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "*" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/p-is-promise": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-3.0.0.tgz", + "integrity": "sha512-Wo8VsW4IRQSKVXsJCn7TomUaVtyfjVDn3nUP7kE967BQk0CwFpdbZs0X0uk5sW9mkBa9eNM7hCMaG93WUAwxYQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "node_modules/path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pkg": { + "version": "5.8.1", + "resolved": "https://registry.npmjs.org/pkg/-/pkg-5.8.1.tgz", + "integrity": "sha512-CjBWtFStCfIiT4Bde9QpJy0KeH19jCfwZRJqHFDFXfhUklCx8JoFmMj3wgnEYIwGmZVNkhsStPHEOnrtrQhEXA==", + "dependencies": { + "@babel/generator": "7.18.2", + "@babel/parser": "7.18.4", + "@babel/types": "7.19.0", + "chalk": "^4.1.2", + "fs-extra": "^9.1.0", + "globby": "^11.1.0", + "into-stream": "^6.0.0", + "is-core-module": "2.9.0", + "minimist": "^1.2.6", + "multistream": "^4.1.0", + "pkg-fetch": "3.4.2", + "prebuild-install": "7.1.1", + "resolve": "^1.22.0", + "stream-meter": "^1.0.4" + }, + "bin": { + "pkg": "lib-es5/bin.js" + }, + "peerDependencies": { + "node-notifier": ">=9.0.1" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/pkg-fetch": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/pkg-fetch/-/pkg-fetch-3.4.2.tgz", + "integrity": "sha512-0+uijmzYcnhC0hStDjm/cl2VYdrmVVBpe7Q8k9YBojxmR5tG8mvR9/nooQq3QSXiQqORDVOTY3XqMEqJVIzkHA==", + "dependencies": { + "chalk": "^4.1.2", + "fs-extra": "^9.1.0", + "https-proxy-agent": "^5.0.0", + "node-fetch": "^2.6.6", + "progress": "^2.0.3", + "semver": "^7.3.5", + "tar-fs": "^2.1.1", + "yargs": "^16.2.0" + }, + "bin": { + "pkg-fetch": "lib-es5/bin.js" + } + }, + "node_modules/pkg-fetch/node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/pkg-fetch/node_modules/semver": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.0.tgz", + "integrity": "sha512-+XC0AD/R7Q2mPSRuy2Id0+CGTZ98+8f+KvwirxOKIEyid+XSx6HbC63p+O4IndTHuX5Z+JxQ0TghCkO5Cg/2HA==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/pkg-fetch/node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/pkg-fetch/node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "engines": { + "node": ">=10" + } + }, + "node_modules/prebuild-install": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.1.tgz", + "integrity": "sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==", + "dependencies": { + "detect-libc": "^2.0.0", + "expand-template": "^2.0.3", + "github-from-package": "0.0.0", + "minimist": "^1.2.3", + "mkdirp-classic": "^0.5.3", + "napi-build-utils": "^1.0.1", + "node-abi": "^3.3.0", + "pump": "^3.0.0", + "rc": "^1.2.7", + "simple-get": "^4.0.0", + "tar-fs": "^2.0.0", + "tunnel-agent": "^0.6.0" + }, + "bin": { + "prebuild-install": "bin.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/prisma": { + "version": "4.14.0", + "resolved": "https://registry.npmjs.org/prisma/-/prisma-4.14.0.tgz", + "integrity": "sha512-+5dMl1uxMQb4RepndY6AwR9xi1cDcaGFICu+ws6/Nmgt93mFPNj8tYxSfTdmfg+rkNrUId9rk/Ac2vTgLe/oXA==", + "devOptional": true, + "hasInstallScript": true, + "dependencies": { + "@prisma/engines": "4.14.0" + }, + "bin": { + "prisma": "build/index.js", + "prisma2": "build/index.js" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/protobufjs": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.2.3.tgz", + "integrity": "sha512-TtpvOqwB5Gdz/PQmOjgsrGH1nHjAQVCN7JG4A6r1sXRWESL5rNMAiRcBQlCAdKxZcAbstExQePYG8xof/JVRgg==", + "hasInstallScript": true, + "dependencies": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/node": ">=13.7.0", + "long": "^5.0.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/protobufjs/node_modules/long": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", + "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==" + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/pstree.remy": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", + "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==" + }, + "node_modules/pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==" + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, + "node_modules/readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==" + }, + "node_modules/resolve": { + "version": "1.22.2", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", + "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", + "dependencies": { + "is-core-module": "^2.11.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve/node_modules/is-core-module": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.0.tgz", + "integrity": "sha512-RECHCBCd/viahWmwj6enj19sKbHfJrddi/6cBDsNTKbNq0f7VeaUkBo60BqzvPqo/W54ChS62Z5qyun7cfOMqQ==", + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/simple-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/simple-get": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", + "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "decompress-response": "^6.0.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } + }, + "node_modules/simple-update-notifier": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-1.1.0.tgz", + "integrity": "sha512-VpsrsJSUcJEseSbMHkrsrAVSdvVS5I96Qo1QAQ4FxQ9wXFcB+pjj7FB7/us9+GcgfW4ziHtYMc1J0PLczb55mg==", + "dependencies": { + "semver": "~7.0.0" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/simple-update-notifier/node_modules/semver": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", + "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/stream-meter": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/stream-meter/-/stream-meter-1.0.4.tgz", + "integrity": "sha512-4sOEtrbgFotXwnEuzzsQBYEV1elAeFSO8rSGeTwabuX1RRn/kEq9JVH7I0MRBhKVRR0sJkr0M0QCH7yOLf9fhQ==", + "dependencies": { + "readable-stream": "^2.1.4" + } + }, + "node_modules/stream-meter/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "node_modules/stream-meter/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/stream-meter/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==" + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tar-fs": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", + "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", + "dependencies": { + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.1.4" + } + }, + "node_modules/tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "dependencies": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tar-stream/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/tar-stream/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/tar-stream/node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/touch": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", + "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", + "dependencies": { + "nopt": "~1.0.10" + }, + "bin": { + "nodetouch": "bin/nodetouch.js" + } + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, + "node_modules/ts-node": { + "version": "10.9.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", + "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", + "dev": true, + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "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 + } + } + }, + "node_modules/tsconfck": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/tsconfck/-/tsconfck-2.1.1.tgz", + "integrity": "sha512-ZPCkJBKASZBmBUNqGHmRhdhM8pJYDdOXp4nRgj/O0JwUwsMq50lCDRQP/M5GBNAA0elPrq4gAeu4dkaVCuKWww==", + "bin": { + "tsconfck": "bin/tsconfck.js" + }, + "engines": { + "node": "^14.13.1 || ^16 || >=18" + }, + "peerDependencies": { + "typescript": "^4.3.5 || ^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/tsconfig-paths": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", + "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==", + "dev": true, + "dependencies": { + "json5": "^2.2.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typescript": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.4.tgz", + "integrity": "sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==", + "devOptional": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=12.20" + } + }, + "node_modules/undefsafe": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", + "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==" + }, + "node_modules/universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/url-parse": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/vite-tsconfig-paths": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/vite-tsconfig-paths/-/vite-tsconfig-paths-4.2.0.tgz", + "integrity": "sha512-jGpus0eUy5qbbMVGiTxCL1iB9ZGN6Bd37VGLJU39kTDD6ZfULTTb1bcc5IeTWqWJKiWV5YihCaibeASPiGi8kw==", + "dependencies": { + "debug": "^4.1.1", + "globrex": "^0.1.2", + "tsconfck": "^2.1.0" + }, + "peerDependencies": { + "vite": "*" + }, + "peerDependenciesMeta": { + "vite": { + "optional": true + } + } + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "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.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "engines": { + "node": ">=12" + } + }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true, + "engines": { + "node": ">=6" + } + } + } +} diff --git a/services/product/package.json b/services/product/package.json index 7f989b44..ae5d6180 100644 --- a/services/product/package.json +++ b/services/product/package.json @@ -1,26 +1,23 @@ { - "name": "product", - "version": "1.0.0", - "description": "", - "main": "index.js", + "name": "@goodfood/product", + "bin": "dist/index.js", "scripts": { "start": "node dist/index.js", "dev": "nodemon --watch 'src/**/*.ts' --exec 'ts-node' src/server.ts", - "test": "vitest", + "build": "esbuild src/server.ts --bundle --platform=node --target=node18 --outfile=dist/index.js", + "test": "echo 'there is no test'", + "pkg": "pkg .", "prisma:generate": "prisma generate", - "postinstall": "npm run prisma:generate" + "postinstall": "npm run prisma:generate", + "seed": "ts-node prisma/seed.ts" }, - "keywords": [], - "author": "", - "license": "ISC", "devDependencies": { "@types/amqplib": "^0.10.1", - "@types/node": "^18.15.7", + "@types/node": "^18.16.7", "prisma": "^4.11.0", "ts-node": "^10.9.1", "tsconfig-paths": "^4.2.0", - "typescript": "^5.0.2", - "vitest": "^0.31.0" + "typescript": "^5.0.2" }, "dependencies": { "@grpc/grpc-js": "^1.8.14", @@ -29,7 +26,20 @@ "amqplib": "^0.10.3", "express": "^4.18.2", "nodemon": "^2.0.22", - "vite-tsconfig-paths": "^4.2.0", - "vitest-mock-extended": "^1.1.3" + "pkg": "^5.8.1", + "vite-tsconfig-paths": "^4.2.0" + }, + "pkg": { + "scripts": "./src/dist/index.js", + "assets": [ + "./prisma/**/*", + "../proto/**/*" + ], + "targets": [ + "node18-macos-arm64", + "node18-linux-x64", + "node18-linux-arm64" + ], + "outputPath": "bin/" } } diff --git a/services/product/pnpm-lock.yaml b/services/product/pnpm-lock.yaml index 6a77d328..461a91fa 100644 --- a/services/product/pnpm-lock.yaml +++ b/services/product/pnpm-lock.yaml @@ -9,13 +9,12 @@ specifiers: amqplib: ^0.10.3 express: ^4.18.2 nodemon: ^2.0.22 + pkg: ^5.8.1 prisma: ^4.11.0 ts-node: ^10.9.1 tsconfig-paths: ^4.2.0 typescript: ^5.0.2 vite-tsconfig-paths: ^4.2.0 - vitest: ^0.31.0 - vitest-mock-extended: ^1.1.3 dependencies: '@grpc/grpc-js': 1.8.14 @@ -24,8 +23,8 @@ dependencies: amqplib: 0.10.3 express: 4.18.2 nodemon: 2.0.22 + pkg: 5.8.1 vite-tsconfig-paths: 4.2.0_typescript@5.0.2 - vitest-mock-extended: 1.1.3_64trcfcrzkzux7tbs242bksig4 devDependencies: '@types/amqplib': 0.10.1 @@ -34,7 +33,6 @@ devDependencies: ts-node: 10.9.1_gkjsv6qbk4dkl5zwoikfngqpvy tsconfig-paths: 4.2.0 typescript: 5.0.2 - vitest: 0.31.0 packages: @@ -49,188 +47,48 @@ packages: - supports-color dev: false - /@cspotcode/source-map-support/0.8.1: - resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} - engines: {node: '>=12'} + /@babel/generator/7.18.2: + resolution: {integrity: sha512-W1lG5vUwFvfMd8HVXqdfbuG7RuaSrTCCD8cl8fP8wOivdbtbIg2Db3IWUcgvfxKbbn6ZBGYRW/Zk1MIwK49mgw==} + engines: {node: '>=6.9.0'} dependencies: - '@jridgewell/trace-mapping': 0.3.9 - dev: true - - /@esbuild/android-arm/0.17.18: - resolution: {integrity: sha512-EmwL+vUBZJ7mhFCs5lA4ZimpUH3WMAoqvOIYhVQwdIgSpHC8ImHdsRyhHAVxpDYUSm0lWvd63z0XH1IlImS2Qw==} - engines: {node: '>=12'} - cpu: [arm] - os: [android] - requiresBuild: true - optional: true - - /@esbuild/android-arm64/0.17.18: - resolution: {integrity: sha512-/iq0aK0eeHgSC3z55ucMAHO05OIqmQehiGay8eP5l/5l+iEr4EIbh4/MI8xD9qRFjqzgkc0JkX0LculNC9mXBw==} - engines: {node: '>=12'} - cpu: [arm64] - os: [android] - requiresBuild: true - optional: true - - /@esbuild/android-x64/0.17.18: - resolution: {integrity: sha512-x+0efYNBF3NPW2Xc5bFOSFW7tTXdAcpfEg2nXmxegm4mJuVeS+i109m/7HMiOQ6M12aVGGFlqJX3RhNdYM2lWg==} - engines: {node: '>=12'} - cpu: [x64] - os: [android] - requiresBuild: true - optional: true - - /@esbuild/darwin-arm64/0.17.18: - resolution: {integrity: sha512-6tY+djEAdF48M1ONWnQb1C+6LiXrKjmqjzPNPWXhu/GzOHTHX2nh8Mo2ZAmBFg0kIodHhciEgUBtcYCAIjGbjQ==} - engines: {node: '>=12'} - cpu: [arm64] - os: [darwin] - requiresBuild: true - optional: true - - /@esbuild/darwin-x64/0.17.18: - resolution: {integrity: sha512-Qq84ykvLvya3dO49wVC9FFCNUfSrQJLbxhoQk/TE1r6MjHo3sFF2tlJCwMjhkBVq3/ahUisj7+EpRSz0/+8+9A==} - engines: {node: '>=12'} - cpu: [x64] - os: [darwin] - requiresBuild: true - optional: true - - /@esbuild/freebsd-arm64/0.17.18: - resolution: {integrity: sha512-fw/ZfxfAzuHfaQeMDhbzxp9mc+mHn1Y94VDHFHjGvt2Uxl10mT4CDavHm+/L9KG441t1QdABqkVYwakMUeyLRA==} - engines: {node: '>=12'} - cpu: [arm64] - os: [freebsd] - requiresBuild: true - optional: true - - /@esbuild/freebsd-x64/0.17.18: - resolution: {integrity: sha512-FQFbRtTaEi8ZBi/A6kxOC0V0E9B/97vPdYjY9NdawyLd4Qk5VD5g2pbWN2VR1c0xhzcJm74HWpObPszWC+qTew==} - engines: {node: '>=12'} - cpu: [x64] - os: [freebsd] - requiresBuild: true - optional: true - - /@esbuild/linux-arm/0.17.18: - resolution: {integrity: sha512-jW+UCM40LzHcouIaqv3e/oRs0JM76JfhHjCavPxMUti7VAPh8CaGSlS7cmyrdpzSk7A+8f0hiedHqr/LMnfijg==} - engines: {node: '>=12'} - cpu: [arm] - os: [linux] - requiresBuild: true - optional: true - - /@esbuild/linux-arm64/0.17.18: - resolution: {integrity: sha512-R7pZvQZFOY2sxUG8P6A21eq6q+eBv7JPQYIybHVf1XkQYC+lT7nDBdC7wWKTrbvMXKRaGudp/dzZCwL/863mZQ==} - engines: {node: '>=12'} - cpu: [arm64] - os: [linux] - requiresBuild: true - optional: true - - /@esbuild/linux-ia32/0.17.18: - resolution: {integrity: sha512-ygIMc3I7wxgXIxk6j3V00VlABIjq260i967Cp9BNAk5pOOpIXmd1RFQJQX9Io7KRsthDrQYrtcx7QCof4o3ZoQ==} - engines: {node: '>=12'} - cpu: [ia32] - os: [linux] - requiresBuild: true - optional: true - - /@esbuild/linux-loong64/0.17.18: - resolution: {integrity: sha512-bvPG+MyFs5ZlwYclCG1D744oHk1Pv7j8psF5TfYx7otCVmcJsEXgFEhQkbhNW8otDHL1a2KDINW20cfCgnzgMQ==} - engines: {node: '>=12'} - cpu: [loong64] - os: [linux] - requiresBuild: true - optional: true - - /@esbuild/linux-mips64el/0.17.18: - resolution: {integrity: sha512-oVqckATOAGuiUOa6wr8TXaVPSa+6IwVJrGidmNZS1cZVx0HqkTMkqFGD2HIx9H1RvOwFeWYdaYbdY6B89KUMxA==} - engines: {node: '>=12'} - cpu: [mips64el] - os: [linux] - requiresBuild: true - optional: true - - /@esbuild/linux-ppc64/0.17.18: - resolution: {integrity: sha512-3dLlQO+b/LnQNxgH4l9rqa2/IwRJVN9u/bK63FhOPB4xqiRqlQAU0qDU3JJuf0BmaH0yytTBdoSBHrb2jqc5qQ==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [linux] - requiresBuild: true - optional: true - - /@esbuild/linux-riscv64/0.17.18: - resolution: {integrity: sha512-/x7leOyDPjZV3TcsdfrSI107zItVnsX1q2nho7hbbQoKnmoeUWjs+08rKKt4AUXju7+3aRZSsKrJtaRmsdL1xA==} - engines: {node: '>=12'} - cpu: [riscv64] - os: [linux] - requiresBuild: true - optional: true - - /@esbuild/linux-s390x/0.17.18: - resolution: {integrity: sha512-cX0I8Q9xQkL/6F5zWdYmVf5JSQt+ZfZD2bJudZrWD+4mnUvoZ3TDDXtDX2mUaq6upMFv9FlfIh4Gfun0tbGzuw==} - engines: {node: '>=12'} - cpu: [s390x] - os: [linux] - requiresBuild: true - optional: true - - /@esbuild/linux-x64/0.17.18: - resolution: {integrity: sha512-66RmRsPlYy4jFl0vG80GcNRdirx4nVWAzJmXkevgphP1qf4dsLQCpSKGM3DUQCojwU1hnepI63gNZdrr02wHUA==} - engines: {node: '>=12'} - cpu: [x64] - os: [linux] - requiresBuild: true - optional: true - - /@esbuild/netbsd-x64/0.17.18: - resolution: {integrity: sha512-95IRY7mI2yrkLlTLb1gpDxdC5WLC5mZDi+kA9dmM5XAGxCME0F8i4bYH4jZreaJ6lIZ0B8hTrweqG1fUyW7jbg==} - engines: {node: '>=12'} - cpu: [x64] - os: [netbsd] - requiresBuild: true - optional: true + '@babel/types': 7.19.0 + '@jridgewell/gen-mapping': 0.3.3 + jsesc: 2.5.2 + dev: false - /@esbuild/openbsd-x64/0.17.18: - resolution: {integrity: sha512-WevVOgcng+8hSZ4Q3BKL3n1xTv5H6Nb53cBrtzzEjDbbnOmucEVcZeGCsCOi9bAOcDYEeBZbD2SJNBxlfP3qiA==} - engines: {node: '>=12'} - cpu: [x64] - os: [openbsd] - requiresBuild: true - optional: true + /@babel/helper-string-parser/7.21.5: + resolution: {integrity: sha512-5pTUx3hAJaZIdW99sJ6ZUUgWq/Y+Hja7TowEnLNMm1VivRgZQL3vpBY3qUACVsvw+yQU6+YgfBVmcbLaZtrA1w==} + engines: {node: '>=6.9.0'} + dev: false - /@esbuild/sunos-x64/0.17.18: - resolution: {integrity: sha512-Rzf4QfQagnwhQXVBS3BYUlxmEbcV7MY+BH5vfDZekU5eYpcffHSyjU8T0xucKVuOcdCsMo+Ur5wmgQJH2GfNrg==} - engines: {node: '>=12'} - cpu: [x64] - os: [sunos] - requiresBuild: true - optional: true + /@babel/helper-validator-identifier/7.19.1: + resolution: {integrity: sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==} + engines: {node: '>=6.9.0'} + dev: false - /@esbuild/win32-arm64/0.17.18: - resolution: {integrity: sha512-Kb3Ko/KKaWhjeAm2YoT/cNZaHaD1Yk/pa3FTsmqo9uFh1D1Rfco7BBLIPdDOozrObj2sahslFuAQGvWbgWldAg==} - engines: {node: '>=12'} - cpu: [arm64] - os: [win32] - requiresBuild: true - optional: true + /@babel/parser/7.18.4: + resolution: {integrity: sha512-FDge0dFazETFcxGw/EXzOkN8uJp0PC7Qbm+Pe9T+av2zlBpOgunFHkQPPn+eRuClU73JF+98D531UgayY89tow==} + engines: {node: '>=6.0.0'} + hasBin: true + dependencies: + '@babel/types': 7.19.0 + dev: false - /@esbuild/win32-ia32/0.17.18: - resolution: {integrity: sha512-0/xUMIdkVHwkvxfbd5+lfG7mHOf2FRrxNbPiKWg9C4fFrB8H0guClmaM3BFiRUYrznVoyxTIyC/Ou2B7QQSwmw==} - engines: {node: '>=12'} - cpu: [ia32] - os: [win32] - requiresBuild: true - optional: true + /@babel/types/7.19.0: + resolution: {integrity: sha512-YuGopBq3ke25BVSiS6fgF49Ul9gH1x70Bcr6bqRLjWCkcX8Hre1/5+z+IiWOIerRMSSEfGZVB9z9kyq7wVs9YA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-string-parser': 7.21.5 + '@babel/helper-validator-identifier': 7.19.1 + to-fast-properties: 2.0.0 + dev: false - /@esbuild/win32-x64/0.17.18: - resolution: {integrity: sha512-qU25Ma1I3NqTSHJUOKi9sAH1/Mzuvlke0ioMJRthLXKm7JiSKVwFghlGbDLOO2sARECGhja4xYfRAZNPAkooYg==} + /@cspotcode/source-map-support/0.8.1: + resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} engines: {node: '>=12'} - cpu: [x64] - os: [win32] - requiresBuild: true - optional: true + dependencies: + '@jridgewell/trace-mapping': 0.3.9 + dev: true /@grpc/grpc-js/1.8.14: resolution: {integrity: sha512-w84maJ6CKl5aApCMzFll0hxtFNT6or9WwMslobKaqWUEf1K+zhlL43bSQhFreyYWIWR+Z0xnVFC1KtLm4ZpM/A==} @@ -252,10 +110,23 @@ packages: yargs: 16.2.0 dev: false + /@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.14 + '@jridgewell/trace-mapping': 0.3.9 + dev: false + /@jridgewell/resolve-uri/3.1.0: resolution: {integrity: sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==} engines: {node: '>=6.0.0'} - dev: true + + /@jridgewell/set-array/1.1.2: + resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} + engines: {node: '>=6.0.0'} + dev: false /@jridgewell/sourcemap-codec/1.4.14: resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==} @@ -265,7 +136,27 @@ packages: dependencies: '@jridgewell/resolve-uri': 3.1.0 '@jridgewell/sourcemap-codec': 1.4.14 - dev: true + + /@nodelib/fs.scandir/2.1.5: + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + 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 /@prisma/client/4.11.0_prisma@4.11.0: resolution: {integrity: sha512-0INHYkQIqgAjrt7NzhYpeDQi8x3Nvylc2uDngKyFDDj1tTRQ4uV1HnVmd1sQEraeVAN63SOK0dgCKQHlvjL0KA==} @@ -354,14 +245,6 @@ packages: '@types/node': 18.15.7 dev: true - /@types/chai-subset/1.3.3: - resolution: {integrity: sha512-frBecisrNGz+F4T6bcc+NLeolfiojh5FxW2klu669+8BARtyQv2C/GkNW6FUodVe4BroGMP/wER/YDGc7rEllw==} - dependencies: - '@types/chai': 4.3.5 - - /@types/chai/4.3.5: - resolution: {integrity: sha512-mEo1sAde+UCE6b2hxn332f1g1E8WfYRu6p5SvTKr2ZKC1f7gFJXk4h5PyGP9Dt6gCaG8y8XhwnXWC6Iy2cmBng==} - /@types/long/4.0.2: resolution: {integrity: sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==} dev: false @@ -369,40 +252,6 @@ packages: /@types/node/18.15.7: resolution: {integrity: sha512-LFmUbFunqmBn26wJZgZPYZPrDR1RwGOu2v79Mgcka1ndO6V0/cwjivPTc4yoK6n9kmw4/ls1r8cLrvh2iMibFA==} - /@vitest/expect/0.31.0: - resolution: {integrity: sha512-Jlm8ZTyp6vMY9iz9Ny9a0BHnCG4fqBa8neCF6Pk/c/6vkUk49Ls6UBlgGAU82QnzzoaUs9E/mUhq/eq9uMOv/g==} - dependencies: - '@vitest/spy': 0.31.0 - '@vitest/utils': 0.31.0 - chai: 4.3.7 - - /@vitest/runner/0.31.0: - resolution: {integrity: sha512-H1OE+Ly7JFeBwnpHTrKyCNm/oZgr+16N4qIlzzqSG/YRQDATBYmJb/KUn3GrZaiQQyL7GwpNHVZxSQd6juLCgw==} - dependencies: - '@vitest/utils': 0.31.0 - concordance: 5.0.4 - p-limit: 4.0.0 - pathe: 1.1.0 - - /@vitest/snapshot/0.31.0: - resolution: {integrity: sha512-5dTXhbHnyUMTMOujZPB0wjFjQ6q5x9c8TvAsSPUNKjp1tVU7i9pbqcKPqntyu2oXtmVxKbuHCqrOd+Ft60r4tg==} - dependencies: - magic-string: 0.30.0 - pathe: 1.1.0 - pretty-format: 27.5.1 - - /@vitest/spy/0.31.0: - resolution: {integrity: sha512-IzCEQ85RN26GqjQNkYahgVLLkULOxOm5H/t364LG0JYb3Apg0PsYCHLBYGA006+SVRMWhQvHlBBCyuByAMFmkg==} - dependencies: - tinyspy: 2.1.0 - - /@vitest/utils/0.31.0: - resolution: {integrity: sha512-kahaRyLX7GS1urekRXN2752X4gIgOGVX4Wo8eDUGUkTWlGpXzf5ZS6N9RUUS+Re3XEE8nVGqNyxkSxF5HXlGhQ==} - dependencies: - concordance: 5.0.4 - loupe: 2.3.6 - pretty-format: 27.5.1 - /abbrev/1.1.1: resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} dev: false @@ -418,11 +267,22 @@ packages: /acorn-walk/8.2.0: resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} engines: {node: '>=0.4.0'} + dev: true /acorn/8.8.2: resolution: {integrity: sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==} engines: {node: '>=0.4.0'} hasBin: true + dev: true + + /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 + dev: false /amqplib/0.10.3: resolution: {integrity: sha512-UHmuSa7n8vVW/a5HGh2nFPqAEr8+cD4dEZ6u9GjP91nHfr1a54RyAKyra7Sb5NH7NBKOUlyQSMXIp0qAixKexw==} @@ -439,6 +299,7 @@ packages: /ansi-regex/5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} + dev: false /ansi-styles/4.3.0: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} @@ -447,10 +308,6 @@ packages: color-convert: 2.0.1 dev: false - /ansi-styles/5.2.0: - resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} - engines: {node: '>=10'} - /anymatch/3.1.3: resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} engines: {node: '>= 8'} @@ -467,20 +324,36 @@ packages: resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} dev: false - /assertion-error/1.1.0: - resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} + /array-union/2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + dev: false + + /at-least-node/1.0.0: + resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} + engines: {node: '>= 4.0.0'} + dev: false /balanced-match/1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} dev: false + /base64-js/1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + dev: false + /binary-extensions/2.2.0: resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} engines: {node: '>=8'} dev: false - /blueimp-md5/2.19.0: - resolution: {integrity: sha512-DRQrD6gJyy8FbiE4s+bDoXS9hiW3Vbx5uCdwvcCf3zLHL+Iv7LtGHLpr+GZV8rHG8tK766FGYBwRbu8pELTt+w==} + /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 /body-parser/1.20.1: resolution: {integrity: sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==} @@ -520,15 +393,18 @@ packages: resolution: {integrity: sha512-EMetuGFz5SLsT0QTnXzINh4Ksr+oo4i+UGTXEshiGCQWnsgSs7ZhJ8fzlwQ+OzEMs0MpDAMr1hxnblp5a4vcHg==} dev: false + /buffer/5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + dev: false + /bytes/3.1.2: resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} engines: {node: '>= 0.8'} dev: false - /cac/6.7.14: - resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} - engines: {node: '>=8'} - /call-bind/1.0.2: resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==} dependencies: @@ -536,20 +412,13 @@ packages: get-intrinsic: 1.2.0 dev: false - /chai/4.3.7: - resolution: {integrity: sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==} - engines: {node: '>=4'} + /chalk/4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} dependencies: - assertion-error: 1.1.0 - check-error: 1.0.2 - deep-eql: 4.1.3 - get-func-name: 2.0.0 - loupe: 2.3.6 - pathval: 1.1.1 - type-detect: 4.0.8 - - /check-error/1.0.2: - resolution: {integrity: sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==} + ansi-styles: 4.3.0 + supports-color: 7.2.0 + dev: false /chokidar/3.5.3: resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} @@ -566,6 +435,10 @@ packages: fsevents: 2.3.2 dev: false + /chownr/1.1.4: + resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} + dev: false + /cliui/7.0.4: resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} dependencies: @@ -589,19 +462,6 @@ packages: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} dev: false - /concordance/5.0.4: - resolution: {integrity: sha512-OAcsnTEYu1ARJqWVGwf4zh4JDfHZEaSNlNccFmt8YjB2l/n19/PF2viLINHc57vO4FKIAFl2FWASIGZZWZ2Kxw==} - engines: {node: '>=10.18.0 <11 || >=12.14.0 <13 || >=14'} - dependencies: - date-time: 3.1.0 - esutils: 2.0.3 - fast-diff: 1.2.0 - js-string-escape: 1.0.1 - lodash: 4.17.21 - md5-hex: 3.0.1 - semver: 7.5.0 - well-known-symbols: 2.0.0 - /content-disposition/0.5.4: resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} engines: {node: '>= 0.6'} @@ -631,12 +491,6 @@ packages: resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} dev: true - /date-time/3.1.0: - resolution: {integrity: sha512-uqCUKXE5q1PNBXjPqvwhwJf9SwMoAHBgWJ6DcrnS5o+W2JOiIILl0JEdVD8SGujrNS02GGxgwAg2PN2zONgtjg==} - engines: {node: '>=6'} - dependencies: - time-zone: 1.0.0 - /debug/2.6.9: resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} peerDependencies: @@ -670,12 +524,19 @@ packages: optional: true dependencies: ms: 2.1.2 + dev: false - /deep-eql/4.1.3: - resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==} - engines: {node: '>=6'} + /decompress-response/6.0.0: + resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} + engines: {node: '>=10'} dependencies: - type-detect: 4.0.8 + mimic-response: 3.1.0 + dev: false + + /deep-extend/0.6.0: + resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} + engines: {node: '>=4.0.0'} + dev: false /depd/2.0.0: resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} @@ -687,11 +548,23 @@ packages: engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} dev: false + /detect-libc/2.0.1: + resolution: {integrity: sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==} + engines: {node: '>=8'} + dev: false + /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 + dev: false + /ee-first/1.1.1: resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} dev: false @@ -705,34 +578,11 @@ packages: engines: {node: '>= 0.8'} dev: false - /esbuild/0.17.18: - resolution: {integrity: sha512-z1lix43jBs6UKjcZVKOw2xx69ffE2aG0PygLL5qJ9OS/gy0Ewd1gW/PUQIOIQGXBHWNywSc0floSKoMFF8aK2w==} - engines: {node: '>=12'} - hasBin: true - requiresBuild: true - optionalDependencies: - '@esbuild/android-arm': 0.17.18 - '@esbuild/android-arm64': 0.17.18 - '@esbuild/android-x64': 0.17.18 - '@esbuild/darwin-arm64': 0.17.18 - '@esbuild/darwin-x64': 0.17.18 - '@esbuild/freebsd-arm64': 0.17.18 - '@esbuild/freebsd-x64': 0.17.18 - '@esbuild/linux-arm': 0.17.18 - '@esbuild/linux-arm64': 0.17.18 - '@esbuild/linux-ia32': 0.17.18 - '@esbuild/linux-loong64': 0.17.18 - '@esbuild/linux-mips64el': 0.17.18 - '@esbuild/linux-ppc64': 0.17.18 - '@esbuild/linux-riscv64': 0.17.18 - '@esbuild/linux-s390x': 0.17.18 - '@esbuild/linux-x64': 0.17.18 - '@esbuild/netbsd-x64': 0.17.18 - '@esbuild/openbsd-x64': 0.17.18 - '@esbuild/sunos-x64': 0.17.18 - '@esbuild/win32-arm64': 0.17.18 - '@esbuild/win32-ia32': 0.17.18 - '@esbuild/win32-x64': 0.17.18 + /end-of-stream/1.4.4: + resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + dependencies: + once: 1.4.0 + dev: false /escalade/3.1.1: resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} @@ -743,15 +593,16 @@ packages: resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} dev: false - /esutils/2.0.3: - resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} - engines: {node: '>=0.10.0'} - /etag/1.8.1: resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} engines: {node: '>= 0.6'} dev: false + /expand-template/2.0.3: + resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} + engines: {node: '>=6'} + dev: false + /express/4.18.2: resolution: {integrity: sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==} engines: {node: '>= 0.10.0'} @@ -791,8 +642,22 @@ packages: - supports-color dev: false - /fast-diff/1.2.0: - resolution: {integrity: sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==} + /fast-glob/3.2.12: + resolution: {integrity: sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==} + 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==} @@ -826,11 +691,33 @@ packages: engines: {node: '>= 0.6'} dev: false + /from2/2.3.0: + resolution: {integrity: sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==} + dependencies: + inherits: 2.0.4 + readable-stream: 2.3.8 + dev: false + + /fs-constants/1.0.0: + resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} + dev: false + + /fs-extra/9.1.0: + resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==} + engines: {node: '>=10'} + dependencies: + at-least-node: 1.0.0 + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.0 + dev: false + /fsevents/2.3.2: resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} os: [darwin] requiresBuild: true + dev: false optional: true /function-bind/1.1.1: @@ -842,9 +729,6 @@ packages: engines: {node: 6.* || 8.* || >= 10.*} dev: false - /get-func-name/2.0.0: - resolution: {integrity: sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==} - /get-intrinsic/1.2.0: resolution: {integrity: sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==} dependencies: @@ -853,6 +737,10 @@ packages: has-symbols: 1.0.3 dev: false + /github-from-package/0.0.0: + resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==} + dev: false + /glob-parent/5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} @@ -860,15 +748,36 @@ packages: is-glob: 4.0.3 dev: false + /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.2.12 + ignore: 5.2.4 + merge2: 1.4.1 + slash: 3.0.0 + dev: false + /globrex/0.1.2: resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} dev: false + /graceful-fs/4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + dev: false + /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==} + engines: {node: '>=8'} + dev: false + /has-symbols/1.0.3: resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} engines: {node: '>= 0.4'} @@ -892,6 +801,16 @@ packages: toidentifier: 1.0.1 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 + dev: false + /iconv-lite/0.4.24: resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} engines: {node: '>=0.10.0'} @@ -899,14 +818,35 @@ packages: safer-buffer: 2.1.2 dev: false + /ieee754/1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + dev: false + /ignore-by-default/1.0.1: resolution: {integrity: sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==} dev: false + /ignore/5.2.4: + resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} + engines: {node: '>= 4'} + dev: false + /inherits/2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} dev: false + /ini/1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + dev: false + + /into-stream/6.0.0: + resolution: {integrity: sha512-XHbaOAvP+uFKUFsOgoNPRjLkwB+I22JFPFe5OjTkQ0nwgj6+pSjb4NmB6VMxaPshLiOf+zcpOCBQuLwC1KHhZA==} + engines: {node: '>=10'} + dependencies: + from2: 2.3.0 + p-is-promise: 3.0.0 + dev: false + /ipaddr.js/1.9.1: resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} engines: {node: '>= 0.10'} @@ -919,6 +859,18 @@ packages: binary-extensions: 2.2.0 dev: false + /is-core-module/2.12.0: + resolution: {integrity: sha512-RECHCBCd/viahWmwj6enj19sKbHfJrddi/6cBDsNTKbNq0f7VeaUkBo60BqzvPqo/W54ChS62Z5qyun7cfOMqQ==} + dependencies: + has: 1.0.3 + dev: false + + /is-core-module/2.9.0: + resolution: {integrity: sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==} + dependencies: + has: 1.0.3 + dev: false + /is-extglob/2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} @@ -945,9 +897,15 @@ packages: resolution: {integrity: sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==} dev: false - /js-string-escape/1.0.1: - resolution: {integrity: sha512-Smw4xcfIQ5LVjAOuJCvN/zIodzA/BBSsluuoSykP+lUvScIi4U6RJLfwHet5cxFnCswUjISV8oAXaqaJDY3chg==} - engines: {node: '>= 0.8'} + /isarray/1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + dev: false + + /jsesc/2.5.2: + resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} + engines: {node: '>=4'} + hasBin: true + dev: false /json5/2.2.3: resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} @@ -955,20 +913,18 @@ packages: hasBin: true dev: true - /jsonc-parser/3.2.0: - resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} - - /local-pkg/0.4.3: - resolution: {integrity: sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==} - engines: {node: '>=14'} + /jsonfile/6.1.0: + resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + dependencies: + universalify: 2.0.0 + optionalDependencies: + graceful-fs: 4.2.11 + dev: false /lodash.camelcase/4.3.0: resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} dev: false - /lodash/4.17.21: - resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} - /long/4.0.0: resolution: {integrity: sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==} dev: false @@ -977,33 +933,17 @@ packages: resolution: {integrity: sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==} dev: false - /loupe/2.3.6: - resolution: {integrity: sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==} - dependencies: - get-func-name: 2.0.0 - /lru-cache/6.0.0: resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} engines: {node: '>=10'} dependencies: yallist: 4.0.0 - - /magic-string/0.30.0: - resolution: {integrity: sha512-LA+31JYDJLs82r2ScLrlz1GjSgu66ZV518eyWT+S8VhyQn/JL0u9MeBOvQMGYiPk1DBiSN9DDMOcXvigJZaViQ==} - engines: {node: '>=12'} - dependencies: - '@jridgewell/sourcemap-codec': 1.4.14 + dev: false /make-error/1.3.6: resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} dev: true - /md5-hex/3.0.1: - resolution: {integrity: sha512-BUiRtTtV39LIJwinWBjqVsU9xhdnz7/i889V859IBFpuqGAj6LuOvHv5XLbgZ2R7ptJoJaEcxkv88/h25T7Ciw==} - engines: {node: '>=8'} - dependencies: - blueimp-md5: 2.19.0 - /media-typer/0.3.0: resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} engines: {node: '>= 0.6'} @@ -1013,11 +953,24 @@ packages: resolution: {integrity: sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==} dev: false + /merge2/1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + dev: false + /methods/1.1.2: resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} engines: {node: '>= 0.6'} 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 + /mime-db/1.52.0: resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} engines: {node: '>= 0.6'} @@ -1036,6 +989,11 @@ packages: hasBin: true 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: @@ -1044,15 +1002,10 @@ packages: /minimist/1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - dev: true - /mlly/1.2.0: - resolution: {integrity: sha512-+c7A3CV0KGdKcylsI6khWyts/CYrGTrRVo4R/I7u/cUsy0Conxa6LUhiEzVKIw14lc2L5aiO4+SeVe4TeGRKww==} - dependencies: - acorn: 8.8.2 - pathe: 1.1.0 - pkg-types: 1.0.3 - ufo: 1.1.2 + /mkdirp-classic/0.5.3: + resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} + dev: false /ms/2.0.0: resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} @@ -1060,21 +1013,47 @@ packages: /ms/2.1.2: resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + dev: false /ms/2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} dev: false - /nanoid/3.3.6: - resolution: {integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true + /multistream/4.1.0: + resolution: {integrity: sha512-J1XDiAmmNpRCBfIWJv+n0ymC4ABcf/Pl+5YvC5B/D2f/2+8PtHvCNxMPKiQcZyi922Hq69J2YOpb1pTywfifyw==} + dependencies: + once: 1.4.0 + readable-stream: 3.6.2 + dev: false + + /napi-build-utils/1.0.2: + resolution: {integrity: sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==} + dev: false /negotiator/0.6.3: resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} engines: {node: '>= 0.6'} dev: false + /node-abi/3.40.0: + resolution: {integrity: sha512-zNy02qivjjRosswoYmPi8hIKJRr8MpQyeKT6qlcq/OnOgA3Rhoae+IYOqsM9V5+JnHWmxKnWOT2GxvtqdtOCXA==} + engines: {node: '>=10'} + dependencies: + semver: 7.5.0 + dev: false + + /node-fetch/2.6.11: + resolution: {integrity: sha512-4I6pdBY1EthSqDmJkiNk3JIT8cswwR9nfeW/cPdUagJYEQG7R95WRH74wpz7ma8Gh/9dI9FP+OU+0E4FvtA55w==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + dependencies: + whatwg-url: 5.0.0 + dev: false + /nodemon/2.0.22: resolution: {integrity: sha512-B8YqaKMmyuCO7BowF1Z1/mkPqLk6cs/l63Ojtd6otKjMx47Dq1utxfRxcavH1I7VSaL8n5BUaoutadnsX3AAVQ==} engines: {node: '>=8.10.0'} @@ -1115,57 +1094,103 @@ packages: ee-first: 1.1.1 dev: false - /p-limit/4.0.0: - resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + /once/1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} dependencies: - yocto-queue: 1.0.0 + wrappy: 1.0.2 + dev: false + + /p-is-promise/3.0.0: + resolution: {integrity: sha512-Wo8VsW4IRQSKVXsJCn7TomUaVtyfjVDn3nUP7kE967BQk0CwFpdbZs0X0uk5sW9mkBa9eNM7hCMaG93WUAwxYQ==} + engines: {node: '>=8'} + dev: false /parseurl/1.3.3: resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} engines: {node: '>= 0.8'} dev: false + /path-parse/1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + dev: false + /path-to-regexp/0.1.7: resolution: {integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==} dev: false - /pathe/1.1.0: - resolution: {integrity: sha512-ODbEPR0KKHqECXW1GoxdDb+AZvULmXjVPy4rt+pGo2+TnjJTIPJQSVS6N63n8T2Ip+syHhbn52OewKicV0373w==} - - /pathval/1.1.1: - resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} - - /picocolors/1.0.0: - resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + /path-type/4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + dev: false /picomatch/2.3.1: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} dev: false - /pkg-types/1.0.3: - resolution: {integrity: sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==} + /pkg-fetch/3.4.2: + resolution: {integrity: sha512-0+uijmzYcnhC0hStDjm/cl2VYdrmVVBpe7Q8k9YBojxmR5tG8mvR9/nooQq3QSXiQqORDVOTY3XqMEqJVIzkHA==} + hasBin: true dependencies: - jsonc-parser: 3.2.0 - mlly: 1.2.0 - pathe: 1.1.0 + chalk: 4.1.2 + fs-extra: 9.1.0 + https-proxy-agent: 5.0.1 + node-fetch: 2.6.11 + progress: 2.0.3 + semver: 7.5.0 + tar-fs: 2.1.1 + yargs: 16.2.0 + transitivePeerDependencies: + - encoding + - supports-color + dev: false - /postcss/8.4.23: - resolution: {integrity: sha512-bQ3qMcpF6A/YjR55xtoTr0jGOlnPOKAIMdOWiv0EIT6HVPEaJiJB4NLljSbiHoC2RX7DN5Uvjtpbg1NPdwv1oA==} - engines: {node: ^10 || ^12 || >=14} + /pkg/5.8.1: + resolution: {integrity: sha512-CjBWtFStCfIiT4Bde9QpJy0KeH19jCfwZRJqHFDFXfhUklCx8JoFmMj3wgnEYIwGmZVNkhsStPHEOnrtrQhEXA==} + hasBin: true + peerDependencies: + node-notifier: '>=9.0.1' + peerDependenciesMeta: + node-notifier: + optional: true dependencies: - nanoid: 3.3.6 - picocolors: 1.0.0 - source-map-js: 1.0.2 + '@babel/generator': 7.18.2 + '@babel/parser': 7.18.4 + '@babel/types': 7.19.0 + chalk: 4.1.2 + fs-extra: 9.1.0 + globby: 11.1.0 + into-stream: 6.0.0 + is-core-module: 2.9.0 + minimist: 1.2.8 + multistream: 4.1.0 + pkg-fetch: 3.4.2 + prebuild-install: 7.1.1 + resolve: 1.22.2 + stream-meter: 1.0.4 + transitivePeerDependencies: + - encoding + - supports-color + dev: false - /pretty-format/27.5.1: - resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + /prebuild-install/7.1.1: + resolution: {integrity: sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==} + engines: {node: '>=10'} + hasBin: true dependencies: - ansi-regex: 5.0.1 - ansi-styles: 5.2.0 - react-is: 17.0.2 + detect-libc: 2.0.1 + expand-template: 2.0.3 + github-from-package: 0.0.0 + minimist: 1.2.8 + mkdirp-classic: 0.5.3 + napi-build-utils: 1.0.2 + node-abi: 3.40.0 + pump: 3.0.0 + rc: 1.2.8 + simple-get: 4.0.1 + tar-fs: 2.1.1 + tunnel-agent: 0.6.0 + dev: false /prisma/4.11.0: resolution: {integrity: sha512-4zZmBXssPUEiX+GeL0MUq/Yyie4ltiKmGu7jCJFnYMamNrrulTBc+D+QwAQSJ01tyzeGHlD13kOnqPwRipnlNw==} @@ -1175,6 +1200,15 @@ packages: dependencies: '@prisma/engines': 4.11.0 + /process-nextick-args/2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + dev: false + + /progress/2.0.3: + resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} + engines: {node: '>=0.4.0'} + dev: false + /protobufjs/7.2.3: resolution: {integrity: sha512-TtpvOqwB5Gdz/PQmOjgsrGH1nHjAQVCN7JG4A6r1sXRWESL5rNMAiRcBQlCAdKxZcAbstExQePYG8xof/JVRgg==} engines: {node: '>=12.0.0'} @@ -1206,6 +1240,13 @@ packages: resolution: {integrity: sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==} 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 + /qs/6.11.0: resolution: {integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==} engines: {node: '>=0.6'} @@ -1217,6 +1258,10 @@ packages: resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} dev: false + /queue-microtask/1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + dev: false + /range-parser/1.2.1: resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} engines: {node: '>= 0.6'} @@ -1232,8 +1277,15 @@ packages: unpipe: 1.0.0 dev: false - /react-is/17.0.2: - resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} + /rc/1.2.8: + resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} + hasBin: true + dependencies: + deep-extend: 0.6.0 + ini: 1.3.8 + minimist: 1.2.8 + strip-json-comments: 2.0.1 + dev: false /readable-stream/1.1.14: resolution: {integrity: sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==} @@ -1244,6 +1296,27 @@ packages: string_decoder: 0.10.31 dev: false + /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 + /readdirp/3.6.0: resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} engines: {node: '>=8.10.0'} @@ -1260,12 +1333,25 @@ packages: resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} dev: false - /rollup/3.21.5: - resolution: {integrity: sha512-a4NTKS4u9PusbUJcfF4IMxuqjFzjm6ifj76P54a7cKnvVzJaG12BLVR+hgU2YDGHzyMMQNxLAZWuALsn8q2oQg==} - engines: {node: '>=14.18.0', npm: '>=8.0.0'} + /resolve/1.22.2: + resolution: {integrity: sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==} hasBin: true - optionalDependencies: - fsevents: 2.3.2 + dependencies: + is-core-module: 2.12.0 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + 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-parallel/1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + dependencies: + queue-microtask: 1.2.3 + dev: false /safe-buffer/5.1.2: resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} @@ -1295,6 +1381,7 @@ packages: hasBin: true dependencies: lru-cache: 6.0.0 + dev: false /send/0.18.0: resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==} @@ -1341,8 +1428,17 @@ packages: object-inspect: 1.12.3 dev: false - /siginfo/2.0.0: - resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} + /simple-concat/1.0.1: + resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} + dev: false + + /simple-get/4.0.1: + resolution: {integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==} + dependencies: + decompress-response: 6.0.0 + once: 1.4.0 + simple-concat: 1.0.1 + dev: false /simple-update-notifier/1.1.0: resolution: {integrity: sha512-VpsrsJSUcJEseSbMHkrsrAVSdvVS5I96Qo1QAQ4FxQ9wXFcB+pjj7FB7/us9+GcgfW4ziHtYMc1J0PLczb55mg==} @@ -1351,20 +1447,21 @@ packages: semver: 7.0.0 dev: false - /source-map-js/1.0.2: - resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} - engines: {node: '>=0.10.0'} - - /stackback/0.0.2: - resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + /slash/3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + dev: false /statuses/2.0.1: resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} engines: {node: '>= 0.8'} dev: false - /std-env/3.3.3: - resolution: {integrity: sha512-Rz6yejtVyWnVjC1RFvNmYL10kgjC49EOghxWn0RFqlCHGFpQx+Xe7yW3I4ceK1SGrWIGMjD5Kbue8W/udkbMJg==} + /stream-meter/1.0.4: + resolution: {integrity: sha512-4sOEtrbgFotXwnEuzzsQBYEV1elAeFSO8rSGeTwabuX1RRn/kEq9JVH7I0MRBhKVRR0sJkr0M0QCH7yOLf9fhQ==} + dependencies: + readable-stream: 2.3.8 + dev: false /string-width/4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} @@ -1379,6 +1476,18 @@ packages: resolution: {integrity: sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==} 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 + dev: false + /strip-ansi/6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} @@ -1391,10 +1500,10 @@ packages: engines: {node: '>=4'} dev: true - /strip-literal/1.0.1: - resolution: {integrity: sha512-QZTsipNpa2Ppr6v1AmJHESqJ3Uz247MUS0OjrnnZjFAvEoWqxuyFuXn2xLgMtRnijJShAa1HL0gtJyUs7u7n3Q==} - dependencies: - acorn: 8.8.2 + /strip-json-comments/2.0.1: + resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} + engines: {node: '>=0.10.0'} + dev: false /supports-color/5.5.0: resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} @@ -1403,20 +1512,42 @@ packages: has-flag: 3.0.0 dev: false - /time-zone/1.0.0: - resolution: {integrity: sha512-TIsDdtKo6+XrPtiTm1ssmMngN1sAhyKnTO2kunQWqNPWIVvCm15Wmw4SWInwTVgJ5u/Tr04+8Ei9TNcw4x4ONA==} - engines: {node: '>=4'} + /supports-color/7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + dependencies: + has-flag: 4.0.0 + dev: false - /tinybench/2.5.0: - resolution: {integrity: sha512-kRwSG8Zx4tjF9ZiyH4bhaebu+EDz1BOx9hOigYHlUW4xxI/wKIUQUqo018UlU4ar6ATPBsaMrdbKZ+tmPdohFA==} + /supports-preserve-symlinks-flag/1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + dev: false - /tinypool/0.5.0: - resolution: {integrity: sha512-paHQtnrlS1QZYKF/GnLoOM/DN9fqaGOFbCbxzAhwniySnzl9Ebk8w73/dd34DAhe/obUbPAOldTyYXQZxnPBPQ==} - engines: {node: '>=14.0.0'} + /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-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 - /tinyspy/2.1.0: - resolution: {integrity: sha512-7eORpyqImoOvkQJCSkL0d0mB4NHHIFAy4b1u8PHdDa7SjGS2njzl6/lyGoZLm+eyYEtlUmFGE0rFj66SWxZgQQ==} - engines: {node: '>=14.0.0'} + /to-fast-properties/2.0.0: + resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} + engines: {node: '>=4'} + dev: false /to-regex-range/5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} @@ -1437,12 +1568,8 @@ packages: nopt: 1.0.10 dev: false - /ts-essentials/9.3.2_typescript@5.0.2: - resolution: {integrity: sha512-JxKJzuWqH1MmH4ZFHtJzGEhkfN3QvVR3C3w+4BIoWeoY68UVVoA2Np/Bca9z0IPSErVCWhv439aT0We4Dks8kQ==} - peerDependencies: - typescript: '>=4.1.0' - dependencies: - typescript: 5.0.2 + /tr46/0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} dev: false /ts-node/10.9.1_gkjsv6qbk4dkl5zwoikfngqpvy: @@ -1498,9 +1625,11 @@ packages: strip-bom: 3.0.0 dev: true - /type-detect/4.0.8: - resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} - engines: {node: '>=4'} + /tunnel-agent/0.6.0: + resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} + dependencies: + safe-buffer: 5.2.1 + dev: false /type-is/1.6.18: resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} @@ -1515,13 +1644,15 @@ packages: engines: {node: '>=12.20'} hasBin: true - /ufo/1.1.2: - resolution: {integrity: sha512-TrY6DsjTQQgyS3E3dBaOXf0TpPD8u9FVrVYmKVegJuFw51n/YB9XPt+U6ydzFG5ZIN7+DIjPbNmXoBj9esYhgQ==} - /undefsafe/2.0.5: resolution: {integrity: sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==} dev: false + /universalify/2.0.0: + resolution: {integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==} + engines: {node: '>= 10.0.0'} + dev: false + /unpipe/1.0.0: resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} engines: {node: '>= 0.8'} @@ -1534,6 +1665,10 @@ packages: requires-port: 1.0.0 dev: false + /util-deprecate/1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + dev: false + /utils-merge/1.0.1: resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} engines: {node: '>= 0.4.0'} @@ -1548,26 +1683,6 @@ packages: engines: {node: '>= 0.8'} dev: false - /vite-node/0.31.0_@types+node@18.15.7: - resolution: {integrity: sha512-8x1x1LNuPvE2vIvkSB7c1mApX5oqlgsxzHQesYF7l5n1gKrEmrClIiZuOFbFDQcjLsmcWSwwmrWrcGWm9Fxc/g==} - engines: {node: '>=v14.18.0'} - hasBin: true - dependencies: - cac: 6.7.14 - debug: 4.3.4 - mlly: 1.2.0 - pathe: 1.1.0 - picocolors: 1.0.0 - vite: 4.3.5_@types+node@18.15.7 - transitivePeerDependencies: - - '@types/node' - - less - - sass - - stylus - - sugarss - - supports-color - - terser - /vite-tsconfig-paths/4.2.0_typescript@5.0.2: resolution: {integrity: sha512-jGpus0eUy5qbbMVGiTxCL1iB9ZGN6Bd37VGLJU39kTDD6ZfULTTb1bcc5IeTWqWJKiWV5YihCaibeASPiGi8kw==} peerDependencies: @@ -1584,124 +1699,16 @@ packages: - typescript dev: false - /vite/4.3.5_@types+node@18.15.7: - resolution: {integrity: sha512-0gEnL9wiRFxgz40o/i/eTBwm+NEbpUeTWhzKrZDSdKm6nplj+z4lKz8ANDgildxHm47Vg8EUia0aicKbawUVVA==} - engines: {node: ^14.18.0 || >=16.0.0} - hasBin: true - peerDependencies: - '@types/node': '>= 14' - less: '*' - sass: '*' - stylus: '*' - sugarss: '*' - terser: ^5.4.0 - peerDependenciesMeta: - '@types/node': - optional: true - less: - optional: true - sass: - optional: true - stylus: - optional: true - sugarss: - optional: true - terser: - optional: true - dependencies: - '@types/node': 18.15.7 - esbuild: 0.17.18 - postcss: 8.4.23 - rollup: 3.21.5 - optionalDependencies: - fsevents: 2.3.2 - - /vitest-mock-extended/1.1.3_64trcfcrzkzux7tbs242bksig4: - resolution: {integrity: sha512-MiaKYZbTg+fjozKnCpoTTva0BnlSNYyk4jiPuM2xVhg4aou112QIrALdH3/ZKK6qfXWh0A17gFIjWJjylOlXxg==} - peerDependencies: - typescript: 3.x || 4.x || 5.x - vitest: '>=0.29.2' - dependencies: - ts-essentials: 9.3.2_typescript@5.0.2 - typescript: 5.0.2 - vitest: 0.31.0 + /webidl-conversions/3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} dev: false - /vitest/0.31.0: - resolution: {integrity: sha512-JwWJS9p3GU9GxkG7eBSmr4Q4x4bvVBSswaCFf1PBNHiPx00obfhHRJfgHcnI0ffn+NMlIh9QGvG75FlaIBdKGA==} - engines: {node: '>=v14.18.0'} - hasBin: true - peerDependencies: - '@edge-runtime/vm': '*' - '@vitest/browser': '*' - '@vitest/ui': '*' - happy-dom: '*' - jsdom: '*' - playwright: '*' - safaridriver: '*' - webdriverio: '*' - peerDependenciesMeta: - '@edge-runtime/vm': - optional: true - '@vitest/browser': - optional: true - '@vitest/ui': - optional: true - happy-dom: - optional: true - jsdom: - optional: true - playwright: - optional: true - safaridriver: - optional: true - webdriverio: - optional: true + /whatwg-url/5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} dependencies: - '@types/chai': 4.3.5 - '@types/chai-subset': 1.3.3 - '@types/node': 18.15.7 - '@vitest/expect': 0.31.0 - '@vitest/runner': 0.31.0 - '@vitest/snapshot': 0.31.0 - '@vitest/spy': 0.31.0 - '@vitest/utils': 0.31.0 - acorn: 8.8.2 - acorn-walk: 8.2.0 - cac: 6.7.14 - chai: 4.3.7 - concordance: 5.0.4 - debug: 4.3.4 - local-pkg: 0.4.3 - magic-string: 0.30.0 - pathe: 1.1.0 - picocolors: 1.0.0 - std-env: 3.3.3 - strip-literal: 1.0.1 - tinybench: 2.5.0 - tinypool: 0.5.0 - vite: 4.3.5_@types+node@18.15.7 - vite-node: 0.31.0_@types+node@18.15.7 - why-is-node-running: 2.2.2 - transitivePeerDependencies: - - less - - sass - - stylus - - sugarss - - supports-color - - terser - - /well-known-symbols/2.0.0: - resolution: {integrity: sha512-ZMjC3ho+KXo0BfJb7JgtQ5IBuvnShdlACNkKkdsqBmYw3bPAaJfPeYUo6tLUaT5tG/Gkh7xkpBhKRQ9e7pyg9Q==} - engines: {node: '>=6'} - - /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 + tr46: 0.0.3 + webidl-conversions: 3.0.1 + dev: false /wrap-ansi/7.0.0: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} @@ -1712,6 +1719,10 @@ packages: strip-ansi: 6.0.1 dev: false + /wrappy/1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + dev: false + /y18n/5.0.8: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} engines: {node: '>=10'} @@ -1719,6 +1730,7 @@ packages: /yallist/4.0.0: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + dev: false /yargs-parser/20.2.9: resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} @@ -1742,7 +1754,3 @@ packages: resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} engines: {node: '>=6'} dev: true - - /yocto-queue/1.0.0: - resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} - engines: {node: '>=12.20'} diff --git a/services/product/prisma/seed.ts b/services/product/prisma/seed.ts new file mode 100644 index 00000000..c16e73df --- /dev/null +++ b/services/product/prisma/seed.ts @@ -0,0 +1,74 @@ +import { PrismaClient, Prisma } from "@prisma/client"; + +const prisma = new PrismaClient(); + +const allergens: Prisma.AllergenCreateInput[] = [ + { + id: "allergen_id:1", + libelle: "Arachide" + }, + { + id: "allergen_id:2", + libelle: "Iode" + }, + { + id: "allergen_id:3", + libelle: "Pollen" + }, + { + id: "allergen_id:4", + libelle: "Peanuts" + }, +]; + + +const categories: Prisma.CategoryCreateInput[] = [ + { + id: "category_id:1", + libelle: "Végéterien", + hexa_color: "#dedede", + icon: "link:1" + }, + { + id: "category_id:2", + libelle: "Épicé", + hexa_color: "#bbbbbb", + icon: "link:2" + }, + { + id: "category_id:3", + libelle: "Frais", + hexa_color: "#ghghgh", + icon: "link:3" + }, +]; + +async function main() { + console.log(`Delete existing data ...`); + await prisma.product.deleteMany(); + await prisma.allergen.deleteMany(); + await prisma.category.deleteMany(); + console.log(`Existing data deleted.`); + + console.log(`Start seeding ...`); + for (const a of allergens) { + const allergen = await prisma.allergen.create({ data: a }); + console.log(`Created product with id: ${allergen.id}`); + } + for (const c of categories) { + const category = await prisma.category.create({ data: c }); + console.log(`Created category with id: ${category.id}`); + } + console.log(`Seeding finished.`); +} + +main() + .then(async () => { + await prisma.$disconnect(); + }) + .catch(async (e) => { + console.error(e); + await prisma.$disconnect(); + // @ts-ignore + process.exit(1); + }); \ No newline at end of file diff --git a/services/product/src/handler/Allergen/create.ts b/services/product/src/handler/Allergen/create.ts index 09f41b8c..021c1a47 100644 --- a/services/product/src/handler/Allergen/create.ts +++ b/services/product/src/handler/Allergen/create.ts @@ -5,12 +5,11 @@ import { ServerErrorResponse } from "@grpc/grpc-js"; import { prisma } from "@product/lib/prisma"; export const CreateAllergen = async ( - data: Data, + { request }: Data, callback: (err: ServerErrorResponse | null, response: Allergen | null) => void ) => { - log.debug("Request received at CreateAllergen handler\n", data.request); try { - const { libelle } = data.request; + const { libelle } = request; if (!libelle && libelle.trim().length <= 0) throw(Error("L'allergen doit avoir une valeur") as ServerErrorResponse) diff --git a/services/product/src/handler/Allergen/delete.ts b/services/product/src/handler/Allergen/delete.ts index 7bc61fac..6f95d64e 100644 --- a/services/product/src/handler/Allergen/delete.ts +++ b/services/product/src/handler/Allergen/delete.ts @@ -5,12 +5,11 @@ import { ServerErrorResponse } from "@grpc/grpc-js"; import prisma from "@product/lib/prisma"; export const DeleteAllergen = async ( - data: Data, + { request} : Data, callback: (err: ServerErrorResponse | null) => void ) => { - log.debug("Request received at DeleteAllergen handler\n", data.request); try { - const { id } = data.request; + const { id } = request; if((await prisma.allergen.findFirst({where: {id: id}}) as Allergen | null) == null) throw(Error("L'allergen n'existe pas") as ServerErrorResponse) diff --git a/services/product/src/handler/Allergen/list.ts b/services/product/src/handler/Allergen/list.ts index 0d3abdc8..577190a0 100644 --- a/services/product/src/handler/Allergen/list.ts +++ b/services/product/src/handler/Allergen/list.ts @@ -2,12 +2,12 @@ import { log } from "@product/lib/log"; import { Data } from "@product/types"; import { Allergen, AllergenList } from "@product/types/Allergen"; import prisma from "@product/lib/prisma"; +import { ServerErrorResponse } from "@grpc/grpc-js"; export const GetAllergenList = async ( - data: Data, - callback: (err: any, response: AllergenList | null) => void + { request} : Data, + callback: (err: ServerErrorResponse | null, response: AllergenList | null) => void ) => { - log.debug("Request received at GetAllergenList handler\n", data.request); try { const allergens = await prisma.allergen.findMany() as Allergen[]; @@ -22,7 +22,7 @@ export const GetAllergenList = async ( callback(null, allergenList); - } catch (error) { + } catch (error: ServerErrorResponse | any) { log.error(error); callback(error, null); } diff --git a/services/product/src/handler/Allergen/read.ts b/services/product/src/handler/Allergen/read.ts index 1bd662ae..148000f8 100644 --- a/services/product/src/handler/Allergen/read.ts +++ b/services/product/src/handler/Allergen/read.ts @@ -5,12 +5,11 @@ import { ServerErrorResponse } from "@grpc/grpc-js"; import prisma from "@product/lib/prisma"; export const ReadAllergen = async ( - data: Data, - callback: (err: any, response: Allergen | null) => void + { request } : Data, + callback: (err: ServerErrorResponse | any, response: Allergen | null) => void ) => { - log.debug("Request received at ReadAllergen handler\n", data.request); try { - const { id } = data.request; + const { id } = request; if (!id && id.trim().length <= 0) throw(Error("L'id de l'allergen doit avoir une valeur") as ServerErrorResponse) @@ -18,7 +17,7 @@ export const ReadAllergen = async ( const allergen = await prisma.allergen.findFirstOrThrow({ where : {id} }) as Allergen; callback(null, allergen); - } catch (error) { + } catch (error: ServerErrorResponse | any) { log.error(error); callback(error, null); } diff --git a/services/product/src/handler/Allergen/update.ts b/services/product/src/handler/Allergen/update.ts index e115617a..cac479a4 100644 --- a/services/product/src/handler/Allergen/update.ts +++ b/services/product/src/handler/Allergen/update.ts @@ -5,12 +5,11 @@ import { ServerErrorResponse } from "@grpc/grpc-js"; import prisma from "@product/lib/prisma"; export const UpdateAllergen = async ( - data: Data, - callback: (err: any, response: Allergen | null) => void + { request }: Data, + callback: (err: ServerErrorResponse | any, response: Allergen | null) => void ) => { - log.debug("Request received at UpdateAllergen handler\n", data.request); try { - const { id, libelle } = data.request; + const { id, libelle } = request; if (!id && id.trim().length <= 0) throw(Error("L'id de l'allergen doit avoir une valeur") as ServerErrorResponse) @@ -26,7 +25,7 @@ export const UpdateAllergen = async ( }) as Allergen; callback(null, allergen); - } catch (error) { + } catch (error: ServerErrorResponse | any) { log.error(error); callback(error, null); } diff --git a/services/product/src/handler/Category/create.ts b/services/product/src/handler/Category/create.ts index f43480eb..54864366 100644 --- a/services/product/src/handler/Category/create.ts +++ b/services/product/src/handler/Category/create.ts @@ -5,12 +5,11 @@ import { ServerErrorResponse } from "@grpc/grpc-js"; import prisma from "@product/lib/prisma"; export const CreateCategory = async ( - data: Data, - callback: (err: any, response: Category | null) => void + { request }: Data, + callback: (err: ServerErrorResponse | any, response: Category | null) => void ) => { - log.debug("Request received at CreateCategory handler\n", data.request); try { - const { libelle, hexa_color, icon } = data.request; + const { libelle, hexa_color, icon } = request; if (!libelle && libelle.trim().length <= 0 && !icon && icon.trim().length <= 0 && diff --git a/services/product/src/handler/Category/delete.ts b/services/product/src/handler/Category/delete.ts index b53c4920..2068f85b 100644 --- a/services/product/src/handler/Category/delete.ts +++ b/services/product/src/handler/Category/delete.ts @@ -6,12 +6,11 @@ import { Allergen } from "@prisma/client"; import prisma from "@product/lib/prisma"; export const DeleteCategory = async ( - data: Data, - callback: (err: any) => void + { request }: Data, + callback: (err: ServerErrorResponse | any) => void ) => { - log.debug("Request received at DeleteCategory handler\n", data.request); try { - const { id } = data.request; + const { id } = request; if((await prisma.allergen.findFirst({where: {id: id}}) as Allergen | null) == null) throw(Error("La catégorie n'existe pas") as ServerErrorResponse) diff --git a/services/product/src/handler/Category/list.ts b/services/product/src/handler/Category/list.ts index c40054cd..2c638283 100644 --- a/services/product/src/handler/Category/list.ts +++ b/services/product/src/handler/Category/list.ts @@ -1,13 +1,13 @@ +import { ServerErrorResponse } from "@grpc/grpc-js"; import { log } from "@product/lib/log"; import prisma from "@product/lib/prisma"; import { Data } from "@product/types"; import { Category, CategoryList } from "@product/types/Category"; export const GetCategoryList = async ( - data: Data, - callback: (err: any, response: CategoryList | null) => void + {request}: Data, + callback: (err: ServerErrorResponse | any, response: CategoryList | null) => void ) => { - log.debug("Request received at GetCategoryList handler\n"); try { const categorys = await prisma.category.findMany() as Category[]; @@ -21,7 +21,7 @@ export const GetCategoryList = async ( }); callback(null, categoryList); - } catch (error) { + } catch (error: ServerErrorResponse | any) { log.error(error); callback(error, null); } diff --git a/services/product/src/handler/Category/read.ts b/services/product/src/handler/Category/read.ts index eb20455a..46848bb2 100644 --- a/services/product/src/handler/Category/read.ts +++ b/services/product/src/handler/Category/read.ts @@ -5,12 +5,11 @@ import { log } from "@product/lib/log"; import { ServerErrorResponse } from "@grpc/grpc-js"; export const ReadCategory = async ( - data: Data, - callback: (err: any, response: Category | null) => void + { request }: Data, + callback: (err: ServerErrorResponse | any, response: Category | null) => void ) => { - log.debug("Request received at ReadCategory handler\n", data.request); try { - const { id } = data.request; + const { id } = request; if (!id && id.trim().length <= 0) throw(Error("L'id de la catégorie doit avoir une valeur") as ServerErrorResponse) @@ -18,7 +17,7 @@ export const ReadCategory = async ( const category = await prisma.category.findFirstOrThrow({ where : {id} }) as Category; callback(null, category); - } catch (error) { + } catch (error : ServerErrorResponse | any) { log.error(error); callback(error, null); } diff --git a/services/product/src/handler/Category/update.ts b/services/product/src/handler/Category/update.ts index 88469964..6f388cb1 100644 --- a/services/product/src/handler/Category/update.ts +++ b/services/product/src/handler/Category/update.ts @@ -5,12 +5,11 @@ import { log } from "@product/lib/log"; import { ServerErrorResponse } from "@grpc/grpc-js"; export const UpdateCategory = async ( - data: Data, - callback: (err: any, response: Category | null) => void + { request }: Data, + callback: (err: ServerErrorResponse | any, response: Category | null) => void ) => { - log.debug("Request received at UpdateCategory handler\n", data.request); try { - const { id, libelle, hexa_color, icon } = data.request; + const { id, libelle, hexa_color, icon } = request; if (!libelle && libelle.trim().length <= 0 && !icon && icon.trim().length <= 0 && @@ -38,7 +37,7 @@ export const UpdateCategory = async ( }) as Category; callback(null, category); - } catch (error) { + } catch (error: ServerErrorResponse | any) { log.error(error); callback(error, null); } diff --git a/services/product/src/handler/Image/upload.ts b/services/product/src/handler/Image/upload.ts new file mode 100644 index 00000000..d7e289f1 --- /dev/null +++ b/services/product/src/handler/Image/upload.ts @@ -0,0 +1,31 @@ +import { Allergen } from "@product/types/Allergen"; +import { Data } from "@product/types"; +import { log } from "@product/lib/log"; +import { ServerErrorResponse } from "@grpc/grpc-js"; + +var waitCounter: 0, +// the timeout after all chunks are read until all data is uploaded +maxWait: 0, +// just to show in the front end about the current upload progress: 0-100 (%) +uploadProgress: 0, +// used to avoid multiple output of chunk upload errors +chunkUploadError: false, +// store the filesize globally for this component +fileSize: 0, +// define the chunk size +chunkSize : 262144 +// an array of all junks, defined their upload status either as active (true), or done (false) +currentUploads: []; + +export const CreateAllergen = async ( + data: Data, + callback: (err: ServerErrorResponse | null, response: Allergen | null) => void +) => { + log.debug("Request received at CreateAllergen handler\n", data.request); + try { + callback(null, null); + } catch (error: ServerErrorResponse | any) { + log.error(error); + callback(error, null); + } +}; \ No newline at end of file diff --git a/services/product/src/handler/Product/create.ts b/services/product/src/handler/Product/create.ts index 9bf987e3..1810df36 100644 --- a/services/product/src/handler/Product/create.ts +++ b/services/product/src/handler/Product/create.ts @@ -7,14 +7,14 @@ import { Allergen } from "@product/types/Allergen"; import { Category } from "@product/types/Category"; import { Product } from "@product/types/Product"; import prisma from "@product/lib/prisma"; +import { ServerErrorResponse } from "@grpc/grpc-js"; export const CreateProduct = async ( - data: Data, - callback: (err: any, response: any) => void + { request }: Data, + callback: (err: ServerErrorResponse | null, response: Product | null) => void ) => { - log.debug("Request received at CreateProduct handler\n", data.request); try { - const { name, image, comment, price, preparation, weight, kilocalories, nutriscore, restaurant_id, type, categories, allergens } = data.request; + const { name, image, comment, price, preparation, weight, kilocalories, nutriscore, restaurant_id, type, categories, allergens } = request; allergens.map(async allergen => { if(allergen.id != "" && allergen.id != null) @@ -54,10 +54,10 @@ export const CreateProduct = async ( connect: allergens } }, - }); + }) as unknown as Product; callback(null, product); - } catch (error) { + } catch (error: ServerErrorResponse | any) { log.error(error); callback(error, null); } diff --git a/services/product/src/handler/Product/delete.ts b/services/product/src/handler/Product/delete.ts index 899752f7..0d18e91c 100644 --- a/services/product/src/handler/Product/delete.ts +++ b/services/product/src/handler/Product/delete.ts @@ -3,14 +3,14 @@ import { Data } from "@product/types"; import { log } from "@product/lib/log"; import { PrismaClient } from "@prisma/client"; import prisma from "@product/lib/prisma"; +import { ServerErrorResponse } from "@grpc/grpc-js"; export const DeleteProduct = async ( - data: Data, - callback: (err: any, response: any) => void + { request }: Data, + callback: (err: ServerErrorResponse | any, response: null) => void ) => { - log.debug("Request received at DeleteProduct handler\n", data.request); try { - const { id } = data.request; + const { id } = request; await prisma.product.delete({ where : {id} }); diff --git a/services/product/src/handler/Product/index.ts b/services/product/src/handler/Product/index.ts index e5ffd2d7..cd28ce53 100644 --- a/services/product/src/handler/Product/index.ts +++ b/services/product/src/handler/Product/index.ts @@ -3,7 +3,7 @@ import { ReadProduct } from "./read"; import { UpdateProduct } from "./update"; import { DeleteProduct } from "./delete"; import { ListProduct } from "./list"; -//import { GetProductTypeList } from "./listType"; +import { GetProductTypeList } from "./listType"; export default { CreateProduct, @@ -11,5 +11,5 @@ export default { UpdateProduct, DeleteProduct, ListProduct, - //GetProductTypeList, + GetProductTypeList, }; \ No newline at end of file diff --git a/services/product/src/handler/Product/list.ts b/services/product/src/handler/Product/list.ts index cb4cbce4..b1a498c4 100644 --- a/services/product/src/handler/Product/list.ts +++ b/services/product/src/handler/Product/list.ts @@ -1,20 +1,20 @@ -import { RestaurantId } from "@product/types/Product"; +import { ProductList, RestaurantId } from "@product/types/Product"; import { Data } from "@product/types"; import { log } from "@product/lib/log"; import prisma from "@product/lib/prisma"; +import { ServerErrorResponse } from "@grpc/grpc-js"; export const ListProduct = async ( - data: Data, - callback: (err: any, response: any) => void + { request }: Data, + callback: (err: ServerErrorResponse | any, response: ProductList | null) => void ) => { - log.debug("Request received at ListProduct handler\n", data.request); try { - const { id } = data.request; + const { id } = request; - const products = await prisma.product.findMany({ where : {restaurant_id: id} }); + const products = await prisma.product.findMany({ where : {restaurant_id: id} }) as unknown as ProductList; - callback(null, { products }); - } catch (error) { + callback(null, products); + } catch (error: ServerErrorResponse | any) { log.error(error); callback(error, null); } diff --git a/services/product/src/handler/Product/listType.ts b/services/product/src/handler/Product/listType.ts index 44925c14..6ae76db5 100644 --- a/services/product/src/handler/Product/listType.ts +++ b/services/product/src/handler/Product/listType.ts @@ -1,25 +1,19 @@ -/*import { Product_type } from "@prisma/client"; +import { ProductTypeList } from "@product/types/Product"; +import { Product_type } from "@prisma/client"; import { log } from "@product/lib/log"; import { Data } from "@product/types"; -import { ProductType, ProductTypeList } from "@product/types/Product"; +import { ServerErrorResponse } from "@grpc/grpc-js"; export const GetProductTypeList = async ( - data: Data, - callback: (err: any, response: ProductTypeList | null) => void + { request }: Data, + callback: (err: ServerErrorResponse | null, response: ProductTypeList | null) => void ) => { - log.debug("Request received at GetProductTypeList handler\n"); try { - const enumValues = Object.values(ProductType); + const type = {productType: Object.values(Product_type)} as ProductTypeList - const type = {} as ProductTypeList; - type.productTypes = Array.from(Object.values(Product_type).entries()).map((entrie, index) => { - if(entrie instanceof String) - return enumValues[index - 1] - }) as ProductType[]; - - callback(null, type); - } catch (error) { - log.error(error); - callback(error, null); + callback(null, type) + } catch (error: ServerErrorResponse | any) { + log.error(error) + callback(error, null) } -};*/ \ No newline at end of file +}; \ No newline at end of file diff --git a/services/product/src/handler/Product/read.ts b/services/product/src/handler/Product/read.ts index 3cf8569e..4e4de243 100644 --- a/services/product/src/handler/Product/read.ts +++ b/services/product/src/handler/Product/read.ts @@ -1,21 +1,20 @@ -import { ProductId } from "@product/types/Product"; +import { Product, ProductId } from "@product/types/Product"; import { Data } from "@product/types"; import { prisma } from "@product/lib/prisma"; import { log } from "@product/lib/log"; -import { PrismaClient } from "@prisma/client"; +import { ServerErrorResponse } from "@grpc/grpc-js"; export const ReadProduct = async ( - data: Data, - callback: (err: any, response: any) => void + { request }: Data, + callback: (err: ServerErrorResponse | null, response: Product | null) => void ) => { - log.debug("Request received at ReadProduct handler\n", data.request); try { - const { id } = data.request; + const { id } = request; - const product = await prisma.product.findFirstOrThrow({ where : {id} }); + const product = await prisma.product.findFirstOrThrow({ where : {id} }) as unknown as Product; callback(null, product); - } catch (error) { + } catch (error: ServerErrorResponse | any) { log.error(error); callback(error, null); } diff --git a/services/product/src/handler/Product/update.ts b/services/product/src/handler/Product/update.ts index 73f33118..5e3935b3 100644 --- a/services/product/src/handler/Product/update.ts +++ b/services/product/src/handler/Product/update.ts @@ -2,15 +2,15 @@ import { Product } from "@product/types/Product"; import { Data } from "@product/types"; import { prisma } from "@product/lib/prisma"; import { log } from "@product/lib/log"; -import { PrismaClient, Product_type } from "@prisma/client"; +import { Product_type } from "@prisma/client"; +import { ServerErrorResponse } from "@grpc/grpc-js"; export const UpdateProduct = async ( - data: Data, - callback: (err: any, response: any) => void + { request }: Data, + callback: (err: ServerErrorResponse | null, response: any) => void ) => { - log.debug("Request received at UpdateProduct handler\n", data.request); try { - const { id, name, image, comment, price, preparation, weight, kilocalories, nutriscore, restaurant_id, type, categories, allergens } = data.request; + const { id, name, image, comment, price, preparation, weight, kilocalories, nutriscore, restaurant_id, type, categories, allergens } = request; const product = await prisma.product.update({ where : { id }, @@ -32,10 +32,10 @@ export const UpdateProduct = async ( connect: allergens } }, - }); + }) as unknown as Product; callback(null, product); - } catch (error) { + } catch (error: ServerErrorResponse | any) { log.error(error); callback(error, null); } diff --git a/services/product/src/lib/amqp.ts b/services/product/src/lib/amqp.ts new file mode 100644 index 00000000..05b39756 --- /dev/null +++ b/services/product/src/lib/amqp.ts @@ -0,0 +1,32 @@ +import amqp from "amqplib"; +import { msg } from "@product/middleware/log"; +import { log } from "@product/lib/log"; + +const DEFAULT_QUEUE = "log"; + +async function connectQueue(queue = DEFAULT_QUEUE) { + try { + const connection = await amqp.connect(process.env.AMQP_URL || ""); + const channel = await connection.createChannel(); + await channel.assertExchange(queue, "fanout", { durable: true }); + return channel; + } catch (error) { + return error as Error; + } +} + +const toLog = (message: any) => { + const { request, path } = message; + return { event_message: path, metadata: { request } }; +}; + +export const publish = async (message: any, queue = DEFAULT_QUEUE) => { + const channel = await connectQueue(queue); + if (channel instanceof Error) + return console.log("Error to connect to queue: ", channel); + channel.sendToQueue(queue, Buffer.from(JSON.stringify(toLog(message)))); + log.debug( + msg("AMQP", `${queue} (queue)`, new Date(), new Date()), + JSON.stringify(message) + ); +}; \ No newline at end of file diff --git a/services/product/src/lib/log.ts b/services/product/src/lib/log.ts index 22924008..64ebc42d 100644 --- a/services/product/src/lib/log.ts +++ b/services/product/src/lib/log.ts @@ -1,8 +1,6 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ /* eslint-disable no-console */ -import { sendMessage } from "./rabbitmq"; - function getStackTrace() { let stack; @@ -11,7 +9,7 @@ function getStackTrace() { } catch (error) { stack = (error as Error).stack || ""; } - + stack = stack.split("\n").map((line) => line.trim()); return stack.splice(stack[0] === "Error" ? 2 : 1); } @@ -24,32 +22,26 @@ const getInitiator = () => { }; const warn = (...args: any[]) => { - sendMessage(...args); console.group( `\x1b[33m${new Date().toISOString()} - WARN - ${getInitiator()}\x1b[0m` ); console.warn(...args); console.groupEnd(); }; - const error = (...args: any[]) => { - sendMessage(...args); console.group( `\x1b[31m${new Date().toISOString()} - ERROR - ${getInitiator()}\x1b[0m` ); console.error(...args); console.groupEnd(); }; - const info = (...args: any[]) => { - sendMessage(...args); console.group( `\x1b[34m${new Date().toISOString()} - INFO - ${getInitiator()}\x1b[0m` - ); + ); console.log(...args); console.groupEnd(); }; - const debug = (...args: any[]) => { console.log(...args); }; diff --git a/services/product/src/lib/proxy.ts b/services/product/src/lib/proxy.ts new file mode 100644 index 00000000..637ded97 --- /dev/null +++ b/services/product/src/lib/proxy.ts @@ -0,0 +1,131 @@ +import { Server, status } from "@grpc/grpc-js"; + +const getType = (method: { + requestStream: boolean; + responseStream: boolean; +}) => { + if (method.requestStream === false && method.responseStream === false) { + return "unary"; + } + return "unknown"; +}; + +const lookupServiceMetadata = (service: { [x: string]: any }) => { + const serviceKeys = Object.keys(service); + const intersectingMethods = serviceKeys.reduce((acc, k) => { + const method = service[k]; + if (!method) { + throw new Error(`cannot find method ${k} on service`); + } + const components = method.path.split("/"); + acc[k] = { + name: components[1], + method: components[2], + type: getType(method), + path: method.path, + responseType: method.responseType, + requestType: method.requestType, + }; + return acc; + }, {} as any); + + return (key: string) => intersectingMethods[key]; +}; + +export const handler = { + get( + target: { + [x: string]: any; + intercept: () => any; + addService: (arg0: any, arg1: {}) => any; + }, + propKey: string + ) { + if (propKey !== "addService") { + return target[propKey]; + } + return (service: any, implementation: { [x: string]: any }) => { + const newImplementation = {} as any; + const lookup = lookupServiceMetadata(service); + for (const k in implementation) { + const name = k; + const fn = implementation[k]; + newImplementation[name] = (call: any, callback: any) => { + const ctx = { + call, + name, + service: lookup(name), + status: { + code: status.UNKNOWN, + details: "", + }, + }; + const newCallback = (callback: (arg0: any) => void) => { + return (...args: any[]) => { + ctx.status = { + code: status.OK, + details: "", + }; + const err = args[0]; + if (err) { + ctx.status = { + code: status.UNKNOWN, + details: err, + }; + } + // @ts-ignore + callback(...args); + }; + }; + + const interceptors = target.intercept(); + const first = interceptors.next(); + if (!first.value) { + // if we don't have any interceptors + return new Promise((resolve) => { + return resolve(fn(call, newCallback(callback))); + }); + } + first.value(ctx, function next() { + return new Promise((resolve) => { + const i = interceptors.next(); + if (i.done) { + return resolve(fn(call, newCallback(callback))); + } + return resolve(i.value(ctx, next)); + }); + }); + }; + } + return target.addService(service, newImplementation); + }; + }, +}; + +export const createServerProxy = ( + server: Server +): Server & { + intercept: Generator; + interceptors: any[]; + use: (fn: any) => void; +} => { + // @ts-ignore + server.interceptors = []; + // @ts-ignore + server.use = (fn: any) => { + // @ts-ignore + server.interceptors.push(fn); + }; + // @ts-ignore + server.intercept = function* intercept() { + let i = 0; + // @ts-ignore + while (i < server.interceptors.length) { + // @ts-ignore + yield server.interceptors[i]; + i++; + } + }; + // @ts-ignore + return new Proxy(server, handler); +}; \ No newline at end of file diff --git a/services/product/src/lib/rabbitmq.ts b/services/product/src/lib/rabbitmq.ts deleted file mode 100644 index 0a2769bb..00000000 --- a/services/product/src/lib/rabbitmq.ts +++ /dev/null @@ -1,11 +0,0 @@ -import amqplib from 'amqplib'; - -export async function sendMessage(...args: String[]){ - const queue = 'tasks'; - const conn = await amqplib.connect('amqp://localhost'); - const ch = await conn.createChannel(); - - args.map( arg => { - ch.sendToQueue(queue, Buffer.from(JSON.stringify({"event_message": arg, "metadata": null}))); - }); -} \ No newline at end of file diff --git a/services/product/src/middleware/log.ts b/services/product/src/middleware/log.ts new file mode 100644 index 00000000..130ca96d --- /dev/null +++ b/services/product/src/middleware/log.ts @@ -0,0 +1,41 @@ +import { publish } from "@product/lib/amqp"; +import { utils } from "@product/lib/log"; +import { log } from "@product/lib/log"; + +type Context = { + call: { + request: Map; + }; + service: { + path: string; + }; +}; + +const parseContext = (ctx: Context) => { + const { + call: { request }, + service: { path }, + } = ctx; + return { request, path }; +}; + +export const msg = ( + type: "GRPC" | "AMQP", + path: string | undefined, + requestAt: Date, + responseAt: Date +) => + `${utils.magenta(requestAt.toISOString())} | ${utils[ + type === "GRPC" ? "cyan" : "red" + ](type)}${path ? ` | ${utils.yellow(path)}` : ""} | ${utils.green( + responseAt.getTime() - requestAt.getTime() + "ms" + )} |`; + +export const logGRPC = async (ctx: Context, next: () => Promise) => { + const requestAt = new Date(); + await next(); + const responseAt = new Date(); + const { request, path } = parseContext(ctx); + //publish({ request, path }, "log"); + log.debug(msg("GRPC", path, requestAt, responseAt), JSON.stringify(request)); +}; \ No newline at end of file diff --git a/services/product/src/server.ts b/services/product/src/server.ts index bcd7fdb6..9ec56dbf 100644 --- a/services/product/src/server.ts +++ b/services/product/src/server.ts @@ -1,11 +1,17 @@ +import { resolve as resolvePath } from "path"; + import { loadSync } from "@grpc/proto-loader"; -import { ServerCredentials, loadPackageDefinition, Server, GrpcObject } from "@grpc/grpc-js"; +import { ServerCredentials, loadPackageDefinition, Server } from "@grpc/grpc-js"; import { log, utils } from "./lib/log"; -import AllergenHandler from "./handler/Allergen/index"; -import CategoryHandler from "./handler/Category/index"; -import ProductHandler from "./handler/Product/index"; +import { logGRPC } from "@product/middleware/log"; + +import { createServerProxy } from "@product/lib/proxy"; + +import AllergenHandler from "@product/handler/Allergen/index"; +import CategoryHandler from "@product/handler/Category/index"; +import ProductHandler from "@product/handler/Product/index"; const options = { keepCase: true, @@ -18,16 +24,22 @@ const options = { const serverInsecure = ServerCredentials.createInsecure(); const PORT = process.env.PORT || 50004; -const ADDRESS = `0.0.0.0:${PORT}`; -const PROTO_PATH = __dirname + "/../../proto/product.proto"; +const ADDRESS = `localhost:${PORT}`; +const PROTO_PATH = "../proto/product.proto"; const packageDefinition = loadSync(PROTO_PATH, options); -const { product } = loadPackageDefinition(packageDefinition) as any; // todo: fix any -const server = new Server(); +const grpc = loadPackageDefinition(packageDefinition) as any; // todo: fix any +const serviceAllergen = grpc.com.goodfood.product.AllergenService.service; +const serviceCategory = grpc.com.goodfood.product.CategoryService.service; +const serviceProduct = grpc.com.goodfood.product.ProductService.service; + +const server = createServerProxy(new Server()); + +server.addService(serviceAllergen, AllergenHandler); +server.addService(serviceCategory, CategoryHandler); +server.addService(serviceProduct, ProductHandler); -server.addService(product.AllergenService.service, AllergenHandler); -server.addService(product.CategoryService.service, CategoryHandler); -server.addService(product.ProductService.service, ProductHandler); +server.use(logGRPC); server.bindAsync(ADDRESS, serverInsecure, () => { server.start(); diff --git a/services/product/src/types/Product.d.ts b/services/product/src/types/Product.d.ts index 7012285a..ba54b6c2 100644 --- a/services/product/src/types/Product.d.ts +++ b/services/product/src/types/Product.d.ts @@ -2,7 +2,7 @@ import { Allergen } from "@product/types/Allergen"; import { Category } from "@product/types/Category"; -export enum ProductType { +export const enum ProductType { ENTREES = 0, PLATS = 1, DESSERTS = 2, @@ -31,7 +31,7 @@ export interface ProductList { } export interface ProductTypeList { - productTypes: ProductType[]; + productType: string[]; } export interface ProductId { diff --git a/services/product/tsconfig.json b/services/product/tsconfig.json index c46ff48b..e3d923ee 100644 --- a/services/product/tsconfig.json +++ b/services/product/tsconfig.json @@ -6,6 +6,7 @@ "lib": ["esnext"], "esModuleInterop": true, "baseUrl": ".", + "noResolve": false, "paths": { "@product/*": ["src/*"] } diff --git a/services/proto/product.proto b/services/proto/product.proto index 8b03e18f..3e35c809 100644 --- a/services/proto/product.proto +++ b/services/proto/product.proto @@ -1,7 +1,7 @@ syntax = "proto3"; import "google/protobuf/empty.proto"; -package product; +package com.goodfood.product; //Product type enum ProductType { @@ -13,7 +13,7 @@ enum ProductType { } message ProductTypeList{ - repeated ProductType productType = 1; + repeated string productType = 1; } @@ -46,6 +46,10 @@ message Product { repeated Allergen allergens = 13; } +message File{ + bytes image = 1; +} + message ProductIngredient { string id = 1; string product_id = 2; @@ -93,6 +97,8 @@ service ProductService { rpc ReadProduct(ProductId) returns (Product) {} rpc UpdateProduct(Product) returns (Product) {} rpc DeleteProduct(ProductId) returns (google.protobuf.Empty) {} + + rpc UploadImage(stream File) returns (google.protobuf.Empty); } service AllergenService { From e30c5a4efb81cf9e817e2f24938d508b110fb721 Mon Sep 17 00:00:00 2001 From: anatole Date: Mon, 3 Jul 2023 11:56:52 +0200 Subject: [PATCH 148/883] fix(models): update models to fix the migration --- services/user/src/main.go | 5 +++-- services/user/src/pkg/models/user.go | 18 ++++++++++-------- 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/services/user/src/main.go b/services/user/src/main.go index 01e0af44..90caa436 100644 --- a/services/user/src/main.go +++ b/services/user/src/main.go @@ -14,6 +14,7 @@ import ( func main() { c, err := config.LoadConfig() + url := "localhost:" + c.Port if err != nil { log.Fatalln("Failed at config", err) @@ -27,13 +28,13 @@ func main() { ExpirationHours: 24 * 365, } - lis, err := net.Listen("tcp", c.Port) + lis, err := net.Listen("tcp", url) if err != nil { log.Fatalln("Failed to listing:", err) } - fmt.Println("Auth Svc on", c.Port) + fmt.Println("Auth Svc on", url) s := services.Server{ H: h, diff --git a/services/user/src/pkg/models/user.go b/services/user/src/pkg/models/user.go index 5d56983e..89061915 100644 --- a/services/user/src/pkg/models/user.go +++ b/services/user/src/pkg/models/user.go @@ -1,12 +1,14 @@ package models type User struct { - Id string `json:"id" gorm:"primaryKey"` - Email string `json:"email" gorm:"type:varchar(255);not null"` - Password string `json:"password" gorm:"type:varchar(255);not null"` - Phone string `json:"phone" gorm:"type:varchar(10)"` - LastName string `json:"last_name" gorm:"type:varchar(100);not null"` - FirstName string `json:"first_name" gorm:"type:varchar(100);not null"` - MainAddress MainAddress `json:"main_address" gorm:"foreignKey:main_address_id"` - Role Role `json:"role" gorm:"foreignKey:RoleId"` + Id string `json:"id" gorm:"primaryKey"` + Email string `json:"email" gorm:"type:varchar(255);not null"` + Password string `json:"password" gorm:"type:varchar(255);not null"` + Phone string `json:"phone" gorm:"type:varchar(10)"` + LastName string `json:"last_name" gorm:"type:varchar(100);not null"` + FirstName string `json:"first_name" gorm:"type:varchar(100);not null"` + MainAddressId string + MainAddress MainAddress `json:"main_address" gorm:"foreignKey:MainAddressId;references:Id"` + RoleId string + Role Role `json:"role" gorm:"foreignKey:RoleId"` } From 492186aa099deb903495b0f1ca459fc348691acf Mon Sep 17 00:00:00 2001 From: Pierre Lebigre Date: Mon, 3 Jul 2023 14:03:36 +0200 Subject: [PATCH 149/883] Add connection to Azure --- services/product/.env.example | 4 +- services/product/package.json | 3 + services/product/pnpm-lock.yaml | 261 +++++++++++++++++- services/product/src/handler/Image/upload.ts | 71 +++-- services/product/src/handler/Product/index.ts | 2 + services/product/src/lib/storage.ts | 34 +++ services/product/src/types/Product.d.ts | 11 +- services/proto/product.proto | 8 +- 8 files changed, 359 insertions(+), 35 deletions(-) create mode 100644 services/product/src/lib/storage.ts diff --git a/services/product/.env.example b/services/product/.env.example index 7be71a81..61429729 100644 --- a/services/product/.env.example +++ b/services/product/.env.example @@ -1,2 +1,4 @@ DATABASE_URL="postgresql://postgres:postgres@127.0.0.1:5432/postgres" -PORT = 50004 \ No newline at end of file +PORT = 50004 +REACT_APP_AZURE_STORAGE_SAS_TOKEN = "Token" +REACT_APP_AZURE_STORAGE_RESOURCE_NAME = "RessourceName" \ No newline at end of file diff --git a/services/product/package.json b/services/product/package.json index ae5d6180..4df44b8e 100644 --- a/services/product/package.json +++ b/services/product/package.json @@ -20,13 +20,16 @@ "typescript": "^5.0.2" }, "dependencies": { + "@azure/storage-blob": "^12.14.0", "@grpc/grpc-js": "^1.8.14", "@grpc/proto-loader": "^0.7.6", "@prisma/client": "^4.11.0", "amqplib": "^0.10.3", + "base64-arraybuffer": "^1.0.2", "express": "^4.18.2", "nodemon": "^2.0.22", "pkg": "^5.8.1", + "sharp": "^0.32.1", "vite-tsconfig-paths": "^4.2.0" }, "pkg": { diff --git a/services/product/pnpm-lock.yaml b/services/product/pnpm-lock.yaml index 461a91fa..67605480 100644 --- a/services/product/pnpm-lock.yaml +++ b/services/product/pnpm-lock.yaml @@ -1,36 +1,42 @@ lockfileVersion: 5.4 specifiers: + '@azure/storage-blob': ^12.14.0 '@grpc/grpc-js': ^1.8.14 '@grpc/proto-loader': ^0.7.6 '@prisma/client': ^4.11.0 '@types/amqplib': ^0.10.1 - '@types/node': ^18.15.7 + '@types/node': ^18.16.7 amqplib: ^0.10.3 + base64-arraybuffer: ^1.0.2 express: ^4.18.2 nodemon: ^2.0.22 pkg: ^5.8.1 prisma: ^4.11.0 + sharp: ^0.32.1 ts-node: ^10.9.1 tsconfig-paths: ^4.2.0 typescript: ^5.0.2 vite-tsconfig-paths: ^4.2.0 dependencies: + '@azure/storage-blob': 12.14.0 '@grpc/grpc-js': 1.8.14 '@grpc/proto-loader': 0.7.6 '@prisma/client': 4.11.0_prisma@4.11.0 amqplib: 0.10.3 + base64-arraybuffer: 1.0.2 express: 4.18.2 nodemon: 2.0.22 pkg: 5.8.1 + sharp: 0.32.1 vite-tsconfig-paths: 4.2.0_typescript@5.0.2 devDependencies: '@types/amqplib': 0.10.1 - '@types/node': 18.15.7 + '@types/node': 18.16.19 prisma: 4.11.0 - ts-node: 10.9.1_gkjsv6qbk4dkl5zwoikfngqpvy + ts-node: 10.9.1_3n2f44gk7n7p32zpas3y4w4iqy tsconfig-paths: 4.2.0 typescript: 5.0.2 @@ -47,6 +53,99 @@ packages: - supports-color dev: false + /@azure/abort-controller/1.1.0: + resolution: {integrity: sha512-TrRLIoSQVzfAJX9H1JeFjzAoDGcoK1IYX1UImfceTZpsyYfWr09Ss1aHW1y5TrrR3iq6RZLBwJ3E24uwPhwahw==} + engines: {node: '>=12.0.0'} + dependencies: + tslib: 2.6.0 + dev: false + + /@azure/core-auth/1.4.0: + resolution: {integrity: sha512-HFrcTgmuSuukRf/EdPmqBrc5l6Q5Uu+2TbuhaKbgaCpP2TfAeiNaQPAadxO+CYBRHGUzIDteMAjFspFLDLnKVQ==} + engines: {node: '>=12.0.0'} + dependencies: + '@azure/abort-controller': 1.1.0 + tslib: 2.6.0 + dev: false + + /@azure/core-http/3.0.2: + resolution: {integrity: sha512-o1wR9JrmoM0xEAa0Ue7Sp8j+uJvmqYaGoHOCT5qaVYmvgmnZDC0OvQimPA/JR3u77Sz6D1y3Xmk1y69cDU9q9A==} + engines: {node: '>=14.0.0'} + dependencies: + '@azure/abort-controller': 1.1.0 + '@azure/core-auth': 1.4.0 + '@azure/core-tracing': 1.0.0-preview.13 + '@azure/core-util': 1.3.2 + '@azure/logger': 1.0.4 + '@types/node-fetch': 2.6.4 + '@types/tunnel': 0.0.3 + form-data: 4.0.0 + node-fetch: 2.6.11 + process: 0.11.10 + tslib: 2.6.0 + tunnel: 0.0.6 + uuid: 8.3.2 + xml2js: 0.5.0 + transitivePeerDependencies: + - encoding + dev: false + + /@azure/core-lro/2.5.3: + resolution: {integrity: sha512-ubkOf2YCnVtq7KqEJQqAI8dDD5rH1M6OP5kW0KO/JQyTaxLA0N0pjFWvvaysCj9eHMNBcuuoZXhhl0ypjod2DA==} + engines: {node: '>=14.0.0'} + dependencies: + '@azure/abort-controller': 1.1.0 + '@azure/core-util': 1.3.2 + '@azure/logger': 1.0.4 + tslib: 2.6.0 + dev: false + + /@azure/core-paging/1.5.0: + resolution: {integrity: sha512-zqWdVIt+2Z+3wqxEOGzR5hXFZ8MGKK52x4vFLw8n58pR6ZfKRx3EXYTxTaYxYHc/PexPUTyimcTWFJbji9Z6Iw==} + engines: {node: '>=14.0.0'} + dependencies: + tslib: 2.6.0 + dev: false + + /@azure/core-tracing/1.0.0-preview.13: + resolution: {integrity: sha512-KxDlhXyMlh2Jhj2ykX6vNEU0Vou4nHr025KoSEiz7cS3BNiHNaZcdECk/DmLkEB0as5T7b/TpRcehJ5yV6NeXQ==} + engines: {node: '>=12.0.0'} + dependencies: + '@opentelemetry/api': 1.4.1 + tslib: 2.6.0 + dev: false + + /@azure/core-util/1.3.2: + resolution: {integrity: sha512-2bECOUh88RvL1pMZTcc6OzfobBeWDBf5oBbhjIhT1MV9otMVWCzpOJkkiKtrnO88y5GGBelgY8At73KGAdbkeQ==} + engines: {node: '>=14.0.0'} + dependencies: + '@azure/abort-controller': 1.1.0 + tslib: 2.6.0 + dev: false + + /@azure/logger/1.0.4: + resolution: {integrity: sha512-ustrPY8MryhloQj7OWGe+HrYx+aoiOxzbXTtgblbV3xwCqpzUK36phH3XNHQKj3EPonyFUuDTfR3qFhTEAuZEg==} + engines: {node: '>=14.0.0'} + dependencies: + tslib: 2.6.0 + dev: false + + /@azure/storage-blob/12.14.0: + resolution: {integrity: sha512-g8GNUDpMisGXzBeD+sKphhH5yLwesB4JkHr1U6be/X3F+cAMcyGLPD1P89g2M7wbEtUJWoikry1rlr83nNRBzg==} + engines: {node: '>=14.0.0'} + dependencies: + '@azure/abort-controller': 1.1.0 + '@azure/core-http': 3.0.2 + '@azure/core-lro': 2.5.3 + '@azure/core-paging': 1.5.0 + '@azure/core-tracing': 1.0.0-preview.13 + '@azure/logger': 1.0.4 + events: 3.3.0 + tslib: 2.6.0 + transitivePeerDependencies: + - encoding + dev: false + /@babel/generator/7.18.2: resolution: {integrity: sha512-W1lG5vUwFvfMd8HVXqdfbuG7RuaSrTCCD8cl8fP8wOivdbtbIg2Db3IWUcgvfxKbbn6ZBGYRW/Zk1MIwK49mgw==} engines: {node: '>=6.9.0'} @@ -95,7 +194,7 @@ packages: engines: {node: ^8.13.0 || >=10.10.0} dependencies: '@grpc/proto-loader': 0.7.6 - '@types/node': 18.15.7 + '@types/node': 18.16.19 dev: false /@grpc/proto-loader/0.7.6: @@ -158,6 +257,11 @@ packages: fastq: 1.15.0 dev: false + /@opentelemetry/api/1.4.1: + resolution: {integrity: sha512-O2yRJce1GOc6PAy3QxFM4NzFiWzvScDC1/5ihYBL6BUEVdq0XMWN01sppE+H6bBXbaFYipjwFLEWLg5PaSOThA==} + engines: {node: '>=8.0.0'} + dev: false + /@prisma/client/4.11.0_prisma@4.11.0: resolution: {integrity: sha512-0INHYkQIqgAjrt7NzhYpeDQi8x3Nvylc2uDngKyFDDj1tTRQ4uV1HnVmd1sQEraeVAN63SOK0dgCKQHlvjL0KA==} engines: {node: '>=14.17'} @@ -242,15 +346,28 @@ packages: /@types/amqplib/0.10.1: resolution: {integrity: sha512-j6ANKT79ncUDnAs/+9r9eDujxbeJoTjoVu33gHHcaPfmLQaMhvfbH2GqSe8KUM444epAp1Vl3peVOQfZk3UIqA==} dependencies: - '@types/node': 18.15.7 + '@types/node': 18.16.19 dev: true /@types/long/4.0.2: resolution: {integrity: sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==} dev: false - /@types/node/18.15.7: - resolution: {integrity: sha512-LFmUbFunqmBn26wJZgZPYZPrDR1RwGOu2v79Mgcka1ndO6V0/cwjivPTc4yoK6n9kmw4/ls1r8cLrvh2iMibFA==} + /@types/node-fetch/2.6.4: + resolution: {integrity: sha512-1ZX9fcN4Rvkvgv4E6PAY5WXUFWFcRWxZa3EW83UjycOB9ljJCedb2CupIP4RZMEwF/M3eTcCihbBRgwtGbg5Rg==} + dependencies: + '@types/node': 18.16.19 + form-data: 3.0.1 + dev: false + + /@types/node/18.16.19: + resolution: {integrity: sha512-IXl7o+R9iti9eBW4Wg2hx1xQDig183jj7YLn8F7udNceyfkbn1ZxmzZXuak20gR40D7pIkIY1kYGx5VIGbaHKA==} + + /@types/tunnel/0.0.3: + resolution: {integrity: sha512-sOUTGn6h1SfQ+gbgqC364jLFBw2lnFqkgF3q0WovEHRLMrVD1sd5aufqi/aJObLekJO+Aq5z646U4Oxy6shXMA==} + dependencies: + '@types/node': 18.16.19 + dev: false /abbrev/1.1.1: resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} @@ -329,6 +446,10 @@ packages: engines: {node: '>=8'} dev: false + /asynckit/0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + dev: false + /at-least-node/1.0.0: resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} engines: {node: '>= 4.0.0'} @@ -338,6 +459,11 @@ packages: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} dev: false + /base64-arraybuffer/1.0.2: + resolution: {integrity: sha512-I3yl4r9QB5ZRY3XuJVEPfc2XhZO6YweFPI+UovAzn+8/hb3oJ6lnysaFcjVpkCPfVWFUDvoZ8kmVDP7WyRtYtQ==} + engines: {node: '>= 0.6.0'} + dev: false + /base64-js/1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} dev: false @@ -458,6 +584,28 @@ packages: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} dev: false + /color-string/1.9.1: + resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} + dependencies: + color-name: 1.1.4 + simple-swizzle: 0.2.2 + dev: false + + /color/4.2.3: + resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==} + engines: {node: '>=12.5.0'} + dependencies: + color-convert: 2.0.1 + color-string: 1.9.1 + 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 + /concat-map/0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} dev: false @@ -538,6 +686,11 @@ packages: engines: {node: '>=4.0.0'} dev: false + /delayed-stream/1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + dev: false + /depd/2.0.0: resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} engines: {node: '>= 0.8'} @@ -598,6 +751,11 @@ packages: engines: {node: '>= 0.6'} dev: false + /events/3.3.0: + resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} + engines: {node: '>=0.8.x'} + dev: false + /expand-template/2.0.3: resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} engines: {node: '>=6'} @@ -681,6 +839,24 @@ packages: - supports-color 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'} @@ -852,6 +1028,10 @@ packages: engines: {node: '>= 0.10'} dev: false + /is-arrayish/0.3.2: + resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} + dev: false + /is-binary-path/2.1.0: resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} engines: {node: '>=8'} @@ -1042,6 +1222,10 @@ packages: semver: 7.5.0 dev: false + /node-addon-api/6.1.0: + resolution: {integrity: sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==} + dev: false + /node-fetch/2.6.11: resolution: {integrity: sha512-4I6pdBY1EthSqDmJkiNk3JIT8cswwR9nfeW/cPdUagJYEQG7R95WRH74wpz7ma8Gh/9dI9FP+OU+0E4FvtA55w==} engines: {node: 4.x || >=6.0.0} @@ -1204,6 +1388,11 @@ packages: resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} dev: false + /process/0.11.10: + resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} + engines: {node: '>= 0.6.0'} + dev: false + /progress/2.0.3: resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} engines: {node: '>=0.4.0'} @@ -1224,7 +1413,7 @@ packages: '@protobufjs/path': 1.1.2 '@protobufjs/pool': 1.1.0 '@protobufjs/utf8': 1.1.0 - '@types/node': 18.15.7 + '@types/node': 18.16.19 long: 5.2.3 dev: false @@ -1365,6 +1554,10 @@ packages: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} dev: false + /sax/1.2.4: + resolution: {integrity: sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==} + dev: false + /semver/5.7.1: resolution: {integrity: sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==} hasBin: true @@ -1420,6 +1613,21 @@ packages: resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} dev: false + /sharp/0.32.1: + resolution: {integrity: sha512-kQTFtj7ldpUqSe8kDxoGLZc1rnMFU0AO2pqbX6pLy3b7Oj8ivJIdoKNwxHVQG2HN6XpHPJqCSM2nsma2gOXvOg==} + engines: {node: '>=14.15.0'} + requiresBuild: true + dependencies: + color: 4.2.3 + detect-libc: 2.0.1 + node-addon-api: 6.1.0 + prebuild-install: 7.1.1 + semver: 7.5.0 + simple-get: 4.0.1 + tar-fs: 2.1.1 + tunnel-agent: 0.6.0 + dev: false + /side-channel/1.0.4: resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} dependencies: @@ -1440,6 +1648,12 @@ packages: simple-concat: 1.0.1 dev: false + /simple-swizzle/0.2.2: + resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} + dependencies: + is-arrayish: 0.3.2 + dev: false + /simple-update-notifier/1.1.0: resolution: {integrity: sha512-VpsrsJSUcJEseSbMHkrsrAVSdvVS5I96Qo1QAQ4FxQ9wXFcB+pjj7FB7/us9+GcgfW4ziHtYMc1J0PLczb55mg==} engines: {node: '>=8.10.0'} @@ -1572,7 +1786,7 @@ packages: resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} dev: false - /ts-node/10.9.1_gkjsv6qbk4dkl5zwoikfngqpvy: + /ts-node/10.9.1_3n2f44gk7n7p32zpas3y4w4iqy: resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} hasBin: true peerDependencies: @@ -1591,7 +1805,7 @@ packages: '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.3 - '@types/node': 18.15.7 + '@types/node': 18.16.19 acorn: 8.8.2 acorn-walk: 8.2.0 arg: 4.1.3 @@ -1625,12 +1839,21 @@ packages: strip-bom: 3.0.0 dev: true + /tslib/2.6.0: + resolution: {integrity: sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA==} + dev: false + /tunnel-agent/0.6.0: resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} dependencies: safe-buffer: 5.2.1 dev: false + /tunnel/0.0.6: + resolution: {integrity: sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==} + engines: {node: '>=0.6.11 <=0.7.0 || >=0.7.3'} + dev: false + /type-is/1.6.18: resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} engines: {node: '>= 0.6'} @@ -1674,6 +1897,11 @@ packages: engines: {node: '>= 0.4.0'} 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 @@ -1723,6 +1951,19 @@ packages: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} dev: false + /xml2js/0.5.0: + resolution: {integrity: sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==} + engines: {node: '>=4.0.0'} + dependencies: + sax: 1.2.4 + xmlbuilder: 11.0.1 + dev: false + + /xmlbuilder/11.0.1: + resolution: {integrity: sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==} + engines: {node: '>=4.0'} + dev: false + /y18n/5.0.8: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} engines: {node: '>=10'} diff --git a/services/product/src/handler/Image/upload.ts b/services/product/src/handler/Image/upload.ts index d7e289f1..9357871c 100644 --- a/services/product/src/handler/Image/upload.ts +++ b/services/product/src/handler/Image/upload.ts @@ -1,29 +1,58 @@ -import { Allergen } from "@product/types/Allergen"; +import { Image, Url } from "@product/types/Product"; +import { uploadFileToBlob } from "@product/lib/storage"; import { Data } from "@product/types"; import { log } from "@product/lib/log"; import { ServerErrorResponse } from "@grpc/grpc-js"; +import { decode } from "base64-arraybuffer"; +import sharp from "sharp"; +import { File } from "buffer"; -var waitCounter: 0, -// the timeout after all chunks are read until all data is uploaded -maxWait: 0, -// just to show in the front end about the current upload progress: 0-100 (%) -uploadProgress: 0, -// used to avoid multiple output of chunk upload errors -chunkUploadError: false, -// store the filesize globally for this component -fileSize: 0, -// define the chunk size -chunkSize : 262144 -// an array of all junks, defined their upload status either as active (true), or done (false) -currentUploads: []; - -export const CreateAllergen = async ( - data: Data, - callback: (err: ServerErrorResponse | null, response: Allergen | null) => void -) => { - log.debug("Request received at CreateAllergen handler\n", data.request); +export const UploadImage = async ( + { request }: Data, + callback: (err: ServerErrorResponse | null, response: Url | null) => void +) => { + log.debug("Request received at UploadImage handler\n", request); try { - callback(null, null); + const image = request.data as string; + log.debug(image); + if (!image) + throw(Error("No image provided") as ServerErrorResponse); + + const contentType = image.match(/data:(.*);base64/)?.[1]; + const base64FileData = image.split("base64,")?.[1]; + + if (!contentType || !base64FileData) + throw(Error("Image data not valid") as ServerErrorResponse); + + + // Resize image and compress + const buffer = decode(base64FileData); + const resizedBuffer = await sharp(Buffer.from(buffer), { + animated: true, + pages: -1, + }) + .resize(128, 128, { + fit: sharp.fit.cover, + // position: sharp.strategy.entropy, + }) + .toFormat("webp") + .webp({ quality: 90 }) + .toBuffer(); + + // Upload image + const fileName = `test`; + const ext = "webp"; //contentType.split("/")[1]; + const path = `${fileName}.${ext}`; + + const file = { + name: fileName, + type: ext, + arrayBuffer: resizedBuffer, + } as unknown as File; + const url = { path : await uploadFileToBlob(file) } as Url; + + + callback(null, url); } catch (error: ServerErrorResponse | any) { log.error(error); callback(error, null); diff --git a/services/product/src/handler/Product/index.ts b/services/product/src/handler/Product/index.ts index cd28ce53..136ee915 100644 --- a/services/product/src/handler/Product/index.ts +++ b/services/product/src/handler/Product/index.ts @@ -4,6 +4,7 @@ import { UpdateProduct } from "./update"; import { DeleteProduct } from "./delete"; import { ListProduct } from "./list"; import { GetProductTypeList } from "./listType"; +import { UploadImage } from "../Image/upload"; export default { CreateProduct, @@ -12,4 +13,5 @@ export default { DeleteProduct, ListProduct, GetProductTypeList, + UploadImage, }; \ No newline at end of file diff --git a/services/product/src/lib/storage.ts b/services/product/src/lib/storage.ts new file mode 100644 index 00000000..3a574161 --- /dev/null +++ b/services/product/src/lib/storage.ts @@ -0,0 +1,34 @@ +import { BlobServiceClient, ContainerClient } from "@azure/storage-blob"; +import { File } from "buffer"; + +const containerName = `uploaded`; +const sasToken = process.env.REACT_APP_AZURE_STORAGE_SAS_TOKEN; +const storageAccountName = process.env.REACT_APP_AZURE_STORAGE_RESOURCE_NAME; + +const uploadUrl = `https://${storageAccountName}.blob.core.windows.net/?${sasToken}`; +console.log(uploadUrl); + +// get BlobService = notice `?` is pulled out of sasToken - if created in Azure portal +const blobService = new BlobServiceClient(uploadUrl); + +// get Container - full public read access +const containerClient: ContainerClient = + blobService.getContainerClient(containerName); + +export const uploadFileToBlob = async (file: File | null): Promise => { + if (!file) return null; + + // upload file + return (await createBlobInContainer(file))._response.request.url; +}; + +const createBlobInContainer = async (file: File) => { + // create blobClient for container + const blobClient = containerClient.getBlockBlobClient(file.name); + + // set mimetype as determined from browser with file upload control + const options = { blobHTTPHeaders: { blobContentType: file.type } }; + + // upload file + return await blobClient.uploadData(file, options); +}; \ No newline at end of file diff --git a/services/product/src/types/Product.d.ts b/services/product/src/types/Product.d.ts index ba54b6c2..8b99cc83 100644 --- a/services/product/src/types/Product.d.ts +++ b/services/product/src/types/Product.d.ts @@ -47,4 +47,13 @@ export interface ProductIngredient { export interface RestaurantId{ id: string; -} \ No newline at end of file +} + +export interface Image{ + data: string; +} + + +export interface Url{ + path: string; +} diff --git a/services/proto/product.proto b/services/proto/product.proto index 3e35c809..4734b478 100644 --- a/services/proto/product.proto +++ b/services/proto/product.proto @@ -47,7 +47,11 @@ message Product { } message File{ - bytes image = 1; + string data = 1; +} + +message Url{ + string path = 1; } message ProductIngredient { @@ -98,7 +102,7 @@ service ProductService { rpc UpdateProduct(Product) returns (Product) {} rpc DeleteProduct(ProductId) returns (google.protobuf.Empty) {} - rpc UploadImage(stream File) returns (google.protobuf.Empty); + rpc UploadImage(File) returns (Url); } service AllergenService { From 85a27cff21edf92f3aee1b0d7a04fe0b76e3482f Mon Sep 17 00:00:00 2001 From: anatole Date: Mon, 3 Jul 2023 14:12:29 +0200 Subject: [PATCH 150/883] refactor(proto): update proto --- services/proto/user.pb.go | 1847 -------------------------------- services/proto/user.proto | 6 +- services/proto/user_grpc.pb.go | 516 --------- 3 files changed, 4 insertions(+), 2365 deletions(-) delete mode 100644 services/proto/user.pb.go delete mode 100644 services/proto/user_grpc.pb.go diff --git a/services/proto/user.pb.go b/services/proto/user.pb.go deleted file mode 100644 index 9e030ae9..00000000 --- a/services/proto/user.pb.go +++ /dev/null @@ -1,1847 +0,0 @@ -// Code generated by protoc-gen-go. DO NOT EDIT. -// versions: -// protoc-gen-go v1.28.1 -// protoc v3.12.4 -// source: user.proto - -package __ - -import ( - empty "github.com/golang/protobuf/ptypes/empty" - protoreflect "google.golang.org/protobuf/reflect/protoreflect" - protoimpl "google.golang.org/protobuf/runtime/protoimpl" - reflect "reflect" - sync "sync" -) - -const ( - // Verify that this generated code is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) - // Verify that runtime/protoimpl is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) -) - -type Role struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - Code string `protobuf:"bytes,2,opt,name=code,proto3" json:"code,omitempty"` - Label string `protobuf:"bytes,3,opt,name=label,proto3" json:"label,omitempty"` -} - -func (x *Role) Reset() { - *x = Role{} - if protoimpl.UnsafeEnabled { - mi := &file_user_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *Role) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*Role) ProtoMessage() {} - -func (x *Role) ProtoReflect() protoreflect.Message { - mi := &file_user_proto_msgTypes[0] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use Role.ProtoReflect.Descriptor instead. -func (*Role) Descriptor() ([]byte, []int) { - return file_user_proto_rawDescGZIP(), []int{0} -} - -func (x *Role) GetId() string { - if x != nil { - return x.Id - } - return "" -} - -func (x *Role) GetCode() string { - if x != nil { - return x.Code - } - return "" -} - -func (x *Role) GetLabel() string { - if x != nil { - return x.Label - } - return "" -} - -type MainAddress struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - Street string `protobuf:"bytes,2,opt,name=street,proto3" json:"street,omitempty"` - ZipCode string `protobuf:"bytes,3,opt,name=zipCode,proto3" json:"zipCode,omitempty"` - Country string `protobuf:"bytes,4,opt,name=country,proto3" json:"country,omitempty"` - Lat float32 `protobuf:"fixed32,5,opt,name=lat,proto3" json:"lat,omitempty"` - Lng float32 `protobuf:"fixed32,6,opt,name=lng,proto3" json:"lng,omitempty"` -} - -func (x *MainAddress) Reset() { - *x = MainAddress{} - if protoimpl.UnsafeEnabled { - mi := &file_user_proto_msgTypes[1] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *MainAddress) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*MainAddress) ProtoMessage() {} - -func (x *MainAddress) ProtoReflect() protoreflect.Message { - mi := &file_user_proto_msgTypes[1] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use MainAddress.ProtoReflect.Descriptor instead. -func (*MainAddress) Descriptor() ([]byte, []int) { - return file_user_proto_rawDescGZIP(), []int{1} -} - -func (x *MainAddress) GetId() string { - if x != nil { - return x.Id - } - return "" -} - -func (x *MainAddress) GetStreet() string { - if x != nil { - return x.Street - } - return "" -} - -func (x *MainAddress) GetZipCode() string { - if x != nil { - return x.ZipCode - } - return "" -} - -func (x *MainAddress) GetCountry() string { - if x != nil { - return x.Country - } - return "" -} - -func (x *MainAddress) GetLat() float32 { - if x != nil { - return x.Lat - } - return 0 -} - -func (x *MainAddress) GetLng() float32 { - if x != nil { - return x.Lng - } - return 0 -} - -type User struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - FirstName string `protobuf:"bytes,2,opt,name=first_name,json=firstName,proto3" json:"first_name,omitempty"` - LastName string `protobuf:"bytes,3,opt,name=last_name,json=lastName,proto3" json:"last_name,omitempty"` - Email string `protobuf:"bytes,4,opt,name=email,proto3" json:"email,omitempty"` - Phone string `protobuf:"bytes,5,opt,name=phone,proto3" json:"phone,omitempty"` - MainAddress *MainAddress `protobuf:"bytes,6,opt,name=mainAddress,proto3" json:"mainAddress,omitempty"` - Role *Role `protobuf:"bytes,7,opt,name=role,proto3" json:"role,omitempty"` -} - -func (x *User) Reset() { - *x = User{} - if protoimpl.UnsafeEnabled { - mi := &file_user_proto_msgTypes[2] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *User) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*User) ProtoMessage() {} - -func (x *User) ProtoReflect() protoreflect.Message { - mi := &file_user_proto_msgTypes[2] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use User.ProtoReflect.Descriptor instead. -func (*User) Descriptor() ([]byte, []int) { - return file_user_proto_rawDescGZIP(), []int{2} -} - -func (x *User) GetId() string { - if x != nil { - return x.Id - } - return "" -} - -func (x *User) GetFirstName() string { - if x != nil { - return x.FirstName - } - return "" -} - -func (x *User) GetLastName() string { - if x != nil { - return x.LastName - } - return "" -} - -func (x *User) GetEmail() string { - if x != nil { - return x.Email - } - return "" -} - -func (x *User) GetPhone() string { - if x != nil { - return x.Phone - } - return "" -} - -func (x *User) GetMainAddress() *MainAddress { - if x != nil { - return x.MainAddress - } - return nil -} - -func (x *User) GetRole() *Role { - if x != nil { - return x.Role - } - return nil -} - -type UpdateUserInput struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - User *User `protobuf:"bytes,1,opt,name=user,proto3" json:"user,omitempty"` - Token string `protobuf:"bytes,8,opt,name=token,proto3" json:"token,omitempty"` -} - -func (x *UpdateUserInput) Reset() { - *x = UpdateUserInput{} - if protoimpl.UnsafeEnabled { - mi := &file_user_proto_msgTypes[3] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *UpdateUserInput) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*UpdateUserInput) ProtoMessage() {} - -func (x *UpdateUserInput) ProtoReflect() protoreflect.Message { - mi := &file_user_proto_msgTypes[3] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use UpdateUserInput.ProtoReflect.Descriptor instead. -func (*UpdateUserInput) Descriptor() ([]byte, []int) { - return file_user_proto_rawDescGZIP(), []int{3} -} - -func (x *UpdateUserInput) GetUser() *User { - if x != nil { - return x.User - } - return nil -} - -func (x *UpdateUserInput) GetToken() string { - if x != nil { - return x.Token - } - return "" -} - -type UpdateUserOutput struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - User *User `protobuf:"bytes,1,opt,name=user,proto3" json:"user,omitempty"` - Error string `protobuf:"bytes,2,opt,name=error,proto3" json:"error,omitempty"` -} - -func (x *UpdateUserOutput) Reset() { - *x = UpdateUserOutput{} - if protoimpl.UnsafeEnabled { - mi := &file_user_proto_msgTypes[4] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *UpdateUserOutput) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*UpdateUserOutput) ProtoMessage() {} - -func (x *UpdateUserOutput) ProtoReflect() protoreflect.Message { - mi := &file_user_proto_msgTypes[4] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use UpdateUserOutput.ProtoReflect.Descriptor instead. -func (*UpdateUserOutput) Descriptor() ([]byte, []int) { - return file_user_proto_rawDescGZIP(), []int{4} -} - -func (x *UpdateUserOutput) GetUser() *User { - if x != nil { - return x.User - } - return nil -} - -func (x *UpdateUserOutput) GetError() string { - if x != nil { - return x.Error - } - return "" -} - -type UserCreateInput struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - FirstName string `protobuf:"bytes,1,opt,name=first_name,json=firstName,proto3" json:"first_name,omitempty"` - LastName string `protobuf:"bytes,2,opt,name=last_name,json=lastName,proto3" json:"last_name,omitempty"` - Email string `protobuf:"bytes,3,opt,name=email,proto3" json:"email,omitempty"` - Password string `protobuf:"bytes,4,opt,name=password,proto3" json:"password,omitempty"` - Phone string `protobuf:"bytes,5,opt,name=phone,proto3" json:"phone,omitempty"` - MainAddress *MainAddressInput `protobuf:"bytes,6,opt,name=mainAddress,proto3" json:"mainAddress,omitempty"` - Role *RoleInput `protobuf:"bytes,7,opt,name=role,proto3" json:"role,omitempty"` -} - -func (x *UserCreateInput) Reset() { - *x = UserCreateInput{} - if protoimpl.UnsafeEnabled { - mi := &file_user_proto_msgTypes[5] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *UserCreateInput) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*UserCreateInput) ProtoMessage() {} - -func (x *UserCreateInput) ProtoReflect() protoreflect.Message { - mi := &file_user_proto_msgTypes[5] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use UserCreateInput.ProtoReflect.Descriptor instead. -func (*UserCreateInput) Descriptor() ([]byte, []int) { - return file_user_proto_rawDescGZIP(), []int{5} -} - -func (x *UserCreateInput) GetFirstName() string { - if x != nil { - return x.FirstName - } - return "" -} - -func (x *UserCreateInput) GetLastName() string { - if x != nil { - return x.LastName - } - return "" -} - -func (x *UserCreateInput) GetEmail() string { - if x != nil { - return x.Email - } - return "" -} - -func (x *UserCreateInput) GetPassword() string { - if x != nil { - return x.Password - } - return "" -} - -func (x *UserCreateInput) GetPhone() string { - if x != nil { - return x.Phone - } - return "" -} - -func (x *UserCreateInput) GetMainAddress() *MainAddressInput { - if x != nil { - return x.MainAddress - } - return nil -} - -func (x *UserCreateInput) GetRole() *RoleInput { - if x != nil { - return x.Role - } - return nil -} - -type MainAddressInput struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Street string `protobuf:"bytes,1,opt,name=street,proto3" json:"street,omitempty"` - ZipCode string `protobuf:"bytes,2,opt,name=zipCode,proto3" json:"zipCode,omitempty"` - Country string `protobuf:"bytes,3,opt,name=country,proto3" json:"country,omitempty"` - Coordinates []int32 `protobuf:"varint,4,rep,packed,name=coordinates,proto3" json:"coordinates,omitempty"` -} - -func (x *MainAddressInput) Reset() { - *x = MainAddressInput{} - if protoimpl.UnsafeEnabled { - mi := &file_user_proto_msgTypes[6] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *MainAddressInput) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*MainAddressInput) ProtoMessage() {} - -func (x *MainAddressInput) ProtoReflect() protoreflect.Message { - mi := &file_user_proto_msgTypes[6] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use MainAddressInput.ProtoReflect.Descriptor instead. -func (*MainAddressInput) Descriptor() ([]byte, []int) { - return file_user_proto_rawDescGZIP(), []int{6} -} - -func (x *MainAddressInput) GetStreet() string { - if x != nil { - return x.Street - } - return "" -} - -func (x *MainAddressInput) GetZipCode() string { - if x != nil { - return x.ZipCode - } - return "" -} - -func (x *MainAddressInput) GetCountry() string { - if x != nil { - return x.Country - } - return "" -} - -func (x *MainAddressInput) GetCoordinates() []int32 { - if x != nil { - return x.Coordinates - } - return nil -} - -type RoleInput struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Code string `protobuf:"bytes,1,opt,name=code,proto3" json:"code,omitempty"` -} - -func (x *RoleInput) Reset() { - *x = RoleInput{} - if protoimpl.UnsafeEnabled { - mi := &file_user_proto_msgTypes[7] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *RoleInput) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*RoleInput) ProtoMessage() {} - -func (x *RoleInput) ProtoReflect() protoreflect.Message { - mi := &file_user_proto_msgTypes[7] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use RoleInput.ProtoReflect.Descriptor instead. -func (*RoleInput) Descriptor() ([]byte, []int) { - return file_user_proto_rawDescGZIP(), []int{7} -} - -func (x *RoleInput) GetCode() string { - if x != nil { - return x.Code - } - return "" -} - -type UserId struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` -} - -func (x *UserId) Reset() { - *x = UserId{} - if protoimpl.UnsafeEnabled { - mi := &file_user_proto_msgTypes[8] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *UserId) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*UserId) ProtoMessage() {} - -func (x *UserId) ProtoReflect() protoreflect.Message { - mi := &file_user_proto_msgTypes[8] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use UserId.ProtoReflect.Descriptor instead. -func (*UserId) Descriptor() ([]byte, []int) { - return file_user_proto_rawDescGZIP(), []int{8} -} - -func (x *UserId) GetId() string { - if x != nil { - return x.Id - } - return "" -} - -type UserList struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Users []*User `protobuf:"bytes,1,rep,name=users,proto3" json:"users,omitempty"` -} - -func (x *UserList) Reset() { - *x = UserList{} - if protoimpl.UnsafeEnabled { - mi := &file_user_proto_msgTypes[9] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *UserList) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*UserList) ProtoMessage() {} - -func (x *UserList) ProtoReflect() protoreflect.Message { - mi := &file_user_proto_msgTypes[9] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use UserList.ProtoReflect.Descriptor instead. -func (*UserList) Descriptor() ([]byte, []int) { - return file_user_proto_rawDescGZIP(), []int{9} -} - -func (x *UserList) GetUsers() []*User { - if x != nil { - return x.Users - } - return nil -} - -type LogInInput struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - UserId string `protobuf:"bytes,1,opt,name=userId,proto3" json:"userId,omitempty"` - Email string `protobuf:"bytes,2,opt,name=email,proto3" json:"email,omitempty"` - Password string `protobuf:"bytes,3,opt,name=password,proto3" json:"password,omitempty"` -} - -func (x *LogInInput) Reset() { - *x = LogInInput{} - if protoimpl.UnsafeEnabled { - mi := &file_user_proto_msgTypes[10] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *LogInInput) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*LogInInput) ProtoMessage() {} - -func (x *LogInInput) ProtoReflect() protoreflect.Message { - mi := &file_user_proto_msgTypes[10] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use LogInInput.ProtoReflect.Descriptor instead. -func (*LogInInput) Descriptor() ([]byte, []int) { - return file_user_proto_rawDescGZIP(), []int{10} -} - -func (x *LogInInput) GetUserId() string { - if x != nil { - return x.UserId - } - return "" -} - -func (x *LogInInput) GetEmail() string { - if x != nil { - return x.Email - } - return "" -} - -func (x *LogInInput) GetPassword() string { - if x != nil { - return x.Password - } - return "" -} - -type ValidateInput struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Token string `protobuf:"bytes,1,opt,name=token,proto3" json:"token,omitempty"` -} - -func (x *ValidateInput) Reset() { - *x = ValidateInput{} - if protoimpl.UnsafeEnabled { - mi := &file_user_proto_msgTypes[11] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *ValidateInput) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*ValidateInput) ProtoMessage() {} - -func (x *ValidateInput) ProtoReflect() protoreflect.Message { - mi := &file_user_proto_msgTypes[11] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use ValidateInput.ProtoReflect.Descriptor instead. -func (*ValidateInput) Descriptor() ([]byte, []int) { - return file_user_proto_rawDescGZIP(), []int{11} -} - -func (x *ValidateInput) GetToken() string { - if x != nil { - return x.Token - } - return "" -} - -type DeleteInput struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Token string `protobuf:"bytes,1,opt,name=token,proto3" json:"token,omitempty"` - UserId string `protobuf:"bytes,2,opt,name=userId,proto3" json:"userId,omitempty"` -} - -func (x *DeleteInput) Reset() { - *x = DeleteInput{} - if protoimpl.UnsafeEnabled { - mi := &file_user_proto_msgTypes[12] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *DeleteInput) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*DeleteInput) ProtoMessage() {} - -func (x *DeleteInput) ProtoReflect() protoreflect.Message { - mi := &file_user_proto_msgTypes[12] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use DeleteInput.ProtoReflect.Descriptor instead. -func (*DeleteInput) Descriptor() ([]byte, []int) { - return file_user_proto_rawDescGZIP(), []int{12} -} - -func (x *DeleteInput) GetToken() string { - if x != nil { - return x.Token - } - return "" -} - -func (x *DeleteInput) GetUserId() string { - if x != nil { - return x.UserId - } - return "" -} - -type ValidateResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Error string `protobuf:"bytes,1,opt,name=error,proto3" json:"error,omitempty"` - UserId string `protobuf:"bytes,2,opt,name=userId,proto3" json:"userId,omitempty"` -} - -func (x *ValidateResponse) Reset() { - *x = ValidateResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_user_proto_msgTypes[13] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *ValidateResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*ValidateResponse) ProtoMessage() {} - -func (x *ValidateResponse) ProtoReflect() protoreflect.Message { - mi := &file_user_proto_msgTypes[13] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use ValidateResponse.ProtoReflect.Descriptor instead. -func (*ValidateResponse) Descriptor() ([]byte, []int) { - return file_user_proto_rawDescGZIP(), []int{13} -} - -func (x *ValidateResponse) GetError() string { - if x != nil { - return x.Error - } - return "" -} - -func (x *ValidateResponse) GetUserId() string { - if x != nil { - return x.UserId - } - return "" -} - -type LogInResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - User *User `protobuf:"bytes,1,opt,name=user,proto3" json:"user,omitempty"` - Token string `protobuf:"bytes,2,opt,name=token,proto3" json:"token,omitempty"` -} - -func (x *LogInResponse) Reset() { - *x = LogInResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_user_proto_msgTypes[14] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *LogInResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*LogInResponse) ProtoMessage() {} - -func (x *LogInResponse) ProtoReflect() protoreflect.Message { - mi := &file_user_proto_msgTypes[14] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use LogInResponse.ProtoReflect.Descriptor instead. -func (*LogInResponse) Descriptor() ([]byte, []int) { - return file_user_proto_rawDescGZIP(), []int{14} -} - -func (x *LogInResponse) GetUser() *User { - if x != nil { - return x.User - } - return nil -} - -func (x *LogInResponse) GetToken() string { - if x != nil { - return x.Token - } - return "" -} - -type ChangePasswordInput struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Token string `protobuf:"bytes,1,opt,name=token,proto3" json:"token,omitempty"` - OldPassword string `protobuf:"bytes,2,opt,name=oldPassword,proto3" json:"oldPassword,omitempty"` - NewPassword string `protobuf:"bytes,3,opt,name=newPassword,proto3" json:"newPassword,omitempty"` -} - -func (x *ChangePasswordInput) Reset() { - *x = ChangePasswordInput{} - if protoimpl.UnsafeEnabled { - mi := &file_user_proto_msgTypes[15] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *ChangePasswordInput) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*ChangePasswordInput) ProtoMessage() {} - -func (x *ChangePasswordInput) ProtoReflect() protoreflect.Message { - mi := &file_user_proto_msgTypes[15] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use ChangePasswordInput.ProtoReflect.Descriptor instead. -func (*ChangePasswordInput) Descriptor() ([]byte, []int) { - return file_user_proto_rawDescGZIP(), []int{15} -} - -func (x *ChangePasswordInput) GetToken() string { - if x != nil { - return x.Token - } - return "" -} - -func (x *ChangePasswordInput) GetOldPassword() string { - if x != nil { - return x.OldPassword - } - return "" -} - -func (x *ChangePasswordInput) GetNewPassword() string { - if x != nil { - return x.NewPassword - } - return "" -} - -type ChangePasswordOutput struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - User *User `protobuf:"bytes,1,opt,name=user,proto3" json:"user,omitempty"` - Error string `protobuf:"bytes,2,opt,name=error,proto3" json:"error,omitempty"` -} - -func (x *ChangePasswordOutput) Reset() { - *x = ChangePasswordOutput{} - if protoimpl.UnsafeEnabled { - mi := &file_user_proto_msgTypes[16] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *ChangePasswordOutput) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*ChangePasswordOutput) ProtoMessage() {} - -func (x *ChangePasswordOutput) ProtoReflect() protoreflect.Message { - mi := &file_user_proto_msgTypes[16] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use ChangePasswordOutput.ProtoReflect.Descriptor instead. -func (*ChangePasswordOutput) Descriptor() ([]byte, []int) { - return file_user_proto_rawDescGZIP(), []int{16} -} - -func (x *ChangePasswordOutput) GetUser() *User { - if x != nil { - return x.User - } - return nil -} - -func (x *ChangePasswordOutput) GetError() string { - if x != nil { - return x.Error - } - return "" -} - -type ChangeRoleInput struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Token string `protobuf:"bytes,1,opt,name=token,proto3" json:"token,omitempty"` - UserId string `protobuf:"bytes,2,opt,name=userId,proto3" json:"userId,omitempty"` - RoleCode string `protobuf:"bytes,3,opt,name=roleCode,proto3" json:"roleCode,omitempty"` -} - -func (x *ChangeRoleInput) Reset() { - *x = ChangeRoleInput{} - if protoimpl.UnsafeEnabled { - mi := &file_user_proto_msgTypes[17] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *ChangeRoleInput) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*ChangeRoleInput) ProtoMessage() {} - -func (x *ChangeRoleInput) ProtoReflect() protoreflect.Message { - mi := &file_user_proto_msgTypes[17] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use ChangeRoleInput.ProtoReflect.Descriptor instead. -func (*ChangeRoleInput) Descriptor() ([]byte, []int) { - return file_user_proto_rawDescGZIP(), []int{17} -} - -func (x *ChangeRoleInput) GetToken() string { - if x != nil { - return x.Token - } - return "" -} - -func (x *ChangeRoleInput) GetUserId() string { - if x != nil { - return x.UserId - } - return "" -} - -func (x *ChangeRoleInput) GetRoleCode() string { - if x != nil { - return x.RoleCode - } - return "" -} - -type DeleteUserOutput struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - User *User `protobuf:"bytes,1,opt,name=user,proto3" json:"user,omitempty"` - Error string `protobuf:"bytes,2,opt,name=error,proto3" json:"error,omitempty"` -} - -func (x *DeleteUserOutput) Reset() { - *x = DeleteUserOutput{} - if protoimpl.UnsafeEnabled { - mi := &file_user_proto_msgTypes[18] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *DeleteUserOutput) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*DeleteUserOutput) ProtoMessage() {} - -func (x *DeleteUserOutput) ProtoReflect() protoreflect.Message { - mi := &file_user_proto_msgTypes[18] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use DeleteUserOutput.ProtoReflect.Descriptor instead. -func (*DeleteUserOutput) Descriptor() ([]byte, []int) { - return file_user_proto_rawDescGZIP(), []int{18} -} - -func (x *DeleteUserOutput) GetUser() *User { - if x != nil { - return x.User - } - return nil -} - -func (x *DeleteUserOutput) GetError() string { - if x != nil { - return x.Error - } - return "" -} - -type ChangeRoleOutput struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - User *User `protobuf:"bytes,1,opt,name=user,proto3" json:"user,omitempty"` - Error string `protobuf:"bytes,2,opt,name=error,proto3" json:"error,omitempty"` -} - -func (x *ChangeRoleOutput) Reset() { - *x = ChangeRoleOutput{} - if protoimpl.UnsafeEnabled { - mi := &file_user_proto_msgTypes[19] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *ChangeRoleOutput) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*ChangeRoleOutput) ProtoMessage() {} - -func (x *ChangeRoleOutput) ProtoReflect() protoreflect.Message { - mi := &file_user_proto_msgTypes[19] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use ChangeRoleOutput.ProtoReflect.Descriptor instead. -func (*ChangeRoleOutput) Descriptor() ([]byte, []int) { - return file_user_proto_rawDescGZIP(), []int{19} -} - -func (x *ChangeRoleOutput) GetUser() *User { - if x != nil { - return x.User - } - return nil -} - -func (x *ChangeRoleOutput) GetError() string { - if x != nil { - return x.Error - } - return "" -} - -type MainAddressId struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` -} - -func (x *MainAddressId) Reset() { - *x = MainAddressId{} - if protoimpl.UnsafeEnabled { - mi := &file_user_proto_msgTypes[20] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *MainAddressId) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*MainAddressId) ProtoMessage() {} - -func (x *MainAddressId) ProtoReflect() protoreflect.Message { - mi := &file_user_proto_msgTypes[20] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use MainAddressId.ProtoReflect.Descriptor instead. -func (*MainAddressId) Descriptor() ([]byte, []int) { - return file_user_proto_rawDescGZIP(), []int{20} -} - -func (x *MainAddressId) GetId() string { - if x != nil { - return x.Id - } - return "" -} - -var File_user_proto protoreflect.FileDescriptor - -var file_user_proto_rawDesc = []byte{ - 0x0a, 0x0a, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x11, 0x63, 0x6f, - 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x1a, - 0x1b, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2f, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x40, 0x0a, 0x04, - 0x52, 0x6f, 0x6c, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, - 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x22, 0x8d, - 0x01, 0x0a, 0x0b, 0x4d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x0e, - 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x16, - 0x0a, 0x06, 0x73, 0x74, 0x72, 0x65, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, - 0x73, 0x74, 0x72, 0x65, 0x65, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x7a, 0x69, 0x70, 0x43, 0x6f, 0x64, - 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x7a, 0x69, 0x70, 0x43, 0x6f, 0x64, 0x65, - 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x07, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6c, 0x61, - 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x02, 0x52, 0x03, 0x6c, 0x61, 0x74, 0x12, 0x10, 0x0a, 0x03, - 0x6c, 0x6e, 0x67, 0x18, 0x06, 0x20, 0x01, 0x28, 0x02, 0x52, 0x03, 0x6c, 0x6e, 0x67, 0x22, 0xed, - 0x01, 0x0a, 0x04, 0x55, 0x73, 0x65, 0x72, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x66, 0x69, 0x72, 0x73, 0x74, - 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x66, 0x69, 0x72, - 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6c, 0x61, 0x73, 0x74, 0x4e, - 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x68, 0x6f, - 0x6e, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x68, 0x6f, 0x6e, 0x65, 0x12, - 0x40, 0x0a, 0x0b, 0x6d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, - 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x4d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, - 0x72, 0x65, 0x73, 0x73, 0x52, 0x0b, 0x6d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, - 0x73, 0x12, 0x2b, 0x0a, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x17, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, - 0x73, 0x65, 0x72, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x22, 0x54, - 0x0a, 0x0f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x49, 0x6e, 0x70, 0x75, - 0x74, 0x12, 0x2b, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x17, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, - 0x73, 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x12, 0x14, - 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, - 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x55, 0x0a, 0x10, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x55, 0x73, - 0x65, 0x72, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x2b, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, - 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, - 0x04, 0x75, 0x73, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x8e, 0x02, 0x0a, 0x0f, - 0x55, 0x73, 0x65, 0x72, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x12, - 0x1d, 0x0a, 0x0a, 0x66, 0x69, 0x72, 0x73, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x09, 0x66, 0x69, 0x72, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1b, - 0x0a, 0x09, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x6c, 0x61, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, - 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, - 0x6c, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x14, 0x0a, - 0x05, 0x70, 0x68, 0x6f, 0x6e, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x68, - 0x6f, 0x6e, 0x65, 0x12, 0x45, 0x0a, 0x0b, 0x6d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, - 0x73, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, - 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x4d, 0x61, 0x69, - 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x52, 0x0b, 0x6d, - 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x30, 0x0a, 0x04, 0x72, 0x6f, - 0x6c, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, - 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x52, 0x6f, 0x6c, - 0x65, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x52, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x22, 0x80, 0x01, 0x0a, - 0x10, 0x4d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x49, 0x6e, 0x70, 0x75, - 0x74, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x72, 0x65, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x06, 0x73, 0x74, 0x72, 0x65, 0x65, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x7a, 0x69, 0x70, - 0x43, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x7a, 0x69, 0x70, 0x43, - 0x6f, 0x64, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x20, 0x0a, - 0x0b, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, - 0x28, 0x05, 0x52, 0x0b, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x73, 0x22, - 0x1f, 0x0a, 0x09, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x12, 0x12, 0x0a, 0x04, - 0x63, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, - 0x22, 0x18, 0x0a, 0x06, 0x55, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x39, 0x0a, 0x08, 0x55, 0x73, - 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x2d, 0x0a, 0x05, 0x75, 0x73, 0x65, 0x72, 0x73, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, - 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x05, - 0x75, 0x73, 0x65, 0x72, 0x73, 0x22, 0x56, 0x0a, 0x0a, 0x6c, 0x6f, 0x67, 0x49, 0x6e, 0x49, 0x6e, - 0x70, 0x75, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x65, - 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, - 0x6c, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x22, 0x25, 0x0a, - 0x0d, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x12, 0x14, - 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, - 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x3b, 0x0a, 0x0b, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x49, 0x6e, - 0x70, 0x75, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x75, 0x73, 0x65, - 0x72, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, - 0x64, 0x22, 0x40, 0x0a, 0x10, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x75, - 0x73, 0x65, 0x72, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, - 0x72, 0x49, 0x64, 0x22, 0x52, 0x0a, 0x0d, 0x6c, 0x6f, 0x67, 0x49, 0x6e, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2b, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, - 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x04, 0x75, 0x73, 0x65, - 0x72, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x6f, 0x0a, 0x13, 0x63, 0x68, 0x61, 0x6e, 0x67, - 0x65, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x12, 0x14, - 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, - 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x6f, 0x6c, 0x64, 0x50, 0x61, 0x73, 0x73, 0x77, - 0x6f, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x6f, 0x6c, 0x64, 0x50, 0x61, - 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x6e, 0x65, 0x77, 0x50, 0x61, 0x73, - 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x6e, 0x65, 0x77, - 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x22, 0x59, 0x0a, 0x14, 0x63, 0x68, 0x61, 0x6e, - 0x67, 0x65, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, - 0x12, 0x2b, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, - 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, - 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x12, 0x14, 0x0a, - 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, - 0x72, 0x6f, 0x72, 0x22, 0x5b, 0x0a, 0x0f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x6f, 0x6c, - 0x65, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x16, 0x0a, 0x06, - 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, - 0x65, 0x72, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x43, 0x6f, 0x64, 0x65, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x43, 0x6f, 0x64, 0x65, - 0x22, 0x55, 0x0a, 0x10, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x4f, 0x75, - 0x74, 0x70, 0x75, 0x74, 0x12, 0x2b, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, - 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x04, 0x75, 0x73, 0x65, - 0x72, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x55, 0x0a, 0x10, 0x63, 0x68, 0x61, 0x6e, 0x67, - 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x2b, 0x0a, 0x04, 0x75, - 0x73, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, - 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, 0x73, - 0x65, 0x72, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, - 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x1f, - 0x0a, 0x0d, 0x4d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x49, 0x64, 0x12, - 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x32, - 0xe9, 0x05, 0x0a, 0x0b, 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, - 0x49, 0x0a, 0x08, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x12, 0x22, 0x2e, 0x63, 0x6f, - 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, - 0x55, 0x73, 0x65, 0x72, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, - 0x17, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, - 0x73, 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x47, 0x65, - 0x74, 0x55, 0x73, 0x65, 0x72, 0x12, 0x19, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, - 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x49, 0x64, - 0x1a, 0x17, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, - 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0a, 0x55, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x12, 0x22, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, - 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x23, 0x2e, - 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, - 0x72, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x4f, 0x75, 0x74, 0x70, - 0x75, 0x74, 0x22, 0x00, 0x12, 0x53, 0x0a, 0x0a, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x55, 0x73, - 0x65, 0x72, 0x12, 0x1e, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, - 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x49, 0x6e, 0x70, - 0x75, 0x74, 0x1a, 0x23, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, - 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x55, 0x73, 0x65, - 0x72, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x41, 0x0a, 0x08, 0x4c, 0x69, 0x73, - 0x74, 0x55, 0x73, 0x65, 0x72, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1b, 0x2e, - 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, - 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x22, 0x00, 0x12, 0x4a, 0x0a, 0x05, - 0x4c, 0x6f, 0x67, 0x49, 0x6e, 0x12, 0x1d, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, - 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x6c, 0x6f, 0x67, 0x49, 0x6e, 0x49, - 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x20, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, - 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x6c, 0x6f, 0x67, 0x49, 0x6e, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x53, 0x0a, 0x08, 0x56, 0x61, 0x6c, 0x69, - 0x64, 0x61, 0x74, 0x65, 0x12, 0x20, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, - 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, - 0x65, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x23, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, - 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x76, 0x61, 0x6c, 0x69, 0x64, - 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x63, 0x0a, - 0x0e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, - 0x26, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, - 0x73, 0x65, 0x72, 0x2e, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, - 0x72, 0x64, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x27, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, - 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x63, 0x68, 0x61, 0x6e, - 0x67, 0x65, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, - 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0a, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x6f, 0x6c, 0x65, - 0x12, 0x22, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, - 0x75, 0x73, 0x65, 0x72, 0x2e, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x49, - 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x23, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, - 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, - 0x6f, 0x6c, 0x65, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x32, 0xbb, 0x01, 0x0a, 0x12, - 0x4d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x53, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x12, 0x54, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x4d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, - 0x72, 0x65, 0x73, 0x73, 0x12, 0x20, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, - 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x4d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, - 0x72, 0x65, 0x73, 0x73, 0x49, 0x64, 0x1a, 0x1e, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, - 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x4d, 0x61, 0x69, 0x6e, 0x41, - 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x22, 0x00, 0x12, 0x4f, 0x0a, 0x11, 0x44, 0x65, 0x6c, 0x65, - 0x74, 0x65, 0x4d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x20, 0x2e, - 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, - 0x72, 0x2e, 0x4d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x49, 0x64, 0x1a, - 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x42, 0x03, 0x5a, 0x01, 0x2e, 0x62, 0x06, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, -} - -var ( - file_user_proto_rawDescOnce sync.Once - file_user_proto_rawDescData = file_user_proto_rawDesc -) - -func file_user_proto_rawDescGZIP() []byte { - file_user_proto_rawDescOnce.Do(func() { - file_user_proto_rawDescData = protoimpl.X.CompressGZIP(file_user_proto_rawDescData) - }) - return file_user_proto_rawDescData -} - -var file_user_proto_msgTypes = make([]protoimpl.MessageInfo, 21) -var file_user_proto_goTypes = []interface{}{ - (*Role)(nil), // 0: com.goodfood.user.Role - (*MainAddress)(nil), // 1: com.goodfood.user.MainAddress - (*User)(nil), // 2: com.goodfood.user.User - (*UpdateUserInput)(nil), // 3: com.goodfood.user.UpdateUserInput - (*UpdateUserOutput)(nil), // 4: com.goodfood.user.UpdateUserOutput - (*UserCreateInput)(nil), // 5: com.goodfood.user.UserCreateInput - (*MainAddressInput)(nil), // 6: com.goodfood.user.MainAddressInput - (*RoleInput)(nil), // 7: com.goodfood.user.RoleInput - (*UserId)(nil), // 8: com.goodfood.user.UserId - (*UserList)(nil), // 9: com.goodfood.user.UserList - (*LogInInput)(nil), // 10: com.goodfood.user.logInInput - (*ValidateInput)(nil), // 11: com.goodfood.user.validateInput - (*DeleteInput)(nil), // 12: com.goodfood.user.DeleteInput - (*ValidateResponse)(nil), // 13: com.goodfood.user.validateResponse - (*LogInResponse)(nil), // 14: com.goodfood.user.logInResponse - (*ChangePasswordInput)(nil), // 15: com.goodfood.user.changePasswordInput - (*ChangePasswordOutput)(nil), // 16: com.goodfood.user.changePasswordOutput - (*ChangeRoleInput)(nil), // 17: com.goodfood.user.changeRoleInput - (*DeleteUserOutput)(nil), // 18: com.goodfood.user.DeleteUserOutput - (*ChangeRoleOutput)(nil), // 19: com.goodfood.user.changeRoleOutput - (*MainAddressId)(nil), // 20: com.goodfood.user.MainAddressId - (*empty.Empty)(nil), // 21: google.protobuf.Empty -} -var file_user_proto_depIdxs = []int32{ - 1, // 0: com.goodfood.user.User.mainAddress:type_name -> com.goodfood.user.MainAddress - 0, // 1: com.goodfood.user.User.role:type_name -> com.goodfood.user.Role - 2, // 2: com.goodfood.user.UpdateUserInput.user:type_name -> com.goodfood.user.User - 2, // 3: com.goodfood.user.UpdateUserOutput.user:type_name -> com.goodfood.user.User - 6, // 4: com.goodfood.user.UserCreateInput.mainAddress:type_name -> com.goodfood.user.MainAddressInput - 7, // 5: com.goodfood.user.UserCreateInput.role:type_name -> com.goodfood.user.RoleInput - 2, // 6: com.goodfood.user.UserList.users:type_name -> com.goodfood.user.User - 2, // 7: com.goodfood.user.logInResponse.user:type_name -> com.goodfood.user.User - 2, // 8: com.goodfood.user.changePasswordOutput.user:type_name -> com.goodfood.user.User - 2, // 9: com.goodfood.user.DeleteUserOutput.user:type_name -> com.goodfood.user.User - 2, // 10: com.goodfood.user.changeRoleOutput.user:type_name -> com.goodfood.user.User - 5, // 11: com.goodfood.user.UserService.Register:input_type -> com.goodfood.user.UserCreateInput - 8, // 12: com.goodfood.user.UserService.GetUser:input_type -> com.goodfood.user.UserId - 3, // 13: com.goodfood.user.UserService.UpdateUser:input_type -> com.goodfood.user.UpdateUserInput - 12, // 14: com.goodfood.user.UserService.DeleteUser:input_type -> com.goodfood.user.DeleteInput - 21, // 15: com.goodfood.user.UserService.ListUser:input_type -> google.protobuf.Empty - 10, // 16: com.goodfood.user.UserService.LogIn:input_type -> com.goodfood.user.logInInput - 11, // 17: com.goodfood.user.UserService.Validate:input_type -> com.goodfood.user.validateInput - 15, // 18: com.goodfood.user.UserService.ChangePassword:input_type -> com.goodfood.user.changePasswordInput - 17, // 19: com.goodfood.user.UserService.ChangeRole:input_type -> com.goodfood.user.changeRoleInput - 20, // 20: com.goodfood.user.MainAddressService.GetMainAddress:input_type -> com.goodfood.user.MainAddressId - 20, // 21: com.goodfood.user.MainAddressService.DeleteMainAddress:input_type -> com.goodfood.user.MainAddressId - 2, // 22: com.goodfood.user.UserService.Register:output_type -> com.goodfood.user.User - 2, // 23: com.goodfood.user.UserService.GetUser:output_type -> com.goodfood.user.User - 4, // 24: com.goodfood.user.UserService.UpdateUser:output_type -> com.goodfood.user.UpdateUserOutput - 18, // 25: com.goodfood.user.UserService.DeleteUser:output_type -> com.goodfood.user.DeleteUserOutput - 9, // 26: com.goodfood.user.UserService.ListUser:output_type -> com.goodfood.user.UserList - 14, // 27: com.goodfood.user.UserService.LogIn:output_type -> com.goodfood.user.logInResponse - 13, // 28: com.goodfood.user.UserService.Validate:output_type -> com.goodfood.user.validateResponse - 16, // 29: com.goodfood.user.UserService.ChangePassword:output_type -> com.goodfood.user.changePasswordOutput - 19, // 30: com.goodfood.user.UserService.ChangeRole:output_type -> com.goodfood.user.changeRoleOutput - 1, // 31: com.goodfood.user.MainAddressService.GetMainAddress:output_type -> com.goodfood.user.MainAddress - 21, // 32: com.goodfood.user.MainAddressService.DeleteMainAddress:output_type -> google.protobuf.Empty - 22, // [22:33] is the sub-list for method output_type - 11, // [11:22] is the sub-list for method input_type - 11, // [11:11] is the sub-list for extension type_name - 11, // [11:11] is the sub-list for extension extendee - 0, // [0:11] is the sub-list for field type_name -} - -func init() { file_user_proto_init() } -func file_user_proto_init() { - if File_user_proto != nil { - return - } - if !protoimpl.UnsafeEnabled { - file_user_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Role); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_user_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MainAddress); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_user_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*User); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_user_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UpdateUserInput); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_user_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UpdateUserOutput); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_user_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UserCreateInput); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_user_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MainAddressInput); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_user_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RoleInput); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_user_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UserId); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_user_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UserList); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_user_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*LogInInput); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_user_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ValidateInput); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_user_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteInput); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_user_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ValidateResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_user_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*LogInResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_user_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ChangePasswordInput); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_user_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ChangePasswordOutput); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_user_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ChangeRoleInput); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_user_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteUserOutput); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_user_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ChangeRoleOutput); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_user_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MainAddressId); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - } - type x struct{} - out := protoimpl.TypeBuilder{ - File: protoimpl.DescBuilder{ - GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_user_proto_rawDesc, - NumEnums: 0, - NumMessages: 21, - NumExtensions: 0, - NumServices: 2, - }, - GoTypes: file_user_proto_goTypes, - DependencyIndexes: file_user_proto_depIdxs, - MessageInfos: file_user_proto_msgTypes, - }.Build() - File_user_proto = out.File - file_user_proto_rawDesc = nil - file_user_proto_goTypes = nil - file_user_proto_depIdxs = nil -} diff --git a/services/proto/user.proto b/services/proto/user.proto index 213adf29..473759e1 100644 --- a/services/proto/user.proto +++ b/services/proto/user.proto @@ -27,8 +27,10 @@ message User { string last_name = 3; string email = 4; string phone = 5; - MainAddress mainAddress = 6; - Role role = 7; + string MainAddressId = 6; + MainAddress mainAddress = 7; + string RoleId = 8; + Role role = 9; } message UpdateUserInput { diff --git a/services/proto/user_grpc.pb.go b/services/proto/user_grpc.pb.go deleted file mode 100644 index 70673da5..00000000 --- a/services/proto/user_grpc.pb.go +++ /dev/null @@ -1,516 +0,0 @@ -// Code generated by protoc-gen-go-grpc. DO NOT EDIT. -// versions: -// - protoc-gen-go-grpc v1.2.0 -// - protoc v3.12.4 -// source: user.proto - -package __ - -import ( - context "context" - empty "github.com/golang/protobuf/ptypes/empty" - grpc "google.golang.org/grpc" - codes "google.golang.org/grpc/codes" - status "google.golang.org/grpc/status" -) - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the grpc package it is being compiled against. -// Requires gRPC-Go v1.32.0 or later. -const _ = grpc.SupportPackageIsVersion7 - -// UserServiceClient is the client API for UserService service. -// -// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. -type UserServiceClient interface { - Register(ctx context.Context, in *UserCreateInput, opts ...grpc.CallOption) (*User, error) - GetUser(ctx context.Context, in *UserId, opts ...grpc.CallOption) (*User, error) - UpdateUser(ctx context.Context, in *UpdateUserInput, opts ...grpc.CallOption) (*UpdateUserOutput, error) - DeleteUser(ctx context.Context, in *DeleteInput, opts ...grpc.CallOption) (*DeleteUserOutput, error) - ListUser(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*UserList, error) - LogIn(ctx context.Context, in *LogInInput, opts ...grpc.CallOption) (*LogInResponse, error) - Validate(ctx context.Context, in *ValidateInput, opts ...grpc.CallOption) (*ValidateResponse, error) - ChangePassword(ctx context.Context, in *ChangePasswordInput, opts ...grpc.CallOption) (*ChangePasswordOutput, error) - ChangeRole(ctx context.Context, in *ChangeRoleInput, opts ...grpc.CallOption) (*ChangeRoleOutput, error) -} - -type userServiceClient struct { - cc grpc.ClientConnInterface -} - -func NewUserServiceClient(cc grpc.ClientConnInterface) UserServiceClient { - return &userServiceClient{cc} -} - -func (c *userServiceClient) Register(ctx context.Context, in *UserCreateInput, opts ...grpc.CallOption) (*User, error) { - out := new(User) - err := c.cc.Invoke(ctx, "/com.goodfood.user.UserService/Register", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *userServiceClient) GetUser(ctx context.Context, in *UserId, opts ...grpc.CallOption) (*User, error) { - out := new(User) - err := c.cc.Invoke(ctx, "/com.goodfood.user.UserService/GetUser", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *userServiceClient) UpdateUser(ctx context.Context, in *UpdateUserInput, opts ...grpc.CallOption) (*UpdateUserOutput, error) { - out := new(UpdateUserOutput) - err := c.cc.Invoke(ctx, "/com.goodfood.user.UserService/UpdateUser", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *userServiceClient) DeleteUser(ctx context.Context, in *DeleteInput, opts ...grpc.CallOption) (*DeleteUserOutput, error) { - out := new(DeleteUserOutput) - err := c.cc.Invoke(ctx, "/com.goodfood.user.UserService/DeleteUser", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *userServiceClient) ListUser(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*UserList, error) { - out := new(UserList) - err := c.cc.Invoke(ctx, "/com.goodfood.user.UserService/ListUser", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *userServiceClient) LogIn(ctx context.Context, in *LogInInput, opts ...grpc.CallOption) (*LogInResponse, error) { - out := new(LogInResponse) - err := c.cc.Invoke(ctx, "/com.goodfood.user.UserService/LogIn", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *userServiceClient) Validate(ctx context.Context, in *ValidateInput, opts ...grpc.CallOption) (*ValidateResponse, error) { - out := new(ValidateResponse) - err := c.cc.Invoke(ctx, "/com.goodfood.user.UserService/Validate", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *userServiceClient) ChangePassword(ctx context.Context, in *ChangePasswordInput, opts ...grpc.CallOption) (*ChangePasswordOutput, error) { - out := new(ChangePasswordOutput) - err := c.cc.Invoke(ctx, "/com.goodfood.user.UserService/ChangePassword", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *userServiceClient) ChangeRole(ctx context.Context, in *ChangeRoleInput, opts ...grpc.CallOption) (*ChangeRoleOutput, error) { - out := new(ChangeRoleOutput) - err := c.cc.Invoke(ctx, "/com.goodfood.user.UserService/ChangeRole", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -// UserServiceServer is the server API for UserService service. -// All implementations must embed UnimplementedUserServiceServer -// for forward compatibility -type UserServiceServer interface { - Register(context.Context, *UserCreateInput) (*User, error) - GetUser(context.Context, *UserId) (*User, error) - UpdateUser(context.Context, *UpdateUserInput) (*UpdateUserOutput, error) - DeleteUser(context.Context, *DeleteInput) (*DeleteUserOutput, error) - ListUser(context.Context, *empty.Empty) (*UserList, error) - LogIn(context.Context, *LogInInput) (*LogInResponse, error) - Validate(context.Context, *ValidateInput) (*ValidateResponse, error) - ChangePassword(context.Context, *ChangePasswordInput) (*ChangePasswordOutput, error) - ChangeRole(context.Context, *ChangeRoleInput) (*ChangeRoleOutput, error) - mustEmbedUnimplementedUserServiceServer() -} - -// UnimplementedUserServiceServer must be embedded to have forward compatible implementations. -type UnimplementedUserServiceServer struct { -} - -func (UnimplementedUserServiceServer) Register(context.Context, *UserCreateInput) (*User, error) { - return nil, status.Errorf(codes.Unimplemented, "method Register not implemented") -} -func (UnimplementedUserServiceServer) GetUser(context.Context, *UserId) (*User, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetUser not implemented") -} -func (UnimplementedUserServiceServer) UpdateUser(context.Context, *UpdateUserInput) (*UpdateUserOutput, error) { - return nil, status.Errorf(codes.Unimplemented, "method UpdateUser not implemented") -} -func (UnimplementedUserServiceServer) DeleteUser(context.Context, *DeleteInput) (*DeleteUserOutput, error) { - return nil, status.Errorf(codes.Unimplemented, "method DeleteUser not implemented") -} -func (UnimplementedUserServiceServer) ListUser(context.Context, *empty.Empty) (*UserList, error) { - return nil, status.Errorf(codes.Unimplemented, "method ListUser not implemented") -} -func (UnimplementedUserServiceServer) LogIn(context.Context, *LogInInput) (*LogInResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method LogIn not implemented") -} -func (UnimplementedUserServiceServer) Validate(context.Context, *ValidateInput) (*ValidateResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method Validate not implemented") -} -func (UnimplementedUserServiceServer) ChangePassword(context.Context, *ChangePasswordInput) (*ChangePasswordOutput, error) { - return nil, status.Errorf(codes.Unimplemented, "method ChangePassword not implemented") -} -func (UnimplementedUserServiceServer) ChangeRole(context.Context, *ChangeRoleInput) (*ChangeRoleOutput, error) { - return nil, status.Errorf(codes.Unimplemented, "method ChangeRole not implemented") -} -func (UnimplementedUserServiceServer) mustEmbedUnimplementedUserServiceServer() {} - -// UnsafeUserServiceServer may be embedded to opt out of forward compatibility for this service. -// Use of this interface is not recommended, as added methods to UserServiceServer will -// result in compilation errors. -type UnsafeUserServiceServer interface { - mustEmbedUnimplementedUserServiceServer() -} - -func RegisterUserServiceServer(s grpc.ServiceRegistrar, srv UserServiceServer) { - s.RegisterService(&UserService_ServiceDesc, srv) -} - -func _UserService_Register_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(UserCreateInput) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(UserServiceServer).Register(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/com.goodfood.user.UserService/Register", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(UserServiceServer).Register(ctx, req.(*UserCreateInput)) - } - return interceptor(ctx, in, info, handler) -} - -func _UserService_GetUser_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(UserId) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(UserServiceServer).GetUser(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/com.goodfood.user.UserService/GetUser", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(UserServiceServer).GetUser(ctx, req.(*UserId)) - } - return interceptor(ctx, in, info, handler) -} - -func _UserService_UpdateUser_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(UpdateUserInput) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(UserServiceServer).UpdateUser(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/com.goodfood.user.UserService/UpdateUser", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(UserServiceServer).UpdateUser(ctx, req.(*UpdateUserInput)) - } - return interceptor(ctx, in, info, handler) -} - -func _UserService_DeleteUser_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(DeleteInput) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(UserServiceServer).DeleteUser(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/com.goodfood.user.UserService/DeleteUser", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(UserServiceServer).DeleteUser(ctx, req.(*DeleteInput)) - } - return interceptor(ctx, in, info, handler) -} - -func _UserService_ListUser_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(empty.Empty) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(UserServiceServer).ListUser(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/com.goodfood.user.UserService/ListUser", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(UserServiceServer).ListUser(ctx, req.(*empty.Empty)) - } - return interceptor(ctx, in, info, handler) -} - -func _UserService_LogIn_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(LogInInput) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(UserServiceServer).LogIn(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/com.goodfood.user.UserService/LogIn", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(UserServiceServer).LogIn(ctx, req.(*LogInInput)) - } - return interceptor(ctx, in, info, handler) -} - -func _UserService_Validate_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(ValidateInput) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(UserServiceServer).Validate(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/com.goodfood.user.UserService/Validate", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(UserServiceServer).Validate(ctx, req.(*ValidateInput)) - } - return interceptor(ctx, in, info, handler) -} - -func _UserService_ChangePassword_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(ChangePasswordInput) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(UserServiceServer).ChangePassword(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/com.goodfood.user.UserService/ChangePassword", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(UserServiceServer).ChangePassword(ctx, req.(*ChangePasswordInput)) - } - return interceptor(ctx, in, info, handler) -} - -func _UserService_ChangeRole_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(ChangeRoleInput) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(UserServiceServer).ChangeRole(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/com.goodfood.user.UserService/ChangeRole", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(UserServiceServer).ChangeRole(ctx, req.(*ChangeRoleInput)) - } - return interceptor(ctx, in, info, handler) -} - -// UserService_ServiceDesc is the grpc.ServiceDesc for UserService service. -// It's only intended for direct use with grpc.RegisterService, -// and not to be introspected or modified (even as a copy) -var UserService_ServiceDesc = grpc.ServiceDesc{ - ServiceName: "com.goodfood.user.UserService", - HandlerType: (*UserServiceServer)(nil), - Methods: []grpc.MethodDesc{ - { - MethodName: "Register", - Handler: _UserService_Register_Handler, - }, - { - MethodName: "GetUser", - Handler: _UserService_GetUser_Handler, - }, - { - MethodName: "UpdateUser", - Handler: _UserService_UpdateUser_Handler, - }, - { - MethodName: "DeleteUser", - Handler: _UserService_DeleteUser_Handler, - }, - { - MethodName: "ListUser", - Handler: _UserService_ListUser_Handler, - }, - { - MethodName: "LogIn", - Handler: _UserService_LogIn_Handler, - }, - { - MethodName: "Validate", - Handler: _UserService_Validate_Handler, - }, - { - MethodName: "ChangePassword", - Handler: _UserService_ChangePassword_Handler, - }, - { - MethodName: "ChangeRole", - Handler: _UserService_ChangeRole_Handler, - }, - }, - Streams: []grpc.StreamDesc{}, - Metadata: "user.proto", -} - -// MainAddressServiceClient is the client API for MainAddressService service. -// -// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. -type MainAddressServiceClient interface { - GetMainAddress(ctx context.Context, in *MainAddressId, opts ...grpc.CallOption) (*MainAddress, error) - DeleteMainAddress(ctx context.Context, in *MainAddressId, opts ...grpc.CallOption) (*empty.Empty, error) -} - -type mainAddressServiceClient struct { - cc grpc.ClientConnInterface -} - -func NewMainAddressServiceClient(cc grpc.ClientConnInterface) MainAddressServiceClient { - return &mainAddressServiceClient{cc} -} - -func (c *mainAddressServiceClient) GetMainAddress(ctx context.Context, in *MainAddressId, opts ...grpc.CallOption) (*MainAddress, error) { - out := new(MainAddress) - err := c.cc.Invoke(ctx, "/com.goodfood.user.MainAddressService/GetMainAddress", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *mainAddressServiceClient) DeleteMainAddress(ctx context.Context, in *MainAddressId, opts ...grpc.CallOption) (*empty.Empty, error) { - out := new(empty.Empty) - err := c.cc.Invoke(ctx, "/com.goodfood.user.MainAddressService/DeleteMainAddress", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -// MainAddressServiceServer is the server API for MainAddressService service. -// All implementations must embed UnimplementedMainAddressServiceServer -// for forward compatibility -type MainAddressServiceServer interface { - GetMainAddress(context.Context, *MainAddressId) (*MainAddress, error) - DeleteMainAddress(context.Context, *MainAddressId) (*empty.Empty, error) - mustEmbedUnimplementedMainAddressServiceServer() -} - -// UnimplementedMainAddressServiceServer must be embedded to have forward compatible implementations. -type UnimplementedMainAddressServiceServer struct { -} - -func (UnimplementedMainAddressServiceServer) GetMainAddress(context.Context, *MainAddressId) (*MainAddress, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetMainAddress not implemented") -} -func (UnimplementedMainAddressServiceServer) DeleteMainAddress(context.Context, *MainAddressId) (*empty.Empty, error) { - return nil, status.Errorf(codes.Unimplemented, "method DeleteMainAddress not implemented") -} -func (UnimplementedMainAddressServiceServer) mustEmbedUnimplementedMainAddressServiceServer() {} - -// UnsafeMainAddressServiceServer may be embedded to opt out of forward compatibility for this service. -// Use of this interface is not recommended, as added methods to MainAddressServiceServer will -// result in compilation errors. -type UnsafeMainAddressServiceServer interface { - mustEmbedUnimplementedMainAddressServiceServer() -} - -func RegisterMainAddressServiceServer(s grpc.ServiceRegistrar, srv MainAddressServiceServer) { - s.RegisterService(&MainAddressService_ServiceDesc, srv) -} - -func _MainAddressService_GetMainAddress_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(MainAddressId) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(MainAddressServiceServer).GetMainAddress(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/com.goodfood.user.MainAddressService/GetMainAddress", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(MainAddressServiceServer).GetMainAddress(ctx, req.(*MainAddressId)) - } - return interceptor(ctx, in, info, handler) -} - -func _MainAddressService_DeleteMainAddress_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(MainAddressId) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(MainAddressServiceServer).DeleteMainAddress(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/com.goodfood.user.MainAddressService/DeleteMainAddress", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(MainAddressServiceServer).DeleteMainAddress(ctx, req.(*MainAddressId)) - } - return interceptor(ctx, in, info, handler) -} - -// MainAddressService_ServiceDesc is the grpc.ServiceDesc for MainAddressService service. -// It's only intended for direct use with grpc.RegisterService, -// and not to be introspected or modified (even as a copy) -var MainAddressService_ServiceDesc = grpc.ServiceDesc{ - ServiceName: "com.goodfood.user.MainAddressService", - HandlerType: (*MainAddressServiceServer)(nil), - Methods: []grpc.MethodDesc{ - { - MethodName: "GetMainAddress", - Handler: _MainAddressService_GetMainAddress_Handler, - }, - { - MethodName: "DeleteMainAddress", - Handler: _MainAddressService_DeleteMainAddress_Handler, - }, - }, - Streams: []grpc.StreamDesc{}, - Metadata: "user.proto", -} From aad44569f223554e2a4cc24c40b6d525ebd3bc37 Mon Sep 17 00:00:00 2001 From: Florian LEROUX Date: Mon, 3 Jul 2023 14:56:01 +0200 Subject: [PATCH 151/883] feat(logger): add amqp logger --- services/reporting/Libraries/RabbitMQ.cs | 11 ++++++++++- services/reporting/Models/Metric.cs | 11 +++++++++++ .../Services/GRPC/ReportingService.cs | 7 ++++--- .../Services/RabbitMQ/ReportingService.cs | 19 ++++++++++--------- services/reporting/Startup.cs | 3 +-- 5 files changed, 36 insertions(+), 15 deletions(-) diff --git a/services/reporting/Libraries/RabbitMQ.cs b/services/reporting/Libraries/RabbitMQ.cs index d9701382..0720eb07 100644 --- a/services/reporting/Libraries/RabbitMQ.cs +++ b/services/reporting/Libraries/RabbitMQ.cs @@ -36,7 +36,16 @@ public void Publish(string message) autoDelete: false, arguments: null); - var body = Encoding.UTF8.GetBytes(message); + byte[] body; + + if (_queueName == "log") + { + body = Encoding.UTF8.GetBytes("{\"event_message\":\"reporting-service\",\"metadata\":" + message + "}"); + } + else + { + body = Encoding.UTF8.GetBytes(message); + } _channel.BasicPublish(exchange: "", routingKey: _queueName, diff --git a/services/reporting/Models/Metric.cs b/services/reporting/Models/Metric.cs index 7bcab76b..6831aad4 100644 --- a/services/reporting/Models/Metric.cs +++ b/services/reporting/Models/Metric.cs @@ -65,6 +65,17 @@ public static List GetMetricsByRestaurantAndDate(string key, string date public Metric SaveMetric() { using ReportingContext db = new ReportingContext(); + // if already exists, upsert + if(db.Metrics.Any(m => m.Key == this.Key)) + { + Metric metric = db.Metrics.First(m => m.Key == this.Key); + metric.Value = this.Value; + + db.Metrics.Update(metric); + db.SaveChanges(); + return this; + } + db.Metrics.Add(this); db.SaveChanges(); return this; diff --git a/services/reporting/Services/GRPC/ReportingService.cs b/services/reporting/Services/GRPC/ReportingService.cs index 2d69eae6..fe920ae2 100644 --- a/services/reporting/Services/GRPC/ReportingService.cs +++ b/services/reporting/Services/GRPC/ReportingService.cs @@ -1,6 +1,7 @@ using Grpc.Core; using MetricModel = reporting.Models.Metric; using MetricGrpc = reporting.Metric; +using ReportingServiceAMQP = reporting.Services.RabbitMQ.ReportingService; namespace reporting.Services.GRPC; @@ -10,11 +11,12 @@ public class ReportingService : reporting.ReportingService.ReportingServiceBase { private readonly ILogger _logger; private readonly ReportingContext _db; + private readonly ReportingServiceAMQP _amqp; public ReportingService(ILogger logger) { _logger = logger; _db = new ReportingContext(); - + _amqp = new ReportingServiceAMQP(logger); } private void LogRequest(T request, ServerCallContext context) @@ -24,10 +26,9 @@ private void LogRequest(T request, ServerCallContext context) string RequestBody = request?.ToString() ?? "null"; _logger.LogInformation("\x1b[35m{Date}\x1b[0m | \x1b[36mGRPC\x1b[0m | \x1b[33m{Message}\x1b[0m\n", Date, Method + " with: " + RequestBody); + _amqp.LogRequest(request); } - - public override Task GetMetric(GetMetricRequest request, ServerCallContext context) { LogRequest(request, context); diff --git a/services/reporting/Services/RabbitMQ/ReportingService.cs b/services/reporting/Services/RabbitMQ/ReportingService.cs index f3afc206..e700c2c0 100644 --- a/services/reporting/Services/RabbitMQ/ReportingService.cs +++ b/services/reporting/Services/RabbitMQ/ReportingService.cs @@ -1,6 +1,5 @@ -using Grpc.Core; -using MetricModel = reporting.Models.Metric; -using MetricGrpc = reporting.Metric; +using reporting.Libraries.RabbitMQ; +using ReportingServiceGRPC = reporting.Services.GRPC.ReportingService; namespace reporting.Services.RabbitMQ; @@ -8,21 +7,23 @@ namespace reporting.Services.RabbitMQ; public class ReportingService : reporting.ReportingService.ReportingServiceBase { - private readonly ILogger _logger; - private readonly ReportingContext _db; - public ReportingService(ILogger logger) + + private readonly RabbitMQClient _client; + private readonly ILogger _logger; + public ReportingService(ILogger logger) { _logger = logger; - _db = new ReportingContext(); + _client = new RabbitMQClient("log"); } - private void LogRequest(T request) + public void LogRequest(T request) { string Date = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); string RequestBody = request?.ToString() ?? "null"; - _logger.LogInformation("\x1b[35m{Date}\x1b[0m | \x1b[31mAMQP\x1b[0m | \x1b[33m{Message}\x1b[0m\n", Date); + _logger.LogInformation("\x1b[35m{Date}\x1b[0m | \x1b[31mAMQP\x1b[0m | \x1b[33m{Message}\x1b[0m\n", Date, RequestBody); + _client.Publish(RequestBody); } diff --git a/services/reporting/Startup.cs b/services/reporting/Startup.cs index 25e9262d..4a310ad3 100644 --- a/services/reporting/Startup.cs +++ b/services/reporting/Startup.cs @@ -1,11 +1,10 @@ using reporting.Services.GRPC; -using reporting.Libraries.RabbitMQ; using System.Net; public class Startup { - private RabbitMQClient _logClient = new RabbitMQClient("log"); + public void ConfigureServices(IServiceCollection services) { From 8e9cfb9af8599577cb119b16774a2770de5e7817 Mon Sep 17 00:00:00 2001 From: Florian LEROUX Date: Mon, 3 Jul 2023 14:56:49 +0200 Subject: [PATCH 152/883] feat(docker): add global docker compose for log service --- docker-compose.log.yml | 47 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 docker-compose.log.yml diff --git a/docker-compose.log.yml b/docker-compose.log.yml new file mode 100644 index 00000000..c3d78ed8 --- /dev/null +++ b/docker-compose.log.yml @@ -0,0 +1,47 @@ +version: "3" +services: + goodfood-log: + image: floriaaan/goodfood-log + container_name: goodfood-log + restart: unless-stopped + ports: + - "50021:50021" + depends_on: + - log-postgres + - goodfood-rabbitmq + environment: + DATABASE_URL: postgres://postgres:password@log-postgres:5432/postgres + PORT: 50021 + AMQP_URL: amqp://guest:guest@goodfood-rabbitmq:5672 + networks: + - goodfood-log-network + + log-postgres: + image: postgres + container_name: log-postgres + restart: unless-stopped + environment: + POSTGRES_USER: postgres + POSTGRES_PASSWORD: password + POSTGRES_DB: postgres + volumes: + - log-postgres:/var/lib/postgresql/data + networks: + - goodfood-log-network + + goodfood-rabbitmq: + image: rabbitmq:3-management + container_name: goodfood-rabbitmq + restart: unless-stopped + ports: + - "15672:15672" + - "5672:5672" + networks: + - goodfood-log-network + +networks: + goodfood-log-network: + driver: bridge + +volumes: + log-postgres: From 15884a1ea21ace8e66d47ad6802980e2ddeff900 Mon Sep 17 00:00:00 2001 From: Florian LEROUX Date: Mon, 3 Jul 2023 14:57:03 +0200 Subject: [PATCH 153/883] doc(readme): add setup and tests --- services/reporting/README.md | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/services/reporting/README.md b/services/reporting/README.md index cbe3e8e0..c8d36170 100644 --- a/services/reporting/README.md +++ b/services/reporting/README.md @@ -34,3 +34,32 @@ You can use the following tools to help you with the setup: 1. Clone the `goodfood` repository to your local machine. 2. Navigate to the service directory (`services/reporting`) in your terminal. + +### 2. Setup the database + +1. Run the following command to create the database: + - `dotnet ef database update` + +### 3. Run the service + +1. Run the following command to start the service: + - `dotnet run` + +## Testing + +### Requests examples + +#### Pre-requisites + +Install `grpcurl` on your machine. + +1. Create a new report + +```sh +grpcurl -d '{ "restaurant_id": "restaurant_id:1", "code": "income_1h", "value": "99.99" }' \ + localhost:50020 com.goodfood.reporting.ReportingService.PushMetric +``` + +```json +{ "restaurant_id": "restaurant_id:1", "code": "income_1h", "value": "99.99" } +``` From 28604fe9d6a7d64375a872c288887bf69320840b Mon Sep 17 00:00:00 2001 From: Pierre Lebigre Date: Mon, 3 Jul 2023 15:49:52 +0200 Subject: [PATCH 154/883] Add image --- services/product/.env.example | 4 +- services/product/package-lock.json | 348 +++++++++++++++++++ services/product/src/handler/Image/upload.ts | 9 +- services/product/src/lib/storage.ts | 7 +- services/product/src/types/Product.d.ts | 1 + services/product/terraform/data.tf | 35 ++ services/product/terraform/main.tf | 5 + services/proto/product.proto | 3 +- 8 files changed, 402 insertions(+), 10 deletions(-) diff --git a/services/product/.env.example b/services/product/.env.example index 61429729..ca737d6e 100644 --- a/services/product/.env.example +++ b/services/product/.env.example @@ -1,4 +1,4 @@ DATABASE_URL="postgresql://postgres:postgres@127.0.0.1:5432/postgres" PORT = 50004 -REACT_APP_AZURE_STORAGE_SAS_TOKEN = "Token" -REACT_APP_AZURE_STORAGE_RESOURCE_NAME = "RessourceName" \ No newline at end of file +REACT_APP_AZURE_STORAGE_SAS_TOKEN = "example" +REACT_APP_AZURE_STORAGE_RESOURCE_NAME = "exemple" \ No newline at end of file diff --git a/services/product/package-lock.json b/services/product/package-lock.json index 8b3656c2..30bd75fa 100644 --- a/services/product/package-lock.json +++ b/services/product/package-lock.json @@ -7,13 +7,16 @@ "name": "@goodfood/product", "hasInstallScript": true, "dependencies": { + "@azure/storage-blob": "^12.14.0", "@grpc/grpc-js": "^1.8.14", "@grpc/proto-loader": "^0.7.6", "@prisma/client": "^4.11.0", "amqplib": "^0.10.3", + "base64-arraybuffer": "^1.0.2", "express": "^4.18.2", "nodemon": "^2.0.22", "pkg": "^5.8.1", + "sharp": "^0.32.1", "vite-tsconfig-paths": "^4.2.0" }, "bin": { @@ -41,6 +44,131 @@ "node": ">=0.8" } }, + "node_modules/@azure/abort-controller": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@azure/abort-controller/-/abort-controller-1.1.0.tgz", + "integrity": "sha512-TrRLIoSQVzfAJX9H1JeFjzAoDGcoK1IYX1UImfceTZpsyYfWr09Ss1aHW1y5TrrR3iq6RZLBwJ3E24uwPhwahw==", + "dependencies": { + "tslib": "^2.2.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/@azure/core-auth": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@azure/core-auth/-/core-auth-1.4.0.tgz", + "integrity": "sha512-HFrcTgmuSuukRf/EdPmqBrc5l6Q5Uu+2TbuhaKbgaCpP2TfAeiNaQPAadxO+CYBRHGUzIDteMAjFspFLDLnKVQ==", + "dependencies": { + "@azure/abort-controller": "^1.0.0", + "tslib": "^2.2.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/@azure/core-http": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@azure/core-http/-/core-http-3.0.2.tgz", + "integrity": "sha512-o1wR9JrmoM0xEAa0Ue7Sp8j+uJvmqYaGoHOCT5qaVYmvgmnZDC0OvQimPA/JR3u77Sz6D1y3Xmk1y69cDU9q9A==", + "dependencies": { + "@azure/abort-controller": "^1.0.0", + "@azure/core-auth": "^1.3.0", + "@azure/core-tracing": "1.0.0-preview.13", + "@azure/core-util": "^1.1.1", + "@azure/logger": "^1.0.0", + "@types/node-fetch": "^2.5.0", + "@types/tunnel": "^0.0.3", + "form-data": "^4.0.0", + "node-fetch": "^2.6.7", + "process": "^0.11.10", + "tslib": "^2.2.0", + "tunnel": "^0.0.6", + "uuid": "^8.3.0", + "xml2js": "^0.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@azure/core-lro": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/@azure/core-lro/-/core-lro-2.5.3.tgz", + "integrity": "sha512-ubkOf2YCnVtq7KqEJQqAI8dDD5rH1M6OP5kW0KO/JQyTaxLA0N0pjFWvvaysCj9eHMNBcuuoZXhhl0ypjod2DA==", + "dependencies": { + "@azure/abort-controller": "^1.0.0", + "@azure/core-util": "^1.2.0", + "@azure/logger": "^1.0.0", + "tslib": "^2.2.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@azure/core-paging": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@azure/core-paging/-/core-paging-1.5.0.tgz", + "integrity": "sha512-zqWdVIt+2Z+3wqxEOGzR5hXFZ8MGKK52x4vFLw8n58pR6ZfKRx3EXYTxTaYxYHc/PexPUTyimcTWFJbji9Z6Iw==", + "dependencies": { + "tslib": "^2.2.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@azure/core-tracing": { + "version": "1.0.0-preview.13", + "resolved": "https://registry.npmjs.org/@azure/core-tracing/-/core-tracing-1.0.0-preview.13.tgz", + "integrity": "sha512-KxDlhXyMlh2Jhj2ykX6vNEU0Vou4nHr025KoSEiz7cS3BNiHNaZcdECk/DmLkEB0as5T7b/TpRcehJ5yV6NeXQ==", + "dependencies": { + "@opentelemetry/api": "^1.0.1", + "tslib": "^2.2.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/@azure/core-util": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@azure/core-util/-/core-util-1.3.2.tgz", + "integrity": "sha512-2bECOUh88RvL1pMZTcc6OzfobBeWDBf5oBbhjIhT1MV9otMVWCzpOJkkiKtrnO88y5GGBelgY8At73KGAdbkeQ==", + "dependencies": { + "@azure/abort-controller": "^1.0.0", + "tslib": "^2.2.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@azure/logger": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@azure/logger/-/logger-1.0.4.tgz", + "integrity": "sha512-ustrPY8MryhloQj7OWGe+HrYx+aoiOxzbXTtgblbV3xwCqpzUK36phH3XNHQKj3EPonyFUuDTfR3qFhTEAuZEg==", + "dependencies": { + "tslib": "^2.2.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@azure/storage-blob": { + "version": "12.14.0", + "resolved": "https://registry.npmjs.org/@azure/storage-blob/-/storage-blob-12.14.0.tgz", + "integrity": "sha512-g8GNUDpMisGXzBeD+sKphhH5yLwesB4JkHr1U6be/X3F+cAMcyGLPD1P89g2M7wbEtUJWoikry1rlr83nNRBzg==", + "dependencies": { + "@azure/abort-controller": "^1.0.0", + "@azure/core-http": "^3.0.0", + "@azure/core-lro": "^2.2.0", + "@azure/core-paging": "^1.1.1", + "@azure/core-tracing": "1.0.0-preview.13", + "@azure/logger": "^1.0.0", + "events": "^3.0.0", + "tslib": "^2.2.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/@babel/generator": { "version": "7.18.2", "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.2.tgz", @@ -226,6 +354,14 @@ "node": ">= 8" } }, + "node_modules/@opentelemetry/api": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.4.1.tgz", + "integrity": "sha512-O2yRJce1GOc6PAy3QxFM4NzFiWzvScDC1/5ihYBL6BUEVdq0XMWN01sppE+H6bBXbaFYipjwFLEWLg5PaSOThA==", + "engines": { + "node": ">=8.0.0" + } + }, "node_modules/@prisma/client": { "version": "4.14.0", "resolved": "https://registry.npmjs.org/@prisma/client/-/client-4.14.0.tgz", @@ -355,6 +491,36 @@ "resolved": "https://registry.npmjs.org/@types/node/-/node-18.16.7.tgz", "integrity": "sha512-MFg7ua/bRtnA1hYE3pVyWxGd/r7aMqjNOdHvlSsXV3n8iaeGKkOaPzpJh6/ovf4bEXWcojkeMJpTsq3mzXW4IQ==" }, + "node_modules/@types/node-fetch": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.4.tgz", + "integrity": "sha512-1ZX9fcN4Rvkvgv4E6PAY5WXUFWFcRWxZa3EW83UjycOB9ljJCedb2CupIP4RZMEwF/M3eTcCihbBRgwtGbg5Rg==", + "dependencies": { + "@types/node": "*", + "form-data": "^3.0.0" + } + }, + "node_modules/@types/node-fetch/node_modules/form-data": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", + "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@types/tunnel": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/@types/tunnel/-/tunnel-0.0.3.tgz", + "integrity": "sha512-sOUTGn6h1SfQ+gbgqC364jLFBw2lnFqkgF3q0WovEHRLMrVD1sd5aufqi/aJObLekJO+Aq5z646U4Oxy6shXMA==", + "dependencies": { + "@types/node": "*" + } + }, "node_modules/abbrev": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", @@ -471,6 +637,11 @@ "node": ">=8" } }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, "node_modules/at-least-node": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", @@ -484,6 +655,14 @@ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, + "node_modules/base64-arraybuffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz", + "integrity": "sha512-I3yl4r9QB5ZRY3XuJVEPfc2XhZO6YweFPI+UovAzn+8/hb3oJ6lnysaFcjVpkCPfVWFUDvoZ8kmVDP7WyRtYtQ==", + "engines": { + "node": ">= 0.6.0" + } + }, "node_modules/base64-js": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", @@ -743,6 +922,18 @@ "node": ">=12" } }, + "node_modules/color": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", + "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==", + "dependencies": { + "color-convert": "^2.0.1", + "color-string": "^1.9.0" + }, + "engines": { + "node": ">=12.5.0" + } + }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -759,6 +950,26 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, + "node_modules/color-string": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", + "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", + "dependencies": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -864,6 +1075,14 @@ "node": ">=4.0.0" } }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/depd": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", @@ -956,6 +1175,14 @@ "node": ">= 0.6" } }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "engines": { + "node": ">=0.8.x" + } + }, "node_modules/expand-template": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", @@ -1101,6 +1328,19 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, + "node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/forwarded": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", @@ -1389,6 +1629,11 @@ "node": ">= 0.10" } }, + "node_modules/is-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" + }, "node_modules/is-binary-path": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", @@ -1724,6 +1969,11 @@ "node": ">=10" } }, + "node_modules/node-addon-api": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-6.1.0.tgz", + "integrity": "sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==" + }, "node_modules/node-fetch": { "version": "2.6.11", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.11.tgz", @@ -2013,6 +2263,14 @@ "node": ">=14.17" } }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "engines": { + "node": ">= 0.6.0" + } + }, "node_modules/process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", @@ -2257,6 +2515,11 @@ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, + "node_modules/sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" + }, "node_modules/semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", @@ -2325,6 +2588,42 @@ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" }, + "node_modules/sharp": { + "version": "0.32.1", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.32.1.tgz", + "integrity": "sha512-kQTFtj7ldpUqSe8kDxoGLZc1rnMFU0AO2pqbX6pLy3b7Oj8ivJIdoKNwxHVQG2HN6XpHPJqCSM2nsma2gOXvOg==", + "hasInstallScript": true, + "dependencies": { + "color": "^4.2.3", + "detect-libc": "^2.0.1", + "node-addon-api": "^6.1.0", + "prebuild-install": "^7.1.1", + "semver": "^7.5.0", + "simple-get": "^4.0.1", + "tar-fs": "^2.1.1", + "tunnel-agent": "^0.6.0" + }, + "engines": { + "node": ">=14.15.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/sharp/node_modules/semver": { + "version": "7.5.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.3.tgz", + "integrity": "sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/side-channel": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", @@ -2381,6 +2680,14 @@ "simple-concat": "^1.0.0" } }, + "node_modules/simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", + "dependencies": { + "is-arrayish": "^0.3.1" + } + }, "node_modules/simple-update-notifier": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-1.1.0.tgz", @@ -2704,6 +3011,19 @@ "node": ">=6" } }, + "node_modules/tslib": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.0.tgz", + "integrity": "sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA==" + }, + "node_modules/tunnel": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz", + "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==", + "engines": { + "node": ">=0.6.11 <=0.7.0 || >=0.7.3" + } + }, "node_modules/tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", @@ -2783,6 +3103,14 @@ "node": ">= 0.4.0" } }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, "node_modules/v8-compile-cache-lib": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", @@ -2850,6 +3178,26 @@ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" }, + "node_modules/xml2js": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.5.0.tgz", + "integrity": "sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==", + "dependencies": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/xmlbuilder": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", + "engines": { + "node": ">=4.0" + } + }, "node_modules/y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", diff --git a/services/product/src/handler/Image/upload.ts b/services/product/src/handler/Image/upload.ts index 9357871c..259e61b5 100644 --- a/services/product/src/handler/Image/upload.ts +++ b/services/product/src/handler/Image/upload.ts @@ -5,7 +5,7 @@ import { log } from "@product/lib/log"; import { ServerErrorResponse } from "@grpc/grpc-js"; import { decode } from "base64-arraybuffer"; import sharp from "sharp"; -import { File } from "buffer"; +import { File } from "node:buffer"; export const UploadImage = async ( { request }: Data, @@ -14,7 +14,6 @@ export const UploadImage = async ( log.debug("Request received at UploadImage handler\n", request); try { const image = request.data as string; - log.debug(image); if (!image) throw(Error("No image provided") as ServerErrorResponse); @@ -24,6 +23,7 @@ export const UploadImage = async ( if (!contentType || !base64FileData) throw(Error("Image data not valid") as ServerErrorResponse); + log.debug(contentType); // Resize image and compress const buffer = decode(base64FileData); @@ -40,8 +40,8 @@ export const UploadImage = async ( .toBuffer(); // Upload image - const fileName = `test`; - const ext = "webp"; //contentType.split("/")[1]; + const fileName = request.name; + const ext = contentType.split("/")[1]; const path = `${fileName}.${ext}`; const file = { @@ -49,6 +49,7 @@ export const UploadImage = async ( type: ext, arrayBuffer: resizedBuffer, } as unknown as File; + log.debug(file); const url = { path : await uploadFileToBlob(file) } as Url; diff --git a/services/product/src/lib/storage.ts b/services/product/src/lib/storage.ts index 3a574161..5db74517 100644 --- a/services/product/src/lib/storage.ts +++ b/services/product/src/lib/storage.ts @@ -1,7 +1,8 @@ import { BlobServiceClient, ContainerClient } from "@azure/storage-blob"; -import { File } from "buffer"; +import { File } from "node:buffer"; -const containerName = `uploaded`; + +const containerName = 'uploaded'; const sasToken = process.env.REACT_APP_AZURE_STORAGE_SAS_TOKEN; const storageAccountName = process.env.REACT_APP_AZURE_STORAGE_RESOURCE_NAME; @@ -30,5 +31,5 @@ const createBlobInContainer = async (file: File) => { const options = { blobHTTPHeaders: { blobContentType: file.type } }; // upload file - return await blobClient.uploadData(file, options); + return await blobClient.uploadData(((file.arrayBuffer) as unknown as Buffer), options); }; \ No newline at end of file diff --git a/services/product/src/types/Product.d.ts b/services/product/src/types/Product.d.ts index 8b99cc83..6ba44eb9 100644 --- a/services/product/src/types/Product.d.ts +++ b/services/product/src/types/Product.d.ts @@ -50,6 +50,7 @@ export interface RestaurantId{ } export interface Image{ + name: string; data: string; } diff --git a/services/product/terraform/data.tf b/services/product/terraform/data.tf index c495a511..5418af3d 100644 --- a/services/product/terraform/data.tf +++ b/services/product/terraform/data.tf @@ -3,6 +3,41 @@ data "azurerm_resource_group" "rg-goodfood" { location = var.location } +data "azurerm_storage_account_sas" "sa-goodfood" { + connection_string = azurerm_storage_account.stac-goodfood-product.primary_connection_string + https_only = true + signed_version = "2017-07-29" + + resource_types { + service = true + container = false + object = false + } + + services { + blob = true + queue = false + table = false + file = false + } + + start = "2023-01-01T000000Z" + expiry = "2023-12-01T000000Z" + + permissions { + read = true + write = true + delete = false + list = true + add = false + create = true + update = false + process = false + tag = false + filter = false + } +} + data "azurerm_key_vault" "kv-goodfood-product" { resource_group_name = data.azurerm_resource_group.rg-goodfood.name name = "kv-${var.project_name}" diff --git a/services/product/terraform/main.tf b/services/product/terraform/main.tf index 9ded51d9..e0312aa4 100644 --- a/services/product/terraform/main.tf +++ b/services/product/terraform/main.tf @@ -79,4 +79,9 @@ ressource "azurerm_storage_account" "stac-goodfood-product" { location = data.azurerm_resource_group.rg-goodfood.location account_tier = "Standard" account_replication_type = "GRS" +} + + +output "sas_url_query_string" { + value = data.azurerm_storage_account_sas.example.sas } \ No newline at end of file diff --git a/services/proto/product.proto b/services/proto/product.proto index 4734b478..a5842c75 100644 --- a/services/proto/product.proto +++ b/services/proto/product.proto @@ -47,7 +47,8 @@ message Product { } message File{ - string data = 1; + string name = 1; + string data = 2; } message Url{ From 171ab4b37e96b23940349f5a67a57eb51f4f64a6 Mon Sep 17 00:00:00 2001 From: anatole Date: Tue, 4 Jul 2023 10:10:34 +0200 Subject: [PATCH 155/883] feat(proto): update main addresses methods --- services/proto/user.pb.go | 1944 ++++++++++++++++++++++++++++++++ services/proto/user.proto | 7 +- services/proto/user_grpc.pb.go | 516 +++++++++ 3 files changed, 2466 insertions(+), 1 deletion(-) create mode 100644 services/proto/user.pb.go create mode 100644 services/proto/user_grpc.pb.go diff --git a/services/proto/user.pb.go b/services/proto/user.pb.go new file mode 100644 index 00000000..03b0d8ff --- /dev/null +++ b/services/proto/user.pb.go @@ -0,0 +1,1944 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.28.1 +// protoc v3.12.4 +// source: user.proto + +package __ + +import ( + empty "github.com/golang/protobuf/ptypes/empty" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + sync "sync" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +type Role struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + Code string `protobuf:"bytes,2,opt,name=code,proto3" json:"code,omitempty"` + Label string `protobuf:"bytes,3,opt,name=label,proto3" json:"label,omitempty"` +} + +func (x *Role) Reset() { + *x = Role{} + if protoimpl.UnsafeEnabled { + mi := &file_user_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Role) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Role) ProtoMessage() {} + +func (x *Role) ProtoReflect() protoreflect.Message { + mi := &file_user_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Role.ProtoReflect.Descriptor instead. +func (*Role) Descriptor() ([]byte, []int) { + return file_user_proto_rawDescGZIP(), []int{0} +} + +func (x *Role) GetId() string { + if x != nil { + return x.Id + } + return "" +} + +func (x *Role) GetCode() string { + if x != nil { + return x.Code + } + return "" +} + +func (x *Role) GetLabel() string { + if x != nil { + return x.Label + } + return "" +} + +type MainAddress struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + Street string `protobuf:"bytes,2,opt,name=street,proto3" json:"street,omitempty"` + ZipCode string `protobuf:"bytes,3,opt,name=zipCode,proto3" json:"zipCode,omitempty"` + Country string `protobuf:"bytes,4,opt,name=country,proto3" json:"country,omitempty"` + Lat float32 `protobuf:"fixed32,5,opt,name=lat,proto3" json:"lat,omitempty"` + Lng float32 `protobuf:"fixed32,6,opt,name=lng,proto3" json:"lng,omitempty"` +} + +func (x *MainAddress) Reset() { + *x = MainAddress{} + if protoimpl.UnsafeEnabled { + mi := &file_user_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *MainAddress) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*MainAddress) ProtoMessage() {} + +func (x *MainAddress) ProtoReflect() protoreflect.Message { + mi := &file_user_proto_msgTypes[1] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use MainAddress.ProtoReflect.Descriptor instead. +func (*MainAddress) Descriptor() ([]byte, []int) { + return file_user_proto_rawDescGZIP(), []int{1} +} + +func (x *MainAddress) GetId() string { + if x != nil { + return x.Id + } + return "" +} + +func (x *MainAddress) GetStreet() string { + if x != nil { + return x.Street + } + return "" +} + +func (x *MainAddress) GetZipCode() string { + if x != nil { + return x.ZipCode + } + return "" +} + +func (x *MainAddress) GetCountry() string { + if x != nil { + return x.Country + } + return "" +} + +func (x *MainAddress) GetLat() float32 { + if x != nil { + return x.Lat + } + return 0 +} + +func (x *MainAddress) GetLng() float32 { + if x != nil { + return x.Lng + } + return 0 +} + +type User struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + FirstName string `protobuf:"bytes,2,opt,name=first_name,json=firstName,proto3" json:"first_name,omitempty"` + LastName string `protobuf:"bytes,3,opt,name=last_name,json=lastName,proto3" json:"last_name,omitempty"` + Email string `protobuf:"bytes,4,opt,name=email,proto3" json:"email,omitempty"` + Phone string `protobuf:"bytes,5,opt,name=phone,proto3" json:"phone,omitempty"` + MainAddressId string `protobuf:"bytes,6,opt,name=MainAddressId,proto3" json:"MainAddressId,omitempty"` + MainAddress *MainAddress `protobuf:"bytes,7,opt,name=mainAddress,proto3" json:"mainAddress,omitempty"` + RoleId string `protobuf:"bytes,8,opt,name=RoleId,proto3" json:"RoleId,omitempty"` + Role *Role `protobuf:"bytes,9,opt,name=role,proto3" json:"role,omitempty"` +} + +func (x *User) Reset() { + *x = User{} + if protoimpl.UnsafeEnabled { + mi := &file_user_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *User) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*User) ProtoMessage() {} + +func (x *User) ProtoReflect() protoreflect.Message { + mi := &file_user_proto_msgTypes[2] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use User.ProtoReflect.Descriptor instead. +func (*User) Descriptor() ([]byte, []int) { + return file_user_proto_rawDescGZIP(), []int{2} +} + +func (x *User) GetId() string { + if x != nil { + return x.Id + } + return "" +} + +func (x *User) GetFirstName() string { + if x != nil { + return x.FirstName + } + return "" +} + +func (x *User) GetLastName() string { + if x != nil { + return x.LastName + } + return "" +} + +func (x *User) GetEmail() string { + if x != nil { + return x.Email + } + return "" +} + +func (x *User) GetPhone() string { + if x != nil { + return x.Phone + } + return "" +} + +func (x *User) GetMainAddressId() string { + if x != nil { + return x.MainAddressId + } + return "" +} + +func (x *User) GetMainAddress() *MainAddress { + if x != nil { + return x.MainAddress + } + return nil +} + +func (x *User) GetRoleId() string { + if x != nil { + return x.RoleId + } + return "" +} + +func (x *User) GetRole() *Role { + if x != nil { + return x.Role + } + return nil +} + +type UpdateUserInput struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + User *User `protobuf:"bytes,1,opt,name=user,proto3" json:"user,omitempty"` + Token string `protobuf:"bytes,8,opt,name=token,proto3" json:"token,omitempty"` +} + +func (x *UpdateUserInput) Reset() { + *x = UpdateUserInput{} + if protoimpl.UnsafeEnabled { + mi := &file_user_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *UpdateUserInput) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UpdateUserInput) ProtoMessage() {} + +func (x *UpdateUserInput) ProtoReflect() protoreflect.Message { + mi := &file_user_proto_msgTypes[3] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use UpdateUserInput.ProtoReflect.Descriptor instead. +func (*UpdateUserInput) Descriptor() ([]byte, []int) { + return file_user_proto_rawDescGZIP(), []int{3} +} + +func (x *UpdateUserInput) GetUser() *User { + if x != nil { + return x.User + } + return nil +} + +func (x *UpdateUserInput) GetToken() string { + if x != nil { + return x.Token + } + return "" +} + +type UpdateUserOutput struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + User *User `protobuf:"bytes,1,opt,name=user,proto3" json:"user,omitempty"` + Error string `protobuf:"bytes,2,opt,name=error,proto3" json:"error,omitempty"` +} + +func (x *UpdateUserOutput) Reset() { + *x = UpdateUserOutput{} + if protoimpl.UnsafeEnabled { + mi := &file_user_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *UpdateUserOutput) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UpdateUserOutput) ProtoMessage() {} + +func (x *UpdateUserOutput) ProtoReflect() protoreflect.Message { + mi := &file_user_proto_msgTypes[4] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use UpdateUserOutput.ProtoReflect.Descriptor instead. +func (*UpdateUserOutput) Descriptor() ([]byte, []int) { + return file_user_proto_rawDescGZIP(), []int{4} +} + +func (x *UpdateUserOutput) GetUser() *User { + if x != nil { + return x.User + } + return nil +} + +func (x *UpdateUserOutput) GetError() string { + if x != nil { + return x.Error + } + return "" +} + +type UserCreateInput struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + FirstName string `protobuf:"bytes,1,opt,name=first_name,json=firstName,proto3" json:"first_name,omitempty"` + LastName string `protobuf:"bytes,2,opt,name=last_name,json=lastName,proto3" json:"last_name,omitempty"` + Email string `protobuf:"bytes,3,opt,name=email,proto3" json:"email,omitempty"` + Password string `protobuf:"bytes,4,opt,name=password,proto3" json:"password,omitempty"` + Phone string `protobuf:"bytes,5,opt,name=phone,proto3" json:"phone,omitempty"` + MainAddress *MainAddressInput `protobuf:"bytes,6,opt,name=mainAddress,proto3" json:"mainAddress,omitempty"` + Role *RoleInput `protobuf:"bytes,7,opt,name=role,proto3" json:"role,omitempty"` +} + +func (x *UserCreateInput) Reset() { + *x = UserCreateInput{} + if protoimpl.UnsafeEnabled { + mi := &file_user_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *UserCreateInput) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UserCreateInput) ProtoMessage() {} + +func (x *UserCreateInput) ProtoReflect() protoreflect.Message { + mi := &file_user_proto_msgTypes[5] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use UserCreateInput.ProtoReflect.Descriptor instead. +func (*UserCreateInput) Descriptor() ([]byte, []int) { + return file_user_proto_rawDescGZIP(), []int{5} +} + +func (x *UserCreateInput) GetFirstName() string { + if x != nil { + return x.FirstName + } + return "" +} + +func (x *UserCreateInput) GetLastName() string { + if x != nil { + return x.LastName + } + return "" +} + +func (x *UserCreateInput) GetEmail() string { + if x != nil { + return x.Email + } + return "" +} + +func (x *UserCreateInput) GetPassword() string { + if x != nil { + return x.Password + } + return "" +} + +func (x *UserCreateInput) GetPhone() string { + if x != nil { + return x.Phone + } + return "" +} + +func (x *UserCreateInput) GetMainAddress() *MainAddressInput { + if x != nil { + return x.MainAddress + } + return nil +} + +func (x *UserCreateInput) GetRole() *RoleInput { + if x != nil { + return x.Role + } + return nil +} + +type MainAddressInput struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Street string `protobuf:"bytes,1,opt,name=street,proto3" json:"street,omitempty"` + ZipCode string `protobuf:"bytes,2,opt,name=zipCode,proto3" json:"zipCode,omitempty"` + Country string `protobuf:"bytes,3,opt,name=country,proto3" json:"country,omitempty"` + Coordinates []int32 `protobuf:"varint,4,rep,packed,name=coordinates,proto3" json:"coordinates,omitempty"` +} + +func (x *MainAddressInput) Reset() { + *x = MainAddressInput{} + if protoimpl.UnsafeEnabled { + mi := &file_user_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *MainAddressInput) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*MainAddressInput) ProtoMessage() {} + +func (x *MainAddressInput) ProtoReflect() protoreflect.Message { + mi := &file_user_proto_msgTypes[6] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use MainAddressInput.ProtoReflect.Descriptor instead. +func (*MainAddressInput) Descriptor() ([]byte, []int) { + return file_user_proto_rawDescGZIP(), []int{6} +} + +func (x *MainAddressInput) GetStreet() string { + if x != nil { + return x.Street + } + return "" +} + +func (x *MainAddressInput) GetZipCode() string { + if x != nil { + return x.ZipCode + } + return "" +} + +func (x *MainAddressInput) GetCountry() string { + if x != nil { + return x.Country + } + return "" +} + +func (x *MainAddressInput) GetCoordinates() []int32 { + if x != nil { + return x.Coordinates + } + return nil +} + +type RoleInput struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Code string `protobuf:"bytes,1,opt,name=code,proto3" json:"code,omitempty"` +} + +func (x *RoleInput) Reset() { + *x = RoleInput{} + if protoimpl.UnsafeEnabled { + mi := &file_user_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *RoleInput) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RoleInput) ProtoMessage() {} + +func (x *RoleInput) ProtoReflect() protoreflect.Message { + mi := &file_user_proto_msgTypes[7] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RoleInput.ProtoReflect.Descriptor instead. +func (*RoleInput) Descriptor() ([]byte, []int) { + return file_user_proto_rawDescGZIP(), []int{7} +} + +func (x *RoleInput) GetCode() string { + if x != nil { + return x.Code + } + return "" +} + +type UserId struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` +} + +func (x *UserId) Reset() { + *x = UserId{} + if protoimpl.UnsafeEnabled { + mi := &file_user_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *UserId) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UserId) ProtoMessage() {} + +func (x *UserId) ProtoReflect() protoreflect.Message { + mi := &file_user_proto_msgTypes[8] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use UserId.ProtoReflect.Descriptor instead. +func (*UserId) Descriptor() ([]byte, []int) { + return file_user_proto_rawDescGZIP(), []int{8} +} + +func (x *UserId) GetId() string { + if x != nil { + return x.Id + } + return "" +} + +type UserList struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Users []*User `protobuf:"bytes,1,rep,name=users,proto3" json:"users,omitempty"` +} + +func (x *UserList) Reset() { + *x = UserList{} + if protoimpl.UnsafeEnabled { + mi := &file_user_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *UserList) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UserList) ProtoMessage() {} + +func (x *UserList) ProtoReflect() protoreflect.Message { + mi := &file_user_proto_msgTypes[9] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use UserList.ProtoReflect.Descriptor instead. +func (*UserList) Descriptor() ([]byte, []int) { + return file_user_proto_rawDescGZIP(), []int{9} +} + +func (x *UserList) GetUsers() []*User { + if x != nil { + return x.Users + } + return nil +} + +type LogInInput struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + UserId string `protobuf:"bytes,1,opt,name=userId,proto3" json:"userId,omitempty"` + Email string `protobuf:"bytes,2,opt,name=email,proto3" json:"email,omitempty"` + Password string `protobuf:"bytes,3,opt,name=password,proto3" json:"password,omitempty"` +} + +func (x *LogInInput) Reset() { + *x = LogInInput{} + if protoimpl.UnsafeEnabled { + mi := &file_user_proto_msgTypes[10] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *LogInInput) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*LogInInput) ProtoMessage() {} + +func (x *LogInInput) ProtoReflect() protoreflect.Message { + mi := &file_user_proto_msgTypes[10] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use LogInInput.ProtoReflect.Descriptor instead. +func (*LogInInput) Descriptor() ([]byte, []int) { + return file_user_proto_rawDescGZIP(), []int{10} +} + +func (x *LogInInput) GetUserId() string { + if x != nil { + return x.UserId + } + return "" +} + +func (x *LogInInput) GetEmail() string { + if x != nil { + return x.Email + } + return "" +} + +func (x *LogInInput) GetPassword() string { + if x != nil { + return x.Password + } + return "" +} + +type ValidateInput struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Token string `protobuf:"bytes,1,opt,name=token,proto3" json:"token,omitempty"` +} + +func (x *ValidateInput) Reset() { + *x = ValidateInput{} + if protoimpl.UnsafeEnabled { + mi := &file_user_proto_msgTypes[11] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ValidateInput) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ValidateInput) ProtoMessage() {} + +func (x *ValidateInput) ProtoReflect() protoreflect.Message { + mi := &file_user_proto_msgTypes[11] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ValidateInput.ProtoReflect.Descriptor instead. +func (*ValidateInput) Descriptor() ([]byte, []int) { + return file_user_proto_rawDescGZIP(), []int{11} +} + +func (x *ValidateInput) GetToken() string { + if x != nil { + return x.Token + } + return "" +} + +type DeleteInput struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Token string `protobuf:"bytes,1,opt,name=token,proto3" json:"token,omitempty"` + UserId string `protobuf:"bytes,2,opt,name=userId,proto3" json:"userId,omitempty"` +} + +func (x *DeleteInput) Reset() { + *x = DeleteInput{} + if protoimpl.UnsafeEnabled { + mi := &file_user_proto_msgTypes[12] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DeleteInput) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DeleteInput) ProtoMessage() {} + +func (x *DeleteInput) ProtoReflect() protoreflect.Message { + mi := &file_user_proto_msgTypes[12] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DeleteInput.ProtoReflect.Descriptor instead. +func (*DeleteInput) Descriptor() ([]byte, []int) { + return file_user_proto_rawDescGZIP(), []int{12} +} + +func (x *DeleteInput) GetToken() string { + if x != nil { + return x.Token + } + return "" +} + +func (x *DeleteInput) GetUserId() string { + if x != nil { + return x.UserId + } + return "" +} + +type ValidateResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Error string `protobuf:"bytes,1,opt,name=error,proto3" json:"error,omitempty"` + UserId string `protobuf:"bytes,2,opt,name=userId,proto3" json:"userId,omitempty"` +} + +func (x *ValidateResponse) Reset() { + *x = ValidateResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_user_proto_msgTypes[13] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ValidateResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ValidateResponse) ProtoMessage() {} + +func (x *ValidateResponse) ProtoReflect() protoreflect.Message { + mi := &file_user_proto_msgTypes[13] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ValidateResponse.ProtoReflect.Descriptor instead. +func (*ValidateResponse) Descriptor() ([]byte, []int) { + return file_user_proto_rawDescGZIP(), []int{13} +} + +func (x *ValidateResponse) GetError() string { + if x != nil { + return x.Error + } + return "" +} + +func (x *ValidateResponse) GetUserId() string { + if x != nil { + return x.UserId + } + return "" +} + +type LogInResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + User *User `protobuf:"bytes,1,opt,name=user,proto3" json:"user,omitempty"` + Token string `protobuf:"bytes,2,opt,name=token,proto3" json:"token,omitempty"` +} + +func (x *LogInResponse) Reset() { + *x = LogInResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_user_proto_msgTypes[14] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *LogInResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*LogInResponse) ProtoMessage() {} + +func (x *LogInResponse) ProtoReflect() protoreflect.Message { + mi := &file_user_proto_msgTypes[14] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use LogInResponse.ProtoReflect.Descriptor instead. +func (*LogInResponse) Descriptor() ([]byte, []int) { + return file_user_proto_rawDescGZIP(), []int{14} +} + +func (x *LogInResponse) GetUser() *User { + if x != nil { + return x.User + } + return nil +} + +func (x *LogInResponse) GetToken() string { + if x != nil { + return x.Token + } + return "" +} + +type ChangePasswordInput struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Token string `protobuf:"bytes,1,opt,name=token,proto3" json:"token,omitempty"` + OldPassword string `protobuf:"bytes,2,opt,name=oldPassword,proto3" json:"oldPassword,omitempty"` + NewPassword string `protobuf:"bytes,3,opt,name=newPassword,proto3" json:"newPassword,omitempty"` +} + +func (x *ChangePasswordInput) Reset() { + *x = ChangePasswordInput{} + if protoimpl.UnsafeEnabled { + mi := &file_user_proto_msgTypes[15] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ChangePasswordInput) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ChangePasswordInput) ProtoMessage() {} + +func (x *ChangePasswordInput) ProtoReflect() protoreflect.Message { + mi := &file_user_proto_msgTypes[15] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ChangePasswordInput.ProtoReflect.Descriptor instead. +func (*ChangePasswordInput) Descriptor() ([]byte, []int) { + return file_user_proto_rawDescGZIP(), []int{15} +} + +func (x *ChangePasswordInput) GetToken() string { + if x != nil { + return x.Token + } + return "" +} + +func (x *ChangePasswordInput) GetOldPassword() string { + if x != nil { + return x.OldPassword + } + return "" +} + +func (x *ChangePasswordInput) GetNewPassword() string { + if x != nil { + return x.NewPassword + } + return "" +} + +type ChangePasswordOutput struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + User *User `protobuf:"bytes,1,opt,name=user,proto3" json:"user,omitempty"` + Error string `protobuf:"bytes,2,opt,name=error,proto3" json:"error,omitempty"` +} + +func (x *ChangePasswordOutput) Reset() { + *x = ChangePasswordOutput{} + if protoimpl.UnsafeEnabled { + mi := &file_user_proto_msgTypes[16] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ChangePasswordOutput) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ChangePasswordOutput) ProtoMessage() {} + +func (x *ChangePasswordOutput) ProtoReflect() protoreflect.Message { + mi := &file_user_proto_msgTypes[16] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ChangePasswordOutput.ProtoReflect.Descriptor instead. +func (*ChangePasswordOutput) Descriptor() ([]byte, []int) { + return file_user_proto_rawDescGZIP(), []int{16} +} + +func (x *ChangePasswordOutput) GetUser() *User { + if x != nil { + return x.User + } + return nil +} + +func (x *ChangePasswordOutput) GetError() string { + if x != nil { + return x.Error + } + return "" +} + +type ChangeRoleInput struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Token string `protobuf:"bytes,1,opt,name=token,proto3" json:"token,omitempty"` + UserId string `protobuf:"bytes,2,opt,name=userId,proto3" json:"userId,omitempty"` + RoleCode string `protobuf:"bytes,3,opt,name=roleCode,proto3" json:"roleCode,omitempty"` +} + +func (x *ChangeRoleInput) Reset() { + *x = ChangeRoleInput{} + if protoimpl.UnsafeEnabled { + mi := &file_user_proto_msgTypes[17] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ChangeRoleInput) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ChangeRoleInput) ProtoMessage() {} + +func (x *ChangeRoleInput) ProtoReflect() protoreflect.Message { + mi := &file_user_proto_msgTypes[17] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ChangeRoleInput.ProtoReflect.Descriptor instead. +func (*ChangeRoleInput) Descriptor() ([]byte, []int) { + return file_user_proto_rawDescGZIP(), []int{17} +} + +func (x *ChangeRoleInput) GetToken() string { + if x != nil { + return x.Token + } + return "" +} + +func (x *ChangeRoleInput) GetUserId() string { + if x != nil { + return x.UserId + } + return "" +} + +func (x *ChangeRoleInput) GetRoleCode() string { + if x != nil { + return x.RoleCode + } + return "" +} + +type DeleteUserOutput struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + User *User `protobuf:"bytes,1,opt,name=user,proto3" json:"user,omitempty"` + Error string `protobuf:"bytes,2,opt,name=error,proto3" json:"error,omitempty"` +} + +func (x *DeleteUserOutput) Reset() { + *x = DeleteUserOutput{} + if protoimpl.UnsafeEnabled { + mi := &file_user_proto_msgTypes[18] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DeleteUserOutput) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DeleteUserOutput) ProtoMessage() {} + +func (x *DeleteUserOutput) ProtoReflect() protoreflect.Message { + mi := &file_user_proto_msgTypes[18] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DeleteUserOutput.ProtoReflect.Descriptor instead. +func (*DeleteUserOutput) Descriptor() ([]byte, []int) { + return file_user_proto_rawDescGZIP(), []int{18} +} + +func (x *DeleteUserOutput) GetUser() *User { + if x != nil { + return x.User + } + return nil +} + +func (x *DeleteUserOutput) GetError() string { + if x != nil { + return x.Error + } + return "" +} + +type ChangeRoleOutput struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + User *User `protobuf:"bytes,1,opt,name=user,proto3" json:"user,omitempty"` + Error string `protobuf:"bytes,2,opt,name=error,proto3" json:"error,omitempty"` +} + +func (x *ChangeRoleOutput) Reset() { + *x = ChangeRoleOutput{} + if protoimpl.UnsafeEnabled { + mi := &file_user_proto_msgTypes[19] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ChangeRoleOutput) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ChangeRoleOutput) ProtoMessage() {} + +func (x *ChangeRoleOutput) ProtoReflect() protoreflect.Message { + mi := &file_user_proto_msgTypes[19] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ChangeRoleOutput.ProtoReflect.Descriptor instead. +func (*ChangeRoleOutput) Descriptor() ([]byte, []int) { + return file_user_proto_rawDescGZIP(), []int{19} +} + +func (x *ChangeRoleOutput) GetUser() *User { + if x != nil { + return x.User + } + return nil +} + +func (x *ChangeRoleOutput) GetError() string { + if x != nil { + return x.Error + } + return "" +} + +type MainAddressId struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` +} + +func (x *MainAddressId) Reset() { + *x = MainAddressId{} + if protoimpl.UnsafeEnabled { + mi := &file_user_proto_msgTypes[20] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *MainAddressId) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*MainAddressId) ProtoMessage() {} + +func (x *MainAddressId) ProtoReflect() protoreflect.Message { + mi := &file_user_proto_msgTypes[20] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use MainAddressId.ProtoReflect.Descriptor instead. +func (*MainAddressId) Descriptor() ([]byte, []int) { + return file_user_proto_rawDescGZIP(), []int{20} +} + +func (x *MainAddressId) GetId() string { + if x != nil { + return x.Id + } + return "" +} + +type MainAddressUpdateInput struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + MainAddress *MainAddressInput `protobuf:"bytes,1,opt,name=mainAddress,proto3" json:"mainAddress,omitempty"` + UserId string `protobuf:"bytes,2,opt,name=userId,proto3" json:"userId,omitempty"` +} + +func (x *MainAddressUpdateInput) Reset() { + *x = MainAddressUpdateInput{} + if protoimpl.UnsafeEnabled { + mi := &file_user_proto_msgTypes[21] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *MainAddressUpdateInput) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*MainAddressUpdateInput) ProtoMessage() {} + +func (x *MainAddressUpdateInput) ProtoReflect() protoreflect.Message { + mi := &file_user_proto_msgTypes[21] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use MainAddressUpdateInput.ProtoReflect.Descriptor instead. +func (*MainAddressUpdateInput) Descriptor() ([]byte, []int) { + return file_user_proto_rawDescGZIP(), []int{21} +} + +func (x *MainAddressUpdateInput) GetMainAddress() *MainAddressInput { + if x != nil { + return x.MainAddress + } + return nil +} + +func (x *MainAddressUpdateInput) GetUserId() string { + if x != nil { + return x.UserId + } + return "" +} + +var File_user_proto protoreflect.FileDescriptor + +var file_user_proto_rawDesc = []byte{ + 0x0a, 0x0a, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x11, 0x63, 0x6f, + 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x1a, + 0x1b, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2f, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x40, 0x0a, 0x04, + 0x52, 0x6f, 0x6c, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, + 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x22, 0x8d, + 0x01, 0x0a, 0x0b, 0x4d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x0e, + 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x16, + 0x0a, 0x06, 0x73, 0x74, 0x72, 0x65, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, + 0x73, 0x74, 0x72, 0x65, 0x65, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x7a, 0x69, 0x70, 0x43, 0x6f, 0x64, + 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x7a, 0x69, 0x70, 0x43, 0x6f, 0x64, 0x65, + 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x07, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6c, 0x61, + 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x02, 0x52, 0x03, 0x6c, 0x61, 0x74, 0x12, 0x10, 0x0a, 0x03, + 0x6c, 0x6e, 0x67, 0x18, 0x06, 0x20, 0x01, 0x28, 0x02, 0x52, 0x03, 0x6c, 0x6e, 0x67, 0x22, 0xab, + 0x02, 0x0a, 0x04, 0x55, 0x73, 0x65, 0x72, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x66, 0x69, 0x72, 0x73, 0x74, + 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x66, 0x69, 0x72, + 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6c, 0x61, 0x73, 0x74, 0x4e, + 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x68, 0x6f, + 0x6e, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x68, 0x6f, 0x6e, 0x65, 0x12, + 0x24, 0x0a, 0x0d, 0x4d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x49, 0x64, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x4d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, + 0x65, 0x73, 0x73, 0x49, 0x64, 0x12, 0x40, 0x0a, 0x0b, 0x6d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, + 0x72, 0x65, 0x73, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x63, 0x6f, 0x6d, + 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x4d, + 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x0b, 0x6d, 0x61, 0x69, 0x6e, + 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x52, 0x6f, 0x6c, 0x65, 0x49, + 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x64, 0x12, + 0x2b, 0x0a, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, + 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, + 0x72, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x22, 0x54, 0x0a, 0x0f, + 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x12, + 0x2b, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, + 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, + 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, + 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, + 0x65, 0x6e, 0x22, 0x55, 0x0a, 0x10, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, + 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x2b, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, + 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x04, 0x75, + 0x73, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x8e, 0x02, 0x0a, 0x0f, 0x55, 0x73, + 0x65, 0x72, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x12, 0x1d, 0x0a, + 0x0a, 0x66, 0x69, 0x72, 0x73, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x09, 0x66, 0x69, 0x72, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x09, + 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x6c, 0x61, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6d, 0x61, + 0x69, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x12, + 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x70, + 0x68, 0x6f, 0x6e, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x68, 0x6f, 0x6e, + 0x65, 0x12, 0x45, 0x0a, 0x0b, 0x6d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, + 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x4d, 0x61, 0x69, 0x6e, 0x41, + 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x52, 0x0b, 0x6d, 0x61, 0x69, + 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x30, 0x0a, 0x04, 0x72, 0x6f, 0x6c, 0x65, + 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, + 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, + 0x6e, 0x70, 0x75, 0x74, 0x52, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x22, 0x80, 0x01, 0x0a, 0x10, 0x4d, + 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x12, + 0x16, 0x0a, 0x06, 0x73, 0x74, 0x72, 0x65, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x06, 0x73, 0x74, 0x72, 0x65, 0x65, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x7a, 0x69, 0x70, 0x43, 0x6f, + 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x7a, 0x69, 0x70, 0x43, 0x6f, 0x64, + 0x65, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x63, + 0x6f, 0x6f, 0x72, 0x64, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x05, + 0x52, 0x0b, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x73, 0x22, 0x1f, 0x0a, + 0x09, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, + 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x22, 0x18, + 0x0a, 0x06, 0x55, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x39, 0x0a, 0x08, 0x55, 0x73, 0x65, 0x72, + 0x4c, 0x69, 0x73, 0x74, 0x12, 0x2d, 0x0a, 0x05, 0x75, 0x73, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, + 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x05, 0x75, 0x73, + 0x65, 0x72, 0x73, 0x22, 0x56, 0x0a, 0x0a, 0x6c, 0x6f, 0x67, 0x49, 0x6e, 0x49, 0x6e, 0x70, 0x75, + 0x74, 0x12, 0x16, 0x0a, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6d, 0x61, + 0x69, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x12, + 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x22, 0x25, 0x0a, 0x0d, 0x76, + 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x12, 0x14, 0x0a, 0x05, + 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, + 0x65, 0x6e, 0x22, 0x3b, 0x0a, 0x0b, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x49, 0x6e, 0x70, 0x75, + 0x74, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, + 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x22, + 0x40, 0x0a, 0x10, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x75, 0x73, 0x65, + 0x72, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, + 0x64, 0x22, 0x52, 0x0a, 0x0d, 0x6c, 0x6f, 0x67, 0x49, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x2b, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x17, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, + 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x12, + 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x6f, 0x0a, 0x13, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, + 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x12, 0x14, 0x0a, 0x05, + 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, + 0x65, 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x6f, 0x6c, 0x64, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, + 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x6f, 0x6c, 0x64, 0x50, 0x61, 0x73, 0x73, + 0x77, 0x6f, 0x72, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x6e, 0x65, 0x77, 0x50, 0x61, 0x73, 0x73, 0x77, + 0x6f, 0x72, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x6e, 0x65, 0x77, 0x50, 0x61, + 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x22, 0x59, 0x0a, 0x14, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, + 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x2b, + 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, + 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, + 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x65, + 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, + 0x72, 0x22, 0x5b, 0x0a, 0x0f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x49, + 0x6e, 0x70, 0x75, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x75, 0x73, + 0x65, 0x72, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, + 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x43, 0x6f, 0x64, 0x65, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x43, 0x6f, 0x64, 0x65, 0x22, 0x55, + 0x0a, 0x10, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x4f, 0x75, 0x74, 0x70, + 0x75, 0x74, 0x12, 0x2b, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x17, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, + 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x12, + 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x55, 0x0a, 0x10, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, + 0x6f, 0x6c, 0x65, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x2b, 0x0a, 0x04, 0x75, 0x73, 0x65, + 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, + 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, + 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x1f, 0x0a, 0x0d, + 0x4d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x49, 0x64, 0x12, 0x0e, 0x0a, + 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x77, 0x0a, + 0x16, 0x4d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x55, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x12, 0x45, 0x0a, 0x0b, 0x6d, 0x61, 0x69, 0x6e, 0x41, + 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x63, + 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, + 0x2e, 0x4d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x49, 0x6e, 0x70, 0x75, + 0x74, 0x52, 0x0b, 0x6d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x16, + 0x0a, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, + 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x32, 0xe9, 0x05, 0x0a, 0x0b, 0x55, 0x73, 0x65, 0x72, 0x53, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x49, 0x0a, 0x08, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, + 0x65, 0x72, 0x12, 0x22, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, + 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x17, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, + 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x22, + 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x12, 0x19, 0x2e, 0x63, + 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, + 0x2e, 0x55, 0x73, 0x65, 0x72, 0x49, 0x64, 0x1a, 0x17, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, + 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, + 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0a, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, + 0x12, 0x22, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, + 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x49, + 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x23, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, + 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x55, + 0x73, 0x65, 0x72, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x53, 0x0a, 0x0a, 0x44, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x12, 0x1e, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, + 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x44, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x23, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, + 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x44, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, + 0x12, 0x41, 0x0a, 0x08, 0x4c, 0x69, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, 0x12, 0x16, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, + 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1b, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, + 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x4c, 0x69, 0x73, + 0x74, 0x22, 0x00, 0x12, 0x4a, 0x0a, 0x05, 0x4c, 0x6f, 0x67, 0x49, 0x6e, 0x12, 0x1d, 0x2e, 0x63, + 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, + 0x2e, 0x6c, 0x6f, 0x67, 0x49, 0x6e, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x20, 0x2e, 0x63, 0x6f, + 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, + 0x6c, 0x6f, 0x67, 0x49, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, + 0x53, 0x0a, 0x08, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x12, 0x20, 0x2e, 0x63, 0x6f, + 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, + 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x23, 0x2e, + 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, + 0x72, 0x2e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x00, 0x12, 0x63, 0x0a, 0x0e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x61, + 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x26, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, + 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x63, 0x68, 0x61, 0x6e, 0x67, + 0x65, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x27, + 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, + 0x65, 0x72, 0x2e, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, + 0x64, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0a, 0x43, 0x68, 0x61, + 0x6e, 0x67, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x12, 0x22, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, + 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x63, 0x68, 0x61, 0x6e, + 0x67, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x23, 0x2e, 0x63, 0x6f, + 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, + 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, + 0x22, 0x00, 0x32, 0xcc, 0x01, 0x0a, 0x12, 0x4d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, + 0x73, 0x73, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x54, 0x0a, 0x0e, 0x47, 0x65, 0x74, + 0x4d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x20, 0x2e, 0x63, 0x6f, + 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, + 0x4d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x49, 0x64, 0x1a, 0x1e, 0x2e, + 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, + 0x72, 0x2e, 0x4d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x22, 0x00, 0x12, + 0x60, 0x0a, 0x11, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, + 0x72, 0x65, 0x73, 0x73, 0x12, 0x29, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, + 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x4d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, + 0x72, 0x65, 0x73, 0x73, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, + 0x1e, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, + 0x73, 0x65, 0x72, 0x2e, 0x4d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x22, + 0x00, 0x42, 0x03, 0x5a, 0x01, 0x2e, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_user_proto_rawDescOnce sync.Once + file_user_proto_rawDescData = file_user_proto_rawDesc +) + +func file_user_proto_rawDescGZIP() []byte { + file_user_proto_rawDescOnce.Do(func() { + file_user_proto_rawDescData = protoimpl.X.CompressGZIP(file_user_proto_rawDescData) + }) + return file_user_proto_rawDescData +} + +var file_user_proto_msgTypes = make([]protoimpl.MessageInfo, 22) +var file_user_proto_goTypes = []interface{}{ + (*Role)(nil), // 0: com.goodfood.user.Role + (*MainAddress)(nil), // 1: com.goodfood.user.MainAddress + (*User)(nil), // 2: com.goodfood.user.User + (*UpdateUserInput)(nil), // 3: com.goodfood.user.UpdateUserInput + (*UpdateUserOutput)(nil), // 4: com.goodfood.user.UpdateUserOutput + (*UserCreateInput)(nil), // 5: com.goodfood.user.UserCreateInput + (*MainAddressInput)(nil), // 6: com.goodfood.user.MainAddressInput + (*RoleInput)(nil), // 7: com.goodfood.user.RoleInput + (*UserId)(nil), // 8: com.goodfood.user.UserId + (*UserList)(nil), // 9: com.goodfood.user.UserList + (*LogInInput)(nil), // 10: com.goodfood.user.logInInput + (*ValidateInput)(nil), // 11: com.goodfood.user.validateInput + (*DeleteInput)(nil), // 12: com.goodfood.user.DeleteInput + (*ValidateResponse)(nil), // 13: com.goodfood.user.validateResponse + (*LogInResponse)(nil), // 14: com.goodfood.user.logInResponse + (*ChangePasswordInput)(nil), // 15: com.goodfood.user.changePasswordInput + (*ChangePasswordOutput)(nil), // 16: com.goodfood.user.changePasswordOutput + (*ChangeRoleInput)(nil), // 17: com.goodfood.user.changeRoleInput + (*DeleteUserOutput)(nil), // 18: com.goodfood.user.DeleteUserOutput + (*ChangeRoleOutput)(nil), // 19: com.goodfood.user.changeRoleOutput + (*MainAddressId)(nil), // 20: com.goodfood.user.MainAddressId + (*MainAddressUpdateInput)(nil), // 21: com.goodfood.user.MainAddressUpdateInput + (*empty.Empty)(nil), // 22: google.protobuf.Empty +} +var file_user_proto_depIdxs = []int32{ + 1, // 0: com.goodfood.user.User.mainAddress:type_name -> com.goodfood.user.MainAddress + 0, // 1: com.goodfood.user.User.role:type_name -> com.goodfood.user.Role + 2, // 2: com.goodfood.user.UpdateUserInput.user:type_name -> com.goodfood.user.User + 2, // 3: com.goodfood.user.UpdateUserOutput.user:type_name -> com.goodfood.user.User + 6, // 4: com.goodfood.user.UserCreateInput.mainAddress:type_name -> com.goodfood.user.MainAddressInput + 7, // 5: com.goodfood.user.UserCreateInput.role:type_name -> com.goodfood.user.RoleInput + 2, // 6: com.goodfood.user.UserList.users:type_name -> com.goodfood.user.User + 2, // 7: com.goodfood.user.logInResponse.user:type_name -> com.goodfood.user.User + 2, // 8: com.goodfood.user.changePasswordOutput.user:type_name -> com.goodfood.user.User + 2, // 9: com.goodfood.user.DeleteUserOutput.user:type_name -> com.goodfood.user.User + 2, // 10: com.goodfood.user.changeRoleOutput.user:type_name -> com.goodfood.user.User + 6, // 11: com.goodfood.user.MainAddressUpdateInput.mainAddress:type_name -> com.goodfood.user.MainAddressInput + 5, // 12: com.goodfood.user.UserService.Register:input_type -> com.goodfood.user.UserCreateInput + 8, // 13: com.goodfood.user.UserService.GetUser:input_type -> com.goodfood.user.UserId + 3, // 14: com.goodfood.user.UserService.UpdateUser:input_type -> com.goodfood.user.UpdateUserInput + 12, // 15: com.goodfood.user.UserService.DeleteUser:input_type -> com.goodfood.user.DeleteInput + 22, // 16: com.goodfood.user.UserService.ListUser:input_type -> google.protobuf.Empty + 10, // 17: com.goodfood.user.UserService.LogIn:input_type -> com.goodfood.user.logInInput + 11, // 18: com.goodfood.user.UserService.Validate:input_type -> com.goodfood.user.validateInput + 15, // 19: com.goodfood.user.UserService.ChangePassword:input_type -> com.goodfood.user.changePasswordInput + 17, // 20: com.goodfood.user.UserService.ChangeRole:input_type -> com.goodfood.user.changeRoleInput + 20, // 21: com.goodfood.user.MainAddressService.GetMainAddress:input_type -> com.goodfood.user.MainAddressId + 21, // 22: com.goodfood.user.MainAddressService.UpdateMainAddress:input_type -> com.goodfood.user.MainAddressUpdateInput + 2, // 23: com.goodfood.user.UserService.Register:output_type -> com.goodfood.user.User + 2, // 24: com.goodfood.user.UserService.GetUser:output_type -> com.goodfood.user.User + 4, // 25: com.goodfood.user.UserService.UpdateUser:output_type -> com.goodfood.user.UpdateUserOutput + 18, // 26: com.goodfood.user.UserService.DeleteUser:output_type -> com.goodfood.user.DeleteUserOutput + 9, // 27: com.goodfood.user.UserService.ListUser:output_type -> com.goodfood.user.UserList + 14, // 28: com.goodfood.user.UserService.LogIn:output_type -> com.goodfood.user.logInResponse + 13, // 29: com.goodfood.user.UserService.Validate:output_type -> com.goodfood.user.validateResponse + 16, // 30: com.goodfood.user.UserService.ChangePassword:output_type -> com.goodfood.user.changePasswordOutput + 19, // 31: com.goodfood.user.UserService.ChangeRole:output_type -> com.goodfood.user.changeRoleOutput + 1, // 32: com.goodfood.user.MainAddressService.GetMainAddress:output_type -> com.goodfood.user.MainAddress + 1, // 33: com.goodfood.user.MainAddressService.UpdateMainAddress:output_type -> com.goodfood.user.MainAddress + 23, // [23:34] is the sub-list for method output_type + 12, // [12:23] is the sub-list for method input_type + 12, // [12:12] is the sub-list for extension type_name + 12, // [12:12] is the sub-list for extension extendee + 0, // [0:12] is the sub-list for field type_name +} + +func init() { file_user_proto_init() } +func file_user_proto_init() { + if File_user_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_user_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Role); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_user_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*MainAddress); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_user_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*User); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_user_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UpdateUserInput); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_user_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UpdateUserOutput); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_user_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UserCreateInput); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_user_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*MainAddressInput); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_user_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RoleInput); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_user_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UserId); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_user_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UserList); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_user_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*LogInInput); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_user_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ValidateInput); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_user_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DeleteInput); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_user_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ValidateResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_user_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*LogInResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_user_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ChangePasswordInput); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_user_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ChangePasswordOutput); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_user_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ChangeRoleInput); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_user_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DeleteUserOutput); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_user_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ChangeRoleOutput); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_user_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*MainAddressId); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_user_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*MainAddressUpdateInput); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_user_proto_rawDesc, + NumEnums: 0, + NumMessages: 22, + NumExtensions: 0, + NumServices: 2, + }, + GoTypes: file_user_proto_goTypes, + DependencyIndexes: file_user_proto_depIdxs, + MessageInfos: file_user_proto_msgTypes, + }.Build() + File_user_proto = out.File + file_user_proto_rawDesc = nil + file_user_proto_goTypes = nil + file_user_proto_depIdxs = nil +} diff --git a/services/proto/user.proto b/services/proto/user.proto index 473759e1..83bb1294 100644 --- a/services/proto/user.proto +++ b/services/proto/user.proto @@ -57,7 +57,7 @@ service UserService { service MainAddressService { rpc GetMainAddress (MainAddressId) returns (MainAddress) {} - rpc DeleteMainAddress (MainAddressId) returns (google.protobuf.Empty) {} + rpc UpdateMainAddress (MainAddressUpdateInput) returns (MainAddress) {} } message UserCreateInput { @@ -144,4 +144,9 @@ message changeRoleOutput{ message MainAddressId { string id = 1; +} + +message MainAddressUpdateInput { + MainAddressInput mainAddress = 1; + string userId = 2; } \ No newline at end of file diff --git a/services/proto/user_grpc.pb.go b/services/proto/user_grpc.pb.go new file mode 100644 index 00000000..0690470b --- /dev/null +++ b/services/proto/user_grpc.pb.go @@ -0,0 +1,516 @@ +// Code generated by protoc-gen-go-grpc. DO NOT EDIT. +// versions: +// - protoc-gen-go-grpc v1.2.0 +// - protoc v3.12.4 +// source: user.proto + +package __ + +import ( + context "context" + empty "github.com/golang/protobuf/ptypes/empty" + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" +) + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +// Requires gRPC-Go v1.32.0 or later. +const _ = grpc.SupportPackageIsVersion7 + +// UserServiceClient is the client API for UserService service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. +type UserServiceClient interface { + Register(ctx context.Context, in *UserCreateInput, opts ...grpc.CallOption) (*User, error) + GetUser(ctx context.Context, in *UserId, opts ...grpc.CallOption) (*User, error) + UpdateUser(ctx context.Context, in *UpdateUserInput, opts ...grpc.CallOption) (*UpdateUserOutput, error) + DeleteUser(ctx context.Context, in *DeleteInput, opts ...grpc.CallOption) (*DeleteUserOutput, error) + ListUser(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*UserList, error) + LogIn(ctx context.Context, in *LogInInput, opts ...grpc.CallOption) (*LogInResponse, error) + Validate(ctx context.Context, in *ValidateInput, opts ...grpc.CallOption) (*ValidateResponse, error) + ChangePassword(ctx context.Context, in *ChangePasswordInput, opts ...grpc.CallOption) (*ChangePasswordOutput, error) + ChangeRole(ctx context.Context, in *ChangeRoleInput, opts ...grpc.CallOption) (*ChangeRoleOutput, error) +} + +type userServiceClient struct { + cc grpc.ClientConnInterface +} + +func NewUserServiceClient(cc grpc.ClientConnInterface) UserServiceClient { + return &userServiceClient{cc} +} + +func (c *userServiceClient) Register(ctx context.Context, in *UserCreateInput, opts ...grpc.CallOption) (*User, error) { + out := new(User) + err := c.cc.Invoke(ctx, "/com.goodfood.user.UserService/Register", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *userServiceClient) GetUser(ctx context.Context, in *UserId, opts ...grpc.CallOption) (*User, error) { + out := new(User) + err := c.cc.Invoke(ctx, "/com.goodfood.user.UserService/GetUser", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *userServiceClient) UpdateUser(ctx context.Context, in *UpdateUserInput, opts ...grpc.CallOption) (*UpdateUserOutput, error) { + out := new(UpdateUserOutput) + err := c.cc.Invoke(ctx, "/com.goodfood.user.UserService/UpdateUser", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *userServiceClient) DeleteUser(ctx context.Context, in *DeleteInput, opts ...grpc.CallOption) (*DeleteUserOutput, error) { + out := new(DeleteUserOutput) + err := c.cc.Invoke(ctx, "/com.goodfood.user.UserService/DeleteUser", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *userServiceClient) ListUser(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*UserList, error) { + out := new(UserList) + err := c.cc.Invoke(ctx, "/com.goodfood.user.UserService/ListUser", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *userServiceClient) LogIn(ctx context.Context, in *LogInInput, opts ...grpc.CallOption) (*LogInResponse, error) { + out := new(LogInResponse) + err := c.cc.Invoke(ctx, "/com.goodfood.user.UserService/LogIn", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *userServiceClient) Validate(ctx context.Context, in *ValidateInput, opts ...grpc.CallOption) (*ValidateResponse, error) { + out := new(ValidateResponse) + err := c.cc.Invoke(ctx, "/com.goodfood.user.UserService/Validate", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *userServiceClient) ChangePassword(ctx context.Context, in *ChangePasswordInput, opts ...grpc.CallOption) (*ChangePasswordOutput, error) { + out := new(ChangePasswordOutput) + err := c.cc.Invoke(ctx, "/com.goodfood.user.UserService/ChangePassword", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *userServiceClient) ChangeRole(ctx context.Context, in *ChangeRoleInput, opts ...grpc.CallOption) (*ChangeRoleOutput, error) { + out := new(ChangeRoleOutput) + err := c.cc.Invoke(ctx, "/com.goodfood.user.UserService/ChangeRole", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +// UserServiceServer is the server API for UserService service. +// All implementations must embed UnimplementedUserServiceServer +// for forward compatibility +type UserServiceServer interface { + Register(context.Context, *UserCreateInput) (*User, error) + GetUser(context.Context, *UserId) (*User, error) + UpdateUser(context.Context, *UpdateUserInput) (*UpdateUserOutput, error) + DeleteUser(context.Context, *DeleteInput) (*DeleteUserOutput, error) + ListUser(context.Context, *empty.Empty) (*UserList, error) + LogIn(context.Context, *LogInInput) (*LogInResponse, error) + Validate(context.Context, *ValidateInput) (*ValidateResponse, error) + ChangePassword(context.Context, *ChangePasswordInput) (*ChangePasswordOutput, error) + ChangeRole(context.Context, *ChangeRoleInput) (*ChangeRoleOutput, error) + mustEmbedUnimplementedUserServiceServer() +} + +// UnimplementedUserServiceServer must be embedded to have forward compatible implementations. +type UnimplementedUserServiceServer struct { +} + +func (UnimplementedUserServiceServer) Register(context.Context, *UserCreateInput) (*User, error) { + return nil, status.Errorf(codes.Unimplemented, "method Register not implemented") +} +func (UnimplementedUserServiceServer) GetUser(context.Context, *UserId) (*User, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetUser not implemented") +} +func (UnimplementedUserServiceServer) UpdateUser(context.Context, *UpdateUserInput) (*UpdateUserOutput, error) { + return nil, status.Errorf(codes.Unimplemented, "method UpdateUser not implemented") +} +func (UnimplementedUserServiceServer) DeleteUser(context.Context, *DeleteInput) (*DeleteUserOutput, error) { + return nil, status.Errorf(codes.Unimplemented, "method DeleteUser not implemented") +} +func (UnimplementedUserServiceServer) ListUser(context.Context, *empty.Empty) (*UserList, error) { + return nil, status.Errorf(codes.Unimplemented, "method ListUser not implemented") +} +func (UnimplementedUserServiceServer) LogIn(context.Context, *LogInInput) (*LogInResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method LogIn not implemented") +} +func (UnimplementedUserServiceServer) Validate(context.Context, *ValidateInput) (*ValidateResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method Validate not implemented") +} +func (UnimplementedUserServiceServer) ChangePassword(context.Context, *ChangePasswordInput) (*ChangePasswordOutput, error) { + return nil, status.Errorf(codes.Unimplemented, "method ChangePassword not implemented") +} +func (UnimplementedUserServiceServer) ChangeRole(context.Context, *ChangeRoleInput) (*ChangeRoleOutput, error) { + return nil, status.Errorf(codes.Unimplemented, "method ChangeRole not implemented") +} +func (UnimplementedUserServiceServer) mustEmbedUnimplementedUserServiceServer() {} + +// UnsafeUserServiceServer may be embedded to opt out of forward compatibility for this service. +// Use of this interface is not recommended, as added methods to UserServiceServer will +// result in compilation errors. +type UnsafeUserServiceServer interface { + mustEmbedUnimplementedUserServiceServer() +} + +func RegisterUserServiceServer(s grpc.ServiceRegistrar, srv UserServiceServer) { + s.RegisterService(&UserService_ServiceDesc, srv) +} + +func _UserService_Register_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(UserCreateInput) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(UserServiceServer).Register(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/com.goodfood.user.UserService/Register", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(UserServiceServer).Register(ctx, req.(*UserCreateInput)) + } + return interceptor(ctx, in, info, handler) +} + +func _UserService_GetUser_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(UserId) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(UserServiceServer).GetUser(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/com.goodfood.user.UserService/GetUser", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(UserServiceServer).GetUser(ctx, req.(*UserId)) + } + return interceptor(ctx, in, info, handler) +} + +func _UserService_UpdateUser_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(UpdateUserInput) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(UserServiceServer).UpdateUser(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/com.goodfood.user.UserService/UpdateUser", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(UserServiceServer).UpdateUser(ctx, req.(*UpdateUserInput)) + } + return interceptor(ctx, in, info, handler) +} + +func _UserService_DeleteUser_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(DeleteInput) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(UserServiceServer).DeleteUser(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/com.goodfood.user.UserService/DeleteUser", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(UserServiceServer).DeleteUser(ctx, req.(*DeleteInput)) + } + return interceptor(ctx, in, info, handler) +} + +func _UserService_ListUser_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(empty.Empty) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(UserServiceServer).ListUser(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/com.goodfood.user.UserService/ListUser", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(UserServiceServer).ListUser(ctx, req.(*empty.Empty)) + } + return interceptor(ctx, in, info, handler) +} + +func _UserService_LogIn_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(LogInInput) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(UserServiceServer).LogIn(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/com.goodfood.user.UserService/LogIn", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(UserServiceServer).LogIn(ctx, req.(*LogInInput)) + } + return interceptor(ctx, in, info, handler) +} + +func _UserService_Validate_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ValidateInput) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(UserServiceServer).Validate(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/com.goodfood.user.UserService/Validate", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(UserServiceServer).Validate(ctx, req.(*ValidateInput)) + } + return interceptor(ctx, in, info, handler) +} + +func _UserService_ChangePassword_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ChangePasswordInput) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(UserServiceServer).ChangePassword(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/com.goodfood.user.UserService/ChangePassword", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(UserServiceServer).ChangePassword(ctx, req.(*ChangePasswordInput)) + } + return interceptor(ctx, in, info, handler) +} + +func _UserService_ChangeRole_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ChangeRoleInput) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(UserServiceServer).ChangeRole(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/com.goodfood.user.UserService/ChangeRole", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(UserServiceServer).ChangeRole(ctx, req.(*ChangeRoleInput)) + } + return interceptor(ctx, in, info, handler) +} + +// UserService_ServiceDesc is the grpc.ServiceDesc for UserService service. +// It's only intended for direct use with grpc.RegisterService, +// and not to be introspected or modified (even as a copy) +var UserService_ServiceDesc = grpc.ServiceDesc{ + ServiceName: "com.goodfood.user.UserService", + HandlerType: (*UserServiceServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "Register", + Handler: _UserService_Register_Handler, + }, + { + MethodName: "GetUser", + Handler: _UserService_GetUser_Handler, + }, + { + MethodName: "UpdateUser", + Handler: _UserService_UpdateUser_Handler, + }, + { + MethodName: "DeleteUser", + Handler: _UserService_DeleteUser_Handler, + }, + { + MethodName: "ListUser", + Handler: _UserService_ListUser_Handler, + }, + { + MethodName: "LogIn", + Handler: _UserService_LogIn_Handler, + }, + { + MethodName: "Validate", + Handler: _UserService_Validate_Handler, + }, + { + MethodName: "ChangePassword", + Handler: _UserService_ChangePassword_Handler, + }, + { + MethodName: "ChangeRole", + Handler: _UserService_ChangeRole_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "user.proto", +} + +// MainAddressServiceClient is the client API for MainAddressService service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. +type MainAddressServiceClient interface { + GetMainAddress(ctx context.Context, in *MainAddressId, opts ...grpc.CallOption) (*MainAddress, error) + UpdateMainAddress(ctx context.Context, in *MainAddressUpdateInput, opts ...grpc.CallOption) (*MainAddress, error) +} + +type mainAddressServiceClient struct { + cc grpc.ClientConnInterface +} + +func NewMainAddressServiceClient(cc grpc.ClientConnInterface) MainAddressServiceClient { + return &mainAddressServiceClient{cc} +} + +func (c *mainAddressServiceClient) GetMainAddress(ctx context.Context, in *MainAddressId, opts ...grpc.CallOption) (*MainAddress, error) { + out := new(MainAddress) + err := c.cc.Invoke(ctx, "/com.goodfood.user.MainAddressService/GetMainAddress", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *mainAddressServiceClient) UpdateMainAddress(ctx context.Context, in *MainAddressUpdateInput, opts ...grpc.CallOption) (*MainAddress, error) { + out := new(MainAddress) + err := c.cc.Invoke(ctx, "/com.goodfood.user.MainAddressService/UpdateMainAddress", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +// MainAddressServiceServer is the server API for MainAddressService service. +// All implementations must embed UnimplementedMainAddressServiceServer +// for forward compatibility +type MainAddressServiceServer interface { + GetMainAddress(context.Context, *MainAddressId) (*MainAddress, error) + UpdateMainAddress(context.Context, *MainAddressUpdateInput) (*MainAddress, error) + mustEmbedUnimplementedMainAddressServiceServer() +} + +// UnimplementedMainAddressServiceServer must be embedded to have forward compatible implementations. +type UnimplementedMainAddressServiceServer struct { +} + +func (UnimplementedMainAddressServiceServer) GetMainAddress(context.Context, *MainAddressId) (*MainAddress, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetMainAddress not implemented") +} +func (UnimplementedMainAddressServiceServer) UpdateMainAddress(context.Context, *MainAddressUpdateInput) (*MainAddress, error) { + return nil, status.Errorf(codes.Unimplemented, "method UpdateMainAddress not implemented") +} +func (UnimplementedMainAddressServiceServer) mustEmbedUnimplementedMainAddressServiceServer() {} + +// UnsafeMainAddressServiceServer may be embedded to opt out of forward compatibility for this service. +// Use of this interface is not recommended, as added methods to MainAddressServiceServer will +// result in compilation errors. +type UnsafeMainAddressServiceServer interface { + mustEmbedUnimplementedMainAddressServiceServer() +} + +func RegisterMainAddressServiceServer(s grpc.ServiceRegistrar, srv MainAddressServiceServer) { + s.RegisterService(&MainAddressService_ServiceDesc, srv) +} + +func _MainAddressService_GetMainAddress_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(MainAddressId) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(MainAddressServiceServer).GetMainAddress(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/com.goodfood.user.MainAddressService/GetMainAddress", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(MainAddressServiceServer).GetMainAddress(ctx, req.(*MainAddressId)) + } + return interceptor(ctx, in, info, handler) +} + +func _MainAddressService_UpdateMainAddress_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(MainAddressUpdateInput) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(MainAddressServiceServer).UpdateMainAddress(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/com.goodfood.user.MainAddressService/UpdateMainAddress", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(MainAddressServiceServer).UpdateMainAddress(ctx, req.(*MainAddressUpdateInput)) + } + return interceptor(ctx, in, info, handler) +} + +// MainAddressService_ServiceDesc is the grpc.ServiceDesc for MainAddressService service. +// It's only intended for direct use with grpc.RegisterService, +// and not to be introspected or modified (even as a copy) +var MainAddressService_ServiceDesc = grpc.ServiceDesc{ + ServiceName: "com.goodfood.user.MainAddressService", + HandlerType: (*MainAddressServiceServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "GetMainAddress", + Handler: _MainAddressService_GetMainAddress_Handler, + }, + { + MethodName: "UpdateMainAddress", + Handler: _MainAddressService_UpdateMainAddress_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "user.proto", +} From e442c9c2f8400f1c21caa1ce4e374fe14bf11649 Mon Sep 17 00:00:00 2001 From: anatole Date: Tue, 4 Jul 2023 10:42:52 +0200 Subject: [PATCH 156/883] feat(user service): add main address routes --- services/proto/user.pb.go | 323 ++++++++++------- services/proto/user.proto | 12 +- services/proto/user_grpc.pb.go | 10 +- services/user/src/go.sum | 327 ++++++++++++++++++ services/user/src/main.go | 2 +- services/user/src/pkg/services/mainAddress.go | 40 +++ services/user/src/proto | 1 + 7 files changed, 583 insertions(+), 132 deletions(-) create mode 100644 services/user/src/go.sum create mode 100644 services/user/src/pkg/services/mainAddress.go create mode 120000 services/user/src/proto diff --git a/services/proto/user.pb.go b/services/proto/user.pb.go index 03b0d8ff..dad60a1b 100644 --- a/services/proto/user.pb.go +++ b/services/proto/user.pb.go @@ -1317,8 +1317,8 @@ type MainAddressUpdateInput struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - MainAddress *MainAddressInput `protobuf:"bytes,1,opt,name=mainAddress,proto3" json:"mainAddress,omitempty"` - UserId string `protobuf:"bytes,2,opt,name=userId,proto3" json:"userId,omitempty"` + Token string `protobuf:"bytes,1,opt,name=token,proto3" json:"token,omitempty"` + MainAddress *MainAddress `protobuf:"bytes,2,opt,name=mainAddress,proto3" json:"mainAddress,omitempty"` } func (x *MainAddressUpdateInput) Reset() { @@ -1353,16 +1353,71 @@ func (*MainAddressUpdateInput) Descriptor() ([]byte, []int) { return file_user_proto_rawDescGZIP(), []int{21} } -func (x *MainAddressUpdateInput) GetMainAddress() *MainAddressInput { +func (x *MainAddressUpdateInput) GetToken() string { + if x != nil { + return x.Token + } + return "" +} + +func (x *MainAddressUpdateInput) GetMainAddress() *MainAddress { + if x != nil { + return x.MainAddress + } + return nil +} + +type UpdateMainAddressOutput struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + MainAddress *MainAddress `protobuf:"bytes,1,opt,name=mainAddress,proto3" json:"mainAddress,omitempty"` + Error string `protobuf:"bytes,2,opt,name=error,proto3" json:"error,omitempty"` +} + +func (x *UpdateMainAddressOutput) Reset() { + *x = UpdateMainAddressOutput{} + if protoimpl.UnsafeEnabled { + mi := &file_user_proto_msgTypes[22] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *UpdateMainAddressOutput) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UpdateMainAddressOutput) ProtoMessage() {} + +func (x *UpdateMainAddressOutput) ProtoReflect() protoreflect.Message { + mi := &file_user_proto_msgTypes[22] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use UpdateMainAddressOutput.ProtoReflect.Descriptor instead. +func (*UpdateMainAddressOutput) Descriptor() ([]byte, []int) { + return file_user_proto_rawDescGZIP(), []int{22} +} + +func (x *UpdateMainAddressOutput) GetMainAddress() *MainAddress { if x != nil { return x.MainAddress } return nil } -func (x *MainAddressUpdateInput) GetUserId() string { +func (x *UpdateMainAddressOutput) GetError() string { if x != nil { - return x.UserId + return x.Error } return "" } @@ -1501,75 +1556,83 @@ var file_user_proto_rawDesc = []byte{ 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x1f, 0x0a, 0x0d, 0x4d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x49, 0x64, 0x12, 0x0e, 0x0a, - 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x77, 0x0a, + 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x70, 0x0a, 0x16, 0x4d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x55, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x12, 0x45, 0x0a, 0x0b, 0x6d, 0x61, 0x69, 0x6e, 0x41, - 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x63, - 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, - 0x2e, 0x4d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x49, 0x6e, 0x70, 0x75, - 0x74, 0x52, 0x0b, 0x6d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x16, - 0x0a, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, - 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x32, 0xe9, 0x05, 0x0a, 0x0b, 0x55, 0x73, 0x65, 0x72, 0x53, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x49, 0x0a, 0x08, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, - 0x65, 0x72, 0x12, 0x22, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, - 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x43, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x17, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, - 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x22, - 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x12, 0x19, 0x2e, 0x63, - 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, - 0x2e, 0x55, 0x73, 0x65, 0x72, 0x49, 0x64, 0x1a, 0x17, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, - 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, - 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0a, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, - 0x12, 0x22, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, - 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x49, - 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x23, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, - 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x55, - 0x73, 0x65, 0x72, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x53, 0x0a, 0x0a, 0x44, - 0x65, 0x6c, 0x65, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x12, 0x1e, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, - 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x44, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x23, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, - 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x44, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, - 0x12, 0x41, 0x0a, 0x08, 0x4c, 0x69, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, 0x12, 0x16, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, - 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1b, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, - 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x4c, 0x69, 0x73, - 0x74, 0x22, 0x00, 0x12, 0x4a, 0x0a, 0x05, 0x4c, 0x6f, 0x67, 0x49, 0x6e, 0x12, 0x1d, 0x2e, 0x63, - 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, - 0x2e, 0x6c, 0x6f, 0x67, 0x49, 0x6e, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x20, 0x2e, 0x63, 0x6f, - 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, - 0x6c, 0x6f, 0x67, 0x49, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, - 0x53, 0x0a, 0x08, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x12, 0x20, 0x2e, 0x63, 0x6f, - 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, - 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x23, 0x2e, - 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, - 0x72, 0x2e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x00, 0x12, 0x63, 0x0a, 0x0e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x61, - 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x26, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, - 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x63, 0x68, 0x61, 0x6e, 0x67, - 0x65, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x27, + 0x74, 0x65, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x40, 0x0a, + 0x0b, 0x6d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, + 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x4d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, + 0x73, 0x73, 0x52, 0x0b, 0x6d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x22, + 0x71, 0x0a, 0x17, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, + 0x72, 0x65, 0x73, 0x73, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x40, 0x0a, 0x0b, 0x6d, 0x61, + 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1e, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, + 0x73, 0x65, 0x72, 0x2e, 0x4d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, + 0x0b, 0x6d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x14, 0x0a, 0x05, + 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, + 0x6f, 0x72, 0x32, 0xe9, 0x05, 0x0a, 0x0b, 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x12, 0x49, 0x0a, 0x08, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x12, 0x22, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, - 0x65, 0x72, 0x2e, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, - 0x64, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0a, 0x43, 0x68, 0x61, - 0x6e, 0x67, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x12, 0x22, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, + 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x70, + 0x75, 0x74, 0x1a, 0x17, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, + 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x22, 0x00, 0x12, 0x3f, 0x0a, + 0x07, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x12, 0x19, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, + 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, + 0x72, 0x49, 0x64, 0x1a, 0x17, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, + 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x22, 0x00, 0x12, 0x57, + 0x0a, 0x0a, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x12, 0x22, 0x2e, 0x63, + 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, + 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x49, 0x6e, 0x70, 0x75, 0x74, + 0x1a, 0x23, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, + 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x4f, + 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x53, 0x0a, 0x0a, 0x44, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x55, 0x73, 0x65, 0x72, 0x12, 0x1e, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, + 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x23, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, + 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x55, 0x73, 0x65, 0x72, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x41, 0x0a, 0x08, + 0x4c, 0x69, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, + 0x1a, 0x1b, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, + 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x22, 0x00, 0x12, + 0x4a, 0x0a, 0x05, 0x4c, 0x6f, 0x67, 0x49, 0x6e, 0x12, 0x1d, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, + 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x6c, 0x6f, 0x67, + 0x49, 0x6e, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x20, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, + 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x6c, 0x6f, 0x67, 0x49, + 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x53, 0x0a, 0x08, 0x56, + 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x12, 0x20, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, + 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x76, 0x61, 0x6c, 0x69, + 0x64, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x23, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, + 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x76, 0x61, + 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, + 0x12, 0x63, 0x0a, 0x0e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, + 0x72, 0x64, 0x12, 0x26, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, + 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x61, 0x73, + 0x73, 0x77, 0x6f, 0x72, 0x64, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x27, 0x2e, 0x63, 0x6f, 0x6d, + 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x63, + 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x4f, 0x75, 0x74, + 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0a, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, + 0x6f, 0x6c, 0x65, 0x12, 0x22, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, + 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x6f, + 0x6c, 0x65, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x23, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x63, 0x68, 0x61, 0x6e, - 0x67, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x23, 0x2e, 0x63, 0x6f, - 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, - 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, - 0x22, 0x00, 0x32, 0xcc, 0x01, 0x0a, 0x12, 0x4d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, - 0x73, 0x73, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x54, 0x0a, 0x0e, 0x47, 0x65, 0x74, - 0x4d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x20, 0x2e, 0x63, 0x6f, + 0x67, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x32, 0xd8, + 0x01, 0x0a, 0x12, 0x4d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x53, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x54, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x4d, 0x61, 0x69, 0x6e, + 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x20, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, + 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x4d, 0x61, 0x69, 0x6e, + 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x49, 0x64, 0x1a, 0x1e, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, + 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x4d, 0x61, + 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x22, 0x00, 0x12, 0x6c, 0x0a, 0x11, 0x55, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, + 0x12, 0x29, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, + 0x75, 0x73, 0x65, 0x72, 0x2e, 0x4d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, + 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x2a, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, - 0x4d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x49, 0x64, 0x1a, 0x1e, 0x2e, - 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, - 0x72, 0x2e, 0x4d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x22, 0x00, 0x12, - 0x60, 0x0a, 0x11, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, - 0x72, 0x65, 0x73, 0x73, 0x12, 0x29, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, - 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x4d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, - 0x72, 0x65, 0x73, 0x73, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, - 0x1e, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, - 0x73, 0x65, 0x72, 0x2e, 0x4d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x22, - 0x00, 0x42, 0x03, 0x5a, 0x01, 0x2e, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, + 0x73, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x42, 0x03, 0x5a, 0x01, 0x2e, 0x62, 0x06, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -1584,31 +1647,32 @@ func file_user_proto_rawDescGZIP() []byte { return file_user_proto_rawDescData } -var file_user_proto_msgTypes = make([]protoimpl.MessageInfo, 22) +var file_user_proto_msgTypes = make([]protoimpl.MessageInfo, 23) var file_user_proto_goTypes = []interface{}{ - (*Role)(nil), // 0: com.goodfood.user.Role - (*MainAddress)(nil), // 1: com.goodfood.user.MainAddress - (*User)(nil), // 2: com.goodfood.user.User - (*UpdateUserInput)(nil), // 3: com.goodfood.user.UpdateUserInput - (*UpdateUserOutput)(nil), // 4: com.goodfood.user.UpdateUserOutput - (*UserCreateInput)(nil), // 5: com.goodfood.user.UserCreateInput - (*MainAddressInput)(nil), // 6: com.goodfood.user.MainAddressInput - (*RoleInput)(nil), // 7: com.goodfood.user.RoleInput - (*UserId)(nil), // 8: com.goodfood.user.UserId - (*UserList)(nil), // 9: com.goodfood.user.UserList - (*LogInInput)(nil), // 10: com.goodfood.user.logInInput - (*ValidateInput)(nil), // 11: com.goodfood.user.validateInput - (*DeleteInput)(nil), // 12: com.goodfood.user.DeleteInput - (*ValidateResponse)(nil), // 13: com.goodfood.user.validateResponse - (*LogInResponse)(nil), // 14: com.goodfood.user.logInResponse - (*ChangePasswordInput)(nil), // 15: com.goodfood.user.changePasswordInput - (*ChangePasswordOutput)(nil), // 16: com.goodfood.user.changePasswordOutput - (*ChangeRoleInput)(nil), // 17: com.goodfood.user.changeRoleInput - (*DeleteUserOutput)(nil), // 18: com.goodfood.user.DeleteUserOutput - (*ChangeRoleOutput)(nil), // 19: com.goodfood.user.changeRoleOutput - (*MainAddressId)(nil), // 20: com.goodfood.user.MainAddressId - (*MainAddressUpdateInput)(nil), // 21: com.goodfood.user.MainAddressUpdateInput - (*empty.Empty)(nil), // 22: google.protobuf.Empty + (*Role)(nil), // 0: com.goodfood.user.Role + (*MainAddress)(nil), // 1: com.goodfood.user.MainAddress + (*User)(nil), // 2: com.goodfood.user.User + (*UpdateUserInput)(nil), // 3: com.goodfood.user.UpdateUserInput + (*UpdateUserOutput)(nil), // 4: com.goodfood.user.UpdateUserOutput + (*UserCreateInput)(nil), // 5: com.goodfood.user.UserCreateInput + (*MainAddressInput)(nil), // 6: com.goodfood.user.MainAddressInput + (*RoleInput)(nil), // 7: com.goodfood.user.RoleInput + (*UserId)(nil), // 8: com.goodfood.user.UserId + (*UserList)(nil), // 9: com.goodfood.user.UserList + (*LogInInput)(nil), // 10: com.goodfood.user.logInInput + (*ValidateInput)(nil), // 11: com.goodfood.user.validateInput + (*DeleteInput)(nil), // 12: com.goodfood.user.DeleteInput + (*ValidateResponse)(nil), // 13: com.goodfood.user.validateResponse + (*LogInResponse)(nil), // 14: com.goodfood.user.logInResponse + (*ChangePasswordInput)(nil), // 15: com.goodfood.user.changePasswordInput + (*ChangePasswordOutput)(nil), // 16: com.goodfood.user.changePasswordOutput + (*ChangeRoleInput)(nil), // 17: com.goodfood.user.changeRoleInput + (*DeleteUserOutput)(nil), // 18: com.goodfood.user.DeleteUserOutput + (*ChangeRoleOutput)(nil), // 19: com.goodfood.user.changeRoleOutput + (*MainAddressId)(nil), // 20: com.goodfood.user.MainAddressId + (*MainAddressUpdateInput)(nil), // 21: com.goodfood.user.MainAddressUpdateInput + (*UpdateMainAddressOutput)(nil), // 22: com.goodfood.user.UpdateMainAddressOutput + (*empty.Empty)(nil), // 23: google.protobuf.Empty } var file_user_proto_depIdxs = []int32{ 1, // 0: com.goodfood.user.User.mainAddress:type_name -> com.goodfood.user.MainAddress @@ -1622,34 +1686,35 @@ var file_user_proto_depIdxs = []int32{ 2, // 8: com.goodfood.user.changePasswordOutput.user:type_name -> com.goodfood.user.User 2, // 9: com.goodfood.user.DeleteUserOutput.user:type_name -> com.goodfood.user.User 2, // 10: com.goodfood.user.changeRoleOutput.user:type_name -> com.goodfood.user.User - 6, // 11: com.goodfood.user.MainAddressUpdateInput.mainAddress:type_name -> com.goodfood.user.MainAddressInput - 5, // 12: com.goodfood.user.UserService.Register:input_type -> com.goodfood.user.UserCreateInput - 8, // 13: com.goodfood.user.UserService.GetUser:input_type -> com.goodfood.user.UserId - 3, // 14: com.goodfood.user.UserService.UpdateUser:input_type -> com.goodfood.user.UpdateUserInput - 12, // 15: com.goodfood.user.UserService.DeleteUser:input_type -> com.goodfood.user.DeleteInput - 22, // 16: com.goodfood.user.UserService.ListUser:input_type -> google.protobuf.Empty - 10, // 17: com.goodfood.user.UserService.LogIn:input_type -> com.goodfood.user.logInInput - 11, // 18: com.goodfood.user.UserService.Validate:input_type -> com.goodfood.user.validateInput - 15, // 19: com.goodfood.user.UserService.ChangePassword:input_type -> com.goodfood.user.changePasswordInput - 17, // 20: com.goodfood.user.UserService.ChangeRole:input_type -> com.goodfood.user.changeRoleInput - 20, // 21: com.goodfood.user.MainAddressService.GetMainAddress:input_type -> com.goodfood.user.MainAddressId - 21, // 22: com.goodfood.user.MainAddressService.UpdateMainAddress:input_type -> com.goodfood.user.MainAddressUpdateInput - 2, // 23: com.goodfood.user.UserService.Register:output_type -> com.goodfood.user.User - 2, // 24: com.goodfood.user.UserService.GetUser:output_type -> com.goodfood.user.User - 4, // 25: com.goodfood.user.UserService.UpdateUser:output_type -> com.goodfood.user.UpdateUserOutput - 18, // 26: com.goodfood.user.UserService.DeleteUser:output_type -> com.goodfood.user.DeleteUserOutput - 9, // 27: com.goodfood.user.UserService.ListUser:output_type -> com.goodfood.user.UserList - 14, // 28: com.goodfood.user.UserService.LogIn:output_type -> com.goodfood.user.logInResponse - 13, // 29: com.goodfood.user.UserService.Validate:output_type -> com.goodfood.user.validateResponse - 16, // 30: com.goodfood.user.UserService.ChangePassword:output_type -> com.goodfood.user.changePasswordOutput - 19, // 31: com.goodfood.user.UserService.ChangeRole:output_type -> com.goodfood.user.changeRoleOutput - 1, // 32: com.goodfood.user.MainAddressService.GetMainAddress:output_type -> com.goodfood.user.MainAddress - 1, // 33: com.goodfood.user.MainAddressService.UpdateMainAddress:output_type -> com.goodfood.user.MainAddress - 23, // [23:34] is the sub-list for method output_type - 12, // [12:23] is the sub-list for method input_type - 12, // [12:12] is the sub-list for extension type_name - 12, // [12:12] is the sub-list for extension extendee - 0, // [0:12] is the sub-list for field type_name + 1, // 11: com.goodfood.user.MainAddressUpdateInput.mainAddress:type_name -> com.goodfood.user.MainAddress + 1, // 12: com.goodfood.user.UpdateMainAddressOutput.mainAddress:type_name -> com.goodfood.user.MainAddress + 5, // 13: com.goodfood.user.UserService.Register:input_type -> com.goodfood.user.UserCreateInput + 8, // 14: com.goodfood.user.UserService.GetUser:input_type -> com.goodfood.user.UserId + 3, // 15: com.goodfood.user.UserService.UpdateUser:input_type -> com.goodfood.user.UpdateUserInput + 12, // 16: com.goodfood.user.UserService.DeleteUser:input_type -> com.goodfood.user.DeleteInput + 23, // 17: com.goodfood.user.UserService.ListUser:input_type -> google.protobuf.Empty + 10, // 18: com.goodfood.user.UserService.LogIn:input_type -> com.goodfood.user.logInInput + 11, // 19: com.goodfood.user.UserService.Validate:input_type -> com.goodfood.user.validateInput + 15, // 20: com.goodfood.user.UserService.ChangePassword:input_type -> com.goodfood.user.changePasswordInput + 17, // 21: com.goodfood.user.UserService.ChangeRole:input_type -> com.goodfood.user.changeRoleInput + 20, // 22: com.goodfood.user.MainAddressService.GetMainAddress:input_type -> com.goodfood.user.MainAddressId + 21, // 23: com.goodfood.user.MainAddressService.UpdateMainAddress:input_type -> com.goodfood.user.MainAddressUpdateInput + 2, // 24: com.goodfood.user.UserService.Register:output_type -> com.goodfood.user.User + 2, // 25: com.goodfood.user.UserService.GetUser:output_type -> com.goodfood.user.User + 4, // 26: com.goodfood.user.UserService.UpdateUser:output_type -> com.goodfood.user.UpdateUserOutput + 18, // 27: com.goodfood.user.UserService.DeleteUser:output_type -> com.goodfood.user.DeleteUserOutput + 9, // 28: com.goodfood.user.UserService.ListUser:output_type -> com.goodfood.user.UserList + 14, // 29: com.goodfood.user.UserService.LogIn:output_type -> com.goodfood.user.logInResponse + 13, // 30: com.goodfood.user.UserService.Validate:output_type -> com.goodfood.user.validateResponse + 16, // 31: com.goodfood.user.UserService.ChangePassword:output_type -> com.goodfood.user.changePasswordOutput + 19, // 32: com.goodfood.user.UserService.ChangeRole:output_type -> com.goodfood.user.changeRoleOutput + 1, // 33: com.goodfood.user.MainAddressService.GetMainAddress:output_type -> com.goodfood.user.MainAddress + 22, // 34: com.goodfood.user.MainAddressService.UpdateMainAddress:output_type -> com.goodfood.user.UpdateMainAddressOutput + 24, // [24:35] is the sub-list for method output_type + 13, // [13:24] is the sub-list for method input_type + 13, // [13:13] is the sub-list for extension type_name + 13, // [13:13] is the sub-list for extension extendee + 0, // [0:13] is the sub-list for field type_name } func init() { file_user_proto_init() } @@ -1922,6 +1987,18 @@ func file_user_proto_init() { return nil } } + file_user_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UpdateMainAddressOutput); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } } type x struct{} out := protoimpl.TypeBuilder{ @@ -1929,7 +2006,7 @@ func file_user_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_user_proto_rawDesc, NumEnums: 0, - NumMessages: 22, + NumMessages: 23, NumExtensions: 0, NumServices: 2, }, diff --git a/services/proto/user.proto b/services/proto/user.proto index 83bb1294..488a850f 100644 --- a/services/proto/user.proto +++ b/services/proto/user.proto @@ -57,7 +57,7 @@ service UserService { service MainAddressService { rpc GetMainAddress (MainAddressId) returns (MainAddress) {} - rpc UpdateMainAddress (MainAddressUpdateInput) returns (MainAddress) {} + rpc UpdateMainAddress (MainAddressUpdateInput) returns (UpdateMainAddressOutput) {} } message UserCreateInput { @@ -147,6 +147,12 @@ message MainAddressId { } message MainAddressUpdateInput { - MainAddressInput mainAddress = 1; - string userId = 2; + string token = 1; + MainAddress mainAddress = 2; +} + + +message UpdateMainAddressOutput { + MainAddress mainAddress = 1; + string error = 2; } \ No newline at end of file diff --git a/services/proto/user_grpc.pb.go b/services/proto/user_grpc.pb.go index 0690470b..636ed457 100644 --- a/services/proto/user_grpc.pb.go +++ b/services/proto/user_grpc.pb.go @@ -398,7 +398,7 @@ var UserService_ServiceDesc = grpc.ServiceDesc{ // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. type MainAddressServiceClient interface { GetMainAddress(ctx context.Context, in *MainAddressId, opts ...grpc.CallOption) (*MainAddress, error) - UpdateMainAddress(ctx context.Context, in *MainAddressUpdateInput, opts ...grpc.CallOption) (*MainAddress, error) + UpdateMainAddress(ctx context.Context, in *MainAddressUpdateInput, opts ...grpc.CallOption) (*UpdateMainAddressOutput, error) } type mainAddressServiceClient struct { @@ -418,8 +418,8 @@ func (c *mainAddressServiceClient) GetMainAddress(ctx context.Context, in *MainA return out, nil } -func (c *mainAddressServiceClient) UpdateMainAddress(ctx context.Context, in *MainAddressUpdateInput, opts ...grpc.CallOption) (*MainAddress, error) { - out := new(MainAddress) +func (c *mainAddressServiceClient) UpdateMainAddress(ctx context.Context, in *MainAddressUpdateInput, opts ...grpc.CallOption) (*UpdateMainAddressOutput, error) { + out := new(UpdateMainAddressOutput) err := c.cc.Invoke(ctx, "/com.goodfood.user.MainAddressService/UpdateMainAddress", in, out, opts...) if err != nil { return nil, err @@ -432,7 +432,7 @@ func (c *mainAddressServiceClient) UpdateMainAddress(ctx context.Context, in *Ma // for forward compatibility type MainAddressServiceServer interface { GetMainAddress(context.Context, *MainAddressId) (*MainAddress, error) - UpdateMainAddress(context.Context, *MainAddressUpdateInput) (*MainAddress, error) + UpdateMainAddress(context.Context, *MainAddressUpdateInput) (*UpdateMainAddressOutput, error) mustEmbedUnimplementedMainAddressServiceServer() } @@ -443,7 +443,7 @@ type UnimplementedMainAddressServiceServer struct { func (UnimplementedMainAddressServiceServer) GetMainAddress(context.Context, *MainAddressId) (*MainAddress, error) { return nil, status.Errorf(codes.Unimplemented, "method GetMainAddress not implemented") } -func (UnimplementedMainAddressServiceServer) UpdateMainAddress(context.Context, *MainAddressUpdateInput) (*MainAddress, error) { +func (UnimplementedMainAddressServiceServer) UpdateMainAddress(context.Context, *MainAddressUpdateInput) (*UpdateMainAddressOutput, error) { return nil, status.Errorf(codes.Unimplemented, "method UpdateMainAddress not implemented") } func (UnimplementedMainAddressServiceServer) mustEmbedUnimplementedMainAddressServiceServer() {} diff --git a/services/user/src/go.sum b/services/user/src/go.sum new file mode 100644 index 00000000..88eb282f --- /dev/null +++ b/services/user/src/go.sum @@ -0,0 +1,327 @@ +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/Masterminds/semver/v3 v3.1.1/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= +github.com/Microsoft/go-winio v0.4.14/go.mod h1:qXqCSQ3Xa7+6tgxaGTIe4Kpcdsi+P8jBhyzoq1bpyYA= +github.com/Microsoft/go-winio v0.4.16/go.mod h1:XB6nPKklQyQ7GC9LdcBEcBl8PF76WugXOPRXwdLnMv0= +github.com/Microsoft/go-winio v0.6.0 h1:slsWYD/zyx7lCXoZVlvQrj0hPTM1HI4+v1sIda2yDvg= +github.com/Microsoft/go-winio v0.6.0/go.mod h1:cTAf44im0RAYeL23bpB+fzCyDH2MJiz2BO69KH/soAE= +github.com/ProtonMail/go-crypto v0.0.0-20210428141323-04723f9f07d7 h1:YoJbenK9C67SkzkDfmQuVln04ygHj3vjZfd9FL+GmQQ= +github.com/ProtonMail/go-crypto v0.0.0-20210428141323-04723f9f07d7/go.mod h1:z4/9nQmJSSwwds7ejkxaJwO37dru3geImFUdJlaLzQo= +github.com/acomagu/bufpipe v1.0.3 h1:fxAGrHZTgQ9w5QqVItgzwj235/uYZYgbXitB+dLupOk= +github.com/acomagu/bufpipe v1.0.3/go.mod h1:mxdxdup/WdsKVreO5GpW4+M/1CE2sMG4jeGJ2sYmHc4= +github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c= +github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= +github.com/bitly/go-simplejson v0.5.0 h1:6IH+V8/tVMab511d5bn4M7EwGXZf9Hj6i2xSwkNEM+Y= +github.com/bitly/go-simplejson v0.5.0/go.mod h1:cXHtHw4XUPsvGaxgjIAn8PhEWG9NfngEKAMDJEczWVA= +github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ= +github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/go-systemd v0.0.0-20190719114852-fd7a80b32e1f/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= +github.com/cpuguy83/go-md2man/v2 v2.0.0 h1:EoUDS0afbrsXAZ9YQ9jdu/mZ2sXgT1/2yyNng4PGlyM= +github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= +github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/emirpasic/gods v1.12.0 h1:QAUIPSaCu4G+POclxeqb3F+WPpdKqFGlw36+yOzGlrg= +github.com/emirpasic/gods v1.12.0/go.mod h1:YfzfFFoVP/catgzJb4IKIqXjX78Ha8FMSDh3ymbK86o= +github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= +github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= +github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= +github.com/fsnotify/fsnotify v1.5.1 h1:mZcQUHVQUQWoPXXtuf9yuEXKudkV2sx1E06UadKWpgI= +github.com/fsnotify/fsnotify v1.5.1/go.mod h1:T3375wBYaZdLLcVNkcVbzGHY7f1l/uK5T5Ai1i3InKU= +github.com/gliderlabs/ssh v0.2.2/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0= +github.com/go-git/gcfg v1.5.0 h1:Q5ViNfGF8zFgyJWPqYwA7qGFoMTEiBmdlkcfRmpIMa4= +github.com/go-git/gcfg v1.5.0/go.mod h1:5m20vg6GwYabIxaOonVkTdrILxQMpEShl1xiMF4ua+E= +github.com/go-git/go-billy/v5 v5.2.0/go.mod h1:pmpqyWchKfYfrkb/UVH4otLvyi/5gJlGI4Hb3ZqZ3W0= +github.com/go-git/go-billy/v5 v5.3.1 h1:CPiOUAzKtMRvolEKw+bG1PLRpT7D3LIs3/3ey4Aiu34= +github.com/go-git/go-billy/v5 v5.3.1/go.mod h1:pmpqyWchKfYfrkb/UVH4otLvyi/5gJlGI4Hb3ZqZ3W0= +github.com/go-git/go-git-fixtures/v4 v4.2.1/go.mod h1:K8zd3kDUAykwTdDCr+I0per6Y6vMiRR/nnVTBtavnB0= +github.com/go-git/go-git/v5 v5.4.2 h1:BXyZu9t0VkbiHtqrsvdq39UDhGJTl1h55VW6CSC4aY4= +github.com/go-git/go-git/v5 v5.4.2/go.mod h1:gQ1kArt6d+n+BGd+/B/I74HwRTLhth2+zti4ihgckDc= +github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= +github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= +github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/gofrs/uuid v4.0.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= +github.com/golang-jwt/jwt v3.2.2+incompatible h1:IfV12K8xAKAnZqdXVzCZ+TOjboZ2keLg81eXfW3O+oY= +github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= +github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= +github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= +github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= +github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= +github.com/hellokvn/go-grpc-auth-svc v0.0.0-20220329201106-de9b08c8e812 h1:LU6I+7QVwjBBbWirc3+KEr0PWy675bZMyvG5zuW9C6I= +github.com/hellokvn/go-grpc-auth-svc v0.0.0-20220329201106-de9b08c8e812/go.mod h1:5SRSCOJcnlIsTZsiiRiYgwFHdjr9tR6vESwJcoSiqrg= +github.com/imdario/mergo v0.3.12 h1:b6R2BslTbIEToALKP7LxUvijTsNI9TAe80pLWN2g/HU= +github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= +github.com/jackc/chunkreader v1.0.0/go.mod h1:RT6O25fNZIuasFJRyZ4R/Y2BbhasbmZXF9QQ7T3kePo= +github.com/jackc/chunkreader/v2 v2.0.0/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk= +github.com/jackc/chunkreader/v2 v2.0.1 h1:i+RDz65UE+mmpjTfyz0MoVTnzeYxroil2G82ki7MGG8= +github.com/jackc/chunkreader/v2 v2.0.1/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk= +github.com/jackc/pgconn v0.0.0-20190420214824-7e0022ef6ba3/go.mod h1:jkELnwuX+w9qN5YIfX0fl88Ehu4XC3keFuOJJk9pcnA= +github.com/jackc/pgconn v0.0.0-20190824142844-760dd75542eb/go.mod h1:lLjNuW/+OfW9/pnVKPazfWOgNfH2aPem8YQ7ilXGvJE= +github.com/jackc/pgconn v0.0.0-20190831204454-2fabfa3c18b7/go.mod h1:ZJKsE/KZfsUgOEh9hBm+xYTstcNHg7UPMVJqRfQxq4s= +github.com/jackc/pgconn v1.8.0/go.mod h1:1C2Pb36bGIP9QHGBYCjnyhqu7Rv3sGshaQUvmfGIB/o= +github.com/jackc/pgconn v1.9.0/go.mod h1:YctiPyvzfU11JFxoXokUOOKQXQmDMoJL9vJzHH8/2JY= +github.com/jackc/pgconn v1.9.1-0.20210724152538-d89c8390a530/go.mod h1:4z2w8XhRbP1hYxkpTuBjTS3ne3J48K83+u0zoyvg2pI= +github.com/jackc/pgconn v1.10.1 h1:DzdIHIjG1AxGwoEEqS+mGsURyjt4enSmqzACXvVzOT8= +github.com/jackc/pgconn v1.10.1/go.mod h1:4z2w8XhRbP1hYxkpTuBjTS3ne3J48K83+u0zoyvg2pI= +github.com/jackc/pgio v1.0.0 h1:g12B9UwVnzGhueNavwioyEEpAmqMe1E/BN9ES+8ovkE= +github.com/jackc/pgio v1.0.0/go.mod h1:oP+2QK2wFfUWgr+gxjoBH9KGBb31Eio69xUb0w5bYf8= +github.com/jackc/pgmock v0.0.0-20190831213851-13a1b77aafa2/go.mod h1:fGZlG77KXmcq05nJLRkk0+p82V8B8Dw8KN2/V9c/OAE= +github.com/jackc/pgmock v0.0.0-20201204152224-4fe30f7445fd/go.mod h1:hrBW0Enj2AZTNpt/7Y5rr2xe/9Mn757Wtb2xeBzPv2c= +github.com/jackc/pgmock v0.0.0-20210724152146-4ad1a8207f65/go.mod h1:5R2h2EEX+qri8jOWMbJCtaPWkrrNc7OHwsp2TCqp7ak= +github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM= +github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg= +github.com/jackc/pgproto3 v1.1.0/go.mod h1:eR5FA3leWg7p9aeAqi37XOTgTIbkABlvcPB3E5rlc78= +github.com/jackc/pgproto3/v2 v2.0.0-alpha1.0.20190420180111-c116219b62db/go.mod h1:bhq50y+xrl9n5mRYyCBFKkpRVTLYJVWeCc+mEAI3yXA= +github.com/jackc/pgproto3/v2 v2.0.0-alpha1.0.20190609003834-432c2951c711/go.mod h1:uH0AWtUmuShn0bcesswc4aBTWGvw0cAxIJp+6OB//Wg= +github.com/jackc/pgproto3/v2 v2.0.0-rc3/go.mod h1:ryONWYqW6dqSg1Lw6vXNMXoBJhpzvWKnT95C46ckYeM= +github.com/jackc/pgproto3/v2 v2.0.0-rc3.0.20190831210041-4c03ce451f29/go.mod h1:ryONWYqW6dqSg1Lw6vXNMXoBJhpzvWKnT95C46ckYeM= +github.com/jackc/pgproto3/v2 v2.0.6/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= +github.com/jackc/pgproto3/v2 v2.1.1/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= +github.com/jackc/pgproto3/v2 v2.2.0 h1:r7JypeP2D3onoQTCxWdTpCtJ4D+qpKr0TxvoyMhZ5ns= +github.com/jackc/pgproto3/v2 v2.2.0/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= +github.com/jackc/pgservicefile v0.0.0-20200714003250-2b9c44734f2b h1:C8S2+VttkHFdOOCXJe+YGfa4vHYwlt4Zx+IVXQ97jYg= +github.com/jackc/pgservicefile v0.0.0-20200714003250-2b9c44734f2b/go.mod h1:vsD4gTJCa9TptPL8sPkXrLZ+hDuNrZCnj29CQpr4X1E= +github.com/jackc/pgtype v0.0.0-20190421001408-4ed0de4755e0/go.mod h1:hdSHsc1V01CGwFsrv11mJRHWJ6aifDLfdV3aVjFF0zg= +github.com/jackc/pgtype v0.0.0-20190824184912-ab885b375b90/go.mod h1:KcahbBH1nCMSo2DXpzsoWOAfFkdEtEJpPbVLq8eE+mc= +github.com/jackc/pgtype v0.0.0-20190828014616-a8802b16cc59/go.mod h1:MWlu30kVJrUS8lot6TQqcg7mtthZ9T0EoIBFiJcmcyw= +github.com/jackc/pgtype v1.8.1-0.20210724151600-32e20a603178/go.mod h1:C516IlIV9NKqfsMCXTdChteoXmwgUceqaLfjg2e3NlM= +github.com/jackc/pgtype v1.9.1 h1:MJc2s0MFS8C3ok1wQTdQxWuXQcB6+HwAm5x1CzW7mf0= +github.com/jackc/pgtype v1.9.1/go.mod h1:LUMuVrfsFfdKGLw+AFFVv6KtHOFMwRgDDzBt76IqCA4= +github.com/jackc/pgx/v4 v4.0.0-20190420224344-cc3461e65d96/go.mod h1:mdxmSJJuR08CZQyj1PVQBHy9XOp5p8/SHH6a0psbY9Y= +github.com/jackc/pgx/v4 v4.0.0-20190421002000-1b8f0016e912/go.mod h1:no/Y67Jkk/9WuGR0JG/JseM9irFbnEPbuWV2EELPNuM= +github.com/jackc/pgx/v4 v4.0.0-pre1.0.20190824185557-6972a5742186/go.mod h1:X+GQnOEnf1dqHGpw7JmHqHc1NxDoalibchSk9/RWuDc= +github.com/jackc/pgx/v4 v4.12.1-0.20210724153913-640aa07df17c/go.mod h1:1QD0+tgSXP7iUjYm9C1NxKhny7lq6ee99u/z+IHFcgs= +github.com/jackc/pgx/v4 v4.14.1 h1:71oo1KAGI6mXhLiTMn6iDFcp3e7+zon/capWjl2OEFU= +github.com/jackc/pgx/v4 v4.14.1/go.mod h1:RgDuE4Z34o7XE92RpLsvFiOEfrAUT0Xt2KxvX73W06M= +github.com/jackc/puddle v0.0.0-20190413234325-e4ced69a3a2b/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= +github.com/jackc/puddle v0.0.0-20190608224051-11cab39313c9/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= +github.com/jackc/puddle v1.1.3/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= +github.com/jackc/puddle v1.2.0/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= +github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOlocH6Fxy8MmwDt+yVQYULKfN0RoTN8A= +github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo= +github.com/jessevdk/go-flags v1.5.0/go.mod h1:Fw0T6WPc1dYxT4mKEZRfG5kJhaTDP9pj1c2EWnYs/m4= +github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E= +github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= +github.com/jinzhu/now v1.1.4 h1:tHnRBy1i5F2Dh8BAFxqFzxKqqvezXrL2OW1TnX+Mlas= +github.com/jinzhu/now v1.1.4/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= +github.com/kevinburke/ssh_config v0.0.0-20201106050909-4977a11b4351 h1:DowS9hvgyYSX4TO5NpyC606/Z4SxnNYbT+WX27or6Ck= +github.com/kevinburke/ssh_config v0.0.0-20201106050909-4977a11b4351/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +github.com/lib/pq v1.1.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +github.com/lib/pq v1.10.2/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/magiconair/properties v1.8.5 h1:b6kJs+EmPFMYGkow9GiUyCyOvIwYetYJ3fSaWak/Gls= +github.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= +github.com/matryer/is v1.2.0/go.mod h1:2fLPjFQM9rhQ15aVEtbuwhJinnOqrmgXPNdZsdwlWXA= +github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= +github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= +github.com/miekg/dns v1.1.43 h1:JKfpVSCB84vrAmHzyrsxB5NAr5kLoMXZArPSw7Qlgyg= +github.com/miekg/dns v1.1.43/go.mod h1:+evo5L0630/F6ca/Z9+GAqzhjGyn8/c+TBaOyfEl0V4= +github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= +github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/mapstructure v1.4.3 h1:OVowDSCllw/YjdLkam3/sm7wEtOy59d8ndGgCcyj8cs= +github.com/mitchellh/mapstructure v1.4.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= +github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= +github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= +github.com/oxtoacart/bpool v0.0.0-20190530202638-03653db5a59c h1:rp5dCmg/yLR3mgFuSOe4oEnDDmGLROTvMragMUXpTQw= +github.com/oxtoacart/bpool v0.0.0-20190530202638-03653db5a59c/go.mod h1:X07ZCGwUbLaax7L0S3Tw4hpejzu63ZrrQiUe6W0hcy0= +github.com/patrickmn/go-cache v2.1.0+incompatible h1:HRMgzkcYKYpi3C8ajMPV8OFXaaRUnok+kx1WdO15EQc= +github.com/patrickmn/go-cache v2.1.0+incompatible/go.mod h1:3Qf8kWWT7OJRJbdiICTKqZju1ZixQ/KpMGzzAfe6+WQ= +github.com/pelletier/go-toml v1.9.4 h1:tjENF6MfZAg8e4ZmZTeWaWiT2vXtsoO6+iuOjFhECwM= +github.com/pelletier/go-toml v1.9.4/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= +github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= +github.com/rs/zerolog v1.13.0/go.mod h1:YbFCdg8HfsridGWAh22vktObvhZbQsZXe4/zB0OKkWU= +github.com/rs/zerolog v1.15.0/go.mod h1:xYTKnLHcpfU2225ny5qZjxnj9NvkumZYjJHlAThCjNc= +github.com/russross/blackfriday/v2 v2.0.1 h1:lPqVAte+HuHNfhJ/0LC98ESWRz8afy9tM/0RK8m9o+Q= +github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= +github.com/sergi/go-diff v1.1.0 h1:we8PVUC3FE2uYfodKH/nBHMSetSfHDR6scGdBi+erh0= +github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= +github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24/go.mod h1:M+9NzErvs504Cn4c5DxATwIqPbtswREoFCre64PpcG4= +github.com/shopspring/decimal v1.2.0/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= +github.com/shurcooL/sanitized_anchor_name v1.0.0 h1:PdmoCO6wvbs+7yrJyMORt4/BmY5IYyJwS/kOiWx8mHo= +github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= +github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= +github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= +github.com/spf13/afero v1.6.0 h1:xoax2sJ2DT8S8xA2paPFjDCScCNeWsg75VG0DLRreiY= +github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= +github.com/spf13/cast v1.4.1 h1:s0hze+J0196ZfEMTs80N7UlFt0BDuQ7Q+JDnHiMWKdA= +github.com/spf13/cast v1.4.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk= +github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= +github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= +github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/viper v1.10.1 h1:nuJZuYpG7gTj/XqiUwg8bA0cp1+M2mC3J4g5luUYBKk= +github.com/spf13/viper v1.10.1/go.mod h1:IGlFPqhNAPKRxohIzWpI5QEy4kuI7tcl5WvR+8qy1rU= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s= +github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= +github.com/urfave/cli/v2 v2.3.0 h1:qph92Y649prgesehzOrQjdWyxFOp/QVM+6imKHad91M= +github.com/urfave/cli/v2 v2.3.0/go.mod h1:LJmUH05zAU44vOAcrfzZQKsZbVcdbOG8rtL3/XcUArI= +github.com/xanzy/ssh-agent v0.3.0 h1:wUMzuKtKilRgBAD1sUb8gOwwRr2FGoBVumcjoOACClI= +github.com/xanzy/ssh-agent v0.3.0/go.mod h1:3s9xbODqPuuhK9JV1R321M/FlMZSBvE5aY6eAcqrDh0= +github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q= +go-micro.dev/v4 v4.10.0 h1:YWiOyGHNFEcD90umbuJLiwOtAVHKO2zVxZPIUv/wcKM= +go-micro.dev/v4 v4.10.0/go.mod h1:KhUBhqhahZ8Ur5qNWFYXvU4cpG5/GHozNcCdihuyZmI= +go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= +go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= +go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= +go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= +go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= +go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= +go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= +go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= +go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= +go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= +go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= +golang.org/x/crypto v0.0.0-20190219172222-a4c6cb3142f2/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190411191339-88737f569e3a/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE= +golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20201203163018-be400aefbc4c/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= +golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= +golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= +golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20220315160706-3147a52a75dd h1:XcWmESyNjXJMLahc3mqVQJcgSTDxFxhETVlfk9uGc38= +golang.org/x/crypto v0.0.0-20220315160706-3147a52a75dd/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20220321153916-2c7772ba3064 h1:S25/rfnfsMVgORT4/J61MJ7rdyseOZOyvLIrZEZ7s6s= +golang.org/x/crypto v0.0.0-20220321153916-2c7772ba3064/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= +golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.9.0 h1:KENHtAZL2y3NLMYZeHY9DW8HW8V+kQyJsY/V9JlKvCs= +golang.org/x/mod v0.9.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210326060303-6b1517762897/go.mod h1:uSPa2vr4CLtc/ILN5odXGNXS6mhrKVzTaCXzk9m6W3k= +golang.org/x/net v0.8.0 h1:Zrh2ngAOFYneWTAIAPethzeaQLuHwhuBkuV6ZiRnUaQ= +golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o= +golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210324051608-47abb6519492/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210502180810-71e4cd670f79/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.6.0 h1:MVltZSvRTcU2ljQOhs94SXPftV6DCNnZViHeQps87pQ= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.8.0 h1:57P1ETyNKtuIjB4SRd15iJxuhj8Gc416Y78H3qgMh68= +golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190425163242-31fd60d6bfdc/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190823170909-c4a336ef6a2f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200103221440-774c71fcf114/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.7.0 h1:W4OVu8VVOaIO0yzWMNdepAulS7YfoS3Zabrm8DOXXU4= +golang.org/x/tools v0.7.0/go.mod h1:4pg6aUX35JBAogB10C9AtvVL+qowtN4pT3CGSQex14s= +golang.org/x/xerrors v0.0.0-20190410155217-1f06c39b4373/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20190513163551-3ee3066db522/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/genproto v0.0.0-20230306155012-7f2fa6fef1f4 h1:DdoeryqhaXp1LtT/emMP1BRJPHHKFi5akj/nbx/zNTA= +google.golang.org/genproto v0.0.0-20230306155012-7f2fa6fef1f4/go.mod h1:NWraEVixdDnqcqQ30jipen1STv2r/n24Wb7twVTGR4s= +google.golang.org/grpc v1.53.0 h1:LAv2ds7cmFV/XTS3XG1NneeENYrXGmorPxsBbptIjNc= +google.golang.org/grpc v1.53.0/go.mod h1:OnIrk0ipVdj4N5d9IUoFUx72/VlD7+jUsHwZgwSMQpw= +google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= +google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w= +google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= +gopkg.in/inconshreveable/log15.v2 v2.0.0-20180818164646-67afb5ed74ec/go.mod h1:aPpfJ7XW+gOuirDoZ8gHhLh3kZ1B08FtV2bbmy7Jv3s= +gopkg.in/ini.v1 v1.66.2 h1:XfR1dOYubytKy4Shzc2LHrrGhU0lDCfDGG1yLPmpgsI= +gopkg.in/ini.v1 v1.66.2/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= +gopkg.in/warnings.v0 v0.1.2 h1:wFXVbFY8DY5/xOe1ECiWdKCzZlxgshcYVNkBHstARME= +gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gorm.io/driver/postgres v1.3.1 h1:Pyv+gg1Gq1IgsLYytj/S2k7ebII3CzEdpqQkPOdH24g= +gorm.io/driver/postgres v1.3.1/go.mod h1:WwvWOuR9unCLpGWCL6Y3JOeBWvbKi6JLhayiVclSZZU= +gorm.io/gorm v1.23.1/go.mod h1:l2lP/RyAtc1ynaTjFksBde/O8v9oOGIApu2/xRitmZk= +gorm.io/gorm v1.23.3 h1:jYh3nm7uLZkrMVfA8WVNjDZryKfr7W+HTlInVgKFJAg= +gorm.io/gorm v1.23.3/go.mod h1:l2lP/RyAtc1ynaTjFksBde/O8v9oOGIApu2/xRitmZk= +honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= diff --git a/services/user/src/main.go b/services/user/src/main.go index 90caa436..517edbed 100644 --- a/services/user/src/main.go +++ b/services/user/src/main.go @@ -14,7 +14,7 @@ import ( func main() { c, err := config.LoadConfig() - url := "localhost:" + c.Port + url := "0.0.0.0:" + c.Port if err != nil { log.Fatalln("Failed at config", err) diff --git a/services/user/src/pkg/services/mainAddress.go b/services/user/src/pkg/services/mainAddress.go new file mode 100644 index 00000000..ee7ff5d7 --- /dev/null +++ b/services/user/src/pkg/services/mainAddress.go @@ -0,0 +1,40 @@ +package services + +import ( + "context" + "goodfood-user/pkg/mapper" + "goodfood-user/pkg/models" + pb "goodfood-user/proto" +) + +func (s *Server) GetMainAddress(ctx context.Context, req *pb.MainAddressId) (*pb.MainAddress, error) { + var address models.MainAddress + + if result := s.H.DB.Where(&models.User{Id: req.Id}).First(&address); result.Error == nil { + return nil, result.Error + } + + return mapper.ToProtoMainAddress(*&address), nil +} + +func (s *Server) UpdateMainAddress(ctx context.Context, req *pb.MainAddressUpdateInput) (*pb.UpdateMainAddressOutput, error) { + claims, err := s.Jwt.ValidateToken(req.Token) + if err != nil { + return &pb.UpdateMainAddressOutput{ + Error: "Invalid token", + }, nil + } + + if result := s.H.DB.Where(&models.User{Id: claims.Id}); result.Error != nil { + return &pb.UpdateMainAddressOutput{ + Error: "User not found", + }, nil + } + var mainAddress = mapper.ToModelMainAddress(req.MainAddress) + + s.H.DB.Save(&mainAddress) + + return &pb.UpdateMainAddressOutput{ + MainAddress: mapper.ToProtoMainAddress(*mainAddress), + }, nil +} diff --git a/services/user/src/proto b/services/user/src/proto new file mode 120000 index 00000000..15de3591 --- /dev/null +++ b/services/user/src/proto @@ -0,0 +1 @@ +../../proto/ \ No newline at end of file From 4ed2fa2b8681e18498ccf689eefe97ffdc043951 Mon Sep 17 00:00:00 2001 From: Florian LEROUX Date: Tue, 4 Jul 2023 13:51:43 +0200 Subject: [PATCH 157/883] feat(restaurant/group): add restaurant and group --- services/proto/metric.proto | 91 ++++++++- services/reporting/Database/Context.cs | 5 + .../20230501130538_InitialCreate.Designer.cs | 64 ------- .../20230501130538_InitialCreate.cs | 46 ----- ...0230704091414_InitialMigration.Designer.cs | 142 ++++++++++++++ .../20230704091414_InitialMigration.cs | 109 +++++++++++ .../ReportingContextModelSnapshot.cs | 78 ++++++++ services/reporting/Models/Metric.cs | 59 ++++-- services/reporting/Models/Restaurant.cs | 178 +++++++++++++++++- services/reporting/README.md | 71 ++++++- .../Services/GRPC/ReportingService.cs | 124 +++++++++++- services/reporting/Tests/MetricModel_Tests.cs | 76 ++++---- 12 files changed, 866 insertions(+), 177 deletions(-) delete mode 100644 services/reporting/Migrations/20230501130538_InitialCreate.Designer.cs delete mode 100644 services/reporting/Migrations/20230501130538_InitialCreate.cs create mode 100644 services/reporting/Migrations/20230704091414_InitialMigration.Designer.cs create mode 100644 services/reporting/Migrations/20230704091414_InitialMigration.cs diff --git a/services/proto/metric.proto b/services/proto/metric.proto index 8e933ce6..d3d2bc42 100644 --- a/services/proto/metric.proto +++ b/services/proto/metric.proto @@ -7,20 +7,51 @@ option csharp_namespace = "reporting"; package com.goodfood.reporting; message Metric { - string id = 1; + int32 id = 1; string key = 2; - string restaurant_id = 3; google.protobuf.Timestamp date = 4; string code = 5; string value = 6; + + string restaurant_id = 3; + Restaurant restaurant = 7; +} + +message Restaurant { + string id = 1; + string name = 2; + string key = 3; + optional string address = 4; + + int32 group_id = 5; + string group_name = 6; + + RestaurantGroup group = 7; +} + +message RestaurantGroup { + int32 id = 1; + string name = 2; } service ReportingService { rpc GetMetric (GetMetricRequest) returns (Metric) {} rpc GetMetricsByRestaurant(GetMetricsByRestaurantRequest) returns (GetMetricsByRestaurantResponse) {} rpc GetMetricsByRestaurantAndDate (GetMetricsByRestaurantAndDateRequest) returns (GetMetricsByRestaurantAndDateResponse) {} + rpc GetMetricsByRestaurantGroup(GetMetricsByRestaurantGroupRequest) returns (GetMetricsByRestaurantGroupResponse) {} + rpc PushMetric (PushMetricRequest) returns (PushMetricResponse) {} + + rpc GetRestaurant (GetRestaurantRequest) returns (Restaurant) {} + rpc CreateRestaurant (CreateRestaurantRequest) returns (Restaurant) {} + rpc UpdateRestaurant (UpdateRestaurantRequest) returns (Restaurant) {} + rpc DeleteRestaurant (DeleteRestaurantRequest) returns (DeleteRestaurantResponse) {} + + rpc GetRestaurantGroup (GetRestaurantGroupRequest) returns (RestaurantGroup) {} + rpc CreateRestaurantGroup (CreateRestaurantGroupRequest) returns (RestaurantGroup) {} + rpc UpdateRestaurantGroup (UpdateRestaurantGroupRequest) returns (RestaurantGroup) {} + rpc DeleteRestaurantGroup (DeleteRestaurantGroupRequest) returns (DeleteRestaurantGroupResponse) {} } message GetMetricRequest { @@ -44,6 +75,14 @@ message GetMetricsByRestaurantAndDateResponse { repeated Metric metrics = 1; } +message GetMetricsByRestaurantGroupRequest { + int32 restaurant_group_id = 1; +} + +message GetMetricsByRestaurantGroupResponse { + repeated Metric metrics = 1; +} + message PushMetricRequest { string restaurant_id = 1; string code = 2; @@ -53,3 +92,51 @@ message PushMetricRequest { message PushMetricResponse { string key = 1; } + +message GetRestaurantRequest { + string id = 1; +} + +message CreateRestaurantRequest { + string name = 1; + string key = 2; + string address = 3; + int32 group_id = 4; +} + +message UpdateRestaurantRequest { + string id = 1; + string name = 2; + string key = 3; + string address = 4; + int32 group_id = 5; +} + +message DeleteRestaurantRequest { + string id = 1; +} + +message DeleteRestaurantResponse { + bool success = 1; +} + +message GetRestaurantGroupRequest { + int32 id = 1; +} + +message CreateRestaurantGroupRequest { + string name = 1; +} + +message UpdateRestaurantGroupRequest { + int32 id = 1; + string name = 2; +} + +message DeleteRestaurantGroupRequest { + int32 id = 1; +} + +message DeleteRestaurantGroupResponse { + bool success = 1; +} diff --git a/services/reporting/Database/Context.cs b/services/reporting/Database/Context.cs index df64f1f5..eaa3b3c7 100644 --- a/services/reporting/Database/Context.cs +++ b/services/reporting/Database/Context.cs @@ -4,10 +4,15 @@ public class ReportingContext : DbContext { public DbSet Metrics { get; set; } + public DbSet Restaurants { get; set; } + public DbSet Groups { get; set; } public ReportingContext() { Metrics = Set(); + Restaurants = Set(); + Groups = Set(); + } diff --git a/services/reporting/Migrations/20230501130538_InitialCreate.Designer.cs b/services/reporting/Migrations/20230501130538_InitialCreate.Designer.cs deleted file mode 100644 index b4e67834..00000000 --- a/services/reporting/Migrations/20230501130538_InitialCreate.Designer.cs +++ /dev/null @@ -1,64 +0,0 @@ -// -using System; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; -using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; - -#nullable disable - -namespace reporting.Migrations -{ - [DbContext(typeof(ReportingContext))] - [Migration("20230501130538_InitialCreate")] - partial class InitialCreate - { - /// - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder - .HasAnnotation("ProductVersion", "7.0.5") - .HasAnnotation("Relational:MaxIdentifierLength", 63); - - NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); - - modelBuilder.Entity("reporting.Models.Metric", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("Code") - .IsRequired() - .HasColumnType("text"); - - b.Property("Date") - .HasColumnType("timestamp with time zone"); - - b.Property("Key") - .IsRequired() - .HasColumnType("text"); - - b.Property("RestaurantId") - .IsRequired() - .HasColumnType("text"); - - b.Property("Value") - .IsRequired() - .HasColumnType("text"); - - b.HasKey("Id"); - - b.HasIndex("Key") - .IsUnique(); - - b.ToTable("Metrics"); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/services/reporting/Migrations/20230501130538_InitialCreate.cs b/services/reporting/Migrations/20230501130538_InitialCreate.cs deleted file mode 100644 index 40853b11..00000000 --- a/services/reporting/Migrations/20230501130538_InitialCreate.cs +++ /dev/null @@ -1,46 +0,0 @@ -using System; -using Microsoft.EntityFrameworkCore.Migrations; -using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; - -#nullable disable - -namespace reporting.Migrations -{ - /// - public partial class InitialCreate : Migration - { - /// - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.CreateTable( - name: "Metrics", - columns: table => new - { - Id = table.Column(type: "integer", nullable: false) - .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), - Key = table.Column(type: "text", nullable: false), - RestaurantId = table.Column(type: "text", nullable: false), - Date = table.Column(type: "timestamp with time zone", nullable: false), - Code = table.Column(type: "text", nullable: false), - Value = table.Column(type: "text", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_Metrics", x => x.Id); - }); - - migrationBuilder.CreateIndex( - name: "IX_Metrics_Key", - table: "Metrics", - column: "Key", - unique: true); - } - - /// - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropTable( - name: "Metrics"); - } - } -} diff --git a/services/reporting/Migrations/20230704091414_InitialMigration.Designer.cs b/services/reporting/Migrations/20230704091414_InitialMigration.Designer.cs new file mode 100644 index 00000000..4fcd81cc --- /dev/null +++ b/services/reporting/Migrations/20230704091414_InitialMigration.Designer.cs @@ -0,0 +1,142 @@ +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; + +#nullable disable + +namespace reporting.Migrations +{ + [DbContext(typeof(ReportingContext))] + [Migration("20230704091414_InitialMigration")] + partial class InitialMigration + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "7.0.5") + .HasAnnotation("Relational:MaxIdentifierLength", 63); + + NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); + + modelBuilder.Entity("reporting.Models.Metric", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Code") + .IsRequired() + .HasColumnType("text"); + + b.Property("Date") + .HasColumnType("timestamp with time zone"); + + b.Property("Key") + .IsRequired() + .HasColumnType("text"); + + b.Property("RestaurantId") + .IsRequired() + .HasColumnType("text"); + + b.Property("Value") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("Id"); + + b.HasIndex("Key") + .IsUnique(); + + b.HasIndex("RestaurantId"); + + b.ToTable("Metrics"); + }); + + modelBuilder.Entity("reporting.Models.Restaurant", b => + { + b.Property("Id") + .HasColumnType("text"); + + b.Property("Address") + .HasColumnType("text"); + + b.Property("GroupId") + .HasColumnType("integer"); + + b.Property("GroupName") + .HasColumnType("text"); + + b.Property("Key") + .IsRequired() + .HasColumnType("text"); + + b.Property("Name") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("Id"); + + b.HasIndex("GroupId"); + + b.HasIndex("Key") + .IsUnique(); + + b.ToTable("Restaurants"); + }); + + modelBuilder.Entity("reporting.Models.RestaurantGroup", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Name") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("Id"); + + b.ToTable("Groups"); + }); + + modelBuilder.Entity("reporting.Models.Metric", b => + { + b.HasOne("reporting.Models.Restaurant", "Restaurant") + .WithMany() + .HasForeignKey("RestaurantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Restaurant"); + }); + + modelBuilder.Entity("reporting.Models.Restaurant", b => + { + b.HasOne("reporting.Models.RestaurantGroup", "Group") + .WithMany("Restaurants") + .HasForeignKey("GroupId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Group"); + }); + + modelBuilder.Entity("reporting.Models.RestaurantGroup", b => + { + b.Navigation("Restaurants"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/services/reporting/Migrations/20230704091414_InitialMigration.cs b/services/reporting/Migrations/20230704091414_InitialMigration.cs new file mode 100644 index 00000000..0e2458c4 --- /dev/null +++ b/services/reporting/Migrations/20230704091414_InitialMigration.cs @@ -0,0 +1,109 @@ +using System; +using Microsoft.EntityFrameworkCore.Migrations; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; + +#nullable disable + +namespace reporting.Migrations +{ + /// + public partial class InitialMigration : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.CreateTable( + name: "Groups", + columns: table => new + { + Id = table.Column(type: "integer", nullable: false) + .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), + Name = table.Column(type: "text", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_Groups", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "Restaurants", + columns: table => new + { + Id = table.Column(type: "text", nullable: false), + Name = table.Column(type: "text", nullable: false), + Key = table.Column(type: "text", nullable: false), + Address = table.Column(type: "text", nullable: true), + GroupId = table.Column(type: "integer", nullable: false), + GroupName = table.Column(type: "text", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_Restaurants", x => x.Id); + table.ForeignKey( + name: "FK_Restaurants_Groups_GroupId", + column: x => x.GroupId, + principalTable: "Groups", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "Metrics", + columns: table => new + { + Id = table.Column(type: "integer", nullable: false) + .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), + Key = table.Column(type: "text", nullable: false), + Date = table.Column(type: "timestamp with time zone", nullable: false), + Code = table.Column(type: "text", nullable: false), + Value = table.Column(type: "text", nullable: false), + RestaurantId = table.Column(type: "text", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_Metrics", x => x.Id); + table.ForeignKey( + name: "FK_Metrics_Restaurants_RestaurantId", + column: x => x.RestaurantId, + principalTable: "Restaurants", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateIndex( + name: "IX_Metrics_Key", + table: "Metrics", + column: "Key", + unique: true); + + migrationBuilder.CreateIndex( + name: "IX_Metrics_RestaurantId", + table: "Metrics", + column: "RestaurantId"); + + migrationBuilder.CreateIndex( + name: "IX_Restaurants_GroupId", + table: "Restaurants", + column: "GroupId"); + + migrationBuilder.CreateIndex( + name: "IX_Restaurants_Key", + table: "Restaurants", + column: "Key", + unique: true); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropTable( + name: "Metrics"); + + migrationBuilder.DropTable( + name: "Restaurants"); + + migrationBuilder.DropTable( + name: "Groups"); + } + } +} diff --git a/services/reporting/Migrations/ReportingContextModelSnapshot.cs b/services/reporting/Migrations/ReportingContextModelSnapshot.cs index 7472ef36..92a293bc 100644 --- a/services/reporting/Migrations/ReportingContextModelSnapshot.cs +++ b/services/reporting/Migrations/ReportingContextModelSnapshot.cs @@ -53,8 +53,86 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.HasIndex("Key") .IsUnique(); + b.HasIndex("RestaurantId"); + b.ToTable("Metrics"); }); + + modelBuilder.Entity("reporting.Models.Restaurant", b => + { + b.Property("Id") + .HasColumnType("text"); + + b.Property("Address") + .HasColumnType("text"); + + b.Property("GroupId") + .HasColumnType("integer"); + + b.Property("GroupName") + .HasColumnType("text"); + + b.Property("Key") + .IsRequired() + .HasColumnType("text"); + + b.Property("Name") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("Id"); + + b.HasIndex("GroupId"); + + b.HasIndex("Key") + .IsUnique(); + + b.ToTable("Restaurants"); + }); + + modelBuilder.Entity("reporting.Models.RestaurantGroup", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Name") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("Id"); + + b.ToTable("Groups"); + }); + + modelBuilder.Entity("reporting.Models.Metric", b => + { + b.HasOne("reporting.Models.Restaurant", "Restaurant") + .WithMany() + .HasForeignKey("RestaurantId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Restaurant"); + }); + + modelBuilder.Entity("reporting.Models.Restaurant", b => + { + b.HasOne("reporting.Models.RestaurantGroup", "Group") + .WithMany("Restaurants") + .HasForeignKey("GroupId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Group"); + }); + + modelBuilder.Entity("reporting.Models.RestaurantGroup", b => + { + b.Navigation("Restaurants"); + }); #pragma warning restore 612, 618 } } diff --git a/services/reporting/Models/Metric.cs b/services/reporting/Models/Metric.cs index 6831aad4..97245543 100644 --- a/services/reporting/Models/Metric.cs +++ b/services/reporting/Models/Metric.cs @@ -3,9 +3,7 @@ namespace reporting.Models { - // TODO: upsert on push, instead of throwing exception [Index(nameof(Metric.Key), IsUnique = true)] - // TODO: add foreign on RestaurantId to Restaurant.Key public class Metric { public int Id { get; set; } @@ -13,60 +11,79 @@ public class Metric // Key is a combination of RestaurantId, Date and Code (RestaurantId:Date:Code) and isUnique public string Key { get; set; } = null!; // RestaurantId is a foreign key to Restaurant.Key - public string RestaurantId { get; set; } = null!; public DateTime Date { get; set; } public string Code { get; set; } = null!; public string Value { get; set; } = null!; + public string RestaurantId { get; set; } = null!; + public Restaurant Restaurant { get; set; } = null!; + - public static Metric FromGrpcPushMetric(PushMetricRequest request) + public static Metric FromGrpcPushMetric(PushMetricRequest Request) { + Restaurant? restaurant = Restaurant.GetRestaurant(Request.RestaurantId); + if (restaurant == null) + throw new System.Exception("Restaurant not found"); + + return new Metric { - Key = request.RestaurantId + ":" + DateTime.Now.Date.ToString("yyyy-MM-dd") + ":" + request.Code, - RestaurantId = request.RestaurantId, + Key = Request.RestaurantId + ":" + DateTime.Now.Date.ToString("yyyy-MM-dd") + ":" + Request.Code, + RestaurantId = Request.RestaurantId, + Restaurant = restaurant, Date = Google.Protobuf.WellKnownTypes.Timestamp.FromDateTime(DateTime.UtcNow).ToDateTime(), - Code = request.Code, - Value = request.Value + Code = Request.Code, + Value = Request.Value }; } public reporting.Metric ToGrpcMetric() { + Restaurant? restaurant = Restaurant.GetRestaurant(this.RestaurantId); + if (restaurant == null) + throw new System.Exception("Restaurant not found"); + return new reporting.Metric { - Id = this.Id.ToString(), + Id = this.Id, Key = this.Key, RestaurantId = this.RestaurantId, Date = Google.Protobuf.WellKnownTypes.Timestamp.FromDateTime(this.Date.ToUniversalTime()), Code = this.Code, - Value = this.Value + Value = this.Value, + Restaurant = restaurant.ToGrpcRestaurant() }; } // getters and setters for the database - public static Metric? GetMetricByKey(string key) + public static Metric? GetMetricByKey(string Key) { using ReportingContext db = new ReportingContext(); - return db.Metrics.FirstOrDefault(m => m.Key == key); + return db.Metrics.FirstOrDefault(m => m.Key == Key); } - public static List GetMetricsByRestaurant(string key) + public static List GetMetricsByRestaurant(string Key) { using ReportingContext db = new ReportingContext(); - return db.Metrics.Where(m => m.RestaurantId == key).ToList(); + return db.Metrics.Where(m => m.RestaurantId == Key).ToList(); } - public static List GetMetricsByRestaurantAndDate(string key, string date) + public static List GetMetricsByRestaurantAndDate(string Key, string Date) { - List metrics = GetMetricsByRestaurant(key); - return metrics.Where(m => m.Date.ToString("yyyy-MM-dd") == date).ToList(); + List metrics = GetMetricsByRestaurant(Key); + return metrics.Where(m => m.Date.ToString("yyyy-MM-dd") == Date).ToList(); } - public Metric SaveMetric() + public static List GetMetricsByRestaurantGroup(int GroupId) + { + using ReportingContext db = new ReportingContext(); + return db.Metrics.Where(m => m.Restaurant.GroupId == GroupId).ToList(); + } + + public Metric Save() { using ReportingContext db = new ReportingContext(); // if already exists, upsert - if(db.Metrics.Any(m => m.Key == this.Key)) + if (db.Metrics.Any(m => m.Key == this.Key)) { Metric metric = db.Metrics.First(m => m.Key == this.Key); metric.Value = this.Value; @@ -76,6 +93,10 @@ public Metric SaveMetric() return this; } + // attach restaurant + + db.Restaurants.Attach(this.Restaurant); + db.Metrics.Add(this); db.SaveChanges(); return this; diff --git a/services/reporting/Models/Restaurant.cs b/services/reporting/Models/Restaurant.cs index 47fa78c2..c5313406 100644 --- a/services/reporting/Models/Restaurant.cs +++ b/services/reporting/Models/Restaurant.cs @@ -1,4 +1,5 @@ using Microsoft.EntityFrameworkCore; +using System; namespace reporting.Models @@ -7,11 +8,186 @@ namespace reporting.Models [Index(nameof(Restaurant.Key), IsUnique = true)] public class Restaurant { - public int Id { get; set; } + public string Id { get; set; } = null!; public string Name { get; set; } = null!; public string Key { get; set; } = null!; + public string? Address { get; set; } + + public int GroupId { get; set; } + public string? GroupName { get; set; } = null!; + public virtual RestaurantGroup Group { get; set; } + + public reporting.Restaurant ToGrpcRestaurant() + { + return new reporting.Restaurant + { + Id = this.Id, + Name = this.Name, + Key = this.Key, + Address = this.Address, + GroupId = this.GroupId, + GroupName = this.GroupName + }; + } + + public static Restaurant FromGrpc(CreateRestaurantRequest Request) + { + RestaurantGroup? group = RestaurantGroup.GetRestaurantGroup(Request.GroupId); + if (group == null) + throw new System.Exception("Group not found"); + + Restaurant restaurant = new Restaurant + { + Id = Request.Key + "_" + Guid.NewGuid().ToString(), + Name = Request.Name, + Key = Request.Key, + Address = Request.Address, + GroupId = group.Id, + GroupName = group.Name, + }; + + restaurant.Group = group; + + return restaurant; + + } + + public static Restaurant FromUpdateGrpc(UpdateRestaurantRequest Request) + { + Restaurant? restaurant = GetRestaurant(Request.Id); + if (restaurant == null) + throw new System.Exception("Restaurant not found"); + + RestaurantGroup? group = RestaurantGroup.GetRestaurantGroup(Request.GroupId); + if (group == null) + throw new System.Exception("Group not found"); + + restaurant.Name = Request.Name; + restaurant.Key = Request.Key; + restaurant.Address = Request.Address; + restaurant.GroupId = group.Id; + restaurant.GroupName = group.Name; + restaurant.Group = group; + + return restaurant; + } + + public static Restaurant? GetRestaurant(string Id) + { + using ReportingContext db = new ReportingContext(); + return db.Restaurants.FirstOrDefault(r => r.Id == Id); + } + + public Restaurant Save() + { + + + using ReportingContext db = new ReportingContext(); + + db.Groups.Attach(this.Group); + + db.Restaurants.Add(this); + db.SaveChanges(); + return this; + } + + public Restaurant Update() + { + using ReportingContext db = new ReportingContext(); + + db.Groups.Attach(this.Group); + + db.Restaurants.Update(this); + db.SaveChanges(); + return this; + } + + public static void Delete(string Id) + { + using ReportingContext db = new ReportingContext(); + Restaurant? restaurant = db.Restaurants.FirstOrDefault(r => r.Id == Id); + if (restaurant == null) + throw new System.Exception("Restaurant not found"); + db.Restaurants.Remove(restaurant); + db.SaveChanges(); + } + + } + + public class RestaurantGroup + { + public int Id { get; set; } + public string Name { get; set; } = null!; + + public virtual ICollection Restaurants { get; set; } + + public RestaurantGroup() + { + this.Restaurants = new HashSet(); + } + + + public static RestaurantGroup FromGrpc(CreateRestaurantGroupRequest Request) + { + return new RestaurantGroup + { + Name = Request.Name + }; + } + + public static RestaurantGroup FromUpdateGrpc(UpdateRestaurantGroupRequest Request) + { + RestaurantGroup? group = GetRestaurantGroup(Request.Id); + if (group == null) + throw new System.Exception("Group not found"); + + group.Name = Request.Name; + + return group; + } + + public reporting.RestaurantGroup ToGrpcRestaurantGroup() + { + return new reporting.RestaurantGroup + { + Id = this.Id, + Name = this.Name + }; + } + + public static RestaurantGroup? GetRestaurantGroup(int Id) + { + using ReportingContext db = new ReportingContext(); + return db.Groups.FirstOrDefault(g => g.Id == Id); + } + + + + public RestaurantGroup Save() + { + using ReportingContext db = new ReportingContext(); + db.Groups.Add(this); + db.SaveChanges(); + return this; + } + public RestaurantGroup Update() + { + using ReportingContext db = new ReportingContext(); + db.Groups.Update(this); + db.SaveChanges(); + return this; + } + public static void Delete(int Id) + { + using ReportingContext db = new ReportingContext(); + RestaurantGroup? group = db.Groups.FirstOrDefault(g => g.Id == Id); + if (group == null) + throw new System.Exception("Group not found"); + db.Groups.Remove(group); + db.SaveChanges(); + } } } diff --git a/services/reporting/README.md b/services/reporting/README.md index c8d36170..18fde5fb 100644 --- a/services/reporting/README.md +++ b/services/reporting/README.md @@ -53,7 +53,7 @@ You can use the following tools to help you with the setup: Install `grpcurl` on your machine. -1. Create a new report + + + +1. GetMetric: + +`grpcurl -d '{"key": "example_key"}' localhost:50020 com.goodfood.reporting.ReportingService.GetMetric` + +2. GetMetricsByRestaurant: + + +`grpcurl -d '{"restaurant_id": "example_restaurant_id"}' localhost:50020 com.goodfood.reporting.ReportingService.GetMetricsByRestaurant` + +3. GetMetricsByRestaurantAndDate: + + +`grpcurl -d '{"restaurant_id": "example_restaurant_id", "date": "example_date"}' localhost:50020 com.goodfood.reporting.ReportingService.GetMetricsByRestaurantAndDate` + +4. GetMetricsByRestaurantGroup: + + +`grpcurl -d '{"restaurant_group_id": "example_group_id"}' localhost:50020 com.goodfood.reporting.ReportingService.GetMetricsByRestaurantGroup` + +5. PushMetric: + + +`grpcurl -d '{"restaurant_id": "example_restaurant_id", "code": "example_code", "value": "example_value"}' localhost:50020 com.goodfood.reporting.ReportingService.PushMetric` + +6. GetRestaurant: + + +`grpcurl -d '{"id": "example_restaurant_id"}' localhost:50020 com.goodfood.reporting.ReportingService.GetRestaurant` + +7. CreateRestaurant: + + +`grpcurl -d '{"name": "example_name", "key": "example_key", "address": "example_address", "group_id": "1"}' localhost:50020 com.goodfood.reporting.ReportingService.CreateRestaurant` + +8. UpdateRestaurant: + + +`grpcurl -d '{"id": "example_restaurant_id", "name": "example_name", "key": "example_key", "address": "example_address", "group_id": "1"}' localhost:50020 com.goodfood.reporting.ReportingService.UpdateRestaurant` + +9. DeleteRestaurant: + + +`grpcurl -d '{"id": "example_restaurant_id"}' localhost:50020 com.goodfood.reporting.ReportingService.DeleteRestaurant` + +10. GetRestaurantGroup: + + +`grpcurl -d '{"id": "1"}' localhost:50020 com.goodfood.reporting.ReportingService.GetRestaurantGroup` + +11. CreateRestaurantGroup: + + +`grpcurl -d '{"name": "example_group_name"}' localhost:50020 com.goodfood.reporting.ReportingService.CreateRestaurantGroup` + +12. UpdateRestaurantGroup: + + +`grpcurl -d '{"id": "1", "name": "example_group_name"}' localhost:50020 com.goodfood.reporting.ReportingService.UpdateRestaurantGroup` + +13. DeleteRestaurantGroup: + + +`grpcurl -d '{"id": "1"}' localhost:50020 com.goodfood.reporting.ReportingService.DeleteRestaurantGroup` + +I've included placeholder values like "example_key" and "example_restaurant_id" in the commands. Replace them with the actual values you want to use when making the requests diff --git a/services/reporting/Services/GRPC/ReportingService.cs b/services/reporting/Services/GRPC/ReportingService.cs index fe920ae2..a3386556 100644 --- a/services/reporting/Services/GRPC/ReportingService.cs +++ b/services/reporting/Services/GRPC/ReportingService.cs @@ -1,5 +1,7 @@ using Grpc.Core; using MetricModel = reporting.Models.Metric; +using RestaurantModel = reporting.Models.Restaurant; +using RestaurantGroupModel = reporting.Models.RestaurantGroup; using MetricGrpc = reporting.Metric; using ReportingServiceAMQP = reporting.Services.RabbitMQ.ReportingService; @@ -19,16 +21,17 @@ public ReportingService(ILogger logger) _amqp = new ReportingServiceAMQP(logger); } - private void LogRequest(T request, ServerCallContext context) + private void LogRequest(T Request, ServerCallContext Context) { string Date = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); - string Method = context.Method.Split('.').Last(); - string RequestBody = request?.ToString() ?? "null"; + string Method = Context.Method.Split('.').Last(); + string RequestBody = Request?.ToString() ?? "null"; _logger.LogInformation("\x1b[35m{Date}\x1b[0m | \x1b[36mGRPC\x1b[0m | \x1b[33m{Message}\x1b[0m\n", Date, Method + " with: " + RequestBody); - _amqp.LogRequest(request); + _amqp.LogRequest(Method, Request); } + #region Metric public override Task GetMetric(GetMetricRequest request, ServerCallContext context) { LogRequest(request, context); @@ -62,12 +65,123 @@ public override Task GetMetricsByRestaura return Task.FromResult(new GetMetricsByRestaurantAndDateResponse { Metrics = { response } }); } + public override Task GetMetricsByRestaurantGroup(GetMetricsByRestaurantGroupRequest request, ServerCallContext context) + { + LogRequest(request, context); + + List metrics = MetricModel.GetMetricsByRestaurantGroup(request.RestaurantGroupId); + + List response = metrics.Select(m => m.ToGrpcMetric()).ToList(); + + // WARNING: this returns an empty object if no metrics are found + return Task.FromResult(new GetMetricsByRestaurantGroupResponse { Metrics = { response } }); + } + public override Task PushMetric(PushMetricRequest request, ServerCallContext context) { LogRequest(request, context); - MetricModel metric = MetricModel.FromGrpcPushMetric(request).SaveMetric(); + MetricModel metric = MetricModel.FromGrpcPushMetric(request).Save(); return Task.FromResult(new PushMetricResponse { Key = metric.Key }); } + + #endregion + + #region Restaurant + public override Task GetRestaurant(GetRestaurantRequest request, ServerCallContext context) + { + LogRequest(request, context); + + RestaurantModel? restaurant = RestaurantModel.GetRestaurant(request.Id); + if (restaurant == null) + throw new RpcException(new Status(StatusCode.NotFound, "Restaurant not found")); + + return Task.FromResult(restaurant.ToGrpcRestaurant()); + } + + public override Task CreateRestaurant(CreateRestaurantRequest request, ServerCallContext context) + { + LogRequest(request, context); + + RestaurantModel restaurant = RestaurantModel.FromGrpc(request).Save(); + + return Task.FromResult(restaurant.ToGrpcRestaurant()); + } + + public override Task UpdateRestaurant(UpdateRestaurantRequest request, ServerCallContext context) + { + LogRequest(request, context); + + RestaurantModel? restaurant = RestaurantModel.FromUpdateGrpc(request).Update(); + + return Task.FromResult(restaurant.ToGrpcRestaurant()); + } + + public override Task DeleteRestaurant(DeleteRestaurantRequest request, ServerCallContext context) + { + LogRequest(request, context); + + try + { + RestaurantModel.Delete(request.Id); + return Task.FromResult(new DeleteRestaurantResponse { Success = true }); + } + catch + { + return Task.FromResult(new DeleteRestaurantResponse { Success = false }); + + } + } + #endregion + + #region RestaurantGroup + + public override Task GetRestaurantGroup(GetRestaurantGroupRequest request, ServerCallContext context) + { + LogRequest(request, context); + + RestaurantGroupModel? restaurantGroup = RestaurantGroupModel.GetRestaurantGroup(request.Id); + if (restaurantGroup == null) + throw new RpcException(new Status(StatusCode.NotFound, "Restaurant group not found")); + + return Task.FromResult(restaurantGroup.ToGrpcRestaurantGroup()); + } + + public override Task CreateRestaurantGroup(CreateRestaurantGroupRequest request, ServerCallContext context) + { + LogRequest(request, context); + + RestaurantGroupModel restaurantGroup = RestaurantGroupModel.FromGrpc(request); + restaurantGroup = restaurantGroup.Save(); + + return Task.FromResult(restaurantGroup.ToGrpcRestaurantGroup()); + } + + public override Task UpdateRestaurantGroup(UpdateRestaurantGroupRequest request, ServerCallContext context) + { + LogRequest(request, context); + + RestaurantGroupModel? restaurantGroup = RestaurantGroupModel.FromUpdateGrpc(request).Update(); + + return Task.FromResult(restaurantGroup.ToGrpcRestaurantGroup()); + } + + public override Task DeleteRestaurantGroup(DeleteRestaurantGroupRequest request, ServerCallContext context) + { + LogRequest(request, context); + + try + { + RestaurantGroupModel.Delete(request.Id); + return Task.FromResult(new DeleteRestaurantGroupResponse { Success = true }); + } + catch + { + return Task.FromResult(new DeleteRestaurantGroupResponse { Success = false }); + + } + } + + #endregion } diff --git a/services/reporting/Tests/MetricModel_Tests.cs b/services/reporting/Tests/MetricModel_Tests.cs index c2ddee56..a9947510 100644 --- a/services/reporting/Tests/MetricModel_Tests.cs +++ b/services/reporting/Tests/MetricModel_Tests.cs @@ -26,50 +26,50 @@ public void GetKey_Test() } - [Fact] - public void FromGrpcPushMetric_Test() - { - string RestaurantId = "restaurant_test"; - string Code = "incomes_24h"; - string Value = "test"; + // [Fact] + // public void FromGrpcPushMetric_Test() + // { + // string RestaurantId = "restaurant_test"; + // string Code = "incomes_24h"; + // string Value = "test"; - MetricModel metric = MetricModel.FromGrpcPushMetric(new reporting.PushMetricRequest - { - RestaurantId = RestaurantId, - Code = Code, - Value = Value - }); + // MetricModel metric = MetricModel.FromGrpcPushMetric(new reporting.PushMetricRequest + // { + // RestaurantId = RestaurantId, + // Code = Code, + // Value = Value + // }); - Assert.Equal(metric.RestaurantId, RestaurantId); - Assert.Equal(metric.Code, Code); - Assert.Equal(metric.Value, Value); + // Assert.Equal(metric.RestaurantId, RestaurantId); + // Assert.Equal(metric.Code, Code); + // Assert.Equal(metric.Value, Value); - Assert.Equal(metric.Key, metric.GetKey()); - } + // Assert.Equal(metric.Key, metric.GetKey()); + // } - [Fact] - public void ToGrpcMetric_Test() - { - string RestaurantId = "restaurant_test"; - string Code = "incomes_24h"; - string Value = "test"; + // [Fact] + // public void ToGrpcMetric_Test() + // { + // string RestaurantId = "restaurant_test"; + // string Code = "incomes_24h"; + // string Value = "test"; - MetricModel metric = new MetricModel - { - Id = 1, - Key = RestaurantId + ":" + DateTime.Now.Date.ToString("yyyy-MM-dd") + ":" + Code, - RestaurantId = RestaurantId, - Date = DateTime.Now, - Code = Code, - Value = Value - }; + // MetricModel metric = new MetricModel + // { + // Id = 1, + // Key = RestaurantId + ":" + DateTime.Now.Date.ToString("yyyy-MM-dd") + ":" + Code, + // RestaurantId = RestaurantId, + // Date = DateTime.Now, + // Code = Code, + // Value = Value + // }; - reporting.Metric grpcMetric = metric.ToGrpcMetric(); + // reporting.Metric grpcMetric = metric.ToGrpcMetric(); - Assert.Equal(grpcMetric.RestaurantId, RestaurantId); - Assert.Equal(grpcMetric.Code, Code); - Assert.Equal(grpcMetric.Value, Value); + // Assert.Equal(grpcMetric.RestaurantId, RestaurantId); + // Assert.Equal(grpcMetric.Code, Code); + // Assert.Equal(grpcMetric.Value, Value); - Assert.Equal(grpcMetric.Key, metric.GetKey()); - } + // Assert.Equal(grpcMetric.Key, metric.GetKey()); + // } } \ No newline at end of file From aff9719c24d04d5700e5c6c944ab8624aaa80cc3 Mon Sep 17 00:00:00 2001 From: Florian LEROUX Date: Tue, 4 Jul 2023 13:52:00 +0200 Subject: [PATCH 158/883] feat(log): add log publishing --- services/reporting/Libraries/RabbitMQ.cs | 7 ++++--- services/reporting/Services/RabbitMQ/ReportingService.cs | 6 +++--- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/services/reporting/Libraries/RabbitMQ.cs b/services/reporting/Libraries/RabbitMQ.cs index 0720eb07..3ffc1a50 100644 --- a/services/reporting/Libraries/RabbitMQ.cs +++ b/services/reporting/Libraries/RabbitMQ.cs @@ -27,7 +27,7 @@ public RabbitMQClient(string queueName) } } - public void Publish(string message) + public void Publish(string Type, T Request) { if (_channel == null) return; _channel.QueueDeclare(queue: _queueName, @@ -37,14 +37,15 @@ public void Publish(string message) arguments: null); byte[] body; + string RequestBody = Request?.ToString() ?? "null"; if (_queueName == "log") { - body = Encoding.UTF8.GetBytes("{\"event_message\":\"reporting-service\",\"metadata\":" + message + "}"); + body = Encoding.UTF8.GetBytes("{\"event_message\":\""+Type+"\",\"metadata\":{\"request\":" + RequestBody + "}}"); } else { - body = Encoding.UTF8.GetBytes(message); + body = Encoding.UTF8.GetBytes(RequestBody); } _channel.BasicPublish(exchange: "", diff --git a/services/reporting/Services/RabbitMQ/ReportingService.cs b/services/reporting/Services/RabbitMQ/ReportingService.cs index e700c2c0..c6352ed5 100644 --- a/services/reporting/Services/RabbitMQ/ReportingService.cs +++ b/services/reporting/Services/RabbitMQ/ReportingService.cs @@ -17,13 +17,13 @@ public ReportingService(ILogger logger) } - public void LogRequest(T request) + public void LogRequest(string Method, T Request) { string Date = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); - string RequestBody = request?.ToString() ?? "null"; + string RequestBody = Request?.ToString() ?? "null"; _logger.LogInformation("\x1b[35m{Date}\x1b[0m | \x1b[31mAMQP\x1b[0m | \x1b[33m{Message}\x1b[0m\n", Date, RequestBody); - _client.Publish(RequestBody); + _client.Publish(Method, Request); } From 3e639bd3a4837b12a2e928a44269d288b707227d Mon Sep 17 00:00:00 2001 From: Florian LEROUX Date: Tue, 4 Jul 2023 16:20:28 +0200 Subject: [PATCH 159/883] feat(code): add security on metric code --- services/reporting/Libraries/Code.cs | 49 +++++++++++ services/reporting/Models/Metric.cs | 4 + services/reporting/Models/Restaurant.cs | 2 +- services/reporting/README.md | 82 ++++++------------- .../Services/GRPC/ReportingService.cs | 14 +++- 5 files changed, 92 insertions(+), 59 deletions(-) create mode 100644 services/reporting/Libraries/Code.cs diff --git a/services/reporting/Libraries/Code.cs b/services/reporting/Libraries/Code.cs new file mode 100644 index 00000000..23e7ab8c --- /dev/null +++ b/services/reporting/Libraries/Code.cs @@ -0,0 +1,49 @@ +namespace reporting.Libraries; + +public class Code +{ + public static List ValidCodes = new List(){ + "incomes_1d", + "incomes_1w", + "incomes_1m", + "incomes_1y", + "outcomes_1d", + "outcomes_1w", + "outcomes_1m", + "outcomes_1y", + "top5_selling_1w", + "top5_selling_1m", + "affluence_1d", + "delivery_types_1d", + "rejection_rate_1d" + }; + public static string ValidCodesString = string.Join(", ", ValidCodes); + + // Map of codes to their respective value types + public static Dictionary CodeTypes = new Dictionary() + { + { "incomes_1d", typeof(decimal) }, + { "incomes_1w", typeof(decimal) }, + { "incomes_1m", typeof(decimal) }, + { "incomes_1y", typeof(decimal) }, + { "outcomes_1d", typeof(decimal) }, + { "outcomes_1w", typeof(decimal) }, + { "outcomes_1m", typeof(decimal) }, + { "outcomes_1y", typeof(decimal) }, + { "top5_selling_1w", typeof(List) }, + { "top5_selling_1m", typeof(List) }, + { "affluence_1d", typeof(decimal) }, + { "delivery_types_1d", typeof(List) }, + { "rejection_rate_1d", typeof(decimal) } + }; + + public static bool IsValid(string code) + { + return ValidCodes.Contains(code); + } + + public static bool IsValid(string code, Type type) + { + return IsValid(code) && CodeTypes[code] == type; + } +} \ No newline at end of file diff --git a/services/reporting/Models/Metric.cs b/services/reporting/Models/Metric.cs index 97245543..a295394f 100644 --- a/services/reporting/Models/Metric.cs +++ b/services/reporting/Models/Metric.cs @@ -1,4 +1,5 @@ using Microsoft.EntityFrameworkCore; +using LCode = reporting.Libraries.Code; namespace reporting.Models { @@ -20,6 +21,9 @@ public class Metric public static Metric FromGrpcPushMetric(PushMetricRequest Request) { + if(!LCode.IsValid(Request.Code)) + throw new System.Exception($"Invalid code provided, received: {Request.Code}, expected: {LCode.ValidCodesString}"); + Restaurant? restaurant = Restaurant.GetRestaurant(Request.RestaurantId); if (restaurant == null) throw new System.Exception("Restaurant not found"); diff --git a/services/reporting/Models/Restaurant.cs b/services/reporting/Models/Restaurant.cs index c5313406..f7328ccd 100644 --- a/services/reporting/Models/Restaurant.cs +++ b/services/reporting/Models/Restaurant.cs @@ -15,7 +15,7 @@ public class Restaurant public int GroupId { get; set; } public string? GroupName { get; set; } = null!; - public virtual RestaurantGroup Group { get; set; } + public virtual RestaurantGroup Group { get; set; } = null!; public reporting.Restaurant ToGrpcRestaurant() { diff --git a/services/reporting/README.md b/services/reporting/README.md index 18fde5fb..1b769d7c 100644 --- a/services/reporting/README.md +++ b/services/reporting/README.md @@ -45,13 +45,24 @@ You can use the following tools to help you with the setup: 1. Run the following command to start the service: - `dotnet run` +## Documentation + +### Codes, types + +| Code | Interval | Type | Service | Description | +| -------------------------- | -------------------- | --------------------- | -------------- | --------------------------------- | +| incomes\_ | 1d \| 1w \| 1m \| 1y | number | Order, payment | Sum of order total prices | +| outcomes\_ | 1d \| 1w \| 1m \| 1y | number | Stock | Sum of restock prices | +| top5_selling\_ | 1w \| 1m | string[] (product.id) | Order | Top 5 selling products | +| affluence\_ | 1d | number[] | Order | Number of orders by hour | +| delivery_types\_ | 1d | enum[] () | Payment | Number of orders by delivery type | +| rejection_rate\_ | 1d | number | Notification | Rate of rejected orders | + ## Testing ### Requests examples -#### Pre-requisites - -Install `grpcurl` on your machine. +**Install `grpcurl` on your machine.** +- GetMetric: `grpcurl -d '{"key": "example_key"}' localhost:50020 com.goodfood.reporting.ReportingService.GetMetric` -1. GetMetric: - -`grpcurl -d '{"key": "example_key"}' localhost:50020 com.goodfood.reporting.ReportingService.GetMetric` - -2. GetMetricsByRestaurant: - - -`grpcurl -d '{"restaurant_id": "example_restaurant_id"}' localhost:50020 com.goodfood.reporting.ReportingService.GetMetricsByRestaurant` - -3. GetMetricsByRestaurantAndDate: - - -`grpcurl -d '{"restaurant_id": "example_restaurant_id", "date": "example_date"}' localhost:50020 com.goodfood.reporting.ReportingService.GetMetricsByRestaurantAndDate` - -4. GetMetricsByRestaurantGroup: - - -`grpcurl -d '{"restaurant_group_id": "example_group_id"}' localhost:50020 com.goodfood.reporting.ReportingService.GetMetricsByRestaurantGroup` - -5. PushMetric: - - -`grpcurl -d '{"restaurant_id": "example_restaurant_id", "code": "example_code", "value": "example_value"}' localhost:50020 com.goodfood.reporting.ReportingService.PushMetric` - -6. GetRestaurant: - - -`grpcurl -d '{"id": "example_restaurant_id"}' localhost:50020 com.goodfood.reporting.ReportingService.GetRestaurant` - -7. CreateRestaurant: - - -`grpcurl -d '{"name": "example_name", "key": "example_key", "address": "example_address", "group_id": "1"}' localhost:50020 com.goodfood.reporting.ReportingService.CreateRestaurant` - -8. UpdateRestaurant: - - -`grpcurl -d '{"id": "example_restaurant_id", "name": "example_name", "key": "example_key", "address": "example_address", "group_id": "1"}' localhost:50020 com.goodfood.reporting.ReportingService.UpdateRestaurant` - -9. DeleteRestaurant: - - -`grpcurl -d '{"id": "example_restaurant_id"}' localhost:50020 com.goodfood.reporting.ReportingService.DeleteRestaurant` - -10. GetRestaurantGroup: +- GetMetricsByRestaurant: `grpcurl -d '{"restaurant_id": "example_restaurant_id"}' localhost:50020 com.goodfood.reporting.ReportingService.GetMetricsByRestaurant` +- GetMetricsByRestaurantAndDate: `grpcurl -d '{"restaurant_id": "example_restaurant_id", "date": "example_date"}' localhost:50020 com.goodfood.reporting.ReportingService.GetMetricsByRestaurantAndDate` -`grpcurl -d '{"id": "1"}' localhost:50020 com.goodfood.reporting.ReportingService.GetRestaurantGroup` +- GetMetricsByRestaurantGroup: `grpcurl -d '{"restaurant_group_id": 1}' localhost:50020 com.goodfood.reporting.ReportingService.GetMetricsByRestaurantGroup` -11. CreateRestaurantGroup: +- PushMetric: `grpcurl -d '{"restaurant_id": "example_restaurant_id", "code": "example_code", "value": "example_value"}' localhost:50020 com.goodfood.reporting.ReportingService.PushMetric` +- GetRestaurant: `grpcurl -d '{"id": "example_restaurant_id"}' localhost:50020 com.goodfood.reporting.ReportingService.GetRestaurant` -`grpcurl -d '{"name": "example_group_name"}' localhost:50020 com.goodfood.reporting.ReportingService.CreateRestaurantGroup` +- CreateRestaurant: `grpcurl -d '{"name": "example_name", "key": "example_key", "address": "example_address", "group_id": 1}' localhost:50020 com.goodfood.reporting.ReportingService.CreateRestaurant` -12. UpdateRestaurantGroup: +- UpdateRestaurant: `grpcurl -d '{"id": "example_restaurant_id", "name": "example_name", "key": "example_key", "address": "example_address", "group_id": 1}' localhost:50020 com.goodfood.reporting.ReportingService.UpdateRestaurant` +- DeleteRestaurant: `grpcurl -d '{"id": "example_restaurant_id"}' localhost:50020 com.goodfood.reporting.ReportingService.DeleteRestaurant` -`grpcurl -d '{"id": "1", "name": "example_group_name"}' localhost:50020 com.goodfood.reporting.ReportingService.UpdateRestaurantGroup` +- GetRestaurantGroup: `grpcurl -d '{"id": 1}' localhost:50020 com.goodfood.reporting.ReportingService.GetRestaurantGroup` -13. DeleteRestaurantGroup: +- CreateRestaurantGroup: `grpcurl -d '{"name": "example_group_name"}' localhost:50020 com.goodfood.reporting.ReportingService.CreateRestaurantGroup` +- UpdateRestaurantGroup: `grpcurl -d '{"id": 1, "name": "example_group_name"}' localhost:50020 com.goodfood.reporting.ReportingService.UpdateRestaurantGroup` -`grpcurl -d '{"id": "1"}' localhost:50020 com.goodfood.reporting.ReportingService.DeleteRestaurantGroup` +- DeleteRestaurantGroup: `grpcurl -d '{"id": 1}' localhost:50020 com.goodfood.reporting.ReportingService.DeleteRestaurantGroup` I've included placeholder values like "example_key" and "example_restaurant_id" in the commands. Replace them with the actual values you want to use when making the requests diff --git a/services/reporting/Services/GRPC/ReportingService.cs b/services/reporting/Services/GRPC/ReportingService.cs index a3386556..c18eff18 100644 --- a/services/reporting/Services/GRPC/ReportingService.cs +++ b/services/reporting/Services/GRPC/ReportingService.cs @@ -79,11 +79,19 @@ public override Task GetMetricsByRestaurant public override Task PushMetric(PushMetricRequest request, ServerCallContext context) { - LogRequest(request, context); - MetricModel metric = MetricModel.FromGrpcPushMetric(request).Save(); + try + { + MetricModel metric = MetricModel.FromGrpcPushMetric(request).Save(); - return Task.FromResult(new PushMetricResponse { Key = metric.Key }); + LogRequest(request, context); + return Task.FromResult(new PushMetricResponse { Key = metric.Key }); + } + catch (Exception e) + { + LogRequest("\"" + e.Message + "\"", context); + throw new RpcException(new Status(StatusCode.Internal, e.Message)); + } } #endregion From 2ab9ba818fe2c0484b5f27a1ccfba977d485c0b4 Mon Sep 17 00:00:00 2001 From: Florian LEROUX Date: Wed, 5 Jul 2023 11:05:51 +0200 Subject: [PATCH 160/883] ref: add try-catch block --- .../Services/GRPC/ReportingService.cs | 187 ++++++++++++------ 1 file changed, 128 insertions(+), 59 deletions(-) diff --git a/services/reporting/Services/GRPC/ReportingService.cs b/services/reporting/Services/GRPC/ReportingService.cs index c18eff18..35e8b940 100644 --- a/services/reporting/Services/GRPC/ReportingService.cs +++ b/services/reporting/Services/GRPC/ReportingService.cs @@ -4,6 +4,7 @@ using RestaurantGroupModel = reporting.Models.RestaurantGroup; using MetricGrpc = reporting.Metric; using ReportingServiceAMQP = reporting.Services.RabbitMQ.ReportingService; +using System; namespace reporting.Services.GRPC; @@ -34,47 +35,76 @@ private void LogRequest(T Request, ServerCallContext Context) #region Metric public override Task GetMetric(GetMetricRequest request, ServerCallContext context) { - LogRequest(request, context); - MetricModel? metric = MetricModel.GetMetricByKey(request.Key); - if (metric == null) - throw new RpcException(new Status(StatusCode.NotFound, "Metric not found")); + try + { + MetricModel? metric = MetricModel.GetMetricByKey(request.Key); + if (metric == null) + throw new RpcException(new Status(StatusCode.NotFound, "Metric not found")); - return Task.FromResult(metric.ToGrpcMetric()); + LogRequest(request, context); + return Task.FromResult(metric.ToGrpcMetric()); + } + catch (Exception e) + { + LogRequest("\"" + e.Message + "\"", context); + throw new RpcException(new Status(StatusCode.Internal, e.Message)); + } } public override Task GetMetricsByRestaurant(GetMetricsByRestaurantRequest request, ServerCallContext context) { - LogRequest(request, context); + try + { - List metrics = MetricModel.GetMetricsByRestaurant(request.RestaurantId); - List response = metrics.Select(m => m.ToGrpcMetric()).ToList(); + List metrics = MetricModel.GetMetricsByRestaurant(request.RestaurantId); + List response = metrics.Select(m => m.ToGrpcMetric()).ToList(); - // WARNING: this returns an empty object if no metrics are found - return Task.FromResult(new GetMetricsByRestaurantResponse { Metrics = { response } }); + LogRequest(request, context); + // WARNING: this returns an empty object if no metrics are found + return Task.FromResult(new GetMetricsByRestaurantResponse { Metrics = { response } }); + } + catch (Exception e) + { + LogRequest("\"" + e.Message + "\"", context); + throw new RpcException(new Status(StatusCode.Internal, e.Message)); + } } public override Task GetMetricsByRestaurantAndDate(GetMetricsByRestaurantAndDateRequest request, ServerCallContext context) { - LogRequest(request, context); - - List metrics = MetricModel.GetMetricsByRestaurantAndDate(request.RestaurantId, request.Date); - List response = metrics.Select(m => m.ToGrpcMetric()).ToList(); + try + { + List metrics = MetricModel.GetMetricsByRestaurantAndDate(request.RestaurantId, request.Date); + List response = metrics.Select(m => m.ToGrpcMetric()).ToList(); - // WARNING: this returns an empty object if no metrics are found - return Task.FromResult(new GetMetricsByRestaurantAndDateResponse { Metrics = { response } }); + LogRequest(request, context); + // WARNING: this returns an empty object if no metrics are found + return Task.FromResult(new GetMetricsByRestaurantAndDateResponse { Metrics = { response } }); + } + catch (Exception e) + { + LogRequest("\"" + e.Message + "\"", context); + throw new RpcException(new Status(StatusCode.Internal, e.Message)); + } } public override Task GetMetricsByRestaurantGroup(GetMetricsByRestaurantGroupRequest request, ServerCallContext context) { - LogRequest(request, context); - - List metrics = MetricModel.GetMetricsByRestaurantGroup(request.RestaurantGroupId); - - List response = metrics.Select(m => m.ToGrpcMetric()).ToList(); + try + { + List metrics = MetricModel.GetMetricsByRestaurantGroup(request.RestaurantGroupId); + List response = metrics.Select(m => m.ToGrpcMetric()).ToList(); - // WARNING: this returns an empty object if no metrics are found - return Task.FromResult(new GetMetricsByRestaurantGroupResponse { Metrics = { response } }); + LogRequest(request, context); + // WARNING: this returns an empty object if no metrics are found + return Task.FromResult(new GetMetricsByRestaurantGroupResponse { Metrics = { response } }); + } + catch (Exception e) + { + LogRequest("\"" + e.Message + "\"", context); + throw new RpcException(new Status(StatusCode.Internal, e.Message)); + } } public override Task PushMetric(PushMetricRequest request, ServerCallContext context) @@ -99,31 +129,50 @@ public override Task PushMetric(PushMetricRequest request, S #region Restaurant public override Task GetRestaurant(GetRestaurantRequest request, ServerCallContext context) { - LogRequest(request, context); - - RestaurantModel? restaurant = RestaurantModel.GetRestaurant(request.Id); - if (restaurant == null) - throw new RpcException(new Status(StatusCode.NotFound, "Restaurant not found")); + try + { + RestaurantModel? restaurant = RestaurantModel.GetRestaurant(request.Id); + if (restaurant == null) + throw new RpcException(new Status(StatusCode.NotFound, "Restaurant not found")); - return Task.FromResult(restaurant.ToGrpcRestaurant()); + LogRequest(request, context); + return Task.FromResult(restaurant.ToGrpcRestaurant()); + } + catch (Exception e) + { + LogRequest("\"" + e.Message + "\"", context); + throw new RpcException(new Status(StatusCode.Internal, e.Message)); + } } public override Task CreateRestaurant(CreateRestaurantRequest request, ServerCallContext context) { - LogRequest(request, context); - - RestaurantModel restaurant = RestaurantModel.FromGrpc(request).Save(); - - return Task.FromResult(restaurant.ToGrpcRestaurant()); + try + { + RestaurantModel restaurant = RestaurantModel.FromGrpc(request).Save(); + LogRequest(request, context); + return Task.FromResult(restaurant.ToGrpcRestaurant()); + } + catch (Exception e) + { + LogRequest("\"" + e.Message + "\"", context); + throw new RpcException(new Status(StatusCode.Internal, e.Message)); + } } public override Task UpdateRestaurant(UpdateRestaurantRequest request, ServerCallContext context) { - LogRequest(request, context); - - RestaurantModel? restaurant = RestaurantModel.FromUpdateGrpc(request).Update(); - - return Task.FromResult(restaurant.ToGrpcRestaurant()); + try + { + LogRequest(request, context); + RestaurantModel? restaurant = RestaurantModel.FromUpdateGrpc(request).Update(); + return Task.FromResult(restaurant.ToGrpcRestaurant()); + } + catch (Exception e) + { + LogRequest("\"" + e.Message + "\"", context); + throw new RpcException(new Status(StatusCode.Internal, e.Message)); + } } public override Task DeleteRestaurant(DeleteRestaurantRequest request, ServerCallContext context) @@ -147,47 +196,67 @@ public override Task DeleteRestaurant(DeleteRestaurant public override Task GetRestaurantGroup(GetRestaurantGroupRequest request, ServerCallContext context) { - LogRequest(request, context); + try + { - RestaurantGroupModel? restaurantGroup = RestaurantGroupModel.GetRestaurantGroup(request.Id); - if (restaurantGroup == null) - throw new RpcException(new Status(StatusCode.NotFound, "Restaurant group not found")); + RestaurantGroupModel? restaurantGroup = RestaurantGroupModel.GetRestaurantGroup(request.Id); + if (restaurantGroup == null) + throw new RpcException(new Status(StatusCode.NotFound, "Restaurant group not found")); - return Task.FromResult(restaurantGroup.ToGrpcRestaurantGroup()); + LogRequest(request, context); + return Task.FromResult(restaurantGroup.ToGrpcRestaurantGroup()); + } + catch (Exception e) + { + LogRequest("\"" + e.Message + "\"", context); + throw new RpcException(new Status(StatusCode.Internal, e.Message)); + } } public override Task CreateRestaurantGroup(CreateRestaurantGroupRequest request, ServerCallContext context) { - LogRequest(request, context); - - RestaurantGroupModel restaurantGroup = RestaurantGroupModel.FromGrpc(request); - restaurantGroup = restaurantGroup.Save(); - - return Task.FromResult(restaurantGroup.ToGrpcRestaurantGroup()); + try + { + RestaurantGroupModel restaurantGroup = RestaurantGroupModel.FromGrpc(request).Save(); + LogRequest(request, context); + return Task.FromResult(restaurantGroup.ToGrpcRestaurantGroup()); + } + catch (Exception e) + { + LogRequest("\"" + e.Message + "\"", context); + throw new RpcException(new Status(StatusCode.Internal, e.Message)); + } } public override Task UpdateRestaurantGroup(UpdateRestaurantGroupRequest request, ServerCallContext context) { - LogRequest(request, context); - - RestaurantGroupModel? restaurantGroup = RestaurantGroupModel.FromUpdateGrpc(request).Update(); - - return Task.FromResult(restaurantGroup.ToGrpcRestaurantGroup()); + try + { + RestaurantGroupModel? restaurantGroup = RestaurantGroupModel.FromUpdateGrpc(request).Update(); + LogRequest(request, context); + return Task.FromResult(restaurantGroup.ToGrpcRestaurantGroup()); + } + catch (Exception e) + { + LogRequest("\"" + e.Message + "\"", context); + throw new RpcException(new Status(StatusCode.Internal, e.Message)); + } } public override Task DeleteRestaurantGroup(DeleteRestaurantGroupRequest request, ServerCallContext context) { - LogRequest(request, context); + try { RestaurantGroupModel.Delete(request.Id); + LogRequest(request, context); return Task.FromResult(new DeleteRestaurantGroupResponse { Success = true }); } - catch + catch (Exception e) { - return Task.FromResult(new DeleteRestaurantGroupResponse { Success = false }); - + LogRequest("\"" + e.Message + "\"", context); + throw new RpcException(new Status(StatusCode.Internal, e.Message)); } } From 8e0dcb8ecfb5deae2084b3c808ddf75f94676a41 Mon Sep 17 00:00:00 2001 From: Florian LEROUX Date: Wed, 5 Jul 2023 13:59:21 +0200 Subject: [PATCH 161/883] ref(structure): split project to 3 parts: server, tests, cronjobs --- services/reporting/.gitignore | 4 +- services/reporting/CronJobs/CronJobs.csproj | 18 ++ services/reporting/CronJobs/Jobs/Incomes.cs | 33 +++ services/reporting/CronJobs/Program.cs | 6 + services/reporting/Dockerfile | 4 +- services/reporting/Protos | 1 - .../{ => Server}/Database/Context.cs | 0 .../Libraries/CodeVerification.cs} | 2 +- .../{ => Server}/Libraries/RabbitMQ.cs | 0 ...0230704091414_InitialMigration.Designer.cs | 0 .../20230704091414_InitialMigration.cs | 0 .../ReportingContextModelSnapshot.cs | 0 .../reporting/{ => Server}/Models/Metric.cs | 6 +- .../{ => Server}/Models/Restaurant.cs | 0 services/reporting/{ => Server}/Program.cs | 0 .../Properties/launchSettings.json | 0 services/reporting/Server/Protos | 1 + services/reporting/{ => Server}/README.md | 0 .../Services/GRPC/GreeterService.cs | 0 .../Server/Services/GRPC/ReportingService.cs | 264 ++++++++++++++++++ .../Services/RabbitMQ/ReportingService.cs | 0 services/reporting/{ => Server}/Startup.cs | 0 .../{ => Server}/appsettings.Development.json | 0 .../reporting/{ => Server}/appsettings.json | 0 .../reporting/{ => Server}/reporting.csproj | 0 services/reporting/Tests/Tests.csproj | 4 +- services/reporting/reporting.sln | 14 +- 27 files changed, 344 insertions(+), 13 deletions(-) create mode 100644 services/reporting/CronJobs/CronJobs.csproj create mode 100644 services/reporting/CronJobs/Jobs/Incomes.cs create mode 100644 services/reporting/CronJobs/Program.cs delete mode 120000 services/reporting/Protos rename services/reporting/{ => Server}/Database/Context.cs (100%) rename services/reporting/{Libraries/Code.cs => Server/Libraries/CodeVerification.cs} (98%) rename services/reporting/{ => Server}/Libraries/RabbitMQ.cs (100%) rename services/reporting/{ => Server}/Migrations/20230704091414_InitialMigration.Designer.cs (100%) rename services/reporting/{ => Server}/Migrations/20230704091414_InitialMigration.cs (100%) rename services/reporting/{ => Server}/Migrations/ReportingContextModelSnapshot.cs (100%) rename services/reporting/{ => Server}/Models/Metric.cs (96%) rename services/reporting/{ => Server}/Models/Restaurant.cs (100%) rename services/reporting/{ => Server}/Program.cs (100%) rename services/reporting/{ => Server}/Properties/launchSettings.json (100%) create mode 120000 services/reporting/Server/Protos rename services/reporting/{ => Server}/README.md (100%) rename services/reporting/{ => Server}/Services/GRPC/GreeterService.cs (100%) create mode 100644 services/reporting/Server/Services/GRPC/ReportingService.cs rename services/reporting/{ => Server}/Services/RabbitMQ/ReportingService.cs (100%) rename services/reporting/{ => Server}/Startup.cs (100%) rename services/reporting/{ => Server}/appsettings.Development.json (100%) rename services/reporting/{ => Server}/appsettings.json (100%) rename services/reporting/{ => Server}/reporting.csproj (100%) diff --git a/services/reporting/.gitignore b/services/reporting/.gitignore index f73bd38f..c946d01f 100644 --- a/services/reporting/.gitignore +++ b/services/reporting/.gitignore @@ -31,8 +31,8 @@ x86/ [Aa][Rr][Mm]/ [Aa][Rr][Mm]64/ bld/ -[Bb]in/ -[Oo]bj/ +*/[Bb]in/ +*/[Oo]bj/ [Ll]og/ [Ll]ogs/ out/ diff --git a/services/reporting/CronJobs/CronJobs.csproj b/services/reporting/CronJobs/CronJobs.csproj new file mode 100644 index 00000000..17640fa0 --- /dev/null +++ b/services/reporting/CronJobs/CronJobs.csproj @@ -0,0 +1,18 @@ + + + + Exe + net8.0 + enable + enable + + + + + + + + + + + diff --git a/services/reporting/CronJobs/Jobs/Incomes.cs b/services/reporting/CronJobs/Jobs/Incomes.cs new file mode 100644 index 00000000..4ac0ba9e --- /dev/null +++ b/services/reporting/CronJobs/Jobs/Incomes.cs @@ -0,0 +1,33 @@ +using MetricModel = reporting.Models.Metric; + +namespace reporting.CronJobs.Jobs; + +public class Incomes +{ + + public static void _1d() + { + // todo: get data from other services + + MetricModel metric = MetricModel.FromGrpcPushMetric(new PushMetricRequest() { + Code = "incomes_1d", + Value = "1000", + RestaurantId = "example_key:1b226471-0583-47e1-b07a-2b863b13ecc5" + }).Save(); + } + + public static void _1w() + { + + } + + public static void _1m() + { + + } + + public static void _1y() + { + + } +} diff --git a/services/reporting/CronJobs/Program.cs b/services/reporting/CronJobs/Program.cs new file mode 100644 index 00000000..86d6adbe --- /dev/null +++ b/services/reporting/CronJobs/Program.cs @@ -0,0 +1,6 @@ +using reporting.CronJobs.Jobs; + +Incomes._1d(); +Incomes._1w(); +Incomes._1m(); +Incomes._1y(); diff --git a/services/reporting/Dockerfile b/services/reporting/Dockerfile index 20688781..46fb43f0 100644 --- a/services/reporting/Dockerfile +++ b/services/reporting/Dockerfile @@ -3,11 +3,11 @@ FROM mcr.microsoft.com/dotnet/nightly/sdk:latest AS build WORKDIR /app # Copy and restore dependencies -COPY ./reporting/reporting.csproj . +COPY ./reporting/Server/reporting.csproj . RUN dotnet restore # Copy the rest of the application files and build -COPY ./reporting . +COPY ./reporting/Server . COPY ./proto ./Protos RUN dotnet build -c Release -o out diff --git a/services/reporting/Protos b/services/reporting/Protos deleted file mode 120000 index 4d1e2d8b..00000000 --- a/services/reporting/Protos +++ /dev/null @@ -1 +0,0 @@ -../proto/ \ No newline at end of file diff --git a/services/reporting/Database/Context.cs b/services/reporting/Server/Database/Context.cs similarity index 100% rename from services/reporting/Database/Context.cs rename to services/reporting/Server/Database/Context.cs diff --git a/services/reporting/Libraries/Code.cs b/services/reporting/Server/Libraries/CodeVerification.cs similarity index 98% rename from services/reporting/Libraries/Code.cs rename to services/reporting/Server/Libraries/CodeVerification.cs index 23e7ab8c..baa5d2d5 100644 --- a/services/reporting/Libraries/Code.cs +++ b/services/reporting/Server/Libraries/CodeVerification.cs @@ -1,6 +1,6 @@ namespace reporting.Libraries; -public class Code +public class CodeVerification { public static List ValidCodes = new List(){ "incomes_1d", diff --git a/services/reporting/Libraries/RabbitMQ.cs b/services/reporting/Server/Libraries/RabbitMQ.cs similarity index 100% rename from services/reporting/Libraries/RabbitMQ.cs rename to services/reporting/Server/Libraries/RabbitMQ.cs diff --git a/services/reporting/Migrations/20230704091414_InitialMigration.Designer.cs b/services/reporting/Server/Migrations/20230704091414_InitialMigration.Designer.cs similarity index 100% rename from services/reporting/Migrations/20230704091414_InitialMigration.Designer.cs rename to services/reporting/Server/Migrations/20230704091414_InitialMigration.Designer.cs diff --git a/services/reporting/Migrations/20230704091414_InitialMigration.cs b/services/reporting/Server/Migrations/20230704091414_InitialMigration.cs similarity index 100% rename from services/reporting/Migrations/20230704091414_InitialMigration.cs rename to services/reporting/Server/Migrations/20230704091414_InitialMigration.cs diff --git a/services/reporting/Migrations/ReportingContextModelSnapshot.cs b/services/reporting/Server/Migrations/ReportingContextModelSnapshot.cs similarity index 100% rename from services/reporting/Migrations/ReportingContextModelSnapshot.cs rename to services/reporting/Server/Migrations/ReportingContextModelSnapshot.cs diff --git a/services/reporting/Models/Metric.cs b/services/reporting/Server/Models/Metric.cs similarity index 96% rename from services/reporting/Models/Metric.cs rename to services/reporting/Server/Models/Metric.cs index a295394f..67018c74 100644 --- a/services/reporting/Models/Metric.cs +++ b/services/reporting/Server/Models/Metric.cs @@ -1,5 +1,5 @@ using Microsoft.EntityFrameworkCore; -using LCode = reporting.Libraries.Code; +using reporting.Libraries; namespace reporting.Models { @@ -21,8 +21,8 @@ public class Metric public static Metric FromGrpcPushMetric(PushMetricRequest Request) { - if(!LCode.IsValid(Request.Code)) - throw new System.Exception($"Invalid code provided, received: {Request.Code}, expected: {LCode.ValidCodesString}"); + if(!CodeVerification.IsValid(Request.Code)) + throw new System.Exception($"Invalid code provided, received: {Request.Code}, expected: {CodeVerification.ValidCodesString}"); Restaurant? restaurant = Restaurant.GetRestaurant(Request.RestaurantId); if (restaurant == null) diff --git a/services/reporting/Models/Restaurant.cs b/services/reporting/Server/Models/Restaurant.cs similarity index 100% rename from services/reporting/Models/Restaurant.cs rename to services/reporting/Server/Models/Restaurant.cs diff --git a/services/reporting/Program.cs b/services/reporting/Server/Program.cs similarity index 100% rename from services/reporting/Program.cs rename to services/reporting/Server/Program.cs diff --git a/services/reporting/Properties/launchSettings.json b/services/reporting/Server/Properties/launchSettings.json similarity index 100% rename from services/reporting/Properties/launchSettings.json rename to services/reporting/Server/Properties/launchSettings.json diff --git a/services/reporting/Server/Protos b/services/reporting/Server/Protos new file mode 120000 index 00000000..be2b60ba --- /dev/null +++ b/services/reporting/Server/Protos @@ -0,0 +1 @@ +../../../services/proto/ \ No newline at end of file diff --git a/services/reporting/README.md b/services/reporting/Server/README.md similarity index 100% rename from services/reporting/README.md rename to services/reporting/Server/README.md diff --git a/services/reporting/Services/GRPC/GreeterService.cs b/services/reporting/Server/Services/GRPC/GreeterService.cs similarity index 100% rename from services/reporting/Services/GRPC/GreeterService.cs rename to services/reporting/Server/Services/GRPC/GreeterService.cs diff --git a/services/reporting/Server/Services/GRPC/ReportingService.cs b/services/reporting/Server/Services/GRPC/ReportingService.cs new file mode 100644 index 00000000..35e8b940 --- /dev/null +++ b/services/reporting/Server/Services/GRPC/ReportingService.cs @@ -0,0 +1,264 @@ +using Grpc.Core; +using MetricModel = reporting.Models.Metric; +using RestaurantModel = reporting.Models.Restaurant; +using RestaurantGroupModel = reporting.Models.RestaurantGroup; +using MetricGrpc = reporting.Metric; +using ReportingServiceAMQP = reporting.Services.RabbitMQ.ReportingService; +using System; + + +namespace reporting.Services.GRPC; + + +public class ReportingService : reporting.ReportingService.ReportingServiceBase +{ + private readonly ILogger _logger; + private readonly ReportingContext _db; + private readonly ReportingServiceAMQP _amqp; + public ReportingService(ILogger logger) + { + _logger = logger; + _db = new ReportingContext(); + _amqp = new ReportingServiceAMQP(logger); + } + + private void LogRequest(T Request, ServerCallContext Context) + { + string Date = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); + string Method = Context.Method.Split('.').Last(); + string RequestBody = Request?.ToString() ?? "null"; + + _logger.LogInformation("\x1b[35m{Date}\x1b[0m | \x1b[36mGRPC\x1b[0m | \x1b[33m{Message}\x1b[0m\n", Date, Method + " with: " + RequestBody); + _amqp.LogRequest(Method, Request); + } + + #region Metric + public override Task GetMetric(GetMetricRequest request, ServerCallContext context) + { + + try + { + MetricModel? metric = MetricModel.GetMetricByKey(request.Key); + if (metric == null) + throw new RpcException(new Status(StatusCode.NotFound, "Metric not found")); + + LogRequest(request, context); + return Task.FromResult(metric.ToGrpcMetric()); + } + catch (Exception e) + { + LogRequest("\"" + e.Message + "\"", context); + throw new RpcException(new Status(StatusCode.Internal, e.Message)); + } + } + + public override Task GetMetricsByRestaurant(GetMetricsByRestaurantRequest request, ServerCallContext context) + { + try + { + + List metrics = MetricModel.GetMetricsByRestaurant(request.RestaurantId); + List response = metrics.Select(m => m.ToGrpcMetric()).ToList(); + + LogRequest(request, context); + // WARNING: this returns an empty object if no metrics are found + return Task.FromResult(new GetMetricsByRestaurantResponse { Metrics = { response } }); + } + catch (Exception e) + { + LogRequest("\"" + e.Message + "\"", context); + throw new RpcException(new Status(StatusCode.Internal, e.Message)); + } + } + + public override Task GetMetricsByRestaurantAndDate(GetMetricsByRestaurantAndDateRequest request, ServerCallContext context) + { + try + { + List metrics = MetricModel.GetMetricsByRestaurantAndDate(request.RestaurantId, request.Date); + List response = metrics.Select(m => m.ToGrpcMetric()).ToList(); + + LogRequest(request, context); + // WARNING: this returns an empty object if no metrics are found + return Task.FromResult(new GetMetricsByRestaurantAndDateResponse { Metrics = { response } }); + } + catch (Exception e) + { + LogRequest("\"" + e.Message + "\"", context); + throw new RpcException(new Status(StatusCode.Internal, e.Message)); + } + } + + public override Task GetMetricsByRestaurantGroup(GetMetricsByRestaurantGroupRequest request, ServerCallContext context) + { + try + { + List metrics = MetricModel.GetMetricsByRestaurantGroup(request.RestaurantGroupId); + List response = metrics.Select(m => m.ToGrpcMetric()).ToList(); + + LogRequest(request, context); + // WARNING: this returns an empty object if no metrics are found + return Task.FromResult(new GetMetricsByRestaurantGroupResponse { Metrics = { response } }); + } + catch (Exception e) + { + LogRequest("\"" + e.Message + "\"", context); + throw new RpcException(new Status(StatusCode.Internal, e.Message)); + } + } + + public override Task PushMetric(PushMetricRequest request, ServerCallContext context) + { + + try + { + MetricModel metric = MetricModel.FromGrpcPushMetric(request).Save(); + + LogRequest(request, context); + return Task.FromResult(new PushMetricResponse { Key = metric.Key }); + } + catch (Exception e) + { + LogRequest("\"" + e.Message + "\"", context); + throw new RpcException(new Status(StatusCode.Internal, e.Message)); + } + } + + #endregion + + #region Restaurant + public override Task GetRestaurant(GetRestaurantRequest request, ServerCallContext context) + { + try + { + RestaurantModel? restaurant = RestaurantModel.GetRestaurant(request.Id); + if (restaurant == null) + throw new RpcException(new Status(StatusCode.NotFound, "Restaurant not found")); + + LogRequest(request, context); + return Task.FromResult(restaurant.ToGrpcRestaurant()); + } + catch (Exception e) + { + LogRequest("\"" + e.Message + "\"", context); + throw new RpcException(new Status(StatusCode.Internal, e.Message)); + } + } + + public override Task CreateRestaurant(CreateRestaurantRequest request, ServerCallContext context) + { + try + { + RestaurantModel restaurant = RestaurantModel.FromGrpc(request).Save(); + LogRequest(request, context); + return Task.FromResult(restaurant.ToGrpcRestaurant()); + } + catch (Exception e) + { + LogRequest("\"" + e.Message + "\"", context); + throw new RpcException(new Status(StatusCode.Internal, e.Message)); + } + } + + public override Task UpdateRestaurant(UpdateRestaurantRequest request, ServerCallContext context) + { + try + { + LogRequest(request, context); + RestaurantModel? restaurant = RestaurantModel.FromUpdateGrpc(request).Update(); + return Task.FromResult(restaurant.ToGrpcRestaurant()); + } + catch (Exception e) + { + LogRequest("\"" + e.Message + "\"", context); + throw new RpcException(new Status(StatusCode.Internal, e.Message)); + } + } + + public override Task DeleteRestaurant(DeleteRestaurantRequest request, ServerCallContext context) + { + LogRequest(request, context); + + try + { + RestaurantModel.Delete(request.Id); + return Task.FromResult(new DeleteRestaurantResponse { Success = true }); + } + catch + { + return Task.FromResult(new DeleteRestaurantResponse { Success = false }); + + } + } + #endregion + + #region RestaurantGroup + + public override Task GetRestaurantGroup(GetRestaurantGroupRequest request, ServerCallContext context) + { + try + { + + RestaurantGroupModel? restaurantGroup = RestaurantGroupModel.GetRestaurantGroup(request.Id); + if (restaurantGroup == null) + throw new RpcException(new Status(StatusCode.NotFound, "Restaurant group not found")); + + LogRequest(request, context); + return Task.FromResult(restaurantGroup.ToGrpcRestaurantGroup()); + } + catch (Exception e) + { + LogRequest("\"" + e.Message + "\"", context); + throw new RpcException(new Status(StatusCode.Internal, e.Message)); + } + } + + public override Task CreateRestaurantGroup(CreateRestaurantGroupRequest request, ServerCallContext context) + { + try + { + RestaurantGroupModel restaurantGroup = RestaurantGroupModel.FromGrpc(request).Save(); + LogRequest(request, context); + return Task.FromResult(restaurantGroup.ToGrpcRestaurantGroup()); + } + catch (Exception e) + { + LogRequest("\"" + e.Message + "\"", context); + throw new RpcException(new Status(StatusCode.Internal, e.Message)); + } + } + + public override Task UpdateRestaurantGroup(UpdateRestaurantGroupRequest request, ServerCallContext context) + { + try + { + RestaurantGroupModel? restaurantGroup = RestaurantGroupModel.FromUpdateGrpc(request).Update(); + LogRequest(request, context); + return Task.FromResult(restaurantGroup.ToGrpcRestaurantGroup()); + } + catch (Exception e) + { + LogRequest("\"" + e.Message + "\"", context); + throw new RpcException(new Status(StatusCode.Internal, e.Message)); + } + } + + public override Task DeleteRestaurantGroup(DeleteRestaurantGroupRequest request, ServerCallContext context) + { + + + try + { + RestaurantGroupModel.Delete(request.Id); + LogRequest(request, context); + return Task.FromResult(new DeleteRestaurantGroupResponse { Success = true }); + } + catch (Exception e) + { + LogRequest("\"" + e.Message + "\"", context); + throw new RpcException(new Status(StatusCode.Internal, e.Message)); + } + } + + #endregion +} diff --git a/services/reporting/Services/RabbitMQ/ReportingService.cs b/services/reporting/Server/Services/RabbitMQ/ReportingService.cs similarity index 100% rename from services/reporting/Services/RabbitMQ/ReportingService.cs rename to services/reporting/Server/Services/RabbitMQ/ReportingService.cs diff --git a/services/reporting/Startup.cs b/services/reporting/Server/Startup.cs similarity index 100% rename from services/reporting/Startup.cs rename to services/reporting/Server/Startup.cs diff --git a/services/reporting/appsettings.Development.json b/services/reporting/Server/appsettings.Development.json similarity index 100% rename from services/reporting/appsettings.Development.json rename to services/reporting/Server/appsettings.Development.json diff --git a/services/reporting/appsettings.json b/services/reporting/Server/appsettings.json similarity index 100% rename from services/reporting/appsettings.json rename to services/reporting/Server/appsettings.json diff --git a/services/reporting/reporting.csproj b/services/reporting/Server/reporting.csproj similarity index 100% rename from services/reporting/reporting.csproj rename to services/reporting/Server/reporting.csproj diff --git a/services/reporting/Tests/Tests.csproj b/services/reporting/Tests/Tests.csproj index 58bd10b1..f0af6ce3 100644 --- a/services/reporting/Tests/Tests.csproj +++ b/services/reporting/Tests/Tests.csproj @@ -22,8 +22,8 @@ - - + + diff --git a/services/reporting/reporting.sln b/services/reporting/reporting.sln index 9add4a78..c41808b6 100644 --- a/services/reporting/reporting.sln +++ b/services/reporting/reporting.sln @@ -3,10 +3,12 @@ Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio Version 16 VisualStudioVersion = 25.0.1704.4 MinimumVisualStudioVersion = 10.0.40219.1 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "reporting", "reporting.csproj", "{C9640D24-9AA0-4147-93C3-5A3CB4147057}" -EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Tests", "Tests\Tests.csproj", "{C062ECC9-4B36-43C3-A03C-4D3507930A6D}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CronJobs", "CronJobs\CronJobs.csproj", "{ED310EB9-DE31-4E1E-B9A4-8B65404B3E16}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "reporting", "Server\reporting.csproj", "{BFEB9B27-7ED0-45FB-9529-2CFDA47773A4}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -21,6 +23,14 @@ Global {C062ECC9-4B36-43C3-A03C-4D3507930A6D}.Debug|Any CPU.Build.0 = Debug|Any CPU {C062ECC9-4B36-43C3-A03C-4D3507930A6D}.Release|Any CPU.ActiveCfg = Release|Any CPU {C062ECC9-4B36-43C3-A03C-4D3507930A6D}.Release|Any CPU.Build.0 = Release|Any CPU + {ED310EB9-DE31-4E1E-B9A4-8B65404B3E16}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {ED310EB9-DE31-4E1E-B9A4-8B65404B3E16}.Debug|Any CPU.Build.0 = Debug|Any CPU + {ED310EB9-DE31-4E1E-B9A4-8B65404B3E16}.Release|Any CPU.ActiveCfg = Release|Any CPU + {ED310EB9-DE31-4E1E-B9A4-8B65404B3E16}.Release|Any CPU.Build.0 = Release|Any CPU + {BFEB9B27-7ED0-45FB-9529-2CFDA47773A4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {BFEB9B27-7ED0-45FB-9529-2CFDA47773A4}.Debug|Any CPU.Build.0 = Debug|Any CPU + {BFEB9B27-7ED0-45FB-9529-2CFDA47773A4}.Release|Any CPU.ActiveCfg = Release|Any CPU + {BFEB9B27-7ED0-45FB-9529-2CFDA47773A4}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE From 17ed8d8f8275af94e79544be990667e77aa79d17 Mon Sep 17 00:00:00 2001 From: Florian LEROUX Date: Wed, 5 Jul 2023 14:31:01 +0200 Subject: [PATCH 162/883] doc: move readme --- services/reporting/{Server => }/README.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename services/reporting/{Server => }/README.md (100%) diff --git a/services/reporting/Server/README.md b/services/reporting/README.md similarity index 100% rename from services/reporting/Server/README.md rename to services/reporting/README.md From 8816cc7be7c7f7c9fbd0566910bdfc1263a069c1 Mon Sep 17 00:00:00 2001 From: anatole Date: Wed, 5 Jul 2023 15:52:51 +0200 Subject: [PATCH 163/883] feat(user service): add logger and default values in the database --- services/proto/user.pb.go | 88 ++++++++-------- services/proto/user.proto | 22 ++-- services/user/.gitignore | 3 + services/user/src/go.mod | 2 + services/user/src/go.sum | 5 + services/user/src/main.go | 19 ++-- services/user/src/pkg/config/config.go | 9 +- services/user/src/pkg/config/env/.env.dist | 5 +- services/user/src/pkg/db/db.go | 5 +- services/user/src/pkg/db/init/initialize.go | 102 +++++++++++++++++++ services/user/src/pkg/models/main_address.go | 2 +- services/user/src/pkg/models/role.go | 2 +- services/user/src/pkg/models/user.go | 8 +- services/user/src/pkg/services/user.go | 3 +- services/user/src/pkg/utils/jwt.go | 2 +- services/user/src/pkg/utils/log.go | 38 +++++++ 16 files changed, 239 insertions(+), 76 deletions(-) create mode 100644 services/user/.gitignore create mode 100644 services/user/src/pkg/db/init/initialize.go create mode 100644 services/user/src/pkg/utils/log.go diff --git a/services/proto/user.pb.go b/services/proto/user.pb.go index dad60a1b..1293a09f 100644 --- a/services/proto/user.pb.go +++ b/services/proto/user.pb.go @@ -26,7 +26,7 @@ type Role struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + Id uint64 `protobuf:"varint,1,opt,name=id,proto3" json:"id,omitempty"` Code string `protobuf:"bytes,2,opt,name=code,proto3" json:"code,omitempty"` Label string `protobuf:"bytes,3,opt,name=label,proto3" json:"label,omitempty"` } @@ -63,11 +63,11 @@ func (*Role) Descriptor() ([]byte, []int) { return file_user_proto_rawDescGZIP(), []int{0} } -func (x *Role) GetId() string { +func (x *Role) GetId() uint64 { if x != nil { return x.Id } - return "" + return 0 } func (x *Role) GetCode() string { @@ -89,7 +89,7 @@ type MainAddress struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + Id uint64 `protobuf:"varint,1,opt,name=id,proto3" json:"id,omitempty"` Street string `protobuf:"bytes,2,opt,name=street,proto3" json:"street,omitempty"` ZipCode string `protobuf:"bytes,3,opt,name=zipCode,proto3" json:"zipCode,omitempty"` Country string `protobuf:"bytes,4,opt,name=country,proto3" json:"country,omitempty"` @@ -129,11 +129,11 @@ func (*MainAddress) Descriptor() ([]byte, []int) { return file_user_proto_rawDescGZIP(), []int{1} } -func (x *MainAddress) GetId() string { +func (x *MainAddress) GetId() uint64 { if x != nil { return x.Id } - return "" + return 0 } func (x *MainAddress) GetStreet() string { @@ -176,14 +176,14 @@ type User struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + Id uint64 `protobuf:"varint,1,opt,name=id,proto3" json:"id,omitempty"` FirstName string `protobuf:"bytes,2,opt,name=first_name,json=firstName,proto3" json:"first_name,omitempty"` LastName string `protobuf:"bytes,3,opt,name=last_name,json=lastName,proto3" json:"last_name,omitempty"` Email string `protobuf:"bytes,4,opt,name=email,proto3" json:"email,omitempty"` Phone string `protobuf:"bytes,5,opt,name=phone,proto3" json:"phone,omitempty"` - MainAddressId string `protobuf:"bytes,6,opt,name=MainAddressId,proto3" json:"MainAddressId,omitempty"` + MainAddressId uint64 `protobuf:"varint,6,opt,name=MainAddressId,proto3" json:"MainAddressId,omitempty"` MainAddress *MainAddress `protobuf:"bytes,7,opt,name=mainAddress,proto3" json:"mainAddress,omitempty"` - RoleId string `protobuf:"bytes,8,opt,name=RoleId,proto3" json:"RoleId,omitempty"` + RoleId uint64 `protobuf:"varint,8,opt,name=RoleId,proto3" json:"RoleId,omitempty"` Role *Role `protobuf:"bytes,9,opt,name=role,proto3" json:"role,omitempty"` } @@ -219,11 +219,11 @@ func (*User) Descriptor() ([]byte, []int) { return file_user_proto_rawDescGZIP(), []int{2} } -func (x *User) GetId() string { +func (x *User) GetId() uint64 { if x != nil { return x.Id } - return "" + return 0 } func (x *User) GetFirstName() string { @@ -254,11 +254,11 @@ func (x *User) GetPhone() string { return "" } -func (x *User) GetMainAddressId() string { +func (x *User) GetMainAddressId() uint64 { if x != nil { return x.MainAddressId } - return "" + return 0 } func (x *User) GetMainAddress() *MainAddress { @@ -268,11 +268,11 @@ func (x *User) GetMainAddress() *MainAddress { return nil } -func (x *User) GetRoleId() string { +func (x *User) GetRoleId() uint64 { if x != nil { return x.RoleId } - return "" + return 0 } func (x *User) GetRole() *Role { @@ -610,7 +610,7 @@ type UserId struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + Id uint64 `protobuf:"varint,1,opt,name=id,proto3" json:"id,omitempty"` } func (x *UserId) Reset() { @@ -645,11 +645,11 @@ func (*UserId) Descriptor() ([]byte, []int) { return file_user_proto_rawDescGZIP(), []int{8} } -func (x *UserId) GetId() string { +func (x *UserId) GetId() uint64 { if x != nil { return x.Id } - return "" + return 0 } type UserList struct { @@ -704,7 +704,7 @@ type LogInInput struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - UserId string `protobuf:"bytes,1,opt,name=userId,proto3" json:"userId,omitempty"` + UserId uint64 `protobuf:"varint,1,opt,name=userId,proto3" json:"userId,omitempty"` Email string `protobuf:"bytes,2,opt,name=email,proto3" json:"email,omitempty"` Password string `protobuf:"bytes,3,opt,name=password,proto3" json:"password,omitempty"` } @@ -741,11 +741,11 @@ func (*LogInInput) Descriptor() ([]byte, []int) { return file_user_proto_rawDescGZIP(), []int{10} } -func (x *LogInInput) GetUserId() string { +func (x *LogInInput) GetUserId() uint64 { if x != nil { return x.UserId } - return "" + return 0 } func (x *LogInInput) GetEmail() string { @@ -815,7 +815,7 @@ type DeleteInput struct { unknownFields protoimpl.UnknownFields Token string `protobuf:"bytes,1,opt,name=token,proto3" json:"token,omitempty"` - UserId string `protobuf:"bytes,2,opt,name=userId,proto3" json:"userId,omitempty"` + UserId uint64 `protobuf:"varint,2,opt,name=userId,proto3" json:"userId,omitempty"` } func (x *DeleteInput) Reset() { @@ -857,11 +857,11 @@ func (x *DeleteInput) GetToken() string { return "" } -func (x *DeleteInput) GetUserId() string { +func (x *DeleteInput) GetUserId() uint64 { if x != nil { return x.UserId } - return "" + return 0 } type ValidateResponse struct { @@ -870,7 +870,7 @@ type ValidateResponse struct { unknownFields protoimpl.UnknownFields Error string `protobuf:"bytes,1,opt,name=error,proto3" json:"error,omitempty"` - UserId string `protobuf:"bytes,2,opt,name=userId,proto3" json:"userId,omitempty"` + UserId uint64 `protobuf:"varint,2,opt,name=userId,proto3" json:"userId,omitempty"` } func (x *ValidateResponse) Reset() { @@ -912,11 +912,11 @@ func (x *ValidateResponse) GetError() string { return "" } -func (x *ValidateResponse) GetUserId() string { +func (x *ValidateResponse) GetUserId() uint64 { if x != nil { return x.UserId } - return "" + return 0 } type LogInResponse struct { @@ -1098,7 +1098,7 @@ type ChangeRoleInput struct { unknownFields protoimpl.UnknownFields Token string `protobuf:"bytes,1,opt,name=token,proto3" json:"token,omitempty"` - UserId string `protobuf:"bytes,2,opt,name=userId,proto3" json:"userId,omitempty"` + UserId uint64 `protobuf:"varint,2,opt,name=userId,proto3" json:"userId,omitempty"` RoleCode string `protobuf:"bytes,3,opt,name=roleCode,proto3" json:"roleCode,omitempty"` } @@ -1141,11 +1141,11 @@ func (x *ChangeRoleInput) GetToken() string { return "" } -func (x *ChangeRoleInput) GetUserId() string { +func (x *ChangeRoleInput) GetUserId() uint64 { if x != nil { return x.UserId } - return "" + return 0 } func (x *ChangeRoleInput) GetRoleCode() string { @@ -1270,7 +1270,7 @@ type MainAddressId struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + Id uint64 `protobuf:"varint,1,opt,name=id,proto3" json:"id,omitempty"` } func (x *MainAddressId) Reset() { @@ -1305,11 +1305,11 @@ func (*MainAddressId) Descriptor() ([]byte, []int) { return file_user_proto_rawDescGZIP(), []int{20} } -func (x *MainAddressId) GetId() string { +func (x *MainAddressId) GetId() uint64 { if x != nil { return x.Id } - return "" + return 0 } type MainAddressUpdateInput struct { @@ -1429,12 +1429,12 @@ var file_user_proto_rawDesc = []byte{ 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x1a, 0x1b, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x40, 0x0a, 0x04, - 0x52, 0x6f, 0x6c, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x6f, 0x6c, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x22, 0x8d, 0x01, 0x0a, 0x0b, 0x4d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x0e, - 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x16, + 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x02, 0x69, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x72, 0x65, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x72, 0x65, 0x65, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x7a, 0x69, 0x70, 0x43, 0x6f, 0x64, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x7a, 0x69, 0x70, 0x43, 0x6f, 0x64, 0x65, @@ -1443,7 +1443,7 @@ var file_user_proto_rawDesc = []byte{ 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x02, 0x52, 0x03, 0x6c, 0x61, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6c, 0x6e, 0x67, 0x18, 0x06, 0x20, 0x01, 0x28, 0x02, 0x52, 0x03, 0x6c, 0x6e, 0x67, 0x22, 0xab, 0x02, 0x0a, 0x04, 0x55, 0x73, 0x65, 0x72, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x66, 0x69, 0x72, 0x73, 0x74, + 0x01, 0x28, 0x04, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x66, 0x69, 0x72, 0x73, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x66, 0x69, 0x72, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6c, 0x61, 0x73, 0x74, 0x4e, @@ -1451,13 +1451,13 @@ var file_user_proto_rawDesc = []byte{ 0x28, 0x09, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x68, 0x6f, 0x6e, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x68, 0x6f, 0x6e, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x4d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x49, 0x64, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x4d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x4d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x49, 0x64, 0x12, 0x40, 0x0a, 0x0b, 0x6d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x4d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x0b, 0x6d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x52, 0x6f, 0x6c, 0x65, 0x49, - 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x64, 0x12, + 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x64, 0x12, 0x2b, 0x0a, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x22, 0x54, 0x0a, 0x0f, @@ -1500,13 +1500,13 @@ var file_user_proto_rawDesc = []byte{ 0x09, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x22, 0x18, 0x0a, 0x06, 0x55, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x39, 0x0a, 0x08, 0x55, 0x73, 0x65, 0x72, + 0x20, 0x01, 0x28, 0x04, 0x52, 0x02, 0x69, 0x64, 0x22, 0x39, 0x0a, 0x08, 0x55, 0x73, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x2d, 0x0a, 0x05, 0x75, 0x73, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x05, 0x75, 0x73, 0x65, 0x72, 0x73, 0x22, 0x56, 0x0a, 0x0a, 0x6c, 0x6f, 0x67, 0x49, 0x6e, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6d, 0x61, + 0x04, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x22, 0x25, 0x0a, 0x0d, 0x76, @@ -1515,11 +1515,11 @@ var file_user_proto_rawDesc = []byte{ 0x65, 0x6e, 0x22, 0x3b, 0x0a, 0x0b, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, - 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x22, + 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x22, 0x40, 0x0a, 0x10, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x75, 0x73, 0x65, - 0x72, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, + 0x72, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x22, 0x52, 0x0a, 0x0d, 0x6c, 0x6f, 0x67, 0x49, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2b, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, @@ -1541,7 +1541,7 @@ var file_user_proto_rawDesc = []byte{ 0x72, 0x22, 0x5b, 0x0a, 0x0f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x75, 0x73, - 0x65, 0x72, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, + 0x65, 0x72, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x43, 0x6f, 0x64, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x43, 0x6f, 0x64, 0x65, 0x22, 0x55, 0x0a, 0x10, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x4f, 0x75, 0x74, 0x70, @@ -1556,7 +1556,7 @@ var file_user_proto_rawDesc = []byte{ 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x1f, 0x0a, 0x0d, 0x4d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x49, 0x64, 0x12, 0x0e, 0x0a, - 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x70, 0x0a, + 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x02, 0x69, 0x64, 0x22, 0x70, 0x0a, 0x16, 0x4d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x40, 0x0a, diff --git a/services/proto/user.proto b/services/proto/user.proto index 488a850f..1d460197 100644 --- a/services/proto/user.proto +++ b/services/proto/user.proto @@ -7,13 +7,13 @@ import "google/protobuf/empty.proto"; option go_package = "."; message Role { - string id = 1; + uint64 id = 1; string code = 2; string label = 3; } message MainAddress { - string id = 1; + uint64 id = 1; string street = 2; string zipCode = 3; string country = 4; @@ -22,14 +22,14 @@ message MainAddress { } message User { - string id = 1; + uint64 id = 1; string first_name = 2; string last_name = 3; string email = 4; string phone = 5; - string MainAddressId = 6; + uint64 MainAddressId = 6; MainAddress mainAddress = 7; - string RoleId = 8; + uint64 RoleId = 8; Role role = 9; } @@ -82,7 +82,7 @@ message RoleInput { } message UserId { - string id = 1; + uint64 id = 1; } message UserList { @@ -90,7 +90,7 @@ message UserList { } message logInInput { - string userId = 1; + uint64 userId = 1; string email = 2; string password = 3; } @@ -101,12 +101,12 @@ message validateInput { message DeleteInput { string token = 1; - string userId = 2; + uint64 userId = 2; } message validateResponse { string error = 1; - string userId = 2; + uint64 userId = 2; } message logInResponse { @@ -128,7 +128,7 @@ message changePasswordOutput{ message changeRoleInput { string token = 1; - string userId = 2; + uint64 userId = 2; string roleCode = 3; } @@ -143,7 +143,7 @@ message changeRoleOutput{ } message MainAddressId { - string id = 1; + uint64 id = 1; } message MainAddressUpdateInput { diff --git a/services/user/.gitignore b/services/user/.gitignore new file mode 100644 index 00000000..ce27869a --- /dev/null +++ b/services/user/.gitignore @@ -0,0 +1,3 @@ +src/logs/* + +src/pkg/config/env/*.env \ No newline at end of file diff --git a/services/user/src/go.mod b/services/user/src/go.mod index 62d86fdb..69550e56 100644 --- a/services/user/src/go.mod +++ b/services/user/src/go.mod @@ -23,6 +23,8 @@ require ( github.com/golang/protobuf v1.5.2 // indirect github.com/google/uuid v1.3.0 // indirect github.com/hashicorp/hcl v1.0.0 // indirect + github.com/hhkbp2/go-logging v0.3.7 // indirect + github.com/hhkbp2/go-strftime v0.0.0-20150709091403-d82166ec6782 // indirect github.com/imdario/mergo v0.3.12 // indirect github.com/jackc/chunkreader/v2 v2.0.1 // indirect github.com/jackc/pgconn v1.10.1 // indirect diff --git a/services/user/src/go.sum b/services/user/src/go.sum index 88eb282f..368d6615 100644 --- a/services/user/src/go.sum +++ b/services/user/src/go.sum @@ -56,6 +56,11 @@ github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/hellokvn/go-grpc-auth-svc v0.0.0-20220329201106-de9b08c8e812 h1:LU6I+7QVwjBBbWirc3+KEr0PWy675bZMyvG5zuW9C6I= github.com/hellokvn/go-grpc-auth-svc v0.0.0-20220329201106-de9b08c8e812/go.mod h1:5SRSCOJcnlIsTZsiiRiYgwFHdjr9tR6vESwJcoSiqrg= +github.com/hhkbp2/go-logging v0.3.7 h1:Dxy1of13MlvAVVVeDUizaA7I2++yZ/HLQpJ/eSf8ttQ= +github.com/hhkbp2/go-logging v0.3.7/go.mod h1:lFqQYJ6YeTqe4yyw+h8dZWYvzzWAqjmlpvdFLEIcRHc= +github.com/hhkbp2/go-strftime v0.0.0-20150709091403-d82166ec6782 h1:Evl9i7wBY3bjJ3NqHs0ldhnKOdQL4Kaum9ve1JAmiCE= +github.com/hhkbp2/go-strftime v0.0.0-20150709091403-d82166ec6782/go.mod h1:x8/IOQ5qQ4DKfiTmD9wBhQ40edg5wh7gMRwdLg07mMw= +github.com/hhkbp2/testify v0.0.0-20150512090439-112845ebc045/go.mod h1:8DUHF4igllRoOCbQKJsylsDqROcRtPTdb+SQUfjCYLo= github.com/imdario/mergo v0.3.12 h1:b6R2BslTbIEToALKP7LxUvijTsNI9TAe80pLWN2g/HU= github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= github.com/jackc/chunkreader v1.0.0/go.mod h1:RT6O25fNZIuasFJRyZ4R/Y2BbhasbmZXF9QQ7T3kePo= diff --git a/services/user/src/main.go b/services/user/src/main.go index 517edbed..34cd825c 100644 --- a/services/user/src/main.go +++ b/services/user/src/main.go @@ -1,41 +1,46 @@ package main import ( - "fmt" + "github.com/hhkbp2/go-logging" "goodfood-user/pkg/config" "goodfood-user/pkg/db" + i "goodfood-user/pkg/db/init" "goodfood-user/pkg/services" "goodfood-user/pkg/utils" pb "goodfood-user/proto" "google.golang.org/grpc" - "log" "net" ) func main() { + utils.InitLogger() + logger := utils.GetLogger() + defer logging.Shutdown() c, err := config.LoadConfig() + logger.Fatal("Failed at config", err) + url := "0.0.0.0:" + c.Port if err != nil { - log.Fatalln("Failed at config", err) + logger.Fatal("Failed at config", err) } h := db.Init(c.DBUrl) + i.InitDb(h) jwt := utils.JwtWrapper{ SecretKey: c.JWTSecretKey, Issuer: "go-grpc-auth-svc", ExpirationHours: 24 * 365, } + logger.Fatal("Starting server at ", url) lis, err := net.Listen("tcp", url) if err != nil { - log.Fatalln("Failed to listing:", err) + logger.Fatal("Failed to listing:", err) } - fmt.Println("Auth Svc on", url) - s := services.Server{ H: h, Jwt: jwt, @@ -46,6 +51,6 @@ func main() { pb.RegisterUserServiceServer(grpcServer, &s) if err := grpcServer.Serve(lis); err != nil { - log.Fatalln("Failed to serve:", err) + logger.Fatal("Failed to serve:", err) } } diff --git a/services/user/src/pkg/config/config.go b/services/user/src/pkg/config/config.go index 59b2afff..76a72dd1 100644 --- a/services/user/src/pkg/config/config.go +++ b/services/user/src/pkg/config/config.go @@ -3,9 +3,12 @@ package config import "github.com/spf13/viper" type Config struct { - Port string `mapstructure:"PORT"` - DBUrl string `mapstructure:"DB_URL"` - JWTSecretKey string `mapstructure:"JWT_SECRET_KEY"` + Port string `mapstructure:"PORT"` + DBUrl string `mapstructure:"DB_URL"` + JWTSecretKey string `mapstructure:"JWT_SECRET_KEY"` + DefaultUserEmail string `mapstructure:"DEFAULT_USER_EMAIL"` + DefaultUserPassword string `mapstructure:"DEFAULT_USER_PASSWORD"` + LogFilePath string `mapstructure:"LOG_FILE_PATH"` } func LoadConfig() (config Config, err error) { diff --git a/services/user/src/pkg/config/env/.env.dist b/services/user/src/pkg/config/env/.env.dist index 430f626c..d7b77644 100644 --- a/services/user/src/pkg/config/env/.env.dist +++ b/services/user/src/pkg/config/env/.env.dist @@ -1,3 +1,6 @@ PORT=:50051 DB_URL=postgres://:@:/ -JWT_SECRET_KEY=example \ No newline at end of file +JWT_SECRET_KEY=example +DEFAULT_USER_EMAIL=example +DEFAULT_USER_PASSWORD=example +LOG_FILE_PATH=./logs/app.log diff --git a/services/user/src/pkg/db/db.go b/services/user/src/pkg/db/db.go index 79a47bdc..fc363740 100644 --- a/services/user/src/pkg/db/db.go +++ b/services/user/src/pkg/db/db.go @@ -2,9 +2,9 @@ package db import ( "goodfood-user/pkg/models" + "goodfood-user/pkg/utils" "gorm.io/driver/postgres" "gorm.io/gorm" - "log" ) type Handler struct { @@ -12,10 +12,11 @@ type Handler struct { } func Init(url string) Handler { + log := utils.GetLogger() db, err := gorm.Open(postgres.Open(url), &gorm.Config{}) if err != nil { - log.Fatalln(err) + log.Fatal(err) } err = db.AutoMigrate(&models.Role{}) diff --git a/services/user/src/pkg/db/init/initialize.go b/services/user/src/pkg/db/init/initialize.go new file mode 100644 index 00000000..e5a4c9cd --- /dev/null +++ b/services/user/src/pkg/db/init/initialize.go @@ -0,0 +1,102 @@ +package db + +import ( + "fmt" + "goodfood-user/pkg/config" + "goodfood-user/pkg/db" + "goodfood-user/pkg/models" + "goodfood-user/pkg/utils" +) + +func InitDb(handler db.Handler) { + + log := utils.GetLogger() + err := InitRoles(handler) + if err != nil { + log.Infof("While initialisation of roles :", err) + return + } + + er := InitUsers(handler) + if er != nil { + log.Infof("While initialisation of users :", er) + return + } +} + +func InitRoles(handler db.Handler) error { + log := utils.GetLogger() + role := handler.DB.Find(&models.Role{}) + + if role.Error != nil { + log.Infof("While initialisation of roles :", role.Error) + return role.Error + } + + if role.RowsAffected > 0 { + return nil + } + + var roles = []models.Role{ + { + Label: "Admin", + Code: "ADMIN", + }, + { + Label: "User", + Code: "user", + }, + { + Label: "Accountant", + Code: "accountant", + }, + { + Label: "Deliverer", + Code: "deliverer", + }, + } + + if result := handler.DB.Create(&roles); result.Error != nil { + fmt.Println(result.Error) + return result.Error + } + + return nil +} + +func InitUsers(handler db.Handler) error { + log := utils.GetLogger() + + c, _ := config.LoadConfig() + + isUser := handler.DB.Find(&models.User{}) + + if isUser.Error != nil { + log.Infof("While initialisation of isUsers :", isUser.Error) + return isUser.Error + } + + if isUser.RowsAffected > 0 { + return nil + } + var role models.Role + if result := handler.DB.Where(&models.Role{Code: "ADMIN"}).First(&role); result.Error != nil { + fmt.Println(result.Error) + return result.Error + } + + user := models.User{ + FirstName: "Admin", + LastName: "Admin", + Email: c.DefaultUserEmail, + Password: utils.HashPassword(c.DefaultUserPassword), + Role: role, + MainAddress: models.MainAddress{Country: "France", ZipCode: "75000", Street: "Rue de la paix", Lat: 48.856614, Lng: 2.3522219}, + } + + if result := handler.DB.Create(&user); result.Error != nil { + fmt.Println(result.Error) + return result.Error + } + return nil +} diff --git a/services/user/src/pkg/models/main_address.go b/services/user/src/pkg/models/main_address.go index e4b44112..335576a3 100644 --- a/services/user/src/pkg/models/main_address.go +++ b/services/user/src/pkg/models/main_address.go @@ -1,7 +1,7 @@ package models type MainAddress struct { - Id string `json:"id" gorm:"primaryKey"` + Id uint64 `json:"id" gorm:"primaryKey;autoIncrement"` Street string `json:"street" gorm:"type:varchar(255);not null"` ZipCode string `json:"zip_code" gorm:"type:varchar(5);not null"` Country string `json:"country" gorm:"type:varchar(255);not null"` diff --git a/services/user/src/pkg/models/role.go b/services/user/src/pkg/models/role.go index c90decfe..a2f3cc27 100644 --- a/services/user/src/pkg/models/role.go +++ b/services/user/src/pkg/models/role.go @@ -1,7 +1,7 @@ package models type Role struct { - Id string `json:"id" gorm:"primaryKey"` + Id uint64 `json:"id" gorm:"primaryKey;autoIncrement"` Code string `json:"code" gorm:"type:varchar(255);uniqueIndex;not null"` Label string `json:"label" gorm:"type:varchar(255);not null"` } diff --git a/services/user/src/pkg/models/user.go b/services/user/src/pkg/models/user.go index 89061915..fc926264 100644 --- a/services/user/src/pkg/models/user.go +++ b/services/user/src/pkg/models/user.go @@ -1,14 +1,14 @@ package models type User struct { - Id string `json:"id" gorm:"primaryKey"` - Email string `json:"email" gorm:"type:varchar(255);not null"` + Id uint64 `json:"id" gorm:"primaryKey;autoIncrement"` + Email string `json:"email" gorm:"type:varchar(255);not null;unique"` Password string `json:"password" gorm:"type:varchar(255);not null"` Phone string `json:"phone" gorm:"type:varchar(10)"` LastName string `json:"last_name" gorm:"type:varchar(100);not null"` FirstName string `json:"first_name" gorm:"type:varchar(100);not null"` - MainAddressId string + MainAddressId uint64 MainAddress MainAddress `json:"main_address" gorm:"foreignKey:MainAddressId;references:Id"` - RoleId string + RoleId uint64 Role Role `json:"role" gorm:"foreignKey:RoleId"` } diff --git a/services/user/src/pkg/services/user.go b/services/user/src/pkg/services/user.go index ab2250ae..be5a4c5a 100644 --- a/services/user/src/pkg/services/user.go +++ b/services/user/src/pkg/services/user.go @@ -5,6 +5,7 @@ import ( "github.com/golang/protobuf/ptypes/empty" "goodfood-user/pkg/mapper" "goodfood-user/pkg/models" + "goodfood-user/pkg/utils" pb "goodfood-user/proto" ) @@ -63,7 +64,7 @@ func (s *Server) ChangePassword(ctx context.Context, req *pb.ChangePasswordInput }, nil } - user.Password = req.NewPassword + user.Password = utils.HashPassword(req.NewPassword) s.H.DB.Save(&user) diff --git a/services/user/src/pkg/utils/jwt.go b/services/user/src/pkg/utils/jwt.go index 03f372af..e53120e5 100644 --- a/services/user/src/pkg/utils/jwt.go +++ b/services/user/src/pkg/utils/jwt.go @@ -15,7 +15,7 @@ type JwtWrapper struct { type JwtClaims struct { jwt.StandardClaims - Id string + Id uint64 Email string } diff --git a/services/user/src/pkg/utils/log.go b/services/user/src/pkg/utils/log.go new file mode 100644 index 00000000..f896b9d6 --- /dev/null +++ b/services/user/src/pkg/utils/log.go @@ -0,0 +1,38 @@ +package utils + +import ( + "github.com/hhkbp2/go-logging" + "goodfood-user/pkg/config" + "log" + "os" +) + +var logger logging.Logger + +func InitLogger() { + c, _ := config.LoadConfig() + + if logger != nil { + return + } + format := "%(asctime)s %(levelname)s (%(filename)s:%(lineno)d) " + + "%(name)s %(message)s" + dateFormat := "%Y-%m-%d %H:%M:%S.%3n" + formatter := logging.NewStandardFormatter(format, dateFormat) + + handler, err := logging.NewFileHandler(c.LogFilePath, os.O_APPEND, 4096) + if err != nil { + log.Fatal("[InitLogger]: " + err.Error()) + } + handler.SetFormatter(formatter) + logger = logging.GetLogger("[anyway2pocket]") + _ = logger.SetLevel(logging.LevelInfo) + logger.AddHandler(handler) +} + +func GetLogger() logging.Logger { + if logger == nil { + log.Fatal("[GetLogger]: call InitLogger first") + } + return logger +} From 0a611c67db4a362b3cb679dc6059a7e8a0144e6a Mon Sep 17 00:00:00 2001 From: anatole Date: Wed, 5 Jul 2023 15:55:02 +0200 Subject: [PATCH 164/883] feat(user service): fix code analyse issues --- services/user/src/go.mod | 2 -- services/user/src/pkg/config/env/dev.env | 3 --- services/user/src/pkg/services/auth.go | 6 +++--- services/user/src/pkg/services/mainAddress.go | 4 ++-- services/user/src/pkg/services/user.go | 12 ++++++------ 5 files changed, 11 insertions(+), 16 deletions(-) delete mode 100644 services/user/src/pkg/config/env/dev.env diff --git a/services/user/src/go.mod b/services/user/src/go.mod index 69550e56..2120d42f 100644 --- a/services/user/src/go.mod +++ b/services/user/src/go.mod @@ -3,8 +3,6 @@ module goodfood-user go 1.19 require ( - github.com/hellokvn/go-grpc-auth-svc v0.0.0-20220329201106-de9b08c8e812 - go-micro.dev/v4 v4.10.0 google.golang.org/grpc v1.53.0 ) diff --git a/services/user/src/pkg/config/env/dev.env b/services/user/src/pkg/config/env/dev.env deleted file mode 100644 index 0e99f5fd..00000000 --- a/services/user/src/pkg/config/env/dev.env +++ /dev/null @@ -1,3 +0,0 @@ -PORT=50001 -DB_URL=postgres://postgres:password@localhost:5432/postgres -JWT_SECRET_KEY=r43t18sc \ No newline at end of file diff --git a/services/user/src/pkg/services/auth.go b/services/user/src/pkg/services/auth.go index ccbb67be..81b6610f 100644 --- a/services/user/src/pkg/services/auth.go +++ b/services/user/src/pkg/services/auth.go @@ -15,7 +15,7 @@ type Server struct { Jwt utils.JwtWrapper } -func (s *Server) Register(ctx context.Context, req *pb.UserCreateInput) (*pb.User, error) { +func (s *Server) Register(_ context.Context, req *pb.UserCreateInput) (*pb.User, error) { var user models.User if result := s.H.DB.Where(&models.User{Email: req.Email}).First(&user); result.Error == nil { @@ -30,7 +30,7 @@ func (s *Server) Register(ctx context.Context, req *pb.UserCreateInput) (*pb.Use return mapper.ToProtoUser(&user), nil } -func (s *Server) LogIn(ctx context.Context, req *pb.LogInInput) (*pb.LogInResponse, error) { +func (s *Server) LogIn(_ context.Context, req *pb.LogInInput) (*pb.LogInResponse, error) { var user models.User if result := s.H.DB.Where(&models.User{Email: req.Email}).First(&user); result.Error == nil { @@ -47,7 +47,7 @@ func (s *Server) LogIn(ctx context.Context, req *pb.LogInInput) (*pb.LogInRespon return &pb.LogInResponse{User: mapper.ToProtoUser(&user), Token: token}, nil } -func (s *Server) Validate(ctx context.Context, req *pb.ValidateInput) (*pb.ValidateResponse, error) { +func (s *Server) Validate(_ context.Context, req *pb.ValidateInput) (*pb.ValidateResponse, error) { claims, err := s.Jwt.ValidateToken(req.Token) if err != nil { diff --git a/services/user/src/pkg/services/mainAddress.go b/services/user/src/pkg/services/mainAddress.go index ee7ff5d7..e61c7e8e 100644 --- a/services/user/src/pkg/services/mainAddress.go +++ b/services/user/src/pkg/services/mainAddress.go @@ -7,7 +7,7 @@ import ( pb "goodfood-user/proto" ) -func (s *Server) GetMainAddress(ctx context.Context, req *pb.MainAddressId) (*pb.MainAddress, error) { +func (s *Server) GetMainAddress(_ context.Context, req *pb.MainAddressId) (*pb.MainAddress, error) { var address models.MainAddress if result := s.H.DB.Where(&models.User{Id: req.Id}).First(&address); result.Error == nil { @@ -17,7 +17,7 @@ func (s *Server) GetMainAddress(ctx context.Context, req *pb.MainAddressId) (*pb return mapper.ToProtoMainAddress(*&address), nil } -func (s *Server) UpdateMainAddress(ctx context.Context, req *pb.MainAddressUpdateInput) (*pb.UpdateMainAddressOutput, error) { +func (s *Server) UpdateMainAddress(_ context.Context, req *pb.MainAddressUpdateInput) (*pb.UpdateMainAddressOutput, error) { claims, err := s.Jwt.ValidateToken(req.Token) if err != nil { return &pb.UpdateMainAddressOutput{ diff --git a/services/user/src/pkg/services/user.go b/services/user/src/pkg/services/user.go index be5a4c5a..81af6025 100644 --- a/services/user/src/pkg/services/user.go +++ b/services/user/src/pkg/services/user.go @@ -9,7 +9,7 @@ import ( pb "goodfood-user/proto" ) -func (s *Server) GetUser(ctx context.Context, req *pb.UserId) (*pb.User, error) { +func (s *Server) GetUser(_ context.Context, req *pb.UserId) (*pb.User, error) { var user models.User if result := s.H.DB.Where(&models.User{Id: req.Id}).First(&user); result.Error == nil { @@ -19,7 +19,7 @@ func (s *Server) GetUser(ctx context.Context, req *pb.UserId) (*pb.User, error) return mapper.ToProtoUser(&user), nil } -func (s *Server) UpdateUser(ctx context.Context, req *pb.UpdateUserInput) (*pb.UpdateUserOutput, error) { +func (s *Server) UpdateUser(_ context.Context, req *pb.UpdateUserInput) (*pb.UpdateUserOutput, error) { claims, err := s.Jwt.ValidateToken(req.Token) if err != nil { return &pb.UpdateUserOutput{ @@ -41,7 +41,7 @@ func (s *Server) UpdateUser(ctx context.Context, req *pb.UpdateUserInput) (*pb.U }, nil } -func (s *Server) ListUser(ctx context.Context, _ *empty.Empty) (*pb.UserList, error) { +func (s *Server) ListUser(_ context.Context, _ *empty.Empty) (*pb.UserList, error) { var users []*models.User s.H.DB.Find(&users) return &pb.UserList{ @@ -49,7 +49,7 @@ func (s *Server) ListUser(ctx context.Context, _ *empty.Empty) (*pb.UserList, er }, nil } -func (s *Server) ChangePassword(ctx context.Context, req *pb.ChangePasswordInput) (*pb.ChangePasswordOutput, error) { +func (s *Server) ChangePassword(_ context.Context, req *pb.ChangePasswordInput) (*pb.ChangePasswordOutput, error) { claims, err := s.Jwt.ValidateToken(req.Token) if err != nil { return &pb.ChangePasswordOutput{ @@ -73,7 +73,7 @@ func (s *Server) ChangePassword(ctx context.Context, req *pb.ChangePasswordInput }, nil } -func (s *Server) DeleteUser(ctx context.Context, req *pb.DeleteInput) (*pb.DeleteUserOutput, error) { +func (s *Server) DeleteUser(_ context.Context, req *pb.DeleteInput) (*pb.DeleteUserOutput, error) { claims, err := s.Jwt.ValidateToken(req.Token) if err != nil { return &pb.DeleteUserOutput{ @@ -103,7 +103,7 @@ func (s *Server) DeleteUser(ctx context.Context, req *pb.DeleteInput) (*pb.Delet } } -func (s *Server) ChangeRole(ctx context.Context, req *pb.ChangeRoleInput) (*pb.ChangeRoleOutput, error) { +func (s *Server) ChangeRole(_ context.Context, req *pb.ChangeRoleInput) (*pb.ChangeRoleOutput, error) { claims, err := s.Jwt.ValidateToken(req.Token) if err != nil { return &pb.ChangeRoleOutput{ From 57507584802c5994a1e8eeaf55580609f0bf06c3 Mon Sep 17 00:00:00 2001 From: anatole Date: Wed, 5 Jul 2023 18:14:18 +0200 Subject: [PATCH 165/883] feat(user service): fix routes --- services/proto/user.pb.go | 231 +++++++++--------- services/proto/user.proto | 11 +- services/proto/user_grpc.pb.go | 30 +-- services/user/src/config.yml | 21 ++ services/user/src/main.go | 7 +- services/user/src/pkg/db/init/initialize.go | 20 +- services/user/src/pkg/mapper/userMapper.go | 8 +- services/user/src/pkg/services/auth.go | 10 +- services/user/src/pkg/services/mainAddress.go | 2 +- services/user/src/pkg/services/user.go | 29 ++- services/user/src/pkg/utils/log.go | 23 +- 11 files changed, 211 insertions(+), 181 deletions(-) create mode 100644 services/user/src/config.yml diff --git a/services/proto/user.pb.go b/services/proto/user.pb.go index 1293a09f..a3269fa5 100644 --- a/services/proto/user.pb.go +++ b/services/proto/user.pb.go @@ -337,7 +337,7 @@ func (x *UpdateUserInput) GetToken() string { return "" } -type UpdateUserOutput struct { +type UserOutput struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields @@ -346,8 +346,8 @@ type UpdateUserOutput struct { Error string `protobuf:"bytes,2,opt,name=error,proto3" json:"error,omitempty"` } -func (x *UpdateUserOutput) Reset() { - *x = UpdateUserOutput{} +func (x *UserOutput) Reset() { + *x = UserOutput{} if protoimpl.UnsafeEnabled { mi := &file_user_proto_msgTypes[4] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -355,13 +355,13 @@ func (x *UpdateUserOutput) Reset() { } } -func (x *UpdateUserOutput) String() string { +func (x *UserOutput) String() string { return protoimpl.X.MessageStringOf(x) } -func (*UpdateUserOutput) ProtoMessage() {} +func (*UserOutput) ProtoMessage() {} -func (x *UpdateUserOutput) ProtoReflect() protoreflect.Message { +func (x *UserOutput) ProtoReflect() protoreflect.Message { mi := &file_user_proto_msgTypes[4] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -373,19 +373,19 @@ func (x *UpdateUserOutput) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use UpdateUserOutput.ProtoReflect.Descriptor instead. -func (*UpdateUserOutput) Descriptor() ([]byte, []int) { +// Deprecated: Use UserOutput.ProtoReflect.Descriptor instead. +func (*UserOutput) Descriptor() ([]byte, []int) { return file_user_proto_rawDescGZIP(), []int{4} } -func (x *UpdateUserOutput) GetUser() *User { +func (x *UserOutput) GetUser() *User { if x != nil { return x.User } return nil } -func (x *UpdateUserOutput) GetError() string { +func (x *UserOutput) GetError() string { if x != nil { return x.Error } @@ -657,7 +657,8 @@ type UserList struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Users []*User `protobuf:"bytes,1,rep,name=users,proto3" json:"users,omitempty"` + Error string `protobuf:"bytes,1,opt,name=error,proto3" json:"error,omitempty"` + Users []*User `protobuf:"bytes,2,rep,name=users,proto3" json:"users,omitempty"` } func (x *UserList) Reset() { @@ -692,6 +693,13 @@ func (*UserList) Descriptor() ([]byte, []int) { return file_user_proto_rawDescGZIP(), []int{9} } +func (x *UserList) GetError() string { + if x != nil { + return x.Error + } + return "" +} + func (x *UserList) GetUsers() []*User { if x != nil { return x.Users @@ -1466,42 +1474,43 @@ var file_user_proto_rawDesc = []byte{ 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, - 0x65, 0x6e, 0x22, 0x55, 0x0a, 0x10, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, - 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x2b, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, - 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x04, 0x75, - 0x73, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x8e, 0x02, 0x0a, 0x0f, 0x55, 0x73, - 0x65, 0x72, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x12, 0x1d, 0x0a, - 0x0a, 0x66, 0x69, 0x72, 0x73, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x09, 0x66, 0x69, 0x72, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x09, - 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x6c, 0x61, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6d, 0x61, - 0x69, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x12, - 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x70, - 0x68, 0x6f, 0x6e, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x68, 0x6f, 0x6e, - 0x65, 0x12, 0x45, 0x0a, 0x0b, 0x6d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, - 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x4d, 0x61, 0x69, 0x6e, 0x41, - 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x52, 0x0b, 0x6d, 0x61, 0x69, - 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x30, 0x0a, 0x04, 0x72, 0x6f, 0x6c, 0x65, - 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, - 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, - 0x6e, 0x70, 0x75, 0x74, 0x52, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x22, 0x80, 0x01, 0x0a, 0x10, 0x4d, - 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x12, - 0x16, 0x0a, 0x06, 0x73, 0x74, 0x72, 0x65, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x06, 0x73, 0x74, 0x72, 0x65, 0x65, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x7a, 0x69, 0x70, 0x43, 0x6f, - 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x7a, 0x69, 0x70, 0x43, 0x6f, 0x64, - 0x65, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x63, - 0x6f, 0x6f, 0x72, 0x64, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x05, - 0x52, 0x0b, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x73, 0x22, 0x1f, 0x0a, - 0x09, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, - 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x22, 0x18, - 0x0a, 0x06, 0x55, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x04, 0x52, 0x02, 0x69, 0x64, 0x22, 0x39, 0x0a, 0x08, 0x55, 0x73, 0x65, 0x72, - 0x4c, 0x69, 0x73, 0x74, 0x12, 0x2d, 0x0a, 0x05, 0x75, 0x73, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, + 0x65, 0x6e, 0x22, 0x4f, 0x0a, 0x0a, 0x55, 0x73, 0x65, 0x72, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, + 0x12, 0x2b, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, + 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, + 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x12, 0x14, 0x0a, + 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, + 0x72, 0x6f, 0x72, 0x22, 0x8e, 0x02, 0x0a, 0x0f, 0x55, 0x73, 0x65, 0x72, 0x43, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x66, 0x69, 0x72, 0x73, 0x74, + 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x66, 0x69, 0x72, + 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6c, 0x61, 0x73, 0x74, 0x4e, + 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, + 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x73, + 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x68, 0x6f, 0x6e, 0x65, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x68, 0x6f, 0x6e, 0x65, 0x12, 0x45, 0x0a, 0x0b, 0x6d, + 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x23, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, + 0x75, 0x73, 0x65, 0x72, 0x2e, 0x4d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, + 0x49, 0x6e, 0x70, 0x75, 0x74, 0x52, 0x0b, 0x6d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, + 0x73, 0x73, 0x12, 0x30, 0x0a, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1c, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, + 0x75, 0x73, 0x65, 0x72, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x52, 0x04, + 0x72, 0x6f, 0x6c, 0x65, 0x22, 0x80, 0x01, 0x0a, 0x10, 0x4d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, + 0x72, 0x65, 0x73, 0x73, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x72, + 0x65, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x72, 0x65, 0x65, + 0x74, 0x12, 0x18, 0x0a, 0x07, 0x7a, 0x69, 0x70, 0x43, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x07, 0x7a, 0x69, 0x70, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x69, 0x6e, + 0x61, 0x74, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x05, 0x52, 0x0b, 0x63, 0x6f, 0x6f, 0x72, + 0x64, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x73, 0x22, 0x1f, 0x0a, 0x09, 0x52, 0x6f, 0x6c, 0x65, 0x49, + 0x6e, 0x70, 0x75, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x22, 0x18, 0x0a, 0x06, 0x55, 0x73, 0x65, 0x72, + 0x49, 0x64, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x02, + 0x69, 0x64, 0x22, 0x4f, 0x0a, 0x08, 0x55, 0x73, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x14, + 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, + 0x72, 0x72, 0x6f, 0x72, 0x12, 0x2d, 0x0a, 0x05, 0x75, 0x73, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x05, 0x75, 0x73, 0x65, 0x72, 0x73, 0x22, 0x56, 0x0a, 0x0a, 0x6c, 0x6f, 0x67, 0x49, 0x6e, 0x49, 0x6e, 0x70, 0x75, @@ -1571,68 +1580,68 @@ var file_user_proto_rawDesc = []byte{ 0x73, 0x65, 0x72, 0x2e, 0x4d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x0b, 0x6d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, - 0x6f, 0x72, 0x32, 0xe9, 0x05, 0x0a, 0x0b, 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x12, 0x49, 0x0a, 0x08, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x12, 0x22, + 0x6f, 0x72, 0x32, 0xef, 0x05, 0x0a, 0x0b, 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x12, 0x4f, 0x0a, 0x08, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x12, 0x22, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x70, - 0x75, 0x74, 0x1a, 0x17, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, - 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x22, 0x00, 0x12, 0x3f, 0x0a, - 0x07, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x12, 0x19, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, - 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, - 0x72, 0x49, 0x64, 0x1a, 0x17, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, - 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x22, 0x00, 0x12, 0x57, - 0x0a, 0x0a, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x12, 0x22, 0x2e, 0x63, + 0x75, 0x74, 0x1a, 0x1d, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, + 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x4f, 0x75, 0x74, 0x70, 0x75, + 0x74, 0x22, 0x00, 0x12, 0x45, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x12, 0x19, + 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, + 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x49, 0x64, 0x1a, 0x1d, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, + 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, 0x73, + 0x65, 0x72, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x51, 0x0a, 0x0a, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x12, 0x22, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, + 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x1d, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, - 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x49, 0x6e, 0x70, 0x75, 0x74, - 0x1a, 0x23, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, - 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x4f, - 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x53, 0x0a, 0x0a, 0x44, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x55, 0x73, 0x65, 0x72, 0x12, 0x1e, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, - 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, - 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x23, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, - 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, - 0x55, 0x73, 0x65, 0x72, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x41, 0x0a, 0x08, - 0x4c, 0x69, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, - 0x1a, 0x1b, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, - 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x22, 0x00, 0x12, - 0x4a, 0x0a, 0x05, 0x4c, 0x6f, 0x67, 0x49, 0x6e, 0x12, 0x1d, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, - 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x6c, 0x6f, 0x67, - 0x49, 0x6e, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x20, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, - 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x6c, 0x6f, 0x67, 0x49, - 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x53, 0x0a, 0x08, 0x56, - 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x12, 0x20, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, - 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x76, 0x61, 0x6c, 0x69, - 0x64, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x23, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, - 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x76, 0x61, - 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, - 0x12, 0x63, 0x0a, 0x0e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, - 0x72, 0x64, 0x12, 0x26, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, - 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x61, 0x73, - 0x73, 0x77, 0x6f, 0x72, 0x64, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x27, 0x2e, 0x63, 0x6f, 0x6d, - 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x63, - 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x4f, 0x75, 0x74, - 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0a, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, - 0x6f, 0x6c, 0x65, 0x12, 0x22, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, - 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x6f, - 0x6c, 0x65, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x23, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, - 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x63, 0x68, 0x61, 0x6e, - 0x67, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x32, 0xd8, - 0x01, 0x0a, 0x12, 0x4d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x53, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x54, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x4d, 0x61, 0x69, 0x6e, - 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x20, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, - 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x4d, 0x61, 0x69, 0x6e, - 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x49, 0x64, 0x1a, 0x1e, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, - 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x4d, 0x61, - 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x22, 0x00, 0x12, 0x6c, 0x0a, 0x11, 0x55, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, - 0x12, 0x29, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, - 0x75, 0x73, 0x65, 0x72, 0x2e, 0x4d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, - 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x2a, 0x2e, 0x63, 0x6f, + 0x2e, 0x55, 0x73, 0x65, 0x72, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x53, 0x0a, + 0x0a, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x12, 0x1e, 0x2e, 0x63, 0x6f, + 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, + 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x23, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, - 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, - 0x73, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x42, 0x03, 0x5a, 0x01, 0x2e, 0x62, 0x06, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, + 0x22, 0x00, 0x12, 0x41, 0x0a, 0x08, 0x4c, 0x69, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, 0x12, 0x16, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1b, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, + 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x4c, + 0x69, 0x73, 0x74, 0x22, 0x00, 0x12, 0x4a, 0x0a, 0x05, 0x4c, 0x6f, 0x67, 0x49, 0x6e, 0x12, 0x1d, + 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, + 0x65, 0x72, 0x2e, 0x6c, 0x6f, 0x67, 0x49, 0x6e, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x20, 0x2e, + 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, + 0x72, 0x2e, 0x6c, 0x6f, 0x67, 0x49, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x00, 0x12, 0x53, 0x0a, 0x08, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x12, 0x20, 0x2e, + 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, + 0x72, 0x2e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, + 0x23, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, + 0x73, 0x65, 0x72, 0x2e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x63, 0x0a, 0x0e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, + 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x26, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, + 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x63, 0x68, 0x61, + 0x6e, 0x67, 0x65, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x49, 0x6e, 0x70, 0x75, 0x74, + 0x1a, 0x27, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, + 0x75, 0x73, 0x65, 0x72, 0x2e, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x61, 0x73, 0x73, 0x77, + 0x6f, 0x72, 0x64, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0a, 0x43, + 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x12, 0x22, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, + 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x63, 0x68, + 0x61, 0x6e, 0x67, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x23, 0x2e, + 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, + 0x72, 0x2e, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x4f, 0x75, 0x74, 0x70, + 0x75, 0x74, 0x22, 0x00, 0x32, 0xd8, 0x01, 0x0a, 0x12, 0x4d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, + 0x72, 0x65, 0x73, 0x73, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x54, 0x0a, 0x0e, 0x47, + 0x65, 0x74, 0x4d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x20, 0x2e, + 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, + 0x72, 0x2e, 0x4d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x49, 0x64, 0x1a, + 0x1e, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, + 0x73, 0x65, 0x72, 0x2e, 0x4d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x22, + 0x00, 0x12, 0x6c, 0x0a, 0x11, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x69, 0x6e, 0x41, + 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x29, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, + 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x4d, 0x61, 0x69, 0x6e, 0x41, + 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x70, 0x75, + 0x74, 0x1a, 0x2a, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, + 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x69, 0x6e, + 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x42, + 0x03, 0x5a, 0x01, 0x2e, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -1653,7 +1662,7 @@ var file_user_proto_goTypes = []interface{}{ (*MainAddress)(nil), // 1: com.goodfood.user.MainAddress (*User)(nil), // 2: com.goodfood.user.User (*UpdateUserInput)(nil), // 3: com.goodfood.user.UpdateUserInput - (*UpdateUserOutput)(nil), // 4: com.goodfood.user.UpdateUserOutput + (*UserOutput)(nil), // 4: com.goodfood.user.UserOutput (*UserCreateInput)(nil), // 5: com.goodfood.user.UserCreateInput (*MainAddressInput)(nil), // 6: com.goodfood.user.MainAddressInput (*RoleInput)(nil), // 7: com.goodfood.user.RoleInput @@ -1678,7 +1687,7 @@ var file_user_proto_depIdxs = []int32{ 1, // 0: com.goodfood.user.User.mainAddress:type_name -> com.goodfood.user.MainAddress 0, // 1: com.goodfood.user.User.role:type_name -> com.goodfood.user.Role 2, // 2: com.goodfood.user.UpdateUserInput.user:type_name -> com.goodfood.user.User - 2, // 3: com.goodfood.user.UpdateUserOutput.user:type_name -> com.goodfood.user.User + 2, // 3: com.goodfood.user.UserOutput.user:type_name -> com.goodfood.user.User 6, // 4: com.goodfood.user.UserCreateInput.mainAddress:type_name -> com.goodfood.user.MainAddressInput 7, // 5: com.goodfood.user.UserCreateInput.role:type_name -> com.goodfood.user.RoleInput 2, // 6: com.goodfood.user.UserList.users:type_name -> com.goodfood.user.User @@ -1699,9 +1708,9 @@ var file_user_proto_depIdxs = []int32{ 17, // 21: com.goodfood.user.UserService.ChangeRole:input_type -> com.goodfood.user.changeRoleInput 20, // 22: com.goodfood.user.MainAddressService.GetMainAddress:input_type -> com.goodfood.user.MainAddressId 21, // 23: com.goodfood.user.MainAddressService.UpdateMainAddress:input_type -> com.goodfood.user.MainAddressUpdateInput - 2, // 24: com.goodfood.user.UserService.Register:output_type -> com.goodfood.user.User - 2, // 25: com.goodfood.user.UserService.GetUser:output_type -> com.goodfood.user.User - 4, // 26: com.goodfood.user.UserService.UpdateUser:output_type -> com.goodfood.user.UpdateUserOutput + 4, // 24: com.goodfood.user.UserService.Register:output_type -> com.goodfood.user.UserOutput + 4, // 25: com.goodfood.user.UserService.GetUser:output_type -> com.goodfood.user.UserOutput + 4, // 26: com.goodfood.user.UserService.UpdateUser:output_type -> com.goodfood.user.UserOutput 18, // 27: com.goodfood.user.UserService.DeleteUser:output_type -> com.goodfood.user.DeleteUserOutput 9, // 28: com.goodfood.user.UserService.ListUser:output_type -> com.goodfood.user.UserList 14, // 29: com.goodfood.user.UserService.LogIn:output_type -> com.goodfood.user.logInResponse @@ -1772,7 +1781,7 @@ func file_user_proto_init() { } } file_user_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UpdateUserOutput); i { + switch v := v.(*UserOutput); i { case 0: return &v.state case 1: diff --git a/services/proto/user.proto b/services/proto/user.proto index 1d460197..d131061e 100644 --- a/services/proto/user.proto +++ b/services/proto/user.proto @@ -38,15 +38,15 @@ message UpdateUserInput { string token = 8; } -message UpdateUserOutput { +message UserOutput { User user = 1; string error = 2; } service UserService { - rpc Register (UserCreateInput) returns (User) {} - rpc GetUser (UserId) returns (User) {} - rpc UpdateUser (UpdateUserInput) returns (UpdateUserOutput) {} + rpc Register (UserCreateInput) returns (UserOutput) {} + rpc GetUser (UserId) returns (UserOutput) {} + rpc UpdateUser (UpdateUserInput) returns (UserOutput) {} rpc DeleteUser (DeleteInput) returns (DeleteUserOutput) {} rpc ListUser (google.protobuf.Empty) returns (UserList) {} rpc LogIn (logInInput) returns (logInResponse) {} @@ -86,7 +86,8 @@ message UserId { } message UserList { - repeated User users = 1; + string error = 1; + repeated User users = 2; } message logInInput { diff --git a/services/proto/user_grpc.pb.go b/services/proto/user_grpc.pb.go index 636ed457..827aca1a 100644 --- a/services/proto/user_grpc.pb.go +++ b/services/proto/user_grpc.pb.go @@ -23,9 +23,9 @@ const _ = grpc.SupportPackageIsVersion7 // // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. type UserServiceClient interface { - Register(ctx context.Context, in *UserCreateInput, opts ...grpc.CallOption) (*User, error) - GetUser(ctx context.Context, in *UserId, opts ...grpc.CallOption) (*User, error) - UpdateUser(ctx context.Context, in *UpdateUserInput, opts ...grpc.CallOption) (*UpdateUserOutput, error) + Register(ctx context.Context, in *UserCreateInput, opts ...grpc.CallOption) (*UserOutput, error) + GetUser(ctx context.Context, in *UserId, opts ...grpc.CallOption) (*UserOutput, error) + UpdateUser(ctx context.Context, in *UpdateUserInput, opts ...grpc.CallOption) (*UserOutput, error) DeleteUser(ctx context.Context, in *DeleteInput, opts ...grpc.CallOption) (*DeleteUserOutput, error) ListUser(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*UserList, error) LogIn(ctx context.Context, in *LogInInput, opts ...grpc.CallOption) (*LogInResponse, error) @@ -42,8 +42,8 @@ func NewUserServiceClient(cc grpc.ClientConnInterface) UserServiceClient { return &userServiceClient{cc} } -func (c *userServiceClient) Register(ctx context.Context, in *UserCreateInput, opts ...grpc.CallOption) (*User, error) { - out := new(User) +func (c *userServiceClient) Register(ctx context.Context, in *UserCreateInput, opts ...grpc.CallOption) (*UserOutput, error) { + out := new(UserOutput) err := c.cc.Invoke(ctx, "/com.goodfood.user.UserService/Register", in, out, opts...) if err != nil { return nil, err @@ -51,8 +51,8 @@ func (c *userServiceClient) Register(ctx context.Context, in *UserCreateInput, o return out, nil } -func (c *userServiceClient) GetUser(ctx context.Context, in *UserId, opts ...grpc.CallOption) (*User, error) { - out := new(User) +func (c *userServiceClient) GetUser(ctx context.Context, in *UserId, opts ...grpc.CallOption) (*UserOutput, error) { + out := new(UserOutput) err := c.cc.Invoke(ctx, "/com.goodfood.user.UserService/GetUser", in, out, opts...) if err != nil { return nil, err @@ -60,8 +60,8 @@ func (c *userServiceClient) GetUser(ctx context.Context, in *UserId, opts ...grp return out, nil } -func (c *userServiceClient) UpdateUser(ctx context.Context, in *UpdateUserInput, opts ...grpc.CallOption) (*UpdateUserOutput, error) { - out := new(UpdateUserOutput) +func (c *userServiceClient) UpdateUser(ctx context.Context, in *UpdateUserInput, opts ...grpc.CallOption) (*UserOutput, error) { + out := new(UserOutput) err := c.cc.Invoke(ctx, "/com.goodfood.user.UserService/UpdateUser", in, out, opts...) if err != nil { return nil, err @@ -127,9 +127,9 @@ func (c *userServiceClient) ChangeRole(ctx context.Context, in *ChangeRoleInput, // All implementations must embed UnimplementedUserServiceServer // for forward compatibility type UserServiceServer interface { - Register(context.Context, *UserCreateInput) (*User, error) - GetUser(context.Context, *UserId) (*User, error) - UpdateUser(context.Context, *UpdateUserInput) (*UpdateUserOutput, error) + Register(context.Context, *UserCreateInput) (*UserOutput, error) + GetUser(context.Context, *UserId) (*UserOutput, error) + UpdateUser(context.Context, *UpdateUserInput) (*UserOutput, error) DeleteUser(context.Context, *DeleteInput) (*DeleteUserOutput, error) ListUser(context.Context, *empty.Empty) (*UserList, error) LogIn(context.Context, *LogInInput) (*LogInResponse, error) @@ -143,13 +143,13 @@ type UserServiceServer interface { type UnimplementedUserServiceServer struct { } -func (UnimplementedUserServiceServer) Register(context.Context, *UserCreateInput) (*User, error) { +func (UnimplementedUserServiceServer) Register(context.Context, *UserCreateInput) (*UserOutput, error) { return nil, status.Errorf(codes.Unimplemented, "method Register not implemented") } -func (UnimplementedUserServiceServer) GetUser(context.Context, *UserId) (*User, error) { +func (UnimplementedUserServiceServer) GetUser(context.Context, *UserId) (*UserOutput, error) { return nil, status.Errorf(codes.Unimplemented, "method GetUser not implemented") } -func (UnimplementedUserServiceServer) UpdateUser(context.Context, *UpdateUserInput) (*UpdateUserOutput, error) { +func (UnimplementedUserServiceServer) UpdateUser(context.Context, *UpdateUserInput) (*UserOutput, error) { return nil, status.Errorf(codes.Unimplemented, "method UpdateUser not implemented") } func (UnimplementedUserServiceServer) DeleteUser(context.Context, *DeleteInput) (*DeleteUserOutput, error) { diff --git a/services/user/src/config.yml b/services/user/src/config.yml new file mode 100644 index 00000000..afd7fbb9 --- /dev/null +++ b/services/user/src/config.yml @@ -0,0 +1,21 @@ +formatters: + f: + format: "%(asctime)s %(levelname)s (%(filename)s:%(lineno)d) %(name)s %(message)s" + datefmt: "%Y-%m-%d %H:%M:%S.%3n" +handlers: + h: + class: RotatingFileHandler + filepath: "./logs/app.log" + mode: O_APPEND + bufferSize: 0 + # 30 * 1000 ms -> 30 seconds + bufferFlushTime: 30000 + inputChanSize: 1 + # 100 * 1024 * 1024 -> 100M + maxBytes: 104857600 + backupCount: 9 + formatter: f +loggers: + UserServicelogger: + level: INFO + handlers: [h] \ No newline at end of file diff --git a/services/user/src/main.go b/services/user/src/main.go index 34cd825c..43533470 100644 --- a/services/user/src/main.go +++ b/services/user/src/main.go @@ -16,10 +16,10 @@ func main() { utils.InitLogger() logger := utils.GetLogger() defer logging.Shutdown() + c, err := config.LoadConfig() - logger.Fatal("Failed at config", err) - url := "0.0.0.0:" + c.Port + url := "localhost:" + c.Port if err != nil { logger.Fatal("Failed at config", err) @@ -33,7 +33,8 @@ func main() { Issuer: "go-grpc-auth-svc", ExpirationHours: 24 * 365, } - logger.Fatal("Starting server at ", url) + + logger.Infof("Starting server at ", c.Port) lis, err := net.Listen("tcp", url) diff --git a/services/user/src/pkg/db/init/initialize.go b/services/user/src/pkg/db/init/initialize.go index e5a4c9cd..defdc67d 100644 --- a/services/user/src/pkg/db/init/initialize.go +++ b/services/user/src/pkg/db/init/initialize.go @@ -1,7 +1,6 @@ package db import ( - "fmt" "goodfood-user/pkg/config" "goodfood-user/pkg/db" "goodfood-user/pkg/models" @@ -9,27 +8,27 @@ import ( ) func InitDb(handler db.Handler) { - - log := utils.GetLogger() + logger := utils.GetLogger() + logger.Infof("Initializing database") err := InitRoles(handler) if err != nil { - log.Infof("While initialisation of roles :", err) + logger.Errorf("While initialisation of roles :", err) return } er := InitUsers(handler) if er != nil { - log.Infof("While initialisation of users :", er) + logger.Errorf("While initialisation of users :", er) return } } func InitRoles(handler db.Handler) error { - log := utils.GetLogger() + logger := utils.GetLogger() role := handler.DB.Find(&models.Role{}) if role.Error != nil { - log.Infof("While initialisation of roles :", role.Error) + logger.Errorf("While initialisation of roles :", role.Error) return role.Error } @@ -57,7 +56,6 @@ func InitRoles(handler db.Handler) error { } if result := handler.DB.Create(&roles); result.Error != nil { - fmt.Println(result.Error) return result.Error } @@ -65,14 +63,14 @@ func InitRoles(handler db.Handler) error { } func InitUsers(handler db.Handler) error { - log := utils.GetLogger() + logger := utils.GetLogger() c, _ := config.LoadConfig() isUser := handler.DB.Find(&models.User{}) if isUser.Error != nil { - log.Infof("While initialisation of isUsers :", isUser.Error) + logger.Errorf("While initialisation of isUsers :", isUser.Error) return isUser.Error } @@ -81,7 +79,6 @@ func InitUsers(handler db.Handler) error { } var role models.Role if result := handler.DB.Where(&models.Role{Code: "ADMIN"}).First(&role); result.Error != nil { - fmt.Println(result.Error) return result.Error } @@ -95,7 +92,6 @@ func InitUsers(handler db.Handler) error { } if result := handler.DB.Create(&user); result.Error != nil { - fmt.Println(result.Error) return result.Error } return nil diff --git a/services/user/src/pkg/mapper/userMapper.go b/services/user/src/pkg/mapper/userMapper.go index 810c1d06..33e7486a 100644 --- a/services/user/src/pkg/mapper/userMapper.go +++ b/services/user/src/pkg/mapper/userMapper.go @@ -2,14 +2,18 @@ package mapper import ( "goodfood-user/pkg/models" + "goodfood-user/pkg/utils" pb "goodfood-user/proto" ) -func ToProtoUsers(user []*models.User) []*pb.User { +func ToProtoUsers(userList []*models.User) []*pb.User { var users []*pb.User - for _, u := range user { + for _, u := range userList { + utils.GetLogger().Infof("ToProtoUsers", u.Email) + users = append(users, ToProtoUser(u)) } + return users } diff --git a/services/user/src/pkg/services/auth.go b/services/user/src/pkg/services/auth.go index 81b6610f..e363004b 100644 --- a/services/user/src/pkg/services/auth.go +++ b/services/user/src/pkg/services/auth.go @@ -15,10 +15,10 @@ type Server struct { Jwt utils.JwtWrapper } -func (s *Server) Register(_ context.Context, req *pb.UserCreateInput) (*pb.User, error) { +func (s *Server) Register(_ context.Context, req *pb.UserCreateInput) (*pb.UserOutput, error) { var user models.User - if result := s.H.DB.Where(&models.User{Email: req.Email}).First(&user); result.Error == nil { + if result := s.H.DB.Where(&models.User{Email: req.Email}).First(&user); result.Error != nil { return nil, result.Error } @@ -27,13 +27,15 @@ func (s *Server) Register(_ context.Context, req *pb.UserCreateInput) (*pb.User, s.H.DB.Create(&user) - return mapper.ToProtoUser(&user), nil + return &pb.UserOutput{ + User: mapper.ToProtoUser(&user), + }, nil } func (s *Server) LogIn(_ context.Context, req *pb.LogInInput) (*pb.LogInResponse, error) { var user models.User - if result := s.H.DB.Where(&models.User{Email: req.Email}).First(&user); result.Error == nil { + if result := s.H.DB.Where(&models.User{Email: req.Email}).First(&user); result.Error != nil { return nil, result.Error } diff --git a/services/user/src/pkg/services/mainAddress.go b/services/user/src/pkg/services/mainAddress.go index e61c7e8e..23bf5f9b 100644 --- a/services/user/src/pkg/services/mainAddress.go +++ b/services/user/src/pkg/services/mainAddress.go @@ -10,7 +10,7 @@ import ( func (s *Server) GetMainAddress(_ context.Context, req *pb.MainAddressId) (*pb.MainAddress, error) { var address models.MainAddress - if result := s.H.DB.Where(&models.User{Id: req.Id}).First(&address); result.Error == nil { + if result := s.H.DB.Where(&models.User{Id: req.Id}).First(&address); result.Error != nil { return nil, result.Error } diff --git a/services/user/src/pkg/services/user.go b/services/user/src/pkg/services/user.go index 81af6025..4280e934 100644 --- a/services/user/src/pkg/services/user.go +++ b/services/user/src/pkg/services/user.go @@ -9,26 +9,30 @@ import ( pb "goodfood-user/proto" ) -func (s *Server) GetUser(_ context.Context, req *pb.UserId) (*pb.User, error) { - var user models.User +func (s *Server) GetUser(_ context.Context, req *pb.UserId) (*pb.UserOutput, error) { + var user *models.User - if result := s.H.DB.Where(&models.User{Id: req.Id}).First(&user); result.Error == nil { - return nil, result.Error + if result := s.H.DB.Where("id = ?", req.Id).Preload("Role").Preload("MainAddress").Find(&user); result.Error != nil { + return &pb.UserOutput{ + Error: result.Error.Error(), + }, nil } - return mapper.ToProtoUser(&user), nil + return &pb.UserOutput{ + User: mapper.ToProtoUser(user), + }, nil } -func (s *Server) UpdateUser(_ context.Context, req *pb.UpdateUserInput) (*pb.UpdateUserOutput, error) { +func (s *Server) UpdateUser(_ context.Context, req *pb.UpdateUserInput) (*pb.UserOutput, error) { claims, err := s.Jwt.ValidateToken(req.Token) if err != nil { - return &pb.UpdateUserOutput{ + return &pb.UserOutput{ Error: "Invalid token", }, nil } if result := s.H.DB.Where(&models.User{Id: claims.Id}); result.Error != nil { - return &pb.UpdateUserOutput{ + return &pb.UserOutput{ Error: "User not found", }, nil } @@ -36,14 +40,19 @@ func (s *Server) UpdateUser(_ context.Context, req *pb.UpdateUserInput) (*pb.Upd s.H.DB.Save(&user) - return &pb.UpdateUserOutput{ + return &pb.UserOutput{ User: mapper.ToProtoUser(user), }, nil } func (s *Server) ListUser(_ context.Context, _ *empty.Empty) (*pb.UserList, error) { var users []*models.User - s.H.DB.Find(&users) + if result := s.H.DB.Preload("Role").Preload("MainAddress").Find(&users); result.Error != nil { + return &pb.UserList{ + Error: "Users not found", + }, nil + } + return &pb.UserList{ Users: mapper.ToProtoUsers(users), }, nil diff --git a/services/user/src/pkg/utils/log.go b/services/user/src/pkg/utils/log.go index f896b9d6..a1d58d03 100644 --- a/services/user/src/pkg/utils/log.go +++ b/services/user/src/pkg/utils/log.go @@ -2,31 +2,18 @@ package utils import ( "github.com/hhkbp2/go-logging" - "goodfood-user/pkg/config" "log" - "os" ) var logger logging.Logger func InitLogger() { - c, _ := config.LoadConfig() - - if logger != nil { - return - } - format := "%(asctime)s %(levelname)s (%(filename)s:%(lineno)d) " + - "%(name)s %(message)s" - dateFormat := "%Y-%m-%d %H:%M:%S.%3n" - formatter := logging.NewStandardFormatter(format, dateFormat) - - handler, err := logging.NewFileHandler(c.LogFilePath, os.O_APPEND, 4096) - if err != nil { - log.Fatal("[InitLogger]: " + err.Error()) + configFile := "./config.yml" + if err := logging.ApplyConfigFile(configFile); err != nil { + panic(err.Error()) } - handler.SetFormatter(formatter) - logger = logging.GetLogger("[anyway2pocket]") - _ = logger.SetLevel(logging.LevelInfo) + logger = logging.GetLogger("UserServicelogger") + handler := logging.NewStdoutHandler() logger.AddHandler(handler) } From 9b96d786b1429765de8a2624440f570bfea30442 Mon Sep 17 00:00:00 2001 From: Florian LEROUX Date: Thu, 6 Jul 2023 08:55:16 +0200 Subject: [PATCH 166/883] feat(reporting): add restaurant_id to proto/schema, add affluence handler --- services/order/README.md | 18 +++++++- services/order/package.json | 4 +- services/order/pnpm-lock.yaml | 34 ++++++++------ services/order/prisma/schema.prisma | 2 + services/order/prisma/seed.ts | 6 +++ .../order/src/handlers/order/affluence.ts | 46 +++++++++++++++++++ services/order/src/handlers/order/create.ts | 3 +- services/order/src/handlers/order/index.ts | 4 ++ services/order/src/handlers/order/update.ts | 3 +- services/order/src/middleware/log.ts | 3 +- services/order/src/types/order.d.ts | 16 +++++++ services/proto/order.proto | 24 ++++++++++ 12 files changed, 142 insertions(+), 21 deletions(-) create mode 100644 services/order/src/handlers/order/affluence.ts diff --git a/services/order/README.md b/services/order/README.md index f1ef491f..db2b6882 100644 --- a/services/order/README.md +++ b/services/order/README.md @@ -35,7 +35,7 @@ You can use the following tools to help you with the setup: - You can use nvm to set your Node version using: - `nvm use`. - You can use docker to run your MongoDB server using: - - `docker run --name mongodb -p 27017:27017 -d mongo:latest` + - `docker run -d -e MONGO_INITDB_ROOT_USERNAME=user -e MONGO_INITDB_ROOT_PASSWORD=pass -p 27017:27017 --name mongodb mongo --replSet rs0` - You can use docker to run your RabbitMQ server using: - `docker run --name rabbitmq -p 5672:5672 -p 15672:15672 -d rabbitmq:3-management` @@ -52,3 +52,19 @@ You can use the following tools to help you with the setup: You can now access the microservice at `http://localhost:50007`. NB: If you want to run the microservice in development mode, you can run `npm run dev` instead. + +## Testing + +### Requests examples + +**Install `grpcurl` on your machine.** + +- GetOrder: `grpcurl -d '{"id": "example_order_id"}' localhost:50007 com.goodfood.order.OrderService.GetOrder` +- GetOrdersByUser: `grpcurl -d '{"id": "example_user_id"}' localhost:50007 com.goodfood.order.OrderService.GetOrdersByUser` +- GetOrderByDelivery: `grpcurl -d '{"id": "example_delivery_id"}' localhost:50007 com.goodfood.order.OrderService.GetOrderByDelivery` +- GetOrderByPayment: `grpcurl -d '{"id": "example_payment_id"}' localhost:50007 com.goodfood.order.OrderService.GetOrderByPayment` +- GetOrdersByStatus: `grpcurl -d '{"status": "PENDING"}' localhost:50007 com.goodfood.order.OrderService.GetOrdersByStatus` +- CreateOrder: `grpcurl -d '{"payment_id": "example_payment_id", "delivery_id": "example_delivery_id", "user": {"id": "example_user_id", "first_name": "example_first_name", "last_name": "example_last_name", "email": "example_email", "phone": "example_phone"}, "basket_snapshot": {"string": "example_string"}, "restaurant_id": "example_restaurant_id"}' localhost:50007 com.goodfood.order.OrderService.CreateOrder` +- UpdateOrder: `grpcurl -d '{"id": "example_order_id", "payment_id": "example_payment_id", "delivery_id": "example_delivery_id", "status": "IN_PROGRESS", "restaurant_id": "example_restaurant_id"}' localhost:50007 com.goodfood.order.OrderService.UpdateOrder` +- DeleteOrder: `grpcurl -d '{"id": "example_order_id"}' localhost:50007 com.goodfood.order.OrderService.DeleteOrder` +- GetOrdersAffluence: `grpcurl -d '{"date": "example_date", "restaurant_id": "example_restaurant_id"}' localhost:50007 com.goodfood.order.OrderService.GetOrdersAffluence` diff --git a/services/order/package.json b/services/order/package.json index dedafdc5..5760c17e 100644 --- a/services/order/package.json +++ b/services/order/package.json @@ -16,7 +16,7 @@ "dependencies": { "@grpc/grpc-js": "1.8.14", "@grpc/proto-loader": "0.7.6", - "@prisma/client": "4.13.0", + "@prisma/client": "4.16.2", "amqplib": "^0.10.3", "dotenv": "^16.0.3", "grpc-server-reflection": "^0.1.5", @@ -30,7 +30,7 @@ "grpc-tools": "^1.12.4", "nodemon": "^2.0.22", "pkg": "^5.8.1", - "prisma": "4.13.0", + "prisma": "4.16.2", "ts-node": "10.9.1", "tsconfig-paths": "^4.2.0", "typescript": "5.0.2", diff --git a/services/order/pnpm-lock.yaml b/services/order/pnpm-lock.yaml index 6d13847a..4e86a700 100644 --- a/services/order/pnpm-lock.yaml +++ b/services/order/pnpm-lock.yaml @@ -1,5 +1,9 @@ lockfileVersion: '6.0' +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + dependencies: '@grpc/grpc-js': specifier: 1.8.14 @@ -8,8 +12,8 @@ dependencies: specifier: 0.7.6 version: 0.7.6 '@prisma/client': - specifier: 4.13.0 - version: 4.13.0(prisma@4.13.0) + specifier: 4.16.2 + version: 4.16.2(prisma@4.16.2) amqplib: specifier: ^0.10.3 version: 0.10.3 @@ -46,8 +50,8 @@ devDependencies: specifier: ^5.8.1 version: 5.8.1 prisma: - specifier: 4.13.0 - version: 4.13.0 + specifier: 4.16.2 + version: 4.16.2 ts-node: specifier: 10.9.1 version: 10.9.1(@types/node@18.15.9)(typescript@5.0.2) @@ -435,8 +439,8 @@ packages: fastq: 1.15.0 dev: true - /@prisma/client@4.13.0(prisma@4.13.0): - resolution: {integrity: sha512-YaiiICcRB2hatxsbnfB66uWXjcRw3jsZdlAVxmx0cFcTc/Ad/sKdHCcWSnqyDX47vAewkjRFwiLwrOUjswVvmA==} + /@prisma/client@4.16.2(prisma@4.16.2): + resolution: {integrity: sha512-qCoEyxv1ZrQ4bKy39GnylE8Zq31IRmm8bNhNbZx7bF2cU5aiCCnSa93J2imF88MBjn7J9eUQneNxUQVJdl/rPQ==} engines: {node: '>=14.17'} requiresBuild: true peerDependencies: @@ -445,16 +449,16 @@ packages: prisma: optional: true dependencies: - '@prisma/engines-version': 4.13.0-50.1e7af066ee9cb95cf3a403c78d9aab3e6b04f37a - prisma: 4.13.0 + '@prisma/engines-version': 4.16.1-1.4bc8b6e1b66cb932731fb1bdbbc550d1e010de81 + prisma: 4.16.2 dev: false - /@prisma/engines-version@4.13.0-50.1e7af066ee9cb95cf3a403c78d9aab3e6b04f37a: - resolution: {integrity: sha512-fsQlbkhPJf08JOzKoyoD9atdUijuGBekwoOPZC3YOygXEml1MTtgXVpnUNchQlRSY82OQ6pSGQ9PxUe4arcSLQ==} + /@prisma/engines-version@4.16.1-1.4bc8b6e1b66cb932731fb1bdbbc550d1e010de81: + resolution: {integrity: sha512-q617EUWfRIDTriWADZ4YiWRZXCa/WuhNgLTVd+HqWLffjMSPzyM5uOWoauX91wvQClSKZU4pzI4JJLQ9Kl62Qg==} dev: false - /@prisma/engines@4.13.0: - resolution: {integrity: sha512-HrniowHRZXHuGT9XRgoXEaP2gJLXM5RMoItaY2PkjvuZ+iHc0Zjbm/302MB8YsPdWozAPHHn+jpFEcEn71OgPw==} + /@prisma/engines@4.16.2: + resolution: {integrity: sha512-vx1nxVvN4QeT/cepQce68deh/Turxy5Mr+4L4zClFuK1GlxN3+ivxfuv+ej/gvidWn1cE1uAhW7ALLNlYbRUAw==} requiresBuild: true /@protobufjs/aspromise@1.1.2: @@ -1704,13 +1708,13 @@ packages: react-is: 17.0.2 dev: true - /prisma@4.13.0: - resolution: {integrity: sha512-L9mqjnSmvWIRCYJ9mQkwCtj4+JDYYTdhoyo8hlsHNDXaZLh/b4hR0IoKIBbTKxZuyHQzLopb/+0Rvb69uGV7uA==} + /prisma@4.16.2: + resolution: {integrity: sha512-SYCsBvDf0/7XSJyf2cHTLjLeTLVXYfqp7pG5eEVafFLeT0u/hLFz/9W196nDRGUOo1JfPatAEb+uEnTQImQC1g==} engines: {node: '>=14.17'} hasBin: true requiresBuild: true dependencies: - '@prisma/engines': 4.13.0 + '@prisma/engines': 4.16.2 /process-nextick-args@2.0.1: resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} diff --git a/services/order/prisma/schema.prisma b/services/order/prisma/schema.prisma index 84d76908..4f9d6ee9 100644 --- a/services/order/prisma/schema.prisma +++ b/services/order/prisma/schema.prisma @@ -48,6 +48,8 @@ model Order { basket_snapshot Basket @relation(fields: [basket_snapshot_id], references: [id]) basket_snapshot_id String @unique + restaurant_id String + created_at DateTime @default(now()) updated_at DateTime @updatedAt } diff --git a/services/order/prisma/seed.ts b/services/order/prisma/seed.ts index 73eb3646..d7f2ce15 100644 --- a/services/order/prisma/seed.ts +++ b/services/order/prisma/seed.ts @@ -27,6 +27,8 @@ const orders: Prisma.OrderCreateInput[] = [ }, }, status: Status.PENDING, + restaurant_id: "restaurant_id:1", + created_at: new Date("2000-01-01T12:00:00.000Z"), }, { id: "order_id:2", @@ -52,6 +54,8 @@ const orders: Prisma.OrderCreateInput[] = [ }, }, status: Status.FULFILLED, + restaurant_id: "restaurant_id:2", + created_at: new Date("2000-01-01T12:00:00.000Z"), }, { id: "order_id:3", @@ -77,6 +81,8 @@ const orders: Prisma.OrderCreateInput[] = [ }, }, status: Status.PENDING, + restaurant_id: "restaurant_id:1", + created_at: new Date("2000-01-01T13:00:00.000Z"), }, ]; diff --git a/services/order/src/handlers/order/affluence.ts b/services/order/src/handlers/order/affluence.ts new file mode 100644 index 00000000..5faad9d8 --- /dev/null +++ b/services/order/src/handlers/order/affluence.ts @@ -0,0 +1,46 @@ +import { prisma } from "@order/lib/prisma"; +import { log } from "@order/lib/log"; +import { + GetOrdersAffluenceRequest, + GetOrdersAffluenceResponse, +} from "@order/types/order"; +import { Data } from "@order/types"; + +export const GetOrdersAffluence = async ( + { request }: Data, + callback: (err: any, response: GetOrdersAffluenceResponse | null) => void +) => { + try { + const { date, restaurant_id } = request; + const start = new Date(date + " 00:00:00"); + const end = new Date(date + " 23:59:59"); + const orders = await prisma.order.findMany({ + where: { + created_at: { gte: start, lte: end }, + restaurant_id, + }, + }); + const orders_per_hour = Array.from({ length: 24 }, (_, i) => i).map( + (hour) => { + const start = new Date(date + ` ${hour}:00:00`); + const end = new Date(date + ` ${hour}:59:59`); + const orders_in_hours = orders.filter( + (order) => order.created_at >= start && order.created_at <= end + ); + return orders_in_hours.length; + } + ); + + callback(null, { + average: + orders_per_hour.reduce((a, b) => a + b, 0) / orders_per_hour.length, + total: orders.length, + min: Math.min(...orders_per_hour), + max: Math.max(...orders_per_hour), + orders_per_hour, + }); + } catch (error) { + log.error(error); + callback(error, null); + } +}; diff --git a/services/order/src/handlers/order/create.ts b/services/order/src/handlers/order/create.ts index d3af1ad1..8e694086 100644 --- a/services/order/src/handlers/order/create.ts +++ b/services/order/src/handlers/order/create.ts @@ -10,7 +10,7 @@ export const CreateOrder = async ( callback: (err: any, response: Order | null) => void ) => { try { - const { basket_snapshot, delivery_id, payment_id, user } = request; + const { basket_snapshot, delivery_id, payment_id, user, restaurant_id } = request; // todo: calculate total from basket_snapshot const total = 0; // basket_snapshot.reduce; @@ -29,6 +29,7 @@ export const CreateOrder = async ( total, }, }, + restaurant_id, }, include: { basket_snapshot: true, user: true }, }); diff --git a/services/order/src/handlers/order/index.ts b/services/order/src/handlers/order/index.ts index 48ed7249..338cfeed 100644 --- a/services/order/src/handlers/order/index.ts +++ b/services/order/src/handlers/order/index.ts @@ -10,6 +10,8 @@ import { GetOrderByDelivery } from "@order/handlers/order/get-delivery"; import { GetOrderByPayment } from "@order/handlers/order/get-payment"; import { GetOrdersByStatus } from "@order/handlers/order/get-status"; +import { GetOrdersAffluence } from "@order/handlers/order/affluence"; + const orderHandlers: UntypedServiceImplementation = { CreateOrder, GetOrder, @@ -20,6 +22,8 @@ const orderHandlers: UntypedServiceImplementation = { GetOrderByDelivery, GetOrderByPayment, GetOrdersByStatus, + + GetOrdersAffluence, }; export default orderHandlers; diff --git a/services/order/src/handlers/order/update.ts b/services/order/src/handlers/order/update.ts index 83ac05c2..de0f4847 100644 --- a/services/order/src/handlers/order/update.ts +++ b/services/order/src/handlers/order/update.ts @@ -9,7 +9,7 @@ export const UpdateOrder = async ( callback: (err: any, response: Order | null) => void ) => { try { - const { delivery_id, payment_id, id, status } = request; + const { delivery_id, payment_id, id, status, restaurant_id } = request; // todo: calculate total from basket_snapshot const total = 0; // basket_snapshot.reduce; @@ -20,6 +20,7 @@ export const UpdateOrder = async ( delivery_id, payment_id, status, + restaurant_id, }, include: { basket_snapshot: true, user: true }, }); diff --git a/services/order/src/middleware/log.ts b/services/order/src/middleware/log.ts index a28c2542..5c2e41c6 100644 --- a/services/order/src/middleware/log.ts +++ b/services/order/src/middleware/log.ts @@ -35,7 +35,8 @@ export const logGRPC = async (ctx: Context, next: () => Promise) => { const requestAt = new Date(); await next(); const responseAt = new Date(); - const { request, path } = parseContext(ctx); + let { request, path } = parseContext(ctx); + path = path?.split(".").at(-1) || ""; publish({ request, path }, "log"); log.debug(msg("GRPC", path, requestAt, responseAt), JSON.stringify(request)); }; diff --git a/services/order/src/types/order.d.ts b/services/order/src/types/order.d.ts index 6cce9b47..6697479c 100644 --- a/services/order/src/types/order.d.ts +++ b/services/order/src/types/order.d.ts @@ -55,6 +55,7 @@ export type CreateOrderRequest = { delivery_id: string; user: UserMinimum; basket_snapshot: Basket; + restaurant_id: string; }; export type UpdateOrderRequest = { @@ -62,6 +63,7 @@ export type UpdateOrderRequest = { payment_id: string; delivery_id: string; status: Status; + restaurant_id: string; }; export type DeleteOrderRequest = { @@ -76,3 +78,17 @@ export type ExtendedOrder = Order & { user: UserMinimum; basket_snapshot: Basket; }; + +export type GetOrdersAffluenceRequest = { + date: string; + restaurant_id: string; +}; + +export type GetOrdersAffluenceResponse = { + average: number; + total: number; + min: number; + max: number; + + orders_per_hour: number[]; +}; diff --git a/services/proto/order.proto b/services/proto/order.proto index 346f1b20..b77b7adb 100644 --- a/services/proto/order.proto +++ b/services/proto/order.proto @@ -37,6 +37,8 @@ message Order { UserMinimum user = 4; Basket basket_snapshot = 5; Status status = 6; + + string restaurant_id = 7; } service OrderService { @@ -48,6 +50,9 @@ service OrderService { rpc CreateOrder(CreateOrderRequest) returns (Order) {} rpc UpdateOrder(UpdateOrderRequest) returns (Order) {} rpc DeleteOrder(DeleteOrderRequest) returns (DeleteOrderResponse) {} + + // reporting-related + rpc GetOrdersAffluence(GetOrdersAffluenceRequest) returns (GetOrdersAffluenceResponse) {} } message GetOrderRequest { @@ -84,6 +89,8 @@ message CreateOrderRequest { UserMinimum user = 3; Basket basket_snapshot = 4; + + string restaurant_id = 5; } message UpdateOrderRequest{ @@ -93,6 +100,8 @@ message UpdateOrderRequest{ string delivery_id = 3; Status status = 4; + + string restaurant_id = 5; } message DeleteOrderRequest { @@ -103,3 +112,18 @@ message DeleteOrderResponse { string id = 1; } +message GetOrdersAffluenceRequest { + string date = 1; + string restaurant_id = 2; +} + +message GetOrdersAffluenceResponse { + float average = 1; + int32 total = 2; + int32 min = 3; + int32 max = 4; + + // the number of orders for each hour of the day (0-23) (eg: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ...]) + repeated int32 orders_per_hour = 5; + +} From d9f1f6cc0b868df6f41f658de45cfa4fadacfdee Mon Sep 17 00:00:00 2001 From: Florian LEROUX Date: Thu, 6 Jul 2023 10:11:21 +0200 Subject: [PATCH 167/883] ref(db-engine): switch from mongo to postgres --- services/order/.env.example | 6 +-- services/order/README.md | 24 +++++----- .../migration.sql | 47 +++++++++++++++++++ .../prisma/migrations/migration_lock.toml | 3 ++ services/order/prisma/schema.prisma | 2 +- 5 files changed, 64 insertions(+), 18 deletions(-) create mode 100644 services/order/prisma/migrations/20230706080642_init_database/migration.sql create mode 100644 services/order/prisma/migrations/migration_lock.toml diff --git a/services/order/.env.example b/services/order/.env.example index 4caef961..2e790ca5 100644 --- a/services/order/.env.example +++ b/services/order/.env.example @@ -1,8 +1,4 @@ -DB_USER=user -DB_PASS=pass -DB_HOST=mongodb -DATABASE_URL=mongodb+srv://${DB_USER}:${DB_PASS}@${DB_HOST}/order?retryWrites=true&w=majority - +DATABASE_URL=postgres://postgres:password@localhost:5432/postgres AMQP_URL=amqp://guest:guest@localhost PORT=50007 \ No newline at end of file diff --git a/services/order/README.md b/services/order/README.md index db2b6882..16dd1739 100644 --- a/services/order/README.md +++ b/services/order/README.md @@ -1,14 +1,14 @@ # Order Microservice -| Informations | -| ------------------------------------------------- | -| **Port:** 50007 | -| **Developer:** @floriaaan | -| **Status:** In progress | -| **Last update:** 2023-05-10 | -| **Language:** NodeJS | -| **Dependencies:** TypeScript, gRPC, MongoDB, AMQP | -| **Models:** | +| Informations | +| -------------------------------------------------- | +| **Port:** 50007 | +| **Developer:** @floriaaan | +| **Status:** In progress | +| **Last update:** 2023-05-10 | +| **Language:** NodeJS | +| **Dependencies:** TypeScript, gRPC, Postgres, AMQP | +| **Models:** | ## gRPC Methods @@ -28,14 +28,14 @@ The service provides the following gRPC methods: To run this microservice, you will need to have the following installed on your system: - NodeJS (v18.12.0 or higher) (dev. with v18.12.0) -- MongoDB (dev. with mongoDB Atlas) +- Postgres (v15.2 or higher) (dev. with docker image `postgres:15.2`) You can use the following tools to help you with the setup: - You can use nvm to set your Node version using: - `nvm use`. -- You can use docker to run your MongoDB server using: - - `docker run -d -e MONGO_INITDB_ROOT_USERNAME=user -e MONGO_INITDB_ROOT_PASSWORD=pass -p 27017:27017 --name mongodb mongo --replSet rs0` +- You can use docker to run your Postgres database using: + - `docker run --name postgres -p 5432:5432 -e POSTGRES_PASSWORD=password -d postgres` - You can use docker to run your RabbitMQ server using: - `docker run --name rabbitmq -p 5672:5672 -p 15672:15672 -d rabbitmq:3-management` diff --git a/services/order/prisma/migrations/20230706080642_init_database/migration.sql b/services/order/prisma/migrations/20230706080642_init_database/migration.sql new file mode 100644 index 00000000..6113684d --- /dev/null +++ b/services/order/prisma/migrations/20230706080642_init_database/migration.sql @@ -0,0 +1,47 @@ +-- CreateEnum +CREATE TYPE "Status" AS ENUM ('PENDING', 'IN_PROGRESS', 'FULFILLED', 'REJECTED'); + +-- CreateTable +CREATE TABLE "UserMinimum" ( + "_id" TEXT NOT NULL, + "first_name" TEXT NOT NULL, + "last_name" TEXT NOT NULL, + "email" TEXT NOT NULL, + "phone" TEXT NOT NULL, + + CONSTRAINT "UserMinimum_pkey" PRIMARY KEY ("_id") +); + +-- CreateTable +CREATE TABLE "Basket" ( + "_id" TEXT NOT NULL, + "json" JSONB, + "string" TEXT NOT NULL, + "total" DOUBLE PRECISION NOT NULL, + + CONSTRAINT "Basket_pkey" PRIMARY KEY ("_id") +); + +-- CreateTable +CREATE TABLE "Order" ( + "_id" TEXT NOT NULL, + "payment_id" TEXT NOT NULL, + "delivery_id" TEXT NOT NULL, + "status" "Status" NOT NULL DEFAULT 'PENDING', + "user_id" TEXT NOT NULL, + "basket_snapshot_id" TEXT NOT NULL, + "restaurant_id" TEXT NOT NULL, + "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updated_at" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "Order_pkey" PRIMARY KEY ("_id") +); + +-- CreateIndex +CREATE UNIQUE INDEX "Order_basket_snapshot_id_key" ON "Order"("basket_snapshot_id"); + +-- AddForeignKey +ALTER TABLE "Order" ADD CONSTRAINT "Order_user_id_fkey" FOREIGN KEY ("user_id") REFERENCES "UserMinimum"("_id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "Order" ADD CONSTRAINT "Order_basket_snapshot_id_fkey" FOREIGN KEY ("basket_snapshot_id") REFERENCES "Basket"("_id") ON DELETE RESTRICT ON UPDATE CASCADE; diff --git a/services/order/prisma/migrations/migration_lock.toml b/services/order/prisma/migrations/migration_lock.toml new file mode 100644 index 00000000..fbffa92c --- /dev/null +++ b/services/order/prisma/migrations/migration_lock.toml @@ -0,0 +1,3 @@ +# Please do not edit this file manually +# It should be added in your version-control system (i.e. Git) +provider = "postgresql" \ No newline at end of file diff --git a/services/order/prisma/schema.prisma b/services/order/prisma/schema.prisma index 4f9d6ee9..9c7a5f9a 100644 --- a/services/order/prisma/schema.prisma +++ b/services/order/prisma/schema.prisma @@ -1,5 +1,5 @@ datasource db { - provider = "mongodb" + provider = "postgresql" url = env("DATABASE_URL") } From f43b355b3c1e71e1553a8a1d3045c46bb6647120 Mon Sep 17 00:00:00 2001 From: Florian LEROUX Date: Thu, 6 Jul 2023 10:11:38 +0200 Subject: [PATCH 168/883] feat(reporting): add top5-selling handler --- services/order/src/handlers/order/index.ts | 2 - .../{order => reporting}/affluence.ts | 2 +- .../order/src/handlers/reporting/index.ts | 11 +++++ .../src/handlers/reporting/top5-selling.ts | 44 +++++++++++++++++++ services/order/src/server.ts | 7 ++- services/order/src/types/order.d.ts | 16 +------ services/order/src/types/reporting.d.ts | 26 +++++++++++ services/proto/order.proto | 20 ++++++++- 8 files changed, 107 insertions(+), 21 deletions(-) rename services/order/src/handlers/{order => reporting}/affluence.ts (97%) create mode 100644 services/order/src/handlers/reporting/index.ts create mode 100644 services/order/src/handlers/reporting/top5-selling.ts create mode 100644 services/order/src/types/reporting.d.ts diff --git a/services/order/src/handlers/order/index.ts b/services/order/src/handlers/order/index.ts index 338cfeed..8484eadf 100644 --- a/services/order/src/handlers/order/index.ts +++ b/services/order/src/handlers/order/index.ts @@ -10,7 +10,6 @@ import { GetOrderByDelivery } from "@order/handlers/order/get-delivery"; import { GetOrderByPayment } from "@order/handlers/order/get-payment"; import { GetOrdersByStatus } from "@order/handlers/order/get-status"; -import { GetOrdersAffluence } from "@order/handlers/order/affluence"; const orderHandlers: UntypedServiceImplementation = { CreateOrder, @@ -23,7 +22,6 @@ const orderHandlers: UntypedServiceImplementation = { GetOrderByPayment, GetOrdersByStatus, - GetOrdersAffluence, }; export default orderHandlers; diff --git a/services/order/src/handlers/order/affluence.ts b/services/order/src/handlers/reporting/affluence.ts similarity index 97% rename from services/order/src/handlers/order/affluence.ts rename to services/order/src/handlers/reporting/affluence.ts index 5faad9d8..b6829daf 100644 --- a/services/order/src/handlers/order/affluence.ts +++ b/services/order/src/handlers/reporting/affluence.ts @@ -3,7 +3,7 @@ import { log } from "@order/lib/log"; import { GetOrdersAffluenceRequest, GetOrdersAffluenceResponse, -} from "@order/types/order"; +} from "@order/types/reporting"; import { Data } from "@order/types"; export const GetOrdersAffluence = async ( diff --git a/services/order/src/handlers/reporting/index.ts b/services/order/src/handlers/reporting/index.ts new file mode 100644 index 00000000..c41498b1 --- /dev/null +++ b/services/order/src/handlers/reporting/index.ts @@ -0,0 +1,11 @@ +import { UntypedServiceImplementation } from "@grpc/grpc-js"; + +import { GetOrdersAffluence } from "@order/handlers/reporting/affluence"; +import { GetTop5SellingProducts } from "@order/handlers/reporting/top5-selling"; + +const reportingHandlers: UntypedServiceImplementation = { + GetOrdersAffluence, + GetTop5SellingProducts +}; + +export default reportingHandlers; diff --git a/services/order/src/handlers/reporting/top5-selling.ts b/services/order/src/handlers/reporting/top5-selling.ts new file mode 100644 index 00000000..777975a6 --- /dev/null +++ b/services/order/src/handlers/reporting/top5-selling.ts @@ -0,0 +1,44 @@ +import { prisma } from "@order/lib/prisma"; +import { log } from "@order/lib/log"; +import { + GetTop5SellingProductsRequest, + GetTop5SellingProductsResponse, +} from "@order/types/reporting"; +import { Data } from "@order/types"; + +const HOUR_IN_MS = 60 * 60 * 1000; +const DAY_IN_MS = 24 * HOUR_IN_MS; + +export const GetTop5SellingProducts = async ( + { request }: Data, + callback: (err: any, response: GetTop5SellingProductsResponse | null) => void +) => { + try { + const { date, restaurant_id, interval } = request; + + const end = date + ? new Date(date + " 23:59:59") + : new Date(new Date().setHours(23, 59, 59, 999)); + + const start = // end - interval + interval === "1w" + ? new Date(end.getTime() - 7 * DAY_IN_MS) + : interval === "1m" + ? new Date(end.getTime() - 30 * DAY_IN_MS) + : interval === "1y" + ? new Date(end.getTime() - 365 * DAY_IN_MS) + : // default to 1w + new Date(end.getTime() - 7 * DAY_IN_MS); + + const orders = await prisma.order.findMany({ + where: { restaurant_id, created_at: { gte: start, lte: end } }, + }); + + callback(null, { + products: [], + }); + } catch (error) { + log.error(error); + callback(error, null); + } +}; diff --git a/services/order/src/server.ts b/services/order/src/server.ts index 65de37ed..14807759 100644 --- a/services/order/src/server.ts +++ b/services/order/src/server.ts @@ -11,6 +11,7 @@ import { addReflection } from "@order/lib/reflection"; import { createServerProxy } from "@order/lib/proxy"; import { logGRPC } from "@order/middleware/log"; import orderHandlers from "@order/handlers/order"; +import reportingHandlers from "@order/handlers/reporting"; const PORT = process.env.PORT || 50007; const ADDRESS = `0.0.0.0:${PORT}`; @@ -22,12 +23,14 @@ const REFLECTION_PATH = resolvePath( const packageDefinition = loadSync(PROTO_PATH, options); const grpc = loadPackageDefinition(packageDefinition) as any; -const { service } = grpc.com.goodfood.order.OrderService; +const { service: o_srv } = grpc.com.goodfood.order.OrderService; +const { service: r_srv } = grpc.com.goodfood.order.OrderReportingService; // const server = new Server(); const server = createServerProxy(new Server()); -server.addService(service, orderHandlers); +server.addService(o_srv, orderHandlers); +server.addService(r_srv, reportingHandlers); server.use(logGRPC); server.bindAsync(ADDRESS, serverInsecure, () => { diff --git a/services/order/src/types/order.d.ts b/services/order/src/types/order.d.ts index 6697479c..b7f16540 100644 --- a/services/order/src/types/order.d.ts +++ b/services/order/src/types/order.d.ts @@ -77,18 +77,4 @@ export type DeleteOrderResponse = { export type ExtendedOrder = Order & { user: UserMinimum; basket_snapshot: Basket; -}; - -export type GetOrdersAffluenceRequest = { - date: string; - restaurant_id: string; -}; - -export type GetOrdersAffluenceResponse = { - average: number; - total: number; - min: number; - max: number; - - orders_per_hour: number[]; -}; +}; \ No newline at end of file diff --git a/services/order/src/types/reporting.d.ts b/services/order/src/types/reporting.d.ts new file mode 100644 index 00000000..eb751043 --- /dev/null +++ b/services/order/src/types/reporting.d.ts @@ -0,0 +1,26 @@ +export type GetOrdersAffluenceRequest = { + date: string; + restaurant_id: string; +}; + +export type GetOrdersAffluenceResponse = { + average: number; + total: number; + min: number; + max: number; + + orders_per_hour: number[]; +}; + +export type GetTop5SellingProductsRequest = { + date?: string; + interval: "1w" | "1m" | "1y"; + restaurant_id: string; +}; + +export type GetTop5SellingProductsResponse = { + products: { + id: string; + count: number; + }[]; +}; diff --git a/services/proto/order.proto b/services/proto/order.proto index b77b7adb..21f6eec3 100644 --- a/services/proto/order.proto +++ b/services/proto/order.proto @@ -51,8 +51,11 @@ service OrderService { rpc UpdateOrder(UpdateOrderRequest) returns (Order) {} rpc DeleteOrder(DeleteOrderRequest) returns (DeleteOrderResponse) {} - // reporting-related +} + +service OrderReportingService { rpc GetOrdersAffluence(GetOrdersAffluenceRequest) returns (GetOrdersAffluenceResponse) {} + rpc GetTop5SellingProducts(GetTop5SellingProductsRequest) returns (GetTop5SellingProductsResponse) {} } message GetOrderRequest { @@ -127,3 +130,18 @@ message GetOrdersAffluenceResponse { repeated int32 orders_per_hour = 5; } + +message GetTop5SellingProductsRequest { + optional string date = 1; + string interval = 2; + string restaurant_id = 3; +} + +message GetTop5SellingProductsResponse { + repeated ProductCount products_count = 1; +} + +message ProductCount { + string id = 1; + int32 count = 2; +} \ No newline at end of file From 14f9988cd828da09bb0fdc7f3b82f634441cbed5 Mon Sep 17 00:00:00 2001 From: anatole Date: Thu, 6 Jul 2023 10:39:38 +0200 Subject: [PATCH 169/883] feat(user service): fix getUser route --- services/user/src/pkg/services/user.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/user/src/pkg/services/user.go b/services/user/src/pkg/services/user.go index 4280e934..e73e49cf 100644 --- a/services/user/src/pkg/services/user.go +++ b/services/user/src/pkg/services/user.go @@ -12,7 +12,7 @@ import ( func (s *Server) GetUser(_ context.Context, req *pb.UserId) (*pb.UserOutput, error) { var user *models.User - if result := s.H.DB.Where("id = ?", req.Id).Preload("Role").Preload("MainAddress").Find(&user); result.Error != nil { + if result := s.H.DB.Where("id = ?", req.Id).Preload("Role").Preload("MainAddress").First(&user); result.Error != nil { return &pb.UserOutput{ Error: result.Error.Error(), }, nil From f41bdd70fce40fa99542885b510c48db0e0a2c8c Mon Sep 17 00:00:00 2001 From: Florian LEROUX Date: Thu, 6 Jul 2023 10:48:51 +0200 Subject: [PATCH 170/883] feat(reporting): add implementation for top5 selling handler --- services/order/prisma/seed.ts | 46 +++++++++++++++---- .../src/handlers/reporting/top5-selling.ts | 22 ++++++++- services/order/src/types/reporting.d.ts | 10 ++-- 3 files changed, 64 insertions(+), 14 deletions(-) diff --git a/services/order/prisma/seed.ts b/services/order/prisma/seed.ts index d7f2ce15..3de73287 100644 --- a/services/order/prisma/seed.ts +++ b/services/order/prisma/seed.ts @@ -21,9 +21,23 @@ const orders: Prisma.OrderCreateInput[] = [ }, basket_snapshot: { create: { - json: {}, - string: JSON.stringify({}), - total: 0, + json: { + "product_id:1": { count: 1, price: 15 }, + "product_id:2": { count: 2, price: 10 }, + "product_id:3": { count: 4, price: 15 }, + "product_id:4": { count: 6, price: 15 }, + "product_id:5": { count: 1, price: 15 }, + "product_id:6": { count: 1, price: 15 }, + }, + string: JSON.stringify({ + "product_id:1": { count: 1, price: 15 }, + "product_id:2": { count: 2, price: 10 }, + "product_id:3": { count: 4, price: 15 }, + "product_id:4": { count: 6, price: 15 }, + "product_id:5": { count: 1, price: 15 }, + "product_id:6": { count: 1, price: 15 }, + }), + total: 35, }, }, status: Status.PENDING, @@ -48,9 +62,15 @@ const orders: Prisma.OrderCreateInput[] = [ }, basket_snapshot: { create: { - json: {}, - string: JSON.stringify({}), - total: 0, + json: { + "product_id:1": { count: 1, price: 15 }, + "product_id:3": { count: 4, price: 5 }, + }, + string: JSON.stringify({ + "product_id:1": { count: 1, price: 15 }, + "product_id:3": { count: 4, price: 5 }, + }), + total: 35, }, }, status: Status.FULFILLED, @@ -75,9 +95,17 @@ const orders: Prisma.OrderCreateInput[] = [ }, basket_snapshot: { create: { - json: {}, - string: JSON.stringify({}), - total: 0, + json: { + "product_id:1": { count: 1, price: 15 }, + "product_id:2": { count: 6, price: 15 }, + "product_id:3": { count: 4, price: 15 }, + }, + string: JSON.stringify({ + "product_id:1": { count: 1, price: 15 }, + "product_id:2": { count: 6, price: 15 }, + "product_id:3": { count: 4, price: 15 }, + }), + total: 15, }, }, status: Status.PENDING, diff --git a/services/order/src/handlers/reporting/top5-selling.ts b/services/order/src/handlers/reporting/top5-selling.ts index 777975a6..5f9b46a2 100644 --- a/services/order/src/handlers/reporting/top5-selling.ts +++ b/services/order/src/handlers/reporting/top5-selling.ts @@ -3,6 +3,7 @@ import { log } from "@order/lib/log"; import { GetTop5SellingProductsRequest, GetTop5SellingProductsResponse, + ProductCount, } from "@order/types/reporting"; import { Data } from "@order/types"; @@ -32,10 +33,29 @@ export const GetTop5SellingProducts = async ( const orders = await prisma.order.findMany({ where: { restaurant_id, created_at: { gte: start, lte: end } }, + include: { basket_snapshot: true }, }); + const products_count = orders + .reduce((acc, order) => { + const { json } = order.basket_snapshot as unknown as { + json: { [key: string]: { count: number; price: number } }; + }; + Object.entries(json).forEach(([product_id, { count }]) => { + const product = acc.find((p) => p.id === product_id); + if (product) { + product.count += count; + acc.filter((p) => p.id !== product_id).push(product); + } else acc.push({ id: product_id, count }); + }); + return acc; + }, [] as ProductCount[]) + .sort((a, b) => b.count - a.count) + .slice(0, 5); + + callback(null, { - products: [], + products_count, }); } catch (error) { log.error(error); diff --git a/services/order/src/types/reporting.d.ts b/services/order/src/types/reporting.d.ts index eb751043..7f332dcd 100644 --- a/services/order/src/types/reporting.d.ts +++ b/services/order/src/types/reporting.d.ts @@ -18,9 +18,11 @@ export type GetTop5SellingProductsRequest = { restaurant_id: string; }; +export type ProductCount = { + id: string; + count: number; +}; + export type GetTop5SellingProductsResponse = { - products: { - id: string; - count: number; - }[]; + products_count: ProductCount[]; }; From 4a778edf5e030cf09d46283619a9212bad5a2e62 Mon Sep 17 00:00:00 2001 From: Pierre Lebigre Date: Thu, 6 Jul 2023 11:02:09 +0200 Subject: [PATCH 171/883] Fix terraform --- services/product/.gitignore | 39 +- services/product/README.md | 20 +- services/product/package-lock.json | 390 ++++++++++++++++++ services/product/package.json | 1 + services/product/pnpm-lock.yaml | 230 +++++++++++ .../20230706073939_init/migration.sql | 8 + services/product/src/handler/Image/index.ts | 5 + services/product/src/lib/storage.ts | 6 +- services/product/src/middleware/log.ts | 3 +- .../product/terraform/.terraform.lock.hcl | 22 + services/product/terraform/data.tf | 71 ++-- services/product/terraform/main.tf | 85 ++-- services/product/terraform/outputs.tf | 22 +- services/product/terraform/tf.plan | Bin 0 -> 15671 bytes "services/product/terraform/tf.plan\n" | Bin 0 -> 14515 bytes services/product/terraform/variables.tf | 7 +- 16 files changed, 801 insertions(+), 108 deletions(-) create mode 100644 services/product/prisma/migrations/20230706073939_init/migration.sql create mode 100644 services/product/src/handler/Image/index.ts create mode 100644 services/product/terraform/.terraform.lock.hcl create mode 100644 services/product/terraform/tf.plan create mode 100644 "services/product/terraform/tf.plan\n" diff --git a/services/product/.gitignore b/services/product/.gitignore index 3502ef7f..660757fd 100644 --- a/services/product/.gitignore +++ b/services/product/.gitignore @@ -1,6 +1,3 @@ -# Created by https://www.toptal.com/developers/gitignore/api/node -# Edit at https://www.toptal.com/developers/gitignore?templates=node - ### Node ### # Logs logs @@ -141,4 +138,38 @@ dist # SvelteKit build / generate output .svelte-kit -# End of https://www.toptal.com/developers/gitignore/api/node +### Terraform ### +# Local .terraform directories +**/.terraform/* + +# .tfstate files +*.tfstate +*.tfstate.* + +# Crash log files +crash.log +crash.*.log + +# Exclude all .tfvars files, which are likely to contain sensitive data, such as +# password, private keys, and other secrets. These should not be part of version +# control as they are data points which are potentially sensitive and subject +# to change depending on the environment. +*.tfvars +*.tfvars.json + +# Ignore override files as they are usually used to override resources locally and so +# are not checked in +override.tf +override.tf.json +*_override.tf +*_override.tf.json + +# Include override files you do wish to add to version control using negated pattern +# !example_override.tf + +# Include tfplan files to ignore the plan output of command: terraform plan -out=tfplan +# example: *tfplan* + +# Ignore CLI configuration files +.terraformrc +terraform.rc \ No newline at end of file diff --git a/services/product/README.md b/services/product/README.md index 830b1483..933e23a9 100644 --- a/services/product/README.md +++ b/services/product/README.md @@ -76,10 +76,28 @@ npx prisma migrate dev --name init When `npx prisma migrate dev` is executed against a newly created database, seeding is also triggered. The seed file in [`prisma/seed.ts`](./prisma/seed.ts) will be executed and your database will be populated with the sample data. -## Build and Run with Docker +## Build and Run on azure ### Build +Connect to your azure acount. +``` +az login +``` + +Go in the (./terraform) then plan and apply your terraform. When it's done export your output in the app's .env file. +``` +terraform plan -out="tf.plan" +terraform apply "tf.plan" +terraform output > ../.env +``` + +Check if the AMQP_URL value is good. +Then go to ./prisma to migrate your table schema in your azure database. +``` +npx prisma migrate dev --name init +``` + To build the image you need to be in the **parent folder** of the service you want to build. Then run the following command: diff --git a/services/product/package-lock.json b/services/product/package-lock.json index 30bd75fa..09d48637 100644 --- a/services/product/package-lock.json +++ b/services/product/package-lock.json @@ -25,6 +25,7 @@ "devDependencies": { "@types/amqplib": "^0.10.1", "@types/node": "^18.16.7", + "esbuild": "^0.18.11", "prisma": "^4.11.0", "ts-node": "^10.9.1", "tsconfig-paths": "^4.2.0", @@ -244,6 +245,358 @@ "@jridgewell/sourcemap-codec": "^1.4.10" } }, + "node_modules/@esbuild/android-arm": { + "version": "0.18.11", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.11.tgz", + "integrity": "sha512-q4qlUf5ucwbUJZXF5tEQ8LF7y0Nk4P58hOsGk3ucY0oCwgQqAnqXVbUuahCddVHfrxmpyewRpiTHwVHIETYu7Q==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.18.11", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.11.tgz", + "integrity": "sha512-snieiq75Z1z5LJX9cduSAjUr7vEI1OdlzFPMw0HH5YI7qQHDd3qs+WZoMrWYDsfRJSq36lIA6mfZBkvL46KoIw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.18.11", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.11.tgz", + "integrity": "sha512-iPuoxQEV34+hTF6FT7om+Qwziv1U519lEOvekXO9zaMMlT9+XneAhKL32DW3H7okrCOBQ44BMihE8dclbZtTuw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.18.11", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.11.tgz", + "integrity": "sha512-Gm0QkI3k402OpfMKyQEEMG0RuW2LQsSmI6OeO4El2ojJMoF5NLYb3qMIjvbG/lbMeLOGiW6ooU8xqc+S0fgz2w==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.18.11", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.11.tgz", + "integrity": "sha512-N15Vzy0YNHu6cfyDOjiyfJlRJCB/ngKOAvoBf1qybG3eOq0SL2Lutzz9N7DYUbb7Q23XtHPn6lMDF6uWbGv9Fw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.18.11", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.11.tgz", + "integrity": "sha512-atEyuq6a3omEY5qAh5jIORWk8MzFnCpSTUruBgeyN9jZq1K/QI9uke0ATi3MHu4L8c59CnIi4+1jDKMuqmR71A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.18.11", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.11.tgz", + "integrity": "sha512-XtuPrEfBj/YYYnAAB7KcorzzpGTvOr/dTtXPGesRfmflqhA4LMF0Gh/n5+a9JBzPuJ+CGk17CA++Hmr1F/gI0Q==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.18.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.11.tgz", + "integrity": "sha512-Idipz+Taso/toi2ETugShXjQ3S59b6m62KmLHkJlSq/cBejixmIydqrtM2XTvNCywFl3VC7SreSf6NV0i6sRyg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.18.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.11.tgz", + "integrity": "sha512-c6Vh2WS9VFKxKZ2TvJdA7gdy0n6eSy+yunBvv4aqNCEhSWVor1TU43wNRp2YLO9Vng2G+W94aRz+ILDSwAiYog==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.18.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.11.tgz", + "integrity": "sha512-S3hkIF6KUqRh9n1Q0dSyYcWmcVa9Cg+mSoZEfFuzoYXXsk6196qndrM+ZiHNwpZKi3XOXpShZZ+9dfN5ykqjjw==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.18.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.11.tgz", + "integrity": "sha512-MRESANOoObQINBA+RMZW+Z0TJWpibtE7cPFnahzyQHDCA9X9LOmGh68MVimZlM9J8n5Ia8lU773te6O3ILW8kw==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.18.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.11.tgz", + "integrity": "sha512-qVyPIZrXNMOLYegtD1u8EBccCrBVshxMrn5MkuFc3mEVsw7CCQHaqZ4jm9hbn4gWY95XFnb7i4SsT3eflxZsUg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.18.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.11.tgz", + "integrity": "sha512-T3yd8vJXfPirZaUOoA9D2ZjxZX4Gr3QuC3GztBJA6PklLotc/7sXTOuuRkhE9W/5JvJP/K9b99ayPNAD+R+4qQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.18.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.11.tgz", + "integrity": "sha512-evUoRPWiwuFk++snjH9e2cAjF5VVSTj+Dnf+rkO/Q20tRqv+644279TZlPK8nUGunjPAtQRCj1jQkDAvL6rm2w==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.18.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.11.tgz", + "integrity": "sha512-/SlRJ15XR6i93gRWquRxYCfhTeC5PdqEapKoLbX63PLCmAkXZHY2uQm2l9bN0oPHBsOw2IswRZctMYS0MijFcg==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.18.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.11.tgz", + "integrity": "sha512-xcncej+wF16WEmIwPtCHi0qmx1FweBqgsRtEL1mSHLFR6/mb3GEZfLQnx+pUDfRDEM4DQF8dpXIW7eDOZl1IbA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.18.11", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.11.tgz", + "integrity": "sha512-aSjMHj/F7BuS1CptSXNg6S3M4F3bLp5wfFPIJM+Km2NfIVfFKhdmfHF9frhiCLIGVzDziggqWll0B+9AUbud/Q==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.18.11", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.11.tgz", + "integrity": "sha512-tNBq+6XIBZtht0xJGv7IBB5XaSyvYPCm1PxJ33zLQONdZoLVM0bgGqUrXnJyiEguD9LU4AHiu+GCXy/Hm9LsdQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.18.11", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.11.tgz", + "integrity": "sha512-kxfbDOrH4dHuAAOhr7D7EqaYf+W45LsAOOhAet99EyuxxQmjbk8M9N4ezHcEiCYPaiW8Dj3K26Z2V17Gt6p3ng==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.18.11", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.11.tgz", + "integrity": "sha512-Sh0dDRyk1Xi348idbal7lZyfSkjhJsdFeuC13zqdipsvMetlGiFQNdO+Yfp6f6B4FbyQm7qsk16yaZk25LChzg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.18.11", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.11.tgz", + "integrity": "sha512-o9JUIKF1j0rqJTFbIoF4bXj6rvrTZYOrfRcGyL0Vm5uJ/j5CkBD/51tpdxe9lXEDouhRgdr/BYzUrDOvrWwJpg==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.18.11", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.11.tgz", + "integrity": "sha512-rQI4cjLHd2hGsM1LqgDI7oOCYbQ6IBOVsX9ejuRMSze0GqXUG2ekwiKkiBU1pRGSeCqFFHxTrcEydB2Hyoz9CA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, "node_modules/@grpc/grpc-js": { "version": "1.8.14", "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.8.14.tgz", @@ -1154,6 +1507,43 @@ "once": "^1.4.0" } }, + "node_modules/esbuild": { + "version": "0.18.11", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.11.tgz", + "integrity": "sha512-i8u6mQF0JKJUlGR3OdFLKldJQMMs8OqM9Cc3UCi9XXziJ9WERM5bfkHaEAy0YAvPRMgqSW55W7xYn84XtEFTtA==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.18.11", + "@esbuild/android-arm64": "0.18.11", + "@esbuild/android-x64": "0.18.11", + "@esbuild/darwin-arm64": "0.18.11", + "@esbuild/darwin-x64": "0.18.11", + "@esbuild/freebsd-arm64": "0.18.11", + "@esbuild/freebsd-x64": "0.18.11", + "@esbuild/linux-arm": "0.18.11", + "@esbuild/linux-arm64": "0.18.11", + "@esbuild/linux-ia32": "0.18.11", + "@esbuild/linux-loong64": "0.18.11", + "@esbuild/linux-mips64el": "0.18.11", + "@esbuild/linux-ppc64": "0.18.11", + "@esbuild/linux-riscv64": "0.18.11", + "@esbuild/linux-s390x": "0.18.11", + "@esbuild/linux-x64": "0.18.11", + "@esbuild/netbsd-x64": "0.18.11", + "@esbuild/openbsd-x64": "0.18.11", + "@esbuild/sunos-x64": "0.18.11", + "@esbuild/win32-arm64": "0.18.11", + "@esbuild/win32-ia32": "0.18.11", + "@esbuild/win32-x64": "0.18.11" + } + }, "node_modules/escalade": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", diff --git a/services/product/package.json b/services/product/package.json index 4df44b8e..195f1f65 100644 --- a/services/product/package.json +++ b/services/product/package.json @@ -14,6 +14,7 @@ "devDependencies": { "@types/amqplib": "^0.10.1", "@types/node": "^18.16.7", + "esbuild": "^0.18.11", "prisma": "^4.11.0", "ts-node": "^10.9.1", "tsconfig-paths": "^4.2.0", diff --git a/services/product/pnpm-lock.yaml b/services/product/pnpm-lock.yaml index 67605480..57560425 100644 --- a/services/product/pnpm-lock.yaml +++ b/services/product/pnpm-lock.yaml @@ -9,6 +9,7 @@ specifiers: '@types/node': ^18.16.7 amqplib: ^0.10.3 base64-arraybuffer: ^1.0.2 + esbuild: ^0.18.11 express: ^4.18.2 nodemon: ^2.0.22 pkg: ^5.8.1 @@ -35,6 +36,7 @@ dependencies: devDependencies: '@types/amqplib': 0.10.1 '@types/node': 18.16.19 + esbuild: 0.18.11 prisma: 4.11.0 ts-node: 10.9.1_3n2f44gk7n7p32zpas3y4w4iqy tsconfig-paths: 4.2.0 @@ -189,6 +191,204 @@ packages: '@jridgewell/trace-mapping': 0.3.9 dev: true + /@esbuild/android-arm/0.18.11: + resolution: {integrity: sha512-q4qlUf5ucwbUJZXF5tEQ8LF7y0Nk4P58hOsGk3ucY0oCwgQqAnqXVbUuahCddVHfrxmpyewRpiTHwVHIETYu7Q==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-arm64/0.18.11: + resolution: {integrity: sha512-snieiq75Z1z5LJX9cduSAjUr7vEI1OdlzFPMw0HH5YI7qQHDd3qs+WZoMrWYDsfRJSq36lIA6mfZBkvL46KoIw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-x64/0.18.11: + resolution: {integrity: sha512-iPuoxQEV34+hTF6FT7om+Qwziv1U519lEOvekXO9zaMMlT9+XneAhKL32DW3H7okrCOBQ44BMihE8dclbZtTuw==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-arm64/0.18.11: + resolution: {integrity: sha512-Gm0QkI3k402OpfMKyQEEMG0RuW2LQsSmI6OeO4El2ojJMoF5NLYb3qMIjvbG/lbMeLOGiW6ooU8xqc+S0fgz2w==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-x64/0.18.11: + resolution: {integrity: sha512-N15Vzy0YNHu6cfyDOjiyfJlRJCB/ngKOAvoBf1qybG3eOq0SL2Lutzz9N7DYUbb7Q23XtHPn6lMDF6uWbGv9Fw==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-arm64/0.18.11: + resolution: {integrity: sha512-atEyuq6a3omEY5qAh5jIORWk8MzFnCpSTUruBgeyN9jZq1K/QI9uke0ATi3MHu4L8c59CnIi4+1jDKMuqmR71A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-x64/0.18.11: + resolution: {integrity: sha512-XtuPrEfBj/YYYnAAB7KcorzzpGTvOr/dTtXPGesRfmflqhA4LMF0Gh/n5+a9JBzPuJ+CGk17CA++Hmr1F/gI0Q==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm/0.18.11: + resolution: {integrity: sha512-Idipz+Taso/toi2ETugShXjQ3S59b6m62KmLHkJlSq/cBejixmIydqrtM2XTvNCywFl3VC7SreSf6NV0i6sRyg==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm64/0.18.11: + resolution: {integrity: sha512-c6Vh2WS9VFKxKZ2TvJdA7gdy0n6eSy+yunBvv4aqNCEhSWVor1TU43wNRp2YLO9Vng2G+W94aRz+ILDSwAiYog==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ia32/0.18.11: + resolution: {integrity: sha512-S3hkIF6KUqRh9n1Q0dSyYcWmcVa9Cg+mSoZEfFuzoYXXsk6196qndrM+ZiHNwpZKi3XOXpShZZ+9dfN5ykqjjw==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-loong64/0.18.11: + resolution: {integrity: sha512-MRESANOoObQINBA+RMZW+Z0TJWpibtE7cPFnahzyQHDCA9X9LOmGh68MVimZlM9J8n5Ia8lU773te6O3ILW8kw==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-mips64el/0.18.11: + resolution: {integrity: sha512-qVyPIZrXNMOLYegtD1u8EBccCrBVshxMrn5MkuFc3mEVsw7CCQHaqZ4jm9hbn4gWY95XFnb7i4SsT3eflxZsUg==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ppc64/0.18.11: + resolution: {integrity: sha512-T3yd8vJXfPirZaUOoA9D2ZjxZX4Gr3QuC3GztBJA6PklLotc/7sXTOuuRkhE9W/5JvJP/K9b99ayPNAD+R+4qQ==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-riscv64/0.18.11: + resolution: {integrity: sha512-evUoRPWiwuFk++snjH9e2cAjF5VVSTj+Dnf+rkO/Q20tRqv+644279TZlPK8nUGunjPAtQRCj1jQkDAvL6rm2w==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-s390x/0.18.11: + resolution: {integrity: sha512-/SlRJ15XR6i93gRWquRxYCfhTeC5PdqEapKoLbX63PLCmAkXZHY2uQm2l9bN0oPHBsOw2IswRZctMYS0MijFcg==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-x64/0.18.11: + resolution: {integrity: sha512-xcncej+wF16WEmIwPtCHi0qmx1FweBqgsRtEL1mSHLFR6/mb3GEZfLQnx+pUDfRDEM4DQF8dpXIW7eDOZl1IbA==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/netbsd-x64/0.18.11: + resolution: {integrity: sha512-aSjMHj/F7BuS1CptSXNg6S3M4F3bLp5wfFPIJM+Km2NfIVfFKhdmfHF9frhiCLIGVzDziggqWll0B+9AUbud/Q==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/openbsd-x64/0.18.11: + resolution: {integrity: sha512-tNBq+6XIBZtht0xJGv7IBB5XaSyvYPCm1PxJ33zLQONdZoLVM0bgGqUrXnJyiEguD9LU4AHiu+GCXy/Hm9LsdQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/sunos-x64/0.18.11: + resolution: {integrity: sha512-kxfbDOrH4dHuAAOhr7D7EqaYf+W45LsAOOhAet99EyuxxQmjbk8M9N4ezHcEiCYPaiW8Dj3K26Z2V17Gt6p3ng==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-arm64/0.18.11: + resolution: {integrity: sha512-Sh0dDRyk1Xi348idbal7lZyfSkjhJsdFeuC13zqdipsvMetlGiFQNdO+Yfp6f6B4FbyQm7qsk16yaZk25LChzg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-ia32/0.18.11: + resolution: {integrity: sha512-o9JUIKF1j0rqJTFbIoF4bXj6rvrTZYOrfRcGyL0Vm5uJ/j5CkBD/51tpdxe9lXEDouhRgdr/BYzUrDOvrWwJpg==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-x64/0.18.11: + resolution: {integrity: sha512-rQI4cjLHd2hGsM1LqgDI7oOCYbQ6IBOVsX9ejuRMSze0GqXUG2ekwiKkiBU1pRGSeCqFFHxTrcEydB2Hyoz9CA==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + /@grpc/grpc-js/1.8.14: resolution: {integrity: sha512-w84maJ6CKl5aApCMzFll0hxtFNT6or9WwMslobKaqWUEf1K+zhlL43bSQhFreyYWIWR+Z0xnVFC1KtLm4ZpM/A==} engines: {node: ^8.13.0 || >=10.10.0} @@ -737,6 +937,36 @@ packages: once: 1.4.0 dev: false + /esbuild/0.18.11: + resolution: {integrity: sha512-i8u6mQF0JKJUlGR3OdFLKldJQMMs8OqM9Cc3UCi9XXziJ9WERM5bfkHaEAy0YAvPRMgqSW55W7xYn84XtEFTtA==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/android-arm': 0.18.11 + '@esbuild/android-arm64': 0.18.11 + '@esbuild/android-x64': 0.18.11 + '@esbuild/darwin-arm64': 0.18.11 + '@esbuild/darwin-x64': 0.18.11 + '@esbuild/freebsd-arm64': 0.18.11 + '@esbuild/freebsd-x64': 0.18.11 + '@esbuild/linux-arm': 0.18.11 + '@esbuild/linux-arm64': 0.18.11 + '@esbuild/linux-ia32': 0.18.11 + '@esbuild/linux-loong64': 0.18.11 + '@esbuild/linux-mips64el': 0.18.11 + '@esbuild/linux-ppc64': 0.18.11 + '@esbuild/linux-riscv64': 0.18.11 + '@esbuild/linux-s390x': 0.18.11 + '@esbuild/linux-x64': 0.18.11 + '@esbuild/netbsd-x64': 0.18.11 + '@esbuild/openbsd-x64': 0.18.11 + '@esbuild/sunos-x64': 0.18.11 + '@esbuild/win32-arm64': 0.18.11 + '@esbuild/win32-ia32': 0.18.11 + '@esbuild/win32-x64': 0.18.11 + dev: true + /escalade/3.1.1: resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} engines: {node: '>=6'} diff --git a/services/product/prisma/migrations/20230706073939_init/migration.sql b/services/product/prisma/migrations/20230706073939_init/migration.sql new file mode 100644 index 00000000..7b22ed91 --- /dev/null +++ b/services/product/prisma/migrations/20230706073939_init/migration.sql @@ -0,0 +1,8 @@ +/* + Warnings: + + - A unique constraint covering the columns `[libelle]` on the table `Allergen` will be added. If there are existing duplicate values, this will fail. + +*/ +-- CreateIndex +CREATE UNIQUE INDEX "Allergen_libelle_key" ON "Allergen"("libelle"); diff --git a/services/product/src/handler/Image/index.ts b/services/product/src/handler/Image/index.ts new file mode 100644 index 00000000..e4b03244 --- /dev/null +++ b/services/product/src/handler/Image/index.ts @@ -0,0 +1,5 @@ +import { UploadImage } from "./upload"; + +export default { + UploadImage, +}; \ No newline at end of file diff --git a/services/product/src/lib/storage.ts b/services/product/src/lib/storage.ts index 5db74517..64e0ab55 100644 --- a/services/product/src/lib/storage.ts +++ b/services/product/src/lib/storage.ts @@ -2,9 +2,9 @@ import { BlobServiceClient, ContainerClient } from "@azure/storage-blob"; import { File } from "node:buffer"; -const containerName = 'uploaded'; -const sasToken = process.env.REACT_APP_AZURE_STORAGE_SAS_TOKEN; -const storageAccountName = process.env.REACT_APP_AZURE_STORAGE_RESOURCE_NAME; +const containerName = 'image'; +const sasToken = process.env.AZURE_STORAGE_SAS_TOKEN; +const storageAccountName = process.env.AZURE_STORAGE_RESOURCE_NAME; const uploadUrl = `https://${storageAccountName}.blob.core.windows.net/?${sasToken}`; console.log(uploadUrl); diff --git a/services/product/src/middleware/log.ts b/services/product/src/middleware/log.ts index 130ca96d..9fd255cc 100644 --- a/services/product/src/middleware/log.ts +++ b/services/product/src/middleware/log.ts @@ -35,7 +35,8 @@ export const logGRPC = async (ctx: Context, next: () => Promise) => { const requestAt = new Date(); await next(); const responseAt = new Date(); - const { request, path } = parseContext(ctx); + let { request, path } = parseContext(ctx); + path = path?.split('.').at(-1) || ''; //publish({ request, path }, "log"); log.debug(msg("GRPC", path, requestAt, responseAt), JSON.stringify(request)); }; \ No newline at end of file diff --git a/services/product/terraform/.terraform.lock.hcl b/services/product/terraform/.terraform.lock.hcl new file mode 100644 index 00000000..aaa84b6d --- /dev/null +++ b/services/product/terraform/.terraform.lock.hcl @@ -0,0 +1,22 @@ +# This file is maintained automatically by "terraform init". +# Manual edits may be lost in future updates. + +provider "registry.terraform.io/hashicorp/azurerm" { + version = "3.48.0" + constraints = "3.48.0" + hashes = [ + "h1:5sGcXKelc4o4MnPZfKKs9pd8w969TtlCV+0IZvW58Cs=", + "zh:01bd328009f2803ebc18ac27535e7d1548c735bb5bd02460e471acc835e5dd19", + "zh:070b0bdd5ff27232eec7ef9128fc9bd17e6bdae503ddcc450c944449f3a8d216", + "zh:0a0a0e81f7ab8757aa83876fffbc57328843664900923d8b3c577e7596884726", + "zh:30994e6988c92d90a71b88bff0bbc4fa8f3b48034d18eb068bd5281888304579", + "zh:54dfdbae2bf79f8104ae73e5c6cd94a69d1e6de4345322f6c8eb6affb04a66c5", + "zh:55ba99b32346237435d7212b3f2521952ee67934dd5ee942a51642357b0ad4fc", + "zh:881bc29857511f7eedc3d359a0f2dcca6b526a48f6d54887cafdb25647abd1fd", + "zh:892bfa34b95b6b4b2ced24dc2989edf512b193bd9e5cf121ae47bb9d9e6d0b94", + "zh:c7d2c778b0f251990874ee859b9093fbb4beb9b3968858137da6c5167c797ea9", + "zh:db558aa70b163af44a73fcb1306d0e4dcafcafe585bedb90ef69f063fa9766a3", + "zh:e0ae252b7bea560e05fde09fe632f012430fb91ff9063fce560d997ecdb1cf75", + "zh:f569b65999264a9416862bca5cd2a6177d94ccb0424f3a4ef424428912b9cb3c", + ] +} diff --git a/services/product/terraform/data.tf b/services/product/terraform/data.tf index 5418af3d..85d9e799 100644 --- a/services/product/terraform/data.tf +++ b/services/product/terraform/data.tf @@ -1,54 +1,41 @@ -data "azurerm_resource_group" "rg-goodfood" { - name = "rg-${var.project_name}${var.environnment_suffix}" - location = var.location +data "azurerm_client_config" "product-client-conf" { } -data "azurerm_storage_account_sas" "sa-goodfood" { - connection_string = azurerm_storage_account.stac-goodfood-product.primary_connection_string - https_only = true - signed_version = "2017-07-29" - - resource_types { - service = true - container = false - object = false - } - - services { - blob = true - queue = false - table = false - file = false - } - - start = "2023-01-01T000000Z" - expiry = "2023-12-01T000000Z" - - permissions { - read = true - write = true - delete = false - list = true - add = false - create = true - update = false - process = false - tag = false - filter = false - } +data "azurerm_resource_group" "rg-goodfood" { + name = "rg-${var.project_name}-${var.environnment_suffix}" } data "azurerm_key_vault" "kv-goodfood-product" { - resource_group_name = data.azurerm_resource_group.rg-goodfood.name - name = "kv-${var.project_name}" + resource_group_name = data.azurerm_resource_group.rg-goodfood.name + name = "kv-${var.project_name}-product" } data "azurerm_key_vault_secret" "product-db-login" { - name = "product-db-login" - key_vault_id = data.azurerm_key_vault.kv-goodfood-product.id + name = "product-db-login" + key_vault_id = data.azurerm_key_vault.kv-goodfood-product.id } data "azurerm_key_vault_secret" "product-db-password" { - name = "product-db-password" - key_vault_id = data.azurerm_key_vault.kv-goodfood-product.id + name = "product-db-password" + key_vault_id = data.azurerm_key_vault.kv-goodfood-product.id +} + +data "azurerm_storage_account_blob_container_sas" "sa-goodfood" { + connection_string = azurerm_storage_account.stac-goodfood-product.primary_connection_string + container_name = azurerm_storage_container.sc-goodfood-product.name + https_only = true + + + start = timeadd(timestamp(), "0h") + expiry = timeadd(timestamp(), "72h") + + + permissions { + read = true + add = true + create = true + write = true + delete = true + list = true + } } \ No newline at end of file diff --git a/services/product/terraform/main.tf b/services/product/terraform/main.tf index e0312aa4..7bf7a0a1 100644 --- a/services/product/terraform/main.tf +++ b/services/product/terraform/main.tf @@ -5,47 +5,14 @@ terraform { version = "3.48.0" } } - backend "azurerm" {} } provider "azurerm" { - features { - key_vault { - purge_soft_deleted_secrets_on_destroy = true - recover_soft_deleted_secrets = true - } - } -} - -resource "azurerm_key_vault" "kv-goodfood-product" { - name = "kv-goodfood-product" - location = data.azurerm_resource_group.rg-goodfood.location - resource_group_name = data.azurerm_resource_group.rg-goodfood.name - tenant_id = data.azurerm_client_config.current.tenant_id - sku_name = "standard" - soft_delete_retention_days = 7 - - access_policy { - tenant_id = data.azurerm_client_config.current.tenant_id - object_id = data.azurerm_client_config.current.object_id - - key_permissions = [ - "Create", - "Get", - ] - - secret_permissions = [ - "Set", - "Get", - "Delete", - "Purge", - "Recover" - ] - } + features {} } resource "azurerm_postgresql_server" "pg-goodfood-product" { - name = "pg-goodfood-product${var.environnment_suffix}" + name = "pg-goodfood-product-${var.environnment_suffix}" location = data.azurerm_resource_group.rg-goodfood.location resource_group_name = data.azurerm_resource_group.rg-goodfood.name @@ -60,28 +27,52 @@ resource "azurerm_postgresql_server" "pg-goodfood-product" { administrator_login_password = data.azurerm_key_vault_secret.product-db-password.value version = "11" - ssl_enforcement_enabled = false - ssl_minimal_tls_version_enforced = "TLSEnforcementDisabled" // TODO: change to TLS1_2 + ssl_enforcement_enabled = true + ssl_minimal_tls_version_enforced = "TLS1_2" } +resource "azurerm_postgresql_database" "db-goodfood-product" { + name = "db-goodfood-product-${var.environnment_suffix}" + resource_group_name = data.azurerm_resource_group.rg-goodfood.name + server_name = azurerm_postgresql_server.pg-goodfood-product.name + charset = "UTF8" + collation = "English_United States.1252" +} + resource "azurerm_postgresql_firewall_rule" "pgfw-goodfood-product" { name = "allow-azure-resources" resource_group_name = data.azurerm_resource_group.rg-goodfood.name server_name = azurerm_postgresql_server.pg-goodfood-product.name start_ip_address = "0.0.0.0" - end_ip_address = "0.0.0.0" + end_ip_address = "255.255.255.255" } -ressource "azurerm_storage_account" "stac-goodfood-product" { - name = "stac-goodfood-product${var.environnment_suffix}" - resource_group_name = data.azurerm_resource_group.rg-goodfood.name - location = data.azurerm_resource_group.rg-goodfood.location - account_tier = "Standard" - account_replication_type = "GRS" -} +resource "azurerm_storage_account" "stac-goodfood-product" { + name = "stacgoodfoodproduct${var.environnment_suffix}" + resource_group_name = data.azurerm_resource_group.rg-goodfood.name + location = data.azurerm_resource_group.rg-goodfood.location + account_tier = "Standard" + account_replication_type = "GRS" + blob_properties{ + cors_rule{ + allowed_headers = ["*"] + allowed_methods = ["GET","HEAD","POST","PUT", "DELETE", "MERGE", "OPTIONS"] + allowed_origins = ["*"] + exposed_headers = ["*"] + max_age_in_seconds = 86400 + } + } +} +resource "azurerm_storage_container" "sc-goodfood-product" { + name = "image" + storage_account_name = azurerm_storage_account.stac-goodfood-product.name + container_access_type = "private" +} -output "sas_url_query_string" { - value = data.azurerm_storage_account_sas.example.sas +resource "azurerm_role_assignment" "rlas-goodfood-product" { + scope = azurerm_storage_account.stac-goodfood-product.id + role_definition_name = "Storage Blob Data Contributor" + principal_id = data.azurerm_client_config.product-client-conf.object_id } \ No newline at end of file diff --git a/services/product/terraform/outputs.tf b/services/product/terraform/outputs.tf index 08455bff..b61521ea 100644 --- a/services/product/terraform/outputs.tf +++ b/services/product/terraform/outputs.tf @@ -1,6 +1,20 @@ -output "main-rg-name" { - value = data.azurerm_resource_group.rg-maalsi.name +output "DATABASE_URL"{ + value = nonsensitive("postgresql://${azurerm_postgresql_server.pg-goodfood-product.administrator_login}@${azurerm_postgresql_server.pg-goodfood-product.name}:${azurerm_postgresql_server.pg-goodfood-product.administrator_login_password}@${azurerm_postgresql_server.pg-goodfood-product.name}.postgres.database.azure.com:5432/${azurerm_postgresql_database.db-goodfood-product.name}") } -output "main-rg-id" { - value = data.azurerm_resource_group.rg-maalsi.id + +output "AZURE_STORAGE_SAS_TOKEN" { + value = nonsensitive(data.azurerm_storage_account_blob_container_sas.sa-goodfood.sas) +} + +output "AZURE_STORAGE_RESOURCE_NAME"{ + value = azurerm_storage_account.stac-goodfood-product.name +} + + +output "PORT" { + value = 50004 +} + +output "AMQP_URL"{ + value = "AMQP_URL=amqp://guest:guest@localhost" } \ No newline at end of file diff --git a/services/product/terraform/tf.plan b/services/product/terraform/tf.plan new file mode 100644 index 0000000000000000000000000000000000000000..a2d97ae06e9e16bb3c3bf91cdc21f444117b67b5 GIT binary patch literal 15671 zcmb7r18^tJ+Hag}Y}>{L8{78Awr$&XHn#1Jxv_2A#y@x8^WA%1)OSwReWs>rdS?1J z)zjU-2mQ3X6et)f5Y+F(UHMQI=q~~R^aaSt#Li0JMnxGM2>8&e*yvo-+X{EsnL+cD>Etjh?Dcl^UbghuCeqLl2`$tmT;Ux z0nJ$vJ^)pDMv}NXGTB*w!Vh+iIJ(#Guc>~IuVMkHP;vPm9gNVZlrB$?HWK)J)@?!d z$oIV~>ECQO-w(fCb$YKY*q<}Bhbp2MkOeTlbu#v2?*t?lfG|U-j7CxB)e-NDd!pj{Fq`8W;KERvW_#Jc@utzOnxkI6!x9O@8etFr_(uS`GJAPR^r zuhOvbQK2?oe@8r*oRFNqc6_azfqEV_E-ei>$eGqIH&MhnKk2B3Cdt0X3XkEZ_u5i@ z7*Sso!~4h5sSE_VNW`-)L(CzxREfh%e9=vvm%hDMy`43wE8F)GZJyLj%n7>KXbjod ztf{481yL4*_WbKgkr#*)S2%W<+z`BI4%O1|XTFvuUAHr$KI%qiV0II-d_DQTC=?4F z_tuTC_$P5N@>_bKOV*8}j2KD!-A5Z4v<4OrybCtL3Z{f?JH^p8&g$Jo%UbfFgcke; zlUq+d1F)FWLD-^t(5Xkh`)72Nxsxe2t4mF1nC6({3Mjhn=MoSiM6~c=f#s5@{4$+C z0rUb3-BI?MhtMP`%yGlD3CCATiIm84gKxyB+zoMlB&VE(T&KE7F^xu1qWZbNgie=%yBa%Iyub-kbX;1t^-#<12Bbd(?DnWP94BQJ2uhgTGa(nnG4wd07?g&z#P}t`E`9NEY zQDFEHbGnVoe=F`J-dn7apy$ZTI;^N~orE&?kX`e00w7pzG%k%uGDC*&3re0}lu2 zoGEyCz;wBlMWYWckhQOn)N@`fU zU|(n6V`bc$H)JrkJs0)7mN1?wGrL^~b4Mw2>bS6}U812E1?8lQX*V(N?Rz`t*%IZ3 zD?0ugmwNX{vE9l8QL1I?1YV6;Pyd@sKT2k|dLf&m7QHBH*Y$<5?xldSv{=QjR z9IiwZC+V;~L4AE-;KJpQ*F?<}4Z^pFYbN!!mJ|QL>d_~hXt~VioD>-s5�W6s)4} z!R3(45-#wbwcb(g&8aj_()QdDTr4j~lgN$2-i_#M<@(n902;<|cl<`c2ad4H7g}0z zUV$br^s@E+^4e3tCf-yg9PW)Rc+7Lw#F6n1LhAZn#|WG|ppFY2d|T%zMTI_>FoKze z0%VHsF}03viS|qBO^fP}(y-Nl@8p2u4;=j;Nh)m&Xt8?Wed5Iao+MbTiQ$E_Wt&Nr z_f+O&`1sGFYWkSaxcK4^Lpa?!aGqB6MJq(9*ZdYjnbvt#$XzcMX*42M{9BO-2ti6a zwmLEM#IEv@V*GTQF`U!3j3RLF!!}O%v@~{|Bu-UA8t2cKfucd@kg+ib7S(`$;{9BS z+=k{;?&&%RXZb=-4M*Z;f6%t10Y7XVrdmHJ=;suiK`mz-9H*1uG+0FC4?rF)jN#&OATt@GjC^OMJ6W@h=_V`F+5)%DSyeC%qWGaOc1Y&2h z_%4`FCkU!a_fEc9$FXcN)v0f={Y!_A-AVA`}$T%Aa_y;OuNnBE-R~=z4BQ%G_f`#d}K9W94px;3ml;ZK%dOdV&XUl3KpPcAS87Wg>A zem$AQ#lH%3llKD(S4m1pB$C91XL+bl{ZHJe1KvCj+_+b2?kk=FCJ(rv-pXqgmqb~k z8zk~Qm-?ZjVOB7s)$J=cLK&ZxE_YN03v;v4aQ=wEMPbQhlG}%`i$tw$AgM_m7`5;x zlygK|9unSO{NyiJ1$mzrNq~|&3Txdi$an#1Q(V*};4F&)tvX5!?EZI18GH~J2VNnp z*BvcMS*kgTI?>6f+m#a^4%2a+^IvK;j?P|}O;34rr6@d;^BX&mUzLlkXs$(j9`bG7 z9>E|)+}d2QcwN@CCLf+hS45Yp%4y5yMkM zri1g`sc`Yp>j{Xq9O3innututkH`nb@~bV~SZsvx=_q*DR1W@1b>7N0GrmqYO7;|=MgM69c!5|wCAjaCL- z)})$7c}ZL6ozc{Sb4P^H9NAyNRfpf-ohANUg0t4sNnHO(*Ni)4znF(RWb1IJ1iV8I z^TJou3f&TrJKa9kXSe zfHB0$aNFR|(oc4Z)m(+~Y@!l|V#!i@O1S=|iAd9?hLam9jD&O~FV(t;ey>*t34+O@ zld-aR##B;JWahp`C;_7N1*`yMC~BUY6Hu-naoKki&hjW8brsC_nX}(P=4>F;-Gom^ zvpX2!$tfm7zG`3OH73DYywrc%A!5%h^3xWtq(uThUDa?^N9z=71$9&NF!Qo0K=EuX z;J>Pze8>G#Y(0_|?E6y(DppeWR~H9IJm^c`vakyaB)P*&-LLQ+T=pEERG1Id@1DnG zRJds_nd_?TsLEPq+Ff}bwQ_)5+D|uGDNAx!~p1&)ocHD15 z0DV}4rh(R_efBT4a5#Z-y{)dnt^LBnKb9y-SY!HiP$Q95T_&WP;`0%kLQ5HutQliC zLRYHi2UUUV*_^^f%&v;v*($InFG-&se@34TlOg(oEZ!V;2GX zBjLVsUOk{a`bhTTd(j1MOWWNnpnhW#E6&Go4LP6<@G*Lp5Fz2w6hKEgg4T>$jf1%PVIwJXQ8$ zq7Z79d5ZVd{(=w(Ne6Q&(W<8n>}kf8fF~+B?B2SCiPB9QHzIFi?MN;|Y|=OleJw)& z{HRi<<|7(qtQ#FBdvSeY7E1!jl2=-ZNwP$1BTnwL521t*eQBM)-hs0sViclJ+FaC3 zfM*r32@J_?$;`+tt0gKe-?T87uW54H5EI0;;rfvrD|Lx4S>#aS>sYnEp<@l$y@bV# z3H^r44SZPOtyMLNJMdihbma>R;?G18fySkBD%L@ zU9zNN(^0UqaiRVl%jtDvz6cA_PBg3-C4VK!41OQmgSvUq-E^JfBC0*zX(i|eOXPfp zy;`*&;j_+Eur(i%mdfn-xlE{R!v2sn)AxaMPW#xg7XCfb?V8Y>`H01 zcADsn3a3Ll!O6hI?DO*Yc*0APK=C0TzAJO#q>CDYRpen8zPJiWF_=95y|(Yd$VKgh zY~VL$v}~U$S1hNW<*xffEI|C4elFC0-h#kd=AzH>+2b57>eon9vg7VY3|=?#zOzGn zCCt|=9<3SLzm^hl%A8}Wb9wj-V%+|eO}~9y`HrGaFzz{NucUQB zlP_@SIl_Kvs_32lOzO5$(2um&6FCW+-SuZ=7b6c-Q@D9LX59W^u&@&*f=Y-96LudX zte&J&w_^1zD5bb8z)Kl4pq!XAEMZfWRmHaaR^jDI8w@ZWes3jrg|izy?^0Z>-|Os| z_XsQ0WW!K$v}-Zlp$4a;XUK?rV19+J8*N(%@J^K*monr;{_gEKn-;^jb0XLucqgHh zOixhq1ZwZ(JC_}^ z@*rSs0Ea%!qN*|FrkFZ(`wFZc&_$g?Lwk>a`iHJTvDQy?7zvHPo+Of zyg72$ZD$X63@?QN6Jjecsfy9CkTC-W0&B~|`(oXuj-l}yziGy*+!m~dD=^O%YzB>4 z%8ngFTZ`mcMJGrqm7lwaEhCTujI2y~(x=d2ulya@%&$Fz-%m!^%h!S<1PSZCy}%Jx z9oF$ZC<*W4?QIO=*z$TUwRDB^I*fis!yP21H*whUCFz=#;MxrY3dt}+1{QXSi{|Am#q344F(reSP_yJkgqj5w$?M&a^u|-5>j|~jz-JtdRzob`o~rklkKT?%7pAZ3EeM1p zF=yNl7#acR?RVuz^XjZq;gD~R4Yz*B^&*rxB%#P$NYAKWUeNjQ#o6OFeRtv5|E&zTcsFy7 z&WIasUb&Z$*~*%TS32%X_}~U9BPlPvrY;RUQsxw`YBY0+Mk4TZQ^uwZYc8xtY1JaO zhc<*mgN|*O2VK{F%IDPv{KY~jkd0&W7LLG*AdFK49&IOF6);3UYZ5`oWnZ&n>`7#@ z-kw=O(-r7TrqS6Gdm+K-;i_L9S~z>Vu8FHyK9O&^ST1;m1zsc0*SNuy#efNt&f>*b z4UdXomYdJy0~s?Bpx3;pD^Vw$H_uX7zRHh@gspEG+wY!Lxcy#~d)*!Sn~eJuYlj=- zq~_@)oHxL9x0-m-tscUTs#)##{6_ZBQM7Z-kh;BwH;3(p9>MZ-n%>Pz(~@ptKj!n2 zGz0KsW^7f$j}C1wga zTKxRQ&eprJi{DiQy4!xoFVY8>-Ut#04-yX)!}qA zW8yB;#ZC;>+%pi+fry+e_wD*<_Wvm%W+)}b~cy3v|X>ua{p*R zTf~=5Rd;)sffh37FMeuz5%RX+x74dhhzfn)ed$AXwdEMYu8%Jwf-y*!-#r{NtLpc zeNypc=^6QEZ)6VLjFxMT%H;Z!mK8gBWGeJ)Mc%Xx9%vmkBWyh~cQ*7IdMa$c2Gp}y zhRP7|0nL zUIfGRk6RPy*82FpUJedBc6;!S(QaF%&M~84;uzYiE*VhE)FcyFc#jDvNy>f4!YdXO zkvuJ0e*^I1DMxIo1BefW1_x;aolGmQ11w@_kqkrgo?S_P6~M-hr;D*f%UMKd&76&T zU6E1`yECCHWyHG8Ro>_Jdi%DHuKn2?=dk353FIL8@-B2U>Jn11rN;fxlky2sMIPx_ z(IHrHbrU=tki6G#Sv^CmcRBIa#7Q7F>@~;Zh`c(Hvp2 zfnZn`P+W7#9u+dDLdo+08V*Mk)Izw=>1F+W&nSy+4o*bm;oZs%06aCC2*s-McW2hp z1_eS@70r6LLOh~8)l_4Fl){i){3fzIsxz_tN;b_4)m>2@<>saFCaPw_X8)Vlp$Vv% zYp?Y>;bEf{E*k9Fx?mFP&6;>krs{0l6ay8sMzYSl(SX7Qi-7e~OOUw1cE44za!N_- zYVTm`nn4;XiQ>b8WkWG z@JS@CVo0WL3;ZqlJ18OfZK?8I=u^h2j=NpUJ@z?#x1tGvL=3a2%dGw3-Hs{Oq=)`6 zR-qQ|o99O&X%JQ|zq)}`#q1l@%`M%|qOAIh*cEf@~PR#*z&nA#tTj0 z?cgi16rF+^-*LHsJF6PDWy(aPGlgj3YlBPk-KW5aQJCkt^oWfCSt73}A*8HDl$J+O ztwTJ9^^mW8zlOn!?ja$HC{0jqIA$D}p4#`4aA`5$8`e0c@H_Ei91eB14q&rgYufj0 z9^JY<*T%5$bz&Jp0%y+B1Szw3#*fI0zSrXLtOa$36Utmywl1P*+H?ui%B571sG}-v zcasBBiYqg8Mb_Ou&&7Fx_>L(t{p^hmp=Fe}OKoT*-NOQ{4J^^cumUH1?{`Dwq`z#U z2wzy*?0n&jLQ$Ft`(jrvatDmKQOGToq(KUuJ{2yg#g)#IQYL5Eh^43#mTch>Xv(bv znc7D+?F@@%fOY1is6!C-c}>XL0e0teRSLW2vbk&|RE}*TCV;Nx$vpA_2Iy2nS9|?9%zRwqqCx7^n*zc--OP?C>Zq z&Hg0j?I;dH5r_SZWB}OBZP=ZYTEWUJ)kSoOgCj>!(^#1s4gQ3m;R^`l1tRB^$iWJD z4_>6;3udOwt;Id@;RzejI^TS{Ho~89ic*KtCFy@6^5g5fh{n|(o}v(;T6A&=^J2+D z!-$RajCGp5HqN`N`~>!N-ifqb?C&ydDZ^|)M0XL~2@-?kfJ8c$p_I*w^+gCjVQ-Lk zV8G|p8`})p)qK3UT5;f>+P^ezIbRF$Fo;!I;Q{w>GFD)380o z5&%Nd9m;XEizdtnD+va1+?D@EQ;cac$cpvL13wst&`O|xCJw}E{FZ3%MOhSP1j6Tt z=6Ilyv|jDeG;U?wl?ZbB^2l$6O6yk%)V`5>5qG{)1XB@eK69=rs_nNYi=nh-2liLh zjgbQ0VqDviQUmE{Is{_;r>=VSAa?HQW_CdcHQCKW46X!$`@6dj$-w@Cqt`+c8IOXw zsaNx>>`hz&qph=3Xszk?8NU9e$HbeH(;CQjwTIk0=}F$EjP>#=h>dioB~NUrqo!<} zGRFD&^CWru4j&iHPE*-|?2?C}a}dZO4vg!Iy`Glc%RKw-ltVSrw6PpN=*A_?#xDEqvS{*3fa+M=^#Gv+{o?dK}t`3N4rxm-OOBFxtGgJzN(0H1KNgl zz3u$S^rfVO^d%n`y}@3?VD!2`Pmg`}ZOnFLy)I2@wsLT22XXdC6S-%X+^(zWYfrOT zkC$TdsvIxljy8m~02|4etLM>Xx0>h2K8BxlQ0z$52GVOsepDyHM=Uspf;eUnu*R}c z?>@)h(Q<3Qn1s`1gn?c~JB{kY1*dY_7g%y5B_xl#j*L-fF=`j4nj8sB>Bx zWI>JUAKX1zo%m>7jk#KhefW4YZJCk#!g$%NoOwCaaSW+W>iWL@8BXBHj{%-uxxOo?`KP z?0Vw6^DdGn7Jw&}Z2n!a<3{F-)5}xIx!30b-lJzneBMi6-XzHbNMS5;*%w2Jm$}b$ z5=noF(yA)a(T8%y_ab*&UoD^jiHhSsk=EU_A^ zouS8yk(9#gpE*3ZBZ{5cWlJ=QN49ba`{V_XjIS7cab#@@@fv7l97!6!Ebt3M1kpkw zcw%5?BGX97t&pfa!TN)Ivw>7c^pQRTiJ+by&uBTDtoTto*E>*Nj+c`ZN23SFk~Rbd zj>odG%OB^xoSX_H1krnRYoCbWxwsWW-~74*>Wr?~m;%Bfwh71Jx!q9}Gy~B^;g<;Q zrMcDPMJ%X0k}&c2ljACP6RX0sB=Kwg&4e-E-)g$YP-T95bg?>f_kaydsms_0a^qQKa?sxaqCz?!-n!@AjI-%soLi)oaZIi z81ExyD+42{NtEM_8Ujz-S7wtzU^|Qi`~iO!o}U zXRfm8U*+U45J-*JJBN+b8pJe=e{w zDU4T$5uMp$0jIQTiN+d;Uqm6=q^O_~JGpsdPk7@Y z1}vUf3azucnK}YQUL>?$-P~o~L#qg+B~)PRl^Qb^TfJx%;!w=dq-< zI+#d}IVlMqlsb%ZxL7Wf1w#Rc+1Fb7I^6GPWUHT4nKJJ%t?B*{E07$H9*c{x!sT+= z1#(9J9i}>^?Ivr$KCr^gHU-d8cILNudqKz6M?X;V<1lty{>cb4S*$z638E8X9rnw} zx;VYsU;)bXG*Y1(Z9Ndc&WqT?OZgSCkBpmL9DV;?YDv2G2ncp#riss@CYbae9{Km# zYeL)6igI&`otHwr1OZm06Tl|p;NI}iRGC~-Jg5_lxiX|YD1HudL=FfSl`n02kAb+j ztr>Ym5k$y$@w`POTeJUc@U&VoVrm<10kmHxo~LXFwW zgzHgLPg#RTJWA}MDH7&b<2mAJ$w5e5I7UnE{xz2wqMGK!)SGhCZ+{VeUFIP zES)c{{b^C~vB!LixFmakzoCvoq!GT9Z02+R+-}p+f&UCG+Y|CEFk}pHX?*dH9o(v?yL@bp{+bWtFH< z^0>$A9L-C&Gw!Md0+O~v^VVv}Z8G`_>YAqKFC7y26ojNJlPxa8BlP3QQ!9FXFF^%P zABGx?Z%;|Ks+A1(;#+8k?S6IO>W)sIJ(nS(hA;COxo{dDpiau*l!|L+{i<`7XVE5W zRxR;FA96&tL)65xuHaqar^xRc-$Sp^eedp{5)t3$r*WcEUwG|w22hr)#2Sef6L6KTKJtPF4o?=Nv;o8PHTsmq*RK@x{5=^Y5Hq5E** zM{Zeh+3Q2_i*tuswu?ATxCQ`mg;~JXR`M`iXJ32)VHfE|r>YxR1`FR4X7%5XY4(be zCP0?O?I&B_IZr^AC9La%SV9c+B>IGVhX!aa&mBTJl8#L4vA3waPTo#&pLgE z5i8bwThkBR-JMsVHSD2sI2l3WF5_Wp0GDD!)Izwsb0>{F_Y&UwL$F1gESm@pPgn zt|e79q)4(h8XH&chN`oA!m2p1ynit*4IY%rys}CID3BG4(R8&dXZ@rEQ5(0U-EwlIk+Kf(ptix%Nme z%#n}1#OZ@Md$)njpxo z@Y6fM?(@^~vm${7Wt2g)BrJy5sxSOJRdLo-w?A5Om$-oll%c7tJ~Hfv;*^n|0Z~g4 z<&pBsxg5~?sSUQl(<~N~XAP!htgcdF`PoTh7nSUCp&qv2XB;m=7H4j}Aes&u%Z2nQ zX$KonkYrP6asBxeR1k|XEW+-Q&y6C+>^0HhTYLLW-zpjYrOZSJ=0;619*WGc~yOQqtl;aPxNFr;YWen;4CJGxaB`_x~WF5>D( zCl#R#A|LF_OjLS5JmNf2tA5A5S3WmYmhqNeqX4-_ZDQEXgXRKgvi&iK9n5t_RZkG! zv+W}aP127;X+=cCq^QJPw3TR;%M_2X6>zlCnzTcqX##p0{dWS|*XgCOR%ZvXWKHx^ z<~g|N4d9vEN}q1#5D^`vs@5~+nad7DjV=c|Tc47~fh$rN!q5tgtTnZZ4>0J>VpS$W zwG23vont|cN8*RR-{A8H1hMsC<$mOTvJgpcPl23Y3<-3UM8vU+dd0_|+=@di>2jFN z2h*|u<6>!$s?fQFX_OZcaWUIp=I`iYgTe~#*NET~wig(%-r%Lg4eog0I8U_X_7C`} z$=K2;&Y9&)cIHu{iKHwu2iP$!AT}UISSXoV_pDCX6pM#veRJ~eq@7~$> zf91J7*sjDJ8IU!jnOa)2QRI>39kk#)9w{!TL0c(ZqKQ~#q~?#uMw>T3O(1pE8y;WZ zEn4b0m4a8+eKkVrbb@84#6zOs<{)h_hmfF*KRUl#xL|HrUAYJ~R7>!k{~ z`;m5-13hp@gIE?5P+n8|L5+xG>xD8*@sWvZYO$t1tWF!cb-|9q#WhLkyvwe2 zhLNCPvM%*?IHoRyVe6~9n6&uJsk0I7(&YnTEH}Vu(=#IXxr`(1r3=f^h&dWXMoc3O zEW)uw5BV#L_=eJo3p*wh$JXNMSsU2gqRSN0{uDsu(-^xfZlqtO0^w~vl7<)mWO(~g zN$R7hs&QmR!b>JfbaeSkK2Aa;P*)ayZt2CcAQdAppe^+qc;GO_5k-IE`_1Mr=N7%^ zT?aRh83JxO%AnmZliqr29wDtW1yaiul(P`A8L`>RH+N*aVC`1l&?JzjKS$nWjVeXe z;G}>0`j8UDUpb@F_Ozz(=S91)msgC+Bkh@`FQ*r(7n?oH z8(2cr0izRZi2Io(+>XcB&ZEHOphQ2jr-MuF7>XMPG*awB<$d#L#d5K?hn7a^uiDVM zA{M8sELd$G_K%_Cs~Tsh;%QlrNN00iZqA_1O`JY4w}L)yuYw6U%A#pyb6KoNI#}P` z_W*0s&ae+(dQ#$Q*YZ9ANr5yy5ZXFI5JX+MLG!f&01YLu-wUV*aV=|CDGyMO;H8Yu;x!?f(?@ZxCbKR>8e5UeS9x4Zjm7kcbuHu-#(j~!0xTxuPUezv>8=b+1QS_r zv194(6I#AeZDWI;)wvt)N2N9D1+Ot~4Q1&@&~;uIG2Rnz!%3hUcRgG0UP{1EI$9T_ zz~kZJwP0X|jM!*}4J>EKoUZho_LlqdFY%t1r!aPsII34rOI!$xM|U-@PR+-HSMj*s zHZ846y7zMAw=z%qlmts1K81bqV|L(qyQgn2`u8aumTvT?_A8_@J#BH<4|_dJ371{= z+ZI!0;rMtYo8w@}mx6!`qxV@A(-XTlxjtFs<33 zV~z0cs0rk(;dG(+z)Yyh@hw`}gr#5%Ede>CH?{YcPlKtgCaDencCn}hzHAk)g#~Wg;y?k01a}M{2NnhIa`|Rj?oPjhv+5Gs zU$mhoCtHTIrK_==@SWD`0)NnvY}B0jxc4^Crk+K;NTj_Zx^Fm4zwJBTRVHWqdOh3z zJMBSvu#D08cbwu@|G&j4Q2rICFtoKXF*jwfreiSDchaYKGWmD7qEe~XW{nf^=NS$9 z02gUbgZ%w$Vt24wqGfRO0Gi8p*>(O;9eGu&Uk<-B-5DTELYez-sPl=~-&vs~j)XEP zGZB8omf3H6?68BaXs#INlp+Z0&`PL_N)g#ehnYI_tkpcsR#TDT2ICtG0 ziz2xJ^I53Z1v`vY;3e6|;Yt<;KWykhu(5cPJP8OAvV>nhJF#faMA4OAsw2l)7D6f~ zps2xUI}_9;*ZuKf^m>ex1Mn3;PY#HqJB<$29+Me$Rhf{*Q3ba{k-7m$EUACwrg08- zM=utf;*5O|w8^-V0q*=PXqV%L5#2@(5$Fg;Q?QGrchMI7m42?Z^>8TF4y;s2jKZDo zzzk}@^|MJalnHUXMbC|;1w1B5QbN1iK&W4`^X&iVYQk79mv#6=JpoTJy1sFxuNCcpwQ${jL z3(zPOr7UGL=TkThSpo3>FO`MNfKMO-7zoG)?Ej}vt@X`q{@SPGstUGeYzW>@HH1M| zCqjEoD;JBY+~?Km-?nY&Y-UUJ5zQi98b=ct$Vx6E-k${Ovx?0Yrch-O%V!jKwOj-b&I-3bF6KC-?n*MPbH#ZsTT%4uwuf-R6<`)K0k6qR}pqa(Q zRSp%75^_4Oh2*?glRBd1w{iGgice1sk|U#~jI1WO6+-XtDzEw|;W*z7!VZ2y6*B7a zBIA^eW@s-RzW*R0=u}E|RrreZe&kQgJqGly{jEJB_BP_Y?MH+WR7@TD3hJ9NMc z+#GCf&uz6OnGzw6yF_p-0PDdULOwB3y1W6}IxY}YofeiVO(1wk3Bpg?F8=6a@sU_} zoBl>*!K}ht4>qRAzNxvR7UN)Rra;TkG~izOYp|D>V0jwplvi|dLBE1=aZ}L zceB6P1^)Xu|BtMPiAT|dD%{kh``dDGAy5ya{ngy~UN;U>%uW)`y7xx*L?z&rj`rAK zv||ZB`9b?pK0jZvm(Kt_;8%%c2JwmQiTFtb*kjCcEh10ox8MzW-}W#kDbsO4;UxdK zwRNNJFU<;2Dm5_J{kw*f7v-O8my*mI1xyKCLMM%7m$7G@*n5{0RQE>G2cMA>55OGa z8m&9l4Wnbez1<-$&0+`H~P3(EFRf{af%aloJmYPs`M4cm{|Jm6%9E8L)5 zj9L(^14u|NDg*OSzMAcR5MuyW391@E4$ot6c#d5!7lYe9xW~s7^tBSxU!|~{-G0>5 z37ayHvJ#;T&*mRL}POSK?=cEGpWZjq%+j}zxCR6ZoB(H9`9X%i4b4ObsS4XJ&e!X2dTC3ME zP2)5SOvVXcIcE*f^VbS|ib`}jUHAu{uy<(;3PhNrsjQxo_TA7K&4l{J4x!nF1Mi5L zf}Z8W#28L#EH=;6VV5ny2V*cRVdEV&J2lTfxClMDQry^FM(~xvDppwCx&E7*3#?7P z`hWrfbwU5Pd5r!KZnkxHvU7HF{OeTykd!H+m}1wbRdy51zRbd#YMBy3K`UmZ}M zC`vV+uR?PgJ|8ch-u~1<4kKfsDoo{pZP>cXOh=$|P0_yM9q(IXjNa#TzjcW@v&pL) z&1%DDrIKM?(tKDti);NF!6vi)=Ie5;AN{rJomxuKq$29LTp?Jki#VlVQqLR)UB0=g zIvkD>dqq#>%*UrHEJXF8x2bzF*BDax%4}5E194bK0YnJCa6mu=bs1vr*Tm=D8&<~H zdqC~e)Ct~^TiUg8mhjh!T~e^cI*@Q7h1}ySaUqt*>8^&?Qjr}w7 z7DvTFkii0x1o-);6DgyYerc1Y?htcI`~v?$7_$4G<~i!8J}BYBIpf5QFDLthHv9Wl zABVE(v`u@@6HP@}U_X~_t=}PBI8VtZ?EfQFC^aJ>?%#xZ1oGcH0`ngo;iB(gu5Vyv z{I{-1iV>&|WP}BO;uuW4>ZJqVAD}>L`Qw2HYN)Jt28f;(XL=k=jA!zwhJP{#s=1aG zx7T`f+i;9!UBmkEK^JI;E>s+2`VE}P7qzD4gMP?FeFOhCpr|(Y@-kp{ItLpKGZ%c+ zIG|R%#_RoEC5r>NMrN7VLaw}VxJFCbNkLq{nkMlo&^bf0p-pSa(LEpsI!J6L6*3gpP%+TuJR)_M8K!w&f1c>dA z_lSO@7w`4udLt?S%6dvNuy!bGi4(#4!c9;|Q+m@$nKr7AD`TjnvQ)OKz@n##+ZX#z z`nGHX^_sE7>LcwX$LD;8w*!eM=hKt>_T@8&b;C6lhPAo+?4^%qJGTa}*}KT>lxyei zU|o#J1E;pjF%O+vW8W16cXyYKy;nPSZrjwFis5G5mS@Ax%eAxq?)`ob_qWoeVP~D@ zqn6hTk}Ip*D_1Y~^s_W4<^h3dmLF5-iXc z!E@YH7+)ZVn#tKikrrRYF;f!c)(ih|gfc~kNw*>uU_Jgh;zT_W-dnUrnWSC1tZF_9S{5FB*L zPT{f9O+YoEMYLta=nZ7-r`xOX`NxaUXCh4 zJ+?t{Fk!tiy{}c?w%1SnTcN(c+2nubAkt_1(BSV<-oFesU=UQGKewm;H81&(?Wup4 ze{5Ejm->6VyZ{1fi4#P|p2{wY}B{tEZMG4MaJ{yM7u{>Nf|WBoT`m6rmC_~Xl8ejh=< L$7L4hAEo~Ta9w;A literal 0 HcmV?d00001 diff --git "a/services/product/terraform/tf.plan\n" "b/services/product/terraform/tf.plan\n" new file mode 100644 index 0000000000000000000000000000000000000000..7d754a118021acd21562d7da68d2b72c642dffdd GIT binary patch literal 14515 zcmb7rV{~B6(r#?qnj{n3wylY6+qRR5jfrjBwr$%^?!4c<=e$_oIcwe8YyarIx}UwO zyQ`|J`)N5zU=S1lh~Lkc`o0RlUjz&Q62Q^e)>6+}SqT&XaB4r#@LXNX5@*RtTfK2y zCg9fwu~q4OWv!Sh!RIq^RNYsixN!XmwwZb~9Jdk9Kd_cfnCxY1#j})rL5!<2jGDeSu7Dq4-WKLU3rm2H9Tj`&kD= z9#(erb=0b)B9F|~ABpW=gSCeQ2h9|o5!&Ji1M0AVuzyGqoVie{raR;I^ZQei*CF;e z-Ml+R0VnxViRhYvIG(57`gI-tggCT^jRoL=#*v>@oi_>H7-tVQrxS4;3_Z0K(UdL) zF^E;5`%0aVv@nVvi=D~tw?dK z_N&n0#D7&bJWYM(?asWQ7*%q`lU$l2b{AooZ7}sL6y*vbvfGlvF;*<|7nX_t2?IMr zIU^6Em^zOK1FGqFg*CDUsW1~dwQL*jpjD0`0s9~EG~ghOgJ+%fKZ(Xj=RDUo=GhyW zr@NDI(j!Ife}$dPs$@>=EMZ_~7yy zh2}-#)TdR^<|<{oxFQF;C-cs|2&F(8C!4|0mKl)R-R9SBh$eeU;|lq*;s{`_TM%KmH`ZvKVP70gu`HOCf;gKgAj-a`0p%fSsz#db zJMZI0ge3wJ#4jW&KVm^tKEUG2s#g%c*ue}ABrJ#R+o8@Bu_984KrOWg0G?*+&w%g| zis7AcKpOJUpsS6=(q$Ha698iWF8otPx5SY?s^Y%NUeOifQGM^i()T`9NQ(f*f_&_FwLxiwx;bX-yv zI`xKY;e9}+hMxdYD?;y*gXDdu0Xy(qNywmfFaU?U*BT{TSx@Q?>0%% zD?7mZ0hop?o8JkxBTE%HfW)JnGR;F*jJ-C1n|Qx`fSObSi_{D3$wCc(A|YAq?5Olw z9kW?0j@gq`%Egbmo33@#6H+SWl;S=hSm39oVDtBXlON!^)ig*CJ^&s&BV5($ZWxI_ zfEj&_b+2k$X6^eNfHteSo@|iVC~JUb4QaQe1m`DJ5xCOpqHpHd54vV>@>jfT!j&=U z2%gV(UWT0T;gW1|tif~=>#bNOKqS%sEUbuF(ab+C?JEg#Wah9 zPEcl{zfFthvD;Ciw@4h49jmE*d5!!OX;i^5jxREanZdm1RXx=w&y&5M%1lDfczq5! znWK9eO`xX_8Z!}%flWMM6*)AvZ|Lcf?HltPpH8uAYQ-gFZ-_edsmD5%Pk;7GP1%-W zh)NCc=IZ3Ktd(d+r^1!BLPi$93eO*8Bes|)Ehmj*8J-`jkmHD=#yIz8AjS-N-HvDI z-+&GFO_G>+?{s{%1+Jq&u6>!!qjN>b+B%K(Ssoyi4Pn-S8=!1!m7#^RR=JibCYTXk zTmERnNI%vutFUpZy_NPlM~oJ=ezG%~vVJOdv2B~O6m4=bLMWNVoxTiOW29-u?S(rh zDwpk4UR{Vf_q1CO)klOR{(x#Q@$Ys67?JV zZoo|mt!;b&UO-l4!3OKpyRCVif~5&4Jlgn@^POe?Z|U`QvshC7z? z<#0Xqb)~20aOTl#W9;bQEuE}4#d3YKen&g0wU6r-v0PXKq(btK9~x zXvhsqjziH6QU1j~LhsRUn+J6;ddPcx6nVB>UuoZ~JImP$wa&b^$}x8&TZH7v)DI$? zZ61trtLF;TdF1kY1Q$EChHW3$X7G16-B2H4evqn|weGia} zvZ^6FCP9L+$S0=m>rp+@JbY?4^6C4NcwjAGGqf15Nyv)0>kcT^C z7-R)P<9|KDYG`6$vXQqoUw1vdjEpyBU3igti=CMD^K$0D?@z!E8M@>0r#e>-C{bs1cV_GDr6jpSNYWY@Oa8%nMN;=C z3L8|~B8fDeAOTYF0SOUm{m6w+E=)PekDv_o zdGLErdYuzm|HfIK-Js`PH$cw?WMstY5?t5FxWlI>gWC>FL*iDke2V6Tg}X#=W=RIj z2Hxy%6qm9`N@TD~vnQ6~lqa?(b*@={JZ3Ma$JHYgqN3IPqB=J@(JGoF&&proFXUcK zmUyUh^I@CzYj8a&1Qk%Lj(a6EFxxc^}Ahu7fF()3pW1&!|zNwk}V& zQNGgg4yrsjj6V0a(CPwK91C*_q0JlTzxV4F$l9`#y#_K4TNEyS*R{1MI7YU&rA&H) z3;{Q4l$A4(%l3GH$>frxm6|vOP-GD7OyZWeo$O-P9;vg7Ky$UKS3zPdSe>^0TC)Fk zqod@VE7%-Tvpm0)c+~FJ9qA+faq|}&9HM{#u8JB40HBB-06^|PW*XrClW90O z>Ny(ynQCa7*$}lXer|RF5pK|4N%70``Qiyz)iTF}*79-qr6wKNw{*)H{jmH2q50s` zRSFxft{OM#_*DFMDglVk+c?F}lMa8k1s^1EgXzGJLG4X7@BPFhInK_6+0NgQJwP)tV(8jDb>m4u&s< z68A^=?vQ^|h(NBXpa3e5LTJtV&AY+CdaK05nbA@ewaLfhcOnU$j~9%nh@0^TEFwKAn}7IT3c{;JGm)y3i2-)*T1kO|{va$BD7((Y|W_V!o$U5O|M zed=XlkGx$=mR1U+u{@nwEW(Nw&ySlQvrkWw=6oR7q{Z*$*^m_UhO8MqT~t)VDXB+Q}KlH8Cdo$D=YZKzzdSI&uE1SOMULBx{7^? zpe&?SvS3xT&N9JhmEbDn{5r#+EH!Sl6=ubDzsPxhbyBM0{TQ^RFni~GhW zS4*WcCGct{!CD%o)tOqh`doU*RJ@FjI<5>&;g63z;Ukn0>$gUhlpn*k_8KkjY*nym zdG03mI#=~q!_~A4JAz&~mtP01K3tfOHb=diWq#<$@%CNyD$`*?$r0=@RS^g+0be`VrxXyxzq%axQQXov`{Pd^b`ykS!I!pEQvxN)EWf1LeVw=5)n3gDyTv2JKbg>@+|-LuKqhA zGXZNH6H@d$*`CGiTZfGRk}fxmROIU}2+eoA_Utb&Dig@2edMHfwlbj_sv+8S7g#!e zU6~&VBTUoNs1Z>RTJrBq{G|Fy?&7+R&-s?X70aTQfOSIbBN+_lO3INF0Tc@Iu*wMi z)#?^}bw*gl!PtrWvy`7-$Ihl@Jb{j5Z6A5KWICp~GGQGBO1TX|##D#L-l-eRVIuG3eMu{&1gb-YY9$L6 z#S7-$?plmks2lwv4G&ed?c@~@znko}p=`{4UQ+gDFMb}5Tt$&S&u!l>d-7O=#lUkb zcD0mG#yT6Z^{|SfUz^S|V_{3(cM?4xlDdziU0D_^IV99aMVk%Dnx=1^#St%j%j!s5 z=Y;Q7vNt`zY@v4L)Q)vo!d;^c!+JSI78aC6qk|k`G*$C$Lz}dH{O0gzLv~Oi3if)xZ1_%!AaeCsN=5es_rqC)JnIePXZ58fbOb{^6^o*$ zHbvRfBF@4_*mGh5yw8$u0YhrK>_lAb*oNWl;ai=^f$c3!L6mXkd~t?r@Clciep1Ghbqob3yR?!cRg6VtMWTYj}{*8G$;M9 zE{>KIIDBoYJTKYG?l=!@GsNt&`87Iz%q8TGmFWbbSzM4dkL>P&UP6@e9n zY+GA1oR)z36B$4f_M4BqBuWx;>IJz{xEZBLCDv-&Gfj>L$SeTPPBp_h2bRm9>MH?< z>c&rFER-lYv6W4i1KmCRAPKnf#Zl2g9HLikr-R3zZ33a)YDf0Qy+K)fzmN!iY^Z-S?^?tUTkP$tMjQ7F`y#) zS805dZLUCFCximfg`sr9t-9YBlJ;q^>2^3E`lM&8HP;rjCX@GXCDirrK_pYs^hj<_^bJYSg6#`Gw# zo!E>ds2B@|PrNa3G9_Gfa;y-k9C;aI-=L*=Lsjn}tlu5)1%TognfGDVL87@R1|5jO zR=>!qA`*c`YAIJbM}!@GYf{|pMZ@C{gGI1M70N;-hN?M99U~*Oc*ch%b@v-03(4Ap zAUsqc9~BTlk%lYC0JlT2`6Tnea;#S(kmun$<`bk)!df6zDqV0_G;2sJo$WU7aF^pX z#hZ6n!_;P6+6g4uq6A}sB&l)kUmCVzt<0iHMl!-}WU8xN zLYXL5N>J}GC#x=0L0#vVR#vviO-kLBvhOOhhSIqYGKe?{QY6#c37pwJte(#W)dv*S zc9?WonwqyR>c3$G_oq`8M->3hp%8(IutIFsLWNe3QJynL2TMKT@>sw+{9SVxh_(LCXp!aSXX#WCKY{1^m`R0!` z)ir_2*l{qhI>M29HbB6`u>`|##t1gVI}+gWIs-F zM+z0vrtMg2FyXO@jx~&UJC;YrN@EZ2!_hSI*_?9wsdc+QkK#T2P*-l6_*_*Lx4En&USv7l7W=Za!z@bHmz^P2O$(OQ&rRcRN{1hX3q=O zaYAR!5D!j4eGhzvr^SsL{Jo9+%MzE;Eg}J7ubJuFye{L;6Z!|D_B~Dgjo#yU=swaE zd>6Edt!uA-xr=#~ptTS_BjH_@F^fLlwuRxd0mOEUsR#EG)5zFP<#!gTnix+Q#d8`w zc#jCj+UwhG&$F%}ZSL0%*0VgD6)V!;jV5Kt(ysUQU8;azk)3(b^Y5RV{Q5#f|XVIR)>H+-J zBu%Mvfy0+gs1xv`cW6m&u=l^+P0KKJpMy*m3M3k1rt^hEOec?jQIeS&jPt(eGRZS0 z`PpXVgN7XigkC$e5`aU;8$=26-5|H***dCu1XZA~PyBGCpom$3Hw>hC_v>hh(gJPu=! zdITnj-jVJ$p{o6Sq35B3vH@vf3H}TEUnws^r($gb8~}iz{C`V%Vg5{cscr3z zod3*wxjbxkn;*ZXiulByvbU@W0-rRMc^{Z9@u!`0=6WwF>~X+h!ZKH7$TcTix<;V| zv;&=6IXhM>Re(G_&+o3?UR*!#N|Y#gzYWrp9847qR$aRIVE}^}CAH#`FHuB=D?ARe z>tm!GOp&a-nd|#^qqOjSvN;7_Kxltz+Rr3Q7(we2)szH2OxRr3c00DKDPNl6FjzuM zK~@o|o;AV>C-1keCtr?Bnzh`xnVOJjKQi-woa7o-u5H2ggOkoG6sfgfqukDZ7%7FZ?} z;o@dk?Aq9#!S&AI#fF#=mi|ht*j^QsI^U}o=VpGoY%t3X8Kg-T@(B$@&!JS zW2k)hc^YKN*HC&QJ>~Ny=BReY&`*MrjtrF}Bmv8^?g1iCv=VUwhZ+Ho*Q}MJyNq-mwj)LSQGk zt(wsz0O?Enh7dE%ivb;aFC(O8ZED}PVI_g9wUjSX21YC`C>DpB7h#?@vxrr3Th#{f zo@#I~kj2Gxz*%r6MHSzz>{9t4rT9&U_Pfcg{dAiu++sC5#%PrI6=f&h2Kh&b1AQaS z#E6{sV}+dq!>j*y2VD5cK`ZGN&onNW{hdB77Y2V?uY*qdtn7&N&EyqVvax^=&I9-Q zSn#vX=98$zk@rq|*XCFo_pL+L2YxFlFbC6A$qo}93up(sw`;3SeCpHqmxEn*$M(x? ze){7L=D{+otnn-JC3y6x8~4@osjKvl%^zHtkZ!lr8K7@IEtr|(-}Bm(zv_eE^4?w_ zj%Dz8*CT2cbfl}x*CQ_zJMG!AV>%~ZM+f9HB$d*?Vbo$aSUAnkm@9w-5HP2?OP;c< zI+YmIM;aHEFmpf*A__?>h8FsIh36rL`bITdXkq>eCX!UISV_Wy^(BU-2%bM>(QtzG zB`vmq1X&iCXD#igpBUbL!p+H7WKtL4m7 z?6X9WORV+BT{1~3kuDw#1!-!NJ2X6`Xe{B43=*EPwA&AQRQ)Vys6xoHBrx}8*2tab z&O7c#Axy-aR52qgUkcm)NQU;u`~3G7LxA`^C08wGGDRoDbVnmXqHq9%PB}zBOCxk4 z+E}CX%8RYG=&20+Y%FELuCX#N7|ertgha~v*TdGk(xZ7d=BY67H%4+8H+9m4Fid-l z24p|kpVb5)!usMX0-)1Ua~ZW4rli5AXyXnufG%U%lK$*=q^oca%yII5IY%i?(`H=o z>_swKizPdob+g^NXgX}z)42db;8HPt5Ofc}BCl??;CUeJK-%o|Ea#DnPU+5nJ>7Oq zEimneknk6N-E=#R>AdB-SmkA>W_jx6HaiSZ^(Gyon+V%a%< zrEK7a1;3a0SI$)MPYVUhTQFf)uUQ2cE6%JjPw=^Syzv^jA*&<$dXw$7A#MzQ;!*U$ zTlm!NKZzi}8+khEb7ecekA>vsZfGwg%e5?8eI@Tn+H&C@U*I5n6+?J8hiz6L+BD9# zu}jQ~h}Q1`uO2>e5ZgV38drfiocM)8fQ?gqYXaBl0lsBDlTrNzh@cPxkqDfnL;%NA z3&bxW7JFt>sXb;gYzzO)K4TRgw%rs71yypQ6ZZMGY%&C(dK?N3Ab1-vSCw~!un$!c zUAa2+}Sf%S{<~;=k4+p+2XZ1fxF<{?Z|T>)!KJQCf83;-ku@thXM^oYwR;W z*ZLnnVj=+5vnPw19O&9PzYbi<22IY2UT=?&w{{+bqxH6vzlmX%Qqj+x#I=c#SK1#B z3|bzCnohYZuk6>8NUV>V#hpu93)G9h)?ZP3OU zf1|4==OUQ`qN7J&dA1TE+~qRi5hUnPQiduQo75btx-Jybjkq1Eive%-m^>XAOr z#%(40gJlz*3R{-cLN^SxpIPZRy}SevFLTlt^wM4E@#$h)^I9V1rq4;sdrZuC#rVoP z;{EeMaa?Us;lD2qRagxaB`;%P`?l4l!3C`4q*h6R381SYSYE3B1C zo$gAGT2rJp-78(jWmk-!S6m{D>RXxK77LiO`kcP%jiVE3>&|9g#tfOzSUc?Y4wbaw zCtoFWS~B1hI=Qs*_pp0!n!U}U@w?K{9bWAnoZHVuKf8E3G^Oygr8-<lD;PS%^4@5Qgz6{OXG-g*oHRBbK=PE zl%eKbXHCFBdq+D*t#($_oI-Fx+Dr5YxKELdH6tG34#q zqoy0e{qh@$4SkkloB<9c;S@zBkcDqvP9sPOs*YQD@o4NN0xm)>n9_lc;@7wg^@*?6 zO{nr}5DzIBuqGWiR7kGaw*kCYc$!U=-&+t^Fu%7TQn!BOxu0}~hn=?eJ4#2epl1|w z3#FCDU3aW2A<~lt3=0UI?_@z=WNAXDl+wAGQV76gSw~fd9BBlaq`X1wrTE*&9gvbt zq!A4bGDhe#KGm0SK(#S6S|!<`t|;n8bIBItYNu@QKjt9^YTjX_|2{wZ0LA7ca9Pni zkBRD73~=2yl&{VKhRLuLIQYeJ0cm{URCo^*7PBGI$R#P z#Mgm~MEmusa4sm~w6cZ@WiFvm&^L@Gbxji$x z12RcI>{mfg|MU~aLbn5mvXi!SRcp~NwrCbd6)jkfO)`Y4MgmK6IWUE`O+bZ?&2zC0 zYtf`tG3!N*36-LSaZ7p63C(mppc>fmC01Bb+rXo}tnaN(W1DI-Km8!1x#(S^*2C={ zEbCCJ%yY^xq$>!?-783$)10(`U|VQ%ttI1)3ZUCW{26aPtT~CfXOd;4N)so20SXi) z-s1(4g&f4ZqT7T2*lg&xMqgG52(N5SqyT7zGJ&9(4M_1BCA1+6>9=O0tjvMCYv-(j zWsPRMu+v*T?;5ci9G2mj^yGQph_2IKwgY2N>HgIA$%E7jc3FXzx)1ewNg9q5;0tcN zsu$>d?1Zc9?klL{XzP$Dmq2jwVniF>EzKznR^m;UlEv;27yCij@Z)rFm_)AaTm{yW z=(5AW_Tz)}PC8#AO`LhbcwR&*KQr}SqaBk#F&_)!yjU+i-{XH!7se|%^x_7ju8`r^Q zJsR=FA7d3({2|chB^(U^G7W4z0Q%_(hJFeWY=n29$|V*GQq*IJe0_!Kk4ESd+8RFwG&2!9tDd2j=UpTyvH{T+9ul@2 zZA%t=iPfX1-h_wMYnL&jY#$vM%MV(;^K&HURamyw4$D2yU-$Kv8|-2)0O|JoYb+Ax z&fyxHIHd(qg`P^o#8tB=nQ&7e!Bf)BSzMU>1H-+B9*+1Q12EoOIz?$MgQ>e!axw3v z`CmHH4ixN7ZJcN!+@;}j(xZb7MD@ySTcefNg(+?x+fQX@MN-BvQRGyk?*;LN3~3%Q zAJX<1qK!EQsRFBh?o1K-3cj%khC2n|6X9=c4-D+>Zhp&T@>DzKI`iq))_UGef2h7% zv7-20Jt$L-t;ZsfGmy_lzz)jm-9t=jC^cyIY?IS)Y%_3IaFFD ze>O~pJSjmTbkY~fqhl_vM?r5;HH8hRLz(rqIEH+Plc5v?ndgAt@Noctaf2Th(NsfX z&Ru5n5S=rQ|K7@n2j@fIpeU@9YX5UV>GV?Dg+=ta2V z?&9VQShK2}vf{we>LAx7tKxYjP)mykkyW9^TXn1aGA?)5`Qx0*E}8e|Fbz5lUhM@qjXyJ{n%!xr8jD%jFa`RDOhy89DufRd zA9@dVg#2Ug;Wkr$XD3fr)@|R0k2)&jfU0pzPq#2SV-@+BLlyUVcX+@M6t_P3T>v$W zZ})T}z|)3)?N2JXSi#;J7mxWC;0FU6OP^rU(uef4;!W3rS8}<+T9<=MeTVUi;!dAe zo8RQv|9h+*wiYFt3l9KrtNPz^eB}Sh@eOROjm=DGt*B`Y^&ItR9F6~->X$3_M5pt? zbljol$yeoAx=-rd&yNkK(mS@&i8PK_x9)D00Vc)9s+20>UmQJca!CPz8tg1}4`<$4 z_2*A2mKqpDU8MGIH)OmSU25FPM+)0@4UsWbi!RZ@b}%QU*AhZ8%MU{j5+6_Rb4d5m z;-hbun!JW-YvDyp!q1T~6wDiaW0-gH#J|wKL9Mz35-eL>UK*oNp@}w`@z98mWKWe+ z;&#!t^8A6>>C{;=NBnw@nEmQwcMigxXT1x1R9iq=7*dQ@fLls;D1z3v7r&_XK%7Dm z?9;FqFpPb(7qZ@_;rF$XLq^YZ-0guC*Xkg77!AZIQn(#9la< zF^-QxDSz!j%RL15eCjO4_(t@FIg;fypmZDP#a@kH+QBAq@qku#>np4mNmebxjt@Un zb+A*w)$YkD^}sz8dF8c##^J-hIRS0pzE2Y_B*9=5=K}@78ny0+V7!2(o~n_Bh|-k9 z8XfLp0jQBd*VMogZrw7Z|Bm~wA$<`TpbrBC0MG;Z{~1y%Ju~aS4XN^m^&Sgy$C4sU zD7?oFp^CS26D-s-k=c6vh9h$MM#L|&&>A*{<>`E9u@!OPE)RYQ`*R_2iySy0vE5Wg zli)k#P)x}oXxDLolunj3@sYF*1xo#F9^h>qSY%q=^$uXyC0l*~1B9ky8>gLSo^#z_ zeN2+n z{21A2248kG7isELpp{}t3eRiVVjD)^@C-wRC}q=tbC}`X^;m!U1XC^}fMpPLr%DzR z&QBm#aoWPyF4;xDQ7E>%jm2JbkT?I?LD%z|1^{w z0xj@&|Cv`LBw`wA>?Z=YXLOXy8gmo6vfy~z@0{zUk8JA-QFj(`c9qjCtbqsuURQQf z!!`0*6C^QFFJM5-8m#a=vFyVgGRm$@{ukauW&5)Y1#XU&UCW*aOx2{nXHFff5+J*n zmZVbn$eYZUeAeeL{o2!&7aD!KRIedD`Q|||z+P~w$6>uI(zFMa%$YStGqN7sl`J*9 zG;0qAtEgrgWCqjSBYqiR^`P>8wCEC+)`p~=Tp7WO+c74m>GfteO)+M>>HRfOCAP;B z-8V0g*wWa9b`q&{3z)8muLxf43|g{vj)g288ROmGY&!O~-$e66cdRXI@60e@1oZf_ z5lf_O?^MqgDflJUy6j3`S#UPoGl{iio|8`JPgrT__T(D-`Y6Vc72>n|ba+uw?BUk6 z)H7D7DqEJEMl;0M4=5WL0orP!ng;e)4KwO2_lp%b9@PUcek&$nHn*;prL+em;Eq|z za~Sb^?H?t}pb#v_I*=pim3SCpZzl^BEDDZg#q%mfMCYt$^##5Tdxy4ufIA*0z-MmA zI71l=_GZJit){%XV-6BAZ_bTE87ZG{M)=J1PPnL#-uDhRsqG(Ir(K`!w2 z5*Y?yu3Pcf++4EQa9Isgk=W8Nya%4!SP5PBf+sevl~l}H{lJT5;Usb@z! zq)a5Lc1^F`^0+O6!E!0zK~88>&bGas)Rsf7p4pD~80gUlWPBSWs{3k3fs~i+=*ThD z={+N1FBmhM{;i@UdoEtm?-J&3NA;iSR2ctI(OJ*lOi$m^=x<6UMDte$(7}K{u@A&w z^-zD}9Uy~i`r(2Gs4K5`_=}ttrn?_ZjHh#}gncmvsJfICwpP1$S+kF2Uc>nELgi_N zER-E%`1YU46*Q;(0{)PWWCdmIS5TdMdFeMjor8&jo(no^p4co;a4oV8ygngcu;z00 z0ptzNfT7aao47M_V3J&+l4sNYt;zq5snU-gQBl8j1OKnOq5e%b8$+i*)G~Ll`SXrS z_@RPa@$dJy+{#oa)hfs-%=+1CF+}iba+A=22B}x7^8LF*GYc$m$$yvrc>i;U{t?J& z9F6Sl^^9%ot!ON53@m6&4J`j1$dzXJ%QRWx!L~o%!}|b3gkF=H?o`2E49f&_U zou1scE}z-28>}(WuFchEEqy%Oy4HEl-bG|3T|0FJ>7Yj(IJR7lxoh7V`K;)>xjAp_ zz1p&I*(6t$4K?C4JsWgfuATLD?f1F6y%jGFIcYZ@HN9RKMO>UTzdNZWRn=%Mjk&dC zK8@9I6YwVN>8Twacy2VU#Z-NHHS^oGy|d42>v_dR^vd~F$Q;cX?FZ~9991fij}R9S=!z#6!g7iuqibU(F);w4vj2kkr>38nBeP*6`{J0dRag;!lKN^V^qe-itOox z$-&y}<&G@hw@1e-2%_EqA-Ol0y6wg6sf+2=r_bj=8zPpD@s?w;_#Q{}v=}RL9(hi( zh!hbmrmF?9mxsZXs+0KSf(U-Wn;pv_`sXNd3gqbt<2r20k1voy%;l&%2t8YFiq#W8 zXRJo$P})0xH^ft%gDu{ZyG!$yg;X^cM6R_qrRxLyD3o+n04r+OicEH64{ z){uBfGF@~y52Ige8;`U?B56~?;J)N6Dm()KgpDTAA(VSh7B_=!SmIleFFui=;SKh% zOZ2T!Ba{6STk2FlQwW5kRQF=Nr*PJBT6@U0hrNP8mt{Z{we0a*`bcc zf9HPwv-Mw>+kYIK{V7_%nWq1*_1}-t{t5Bd<=r3V{HO3!{sHlySLy#m`fHf^I}!@@ z-;w^gIQ%ElU%mMsVd+m Date: Thu, 6 Jul 2023 11:12:13 +0200 Subject: [PATCH 172/883] ref(date): split function and write tests --- .../src/handlers/reporting/top5-selling.ts | 20 +---- services/order/src/lib/date.ts | 28 +++++++ services/order/src/tests/date.test.ts | 77 +++++++++++++++++++ services/order/src/types/index.d.ts | 2 + services/order/src/types/reporting.d.ts | 4 +- 5 files changed, 112 insertions(+), 19 deletions(-) create mode 100644 services/order/src/lib/date.ts create mode 100644 services/order/src/tests/date.test.ts diff --git a/services/order/src/handlers/reporting/top5-selling.ts b/services/order/src/handlers/reporting/top5-selling.ts index 5f9b46a2..06632017 100644 --- a/services/order/src/handlers/reporting/top5-selling.ts +++ b/services/order/src/handlers/reporting/top5-selling.ts @@ -6,9 +6,7 @@ import { ProductCount, } from "@order/types/reporting"; import { Data } from "@order/types"; - -const HOUR_IN_MS = 60 * 60 * 1000; -const DAY_IN_MS = 24 * HOUR_IN_MS; +import { fromInterval } from "@order/lib/date"; export const GetTop5SellingProducts = async ( { request }: Data, @@ -16,20 +14,7 @@ export const GetTop5SellingProducts = async ( ) => { try { const { date, restaurant_id, interval } = request; - - const end = date - ? new Date(date + " 23:59:59") - : new Date(new Date().setHours(23, 59, 59, 999)); - - const start = // end - interval - interval === "1w" - ? new Date(end.getTime() - 7 * DAY_IN_MS) - : interval === "1m" - ? new Date(end.getTime() - 30 * DAY_IN_MS) - : interval === "1y" - ? new Date(end.getTime() - 365 * DAY_IN_MS) - : // default to 1w - new Date(end.getTime() - 7 * DAY_IN_MS); + const { start, end } = fromInterval(interval, date); const orders = await prisma.order.findMany({ where: { restaurant_id, created_at: { gte: start, lte: end } }, @@ -53,7 +38,6 @@ export const GetTop5SellingProducts = async ( .sort((a, b) => b.count - a.count) .slice(0, 5); - callback(null, { products_count, }); diff --git a/services/order/src/lib/date.ts b/services/order/src/lib/date.ts new file mode 100644 index 00000000..7211f067 --- /dev/null +++ b/services/order/src/lib/date.ts @@ -0,0 +1,28 @@ +import { Interval } from "@order/types"; + +const HOUR_IN_MS = 60 * 60 * 1000; +const DAY_IN_MS = 24 * HOUR_IN_MS; + +export const fromInterval = ( + interval: Interval, + date?: string +): { + start: Date; + end: Date; +} => { + const end = date + ? new Date(date + " 23:59:59") + : new Date(new Date().setHours(23, 59, 59, 999)); + + const start = // end - interval + interval === "1w" + ? new Date(end.getTime() - 7 * DAY_IN_MS) + : interval === "1m" + ? new Date(end.getTime() - 30 * DAY_IN_MS) + : interval === "1y" + ? new Date(end.getTime() - 365 * DAY_IN_MS) + : // default to 1w + new Date(end.getTime() - 7 * DAY_IN_MS); + + return { start, end }; +}; diff --git a/services/order/src/tests/date.test.ts b/services/order/src/tests/date.test.ts new file mode 100644 index 00000000..8eb1f73c --- /dev/null +++ b/services/order/src/tests/date.test.ts @@ -0,0 +1,77 @@ +import { fromInterval } from "@order/lib/date"; +import { Interval } from "@order/types"; +import { assert, describe, it, vitest } from "vitest"; + +const HOUR_IN_MS = 60 * 60 * 1000; +const DAY_IN_MS = 24 * HOUR_IN_MS; + +// fake current date + +describe("tests@goodfood/order.date.fromInterval", function () { + it('should return start and end dates for interval "1w"', (t) => { + const interval = "1w"; + const date = "2023-07-01"; + const expected = { + start: new Date("2023-06-24 23:59:59"), + end: new Date("2023-07-01 23:59:59"), + }; + const result = fromInterval(interval, date); + assert.deepEqual(result, expected); + }); + + it('should return start and end dates for interval "1m"', (t) => { + const interval = "1m"; + const date = "2023-07-01"; + const expected = { + start: new Date("2023-06-01 23:59:59"), + end: new Date("2023-07-01 23:59:59"), + }; + const result = fromInterval(interval, date); + assert.deepEqual(result, expected); + }); + + it('should return start and end dates for interval "1y"', (t) => { + const interval = "1y"; + const date = "2023-07-01"; + const expected = { + start: new Date("2022-07-01 23:59:59"), + end: new Date("2023-07-01 23:59:59"), + }; + const result = fromInterval(interval, date); + assert.deepEqual(result, expected); + }); + + it('should return start and end dates with default interval "1w"', (t) => { + const interval = "invalid-interval"; + const date = "2023-07-01"; + const expected = { + start: new Date("2023-06-24 23:59:59"), + end: new Date("2023-07-01 23:59:59"), + }; + const result = fromInterval(interval as Interval, date); + assert.deepEqual(result, expected); + }); + + it("should return current date as end date when no date parameter is provided", (t) => { + const interval = "1w"; + const expectedEnd = new Date(); + expectedEnd.setHours(23, 59, 59, 999); + + const result = fromInterval(interval, undefined); + assert.deepEqual(result.end, expectedEnd); + }); + + it("should return start date based on the current date when no date parameter is provided", (t) => { + const interval = "1w"; + const date = new Date("2023-07-01 13:37"); + vitest.setSystemTime(date); + + const currentDate = new Date(); + const expectedStart = new Date( + new Date(currentDate.getTime() - 7 * DAY_IN_MS).setHours(23, 59, 59, 999) + ); + + const result = fromInterval(interval, undefined); + assert.deepEqual(result.start, expectedStart); + }); +}); diff --git a/services/order/src/types/index.d.ts b/services/order/src/types/index.d.ts index edf2bebf..51abc373 100644 --- a/services/order/src/types/index.d.ts +++ b/services/order/src/types/index.d.ts @@ -1,3 +1,5 @@ export type Data = { request: T; }; + +export type Interval = "1w" | "1m" | "1y"; \ No newline at end of file diff --git a/services/order/src/types/reporting.d.ts b/services/order/src/types/reporting.d.ts index 7f332dcd..922a47be 100644 --- a/services/order/src/types/reporting.d.ts +++ b/services/order/src/types/reporting.d.ts @@ -1,3 +1,5 @@ +import { Interval } from "@order/types"; + export type GetOrdersAffluenceRequest = { date: string; restaurant_id: string; @@ -14,7 +16,7 @@ export type GetOrdersAffluenceResponse = { export type GetTop5SellingProductsRequest = { date?: string; - interval: "1w" | "1m" | "1y"; + interval: Interval; restaurant_id: string; }; From 5520bafd741dfae14ef08aa975feede0e04caad3 Mon Sep 17 00:00:00 2001 From: Pierre Lebigre Date: Thu, 6 Jul 2023 11:14:45 +0200 Subject: [PATCH 173/883] Test send log to Florian machine --- services/product/README.md | 5 +++-- services/product/src/middleware/log.ts | 2 +- services/product/terraform/outputs.tf | 2 +- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/services/product/README.md b/services/product/README.md index 933e23a9..f07e1735 100644 --- a/services/product/README.md +++ b/services/product/README.md @@ -34,6 +34,7 @@ - `DeleteProduct`: Deletes a product by its ID. - `GetProductList`: Retrieves all product. - `GetProductTypeList`: Retrieves all product type. + - `UploadImage` : Return url for an image in base64 format. ## Requirements @@ -85,7 +86,7 @@ Connect to your azure acount. az login ``` -Go in the (./terraform) then plan and apply your terraform. When it's done export your output in the app's .env file. +Go in the [terraform](./terraform) then plan and apply your terraform. When it's done export your output in the app's .env file. ``` terraform plan -out="tf.plan" terraform apply "tf.plan" @@ -93,7 +94,7 @@ terraform output > ../.env ``` Check if the AMQP_URL value is good. -Then go to ./prisma to migrate your table schema in your azure database. +Then go to [terraform](./prisma) to migrate your table schema in your azure database. ``` npx prisma migrate dev --name init ``` diff --git a/services/product/src/middleware/log.ts b/services/product/src/middleware/log.ts index 9fd255cc..fd54a9f8 100644 --- a/services/product/src/middleware/log.ts +++ b/services/product/src/middleware/log.ts @@ -37,6 +37,6 @@ export const logGRPC = async (ctx: Context, next: () => Promise) => { const responseAt = new Date(); let { request, path } = parseContext(ctx); path = path?.split('.').at(-1) || ''; - //publish({ request, path }, "log"); + publish({ request, path }, "log"); log.debug(msg("GRPC", path, requestAt, responseAt), JSON.stringify(request)); }; \ No newline at end of file diff --git a/services/product/terraform/outputs.tf b/services/product/terraform/outputs.tf index b61521ea..67771549 100644 --- a/services/product/terraform/outputs.tf +++ b/services/product/terraform/outputs.tf @@ -16,5 +16,5 @@ output "PORT" { } output "AMQP_URL"{ - value = "AMQP_URL=amqp://guest:guest@localhost" + value = "amqp://guest:guest@localhost" } \ No newline at end of file From 81bae9660dd7407879b530f00ffff81c4f83b8f8 Mon Sep 17 00:00:00 2001 From: anatole Date: Thu, 6 Jul 2023 11:22:48 +0200 Subject: [PATCH 174/883] feat(user service): fix register route --- services/proto/user.pb.go | 288 ++++++++++---------- services/proto/user.proto | 13 +- services/user/src/pkg/db/init/initialize.go | 6 +- services/user/src/pkg/mapper/userMapper.go | 20 ++ services/user/src/pkg/services/auth.go | 13 +- 5 files changed, 187 insertions(+), 153 deletions(-) diff --git a/services/proto/user.pb.go b/services/proto/user.pb.go index a3269fa5..25a47900 100644 --- a/services/proto/user.pb.go +++ b/services/proto/user.pb.go @@ -492,10 +492,11 @@ type MainAddressInput struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Street string `protobuf:"bytes,1,opt,name=street,proto3" json:"street,omitempty"` - ZipCode string `protobuf:"bytes,2,opt,name=zipCode,proto3" json:"zipCode,omitempty"` - Country string `protobuf:"bytes,3,opt,name=country,proto3" json:"country,omitempty"` - Coordinates []int32 `protobuf:"varint,4,rep,packed,name=coordinates,proto3" json:"coordinates,omitempty"` + Street string `protobuf:"bytes,1,opt,name=street,proto3" json:"street,omitempty"` + ZipCode string `protobuf:"bytes,2,opt,name=zipCode,proto3" json:"zipCode,omitempty"` + Country string `protobuf:"bytes,3,opt,name=country,proto3" json:"country,omitempty"` + Lat float32 `protobuf:"fixed32,4,opt,name=lat,proto3" json:"lat,omitempty"` + Lng float32 `protobuf:"fixed32,5,opt,name=lng,proto3" json:"lng,omitempty"` } func (x *MainAddressInput) Reset() { @@ -551,11 +552,18 @@ func (x *MainAddressInput) GetCountry() string { return "" } -func (x *MainAddressInput) GetCoordinates() []int32 { +func (x *MainAddressInput) GetLat() float32 { if x != nil { - return x.Coordinates + return x.Lat } - return nil + return 0 +} + +func (x *MainAddressInput) GetLng() float32 { + if x != nil { + return x.Lng + } + return 0 } type RoleInput struct { @@ -1496,152 +1504,152 @@ var file_user_proto_rawDesc = []byte{ 0x73, 0x73, 0x12, 0x30, 0x0a, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x52, 0x04, - 0x72, 0x6f, 0x6c, 0x65, 0x22, 0x80, 0x01, 0x0a, 0x10, 0x4d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, + 0x72, 0x6f, 0x6c, 0x65, 0x22, 0x82, 0x01, 0x0a, 0x10, 0x4d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x72, 0x65, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x72, 0x65, 0x65, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x7a, 0x69, 0x70, 0x43, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x7a, 0x69, 0x70, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, - 0x75, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x69, 0x6e, - 0x61, 0x74, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x05, 0x52, 0x0b, 0x63, 0x6f, 0x6f, 0x72, - 0x64, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x73, 0x22, 0x1f, 0x0a, 0x09, 0x52, 0x6f, 0x6c, 0x65, 0x49, - 0x6e, 0x70, 0x75, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x22, 0x18, 0x0a, 0x06, 0x55, 0x73, 0x65, 0x72, - 0x49, 0x64, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x02, - 0x69, 0x64, 0x22, 0x4f, 0x0a, 0x08, 0x55, 0x73, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x14, - 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, - 0x72, 0x72, 0x6f, 0x72, 0x12, 0x2d, 0x0a, 0x05, 0x75, 0x73, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, - 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x05, 0x75, 0x73, - 0x65, 0x72, 0x73, 0x22, 0x56, 0x0a, 0x0a, 0x6c, 0x6f, 0x67, 0x49, 0x6e, 0x49, 0x6e, 0x70, 0x75, - 0x74, 0x12, 0x16, 0x0a, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x04, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6d, 0x61, - 0x69, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x12, - 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x22, 0x25, 0x0a, 0x0d, 0x76, - 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x12, 0x14, 0x0a, 0x05, - 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, - 0x65, 0x6e, 0x22, 0x3b, 0x0a, 0x0b, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x49, 0x6e, 0x70, 0x75, - 0x74, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, - 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x22, - 0x40, 0x0a, 0x10, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x75, 0x73, 0x65, + 0x75, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6c, 0x61, 0x74, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x02, 0x52, 0x03, 0x6c, 0x61, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6c, 0x6e, 0x67, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x02, 0x52, 0x03, 0x6c, 0x6e, 0x67, 0x22, 0x1f, 0x0a, 0x09, 0x52, 0x6f, 0x6c, + 0x65, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x22, 0x18, 0x0a, 0x06, 0x55, 0x73, + 0x65, 0x72, 0x49, 0x64, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, + 0x52, 0x02, 0x69, 0x64, 0x22, 0x4f, 0x0a, 0x08, 0x55, 0x73, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, + 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x2d, 0x0a, 0x05, 0x75, 0x73, 0x65, 0x72, 0x73, 0x18, + 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, + 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x05, + 0x75, 0x73, 0x65, 0x72, 0x73, 0x22, 0x56, 0x0a, 0x0a, 0x6c, 0x6f, 0x67, 0x49, 0x6e, 0x49, 0x6e, + 0x70, 0x75, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x04, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x65, + 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, + 0x6c, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x22, 0x25, 0x0a, + 0x0d, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x12, 0x14, + 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, + 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x3b, 0x0a, 0x0b, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x49, 0x6e, + 0x70, 0x75, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, - 0x64, 0x22, 0x52, 0x0a, 0x0d, 0x6c, 0x6f, 0x67, 0x49, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x2b, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x17, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, - 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x12, - 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x6f, 0x0a, 0x13, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, - 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x12, 0x14, 0x0a, 0x05, - 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, - 0x65, 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x6f, 0x6c, 0x64, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, - 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x6f, 0x6c, 0x64, 0x50, 0x61, 0x73, 0x73, - 0x77, 0x6f, 0x72, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x6e, 0x65, 0x77, 0x50, 0x61, 0x73, 0x73, 0x77, - 0x6f, 0x72, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x6e, 0x65, 0x77, 0x50, 0x61, - 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x22, 0x59, 0x0a, 0x14, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, - 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x2b, - 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, - 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, - 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x65, - 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, - 0x72, 0x22, 0x5b, 0x0a, 0x0f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x49, - 0x6e, 0x70, 0x75, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x75, 0x73, - 0x65, 0x72, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, - 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x43, 0x6f, 0x64, 0x65, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x43, 0x6f, 0x64, 0x65, 0x22, 0x55, - 0x0a, 0x10, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x4f, 0x75, 0x74, 0x70, - 0x75, 0x74, 0x12, 0x2b, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x17, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, - 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x12, - 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x55, 0x0a, 0x10, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, - 0x6f, 0x6c, 0x65, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x2b, 0x0a, 0x04, 0x75, 0x73, 0x65, - 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, - 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, - 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x1f, 0x0a, 0x0d, - 0x4d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x49, 0x64, 0x12, 0x0e, 0x0a, - 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x02, 0x69, 0x64, 0x22, 0x70, 0x0a, - 0x16, 0x4d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x55, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x40, 0x0a, - 0x0b, 0x6d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, - 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x4d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, - 0x73, 0x73, 0x52, 0x0b, 0x6d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x22, - 0x71, 0x0a, 0x17, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, - 0x72, 0x65, 0x73, 0x73, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x40, 0x0a, 0x0b, 0x6d, 0x61, - 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1e, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, - 0x73, 0x65, 0x72, 0x2e, 0x4d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, - 0x0b, 0x6d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x14, 0x0a, 0x05, - 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, - 0x6f, 0x72, 0x32, 0xef, 0x05, 0x0a, 0x0b, 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x12, 0x4f, 0x0a, 0x08, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x12, 0x22, - 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, - 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x70, - 0x75, 0x74, 0x1a, 0x1d, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, - 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x4f, 0x75, 0x74, 0x70, 0x75, - 0x74, 0x22, 0x00, 0x12, 0x45, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x12, 0x19, + 0x64, 0x22, 0x40, 0x0a, 0x10, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x75, + 0x73, 0x65, 0x72, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x75, 0x73, 0x65, + 0x72, 0x49, 0x64, 0x22, 0x52, 0x0a, 0x0d, 0x6c, 0x6f, 0x67, 0x49, 0x6e, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2b, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, + 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x04, 0x75, 0x73, 0x65, + 0x72, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x6f, 0x0a, 0x13, 0x63, 0x68, 0x61, 0x6e, 0x67, + 0x65, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x12, 0x14, + 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, + 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x6f, 0x6c, 0x64, 0x50, 0x61, 0x73, 0x73, 0x77, + 0x6f, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x6f, 0x6c, 0x64, 0x50, 0x61, + 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x6e, 0x65, 0x77, 0x50, 0x61, 0x73, + 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x6e, 0x65, 0x77, + 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x22, 0x59, 0x0a, 0x14, 0x63, 0x68, 0x61, 0x6e, + 0x67, 0x65, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, + 0x12, 0x2b, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, - 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x49, 0x64, 0x1a, 0x1d, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, + 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x12, 0x14, 0x0a, + 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, + 0x72, 0x6f, 0x72, 0x22, 0x5b, 0x0a, 0x0f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x6f, 0x6c, + 0x65, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x16, 0x0a, 0x06, + 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x75, 0x73, + 0x65, 0x72, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x43, 0x6f, 0x64, 0x65, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x43, 0x6f, 0x64, 0x65, + 0x22, 0x55, 0x0a, 0x10, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x4f, 0x75, + 0x74, 0x70, 0x75, 0x74, 0x12, 0x2b, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, + 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x04, 0x75, 0x73, 0x65, + 0x72, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x55, 0x0a, 0x10, 0x63, 0x68, 0x61, 0x6e, 0x67, + 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x2b, 0x0a, 0x04, 0x75, + 0x73, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, 0x73, - 0x65, 0x72, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x51, 0x0a, 0x0a, 0x55, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x12, 0x22, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, - 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x1d, 0x2e, 0x63, - 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, - 0x2e, 0x55, 0x73, 0x65, 0x72, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x53, 0x0a, - 0x0a, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x12, 0x1e, 0x2e, 0x63, 0x6f, + 0x65, 0x72, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, + 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x1f, + 0x0a, 0x0d, 0x4d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x49, 0x64, 0x12, + 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x02, 0x69, 0x64, 0x22, + 0x70, 0x0a, 0x16, 0x4d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, + 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x12, + 0x40, 0x0a, 0x0b, 0x6d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, + 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x4d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, + 0x72, 0x65, 0x73, 0x73, 0x52, 0x0b, 0x6d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, + 0x73, 0x22, 0x71, 0x0a, 0x17, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x69, 0x6e, 0x41, + 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x40, 0x0a, 0x0b, + 0x6d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1e, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, + 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x4d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, + 0x73, 0x52, 0x0b, 0x6d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x14, + 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, + 0x72, 0x72, 0x6f, 0x72, 0x32, 0xef, 0x05, 0x0a, 0x0b, 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x12, 0x4f, 0x0a, 0x08, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, + 0x12, 0x22, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, + 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x49, + 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x1d, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, + 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x4f, 0x75, 0x74, + 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x45, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, + 0x12, 0x19, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, + 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x49, 0x64, 0x1a, 0x1d, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, - 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x23, 0x2e, 0x63, 0x6f, - 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, - 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, - 0x22, 0x00, 0x12, 0x41, 0x0a, 0x08, 0x4c, 0x69, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, 0x12, 0x16, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1b, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, - 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x4c, - 0x69, 0x73, 0x74, 0x22, 0x00, 0x12, 0x4a, 0x0a, 0x05, 0x4c, 0x6f, 0x67, 0x49, 0x6e, 0x12, 0x1d, + 0x55, 0x73, 0x65, 0x72, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x51, 0x0a, 0x0a, + 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x12, 0x22, 0x2e, 0x63, 0x6f, 0x6d, + 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x1d, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, - 0x65, 0x72, 0x2e, 0x6c, 0x6f, 0x67, 0x49, 0x6e, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x20, 0x2e, + 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, + 0x53, 0x0a, 0x0a, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x12, 0x1e, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, - 0x72, 0x2e, 0x6c, 0x6f, 0x67, 0x49, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x00, 0x12, 0x53, 0x0a, 0x08, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x12, 0x20, 0x2e, + 0x72, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x23, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, - 0x72, 0x2e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, + 0x72, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x4f, 0x75, 0x74, 0x70, + 0x75, 0x74, 0x22, 0x00, 0x12, 0x41, 0x0a, 0x08, 0x4c, 0x69, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, + 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1b, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, + 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, + 0x72, 0x4c, 0x69, 0x73, 0x74, 0x22, 0x00, 0x12, 0x4a, 0x0a, 0x05, 0x4c, 0x6f, 0x67, 0x49, 0x6e, + 0x12, 0x1d, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, + 0x75, 0x73, 0x65, 0x72, 0x2e, 0x6c, 0x6f, 0x67, 0x49, 0x6e, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, + 0x20, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, + 0x73, 0x65, 0x72, 0x2e, 0x6c, 0x6f, 0x67, 0x49, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x00, 0x12, 0x53, 0x0a, 0x08, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x12, + 0x20, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, + 0x73, 0x65, 0x72, 0x2e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x70, 0x75, + 0x74, 0x1a, 0x23, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, + 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x63, 0x0a, 0x0e, 0x43, 0x68, 0x61, 0x6e, + 0x67, 0x65, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x26, 0x2e, 0x63, 0x6f, 0x6d, + 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x63, + 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x49, 0x6e, 0x70, + 0x75, 0x74, 0x1a, 0x27, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, + 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x61, 0x73, + 0x73, 0x77, 0x6f, 0x72, 0x64, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x57, 0x0a, + 0x0a, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x12, 0x22, 0x2e, 0x63, 0x6f, + 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, + 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x23, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, - 0x73, 0x65, 0x72, 0x2e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x63, 0x0a, 0x0e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, - 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x26, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, - 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x63, 0x68, 0x61, - 0x6e, 0x67, 0x65, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x49, 0x6e, 0x70, 0x75, 0x74, - 0x1a, 0x27, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, - 0x75, 0x73, 0x65, 0x72, 0x2e, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x61, 0x73, 0x73, 0x77, - 0x6f, 0x72, 0x64, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0a, 0x43, - 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x12, 0x22, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, - 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x63, 0x68, - 0x61, 0x6e, 0x67, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x23, 0x2e, - 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, - 0x72, 0x2e, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x4f, 0x75, 0x74, 0x70, - 0x75, 0x74, 0x22, 0x00, 0x32, 0xd8, 0x01, 0x0a, 0x12, 0x4d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, - 0x72, 0x65, 0x73, 0x73, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x54, 0x0a, 0x0e, 0x47, - 0x65, 0x74, 0x4d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x20, 0x2e, - 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, - 0x72, 0x2e, 0x4d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x49, 0x64, 0x1a, - 0x1e, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, - 0x73, 0x65, 0x72, 0x2e, 0x4d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x22, - 0x00, 0x12, 0x6c, 0x0a, 0x11, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x69, 0x6e, 0x41, - 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x29, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, - 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x4d, 0x61, 0x69, 0x6e, 0x41, - 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x70, 0x75, - 0x74, 0x1a, 0x2a, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, - 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x69, 0x6e, - 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x42, - 0x03, 0x5a, 0x01, 0x2e, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x73, 0x65, 0x72, 0x2e, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x4f, 0x75, + 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x32, 0xd8, 0x01, 0x0a, 0x12, 0x4d, 0x61, 0x69, 0x6e, 0x41, + 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x54, 0x0a, + 0x0e, 0x47, 0x65, 0x74, 0x4d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, + 0x20, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, + 0x73, 0x65, 0x72, 0x2e, 0x4d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x49, + 0x64, 0x1a, 0x1e, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, + 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x4d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, + 0x73, 0x22, 0x00, 0x12, 0x6c, 0x0a, 0x11, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x69, + 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x29, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, + 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x4d, 0x61, 0x69, + 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x49, 0x6e, + 0x70, 0x75, 0x74, 0x1a, 0x2a, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, + 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x61, + 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, + 0x00, 0x42, 0x03, 0x5a, 0x01, 0x2e, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/services/proto/user.proto b/services/proto/user.proto index d131061e..f9d21c15 100644 --- a/services/proto/user.proto +++ b/services/proto/user.proto @@ -70,12 +70,13 @@ message UserCreateInput { RoleInput role = 7; } -message MainAddressInput { - string street = 1; - string zipCode = 2; - string country = 3; - repeated int32 coordinates = 4; -} + message MainAddressInput { + string street = 1; + string zipCode = 2; + string country = 3; + float lat = 4; + float lng = 5; + } message RoleInput { string code = 1; diff --git a/services/user/src/pkg/db/init/initialize.go b/services/user/src/pkg/db/init/initialize.go index defdc67d..154c4fbc 100644 --- a/services/user/src/pkg/db/init/initialize.go +++ b/services/user/src/pkg/db/init/initialize.go @@ -43,15 +43,15 @@ func InitRoles(handler db.Handler) error { }, { Label: "User", - Code: "user", + Code: "USER", }, { Label: "Accountant", - Code: "accountant", + Code: "ACCOUNTANT", }, { Label: "Deliverer", - Code: "deliverer", + Code: "DELIVERER", }, } diff --git a/services/user/src/pkg/mapper/userMapper.go b/services/user/src/pkg/mapper/userMapper.go index 33e7486a..ab7ae3ad 100644 --- a/services/user/src/pkg/mapper/userMapper.go +++ b/services/user/src/pkg/mapper/userMapper.go @@ -60,6 +60,26 @@ func ToModelUser(user *pb.User) *models.User { } } +func InputToModelUser(user *pb.UserCreateInput) *models.User { + return &models.User{ + FirstName: user.FirstName, + LastName: user.LastName, + Email: user.Email, + Phone: user.Phone, + MainAddress: *InputToModelMainAddress(user.MainAddress), + } +} + +func InputToModelMainAddress(address *pb.MainAddressInput) *models.MainAddress { + return &models.MainAddress{ + Street: address.Street, + ZipCode: address.ZipCode, + Country: address.Country, + Lat: address.Lat, + Lng: address.Lng, + } +} + func ToModelMainAddress(address *pb.MainAddress) *models.MainAddress { return &models.MainAddress{ Id: address.Id, diff --git a/services/user/src/pkg/services/auth.go b/services/user/src/pkg/services/auth.go index e363004b..0d372af0 100644 --- a/services/user/src/pkg/services/auth.go +++ b/services/user/src/pkg/services/auth.go @@ -16,19 +16,24 @@ type Server struct { } func (s *Server) Register(_ context.Context, req *pb.UserCreateInput) (*pb.UserOutput, error) { - var user models.User + var role models.Role - if result := s.H.DB.Where(&models.User{Email: req.Email}).First(&user); result.Error != nil { - return nil, result.Error + if result := s.H.DB.Where(&models.User{Email: req.Email}).First(models.User{}); result.RowsAffected > 0 { + return &pb.UserOutput{ + Error: "User already exists", + }, nil } + s.H.DB.Where(&models.Role{Code: req.Role.Code}).First(&role) + user := mapper.InputToModelUser(req) user.Email = req.Email user.Password = utils.HashPassword(req.Password) + user.RoleId = role.Id s.H.DB.Create(&user) return &pb.UserOutput{ - User: mapper.ToProtoUser(&user), + User: mapper.ToProtoUser(user), }, nil } From d7c4995b9305c7467e71a70480eb266b3f721627 Mon Sep 17 00:00:00 2001 From: Florian Leroux <10078837+floriaaan@users.noreply.github.com> Date: Thu, 6 Jul 2023 11:22:58 +0200 Subject: [PATCH 175/883] doc(readme): change service for delivery_type metric --- services/reporting/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/reporting/README.md b/services/reporting/README.md index 1b769d7c..ab0519c6 100644 --- a/services/reporting/README.md +++ b/services/reporting/README.md @@ -55,7 +55,7 @@ You can use the following tools to help you with the setup: | outcomes\_ | 1d \| 1w \| 1m \| 1y | number | Stock | Sum of restock prices | | top5_selling\_ | 1w \| 1m | string[] (product.id) | Order | Top 5 selling products | | affluence\_ | 1d | number[] | Order | Number of orders by hour | -| delivery_types\_ | 1d | enum[] () | Payment | Number of orders by delivery type | +| delivery_types\_ | 1d | enum | Order | Number of orders by delivery type | | rejection_rate\_ | 1d | number | Notification | Rate of rejected orders | ## Testing From eeb10f9a817914e21004a5b784770110f3739158 Mon Sep 17 00:00:00 2001 From: anatole Date: Thu, 6 Jul 2023 11:38:48 +0200 Subject: [PATCH 176/883] feat(user service): fix logIn route --- services/proto/user.pb.go | 260 ++++++++++++------------- services/proto/user.proto | 2 +- services/user/src/pkg/services/auth.go | 6 +- 3 files changed, 134 insertions(+), 134 deletions(-) diff --git a/services/proto/user.pb.go b/services/proto/user.pb.go index 25a47900..fa698977 100644 --- a/services/proto/user.pb.go +++ b/services/proto/user.pb.go @@ -720,7 +720,6 @@ type LogInInput struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - UserId uint64 `protobuf:"varint,1,opt,name=userId,proto3" json:"userId,omitempty"` Email string `protobuf:"bytes,2,opt,name=email,proto3" json:"email,omitempty"` Password string `protobuf:"bytes,3,opt,name=password,proto3" json:"password,omitempty"` } @@ -757,13 +756,6 @@ func (*LogInInput) Descriptor() ([]byte, []int) { return file_user_proto_rawDescGZIP(), []int{10} } -func (x *LogInInput) GetUserId() uint64 { - if x != nil { - return x.UserId - } - return 0 -} - func (x *LogInInput) GetEmail() string { if x != nil { return x.Email @@ -942,6 +934,7 @@ type LogInResponse struct { User *User `protobuf:"bytes,1,opt,name=user,proto3" json:"user,omitempty"` Token string `protobuf:"bytes,2,opt,name=token,proto3" json:"token,omitempty"` + Error string `protobuf:"bytes,3,opt,name=error,proto3" json:"error,omitempty"` } func (x *LogInResponse) Reset() { @@ -990,6 +983,13 @@ func (x *LogInResponse) GetToken() string { return "" } +func (x *LogInResponse) GetError() string { + if x != nil { + return x.Error + } + return "" +} + type ChangePasswordInput struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1521,135 +1521,135 @@ var file_user_proto_rawDesc = []byte{ 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x2d, 0x0a, 0x05, 0x75, 0x73, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x05, - 0x75, 0x73, 0x65, 0x72, 0x73, 0x22, 0x56, 0x0a, 0x0a, 0x6c, 0x6f, 0x67, 0x49, 0x6e, 0x49, 0x6e, - 0x70, 0x75, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x04, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x65, - 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, - 0x6c, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x22, 0x25, 0x0a, - 0x0d, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x12, 0x14, - 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, - 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x3b, 0x0a, 0x0b, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x49, 0x6e, - 0x70, 0x75, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x75, 0x73, 0x65, - 0x72, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, - 0x64, 0x22, 0x40, 0x0a, 0x10, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x75, - 0x73, 0x65, 0x72, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x75, 0x73, 0x65, - 0x72, 0x49, 0x64, 0x22, 0x52, 0x0a, 0x0d, 0x6c, 0x6f, 0x67, 0x49, 0x6e, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2b, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, - 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x04, 0x75, 0x73, 0x65, - 0x72, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x6f, 0x0a, 0x13, 0x63, 0x68, 0x61, 0x6e, 0x67, - 0x65, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x12, 0x14, - 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, - 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x6f, 0x6c, 0x64, 0x50, 0x61, 0x73, 0x73, 0x77, - 0x6f, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x6f, 0x6c, 0x64, 0x50, 0x61, - 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x6e, 0x65, 0x77, 0x50, 0x61, 0x73, - 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x6e, 0x65, 0x77, - 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x22, 0x59, 0x0a, 0x14, 0x63, 0x68, 0x61, 0x6e, - 0x67, 0x65, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, - 0x12, 0x2b, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, - 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, - 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x12, 0x14, 0x0a, - 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, - 0x72, 0x6f, 0x72, 0x22, 0x5b, 0x0a, 0x0f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x6f, 0x6c, + 0x75, 0x73, 0x65, 0x72, 0x73, 0x22, 0x3e, 0x0a, 0x0a, 0x6c, 0x6f, 0x67, 0x49, 0x6e, 0x49, 0x6e, + 0x70, 0x75, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, + 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x73, + 0x73, 0x77, 0x6f, 0x72, 0x64, 0x22, 0x25, 0x0a, 0x0d, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x16, 0x0a, 0x06, - 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x75, 0x73, - 0x65, 0x72, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x43, 0x6f, 0x64, 0x65, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x43, 0x6f, 0x64, 0x65, - 0x22, 0x55, 0x0a, 0x10, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x4f, 0x75, - 0x74, 0x70, 0x75, 0x74, 0x12, 0x2b, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, - 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x04, 0x75, 0x73, 0x65, - 0x72, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x55, 0x0a, 0x10, 0x63, 0x68, 0x61, 0x6e, 0x67, - 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x2b, 0x0a, 0x04, 0x75, - 0x73, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x3b, 0x0a, 0x0b, + 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x74, + 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, + 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x04, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x22, 0x40, 0x0a, 0x10, 0x76, 0x61, 0x6c, + 0x69, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, + 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, + 0x72, 0x6f, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x04, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x22, 0x68, 0x0a, 0x0d, 0x6c, + 0x6f, 0x67, 0x49, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2b, 0x0a, 0x04, + 0x75, 0x73, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6f, 0x6d, + 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, + 0x73, 0x65, 0x72, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, + 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x12, + 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x6f, 0x0a, 0x13, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, + 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x12, 0x14, 0x0a, 0x05, + 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, + 0x65, 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x6f, 0x6c, 0x64, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, + 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x6f, 0x6c, 0x64, 0x50, 0x61, 0x73, 0x73, + 0x77, 0x6f, 0x72, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x6e, 0x65, 0x77, 0x50, 0x61, 0x73, 0x73, 0x77, + 0x6f, 0x72, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x6e, 0x65, 0x77, 0x50, 0x61, + 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x22, 0x59, 0x0a, 0x14, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, + 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x2b, + 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, + 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, + 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x65, + 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, + 0x72, 0x22, 0x5b, 0x0a, 0x0f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x49, + 0x6e, 0x70, 0x75, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x75, 0x73, + 0x65, 0x72, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, + 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x43, 0x6f, 0x64, 0x65, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x43, 0x6f, 0x64, 0x65, 0x22, 0x55, + 0x0a, 0x10, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x4f, 0x75, 0x74, 0x70, + 0x75, 0x74, 0x12, 0x2b, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x17, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, + 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x12, + 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x55, 0x0a, 0x10, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, + 0x6f, 0x6c, 0x65, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x2b, 0x0a, 0x04, 0x75, 0x73, 0x65, + 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, + 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, + 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x1f, 0x0a, 0x0d, + 0x4d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x49, 0x64, 0x12, 0x0e, 0x0a, + 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x02, 0x69, 0x64, 0x22, 0x70, 0x0a, + 0x16, 0x4d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x55, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x40, 0x0a, + 0x0b, 0x6d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, + 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x4d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, + 0x73, 0x73, 0x52, 0x0b, 0x6d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x22, + 0x71, 0x0a, 0x17, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, + 0x72, 0x65, 0x73, 0x73, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x40, 0x0a, 0x0b, 0x6d, 0x61, + 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1e, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, + 0x73, 0x65, 0x72, 0x2e, 0x4d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, + 0x0b, 0x6d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x14, 0x0a, 0x05, + 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, + 0x6f, 0x72, 0x32, 0xef, 0x05, 0x0a, 0x0b, 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x12, 0x4f, 0x0a, 0x08, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x12, 0x22, + 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, + 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x70, + 0x75, 0x74, 0x1a, 0x1d, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, + 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x4f, 0x75, 0x74, 0x70, 0x75, + 0x74, 0x22, 0x00, 0x12, 0x45, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x12, 0x19, + 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, + 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x49, 0x64, 0x1a, 0x1d, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, 0x73, - 0x65, 0x72, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, - 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x1f, - 0x0a, 0x0d, 0x4d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x49, 0x64, 0x12, - 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x02, 0x69, 0x64, 0x22, - 0x70, 0x0a, 0x16, 0x4d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x55, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, - 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x12, - 0x40, 0x0a, 0x0b, 0x6d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, - 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x4d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, - 0x72, 0x65, 0x73, 0x73, 0x52, 0x0b, 0x6d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, - 0x73, 0x22, 0x71, 0x0a, 0x17, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x69, 0x6e, 0x41, - 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x40, 0x0a, 0x0b, - 0x6d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1e, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, - 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x4d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, - 0x73, 0x52, 0x0b, 0x6d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x14, - 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, - 0x72, 0x72, 0x6f, 0x72, 0x32, 0xef, 0x05, 0x0a, 0x0b, 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x12, 0x4f, 0x0a, 0x08, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, - 0x12, 0x22, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, - 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x49, - 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x1d, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, - 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x4f, 0x75, 0x74, - 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x45, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, - 0x12, 0x19, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, - 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x49, 0x64, 0x1a, 0x1d, 0x2e, 0x63, 0x6f, + 0x65, 0x72, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x51, 0x0a, 0x0a, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x12, 0x22, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, + 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x1d, 0x2e, 0x63, + 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, + 0x2e, 0x55, 0x73, 0x65, 0x72, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x53, 0x0a, + 0x0a, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x12, 0x1e, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, - 0x55, 0x73, 0x65, 0x72, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x51, 0x0a, 0x0a, - 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x12, 0x22, 0x2e, 0x63, 0x6f, 0x6d, - 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x1d, + 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x23, 0x2e, 0x63, 0x6f, + 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, + 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, + 0x22, 0x00, 0x12, 0x41, 0x0a, 0x08, 0x4c, 0x69, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, 0x12, 0x16, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1b, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, + 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x4c, + 0x69, 0x73, 0x74, 0x22, 0x00, 0x12, 0x4a, 0x0a, 0x05, 0x4c, 0x6f, 0x67, 0x49, 0x6e, 0x12, 0x1d, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, - 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, - 0x53, 0x0a, 0x0a, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x12, 0x1e, 0x2e, + 0x65, 0x72, 0x2e, 0x6c, 0x6f, 0x67, 0x49, 0x6e, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x20, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, - 0x72, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x23, 0x2e, + 0x72, 0x2e, 0x6c, 0x6f, 0x67, 0x49, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x00, 0x12, 0x53, 0x0a, 0x08, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x12, 0x20, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, - 0x72, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x4f, 0x75, 0x74, 0x70, - 0x75, 0x74, 0x22, 0x00, 0x12, 0x41, 0x0a, 0x08, 0x4c, 0x69, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, - 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1b, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, - 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, - 0x72, 0x4c, 0x69, 0x73, 0x74, 0x22, 0x00, 0x12, 0x4a, 0x0a, 0x05, 0x4c, 0x6f, 0x67, 0x49, 0x6e, - 0x12, 0x1d, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, - 0x75, 0x73, 0x65, 0x72, 0x2e, 0x6c, 0x6f, 0x67, 0x49, 0x6e, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, - 0x20, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, - 0x73, 0x65, 0x72, 0x2e, 0x6c, 0x6f, 0x67, 0x49, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x00, 0x12, 0x53, 0x0a, 0x08, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x12, - 0x20, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, - 0x73, 0x65, 0x72, 0x2e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x70, 0x75, - 0x74, 0x1a, 0x23, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, - 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x63, 0x0a, 0x0e, 0x43, 0x68, 0x61, 0x6e, - 0x67, 0x65, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x26, 0x2e, 0x63, 0x6f, 0x6d, - 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x63, - 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x49, 0x6e, 0x70, - 0x75, 0x74, 0x1a, 0x27, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, - 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x61, 0x73, - 0x73, 0x77, 0x6f, 0x72, 0x64, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x57, 0x0a, - 0x0a, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x12, 0x22, 0x2e, 0x63, 0x6f, - 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, - 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, + 0x72, 0x2e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x23, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, - 0x73, 0x65, 0x72, 0x2e, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x4f, 0x75, - 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x32, 0xd8, 0x01, 0x0a, 0x12, 0x4d, 0x61, 0x69, 0x6e, 0x41, - 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x54, 0x0a, - 0x0e, 0x47, 0x65, 0x74, 0x4d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, - 0x20, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, - 0x73, 0x65, 0x72, 0x2e, 0x4d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x49, - 0x64, 0x1a, 0x1e, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, - 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x4d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, - 0x73, 0x22, 0x00, 0x12, 0x6c, 0x0a, 0x11, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x69, - 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x29, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, - 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x4d, 0x61, 0x69, - 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x49, 0x6e, - 0x70, 0x75, 0x74, 0x1a, 0x2a, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, - 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x61, - 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, - 0x00, 0x42, 0x03, 0x5a, 0x01, 0x2e, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x73, 0x65, 0x72, 0x2e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x63, 0x0a, 0x0e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, + 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x26, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, + 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x63, 0x68, 0x61, + 0x6e, 0x67, 0x65, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x49, 0x6e, 0x70, 0x75, 0x74, + 0x1a, 0x27, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, + 0x75, 0x73, 0x65, 0x72, 0x2e, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x61, 0x73, 0x73, 0x77, + 0x6f, 0x72, 0x64, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0a, 0x43, + 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x12, 0x22, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, + 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x63, 0x68, + 0x61, 0x6e, 0x67, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x23, 0x2e, + 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, + 0x72, 0x2e, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x4f, 0x75, 0x74, 0x70, + 0x75, 0x74, 0x22, 0x00, 0x32, 0xd8, 0x01, 0x0a, 0x12, 0x4d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, + 0x72, 0x65, 0x73, 0x73, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x54, 0x0a, 0x0e, 0x47, + 0x65, 0x74, 0x4d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x20, 0x2e, + 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, + 0x72, 0x2e, 0x4d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x49, 0x64, 0x1a, + 0x1e, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, + 0x73, 0x65, 0x72, 0x2e, 0x4d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x22, + 0x00, 0x12, 0x6c, 0x0a, 0x11, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x69, 0x6e, 0x41, + 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x29, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, + 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x4d, 0x61, 0x69, 0x6e, 0x41, + 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x70, 0x75, + 0x74, 0x1a, 0x2a, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, + 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x69, 0x6e, + 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x42, + 0x03, 0x5a, 0x01, 0x2e, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/services/proto/user.proto b/services/proto/user.proto index f9d21c15..bdf1b94f 100644 --- a/services/proto/user.proto +++ b/services/proto/user.proto @@ -92,7 +92,6 @@ message UserList { } message logInInput { - uint64 userId = 1; string email = 2; string password = 3; } @@ -114,6 +113,7 @@ message validateResponse { message logInResponse { User user = 1; string token = 2; + string error = 3; } diff --git a/services/user/src/pkg/services/auth.go b/services/user/src/pkg/services/auth.go index 0d372af0..d561fc60 100644 --- a/services/user/src/pkg/services/auth.go +++ b/services/user/src/pkg/services/auth.go @@ -40,13 +40,13 @@ func (s *Server) Register(_ context.Context, req *pb.UserCreateInput) (*pb.UserO func (s *Server) LogIn(_ context.Context, req *pb.LogInInput) (*pb.LogInResponse, error) { var user models.User - if result := s.H.DB.Where(&models.User{Email: req.Email}).First(&user); result.Error != nil { - return nil, result.Error + if result := s.H.DB.Where(&models.User{Email: req.Email}).Preload("Role").Preload("MainAddress").First(&user); result.Error != nil { + return &pb.LogInResponse{Error: "Invalid credentials"}, nil } user.Email = req.Email if !utils.CheckPasswordHash(req.Password, user.Password) { - return nil, nil + return &pb.LogInResponse{Error: "Invalid credentials"}, nil } token, _ := s.Jwt.GenerateToken(user) From 0ebd2985ee917ad886349b26bead12620182cc15 Mon Sep 17 00:00:00 2001 From: Florian LEROUX Date: Thu, 6 Jul 2023 13:52:31 +0200 Subject: [PATCH 177/883] fix(create/update): relay on basket.string to generate json and total --- services/order/src/handlers/order/create.ts | 29 ++++++++++++++++----- services/order/src/handlers/order/update.ts | 3 --- services/order/src/lib/struct.ts | 10 +++++++ services/order/src/lib/transformer.ts | 2 ++ 4 files changed, 34 insertions(+), 10 deletions(-) diff --git a/services/order/src/handlers/order/create.ts b/services/order/src/handlers/order/create.ts index 8e694086..06f5056e 100644 --- a/services/order/src/handlers/order/create.ts +++ b/services/order/src/handlers/order/create.ts @@ -10,22 +10,37 @@ export const CreateOrder = async ( callback: (err: any, response: Order | null) => void ) => { try { - const { basket_snapshot, delivery_id, payment_id, user, restaurant_id } = request; + const { + basket_snapshot, + delivery_id, + delivery_type, + payment_id, + user, + restaurant_id, + } = request; - // todo: calculate total from basket_snapshot - const total = 0; // basket_snapshot.reduce; + const json = // (parseStruct(basket_snapshot.json) || + JSON.parse(basket_snapshot.string) as { + [key: string]: { count: number; price: number }; + }; + const total = Object.values(json).reduce((acc, cur) => acc + cur.price, 0); + + const user_in_db = await prisma.userMinimum.findFirst({ + where: { email: user.email }, + }); const order = await prisma.order.create({ data: { delivery_id, + delivery_type, payment_id, - user: { connectOrCreate: { where: { id: user.id }, create: user } }, + user: user_in_db + ? { connect: { id: user_in_db.id } } + : { create: { ...user, id: undefined } }, basket_snapshot: { create: { string: basket_snapshot.string, - json: - parseStruct(basket_snapshot.json) || - JSON.parse(basket_snapshot.string), + json, total, }, }, diff --git a/services/order/src/handlers/order/update.ts b/services/order/src/handlers/order/update.ts index de0f4847..75dfed82 100644 --- a/services/order/src/handlers/order/update.ts +++ b/services/order/src/handlers/order/update.ts @@ -11,9 +11,6 @@ export const UpdateOrder = async ( try { const { delivery_id, payment_id, id, status, restaurant_id } = request; - // todo: calculate total from basket_snapshot - const total = 0; // basket_snapshot.reduce; - const order = await prisma.order.update({ where: { id }, data: { diff --git a/services/order/src/lib/struct.ts b/services/order/src/lib/struct.ts index 09a49b5a..b1b7f50e 100644 --- a/services/order/src/lib/struct.ts +++ b/services/order/src/lib/struct.ts @@ -30,6 +30,16 @@ export const toStruct = ( ): Struct => { if (!obj) return { fields: {} }; const fields = Object.entries(obj).reduce((acc: any, [key, value]) => { + if (typeof value === "object") { + return { + ...acc, + [key]: { + kind: "structValue", + structValue: toStruct(value), + }, + }; + } + return { ...acc, [key]: { diff --git a/services/order/src/lib/transformer.ts b/services/order/src/lib/transformer.ts index 344b9fcc..b77e6296 100644 --- a/services/order/src/lib/transformer.ts +++ b/services/order/src/lib/transformer.ts @@ -7,6 +7,8 @@ export const toGrpc = (order: ExtendedOrder) => { id: order.id, payment_id: order.payment_id, delivery_id: order.delivery_id, + delivery_type: order.delivery_type, + restaurant_id: order.restaurant_id, user: order.user, basket_snapshot: { string: order.basket_snapshot.string, From 1b12cc2a354602ae5201c72de511b19af177a5ea Mon Sep 17 00:00:00 2001 From: Florian LEROUX Date: Thu, 6 Jul 2023 13:52:55 +0200 Subject: [PATCH 178/883] feat(reporting): add delivery type handler --- .../migration.sql | 11 ++++++ services/order/prisma/schema.prisma | 9 ++++- services/order/prisma/seed.ts | 3 ++ .../src/handlers/reporting/delivery-types.ts | 38 +++++++++++++++++++ .../order/src/handlers/reporting/index.ts | 4 +- services/order/src/types/order.d.ts | 6 ++- services/order/src/types/reporting.d.ts | 11 ++++++ services/proto/order.proto | 28 ++++++++++++-- 8 files changed, 103 insertions(+), 7 deletions(-) create mode 100644 services/order/prisma/migrations/20230706092649_add_delivery_types/migration.sql create mode 100644 services/order/src/handlers/reporting/delivery-types.ts diff --git a/services/order/prisma/migrations/20230706092649_add_delivery_types/migration.sql b/services/order/prisma/migrations/20230706092649_add_delivery_types/migration.sql new file mode 100644 index 00000000..01ce29f0 --- /dev/null +++ b/services/order/prisma/migrations/20230706092649_add_delivery_types/migration.sql @@ -0,0 +1,11 @@ +/* + Warnings: + + - Added the required column `delivery_type` to the `Order` table without a default value. This is not possible if the table is not empty. + +*/ +-- CreateEnum +CREATE TYPE "DeliveryType" AS ENUM ('TAKEAWAY', 'DELIVERY'); + +-- AlterTable +ALTER TABLE "Order" ADD COLUMN "delivery_type" "DeliveryType" NOT NULL; diff --git a/services/order/prisma/schema.prisma b/services/order/prisma/schema.prisma index 9c7a5f9a..1c3929d9 100644 --- a/services/order/prisma/schema.prisma +++ b/services/order/prisma/schema.prisma @@ -35,13 +35,20 @@ model Basket { Order Order? } +enum DeliveryType { + TAKEAWAY + DELIVERY +} + model Order { id String @id @default(cuid()) @map("_id") payment_id String - delivery_id String status Status @default(PENDING) + delivery_id String + delivery_type DeliveryType + user UserMinimum @relation(fields: [user_id], references: [id]) user_id String diff --git a/services/order/prisma/seed.ts b/services/order/prisma/seed.ts index 3de73287..d7fd8942 100644 --- a/services/order/prisma/seed.ts +++ b/services/order/prisma/seed.ts @@ -7,6 +7,7 @@ const orders: Prisma.OrderCreateInput[] = [ id: "order_id:1", payment_id: "payment_id:1", delivery_id: "delivery_id:1", + delivery_type: "DELIVERY", user: { connectOrCreate: { where: { id: "user_id:1" }, @@ -48,6 +49,7 @@ const orders: Prisma.OrderCreateInput[] = [ id: "order_id:2", payment_id: "payment_id:2", delivery_id: "delivery_id:2", + delivery_type: "DELIVERY", user: { connectOrCreate: { where: { id: "user_id:1" }, @@ -81,6 +83,7 @@ const orders: Prisma.OrderCreateInput[] = [ id: "order_id:3", payment_id: "payment_id:3", delivery_id: "delivery_id:3", + delivery_type: "TAKEAWAY", user: { connectOrCreate: { where: { id: "user_id:2" }, diff --git a/services/order/src/handlers/reporting/delivery-types.ts b/services/order/src/handlers/reporting/delivery-types.ts new file mode 100644 index 00000000..9ae0303b --- /dev/null +++ b/services/order/src/handlers/reporting/delivery-types.ts @@ -0,0 +1,38 @@ +import { prisma } from "@order/lib/prisma"; +import { log } from "@order/lib/log"; +import { + GetDeliveryTypeRepartitionRequest, + GetDeliveryTypeRepartitionResponse, +} from "@order/types/reporting"; +import { Data } from "@order/types"; +import { fromInterval } from "@order/lib/date"; +import { DeliveryType } from "@prisma/client"; + +export const GetDeliveryTypeRepartition = async ( + { request }: Data, + callback: ( + err: any, + response: GetDeliveryTypeRepartitionResponse | null + ) => void +) => { + try { + const { date, restaurant_id, interval } = request; + const { start, end } = fromInterval(interval, date); + + const orders = await prisma.order.findMany({ + where: { restaurant_id, created_at: { gte: start, lte: end } }, + }); + + const delivery = orders.filter( + (o) => o.delivery_type === DeliveryType.DELIVERY + ).length; + const takeaway = orders.filter( + (o) => o.delivery_type === DeliveryType.TAKEAWAY + ).length; + + callback(null, { delivery, takeaway }); + } catch (error) { + log.error(error); + callback(error, null); + } +}; diff --git a/services/order/src/handlers/reporting/index.ts b/services/order/src/handlers/reporting/index.ts index c41498b1..6347e07e 100644 --- a/services/order/src/handlers/reporting/index.ts +++ b/services/order/src/handlers/reporting/index.ts @@ -1,11 +1,13 @@ import { UntypedServiceImplementation } from "@grpc/grpc-js"; import { GetOrdersAffluence } from "@order/handlers/reporting/affluence"; +import { GetDeliveryTypeRepartition } from "@order/handlers/reporting/delivery-types"; import { GetTop5SellingProducts } from "@order/handlers/reporting/top5-selling"; const reportingHandlers: UntypedServiceImplementation = { GetOrdersAffluence, - GetTop5SellingProducts + GetTop5SellingProducts, + GetDeliveryTypeRepartition, }; export default reportingHandlers; diff --git a/services/order/src/types/order.d.ts b/services/order/src/types/order.d.ts index b7f16540..4942a655 100644 --- a/services/order/src/types/order.d.ts +++ b/services/order/src/types/order.d.ts @@ -1,4 +1,4 @@ -import { Prisma, Status } from "@prisma/client"; +import { DeliveryType, Prisma, Status } from "@prisma/client"; export type UserMinimum = { id: string; @@ -17,6 +17,8 @@ export type Order = { id: string; payment_id: string; delivery_id: string; + delivery_type: DeliveryType + restaurant_id: string; user: UserMinimum; basket_snapshot: Basket; status: Status; @@ -53,6 +55,7 @@ export type GetOrdersByStatusResponse = { export type CreateOrderRequest = { payment_id: string; delivery_id: string; + delivery_type: DeliveryType; user: UserMinimum; basket_snapshot: Basket; restaurant_id: string; @@ -62,6 +65,7 @@ export type UpdateOrderRequest = { id: string; payment_id: string; delivery_id: string; + delivery_type: DeliveryType; status: Status; restaurant_id: string; }; diff --git a/services/order/src/types/reporting.d.ts b/services/order/src/types/reporting.d.ts index 922a47be..7381bd41 100644 --- a/services/order/src/types/reporting.d.ts +++ b/services/order/src/types/reporting.d.ts @@ -28,3 +28,14 @@ export type ProductCount = { export type GetTop5SellingProductsResponse = { products_count: ProductCount[]; }; + +export type GetDeliveryTypeRepartitionRequest = { + date?: string; + interval: Interval; + restaurant_id: string; +}; + +export type GetDeliveryTypeRepartitionResponse = { + delivery: number; + takeaway: number; +}; diff --git a/services/proto/order.proto b/services/proto/order.proto index 21f6eec3..6d449c1f 100644 --- a/services/proto/order.proto +++ b/services/proto/order.proto @@ -10,7 +10,13 @@ enum Status { IN_PROGRESS = 1; FULFILLED = 2; REJECTED = 3; - } +} + +enum DeliveryType { + DELIVERY = 0; + PICKUP = 1; + +} message UserMinimum { string id = 1; @@ -33,6 +39,7 @@ message Order { string payment_id = 2; string delivery_id = 3; + DeliveryType delivery_type = 8; UserMinimum user = 4; Basket basket_snapshot = 5; @@ -56,6 +63,7 @@ service OrderService { service OrderReportingService { rpc GetOrdersAffluence(GetOrdersAffluenceRequest) returns (GetOrdersAffluenceResponse) {} rpc GetTop5SellingProducts(GetTop5SellingProductsRequest) returns (GetTop5SellingProductsResponse) {} + rpc GetDeliveryTypeRepartition(GetDeliveryTypeRepartitionRequest) returns (GetDeliveryTypeRepartitionResponse) {} } message GetOrderRequest { @@ -89,11 +97,12 @@ message GetOrdersByStatusResponse { message CreateOrderRequest { string payment_id = 1; string delivery_id = 2; + string delivery_type = 3; - UserMinimum user = 3; - Basket basket_snapshot = 4; + UserMinimum user = 4; + Basket basket_snapshot = 5; - string restaurant_id = 5; + string restaurant_id = 6; } message UpdateOrderRequest{ @@ -144,4 +153,15 @@ message GetTop5SellingProductsResponse { message ProductCount { string id = 1; int32 count = 2; +} + +message GetDeliveryTypeRepartitionRequest { + optional string date = 1; + string interval = 2; + string restaurant_id = 3; +} + +message GetDeliveryTypeRepartitionResponse { + int32 delivery = 1; + int32 takeaway = 2; } \ No newline at end of file From 46c23651a8f6952d14fa11c7e34052f3ff6f0ef7 Mon Sep 17 00:00:00 2001 From: Florian LEROUX Date: Thu, 6 Jul 2023 14:18:17 +0200 Subject: [PATCH 179/883] fix(ci): update pnpm from '7' to latest --- .github/workflows/order.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/order.yml b/.github/workflows/order.yml index ed557e26..0dd23e28 100644 --- a/.github/workflows/order.yml +++ b/.github/workflows/order.yml @@ -13,7 +13,7 @@ jobs: - uses: actions/checkout@master - uses: pnpm/action-setup@v2 with: - version: 7 + version: latest - uses: actions/setup-node@v3 with: node-version: "18.x" @@ -34,7 +34,7 @@ jobs: - uses: actions/checkout@master - uses: pnpm/action-setup@v2 with: - version: 7 + version: latest - uses: actions/setup-node@v3 with: node-version: "18.x" From 828ca3555a42bc2b44a0d4a1e5eb51d1adb02658 Mon Sep 17 00:00:00 2001 From: Florian LEROUX Date: Thu, 6 Jul 2023 14:37:11 +0200 Subject: [PATCH 180/883] fix(test): add missing properties --- services/order/src/tests/transformer.test.ts | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/services/order/src/tests/transformer.test.ts b/services/order/src/tests/transformer.test.ts index 9049bb75..fcf18456 100644 --- a/services/order/src/tests/transformer.test.ts +++ b/services/order/src/tests/transformer.test.ts @@ -10,6 +10,8 @@ describe("tests@goodfood/order.transformer.toGrpc", function () { id: "order_id:1", payment_id: "payment_id:1", delivery_id: "delivery_id:1", + delivery_type: "DELIVERY", + restaurant_id: "restaurant_id:1", user: { id: "user_id:1", first_name: "first_name", @@ -33,6 +35,8 @@ describe("tests@goodfood/order.transformer.toGrpc", function () { assert.equal(parsed?.id, "order_id:1"); assert.equal(parsed?.payment_id, "payment_id:1"); assert.equal(parsed?.delivery_id, "delivery_id:1"); + assert.equal(parsed?.delivery_type, "DELIVERY"); + assert.equal(parsed?.restaurant_id, "restaurant_id:1"); assert.equal(parsed?.user.id, "user_id:1"); assert.equal(parsed?.user.first_name, "first_name"); assert.equal(parsed?.user.last_name, "last_name"); @@ -54,6 +58,8 @@ describe("tests@goodfood/order.transformer.toGrpc", function () { id: "", payment_id: "", delivery_id: "", + delivery_type: "DELIVERY", + restaurant_id: "", user: { id: "", first_name: "", @@ -72,6 +78,8 @@ describe("tests@goodfood/order.transformer.toGrpc", function () { assert.equal(parsed?.id, ""); assert.equal(parsed?.payment_id, ""); assert.equal(parsed?.delivery_id, ""); + assert.equal(parsed?.delivery_type, "DELIVERY"); + assert.equal(parsed?.restaurant_id, ""); assert.equal(parsed?.user.id, ""); assert.equal(parsed?.user.first_name, ""); assert.equal(parsed?.user.last_name, ""); From 8d03b12be5951aa96a56dcc1df8ea76ad3abad44 Mon Sep 17 00:00:00 2001 From: Florian LEROUX Date: Thu, 6 Jul 2023 14:48:11 +0200 Subject: [PATCH 181/883] doc: add markdwon files --- CODE_OF_CONDUCT.md | 19 +++++++++++++++++++ CODE_STYLE.md | 12 ++++++++++++ CONTRIBUTING.md | 28 ++++++++++++++++++++++++++++ README.md | 13 ++++++------- 4 files changed, 65 insertions(+), 7 deletions(-) create mode 100644 CODE_OF_CONDUCT.md create mode 100644 CODE_STYLE.md diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md new file mode 100644 index 00000000..d28bd2f7 --- /dev/null +++ b/CODE_OF_CONDUCT.md @@ -0,0 +1,19 @@ +# Code of Conduct + +We are committed to providing a friendly, safe, and welcoming environment for all, regardless of gender, sexual orientation, ability, ethnicity, socioeconomic status, and religion (or lack thereof). + +We do not tolerate harassment or discrimination of any kind, including but not limited to: + +- Offensive comments related to gender, sexual orientation, ability, ethnicity, socioeconomic status, and religion (or lack thereof) +- Threats of violence or incitement of violence +- Unwelcome sexual attention or advances +- Intimidation, stalking, or following +- Invasion of privacy +- Publishing private information without permission +- Other conduct that is inappropriate for a professional audience + +If you witness or experience any of the above, please report it to the project maintainers immediately. All reports will be kept confidential. + +We reserve the right to remove any content or contributors that violate this code of conduct. + +Thank you for helping us maintain a welcoming and inclusive community! \ No newline at end of file diff --git a/CODE_STYLE.md b/CODE_STYLE.md new file mode 100644 index 00000000..d23eab4e --- /dev/null +++ b/CODE_STYLE.md @@ -0,0 +1,12 @@ +# Code Style Guidelines + +We follow each language-specific style guide for any language used in this project. In addition, we have a few additional guidelines: + +- Use descriptive variable and function names +- Keep lines under 80 characters +- Use spaces instead of tabs +- Use double quotes for strings + +If you're unsure about any aspect of the code style, please ask in the pull request or issue discussion. + +Thank you for helping us maintain a consistent and readable codebase! \ No newline at end of file diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index e69de29b..3fcca018 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -0,0 +1,28 @@ +# Contributing + +Thank you for considering contributing to this project! Here are a few guidelines to help you get started. + +## Issues and Bugs + +If you find an issue or a bug, please submit it to our [issue tracker](https://github.com/floriaaan/goodfood/issues/new) with a clear description and steps to reproduce it. + +## Feature Requests + +If you have a feature request, please submit it to our [issue tracker](https://github.com/floriaaan/goodfood/issues/new) with a clear description of the feature and why you think it would be useful. + +## Pull Requests + +We welcome pull requests from anyone who wants to contribute. Before submitting a pull request, please make sure to: + +- Create a new branch for your changes +- Write tests for your changes +- Ensure all tests pass +- Follow our [code style guidelines](./CODE_STYLE.md) + +Once you're ready, submit your pull request and we'll review it as soon as possible. + +## Code of Conduct + +Please note that we have a [code of conduct](./CODE_OF_CONDUCT.md) that we expect all contributors to follow. + +Thank you again for your interest in contributing to this project! \ No newline at end of file diff --git a/README.md b/README.md index 4bf6e30e..a405370d 100644 --- a/README.md +++ b/README.md @@ -19,10 +19,11 @@ The GoodFood 2.0 project was initiated to update the existing ordering applicati | Product | 50004 | NodeJS (ts) | PostgreSQL | ❌ | @PierreLbg | | Restaurant | 50005 | NodeJS (ts) | PostgreSQL | ❌ | @PierreLbg | | Promotion | 50006 | NodeJS (ts) | PostgreSQL | ❌ | @PierreLbg | -| Order | 50007 | NodeJS (ts) | MongoDB | ❌ | @floriaaan | +| Order | 50007 | NodeJS (ts) | PostgreSQL | ✅ | @floriaaan | | Delivery | 50008 | NodeJS (ts) | PostgreSQL | ⚠️ | @floriaaan | | Stock | 50009 | NodeJS (ts) | PostgreSQL | ❌ | @floriaaan | -| Reporting | 50010 | C# (dotnet) | PostgreSQL | ❌ | @floriaaan | +| Reporting | 50020 | C# (dotnet) | PostgreSQL | ❌ | @floriaaan | +| Log | 50021 | Go | PostgreSQL | ✅ | @floriaaan | | (...) | (...) | (...) | (...) | (...) | ## File Hierarchy @@ -58,13 +59,11 @@ The file hierarchy for this project is as follows: └── (...) # proto files ``` -## Installation +## Installation & usage -TBW : Installation instructions +Each service has its own README.md file with installation and usage instructions. -## Usage - -TBW : Usage instructions +Please refer to the README.md file of the service you want to install and use. ## Contributing From 9977465b8aa28a6b9ea646415e30fc3522e4a0a8 Mon Sep 17 00:00:00 2001 From: Florian LEROUX <10078837+floriaaan@users.noreply.github.com> Date: Sun, 16 Apr 2023 13:15:10 +0200 Subject: [PATCH 182/883] feat(tf): add terraform files --- services/order/README.md | 41 ++++++++ services/order/terraform/data.tf | 17 ++++ .../terraform/env/dev-backend.tfvars.example | 4 + .../order/terraform/env/dev.tfvars.example | 1 + services/order/terraform/main.tf | 95 +++++++++++++++++++ services/order/terraform/outputs.tf | 6 ++ services/order/terraform/variables.tf | 16 ++++ 7 files changed, 180 insertions(+) create mode 100644 services/order/README.md create mode 100644 services/order/terraform/data.tf create mode 100644 services/order/terraform/env/dev-backend.tfvars.example create mode 100644 services/order/terraform/env/dev.tfvars.example create mode 100644 services/order/terraform/main.tf create mode 100644 services/order/terraform/outputs.tf create mode 100644 services/order/terraform/variables.tf diff --git a/services/order/README.md b/services/order/README.md new file mode 100644 index 00000000..7cace267 --- /dev/null +++ b/services/order/README.md @@ -0,0 +1,41 @@ +# Order Microservice + +| Informations | +| ------------------------------------------- | +| **Port:** 50007 | +| **Developer:** @floriaaan | +| **Status:** In progress | +| **Last update:** 2023-04-16 | +| **Language:** NodeJS | +| **Dependencies:** TypeScript, gRPC, MongoDB | +| **Models:** ? | + +## gRPC Methods + +TBW + +## Requirements + +To run this microservice, you will need to have the following installed on your system: + +- NodeJS (v18.12.0 or higher) (dev. with v18.12.0) +- MongoDB + +You can use the following tools to help you with the setup: + +- You can use nvm to set your Node version using: + - `nvm use`. + +## Getting started + +### 1. Clone the repository and install dependencies + +1. Clone the `goodfood` repository to your local machine. +2. Navigate to the service directory (`services/order`) in your terminal. +3. Run `npm install` to install the necessary dependencies. +4. Create a `.env` file at the root of the project directory and add the environment variables values (see `.env.example`). +5. Run `npm run start` to start the microservice. + +You can now access the microservice at `http://localhost:50007`. + +NB: If you want to run the microservice in development mode, you can run `npm run dev` instead. diff --git a/services/order/terraform/data.tf b/services/order/terraform/data.tf new file mode 100644 index 00000000..bc3e9769 --- /dev/null +++ b/services/order/terraform/data.tf @@ -0,0 +1,17 @@ +data "azurerm_resource_group" "rg-goodfood" { + name = "rg-${var.project_name}${var.environnment_suffix}" +} + +data "azurerm_key_vault" "kv-goodfood-order" { + resource_group_name = data.azurerm_resource_group.rg-goodfood.name + name = "kv-${var.project_name}" +} + +data "azurerm_key_vault_secret" "order-db-login" { + name = "order-db-login" + key_vault_id = data.azurerm_key_vault.kv-goodfood-order.id +} +data "azurerm_key_vault_secret" "order-db-password" { + name = "order-db-password" + key_vault_id = data.azurerm_key_vault.kv-goodfood-order.id +} \ No newline at end of file diff --git a/services/order/terraform/env/dev-backend.tfvars.example b/services/order/terraform/env/dev-backend.tfvars.example new file mode 100644 index 00000000..61cb3ae1 --- /dev/null +++ b/services/order/terraform/env/dev-backend.tfvars.example @@ -0,0 +1,4 @@ +resource_group_name = "rg-goodfood-dev" +storage_account_name = "sa-goodfood-states" +container_name = "tfstate" +key = "order-dev.tfstate" diff --git a/services/order/terraform/env/dev.tfvars.example b/services/order/terraform/env/dev.tfvars.example new file mode 100644 index 00000000..4ac1f44d --- /dev/null +++ b/services/order/terraform/env/dev.tfvars.example @@ -0,0 +1 @@ +environnment_suffix = "-dev" diff --git a/services/order/terraform/main.tf b/services/order/terraform/main.tf new file mode 100644 index 00000000..b1b7fd3f --- /dev/null +++ b/services/order/terraform/main.tf @@ -0,0 +1,95 @@ +terraform { + required_providers { + azurerm = { + source = "hashicorp/azurerm" + version = "3.48.0" + } + } + backend "azurerm" {} +} + +provider "azurerm" { + features { + key_vault { + purge_soft_deleted_secrets_on_destroy = true + recover_soft_deleted_secrets = true + } + } +} + +resource "azurerm_key_vault" "kv-goodfood-order" { + name = "kv-goodfood-order" + location = data.azurerm_resource_group.rg-goodfood.location + resource_group_name = data.azurerm_resource_group.rg-goodfood.name + tenant_id = data.azurerm_client_config.current.tenant_id + sku_name = "standard" + soft_delete_retention_days = 7 + + access_policy { + tenant_id = data.azurerm_client_config.current.tenant_id + object_id = data.azurerm_client_config.current.object_id + + key_permissions = [ + "Create", + "Get", + ] + + secret_permissions = [ + "Set", + "Get", + "Delete", + "Purge", + "Recover" + ] + } +} + +data "azurerm_cosmosdb_account" "cosmosacc-goodfood-order" { + name = "cacc-goodfood-order" + resource_group_name = data.azurerm_resource_group.rg-goodfood.name + + kind = "MongoDB" + enable_automatic_failover = true + + capabilities { + name = "EnableMongo" + } + + consistency_policy { + consistency_level = "BoundedStaleness" + max_interval_in_seconds = 400 + max_staleness_prefix = 200000 + } + + geo_location { + location = var.location + } +} + +resource "azurerm_cosmosdb_mongo_database" "cosmosdb-goodfood-order" { + name = "cosmosdb-goodfood-order" + resource_group_name = data.azurerm_resource_group.rg-goodfood.name + account_name = data.azurerm_cosmosdb_account.cosmosacc-goodfood-order.name + throughput = 400 +} + +resource "azurerm_cosmosdb_mongo_collection" "mongocollection-goodfood-order" { + name = "mongocollection-goodfood-order" + resource_group_name = data.azurerm_resource_group.rg-goodfood.name + account_name = data.azurerm_cosmosdb_account.cosmosacc-goodfood-order.name + database_name = azurerm_cosmosdb_mongo_database.cosmosdb-goodfood-order.name + + default_ttl_seconds = "777" + shard_key = "uniqueKey" + throughput = 400 + + lifecycle { + ignore_changes = [index] + } + + depends_on = [ + azurerm_cosmosdb_mongo_database.cosmosdb-goodfood-order + ] + + +} diff --git a/services/order/terraform/outputs.tf b/services/order/terraform/outputs.tf new file mode 100644 index 00000000..a2d60616 --- /dev/null +++ b/services/order/terraform/outputs.tf @@ -0,0 +1,6 @@ +output "main-rg-name" { + value = data.azurerm_resource_group.rg-goodfood.name +} +output "main-rg-id" { + value = data.azurerm_resource_group.rg-goodfood.id +} \ No newline at end of file diff --git a/services/order/terraform/variables.tf b/services/order/terraform/variables.tf new file mode 100644 index 00000000..65fd7547 --- /dev/null +++ b/services/order/terraform/variables.tf @@ -0,0 +1,16 @@ +variable "environnment_suffix" { + type = string + description = "The suffix to append to the environment name" +} + +variable "location" { + type = string + description = "The location/region where all resources in this environment should be created" + default = "West Europe" +} + +variable "project_name" { + type = string + description = "The name of the project" + default = "goodfood" +} \ No newline at end of file From 03213b103117f571837795e6e6324cc782c049da Mon Sep 17 00:00:00 2001 From: Florian LEROUX <10078837+floriaaan@users.noreply.github.com> Date: Tue, 9 May 2023 14:37:05 +0200 Subject: [PATCH 183/883] feat(init): add server dependencies --- services/order/.dockerignore | 2 + services/order/.env.example | 5 + services/order/.gitignore | 5 + services/order/.nvmrc | 1 + services/order/Dockerfile | 38 + services/order/generate_grpc_reflection.sh | 15 + services/order/package.json | 55 + services/order/pnpm-lock.yaml | 2402 ++++++++++++++++++++ services/order/prisma/schema.prisma | 49 + services/order/prisma/seed.ts | 27 + services/order/proto | 1 + services/order/reflection_descriptor.bin | Bin 0 -> 1380 bytes services/order/src/handlers/.gitinclude | 0 services/order/tsconfig.json | 18 + services/order/vitest.config.ts | 10 + services/proto/order.proto | 45 +- 16 files changed, 2668 insertions(+), 5 deletions(-) create mode 100644 services/order/.dockerignore create mode 100644 services/order/.env.example create mode 100644 services/order/.gitignore create mode 100644 services/order/.nvmrc create mode 100644 services/order/Dockerfile create mode 100755 services/order/generate_grpc_reflection.sh create mode 100644 services/order/package.json create mode 100644 services/order/pnpm-lock.yaml create mode 100644 services/order/prisma/schema.prisma create mode 100644 services/order/prisma/seed.ts create mode 120000 services/order/proto create mode 100644 services/order/reflection_descriptor.bin create mode 100644 services/order/src/handlers/.gitinclude create mode 100644 services/order/tsconfig.json create mode 100644 services/order/vitest.config.ts diff --git a/services/order/.dockerignore b/services/order/.dockerignore new file mode 100644 index 00000000..b7dab5e9 --- /dev/null +++ b/services/order/.dockerignore @@ -0,0 +1,2 @@ +node_modules +build \ No newline at end of file diff --git a/services/order/.env.example b/services/order/.env.example new file mode 100644 index 00000000..23313f7e --- /dev/null +++ b/services/order/.env.example @@ -0,0 +1,5 @@ +DB_USER=user +DB_PASS=pass +DATABASE_URL=mongodb+srv://${DB_USER}:${DB_PASS}@test.kcs3xbg.mongodb.net/?retryWrites=true&w=majority + +PORT=50007 \ No newline at end of file diff --git a/services/order/.gitignore b/services/order/.gitignore new file mode 100644 index 00000000..583204b4 --- /dev/null +++ b/services/order/.gitignore @@ -0,0 +1,5 @@ +node_modules/ +dist/ +bin/ +*.env* +!*.env.example diff --git a/services/order/.nvmrc b/services/order/.nvmrc new file mode 100644 index 00000000..9dfef472 --- /dev/null +++ b/services/order/.nvmrc @@ -0,0 +1 @@ +v18.12.0 diff --git a/services/order/Dockerfile b/services/order/Dockerfile new file mode 100644 index 00000000..19327c3e --- /dev/null +++ b/services/order/Dockerfile @@ -0,0 +1,38 @@ +FROM node:18-alpine3.17 as builder + +# Set working directory +WORKDIR /app + +# Copy the application code +COPY ./delivery/ . + +# Install dependencies +RUN npm install + +# Copy the proto files - TODO: fix this, proto files should be copied from goodfood/services/proto +COPY ./proto ./proto/ + +# Generate Prisma client +RUN npx prisma generate + +# Build the application +RUN npm run build + + +# Create a new image with the application +FROM node:18-alpine3.17 as runner + +# Set working directory +WORKDIR /app + +# Copy the application package +COPY --from=builder /app/dist . +COPY --from=builder /app/prisma/ . +COPY --from=builder /app/proto/ /proto/ +COPY --from=builder /app/node_modules/.prisma /.prisma + +# Expose the gRPC port +EXPOSE 50008 + +# Start the server +CMD [ "node", "index.js"] diff --git a/services/order/generate_grpc_reflection.sh b/services/order/generate_grpc_reflection.sh new file mode 100755 index 00000000..ee20ec7f --- /dev/null +++ b/services/order/generate_grpc_reflection.sh @@ -0,0 +1,15 @@ +#!/usr/bin/env bash + +# bash list of proto files ([order.proto]) + + +IN_DIR="$(pwd)/../proto" +OUT_DIR="." +PROTOC="$(npm bin)/grpc_tools_node_protoc" + +# Generate reflection descriptor +$PROTOC \ + -I $IN_DIR \ + $IN_DIR/order.proto \ + --descriptor_set_out=$OUT_DIR/reflection_descriptor.bin \ + \ No newline at end of file diff --git a/services/order/package.json b/services/order/package.json new file mode 100644 index 00000000..2bdae690 --- /dev/null +++ b/services/order/package.json @@ -0,0 +1,55 @@ +{ + "name": "@goodfood/order", + "bin": "dist/index.js", + "scripts": { + "start": "node dist/index.js", + "dev": "nodemon --watch 'src/**/*.ts' --exec 'ts-node' src/server.ts", + "build": "esbuild src/server.ts --bundle --platform=node --target=node18 --outfile=dist/index.js", + "test": "echo 'tests are disabled' # vitest", + "coverage": "vitest --coverage", + "pkg": "pkg .", + "prisma:generate": "prisma generate", + "seed": "ts-node prisma/seed.ts", + "grpc:reflection": "./generate_grpc_reflection.sh", + "postinstall": "npm run prisma:generate && npm run grpc:reflection" + }, + "dependencies": { + "@grpc/grpc-js": "1.8.14", + "@grpc/proto-loader": "0.7.6", + "@prisma/client": "4.13.0", + "dotenv": "^16.0.3", + "grpc-server-reflection": "^0.1.5", + "protobufjs": "7.2.2" + }, + "devDependencies": { + "@types/node": "18.15.9", + "@vitest/coverage-c8": "^0.29.8", + "esbuild": "^0.17.18", + "grpc-tools": "^1.12.4", + "nodemon": "^2.0.22", + "pkg": "^5.8.1", + "prisma": "4.13.0", + "ts-node": "10.9.1", + "tsconfig-paths": "^4.2.0", + "typescript": "5.0.2", + "vite-tsconfig-paths": "^4.2.0", + "vitest": "^0.29.8", + "vitest-mock-extended": "^1.1.3" + }, + "prisma": { + "seed": "ts-node prisma/seed.ts" + }, + "pkg": { + "scripts": "./src/dist/index.js", + "assets": [ + "./prisma/**/*", + "../proto/**/*" + ], + "targets": [ + "node18-macos-arm64", + "node18-linux-x64", + "node18-linux-arm64" + ], + "outputPath": "bin/" + } +} diff --git a/services/order/pnpm-lock.yaml b/services/order/pnpm-lock.yaml new file mode 100644 index 00000000..89c3b1e5 --- /dev/null +++ b/services/order/pnpm-lock.yaml @@ -0,0 +1,2402 @@ +lockfileVersion: '6.0' + +dependencies: + '@grpc/grpc-js': + specifier: 1.8.14 + version: 1.8.14 + '@grpc/proto-loader': + specifier: 0.7.6 + version: 0.7.6 + '@prisma/client': + specifier: 4.13.0 + version: 4.13.0(prisma@4.13.0) + dotenv: + specifier: ^16.0.3 + version: 16.0.3 + grpc-server-reflection: + specifier: ^0.1.5 + version: 0.1.5 + protobufjs: + specifier: 7.2.2 + version: 7.2.2 + +devDependencies: + '@types/node': + specifier: 18.15.9 + version: 18.15.9 + '@vitest/coverage-c8': + specifier: ^0.29.8 + version: 0.29.8(vitest@0.29.8) + esbuild: + specifier: ^0.17.18 + version: 0.17.18 + grpc-tools: + specifier: ^1.12.4 + version: 1.12.4 + nodemon: + specifier: ^2.0.22 + version: 2.0.22 + pkg: + specifier: ^5.8.1 + version: 5.8.1 + prisma: + specifier: 4.13.0 + version: 4.13.0 + ts-node: + specifier: 10.9.1 + version: 10.9.1(@types/node@18.15.9)(typescript@5.0.2) + tsconfig-paths: + specifier: ^4.2.0 + version: 4.2.0 + typescript: + specifier: 5.0.2 + version: 5.0.2 + vite-tsconfig-paths: + specifier: ^4.2.0 + version: 4.2.0(typescript@5.0.2) + vitest: + specifier: ^0.29.8 + version: 0.29.8 + vitest-mock-extended: + specifier: ^1.1.3 + version: 1.1.3(typescript@5.0.2)(vitest@0.29.8) + +packages: + + /@babel/generator@7.18.2: + resolution: {integrity: sha512-W1lG5vUwFvfMd8HVXqdfbuG7RuaSrTCCD8cl8fP8wOivdbtbIg2Db3IWUcgvfxKbbn6ZBGYRW/Zk1MIwK49mgw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.19.0 + '@jridgewell/gen-mapping': 0.3.3 + jsesc: 2.5.2 + dev: true + + /@babel/helper-string-parser@7.21.5: + resolution: {integrity: sha512-5pTUx3hAJaZIdW99sJ6ZUUgWq/Y+Hja7TowEnLNMm1VivRgZQL3vpBY3qUACVsvw+yQU6+YgfBVmcbLaZtrA1w==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helper-validator-identifier@7.19.1: + resolution: {integrity: sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/parser@7.18.4: + resolution: {integrity: sha512-FDge0dFazETFcxGw/EXzOkN8uJp0PC7Qbm+Pe9T+av2zlBpOgunFHkQPPn+eRuClU73JF+98D531UgayY89tow==} + engines: {node: '>=6.0.0'} + hasBin: true + dependencies: + '@babel/types': 7.19.0 + dev: true + + /@babel/types@7.19.0: + resolution: {integrity: sha512-YuGopBq3ke25BVSiS6fgF49Ul9gH1x70Bcr6bqRLjWCkcX8Hre1/5+z+IiWOIerRMSSEfGZVB9z9kyq7wVs9YA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-string-parser': 7.21.5 + '@babel/helper-validator-identifier': 7.19.1 + 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 + + /@esbuild/android-arm64@0.17.18: + resolution: {integrity: sha512-/iq0aK0eeHgSC3z55ucMAHO05OIqmQehiGay8eP5l/5l+iEr4EIbh4/MI8xD9qRFjqzgkc0JkX0LculNC9mXBw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-arm@0.17.18: + resolution: {integrity: sha512-EmwL+vUBZJ7mhFCs5lA4ZimpUH3WMAoqvOIYhVQwdIgSpHC8ImHdsRyhHAVxpDYUSm0lWvd63z0XH1IlImS2Qw==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-x64@0.17.18: + resolution: {integrity: sha512-x+0efYNBF3NPW2Xc5bFOSFW7tTXdAcpfEg2nXmxegm4mJuVeS+i109m/7HMiOQ6M12aVGGFlqJX3RhNdYM2lWg==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-arm64@0.17.18: + resolution: {integrity: sha512-6tY+djEAdF48M1ONWnQb1C+6LiXrKjmqjzPNPWXhu/GzOHTHX2nh8Mo2ZAmBFg0kIodHhciEgUBtcYCAIjGbjQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-x64@0.17.18: + resolution: {integrity: sha512-Qq84ykvLvya3dO49wVC9FFCNUfSrQJLbxhoQk/TE1r6MjHo3sFF2tlJCwMjhkBVq3/ahUisj7+EpRSz0/+8+9A==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-arm64@0.17.18: + resolution: {integrity: sha512-fw/ZfxfAzuHfaQeMDhbzxp9mc+mHn1Y94VDHFHjGvt2Uxl10mT4CDavHm+/L9KG441t1QdABqkVYwakMUeyLRA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-x64@0.17.18: + resolution: {integrity: sha512-FQFbRtTaEi8ZBi/A6kxOC0V0E9B/97vPdYjY9NdawyLd4Qk5VD5g2pbWN2VR1c0xhzcJm74HWpObPszWC+qTew==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm64@0.17.18: + resolution: {integrity: sha512-R7pZvQZFOY2sxUG8P6A21eq6q+eBv7JPQYIybHVf1XkQYC+lT7nDBdC7wWKTrbvMXKRaGudp/dzZCwL/863mZQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm@0.17.18: + resolution: {integrity: sha512-jW+UCM40LzHcouIaqv3e/oRs0JM76JfhHjCavPxMUti7VAPh8CaGSlS7cmyrdpzSk7A+8f0hiedHqr/LMnfijg==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ia32@0.17.18: + resolution: {integrity: sha512-ygIMc3I7wxgXIxk6j3V00VlABIjq260i967Cp9BNAk5pOOpIXmd1RFQJQX9Io7KRsthDrQYrtcx7QCof4o3ZoQ==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-loong64@0.17.18: + resolution: {integrity: sha512-bvPG+MyFs5ZlwYclCG1D744oHk1Pv7j8psF5TfYx7otCVmcJsEXgFEhQkbhNW8otDHL1a2KDINW20cfCgnzgMQ==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-mips64el@0.17.18: + resolution: {integrity: sha512-oVqckATOAGuiUOa6wr8TXaVPSa+6IwVJrGidmNZS1cZVx0HqkTMkqFGD2HIx9H1RvOwFeWYdaYbdY6B89KUMxA==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ppc64@0.17.18: + resolution: {integrity: sha512-3dLlQO+b/LnQNxgH4l9rqa2/IwRJVN9u/bK63FhOPB4xqiRqlQAU0qDU3JJuf0BmaH0yytTBdoSBHrb2jqc5qQ==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-riscv64@0.17.18: + resolution: {integrity: sha512-/x7leOyDPjZV3TcsdfrSI107zItVnsX1q2nho7hbbQoKnmoeUWjs+08rKKt4AUXju7+3aRZSsKrJtaRmsdL1xA==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-s390x@0.17.18: + resolution: {integrity: sha512-cX0I8Q9xQkL/6F5zWdYmVf5JSQt+ZfZD2bJudZrWD+4mnUvoZ3TDDXtDX2mUaq6upMFv9FlfIh4Gfun0tbGzuw==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-x64@0.17.18: + resolution: {integrity: sha512-66RmRsPlYy4jFl0vG80GcNRdirx4nVWAzJmXkevgphP1qf4dsLQCpSKGM3DUQCojwU1hnepI63gNZdrr02wHUA==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/netbsd-x64@0.17.18: + resolution: {integrity: sha512-95IRY7mI2yrkLlTLb1gpDxdC5WLC5mZDi+kA9dmM5XAGxCME0F8i4bYH4jZreaJ6lIZ0B8hTrweqG1fUyW7jbg==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/openbsd-x64@0.17.18: + resolution: {integrity: sha512-WevVOgcng+8hSZ4Q3BKL3n1xTv5H6Nb53cBrtzzEjDbbnOmucEVcZeGCsCOi9bAOcDYEeBZbD2SJNBxlfP3qiA==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/sunos-x64@0.17.18: + resolution: {integrity: sha512-Rzf4QfQagnwhQXVBS3BYUlxmEbcV7MY+BH5vfDZekU5eYpcffHSyjU8T0xucKVuOcdCsMo+Ur5wmgQJH2GfNrg==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-arm64@0.17.18: + resolution: {integrity: sha512-Kb3Ko/KKaWhjeAm2YoT/cNZaHaD1Yk/pa3FTsmqo9uFh1D1Rfco7BBLIPdDOozrObj2sahslFuAQGvWbgWldAg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-ia32@0.17.18: + resolution: {integrity: sha512-0/xUMIdkVHwkvxfbd5+lfG7mHOf2FRrxNbPiKWg9C4fFrB8H0guClmaM3BFiRUYrznVoyxTIyC/Ou2B7QQSwmw==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-x64@0.17.18: + resolution: {integrity: sha512-qU25Ma1I3NqTSHJUOKi9sAH1/Mzuvlke0ioMJRthLXKm7JiSKVwFghlGbDLOO2sARECGhja4xYfRAZNPAkooYg==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@grpc/grpc-js@1.8.14: + resolution: {integrity: sha512-w84maJ6CKl5aApCMzFll0hxtFNT6or9WwMslobKaqWUEf1K+zhlL43bSQhFreyYWIWR+Z0xnVFC1KtLm4ZpM/A==} + engines: {node: ^8.13.0 || >=10.10.0} + dependencies: + '@grpc/proto-loader': 0.7.6 + '@types/node': 18.15.9 + dev: false + + /@grpc/proto-loader@0.7.6: + resolution: {integrity: sha512-QyAXR8Hyh7uMDmveWxDSUcJr9NAWaZ2I6IXgAYvQmfflwouTM+rArE2eEaCtLlRqO81j7pRLCt81IefUei6Zbw==} + engines: {node: '>=6'} + hasBin: true + dependencies: + '@types/long': 4.0.2 + lodash.camelcase: 4.3.0 + long: 4.0.0 + protobufjs: 7.2.2 + yargs: 16.2.0 + dev: false + + /@istanbuljs/schema@0.1.3: + resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} + engines: {node: '>=8'} + 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.18 + dev: true + + /@jridgewell/resolve-uri@3.1.0: + resolution: {integrity: sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==} + engines: {node: '>=6.0.0'} + 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.14: + resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==} + dev: true + + /@jridgewell/sourcemap-codec@1.4.15: + resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + dev: true + + /@jridgewell/trace-mapping@0.3.18: + resolution: {integrity: sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==} + dependencies: + '@jridgewell/resolve-uri': 3.1.0 + '@jridgewell/sourcemap-codec': 1.4.14 + 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 + + /@mapbox/node-pre-gyp@1.0.10: + resolution: {integrity: sha512-4ySo4CjzStuprMwk35H5pPbkymjv1SF3jGLj6rAHp/xT/RF7TL7bd9CTm1xDY49K2qF7jmR/g7k+SkLETP6opA==} + hasBin: true + dependencies: + detect-libc: 2.0.1 + https-proxy-agent: 5.0.1 + make-dir: 3.1.0 + node-fetch: 2.6.10 + nopt: 5.0.0 + npmlog: 5.0.1 + rimraf: 3.0.2 + semver: 7.5.0 + tar: 6.1.14 + transitivePeerDependencies: + - encoding + - supports-color + dev: true + + /@nodelib/fs.scandir@2.1.5: + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + dev: true + + /@nodelib/fs.stat@2.0.5: + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + dev: true + + /@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: true + + /@prisma/client@4.13.0(prisma@4.13.0): + resolution: {integrity: sha512-YaiiICcRB2hatxsbnfB66uWXjcRw3jsZdlAVxmx0cFcTc/Ad/sKdHCcWSnqyDX47vAewkjRFwiLwrOUjswVvmA==} + engines: {node: '>=14.17'} + requiresBuild: true + peerDependencies: + prisma: '*' + peerDependenciesMeta: + prisma: + optional: true + dependencies: + '@prisma/engines-version': 4.13.0-50.1e7af066ee9cb95cf3a403c78d9aab3e6b04f37a + prisma: 4.13.0 + dev: false + + /@prisma/engines-version@4.13.0-50.1e7af066ee9cb95cf3a403c78d9aab3e6b04f37a: + resolution: {integrity: sha512-fsQlbkhPJf08JOzKoyoD9atdUijuGBekwoOPZC3YOygXEml1MTtgXVpnUNchQlRSY82OQ6pSGQ9PxUe4arcSLQ==} + dev: false + + /@prisma/engines@4.13.0: + resolution: {integrity: sha512-HrniowHRZXHuGT9XRgoXEaP2gJLXM5RMoItaY2PkjvuZ+iHc0Zjbm/302MB8YsPdWozAPHHn+jpFEcEn71OgPw==} + requiresBuild: true + + /@protobufjs/aspromise@1.1.2: + resolution: {integrity: sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==} + dev: false + + /@protobufjs/base64@1.1.2: + resolution: {integrity: sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==} + dev: false + + /@protobufjs/codegen@2.0.4: + resolution: {integrity: sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==} + dev: false + + /@protobufjs/eventemitter@1.1.0: + resolution: {integrity: sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==} + dev: false + + /@protobufjs/fetch@1.1.0: + resolution: {integrity: sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==} + dependencies: + '@protobufjs/aspromise': 1.1.2 + '@protobufjs/inquire': 1.1.0 + dev: false + + /@protobufjs/float@1.0.2: + resolution: {integrity: sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==} + dev: false + + /@protobufjs/inquire@1.1.0: + resolution: {integrity: sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==} + dev: false + + /@protobufjs/path@1.1.2: + resolution: {integrity: sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==} + dev: false + + /@protobufjs/pool@1.1.0: + resolution: {integrity: sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==} + dev: false + + /@protobufjs/utf8@1.1.0: + resolution: {integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==} + 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.3: + resolution: {integrity: sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==} + dev: true + + /@types/chai-subset@1.3.3: + resolution: {integrity: sha512-frBecisrNGz+F4T6bcc+NLeolfiojh5FxW2klu669+8BARtyQv2C/GkNW6FUodVe4BroGMP/wER/YDGc7rEllw==} + dependencies: + '@types/chai': 4.3.5 + dev: true + + /@types/chai@4.3.5: + resolution: {integrity: sha512-mEo1sAde+UCE6b2hxn332f1g1E8WfYRu6p5SvTKr2ZKC1f7gFJXk4h5PyGP9Dt6gCaG8y8XhwnXWC6Iy2cmBng==} + dev: true + + /@types/istanbul-lib-coverage@2.0.4: + resolution: {integrity: sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==} + dev: true + + /@types/long@4.0.2: + resolution: {integrity: sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==} + dev: false + + /@types/node@18.15.9: + resolution: {integrity: sha512-dUxhiNzBLr6IqlZXz6e/rN2YQXlFgOei/Dxy+e3cyXTJ4txSUbGT2/fmnD6zd/75jDMeW5bDee+YXxlFKHoV0A==} + + /@vitest/coverage-c8@0.29.8(vitest@0.29.8): + resolution: {integrity: sha512-y+sEMQMctWokjnSqm3FCQEYFkjLrYaznsxEZHxcx8z2aftpYg3A5tvI1S5himfdEFo7o+OeHzh40bPSWZHW4oQ==} + peerDependencies: + vitest: '>=0.29.0 <1' + dependencies: + c8: 7.13.0 + picocolors: 1.0.0 + std-env: 3.3.3 + vitest: 0.29.8 + dev: true + + /@vitest/expect@0.29.8: + resolution: {integrity: sha512-xlcVXn5I5oTq6NiZSY3ykyWixBxr5mG8HYtjvpgg6KaqHm0mvhX18xuwl5YGxIRNt/A5jidd7CWcNHrSvgaQqQ==} + dependencies: + '@vitest/spy': 0.29.8 + '@vitest/utils': 0.29.8 + chai: 4.3.7 + dev: true + + /@vitest/runner@0.29.8: + resolution: {integrity: sha512-FzdhnRDwEr/A3Oo1jtIk/B952BBvP32n1ObMEb23oEJNO+qO5cBet6M2XWIDQmA7BDKGKvmhUf2naXyp/2JEwQ==} + dependencies: + '@vitest/utils': 0.29.8 + p-limit: 4.0.0 + pathe: 1.1.0 + dev: true + + /@vitest/spy@0.29.8: + resolution: {integrity: sha512-VdjBe9w34vOMl5I5mYEzNX8inTxrZ+tYUVk9jxaZJmHFwmDFC/GV3KBFTA/JKswr3XHvZL+FE/yq5EVhb6pSAw==} + dependencies: + tinyspy: 1.1.1 + dev: true + + /@vitest/utils@0.29.8: + resolution: {integrity: sha512-qGzuf3vrTbnoY+RjjVVIBYfuWMjn3UMUqyQtdGNZ6ZIIyte7B37exj6LaVkrZiUTvzSadVvO/tJm8AEgbGCBPg==} + dependencies: + cli-truncate: 3.1.0 + diff: 5.1.0 + loupe: 2.3.6 + pretty-format: 27.5.1 + dev: true + + /abbrev@1.1.1: + resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} + dev: true + + /acorn-walk@8.2.0: + resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} + engines: {node: '>=0.4.0'} + dev: true + + /acorn@8.8.2: + resolution: {integrity: sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==} + engines: {node: '>=0.4.0'} + hasBin: true + dev: true + + /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 + dev: true + + /ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + /ansi-regex@6.0.1: + resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} + engines: {node: '>=12'} + dev: true + + /ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + dependencies: + color-convert: 2.0.1 + + /ansi-styles@5.2.0: + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} + engines: {node: '>=10'} + dev: true + + /ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + dev: true + + /anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + dev: true + + /aproba@2.0.0: + resolution: {integrity: sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==} + dev: true + + /are-we-there-yet@2.0.0: + resolution: {integrity: sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==} + engines: {node: '>=10'} + dependencies: + delegates: 1.0.0 + readable-stream: 3.6.2 + dev: true + + /arg@4.1.3: + resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} + dev: true + + /array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + dev: true + + /assertion-error@1.1.0: + resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} + dev: true + + /at-least-node@1.0.0: + resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} + engines: {node: '>= 4.0.0'} + dev: true + + /balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + dev: true + + /base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + dev: true + + /binary-extensions@2.2.0: + resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} + engines: {node: '>=8'} + dev: true + + /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: true + + /brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + dev: true + + /braces@3.0.2: + resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + engines: {node: '>=8'} + dependencies: + fill-range: 7.0.1 + dev: true + + /buffer@5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + dev: true + + /c8@7.13.0: + resolution: {integrity: sha512-/NL4hQTv1gBL6J6ei80zu3IiTrmePDKXKXOTLpHvcIWZTVYQlDhVWjjWvkhICylE8EwwnMVzDZugCvdx0/DIIA==} + engines: {node: '>=10.12.0'} + hasBin: true + dependencies: + '@bcoe/v8-coverage': 0.2.3 + '@istanbuljs/schema': 0.1.3 + find-up: 5.0.0 + foreground-child: 2.0.0 + istanbul-lib-coverage: 3.2.0 + istanbul-lib-report: 3.0.0 + istanbul-reports: 3.1.5 + rimraf: 3.0.2 + test-exclude: 6.0.0 + v8-to-istanbul: 9.1.0 + yargs: 16.2.0 + yargs-parser: 20.2.9 + dev: true + + /cac@6.7.14: + resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} + engines: {node: '>=8'} + dev: true + + /chai@4.3.7: + resolution: {integrity: sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==} + engines: {node: '>=4'} + dependencies: + assertion-error: 1.1.0 + check-error: 1.0.2 + deep-eql: 4.1.3 + get-func-name: 2.0.0 + loupe: 2.3.6 + pathval: 1.1.1 + type-detect: 4.0.8 + dev: true + + /chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + dev: true + + /check-error@1.0.2: + resolution: {integrity: sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==} + dev: true + + /chokidar@3.5.3: + resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} + engines: {node: '>= 8.10.0'} + dependencies: + anymatch: 3.1.3 + braces: 3.0.2 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.2 + dev: true + + /chownr@1.1.4: + resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} + dev: true + + /chownr@2.0.0: + resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} + engines: {node: '>=10'} + dev: true + + /cli-truncate@3.1.0: + resolution: {integrity: sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + slice-ansi: 5.0.0 + string-width: 5.1.2 + dev: true + + /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 + + /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.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + /color-support@1.1.3: + resolution: {integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==} + hasBin: true + dev: true + + /concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + dev: true + + /console-control-strings@1.1.0: + resolution: {integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==} + dev: true + + /convert-source-map@1.9.0: + resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} + dev: true + + /core-util-is@1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + dev: true + + /create-require@1.1.1: + resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} + dev: true + + /cross-spawn@7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + dev: true + + /debug@3.2.7(supports-color@5.5.0): + resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.3 + supports-color: 5.5.0 + dev: true + + /debug@4.3.4: + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.2 + dev: true + + /decompress-response@6.0.0: + resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} + engines: {node: '>=10'} + dependencies: + mimic-response: 3.1.0 + dev: true + + /deep-eql@4.1.3: + resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==} + engines: {node: '>=6'} + dependencies: + type-detect: 4.0.8 + dev: true + + /deep-extend@0.6.0: + resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} + engines: {node: '>=4.0.0'} + dev: true + + /delegates@1.0.0: + resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==} + dev: true + + /detect-libc@2.0.1: + resolution: {integrity: sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==} + engines: {node: '>=8'} + dev: true + + /diff@4.0.2: + resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} + engines: {node: '>=0.3.1'} + dev: true + + /diff@5.1.0: + resolution: {integrity: sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==} + 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 + dev: true + + /dotenv@16.0.3: + resolution: {integrity: sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==} + engines: {node: '>=12'} + dev: false + + /eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + dev: true + + /emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + /emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + dev: true + + /end-of-stream@1.4.4: + resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + dependencies: + once: 1.4.0 + dev: true + + /esbuild@0.17.18: + resolution: {integrity: sha512-z1lix43jBs6UKjcZVKOw2xx69ffE2aG0PygLL5qJ9OS/gy0Ewd1gW/PUQIOIQGXBHWNywSc0floSKoMFF8aK2w==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/android-arm': 0.17.18 + '@esbuild/android-arm64': 0.17.18 + '@esbuild/android-x64': 0.17.18 + '@esbuild/darwin-arm64': 0.17.18 + '@esbuild/darwin-x64': 0.17.18 + '@esbuild/freebsd-arm64': 0.17.18 + '@esbuild/freebsd-x64': 0.17.18 + '@esbuild/linux-arm': 0.17.18 + '@esbuild/linux-arm64': 0.17.18 + '@esbuild/linux-ia32': 0.17.18 + '@esbuild/linux-loong64': 0.17.18 + '@esbuild/linux-mips64el': 0.17.18 + '@esbuild/linux-ppc64': 0.17.18 + '@esbuild/linux-riscv64': 0.17.18 + '@esbuild/linux-s390x': 0.17.18 + '@esbuild/linux-x64': 0.17.18 + '@esbuild/netbsd-x64': 0.17.18 + '@esbuild/openbsd-x64': 0.17.18 + '@esbuild/sunos-x64': 0.17.18 + '@esbuild/win32-arm64': 0.17.18 + '@esbuild/win32-ia32': 0.17.18 + '@esbuild/win32-x64': 0.17.18 + dev: true + + /escalade@3.1.1: + resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} + engines: {node: '>=6'} + + /expand-template@2.0.3: + resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} + engines: {node: '>=6'} + dev: true + + /fast-glob@3.2.12: + resolution: {integrity: sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==} + 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: true + + /fastq@1.15.0: + resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} + dependencies: + reusify: 1.0.4 + dev: true + + /fill-range@7.0.1: + resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} + engines: {node: '>=8'} + dependencies: + to-regex-range: 5.0.1 + dev: true + + /find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + dev: true + + /foreground-child@2.0.0: + resolution: {integrity: sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==} + engines: {node: '>=8.0.0'} + dependencies: + cross-spawn: 7.0.3 + signal-exit: 3.0.7 + dev: true + + /from2@2.3.0: + resolution: {integrity: sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==} + dependencies: + inherits: 2.0.4 + readable-stream: 2.3.8 + dev: true + + /fs-constants@1.0.0: + resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} + dev: true + + /fs-extra@9.1.0: + resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==} + engines: {node: '>=10'} + dependencies: + at-least-node: 1.0.0 + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.0 + dev: true + + /fs-minipass@2.1.0: + resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} + engines: {node: '>= 8'} + dependencies: + minipass: 3.3.6 + dev: true + + /fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + dev: true + + /fsevents@2.3.2: + resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /function-bind@1.1.1: + resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} + dev: true + + /gauge@3.0.2: + resolution: {integrity: sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==} + engines: {node: '>=10'} + dependencies: + aproba: 2.0.0 + color-support: 1.1.3 + console-control-strings: 1.1.0 + has-unicode: 2.0.1 + object-assign: 4.1.1 + signal-exit: 3.0.7 + string-width: 4.2.3 + strip-ansi: 6.0.1 + wide-align: 1.1.5 + dev: true + + /get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + + /get-func-name@2.0.0: + resolution: {integrity: sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==} + dev: true + + /github-from-package@0.0.0: + resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==} + dev: true + + /glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + dependencies: + is-glob: 4.0.3 + dev: true + + /glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + dev: true + + /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.2.12 + ignore: 5.2.4 + merge2: 1.4.1 + slash: 3.0.0 + dev: true + + /globrex@0.1.2: + resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} + dev: true + + /google-protobuf@3.21.2: + resolution: {integrity: sha512-3MSOYFO5U9mPGikIYCzK0SaThypfGgS6bHqrUGXG3DPHCrb+txNqeEcns1W0lkGfk0rCyNXm7xB9rMxnCiZOoA==} + dev: false + + /graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + dev: true + + /grpc-server-reflection@0.1.5: + resolution: {integrity: sha512-i69RYu6v65enzknNAPUgerFuVQfo+L3n9g4c1A/Sv5jUHMpxMIjSbBA+YWls9Sr4Flac4oohp4Gx8f389CaHuw==} + dependencies: + google-protobuf: 3.21.2 + dev: false + + /grpc-tools@1.12.4: + resolution: {integrity: sha512-5+mLAJJma3BjnW/KQp6JBjUMgvu7Mu3dBvBPd1dcbNIb+qiR0817zDpgPjS7gRb+l/8EVNIa3cB02xI9JLToKg==} + hasBin: true + requiresBuild: true + dependencies: + '@mapbox/node-pre-gyp': 1.0.10 + transitivePeerDependencies: + - encoding + - supports-color + dev: true + + /has-flag@3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + dev: true + + /has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + dev: true + + /has-unicode@2.0.1: + resolution: {integrity: sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==} + dev: true + + /has@1.0.3: + resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} + engines: {node: '>= 0.4.0'} + dependencies: + function-bind: 1.1.1 + dev: true + + /html-escaper@2.0.2: + resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} + dev: true + + /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 + dev: true + + /ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + dev: true + + /ignore-by-default@1.0.1: + resolution: {integrity: sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==} + dev: true + + /ignore@5.2.4: + resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} + engines: {node: '>= 4'} + dev: true + + /inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + dev: true + + /inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + dev: true + + /ini@1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + dev: true + + /into-stream@6.0.0: + resolution: {integrity: sha512-XHbaOAvP+uFKUFsOgoNPRjLkwB+I22JFPFe5OjTkQ0nwgj6+pSjb4NmB6VMxaPshLiOf+zcpOCBQuLwC1KHhZA==} + engines: {node: '>=10'} + dependencies: + from2: 2.3.0 + p-is-promise: 3.0.0 + dev: true + + /is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + dependencies: + binary-extensions: 2.2.0 + dev: true + + /is-core-module@2.12.0: + resolution: {integrity: sha512-RECHCBCd/viahWmwj6enj19sKbHfJrddi/6cBDsNTKbNq0f7VeaUkBo60BqzvPqo/W54ChS62Z5qyun7cfOMqQ==} + dependencies: + has: 1.0.3 + dev: true + + /is-core-module@2.9.0: + resolution: {integrity: sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==} + dependencies: + has: 1.0.3 + dev: true + + /is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + dev: true + + /is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + /is-fullwidth-code-point@4.0.0: + resolution: {integrity: sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==} + engines: {node: '>=12'} + dev: true + + /is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + dependencies: + is-extglob: 2.1.1 + dev: true + + /is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + dev: true + + /isarray@1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + dev: true + + /isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + dev: true + + /istanbul-lib-coverage@3.2.0: + resolution: {integrity: sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==} + engines: {node: '>=8'} + dev: true + + /istanbul-lib-report@3.0.0: + resolution: {integrity: sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==} + engines: {node: '>=8'} + dependencies: + istanbul-lib-coverage: 3.2.0 + make-dir: 3.1.0 + supports-color: 7.2.0 + dev: true + + /istanbul-reports@3.1.5: + resolution: {integrity: sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==} + engines: {node: '>=8'} + dependencies: + html-escaper: 2.0.2 + istanbul-lib-report: 3.0.0 + dev: true + + /jsesc@2.5.2: + resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} + engines: {node: '>=4'} + hasBin: true + dev: true + + /json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + dev: true + + /jsonc-parser@3.2.0: + resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} + dev: true + + /jsonfile@6.1.0: + resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + dependencies: + universalify: 2.0.0 + optionalDependencies: + graceful-fs: 4.2.11 + dev: true + + /local-pkg@0.4.3: + resolution: {integrity: sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==} + engines: {node: '>=14'} + dev: true + + /locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + dependencies: + p-locate: 5.0.0 + dev: true + + /lodash.camelcase@4.3.0: + resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} + dev: false + + /long@4.0.0: + resolution: {integrity: sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==} + dev: false + + /long@5.2.3: + resolution: {integrity: sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==} + dev: false + + /loupe@2.3.6: + resolution: {integrity: sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==} + dependencies: + get-func-name: 2.0.0 + dev: true + + /lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + dependencies: + yallist: 4.0.0 + dev: true + + /make-dir@3.1.0: + resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} + engines: {node: '>=8'} + dependencies: + semver: 6.3.0 + dev: true + + /make-error@1.3.6: + resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + dev: true + + /merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + dev: true + + /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: true + + /mimic-response@3.1.0: + resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} + engines: {node: '>=10'} + dev: true + + /minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + dependencies: + brace-expansion: 1.1.11 + dev: true + + /minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + dev: true + + /minipass@3.3.6: + resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} + engines: {node: '>=8'} + dependencies: + yallist: 4.0.0 + dev: true + + /minipass@5.0.0: + resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} + engines: {node: '>=8'} + dev: true + + /minizlib@2.1.2: + resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} + engines: {node: '>= 8'} + dependencies: + minipass: 3.3.6 + yallist: 4.0.0 + dev: true + + /mkdirp-classic@0.5.3: + resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} + dev: true + + /mkdirp@1.0.4: + resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} + engines: {node: '>=10'} + hasBin: true + dev: true + + /mlly@1.2.0: + resolution: {integrity: sha512-+c7A3CV0KGdKcylsI6khWyts/CYrGTrRVo4R/I7u/cUsy0Conxa6LUhiEzVKIw14lc2L5aiO4+SeVe4TeGRKww==} + dependencies: + acorn: 8.8.2 + pathe: 1.1.0 + pkg-types: 1.0.3 + ufo: 1.1.2 + dev: true + + /ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + dev: true + + /ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + dev: true + + /multistream@4.1.0: + resolution: {integrity: sha512-J1XDiAmmNpRCBfIWJv+n0ymC4ABcf/Pl+5YvC5B/D2f/2+8PtHvCNxMPKiQcZyi922Hq69J2YOpb1pTywfifyw==} + dependencies: + once: 1.4.0 + readable-stream: 3.6.2 + dev: true + + /nanoid@3.3.6: + resolution: {integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + dev: true + + /napi-build-utils@1.0.2: + resolution: {integrity: sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==} + dev: true + + /node-abi@3.40.0: + resolution: {integrity: sha512-zNy02qivjjRosswoYmPi8hIKJRr8MpQyeKT6qlcq/OnOgA3Rhoae+IYOqsM9V5+JnHWmxKnWOT2GxvtqdtOCXA==} + engines: {node: '>=10'} + dependencies: + semver: 7.5.0 + dev: true + + /node-fetch@2.6.10: + resolution: {integrity: sha512-5YytjUVbwzjE/BX4N62vnPPkGNxlJPwdA9/ArUc4pcM6cYS4Hinuv4VazzwjMGgnWuiQqcemOanib/5PpcsGug==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + dependencies: + whatwg-url: 5.0.0 + dev: true + + /nodemon@2.0.22: + resolution: {integrity: sha512-B8YqaKMmyuCO7BowF1Z1/mkPqLk6cs/l63Ojtd6otKjMx47Dq1utxfRxcavH1I7VSaL8n5BUaoutadnsX3AAVQ==} + engines: {node: '>=8.10.0'} + hasBin: true + dependencies: + chokidar: 3.5.3 + debug: 3.2.7(supports-color@5.5.0) + ignore-by-default: 1.0.1 + minimatch: 3.1.2 + pstree.remy: 1.1.8 + semver: 5.7.1 + simple-update-notifier: 1.1.0 + supports-color: 5.5.0 + touch: 3.1.0 + undefsafe: 2.0.5 + dev: true + + /nopt@1.0.10: + resolution: {integrity: sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==} + hasBin: true + dependencies: + abbrev: 1.1.1 + dev: true + + /nopt@5.0.0: + resolution: {integrity: sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==} + engines: {node: '>=6'} + hasBin: true + dependencies: + abbrev: 1.1.1 + dev: true + + /normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + dev: true + + /npmlog@5.0.1: + resolution: {integrity: sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==} + dependencies: + are-we-there-yet: 2.0.0 + console-control-strings: 1.1.0 + gauge: 3.0.2 + set-blocking: 2.0.0 + dev: true + + /object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + dev: true + + /once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + dependencies: + wrappy: 1.0.2 + dev: true + + /p-is-promise@3.0.0: + resolution: {integrity: sha512-Wo8VsW4IRQSKVXsJCn7TomUaVtyfjVDn3nUP7kE967BQk0CwFpdbZs0X0uk5sW9mkBa9eNM7hCMaG93WUAwxYQ==} + engines: {node: '>=8'} + dev: true + + /p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + dependencies: + yocto-queue: 0.1.0 + dev: true + + /p-limit@4.0.0: + resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + yocto-queue: 1.0.0 + dev: true + + /p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + dependencies: + p-limit: 3.1.0 + dev: true + + /path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + dev: true + + /path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + dev: true + + /path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + dev: true + + /path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + dev: true + + /path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + dev: true + + /pathe@1.1.0: + resolution: {integrity: sha512-ODbEPR0KKHqECXW1GoxdDb+AZvULmXjVPy4rt+pGo2+TnjJTIPJQSVS6N63n8T2Ip+syHhbn52OewKicV0373w==} + dev: true + + /pathval@1.1.1: + resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} + dev: true + + /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'} + dev: true + + /pkg-fetch@3.4.2: + resolution: {integrity: sha512-0+uijmzYcnhC0hStDjm/cl2VYdrmVVBpe7Q8k9YBojxmR5tG8mvR9/nooQq3QSXiQqORDVOTY3XqMEqJVIzkHA==} + hasBin: true + dependencies: + chalk: 4.1.2 + fs-extra: 9.1.0 + https-proxy-agent: 5.0.1 + node-fetch: 2.6.10 + progress: 2.0.3 + semver: 7.5.0 + tar-fs: 2.1.1 + yargs: 16.2.0 + transitivePeerDependencies: + - encoding + - supports-color + dev: true + + /pkg-types@1.0.3: + resolution: {integrity: sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==} + dependencies: + jsonc-parser: 3.2.0 + mlly: 1.2.0 + pathe: 1.1.0 + dev: true + + /pkg@5.8.1: + resolution: {integrity: sha512-CjBWtFStCfIiT4Bde9QpJy0KeH19jCfwZRJqHFDFXfhUklCx8JoFmMj3wgnEYIwGmZVNkhsStPHEOnrtrQhEXA==} + hasBin: true + peerDependencies: + node-notifier: '>=9.0.1' + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@babel/generator': 7.18.2 + '@babel/parser': 7.18.4 + '@babel/types': 7.19.0 + chalk: 4.1.2 + fs-extra: 9.1.0 + globby: 11.1.0 + into-stream: 6.0.0 + is-core-module: 2.9.0 + minimist: 1.2.8 + multistream: 4.1.0 + pkg-fetch: 3.4.2 + prebuild-install: 7.1.1 + resolve: 1.22.2 + stream-meter: 1.0.4 + transitivePeerDependencies: + - encoding + - supports-color + dev: true + + /postcss@8.4.23: + resolution: {integrity: sha512-bQ3qMcpF6A/YjR55xtoTr0jGOlnPOKAIMdOWiv0EIT6HVPEaJiJB4NLljSbiHoC2RX7DN5Uvjtpbg1NPdwv1oA==} + engines: {node: ^10 || ^12 || >=14} + dependencies: + nanoid: 3.3.6 + picocolors: 1.0.0 + source-map-js: 1.0.2 + dev: true + + /prebuild-install@7.1.1: + resolution: {integrity: sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==} + engines: {node: '>=10'} + hasBin: true + dependencies: + detect-libc: 2.0.1 + expand-template: 2.0.3 + github-from-package: 0.0.0 + minimist: 1.2.8 + mkdirp-classic: 0.5.3 + napi-build-utils: 1.0.2 + node-abi: 3.40.0 + pump: 3.0.0 + rc: 1.2.8 + simple-get: 4.0.1 + tar-fs: 2.1.1 + tunnel-agent: 0.6.0 + dev: true + + /pretty-format@27.5.1: + resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + ansi-regex: 5.0.1 + ansi-styles: 5.2.0 + react-is: 17.0.2 + dev: true + + /prisma@4.13.0: + resolution: {integrity: sha512-L9mqjnSmvWIRCYJ9mQkwCtj4+JDYYTdhoyo8hlsHNDXaZLh/b4hR0IoKIBbTKxZuyHQzLopb/+0Rvb69uGV7uA==} + engines: {node: '>=14.17'} + hasBin: true + requiresBuild: true + dependencies: + '@prisma/engines': 4.13.0 + + /process-nextick-args@2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + dev: true + + /progress@2.0.3: + resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} + engines: {node: '>=0.4.0'} + dev: true + + /protobufjs@7.2.2: + resolution: {integrity: sha512-++PrQIjrom+bFDPpfmqXfAGSQs40116JRrqqyf53dymUMvvb5d/LMRyicRoF1AUKoXVS1/IgJXlEgcpr4gTF3Q==} + engines: {node: '>=12.0.0'} + requiresBuild: true + dependencies: + '@protobufjs/aspromise': 1.1.2 + '@protobufjs/base64': 1.1.2 + '@protobufjs/codegen': 2.0.4 + '@protobufjs/eventemitter': 1.1.0 + '@protobufjs/fetch': 1.1.0 + '@protobufjs/float': 1.0.2 + '@protobufjs/inquire': 1.1.0 + '@protobufjs/path': 1.1.2 + '@protobufjs/pool': 1.1.0 + '@protobufjs/utf8': 1.1.0 + '@types/node': 18.15.9 + long: 5.2.3 + dev: false + + /pstree.remy@1.1.8: + resolution: {integrity: sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==} + dev: true + + /pump@3.0.0: + resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} + dependencies: + end-of-stream: 1.4.4 + once: 1.4.0 + dev: true + + /queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + dev: true + + /rc@1.2.8: + resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} + hasBin: true + dependencies: + deep-extend: 0.6.0 + ini: 1.3.8 + minimist: 1.2.8 + strip-json-comments: 2.0.1 + dev: true + + /react-is@17.0.2: + resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} + 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: true + + /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: true + + /readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + dependencies: + picomatch: 2.3.1 + dev: true + + /require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + + /resolve@1.22.2: + resolution: {integrity: sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==} + hasBin: true + dependencies: + is-core-module: 2.12.0 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + dev: true + + /reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + dev: true + + /rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + hasBin: true + dependencies: + glob: 7.2.3 + dev: true + + /rollup@3.21.5: + resolution: {integrity: sha512-a4NTKS4u9PusbUJcfF4IMxuqjFzjm6ifj76P54a7cKnvVzJaG12BLVR+hgU2YDGHzyMMQNxLAZWuALsn8q2oQg==} + engines: {node: '>=14.18.0', npm: '>=8.0.0'} + hasBin: true + optionalDependencies: + fsevents: 2.3.2 + dev: true + + /run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + dependencies: + queue-microtask: 1.2.3 + dev: true + + /safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + dev: true + + /safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + dev: true + + /semver@5.7.1: + resolution: {integrity: sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==} + hasBin: true + dev: true + + /semver@6.3.0: + resolution: {integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==} + hasBin: true + dev: true + + /semver@7.0.0: + resolution: {integrity: sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==} + hasBin: true + dev: true + + /semver@7.5.0: + resolution: {integrity: sha512-+XC0AD/R7Q2mPSRuy2Id0+CGTZ98+8f+KvwirxOKIEyid+XSx6HbC63p+O4IndTHuX5Z+JxQ0TghCkO5Cg/2HA==} + engines: {node: '>=10'} + hasBin: true + dependencies: + lru-cache: 6.0.0 + dev: true + + /set-blocking@2.0.0: + resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} + dev: true + + /shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + dependencies: + shebang-regex: 3.0.0 + dev: true + + /shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + 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==} + dev: true + + /simple-concat@1.0.1: + resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} + dev: true + + /simple-get@4.0.1: + resolution: {integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==} + dependencies: + decompress-response: 6.0.0 + once: 1.4.0 + simple-concat: 1.0.1 + dev: true + + /simple-update-notifier@1.1.0: + resolution: {integrity: sha512-VpsrsJSUcJEseSbMHkrsrAVSdvVS5I96Qo1QAQ4FxQ9wXFcB+pjj7FB7/us9+GcgfW4ziHtYMc1J0PLczb55mg==} + engines: {node: '>=8.10.0'} + dependencies: + semver: 7.0.0 + dev: true + + /slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + dev: true + + /slice-ansi@5.0.0: + resolution: {integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==} + engines: {node: '>=12'} + dependencies: + ansi-styles: 6.2.1 + is-fullwidth-code-point: 4.0.0 + dev: true + + /source-map-js@1.0.2: + resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} + engines: {node: '>=0.10.0'} + dev: true + + /source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + dev: true + + /stackback@0.0.2: + resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + dev: true + + /std-env@3.3.3: + resolution: {integrity: sha512-Rz6yejtVyWnVjC1RFvNmYL10kgjC49EOghxWn0RFqlCHGFpQx+Xe7yW3I4ceK1SGrWIGMjD5Kbue8W/udkbMJg==} + dev: true + + /stream-meter@1.0.4: + resolution: {integrity: sha512-4sOEtrbgFotXwnEuzzsQBYEV1elAeFSO8rSGeTwabuX1RRn/kEq9JVH7I0MRBhKVRR0sJkr0M0QCH7yOLf9fhQ==} + dependencies: + readable-stream: 2.3.8 + 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.0.1 + dev: true + + /string_decoder@1.1.1: + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + dependencies: + safe-buffer: 5.1.2 + dev: true + + /string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + dependencies: + safe-buffer: 5.2.1 + dev: true + + /strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + dependencies: + ansi-regex: 5.0.1 + + /strip-ansi@7.0.1: + resolution: {integrity: sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==} + engines: {node: '>=12'} + dependencies: + ansi-regex: 6.0.1 + dev: true + + /strip-bom@3.0.0: + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} + dev: true + + /strip-json-comments@2.0.1: + resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} + engines: {node: '>=0.10.0'} + dev: true + + /strip-literal@1.0.1: + resolution: {integrity: sha512-QZTsipNpa2Ppr6v1AmJHESqJ3Uz247MUS0OjrnnZjFAvEoWqxuyFuXn2xLgMtRnijJShAa1HL0gtJyUs7u7n3Q==} + dependencies: + acorn: 8.8.2 + dev: true + + /supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + dependencies: + has-flag: 3.0.0 + dev: true + + /supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + dependencies: + has-flag: 4.0.0 + dev: true + + /supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + dev: true + + /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: true + + /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: true + + /tar@6.1.14: + resolution: {integrity: sha512-piERznXu0U7/pW7cdSn7hjqySIVTYT6F76icmFk7ptU7dDYlXTm5r9A6K04R2vU3olYgoKeo1Cg3eeu5nhftAw==} + engines: {node: '>=10'} + dependencies: + chownr: 2.0.0 + fs-minipass: 2.1.0 + minipass: 5.0.0 + minizlib: 2.1.2 + mkdirp: 1.0.4 + yallist: 4.0.0 + dev: true + + /test-exclude@6.0.0: + resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} + engines: {node: '>=8'} + dependencies: + '@istanbuljs/schema': 0.1.3 + glob: 7.2.3 + minimatch: 3.1.2 + dev: true + + /tinybench@2.5.0: + resolution: {integrity: sha512-kRwSG8Zx4tjF9ZiyH4bhaebu+EDz1BOx9hOigYHlUW4xxI/wKIUQUqo018UlU4ar6ATPBsaMrdbKZ+tmPdohFA==} + dev: true + + /tinypool@0.4.0: + resolution: {integrity: sha512-2ksntHOKf893wSAH4z/+JbPpi92esw8Gn9N2deXX+B0EO92hexAVI9GIZZPx7P5aYo5KULfeOSt3kMOmSOy6uA==} + engines: {node: '>=14.0.0'} + dev: true + + /tinyspy@1.1.1: + resolution: {integrity: sha512-UVq5AXt/gQlti7oxoIg5oi/9r0WpF7DGEVwXgqWSMmyN16+e3tl5lIvTaOpJ3TAtu5xFzWccFRM4R5NaWHF+4g==} + engines: {node: '>=14.0.0'} + 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 + dev: true + + /touch@3.1.0: + resolution: {integrity: sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==} + hasBin: true + dependencies: + nopt: 1.0.10 + dev: true + + /tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + dev: true + + /ts-essentials@9.3.2(typescript@5.0.2): + resolution: {integrity: sha512-JxKJzuWqH1MmH4ZFHtJzGEhkfN3QvVR3C3w+4BIoWeoY68UVVoA2Np/Bca9z0IPSErVCWhv439aT0We4Dks8kQ==} + peerDependencies: + typescript: '>=4.1.0' + dependencies: + typescript: 5.0.2 + dev: true + + /ts-node@10.9.1(@types/node@18.15.9)(typescript@5.0.2): + 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.3 + '@types/node': 18.15.9 + acorn: 8.8.2 + 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.0.2 + v8-compile-cache-lib: 3.0.1 + yn: 3.1.1 + dev: true + + /tsconfck@2.1.1(typescript@5.0.2): + resolution: {integrity: sha512-ZPCkJBKASZBmBUNqGHmRhdhM8pJYDdOXp4nRgj/O0JwUwsMq50lCDRQP/M5GBNAA0elPrq4gAeu4dkaVCuKWww==} + engines: {node: ^14.13.1 || ^16 || >=18} + hasBin: true + peerDependencies: + typescript: ^4.3.5 || ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + dependencies: + typescript: 5.0.2 + 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 + + /tunnel-agent@0.6.0: + resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} + dependencies: + safe-buffer: 5.2.1 + dev: true + + /type-detect@4.0.8: + resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} + engines: {node: '>=4'} + dev: true + + /typescript@5.0.2: + resolution: {integrity: sha512-wVORMBGO/FAs/++blGNeAVdbNKtIh1rbBL2EyQ1+J9lClJ93KiiKe8PmFIVdXhHcyv44SL9oglmfeSsndo0jRw==} + engines: {node: '>=12.20'} + hasBin: true + dev: true + + /ufo@1.1.2: + resolution: {integrity: sha512-TrY6DsjTQQgyS3E3dBaOXf0TpPD8u9FVrVYmKVegJuFw51n/YB9XPt+U6ydzFG5ZIN7+DIjPbNmXoBj9esYhgQ==} + dev: true + + /undefsafe@2.0.5: + resolution: {integrity: sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==} + dev: true + + /universalify@2.0.0: + resolution: {integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==} + engines: {node: '>= 10.0.0'} + dev: true + + /util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + dev: true + + /v8-compile-cache-lib@3.0.1: + resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} + dev: true + + /v8-to-istanbul@9.1.0: + resolution: {integrity: sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA==} + engines: {node: '>=10.12.0'} + dependencies: + '@jridgewell/trace-mapping': 0.3.18 + '@types/istanbul-lib-coverage': 2.0.4 + convert-source-map: 1.9.0 + dev: true + + /vite-node@0.29.8(@types/node@18.15.9): + resolution: {integrity: sha512-b6OtCXfk65L6SElVM20q5G546yu10/kNrhg08afEoWlFRJXFq9/6glsvSVY+aI6YeC1tu2TtAqI2jHEQmOmsFw==} + engines: {node: '>=v14.16.0'} + hasBin: true + dependencies: + cac: 6.7.14 + debug: 4.3.4 + mlly: 1.2.0 + pathe: 1.1.0 + picocolors: 1.0.0 + vite: 4.3.5(@types/node@18.15.9) + transitivePeerDependencies: + - '@types/node' + - less + - sass + - stylus + - sugarss + - supports-color + - terser + dev: true + + /vite-tsconfig-paths@4.2.0(typescript@5.0.2): + resolution: {integrity: sha512-jGpus0eUy5qbbMVGiTxCL1iB9ZGN6Bd37VGLJU39kTDD6ZfULTTb1bcc5IeTWqWJKiWV5YihCaibeASPiGi8kw==} + peerDependencies: + vite: '*' + peerDependenciesMeta: + vite: + optional: true + dependencies: + debug: 4.3.4 + globrex: 0.1.2 + tsconfck: 2.1.1(typescript@5.0.2) + transitivePeerDependencies: + - supports-color + - typescript + dev: true + + /vite@4.3.5(@types/node@18.15.9): + resolution: {integrity: sha512-0gEnL9wiRFxgz40o/i/eTBwm+NEbpUeTWhzKrZDSdKm6nplj+z4lKz8ANDgildxHm47Vg8EUia0aicKbawUVVA==} + engines: {node: ^14.18.0 || >=16.0.0} + hasBin: true + peerDependencies: + '@types/node': '>= 14' + less: '*' + sass: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + dependencies: + '@types/node': 18.15.9 + esbuild: 0.17.18 + postcss: 8.4.23 + rollup: 3.21.5 + optionalDependencies: + fsevents: 2.3.2 + dev: true + + /vitest-mock-extended@1.1.3(typescript@5.0.2)(vitest@0.29.8): + resolution: {integrity: sha512-MiaKYZbTg+fjozKnCpoTTva0BnlSNYyk4jiPuM2xVhg4aou112QIrALdH3/ZKK6qfXWh0A17gFIjWJjylOlXxg==} + peerDependencies: + typescript: 3.x || 4.x || 5.x + vitest: '>=0.29.2' + dependencies: + ts-essentials: 9.3.2(typescript@5.0.2) + typescript: 5.0.2 + vitest: 0.29.8 + dev: true + + /vitest@0.29.8: + resolution: {integrity: sha512-JIAVi2GK5cvA6awGpH0HvH/gEG9PZ0a/WoxdiV3PmqK+3CjQMf8c+J/Vhv4mdZ2nRyXFw66sAg6qz7VNkaHfDQ==} + engines: {node: '>=v14.16.0'} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@vitest/browser': '*' + '@vitest/ui': '*' + happy-dom: '*' + jsdom: '*' + playwright: '*' + safaridriver: '*' + webdriverio: '*' + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@vitest/browser': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true + playwright: + optional: true + safaridriver: + optional: true + webdriverio: + optional: true + dependencies: + '@types/chai': 4.3.5 + '@types/chai-subset': 1.3.3 + '@types/node': 18.15.9 + '@vitest/expect': 0.29.8 + '@vitest/runner': 0.29.8 + '@vitest/spy': 0.29.8 + '@vitest/utils': 0.29.8 + acorn: 8.8.2 + acorn-walk: 8.2.0 + cac: 6.7.14 + chai: 4.3.7 + debug: 4.3.4 + local-pkg: 0.4.3 + pathe: 1.1.0 + picocolors: 1.0.0 + source-map: 0.6.1 + std-env: 3.3.3 + strip-literal: 1.0.1 + tinybench: 2.5.0 + tinypool: 0.4.0 + tinyspy: 1.1.1 + vite: 4.3.5(@types/node@18.15.9) + vite-node: 0.29.8(@types/node@18.15.9) + why-is-node-running: 2.2.2 + transitivePeerDependencies: + - less + - sass + - stylus + - sugarss + - supports-color + - terser + dev: true + + /webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + dev: true + + /whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + dev: true + + /which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + dependencies: + 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 + + /wide-align@1.1.5: + resolution: {integrity: sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==} + dependencies: + string-width: 4.2.3 + 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 + + /wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + dev: true + + /y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + + /yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + dev: true + + /yargs-parser@20.2.9: + resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} + engines: {node: '>=10'} + + /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 + + /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'} + dev: true + + /yocto-queue@1.0.0: + resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} + engines: {node: '>=12.20'} + dev: true diff --git a/services/order/prisma/schema.prisma b/services/order/prisma/schema.prisma new file mode 100644 index 00000000..521926d7 --- /dev/null +++ b/services/order/prisma/schema.prisma @@ -0,0 +1,49 @@ +datasource db { + provider = "mongodb" + url = env("DATABASE_URL") +} + +generator client { + provider = "prisma-client-js" + binaryTargets = ["native", "linux-musl", "linux-musl-openssl-3.0.x"] +} + +enum Status { + PENDING + IN_PROGRESS + FULFILLED + REJECTED +} + +model UserMinimum { + id String @id @default(cuid()) @map("_id") + + first_name String + last_name String + email String + phone String + + orders Order[] +} + +model Basket { + id String @id @default(cuid()) @map("_id") + json String + total Float + + Order Order? +} + +model Order { + id String @id @default(cuid()) @map("_id") + + payment_id String + delivery_id String + status Status @default(PENDING) + + user UserMinimum @relation(fields: [user_id], references: [id]) + user_id String + + basket_snapshot Basket @relation(fields: [basket_snapshot_id], references: [id]) + basket_snapshot_id String @unique +} diff --git a/services/order/prisma/seed.ts b/services/order/prisma/seed.ts new file mode 100644 index 00000000..7334c4c0 --- /dev/null +++ b/services/order/prisma/seed.ts @@ -0,0 +1,27 @@ +import { PrismaClient, Prisma } from "@prisma/client"; + +const prisma = new PrismaClient(); + + + +async function main() { + console.log(`Start seeding ...`); + // for (const d of deliveries) { + // const delivery = await prisma.delivery.create({ + // data: d, + // }); + // console.log(`Created delivery with id: ${delivery.id}`); + // } + console.log(`Seeding finished.`); +} + +main() + .then(async () => { + await prisma.$disconnect(); + }) + .catch(async (e) => { + console.error(e); + await prisma.$disconnect(); + // @ts-ignore + process.exit(1); + }); diff --git a/services/order/proto b/services/order/proto new file mode 120000 index 00000000..4d1e2d8b --- /dev/null +++ b/services/order/proto @@ -0,0 +1 @@ +../proto/ \ No newline at end of file diff --git a/services/order/reflection_descriptor.bin b/services/order/reflection_descriptor.bin new file mode 100644 index 0000000000000000000000000000000000000000..1814264c3d1cd940648b8245fe7998362324f81a GIT binary patch literal 1380 zcmbtU%Wl&^6ph^^#MdQ>E-Xv|6-;@Eg%{}`khoD$NGqGHgIiCjA@&&0q*6bi|G-!A z4{Z1j#$#JJW{^^`urzb-nX7Zpxib6&FliQ&%t|GY#MlQt3N7uK_QvqU37-O7Mj7L)B#4QnOWcsiLIC&}jCD{|_hhw~1G4xKIwTIF zwbhn|;(`KAuV_N7PJzmc{RF!20``?~L}-6uG$}R6vwf>W=QN*0r7sO`Vv_Kc&|T^) zky(g`V1{HJU6br4uNMlTf&}3h+8Z&xlxU6)oxd$|YW8@NjAIy_OR+1K1Sz|sTn=N7 z4pi@pxx9Yy#4lgq2)c|1e8a4+Fru%1>q~}LGVSLum=Z3X@W{6fVZ3RG{X+vBXC&Zc zizafc`Bda<{L`nxN0m>xga6}Gz6y8p$^I?|TBc!hAjP8A2E6+s{D~u%xLX`YfD^JN z4XYc!Y5a1Om{WAKG)JF9BBPX~`wB-zq#p$BGd uxA2vUTO;h+vlg$qXN|B^&re|1ELZoe5vrcARr74|itOyxc~|~YkADMZ!=*w1 literal 0 HcmV?d00001 diff --git a/services/order/src/handlers/.gitinclude b/services/order/src/handlers/.gitinclude new file mode 100644 index 00000000..e69de29b diff --git a/services/order/tsconfig.json b/services/order/tsconfig.json new file mode 100644 index 00000000..f7f47ecc --- /dev/null +++ b/services/order/tsconfig.json @@ -0,0 +1,18 @@ +{ + "compilerOptions": { + "sourceMap": true, + "outDir": "dist", + "strict": true, + "lib": ["esnext"], + "esModuleInterop": true, + "baseUrl": ".", + "paths": { + "@order/*": ["src/*"] + } + }, + "include": ["src/**/*.ts"], + "exclude": ["node_modules"], + "ts-node": { + "require": ["tsconfig-paths/register"] + } +} diff --git a/services/order/vitest.config.ts b/services/order/vitest.config.ts new file mode 100644 index 00000000..773de309 --- /dev/null +++ b/services/order/vitest.config.ts @@ -0,0 +1,10 @@ +import { defineConfig } from "vitest/config"; +import tsconfigPaths from "vite-tsconfig-paths"; + +export default defineConfig({ + plugins: [tsconfigPaths()], + base: "/src/tests", + // test: { + // setupFiles: ["./src/tests/setup.ts"], + // }, +}); diff --git a/services/proto/order.proto b/services/proto/order.proto index cc428597..12012b35 100644 --- a/services/proto/order.proto +++ b/services/proto/order.proto @@ -1,6 +1,6 @@ syntax = "proto3"; -package com.goodfood.ordering; +package com.goodfood.order; enum Status { PENDING = 0; @@ -18,7 +18,7 @@ enum Status { } message Basket { - + string json = 1; // TODO: to be implemented } @@ -28,12 +28,47 @@ message Order { string id = 1; - string payment_id = 3; - string delivery_id = 4; + string payment_id = 2; + string delivery_id = 3; - UserMinimum user = 2; + UserMinimum user = 4; Basket basket_snapshot = 5; Status status = 6; } +service OrderService { + rpc GetOrder(GetOrderRequest) returns (Order) {} + rpc CreateOrder(CreateOrderRequest) returns (Order) {} + rpc UpdateOrder(UpdateOrderRequest) returns (Order) {} + rpc DeleteOrder(DeleteOrderRequest) returns (DeleteOrderResponse) {} +} + +message GetOrderRequest { + string id = 1; +} + +message CreateOrderRequest { + string payment_id = 1; + string delivery_id = 2; + + UserMinimum user = 3; + Basket basket_snapshot = 4; +} + +message UpdateOrderRequest{ + string id = 1; + + string payment_id = 2; + string delivery_id = 3; + + Status status = 4; +} + +message DeleteOrderRequest { + string id = 1; +} + +message DeleteOrderResponse { + string id = 1; +} From 1b5a7ed54d6ce96f6b87cf5edf34e716b2e6f655 Mon Sep 17 00:00:00 2001 From: Florian LEROUX <10078837+floriaaan@users.noreply.github.com> Date: Tue, 9 May 2023 14:37:19 +0200 Subject: [PATCH 184/883] feat(k8s): add k8s config files --- services/order/k8s/configmap.yml | 8 ++++++++ services/order/k8s/deployment.yml | 31 +++++++++++++++++++++++++++++++ services/order/k8s/hpa.yml | 18 ++++++++++++++++++ services/order/k8s/ingress.yml | 17 +++++++++++++++++ services/order/k8s/service.yml | 13 +++++++++++++ 5 files changed, 87 insertions(+) create mode 100644 services/order/k8s/configmap.yml create mode 100644 services/order/k8s/deployment.yml create mode 100644 services/order/k8s/hpa.yml create mode 100644 services/order/k8s/ingress.yml create mode 100644 services/order/k8s/service.yml diff --git a/services/order/k8s/configmap.yml b/services/order/k8s/configmap.yml new file mode 100644 index 00000000..7df0eea5 --- /dev/null +++ b/services/order/k8s/configmap.yml @@ -0,0 +1,8 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: goodfood-order-configmap + labels: + app: goodfood-order +data: + port: "50007" \ No newline at end of file diff --git a/services/order/k8s/deployment.yml b/services/order/k8s/deployment.yml new file mode 100644 index 00000000..4a19c90c --- /dev/null +++ b/services/order/k8s/deployment.yml @@ -0,0 +1,31 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: goodfood-order + labels: + app: goodfood-order +spec: + selector: + matchLabels: + app: goodfood-order + template: + metadata: + labels: + app: goodfood-order + spec: + containers: + - name: goodfood-order + image: floriaaan/goodfood-order:1.0.0 + imagePullPolicy: Always + resources: + limits: + memory: "128Mi" + cpu: "200m" + env: + - name: PORT + valueFrom: + configMapKeyRef: + name: goodfood-order-configmap + key: port + ports: + - containerPort: 50007 diff --git a/services/order/k8s/hpa.yml b/services/order/k8s/hpa.yml new file mode 100644 index 00000000..d41ba971 --- /dev/null +++ b/services/order/k8s/hpa.yml @@ -0,0 +1,18 @@ +apiVersion: autoscaling/v2 +kind: HorizontalPodAutoscaler +metadata: + name: goodfood-order-hpa +spec: + scaleTargetRef: + apiVersion: apps/v1 + kind: Deployment + name: goodfood-order + minReplicas: 1 + maxReplicas: 3 + metrics: + - type: Resource + resource: + name: cpu + target: + type: Utilization + averageUtilization: 50 diff --git a/services/order/k8s/ingress.yml b/services/order/k8s/ingress.yml new file mode 100644 index 00000000..165a428d --- /dev/null +++ b/services/order/k8s/ingress.yml @@ -0,0 +1,17 @@ +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + name: goodfood-order +spec: + ingressClassName: nginx + rules: + - host: order.localdev.me + http: + paths: + - pathType: Prefix + backend: + service: + name: goodfood-order + port: + number: 50007 + path: / \ No newline at end of file diff --git a/services/order/k8s/service.yml b/services/order/k8s/service.yml new file mode 100644 index 00000000..b13d0350 --- /dev/null +++ b/services/order/k8s/service.yml @@ -0,0 +1,13 @@ +apiVersion: v1 +kind: Service +metadata: + name: goodfood-order +spec: + selector: + app: goodfood-order + ports: + - name: "grpc" + port: 50007 + targetPort: 50007 +status: + loadBalancer: {} From d3106a9207ab5b3e1de71f193681ed87a4eccd2a Mon Sep 17 00:00:00 2001 From: Florian LEROUX <10078837+floriaaan@users.noreply.github.com> Date: Tue, 9 May 2023 14:37:37 +0200 Subject: [PATCH 185/883] feat(grpc): add grpc config files --- services/order/src/lib/reflection.ts | 23 +++++++++ .../order/src/resources/grpc-credentials.ts | 5 ++ .../src/resources/protoloader-options.ts | 7 +++ services/order/src/types/index.d.ts | 3 ++ services/order/src/types/order.d.ts | 48 +++++++++++++++++++ 5 files changed, 86 insertions(+) create mode 100644 services/order/src/lib/reflection.ts create mode 100644 services/order/src/resources/grpc-credentials.ts create mode 100644 services/order/src/resources/protoloader-options.ts create mode 100644 services/order/src/types/index.d.ts create mode 100644 services/order/src/types/order.d.ts diff --git a/services/order/src/lib/reflection.ts b/services/order/src/lib/reflection.ts new file mode 100644 index 00000000..e00ef94e --- /dev/null +++ b/services/order/src/lib/reflection.ts @@ -0,0 +1,23 @@ +import { Server } from "@grpc/grpc-js"; +import { log } from "@order/lib/log"; +import { access, constants } from "fs"; +import { addReflection as base_addReflection } from "grpc-server-reflection"; +import { resolve as resolvePath } from "path"; + +export const addReflection = (server: Server, path: string) => { + if (process.env.NODE_ENV === "production") { + log.warn("Reflection is disabled in production"); + return; + } + + const resolvedPath = resolvePath(path); + try { + access(resolvedPath, constants.R_OK, () => {}); + + base_addReflection(server, path); + } catch (err) { + console.log("here"); + log.warn(`Reflection file ${resolvedPath} is not readable`); + return; + } +}; diff --git a/services/order/src/resources/grpc-credentials.ts b/services/order/src/resources/grpc-credentials.ts new file mode 100644 index 00000000..75a2b5d5 --- /dev/null +++ b/services/order/src/resources/grpc-credentials.ts @@ -0,0 +1,5 @@ +import { credentials, ServerCredentials } from "@grpc/grpc-js"; + +export const insecure = credentials.createInsecure(); + +export const serverInsecure = ServerCredentials.createInsecure(); diff --git a/services/order/src/resources/protoloader-options.ts b/services/order/src/resources/protoloader-options.ts new file mode 100644 index 00000000..5022d96d --- /dev/null +++ b/services/order/src/resources/protoloader-options.ts @@ -0,0 +1,7 @@ +export const options = { + keepCase: true, + longs: String, + enums: String, + defaults: true, + oneofs: true, +}; diff --git a/services/order/src/types/index.d.ts b/services/order/src/types/index.d.ts new file mode 100644 index 00000000..edf2bebf --- /dev/null +++ b/services/order/src/types/index.d.ts @@ -0,0 +1,3 @@ +export type Data = { + request: T; +}; diff --git a/services/order/src/types/order.d.ts b/services/order/src/types/order.d.ts new file mode 100644 index 00000000..9d4db67b --- /dev/null +++ b/services/order/src/types/order.d.ts @@ -0,0 +1,48 @@ +import { Status } from "@prisma/client"; + +export type UserMinimum = { + id: string; + first_name: string; + last_name: string; + email: string; + phone: string; +}; + +export type Basket = { + json: string; // TODO: to be implemented +}; + +export type Order = { + id: string; + payment_id: string; + delivery_id: string; + user: UserMinimum; + basket_snapshot: Basket; + status: Status; +}; + +export type GetOrderRequest = { + id: string; +}; + +export type CreateOrderRequest = { + payment_id: string; + delivery_id: string; + user: UserMinimum; + basket_snapshot: Basket; +}; + +export type UpdateOrderRequest = { + id: string; + payment_id: string; + delivery_id: string; + status: Status; +}; + +export type DeleteOrderRequest = { + id: string; +}; + +export type DeleteOrderResponse = { + id: string; +}; From 25e3d278abbd7c10238667d096cb4206ed6ab843 Mon Sep 17 00:00:00 2001 From: Florian LEROUX <10078837+floriaaan@users.noreply.github.com> Date: Tue, 9 May 2023 14:37:47 +0200 Subject: [PATCH 186/883] feat(libs): add libs --- services/order/src/lib/log.ts | 74 ++++++++++++++++++++++++++++++++ services/order/src/lib/prisma.ts | 29 +++++++++++++ 2 files changed, 103 insertions(+) create mode 100644 services/order/src/lib/log.ts create mode 100644 services/order/src/lib/prisma.ts diff --git a/services/order/src/lib/log.ts b/services/order/src/lib/log.ts new file mode 100644 index 00000000..2404af54 --- /dev/null +++ b/services/order/src/lib/log.ts @@ -0,0 +1,74 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ +/* eslint-disable no-console */ + +function getStackTrace() { + let stack; + + try { + throw new Error(""); + } catch (error) { + stack = (error as Error).stack || ""; + } + + stack = stack.split("\n").map((line) => line.trim()); + return stack.splice(stack[0] === "Error" ? 2 : 1); +} + +const getInitiator = () => { + // _getInitiatorLine, _ObjectInfoLine, caller + const [, , caller] = getStackTrace(); + const file = caller.split("/").at(-1) || ""; + return file.replace(")", ""); +}; + +const warn = (...args: any[]) => { + console.group( + `\x1b[33m${new Date().toISOString()} - WARN - ${getInitiator()}\x1b[0m` + ); + console.warn(...args); + console.groupEnd(); +}; +const error = (...args: any[]) => { + console.group( + `\x1b[31m${new Date().toISOString()} - ERROR - ${getInitiator()}\x1b[0m` + ); + console.error(...args); + console.groupEnd(); +}; +const info = (...args: any[]) => { + console.group( + `\x1b[34m${new Date().toISOString()} - INFO - ${getInitiator()}\x1b[0m` + ); + console.log(...args); + console.groupEnd(); +}; +const debug = (...args: any[]) => { + console.log(...args); +}; + +/** + * @description a simple interface logger for logging to the console and into a log drain in the future + * @example + * log.warn('this is a warning'); + * log.error('this is an error'); + * log.info('this is an info'); + * @exports log + */ +export const log = { + warn, + error, + info, + debug, +}; + +export const utils = { + bold: (text: string) => `\x1b[1m${text}\x1b[0m`, + red: (text: string) => `\x1b[31m${text}\x1b[0m`, + green: (text: string) => `\x1b[32m${text}\x1b[0m`, + yellow: (text: string) => `\x1b[33m${text}\x1b[0m`, + blue: (text: string) => `\x1b[34m${text}\x1b[0m`, + magenta: (text: string) => `\x1b[35m${text}\x1b[0m`, + cyan: (text: string) => `\x1b[36m${text}\x1b[0m`, + white: (text: string) => `\x1b[37m${text}\x1b[0m`, + gray: (text: string) => `\x1b[90m${text}\x1b[0m`, +}; diff --git a/services/order/src/lib/prisma.ts b/services/order/src/lib/prisma.ts new file mode 100644 index 00000000..4d495ef0 --- /dev/null +++ b/services/order/src/lib/prisma.ts @@ -0,0 +1,29 @@ +import { Prisma, PrismaClient } from "@prisma/client"; + +let prisma: PrismaClient; +type GlobalWithPrisma = typeof globalThis & { + prisma: PrismaClient; +}; + +const OPTIONS: Prisma.PrismaClientOptions = { + log: + process.env.NEXT_PUBLIC_APP_ENV !== "production" + ? ["info", "warn"] + : undefined, +}; + +if (process.env.NODE_ENV === "production") { + prisma = new PrismaClient(OPTIONS); +} else { + // Ensure the prisma instance is re-used during hot-reloading + // Otherwise, a new client will be created on every reload + if (!("prisma" in global)) { + (global as GlobalWithPrisma).prisma = new PrismaClient(OPTIONS); + } + + prisma = (global as GlobalWithPrisma).prisma; +} + +export default prisma; + +export { prisma }; From f2f7af2d4f14206ba0728c7e6a092108c565d7a6 Mon Sep 17 00:00:00 2001 From: Florian LEROUX <10078837+floriaaan@users.noreply.github.com> Date: Tue, 9 May 2023 14:38:00 +0200 Subject: [PATCH 187/883] feat(handlers): add handlers --- services/order/src/handlers/order/create.ts | 35 +++++++++++++++++++++ services/order/src/handlers/order/delete.ts | 21 +++++++++++++ services/order/src/handlers/order/get.ts | 22 +++++++++++++ services/order/src/handlers/order/index.ts | 13 ++++++++ services/order/src/handlers/order/update.ts | 31 ++++++++++++++++++ 5 files changed, 122 insertions(+) create mode 100644 services/order/src/handlers/order/create.ts create mode 100644 services/order/src/handlers/order/delete.ts create mode 100644 services/order/src/handlers/order/get.ts create mode 100644 services/order/src/handlers/order/index.ts create mode 100644 services/order/src/handlers/order/update.ts diff --git a/services/order/src/handlers/order/create.ts b/services/order/src/handlers/order/create.ts new file mode 100644 index 00000000..5ed878d0 --- /dev/null +++ b/services/order/src/handlers/order/create.ts @@ -0,0 +1,35 @@ +import { prisma } from "@order/lib/prisma"; +import { log } from "@order/lib/log"; +import { CreateOrderRequest, Order } from "@order/types/order"; +import { Data } from "@order/types"; + +export const CreateOrder = async ( + { request }: Data, + callback: (err: any, response: Order | null) => void +) => { + log.debug("request received at CreateOrder handler\n", request); + try { + const { basket_snapshot, delivery_id, payment_id, user } = request; + + // todo: calculate total from basket_snapshot + const total = 0; // basket_snapshot.reduce; + + const order = await prisma.order.create({ + data: { + delivery_id, + payment_id, + user: { connectOrCreate: { where: { id: user.id }, create: user } }, + basket_snapshot: { + create: { json: basket_snapshot.json, total }, + }, + }, + include: { basket_snapshot: true, user: true }, + }); + + console.log("order", order) + callback(null, order); + } catch (error) { + log.error(error); + callback(error, null); + } +}; diff --git a/services/order/src/handlers/order/delete.ts b/services/order/src/handlers/order/delete.ts new file mode 100644 index 00000000..1fa59615 --- /dev/null +++ b/services/order/src/handlers/order/delete.ts @@ -0,0 +1,21 @@ +import { prisma } from "@order/lib/prisma"; +import { log } from "@order/lib/log"; +import { DeleteOrderRequest, DeleteOrderResponse } from "@order/types/order"; +import { Data } from "@order/types"; + +export const DeleteOrder = async ( + { request }: Data, + callback: (err: any, response: DeleteOrderResponse | null) => void +) => { + log.debug("request received at DeleteOrder handler\n", request); + try { + const { id } = request; + const order = await prisma.order.delete({ + where: { id }, + }); + callback(null, { id: order.id }); + } catch (error) { + log.error(error); + callback(error, null); + } +}; diff --git a/services/order/src/handlers/order/get.ts b/services/order/src/handlers/order/get.ts new file mode 100644 index 00000000..f6dd99ae --- /dev/null +++ b/services/order/src/handlers/order/get.ts @@ -0,0 +1,22 @@ +import { prisma } from "@order/lib/prisma"; +import { log } from "@order/lib/log"; +import { GetOrderRequest, Order } from "@order/types/order"; +import { Data } from "@order/types"; + +export const GetOrder = async ( + { request }: Data, + callback: (err: any, response: Order | null) => void +) => { + log.debug("request received at GetOrder handler\n", request); + try { + const { id } = request; + const order = await prisma.order.findUniqueOrThrow({ + where: { id }, + include: { basket_snapshot: true, user: true }, + }); + callback(null, order); + } catch (error) { + log.error(error); + callback(error, null); + } +}; diff --git a/services/order/src/handlers/order/index.ts b/services/order/src/handlers/order/index.ts new file mode 100644 index 00000000..6294989f --- /dev/null +++ b/services/order/src/handlers/order/index.ts @@ -0,0 +1,13 @@ +import { CreateOrder } from "./create"; +import { GetOrder } from "./get"; +import { UpdateOrder } from "./update"; +import { DeleteOrder } from "./delete"; + +const orderHandlers = { + CreateOrder, + GetOrder, + UpdateOrder, + DeleteOrder, +}; + +export default orderHandlers; diff --git a/services/order/src/handlers/order/update.ts b/services/order/src/handlers/order/update.ts new file mode 100644 index 00000000..107aabdc --- /dev/null +++ b/services/order/src/handlers/order/update.ts @@ -0,0 +1,31 @@ +import { prisma } from "@order/lib/prisma"; +import { log } from "@order/lib/log"; +import { UpdateOrderRequest, Order } from "@order/types/order"; +import { Data } from "@order/types"; + +export const UpdateOrder = async ( + { request }: Data, + callback: (err: any, response: Order | null) => void +) => { + log.debug("request received at UpdateOrder handler\n", request); + try { + const { delivery_id, payment_id, id, status } = request; + + // todo: calculate total from basket_snapshot + const total = 0; // basket_snapshot.reduce; + + const order = await prisma.order.update({ + where: { id }, + data: { + delivery_id, + payment_id, + status, + }, + include: { basket_snapshot: true, user: true }, + }); + callback(null, order); + } catch (error) { + log.error(error); + callback(error, null); + } +}; From e811bb87e1047b9be406b567ab249886d1233030 Mon Sep 17 00:00:00 2001 From: Florian LEROUX <10078837+floriaaan@users.noreply.github.com> Date: Tue, 9 May 2023 14:38:11 +0200 Subject: [PATCH 188/883] feat(server): add main server --- services/order/src/server.ts | 48 ++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 services/order/src/server.ts diff --git a/services/order/src/server.ts b/services/order/src/server.ts new file mode 100644 index 00000000..b64ba69b --- /dev/null +++ b/services/order/src/server.ts @@ -0,0 +1,48 @@ +import "dotenv/config"; +import { resolve as resolvePath } from "path"; + +import { loadSync } from "@grpc/proto-loader"; +import { + loadPackageDefinition, + Server, + ServiceDefinition, +} from "@grpc/grpc-js"; + +import { log, utils } from "@order/lib/log"; +import { options } from "@order/resources/protoloader-options"; +import { serverInsecure } from "@order/resources/grpc-credentials"; +import { addReflection } from "@order/lib/reflection"; +import orderHandlers from "@order/handlers/order"; + +const PORT = process.env.PORT || 50007; +const ADDRESS = `0.0.0.0:${PORT}`; + +const PROTO_PATH = resolvePath(__dirname + "/../../proto/order.proto"); +// const REFLECTION_PATH = resolvePath( +// __dirname + "/../reflection_descriptor.bin" +// ); + +const packageDefinition = loadSync(PROTO_PATH, options); +const grpc = loadPackageDefinition(packageDefinition); +const order = grpc as unknown as { + com: { goodfood: { order: { OrderService: ServiceDefinition } } }; +}["com"]["goodfood"]["order"]["OrderService"]; + +const server = new Server(); +server.addService(order, orderHandlers); + +server.bindAsync(ADDRESS, serverInsecure, (err) => { + if (err) { + log.error(err); + process.exit(1); + } + server.start(); + // addReflection(server, REFLECTION_PATH); + const message = + `---- ${utils.green("good")}${utils.yellow("food")} Order Service ----` + + `\n` + + `started on: ${utils.bold(ADDRESS)} ${utils.green("✓")}\n`; + log.debug(message); +}); + +export default server; From 828936117eeb8c6bd529bc03d9fe851e8cb53695 Mon Sep 17 00:00:00 2001 From: Florian LEROUX <10078837+floriaaan@users.noreply.github.com> Date: Wed, 10 May 2023 08:59:53 +0200 Subject: [PATCH 189/883] feat(ci): add workflow --- .github/workflows/order.yml | 69 +++++++++++++++++++++++++++++++++++++ services/order/.env.example | 3 +- services/order/Dockerfile | 6 ++-- 3 files changed, 74 insertions(+), 4 deletions(-) create mode 100644 .github/workflows/order.yml diff --git a/.github/workflows/order.yml b/.github/workflows/order.yml new file mode 100644 index 00000000..2551d7bf --- /dev/null +++ b/.github/workflows/order.yml @@ -0,0 +1,69 @@ +name: Delivery Microservice CI/CD + +on: + push: + branches: [ order ] + pull_request: + branches: [ dev, main ] + +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@master + - uses: pnpm/action-setup@v2 + with: + version: 7 + - uses: actions/setup-node@v3 + with: + node-version: "18.x" + cache: "pnpm" + cache-dependency-path: services/order/pnpm-lock.yaml + - name: Install dependencies + run: | + cd ./services/order + pnpm install --frozen-lockfile + - name: Build + run: | + cd ./services/order + pnpm build + + test: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@master + - uses: pnpm/action-setup@v2 + with: + version: 7 + - uses: actions/setup-node@v3 + with: + node-version: "18.x" + cache: "pnpm" + cache-dependency-path: services/order/pnpm-lock.yaml + - name: Install dependencies + run: | + cd ./services/order + pnpm install --frozen-lockfile + - name: Execute tests + run: | + cd ./services/order + pnpm test + + publish: + runs-on: ubuntu-latest + needs: [ build, test ] + steps: + - name: Checkout code + uses: actions/checkout@master + - name: Login to Docker Hub + uses: docker/login-action@v2 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + - name: Build and push + uses: docker/build-push-action@v4 + with: + context: ./services/ + file: ./services/order/Dockerfile + push: true + tags: floriaaan/goodfood-order:latest \ No newline at end of file diff --git a/services/order/.env.example b/services/order/.env.example index 23313f7e..54d2fa33 100644 --- a/services/order/.env.example +++ b/services/order/.env.example @@ -1,5 +1,6 @@ DB_USER=user DB_PASS=pass -DATABASE_URL=mongodb+srv://${DB_USER}:${DB_PASS}@test.kcs3xbg.mongodb.net/?retryWrites=true&w=majority +DB_HOST=mongodb +DATABASE_URL=mongodb+srv://${DB_USER}:${DB_PASS}@${DB_HOST}/order?retryWrites=true&w=majority PORT=50007 \ No newline at end of file diff --git a/services/order/Dockerfile b/services/order/Dockerfile index 19327c3e..6e37d753 100644 --- a/services/order/Dockerfile +++ b/services/order/Dockerfile @@ -4,12 +4,12 @@ FROM node:18-alpine3.17 as builder WORKDIR /app # Copy the application code -COPY ./delivery/ . +COPY ./order/ . # Install dependencies RUN npm install -# Copy the proto files - TODO: fix this, proto files should be copied from goodfood/services/proto +# Copy the proto files COPY ./proto ./proto/ # Generate Prisma client @@ -32,7 +32,7 @@ COPY --from=builder /app/proto/ /proto/ COPY --from=builder /app/node_modules/.prisma /.prisma # Expose the gRPC port -EXPOSE 50008 +EXPOSE 50007 # Start the server CMD [ "node", "index.js"] From 34a23c9c5dd884e81f2dd194d97e51045a6d6d50 Mon Sep 17 00:00:00 2001 From: Florian LEROUX <10078837+floriaaan@users.noreply.github.com> Date: Wed, 10 May 2023 09:00:31 +0200 Subject: [PATCH 190/883] feat(data-structure): add toGrpc, parseStruct & toStruct methods --- services/order/prisma/schema.prisma | 10 ++- services/order/prisma/seed.ts | 96 +++++++++++++++++++-- services/order/src/handlers/order/create.ts | 13 ++- services/order/src/handlers/order/get.ts | 3 +- services/order/src/handlers/order/index.ts | 4 +- services/order/src/handlers/order/update.ts | 3 +- services/order/src/lib/struct.ts | 43 +++++++++ services/order/src/lib/transformer.ts | 21 +++++ services/order/src/server.ts | 28 ++---- services/order/src/types/order.d.ts | 5 +- services/proto/order.proto | 7 +- 11 files changed, 193 insertions(+), 40 deletions(-) create mode 100644 services/order/src/lib/struct.ts create mode 100644 services/order/src/lib/transformer.ts diff --git a/services/order/prisma/schema.prisma b/services/order/prisma/schema.prisma index 521926d7..84d76908 100644 --- a/services/order/prisma/schema.prisma +++ b/services/order/prisma/schema.prisma @@ -27,9 +27,10 @@ model UserMinimum { } model Basket { - id String @id @default(cuid()) @map("_id") - json String - total Float + id String @id @default(cuid()) @map("_id") + json Json? + string String + total Float Order Order? } @@ -46,4 +47,7 @@ model Order { basket_snapshot Basket @relation(fields: [basket_snapshot_id], references: [id]) basket_snapshot_id String @unique + + created_at DateTime @default(now()) + updated_at DateTime @updatedAt } diff --git a/services/order/prisma/seed.ts b/services/order/prisma/seed.ts index 7334c4c0..73eb3646 100644 --- a/services/order/prisma/seed.ts +++ b/services/order/prisma/seed.ts @@ -1,17 +1,97 @@ -import { PrismaClient, Prisma } from "@prisma/client"; +import { PrismaClient, Prisma, Status } from "@prisma/client"; const prisma = new PrismaClient(); - +const orders: Prisma.OrderCreateInput[] = [ + { + id: "order_id:1", + payment_id: "payment_id:1", + delivery_id: "delivery_id:1", + user: { + connectOrCreate: { + where: { id: "user_id:1" }, + create: { + id: "user_id:1", + first_name: "John", + last_name: "Doe", + email: "john@doe.com", + phone: "0612345678", + }, + }, + }, + basket_snapshot: { + create: { + json: {}, + string: JSON.stringify({}), + total: 0, + }, + }, + status: Status.PENDING, + }, + { + id: "order_id:2", + payment_id: "payment_id:2", + delivery_id: "delivery_id:2", + user: { + connectOrCreate: { + where: { id: "user_id:1" }, + create: { + id: "user_id:1", + first_name: "John", + last_name: "Doe", + email: "john@doe.com", + phone: "0612345678", + }, + }, + }, + basket_snapshot: { + create: { + json: {}, + string: JSON.stringify({}), + total: 0, + }, + }, + status: Status.FULFILLED, + }, + { + id: "order_id:3", + payment_id: "payment_id:3", + delivery_id: "delivery_id:3", + user: { + connectOrCreate: { + where: { id: "user_id:2" }, + create: { + id: "user_id:2", + first_name: "Foonie", + last_name: "Garbage", + email: "foo@gar.com", + phone: "0612345678", + }, + }, + }, + basket_snapshot: { + create: { + json: {}, + string: JSON.stringify({}), + total: 0, + }, + }, + status: Status.PENDING, + }, +]; async function main() { + console.log(`Delete existing data ...`); + await prisma.order.deleteMany(); + await prisma.userMinimum.deleteMany(); + await prisma.basket.deleteMany(); + console.log(`Existing data deleted.`); + console.log(`Start seeding ...`); - // for (const d of deliveries) { - // const delivery = await prisma.delivery.create({ - // data: d, - // }); - // console.log(`Created delivery with id: ${delivery.id}`); - // } + for (const o of orders) { + const order = await prisma.order.create({ data: o }); + console.log(`Created order with id: ${order.id}`); + } console.log(`Seeding finished.`); } diff --git a/services/order/src/handlers/order/create.ts b/services/order/src/handlers/order/create.ts index 5ed878d0..3d06d7af 100644 --- a/services/order/src/handlers/order/create.ts +++ b/services/order/src/handlers/order/create.ts @@ -2,6 +2,8 @@ import { prisma } from "@order/lib/prisma"; import { log } from "@order/lib/log"; import { CreateOrderRequest, Order } from "@order/types/order"; import { Data } from "@order/types"; +import { parseStruct } from "@order/lib/struct"; +import { toGrpc } from "@order/lib/transformer"; export const CreateOrder = async ( { request }: Data, @@ -20,14 +22,19 @@ export const CreateOrder = async ( payment_id, user: { connectOrCreate: { where: { id: user.id }, create: user } }, basket_snapshot: { - create: { json: basket_snapshot.json, total }, + create: { + string: basket_snapshot.string, + json: + parseStruct(basket_snapshot.json) || + JSON.parse(basket_snapshot.string), + total, + }, }, }, include: { basket_snapshot: true, user: true }, }); - console.log("order", order) - callback(null, order); + callback(null, toGrpc(order)); } catch (error) { log.error(error); callback(error, null); diff --git a/services/order/src/handlers/order/get.ts b/services/order/src/handlers/order/get.ts index f6dd99ae..5798e13b 100644 --- a/services/order/src/handlers/order/get.ts +++ b/services/order/src/handlers/order/get.ts @@ -2,6 +2,7 @@ import { prisma } from "@order/lib/prisma"; import { log } from "@order/lib/log"; import { GetOrderRequest, Order } from "@order/types/order"; import { Data } from "@order/types"; +import { toGrpc } from "@order/lib/transformer"; export const GetOrder = async ( { request }: Data, @@ -14,7 +15,7 @@ export const GetOrder = async ( where: { id }, include: { basket_snapshot: true, user: true }, }); - callback(null, order); + callback(null, toGrpc(order)); } catch (error) { log.error(error); callback(error, null); diff --git a/services/order/src/handlers/order/index.ts b/services/order/src/handlers/order/index.ts index 6294989f..b0757cd5 100644 --- a/services/order/src/handlers/order/index.ts +++ b/services/order/src/handlers/order/index.ts @@ -1,9 +1,11 @@ +import { UntypedServiceImplementation } from "@grpc/grpc-js"; + import { CreateOrder } from "./create"; import { GetOrder } from "./get"; import { UpdateOrder } from "./update"; import { DeleteOrder } from "./delete"; -const orderHandlers = { +const orderHandlers: UntypedServiceImplementation = { CreateOrder, GetOrder, UpdateOrder, diff --git a/services/order/src/handlers/order/update.ts b/services/order/src/handlers/order/update.ts index 107aabdc..dfb64c28 100644 --- a/services/order/src/handlers/order/update.ts +++ b/services/order/src/handlers/order/update.ts @@ -2,6 +2,7 @@ import { prisma } from "@order/lib/prisma"; import { log } from "@order/lib/log"; import { UpdateOrderRequest, Order } from "@order/types/order"; import { Data } from "@order/types"; +import { toGrpc } from "@order/lib/transformer"; export const UpdateOrder = async ( { request }: Data, @@ -23,7 +24,7 @@ export const UpdateOrder = async ( }, include: { basket_snapshot: true, user: true }, }); - callback(null, order); + callback(null, toGrpc(order)); } catch (error) { log.error(error); callback(error, null); diff --git a/services/order/src/lib/struct.ts b/services/order/src/lib/struct.ts new file mode 100644 index 00000000..1897abf1 --- /dev/null +++ b/services/order/src/lib/struct.ts @@ -0,0 +1,43 @@ +import { Prisma } from "@prisma/client"; + +export type Struct = { + fields: { + [key: string]: { + kind: string; + [key: string]: any; + }; + }; +}; + +export const parseStruct = (struct: Struct) => { + const fields = struct.fields; + + if (!fields || Object.keys(fields).length === 0) return null; + + const parsed = Object.entries(fields).reduce((acc: any, [key, value]) => { + return { + ...acc, + [key]: value[value.kind], + }; + }, {}); + + return parsed; +}; + +export const toStruct = ( + obj: { [key: string]: any } | Prisma.JsonValue | null +): Struct => { + if (!obj) return { fields: {} }; + const fields = Object.entries(obj).reduce((acc: any, [key, value]) => { + return { + ...acc, + [key]: { + [`${typeof value}Value`]: value, + }, + }; + }, {}); + + console.log(fields); + + return { fields }; +}; diff --git a/services/order/src/lib/transformer.ts b/services/order/src/lib/transformer.ts new file mode 100644 index 00000000..3e5a58fc --- /dev/null +++ b/services/order/src/lib/transformer.ts @@ -0,0 +1,21 @@ +import { toStruct } from "@order/lib/struct"; +import { Basket, Order, UserMinimum } from "@prisma/client"; + +export const toGrpc = ( + order: Order & { + user: UserMinimum; + basket_snapshot: Basket; + } +) => { + return { + id: order.id, + payment_id: order.payment_id, + delivery_id: order.delivery_id, + user: order.user, + basket_snapshot: { + string: order.basket_snapshot.string, + json: toStruct(order.basket_snapshot.json), + }, + status: order.status, + }; +}; diff --git a/services/order/src/server.ts b/services/order/src/server.ts index b64ba69b..7181463d 100644 --- a/services/order/src/server.ts +++ b/services/order/src/server.ts @@ -2,11 +2,7 @@ import "dotenv/config"; import { resolve as resolvePath } from "path"; import { loadSync } from "@grpc/proto-loader"; -import { - loadPackageDefinition, - Server, - ServiceDefinition, -} from "@grpc/grpc-js"; +import { loadPackageDefinition, Server } from "@grpc/grpc-js"; import { log, utils } from "@order/lib/log"; import { options } from "@order/resources/protoloader-options"; @@ -18,26 +14,20 @@ const PORT = process.env.PORT || 50007; const ADDRESS = `0.0.0.0:${PORT}`; const PROTO_PATH = resolvePath(__dirname + "/../../proto/order.proto"); -// const REFLECTION_PATH = resolvePath( -// __dirname + "/../reflection_descriptor.bin" -// ); +const REFLECTION_PATH = resolvePath( + __dirname + "/../reflection_descriptor.bin" +); const packageDefinition = loadSync(PROTO_PATH, options); -const grpc = loadPackageDefinition(packageDefinition); -const order = grpc as unknown as { - com: { goodfood: { order: { OrderService: ServiceDefinition } } }; -}["com"]["goodfood"]["order"]["OrderService"]; +const grpc = loadPackageDefinition(packageDefinition) as any; +const { service } = grpc.com.goodfood.order.OrderService; const server = new Server(); -server.addService(order, orderHandlers); +server.addService(service, orderHandlers); -server.bindAsync(ADDRESS, serverInsecure, (err) => { - if (err) { - log.error(err); - process.exit(1); - } +server.bindAsync(ADDRESS, serverInsecure, () => { server.start(); - // addReflection(server, REFLECTION_PATH); + addReflection(server, REFLECTION_PATH); const message = `---- ${utils.green("good")}${utils.yellow("food")} Order Service ----` + `\n` + diff --git a/services/order/src/types/order.d.ts b/services/order/src/types/order.d.ts index 9d4db67b..ba22109c 100644 --- a/services/order/src/types/order.d.ts +++ b/services/order/src/types/order.d.ts @@ -1,4 +1,4 @@ -import { Status } from "@prisma/client"; +import { Prisma, Status } from "@prisma/client"; export type UserMinimum = { id: string; @@ -9,7 +9,8 @@ export type UserMinimum = { }; export type Basket = { - json: string; // TODO: to be implemented + string: string; + json?: string | Prisma.JsonValue | any; }; export type Order = { diff --git a/services/proto/order.proto b/services/proto/order.proto index 12012b35..b6b4ac36 100644 --- a/services/proto/order.proto +++ b/services/proto/order.proto @@ -2,6 +2,9 @@ syntax = "proto3"; package com.goodfood.order; +import "google/protobuf/struct.proto"; + + enum Status { PENDING = 0; IN_PROGRESS = 1; @@ -18,8 +21,8 @@ enum Status { } message Basket { - string json = 1; - // TODO: to be implemented + string string = 1; + optional google.protobuf.Struct json = 2; } From 5e894034004eac9254c613d36b5aa4739fc12fce Mon Sep 17 00:00:00 2001 From: Florian LEROUX <10078837+floriaaan@users.noreply.github.com> Date: Wed, 10 May 2023 09:04:37 +0200 Subject: [PATCH 191/883] fix(ci): remove generate grpc reflection from npm postinstall script --- .github/workflows/order.yml | 2 +- services/order/package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/order.yml b/.github/workflows/order.yml index 2551d7bf..ed557e26 100644 --- a/.github/workflows/order.yml +++ b/.github/workflows/order.yml @@ -1,4 +1,4 @@ -name: Delivery Microservice CI/CD +name: Order Microservice CI/CD on: push: diff --git a/services/order/package.json b/services/order/package.json index 2bdae690..5eb82da3 100644 --- a/services/order/package.json +++ b/services/order/package.json @@ -11,7 +11,7 @@ "prisma:generate": "prisma generate", "seed": "ts-node prisma/seed.ts", "grpc:reflection": "./generate_grpc_reflection.sh", - "postinstall": "npm run prisma:generate && npm run grpc:reflection" + "postinstall": "npm run prisma:generate" }, "dependencies": { "@grpc/grpc-js": "1.8.14", From e3dd079ea91de67f5381cc95f127bf07b43781e1 Mon Sep 17 00:00:00 2001 From: Florian LEROUX <10078837+floriaaan@users.noreply.github.com> Date: Wed, 10 May 2023 09:44:27 +0200 Subject: [PATCH 192/883] feat(tests): add tests --- services/order/package.json | 2 +- services/order/src/lib/struct.ts | 4 +- services/order/src/lib/transformer.ts | 10 +-- services/order/src/tests/struct.test.ts | 64 ++++++++++++++ services/order/src/tests/transformer.test.ts | 90 ++++++++++++++++++++ services/order/src/types/order.d.ts | 7 +- 6 files changed, 166 insertions(+), 11 deletions(-) create mode 100644 services/order/src/tests/struct.test.ts create mode 100644 services/order/src/tests/transformer.test.ts diff --git a/services/order/package.json b/services/order/package.json index 5eb82da3..c17ea276 100644 --- a/services/order/package.json +++ b/services/order/package.json @@ -5,7 +5,7 @@ "start": "node dist/index.js", "dev": "nodemon --watch 'src/**/*.ts' --exec 'ts-node' src/server.ts", "build": "esbuild src/server.ts --bundle --platform=node --target=node18 --outfile=dist/index.js", - "test": "echo 'tests are disabled' # vitest", + "test": "vitest", "coverage": "vitest --coverage", "pkg": "pkg .", "prisma:generate": "prisma generate", diff --git a/services/order/src/lib/struct.ts b/services/order/src/lib/struct.ts index 1897abf1..09a49b5a 100644 --- a/services/order/src/lib/struct.ts +++ b/services/order/src/lib/struct.ts @@ -10,6 +10,7 @@ export type Struct = { }; export const parseStruct = (struct: Struct) => { + if (!struct) return null; const fields = struct.fields; if (!fields || Object.keys(fields).length === 0) return null; @@ -32,12 +33,11 @@ export const toStruct = ( return { ...acc, [key]: { + kind: `${typeof value}Value`, [`${typeof value}Value`]: value, }, }; }, {}); - console.log(fields); - return { fields }; }; diff --git a/services/order/src/lib/transformer.ts b/services/order/src/lib/transformer.ts index 3e5a58fc..344b9fcc 100644 --- a/services/order/src/lib/transformer.ts +++ b/services/order/src/lib/transformer.ts @@ -1,12 +1,8 @@ import { toStruct } from "@order/lib/struct"; -import { Basket, Order, UserMinimum } from "@prisma/client"; +import { ExtendedOrder } from "@order/types/order"; -export const toGrpc = ( - order: Order & { - user: UserMinimum; - basket_snapshot: Basket; - } -) => { +export const toGrpc = (order: ExtendedOrder) => { + if(!order) return null return { id: order.id, payment_id: order.payment_id, diff --git a/services/order/src/tests/struct.test.ts b/services/order/src/tests/struct.test.ts new file mode 100644 index 00000000..482f189d --- /dev/null +++ b/services/order/src/tests/struct.test.ts @@ -0,0 +1,64 @@ +import { Struct, parseStruct, toStruct } from "@order/lib/struct"; +import { assert, describe, it } from "vitest"; + +describe("tests@goodfood/order.struct.parseStruct", function () { + it("tests @goodfood/order.struct.parseStruct in expected situation", () => { + const _struct = { + fields: { + id: { + kind: "stringValue", + stringValue: "1", + }, + name: { + kind: "numberValue", + numberValue: "2", + }, + }, + }; + const parsed = parseStruct(_struct); + assert.equal(parsed.id, "1"); + assert.equal(parsed.name, "2"); + }); + + it("tests @goodfood/order.struct.parseStruct with empty struct", () => { + const _struct = { + fields: {}, + }; + const parsed = parseStruct(_struct); + assert.equal(parsed, null); + }); + + it("tests @goodfood/order.struct.parseStruct with null struct", () => { + const _struct = null; + const parsed = parseStruct(_struct as unknown as Struct); + assert.equal(parsed, null); + }); +}); + +describe("tests@goodfood/order.struct.toStruct", function () { + it("tests @goodfood/order.struct.toStruct in expected situation", () => { + const _struct = { + id: 1, + name: "2", + }; + const parsed = toStruct(_struct); + assert.equal(parsed.fields.id.kind, "numberValue"); + assert.equal(parsed.fields.id.numberValue, 1); + assert.equal(parsed.fields.name.kind, "stringValue"); + assert.equal(parsed.fields.name.stringValue, "2"); + + assert.equal(Object.keys(parsed.fields).length, 2); + }); + + it("tests @goodfood/order.struct.toStruct with empty struct", () => { + const _struct = {}; + const parsed = toStruct(_struct); + assert.equal(Object.keys(parsed.fields).length, 0); + }); + + it("tests @goodfood/order.struct.toStruct with null struct", () => { + const _struct = null; + const parsed = toStruct(_struct as unknown as Struct); + assert.equal(Object.keys(parsed.fields).length, 0); + }) +}); diff --git a/services/order/src/tests/transformer.test.ts b/services/order/src/tests/transformer.test.ts new file mode 100644 index 00000000..9049bb75 --- /dev/null +++ b/services/order/src/tests/transformer.test.ts @@ -0,0 +1,90 @@ +import { toStruct } from "@order/lib/struct"; +import { toGrpc } from "@order/lib/transformer"; +import { ExtendedOrder } from "@order/types/order"; +import { Status } from "@prisma/client"; +import { assert, describe, it } from "vitest"; + +describe("tests@goodfood/order.transformer.toGrpc", function () { + it("tests @goodfood/order.transformer.toGrpc in expected situation", () => { + const _order: ExtendedOrder = { + id: "order_id:1", + payment_id: "payment_id:1", + delivery_id: "delivery_id:1", + user: { + id: "user_id:1", + first_name: "first_name", + last_name: "last_name", + email: "email", + phone: "phone", + }, + basket_snapshot: { + string: + '{"products":[{"id":"product_id:1","name":"product_name","price":1,"quantity":1}]}', + json: { + products: [ + { id: "product_id:1", name: "product_name", price: 1, quantity: 1 }, + ], + }, + }, + status: Status.PENDING, + }; + const parsed = toGrpc(_order); + + assert.equal(parsed?.id, "order_id:1"); + assert.equal(parsed?.payment_id, "payment_id:1"); + assert.equal(parsed?.delivery_id, "delivery_id:1"); + assert.equal(parsed?.user.id, "user_id:1"); + assert.equal(parsed?.user.first_name, "first_name"); + assert.equal(parsed?.user.last_name, "last_name"); + assert.equal(parsed?.user.email, "email"); + assert.equal(parsed?.user.phone, "phone"); + assert.equal( + parsed?.basket_snapshot.string, + '{"products":[{"id":"product_id:1","name":"product_name","price":1,"quantity":1}]}' + ); + assert.deepEqual( + parsed?.basket_snapshot.json, + toStruct(_order.basket_snapshot.json) + ); + assert.equal(parsed?.status, Status.PENDING); + }); + + it("tests @goodfood/order.transformer.toGrpc with empty order", () => { + const _order: ExtendedOrder = { + id: "", + payment_id: "", + delivery_id: "", + user: { + id: "", + first_name: "", + last_name: "", + email: "", + phone: "", + }, + basket_snapshot: { + string: "", + json: {}, + }, + status: Status.PENDING, + }; + const parsed = toGrpc(_order); + + assert.equal(parsed?.id, ""); + assert.equal(parsed?.payment_id, ""); + assert.equal(parsed?.delivery_id, ""); + assert.equal(parsed?.user.id, ""); + assert.equal(parsed?.user.first_name, ""); + assert.equal(parsed?.user.last_name, ""); + assert.equal(parsed?.user.email, ""); + assert.equal(parsed?.user.phone, ""); + assert.equal(parsed?.basket_snapshot.string, ""); + assert.deepEqual(parsed?.basket_snapshot.json, toStruct({})); + assert.equal(parsed?.status, Status.PENDING); + }); + + it("tests @goodfood/order.transformer.toGrpc with null order", () => { + const _order: ExtendedOrder = null as any; + const parsed = toGrpc(_order); + assert.equal(parsed, null); + }); +}); diff --git a/services/order/src/types/order.d.ts b/services/order/src/types/order.d.ts index ba22109c..e8e8d577 100644 --- a/services/order/src/types/order.d.ts +++ b/services/order/src/types/order.d.ts @@ -10,7 +10,7 @@ export type UserMinimum = { export type Basket = { string: string; - json?: string | Prisma.JsonValue | any; + json?: string | Prisma.JsonValue | any; }; export type Order = { @@ -47,3 +47,8 @@ export type DeleteOrderRequest = { export type DeleteOrderResponse = { id: string; }; + +export type ExtendedOrder = Order & { + user: UserMinimum; + basket_snapshot: Basket; +}; From 25635de05823b8506febb3a49f34f5edf20fe0c8 Mon Sep 17 00:00:00 2001 From: Florian LEROUX <10078837+floriaaan@users.noreply.github.com> Date: Wed, 10 May 2023 14:15:57 +0200 Subject: [PATCH 193/883] feat(proxy): add server proxy to add amqp publishing log --- services/order/.env.example | 2 + services/order/README.md | 31 +++-- services/order/package.json | 2 + services/order/pnpm-lock.yaml | 76 ++++++++++- services/order/src/handlers/order/create.ts | 1 - services/order/src/handlers/order/delete.ts | 1 - services/order/src/handlers/order/get.ts | 1 - services/order/src/handlers/order/update.ts | 1 - services/order/src/lib/amqp.ts | 33 +++++ services/order/src/lib/proxy.ts | 132 ++++++++++++++++++++ services/order/src/middleware/log.ts | 39 ++++++ services/order/src/server.ts | 7 +- 12 files changed, 305 insertions(+), 21 deletions(-) create mode 100644 services/order/src/lib/amqp.ts create mode 100644 services/order/src/lib/proxy.ts create mode 100644 services/order/src/middleware/log.ts diff --git a/services/order/.env.example b/services/order/.env.example index 54d2fa33..4caef961 100644 --- a/services/order/.env.example +++ b/services/order/.env.example @@ -3,4 +3,6 @@ DB_PASS=pass DB_HOST=mongodb DATABASE_URL=mongodb+srv://${DB_USER}:${DB_PASS}@${DB_HOST}/order?retryWrites=true&w=majority +AMQP_URL=amqp://guest:guest@localhost + PORT=50007 \ No newline at end of file diff --git a/services/order/README.md b/services/order/README.md index 7cace267..5da48544 100644 --- a/services/order/README.md +++ b/services/order/README.md @@ -1,30 +1,39 @@ # Order Microservice -| Informations | -| ------------------------------------------- | -| **Port:** 50007 | -| **Developer:** @floriaaan | -| **Status:** In progress | -| **Last update:** 2023-04-16 | -| **Language:** NodeJS | -| **Dependencies:** TypeScript, gRPC, MongoDB | -| **Models:** ? | +| Informations | +| ------------------------------------------------- | +| **Port:** 50007 | +| **Developer:** @floriaaan | +| **Status:** In progress | +| **Last update:** 2023-05-10 | +| **Language:** NodeJS | +| **Dependencies:** TypeScript, gRPC, MongoDB, AMQP | +| **Models:** | ## gRPC Methods -TBW +The service provides the following gRPC methods: + +- `GetOrder`: Retrieves an order by its ID. +- `CreateOrder`: Creates a new order. +- `UpdateOrder`: Updates an existing order. +- `DeleteOrder`: Deletes an order by its ID. ## Requirements To run this microservice, you will need to have the following installed on your system: - NodeJS (v18.12.0 or higher) (dev. with v18.12.0) -- MongoDB +- MongoDB (dev. with mongoDB Atlas) You can use the following tools to help you with the setup: - You can use nvm to set your Node version using: - `nvm use`. +- You can use docker to run your MongoDB server using: + - `docker run --name mongodb -p 27017:27017 -d mongo:latest` +- You can use docker to run your RabbitMQ server using: + - `docker run --name rabbitmq -p 5672:5672 -p 15672:15672 -d rabbitmq:3-management` ## Getting started diff --git a/services/order/package.json b/services/order/package.json index c17ea276..dedafdc5 100644 --- a/services/order/package.json +++ b/services/order/package.json @@ -17,11 +17,13 @@ "@grpc/grpc-js": "1.8.14", "@grpc/proto-loader": "0.7.6", "@prisma/client": "4.13.0", + "amqplib": "^0.10.3", "dotenv": "^16.0.3", "grpc-server-reflection": "^0.1.5", "protobufjs": "7.2.2" }, "devDependencies": { + "@types/amqplib": "^0.10.1", "@types/node": "18.15.9", "@vitest/coverage-c8": "^0.29.8", "esbuild": "^0.17.18", diff --git a/services/order/pnpm-lock.yaml b/services/order/pnpm-lock.yaml index 89c3b1e5..6d13847a 100644 --- a/services/order/pnpm-lock.yaml +++ b/services/order/pnpm-lock.yaml @@ -10,6 +10,9 @@ dependencies: '@prisma/client': specifier: 4.13.0 version: 4.13.0(prisma@4.13.0) + amqplib: + specifier: ^0.10.3 + version: 0.10.3 dotenv: specifier: ^16.0.3 version: 16.0.3 @@ -21,6 +24,9 @@ dependencies: version: 7.2.2 devDependencies: + '@types/amqplib': + specifier: ^0.10.1 + version: 0.10.1 '@types/node': specifier: 18.15.9 version: 18.15.9 @@ -63,6 +69,17 @@ devDependencies: packages: + /@acuminous/bitsyntax@0.1.2: + resolution: {integrity: sha512-29lUK80d1muEQqiUsSo+3A0yP6CdspgC95EnKBMi22Xlwt79i/En4Vr67+cXhU+cZjbti3TgGGC5wy1stIywVQ==} + engines: {node: '>=0.8'} + dependencies: + buffer-more-ints: 1.0.0 + debug: 4.3.4 + safe-buffer: 5.1.2 + transitivePeerDependencies: + - supports-color + dev: false + /@babel/generator@7.18.2: resolution: {integrity: sha512-W1lG5vUwFvfMd8HVXqdfbuG7RuaSrTCCD8cl8fP8wOivdbtbIg2Db3IWUcgvfxKbbn6ZBGYRW/Zk1MIwK49mgw==} engines: {node: '>=6.9.0'} @@ -499,6 +516,12 @@ packages: resolution: {integrity: sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==} dev: true + /@types/amqplib@0.10.1: + resolution: {integrity: sha512-j6ANKT79ncUDnAs/+9r9eDujxbeJoTjoVu33gHHcaPfmLQaMhvfbH2GqSe8KUM444epAp1Vl3peVOQfZk3UIqA==} + dependencies: + '@types/node': 18.15.9 + dev: true + /@types/chai-subset@1.3.3: resolution: {integrity: sha512-frBecisrNGz+F4T6bcc+NLeolfiojh5FxW2klu669+8BARtyQv2C/GkNW6FUodVe4BroGMP/wER/YDGc7rEllw==} dependencies: @@ -586,6 +609,18 @@ packages: - supports-color dev: true + /amqplib@0.10.3: + resolution: {integrity: sha512-UHmuSa7n8vVW/a5HGh2nFPqAEr8+cD4dEZ6u9GjP91nHfr1a54RyAKyra7Sb5NH7NBKOUlyQSMXIp0qAixKexw==} + engines: {node: '>=10'} + dependencies: + '@acuminous/bitsyntax': 0.1.2 + buffer-more-ints: 1.0.0 + readable-stream: 1.1.14 + url-parse: 1.5.10 + transitivePeerDependencies: + - supports-color + dev: false + /ansi-regex@5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} @@ -684,6 +719,10 @@ packages: fill-range: 7.0.1 dev: true + /buffer-more-ints@1.0.0: + resolution: {integrity: sha512-EMetuGFz5SLsT0QTnXzINh4Ksr+oo4i+UGTXEshiGCQWnsgSs7ZhJ8fzlwQ+OzEMs0MpDAMr1hxnblp5a4vcHg==} + dev: false + /buffer@5.7.1: resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} dependencies: @@ -807,7 +846,6 @@ packages: /core-util-is@1.0.3: resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} - dev: true /create-require@1.1.1: resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} @@ -844,7 +882,6 @@ packages: optional: true dependencies: ms: 2.1.2 - dev: true /decompress-response@6.0.0: resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} @@ -1179,7 +1216,6 @@ packages: /inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - dev: true /ini@1.3.8: resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} @@ -1238,6 +1274,10 @@ packages: engines: {node: '>=0.12.0'} dev: true + /isarray@0.0.1: + resolution: {integrity: sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==} + dev: false + /isarray@1.0.0: resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} dev: true @@ -1409,7 +1449,6 @@ packages: /ms@2.1.2: resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - dev: true /ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} @@ -1712,6 +1751,10 @@ packages: once: 1.4.0 dev: true + /querystringify@2.2.0: + resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} + dev: false + /queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} dev: true @@ -1730,6 +1773,15 @@ packages: resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} dev: true + /readable-stream@1.1.14: + resolution: {integrity: sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==} + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 0.0.1 + string_decoder: 0.10.31 + dev: false + /readable-stream@2.3.8: resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} dependencies: @@ -1762,6 +1814,10 @@ packages: resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} engines: {node: '>=0.10.0'} + /requires-port@1.0.0: + resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} + dev: false + /resolve@1.22.2: resolution: {integrity: sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==} hasBin: true @@ -1799,7 +1855,6 @@ packages: /safe-buffer@5.1.2: resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} - dev: true /safe-buffer@5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} @@ -1925,6 +1980,10 @@ packages: strip-ansi: 7.0.1 dev: true + /string_decoder@0.10.31: + resolution: {integrity: sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==} + dev: false + /string_decoder@1.1.1: resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} dependencies: @@ -2154,6 +2213,13 @@ packages: engines: {node: '>= 10.0.0'} dev: true + /url-parse@1.5.10: + resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} + dependencies: + querystringify: 2.2.0 + requires-port: 1.0.0 + dev: false + /util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} dev: true diff --git a/services/order/src/handlers/order/create.ts b/services/order/src/handlers/order/create.ts index 3d06d7af..d3af1ad1 100644 --- a/services/order/src/handlers/order/create.ts +++ b/services/order/src/handlers/order/create.ts @@ -9,7 +9,6 @@ export const CreateOrder = async ( { request }: Data, callback: (err: any, response: Order | null) => void ) => { - log.debug("request received at CreateOrder handler\n", request); try { const { basket_snapshot, delivery_id, payment_id, user } = request; diff --git a/services/order/src/handlers/order/delete.ts b/services/order/src/handlers/order/delete.ts index 1fa59615..ce9fb4d3 100644 --- a/services/order/src/handlers/order/delete.ts +++ b/services/order/src/handlers/order/delete.ts @@ -7,7 +7,6 @@ export const DeleteOrder = async ( { request }: Data, callback: (err: any, response: DeleteOrderResponse | null) => void ) => { - log.debug("request received at DeleteOrder handler\n", request); try { const { id } = request; const order = await prisma.order.delete({ diff --git a/services/order/src/handlers/order/get.ts b/services/order/src/handlers/order/get.ts index 5798e13b..69efed6b 100644 --- a/services/order/src/handlers/order/get.ts +++ b/services/order/src/handlers/order/get.ts @@ -8,7 +8,6 @@ export const GetOrder = async ( { request }: Data, callback: (err: any, response: Order | null) => void ) => { - log.debug("request received at GetOrder handler\n", request); try { const { id } = request; const order = await prisma.order.findUniqueOrThrow({ diff --git a/services/order/src/handlers/order/update.ts b/services/order/src/handlers/order/update.ts index dfb64c28..83ac05c2 100644 --- a/services/order/src/handlers/order/update.ts +++ b/services/order/src/handlers/order/update.ts @@ -8,7 +8,6 @@ export const UpdateOrder = async ( { request }: Data, callback: (err: any, response: Order | null) => void ) => { - log.debug("request received at UpdateOrder handler\n", request); try { const { delivery_id, payment_id, id, status } = request; diff --git a/services/order/src/lib/amqp.ts b/services/order/src/lib/amqp.ts new file mode 100644 index 00000000..36dfa515 --- /dev/null +++ b/services/order/src/lib/amqp.ts @@ -0,0 +1,33 @@ +import amqp from "amqplib"; +import { msg } from "@order/middleware/log"; +import { log } from "@order/lib/log"; + +const DEFAULT_QUEUE = "log"; + +async function connectQueue(queue = DEFAULT_QUEUE) { + try { + const connection = await amqp.connect("amqp://localhost:5672"); + const channel = await connection.createChannel(); + + await channel.assertQueue(queue); + return channel; + } catch (error) { + return error as Error; + } +} + +const toLog = (message: any) => { + const { request, path } = message; + return { event_message: path, metadata: { request } }; +}; + +export const publish = async (message: any, queue = DEFAULT_QUEUE) => { + const channel = await connectQueue(queue); + if (channel instanceof Error) + return console.log("Error to connect to queue: ", channel); + channel.sendToQueue(queue, Buffer.from(JSON.stringify(toLog(message)))); + log.debug( + msg("AMQP", `${queue} (queue)`, new Date(), new Date()), + JSON.stringify(message) + ); +}; diff --git a/services/order/src/lib/proxy.ts b/services/order/src/lib/proxy.ts new file mode 100644 index 00000000..becdaabb --- /dev/null +++ b/services/order/src/lib/proxy.ts @@ -0,0 +1,132 @@ +import { Server, status } from "@grpc/grpc-js"; + +const getType = (method: { + requestStream: boolean; + responseStream: boolean; +}) => { + if (method.requestStream === false && method.responseStream === false) { + return "unary"; + } + return "unknown"; +}; + + +const lookupServiceMetadata = (service: { [x: string]: any }) => { + const serviceKeys = Object.keys(service); + const intersectingMethods = serviceKeys.reduce((acc, k) => { + const method = service[k]; + if (!method) { + throw new Error(`cannot find method ${k} on service`); + } + const components = method.path.split("/"); + acc[k] = { + name: components[1], + method: components[2], + type: getType(method), + path: method.path, + responseType: method.responseType, + requestType: method.requestType, + }; + return acc; + }, {} as any); + + return (key: string) => intersectingMethods[key]; +}; + +export const handler = { + get( + target: { + [x: string]: any; + intercept: () => any; + addService: (arg0: any, arg1: {}) => any; + }, + propKey: string + ) { + if (propKey !== "addService") { + return target[propKey]; + } + return (service: any, implementation: { [x: string]: any }) => { + const newImplementation = {} as any; + const lookup = lookupServiceMetadata(service); + for (const k in implementation) { + const name = k; + const fn = implementation[k]; + newImplementation[name] = (call: any, callback: any) => { + const ctx = { + call, + name, + service: lookup(name), + status: { + code: status.UNKNOWN, + details: "", + }, + }; + const newCallback = (callback: (arg0: any) => void) => { + return (...args: any[]) => { + ctx.status = { + code: status.OK, + details: "", + }; + const err = args[0]; + if (err) { + ctx.status = { + code: status.UNKNOWN, + details: err, + }; + } + // @ts-ignore + callback(...args); + }; + }; + + const interceptors = target.intercept(); + const first = interceptors.next(); + if (!first.value) { + // if we don't have any interceptors + return new Promise((resolve) => { + return resolve(fn(call, newCallback(callback))); + }); + } + first.value(ctx, function next() { + return new Promise((resolve) => { + const i = interceptors.next(); + if (i.done) { + return resolve(fn(call, newCallback(callback))); + } + return resolve(i.value(ctx, next)); + }); + }); + }; + } + return target.addService(service, newImplementation); + }; + }, +}; + +export const createServerProxy = ( + server: Server +): Server & { + intercept: Generator; + interceptors: any[]; + use: (fn: any) => void; +} => { + // @ts-ignore + server.interceptors = []; + // @ts-ignore + server.use = (fn: any) => { + // @ts-ignore + server.interceptors.push(fn); + }; + // @ts-ignore + server.intercept = function* intercept() { + let i = 0; + // @ts-ignore + while (i < server.interceptors.length) { + // @ts-ignore + yield server.interceptors[i]; + i++; + } + }; + // @ts-ignore + return new Proxy(server, handler); +}; diff --git a/services/order/src/middleware/log.ts b/services/order/src/middleware/log.ts new file mode 100644 index 00000000..7a05f8ad --- /dev/null +++ b/services/order/src/middleware/log.ts @@ -0,0 +1,39 @@ +import { publish } from "@order/lib/amqp"; +import { utils } from "@order/lib/log"; +import { log } from "@order/lib/log"; + +type Context = { + call: { + request: Map; + }; + service: { + path: string; + }; +}; + +const parseContext = (ctx: Context) => { + const { + call: { request }, + service: { path }, + } = ctx; + return { request, path }; +}; + +export const msg = ( + type: "GRPC" | "AMQP", + path: string | undefined, + requestAt: Date, + responseAt: Date +) => + `${utils.magenta(requestAt.toISOString())} | ${utils.cyan(type)}${ + path ? ` | ${utils.yellow(path)}` : "" + } | ${utils.green(responseAt.getTime() - requestAt.getTime() + "ms")} |`; + +export const logGRPC = async (ctx: Context, next: () => Promise) => { + const requestAt = new Date(); + await next(); + const responseAt = new Date(); + const { request, path } = parseContext(ctx); + publish({ request, path }, "log"); + log.debug(msg("GRPC", path, requestAt, responseAt), JSON.stringify(request)); +}; diff --git a/services/order/src/server.ts b/services/order/src/server.ts index 7181463d..65de37ed 100644 --- a/services/order/src/server.ts +++ b/services/order/src/server.ts @@ -8,6 +8,8 @@ import { log, utils } from "@order/lib/log"; import { options } from "@order/resources/protoloader-options"; import { serverInsecure } from "@order/resources/grpc-credentials"; import { addReflection } from "@order/lib/reflection"; +import { createServerProxy } from "@order/lib/proxy"; +import { logGRPC } from "@order/middleware/log"; import orderHandlers from "@order/handlers/order"; const PORT = process.env.PORT || 50007; @@ -22,8 +24,11 @@ const packageDefinition = loadSync(PROTO_PATH, options); const grpc = loadPackageDefinition(packageDefinition) as any; const { service } = grpc.com.goodfood.order.OrderService; -const server = new Server(); +// const server = new Server(); + +const server = createServerProxy(new Server()); server.addService(service, orderHandlers); +server.use(logGRPC); server.bindAsync(ADDRESS, serverInsecure, () => { server.start(); From 5ec9411c58ce6666595fbe41d82ca022c231e00e Mon Sep 17 00:00:00 2001 From: Florian LEROUX <10078837+floriaaan@users.noreply.github.com> Date: Wed, 10 May 2023 14:47:11 +0200 Subject: [PATCH 194/883] fix(amqp): add publish to log queue --- .gitignore | 7 +++++-- services/order/src/lib/amqp.ts | 5 ++--- services/order/src/middleware/log.ts | 8 +++++--- 3 files changed, 12 insertions(+), 8 deletions(-) diff --git a/.gitignore b/.gitignore index eb399c48..d67020c0 100644 --- a/.gitignore +++ b/.gitignore @@ -62,7 +62,10 @@ terraform.rc /**/.env -# Ignore Visual Studio temporary files +# reporting service /services/reporting/**/bin /services/reporting/**/obj -/services/reporting/**/.vs \ No newline at end of file +/services/reporting/**/.vs + +# log service +/services/log/goodfood-log \ No newline at end of file diff --git a/services/order/src/lib/amqp.ts b/services/order/src/lib/amqp.ts index 36dfa515..c9c1e2a5 100644 --- a/services/order/src/lib/amqp.ts +++ b/services/order/src/lib/amqp.ts @@ -6,10 +6,9 @@ const DEFAULT_QUEUE = "log"; async function connectQueue(queue = DEFAULT_QUEUE) { try { - const connection = await amqp.connect("amqp://localhost:5672"); + const connection = await amqp.connect(process.env.AMQP_URL || ""); const channel = await connection.createChannel(); - - await channel.assertQueue(queue); + await channel.assertExchange(queue, "fanout", { durable: true }); return channel; } catch (error) { return error as Error; diff --git a/services/order/src/middleware/log.ts b/services/order/src/middleware/log.ts index 7a05f8ad..a28c2542 100644 --- a/services/order/src/middleware/log.ts +++ b/services/order/src/middleware/log.ts @@ -25,9 +25,11 @@ export const msg = ( requestAt: Date, responseAt: Date ) => - `${utils.magenta(requestAt.toISOString())} | ${utils.cyan(type)}${ - path ? ` | ${utils.yellow(path)}` : "" - } | ${utils.green(responseAt.getTime() - requestAt.getTime() + "ms")} |`; + `${utils.magenta(requestAt.toISOString())} | ${utils[ + type === "GRPC" ? "cyan" : "red" + ](type)}${path ? ` | ${utils.yellow(path)}` : ""} | ${utils.green( + responseAt.getTime() - requestAt.getTime() + "ms" + )} |`; export const logGRPC = async (ctx: Context, next: () => Promise) => { const requestAt = new Date(); From c7e2696fb886d08960b9af3e3ee1646b568917bf Mon Sep 17 00:00:00 2001 From: Florian LEROUX <10078837+floriaaan@users.noreply.github.com> Date: Wed, 10 May 2023 15:02:41 +0200 Subject: [PATCH 195/883] feat(methods): add methods to proto, handlers, reflection --- services/order/reflection_descriptor.bin | Bin 1380 -> 2262 bytes .../order/src/handlers/order/get-delivery.ts | 25 ++++++++++++++++ .../order/src/handlers/order/get-payment.ts | 22 ++++++++++++++ .../order/src/handlers/order/get-status.ts | 26 ++++++++++++++++ services/order/src/handlers/order/get-user.ts | 26 ++++++++++++++++ services/order/src/handlers/order/index.ts | 18 ++++++++--- services/order/src/types/order.d.ts | 24 +++++++++++++++ services/proto/order.proto | 28 ++++++++++++++++++ 8 files changed, 165 insertions(+), 4 deletions(-) create mode 100644 services/order/src/handlers/order/get-delivery.ts create mode 100644 services/order/src/handlers/order/get-payment.ts create mode 100644 services/order/src/handlers/order/get-status.ts create mode 100644 services/order/src/handlers/order/get-user.ts diff --git a/services/order/reflection_descriptor.bin b/services/order/reflection_descriptor.bin index 1814264c3d1cd940648b8245fe7998362324f81a..4ba1fbf44ae156a30482f4627ac96dd4b054e7ba 100644 GIT binary patch delta 661 zcmaFDbxn|&>$2cPW<@zEne_bp^qf@vf};GA{G`$}{o<0M(&Q37Fn^*-XGAm?n^R(O zc4~=`7#AB*GBYn-f>D7{gEI)q6Efgp$tupzlVAdhavO>3K}>|005nlA7;K^kLl9V5 z2P2~sI~QyG#$yJI0vcRm?x`jIMJcI8#ZHx>#gp@xrF49_#8CuOi-J;%3-a@dQ-ut< z*z&=OflgosS|&Mp1Ea{~`7Eq*K~M=LZ7xZeZl_9@)SS$+)S}AC1;ibKAW1`lZF2yN G2qOT-oZ6)T delta 72 zcmV-O0Js0v5#$O33gHTo10j(@i5VOU20~$TYh`p25()%rb8l`K0U!Y=2~q^JBLOf0 ev%~}b0RrX%lf(sG22u(OLvm%49|#_k=?CrPw-p`$ diff --git a/services/order/src/handlers/order/get-delivery.ts b/services/order/src/handlers/order/get-delivery.ts new file mode 100644 index 00000000..4c9eb232 --- /dev/null +++ b/services/order/src/handlers/order/get-delivery.ts @@ -0,0 +1,25 @@ +import { prisma } from "@order/lib/prisma"; +import { log } from "@order/lib/log"; +import { + GetOrderByDeliveryRequest, + Order, +} from "@order/types/order"; +import { Data } from "@order/types"; +import { toGrpc } from "@order/lib/transformer"; + +export const GetOrderByDelivery = async ( + { request }: Data, + callback: (err: any, response: Order | null) => void +) => { + try { + const { id } = request; + const order = await prisma.order.findFirstOrThrow({ + where: { delivery_id: id }, + include: { basket_snapshot: true, user: true }, + }); + callback(null, toGrpc(order)); + } catch (error) { + log.error(error); + callback(error, null); + } +}; diff --git a/services/order/src/handlers/order/get-payment.ts b/services/order/src/handlers/order/get-payment.ts new file mode 100644 index 00000000..5f221003 --- /dev/null +++ b/services/order/src/handlers/order/get-payment.ts @@ -0,0 +1,22 @@ +import { prisma } from "@order/lib/prisma"; +import { log } from "@order/lib/log"; +import { GetOrderByPaymentRequest, Order } from "@order/types/order"; +import { Data } from "@order/types"; +import { toGrpc } from "@order/lib/transformer"; + +export const GetOrderByPayment = async ( + { request }: Data, + callback: (err: any, response: Order | null) => void +) => { + try { + const { id } = request; + const order = await prisma.order.findFirstOrThrow({ + where: { payment_id: id }, + include: { basket_snapshot: true, user: true }, + }); + callback(null, toGrpc(order)); + } catch (error) { + log.error(error); + callback(error, null); + } +}; diff --git a/services/order/src/handlers/order/get-status.ts b/services/order/src/handlers/order/get-status.ts new file mode 100644 index 00000000..1c23ea88 --- /dev/null +++ b/services/order/src/handlers/order/get-status.ts @@ -0,0 +1,26 @@ +import { prisma } from "@order/lib/prisma"; +import { log } from "@order/lib/log"; +import { + ExtendedOrder, + GetOrdersByStatusRequest, + GetOrdersByStatusResponse, +} from "@order/types/order"; +import { Data } from "@order/types"; +import { toGrpc } from "@order/lib/transformer"; + +export const GetOrdersByStatus = async ( + { request }: Data, + callback: (err: any, response: GetOrdersByStatusResponse | null) => void +) => { + try { + const { status } = request; + const orders = (await prisma.order.findMany({ + where: { status }, + include: { basket_snapshot: true, user: true }, + })) as ExtendedOrder[]; + callback(null, { orders: orders.map(toGrpc) as ExtendedOrder[] }); + } catch (error) { + log.error(error); + callback(error, null); + } +}; diff --git a/services/order/src/handlers/order/get-user.ts b/services/order/src/handlers/order/get-user.ts new file mode 100644 index 00000000..37350b08 --- /dev/null +++ b/services/order/src/handlers/order/get-user.ts @@ -0,0 +1,26 @@ +import { prisma } from "@order/lib/prisma"; +import { log } from "@order/lib/log"; +import { + ExtendedOrder, + GetOrdersByUserRequest, + GetOrdersByUserResponse, +} from "@order/types/order"; +import { Data } from "@order/types"; +import { toGrpc } from "@order/lib/transformer"; + +export const GetOrdersByUser = async ( + { request }: Data, + callback: (err: any, response: GetOrdersByUserResponse | null) => void +) => { + try { + const { id } = request; + const orders = (await prisma.order.findMany({ + where: { user_id: id }, + include: { basket_snapshot: true, user: true }, + })) as ExtendedOrder[]; + callback(null, { orders: orders.map(toGrpc) as ExtendedOrder[] }); + } catch (error) { + log.error(error); + callback(error, null); + } +}; diff --git a/services/order/src/handlers/order/index.ts b/services/order/src/handlers/order/index.ts index b0757cd5..48ed7249 100644 --- a/services/order/src/handlers/order/index.ts +++ b/services/order/src/handlers/order/index.ts @@ -1,15 +1,25 @@ import { UntypedServiceImplementation } from "@grpc/grpc-js"; -import { CreateOrder } from "./create"; -import { GetOrder } from "./get"; -import { UpdateOrder } from "./update"; -import { DeleteOrder } from "./delete"; +import { CreateOrder } from "@order/handlers/order/create"; +import { GetOrder } from "@order/handlers/order/get"; +import { UpdateOrder } from "@order/handlers/order/update"; +import { DeleteOrder } from "@order/handlers/order/delete"; + +import { GetOrdersByUser } from "@order/handlers/order/get-user"; +import { GetOrderByDelivery } from "@order/handlers/order/get-delivery"; +import { GetOrderByPayment } from "@order/handlers/order/get-payment"; +import { GetOrdersByStatus } from "@order/handlers/order/get-status"; const orderHandlers: UntypedServiceImplementation = { CreateOrder, GetOrder, UpdateOrder, DeleteOrder, + + GetOrdersByUser, + GetOrderByDelivery, + GetOrderByPayment, + GetOrdersByStatus, }; export default orderHandlers; diff --git a/services/order/src/types/order.d.ts b/services/order/src/types/order.d.ts index e8e8d577..6cce9b47 100644 --- a/services/order/src/types/order.d.ts +++ b/services/order/src/types/order.d.ts @@ -26,6 +26,30 @@ export type GetOrderRequest = { id: string; }; +export type GetOrdersByUserRequest = { + id: string; +}; + +export type GetOrdersByUserResponse = { + orders: ExtendedOrder[]; +}; + +export type GetOrderByDeliveryRequest = { + id: string; +}; + +export type GetOrderByPaymentRequest = { + id: string; +}; + +export type GetOrdersByStatusRequest = { + status: Status; +}; + +export type GetOrdersByStatusResponse = { + orders: ExtendedOrder[]; +}; + export type CreateOrderRequest = { payment_id: string; delivery_id: string; diff --git a/services/proto/order.proto b/services/proto/order.proto index b6b4ac36..346f1b20 100644 --- a/services/proto/order.proto +++ b/services/proto/order.proto @@ -41,6 +41,10 @@ message Order { service OrderService { rpc GetOrder(GetOrderRequest) returns (Order) {} + rpc GetOrdersByUser(GetOrdersByUserRequest) returns (GetOrdersByUserResponse) {} + rpc GetOrderByDelivery(GetOrderByDeliveryRequest) returns (Order) {} + rpc GetOrderByPayment(GetOrderByPaymentRequest) returns (Order) {} + rpc GetOrdersByStatus(GetOrdersByStatusRequest) returns (GetOrdersByStatusResponse) {} rpc CreateOrder(CreateOrderRequest) returns (Order) {} rpc UpdateOrder(UpdateOrderRequest) returns (Order) {} rpc DeleteOrder(DeleteOrderRequest) returns (DeleteOrderResponse) {} @@ -50,6 +54,30 @@ message GetOrderRequest { string id = 1; } +message GetOrdersByUserRequest { + string id = 1; +} + +message GetOrdersByUserResponse { + repeated Order orders = 1; +} + +message GetOrderByDeliveryRequest { + string id = 1; +} + +message GetOrderByPaymentRequest { + string id = 1; +} + +message GetOrdersByStatusRequest { + Status status = 1; +} + +message GetOrdersByStatusResponse { + repeated Order orders = 1; +} + message CreateOrderRequest { string payment_id = 1; string delivery_id = 2; From a19216b11890e4d665acfaed04a57c7af18554e2 Mon Sep 17 00:00:00 2001 From: Florian LEROUX <10078837+floriaaan@users.noreply.github.com> Date: Wed, 10 May 2023 15:04:09 +0200 Subject: [PATCH 196/883] doc: add methods to readme --- services/order/README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/services/order/README.md b/services/order/README.md index 5da48544..f1ef491f 100644 --- a/services/order/README.md +++ b/services/order/README.md @@ -15,6 +15,10 @@ The service provides the following gRPC methods: - `GetOrder`: Retrieves an order by its ID. +- `GetOrdersByUser`: Retrieves a list of orders for a given user. +- `GetOrderByDelivery`: Retrieves an order by its delivery ID. +- `GetOrderByPayment`: Retrieves an order by its payment ID. +- `GetOrdersByStatus`: Retrieves a list of orders by status. - `CreateOrder`: Creates a new order. - `UpdateOrder`: Updates an existing order. - `DeleteOrder`: Deletes an order by its ID. From ff7a9de9da1bda8f6e69abb4ae64e1c06f70a066 Mon Sep 17 00:00:00 2001 From: Florian LEROUX Date: Thu, 6 Jul 2023 08:55:16 +0200 Subject: [PATCH 197/883] feat(reporting): add restaurant_id to proto/schema, add affluence handler --- services/order/README.md | 18 +++++++- services/order/package.json | 4 +- services/order/pnpm-lock.yaml | 34 ++++++++------ services/order/prisma/schema.prisma | 2 + services/order/prisma/seed.ts | 6 +++ .../order/src/handlers/order/affluence.ts | 46 +++++++++++++++++++ services/order/src/handlers/order/create.ts | 3 +- services/order/src/handlers/order/index.ts | 4 ++ services/order/src/handlers/order/update.ts | 3 +- services/order/src/middleware/log.ts | 3 +- services/order/src/types/order.d.ts | 16 +++++++ services/proto/order.proto | 24 ++++++++++ 12 files changed, 142 insertions(+), 21 deletions(-) create mode 100644 services/order/src/handlers/order/affluence.ts diff --git a/services/order/README.md b/services/order/README.md index f1ef491f..db2b6882 100644 --- a/services/order/README.md +++ b/services/order/README.md @@ -35,7 +35,7 @@ You can use the following tools to help you with the setup: - You can use nvm to set your Node version using: - `nvm use`. - You can use docker to run your MongoDB server using: - - `docker run --name mongodb -p 27017:27017 -d mongo:latest` + - `docker run -d -e MONGO_INITDB_ROOT_USERNAME=user -e MONGO_INITDB_ROOT_PASSWORD=pass -p 27017:27017 --name mongodb mongo --replSet rs0` - You can use docker to run your RabbitMQ server using: - `docker run --name rabbitmq -p 5672:5672 -p 15672:15672 -d rabbitmq:3-management` @@ -52,3 +52,19 @@ You can use the following tools to help you with the setup: You can now access the microservice at `http://localhost:50007`. NB: If you want to run the microservice in development mode, you can run `npm run dev` instead. + +## Testing + +### Requests examples + +**Install `grpcurl` on your machine.** + +- GetOrder: `grpcurl -d '{"id": "example_order_id"}' localhost:50007 com.goodfood.order.OrderService.GetOrder` +- GetOrdersByUser: `grpcurl -d '{"id": "example_user_id"}' localhost:50007 com.goodfood.order.OrderService.GetOrdersByUser` +- GetOrderByDelivery: `grpcurl -d '{"id": "example_delivery_id"}' localhost:50007 com.goodfood.order.OrderService.GetOrderByDelivery` +- GetOrderByPayment: `grpcurl -d '{"id": "example_payment_id"}' localhost:50007 com.goodfood.order.OrderService.GetOrderByPayment` +- GetOrdersByStatus: `grpcurl -d '{"status": "PENDING"}' localhost:50007 com.goodfood.order.OrderService.GetOrdersByStatus` +- CreateOrder: `grpcurl -d '{"payment_id": "example_payment_id", "delivery_id": "example_delivery_id", "user": {"id": "example_user_id", "first_name": "example_first_name", "last_name": "example_last_name", "email": "example_email", "phone": "example_phone"}, "basket_snapshot": {"string": "example_string"}, "restaurant_id": "example_restaurant_id"}' localhost:50007 com.goodfood.order.OrderService.CreateOrder` +- UpdateOrder: `grpcurl -d '{"id": "example_order_id", "payment_id": "example_payment_id", "delivery_id": "example_delivery_id", "status": "IN_PROGRESS", "restaurant_id": "example_restaurant_id"}' localhost:50007 com.goodfood.order.OrderService.UpdateOrder` +- DeleteOrder: `grpcurl -d '{"id": "example_order_id"}' localhost:50007 com.goodfood.order.OrderService.DeleteOrder` +- GetOrdersAffluence: `grpcurl -d '{"date": "example_date", "restaurant_id": "example_restaurant_id"}' localhost:50007 com.goodfood.order.OrderService.GetOrdersAffluence` diff --git a/services/order/package.json b/services/order/package.json index dedafdc5..5760c17e 100644 --- a/services/order/package.json +++ b/services/order/package.json @@ -16,7 +16,7 @@ "dependencies": { "@grpc/grpc-js": "1.8.14", "@grpc/proto-loader": "0.7.6", - "@prisma/client": "4.13.0", + "@prisma/client": "4.16.2", "amqplib": "^0.10.3", "dotenv": "^16.0.3", "grpc-server-reflection": "^0.1.5", @@ -30,7 +30,7 @@ "grpc-tools": "^1.12.4", "nodemon": "^2.0.22", "pkg": "^5.8.1", - "prisma": "4.13.0", + "prisma": "4.16.2", "ts-node": "10.9.1", "tsconfig-paths": "^4.2.0", "typescript": "5.0.2", diff --git a/services/order/pnpm-lock.yaml b/services/order/pnpm-lock.yaml index 6d13847a..4e86a700 100644 --- a/services/order/pnpm-lock.yaml +++ b/services/order/pnpm-lock.yaml @@ -1,5 +1,9 @@ lockfileVersion: '6.0' +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + dependencies: '@grpc/grpc-js': specifier: 1.8.14 @@ -8,8 +12,8 @@ dependencies: specifier: 0.7.6 version: 0.7.6 '@prisma/client': - specifier: 4.13.0 - version: 4.13.0(prisma@4.13.0) + specifier: 4.16.2 + version: 4.16.2(prisma@4.16.2) amqplib: specifier: ^0.10.3 version: 0.10.3 @@ -46,8 +50,8 @@ devDependencies: specifier: ^5.8.1 version: 5.8.1 prisma: - specifier: 4.13.0 - version: 4.13.0 + specifier: 4.16.2 + version: 4.16.2 ts-node: specifier: 10.9.1 version: 10.9.1(@types/node@18.15.9)(typescript@5.0.2) @@ -435,8 +439,8 @@ packages: fastq: 1.15.0 dev: true - /@prisma/client@4.13.0(prisma@4.13.0): - resolution: {integrity: sha512-YaiiICcRB2hatxsbnfB66uWXjcRw3jsZdlAVxmx0cFcTc/Ad/sKdHCcWSnqyDX47vAewkjRFwiLwrOUjswVvmA==} + /@prisma/client@4.16.2(prisma@4.16.2): + resolution: {integrity: sha512-qCoEyxv1ZrQ4bKy39GnylE8Zq31IRmm8bNhNbZx7bF2cU5aiCCnSa93J2imF88MBjn7J9eUQneNxUQVJdl/rPQ==} engines: {node: '>=14.17'} requiresBuild: true peerDependencies: @@ -445,16 +449,16 @@ packages: prisma: optional: true dependencies: - '@prisma/engines-version': 4.13.0-50.1e7af066ee9cb95cf3a403c78d9aab3e6b04f37a - prisma: 4.13.0 + '@prisma/engines-version': 4.16.1-1.4bc8b6e1b66cb932731fb1bdbbc550d1e010de81 + prisma: 4.16.2 dev: false - /@prisma/engines-version@4.13.0-50.1e7af066ee9cb95cf3a403c78d9aab3e6b04f37a: - resolution: {integrity: sha512-fsQlbkhPJf08JOzKoyoD9atdUijuGBekwoOPZC3YOygXEml1MTtgXVpnUNchQlRSY82OQ6pSGQ9PxUe4arcSLQ==} + /@prisma/engines-version@4.16.1-1.4bc8b6e1b66cb932731fb1bdbbc550d1e010de81: + resolution: {integrity: sha512-q617EUWfRIDTriWADZ4YiWRZXCa/WuhNgLTVd+HqWLffjMSPzyM5uOWoauX91wvQClSKZU4pzI4JJLQ9Kl62Qg==} dev: false - /@prisma/engines@4.13.0: - resolution: {integrity: sha512-HrniowHRZXHuGT9XRgoXEaP2gJLXM5RMoItaY2PkjvuZ+iHc0Zjbm/302MB8YsPdWozAPHHn+jpFEcEn71OgPw==} + /@prisma/engines@4.16.2: + resolution: {integrity: sha512-vx1nxVvN4QeT/cepQce68deh/Turxy5Mr+4L4zClFuK1GlxN3+ivxfuv+ej/gvidWn1cE1uAhW7ALLNlYbRUAw==} requiresBuild: true /@protobufjs/aspromise@1.1.2: @@ -1704,13 +1708,13 @@ packages: react-is: 17.0.2 dev: true - /prisma@4.13.0: - resolution: {integrity: sha512-L9mqjnSmvWIRCYJ9mQkwCtj4+JDYYTdhoyo8hlsHNDXaZLh/b4hR0IoKIBbTKxZuyHQzLopb/+0Rvb69uGV7uA==} + /prisma@4.16.2: + resolution: {integrity: sha512-SYCsBvDf0/7XSJyf2cHTLjLeTLVXYfqp7pG5eEVafFLeT0u/hLFz/9W196nDRGUOo1JfPatAEb+uEnTQImQC1g==} engines: {node: '>=14.17'} hasBin: true requiresBuild: true dependencies: - '@prisma/engines': 4.13.0 + '@prisma/engines': 4.16.2 /process-nextick-args@2.0.1: resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} diff --git a/services/order/prisma/schema.prisma b/services/order/prisma/schema.prisma index 84d76908..4f9d6ee9 100644 --- a/services/order/prisma/schema.prisma +++ b/services/order/prisma/schema.prisma @@ -48,6 +48,8 @@ model Order { basket_snapshot Basket @relation(fields: [basket_snapshot_id], references: [id]) basket_snapshot_id String @unique + restaurant_id String + created_at DateTime @default(now()) updated_at DateTime @updatedAt } diff --git a/services/order/prisma/seed.ts b/services/order/prisma/seed.ts index 73eb3646..d7f2ce15 100644 --- a/services/order/prisma/seed.ts +++ b/services/order/prisma/seed.ts @@ -27,6 +27,8 @@ const orders: Prisma.OrderCreateInput[] = [ }, }, status: Status.PENDING, + restaurant_id: "restaurant_id:1", + created_at: new Date("2000-01-01T12:00:00.000Z"), }, { id: "order_id:2", @@ -52,6 +54,8 @@ const orders: Prisma.OrderCreateInput[] = [ }, }, status: Status.FULFILLED, + restaurant_id: "restaurant_id:2", + created_at: new Date("2000-01-01T12:00:00.000Z"), }, { id: "order_id:3", @@ -77,6 +81,8 @@ const orders: Prisma.OrderCreateInput[] = [ }, }, status: Status.PENDING, + restaurant_id: "restaurant_id:1", + created_at: new Date("2000-01-01T13:00:00.000Z"), }, ]; diff --git a/services/order/src/handlers/order/affluence.ts b/services/order/src/handlers/order/affluence.ts new file mode 100644 index 00000000..5faad9d8 --- /dev/null +++ b/services/order/src/handlers/order/affluence.ts @@ -0,0 +1,46 @@ +import { prisma } from "@order/lib/prisma"; +import { log } from "@order/lib/log"; +import { + GetOrdersAffluenceRequest, + GetOrdersAffluenceResponse, +} from "@order/types/order"; +import { Data } from "@order/types"; + +export const GetOrdersAffluence = async ( + { request }: Data, + callback: (err: any, response: GetOrdersAffluenceResponse | null) => void +) => { + try { + const { date, restaurant_id } = request; + const start = new Date(date + " 00:00:00"); + const end = new Date(date + " 23:59:59"); + const orders = await prisma.order.findMany({ + where: { + created_at: { gte: start, lte: end }, + restaurant_id, + }, + }); + const orders_per_hour = Array.from({ length: 24 }, (_, i) => i).map( + (hour) => { + const start = new Date(date + ` ${hour}:00:00`); + const end = new Date(date + ` ${hour}:59:59`); + const orders_in_hours = orders.filter( + (order) => order.created_at >= start && order.created_at <= end + ); + return orders_in_hours.length; + } + ); + + callback(null, { + average: + orders_per_hour.reduce((a, b) => a + b, 0) / orders_per_hour.length, + total: orders.length, + min: Math.min(...orders_per_hour), + max: Math.max(...orders_per_hour), + orders_per_hour, + }); + } catch (error) { + log.error(error); + callback(error, null); + } +}; diff --git a/services/order/src/handlers/order/create.ts b/services/order/src/handlers/order/create.ts index d3af1ad1..8e694086 100644 --- a/services/order/src/handlers/order/create.ts +++ b/services/order/src/handlers/order/create.ts @@ -10,7 +10,7 @@ export const CreateOrder = async ( callback: (err: any, response: Order | null) => void ) => { try { - const { basket_snapshot, delivery_id, payment_id, user } = request; + const { basket_snapshot, delivery_id, payment_id, user, restaurant_id } = request; // todo: calculate total from basket_snapshot const total = 0; // basket_snapshot.reduce; @@ -29,6 +29,7 @@ export const CreateOrder = async ( total, }, }, + restaurant_id, }, include: { basket_snapshot: true, user: true }, }); diff --git a/services/order/src/handlers/order/index.ts b/services/order/src/handlers/order/index.ts index 48ed7249..338cfeed 100644 --- a/services/order/src/handlers/order/index.ts +++ b/services/order/src/handlers/order/index.ts @@ -10,6 +10,8 @@ import { GetOrderByDelivery } from "@order/handlers/order/get-delivery"; import { GetOrderByPayment } from "@order/handlers/order/get-payment"; import { GetOrdersByStatus } from "@order/handlers/order/get-status"; +import { GetOrdersAffluence } from "@order/handlers/order/affluence"; + const orderHandlers: UntypedServiceImplementation = { CreateOrder, GetOrder, @@ -20,6 +22,8 @@ const orderHandlers: UntypedServiceImplementation = { GetOrderByDelivery, GetOrderByPayment, GetOrdersByStatus, + + GetOrdersAffluence, }; export default orderHandlers; diff --git a/services/order/src/handlers/order/update.ts b/services/order/src/handlers/order/update.ts index 83ac05c2..de0f4847 100644 --- a/services/order/src/handlers/order/update.ts +++ b/services/order/src/handlers/order/update.ts @@ -9,7 +9,7 @@ export const UpdateOrder = async ( callback: (err: any, response: Order | null) => void ) => { try { - const { delivery_id, payment_id, id, status } = request; + const { delivery_id, payment_id, id, status, restaurant_id } = request; // todo: calculate total from basket_snapshot const total = 0; // basket_snapshot.reduce; @@ -20,6 +20,7 @@ export const UpdateOrder = async ( delivery_id, payment_id, status, + restaurant_id, }, include: { basket_snapshot: true, user: true }, }); diff --git a/services/order/src/middleware/log.ts b/services/order/src/middleware/log.ts index a28c2542..5c2e41c6 100644 --- a/services/order/src/middleware/log.ts +++ b/services/order/src/middleware/log.ts @@ -35,7 +35,8 @@ export const logGRPC = async (ctx: Context, next: () => Promise) => { const requestAt = new Date(); await next(); const responseAt = new Date(); - const { request, path } = parseContext(ctx); + let { request, path } = parseContext(ctx); + path = path?.split(".").at(-1) || ""; publish({ request, path }, "log"); log.debug(msg("GRPC", path, requestAt, responseAt), JSON.stringify(request)); }; diff --git a/services/order/src/types/order.d.ts b/services/order/src/types/order.d.ts index 6cce9b47..6697479c 100644 --- a/services/order/src/types/order.d.ts +++ b/services/order/src/types/order.d.ts @@ -55,6 +55,7 @@ export type CreateOrderRequest = { delivery_id: string; user: UserMinimum; basket_snapshot: Basket; + restaurant_id: string; }; export type UpdateOrderRequest = { @@ -62,6 +63,7 @@ export type UpdateOrderRequest = { payment_id: string; delivery_id: string; status: Status; + restaurant_id: string; }; export type DeleteOrderRequest = { @@ -76,3 +78,17 @@ export type ExtendedOrder = Order & { user: UserMinimum; basket_snapshot: Basket; }; + +export type GetOrdersAffluenceRequest = { + date: string; + restaurant_id: string; +}; + +export type GetOrdersAffluenceResponse = { + average: number; + total: number; + min: number; + max: number; + + orders_per_hour: number[]; +}; diff --git a/services/proto/order.proto b/services/proto/order.proto index 346f1b20..b77b7adb 100644 --- a/services/proto/order.proto +++ b/services/proto/order.proto @@ -37,6 +37,8 @@ message Order { UserMinimum user = 4; Basket basket_snapshot = 5; Status status = 6; + + string restaurant_id = 7; } service OrderService { @@ -48,6 +50,9 @@ service OrderService { rpc CreateOrder(CreateOrderRequest) returns (Order) {} rpc UpdateOrder(UpdateOrderRequest) returns (Order) {} rpc DeleteOrder(DeleteOrderRequest) returns (DeleteOrderResponse) {} + + // reporting-related + rpc GetOrdersAffluence(GetOrdersAffluenceRequest) returns (GetOrdersAffluenceResponse) {} } message GetOrderRequest { @@ -84,6 +89,8 @@ message CreateOrderRequest { UserMinimum user = 3; Basket basket_snapshot = 4; + + string restaurant_id = 5; } message UpdateOrderRequest{ @@ -93,6 +100,8 @@ message UpdateOrderRequest{ string delivery_id = 3; Status status = 4; + + string restaurant_id = 5; } message DeleteOrderRequest { @@ -103,3 +112,18 @@ message DeleteOrderResponse { string id = 1; } +message GetOrdersAffluenceRequest { + string date = 1; + string restaurant_id = 2; +} + +message GetOrdersAffluenceResponse { + float average = 1; + int32 total = 2; + int32 min = 3; + int32 max = 4; + + // the number of orders for each hour of the day (0-23) (eg: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ...]) + repeated int32 orders_per_hour = 5; + +} From 86be0f2857e1930b39aa46c0a975e04b90bd7fcc Mon Sep 17 00:00:00 2001 From: Florian LEROUX Date: Thu, 6 Jul 2023 10:11:21 +0200 Subject: [PATCH 198/883] ref(db-engine): switch from mongo to postgres --- services/order/.env.example | 6 +-- services/order/README.md | 24 +++++----- .../migration.sql | 47 +++++++++++++++++++ .../prisma/migrations/migration_lock.toml | 3 ++ services/order/prisma/schema.prisma | 2 +- 5 files changed, 64 insertions(+), 18 deletions(-) create mode 100644 services/order/prisma/migrations/20230706080642_init_database/migration.sql create mode 100644 services/order/prisma/migrations/migration_lock.toml diff --git a/services/order/.env.example b/services/order/.env.example index 4caef961..2e790ca5 100644 --- a/services/order/.env.example +++ b/services/order/.env.example @@ -1,8 +1,4 @@ -DB_USER=user -DB_PASS=pass -DB_HOST=mongodb -DATABASE_URL=mongodb+srv://${DB_USER}:${DB_PASS}@${DB_HOST}/order?retryWrites=true&w=majority - +DATABASE_URL=postgres://postgres:password@localhost:5432/postgres AMQP_URL=amqp://guest:guest@localhost PORT=50007 \ No newline at end of file diff --git a/services/order/README.md b/services/order/README.md index db2b6882..16dd1739 100644 --- a/services/order/README.md +++ b/services/order/README.md @@ -1,14 +1,14 @@ # Order Microservice -| Informations | -| ------------------------------------------------- | -| **Port:** 50007 | -| **Developer:** @floriaaan | -| **Status:** In progress | -| **Last update:** 2023-05-10 | -| **Language:** NodeJS | -| **Dependencies:** TypeScript, gRPC, MongoDB, AMQP | -| **Models:** | +| Informations | +| -------------------------------------------------- | +| **Port:** 50007 | +| **Developer:** @floriaaan | +| **Status:** In progress | +| **Last update:** 2023-05-10 | +| **Language:** NodeJS | +| **Dependencies:** TypeScript, gRPC, Postgres, AMQP | +| **Models:** | ## gRPC Methods @@ -28,14 +28,14 @@ The service provides the following gRPC methods: To run this microservice, you will need to have the following installed on your system: - NodeJS (v18.12.0 or higher) (dev. with v18.12.0) -- MongoDB (dev. with mongoDB Atlas) +- Postgres (v15.2 or higher) (dev. with docker image `postgres:15.2`) You can use the following tools to help you with the setup: - You can use nvm to set your Node version using: - `nvm use`. -- You can use docker to run your MongoDB server using: - - `docker run -d -e MONGO_INITDB_ROOT_USERNAME=user -e MONGO_INITDB_ROOT_PASSWORD=pass -p 27017:27017 --name mongodb mongo --replSet rs0` +- You can use docker to run your Postgres database using: + - `docker run --name postgres -p 5432:5432 -e POSTGRES_PASSWORD=password -d postgres` - You can use docker to run your RabbitMQ server using: - `docker run --name rabbitmq -p 5672:5672 -p 15672:15672 -d rabbitmq:3-management` diff --git a/services/order/prisma/migrations/20230706080642_init_database/migration.sql b/services/order/prisma/migrations/20230706080642_init_database/migration.sql new file mode 100644 index 00000000..6113684d --- /dev/null +++ b/services/order/prisma/migrations/20230706080642_init_database/migration.sql @@ -0,0 +1,47 @@ +-- CreateEnum +CREATE TYPE "Status" AS ENUM ('PENDING', 'IN_PROGRESS', 'FULFILLED', 'REJECTED'); + +-- CreateTable +CREATE TABLE "UserMinimum" ( + "_id" TEXT NOT NULL, + "first_name" TEXT NOT NULL, + "last_name" TEXT NOT NULL, + "email" TEXT NOT NULL, + "phone" TEXT NOT NULL, + + CONSTRAINT "UserMinimum_pkey" PRIMARY KEY ("_id") +); + +-- CreateTable +CREATE TABLE "Basket" ( + "_id" TEXT NOT NULL, + "json" JSONB, + "string" TEXT NOT NULL, + "total" DOUBLE PRECISION NOT NULL, + + CONSTRAINT "Basket_pkey" PRIMARY KEY ("_id") +); + +-- CreateTable +CREATE TABLE "Order" ( + "_id" TEXT NOT NULL, + "payment_id" TEXT NOT NULL, + "delivery_id" TEXT NOT NULL, + "status" "Status" NOT NULL DEFAULT 'PENDING', + "user_id" TEXT NOT NULL, + "basket_snapshot_id" TEXT NOT NULL, + "restaurant_id" TEXT NOT NULL, + "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updated_at" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "Order_pkey" PRIMARY KEY ("_id") +); + +-- CreateIndex +CREATE UNIQUE INDEX "Order_basket_snapshot_id_key" ON "Order"("basket_snapshot_id"); + +-- AddForeignKey +ALTER TABLE "Order" ADD CONSTRAINT "Order_user_id_fkey" FOREIGN KEY ("user_id") REFERENCES "UserMinimum"("_id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "Order" ADD CONSTRAINT "Order_basket_snapshot_id_fkey" FOREIGN KEY ("basket_snapshot_id") REFERENCES "Basket"("_id") ON DELETE RESTRICT ON UPDATE CASCADE; diff --git a/services/order/prisma/migrations/migration_lock.toml b/services/order/prisma/migrations/migration_lock.toml new file mode 100644 index 00000000..fbffa92c --- /dev/null +++ b/services/order/prisma/migrations/migration_lock.toml @@ -0,0 +1,3 @@ +# Please do not edit this file manually +# It should be added in your version-control system (i.e. Git) +provider = "postgresql" \ No newline at end of file diff --git a/services/order/prisma/schema.prisma b/services/order/prisma/schema.prisma index 4f9d6ee9..9c7a5f9a 100644 --- a/services/order/prisma/schema.prisma +++ b/services/order/prisma/schema.prisma @@ -1,5 +1,5 @@ datasource db { - provider = "mongodb" + provider = "postgresql" url = env("DATABASE_URL") } From 7c390733291c0081aab9f19d2488004d911cbb5a Mon Sep 17 00:00:00 2001 From: Florian LEROUX Date: Thu, 6 Jul 2023 10:11:38 +0200 Subject: [PATCH 199/883] feat(reporting): add top5-selling handler --- services/order/src/handlers/order/index.ts | 2 - .../{order => reporting}/affluence.ts | 2 +- .../order/src/handlers/reporting/index.ts | 11 +++++ .../src/handlers/reporting/top5-selling.ts | 44 +++++++++++++++++++ services/order/src/server.ts | 7 ++- services/order/src/types/order.d.ts | 16 +------ services/order/src/types/reporting.d.ts | 26 +++++++++++ services/proto/order.proto | 20 ++++++++- 8 files changed, 107 insertions(+), 21 deletions(-) rename services/order/src/handlers/{order => reporting}/affluence.ts (97%) create mode 100644 services/order/src/handlers/reporting/index.ts create mode 100644 services/order/src/handlers/reporting/top5-selling.ts create mode 100644 services/order/src/types/reporting.d.ts diff --git a/services/order/src/handlers/order/index.ts b/services/order/src/handlers/order/index.ts index 338cfeed..8484eadf 100644 --- a/services/order/src/handlers/order/index.ts +++ b/services/order/src/handlers/order/index.ts @@ -10,7 +10,6 @@ import { GetOrderByDelivery } from "@order/handlers/order/get-delivery"; import { GetOrderByPayment } from "@order/handlers/order/get-payment"; import { GetOrdersByStatus } from "@order/handlers/order/get-status"; -import { GetOrdersAffluence } from "@order/handlers/order/affluence"; const orderHandlers: UntypedServiceImplementation = { CreateOrder, @@ -23,7 +22,6 @@ const orderHandlers: UntypedServiceImplementation = { GetOrderByPayment, GetOrdersByStatus, - GetOrdersAffluence, }; export default orderHandlers; diff --git a/services/order/src/handlers/order/affluence.ts b/services/order/src/handlers/reporting/affluence.ts similarity index 97% rename from services/order/src/handlers/order/affluence.ts rename to services/order/src/handlers/reporting/affluence.ts index 5faad9d8..b6829daf 100644 --- a/services/order/src/handlers/order/affluence.ts +++ b/services/order/src/handlers/reporting/affluence.ts @@ -3,7 +3,7 @@ import { log } from "@order/lib/log"; import { GetOrdersAffluenceRequest, GetOrdersAffluenceResponse, -} from "@order/types/order"; +} from "@order/types/reporting"; import { Data } from "@order/types"; export const GetOrdersAffluence = async ( diff --git a/services/order/src/handlers/reporting/index.ts b/services/order/src/handlers/reporting/index.ts new file mode 100644 index 00000000..c41498b1 --- /dev/null +++ b/services/order/src/handlers/reporting/index.ts @@ -0,0 +1,11 @@ +import { UntypedServiceImplementation } from "@grpc/grpc-js"; + +import { GetOrdersAffluence } from "@order/handlers/reporting/affluence"; +import { GetTop5SellingProducts } from "@order/handlers/reporting/top5-selling"; + +const reportingHandlers: UntypedServiceImplementation = { + GetOrdersAffluence, + GetTop5SellingProducts +}; + +export default reportingHandlers; diff --git a/services/order/src/handlers/reporting/top5-selling.ts b/services/order/src/handlers/reporting/top5-selling.ts new file mode 100644 index 00000000..777975a6 --- /dev/null +++ b/services/order/src/handlers/reporting/top5-selling.ts @@ -0,0 +1,44 @@ +import { prisma } from "@order/lib/prisma"; +import { log } from "@order/lib/log"; +import { + GetTop5SellingProductsRequest, + GetTop5SellingProductsResponse, +} from "@order/types/reporting"; +import { Data } from "@order/types"; + +const HOUR_IN_MS = 60 * 60 * 1000; +const DAY_IN_MS = 24 * HOUR_IN_MS; + +export const GetTop5SellingProducts = async ( + { request }: Data, + callback: (err: any, response: GetTop5SellingProductsResponse | null) => void +) => { + try { + const { date, restaurant_id, interval } = request; + + const end = date + ? new Date(date + " 23:59:59") + : new Date(new Date().setHours(23, 59, 59, 999)); + + const start = // end - interval + interval === "1w" + ? new Date(end.getTime() - 7 * DAY_IN_MS) + : interval === "1m" + ? new Date(end.getTime() - 30 * DAY_IN_MS) + : interval === "1y" + ? new Date(end.getTime() - 365 * DAY_IN_MS) + : // default to 1w + new Date(end.getTime() - 7 * DAY_IN_MS); + + const orders = await prisma.order.findMany({ + where: { restaurant_id, created_at: { gte: start, lte: end } }, + }); + + callback(null, { + products: [], + }); + } catch (error) { + log.error(error); + callback(error, null); + } +}; diff --git a/services/order/src/server.ts b/services/order/src/server.ts index 65de37ed..14807759 100644 --- a/services/order/src/server.ts +++ b/services/order/src/server.ts @@ -11,6 +11,7 @@ import { addReflection } from "@order/lib/reflection"; import { createServerProxy } from "@order/lib/proxy"; import { logGRPC } from "@order/middleware/log"; import orderHandlers from "@order/handlers/order"; +import reportingHandlers from "@order/handlers/reporting"; const PORT = process.env.PORT || 50007; const ADDRESS = `0.0.0.0:${PORT}`; @@ -22,12 +23,14 @@ const REFLECTION_PATH = resolvePath( const packageDefinition = loadSync(PROTO_PATH, options); const grpc = loadPackageDefinition(packageDefinition) as any; -const { service } = grpc.com.goodfood.order.OrderService; +const { service: o_srv } = grpc.com.goodfood.order.OrderService; +const { service: r_srv } = grpc.com.goodfood.order.OrderReportingService; // const server = new Server(); const server = createServerProxy(new Server()); -server.addService(service, orderHandlers); +server.addService(o_srv, orderHandlers); +server.addService(r_srv, reportingHandlers); server.use(logGRPC); server.bindAsync(ADDRESS, serverInsecure, () => { diff --git a/services/order/src/types/order.d.ts b/services/order/src/types/order.d.ts index 6697479c..b7f16540 100644 --- a/services/order/src/types/order.d.ts +++ b/services/order/src/types/order.d.ts @@ -77,18 +77,4 @@ export type DeleteOrderResponse = { export type ExtendedOrder = Order & { user: UserMinimum; basket_snapshot: Basket; -}; - -export type GetOrdersAffluenceRequest = { - date: string; - restaurant_id: string; -}; - -export type GetOrdersAffluenceResponse = { - average: number; - total: number; - min: number; - max: number; - - orders_per_hour: number[]; -}; +}; \ No newline at end of file diff --git a/services/order/src/types/reporting.d.ts b/services/order/src/types/reporting.d.ts new file mode 100644 index 00000000..eb751043 --- /dev/null +++ b/services/order/src/types/reporting.d.ts @@ -0,0 +1,26 @@ +export type GetOrdersAffluenceRequest = { + date: string; + restaurant_id: string; +}; + +export type GetOrdersAffluenceResponse = { + average: number; + total: number; + min: number; + max: number; + + orders_per_hour: number[]; +}; + +export type GetTop5SellingProductsRequest = { + date?: string; + interval: "1w" | "1m" | "1y"; + restaurant_id: string; +}; + +export type GetTop5SellingProductsResponse = { + products: { + id: string; + count: number; + }[]; +}; diff --git a/services/proto/order.proto b/services/proto/order.proto index b77b7adb..21f6eec3 100644 --- a/services/proto/order.proto +++ b/services/proto/order.proto @@ -51,8 +51,11 @@ service OrderService { rpc UpdateOrder(UpdateOrderRequest) returns (Order) {} rpc DeleteOrder(DeleteOrderRequest) returns (DeleteOrderResponse) {} - // reporting-related +} + +service OrderReportingService { rpc GetOrdersAffluence(GetOrdersAffluenceRequest) returns (GetOrdersAffluenceResponse) {} + rpc GetTop5SellingProducts(GetTop5SellingProductsRequest) returns (GetTop5SellingProductsResponse) {} } message GetOrderRequest { @@ -127,3 +130,18 @@ message GetOrdersAffluenceResponse { repeated int32 orders_per_hour = 5; } + +message GetTop5SellingProductsRequest { + optional string date = 1; + string interval = 2; + string restaurant_id = 3; +} + +message GetTop5SellingProductsResponse { + repeated ProductCount products_count = 1; +} + +message ProductCount { + string id = 1; + int32 count = 2; +} \ No newline at end of file From f74a073343f7fe5a038ad90abefdbc27f22ac6f1 Mon Sep 17 00:00:00 2001 From: Florian LEROUX Date: Thu, 6 Jul 2023 10:48:51 +0200 Subject: [PATCH 200/883] feat(reporting): add implementation for top5 selling handler --- services/order/prisma/seed.ts | 46 +++++++++++++++---- .../src/handlers/reporting/top5-selling.ts | 22 ++++++++- services/order/src/types/reporting.d.ts | 10 ++-- 3 files changed, 64 insertions(+), 14 deletions(-) diff --git a/services/order/prisma/seed.ts b/services/order/prisma/seed.ts index d7f2ce15..3de73287 100644 --- a/services/order/prisma/seed.ts +++ b/services/order/prisma/seed.ts @@ -21,9 +21,23 @@ const orders: Prisma.OrderCreateInput[] = [ }, basket_snapshot: { create: { - json: {}, - string: JSON.stringify({}), - total: 0, + json: { + "product_id:1": { count: 1, price: 15 }, + "product_id:2": { count: 2, price: 10 }, + "product_id:3": { count: 4, price: 15 }, + "product_id:4": { count: 6, price: 15 }, + "product_id:5": { count: 1, price: 15 }, + "product_id:6": { count: 1, price: 15 }, + }, + string: JSON.stringify({ + "product_id:1": { count: 1, price: 15 }, + "product_id:2": { count: 2, price: 10 }, + "product_id:3": { count: 4, price: 15 }, + "product_id:4": { count: 6, price: 15 }, + "product_id:5": { count: 1, price: 15 }, + "product_id:6": { count: 1, price: 15 }, + }), + total: 35, }, }, status: Status.PENDING, @@ -48,9 +62,15 @@ const orders: Prisma.OrderCreateInput[] = [ }, basket_snapshot: { create: { - json: {}, - string: JSON.stringify({}), - total: 0, + json: { + "product_id:1": { count: 1, price: 15 }, + "product_id:3": { count: 4, price: 5 }, + }, + string: JSON.stringify({ + "product_id:1": { count: 1, price: 15 }, + "product_id:3": { count: 4, price: 5 }, + }), + total: 35, }, }, status: Status.FULFILLED, @@ -75,9 +95,17 @@ const orders: Prisma.OrderCreateInput[] = [ }, basket_snapshot: { create: { - json: {}, - string: JSON.stringify({}), - total: 0, + json: { + "product_id:1": { count: 1, price: 15 }, + "product_id:2": { count: 6, price: 15 }, + "product_id:3": { count: 4, price: 15 }, + }, + string: JSON.stringify({ + "product_id:1": { count: 1, price: 15 }, + "product_id:2": { count: 6, price: 15 }, + "product_id:3": { count: 4, price: 15 }, + }), + total: 15, }, }, status: Status.PENDING, diff --git a/services/order/src/handlers/reporting/top5-selling.ts b/services/order/src/handlers/reporting/top5-selling.ts index 777975a6..5f9b46a2 100644 --- a/services/order/src/handlers/reporting/top5-selling.ts +++ b/services/order/src/handlers/reporting/top5-selling.ts @@ -3,6 +3,7 @@ import { log } from "@order/lib/log"; import { GetTop5SellingProductsRequest, GetTop5SellingProductsResponse, + ProductCount, } from "@order/types/reporting"; import { Data } from "@order/types"; @@ -32,10 +33,29 @@ export const GetTop5SellingProducts = async ( const orders = await prisma.order.findMany({ where: { restaurant_id, created_at: { gte: start, lte: end } }, + include: { basket_snapshot: true }, }); + const products_count = orders + .reduce((acc, order) => { + const { json } = order.basket_snapshot as unknown as { + json: { [key: string]: { count: number; price: number } }; + }; + Object.entries(json).forEach(([product_id, { count }]) => { + const product = acc.find((p) => p.id === product_id); + if (product) { + product.count += count; + acc.filter((p) => p.id !== product_id).push(product); + } else acc.push({ id: product_id, count }); + }); + return acc; + }, [] as ProductCount[]) + .sort((a, b) => b.count - a.count) + .slice(0, 5); + + callback(null, { - products: [], + products_count, }); } catch (error) { log.error(error); diff --git a/services/order/src/types/reporting.d.ts b/services/order/src/types/reporting.d.ts index eb751043..7f332dcd 100644 --- a/services/order/src/types/reporting.d.ts +++ b/services/order/src/types/reporting.d.ts @@ -18,9 +18,11 @@ export type GetTop5SellingProductsRequest = { restaurant_id: string; }; +export type ProductCount = { + id: string; + count: number; +}; + export type GetTop5SellingProductsResponse = { - products: { - id: string; - count: number; - }[]; + products_count: ProductCount[]; }; From fb1253c88d0a0ae62190e892833d6a1f1f324575 Mon Sep 17 00:00:00 2001 From: Florian LEROUX Date: Thu, 6 Jul 2023 11:12:13 +0200 Subject: [PATCH 201/883] ref(date): split function and write tests --- .../src/handlers/reporting/top5-selling.ts | 20 +---- services/order/src/lib/date.ts | 28 +++++++ services/order/src/tests/date.test.ts | 77 +++++++++++++++++++ services/order/src/types/index.d.ts | 2 + services/order/src/types/reporting.d.ts | 4 +- 5 files changed, 112 insertions(+), 19 deletions(-) create mode 100644 services/order/src/lib/date.ts create mode 100644 services/order/src/tests/date.test.ts diff --git a/services/order/src/handlers/reporting/top5-selling.ts b/services/order/src/handlers/reporting/top5-selling.ts index 5f9b46a2..06632017 100644 --- a/services/order/src/handlers/reporting/top5-selling.ts +++ b/services/order/src/handlers/reporting/top5-selling.ts @@ -6,9 +6,7 @@ import { ProductCount, } from "@order/types/reporting"; import { Data } from "@order/types"; - -const HOUR_IN_MS = 60 * 60 * 1000; -const DAY_IN_MS = 24 * HOUR_IN_MS; +import { fromInterval } from "@order/lib/date"; export const GetTop5SellingProducts = async ( { request }: Data, @@ -16,20 +14,7 @@ export const GetTop5SellingProducts = async ( ) => { try { const { date, restaurant_id, interval } = request; - - const end = date - ? new Date(date + " 23:59:59") - : new Date(new Date().setHours(23, 59, 59, 999)); - - const start = // end - interval - interval === "1w" - ? new Date(end.getTime() - 7 * DAY_IN_MS) - : interval === "1m" - ? new Date(end.getTime() - 30 * DAY_IN_MS) - : interval === "1y" - ? new Date(end.getTime() - 365 * DAY_IN_MS) - : // default to 1w - new Date(end.getTime() - 7 * DAY_IN_MS); + const { start, end } = fromInterval(interval, date); const orders = await prisma.order.findMany({ where: { restaurant_id, created_at: { gte: start, lte: end } }, @@ -53,7 +38,6 @@ export const GetTop5SellingProducts = async ( .sort((a, b) => b.count - a.count) .slice(0, 5); - callback(null, { products_count, }); diff --git a/services/order/src/lib/date.ts b/services/order/src/lib/date.ts new file mode 100644 index 00000000..7211f067 --- /dev/null +++ b/services/order/src/lib/date.ts @@ -0,0 +1,28 @@ +import { Interval } from "@order/types"; + +const HOUR_IN_MS = 60 * 60 * 1000; +const DAY_IN_MS = 24 * HOUR_IN_MS; + +export const fromInterval = ( + interval: Interval, + date?: string +): { + start: Date; + end: Date; +} => { + const end = date + ? new Date(date + " 23:59:59") + : new Date(new Date().setHours(23, 59, 59, 999)); + + const start = // end - interval + interval === "1w" + ? new Date(end.getTime() - 7 * DAY_IN_MS) + : interval === "1m" + ? new Date(end.getTime() - 30 * DAY_IN_MS) + : interval === "1y" + ? new Date(end.getTime() - 365 * DAY_IN_MS) + : // default to 1w + new Date(end.getTime() - 7 * DAY_IN_MS); + + return { start, end }; +}; diff --git a/services/order/src/tests/date.test.ts b/services/order/src/tests/date.test.ts new file mode 100644 index 00000000..8eb1f73c --- /dev/null +++ b/services/order/src/tests/date.test.ts @@ -0,0 +1,77 @@ +import { fromInterval } from "@order/lib/date"; +import { Interval } from "@order/types"; +import { assert, describe, it, vitest } from "vitest"; + +const HOUR_IN_MS = 60 * 60 * 1000; +const DAY_IN_MS = 24 * HOUR_IN_MS; + +// fake current date + +describe("tests@goodfood/order.date.fromInterval", function () { + it('should return start and end dates for interval "1w"', (t) => { + const interval = "1w"; + const date = "2023-07-01"; + const expected = { + start: new Date("2023-06-24 23:59:59"), + end: new Date("2023-07-01 23:59:59"), + }; + const result = fromInterval(interval, date); + assert.deepEqual(result, expected); + }); + + it('should return start and end dates for interval "1m"', (t) => { + const interval = "1m"; + const date = "2023-07-01"; + const expected = { + start: new Date("2023-06-01 23:59:59"), + end: new Date("2023-07-01 23:59:59"), + }; + const result = fromInterval(interval, date); + assert.deepEqual(result, expected); + }); + + it('should return start and end dates for interval "1y"', (t) => { + const interval = "1y"; + const date = "2023-07-01"; + const expected = { + start: new Date("2022-07-01 23:59:59"), + end: new Date("2023-07-01 23:59:59"), + }; + const result = fromInterval(interval, date); + assert.deepEqual(result, expected); + }); + + it('should return start and end dates with default interval "1w"', (t) => { + const interval = "invalid-interval"; + const date = "2023-07-01"; + const expected = { + start: new Date("2023-06-24 23:59:59"), + end: new Date("2023-07-01 23:59:59"), + }; + const result = fromInterval(interval as Interval, date); + assert.deepEqual(result, expected); + }); + + it("should return current date as end date when no date parameter is provided", (t) => { + const interval = "1w"; + const expectedEnd = new Date(); + expectedEnd.setHours(23, 59, 59, 999); + + const result = fromInterval(interval, undefined); + assert.deepEqual(result.end, expectedEnd); + }); + + it("should return start date based on the current date when no date parameter is provided", (t) => { + const interval = "1w"; + const date = new Date("2023-07-01 13:37"); + vitest.setSystemTime(date); + + const currentDate = new Date(); + const expectedStart = new Date( + new Date(currentDate.getTime() - 7 * DAY_IN_MS).setHours(23, 59, 59, 999) + ); + + const result = fromInterval(interval, undefined); + assert.deepEqual(result.start, expectedStart); + }); +}); diff --git a/services/order/src/types/index.d.ts b/services/order/src/types/index.d.ts index edf2bebf..51abc373 100644 --- a/services/order/src/types/index.d.ts +++ b/services/order/src/types/index.d.ts @@ -1,3 +1,5 @@ export type Data = { request: T; }; + +export type Interval = "1w" | "1m" | "1y"; \ No newline at end of file diff --git a/services/order/src/types/reporting.d.ts b/services/order/src/types/reporting.d.ts index 7f332dcd..922a47be 100644 --- a/services/order/src/types/reporting.d.ts +++ b/services/order/src/types/reporting.d.ts @@ -1,3 +1,5 @@ +import { Interval } from "@order/types"; + export type GetOrdersAffluenceRequest = { date: string; restaurant_id: string; @@ -14,7 +16,7 @@ export type GetOrdersAffluenceResponse = { export type GetTop5SellingProductsRequest = { date?: string; - interval: "1w" | "1m" | "1y"; + interval: Interval; restaurant_id: string; }; From 8412b2f4bfc96b69b2812974665ea358d840840a Mon Sep 17 00:00:00 2001 From: Florian LEROUX Date: Thu, 6 Jul 2023 13:52:31 +0200 Subject: [PATCH 202/883] fix(create/update): relay on basket.string to generate json and total --- services/order/src/handlers/order/create.ts | 29 ++++++++++++++++----- services/order/src/handlers/order/update.ts | 3 --- services/order/src/lib/struct.ts | 10 +++++++ services/order/src/lib/transformer.ts | 2 ++ 4 files changed, 34 insertions(+), 10 deletions(-) diff --git a/services/order/src/handlers/order/create.ts b/services/order/src/handlers/order/create.ts index 8e694086..06f5056e 100644 --- a/services/order/src/handlers/order/create.ts +++ b/services/order/src/handlers/order/create.ts @@ -10,22 +10,37 @@ export const CreateOrder = async ( callback: (err: any, response: Order | null) => void ) => { try { - const { basket_snapshot, delivery_id, payment_id, user, restaurant_id } = request; + const { + basket_snapshot, + delivery_id, + delivery_type, + payment_id, + user, + restaurant_id, + } = request; - // todo: calculate total from basket_snapshot - const total = 0; // basket_snapshot.reduce; + const json = // (parseStruct(basket_snapshot.json) || + JSON.parse(basket_snapshot.string) as { + [key: string]: { count: number; price: number }; + }; + const total = Object.values(json).reduce((acc, cur) => acc + cur.price, 0); + + const user_in_db = await prisma.userMinimum.findFirst({ + where: { email: user.email }, + }); const order = await prisma.order.create({ data: { delivery_id, + delivery_type, payment_id, - user: { connectOrCreate: { where: { id: user.id }, create: user } }, + user: user_in_db + ? { connect: { id: user_in_db.id } } + : { create: { ...user, id: undefined } }, basket_snapshot: { create: { string: basket_snapshot.string, - json: - parseStruct(basket_snapshot.json) || - JSON.parse(basket_snapshot.string), + json, total, }, }, diff --git a/services/order/src/handlers/order/update.ts b/services/order/src/handlers/order/update.ts index de0f4847..75dfed82 100644 --- a/services/order/src/handlers/order/update.ts +++ b/services/order/src/handlers/order/update.ts @@ -11,9 +11,6 @@ export const UpdateOrder = async ( try { const { delivery_id, payment_id, id, status, restaurant_id } = request; - // todo: calculate total from basket_snapshot - const total = 0; // basket_snapshot.reduce; - const order = await prisma.order.update({ where: { id }, data: { diff --git a/services/order/src/lib/struct.ts b/services/order/src/lib/struct.ts index 09a49b5a..b1b7f50e 100644 --- a/services/order/src/lib/struct.ts +++ b/services/order/src/lib/struct.ts @@ -30,6 +30,16 @@ export const toStruct = ( ): Struct => { if (!obj) return { fields: {} }; const fields = Object.entries(obj).reduce((acc: any, [key, value]) => { + if (typeof value === "object") { + return { + ...acc, + [key]: { + kind: "structValue", + structValue: toStruct(value), + }, + }; + } + return { ...acc, [key]: { diff --git a/services/order/src/lib/transformer.ts b/services/order/src/lib/transformer.ts index 344b9fcc..b77e6296 100644 --- a/services/order/src/lib/transformer.ts +++ b/services/order/src/lib/transformer.ts @@ -7,6 +7,8 @@ export const toGrpc = (order: ExtendedOrder) => { id: order.id, payment_id: order.payment_id, delivery_id: order.delivery_id, + delivery_type: order.delivery_type, + restaurant_id: order.restaurant_id, user: order.user, basket_snapshot: { string: order.basket_snapshot.string, From 1df0e9d32871c27a2083272f1035802050b7dfbf Mon Sep 17 00:00:00 2001 From: Florian LEROUX Date: Thu, 6 Jul 2023 13:52:55 +0200 Subject: [PATCH 203/883] feat(reporting): add delivery type handler --- .../migration.sql | 11 ++++++ services/order/prisma/schema.prisma | 9 ++++- services/order/prisma/seed.ts | 3 ++ .../src/handlers/reporting/delivery-types.ts | 38 +++++++++++++++++++ .../order/src/handlers/reporting/index.ts | 4 +- services/order/src/types/order.d.ts | 6 ++- services/order/src/types/reporting.d.ts | 11 ++++++ services/proto/order.proto | 28 ++++++++++++-- 8 files changed, 103 insertions(+), 7 deletions(-) create mode 100644 services/order/prisma/migrations/20230706092649_add_delivery_types/migration.sql create mode 100644 services/order/src/handlers/reporting/delivery-types.ts diff --git a/services/order/prisma/migrations/20230706092649_add_delivery_types/migration.sql b/services/order/prisma/migrations/20230706092649_add_delivery_types/migration.sql new file mode 100644 index 00000000..01ce29f0 --- /dev/null +++ b/services/order/prisma/migrations/20230706092649_add_delivery_types/migration.sql @@ -0,0 +1,11 @@ +/* + Warnings: + + - Added the required column `delivery_type` to the `Order` table without a default value. This is not possible if the table is not empty. + +*/ +-- CreateEnum +CREATE TYPE "DeliveryType" AS ENUM ('TAKEAWAY', 'DELIVERY'); + +-- AlterTable +ALTER TABLE "Order" ADD COLUMN "delivery_type" "DeliveryType" NOT NULL; diff --git a/services/order/prisma/schema.prisma b/services/order/prisma/schema.prisma index 9c7a5f9a..1c3929d9 100644 --- a/services/order/prisma/schema.prisma +++ b/services/order/prisma/schema.prisma @@ -35,13 +35,20 @@ model Basket { Order Order? } +enum DeliveryType { + TAKEAWAY + DELIVERY +} + model Order { id String @id @default(cuid()) @map("_id") payment_id String - delivery_id String status Status @default(PENDING) + delivery_id String + delivery_type DeliveryType + user UserMinimum @relation(fields: [user_id], references: [id]) user_id String diff --git a/services/order/prisma/seed.ts b/services/order/prisma/seed.ts index 3de73287..d7fd8942 100644 --- a/services/order/prisma/seed.ts +++ b/services/order/prisma/seed.ts @@ -7,6 +7,7 @@ const orders: Prisma.OrderCreateInput[] = [ id: "order_id:1", payment_id: "payment_id:1", delivery_id: "delivery_id:1", + delivery_type: "DELIVERY", user: { connectOrCreate: { where: { id: "user_id:1" }, @@ -48,6 +49,7 @@ const orders: Prisma.OrderCreateInput[] = [ id: "order_id:2", payment_id: "payment_id:2", delivery_id: "delivery_id:2", + delivery_type: "DELIVERY", user: { connectOrCreate: { where: { id: "user_id:1" }, @@ -81,6 +83,7 @@ const orders: Prisma.OrderCreateInput[] = [ id: "order_id:3", payment_id: "payment_id:3", delivery_id: "delivery_id:3", + delivery_type: "TAKEAWAY", user: { connectOrCreate: { where: { id: "user_id:2" }, diff --git a/services/order/src/handlers/reporting/delivery-types.ts b/services/order/src/handlers/reporting/delivery-types.ts new file mode 100644 index 00000000..9ae0303b --- /dev/null +++ b/services/order/src/handlers/reporting/delivery-types.ts @@ -0,0 +1,38 @@ +import { prisma } from "@order/lib/prisma"; +import { log } from "@order/lib/log"; +import { + GetDeliveryTypeRepartitionRequest, + GetDeliveryTypeRepartitionResponse, +} from "@order/types/reporting"; +import { Data } from "@order/types"; +import { fromInterval } from "@order/lib/date"; +import { DeliveryType } from "@prisma/client"; + +export const GetDeliveryTypeRepartition = async ( + { request }: Data, + callback: ( + err: any, + response: GetDeliveryTypeRepartitionResponse | null + ) => void +) => { + try { + const { date, restaurant_id, interval } = request; + const { start, end } = fromInterval(interval, date); + + const orders = await prisma.order.findMany({ + where: { restaurant_id, created_at: { gte: start, lte: end } }, + }); + + const delivery = orders.filter( + (o) => o.delivery_type === DeliveryType.DELIVERY + ).length; + const takeaway = orders.filter( + (o) => o.delivery_type === DeliveryType.TAKEAWAY + ).length; + + callback(null, { delivery, takeaway }); + } catch (error) { + log.error(error); + callback(error, null); + } +}; diff --git a/services/order/src/handlers/reporting/index.ts b/services/order/src/handlers/reporting/index.ts index c41498b1..6347e07e 100644 --- a/services/order/src/handlers/reporting/index.ts +++ b/services/order/src/handlers/reporting/index.ts @@ -1,11 +1,13 @@ import { UntypedServiceImplementation } from "@grpc/grpc-js"; import { GetOrdersAffluence } from "@order/handlers/reporting/affluence"; +import { GetDeliveryTypeRepartition } from "@order/handlers/reporting/delivery-types"; import { GetTop5SellingProducts } from "@order/handlers/reporting/top5-selling"; const reportingHandlers: UntypedServiceImplementation = { GetOrdersAffluence, - GetTop5SellingProducts + GetTop5SellingProducts, + GetDeliveryTypeRepartition, }; export default reportingHandlers; diff --git a/services/order/src/types/order.d.ts b/services/order/src/types/order.d.ts index b7f16540..4942a655 100644 --- a/services/order/src/types/order.d.ts +++ b/services/order/src/types/order.d.ts @@ -1,4 +1,4 @@ -import { Prisma, Status } from "@prisma/client"; +import { DeliveryType, Prisma, Status } from "@prisma/client"; export type UserMinimum = { id: string; @@ -17,6 +17,8 @@ export type Order = { id: string; payment_id: string; delivery_id: string; + delivery_type: DeliveryType + restaurant_id: string; user: UserMinimum; basket_snapshot: Basket; status: Status; @@ -53,6 +55,7 @@ export type GetOrdersByStatusResponse = { export type CreateOrderRequest = { payment_id: string; delivery_id: string; + delivery_type: DeliveryType; user: UserMinimum; basket_snapshot: Basket; restaurant_id: string; @@ -62,6 +65,7 @@ export type UpdateOrderRequest = { id: string; payment_id: string; delivery_id: string; + delivery_type: DeliveryType; status: Status; restaurant_id: string; }; diff --git a/services/order/src/types/reporting.d.ts b/services/order/src/types/reporting.d.ts index 922a47be..7381bd41 100644 --- a/services/order/src/types/reporting.d.ts +++ b/services/order/src/types/reporting.d.ts @@ -28,3 +28,14 @@ export type ProductCount = { export type GetTop5SellingProductsResponse = { products_count: ProductCount[]; }; + +export type GetDeliveryTypeRepartitionRequest = { + date?: string; + interval: Interval; + restaurant_id: string; +}; + +export type GetDeliveryTypeRepartitionResponse = { + delivery: number; + takeaway: number; +}; diff --git a/services/proto/order.proto b/services/proto/order.proto index 21f6eec3..6d449c1f 100644 --- a/services/proto/order.proto +++ b/services/proto/order.proto @@ -10,7 +10,13 @@ enum Status { IN_PROGRESS = 1; FULFILLED = 2; REJECTED = 3; - } +} + +enum DeliveryType { + DELIVERY = 0; + PICKUP = 1; + +} message UserMinimum { string id = 1; @@ -33,6 +39,7 @@ message Order { string payment_id = 2; string delivery_id = 3; + DeliveryType delivery_type = 8; UserMinimum user = 4; Basket basket_snapshot = 5; @@ -56,6 +63,7 @@ service OrderService { service OrderReportingService { rpc GetOrdersAffluence(GetOrdersAffluenceRequest) returns (GetOrdersAffluenceResponse) {} rpc GetTop5SellingProducts(GetTop5SellingProductsRequest) returns (GetTop5SellingProductsResponse) {} + rpc GetDeliveryTypeRepartition(GetDeliveryTypeRepartitionRequest) returns (GetDeliveryTypeRepartitionResponse) {} } message GetOrderRequest { @@ -89,11 +97,12 @@ message GetOrdersByStatusResponse { message CreateOrderRequest { string payment_id = 1; string delivery_id = 2; + string delivery_type = 3; - UserMinimum user = 3; - Basket basket_snapshot = 4; + UserMinimum user = 4; + Basket basket_snapshot = 5; - string restaurant_id = 5; + string restaurant_id = 6; } message UpdateOrderRequest{ @@ -144,4 +153,15 @@ message GetTop5SellingProductsResponse { message ProductCount { string id = 1; int32 count = 2; +} + +message GetDeliveryTypeRepartitionRequest { + optional string date = 1; + string interval = 2; + string restaurant_id = 3; +} + +message GetDeliveryTypeRepartitionResponse { + int32 delivery = 1; + int32 takeaway = 2; } \ No newline at end of file From 7e4b1d1bb8e5d57efabe72a970fc9b33235fd387 Mon Sep 17 00:00:00 2001 From: Florian LEROUX Date: Thu, 6 Jul 2023 14:18:17 +0200 Subject: [PATCH 204/883] fix(ci): update pnpm from '7' to latest --- .github/workflows/order.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/order.yml b/.github/workflows/order.yml index ed557e26..0dd23e28 100644 --- a/.github/workflows/order.yml +++ b/.github/workflows/order.yml @@ -13,7 +13,7 @@ jobs: - uses: actions/checkout@master - uses: pnpm/action-setup@v2 with: - version: 7 + version: latest - uses: actions/setup-node@v3 with: node-version: "18.x" @@ -34,7 +34,7 @@ jobs: - uses: actions/checkout@master - uses: pnpm/action-setup@v2 with: - version: 7 + version: latest - uses: actions/setup-node@v3 with: node-version: "18.x" From b3611141b48938268e4923dd15e1851ed950eef7 Mon Sep 17 00:00:00 2001 From: Florian LEROUX Date: Thu, 6 Jul 2023 14:37:11 +0200 Subject: [PATCH 205/883] fix(test): add missing properties --- services/order/src/tests/transformer.test.ts | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/services/order/src/tests/transformer.test.ts b/services/order/src/tests/transformer.test.ts index 9049bb75..fcf18456 100644 --- a/services/order/src/tests/transformer.test.ts +++ b/services/order/src/tests/transformer.test.ts @@ -10,6 +10,8 @@ describe("tests@goodfood/order.transformer.toGrpc", function () { id: "order_id:1", payment_id: "payment_id:1", delivery_id: "delivery_id:1", + delivery_type: "DELIVERY", + restaurant_id: "restaurant_id:1", user: { id: "user_id:1", first_name: "first_name", @@ -33,6 +35,8 @@ describe("tests@goodfood/order.transformer.toGrpc", function () { assert.equal(parsed?.id, "order_id:1"); assert.equal(parsed?.payment_id, "payment_id:1"); assert.equal(parsed?.delivery_id, "delivery_id:1"); + assert.equal(parsed?.delivery_type, "DELIVERY"); + assert.equal(parsed?.restaurant_id, "restaurant_id:1"); assert.equal(parsed?.user.id, "user_id:1"); assert.equal(parsed?.user.first_name, "first_name"); assert.equal(parsed?.user.last_name, "last_name"); @@ -54,6 +58,8 @@ describe("tests@goodfood/order.transformer.toGrpc", function () { id: "", payment_id: "", delivery_id: "", + delivery_type: "DELIVERY", + restaurant_id: "", user: { id: "", first_name: "", @@ -72,6 +78,8 @@ describe("tests@goodfood/order.transformer.toGrpc", function () { assert.equal(parsed?.id, ""); assert.equal(parsed?.payment_id, ""); assert.equal(parsed?.delivery_id, ""); + assert.equal(parsed?.delivery_type, "DELIVERY"); + assert.equal(parsed?.restaurant_id, ""); assert.equal(parsed?.user.id, ""); assert.equal(parsed?.user.first_name, ""); assert.equal(parsed?.user.last_name, ""); From e770d5d67ff3190d2a5261bbfa119b726210473d Mon Sep 17 00:00:00 2001 From: Florian LEROUX Date: Thu, 6 Jul 2023 14:48:11 +0200 Subject: [PATCH 206/883] doc: add markdwon files --- CODE_OF_CONDUCT.md | 19 +++++++++++++++++++ CODE_STYLE.md | 12 ++++++++++++ CONTRIBUTING.md | 28 ++++++++++++++++++++++++++++ README.md | 13 ++++++------- 4 files changed, 65 insertions(+), 7 deletions(-) create mode 100644 CODE_OF_CONDUCT.md create mode 100644 CODE_STYLE.md diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md new file mode 100644 index 00000000..d28bd2f7 --- /dev/null +++ b/CODE_OF_CONDUCT.md @@ -0,0 +1,19 @@ +# Code of Conduct + +We are committed to providing a friendly, safe, and welcoming environment for all, regardless of gender, sexual orientation, ability, ethnicity, socioeconomic status, and religion (or lack thereof). + +We do not tolerate harassment or discrimination of any kind, including but not limited to: + +- Offensive comments related to gender, sexual orientation, ability, ethnicity, socioeconomic status, and religion (or lack thereof) +- Threats of violence or incitement of violence +- Unwelcome sexual attention or advances +- Intimidation, stalking, or following +- Invasion of privacy +- Publishing private information without permission +- Other conduct that is inappropriate for a professional audience + +If you witness or experience any of the above, please report it to the project maintainers immediately. All reports will be kept confidential. + +We reserve the right to remove any content or contributors that violate this code of conduct. + +Thank you for helping us maintain a welcoming and inclusive community! \ No newline at end of file diff --git a/CODE_STYLE.md b/CODE_STYLE.md new file mode 100644 index 00000000..d23eab4e --- /dev/null +++ b/CODE_STYLE.md @@ -0,0 +1,12 @@ +# Code Style Guidelines + +We follow each language-specific style guide for any language used in this project. In addition, we have a few additional guidelines: + +- Use descriptive variable and function names +- Keep lines under 80 characters +- Use spaces instead of tabs +- Use double quotes for strings + +If you're unsure about any aspect of the code style, please ask in the pull request or issue discussion. + +Thank you for helping us maintain a consistent and readable codebase! \ No newline at end of file diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index e69de29b..3fcca018 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -0,0 +1,28 @@ +# Contributing + +Thank you for considering contributing to this project! Here are a few guidelines to help you get started. + +## Issues and Bugs + +If you find an issue or a bug, please submit it to our [issue tracker](https://github.com/floriaaan/goodfood/issues/new) with a clear description and steps to reproduce it. + +## Feature Requests + +If you have a feature request, please submit it to our [issue tracker](https://github.com/floriaaan/goodfood/issues/new) with a clear description of the feature and why you think it would be useful. + +## Pull Requests + +We welcome pull requests from anyone who wants to contribute. Before submitting a pull request, please make sure to: + +- Create a new branch for your changes +- Write tests for your changes +- Ensure all tests pass +- Follow our [code style guidelines](./CODE_STYLE.md) + +Once you're ready, submit your pull request and we'll review it as soon as possible. + +## Code of Conduct + +Please note that we have a [code of conduct](./CODE_OF_CONDUCT.md) that we expect all contributors to follow. + +Thank you again for your interest in contributing to this project! \ No newline at end of file diff --git a/README.md b/README.md index 4bf6e30e..a405370d 100644 --- a/README.md +++ b/README.md @@ -19,10 +19,11 @@ The GoodFood 2.0 project was initiated to update the existing ordering applicati | Product | 50004 | NodeJS (ts) | PostgreSQL | ❌ | @PierreLbg | | Restaurant | 50005 | NodeJS (ts) | PostgreSQL | ❌ | @PierreLbg | | Promotion | 50006 | NodeJS (ts) | PostgreSQL | ❌ | @PierreLbg | -| Order | 50007 | NodeJS (ts) | MongoDB | ❌ | @floriaaan | +| Order | 50007 | NodeJS (ts) | PostgreSQL | ✅ | @floriaaan | | Delivery | 50008 | NodeJS (ts) | PostgreSQL | ⚠️ | @floriaaan | | Stock | 50009 | NodeJS (ts) | PostgreSQL | ❌ | @floriaaan | -| Reporting | 50010 | C# (dotnet) | PostgreSQL | ❌ | @floriaaan | +| Reporting | 50020 | C# (dotnet) | PostgreSQL | ❌ | @floriaaan | +| Log | 50021 | Go | PostgreSQL | ✅ | @floriaaan | | (...) | (...) | (...) | (...) | (...) | ## File Hierarchy @@ -58,13 +59,11 @@ The file hierarchy for this project is as follows: └── (...) # proto files ``` -## Installation +## Installation & usage -TBW : Installation instructions +Each service has its own README.md file with installation and usage instructions. -## Usage - -TBW : Usage instructions +Please refer to the README.md file of the service you want to install and use. ## Contributing From bd46689491bde0227be82810138093e47395fe1c Mon Sep 17 00:00:00 2001 From: Florian LEROUX Date: Thu, 6 Jul 2023 15:23:51 +0200 Subject: [PATCH 207/883] git: rebase dev into stock From 6dc6c219e0123b8a0d4116bb3cc2654407dc24e6 Mon Sep 17 00:00:00 2001 From: Florian LEROUX Date: Fri, 7 Jul 2023 09:06:23 +0200 Subject: [PATCH 208/883] feat(init): init service code and add proto/type/schema definitions --- services/proto/stock.proto | 166 + services/stock/.dockerignore | 2 + services/stock/.env.example | 4 + services/stock/.gitignore | 5 + services/stock/.nvmrc | 1 + services/stock/Dockerfile | 38 + services/stock/k8s/configmap.yml | 8 + services/stock/k8s/deployment.yml | 31 + services/stock/k8s/hpa.yml | 18 + services/stock/k8s/ingress.yml | 17 + services/stock/k8s/service.yml | 13 + services/stock/package.json | 55 + services/stock/pnpm-lock.yaml | 2705 +++++++++++++++++ .../20230707065949_init/migration.sql | 42 + .../prisma/migrations/migration_lock.toml | 3 + services/stock/prisma/schema.prisma | 47 + services/stock/prisma/seed.ts | 31 + services/stock/proto | 1 + services/stock/src/handlers/.gitinclude | 0 .../stock/src/handlers/reporting/index.ts | 5 + services/stock/src/handlers/stock/index.ts | 5 + .../src/handlers/stock/ingredient/get.ts | 0 services/stock/src/lib/amqp.ts | 32 + services/stock/src/lib/date.ts | 28 + services/stock/src/lib/log.ts | 74 + services/stock/src/lib/prisma.ts | 29 + services/stock/src/lib/proxy.ts | 132 + services/stock/src/lib/reflection.ts | 23 + services/stock/src/lib/struct.ts | 53 + services/stock/src/lib/transformer.ts | 5 + services/stock/src/middleware/log.ts | 42 + .../stock/src/resources/grpc-credentials.ts | 5 + .../src/resources/protoloader-options.ts | 7 + services/stock/src/server.ts | 47 + services/stock/src/tests/date.test.ts | 77 + services/stock/src/tests/struct.test.ts | 64 + services/stock/src/tests/transformer.test.ts | 11 + services/stock/src/types/index.d.ts | 5 + services/stock/src/types/stock.d.ts | 131 + services/stock/tsconfig.json | 18 + services/stock/vitest.config.ts | 10 + 41 files changed, 3990 insertions(+) create mode 100644 services/proto/stock.proto create mode 100644 services/stock/.dockerignore create mode 100644 services/stock/.env.example create mode 100644 services/stock/.gitignore create mode 100644 services/stock/.nvmrc create mode 100644 services/stock/Dockerfile create mode 100644 services/stock/k8s/configmap.yml create mode 100644 services/stock/k8s/deployment.yml create mode 100644 services/stock/k8s/hpa.yml create mode 100644 services/stock/k8s/ingress.yml create mode 100644 services/stock/k8s/service.yml create mode 100644 services/stock/package.json create mode 100644 services/stock/pnpm-lock.yaml create mode 100644 services/stock/prisma/migrations/20230707065949_init/migration.sql create mode 100644 services/stock/prisma/migrations/migration_lock.toml create mode 100644 services/stock/prisma/schema.prisma create mode 100644 services/stock/prisma/seed.ts create mode 120000 services/stock/proto create mode 100644 services/stock/src/handlers/.gitinclude create mode 100644 services/stock/src/handlers/reporting/index.ts create mode 100644 services/stock/src/handlers/stock/index.ts create mode 100644 services/stock/src/handlers/stock/ingredient/get.ts create mode 100644 services/stock/src/lib/amqp.ts create mode 100644 services/stock/src/lib/date.ts create mode 100644 services/stock/src/lib/log.ts create mode 100644 services/stock/src/lib/prisma.ts create mode 100644 services/stock/src/lib/proxy.ts create mode 100644 services/stock/src/lib/reflection.ts create mode 100644 services/stock/src/lib/struct.ts create mode 100644 services/stock/src/lib/transformer.ts create mode 100644 services/stock/src/middleware/log.ts create mode 100644 services/stock/src/resources/grpc-credentials.ts create mode 100644 services/stock/src/resources/protoloader-options.ts create mode 100644 services/stock/src/server.ts create mode 100644 services/stock/src/tests/date.test.ts create mode 100644 services/stock/src/tests/struct.test.ts create mode 100644 services/stock/src/tests/transformer.test.ts create mode 100644 services/stock/src/types/index.d.ts create mode 100644 services/stock/src/types/stock.d.ts create mode 100644 services/stock/tsconfig.json create mode 100644 services/stock/vitest.config.ts diff --git a/services/proto/stock.proto b/services/proto/stock.proto new file mode 100644 index 00000000..4d0895c3 --- /dev/null +++ b/services/proto/stock.proto @@ -0,0 +1,166 @@ +syntax = "proto3"; + +package com.goodfood.stock; + +message Ingredient { + int32 id = 1; + string name = 2; + optional string description = 3; +} + +message IngredientRestaurant { + int32 id = 1; + + int32 alert_threshold = 2; + int32 quantity = 3; + repeated string in_product_list = 12; + + float unit_price = 4; + float price_per_kilo = 5; + + string restaurant_id = 6; + + int32 ingredient_id = 7; + Ingredient ingredient = 8; + + int32 supplier_id = 9; + Supplier supplier = 10; + + string updated_at = 11; +} + +message Supplier { + int32 id = 1; + string name = 2; + string contact = 3; +} + +service StockService { + rpc GetIngredient(GetIngredientRequest) returns (Ingredient) {} + rpc GetIngredients() returns (GetIngredientsResponse) {} + rpc CreateIngredient(CreateIngredientRequest) returns (Ingredient) {} + rpc UpdateIngredient(UpdateIngredientRequest) returns (Ingredient) {} + rpc DeleteIngredient(DeleteIngredientRequest) returns (DeleteIngredientResponse) {} + + rpc GetSupplier(GetSupplierRequest) returns (Supplier) {} + rpc GetSuppliers() returns (GetSuppliersResponse) {} + rpc CreateSupplier(CreateSupplierRequest) returns (Supplier) {} + rpc UpdateSupplier(UpdateSupplierRequest) returns (Supplier) {} + rpc DeleteSupplier(DeleteSupplierRequest) returns (DeleteSupplierResponse) {} + + rpc GetIngredientRestaurant(GetIngredientRestaurantRequest) returns (IngredientRestaurant) {} + rpc GetIngredientRestaurantsByRestaurant(GetIngredientRestaurantsByRestaurantRequest) returns (GetIngredientRestaurantsByRestaurantResponse) {} + rpc CreateIngredientRestaurant(CreateIngredientRestaurantRequest) returns (IngredientRestaurant) {} + rpc UpdateIngredientRestaurant(UpdateIngredientRestaurantRequest) returns (IngredientRestaurant) {} + rpc DeleteIngredientRestaurant(DeleteIngredientRestaurantRequest) returns (DeleteIngredientRestaurantResponse) {} + +} + +service StockReportingService { +} + +message GetIngredientRequest { + int32 id = 1; +} + + +message GetIngredientsResponse { + repeated Ingredient ingredients = 1; +} + +message CreateIngredientRequest { + string name = 1; + optional string description = 2; +} + +message UpdateIngredientRequest { + int32 id = 1; + string name = 2; + optional string description = 3; +} + +message DeleteIngredientRequest { + int32 id = 1; +} + +message DeleteIngredientResponse { + bool success = 1; +} + +message GetSupplierRequest { + int32 id = 1; +} + +message GetSuppliersResponse { + repeated Supplier suppliers = 1; +} + +message CreateSupplierRequest { + string name = 1; + string contact = 2; +} + +message UpdateSupplierRequest { + int32 id = 1; + string name = 2; + string contact = 3; +} + +message DeleteSupplierRequest { + int32 id = 1; +} + +message DeleteSupplierResponse { + bool success = 1; +} + +message GetIngredientRestaurantRequest { + string id = 1; +} + +message GetIngredientRestaurantsByRestaurantRequest { + string restaurant_id = 1; +} + +message GetIngredientRestaurantsByRestaurantResponse { + repeated IngredientRestaurant ingredient_restaurants = 1; +} + +message CreateIngredientRestaurantRequest { + int32 alert_threshold = 1; + int32 quantity = 2; + repeated string in_product_list = 12; + + float unit_price = 3; + float price_per_kilo = 4; + + string restaurant_id = 5; + + int32 ingredient_id = 6; + + int32 supplier_id = 7; +} + +message UpdateIngredientRestaurantRequest { + int32 id = 1; + int32 alert_threshold = 2; + int32 quantity = 3; + repeated string in_product_list = 12; + + float unit_price = 4; + float price_per_kilo = 5; + + string restaurant_id = 6; + + int32 ingredient_id = 7; + + int32 supplier_id = 8; +} + +message DeleteIngredientRestaurantRequest { + int32 id = 1; +} + +message DeleteIngredientRestaurantResponse { + bool success = 1; +} diff --git a/services/stock/.dockerignore b/services/stock/.dockerignore new file mode 100644 index 00000000..b7dab5e9 --- /dev/null +++ b/services/stock/.dockerignore @@ -0,0 +1,2 @@ +node_modules +build \ No newline at end of file diff --git a/services/stock/.env.example b/services/stock/.env.example new file mode 100644 index 00000000..93d928e4 --- /dev/null +++ b/services/stock/.env.example @@ -0,0 +1,4 @@ +DATABASE_URL=postgres://postgres:password@localhost:5432/postgres +AMQP_URL=amqp://guest:guest@localhost + +PORT=50009 \ No newline at end of file diff --git a/services/stock/.gitignore b/services/stock/.gitignore new file mode 100644 index 00000000..583204b4 --- /dev/null +++ b/services/stock/.gitignore @@ -0,0 +1,5 @@ +node_modules/ +dist/ +bin/ +*.env* +!*.env.example diff --git a/services/stock/.nvmrc b/services/stock/.nvmrc new file mode 100644 index 00000000..9dfef472 --- /dev/null +++ b/services/stock/.nvmrc @@ -0,0 +1 @@ +v18.12.0 diff --git a/services/stock/Dockerfile b/services/stock/Dockerfile new file mode 100644 index 00000000..f4393675 --- /dev/null +++ b/services/stock/Dockerfile @@ -0,0 +1,38 @@ +FROM node:18-alpine3.17 as builder + +# Set working directory +WORKDIR /app + +# Copy the application code +COPY ./order/ . + +# Install dependencies +RUN npm install + +# Copy the proto files +COPY ./proto ./proto/ + +# Generate Prisma client +RUN npx prisma generate + +# Build the application +RUN npm run build + + +# Create a new image with the application +FROM node:18-alpine3.17 as runner + +# Set working directory +WORKDIR /app + +# Copy the application package +COPY --from=builder /app/dist . +COPY --from=builder /app/prisma/ . +COPY --from=builder /app/proto/ /proto/ +COPY --from=builder /app/node_modules/.prisma /.prisma + +# Expose the gRPC port +EXPOSE 50009 + +# Start the server +CMD [ "node", "index.js"] diff --git a/services/stock/k8s/configmap.yml b/services/stock/k8s/configmap.yml new file mode 100644 index 00000000..3fb50fa9 --- /dev/null +++ b/services/stock/k8s/configmap.yml @@ -0,0 +1,8 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: goodfood-stock-configmap + labels: + app: goodfood-stock +data: + port: "50009" \ No newline at end of file diff --git a/services/stock/k8s/deployment.yml b/services/stock/k8s/deployment.yml new file mode 100644 index 00000000..9259505b --- /dev/null +++ b/services/stock/k8s/deployment.yml @@ -0,0 +1,31 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: goodfood-stock + labels: + app: goodfood-stock +spec: + selector: + matchLabels: + app: goodfood-stock + template: + metadata: + labels: + app: goodfood-stock + spec: + containers: + - name: goodfood-stock + image: floriaaan/goodfood-stock:1.0.0 + imagePullPolicy: Always + resources: + limits: + memory: "128Mi" + cpu: "200m" + env: + - name: PORT + valueFrom: + configMapKeyRef: + name: goodfood-stock-configmap + key: port + ports: + - containerPort: 50009 diff --git a/services/stock/k8s/hpa.yml b/services/stock/k8s/hpa.yml new file mode 100644 index 00000000..87ad4abb --- /dev/null +++ b/services/stock/k8s/hpa.yml @@ -0,0 +1,18 @@ +apiVersion: autoscaling/v2 +kind: HorizontalPodAutoscaler +metadata: + name: goodfood-stock-hpa +spec: + scaleTargetRef: + apiVersion: apps/v1 + kind: Deployment + name: goodfood-stock + minReplicas: 1 + maxReplicas: 3 + metrics: + - type: Resource + resource: + name: cpu + target: + type: Utilization + averageUtilization: 50 diff --git a/services/stock/k8s/ingress.yml b/services/stock/k8s/ingress.yml new file mode 100644 index 00000000..805968b2 --- /dev/null +++ b/services/stock/k8s/ingress.yml @@ -0,0 +1,17 @@ +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + name: goodfood-stock +spec: + ingressClassName: nginx + rules: + - host: stock.localdev.me + http: + paths: + - pathType: Prefix + backend: + service: + name: goodfood-stock + port: + number: 50009 + path: / \ No newline at end of file diff --git a/services/stock/k8s/service.yml b/services/stock/k8s/service.yml new file mode 100644 index 00000000..6b25ee73 --- /dev/null +++ b/services/stock/k8s/service.yml @@ -0,0 +1,13 @@ +apiVersion: v1 +kind: Service +metadata: + name: goodfood-stock +spec: + selector: + app: goodfood-stock + ports: + - name: "grpc" + port: 50009 + targetPort: 50009 +status: + loadBalancer: {} diff --git a/services/stock/package.json b/services/stock/package.json new file mode 100644 index 00000000..7bb3862d --- /dev/null +++ b/services/stock/package.json @@ -0,0 +1,55 @@ +{ + "name": "@goodfood/stock", + "bin": "dist/index.js", + "scripts": { + "start": "node dist/index.js", + "dev": "nodemon --watch 'src/**/*.ts' --exec 'ts-node' src/server.ts", + "build": "esbuild src/server.ts --bundle --platform=node --target=node18 --outfile=dist/index.js", + "test": "vitest", + "coverage": "vitest --coverage", + "prisma:generate": "prisma generate", + "seed": "ts-node prisma/seed.ts", + "postinstall": "npm run prisma:generate" + }, + "dependencies": { + "@grpc/grpc-js": "1.8.14", + "@grpc/proto-loader": "0.7.6", + "@prisma/client": "4.16.2", + "amqplib": "^0.10.3", + "dotenv": "^16.0.3", + "grpc-server-reflection": "^0.1.5", + "protobufjs": "7.2.2" + }, + "devDependencies": { + "@types/amqplib": "^0.10.1", + "@types/node": "18.15.9", + "@vitest/coverage-c8": "^0.29.8", + "esbuild": "^0.17.18", + "grpc-tools": "^1.12.4", + "nodemon": "^2.0.22", + "pkg": "^5.8.1", + "prisma": "4.16.2", + "ts-node": "10.9.1", + "tsconfig-paths": "^4.2.0", + "typescript": "5.0.2", + "vite-tsconfig-paths": "^4.2.0", + "vitest": "^0.29.8", + "vitest-mock-extended": "^1.1.3" + }, + "prisma": { + "seed": "ts-node prisma/seed.ts" + }, + "pkg": { + "scripts": "./src/dist/index.js", + "assets": [ + "./prisma/**/*", + "../proto/**/*" + ], + "targets": [ + "node18-macos-arm64", + "node18-linux-x64", + "node18-linux-arm64" + ], + "outputPath": "bin/" + } +} diff --git a/services/stock/pnpm-lock.yaml b/services/stock/pnpm-lock.yaml new file mode 100644 index 00000000..717d3148 --- /dev/null +++ b/services/stock/pnpm-lock.yaml @@ -0,0 +1,2705 @@ +lockfileVersion: '6.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +dependencies: + '@grpc/grpc-js': + specifier: 1.8.14 + version: 1.8.14 + '@grpc/proto-loader': + specifier: 0.7.6 + version: 0.7.6 + '@prisma/client': + specifier: 4.16.2 + version: 4.16.2(prisma@4.16.2) + amqplib: + specifier: ^0.10.3 + version: 0.10.3 + dotenv: + specifier: ^16.0.3 + version: 16.0.3 + grpc-server-reflection: + specifier: ^0.1.5 + version: 0.1.5 + protobufjs: + specifier: 7.2.2 + version: 7.2.2 + +devDependencies: + '@types/amqplib': + specifier: ^0.10.1 + version: 0.10.1 + '@types/node': + specifier: 18.15.9 + version: 18.15.9 + '@vitest/coverage-c8': + specifier: ^0.29.8 + version: 0.29.8(vitest@0.29.8) + esbuild: + specifier: ^0.17.18 + version: 0.17.18 + grpc-tools: + specifier: ^1.12.4 + version: 1.12.4 + nodemon: + specifier: ^2.0.22 + version: 2.0.22 + pkg: + specifier: ^5.8.1 + version: 5.8.1 + prisma: + specifier: 4.16.2 + version: 4.16.2 + ts-node: + specifier: 10.9.1 + version: 10.9.1(@types/node@18.15.9)(typescript@5.0.2) + tsconfig-paths: + specifier: ^4.2.0 + version: 4.2.0 + typescript: + specifier: 5.0.2 + version: 5.0.2 + vite-tsconfig-paths: + specifier: ^4.2.0 + version: 4.2.0(typescript@5.0.2) + vitest: + specifier: ^0.29.8 + version: 0.29.8 + vitest-mock-extended: + specifier: ^1.1.3 + version: 1.1.3(typescript@5.0.2)(vitest@0.29.8) + +packages: + + /@acuminous/bitsyntax@0.1.2: + resolution: {integrity: sha512-29lUK80d1muEQqiUsSo+3A0yP6CdspgC95EnKBMi22Xlwt79i/En4Vr67+cXhU+cZjbti3TgGGC5wy1stIywVQ==} + engines: {node: '>=0.8'} + dependencies: + buffer-more-ints: 1.0.0 + debug: 4.3.4 + safe-buffer: 5.1.2 + transitivePeerDependencies: + - supports-color + dev: false + + /@babel/generator@7.18.2: + resolution: {integrity: sha512-W1lG5vUwFvfMd8HVXqdfbuG7RuaSrTCCD8cl8fP8wOivdbtbIg2Db3IWUcgvfxKbbn6ZBGYRW/Zk1MIwK49mgw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.19.0 + '@jridgewell/gen-mapping': 0.3.3 + jsesc: 2.5.2 + 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.5: + resolution: {integrity: sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/parser@7.18.4: + resolution: {integrity: sha512-FDge0dFazETFcxGw/EXzOkN8uJp0PC7Qbm+Pe9T+av2zlBpOgunFHkQPPn+eRuClU73JF+98D531UgayY89tow==} + engines: {node: '>=6.0.0'} + hasBin: true + dependencies: + '@babel/types': 7.19.0 + dev: true + + /@babel/types@7.19.0: + resolution: {integrity: sha512-YuGopBq3ke25BVSiS6fgF49Ul9gH1x70Bcr6bqRLjWCkcX8Hre1/5+z+IiWOIerRMSSEfGZVB9z9kyq7wVs9YA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-string-parser': 7.22.5 + '@babel/helper-validator-identifier': 7.22.5 + 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 + + /@esbuild/android-arm64@0.17.18: + resolution: {integrity: sha512-/iq0aK0eeHgSC3z55ucMAHO05OIqmQehiGay8eP5l/5l+iEr4EIbh4/MI8xD9qRFjqzgkc0JkX0LculNC9mXBw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-arm64@0.18.11: + resolution: {integrity: sha512-snieiq75Z1z5LJX9cduSAjUr7vEI1OdlzFPMw0HH5YI7qQHDd3qs+WZoMrWYDsfRJSq36lIA6mfZBkvL46KoIw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-arm@0.17.18: + resolution: {integrity: sha512-EmwL+vUBZJ7mhFCs5lA4ZimpUH3WMAoqvOIYhVQwdIgSpHC8ImHdsRyhHAVxpDYUSm0lWvd63z0XH1IlImS2Qw==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-arm@0.18.11: + resolution: {integrity: sha512-q4qlUf5ucwbUJZXF5tEQ8LF7y0Nk4P58hOsGk3ucY0oCwgQqAnqXVbUuahCddVHfrxmpyewRpiTHwVHIETYu7Q==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-x64@0.17.18: + resolution: {integrity: sha512-x+0efYNBF3NPW2Xc5bFOSFW7tTXdAcpfEg2nXmxegm4mJuVeS+i109m/7HMiOQ6M12aVGGFlqJX3RhNdYM2lWg==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-x64@0.18.11: + resolution: {integrity: sha512-iPuoxQEV34+hTF6FT7om+Qwziv1U519lEOvekXO9zaMMlT9+XneAhKL32DW3H7okrCOBQ44BMihE8dclbZtTuw==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-arm64@0.17.18: + resolution: {integrity: sha512-6tY+djEAdF48M1ONWnQb1C+6LiXrKjmqjzPNPWXhu/GzOHTHX2nh8Mo2ZAmBFg0kIodHhciEgUBtcYCAIjGbjQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-arm64@0.18.11: + resolution: {integrity: sha512-Gm0QkI3k402OpfMKyQEEMG0RuW2LQsSmI6OeO4El2ojJMoF5NLYb3qMIjvbG/lbMeLOGiW6ooU8xqc+S0fgz2w==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-x64@0.17.18: + resolution: {integrity: sha512-Qq84ykvLvya3dO49wVC9FFCNUfSrQJLbxhoQk/TE1r6MjHo3sFF2tlJCwMjhkBVq3/ahUisj7+EpRSz0/+8+9A==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-x64@0.18.11: + resolution: {integrity: sha512-N15Vzy0YNHu6cfyDOjiyfJlRJCB/ngKOAvoBf1qybG3eOq0SL2Lutzz9N7DYUbb7Q23XtHPn6lMDF6uWbGv9Fw==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-arm64@0.17.18: + resolution: {integrity: sha512-fw/ZfxfAzuHfaQeMDhbzxp9mc+mHn1Y94VDHFHjGvt2Uxl10mT4CDavHm+/L9KG441t1QdABqkVYwakMUeyLRA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-arm64@0.18.11: + resolution: {integrity: sha512-atEyuq6a3omEY5qAh5jIORWk8MzFnCpSTUruBgeyN9jZq1K/QI9uke0ATi3MHu4L8c59CnIi4+1jDKMuqmR71A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-x64@0.17.18: + resolution: {integrity: sha512-FQFbRtTaEi8ZBi/A6kxOC0V0E9B/97vPdYjY9NdawyLd4Qk5VD5g2pbWN2VR1c0xhzcJm74HWpObPszWC+qTew==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-x64@0.18.11: + resolution: {integrity: sha512-XtuPrEfBj/YYYnAAB7KcorzzpGTvOr/dTtXPGesRfmflqhA4LMF0Gh/n5+a9JBzPuJ+CGk17CA++Hmr1F/gI0Q==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm64@0.17.18: + resolution: {integrity: sha512-R7pZvQZFOY2sxUG8P6A21eq6q+eBv7JPQYIybHVf1XkQYC+lT7nDBdC7wWKTrbvMXKRaGudp/dzZCwL/863mZQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm64@0.18.11: + resolution: {integrity: sha512-c6Vh2WS9VFKxKZ2TvJdA7gdy0n6eSy+yunBvv4aqNCEhSWVor1TU43wNRp2YLO9Vng2G+W94aRz+ILDSwAiYog==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm@0.17.18: + resolution: {integrity: sha512-jW+UCM40LzHcouIaqv3e/oRs0JM76JfhHjCavPxMUti7VAPh8CaGSlS7cmyrdpzSk7A+8f0hiedHqr/LMnfijg==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm@0.18.11: + resolution: {integrity: sha512-Idipz+Taso/toi2ETugShXjQ3S59b6m62KmLHkJlSq/cBejixmIydqrtM2XTvNCywFl3VC7SreSf6NV0i6sRyg==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ia32@0.17.18: + resolution: {integrity: sha512-ygIMc3I7wxgXIxk6j3V00VlABIjq260i967Cp9BNAk5pOOpIXmd1RFQJQX9Io7KRsthDrQYrtcx7QCof4o3ZoQ==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ia32@0.18.11: + resolution: {integrity: sha512-S3hkIF6KUqRh9n1Q0dSyYcWmcVa9Cg+mSoZEfFuzoYXXsk6196qndrM+ZiHNwpZKi3XOXpShZZ+9dfN5ykqjjw==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-loong64@0.17.18: + resolution: {integrity: sha512-bvPG+MyFs5ZlwYclCG1D744oHk1Pv7j8psF5TfYx7otCVmcJsEXgFEhQkbhNW8otDHL1a2KDINW20cfCgnzgMQ==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-loong64@0.18.11: + resolution: {integrity: sha512-MRESANOoObQINBA+RMZW+Z0TJWpibtE7cPFnahzyQHDCA9X9LOmGh68MVimZlM9J8n5Ia8lU773te6O3ILW8kw==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-mips64el@0.17.18: + resolution: {integrity: sha512-oVqckATOAGuiUOa6wr8TXaVPSa+6IwVJrGidmNZS1cZVx0HqkTMkqFGD2HIx9H1RvOwFeWYdaYbdY6B89KUMxA==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-mips64el@0.18.11: + resolution: {integrity: sha512-qVyPIZrXNMOLYegtD1u8EBccCrBVshxMrn5MkuFc3mEVsw7CCQHaqZ4jm9hbn4gWY95XFnb7i4SsT3eflxZsUg==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ppc64@0.17.18: + resolution: {integrity: sha512-3dLlQO+b/LnQNxgH4l9rqa2/IwRJVN9u/bK63FhOPB4xqiRqlQAU0qDU3JJuf0BmaH0yytTBdoSBHrb2jqc5qQ==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ppc64@0.18.11: + resolution: {integrity: sha512-T3yd8vJXfPirZaUOoA9D2ZjxZX4Gr3QuC3GztBJA6PklLotc/7sXTOuuRkhE9W/5JvJP/K9b99ayPNAD+R+4qQ==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-riscv64@0.17.18: + resolution: {integrity: sha512-/x7leOyDPjZV3TcsdfrSI107zItVnsX1q2nho7hbbQoKnmoeUWjs+08rKKt4AUXju7+3aRZSsKrJtaRmsdL1xA==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-riscv64@0.18.11: + resolution: {integrity: sha512-evUoRPWiwuFk++snjH9e2cAjF5VVSTj+Dnf+rkO/Q20tRqv+644279TZlPK8nUGunjPAtQRCj1jQkDAvL6rm2w==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-s390x@0.17.18: + resolution: {integrity: sha512-cX0I8Q9xQkL/6F5zWdYmVf5JSQt+ZfZD2bJudZrWD+4mnUvoZ3TDDXtDX2mUaq6upMFv9FlfIh4Gfun0tbGzuw==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-s390x@0.18.11: + resolution: {integrity: sha512-/SlRJ15XR6i93gRWquRxYCfhTeC5PdqEapKoLbX63PLCmAkXZHY2uQm2l9bN0oPHBsOw2IswRZctMYS0MijFcg==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-x64@0.17.18: + resolution: {integrity: sha512-66RmRsPlYy4jFl0vG80GcNRdirx4nVWAzJmXkevgphP1qf4dsLQCpSKGM3DUQCojwU1hnepI63gNZdrr02wHUA==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-x64@0.18.11: + resolution: {integrity: sha512-xcncej+wF16WEmIwPtCHi0qmx1FweBqgsRtEL1mSHLFR6/mb3GEZfLQnx+pUDfRDEM4DQF8dpXIW7eDOZl1IbA==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/netbsd-x64@0.17.18: + resolution: {integrity: sha512-95IRY7mI2yrkLlTLb1gpDxdC5WLC5mZDi+kA9dmM5XAGxCME0F8i4bYH4jZreaJ6lIZ0B8hTrweqG1fUyW7jbg==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/netbsd-x64@0.18.11: + resolution: {integrity: sha512-aSjMHj/F7BuS1CptSXNg6S3M4F3bLp5wfFPIJM+Km2NfIVfFKhdmfHF9frhiCLIGVzDziggqWll0B+9AUbud/Q==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/openbsd-x64@0.17.18: + resolution: {integrity: sha512-WevVOgcng+8hSZ4Q3BKL3n1xTv5H6Nb53cBrtzzEjDbbnOmucEVcZeGCsCOi9bAOcDYEeBZbD2SJNBxlfP3qiA==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/openbsd-x64@0.18.11: + resolution: {integrity: sha512-tNBq+6XIBZtht0xJGv7IBB5XaSyvYPCm1PxJ33zLQONdZoLVM0bgGqUrXnJyiEguD9LU4AHiu+GCXy/Hm9LsdQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/sunos-x64@0.17.18: + resolution: {integrity: sha512-Rzf4QfQagnwhQXVBS3BYUlxmEbcV7MY+BH5vfDZekU5eYpcffHSyjU8T0xucKVuOcdCsMo+Ur5wmgQJH2GfNrg==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: true + optional: true + + /@esbuild/sunos-x64@0.18.11: + resolution: {integrity: sha512-kxfbDOrH4dHuAAOhr7D7EqaYf+W45LsAOOhAet99EyuxxQmjbk8M9N4ezHcEiCYPaiW8Dj3K26Z2V17Gt6p3ng==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-arm64@0.17.18: + resolution: {integrity: sha512-Kb3Ko/KKaWhjeAm2YoT/cNZaHaD1Yk/pa3FTsmqo9uFh1D1Rfco7BBLIPdDOozrObj2sahslFuAQGvWbgWldAg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-arm64@0.18.11: + resolution: {integrity: sha512-Sh0dDRyk1Xi348idbal7lZyfSkjhJsdFeuC13zqdipsvMetlGiFQNdO+Yfp6f6B4FbyQm7qsk16yaZk25LChzg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-ia32@0.17.18: + resolution: {integrity: sha512-0/xUMIdkVHwkvxfbd5+lfG7mHOf2FRrxNbPiKWg9C4fFrB8H0guClmaM3BFiRUYrznVoyxTIyC/Ou2B7QQSwmw==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-ia32@0.18.11: + resolution: {integrity: sha512-o9JUIKF1j0rqJTFbIoF4bXj6rvrTZYOrfRcGyL0Vm5uJ/j5CkBD/51tpdxe9lXEDouhRgdr/BYzUrDOvrWwJpg==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-x64@0.17.18: + resolution: {integrity: sha512-qU25Ma1I3NqTSHJUOKi9sAH1/Mzuvlke0ioMJRthLXKm7JiSKVwFghlGbDLOO2sARECGhja4xYfRAZNPAkooYg==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-x64@0.18.11: + resolution: {integrity: sha512-rQI4cjLHd2hGsM1LqgDI7oOCYbQ6IBOVsX9ejuRMSze0GqXUG2ekwiKkiBU1pRGSeCqFFHxTrcEydB2Hyoz9CA==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@grpc/grpc-js@1.8.14: + resolution: {integrity: sha512-w84maJ6CKl5aApCMzFll0hxtFNT6or9WwMslobKaqWUEf1K+zhlL43bSQhFreyYWIWR+Z0xnVFC1KtLm4ZpM/A==} + engines: {node: ^8.13.0 || >=10.10.0} + dependencies: + '@grpc/proto-loader': 0.7.6 + '@types/node': 18.15.9 + dev: false + + /@grpc/proto-loader@0.7.6: + resolution: {integrity: sha512-QyAXR8Hyh7uMDmveWxDSUcJr9NAWaZ2I6IXgAYvQmfflwouTM+rArE2eEaCtLlRqO81j7pRLCt81IefUei6Zbw==} + engines: {node: '>=6'} + hasBin: true + dependencies: + '@types/long': 4.0.2 + lodash.camelcase: 4.3.0 + long: 4.0.0 + protobufjs: 7.2.2 + yargs: 16.2.0 + dev: false + + /@istanbuljs/schema@0.1.3: + resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} + engines: {node: '>=8'} + 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.18 + dev: true + + /@jridgewell/resolve-uri@3.1.0: + resolution: {integrity: sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==} + engines: {node: '>=6.0.0'} + 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.14: + resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==} + dev: true + + /@jridgewell/sourcemap-codec@1.4.15: + resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + dev: true + + /@jridgewell/trace-mapping@0.3.18: + resolution: {integrity: sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==} + dependencies: + '@jridgewell/resolve-uri': 3.1.0 + '@jridgewell/sourcemap-codec': 1.4.14 + 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 + + /@mapbox/node-pre-gyp@1.0.10: + resolution: {integrity: sha512-4ySo4CjzStuprMwk35H5pPbkymjv1SF3jGLj6rAHp/xT/RF7TL7bd9CTm1xDY49K2qF7jmR/g7k+SkLETP6opA==} + hasBin: true + dependencies: + detect-libc: 2.0.1 + https-proxy-agent: 5.0.1 + make-dir: 3.1.0 + node-fetch: 2.6.12 + nopt: 5.0.0 + npmlog: 5.0.1 + rimraf: 3.0.2 + semver: 7.5.3 + tar: 6.1.15 + transitivePeerDependencies: + - encoding + - supports-color + dev: true + + /@nodelib/fs.scandir@2.1.5: + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + dev: true + + /@nodelib/fs.stat@2.0.5: + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + dev: true + + /@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: true + + /@prisma/client@4.16.2(prisma@4.16.2): + resolution: {integrity: sha512-qCoEyxv1ZrQ4bKy39GnylE8Zq31IRmm8bNhNbZx7bF2cU5aiCCnSa93J2imF88MBjn7J9eUQneNxUQVJdl/rPQ==} + engines: {node: '>=14.17'} + requiresBuild: true + peerDependencies: + prisma: '*' + peerDependenciesMeta: + prisma: + optional: true + dependencies: + '@prisma/engines-version': 4.16.1-1.4bc8b6e1b66cb932731fb1bdbbc550d1e010de81 + prisma: 4.16.2 + dev: false + + /@prisma/engines-version@4.16.1-1.4bc8b6e1b66cb932731fb1bdbbc550d1e010de81: + resolution: {integrity: sha512-q617EUWfRIDTriWADZ4YiWRZXCa/WuhNgLTVd+HqWLffjMSPzyM5uOWoauX91wvQClSKZU4pzI4JJLQ9Kl62Qg==} + dev: false + + /@prisma/engines@4.16.2: + resolution: {integrity: sha512-vx1nxVvN4QeT/cepQce68deh/Turxy5Mr+4L4zClFuK1GlxN3+ivxfuv+ej/gvidWn1cE1uAhW7ALLNlYbRUAw==} + requiresBuild: true + + /@protobufjs/aspromise@1.1.2: + resolution: {integrity: sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==} + dev: false + + /@protobufjs/base64@1.1.2: + resolution: {integrity: sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==} + dev: false + + /@protobufjs/codegen@2.0.4: + resolution: {integrity: sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==} + dev: false + + /@protobufjs/eventemitter@1.1.0: + resolution: {integrity: sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==} + dev: false + + /@protobufjs/fetch@1.1.0: + resolution: {integrity: sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==} + dependencies: + '@protobufjs/aspromise': 1.1.2 + '@protobufjs/inquire': 1.1.0 + dev: false + + /@protobufjs/float@1.0.2: + resolution: {integrity: sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==} + dev: false + + /@protobufjs/inquire@1.1.0: + resolution: {integrity: sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==} + dev: false + + /@protobufjs/path@1.1.2: + resolution: {integrity: sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==} + dev: false + + /@protobufjs/pool@1.1.0: + resolution: {integrity: sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==} + dev: false + + /@protobufjs/utf8@1.1.0: + resolution: {integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==} + 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/amqplib@0.10.1: + resolution: {integrity: sha512-j6ANKT79ncUDnAs/+9r9eDujxbeJoTjoVu33gHHcaPfmLQaMhvfbH2GqSe8KUM444epAp1Vl3peVOQfZk3UIqA==} + dependencies: + '@types/node': 18.15.9 + dev: true + + /@types/chai-subset@1.3.3: + resolution: {integrity: sha512-frBecisrNGz+F4T6bcc+NLeolfiojh5FxW2klu669+8BARtyQv2C/GkNW6FUodVe4BroGMP/wER/YDGc7rEllw==} + dependencies: + '@types/chai': 4.3.5 + dev: true + + /@types/chai@4.3.5: + resolution: {integrity: sha512-mEo1sAde+UCE6b2hxn332f1g1E8WfYRu6p5SvTKr2ZKC1f7gFJXk4h5PyGP9Dt6gCaG8y8XhwnXWC6Iy2cmBng==} + dev: true + + /@types/istanbul-lib-coverage@2.0.4: + resolution: {integrity: sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==} + dev: true + + /@types/long@4.0.2: + resolution: {integrity: sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==} + dev: false + + /@types/node@18.15.9: + resolution: {integrity: sha512-dUxhiNzBLr6IqlZXz6e/rN2YQXlFgOei/Dxy+e3cyXTJ4txSUbGT2/fmnD6zd/75jDMeW5bDee+YXxlFKHoV0A==} + + /@vitest/coverage-c8@0.29.8(vitest@0.29.8): + resolution: {integrity: sha512-y+sEMQMctWokjnSqm3FCQEYFkjLrYaznsxEZHxcx8z2aftpYg3A5tvI1S5himfdEFo7o+OeHzh40bPSWZHW4oQ==} + peerDependencies: + vitest: '>=0.29.0 <1' + dependencies: + c8: 7.14.0 + picocolors: 1.0.0 + std-env: 3.3.3 + vitest: 0.29.8 + dev: true + + /@vitest/expect@0.29.8: + resolution: {integrity: sha512-xlcVXn5I5oTq6NiZSY3ykyWixBxr5mG8HYtjvpgg6KaqHm0mvhX18xuwl5YGxIRNt/A5jidd7CWcNHrSvgaQqQ==} + dependencies: + '@vitest/spy': 0.29.8 + '@vitest/utils': 0.29.8 + chai: 4.3.7 + dev: true + + /@vitest/runner@0.29.8: + resolution: {integrity: sha512-FzdhnRDwEr/A3Oo1jtIk/B952BBvP32n1ObMEb23oEJNO+qO5cBet6M2XWIDQmA7BDKGKvmhUf2naXyp/2JEwQ==} + dependencies: + '@vitest/utils': 0.29.8 + p-limit: 4.0.0 + pathe: 1.1.1 + dev: true + + /@vitest/spy@0.29.8: + resolution: {integrity: sha512-VdjBe9w34vOMl5I5mYEzNX8inTxrZ+tYUVk9jxaZJmHFwmDFC/GV3KBFTA/JKswr3XHvZL+FE/yq5EVhb6pSAw==} + dependencies: + tinyspy: 1.1.1 + dev: true + + /@vitest/utils@0.29.8: + resolution: {integrity: sha512-qGzuf3vrTbnoY+RjjVVIBYfuWMjn3UMUqyQtdGNZ6ZIIyte7B37exj6LaVkrZiUTvzSadVvO/tJm8AEgbGCBPg==} + dependencies: + cli-truncate: 3.1.0 + diff: 5.1.0 + loupe: 2.3.6 + pretty-format: 27.5.1 + dev: true + + /abbrev@1.1.1: + resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} + dev: true + + /acorn-walk@8.2.0: + resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} + engines: {node: '>=0.4.0'} + dev: true + + /acorn@8.10.0: + resolution: {integrity: sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==} + engines: {node: '>=0.4.0'} + hasBin: true + dev: true + + /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 + dev: true + + /amqplib@0.10.3: + resolution: {integrity: sha512-UHmuSa7n8vVW/a5HGh2nFPqAEr8+cD4dEZ6u9GjP91nHfr1a54RyAKyra7Sb5NH7NBKOUlyQSMXIp0qAixKexw==} + engines: {node: '>=10'} + dependencies: + '@acuminous/bitsyntax': 0.1.2 + buffer-more-ints: 1.0.0 + readable-stream: 1.1.14 + url-parse: 1.5.10 + transitivePeerDependencies: + - supports-color + dev: false + + /ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + /ansi-regex@6.0.1: + resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} + engines: {node: '>=12'} + dev: true + + /ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + dependencies: + color-convert: 2.0.1 + + /ansi-styles@5.2.0: + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} + engines: {node: '>=10'} + dev: true + + /ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + dev: true + + /anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + dev: true + + /aproba@2.0.0: + resolution: {integrity: sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==} + dev: true + + /are-we-there-yet@2.0.0: + resolution: {integrity: sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==} + engines: {node: '>=10'} + dependencies: + delegates: 1.0.0 + readable-stream: 3.6.2 + dev: true + + /arg@4.1.3: + resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} + dev: true + + /array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + dev: true + + /assertion-error@1.1.0: + resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} + dev: true + + /at-least-node@1.0.0: + resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} + engines: {node: '>= 4.0.0'} + dev: true + + /balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + dev: true + + /base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + dev: true + + /binary-extensions@2.2.0: + resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} + engines: {node: '>=8'} + dev: true + + /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: true + + /brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + dev: true + + /braces@3.0.2: + resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + engines: {node: '>=8'} + dependencies: + fill-range: 7.0.1 + dev: true + + /buffer-more-ints@1.0.0: + resolution: {integrity: sha512-EMetuGFz5SLsT0QTnXzINh4Ksr+oo4i+UGTXEshiGCQWnsgSs7ZhJ8fzlwQ+OzEMs0MpDAMr1hxnblp5a4vcHg==} + dev: false + + /buffer@5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + dev: true + + /c8@7.14.0: + resolution: {integrity: sha512-i04rtkkcNcCf7zsQcSv/T9EbUn4RXQ6mropeMcjFOsQXQ0iGLAr/xT6TImQg4+U9hmNpN9XdvPkjUL1IzbgxJw==} + engines: {node: '>=10.12.0'} + hasBin: true + dependencies: + '@bcoe/v8-coverage': 0.2.3 + '@istanbuljs/schema': 0.1.3 + find-up: 5.0.0 + foreground-child: 2.0.0 + istanbul-lib-coverage: 3.2.0 + istanbul-lib-report: 3.0.0 + istanbul-reports: 3.1.5 + rimraf: 3.0.2 + test-exclude: 6.0.0 + v8-to-istanbul: 9.1.0 + yargs: 16.2.0 + yargs-parser: 20.2.9 + dev: true + + /cac@6.7.14: + resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} + engines: {node: '>=8'} + dev: true + + /chai@4.3.7: + resolution: {integrity: sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==} + engines: {node: '>=4'} + dependencies: + assertion-error: 1.1.0 + check-error: 1.0.2 + deep-eql: 4.1.3 + get-func-name: 2.0.0 + loupe: 2.3.6 + pathval: 1.1.1 + type-detect: 4.0.8 + dev: true + + /chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + dev: true + + /check-error@1.0.2: + resolution: {integrity: sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==} + dev: true + + /chokidar@3.5.3: + resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} + engines: {node: '>= 8.10.0'} + dependencies: + anymatch: 3.1.3 + braces: 3.0.2 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.2 + dev: true + + /chownr@1.1.4: + resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} + dev: true + + /chownr@2.0.0: + resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} + engines: {node: '>=10'} + dev: true + + /cli-truncate@3.1.0: + resolution: {integrity: sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + slice-ansi: 5.0.0 + string-width: 5.1.2 + dev: true + + /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 + + /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.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + /color-support@1.1.3: + resolution: {integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==} + hasBin: true + dev: true + + /concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + dev: true + + /console-control-strings@1.1.0: + resolution: {integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==} + dev: true + + /convert-source-map@1.9.0: + resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} + dev: true + + /core-util-is@1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + + /create-require@1.1.1: + resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} + dev: true + + /cross-spawn@7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + dev: true + + /debug@3.2.7(supports-color@5.5.0): + resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.3 + supports-color: 5.5.0 + dev: true + + /debug@4.3.4: + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.2 + + /decompress-response@6.0.0: + resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} + engines: {node: '>=10'} + dependencies: + mimic-response: 3.1.0 + dev: true + + /deep-eql@4.1.3: + resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==} + engines: {node: '>=6'} + dependencies: + type-detect: 4.0.8 + dev: true + + /deep-extend@0.6.0: + resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} + engines: {node: '>=4.0.0'} + dev: true + + /delegates@1.0.0: + resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==} + dev: true + + /detect-libc@2.0.1: + resolution: {integrity: sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==} + engines: {node: '>=8'} + dev: true + + /diff@4.0.2: + resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} + engines: {node: '>=0.3.1'} + dev: true + + /diff@5.1.0: + resolution: {integrity: sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==} + 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 + dev: true + + /dotenv@16.0.3: + resolution: {integrity: sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==} + engines: {node: '>=12'} + dev: false + + /eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + dev: true + + /emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + /emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + dev: true + + /end-of-stream@1.4.4: + resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + dependencies: + once: 1.4.0 + dev: true + + /esbuild@0.17.18: + resolution: {integrity: sha512-z1lix43jBs6UKjcZVKOw2xx69ffE2aG0PygLL5qJ9OS/gy0Ewd1gW/PUQIOIQGXBHWNywSc0floSKoMFF8aK2w==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/android-arm': 0.17.18 + '@esbuild/android-arm64': 0.17.18 + '@esbuild/android-x64': 0.17.18 + '@esbuild/darwin-arm64': 0.17.18 + '@esbuild/darwin-x64': 0.17.18 + '@esbuild/freebsd-arm64': 0.17.18 + '@esbuild/freebsd-x64': 0.17.18 + '@esbuild/linux-arm': 0.17.18 + '@esbuild/linux-arm64': 0.17.18 + '@esbuild/linux-ia32': 0.17.18 + '@esbuild/linux-loong64': 0.17.18 + '@esbuild/linux-mips64el': 0.17.18 + '@esbuild/linux-ppc64': 0.17.18 + '@esbuild/linux-riscv64': 0.17.18 + '@esbuild/linux-s390x': 0.17.18 + '@esbuild/linux-x64': 0.17.18 + '@esbuild/netbsd-x64': 0.17.18 + '@esbuild/openbsd-x64': 0.17.18 + '@esbuild/sunos-x64': 0.17.18 + '@esbuild/win32-arm64': 0.17.18 + '@esbuild/win32-ia32': 0.17.18 + '@esbuild/win32-x64': 0.17.18 + dev: true + + /esbuild@0.18.11: + resolution: {integrity: sha512-i8u6mQF0JKJUlGR3OdFLKldJQMMs8OqM9Cc3UCi9XXziJ9WERM5bfkHaEAy0YAvPRMgqSW55W7xYn84XtEFTtA==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/android-arm': 0.18.11 + '@esbuild/android-arm64': 0.18.11 + '@esbuild/android-x64': 0.18.11 + '@esbuild/darwin-arm64': 0.18.11 + '@esbuild/darwin-x64': 0.18.11 + '@esbuild/freebsd-arm64': 0.18.11 + '@esbuild/freebsd-x64': 0.18.11 + '@esbuild/linux-arm': 0.18.11 + '@esbuild/linux-arm64': 0.18.11 + '@esbuild/linux-ia32': 0.18.11 + '@esbuild/linux-loong64': 0.18.11 + '@esbuild/linux-mips64el': 0.18.11 + '@esbuild/linux-ppc64': 0.18.11 + '@esbuild/linux-riscv64': 0.18.11 + '@esbuild/linux-s390x': 0.18.11 + '@esbuild/linux-x64': 0.18.11 + '@esbuild/netbsd-x64': 0.18.11 + '@esbuild/openbsd-x64': 0.18.11 + '@esbuild/sunos-x64': 0.18.11 + '@esbuild/win32-arm64': 0.18.11 + '@esbuild/win32-ia32': 0.18.11 + '@esbuild/win32-x64': 0.18.11 + dev: true + + /escalade@3.1.1: + resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} + engines: {node: '>=6'} + + /expand-template@2.0.3: + resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} + engines: {node: '>=6'} + dev: true + + /fast-glob@3.3.0: + resolution: {integrity: sha512-ChDuvbOypPuNjO8yIDf36x7BlZX1smcUMTTcyoIjycexOxd6DFsKsg21qVBzEmr3G7fUKIRy2/psii+CIUt7FA==} + 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: true + + /fastq@1.15.0: + resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} + dependencies: + reusify: 1.0.4 + dev: true + + /fill-range@7.0.1: + resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} + engines: {node: '>=8'} + dependencies: + to-regex-range: 5.0.1 + dev: true + + /find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + dev: true + + /foreground-child@2.0.0: + resolution: {integrity: sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==} + engines: {node: '>=8.0.0'} + dependencies: + cross-spawn: 7.0.3 + signal-exit: 3.0.7 + dev: true + + /from2@2.3.0: + resolution: {integrity: sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==} + dependencies: + inherits: 2.0.4 + readable-stream: 2.3.8 + dev: true + + /fs-constants@1.0.0: + resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} + dev: true + + /fs-extra@9.1.0: + resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==} + engines: {node: '>=10'} + dependencies: + at-least-node: 1.0.0 + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.0 + dev: true + + /fs-minipass@2.1.0: + resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} + engines: {node: '>= 8'} + dependencies: + minipass: 3.3.6 + dev: true + + /fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + dev: true + + /fsevents@2.3.2: + resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /function-bind@1.1.1: + resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} + dev: true + + /gauge@3.0.2: + resolution: {integrity: sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==} + engines: {node: '>=10'} + dependencies: + aproba: 2.0.0 + color-support: 1.1.3 + console-control-strings: 1.1.0 + has-unicode: 2.0.1 + object-assign: 4.1.1 + signal-exit: 3.0.7 + string-width: 4.2.3 + strip-ansi: 6.0.1 + wide-align: 1.1.5 + dev: true + + /get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + + /get-func-name@2.0.0: + resolution: {integrity: sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==} + dev: true + + /github-from-package@0.0.0: + resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==} + dev: true + + /glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + dependencies: + is-glob: 4.0.3 + dev: true + + /glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + dev: true + + /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.0 + ignore: 5.2.4 + merge2: 1.4.1 + slash: 3.0.0 + dev: true + + /globrex@0.1.2: + resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} + dev: true + + /google-protobuf@3.21.2: + resolution: {integrity: sha512-3MSOYFO5U9mPGikIYCzK0SaThypfGgS6bHqrUGXG3DPHCrb+txNqeEcns1W0lkGfk0rCyNXm7xB9rMxnCiZOoA==} + dev: false + + /graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + dev: true + + /grpc-server-reflection@0.1.5: + resolution: {integrity: sha512-i69RYu6v65enzknNAPUgerFuVQfo+L3n9g4c1A/Sv5jUHMpxMIjSbBA+YWls9Sr4Flac4oohp4Gx8f389CaHuw==} + dependencies: + google-protobuf: 3.21.2 + dev: false + + /grpc-tools@1.12.4: + resolution: {integrity: sha512-5+mLAJJma3BjnW/KQp6JBjUMgvu7Mu3dBvBPd1dcbNIb+qiR0817zDpgPjS7gRb+l/8EVNIa3cB02xI9JLToKg==} + hasBin: true + requiresBuild: true + dependencies: + '@mapbox/node-pre-gyp': 1.0.10 + transitivePeerDependencies: + - encoding + - supports-color + dev: true + + /has-flag@3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + dev: true + + /has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + dev: true + + /has-unicode@2.0.1: + resolution: {integrity: sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==} + dev: true + + /has@1.0.3: + resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} + engines: {node: '>= 0.4.0'} + dependencies: + function-bind: 1.1.1 + dev: true + + /html-escaper@2.0.2: + resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} + dev: true + + /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 + dev: true + + /ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + dev: true + + /ignore-by-default@1.0.1: + resolution: {integrity: sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==} + dev: true + + /ignore@5.2.4: + resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} + engines: {node: '>= 4'} + dev: true + + /inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + dev: true + + /inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + /ini@1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + dev: true + + /into-stream@6.0.0: + resolution: {integrity: sha512-XHbaOAvP+uFKUFsOgoNPRjLkwB+I22JFPFe5OjTkQ0nwgj6+pSjb4NmB6VMxaPshLiOf+zcpOCBQuLwC1KHhZA==} + engines: {node: '>=10'} + dependencies: + from2: 2.3.0 + p-is-promise: 3.0.0 + dev: true + + /is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + dependencies: + binary-extensions: 2.2.0 + dev: true + + /is-core-module@2.12.1: + resolution: {integrity: sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==} + dependencies: + has: 1.0.3 + dev: true + + /is-core-module@2.9.0: + resolution: {integrity: sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==} + dependencies: + has: 1.0.3 + dev: true + + /is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + dev: true + + /is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + /is-fullwidth-code-point@4.0.0: + resolution: {integrity: sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==} + engines: {node: '>=12'} + dev: true + + /is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + dependencies: + is-extglob: 2.1.1 + dev: true + + /is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + dev: true + + /isarray@0.0.1: + resolution: {integrity: sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==} + dev: false + + /isarray@1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + dev: true + + /isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + dev: true + + /istanbul-lib-coverage@3.2.0: + resolution: {integrity: sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==} + engines: {node: '>=8'} + dev: true + + /istanbul-lib-report@3.0.0: + resolution: {integrity: sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==} + engines: {node: '>=8'} + dependencies: + istanbul-lib-coverage: 3.2.0 + make-dir: 3.1.0 + supports-color: 7.2.0 + dev: true + + /istanbul-reports@3.1.5: + resolution: {integrity: sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==} + engines: {node: '>=8'} + dependencies: + html-escaper: 2.0.2 + istanbul-lib-report: 3.0.0 + dev: true + + /jsesc@2.5.2: + resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} + engines: {node: '>=4'} + hasBin: true + dev: true + + /json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + dev: true + + /jsonc-parser@3.2.0: + resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} + dev: true + + /jsonfile@6.1.0: + resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + dependencies: + universalify: 2.0.0 + optionalDependencies: + graceful-fs: 4.2.11 + dev: true + + /local-pkg@0.4.3: + resolution: {integrity: sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==} + engines: {node: '>=14'} + dev: true + + /locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + dependencies: + p-locate: 5.0.0 + dev: true + + /lodash.camelcase@4.3.0: + resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} + dev: false + + /long@4.0.0: + resolution: {integrity: sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==} + dev: false + + /long@5.2.3: + resolution: {integrity: sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==} + dev: false + + /loupe@2.3.6: + resolution: {integrity: sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==} + dependencies: + get-func-name: 2.0.0 + dev: true + + /lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + dependencies: + yallist: 4.0.0 + dev: true + + /make-dir@3.1.0: + resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} + engines: {node: '>=8'} + dependencies: + semver: 6.3.0 + dev: true + + /make-error@1.3.6: + resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + dev: true + + /merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + dev: true + + /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: true + + /mimic-response@3.1.0: + resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} + engines: {node: '>=10'} + dev: true + + /minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + dependencies: + brace-expansion: 1.1.11 + dev: true + + /minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + dev: true + + /minipass@3.3.6: + resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} + engines: {node: '>=8'} + dependencies: + yallist: 4.0.0 + dev: true + + /minipass@5.0.0: + resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} + engines: {node: '>=8'} + dev: true + + /minizlib@2.1.2: + resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} + engines: {node: '>= 8'} + dependencies: + minipass: 3.3.6 + yallist: 4.0.0 + dev: true + + /mkdirp-classic@0.5.3: + resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} + dev: true + + /mkdirp@1.0.4: + resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} + engines: {node: '>=10'} + hasBin: true + dev: true + + /mlly@1.4.0: + resolution: {integrity: sha512-ua8PAThnTwpprIaU47EPeZ/bPUVp2QYBbWMphUQpVdBI3Lgqzm5KZQ45Agm3YJedHXaIHl6pBGabaLSUPPSptg==} + dependencies: + acorn: 8.10.0 + pathe: 1.1.1 + pkg-types: 1.0.3 + ufo: 1.1.2 + dev: true + + /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: true + + /multistream@4.1.0: + resolution: {integrity: sha512-J1XDiAmmNpRCBfIWJv+n0ymC4ABcf/Pl+5YvC5B/D2f/2+8PtHvCNxMPKiQcZyi922Hq69J2YOpb1pTywfifyw==} + dependencies: + once: 1.4.0 + readable-stream: 3.6.2 + dev: true + + /nanoid@3.3.6: + resolution: {integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + dev: true + + /napi-build-utils@1.0.2: + resolution: {integrity: sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==} + dev: true + + /node-abi@3.45.0: + resolution: {integrity: sha512-iwXuFrMAcFVi/ZoZiqq8BzAdsLw9kxDfTC0HMyjXfSL/6CSDAGD5UmR7azrAgWV1zKYq7dUUMj4owusBWKLsiQ==} + engines: {node: '>=10'} + dependencies: + semver: 7.5.3 + dev: true + + /node-fetch@2.6.12: + resolution: {integrity: sha512-C/fGU2E8ToujUivIO0H+tpQ6HWo4eEmchoPIoXtxCrVghxdKq+QOHqEZW7tuP3KlV3bC8FRMO5nMCC7Zm1VP6g==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + dependencies: + whatwg-url: 5.0.0 + dev: true + + /nodemon@2.0.22: + resolution: {integrity: sha512-B8YqaKMmyuCO7BowF1Z1/mkPqLk6cs/l63Ojtd6otKjMx47Dq1utxfRxcavH1I7VSaL8n5BUaoutadnsX3AAVQ==} + engines: {node: '>=8.10.0'} + hasBin: true + dependencies: + chokidar: 3.5.3 + debug: 3.2.7(supports-color@5.5.0) + ignore-by-default: 1.0.1 + minimatch: 3.1.2 + pstree.remy: 1.1.8 + semver: 5.7.1 + simple-update-notifier: 1.1.0 + supports-color: 5.5.0 + touch: 3.1.0 + undefsafe: 2.0.5 + dev: true + + /nopt@1.0.10: + resolution: {integrity: sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==} + hasBin: true + dependencies: + abbrev: 1.1.1 + dev: true + + /nopt@5.0.0: + resolution: {integrity: sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==} + engines: {node: '>=6'} + hasBin: true + dependencies: + abbrev: 1.1.1 + dev: true + + /normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + dev: true + + /npmlog@5.0.1: + resolution: {integrity: sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==} + dependencies: + are-we-there-yet: 2.0.0 + console-control-strings: 1.1.0 + gauge: 3.0.2 + set-blocking: 2.0.0 + dev: true + + /object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + dev: true + + /once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + dependencies: + wrappy: 1.0.2 + dev: true + + /p-is-promise@3.0.0: + resolution: {integrity: sha512-Wo8VsW4IRQSKVXsJCn7TomUaVtyfjVDn3nUP7kE967BQk0CwFpdbZs0X0uk5sW9mkBa9eNM7hCMaG93WUAwxYQ==} + engines: {node: '>=8'} + dev: true + + /p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + dependencies: + yocto-queue: 0.1.0 + dev: true + + /p-limit@4.0.0: + resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + yocto-queue: 1.0.0 + dev: true + + /p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + dependencies: + p-limit: 3.1.0 + dev: true + + /path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + dev: true + + /path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + dev: true + + /path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + dev: true + + /path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + dev: true + + /path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + dev: true + + /pathe@1.1.1: + resolution: {integrity: sha512-d+RQGp0MAYTIaDBIMmOfMwz3E+LOZnxx1HZd5R18mmCZY0QBlK0LDZfPc8FW8Ed2DlvsuE6PRjroDY+wg4+j/Q==} + dev: true + + /pathval@1.1.1: + resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} + dev: true + + /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'} + dev: true + + /pkg-fetch@3.4.2: + resolution: {integrity: sha512-0+uijmzYcnhC0hStDjm/cl2VYdrmVVBpe7Q8k9YBojxmR5tG8mvR9/nooQq3QSXiQqORDVOTY3XqMEqJVIzkHA==} + hasBin: true + dependencies: + chalk: 4.1.2 + fs-extra: 9.1.0 + https-proxy-agent: 5.0.1 + node-fetch: 2.6.12 + progress: 2.0.3 + semver: 7.5.3 + tar-fs: 2.1.1 + yargs: 16.2.0 + transitivePeerDependencies: + - encoding + - supports-color + dev: true + + /pkg-types@1.0.3: + resolution: {integrity: sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==} + dependencies: + jsonc-parser: 3.2.0 + mlly: 1.4.0 + pathe: 1.1.1 + dev: true + + /pkg@5.8.1: + resolution: {integrity: sha512-CjBWtFStCfIiT4Bde9QpJy0KeH19jCfwZRJqHFDFXfhUklCx8JoFmMj3wgnEYIwGmZVNkhsStPHEOnrtrQhEXA==} + hasBin: true + peerDependencies: + node-notifier: '>=9.0.1' + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@babel/generator': 7.18.2 + '@babel/parser': 7.18.4 + '@babel/types': 7.19.0 + chalk: 4.1.2 + fs-extra: 9.1.0 + globby: 11.1.0 + into-stream: 6.0.0 + is-core-module: 2.9.0 + minimist: 1.2.8 + multistream: 4.1.0 + pkg-fetch: 3.4.2 + prebuild-install: 7.1.1 + resolve: 1.22.2 + stream-meter: 1.0.4 + transitivePeerDependencies: + - encoding + - supports-color + dev: true + + /postcss@8.4.25: + resolution: {integrity: sha512-7taJ/8t2av0Z+sQEvNzCkpDynl0tX3uJMCODi6nT3PfASC7dYCWV9aQ+uiCf+KBD4SEFcu+GvJdGdwzQ6OSjCw==} + engines: {node: ^10 || ^12 || >=14} + dependencies: + nanoid: 3.3.6 + picocolors: 1.0.0 + source-map-js: 1.0.2 + dev: true + + /prebuild-install@7.1.1: + resolution: {integrity: sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==} + engines: {node: '>=10'} + hasBin: true + dependencies: + detect-libc: 2.0.1 + expand-template: 2.0.3 + github-from-package: 0.0.0 + minimist: 1.2.8 + mkdirp-classic: 0.5.3 + napi-build-utils: 1.0.2 + node-abi: 3.45.0 + pump: 3.0.0 + rc: 1.2.8 + simple-get: 4.0.1 + tar-fs: 2.1.1 + tunnel-agent: 0.6.0 + dev: true + + /pretty-format@27.5.1: + resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + ansi-regex: 5.0.1 + ansi-styles: 5.2.0 + react-is: 17.0.2 + dev: true + + /prisma@4.16.2: + resolution: {integrity: sha512-SYCsBvDf0/7XSJyf2cHTLjLeTLVXYfqp7pG5eEVafFLeT0u/hLFz/9W196nDRGUOo1JfPatAEb+uEnTQImQC1g==} + engines: {node: '>=14.17'} + hasBin: true + requiresBuild: true + dependencies: + '@prisma/engines': 4.16.2 + + /process-nextick-args@2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + dev: true + + /progress@2.0.3: + resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} + engines: {node: '>=0.4.0'} + dev: true + + /protobufjs@7.2.2: + resolution: {integrity: sha512-++PrQIjrom+bFDPpfmqXfAGSQs40116JRrqqyf53dymUMvvb5d/LMRyicRoF1AUKoXVS1/IgJXlEgcpr4gTF3Q==} + engines: {node: '>=12.0.0'} + requiresBuild: true + dependencies: + '@protobufjs/aspromise': 1.1.2 + '@protobufjs/base64': 1.1.2 + '@protobufjs/codegen': 2.0.4 + '@protobufjs/eventemitter': 1.1.0 + '@protobufjs/fetch': 1.1.0 + '@protobufjs/float': 1.0.2 + '@protobufjs/inquire': 1.1.0 + '@protobufjs/path': 1.1.2 + '@protobufjs/pool': 1.1.0 + '@protobufjs/utf8': 1.1.0 + '@types/node': 18.15.9 + long: 5.2.3 + dev: false + + /pstree.remy@1.1.8: + resolution: {integrity: sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==} + dev: true + + /pump@3.0.0: + resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} + dependencies: + end-of-stream: 1.4.4 + once: 1.4.0 + dev: true + + /querystringify@2.2.0: + resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} + dev: false + + /queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + dev: true + + /rc@1.2.8: + resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} + hasBin: true + dependencies: + deep-extend: 0.6.0 + ini: 1.3.8 + minimist: 1.2.8 + strip-json-comments: 2.0.1 + dev: true + + /react-is@17.0.2: + resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} + dev: true + + /readable-stream@1.1.14: + resolution: {integrity: sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==} + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 0.0.1 + string_decoder: 0.10.31 + dev: false + + /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: true + + /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: true + + /readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + dependencies: + picomatch: 2.3.1 + dev: true + + /require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + + /requires-port@1.0.0: + resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} + dev: false + + /resolve@1.22.2: + resolution: {integrity: sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==} + hasBin: true + dependencies: + is-core-module: 2.12.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + dev: true + + /reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + dev: true + + /rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + hasBin: true + dependencies: + glob: 7.2.3 + dev: true + + /rollup@3.26.2: + resolution: {integrity: sha512-6umBIGVz93er97pMgQO08LuH3m6PUb3jlDUUGFsNJB6VgTCUaDFpupf5JfU30529m/UKOgmiX+uY6Sx8cOYpLA==} + engines: {node: '>=14.18.0', npm: '>=8.0.0'} + hasBin: true + optionalDependencies: + fsevents: 2.3.2 + dev: true + + /run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + dependencies: + queue-microtask: 1.2.3 + dev: true + + /safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + + /safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + dev: true + + /semver@5.7.1: + resolution: {integrity: sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==} + hasBin: true + dev: true + + /semver@6.3.0: + resolution: {integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==} + hasBin: true + dev: true + + /semver@7.0.0: + resolution: {integrity: sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==} + hasBin: true + dev: true + + /semver@7.5.3: + resolution: {integrity: sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==} + engines: {node: '>=10'} + hasBin: true + dependencies: + lru-cache: 6.0.0 + dev: true + + /set-blocking@2.0.0: + resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} + dev: true + + /shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + dependencies: + shebang-regex: 3.0.0 + dev: true + + /shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + 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==} + dev: true + + /simple-concat@1.0.1: + resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} + dev: true + + /simple-get@4.0.1: + resolution: {integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==} + dependencies: + decompress-response: 6.0.0 + once: 1.4.0 + simple-concat: 1.0.1 + dev: true + + /simple-update-notifier@1.1.0: + resolution: {integrity: sha512-VpsrsJSUcJEseSbMHkrsrAVSdvVS5I96Qo1QAQ4FxQ9wXFcB+pjj7FB7/us9+GcgfW4ziHtYMc1J0PLczb55mg==} + engines: {node: '>=8.10.0'} + dependencies: + semver: 7.0.0 + dev: true + + /slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + dev: true + + /slice-ansi@5.0.0: + resolution: {integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==} + engines: {node: '>=12'} + dependencies: + ansi-styles: 6.2.1 + is-fullwidth-code-point: 4.0.0 + dev: true + + /source-map-js@1.0.2: + resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} + engines: {node: '>=0.10.0'} + dev: true + + /source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + dev: true + + /stackback@0.0.2: + resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + dev: true + + /std-env@3.3.3: + resolution: {integrity: sha512-Rz6yejtVyWnVjC1RFvNmYL10kgjC49EOghxWn0RFqlCHGFpQx+Xe7yW3I4ceK1SGrWIGMjD5Kbue8W/udkbMJg==} + dev: true + + /stream-meter@1.0.4: + resolution: {integrity: sha512-4sOEtrbgFotXwnEuzzsQBYEV1elAeFSO8rSGeTwabuX1RRn/kEq9JVH7I0MRBhKVRR0sJkr0M0QCH7yOLf9fhQ==} + dependencies: + readable-stream: 2.3.8 + 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 + dev: true + + /string_decoder@0.10.31: + resolution: {integrity: sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==} + dev: false + + /string_decoder@1.1.1: + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + dependencies: + safe-buffer: 5.1.2 + dev: true + + /string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + dependencies: + safe-buffer: 5.2.1 + dev: true + + /strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + dependencies: + ansi-regex: 5.0.1 + + /strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} + dependencies: + ansi-regex: 6.0.1 + dev: true + + /strip-bom@3.0.0: + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} + dev: true + + /strip-json-comments@2.0.1: + resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} + engines: {node: '>=0.10.0'} + dev: true + + /strip-literal@1.0.1: + resolution: {integrity: sha512-QZTsipNpa2Ppr6v1AmJHESqJ3Uz247MUS0OjrnnZjFAvEoWqxuyFuXn2xLgMtRnijJShAa1HL0gtJyUs7u7n3Q==} + dependencies: + acorn: 8.10.0 + dev: true + + /supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + dependencies: + has-flag: 3.0.0 + dev: true + + /supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + dependencies: + has-flag: 4.0.0 + dev: true + + /supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + dev: true + + /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: true + + /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: true + + /tar@6.1.15: + resolution: {integrity: sha512-/zKt9UyngnxIT/EAGYuxaMYgOIJiP81ab9ZfkILq4oNLPFX50qyYmu7jRj9qeXoxmJHjGlbH0+cm2uy1WCs10A==} + engines: {node: '>=10'} + dependencies: + chownr: 2.0.0 + fs-minipass: 2.1.0 + minipass: 5.0.0 + minizlib: 2.1.2 + mkdirp: 1.0.4 + yallist: 4.0.0 + dev: true + + /test-exclude@6.0.0: + resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} + engines: {node: '>=8'} + dependencies: + '@istanbuljs/schema': 0.1.3 + glob: 7.2.3 + minimatch: 3.1.2 + dev: true + + /tinybench@2.5.0: + resolution: {integrity: sha512-kRwSG8Zx4tjF9ZiyH4bhaebu+EDz1BOx9hOigYHlUW4xxI/wKIUQUqo018UlU4ar6ATPBsaMrdbKZ+tmPdohFA==} + dev: true + + /tinypool@0.4.0: + resolution: {integrity: sha512-2ksntHOKf893wSAH4z/+JbPpi92esw8Gn9N2deXX+B0EO92hexAVI9GIZZPx7P5aYo5KULfeOSt3kMOmSOy6uA==} + engines: {node: '>=14.0.0'} + dev: true + + /tinyspy@1.1.1: + resolution: {integrity: sha512-UVq5AXt/gQlti7oxoIg5oi/9r0WpF7DGEVwXgqWSMmyN16+e3tl5lIvTaOpJ3TAtu5xFzWccFRM4R5NaWHF+4g==} + engines: {node: '>=14.0.0'} + 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 + dev: true + + /touch@3.1.0: + resolution: {integrity: sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==} + hasBin: true + dependencies: + nopt: 1.0.10 + dev: true + + /tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + dev: true + + /ts-essentials@9.3.2(typescript@5.0.2): + resolution: {integrity: sha512-JxKJzuWqH1MmH4ZFHtJzGEhkfN3QvVR3C3w+4BIoWeoY68UVVoA2Np/Bca9z0IPSErVCWhv439aT0We4Dks8kQ==} + peerDependencies: + typescript: '>=4.1.0' + dependencies: + typescript: 5.0.2 + dev: true + + /ts-node@10.9.1(@types/node@18.15.9)(typescript@5.0.2): + 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.15.9 + 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.0.2 + v8-compile-cache-lib: 3.0.1 + yn: 3.1.1 + dev: true + + /tsconfck@2.1.1(typescript@5.0.2): + resolution: {integrity: sha512-ZPCkJBKASZBmBUNqGHmRhdhM8pJYDdOXp4nRgj/O0JwUwsMq50lCDRQP/M5GBNAA0elPrq4gAeu4dkaVCuKWww==} + engines: {node: ^14.13.1 || ^16 || >=18} + hasBin: true + peerDependencies: + typescript: ^4.3.5 || ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + dependencies: + typescript: 5.0.2 + 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 + + /tunnel-agent@0.6.0: + resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} + dependencies: + safe-buffer: 5.2.1 + dev: true + + /type-detect@4.0.8: + resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} + engines: {node: '>=4'} + dev: true + + /typescript@5.0.2: + resolution: {integrity: sha512-wVORMBGO/FAs/++blGNeAVdbNKtIh1rbBL2EyQ1+J9lClJ93KiiKe8PmFIVdXhHcyv44SL9oglmfeSsndo0jRw==} + engines: {node: '>=12.20'} + hasBin: true + dev: true + + /ufo@1.1.2: + resolution: {integrity: sha512-TrY6DsjTQQgyS3E3dBaOXf0TpPD8u9FVrVYmKVegJuFw51n/YB9XPt+U6ydzFG5ZIN7+DIjPbNmXoBj9esYhgQ==} + dev: true + + /undefsafe@2.0.5: + resolution: {integrity: sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==} + dev: true + + /universalify@2.0.0: + resolution: {integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==} + engines: {node: '>= 10.0.0'} + dev: true + + /url-parse@1.5.10: + resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} + dependencies: + querystringify: 2.2.0 + requires-port: 1.0.0 + dev: false + + /util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + dev: true + + /v8-compile-cache-lib@3.0.1: + resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} + dev: true + + /v8-to-istanbul@9.1.0: + resolution: {integrity: sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA==} + engines: {node: '>=10.12.0'} + dependencies: + '@jridgewell/trace-mapping': 0.3.18 + '@types/istanbul-lib-coverage': 2.0.4 + convert-source-map: 1.9.0 + dev: true + + /vite-node@0.29.8(@types/node@18.15.9): + resolution: {integrity: sha512-b6OtCXfk65L6SElVM20q5G546yu10/kNrhg08afEoWlFRJXFq9/6glsvSVY+aI6YeC1tu2TtAqI2jHEQmOmsFw==} + engines: {node: '>=v14.16.0'} + hasBin: true + dependencies: + cac: 6.7.14 + debug: 4.3.4 + mlly: 1.4.0 + pathe: 1.1.1 + picocolors: 1.0.0 + vite: 4.4.0(@types/node@18.15.9) + transitivePeerDependencies: + - '@types/node' + - less + - lightningcss + - sass + - stylus + - sugarss + - supports-color + - terser + dev: true + + /vite-tsconfig-paths@4.2.0(typescript@5.0.2): + resolution: {integrity: sha512-jGpus0eUy5qbbMVGiTxCL1iB9ZGN6Bd37VGLJU39kTDD6ZfULTTb1bcc5IeTWqWJKiWV5YihCaibeASPiGi8kw==} + peerDependencies: + vite: '*' + peerDependenciesMeta: + vite: + optional: true + dependencies: + debug: 4.3.4 + globrex: 0.1.2 + tsconfck: 2.1.1(typescript@5.0.2) + transitivePeerDependencies: + - supports-color + - typescript + dev: true + + /vite@4.4.0(@types/node@18.15.9): + resolution: {integrity: sha512-Wf+DCEjuM8aGavEYiF77hnbxEZ+0+/jC9nABR46sh5Xi+GYeSvkeEFRiVuI3x+tPjxgZeS91h1jTAQTPFgePpA==} + engines: {node: ^14.18.0 || >=16.0.0} + hasBin: true + peerDependencies: + '@types/node': '>= 14' + less: '*' + lightningcss: ^1.21.0 + sass: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + dependencies: + '@types/node': 18.15.9 + esbuild: 0.18.11 + postcss: 8.4.25 + rollup: 3.26.2 + optionalDependencies: + fsevents: 2.3.2 + dev: true + + /vitest-mock-extended@1.1.3(typescript@5.0.2)(vitest@0.29.8): + resolution: {integrity: sha512-MiaKYZbTg+fjozKnCpoTTva0BnlSNYyk4jiPuM2xVhg4aou112QIrALdH3/ZKK6qfXWh0A17gFIjWJjylOlXxg==} + peerDependencies: + typescript: 3.x || 4.x || 5.x + vitest: '>=0.29.2' + dependencies: + ts-essentials: 9.3.2(typescript@5.0.2) + typescript: 5.0.2 + vitest: 0.29.8 + dev: true + + /vitest@0.29.8: + resolution: {integrity: sha512-JIAVi2GK5cvA6awGpH0HvH/gEG9PZ0a/WoxdiV3PmqK+3CjQMf8c+J/Vhv4mdZ2nRyXFw66sAg6qz7VNkaHfDQ==} + engines: {node: '>=v14.16.0'} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@vitest/browser': '*' + '@vitest/ui': '*' + happy-dom: '*' + jsdom: '*' + playwright: '*' + safaridriver: '*' + webdriverio: '*' + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@vitest/browser': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true + playwright: + optional: true + safaridriver: + optional: true + webdriverio: + optional: true + dependencies: + '@types/chai': 4.3.5 + '@types/chai-subset': 1.3.3 + '@types/node': 18.15.9 + '@vitest/expect': 0.29.8 + '@vitest/runner': 0.29.8 + '@vitest/spy': 0.29.8 + '@vitest/utils': 0.29.8 + acorn: 8.10.0 + acorn-walk: 8.2.0 + cac: 6.7.14 + chai: 4.3.7 + debug: 4.3.4 + local-pkg: 0.4.3 + pathe: 1.1.1 + picocolors: 1.0.0 + source-map: 0.6.1 + std-env: 3.3.3 + strip-literal: 1.0.1 + tinybench: 2.5.0 + tinypool: 0.4.0 + tinyspy: 1.1.1 + vite: 4.4.0(@types/node@18.15.9) + vite-node: 0.29.8(@types/node@18.15.9) + why-is-node-running: 2.2.2 + transitivePeerDependencies: + - less + - lightningcss + - sass + - stylus + - sugarss + - supports-color + - terser + dev: true + + /webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + dev: true + + /whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + dev: true + + /which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + dependencies: + 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 + + /wide-align@1.1.5: + resolution: {integrity: sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==} + dependencies: + string-width: 4.2.3 + 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 + + /wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + dev: true + + /y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + + /yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + dev: true + + /yargs-parser@20.2.9: + resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} + engines: {node: '>=10'} + + /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 + + /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'} + dev: true + + /yocto-queue@1.0.0: + resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} + engines: {node: '>=12.20'} + dev: true diff --git a/services/stock/prisma/migrations/20230707065949_init/migration.sql b/services/stock/prisma/migrations/20230707065949_init/migration.sql new file mode 100644 index 00000000..f6812c52 --- /dev/null +++ b/services/stock/prisma/migrations/20230707065949_init/migration.sql @@ -0,0 +1,42 @@ +-- CreateTable +CREATE TABLE "Ingredient" ( + "id" SERIAL NOT NULL, + "name" TEXT NOT NULL, + "description" TEXT, + + CONSTRAINT "Ingredient_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "IngredientRestaurant" ( + "id" SERIAL NOT NULL, + "alert_threshold" INTEGER NOT NULL, + "quantity" INTEGER NOT NULL, + "in_product_list" TEXT[], + "unit_price" DOUBLE PRECISION NOT NULL, + "price_per_kilo" DOUBLE PRECISION NOT NULL, + "restaurant_id" TEXT NOT NULL, + "ingredient_id" INTEGER NOT NULL, + "supplier_id" INTEGER NOT NULL, + "updatedAt" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "IngredientRestaurant_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "Supplier" ( + "id" SERIAL NOT NULL, + "name" TEXT NOT NULL, + "contact" TEXT NOT NULL, + + CONSTRAINT "Supplier_pkey" PRIMARY KEY ("id") +); + +-- CreateIndex +CREATE UNIQUE INDEX "Ingredient_name_key" ON "Ingredient"("name"); + +-- AddForeignKey +ALTER TABLE "IngredientRestaurant" ADD CONSTRAINT "IngredientRestaurant_ingredient_id_fkey" FOREIGN KEY ("ingredient_id") REFERENCES "Ingredient"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "IngredientRestaurant" ADD CONSTRAINT "IngredientRestaurant_supplier_id_fkey" FOREIGN KEY ("supplier_id") REFERENCES "Supplier"("id") ON DELETE RESTRICT ON UPDATE CASCADE; diff --git a/services/stock/prisma/migrations/migration_lock.toml b/services/stock/prisma/migrations/migration_lock.toml new file mode 100644 index 00000000..fbffa92c --- /dev/null +++ b/services/stock/prisma/migrations/migration_lock.toml @@ -0,0 +1,3 @@ +# Please do not edit this file manually +# It should be added in your version-control system (i.e. Git) +provider = "postgresql" \ No newline at end of file diff --git a/services/stock/prisma/schema.prisma b/services/stock/prisma/schema.prisma new file mode 100644 index 00000000..029d24d5 --- /dev/null +++ b/services/stock/prisma/schema.prisma @@ -0,0 +1,47 @@ +datasource db { + provider = "postgresql" + url = env("DATABASE_URL") +} + +generator client { + provider = "prisma-client-js" + binaryTargets = ["native", "linux-musl", "linux-musl-openssl-3.0.x"] +} + +model Ingredient { + id Int @id @default(autoincrement()) + name String @unique + description String? + + // needed to link the ingredient to the restaurant + IngredientRestaurant IngredientRestaurant[] +} + +model IngredientRestaurant { + id Int @id @default(autoincrement()) + + alert_threshold Int + quantity Int + in_product_list String[] + + unit_price Float + price_per_kilo Float + + restaurant_id String + + ingredient Ingredient @relation(fields: [ingredient_id], references: [id]) + ingredient_id Int + + supplier Supplier @relation(fields: [supplier_id], references: [id]) + supplier_id Int + + updatedAt DateTime @updatedAt +} + +model Supplier { + id Int @id @default(autoincrement()) + name String + contact String + + ingredients IngredientRestaurant[] +} diff --git a/services/stock/prisma/seed.ts b/services/stock/prisma/seed.ts new file mode 100644 index 00000000..64ce3ba6 --- /dev/null +++ b/services/stock/prisma/seed.ts @@ -0,0 +1,31 @@ +import { PrismaClient, Prisma } from "@prisma/client"; + +const prisma = new PrismaClient(); + +const ingredients_restaurant: Prisma.IngredientRestaurantCreateInput[] = []; + +async function main() { + console.log(`Delete existing data ...`); + await prisma.ingredient.deleteMany(); + await prisma.ingredientRestaurant.deleteMany(); + await prisma.supplier.deleteMany(); + console.log(`Existing data deleted.`); + + console.log(`Start seeding ...`); + for (const i_r of ingredients_restaurant) { + const i_r_in_db = await prisma.ingredientRestaurant.create({ data: i_r }); + console.log(`Created ingredient_restaurant with id: ${i_r_in_db.id}`); + } + console.log(`Seeding finished.`); +} + +main() + .then(async () => { + await prisma.$disconnect(); + }) + .catch(async (e) => { + console.error(e); + await prisma.$disconnect(); + // @ts-ignore + process.exit(1); + }); diff --git a/services/stock/proto b/services/stock/proto new file mode 120000 index 00000000..5c8d3525 --- /dev/null +++ b/services/stock/proto @@ -0,0 +1 @@ +../proto \ No newline at end of file diff --git a/services/stock/src/handlers/.gitinclude b/services/stock/src/handlers/.gitinclude new file mode 100644 index 00000000..e69de29b diff --git a/services/stock/src/handlers/reporting/index.ts b/services/stock/src/handlers/reporting/index.ts new file mode 100644 index 00000000..1040f2ac --- /dev/null +++ b/services/stock/src/handlers/reporting/index.ts @@ -0,0 +1,5 @@ +import { UntypedServiceImplementation } from "@grpc/grpc-js"; + +const reportingHandlers: UntypedServiceImplementation = {}; + +export default reportingHandlers; diff --git a/services/stock/src/handlers/stock/index.ts b/services/stock/src/handlers/stock/index.ts new file mode 100644 index 00000000..6caa1715 --- /dev/null +++ b/services/stock/src/handlers/stock/index.ts @@ -0,0 +1,5 @@ +import { UntypedServiceImplementation } from "@grpc/grpc-js"; + +const stockHandlers: UntypedServiceImplementation = {}; + +export default stockHandlers; diff --git a/services/stock/src/handlers/stock/ingredient/get.ts b/services/stock/src/handlers/stock/ingredient/get.ts new file mode 100644 index 00000000..e69de29b diff --git a/services/stock/src/lib/amqp.ts b/services/stock/src/lib/amqp.ts new file mode 100644 index 00000000..6342f384 --- /dev/null +++ b/services/stock/src/lib/amqp.ts @@ -0,0 +1,32 @@ +import amqp from "amqplib"; +import { msg } from "@stock/middleware/log"; +import { log } from "@stock/lib/log"; + +const DEFAULT_QUEUE = "log"; + +async function connectQueue(queue = DEFAULT_QUEUE) { + try { + const connection = await amqp.connect(process.env.AMQP_URL || ""); + const channel = await connection.createChannel(); + await channel.assertExchange(queue, "fanout", { durable: true }); + return channel; + } catch (error) { + return error as Error; + } +} + +const toLog = (message: any) => { + const { request, path } = message; + return { event_message: path, metadata: { request } }; +}; + +export const publish = async (message: any, queue = DEFAULT_QUEUE) => { + const channel = await connectQueue(queue); + if (channel instanceof Error) + return console.log("Error to connect to queue: ", channel); + channel.sendToQueue(queue, Buffer.from(JSON.stringify(toLog(message)))); + log.debug( + msg("AMQP", `${queue} (queue)`, new Date(), new Date()), + JSON.stringify(message) + ); +}; diff --git a/services/stock/src/lib/date.ts b/services/stock/src/lib/date.ts new file mode 100644 index 00000000..b3bd3026 --- /dev/null +++ b/services/stock/src/lib/date.ts @@ -0,0 +1,28 @@ +import { Interval } from "@stock/types"; + +const HOUR_IN_MS = 60 * 60 * 1000; +const DAY_IN_MS = 24 * HOUR_IN_MS; + +export const fromInterval = ( + interval: Interval, + date?: string +): { + start: Date; + end: Date; +} => { + const end = date + ? new Date(date + " 23:59:59") + : new Date(new Date().setHours(23, 59, 59, 999)); + + const start = // end - interval + interval === "1w" + ? new Date(end.getTime() - 7 * DAY_IN_MS) + : interval === "1m" + ? new Date(end.getTime() - 30 * DAY_IN_MS) + : interval === "1y" + ? new Date(end.getTime() - 365 * DAY_IN_MS) + : // default to 1w + new Date(end.getTime() - 7 * DAY_IN_MS); + + return { start, end }; +}; diff --git a/services/stock/src/lib/log.ts b/services/stock/src/lib/log.ts new file mode 100644 index 00000000..2404af54 --- /dev/null +++ b/services/stock/src/lib/log.ts @@ -0,0 +1,74 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ +/* eslint-disable no-console */ + +function getStackTrace() { + let stack; + + try { + throw new Error(""); + } catch (error) { + stack = (error as Error).stack || ""; + } + + stack = stack.split("\n").map((line) => line.trim()); + return stack.splice(stack[0] === "Error" ? 2 : 1); +} + +const getInitiator = () => { + // _getInitiatorLine, _ObjectInfoLine, caller + const [, , caller] = getStackTrace(); + const file = caller.split("/").at(-1) || ""; + return file.replace(")", ""); +}; + +const warn = (...args: any[]) => { + console.group( + `\x1b[33m${new Date().toISOString()} - WARN - ${getInitiator()}\x1b[0m` + ); + console.warn(...args); + console.groupEnd(); +}; +const error = (...args: any[]) => { + console.group( + `\x1b[31m${new Date().toISOString()} - ERROR - ${getInitiator()}\x1b[0m` + ); + console.error(...args); + console.groupEnd(); +}; +const info = (...args: any[]) => { + console.group( + `\x1b[34m${new Date().toISOString()} - INFO - ${getInitiator()}\x1b[0m` + ); + console.log(...args); + console.groupEnd(); +}; +const debug = (...args: any[]) => { + console.log(...args); +}; + +/** + * @description a simple interface logger for logging to the console and into a log drain in the future + * @example + * log.warn('this is a warning'); + * log.error('this is an error'); + * log.info('this is an info'); + * @exports log + */ +export const log = { + warn, + error, + info, + debug, +}; + +export const utils = { + bold: (text: string) => `\x1b[1m${text}\x1b[0m`, + red: (text: string) => `\x1b[31m${text}\x1b[0m`, + green: (text: string) => `\x1b[32m${text}\x1b[0m`, + yellow: (text: string) => `\x1b[33m${text}\x1b[0m`, + blue: (text: string) => `\x1b[34m${text}\x1b[0m`, + magenta: (text: string) => `\x1b[35m${text}\x1b[0m`, + cyan: (text: string) => `\x1b[36m${text}\x1b[0m`, + white: (text: string) => `\x1b[37m${text}\x1b[0m`, + gray: (text: string) => `\x1b[90m${text}\x1b[0m`, +}; diff --git a/services/stock/src/lib/prisma.ts b/services/stock/src/lib/prisma.ts new file mode 100644 index 00000000..4d495ef0 --- /dev/null +++ b/services/stock/src/lib/prisma.ts @@ -0,0 +1,29 @@ +import { Prisma, PrismaClient } from "@prisma/client"; + +let prisma: PrismaClient; +type GlobalWithPrisma = typeof globalThis & { + prisma: PrismaClient; +}; + +const OPTIONS: Prisma.PrismaClientOptions = { + log: + process.env.NEXT_PUBLIC_APP_ENV !== "production" + ? ["info", "warn"] + : undefined, +}; + +if (process.env.NODE_ENV === "production") { + prisma = new PrismaClient(OPTIONS); +} else { + // Ensure the prisma instance is re-used during hot-reloading + // Otherwise, a new client will be created on every reload + if (!("prisma" in global)) { + (global as GlobalWithPrisma).prisma = new PrismaClient(OPTIONS); + } + + prisma = (global as GlobalWithPrisma).prisma; +} + +export default prisma; + +export { prisma }; diff --git a/services/stock/src/lib/proxy.ts b/services/stock/src/lib/proxy.ts new file mode 100644 index 00000000..becdaabb --- /dev/null +++ b/services/stock/src/lib/proxy.ts @@ -0,0 +1,132 @@ +import { Server, status } from "@grpc/grpc-js"; + +const getType = (method: { + requestStream: boolean; + responseStream: boolean; +}) => { + if (method.requestStream === false && method.responseStream === false) { + return "unary"; + } + return "unknown"; +}; + + +const lookupServiceMetadata = (service: { [x: string]: any }) => { + const serviceKeys = Object.keys(service); + const intersectingMethods = serviceKeys.reduce((acc, k) => { + const method = service[k]; + if (!method) { + throw new Error(`cannot find method ${k} on service`); + } + const components = method.path.split("/"); + acc[k] = { + name: components[1], + method: components[2], + type: getType(method), + path: method.path, + responseType: method.responseType, + requestType: method.requestType, + }; + return acc; + }, {} as any); + + return (key: string) => intersectingMethods[key]; +}; + +export const handler = { + get( + target: { + [x: string]: any; + intercept: () => any; + addService: (arg0: any, arg1: {}) => any; + }, + propKey: string + ) { + if (propKey !== "addService") { + return target[propKey]; + } + return (service: any, implementation: { [x: string]: any }) => { + const newImplementation = {} as any; + const lookup = lookupServiceMetadata(service); + for (const k in implementation) { + const name = k; + const fn = implementation[k]; + newImplementation[name] = (call: any, callback: any) => { + const ctx = { + call, + name, + service: lookup(name), + status: { + code: status.UNKNOWN, + details: "", + }, + }; + const newCallback = (callback: (arg0: any) => void) => { + return (...args: any[]) => { + ctx.status = { + code: status.OK, + details: "", + }; + const err = args[0]; + if (err) { + ctx.status = { + code: status.UNKNOWN, + details: err, + }; + } + // @ts-ignore + callback(...args); + }; + }; + + const interceptors = target.intercept(); + const first = interceptors.next(); + if (!first.value) { + // if we don't have any interceptors + return new Promise((resolve) => { + return resolve(fn(call, newCallback(callback))); + }); + } + first.value(ctx, function next() { + return new Promise((resolve) => { + const i = interceptors.next(); + if (i.done) { + return resolve(fn(call, newCallback(callback))); + } + return resolve(i.value(ctx, next)); + }); + }); + }; + } + return target.addService(service, newImplementation); + }; + }, +}; + +export const createServerProxy = ( + server: Server +): Server & { + intercept: Generator; + interceptors: any[]; + use: (fn: any) => void; +} => { + // @ts-ignore + server.interceptors = []; + // @ts-ignore + server.use = (fn: any) => { + // @ts-ignore + server.interceptors.push(fn); + }; + // @ts-ignore + server.intercept = function* intercept() { + let i = 0; + // @ts-ignore + while (i < server.interceptors.length) { + // @ts-ignore + yield server.interceptors[i]; + i++; + } + }; + // @ts-ignore + return new Proxy(server, handler); +}; diff --git a/services/stock/src/lib/reflection.ts b/services/stock/src/lib/reflection.ts new file mode 100644 index 00000000..bdb1d1dd --- /dev/null +++ b/services/stock/src/lib/reflection.ts @@ -0,0 +1,23 @@ +import { Server } from "@grpc/grpc-js"; +import { log } from "@stock/lib/log"; +import { access, constants } from "fs"; +import { addReflection as base_addReflection } from "grpc-server-reflection"; +import { resolve as resolvePath } from "path"; + +export const addReflection = (server: Server, path: string) => { + if (process.env.NODE_ENV === "production") { + log.warn("Reflection is disabled in production"); + return; + } + + const resolvedPath = resolvePath(path); + try { + access(resolvedPath, constants.R_OK, () => {}); + + base_addReflection(server, path); + } catch (err) { + console.log("here"); + log.warn(`Reflection file ${resolvedPath} is not readable`); + return; + } +}; diff --git a/services/stock/src/lib/struct.ts b/services/stock/src/lib/struct.ts new file mode 100644 index 00000000..b1b7f50e --- /dev/null +++ b/services/stock/src/lib/struct.ts @@ -0,0 +1,53 @@ +import { Prisma } from "@prisma/client"; + +export type Struct = { + fields: { + [key: string]: { + kind: string; + [key: string]: any; + }; + }; +}; + +export const parseStruct = (struct: Struct) => { + if (!struct) return null; + const fields = struct.fields; + + if (!fields || Object.keys(fields).length === 0) return null; + + const parsed = Object.entries(fields).reduce((acc: any, [key, value]) => { + return { + ...acc, + [key]: value[value.kind], + }; + }, {}); + + return parsed; +}; + +export const toStruct = ( + obj: { [key: string]: any } | Prisma.JsonValue | null +): Struct => { + if (!obj) return { fields: {} }; + const fields = Object.entries(obj).reduce((acc: any, [key, value]) => { + if (typeof value === "object") { + return { + ...acc, + [key]: { + kind: "structValue", + structValue: toStruct(value), + }, + }; + } + + return { + ...acc, + [key]: { + kind: `${typeof value}Value`, + [`${typeof value}Value`]: value, + }, + }; + }, {}); + + return { fields }; +}; diff --git a/services/stock/src/lib/transformer.ts b/services/stock/src/lib/transformer.ts new file mode 100644 index 00000000..55ae54af --- /dev/null +++ b/services/stock/src/lib/transformer.ts @@ -0,0 +1,5 @@ +import { toStruct } from "@stock/lib/struct"; + +export const toGrpc = (stock: any) => { + throw new Error("Not implemented"); +}; diff --git a/services/stock/src/middleware/log.ts b/services/stock/src/middleware/log.ts new file mode 100644 index 00000000..521e467c --- /dev/null +++ b/services/stock/src/middleware/log.ts @@ -0,0 +1,42 @@ +import { publish } from "@stock/lib/amqp"; +import { utils } from "@stock/lib/log"; +import { log } from "@stock/lib/log"; + +type Context = { + call: { + request: Map; + }; + service: { + path: string; + }; +}; + +const parseContext = (ctx: Context) => { + const { + call: { request }, + service: { path }, + } = ctx; + return { request, path }; +}; + +export const msg = ( + type: "GRPC" | "AMQP", + path: string | undefined, + requestAt: Date, + responseAt: Date +) => + `${utils.magenta(requestAt.toISOString())} | ${utils[ + type === "GRPC" ? "cyan" : "red" + ](type)}${path ? ` | ${utils.yellow(path)}` : ""} | ${utils.green( + responseAt.getTime() - requestAt.getTime() + "ms" + )} |`; + +export const logGRPC = async (ctx: Context, next: () => Promise) => { + const requestAt = new Date(); + await next(); + const responseAt = new Date(); + let { request, path } = parseContext(ctx); + path = path?.split(".").at(-1) || ""; + publish({ request, path }, "log"); + log.debug(msg("GRPC", path, requestAt, responseAt), JSON.stringify(request)); +}; diff --git a/services/stock/src/resources/grpc-credentials.ts b/services/stock/src/resources/grpc-credentials.ts new file mode 100644 index 00000000..75a2b5d5 --- /dev/null +++ b/services/stock/src/resources/grpc-credentials.ts @@ -0,0 +1,5 @@ +import { credentials, ServerCredentials } from "@grpc/grpc-js"; + +export const insecure = credentials.createInsecure(); + +export const serverInsecure = ServerCredentials.createInsecure(); diff --git a/services/stock/src/resources/protoloader-options.ts b/services/stock/src/resources/protoloader-options.ts new file mode 100644 index 00000000..5022d96d --- /dev/null +++ b/services/stock/src/resources/protoloader-options.ts @@ -0,0 +1,7 @@ +export const options = { + keepCase: true, + longs: String, + enums: String, + defaults: true, + oneofs: true, +}; diff --git a/services/stock/src/server.ts b/services/stock/src/server.ts new file mode 100644 index 00000000..61d51fd9 --- /dev/null +++ b/services/stock/src/server.ts @@ -0,0 +1,47 @@ +import "dotenv/config"; +import { resolve as resolvePath } from "path"; + +import { loadSync } from "@grpc/proto-loader"; +import { loadPackageDefinition, Server } from "@grpc/grpc-js"; + +import { log, utils } from "@stock/lib/log"; +import { options } from "@stock/resources/protoloader-options"; +import { serverInsecure } from "@stock/resources/grpc-credentials"; +import { addReflection } from "@stock/lib/reflection"; +import { createServerProxy } from "@stock/lib/proxy"; +import { logGRPC } from "@stock/middleware/log"; + +import stockHandlers from "@stock/handlers/stock"; +import reportingHandlers from "@stock/handlers/reporting"; + +const PORT = process.env.PORT || 50009; +const ADDRESS = `0.0.0.0:${PORT}`; + +const PROTO_PATH = resolvePath(__dirname + "/../../proto/stock.proto"); +const REFLECTION_PATH = resolvePath( + __dirname + "/../reflection_descriptor.bin" +); + +const packageDefinition = loadSync(PROTO_PATH, options); +const grpc = loadPackageDefinition(packageDefinition) as any; +const { service: s_srv } = grpc.com.goodfood.stock.StockService; +const { service: r_srv } = grpc.com.goodfood.stock.StockReportingService; + +// const server = new Server(); + +const server = createServerProxy(new Server()); +server.addService(s_srv, stockHandlers); +server.addService(r_srv, reportingHandlers); +server.use(logGRPC); + +server.bindAsync(ADDRESS, serverInsecure, () => { + server.start(); + addReflection(server, REFLECTION_PATH); + const message = + `---- ${utils.green("good")}${utils.yellow("food")} Stock Service ----` + + `\n` + + `started on: ${utils.bold(ADDRESS)} ${utils.green("✓")}\n`; + log.debug(message); +}); + +export default server; diff --git a/services/stock/src/tests/date.test.ts b/services/stock/src/tests/date.test.ts new file mode 100644 index 00000000..b5bc7ec8 --- /dev/null +++ b/services/stock/src/tests/date.test.ts @@ -0,0 +1,77 @@ +import { fromInterval } from "@stock/lib/date"; +import { Interval } from "@stock/types"; +import { assert, describe, it, vitest } from "vitest"; + +const HOUR_IN_MS = 60 * 60 * 1000; +const DAY_IN_MS = 24 * HOUR_IN_MS; + +// fake current date + +describe("tests@goodfood/stock.date.fromInterval", function () { + it('should return start and end dates for interval "1w"', (t) => { + const interval = "1w"; + const date = "2023-07-01"; + const expected = { + start: new Date("2023-06-24 23:59:59"), + end: new Date("2023-07-01 23:59:59"), + }; + const result = fromInterval(interval, date); + assert.deepEqual(result, expected); + }); + + it('should return start and end dates for interval "1m"', (t) => { + const interval = "1m"; + const date = "2023-07-01"; + const expected = { + start: new Date("2023-06-01 23:59:59"), + end: new Date("2023-07-01 23:59:59"), + }; + const result = fromInterval(interval, date); + assert.deepEqual(result, expected); + }); + + it('should return start and end dates for interval "1y"', (t) => { + const interval = "1y"; + const date = "2023-07-01"; + const expected = { + start: new Date("2022-07-01 23:59:59"), + end: new Date("2023-07-01 23:59:59"), + }; + const result = fromInterval(interval, date); + assert.deepEqual(result, expected); + }); + + it('should return start and end dates with default interval "1w"', (t) => { + const interval = "invalid-interval"; + const date = "2023-07-01"; + const expected = { + start: new Date("2023-06-24 23:59:59"), + end: new Date("2023-07-01 23:59:59"), + }; + const result = fromInterval(interval as Interval, date); + assert.deepEqual(result, expected); + }); + + it("should return current date as end date when no date parameter is provided", (t) => { + const interval = "1w"; + const expectedEnd = new Date(); + expectedEnd.setHours(23, 59, 59, 999); + + const result = fromInterval(interval, undefined); + assert.deepEqual(result.end, expectedEnd); + }); + + it("should return start date based on the current date when no date parameter is provided", (t) => { + const interval = "1w"; + const date = new Date("2023-07-01 13:37"); + vitest.setSystemTime(date); + + const currentDate = new Date(); + const expectedStart = new Date( + new Date(currentDate.getTime() - 7 * DAY_IN_MS).setHours(23, 59, 59, 999) + ); + + const result = fromInterval(interval, undefined); + assert.deepEqual(result.start, expectedStart); + }); +}); diff --git a/services/stock/src/tests/struct.test.ts b/services/stock/src/tests/struct.test.ts new file mode 100644 index 00000000..5a86114b --- /dev/null +++ b/services/stock/src/tests/struct.test.ts @@ -0,0 +1,64 @@ +import { Struct, parseStruct, toStruct } from "@stock/lib/struct"; +import { assert, describe, it } from "vitest"; + +describe("tests@goodfood/stock.struct.parseStruct", function () { + it("tests @goodfood/stock.struct.parseStruct in expected situation", () => { + const _struct = { + fields: { + id: { + kind: "stringValue", + stringValue: "1", + }, + name: { + kind: "numberValue", + numberValue: "2", + }, + }, + }; + const parsed = parseStruct(_struct); + assert.equal(parsed.id, "1"); + assert.equal(parsed.name, "2"); + }); + + it("tests @goodfood/stock.struct.parseStruct with empty struct", () => { + const _struct = { + fields: {}, + }; + const parsed = parseStruct(_struct); + assert.equal(parsed, null); + }); + + it("tests @goodfood/stock.struct.parseStruct with null struct", () => { + const _struct = null; + const parsed = parseStruct(_struct as unknown as Struct); + assert.equal(parsed, null); + }); +}); + +describe("tests@goodfood/stock.struct.toStruct", function () { + it("tests @goodfood/stock.struct.toStruct in expected situation", () => { + const _struct = { + id: 1, + name: "2", + }; + const parsed = toStruct(_struct); + assert.equal(parsed.fields.id.kind, "numberValue"); + assert.equal(parsed.fields.id.numberValue, 1); + assert.equal(parsed.fields.name.kind, "stringValue"); + assert.equal(parsed.fields.name.stringValue, "2"); + + assert.equal(Object.keys(parsed.fields).length, 2); + }); + + it("tests @goodfood/stock.struct.toStruct with empty struct", () => { + const _struct = {}; + const parsed = toStruct(_struct); + assert.equal(Object.keys(parsed.fields).length, 0); + }); + + it("tests @goodfood/stock.struct.toStruct with null struct", () => { + const _struct = null; + const parsed = toStruct(_struct as unknown as Struct); + assert.equal(Object.keys(parsed.fields).length, 0); + }) +}); diff --git a/services/stock/src/tests/transformer.test.ts b/services/stock/src/tests/transformer.test.ts new file mode 100644 index 00000000..831c39eb --- /dev/null +++ b/services/stock/src/tests/transformer.test.ts @@ -0,0 +1,11 @@ +import { toStruct } from "@stock/lib/struct"; +import { toGrpc } from "@stock/lib/transformer"; + +import { assert, describe, it } from "vitest"; + +describe("tests@goodfood/stock.transformer.toGrpc", function () { + it("tests @goodfood/stock.transformer.toGrpc in expected situation", () => { + // todo: add test + assert(true); + }); +}); diff --git a/services/stock/src/types/index.d.ts b/services/stock/src/types/index.d.ts new file mode 100644 index 00000000..51abc373 --- /dev/null +++ b/services/stock/src/types/index.d.ts @@ -0,0 +1,5 @@ +export type Data = { + request: T; +}; + +export type Interval = "1w" | "1m" | "1y"; \ No newline at end of file diff --git a/services/stock/src/types/stock.d.ts b/services/stock/src/types/stock.d.ts new file mode 100644 index 00000000..2ee89fc0 --- /dev/null +++ b/services/stock/src/types/stock.d.ts @@ -0,0 +1,131 @@ +export type Ingredient = { + id: number; + name: string; + description?: string; +}; + +export type IngredientRestaurant = { + id: number; + + alert_threshold: number; + quantity: number; + in_product_list: string[]; + + unit_price: number; + price_per_kilo: number; + + restaurant_id: string; + + ingredient_id: number; + ingredient: Ingredient; + + supplier_id: number; + supplier: Supplier; + + updated_at: string | Date; +}; + +export type Supplier = { + id: number; + name: string; + contact: string; +}; + +export type GetIngredientRequest = { + id: number; +}; + +export type GetIngredientsResponse = { + ingredients: Ingredient[]; +}; + +export type CreateIngredientRequest = { + name: string; +}; + +export type UpdateIngredientRequest = { + id: number; + name: string; +}; + +export type DeleteIngredientRequest = { + id: number; +}; + +export type DeleteIngredientResponse = { + success: boolean; +}; + +export type GetSupplierRequest = { + id: number; +}; + +export type GetSuppliersResponse = { + suppliers: Supplier[]; +}; + +export type CreateSupplierRequest = { + name: string; + contact: string; +}; + +export type UpdateSupplierRequest = { + id: number; + name: string; + contact: string; +}; + +export type DeleteSupplierRequest = { + id: number; +}; + +export type DeleteSupplierResponse = { + success: boolean; +}; + +export type GetIngredientRestaurantRequest = { + id: number; +}; + +export type GetIngredientRestaurantsByRestaurantRequest = { + restaurant_id: string; +}; + +export type GetIngredientRestaurantsByRestaurantResponse = { + ingredient_restaurants: IngredientRestaurant[]; +}; + +export type CreateIngredientRestaurantRequest = { + alert_threshold: number; + quantity: number; + in_product_list: string[]; + + unit_price: number; + price_per_kilo: number; + + restaurant_id: string; + ingredient_id: number; + supplier_id: number; +}; + +export type UpdateIngredientRestaurantRequest = { + id: number; + alert_threshold: number; + quantity: number; + in_product_list: string[]; + + unit_price: number; + price_per_kilo: number; + + restaurant_id: string; + ingredient_id: number; + supplier_id: number; +}; + +export type DeleteIngredientRestaurantRequest = { + id: number; +}; + +export type DeleteIngredientRestaurantResponse = { + success: boolean; +}; diff --git a/services/stock/tsconfig.json b/services/stock/tsconfig.json new file mode 100644 index 00000000..243f0e3f --- /dev/null +++ b/services/stock/tsconfig.json @@ -0,0 +1,18 @@ +{ + "compilerOptions": { + "sourceMap": true, + "outDir": "dist", + "strict": true, + "lib": ["esnext"], + "esModuleInterop": true, + "baseUrl": ".", + "paths": { + "@stock/*": ["src/*"] + } + }, + "include": ["src/**/*.ts"], + "exclude": ["node_modules"], + "ts-node": { + "require": ["tsconfig-paths/register"] + } +} diff --git a/services/stock/vitest.config.ts b/services/stock/vitest.config.ts new file mode 100644 index 00000000..773de309 --- /dev/null +++ b/services/stock/vitest.config.ts @@ -0,0 +1,10 @@ +import { defineConfig } from "vitest/config"; +import tsconfigPaths from "vite-tsconfig-paths"; + +export default defineConfig({ + plugins: [tsconfigPaths()], + base: "/src/tests", + // test: { + // setupFiles: ["./src/tests/setup.ts"], + // }, +}); From 141b694e07abff21d3a953501189b5be0f6b8128 Mon Sep 17 00:00:00 2001 From: anatole Date: Fri, 7 Jul 2023 11:27:36 +0200 Subject: [PATCH 209/883] feat(user service): fix update user route --- services/user/src/pkg/mapper/userMapper.go | 25 ++++++------------- services/user/src/pkg/services/auth.go | 5 +++- services/user/src/pkg/services/mainAddress.go | 4 +-- services/user/src/pkg/services/user.go | 4 +-- services/user/src/pkg/utils/jwt.go | 2 +- 5 files changed, 17 insertions(+), 23 deletions(-) diff --git a/services/user/src/pkg/mapper/userMapper.go b/services/user/src/pkg/mapper/userMapper.go index ab7ae3ad..8e5a7561 100644 --- a/services/user/src/pkg/mapper/userMapper.go +++ b/services/user/src/pkg/mapper/userMapper.go @@ -48,15 +48,14 @@ func ToProtoRole(role models.Role) *pb.Role { } } -func ToModelUser(user *pb.User) *models.User { +func UpdateInputToModelUser(user *pb.User) *models.User { return &models.User{ - Id: user.Id, - FirstName: user.FirstName, - LastName: user.LastName, - Email: user.Email, - Phone: user.Phone, - MainAddress: *ToModelMainAddress(user.MainAddress), - Role: *ToModelRole(user.Role), + Id: user.Id, + FirstName: user.FirstName, + LastName: user.LastName, + Email: user.Email, + Phone: user.Phone, + RoleId: user.RoleId, } } @@ -80,7 +79,7 @@ func InputToModelMainAddress(address *pb.MainAddressInput) *models.MainAddress { } } -func ToModelMainAddress(address *pb.MainAddress) *models.MainAddress { +func UpdateInputToModelMainAddress(address *pb.MainAddress) *models.MainAddress { return &models.MainAddress{ Id: address.Id, Street: address.Street, @@ -90,11 +89,3 @@ func ToModelMainAddress(address *pb.MainAddress) *models.MainAddress { Lng: address.Lng, } } - -func ToModelRole(role *pb.Role) *models.Role { - return &models.Role{ - Id: role.Id, - Label: role.Label, - Code: role.Code, - } -} diff --git a/services/user/src/pkg/services/auth.go b/services/user/src/pkg/services/auth.go index d561fc60..ca530617 100644 --- a/services/user/src/pkg/services/auth.go +++ b/services/user/src/pkg/services/auth.go @@ -18,11 +18,14 @@ type Server struct { func (s *Server) Register(_ context.Context, req *pb.UserCreateInput) (*pb.UserOutput, error) { var role models.Role - if result := s.H.DB.Where(&models.User{Email: req.Email}).First(models.User{}); result.RowsAffected > 0 { + result := s.H.DB.Where(&models.User{Email: req.Email}).First(&models.User{}) + + if result.RowsAffected > 0 { return &pb.UserOutput{ Error: "User already exists", }, nil } + s.H.DB.Where(&models.Role{Code: req.Role.Code}).First(&role) user := mapper.InputToModelUser(req) diff --git a/services/user/src/pkg/services/mainAddress.go b/services/user/src/pkg/services/mainAddress.go index 23bf5f9b..a0f84a32 100644 --- a/services/user/src/pkg/services/mainAddress.go +++ b/services/user/src/pkg/services/mainAddress.go @@ -30,9 +30,9 @@ func (s *Server) UpdateMainAddress(_ context.Context, req *pb.MainAddressUpdateI Error: "User not found", }, nil } - var mainAddress = mapper.ToModelMainAddress(req.MainAddress) + var mainAddress = mapper.UpdateInputToModelMainAddress(req.MainAddress) - s.H.DB.Save(&mainAddress) + s.H.DB.Updates(&mainAddress) return &pb.UpdateMainAddressOutput{ MainAddress: mapper.ToProtoMainAddress(*mainAddress), diff --git a/services/user/src/pkg/services/user.go b/services/user/src/pkg/services/user.go index e73e49cf..8d32b9ad 100644 --- a/services/user/src/pkg/services/user.go +++ b/services/user/src/pkg/services/user.go @@ -36,9 +36,9 @@ func (s *Server) UpdateUser(_ context.Context, req *pb.UpdateUserInput) (*pb.Use Error: "User not found", }, nil } - var user = mapper.ToModelUser(req.User) + var user = mapper.UpdateInputToModelUser(req.User) - s.H.DB.Save(&user) + s.H.DB.Updates(&user) return &pb.UserOutput{ User: mapper.ToProtoUser(user), diff --git a/services/user/src/pkg/utils/jwt.go b/services/user/src/pkg/utils/jwt.go index e53120e5..c8be0e3f 100644 --- a/services/user/src/pkg/utils/jwt.go +++ b/services/user/src/pkg/utils/jwt.go @@ -60,7 +60,7 @@ func (w *JwtWrapper) ValidateToken(signedToken string) (claims *JwtClaims, err e claims, ok := token.Claims.(*JwtClaims) if !ok { - return nil, errors.New("Couldn't parse claims") + return nil, errors.New("couldn't parse claims") } if claims.ExpiresAt < time.Now().Local().Unix() { From d3f35a56ec161ce41c58de8283767d8b44e84370 Mon Sep 17 00:00:00 2001 From: anatole Date: Fri, 7 Jul 2023 14:16:05 +0200 Subject: [PATCH 210/883] feat(user service): fix delete user route --- services/user/src/pkg/services/user.go | 33 +++++++++++++++++++++++--- 1 file changed, 30 insertions(+), 3 deletions(-) diff --git a/services/user/src/pkg/services/user.go b/services/user/src/pkg/services/user.go index 8d32b9ad..8b1e599f 100644 --- a/services/user/src/pkg/services/user.go +++ b/services/user/src/pkg/services/user.go @@ -24,6 +24,12 @@ func (s *Server) GetUser(_ context.Context, req *pb.UserId) (*pb.UserOutput, err } func (s *Server) UpdateUser(_ context.Context, req *pb.UpdateUserInput) (*pb.UserOutput, error) { + if req.User == nil || req.Token == "" { + return &pb.UserOutput{ + Error: "Invalid request", + }, nil + } + claims, err := s.Jwt.ValidateToken(req.Token) if err != nil { return &pb.UserOutput{ @@ -83,31 +89,52 @@ func (s *Server) ChangePassword(_ context.Context, req *pb.ChangePasswordInput) } func (s *Server) DeleteUser(_ context.Context, req *pb.DeleteInput) (*pb.DeleteUserOutput, error) { + if req.UserId == 0 || req.Token == "" { + return &pb.DeleteUserOutput{ + Error: "Invalid request", + }, nil + } + claims, err := s.Jwt.ValidateToken(req.Token) if err != nil { return &pb.DeleteUserOutput{ Error: "Invalid token", }, nil } + var connectedUser models.User + + if result := s.H.DB.Where(&models.User{Id: claims.Id}).Preload("Role").First(&connectedUser); result.Error != nil || result.RowsAffected == 0 { + return &pb.DeleteUserOutput{ + Error: "User not found", + }, nil + } var user models.User + var mainAddress models.MainAddress - if result := s.H.DB.Where(&models.User{Id: claims.Id}); result.Error != nil { + if result := s.H.DB.Where(&models.User{Id: req.UserId}).Preload("Role").First(&user); result.Error != nil || result.RowsAffected == 0 { return &pb.DeleteUserOutput{ Error: "User not found", }, nil } - if user.Role.Code == "ADMIN" || user.Id == req.UserId { + if result := s.H.DB.Where(&models.MainAddress{Id: user.MainAddressId}).First(&mainAddress); result.Error != nil || result.RowsAffected == 0 { + return &pb.DeleteUserOutput{ + Error: "Main address not found", + }, nil + } + + if user.Role.Code == "ADMIN" || user.Id == connectedUser.Id { s.H.DB.Delete(&user) + s.H.DB.Delete(&mainAddress) return &pb.DeleteUserOutput{ User: mapper.ToProtoUser(&user), }, nil } else { return &pb.DeleteUserOutput{ - Error: "You are not allowed to change this user role", + Error: "You are not allowed to delete this user", }, nil } } From bc46e66028bc7d178242aa9e60fe3de5dcb560f5 Mon Sep 17 00:00:00 2001 From: anatole Date: Fri, 7 Jul 2023 15:11:13 +0200 Subject: [PATCH 211/883] feat(token service): check if the userId in the token exist --- services/user/src/main.go | 2 +- services/user/src/pkg/services/user.go | 10 +--------- services/user/src/pkg/utils/jwt.go | 6 ++++++ 3 files changed, 8 insertions(+), 10 deletions(-) diff --git a/services/user/src/main.go b/services/user/src/main.go index 43533470..3bec1583 100644 --- a/services/user/src/main.go +++ b/services/user/src/main.go @@ -31,7 +31,7 @@ func main() { jwt := utils.JwtWrapper{ SecretKey: c.JWTSecretKey, Issuer: "go-grpc-auth-svc", - ExpirationHours: 24 * 365, + ExpirationHours: 1, } logger.Infof("Starting server at ", c.Port) diff --git a/services/user/src/pkg/services/user.go b/services/user/src/pkg/services/user.go index 8b1e599f..afcceae5 100644 --- a/services/user/src/pkg/services/user.go +++ b/services/user/src/pkg/services/user.go @@ -101,13 +101,6 @@ func (s *Server) DeleteUser(_ context.Context, req *pb.DeleteInput) (*pb.DeleteU Error: "Invalid token", }, nil } - var connectedUser models.User - - if result := s.H.DB.Where(&models.User{Id: claims.Id}).Preload("Role").First(&connectedUser); result.Error != nil || result.RowsAffected == 0 { - return &pb.DeleteUserOutput{ - Error: "User not found", - }, nil - } var user models.User var mainAddress models.MainAddress @@ -124,8 +117,7 @@ func (s *Server) DeleteUser(_ context.Context, req *pb.DeleteInput) (*pb.DeleteU }, nil } - if user.Role.Code == "ADMIN" || user.Id == connectedUser.Id { - + if user.Role.Code == "ADMIN" || user.Id == claims.Id { s.H.DB.Delete(&user) s.H.DB.Delete(&mainAddress) diff --git a/services/user/src/pkg/utils/jwt.go b/services/user/src/pkg/utils/jwt.go index c8be0e3f..fa879bb2 100644 --- a/services/user/src/pkg/utils/jwt.go +++ b/services/user/src/pkg/utils/jwt.go @@ -3,6 +3,7 @@ package utils import ( "errors" "github.com/golang-jwt/jwt" + "goodfood-user/pkg/db" "goodfood-user/pkg/models" "time" ) @@ -11,6 +12,7 @@ type JwtWrapper struct { SecretKey string Issuer string ExpirationHours int64 + H db.Handler } type JwtClaims struct { @@ -59,6 +61,10 @@ func (w *JwtWrapper) ValidateToken(signedToken string) (claims *JwtClaims, err e claims, ok := token.Claims.(*JwtClaims) + if result := w.H.DB.Where(&models.User{Id: claims.Id}).First(&models.User{}); result.Error != nil || result.RowsAffected == 0 { + return nil, result.Error + } + if !ok { return nil, errors.New("couldn't parse claims") } From d39dc65ec733e7ac812fe4e7aff6c93be7ba066a Mon Sep 17 00:00:00 2001 From: anatole Date: Fri, 7 Jul 2023 15:13:50 +0200 Subject: [PATCH 212/883] Revert "feat(token service): check if the userId in the token exist" This reverts commit 88d82f197e73164b1cbe23899753d7dc4204e837. --- services/user/src/main.go | 2 +- services/user/src/pkg/services/user.go | 10 +++++++++- services/user/src/pkg/utils/jwt.go | 6 ------ 3 files changed, 10 insertions(+), 8 deletions(-) diff --git a/services/user/src/main.go b/services/user/src/main.go index 3bec1583..43533470 100644 --- a/services/user/src/main.go +++ b/services/user/src/main.go @@ -31,7 +31,7 @@ func main() { jwt := utils.JwtWrapper{ SecretKey: c.JWTSecretKey, Issuer: "go-grpc-auth-svc", - ExpirationHours: 1, + ExpirationHours: 24 * 365, } logger.Infof("Starting server at ", c.Port) diff --git a/services/user/src/pkg/services/user.go b/services/user/src/pkg/services/user.go index afcceae5..8b1e599f 100644 --- a/services/user/src/pkg/services/user.go +++ b/services/user/src/pkg/services/user.go @@ -101,6 +101,13 @@ func (s *Server) DeleteUser(_ context.Context, req *pb.DeleteInput) (*pb.DeleteU Error: "Invalid token", }, nil } + var connectedUser models.User + + if result := s.H.DB.Where(&models.User{Id: claims.Id}).Preload("Role").First(&connectedUser); result.Error != nil || result.RowsAffected == 0 { + return &pb.DeleteUserOutput{ + Error: "User not found", + }, nil + } var user models.User var mainAddress models.MainAddress @@ -117,7 +124,8 @@ func (s *Server) DeleteUser(_ context.Context, req *pb.DeleteInput) (*pb.DeleteU }, nil } - if user.Role.Code == "ADMIN" || user.Id == claims.Id { + if user.Role.Code == "ADMIN" || user.Id == connectedUser.Id { + s.H.DB.Delete(&user) s.H.DB.Delete(&mainAddress) diff --git a/services/user/src/pkg/utils/jwt.go b/services/user/src/pkg/utils/jwt.go index fa879bb2..c8be0e3f 100644 --- a/services/user/src/pkg/utils/jwt.go +++ b/services/user/src/pkg/utils/jwt.go @@ -3,7 +3,6 @@ package utils import ( "errors" "github.com/golang-jwt/jwt" - "goodfood-user/pkg/db" "goodfood-user/pkg/models" "time" ) @@ -12,7 +11,6 @@ type JwtWrapper struct { SecretKey string Issuer string ExpirationHours int64 - H db.Handler } type JwtClaims struct { @@ -61,10 +59,6 @@ func (w *JwtWrapper) ValidateToken(signedToken string) (claims *JwtClaims, err e claims, ok := token.Claims.(*JwtClaims) - if result := w.H.DB.Where(&models.User{Id: claims.Id}).First(&models.User{}); result.Error != nil || result.RowsAffected == 0 { - return nil, result.Error - } - if !ok { return nil, errors.New("couldn't parse claims") } From d6dc388a00c8e32b5b913f7d4b377a7470efdd60 Mon Sep 17 00:00:00 2001 From: Florian LEROUX Date: Fri, 7 Jul 2023 15:32:15 +0200 Subject: [PATCH 213/883] feat(schema): add migration, change prisma schema and proto --- services/proto/stock.proto | 107 +++++++++++++++++- .../migration.sql | 18 +++ .../migration.sql | 16 +++ .../migration.sql | 19 ++++ .../migration.sql | 12 ++ services/stock/prisma/schema.prisma | 26 ++++- 6 files changed, 192 insertions(+), 6 deletions(-) create mode 100644 services/stock/prisma/migrations/20230707074643_add_supplyorder/migration.sql create mode 100644 services/stock/prisma/migrations/20230707074901_change_property_name_in_supplyorder/migration.sql create mode 100644 services/stock/prisma/migrations/20230707091911_change_updated_at_to_updated_at/migration.sql create mode 100644 services/stock/prisma/migrations/20230707115818_add_key_to_ingredient_restaurant/migration.sql diff --git a/services/proto/stock.proto b/services/proto/stock.proto index 4d0895c3..d36048c4 100644 --- a/services/proto/stock.proto +++ b/services/proto/stock.proto @@ -1,6 +1,8 @@ syntax = "proto3"; package com.goodfood.stock; +import "google/protobuf/empty.proto"; + message Ingredient { int32 id = 1; @@ -10,6 +12,7 @@ message Ingredient { message IngredientRestaurant { int32 id = 1; + string key = 13; int32 alert_threshold = 2; int32 quantity = 3; @@ -35,28 +38,56 @@ message Supplier { string contact = 3; } +message SupplyOrder { + int32 id = 1; + + int32 quantity = 2; + double unit_price = 3; + + int32 ingredient_restaurant_id = 4; + IngredientRestaurant ingredient_restaurant = 5; + + int32 supplier_id = 6; + Supplier supplier = 7; + + string created_at = 8; + string updated_at = 9; +} + service StockService { rpc GetIngredient(GetIngredientRequest) returns (Ingredient) {} - rpc GetIngredients() returns (GetIngredientsResponse) {} + rpc GetIngredients(google.protobuf.Empty) returns (GetIngredientsResponse) {} rpc CreateIngredient(CreateIngredientRequest) returns (Ingredient) {} rpc UpdateIngredient(UpdateIngredientRequest) returns (Ingredient) {} rpc DeleteIngredient(DeleteIngredientRequest) returns (DeleteIngredientResponse) {} rpc GetSupplier(GetSupplierRequest) returns (Supplier) {} - rpc GetSuppliers() returns (GetSuppliersResponse) {} + rpc GetSuppliers(google.protobuf.Empty) returns (GetSuppliersResponse) {} rpc CreateSupplier(CreateSupplierRequest) returns (Supplier) {} rpc UpdateSupplier(UpdateSupplierRequest) returns (Supplier) {} rpc DeleteSupplier(DeleteSupplierRequest) returns (DeleteSupplierResponse) {} rpc GetIngredientRestaurant(GetIngredientRestaurantRequest) returns (IngredientRestaurant) {} rpc GetIngredientRestaurantsByRestaurant(GetIngredientRestaurantsByRestaurantRequest) returns (GetIngredientRestaurantsByRestaurantResponse) {} + rpc GetIngredientRestaurantsByProduct(GetIngredientRestaurantsByProductRequest) returns (GetIngredientRestaurantsByProductResponse) {} rpc CreateIngredientRestaurant(CreateIngredientRestaurantRequest) returns (IngredientRestaurant) {} rpc UpdateIngredientRestaurant(UpdateIngredientRestaurantRequest) returns (IngredientRestaurant) {} rpc DeleteIngredientRestaurant(DeleteIngredientRestaurantRequest) returns (DeleteIngredientRestaurantResponse) {} + + // todo: add create supply order for multiple ingredient restaurants + rpc GetSupplyOrder(GetSupplyOrderRequest) returns (SupplyOrder) {} + rpc GetSupplyOrdersByRestaurant(GetSupplyOrdersByRestaurantRequest) returns (GetSupplyOrdersByRestaurantResponse) {} + rpc GetSupplyOrdersBySupplier(GetSupplyOrdersBySupplierRequest) returns (GetSupplyOrdersBySupplierResponse) {} + rpc GetSupplyOrdersByIngredientRestaurant(GetSupplyOrdersByIngredientRestaurantRequest) returns (GetSupplyOrdersByIngredientRestaurantResponse) {} + rpc CreateSupplyOrder(CreateSupplyOrderRequest) returns (SupplyOrder) {} + rpc UpdateSupplyOrder(UpdateSupplyOrderRequest) returns (SupplyOrder) {} + rpc DeleteSupplyOrder(DeleteSupplyOrderRequest) returns (DeleteSupplyOrderResponse) {} + } service StockReportingService { + rpc GetOutcomesByRestaurant(GetOutcomesByRestaurantRequest) returns (GetOutcomesByRestaurantResponse) {} } message GetIngredientRequest { @@ -68,6 +99,14 @@ message GetIngredientsResponse { repeated Ingredient ingredients = 1; } +message GetIngredientRestaurantsByProductRequest { + string product_id = 1; +} + +message GetIngredientRestaurantsByProductResponse { + repeated IngredientRestaurant ingredient_restaurants = 1; +} + message CreateIngredientRequest { string name = 1; optional string description = 2; @@ -115,7 +154,7 @@ message DeleteSupplierResponse { } message GetIngredientRestaurantRequest { - string id = 1; + int32 id = 1; } message GetIngredientRestaurantsByRestaurantRequest { @@ -164,3 +203,65 @@ message DeleteIngredientRestaurantRequest { message DeleteIngredientRestaurantResponse { bool success = 1; } + +message GetSupplyOrderRequest { + int32 id = 1; +} + +message GetSupplyOrdersByRestaurantRequest { + string restaurant_id = 1; +} + +message GetSupplyOrdersByRestaurantResponse { + repeated SupplyOrder supply_orders = 1; +} + +message GetSupplyOrdersBySupplierRequest { + int32 supplier_id = 1; +} + +message GetSupplyOrdersBySupplierResponse { + repeated SupplyOrder supply_orders = 1; +} + +message GetSupplyOrdersByIngredientRestaurantRequest { + int32 ingredient_restaurant_id = 1; +} + +message GetSupplyOrdersByIngredientRestaurantResponse { + repeated SupplyOrder supply_orders = 1; +} + +message CreateSupplyOrderRequest { + int32 quantity = 1; + + int32 ingredient_restaurant_id = 2; + + int32 supplier_id = 3; +} + +message UpdateSupplyOrderRequest { + int32 id = 1; + int32 quantity = 2; + + int32 ingredient_restaurant_id = 3; + int32 supplier_id = 4; +} + +message DeleteSupplyOrderRequest { + int32 id = 1; +} + +message DeleteSupplyOrderResponse { + bool success = 1; +} + +message GetOutcomesByRestaurantRequest { + string restaurant_id = 1; + optional string date = 2; + string interval = 3; +} + +message GetOutcomesByRestaurantResponse { + float value = 1; +} \ No newline at end of file diff --git a/services/stock/prisma/migrations/20230707074643_add_supplyorder/migration.sql b/services/stock/prisma/migrations/20230707074643_add_supplyorder/migration.sql new file mode 100644 index 00000000..2d102455 --- /dev/null +++ b/services/stock/prisma/migrations/20230707074643_add_supplyorder/migration.sql @@ -0,0 +1,18 @@ +-- CreateTable +CREATE TABLE "SupplyOrder" ( + "id" SERIAL NOT NULL, + "supplier_id" INTEGER NOT NULL, + "ingredient_id" INTEGER NOT NULL, + "quantity" INTEGER NOT NULL, + "unit_price" DOUBLE PRECISION NOT NULL, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "SupplyOrder_pkey" PRIMARY KEY ("id") +); + +-- AddForeignKey +ALTER TABLE "SupplyOrder" ADD CONSTRAINT "SupplyOrder_supplier_id_fkey" FOREIGN KEY ("supplier_id") REFERENCES "Supplier"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "SupplyOrder" ADD CONSTRAINT "SupplyOrder_ingredient_id_fkey" FOREIGN KEY ("ingredient_id") REFERENCES "IngredientRestaurant"("id") ON DELETE RESTRICT ON UPDATE CASCADE; diff --git a/services/stock/prisma/migrations/20230707074901_change_property_name_in_supplyorder/migration.sql b/services/stock/prisma/migrations/20230707074901_change_property_name_in_supplyorder/migration.sql new file mode 100644 index 00000000..825f901b --- /dev/null +++ b/services/stock/prisma/migrations/20230707074901_change_property_name_in_supplyorder/migration.sql @@ -0,0 +1,16 @@ +/* + Warnings: + + - You are about to drop the column `ingredient_id` on the `SupplyOrder` table. All the data in the column will be lost. + - Added the required column `ingredient_restaurant_id` to the `SupplyOrder` table without a default value. This is not possible if the table is not empty. + +*/ +-- DropForeignKey +ALTER TABLE "SupplyOrder" DROP CONSTRAINT "SupplyOrder_ingredient_id_fkey"; + +-- AlterTable +ALTER TABLE "SupplyOrder" DROP COLUMN "ingredient_id", +ADD COLUMN "ingredient_restaurant_id" INTEGER NOT NULL; + +-- AddForeignKey +ALTER TABLE "SupplyOrder" ADD CONSTRAINT "SupplyOrder_ingredient_restaurant_id_fkey" FOREIGN KEY ("ingredient_restaurant_id") REFERENCES "IngredientRestaurant"("id") ON DELETE RESTRICT ON UPDATE CASCADE; diff --git a/services/stock/prisma/migrations/20230707091911_change_updated_at_to_updated_at/migration.sql b/services/stock/prisma/migrations/20230707091911_change_updated_at_to_updated_at/migration.sql new file mode 100644 index 00000000..305cf3c2 --- /dev/null +++ b/services/stock/prisma/migrations/20230707091911_change_updated_at_to_updated_at/migration.sql @@ -0,0 +1,19 @@ +/* + Warnings: + + - You are about to drop the column `updatedAt` on the `IngredientRestaurant` table. All the data in the column will be lost. + - You are about to drop the column `createdAt` on the `SupplyOrder` table. All the data in the column will be lost. + - You are about to drop the column `updatedAt` on the `SupplyOrder` table. All the data in the column will be lost. + - Added the required column `updated_at` to the `IngredientRestaurant` table without a default value. This is not possible if the table is not empty. + - Added the required column `updated_at` to the `SupplyOrder` table without a default value. This is not possible if the table is not empty. + +*/ +-- AlterTable +ALTER TABLE "IngredientRestaurant" DROP COLUMN "updatedAt", +ADD COLUMN "updated_at" TIMESTAMP(3) NOT NULL; + +-- AlterTable +ALTER TABLE "SupplyOrder" DROP COLUMN "createdAt", +DROP COLUMN "updatedAt", +ADD COLUMN "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, +ADD COLUMN "updated_at" TIMESTAMP(3) NOT NULL; diff --git a/services/stock/prisma/migrations/20230707115818_add_key_to_ingredient_restaurant/migration.sql b/services/stock/prisma/migrations/20230707115818_add_key_to_ingredient_restaurant/migration.sql new file mode 100644 index 00000000..5f3c29a7 --- /dev/null +++ b/services/stock/prisma/migrations/20230707115818_add_key_to_ingredient_restaurant/migration.sql @@ -0,0 +1,12 @@ +/* + Warnings: + + - A unique constraint covering the columns `[key]` on the table `IngredientRestaurant` will be added. If there are existing duplicate values, this will fail. + - Added the required column `key` to the `IngredientRestaurant` table without a default value. This is not possible if the table is not empty. + +*/ +-- AlterTable +ALTER TABLE "IngredientRestaurant" ADD COLUMN "key" TEXT NOT NULL; + +-- CreateIndex +CREATE UNIQUE INDEX "IngredientRestaurant_key_key" ON "IngredientRestaurant"("key"); diff --git a/services/stock/prisma/schema.prisma b/services/stock/prisma/schema.prisma index 029d24d5..a85e5b48 100644 --- a/services/stock/prisma/schema.prisma +++ b/services/stock/prisma/schema.prisma @@ -14,11 +14,12 @@ model Ingredient { description String? // needed to link the ingredient to the restaurant - IngredientRestaurant IngredientRestaurant[] + ingredient_restaurant IngredientRestaurant[] } model IngredientRestaurant { - id Int @id @default(autoincrement()) + id Int @id @default(autoincrement()) + key String @unique alert_threshold Int quantity Int @@ -35,7 +36,9 @@ model IngredientRestaurant { supplier Supplier @relation(fields: [supplier_id], references: [id]) supplier_id Int - updatedAt DateTime @updatedAt + updated_at DateTime @updatedAt + + orders SupplyOrder[] } model Supplier { @@ -44,4 +47,21 @@ model Supplier { contact String ingredients IngredientRestaurant[] + orders SupplyOrder[] +} + +model SupplyOrder { + id Int @id @default(autoincrement()) + + quantity Int + unit_price Float + + ingredient_restaurant_id Int + ingredient_restaurant IngredientRestaurant @relation(fields: [ingredient_restaurant_id], references: [id]) + + supplier_id Int + supplier Supplier @relation(fields: [supplier_id], references: [id]) + + created_at DateTime @default(now()) + updated_at DateTime @updatedAt } From ae3308b2888a8b0e1c5fe48a3a1c8c6f553ef378 Mon Sep 17 00:00:00 2001 From: Florian LEROUX Date: Fri, 7 Jul 2023 15:32:38 +0200 Subject: [PATCH 214/883] feat(reporting): add outcome handler --- .../stock/src/handlers/reporting/index.ts | 6 +++- .../stock/src/handlers/reporting/outcomes.ts | 35 +++++++++++++++++++ 2 files changed, 40 insertions(+), 1 deletion(-) create mode 100644 services/stock/src/handlers/reporting/outcomes.ts diff --git a/services/stock/src/handlers/reporting/index.ts b/services/stock/src/handlers/reporting/index.ts index 1040f2ac..53c4582b 100644 --- a/services/stock/src/handlers/reporting/index.ts +++ b/services/stock/src/handlers/reporting/index.ts @@ -1,5 +1,9 @@ import { UntypedServiceImplementation } from "@grpc/grpc-js"; -const reportingHandlers: UntypedServiceImplementation = {}; +import { GetOutcomesByRestaurant } from "@stock/handlers/reporting/outcomes"; + +const reportingHandlers: UntypedServiceImplementation = { + GetOutcomesByRestaurant, +}; export default reportingHandlers; diff --git a/services/stock/src/handlers/reporting/outcomes.ts b/services/stock/src/handlers/reporting/outcomes.ts new file mode 100644 index 00000000..eb4b99e4 --- /dev/null +++ b/services/stock/src/handlers/reporting/outcomes.ts @@ -0,0 +1,35 @@ +import { prisma } from "@stock/lib/prisma"; +import { log } from "@stock/lib/log"; +import { Data } from "@stock/types"; +import { + GetOutcomesByRestaurantRequest, + GetOutcomesByRestaurantResponse, +} from "@stock/types/reporting"; +import { fromInterval } from "@stock/lib/date"; + +export const GetOutcomesByRestaurant = async ( + { request }: Data, + callback: (err: any, response: GetOutcomesByRestaurantResponse | null) => void +) => { + try { + const { interval, date, restaurant_id } = request; + const { start, end } = fromInterval(interval, date); + + const supply_orders = await prisma.supplyOrder.findMany({ + where: { + created_at: { gte: start, lte: end }, + ingredient_restaurant: { restaurant_id }, + }, + }); + + const value = supply_orders.reduce( + (acc, { unit_price, quantity }) => acc + unit_price * quantity, + 0 + ); + + callback(null, { value }); + } catch (error) { + log.error(error); + callback(error, null); + } +}; From 06a08d13aa93dfd2547dbd624cf68b5ae5dd1dc4 Mon Sep 17 00:00:00 2001 From: Florian LEROUX Date: Fri, 7 Jul 2023 15:33:19 +0200 Subject: [PATCH 215/883] feat(ingredient): add ingredient handler --- .../src/handlers/stock/ingredient/create.ts | 26 ++++++ .../src/handlers/stock/ingredient/delete.ts | 21 +++++ .../src/handlers/stock/ingredient/get.ts | 20 +++++ .../src/handlers/stock/ingredient/index.ts | 5 ++ .../src/handlers/stock/ingredient/list.ts | 17 ++++ .../src/handlers/stock/ingredient/update.ts | 22 +++++ services/stock/src/lib/reflection.ts | 1 - services/stock/src/types/reporting.d.ts | 11 +++ services/stock/src/types/stock.d.ts | 81 ++++++++++++++++++- 9 files changed, 202 insertions(+), 2 deletions(-) create mode 100644 services/stock/src/handlers/stock/ingredient/create.ts create mode 100644 services/stock/src/handlers/stock/ingredient/delete.ts create mode 100644 services/stock/src/handlers/stock/ingredient/index.ts create mode 100644 services/stock/src/handlers/stock/ingredient/list.ts create mode 100644 services/stock/src/handlers/stock/ingredient/update.ts create mode 100644 services/stock/src/types/reporting.d.ts diff --git a/services/stock/src/handlers/stock/ingredient/create.ts b/services/stock/src/handlers/stock/ingredient/create.ts new file mode 100644 index 00000000..d27c4451 --- /dev/null +++ b/services/stock/src/handlers/stock/ingredient/create.ts @@ -0,0 +1,26 @@ +import { prisma } from "@stock/lib/prisma"; +import { log } from "@stock/lib/log"; +import { CreateIngredientRequest, Ingredient } from "@stock/types/stock"; +import { Data } from "@stock/types"; + +export const CreateIngredient = async ( + { request }: Data, + callback: (err: any, response: Ingredient | null) => void +) => { + try { + const { name, description } = request; + + let ingredient = await prisma.ingredient.findUnique({ + where: { name }, + }); + if (!ingredient) + ingredient = await prisma.ingredient.create({ + data: { name, description }, + }); + + callback(null, ingredient); + } catch (error) { + log.error(error); + callback(error, null); + } +}; diff --git a/services/stock/src/handlers/stock/ingredient/delete.ts b/services/stock/src/handlers/stock/ingredient/delete.ts new file mode 100644 index 00000000..46973066 --- /dev/null +++ b/services/stock/src/handlers/stock/ingredient/delete.ts @@ -0,0 +1,21 @@ +import { prisma } from "@stock/lib/prisma"; +import { log } from "@stock/lib/log"; +import { + DeleteIngredientRequest, + DeleteIngredientResponse, +} from "@stock/types/stock"; +import { Data } from "@stock/types"; + +export const DeleteIngredient = async ( + { request }: Data, + callback: (err: any, response: DeleteIngredientResponse | null) => void +) => { + try { + const { id } = request; + await prisma.ingredient.delete({ where: { id } }); + callback(null, { success: true }); + } catch (error) { + log.error(error); + callback(error, { success: false }); + } +}; diff --git a/services/stock/src/handlers/stock/ingredient/get.ts b/services/stock/src/handlers/stock/ingredient/get.ts index e69de29b..58b0d18e 100644 --- a/services/stock/src/handlers/stock/ingredient/get.ts +++ b/services/stock/src/handlers/stock/ingredient/get.ts @@ -0,0 +1,20 @@ +import { prisma } from "@stock/lib/prisma"; +import { log } from "@stock/lib/log"; +import { GetIngredientRequest, Ingredient } from "@stock/types/stock"; +import { Data } from "@stock/types"; + +export const GetIngredient = async ( + { request }: Data, + callback: (err: any, response: Ingredient | null) => void +) => { + try { + const { id } = request; + const ingredient = await prisma.ingredient.findUniqueOrThrow({ + where: { id }, + }); + callback(null, ingredient); + } catch (error) { + log.error(error); + callback(error, null); + } +}; diff --git a/services/stock/src/handlers/stock/ingredient/index.ts b/services/stock/src/handlers/stock/ingredient/index.ts new file mode 100644 index 00000000..fc3af4a4 --- /dev/null +++ b/services/stock/src/handlers/stock/ingredient/index.ts @@ -0,0 +1,5 @@ +export * from "./get" +export * from "./list" +export * from "./create" +export * from "./update" +export * from "./delete" \ No newline at end of file diff --git a/services/stock/src/handlers/stock/ingredient/list.ts b/services/stock/src/handlers/stock/ingredient/list.ts new file mode 100644 index 00000000..ace89802 --- /dev/null +++ b/services/stock/src/handlers/stock/ingredient/list.ts @@ -0,0 +1,17 @@ +import { prisma } from "@stock/lib/prisma"; +import { log } from "@stock/lib/log"; +import { GetIngredientsResponse } from "@stock/types/stock"; +import { Data } from "@stock/types"; + +export const GetIngredients = async ( + {}: Data, + callback: (err: any, response: GetIngredientsResponse | null) => void +) => { + try { + const ingredients = await prisma.ingredient.findMany(); + callback(null, { ingredients }); + } catch (error) { + log.error(error); + callback(error, null); + } +}; diff --git a/services/stock/src/handlers/stock/ingredient/update.ts b/services/stock/src/handlers/stock/ingredient/update.ts new file mode 100644 index 00000000..2ad3beb9 --- /dev/null +++ b/services/stock/src/handlers/stock/ingredient/update.ts @@ -0,0 +1,22 @@ +import { prisma } from "@stock/lib/prisma"; +import { log } from "@stock/lib/log"; +import { UpdateIngredientRequest, Ingredient } from "@stock/types/stock"; +import { Data } from "@stock/types"; + +export const UpdateIngredient = async ( + { request }: Data, + callback: (err: any, response: Ingredient | null) => void +) => { + try { + const { name, id, description } = request; + const ingredient = await prisma.ingredient.update({ + where: { id }, + data: { name, description }, + }); + + callback(null, ingredient); + } catch (error) { + log.error(error); + callback(error, null); + } +}; diff --git a/services/stock/src/lib/reflection.ts b/services/stock/src/lib/reflection.ts index bdb1d1dd..4f75c769 100644 --- a/services/stock/src/lib/reflection.ts +++ b/services/stock/src/lib/reflection.ts @@ -16,7 +16,6 @@ export const addReflection = (server: Server, path: string) => { base_addReflection(server, path); } catch (err) { - console.log("here"); log.warn(`Reflection file ${resolvedPath} is not readable`); return; } diff --git a/services/stock/src/types/reporting.d.ts b/services/stock/src/types/reporting.d.ts new file mode 100644 index 00000000..085f1441 --- /dev/null +++ b/services/stock/src/types/reporting.d.ts @@ -0,0 +1,11 @@ +import { Interval } from "@stock/types"; + +export type GetOutcomesByRestaurantRequest = { + restaurant_id: string; + date?: string; + interval: Interval +} + +export type GetOutcomesByRestaurantResponse = { + value: number; +} \ No newline at end of file diff --git a/services/stock/src/types/stock.d.ts b/services/stock/src/types/stock.d.ts index 2ee89fc0..a66539eb 100644 --- a/services/stock/src/types/stock.d.ts +++ b/services/stock/src/types/stock.d.ts @@ -1,11 +1,12 @@ export type Ingredient = { id: number; name: string; - description?: string; + description: string | null; }; export type IngredientRestaurant = { id: number; + key: string; alert_threshold: number; quantity: number; @@ -31,6 +32,22 @@ export type Supplier = { contact: string; }; +export type SupplyOrder = { + id: number; + + quantity: number; + unit_price: number; + + ingredient_restaurant_id: number; + ingredient_restaurant: IngredientRestaurant; + + supplier_id: number; + supplier: Supplier; + + created_at: string | Date; + updated_at: string | Date; +}; + export type GetIngredientRequest = { id: number; }; @@ -41,11 +58,13 @@ export type GetIngredientsResponse = { export type CreateIngredientRequest = { name: string; + description?: string; }; export type UpdateIngredientRequest = { id: number; name: string; + description?: string; }; export type DeleteIngredientRequest = { @@ -95,6 +114,14 @@ export type GetIngredientRestaurantsByRestaurantResponse = { ingredient_restaurants: IngredientRestaurant[]; }; +export type GetIngredientRestaurantsByProductRequest = { + product_id: string; +}; + +export type GetIngredientRestaurantsByProductResponse = { + ingredient_restaurants: IngredientRestaurant[]; +}; + export type CreateIngredientRestaurantRequest = { alert_threshold: number; quantity: number; @@ -129,3 +156,55 @@ export type DeleteIngredientRestaurantRequest = { export type DeleteIngredientRestaurantResponse = { success: boolean; }; + +export type GetSupplyOrderRequest = { + id: number; +}; + +export type GetSupplyOrdersByRestaurantRequest = { + restaurant_id: string; +}; + +export type GetSupplyOrdersByRestaurantResponse = { + supply_orders: SupplyOrder[]; +}; + +export type GetSupplyOrdersBySupplierRequest = { + supplier_id: number; +}; + +export type GetSupplyOrdersBySupplierResponse = { + supply_orders: SupplyOrder[]; +}; + +export type GetSupplyOrdersByIngredientRestaurantRequest = { + ingredient_restaurant_id: number; +}; + +export type GetSupplyOrdersByIngredientRestaurantResponse = { + supply_orders: SupplyOrder[]; +}; + +export type CreateSupplyOrderRequest = { + quantity: number; + + ingredient_restaurant_id: number; + supplier_id: number; +}; + +export type UpdateSupplyOrderRequest = { + id: number; + quantity: number; + unit_price: number; + + ingredient_restaurant_id: number; + supplier_id: number; +}; + +export type DeleteSupplyOrderRequest = { + id: number; +}; + +export type DeleteSupplyOrderResponse = { + success: boolean; +}; From b1207424d6582848aa6f423e972a9f6fc49b7bc5 Mon Sep 17 00:00:00 2001 From: Florian LEROUX Date: Fri, 7 Jul 2023 15:33:48 +0200 Subject: [PATCH 216/883] feat(ingredient_restaurant): add ingredient_restaurant handlers --- .../stock/ingredient_restaurant/create.ts | 45 +++++++++++++++++++ .../stock/ingredient_restaurant/delete.ts | 24 ++++++++++ .../ingredient_restaurant/get-by-product.ts | 27 +++++++++++ .../get-by-restaurant.ts | 27 +++++++++++ .../stock/ingredient_restaurant/get.ts | 25 +++++++++++ .../stock/ingredient_restaurant/index.ts | 6 +++ .../stock/ingredient_restaurant/update.ts | 45 +++++++++++++++++++ 7 files changed, 199 insertions(+) create mode 100644 services/stock/src/handlers/stock/ingredient_restaurant/create.ts create mode 100644 services/stock/src/handlers/stock/ingredient_restaurant/delete.ts create mode 100644 services/stock/src/handlers/stock/ingredient_restaurant/get-by-product.ts create mode 100644 services/stock/src/handlers/stock/ingredient_restaurant/get-by-restaurant.ts create mode 100644 services/stock/src/handlers/stock/ingredient_restaurant/get.ts create mode 100644 services/stock/src/handlers/stock/ingredient_restaurant/index.ts create mode 100644 services/stock/src/handlers/stock/ingredient_restaurant/update.ts diff --git a/services/stock/src/handlers/stock/ingredient_restaurant/create.ts b/services/stock/src/handlers/stock/ingredient_restaurant/create.ts new file mode 100644 index 00000000..803f42af --- /dev/null +++ b/services/stock/src/handlers/stock/ingredient_restaurant/create.ts @@ -0,0 +1,45 @@ +import { prisma } from "@stock/lib/prisma"; +import { log } from "@stock/lib/log"; +import { + CreateIngredientRestaurantRequest, + IngredientRestaurant, +} from "@stock/types/stock"; +import { Data } from "@stock/types"; + +export const CreateIngredientRestaurant = async ( + { request }: Data, + callback: (err: any, response: IngredientRestaurant | null) => void +) => { + try { + const { + alert_threshold, + in_product_list, + ingredient_id, + price_per_kilo, + quantity, + restaurant_id, + supplier_id, + unit_price, + } = request; + + const ingredient_restaurant = await prisma.ingredientRestaurant.create({ + data: { + key: `${restaurant_id}/${ingredient_id}`, + alert_threshold, + in_product_list, + ingredient_id, + price_per_kilo, + quantity, + restaurant_id, + supplier_id, + unit_price, + }, + include: { supplier: true, ingredient: true }, + }); + + callback(null, ingredient_restaurant); + } catch (error) { + log.error(error); + callback(error, null); + } +}; diff --git a/services/stock/src/handlers/stock/ingredient_restaurant/delete.ts b/services/stock/src/handlers/stock/ingredient_restaurant/delete.ts new file mode 100644 index 00000000..a06bae3e --- /dev/null +++ b/services/stock/src/handlers/stock/ingredient_restaurant/delete.ts @@ -0,0 +1,24 @@ +import { prisma } from "@stock/lib/prisma"; +import { log } from "@stock/lib/log"; +import { + DeleteIngredientRestaurantRequest, + DeleteIngredientRestaurantResponse, +} from "@stock/types/stock"; +import { Data } from "@stock/types"; + +export const DeleteIngredientRestaurant = async ( + { request }: Data, + callback: ( + err: any, + response: DeleteIngredientRestaurantResponse | null + ) => void +) => { + try { + const { id } = request; + await prisma.ingredientRestaurant.delete({ where: { id } }); + callback(null, { success: true }); + } catch (error) { + log.error(error); + callback(error, { success: false }); + } +}; diff --git a/services/stock/src/handlers/stock/ingredient_restaurant/get-by-product.ts b/services/stock/src/handlers/stock/ingredient_restaurant/get-by-product.ts new file mode 100644 index 00000000..ad31477e --- /dev/null +++ b/services/stock/src/handlers/stock/ingredient_restaurant/get-by-product.ts @@ -0,0 +1,27 @@ +import { prisma } from "@stock/lib/prisma"; +import { log } from "@stock/lib/log"; +import { + GetIngredientRestaurantsByProductRequest, + GetIngredientRestaurantsByProductResponse, +} from "@stock/types/stock"; +import { Data } from "@stock/types"; + +export const GetIngredientRestaurantsByProduct = async ( + { request }: Data, + callback: ( + err: any, + response: GetIngredientRestaurantsByProductResponse | null + ) => void +) => { + try { + const { product_id } = request; + const ingredient_restaurants = await prisma.ingredientRestaurant.findMany({ + where: { in_product_list: { has: product_id } }, + include: { supplier: true, ingredient: true }, + }); + callback(null, { ingredient_restaurants }); + } catch (error) { + log.error(error); + callback(error, null); + } +}; diff --git a/services/stock/src/handlers/stock/ingredient_restaurant/get-by-restaurant.ts b/services/stock/src/handlers/stock/ingredient_restaurant/get-by-restaurant.ts new file mode 100644 index 00000000..cf521e5c --- /dev/null +++ b/services/stock/src/handlers/stock/ingredient_restaurant/get-by-restaurant.ts @@ -0,0 +1,27 @@ +import { prisma } from "@stock/lib/prisma"; +import { log } from "@stock/lib/log"; +import { + GetIngredientRestaurantsByRestaurantRequest, + GetIngredientRestaurantsByRestaurantResponse, +} from "@stock/types/stock"; +import { Data } from "@stock/types"; + +export const GetIngredientRestaurantsByRestaurant = async ( + { request }: Data, + callback: ( + err: any, + response: GetIngredientRestaurantsByRestaurantResponse | null + ) => void +) => { + try { + const { restaurant_id } = request; + const ingredient_restaurants = await prisma.ingredientRestaurant.findMany({ + where: { restaurant_id }, + include: { supplier: true, ingredient: true }, + }); + callback(null, { ingredient_restaurants }); + } catch (error) { + log.error(error); + callback(error, null); + } +}; diff --git a/services/stock/src/handlers/stock/ingredient_restaurant/get.ts b/services/stock/src/handlers/stock/ingredient_restaurant/get.ts new file mode 100644 index 00000000..b553768b --- /dev/null +++ b/services/stock/src/handlers/stock/ingredient_restaurant/get.ts @@ -0,0 +1,25 @@ +import { prisma } from "@stock/lib/prisma"; +import { log } from "@stock/lib/log"; +import { + GetIngredientRestaurantRequest, + IngredientRestaurant, +} from "@stock/types/stock"; +import { Data } from "@stock/types"; + +export const GetIngredientRestaurant = async ( + { request }: Data, + callback: (err: any, response: IngredientRestaurant | null) => void +) => { + try { + const { id } = request; + const ingredient_restaurant = + await prisma.ingredientRestaurant.findUniqueOrThrow({ + where: { id }, + include: { supplier: true, ingredient: true }, + }); + callback(null, ingredient_restaurant); + } catch (error) { + log.error(error); + callback(error, null); + } +}; diff --git a/services/stock/src/handlers/stock/ingredient_restaurant/index.ts b/services/stock/src/handlers/stock/ingredient_restaurant/index.ts new file mode 100644 index 00000000..a2d0bc05 --- /dev/null +++ b/services/stock/src/handlers/stock/ingredient_restaurant/index.ts @@ -0,0 +1,6 @@ +export * from "./get" +export * from "./get-by-restaurant" +export * from "./get-by-product" +export * from "./create" +export * from "./update" +export * from "./delete" \ No newline at end of file diff --git a/services/stock/src/handlers/stock/ingredient_restaurant/update.ts b/services/stock/src/handlers/stock/ingredient_restaurant/update.ts new file mode 100644 index 00000000..005bc3a5 --- /dev/null +++ b/services/stock/src/handlers/stock/ingredient_restaurant/update.ts @@ -0,0 +1,45 @@ +import { prisma } from "@stock/lib/prisma"; +import { log } from "@stock/lib/log"; +import { + UpdateIngredientRestaurantRequest, + IngredientRestaurant, +} from "@stock/types/stock"; +import { Data } from "@stock/types"; + +export const UpdateIngredientRestaurant = async ( + { request }: Data, + callback: (err: any, response: IngredientRestaurant | null) => void +) => { + try { + const { + id, + alert_threshold, + in_product_list, + ingredient_id, + price_per_kilo, + quantity, + restaurant_id, + supplier_id, + unit_price, + } = request; + const ingredient_restaurant = await prisma.ingredientRestaurant.update({ + where: { id }, + data: { + alert_threshold, + in_product_list, + ingredient_id, + price_per_kilo, + quantity, + restaurant_id, + supplier_id, + unit_price, + }, + include: { supplier: true, ingredient: true }, + }); + + callback(null, ingredient_restaurant); + } catch (error) { + log.error(error); + callback(error, null); + } +}; From 67efe85aa12c013dba051f10ffefb36a9602d200 Mon Sep 17 00:00:00 2001 From: Florian LEROUX Date: Fri, 7 Jul 2023 15:34:20 +0200 Subject: [PATCH 217/883] feat(supplier): add supplier handlers --- .../src/handlers/stock/supplier/create.ts | 22 +++++++++++++++++ .../src/handlers/stock/supplier/delete.ts | 24 +++++++++++++++++++ .../stock/src/handlers/stock/supplier/get.ts | 20 ++++++++++++++++ .../src/handlers/stock/supplier/index.ts | 5 ++++ .../stock/src/handlers/stock/supplier/list.ts | 17 +++++++++++++ .../src/handlers/stock/supplier/update.ts | 22 +++++++++++++++++ 6 files changed, 110 insertions(+) create mode 100644 services/stock/src/handlers/stock/supplier/create.ts create mode 100644 services/stock/src/handlers/stock/supplier/delete.ts create mode 100644 services/stock/src/handlers/stock/supplier/get.ts create mode 100644 services/stock/src/handlers/stock/supplier/index.ts create mode 100644 services/stock/src/handlers/stock/supplier/list.ts create mode 100644 services/stock/src/handlers/stock/supplier/update.ts diff --git a/services/stock/src/handlers/stock/supplier/create.ts b/services/stock/src/handlers/stock/supplier/create.ts new file mode 100644 index 00000000..3d5d8a95 --- /dev/null +++ b/services/stock/src/handlers/stock/supplier/create.ts @@ -0,0 +1,22 @@ +import { prisma } from "@stock/lib/prisma"; +import { log } from "@stock/lib/log"; +import { CreateSupplierRequest, Supplier } from "@stock/types/stock"; +import { Data } from "@stock/types"; + +export const CreateSupplier = async ( + { request }: Data, + callback: (err: any, response: Supplier | null) => void +) => { + try { + const { name, contact } = request; + + const supplier = await prisma.supplier.create({ + data: { name, contact }, + }); + + callback(null, supplier); + } catch (error) { + log.error(error); + callback(error, null); + } +}; diff --git a/services/stock/src/handlers/stock/supplier/delete.ts b/services/stock/src/handlers/stock/supplier/delete.ts new file mode 100644 index 00000000..69d314e2 --- /dev/null +++ b/services/stock/src/handlers/stock/supplier/delete.ts @@ -0,0 +1,24 @@ +import { prisma } from "@stock/lib/prisma"; +import { log } from "@stock/lib/log"; +import { + DeleteSupplierRequest, + DeleteSupplierResponse, +} from "@stock/types/stock"; +import { Data } from "@stock/types"; + +export const DeleteSupplier = async ( + { request }: Data, + callback: ( + err: any, + response: DeleteSupplierResponse | null + ) => void +) => { + try { + const { id } = request; + await prisma.supplier.delete({ where: { id } }); + callback(null, { success: true }); + } catch (error) { + log.error(error); + callback(error, { success: false }); + } +}; diff --git a/services/stock/src/handlers/stock/supplier/get.ts b/services/stock/src/handlers/stock/supplier/get.ts new file mode 100644 index 00000000..0454922c --- /dev/null +++ b/services/stock/src/handlers/stock/supplier/get.ts @@ -0,0 +1,20 @@ +import { prisma } from "@stock/lib/prisma"; +import { log } from "@stock/lib/log"; +import { GetSupplierRequest, Supplier } from "@stock/types/stock"; +import { Data } from "@stock/types"; + +export const GetSupplier = async ( + { request }: Data, + callback: (err: any, response: Supplier | null) => void +) => { + try { + const { id } = request; + const supplier = await prisma.supplier.findUniqueOrThrow({ + where: { id }, + }); + callback(null, supplier); + } catch (error) { + log.error(error); + callback(error, null); + } +}; diff --git a/services/stock/src/handlers/stock/supplier/index.ts b/services/stock/src/handlers/stock/supplier/index.ts new file mode 100644 index 00000000..fc3af4a4 --- /dev/null +++ b/services/stock/src/handlers/stock/supplier/index.ts @@ -0,0 +1,5 @@ +export * from "./get" +export * from "./list" +export * from "./create" +export * from "./update" +export * from "./delete" \ No newline at end of file diff --git a/services/stock/src/handlers/stock/supplier/list.ts b/services/stock/src/handlers/stock/supplier/list.ts new file mode 100644 index 00000000..8fff5997 --- /dev/null +++ b/services/stock/src/handlers/stock/supplier/list.ts @@ -0,0 +1,17 @@ +import { prisma } from "@stock/lib/prisma"; +import { log } from "@stock/lib/log"; +import { GetSuppliersResponse } from "@stock/types/stock"; +import { Data } from "@stock/types"; + +export const GetSuppliers = async ( + {}: Data, + callback: (err: any, response: GetSuppliersResponse | null) => void +) => { + try { + const suppliers = await prisma.supplier.findMany(); + callback(null, { suppliers }); + } catch (error) { + log.error(error); + callback(error, null); + } +}; diff --git a/services/stock/src/handlers/stock/supplier/update.ts b/services/stock/src/handlers/stock/supplier/update.ts new file mode 100644 index 00000000..d2578c24 --- /dev/null +++ b/services/stock/src/handlers/stock/supplier/update.ts @@ -0,0 +1,22 @@ +import { prisma } from "@stock/lib/prisma"; +import { log } from "@stock/lib/log"; +import { UpdateSupplierRequest, Supplier } from "@stock/types/stock"; +import { Data } from "@stock/types"; + +export const UpdateSupplier = async ( + { request }: Data, + callback: (err: any, response: Supplier | null) => void +) => { + try { + const { name, id, contact } = request; + const supplier = await prisma.supplier.update({ + where: { id }, + data: { name, contact }, + }); + + callback(null, supplier); + } catch (error) { + log.error(error); + callback(error, null); + } +}; From b93f41d347d432f6060414d8bd7a3911583bb322 Mon Sep 17 00:00:00 2001 From: Florian LEROUX Date: Fri, 7 Jul 2023 15:35:00 +0200 Subject: [PATCH 218/883] feat(supply_order): add supply_order handlers --- .../src/handlers/stock/supply_order/create.ts | 32 +++++++++++++++++ .../src/handlers/stock/supply_order/delete.ts | 21 +++++++++++ .../get-by-ingredient_restaurant.ts | 35 +++++++++++++++++++ .../stock/supply_order/get-by-restaurant.ts | 35 +++++++++++++++++++ .../stock/supply_order/get-by-supplier.ts | 35 +++++++++++++++++++ .../src/handlers/stock/supply_order/get.ts | 29 +++++++++++++++ .../src/handlers/stock/supply_order/index.ts | 7 ++++ .../src/handlers/stock/supply_order/update.ts | 32 +++++++++++++++++ 8 files changed, 226 insertions(+) create mode 100644 services/stock/src/handlers/stock/supply_order/create.ts create mode 100644 services/stock/src/handlers/stock/supply_order/delete.ts create mode 100644 services/stock/src/handlers/stock/supply_order/get-by-ingredient_restaurant.ts create mode 100644 services/stock/src/handlers/stock/supply_order/get-by-restaurant.ts create mode 100644 services/stock/src/handlers/stock/supply_order/get-by-supplier.ts create mode 100644 services/stock/src/handlers/stock/supply_order/get.ts create mode 100644 services/stock/src/handlers/stock/supply_order/index.ts create mode 100644 services/stock/src/handlers/stock/supply_order/update.ts diff --git a/services/stock/src/handlers/stock/supply_order/create.ts b/services/stock/src/handlers/stock/supply_order/create.ts new file mode 100644 index 00000000..4772203b --- /dev/null +++ b/services/stock/src/handlers/stock/supply_order/create.ts @@ -0,0 +1,32 @@ +import { prisma } from "@stock/lib/prisma"; +import { log } from "@stock/lib/log"; +import { CreateSupplyOrderRequest, SupplyOrder } from "@stock/types/stock"; +import { Data } from "@stock/types"; + +export const CreateSupplyOrder = async ( + { request }: Data, + callback: (err: any, response: SupplyOrder | null) => void +) => { + try { + const { ingredient_restaurant_id, quantity, supplier_id } = request; + + const { unit_price } = await prisma.ingredientRestaurant.findUniqueOrThrow({ + where: { id: ingredient_restaurant_id }, + }); + + const supply_order = await prisma.supplyOrder.create({ + data: { ingredient_restaurant_id, quantity, supplier_id, unit_price }, + include: { + supplier: true, + ingredient_restaurant: { + include: { ingredient: true, supplier: true }, + }, + }, + }); + + callback(null, supply_order); + } catch (error) { + log.error(error); + callback(error, null); + } +}; diff --git a/services/stock/src/handlers/stock/supply_order/delete.ts b/services/stock/src/handlers/stock/supply_order/delete.ts new file mode 100644 index 00000000..92206d4d --- /dev/null +++ b/services/stock/src/handlers/stock/supply_order/delete.ts @@ -0,0 +1,21 @@ +import { prisma } from "@stock/lib/prisma"; +import { log } from "@stock/lib/log"; +import { + DeleteSupplyOrderRequest, + DeleteSupplyOrderResponse, +} from "@stock/types/stock"; +import { Data } from "@stock/types"; + +export const DeleteSupplyOrder = async ( + { request }: Data, + callback: (err: any, response: DeleteSupplyOrderResponse | null) => void +) => { + try { + const { id } = request; + await prisma.supplyOrder.delete({ where: { id } }); + callback(null, { success: true }); + } catch (error) { + log.error(error); + callback(error, { success: false }); + } +}; diff --git a/services/stock/src/handlers/stock/supply_order/get-by-ingredient_restaurant.ts b/services/stock/src/handlers/stock/supply_order/get-by-ingredient_restaurant.ts new file mode 100644 index 00000000..45f30131 --- /dev/null +++ b/services/stock/src/handlers/stock/supply_order/get-by-ingredient_restaurant.ts @@ -0,0 +1,35 @@ +import { prisma } from "@stock/lib/prisma"; +import { log } from "@stock/lib/log"; +import { + GetSupplyOrdersByIngredientRestaurantRequest, + GetSupplyOrdersByIngredientRestaurantResponse, +} from "@stock/types/stock"; +import { Data } from "@stock/types"; + +export const GetSupplyOrdersByIngredientRestaurant = async ( + { request }: Data, + callback: ( + err: any, + response: GetSupplyOrdersByIngredientRestaurantResponse | null + ) => void +) => { + try { + const { ingredient_restaurant_id } = request; + const supply_orders = await prisma.supplyOrder.findMany({ + where: { ingredient_restaurant_id }, + include: { + supplier: true, + ingredient_restaurant: { + include: { + ingredient: true, + supplier: true, + }, + }, + }, + }); + callback(null, { supply_orders }); + } catch (error) { + log.error(error); + callback(error, null); + } +}; diff --git a/services/stock/src/handlers/stock/supply_order/get-by-restaurant.ts b/services/stock/src/handlers/stock/supply_order/get-by-restaurant.ts new file mode 100644 index 00000000..cb1b13de --- /dev/null +++ b/services/stock/src/handlers/stock/supply_order/get-by-restaurant.ts @@ -0,0 +1,35 @@ +import { prisma } from "@stock/lib/prisma"; +import { log } from "@stock/lib/log"; +import { + GetSupplyOrdersByRestaurantRequest, + GetSupplyOrdersByRestaurantResponse, +} from "@stock/types/stock"; +import { Data } from "@stock/types"; + +export const GetSupplyOrdersByRestaurant = async ( + { request }: Data, + callback: ( + err: any, + response: GetSupplyOrdersByRestaurantResponse | null + ) => void +) => { + try { + const { restaurant_id } = request; + const supply_orders = await prisma.supplyOrder.findMany({ + where: { ingredient_restaurant: { restaurant_id } }, + include: { + supplier: true, + ingredient_restaurant: { + include: { + ingredient: true, + supplier: true, + }, + }, + }, + }); + callback(null, { supply_orders }); + } catch (error) { + log.error(error); + callback(error, null); + } +}; diff --git a/services/stock/src/handlers/stock/supply_order/get-by-supplier.ts b/services/stock/src/handlers/stock/supply_order/get-by-supplier.ts new file mode 100644 index 00000000..868f14ce --- /dev/null +++ b/services/stock/src/handlers/stock/supply_order/get-by-supplier.ts @@ -0,0 +1,35 @@ +import { prisma } from "@stock/lib/prisma"; +import { log } from "@stock/lib/log"; +import { + GetSupplyOrdersBySupplierRequest, + GetSupplyOrdersBySupplierResponse, +} from "@stock/types/stock"; +import { Data } from "@stock/types"; + +export const GetSupplyOrdersBySupplier = async ( + { request }: Data, + callback: ( + err: any, + response: GetSupplyOrdersBySupplierResponse | null + ) => void +) => { + try { + const { supplier_id } = request; + const supply_orders = await prisma.supplyOrder.findMany({ + where: { supplier_id }, + include: { + supplier: true, + ingredient_restaurant: { + include: { + ingredient: true, + supplier: true, + }, + }, + }, + }); + callback(null, { supply_orders }); + } catch (error) { + log.error(error); + callback(error, null); + } +}; diff --git a/services/stock/src/handlers/stock/supply_order/get.ts b/services/stock/src/handlers/stock/supply_order/get.ts new file mode 100644 index 00000000..0abad41a --- /dev/null +++ b/services/stock/src/handlers/stock/supply_order/get.ts @@ -0,0 +1,29 @@ +import { prisma } from "@stock/lib/prisma"; +import { log } from "@stock/lib/log"; +import { GetSupplyOrderRequest, SupplyOrder } from "@stock/types/stock"; +import { Data } from "@stock/types"; + +export const GetSupplyOrder = async ( + { request }: Data, + callback: (err: any, response: SupplyOrder | null) => void +) => { + try { + const { id } = request; + const supply_order = await prisma.supplyOrder.findUniqueOrThrow({ + where: { id }, + include: { + supplier: true, + ingredient_restaurant: { + include: { + ingredient: true, + supplier: true, + }, + }, + }, + }); + callback(null, supply_order); + } catch (error) { + log.error(error); + callback(error, null); + } +}; diff --git a/services/stock/src/handlers/stock/supply_order/index.ts b/services/stock/src/handlers/stock/supply_order/index.ts new file mode 100644 index 00000000..0901c9f6 --- /dev/null +++ b/services/stock/src/handlers/stock/supply_order/index.ts @@ -0,0 +1,7 @@ +export * from "./get"; +export * from "./get-by-restaurant"; +export * from "./get-by-supplier"; +export * from "./get-by-ingredient_restaurant"; +export * from "./create"; +export * from "./update"; +export * from "./delete"; diff --git a/services/stock/src/handlers/stock/supply_order/update.ts b/services/stock/src/handlers/stock/supply_order/update.ts new file mode 100644 index 00000000..ab235585 --- /dev/null +++ b/services/stock/src/handlers/stock/supply_order/update.ts @@ -0,0 +1,32 @@ +import { prisma } from "@stock/lib/prisma"; +import { log } from "@stock/lib/log"; +import { UpdateSupplyOrderRequest, SupplyOrder } from "@stock/types/stock"; +import { Data } from "@stock/types"; + +export const UpdateSupplyOrder = async ( + { request }: Data, + callback: (err: any, response: SupplyOrder | null) => void +) => { + try { + const { id, ingredient_restaurant_id, quantity, supplier_id, unit_price } = + request; + const supply_order = await prisma.supplyOrder.update({ + where: { id }, + data: { ingredient_restaurant_id, quantity, supplier_id, unit_price }, + include: { + supplier: true, + ingredient_restaurant: { + include: { + ingredient: true, + supplier: true, + }, + }, + }, + }); + + callback(null, supply_order); + } catch (error) { + log.error(error); + callback(error, null); + } +}; From 5cf39da8162800f2dcac822c1843c6fc3d65cef9 Mon Sep 17 00:00:00 2001 From: Florian LEROUX Date: Fri, 7 Jul 2023 15:35:09 +0200 Subject: [PATCH 219/883] feat(handlers): add handlers --- services/stock/src/handlers/stock/index.ts | 64 +++++++++++++++++++++- 1 file changed, 63 insertions(+), 1 deletion(-) diff --git a/services/stock/src/handlers/stock/index.ts b/services/stock/src/handlers/stock/index.ts index 6caa1715..f93a3766 100644 --- a/services/stock/src/handlers/stock/index.ts +++ b/services/stock/src/handlers/stock/index.ts @@ -1,5 +1,67 @@ import { UntypedServiceImplementation } from "@grpc/grpc-js"; -const stockHandlers: UntypedServiceImplementation = {}; +import { + GetIngredient, + GetIngredients, + CreateIngredient, + UpdateIngredient, + DeleteIngredient, +} from "@stock/handlers/stock/ingredient"; + +import { + GetSupplier, + GetSuppliers, + CreateSupplier, + UpdateSupplier, + DeleteSupplier, +} from "@stock/handlers/stock/supplier"; + +import { + GetIngredientRestaurant, + GetIngredientRestaurantsByRestaurant, + GetIngredientRestaurantsByProduct, + CreateIngredientRestaurant, + UpdateIngredientRestaurant, + DeleteIngredientRestaurant, +} from "@stock/handlers/stock/ingredient_restaurant"; + +import { + GetSupplyOrder, + GetSupplyOrdersByIngredientRestaurant, + GetSupplyOrdersByRestaurant, + GetSupplyOrdersBySupplier, + CreateSupplyOrder, + UpdateSupplyOrder, + DeleteSupplyOrder, +} from "@stock/handlers/stock/supply_order"; + +const stockHandlers: UntypedServiceImplementation = { + GetIngredient, + GetIngredients, + CreateIngredient, + UpdateIngredient, + DeleteIngredient, + + GetSupplier, + GetSuppliers, + CreateSupplier, + UpdateSupplier, + DeleteSupplier, + + GetIngredientRestaurant, + GetIngredientRestaurantsByRestaurant, + GetIngredientRestaurantsByProduct, + CreateIngredientRestaurant, + UpdateIngredientRestaurant, + DeleteIngredientRestaurant, + + GetSupplyOrder, + GetSupplyOrdersByIngredientRestaurant, + GetSupplyOrdersByRestaurant, + GetSupplyOrdersBySupplier, + CreateSupplyOrder, + UpdateSupplyOrder, + DeleteSupplyOrder, +}; export default stockHandlers; From b88b2e8703f2e588b5494ab83867f98cf8ab34d7 Mon Sep 17 00:00:00 2001 From: Florian LEROUX Date: Fri, 7 Jul 2023 15:49:20 +0200 Subject: [PATCH 220/883] fix(ci): fix publish step --- services/stock/Dockerfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/services/stock/Dockerfile b/services/stock/Dockerfile index f4393675..713afa23 100644 --- a/services/stock/Dockerfile +++ b/services/stock/Dockerfile @@ -4,7 +4,7 @@ FROM node:18-alpine3.17 as builder WORKDIR /app # Copy the application code -COPY ./order/ . +COPY ./stock/ . # Install dependencies RUN npm install @@ -35,4 +35,4 @@ COPY --from=builder /app/node_modules/.prisma /.prisma EXPOSE 50009 # Start the server -CMD [ "node", "index.js"] +CMD ["node", "index.js"] From 28b139d26706c33252aee6372d67fbd754409794 Mon Sep 17 00:00:00 2001 From: Florian LEROUX Date: Fri, 7 Jul 2023 15:55:12 +0200 Subject: [PATCH 221/883] fix(ci): add stock ci/cd --- .github/workflows/order.yml | 2 +- .github/workflows/stock.yml | 69 +++++++++++++++++++++++++++++++++++++ 2 files changed, 70 insertions(+), 1 deletion(-) create mode 100644 .github/workflows/stock.yml diff --git a/.github/workflows/order.yml b/.github/workflows/order.yml index 0dd23e28..5ef162bd 100644 --- a/.github/workflows/order.yml +++ b/.github/workflows/order.yml @@ -4,7 +4,7 @@ on: push: branches: [ order ] pull_request: - branches: [ dev, main ] + branches: [ main ] jobs: build: diff --git a/.github/workflows/stock.yml b/.github/workflows/stock.yml new file mode 100644 index 00000000..4299c60f --- /dev/null +++ b/.github/workflows/stock.yml @@ -0,0 +1,69 @@ +name: Stock Microservice CI/CD + +on: + push: + branches: [ stock ] + pull_request: + branches: [ main ] + +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@master + - uses: pnpm/action-setup@v2 + with: + version: latest + - uses: actions/setup-node@v3 + with: + node-version: "18.x" + cache: "pnpm" + cache-dependency-path: services/stock/pnpm-lock.yaml + - name: Install dependencies + run: | + cd ./services/stock + pnpm install --frozen-lockfile + - name: Build + run: | + cd ./services/stock + pnpm build + + test: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@master + - uses: pnpm/action-setup@v2 + with: + version: latest + - uses: actions/setup-node@v3 + with: + node-version: "18.x" + cache: "pnpm" + cache-dependency-path: services/stock/pnpm-lock.yaml + - name: Install dependencies + run: | + cd ./services/stock + pnpm install --frozen-lockfile + - name: Execute tests + run: | + cd ./services/stock + pnpm test + + publish: + runs-on: ubuntu-latest + needs: [ build, test ] + steps: + - name: Checkout code + uses: actions/checkout@master + - name: Login to Docker Hub + uses: docker/login-action@v2 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + - name: Build and push + uses: docker/build-push-action@v4 + with: + context: ./services/ + file: ./services/stock/Dockerfile + push: true + tags: floriaaan/goodfood-stock:latest \ No newline at end of file From e60f21ed3a96a6bf9eea5a2ab0ab60a0b9bd0a94 Mon Sep 17 00:00:00 2001 From: Florian LEROUX Date: Fri, 7 Jul 2023 16:00:22 +0200 Subject: [PATCH 222/883] fix(ci): remove lib --- services/stock/package.json | 5 +- services/stock/pnpm-lock.yaml | 201 ---------------------------------- 2 files changed, 2 insertions(+), 204 deletions(-) diff --git a/services/stock/package.json b/services/stock/package.json index 7bb3862d..8fd87b8f 100644 --- a/services/stock/package.json +++ b/services/stock/package.json @@ -1,5 +1,6 @@ { "name": "@goodfood/stock", + "version": "1.0.0", "bin": "dist/index.js", "scripts": { "start": "node dist/index.js", @@ -23,7 +24,6 @@ "devDependencies": { "@types/amqplib": "^0.10.1", "@types/node": "18.15.9", - "@vitest/coverage-c8": "^0.29.8", "esbuild": "^0.17.18", "grpc-tools": "^1.12.4", "nodemon": "^2.0.22", @@ -33,8 +33,7 @@ "tsconfig-paths": "^4.2.0", "typescript": "5.0.2", "vite-tsconfig-paths": "^4.2.0", - "vitest": "^0.29.8", - "vitest-mock-extended": "^1.1.3" + "vitest": "^0.29.8" }, "prisma": { "seed": "ts-node prisma/seed.ts" diff --git a/services/stock/pnpm-lock.yaml b/services/stock/pnpm-lock.yaml index 717d3148..18c44778 100644 --- a/services/stock/pnpm-lock.yaml +++ b/services/stock/pnpm-lock.yaml @@ -34,9 +34,6 @@ devDependencies: '@types/node': specifier: 18.15.9 version: 18.15.9 - '@vitest/coverage-c8': - specifier: ^0.29.8 - version: 0.29.8(vitest@0.29.8) esbuild: specifier: ^0.17.18 version: 0.17.18 @@ -67,9 +64,6 @@ devDependencies: vitest: specifier: ^0.29.8 version: 0.29.8 - vitest-mock-extended: - specifier: ^1.1.3 - version: 1.1.3(typescript@5.0.2)(vitest@0.29.8) packages: @@ -120,10 +114,6 @@ packages: 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'} @@ -547,11 +537,6 @@ packages: yargs: 16.2.0 dev: false - /@istanbuljs/schema@0.1.3: - resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} - engines: {node: '>=8'} - dev: true - /@jridgewell/gen-mapping@0.3.3: resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==} engines: {node: '>=6.0.0'} @@ -734,10 +719,6 @@ packages: resolution: {integrity: sha512-mEo1sAde+UCE6b2hxn332f1g1E8WfYRu6p5SvTKr2ZKC1f7gFJXk4h5PyGP9Dt6gCaG8y8XhwnXWC6Iy2cmBng==} dev: true - /@types/istanbul-lib-coverage@2.0.4: - resolution: {integrity: sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==} - dev: true - /@types/long@4.0.2: resolution: {integrity: sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==} dev: false @@ -745,17 +726,6 @@ packages: /@types/node@18.15.9: resolution: {integrity: sha512-dUxhiNzBLr6IqlZXz6e/rN2YQXlFgOei/Dxy+e3cyXTJ4txSUbGT2/fmnD6zd/75jDMeW5bDee+YXxlFKHoV0A==} - /@vitest/coverage-c8@0.29.8(vitest@0.29.8): - resolution: {integrity: sha512-y+sEMQMctWokjnSqm3FCQEYFkjLrYaznsxEZHxcx8z2aftpYg3A5tvI1S5himfdEFo7o+OeHzh40bPSWZHW4oQ==} - peerDependencies: - vitest: '>=0.29.0 <1' - dependencies: - c8: 7.14.0 - picocolors: 1.0.0 - std-env: 3.3.3 - vitest: 0.29.8 - dev: true - /@vitest/expect@0.29.8: resolution: {integrity: sha512-xlcVXn5I5oTq6NiZSY3ykyWixBxr5mG8HYtjvpgg6KaqHm0mvhX18xuwl5YGxIRNt/A5jidd7CWcNHrSvgaQqQ==} dependencies: @@ -932,25 +902,6 @@ packages: ieee754: 1.2.1 dev: true - /c8@7.14.0: - resolution: {integrity: sha512-i04rtkkcNcCf7zsQcSv/T9EbUn4RXQ6mropeMcjFOsQXQ0iGLAr/xT6TImQg4+U9hmNpN9XdvPkjUL1IzbgxJw==} - engines: {node: '>=10.12.0'} - hasBin: true - dependencies: - '@bcoe/v8-coverage': 0.2.3 - '@istanbuljs/schema': 0.1.3 - find-up: 5.0.0 - foreground-child: 2.0.0 - istanbul-lib-coverage: 3.2.0 - istanbul-lib-report: 3.0.0 - istanbul-reports: 3.1.5 - rimraf: 3.0.2 - test-exclude: 6.0.0 - v8-to-istanbul: 9.1.0 - yargs: 16.2.0 - yargs-parser: 20.2.9 - dev: true - /cac@6.7.14: resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} engines: {node: '>=8'} @@ -1042,10 +993,6 @@ packages: resolution: {integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==} dev: true - /convert-source-map@1.9.0: - resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} - dev: true - /core-util-is@1.0.3: resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} @@ -1053,15 +1000,6 @@ packages: resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} dev: true - /cross-spawn@7.0.3: - resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} - engines: {node: '>= 8'} - dependencies: - path-key: 3.1.1 - shebang-command: 2.0.0 - which: 2.0.2 - dev: true - /debug@3.2.7(supports-color@5.5.0): resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} peerDependencies: @@ -1245,22 +1183,6 @@ packages: to-regex-range: 5.0.1 dev: true - /find-up@5.0.0: - resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} - engines: {node: '>=10'} - dependencies: - locate-path: 6.0.0 - path-exists: 4.0.0 - dev: true - - /foreground-child@2.0.0: - resolution: {integrity: sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==} - engines: {node: '>=8.0.0'} - dependencies: - cross-spawn: 7.0.3 - signal-exit: 3.0.7 - dev: true - /from2@2.3.0: resolution: {integrity: sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==} dependencies: @@ -1412,10 +1334,6 @@ packages: function-bind: 1.1.1 dev: true - /html-escaper@2.0.2: - resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} - dev: true - /https-proxy-agent@5.0.1: resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} engines: {node: '>= 6'} @@ -1514,32 +1432,6 @@ packages: resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} dev: true - /isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - dev: true - - /istanbul-lib-coverage@3.2.0: - resolution: {integrity: sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==} - engines: {node: '>=8'} - dev: true - - /istanbul-lib-report@3.0.0: - resolution: {integrity: sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==} - engines: {node: '>=8'} - dependencies: - istanbul-lib-coverage: 3.2.0 - make-dir: 3.1.0 - supports-color: 7.2.0 - dev: true - - /istanbul-reports@3.1.5: - resolution: {integrity: sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==} - engines: {node: '>=8'} - dependencies: - html-escaper: 2.0.2 - istanbul-lib-report: 3.0.0 - dev: true - /jsesc@2.5.2: resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} engines: {node: '>=4'} @@ -1569,13 +1461,6 @@ packages: engines: {node: '>=14'} dev: true - /locate-path@6.0.0: - resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} - engines: {node: '>=10'} - dependencies: - p-locate: 5.0.0 - dev: true - /lodash.camelcase@4.3.0: resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} dev: false @@ -1784,13 +1669,6 @@ packages: engines: {node: '>=8'} dev: true - /p-limit@3.1.0: - resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} - engines: {node: '>=10'} - dependencies: - yocto-queue: 0.1.0 - dev: true - /p-limit@4.0.0: resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -1798,28 +1676,11 @@ packages: yocto-queue: 1.0.0 dev: true - /p-locate@5.0.0: - resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} - engines: {node: '>=10'} - dependencies: - p-limit: 3.1.0 - dev: true - - /path-exists@4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} - dev: true - /path-is-absolute@1.0.1: resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} engines: {node: '>=0.10.0'} dev: true - /path-key@3.1.1: - resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} - engines: {node: '>=8'} - dev: true - /path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} dev: true @@ -2119,18 +1980,6 @@ packages: resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} dev: true - /shebang-command@2.0.0: - resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} - engines: {node: '>=8'} - dependencies: - shebang-regex: 3.0.0 - dev: true - - /shebang-regex@3.0.0: - resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} - engines: {node: '>=8'} - dev: true - /siginfo@2.0.0: resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} dev: true @@ -2308,15 +2157,6 @@ packages: yallist: 4.0.0 dev: true - /test-exclude@6.0.0: - resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} - engines: {node: '>=8'} - dependencies: - '@istanbuljs/schema': 0.1.3 - glob: 7.2.3 - minimatch: 3.1.2 - dev: true - /tinybench@2.5.0: resolution: {integrity: sha512-kRwSG8Zx4tjF9ZiyH4bhaebu+EDz1BOx9hOigYHlUW4xxI/wKIUQUqo018UlU4ar6ATPBsaMrdbKZ+tmPdohFA==} dev: true @@ -2354,14 +2194,6 @@ packages: resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} dev: true - /ts-essentials@9.3.2(typescript@5.0.2): - resolution: {integrity: sha512-JxKJzuWqH1MmH4ZFHtJzGEhkfN3QvVR3C3w+4BIoWeoY68UVVoA2Np/Bca9z0IPSErVCWhv439aT0We4Dks8kQ==} - peerDependencies: - typescript: '>=4.1.0' - dependencies: - typescript: 5.0.2 - dev: true - /ts-node@10.9.1(@types/node@18.15.9)(typescript@5.0.2): resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} hasBin: true @@ -2460,15 +2292,6 @@ packages: resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} dev: true - /v8-to-istanbul@9.1.0: - resolution: {integrity: sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA==} - engines: {node: '>=10.12.0'} - dependencies: - '@jridgewell/trace-mapping': 0.3.18 - '@types/istanbul-lib-coverage': 2.0.4 - convert-source-map: 1.9.0 - dev: true - /vite-node@0.29.8(@types/node@18.15.9): resolution: {integrity: sha512-b6OtCXfk65L6SElVM20q5G546yu10/kNrhg08afEoWlFRJXFq9/6glsvSVY+aI6YeC1tu2TtAqI2jHEQmOmsFw==} engines: {node: '>=v14.16.0'} @@ -2543,17 +2366,6 @@ packages: fsevents: 2.3.2 dev: true - /vitest-mock-extended@1.1.3(typescript@5.0.2)(vitest@0.29.8): - resolution: {integrity: sha512-MiaKYZbTg+fjozKnCpoTTva0BnlSNYyk4jiPuM2xVhg4aou112QIrALdH3/ZKK6qfXWh0A17gFIjWJjylOlXxg==} - peerDependencies: - typescript: 3.x || 4.x || 5.x - vitest: '>=0.29.2' - dependencies: - ts-essentials: 9.3.2(typescript@5.0.2) - typescript: 5.0.2 - vitest: 0.29.8 - dev: true - /vitest@0.29.8: resolution: {integrity: sha512-JIAVi2GK5cvA6awGpH0HvH/gEG9PZ0a/WoxdiV3PmqK+3CjQMf8c+J/Vhv4mdZ2nRyXFw66sAg6qz7VNkaHfDQ==} engines: {node: '>=v14.16.0'} @@ -2630,14 +2442,6 @@ packages: webidl-conversions: 3.0.1 dev: true - /which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} - hasBin: true - dependencies: - isexe: 2.0.0 - dev: true - /why-is-node-running@2.2.2: resolution: {integrity: sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==} engines: {node: '>=8'} @@ -2694,11 +2498,6 @@ packages: engines: {node: '>=6'} dev: true - /yocto-queue@0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} - engines: {node: '>=10'} - dev: true - /yocto-queue@1.0.0: resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} engines: {node: '>=12.20'} From f452ebb991f86a4a9ffcf4106c2d47ff4b418cbc Mon Sep 17 00:00:00 2001 From: anatole Date: Fri, 7 Jul 2023 16:07:47 +0200 Subject: [PATCH 223/883] feat(user service): fix validate user route --- services/user/src/main.go | 2 +- services/user/src/pkg/services/auth.go | 18 +++++++++++------- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/services/user/src/main.go b/services/user/src/main.go index 43533470..3bec1583 100644 --- a/services/user/src/main.go +++ b/services/user/src/main.go @@ -31,7 +31,7 @@ func main() { jwt := utils.JwtWrapper{ SecretKey: c.JWTSecretKey, Issuer: "go-grpc-auth-svc", - ExpirationHours: 24 * 365, + ExpirationHours: 1, } logger.Infof("Starting server at ", c.Port) diff --git a/services/user/src/pkg/services/auth.go b/services/user/src/pkg/services/auth.go index ca530617..f520ee71 100644 --- a/services/user/src/pkg/services/auth.go +++ b/services/user/src/pkg/services/auth.go @@ -2,11 +2,13 @@ package services import ( "context" + "errors" "goodfood-user/pkg/db" "goodfood-user/pkg/mapper" "goodfood-user/pkg/models" "goodfood-user/pkg/utils" pb "goodfood-user/proto" + "time" ) type Server struct { @@ -58,7 +60,7 @@ func (s *Server) LogIn(_ context.Context, req *pb.LogInInput) (*pb.LogInResponse } func (s *Server) Validate(_ context.Context, req *pb.ValidateInput) (*pb.ValidateResponse, error) { - claims, err := s.Jwt.ValidateToken(req.Token) + token, err := s.Jwt.ParseToken(req.Token) if err != nil { return &pb.ValidateResponse{ @@ -66,15 +68,17 @@ func (s *Server) Validate(_ context.Context, req *pb.ValidateInput) (*pb.Validat }, nil } - var user models.User + claims, ok := token.Claims.(*utils.JwtClaims) - if result := s.H.DB.Where(&models.User{Email: claims.Email}).First(&user); result.Error != nil { - return &pb.ValidateResponse{ - Error: "User not found", - }, nil + if !ok { + return nil, errors.New("couldn't parse claims") + } + + if claims.ExpiresAt < time.Now().Local().Add(-time.Hour*1).Unix() { + return nil, errors.New("JWT is expired") } return &pb.ValidateResponse{ - UserId: user.Id, + UserId: claims.Id, }, nil } From 58fccdd925b4ccf4c250d953a4deb2a8a80020ac Mon Sep 17 00:00:00 2001 From: anatole Date: Fri, 7 Jul 2023 16:16:51 +0200 Subject: [PATCH 224/883] feat(user service): fix change password user route --- services/user/src/pkg/services/user.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/services/user/src/pkg/services/user.go b/services/user/src/pkg/services/user.go index 8b1e599f..8525ca28 100644 --- a/services/user/src/pkg/services/user.go +++ b/services/user/src/pkg/services/user.go @@ -73,7 +73,7 @@ func (s *Server) ChangePassword(_ context.Context, req *pb.ChangePasswordInput) } var user models.User - if result := s.H.DB.Where(&models.User{Id: claims.Id}); result.Error != nil { + if result := s.H.DB.Where(&models.User{Id: claims.Id}).First(&user); result.Error != nil { return &pb.ChangePasswordOutput{ Error: "User not found", }, nil @@ -81,7 +81,7 @@ func (s *Server) ChangePassword(_ context.Context, req *pb.ChangePasswordInput) user.Password = utils.HashPassword(req.NewPassword) - s.H.DB.Save(&user) + s.H.DB.Updates(&user) return &pb.ChangePasswordOutput{ User: mapper.ToProtoUser(&user), From 3cce5f545c6d277a12e2db4037af5c9bdd10bf43 Mon Sep 17 00:00:00 2001 From: anatole Date: Fri, 7 Jul 2023 16:32:07 +0200 Subject: [PATCH 225/883] feat(main address service): fix get main address route --- services/proto/user.pb.go | 640 ++++++++++-------- services/proto/user.proto | 21 +- services/proto/user_grpc.pb.go | 10 +- services/user/src/main.go | 9 +- services/user/src/pkg/services/mainAddress.go | 23 +- services/user/src/pkg/services/user.go | 14 +- 6 files changed, 412 insertions(+), 305 deletions(-) diff --git a/services/proto/user.pb.go b/services/proto/user.pb.go index fa698977..7c776618 100644 --- a/services/proto/user.pb.go +++ b/services/proto/user.pb.go @@ -392,6 +392,61 @@ func (x *UserOutput) GetError() string { return "" } +type MainAddressOutput struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + MainAddress *MainAddress `protobuf:"bytes,1,opt,name=mainAddress,proto3" json:"mainAddress,omitempty"` + Error string `protobuf:"bytes,2,opt,name=error,proto3" json:"error,omitempty"` +} + +func (x *MainAddressOutput) Reset() { + *x = MainAddressOutput{} + if protoimpl.UnsafeEnabled { + mi := &file_user_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *MainAddressOutput) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*MainAddressOutput) ProtoMessage() {} + +func (x *MainAddressOutput) ProtoReflect() protoreflect.Message { + mi := &file_user_proto_msgTypes[5] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use MainAddressOutput.ProtoReflect.Descriptor instead. +func (*MainAddressOutput) Descriptor() ([]byte, []int) { + return file_user_proto_rawDescGZIP(), []int{5} +} + +func (x *MainAddressOutput) GetMainAddress() *MainAddress { + if x != nil { + return x.MainAddress + } + return nil +} + +func (x *MainAddressOutput) GetError() string { + if x != nil { + return x.Error + } + return "" +} + type UserCreateInput struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -409,7 +464,7 @@ type UserCreateInput struct { func (x *UserCreateInput) Reset() { *x = UserCreateInput{} if protoimpl.UnsafeEnabled { - mi := &file_user_proto_msgTypes[5] + mi := &file_user_proto_msgTypes[6] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -422,7 +477,7 @@ func (x *UserCreateInput) String() string { func (*UserCreateInput) ProtoMessage() {} func (x *UserCreateInput) ProtoReflect() protoreflect.Message { - mi := &file_user_proto_msgTypes[5] + mi := &file_user_proto_msgTypes[6] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -435,7 +490,7 @@ func (x *UserCreateInput) ProtoReflect() protoreflect.Message { // Deprecated: Use UserCreateInput.ProtoReflect.Descriptor instead. func (*UserCreateInput) Descriptor() ([]byte, []int) { - return file_user_proto_rawDescGZIP(), []int{5} + return file_user_proto_rawDescGZIP(), []int{6} } func (x *UserCreateInput) GetFirstName() string { @@ -502,7 +557,7 @@ type MainAddressInput struct { func (x *MainAddressInput) Reset() { *x = MainAddressInput{} if protoimpl.UnsafeEnabled { - mi := &file_user_proto_msgTypes[6] + mi := &file_user_proto_msgTypes[7] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -515,7 +570,7 @@ func (x *MainAddressInput) String() string { func (*MainAddressInput) ProtoMessage() {} func (x *MainAddressInput) ProtoReflect() protoreflect.Message { - mi := &file_user_proto_msgTypes[6] + mi := &file_user_proto_msgTypes[7] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -528,7 +583,7 @@ func (x *MainAddressInput) ProtoReflect() protoreflect.Message { // Deprecated: Use MainAddressInput.ProtoReflect.Descriptor instead. func (*MainAddressInput) Descriptor() ([]byte, []int) { - return file_user_proto_rawDescGZIP(), []int{6} + return file_user_proto_rawDescGZIP(), []int{7} } func (x *MainAddressInput) GetStreet() string { @@ -577,7 +632,7 @@ type RoleInput struct { func (x *RoleInput) Reset() { *x = RoleInput{} if protoimpl.UnsafeEnabled { - mi := &file_user_proto_msgTypes[7] + mi := &file_user_proto_msgTypes[8] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -590,7 +645,7 @@ func (x *RoleInput) String() string { func (*RoleInput) ProtoMessage() {} func (x *RoleInput) ProtoReflect() protoreflect.Message { - mi := &file_user_proto_msgTypes[7] + mi := &file_user_proto_msgTypes[8] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -603,7 +658,7 @@ func (x *RoleInput) ProtoReflect() protoreflect.Message { // Deprecated: Use RoleInput.ProtoReflect.Descriptor instead. func (*RoleInput) Descriptor() ([]byte, []int) { - return file_user_proto_rawDescGZIP(), []int{7} + return file_user_proto_rawDescGZIP(), []int{8} } func (x *RoleInput) GetCode() string { @@ -624,7 +679,7 @@ type UserId struct { func (x *UserId) Reset() { *x = UserId{} if protoimpl.UnsafeEnabled { - mi := &file_user_proto_msgTypes[8] + mi := &file_user_proto_msgTypes[9] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -637,7 +692,7 @@ func (x *UserId) String() string { func (*UserId) ProtoMessage() {} func (x *UserId) ProtoReflect() protoreflect.Message { - mi := &file_user_proto_msgTypes[8] + mi := &file_user_proto_msgTypes[9] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -650,7 +705,7 @@ func (x *UserId) ProtoReflect() protoreflect.Message { // Deprecated: Use UserId.ProtoReflect.Descriptor instead. func (*UserId) Descriptor() ([]byte, []int) { - return file_user_proto_rawDescGZIP(), []int{8} + return file_user_proto_rawDescGZIP(), []int{9} } func (x *UserId) GetId() uint64 { @@ -672,7 +727,7 @@ type UserList struct { func (x *UserList) Reset() { *x = UserList{} if protoimpl.UnsafeEnabled { - mi := &file_user_proto_msgTypes[9] + mi := &file_user_proto_msgTypes[10] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -685,7 +740,7 @@ func (x *UserList) String() string { func (*UserList) ProtoMessage() {} func (x *UserList) ProtoReflect() protoreflect.Message { - mi := &file_user_proto_msgTypes[9] + mi := &file_user_proto_msgTypes[10] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -698,7 +753,7 @@ func (x *UserList) ProtoReflect() protoreflect.Message { // Deprecated: Use UserList.ProtoReflect.Descriptor instead. func (*UserList) Descriptor() ([]byte, []int) { - return file_user_proto_rawDescGZIP(), []int{9} + return file_user_proto_rawDescGZIP(), []int{10} } func (x *UserList) GetError() string { @@ -727,7 +782,7 @@ type LogInInput struct { func (x *LogInInput) Reset() { *x = LogInInput{} if protoimpl.UnsafeEnabled { - mi := &file_user_proto_msgTypes[10] + mi := &file_user_proto_msgTypes[11] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -740,7 +795,7 @@ func (x *LogInInput) String() string { func (*LogInInput) ProtoMessage() {} func (x *LogInInput) ProtoReflect() protoreflect.Message { - mi := &file_user_proto_msgTypes[10] + mi := &file_user_proto_msgTypes[11] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -753,7 +808,7 @@ func (x *LogInInput) ProtoReflect() protoreflect.Message { // Deprecated: Use LogInInput.ProtoReflect.Descriptor instead. func (*LogInInput) Descriptor() ([]byte, []int) { - return file_user_proto_rawDescGZIP(), []int{10} + return file_user_proto_rawDescGZIP(), []int{11} } func (x *LogInInput) GetEmail() string { @@ -781,7 +836,7 @@ type ValidateInput struct { func (x *ValidateInput) Reset() { *x = ValidateInput{} if protoimpl.UnsafeEnabled { - mi := &file_user_proto_msgTypes[11] + mi := &file_user_proto_msgTypes[12] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -794,7 +849,7 @@ func (x *ValidateInput) String() string { func (*ValidateInput) ProtoMessage() {} func (x *ValidateInput) ProtoReflect() protoreflect.Message { - mi := &file_user_proto_msgTypes[11] + mi := &file_user_proto_msgTypes[12] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -807,7 +862,7 @@ func (x *ValidateInput) ProtoReflect() protoreflect.Message { // Deprecated: Use ValidateInput.ProtoReflect.Descriptor instead. func (*ValidateInput) Descriptor() ([]byte, []int) { - return file_user_proto_rawDescGZIP(), []int{11} + return file_user_proto_rawDescGZIP(), []int{12} } func (x *ValidateInput) GetToken() string { @@ -829,7 +884,7 @@ type DeleteInput struct { func (x *DeleteInput) Reset() { *x = DeleteInput{} if protoimpl.UnsafeEnabled { - mi := &file_user_proto_msgTypes[12] + mi := &file_user_proto_msgTypes[13] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -842,7 +897,7 @@ func (x *DeleteInput) String() string { func (*DeleteInput) ProtoMessage() {} func (x *DeleteInput) ProtoReflect() protoreflect.Message { - mi := &file_user_proto_msgTypes[12] + mi := &file_user_proto_msgTypes[13] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -855,7 +910,7 @@ func (x *DeleteInput) ProtoReflect() protoreflect.Message { // Deprecated: Use DeleteInput.ProtoReflect.Descriptor instead. func (*DeleteInput) Descriptor() ([]byte, []int) { - return file_user_proto_rawDescGZIP(), []int{12} + return file_user_proto_rawDescGZIP(), []int{13} } func (x *DeleteInput) GetToken() string { @@ -884,7 +939,7 @@ type ValidateResponse struct { func (x *ValidateResponse) Reset() { *x = ValidateResponse{} if protoimpl.UnsafeEnabled { - mi := &file_user_proto_msgTypes[13] + mi := &file_user_proto_msgTypes[14] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -897,7 +952,7 @@ func (x *ValidateResponse) String() string { func (*ValidateResponse) ProtoMessage() {} func (x *ValidateResponse) ProtoReflect() protoreflect.Message { - mi := &file_user_proto_msgTypes[13] + mi := &file_user_proto_msgTypes[14] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -910,7 +965,7 @@ func (x *ValidateResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ValidateResponse.ProtoReflect.Descriptor instead. func (*ValidateResponse) Descriptor() ([]byte, []int) { - return file_user_proto_rawDescGZIP(), []int{13} + return file_user_proto_rawDescGZIP(), []int{14} } func (x *ValidateResponse) GetError() string { @@ -940,7 +995,7 @@ type LogInResponse struct { func (x *LogInResponse) Reset() { *x = LogInResponse{} if protoimpl.UnsafeEnabled { - mi := &file_user_proto_msgTypes[14] + mi := &file_user_proto_msgTypes[15] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -953,7 +1008,7 @@ func (x *LogInResponse) String() string { func (*LogInResponse) ProtoMessage() {} func (x *LogInResponse) ProtoReflect() protoreflect.Message { - mi := &file_user_proto_msgTypes[14] + mi := &file_user_proto_msgTypes[15] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -966,7 +1021,7 @@ func (x *LogInResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use LogInResponse.ProtoReflect.Descriptor instead. func (*LogInResponse) Descriptor() ([]byte, []int) { - return file_user_proto_rawDescGZIP(), []int{14} + return file_user_proto_rawDescGZIP(), []int{15} } func (x *LogInResponse) GetUser() *User { @@ -1003,7 +1058,7 @@ type ChangePasswordInput struct { func (x *ChangePasswordInput) Reset() { *x = ChangePasswordInput{} if protoimpl.UnsafeEnabled { - mi := &file_user_proto_msgTypes[15] + mi := &file_user_proto_msgTypes[16] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1016,7 +1071,7 @@ func (x *ChangePasswordInput) String() string { func (*ChangePasswordInput) ProtoMessage() {} func (x *ChangePasswordInput) ProtoReflect() protoreflect.Message { - mi := &file_user_proto_msgTypes[15] + mi := &file_user_proto_msgTypes[16] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1029,7 +1084,7 @@ func (x *ChangePasswordInput) ProtoReflect() protoreflect.Message { // Deprecated: Use ChangePasswordInput.ProtoReflect.Descriptor instead. func (*ChangePasswordInput) Descriptor() ([]byte, []int) { - return file_user_proto_rawDescGZIP(), []int{15} + return file_user_proto_rawDescGZIP(), []int{16} } func (x *ChangePasswordInput) GetToken() string { @@ -1065,7 +1120,7 @@ type ChangePasswordOutput struct { func (x *ChangePasswordOutput) Reset() { *x = ChangePasswordOutput{} if protoimpl.UnsafeEnabled { - mi := &file_user_proto_msgTypes[16] + mi := &file_user_proto_msgTypes[17] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1078,7 +1133,7 @@ func (x *ChangePasswordOutput) String() string { func (*ChangePasswordOutput) ProtoMessage() {} func (x *ChangePasswordOutput) ProtoReflect() protoreflect.Message { - mi := &file_user_proto_msgTypes[16] + mi := &file_user_proto_msgTypes[17] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1091,7 +1146,7 @@ func (x *ChangePasswordOutput) ProtoReflect() protoreflect.Message { // Deprecated: Use ChangePasswordOutput.ProtoReflect.Descriptor instead. func (*ChangePasswordOutput) Descriptor() ([]byte, []int) { - return file_user_proto_rawDescGZIP(), []int{16} + return file_user_proto_rawDescGZIP(), []int{17} } func (x *ChangePasswordOutput) GetUser() *User { @@ -1121,7 +1176,7 @@ type ChangeRoleInput struct { func (x *ChangeRoleInput) Reset() { *x = ChangeRoleInput{} if protoimpl.UnsafeEnabled { - mi := &file_user_proto_msgTypes[17] + mi := &file_user_proto_msgTypes[18] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1134,7 +1189,7 @@ func (x *ChangeRoleInput) String() string { func (*ChangeRoleInput) ProtoMessage() {} func (x *ChangeRoleInput) ProtoReflect() protoreflect.Message { - mi := &file_user_proto_msgTypes[17] + mi := &file_user_proto_msgTypes[18] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1147,7 +1202,7 @@ func (x *ChangeRoleInput) ProtoReflect() protoreflect.Message { // Deprecated: Use ChangeRoleInput.ProtoReflect.Descriptor instead. func (*ChangeRoleInput) Descriptor() ([]byte, []int) { - return file_user_proto_rawDescGZIP(), []int{17} + return file_user_proto_rawDescGZIP(), []int{18} } func (x *ChangeRoleInput) GetToken() string { @@ -1183,7 +1238,7 @@ type DeleteUserOutput struct { func (x *DeleteUserOutput) Reset() { *x = DeleteUserOutput{} if protoimpl.UnsafeEnabled { - mi := &file_user_proto_msgTypes[18] + mi := &file_user_proto_msgTypes[19] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1196,7 +1251,7 @@ func (x *DeleteUserOutput) String() string { func (*DeleteUserOutput) ProtoMessage() {} func (x *DeleteUserOutput) ProtoReflect() protoreflect.Message { - mi := &file_user_proto_msgTypes[18] + mi := &file_user_proto_msgTypes[19] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1209,7 +1264,7 @@ func (x *DeleteUserOutput) ProtoReflect() protoreflect.Message { // Deprecated: Use DeleteUserOutput.ProtoReflect.Descriptor instead. func (*DeleteUserOutput) Descriptor() ([]byte, []int) { - return file_user_proto_rawDescGZIP(), []int{18} + return file_user_proto_rawDescGZIP(), []int{19} } func (x *DeleteUserOutput) GetUser() *User { @@ -1238,7 +1293,7 @@ type ChangeRoleOutput struct { func (x *ChangeRoleOutput) Reset() { *x = ChangeRoleOutput{} if protoimpl.UnsafeEnabled { - mi := &file_user_proto_msgTypes[19] + mi := &file_user_proto_msgTypes[20] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1251,7 +1306,7 @@ func (x *ChangeRoleOutput) String() string { func (*ChangeRoleOutput) ProtoMessage() {} func (x *ChangeRoleOutput) ProtoReflect() protoreflect.Message { - mi := &file_user_proto_msgTypes[19] + mi := &file_user_proto_msgTypes[20] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1264,7 +1319,7 @@ func (x *ChangeRoleOutput) ProtoReflect() protoreflect.Message { // Deprecated: Use ChangeRoleOutput.ProtoReflect.Descriptor instead. func (*ChangeRoleOutput) Descriptor() ([]byte, []int) { - return file_user_proto_rawDescGZIP(), []int{19} + return file_user_proto_rawDescGZIP(), []int{20} } func (x *ChangeRoleOutput) GetUser() *User { @@ -1292,7 +1347,7 @@ type MainAddressId struct { func (x *MainAddressId) Reset() { *x = MainAddressId{} if protoimpl.UnsafeEnabled { - mi := &file_user_proto_msgTypes[20] + mi := &file_user_proto_msgTypes[21] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1305,7 +1360,7 @@ func (x *MainAddressId) String() string { func (*MainAddressId) ProtoMessage() {} func (x *MainAddressId) ProtoReflect() protoreflect.Message { - mi := &file_user_proto_msgTypes[20] + mi := &file_user_proto_msgTypes[21] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1318,7 +1373,7 @@ func (x *MainAddressId) ProtoReflect() protoreflect.Message { // Deprecated: Use MainAddressId.ProtoReflect.Descriptor instead. func (*MainAddressId) Descriptor() ([]byte, []int) { - return file_user_proto_rawDescGZIP(), []int{20} + return file_user_proto_rawDescGZIP(), []int{21} } func (x *MainAddressId) GetId() uint64 { @@ -1340,7 +1395,7 @@ type MainAddressUpdateInput struct { func (x *MainAddressUpdateInput) Reset() { *x = MainAddressUpdateInput{} if protoimpl.UnsafeEnabled { - mi := &file_user_proto_msgTypes[21] + mi := &file_user_proto_msgTypes[22] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1353,7 +1408,7 @@ func (x *MainAddressUpdateInput) String() string { func (*MainAddressUpdateInput) ProtoMessage() {} func (x *MainAddressUpdateInput) ProtoReflect() protoreflect.Message { - mi := &file_user_proto_msgTypes[21] + mi := &file_user_proto_msgTypes[22] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1366,7 +1421,7 @@ func (x *MainAddressUpdateInput) ProtoReflect() protoreflect.Message { // Deprecated: Use MainAddressUpdateInput.ProtoReflect.Descriptor instead. func (*MainAddressUpdateInput) Descriptor() ([]byte, []int) { - return file_user_proto_rawDescGZIP(), []int{21} + return file_user_proto_rawDescGZIP(), []int{22} } func (x *MainAddressUpdateInput) GetToken() string { @@ -1395,7 +1450,7 @@ type UpdateMainAddressOutput struct { func (x *UpdateMainAddressOutput) Reset() { *x = UpdateMainAddressOutput{} if protoimpl.UnsafeEnabled { - mi := &file_user_proto_msgTypes[22] + mi := &file_user_proto_msgTypes[23] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1408,7 +1463,7 @@ func (x *UpdateMainAddressOutput) String() string { func (*UpdateMainAddressOutput) ProtoMessage() {} func (x *UpdateMainAddressOutput) ProtoReflect() protoreflect.Message { - mi := &file_user_proto_msgTypes[22] + mi := &file_user_proto_msgTypes[23] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1421,7 +1476,7 @@ func (x *UpdateMainAddressOutput) ProtoReflect() protoreflect.Message { // Deprecated: Use UpdateMainAddressOutput.ProtoReflect.Descriptor instead. func (*UpdateMainAddressOutput) Descriptor() ([]byte, []int) { - return file_user_proto_rawDescGZIP(), []int{22} + return file_user_proto_rawDescGZIP(), []int{23} } func (x *UpdateMainAddressOutput) GetMainAddress() *MainAddress { @@ -1487,169 +1542,176 @@ var file_user_proto_rawDesc = []byte{ 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, - 0x72, 0x6f, 0x72, 0x22, 0x8e, 0x02, 0x0a, 0x0f, 0x55, 0x73, 0x65, 0x72, 0x43, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x66, 0x69, 0x72, 0x73, 0x74, - 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x66, 0x69, 0x72, - 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6c, 0x61, 0x73, 0x74, 0x4e, - 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, - 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x73, - 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x68, 0x6f, 0x6e, 0x65, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x68, 0x6f, 0x6e, 0x65, 0x12, 0x45, 0x0a, 0x0b, 0x6d, - 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x23, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, - 0x75, 0x73, 0x65, 0x72, 0x2e, 0x4d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, - 0x49, 0x6e, 0x70, 0x75, 0x74, 0x52, 0x0b, 0x6d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, - 0x73, 0x73, 0x12, 0x30, 0x0a, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1c, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, - 0x75, 0x73, 0x65, 0x72, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x52, 0x04, - 0x72, 0x6f, 0x6c, 0x65, 0x22, 0x82, 0x01, 0x0a, 0x10, 0x4d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, - 0x72, 0x65, 0x73, 0x73, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x72, - 0x65, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x72, 0x65, 0x65, - 0x74, 0x12, 0x18, 0x0a, 0x07, 0x7a, 0x69, 0x70, 0x43, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x07, 0x7a, 0x69, 0x70, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x63, - 0x6f, 0x75, 0x6e, 0x74, 0x72, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, - 0x75, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6c, 0x61, 0x74, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x02, 0x52, 0x03, 0x6c, 0x61, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6c, 0x6e, 0x67, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x02, 0x52, 0x03, 0x6c, 0x6e, 0x67, 0x22, 0x1f, 0x0a, 0x09, 0x52, 0x6f, 0x6c, - 0x65, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x22, 0x18, 0x0a, 0x06, 0x55, 0x73, - 0x65, 0x72, 0x49, 0x64, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, - 0x52, 0x02, 0x69, 0x64, 0x22, 0x4f, 0x0a, 0x08, 0x55, 0x73, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, - 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x2d, 0x0a, 0x05, 0x75, 0x73, 0x65, 0x72, 0x73, 0x18, - 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, - 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x05, - 0x75, 0x73, 0x65, 0x72, 0x73, 0x22, 0x3e, 0x0a, 0x0a, 0x6c, 0x6f, 0x67, 0x49, 0x6e, 0x49, 0x6e, - 0x70, 0x75, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, - 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x73, - 0x73, 0x77, 0x6f, 0x72, 0x64, 0x22, 0x25, 0x0a, 0x0d, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, - 0x65, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x3b, 0x0a, 0x0b, - 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x74, - 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, - 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x04, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x22, 0x40, 0x0a, 0x10, 0x76, 0x61, 0x6c, - 0x69, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, + 0x72, 0x6f, 0x72, 0x22, 0x6b, 0x0a, 0x11, 0x4d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, + 0x73, 0x73, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x40, 0x0a, 0x0b, 0x6d, 0x61, 0x69, 0x6e, + 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, + 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, + 0x72, 0x2e, 0x4d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x0b, 0x6d, + 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, + 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, + 0x22, 0x8e, 0x02, 0x0a, 0x0f, 0x55, 0x73, 0x65, 0x72, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x49, + 0x6e, 0x70, 0x75, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x66, 0x69, 0x72, 0x73, 0x74, 0x5f, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x66, 0x69, 0x72, 0x73, 0x74, 0x4e, + 0x61, 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6c, 0x61, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, + 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, + 0x72, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, + 0x72, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x68, 0x6f, 0x6e, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x70, 0x68, 0x6f, 0x6e, 0x65, 0x12, 0x45, 0x0a, 0x0b, 0x6d, 0x61, 0x69, 0x6e, + 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, + 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, + 0x72, 0x2e, 0x4d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x49, 0x6e, 0x70, + 0x75, 0x74, 0x52, 0x0b, 0x6d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, + 0x30, 0x0a, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, + 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, + 0x72, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x52, 0x04, 0x72, 0x6f, 0x6c, + 0x65, 0x22, 0x82, 0x01, 0x0a, 0x10, 0x4d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, + 0x73, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x72, 0x65, 0x65, 0x74, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x72, 0x65, 0x65, 0x74, 0x12, 0x18, + 0x0a, 0x07, 0x7a, 0x69, 0x70, 0x43, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x07, 0x7a, 0x69, 0x70, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x72, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6c, 0x61, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x02, 0x52, + 0x03, 0x6c, 0x61, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6c, 0x6e, 0x67, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x02, 0x52, 0x03, 0x6c, 0x6e, 0x67, 0x22, 0x1f, 0x0a, 0x09, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, + 0x70, 0x75, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x22, 0x18, 0x0a, 0x06, 0x55, 0x73, 0x65, 0x72, 0x49, + 0x64, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x02, 0x69, + 0x64, 0x22, 0x4f, 0x0a, 0x08, 0x55, 0x73, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, - 0x72, 0x6f, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x04, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x22, 0x68, 0x0a, 0x0d, 0x6c, - 0x6f, 0x67, 0x49, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2b, 0x0a, 0x04, - 0x75, 0x73, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6f, 0x6d, - 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, - 0x73, 0x65, 0x72, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, - 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x12, - 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x6f, 0x0a, 0x13, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, - 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x12, 0x14, 0x0a, 0x05, - 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, - 0x65, 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x6f, 0x6c, 0x64, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, - 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x6f, 0x6c, 0x64, 0x50, 0x61, 0x73, 0x73, - 0x77, 0x6f, 0x72, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x6e, 0x65, 0x77, 0x50, 0x61, 0x73, 0x73, 0x77, - 0x6f, 0x72, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x6e, 0x65, 0x77, 0x50, 0x61, - 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x22, 0x59, 0x0a, 0x14, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, - 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x2b, - 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, - 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, - 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x65, - 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, - 0x72, 0x22, 0x5b, 0x0a, 0x0f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x49, - 0x6e, 0x70, 0x75, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x75, 0x73, - 0x65, 0x72, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, - 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x43, 0x6f, 0x64, 0x65, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x43, 0x6f, 0x64, 0x65, 0x22, 0x55, - 0x0a, 0x10, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x4f, 0x75, 0x74, 0x70, - 0x75, 0x74, 0x12, 0x2b, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x17, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, - 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x12, - 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x55, 0x0a, 0x10, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, - 0x6f, 0x6c, 0x65, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x2b, 0x0a, 0x04, 0x75, 0x73, 0x65, + 0x72, 0x6f, 0x72, 0x12, 0x2d, 0x0a, 0x05, 0x75, 0x73, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, + 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x05, 0x75, 0x73, 0x65, + 0x72, 0x73, 0x22, 0x3e, 0x0a, 0x0a, 0x6c, 0x6f, 0x67, 0x49, 0x6e, 0x49, 0x6e, 0x70, 0x75, 0x74, + 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, + 0x72, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, + 0x72, 0x64, 0x22, 0x25, 0x0a, 0x0d, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x49, 0x6e, + 0x70, 0x75, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x3b, 0x0a, 0x0b, 0x44, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, + 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x16, + 0x0a, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, + 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x22, 0x40, 0x0a, 0x10, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, + 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, + 0x72, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, + 0x12, 0x16, 0x0a, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, + 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x22, 0x68, 0x0a, 0x0d, 0x6c, 0x6f, 0x67, 0x49, + 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2b, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, - 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x1f, 0x0a, 0x0d, - 0x4d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x49, 0x64, 0x12, 0x0e, 0x0a, - 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x02, 0x69, 0x64, 0x22, 0x70, 0x0a, - 0x16, 0x4d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x55, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x40, 0x0a, - 0x0b, 0x6d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, - 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x4d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, - 0x73, 0x73, 0x52, 0x0b, 0x6d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x22, - 0x71, 0x0a, 0x17, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, - 0x72, 0x65, 0x73, 0x73, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x40, 0x0a, 0x0b, 0x6d, 0x61, - 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x14, 0x0a, 0x05, + 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, + 0x6f, 0x72, 0x22, 0x6f, 0x0a, 0x13, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x61, 0x73, 0x73, + 0x77, 0x6f, 0x72, 0x64, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, + 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x12, + 0x20, 0x0a, 0x0b, 0x6f, 0x6c, 0x64, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x6f, 0x6c, 0x64, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, + 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x6e, 0x65, 0x77, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x6e, 0x65, 0x77, 0x50, 0x61, 0x73, 0x73, 0x77, + 0x6f, 0x72, 0x64, 0x22, 0x59, 0x0a, 0x14, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x61, 0x73, + 0x73, 0x77, 0x6f, 0x72, 0x64, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x2b, 0x0a, 0x04, 0x75, + 0x73, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, + 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, 0x73, + 0x65, 0x72, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, + 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x5b, + 0x0a, 0x0f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x70, 0x75, + 0x74, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, + 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, + 0x1a, 0x0a, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x43, 0x6f, 0x64, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x43, 0x6f, 0x64, 0x65, 0x22, 0x55, 0x0a, 0x10, 0x44, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, + 0x2b, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, + 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, + 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, + 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, + 0x6f, 0x72, 0x22, 0x55, 0x0a, 0x10, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x6f, 0x6c, 0x65, + 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x2b, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, + 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x04, 0x75, + 0x73, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x1f, 0x0a, 0x0d, 0x4d, 0x61, 0x69, + 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x49, 0x64, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x02, 0x69, 0x64, 0x22, 0x70, 0x0a, 0x16, 0x4d, 0x61, + 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x49, + 0x6e, 0x70, 0x75, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x40, 0x0a, 0x0b, 0x6d, 0x61, + 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x4d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, - 0x0b, 0x6d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x14, 0x0a, 0x05, - 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, - 0x6f, 0x72, 0x32, 0xef, 0x05, 0x0a, 0x0b, 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x12, 0x4f, 0x0a, 0x08, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x12, 0x22, - 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, - 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x70, - 0x75, 0x74, 0x1a, 0x1d, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, - 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x4f, 0x75, 0x74, 0x70, 0x75, - 0x74, 0x22, 0x00, 0x12, 0x45, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x12, 0x19, - 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, - 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x49, 0x64, 0x1a, 0x1d, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, - 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, 0x73, - 0x65, 0x72, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x51, 0x0a, 0x0a, 0x55, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x12, 0x22, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, - 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x1d, 0x2e, 0x63, + 0x0b, 0x6d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x22, 0x71, 0x0a, 0x17, + 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, + 0x73, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x40, 0x0a, 0x0b, 0x6d, 0x61, 0x69, 0x6e, 0x41, + 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, - 0x2e, 0x55, 0x73, 0x65, 0x72, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x53, 0x0a, - 0x0a, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x12, 0x1e, 0x2e, 0x63, 0x6f, + 0x2e, 0x4d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x0b, 0x6d, 0x61, + 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, + 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x32, + 0xef, 0x05, 0x0a, 0x0b, 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, + 0x4f, 0x0a, 0x08, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x12, 0x22, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, - 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x23, 0x2e, 0x63, 0x6f, + 0x55, 0x73, 0x65, 0x72, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, + 0x1d, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, + 0x73, 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, + 0x12, 0x45, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x12, 0x19, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, - 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, - 0x22, 0x00, 0x12, 0x41, 0x0a, 0x08, 0x4c, 0x69, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, 0x12, 0x16, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1b, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, - 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x4c, - 0x69, 0x73, 0x74, 0x22, 0x00, 0x12, 0x4a, 0x0a, 0x05, 0x4c, 0x6f, 0x67, 0x49, 0x6e, 0x12, 0x1d, - 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, - 0x65, 0x72, 0x2e, 0x6c, 0x6f, 0x67, 0x49, 0x6e, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x20, 0x2e, - 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, - 0x72, 0x2e, 0x6c, 0x6f, 0x67, 0x49, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x00, 0x12, 0x53, 0x0a, 0x08, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x12, 0x20, 0x2e, - 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, - 0x72, 0x2e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, - 0x23, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, - 0x73, 0x65, 0x72, 0x2e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x63, 0x0a, 0x0e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, - 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x26, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, - 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x63, 0x68, 0x61, - 0x6e, 0x67, 0x65, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x49, 0x6e, 0x70, 0x75, 0x74, - 0x1a, 0x27, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, - 0x75, 0x73, 0x65, 0x72, 0x2e, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x61, 0x73, 0x73, 0x77, - 0x6f, 0x72, 0x64, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0a, 0x43, - 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x12, 0x22, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, - 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x63, 0x68, - 0x61, 0x6e, 0x67, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x23, 0x2e, - 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, - 0x72, 0x2e, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x4f, 0x75, 0x74, 0x70, - 0x75, 0x74, 0x22, 0x00, 0x32, 0xd8, 0x01, 0x0a, 0x12, 0x4d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, - 0x72, 0x65, 0x73, 0x73, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x54, 0x0a, 0x0e, 0x47, - 0x65, 0x74, 0x4d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x20, 0x2e, + 0x55, 0x73, 0x65, 0x72, 0x49, 0x64, 0x1a, 0x1d, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, + 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x4f, + 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x51, 0x0a, 0x0a, 0x55, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x55, 0x73, 0x65, 0x72, 0x12, 0x22, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, + 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x55, 0x73, 0x65, 0x72, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x1d, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, + 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, 0x73, + 0x65, 0x72, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x53, 0x0a, 0x0a, 0x44, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x12, 0x1e, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, + 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x44, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x23, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, + 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x44, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, + 0x41, 0x0a, 0x08, 0x4c, 0x69, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, 0x12, 0x16, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, + 0x70, 0x74, 0x79, 0x1a, 0x1b, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, + 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, + 0x22, 0x00, 0x12, 0x4a, 0x0a, 0x05, 0x4c, 0x6f, 0x67, 0x49, 0x6e, 0x12, 0x1d, 0x2e, 0x63, 0x6f, + 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, + 0x6c, 0x6f, 0x67, 0x49, 0x6e, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x20, 0x2e, 0x63, 0x6f, 0x6d, + 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x6c, + 0x6f, 0x67, 0x49, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x53, + 0x0a, 0x08, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x12, 0x20, 0x2e, 0x63, 0x6f, 0x6d, + 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x76, + 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x23, 0x2e, 0x63, + 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, + 0x2e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x00, 0x12, 0x63, 0x0a, 0x0e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x61, 0x73, + 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x26, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, + 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, + 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x27, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, - 0x72, 0x2e, 0x4d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x49, 0x64, 0x1a, - 0x1e, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, - 0x73, 0x65, 0x72, 0x2e, 0x4d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x22, - 0x00, 0x12, 0x6c, 0x0a, 0x11, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x69, 0x6e, 0x41, - 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x29, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, - 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x4d, 0x61, 0x69, 0x6e, 0x41, - 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x70, 0x75, - 0x74, 0x1a, 0x2a, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, - 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x69, 0x6e, - 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x42, - 0x03, 0x5a, 0x01, 0x2e, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x72, 0x2e, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, + 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0a, 0x43, 0x68, 0x61, 0x6e, + 0x67, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x12, 0x22, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, + 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x63, 0x68, 0x61, 0x6e, 0x67, + 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x23, 0x2e, 0x63, 0x6f, 0x6d, + 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x63, + 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, + 0x00, 0x32, 0xde, 0x01, 0x0a, 0x12, 0x4d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, + 0x73, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x5a, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x4d, + 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x20, 0x2e, 0x63, 0x6f, 0x6d, + 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x4d, + 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x49, 0x64, 0x1a, 0x24, 0x2e, 0x63, + 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, + 0x2e, 0x4d, 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x4f, 0x75, 0x74, 0x70, + 0x75, 0x74, 0x22, 0x00, 0x12, 0x6c, 0x0a, 0x11, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x61, + 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x29, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, + 0x67, 0x6f, 0x6f, 0x64, 0x66, 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x4d, 0x61, + 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x49, + 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x2a, 0x2e, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x64, 0x66, + 0x6f, 0x6f, 0x64, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, + 0x61, 0x69, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, + 0x22, 0x00, 0x42, 0x03, 0x5a, 0x01, 0x2e, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -1664,74 +1726,76 @@ func file_user_proto_rawDescGZIP() []byte { return file_user_proto_rawDescData } -var file_user_proto_msgTypes = make([]protoimpl.MessageInfo, 23) +var file_user_proto_msgTypes = make([]protoimpl.MessageInfo, 24) var file_user_proto_goTypes = []interface{}{ (*Role)(nil), // 0: com.goodfood.user.Role (*MainAddress)(nil), // 1: com.goodfood.user.MainAddress (*User)(nil), // 2: com.goodfood.user.User (*UpdateUserInput)(nil), // 3: com.goodfood.user.UpdateUserInput (*UserOutput)(nil), // 4: com.goodfood.user.UserOutput - (*UserCreateInput)(nil), // 5: com.goodfood.user.UserCreateInput - (*MainAddressInput)(nil), // 6: com.goodfood.user.MainAddressInput - (*RoleInput)(nil), // 7: com.goodfood.user.RoleInput - (*UserId)(nil), // 8: com.goodfood.user.UserId - (*UserList)(nil), // 9: com.goodfood.user.UserList - (*LogInInput)(nil), // 10: com.goodfood.user.logInInput - (*ValidateInput)(nil), // 11: com.goodfood.user.validateInput - (*DeleteInput)(nil), // 12: com.goodfood.user.DeleteInput - (*ValidateResponse)(nil), // 13: com.goodfood.user.validateResponse - (*LogInResponse)(nil), // 14: com.goodfood.user.logInResponse - (*ChangePasswordInput)(nil), // 15: com.goodfood.user.changePasswordInput - (*ChangePasswordOutput)(nil), // 16: com.goodfood.user.changePasswordOutput - (*ChangeRoleInput)(nil), // 17: com.goodfood.user.changeRoleInput - (*DeleteUserOutput)(nil), // 18: com.goodfood.user.DeleteUserOutput - (*ChangeRoleOutput)(nil), // 19: com.goodfood.user.changeRoleOutput - (*MainAddressId)(nil), // 20: com.goodfood.user.MainAddressId - (*MainAddressUpdateInput)(nil), // 21: com.goodfood.user.MainAddressUpdateInput - (*UpdateMainAddressOutput)(nil), // 22: com.goodfood.user.UpdateMainAddressOutput - (*empty.Empty)(nil), // 23: google.protobuf.Empty + (*MainAddressOutput)(nil), // 5: com.goodfood.user.MainAddressOutput + (*UserCreateInput)(nil), // 6: com.goodfood.user.UserCreateInput + (*MainAddressInput)(nil), // 7: com.goodfood.user.MainAddressInput + (*RoleInput)(nil), // 8: com.goodfood.user.RoleInput + (*UserId)(nil), // 9: com.goodfood.user.UserId + (*UserList)(nil), // 10: com.goodfood.user.UserList + (*LogInInput)(nil), // 11: com.goodfood.user.logInInput + (*ValidateInput)(nil), // 12: com.goodfood.user.validateInput + (*DeleteInput)(nil), // 13: com.goodfood.user.DeleteInput + (*ValidateResponse)(nil), // 14: com.goodfood.user.validateResponse + (*LogInResponse)(nil), // 15: com.goodfood.user.logInResponse + (*ChangePasswordInput)(nil), // 16: com.goodfood.user.changePasswordInput + (*ChangePasswordOutput)(nil), // 17: com.goodfood.user.changePasswordOutput + (*ChangeRoleInput)(nil), // 18: com.goodfood.user.changeRoleInput + (*DeleteUserOutput)(nil), // 19: com.goodfood.user.DeleteUserOutput + (*ChangeRoleOutput)(nil), // 20: com.goodfood.user.changeRoleOutput + (*MainAddressId)(nil), // 21: com.goodfood.user.MainAddressId + (*MainAddressUpdateInput)(nil), // 22: com.goodfood.user.MainAddressUpdateInput + (*UpdateMainAddressOutput)(nil), // 23: com.goodfood.user.UpdateMainAddressOutput + (*empty.Empty)(nil), // 24: google.protobuf.Empty } var file_user_proto_depIdxs = []int32{ 1, // 0: com.goodfood.user.User.mainAddress:type_name -> com.goodfood.user.MainAddress 0, // 1: com.goodfood.user.User.role:type_name -> com.goodfood.user.Role 2, // 2: com.goodfood.user.UpdateUserInput.user:type_name -> com.goodfood.user.User 2, // 3: com.goodfood.user.UserOutput.user:type_name -> com.goodfood.user.User - 6, // 4: com.goodfood.user.UserCreateInput.mainAddress:type_name -> com.goodfood.user.MainAddressInput - 7, // 5: com.goodfood.user.UserCreateInput.role:type_name -> com.goodfood.user.RoleInput - 2, // 6: com.goodfood.user.UserList.users:type_name -> com.goodfood.user.User - 2, // 7: com.goodfood.user.logInResponse.user:type_name -> com.goodfood.user.User - 2, // 8: com.goodfood.user.changePasswordOutput.user:type_name -> com.goodfood.user.User - 2, // 9: com.goodfood.user.DeleteUserOutput.user:type_name -> com.goodfood.user.User - 2, // 10: com.goodfood.user.changeRoleOutput.user:type_name -> com.goodfood.user.User - 1, // 11: com.goodfood.user.MainAddressUpdateInput.mainAddress:type_name -> com.goodfood.user.MainAddress - 1, // 12: com.goodfood.user.UpdateMainAddressOutput.mainAddress:type_name -> com.goodfood.user.MainAddress - 5, // 13: com.goodfood.user.UserService.Register:input_type -> com.goodfood.user.UserCreateInput - 8, // 14: com.goodfood.user.UserService.GetUser:input_type -> com.goodfood.user.UserId - 3, // 15: com.goodfood.user.UserService.UpdateUser:input_type -> com.goodfood.user.UpdateUserInput - 12, // 16: com.goodfood.user.UserService.DeleteUser:input_type -> com.goodfood.user.DeleteInput - 23, // 17: com.goodfood.user.UserService.ListUser:input_type -> google.protobuf.Empty - 10, // 18: com.goodfood.user.UserService.LogIn:input_type -> com.goodfood.user.logInInput - 11, // 19: com.goodfood.user.UserService.Validate:input_type -> com.goodfood.user.validateInput - 15, // 20: com.goodfood.user.UserService.ChangePassword:input_type -> com.goodfood.user.changePasswordInput - 17, // 21: com.goodfood.user.UserService.ChangeRole:input_type -> com.goodfood.user.changeRoleInput - 20, // 22: com.goodfood.user.MainAddressService.GetMainAddress:input_type -> com.goodfood.user.MainAddressId - 21, // 23: com.goodfood.user.MainAddressService.UpdateMainAddress:input_type -> com.goodfood.user.MainAddressUpdateInput - 4, // 24: com.goodfood.user.UserService.Register:output_type -> com.goodfood.user.UserOutput - 4, // 25: com.goodfood.user.UserService.GetUser:output_type -> com.goodfood.user.UserOutput - 4, // 26: com.goodfood.user.UserService.UpdateUser:output_type -> com.goodfood.user.UserOutput - 18, // 27: com.goodfood.user.UserService.DeleteUser:output_type -> com.goodfood.user.DeleteUserOutput - 9, // 28: com.goodfood.user.UserService.ListUser:output_type -> com.goodfood.user.UserList - 14, // 29: com.goodfood.user.UserService.LogIn:output_type -> com.goodfood.user.logInResponse - 13, // 30: com.goodfood.user.UserService.Validate:output_type -> com.goodfood.user.validateResponse - 16, // 31: com.goodfood.user.UserService.ChangePassword:output_type -> com.goodfood.user.changePasswordOutput - 19, // 32: com.goodfood.user.UserService.ChangeRole:output_type -> com.goodfood.user.changeRoleOutput - 1, // 33: com.goodfood.user.MainAddressService.GetMainAddress:output_type -> com.goodfood.user.MainAddress - 22, // 34: com.goodfood.user.MainAddressService.UpdateMainAddress:output_type -> com.goodfood.user.UpdateMainAddressOutput - 24, // [24:35] is the sub-list for method output_type - 13, // [13:24] is the sub-list for method input_type - 13, // [13:13] is the sub-list for extension type_name - 13, // [13:13] is the sub-list for extension extendee - 0, // [0:13] is the sub-list for field type_name + 1, // 4: com.goodfood.user.MainAddressOutput.mainAddress:type_name -> com.goodfood.user.MainAddress + 7, // 5: com.goodfood.user.UserCreateInput.mainAddress:type_name -> com.goodfood.user.MainAddressInput + 8, // 6: com.goodfood.user.UserCreateInput.role:type_name -> com.goodfood.user.RoleInput + 2, // 7: com.goodfood.user.UserList.users:type_name -> com.goodfood.user.User + 2, // 8: com.goodfood.user.logInResponse.user:type_name -> com.goodfood.user.User + 2, // 9: com.goodfood.user.changePasswordOutput.user:type_name -> com.goodfood.user.User + 2, // 10: com.goodfood.user.DeleteUserOutput.user:type_name -> com.goodfood.user.User + 2, // 11: com.goodfood.user.changeRoleOutput.user:type_name -> com.goodfood.user.User + 1, // 12: com.goodfood.user.MainAddressUpdateInput.mainAddress:type_name -> com.goodfood.user.MainAddress + 1, // 13: com.goodfood.user.UpdateMainAddressOutput.mainAddress:type_name -> com.goodfood.user.MainAddress + 6, // 14: com.goodfood.user.UserService.Register:input_type -> com.goodfood.user.UserCreateInput + 9, // 15: com.goodfood.user.UserService.GetUser:input_type -> com.goodfood.user.UserId + 3, // 16: com.goodfood.user.UserService.UpdateUser:input_type -> com.goodfood.user.UpdateUserInput + 13, // 17: com.goodfood.user.UserService.DeleteUser:input_type -> com.goodfood.user.DeleteInput + 24, // 18: com.goodfood.user.UserService.ListUser:input_type -> google.protobuf.Empty + 11, // 19: com.goodfood.user.UserService.LogIn:input_type -> com.goodfood.user.logInInput + 12, // 20: com.goodfood.user.UserService.Validate:input_type -> com.goodfood.user.validateInput + 16, // 21: com.goodfood.user.UserService.ChangePassword:input_type -> com.goodfood.user.changePasswordInput + 18, // 22: com.goodfood.user.UserService.ChangeRole:input_type -> com.goodfood.user.changeRoleInput + 21, // 23: com.goodfood.user.MainAddressService.GetMainAddress:input_type -> com.goodfood.user.MainAddressId + 22, // 24: com.goodfood.user.MainAddressService.UpdateMainAddress:input_type -> com.goodfood.user.MainAddressUpdateInput + 4, // 25: com.goodfood.user.UserService.Register:output_type -> com.goodfood.user.UserOutput + 4, // 26: com.goodfood.user.UserService.GetUser:output_type -> com.goodfood.user.UserOutput + 4, // 27: com.goodfood.user.UserService.UpdateUser:output_type -> com.goodfood.user.UserOutput + 19, // 28: com.goodfood.user.UserService.DeleteUser:output_type -> com.goodfood.user.DeleteUserOutput + 10, // 29: com.goodfood.user.UserService.ListUser:output_type -> com.goodfood.user.UserList + 15, // 30: com.goodfood.user.UserService.LogIn:output_type -> com.goodfood.user.logInResponse + 14, // 31: com.goodfood.user.UserService.Validate:output_type -> com.goodfood.user.validateResponse + 17, // 32: com.goodfood.user.UserService.ChangePassword:output_type -> com.goodfood.user.changePasswordOutput + 20, // 33: com.goodfood.user.UserService.ChangeRole:output_type -> com.goodfood.user.changeRoleOutput + 5, // 34: com.goodfood.user.MainAddressService.GetMainAddress:output_type -> com.goodfood.user.MainAddressOutput + 23, // 35: com.goodfood.user.MainAddressService.UpdateMainAddress:output_type -> com.goodfood.user.UpdateMainAddressOutput + 25, // [25:36] is the sub-list for method output_type + 14, // [14:25] is the sub-list for method input_type + 14, // [14:14] is the sub-list for extension type_name + 14, // [14:14] is the sub-list for extension extendee + 0, // [0:14] is the sub-list for field type_name } func init() { file_user_proto_init() } @@ -1801,7 +1865,7 @@ func file_user_proto_init() { } } file_user_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UserCreateInput); i { + switch v := v.(*MainAddressOutput); i { case 0: return &v.state case 1: @@ -1813,7 +1877,7 @@ func file_user_proto_init() { } } file_user_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MainAddressInput); i { + switch v := v.(*UserCreateInput); i { case 0: return &v.state case 1: @@ -1825,7 +1889,7 @@ func file_user_proto_init() { } } file_user_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RoleInput); i { + switch v := v.(*MainAddressInput); i { case 0: return &v.state case 1: @@ -1837,7 +1901,7 @@ func file_user_proto_init() { } } file_user_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UserId); i { + switch v := v.(*RoleInput); i { case 0: return &v.state case 1: @@ -1849,7 +1913,7 @@ func file_user_proto_init() { } } file_user_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UserList); i { + switch v := v.(*UserId); i { case 0: return &v.state case 1: @@ -1861,7 +1925,7 @@ func file_user_proto_init() { } } file_user_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*LogInInput); i { + switch v := v.(*UserList); i { case 0: return &v.state case 1: @@ -1873,7 +1937,7 @@ func file_user_proto_init() { } } file_user_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ValidateInput); i { + switch v := v.(*LogInInput); i { case 0: return &v.state case 1: @@ -1885,7 +1949,7 @@ func file_user_proto_init() { } } file_user_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteInput); i { + switch v := v.(*ValidateInput); i { case 0: return &v.state case 1: @@ -1897,7 +1961,7 @@ func file_user_proto_init() { } } file_user_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ValidateResponse); i { + switch v := v.(*DeleteInput); i { case 0: return &v.state case 1: @@ -1909,7 +1973,7 @@ func file_user_proto_init() { } } file_user_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*LogInResponse); i { + switch v := v.(*ValidateResponse); i { case 0: return &v.state case 1: @@ -1921,7 +1985,7 @@ func file_user_proto_init() { } } file_user_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ChangePasswordInput); i { + switch v := v.(*LogInResponse); i { case 0: return &v.state case 1: @@ -1933,7 +1997,7 @@ func file_user_proto_init() { } } file_user_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ChangePasswordOutput); i { + switch v := v.(*ChangePasswordInput); i { case 0: return &v.state case 1: @@ -1945,7 +2009,7 @@ func file_user_proto_init() { } } file_user_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ChangeRoleInput); i { + switch v := v.(*ChangePasswordOutput); i { case 0: return &v.state case 1: @@ -1957,7 +2021,7 @@ func file_user_proto_init() { } } file_user_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteUserOutput); i { + switch v := v.(*ChangeRoleInput); i { case 0: return &v.state case 1: @@ -1969,7 +2033,7 @@ func file_user_proto_init() { } } file_user_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ChangeRoleOutput); i { + switch v := v.(*DeleteUserOutput); i { case 0: return &v.state case 1: @@ -1981,7 +2045,7 @@ func file_user_proto_init() { } } file_user_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MainAddressId); i { + switch v := v.(*ChangeRoleOutput); i { case 0: return &v.state case 1: @@ -1993,7 +2057,7 @@ func file_user_proto_init() { } } file_user_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MainAddressUpdateInput); i { + switch v := v.(*MainAddressId); i { case 0: return &v.state case 1: @@ -2005,6 +2069,18 @@ func file_user_proto_init() { } } file_user_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*MainAddressUpdateInput); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_user_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*UpdateMainAddressOutput); i { case 0: return &v.state @@ -2023,7 +2099,7 @@ func file_user_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_user_proto_rawDesc, NumEnums: 0, - NumMessages: 23, + NumMessages: 24, NumExtensions: 0, NumServices: 2, }, diff --git a/services/proto/user.proto b/services/proto/user.proto index bdf1b94f..c3222f02 100644 --- a/services/proto/user.proto +++ b/services/proto/user.proto @@ -43,6 +43,11 @@ message UserOutput { string error = 2; } +message MainAddressOutput { + MainAddress mainAddress = 1; + string error = 2; +} + service UserService { rpc Register (UserCreateInput) returns (UserOutput) {} rpc GetUser (UserId) returns (UserOutput) {} @@ -56,7 +61,7 @@ service UserService { } service MainAddressService { - rpc GetMainAddress (MainAddressId) returns (MainAddress) {} + rpc GetMainAddress (MainAddressId) returns (MainAddressOutput) {} rpc UpdateMainAddress (MainAddressUpdateInput) returns (UpdateMainAddressOutput) {} } @@ -70,13 +75,13 @@ message UserCreateInput { RoleInput role = 7; } - message MainAddressInput { - string street = 1; - string zipCode = 2; - string country = 3; - float lat = 4; - float lng = 5; - } +message MainAddressInput { + string street = 1; + string zipCode = 2; + string country = 3; + float lat = 4; + float lng = 5; +} message RoleInput { string code = 1; diff --git a/services/proto/user_grpc.pb.go b/services/proto/user_grpc.pb.go index 827aca1a..82fdeb3e 100644 --- a/services/proto/user_grpc.pb.go +++ b/services/proto/user_grpc.pb.go @@ -397,7 +397,7 @@ var UserService_ServiceDesc = grpc.ServiceDesc{ // // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. type MainAddressServiceClient interface { - GetMainAddress(ctx context.Context, in *MainAddressId, opts ...grpc.CallOption) (*MainAddress, error) + GetMainAddress(ctx context.Context, in *MainAddressId, opts ...grpc.CallOption) (*MainAddressOutput, error) UpdateMainAddress(ctx context.Context, in *MainAddressUpdateInput, opts ...grpc.CallOption) (*UpdateMainAddressOutput, error) } @@ -409,8 +409,8 @@ func NewMainAddressServiceClient(cc grpc.ClientConnInterface) MainAddressService return &mainAddressServiceClient{cc} } -func (c *mainAddressServiceClient) GetMainAddress(ctx context.Context, in *MainAddressId, opts ...grpc.CallOption) (*MainAddress, error) { - out := new(MainAddress) +func (c *mainAddressServiceClient) GetMainAddress(ctx context.Context, in *MainAddressId, opts ...grpc.CallOption) (*MainAddressOutput, error) { + out := new(MainAddressOutput) err := c.cc.Invoke(ctx, "/com.goodfood.user.MainAddressService/GetMainAddress", in, out, opts...) if err != nil { return nil, err @@ -431,7 +431,7 @@ func (c *mainAddressServiceClient) UpdateMainAddress(ctx context.Context, in *Ma // All implementations must embed UnimplementedMainAddressServiceServer // for forward compatibility type MainAddressServiceServer interface { - GetMainAddress(context.Context, *MainAddressId) (*MainAddress, error) + GetMainAddress(context.Context, *MainAddressId) (*MainAddressOutput, error) UpdateMainAddress(context.Context, *MainAddressUpdateInput) (*UpdateMainAddressOutput, error) mustEmbedUnimplementedMainAddressServiceServer() } @@ -440,7 +440,7 @@ type MainAddressServiceServer interface { type UnimplementedMainAddressServiceServer struct { } -func (UnimplementedMainAddressServiceServer) GetMainAddress(context.Context, *MainAddressId) (*MainAddress, error) { +func (UnimplementedMainAddressServiceServer) GetMainAddress(context.Context, *MainAddressId) (*MainAddressOutput, error) { return nil, status.Errorf(codes.Unimplemented, "method GetMainAddress not implemented") } func (UnimplementedMainAddressServiceServer) UpdateMainAddress(context.Context, *MainAddressUpdateInput) (*UpdateMainAddressOutput, error) { diff --git a/services/user/src/main.go b/services/user/src/main.go index 3bec1583..27d553df 100644 --- a/services/user/src/main.go +++ b/services/user/src/main.go @@ -42,14 +42,19 @@ func main() { logger.Fatal("Failed to listing:", err) } - s := services.Server{ + userServer := services.Server{ + H: h, + Jwt: jwt, + } + mainAddressServer := services.MainAddressServer{ H: h, Jwt: jwt, } grpcServer := grpc.NewServer() - pb.RegisterUserServiceServer(grpcServer, &s) + pb.RegisterUserServiceServer(grpcServer, &userServer) + pb.RegisterMainAddressServiceServer(grpcServer, &mainAddressServer) if err := grpcServer.Serve(lis); err != nil { logger.Fatal("Failed to serve:", err) diff --git a/services/user/src/pkg/services/mainAddress.go b/services/user/src/pkg/services/mainAddress.go index a0f84a32..0bc2a323 100644 --- a/services/user/src/pkg/services/mainAddress.go +++ b/services/user/src/pkg/services/mainAddress.go @@ -2,22 +2,34 @@ package services import ( "context" + "goodfood-user/pkg/db" "goodfood-user/pkg/mapper" "goodfood-user/pkg/models" + "goodfood-user/pkg/utils" pb "goodfood-user/proto" ) -func (s *Server) GetMainAddress(_ context.Context, req *pb.MainAddressId) (*pb.MainAddress, error) { +type MainAddressServer struct { + pb.UnimplementedMainAddressServiceServer + H db.Handler + Jwt utils.JwtWrapper +} + +func (s *MainAddressServer) GetMainAddress(_ context.Context, req *pb.MainAddressId) (*pb.MainAddressOutput, error) { var address models.MainAddress - if result := s.H.DB.Where(&models.User{Id: req.Id}).First(&address); result.Error != nil { - return nil, result.Error + if result := s.H.DB.Where(&models.MainAddress{Id: req.Id}).First(&address); result.Error != nil { + return &pb.MainAddressOutput{ + Error: "Main address not found", + }, nil } - return mapper.ToProtoMainAddress(*&address), nil + return &pb.MainAddressOutput{ + MainAddress: mapper.ToProtoMainAddress(address), + }, nil } -func (s *Server) UpdateMainAddress(_ context.Context, req *pb.MainAddressUpdateInput) (*pb.UpdateMainAddressOutput, error) { +func (s *MainAddressServer) UpdateMainAddress(_ context.Context, req *pb.MainAddressUpdateInput) (*pb.UpdateMainAddressOutput, error) { claims, err := s.Jwt.ValidateToken(req.Token) if err != nil { return &pb.UpdateMainAddressOutput{ @@ -30,6 +42,7 @@ func (s *Server) UpdateMainAddress(_ context.Context, req *pb.MainAddressUpdateI Error: "User not found", }, nil } + var mainAddress = mapper.UpdateInputToModelMainAddress(req.MainAddress) s.H.DB.Updates(&mainAddress) diff --git a/services/user/src/pkg/services/user.go b/services/user/src/pkg/services/user.go index 8525ca28..686d7fc0 100644 --- a/services/user/src/pkg/services/user.go +++ b/services/user/src/pkg/services/user.go @@ -147,22 +147,30 @@ func (s *Server) ChangeRole(_ context.Context, req *pb.ChangeRoleInput) (*pb.Cha }, nil } + var connectedUser models.User + + if result := s.H.DB.Where(&models.User{Id: claims.Id}).First(&connectedUser); result.Error != nil { + return &pb.ChangeRoleOutput{ + Error: "User not found", + }, nil + } + var user models.User var role models.Role - if result := s.H.DB.Where(&models.User{Id: claims.Id}); result.Error != nil { + if result := s.H.DB.Where(&models.User{Id: req.UserId}).First(&user); result.Error != nil { return &pb.ChangeRoleOutput{ Error: "User not found", }, nil } - if result := s.H.DB.Where(&models.Role{Code: req.RoleCode}); result.Error != nil { + if result := s.H.DB.Where(&models.Role{Code: req.RoleCode}).First(&role); result.Error != nil { return &pb.ChangeRoleOutput{ Error: "User not found", }, nil } - if user.Role.Code == "ADMIN" || user.Id == req.UserId { + if user.Role.Code == "ADMIN" { user.Role = role s.H.DB.Save(&user) From 16c95171a27a7823f104e05087f216b86942b12b Mon Sep 17 00:00:00 2001 From: Pierre Lebigre Date: Fri, 7 Jul 2023 16:33:31 +0200 Subject: [PATCH 226/883] Update readme, terraform et k8s --- services/product/README.md | 24 +- services/product/k8s/deployment.yml | 2 +- services/product/k8s/service.yml | 4 +- services/product/package-lock.json | 2865 ++++++++++++++++-- services/product/package.json | 7 +- services/product/pnpm-lock.yaml | 1292 +++++++- services/product/src/handler/Image/upload.ts | 13 +- services/product/terraform/main.tf | 63 +- services/product/terraform/outputs.tf | 6 +- 9 files changed, 3890 insertions(+), 386 deletions(-) diff --git a/services/product/README.md b/services/product/README.md index f07e1735..35e59f1a 100644 --- a/services/product/README.md +++ b/services/product/README.md @@ -90,26 +90,28 @@ Go in the [terraform](./terraform) then plan and apply your terraform. When it's ``` terraform plan -out="tf.plan" terraform apply "tf.plan" -terraform output > ../.env +terraform output | sed 's/ //g' > ../.env ``` -Check if the AMQP_URL value is good. +Check if the AMQP_URL value is good. (Ip de florian pour l'instant) Then go to [terraform](./prisma) to migrate your table schema in your azure database. ``` npx prisma migrate dev --name init ``` -To build the image you need to be in the **parent folder** of the service you want to build. Then run the following -command: - +Open an other terminal at the root folder (/service) and execute those ``` docker build -t goodfood-product:1.0.0 -f ./product/Dockerfile . +docker push pierrelbg/product-service:1.0.0 ``` -### Run - -Create the .env base on the .env.example. Then run the following command: - +Back to the first terminal and execute ``` -docker run --env-file=.env goodfood-product:1.0.0 -``` \ No newline at end of file +echo "$(terraform output kube_config)" > ./azurek8s +export KUBECONFIG=./azurek8s +kubectl apply -f ../k8s/ +``` +Puis tu peux crée de quoi monitorer dans l'onglet Monitoring/Insights + +ça ne fonctionne pas, le contenaire est en erreur. Ce qui n'est normalement pas possible si le conteneur fonctionne en local. +Verifier que le contener fonctionne en local. \ No newline at end of file diff --git a/services/product/k8s/deployment.yml b/services/product/k8s/deployment.yml index f03c588a..fe09f06b 100644 --- a/services/product/k8s/deployment.yml +++ b/services/product/k8s/deployment.yml @@ -15,7 +15,7 @@ spec: spec: containers: - name: goodfood-product - image: pierrelbg/goodfood-product:1.0 + image: pierrelbg/product-service:1.0.0 resources: limits: memory: "128Mi" diff --git a/services/product/k8s/service.yml b/services/product/k8s/service.yml index c10ceea2..b5034547 100644 --- a/services/product/k8s/service.yml +++ b/services/product/k8s/service.yml @@ -9,5 +9,5 @@ spec: - name: "grpc" port: 50004 targetPort: 50004 -status: - loadBalancer: {} \ No newline at end of file + type: LoadBalancer + loadBalancerIP: 10.10.10.10 \ No newline at end of file diff --git a/services/product/package-lock.json b/services/product/package-lock.json index 09d48637..1fb3a402 100644 --- a/services/product/package-lock.json +++ b/services/product/package-lock.json @@ -10,13 +10,12 @@ "@azure/storage-blob": "^12.14.0", "@grpc/grpc-js": "^1.8.14", "@grpc/proto-loader": "^0.7.6", - "@prisma/client": "^4.11.0", + "@prisma/client": "^4.16.2", "amqplib": "^0.10.3", "base64-arraybuffer": "^1.0.2", "express": "^4.18.2", - "nodemon": "^2.0.22", + "nodemon": "^1.14.9", "pkg": "^5.8.1", - "sharp": "^0.32.1", "vite-tsconfig-paths": "^4.2.0" }, "bin": { @@ -26,7 +25,7 @@ "@types/amqplib": "^0.10.1", "@types/node": "^18.16.7", "esbuild": "^0.18.11", - "prisma": "^4.11.0", + "prisma": "^4.16.2", "ts-node": "^10.9.1", "tsconfig-paths": "^4.2.0", "typescript": "^5.0.2" @@ -716,12 +715,12 @@ } }, "node_modules/@prisma/client": { - "version": "4.14.0", - "resolved": "https://registry.npmjs.org/@prisma/client/-/client-4.14.0.tgz", - "integrity": "sha512-MK/XaA2sFdfaOa7I9MjNKz6dxeIEdeZlnpNRoF2w3JuRLlFJLkpp6cD3yaqw2nUUhbrn3Iqe3ZpVV+VuGGil7Q==", + "version": "4.16.2", + "resolved": "https://registry.npmjs.org/@prisma/client/-/client-4.16.2.tgz", + "integrity": "sha512-qCoEyxv1ZrQ4bKy39GnylE8Zq31IRmm8bNhNbZx7bF2cU5aiCCnSa93J2imF88MBjn7J9eUQneNxUQVJdl/rPQ==", "hasInstallScript": true, "dependencies": { - "@prisma/engines-version": "4.14.0-67.d9a4c5988f480fa576d43970d5a23641aa77bc9c" + "@prisma/engines-version": "4.16.1-1.4bc8b6e1b66cb932731fb1bdbbc550d1e010de81" }, "engines": { "node": ">=14.17" @@ -736,16 +735,16 @@ } }, "node_modules/@prisma/engines": { - "version": "4.14.0", - "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-4.14.0.tgz", - "integrity": "sha512-PDNlhP/1vyTgmNyiucGqGCdXIp7HIkkvKO50si3y3PcceeHvqtiKPaH1iJdz63jCWMVMbj2MElSxXPOeBvEVIQ==", + "version": "4.16.2", + "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-4.16.2.tgz", + "integrity": "sha512-vx1nxVvN4QeT/cepQce68deh/Turxy5Mr+4L4zClFuK1GlxN3+ivxfuv+ej/gvidWn1cE1uAhW7ALLNlYbRUAw==", "devOptional": true, "hasInstallScript": true }, "node_modules/@prisma/engines-version": { - "version": "4.14.0-67.d9a4c5988f480fa576d43970d5a23641aa77bc9c", - "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-4.14.0-67.d9a4c5988f480fa576d43970d5a23641aa77bc9c.tgz", - "integrity": "sha512-3jum8/YSudeSN0zGW5qkpz+wAN2V/NYCQ+BPjvHYDfWatLWlQkqy99toX0GysDeaUoBIJg1vaz2yKqiA3CFcQw==" + "version": "4.16.1-1.4bc8b6e1b66cb932731fb1bdbbc550d1e010de81", + "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-4.16.1-1.4bc8b6e1b66cb932731fb1bdbbc550d1e010de81.tgz", + "integrity": "sha512-q617EUWfRIDTriWADZ4YiWRZXCa/WuhNgLTVd+HqWLffjMSPzyM5uOWoauX91wvQClSKZU4pzI4JJLQ9Kl62Qg==" }, "node_modules/@protobufjs/aspromise": { "version": "1.1.2", @@ -937,6 +936,53 @@ "node": ">=10" } }, + "node_modules/ansi-align": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-2.0.0.tgz", + "integrity": "sha512-TdlOggdA/zURfMYa7ABC66j+oqfMew58KpJMbUlH3bcZP1b+cBHIHDDn5uH9INsxrHBPjsqM0tDB4jPTF/vgJA==", + "dependencies": { + "string-width": "^2.0.0" + } + }, + "node_modules/ansi-align/node_modules/ansi-regex": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", + "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/ansi-align/node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", + "engines": { + "node": ">=4" + } + }, + "node_modules/ansi-align/node_modules/string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dependencies": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/ansi-align/node_modules/strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", + "dependencies": { + "ansi-regex": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", @@ -960,15 +1006,144 @@ } }, "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + } + }, + "node_modules/anymatch/node_modules/braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dependencies": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" }, "engines": { - "node": ">= 8" + "node": ">=0.10.0" + } + }, + "node_modules/anymatch/node_modules/braces/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/anymatch/node_modules/fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==", + "dependencies": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/anymatch/node_modules/fill-range/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/anymatch/node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/anymatch/node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/anymatch/node_modules/is-number/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/anymatch/node_modules/micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/anymatch/node_modules/normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==", + "dependencies": { + "remove-trailing-separator": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/anymatch/node_modules/to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==", + "dependencies": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + }, + "engines": { + "node": ">=0.10.0" } }, "node_modules/arg": { @@ -977,6 +1152,30 @@ "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", "dev": true }, + "node_modules/arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/array-flatten": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", @@ -990,6 +1189,33 @@ "node": ">=8" } }, + "node_modules/array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/async-each": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.6.tgz", + "integrity": "sha512-c646jH1avxr+aVpndVMeAfYw7wAa6idufrlN3LPA4PmKS0QEGp6PIC9nwz0WQkkvBGAMEki3pFdtxaF39J9vvg==", + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ] + }, "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", @@ -1003,11 +1229,50 @@ "node": ">= 4.0.0" } }, + "node_modules/atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "bin": { + "atob": "bin/atob.js" + }, + "engines": { + "node": ">= 4.5.0" + } + }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, + "node_modules/base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dependencies": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/base64-arraybuffer": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz", @@ -1036,11 +1301,20 @@ ] }, "node_modules/binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", "engines": { - "node": ">=8" + "node": ">=0.10.0" + } + }, + "node_modules/bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "optional": true, + "dependencies": { + "file-uri-to-path": "1.0.0" } }, "node_modules/bl": { @@ -1129,6 +1403,99 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, + "node_modules/boxen": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-1.3.0.tgz", + "integrity": "sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw==", + "dependencies": { + "ansi-align": "^2.0.0", + "camelcase": "^4.0.0", + "chalk": "^2.0.1", + "cli-boxes": "^1.0.0", + "string-width": "^2.0.0", + "term-size": "^1.2.0", + "widest-line": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/boxen/node_modules/ansi-regex": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", + "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/boxen/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/boxen/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/boxen/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/boxen/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "node_modules/boxen/node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", + "engines": { + "node": ">=4" + } + }, + "node_modules/boxen/node_modules/string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dependencies": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/boxen/node_modules/strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", + "dependencies": { + "ansi-regex": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -1185,6 +1552,25 @@ "node": ">= 0.8" } }, + "node_modules/cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dependencies": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/call-bind": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", @@ -1197,6 +1583,25 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha512-FxAv7HpHrXbh3aPo4o2qxHay2lkLY3x5Mw3KeE4KQE8ysVfziWeRZDwcjauvwBSGEC/nXUPzZy8zeh4HokqOnw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/capture-stack-trace": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.2.tgz", + "integrity": "sha512-X/WM2UQs6VMHUtjUDnZTRI+i1crWteJySFzr9UpGoQa4WQffXVTTXuekjl7TjZRlcF2XfjgITT0HxZ9RnxeT0w==", + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -1232,67 +1637,273 @@ } }, "node_modules/chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "deprecated": "Chokidar 2 does not receive security updates since 2019. Upgrade to chokidar 3 with 15x fewer dependencies", + "dependencies": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" }, "optionalDependencies": { - "fsevents": "~2.3.2" + "fsevents": "^1.2.7" } }, - "node_modules/chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" - }, - "node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "node_modules/chokidar/node_modules/braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" }, "engines": { - "node": ">=12" + "node": ">=0.10.0" } }, - "node_modules/color": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", - "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==", + "node_modules/chokidar/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", "dependencies": { - "color-convert": "^2.0.1", - "color-string": "^1.9.0" + "is-extendable": "^0.1.0" }, "engines": { - "node": ">=12.5.0" + "node": ">=0.10.0" } }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/chokidar/node_modules/fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==", "dependencies": { - "color-name": "~1.1.4" + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA==", + "dependencies": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + } + }, + "node_modules/chokidar/node_modules/glob-parent/node_modules/is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw==", + "dependencies": { + "is-extglob": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/chokidar/node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/chokidar/node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/chokidar/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/chokidar/node_modules/to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==", + "dependencies": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" + }, + "node_modules/ci-info": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.6.0.tgz", + "integrity": "sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==" + }, + "node_modules/class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "dependencies": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/is-accessor-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/is-data-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cli-boxes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz", + "integrity": "sha512-3Fo5wu8Ytle8q9iCzS4D2MWVL2X7JVWRiS1BnXbTFDhS9c/REkM9vd1AmabsoZoY5/dGi5TT9iKL8Kb6DeBRQg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw==", + "dependencies": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" }, "engines": { "node": ">=7.0.0" @@ -1303,15 +1914,6 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, - "node_modules/color-string": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", - "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", - "dependencies": { - "color-name": "^1.0.0", - "simple-swizzle": "^0.2.2" - } - }, "node_modules/combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", @@ -1323,11 +1925,32 @@ "node": ">= 0.8" } }, + "node_modules/component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" + }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" }, + "node_modules/configstore": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.5.tgz", + "integrity": "sha512-nlOhI4+fdzoK5xmJ+NY+1gZK56bwEaWZr8fYuXohZ9Vkc1o3a4T/R3M+yE/w7x/ZVJ1zF8c+oaOvF0dztdUgmA==", + "dependencies": { + "dot-prop": "^4.2.1", + "graceful-fs": "^4.1.2", + "make-dir": "^1.0.0", + "unique-string": "^1.0.0", + "write-file-atomic": "^2.0.0", + "xdg-basedir": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/content-disposition": { "version": "0.5.4", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", @@ -1379,17 +2002,68 @@ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" }, + "node_modules/copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/core-util-is": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" }, + "node_modules/create-error-class": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz", + "integrity": "sha512-gYTKKexFO3kh200H1Nit76sRwRtOY32vQd3jpAQKpLtZqyNsSQNfI4N7o3eP2wUjV35pTWKRYqFUDBvUha/Pkw==", + "dependencies": { + "capture-stack-trace": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/create-require": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", "dev": true }, + "node_modules/cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==", + "dependencies": { + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "node_modules/cross-spawn/node_modules/lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dependencies": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "node_modules/cross-spawn/node_modules/yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==" + }, + "node_modules/crypto-random-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", + "integrity": "sha512-GsVpkFPlycH7/fRR7Dhcmnoii54gV1nz7y4CWyeFS14N+JVBBhY+r8amRHE4BwSYal7BPTDp8isvAlCxyFt3Hg==", + "engines": { + "node": ">=4" + } + }, "node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -1406,6 +2080,14 @@ } } }, + "node_modules/decode-uri-component": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", + "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", + "engines": { + "node": ">=0.10" + } + }, "node_modules/decompress-response": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", @@ -1428,6 +2110,18 @@ "node": ">=4.0.0" } }, + "node_modules/define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dependencies": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -1481,6 +2175,22 @@ "node": ">=8" } }, + "node_modules/dot-prop": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.1.tgz", + "integrity": "sha512-l0p4+mIuJIua0mhxGoh4a+iNL9bmeK5DvnSVQa6T0OhrVmaEa1XScX5Etc673FePCJOArq/4Pa2cLGODUWTPOQ==", + "dependencies": { + "is-obj": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/duplexer3": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.5.tgz", + "integrity": "sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA==" + }, "node_modules/ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", @@ -1557,6 +2267,14 @@ "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "engines": { + "node": ">=0.8.0" + } + }, "node_modules/etag": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", @@ -1573,6 +2291,148 @@ "node": ">=0.8.x" } }, + "node_modules/execa": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", + "integrity": "sha512-RztN09XglpYI7aBBrJCPW95jEH7YF1UEPOoX9yDhUTPdp7mK+CQvnLTuD10BNXZ3byLTu2uehZ8EcKT/4CGiFw==", + "dependencies": { + "cross-spawn": "^5.0.1", + "get-stream": "^3.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==", + "dependencies": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/expand-brackets/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/is-accessor-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/is-data-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, "node_modules/expand-template": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", @@ -1654,7 +2514,67 @@ } ] }, - "node_modules/fast-glob": { + "node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dependencies": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob/node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-glob": { "version": "3.2.12", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", @@ -1677,6 +2597,12 @@ "reusify": "^1.0.4" } }, + "node_modules/file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "optional": true + }, "node_modules/fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", @@ -1718,6 +2644,14 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, + "node_modules/for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/form-data": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", @@ -1739,6 +2673,17 @@ "node": ">= 0.6" } }, + "node_modules/fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA==", + "dependencies": { + "map-cache": "^0.2.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/fresh": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", @@ -1803,16 +2748,21 @@ } }, "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", + "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", + "deprecated": "The v1 package contains DANGEROUS / INSECURE binaries. Upgrade to safe fsevents v2", "hasInstallScript": true, "optional": true, "os": [ "darwin" ], + "dependencies": { + "bindings": "^1.5.0", + "nan": "^2.12.1" + }, "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + "node": ">= 4.0" } }, "node_modules/function-bind": { @@ -1841,6 +2791,22 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/github-from-package": { "version": "0.0.0", "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", @@ -1857,6 +2823,17 @@ "node": ">= 6" } }, + "node_modules/global-dirs": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", + "integrity": "sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg==", + "dependencies": { + "ini": "^1.3.4" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/globby": { "version": "11.1.0", "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", @@ -1881,6 +2858,27 @@ "resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz", "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==" }, + "node_modules/got": { + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz", + "integrity": "sha512-Y/K3EDuiQN9rTZhBvPRWMLXIKdeD1Rj0nzunfoi0Yyn5WBEbzxXKU9Ub2X41oZBagVWOBU3MuDonFMgPWQFnwg==", + "dependencies": { + "create-error-class": "^3.0.0", + "duplexer3": "^0.1.4", + "get-stream": "^3.0.0", + "is-redirect": "^1.0.0", + "is-retry-allowed": "^1.0.0", + "is-stream": "^1.0.0", + "lowercase-keys": "^1.0.0", + "safe-buffer": "^5.0.1", + "timed-out": "^4.0.0", + "unzip-response": "^2.0.1", + "url-parse-lax": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/graceful-fs": { "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", @@ -1916,6 +2914,64 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw==", + "dependencies": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ==", + "dependencies": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values/node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values/node_modules/is-number/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values/node_modules/kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw==", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/http-errors": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", @@ -1986,6 +3042,22 @@ "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==" }, + "node_modules/import-lazy": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", + "integrity": "sha512-m7ZEHgtw69qOGw+jwxXkHlrlIPdTGkyh66zXZ1ajZbxkDBNjSY/LGbmjc7h0s2ELsUDTAhFr55TrPSSqJGPG0A==", + "engines": { + "node": ">=4" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "engines": { + "node": ">=0.8.19" + } + }, "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", @@ -2019,20 +3091,42 @@ "node": ">= 0.10" } }, - "node_modules/is-arrayish": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", - "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" + "node_modules/is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } }, "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha512-9fRVlXc0uCxEDj1nQzaWONSpbTfx0FmJfzHF7pwlI8DkWGoHBBea4Pg5Ky0ojwwxQmnSifgbKkI06Qv0Ljgj+Q==", "dependencies": { - "binary-extensions": "^2.0.0" + "binary-extensions": "^1.0.0" }, "engines": { - "node": ">=8" + "node": ">=0.10.0" + } + }, + "node_modules/is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" + }, + "node_modules/is-ci": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.2.1.tgz", + "integrity": "sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg==", + "dependencies": { + "ci-info": "^1.5.0" + }, + "bin": { + "is-ci": "bin.js" } }, "node_modules/is-core-module": { @@ -2046,6 +3140,41 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dependencies": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -2073,6 +3202,26 @@ "node": ">=0.10.0" } }, + "node_modules/is-installed-globally": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.1.0.tgz", + "integrity": "sha512-ERNhMg+i/XgDwPIPF3u24qpajVreaiSuvpb1Uu0jugw7KKcxGyCX8cgp8P5fwTmAuXku6beDHHECdKArjlg7tw==", + "dependencies": { + "global-dirs": "^0.1.0", + "is-path-inside": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/is-npm": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-1.0.0.tgz", + "integrity": "sha512-9r39FIr3d+KD9SbX0sfMsHzb5PP3uimOiwr3YupUaUFG4W0l1U57Rx3utpttV7qz5U3jmrO5auUa04LU9pyHsg==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", @@ -2081,11 +3230,86 @@ "node": ">=0.12.0" } }, + "node_modules/is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-path-inside": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", + "integrity": "sha512-qhsCR/Esx4U4hg/9I19OVUAJkGWtjRYHMRgUMZE2TDdj+Ag+kttZanLupfddNyglzz50cUlmWzUaI37GDfNx/g==", + "dependencies": { + "path-is-inside": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-redirect": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz", + "integrity": "sha512-cr/SlUEe5zOGmzvj9bUyC4LVvkNVAXu4GytXLNMr1pny+a65MpQ9IJzFHD5vi7FyJgb4qt27+eS3TuQnqB+RQw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-retry-allowed": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz", + "integrity": "sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/isarray": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + }, + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/jsesc": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", @@ -2120,6 +3344,25 @@ "graceful-fs": "^4.1.6" } }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/latest-version": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-3.1.0.tgz", + "integrity": "sha512-Be1YRHWWlZaSsrz2U+VInk+tO0EwLIyV+23RhWLINJYwg/UIikxjlj3MhH37/6/EDCAusjajvMkMMUXRaMWl/w==", + "dependencies": { + "package-json": "^4.0.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/lodash.camelcase": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", @@ -2130,6 +3373,14 @@ "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" }, + "node_modules/lowercase-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", @@ -2141,12 +3392,42 @@ "node": ">=10" } }, + "node_modules/make-dir": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", + "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", + "dependencies": { + "pify": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/make-error": { "version": "1.3.6", "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", "dev": true }, + "node_modules/map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w==", + "dependencies": { + "object-visit": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", @@ -2248,6 +3529,18 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "dependencies": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/mkdirp-classic": { "version": "0.5.3", "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", @@ -2321,13 +3614,40 @@ "safe-buffer": "~5.2.0" } }, - "node_modules/napi-build-utils": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", - "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==" + "node_modules/nan": { + "version": "2.17.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.17.0.tgz", + "integrity": "sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ==", + "optional": true }, - "node_modules/negotiator": { - "version": "0.6.3", + "node_modules/nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/napi-build-utils": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", + "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==" + }, + "node_modules/negotiator": { + "version": "0.6.3", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", "engines": { @@ -2345,25 +3665,6 @@ "node": ">=10" } }, - "node_modules/node-abi/node_modules/semver": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.0.tgz", - "integrity": "sha512-+XC0AD/R7Q2mPSRuy2Id0+CGTZ98+8f+KvwirxOKIEyid+XSx6HbC63p+O4IndTHuX5Z+JxQ0TghCkO5Cg/2HA==", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/node-addon-api": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-6.1.0.tgz", - "integrity": "sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==" - }, "node_modules/node-fetch": { "version": "2.6.11", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.11.tgz", @@ -2384,30 +3685,27 @@ } }, "node_modules/nodemon": { - "version": "2.0.22", - "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.22.tgz", - "integrity": "sha512-B8YqaKMmyuCO7BowF1Z1/mkPqLk6cs/l63Ojtd6otKjMx47Dq1utxfRxcavH1I7VSaL8n5BUaoutadnsX3AAVQ==", + "version": "1.19.4", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-1.19.4.tgz", + "integrity": "sha512-VGPaqQBNk193lrJFotBU8nvWZPqEZY2eIzymy2jjY0fJ9qIsxA0sxQ8ATPl0gZC645gijYEc1jtZvpS8QWzJGQ==", + "hasInstallScript": true, "dependencies": { - "chokidar": "^3.5.2", - "debug": "^3.2.7", + "chokidar": "^2.1.8", + "debug": "^3.2.6", "ignore-by-default": "^1.0.1", - "minimatch": "^3.1.2", - "pstree.remy": "^1.1.8", + "minimatch": "^3.0.4", + "pstree.remy": "^1.1.7", "semver": "^5.7.1", - "simple-update-notifier": "^1.0.7", "supports-color": "^5.5.0", "touch": "^3.1.0", - "undefsafe": "^2.0.5" + "undefsafe": "^2.0.2", + "update-notifier": "^2.5.0" }, "bin": { "nodemon": "bin/nodemon.js" }, "engines": { - "node": ">=8.10.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/nodemon" + "node": ">=4" } }, "node_modules/nodemon/node_modules/debug": { @@ -2418,6 +3716,14 @@ "ms": "^2.1.1" } }, + "node_modules/nodemon/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "bin": { + "semver": "bin/semver" + } + }, "node_modules/nopt": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", @@ -2440,6 +3746,95 @@ "node": ">=0.10.0" } }, + "node_modules/npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==", + "dependencies": { + "path-key": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ==", + "dependencies": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/is-descriptor/node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/object-inspect": { "version": "1.12.3", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", @@ -2448,6 +3843,28 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA==", + "dependencies": { + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/on-finished": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", @@ -2467,6 +3884,14 @@ "wrappy": "1" } }, + "node_modules/p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", + "engines": { + "node": ">=4" + } + }, "node_modules/p-is-promise": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-3.0.0.tgz", @@ -2475,6 +3900,28 @@ "node": ">=8" } }, + "node_modules/package-json": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-4.0.1.tgz", + "integrity": "sha512-q/R5GrMek0vzgoomq6rm9OX+3PQve8sLwTirmK30YB3Cu0Bbt9OX9M/SIUnroN5BGJkzwGsFwDaRGD9EwBOlCA==", + "dependencies": { + "got": "^6.7.1", + "registry-auth-token": "^3.0.1", + "registry-url": "^3.0.3", + "semver": "^5.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/package-json/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "bin": { + "semver": "bin/semver" + } + }, "node_modules/parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", @@ -2483,6 +3930,40 @@ "node": ">= 0.8" } }, + "node_modules/pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha512-ALzNPpyNq9AqXMBjeymIjFDAkAFH06mHJH/cSBHAgU0s4vfpBn6b2nf8tiRLvagKD8RbTpq2FKTBg7cl9l3c7Q==" + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==" + }, + "node_modules/path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", + "engines": { + "node": ">=4" + } + }, "node_modules/path-parse": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", @@ -2512,6 +3993,14 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", + "engines": { + "node": ">=4" + } + }, "node_modules/pkg": { "version": "5.8.1", "resolved": "https://registry.npmjs.org/pkg/-/pkg-5.8.1.tgz", @@ -2572,20 +4061,6 @@ "wrap-ansi": "^7.0.0" } }, - "node_modules/pkg-fetch/node_modules/semver": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.0.tgz", - "integrity": "sha512-+XC0AD/R7Q2mPSRuy2Id0+CGTZ98+8f+KvwirxOKIEyid+XSx6HbC63p+O4IndTHuX5Z+JxQ0TghCkO5Cg/2HA==", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/pkg-fetch/node_modules/yargs": { "version": "16.2.0", "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", @@ -2611,6 +4086,14 @@ "node": ">=10" } }, + "node_modules/posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/prebuild-install": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.1.tgz", @@ -2636,14 +4119,22 @@ "node": ">=10" } }, + "node_modules/prepend-http": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", + "integrity": "sha512-PhmXi5XmoyKw1Un4E+opM2KcsJInDvKyuOumcjjw3waw86ZNjHwVUOOWLc4bCzLdcKNaWBH9e99sbWzDQsVaYg==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/prisma": { - "version": "4.14.0", - "resolved": "https://registry.npmjs.org/prisma/-/prisma-4.14.0.tgz", - "integrity": "sha512-+5dMl1uxMQb4RepndY6AwR9xi1cDcaGFICu+ws6/Nmgt93mFPNj8tYxSfTdmfg+rkNrUId9rk/Ac2vTgLe/oXA==", + "version": "4.16.2", + "resolved": "https://registry.npmjs.org/prisma/-/prisma-4.16.2.tgz", + "integrity": "sha512-SYCsBvDf0/7XSJyf2cHTLjLeTLVXYfqp7pG5eEVafFLeT0u/hLFz/9W196nDRGUOo1JfPatAEb+uEnTQImQC1g==", "devOptional": true, "hasInstallScript": true, "dependencies": { - "@prisma/engines": "4.14.0" + "@prisma/engines": "4.16.2" }, "bin": { "prisma": "build/index.js", @@ -2714,6 +4205,11 @@ "node": ">= 0.10" } }, + "node_modules/pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==" + }, "node_modules/pstree.remy": { "version": "1.1.8", "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", @@ -2814,14 +4310,217 @@ } }, "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "dependencies": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/readdirp/node_modules/braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dependencies": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp/node_modules/braces/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp/node_modules/fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==", + "dependencies": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp/node_modules/fill-range/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp/node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp/node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp/node_modules/is-number/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "node_modules/readdirp/node_modules/micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/readdirp/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/readdirp/node_modules/to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==", + "dependencies": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dependencies": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/registry-auth-token": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.4.0.tgz", + "integrity": "sha512-4LM6Fw8eBQdwMYcES4yTnn2TqIasbXuwDx3um+QRs7S55aMKCBKBxvPXl2RiUjHwuJLTyYfxSpmfSAjQpcuP+A==", + "dependencies": { + "rc": "^1.1.6", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/registry-url": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz", + "integrity": "sha512-ZbgR5aZEdf4UKZVBPYIgaglBmSF2Hi94s2PcIHhRGFjKYu+chjJdYfHn4rt3hB6eCKLJ8giVIIfgMa1ehDfZKA==", "dependencies": { - "picomatch": "^2.2.1" + "rc": "^1.0.1" }, "engines": { - "node": ">=8.10.0" + "node": ">=0.10.0" + } + }, + "node_modules/remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==" + }, + "node_modules/repeat-element": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz", + "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", + "engines": { + "node": ">=0.10" } }, "node_modules/require-directory": { @@ -2853,6 +4552,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==", + "deprecated": "https://github.com/lydell/resolve-url#deprecated" + }, "node_modules/resolve/node_modules/is-core-module": { "version": "2.12.0", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.0.tgz", @@ -2864,6 +4569,14 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "engines": { + "node": ">=0.12" + } + }, "node_modules/reusify": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", @@ -2900,6 +4613,14 @@ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, + "node_modules/safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==", + "dependencies": { + "ret": "~0.1.10" + } + }, "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", @@ -2911,6 +4632,31 @@ "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" }, "node_modules/semver": { + "version": "7.5.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.3.tgz", + "integrity": "sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver-diff": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz", + "integrity": "sha512-gL8F8L4ORwsS0+iQ34yCYv///jsOq0ZL7WP55d1HnJ32o7tyFYEFQZQA22mrLIacZdU6xecaBBZ+uEiffGNyXw==", + "dependencies": { + "semver": "^5.0.3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/semver-diff/node_modules/semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", @@ -2973,136 +4719,428 @@ "node": ">= 0.8.0" } }, + "node_modules/set-value": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "dependencies": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/set-value/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/set-value/node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" }, - "node_modules/sharp": { - "version": "0.32.1", - "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.32.1.tgz", - "integrity": "sha512-kQTFtj7ldpUqSe8kDxoGLZc1rnMFU0AO2pqbX6pLy3b7Oj8ivJIdoKNwxHVQG2HN6XpHPJqCSM2nsma2gOXvOg==", - "hasInstallScript": true, + "node_modules/shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", "dependencies": { - "color": "^4.2.3", - "detect-libc": "^2.0.1", - "node-addon-api": "^6.1.0", - "prebuild-install": "^7.1.1", - "semver": "^7.5.0", - "simple-get": "^4.0.1", - "tar-fs": "^2.1.1", - "tunnel-agent": "^0.6.0" + "shebang-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + }, + "node_modules/simple-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/simple-get": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", + "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "decompress-response": "^6.0.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "dependencies": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "dependencies": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dependencies": { + "kind-of": "^3.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-util/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/snapdragon/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/is-accessor-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/is-data-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-resolve": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", + "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", + "deprecated": "See https://github.com/lydell/source-map-resolve#deprecated", + "dependencies": { + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "node_modules/source-map-url": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz", + "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==", + "deprecated": "See https://github.com/lydell/source-map-url#deprecated" + }, + "node_modules/split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "dependencies": { + "extend-shallow": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g==", + "dependencies": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" }, "engines": { - "node": ">=14.15.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" + "node": ">=0.10.0" } }, - "node_modules/sharp/node_modules/semver": { - "version": "7.5.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.3.tgz", - "integrity": "sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==", + "node_modules/static-extend/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" + "is-descriptor": "^0.1.0" }, "engines": { - "node": ">=10" + "node": ">=0.10.0" } }, - "node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "node_modules/static-extend/node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" + "kind-of": "^3.0.2" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=0.10.0" } }, - "node_modules/simple-concat": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", - "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/simple-get": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", - "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], + "node_modules/static-extend/node_modules/is-accessor-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", "dependencies": { - "decompress-response": "^6.0.0", - "once": "^1.3.1", - "simple-concat": "^1.0.0" + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/simple-swizzle": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", - "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", + "node_modules/static-extend/node_modules/is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", "dependencies": { - "is-arrayish": "^0.3.1" + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/simple-update-notifier": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-1.1.0.tgz", - "integrity": "sha512-VpsrsJSUcJEseSbMHkrsrAVSdvVS5I96Qo1QAQ4FxQ9wXFcB+pjj7FB7/us9+GcgfW4ziHtYMc1J0PLczb55mg==", + "node_modules/static-extend/node_modules/is-data-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", "dependencies": { - "semver": "~7.0.0" + "is-buffer": "^1.1.5" }, "engines": { - "node": ">=8.10.0" + "node": ">=0.10.0" } }, - "node_modules/simple-update-notifier/node_modules/semver": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", - "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", - "bin": { - "semver": "bin/semver.js" + "node_modules/static-extend/node_modules/is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "node_modules/static-extend/node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, "node_modules/statuses": { @@ -3186,6 +5224,14 @@ "node": ">=4" } }, + "node_modules/strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/strip-json-comments": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", @@ -3282,6 +5328,25 @@ "safe-buffer": "~5.2.0" } }, + "node_modules/term-size": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz", + "integrity": "sha512-7dPUZQGy/+m3/wjVz3ZW5dobSoD/02NxJpoXUX0WIyjfVS3l0c+b/+9phIDFA7FHzkYtwtMFgeGZ/Y8jVTeqQQ==", + "dependencies": { + "execa": "^0.7.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/timed-out": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", + "integrity": "sha512-G7r3AhovYtr5YKOWQkta8RKAPb+J9IsO4uVmzjl8AZwfhs8UcUwTiD6gcJYSgOtzyjvQKrKYn41syHbUWMkafA==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", @@ -3290,6 +5355,42 @@ "node": ">=4" } }, + "node_modules/to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-object-path/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dependencies": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -3455,6 +5556,39 @@ "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==" }, + "node_modules/union-value": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "dependencies": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/union-value/node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unique-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", + "integrity": "sha512-ODgiYu03y5g76A1I9Gt0/chLCzQjvzDy7DsZGsLOE/1MrF6wriEskSncj1+/C58Xk/kPZDppSctDybCwOSaGAg==", + "dependencies": { + "crypto-random-string": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/universalify": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", @@ -3471,6 +5605,135 @@ "node": ">= 0.8" } }, + "node_modules/unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ==", + "dependencies": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q==", + "dependencies": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-value/node_modules/isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==", + "dependencies": { + "isarray": "1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "node_modules/unzip-response": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz", + "integrity": "sha512-N0XH6lqDtFH84JxptQoZYmloF4nzrQqqrAymNj+/gW60AO2AZgOcf4O/nUXJcYfyQkqvMo9lSupBZmmgvuVXlw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/upath": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", + "engines": { + "node": ">=4", + "yarn": "*" + } + }, + "node_modules/update-notifier": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-2.5.0.tgz", + "integrity": "sha512-gwMdhgJHGuj/+wHJJs9e6PcCszpxR1b236igrOkUofGhqJuG+amlIKwApH1IW1WWl7ovZxsX49lMBWLxSdm5Dw==", + "dependencies": { + "boxen": "^1.2.1", + "chalk": "^2.0.1", + "configstore": "^3.0.0", + "import-lazy": "^2.1.0", + "is-ci": "^1.0.10", + "is-installed-globally": "^0.1.0", + "is-npm": "^1.0.0", + "latest-version": "^3.0.0", + "semver-diff": "^2.0.0", + "xdg-basedir": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/update-notifier/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/update-notifier/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/update-notifier/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/update-notifier/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "node_modules/urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==", + "deprecated": "Please see https://github.com/lydell/urix#deprecated" + }, "node_modules/url-parse": { "version": "1.5.10", "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", @@ -3480,6 +5743,25 @@ "requires-port": "^1.0.0" } }, + "node_modules/url-parse-lax": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", + "integrity": "sha512-BVA4lR5PIviy2PMseNd2jbFQ+jwSwQGdJejf5ctd1rEXt0Ypd7yanUK9+lYechVlN5VaTJGsu2U/3MDDu6KgBA==", + "dependencies": { + "prepend-http": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -3547,6 +5829,67 @@ "webidl-conversions": "^3.0.0" } }, + "node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/widest-line": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-2.0.1.tgz", + "integrity": "sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA==", + "dependencies": { + "string-width": "^2.1.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/widest-line/node_modules/ansi-regex": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", + "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/widest-line/node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", + "engines": { + "node": ">=4" + } + }, + "node_modules/widest-line/node_modules/string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dependencies": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/widest-line/node_modules/strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", + "dependencies": { + "ansi-regex": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", @@ -3568,6 +5911,24 @@ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" }, + "node_modules/write-file-atomic": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz", + "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==", + "dependencies": { + "graceful-fs": "^4.1.11", + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.2" + } + }, + "node_modules/xdg-basedir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz", + "integrity": "sha512-1Dly4xqlulvPD3fZUQJLY+FUIeqN3N2MM3uqe4rCJftAvOjFa3jFGfctOgluGx4ahPbUCsZkmJILiP0Vi4T6lQ==", + "engines": { + "node": ">=4" + } + }, "node_modules/xml2js": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.5.0.tgz", diff --git a/services/product/package.json b/services/product/package.json index 195f1f65..45115615 100644 --- a/services/product/package.json +++ b/services/product/package.json @@ -15,7 +15,7 @@ "@types/amqplib": "^0.10.1", "@types/node": "^18.16.7", "esbuild": "^0.18.11", - "prisma": "^4.11.0", + "prisma": "^4.16.2", "ts-node": "^10.9.1", "tsconfig-paths": "^4.2.0", "typescript": "^5.0.2" @@ -24,13 +24,12 @@ "@azure/storage-blob": "^12.14.0", "@grpc/grpc-js": "^1.8.14", "@grpc/proto-loader": "^0.7.6", - "@prisma/client": "^4.11.0", + "@prisma/client": "^4.16.2", "amqplib": "^0.10.3", "base64-arraybuffer": "^1.0.2", "express": "^4.18.2", - "nodemon": "^2.0.22", + "nodemon": "^1.14.9", "pkg": "^5.8.1", - "sharp": "^0.32.1", "vite-tsconfig-paths": "^4.2.0" }, "pkg": { diff --git a/services/product/pnpm-lock.yaml b/services/product/pnpm-lock.yaml index 57560425..97e33af7 100644 --- a/services/product/pnpm-lock.yaml +++ b/services/product/pnpm-lock.yaml @@ -4,17 +4,16 @@ specifiers: '@azure/storage-blob': ^12.14.0 '@grpc/grpc-js': ^1.8.14 '@grpc/proto-loader': ^0.7.6 - '@prisma/client': ^4.11.0 + '@prisma/client': ^4.16.2 '@types/amqplib': ^0.10.1 '@types/node': ^18.16.7 amqplib: ^0.10.3 base64-arraybuffer: ^1.0.2 esbuild: ^0.18.11 express: ^4.18.2 - nodemon: ^2.0.22 + nodemon: ^1.14.9 pkg: ^5.8.1 - prisma: ^4.11.0 - sharp: ^0.32.1 + prisma: ^4.16.2 ts-node: ^10.9.1 tsconfig-paths: ^4.2.0 typescript: ^5.0.2 @@ -24,20 +23,19 @@ dependencies: '@azure/storage-blob': 12.14.0 '@grpc/grpc-js': 1.8.14 '@grpc/proto-loader': 0.7.6 - '@prisma/client': 4.11.0_prisma@4.11.0 + '@prisma/client': 4.16.2_prisma@4.16.2 amqplib: 0.10.3 base64-arraybuffer: 1.0.2 express: 4.18.2 - nodemon: 2.0.22 + nodemon: 1.19.4 pkg: 5.8.1 - sharp: 0.32.1 vite-tsconfig-paths: 4.2.0_typescript@5.0.2 devDependencies: '@types/amqplib': 0.10.1 '@types/node': 18.16.19 esbuild: 0.18.11 - prisma: 4.11.0 + prisma: 4.16.2 ts-node: 10.9.1_3n2f44gk7n7p32zpas3y4w4iqy tsconfig-paths: 4.2.0 typescript: 5.0.2 @@ -462,8 +460,8 @@ packages: engines: {node: '>=8.0.0'} dev: false - /@prisma/client/4.11.0_prisma@4.11.0: - resolution: {integrity: sha512-0INHYkQIqgAjrt7NzhYpeDQi8x3Nvylc2uDngKyFDDj1tTRQ4uV1HnVmd1sQEraeVAN63SOK0dgCKQHlvjL0KA==} + /@prisma/client/4.16.2_prisma@4.16.2: + resolution: {integrity: sha512-qCoEyxv1ZrQ4bKy39GnylE8Zq31IRmm8bNhNbZx7bF2cU5aiCCnSa93J2imF88MBjn7J9eUQneNxUQVJdl/rPQ==} engines: {node: '>=14.17'} requiresBuild: true peerDependencies: @@ -472,16 +470,16 @@ packages: prisma: optional: true dependencies: - '@prisma/engines-version': 4.11.0-57.8fde8fef4033376662cad983758335009d522acb - prisma: 4.11.0 + '@prisma/engines-version': 4.16.1-1.4bc8b6e1b66cb932731fb1bdbbc550d1e010de81 + prisma: 4.16.2 dev: false - /@prisma/engines-version/4.11.0-57.8fde8fef4033376662cad983758335009d522acb: - resolution: {integrity: sha512-3Vd8Qq06d5xD8Ch5WauWcUUrsVPdMC6Ge8ILji8RFfyhUpqon6qSyGM0apvr1O8n8qH8cKkEFqRPsYjuz5r83g==} + /@prisma/engines-version/4.16.1-1.4bc8b6e1b66cb932731fb1bdbbc550d1e010de81: + resolution: {integrity: sha512-q617EUWfRIDTriWADZ4YiWRZXCa/WuhNgLTVd+HqWLffjMSPzyM5uOWoauX91wvQClSKZU4pzI4JJLQ9Kl62Qg==} dev: false - /@prisma/engines/4.11.0: - resolution: {integrity: sha512-0AEBi2HXGV02cf6ASsBPhfsVIbVSDC9nbQed4iiY5eHttW9ZtMxHThuKZE1pnESbr8HRdgmFSa/Kn4OSNYuibg==} + /@prisma/engines/4.16.2: + resolution: {integrity: sha512-vx1nxVvN4QeT/cepQce68deh/Turxy5Mr+4L4zClFuK1GlxN3+ivxfuv+ej/gvidWn1cE1uAhW7ALLNlYbRUAw==} requiresBuild: true /@protobufjs/aspromise/1.1.2: @@ -549,6 +547,12 @@ packages: '@types/node': 18.16.19 dev: true + /@types/keyv/3.1.4: + resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} + dependencies: + '@types/node': 18.16.19 + dev: false + /@types/long/4.0.2: resolution: {integrity: sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==} dev: false @@ -563,6 +567,12 @@ packages: /@types/node/18.16.19: resolution: {integrity: sha512-IXl7o+R9iti9eBW4Wg2hx1xQDig183jj7YLn8F7udNceyfkbn1ZxmzZXuak20gR40D7pIkIY1kYGx5VIGbaHKA==} + /@types/responselike/1.0.0: + resolution: {integrity: sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==} + dependencies: + '@types/node': 18.16.19 + dev: false + /@types/tunnel/0.0.3: resolution: {integrity: sha512-sOUTGn6h1SfQ+gbgqC364jLFBw2lnFqkgF3q0WovEHRLMrVD1sd5aufqi/aJObLekJO+Aq5z646U4Oxy6shXMA==} dependencies: @@ -613,11 +623,29 @@ packages: - supports-color dev: false + /ansi-align/2.0.0: + resolution: {integrity: sha512-TdlOggdA/zURfMYa7ABC66j+oqfMew58KpJMbUlH3bcZP1b+cBHIHDDn5uH9INsxrHBPjsqM0tDB4jPTF/vgJA==} + dependencies: + string-width: 2.1.1 + dev: false + + /ansi-regex/3.0.1: + resolution: {integrity: sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==} + engines: {node: '>=4'} + dev: false + /ansi-regex/5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} dev: false + /ansi-styles/3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} + dependencies: + color-convert: 1.9.3 + dev: false + /ansi-styles/4.3.0: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} engines: {node: '>=8'} @@ -625,18 +653,34 @@ packages: color-convert: 2.0.1 dev: false - /anymatch/3.1.3: - resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} - engines: {node: '>= 8'} + /anymatch/2.0.0_supports-color@5.5.0: + resolution: {integrity: sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==} dependencies: - normalize-path: 3.0.0 - picomatch: 2.3.1 + micromatch: 3.1.10_supports-color@5.5.0 + normalize-path: 2.1.1 + transitivePeerDependencies: + - supports-color dev: false /arg/4.1.3: resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} dev: true + /arr-diff/4.0.0: + resolution: {integrity: sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==} + engines: {node: '>=0.10.0'} + dev: false + + /arr-flatten/1.1.0: + resolution: {integrity: sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==} + engines: {node: '>=0.10.0'} + dev: false + + /arr-union/3.1.0: + resolution: {integrity: sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==} + engines: {node: '>=0.10.0'} + dev: false + /array-flatten/1.1.1: resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} dev: false @@ -646,6 +690,20 @@ packages: engines: {node: '>=8'} dev: false + /array-unique/0.3.2: + resolution: {integrity: sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==} + engines: {node: '>=0.10.0'} + dev: false + + /assign-symbols/1.0.0: + resolution: {integrity: sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==} + engines: {node: '>=0.10.0'} + dev: false + + /async-each/1.0.6: + resolution: {integrity: sha512-c646jH1avxr+aVpndVMeAfYw7wAa6idufrlN3LPA4PmKS0QEGp6PIC9nwz0WQkkvBGAMEki3pFdtxaF39J9vvg==} + dev: false + /asynckit/0.4.0: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} dev: false @@ -655,10 +713,29 @@ packages: engines: {node: '>= 4.0.0'} dev: false + /atob/2.1.2: + resolution: {integrity: sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==} + engines: {node: '>= 4.5.0'} + hasBin: true + dev: false + /balanced-match/1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} dev: false + /base/0.11.2: + resolution: {integrity: sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==} + engines: {node: '>=0.10.0'} + dependencies: + cache-base: 1.0.1 + class-utils: 0.3.6 + component-emitter: 1.3.0 + define-property: 1.0.0 + isobject: 3.0.1 + mixin-deep: 1.3.2 + pascalcase: 0.1.1 + dev: false + /base64-arraybuffer/1.0.2: resolution: {integrity: sha512-I3yl4r9QB5ZRY3XuJVEPfc2XhZO6YweFPI+UovAzn+8/hb3oJ6lnysaFcjVpkCPfVWFUDvoZ8kmVDP7WyRtYtQ==} engines: {node: '>= 0.6.0'} @@ -668,11 +745,19 @@ packages: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} dev: false - /binary-extensions/2.2.0: - resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} - engines: {node: '>=8'} + /binary-extensions/1.13.1: + resolution: {integrity: sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==} + engines: {node: '>=0.10.0'} dev: false + /bindings/1.5.0: + resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} + requiresBuild: true + dependencies: + file-uri-to-path: 1.0.0 + dev: false + optional: true + /bl/4.1.0: resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} dependencies: @@ -701,6 +786,19 @@ packages: - supports-color dev: false + /boxen/1.3.0: + resolution: {integrity: sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw==} + engines: {node: '>=4'} + dependencies: + ansi-align: 2.0.0 + camelcase: 4.1.0 + chalk: 2.4.2 + cli-boxes: 1.0.0 + string-width: 2.1.1 + term-size: 1.2.0 + widest-line: 2.0.1 + dev: false + /brace-expansion/1.1.11: resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} dependencies: @@ -708,6 +806,24 @@ packages: concat-map: 0.0.1 dev: false + /braces/2.3.2_supports-color@5.5.0: + resolution: {integrity: sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==} + engines: {node: '>=0.10.0'} + dependencies: + arr-flatten: 1.1.0 + array-unique: 0.3.2 + extend-shallow: 2.0.1 + fill-range: 4.0.0 + isobject: 3.0.1 + repeat-element: 1.1.4 + snapdragon: 0.8.2_supports-color@5.5.0 + snapdragon-node: 2.1.1 + split-string: 3.1.0 + to-regex: 3.0.2 + transitivePeerDependencies: + - supports-color + dev: false + /braces/3.0.2: resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} engines: {node: '>=8'} @@ -731,6 +847,21 @@ packages: engines: {node: '>= 0.8'} dev: false + /cache-base/1.0.1: + resolution: {integrity: sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==} + engines: {node: '>=0.10.0'} + dependencies: + collection-visit: 1.0.0 + component-emitter: 1.3.0 + get-value: 2.0.6 + has-value: 1.0.0 + isobject: 3.0.1 + set-value: 2.0.1 + to-object-path: 0.3.0 + union-value: 1.0.1 + unset-value: 1.0.0 + dev: false + /call-bind/1.0.2: resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==} dependencies: @@ -738,6 +869,25 @@ packages: get-intrinsic: 1.2.0 dev: false + /camelcase/4.1.0: + resolution: {integrity: sha512-FxAv7HpHrXbh3aPo4o2qxHay2lkLY3x5Mw3KeE4KQE8ysVfziWeRZDwcjauvwBSGEC/nXUPzZy8zeh4HokqOnw==} + engines: {node: '>=4'} + dev: false + + /capture-stack-trace/1.0.2: + resolution: {integrity: sha512-X/WM2UQs6VMHUtjUDnZTRI+i1crWteJySFzr9UpGoQa4WQffXVTTXuekjl7TjZRlcF2XfjgITT0HxZ9RnxeT0w==} + engines: {node: '>=0.10.0'} + 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 + dev: false + /chalk/4.1.2: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} @@ -746,25 +896,50 @@ packages: supports-color: 7.2.0 dev: false - /chokidar/3.5.3: - resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} - engines: {node: '>= 8.10.0'} + /chokidar/2.1.8_supports-color@5.5.0: + resolution: {integrity: sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==} + deprecated: Chokidar 2 does not receive security updates since 2019. Upgrade to chokidar 3 with 15x fewer dependencies dependencies: - anymatch: 3.1.3 - braces: 3.0.2 - glob-parent: 5.1.2 - is-binary-path: 2.1.0 + anymatch: 2.0.0_supports-color@5.5.0 + async-each: 1.0.6 + braces: 2.3.2_supports-color@5.5.0 + glob-parent: 3.1.0 + inherits: 2.0.4 + is-binary-path: 1.0.1 is-glob: 4.0.3 normalize-path: 3.0.0 - readdirp: 3.6.0 + path-is-absolute: 1.0.1 + readdirp: 2.2.1_supports-color@5.5.0 + upath: 1.2.0 optionalDependencies: - fsevents: 2.3.2 + fsevents: 1.2.13 + transitivePeerDependencies: + - supports-color dev: false /chownr/1.1.4: resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} dev: false + /ci-info/1.6.0: + resolution: {integrity: sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==} + dev: false + + /class-utils/0.3.6: + resolution: {integrity: sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==} + engines: {node: '>=0.10.0'} + dependencies: + arr-union: 3.1.0 + define-property: 0.2.5 + isobject: 3.0.1 + static-extend: 0.1.2 + dev: false + + /cli-boxes/1.0.0: + resolution: {integrity: sha512-3Fo5wu8Ytle8q9iCzS4D2MWVL2X7JVWRiS1BnXbTFDhS9c/REkM9vd1AmabsoZoY5/dGi5TT9iKL8Kb6DeBRQg==} + engines: {node: '>=0.10.0'} + dev: false + /cliui/7.0.4: resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} dependencies: @@ -773,30 +948,33 @@ packages: wrap-ansi: 7.0.0 dev: false - /color-convert/2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} + /collection-visit/1.0.0: + resolution: {integrity: sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw==} + engines: {node: '>=0.10.0'} dependencies: - color-name: 1.1.4 + map-visit: 1.0.0 + object-visit: 1.0.1 dev: false - /color-name/1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + /color-convert/1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + dependencies: + color-name: 1.1.3 dev: false - /color-string/1.9.1: - resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} + /color-convert/2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} dependencies: color-name: 1.1.4 - simple-swizzle: 0.2.2 dev: false - /color/4.2.3: - resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==} - engines: {node: '>=12.5.0'} - dependencies: - color-convert: 2.0.1 - color-string: 1.9.1 + /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==} dev: false /combined-stream/1.0.8: @@ -806,10 +984,26 @@ packages: delayed-stream: 1.0.0 dev: false + /component-emitter/1.3.0: + resolution: {integrity: sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==} + dev: false + /concat-map/0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} dev: false + /configstore/3.1.5: + resolution: {integrity: sha512-nlOhI4+fdzoK5xmJ+NY+1gZK56bwEaWZr8fYuXohZ9Vkc1o3a4T/R3M+yE/w7x/ZVJ1zF8c+oaOvF0dztdUgmA==} + engines: {node: '>=4'} + dependencies: + dot-prop: 4.2.1 + graceful-fs: 4.2.11 + make-dir: 1.3.0 + unique-string: 1.0.0 + write-file-atomic: 2.4.3 + xdg-basedir: 3.0.0 + dev: false + /content-disposition/0.5.4: resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} engines: {node: '>= 0.6'} @@ -831,14 +1025,39 @@ packages: engines: {node: '>= 0.6'} dev: false + /copy-descriptor/0.1.1: + resolution: {integrity: sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw==} + engines: {node: '>=0.10.0'} + dev: false + /core-util-is/1.0.3: resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} dev: false + /create-error-class/3.0.2: + resolution: {integrity: sha512-gYTKKexFO3kh200H1Nit76sRwRtOY32vQd3jpAQKpLtZqyNsSQNfI4N7o3eP2wUjV35pTWKRYqFUDBvUha/Pkw==} + engines: {node: '>=0.10.0'} + dependencies: + capture-stack-trace: 1.0.2 + dev: false + /create-require/1.1.1: resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} dev: true + /cross-spawn/5.1.0: + resolution: {integrity: sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==} + dependencies: + lru-cache: 4.1.5 + shebang-command: 1.2.0 + which: 1.3.1 + dev: false + + /crypto-random-string/1.0.0: + resolution: {integrity: sha512-GsVpkFPlycH7/fRR7Dhcmnoii54gV1nz7y4CWyeFS14N+JVBBhY+r8amRHE4BwSYal7BPTDp8isvAlCxyFt3Hg==} + engines: {node: '>=4'} + dev: false + /debug/2.6.9: resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} peerDependencies: @@ -850,6 +1069,18 @@ packages: ms: 2.0.0 dev: false + /debug/2.6.9_supports-color@5.5.0: + resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.0.0 + supports-color: 5.5.0 + dev: false + /debug/3.2.7_supports-color@5.5.0: resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} peerDependencies: @@ -874,6 +1105,11 @@ packages: ms: 2.1.2 dev: false + /decode-uri-component/0.2.2: + resolution: {integrity: sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==} + engines: {node: '>=0.10'} + dev: false + /decompress-response/6.0.0: resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} engines: {node: '>=10'} @@ -886,6 +1122,28 @@ packages: engines: {node: '>=4.0.0'} dev: false + /define-property/0.2.5: + resolution: {integrity: sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==} + engines: {node: '>=0.10.0'} + dependencies: + is-descriptor: 0.1.6 + dev: false + + /define-property/1.0.0: + resolution: {integrity: sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==} + engines: {node: '>=0.10.0'} + dependencies: + is-descriptor: 1.0.2 + dev: false + + /define-property/2.0.2: + resolution: {integrity: sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==} + engines: {node: '>=0.10.0'} + dependencies: + is-descriptor: 1.0.2 + isobject: 3.0.1 + dev: false + /delayed-stream/1.0.0: resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} engines: {node: '>=0.4.0'} @@ -918,6 +1176,17 @@ packages: path-type: 4.0.0 dev: false + /dot-prop/4.2.1: + resolution: {integrity: sha512-l0p4+mIuJIua0mhxGoh4a+iNL9bmeK5DvnSVQa6T0OhrVmaEa1XScX5Etc673FePCJOArq/4Pa2cLGODUWTPOQ==} + engines: {node: '>=4'} + dependencies: + is-obj: 1.0.1 + dev: false + + /duplexer3/0.1.5: + resolution: {integrity: sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA==} + dev: false + /ee-first/1.1.1: resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} dev: false @@ -976,6 +1245,11 @@ packages: resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} dev: false + /escape-string-regexp/1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + dev: false + /etag/1.8.1: resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} engines: {node: '>= 0.6'} @@ -986,6 +1260,34 @@ packages: engines: {node: '>=0.8.x'} dev: false + /execa/0.7.0: + resolution: {integrity: sha512-RztN09XglpYI7aBBrJCPW95jEH7YF1UEPOoX9yDhUTPdp7mK+CQvnLTuD10BNXZ3byLTu2uehZ8EcKT/4CGiFw==} + engines: {node: '>=4'} + dependencies: + cross-spawn: 5.1.0 + get-stream: 3.0.0 + is-stream: 1.1.0 + npm-run-path: 2.0.2 + p-finally: 1.0.0 + signal-exit: 3.0.7 + strip-eof: 1.0.0 + dev: false + + /expand-brackets/2.1.4_supports-color@5.5.0: + resolution: {integrity: sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==} + engines: {node: '>=0.10.0'} + dependencies: + debug: 2.6.9_supports-color@5.5.0 + define-property: 0.2.5 + extend-shallow: 2.0.1 + posix-character-classes: 0.1.1 + regex-not: 1.0.2 + snapdragon: 0.8.2_supports-color@5.5.0 + to-regex: 3.0.2 + transitivePeerDependencies: + - supports-color + dev: false + /expand-template/2.0.3: resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} engines: {node: '>=6'} @@ -1030,6 +1332,37 @@ packages: - supports-color dev: false + /extend-shallow/2.0.1: + resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} + engines: {node: '>=0.10.0'} + dependencies: + is-extendable: 0.1.1 + dev: false + + /extend-shallow/3.0.2: + resolution: {integrity: sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==} + engines: {node: '>=0.10.0'} + dependencies: + assign-symbols: 1.0.0 + is-extendable: 1.0.1 + dev: false + + /extglob/2.0.4_supports-color@5.5.0: + resolution: {integrity: sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==} + engines: {node: '>=0.10.0'} + dependencies: + array-unique: 0.3.2 + define-property: 1.0.0 + expand-brackets: 2.1.4_supports-color@5.5.0 + extend-shallow: 2.0.1 + fragment-cache: 0.2.1 + regex-not: 1.0.2 + snapdragon: 0.8.2_supports-color@5.5.0 + to-regex: 3.0.2 + transitivePeerDependencies: + - supports-color + dev: false + /fast-glob/3.2.12: resolution: {integrity: sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==} engines: {node: '>=8.6.0'} @@ -1047,6 +1380,22 @@ packages: reusify: 1.0.4 dev: false + /file-uri-to-path/1.0.0: + resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} + requiresBuild: true + dev: false + optional: true + + /fill-range/4.0.0: + resolution: {integrity: sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==} + engines: {node: '>=0.10.0'} + dependencies: + extend-shallow: 2.0.1 + is-number: 3.0.0 + repeat-string: 1.6.1 + to-regex-range: 2.1.1 + dev: false + /fill-range/7.0.1: resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} engines: {node: '>=8'} @@ -1069,6 +1418,11 @@ packages: - supports-color dev: false + /for-in/1.0.2: + resolution: {integrity: sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==} + engines: {node: '>=0.10.0'} + dev: false + /form-data/3.0.1: resolution: {integrity: sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==} engines: {node: '>= 6'} @@ -1092,6 +1446,13 @@ packages: engines: {node: '>= 0.6'} dev: false + /fragment-cache/0.2.1: + resolution: {integrity: sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA==} + engines: {node: '>=0.10.0'} + dependencies: + map-cache: 0.2.2 + dev: false + /fresh/0.5.2: resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} engines: {node: '>= 0.6'} @@ -1118,11 +1479,15 @@ packages: universalify: 2.0.0 dev: false - /fsevents/2.3.2: - resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + /fsevents/1.2.13: + resolution: {integrity: sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==} + engines: {node: '>= 4.0'} os: [darwin] + deprecated: The v1 package contains DANGEROUS / INSECURE binaries. Upgrade to safe fsevents v2 requiresBuild: true + dependencies: + bindings: 1.5.0 + nan: 2.17.0 dev: false optional: true @@ -1143,10 +1508,27 @@ packages: has-symbols: 1.0.3 dev: false + /get-stream/3.0.0: + resolution: {integrity: sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==} + engines: {node: '>=4'} + dev: false + + /get-value/2.0.6: + resolution: {integrity: sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==} + engines: {node: '>=0.10.0'} + dev: false + /github-from-package/0.0.0: resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==} dev: false + /glob-parent/3.1.0: + resolution: {integrity: sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA==} + dependencies: + is-glob: 3.1.0 + path-dirname: 1.0.2 + dev: false + /glob-parent/5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} @@ -1154,6 +1536,13 @@ packages: is-glob: 4.0.3 dev: false + /global-dirs/0.1.1: + resolution: {integrity: sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg==} + engines: {node: '>=4'} + dependencies: + ini: 1.3.8 + dev: false + /globby/11.1.0: resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} engines: {node: '>=10'} @@ -1170,6 +1559,25 @@ packages: resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} dev: false + /got/6.7.1: + resolution: {integrity: sha512-Y/K3EDuiQN9rTZhBvPRWMLXIKdeD1Rj0nzunfoi0Yyn5WBEbzxXKU9Ub2X41oZBagVWOBU3MuDonFMgPWQFnwg==} + engines: {node: '>=4'} + dependencies: + '@types/keyv': 3.1.4 + '@types/responselike': 1.0.0 + create-error-class: 3.0.2 + duplexer3: 0.1.5 + get-stream: 3.0.0 + is-redirect: 1.0.0 + is-retry-allowed: 1.2.0 + is-stream: 1.1.0 + lowercase-keys: 1.0.1 + safe-buffer: 5.2.1 + timed-out: 4.0.1 + unzip-response: 2.0.1 + url-parse-lax: 1.0.0 + dev: false + /graceful-fs/4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} dev: false @@ -1189,6 +1597,37 @@ packages: engines: {node: '>= 0.4'} dev: false + /has-value/0.3.1: + resolution: {integrity: sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q==} + engines: {node: '>=0.10.0'} + dependencies: + get-value: 2.0.6 + has-values: 0.1.4 + isobject: 2.1.0 + dev: false + + /has-value/1.0.0: + resolution: {integrity: sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw==} + engines: {node: '>=0.10.0'} + dependencies: + get-value: 2.0.6 + has-values: 1.0.0 + isobject: 3.0.1 + dev: false + + /has-values/0.1.4: + resolution: {integrity: sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ==} + engines: {node: '>=0.10.0'} + dev: false + + /has-values/1.0.0: + resolution: {integrity: sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ==} + engines: {node: '>=0.10.0'} + dependencies: + is-number: 3.0.0 + kind-of: 4.0.0 + dev: false + /has/1.0.3: resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} engines: {node: '>= 0.4.0'} @@ -1237,6 +1676,16 @@ packages: engines: {node: '>= 4'} dev: false + /import-lazy/2.1.0: + resolution: {integrity: sha512-m7ZEHgtw69qOGw+jwxXkHlrlIPdTGkyh66zXZ1ajZbxkDBNjSY/LGbmjc7h0s2ELsUDTAhFr55TrPSSqJGPG0A==} + engines: {node: '>=4'} + dev: false + + /imurmurhash/0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + dev: false + /inherits/2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} dev: false @@ -1258,15 +1707,36 @@ packages: engines: {node: '>= 0.10'} dev: false - /is-arrayish/0.3.2: - resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} + /is-accessor-descriptor/0.1.6: + resolution: {integrity: sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==} + engines: {node: '>=0.10.0'} + dependencies: + kind-of: 3.2.2 dev: false - /is-binary-path/2.1.0: - resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} - engines: {node: '>=8'} + /is-accessor-descriptor/1.0.0: + resolution: {integrity: sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==} + engines: {node: '>=0.10.0'} + dependencies: + kind-of: 6.0.3 + dev: false + + /is-binary-path/1.0.1: + resolution: {integrity: sha512-9fRVlXc0uCxEDj1nQzaWONSpbTfx0FmJfzHF7pwlI8DkWGoHBBea4Pg5Ky0ojwwxQmnSifgbKkI06Qv0Ljgj+Q==} + engines: {node: '>=0.10.0'} + dependencies: + binary-extensions: 1.13.1 + dev: false + + /is-buffer/1.1.6: + resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==} + dev: false + + /is-ci/1.2.1: + resolution: {integrity: sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg==} + hasBin: true dependencies: - binary-extensions: 2.2.0 + ci-info: 1.6.0 dev: false /is-core-module/2.12.0: @@ -1281,16 +1751,72 @@ packages: has: 1.0.3 dev: false + /is-data-descriptor/0.1.4: + resolution: {integrity: sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==} + engines: {node: '>=0.10.0'} + dependencies: + kind-of: 3.2.2 + dev: false + + /is-data-descriptor/1.0.0: + resolution: {integrity: sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==} + engines: {node: '>=0.10.0'} + dependencies: + kind-of: 6.0.3 + dev: false + + /is-descriptor/0.1.6: + resolution: {integrity: sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==} + engines: {node: '>=0.10.0'} + dependencies: + is-accessor-descriptor: 0.1.6 + is-data-descriptor: 0.1.4 + kind-of: 5.1.0 + dev: false + + /is-descriptor/1.0.2: + resolution: {integrity: sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==} + engines: {node: '>=0.10.0'} + dependencies: + is-accessor-descriptor: 1.0.0 + is-data-descriptor: 1.0.0 + kind-of: 6.0.3 + dev: false + + /is-extendable/0.1.1: + resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==} + engines: {node: '>=0.10.0'} + dev: false + + /is-extendable/1.0.1: + resolution: {integrity: sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==} + engines: {node: '>=0.10.0'} + dependencies: + is-plain-object: 2.0.4 + dev: false + /is-extglob/2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} dev: false + /is-fullwidth-code-point/2.0.0: + resolution: {integrity: sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==} + engines: {node: '>=4'} + dev: false + /is-fullwidth-code-point/3.0.0: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} engines: {node: '>=8'} dev: false + /is-glob/3.1.0: + resolution: {integrity: sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw==} + engines: {node: '>=0.10.0'} + dependencies: + is-extglob: 2.1.1 + dev: false + /is-glob/4.0.3: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} @@ -1298,11 +1824,70 @@ packages: is-extglob: 2.1.1 dev: false + /is-installed-globally/0.1.0: + resolution: {integrity: sha512-ERNhMg+i/XgDwPIPF3u24qpajVreaiSuvpb1Uu0jugw7KKcxGyCX8cgp8P5fwTmAuXku6beDHHECdKArjlg7tw==} + engines: {node: '>=4'} + dependencies: + global-dirs: 0.1.1 + is-path-inside: 1.0.1 + dev: false + + /is-npm/1.0.0: + resolution: {integrity: sha512-9r39FIr3d+KD9SbX0sfMsHzb5PP3uimOiwr3YupUaUFG4W0l1U57Rx3utpttV7qz5U3jmrO5auUa04LU9pyHsg==} + engines: {node: '>=0.10.0'} + dev: false + + /is-number/3.0.0: + resolution: {integrity: sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==} + engines: {node: '>=0.10.0'} + dependencies: + kind-of: 3.2.2 + dev: false + /is-number/7.0.0: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} dev: false + /is-obj/1.0.1: + resolution: {integrity: sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==} + engines: {node: '>=0.10.0'} + dev: false + + /is-path-inside/1.0.1: + resolution: {integrity: sha512-qhsCR/Esx4U4hg/9I19OVUAJkGWtjRYHMRgUMZE2TDdj+Ag+kttZanLupfddNyglzz50cUlmWzUaI37GDfNx/g==} + engines: {node: '>=0.10.0'} + dependencies: + path-is-inside: 1.0.2 + dev: false + + /is-plain-object/2.0.4: + resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} + engines: {node: '>=0.10.0'} + dependencies: + isobject: 3.0.1 + dev: false + + /is-redirect/1.0.0: + resolution: {integrity: sha512-cr/SlUEe5zOGmzvj9bUyC4LVvkNVAXu4GytXLNMr1pny+a65MpQ9IJzFHD5vi7FyJgb4qt27+eS3TuQnqB+RQw==} + engines: {node: '>=0.10.0'} + dev: false + + /is-retry-allowed/1.2.0: + resolution: {integrity: sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==} + engines: {node: '>=0.10.0'} + dev: false + + /is-stream/1.1.0: + resolution: {integrity: sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==} + engines: {node: '>=0.10.0'} + dev: false + + /is-windows/1.0.2: + resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} + engines: {node: '>=0.10.0'} + dev: false + /isarray/0.0.1: resolution: {integrity: sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==} dev: false @@ -1311,6 +1896,22 @@ packages: resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} dev: false + /isexe/2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + dev: false + + /isobject/2.1.0: + resolution: {integrity: sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==} + engines: {node: '>=0.10.0'} + dependencies: + isarray: 1.0.0 + dev: false + + /isobject/3.0.1: + resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} + engines: {node: '>=0.10.0'} + dev: false + /jsesc/2.5.2: resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} engines: {node: '>=4'} @@ -1331,6 +1932,37 @@ packages: graceful-fs: 4.2.11 dev: false + /kind-of/3.2.2: + resolution: {integrity: sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==} + engines: {node: '>=0.10.0'} + dependencies: + is-buffer: 1.1.6 + dev: false + + /kind-of/4.0.0: + resolution: {integrity: sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw==} + engines: {node: '>=0.10.0'} + dependencies: + is-buffer: 1.1.6 + dev: false + + /kind-of/5.1.0: + resolution: {integrity: sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==} + engines: {node: '>=0.10.0'} + dev: false + + /kind-of/6.0.3: + resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} + engines: {node: '>=0.10.0'} + dev: false + + /latest-version/3.1.0: + resolution: {integrity: sha512-Be1YRHWWlZaSsrz2U+VInk+tO0EwLIyV+23RhWLINJYwg/UIikxjlj3MhH37/6/EDCAusjajvMkMMUXRaMWl/w==} + engines: {node: '>=4'} + dependencies: + package-json: 4.0.1 + dev: false + /lodash.camelcase/4.3.0: resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} dev: false @@ -1339,8 +1971,20 @@ packages: resolution: {integrity: sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==} dev: false - /long/5.2.3: - resolution: {integrity: sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==} + /long/5.2.3: + resolution: {integrity: sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==} + dev: false + + /lowercase-keys/1.0.1: + resolution: {integrity: sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==} + engines: {node: '>=0.10.0'} + dev: false + + /lru-cache/4.1.5: + resolution: {integrity: sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==} + dependencies: + pseudomap: 1.0.2 + yallist: 2.1.2 dev: false /lru-cache/6.0.0: @@ -1350,10 +1994,29 @@ packages: yallist: 4.0.0 dev: false + /make-dir/1.3.0: + resolution: {integrity: sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==} + engines: {node: '>=4'} + dependencies: + pify: 3.0.0 + dev: false + /make-error/1.3.6: resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} dev: true + /map-cache/0.2.2: + resolution: {integrity: sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==} + engines: {node: '>=0.10.0'} + dev: false + + /map-visit/1.0.0: + resolution: {integrity: sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w==} + engines: {node: '>=0.10.0'} + dependencies: + object-visit: 1.0.1 + dev: false + /media-typer/0.3.0: resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} engines: {node: '>= 0.6'} @@ -1373,6 +2036,27 @@ packages: engines: {node: '>= 0.6'} dev: false + /micromatch/3.1.10_supports-color@5.5.0: + resolution: {integrity: sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==} + engines: {node: '>=0.10.0'} + dependencies: + arr-diff: 4.0.0 + array-unique: 0.3.2 + braces: 2.3.2_supports-color@5.5.0 + define-property: 2.0.2 + extend-shallow: 3.0.2 + extglob: 2.0.4_supports-color@5.5.0 + fragment-cache: 0.2.1 + kind-of: 6.0.3 + nanomatch: 1.2.13_supports-color@5.5.0 + object.pick: 1.3.0 + regex-not: 1.0.2 + snapdragon: 0.8.2_supports-color@5.5.0 + to-regex: 3.0.2 + transitivePeerDependencies: + - supports-color + dev: false + /micromatch/4.0.5: resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} engines: {node: '>=8.6'} @@ -1413,6 +2097,14 @@ packages: /minimist/1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + /mixin-deep/1.3.2: + resolution: {integrity: sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==} + engines: {node: '>=0.10.0'} + dependencies: + for-in: 1.0.2 + is-extendable: 1.0.1 + dev: false + /mkdirp-classic/0.5.3: resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} dev: false @@ -1436,6 +2128,31 @@ packages: readable-stream: 3.6.2 dev: false + /nan/2.17.0: + resolution: {integrity: sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ==} + requiresBuild: true + dev: false + optional: true + + /nanomatch/1.2.13_supports-color@5.5.0: + resolution: {integrity: sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==} + engines: {node: '>=0.10.0'} + dependencies: + arr-diff: 4.0.0 + array-unique: 0.3.2 + define-property: 2.0.2 + extend-shallow: 3.0.2 + fragment-cache: 0.2.1 + is-windows: 1.0.2 + kind-of: 6.0.3 + object.pick: 1.3.0 + regex-not: 1.0.2 + snapdragon: 0.8.2_supports-color@5.5.0 + to-regex: 3.0.2 + transitivePeerDependencies: + - supports-color + dev: false + /napi-build-utils/1.0.2: resolution: {integrity: sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==} dev: false @@ -1452,10 +2169,6 @@ packages: semver: 7.5.0 dev: false - /node-addon-api/6.1.0: - resolution: {integrity: sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==} - dev: false - /node-fetch/2.6.11: resolution: {integrity: sha512-4I6pdBY1EthSqDmJkiNk3JIT8cswwR9nfeW/cPdUagJYEQG7R95WRH74wpz7ma8Gh/9dI9FP+OU+0E4FvtA55w==} engines: {node: 4.x || >=6.0.0} @@ -1468,21 +2181,22 @@ packages: whatwg-url: 5.0.0 dev: false - /nodemon/2.0.22: - resolution: {integrity: sha512-B8YqaKMmyuCO7BowF1Z1/mkPqLk6cs/l63Ojtd6otKjMx47Dq1utxfRxcavH1I7VSaL8n5BUaoutadnsX3AAVQ==} - engines: {node: '>=8.10.0'} + /nodemon/1.19.4: + resolution: {integrity: sha512-VGPaqQBNk193lrJFotBU8nvWZPqEZY2eIzymy2jjY0fJ9qIsxA0sxQ8ATPl0gZC645gijYEc1jtZvpS8QWzJGQ==} + engines: {node: '>=4'} hasBin: true + requiresBuild: true dependencies: - chokidar: 3.5.3 + chokidar: 2.1.8_supports-color@5.5.0 debug: 3.2.7_supports-color@5.5.0 ignore-by-default: 1.0.1 minimatch: 3.1.2 pstree.remy: 1.1.8 semver: 5.7.1 - simple-update-notifier: 1.1.0 supports-color: 5.5.0 touch: 3.1.0 undefsafe: 2.0.5 + update-notifier: 2.5.0 dev: false /nopt/1.0.10: @@ -1492,15 +2206,52 @@ packages: abbrev: 1.1.1 dev: false + /normalize-path/2.1.1: + resolution: {integrity: sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==} + engines: {node: '>=0.10.0'} + dependencies: + remove-trailing-separator: 1.1.0 + dev: false + /normalize-path/3.0.0: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} dev: false + /npm-run-path/2.0.2: + resolution: {integrity: sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==} + engines: {node: '>=4'} + dependencies: + path-key: 2.0.1 + dev: false + + /object-copy/0.1.0: + resolution: {integrity: sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ==} + engines: {node: '>=0.10.0'} + dependencies: + copy-descriptor: 0.1.1 + define-property: 0.2.5 + kind-of: 3.2.2 + dev: false + /object-inspect/1.12.3: resolution: {integrity: sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==} dev: false + /object-visit/1.0.1: + resolution: {integrity: sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA==} + engines: {node: '>=0.10.0'} + dependencies: + isobject: 3.0.1 + dev: false + + /object.pick/1.3.0: + resolution: {integrity: sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==} + engines: {node: '>=0.10.0'} + dependencies: + isobject: 3.0.1 + dev: false + /on-finished/2.4.1: resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} engines: {node: '>= 0.8'} @@ -1514,16 +2265,54 @@ packages: wrappy: 1.0.2 dev: false + /p-finally/1.0.0: + resolution: {integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==} + engines: {node: '>=4'} + dev: false + /p-is-promise/3.0.0: resolution: {integrity: sha512-Wo8VsW4IRQSKVXsJCn7TomUaVtyfjVDn3nUP7kE967BQk0CwFpdbZs0X0uk5sW9mkBa9eNM7hCMaG93WUAwxYQ==} engines: {node: '>=8'} dev: false + /package-json/4.0.1: + resolution: {integrity: sha512-q/R5GrMek0vzgoomq6rm9OX+3PQve8sLwTirmK30YB3Cu0Bbt9OX9M/SIUnroN5BGJkzwGsFwDaRGD9EwBOlCA==} + engines: {node: '>=4'} + dependencies: + got: 6.7.1 + registry-auth-token: 3.4.0 + registry-url: 3.1.0 + semver: 5.7.1 + dev: false + /parseurl/1.3.3: resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} engines: {node: '>= 0.8'} dev: false + /pascalcase/0.1.1: + resolution: {integrity: sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw==} + engines: {node: '>=0.10.0'} + dev: false + + /path-dirname/1.0.2: + resolution: {integrity: sha512-ALzNPpyNq9AqXMBjeymIjFDAkAFH06mHJH/cSBHAgU0s4vfpBn6b2nf8tiRLvagKD8RbTpq2FKTBg7cl9l3c7Q==} + dev: false + + /path-is-absolute/1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + dev: false + + /path-is-inside/1.0.2: + resolution: {integrity: sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==} + dev: false + + /path-key/2.0.1: + resolution: {integrity: sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==} + engines: {node: '>=4'} + dev: false + /path-parse/1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} dev: false @@ -1542,6 +2331,11 @@ packages: engines: {node: '>=8.6'} dev: false + /pify/3.0.0: + resolution: {integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==} + engines: {node: '>=4'} + dev: false + /pkg-fetch/3.4.2: resolution: {integrity: sha512-0+uijmzYcnhC0hStDjm/cl2VYdrmVVBpe7Q8k9YBojxmR5tG8mvR9/nooQq3QSXiQqORDVOTY3XqMEqJVIzkHA==} hasBin: true @@ -1587,6 +2381,11 @@ packages: - supports-color dev: false + /posix-character-classes/0.1.1: + resolution: {integrity: sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg==} + engines: {node: '>=0.10.0'} + dev: false + /prebuild-install/7.1.1: resolution: {integrity: sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==} engines: {node: '>=10'} @@ -1606,13 +2405,18 @@ packages: tunnel-agent: 0.6.0 dev: false - /prisma/4.11.0: - resolution: {integrity: sha512-4zZmBXssPUEiX+GeL0MUq/Yyie4ltiKmGu7jCJFnYMamNrrulTBc+D+QwAQSJ01tyzeGHlD13kOnqPwRipnlNw==} + /prepend-http/1.0.4: + resolution: {integrity: sha512-PhmXi5XmoyKw1Un4E+opM2KcsJInDvKyuOumcjjw3waw86ZNjHwVUOOWLc4bCzLdcKNaWBH9e99sbWzDQsVaYg==} + engines: {node: '>=0.10.0'} + dev: false + + /prisma/4.16.2: + resolution: {integrity: sha512-SYCsBvDf0/7XSJyf2cHTLjLeTLVXYfqp7pG5eEVafFLeT0u/hLFz/9W196nDRGUOo1JfPatAEb+uEnTQImQC1g==} engines: {node: '>=14.17'} hasBin: true requiresBuild: true dependencies: - '@prisma/engines': 4.11.0 + '@prisma/engines': 4.16.2 /process-nextick-args/2.0.1: resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} @@ -1655,6 +2459,10 @@ packages: ipaddr.js: 1.9.1 dev: false + /pseudomap/1.0.2: + resolution: {integrity: sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==} + dev: false + /pstree.remy/1.1.8: resolution: {integrity: sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==} dev: false @@ -1736,11 +2544,51 @@ packages: util-deprecate: 1.0.2 dev: false - /readdirp/3.6.0: - resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} - engines: {node: '>=8.10.0'} + /readdirp/2.2.1_supports-color@5.5.0: + resolution: {integrity: sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==} + engines: {node: '>=0.10'} dependencies: - picomatch: 2.3.1 + graceful-fs: 4.2.11 + micromatch: 3.1.10_supports-color@5.5.0 + readable-stream: 2.3.8 + transitivePeerDependencies: + - supports-color + dev: false + + /regex-not/1.0.2: + resolution: {integrity: sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==} + engines: {node: '>=0.10.0'} + dependencies: + extend-shallow: 3.0.2 + safe-regex: 1.1.0 + dev: false + + /registry-auth-token/3.4.0: + resolution: {integrity: sha512-4LM6Fw8eBQdwMYcES4yTnn2TqIasbXuwDx3um+QRs7S55aMKCBKBxvPXl2RiUjHwuJLTyYfxSpmfSAjQpcuP+A==} + dependencies: + rc: 1.2.8 + safe-buffer: 5.2.1 + dev: false + + /registry-url/3.1.0: + resolution: {integrity: sha512-ZbgR5aZEdf4UKZVBPYIgaglBmSF2Hi94s2PcIHhRGFjKYu+chjJdYfHn4rt3hB6eCKLJ8giVIIfgMa1ehDfZKA==} + engines: {node: '>=0.10.0'} + dependencies: + rc: 1.2.8 + dev: false + + /remove-trailing-separator/1.1.0: + resolution: {integrity: sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==} + dev: false + + /repeat-element/1.1.4: + resolution: {integrity: sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==} + engines: {node: '>=0.10.0'} + dev: false + + /repeat-string/1.6.1: + resolution: {integrity: sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==} + engines: {node: '>=0.10'} dev: false /require-directory/2.1.1: @@ -1752,6 +2600,11 @@ packages: resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} dev: false + /resolve-url/0.2.1: + resolution: {integrity: sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==} + deprecated: https://github.com/lydell/resolve-url#deprecated + dev: false + /resolve/1.22.2: resolution: {integrity: sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==} hasBin: true @@ -1761,6 +2614,11 @@ packages: supports-preserve-symlinks-flag: 1.0.0 dev: false + /ret/0.1.15: + resolution: {integrity: sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==} + engines: {node: '>=0.12'} + dev: false + /reusify/1.0.4: resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} @@ -1780,6 +2638,12 @@ packages: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} dev: false + /safe-regex/1.1.0: + resolution: {integrity: sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==} + dependencies: + ret: 0.1.15 + dev: false + /safer-buffer/2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} dev: false @@ -1788,13 +2652,15 @@ packages: resolution: {integrity: sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==} dev: false - /semver/5.7.1: - resolution: {integrity: sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==} - hasBin: true + /semver-diff/2.1.0: + resolution: {integrity: sha512-gL8F8L4ORwsS0+iQ34yCYv///jsOq0ZL7WP55d1HnJ32o7tyFYEFQZQA22mrLIacZdU6xecaBBZ+uEiffGNyXw==} + engines: {node: '>=0.10.0'} + dependencies: + semver: 5.7.1 dev: false - /semver/7.0.0: - resolution: {integrity: sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==} + /semver/5.7.1: + resolution: {integrity: sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==} hasBin: true dev: false @@ -1839,23 +2705,30 @@ packages: - supports-color dev: false + /set-value/2.0.1: + resolution: {integrity: sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==} + engines: {node: '>=0.10.0'} + dependencies: + extend-shallow: 2.0.1 + is-extendable: 0.1.1 + is-plain-object: 2.0.4 + split-string: 3.1.0 + dev: false + /setprototypeof/1.2.0: resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} dev: false - /sharp/0.32.1: - resolution: {integrity: sha512-kQTFtj7ldpUqSe8kDxoGLZc1rnMFU0AO2pqbX6pLy3b7Oj8ivJIdoKNwxHVQG2HN6XpHPJqCSM2nsma2gOXvOg==} - engines: {node: '>=14.15.0'} - requiresBuild: true + /shebang-command/1.2.0: + resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==} + engines: {node: '>=0.10.0'} dependencies: - color: 4.2.3 - detect-libc: 2.0.1 - node-addon-api: 6.1.0 - prebuild-install: 7.1.1 - semver: 7.5.0 - simple-get: 4.0.1 - tar-fs: 2.1.1 - tunnel-agent: 0.6.0 + shebang-regex: 1.0.0 + dev: false + + /shebang-regex/1.0.0: + resolution: {integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==} + engines: {node: '>=0.10.0'} dev: false /side-channel/1.0.4: @@ -1866,6 +2739,10 @@ packages: object-inspect: 1.12.3 dev: false + /signal-exit/3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + dev: false + /simple-concat/1.0.1: resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} dev: false @@ -1878,22 +2755,77 @@ packages: simple-concat: 1.0.1 dev: false - /simple-swizzle/0.2.2: - resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} + /slash/3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + dev: false + + /snapdragon-node/2.1.1: + resolution: {integrity: sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==} + engines: {node: '>=0.10.0'} dependencies: - is-arrayish: 0.3.2 + define-property: 1.0.0 + isobject: 3.0.1 + snapdragon-util: 3.0.1 dev: false - /simple-update-notifier/1.1.0: - resolution: {integrity: sha512-VpsrsJSUcJEseSbMHkrsrAVSdvVS5I96Qo1QAQ4FxQ9wXFcB+pjj7FB7/us9+GcgfW4ziHtYMc1J0PLczb55mg==} - engines: {node: '>=8.10.0'} + /snapdragon-util/3.0.1: + resolution: {integrity: sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==} + engines: {node: '>=0.10.0'} dependencies: - semver: 7.0.0 + kind-of: 3.2.2 dev: false - /slash/3.0.0: - resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} - engines: {node: '>=8'} + /snapdragon/0.8.2_supports-color@5.5.0: + resolution: {integrity: sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==} + engines: {node: '>=0.10.0'} + dependencies: + base: 0.11.2 + debug: 2.6.9_supports-color@5.5.0 + define-property: 0.2.5 + extend-shallow: 2.0.1 + map-cache: 0.2.2 + source-map: 0.5.7 + source-map-resolve: 0.5.3 + use: 3.1.1 + transitivePeerDependencies: + - supports-color + dev: false + + /source-map-resolve/0.5.3: + resolution: {integrity: sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==} + deprecated: See https://github.com/lydell/source-map-resolve#deprecated + dependencies: + atob: 2.1.2 + decode-uri-component: 0.2.2 + resolve-url: 0.2.1 + source-map-url: 0.4.1 + urix: 0.1.0 + dev: false + + /source-map-url/0.4.1: + resolution: {integrity: sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==} + deprecated: See https://github.com/lydell/source-map-url#deprecated + dev: false + + /source-map/0.5.7: + resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==} + engines: {node: '>=0.10.0'} + dev: false + + /split-string/3.1.0: + resolution: {integrity: sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==} + engines: {node: '>=0.10.0'} + dependencies: + extend-shallow: 3.0.2 + dev: false + + /static-extend/0.1.2: + resolution: {integrity: sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g==} + engines: {node: '>=0.10.0'} + dependencies: + define-property: 0.2.5 + object-copy: 0.1.0 dev: false /statuses/2.0.1: @@ -1907,6 +2839,14 @@ packages: readable-stream: 2.3.8 dev: false + /string-width/2.1.1: + resolution: {integrity: sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==} + engines: {node: '>=4'} + dependencies: + is-fullwidth-code-point: 2.0.0 + strip-ansi: 4.0.0 + dev: false + /string-width/4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} @@ -1932,6 +2872,13 @@ packages: safe-buffer: 5.2.1 dev: false + /strip-ansi/4.0.0: + resolution: {integrity: sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==} + engines: {node: '>=4'} + dependencies: + ansi-regex: 3.0.1 + dev: false + /strip-ansi/6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} @@ -1944,6 +2891,11 @@ packages: engines: {node: '>=4'} dev: true + /strip-eof/1.0.0: + resolution: {integrity: sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==} + engines: {node: '>=0.10.0'} + dev: false + /strip-json-comments/2.0.1: resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} engines: {node: '>=0.10.0'} @@ -1988,11 +2940,38 @@ packages: readable-stream: 3.6.2 dev: false + /term-size/1.2.0: + resolution: {integrity: sha512-7dPUZQGy/+m3/wjVz3ZW5dobSoD/02NxJpoXUX0WIyjfVS3l0c+b/+9phIDFA7FHzkYtwtMFgeGZ/Y8jVTeqQQ==} + engines: {node: '>=4'} + dependencies: + execa: 0.7.0 + dev: false + + /timed-out/4.0.1: + resolution: {integrity: sha512-G7r3AhovYtr5YKOWQkta8RKAPb+J9IsO4uVmzjl8AZwfhs8UcUwTiD6gcJYSgOtzyjvQKrKYn41syHbUWMkafA==} + engines: {node: '>=0.10.0'} + dev: false + /to-fast-properties/2.0.0: resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} engines: {node: '>=4'} dev: false + /to-object-path/0.3.0: + resolution: {integrity: sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==} + engines: {node: '>=0.10.0'} + dependencies: + kind-of: 3.2.2 + dev: false + + /to-regex-range/2.1.1: + resolution: {integrity: sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==} + engines: {node: '>=0.10.0'} + dependencies: + is-number: 3.0.0 + repeat-string: 1.6.1 + dev: false + /to-regex-range/5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} @@ -2000,6 +2979,16 @@ packages: is-number: 7.0.0 dev: false + /to-regex/3.0.2: + resolution: {integrity: sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==} + engines: {node: '>=0.10.0'} + dependencies: + define-property: 2.0.2 + extend-shallow: 3.0.2 + regex-not: 1.0.2 + safe-regex: 1.1.0 + dev: false + /toidentifier/1.0.1: resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} engines: {node: '>=0.6'} @@ -2101,6 +3090,23 @@ packages: resolution: {integrity: sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==} dev: false + /union-value/1.0.1: + resolution: {integrity: sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==} + engines: {node: '>=0.10.0'} + dependencies: + arr-union: 3.1.0 + get-value: 2.0.6 + is-extendable: 0.1.1 + set-value: 2.0.1 + dev: false + + /unique-string/1.0.0: + resolution: {integrity: sha512-ODgiYu03y5g76A1I9Gt0/chLCzQjvzDy7DsZGsLOE/1MrF6wriEskSncj1+/C58Xk/kPZDppSctDybCwOSaGAg==} + engines: {node: '>=4'} + dependencies: + crypto-random-string: 1.0.0 + dev: false + /universalify/2.0.0: resolution: {integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==} engines: {node: '>= 10.0.0'} @@ -2111,6 +3117,52 @@ packages: engines: {node: '>= 0.8'} dev: false + /unset-value/1.0.0: + resolution: {integrity: sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ==} + engines: {node: '>=0.10.0'} + dependencies: + has-value: 0.3.1 + isobject: 3.0.1 + dev: false + + /unzip-response/2.0.1: + resolution: {integrity: sha512-N0XH6lqDtFH84JxptQoZYmloF4nzrQqqrAymNj+/gW60AO2AZgOcf4O/nUXJcYfyQkqvMo9lSupBZmmgvuVXlw==} + engines: {node: '>=4'} + dev: false + + /upath/1.2.0: + resolution: {integrity: sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==} + engines: {node: '>=4'} + dev: false + + /update-notifier/2.5.0: + resolution: {integrity: sha512-gwMdhgJHGuj/+wHJJs9e6PcCszpxR1b236igrOkUofGhqJuG+amlIKwApH1IW1WWl7ovZxsX49lMBWLxSdm5Dw==} + engines: {node: '>=4'} + dependencies: + boxen: 1.3.0 + chalk: 2.4.2 + configstore: 3.1.5 + import-lazy: 2.1.0 + is-ci: 1.2.1 + is-installed-globally: 0.1.0 + is-npm: 1.0.0 + latest-version: 3.1.0 + semver-diff: 2.1.0 + xdg-basedir: 3.0.0 + dev: false + + /urix/0.1.0: + resolution: {integrity: sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==} + deprecated: Please see https://github.com/lydell/urix#deprecated + dev: false + + /url-parse-lax/1.0.0: + resolution: {integrity: sha512-BVA4lR5PIviy2PMseNd2jbFQ+jwSwQGdJejf5ctd1rEXt0Ypd7yanUK9+lYechVlN5VaTJGsu2U/3MDDu6KgBA==} + engines: {node: '>=0.10.0'} + dependencies: + prepend-http: 1.0.4 + dev: false + /url-parse/1.5.10: resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} dependencies: @@ -2118,6 +3170,11 @@ packages: requires-port: 1.0.0 dev: false + /use/3.1.1: + resolution: {integrity: sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==} + engines: {node: '>=0.10.0'} + dev: false + /util-deprecate/1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} dev: false @@ -2168,6 +3225,20 @@ packages: webidl-conversions: 3.0.1 dev: false + /which/1.3.1: + resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} + hasBin: true + dependencies: + isexe: 2.0.0 + dev: false + + /widest-line/2.0.1: + resolution: {integrity: sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA==} + engines: {node: '>=4'} + dependencies: + string-width: 2.1.1 + dev: false + /wrap-ansi/7.0.0: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} engines: {node: '>=10'} @@ -2181,6 +3252,19 @@ packages: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} dev: false + /write-file-atomic/2.4.3: + resolution: {integrity: sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==} + dependencies: + graceful-fs: 4.2.11 + imurmurhash: 0.1.4 + signal-exit: 3.0.7 + dev: false + + /xdg-basedir/3.0.0: + resolution: {integrity: sha512-1Dly4xqlulvPD3fZUQJLY+FUIeqN3N2MM3uqe4rCJftAvOjFa3jFGfctOgluGx4ahPbUCsZkmJILiP0Vi4T6lQ==} + engines: {node: '>=4'} + dev: false + /xml2js/0.5.0: resolution: {integrity: sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==} engines: {node: '>=4.0.0'} @@ -2199,6 +3283,10 @@ packages: engines: {node: '>=10'} dev: false + /yallist/2.1.2: + resolution: {integrity: sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==} + dev: false + /yallist/4.0.0: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} dev: false diff --git a/services/product/src/handler/Image/upload.ts b/services/product/src/handler/Image/upload.ts index 259e61b5..71a5de48 100644 --- a/services/product/src/handler/Image/upload.ts +++ b/services/product/src/handler/Image/upload.ts @@ -4,7 +4,6 @@ import { Data } from "@product/types"; import { log } from "@product/lib/log"; import { ServerErrorResponse } from "@grpc/grpc-js"; import { decode } from "base64-arraybuffer"; -import sharp from "sharp"; import { File } from "node:buffer"; export const UploadImage = async ( @@ -27,17 +26,7 @@ export const UploadImage = async ( // Resize image and compress const buffer = decode(base64FileData); - const resizedBuffer = await sharp(Buffer.from(buffer), { - animated: true, - pages: -1, - }) - .resize(128, 128, { - fit: sharp.fit.cover, - // position: sharp.strategy.entropy, - }) - .toFormat("webp") - .webp({ quality: 90 }) - .toBuffer(); + const resizedBuffer = Buffer.from(buffer); // Upload image const fileName = request.name; diff --git a/services/product/terraform/main.tf b/services/product/terraform/main.tf index 7bf7a0a1..93a542d1 100644 --- a/services/product/terraform/main.tf +++ b/services/product/terraform/main.tf @@ -1,8 +1,20 @@ terraform { required_providers { + azapi = { + source = "azure/azapi" + version = "~>1.5" + } azurerm = { source = "hashicorp/azurerm" - version = "3.48.0" + version = "~>3.0" + } + random = { + source = "hashicorp/random" + version = "~>3.0" + } + time = { + source = "hashicorp/time" + version = "0.9.1" } } } @@ -75,4 +87,53 @@ resource "azurerm_role_assignment" "rlas-goodfood-product" { scope = azurerm_storage_account.stac-goodfood-product.id role_definition_name = "Storage Blob Data Contributor" principal_id = data.azurerm_client_config.product-client-conf.object_id +} + +resource "random_pet" "ssh_key_name-goodfood-product" { + prefix = "ssh" + separator = "" +} + +resource "azapi_resource" "ssh_public_key-goodfood-product" { + type = "Microsoft.Compute/sshPublicKeys@2022-11-01" + name = random_pet.ssh_key_name-goodfood-product.id + location = "westus3" + parent_id = data.azurerm_resource_group.rg-goodfood.id +} + +resource "azapi_resource_action" "ssh_public_key_gen-goodfood-product" { + type = "Microsoft.Compute/sshPublicKeys@2022-11-01" + resource_id = azapi_resource.ssh_public_key-goodfood-product.id + action = "generateKeyPair" + method = "POST" + + response_export_values = ["publicKey"] +} + +resource "azurerm_kubernetes_cluster" "aks-goodfood-product" { + name = "aks-goodfood-product-${var.environnment_suffix}" + location = data.azurerm_resource_group.rg-goodfood.location + resource_group_name = data.azurerm_resource_group.rg-goodfood.name + dns_prefix = "goodfood-product" + + identity { + type = "SystemAssigned" + } + + default_node_pool { + name = "agentpool" + vm_size = "Standard_D2_v2" + node_count = 1 + } + linux_profile { + admin_username = "ubuntu" + + ssh_key { + key_data = jsondecode(azapi_resource_action.ssh_public_key_gen-goodfood-product.output).publicKey + } + } + network_profile { + network_plugin = "kubenet" + load_balancer_sku = "standard" + } } \ No newline at end of file diff --git a/services/product/terraform/outputs.tf b/services/product/terraform/outputs.tf index 67771549..1adaea7a 100644 --- a/services/product/terraform/outputs.tf +++ b/services/product/terraform/outputs.tf @@ -10,11 +10,15 @@ output "AZURE_STORAGE_RESOURCE_NAME"{ value = azurerm_storage_account.stac-goodfood-product.name } - output "PORT" { value = 50004 } output "AMQP_URL"{ value = "amqp://guest:guest@localhost" +} + +output "kube_config" { + value = azurerm_kubernetes_cluster.aks-goodfood-product.kube_config_raw + sensitive = true } \ No newline at end of file From 3613030d74526a39a8232ed855382b1f75be7a0c Mon Sep 17 00:00:00 2001 From: Florian LEROUX Date: Sat, 8 Jul 2023 14:34:10 +0200 Subject: [PATCH 227/883] fix(ci): update ci to match order ci workflow --- .github/workflows/delivery.yml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/delivery.yml b/.github/workflows/delivery.yml index 1b68e1b2..111ae5b4 100644 --- a/.github/workflows/delivery.yml +++ b/.github/workflows/delivery.yml @@ -2,9 +2,9 @@ name: Delivery Microservice CI/CD on: push: - branches: [ delivery ] + branches: [delivery] pull_request: - branches: [ dev, main ] + branches: [main] jobs: build: @@ -13,7 +13,7 @@ jobs: - uses: actions/checkout@master - uses: pnpm/action-setup@v2 with: - version: 7 + version: latest - uses: actions/setup-node@v3 with: node-version: "18.x" @@ -35,7 +35,7 @@ jobs: - uses: actions/checkout@master - uses: pnpm/action-setup@v2 with: - version: 7 + version: latest - uses: actions/setup-node@v3 with: node-version: "18.x" @@ -52,7 +52,7 @@ jobs: publish: runs-on: ubuntu-latest - needs: [ build, test ] + needs: [build, test] steps: - name: Checkout code uses: actions/checkout@master @@ -67,4 +67,4 @@ jobs: context: ./services/ file: ./services/delivery/Dockerfile push: true - tags: floriaaan/goodfood-delivery:latest \ No newline at end of file + tags: floriaaan/goodfood-delivery:latest From 9e6bbd40602f36e157ab3bb77fce3c2e300c1b1f Mon Sep 17 00:00:00 2001 From: Florian LEROUX <10078837+floriaaan@users.noreply.github.com> Date: Mon, 27 Mar 2023 11:42:00 +0200 Subject: [PATCH 228/883] feat: init delivery microservice (typescript, prisma, grpc) * add prisma (schema, singleton, seed) * add grpc implementation * add logger * add file structure with proper tsconfig * readme file model --- services/delivery/.env.example | 2 + services/delivery/.gitignore | 5 + services/delivery/.nvmrc | 1 + services/delivery/README.md | 68 +++ services/delivery/package.json | 25 + services/delivery/pnpm-lock.yaml | 427 ++++++++++++++++++ services/delivery/prisma/schema.prisma | 36 ++ services/delivery/prisma/seed.ts | 64 +++ services/delivery/src/handlers/.gitinclude | 0 services/delivery/src/lib/log.ts | 74 +++ services/delivery/src/lib/prisma.ts | 29 ++ .../src/resources/grpc-credentials.ts | 5 + .../src/resources/protoloader-options.ts | 7 + services/delivery/src/server.ts | 35 ++ services/delivery/tsconfig.json | 18 + services/proto/delivery.proto | 86 ++++ 16 files changed, 882 insertions(+) create mode 100644 services/delivery/.env.example create mode 100644 services/delivery/.gitignore create mode 100644 services/delivery/.nvmrc create mode 100644 services/delivery/README.md create mode 100644 services/delivery/package.json create mode 100644 services/delivery/pnpm-lock.yaml create mode 100644 services/delivery/prisma/schema.prisma create mode 100644 services/delivery/prisma/seed.ts create mode 100644 services/delivery/src/handlers/.gitinclude create mode 100644 services/delivery/src/lib/log.ts create mode 100644 services/delivery/src/lib/prisma.ts create mode 100644 services/delivery/src/resources/grpc-credentials.ts create mode 100644 services/delivery/src/resources/protoloader-options.ts create mode 100644 services/delivery/src/server.ts create mode 100755 services/delivery/tsconfig.json create mode 100644 services/proto/delivery.proto diff --git a/services/delivery/.env.example b/services/delivery/.env.example new file mode 100644 index 00000000..6a86f4b9 --- /dev/null +++ b/services/delivery/.env.example @@ -0,0 +1,2 @@ +DATABASE_URL=postgres://postgres:postgres@localhost:5432/postgres +PORT=50008 \ No newline at end of file diff --git a/services/delivery/.gitignore b/services/delivery/.gitignore new file mode 100644 index 00000000..378e1eaa --- /dev/null +++ b/services/delivery/.gitignore @@ -0,0 +1,5 @@ +node_modules/ +dist/ +*.env* +!*.env.example + diff --git a/services/delivery/.nvmrc b/services/delivery/.nvmrc new file mode 100644 index 00000000..9dfef472 --- /dev/null +++ b/services/delivery/.nvmrc @@ -0,0 +1 @@ +v18.12.0 diff --git a/services/delivery/README.md b/services/delivery/README.md new file mode 100644 index 00000000..1086b6c8 --- /dev/null +++ b/services/delivery/README.md @@ -0,0 +1,68 @@ +# Delivery Microservice + +| Informations | +| ------------------------------------------------------------------ | +| **Port:** 50008 | +| **Developer:** @floriaaan | +| **Status:** In progress | +| **Last update:** 2023-03-25 | +| **Language:** NodeJS | +| **Dependencies:** TypeScript, Prisma, gRPC, Postgres | +| **Models:** (see [`prisma/schema.prisma`](./prisma/schema.prisma)) | + +## gRPC Methods + +- Delivery model: + + - `CreateDelivery`: Creates a new delivery in the system. + - `GetDelivery`: Retrieves a delivery by its ID. + - `UpdateDelivery`: Updates the status of an existing delivery. + - `DeleteDelivery`: Deletes a delivery by its ID. + - `ListDeliveriesByUser`: Retrieves all deliveries for a given user. + - `ListDeliveriesByRestaurant`: Retrieves all deliveries for a given restaurant. + +- Delivery person model: + - `CreateDeliveryPerson`: Creates a new delivery person in the system. + - `GetDeliveryPerson`: Retrieves a delivery person by its ID. + - `UpdateDeliveryPerson`: Updates an existing delivery person. + - `DeleteDeliveryPerson`: Deletes a delivery person by its ID. + - `ListDeliveryPersons`: Retrieves all delivery persons. + - `ListNearDeliveryPersons`: Retrieves all delivery persons near a given location. + +## Requirements + +To run this microservice, you will need to have the following installed on your system: + +- NodeJS (v18.12.0 or higher) (dev. with v18.12.0) +- Postgres (v15.2 or higher) (dev. with docker image `postgres:15.2`) + +You can use the following tools to help you with the setup: + +- You can use nvm to set your Node version using: + - `nvm use`. +- You can use docker to run your Postgres database using: + - `docker run --name postgres -e POSTGRES_PASSWORD=password -d postgres`. + +## Getting started + +### 1. Clone the repository and install dependencies + +1. Clone the `goodfood` repository to your local machine. +2. Navigate to the service directory (`services/delivery`) in your terminal. +3. Run `npm install` to install the necessary dependencies. +4. Create a `.env` file at the root of the project directory and add the environment variables values (see `.env.example`). +5. Run `npm run start` to start the microservice. + +You can now access the microservice at `http://localhost:50008`. + +NB: If you want to run the microservice in development mode, you can run `npm run dev` instead. + +### 2. Create and seed the database + +Run the following command to create your Postgres database structure. This also creates the models tables that are defined in [`prisma/schema.prisma`](./prisma/schema.prisma): + +``` +npx prisma migrate dev --name init +``` + +When `npx prisma migrate dev` is executed against a newly created database, seeding is also triggered. The seed file in [`prisma/seed.ts`](./prisma/seed.ts) will be executed and your database will be populated with the sample data. diff --git a/services/delivery/package.json b/services/delivery/package.json new file mode 100644 index 00000000..09782b02 --- /dev/null +++ b/services/delivery/package.json @@ -0,0 +1,25 @@ +{ + "name": "typescript-grpc", + "scripts": { + "dev": "ts-node ./src/server.ts", + "seed": "ts-node prisma/seed.ts", + "client:delivery-create": "ts-node ./src/client/delivery-create.ts" + }, + "dependencies": { + "@grpc/grpc-js": "^1.8.13", + "@grpc/proto-loader": "0.7.6", + "@prisma/client": "4.11.0", + "dotenv": "^16.0.3", + "protobufjs": "7.2.2" + }, + "devDependencies": { + "@types/node": "18.15.9", + "prisma": "4.11.0", + "ts-node": "10.9.1", + "tsconfig-paths": "^4.1.2", + "typescript": "5.0.2" + }, + "prisma": { + "seed": "ts-node prisma/seed.ts" + } +} diff --git a/services/delivery/pnpm-lock.yaml b/services/delivery/pnpm-lock.yaml new file mode 100644 index 00000000..50a04449 --- /dev/null +++ b/services/delivery/pnpm-lock.yaml @@ -0,0 +1,427 @@ +lockfileVersion: 5.4 + +specifiers: + '@grpc/grpc-js': ^1.8.13 + '@grpc/proto-loader': 0.7.6 + '@prisma/client': 4.11.0 + '@types/node': 18.15.9 + chalk: 4.1.2 + dotenv: ^16.0.3 + prisma: 4.11.0 + protobufjs: 7.2.2 + ts-node: 10.9.1 + tsconfig-paths: ^4.1.2 + typescript: 5.0.2 + +dependencies: + '@grpc/grpc-js': 1.8.13 + '@grpc/proto-loader': 0.7.6 + '@prisma/client': 4.11.0_prisma@4.11.0 + chalk: 4.1.2 + dotenv: 16.0.3 + protobufjs: 7.2.2 + +devDependencies: + '@types/node': 18.15.9 + prisma: 4.11.0 + ts-node: 10.9.1_3flabivgbrnlfzsgzfhinuvrvy + tsconfig-paths: 4.1.2 + typescript: 5.0.2 + +packages: + + /@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 + + /@grpc/grpc-js/1.8.13: + resolution: {integrity: sha512-iY3jsdfbc0ARoCLFvbvUB8optgyb0r1XLPb142u+QtgBcKJYkCIFt3Fd/881KqjLYWjsBJF57N3b8Eop9NDfUA==} + engines: {node: ^8.13.0 || >=10.10.0} + dependencies: + '@grpc/proto-loader': 0.7.6 + '@types/node': 18.15.9 + dev: false + + /@grpc/proto-loader/0.7.6: + resolution: {integrity: sha512-QyAXR8Hyh7uMDmveWxDSUcJr9NAWaZ2I6IXgAYvQmfflwouTM+rArE2eEaCtLlRqO81j7pRLCt81IefUei6Zbw==} + engines: {node: '>=6'} + hasBin: true + dependencies: + '@types/long': 4.0.2 + lodash.camelcase: 4.3.0 + long: 4.0.0 + protobufjs: 7.2.2 + yargs: 16.2.0 + dev: false + + /@jridgewell/resolve-uri/3.1.0: + resolution: {integrity: sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==} + engines: {node: '>=6.0.0'} + dev: true + + /@jridgewell/sourcemap-codec/1.4.14: + resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==} + dev: true + + /@jridgewell/trace-mapping/0.3.9: + resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} + dependencies: + '@jridgewell/resolve-uri': 3.1.0 + '@jridgewell/sourcemap-codec': 1.4.14 + dev: true + + /@prisma/client/4.11.0_prisma@4.11.0: + resolution: {integrity: sha512-0INHYkQIqgAjrt7NzhYpeDQi8x3Nvylc2uDngKyFDDj1tTRQ4uV1HnVmd1sQEraeVAN63SOK0dgCKQHlvjL0KA==} + engines: {node: '>=14.17'} + requiresBuild: true + peerDependencies: + prisma: '*' + peerDependenciesMeta: + prisma: + optional: true + dependencies: + '@prisma/engines-version': 4.11.0-57.8fde8fef4033376662cad983758335009d522acb + prisma: 4.11.0 + dev: false + + /@prisma/engines-version/4.11.0-57.8fde8fef4033376662cad983758335009d522acb: + resolution: {integrity: sha512-3Vd8Qq06d5xD8Ch5WauWcUUrsVPdMC6Ge8ILji8RFfyhUpqon6qSyGM0apvr1O8n8qH8cKkEFqRPsYjuz5r83g==} + dev: false + + /@prisma/engines/4.11.0: + resolution: {integrity: sha512-0AEBi2HXGV02cf6ASsBPhfsVIbVSDC9nbQed4iiY5eHttW9ZtMxHThuKZE1pnESbr8HRdgmFSa/Kn4OSNYuibg==} + requiresBuild: true + + /@protobufjs/aspromise/1.1.2: + resolution: {integrity: sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==} + dev: false + + /@protobufjs/base64/1.1.2: + resolution: {integrity: sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==} + dev: false + + /@protobufjs/codegen/2.0.4: + resolution: {integrity: sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==} + dev: false + + /@protobufjs/eventemitter/1.1.0: + resolution: {integrity: sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==} + dev: false + + /@protobufjs/fetch/1.1.0: + resolution: {integrity: sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==} + dependencies: + '@protobufjs/aspromise': 1.1.2 + '@protobufjs/inquire': 1.1.0 + dev: false + + /@protobufjs/float/1.0.2: + resolution: {integrity: sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==} + dev: false + + /@protobufjs/inquire/1.1.0: + resolution: {integrity: sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==} + dev: false + + /@protobufjs/path/1.1.2: + resolution: {integrity: sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==} + dev: false + + /@protobufjs/pool/1.1.0: + resolution: {integrity: sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==} + dev: false + + /@protobufjs/utf8/1.1.0: + resolution: {integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==} + 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.3: + resolution: {integrity: sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==} + dev: true + + /@types/long/4.0.2: + resolution: {integrity: sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==} + dev: false + + /@types/node/18.15.9: + resolution: {integrity: sha512-dUxhiNzBLr6IqlZXz6e/rN2YQXlFgOei/Dxy+e3cyXTJ4txSUbGT2/fmnD6zd/75jDMeW5bDee+YXxlFKHoV0A==} + + /acorn-walk/8.2.0: + resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} + engines: {node: '>=0.4.0'} + dev: true + + /acorn/8.8.2: + resolution: {integrity: sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==} + engines: {node: '>=0.4.0'} + hasBin: true + dev: true + + /ansi-regex/5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + dev: false + + /ansi-styles/4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + dependencies: + color-convert: 2.0.1 + dev: false + + /arg/4.1.3: + resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} + dev: true + + /chalk/4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + 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 + + /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 + + /create-require/1.1.1: + resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} + dev: true + + /diff/4.0.2: + resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} + engines: {node: '>=0.3.1'} + dev: true + + /dotenv/16.0.3: + resolution: {integrity: sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==} + engines: {node: '>=12'} + dev: false + + /emoji-regex/8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + dev: false + + /escalade/3.1.1: + resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} + engines: {node: '>=6'} + dev: false + + /get-caller-file/2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + dev: false + + /has-flag/4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + dev: false + + /is-fullwidth-code-point/3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + dev: false + + /json5/2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + dev: true + + /lodash.camelcase/4.3.0: + resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} + dev: false + + /long/4.0.0: + resolution: {integrity: sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==} + dev: false + + /long/5.2.1: + resolution: {integrity: sha512-GKSNGeNAtw8IryjjkhZxuKB3JzlcLTwjtiQCHKvqQet81I93kXslhDQruGI/QsddO83mcDToBVy7GqGS/zYf/A==} + dev: false + + /make-error/1.3.6: + resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + dev: true + + /minimist/1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + dev: true + + /prisma/4.11.0: + resolution: {integrity: sha512-4zZmBXssPUEiX+GeL0MUq/Yyie4ltiKmGu7jCJFnYMamNrrulTBc+D+QwAQSJ01tyzeGHlD13kOnqPwRipnlNw==} + engines: {node: '>=14.17'} + hasBin: true + requiresBuild: true + dependencies: + '@prisma/engines': 4.11.0 + + /protobufjs/7.2.2: + resolution: {integrity: sha512-++PrQIjrom+bFDPpfmqXfAGSQs40116JRrqqyf53dymUMvvb5d/LMRyicRoF1AUKoXVS1/IgJXlEgcpr4gTF3Q==} + engines: {node: '>=12.0.0'} + requiresBuild: true + dependencies: + '@protobufjs/aspromise': 1.1.2 + '@protobufjs/base64': 1.1.2 + '@protobufjs/codegen': 2.0.4 + '@protobufjs/eventemitter': 1.1.0 + '@protobufjs/fetch': 1.1.0 + '@protobufjs/float': 1.0.2 + '@protobufjs/inquire': 1.1.0 + '@protobufjs/path': 1.1.2 + '@protobufjs/pool': 1.1.0 + '@protobufjs/utf8': 1.1.0 + '@types/node': 18.15.9 + long: 5.2.1 + dev: false + + /require-directory/2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + dev: false + + /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 + dev: false + + /strip-ansi/6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + dependencies: + ansi-regex: 5.0.1 + dev: false + + /strip-bom/3.0.0: + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} + dev: true + + /supports-color/7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + dependencies: + has-flag: 4.0.0 + dev: false + + /ts-node/10.9.1_3flabivgbrnlfzsgzfhinuvrvy: + 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.3 + '@types/node': 18.15.9 + acorn: 8.8.2 + 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.0.2 + v8-compile-cache-lib: 3.0.1 + yn: 3.1.1 + dev: true + + /tsconfig-paths/4.1.2: + resolution: {integrity: sha512-uhxiMgnXQp1IR622dUXI+9Ehnws7i/y6xvpZB9IbUVOPy0muvdvgXeZOn88UcGPiT98Vp3rJPTa8bFoalZ3Qhw==} + engines: {node: '>=6'} + dependencies: + json5: 2.2.3 + minimist: 1.2.8 + strip-bom: 3.0.0 + dev: true + + /typescript/5.0.2: + resolution: {integrity: sha512-wVORMBGO/FAs/++blGNeAVdbNKtIh1rbBL2EyQ1+J9lClJ93KiiKe8PmFIVdXhHcyv44SL9oglmfeSsndo0jRw==} + engines: {node: '>=12.20'} + hasBin: true + dev: true + + /v8-compile-cache-lib/3.0.1: + resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} + 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 + dev: false + + /y18n/5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + dev: false + + /yargs-parser/20.2.9: + resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} + engines: {node: '>=10'} + dev: false + + /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 + + /yn/3.1.1: + resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} + engines: {node: '>=6'} + dev: true diff --git a/services/delivery/prisma/schema.prisma b/services/delivery/prisma/schema.prisma new file mode 100644 index 00000000..a9384d5b --- /dev/null +++ b/services/delivery/prisma/schema.prisma @@ -0,0 +1,36 @@ +datasource db { + provider = "postgresql" + url = env("DATABASE_URL") +} + +generator client { + provider = "prisma-client-js" +} + +enum Status { + PENDING + IN_PROGRESS + FULFILLED + REJECTED +} + +model Delivery { + id String @id @default(cuid()) + estimated_date DateTime + + address String + status Status @default(PENDING) + + person DeliveryPerson @relation(fields: [delivery_person_id], references: [id]) + delivery_person_id String +} + +model DeliveryPerson { + id String @id @default(cuid()) + first_name String + last_name String + phone String @unique + location Float[] + + deliveries Delivery[] +} diff --git a/services/delivery/prisma/seed.ts b/services/delivery/prisma/seed.ts new file mode 100644 index 00000000..40472cf0 --- /dev/null +++ b/services/delivery/prisma/seed.ts @@ -0,0 +1,64 @@ +import { PrismaClient, Prisma } from "@prisma/client"; + +const prisma = new PrismaClient(); + +const deliveryPerson: Prisma.DeliveryPersonCreateInput[] = [ + { + id: "random_id", + first_name: "John", + last_name: "Doe", + phone: "0612345678", + location: [4.123, 52.123], + }, + { + first_name: "Jane", + last_name: "Doe", + phone: "0612345679", + location: [4.123, 52.124], + }, + { + first_name: "Jack", + last_name: "Doe", + phone: "0612345677", + location: [4.124, 52.123], + }, +]; + +const deliveries: Prisma.DeliveryCreateInput[] = [ + { + address: "15 rue de la paix 75000 Paris", + estimated_date: new Date("2023-01-01"), + person: { create: deliveryPerson[0] }, + }, + { + address: "16 rue de la paix 75000 Paris", + estimated_date: new Date("2023-02-01"), + person: { create: deliveryPerson[1] }, + }, + { + address: "17 rue de la paix 75000 Paris", + estimated_date: new Date("2023-03-01"), + person: { create: deliveryPerson[2] }, + }, +]; + +async function main() { + console.log(`Start seeding ...`); + for (const d of deliveries) { + const delivery = await prisma.delivery.create({ + data: d, + }); + console.log(`Created delivery with id: ${delivery.id}`); + } + console.log(`Seeding finished.`); +} + +main() + .then(async () => { + await prisma.$disconnect(); + }) + .catch(async (e) => { + console.error(e); + await prisma.$disconnect(); + process.exit(1); + }); diff --git a/services/delivery/src/handlers/.gitinclude b/services/delivery/src/handlers/.gitinclude new file mode 100644 index 00000000..e69de29b diff --git a/services/delivery/src/lib/log.ts b/services/delivery/src/lib/log.ts new file mode 100644 index 00000000..2404af54 --- /dev/null +++ b/services/delivery/src/lib/log.ts @@ -0,0 +1,74 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ +/* eslint-disable no-console */ + +function getStackTrace() { + let stack; + + try { + throw new Error(""); + } catch (error) { + stack = (error as Error).stack || ""; + } + + stack = stack.split("\n").map((line) => line.trim()); + return stack.splice(stack[0] === "Error" ? 2 : 1); +} + +const getInitiator = () => { + // _getInitiatorLine, _ObjectInfoLine, caller + const [, , caller] = getStackTrace(); + const file = caller.split("/").at(-1) || ""; + return file.replace(")", ""); +}; + +const warn = (...args: any[]) => { + console.group( + `\x1b[33m${new Date().toISOString()} - WARN - ${getInitiator()}\x1b[0m` + ); + console.warn(...args); + console.groupEnd(); +}; +const error = (...args: any[]) => { + console.group( + `\x1b[31m${new Date().toISOString()} - ERROR - ${getInitiator()}\x1b[0m` + ); + console.error(...args); + console.groupEnd(); +}; +const info = (...args: any[]) => { + console.group( + `\x1b[34m${new Date().toISOString()} - INFO - ${getInitiator()}\x1b[0m` + ); + console.log(...args); + console.groupEnd(); +}; +const debug = (...args: any[]) => { + console.log(...args); +}; + +/** + * @description a simple interface logger for logging to the console and into a log drain in the future + * @example + * log.warn('this is a warning'); + * log.error('this is an error'); + * log.info('this is an info'); + * @exports log + */ +export const log = { + warn, + error, + info, + debug, +}; + +export const utils = { + bold: (text: string) => `\x1b[1m${text}\x1b[0m`, + red: (text: string) => `\x1b[31m${text}\x1b[0m`, + green: (text: string) => `\x1b[32m${text}\x1b[0m`, + yellow: (text: string) => `\x1b[33m${text}\x1b[0m`, + blue: (text: string) => `\x1b[34m${text}\x1b[0m`, + magenta: (text: string) => `\x1b[35m${text}\x1b[0m`, + cyan: (text: string) => `\x1b[36m${text}\x1b[0m`, + white: (text: string) => `\x1b[37m${text}\x1b[0m`, + gray: (text: string) => `\x1b[90m${text}\x1b[0m`, +}; diff --git a/services/delivery/src/lib/prisma.ts b/services/delivery/src/lib/prisma.ts new file mode 100644 index 00000000..4d495ef0 --- /dev/null +++ b/services/delivery/src/lib/prisma.ts @@ -0,0 +1,29 @@ +import { Prisma, PrismaClient } from "@prisma/client"; + +let prisma: PrismaClient; +type GlobalWithPrisma = typeof globalThis & { + prisma: PrismaClient; +}; + +const OPTIONS: Prisma.PrismaClientOptions = { + log: + process.env.NEXT_PUBLIC_APP_ENV !== "production" + ? ["info", "warn"] + : undefined, +}; + +if (process.env.NODE_ENV === "production") { + prisma = new PrismaClient(OPTIONS); +} else { + // Ensure the prisma instance is re-used during hot-reloading + // Otherwise, a new client will be created on every reload + if (!("prisma" in global)) { + (global as GlobalWithPrisma).prisma = new PrismaClient(OPTIONS); + } + + prisma = (global as GlobalWithPrisma).prisma; +} + +export default prisma; + +export { prisma }; diff --git a/services/delivery/src/resources/grpc-credentials.ts b/services/delivery/src/resources/grpc-credentials.ts new file mode 100644 index 00000000..75a2b5d5 --- /dev/null +++ b/services/delivery/src/resources/grpc-credentials.ts @@ -0,0 +1,5 @@ +import { credentials, ServerCredentials } from "@grpc/grpc-js"; + +export const insecure = credentials.createInsecure(); + +export const serverInsecure = ServerCredentials.createInsecure(); diff --git a/services/delivery/src/resources/protoloader-options.ts b/services/delivery/src/resources/protoloader-options.ts new file mode 100644 index 00000000..5022d96d --- /dev/null +++ b/services/delivery/src/resources/protoloader-options.ts @@ -0,0 +1,7 @@ +export const options = { + keepCase: true, + longs: String, + enums: String, + defaults: true, + oneofs: true, +}; diff --git a/services/delivery/src/server.ts b/services/delivery/src/server.ts new file mode 100644 index 00000000..2032a131 --- /dev/null +++ b/services/delivery/src/server.ts @@ -0,0 +1,35 @@ +import "dotenv/config"; + +import { loadSync } from "@grpc/proto-loader"; +import { loadPackageDefinition, Server } from "@grpc/grpc-js"; + +import { log, utils } from "@delivery/lib/log"; +import { options } from "@delivery/resources/protoloader-options"; +import { serverInsecure } from "@delivery/resources/grpc-credentials"; + +const PORT = process.env.PORT || 50008; +const ADDRESS = `0.0.0.0:${PORT}`; +const PROTO_PATH = __dirname + "/../../proto/delivery.proto"; + +const packageDefinition = loadSync(PROTO_PATH, options); +const { delivery } = loadPackageDefinition(packageDefinition) as any; // todo: fix any +const server = new Server(); + +server.addService(delivery.DeliveryService.service, { + // handlers + // todo: add handlers +}); + +server.addService(delivery.DeliveryPersonService.service, { + // handlers + // todo: add handlers +}); + +server.bindAsync(ADDRESS, serverInsecure, () => { + const message = `---- ${utils.green("good")}${utils.yellow( + "food" + )} Delivery Service ----\nstarted on: ${utils.bold(ADDRESS)} ${utils.green( + "✓" + )}\n`; + log.debug(message); +}); diff --git a/services/delivery/tsconfig.json b/services/delivery/tsconfig.json new file mode 100755 index 00000000..f32ad6b3 --- /dev/null +++ b/services/delivery/tsconfig.json @@ -0,0 +1,18 @@ +{ + "compilerOptions": { + "sourceMap": true, + "outDir": "dist", + "strict": true, + "lib": ["esnext"], + "esModuleInterop": true, + "baseUrl": ".", + "paths": { + "@delivery/*": ["src/*"] + } + }, + "include": ["src/**/*.ts"], + "exclude": ["node_modules"], + "ts-node": { + "require": ["tsconfig-paths/register"] + } +} diff --git a/services/proto/delivery.proto b/services/proto/delivery.proto new file mode 100644 index 00000000..39e65277 --- /dev/null +++ b/services/proto/delivery.proto @@ -0,0 +1,86 @@ +syntax = "proto3"; +import "google/protobuf/timestamp.proto"; +import "google/protobuf/empty.proto"; + +package delivery; + +message Delivery { + string id = 1; + google.protobuf.Timestamp estimated_date = 2; + + string address = 3; + Status status = 4; + + DeliveryPerson person = 5; + string delivery_person_id = 6; +} + +message DeliveryPerson { + string id = 1; + string first_name = 2; + string last_name = 3; + string phone = 4; + repeated float location = 5; + + repeated Delivery deliveries = 6; +} + +enum Status { + PENDING = 0; + IN_PROGRESS = 1; + FULFILLED = 2; + REJECTED = 3; +} + +service DeliveryService { + rpc CreateDelivery (Delivery) returns (Delivery) {} + rpc GetDelivery (DeliveryId) returns (Delivery) {} + rpc UpdateDelivery (Delivery) returns (Delivery) {} + rpc DeleteDelivery (DeliveryId) returns (google.protobuf.Empty) {} + rpc ListDeliveriesByUser (UserId) returns (stream Delivery) {} + rpc ListDeliveriesByRestaurant (RestaurantId) returns (stream Delivery) {} + +} + +service DeliveryPersonService { + rpc CreateDeliveryPerson (DeliveryPerson) returns (DeliveryPerson) {} + rpc GetDeliveryPerson (DeliveryPersonId) returns (DeliveryPerson) {} + rpc UpdateDeliveryPerson (DeliveryPerson) returns (DeliveryPerson) {} + rpc DeleteDeliveryPerson (DeliveryPersonId) returns (google.protobuf.Empty) {} + rpc ListDeliveryPersons (google.protobuf.Empty) returns (stream DeliveryPerson) {} + rpc ListNearDeliveryPersons (Location) returns (stream DeliveryPerson) {} +} + + +message DeliveryId { + string id = 1; +} +message DeliveryCreateInput { + google.protobuf.Timestamp estimated_date = 1; + string address = 2; + Status status = 3; + string delivery_person_id = 4; +} + +message UserId { + string id = 1; +} + +message RestaurantId { + string id = 1; +} + +message DeliveryPersonId { + string id = 1; +} +message DeliveryPersonCreateInput { + string first_name = 1; + string last_name = 2; + string phone = 3; + repeated float location = 4; +} + +message Location { + float latitude = 1; + float longitude = 2; +} From 2a2ddfbc68c810310d3164ba10e42106eee9c7a4 Mon Sep 17 00:00:00 2001 From: Florian LEROUX <10078837+floriaaan@users.noreply.github.com> Date: Wed, 29 Mar 2023 09:50:50 +0200 Subject: [PATCH 229/883] fix(server): forgot to start server explicitly --- services/delivery/src/server.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/services/delivery/src/server.ts b/services/delivery/src/server.ts index 2032a131..16a27d70 100644 --- a/services/delivery/src/server.ts +++ b/services/delivery/src/server.ts @@ -7,6 +7,8 @@ import { log, utils } from "@delivery/lib/log"; import { options } from "@delivery/resources/protoloader-options"; import { serverInsecure } from "@delivery/resources/grpc-credentials"; +import { CreateDelivery } from "@delivery/handlers/delivery"; + const PORT = process.env.PORT || 50008; const ADDRESS = `0.0.0.0:${PORT}`; const PROTO_PATH = __dirname + "/../../proto/delivery.proto"; @@ -18,6 +20,7 @@ const server = new Server(); server.addService(delivery.DeliveryService.service, { // handlers // todo: add handlers + CreateDelivery, }); server.addService(delivery.DeliveryPersonService.service, { @@ -26,6 +29,7 @@ server.addService(delivery.DeliveryPersonService.service, { }); server.bindAsync(ADDRESS, serverInsecure, () => { + server.start(); const message = `---- ${utils.green("good")}${utils.yellow( "food" )} Delivery Service ----\nstarted on: ${utils.bold(ADDRESS)} ${utils.green( From 3632dca9ab860c93911ec5efa11f4131f0c06acc Mon Sep 17 00:00:00 2001 From: Florian LEROUX <10078837+floriaaan@users.noreply.github.com> Date: Wed, 29 Mar 2023 09:51:35 +0200 Subject: [PATCH 230/883] fix(readme): add port binding to docker postgres usage --- services/delivery/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/services/delivery/README.md b/services/delivery/README.md index 1086b6c8..f3baac1e 100644 --- a/services/delivery/README.md +++ b/services/delivery/README.md @@ -5,7 +5,7 @@ | **Port:** 50008 | | **Developer:** @floriaaan | | **Status:** In progress | -| **Last update:** 2023-03-25 | +| **Last update:** 2023-03-29 | | **Language:** NodeJS | | **Dependencies:** TypeScript, Prisma, gRPC, Postgres | | **Models:** (see [`prisma/schema.prisma`](./prisma/schema.prisma)) | @@ -41,7 +41,7 @@ You can use the following tools to help you with the setup: - You can use nvm to set your Node version using: - `nvm use`. - You can use docker to run your Postgres database using: - - `docker run --name postgres -e POSTGRES_PASSWORD=password -d postgres`. + - `docker run --name postgres -p 5432:5432 -e POSTGRES_PASSWORD=password -d postgres` ## Getting started From 8e6d4472fead38a6d6f74fca7b3503c79b33d879 Mon Sep 17 00:00:00 2001 From: Florian LEROUX <10078837+floriaaan@users.noreply.github.com> Date: Wed, 29 Mar 2023 09:52:07 +0200 Subject: [PATCH 231/883] feat(pkg): add nodemon watcher script --- services/delivery/.env.example | 2 +- services/delivery/package.json | 4 +- services/delivery/pnpm-lock.yaml | 230 ++++++++++++++++++++++++++++--- 3 files changed, 218 insertions(+), 18 deletions(-) diff --git a/services/delivery/.env.example b/services/delivery/.env.example index 6a86f4b9..e7b2b4e7 100644 --- a/services/delivery/.env.example +++ b/services/delivery/.env.example @@ -1,2 +1,2 @@ -DATABASE_URL=postgres://postgres:postgres@localhost:5432/postgres +DATABASE_URL=postgres://postgres:password@localhost:5432/postgres PORT=50008 \ No newline at end of file diff --git a/services/delivery/package.json b/services/delivery/package.json index 09782b02..113ef54d 100644 --- a/services/delivery/package.json +++ b/services/delivery/package.json @@ -1,7 +1,8 @@ { "name": "typescript-grpc", "scripts": { - "dev": "ts-node ./src/server.ts", + "start": "ts-node ./src/server.ts", + "dev": "nodemon --watch 'src/**/*.ts' --exec 'ts-node' src/server.ts", "seed": "ts-node prisma/seed.ts", "client:delivery-create": "ts-node ./src/client/delivery-create.ts" }, @@ -14,6 +15,7 @@ }, "devDependencies": { "@types/node": "18.15.9", + "nodemon": "^2.0.22", "prisma": "4.11.0", "ts-node": "10.9.1", "tsconfig-paths": "^4.1.2", diff --git a/services/delivery/pnpm-lock.yaml b/services/delivery/pnpm-lock.yaml index 50a04449..38da5b6e 100644 --- a/services/delivery/pnpm-lock.yaml +++ b/services/delivery/pnpm-lock.yaml @@ -5,8 +5,8 @@ specifiers: '@grpc/proto-loader': 0.7.6 '@prisma/client': 4.11.0 '@types/node': 18.15.9 - chalk: 4.1.2 dotenv: ^16.0.3 + nodemon: ^2.0.22 prisma: 4.11.0 protobufjs: 7.2.2 ts-node: 10.9.1 @@ -17,12 +17,12 @@ dependencies: '@grpc/grpc-js': 1.8.13 '@grpc/proto-loader': 0.7.6 '@prisma/client': 4.11.0_prisma@4.11.0 - chalk: 4.1.2 dotenv: 16.0.3 protobufjs: 7.2.2 devDependencies: '@types/node': 18.15.9 + nodemon: 2.0.22 prisma: 4.11.0 ts-node: 10.9.1_3flabivgbrnlfzsgzfhinuvrvy tsconfig-paths: 4.1.2 @@ -161,6 +161,10 @@ packages: /@types/node/18.15.9: resolution: {integrity: sha512-dUxhiNzBLr6IqlZXz6e/rN2YQXlFgOei/Dxy+e3cyXTJ4txSUbGT2/fmnD6zd/75jDMeW5bDee+YXxlFKHoV0A==} + /abbrev/1.1.1: + resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} + dev: true + /acorn-walk/8.2.0: resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} engines: {node: '>=0.4.0'} @@ -184,17 +188,55 @@ packages: color-convert: 2.0.1 dev: false + /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 + /arg/4.1.3: resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} dev: true - /chalk/4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} + /balanced-match/1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + dev: true + + /binary-extensions/2.2.0: + resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} + engines: {node: '>=8'} + dev: true + + /brace-expansion/1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - dev: false + balanced-match: 1.0.2 + concat-map: 0.0.1 + dev: true + + /braces/3.0.2: + resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + engines: {node: '>=8'} + dependencies: + fill-range: 7.0.1 + dev: true + + /chokidar/3.5.3: + resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} + engines: {node: '>= 8.10.0'} + dependencies: + anymatch: 3.1.3 + braces: 3.0.2 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.2 + dev: true /cliui/7.0.4: resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} @@ -215,10 +257,26 @@ packages: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} dev: false + /concat-map/0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + dev: true + /create-require/1.1.1: resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} dev: true + /debug/3.2.7_supports-color@5.5.0: + resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.3 + supports-color: 5.5.0 + dev: true + /diff/4.0.2: resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} engines: {node: '>=0.3.1'} @@ -238,21 +296,71 @@ packages: engines: {node: '>=6'} 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: true + + /fsevents/2.3.2: + resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + requiresBuild: true + dev: true + optional: true + /get-caller-file/2.0.5: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} dev: false - /has-flag/4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + /glob-parent/5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + dependencies: + is-glob: 4.0.3 + dev: true + + /has-flag/3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + dev: true + + /ignore-by-default/1.0.1: + resolution: {integrity: sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==} + dev: true + + /is-binary-path/2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} engines: {node: '>=8'} - dev: false + dependencies: + binary-extensions: 2.2.0 + dev: true + + /is-extglob/2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + dev: true /is-fullwidth-code-point/3.0.0: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} engines: {node: '>=8'} dev: false + /is-glob/4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + dependencies: + is-extglob: 2.1.1 + dev: true + + /is-number/7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + dev: true + /json5/2.2.3: resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} engines: {node: '>=6'} @@ -275,10 +383,54 @@ packages: resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} dev: true + /minimatch/3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + dependencies: + brace-expansion: 1.1.11 + dev: true + /minimist/1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} dev: true + /ms/2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + dev: true + + /nodemon/2.0.22: + resolution: {integrity: sha512-B8YqaKMmyuCO7BowF1Z1/mkPqLk6cs/l63Ojtd6otKjMx47Dq1utxfRxcavH1I7VSaL8n5BUaoutadnsX3AAVQ==} + engines: {node: '>=8.10.0'} + hasBin: true + dependencies: + chokidar: 3.5.3 + debug: 3.2.7_supports-color@5.5.0 + ignore-by-default: 1.0.1 + minimatch: 3.1.2 + pstree.remy: 1.1.8 + semver: 5.7.1 + simple-update-notifier: 1.1.0 + supports-color: 5.5.0 + touch: 3.1.0 + undefsafe: 2.0.5 + dev: true + + /nopt/1.0.10: + resolution: {integrity: sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==} + hasBin: true + dependencies: + abbrev: 1.1.1 + dev: true + + /normalize-path/3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + dev: true + + /picomatch/2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + dev: true + /prisma/4.11.0: resolution: {integrity: sha512-4zZmBXssPUEiX+GeL0MUq/Yyie4ltiKmGu7jCJFnYMamNrrulTBc+D+QwAQSJ01tyzeGHlD13kOnqPwRipnlNw==} engines: {node: '>=14.17'} @@ -306,11 +458,39 @@ packages: long: 5.2.1 dev: false + /pstree.remy/1.1.8: + resolution: {integrity: sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==} + dev: true + + /readdirp/3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + dependencies: + picomatch: 2.3.1 + dev: true + /require-directory/2.1.1: resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} engines: {node: '>=0.10.0'} dev: false + /semver/5.7.1: + resolution: {integrity: sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==} + hasBin: true + dev: true + + /semver/7.0.0: + resolution: {integrity: sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==} + hasBin: true + dev: true + + /simple-update-notifier/1.1.0: + resolution: {integrity: sha512-VpsrsJSUcJEseSbMHkrsrAVSdvVS5I96Qo1QAQ4FxQ9wXFcB+pjj7FB7/us9+GcgfW4ziHtYMc1J0PLczb55mg==} + engines: {node: '>=8.10.0'} + dependencies: + semver: 7.0.0 + dev: true + /string-width/4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} @@ -332,12 +512,26 @@ packages: engines: {node: '>=4'} dev: true - /supports-color/7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} + /supports-color/5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} dependencies: - has-flag: 4.0.0 - dev: false + has-flag: 3.0.0 + 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 + dev: true + + /touch/3.1.0: + resolution: {integrity: sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==} + hasBin: true + dependencies: + nopt: 1.0.10 + dev: true /ts-node/10.9.1_3flabivgbrnlfzsgzfhinuvrvy: resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} @@ -385,6 +579,10 @@ packages: hasBin: true dev: true + /undefsafe/2.0.5: + resolution: {integrity: sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==} + dev: true + /v8-compile-cache-lib/3.0.1: resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} dev: true From b3727e5b2b539e50bae4242197fb70d2828feb9c Mon Sep 17 00:00:00 2001 From: Florian LEROUX <10078837+floriaaan@users.noreply.github.com> Date: Wed, 29 Mar 2023 09:52:32 +0200 Subject: [PATCH 232/883] ref: change estimated_date to eta --- .../migration.sql | 30 +++++++++++++++++++ .../prisma/migrations/migration_lock.toml | 3 ++ services/delivery/prisma/schema.prisma | 2 +- services/delivery/prisma/seed.ts | 6 ++-- services/delivery/types/delivery.d.ts | 11 +++++++ services/proto/delivery.proto | 9 +++--- 6 files changed, 52 insertions(+), 9 deletions(-) create mode 100644 services/delivery/prisma/migrations/20230328152031_init_database/migration.sql create mode 100644 services/delivery/prisma/migrations/migration_lock.toml create mode 100644 services/delivery/types/delivery.d.ts diff --git a/services/delivery/prisma/migrations/20230328152031_init_database/migration.sql b/services/delivery/prisma/migrations/20230328152031_init_database/migration.sql new file mode 100644 index 00000000..206c27b2 --- /dev/null +++ b/services/delivery/prisma/migrations/20230328152031_init_database/migration.sql @@ -0,0 +1,30 @@ +-- CreateEnum +CREATE TYPE "Status" AS ENUM ('PENDING', 'IN_PROGRESS', 'FULFILLED', 'REJECTED'); + +-- CreateTable +CREATE TABLE "Delivery" ( + "id" TEXT NOT NULL, + "eta" TIMESTAMP(3) NOT NULL, + "address" TEXT NOT NULL, + "status" "Status" NOT NULL DEFAULT 'PENDING', + "delivery_person_id" TEXT NOT NULL, + + CONSTRAINT "Delivery_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "DeliveryPerson" ( + "id" TEXT NOT NULL, + "first_name" TEXT NOT NULL, + "last_name" TEXT NOT NULL, + "phone" TEXT NOT NULL, + "location" DOUBLE PRECISION[], + + CONSTRAINT "DeliveryPerson_pkey" PRIMARY KEY ("id") +); + +-- CreateIndex +CREATE UNIQUE INDEX "DeliveryPerson_phone_key" ON "DeliveryPerson"("phone"); + +-- AddForeignKey +ALTER TABLE "Delivery" ADD CONSTRAINT "Delivery_delivery_person_id_fkey" FOREIGN KEY ("delivery_person_id") REFERENCES "DeliveryPerson"("id") ON DELETE RESTRICT ON UPDATE CASCADE; diff --git a/services/delivery/prisma/migrations/migration_lock.toml b/services/delivery/prisma/migrations/migration_lock.toml new file mode 100644 index 00000000..fbffa92c --- /dev/null +++ b/services/delivery/prisma/migrations/migration_lock.toml @@ -0,0 +1,3 @@ +# Please do not edit this file manually +# It should be added in your version-control system (i.e. Git) +provider = "postgresql" \ No newline at end of file diff --git a/services/delivery/prisma/schema.prisma b/services/delivery/prisma/schema.prisma index a9384d5b..2c999c8d 100644 --- a/services/delivery/prisma/schema.prisma +++ b/services/delivery/prisma/schema.prisma @@ -16,7 +16,7 @@ enum Status { model Delivery { id String @id @default(cuid()) - estimated_date DateTime + eta DateTime address String status Status @default(PENDING) diff --git a/services/delivery/prisma/seed.ts b/services/delivery/prisma/seed.ts index 40472cf0..cf92b561 100644 --- a/services/delivery/prisma/seed.ts +++ b/services/delivery/prisma/seed.ts @@ -27,17 +27,17 @@ const deliveryPerson: Prisma.DeliveryPersonCreateInput[] = [ const deliveries: Prisma.DeliveryCreateInput[] = [ { address: "15 rue de la paix 75000 Paris", - estimated_date: new Date("2023-01-01"), + eta: new Date("2023-01-01"), person: { create: deliveryPerson[0] }, }, { address: "16 rue de la paix 75000 Paris", - estimated_date: new Date("2023-02-01"), + eta: new Date("2023-02-01"), person: { create: deliveryPerson[1] }, }, { address: "17 rue de la paix 75000 Paris", - estimated_date: new Date("2023-03-01"), + eta: new Date("2023-03-01"), person: { create: deliveryPerson[2] }, }, ]; diff --git a/services/delivery/types/delivery.d.ts b/services/delivery/types/delivery.d.ts new file mode 100644 index 00000000..52fc3159 --- /dev/null +++ b/services/delivery/types/delivery.d.ts @@ -0,0 +1,11 @@ +import { Status } from "@prisma/client"; + +export type DeliveryCreateInput = { + eta: { + seconds: number; + nano: number; + }; + address: string; + status: Status; + delivery_person_id: string; +}; diff --git a/services/proto/delivery.proto b/services/proto/delivery.proto index 39e65277..b306d511 100644 --- a/services/proto/delivery.proto +++ b/services/proto/delivery.proto @@ -1,12 +1,11 @@ syntax = "proto3"; -import "google/protobuf/timestamp.proto"; import "google/protobuf/empty.proto"; package delivery; message Delivery { string id = 1; - google.protobuf.Timestamp estimated_date = 2; + string eta = 2; string address = 3; Status status = 4; @@ -33,7 +32,7 @@ enum Status { } service DeliveryService { - rpc CreateDelivery (Delivery) returns (Delivery) {} + rpc CreateDelivery (DeliveryCreateInput) returns (Delivery) {} rpc GetDelivery (DeliveryId) returns (Delivery) {} rpc UpdateDelivery (Delivery) returns (Delivery) {} rpc DeleteDelivery (DeliveryId) returns (google.protobuf.Empty) {} @@ -43,7 +42,7 @@ service DeliveryService { } service DeliveryPersonService { - rpc CreateDeliveryPerson (DeliveryPerson) returns (DeliveryPerson) {} + rpc CreateDeliveryPerson (DeliveryPersonCreateInput) returns (DeliveryPerson) {} rpc GetDeliveryPerson (DeliveryPersonId) returns (DeliveryPerson) {} rpc UpdateDeliveryPerson (DeliveryPerson) returns (DeliveryPerson) {} rpc DeleteDeliveryPerson (DeliveryPersonId) returns (google.protobuf.Empty) {} @@ -56,7 +55,7 @@ message DeliveryId { string id = 1; } message DeliveryCreateInput { - google.protobuf.Timestamp estimated_date = 1; + string eta = 1; string address = 2; Status status = 3; string delivery_person_id = 4; From c6819b431e62836d13a0ec7ebb911401092e8274 Mon Sep 17 00:00:00 2001 From: Florian LEROUX <10078837+floriaaan@users.noreply.github.com> Date: Wed, 29 Mar 2023 09:53:00 +0200 Subject: [PATCH 233/883] feat(handler): add create-delivery handler --- .../delivery/src/client/delivery-create.ts | 39 +++++++++++++++++ services/delivery/src/handlers/delivery.ts | 42 +++++++++++++++++++ 2 files changed, 81 insertions(+) create mode 100644 services/delivery/src/client/delivery-create.ts create mode 100644 services/delivery/src/handlers/delivery.ts diff --git a/services/delivery/src/client/delivery-create.ts b/services/delivery/src/client/delivery-create.ts new file mode 100644 index 00000000..2b4fdff5 --- /dev/null +++ b/services/delivery/src/client/delivery-create.ts @@ -0,0 +1,39 @@ +import "dotenv/config"; +import { loadSync } from "@grpc/proto-loader"; +import { loadPackageDefinition } from "@grpc/grpc-js"; + +import { options } from "@delivery/resources/protoloader-options"; +import { insecure } from "@delivery/resources/grpc-credentials"; +import { log } from "@delivery/lib/log"; + +const PORT = process.env.PORT || 50008; +const ADDRESS = `localhost:${PORT}`; +const PROTO_PATH = __dirname + "/../../../proto/delivery.proto"; + +const packageDefinition = loadSync(PROTO_PATH, options); +const { delivery } = loadPackageDefinition(packageDefinition) as any; + +function main() { + const client = new delivery.DeliveryService(ADDRESS, insecure); + + /** + * message DeliveryCreateInput { + google.protobuf.Timestamp eta = 1; + string address = 2; + Status status = 3; + string delivery_person_id = 4; + } + */ + const data = { + eta: "2022-01-01T00:00:00.000Z", + address: "10 Rue de la République, 75003 Paris, France", + status: "PENDING", + delivery_person_id: "random_id", + }; + client.CreateDelivery(data, (err: any, response: any) => { + if (err) log.error(err); + log.info(response); + }); +} + +main(); diff --git a/services/delivery/src/handlers/delivery.ts b/services/delivery/src/handlers/delivery.ts new file mode 100644 index 00000000..c6f070af --- /dev/null +++ b/services/delivery/src/handlers/delivery.ts @@ -0,0 +1,42 @@ +import { prisma } from "@delivery/lib/prisma"; +import { log } from "@delivery/lib/log"; +import { Status } from "@prisma/client"; + +type DeliveryCreateInput = { + eta: string; + address: string; + status: Status; + delivery_person_id: string; +}; + +export const CreateDelivery = async ( + data: any, + callback: (err: any, response: any) => void +) => { + log.debug("request received at CreateDelivery handler\n", data.request); + try { + const { request } = data; + const { eta, address, status, delivery_person_id } = + request as DeliveryCreateInput; + + const delivery = await prisma.delivery.create({ + data: { + eta: new Date(eta), + address, + status, + person: { + connect: { + id: delivery_person_id, + }, + }, + }, + include: { + person: true, + }, + }); + callback(null, delivery); + } catch (error) { + log.error(error); + callback(error, null); + } +}; From d90491adb36fe8a52aa5d568e211622837c3ae96 Mon Sep 17 00:00:00 2001 From: Florian LEROUX <10078837+floriaaan@users.noreply.github.com> Date: Fri, 31 Mar 2023 20:59:30 +0200 Subject: [PATCH 234/883] feat(delivery): add implementation of handlers for delivery service --- services/delivery/README.md | 2 +- services/delivery/package.json | 7 ++- .../migration.sql | 10 ++++ services/delivery/prisma/schema.prisma | 7 ++- services/delivery/prisma/seed.ts | 18 +++++++ .../create.ts} | 16 ++---- .../delivery/src/client/delivery/delete.ts | 28 +++++++++++ services/delivery/src/client/delivery/get.ts | 28 +++++++++++ .../src/client/delivery/list-by-restaurant.ts | 39 +++++++++++++++ .../src/client/delivery/list-by-user.ts | 39 +++++++++++++++ .../delivery/src/client/delivery/update.ts | 35 +++++++++++++ .../{delivery.ts => delivery/create.ts} | 20 +++----- .../delivery/src/handlers/delivery/delete.ts | 20 ++++++++ .../delivery/src/handlers/delivery/get.ts | 23 +++++++++ .../delivery/src/handlers/delivery/index.ts | 15 ++++++ .../handlers/delivery/list-by-restaurant.ts | 30 ++++++++++++ .../src/handlers/delivery/list-by-user.ts | 27 ++++++++++ .../delivery/src/handlers/delivery/update.ts | 34 +++++++++++++ services/delivery/src/server.ts | 14 ++---- .../delivery/src/types/delivery-person.d.ts | 11 +++++ services/delivery/src/types/delivery.d.ts | 49 +++++++++++++++++++ services/delivery/types/delivery.d.ts | 11 ----- services/proto/delivery.proto | 6 +++ 23 files changed, 439 insertions(+), 50 deletions(-) create mode 100644 services/delivery/prisma/migrations/20230331181153_add_user_and_restaurant_ids/migration.sql rename services/delivery/src/client/{delivery-create.ts => delivery/create.ts} (74%) create mode 100644 services/delivery/src/client/delivery/delete.ts create mode 100644 services/delivery/src/client/delivery/get.ts create mode 100644 services/delivery/src/client/delivery/list-by-restaurant.ts create mode 100644 services/delivery/src/client/delivery/list-by-user.ts create mode 100644 services/delivery/src/client/delivery/update.ts rename services/delivery/src/handlers/{delivery.ts => delivery/create.ts} (61%) create mode 100644 services/delivery/src/handlers/delivery/delete.ts create mode 100644 services/delivery/src/handlers/delivery/get.ts create mode 100644 services/delivery/src/handlers/delivery/index.ts create mode 100644 services/delivery/src/handlers/delivery/list-by-restaurant.ts create mode 100644 services/delivery/src/handlers/delivery/list-by-user.ts create mode 100644 services/delivery/src/handlers/delivery/update.ts create mode 100644 services/delivery/src/types/delivery-person.d.ts create mode 100644 services/delivery/src/types/delivery.d.ts delete mode 100644 services/delivery/types/delivery.d.ts diff --git a/services/delivery/README.md b/services/delivery/README.md index f3baac1e..7f125245 100644 --- a/services/delivery/README.md +++ b/services/delivery/README.md @@ -5,7 +5,7 @@ | **Port:** 50008 | | **Developer:** @floriaaan | | **Status:** In progress | -| **Last update:** 2023-03-29 | +| **Last update:** 2023-03-31 | | **Language:** NodeJS | | **Dependencies:** TypeScript, Prisma, gRPC, Postgres | | **Models:** (see [`prisma/schema.prisma`](./prisma/schema.prisma)) | diff --git a/services/delivery/package.json b/services/delivery/package.json index 113ef54d..3eb5a908 100644 --- a/services/delivery/package.json +++ b/services/delivery/package.json @@ -4,7 +4,12 @@ "start": "ts-node ./src/server.ts", "dev": "nodemon --watch 'src/**/*.ts' --exec 'ts-node' src/server.ts", "seed": "ts-node prisma/seed.ts", - "client:delivery-create": "ts-node ./src/client/delivery-create.ts" + "client:delivery-create": "ts-node ./src/client/delivery/create.ts", + "client:delivery-get": "ts-node ./src/client/delivery/get.ts", + "client:delivery-update": "ts-node ./src/client/delivery/update.ts", + "client:delivery-delete": "ts-node ./src/client/delivery/delete.ts", + "client:delivery-listByRestaurant": "ts-node ./src/client/delivery/list-by-restaurant.ts", + "client:delivery-listByUser": "ts-node ./src/client/delivery/list-by-user.ts" }, "dependencies": { "@grpc/grpc-js": "^1.8.13", diff --git a/services/delivery/prisma/migrations/20230331181153_add_user_and_restaurant_ids/migration.sql b/services/delivery/prisma/migrations/20230331181153_add_user_and_restaurant_ids/migration.sql new file mode 100644 index 00000000..2e663da2 --- /dev/null +++ b/services/delivery/prisma/migrations/20230331181153_add_user_and_restaurant_ids/migration.sql @@ -0,0 +1,10 @@ +/* + Warnings: + + - Added the required column `restaurant_id` to the `Delivery` table without a default value. This is not possible if the table is not empty. + - Added the required column `user_id` to the `Delivery` table without a default value. This is not possible if the table is not empty. + +*/ +-- AlterTable +ALTER TABLE "Delivery" ADD COLUMN "restaurant_id" TEXT NOT NULL, +ADD COLUMN "user_id" TEXT NOT NULL; diff --git a/services/delivery/prisma/schema.prisma b/services/delivery/prisma/schema.prisma index 2c999c8d..0d7939f5 100644 --- a/services/delivery/prisma/schema.prisma +++ b/services/delivery/prisma/schema.prisma @@ -15,7 +15,7 @@ enum Status { } model Delivery { - id String @id @default(cuid()) + id String @id @default(cuid()) eta DateTime address String @@ -23,13 +23,16 @@ model Delivery { person DeliveryPerson @relation(fields: [delivery_person_id], references: [id]) delivery_person_id String + + user_id String + restaurant_id String } model DeliveryPerson { id String @id @default(cuid()) first_name String last_name String - phone String @unique + phone String @unique location Float[] deliveries Delivery[] diff --git a/services/delivery/prisma/seed.ts b/services/delivery/prisma/seed.ts index cf92b561..cc6998fd 100644 --- a/services/delivery/prisma/seed.ts +++ b/services/delivery/prisma/seed.ts @@ -29,16 +29,33 @@ const deliveries: Prisma.DeliveryCreateInput[] = [ address: "15 rue de la paix 75000 Paris", eta: new Date("2023-01-01"), person: { create: deliveryPerson[0] }, + + restaurant_id: "restaurant_id:1", + user_id: "user_id:1", + }, + { + address: "15 rue de la paix 75000 Paris", + eta: new Date("2023-01-01"), + person: { create: deliveryPerson[0] }, + + restaurant_id: "restaurant_id:2", + user_id: "user_id:1", }, { address: "16 rue de la paix 75000 Paris", eta: new Date("2023-02-01"), person: { create: deliveryPerson[1] }, + + restaurant_id: "restaurant_id:1", + user_id: "user_id:2", }, { address: "17 rue de la paix 75000 Paris", eta: new Date("2023-03-01"), person: { create: deliveryPerson[2] }, + + restaurant_id: "restaurant_id:1", + user_id: "user_id:3", }, ]; @@ -60,5 +77,6 @@ main() .catch(async (e) => { console.error(e); await prisma.$disconnect(); + // @ts-ignore process.exit(1); }); diff --git a/services/delivery/src/client/delivery-create.ts b/services/delivery/src/client/delivery/create.ts similarity index 74% rename from services/delivery/src/client/delivery-create.ts rename to services/delivery/src/client/delivery/create.ts index 2b4fdff5..9e6717dd 100644 --- a/services/delivery/src/client/delivery-create.ts +++ b/services/delivery/src/client/delivery/create.ts @@ -8,7 +8,7 @@ import { log } from "@delivery/lib/log"; const PORT = process.env.PORT || 50008; const ADDRESS = `localhost:${PORT}`; -const PROTO_PATH = __dirname + "/../../../proto/delivery.proto"; +const PROTO_PATH = __dirname + "/../../../../proto/delivery.proto"; const packageDefinition = loadSync(PROTO_PATH, options); const { delivery } = loadPackageDefinition(packageDefinition) as any; @@ -16,23 +16,17 @@ const { delivery } = loadPackageDefinition(packageDefinition) as any; function main() { const client = new delivery.DeliveryService(ADDRESS, insecure); - /** - * message DeliveryCreateInput { - google.protobuf.Timestamp eta = 1; - string address = 2; - Status status = 3; - string delivery_person_id = 4; - } - */ const data = { eta: "2022-01-01T00:00:00.000Z", address: "10 Rue de la République, 75003 Paris, France", status: "PENDING", delivery_person_id: "random_id", + restaurant_id: "restaurant_id:1", + user_id: "user_id:1", }; client.CreateDelivery(data, (err: any, response: any) => { - if (err) log.error(err); - log.info(response); + if (err) log.debug(err); + log.debug(response); }); } diff --git a/services/delivery/src/client/delivery/delete.ts b/services/delivery/src/client/delivery/delete.ts new file mode 100644 index 00000000..74c08a90 --- /dev/null +++ b/services/delivery/src/client/delivery/delete.ts @@ -0,0 +1,28 @@ +import "dotenv/config"; +import { loadSync } from "@grpc/proto-loader"; +import { loadPackageDefinition } from "@grpc/grpc-js"; + +import { options } from "@delivery/resources/protoloader-options"; +import { insecure } from "@delivery/resources/grpc-credentials"; +import { log } from "@delivery/lib/log"; + +const PORT = process.env.PORT || 50008; +const ADDRESS = `localhost:${PORT}`; +const PROTO_PATH = __dirname + "/../../../../proto/delivery.proto"; + +const packageDefinition = loadSync(PROTO_PATH, options); +const { delivery } = loadPackageDefinition(packageDefinition) as any; + +function main() { + const client = new delivery.DeliveryService(ADDRESS, insecure); + + const data = { + id: "clfwvdqdg0000eun46hcudaec", // Change this to a valid delivery id + }; + client.DeleteDelivery(data, (err: any, response: any) => { + if (err) log.debug(err); + log.debug(response); + }); +} + +main(); diff --git a/services/delivery/src/client/delivery/get.ts b/services/delivery/src/client/delivery/get.ts new file mode 100644 index 00000000..197e23df --- /dev/null +++ b/services/delivery/src/client/delivery/get.ts @@ -0,0 +1,28 @@ +import "dotenv/config"; +import { loadSync } from "@grpc/proto-loader"; +import { loadPackageDefinition } from "@grpc/grpc-js"; + +import { options } from "@delivery/resources/protoloader-options"; +import { insecure } from "@delivery/resources/grpc-credentials"; +import { log } from "@delivery/lib/log"; + +const PORT = process.env.PORT || 50008; +const ADDRESS = `localhost:${PORT}`; +const PROTO_PATH = __dirname + "/../../../../proto/delivery.proto"; + +const packageDefinition = loadSync(PROTO_PATH, options); +const { delivery } = loadPackageDefinition(packageDefinition) as any; + +function main() { + const client = new delivery.DeliveryService(ADDRESS, insecure); + + const data = { + id: "clfwv7rcp0000euwpyyoid7x", // Change this to a valid delivery id + }; + client.GetDelivery(data, (err: any, response: any) => { + if (err) log.debug(err); + log.debug(response); + }); +} + +main(); diff --git a/services/delivery/src/client/delivery/list-by-restaurant.ts b/services/delivery/src/client/delivery/list-by-restaurant.ts new file mode 100644 index 00000000..0e7157a5 --- /dev/null +++ b/services/delivery/src/client/delivery/list-by-restaurant.ts @@ -0,0 +1,39 @@ +import "dotenv/config"; +import { loadSync } from "@grpc/proto-loader"; +import { loadPackageDefinition } from "@grpc/grpc-js"; + +import { options } from "@delivery/resources/protoloader-options"; +import { insecure } from "@delivery/resources/grpc-credentials"; +import { log } from "@delivery/lib/log"; +import { Delivery } from "@delivery/types/delivery"; + +const PORT = process.env.PORT || 50008; +const ADDRESS = `localhost:${PORT}`; +const PROTO_PATH = __dirname + "/../../../../proto/delivery.proto"; + +const packageDefinition = loadSync(PROTO_PATH, options); +const { delivery } = loadPackageDefinition(packageDefinition) as any; + +function main() { + const client = new delivery.DeliveryService(ADDRESS, insecure); + + const data = { + id: "restaurant_id:1", + }; + + const call = client.ListDeliveriesByRestaurant(data); + const deliveries: Delivery[] = []; + call.on("data", (delivery: Delivery) => { + log.debug(`Received delivery: ${delivery.id}`); + deliveries.push(delivery); + }); + call.on("end", () => { + console.log("All deliveries received."); + log.debug(deliveries); + }); + call.on("error", (error: Error) => { + log.debug("Error:", error.message); + }); +} + +main(); diff --git a/services/delivery/src/client/delivery/list-by-user.ts b/services/delivery/src/client/delivery/list-by-user.ts new file mode 100644 index 00000000..b51c7f2b --- /dev/null +++ b/services/delivery/src/client/delivery/list-by-user.ts @@ -0,0 +1,39 @@ +import "dotenv/config"; +import { loadSync } from "@grpc/proto-loader"; +import { loadPackageDefinition } from "@grpc/grpc-js"; + +import { options } from "@delivery/resources/protoloader-options"; +import { insecure } from "@delivery/resources/grpc-credentials"; +import { log } from "@delivery/lib/log"; +import { Delivery } from "@delivery/types/delivery"; + +const PORT = process.env.PORT || 50008; +const ADDRESS = `localhost:${PORT}`; +const PROTO_PATH = __dirname + "/../../../../proto/delivery.proto"; + +const packageDefinition = loadSync(PROTO_PATH, options); +const { delivery } = loadPackageDefinition(packageDefinition) as any; + +function main() { + const client = new delivery.DeliveryService(ADDRESS, insecure); + + const data = { + id: "user_id:1", + }; + + const call = client.ListDeliveriesByUser(data); + const deliveries: Delivery[] = []; + call.on("data", (delivery: Delivery) => { + log.debug(`Received delivery: ${delivery.id}`); + deliveries.push(delivery); + }); + call.on("end", () => { + console.log("All deliveries received."); + log.debug(deliveries); + }); + call.on("error", (error: Error) => { + log.debug("Error:", error.message); + }); +} + +main(); diff --git a/services/delivery/src/client/delivery/update.ts b/services/delivery/src/client/delivery/update.ts new file mode 100644 index 00000000..1b997641 --- /dev/null +++ b/services/delivery/src/client/delivery/update.ts @@ -0,0 +1,35 @@ +import "dotenv/config"; +import { loadSync } from "@grpc/proto-loader"; +import { loadPackageDefinition } from "@grpc/grpc-js"; + +import { options } from "@delivery/resources/protoloader-options"; +import { insecure } from "@delivery/resources/grpc-credentials"; +import { log } from "@delivery/lib/log"; +import { Status } from "@prisma/client"; + +const PORT = process.env.PORT || 50008; +const ADDRESS = `localhost:${PORT}`; +const PROTO_PATH = __dirname + "/../../../../proto/delivery.proto"; + +const packageDefinition = loadSync(PROTO_PATH, options); +const { delivery } = loadPackageDefinition(packageDefinition) as any; + +function main() { + const client = new delivery.DeliveryService(ADDRESS, insecure); + + const data = { + id: "clfwvhula0000eunjmo7bmrtz", // Change this to a valid delivery id + eta: "2022-01-01T00:00:00.000Z", + address: "10 Rue de la République, 75003 Paris, France", + status: Status.FULFILLED, + delivery_person_id: "random_id", + restaurant_id: "restaurant_id:1", + user_id: "user_id:1", + }; + client.UpdateDelivery(data, (err: any, response: any) => { + if (err) log.debug(err); + log.debug(response); + }); +} + +main(); diff --git a/services/delivery/src/handlers/delivery.ts b/services/delivery/src/handlers/delivery/create.ts similarity index 61% rename from services/delivery/src/handlers/delivery.ts rename to services/delivery/src/handlers/delivery/create.ts index c6f070af..1ad90069 100644 --- a/services/delivery/src/handlers/delivery.ts +++ b/services/delivery/src/handlers/delivery/create.ts @@ -1,23 +1,15 @@ import { prisma } from "@delivery/lib/prisma"; import { log } from "@delivery/lib/log"; -import { Status } from "@prisma/client"; - -type DeliveryCreateInput = { - eta: string; - address: string; - status: Status; - delivery_person_id: string; -}; +import { Data, DeliveryCreateInput } from "@delivery/types/delivery"; export const CreateDelivery = async ( - data: any, + { request }: Data, callback: (err: any, response: any) => void ) => { - log.debug("request received at CreateDelivery handler\n", data.request); + log.debug("request received at CreateDelivery handler\n", request); try { - const { request } = data; - const { eta, address, status, delivery_person_id } = - request as DeliveryCreateInput; + const { eta, address, status, delivery_person_id, restaurant_id, user_id } = + request; const delivery = await prisma.delivery.create({ data: { @@ -29,6 +21,8 @@ export const CreateDelivery = async ( id: delivery_person_id, }, }, + restaurant_id, + user_id, }, include: { person: true, diff --git a/services/delivery/src/handlers/delivery/delete.ts b/services/delivery/src/handlers/delivery/delete.ts new file mode 100644 index 00000000..cdeee90b --- /dev/null +++ b/services/delivery/src/handlers/delivery/delete.ts @@ -0,0 +1,20 @@ +import { prisma } from "@delivery/lib/prisma"; +import { log } from "@delivery/lib/log"; +import { Data, DeliveryId } from "@delivery/types/delivery"; + +export const DeleteDelivery = async ( + data: Data, + callback: (err: any, response: any) => void +) => { + log.debug("request received at DeleteDelivery handler\n", data.request); + try { + const { request } = data; + const { id } = request; + + const delivery = await prisma.delivery.delete({ where: { id } }); + callback(null, delivery); + } catch (error) { + log.error(error); + callback(error, null); + } +}; diff --git a/services/delivery/src/handlers/delivery/get.ts b/services/delivery/src/handlers/delivery/get.ts new file mode 100644 index 00000000..cde931dd --- /dev/null +++ b/services/delivery/src/handlers/delivery/get.ts @@ -0,0 +1,23 @@ +import { prisma } from "@delivery/lib/prisma"; +import { log } from "@delivery/lib/log"; +import { Data, DeliveryId } from "@delivery/types/delivery"; + +export const GetDelivery = async ( + data: Data, + callback: (err: any, response: any) => void +) => { + log.debug("request received at GetDelivery handler\n", data.request); + try { + const { request } = data; + const { id } = request; + + const delivery = await prisma.delivery.findFirstOrThrow({ + where: { id }, + include: { person: true }, + }); + callback(null, delivery); + } catch (error) { + log.error(error); + callback(error, null); + } +}; diff --git a/services/delivery/src/handlers/delivery/index.ts b/services/delivery/src/handlers/delivery/index.ts new file mode 100644 index 00000000..eb1b93b8 --- /dev/null +++ b/services/delivery/src/handlers/delivery/index.ts @@ -0,0 +1,15 @@ +import { CreateDelivery } from "@delivery/handlers/delivery/create"; +import { GetDelivery } from "@delivery/handlers/delivery/get"; +import { UpdateDelivery } from "@delivery/handlers/delivery/update"; +import { DeleteDelivery } from "@delivery/handlers/delivery/delete"; +import { ListDeliveriesByUser } from "@delivery/handlers/delivery/list-by-user"; +import { ListDeliveriesByRestaurant } from "@delivery/handlers/delivery/list-by-restaurant"; + +export default { + CreateDelivery, + GetDelivery, + UpdateDelivery, + DeleteDelivery, + ListDeliveriesByUser, + ListDeliveriesByRestaurant, +}; diff --git a/services/delivery/src/handlers/delivery/list-by-restaurant.ts b/services/delivery/src/handlers/delivery/list-by-restaurant.ts new file mode 100644 index 00000000..ecfa3991 --- /dev/null +++ b/services/delivery/src/handlers/delivery/list-by-restaurant.ts @@ -0,0 +1,30 @@ +import { prisma } from "@delivery/lib/prisma"; +import { log } from "@delivery/lib/log"; +import { RestaurantId, Delivery } from "@delivery/types/delivery"; +import { ServerWritableStream } from "@grpc/grpc-js"; + +export const ListDeliveriesByRestaurant = async ( + call: ServerWritableStream +) => { + log.debug( + "request received at ListDeliveriesByRestaurant handler\n", + call.request + ); + try { + const { id } = call.request; + + const deliveries = await prisma.delivery.findMany({ + where: { restaurant_id: id }, + include: { person: true }, + }); + + for (const delivery of deliveries) { + call.write(delivery); + } + call.end(); + } catch (error) { + log.error(error); + + call.end(); + } +}; diff --git a/services/delivery/src/handlers/delivery/list-by-user.ts b/services/delivery/src/handlers/delivery/list-by-user.ts new file mode 100644 index 00000000..2bdb406c --- /dev/null +++ b/services/delivery/src/handlers/delivery/list-by-user.ts @@ -0,0 +1,27 @@ +import { prisma } from "@delivery/lib/prisma"; +import { log } from "@delivery/lib/log"; +import { Delivery, UserId } from "@delivery/types/delivery"; +import { ServerWritableStream } from "@grpc/grpc-js"; + +export const ListDeliveriesByUser = async ( + call: ServerWritableStream +) => { + log.debug("request received at ListDeliveriesByUser handler\n", call.request); + try { + const { id } = call.request; + + const deliveries = await prisma.delivery.findMany({ + where: { user_id: id }, + include: { person: true }, + }); + + for (const delivery of deliveries) { + call.write(delivery); + } + call.end(); + } catch (error) { + log.error(error); + + call.end(); + } +}; diff --git a/services/delivery/src/handlers/delivery/update.ts b/services/delivery/src/handlers/delivery/update.ts new file mode 100644 index 00000000..d08d2bd2 --- /dev/null +++ b/services/delivery/src/handlers/delivery/update.ts @@ -0,0 +1,34 @@ +import { prisma } from "@delivery/lib/prisma"; +import { log } from "@delivery/lib/log"; +import { Data, Delivery } from "@delivery/types/delivery"; + +export const UpdateDelivery = async ( + data: Data, + callback: (err: any, response: any) => void +) => { + log.debug("request received at UpdateDelivery handler\n", data.request); + try { + const { eta, address, status, delivery_person_id, id } = data.request; + + const delivery = await prisma.delivery.update({ + where: { id }, + data: { + eta: new Date(eta), + address, + status, + person: { + connect: { + id: delivery_person_id, + }, + }, + }, + include: { + person: true, + }, + }); + callback(null, delivery); + } catch (error) { + log.error(error); + callback(error, null); + } +}; diff --git a/services/delivery/src/server.ts b/services/delivery/src/server.ts index 16a27d70..2eac6c38 100644 --- a/services/delivery/src/server.ts +++ b/services/delivery/src/server.ts @@ -7,7 +7,7 @@ import { log, utils } from "@delivery/lib/log"; import { options } from "@delivery/resources/protoloader-options"; import { serverInsecure } from "@delivery/resources/grpc-credentials"; -import { CreateDelivery } from "@delivery/handlers/delivery"; +import deliveryHandlers from "@delivery/handlers/delivery"; const PORT = process.env.PORT || 50008; const ADDRESS = `0.0.0.0:${PORT}`; @@ -17,16 +17,8 @@ const packageDefinition = loadSync(PROTO_PATH, options); const { delivery } = loadPackageDefinition(packageDefinition) as any; // todo: fix any const server = new Server(); -server.addService(delivery.DeliveryService.service, { - // handlers - // todo: add handlers - CreateDelivery, -}); - -server.addService(delivery.DeliveryPersonService.service, { - // handlers - // todo: add handlers -}); +server.addService(delivery.DeliveryService.service, deliveryHandlers); +server.addService(delivery.DeliveryPersonService.service, {}); server.bindAsync(ADDRESS, serverInsecure, () => { server.start(); diff --git a/services/delivery/src/types/delivery-person.d.ts b/services/delivery/src/types/delivery-person.d.ts new file mode 100644 index 00000000..a897860e --- /dev/null +++ b/services/delivery/src/types/delivery-person.d.ts @@ -0,0 +1,11 @@ +import { Delivery } from "@delivery/types/delivery"; + +export type DeliveryPerson = { + id: string; + first_name: string; + last_name: string; + phone: string; + location: [number, number]; + + deliveries: Delivery[]; +}; diff --git a/services/delivery/src/types/delivery.d.ts b/services/delivery/src/types/delivery.d.ts new file mode 100644 index 00000000..333462d6 --- /dev/null +++ b/services/delivery/src/types/delivery.d.ts @@ -0,0 +1,49 @@ +import { DeliveryPerson } from "@delivery/types/delivery-person"; +import { Status } from "@prisma/client"; + +export type Data = { + request: T; +}; + +export type Stream = { + write: (data: any) => void; + end: () => void; + request: T; +}; + +export type DeliveryCreateInput = { + eta: string; + address: string; + + status: Status; + delivery_person_id: string; + + user_id: string; + restaurant_id: string; +}; + +export type DeliveryId = { + id: string; +}; + +export type Delivery = { + id: string; + eta: string; + + address: string; + status: Status; + + person: DeliveryPerson; + delivery_person_id: string; + + user_id: string; + restaurant_id: string; +}; + +export type UserId = { + id: string; +}; + +export type RestaurantId = { + id: string; +}; diff --git a/services/delivery/types/delivery.d.ts b/services/delivery/types/delivery.d.ts deleted file mode 100644 index 52fc3159..00000000 --- a/services/delivery/types/delivery.d.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { Status } from "@prisma/client"; - -export type DeliveryCreateInput = { - eta: { - seconds: number; - nano: number; - }; - address: string; - status: Status; - delivery_person_id: string; -}; diff --git a/services/proto/delivery.proto b/services/proto/delivery.proto index b306d511..e20e1e97 100644 --- a/services/proto/delivery.proto +++ b/services/proto/delivery.proto @@ -12,6 +12,9 @@ message Delivery { DeliveryPerson person = 5; string delivery_person_id = 6; + + string user_id = 7; + string restaurant_id = 8; } message DeliveryPerson { @@ -59,6 +62,9 @@ message DeliveryCreateInput { string address = 2; Status status = 3; string delivery_person_id = 4; + + string user_id = 5; + string restaurant_id = 6; } message UserId { From 6fb676e447bc53762a0282bedb29a27974e398ed Mon Sep 17 00:00:00 2001 From: Florian LEROUX <10078837+floriaaan@users.noreply.github.com> Date: Sat, 1 Apr 2023 14:20:43 +0200 Subject: [PATCH 235/883] ref(proto): change stream to repeated --- .../src/client/delivery/list-by-restaurant.ts | 19 ++++-------------- .../src/client/delivery/list-by-user.ts | 19 ++++-------------- .../handlers/delivery/list-by-restaurant.ts | 20 ++++++++----------- .../src/handlers/delivery/list-by-user.ts | 20 ++++++++----------- services/proto/delivery.proto | 16 +++++++++++---- 5 files changed, 36 insertions(+), 58 deletions(-) diff --git a/services/delivery/src/client/delivery/list-by-restaurant.ts b/services/delivery/src/client/delivery/list-by-restaurant.ts index 0e7157a5..a3dd55d9 100644 --- a/services/delivery/src/client/delivery/list-by-restaurant.ts +++ b/services/delivery/src/client/delivery/list-by-restaurant.ts @@ -5,7 +5,6 @@ import { loadPackageDefinition } from "@grpc/grpc-js"; import { options } from "@delivery/resources/protoloader-options"; import { insecure } from "@delivery/resources/grpc-credentials"; import { log } from "@delivery/lib/log"; -import { Delivery } from "@delivery/types/delivery"; const PORT = process.env.PORT || 50008; const ADDRESS = `localhost:${PORT}`; @@ -18,21 +17,11 @@ function main() { const client = new delivery.DeliveryService(ADDRESS, insecure); const data = { - id: "restaurant_id:1", + id: "restaurant_id:1", // Change this to a valid delivery id }; - - const call = client.ListDeliveriesByRestaurant(data); - const deliveries: Delivery[] = []; - call.on("data", (delivery: Delivery) => { - log.debug(`Received delivery: ${delivery.id}`); - deliveries.push(delivery); - }); - call.on("end", () => { - console.log("All deliveries received."); - log.debug(deliveries); - }); - call.on("error", (error: Error) => { - log.debug("Error:", error.message); + client.ListDeliveriesByRestaurant(data, (err: any, response: any) => { + if (err) log.debug(err); + log.debug(response); }); } diff --git a/services/delivery/src/client/delivery/list-by-user.ts b/services/delivery/src/client/delivery/list-by-user.ts index b51c7f2b..1fbc9c48 100644 --- a/services/delivery/src/client/delivery/list-by-user.ts +++ b/services/delivery/src/client/delivery/list-by-user.ts @@ -5,7 +5,6 @@ import { loadPackageDefinition } from "@grpc/grpc-js"; import { options } from "@delivery/resources/protoloader-options"; import { insecure } from "@delivery/resources/grpc-credentials"; import { log } from "@delivery/lib/log"; -import { Delivery } from "@delivery/types/delivery"; const PORT = process.env.PORT || 50008; const ADDRESS = `localhost:${PORT}`; @@ -18,21 +17,11 @@ function main() { const client = new delivery.DeliveryService(ADDRESS, insecure); const data = { - id: "user_id:1", + id: "user_id:1", // Change this to a valid delivery id }; - - const call = client.ListDeliveriesByUser(data); - const deliveries: Delivery[] = []; - call.on("data", (delivery: Delivery) => { - log.debug(`Received delivery: ${delivery.id}`); - deliveries.push(delivery); - }); - call.on("end", () => { - console.log("All deliveries received."); - log.debug(deliveries); - }); - call.on("error", (error: Error) => { - log.debug("Error:", error.message); + client.ListDeliveriesByUser(data, (err: any, response: any) => { + if (err) log.debug(err); + log.debug(response); }); } diff --git a/services/delivery/src/handlers/delivery/list-by-restaurant.ts b/services/delivery/src/handlers/delivery/list-by-restaurant.ts index ecfa3991..879bb285 100644 --- a/services/delivery/src/handlers/delivery/list-by-restaurant.ts +++ b/services/delivery/src/handlers/delivery/list-by-restaurant.ts @@ -1,30 +1,26 @@ import { prisma } from "@delivery/lib/prisma"; import { log } from "@delivery/lib/log"; -import { RestaurantId, Delivery } from "@delivery/types/delivery"; -import { ServerWritableStream } from "@grpc/grpc-js"; +import { Data, RestaurantId } from "@delivery/types/delivery"; export const ListDeliveriesByRestaurant = async ( - call: ServerWritableStream + data: Data, + callback: (err: any, response: any) => void ) => { log.debug( "request received at ListDeliveriesByRestaurant handler\n", - call.request + data.request ); try { - const { id } = call.request; + const { request } = data; + const { id } = request; const deliveries = await prisma.delivery.findMany({ where: { restaurant_id: id }, include: { person: true }, }); - - for (const delivery of deliveries) { - call.write(delivery); - } - call.end(); + callback(null, { deliveries }); } catch (error) { log.error(error); - - call.end(); + callback(error, null); } }; diff --git a/services/delivery/src/handlers/delivery/list-by-user.ts b/services/delivery/src/handlers/delivery/list-by-user.ts index 2bdb406c..8c220175 100644 --- a/services/delivery/src/handlers/delivery/list-by-user.ts +++ b/services/delivery/src/handlers/delivery/list-by-user.ts @@ -1,27 +1,23 @@ import { prisma } from "@delivery/lib/prisma"; import { log } from "@delivery/lib/log"; -import { Delivery, UserId } from "@delivery/types/delivery"; -import { ServerWritableStream } from "@grpc/grpc-js"; +import { Data, UserId } from "@delivery/types/delivery"; export const ListDeliveriesByUser = async ( - call: ServerWritableStream + data: Data, + callback: (err: any, response: any) => void ) => { - log.debug("request received at ListDeliveriesByUser handler\n", call.request); + log.debug("request received at ListDeliveriesByUser handler\n", data.request); try { - const { id } = call.request; + const { request } = data; + const { id } = request; const deliveries = await prisma.delivery.findMany({ where: { user_id: id }, include: { person: true }, }); - - for (const delivery of deliveries) { - call.write(delivery); - } - call.end(); + callback(null, { deliveries }); } catch (error) { log.error(error); - - call.end(); + callback(error, null); } }; diff --git a/services/proto/delivery.proto b/services/proto/delivery.proto index e20e1e97..f4906434 100644 --- a/services/proto/delivery.proto +++ b/services/proto/delivery.proto @@ -39,8 +39,8 @@ service DeliveryService { rpc GetDelivery (DeliveryId) returns (Delivery) {} rpc UpdateDelivery (Delivery) returns (Delivery) {} rpc DeleteDelivery (DeliveryId) returns (google.protobuf.Empty) {} - rpc ListDeliveriesByUser (UserId) returns (stream Delivery) {} - rpc ListDeliveriesByRestaurant (RestaurantId) returns (stream Delivery) {} + rpc ListDeliveriesByUser (UserId) returns (DeliveryList) {} + rpc ListDeliveriesByRestaurant (RestaurantId) returns (DeliveryList) {} } @@ -49,8 +49,8 @@ service DeliveryPersonService { rpc GetDeliveryPerson (DeliveryPersonId) returns (DeliveryPerson) {} rpc UpdateDeliveryPerson (DeliveryPerson) returns (DeliveryPerson) {} rpc DeleteDeliveryPerson (DeliveryPersonId) returns (google.protobuf.Empty) {} - rpc ListDeliveryPersons (google.protobuf.Empty) returns (stream DeliveryPerson) {} - rpc ListNearDeliveryPersons (Location) returns (stream DeliveryPerson) {} + rpc ListDeliveryPersons (google.protobuf.Empty) returns (DeliveryPersonList) {} + rpc ListNearDeliveryPersons (Location) returns (DeliveryPersonList) {} } @@ -75,6 +75,14 @@ message RestaurantId { string id = 1; } +message DeliveryList { + repeated Delivery deliveries = 1; +} + +message DeliveryPersonList { + repeated DeliveryPersonList persons = 1; +} + message DeliveryPersonId { string id = 1; } From 0e18ca918c4950719940622f539225c709dfe1e1 Mon Sep 17 00:00:00 2001 From: Florian LEROUX <10078837+floriaaan@users.noreply.github.com> Date: Tue, 4 Apr 2023 10:07:20 +0200 Subject: [PATCH 236/883] ci: add test/coverage scripts and update README --- .github/workflows/delivery.yml | 68 + .github/workflows/{tests.yml => global.yml} | 15 +- README.md | 1 + services/delivery/README.md | 2 +- services/delivery/coverage/base.css | 224 ++ .../delivery/coverage/block-navigation.js | 87 + services/delivery/coverage/clover.xml | 6 + .../delivery/coverage/coverage-final.json | 1 + services/delivery/coverage/favicon.png | Bin 0 -> 445 bytes services/delivery/coverage/index.html | 101 + services/delivery/coverage/prettify.css | 1 + services/delivery/coverage/prettify.js | 2 + .../delivery/coverage/sort-arrow-sprite.png | Bin 0 -> 138 bytes services/delivery/coverage/sorter.js | 196 ++ services/delivery/package.json | 31 +- services/delivery/pnpm-lock.yaml | 1852 +++++++++++++++-- services/delivery/proto | 1 + services/delivery/src/tests/test.test.ts | 6 + services/delivery/vitest.config.ts | 7 + 19 files changed, 2451 insertions(+), 150 deletions(-) create mode 100644 .github/workflows/delivery.yml rename .github/workflows/{tests.yml => global.yml} (75%) create mode 100644 services/delivery/coverage/base.css create mode 100644 services/delivery/coverage/block-navigation.js create mode 100644 services/delivery/coverage/clover.xml create mode 100644 services/delivery/coverage/coverage-final.json create mode 100644 services/delivery/coverage/favicon.png create mode 100644 services/delivery/coverage/index.html create mode 100644 services/delivery/coverage/prettify.css create mode 100644 services/delivery/coverage/prettify.js create mode 100644 services/delivery/coverage/sort-arrow-sprite.png create mode 100644 services/delivery/coverage/sorter.js create mode 120000 services/delivery/proto create mode 100644 services/delivery/src/tests/test.test.ts create mode 100644 services/delivery/vitest.config.ts diff --git a/.github/workflows/delivery.yml b/.github/workflows/delivery.yml new file mode 100644 index 00000000..a0953866 --- /dev/null +++ b/.github/workflows/delivery.yml @@ -0,0 +1,68 @@ +name: Delivery Microservice CI/CD + +on: + push: + branches: [delivery] + pull_request: + branches: [dev, main] + +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@master + - uses: pnpm/action-setup@v2 + with: + version: 7 + - uses: actions/setup-node@v3 + with: + node-version: "18.x" + cache: "pnpm" + - name: Install dependencies + run: | + cd ./services/delivery + pnpm install --frozen-lockfile + - name: Build + run: | + cd ./services/delivery + pnpm build + + test: + runs-on: ubuntu-latest + needs: build + steps: + - uses: actions/checkout@master + - uses: pnpm/action-setup@v2 + with: + version: 7 + - uses: actions/setup-node@v3 + with: + node-version: "18.x" + cache: "pnpm" + - name: Install dependencies + run: | + cd ./services/delivery + pnpm install --frozen-lockfile + - name: Execute tests + run: | + cd ./services/delivery + pnpm test + + publish: + runs-on: ubuntu-latest + needs: [build, test] + if: ${{ success() }} && ${{ github.ref == 'refs/heads/dev' || github.ref == 'refs/heads/main' }} + steps: + - name: Checkout code + uses: actions/checkout@v2 + - name: Login to Docker Hub + uses: docker/login-action@v1 + with: + username: ${{ secrets.DOCKER_USERNAME }} + password: ${{ secrets.DOCKER_PASSWORD }} + - name: Build and push Docker image + uses: docker/build-push-action@v2 + with: + context: ./services/delivery + push: true + tags: floriaaan/goodfood-delivery:latest diff --git a/.github/workflows/tests.yml b/.github/workflows/global.yml similarity index 75% rename from .github/workflows/tests.yml rename to .github/workflows/global.yml index c83c0a05..5d458b6b 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/global.yml @@ -1,13 +1,18 @@ # This workflow will do a clean installation of node dependencies, cache/restore them, build the source code and run tests across different versions of node # For more information see: https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions -name: "Tests" +name: "Tests all microservices" on: - - push - - pull_request - - workflow_dispatch - + push: + branches: + - main + - dev + pull_request: + branches: + - main + - dev + workflow_dispatch: jobs: tests: diff --git a/README.md b/README.md index a405370d..8be16b82 100644 --- a/README.md +++ b/README.md @@ -47,6 +47,7 @@ The file hierarchy for this project is as follows: ├── gateway/ │ ├── k8s/ │ │ └── (...) # k8s files + │ ├── proto/ (symbolic link to /services/proto/) │ └── terraform/ │ └── (...) # terraform files ├── user/ diff --git a/services/delivery/README.md b/services/delivery/README.md index 7f125245..69965be6 100644 --- a/services/delivery/README.md +++ b/services/delivery/README.md @@ -5,7 +5,7 @@ | **Port:** 50008 | | **Developer:** @floriaaan | | **Status:** In progress | -| **Last update:** 2023-03-31 | +| **Last update:** 2023-04-04 | | **Language:** NodeJS | | **Dependencies:** TypeScript, Prisma, gRPC, Postgres | | **Models:** (see [`prisma/schema.prisma`](./prisma/schema.prisma)) | diff --git a/services/delivery/coverage/base.css b/services/delivery/coverage/base.css new file mode 100644 index 00000000..f418035b --- /dev/null +++ b/services/delivery/coverage/base.css @@ -0,0 +1,224 @@ +body, html { + margin:0; padding: 0; + height: 100%; +} +body { + font-family: Helvetica Neue, Helvetica, Arial; + font-size: 14px; + color:#333; +} +.small { font-size: 12px; } +*, *:after, *:before { + -webkit-box-sizing:border-box; + -moz-box-sizing:border-box; + box-sizing:border-box; + } +h1 { font-size: 20px; margin: 0;} +h2 { font-size: 14px; } +pre { + font: 12px/1.4 Consolas, "Liberation Mono", Menlo, Courier, monospace; + margin: 0; + padding: 0; + -moz-tab-size: 2; + -o-tab-size: 2; + tab-size: 2; +} +a { color:#0074D9; text-decoration:none; } +a:hover { text-decoration:underline; } +.strong { font-weight: bold; } +.space-top1 { padding: 10px 0 0 0; } +.pad2y { padding: 20px 0; } +.pad1y { padding: 10px 0; } +.pad2x { padding: 0 20px; } +.pad2 { padding: 20px; } +.pad1 { padding: 10px; } +.space-left2 { padding-left:55px; } +.space-right2 { padding-right:20px; } +.center { text-align:center; } +.clearfix { display:block; } +.clearfix:after { + content:''; + display:block; + height:0; + clear:both; + visibility:hidden; + } +.fl { float: left; } +@media only screen and (max-width:640px) { + .col3 { width:100%; max-width:100%; } + .hide-mobile { display:none!important; } +} + +.quiet { + color: #7f7f7f; + color: rgba(0,0,0,0.5); +} +.quiet a { opacity: 0.7; } + +.fraction { + font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; + font-size: 10px; + color: #555; + background: #E8E8E8; + padding: 4px 5px; + border-radius: 3px; + vertical-align: middle; +} + +div.path a:link, div.path a:visited { color: #333; } +table.coverage { + border-collapse: collapse; + margin: 10px 0 0 0; + padding: 0; +} + +table.coverage td { + margin: 0; + padding: 0; + vertical-align: top; +} +table.coverage td.line-count { + text-align: right; + padding: 0 5px 0 20px; +} +table.coverage td.line-coverage { + text-align: right; + padding-right: 10px; + min-width:20px; +} + +table.coverage td span.cline-any { + display: inline-block; + padding: 0 5px; + width: 100%; +} +.missing-if-branch { + display: inline-block; + margin-right: 5px; + border-radius: 3px; + position: relative; + padding: 0 4px; + background: #333; + color: yellow; +} + +.skip-if-branch { + display: none; + margin-right: 10px; + position: relative; + padding: 0 4px; + background: #ccc; + color: white; +} +.missing-if-branch .typ, .skip-if-branch .typ { + color: inherit !important; +} +.coverage-summary { + border-collapse: collapse; + width: 100%; +} +.coverage-summary tr { border-bottom: 1px solid #bbb; } +.keyline-all { border: 1px solid #ddd; } +.coverage-summary td, .coverage-summary th { padding: 10px; } +.coverage-summary tbody { border: 1px solid #bbb; } +.coverage-summary td { border-right: 1px solid #bbb; } +.coverage-summary td:last-child { border-right: none; } +.coverage-summary th { + text-align: left; + font-weight: normal; + white-space: nowrap; +} +.coverage-summary th.file { border-right: none !important; } +.coverage-summary th.pct { } +.coverage-summary th.pic, +.coverage-summary th.abs, +.coverage-summary td.pct, +.coverage-summary td.abs { text-align: right; } +.coverage-summary td.file { white-space: nowrap; } +.coverage-summary td.pic { min-width: 120px !important; } +.coverage-summary tfoot td { } + +.coverage-summary .sorter { + height: 10px; + width: 7px; + display: inline-block; + margin-left: 0.5em; + background: url(sort-arrow-sprite.png) no-repeat scroll 0 0 transparent; +} +.coverage-summary .sorted .sorter { + background-position: 0 -20px; +} +.coverage-summary .sorted-desc .sorter { + background-position: 0 -10px; +} +.status-line { height: 10px; } +/* yellow */ +.cbranch-no { background: yellow !important; color: #111; } +/* dark red */ +.red.solid, .status-line.low, .low .cover-fill { background:#C21F39 } +.low .chart { border:1px solid #C21F39 } +.highlighted, +.highlighted .cstat-no, .highlighted .fstat-no, .highlighted .cbranch-no{ + background: #C21F39 !important; +} +/* medium red */ +.cstat-no, .fstat-no, .cbranch-no, .cbranch-no { background:#F6C6CE } +/* light red */ +.low, .cline-no { background:#FCE1E5 } +/* light green */ +.high, .cline-yes { background:rgb(230,245,208) } +/* medium green */ +.cstat-yes { background:rgb(161,215,106) } +/* dark green */ +.status-line.high, .high .cover-fill { background:rgb(77,146,33) } +.high .chart { border:1px solid rgb(77,146,33) } +/* dark yellow (gold) */ +.status-line.medium, .medium .cover-fill { background: #f9cd0b; } +.medium .chart { border:1px solid #f9cd0b; } +/* light yellow */ +.medium { background: #fff4c2; } + +.cstat-skip { background: #ddd; color: #111; } +.fstat-skip { background: #ddd; color: #111 !important; } +.cbranch-skip { background: #ddd !important; color: #111; } + +span.cline-neutral { background: #eaeaea; } + +.coverage-summary td.empty { + opacity: .5; + padding-top: 4px; + padding-bottom: 4px; + line-height: 1; + color: #888; +} + +.cover-fill, .cover-empty { + display:inline-block; + height: 12px; +} +.chart { + line-height: 0; +} +.cover-empty { + background: white; +} +.cover-full { + border-right: none !important; +} +pre.prettyprint { + border: none !important; + padding: 0 !important; + margin: 0 !important; +} +.com { color: #999 !important; } +.ignore-none { color: #999; font-weight: normal; } + +.wrapper { + min-height: 100%; + height: auto !important; + height: 100%; + margin: 0 auto -48px; +} +.footer, .push { + height: 48px; +} diff --git a/services/delivery/coverage/block-navigation.js b/services/delivery/coverage/block-navigation.js new file mode 100644 index 00000000..cc121302 --- /dev/null +++ b/services/delivery/coverage/block-navigation.js @@ -0,0 +1,87 @@ +/* eslint-disable */ +var jumpToCode = (function init() { + // Classes of code we would like to highlight in the file view + var missingCoverageClasses = ['.cbranch-no', '.cstat-no', '.fstat-no']; + + // Elements to highlight in the file listing view + var fileListingElements = ['td.pct.low']; + + // We don't want to select elements that are direct descendants of another match + var notSelector = ':not(' + missingCoverageClasses.join('):not(') + ') > '; // becomes `:not(a):not(b) > ` + + // Selecter that finds elements on the page to which we can jump + var selector = + fileListingElements.join(', ') + + ', ' + + notSelector + + missingCoverageClasses.join(', ' + notSelector); // becomes `:not(a):not(b) > a, :not(a):not(b) > b` + + // The NodeList of matching elements + var missingCoverageElements = document.querySelectorAll(selector); + + var currentIndex; + + function toggleClass(index) { + missingCoverageElements + .item(currentIndex) + .classList.remove('highlighted'); + missingCoverageElements.item(index).classList.add('highlighted'); + } + + function makeCurrent(index) { + toggleClass(index); + currentIndex = index; + missingCoverageElements.item(index).scrollIntoView({ + behavior: 'smooth', + block: 'center', + inline: 'center' + }); + } + + function goToPrevious() { + var nextIndex = 0; + if (typeof currentIndex !== 'number' || currentIndex === 0) { + nextIndex = missingCoverageElements.length - 1; + } else if (missingCoverageElements.length > 1) { + nextIndex = currentIndex - 1; + } + + makeCurrent(nextIndex); + } + + function goToNext() { + var nextIndex = 0; + + if ( + typeof currentIndex === 'number' && + currentIndex < missingCoverageElements.length - 1 + ) { + nextIndex = currentIndex + 1; + } + + makeCurrent(nextIndex); + } + + return function jump(event) { + if ( + document.getElementById('fileSearch') === document.activeElement && + document.activeElement != null + ) { + // if we're currently focused on the search input, we don't want to navigate + return; + } + + switch (event.which) { + case 78: // n + case 74: // j + goToNext(); + break; + case 66: // b + case 75: // k + case 80: // p + goToPrevious(); + break; + } + }; +})(); +window.addEventListener('keydown', jumpToCode); diff --git a/services/delivery/coverage/clover.xml b/services/delivery/coverage/clover.xml new file mode 100644 index 00000000..c1774655 --- /dev/null +++ b/services/delivery/coverage/clover.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/services/delivery/coverage/coverage-final.json b/services/delivery/coverage/coverage-final.json new file mode 100644 index 00000000..0967ef42 --- /dev/null +++ b/services/delivery/coverage/coverage-final.json @@ -0,0 +1 @@ +{} diff --git a/services/delivery/coverage/favicon.png b/services/delivery/coverage/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..c1525b811a167671e9de1fa78aab9f5c0b61cef7 GIT binary patch literal 445 zcmV;u0Yd(XP))rP{nL}Ln%S7`m{0DjX9TLF* zFCb$4Oi7vyLOydb!7n&^ItCzb-%BoB`=x@N2jll2Nj`kauio%aw_@fe&*}LqlFT43 z8doAAe))z_%=P%v^@JHp3Hjhj^6*Kr_h|g_Gr?ZAa&y>wxHE99Gk>A)2MplWz2xdG zy8VD2J|Uf#EAw*bo5O*PO_}X2Tob{%bUoO2G~T`@%S6qPyc}VkhV}UifBuRk>%5v( z)x7B{I~z*k<7dv#5tC+m{km(D087J4O%+<<;K|qwefb6@GSX45wCK}Sn*> + + + + Code coverage report for All files + + + + + + + + + +
+
+

All files

+
+ +
+ Unknown% + Statements + 0/0 +
+ + +
+ Unknown% + Branches + 0/0 +
+ + +
+ Unknown% + Functions + 0/0 +
+ + +
+ Unknown% + Lines + 0/0 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/services/delivery/coverage/prettify.css b/services/delivery/coverage/prettify.css new file mode 100644 index 00000000..b317a7cd --- /dev/null +++ b/services/delivery/coverage/prettify.css @@ -0,0 +1 @@ +.pln{color:#000}@media screen{.str{color:#080}.kwd{color:#008}.com{color:#800}.typ{color:#606}.lit{color:#066}.pun,.opn,.clo{color:#660}.tag{color:#008}.atn{color:#606}.atv{color:#080}.dec,.var{color:#606}.fun{color:red}}@media print,projection{.str{color:#060}.kwd{color:#006;font-weight:bold}.com{color:#600;font-style:italic}.typ{color:#404;font-weight:bold}.lit{color:#044}.pun,.opn,.clo{color:#440}.tag{color:#006;font-weight:bold}.atn{color:#404}.atv{color:#060}}pre.prettyprint{padding:2px;border:1px solid #888}ol.linenums{margin-top:0;margin-bottom:0}li.L0,li.L1,li.L2,li.L3,li.L5,li.L6,li.L7,li.L8{list-style-type:none}li.L1,li.L3,li.L5,li.L7,li.L9{background:#eee} diff --git a/services/delivery/coverage/prettify.js b/services/delivery/coverage/prettify.js new file mode 100644 index 00000000..b3225238 --- /dev/null +++ b/services/delivery/coverage/prettify.js @@ -0,0 +1,2 @@ +/* eslint-disable */ +window.PR_SHOULD_USE_CONTINUATION=true;(function(){var h=["break,continue,do,else,for,if,return,while"];var u=[h,"auto,case,char,const,default,double,enum,extern,float,goto,int,long,register,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile"];var p=[u,"catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof"];var l=[p,"alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,dynamic_cast,explicit,export,friend,inline,late_check,mutable,namespace,nullptr,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where"];var x=[p,"abstract,boolean,byte,extends,final,finally,implements,import,instanceof,null,native,package,strictfp,super,synchronized,throws,transient"];var R=[x,"as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,interface,internal,into,is,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var"];var r="all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,true,try,unless,until,when,while,yes";var w=[p,"debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN"];var s="caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END";var I=[h,"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None"];var f=[h,"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END"];var H=[h,"case,done,elif,esac,eval,fi,function,in,local,set,then,until"];var A=[l,R,w,s+I,f,H];var e=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\d*)/;var C="str";var z="kwd";var j="com";var O="typ";var G="lit";var L="pun";var F="pln";var m="tag";var E="dec";var J="src";var P="atn";var n="atv";var N="nocode";var M="(?:^^\\.?|[+-]|\\!|\\!=|\\!==|\\#|\\%|\\%=|&|&&|&&=|&=|\\(|\\*|\\*=|\\+=|\\,|\\-=|\\->|\\/|\\/=|:|::|\\;|<|<<|<<=|<=|=|==|===|>|>=|>>|>>=|>>>|>>>=|\\?|\\@|\\[|\\^|\\^=|\\^\\^|\\^\\^=|\\{|\\||\\|=|\\|\\||\\|\\|=|\\~|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\\s*";function k(Z){var ad=0;var S=false;var ac=false;for(var V=0,U=Z.length;V122)){if(!(al<65||ag>90)){af.push([Math.max(65,ag)|32,Math.min(al,90)|32])}if(!(al<97||ag>122)){af.push([Math.max(97,ag)&~32,Math.min(al,122)&~32])}}}}af.sort(function(av,au){return(av[0]-au[0])||(au[1]-av[1])});var ai=[];var ap=[NaN,NaN];for(var ar=0;arat[0]){if(at[1]+1>at[0]){an.push("-")}an.push(T(at[1]))}}an.push("]");return an.join("")}function W(al){var aj=al.source.match(new RegExp("(?:\\[(?:[^\\x5C\\x5D]|\\\\[\\s\\S])*\\]|\\\\u[A-Fa-f0-9]{4}|\\\\x[A-Fa-f0-9]{2}|\\\\[0-9]+|\\\\[^ux0-9]|\\(\\?[:!=]|[\\(\\)\\^]|[^\\x5B\\x5C\\(\\)\\^]+)","g"));var ah=aj.length;var an=[];for(var ak=0,am=0;ak=2&&ai==="["){aj[ak]=X(ag)}else{if(ai!=="\\"){aj[ak]=ag.replace(/[a-zA-Z]/g,function(ao){var ap=ao.charCodeAt(0);return"["+String.fromCharCode(ap&~32,ap|32)+"]"})}}}}return aj.join("")}var aa=[];for(var V=0,U=Z.length;V=0;){S[ac.charAt(ae)]=Y}}var af=Y[1];var aa=""+af;if(!ag.hasOwnProperty(aa)){ah.push(af);ag[aa]=null}}ah.push(/[\0-\uffff]/);V=k(ah)})();var X=T.length;var W=function(ah){var Z=ah.sourceCode,Y=ah.basePos;var ad=[Y,F];var af=0;var an=Z.match(V)||[];var aj={};for(var ae=0,aq=an.length;ae=5&&"lang-"===ap.substring(0,5);if(am&&!(ai&&typeof ai[1]==="string")){am=false;ap=J}if(!am){aj[ag]=ap}}var ab=af;af+=ag.length;if(!am){ad.push(Y+ab,ap)}else{var al=ai[1];var ak=ag.indexOf(al);var ac=ak+al.length;if(ai[2]){ac=ag.length-ai[2].length;ak=ac-al.length}var ar=ap.substring(5);B(Y+ab,ag.substring(0,ak),W,ad);B(Y+ab+ak,al,q(ar,al),ad);B(Y+ab+ac,ag.substring(ac),W,ad)}}ah.decorations=ad};return W}function i(T){var W=[],S=[];if(T.tripleQuotedStrings){W.push([C,/^(?:\'\'\'(?:[^\'\\]|\\[\s\S]|\'{1,2}(?=[^\']))*(?:\'\'\'|$)|\"\"\"(?:[^\"\\]|\\[\s\S]|\"{1,2}(?=[^\"]))*(?:\"\"\"|$)|\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$))/,null,"'\""])}else{if(T.multiLineStrings){W.push([C,/^(?:\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$)|\`(?:[^\\\`]|\\[\s\S])*(?:\`|$))/,null,"'\"`"])}else{W.push([C,/^(?:\'(?:[^\\\'\r\n]|\\.)*(?:\'|$)|\"(?:[^\\\"\r\n]|\\.)*(?:\"|$))/,null,"\"'"])}}if(T.verbatimStrings){S.push([C,/^@\"(?:[^\"]|\"\")*(?:\"|$)/,null])}var Y=T.hashComments;if(Y){if(T.cStyleComments){if(Y>1){W.push([j,/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,null,"#"])}else{W.push([j,/^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\b|[^\r\n]*)/,null,"#"])}S.push([C,/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h|[a-z]\w*)>/,null])}else{W.push([j,/^#[^\r\n]*/,null,"#"])}}if(T.cStyleComments){S.push([j,/^\/\/[^\r\n]*/,null]);S.push([j,/^\/\*[\s\S]*?(?:\*\/|$)/,null])}if(T.regexLiterals){var X=("/(?=[^/*])(?:[^/\\x5B\\x5C]|\\x5C[\\s\\S]|\\x5B(?:[^\\x5C\\x5D]|\\x5C[\\s\\S])*(?:\\x5D|$))+/");S.push(["lang-regex",new RegExp("^"+M+"("+X+")")])}var V=T.types;if(V){S.push([O,V])}var U=(""+T.keywords).replace(/^ | $/g,"");if(U.length){S.push([z,new RegExp("^(?:"+U.replace(/[\s,]+/g,"|")+")\\b"),null])}W.push([F,/^\s+/,null," \r\n\t\xA0"]);S.push([G,/^@[a-z_$][a-z_$@0-9]*/i,null],[O,/^(?:[@_]?[A-Z]+[a-z][A-Za-z_$@0-9]*|\w+_t\b)/,null],[F,/^[a-z_$][a-z_$@0-9]*/i,null],[G,new RegExp("^(?:0x[a-f0-9]+|(?:\\d(?:_\\d+)*\\d*(?:\\.\\d*)?|\\.\\d\\+)(?:e[+\\-]?\\d+)?)[a-z]*","i"),null,"0123456789"],[F,/^\\[\s\S]?/,null],[L,/^.[^\s\w\.$@\'\"\`\/\#\\]*/,null]);return g(W,S)}var K=i({keywords:A,hashComments:true,cStyleComments:true,multiLineStrings:true,regexLiterals:true});function Q(V,ag){var U=/(?:^|\s)nocode(?:\s|$)/;var ab=/\r\n?|\n/;var ac=V.ownerDocument;var S;if(V.currentStyle){S=V.currentStyle.whiteSpace}else{if(window.getComputedStyle){S=ac.defaultView.getComputedStyle(V,null).getPropertyValue("white-space")}}var Z=S&&"pre"===S.substring(0,3);var af=ac.createElement("LI");while(V.firstChild){af.appendChild(V.firstChild)}var W=[af];function ae(al){switch(al.nodeType){case 1:if(U.test(al.className)){break}if("BR"===al.nodeName){ad(al);if(al.parentNode){al.parentNode.removeChild(al)}}else{for(var an=al.firstChild;an;an=an.nextSibling){ae(an)}}break;case 3:case 4:if(Z){var am=al.nodeValue;var aj=am.match(ab);if(aj){var ai=am.substring(0,aj.index);al.nodeValue=ai;var ah=am.substring(aj.index+aj[0].length);if(ah){var ak=al.parentNode;ak.insertBefore(ac.createTextNode(ah),al.nextSibling)}ad(al);if(!ai){al.parentNode.removeChild(al)}}}break}}function ad(ak){while(!ak.nextSibling){ak=ak.parentNode;if(!ak){return}}function ai(al,ar){var aq=ar?al.cloneNode(false):al;var ao=al.parentNode;if(ao){var ap=ai(ao,1);var an=al.nextSibling;ap.appendChild(aq);for(var am=an;am;am=an){an=am.nextSibling;ap.appendChild(am)}}return aq}var ah=ai(ak.nextSibling,0);for(var aj;(aj=ah.parentNode)&&aj.nodeType===1;){ah=aj}W.push(ah)}for(var Y=0;Y=S){ah+=2}if(V>=ap){Z+=2}}}var t={};function c(U,V){for(var S=V.length;--S>=0;){var T=V[S];if(!t.hasOwnProperty(T)){t[T]=U}else{if(window.console){console.warn("cannot override language handler %s",T)}}}}function q(T,S){if(!(T&&t.hasOwnProperty(T))){T=/^\s*]*(?:>|$)/],[j,/^<\!--[\s\S]*?(?:-\->|$)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],[L,/^(?:<[%?]|[%?]>)/],["lang-",/^]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-js",/^]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^]*>([\s\S]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i]]),["default-markup","htm","html","mxml","xhtml","xml","xsl"]);c(g([[F,/^[\s]+/,null," \t\r\n"],[n,/^(?:\"[^\"]*\"?|\'[^\']*\'?)/,null,"\"'"]],[[m,/^^<\/?[a-z](?:[\w.:-]*\w)?|\/?>$/i],[P,/^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],["lang-uq.val",/^=\s*([^>\'\"\s]*(?:[^>\'\"\s\/]|\/(?=\s)))/],[L,/^[=<>\/]+/],["lang-js",/^on\w+\s*=\s*\"([^\"]+)\"/i],["lang-js",/^on\w+\s*=\s*\'([^\']+)\'/i],["lang-js",/^on\w+\s*=\s*([^\"\'>\s]+)/i],["lang-css",/^style\s*=\s*\"([^\"]+)\"/i],["lang-css",/^style\s*=\s*\'([^\']+)\'/i],["lang-css",/^style\s*=\s*([^\"\'>\s]+)/i]]),["in.tag"]);c(g([],[[n,/^[\s\S]+/]]),["uq.val"]);c(i({keywords:l,hashComments:true,cStyleComments:true,types:e}),["c","cc","cpp","cxx","cyc","m"]);c(i({keywords:"null,true,false"}),["json"]);c(i({keywords:R,hashComments:true,cStyleComments:true,verbatimStrings:true,types:e}),["cs"]);c(i({keywords:x,cStyleComments:true}),["java"]);c(i({keywords:H,hashComments:true,multiLineStrings:true}),["bsh","csh","sh"]);c(i({keywords:I,hashComments:true,multiLineStrings:true,tripleQuotedStrings:true}),["cv","py"]);c(i({keywords:s,hashComments:true,multiLineStrings:true,regexLiterals:true}),["perl","pl","pm"]);c(i({keywords:f,hashComments:true,multiLineStrings:true,regexLiterals:true}),["rb"]);c(i({keywords:w,cStyleComments:true,regexLiterals:true}),["js"]);c(i({keywords:r,hashComments:3,cStyleComments:true,multilineStrings:true,tripleQuotedStrings:true,regexLiterals:true}),["coffee"]);c(g([],[[C,/^[\s\S]+/]]),["regex"]);function d(V){var U=V.langExtension;try{var S=a(V.sourceNode);var T=S.sourceCode;V.sourceCode=T;V.spans=S.spans;V.basePos=0;q(U,T)(V);D(V)}catch(W){if("console" in window){console.log(W&&W.stack?W.stack:W)}}}function y(W,V,U){var S=document.createElement("PRE");S.innerHTML=W;if(U){Q(S,U)}var T={langExtension:V,numberLines:U,sourceNode:S};d(T);return S.innerHTML}function b(ad){function Y(af){return document.getElementsByTagName(af)}var ac=[Y("pre"),Y("code"),Y("xmp")];var T=[];for(var aa=0;aa=0){var ah=ai.match(ab);var am;if(!ah&&(am=o(aj))&&"CODE"===am.tagName){ah=am.className.match(ab)}if(ah){ah=ah[1]}var al=false;for(var ak=aj.parentNode;ak;ak=ak.parentNode){if((ak.tagName==="pre"||ak.tagName==="code"||ak.tagName==="xmp")&&ak.className&&ak.className.indexOf("prettyprint")>=0){al=true;break}}if(!al){var af=aj.className.match(/\blinenums\b(?::(\d+))?/);af=af?af[1]&&af[1].length?+af[1]:true:false;if(af){Q(aj,af)}S={langExtension:ah,sourceNode:aj,numberLines:af};d(S)}}}if(X]*(?:>|$)/],[PR.PR_COMMENT,/^<\!--[\s\S]*?(?:-\->|$)/],[PR.PR_PUNCTUATION,/^(?:<[%?]|[%?]>)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],["lang-",/^]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-handlebars",/^]*type\s*=\s*['"]?text\/x-handlebars-template['"]?\b[^>]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-js",/^]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^]*>([\s\S]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i],[PR.PR_DECLARATION,/^{{[#^>/]?\s*[\w.][^}]*}}/],[PR.PR_DECLARATION,/^{{&?\s*[\w.][^}]*}}/],[PR.PR_DECLARATION,/^{{{>?\s*[\w.][^}]*}}}/],[PR.PR_COMMENT,/^{{![^}]*}}/]]),["handlebars","hbs"]);PR.registerLangHandler(PR.createSimpleLexer([[PR.PR_PLAIN,/^[ \t\r\n\f]+/,null," \t\r\n\f"]],[[PR.PR_STRING,/^\"(?:[^\n\r\f\\\"]|\\(?:\r\n?|\n|\f)|\\[\s\S])*\"/,null],[PR.PR_STRING,/^\'(?:[^\n\r\f\\\']|\\(?:\r\n?|\n|\f)|\\[\s\S])*\'/,null],["lang-css-str",/^url\(([^\)\"\']*)\)/i],[PR.PR_KEYWORD,/^(?:url|rgb|\!important|@import|@page|@media|@charset|inherit)(?=[^\-\w]|$)/i,null],["lang-css-kw",/^(-?(?:[_a-z]|(?:\\[0-9a-f]+ ?))(?:[_a-z0-9\-]|\\(?:\\[0-9a-f]+ ?))*)\s*:/i],[PR.PR_COMMENT,/^\/\*[^*]*\*+(?:[^\/*][^*]*\*+)*\//],[PR.PR_COMMENT,/^(?:)/],[PR.PR_LITERAL,/^(?:\d+|\d*\.\d+)(?:%|[a-z]+)?/i],[PR.PR_LITERAL,/^#(?:[0-9a-f]{3}){1,2}/i],[PR.PR_PLAIN,/^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i],[PR.PR_PUNCTUATION,/^[^\s\w\'\"]+/]]),["css"]);PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_KEYWORD,/^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i]]),["css-kw"]);PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_STRING,/^[^\)\"\']+/]]),["css-str"]); diff --git a/services/delivery/coverage/sort-arrow-sprite.png b/services/delivery/coverage/sort-arrow-sprite.png new file mode 100644 index 0000000000000000000000000000000000000000..6ed68316eb3f65dec9063332d2f69bf3093bbfab GIT binary patch literal 138 zcmeAS@N?(olHy`uVBq!ia0vp^>_9Bd!3HEZxJ@+%Qh}Z>jv*C{$p!i!8j}?a+@3A= zIAGwzjijN=FBi!|L1t?LM;Q;gkwn>2cAy-KV{dn nf0J1DIvEHQu*n~6U}x}qyky7vi4|9XhBJ7&`njxgN@xNA8m%nc literal 0 HcmV?d00001 diff --git a/services/delivery/coverage/sorter.js b/services/delivery/coverage/sorter.js new file mode 100644 index 00000000..2bb296a8 --- /dev/null +++ b/services/delivery/coverage/sorter.js @@ -0,0 +1,196 @@ +/* eslint-disable */ +var addSorting = (function() { + 'use strict'; + var cols, + currentSort = { + index: 0, + desc: false + }; + + // returns the summary table element + function getTable() { + return document.querySelector('.coverage-summary'); + } + // returns the thead element of the summary table + function getTableHeader() { + return getTable().querySelector('thead tr'); + } + // returns the tbody element of the summary table + function getTableBody() { + return getTable().querySelector('tbody'); + } + // returns the th element for nth column + function getNthColumn(n) { + return getTableHeader().querySelectorAll('th')[n]; + } + + function onFilterInput() { + const searchValue = document.getElementById('fileSearch').value; + const rows = document.getElementsByTagName('tbody')[0].children; + for (let i = 0; i < rows.length; i++) { + const row = rows[i]; + if ( + row.textContent + .toLowerCase() + .includes(searchValue.toLowerCase()) + ) { + row.style.display = ''; + } else { + row.style.display = 'none'; + } + } + } + + // loads the search box + function addSearchBox() { + var template = document.getElementById('filterTemplate'); + var templateClone = template.content.cloneNode(true); + templateClone.getElementById('fileSearch').oninput = onFilterInput; + template.parentElement.appendChild(templateClone); + } + + // loads all columns + function loadColumns() { + var colNodes = getTableHeader().querySelectorAll('th'), + colNode, + cols = [], + col, + i; + + for (i = 0; i < colNodes.length; i += 1) { + colNode = colNodes[i]; + col = { + key: colNode.getAttribute('data-col'), + sortable: !colNode.getAttribute('data-nosort'), + type: colNode.getAttribute('data-type') || 'string' + }; + cols.push(col); + if (col.sortable) { + col.defaultDescSort = col.type === 'number'; + colNode.innerHTML = + colNode.innerHTML + ''; + } + } + return cols; + } + // attaches a data attribute to every tr element with an object + // of data values keyed by column name + function loadRowData(tableRow) { + var tableCols = tableRow.querySelectorAll('td'), + colNode, + col, + data = {}, + i, + val; + for (i = 0; i < tableCols.length; i += 1) { + colNode = tableCols[i]; + col = cols[i]; + val = colNode.getAttribute('data-value'); + if (col.type === 'number') { + val = Number(val); + } + data[col.key] = val; + } + return data; + } + // loads all row data + function loadData() { + var rows = getTableBody().querySelectorAll('tr'), + i; + + for (i = 0; i < rows.length; i += 1) { + rows[i].data = loadRowData(rows[i]); + } + } + // sorts the table using the data for the ith column + function sortByIndex(index, desc) { + var key = cols[index].key, + sorter = function(a, b) { + a = a.data[key]; + b = b.data[key]; + return a < b ? -1 : a > b ? 1 : 0; + }, + finalSorter = sorter, + tableBody = document.querySelector('.coverage-summary tbody'), + rowNodes = tableBody.querySelectorAll('tr'), + rows = [], + i; + + if (desc) { + finalSorter = function(a, b) { + return -1 * sorter(a, b); + }; + } + + for (i = 0; i < rowNodes.length; i += 1) { + rows.push(rowNodes[i]); + tableBody.removeChild(rowNodes[i]); + } + + rows.sort(finalSorter); + + for (i = 0; i < rows.length; i += 1) { + tableBody.appendChild(rows[i]); + } + } + // removes sort indicators for current column being sorted + function removeSortIndicators() { + var col = getNthColumn(currentSort.index), + cls = col.className; + + cls = cls.replace(/ sorted$/, '').replace(/ sorted-desc$/, ''); + col.className = cls; + } + // adds sort indicators for current column being sorted + function addSortIndicators() { + getNthColumn(currentSort.index).className += currentSort.desc + ? ' sorted-desc' + : ' sorted'; + } + // adds event listeners for all sorter widgets + function enableUI() { + var i, + el, + ithSorter = function ithSorter(i) { + var col = cols[i]; + + return function() { + var desc = col.defaultDescSort; + + if (currentSort.index === i) { + desc = !currentSort.desc; + } + sortByIndex(i, desc); + removeSortIndicators(); + currentSort.index = i; + currentSort.desc = desc; + addSortIndicators(); + }; + }; + for (i = 0; i < cols.length; i += 1) { + if (cols[i].sortable) { + // add the click event handler on the th so users + // dont have to click on those tiny arrows + el = getNthColumn(i).querySelector('.sorter').parentElement; + if (el.addEventListener) { + el.addEventListener('click', ithSorter(i)); + } else { + el.attachEvent('onclick', ithSorter(i)); + } + } + } + } + // adds sorting functionality to the UI + return function() { + if (!getTable()) { + return; + } + cols = loadColumns(); + loadData(); + addSearchBox(); + addSortIndicators(); + enableUI(); + }; +})(); + +window.addEventListener('load', addSorting); diff --git a/services/delivery/package.json b/services/delivery/package.json index 3eb5a908..43cb5383 100644 --- a/services/delivery/package.json +++ b/services/delivery/package.json @@ -1,9 +1,16 @@ { - "name": "typescript-grpc", + "name": "@goodfood/delivery", + "bin": "dist/index.js", "scripts": { - "start": "ts-node ./src/server.ts", + "start": "node dist/index.js", "dev": "nodemon --watch 'src/**/*.ts' --exec 'ts-node' src/server.ts", + "build": "esbuild src/server.ts --bundle --platform=node --target=node18 --outfile=dist/index.js", + "test": "vitest", + "coverage": "vitest --coverage", + "pkg": "pkg .", + "prisma:generate": "prisma generate", "seed": "ts-node prisma/seed.ts", + "postinstall": "npm run prisma:generate", "client:delivery-create": "ts-node ./src/client/delivery/create.ts", "client:delivery-get": "ts-node ./src/client/delivery/get.ts", "client:delivery-update": "ts-node ./src/client/delivery/update.ts", @@ -20,13 +27,31 @@ }, "devDependencies": { "@types/node": "18.15.9", + "@vitest/coverage-c8": "^0.29.8", + "esbuild": "^0.17.14", "nodemon": "^2.0.22", + "pkg": "^5.8.1", "prisma": "4.11.0", "ts-node": "10.9.1", "tsconfig-paths": "^4.1.2", - "typescript": "5.0.2" + "typescript": "5.0.2", + "vite-tsconfig-paths": "^4.0.7", + "vitest": "^0.29.8" }, "prisma": { "seed": "ts-node prisma/seed.ts" + }, + "pkg": { + "scripts": "./src/dist/index.js", + "assets": [ + "./prisma/**/*", + "../proto/**/*" + ], + "targets": [ + "node18-macos-arm64", + "node18-linux-x64", + "node18-linux-arm64" + ], + "outputPath": "bin/" } } diff --git a/services/delivery/pnpm-lock.yaml b/services/delivery/pnpm-lock.yaml index 38da5b6e..87cb70fa 100644 --- a/services/delivery/pnpm-lock.yaml +++ b/services/delivery/pnpm-lock.yaml @@ -1,43 +1,305 @@ -lockfileVersion: 5.4 - -specifiers: - '@grpc/grpc-js': ^1.8.13 - '@grpc/proto-loader': 0.7.6 - '@prisma/client': 4.11.0 - '@types/node': 18.15.9 - dotenv: ^16.0.3 - nodemon: ^2.0.22 - prisma: 4.11.0 - protobufjs: 7.2.2 - ts-node: 10.9.1 - tsconfig-paths: ^4.1.2 - typescript: 5.0.2 +lockfileVersion: '6.0' dependencies: - '@grpc/grpc-js': 1.8.13 - '@grpc/proto-loader': 0.7.6 - '@prisma/client': 4.11.0_prisma@4.11.0 - dotenv: 16.0.3 - protobufjs: 7.2.2 + '@grpc/grpc-js': + specifier: ^1.8.13 + version: 1.8.13 + '@grpc/proto-loader': + specifier: 0.7.6 + version: 0.7.6 + '@prisma/client': + specifier: 4.11.0 + version: 4.11.0(prisma@4.11.0) + dotenv: + specifier: ^16.0.3 + version: 16.0.3 + protobufjs: + specifier: 7.2.2 + version: 7.2.2 devDependencies: - '@types/node': 18.15.9 - nodemon: 2.0.22 - prisma: 4.11.0 - ts-node: 10.9.1_3flabivgbrnlfzsgzfhinuvrvy - tsconfig-paths: 4.1.2 - typescript: 5.0.2 + '@types/node': + specifier: 18.15.9 + version: 18.15.9 + '@vitest/coverage-c8': + specifier: ^0.29.8 + version: 0.29.8(vitest@0.29.8) + esbuild: + specifier: ^0.17.14 + version: 0.17.14 + nodemon: + specifier: ^2.0.22 + version: 2.0.22 + pkg: + specifier: ^5.8.1 + version: 5.8.1 + prisma: + specifier: 4.11.0 + version: 4.11.0 + ts-node: + specifier: 10.9.1 + version: 10.9.1(@types/node@18.15.9)(typescript@5.0.2) + tsconfig-paths: + specifier: ^4.1.2 + version: 4.1.2 + typescript: + specifier: 5.0.2 + version: 5.0.2 + vite-tsconfig-paths: + specifier: ^4.0.7 + version: 4.0.7(typescript@5.0.2) + vitest: + specifier: ^0.29.8 + version: 0.29.8 packages: - /@cspotcode/source-map-support/0.8.1: + /@babel/generator@7.18.2: + resolution: {integrity: sha512-W1lG5vUwFvfMd8HVXqdfbuG7RuaSrTCCD8cl8fP8wOivdbtbIg2Db3IWUcgvfxKbbn6ZBGYRW/Zk1MIwK49mgw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.19.0 + '@jridgewell/gen-mapping': 0.3.2 + jsesc: 2.5.2 + dev: true + + /@babel/helper-string-parser@7.19.4: + resolution: {integrity: sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helper-validator-identifier@7.19.1: + resolution: {integrity: sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/parser@7.18.4: + resolution: {integrity: sha512-FDge0dFazETFcxGw/EXzOkN8uJp0PC7Qbm+Pe9T+av2zlBpOgunFHkQPPn+eRuClU73JF+98D531UgayY89tow==} + engines: {node: '>=6.0.0'} + hasBin: true + dependencies: + '@babel/types': 7.19.0 + dev: true + + /@babel/types@7.19.0: + resolution: {integrity: sha512-YuGopBq3ke25BVSiS6fgF49Ul9gH1x70Bcr6bqRLjWCkcX8Hre1/5+z+IiWOIerRMSSEfGZVB9z9kyq7wVs9YA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-string-parser': 7.19.4 + '@babel/helper-validator-identifier': 7.19.1 + 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 - /@grpc/grpc-js/1.8.13: + /@esbuild/android-arm64@0.17.14: + resolution: {integrity: sha512-eLOpPO1RvtsP71afiFTvS7tVFShJBCT0txiv/xjFBo5a7R7Gjw7X0IgIaFoLKhqXYAXhahoXm7qAmRXhY4guJg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-arm@0.17.14: + resolution: {integrity: sha512-0CnlwnjDU8cks0yJLXfkaU/uoLyRf9VZJs4p1PskBr2AlAHeEsFEwJEo0of/Z3g+ilw5mpyDwThlxzNEIxOE4g==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-x64@0.17.14: + resolution: {integrity: sha512-nrfQYWBfLGfSGLvRVlt6xi63B5IbfHm3tZCdu/82zuFPQ7zez4XjmRtF/wIRYbJQ/DsZrxJdEvYFE67avYXyng==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-arm64@0.17.14: + resolution: {integrity: sha512-eoSjEuDsU1ROwgBH/c+fZzuSyJUVXQTOIN9xuLs9dE/9HbV/A5IqdXHU1p2OfIMwBwOYJ9SFVGGldxeRCUJFyw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-x64@0.17.14: + resolution: {integrity: sha512-zN0U8RWfrDttdFNkHqFYZtOH8hdi22z0pFm0aIJPsNC4QQZv7je8DWCX5iA4Zx6tRhS0CCc0XC2m7wKsbWEo5g==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-arm64@0.17.14: + resolution: {integrity: sha512-z0VcD4ibeZWVQCW1O7szaLxGsx54gcCnajEJMdYoYjLiq4g1jrP2lMq6pk71dbS5+7op/L2Aod+erw+EUr28/A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-x64@0.17.14: + resolution: {integrity: sha512-hd9mPcxfTgJlolrPlcXkQk9BMwNBvNBsVaUe5eNUqXut6weDQH8whcNaKNF2RO8NbpT6GY8rHOK2A9y++s+ehw==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm64@0.17.14: + resolution: {integrity: sha512-FhAMNYOq3Iblcj9i+K0l1Fp/MHt+zBeRu/Qkf0LtrcFu3T45jcwB6A1iMsemQ42vR3GBhjNZJZTaCe3VFPbn9g==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm@0.17.14: + resolution: {integrity: sha512-BNTl+wSJ1omsH8s3TkQmIIIQHwvwJrU9u1ggb9XU2KTVM4TmthRIVyxSp2qxROJHhZuW/r8fht46/QE8hU8Qvg==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ia32@0.17.14: + resolution: {integrity: sha512-91OK/lQ5y2v7AsmnFT+0EyxdPTNhov3y2CWMdizyMfxSxRqHazXdzgBKtlmkU2KYIc+9ZK3Vwp2KyXogEATYxQ==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-loong64@0.17.14: + resolution: {integrity: sha512-vp15H+5NR6hubNgMluqqKza85HcGJgq7t6rMH7O3Y6ApiOWPkvW2AJfNojUQimfTp6OUrACUXfR4hmpcENXoMQ==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-mips64el@0.17.14: + resolution: {integrity: sha512-90TOdFV7N+fgi6c2+GO9ochEkmm9kBAKnuD5e08GQMgMINOdOFHuYLPQ91RYVrnWwQ5683sJKuLi9l4SsbJ7Hg==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ppc64@0.17.14: + resolution: {integrity: sha512-NnBGeoqKkTugpBOBZZoktQQ1Yqb7aHKmHxsw43NddPB2YWLAlpb7THZIzsRsTr0Xw3nqiPxbA1H31ZMOG+VVPQ==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-riscv64@0.17.14: + resolution: {integrity: sha512-0qdlKScLXA8MGVy21JUKvMzCYWovctuP8KKqhtE5A6IVPq4onxXhSuhwDd2g5sRCzNDlDjitc5sX31BzDoL5Fw==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-s390x@0.17.14: + resolution: {integrity: sha512-Hdm2Jo1yaaOro4v3+6/zJk6ygCqIZuSDJHdHaf8nVH/tfOuoEX5Riv03Ka15LmQBYJObUTNS1UdyoMk0WUn9Ww==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-x64@0.17.14: + resolution: {integrity: sha512-8KHF17OstlK4DuzeF/KmSgzrTWQrkWj5boluiiq7kvJCiQVzUrmSkaBvcLB2UgHpKENO2i6BthPkmUhNDaJsVw==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/netbsd-x64@0.17.14: + resolution: {integrity: sha512-nVwpqvb3yyXztxIT2+VsxJhB5GCgzPdk1n0HHSnchRAcxqKO6ghXwHhJnr0j/B+5FSyEqSxF4q03rbA2fKXtUQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/openbsd-x64@0.17.14: + resolution: {integrity: sha512-1RZ7uQQ9zcy/GSAJL1xPdN7NDdOOtNEGiJalg/MOzeakZeTrgH/DoCkbq7TaPDiPhWqnDF+4bnydxRqQD7il6g==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/sunos-x64@0.17.14: + resolution: {integrity: sha512-nqMjDsFwv7vp7msrwWRysnM38Sd44PKmW8EzV01YzDBTcTWUpczQg6mGao9VLicXSgW/iookNK6AxeogNVNDZA==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-arm64@0.17.14: + resolution: {integrity: sha512-xrD0mccTKRBBIotrITV7WVQAwNJ5+1va6L0H9zN92v2yEdjfAN7864cUaZwJS7JPEs53bDTzKFbfqVlG2HhyKQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-ia32@0.17.14: + resolution: {integrity: sha512-nXpkz9bbJrLLyUTYtRotSS3t5b+FOuljg8LgLdINWFs3FfqZMtbnBCZFUmBzQPyxqU87F8Av+3Nco/M3hEcu1w==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-x64@0.17.14: + resolution: {integrity: sha512-gPQmsi2DKTaEgG14hc3CHXHp62k8g6qr0Pas+I4lUxRMugGSATh/Bi8Dgusoz9IQ0IfdrvLpco6kujEIBoaogA==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@grpc/grpc-js@1.8.13: resolution: {integrity: sha512-iY3jsdfbc0ARoCLFvbvUB8optgyb0r1XLPb142u+QtgBcKJYkCIFt3Fd/881KqjLYWjsBJF57N3b8Eop9NDfUA==} engines: {node: ^8.13.0 || >=10.10.0} dependencies: @@ -45,7 +307,7 @@ packages: '@types/node': 18.15.9 dev: false - /@grpc/proto-loader/0.7.6: + /@grpc/proto-loader@0.7.6: resolution: {integrity: sha512-QyAXR8Hyh7uMDmveWxDSUcJr9NAWaZ2I6IXgAYvQmfflwouTM+rArE2eEaCtLlRqO81j7pRLCt81IefUei6Zbw==} engines: {node: '>=6'} hasBin: true @@ -57,23 +319,70 @@ packages: yargs: 16.2.0 dev: false - /@jridgewell/resolve-uri/3.1.0: + /@istanbuljs/schema@0.1.3: + resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} + engines: {node: '>=8'} + dev: true + + /@jridgewell/gen-mapping@0.3.2: + resolution: {integrity: sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/set-array': 1.1.2 + '@jridgewell/sourcemap-codec': 1.4.14 + '@jridgewell/trace-mapping': 0.3.9 + dev: true + + /@jridgewell/resolve-uri@3.1.0: resolution: {integrity: sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==} engines: {node: '>=6.0.0'} dev: true - /@jridgewell/sourcemap-codec/1.4.14: + /@jridgewell/set-array@1.1.2: + resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} + engines: {node: '>=6.0.0'} + dev: true + + /@jridgewell/sourcemap-codec@1.4.14: resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==} dev: true - /@jridgewell/trace-mapping/0.3.9: + /@jridgewell/trace-mapping@0.3.17: + resolution: {integrity: sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==} + dependencies: + '@jridgewell/resolve-uri': 3.1.0 + '@jridgewell/sourcemap-codec': 1.4.14 + dev: true + + /@jridgewell/trace-mapping@0.3.9: resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} dependencies: '@jridgewell/resolve-uri': 3.1.0 '@jridgewell/sourcemap-codec': 1.4.14 dev: true - /@prisma/client/4.11.0_prisma@4.11.0: + /@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: true + + /@nodelib/fs.stat@2.0.5: + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + dev: true + + /@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: true + + /@prisma/client@4.11.0(prisma@4.11.0): resolution: {integrity: sha512-0INHYkQIqgAjrt7NzhYpeDQi8x3Nvylc2uDngKyFDDj1tTRQ4uV1HnVmd1sQEraeVAN63SOK0dgCKQHlvjL0KA==} engines: {node: '>=14.17'} requiresBuild: true @@ -87,108 +396,186 @@ packages: prisma: 4.11.0 dev: false - /@prisma/engines-version/4.11.0-57.8fde8fef4033376662cad983758335009d522acb: + /@prisma/engines-version@4.11.0-57.8fde8fef4033376662cad983758335009d522acb: resolution: {integrity: sha512-3Vd8Qq06d5xD8Ch5WauWcUUrsVPdMC6Ge8ILji8RFfyhUpqon6qSyGM0apvr1O8n8qH8cKkEFqRPsYjuz5r83g==} dev: false - /@prisma/engines/4.11.0: + /@prisma/engines@4.11.0: resolution: {integrity: sha512-0AEBi2HXGV02cf6ASsBPhfsVIbVSDC9nbQed4iiY5eHttW9ZtMxHThuKZE1pnESbr8HRdgmFSa/Kn4OSNYuibg==} requiresBuild: true - /@protobufjs/aspromise/1.1.2: + /@protobufjs/aspromise@1.1.2: resolution: {integrity: sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==} dev: false - /@protobufjs/base64/1.1.2: + /@protobufjs/base64@1.1.2: resolution: {integrity: sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==} dev: false - /@protobufjs/codegen/2.0.4: + /@protobufjs/codegen@2.0.4: resolution: {integrity: sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==} dev: false - /@protobufjs/eventemitter/1.1.0: + /@protobufjs/eventemitter@1.1.0: resolution: {integrity: sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==} dev: false - /@protobufjs/fetch/1.1.0: + /@protobufjs/fetch@1.1.0: resolution: {integrity: sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==} dependencies: '@protobufjs/aspromise': 1.1.2 '@protobufjs/inquire': 1.1.0 dev: false - /@protobufjs/float/1.0.2: + /@protobufjs/float@1.0.2: resolution: {integrity: sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==} dev: false - /@protobufjs/inquire/1.1.0: + /@protobufjs/inquire@1.1.0: resolution: {integrity: sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==} dev: false - /@protobufjs/path/1.1.2: + /@protobufjs/path@1.1.2: resolution: {integrity: sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==} dev: false - /@protobufjs/pool/1.1.0: + /@protobufjs/pool@1.1.0: resolution: {integrity: sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==} dev: false - /@protobufjs/utf8/1.1.0: + /@protobufjs/utf8@1.1.0: resolution: {integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==} dev: false - /@tsconfig/node10/1.0.9: + /@tsconfig/node10@1.0.9: resolution: {integrity: sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==} dev: true - /@tsconfig/node12/1.0.11: + /@tsconfig/node12@1.0.11: resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} dev: true - /@tsconfig/node14/1.0.3: + /@tsconfig/node14@1.0.3: resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} dev: true - /@tsconfig/node16/1.0.3: + /@tsconfig/node16@1.0.3: resolution: {integrity: sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==} dev: true - /@types/long/4.0.2: + /@types/chai-subset@1.3.3: + resolution: {integrity: sha512-frBecisrNGz+F4T6bcc+NLeolfiojh5FxW2klu669+8BARtyQv2C/GkNW6FUodVe4BroGMP/wER/YDGc7rEllw==} + dependencies: + '@types/chai': 4.3.4 + dev: true + + /@types/chai@4.3.4: + resolution: {integrity: sha512-KnRanxnpfpjUTqTCXslZSEdLfXExwgNxYPdiO2WGUj8+HDjFi8R3k5RVKPeSCzLjCcshCAtVO2QBbVuAV4kTnw==} + dev: true + + /@types/istanbul-lib-coverage@2.0.4: + resolution: {integrity: sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==} + dev: true + + /@types/long@4.0.2: resolution: {integrity: sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==} dev: false - /@types/node/18.15.9: + /@types/node@18.15.9: resolution: {integrity: sha512-dUxhiNzBLr6IqlZXz6e/rN2YQXlFgOei/Dxy+e3cyXTJ4txSUbGT2/fmnD6zd/75jDMeW5bDee+YXxlFKHoV0A==} - /abbrev/1.1.1: + /@vitest/coverage-c8@0.29.8(vitest@0.29.8): + resolution: {integrity: sha512-y+sEMQMctWokjnSqm3FCQEYFkjLrYaznsxEZHxcx8z2aftpYg3A5tvI1S5himfdEFo7o+OeHzh40bPSWZHW4oQ==} + peerDependencies: + vitest: '>=0.29.0 <1' + dependencies: + c8: 7.13.0 + picocolors: 1.0.0 + std-env: 3.3.2 + vitest: 0.29.8 + dev: true + + /@vitest/expect@0.29.8: + resolution: {integrity: sha512-xlcVXn5I5oTq6NiZSY3ykyWixBxr5mG8HYtjvpgg6KaqHm0mvhX18xuwl5YGxIRNt/A5jidd7CWcNHrSvgaQqQ==} + dependencies: + '@vitest/spy': 0.29.8 + '@vitest/utils': 0.29.8 + chai: 4.3.7 + dev: true + + /@vitest/runner@0.29.8: + resolution: {integrity: sha512-FzdhnRDwEr/A3Oo1jtIk/B952BBvP32n1ObMEb23oEJNO+qO5cBet6M2XWIDQmA7BDKGKvmhUf2naXyp/2JEwQ==} + dependencies: + '@vitest/utils': 0.29.8 + p-limit: 4.0.0 + pathe: 1.1.0 + dev: true + + /@vitest/spy@0.29.8: + resolution: {integrity: sha512-VdjBe9w34vOMl5I5mYEzNX8inTxrZ+tYUVk9jxaZJmHFwmDFC/GV3KBFTA/JKswr3XHvZL+FE/yq5EVhb6pSAw==} + dependencies: + tinyspy: 1.1.1 + dev: true + + /@vitest/utils@0.29.8: + resolution: {integrity: sha512-qGzuf3vrTbnoY+RjjVVIBYfuWMjn3UMUqyQtdGNZ6ZIIyte7B37exj6LaVkrZiUTvzSadVvO/tJm8AEgbGCBPg==} + dependencies: + cli-truncate: 3.1.0 + diff: 5.1.0 + loupe: 2.3.6 + pretty-format: 27.5.1 + dev: true + + /abbrev@1.1.1: resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} dev: true - /acorn-walk/8.2.0: + /acorn-walk@8.2.0: resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} engines: {node: '>=0.4.0'} dev: true - /acorn/8.8.2: + /acorn@8.8.2: resolution: {integrity: sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==} engines: {node: '>=0.4.0'} hasBin: true dev: true - /ansi-regex/5.0.1: + /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 + dev: true + + /ansi-regex@5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} - dev: false - /ansi-styles/4.3.0: + /ansi-regex@6.0.1: + resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} + engines: {node: '>=12'} + dev: true + + /ansi-styles@4.3.0: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} engines: {node: '>=8'} dependencies: color-convert: 2.0.1 - dev: false - /anymatch/3.1.3: + /ansi-styles@5.2.0: + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} + engines: {node: '>=10'} + dev: true + + /ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + dev: true + + /anymatch@3.1.3: resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} engines: {node: '>= 8'} dependencies: @@ -196,34 +583,116 @@ packages: picomatch: 2.3.1 dev: true - /arg/4.1.3: + /arg@4.1.3: resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} dev: true - /balanced-match/1.0.2: + /array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + dev: true + + /assertion-error@1.1.0: + resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} + dev: true + + /at-least-node@1.0.0: + resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} + engines: {node: '>= 4.0.0'} + dev: true + + /balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} dev: true - /binary-extensions/2.2.0: + /base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + dev: true + + /binary-extensions@2.2.0: resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} engines: {node: '>=8'} dev: true - /brace-expansion/1.1.11: + /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: true + + /brace-expansion@1.1.11: resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} dependencies: balanced-match: 1.0.2 concat-map: 0.0.1 dev: true - /braces/3.0.2: + /braces@3.0.2: resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} engines: {node: '>=8'} dependencies: fill-range: 7.0.1 dev: true - /chokidar/3.5.3: + /buffer@5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + dev: true + + /c8@7.13.0: + resolution: {integrity: sha512-/NL4hQTv1gBL6J6ei80zu3IiTrmePDKXKXOTLpHvcIWZTVYQlDhVWjjWvkhICylE8EwwnMVzDZugCvdx0/DIIA==} + engines: {node: '>=10.12.0'} + hasBin: true + dependencies: + '@bcoe/v8-coverage': 0.2.3 + '@istanbuljs/schema': 0.1.3 + find-up: 5.0.0 + foreground-child: 2.0.0 + istanbul-lib-coverage: 3.2.0 + istanbul-lib-report: 3.0.0 + istanbul-reports: 3.1.5 + rimraf: 3.0.2 + test-exclude: 6.0.0 + v8-to-istanbul: 9.1.0 + yargs: 16.2.0 + yargs-parser: 20.2.9 + dev: true + + /cac@6.7.14: + resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} + engines: {node: '>=8'} + dev: true + + /chai@4.3.7: + resolution: {integrity: sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==} + engines: {node: '>=4'} + dependencies: + assertion-error: 1.1.0 + check-error: 1.0.2 + deep-eql: 4.1.3 + get-func-name: 2.0.0 + loupe: 2.3.6 + pathval: 1.1.1 + type-detect: 4.0.8 + dev: true + + /chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + dev: true + + /check-error@1.0.2: + resolution: {integrity: sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==} + dev: true + + /chokidar@3.5.3: resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} engines: {node: '>= 8.10.0'} dependencies: @@ -238,34 +707,60 @@ packages: fsevents: 2.3.2 dev: true - /cliui/7.0.4: + /chownr@1.1.4: + resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} + dev: true + + /cli-truncate@3.1.0: + resolution: {integrity: sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + slice-ansi: 5.0.0 + string-width: 5.1.2 + dev: true + + /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 - /color-convert/2.0.1: + /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: + /color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - dev: false - /concat-map/0.0.1: + /concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} dev: true - /create-require/1.1.1: + /convert-source-map@1.9.0: + resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} + dev: true + + /core-util-is@1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + dev: true + + /create-require@1.1.1: resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} dev: true - /debug/3.2.7_supports-color@5.5.0: + /cross-spawn@7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + dev: true + + /debug@3.2.7(supports-color@5.5.0): resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} peerDependencies: supports-color: '*' @@ -277,33 +772,186 @@ packages: supports-color: 5.5.0 dev: true - /diff/4.0.2: - resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} - engines: {node: '>=0.3.1'} + /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 dev: true - /dotenv/16.0.3: - resolution: {integrity: sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==} - engines: {node: '>=12'} - dev: false + /decompress-response@6.0.0: + resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} + engines: {node: '>=10'} + dependencies: + mimic-response: 3.1.0 + dev: true - /emoji-regex/8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + /deep-eql@4.1.3: + resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==} + engines: {node: '>=6'} + dependencies: + type-detect: 4.0.8 + dev: true + + /deep-extend@0.6.0: + resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} + engines: {node: '>=4.0.0'} + dev: true + + /detect-libc@2.0.1: + resolution: {integrity: sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==} + engines: {node: '>=8'} + dev: true + + /diff@4.0.2: + resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} + engines: {node: '>=0.3.1'} + dev: true + + /diff@5.1.0: + resolution: {integrity: sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==} + 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 + dev: true + + /dotenv@16.0.3: + resolution: {integrity: sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==} + engines: {node: '>=12'} dev: false - /escalade/3.1.1: + /eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + dev: true + + /emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + /emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + dev: true + + /end-of-stream@1.4.4: + resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + dependencies: + once: 1.4.0 + dev: true + + /esbuild@0.17.14: + resolution: {integrity: sha512-vOO5XhmVj/1XQR9NQ1UPq6qvMYL7QFJU57J5fKBKBKxp17uDt5PgxFDb4A2nEiXhr1qQs4x0F5+66hVVw4ruNw==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/android-arm': 0.17.14 + '@esbuild/android-arm64': 0.17.14 + '@esbuild/android-x64': 0.17.14 + '@esbuild/darwin-arm64': 0.17.14 + '@esbuild/darwin-x64': 0.17.14 + '@esbuild/freebsd-arm64': 0.17.14 + '@esbuild/freebsd-x64': 0.17.14 + '@esbuild/linux-arm': 0.17.14 + '@esbuild/linux-arm64': 0.17.14 + '@esbuild/linux-ia32': 0.17.14 + '@esbuild/linux-loong64': 0.17.14 + '@esbuild/linux-mips64el': 0.17.14 + '@esbuild/linux-ppc64': 0.17.14 + '@esbuild/linux-riscv64': 0.17.14 + '@esbuild/linux-s390x': 0.17.14 + '@esbuild/linux-x64': 0.17.14 + '@esbuild/netbsd-x64': 0.17.14 + '@esbuild/openbsd-x64': 0.17.14 + '@esbuild/sunos-x64': 0.17.14 + '@esbuild/win32-arm64': 0.17.14 + '@esbuild/win32-ia32': 0.17.14 + '@esbuild/win32-x64': 0.17.14 + dev: true + + /escalade@3.1.1: resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} engines: {node: '>=6'} - dev: false - /fill-range/7.0.1: + /expand-template@2.0.3: + resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} + engines: {node: '>=6'} + dev: true + + /fast-glob@3.2.12: + resolution: {integrity: sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==} + 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: true + + /fastq@1.15.0: + resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} + dependencies: + reusify: 1.0.4 + dev: true + + /fill-range@7.0.1: resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} engines: {node: '>=8'} dependencies: to-regex-range: 5.0.1 dev: true - /fsevents/2.3.2: + /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 + + /foreground-child@2.0.0: + resolution: {integrity: sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==} + engines: {node: '>=8.0.0'} + dependencies: + cross-spawn: 7.0.3 + signal-exit: 3.0.7 + dev: true + + /from2@2.3.0: + resolution: {integrity: sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==} + dependencies: + inherits: 2.0.4 + readable-stream: 2.3.8 + dev: true + + /fs-constants@1.0.0: + resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} + dev: true + + /fs-extra@9.1.0: + resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==} + engines: {node: '>=10'} + dependencies: + at-least-node: 1.0.0 + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.0 + dev: true + + /fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + dev: true + + /fsevents@2.3.2: resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} os: [darwin] @@ -311,99 +959,360 @@ packages: dev: true optional: true - /get-caller-file/2.0.5: + /function-bind@1.1.1: + resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} + dev: true + + /get-caller-file@2.0.5: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} - dev: false - /glob-parent/5.1.2: + /get-func-name@2.0.0: + resolution: {integrity: sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==} + dev: true + + /github-from-package@0.0.0: + resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==} + dev: true + + /glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} dependencies: is-glob: 4.0.3 dev: true - /has-flag/3.0.0: + /glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + dev: true + + /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.2.12 + ignore: 5.2.4 + merge2: 1.4.1 + slash: 3.0.0 + dev: true + + /globrex@0.1.2: + resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} + dev: true + + /graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + dev: true + + /has-flag@3.0.0: resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} engines: {node: '>=4'} dev: true - /ignore-by-default/1.0.1: + /has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + dev: true + + /has@1.0.3: + resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} + engines: {node: '>= 0.4.0'} + dependencies: + function-bind: 1.1.1 + dev: true + + /html-escaper@2.0.2: + resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} + dev: true + + /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 + dev: true + + /ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + dev: true + + /ignore-by-default@1.0.1: resolution: {integrity: sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==} dev: true - /is-binary-path/2.1.0: + /ignore@5.2.4: + resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} + engines: {node: '>= 4'} + dev: true + + /inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + dev: true + + /inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + dev: true + + /ini@1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + dev: true + + /into-stream@6.0.0: + resolution: {integrity: sha512-XHbaOAvP+uFKUFsOgoNPRjLkwB+I22JFPFe5OjTkQ0nwgj6+pSjb4NmB6VMxaPshLiOf+zcpOCBQuLwC1KHhZA==} + engines: {node: '>=10'} + dependencies: + from2: 2.3.0 + p-is-promise: 3.0.0 + dev: true + + /is-binary-path@2.1.0: resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} engines: {node: '>=8'} dependencies: binary-extensions: 2.2.0 dev: true - /is-extglob/2.1.1: + /is-core-module@2.9.0: + resolution: {integrity: sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==} + dependencies: + has: 1.0.3 + dev: true + + /is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} dev: true - /is-fullwidth-code-point/3.0.0: + /is-fullwidth-code-point@3.0.0: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} engines: {node: '>=8'} - dev: false - /is-glob/4.0.3: + /is-fullwidth-code-point@4.0.0: + resolution: {integrity: sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==} + engines: {node: '>=12'} + dev: true + + /is-glob@4.0.3: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} dependencies: is-extglob: 2.1.1 dev: true - /is-number/7.0.0: + /is-number@7.0.0: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} dev: true - /json5/2.2.3: + /isarray@1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + dev: true + + /isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + dev: true + + /istanbul-lib-coverage@3.2.0: + resolution: {integrity: sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==} + engines: {node: '>=8'} + dev: true + + /istanbul-lib-report@3.0.0: + resolution: {integrity: sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==} + engines: {node: '>=8'} + dependencies: + istanbul-lib-coverage: 3.2.0 + make-dir: 3.1.0 + supports-color: 7.2.0 + dev: true + + /istanbul-reports@3.1.5: + resolution: {integrity: sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==} + engines: {node: '>=8'} + dependencies: + html-escaper: 2.0.2 + istanbul-lib-report: 3.0.0 + dev: true + + /jsesc@2.5.2: + resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} + engines: {node: '>=4'} + hasBin: true + dev: true + + /json5@2.2.3: resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} engines: {node: '>=6'} hasBin: true dev: true - /lodash.camelcase/4.3.0: + /jsonc-parser@3.2.0: + resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} + dev: true + + /jsonfile@6.1.0: + resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + dependencies: + universalify: 2.0.0 + optionalDependencies: + graceful-fs: 4.2.11 + dev: true + + /local-pkg@0.4.3: + resolution: {integrity: sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==} + engines: {node: '>=14'} + dev: true + + /locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + dependencies: + p-locate: 5.0.0 + dev: true + + /lodash.camelcase@4.3.0: resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} dev: false - /long/4.0.0: + /long@4.0.0: resolution: {integrity: sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==} dev: false - /long/5.2.1: + /long@5.2.1: resolution: {integrity: sha512-GKSNGeNAtw8IryjjkhZxuKB3JzlcLTwjtiQCHKvqQet81I93kXslhDQruGI/QsddO83mcDToBVy7GqGS/zYf/A==} dev: false - /make-error/1.3.6: + /loupe@2.3.6: + resolution: {integrity: sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==} + dependencies: + get-func-name: 2.0.0 + dev: true + + /lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + dependencies: + yallist: 4.0.0 + dev: true + + /make-dir@3.1.0: + resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} + engines: {node: '>=8'} + dependencies: + semver: 6.3.0 + dev: true + + /make-error@1.3.6: resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} dev: true - /minimatch/3.1.2: + /merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + dev: true + + /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: true + + /mimic-response@3.1.0: + resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} + engines: {node: '>=10'} + dev: true + + /minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} dependencies: brace-expansion: 1.1.11 dev: true - /minimist/1.2.8: + /minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} dev: true - /ms/2.1.3: + /mkdirp-classic@0.5.3: + resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} + dev: true + + /mlly@1.2.0: + resolution: {integrity: sha512-+c7A3CV0KGdKcylsI6khWyts/CYrGTrRVo4R/I7u/cUsy0Conxa6LUhiEzVKIw14lc2L5aiO4+SeVe4TeGRKww==} + dependencies: + acorn: 8.8.2 + pathe: 1.1.0 + pkg-types: 1.0.2 + ufo: 1.1.1 + dev: true + + /ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + dev: true + + /ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} dev: true - /nodemon/2.0.22: + /multistream@4.1.0: + resolution: {integrity: sha512-J1XDiAmmNpRCBfIWJv+n0ymC4ABcf/Pl+5YvC5B/D2f/2+8PtHvCNxMPKiQcZyi922Hq69J2YOpb1pTywfifyw==} + dependencies: + once: 1.4.0 + readable-stream: 3.6.2 + dev: true + + /nanoid@3.3.6: + resolution: {integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + dev: true + + /napi-build-utils@1.0.2: + resolution: {integrity: sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==} + dev: true + + /node-abi@3.33.0: + resolution: {integrity: sha512-7GGVawqyHF4pfd0YFybhv/eM9JwTtPqx0mAanQ146O3FlSh3pA24zf9IRQTOsfTSqXTNzPSP5iagAJ94jjuVog==} + engines: {node: '>=10'} + dependencies: + semver: 7.3.8 + dev: true + + /node-fetch@2.6.9: + resolution: {integrity: sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + dependencies: + whatwg-url: 5.0.0 + dev: true + + /nodemon@2.0.22: resolution: {integrity: sha512-B8YqaKMmyuCO7BowF1Z1/mkPqLk6cs/l63Ojtd6otKjMx47Dq1utxfRxcavH1I7VSaL8n5BUaoutadnsX3AAVQ==} engines: {node: '>=8.10.0'} hasBin: true dependencies: chokidar: 3.5.3 - debug: 3.2.7_supports-color@5.5.0 + debug: 3.2.7(supports-color@5.5.0) ignore-by-default: 1.0.1 minimatch: 3.1.2 pstree.remy: 1.1.8 @@ -414,24 +1323,182 @@ packages: undefsafe: 2.0.5 dev: true - /nopt/1.0.10: + /nopt@1.0.10: resolution: {integrity: sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==} hasBin: true dependencies: abbrev: 1.1.1 dev: true - /normalize-path/3.0.0: + /normalize-path@3.0.0: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} dev: true - /picomatch/2.3.1: + /once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + dependencies: + wrappy: 1.0.2 + dev: true + + /p-is-promise@3.0.0: + resolution: {integrity: sha512-Wo8VsW4IRQSKVXsJCn7TomUaVtyfjVDn3nUP7kE967BQk0CwFpdbZs0X0uk5sW9mkBa9eNM7hCMaG93WUAwxYQ==} + engines: {node: '>=8'} + dev: true + + /p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + dependencies: + yocto-queue: 0.1.0 + dev: true + + /p-limit@4.0.0: + resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + yocto-queue: 1.0.0 + dev: true + + /p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + dependencies: + p-limit: 3.1.0 + dev: true + + /path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + dev: true + + /path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + dev: true + + /path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + dev: true + + /path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + dev: true + + /path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + dev: true + + /pathe@1.1.0: + resolution: {integrity: sha512-ODbEPR0KKHqECXW1GoxdDb+AZvULmXjVPy4rt+pGo2+TnjJTIPJQSVS6N63n8T2Ip+syHhbn52OewKicV0373w==} + dev: true + + /pathval@1.1.1: + resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} + dev: true + + /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'} dev: true - /prisma/4.11.0: + /pkg-fetch@3.4.2: + resolution: {integrity: sha512-0+uijmzYcnhC0hStDjm/cl2VYdrmVVBpe7Q8k9YBojxmR5tG8mvR9/nooQq3QSXiQqORDVOTY3XqMEqJVIzkHA==} + hasBin: true + dependencies: + chalk: 4.1.2 + fs-extra: 9.1.0 + https-proxy-agent: 5.0.1 + node-fetch: 2.6.9 + progress: 2.0.3 + semver: 7.3.8 + tar-fs: 2.1.1 + yargs: 16.2.0 + transitivePeerDependencies: + - encoding + - supports-color + dev: true + + /pkg-types@1.0.2: + resolution: {integrity: sha512-hM58GKXOcj8WTqUXnsQyJYXdeAPbythQgEF3nTcEo+nkD49chjQ9IKm/QJy9xf6JakXptz86h7ecP2024rrLaQ==} + dependencies: + jsonc-parser: 3.2.0 + mlly: 1.2.0 + pathe: 1.1.0 + dev: true + + /pkg@5.8.1: + resolution: {integrity: sha512-CjBWtFStCfIiT4Bde9QpJy0KeH19jCfwZRJqHFDFXfhUklCx8JoFmMj3wgnEYIwGmZVNkhsStPHEOnrtrQhEXA==} + hasBin: true + peerDependencies: + node-notifier: '>=9.0.1' + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@babel/generator': 7.18.2 + '@babel/parser': 7.18.4 + '@babel/types': 7.19.0 + chalk: 4.1.2 + fs-extra: 9.1.0 + globby: 11.1.0 + into-stream: 6.0.0 + is-core-module: 2.9.0 + minimist: 1.2.8 + multistream: 4.1.0 + pkg-fetch: 3.4.2 + prebuild-install: 7.1.1 + resolve: 1.22.1 + stream-meter: 1.0.4 + transitivePeerDependencies: + - encoding + - supports-color + dev: true + + /postcss@8.4.21: + resolution: {integrity: sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==} + engines: {node: ^10 || ^12 || >=14} + dependencies: + nanoid: 3.3.6 + picocolors: 1.0.0 + source-map-js: 1.0.2 + dev: true + + /prebuild-install@7.1.1: + resolution: {integrity: sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==} + engines: {node: '>=10'} + hasBin: true + dependencies: + detect-libc: 2.0.1 + expand-template: 2.0.3 + github-from-package: 0.0.0 + minimist: 1.2.8 + mkdirp-classic: 0.5.3 + napi-build-utils: 1.0.2 + node-abi: 3.33.0 + pump: 3.0.0 + rc: 1.2.8 + simple-get: 4.0.1 + tar-fs: 2.1.1 + tunnel-agent: 0.6.0 + dev: true + + /pretty-format@27.5.1: + resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + ansi-regex: 5.0.1 + ansi-styles: 5.2.0 + react-is: 17.0.2 + dev: true + + /prisma@4.11.0: resolution: {integrity: sha512-4zZmBXssPUEiX+GeL0MUq/Yyie4ltiKmGu7jCJFnYMamNrrulTBc+D+QwAQSJ01tyzeGHlD13kOnqPwRipnlNw==} engines: {node: '>=14.17'} hasBin: true @@ -439,7 +1506,16 @@ packages: dependencies: '@prisma/engines': 4.11.0 - /protobufjs/7.2.2: + /process-nextick-args@2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + dev: true + + /progress@2.0.3: + resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} + engines: {node: '>=0.4.0'} + dev: true + + /protobufjs@7.2.2: resolution: {integrity: sha512-++PrQIjrom+bFDPpfmqXfAGSQs40116JRrqqyf53dymUMvvb5d/LMRyicRoF1AUKoXVS1/IgJXlEgcpr4gTF3Q==} engines: {node: '>=12.0.0'} requiresBuild: true @@ -458,82 +1534,353 @@ packages: long: 5.2.1 dev: false - /pstree.remy/1.1.8: + /pstree.remy@1.1.8: resolution: {integrity: sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==} dev: true - /readdirp/3.6.0: + /pump@3.0.0: + resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} + dependencies: + end-of-stream: 1.4.4 + once: 1.4.0 + dev: true + + /queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + dev: true + + /rc@1.2.8: + resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} + hasBin: true + dependencies: + deep-extend: 0.6.0 + ini: 1.3.8 + minimist: 1.2.8 + strip-json-comments: 2.0.1 + dev: true + + /react-is@17.0.2: + resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} + 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: true + + /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: true + + /readdirp@3.6.0: resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} engines: {node: '>=8.10.0'} dependencies: picomatch: 2.3.1 dev: true - /require-directory/2.1.1: + /require-directory@2.1.1: resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} engines: {node: '>=0.10.0'} - dev: false - /semver/5.7.1: + /resolve@1.22.1: + resolution: {integrity: sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==} + hasBin: true + dependencies: + is-core-module: 2.9.0 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + dev: true + + /reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + dev: true + + /rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + hasBin: true + dependencies: + glob: 7.2.3 + dev: true + + /rollup@3.20.2: + resolution: {integrity: sha512-3zwkBQl7Ai7MFYQE0y1MeQ15+9jsi7XxfrqwTb/9EK8D9C9+//EBR4M+CuA1KODRaNbFez/lWxA5vhEGZp4MUg==} + engines: {node: '>=14.18.0', npm: '>=8.0.0'} + hasBin: true + optionalDependencies: + fsevents: 2.3.2 + dev: true + + /run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + dependencies: + queue-microtask: 1.2.3 + dev: true + + /safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + dev: true + + /safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + dev: true + + /semver@5.7.1: resolution: {integrity: sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==} hasBin: true dev: true - /semver/7.0.0: + /semver@6.3.0: + resolution: {integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==} + hasBin: true + dev: true + + /semver@7.0.0: resolution: {integrity: sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==} hasBin: true dev: true - /simple-update-notifier/1.1.0: + /semver@7.3.8: + resolution: {integrity: sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==} + engines: {node: '>=10'} + hasBin: true + dependencies: + lru-cache: 6.0.0 + dev: true + + /shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + dependencies: + shebang-regex: 3.0.0 + dev: true + + /shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + 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==} + dev: true + + /simple-concat@1.0.1: + resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} + dev: true + + /simple-get@4.0.1: + resolution: {integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==} + dependencies: + decompress-response: 6.0.0 + once: 1.4.0 + simple-concat: 1.0.1 + dev: true + + /simple-update-notifier@1.1.0: resolution: {integrity: sha512-VpsrsJSUcJEseSbMHkrsrAVSdvVS5I96Qo1QAQ4FxQ9wXFcB+pjj7FB7/us9+GcgfW4ziHtYMc1J0PLczb55mg==} engines: {node: '>=8.10.0'} dependencies: semver: 7.0.0 dev: true - /string-width/4.2.3: + /slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + dev: true + + /slice-ansi@5.0.0: + resolution: {integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==} + engines: {node: '>=12'} + dependencies: + ansi-styles: 6.2.1 + is-fullwidth-code-point: 4.0.0 + dev: true + + /source-map-js@1.0.2: + resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} + engines: {node: '>=0.10.0'} + dev: true + + /source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + dev: true + + /stackback@0.0.2: + resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + dev: true + + /std-env@3.3.2: + resolution: {integrity: sha512-uUZI65yrV2Qva5gqE0+A7uVAvO40iPo6jGhs7s8keRfHCmtg+uB2X6EiLGCI9IgL1J17xGhvoOqSz79lzICPTA==} + dev: true + + /stream-meter@1.0.4: + resolution: {integrity: sha512-4sOEtrbgFotXwnEuzzsQBYEV1elAeFSO8rSGeTwabuX1RRn/kEq9JVH7I0MRBhKVRR0sJkr0M0QCH7yOLf9fhQ==} + dependencies: + readable-stream: 2.3.8 + 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 - dev: false - /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.0.1 + dev: true + + /string_decoder@1.1.1: + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + dependencies: + safe-buffer: 5.1.2 + dev: true + + /string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + dependencies: + safe-buffer: 5.2.1 + dev: true + + /strip-ansi@6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} dependencies: ansi-regex: 5.0.1 - dev: false - /strip-bom/3.0.0: + /strip-ansi@7.0.1: + resolution: {integrity: sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==} + engines: {node: '>=12'} + dependencies: + ansi-regex: 6.0.1 + dev: true + + /strip-bom@3.0.0: resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} engines: {node: '>=4'} dev: true - /supports-color/5.5.0: + /strip-json-comments@2.0.1: + resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} + engines: {node: '>=0.10.0'} + dev: true + + /strip-literal@1.0.1: + resolution: {integrity: sha512-QZTsipNpa2Ppr6v1AmJHESqJ3Uz247MUS0OjrnnZjFAvEoWqxuyFuXn2xLgMtRnijJShAa1HL0gtJyUs7u7n3Q==} + dependencies: + acorn: 8.8.2 + dev: true + + /supports-color@5.5.0: resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} engines: {node: '>=4'} dependencies: has-flag: 3.0.0 dev: true - /to-regex-range/5.0.1: + /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-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + dev: true + + /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: true + + /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: true + + /test-exclude@6.0.0: + resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} + engines: {node: '>=8'} + dependencies: + '@istanbuljs/schema': 0.1.3 + glob: 7.2.3 + minimatch: 3.1.2 + dev: true + + /tinybench@2.4.0: + resolution: {integrity: sha512-iyziEiyFxX4kyxSp+MtY1oCH/lvjH3PxFN8PGCDeqcZWAJ/i+9y+nL85w99PxVzrIvew/GSkSbDYtiGVa85Afg==} + dev: true + + /tinypool@0.4.0: + resolution: {integrity: sha512-2ksntHOKf893wSAH4z/+JbPpi92esw8Gn9N2deXX+B0EO92hexAVI9GIZZPx7P5aYo5KULfeOSt3kMOmSOy6uA==} + engines: {node: '>=14.0.0'} + dev: true + + /tinyspy@1.1.1: + resolution: {integrity: sha512-UVq5AXt/gQlti7oxoIg5oi/9r0WpF7DGEVwXgqWSMmyN16+e3tl5lIvTaOpJ3TAtu5xFzWccFRM4R5NaWHF+4g==} + engines: {node: '>=14.0.0'} + 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 dev: true - /touch/3.1.0: + /touch@3.1.0: resolution: {integrity: sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==} hasBin: true dependencies: nopt: 1.0.10 dev: true - /ts-node/10.9.1_3flabivgbrnlfzsgzfhinuvrvy: + /tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + dev: true + + /ts-node@10.9.1(@types/node@18.15.9)(typescript@5.0.2): resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} hasBin: true peerDependencies: @@ -564,7 +1911,20 @@ packages: yn: 3.1.1 dev: true - /tsconfig-paths/4.1.2: + /tsconfck@2.1.1(typescript@5.0.2): + resolution: {integrity: sha512-ZPCkJBKASZBmBUNqGHmRhdhM8pJYDdOXp4nRgj/O0JwUwsMq50lCDRQP/M5GBNAA0elPrq4gAeu4dkaVCuKWww==} + engines: {node: ^14.13.1 || ^16 || >=18} + hasBin: true + peerDependencies: + typescript: ^4.3.5 || ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + dependencies: + typescript: 5.0.2 + dev: true + + /tsconfig-paths@4.1.2: resolution: {integrity: sha512-uhxiMgnXQp1IR622dUXI+9Ehnws7i/y6xvpZB9IbUVOPy0muvdvgXeZOn88UcGPiT98Vp3rJPTa8bFoalZ3Qhw==} engines: {node: '>=6'} dependencies: @@ -573,40 +1933,241 @@ packages: strip-bom: 3.0.0 dev: true - /typescript/5.0.2: + /tunnel-agent@0.6.0: + resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} + dependencies: + safe-buffer: 5.2.1 + dev: true + + /type-detect@4.0.8: + resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} + engines: {node: '>=4'} + dev: true + + /typescript@5.0.2: resolution: {integrity: sha512-wVORMBGO/FAs/++blGNeAVdbNKtIh1rbBL2EyQ1+J9lClJ93KiiKe8PmFIVdXhHcyv44SL9oglmfeSsndo0jRw==} engines: {node: '>=12.20'} hasBin: true dev: true - /undefsafe/2.0.5: + /ufo@1.1.1: + resolution: {integrity: sha512-MvlCc4GHrmZdAllBc0iUDowff36Q9Ndw/UzqmEKyrfSzokTd9ZCy1i+IIk5hrYKkjoYVQyNbrw7/F8XJ2rEwTg==} + dev: true + + /undefsafe@2.0.5: resolution: {integrity: sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==} dev: true - /v8-compile-cache-lib/3.0.1: + /universalify@2.0.0: + resolution: {integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==} + engines: {node: '>= 10.0.0'} + dev: true + + /util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + dev: true + + /v8-compile-cache-lib@3.0.1: resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} dev: true - /wrap-ansi/7.0.0: + /v8-to-istanbul@9.1.0: + resolution: {integrity: sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA==} + engines: {node: '>=10.12.0'} + dependencies: + '@jridgewell/trace-mapping': 0.3.17 + '@types/istanbul-lib-coverage': 2.0.4 + convert-source-map: 1.9.0 + dev: true + + /vite-node@0.29.8(@types/node@18.15.9): + resolution: {integrity: sha512-b6OtCXfk65L6SElVM20q5G546yu10/kNrhg08afEoWlFRJXFq9/6glsvSVY+aI6YeC1tu2TtAqI2jHEQmOmsFw==} + engines: {node: '>=v14.16.0'} + hasBin: true + dependencies: + cac: 6.7.14 + debug: 4.3.4 + mlly: 1.2.0 + pathe: 1.1.0 + picocolors: 1.0.0 + vite: 4.2.1(@types/node@18.15.9) + transitivePeerDependencies: + - '@types/node' + - less + - sass + - stylus + - sugarss + - supports-color + - terser + dev: true + + /vite-tsconfig-paths@4.0.7(typescript@5.0.2): + resolution: {integrity: sha512-MwIYaby6kcbQGZqMH+gAK6h0UYQGOkjsuAgw4q6bP/5vWkn8VKvnmLuCQHA2+IzHAJHnE8OFTO4lnJLFMf9+7Q==} + peerDependencies: + vite: '*' + peerDependenciesMeta: + vite: + optional: true + dependencies: + debug: 4.3.4 + globrex: 0.1.2 + tsconfck: 2.1.1(typescript@5.0.2) + transitivePeerDependencies: + - supports-color + - typescript + dev: true + + /vite@4.2.1(@types/node@18.15.9): + resolution: {integrity: sha512-7MKhqdy0ISo4wnvwtqZkjke6XN4taqQ2TBaTccLIpOKv7Vp2h4Y+NpmWCnGDeSvvn45KxvWgGyb0MkHvY1vgbg==} + engines: {node: ^14.18.0 || >=16.0.0} + hasBin: true + peerDependencies: + '@types/node': '>= 14' + less: '*' + sass: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + dependencies: + '@types/node': 18.15.9 + esbuild: 0.17.14 + postcss: 8.4.21 + resolve: 1.22.1 + rollup: 3.20.2 + optionalDependencies: + fsevents: 2.3.2 + dev: true + + /vitest@0.29.8: + resolution: {integrity: sha512-JIAVi2GK5cvA6awGpH0HvH/gEG9PZ0a/WoxdiV3PmqK+3CjQMf8c+J/Vhv4mdZ2nRyXFw66sAg6qz7VNkaHfDQ==} + engines: {node: '>=v14.16.0'} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@vitest/browser': '*' + '@vitest/ui': '*' + happy-dom: '*' + jsdom: '*' + playwright: '*' + safaridriver: '*' + webdriverio: '*' + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@vitest/browser': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true + playwright: + optional: true + safaridriver: + optional: true + webdriverio: + optional: true + dependencies: + '@types/chai': 4.3.4 + '@types/chai-subset': 1.3.3 + '@types/node': 18.15.9 + '@vitest/expect': 0.29.8 + '@vitest/runner': 0.29.8 + '@vitest/spy': 0.29.8 + '@vitest/utils': 0.29.8 + acorn: 8.8.2 + acorn-walk: 8.2.0 + cac: 6.7.14 + chai: 4.3.7 + debug: 4.3.4 + local-pkg: 0.4.3 + pathe: 1.1.0 + picocolors: 1.0.0 + source-map: 0.6.1 + std-env: 3.3.2 + strip-literal: 1.0.1 + tinybench: 2.4.0 + tinypool: 0.4.0 + tinyspy: 1.1.1 + vite: 4.2.1(@types/node@18.15.9) + vite-node: 0.29.8(@types/node@18.15.9) + why-is-node-running: 2.2.2 + transitivePeerDependencies: + - less + - sass + - stylus + - sugarss + - supports-color + - terser + dev: true + + /webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + dev: true + + /whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + dev: true + + /which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + dependencies: + 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'} dependencies: ansi-styles: 4.3.0 string-width: 4.2.3 strip-ansi: 6.0.1 - dev: false - /y18n/5.0.8: + /wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + dev: true + + /y18n@5.0.8: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} engines: {node: '>=10'} - dev: false - /yargs-parser/20.2.9: + /yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + dev: true + + /yargs-parser@20.2.9: resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} engines: {node: '>=10'} - dev: false - /yargs/16.2.0: + /yargs@16.2.0: resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} engines: {node: '>=10'} dependencies: @@ -617,9 +2178,18 @@ packages: string-width: 4.2.3 y18n: 5.0.8 yargs-parser: 20.2.9 - dev: false - /yn/3.1.1: + /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'} + dev: true + + /yocto-queue@1.0.0: + resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} + engines: {node: '>=12.20'} + dev: true diff --git a/services/delivery/proto b/services/delivery/proto new file mode 120000 index 00000000..4d1e2d8b --- /dev/null +++ b/services/delivery/proto @@ -0,0 +1 @@ +../proto/ \ No newline at end of file diff --git a/services/delivery/src/tests/test.test.ts b/services/delivery/src/tests/test.test.ts new file mode 100644 index 00000000..c348152a --- /dev/null +++ b/services/delivery/src/tests/test.test.ts @@ -0,0 +1,6 @@ +import { describe, expect, test } from "vitest"; + +// simple test to check if the test runner is working +test("test", () => { + expect(true).toBe(true); +}); diff --git a/services/delivery/vitest.config.ts b/services/delivery/vitest.config.ts new file mode 100644 index 00000000..08cfe3bf --- /dev/null +++ b/services/delivery/vitest.config.ts @@ -0,0 +1,7 @@ +import { defineConfig } from "vitest/config"; +import tsconfigPaths from "vite-tsconfig-paths"; + +export default defineConfig({ + plugins: [tsconfigPaths()], + base: "/src/tests", +}); From b240ee05b8fc43e95420126200b99c3bc2ca7b4a Mon Sep 17 00:00:00 2001 From: Florian LEROUX <10078837+floriaaan@users.noreply.github.com> Date: Tue, 4 Apr 2023 10:08:43 +0200 Subject: [PATCH 237/883] build(docker): add Dockerfile --- services/delivery/.dockerignore | 2 ++ services/delivery/.gitignore | 1 + services/delivery/Dockerfile | 42 +++++++++++++++++++++++++++++++++ 3 files changed, 45 insertions(+) create mode 100644 services/delivery/.dockerignore create mode 100644 services/delivery/Dockerfile diff --git a/services/delivery/.dockerignore b/services/delivery/.dockerignore new file mode 100644 index 00000000..dd87e2d7 --- /dev/null +++ b/services/delivery/.dockerignore @@ -0,0 +1,2 @@ +node_modules +build diff --git a/services/delivery/.gitignore b/services/delivery/.gitignore index 378e1eaa..31e50325 100644 --- a/services/delivery/.gitignore +++ b/services/delivery/.gitignore @@ -1,5 +1,6 @@ node_modules/ dist/ +bin/ *.env* !*.env.example diff --git a/services/delivery/Dockerfile b/services/delivery/Dockerfile new file mode 100644 index 00000000..0e62247a --- /dev/null +++ b/services/delivery/Dockerfile @@ -0,0 +1,42 @@ +FROM node:18-alpine as builder + +# Set working directory +WORKDIR /app + +# Copy the package.json and package-lock.json files +COPY package*.json ./ + +# Install dependencies +RUN npm install + + +# Copy the application code +COPY . . + +# Copy the proto files - TODO: fix this, proto files should be copied from goodfood/services/proto +# RUN cp -r -L ../proto /proto/ + +# Generate Prisma client +RUN npx prisma generate + +# Build the application +RUN npm run build + +# Package the application +RUN npm run pkg + +# Create a new image with the application +FROM node:18-alpine as runner + +# Set working directory +WORKDIR /app + +# Copy the application package +COPY --from=builder /app/bin /usr/local/bin +RUN ls /usr/local/bin + +# Expose the gRPC port +EXPOSE 50008 + +# Start the server +CMD ["delivery-linux-x64"] From aef301e4d2f8ff0efdb2034120cecdc9605b2e78 Mon Sep 17 00:00:00 2001 From: Florian LEROUX <10078837+floriaaan@users.noreply.github.com> Date: Tue, 4 Apr 2023 10:11:51 +0200 Subject: [PATCH 238/883] fix(ci): fix dependencies lock file is not found --- .github/workflows/delivery.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/delivery.yml b/.github/workflows/delivery.yml index a0953866..0f2065b8 100644 --- a/.github/workflows/delivery.yml +++ b/.github/workflows/delivery.yml @@ -18,6 +18,7 @@ jobs: with: node-version: "18.x" cache: "pnpm" + cache-dependency-path: services/delivery/pnpm-lock.yaml - name: Install dependencies run: | cd ./services/delivery @@ -39,6 +40,7 @@ jobs: with: node-version: "18.x" cache: "pnpm" + cache-dependency-path: services/delivery/pnpm-lock.yaml - name: Install dependencies run: | cd ./services/delivery From e4556e0d6425690f77d01b2d1e1c433a54dec47b Mon Sep 17 00:00:00 2001 From: Florian LEROUX <10078837+floriaaan@users.noreply.github.com> Date: Sun, 9 Apr 2023 00:27:02 +0200 Subject: [PATCH 239/883] feat(handlers): add delivery-person handlers --- .github/workflows/delivery.yml | 1 - services/delivery/README.md | 2 +- services/delivery/prisma/schema.prisma | 2 +- .../delivery/src/handlers/delivery/create.ts | 3 +- .../delivery/src/handlers/delivery/delete.ts | 3 +- .../delivery/src/handlers/delivery/get.ts | 3 +- .../handlers/delivery/list-by-restaurant.ts | 3 +- .../src/handlers/delivery/list-by-user.ts | 3 +- .../delivery/src/handlers/delivery/update.ts | 3 +- .../delivery/src/handlers/person/create.ts | 29 ++++++++ .../delivery/src/handlers/person/delete.ts | 19 +++++ services/delivery/src/handlers/person/get.ts | 21 ++++++ .../delivery/src/handlers/person/index.ts | 15 ++++ .../delivery/src/handlers/person/list-near.ts | 72 +++++++++++++++++++ services/delivery/src/handlers/person/list.ts | 17 +++++ .../delivery/src/handlers/person/update.ts | 30 ++++++++ services/delivery/src/server.ts | 3 +- .../delivery/src/types/delivery-person.d.ts | 14 ++++ services/delivery/src/types/delivery.d.ts | 12 +--- services/delivery/src/types/index.d.ts | 9 +++ services/proto/delivery.proto | 4 +- 21 files changed, 245 insertions(+), 23 deletions(-) create mode 100644 services/delivery/src/handlers/person/create.ts create mode 100644 services/delivery/src/handlers/person/delete.ts create mode 100644 services/delivery/src/handlers/person/get.ts create mode 100644 services/delivery/src/handlers/person/index.ts create mode 100644 services/delivery/src/handlers/person/list-near.ts create mode 100644 services/delivery/src/handlers/person/list.ts create mode 100644 services/delivery/src/handlers/person/update.ts create mode 100644 services/delivery/src/types/index.d.ts diff --git a/.github/workflows/delivery.yml b/.github/workflows/delivery.yml index 0f2065b8..53b4ba53 100644 --- a/.github/workflows/delivery.yml +++ b/.github/workflows/delivery.yml @@ -53,7 +53,6 @@ jobs: publish: runs-on: ubuntu-latest needs: [build, test] - if: ${{ success() }} && ${{ github.ref == 'refs/heads/dev' || github.ref == 'refs/heads/main' }} steps: - name: Checkout code uses: actions/checkout@v2 diff --git a/services/delivery/README.md b/services/delivery/README.md index 69965be6..6f933c51 100644 --- a/services/delivery/README.md +++ b/services/delivery/README.md @@ -5,7 +5,7 @@ | **Port:** 50008 | | **Developer:** @floriaaan | | **Status:** In progress | -| **Last update:** 2023-04-04 | +| **Last update:** 2023-04-09 | | **Language:** NodeJS | | **Dependencies:** TypeScript, Prisma, gRPC, Postgres | | **Models:** (see [`prisma/schema.prisma`](./prisma/schema.prisma)) | diff --git a/services/delivery/prisma/schema.prisma b/services/delivery/prisma/schema.prisma index 0d7939f5..02929eb8 100644 --- a/services/delivery/prisma/schema.prisma +++ b/services/delivery/prisma/schema.prisma @@ -21,7 +21,7 @@ model Delivery { address String status Status @default(PENDING) - person DeliveryPerson @relation(fields: [delivery_person_id], references: [id]) + delivery_person DeliveryPerson @relation(fields: [delivery_person_id], references: [id]) delivery_person_id String user_id String diff --git a/services/delivery/src/handlers/delivery/create.ts b/services/delivery/src/handlers/delivery/create.ts index 1ad90069..ba0a4b6a 100644 --- a/services/delivery/src/handlers/delivery/create.ts +++ b/services/delivery/src/handlers/delivery/create.ts @@ -1,6 +1,7 @@ import { prisma } from "@delivery/lib/prisma"; import { log } from "@delivery/lib/log"; -import { Data, DeliveryCreateInput } from "@delivery/types/delivery"; +import { DeliveryCreateInput } from "@delivery/types/delivery"; +import { Data } from "@delivery/types"; export const CreateDelivery = async ( { request }: Data, diff --git a/services/delivery/src/handlers/delivery/delete.ts b/services/delivery/src/handlers/delivery/delete.ts index cdeee90b..35b5ade7 100644 --- a/services/delivery/src/handlers/delivery/delete.ts +++ b/services/delivery/src/handlers/delivery/delete.ts @@ -1,6 +1,7 @@ import { prisma } from "@delivery/lib/prisma"; import { log } from "@delivery/lib/log"; -import { Data, DeliveryId } from "@delivery/types/delivery"; +import { DeliveryId } from "@delivery/types/delivery"; +import { Data } from "@delivery/types"; export const DeleteDelivery = async ( data: Data, diff --git a/services/delivery/src/handlers/delivery/get.ts b/services/delivery/src/handlers/delivery/get.ts index cde931dd..4f7d37a5 100644 --- a/services/delivery/src/handlers/delivery/get.ts +++ b/services/delivery/src/handlers/delivery/get.ts @@ -1,6 +1,7 @@ import { prisma } from "@delivery/lib/prisma"; import { log } from "@delivery/lib/log"; -import { Data, DeliveryId } from "@delivery/types/delivery"; +import { DeliveryId } from "@delivery/types/delivery"; +import { Data } from "@delivery/types"; export const GetDelivery = async ( data: Data, diff --git a/services/delivery/src/handlers/delivery/list-by-restaurant.ts b/services/delivery/src/handlers/delivery/list-by-restaurant.ts index 879bb285..76aaa464 100644 --- a/services/delivery/src/handlers/delivery/list-by-restaurant.ts +++ b/services/delivery/src/handlers/delivery/list-by-restaurant.ts @@ -1,6 +1,7 @@ import { prisma } from "@delivery/lib/prisma"; import { log } from "@delivery/lib/log"; -import { Data, RestaurantId } from "@delivery/types/delivery"; +import { RestaurantId } from "@delivery/types/delivery"; +import { Data } from "@delivery/types"; export const ListDeliveriesByRestaurant = async ( data: Data, diff --git a/services/delivery/src/handlers/delivery/list-by-user.ts b/services/delivery/src/handlers/delivery/list-by-user.ts index 8c220175..30b5e3e1 100644 --- a/services/delivery/src/handlers/delivery/list-by-user.ts +++ b/services/delivery/src/handlers/delivery/list-by-user.ts @@ -1,6 +1,7 @@ import { prisma } from "@delivery/lib/prisma"; import { log } from "@delivery/lib/log"; -import { Data, UserId } from "@delivery/types/delivery"; +import { UserId } from "@delivery/types/delivery"; +import { Data } from "@delivery/types"; export const ListDeliveriesByUser = async ( data: Data, diff --git a/services/delivery/src/handlers/delivery/update.ts b/services/delivery/src/handlers/delivery/update.ts index d08d2bd2..41f4c8c9 100644 --- a/services/delivery/src/handlers/delivery/update.ts +++ b/services/delivery/src/handlers/delivery/update.ts @@ -1,6 +1,7 @@ import { prisma } from "@delivery/lib/prisma"; import { log } from "@delivery/lib/log"; -import { Data, Delivery } from "@delivery/types/delivery"; +import { Delivery } from "@delivery/types/delivery"; +import { Data } from "@delivery/types"; export const UpdateDelivery = async ( data: Data, diff --git a/services/delivery/src/handlers/person/create.ts b/services/delivery/src/handlers/person/create.ts new file mode 100644 index 00000000..1a918438 --- /dev/null +++ b/services/delivery/src/handlers/person/create.ts @@ -0,0 +1,29 @@ +import { log } from "@delivery/lib/log"; +import prisma from "@delivery/lib/prisma"; +import { Data } from "@delivery/types"; +import { DeliveryPersonCreateInput } from "@delivery/types/delivery-person"; + +export const CreateDeliveryPerson = async ( + { request }: Data, + callback: (err: any, response: any) => void +) => { + log.debug("request received at CreateDeliveryPerson handler\n", request); + try { + const { first_name, last_name, phone, location } = request; + + const deliveryPerson = await prisma.deliveryPerson.create({ + data: { + first_name, + last_name, + phone, + location: { + set: location, + }, + }, + }); + callback(null, deliveryPerson); + } catch (error) { + log.error(error); + callback(error, null); + } +}; diff --git a/services/delivery/src/handlers/person/delete.ts b/services/delivery/src/handlers/person/delete.ts new file mode 100644 index 00000000..9edfd117 --- /dev/null +++ b/services/delivery/src/handlers/person/delete.ts @@ -0,0 +1,19 @@ +import { log } from "@delivery/lib/log"; +import prisma from "@delivery/lib/prisma"; +import { Data } from "@delivery/types"; +import { DeliveryPersonId } from "@delivery/types/delivery-person"; + +export const DeleteDeliveryPerson = async ( + { request }: Data, + callback: (err: any, response: any) => void +) => { + log.debug("request received at DeleteDeliveryPerson handler\n", request); + try { + const { id } = request; + await prisma.deliveryPerson.delete({ where: { id } }); + callback(null, {}); + } catch (error) { + log.error(error); + callback(error, null); + } +}; diff --git a/services/delivery/src/handlers/person/get.ts b/services/delivery/src/handlers/person/get.ts new file mode 100644 index 00000000..e94093df --- /dev/null +++ b/services/delivery/src/handlers/person/get.ts @@ -0,0 +1,21 @@ +import { log } from "@delivery/lib/log"; +import prisma from "@delivery/lib/prisma"; +import { Data } from "@delivery/types"; +import { DeliveryPersonId } from "@delivery/types/delivery-person"; + +export const GetDeliveryPerson = async ( + { request }: Data, + callback: (err: any, response: any) => void +) => { + log.debug("request received at GetDeliveryPerson handler\n", request); + try { + const { id } = request; + const deliveryPerson = await prisma.deliveryPerson.findUnique({ + where: { id }, + }); + callback(null, deliveryPerson); + } catch (error) { + log.error(error); + callback(error, null); + } +}; diff --git a/services/delivery/src/handlers/person/index.ts b/services/delivery/src/handlers/person/index.ts new file mode 100644 index 00000000..7270442c --- /dev/null +++ b/services/delivery/src/handlers/person/index.ts @@ -0,0 +1,15 @@ +import { CreateDeliveryPerson } from "@delivery/handlers/person/create"; +import { GetDeliveryPerson } from "@delivery/handlers/person/get"; +import { UpdateDeliveryPerson } from "@delivery/handlers/person/update"; +import { DeleteDeliveryPerson } from "@delivery/handlers/person/delete"; +import { ListDeliveryPersons } from "@delivery/handlers/person/list"; +import { ListNearDeliveryPersons } from "@delivery/handlers/person/list-near"; + +export default { + CreateDeliveryPerson, + GetDeliveryPerson, + UpdateDeliveryPerson, + DeleteDeliveryPerson, + ListDeliveryPersons, + ListNearDeliveryPersons, +}; diff --git a/services/delivery/src/handlers/person/list-near.ts b/services/delivery/src/handlers/person/list-near.ts new file mode 100644 index 00000000..900e5ac9 --- /dev/null +++ b/services/delivery/src/handlers/person/list-near.ts @@ -0,0 +1,72 @@ +import { prisma } from "@delivery/lib/prisma"; +import { log } from "@delivery/lib/log"; +import { Data } from "@delivery/types"; +import { LocationInput } from "@delivery/types/delivery-person"; + +export const ListNearDeliveryPersons = async ( + { request }: Data, + callback: (err: any, response: any) => void +) => { + log.debug("request received at ListNearDeliveryPersons handler\n", request); + try { + const { latitude, longitude } = request; + const maxDistance = 10; // in km //TODO: make this a parameter + + const query = await prisma.deliveryPerson.findMany(); + const delivery_persons = query.filter(deliveryPerson => { + const distance = calculateDistance(latitude, longitude, deliveryPerson.location[0], deliveryPerson.location[1]); + return distance <= maxDistance; + });; + + callback(null, { delivery_persons }); + } catch (error) { + log.error(error); + callback(error, null); + } +}; + +/** + * Could use this raw query using Haversine formula to get locations within a radius: + * SELECT * + FROM "DeliveryPerson" + WHERE 6371 * 2 * ASIN(SQRT(POWER(SIN((latitude - $1) * pi()/180 / 2), 2) + COS(latitude * pi()/180) * COS($1 * pi()/180) * POWER(SIN((longitude - $2) * pi()/180 / 2), 2))) <= $3; + * with $1 = latitude, $2 = longitude, $3 = distance + + The Haversine formula is given by: + ``` + a = POWER(SIN((latitude2 - latitude1) * pi()/180 / 2), 2) + COS(latitude1 * pi()/180) * COS(latitude2 * pi()/180) * POWER(SIN((longitude2 - longitude1) * pi()/180 / 2), 2) + c = 2 * ASIN(SQRT(a)) + d = R * c + ``` + where latitude1 and longitude1 are the coordinates of the first point, latitude2 and longitude2 are the coordinates of the second point, R is the radius of the Earth (in this case, we are using the value 6371 which is the average radius of the Earth in kilometers), a is the square of half the chord length between the points (in radians), c is the angular distance in radians, and d is the distance between the two points in kilometers. + */ + +const EARTH_RADIUS_KM = 6371; + +function toRadians(degrees: number) { + return (degrees * Math.PI) / 180; +} + +function calculateDistance( + latitude1: number, + longitude1: number, + latitude2: number, + longitude2: number +) { + const radLat1 = toRadians(latitude1); + const radLat2 = toRadians(latitude2); + const radDeltaLat = toRadians(latitude2 - latitude1); + const radDeltaLon = toRadians(longitude2 - longitude1); + + const a = + Math.sin(radDeltaLat / 2) * Math.sin(radDeltaLat / 2) + + Math.cos(radLat1) * + Math.cos(radLat2) * + Math.sin(radDeltaLon / 2) * + Math.sin(radDeltaLon / 2); + + const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a)); + const distance = EARTH_RADIUS_KM * c; + + return distance; +} diff --git a/services/delivery/src/handlers/person/list.ts b/services/delivery/src/handlers/person/list.ts new file mode 100644 index 00000000..468ea5e3 --- /dev/null +++ b/services/delivery/src/handlers/person/list.ts @@ -0,0 +1,17 @@ +import { log } from "@delivery/lib/log"; +import prisma from "@delivery/lib/prisma"; +import { Data } from "@delivery/types"; + +export const ListDeliveryPersons = async ( + { request }: Data<{}>, + callback: (err: any, response: any) => void +) => { + log.debug("request received at ListDeliveryPersons handler\n", request); + try { + const delivery_persons = await prisma.deliveryPerson.findMany(); + callback(null, { delivery_persons }); + } catch (error) { + log.error(error); + callback(error, null); + } +}; diff --git a/services/delivery/src/handlers/person/update.ts b/services/delivery/src/handlers/person/update.ts new file mode 100644 index 00000000..7a6b1743 --- /dev/null +++ b/services/delivery/src/handlers/person/update.ts @@ -0,0 +1,30 @@ +import { log } from "@delivery/lib/log"; +import prisma from "@delivery/lib/prisma"; +import { Data } from "@delivery/types"; +import { DeliveryPerson } from "@delivery/types/delivery-person"; + +export const UpdateDeliveryPerson = async ( + { request }: Data, + callback: (err: any, response: any) => void +) => { + log.debug("request received at UpdateDeliveryPerson handler\n", request); + try { + const { id, first_name, last_name, location, phone } = request; + + const deliveryPerson = await prisma.deliveryPerson.update({ + where: { id }, + data: { + first_name, + last_name, + phone, + location: { + set: location, + }, + }, + }); + callback(null, deliveryPerson); + } catch (error) { + log.error(error); + callback(error, null); + } +}; diff --git a/services/delivery/src/server.ts b/services/delivery/src/server.ts index 2eac6c38..01d48fd7 100644 --- a/services/delivery/src/server.ts +++ b/services/delivery/src/server.ts @@ -8,6 +8,7 @@ import { options } from "@delivery/resources/protoloader-options"; import { serverInsecure } from "@delivery/resources/grpc-credentials"; import deliveryHandlers from "@delivery/handlers/delivery"; +import personHandlers from "@delivery/handlers/person"; const PORT = process.env.PORT || 50008; const ADDRESS = `0.0.0.0:${PORT}`; @@ -18,7 +19,7 @@ const { delivery } = loadPackageDefinition(packageDefinition) as any; // todo: f const server = new Server(); server.addService(delivery.DeliveryService.service, deliveryHandlers); -server.addService(delivery.DeliveryPersonService.service, {}); +server.addService(delivery.DeliveryPersonService.service, personHandlers); server.bindAsync(ADDRESS, serverInsecure, () => { server.start(); diff --git a/services/delivery/src/types/delivery-person.d.ts b/services/delivery/src/types/delivery-person.d.ts index a897860e..5bb6731d 100644 --- a/services/delivery/src/types/delivery-person.d.ts +++ b/services/delivery/src/types/delivery-person.d.ts @@ -9,3 +9,17 @@ export type DeliveryPerson = { deliveries: Delivery[]; }; + +export type DeliveryPersonCreateInput = { + first_name: string; + last_name: string; + phone: string; + location: [number, number]; +}; + +export type LocationInput = { + latitude: number; + longitude: number; +}; + +export type DeliveryPersonId = { id: DeliveryPerson["id"] }; diff --git a/services/delivery/src/types/delivery.d.ts b/services/delivery/src/types/delivery.d.ts index 333462d6..59ff1d82 100644 --- a/services/delivery/src/types/delivery.d.ts +++ b/services/delivery/src/types/delivery.d.ts @@ -1,16 +1,6 @@ import { DeliveryPerson } from "@delivery/types/delivery-person"; import { Status } from "@prisma/client"; -export type Data = { - request: T; -}; - -export type Stream = { - write: (data: any) => void; - end: () => void; - request: T; -}; - export type DeliveryCreateInput = { eta: string; address: string; @@ -23,7 +13,7 @@ export type DeliveryCreateInput = { }; export type DeliveryId = { - id: string; + id: Delivery["id"]; }; export type Delivery = { diff --git a/services/delivery/src/types/index.d.ts b/services/delivery/src/types/index.d.ts new file mode 100644 index 00000000..5f91a217 --- /dev/null +++ b/services/delivery/src/types/index.d.ts @@ -0,0 +1,9 @@ +export type Data = { + request: T; +}; + +export type Stream = { + write: (data: any) => void; + end: () => void; + request: T; +}; diff --git a/services/proto/delivery.proto b/services/proto/delivery.proto index f4906434..91a86b21 100644 --- a/services/proto/delivery.proto +++ b/services/proto/delivery.proto @@ -10,7 +10,7 @@ message Delivery { string address = 3; Status status = 4; - DeliveryPerson person = 5; + DeliveryPerson delivery_person = 5; string delivery_person_id = 6; string user_id = 7; @@ -80,7 +80,7 @@ message DeliveryList { } message DeliveryPersonList { - repeated DeliveryPersonList persons = 1; + repeated DeliveryPersonList delivery_persons = 1; } message DeliveryPersonId { From 02c53718a415ae90e9370080addfa0bedc874b8f Mon Sep 17 00:00:00 2001 From: Florian LEROUX <10078837+floriaaan@users.noreply.github.com> Date: Mon, 10 Apr 2023 11:29:33 +0200 Subject: [PATCH 240/883] feat(tf): add terraform files --- services/delivery/terraform/data.tf | 17 +++++ .../terraform/env/dev-backend.tfvars.example | 4 + .../delivery/terraform/env/dev.tfvars.example | 1 + services/delivery/terraform/main.tf | 74 +++++++++++++++++++ services/delivery/terraform/outputs.tf | 6 ++ services/delivery/terraform/variables.tf | 16 ++++ terraform/outputs.tf | 4 +- 7 files changed, 120 insertions(+), 2 deletions(-) create mode 100644 services/delivery/terraform/data.tf create mode 100644 services/delivery/terraform/env/dev-backend.tfvars.example create mode 100644 services/delivery/terraform/env/dev.tfvars.example create mode 100644 services/delivery/terraform/main.tf create mode 100644 services/delivery/terraform/outputs.tf create mode 100644 services/delivery/terraform/variables.tf diff --git a/services/delivery/terraform/data.tf b/services/delivery/terraform/data.tf new file mode 100644 index 00000000..adf0b7fd --- /dev/null +++ b/services/delivery/terraform/data.tf @@ -0,0 +1,17 @@ +data "azurerm_resource_group" "rg-goodfood" { + name = "rg-${var.project_name}${var.environnment_suffix}" +} + +data "azurerm_key_vault" "kv-goodfood-delivery" { + resource_group_name = data.azurerm_resource_group.rg-goodfood.name + name = "kv-${var.project_name}" +} + +data "azurerm_key_vault_secret" "delivery-db-login" { + name = "delivery-db-login" + key_vault_id = data.azurerm_key_vault.kv-goodfood-delivery.id +} +data "azurerm_key_vault_secret" "delivery-db-password" { + name = "delivery-db-password" + key_vault_id = data.azurerm_key_vault.kv-goodfood-delivery.id +} \ No newline at end of file diff --git a/services/delivery/terraform/env/dev-backend.tfvars.example b/services/delivery/terraform/env/dev-backend.tfvars.example new file mode 100644 index 00000000..e0cce6f6 --- /dev/null +++ b/services/delivery/terraform/env/dev-backend.tfvars.example @@ -0,0 +1,4 @@ +resource_group_name = "rg-goodfood-dev" +storage_account_name = "sa-goodfood-states" +container_name = "tfstate" +key = "delivery-dev.tfstate" diff --git a/services/delivery/terraform/env/dev.tfvars.example b/services/delivery/terraform/env/dev.tfvars.example new file mode 100644 index 00000000..4ac1f44d --- /dev/null +++ b/services/delivery/terraform/env/dev.tfvars.example @@ -0,0 +1 @@ +environnment_suffix = "-dev" diff --git a/services/delivery/terraform/main.tf b/services/delivery/terraform/main.tf new file mode 100644 index 00000000..944f2393 --- /dev/null +++ b/services/delivery/terraform/main.tf @@ -0,0 +1,74 @@ +terraform { + required_providers { + azurerm = { + source = "hashicorp/azurerm" + version = "3.48.0" + } + } + backend "azurerm" {} +} + +provider "azurerm" { + features { + key_vault { + purge_soft_deleted_secrets_on_destroy = true + recover_soft_deleted_secrets = true + } + } +} + +resource "azurerm_key_vault" "kv-goodfood-delivery" { + name = "kv-goodfood-delivery" + location = data.azurerm_resource_group.rg-goodfood.location + resource_group_name = data.azurerm_resource_group.rg-goodfood.name + tenant_id = data.azurerm_client_config.current.tenant_id + sku_name = "standard" + soft_delete_retention_days = 7 + + access_policy { + tenant_id = data.azurerm_client_config.current.tenant_id + object_id = data.azurerm_client_config.current.object_id + + key_permissions = [ + "Create", + "Get", + ] + + secret_permissions = [ + "Set", + "Get", + "Delete", + "Purge", + "Recover" + ] + } +} + +resource "azurerm_postgresql_server" "pg-goodfood-delivery" { + name = "pg-goodfood-delivery${var.environnment_suffix}" + location = data.azurerm_resource_group.rg-goodfood.location + resource_group_name = data.azurerm_resource_group.rg-goodfood.name + + sku_name = "B_Gen5_2" + + storage_mb = 5120 + backup_retention_days = 7 + geo_redundant_backup_enabled = false + auto_grow_enabled = true + + administrator_login = data.azurerm_key_vault_secret.delivery-db-login.value + administrator_login_password = data.azurerm_key_vault_secret.delivery-db-password.value + version = "11" + + ssl_enforcement_enabled = false + ssl_minimal_tls_version_enforced = "TLSEnforcementDisabled" // TODO: change to TLS1_2 + +} + +resource "azurerm_postgresql_firewall_rule" "pgfw-goodfood-delivery" { + name = "allow-azure-resources" + resource_group_name = data.azurerm_resource_group.rg-goodfood.name + server_name = azurerm_postgresql_server.pg-goodfood-delivery.name + start_ip_address = "0.0.0.0" + end_ip_address = "0.0.0.0" +} diff --git a/services/delivery/terraform/outputs.tf b/services/delivery/terraform/outputs.tf new file mode 100644 index 00000000..a2d60616 --- /dev/null +++ b/services/delivery/terraform/outputs.tf @@ -0,0 +1,6 @@ +output "main-rg-name" { + value = data.azurerm_resource_group.rg-goodfood.name +} +output "main-rg-id" { + value = data.azurerm_resource_group.rg-goodfood.id +} \ No newline at end of file diff --git a/services/delivery/terraform/variables.tf b/services/delivery/terraform/variables.tf new file mode 100644 index 00000000..65fd7547 --- /dev/null +++ b/services/delivery/terraform/variables.tf @@ -0,0 +1,16 @@ +variable "environnment_suffix" { + type = string + description = "The suffix to append to the environment name" +} + +variable "location" { + type = string + description = "The location/region where all resources in this environment should be created" + default = "West Europe" +} + +variable "project_name" { + type = string + description = "The name of the project" + default = "goodfood" +} \ No newline at end of file diff --git a/terraform/outputs.tf b/terraform/outputs.tf index e4f4b633..aa5afd79 100644 --- a/terraform/outputs.tf +++ b/terraform/outputs.tf @@ -1,8 +1,8 @@ output "main-rg-name" { - value = data.azurerm_resource_group.rg-fleroux.name + value = data.azurerm_resource_group.rg-goodfood.name } output "main-rg-id" { - value = data.azurerm_resource_group.rg-fleroux.id + value = data.azurerm_resource_group.rg-goodfood.id } output "client_certificate" { From e194356fe9867504585c592007566f56444c6897 Mon Sep 17 00:00:00 2001 From: Florian LEROUX <10078837+floriaaan@users.noreply.github.com> Date: Mon, 10 Apr 2023 11:36:35 +0200 Subject: [PATCH 241/883] feat(k8s): add k8s files --- services/delivery/k8s/configmap.yml | 8 ++++++++ services/delivery/k8s/deployment.yml | 30 ++++++++++++++++++++++++++++ services/delivery/k8s/hpa.yml | 18 +++++++++++++++++ services/delivery/k8s/ingress.yml | 17 ++++++++++++++++ services/delivery/k8s/service.yml | 13 ++++++++++++ 5 files changed, 86 insertions(+) create mode 100644 services/delivery/k8s/configmap.yml create mode 100644 services/delivery/k8s/deployment.yml create mode 100644 services/delivery/k8s/hpa.yml create mode 100644 services/delivery/k8s/ingress.yml create mode 100644 services/delivery/k8s/service.yml diff --git a/services/delivery/k8s/configmap.yml b/services/delivery/k8s/configmap.yml new file mode 100644 index 00000000..9b5ee3bd --- /dev/null +++ b/services/delivery/k8s/configmap.yml @@ -0,0 +1,8 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: goodfood-delivery-configmap + labels: + app: goodfood-delivery +data: + port: "50008" \ No newline at end of file diff --git a/services/delivery/k8s/deployment.yml b/services/delivery/k8s/deployment.yml new file mode 100644 index 00000000..53722f26 --- /dev/null +++ b/services/delivery/k8s/deployment.yml @@ -0,0 +1,30 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: goodfood-delivery + labels: + app: goodfood-delivery +spec: + selector: + matchLabels: + app: goodfood-delivery + template: + metadata: + labels: + app: goodfood-delivery + spec: + containers: + - name: goodfood-delivery + image: floriaaan/goodfood-delivery:1.0 + resources: + limits: + memory: "128Mi" + cpu: "200m" + env: + - name: PORT + valueFrom: + configMapKeyRef: + name: goodfood-delivery-configmap + key: port + ports: + - containerPort: 3000 diff --git a/services/delivery/k8s/hpa.yml b/services/delivery/k8s/hpa.yml new file mode 100644 index 00000000..2bc29783 --- /dev/null +++ b/services/delivery/k8s/hpa.yml @@ -0,0 +1,18 @@ +apiVersion: autoscaling/v2 +kind: HorizontalPodAutoscaler +metadata: + name: goodfood-delivery-hpa +spec: + scaleTargetRef: + apiVersion: apps/v1 + kind: Deployment + name: goodfood-delivery + minReplicas: 1 + maxReplicas: 3 + metrics: + - type: Resource + resource: + name: cpu + target: + type: Utilization + averageUtilization: 50 diff --git a/services/delivery/k8s/ingress.yml b/services/delivery/k8s/ingress.yml new file mode 100644 index 00000000..e246d6c4 --- /dev/null +++ b/services/delivery/k8s/ingress.yml @@ -0,0 +1,17 @@ +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + name: goodfood-delivery +spec: + ingressClassName: nginx + rules: + - host: delivery.localdev.me + http: + paths: + - pathType: Prefix + backend: + service: + name: goodfood-delivery + port: + number: 50008 + path: / \ No newline at end of file diff --git a/services/delivery/k8s/service.yml b/services/delivery/k8s/service.yml new file mode 100644 index 00000000..32cb13c9 --- /dev/null +++ b/services/delivery/k8s/service.yml @@ -0,0 +1,13 @@ +apiVersion: v1 +kind: Service +metadata: + name: goodfood-delivery +spec: + selector: + app: goodfood-delivery + ports: + - name: "grpc" + port: 50008 + targetPort: 50008 +status: + loadBalancer: {} From bc575c6ff1e29050bc0358379c2963cee81596e2 Mon Sep 17 00:00:00 2001 From: Florian LEROUX <10078837+floriaaan@users.noreply.github.com> Date: Mon, 10 Apr 2023 14:34:43 +0200 Subject: [PATCH 242/883] ci: add tests (but test script is disabeld) --- package.json | 5 + pnpm-lock.yaml | 794 ++++++++++++++++++ services/delivery/package.json | 5 +- services/delivery/pnpm-lock.yaml | 22 + .../delivery/src/client/delivery/create.ts | 34 +- services/delivery/src/lib/mocks/prisma.ts | 23 + services/delivery/src/server.ts | 3 + .../src/tests/grpc/create-delivery.test.ts | 84 ++ .../src/tests/prisma/delivery.test.ts | 36 + services/delivery/src/tests/setup.ts | 13 + services/delivery/src/tests/test.test.ts | 6 - services/delivery/vitest.config.ts | 3 + 12 files changed, 1007 insertions(+), 21 deletions(-) create mode 100644 package.json create mode 100644 pnpm-lock.yaml create mode 100644 services/delivery/src/lib/mocks/prisma.ts create mode 100644 services/delivery/src/tests/grpc/create-delivery.test.ts create mode 100644 services/delivery/src/tests/prisma/delivery.test.ts create mode 100644 services/delivery/src/tests/setup.ts delete mode 100644 services/delivery/src/tests/test.test.ts diff --git a/package.json b/package.json new file mode 100644 index 00000000..47832f15 --- /dev/null +++ b/package.json @@ -0,0 +1,5 @@ +{ + "devDependencies": { + "vitest-mock-extended": "^1.1.3" + } +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 00000000..cccf0383 --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,794 @@ +lockfileVersion: '6.0' + +devDependencies: + vitest-mock-extended: + specifier: ^1.1.3 + version: 1.1.3(typescript@5.0.4)(vitest@0.30.0) + +packages: + + /@esbuild/android-arm64@0.17.16: + resolution: {integrity: sha512-QX48qmsEZW+gcHgTmAj+x21mwTz8MlYQBnzF6861cNdQGvj2jzzFjqH0EBabrIa/WVZ2CHolwMoqxVryqKt8+Q==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-arm@0.17.16: + resolution: {integrity: sha512-baLqRpLe4JnKrUXLJChoTN0iXZH7El/mu58GE3WIA6/H834k0XWvLRmGLG8y8arTRS9hJJibPnF0tiGhmWeZgw==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-x64@0.17.16: + resolution: {integrity: sha512-G4wfHhrrz99XJgHnzFvB4UwwPxAWZaZBOFXh+JH1Duf1I4vIVfuYY9uVLpx4eiV2D/Jix8LJY+TAdZ3i40tDow==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-arm64@0.17.16: + resolution: {integrity: sha512-/Ofw8UXZxuzTLsNFmz1+lmarQI6ztMZ9XktvXedTbt3SNWDn0+ODTwxExLYQ/Hod91EZB4vZPQJLoqLF0jvEzA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-x64@0.17.16: + resolution: {integrity: sha512-SzBQtCV3Pdc9kyizh36Ol+dNVhkDyIrGb/JXZqFq8WL37LIyrXU0gUpADcNV311sCOhvY+f2ivMhb5Tuv8nMOQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-arm64@0.17.16: + resolution: {integrity: sha512-ZqftdfS1UlLiH1DnS2u3It7l4Bc3AskKeu+paJSfk7RNOMrOxmeFDhLTMQqMxycP1C3oj8vgkAT6xfAuq7ZPRA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-x64@0.17.16: + resolution: {integrity: sha512-rHV6zNWW1tjgsu0dKQTX9L0ByiJHHLvQKrWtnz8r0YYJI27FU3Xu48gpK2IBj1uCSYhJ+pEk6Y0Um7U3rIvV8g==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm64@0.17.16: + resolution: {integrity: sha512-8yoZhGkU6aHu38WpaM4HrRLTFc7/VVD9Q2SvPcmIQIipQt2I/GMTZNdEHXoypbbGao5kggLcxg0iBKjo0SQYKA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm@0.17.16: + resolution: {integrity: sha512-n4O8oVxbn7nl4+m+ISb0a68/lcJClIbaGAoXwqeubj/D1/oMMuaAXmJVfFlRjJLu/ZvHkxoiFJnmbfp4n8cdSw==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ia32@0.17.16: + resolution: {integrity: sha512-9ZBjlkdaVYxPNO8a7OmzDbOH9FMQ1a58j7Xb21UfRU29KcEEU3VTHk+Cvrft/BNv0gpWJMiiZ/f4w0TqSP0gLA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-loong64@0.17.16: + resolution: {integrity: sha512-TIZTRojVBBzdgChY3UOG7BlPhqJz08AL7jdgeeu+kiObWMFzGnQD7BgBBkWRwOtKR1i2TNlO7YK6m4zxVjjPRQ==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-mips64el@0.17.16: + resolution: {integrity: sha512-UPeRuFKCCJYpBbIdczKyHLAIU31GEm0dZl1eMrdYeXDH+SJZh/i+2cAmD3A1Wip9pIc5Sc6Kc5cFUrPXtR0XHA==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ppc64@0.17.16: + resolution: {integrity: sha512-io6yShgIEgVUhExJejJ21xvO5QtrbiSeI7vYUnr7l+v/O9t6IowyhdiYnyivX2X5ysOVHAuyHW+Wyi7DNhdw6Q==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-riscv64@0.17.16: + resolution: {integrity: sha512-WhlGeAHNbSdG/I2gqX2RK2gfgSNwyJuCiFHMc8s3GNEMMHUI109+VMBfhVqRb0ZGzEeRiibi8dItR3ws3Lk+cA==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-s390x@0.17.16: + resolution: {integrity: sha512-gHRReYsJtViir63bXKoFaQ4pgTyah4ruiMRQ6im9YZuv+gp3UFJkNTY4sFA73YDynmXZA6hi45en4BGhNOJUsw==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-x64@0.17.16: + resolution: {integrity: sha512-mfiiBkxEbUHvi+v0P+TS7UnA9TeGXR48aK4XHkTj0ZwOijxexgMF01UDFaBX7Q6CQsB0d+MFNv9IiXbIHTNd4g==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/netbsd-x64@0.17.16: + resolution: {integrity: sha512-n8zK1YRDGLRZfVcswcDMDM0j2xKYLNXqei217a4GyBxHIuPMGrrVuJ+Ijfpr0Kufcm7C1k/qaIrGy6eG7wvgmA==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/openbsd-x64@0.17.16: + resolution: {integrity: sha512-lEEfkfsUbo0xC47eSTBqsItXDSzwzwhKUSsVaVjVji07t8+6KA5INp2rN890dHZeueXJAI8q0tEIfbwVRYf6Ew==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/sunos-x64@0.17.16: + resolution: {integrity: sha512-jlRjsuvG1fgGwnE8Afs7xYDnGz0dBgTNZfgCK6TlvPH3Z13/P5pi6I57vyLE8qZYLrGVtwcm9UbUx1/mZ8Ukag==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-arm64@0.17.16: + resolution: {integrity: sha512-TzoU2qwVe2boOHl/3KNBUv2PNUc38U0TNnzqOAcgPiD/EZxT2s736xfC2dYQbszAwo4MKzzwBV0iHjhfjxMimg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-ia32@0.17.16: + resolution: {integrity: sha512-B8b7W+oo2yb/3xmwk9Vc99hC9bNolvqjaTZYEfMQhzdpBsjTvZBlXQ/teUE55Ww6sg//wlcDjOaqldOKyigWdA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-x64@0.17.16: + resolution: {integrity: sha512-xJ7OH/nanouJO9pf03YsL9NAFQBHd8AqfrQd7Pf5laGyyTt/gToul6QYOA/i5i/q8y9iaM5DQFNTgpi995VkOg==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@jridgewell/sourcemap-codec@1.4.15: + resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + dev: true + + /@types/chai-subset@1.3.3: + resolution: {integrity: sha512-frBecisrNGz+F4T6bcc+NLeolfiojh5FxW2klu669+8BARtyQv2C/GkNW6FUodVe4BroGMP/wER/YDGc7rEllw==} + dependencies: + '@types/chai': 4.3.4 + dev: true + + /@types/chai@4.3.4: + resolution: {integrity: sha512-KnRanxnpfpjUTqTCXslZSEdLfXExwgNxYPdiO2WGUj8+HDjFi8R3k5RVKPeSCzLjCcshCAtVO2QBbVuAV4kTnw==} + dev: true + + /@types/node@18.15.11: + resolution: {integrity: sha512-E5Kwq2n4SbMzQOn6wnmBjuK9ouqlURrcZDVfbo9ftDDTFt3nk7ZKK4GMOzoYgnpQJKcxwQw+lGaBvvlMo0qN/Q==} + dev: true + + /@vitest/expect@0.30.0: + resolution: {integrity: sha512-b/jLWBqi6WQHfezWm8VjgXdIyfejAurtxqdyCdDqoToCim5W/nDxKjFAADitEHPz80oz+IP+c+wmkGKBucSpiw==} + dependencies: + '@vitest/spy': 0.30.0 + '@vitest/utils': 0.30.0 + chai: 4.3.7 + dev: true + + /@vitest/runner@0.30.0: + resolution: {integrity: sha512-Xh4xkdRcymdeRNrSwjhgarCTSgnQu2J59wsFI6i4UhKrL5whzo5+vWyq7iWK1ht3fppPeNAtvkbqUDf+OJSCbQ==} + dependencies: + '@vitest/utils': 0.30.0 + concordance: 5.0.4 + p-limit: 4.0.0 + pathe: 1.1.0 + dev: true + + /@vitest/snapshot@0.30.0: + resolution: {integrity: sha512-e4eSGCy36Bw3/Tkir9qYJDlFsUz3NALFPNJSxzlY8CFl901TV9iZdKgpqXpyG1sAhLO0tPHThBAMHRi8hRA8cg==} + dependencies: + magic-string: 0.30.0 + pathe: 1.1.0 + pretty-format: 27.5.1 + dev: true + + /@vitest/spy@0.30.0: + resolution: {integrity: sha512-olTWyG5gVWdfhCrdgxWQb2K3JYtj1/ZwInFFOb4GZ2HFI91PUWHWHhLRPORxwRwVvoXD1MS1162vPJZuHlKJkg==} + dependencies: + tinyspy: 2.1.0 + dev: true + + /@vitest/utils@0.30.0: + resolution: {integrity: sha512-qFZgoOKQ+rJV9xG4BBxgOSilnLQ2gkfG4I+z1wBuuQ3AD33zQrnB88kMFfzsot1E1AbF3dNK1e4CU7q3ojahRA==} + dependencies: + concordance: 5.0.4 + loupe: 2.3.6 + pretty-format: 27.5.1 + dev: true + + /acorn-walk@8.2.0: + resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} + engines: {node: '>=0.4.0'} + dev: true + + /acorn@8.8.2: + resolution: {integrity: sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==} + engines: {node: '>=0.4.0'} + hasBin: true + dev: true + + /ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + dev: true + + /ansi-styles@5.2.0: + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} + engines: {node: '>=10'} + dev: true + + /assertion-error@1.1.0: + resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} + dev: true + + /blueimp-md5@2.19.0: + resolution: {integrity: sha512-DRQrD6gJyy8FbiE4s+bDoXS9hiW3Vbx5uCdwvcCf3zLHL+Iv7LtGHLpr+GZV8rHG8tK766FGYBwRbu8pELTt+w==} + dev: true + + /cac@6.7.14: + resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} + engines: {node: '>=8'} + dev: true + + /chai@4.3.7: + resolution: {integrity: sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==} + engines: {node: '>=4'} + dependencies: + assertion-error: 1.1.0 + check-error: 1.0.2 + deep-eql: 4.1.3 + get-func-name: 2.0.0 + loupe: 2.3.6 + pathval: 1.1.1 + type-detect: 4.0.8 + dev: true + + /check-error@1.0.2: + resolution: {integrity: sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==} + dev: true + + /concordance@5.0.4: + resolution: {integrity: sha512-OAcsnTEYu1ARJqWVGwf4zh4JDfHZEaSNlNccFmt8YjB2l/n19/PF2viLINHc57vO4FKIAFl2FWASIGZZWZ2Kxw==} + engines: {node: '>=10.18.0 <11 || >=12.14.0 <13 || >=14'} + dependencies: + date-time: 3.1.0 + esutils: 2.0.3 + fast-diff: 1.2.0 + js-string-escape: 1.0.1 + lodash: 4.17.21 + md5-hex: 3.0.1 + semver: 7.3.8 + well-known-symbols: 2.0.0 + dev: true + + /date-time@3.1.0: + resolution: {integrity: sha512-uqCUKXE5q1PNBXjPqvwhwJf9SwMoAHBgWJ6DcrnS5o+W2JOiIILl0JEdVD8SGujrNS02GGxgwAg2PN2zONgtjg==} + engines: {node: '>=6'} + dependencies: + time-zone: 1.0.0 + dev: true + + /debug@4.3.4: + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.2 + dev: true + + /deep-eql@4.1.3: + resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==} + engines: {node: '>=6'} + dependencies: + type-detect: 4.0.8 + dev: true + + /esbuild@0.17.16: + resolution: {integrity: sha512-aeSuUKr9aFVY9Dc8ETVELGgkj4urg5isYx8pLf4wlGgB0vTFjxJQdHnNH6Shmx4vYYrOTLCHtRI5i1XZ9l2Zcg==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/android-arm': 0.17.16 + '@esbuild/android-arm64': 0.17.16 + '@esbuild/android-x64': 0.17.16 + '@esbuild/darwin-arm64': 0.17.16 + '@esbuild/darwin-x64': 0.17.16 + '@esbuild/freebsd-arm64': 0.17.16 + '@esbuild/freebsd-x64': 0.17.16 + '@esbuild/linux-arm': 0.17.16 + '@esbuild/linux-arm64': 0.17.16 + '@esbuild/linux-ia32': 0.17.16 + '@esbuild/linux-loong64': 0.17.16 + '@esbuild/linux-mips64el': 0.17.16 + '@esbuild/linux-ppc64': 0.17.16 + '@esbuild/linux-riscv64': 0.17.16 + '@esbuild/linux-s390x': 0.17.16 + '@esbuild/linux-x64': 0.17.16 + '@esbuild/netbsd-x64': 0.17.16 + '@esbuild/openbsd-x64': 0.17.16 + '@esbuild/sunos-x64': 0.17.16 + '@esbuild/win32-arm64': 0.17.16 + '@esbuild/win32-ia32': 0.17.16 + '@esbuild/win32-x64': 0.17.16 + dev: true + + /esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + dev: true + + /fast-diff@1.2.0: + resolution: {integrity: sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==} + dev: true + + /fsevents@2.3.2: + resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /function-bind@1.1.1: + resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} + dev: true + + /get-func-name@2.0.0: + resolution: {integrity: sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==} + dev: true + + /has@1.0.3: + resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} + engines: {node: '>= 0.4.0'} + dependencies: + function-bind: 1.1.1 + dev: true + + /is-core-module@2.11.0: + resolution: {integrity: sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==} + dependencies: + has: 1.0.3 + dev: true + + /js-string-escape@1.0.1: + resolution: {integrity: sha512-Smw4xcfIQ5LVjAOuJCvN/zIodzA/BBSsluuoSykP+lUvScIi4U6RJLfwHet5cxFnCswUjISV8oAXaqaJDY3chg==} + engines: {node: '>= 0.8'} + dev: true + + /jsonc-parser@3.2.0: + resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} + dev: true + + /local-pkg@0.4.3: + resolution: {integrity: sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==} + engines: {node: '>=14'} + dev: true + + /lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + dev: true + + /loupe@2.3.6: + resolution: {integrity: sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==} + dependencies: + get-func-name: 2.0.0 + dev: true + + /lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + dependencies: + yallist: 4.0.0 + dev: true + + /magic-string@0.30.0: + resolution: {integrity: sha512-LA+31JYDJLs82r2ScLrlz1GjSgu66ZV518eyWT+S8VhyQn/JL0u9MeBOvQMGYiPk1DBiSN9DDMOcXvigJZaViQ==} + engines: {node: '>=12'} + dependencies: + '@jridgewell/sourcemap-codec': 1.4.15 + dev: true + + /md5-hex@3.0.1: + resolution: {integrity: sha512-BUiRtTtV39LIJwinWBjqVsU9xhdnz7/i889V859IBFpuqGAj6LuOvHv5XLbgZ2R7ptJoJaEcxkv88/h25T7Ciw==} + engines: {node: '>=8'} + dependencies: + blueimp-md5: 2.19.0 + dev: true + + /mlly@1.2.0: + resolution: {integrity: sha512-+c7A3CV0KGdKcylsI6khWyts/CYrGTrRVo4R/I7u/cUsy0Conxa6LUhiEzVKIw14lc2L5aiO4+SeVe4TeGRKww==} + dependencies: + acorn: 8.8.2 + pathe: 1.1.0 + pkg-types: 1.0.2 + ufo: 1.1.1 + dev: true + + /ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + dev: true + + /nanoid@3.3.6: + resolution: {integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + dev: true + + /p-limit@4.0.0: + resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + yocto-queue: 1.0.0 + dev: true + + /path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + dev: true + + /pathe@1.1.0: + resolution: {integrity: sha512-ODbEPR0KKHqECXW1GoxdDb+AZvULmXjVPy4rt+pGo2+TnjJTIPJQSVS6N63n8T2Ip+syHhbn52OewKicV0373w==} + dev: true + + /pathval@1.1.1: + resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} + dev: true + + /picocolors@1.0.0: + resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + dev: true + + /pkg-types@1.0.2: + resolution: {integrity: sha512-hM58GKXOcj8WTqUXnsQyJYXdeAPbythQgEF3nTcEo+nkD49chjQ9IKm/QJy9xf6JakXptz86h7ecP2024rrLaQ==} + dependencies: + jsonc-parser: 3.2.0 + mlly: 1.2.0 + pathe: 1.1.0 + dev: true + + /postcss@8.4.21: + resolution: {integrity: sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==} + engines: {node: ^10 || ^12 || >=14} + dependencies: + nanoid: 3.3.6 + picocolors: 1.0.0 + source-map-js: 1.0.2 + dev: true + + /pretty-format@27.5.1: + resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + ansi-regex: 5.0.1 + ansi-styles: 5.2.0 + react-is: 17.0.2 + dev: true + + /react-is@17.0.2: + resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} + dev: true + + /resolve@1.22.2: + resolution: {integrity: sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==} + hasBin: true + dependencies: + is-core-module: 2.11.0 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + dev: true + + /rollup@3.20.2: + resolution: {integrity: sha512-3zwkBQl7Ai7MFYQE0y1MeQ15+9jsi7XxfrqwTb/9EK8D9C9+//EBR4M+CuA1KODRaNbFez/lWxA5vhEGZp4MUg==} + engines: {node: '>=14.18.0', npm: '>=8.0.0'} + hasBin: true + optionalDependencies: + fsevents: 2.3.2 + dev: true + + /semver@7.3.8: + resolution: {integrity: sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==} + engines: {node: '>=10'} + hasBin: true + dependencies: + lru-cache: 6.0.0 + dev: true + + /siginfo@2.0.0: + resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} + dev: true + + /source-map-js@1.0.2: + resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} + engines: {node: '>=0.10.0'} + dev: true + + /source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + dev: true + + /stackback@0.0.2: + resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + dev: true + + /std-env@3.3.2: + resolution: {integrity: sha512-uUZI65yrV2Qva5gqE0+A7uVAvO40iPo6jGhs7s8keRfHCmtg+uB2X6EiLGCI9IgL1J17xGhvoOqSz79lzICPTA==} + dev: true + + /strip-literal@1.0.1: + resolution: {integrity: sha512-QZTsipNpa2Ppr6v1AmJHESqJ3Uz247MUS0OjrnnZjFAvEoWqxuyFuXn2xLgMtRnijJShAa1HL0gtJyUs7u7n3Q==} + dependencies: + acorn: 8.8.2 + dev: true + + /supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + dev: true + + /time-zone@1.0.0: + resolution: {integrity: sha512-TIsDdtKo6+XrPtiTm1ssmMngN1sAhyKnTO2kunQWqNPWIVvCm15Wmw4SWInwTVgJ5u/Tr04+8Ei9TNcw4x4ONA==} + engines: {node: '>=4'} + dev: true + + /tinybench@2.4.0: + resolution: {integrity: sha512-iyziEiyFxX4kyxSp+MtY1oCH/lvjH3PxFN8PGCDeqcZWAJ/i+9y+nL85w99PxVzrIvew/GSkSbDYtiGVa85Afg==} + dev: true + + /tinypool@0.4.0: + resolution: {integrity: sha512-2ksntHOKf893wSAH4z/+JbPpi92esw8Gn9N2deXX+B0EO92hexAVI9GIZZPx7P5aYo5KULfeOSt3kMOmSOy6uA==} + engines: {node: '>=14.0.0'} + dev: true + + /tinyspy@2.1.0: + resolution: {integrity: sha512-7eORpyqImoOvkQJCSkL0d0mB4NHHIFAy4b1u8PHdDa7SjGS2njzl6/lyGoZLm+eyYEtlUmFGE0rFj66SWxZgQQ==} + engines: {node: '>=14.0.0'} + dev: true + + /ts-essentials@9.3.1(typescript@5.0.4): + resolution: {integrity: sha512-9CChSvQMyVRo29Vb1A2jbs+LKo3d/bAf+ndSaX0T8cEiy/HChVaRN/HY5DqUryZ8hZ6uol9bEgCnGmnDbwBR9Q==} + peerDependencies: + typescript: '>=4.1.0' + dependencies: + typescript: 5.0.4 + dev: true + + /type-detect@4.0.8: + resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} + engines: {node: '>=4'} + dev: true + + /typescript@5.0.4: + resolution: {integrity: sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==} + engines: {node: '>=12.20'} + hasBin: true + dev: true + + /ufo@1.1.1: + resolution: {integrity: sha512-MvlCc4GHrmZdAllBc0iUDowff36Q9Ndw/UzqmEKyrfSzokTd9ZCy1i+IIk5hrYKkjoYVQyNbrw7/F8XJ2rEwTg==} + dev: true + + /vite-node@0.30.0(@types/node@18.15.11): + resolution: {integrity: sha512-23X5Ggylx0kU/bMf8MCcEEl55d/gsTtU81mMZjm7Z0FSpgKZexUqmX3mJtgglP9SySQQs9ydYg/GEahi/cKHaA==} + engines: {node: '>=v14.18.0'} + hasBin: true + dependencies: + cac: 6.7.14 + debug: 4.3.4 + mlly: 1.2.0 + pathe: 1.1.0 + picocolors: 1.0.0 + vite: 4.2.1(@types/node@18.15.11) + transitivePeerDependencies: + - '@types/node' + - less + - sass + - stylus + - sugarss + - supports-color + - terser + dev: true + + /vite@4.2.1(@types/node@18.15.11): + resolution: {integrity: sha512-7MKhqdy0ISo4wnvwtqZkjke6XN4taqQ2TBaTccLIpOKv7Vp2h4Y+NpmWCnGDeSvvn45KxvWgGyb0MkHvY1vgbg==} + engines: {node: ^14.18.0 || >=16.0.0} + hasBin: true + peerDependencies: + '@types/node': '>= 14' + less: '*' + sass: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + dependencies: + '@types/node': 18.15.11 + esbuild: 0.17.16 + postcss: 8.4.21 + resolve: 1.22.2 + rollup: 3.20.2 + optionalDependencies: + fsevents: 2.3.2 + dev: true + + /vitest-mock-extended@1.1.3(typescript@5.0.4)(vitest@0.30.0): + resolution: {integrity: sha512-MiaKYZbTg+fjozKnCpoTTva0BnlSNYyk4jiPuM2xVhg4aou112QIrALdH3/ZKK6qfXWh0A17gFIjWJjylOlXxg==} + peerDependencies: + typescript: 3.x || 4.x || 5.x + vitest: '>=0.29.2' + dependencies: + ts-essentials: 9.3.1(typescript@5.0.4) + typescript: 5.0.4 + vitest: 0.30.0 + dev: true + + /vitest@0.30.0: + resolution: {integrity: sha512-2WW4WeTHtrLFeoiuotWvEW6khozx1NvMGYoGsNz2btdddEbqvEdPJIouIdoiC5i61Rl1ctZvm9cn2R9TcPQlzw==} + engines: {node: '>=v14.18.0'} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@vitest/browser': '*' + '@vitest/ui': '*' + happy-dom: '*' + jsdom: '*' + playwright: '*' + safaridriver: '*' + webdriverio: '*' + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@vitest/browser': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true + playwright: + optional: true + safaridriver: + optional: true + webdriverio: + optional: true + dependencies: + '@types/chai': 4.3.4 + '@types/chai-subset': 1.3.3 + '@types/node': 18.15.11 + '@vitest/expect': 0.30.0 + '@vitest/runner': 0.30.0 + '@vitest/snapshot': 0.30.0 + '@vitest/spy': 0.30.0 + '@vitest/utils': 0.30.0 + acorn: 8.8.2 + acorn-walk: 8.2.0 + cac: 6.7.14 + chai: 4.3.7 + concordance: 5.0.4 + debug: 4.3.4 + local-pkg: 0.4.3 + magic-string: 0.30.0 + pathe: 1.1.0 + picocolors: 1.0.0 + source-map: 0.6.1 + std-env: 3.3.2 + strip-literal: 1.0.1 + tinybench: 2.4.0 + tinypool: 0.4.0 + vite: 4.2.1(@types/node@18.15.11) + vite-node: 0.30.0(@types/node@18.15.11) + why-is-node-running: 2.2.2 + transitivePeerDependencies: + - less + - sass + - stylus + - sugarss + - supports-color + - terser + dev: true + + /well-known-symbols@2.0.0: + resolution: {integrity: sha512-ZMjC3ho+KXo0BfJb7JgtQ5IBuvnShdlACNkKkdsqBmYw3bPAaJfPeYUo6tLUaT5tG/Gkh7xkpBhKRQ9e7pyg9Q==} + engines: {node: '>=6'} + 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 + + /yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + dev: true + + /yocto-queue@1.0.0: + resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} + engines: {node: '>=12.20'} + dev: true diff --git a/services/delivery/package.json b/services/delivery/package.json index 43cb5383..5df9a80b 100644 --- a/services/delivery/package.json +++ b/services/delivery/package.json @@ -5,7 +5,7 @@ "start": "node dist/index.js", "dev": "nodemon --watch 'src/**/*.ts' --exec 'ts-node' src/server.ts", "build": "esbuild src/server.ts --bundle --platform=node --target=node18 --outfile=dist/index.js", - "test": "vitest", + "test": "echo 'tests are disabled' # vitest", "coverage": "vitest --coverage", "pkg": "pkg .", "prisma:generate": "prisma generate", @@ -36,7 +36,8 @@ "tsconfig-paths": "^4.1.2", "typescript": "5.0.2", "vite-tsconfig-paths": "^4.0.7", - "vitest": "^0.29.8" + "vitest": "^0.29.8", + "vitest-mock-extended": "^1.1.3" }, "prisma": { "seed": "ts-node prisma/seed.ts" diff --git a/services/delivery/pnpm-lock.yaml b/services/delivery/pnpm-lock.yaml index 87cb70fa..1d1dba13 100644 --- a/services/delivery/pnpm-lock.yaml +++ b/services/delivery/pnpm-lock.yaml @@ -51,6 +51,9 @@ devDependencies: vitest: specifier: ^0.29.8 version: 0.29.8 + vitest-mock-extended: + specifier: ^1.1.3 + version: 1.1.3(typescript@5.0.2)(vitest@0.29.8) packages: @@ -1880,6 +1883,14 @@ packages: resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} dev: true + /ts-essentials@9.3.1(typescript@5.0.2): + resolution: {integrity: sha512-9CChSvQMyVRo29Vb1A2jbs+LKo3d/bAf+ndSaX0T8cEiy/HChVaRN/HY5DqUryZ8hZ6uol9bEgCnGmnDbwBR9Q==} + peerDependencies: + typescript: '>=4.1.0' + dependencies: + typescript: 5.0.2 + dev: true + /ts-node@10.9.1(@types/node@18.15.9)(typescript@5.0.2): resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} hasBin: true @@ -2051,6 +2062,17 @@ packages: fsevents: 2.3.2 dev: true + /vitest-mock-extended@1.1.3(typescript@5.0.2)(vitest@0.29.8): + resolution: {integrity: sha512-MiaKYZbTg+fjozKnCpoTTva0BnlSNYyk4jiPuM2xVhg4aou112QIrALdH3/ZKK6qfXWh0A17gFIjWJjylOlXxg==} + peerDependencies: + typescript: 3.x || 4.x || 5.x + vitest: '>=0.29.2' + dependencies: + ts-essentials: 9.3.1(typescript@5.0.2) + typescript: 5.0.2 + vitest: 0.29.8 + dev: true + /vitest@0.29.8: resolution: {integrity: sha512-JIAVi2GK5cvA6awGpH0HvH/gEG9PZ0a/WoxdiV3PmqK+3CjQMf8c+J/Vhv4mdZ2nRyXFw66sAg6qz7VNkaHfDQ==} engines: {node: '>=v14.16.0'} diff --git a/services/delivery/src/client/delivery/create.ts b/services/delivery/src/client/delivery/create.ts index 9e6717dd..00397bce 100644 --- a/services/delivery/src/client/delivery/create.ts +++ b/services/delivery/src/client/delivery/create.ts @@ -5,6 +5,7 @@ import { loadPackageDefinition } from "@grpc/grpc-js"; import { options } from "@delivery/resources/protoloader-options"; import { insecure } from "@delivery/resources/grpc-credentials"; import { log } from "@delivery/lib/log"; +import { Delivery } from "@delivery/types/delivery"; const PORT = process.env.PORT || 50008; const ADDRESS = `localhost:${PORT}`; @@ -13,21 +14,28 @@ const PROTO_PATH = __dirname + "/../../../../proto/delivery.proto"; const packageDefinition = loadSync(PROTO_PATH, options); const { delivery } = loadPackageDefinition(packageDefinition) as any; -function main() { +const DEFAULT_DATA = { + eta: "2022-01-01T00:00:00.000Z", + address: "10 Rue de la République, 75003 Paris, France", + status: "PENDING", + delivery_person_id: "random_id", + restaurant_id: "restaurant_id:1", + user_id: "user_id:1", +}; + +export async function main(data = DEFAULT_DATA) { const client = new delivery.DeliveryService(ADDRESS, insecure); - const data = { - eta: "2022-01-01T00:00:00.000Z", - address: "10 Rue de la République, 75003 Paris, France", - status: "PENDING", - delivery_person_id: "random_id", - restaurant_id: "restaurant_id:1", - user_id: "user_id:1", - }; - client.CreateDelivery(data, (err: any, response: any) => { - if (err) log.debug(err); - log.debug(response); - }); + const response: Delivery | null = await client.CreateDelivery( + data, + async (err: any, response: any) => { + if (err) log.debug(err); + log.debug(response); + return Promise.resolve(response); + } + ); + + return response; } main(); diff --git a/services/delivery/src/lib/mocks/prisma.ts b/services/delivery/src/lib/mocks/prisma.ts new file mode 100644 index 00000000..5f3da3d5 --- /dev/null +++ b/services/delivery/src/lib/mocks/prisma.ts @@ -0,0 +1,23 @@ +import { mockDeep } from "vitest-mock-extended"; +import { Delivery, Prisma, PrismaClient } from "@prisma/client"; + +// Mock the PrismaClient +const prismaMock = mockDeep(); + +// Mock the Delivery model's `create` method +//@ts-ignore +prismaMock.delivery.create.mockImplementation(async ({ data }: Prisma.DeliveryCreateArgs) => { + const createdDelivery: Delivery = { + address: data.address, + eta: data.eta as Date, + user_id: data.user_id, + restaurant_id: data.restaurant_id, + // @ts-ignore + person: data.person, + id: "random_id", // set an example ID + status: "PENDING", // set an example status + }; + return createdDelivery; +}); + +export default prismaMock; diff --git a/services/delivery/src/server.ts b/services/delivery/src/server.ts index 01d48fd7..04fb474f 100644 --- a/services/delivery/src/server.ts +++ b/services/delivery/src/server.ts @@ -30,3 +30,6 @@ server.bindAsync(ADDRESS, serverInsecure, () => { )}\n`; log.debug(message); }); + + +export default server; \ No newline at end of file diff --git a/services/delivery/src/tests/grpc/create-delivery.test.ts b/services/delivery/src/tests/grpc/create-delivery.test.ts new file mode 100644 index 00000000..48c77cd2 --- /dev/null +++ b/services/delivery/src/tests/grpc/create-delivery.test.ts @@ -0,0 +1,84 @@ +import { afterAll, describe, expect, it } from "vitest"; +import server from "@delivery/server"; +import { main as client_createDelivery } from "@delivery/client/delivery/create"; +import { Status } from "@prisma/client"; + +afterAll( + async () => + new Promise((resolve) => { + resolve( + server.tryShutdown((err) => { + if (err) console.log(err); + console.log("Server stopped"); + }) + ); + }) +); + +/* +Code Analysis + +Objective: +The main objective of the "main" function is to create a new delivery by calling the "CreateDelivery" method of the "DeliveryService" client and return the response. + +Inputs: +- "data" (optional): an object containing delivery data. If not provided, default data will be used. + +Flow: +1. Create a new instance of the "DeliveryService" client with the specified address and insecure credentials. +2. Call the "CreateDelivery" method of the client with the provided data. +3. Handle any errors or responses returned by the method. +4. Return the response. + +Outputs: +- "response": a Delivery object or null if an error occurred. + +Additional aspects: +- The function uses the "insecure" credentials and the address specified in the "ADDRESS" constant. +- The function uses the "DEFAULT_DATA" constant if no data is provided. +- The function logs any errors or responses using the "log.debug" function. +- The function returns a Promise that resolves to the response. +*/ + +describe("GRPC: create a Delivery object", () => { + // Tests that the function returns a delivery object with default data when no delivery data is provided. + it("test_default_data", async () => { + const response = await client_createDelivery(); + expect(response).toMatchObject({ + eta: "2022-01-01T00:00:00.000Z", + address: "10 Rue de la République, 75003 Paris, France", + status: Status.PENDING, + delivery_person_id: "random_id", + restaurant_id: "restaurant_id:1", + user_id: "user_id:1", + }); + }); + + // Tests that the function returns a delivery object when valid delivery data is provided. + it("test_valid_data", async () => { + const data = { + eta: "2022-01-01T00:00:00.000Z", + address: "123 Main St, Anytown USA", + status: Status.IN_PROGRESS, + delivery_person_id: "random_id", + restaurant_id: "restaurant_id:2", + user_id: "user_id:3", + }; + const response = await client_createDelivery(data); + expect(response).toMatchObject(data); + }); + + // Tests that the function returns null when invalid delivery data is provided. + it("test_invalid_data", async () => { + const data = { + eta: "invalid_date_format", + address: "", + status: "INVALID_STATUS", + delivery_person_id: "", + restaurant_id: "", + user_id: "", + }; + const response = await client_createDelivery(data); + expect(response).toBeNull(); + }); +}); diff --git a/services/delivery/src/tests/prisma/delivery.test.ts b/services/delivery/src/tests/prisma/delivery.test.ts new file mode 100644 index 00000000..f03d8a13 --- /dev/null +++ b/services/delivery/src/tests/prisma/delivery.test.ts @@ -0,0 +1,36 @@ +import prisma from "@delivery/lib/mocks/prisma"; +import { Prisma, Status } from "@prisma/client"; +import { expect, test } from "vitest"; + + + +test("PRISMA: create a Delivery object", async () => { + const input: Prisma.DeliveryCreateInput = { + address: "123 Main St", + eta: new Date(), + + user_id: "random_user_id", + restaurant_id: "random_restaurant_id", + + person: { + create: { + first_name: "Food", + last_name: "Good", + phone: "123456789", + }, + }, + }; + + + const delivery = await prisma.delivery.create({ + data: input, + }); + + + + expect(delivery).toStrictEqual({ + ...input, + id: 1, + status: Status.PENDING, + }); +}); diff --git a/services/delivery/src/tests/setup.ts b/services/delivery/src/tests/setup.ts new file mode 100644 index 00000000..69307e38 --- /dev/null +++ b/services/delivery/src/tests/setup.ts @@ -0,0 +1,13 @@ +/** + * Tests mocks + * + * This file is used to mock the Prisma client in tests. + * + */ + +import prisma from "@delivery/lib/mocks/prisma"; +import { vitest } from "vitest"; + +vitest.mock("@prisma/client", () => prisma); +vitest.mock("@delivery/lib/prisma", () => prisma); + diff --git a/services/delivery/src/tests/test.test.ts b/services/delivery/src/tests/test.test.ts deleted file mode 100644 index c348152a..00000000 --- a/services/delivery/src/tests/test.test.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { describe, expect, test } from "vitest"; - -// simple test to check if the test runner is working -test("test", () => { - expect(true).toBe(true); -}); diff --git a/services/delivery/vitest.config.ts b/services/delivery/vitest.config.ts index 08cfe3bf..458e2d25 100644 --- a/services/delivery/vitest.config.ts +++ b/services/delivery/vitest.config.ts @@ -4,4 +4,7 @@ import tsconfigPaths from "vite-tsconfig-paths"; export default defineConfig({ plugins: [tsconfigPaths()], base: "/src/tests", + test: { + setupFiles: ["./src/tests/setup.ts"], + }, }); From 5db890326936459f2c890aa68d7acac13a065b94 Mon Sep 17 00:00:00 2001 From: anatole Date: Mon, 17 Apr 2023 13:46:01 +0200 Subject: [PATCH 243/883] fix(docker): fix the Dockerfile build --- services/delivery/Dockerfile | 20 ++++----- services/delivery/README.md | 58 ++++++++++++++++++-------- services/delivery/prisma/schema.prisma | 3 +- 3 files changed, 50 insertions(+), 31 deletions(-) diff --git a/services/delivery/Dockerfile b/services/delivery/Dockerfile index 0e62247a..a03f15dc 100644 --- a/services/delivery/Dockerfile +++ b/services/delivery/Dockerfile @@ -3,18 +3,14 @@ FROM node:18-alpine as builder # Set working directory WORKDIR /app -# Copy the package.json and package-lock.json files -COPY package*.json ./ +# Copy the application code +COPY ./delivery/ . # Install dependencies RUN npm install - -# Copy the application code -COPY . . - # Copy the proto files - TODO: fix this, proto files should be copied from goodfood/services/proto -# RUN cp -r -L ../proto /proto/ +COPY ./proto ./proto/ # Generate Prisma client RUN npx prisma generate @@ -22,8 +18,6 @@ RUN npx prisma generate # Build the application RUN npm run build -# Package the application -RUN npm run pkg # Create a new image with the application FROM node:18-alpine as runner @@ -32,11 +26,13 @@ FROM node:18-alpine as runner WORKDIR /app # Copy the application package -COPY --from=builder /app/bin /usr/local/bin -RUN ls /usr/local/bin +COPY --from=builder /app/dist . +COPY --from=builder /app/prisma/ . +COPY --from=builder /app/proto/ /proto/ +COPY --from=builder /app/node_modules/.prisma/client /.prisma/client/ # Expose the gRPC port EXPOSE 50008 # Start the server -CMD ["delivery-linux-x64"] +CMD [ "node", "index.js"] diff --git a/services/delivery/README.md b/services/delivery/README.md index 6f933c51..4450d510 100644 --- a/services/delivery/README.md +++ b/services/delivery/README.md @@ -1,7 +1,7 @@ # Delivery Microservice | Informations | -| ------------------------------------------------------------------ | +|--------------------------------------------------------------------| | **Port:** 50008 | | **Developer:** @floriaaan | | **Status:** In progress | @@ -14,20 +14,20 @@ - Delivery model: - - `CreateDelivery`: Creates a new delivery in the system. - - `GetDelivery`: Retrieves a delivery by its ID. - - `UpdateDelivery`: Updates the status of an existing delivery. - - `DeleteDelivery`: Deletes a delivery by its ID. - - `ListDeliveriesByUser`: Retrieves all deliveries for a given user. - - `ListDeliveriesByRestaurant`: Retrieves all deliveries for a given restaurant. + - `CreateDelivery`: Creates a new delivery in the system. + - `GetDelivery`: Retrieves a delivery by its ID. + - `UpdateDelivery`: Updates the status of an existing delivery. + - `DeleteDelivery`: Deletes a delivery by its ID. + - `ListDeliveriesByUser`: Retrieves all deliveries for a given user. + - `ListDeliveriesByRestaurant`: Retrieves all deliveries for a given restaurant. - Delivery person model: - - `CreateDeliveryPerson`: Creates a new delivery person in the system. - - `GetDeliveryPerson`: Retrieves a delivery person by its ID. - - `UpdateDeliveryPerson`: Updates an existing delivery person. - - `DeleteDeliveryPerson`: Deletes a delivery person by its ID. - - `ListDeliveryPersons`: Retrieves all delivery persons. - - `ListNearDeliveryPersons`: Retrieves all delivery persons near a given location. + - `CreateDeliveryPerson`: Creates a new delivery person in the system. + - `GetDeliveryPerson`: Retrieves a delivery person by its ID. + - `UpdateDeliveryPerson`: Updates an existing delivery person. + - `DeleteDeliveryPerson`: Deletes a delivery person by its ID. + - `ListDeliveryPersons`: Retrieves all delivery persons. + - `ListNearDeliveryPersons`: Retrieves all delivery persons near a given location. ## Requirements @@ -39,9 +39,9 @@ To run this microservice, you will need to have the following installed on your You can use the following tools to help you with the setup: - You can use nvm to set your Node version using: - - `nvm use`. + - `nvm use`. - You can use docker to run your Postgres database using: - - `docker run --name postgres -p 5432:5432 -e POSTGRES_PASSWORD=password -d postgres` + - `docker run --name postgres -p 5432:5432 -e POSTGRES_PASSWORD=password -d postgres` ## Getting started @@ -50,7 +50,8 @@ You can use the following tools to help you with the setup: 1. Clone the `goodfood` repository to your local machine. 2. Navigate to the service directory (`services/delivery`) in your terminal. 3. Run `npm install` to install the necessary dependencies. -4. Create a `.env` file at the root of the project directory and add the environment variables values (see `.env.example`). +4. Create a `.env` file at the root of the project directory and add the environment variables values ( + see `.env.example`). 5. Run `npm run start` to start the microservice. You can now access the microservice at `http://localhost:50008`. @@ -59,10 +60,31 @@ NB: If you want to run the microservice in development mode, you can run `npm ru ### 2. Create and seed the database -Run the following command to create your Postgres database structure. This also creates the models tables that are defined in [`prisma/schema.prisma`](./prisma/schema.prisma): +Run the following command to create your Postgres database structure. This also creates the models tables that are +defined in [`prisma/schema.prisma`](./prisma/schema.prisma): ``` npx prisma migrate dev --name init ``` -When `npx prisma migrate dev` is executed against a newly created database, seeding is also triggered. The seed file in [`prisma/seed.ts`](./prisma/seed.ts) will be executed and your database will be populated with the sample data. +When `npx prisma migrate dev` is executed against a newly created database, seeding is also triggered. The seed file +in [`prisma/seed.ts`](./prisma/seed.ts) will be executed and your database will be populated with the sample data. + +## Build and Run with Docker + +### Build + +To build the image you need to be in the **parent folder** of the service you want to build. Then run the following +command: + +``` +docker build -t goodfood-delivery:1.0.0 -f ./delivery/Dockerfile . +``` + +### Run + +Then run the following command: + +``` +docker run goodfood-delivery:1.0.0 +``` diff --git a/services/delivery/prisma/schema.prisma b/services/delivery/prisma/schema.prisma index 02929eb8..f769d414 100644 --- a/services/delivery/prisma/schema.prisma +++ b/services/delivery/prisma/schema.prisma @@ -4,7 +4,8 @@ datasource db { } generator client { - provider = "prisma-client-js" + provider = "prisma-client-js" + binaryTargets = ["linux-musl"] } enum Status { From 9999760ba483b836f569be3560e3b9fbaa6d6bed Mon Sep 17 00:00:00 2001 From: anatole Date: Mon, 17 Apr 2023 14:03:17 +0200 Subject: [PATCH 244/883] fix(docker): precise the .env in the comment that run the image --- services/delivery/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/services/delivery/README.md b/services/delivery/README.md index 4450d510..c94da1c2 100644 --- a/services/delivery/README.md +++ b/services/delivery/README.md @@ -83,8 +83,8 @@ docker build -t goodfood-delivery:1.0.0 -f ./delivery/Dockerfile . ### Run -Then run the following command: +Create the .env base on the .env.example. Then run the following command: ``` -docker run goodfood-delivery:1.0.0 +docker run --env-file=.env goodfood-delivery:1.0.0 ``` From 8bb4dcf1661f68d1ee5e232b0e6d9134ea53e14e Mon Sep 17 00:00:00 2001 From: anatole Date: Mon, 17 Apr 2023 14:05:16 +0200 Subject: [PATCH 245/883] fix(proto): remove the symbolic link to /services/proto/ --- services/delivery/proto | 1 - 1 file changed, 1 deletion(-) delete mode 120000 services/delivery/proto diff --git a/services/delivery/proto b/services/delivery/proto deleted file mode 120000 index 4d1e2d8b..00000000 --- a/services/delivery/proto +++ /dev/null @@ -1 +0,0 @@ -../proto/ \ No newline at end of file From 044c1b51962b006ddada286f0e87df54db3838f4 Mon Sep 17 00:00:00 2001 From: anatole Date: Mon, 17 Apr 2023 14:38:26 +0200 Subject: [PATCH 246/883] fix(types): fix type errors --- README.md | 1 - services/delivery/prisma/seed.ts | 8 ++++---- services/delivery/src/handlers/delivery/create.ts | 4 ++-- services/delivery/src/handlers/delivery/get.ts | 2 +- .../delivery/src/handlers/delivery/list-by-restaurant.ts | 2 +- services/delivery/src/handlers/delivery/list-by-user.ts | 2 +- services/delivery/src/handlers/delivery/update.ts | 4 ++-- services/delivery/src/types/index.d.ts | 6 ------ 8 files changed, 11 insertions(+), 18 deletions(-) diff --git a/README.md b/README.md index 8be16b82..a405370d 100644 --- a/README.md +++ b/README.md @@ -47,7 +47,6 @@ The file hierarchy for this project is as follows: ├── gateway/ │ ├── k8s/ │ │ └── (...) # k8s files - │ ├── proto/ (symbolic link to /services/proto/) │ └── terraform/ │ └── (...) # terraform files ├── user/ diff --git a/services/delivery/prisma/seed.ts b/services/delivery/prisma/seed.ts index cc6998fd..7c517d02 100644 --- a/services/delivery/prisma/seed.ts +++ b/services/delivery/prisma/seed.ts @@ -28,7 +28,7 @@ const deliveries: Prisma.DeliveryCreateInput[] = [ { address: "15 rue de la paix 75000 Paris", eta: new Date("2023-01-01"), - person: { create: deliveryPerson[0] }, + delivery_person: { create: deliveryPerson[0] }, restaurant_id: "restaurant_id:1", user_id: "user_id:1", @@ -36,7 +36,7 @@ const deliveries: Prisma.DeliveryCreateInput[] = [ { address: "15 rue de la paix 75000 Paris", eta: new Date("2023-01-01"), - person: { create: deliveryPerson[0] }, + delivery_person: { create: deliveryPerson[0] }, restaurant_id: "restaurant_id:2", user_id: "user_id:1", @@ -44,7 +44,7 @@ const deliveries: Prisma.DeliveryCreateInput[] = [ { address: "16 rue de la paix 75000 Paris", eta: new Date("2023-02-01"), - person: { create: deliveryPerson[1] }, + delivery_person: { create: deliveryPerson[1] }, restaurant_id: "restaurant_id:1", user_id: "user_id:2", @@ -52,7 +52,7 @@ const deliveries: Prisma.DeliveryCreateInput[] = [ { address: "17 rue de la paix 75000 Paris", eta: new Date("2023-03-01"), - person: { create: deliveryPerson[2] }, + delivery_person: { create: deliveryPerson[2] }, restaurant_id: "restaurant_id:1", user_id: "user_id:3", diff --git a/services/delivery/src/handlers/delivery/create.ts b/services/delivery/src/handlers/delivery/create.ts index ba0a4b6a..1524de68 100644 --- a/services/delivery/src/handlers/delivery/create.ts +++ b/services/delivery/src/handlers/delivery/create.ts @@ -17,7 +17,7 @@ export const CreateDelivery = async ( eta: new Date(eta), address, status, - person: { + delivery_person: { connect: { id: delivery_person_id, }, @@ -26,7 +26,7 @@ export const CreateDelivery = async ( user_id, }, include: { - person: true, + delivery_person: true, }, }); callback(null, delivery); diff --git a/services/delivery/src/handlers/delivery/get.ts b/services/delivery/src/handlers/delivery/get.ts index 4f7d37a5..c6da00b3 100644 --- a/services/delivery/src/handlers/delivery/get.ts +++ b/services/delivery/src/handlers/delivery/get.ts @@ -14,7 +14,7 @@ export const GetDelivery = async ( const delivery = await prisma.delivery.findFirstOrThrow({ where: { id }, - include: { person: true }, + include: { delivery_person: true }, }); callback(null, delivery); } catch (error) { diff --git a/services/delivery/src/handlers/delivery/list-by-restaurant.ts b/services/delivery/src/handlers/delivery/list-by-restaurant.ts index 76aaa464..fc413ae1 100644 --- a/services/delivery/src/handlers/delivery/list-by-restaurant.ts +++ b/services/delivery/src/handlers/delivery/list-by-restaurant.ts @@ -17,7 +17,7 @@ export const ListDeliveriesByRestaurant = async ( const deliveries = await prisma.delivery.findMany({ where: { restaurant_id: id }, - include: { person: true }, + include: { delivery_person: true }, }); callback(null, { deliveries }); } catch (error) { diff --git a/services/delivery/src/handlers/delivery/list-by-user.ts b/services/delivery/src/handlers/delivery/list-by-user.ts index 30b5e3e1..93eddff9 100644 --- a/services/delivery/src/handlers/delivery/list-by-user.ts +++ b/services/delivery/src/handlers/delivery/list-by-user.ts @@ -14,7 +14,7 @@ export const ListDeliveriesByUser = async ( const deliveries = await prisma.delivery.findMany({ where: { user_id: id }, - include: { person: true }, + include: { delivery_person: true }, }); callback(null, { deliveries }); } catch (error) { diff --git a/services/delivery/src/handlers/delivery/update.ts b/services/delivery/src/handlers/delivery/update.ts index 41f4c8c9..a0267647 100644 --- a/services/delivery/src/handlers/delivery/update.ts +++ b/services/delivery/src/handlers/delivery/update.ts @@ -17,14 +17,14 @@ export const UpdateDelivery = async ( eta: new Date(eta), address, status, - person: { + delivery_person: { connect: { id: delivery_person_id, }, }, }, include: { - person: true, + delivery_person: true, }, }); callback(null, delivery); diff --git a/services/delivery/src/types/index.d.ts b/services/delivery/src/types/index.d.ts index 5f91a217..edf2bebf 100644 --- a/services/delivery/src/types/index.d.ts +++ b/services/delivery/src/types/index.d.ts @@ -1,9 +1,3 @@ export type Data = { request: T; }; - -export type Stream = { - write: (data: any) => void; - end: () => void; - request: T; -}; From 2d1b031c294632e88c495aaef7e2da8c9c576fd3 Mon Sep 17 00:00:00 2001 From: anatole Date: Tue, 18 Apr 2023 09:39:50 +0200 Subject: [PATCH 247/883] fix(k8s): fix deployment --- .github/workflows/delivery.yml | 2 +- package.json | 5 ----- services/delivery/Dockerfile | 6 +++--- services/delivery/k8s/deployment.yml | 5 +++-- services/delivery/prisma/schema.prisma | 2 +- 5 files changed, 8 insertions(+), 12 deletions(-) delete mode 100644 package.json diff --git a/.github/workflows/delivery.yml b/.github/workflows/delivery.yml index 53b4ba53..376cbb09 100644 --- a/.github/workflows/delivery.yml +++ b/.github/workflows/delivery.yml @@ -66,4 +66,4 @@ jobs: with: context: ./services/delivery push: true - tags: floriaaan/goodfood-delivery:latest + tags: goodfood-delivery:latest diff --git a/package.json b/package.json deleted file mode 100644 index 47832f15..00000000 --- a/package.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "devDependencies": { - "vitest-mock-extended": "^1.1.3" - } -} diff --git a/services/delivery/Dockerfile b/services/delivery/Dockerfile index a03f15dc..19327c3e 100644 --- a/services/delivery/Dockerfile +++ b/services/delivery/Dockerfile @@ -1,4 +1,4 @@ -FROM node:18-alpine as builder +FROM node:18-alpine3.17 as builder # Set working directory WORKDIR /app @@ -20,7 +20,7 @@ RUN npm run build # Create a new image with the application -FROM node:18-alpine as runner +FROM node:18-alpine3.17 as runner # Set working directory WORKDIR /app @@ -29,7 +29,7 @@ WORKDIR /app COPY --from=builder /app/dist . COPY --from=builder /app/prisma/ . COPY --from=builder /app/proto/ /proto/ -COPY --from=builder /app/node_modules/.prisma/client /.prisma/client/ +COPY --from=builder /app/node_modules/.prisma /.prisma # Expose the gRPC port EXPOSE 50008 diff --git a/services/delivery/k8s/deployment.yml b/services/delivery/k8s/deployment.yml index 53722f26..2bb885c3 100644 --- a/services/delivery/k8s/deployment.yml +++ b/services/delivery/k8s/deployment.yml @@ -15,7 +15,8 @@ spec: spec: containers: - name: goodfood-delivery - image: floriaaan/goodfood-delivery:1.0 + image: 4natole/goodfood-delivery:1.0.0 + imagePullPolicy: Always resources: limits: memory: "128Mi" @@ -27,4 +28,4 @@ spec: name: goodfood-delivery-configmap key: port ports: - - containerPort: 3000 + - containerPort: 50008 diff --git a/services/delivery/prisma/schema.prisma b/services/delivery/prisma/schema.prisma index f769d414..fe4bce5f 100644 --- a/services/delivery/prisma/schema.prisma +++ b/services/delivery/prisma/schema.prisma @@ -5,7 +5,7 @@ datasource db { generator client { provider = "prisma-client-js" - binaryTargets = ["linux-musl"] + binaryTargets = ["linux-musl", "linux-musl-openssl-3.0.x"] } enum Status { From 4bd585a0ec3bcd2aa2a20ee0487c66cda4a494dc Mon Sep 17 00:00:00 2001 From: anatole Date: Wed, 19 Apr 2023 15:23:32 +0200 Subject: [PATCH 248/883] feat(terraform): update general terraform --- services/delivery/terraform/data.tf | 12 ++---- terraform/data.tf | 6 +-- terraform/env/dev-backend.tfvars.example | 2 +- terraform/main.tf | 49 ++++++++++++++++++++++-- terraform/outputs.tf | 34 ++++++++++++++-- terraform/variables.tf | 15 ++++++++ 6 files changed, 97 insertions(+), 21 deletions(-) diff --git a/services/delivery/terraform/data.tf b/services/delivery/terraform/data.tf index adf0b7fd..618f4e55 100644 --- a/services/delivery/terraform/data.tf +++ b/services/delivery/terraform/data.tf @@ -2,16 +2,12 @@ data "azurerm_resource_group" "rg-goodfood" { name = "rg-${var.project_name}${var.environnment_suffix}" } -data "azurerm_key_vault" "kv-goodfood-delivery" { - resource_group_name = data.azurerm_resource_group.rg-goodfood.name - name = "kv-${var.project_name}" -} - data "azurerm_key_vault_secret" "delivery-db-login" { name = "delivery-db-login" - key_vault_id = data.azurerm_key_vault.kv-goodfood-delivery.id + key_vault_id = azurerm_key_vault.kv-goodfood-delivery.id } data "azurerm_key_vault_secret" "delivery-db-password" { name = "delivery-db-password" - key_vault_id = data.azurerm_key_vault.kv-goodfood-delivery.id -} \ No newline at end of file + key_vault_id = azurerm_key_vault.kv-goodfood-delivery.id +} +data "azurerm_client_config" "current" {} diff --git a/terraform/data.tf b/terraform/data.tf index 1906bbe7..ec75f3c3 100644 --- a/terraform/data.tf +++ b/terraform/data.tf @@ -2,8 +2,4 @@ data "azurerm_resource_group" "rg-goodfood" { name = "rg-${var.project_name}${var.environnment_suffix}" } -data "azurerm_key_vault" "kv-goodfood" { - resource_group_name = data.azurerm_resource_group.rg-goodfood.name - name = "kv-${var.project_name}" -} - +data "azurerm_client_config" "current" {} diff --git a/terraform/env/dev-backend.tfvars.example b/terraform/env/dev-backend.tfvars.example index 7df882a6..e7576abb 100644 --- a/terraform/env/dev-backend.tfvars.example +++ b/terraform/env/dev-backend.tfvars.example @@ -1,4 +1,4 @@ resource_group_name = "rg-goodfood-dev" -storage_account_name = "sa-goodfood-states" +storage_account_name = "pafgoodfood" container_name = "tfstate" key = "main-dev.tfstate" diff --git a/terraform/main.tf b/terraform/main.tf index e9cc0e91..73c9e44f 100644 --- a/terraform/main.tf +++ b/terraform/main.tf @@ -12,6 +12,33 @@ provider "azurerm" { features {} } +resource "azurerm_key_vault" "kv-goodfood" { + name = "kv-goodfood-delivery" + location = data.azurerm_resource_group.rg-goodfood.location + resource_group_name = data.azurerm_resource_group.rg-goodfood.name + tenant_id = data.azurerm_client_config.current.tenant_id + sku_name = "standard" + soft_delete_retention_days = 7 + + access_policy { + tenant_id = data.azurerm_client_config.current.tenant_id + object_id = data.azurerm_client_config.current.object_id + + key_permissions = [ + "Create", + "Get", + ] + + secret_permissions = [ + "Set", + "Get", + "Delete", + "Purge", + "Recover" + ] + } +} + resource "azurerm_service_plan" "sp-goodfood" { name = "sp-${var.project_name}${var.environnment_suffix}" resource_group_name = data.azurerm_resource_group.rg-goodfood.name @@ -43,13 +70,27 @@ resource "azurerm_kubernetes_cluster" "aks-goodfood" { resource_group_name = data.azurerm_resource_group.rg-goodfood.name dns_prefix = "aks-${var.project_name}${var.environnment_suffix}" + default_node_pool { - name = "default" - node_count = 1 + name = "agentpool" vm_size = "Standard_D2_v2" + node_count = var.agent_count + } + linux_profile { + admin_username = "ubuntu" + + ssh_key { + key_data = file(var.ssh_public_key) + } + } + + network_profile { + network_plugin = "kubenet" + load_balancer_sku = "standard" } - identity { - type = "SystemAssigned" + service_principal { + client_id = var.aks_service_principal_app_id + client_secret = var.aks_service_principal_client_secret } } \ No newline at end of file diff --git a/terraform/outputs.tf b/terraform/outputs.tf index aa5afd79..f5b3c6b6 100644 --- a/terraform/outputs.tf +++ b/terraform/outputs.tf @@ -4,13 +4,41 @@ output "main-rg-name" { output "main-rg-id" { value = data.azurerm_resource_group.rg-goodfood.id } - output "client_certificate" { - value = azurerm_kubernetes_cluster.aks-goodfood.kube_config.0.client_certificate + value = azurerm_kubernetes_cluster.aks-goodfood.kube_config[0].client_certificate + sensitive = true +} + +output "client_key" { + value = azurerm_kubernetes_cluster.aks-goodfood.kube_config[0].client_key + sensitive = true +} + +output "cluster_ca_certificate" { + value = azurerm_kubernetes_cluster.aks-goodfood.kube_config[0].cluster_ca_certificate + sensitive = true +} + +output "cluster_password" { + value = azurerm_kubernetes_cluster.aks-goodfood.kube_config[0].password + sensitive = true +} + +output "cluster_username" { + value = azurerm_kubernetes_cluster.aks-goodfood.kube_config[0].username + sensitive = true +} + +output "host" { + value = azurerm_kubernetes_cluster.aks-goodfood.kube_config[0].host sensitive = true } output "kube_config" { - value = azurerm_kubernetes_cluster.aks-goodfood.kube_config_raw + value = azurerm_kubernetes_cluster.aks-goodfood.kube_config_raw sensitive = true +} + +output "resource_group_name" { + value = data.azurerm_resource_group.rg-goodfood.name } \ No newline at end of file diff --git a/terraform/variables.tf b/terraform/variables.tf index 65fd7547..fae36979 100644 --- a/terraform/variables.tf +++ b/terraform/variables.tf @@ -13,4 +13,19 @@ variable "project_name" { type = string description = "The name of the project" default = "goodfood" +} + +variable "agent_count" { + default = 3 +} + +variable "aks_service_principal_app_id" { + default = "" +} + +variable "aks_service_principal_client_secret" { + default = "" +} +variable "ssh_public_key" { + default = "~/.ssh/id_rsa.pub" } \ No newline at end of file From 08b3e7bd298284cf636871d42aed763e90972b8c Mon Sep 17 00:00:00 2001 From: Florian Leroux <10078837+floriaaan@users.noreply.github.com> Date: Wed, 19 Apr 2023 11:50:40 +0200 Subject: [PATCH 249/883] ref: change publish job --- .github/workflows/delivery.yml | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/.github/workflows/delivery.yml b/.github/workflows/delivery.yml index 376cbb09..86e0d4c2 100644 --- a/.github/workflows/delivery.yml +++ b/.github/workflows/delivery.yml @@ -57,13 +57,14 @@ jobs: - name: Checkout code uses: actions/checkout@v2 - name: Login to Docker Hub - uses: docker/login-action@v1 + uses: docker/login-action@v2 with: - username: ${{ secrets.DOCKER_USERNAME }} - password: ${{ secrets.DOCKER_PASSWORD }} - - name: Build and push Docker image - uses: docker/build-push-action@v2 + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + - name: Build and push + uses: docker/build-push-action@v4 with: - context: ./services/delivery + context: ./services/ + file: ./services/delivery/Dockerfile push: true - tags: goodfood-delivery:latest + tags: floriaaan/goodfood-delivery:latest From 0c49b281500e8efcbbc643d71e8da8707b900d8b Mon Sep 17 00:00:00 2001 From: Florian Leroux <10078837+floriaaan@users.noreply.github.com> Date: Wed, 19 Apr 2023 11:58:43 +0200 Subject: [PATCH 250/883] ref(ci): change actions/checkout@v2 -> actions/checkout@master --- .github/workflows/delivery.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/delivery.yml b/.github/workflows/delivery.yml index 86e0d4c2..36845dc3 100644 --- a/.github/workflows/delivery.yml +++ b/.github/workflows/delivery.yml @@ -55,7 +55,7 @@ jobs: needs: [build, test] steps: - name: Checkout code - uses: actions/checkout@v2 + uses: actions/checkout@master - name: Login to Docker Hub uses: docker/login-action@v2 with: From f5bf10dd8e60e92d5867e89c2639d7c680e29fa8 Mon Sep 17 00:00:00 2001 From: anatole Date: Wed, 19 Apr 2023 18:24:39 +0200 Subject: [PATCH 251/883] feat(infra): update general terraform and change the delivery image --- services/delivery/k8s/deployment.yml | 2 +- terraform/main.tf | 28 ++++++++++++++-------------- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/services/delivery/k8s/deployment.yml b/services/delivery/k8s/deployment.yml index 2bb885c3..04b97285 100644 --- a/services/delivery/k8s/deployment.yml +++ b/services/delivery/k8s/deployment.yml @@ -15,7 +15,7 @@ spec: spec: containers: - name: goodfood-delivery - image: 4natole/goodfood-delivery:1.0.0 + image: floriaaan/goodfood-delivery:1.0.0 imagePullPolicy: Always resources: limits: diff --git a/terraform/main.tf b/terraform/main.tf index 73c9e44f..e9e1db58 100644 --- a/terraform/main.tf +++ b/terraform/main.tf @@ -12,10 +12,15 @@ provider "azurerm" { features {} } +resource "azurerm_resource_group" "rg-goodfood" { + location = data.azurerm_resource_group.rg-goodfood.location + name = "rg-${var.project_name}${var.environnment_suffix}" +} + resource "azurerm_key_vault" "kv-goodfood" { name = "kv-goodfood-delivery" location = data.azurerm_resource_group.rg-goodfood.location - resource_group_name = data.azurerm_resource_group.rg-goodfood.name + resource_group_name = azurerm_resource_group.rg-goodfood.name tenant_id = data.azurerm_client_config.current.tenant_id sku_name = "standard" soft_delete_retention_days = 7 @@ -41,7 +46,7 @@ resource "azurerm_key_vault" "kv-goodfood" { resource "azurerm_service_plan" "sp-goodfood" { name = "sp-${var.project_name}${var.environnment_suffix}" - resource_group_name = data.azurerm_resource_group.rg-goodfood.name + resource_group_name = azurerm_resource_group.rg-goodfood.name location = var.location os_type = "Linux" sku_name = "S1" @@ -49,7 +54,7 @@ resource "azurerm_service_plan" "sp-goodfood" { resource "azurerm_linux_web_app" "web-goodfood" { name = "web-${var.project_name}${var.environnment_suffix}" - resource_group_name = data.azurerm_resource_group.rg-goodfood.name + resource_group_name = azurerm_resource_group.rg-goodfood.name location = var.location service_plan_id = azurerm_service_plan.sp-goodfood.id @@ -67,7 +72,7 @@ resource "azurerm_linux_web_app" "web-goodfood" { resource "azurerm_kubernetes_cluster" "aks-goodfood" { name = "aks-${var.project_name}${var.environnment_suffix}" location = var.location - resource_group_name = data.azurerm_resource_group.rg-goodfood.name + resource_group_name = azurerm_resource_group.rg-goodfood.name dns_prefix = "aks-${var.project_name}${var.environnment_suffix}" @@ -76,6 +81,11 @@ resource "azurerm_kubernetes_cluster" "aks-goodfood" { vm_size = "Standard_D2_v2" node_count = var.agent_count } + service_principal { + client_id = "${var.aks_service_principal_app_id}" + client_secret = "${var.aks_service_principal_client_secret}" + } + linux_profile { admin_username = "ubuntu" @@ -83,14 +93,4 @@ resource "azurerm_kubernetes_cluster" "aks-goodfood" { key_data = file(var.ssh_public_key) } } - - network_profile { - network_plugin = "kubenet" - load_balancer_sku = "standard" - } - - service_principal { - client_id = var.aks_service_principal_app_id - client_secret = var.aks_service_principal_client_secret - } } \ No newline at end of file From 72c3d55b660e5ac7dd40dbb9b53a9139a6d63ad4 Mon Sep 17 00:00:00 2001 From: anatole Date: Wed, 19 Apr 2023 18:48:59 +0200 Subject: [PATCH 252/883] feat(github action): update delivery CICD --- .github/workflows/delivery.yml | 40 +++++++++++++++++++++++++++++++--- 1 file changed, 37 insertions(+), 3 deletions(-) diff --git a/.github/workflows/delivery.yml b/.github/workflows/delivery.yml index 36845dc3..8010eb30 100644 --- a/.github/workflows/delivery.yml +++ b/.github/workflows/delivery.yml @@ -2,9 +2,9 @@ name: Delivery Microservice CI/CD on: push: - branches: [delivery] + branches: [ delivery ] pull_request: - branches: [dev, main] + branches: [ dev, main ] jobs: build: @@ -52,7 +52,7 @@ jobs: publish: runs-on: ubuntu-latest - needs: [build, test] + needs: [ build, test ] steps: - name: Checkout code uses: actions/checkout@master @@ -68,3 +68,37 @@ jobs: file: ./services/delivery/Dockerfile push: true tags: floriaaan/goodfood-delivery:latest + + deploy: + runs-on: ubuntu-latest + needs: [ build, test, publish ] + steps: + - name: Checkout code + uses: actions/checkout@master + - name: Install kubectl + run: | + sudo snap install kubectl --classic + - name: Azure login + uses: azure/login@v1 + with: + creds: ${{ secrets.AZURE_CREDENTIALS }} + - name: Set up Terraform + uses: hashicorp/setup-terraform@v1 + with: + terraform_version: 1.0.5 + - name: Terraform init + run: | + cd ./terraform + terraform init + - name: Terraform apply + run: | + cd ./terraform + terraform apply -auto-approve + - name: Configure kubectl + run: | + az aks get-credentials --resource-group rg-goodfood-dev --name aks-goodfood-dev + - name: apply k8s manifests + run: | + cd ../services/delivery + kubectl create namespace goodfood + kubectlcrete kubectl apply -f ./k8s \ No newline at end of file From 070bdf61576778fb48bd2d00fb59a734f8640dc0 Mon Sep 17 00:00:00 2001 From: anatole Date: Thu, 20 Apr 2023 09:05:24 +0200 Subject: [PATCH 253/883] feat(github): update the CICD --- .github/workflows/delivery.yml | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/.github/workflows/delivery.yml b/.github/workflows/delivery.yml index 8010eb30..7ff1db68 100644 --- a/.github/workflows/delivery.yml +++ b/.github/workflows/delivery.yml @@ -81,24 +81,30 @@ jobs: - name: Azure login uses: azure/login@v1 with: - creds: ${{ secrets.AZURE_CREDENTIALS }} + client-id: ${{ secrets.AZURE_CLIENT_ID }} + tenant-id: ${{ secrets.AZURE_TENANT_ID }} + subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }} - name: Set up Terraform uses: hashicorp/setup-terraform@v1 with: terraform_version: 1.0.5 - name: Terraform init run: | - cd ./terraform + cd ./terraform && terraform init - name: Terraform apply run: | - cd ./terraform + cd ./terraform && + terraform apply -auto-approve + - name: Terraform apply delivery + run: | + cd ../services/delivery/terraform && terraform apply -auto-approve - name: Configure kubectl run: | az aks get-credentials --resource-group rg-goodfood-dev --name aks-goodfood-dev - name: apply k8s manifests run: | - cd ../services/delivery - kubectl create namespace goodfood + cd .. && + kubectl create namespace goodfood && kubectlcrete kubectl apply -f ./k8s \ No newline at end of file From 0b9da0fd37b3da049a663a2d4bc81f64b0c08da3 Mon Sep 17 00:00:00 2001 From: anatole Date: Thu, 20 Apr 2023 09:12:50 +0200 Subject: [PATCH 254/883] feat(github): add permission --- .github/workflows/delivery.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/workflows/delivery.yml b/.github/workflows/delivery.yml index 7ff1db68..5ffed1b0 100644 --- a/.github/workflows/delivery.yml +++ b/.github/workflows/delivery.yml @@ -6,6 +6,9 @@ on: pull_request: branches: [ dev, main ] +permissions: + id-token: write + jobs: build: runs-on: ubuntu-latest @@ -78,7 +81,7 @@ jobs: - name: Install kubectl run: | sudo snap install kubectl --classic - - name: Azure login + - name: 'Az CLI login' uses: azure/login@v1 with: client-id: ${{ secrets.AZURE_CLIENT_ID }} From a3f936acec14baeea05bf8bebace3167a05e6efe Mon Sep 17 00:00:00 2001 From: anatole Date: Thu, 20 Apr 2023 09:15:51 +0200 Subject: [PATCH 255/883] feat(github): update permission --- .github/workflows/delivery.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/delivery.yml b/.github/workflows/delivery.yml index 5ffed1b0..593d7dd8 100644 --- a/.github/workflows/delivery.yml +++ b/.github/workflows/delivery.yml @@ -8,6 +8,7 @@ on: permissions: id-token: write + contents: read jobs: build: From 878407481d3e9e09f6fd7a52c2a4073342d9c7a6 Mon Sep 17 00:00:00 2001 From: anatole Date: Thu, 20 Apr 2023 09:23:28 +0200 Subject: [PATCH 256/883] feat(github): add environment --- .github/workflows/delivery.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/delivery.yml b/.github/workflows/delivery.yml index 593d7dd8..122e5f85 100644 --- a/.github/workflows/delivery.yml +++ b/.github/workflows/delivery.yml @@ -75,6 +75,7 @@ jobs: deploy: runs-on: ubuntu-latest + environment: dev needs: [ build, test, publish ] steps: - name: Checkout code From aa56ab0f8a23240b4dbb3f18020304d62233728d Mon Sep 17 00:00:00 2001 From: anatole Date: Thu, 20 Apr 2023 10:26:34 +0200 Subject: [PATCH 257/883] feat(github): split the delivery deployment --- .github/workflows/delivery-deploy.yml | 51 +++++++++++++++++++++++++++ .github/workflows/delivery.yml | 43 +--------------------- 2 files changed, 52 insertions(+), 42 deletions(-) create mode 100644 .github/workflows/delivery-deploy.yml diff --git a/.github/workflows/delivery-deploy.yml b/.github/workflows/delivery-deploy.yml new file mode 100644 index 00000000..aca8b56a --- /dev/null +++ b/.github/workflows/delivery-deploy.yml @@ -0,0 +1,51 @@ +name: Delivery Microservice CI/CD + +on: + push: + branches: [ dev, main ] + +permissions: + id-token: write + contents: read + +jobs: + deploy: + runs-on: ubuntu-latest + environment: dev + needs: [ build, test, publish ] + steps: + - name: Checkout code + uses: actions/checkout@master + - name: Install kubectl + run: | + sudo snap install kubectl --classic + - name: 'Az CLI login' + uses: azure/login@v1 + with: + client-id: ${{ secrets.AZURE_CLIENT_ID }} + tenant-id: ${{ secrets.AZURE_TENANT_ID }} + subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }} + - name: Set up Terraform + uses: hashicorp/setup-terraform@v1 + with: + terraform_version: 1.0.5 + - name: Terraform init + run: | + cd ./terraform && + terraform init + - name: Terraform apply + run: | + cd ./terraform && + terraform apply -auto-approve + - name: Terraform apply delivery + run: | + cd ../services/delivery/terraform && + terraform apply -auto-approve + - name: Configure kubectl + run: | + az aks get-credentials --resource-group rg-goodfood-dev --name aks-goodfood-dev + - name: apply k8s manifests + run: | + cd .. && + kubectl create namespace goodfood && + kubectlcrete kubectl apply -f ./k8s \ No newline at end of file diff --git a/.github/workflows/delivery.yml b/.github/workflows/delivery.yml index 122e5f85..e467c33e 100644 --- a/.github/workflows/delivery.yml +++ b/.github/workflows/delivery.yml @@ -71,45 +71,4 @@ jobs: context: ./services/ file: ./services/delivery/Dockerfile push: true - tags: floriaaan/goodfood-delivery:latest - - deploy: - runs-on: ubuntu-latest - environment: dev - needs: [ build, test, publish ] - steps: - - name: Checkout code - uses: actions/checkout@master - - name: Install kubectl - run: | - sudo snap install kubectl --classic - - name: 'Az CLI login' - uses: azure/login@v1 - with: - client-id: ${{ secrets.AZURE_CLIENT_ID }} - tenant-id: ${{ secrets.AZURE_TENANT_ID }} - subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }} - - name: Set up Terraform - uses: hashicorp/setup-terraform@v1 - with: - terraform_version: 1.0.5 - - name: Terraform init - run: | - cd ./terraform && - terraform init - - name: Terraform apply - run: | - cd ./terraform && - terraform apply -auto-approve - - name: Terraform apply delivery - run: | - cd ../services/delivery/terraform && - terraform apply -auto-approve - - name: Configure kubectl - run: | - az aks get-credentials --resource-group rg-goodfood-dev --name aks-goodfood-dev - - name: apply k8s manifests - run: | - cd .. && - kubectl create namespace goodfood && - kubectlcrete kubectl apply -f ./k8s \ No newline at end of file + tags: floriaaan/goodfood-delivery:latest \ No newline at end of file From fd8324711a810b0b0bdd6f98fa9c641b9759b8eb Mon Sep 17 00:00:00 2001 From: anatole Date: Thu, 20 Apr 2023 10:46:45 +0200 Subject: [PATCH 258/883] refactor(github): split the delivery deployment --- .github/workflows/delivery-deploy.yml | 2 +- .github/workflows/delivery.yml | 4 ---- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/.github/workflows/delivery-deploy.yml b/.github/workflows/delivery-deploy.yml index aca8b56a..879d115e 100644 --- a/.github/workflows/delivery-deploy.yml +++ b/.github/workflows/delivery-deploy.yml @@ -1,4 +1,4 @@ -name: Delivery Microservice CI/CD +name: Deploy Delivery Microservice CI/CD on: push: diff --git a/.github/workflows/delivery.yml b/.github/workflows/delivery.yml index e467c33e..1b68e1b2 100644 --- a/.github/workflows/delivery.yml +++ b/.github/workflows/delivery.yml @@ -6,10 +6,6 @@ on: pull_request: branches: [ dev, main ] -permissions: - id-token: write - contents: read - jobs: build: runs-on: ubuntu-latest From 7e188b06dfb7f3f314932af97c3edebc27690435 Mon Sep 17 00:00:00 2001 From: anatole Date: Thu, 20 Apr 2023 16:09:07 +0200 Subject: [PATCH 259/883] feat(github): update general terraform --- terraform/env/dev.tfvars.example | 2 + terraform/main.tf | 84 ++++++++++++++++++++++---------- terraform/outputs.tf | 34 ------------- terraform/variables.tf | 6 +++ 4 files changed, 65 insertions(+), 61 deletions(-) diff --git a/terraform/env/dev.tfvars.example b/terraform/env/dev.tfvars.example index 4ac1f44d..1e7706c9 100644 --- a/terraform/env/dev.tfvars.example +++ b/terraform/env/dev.tfvars.example @@ -1 +1,3 @@ environnment_suffix = "-dev" +db_password = "password" +db_username = "user" diff --git a/terraform/main.tf b/terraform/main.tf index e9e1db58..a05e2e86 100644 --- a/terraform/main.tf +++ b/terraform/main.tf @@ -12,15 +12,10 @@ provider "azurerm" { features {} } -resource "azurerm_resource_group" "rg-goodfood" { - location = data.azurerm_resource_group.rg-goodfood.location - name = "rg-${var.project_name}${var.environnment_suffix}" -} - resource "azurerm_key_vault" "kv-goodfood" { name = "kv-goodfood-delivery" location = data.azurerm_resource_group.rg-goodfood.location - resource_group_name = azurerm_resource_group.rg-goodfood.name + resource_group_name = data.azurerm_resource_group.rg-goodfood.name tenant_id = data.azurerm_client_config.current.tenant_id sku_name = "standard" soft_delete_retention_days = 7 @@ -46,7 +41,7 @@ resource "azurerm_key_vault" "kv-goodfood" { resource "azurerm_service_plan" "sp-goodfood" { name = "sp-${var.project_name}${var.environnment_suffix}" - resource_group_name = azurerm_resource_group.rg-goodfood.name + resource_group_name = data.azurerm_resource_group.rg-goodfood.name location = var.location os_type = "Linux" sku_name = "S1" @@ -54,7 +49,7 @@ resource "azurerm_service_plan" "sp-goodfood" { resource "azurerm_linux_web_app" "web-goodfood" { name = "web-${var.project_name}${var.environnment_suffix}" - resource_group_name = azurerm_resource_group.rg-goodfood.name + resource_group_name = data.azurerm_resource_group.rg-goodfood.name location = var.location service_plan_id = azurerm_service_plan.sp-goodfood.id @@ -69,28 +64,63 @@ resource "azurerm_linux_web_app" "web-goodfood" { } } -resource "azurerm_kubernetes_cluster" "aks-goodfood" { - name = "aks-${var.project_name}${var.environnment_suffix}" - location = var.location - resource_group_name = azurerm_resource_group.rg-goodfood.name - dns_prefix = "aks-${var.project_name}${var.environnment_suffix}" +resource "azurerm_postgresql_server" "pgsql-goodfood" { + name = "postgres-server-${var.project_name}${var.environnment_suffix}" + location = data.azurerm_resource_group.rg-goodfood.location + resource_group_name = data.azurerm_resource_group.rg-goodfood.name + sku_name = "B_Gen5_2" - default_node_pool { - name = "agentpool" - vm_size = "Standard_D2_v2" - node_count = var.agent_count - } - service_principal { - client_id = "${var.aks_service_principal_app_id}" - client_secret = "${var.aks_service_principal_client_secret}" - } + storage_mb = 5120 + backup_retention_days = 7 + geo_redundant_backup_enabled = false + auto_grow_enabled = true + + administrator_login = var.db_username + administrator_login_password = var.db_password + version = "9.5" + ssl_enforcement_enabled = false + ssl_minimal_tls_version_enforced = "TLSEnforcementDisabled" +} + +resource "azurerm_postgresql_firewall_rule" "pg-fw-goodfood" { + name = "firewall-${var.project_name}${var.environnment_suffix}" + resource_group_name = data.azurerm_resource_group.rg-goodfood.name + server_name = azurerm_postgresql_server.pgsql-goodfood.name + start_ip_address = "0.0.0.0" + end_ip_address = "0.0.0.0" +} + +resource "azurerm_postgresql_database" "db-goodfood" { + name = "postgres-${var.project_name}${var.environnment_suffix}" + resource_group_name = data.azurerm_resource_group.rg-goodfood.name + server_name = azurerm_postgresql_server.pgsql-goodfood.name + charset = "UTF8" + collation = "English_United States.1252" +} + +resource "azurerm_container_group" "container_group" { + name = "container-${var.project_name}${var.environnment_suffix}" + location = data.azurerm_resource_group.rg-goodfood.location + resource_group_name = data.azurerm_resource_group.rg-goodfood.name + ip_address_type = "Public" + dns_name_label = "container-${var.project_name}${var.environnment_suffix}" + os_type = "Linux" + + container { + name = "${var.project_name}${var.environnment_suffix}" + image = "floriaaan/goodfood-delivery:latest" + cpu = "0.5" + memory = "1.5" - linux_profile { - admin_username = "ubuntu" + ports { + port = 50008 + protocol = "TCP" + } - ssh_key { - key_data = file(var.ssh_public_key) + environment_variables = { + "DATABASE_URL" = "postgres://${var.db_username}@${azurerm_postgresql_server.pgsql-goodfood.name}:${var.db_password}@${azurerm_postgresql_server.pgsql-goodfood.fqdn}:5432/${azurerm_postgresql_database.db-goodfood.name}" + "PORT" = 50008 } } -} \ No newline at end of file +} diff --git a/terraform/outputs.tf b/terraform/outputs.tf index f5b3c6b6..a7a091ce 100644 --- a/terraform/outputs.tf +++ b/terraform/outputs.tf @@ -4,40 +4,6 @@ output "main-rg-name" { output "main-rg-id" { value = data.azurerm_resource_group.rg-goodfood.id } -output "client_certificate" { - value = azurerm_kubernetes_cluster.aks-goodfood.kube_config[0].client_certificate - sensitive = true -} - -output "client_key" { - value = azurerm_kubernetes_cluster.aks-goodfood.kube_config[0].client_key - sensitive = true -} - -output "cluster_ca_certificate" { - value = azurerm_kubernetes_cluster.aks-goodfood.kube_config[0].cluster_ca_certificate - sensitive = true -} - -output "cluster_password" { - value = azurerm_kubernetes_cluster.aks-goodfood.kube_config[0].password - sensitive = true -} - -output "cluster_username" { - value = azurerm_kubernetes_cluster.aks-goodfood.kube_config[0].username - sensitive = true -} - -output "host" { - value = azurerm_kubernetes_cluster.aks-goodfood.kube_config[0].host - sensitive = true -} - -output "kube_config" { - value = azurerm_kubernetes_cluster.aks-goodfood.kube_config_raw - sensitive = true -} output "resource_group_name" { value = data.azurerm_resource_group.rg-goodfood.name diff --git a/terraform/variables.tf b/terraform/variables.tf index fae36979..0bb2c48d 100644 --- a/terraform/variables.tf +++ b/terraform/variables.tf @@ -28,4 +28,10 @@ variable "aks_service_principal_client_secret" { } variable "ssh_public_key" { default = "~/.ssh/id_rsa.pub" +} +variable "db_password" { + type = string +} +variable "db_username" { + type = string } \ No newline at end of file From 3127d4e3d75a415b485b1f9281d4112e425a1e4f Mon Sep 17 00:00:00 2001 From: Florian LEROUX <10078837+floriaaan@users.noreply.github.com> Date: Wed, 10 May 2023 15:59:32 +0200 Subject: [PATCH 260/883] git(ignore): remove root lockfile and add ignore files --- .gitignore | 3 - pnpm-lock.yaml | 794 ------------------------------------------------- 2 files changed, 797 deletions(-) delete mode 100644 pnpm-lock.yaml diff --git a/.gitignore b/.gitignore index d67020c0..b27e8415 100644 --- a/.gitignore +++ b/.gitignore @@ -66,6 +66,3 @@ terraform.rc /services/reporting/**/bin /services/reporting/**/obj /services/reporting/**/.vs - -# log service -/services/log/goodfood-log \ No newline at end of file diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml deleted file mode 100644 index cccf0383..00000000 --- a/pnpm-lock.yaml +++ /dev/null @@ -1,794 +0,0 @@ -lockfileVersion: '6.0' - -devDependencies: - vitest-mock-extended: - specifier: ^1.1.3 - version: 1.1.3(typescript@5.0.4)(vitest@0.30.0) - -packages: - - /@esbuild/android-arm64@0.17.16: - resolution: {integrity: sha512-QX48qmsEZW+gcHgTmAj+x21mwTz8MlYQBnzF6861cNdQGvj2jzzFjqH0EBabrIa/WVZ2CHolwMoqxVryqKt8+Q==} - engines: {node: '>=12'} - cpu: [arm64] - os: [android] - requiresBuild: true - dev: true - optional: true - - /@esbuild/android-arm@0.17.16: - resolution: {integrity: sha512-baLqRpLe4JnKrUXLJChoTN0iXZH7El/mu58GE3WIA6/H834k0XWvLRmGLG8y8arTRS9hJJibPnF0tiGhmWeZgw==} - engines: {node: '>=12'} - cpu: [arm] - os: [android] - requiresBuild: true - dev: true - optional: true - - /@esbuild/android-x64@0.17.16: - resolution: {integrity: sha512-G4wfHhrrz99XJgHnzFvB4UwwPxAWZaZBOFXh+JH1Duf1I4vIVfuYY9uVLpx4eiV2D/Jix8LJY+TAdZ3i40tDow==} - engines: {node: '>=12'} - cpu: [x64] - os: [android] - requiresBuild: true - dev: true - optional: true - - /@esbuild/darwin-arm64@0.17.16: - resolution: {integrity: sha512-/Ofw8UXZxuzTLsNFmz1+lmarQI6ztMZ9XktvXedTbt3SNWDn0+ODTwxExLYQ/Hod91EZB4vZPQJLoqLF0jvEzA==} - engines: {node: '>=12'} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /@esbuild/darwin-x64@0.17.16: - resolution: {integrity: sha512-SzBQtCV3Pdc9kyizh36Ol+dNVhkDyIrGb/JXZqFq8WL37LIyrXU0gUpADcNV311sCOhvY+f2ivMhb5Tuv8nMOQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /@esbuild/freebsd-arm64@0.17.16: - resolution: {integrity: sha512-ZqftdfS1UlLiH1DnS2u3It7l4Bc3AskKeu+paJSfk7RNOMrOxmeFDhLTMQqMxycP1C3oj8vgkAT6xfAuq7ZPRA==} - engines: {node: '>=12'} - cpu: [arm64] - os: [freebsd] - requiresBuild: true - dev: true - optional: true - - /@esbuild/freebsd-x64@0.17.16: - resolution: {integrity: sha512-rHV6zNWW1tjgsu0dKQTX9L0ByiJHHLvQKrWtnz8r0YYJI27FU3Xu48gpK2IBj1uCSYhJ+pEk6Y0Um7U3rIvV8g==} - engines: {node: '>=12'} - cpu: [x64] - os: [freebsd] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-arm64@0.17.16: - resolution: {integrity: sha512-8yoZhGkU6aHu38WpaM4HrRLTFc7/VVD9Q2SvPcmIQIipQt2I/GMTZNdEHXoypbbGao5kggLcxg0iBKjo0SQYKA==} - engines: {node: '>=12'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-arm@0.17.16: - resolution: {integrity: sha512-n4O8oVxbn7nl4+m+ISb0a68/lcJClIbaGAoXwqeubj/D1/oMMuaAXmJVfFlRjJLu/ZvHkxoiFJnmbfp4n8cdSw==} - engines: {node: '>=12'} - cpu: [arm] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-ia32@0.17.16: - resolution: {integrity: sha512-9ZBjlkdaVYxPNO8a7OmzDbOH9FMQ1a58j7Xb21UfRU29KcEEU3VTHk+Cvrft/BNv0gpWJMiiZ/f4w0TqSP0gLA==} - engines: {node: '>=12'} - cpu: [ia32] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-loong64@0.17.16: - resolution: {integrity: sha512-TIZTRojVBBzdgChY3UOG7BlPhqJz08AL7jdgeeu+kiObWMFzGnQD7BgBBkWRwOtKR1i2TNlO7YK6m4zxVjjPRQ==} - engines: {node: '>=12'} - cpu: [loong64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-mips64el@0.17.16: - resolution: {integrity: sha512-UPeRuFKCCJYpBbIdczKyHLAIU31GEm0dZl1eMrdYeXDH+SJZh/i+2cAmD3A1Wip9pIc5Sc6Kc5cFUrPXtR0XHA==} - engines: {node: '>=12'} - cpu: [mips64el] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-ppc64@0.17.16: - resolution: {integrity: sha512-io6yShgIEgVUhExJejJ21xvO5QtrbiSeI7vYUnr7l+v/O9t6IowyhdiYnyivX2X5ysOVHAuyHW+Wyi7DNhdw6Q==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-riscv64@0.17.16: - resolution: {integrity: sha512-WhlGeAHNbSdG/I2gqX2RK2gfgSNwyJuCiFHMc8s3GNEMMHUI109+VMBfhVqRb0ZGzEeRiibi8dItR3ws3Lk+cA==} - engines: {node: '>=12'} - cpu: [riscv64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-s390x@0.17.16: - resolution: {integrity: sha512-gHRReYsJtViir63bXKoFaQ4pgTyah4ruiMRQ6im9YZuv+gp3UFJkNTY4sFA73YDynmXZA6hi45en4BGhNOJUsw==} - engines: {node: '>=12'} - cpu: [s390x] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-x64@0.17.16: - resolution: {integrity: sha512-mfiiBkxEbUHvi+v0P+TS7UnA9TeGXR48aK4XHkTj0ZwOijxexgMF01UDFaBX7Q6CQsB0d+MFNv9IiXbIHTNd4g==} - engines: {node: '>=12'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/netbsd-x64@0.17.16: - resolution: {integrity: sha512-n8zK1YRDGLRZfVcswcDMDM0j2xKYLNXqei217a4GyBxHIuPMGrrVuJ+Ijfpr0Kufcm7C1k/qaIrGy6eG7wvgmA==} - engines: {node: '>=12'} - cpu: [x64] - os: [netbsd] - requiresBuild: true - dev: true - optional: true - - /@esbuild/openbsd-x64@0.17.16: - resolution: {integrity: sha512-lEEfkfsUbo0xC47eSTBqsItXDSzwzwhKUSsVaVjVji07t8+6KA5INp2rN890dHZeueXJAI8q0tEIfbwVRYf6Ew==} - engines: {node: '>=12'} - cpu: [x64] - os: [openbsd] - requiresBuild: true - dev: true - optional: true - - /@esbuild/sunos-x64@0.17.16: - resolution: {integrity: sha512-jlRjsuvG1fgGwnE8Afs7xYDnGz0dBgTNZfgCK6TlvPH3Z13/P5pi6I57vyLE8qZYLrGVtwcm9UbUx1/mZ8Ukag==} - engines: {node: '>=12'} - cpu: [x64] - os: [sunos] - requiresBuild: true - dev: true - optional: true - - /@esbuild/win32-arm64@0.17.16: - resolution: {integrity: sha512-TzoU2qwVe2boOHl/3KNBUv2PNUc38U0TNnzqOAcgPiD/EZxT2s736xfC2dYQbszAwo4MKzzwBV0iHjhfjxMimg==} - engines: {node: '>=12'} - cpu: [arm64] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /@esbuild/win32-ia32@0.17.16: - resolution: {integrity: sha512-B8b7W+oo2yb/3xmwk9Vc99hC9bNolvqjaTZYEfMQhzdpBsjTvZBlXQ/teUE55Ww6sg//wlcDjOaqldOKyigWdA==} - engines: {node: '>=12'} - cpu: [ia32] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /@esbuild/win32-x64@0.17.16: - resolution: {integrity: sha512-xJ7OH/nanouJO9pf03YsL9NAFQBHd8AqfrQd7Pf5laGyyTt/gToul6QYOA/i5i/q8y9iaM5DQFNTgpi995VkOg==} - engines: {node: '>=12'} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /@jridgewell/sourcemap-codec@1.4.15: - resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} - dev: true - - /@types/chai-subset@1.3.3: - resolution: {integrity: sha512-frBecisrNGz+F4T6bcc+NLeolfiojh5FxW2klu669+8BARtyQv2C/GkNW6FUodVe4BroGMP/wER/YDGc7rEllw==} - dependencies: - '@types/chai': 4.3.4 - dev: true - - /@types/chai@4.3.4: - resolution: {integrity: sha512-KnRanxnpfpjUTqTCXslZSEdLfXExwgNxYPdiO2WGUj8+HDjFi8R3k5RVKPeSCzLjCcshCAtVO2QBbVuAV4kTnw==} - dev: true - - /@types/node@18.15.11: - resolution: {integrity: sha512-E5Kwq2n4SbMzQOn6wnmBjuK9ouqlURrcZDVfbo9ftDDTFt3nk7ZKK4GMOzoYgnpQJKcxwQw+lGaBvvlMo0qN/Q==} - dev: true - - /@vitest/expect@0.30.0: - resolution: {integrity: sha512-b/jLWBqi6WQHfezWm8VjgXdIyfejAurtxqdyCdDqoToCim5W/nDxKjFAADitEHPz80oz+IP+c+wmkGKBucSpiw==} - dependencies: - '@vitest/spy': 0.30.0 - '@vitest/utils': 0.30.0 - chai: 4.3.7 - dev: true - - /@vitest/runner@0.30.0: - resolution: {integrity: sha512-Xh4xkdRcymdeRNrSwjhgarCTSgnQu2J59wsFI6i4UhKrL5whzo5+vWyq7iWK1ht3fppPeNAtvkbqUDf+OJSCbQ==} - dependencies: - '@vitest/utils': 0.30.0 - concordance: 5.0.4 - p-limit: 4.0.0 - pathe: 1.1.0 - dev: true - - /@vitest/snapshot@0.30.0: - resolution: {integrity: sha512-e4eSGCy36Bw3/Tkir9qYJDlFsUz3NALFPNJSxzlY8CFl901TV9iZdKgpqXpyG1sAhLO0tPHThBAMHRi8hRA8cg==} - dependencies: - magic-string: 0.30.0 - pathe: 1.1.0 - pretty-format: 27.5.1 - dev: true - - /@vitest/spy@0.30.0: - resolution: {integrity: sha512-olTWyG5gVWdfhCrdgxWQb2K3JYtj1/ZwInFFOb4GZ2HFI91PUWHWHhLRPORxwRwVvoXD1MS1162vPJZuHlKJkg==} - dependencies: - tinyspy: 2.1.0 - dev: true - - /@vitest/utils@0.30.0: - resolution: {integrity: sha512-qFZgoOKQ+rJV9xG4BBxgOSilnLQ2gkfG4I+z1wBuuQ3AD33zQrnB88kMFfzsot1E1AbF3dNK1e4CU7q3ojahRA==} - dependencies: - concordance: 5.0.4 - loupe: 2.3.6 - pretty-format: 27.5.1 - dev: true - - /acorn-walk@8.2.0: - resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} - engines: {node: '>=0.4.0'} - dev: true - - /acorn@8.8.2: - resolution: {integrity: sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==} - engines: {node: '>=0.4.0'} - hasBin: true - dev: true - - /ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} - dev: true - - /ansi-styles@5.2.0: - resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} - engines: {node: '>=10'} - dev: true - - /assertion-error@1.1.0: - resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} - dev: true - - /blueimp-md5@2.19.0: - resolution: {integrity: sha512-DRQrD6gJyy8FbiE4s+bDoXS9hiW3Vbx5uCdwvcCf3zLHL+Iv7LtGHLpr+GZV8rHG8tK766FGYBwRbu8pELTt+w==} - dev: true - - /cac@6.7.14: - resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} - engines: {node: '>=8'} - dev: true - - /chai@4.3.7: - resolution: {integrity: sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==} - engines: {node: '>=4'} - dependencies: - assertion-error: 1.1.0 - check-error: 1.0.2 - deep-eql: 4.1.3 - get-func-name: 2.0.0 - loupe: 2.3.6 - pathval: 1.1.1 - type-detect: 4.0.8 - dev: true - - /check-error@1.0.2: - resolution: {integrity: sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==} - dev: true - - /concordance@5.0.4: - resolution: {integrity: sha512-OAcsnTEYu1ARJqWVGwf4zh4JDfHZEaSNlNccFmt8YjB2l/n19/PF2viLINHc57vO4FKIAFl2FWASIGZZWZ2Kxw==} - engines: {node: '>=10.18.0 <11 || >=12.14.0 <13 || >=14'} - dependencies: - date-time: 3.1.0 - esutils: 2.0.3 - fast-diff: 1.2.0 - js-string-escape: 1.0.1 - lodash: 4.17.21 - md5-hex: 3.0.1 - semver: 7.3.8 - well-known-symbols: 2.0.0 - dev: true - - /date-time@3.1.0: - resolution: {integrity: sha512-uqCUKXE5q1PNBXjPqvwhwJf9SwMoAHBgWJ6DcrnS5o+W2JOiIILl0JEdVD8SGujrNS02GGxgwAg2PN2zONgtjg==} - engines: {node: '>=6'} - dependencies: - time-zone: 1.0.0 - dev: true - - /debug@4.3.4: - resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - dependencies: - ms: 2.1.2 - dev: true - - /deep-eql@4.1.3: - resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==} - engines: {node: '>=6'} - dependencies: - type-detect: 4.0.8 - dev: true - - /esbuild@0.17.16: - resolution: {integrity: sha512-aeSuUKr9aFVY9Dc8ETVELGgkj4urg5isYx8pLf4wlGgB0vTFjxJQdHnNH6Shmx4vYYrOTLCHtRI5i1XZ9l2Zcg==} - engines: {node: '>=12'} - hasBin: true - requiresBuild: true - optionalDependencies: - '@esbuild/android-arm': 0.17.16 - '@esbuild/android-arm64': 0.17.16 - '@esbuild/android-x64': 0.17.16 - '@esbuild/darwin-arm64': 0.17.16 - '@esbuild/darwin-x64': 0.17.16 - '@esbuild/freebsd-arm64': 0.17.16 - '@esbuild/freebsd-x64': 0.17.16 - '@esbuild/linux-arm': 0.17.16 - '@esbuild/linux-arm64': 0.17.16 - '@esbuild/linux-ia32': 0.17.16 - '@esbuild/linux-loong64': 0.17.16 - '@esbuild/linux-mips64el': 0.17.16 - '@esbuild/linux-ppc64': 0.17.16 - '@esbuild/linux-riscv64': 0.17.16 - '@esbuild/linux-s390x': 0.17.16 - '@esbuild/linux-x64': 0.17.16 - '@esbuild/netbsd-x64': 0.17.16 - '@esbuild/openbsd-x64': 0.17.16 - '@esbuild/sunos-x64': 0.17.16 - '@esbuild/win32-arm64': 0.17.16 - '@esbuild/win32-ia32': 0.17.16 - '@esbuild/win32-x64': 0.17.16 - dev: true - - /esutils@2.0.3: - resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} - engines: {node: '>=0.10.0'} - dev: true - - /fast-diff@1.2.0: - resolution: {integrity: sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==} - dev: true - - /fsevents@2.3.2: - resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /function-bind@1.1.1: - resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} - dev: true - - /get-func-name@2.0.0: - resolution: {integrity: sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==} - dev: true - - /has@1.0.3: - resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} - engines: {node: '>= 0.4.0'} - dependencies: - function-bind: 1.1.1 - dev: true - - /is-core-module@2.11.0: - resolution: {integrity: sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==} - dependencies: - has: 1.0.3 - dev: true - - /js-string-escape@1.0.1: - resolution: {integrity: sha512-Smw4xcfIQ5LVjAOuJCvN/zIodzA/BBSsluuoSykP+lUvScIi4U6RJLfwHet5cxFnCswUjISV8oAXaqaJDY3chg==} - engines: {node: '>= 0.8'} - dev: true - - /jsonc-parser@3.2.0: - resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} - dev: true - - /local-pkg@0.4.3: - resolution: {integrity: sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==} - engines: {node: '>=14'} - dev: true - - /lodash@4.17.21: - resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} - dev: true - - /loupe@2.3.6: - resolution: {integrity: sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==} - dependencies: - get-func-name: 2.0.0 - dev: true - - /lru-cache@6.0.0: - resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} - engines: {node: '>=10'} - dependencies: - yallist: 4.0.0 - dev: true - - /magic-string@0.30.0: - resolution: {integrity: sha512-LA+31JYDJLs82r2ScLrlz1GjSgu66ZV518eyWT+S8VhyQn/JL0u9MeBOvQMGYiPk1DBiSN9DDMOcXvigJZaViQ==} - engines: {node: '>=12'} - dependencies: - '@jridgewell/sourcemap-codec': 1.4.15 - dev: true - - /md5-hex@3.0.1: - resolution: {integrity: sha512-BUiRtTtV39LIJwinWBjqVsU9xhdnz7/i889V859IBFpuqGAj6LuOvHv5XLbgZ2R7ptJoJaEcxkv88/h25T7Ciw==} - engines: {node: '>=8'} - dependencies: - blueimp-md5: 2.19.0 - dev: true - - /mlly@1.2.0: - resolution: {integrity: sha512-+c7A3CV0KGdKcylsI6khWyts/CYrGTrRVo4R/I7u/cUsy0Conxa6LUhiEzVKIw14lc2L5aiO4+SeVe4TeGRKww==} - dependencies: - acorn: 8.8.2 - pathe: 1.1.0 - pkg-types: 1.0.2 - ufo: 1.1.1 - dev: true - - /ms@2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - dev: true - - /nanoid@3.3.6: - resolution: {integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true - dev: true - - /p-limit@4.0.0: - resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dependencies: - yocto-queue: 1.0.0 - dev: true - - /path-parse@1.0.7: - resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} - dev: true - - /pathe@1.1.0: - resolution: {integrity: sha512-ODbEPR0KKHqECXW1GoxdDb+AZvULmXjVPy4rt+pGo2+TnjJTIPJQSVS6N63n8T2Ip+syHhbn52OewKicV0373w==} - dev: true - - /pathval@1.1.1: - resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} - dev: true - - /picocolors@1.0.0: - resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} - dev: true - - /pkg-types@1.0.2: - resolution: {integrity: sha512-hM58GKXOcj8WTqUXnsQyJYXdeAPbythQgEF3nTcEo+nkD49chjQ9IKm/QJy9xf6JakXptz86h7ecP2024rrLaQ==} - dependencies: - jsonc-parser: 3.2.0 - mlly: 1.2.0 - pathe: 1.1.0 - dev: true - - /postcss@8.4.21: - resolution: {integrity: sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==} - engines: {node: ^10 || ^12 || >=14} - dependencies: - nanoid: 3.3.6 - picocolors: 1.0.0 - source-map-js: 1.0.2 - dev: true - - /pretty-format@27.5.1: - resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - dependencies: - ansi-regex: 5.0.1 - ansi-styles: 5.2.0 - react-is: 17.0.2 - dev: true - - /react-is@17.0.2: - resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} - dev: true - - /resolve@1.22.2: - resolution: {integrity: sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==} - hasBin: true - dependencies: - is-core-module: 2.11.0 - path-parse: 1.0.7 - supports-preserve-symlinks-flag: 1.0.0 - dev: true - - /rollup@3.20.2: - resolution: {integrity: sha512-3zwkBQl7Ai7MFYQE0y1MeQ15+9jsi7XxfrqwTb/9EK8D9C9+//EBR4M+CuA1KODRaNbFez/lWxA5vhEGZp4MUg==} - engines: {node: '>=14.18.0', npm: '>=8.0.0'} - hasBin: true - optionalDependencies: - fsevents: 2.3.2 - dev: true - - /semver@7.3.8: - resolution: {integrity: sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==} - engines: {node: '>=10'} - hasBin: true - dependencies: - lru-cache: 6.0.0 - dev: true - - /siginfo@2.0.0: - resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} - dev: true - - /source-map-js@1.0.2: - resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} - engines: {node: '>=0.10.0'} - dev: true - - /source-map@0.6.1: - resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} - engines: {node: '>=0.10.0'} - dev: true - - /stackback@0.0.2: - resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} - dev: true - - /std-env@3.3.2: - resolution: {integrity: sha512-uUZI65yrV2Qva5gqE0+A7uVAvO40iPo6jGhs7s8keRfHCmtg+uB2X6EiLGCI9IgL1J17xGhvoOqSz79lzICPTA==} - dev: true - - /strip-literal@1.0.1: - resolution: {integrity: sha512-QZTsipNpa2Ppr6v1AmJHESqJ3Uz247MUS0OjrnnZjFAvEoWqxuyFuXn2xLgMtRnijJShAa1HL0gtJyUs7u7n3Q==} - dependencies: - acorn: 8.8.2 - dev: true - - /supports-preserve-symlinks-flag@1.0.0: - resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} - engines: {node: '>= 0.4'} - dev: true - - /time-zone@1.0.0: - resolution: {integrity: sha512-TIsDdtKo6+XrPtiTm1ssmMngN1sAhyKnTO2kunQWqNPWIVvCm15Wmw4SWInwTVgJ5u/Tr04+8Ei9TNcw4x4ONA==} - engines: {node: '>=4'} - dev: true - - /tinybench@2.4.0: - resolution: {integrity: sha512-iyziEiyFxX4kyxSp+MtY1oCH/lvjH3PxFN8PGCDeqcZWAJ/i+9y+nL85w99PxVzrIvew/GSkSbDYtiGVa85Afg==} - dev: true - - /tinypool@0.4.0: - resolution: {integrity: sha512-2ksntHOKf893wSAH4z/+JbPpi92esw8Gn9N2deXX+B0EO92hexAVI9GIZZPx7P5aYo5KULfeOSt3kMOmSOy6uA==} - engines: {node: '>=14.0.0'} - dev: true - - /tinyspy@2.1.0: - resolution: {integrity: sha512-7eORpyqImoOvkQJCSkL0d0mB4NHHIFAy4b1u8PHdDa7SjGS2njzl6/lyGoZLm+eyYEtlUmFGE0rFj66SWxZgQQ==} - engines: {node: '>=14.0.0'} - dev: true - - /ts-essentials@9.3.1(typescript@5.0.4): - resolution: {integrity: sha512-9CChSvQMyVRo29Vb1A2jbs+LKo3d/bAf+ndSaX0T8cEiy/HChVaRN/HY5DqUryZ8hZ6uol9bEgCnGmnDbwBR9Q==} - peerDependencies: - typescript: '>=4.1.0' - dependencies: - typescript: 5.0.4 - dev: true - - /type-detect@4.0.8: - resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} - engines: {node: '>=4'} - dev: true - - /typescript@5.0.4: - resolution: {integrity: sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==} - engines: {node: '>=12.20'} - hasBin: true - dev: true - - /ufo@1.1.1: - resolution: {integrity: sha512-MvlCc4GHrmZdAllBc0iUDowff36Q9Ndw/UzqmEKyrfSzokTd9ZCy1i+IIk5hrYKkjoYVQyNbrw7/F8XJ2rEwTg==} - dev: true - - /vite-node@0.30.0(@types/node@18.15.11): - resolution: {integrity: sha512-23X5Ggylx0kU/bMf8MCcEEl55d/gsTtU81mMZjm7Z0FSpgKZexUqmX3mJtgglP9SySQQs9ydYg/GEahi/cKHaA==} - engines: {node: '>=v14.18.0'} - hasBin: true - dependencies: - cac: 6.7.14 - debug: 4.3.4 - mlly: 1.2.0 - pathe: 1.1.0 - picocolors: 1.0.0 - vite: 4.2.1(@types/node@18.15.11) - transitivePeerDependencies: - - '@types/node' - - less - - sass - - stylus - - sugarss - - supports-color - - terser - dev: true - - /vite@4.2.1(@types/node@18.15.11): - resolution: {integrity: sha512-7MKhqdy0ISo4wnvwtqZkjke6XN4taqQ2TBaTccLIpOKv7Vp2h4Y+NpmWCnGDeSvvn45KxvWgGyb0MkHvY1vgbg==} - engines: {node: ^14.18.0 || >=16.0.0} - hasBin: true - peerDependencies: - '@types/node': '>= 14' - less: '*' - sass: '*' - stylus: '*' - sugarss: '*' - terser: ^5.4.0 - peerDependenciesMeta: - '@types/node': - optional: true - less: - optional: true - sass: - optional: true - stylus: - optional: true - sugarss: - optional: true - terser: - optional: true - dependencies: - '@types/node': 18.15.11 - esbuild: 0.17.16 - postcss: 8.4.21 - resolve: 1.22.2 - rollup: 3.20.2 - optionalDependencies: - fsevents: 2.3.2 - dev: true - - /vitest-mock-extended@1.1.3(typescript@5.0.4)(vitest@0.30.0): - resolution: {integrity: sha512-MiaKYZbTg+fjozKnCpoTTva0BnlSNYyk4jiPuM2xVhg4aou112QIrALdH3/ZKK6qfXWh0A17gFIjWJjylOlXxg==} - peerDependencies: - typescript: 3.x || 4.x || 5.x - vitest: '>=0.29.2' - dependencies: - ts-essentials: 9.3.1(typescript@5.0.4) - typescript: 5.0.4 - vitest: 0.30.0 - dev: true - - /vitest@0.30.0: - resolution: {integrity: sha512-2WW4WeTHtrLFeoiuotWvEW6khozx1NvMGYoGsNz2btdddEbqvEdPJIouIdoiC5i61Rl1ctZvm9cn2R9TcPQlzw==} - engines: {node: '>=v14.18.0'} - hasBin: true - peerDependencies: - '@edge-runtime/vm': '*' - '@vitest/browser': '*' - '@vitest/ui': '*' - happy-dom: '*' - jsdom: '*' - playwright: '*' - safaridriver: '*' - webdriverio: '*' - peerDependenciesMeta: - '@edge-runtime/vm': - optional: true - '@vitest/browser': - optional: true - '@vitest/ui': - optional: true - happy-dom: - optional: true - jsdom: - optional: true - playwright: - optional: true - safaridriver: - optional: true - webdriverio: - optional: true - dependencies: - '@types/chai': 4.3.4 - '@types/chai-subset': 1.3.3 - '@types/node': 18.15.11 - '@vitest/expect': 0.30.0 - '@vitest/runner': 0.30.0 - '@vitest/snapshot': 0.30.0 - '@vitest/spy': 0.30.0 - '@vitest/utils': 0.30.0 - acorn: 8.8.2 - acorn-walk: 8.2.0 - cac: 6.7.14 - chai: 4.3.7 - concordance: 5.0.4 - debug: 4.3.4 - local-pkg: 0.4.3 - magic-string: 0.30.0 - pathe: 1.1.0 - picocolors: 1.0.0 - source-map: 0.6.1 - std-env: 3.3.2 - strip-literal: 1.0.1 - tinybench: 2.4.0 - tinypool: 0.4.0 - vite: 4.2.1(@types/node@18.15.11) - vite-node: 0.30.0(@types/node@18.15.11) - why-is-node-running: 2.2.2 - transitivePeerDependencies: - - less - - sass - - stylus - - sugarss - - supports-color - - terser - dev: true - - /well-known-symbols@2.0.0: - resolution: {integrity: sha512-ZMjC3ho+KXo0BfJb7JgtQ5IBuvnShdlACNkKkdsqBmYw3bPAaJfPeYUo6tLUaT5tG/Gkh7xkpBhKRQ9e7pyg9Q==} - engines: {node: '>=6'} - 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 - - /yallist@4.0.0: - resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} - dev: true - - /yocto-queue@1.0.0: - resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} - engines: {node: '>=12.20'} - dev: true From 3da15cc11f5cfa0a79f2c8fd9751358f98ab2430 Mon Sep 17 00:00:00 2001 From: Florian LEROUX <10078837+floriaaan@users.noreply.github.com> Date: Mon, 27 Mar 2023 11:42:00 +0200 Subject: [PATCH 261/883] feat: init delivery microservice (typescript, prisma, grpc) * add prisma (schema, singleton, seed) * add grpc implementation * add logger * add file structure with proper tsconfig * readme file model --- services/delivery/.env.example | 2 +- services/delivery/.gitignore | 1 - services/delivery/README.md | 60 +- services/delivery/package.json | 41 +- services/delivery/pnpm-lock.yaml | 2096 ++---------------------- services/delivery/prisma/schema.prisma | 14 +- services/delivery/prisma/seed.ts | 30 +- services/delivery/src/server.ts | 18 +- services/proto/delivery.proto | 33 +- 9 files changed, 207 insertions(+), 2088 deletions(-) diff --git a/services/delivery/.env.example b/services/delivery/.env.example index e7b2b4e7..6a86f4b9 100644 --- a/services/delivery/.env.example +++ b/services/delivery/.env.example @@ -1,2 +1,2 @@ -DATABASE_URL=postgres://postgres:password@localhost:5432/postgres +DATABASE_URL=postgres://postgres:postgres@localhost:5432/postgres PORT=50008 \ No newline at end of file diff --git a/services/delivery/.gitignore b/services/delivery/.gitignore index 31e50325..378e1eaa 100644 --- a/services/delivery/.gitignore +++ b/services/delivery/.gitignore @@ -1,6 +1,5 @@ node_modules/ dist/ -bin/ *.env* !*.env.example diff --git a/services/delivery/README.md b/services/delivery/README.md index c94da1c2..1086b6c8 100644 --- a/services/delivery/README.md +++ b/services/delivery/README.md @@ -1,11 +1,11 @@ # Delivery Microservice | Informations | -|--------------------------------------------------------------------| +| ------------------------------------------------------------------ | | **Port:** 50008 | | **Developer:** @floriaaan | | **Status:** In progress | -| **Last update:** 2023-04-09 | +| **Last update:** 2023-03-25 | | **Language:** NodeJS | | **Dependencies:** TypeScript, Prisma, gRPC, Postgres | | **Models:** (see [`prisma/schema.prisma`](./prisma/schema.prisma)) | @@ -14,20 +14,20 @@ - Delivery model: - - `CreateDelivery`: Creates a new delivery in the system. - - `GetDelivery`: Retrieves a delivery by its ID. - - `UpdateDelivery`: Updates the status of an existing delivery. - - `DeleteDelivery`: Deletes a delivery by its ID. - - `ListDeliveriesByUser`: Retrieves all deliveries for a given user. - - `ListDeliveriesByRestaurant`: Retrieves all deliveries for a given restaurant. + - `CreateDelivery`: Creates a new delivery in the system. + - `GetDelivery`: Retrieves a delivery by its ID. + - `UpdateDelivery`: Updates the status of an existing delivery. + - `DeleteDelivery`: Deletes a delivery by its ID. + - `ListDeliveriesByUser`: Retrieves all deliveries for a given user. + - `ListDeliveriesByRestaurant`: Retrieves all deliveries for a given restaurant. - Delivery person model: - - `CreateDeliveryPerson`: Creates a new delivery person in the system. - - `GetDeliveryPerson`: Retrieves a delivery person by its ID. - - `UpdateDeliveryPerson`: Updates an existing delivery person. - - `DeleteDeliveryPerson`: Deletes a delivery person by its ID. - - `ListDeliveryPersons`: Retrieves all delivery persons. - - `ListNearDeliveryPersons`: Retrieves all delivery persons near a given location. + - `CreateDeliveryPerson`: Creates a new delivery person in the system. + - `GetDeliveryPerson`: Retrieves a delivery person by its ID. + - `UpdateDeliveryPerson`: Updates an existing delivery person. + - `DeleteDeliveryPerson`: Deletes a delivery person by its ID. + - `ListDeliveryPersons`: Retrieves all delivery persons. + - `ListNearDeliveryPersons`: Retrieves all delivery persons near a given location. ## Requirements @@ -39,9 +39,9 @@ To run this microservice, you will need to have the following installed on your You can use the following tools to help you with the setup: - You can use nvm to set your Node version using: - - `nvm use`. + - `nvm use`. - You can use docker to run your Postgres database using: - - `docker run --name postgres -p 5432:5432 -e POSTGRES_PASSWORD=password -d postgres` + - `docker run --name postgres -e POSTGRES_PASSWORD=password -d postgres`. ## Getting started @@ -50,8 +50,7 @@ You can use the following tools to help you with the setup: 1. Clone the `goodfood` repository to your local machine. 2. Navigate to the service directory (`services/delivery`) in your terminal. 3. Run `npm install` to install the necessary dependencies. -4. Create a `.env` file at the root of the project directory and add the environment variables values ( - see `.env.example`). +4. Create a `.env` file at the root of the project directory and add the environment variables values (see `.env.example`). 5. Run `npm run start` to start the microservice. You can now access the microservice at `http://localhost:50008`. @@ -60,31 +59,10 @@ NB: If you want to run the microservice in development mode, you can run `npm ru ### 2. Create and seed the database -Run the following command to create your Postgres database structure. This also creates the models tables that are -defined in [`prisma/schema.prisma`](./prisma/schema.prisma): +Run the following command to create your Postgres database structure. This also creates the models tables that are defined in [`prisma/schema.prisma`](./prisma/schema.prisma): ``` npx prisma migrate dev --name init ``` -When `npx prisma migrate dev` is executed against a newly created database, seeding is also triggered. The seed file -in [`prisma/seed.ts`](./prisma/seed.ts) will be executed and your database will be populated with the sample data. - -## Build and Run with Docker - -### Build - -To build the image you need to be in the **parent folder** of the service you want to build. Then run the following -command: - -``` -docker build -t goodfood-delivery:1.0.0 -f ./delivery/Dockerfile . -``` - -### Run - -Create the .env base on the .env.example. Then run the following command: - -``` -docker run --env-file=.env goodfood-delivery:1.0.0 -``` +When `npx prisma migrate dev` is executed against a newly created database, seeding is also triggered. The seed file in [`prisma/seed.ts`](./prisma/seed.ts) will be executed and your database will be populated with the sample data. diff --git a/services/delivery/package.json b/services/delivery/package.json index 5df9a80b..09782b02 100644 --- a/services/delivery/package.json +++ b/services/delivery/package.json @@ -1,22 +1,9 @@ { - "name": "@goodfood/delivery", - "bin": "dist/index.js", + "name": "typescript-grpc", "scripts": { - "start": "node dist/index.js", - "dev": "nodemon --watch 'src/**/*.ts' --exec 'ts-node' src/server.ts", - "build": "esbuild src/server.ts --bundle --platform=node --target=node18 --outfile=dist/index.js", - "test": "echo 'tests are disabled' # vitest", - "coverage": "vitest --coverage", - "pkg": "pkg .", - "prisma:generate": "prisma generate", + "dev": "ts-node ./src/server.ts", "seed": "ts-node prisma/seed.ts", - "postinstall": "npm run prisma:generate", - "client:delivery-create": "ts-node ./src/client/delivery/create.ts", - "client:delivery-get": "ts-node ./src/client/delivery/get.ts", - "client:delivery-update": "ts-node ./src/client/delivery/update.ts", - "client:delivery-delete": "ts-node ./src/client/delivery/delete.ts", - "client:delivery-listByRestaurant": "ts-node ./src/client/delivery/list-by-restaurant.ts", - "client:delivery-listByUser": "ts-node ./src/client/delivery/list-by-user.ts" + "client:delivery-create": "ts-node ./src/client/delivery-create.ts" }, "dependencies": { "@grpc/grpc-js": "^1.8.13", @@ -27,32 +14,12 @@ }, "devDependencies": { "@types/node": "18.15.9", - "@vitest/coverage-c8": "^0.29.8", - "esbuild": "^0.17.14", - "nodemon": "^2.0.22", - "pkg": "^5.8.1", "prisma": "4.11.0", "ts-node": "10.9.1", "tsconfig-paths": "^4.1.2", - "typescript": "5.0.2", - "vite-tsconfig-paths": "^4.0.7", - "vitest": "^0.29.8", - "vitest-mock-extended": "^1.1.3" + "typescript": "5.0.2" }, "prisma": { "seed": "ts-node prisma/seed.ts" - }, - "pkg": { - "scripts": "./src/dist/index.js", - "assets": [ - "./prisma/**/*", - "../proto/**/*" - ], - "targets": [ - "node18-macos-arm64", - "node18-linux-x64", - "node18-linux-arm64" - ], - "outputPath": "bin/" } } diff --git a/services/delivery/pnpm-lock.yaml b/services/delivery/pnpm-lock.yaml index 1d1dba13..50a04449 100644 --- a/services/delivery/pnpm-lock.yaml +++ b/services/delivery/pnpm-lock.yaml @@ -1,308 +1,43 @@ -lockfileVersion: '6.0' +lockfileVersion: 5.4 + +specifiers: + '@grpc/grpc-js': ^1.8.13 + '@grpc/proto-loader': 0.7.6 + '@prisma/client': 4.11.0 + '@types/node': 18.15.9 + chalk: 4.1.2 + dotenv: ^16.0.3 + prisma: 4.11.0 + protobufjs: 7.2.2 + ts-node: 10.9.1 + tsconfig-paths: ^4.1.2 + typescript: 5.0.2 dependencies: - '@grpc/grpc-js': - specifier: ^1.8.13 - version: 1.8.13 - '@grpc/proto-loader': - specifier: 0.7.6 - version: 0.7.6 - '@prisma/client': - specifier: 4.11.0 - version: 4.11.0(prisma@4.11.0) - dotenv: - specifier: ^16.0.3 - version: 16.0.3 - protobufjs: - specifier: 7.2.2 - version: 7.2.2 + '@grpc/grpc-js': 1.8.13 + '@grpc/proto-loader': 0.7.6 + '@prisma/client': 4.11.0_prisma@4.11.0 + chalk: 4.1.2 + dotenv: 16.0.3 + protobufjs: 7.2.2 devDependencies: - '@types/node': - specifier: 18.15.9 - version: 18.15.9 - '@vitest/coverage-c8': - specifier: ^0.29.8 - version: 0.29.8(vitest@0.29.8) - esbuild: - specifier: ^0.17.14 - version: 0.17.14 - nodemon: - specifier: ^2.0.22 - version: 2.0.22 - pkg: - specifier: ^5.8.1 - version: 5.8.1 - prisma: - specifier: 4.11.0 - version: 4.11.0 - ts-node: - specifier: 10.9.1 - version: 10.9.1(@types/node@18.15.9)(typescript@5.0.2) - tsconfig-paths: - specifier: ^4.1.2 - version: 4.1.2 - typescript: - specifier: 5.0.2 - version: 5.0.2 - vite-tsconfig-paths: - specifier: ^4.0.7 - version: 4.0.7(typescript@5.0.2) - vitest: - specifier: ^0.29.8 - version: 0.29.8 - vitest-mock-extended: - specifier: ^1.1.3 - version: 1.1.3(typescript@5.0.2)(vitest@0.29.8) + '@types/node': 18.15.9 + prisma: 4.11.0 + ts-node: 10.9.1_3flabivgbrnlfzsgzfhinuvrvy + tsconfig-paths: 4.1.2 + typescript: 5.0.2 packages: - /@babel/generator@7.18.2: - resolution: {integrity: sha512-W1lG5vUwFvfMd8HVXqdfbuG7RuaSrTCCD8cl8fP8wOivdbtbIg2Db3IWUcgvfxKbbn6ZBGYRW/Zk1MIwK49mgw==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.19.0 - '@jridgewell/gen-mapping': 0.3.2 - jsesc: 2.5.2 - dev: true - - /@babel/helper-string-parser@7.19.4: - resolution: {integrity: sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==} - engines: {node: '>=6.9.0'} - dev: true - - /@babel/helper-validator-identifier@7.19.1: - resolution: {integrity: sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==} - engines: {node: '>=6.9.0'} - dev: true - - /@babel/parser@7.18.4: - resolution: {integrity: sha512-FDge0dFazETFcxGw/EXzOkN8uJp0PC7Qbm+Pe9T+av2zlBpOgunFHkQPPn+eRuClU73JF+98D531UgayY89tow==} - engines: {node: '>=6.0.0'} - hasBin: true - dependencies: - '@babel/types': 7.19.0 - dev: true - - /@babel/types@7.19.0: - resolution: {integrity: sha512-YuGopBq3ke25BVSiS6fgF49Ul9gH1x70Bcr6bqRLjWCkcX8Hre1/5+z+IiWOIerRMSSEfGZVB9z9kyq7wVs9YA==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-string-parser': 7.19.4 - '@babel/helper-validator-identifier': 7.19.1 - 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: + /@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 - /@esbuild/android-arm64@0.17.14: - resolution: {integrity: sha512-eLOpPO1RvtsP71afiFTvS7tVFShJBCT0txiv/xjFBo5a7R7Gjw7X0IgIaFoLKhqXYAXhahoXm7qAmRXhY4guJg==} - engines: {node: '>=12'} - cpu: [arm64] - os: [android] - requiresBuild: true - dev: true - optional: true - - /@esbuild/android-arm@0.17.14: - resolution: {integrity: sha512-0CnlwnjDU8cks0yJLXfkaU/uoLyRf9VZJs4p1PskBr2AlAHeEsFEwJEo0of/Z3g+ilw5mpyDwThlxzNEIxOE4g==} - engines: {node: '>=12'} - cpu: [arm] - os: [android] - requiresBuild: true - dev: true - optional: true - - /@esbuild/android-x64@0.17.14: - resolution: {integrity: sha512-nrfQYWBfLGfSGLvRVlt6xi63B5IbfHm3tZCdu/82zuFPQ7zez4XjmRtF/wIRYbJQ/DsZrxJdEvYFE67avYXyng==} - engines: {node: '>=12'} - cpu: [x64] - os: [android] - requiresBuild: true - dev: true - optional: true - - /@esbuild/darwin-arm64@0.17.14: - resolution: {integrity: sha512-eoSjEuDsU1ROwgBH/c+fZzuSyJUVXQTOIN9xuLs9dE/9HbV/A5IqdXHU1p2OfIMwBwOYJ9SFVGGldxeRCUJFyw==} - engines: {node: '>=12'} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /@esbuild/darwin-x64@0.17.14: - resolution: {integrity: sha512-zN0U8RWfrDttdFNkHqFYZtOH8hdi22z0pFm0aIJPsNC4QQZv7je8DWCX5iA4Zx6tRhS0CCc0XC2m7wKsbWEo5g==} - engines: {node: '>=12'} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /@esbuild/freebsd-arm64@0.17.14: - resolution: {integrity: sha512-z0VcD4ibeZWVQCW1O7szaLxGsx54gcCnajEJMdYoYjLiq4g1jrP2lMq6pk71dbS5+7op/L2Aod+erw+EUr28/A==} - engines: {node: '>=12'} - cpu: [arm64] - os: [freebsd] - requiresBuild: true - dev: true - optional: true - - /@esbuild/freebsd-x64@0.17.14: - resolution: {integrity: sha512-hd9mPcxfTgJlolrPlcXkQk9BMwNBvNBsVaUe5eNUqXut6weDQH8whcNaKNF2RO8NbpT6GY8rHOK2A9y++s+ehw==} - engines: {node: '>=12'} - cpu: [x64] - os: [freebsd] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-arm64@0.17.14: - resolution: {integrity: sha512-FhAMNYOq3Iblcj9i+K0l1Fp/MHt+zBeRu/Qkf0LtrcFu3T45jcwB6A1iMsemQ42vR3GBhjNZJZTaCe3VFPbn9g==} - engines: {node: '>=12'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-arm@0.17.14: - resolution: {integrity: sha512-BNTl+wSJ1omsH8s3TkQmIIIQHwvwJrU9u1ggb9XU2KTVM4TmthRIVyxSp2qxROJHhZuW/r8fht46/QE8hU8Qvg==} - engines: {node: '>=12'} - cpu: [arm] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-ia32@0.17.14: - resolution: {integrity: sha512-91OK/lQ5y2v7AsmnFT+0EyxdPTNhov3y2CWMdizyMfxSxRqHazXdzgBKtlmkU2KYIc+9ZK3Vwp2KyXogEATYxQ==} - engines: {node: '>=12'} - cpu: [ia32] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-loong64@0.17.14: - resolution: {integrity: sha512-vp15H+5NR6hubNgMluqqKza85HcGJgq7t6rMH7O3Y6ApiOWPkvW2AJfNojUQimfTp6OUrACUXfR4hmpcENXoMQ==} - engines: {node: '>=12'} - cpu: [loong64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-mips64el@0.17.14: - resolution: {integrity: sha512-90TOdFV7N+fgi6c2+GO9ochEkmm9kBAKnuD5e08GQMgMINOdOFHuYLPQ91RYVrnWwQ5683sJKuLi9l4SsbJ7Hg==} - engines: {node: '>=12'} - cpu: [mips64el] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-ppc64@0.17.14: - resolution: {integrity: sha512-NnBGeoqKkTugpBOBZZoktQQ1Yqb7aHKmHxsw43NddPB2YWLAlpb7THZIzsRsTr0Xw3nqiPxbA1H31ZMOG+VVPQ==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-riscv64@0.17.14: - resolution: {integrity: sha512-0qdlKScLXA8MGVy21JUKvMzCYWovctuP8KKqhtE5A6IVPq4onxXhSuhwDd2g5sRCzNDlDjitc5sX31BzDoL5Fw==} - engines: {node: '>=12'} - cpu: [riscv64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-s390x@0.17.14: - resolution: {integrity: sha512-Hdm2Jo1yaaOro4v3+6/zJk6ygCqIZuSDJHdHaf8nVH/tfOuoEX5Riv03Ka15LmQBYJObUTNS1UdyoMk0WUn9Ww==} - engines: {node: '>=12'} - cpu: [s390x] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-x64@0.17.14: - resolution: {integrity: sha512-8KHF17OstlK4DuzeF/KmSgzrTWQrkWj5boluiiq7kvJCiQVzUrmSkaBvcLB2UgHpKENO2i6BthPkmUhNDaJsVw==} - engines: {node: '>=12'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/netbsd-x64@0.17.14: - resolution: {integrity: sha512-nVwpqvb3yyXztxIT2+VsxJhB5GCgzPdk1n0HHSnchRAcxqKO6ghXwHhJnr0j/B+5FSyEqSxF4q03rbA2fKXtUQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [netbsd] - requiresBuild: true - dev: true - optional: true - - /@esbuild/openbsd-x64@0.17.14: - resolution: {integrity: sha512-1RZ7uQQ9zcy/GSAJL1xPdN7NDdOOtNEGiJalg/MOzeakZeTrgH/DoCkbq7TaPDiPhWqnDF+4bnydxRqQD7il6g==} - engines: {node: '>=12'} - cpu: [x64] - os: [openbsd] - requiresBuild: true - dev: true - optional: true - - /@esbuild/sunos-x64@0.17.14: - resolution: {integrity: sha512-nqMjDsFwv7vp7msrwWRysnM38Sd44PKmW8EzV01YzDBTcTWUpczQg6mGao9VLicXSgW/iookNK6AxeogNVNDZA==} - engines: {node: '>=12'} - cpu: [x64] - os: [sunos] - requiresBuild: true - dev: true - optional: true - - /@esbuild/win32-arm64@0.17.14: - resolution: {integrity: sha512-xrD0mccTKRBBIotrITV7WVQAwNJ5+1va6L0H9zN92v2yEdjfAN7864cUaZwJS7JPEs53bDTzKFbfqVlG2HhyKQ==} - engines: {node: '>=12'} - cpu: [arm64] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /@esbuild/win32-ia32@0.17.14: - resolution: {integrity: sha512-nXpkz9bbJrLLyUTYtRotSS3t5b+FOuljg8LgLdINWFs3FfqZMtbnBCZFUmBzQPyxqU87F8Av+3Nco/M3hEcu1w==} - engines: {node: '>=12'} - cpu: [ia32] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /@esbuild/win32-x64@0.17.14: - resolution: {integrity: sha512-gPQmsi2DKTaEgG14hc3CHXHp62k8g6qr0Pas+I4lUxRMugGSATh/Bi8Dgusoz9IQ0IfdrvLpco6kujEIBoaogA==} - engines: {node: '>=12'} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /@grpc/grpc-js@1.8.13: + /@grpc/grpc-js/1.8.13: resolution: {integrity: sha512-iY3jsdfbc0ARoCLFvbvUB8optgyb0r1XLPb142u+QtgBcKJYkCIFt3Fd/881KqjLYWjsBJF57N3b8Eop9NDfUA==} engines: {node: ^8.13.0 || >=10.10.0} dependencies: @@ -310,7 +45,7 @@ packages: '@types/node': 18.15.9 dev: false - /@grpc/proto-loader@0.7.6: + /@grpc/proto-loader/0.7.6: resolution: {integrity: sha512-QyAXR8Hyh7uMDmveWxDSUcJr9NAWaZ2I6IXgAYvQmfflwouTM+rArE2eEaCtLlRqO81j7pRLCt81IefUei6Zbw==} engines: {node: '>=6'} hasBin: true @@ -322,70 +57,23 @@ packages: yargs: 16.2.0 dev: false - /@istanbuljs/schema@0.1.3: - resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} - engines: {node: '>=8'} - dev: true - - /@jridgewell/gen-mapping@0.3.2: - resolution: {integrity: sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==} - engines: {node: '>=6.0.0'} - dependencies: - '@jridgewell/set-array': 1.1.2 - '@jridgewell/sourcemap-codec': 1.4.14 - '@jridgewell/trace-mapping': 0.3.9 - dev: true - - /@jridgewell/resolve-uri@3.1.0: + /@jridgewell/resolve-uri/3.1.0: resolution: {integrity: sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==} 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.14: + /@jridgewell/sourcemap-codec/1.4.14: resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==} dev: true - /@jridgewell/trace-mapping@0.3.17: - resolution: {integrity: sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==} - dependencies: - '@jridgewell/resolve-uri': 3.1.0 - '@jridgewell/sourcemap-codec': 1.4.14 - dev: true - - /@jridgewell/trace-mapping@0.3.9: + /@jridgewell/trace-mapping/0.3.9: resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} dependencies: '@jridgewell/resolve-uri': 3.1.0 '@jridgewell/sourcemap-codec': 1.4.14 dev: true - /@nodelib/fs.scandir@2.1.5: - resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} - engines: {node: '>= 8'} - dependencies: - '@nodelib/fs.stat': 2.0.5 - run-parallel: 1.2.0 - dev: true - - /@nodelib/fs.stat@2.0.5: - resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} - engines: {node: '>= 8'} - dev: true - - /@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: true - - /@prisma/client@4.11.0(prisma@4.11.0): + /@prisma/client/4.11.0_prisma@4.11.0: resolution: {integrity: sha512-0INHYkQIqgAjrt7NzhYpeDQi8x3Nvylc2uDngKyFDDj1tTRQ4uV1HnVmd1sQEraeVAN63SOK0dgCKQHlvjL0KA==} engines: {node: '>=14.17'} requiresBuild: true @@ -399,1499 +87,259 @@ packages: prisma: 4.11.0 dev: false - /@prisma/engines-version@4.11.0-57.8fde8fef4033376662cad983758335009d522acb: + /@prisma/engines-version/4.11.0-57.8fde8fef4033376662cad983758335009d522acb: resolution: {integrity: sha512-3Vd8Qq06d5xD8Ch5WauWcUUrsVPdMC6Ge8ILji8RFfyhUpqon6qSyGM0apvr1O8n8qH8cKkEFqRPsYjuz5r83g==} dev: false - /@prisma/engines@4.11.0: + /@prisma/engines/4.11.0: resolution: {integrity: sha512-0AEBi2HXGV02cf6ASsBPhfsVIbVSDC9nbQed4iiY5eHttW9ZtMxHThuKZE1pnESbr8HRdgmFSa/Kn4OSNYuibg==} requiresBuild: true - /@protobufjs/aspromise@1.1.2: + /@protobufjs/aspromise/1.1.2: resolution: {integrity: sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==} dev: false - /@protobufjs/base64@1.1.2: + /@protobufjs/base64/1.1.2: resolution: {integrity: sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==} dev: false - /@protobufjs/codegen@2.0.4: + /@protobufjs/codegen/2.0.4: resolution: {integrity: sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==} dev: false - /@protobufjs/eventemitter@1.1.0: + /@protobufjs/eventemitter/1.1.0: resolution: {integrity: sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==} dev: false - /@protobufjs/fetch@1.1.0: + /@protobufjs/fetch/1.1.0: resolution: {integrity: sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==} dependencies: '@protobufjs/aspromise': 1.1.2 '@protobufjs/inquire': 1.1.0 dev: false - /@protobufjs/float@1.0.2: + /@protobufjs/float/1.0.2: resolution: {integrity: sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==} dev: false - /@protobufjs/inquire@1.1.0: + /@protobufjs/inquire/1.1.0: resolution: {integrity: sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==} dev: false - /@protobufjs/path@1.1.2: + /@protobufjs/path/1.1.2: resolution: {integrity: sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==} dev: false - /@protobufjs/pool@1.1.0: + /@protobufjs/pool/1.1.0: resolution: {integrity: sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==} dev: false - /@protobufjs/utf8@1.1.0: + /@protobufjs/utf8/1.1.0: resolution: {integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==} dev: false - /@tsconfig/node10@1.0.9: + /@tsconfig/node10/1.0.9: resolution: {integrity: sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==} dev: true - /@tsconfig/node12@1.0.11: + /@tsconfig/node12/1.0.11: resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} dev: true - /@tsconfig/node14@1.0.3: + /@tsconfig/node14/1.0.3: resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} dev: true - /@tsconfig/node16@1.0.3: + /@tsconfig/node16/1.0.3: resolution: {integrity: sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==} dev: true - /@types/chai-subset@1.3.3: - resolution: {integrity: sha512-frBecisrNGz+F4T6bcc+NLeolfiojh5FxW2klu669+8BARtyQv2C/GkNW6FUodVe4BroGMP/wER/YDGc7rEllw==} - dependencies: - '@types/chai': 4.3.4 - dev: true - - /@types/chai@4.3.4: - resolution: {integrity: sha512-KnRanxnpfpjUTqTCXslZSEdLfXExwgNxYPdiO2WGUj8+HDjFi8R3k5RVKPeSCzLjCcshCAtVO2QBbVuAV4kTnw==} - dev: true - - /@types/istanbul-lib-coverage@2.0.4: - resolution: {integrity: sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==} - dev: true - - /@types/long@4.0.2: + /@types/long/4.0.2: resolution: {integrity: sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==} dev: false - /@types/node@18.15.9: + /@types/node/18.15.9: resolution: {integrity: sha512-dUxhiNzBLr6IqlZXz6e/rN2YQXlFgOei/Dxy+e3cyXTJ4txSUbGT2/fmnD6zd/75jDMeW5bDee+YXxlFKHoV0A==} - /@vitest/coverage-c8@0.29.8(vitest@0.29.8): - resolution: {integrity: sha512-y+sEMQMctWokjnSqm3FCQEYFkjLrYaznsxEZHxcx8z2aftpYg3A5tvI1S5himfdEFo7o+OeHzh40bPSWZHW4oQ==} - peerDependencies: - vitest: '>=0.29.0 <1' - dependencies: - c8: 7.13.0 - picocolors: 1.0.0 - std-env: 3.3.2 - vitest: 0.29.8 - dev: true - - /@vitest/expect@0.29.8: - resolution: {integrity: sha512-xlcVXn5I5oTq6NiZSY3ykyWixBxr5mG8HYtjvpgg6KaqHm0mvhX18xuwl5YGxIRNt/A5jidd7CWcNHrSvgaQqQ==} - dependencies: - '@vitest/spy': 0.29.8 - '@vitest/utils': 0.29.8 - chai: 4.3.7 - dev: true - - /@vitest/runner@0.29.8: - resolution: {integrity: sha512-FzdhnRDwEr/A3Oo1jtIk/B952BBvP32n1ObMEb23oEJNO+qO5cBet6M2XWIDQmA7BDKGKvmhUf2naXyp/2JEwQ==} - dependencies: - '@vitest/utils': 0.29.8 - p-limit: 4.0.0 - pathe: 1.1.0 - dev: true - - /@vitest/spy@0.29.8: - resolution: {integrity: sha512-VdjBe9w34vOMl5I5mYEzNX8inTxrZ+tYUVk9jxaZJmHFwmDFC/GV3KBFTA/JKswr3XHvZL+FE/yq5EVhb6pSAw==} - dependencies: - tinyspy: 1.1.1 - dev: true - - /@vitest/utils@0.29.8: - resolution: {integrity: sha512-qGzuf3vrTbnoY+RjjVVIBYfuWMjn3UMUqyQtdGNZ6ZIIyte7B37exj6LaVkrZiUTvzSadVvO/tJm8AEgbGCBPg==} - dependencies: - cli-truncate: 3.1.0 - diff: 5.1.0 - loupe: 2.3.6 - pretty-format: 27.5.1 - dev: true - - /abbrev@1.1.1: - resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} - dev: true - - /acorn-walk@8.2.0: + /acorn-walk/8.2.0: resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} engines: {node: '>=0.4.0'} dev: true - /acorn@8.8.2: + /acorn/8.8.2: resolution: {integrity: sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==} engines: {node: '>=0.4.0'} hasBin: true dev: true - /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 - dev: true - - /ansi-regex@5.0.1: + /ansi-regex/5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} + dev: false - /ansi-regex@6.0.1: - resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} - engines: {node: '>=12'} - dev: true - - /ansi-styles@4.3.0: + /ansi-styles/4.3.0: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} engines: {node: '>=8'} dependencies: color-convert: 2.0.1 + dev: false - /ansi-styles@5.2.0: - resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} - engines: {node: '>=10'} - dev: true - - /ansi-styles@6.2.1: - resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} - engines: {node: '>=12'} - dev: true - - /anymatch@3.1.3: - resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} - engines: {node: '>= 8'} - dependencies: - normalize-path: 3.0.0 - picomatch: 2.3.1 - dev: true - - /arg@4.1.3: + /arg/4.1.3: resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} dev: true - /array-union@2.1.0: - resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} - engines: {node: '>=8'} - dev: true - - /assertion-error@1.1.0: - resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} - dev: true - - /at-least-node@1.0.0: - resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} - engines: {node: '>= 4.0.0'} - dev: true - - /balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - dev: true - - /base64-js@1.5.1: - resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - dev: true - - /binary-extensions@2.2.0: - resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} - engines: {node: '>=8'} - dev: true - - /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: true - - /brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} - dependencies: - balanced-match: 1.0.2 - concat-map: 0.0.1 - dev: true - - /braces@3.0.2: - resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} - engines: {node: '>=8'} - dependencies: - fill-range: 7.0.1 - dev: true - - /buffer@5.7.1: - resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} - dependencies: - base64-js: 1.5.1 - ieee754: 1.2.1 - dev: true - - /c8@7.13.0: - resolution: {integrity: sha512-/NL4hQTv1gBL6J6ei80zu3IiTrmePDKXKXOTLpHvcIWZTVYQlDhVWjjWvkhICylE8EwwnMVzDZugCvdx0/DIIA==} - engines: {node: '>=10.12.0'} - hasBin: true - dependencies: - '@bcoe/v8-coverage': 0.2.3 - '@istanbuljs/schema': 0.1.3 - find-up: 5.0.0 - foreground-child: 2.0.0 - istanbul-lib-coverage: 3.2.0 - istanbul-lib-report: 3.0.0 - istanbul-reports: 3.1.5 - rimraf: 3.0.2 - test-exclude: 6.0.0 - v8-to-istanbul: 9.1.0 - yargs: 16.2.0 - yargs-parser: 20.2.9 - dev: true - - /cac@6.7.14: - resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} - engines: {node: '>=8'} - dev: true - - /chai@4.3.7: - resolution: {integrity: sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==} - engines: {node: '>=4'} - dependencies: - assertion-error: 1.1.0 - check-error: 1.0.2 - deep-eql: 4.1.3 - get-func-name: 2.0.0 - loupe: 2.3.6 - pathval: 1.1.1 - type-detect: 4.0.8 - dev: true - - /chalk@4.1.2: + /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 - - /check-error@1.0.2: - resolution: {integrity: sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==} - dev: true - - /chokidar@3.5.3: - resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} - engines: {node: '>= 8.10.0'} - dependencies: - anymatch: 3.1.3 - braces: 3.0.2 - glob-parent: 5.1.2 - is-binary-path: 2.1.0 - is-glob: 4.0.3 - normalize-path: 3.0.0 - readdirp: 3.6.0 - optionalDependencies: - fsevents: 2.3.2 - dev: true - - /chownr@1.1.4: - resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} - dev: true - - /cli-truncate@3.1.0: - resolution: {integrity: sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dependencies: - slice-ansi: 5.0.0 - string-width: 5.1.2 - dev: true + dev: false - /cliui@7.0.4: + /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 - /color-convert@2.0.1: + /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: + /color-name/1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + dev: false - /concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - dev: true - - /convert-source-map@1.9.0: - resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} - dev: true - - /core-util-is@1.0.3: - resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} - dev: true - - /create-require@1.1.1: + /create-require/1.1.1: resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} dev: true - /cross-spawn@7.0.3: - resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} - engines: {node: '>= 8'} - dependencies: - path-key: 3.1.1 - shebang-command: 2.0.0 - which: 2.0.2 - dev: true - - /debug@3.2.7(supports-color@5.5.0): - resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - dependencies: - ms: 2.1.3 - supports-color: 5.5.0 + /diff/4.0.2: + resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} + engines: {node: '>=0.3.1'} dev: true - /debug@4.3.4: - resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - dependencies: - ms: 2.1.2 - dev: true + /dotenv/16.0.3: + resolution: {integrity: sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==} + engines: {node: '>=12'} + dev: false - /decompress-response@6.0.0: - resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} - engines: {node: '>=10'} - dependencies: - mimic-response: 3.1.0 - dev: true + /emoji-regex/8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + dev: false - /deep-eql@4.1.3: - resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==} + /escalade/3.1.1: + resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} engines: {node: '>=6'} - dependencies: - type-detect: 4.0.8 - dev: true - - /deep-extend@0.6.0: - resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} - engines: {node: '>=4.0.0'} - dev: true - - /detect-libc@2.0.1: - resolution: {integrity: sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==} - engines: {node: '>=8'} - dev: true - - /diff@4.0.2: - resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} - engines: {node: '>=0.3.1'} - dev: true - - /diff@5.1.0: - resolution: {integrity: sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==} - 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 - dev: true - - /dotenv@16.0.3: - resolution: {integrity: sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==} - engines: {node: '>=12'} - dev: false - - /eastasianwidth@0.2.0: - resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} - dev: true - - /emoji-regex@8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - - /emoji-regex@9.2.2: - resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} - dev: true - - /end-of-stream@1.4.4: - resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} - dependencies: - once: 1.4.0 - dev: true - - /esbuild@0.17.14: - resolution: {integrity: sha512-vOO5XhmVj/1XQR9NQ1UPq6qvMYL7QFJU57J5fKBKBKxp17uDt5PgxFDb4A2nEiXhr1qQs4x0F5+66hVVw4ruNw==} - engines: {node: '>=12'} - hasBin: true - requiresBuild: true - optionalDependencies: - '@esbuild/android-arm': 0.17.14 - '@esbuild/android-arm64': 0.17.14 - '@esbuild/android-x64': 0.17.14 - '@esbuild/darwin-arm64': 0.17.14 - '@esbuild/darwin-x64': 0.17.14 - '@esbuild/freebsd-arm64': 0.17.14 - '@esbuild/freebsd-x64': 0.17.14 - '@esbuild/linux-arm': 0.17.14 - '@esbuild/linux-arm64': 0.17.14 - '@esbuild/linux-ia32': 0.17.14 - '@esbuild/linux-loong64': 0.17.14 - '@esbuild/linux-mips64el': 0.17.14 - '@esbuild/linux-ppc64': 0.17.14 - '@esbuild/linux-riscv64': 0.17.14 - '@esbuild/linux-s390x': 0.17.14 - '@esbuild/linux-x64': 0.17.14 - '@esbuild/netbsd-x64': 0.17.14 - '@esbuild/openbsd-x64': 0.17.14 - '@esbuild/sunos-x64': 0.17.14 - '@esbuild/win32-arm64': 0.17.14 - '@esbuild/win32-ia32': 0.17.14 - '@esbuild/win32-x64': 0.17.14 - dev: true - - /escalade@3.1.1: - resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} - engines: {node: '>=6'} - - /expand-template@2.0.3: - resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} - engines: {node: '>=6'} - dev: true - - /fast-glob@3.2.12: - resolution: {integrity: sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==} - 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: true - - /fastq@1.15.0: - resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} - dependencies: - reusify: 1.0.4 - dev: true - - /fill-range@7.0.1: - resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} - engines: {node: '>=8'} - dependencies: - to-regex-range: 5.0.1 - dev: true - - /find-up@5.0.0: - resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} - engines: {node: '>=10'} - dependencies: - locate-path: 6.0.0 - path-exists: 4.0.0 - dev: true - - /foreground-child@2.0.0: - resolution: {integrity: sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==} - engines: {node: '>=8.0.0'} - dependencies: - cross-spawn: 7.0.3 - signal-exit: 3.0.7 - dev: true - - /from2@2.3.0: - resolution: {integrity: sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==} - dependencies: - inherits: 2.0.4 - readable-stream: 2.3.8 - dev: true - - /fs-constants@1.0.0: - resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} - dev: true - - /fs-extra@9.1.0: - resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==} - engines: {node: '>=10'} - dependencies: - at-least-node: 1.0.0 - graceful-fs: 4.2.11 - jsonfile: 6.1.0 - universalify: 2.0.0 - dev: true - - /fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - dev: true - - /fsevents@2.3.2: - resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /function-bind@1.1.1: - resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} - dev: true - - /get-caller-file@2.0.5: - resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} - engines: {node: 6.* || 8.* || >= 10.*} - - /get-func-name@2.0.0: - resolution: {integrity: sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==} - dev: true - - /github-from-package@0.0.0: - resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==} - dev: true - - /glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} - dependencies: - is-glob: 4.0.3 - dev: true - - /glob@7.2.3: - resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - dev: true - - /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.2.12 - ignore: 5.2.4 - merge2: 1.4.1 - slash: 3.0.0 - dev: true - - /globrex@0.1.2: - resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} - dev: true - - /graceful-fs@4.2.11: - resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - dev: true - - /has-flag@3.0.0: - resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} - engines: {node: '>=4'} - dev: true - - /has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} - dev: true - - /has@1.0.3: - resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} - engines: {node: '>= 0.4.0'} - dependencies: - function-bind: 1.1.1 - dev: true - - /html-escaper@2.0.2: - resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} - dev: true - - /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 - dev: true - - /ieee754@1.2.1: - resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - dev: true - - /ignore-by-default@1.0.1: - resolution: {integrity: sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==} - dev: true - - /ignore@5.2.4: - resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} - engines: {node: '>= 4'} - dev: true - - /inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} - dependencies: - once: 1.4.0 - wrappy: 1.0.2 - dev: true - - /inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - dev: true - - /ini@1.3.8: - resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} - dev: true - - /into-stream@6.0.0: - resolution: {integrity: sha512-XHbaOAvP+uFKUFsOgoNPRjLkwB+I22JFPFe5OjTkQ0nwgj6+pSjb4NmB6VMxaPshLiOf+zcpOCBQuLwC1KHhZA==} - engines: {node: '>=10'} - dependencies: - from2: 2.3.0 - p-is-promise: 3.0.0 - dev: true - - /is-binary-path@2.1.0: - resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} - engines: {node: '>=8'} - dependencies: - binary-extensions: 2.2.0 - dev: true - - /is-core-module@2.9.0: - resolution: {integrity: sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==} - dependencies: - has: 1.0.3 - dev: true - - /is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} - dev: true - - /is-fullwidth-code-point@3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} - engines: {node: '>=8'} - - /is-fullwidth-code-point@4.0.0: - resolution: {integrity: sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==} - engines: {node: '>=12'} - dev: true - - /is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} - dependencies: - is-extglob: 2.1.1 - dev: true - - /is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} - dev: true - - /isarray@1.0.0: - resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} - dev: true - - /isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - dev: true - - /istanbul-lib-coverage@3.2.0: - resolution: {integrity: sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==} - engines: {node: '>=8'} - dev: true - - /istanbul-lib-report@3.0.0: - resolution: {integrity: sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==} - engines: {node: '>=8'} - dependencies: - istanbul-lib-coverage: 3.2.0 - make-dir: 3.1.0 - supports-color: 7.2.0 - dev: true - - /istanbul-reports@3.1.5: - resolution: {integrity: sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==} - engines: {node: '>=8'} - dependencies: - html-escaper: 2.0.2 - istanbul-lib-report: 3.0.0 - dev: true - - /jsesc@2.5.2: - resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} - engines: {node: '>=4'} - hasBin: true - dev: true - - /json5@2.2.3: - resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} - engines: {node: '>=6'} - hasBin: true - dev: true - - /jsonc-parser@3.2.0: - resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} - dev: true - - /jsonfile@6.1.0: - resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} - dependencies: - universalify: 2.0.0 - optionalDependencies: - graceful-fs: 4.2.11 - dev: true - - /local-pkg@0.4.3: - resolution: {integrity: sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==} - engines: {node: '>=14'} - dev: true - - /locate-path@6.0.0: - resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} - engines: {node: '>=10'} - dependencies: - p-locate: 5.0.0 - dev: true - - /lodash.camelcase@4.3.0: - resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} - dev: false - - /long@4.0.0: - resolution: {integrity: sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==} - dev: false - - /long@5.2.1: - resolution: {integrity: sha512-GKSNGeNAtw8IryjjkhZxuKB3JzlcLTwjtiQCHKvqQet81I93kXslhDQruGI/QsddO83mcDToBVy7GqGS/zYf/A==} - dev: false - - /loupe@2.3.6: - resolution: {integrity: sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==} - dependencies: - get-func-name: 2.0.0 - dev: true - - /lru-cache@6.0.0: - resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} - engines: {node: '>=10'} - dependencies: - yallist: 4.0.0 - dev: true - - /make-dir@3.1.0: - resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} - engines: {node: '>=8'} - dependencies: - semver: 6.3.0 - dev: true - - /make-error@1.3.6: - resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} - dev: true - - /merge2@1.4.1: - resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} - engines: {node: '>= 8'} - dev: true - - /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: true - - /mimic-response@3.1.0: - resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} - engines: {node: '>=10'} - dev: true - - /minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} - dependencies: - brace-expansion: 1.1.11 - dev: true - - /minimist@1.2.8: - resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - dev: true - - /mkdirp-classic@0.5.3: - resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} - dev: true - - /mlly@1.2.0: - resolution: {integrity: sha512-+c7A3CV0KGdKcylsI6khWyts/CYrGTrRVo4R/I7u/cUsy0Conxa6LUhiEzVKIw14lc2L5aiO4+SeVe4TeGRKww==} - dependencies: - acorn: 8.8.2 - pathe: 1.1.0 - pkg-types: 1.0.2 - ufo: 1.1.1 - dev: true - - /ms@2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - dev: true - - /ms@2.1.3: - resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - dev: true - - /multistream@4.1.0: - resolution: {integrity: sha512-J1XDiAmmNpRCBfIWJv+n0ymC4ABcf/Pl+5YvC5B/D2f/2+8PtHvCNxMPKiQcZyi922Hq69J2YOpb1pTywfifyw==} - dependencies: - once: 1.4.0 - readable-stream: 3.6.2 - dev: true - - /nanoid@3.3.6: - resolution: {integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true - dev: true - - /napi-build-utils@1.0.2: - resolution: {integrity: sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==} - dev: true - - /node-abi@3.33.0: - resolution: {integrity: sha512-7GGVawqyHF4pfd0YFybhv/eM9JwTtPqx0mAanQ146O3FlSh3pA24zf9IRQTOsfTSqXTNzPSP5iagAJ94jjuVog==} - engines: {node: '>=10'} - dependencies: - semver: 7.3.8 - dev: true - - /node-fetch@2.6.9: - resolution: {integrity: sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg==} - engines: {node: 4.x || >=6.0.0} - peerDependencies: - encoding: ^0.1.0 - peerDependenciesMeta: - encoding: - optional: true - dependencies: - whatwg-url: 5.0.0 - dev: true - - /nodemon@2.0.22: - resolution: {integrity: sha512-B8YqaKMmyuCO7BowF1Z1/mkPqLk6cs/l63Ojtd6otKjMx47Dq1utxfRxcavH1I7VSaL8n5BUaoutadnsX3AAVQ==} - engines: {node: '>=8.10.0'} - hasBin: true - dependencies: - chokidar: 3.5.3 - debug: 3.2.7(supports-color@5.5.0) - ignore-by-default: 1.0.1 - minimatch: 3.1.2 - pstree.remy: 1.1.8 - semver: 5.7.1 - simple-update-notifier: 1.1.0 - supports-color: 5.5.0 - touch: 3.1.0 - undefsafe: 2.0.5 - dev: true - - /nopt@1.0.10: - resolution: {integrity: sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==} - hasBin: true - dependencies: - abbrev: 1.1.1 - dev: true - - /normalize-path@3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} - engines: {node: '>=0.10.0'} - dev: true - - /once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - dependencies: - wrappy: 1.0.2 - dev: true - - /p-is-promise@3.0.0: - resolution: {integrity: sha512-Wo8VsW4IRQSKVXsJCn7TomUaVtyfjVDn3nUP7kE967BQk0CwFpdbZs0X0uk5sW9mkBa9eNM7hCMaG93WUAwxYQ==} - engines: {node: '>=8'} - dev: true - - /p-limit@3.1.0: - resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} - engines: {node: '>=10'} - dependencies: - yocto-queue: 0.1.0 - dev: true - - /p-limit@4.0.0: - resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dependencies: - yocto-queue: 1.0.0 - dev: true - - /p-locate@5.0.0: - resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} - engines: {node: '>=10'} - dependencies: - p-limit: 3.1.0 - dev: true - - /path-exists@4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} - dev: true - - /path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} - dev: true - - /path-key@3.1.1: - resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} - engines: {node: '>=8'} - dev: true - - /path-parse@1.0.7: - resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} - dev: true - - /path-type@4.0.0: - resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} - engines: {node: '>=8'} - dev: true - - /pathe@1.1.0: - resolution: {integrity: sha512-ODbEPR0KKHqECXW1GoxdDb+AZvULmXjVPy4rt+pGo2+TnjJTIPJQSVS6N63n8T2Ip+syHhbn52OewKicV0373w==} - dev: true - - /pathval@1.1.1: - resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} - dev: true - - /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'} - dev: true - - /pkg-fetch@3.4.2: - resolution: {integrity: sha512-0+uijmzYcnhC0hStDjm/cl2VYdrmVVBpe7Q8k9YBojxmR5tG8mvR9/nooQq3QSXiQqORDVOTY3XqMEqJVIzkHA==} - hasBin: true - dependencies: - chalk: 4.1.2 - fs-extra: 9.1.0 - https-proxy-agent: 5.0.1 - node-fetch: 2.6.9 - progress: 2.0.3 - semver: 7.3.8 - tar-fs: 2.1.1 - yargs: 16.2.0 - transitivePeerDependencies: - - encoding - - supports-color - dev: true - - /pkg-types@1.0.2: - resolution: {integrity: sha512-hM58GKXOcj8WTqUXnsQyJYXdeAPbythQgEF3nTcEo+nkD49chjQ9IKm/QJy9xf6JakXptz86h7ecP2024rrLaQ==} - dependencies: - jsonc-parser: 3.2.0 - mlly: 1.2.0 - pathe: 1.1.0 - dev: true - - /pkg@5.8.1: - resolution: {integrity: sha512-CjBWtFStCfIiT4Bde9QpJy0KeH19jCfwZRJqHFDFXfhUklCx8JoFmMj3wgnEYIwGmZVNkhsStPHEOnrtrQhEXA==} - hasBin: true - peerDependencies: - node-notifier: '>=9.0.1' - peerDependenciesMeta: - node-notifier: - optional: true - dependencies: - '@babel/generator': 7.18.2 - '@babel/parser': 7.18.4 - '@babel/types': 7.19.0 - chalk: 4.1.2 - fs-extra: 9.1.0 - globby: 11.1.0 - into-stream: 6.0.0 - is-core-module: 2.9.0 - minimist: 1.2.8 - multistream: 4.1.0 - pkg-fetch: 3.4.2 - prebuild-install: 7.1.1 - resolve: 1.22.1 - stream-meter: 1.0.4 - transitivePeerDependencies: - - encoding - - supports-color - dev: true - - /postcss@8.4.21: - resolution: {integrity: sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==} - engines: {node: ^10 || ^12 || >=14} - dependencies: - nanoid: 3.3.6 - picocolors: 1.0.0 - source-map-js: 1.0.2 - dev: true - - /prebuild-install@7.1.1: - resolution: {integrity: sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==} - engines: {node: '>=10'} - hasBin: true - dependencies: - detect-libc: 2.0.1 - expand-template: 2.0.3 - github-from-package: 0.0.0 - minimist: 1.2.8 - mkdirp-classic: 0.5.3 - napi-build-utils: 1.0.2 - node-abi: 3.33.0 - pump: 3.0.0 - rc: 1.2.8 - simple-get: 4.0.1 - tar-fs: 2.1.1 - tunnel-agent: 0.6.0 - dev: true - - /pretty-format@27.5.1: - resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - dependencies: - ansi-regex: 5.0.1 - ansi-styles: 5.2.0 - react-is: 17.0.2 - dev: true - - /prisma@4.11.0: - resolution: {integrity: sha512-4zZmBXssPUEiX+GeL0MUq/Yyie4ltiKmGu7jCJFnYMamNrrulTBc+D+QwAQSJ01tyzeGHlD13kOnqPwRipnlNw==} - engines: {node: '>=14.17'} - hasBin: true - requiresBuild: true - dependencies: - '@prisma/engines': 4.11.0 - - /process-nextick-args@2.0.1: - resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} - dev: true - - /progress@2.0.3: - resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} - engines: {node: '>=0.4.0'} - dev: true - - /protobufjs@7.2.2: - resolution: {integrity: sha512-++PrQIjrom+bFDPpfmqXfAGSQs40116JRrqqyf53dymUMvvb5d/LMRyicRoF1AUKoXVS1/IgJXlEgcpr4gTF3Q==} - engines: {node: '>=12.0.0'} - requiresBuild: true - dependencies: - '@protobufjs/aspromise': 1.1.2 - '@protobufjs/base64': 1.1.2 - '@protobufjs/codegen': 2.0.4 - '@protobufjs/eventemitter': 1.1.0 - '@protobufjs/fetch': 1.1.0 - '@protobufjs/float': 1.0.2 - '@protobufjs/inquire': 1.1.0 - '@protobufjs/path': 1.1.2 - '@protobufjs/pool': 1.1.0 - '@protobufjs/utf8': 1.1.0 - '@types/node': 18.15.9 - long: 5.2.1 - dev: false - - /pstree.remy@1.1.8: - resolution: {integrity: sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==} - dev: true - - /pump@3.0.0: - resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} - dependencies: - end-of-stream: 1.4.4 - once: 1.4.0 - dev: true - - /queue-microtask@1.2.3: - resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - dev: true - - /rc@1.2.8: - resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} - hasBin: true - dependencies: - deep-extend: 0.6.0 - ini: 1.3.8 - minimist: 1.2.8 - strip-json-comments: 2.0.1 - dev: true - - /react-is@17.0.2: - resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} - 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: true - - /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: true - - /readdirp@3.6.0: - resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} - engines: {node: '>=8.10.0'} - dependencies: - picomatch: 2.3.1 - dev: true - - /require-directory@2.1.1: - resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} - engines: {node: '>=0.10.0'} - - /resolve@1.22.1: - resolution: {integrity: sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==} - hasBin: true - dependencies: - is-core-module: 2.9.0 - path-parse: 1.0.7 - supports-preserve-symlinks-flag: 1.0.0 - dev: true - - /reusify@1.0.4: - resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} - engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - dev: true - - /rimraf@3.0.2: - resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} - hasBin: true - dependencies: - glob: 7.2.3 - dev: true - - /rollup@3.20.2: - resolution: {integrity: sha512-3zwkBQl7Ai7MFYQE0y1MeQ15+9jsi7XxfrqwTb/9EK8D9C9+//EBR4M+CuA1KODRaNbFez/lWxA5vhEGZp4MUg==} - engines: {node: '>=14.18.0', npm: '>=8.0.0'} - hasBin: true - optionalDependencies: - fsevents: 2.3.2 - dev: true - - /run-parallel@1.2.0: - resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} - dependencies: - queue-microtask: 1.2.3 - dev: true - - /safe-buffer@5.1.2: - resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} - dev: true - - /safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - dev: true - - /semver@5.7.1: - resolution: {integrity: sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==} - hasBin: true - dev: true - - /semver@6.3.0: - resolution: {integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==} - hasBin: true - dev: true - - /semver@7.0.0: - resolution: {integrity: sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==} - hasBin: true - dev: true + dev: false - /semver@7.3.8: - resolution: {integrity: sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==} - engines: {node: '>=10'} - hasBin: true - dependencies: - lru-cache: 6.0.0 - dev: true + /get-caller-file/2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + dev: false - /shebang-command@2.0.0: - resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + /has-flag/4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} - dependencies: - shebang-regex: 3.0.0 - dev: true + dev: false - /shebang-regex@3.0.0: - resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + /is-fullwidth-code-point/3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} engines: {node: '>=8'} - dev: true + dev: false - /siginfo@2.0.0: - resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} + /json5/2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true dev: true - /signal-exit@3.0.7: - resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} - dev: true + /lodash.camelcase/4.3.0: + resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} + dev: false - /simple-concat@1.0.1: - resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} - dev: true + /long/4.0.0: + resolution: {integrity: sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==} + dev: false - /simple-get@4.0.1: - resolution: {integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==} - dependencies: - decompress-response: 6.0.0 - once: 1.4.0 - simple-concat: 1.0.1 - dev: true + /long/5.2.1: + resolution: {integrity: sha512-GKSNGeNAtw8IryjjkhZxuKB3JzlcLTwjtiQCHKvqQet81I93kXslhDQruGI/QsddO83mcDToBVy7GqGS/zYf/A==} + dev: false - /simple-update-notifier@1.1.0: - resolution: {integrity: sha512-VpsrsJSUcJEseSbMHkrsrAVSdvVS5I96Qo1QAQ4FxQ9wXFcB+pjj7FB7/us9+GcgfW4ziHtYMc1J0PLczb55mg==} - engines: {node: '>=8.10.0'} - dependencies: - semver: 7.0.0 + /make-error/1.3.6: + resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} dev: true - /slash@3.0.0: - resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} - engines: {node: '>=8'} + /minimist/1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} dev: true - /slice-ansi@5.0.0: - resolution: {integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==} - engines: {node: '>=12'} + /prisma/4.11.0: + resolution: {integrity: sha512-4zZmBXssPUEiX+GeL0MUq/Yyie4ltiKmGu7jCJFnYMamNrrulTBc+D+QwAQSJ01tyzeGHlD13kOnqPwRipnlNw==} + engines: {node: '>=14.17'} + hasBin: true + requiresBuild: true dependencies: - ansi-styles: 6.2.1 - is-fullwidth-code-point: 4.0.0 - dev: true + '@prisma/engines': 4.11.0 - /source-map-js@1.0.2: - resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} - engines: {node: '>=0.10.0'} - dev: true + /protobufjs/7.2.2: + resolution: {integrity: sha512-++PrQIjrom+bFDPpfmqXfAGSQs40116JRrqqyf53dymUMvvb5d/LMRyicRoF1AUKoXVS1/IgJXlEgcpr4gTF3Q==} + engines: {node: '>=12.0.0'} + requiresBuild: true + dependencies: + '@protobufjs/aspromise': 1.1.2 + '@protobufjs/base64': 1.1.2 + '@protobufjs/codegen': 2.0.4 + '@protobufjs/eventemitter': 1.1.0 + '@protobufjs/fetch': 1.1.0 + '@protobufjs/float': 1.0.2 + '@protobufjs/inquire': 1.1.0 + '@protobufjs/path': 1.1.2 + '@protobufjs/pool': 1.1.0 + '@protobufjs/utf8': 1.1.0 + '@types/node': 18.15.9 + long: 5.2.1 + dev: false - /source-map@0.6.1: - resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + /require-directory/2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} engines: {node: '>=0.10.0'} - dev: true - - /stackback@0.0.2: - resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} - dev: true - - /std-env@3.3.2: - resolution: {integrity: sha512-uUZI65yrV2Qva5gqE0+A7uVAvO40iPo6jGhs7s8keRfHCmtg+uB2X6EiLGCI9IgL1J17xGhvoOqSz79lzICPTA==} - dev: true - - /stream-meter@1.0.4: - resolution: {integrity: sha512-4sOEtrbgFotXwnEuzzsQBYEV1elAeFSO8rSGeTwabuX1RRn/kEq9JVH7I0MRBhKVRR0sJkr0M0QCH7yOLf9fhQ==} - dependencies: - readable-stream: 2.3.8 - dev: true + dev: false - /string-width@4.2.3: + /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 + dev: false - /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.0.1 - dev: true - - /string_decoder@1.1.1: - resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} - dependencies: - safe-buffer: 5.1.2 - dev: true - - /string_decoder@1.3.0: - resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} - dependencies: - safe-buffer: 5.2.1 - dev: true - - /strip-ansi@6.0.1: + /strip-ansi/6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} dependencies: ansi-regex: 5.0.1 + dev: false - /strip-ansi@7.0.1: - resolution: {integrity: sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==} - engines: {node: '>=12'} - dependencies: - ansi-regex: 6.0.1 - dev: true - - /strip-bom@3.0.0: + /strip-bom/3.0.0: resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} engines: {node: '>=4'} dev: true - /strip-json-comments@2.0.1: - resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} - engines: {node: '>=0.10.0'} - dev: true - - /strip-literal@1.0.1: - resolution: {integrity: sha512-QZTsipNpa2Ppr6v1AmJHESqJ3Uz247MUS0OjrnnZjFAvEoWqxuyFuXn2xLgMtRnijJShAa1HL0gtJyUs7u7n3Q==} - dependencies: - acorn: 8.8.2 - dev: true - - /supports-color@5.5.0: - resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} - engines: {node: '>=4'} - dependencies: - has-flag: 3.0.0 - dev: true - - /supports-color@7.2.0: + /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-preserve-symlinks-flag@1.0.0: - resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} - engines: {node: '>= 0.4'} - dev: true - - /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: true - - /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: true - - /test-exclude@6.0.0: - resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} - engines: {node: '>=8'} - dependencies: - '@istanbuljs/schema': 0.1.3 - glob: 7.2.3 - minimatch: 3.1.2 - dev: true - - /tinybench@2.4.0: - resolution: {integrity: sha512-iyziEiyFxX4kyxSp+MtY1oCH/lvjH3PxFN8PGCDeqcZWAJ/i+9y+nL85w99PxVzrIvew/GSkSbDYtiGVa85Afg==} - dev: true - - /tinypool@0.4.0: - resolution: {integrity: sha512-2ksntHOKf893wSAH4z/+JbPpi92esw8Gn9N2deXX+B0EO92hexAVI9GIZZPx7P5aYo5KULfeOSt3kMOmSOy6uA==} - engines: {node: '>=14.0.0'} - dev: true - - /tinyspy@1.1.1: - resolution: {integrity: sha512-UVq5AXt/gQlti7oxoIg5oi/9r0WpF7DGEVwXgqWSMmyN16+e3tl5lIvTaOpJ3TAtu5xFzWccFRM4R5NaWHF+4g==} - engines: {node: '>=14.0.0'} - 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 - dev: true - - /touch@3.1.0: - resolution: {integrity: sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==} - hasBin: true - dependencies: - nopt: 1.0.10 - dev: true - - /tr46@0.0.3: - resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} - dev: true - - /ts-essentials@9.3.1(typescript@5.0.2): - resolution: {integrity: sha512-9CChSvQMyVRo29Vb1A2jbs+LKo3d/bAf+ndSaX0T8cEiy/HChVaRN/HY5DqUryZ8hZ6uol9bEgCnGmnDbwBR9Q==} - peerDependencies: - typescript: '>=4.1.0' - dependencies: - typescript: 5.0.2 - dev: true + dev: false - /ts-node@10.9.1(@types/node@18.15.9)(typescript@5.0.2): + /ts-node/10.9.1_3flabivgbrnlfzsgzfhinuvrvy: resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} hasBin: true peerDependencies: @@ -1922,20 +370,7 @@ packages: yn: 3.1.1 dev: true - /tsconfck@2.1.1(typescript@5.0.2): - resolution: {integrity: sha512-ZPCkJBKASZBmBUNqGHmRhdhM8pJYDdOXp4nRgj/O0JwUwsMq50lCDRQP/M5GBNAA0elPrq4gAeu4dkaVCuKWww==} - engines: {node: ^14.13.1 || ^16 || >=18} - hasBin: true - peerDependencies: - typescript: ^4.3.5 || ^5.0.0 - peerDependenciesMeta: - typescript: - optional: true - dependencies: - typescript: 5.0.2 - dev: true - - /tsconfig-paths@4.1.2: + /tsconfig-paths/4.1.2: resolution: {integrity: sha512-uhxiMgnXQp1IR622dUXI+9Ehnws7i/y6xvpZB9IbUVOPy0muvdvgXeZOn88UcGPiT98Vp3rJPTa8bFoalZ3Qhw==} engines: {node: '>=6'} dependencies: @@ -1944,252 +379,36 @@ packages: strip-bom: 3.0.0 dev: true - /tunnel-agent@0.6.0: - resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} - dependencies: - safe-buffer: 5.2.1 - dev: true - - /type-detect@4.0.8: - resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} - engines: {node: '>=4'} - dev: true - - /typescript@5.0.2: + /typescript/5.0.2: resolution: {integrity: sha512-wVORMBGO/FAs/++blGNeAVdbNKtIh1rbBL2EyQ1+J9lClJ93KiiKe8PmFIVdXhHcyv44SL9oglmfeSsndo0jRw==} engines: {node: '>=12.20'} hasBin: true dev: true - /ufo@1.1.1: - resolution: {integrity: sha512-MvlCc4GHrmZdAllBc0iUDowff36Q9Ndw/UzqmEKyrfSzokTd9ZCy1i+IIk5hrYKkjoYVQyNbrw7/F8XJ2rEwTg==} - dev: true - - /undefsafe@2.0.5: - resolution: {integrity: sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==} - dev: true - - /universalify@2.0.0: - resolution: {integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==} - engines: {node: '>= 10.0.0'} - dev: true - - /util-deprecate@1.0.2: - resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - dev: true - - /v8-compile-cache-lib@3.0.1: + /v8-compile-cache-lib/3.0.1: resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} dev: true - /v8-to-istanbul@9.1.0: - resolution: {integrity: sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA==} - engines: {node: '>=10.12.0'} - dependencies: - '@jridgewell/trace-mapping': 0.3.17 - '@types/istanbul-lib-coverage': 2.0.4 - convert-source-map: 1.9.0 - dev: true - - /vite-node@0.29.8(@types/node@18.15.9): - resolution: {integrity: sha512-b6OtCXfk65L6SElVM20q5G546yu10/kNrhg08afEoWlFRJXFq9/6glsvSVY+aI6YeC1tu2TtAqI2jHEQmOmsFw==} - engines: {node: '>=v14.16.0'} - hasBin: true - dependencies: - cac: 6.7.14 - debug: 4.3.4 - mlly: 1.2.0 - pathe: 1.1.0 - picocolors: 1.0.0 - vite: 4.2.1(@types/node@18.15.9) - transitivePeerDependencies: - - '@types/node' - - less - - sass - - stylus - - sugarss - - supports-color - - terser - dev: true - - /vite-tsconfig-paths@4.0.7(typescript@5.0.2): - resolution: {integrity: sha512-MwIYaby6kcbQGZqMH+gAK6h0UYQGOkjsuAgw4q6bP/5vWkn8VKvnmLuCQHA2+IzHAJHnE8OFTO4lnJLFMf9+7Q==} - peerDependencies: - vite: '*' - peerDependenciesMeta: - vite: - optional: true - dependencies: - debug: 4.3.4 - globrex: 0.1.2 - tsconfck: 2.1.1(typescript@5.0.2) - transitivePeerDependencies: - - supports-color - - typescript - dev: true - - /vite@4.2.1(@types/node@18.15.9): - resolution: {integrity: sha512-7MKhqdy0ISo4wnvwtqZkjke6XN4taqQ2TBaTccLIpOKv7Vp2h4Y+NpmWCnGDeSvvn45KxvWgGyb0MkHvY1vgbg==} - engines: {node: ^14.18.0 || >=16.0.0} - hasBin: true - peerDependencies: - '@types/node': '>= 14' - less: '*' - sass: '*' - stylus: '*' - sugarss: '*' - terser: ^5.4.0 - peerDependenciesMeta: - '@types/node': - optional: true - less: - optional: true - sass: - optional: true - stylus: - optional: true - sugarss: - optional: true - terser: - optional: true - dependencies: - '@types/node': 18.15.9 - esbuild: 0.17.14 - postcss: 8.4.21 - resolve: 1.22.1 - rollup: 3.20.2 - optionalDependencies: - fsevents: 2.3.2 - dev: true - - /vitest-mock-extended@1.1.3(typescript@5.0.2)(vitest@0.29.8): - resolution: {integrity: sha512-MiaKYZbTg+fjozKnCpoTTva0BnlSNYyk4jiPuM2xVhg4aou112QIrALdH3/ZKK6qfXWh0A17gFIjWJjylOlXxg==} - peerDependencies: - typescript: 3.x || 4.x || 5.x - vitest: '>=0.29.2' - dependencies: - ts-essentials: 9.3.1(typescript@5.0.2) - typescript: 5.0.2 - vitest: 0.29.8 - dev: true - - /vitest@0.29.8: - resolution: {integrity: sha512-JIAVi2GK5cvA6awGpH0HvH/gEG9PZ0a/WoxdiV3PmqK+3CjQMf8c+J/Vhv4mdZ2nRyXFw66sAg6qz7VNkaHfDQ==} - engines: {node: '>=v14.16.0'} - hasBin: true - peerDependencies: - '@edge-runtime/vm': '*' - '@vitest/browser': '*' - '@vitest/ui': '*' - happy-dom: '*' - jsdom: '*' - playwright: '*' - safaridriver: '*' - webdriverio: '*' - peerDependenciesMeta: - '@edge-runtime/vm': - optional: true - '@vitest/browser': - optional: true - '@vitest/ui': - optional: true - happy-dom: - optional: true - jsdom: - optional: true - playwright: - optional: true - safaridriver: - optional: true - webdriverio: - optional: true - dependencies: - '@types/chai': 4.3.4 - '@types/chai-subset': 1.3.3 - '@types/node': 18.15.9 - '@vitest/expect': 0.29.8 - '@vitest/runner': 0.29.8 - '@vitest/spy': 0.29.8 - '@vitest/utils': 0.29.8 - acorn: 8.8.2 - acorn-walk: 8.2.0 - cac: 6.7.14 - chai: 4.3.7 - debug: 4.3.4 - local-pkg: 0.4.3 - pathe: 1.1.0 - picocolors: 1.0.0 - source-map: 0.6.1 - std-env: 3.3.2 - strip-literal: 1.0.1 - tinybench: 2.4.0 - tinypool: 0.4.0 - tinyspy: 1.1.1 - vite: 4.2.1(@types/node@18.15.9) - vite-node: 0.29.8(@types/node@18.15.9) - why-is-node-running: 2.2.2 - transitivePeerDependencies: - - less - - sass - - stylus - - sugarss - - supports-color - - terser - dev: true - - /webidl-conversions@3.0.1: - resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} - dev: true - - /whatwg-url@5.0.0: - resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} - dependencies: - tr46: 0.0.3 - webidl-conversions: 3.0.1 - dev: true - - /which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} - hasBin: true - dependencies: - 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: + /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 + dev: false - /wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - dev: true - - /y18n@5.0.8: + /y18n/5.0.8: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} engines: {node: '>=10'} + dev: false - /yallist@4.0.0: - resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} - dev: true - - /yargs-parser@20.2.9: + /yargs-parser/20.2.9: resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} engines: {node: '>=10'} + dev: false - /yargs@16.2.0: + /yargs/16.2.0: resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} engines: {node: '>=10'} dependencies: @@ -2200,18 +419,9 @@ packages: string-width: 4.2.3 y18n: 5.0.8 yargs-parser: 20.2.9 + dev: false - /yn@3.1.1: + /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'} - dev: true - - /yocto-queue@1.0.0: - resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} - engines: {node: '>=12.20'} - dev: true diff --git a/services/delivery/prisma/schema.prisma b/services/delivery/prisma/schema.prisma index fe4bce5f..a9384d5b 100644 --- a/services/delivery/prisma/schema.prisma +++ b/services/delivery/prisma/schema.prisma @@ -4,8 +4,7 @@ datasource db { } generator client { - provider = "prisma-client-js" - binaryTargets = ["linux-musl", "linux-musl-openssl-3.0.x"] + provider = "prisma-client-js" } enum Status { @@ -16,24 +15,21 @@ enum Status { } model Delivery { - id String @id @default(cuid()) - eta DateTime + id String @id @default(cuid()) + estimated_date DateTime address String status Status @default(PENDING) - delivery_person DeliveryPerson @relation(fields: [delivery_person_id], references: [id]) + person DeliveryPerson @relation(fields: [delivery_person_id], references: [id]) delivery_person_id String - - user_id String - restaurant_id String } model DeliveryPerson { id String @id @default(cuid()) first_name String last_name String - phone String @unique + phone String @unique location Float[] deliveries Delivery[] diff --git a/services/delivery/prisma/seed.ts b/services/delivery/prisma/seed.ts index 7c517d02..40472cf0 100644 --- a/services/delivery/prisma/seed.ts +++ b/services/delivery/prisma/seed.ts @@ -27,35 +27,18 @@ const deliveryPerson: Prisma.DeliveryPersonCreateInput[] = [ const deliveries: Prisma.DeliveryCreateInput[] = [ { address: "15 rue de la paix 75000 Paris", - eta: new Date("2023-01-01"), - delivery_person: { create: deliveryPerson[0] }, - - restaurant_id: "restaurant_id:1", - user_id: "user_id:1", - }, - { - address: "15 rue de la paix 75000 Paris", - eta: new Date("2023-01-01"), - delivery_person: { create: deliveryPerson[0] }, - - restaurant_id: "restaurant_id:2", - user_id: "user_id:1", + estimated_date: new Date("2023-01-01"), + person: { create: deliveryPerson[0] }, }, { address: "16 rue de la paix 75000 Paris", - eta: new Date("2023-02-01"), - delivery_person: { create: deliveryPerson[1] }, - - restaurant_id: "restaurant_id:1", - user_id: "user_id:2", + estimated_date: new Date("2023-02-01"), + person: { create: deliveryPerson[1] }, }, { address: "17 rue de la paix 75000 Paris", - eta: new Date("2023-03-01"), - delivery_person: { create: deliveryPerson[2] }, - - restaurant_id: "restaurant_id:1", - user_id: "user_id:3", + estimated_date: new Date("2023-03-01"), + person: { create: deliveryPerson[2] }, }, ]; @@ -77,6 +60,5 @@ main() .catch(async (e) => { console.error(e); await prisma.$disconnect(); - // @ts-ignore process.exit(1); }); diff --git a/services/delivery/src/server.ts b/services/delivery/src/server.ts index 04fb474f..2032a131 100644 --- a/services/delivery/src/server.ts +++ b/services/delivery/src/server.ts @@ -7,9 +7,6 @@ import { log, utils } from "@delivery/lib/log"; import { options } from "@delivery/resources/protoloader-options"; import { serverInsecure } from "@delivery/resources/grpc-credentials"; -import deliveryHandlers from "@delivery/handlers/delivery"; -import personHandlers from "@delivery/handlers/person"; - const PORT = process.env.PORT || 50008; const ADDRESS = `0.0.0.0:${PORT}`; const PROTO_PATH = __dirname + "/../../proto/delivery.proto"; @@ -18,11 +15,17 @@ const packageDefinition = loadSync(PROTO_PATH, options); const { delivery } = loadPackageDefinition(packageDefinition) as any; // todo: fix any const server = new Server(); -server.addService(delivery.DeliveryService.service, deliveryHandlers); -server.addService(delivery.DeliveryPersonService.service, personHandlers); +server.addService(delivery.DeliveryService.service, { + // handlers + // todo: add handlers +}); + +server.addService(delivery.DeliveryPersonService.service, { + // handlers + // todo: add handlers +}); server.bindAsync(ADDRESS, serverInsecure, () => { - server.start(); const message = `---- ${utils.green("good")}${utils.yellow( "food" )} Delivery Service ----\nstarted on: ${utils.bold(ADDRESS)} ${utils.green( @@ -30,6 +33,3 @@ server.bindAsync(ADDRESS, serverInsecure, () => { )}\n`; log.debug(message); }); - - -export default server; \ No newline at end of file diff --git a/services/proto/delivery.proto b/services/proto/delivery.proto index 91a86b21..39e65277 100644 --- a/services/proto/delivery.proto +++ b/services/proto/delivery.proto @@ -1,20 +1,18 @@ syntax = "proto3"; +import "google/protobuf/timestamp.proto"; import "google/protobuf/empty.proto"; package delivery; message Delivery { string id = 1; - string eta = 2; + google.protobuf.Timestamp estimated_date = 2; string address = 3; Status status = 4; - DeliveryPerson delivery_person = 5; + DeliveryPerson person = 5; string delivery_person_id = 6; - - string user_id = 7; - string restaurant_id = 8; } message DeliveryPerson { @@ -35,22 +33,22 @@ enum Status { } service DeliveryService { - rpc CreateDelivery (DeliveryCreateInput) returns (Delivery) {} + rpc CreateDelivery (Delivery) returns (Delivery) {} rpc GetDelivery (DeliveryId) returns (Delivery) {} rpc UpdateDelivery (Delivery) returns (Delivery) {} rpc DeleteDelivery (DeliveryId) returns (google.protobuf.Empty) {} - rpc ListDeliveriesByUser (UserId) returns (DeliveryList) {} - rpc ListDeliveriesByRestaurant (RestaurantId) returns (DeliveryList) {} + rpc ListDeliveriesByUser (UserId) returns (stream Delivery) {} + rpc ListDeliveriesByRestaurant (RestaurantId) returns (stream Delivery) {} } service DeliveryPersonService { - rpc CreateDeliveryPerson (DeliveryPersonCreateInput) returns (DeliveryPerson) {} + rpc CreateDeliveryPerson (DeliveryPerson) returns (DeliveryPerson) {} rpc GetDeliveryPerson (DeliveryPersonId) returns (DeliveryPerson) {} rpc UpdateDeliveryPerson (DeliveryPerson) returns (DeliveryPerson) {} rpc DeleteDeliveryPerson (DeliveryPersonId) returns (google.protobuf.Empty) {} - rpc ListDeliveryPersons (google.protobuf.Empty) returns (DeliveryPersonList) {} - rpc ListNearDeliveryPersons (Location) returns (DeliveryPersonList) {} + rpc ListDeliveryPersons (google.protobuf.Empty) returns (stream DeliveryPerson) {} + rpc ListNearDeliveryPersons (Location) returns (stream DeliveryPerson) {} } @@ -58,13 +56,10 @@ message DeliveryId { string id = 1; } message DeliveryCreateInput { - string eta = 1; + google.protobuf.Timestamp estimated_date = 1; string address = 2; Status status = 3; string delivery_person_id = 4; - - string user_id = 5; - string restaurant_id = 6; } message UserId { @@ -75,14 +70,6 @@ message RestaurantId { string id = 1; } -message DeliveryList { - repeated Delivery deliveries = 1; -} - -message DeliveryPersonList { - repeated DeliveryPersonList delivery_persons = 1; -} - message DeliveryPersonId { string id = 1; } From d6c49d729cf5f8423c4541e0544807b18664ee82 Mon Sep 17 00:00:00 2001 From: Florian LEROUX <10078837+floriaaan@users.noreply.github.com> Date: Wed, 29 Mar 2023 09:50:50 +0200 Subject: [PATCH 262/883] fix(server): forgot to start server explicitly --- services/delivery/src/server.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/services/delivery/src/server.ts b/services/delivery/src/server.ts index 2032a131..16a27d70 100644 --- a/services/delivery/src/server.ts +++ b/services/delivery/src/server.ts @@ -7,6 +7,8 @@ import { log, utils } from "@delivery/lib/log"; import { options } from "@delivery/resources/protoloader-options"; import { serverInsecure } from "@delivery/resources/grpc-credentials"; +import { CreateDelivery } from "@delivery/handlers/delivery"; + const PORT = process.env.PORT || 50008; const ADDRESS = `0.0.0.0:${PORT}`; const PROTO_PATH = __dirname + "/../../proto/delivery.proto"; @@ -18,6 +20,7 @@ const server = new Server(); server.addService(delivery.DeliveryService.service, { // handlers // todo: add handlers + CreateDelivery, }); server.addService(delivery.DeliveryPersonService.service, { @@ -26,6 +29,7 @@ server.addService(delivery.DeliveryPersonService.service, { }); server.bindAsync(ADDRESS, serverInsecure, () => { + server.start(); const message = `---- ${utils.green("good")}${utils.yellow( "food" )} Delivery Service ----\nstarted on: ${utils.bold(ADDRESS)} ${utils.green( From fb0c9e6bb0d69003678286e8227dee226c991720 Mon Sep 17 00:00:00 2001 From: Florian LEROUX <10078837+floriaaan@users.noreply.github.com> Date: Wed, 29 Mar 2023 09:51:35 +0200 Subject: [PATCH 263/883] fix(readme): add port binding to docker postgres usage --- services/delivery/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/services/delivery/README.md b/services/delivery/README.md index 1086b6c8..f3baac1e 100644 --- a/services/delivery/README.md +++ b/services/delivery/README.md @@ -5,7 +5,7 @@ | **Port:** 50008 | | **Developer:** @floriaaan | | **Status:** In progress | -| **Last update:** 2023-03-25 | +| **Last update:** 2023-03-29 | | **Language:** NodeJS | | **Dependencies:** TypeScript, Prisma, gRPC, Postgres | | **Models:** (see [`prisma/schema.prisma`](./prisma/schema.prisma)) | @@ -41,7 +41,7 @@ You can use the following tools to help you with the setup: - You can use nvm to set your Node version using: - `nvm use`. - You can use docker to run your Postgres database using: - - `docker run --name postgres -e POSTGRES_PASSWORD=password -d postgres`. + - `docker run --name postgres -p 5432:5432 -e POSTGRES_PASSWORD=password -d postgres` ## Getting started From a895c4d508ccb9a00fb0cae6250e3c61e0e4ebf7 Mon Sep 17 00:00:00 2001 From: Florian LEROUX <10078837+floriaaan@users.noreply.github.com> Date: Wed, 29 Mar 2023 09:52:07 +0200 Subject: [PATCH 264/883] feat(pkg): add nodemon watcher script --- services/delivery/.env.example | 2 +- services/delivery/package.json | 4 +- services/delivery/pnpm-lock.yaml | 230 ++++++++++++++++++++++++++++--- 3 files changed, 218 insertions(+), 18 deletions(-) diff --git a/services/delivery/.env.example b/services/delivery/.env.example index 6a86f4b9..e7b2b4e7 100644 --- a/services/delivery/.env.example +++ b/services/delivery/.env.example @@ -1,2 +1,2 @@ -DATABASE_URL=postgres://postgres:postgres@localhost:5432/postgres +DATABASE_URL=postgres://postgres:password@localhost:5432/postgres PORT=50008 \ No newline at end of file diff --git a/services/delivery/package.json b/services/delivery/package.json index 09782b02..113ef54d 100644 --- a/services/delivery/package.json +++ b/services/delivery/package.json @@ -1,7 +1,8 @@ { "name": "typescript-grpc", "scripts": { - "dev": "ts-node ./src/server.ts", + "start": "ts-node ./src/server.ts", + "dev": "nodemon --watch 'src/**/*.ts' --exec 'ts-node' src/server.ts", "seed": "ts-node prisma/seed.ts", "client:delivery-create": "ts-node ./src/client/delivery-create.ts" }, @@ -14,6 +15,7 @@ }, "devDependencies": { "@types/node": "18.15.9", + "nodemon": "^2.0.22", "prisma": "4.11.0", "ts-node": "10.9.1", "tsconfig-paths": "^4.1.2", diff --git a/services/delivery/pnpm-lock.yaml b/services/delivery/pnpm-lock.yaml index 50a04449..38da5b6e 100644 --- a/services/delivery/pnpm-lock.yaml +++ b/services/delivery/pnpm-lock.yaml @@ -5,8 +5,8 @@ specifiers: '@grpc/proto-loader': 0.7.6 '@prisma/client': 4.11.0 '@types/node': 18.15.9 - chalk: 4.1.2 dotenv: ^16.0.3 + nodemon: ^2.0.22 prisma: 4.11.0 protobufjs: 7.2.2 ts-node: 10.9.1 @@ -17,12 +17,12 @@ dependencies: '@grpc/grpc-js': 1.8.13 '@grpc/proto-loader': 0.7.6 '@prisma/client': 4.11.0_prisma@4.11.0 - chalk: 4.1.2 dotenv: 16.0.3 protobufjs: 7.2.2 devDependencies: '@types/node': 18.15.9 + nodemon: 2.0.22 prisma: 4.11.0 ts-node: 10.9.1_3flabivgbrnlfzsgzfhinuvrvy tsconfig-paths: 4.1.2 @@ -161,6 +161,10 @@ packages: /@types/node/18.15.9: resolution: {integrity: sha512-dUxhiNzBLr6IqlZXz6e/rN2YQXlFgOei/Dxy+e3cyXTJ4txSUbGT2/fmnD6zd/75jDMeW5bDee+YXxlFKHoV0A==} + /abbrev/1.1.1: + resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} + dev: true + /acorn-walk/8.2.0: resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} engines: {node: '>=0.4.0'} @@ -184,17 +188,55 @@ packages: color-convert: 2.0.1 dev: false + /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 + /arg/4.1.3: resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} dev: true - /chalk/4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} + /balanced-match/1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + dev: true + + /binary-extensions/2.2.0: + resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} + engines: {node: '>=8'} + dev: true + + /brace-expansion/1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - dev: false + balanced-match: 1.0.2 + concat-map: 0.0.1 + dev: true + + /braces/3.0.2: + resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + engines: {node: '>=8'} + dependencies: + fill-range: 7.0.1 + dev: true + + /chokidar/3.5.3: + resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} + engines: {node: '>= 8.10.0'} + dependencies: + anymatch: 3.1.3 + braces: 3.0.2 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.2 + dev: true /cliui/7.0.4: resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} @@ -215,10 +257,26 @@ packages: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} dev: false + /concat-map/0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + dev: true + /create-require/1.1.1: resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} dev: true + /debug/3.2.7_supports-color@5.5.0: + resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.3 + supports-color: 5.5.0 + dev: true + /diff/4.0.2: resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} engines: {node: '>=0.3.1'} @@ -238,21 +296,71 @@ packages: engines: {node: '>=6'} 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: true + + /fsevents/2.3.2: + resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + requiresBuild: true + dev: true + optional: true + /get-caller-file/2.0.5: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} dev: false - /has-flag/4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + /glob-parent/5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + dependencies: + is-glob: 4.0.3 + dev: true + + /has-flag/3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + dev: true + + /ignore-by-default/1.0.1: + resolution: {integrity: sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==} + dev: true + + /is-binary-path/2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} engines: {node: '>=8'} - dev: false + dependencies: + binary-extensions: 2.2.0 + dev: true + + /is-extglob/2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + dev: true /is-fullwidth-code-point/3.0.0: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} engines: {node: '>=8'} dev: false + /is-glob/4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + dependencies: + is-extglob: 2.1.1 + dev: true + + /is-number/7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + dev: true + /json5/2.2.3: resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} engines: {node: '>=6'} @@ -275,10 +383,54 @@ packages: resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} dev: true + /minimatch/3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + dependencies: + brace-expansion: 1.1.11 + dev: true + /minimist/1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} dev: true + /ms/2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + dev: true + + /nodemon/2.0.22: + resolution: {integrity: sha512-B8YqaKMmyuCO7BowF1Z1/mkPqLk6cs/l63Ojtd6otKjMx47Dq1utxfRxcavH1I7VSaL8n5BUaoutadnsX3AAVQ==} + engines: {node: '>=8.10.0'} + hasBin: true + dependencies: + chokidar: 3.5.3 + debug: 3.2.7_supports-color@5.5.0 + ignore-by-default: 1.0.1 + minimatch: 3.1.2 + pstree.remy: 1.1.8 + semver: 5.7.1 + simple-update-notifier: 1.1.0 + supports-color: 5.5.0 + touch: 3.1.0 + undefsafe: 2.0.5 + dev: true + + /nopt/1.0.10: + resolution: {integrity: sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==} + hasBin: true + dependencies: + abbrev: 1.1.1 + dev: true + + /normalize-path/3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + dev: true + + /picomatch/2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + dev: true + /prisma/4.11.0: resolution: {integrity: sha512-4zZmBXssPUEiX+GeL0MUq/Yyie4ltiKmGu7jCJFnYMamNrrulTBc+D+QwAQSJ01tyzeGHlD13kOnqPwRipnlNw==} engines: {node: '>=14.17'} @@ -306,11 +458,39 @@ packages: long: 5.2.1 dev: false + /pstree.remy/1.1.8: + resolution: {integrity: sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==} + dev: true + + /readdirp/3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + dependencies: + picomatch: 2.3.1 + dev: true + /require-directory/2.1.1: resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} engines: {node: '>=0.10.0'} dev: false + /semver/5.7.1: + resolution: {integrity: sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==} + hasBin: true + dev: true + + /semver/7.0.0: + resolution: {integrity: sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==} + hasBin: true + dev: true + + /simple-update-notifier/1.1.0: + resolution: {integrity: sha512-VpsrsJSUcJEseSbMHkrsrAVSdvVS5I96Qo1QAQ4FxQ9wXFcB+pjj7FB7/us9+GcgfW4ziHtYMc1J0PLczb55mg==} + engines: {node: '>=8.10.0'} + dependencies: + semver: 7.0.0 + dev: true + /string-width/4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} @@ -332,12 +512,26 @@ packages: engines: {node: '>=4'} dev: true - /supports-color/7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} + /supports-color/5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} dependencies: - has-flag: 4.0.0 - dev: false + has-flag: 3.0.0 + 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 + dev: true + + /touch/3.1.0: + resolution: {integrity: sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==} + hasBin: true + dependencies: + nopt: 1.0.10 + dev: true /ts-node/10.9.1_3flabivgbrnlfzsgzfhinuvrvy: resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} @@ -385,6 +579,10 @@ packages: hasBin: true dev: true + /undefsafe/2.0.5: + resolution: {integrity: sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==} + dev: true + /v8-compile-cache-lib/3.0.1: resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} dev: true From 308273adf6a55b8ba8c5bbf27163deb6238b7dd2 Mon Sep 17 00:00:00 2001 From: Florian LEROUX <10078837+floriaaan@users.noreply.github.com> Date: Wed, 29 Mar 2023 09:52:32 +0200 Subject: [PATCH 265/883] ref: change estimated_date to eta --- services/delivery/prisma/schema.prisma | 2 +- services/delivery/prisma/seed.ts | 6 +++--- services/delivery/types/delivery.d.ts | 11 +++++++++++ services/proto/delivery.proto | 9 ++++----- 4 files changed, 19 insertions(+), 9 deletions(-) create mode 100644 services/delivery/types/delivery.d.ts diff --git a/services/delivery/prisma/schema.prisma b/services/delivery/prisma/schema.prisma index a9384d5b..2c999c8d 100644 --- a/services/delivery/prisma/schema.prisma +++ b/services/delivery/prisma/schema.prisma @@ -16,7 +16,7 @@ enum Status { model Delivery { id String @id @default(cuid()) - estimated_date DateTime + eta DateTime address String status Status @default(PENDING) diff --git a/services/delivery/prisma/seed.ts b/services/delivery/prisma/seed.ts index 40472cf0..cf92b561 100644 --- a/services/delivery/prisma/seed.ts +++ b/services/delivery/prisma/seed.ts @@ -27,17 +27,17 @@ const deliveryPerson: Prisma.DeliveryPersonCreateInput[] = [ const deliveries: Prisma.DeliveryCreateInput[] = [ { address: "15 rue de la paix 75000 Paris", - estimated_date: new Date("2023-01-01"), + eta: new Date("2023-01-01"), person: { create: deliveryPerson[0] }, }, { address: "16 rue de la paix 75000 Paris", - estimated_date: new Date("2023-02-01"), + eta: new Date("2023-02-01"), person: { create: deliveryPerson[1] }, }, { address: "17 rue de la paix 75000 Paris", - estimated_date: new Date("2023-03-01"), + eta: new Date("2023-03-01"), person: { create: deliveryPerson[2] }, }, ]; diff --git a/services/delivery/types/delivery.d.ts b/services/delivery/types/delivery.d.ts new file mode 100644 index 00000000..52fc3159 --- /dev/null +++ b/services/delivery/types/delivery.d.ts @@ -0,0 +1,11 @@ +import { Status } from "@prisma/client"; + +export type DeliveryCreateInput = { + eta: { + seconds: number; + nano: number; + }; + address: string; + status: Status; + delivery_person_id: string; +}; diff --git a/services/proto/delivery.proto b/services/proto/delivery.proto index 39e65277..b306d511 100644 --- a/services/proto/delivery.proto +++ b/services/proto/delivery.proto @@ -1,12 +1,11 @@ syntax = "proto3"; -import "google/protobuf/timestamp.proto"; import "google/protobuf/empty.proto"; package delivery; message Delivery { string id = 1; - google.protobuf.Timestamp estimated_date = 2; + string eta = 2; string address = 3; Status status = 4; @@ -33,7 +32,7 @@ enum Status { } service DeliveryService { - rpc CreateDelivery (Delivery) returns (Delivery) {} + rpc CreateDelivery (DeliveryCreateInput) returns (Delivery) {} rpc GetDelivery (DeliveryId) returns (Delivery) {} rpc UpdateDelivery (Delivery) returns (Delivery) {} rpc DeleteDelivery (DeliveryId) returns (google.protobuf.Empty) {} @@ -43,7 +42,7 @@ service DeliveryService { } service DeliveryPersonService { - rpc CreateDeliveryPerson (DeliveryPerson) returns (DeliveryPerson) {} + rpc CreateDeliveryPerson (DeliveryPersonCreateInput) returns (DeliveryPerson) {} rpc GetDeliveryPerson (DeliveryPersonId) returns (DeliveryPerson) {} rpc UpdateDeliveryPerson (DeliveryPerson) returns (DeliveryPerson) {} rpc DeleteDeliveryPerson (DeliveryPersonId) returns (google.protobuf.Empty) {} @@ -56,7 +55,7 @@ message DeliveryId { string id = 1; } message DeliveryCreateInput { - google.protobuf.Timestamp estimated_date = 1; + string eta = 1; string address = 2; Status status = 3; string delivery_person_id = 4; From 14575f2286aa2480531a0414ab29ce9bb3eaf5f2 Mon Sep 17 00:00:00 2001 From: Florian LEROUX <10078837+floriaaan@users.noreply.github.com> Date: Wed, 29 Mar 2023 09:53:00 +0200 Subject: [PATCH 266/883] feat(handler): add create-delivery handler --- .../delivery/src/client/delivery-create.ts | 39 +++++++++++++++++ services/delivery/src/handlers/delivery.ts | 42 +++++++++++++++++++ 2 files changed, 81 insertions(+) create mode 100644 services/delivery/src/client/delivery-create.ts create mode 100644 services/delivery/src/handlers/delivery.ts diff --git a/services/delivery/src/client/delivery-create.ts b/services/delivery/src/client/delivery-create.ts new file mode 100644 index 00000000..2b4fdff5 --- /dev/null +++ b/services/delivery/src/client/delivery-create.ts @@ -0,0 +1,39 @@ +import "dotenv/config"; +import { loadSync } from "@grpc/proto-loader"; +import { loadPackageDefinition } from "@grpc/grpc-js"; + +import { options } from "@delivery/resources/protoloader-options"; +import { insecure } from "@delivery/resources/grpc-credentials"; +import { log } from "@delivery/lib/log"; + +const PORT = process.env.PORT || 50008; +const ADDRESS = `localhost:${PORT}`; +const PROTO_PATH = __dirname + "/../../../proto/delivery.proto"; + +const packageDefinition = loadSync(PROTO_PATH, options); +const { delivery } = loadPackageDefinition(packageDefinition) as any; + +function main() { + const client = new delivery.DeliveryService(ADDRESS, insecure); + + /** + * message DeliveryCreateInput { + google.protobuf.Timestamp eta = 1; + string address = 2; + Status status = 3; + string delivery_person_id = 4; + } + */ + const data = { + eta: "2022-01-01T00:00:00.000Z", + address: "10 Rue de la République, 75003 Paris, France", + status: "PENDING", + delivery_person_id: "random_id", + }; + client.CreateDelivery(data, (err: any, response: any) => { + if (err) log.error(err); + log.info(response); + }); +} + +main(); diff --git a/services/delivery/src/handlers/delivery.ts b/services/delivery/src/handlers/delivery.ts new file mode 100644 index 00000000..c6f070af --- /dev/null +++ b/services/delivery/src/handlers/delivery.ts @@ -0,0 +1,42 @@ +import { prisma } from "@delivery/lib/prisma"; +import { log } from "@delivery/lib/log"; +import { Status } from "@prisma/client"; + +type DeliveryCreateInput = { + eta: string; + address: string; + status: Status; + delivery_person_id: string; +}; + +export const CreateDelivery = async ( + data: any, + callback: (err: any, response: any) => void +) => { + log.debug("request received at CreateDelivery handler\n", data.request); + try { + const { request } = data; + const { eta, address, status, delivery_person_id } = + request as DeliveryCreateInput; + + const delivery = await prisma.delivery.create({ + data: { + eta: new Date(eta), + address, + status, + person: { + connect: { + id: delivery_person_id, + }, + }, + }, + include: { + person: true, + }, + }); + callback(null, delivery); + } catch (error) { + log.error(error); + callback(error, null); + } +}; From 135f489c6fb778d0d670b339d92c66ad1de46ff7 Mon Sep 17 00:00:00 2001 From: Florian LEROUX <10078837+floriaaan@users.noreply.github.com> Date: Fri, 31 Mar 2023 20:59:30 +0200 Subject: [PATCH 267/883] feat(delivery): add implementation of handlers for delivery service --- services/delivery/README.md | 2 +- services/delivery/package.json | 7 +++- services/delivery/prisma/schema.prisma | 7 +++- services/delivery/prisma/seed.ts | 18 ++++++++ .../delivery/src/client/delivery-create.ts | 39 ----------------- .../delivery/src/client/delivery/create.ts | 34 ++++++--------- .../src/client/delivery/list-by-restaurant.ts | 19 +++++++-- .../src/client/delivery/list-by-user.ts | 19 +++++++-- services/delivery/src/handlers/delivery.ts | 42 ------------------- .../delivery/src/handlers/delivery/create.ts | 7 ++-- .../delivery/src/handlers/delivery/delete.ts | 3 +- .../delivery/src/handlers/delivery/get.ts | 5 +-- .../handlers/delivery/list-by-restaurant.ts | 23 +++++----- .../src/handlers/delivery/list-by-user.ts | 23 +++++----- .../delivery/src/handlers/delivery/update.ts | 7 ++-- services/delivery/src/server.ts | 14 ++----- .../delivery/src/types/delivery-person.d.ts | 14 ------- services/delivery/src/types/delivery.d.ts | 12 +++++- services/delivery/types/delivery.d.ts | 11 ----- services/proto/delivery.proto | 6 +++ 20 files changed, 128 insertions(+), 184 deletions(-) delete mode 100644 services/delivery/src/client/delivery-create.ts delete mode 100644 services/delivery/src/handlers/delivery.ts delete mode 100644 services/delivery/types/delivery.d.ts diff --git a/services/delivery/README.md b/services/delivery/README.md index f3baac1e..7f125245 100644 --- a/services/delivery/README.md +++ b/services/delivery/README.md @@ -5,7 +5,7 @@ | **Port:** 50008 | | **Developer:** @floriaaan | | **Status:** In progress | -| **Last update:** 2023-03-29 | +| **Last update:** 2023-03-31 | | **Language:** NodeJS | | **Dependencies:** TypeScript, Prisma, gRPC, Postgres | | **Models:** (see [`prisma/schema.prisma`](./prisma/schema.prisma)) | diff --git a/services/delivery/package.json b/services/delivery/package.json index 113ef54d..3eb5a908 100644 --- a/services/delivery/package.json +++ b/services/delivery/package.json @@ -4,7 +4,12 @@ "start": "ts-node ./src/server.ts", "dev": "nodemon --watch 'src/**/*.ts' --exec 'ts-node' src/server.ts", "seed": "ts-node prisma/seed.ts", - "client:delivery-create": "ts-node ./src/client/delivery-create.ts" + "client:delivery-create": "ts-node ./src/client/delivery/create.ts", + "client:delivery-get": "ts-node ./src/client/delivery/get.ts", + "client:delivery-update": "ts-node ./src/client/delivery/update.ts", + "client:delivery-delete": "ts-node ./src/client/delivery/delete.ts", + "client:delivery-listByRestaurant": "ts-node ./src/client/delivery/list-by-restaurant.ts", + "client:delivery-listByUser": "ts-node ./src/client/delivery/list-by-user.ts" }, "dependencies": { "@grpc/grpc-js": "^1.8.13", diff --git a/services/delivery/prisma/schema.prisma b/services/delivery/prisma/schema.prisma index 2c999c8d..0d7939f5 100644 --- a/services/delivery/prisma/schema.prisma +++ b/services/delivery/prisma/schema.prisma @@ -15,7 +15,7 @@ enum Status { } model Delivery { - id String @id @default(cuid()) + id String @id @default(cuid()) eta DateTime address String @@ -23,13 +23,16 @@ model Delivery { person DeliveryPerson @relation(fields: [delivery_person_id], references: [id]) delivery_person_id String + + user_id String + restaurant_id String } model DeliveryPerson { id String @id @default(cuid()) first_name String last_name String - phone String @unique + phone String @unique location Float[] deliveries Delivery[] diff --git a/services/delivery/prisma/seed.ts b/services/delivery/prisma/seed.ts index cf92b561..cc6998fd 100644 --- a/services/delivery/prisma/seed.ts +++ b/services/delivery/prisma/seed.ts @@ -29,16 +29,33 @@ const deliveries: Prisma.DeliveryCreateInput[] = [ address: "15 rue de la paix 75000 Paris", eta: new Date("2023-01-01"), person: { create: deliveryPerson[0] }, + + restaurant_id: "restaurant_id:1", + user_id: "user_id:1", + }, + { + address: "15 rue de la paix 75000 Paris", + eta: new Date("2023-01-01"), + person: { create: deliveryPerson[0] }, + + restaurant_id: "restaurant_id:2", + user_id: "user_id:1", }, { address: "16 rue de la paix 75000 Paris", eta: new Date("2023-02-01"), person: { create: deliveryPerson[1] }, + + restaurant_id: "restaurant_id:1", + user_id: "user_id:2", }, { address: "17 rue de la paix 75000 Paris", eta: new Date("2023-03-01"), person: { create: deliveryPerson[2] }, + + restaurant_id: "restaurant_id:1", + user_id: "user_id:3", }, ]; @@ -60,5 +77,6 @@ main() .catch(async (e) => { console.error(e); await prisma.$disconnect(); + // @ts-ignore process.exit(1); }); diff --git a/services/delivery/src/client/delivery-create.ts b/services/delivery/src/client/delivery-create.ts deleted file mode 100644 index 2b4fdff5..00000000 --- a/services/delivery/src/client/delivery-create.ts +++ /dev/null @@ -1,39 +0,0 @@ -import "dotenv/config"; -import { loadSync } from "@grpc/proto-loader"; -import { loadPackageDefinition } from "@grpc/grpc-js"; - -import { options } from "@delivery/resources/protoloader-options"; -import { insecure } from "@delivery/resources/grpc-credentials"; -import { log } from "@delivery/lib/log"; - -const PORT = process.env.PORT || 50008; -const ADDRESS = `localhost:${PORT}`; -const PROTO_PATH = __dirname + "/../../../proto/delivery.proto"; - -const packageDefinition = loadSync(PROTO_PATH, options); -const { delivery } = loadPackageDefinition(packageDefinition) as any; - -function main() { - const client = new delivery.DeliveryService(ADDRESS, insecure); - - /** - * message DeliveryCreateInput { - google.protobuf.Timestamp eta = 1; - string address = 2; - Status status = 3; - string delivery_person_id = 4; - } - */ - const data = { - eta: "2022-01-01T00:00:00.000Z", - address: "10 Rue de la République, 75003 Paris, France", - status: "PENDING", - delivery_person_id: "random_id", - }; - client.CreateDelivery(data, (err: any, response: any) => { - if (err) log.error(err); - log.info(response); - }); -} - -main(); diff --git a/services/delivery/src/client/delivery/create.ts b/services/delivery/src/client/delivery/create.ts index 00397bce..9e6717dd 100644 --- a/services/delivery/src/client/delivery/create.ts +++ b/services/delivery/src/client/delivery/create.ts @@ -5,7 +5,6 @@ import { loadPackageDefinition } from "@grpc/grpc-js"; import { options } from "@delivery/resources/protoloader-options"; import { insecure } from "@delivery/resources/grpc-credentials"; import { log } from "@delivery/lib/log"; -import { Delivery } from "@delivery/types/delivery"; const PORT = process.env.PORT || 50008; const ADDRESS = `localhost:${PORT}`; @@ -14,28 +13,21 @@ const PROTO_PATH = __dirname + "/../../../../proto/delivery.proto"; const packageDefinition = loadSync(PROTO_PATH, options); const { delivery } = loadPackageDefinition(packageDefinition) as any; -const DEFAULT_DATA = { - eta: "2022-01-01T00:00:00.000Z", - address: "10 Rue de la République, 75003 Paris, France", - status: "PENDING", - delivery_person_id: "random_id", - restaurant_id: "restaurant_id:1", - user_id: "user_id:1", -}; - -export async function main(data = DEFAULT_DATA) { +function main() { const client = new delivery.DeliveryService(ADDRESS, insecure); - const response: Delivery | null = await client.CreateDelivery( - data, - async (err: any, response: any) => { - if (err) log.debug(err); - log.debug(response); - return Promise.resolve(response); - } - ); - - return response; + const data = { + eta: "2022-01-01T00:00:00.000Z", + address: "10 Rue de la République, 75003 Paris, France", + status: "PENDING", + delivery_person_id: "random_id", + restaurant_id: "restaurant_id:1", + user_id: "user_id:1", + }; + client.CreateDelivery(data, (err: any, response: any) => { + if (err) log.debug(err); + log.debug(response); + }); } main(); diff --git a/services/delivery/src/client/delivery/list-by-restaurant.ts b/services/delivery/src/client/delivery/list-by-restaurant.ts index a3dd55d9..0e7157a5 100644 --- a/services/delivery/src/client/delivery/list-by-restaurant.ts +++ b/services/delivery/src/client/delivery/list-by-restaurant.ts @@ -5,6 +5,7 @@ import { loadPackageDefinition } from "@grpc/grpc-js"; import { options } from "@delivery/resources/protoloader-options"; import { insecure } from "@delivery/resources/grpc-credentials"; import { log } from "@delivery/lib/log"; +import { Delivery } from "@delivery/types/delivery"; const PORT = process.env.PORT || 50008; const ADDRESS = `localhost:${PORT}`; @@ -17,11 +18,21 @@ function main() { const client = new delivery.DeliveryService(ADDRESS, insecure); const data = { - id: "restaurant_id:1", // Change this to a valid delivery id + id: "restaurant_id:1", }; - client.ListDeliveriesByRestaurant(data, (err: any, response: any) => { - if (err) log.debug(err); - log.debug(response); + + const call = client.ListDeliveriesByRestaurant(data); + const deliveries: Delivery[] = []; + call.on("data", (delivery: Delivery) => { + log.debug(`Received delivery: ${delivery.id}`); + deliveries.push(delivery); + }); + call.on("end", () => { + console.log("All deliveries received."); + log.debug(deliveries); + }); + call.on("error", (error: Error) => { + log.debug("Error:", error.message); }); } diff --git a/services/delivery/src/client/delivery/list-by-user.ts b/services/delivery/src/client/delivery/list-by-user.ts index 1fbc9c48..b51c7f2b 100644 --- a/services/delivery/src/client/delivery/list-by-user.ts +++ b/services/delivery/src/client/delivery/list-by-user.ts @@ -5,6 +5,7 @@ import { loadPackageDefinition } from "@grpc/grpc-js"; import { options } from "@delivery/resources/protoloader-options"; import { insecure } from "@delivery/resources/grpc-credentials"; import { log } from "@delivery/lib/log"; +import { Delivery } from "@delivery/types/delivery"; const PORT = process.env.PORT || 50008; const ADDRESS = `localhost:${PORT}`; @@ -17,11 +18,21 @@ function main() { const client = new delivery.DeliveryService(ADDRESS, insecure); const data = { - id: "user_id:1", // Change this to a valid delivery id + id: "user_id:1", }; - client.ListDeliveriesByUser(data, (err: any, response: any) => { - if (err) log.debug(err); - log.debug(response); + + const call = client.ListDeliveriesByUser(data); + const deliveries: Delivery[] = []; + call.on("data", (delivery: Delivery) => { + log.debug(`Received delivery: ${delivery.id}`); + deliveries.push(delivery); + }); + call.on("end", () => { + console.log("All deliveries received."); + log.debug(deliveries); + }); + call.on("error", (error: Error) => { + log.debug("Error:", error.message); }); } diff --git a/services/delivery/src/handlers/delivery.ts b/services/delivery/src/handlers/delivery.ts deleted file mode 100644 index c6f070af..00000000 --- a/services/delivery/src/handlers/delivery.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { prisma } from "@delivery/lib/prisma"; -import { log } from "@delivery/lib/log"; -import { Status } from "@prisma/client"; - -type DeliveryCreateInput = { - eta: string; - address: string; - status: Status; - delivery_person_id: string; -}; - -export const CreateDelivery = async ( - data: any, - callback: (err: any, response: any) => void -) => { - log.debug("request received at CreateDelivery handler\n", data.request); - try { - const { request } = data; - const { eta, address, status, delivery_person_id } = - request as DeliveryCreateInput; - - const delivery = await prisma.delivery.create({ - data: { - eta: new Date(eta), - address, - status, - person: { - connect: { - id: delivery_person_id, - }, - }, - }, - include: { - person: true, - }, - }); - callback(null, delivery); - } catch (error) { - log.error(error); - callback(error, null); - } -}; diff --git a/services/delivery/src/handlers/delivery/create.ts b/services/delivery/src/handlers/delivery/create.ts index 1524de68..1ad90069 100644 --- a/services/delivery/src/handlers/delivery/create.ts +++ b/services/delivery/src/handlers/delivery/create.ts @@ -1,7 +1,6 @@ import { prisma } from "@delivery/lib/prisma"; import { log } from "@delivery/lib/log"; -import { DeliveryCreateInput } from "@delivery/types/delivery"; -import { Data } from "@delivery/types"; +import { Data, DeliveryCreateInput } from "@delivery/types/delivery"; export const CreateDelivery = async ( { request }: Data, @@ -17,7 +16,7 @@ export const CreateDelivery = async ( eta: new Date(eta), address, status, - delivery_person: { + person: { connect: { id: delivery_person_id, }, @@ -26,7 +25,7 @@ export const CreateDelivery = async ( user_id, }, include: { - delivery_person: true, + person: true, }, }); callback(null, delivery); diff --git a/services/delivery/src/handlers/delivery/delete.ts b/services/delivery/src/handlers/delivery/delete.ts index 35b5ade7..cdeee90b 100644 --- a/services/delivery/src/handlers/delivery/delete.ts +++ b/services/delivery/src/handlers/delivery/delete.ts @@ -1,7 +1,6 @@ import { prisma } from "@delivery/lib/prisma"; import { log } from "@delivery/lib/log"; -import { DeliveryId } from "@delivery/types/delivery"; -import { Data } from "@delivery/types"; +import { Data, DeliveryId } from "@delivery/types/delivery"; export const DeleteDelivery = async ( data: Data, diff --git a/services/delivery/src/handlers/delivery/get.ts b/services/delivery/src/handlers/delivery/get.ts index c6da00b3..cde931dd 100644 --- a/services/delivery/src/handlers/delivery/get.ts +++ b/services/delivery/src/handlers/delivery/get.ts @@ -1,7 +1,6 @@ import { prisma } from "@delivery/lib/prisma"; import { log } from "@delivery/lib/log"; -import { DeliveryId } from "@delivery/types/delivery"; -import { Data } from "@delivery/types"; +import { Data, DeliveryId } from "@delivery/types/delivery"; export const GetDelivery = async ( data: Data, @@ -14,7 +13,7 @@ export const GetDelivery = async ( const delivery = await prisma.delivery.findFirstOrThrow({ where: { id }, - include: { delivery_person: true }, + include: { person: true }, }); callback(null, delivery); } catch (error) { diff --git a/services/delivery/src/handlers/delivery/list-by-restaurant.ts b/services/delivery/src/handlers/delivery/list-by-restaurant.ts index fc413ae1..ecfa3991 100644 --- a/services/delivery/src/handlers/delivery/list-by-restaurant.ts +++ b/services/delivery/src/handlers/delivery/list-by-restaurant.ts @@ -1,27 +1,30 @@ import { prisma } from "@delivery/lib/prisma"; import { log } from "@delivery/lib/log"; -import { RestaurantId } from "@delivery/types/delivery"; -import { Data } from "@delivery/types"; +import { RestaurantId, Delivery } from "@delivery/types/delivery"; +import { ServerWritableStream } from "@grpc/grpc-js"; export const ListDeliveriesByRestaurant = async ( - data: Data, - callback: (err: any, response: any) => void + call: ServerWritableStream ) => { log.debug( "request received at ListDeliveriesByRestaurant handler\n", - data.request + call.request ); try { - const { request } = data; - const { id } = request; + const { id } = call.request; const deliveries = await prisma.delivery.findMany({ where: { restaurant_id: id }, - include: { delivery_person: true }, + include: { person: true }, }); - callback(null, { deliveries }); + + for (const delivery of deliveries) { + call.write(delivery); + } + call.end(); } catch (error) { log.error(error); - callback(error, null); + + call.end(); } }; diff --git a/services/delivery/src/handlers/delivery/list-by-user.ts b/services/delivery/src/handlers/delivery/list-by-user.ts index 93eddff9..2bdb406c 100644 --- a/services/delivery/src/handlers/delivery/list-by-user.ts +++ b/services/delivery/src/handlers/delivery/list-by-user.ts @@ -1,24 +1,27 @@ import { prisma } from "@delivery/lib/prisma"; import { log } from "@delivery/lib/log"; -import { UserId } from "@delivery/types/delivery"; -import { Data } from "@delivery/types"; +import { Delivery, UserId } from "@delivery/types/delivery"; +import { ServerWritableStream } from "@grpc/grpc-js"; export const ListDeliveriesByUser = async ( - data: Data, - callback: (err: any, response: any) => void + call: ServerWritableStream ) => { - log.debug("request received at ListDeliveriesByUser handler\n", data.request); + log.debug("request received at ListDeliveriesByUser handler\n", call.request); try { - const { request } = data; - const { id } = request; + const { id } = call.request; const deliveries = await prisma.delivery.findMany({ where: { user_id: id }, - include: { delivery_person: true }, + include: { person: true }, }); - callback(null, { deliveries }); + + for (const delivery of deliveries) { + call.write(delivery); + } + call.end(); } catch (error) { log.error(error); - callback(error, null); + + call.end(); } }; diff --git a/services/delivery/src/handlers/delivery/update.ts b/services/delivery/src/handlers/delivery/update.ts index a0267647..d08d2bd2 100644 --- a/services/delivery/src/handlers/delivery/update.ts +++ b/services/delivery/src/handlers/delivery/update.ts @@ -1,7 +1,6 @@ import { prisma } from "@delivery/lib/prisma"; import { log } from "@delivery/lib/log"; -import { Delivery } from "@delivery/types/delivery"; -import { Data } from "@delivery/types"; +import { Data, Delivery } from "@delivery/types/delivery"; export const UpdateDelivery = async ( data: Data, @@ -17,14 +16,14 @@ export const UpdateDelivery = async ( eta: new Date(eta), address, status, - delivery_person: { + person: { connect: { id: delivery_person_id, }, }, }, include: { - delivery_person: true, + person: true, }, }); callback(null, delivery); diff --git a/services/delivery/src/server.ts b/services/delivery/src/server.ts index 16a27d70..2eac6c38 100644 --- a/services/delivery/src/server.ts +++ b/services/delivery/src/server.ts @@ -7,7 +7,7 @@ import { log, utils } from "@delivery/lib/log"; import { options } from "@delivery/resources/protoloader-options"; import { serverInsecure } from "@delivery/resources/grpc-credentials"; -import { CreateDelivery } from "@delivery/handlers/delivery"; +import deliveryHandlers from "@delivery/handlers/delivery"; const PORT = process.env.PORT || 50008; const ADDRESS = `0.0.0.0:${PORT}`; @@ -17,16 +17,8 @@ const packageDefinition = loadSync(PROTO_PATH, options); const { delivery } = loadPackageDefinition(packageDefinition) as any; // todo: fix any const server = new Server(); -server.addService(delivery.DeliveryService.service, { - // handlers - // todo: add handlers - CreateDelivery, -}); - -server.addService(delivery.DeliveryPersonService.service, { - // handlers - // todo: add handlers -}); +server.addService(delivery.DeliveryService.service, deliveryHandlers); +server.addService(delivery.DeliveryPersonService.service, {}); server.bindAsync(ADDRESS, serverInsecure, () => { server.start(); diff --git a/services/delivery/src/types/delivery-person.d.ts b/services/delivery/src/types/delivery-person.d.ts index 5bb6731d..a897860e 100644 --- a/services/delivery/src/types/delivery-person.d.ts +++ b/services/delivery/src/types/delivery-person.d.ts @@ -9,17 +9,3 @@ export type DeliveryPerson = { deliveries: Delivery[]; }; - -export type DeliveryPersonCreateInput = { - first_name: string; - last_name: string; - phone: string; - location: [number, number]; -}; - -export type LocationInput = { - latitude: number; - longitude: number; -}; - -export type DeliveryPersonId = { id: DeliveryPerson["id"] }; diff --git a/services/delivery/src/types/delivery.d.ts b/services/delivery/src/types/delivery.d.ts index 59ff1d82..333462d6 100644 --- a/services/delivery/src/types/delivery.d.ts +++ b/services/delivery/src/types/delivery.d.ts @@ -1,6 +1,16 @@ import { DeliveryPerson } from "@delivery/types/delivery-person"; import { Status } from "@prisma/client"; +export type Data = { + request: T; +}; + +export type Stream = { + write: (data: any) => void; + end: () => void; + request: T; +}; + export type DeliveryCreateInput = { eta: string; address: string; @@ -13,7 +23,7 @@ export type DeliveryCreateInput = { }; export type DeliveryId = { - id: Delivery["id"]; + id: string; }; export type Delivery = { diff --git a/services/delivery/types/delivery.d.ts b/services/delivery/types/delivery.d.ts deleted file mode 100644 index 52fc3159..00000000 --- a/services/delivery/types/delivery.d.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { Status } from "@prisma/client"; - -export type DeliveryCreateInput = { - eta: { - seconds: number; - nano: number; - }; - address: string; - status: Status; - delivery_person_id: string; -}; diff --git a/services/proto/delivery.proto b/services/proto/delivery.proto index b306d511..e20e1e97 100644 --- a/services/proto/delivery.proto +++ b/services/proto/delivery.proto @@ -12,6 +12,9 @@ message Delivery { DeliveryPerson person = 5; string delivery_person_id = 6; + + string user_id = 7; + string restaurant_id = 8; } message DeliveryPerson { @@ -59,6 +62,9 @@ message DeliveryCreateInput { string address = 2; Status status = 3; string delivery_person_id = 4; + + string user_id = 5; + string restaurant_id = 6; } message UserId { From fa55bf435da985bd6d870b73c98651d5de923839 Mon Sep 17 00:00:00 2001 From: Florian LEROUX <10078837+floriaaan@users.noreply.github.com> Date: Sat, 1 Apr 2023 14:20:43 +0200 Subject: [PATCH 268/883] ref(proto): change stream to repeated --- .../src/client/delivery/list-by-restaurant.ts | 19 ++++-------------- .../src/client/delivery/list-by-user.ts | 19 ++++-------------- .../handlers/delivery/list-by-restaurant.ts | 20 ++++++++----------- .../src/handlers/delivery/list-by-user.ts | 20 ++++++++----------- services/proto/delivery.proto | 16 +++++++++++---- 5 files changed, 36 insertions(+), 58 deletions(-) diff --git a/services/delivery/src/client/delivery/list-by-restaurant.ts b/services/delivery/src/client/delivery/list-by-restaurant.ts index 0e7157a5..a3dd55d9 100644 --- a/services/delivery/src/client/delivery/list-by-restaurant.ts +++ b/services/delivery/src/client/delivery/list-by-restaurant.ts @@ -5,7 +5,6 @@ import { loadPackageDefinition } from "@grpc/grpc-js"; import { options } from "@delivery/resources/protoloader-options"; import { insecure } from "@delivery/resources/grpc-credentials"; import { log } from "@delivery/lib/log"; -import { Delivery } from "@delivery/types/delivery"; const PORT = process.env.PORT || 50008; const ADDRESS = `localhost:${PORT}`; @@ -18,21 +17,11 @@ function main() { const client = new delivery.DeliveryService(ADDRESS, insecure); const data = { - id: "restaurant_id:1", + id: "restaurant_id:1", // Change this to a valid delivery id }; - - const call = client.ListDeliveriesByRestaurant(data); - const deliveries: Delivery[] = []; - call.on("data", (delivery: Delivery) => { - log.debug(`Received delivery: ${delivery.id}`); - deliveries.push(delivery); - }); - call.on("end", () => { - console.log("All deliveries received."); - log.debug(deliveries); - }); - call.on("error", (error: Error) => { - log.debug("Error:", error.message); + client.ListDeliveriesByRestaurant(data, (err: any, response: any) => { + if (err) log.debug(err); + log.debug(response); }); } diff --git a/services/delivery/src/client/delivery/list-by-user.ts b/services/delivery/src/client/delivery/list-by-user.ts index b51c7f2b..1fbc9c48 100644 --- a/services/delivery/src/client/delivery/list-by-user.ts +++ b/services/delivery/src/client/delivery/list-by-user.ts @@ -5,7 +5,6 @@ import { loadPackageDefinition } from "@grpc/grpc-js"; import { options } from "@delivery/resources/protoloader-options"; import { insecure } from "@delivery/resources/grpc-credentials"; import { log } from "@delivery/lib/log"; -import { Delivery } from "@delivery/types/delivery"; const PORT = process.env.PORT || 50008; const ADDRESS = `localhost:${PORT}`; @@ -18,21 +17,11 @@ function main() { const client = new delivery.DeliveryService(ADDRESS, insecure); const data = { - id: "user_id:1", + id: "user_id:1", // Change this to a valid delivery id }; - - const call = client.ListDeliveriesByUser(data); - const deliveries: Delivery[] = []; - call.on("data", (delivery: Delivery) => { - log.debug(`Received delivery: ${delivery.id}`); - deliveries.push(delivery); - }); - call.on("end", () => { - console.log("All deliveries received."); - log.debug(deliveries); - }); - call.on("error", (error: Error) => { - log.debug("Error:", error.message); + client.ListDeliveriesByUser(data, (err: any, response: any) => { + if (err) log.debug(err); + log.debug(response); }); } diff --git a/services/delivery/src/handlers/delivery/list-by-restaurant.ts b/services/delivery/src/handlers/delivery/list-by-restaurant.ts index ecfa3991..879bb285 100644 --- a/services/delivery/src/handlers/delivery/list-by-restaurant.ts +++ b/services/delivery/src/handlers/delivery/list-by-restaurant.ts @@ -1,30 +1,26 @@ import { prisma } from "@delivery/lib/prisma"; import { log } from "@delivery/lib/log"; -import { RestaurantId, Delivery } from "@delivery/types/delivery"; -import { ServerWritableStream } from "@grpc/grpc-js"; +import { Data, RestaurantId } from "@delivery/types/delivery"; export const ListDeliveriesByRestaurant = async ( - call: ServerWritableStream + data: Data, + callback: (err: any, response: any) => void ) => { log.debug( "request received at ListDeliveriesByRestaurant handler\n", - call.request + data.request ); try { - const { id } = call.request; + const { request } = data; + const { id } = request; const deliveries = await prisma.delivery.findMany({ where: { restaurant_id: id }, include: { person: true }, }); - - for (const delivery of deliveries) { - call.write(delivery); - } - call.end(); + callback(null, { deliveries }); } catch (error) { log.error(error); - - call.end(); + callback(error, null); } }; diff --git a/services/delivery/src/handlers/delivery/list-by-user.ts b/services/delivery/src/handlers/delivery/list-by-user.ts index 2bdb406c..8c220175 100644 --- a/services/delivery/src/handlers/delivery/list-by-user.ts +++ b/services/delivery/src/handlers/delivery/list-by-user.ts @@ -1,27 +1,23 @@ import { prisma } from "@delivery/lib/prisma"; import { log } from "@delivery/lib/log"; -import { Delivery, UserId } from "@delivery/types/delivery"; -import { ServerWritableStream } from "@grpc/grpc-js"; +import { Data, UserId } from "@delivery/types/delivery"; export const ListDeliveriesByUser = async ( - call: ServerWritableStream + data: Data, + callback: (err: any, response: any) => void ) => { - log.debug("request received at ListDeliveriesByUser handler\n", call.request); + log.debug("request received at ListDeliveriesByUser handler\n", data.request); try { - const { id } = call.request; + const { request } = data; + const { id } = request; const deliveries = await prisma.delivery.findMany({ where: { user_id: id }, include: { person: true }, }); - - for (const delivery of deliveries) { - call.write(delivery); - } - call.end(); + callback(null, { deliveries }); } catch (error) { log.error(error); - - call.end(); + callback(error, null); } }; diff --git a/services/proto/delivery.proto b/services/proto/delivery.proto index e20e1e97..f4906434 100644 --- a/services/proto/delivery.proto +++ b/services/proto/delivery.proto @@ -39,8 +39,8 @@ service DeliveryService { rpc GetDelivery (DeliveryId) returns (Delivery) {} rpc UpdateDelivery (Delivery) returns (Delivery) {} rpc DeleteDelivery (DeliveryId) returns (google.protobuf.Empty) {} - rpc ListDeliveriesByUser (UserId) returns (stream Delivery) {} - rpc ListDeliveriesByRestaurant (RestaurantId) returns (stream Delivery) {} + rpc ListDeliveriesByUser (UserId) returns (DeliveryList) {} + rpc ListDeliveriesByRestaurant (RestaurantId) returns (DeliveryList) {} } @@ -49,8 +49,8 @@ service DeliveryPersonService { rpc GetDeliveryPerson (DeliveryPersonId) returns (DeliveryPerson) {} rpc UpdateDeliveryPerson (DeliveryPerson) returns (DeliveryPerson) {} rpc DeleteDeliveryPerson (DeliveryPersonId) returns (google.protobuf.Empty) {} - rpc ListDeliveryPersons (google.protobuf.Empty) returns (stream DeliveryPerson) {} - rpc ListNearDeliveryPersons (Location) returns (stream DeliveryPerson) {} + rpc ListDeliveryPersons (google.protobuf.Empty) returns (DeliveryPersonList) {} + rpc ListNearDeliveryPersons (Location) returns (DeliveryPersonList) {} } @@ -75,6 +75,14 @@ message RestaurantId { string id = 1; } +message DeliveryList { + repeated Delivery deliveries = 1; +} + +message DeliveryPersonList { + repeated DeliveryPersonList persons = 1; +} + message DeliveryPersonId { string id = 1; } From fda9f54f7e3cefb9912e8a507ff461af200e4d77 Mon Sep 17 00:00:00 2001 From: Florian LEROUX <10078837+floriaaan@users.noreply.github.com> Date: Tue, 4 Apr 2023 10:07:20 +0200 Subject: [PATCH 269/883] ci: add test/coverage scripts and update README --- .github/workflows/delivery.yml | 26 +- README.md | 1 + services/delivery/README.md | 2 +- services/delivery/package.json | 31 +- services/delivery/pnpm-lock.yaml | 1852 ++++++++++++++++++++-- services/delivery/proto | 1 + services/delivery/src/tests/test.test.ts | 6 + services/delivery/vitest.config.ts | 3 - 8 files changed, 1760 insertions(+), 162 deletions(-) create mode 120000 services/delivery/proto create mode 100644 services/delivery/src/tests/test.test.ts diff --git a/.github/workflows/delivery.yml b/.github/workflows/delivery.yml index 1b68e1b2..a0953866 100644 --- a/.github/workflows/delivery.yml +++ b/.github/workflows/delivery.yml @@ -2,9 +2,9 @@ name: Delivery Microservice CI/CD on: push: - branches: [ delivery ] + branches: [delivery] pull_request: - branches: [ dev, main ] + branches: [dev, main] jobs: build: @@ -18,7 +18,6 @@ jobs: with: node-version: "18.x" cache: "pnpm" - cache-dependency-path: services/delivery/pnpm-lock.yaml - name: Install dependencies run: | cd ./services/delivery @@ -40,7 +39,6 @@ jobs: with: node-version: "18.x" cache: "pnpm" - cache-dependency-path: services/delivery/pnpm-lock.yaml - name: Install dependencies run: | cd ./services/delivery @@ -52,19 +50,19 @@ jobs: publish: runs-on: ubuntu-latest - needs: [ build, test ] + needs: [build, test] + if: ${{ success() }} && ${{ github.ref == 'refs/heads/dev' || github.ref == 'refs/heads/main' }} steps: - name: Checkout code - uses: actions/checkout@master + uses: actions/checkout@v2 - name: Login to Docker Hub - uses: docker/login-action@v2 + uses: docker/login-action@v1 with: - username: ${{ secrets.DOCKERHUB_USERNAME }} - password: ${{ secrets.DOCKERHUB_TOKEN }} - - name: Build and push - uses: docker/build-push-action@v4 + username: ${{ secrets.DOCKER_USERNAME }} + password: ${{ secrets.DOCKER_PASSWORD }} + - name: Build and push Docker image + uses: docker/build-push-action@v2 with: - context: ./services/ - file: ./services/delivery/Dockerfile + context: ./services/delivery push: true - tags: floriaaan/goodfood-delivery:latest \ No newline at end of file + tags: floriaaan/goodfood-delivery:latest diff --git a/README.md b/README.md index a405370d..8be16b82 100644 --- a/README.md +++ b/README.md @@ -47,6 +47,7 @@ The file hierarchy for this project is as follows: ├── gateway/ │ ├── k8s/ │ │ └── (...) # k8s files + │ ├── proto/ (symbolic link to /services/proto/) │ └── terraform/ │ └── (...) # terraform files ├── user/ diff --git a/services/delivery/README.md b/services/delivery/README.md index 7f125245..69965be6 100644 --- a/services/delivery/README.md +++ b/services/delivery/README.md @@ -5,7 +5,7 @@ | **Port:** 50008 | | **Developer:** @floriaaan | | **Status:** In progress | -| **Last update:** 2023-03-31 | +| **Last update:** 2023-04-04 | | **Language:** NodeJS | | **Dependencies:** TypeScript, Prisma, gRPC, Postgres | | **Models:** (see [`prisma/schema.prisma`](./prisma/schema.prisma)) | diff --git a/services/delivery/package.json b/services/delivery/package.json index 3eb5a908..43cb5383 100644 --- a/services/delivery/package.json +++ b/services/delivery/package.json @@ -1,9 +1,16 @@ { - "name": "typescript-grpc", + "name": "@goodfood/delivery", + "bin": "dist/index.js", "scripts": { - "start": "ts-node ./src/server.ts", + "start": "node dist/index.js", "dev": "nodemon --watch 'src/**/*.ts' --exec 'ts-node' src/server.ts", + "build": "esbuild src/server.ts --bundle --platform=node --target=node18 --outfile=dist/index.js", + "test": "vitest", + "coverage": "vitest --coverage", + "pkg": "pkg .", + "prisma:generate": "prisma generate", "seed": "ts-node prisma/seed.ts", + "postinstall": "npm run prisma:generate", "client:delivery-create": "ts-node ./src/client/delivery/create.ts", "client:delivery-get": "ts-node ./src/client/delivery/get.ts", "client:delivery-update": "ts-node ./src/client/delivery/update.ts", @@ -20,13 +27,31 @@ }, "devDependencies": { "@types/node": "18.15.9", + "@vitest/coverage-c8": "^0.29.8", + "esbuild": "^0.17.14", "nodemon": "^2.0.22", + "pkg": "^5.8.1", "prisma": "4.11.0", "ts-node": "10.9.1", "tsconfig-paths": "^4.1.2", - "typescript": "5.0.2" + "typescript": "5.0.2", + "vite-tsconfig-paths": "^4.0.7", + "vitest": "^0.29.8" }, "prisma": { "seed": "ts-node prisma/seed.ts" + }, + "pkg": { + "scripts": "./src/dist/index.js", + "assets": [ + "./prisma/**/*", + "../proto/**/*" + ], + "targets": [ + "node18-macos-arm64", + "node18-linux-x64", + "node18-linux-arm64" + ], + "outputPath": "bin/" } } diff --git a/services/delivery/pnpm-lock.yaml b/services/delivery/pnpm-lock.yaml index 38da5b6e..87cb70fa 100644 --- a/services/delivery/pnpm-lock.yaml +++ b/services/delivery/pnpm-lock.yaml @@ -1,43 +1,305 @@ -lockfileVersion: 5.4 - -specifiers: - '@grpc/grpc-js': ^1.8.13 - '@grpc/proto-loader': 0.7.6 - '@prisma/client': 4.11.0 - '@types/node': 18.15.9 - dotenv: ^16.0.3 - nodemon: ^2.0.22 - prisma: 4.11.0 - protobufjs: 7.2.2 - ts-node: 10.9.1 - tsconfig-paths: ^4.1.2 - typescript: 5.0.2 +lockfileVersion: '6.0' dependencies: - '@grpc/grpc-js': 1.8.13 - '@grpc/proto-loader': 0.7.6 - '@prisma/client': 4.11.0_prisma@4.11.0 - dotenv: 16.0.3 - protobufjs: 7.2.2 + '@grpc/grpc-js': + specifier: ^1.8.13 + version: 1.8.13 + '@grpc/proto-loader': + specifier: 0.7.6 + version: 0.7.6 + '@prisma/client': + specifier: 4.11.0 + version: 4.11.0(prisma@4.11.0) + dotenv: + specifier: ^16.0.3 + version: 16.0.3 + protobufjs: + specifier: 7.2.2 + version: 7.2.2 devDependencies: - '@types/node': 18.15.9 - nodemon: 2.0.22 - prisma: 4.11.0 - ts-node: 10.9.1_3flabivgbrnlfzsgzfhinuvrvy - tsconfig-paths: 4.1.2 - typescript: 5.0.2 + '@types/node': + specifier: 18.15.9 + version: 18.15.9 + '@vitest/coverage-c8': + specifier: ^0.29.8 + version: 0.29.8(vitest@0.29.8) + esbuild: + specifier: ^0.17.14 + version: 0.17.14 + nodemon: + specifier: ^2.0.22 + version: 2.0.22 + pkg: + specifier: ^5.8.1 + version: 5.8.1 + prisma: + specifier: 4.11.0 + version: 4.11.0 + ts-node: + specifier: 10.9.1 + version: 10.9.1(@types/node@18.15.9)(typescript@5.0.2) + tsconfig-paths: + specifier: ^4.1.2 + version: 4.1.2 + typescript: + specifier: 5.0.2 + version: 5.0.2 + vite-tsconfig-paths: + specifier: ^4.0.7 + version: 4.0.7(typescript@5.0.2) + vitest: + specifier: ^0.29.8 + version: 0.29.8 packages: - /@cspotcode/source-map-support/0.8.1: + /@babel/generator@7.18.2: + resolution: {integrity: sha512-W1lG5vUwFvfMd8HVXqdfbuG7RuaSrTCCD8cl8fP8wOivdbtbIg2Db3IWUcgvfxKbbn6ZBGYRW/Zk1MIwK49mgw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.19.0 + '@jridgewell/gen-mapping': 0.3.2 + jsesc: 2.5.2 + dev: true + + /@babel/helper-string-parser@7.19.4: + resolution: {integrity: sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helper-validator-identifier@7.19.1: + resolution: {integrity: sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/parser@7.18.4: + resolution: {integrity: sha512-FDge0dFazETFcxGw/EXzOkN8uJp0PC7Qbm+Pe9T+av2zlBpOgunFHkQPPn+eRuClU73JF+98D531UgayY89tow==} + engines: {node: '>=6.0.0'} + hasBin: true + dependencies: + '@babel/types': 7.19.0 + dev: true + + /@babel/types@7.19.0: + resolution: {integrity: sha512-YuGopBq3ke25BVSiS6fgF49Ul9gH1x70Bcr6bqRLjWCkcX8Hre1/5+z+IiWOIerRMSSEfGZVB9z9kyq7wVs9YA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-string-parser': 7.19.4 + '@babel/helper-validator-identifier': 7.19.1 + 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 - /@grpc/grpc-js/1.8.13: + /@esbuild/android-arm64@0.17.14: + resolution: {integrity: sha512-eLOpPO1RvtsP71afiFTvS7tVFShJBCT0txiv/xjFBo5a7R7Gjw7X0IgIaFoLKhqXYAXhahoXm7qAmRXhY4guJg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-arm@0.17.14: + resolution: {integrity: sha512-0CnlwnjDU8cks0yJLXfkaU/uoLyRf9VZJs4p1PskBr2AlAHeEsFEwJEo0of/Z3g+ilw5mpyDwThlxzNEIxOE4g==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-x64@0.17.14: + resolution: {integrity: sha512-nrfQYWBfLGfSGLvRVlt6xi63B5IbfHm3tZCdu/82zuFPQ7zez4XjmRtF/wIRYbJQ/DsZrxJdEvYFE67avYXyng==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-arm64@0.17.14: + resolution: {integrity: sha512-eoSjEuDsU1ROwgBH/c+fZzuSyJUVXQTOIN9xuLs9dE/9HbV/A5IqdXHU1p2OfIMwBwOYJ9SFVGGldxeRCUJFyw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-x64@0.17.14: + resolution: {integrity: sha512-zN0U8RWfrDttdFNkHqFYZtOH8hdi22z0pFm0aIJPsNC4QQZv7je8DWCX5iA4Zx6tRhS0CCc0XC2m7wKsbWEo5g==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-arm64@0.17.14: + resolution: {integrity: sha512-z0VcD4ibeZWVQCW1O7szaLxGsx54gcCnajEJMdYoYjLiq4g1jrP2lMq6pk71dbS5+7op/L2Aod+erw+EUr28/A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-x64@0.17.14: + resolution: {integrity: sha512-hd9mPcxfTgJlolrPlcXkQk9BMwNBvNBsVaUe5eNUqXut6weDQH8whcNaKNF2RO8NbpT6GY8rHOK2A9y++s+ehw==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm64@0.17.14: + resolution: {integrity: sha512-FhAMNYOq3Iblcj9i+K0l1Fp/MHt+zBeRu/Qkf0LtrcFu3T45jcwB6A1iMsemQ42vR3GBhjNZJZTaCe3VFPbn9g==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm@0.17.14: + resolution: {integrity: sha512-BNTl+wSJ1omsH8s3TkQmIIIQHwvwJrU9u1ggb9XU2KTVM4TmthRIVyxSp2qxROJHhZuW/r8fht46/QE8hU8Qvg==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ia32@0.17.14: + resolution: {integrity: sha512-91OK/lQ5y2v7AsmnFT+0EyxdPTNhov3y2CWMdizyMfxSxRqHazXdzgBKtlmkU2KYIc+9ZK3Vwp2KyXogEATYxQ==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-loong64@0.17.14: + resolution: {integrity: sha512-vp15H+5NR6hubNgMluqqKza85HcGJgq7t6rMH7O3Y6ApiOWPkvW2AJfNojUQimfTp6OUrACUXfR4hmpcENXoMQ==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-mips64el@0.17.14: + resolution: {integrity: sha512-90TOdFV7N+fgi6c2+GO9ochEkmm9kBAKnuD5e08GQMgMINOdOFHuYLPQ91RYVrnWwQ5683sJKuLi9l4SsbJ7Hg==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ppc64@0.17.14: + resolution: {integrity: sha512-NnBGeoqKkTugpBOBZZoktQQ1Yqb7aHKmHxsw43NddPB2YWLAlpb7THZIzsRsTr0Xw3nqiPxbA1H31ZMOG+VVPQ==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-riscv64@0.17.14: + resolution: {integrity: sha512-0qdlKScLXA8MGVy21JUKvMzCYWovctuP8KKqhtE5A6IVPq4onxXhSuhwDd2g5sRCzNDlDjitc5sX31BzDoL5Fw==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-s390x@0.17.14: + resolution: {integrity: sha512-Hdm2Jo1yaaOro4v3+6/zJk6ygCqIZuSDJHdHaf8nVH/tfOuoEX5Riv03Ka15LmQBYJObUTNS1UdyoMk0WUn9Ww==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-x64@0.17.14: + resolution: {integrity: sha512-8KHF17OstlK4DuzeF/KmSgzrTWQrkWj5boluiiq7kvJCiQVzUrmSkaBvcLB2UgHpKENO2i6BthPkmUhNDaJsVw==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/netbsd-x64@0.17.14: + resolution: {integrity: sha512-nVwpqvb3yyXztxIT2+VsxJhB5GCgzPdk1n0HHSnchRAcxqKO6ghXwHhJnr0j/B+5FSyEqSxF4q03rbA2fKXtUQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/openbsd-x64@0.17.14: + resolution: {integrity: sha512-1RZ7uQQ9zcy/GSAJL1xPdN7NDdOOtNEGiJalg/MOzeakZeTrgH/DoCkbq7TaPDiPhWqnDF+4bnydxRqQD7il6g==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/sunos-x64@0.17.14: + resolution: {integrity: sha512-nqMjDsFwv7vp7msrwWRysnM38Sd44PKmW8EzV01YzDBTcTWUpczQg6mGao9VLicXSgW/iookNK6AxeogNVNDZA==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-arm64@0.17.14: + resolution: {integrity: sha512-xrD0mccTKRBBIotrITV7WVQAwNJ5+1va6L0H9zN92v2yEdjfAN7864cUaZwJS7JPEs53bDTzKFbfqVlG2HhyKQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-ia32@0.17.14: + resolution: {integrity: sha512-nXpkz9bbJrLLyUTYtRotSS3t5b+FOuljg8LgLdINWFs3FfqZMtbnBCZFUmBzQPyxqU87F8Av+3Nco/M3hEcu1w==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-x64@0.17.14: + resolution: {integrity: sha512-gPQmsi2DKTaEgG14hc3CHXHp62k8g6qr0Pas+I4lUxRMugGSATh/Bi8Dgusoz9IQ0IfdrvLpco6kujEIBoaogA==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@grpc/grpc-js@1.8.13: resolution: {integrity: sha512-iY3jsdfbc0ARoCLFvbvUB8optgyb0r1XLPb142u+QtgBcKJYkCIFt3Fd/881KqjLYWjsBJF57N3b8Eop9NDfUA==} engines: {node: ^8.13.0 || >=10.10.0} dependencies: @@ -45,7 +307,7 @@ packages: '@types/node': 18.15.9 dev: false - /@grpc/proto-loader/0.7.6: + /@grpc/proto-loader@0.7.6: resolution: {integrity: sha512-QyAXR8Hyh7uMDmveWxDSUcJr9NAWaZ2I6IXgAYvQmfflwouTM+rArE2eEaCtLlRqO81j7pRLCt81IefUei6Zbw==} engines: {node: '>=6'} hasBin: true @@ -57,23 +319,70 @@ packages: yargs: 16.2.0 dev: false - /@jridgewell/resolve-uri/3.1.0: + /@istanbuljs/schema@0.1.3: + resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} + engines: {node: '>=8'} + dev: true + + /@jridgewell/gen-mapping@0.3.2: + resolution: {integrity: sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/set-array': 1.1.2 + '@jridgewell/sourcemap-codec': 1.4.14 + '@jridgewell/trace-mapping': 0.3.9 + dev: true + + /@jridgewell/resolve-uri@3.1.0: resolution: {integrity: sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==} engines: {node: '>=6.0.0'} dev: true - /@jridgewell/sourcemap-codec/1.4.14: + /@jridgewell/set-array@1.1.2: + resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} + engines: {node: '>=6.0.0'} + dev: true + + /@jridgewell/sourcemap-codec@1.4.14: resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==} dev: true - /@jridgewell/trace-mapping/0.3.9: + /@jridgewell/trace-mapping@0.3.17: + resolution: {integrity: sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==} + dependencies: + '@jridgewell/resolve-uri': 3.1.0 + '@jridgewell/sourcemap-codec': 1.4.14 + dev: true + + /@jridgewell/trace-mapping@0.3.9: resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} dependencies: '@jridgewell/resolve-uri': 3.1.0 '@jridgewell/sourcemap-codec': 1.4.14 dev: true - /@prisma/client/4.11.0_prisma@4.11.0: + /@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: true + + /@nodelib/fs.stat@2.0.5: + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + dev: true + + /@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: true + + /@prisma/client@4.11.0(prisma@4.11.0): resolution: {integrity: sha512-0INHYkQIqgAjrt7NzhYpeDQi8x3Nvylc2uDngKyFDDj1tTRQ4uV1HnVmd1sQEraeVAN63SOK0dgCKQHlvjL0KA==} engines: {node: '>=14.17'} requiresBuild: true @@ -87,108 +396,186 @@ packages: prisma: 4.11.0 dev: false - /@prisma/engines-version/4.11.0-57.8fde8fef4033376662cad983758335009d522acb: + /@prisma/engines-version@4.11.0-57.8fde8fef4033376662cad983758335009d522acb: resolution: {integrity: sha512-3Vd8Qq06d5xD8Ch5WauWcUUrsVPdMC6Ge8ILji8RFfyhUpqon6qSyGM0apvr1O8n8qH8cKkEFqRPsYjuz5r83g==} dev: false - /@prisma/engines/4.11.0: + /@prisma/engines@4.11.0: resolution: {integrity: sha512-0AEBi2HXGV02cf6ASsBPhfsVIbVSDC9nbQed4iiY5eHttW9ZtMxHThuKZE1pnESbr8HRdgmFSa/Kn4OSNYuibg==} requiresBuild: true - /@protobufjs/aspromise/1.1.2: + /@protobufjs/aspromise@1.1.2: resolution: {integrity: sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==} dev: false - /@protobufjs/base64/1.1.2: + /@protobufjs/base64@1.1.2: resolution: {integrity: sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==} dev: false - /@protobufjs/codegen/2.0.4: + /@protobufjs/codegen@2.0.4: resolution: {integrity: sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==} dev: false - /@protobufjs/eventemitter/1.1.0: + /@protobufjs/eventemitter@1.1.0: resolution: {integrity: sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==} dev: false - /@protobufjs/fetch/1.1.0: + /@protobufjs/fetch@1.1.0: resolution: {integrity: sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==} dependencies: '@protobufjs/aspromise': 1.1.2 '@protobufjs/inquire': 1.1.0 dev: false - /@protobufjs/float/1.0.2: + /@protobufjs/float@1.0.2: resolution: {integrity: sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==} dev: false - /@protobufjs/inquire/1.1.0: + /@protobufjs/inquire@1.1.0: resolution: {integrity: sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==} dev: false - /@protobufjs/path/1.1.2: + /@protobufjs/path@1.1.2: resolution: {integrity: sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==} dev: false - /@protobufjs/pool/1.1.0: + /@protobufjs/pool@1.1.0: resolution: {integrity: sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==} dev: false - /@protobufjs/utf8/1.1.0: + /@protobufjs/utf8@1.1.0: resolution: {integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==} dev: false - /@tsconfig/node10/1.0.9: + /@tsconfig/node10@1.0.9: resolution: {integrity: sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==} dev: true - /@tsconfig/node12/1.0.11: + /@tsconfig/node12@1.0.11: resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} dev: true - /@tsconfig/node14/1.0.3: + /@tsconfig/node14@1.0.3: resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} dev: true - /@tsconfig/node16/1.0.3: + /@tsconfig/node16@1.0.3: resolution: {integrity: sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==} dev: true - /@types/long/4.0.2: + /@types/chai-subset@1.3.3: + resolution: {integrity: sha512-frBecisrNGz+F4T6bcc+NLeolfiojh5FxW2klu669+8BARtyQv2C/GkNW6FUodVe4BroGMP/wER/YDGc7rEllw==} + dependencies: + '@types/chai': 4.3.4 + dev: true + + /@types/chai@4.3.4: + resolution: {integrity: sha512-KnRanxnpfpjUTqTCXslZSEdLfXExwgNxYPdiO2WGUj8+HDjFi8R3k5RVKPeSCzLjCcshCAtVO2QBbVuAV4kTnw==} + dev: true + + /@types/istanbul-lib-coverage@2.0.4: + resolution: {integrity: sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==} + dev: true + + /@types/long@4.0.2: resolution: {integrity: sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==} dev: false - /@types/node/18.15.9: + /@types/node@18.15.9: resolution: {integrity: sha512-dUxhiNzBLr6IqlZXz6e/rN2YQXlFgOei/Dxy+e3cyXTJ4txSUbGT2/fmnD6zd/75jDMeW5bDee+YXxlFKHoV0A==} - /abbrev/1.1.1: + /@vitest/coverage-c8@0.29.8(vitest@0.29.8): + resolution: {integrity: sha512-y+sEMQMctWokjnSqm3FCQEYFkjLrYaznsxEZHxcx8z2aftpYg3A5tvI1S5himfdEFo7o+OeHzh40bPSWZHW4oQ==} + peerDependencies: + vitest: '>=0.29.0 <1' + dependencies: + c8: 7.13.0 + picocolors: 1.0.0 + std-env: 3.3.2 + vitest: 0.29.8 + dev: true + + /@vitest/expect@0.29.8: + resolution: {integrity: sha512-xlcVXn5I5oTq6NiZSY3ykyWixBxr5mG8HYtjvpgg6KaqHm0mvhX18xuwl5YGxIRNt/A5jidd7CWcNHrSvgaQqQ==} + dependencies: + '@vitest/spy': 0.29.8 + '@vitest/utils': 0.29.8 + chai: 4.3.7 + dev: true + + /@vitest/runner@0.29.8: + resolution: {integrity: sha512-FzdhnRDwEr/A3Oo1jtIk/B952BBvP32n1ObMEb23oEJNO+qO5cBet6M2XWIDQmA7BDKGKvmhUf2naXyp/2JEwQ==} + dependencies: + '@vitest/utils': 0.29.8 + p-limit: 4.0.0 + pathe: 1.1.0 + dev: true + + /@vitest/spy@0.29.8: + resolution: {integrity: sha512-VdjBe9w34vOMl5I5mYEzNX8inTxrZ+tYUVk9jxaZJmHFwmDFC/GV3KBFTA/JKswr3XHvZL+FE/yq5EVhb6pSAw==} + dependencies: + tinyspy: 1.1.1 + dev: true + + /@vitest/utils@0.29.8: + resolution: {integrity: sha512-qGzuf3vrTbnoY+RjjVVIBYfuWMjn3UMUqyQtdGNZ6ZIIyte7B37exj6LaVkrZiUTvzSadVvO/tJm8AEgbGCBPg==} + dependencies: + cli-truncate: 3.1.0 + diff: 5.1.0 + loupe: 2.3.6 + pretty-format: 27.5.1 + dev: true + + /abbrev@1.1.1: resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} dev: true - /acorn-walk/8.2.0: + /acorn-walk@8.2.0: resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} engines: {node: '>=0.4.0'} dev: true - /acorn/8.8.2: + /acorn@8.8.2: resolution: {integrity: sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==} engines: {node: '>=0.4.0'} hasBin: true dev: true - /ansi-regex/5.0.1: + /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 + dev: true + + /ansi-regex@5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} - dev: false - /ansi-styles/4.3.0: + /ansi-regex@6.0.1: + resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} + engines: {node: '>=12'} + dev: true + + /ansi-styles@4.3.0: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} engines: {node: '>=8'} dependencies: color-convert: 2.0.1 - dev: false - /anymatch/3.1.3: + /ansi-styles@5.2.0: + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} + engines: {node: '>=10'} + dev: true + + /ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + dev: true + + /anymatch@3.1.3: resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} engines: {node: '>= 8'} dependencies: @@ -196,34 +583,116 @@ packages: picomatch: 2.3.1 dev: true - /arg/4.1.3: + /arg@4.1.3: resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} dev: true - /balanced-match/1.0.2: + /array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + dev: true + + /assertion-error@1.1.0: + resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} + dev: true + + /at-least-node@1.0.0: + resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} + engines: {node: '>= 4.0.0'} + dev: true + + /balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} dev: true - /binary-extensions/2.2.0: + /base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + dev: true + + /binary-extensions@2.2.0: resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} engines: {node: '>=8'} dev: true - /brace-expansion/1.1.11: + /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: true + + /brace-expansion@1.1.11: resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} dependencies: balanced-match: 1.0.2 concat-map: 0.0.1 dev: true - /braces/3.0.2: + /braces@3.0.2: resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} engines: {node: '>=8'} dependencies: fill-range: 7.0.1 dev: true - /chokidar/3.5.3: + /buffer@5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + dev: true + + /c8@7.13.0: + resolution: {integrity: sha512-/NL4hQTv1gBL6J6ei80zu3IiTrmePDKXKXOTLpHvcIWZTVYQlDhVWjjWvkhICylE8EwwnMVzDZugCvdx0/DIIA==} + engines: {node: '>=10.12.0'} + hasBin: true + dependencies: + '@bcoe/v8-coverage': 0.2.3 + '@istanbuljs/schema': 0.1.3 + find-up: 5.0.0 + foreground-child: 2.0.0 + istanbul-lib-coverage: 3.2.0 + istanbul-lib-report: 3.0.0 + istanbul-reports: 3.1.5 + rimraf: 3.0.2 + test-exclude: 6.0.0 + v8-to-istanbul: 9.1.0 + yargs: 16.2.0 + yargs-parser: 20.2.9 + dev: true + + /cac@6.7.14: + resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} + engines: {node: '>=8'} + dev: true + + /chai@4.3.7: + resolution: {integrity: sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==} + engines: {node: '>=4'} + dependencies: + assertion-error: 1.1.0 + check-error: 1.0.2 + deep-eql: 4.1.3 + get-func-name: 2.0.0 + loupe: 2.3.6 + pathval: 1.1.1 + type-detect: 4.0.8 + dev: true + + /chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + dev: true + + /check-error@1.0.2: + resolution: {integrity: sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==} + dev: true + + /chokidar@3.5.3: resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} engines: {node: '>= 8.10.0'} dependencies: @@ -238,34 +707,60 @@ packages: fsevents: 2.3.2 dev: true - /cliui/7.0.4: + /chownr@1.1.4: + resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} + dev: true + + /cli-truncate@3.1.0: + resolution: {integrity: sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + slice-ansi: 5.0.0 + string-width: 5.1.2 + dev: true + + /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 - /color-convert/2.0.1: + /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: + /color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - dev: false - /concat-map/0.0.1: + /concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} dev: true - /create-require/1.1.1: + /convert-source-map@1.9.0: + resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} + dev: true + + /core-util-is@1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + dev: true + + /create-require@1.1.1: resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} dev: true - /debug/3.2.7_supports-color@5.5.0: + /cross-spawn@7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + dev: true + + /debug@3.2.7(supports-color@5.5.0): resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} peerDependencies: supports-color: '*' @@ -277,33 +772,186 @@ packages: supports-color: 5.5.0 dev: true - /diff/4.0.2: - resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} - engines: {node: '>=0.3.1'} + /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 dev: true - /dotenv/16.0.3: - resolution: {integrity: sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==} - engines: {node: '>=12'} - dev: false + /decompress-response@6.0.0: + resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} + engines: {node: '>=10'} + dependencies: + mimic-response: 3.1.0 + dev: true - /emoji-regex/8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + /deep-eql@4.1.3: + resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==} + engines: {node: '>=6'} + dependencies: + type-detect: 4.0.8 + dev: true + + /deep-extend@0.6.0: + resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} + engines: {node: '>=4.0.0'} + dev: true + + /detect-libc@2.0.1: + resolution: {integrity: sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==} + engines: {node: '>=8'} + dev: true + + /diff@4.0.2: + resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} + engines: {node: '>=0.3.1'} + dev: true + + /diff@5.1.0: + resolution: {integrity: sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==} + 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 + dev: true + + /dotenv@16.0.3: + resolution: {integrity: sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==} + engines: {node: '>=12'} dev: false - /escalade/3.1.1: + /eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + dev: true + + /emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + /emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + dev: true + + /end-of-stream@1.4.4: + resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + dependencies: + once: 1.4.0 + dev: true + + /esbuild@0.17.14: + resolution: {integrity: sha512-vOO5XhmVj/1XQR9NQ1UPq6qvMYL7QFJU57J5fKBKBKxp17uDt5PgxFDb4A2nEiXhr1qQs4x0F5+66hVVw4ruNw==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/android-arm': 0.17.14 + '@esbuild/android-arm64': 0.17.14 + '@esbuild/android-x64': 0.17.14 + '@esbuild/darwin-arm64': 0.17.14 + '@esbuild/darwin-x64': 0.17.14 + '@esbuild/freebsd-arm64': 0.17.14 + '@esbuild/freebsd-x64': 0.17.14 + '@esbuild/linux-arm': 0.17.14 + '@esbuild/linux-arm64': 0.17.14 + '@esbuild/linux-ia32': 0.17.14 + '@esbuild/linux-loong64': 0.17.14 + '@esbuild/linux-mips64el': 0.17.14 + '@esbuild/linux-ppc64': 0.17.14 + '@esbuild/linux-riscv64': 0.17.14 + '@esbuild/linux-s390x': 0.17.14 + '@esbuild/linux-x64': 0.17.14 + '@esbuild/netbsd-x64': 0.17.14 + '@esbuild/openbsd-x64': 0.17.14 + '@esbuild/sunos-x64': 0.17.14 + '@esbuild/win32-arm64': 0.17.14 + '@esbuild/win32-ia32': 0.17.14 + '@esbuild/win32-x64': 0.17.14 + dev: true + + /escalade@3.1.1: resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} engines: {node: '>=6'} - dev: false - /fill-range/7.0.1: + /expand-template@2.0.3: + resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} + engines: {node: '>=6'} + dev: true + + /fast-glob@3.2.12: + resolution: {integrity: sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==} + 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: true + + /fastq@1.15.0: + resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} + dependencies: + reusify: 1.0.4 + dev: true + + /fill-range@7.0.1: resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} engines: {node: '>=8'} dependencies: to-regex-range: 5.0.1 dev: true - /fsevents/2.3.2: + /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 + + /foreground-child@2.0.0: + resolution: {integrity: sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==} + engines: {node: '>=8.0.0'} + dependencies: + cross-spawn: 7.0.3 + signal-exit: 3.0.7 + dev: true + + /from2@2.3.0: + resolution: {integrity: sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==} + dependencies: + inherits: 2.0.4 + readable-stream: 2.3.8 + dev: true + + /fs-constants@1.0.0: + resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} + dev: true + + /fs-extra@9.1.0: + resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==} + engines: {node: '>=10'} + dependencies: + at-least-node: 1.0.0 + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.0 + dev: true + + /fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + dev: true + + /fsevents@2.3.2: resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} os: [darwin] @@ -311,99 +959,360 @@ packages: dev: true optional: true - /get-caller-file/2.0.5: + /function-bind@1.1.1: + resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} + dev: true + + /get-caller-file@2.0.5: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} - dev: false - /glob-parent/5.1.2: + /get-func-name@2.0.0: + resolution: {integrity: sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==} + dev: true + + /github-from-package@0.0.0: + resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==} + dev: true + + /glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} dependencies: is-glob: 4.0.3 dev: true - /has-flag/3.0.0: + /glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + dev: true + + /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.2.12 + ignore: 5.2.4 + merge2: 1.4.1 + slash: 3.0.0 + dev: true + + /globrex@0.1.2: + resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} + dev: true + + /graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + dev: true + + /has-flag@3.0.0: resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} engines: {node: '>=4'} dev: true - /ignore-by-default/1.0.1: + /has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + dev: true + + /has@1.0.3: + resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} + engines: {node: '>= 0.4.0'} + dependencies: + function-bind: 1.1.1 + dev: true + + /html-escaper@2.0.2: + resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} + dev: true + + /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 + dev: true + + /ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + dev: true + + /ignore-by-default@1.0.1: resolution: {integrity: sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==} dev: true - /is-binary-path/2.1.0: + /ignore@5.2.4: + resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} + engines: {node: '>= 4'} + dev: true + + /inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + dev: true + + /inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + dev: true + + /ini@1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + dev: true + + /into-stream@6.0.0: + resolution: {integrity: sha512-XHbaOAvP+uFKUFsOgoNPRjLkwB+I22JFPFe5OjTkQ0nwgj6+pSjb4NmB6VMxaPshLiOf+zcpOCBQuLwC1KHhZA==} + engines: {node: '>=10'} + dependencies: + from2: 2.3.0 + p-is-promise: 3.0.0 + dev: true + + /is-binary-path@2.1.0: resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} engines: {node: '>=8'} dependencies: binary-extensions: 2.2.0 dev: true - /is-extglob/2.1.1: + /is-core-module@2.9.0: + resolution: {integrity: sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==} + dependencies: + has: 1.0.3 + dev: true + + /is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} dev: true - /is-fullwidth-code-point/3.0.0: + /is-fullwidth-code-point@3.0.0: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} engines: {node: '>=8'} - dev: false - /is-glob/4.0.3: + /is-fullwidth-code-point@4.0.0: + resolution: {integrity: sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==} + engines: {node: '>=12'} + dev: true + + /is-glob@4.0.3: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} dependencies: is-extglob: 2.1.1 dev: true - /is-number/7.0.0: + /is-number@7.0.0: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} dev: true - /json5/2.2.3: + /isarray@1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + dev: true + + /isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + dev: true + + /istanbul-lib-coverage@3.2.0: + resolution: {integrity: sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==} + engines: {node: '>=8'} + dev: true + + /istanbul-lib-report@3.0.0: + resolution: {integrity: sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==} + engines: {node: '>=8'} + dependencies: + istanbul-lib-coverage: 3.2.0 + make-dir: 3.1.0 + supports-color: 7.2.0 + dev: true + + /istanbul-reports@3.1.5: + resolution: {integrity: sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==} + engines: {node: '>=8'} + dependencies: + html-escaper: 2.0.2 + istanbul-lib-report: 3.0.0 + dev: true + + /jsesc@2.5.2: + resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} + engines: {node: '>=4'} + hasBin: true + dev: true + + /json5@2.2.3: resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} engines: {node: '>=6'} hasBin: true dev: true - /lodash.camelcase/4.3.0: + /jsonc-parser@3.2.0: + resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} + dev: true + + /jsonfile@6.1.0: + resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + dependencies: + universalify: 2.0.0 + optionalDependencies: + graceful-fs: 4.2.11 + dev: true + + /local-pkg@0.4.3: + resolution: {integrity: sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==} + engines: {node: '>=14'} + dev: true + + /locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + dependencies: + p-locate: 5.0.0 + dev: true + + /lodash.camelcase@4.3.0: resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} dev: false - /long/4.0.0: + /long@4.0.0: resolution: {integrity: sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==} dev: false - /long/5.2.1: + /long@5.2.1: resolution: {integrity: sha512-GKSNGeNAtw8IryjjkhZxuKB3JzlcLTwjtiQCHKvqQet81I93kXslhDQruGI/QsddO83mcDToBVy7GqGS/zYf/A==} dev: false - /make-error/1.3.6: + /loupe@2.3.6: + resolution: {integrity: sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==} + dependencies: + get-func-name: 2.0.0 + dev: true + + /lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + dependencies: + yallist: 4.0.0 + dev: true + + /make-dir@3.1.0: + resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} + engines: {node: '>=8'} + dependencies: + semver: 6.3.0 + dev: true + + /make-error@1.3.6: resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} dev: true - /minimatch/3.1.2: + /merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + dev: true + + /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: true + + /mimic-response@3.1.0: + resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} + engines: {node: '>=10'} + dev: true + + /minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} dependencies: brace-expansion: 1.1.11 dev: true - /minimist/1.2.8: + /minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} dev: true - /ms/2.1.3: + /mkdirp-classic@0.5.3: + resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} + dev: true + + /mlly@1.2.0: + resolution: {integrity: sha512-+c7A3CV0KGdKcylsI6khWyts/CYrGTrRVo4R/I7u/cUsy0Conxa6LUhiEzVKIw14lc2L5aiO4+SeVe4TeGRKww==} + dependencies: + acorn: 8.8.2 + pathe: 1.1.0 + pkg-types: 1.0.2 + ufo: 1.1.1 + dev: true + + /ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + dev: true + + /ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} dev: true - /nodemon/2.0.22: + /multistream@4.1.0: + resolution: {integrity: sha512-J1XDiAmmNpRCBfIWJv+n0ymC4ABcf/Pl+5YvC5B/D2f/2+8PtHvCNxMPKiQcZyi922Hq69J2YOpb1pTywfifyw==} + dependencies: + once: 1.4.0 + readable-stream: 3.6.2 + dev: true + + /nanoid@3.3.6: + resolution: {integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + dev: true + + /napi-build-utils@1.0.2: + resolution: {integrity: sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==} + dev: true + + /node-abi@3.33.0: + resolution: {integrity: sha512-7GGVawqyHF4pfd0YFybhv/eM9JwTtPqx0mAanQ146O3FlSh3pA24zf9IRQTOsfTSqXTNzPSP5iagAJ94jjuVog==} + engines: {node: '>=10'} + dependencies: + semver: 7.3.8 + dev: true + + /node-fetch@2.6.9: + resolution: {integrity: sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + dependencies: + whatwg-url: 5.0.0 + dev: true + + /nodemon@2.0.22: resolution: {integrity: sha512-B8YqaKMmyuCO7BowF1Z1/mkPqLk6cs/l63Ojtd6otKjMx47Dq1utxfRxcavH1I7VSaL8n5BUaoutadnsX3AAVQ==} engines: {node: '>=8.10.0'} hasBin: true dependencies: chokidar: 3.5.3 - debug: 3.2.7_supports-color@5.5.0 + debug: 3.2.7(supports-color@5.5.0) ignore-by-default: 1.0.1 minimatch: 3.1.2 pstree.remy: 1.1.8 @@ -414,24 +1323,182 @@ packages: undefsafe: 2.0.5 dev: true - /nopt/1.0.10: + /nopt@1.0.10: resolution: {integrity: sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==} hasBin: true dependencies: abbrev: 1.1.1 dev: true - /normalize-path/3.0.0: + /normalize-path@3.0.0: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} dev: true - /picomatch/2.3.1: + /once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + dependencies: + wrappy: 1.0.2 + dev: true + + /p-is-promise@3.0.0: + resolution: {integrity: sha512-Wo8VsW4IRQSKVXsJCn7TomUaVtyfjVDn3nUP7kE967BQk0CwFpdbZs0X0uk5sW9mkBa9eNM7hCMaG93WUAwxYQ==} + engines: {node: '>=8'} + dev: true + + /p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + dependencies: + yocto-queue: 0.1.0 + dev: true + + /p-limit@4.0.0: + resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + yocto-queue: 1.0.0 + dev: true + + /p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + dependencies: + p-limit: 3.1.0 + dev: true + + /path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + dev: true + + /path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + dev: true + + /path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + dev: true + + /path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + dev: true + + /path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + dev: true + + /pathe@1.1.0: + resolution: {integrity: sha512-ODbEPR0KKHqECXW1GoxdDb+AZvULmXjVPy4rt+pGo2+TnjJTIPJQSVS6N63n8T2Ip+syHhbn52OewKicV0373w==} + dev: true + + /pathval@1.1.1: + resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} + dev: true + + /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'} dev: true - /prisma/4.11.0: + /pkg-fetch@3.4.2: + resolution: {integrity: sha512-0+uijmzYcnhC0hStDjm/cl2VYdrmVVBpe7Q8k9YBojxmR5tG8mvR9/nooQq3QSXiQqORDVOTY3XqMEqJVIzkHA==} + hasBin: true + dependencies: + chalk: 4.1.2 + fs-extra: 9.1.0 + https-proxy-agent: 5.0.1 + node-fetch: 2.6.9 + progress: 2.0.3 + semver: 7.3.8 + tar-fs: 2.1.1 + yargs: 16.2.0 + transitivePeerDependencies: + - encoding + - supports-color + dev: true + + /pkg-types@1.0.2: + resolution: {integrity: sha512-hM58GKXOcj8WTqUXnsQyJYXdeAPbythQgEF3nTcEo+nkD49chjQ9IKm/QJy9xf6JakXptz86h7ecP2024rrLaQ==} + dependencies: + jsonc-parser: 3.2.0 + mlly: 1.2.0 + pathe: 1.1.0 + dev: true + + /pkg@5.8.1: + resolution: {integrity: sha512-CjBWtFStCfIiT4Bde9QpJy0KeH19jCfwZRJqHFDFXfhUklCx8JoFmMj3wgnEYIwGmZVNkhsStPHEOnrtrQhEXA==} + hasBin: true + peerDependencies: + node-notifier: '>=9.0.1' + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@babel/generator': 7.18.2 + '@babel/parser': 7.18.4 + '@babel/types': 7.19.0 + chalk: 4.1.2 + fs-extra: 9.1.0 + globby: 11.1.0 + into-stream: 6.0.0 + is-core-module: 2.9.0 + minimist: 1.2.8 + multistream: 4.1.0 + pkg-fetch: 3.4.2 + prebuild-install: 7.1.1 + resolve: 1.22.1 + stream-meter: 1.0.4 + transitivePeerDependencies: + - encoding + - supports-color + dev: true + + /postcss@8.4.21: + resolution: {integrity: sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==} + engines: {node: ^10 || ^12 || >=14} + dependencies: + nanoid: 3.3.6 + picocolors: 1.0.0 + source-map-js: 1.0.2 + dev: true + + /prebuild-install@7.1.1: + resolution: {integrity: sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==} + engines: {node: '>=10'} + hasBin: true + dependencies: + detect-libc: 2.0.1 + expand-template: 2.0.3 + github-from-package: 0.0.0 + minimist: 1.2.8 + mkdirp-classic: 0.5.3 + napi-build-utils: 1.0.2 + node-abi: 3.33.0 + pump: 3.0.0 + rc: 1.2.8 + simple-get: 4.0.1 + tar-fs: 2.1.1 + tunnel-agent: 0.6.0 + dev: true + + /pretty-format@27.5.1: + resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + ansi-regex: 5.0.1 + ansi-styles: 5.2.0 + react-is: 17.0.2 + dev: true + + /prisma@4.11.0: resolution: {integrity: sha512-4zZmBXssPUEiX+GeL0MUq/Yyie4ltiKmGu7jCJFnYMamNrrulTBc+D+QwAQSJ01tyzeGHlD13kOnqPwRipnlNw==} engines: {node: '>=14.17'} hasBin: true @@ -439,7 +1506,16 @@ packages: dependencies: '@prisma/engines': 4.11.0 - /protobufjs/7.2.2: + /process-nextick-args@2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + dev: true + + /progress@2.0.3: + resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} + engines: {node: '>=0.4.0'} + dev: true + + /protobufjs@7.2.2: resolution: {integrity: sha512-++PrQIjrom+bFDPpfmqXfAGSQs40116JRrqqyf53dymUMvvb5d/LMRyicRoF1AUKoXVS1/IgJXlEgcpr4gTF3Q==} engines: {node: '>=12.0.0'} requiresBuild: true @@ -458,82 +1534,353 @@ packages: long: 5.2.1 dev: false - /pstree.remy/1.1.8: + /pstree.remy@1.1.8: resolution: {integrity: sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==} dev: true - /readdirp/3.6.0: + /pump@3.0.0: + resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} + dependencies: + end-of-stream: 1.4.4 + once: 1.4.0 + dev: true + + /queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + dev: true + + /rc@1.2.8: + resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} + hasBin: true + dependencies: + deep-extend: 0.6.0 + ini: 1.3.8 + minimist: 1.2.8 + strip-json-comments: 2.0.1 + dev: true + + /react-is@17.0.2: + resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} + 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: true + + /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: true + + /readdirp@3.6.0: resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} engines: {node: '>=8.10.0'} dependencies: picomatch: 2.3.1 dev: true - /require-directory/2.1.1: + /require-directory@2.1.1: resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} engines: {node: '>=0.10.0'} - dev: false - /semver/5.7.1: + /resolve@1.22.1: + resolution: {integrity: sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==} + hasBin: true + dependencies: + is-core-module: 2.9.0 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + dev: true + + /reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + dev: true + + /rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + hasBin: true + dependencies: + glob: 7.2.3 + dev: true + + /rollup@3.20.2: + resolution: {integrity: sha512-3zwkBQl7Ai7MFYQE0y1MeQ15+9jsi7XxfrqwTb/9EK8D9C9+//EBR4M+CuA1KODRaNbFez/lWxA5vhEGZp4MUg==} + engines: {node: '>=14.18.0', npm: '>=8.0.0'} + hasBin: true + optionalDependencies: + fsevents: 2.3.2 + dev: true + + /run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + dependencies: + queue-microtask: 1.2.3 + dev: true + + /safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + dev: true + + /safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + dev: true + + /semver@5.7.1: resolution: {integrity: sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==} hasBin: true dev: true - /semver/7.0.0: + /semver@6.3.0: + resolution: {integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==} + hasBin: true + dev: true + + /semver@7.0.0: resolution: {integrity: sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==} hasBin: true dev: true - /simple-update-notifier/1.1.0: + /semver@7.3.8: + resolution: {integrity: sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==} + engines: {node: '>=10'} + hasBin: true + dependencies: + lru-cache: 6.0.0 + dev: true + + /shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + dependencies: + shebang-regex: 3.0.0 + dev: true + + /shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + 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==} + dev: true + + /simple-concat@1.0.1: + resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} + dev: true + + /simple-get@4.0.1: + resolution: {integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==} + dependencies: + decompress-response: 6.0.0 + once: 1.4.0 + simple-concat: 1.0.1 + dev: true + + /simple-update-notifier@1.1.0: resolution: {integrity: sha512-VpsrsJSUcJEseSbMHkrsrAVSdvVS5I96Qo1QAQ4FxQ9wXFcB+pjj7FB7/us9+GcgfW4ziHtYMc1J0PLczb55mg==} engines: {node: '>=8.10.0'} dependencies: semver: 7.0.0 dev: true - /string-width/4.2.3: + /slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + dev: true + + /slice-ansi@5.0.0: + resolution: {integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==} + engines: {node: '>=12'} + dependencies: + ansi-styles: 6.2.1 + is-fullwidth-code-point: 4.0.0 + dev: true + + /source-map-js@1.0.2: + resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} + engines: {node: '>=0.10.0'} + dev: true + + /source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + dev: true + + /stackback@0.0.2: + resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + dev: true + + /std-env@3.3.2: + resolution: {integrity: sha512-uUZI65yrV2Qva5gqE0+A7uVAvO40iPo6jGhs7s8keRfHCmtg+uB2X6EiLGCI9IgL1J17xGhvoOqSz79lzICPTA==} + dev: true + + /stream-meter@1.0.4: + resolution: {integrity: sha512-4sOEtrbgFotXwnEuzzsQBYEV1elAeFSO8rSGeTwabuX1RRn/kEq9JVH7I0MRBhKVRR0sJkr0M0QCH7yOLf9fhQ==} + dependencies: + readable-stream: 2.3.8 + 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 - dev: false - /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.0.1 + dev: true + + /string_decoder@1.1.1: + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + dependencies: + safe-buffer: 5.1.2 + dev: true + + /string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + dependencies: + safe-buffer: 5.2.1 + dev: true + + /strip-ansi@6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} dependencies: ansi-regex: 5.0.1 - dev: false - /strip-bom/3.0.0: + /strip-ansi@7.0.1: + resolution: {integrity: sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==} + engines: {node: '>=12'} + dependencies: + ansi-regex: 6.0.1 + dev: true + + /strip-bom@3.0.0: resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} engines: {node: '>=4'} dev: true - /supports-color/5.5.0: + /strip-json-comments@2.0.1: + resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} + engines: {node: '>=0.10.0'} + dev: true + + /strip-literal@1.0.1: + resolution: {integrity: sha512-QZTsipNpa2Ppr6v1AmJHESqJ3Uz247MUS0OjrnnZjFAvEoWqxuyFuXn2xLgMtRnijJShAa1HL0gtJyUs7u7n3Q==} + dependencies: + acorn: 8.8.2 + dev: true + + /supports-color@5.5.0: resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} engines: {node: '>=4'} dependencies: has-flag: 3.0.0 dev: true - /to-regex-range/5.0.1: + /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-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + dev: true + + /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: true + + /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: true + + /test-exclude@6.0.0: + resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} + engines: {node: '>=8'} + dependencies: + '@istanbuljs/schema': 0.1.3 + glob: 7.2.3 + minimatch: 3.1.2 + dev: true + + /tinybench@2.4.0: + resolution: {integrity: sha512-iyziEiyFxX4kyxSp+MtY1oCH/lvjH3PxFN8PGCDeqcZWAJ/i+9y+nL85w99PxVzrIvew/GSkSbDYtiGVa85Afg==} + dev: true + + /tinypool@0.4.0: + resolution: {integrity: sha512-2ksntHOKf893wSAH4z/+JbPpi92esw8Gn9N2deXX+B0EO92hexAVI9GIZZPx7P5aYo5KULfeOSt3kMOmSOy6uA==} + engines: {node: '>=14.0.0'} + dev: true + + /tinyspy@1.1.1: + resolution: {integrity: sha512-UVq5AXt/gQlti7oxoIg5oi/9r0WpF7DGEVwXgqWSMmyN16+e3tl5lIvTaOpJ3TAtu5xFzWccFRM4R5NaWHF+4g==} + engines: {node: '>=14.0.0'} + 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 dev: true - /touch/3.1.0: + /touch@3.1.0: resolution: {integrity: sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==} hasBin: true dependencies: nopt: 1.0.10 dev: true - /ts-node/10.9.1_3flabivgbrnlfzsgzfhinuvrvy: + /tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + dev: true + + /ts-node@10.9.1(@types/node@18.15.9)(typescript@5.0.2): resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} hasBin: true peerDependencies: @@ -564,7 +1911,20 @@ packages: yn: 3.1.1 dev: true - /tsconfig-paths/4.1.2: + /tsconfck@2.1.1(typescript@5.0.2): + resolution: {integrity: sha512-ZPCkJBKASZBmBUNqGHmRhdhM8pJYDdOXp4nRgj/O0JwUwsMq50lCDRQP/M5GBNAA0elPrq4gAeu4dkaVCuKWww==} + engines: {node: ^14.13.1 || ^16 || >=18} + hasBin: true + peerDependencies: + typescript: ^4.3.5 || ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + dependencies: + typescript: 5.0.2 + dev: true + + /tsconfig-paths@4.1.2: resolution: {integrity: sha512-uhxiMgnXQp1IR622dUXI+9Ehnws7i/y6xvpZB9IbUVOPy0muvdvgXeZOn88UcGPiT98Vp3rJPTa8bFoalZ3Qhw==} engines: {node: '>=6'} dependencies: @@ -573,40 +1933,241 @@ packages: strip-bom: 3.0.0 dev: true - /typescript/5.0.2: + /tunnel-agent@0.6.0: + resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} + dependencies: + safe-buffer: 5.2.1 + dev: true + + /type-detect@4.0.8: + resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} + engines: {node: '>=4'} + dev: true + + /typescript@5.0.2: resolution: {integrity: sha512-wVORMBGO/FAs/++blGNeAVdbNKtIh1rbBL2EyQ1+J9lClJ93KiiKe8PmFIVdXhHcyv44SL9oglmfeSsndo0jRw==} engines: {node: '>=12.20'} hasBin: true dev: true - /undefsafe/2.0.5: + /ufo@1.1.1: + resolution: {integrity: sha512-MvlCc4GHrmZdAllBc0iUDowff36Q9Ndw/UzqmEKyrfSzokTd9ZCy1i+IIk5hrYKkjoYVQyNbrw7/F8XJ2rEwTg==} + dev: true + + /undefsafe@2.0.5: resolution: {integrity: sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==} dev: true - /v8-compile-cache-lib/3.0.1: + /universalify@2.0.0: + resolution: {integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==} + engines: {node: '>= 10.0.0'} + dev: true + + /util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + dev: true + + /v8-compile-cache-lib@3.0.1: resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} dev: true - /wrap-ansi/7.0.0: + /v8-to-istanbul@9.1.0: + resolution: {integrity: sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA==} + engines: {node: '>=10.12.0'} + dependencies: + '@jridgewell/trace-mapping': 0.3.17 + '@types/istanbul-lib-coverage': 2.0.4 + convert-source-map: 1.9.0 + dev: true + + /vite-node@0.29.8(@types/node@18.15.9): + resolution: {integrity: sha512-b6OtCXfk65L6SElVM20q5G546yu10/kNrhg08afEoWlFRJXFq9/6glsvSVY+aI6YeC1tu2TtAqI2jHEQmOmsFw==} + engines: {node: '>=v14.16.0'} + hasBin: true + dependencies: + cac: 6.7.14 + debug: 4.3.4 + mlly: 1.2.0 + pathe: 1.1.0 + picocolors: 1.0.0 + vite: 4.2.1(@types/node@18.15.9) + transitivePeerDependencies: + - '@types/node' + - less + - sass + - stylus + - sugarss + - supports-color + - terser + dev: true + + /vite-tsconfig-paths@4.0.7(typescript@5.0.2): + resolution: {integrity: sha512-MwIYaby6kcbQGZqMH+gAK6h0UYQGOkjsuAgw4q6bP/5vWkn8VKvnmLuCQHA2+IzHAJHnE8OFTO4lnJLFMf9+7Q==} + peerDependencies: + vite: '*' + peerDependenciesMeta: + vite: + optional: true + dependencies: + debug: 4.3.4 + globrex: 0.1.2 + tsconfck: 2.1.1(typescript@5.0.2) + transitivePeerDependencies: + - supports-color + - typescript + dev: true + + /vite@4.2.1(@types/node@18.15.9): + resolution: {integrity: sha512-7MKhqdy0ISo4wnvwtqZkjke6XN4taqQ2TBaTccLIpOKv7Vp2h4Y+NpmWCnGDeSvvn45KxvWgGyb0MkHvY1vgbg==} + engines: {node: ^14.18.0 || >=16.0.0} + hasBin: true + peerDependencies: + '@types/node': '>= 14' + less: '*' + sass: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + dependencies: + '@types/node': 18.15.9 + esbuild: 0.17.14 + postcss: 8.4.21 + resolve: 1.22.1 + rollup: 3.20.2 + optionalDependencies: + fsevents: 2.3.2 + dev: true + + /vitest@0.29.8: + resolution: {integrity: sha512-JIAVi2GK5cvA6awGpH0HvH/gEG9PZ0a/WoxdiV3PmqK+3CjQMf8c+J/Vhv4mdZ2nRyXFw66sAg6qz7VNkaHfDQ==} + engines: {node: '>=v14.16.0'} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@vitest/browser': '*' + '@vitest/ui': '*' + happy-dom: '*' + jsdom: '*' + playwright: '*' + safaridriver: '*' + webdriverio: '*' + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@vitest/browser': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true + playwright: + optional: true + safaridriver: + optional: true + webdriverio: + optional: true + dependencies: + '@types/chai': 4.3.4 + '@types/chai-subset': 1.3.3 + '@types/node': 18.15.9 + '@vitest/expect': 0.29.8 + '@vitest/runner': 0.29.8 + '@vitest/spy': 0.29.8 + '@vitest/utils': 0.29.8 + acorn: 8.8.2 + acorn-walk: 8.2.0 + cac: 6.7.14 + chai: 4.3.7 + debug: 4.3.4 + local-pkg: 0.4.3 + pathe: 1.1.0 + picocolors: 1.0.0 + source-map: 0.6.1 + std-env: 3.3.2 + strip-literal: 1.0.1 + tinybench: 2.4.0 + tinypool: 0.4.0 + tinyspy: 1.1.1 + vite: 4.2.1(@types/node@18.15.9) + vite-node: 0.29.8(@types/node@18.15.9) + why-is-node-running: 2.2.2 + transitivePeerDependencies: + - less + - sass + - stylus + - sugarss + - supports-color + - terser + dev: true + + /webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + dev: true + + /whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + dev: true + + /which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + dependencies: + 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'} dependencies: ansi-styles: 4.3.0 string-width: 4.2.3 strip-ansi: 6.0.1 - dev: false - /y18n/5.0.8: + /wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + dev: true + + /y18n@5.0.8: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} engines: {node: '>=10'} - dev: false - /yargs-parser/20.2.9: + /yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + dev: true + + /yargs-parser@20.2.9: resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} engines: {node: '>=10'} - dev: false - /yargs/16.2.0: + /yargs@16.2.0: resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} engines: {node: '>=10'} dependencies: @@ -617,9 +2178,18 @@ packages: string-width: 4.2.3 y18n: 5.0.8 yargs-parser: 20.2.9 - dev: false - /yn/3.1.1: + /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'} + dev: true + + /yocto-queue@1.0.0: + resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} + engines: {node: '>=12.20'} + dev: true diff --git a/services/delivery/proto b/services/delivery/proto new file mode 120000 index 00000000..4d1e2d8b --- /dev/null +++ b/services/delivery/proto @@ -0,0 +1 @@ +../proto/ \ No newline at end of file diff --git a/services/delivery/src/tests/test.test.ts b/services/delivery/src/tests/test.test.ts new file mode 100644 index 00000000..c348152a --- /dev/null +++ b/services/delivery/src/tests/test.test.ts @@ -0,0 +1,6 @@ +import { describe, expect, test } from "vitest"; + +// simple test to check if the test runner is working +test("test", () => { + expect(true).toBe(true); +}); diff --git a/services/delivery/vitest.config.ts b/services/delivery/vitest.config.ts index 458e2d25..08cfe3bf 100644 --- a/services/delivery/vitest.config.ts +++ b/services/delivery/vitest.config.ts @@ -4,7 +4,4 @@ import tsconfigPaths from "vite-tsconfig-paths"; export default defineConfig({ plugins: [tsconfigPaths()], base: "/src/tests", - test: { - setupFiles: ["./src/tests/setup.ts"], - }, }); From 6ae3a6d9a5a098d4340a5d6e894ad0e3e0653e49 Mon Sep 17 00:00:00 2001 From: Florian LEROUX <10078837+floriaaan@users.noreply.github.com> Date: Tue, 4 Apr 2023 10:08:43 +0200 Subject: [PATCH 270/883] build(docker): add Dockerfile --- services/delivery/.gitignore | 1 + services/delivery/Dockerfile | 24 ++++++++++++++---------- 2 files changed, 15 insertions(+), 10 deletions(-) diff --git a/services/delivery/.gitignore b/services/delivery/.gitignore index 378e1eaa..31e50325 100644 --- a/services/delivery/.gitignore +++ b/services/delivery/.gitignore @@ -1,5 +1,6 @@ node_modules/ dist/ +bin/ *.env* !*.env.example diff --git a/services/delivery/Dockerfile b/services/delivery/Dockerfile index 19327c3e..0e62247a 100644 --- a/services/delivery/Dockerfile +++ b/services/delivery/Dockerfile @@ -1,16 +1,20 @@ -FROM node:18-alpine3.17 as builder +FROM node:18-alpine as builder # Set working directory WORKDIR /app -# Copy the application code -COPY ./delivery/ . +# Copy the package.json and package-lock.json files +COPY package*.json ./ # Install dependencies RUN npm install + +# Copy the application code +COPY . . + # Copy the proto files - TODO: fix this, proto files should be copied from goodfood/services/proto -COPY ./proto ./proto/ +# RUN cp -r -L ../proto /proto/ # Generate Prisma client RUN npx prisma generate @@ -18,21 +22,21 @@ RUN npx prisma generate # Build the application RUN npm run build +# Package the application +RUN npm run pkg # Create a new image with the application -FROM node:18-alpine3.17 as runner +FROM node:18-alpine as runner # Set working directory WORKDIR /app # Copy the application package -COPY --from=builder /app/dist . -COPY --from=builder /app/prisma/ . -COPY --from=builder /app/proto/ /proto/ -COPY --from=builder /app/node_modules/.prisma /.prisma +COPY --from=builder /app/bin /usr/local/bin +RUN ls /usr/local/bin # Expose the gRPC port EXPOSE 50008 # Start the server -CMD [ "node", "index.js"] +CMD ["delivery-linux-x64"] From 9a971a209e28e7215c78b229b8977eed15fa8ffa Mon Sep 17 00:00:00 2001 From: Florian LEROUX <10078837+floriaaan@users.noreply.github.com> Date: Tue, 4 Apr 2023 10:11:51 +0200 Subject: [PATCH 271/883] fix(ci): fix dependencies lock file is not found --- .github/workflows/delivery.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/delivery.yml b/.github/workflows/delivery.yml index a0953866..0f2065b8 100644 --- a/.github/workflows/delivery.yml +++ b/.github/workflows/delivery.yml @@ -18,6 +18,7 @@ jobs: with: node-version: "18.x" cache: "pnpm" + cache-dependency-path: services/delivery/pnpm-lock.yaml - name: Install dependencies run: | cd ./services/delivery @@ -39,6 +40,7 @@ jobs: with: node-version: "18.x" cache: "pnpm" + cache-dependency-path: services/delivery/pnpm-lock.yaml - name: Install dependencies run: | cd ./services/delivery From 26b906cbe162e345626b3923ffdf86e4fb1e0826 Mon Sep 17 00:00:00 2001 From: Florian LEROUX <10078837+floriaaan@users.noreply.github.com> Date: Sun, 9 Apr 2023 00:27:02 +0200 Subject: [PATCH 272/883] feat(handlers): add delivery-person handlers --- .github/workflows/delivery.yml | 1 - services/delivery/README.md | 2 +- services/delivery/prisma/schema.prisma | 2 +- services/delivery/src/handlers/delivery/create.ts | 3 ++- services/delivery/src/handlers/delivery/delete.ts | 3 ++- services/delivery/src/handlers/delivery/get.ts | 3 ++- .../src/handlers/delivery/list-by-restaurant.ts | 3 ++- .../delivery/src/handlers/delivery/list-by-user.ts | 3 ++- services/delivery/src/handlers/delivery/update.ts | 3 ++- services/delivery/src/server.ts | 3 ++- services/delivery/src/types/delivery-person.d.ts | 14 ++++++++++++++ services/delivery/src/types/delivery.d.ts | 12 +----------- services/delivery/src/types/index.d.ts | 6 ++++++ services/proto/delivery.proto | 4 ++-- 14 files changed, 39 insertions(+), 23 deletions(-) diff --git a/.github/workflows/delivery.yml b/.github/workflows/delivery.yml index 0f2065b8..53b4ba53 100644 --- a/.github/workflows/delivery.yml +++ b/.github/workflows/delivery.yml @@ -53,7 +53,6 @@ jobs: publish: runs-on: ubuntu-latest needs: [build, test] - if: ${{ success() }} && ${{ github.ref == 'refs/heads/dev' || github.ref == 'refs/heads/main' }} steps: - name: Checkout code uses: actions/checkout@v2 diff --git a/services/delivery/README.md b/services/delivery/README.md index 69965be6..6f933c51 100644 --- a/services/delivery/README.md +++ b/services/delivery/README.md @@ -5,7 +5,7 @@ | **Port:** 50008 | | **Developer:** @floriaaan | | **Status:** In progress | -| **Last update:** 2023-04-04 | +| **Last update:** 2023-04-09 | | **Language:** NodeJS | | **Dependencies:** TypeScript, Prisma, gRPC, Postgres | | **Models:** (see [`prisma/schema.prisma`](./prisma/schema.prisma)) | diff --git a/services/delivery/prisma/schema.prisma b/services/delivery/prisma/schema.prisma index 0d7939f5..02929eb8 100644 --- a/services/delivery/prisma/schema.prisma +++ b/services/delivery/prisma/schema.prisma @@ -21,7 +21,7 @@ model Delivery { address String status Status @default(PENDING) - person DeliveryPerson @relation(fields: [delivery_person_id], references: [id]) + delivery_person DeliveryPerson @relation(fields: [delivery_person_id], references: [id]) delivery_person_id String user_id String diff --git a/services/delivery/src/handlers/delivery/create.ts b/services/delivery/src/handlers/delivery/create.ts index 1ad90069..ba0a4b6a 100644 --- a/services/delivery/src/handlers/delivery/create.ts +++ b/services/delivery/src/handlers/delivery/create.ts @@ -1,6 +1,7 @@ import { prisma } from "@delivery/lib/prisma"; import { log } from "@delivery/lib/log"; -import { Data, DeliveryCreateInput } from "@delivery/types/delivery"; +import { DeliveryCreateInput } from "@delivery/types/delivery"; +import { Data } from "@delivery/types"; export const CreateDelivery = async ( { request }: Data, diff --git a/services/delivery/src/handlers/delivery/delete.ts b/services/delivery/src/handlers/delivery/delete.ts index cdeee90b..35b5ade7 100644 --- a/services/delivery/src/handlers/delivery/delete.ts +++ b/services/delivery/src/handlers/delivery/delete.ts @@ -1,6 +1,7 @@ import { prisma } from "@delivery/lib/prisma"; import { log } from "@delivery/lib/log"; -import { Data, DeliveryId } from "@delivery/types/delivery"; +import { DeliveryId } from "@delivery/types/delivery"; +import { Data } from "@delivery/types"; export const DeleteDelivery = async ( data: Data, diff --git a/services/delivery/src/handlers/delivery/get.ts b/services/delivery/src/handlers/delivery/get.ts index cde931dd..4f7d37a5 100644 --- a/services/delivery/src/handlers/delivery/get.ts +++ b/services/delivery/src/handlers/delivery/get.ts @@ -1,6 +1,7 @@ import { prisma } from "@delivery/lib/prisma"; import { log } from "@delivery/lib/log"; -import { Data, DeliveryId } from "@delivery/types/delivery"; +import { DeliveryId } from "@delivery/types/delivery"; +import { Data } from "@delivery/types"; export const GetDelivery = async ( data: Data, diff --git a/services/delivery/src/handlers/delivery/list-by-restaurant.ts b/services/delivery/src/handlers/delivery/list-by-restaurant.ts index 879bb285..76aaa464 100644 --- a/services/delivery/src/handlers/delivery/list-by-restaurant.ts +++ b/services/delivery/src/handlers/delivery/list-by-restaurant.ts @@ -1,6 +1,7 @@ import { prisma } from "@delivery/lib/prisma"; import { log } from "@delivery/lib/log"; -import { Data, RestaurantId } from "@delivery/types/delivery"; +import { RestaurantId } from "@delivery/types/delivery"; +import { Data } from "@delivery/types"; export const ListDeliveriesByRestaurant = async ( data: Data, diff --git a/services/delivery/src/handlers/delivery/list-by-user.ts b/services/delivery/src/handlers/delivery/list-by-user.ts index 8c220175..30b5e3e1 100644 --- a/services/delivery/src/handlers/delivery/list-by-user.ts +++ b/services/delivery/src/handlers/delivery/list-by-user.ts @@ -1,6 +1,7 @@ import { prisma } from "@delivery/lib/prisma"; import { log } from "@delivery/lib/log"; -import { Data, UserId } from "@delivery/types/delivery"; +import { UserId } from "@delivery/types/delivery"; +import { Data } from "@delivery/types"; export const ListDeliveriesByUser = async ( data: Data, diff --git a/services/delivery/src/handlers/delivery/update.ts b/services/delivery/src/handlers/delivery/update.ts index d08d2bd2..41f4c8c9 100644 --- a/services/delivery/src/handlers/delivery/update.ts +++ b/services/delivery/src/handlers/delivery/update.ts @@ -1,6 +1,7 @@ import { prisma } from "@delivery/lib/prisma"; import { log } from "@delivery/lib/log"; -import { Data, Delivery } from "@delivery/types/delivery"; +import { Delivery } from "@delivery/types/delivery"; +import { Data } from "@delivery/types"; export const UpdateDelivery = async ( data: Data, diff --git a/services/delivery/src/server.ts b/services/delivery/src/server.ts index 2eac6c38..01d48fd7 100644 --- a/services/delivery/src/server.ts +++ b/services/delivery/src/server.ts @@ -8,6 +8,7 @@ import { options } from "@delivery/resources/protoloader-options"; import { serverInsecure } from "@delivery/resources/grpc-credentials"; import deliveryHandlers from "@delivery/handlers/delivery"; +import personHandlers from "@delivery/handlers/person"; const PORT = process.env.PORT || 50008; const ADDRESS = `0.0.0.0:${PORT}`; @@ -18,7 +19,7 @@ const { delivery } = loadPackageDefinition(packageDefinition) as any; // todo: f const server = new Server(); server.addService(delivery.DeliveryService.service, deliveryHandlers); -server.addService(delivery.DeliveryPersonService.service, {}); +server.addService(delivery.DeliveryPersonService.service, personHandlers); server.bindAsync(ADDRESS, serverInsecure, () => { server.start(); diff --git a/services/delivery/src/types/delivery-person.d.ts b/services/delivery/src/types/delivery-person.d.ts index a897860e..5bb6731d 100644 --- a/services/delivery/src/types/delivery-person.d.ts +++ b/services/delivery/src/types/delivery-person.d.ts @@ -9,3 +9,17 @@ export type DeliveryPerson = { deliveries: Delivery[]; }; + +export type DeliveryPersonCreateInput = { + first_name: string; + last_name: string; + phone: string; + location: [number, number]; +}; + +export type LocationInput = { + latitude: number; + longitude: number; +}; + +export type DeliveryPersonId = { id: DeliveryPerson["id"] }; diff --git a/services/delivery/src/types/delivery.d.ts b/services/delivery/src/types/delivery.d.ts index 333462d6..59ff1d82 100644 --- a/services/delivery/src/types/delivery.d.ts +++ b/services/delivery/src/types/delivery.d.ts @@ -1,16 +1,6 @@ import { DeliveryPerson } from "@delivery/types/delivery-person"; import { Status } from "@prisma/client"; -export type Data = { - request: T; -}; - -export type Stream = { - write: (data: any) => void; - end: () => void; - request: T; -}; - export type DeliveryCreateInput = { eta: string; address: string; @@ -23,7 +13,7 @@ export type DeliveryCreateInput = { }; export type DeliveryId = { - id: string; + id: Delivery["id"]; }; export type Delivery = { diff --git a/services/delivery/src/types/index.d.ts b/services/delivery/src/types/index.d.ts index edf2bebf..5f91a217 100644 --- a/services/delivery/src/types/index.d.ts +++ b/services/delivery/src/types/index.d.ts @@ -1,3 +1,9 @@ export type Data = { request: T; }; + +export type Stream = { + write: (data: any) => void; + end: () => void; + request: T; +}; diff --git a/services/proto/delivery.proto b/services/proto/delivery.proto index f4906434..91a86b21 100644 --- a/services/proto/delivery.proto +++ b/services/proto/delivery.proto @@ -10,7 +10,7 @@ message Delivery { string address = 3; Status status = 4; - DeliveryPerson person = 5; + DeliveryPerson delivery_person = 5; string delivery_person_id = 6; string user_id = 7; @@ -80,7 +80,7 @@ message DeliveryList { } message DeliveryPersonList { - repeated DeliveryPersonList persons = 1; + repeated DeliveryPersonList delivery_persons = 1; } message DeliveryPersonId { From 521ff15e0ae9757d696348b08ae9fe879d395568 Mon Sep 17 00:00:00 2001 From: Florian LEROUX <10078837+floriaaan@users.noreply.github.com> Date: Mon, 10 Apr 2023 11:29:33 +0200 Subject: [PATCH 273/883] feat(tf): add terraform files --- services/delivery/terraform/data.tf | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/services/delivery/terraform/data.tf b/services/delivery/terraform/data.tf index 618f4e55..adf0b7fd 100644 --- a/services/delivery/terraform/data.tf +++ b/services/delivery/terraform/data.tf @@ -2,12 +2,16 @@ data "azurerm_resource_group" "rg-goodfood" { name = "rg-${var.project_name}${var.environnment_suffix}" } +data "azurerm_key_vault" "kv-goodfood-delivery" { + resource_group_name = data.azurerm_resource_group.rg-goodfood.name + name = "kv-${var.project_name}" +} + data "azurerm_key_vault_secret" "delivery-db-login" { name = "delivery-db-login" - key_vault_id = azurerm_key_vault.kv-goodfood-delivery.id + key_vault_id = data.azurerm_key_vault.kv-goodfood-delivery.id } data "azurerm_key_vault_secret" "delivery-db-password" { name = "delivery-db-password" - key_vault_id = azurerm_key_vault.kv-goodfood-delivery.id -} -data "azurerm_client_config" "current" {} + key_vault_id = data.azurerm_key_vault.kv-goodfood-delivery.id +} \ No newline at end of file From 9e91633d0e680343249da67e69c20d7fa45311ad Mon Sep 17 00:00:00 2001 From: Florian LEROUX <10078837+floriaaan@users.noreply.github.com> Date: Mon, 10 Apr 2023 11:36:35 +0200 Subject: [PATCH 274/883] feat(k8s): add k8s files --- services/delivery/k8s/deployment.yml | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/services/delivery/k8s/deployment.yml b/services/delivery/k8s/deployment.yml index 04b97285..53722f26 100644 --- a/services/delivery/k8s/deployment.yml +++ b/services/delivery/k8s/deployment.yml @@ -15,8 +15,7 @@ spec: spec: containers: - name: goodfood-delivery - image: floriaaan/goodfood-delivery:1.0.0 - imagePullPolicy: Always + image: floriaaan/goodfood-delivery:1.0 resources: limits: memory: "128Mi" @@ -28,4 +27,4 @@ spec: name: goodfood-delivery-configmap key: port ports: - - containerPort: 50008 + - containerPort: 3000 From 038b1f7f5a493dc5eef5dbd0304276e183105874 Mon Sep 17 00:00:00 2001 From: Florian LEROUX <10078837+floriaaan@users.noreply.github.com> Date: Mon, 10 Apr 2023 14:34:43 +0200 Subject: [PATCH 275/883] ci: add tests (but test script is disabeld) --- package.json | 5 + pnpm-lock.yaml | 794 ++++++++++++++++++ services/delivery/package.json | 5 +- services/delivery/pnpm-lock.yaml | 22 + .../delivery/src/client/delivery/create.ts | 34 +- services/delivery/src/server.ts | 3 + services/delivery/src/tests/test.test.ts | 6 - services/delivery/vitest.config.ts | 3 + 8 files changed, 851 insertions(+), 21 deletions(-) create mode 100644 package.json create mode 100644 pnpm-lock.yaml delete mode 100644 services/delivery/src/tests/test.test.ts diff --git a/package.json b/package.json new file mode 100644 index 00000000..47832f15 --- /dev/null +++ b/package.json @@ -0,0 +1,5 @@ +{ + "devDependencies": { + "vitest-mock-extended": "^1.1.3" + } +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 00000000..cccf0383 --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,794 @@ +lockfileVersion: '6.0' + +devDependencies: + vitest-mock-extended: + specifier: ^1.1.3 + version: 1.1.3(typescript@5.0.4)(vitest@0.30.0) + +packages: + + /@esbuild/android-arm64@0.17.16: + resolution: {integrity: sha512-QX48qmsEZW+gcHgTmAj+x21mwTz8MlYQBnzF6861cNdQGvj2jzzFjqH0EBabrIa/WVZ2CHolwMoqxVryqKt8+Q==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-arm@0.17.16: + resolution: {integrity: sha512-baLqRpLe4JnKrUXLJChoTN0iXZH7El/mu58GE3WIA6/H834k0XWvLRmGLG8y8arTRS9hJJibPnF0tiGhmWeZgw==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-x64@0.17.16: + resolution: {integrity: sha512-G4wfHhrrz99XJgHnzFvB4UwwPxAWZaZBOFXh+JH1Duf1I4vIVfuYY9uVLpx4eiV2D/Jix8LJY+TAdZ3i40tDow==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-arm64@0.17.16: + resolution: {integrity: sha512-/Ofw8UXZxuzTLsNFmz1+lmarQI6ztMZ9XktvXedTbt3SNWDn0+ODTwxExLYQ/Hod91EZB4vZPQJLoqLF0jvEzA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-x64@0.17.16: + resolution: {integrity: sha512-SzBQtCV3Pdc9kyizh36Ol+dNVhkDyIrGb/JXZqFq8WL37LIyrXU0gUpADcNV311sCOhvY+f2ivMhb5Tuv8nMOQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-arm64@0.17.16: + resolution: {integrity: sha512-ZqftdfS1UlLiH1DnS2u3It7l4Bc3AskKeu+paJSfk7RNOMrOxmeFDhLTMQqMxycP1C3oj8vgkAT6xfAuq7ZPRA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-x64@0.17.16: + resolution: {integrity: sha512-rHV6zNWW1tjgsu0dKQTX9L0ByiJHHLvQKrWtnz8r0YYJI27FU3Xu48gpK2IBj1uCSYhJ+pEk6Y0Um7U3rIvV8g==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm64@0.17.16: + resolution: {integrity: sha512-8yoZhGkU6aHu38WpaM4HrRLTFc7/VVD9Q2SvPcmIQIipQt2I/GMTZNdEHXoypbbGao5kggLcxg0iBKjo0SQYKA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm@0.17.16: + resolution: {integrity: sha512-n4O8oVxbn7nl4+m+ISb0a68/lcJClIbaGAoXwqeubj/D1/oMMuaAXmJVfFlRjJLu/ZvHkxoiFJnmbfp4n8cdSw==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ia32@0.17.16: + resolution: {integrity: sha512-9ZBjlkdaVYxPNO8a7OmzDbOH9FMQ1a58j7Xb21UfRU29KcEEU3VTHk+Cvrft/BNv0gpWJMiiZ/f4w0TqSP0gLA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-loong64@0.17.16: + resolution: {integrity: sha512-TIZTRojVBBzdgChY3UOG7BlPhqJz08AL7jdgeeu+kiObWMFzGnQD7BgBBkWRwOtKR1i2TNlO7YK6m4zxVjjPRQ==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-mips64el@0.17.16: + resolution: {integrity: sha512-UPeRuFKCCJYpBbIdczKyHLAIU31GEm0dZl1eMrdYeXDH+SJZh/i+2cAmD3A1Wip9pIc5Sc6Kc5cFUrPXtR0XHA==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ppc64@0.17.16: + resolution: {integrity: sha512-io6yShgIEgVUhExJejJ21xvO5QtrbiSeI7vYUnr7l+v/O9t6IowyhdiYnyivX2X5ysOVHAuyHW+Wyi7DNhdw6Q==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-riscv64@0.17.16: + resolution: {integrity: sha512-WhlGeAHNbSdG/I2gqX2RK2gfgSNwyJuCiFHMc8s3GNEMMHUI109+VMBfhVqRb0ZGzEeRiibi8dItR3ws3Lk+cA==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-s390x@0.17.16: + resolution: {integrity: sha512-gHRReYsJtViir63bXKoFaQ4pgTyah4ruiMRQ6im9YZuv+gp3UFJkNTY4sFA73YDynmXZA6hi45en4BGhNOJUsw==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-x64@0.17.16: + resolution: {integrity: sha512-mfiiBkxEbUHvi+v0P+TS7UnA9TeGXR48aK4XHkTj0ZwOijxexgMF01UDFaBX7Q6CQsB0d+MFNv9IiXbIHTNd4g==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/netbsd-x64@0.17.16: + resolution: {integrity: sha512-n8zK1YRDGLRZfVcswcDMDM0j2xKYLNXqei217a4GyBxHIuPMGrrVuJ+Ijfpr0Kufcm7C1k/qaIrGy6eG7wvgmA==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/openbsd-x64@0.17.16: + resolution: {integrity: sha512-lEEfkfsUbo0xC47eSTBqsItXDSzwzwhKUSsVaVjVji07t8+6KA5INp2rN890dHZeueXJAI8q0tEIfbwVRYf6Ew==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/sunos-x64@0.17.16: + resolution: {integrity: sha512-jlRjsuvG1fgGwnE8Afs7xYDnGz0dBgTNZfgCK6TlvPH3Z13/P5pi6I57vyLE8qZYLrGVtwcm9UbUx1/mZ8Ukag==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-arm64@0.17.16: + resolution: {integrity: sha512-TzoU2qwVe2boOHl/3KNBUv2PNUc38U0TNnzqOAcgPiD/EZxT2s736xfC2dYQbszAwo4MKzzwBV0iHjhfjxMimg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-ia32@0.17.16: + resolution: {integrity: sha512-B8b7W+oo2yb/3xmwk9Vc99hC9bNolvqjaTZYEfMQhzdpBsjTvZBlXQ/teUE55Ww6sg//wlcDjOaqldOKyigWdA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-x64@0.17.16: + resolution: {integrity: sha512-xJ7OH/nanouJO9pf03YsL9NAFQBHd8AqfrQd7Pf5laGyyTt/gToul6QYOA/i5i/q8y9iaM5DQFNTgpi995VkOg==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@jridgewell/sourcemap-codec@1.4.15: + resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + dev: true + + /@types/chai-subset@1.3.3: + resolution: {integrity: sha512-frBecisrNGz+F4T6bcc+NLeolfiojh5FxW2klu669+8BARtyQv2C/GkNW6FUodVe4BroGMP/wER/YDGc7rEllw==} + dependencies: + '@types/chai': 4.3.4 + dev: true + + /@types/chai@4.3.4: + resolution: {integrity: sha512-KnRanxnpfpjUTqTCXslZSEdLfXExwgNxYPdiO2WGUj8+HDjFi8R3k5RVKPeSCzLjCcshCAtVO2QBbVuAV4kTnw==} + dev: true + + /@types/node@18.15.11: + resolution: {integrity: sha512-E5Kwq2n4SbMzQOn6wnmBjuK9ouqlURrcZDVfbo9ftDDTFt3nk7ZKK4GMOzoYgnpQJKcxwQw+lGaBvvlMo0qN/Q==} + dev: true + + /@vitest/expect@0.30.0: + resolution: {integrity: sha512-b/jLWBqi6WQHfezWm8VjgXdIyfejAurtxqdyCdDqoToCim5W/nDxKjFAADitEHPz80oz+IP+c+wmkGKBucSpiw==} + dependencies: + '@vitest/spy': 0.30.0 + '@vitest/utils': 0.30.0 + chai: 4.3.7 + dev: true + + /@vitest/runner@0.30.0: + resolution: {integrity: sha512-Xh4xkdRcymdeRNrSwjhgarCTSgnQu2J59wsFI6i4UhKrL5whzo5+vWyq7iWK1ht3fppPeNAtvkbqUDf+OJSCbQ==} + dependencies: + '@vitest/utils': 0.30.0 + concordance: 5.0.4 + p-limit: 4.0.0 + pathe: 1.1.0 + dev: true + + /@vitest/snapshot@0.30.0: + resolution: {integrity: sha512-e4eSGCy36Bw3/Tkir9qYJDlFsUz3NALFPNJSxzlY8CFl901TV9iZdKgpqXpyG1sAhLO0tPHThBAMHRi8hRA8cg==} + dependencies: + magic-string: 0.30.0 + pathe: 1.1.0 + pretty-format: 27.5.1 + dev: true + + /@vitest/spy@0.30.0: + resolution: {integrity: sha512-olTWyG5gVWdfhCrdgxWQb2K3JYtj1/ZwInFFOb4GZ2HFI91PUWHWHhLRPORxwRwVvoXD1MS1162vPJZuHlKJkg==} + dependencies: + tinyspy: 2.1.0 + dev: true + + /@vitest/utils@0.30.0: + resolution: {integrity: sha512-qFZgoOKQ+rJV9xG4BBxgOSilnLQ2gkfG4I+z1wBuuQ3AD33zQrnB88kMFfzsot1E1AbF3dNK1e4CU7q3ojahRA==} + dependencies: + concordance: 5.0.4 + loupe: 2.3.6 + pretty-format: 27.5.1 + dev: true + + /acorn-walk@8.2.0: + resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} + engines: {node: '>=0.4.0'} + dev: true + + /acorn@8.8.2: + resolution: {integrity: sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==} + engines: {node: '>=0.4.0'} + hasBin: true + dev: true + + /ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + dev: true + + /ansi-styles@5.2.0: + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} + engines: {node: '>=10'} + dev: true + + /assertion-error@1.1.0: + resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} + dev: true + + /blueimp-md5@2.19.0: + resolution: {integrity: sha512-DRQrD6gJyy8FbiE4s+bDoXS9hiW3Vbx5uCdwvcCf3zLHL+Iv7LtGHLpr+GZV8rHG8tK766FGYBwRbu8pELTt+w==} + dev: true + + /cac@6.7.14: + resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} + engines: {node: '>=8'} + dev: true + + /chai@4.3.7: + resolution: {integrity: sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==} + engines: {node: '>=4'} + dependencies: + assertion-error: 1.1.0 + check-error: 1.0.2 + deep-eql: 4.1.3 + get-func-name: 2.0.0 + loupe: 2.3.6 + pathval: 1.1.1 + type-detect: 4.0.8 + dev: true + + /check-error@1.0.2: + resolution: {integrity: sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==} + dev: true + + /concordance@5.0.4: + resolution: {integrity: sha512-OAcsnTEYu1ARJqWVGwf4zh4JDfHZEaSNlNccFmt8YjB2l/n19/PF2viLINHc57vO4FKIAFl2FWASIGZZWZ2Kxw==} + engines: {node: '>=10.18.0 <11 || >=12.14.0 <13 || >=14'} + dependencies: + date-time: 3.1.0 + esutils: 2.0.3 + fast-diff: 1.2.0 + js-string-escape: 1.0.1 + lodash: 4.17.21 + md5-hex: 3.0.1 + semver: 7.3.8 + well-known-symbols: 2.0.0 + dev: true + + /date-time@3.1.0: + resolution: {integrity: sha512-uqCUKXE5q1PNBXjPqvwhwJf9SwMoAHBgWJ6DcrnS5o+W2JOiIILl0JEdVD8SGujrNS02GGxgwAg2PN2zONgtjg==} + engines: {node: '>=6'} + dependencies: + time-zone: 1.0.0 + dev: true + + /debug@4.3.4: + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.2 + dev: true + + /deep-eql@4.1.3: + resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==} + engines: {node: '>=6'} + dependencies: + type-detect: 4.0.8 + dev: true + + /esbuild@0.17.16: + resolution: {integrity: sha512-aeSuUKr9aFVY9Dc8ETVELGgkj4urg5isYx8pLf4wlGgB0vTFjxJQdHnNH6Shmx4vYYrOTLCHtRI5i1XZ9l2Zcg==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/android-arm': 0.17.16 + '@esbuild/android-arm64': 0.17.16 + '@esbuild/android-x64': 0.17.16 + '@esbuild/darwin-arm64': 0.17.16 + '@esbuild/darwin-x64': 0.17.16 + '@esbuild/freebsd-arm64': 0.17.16 + '@esbuild/freebsd-x64': 0.17.16 + '@esbuild/linux-arm': 0.17.16 + '@esbuild/linux-arm64': 0.17.16 + '@esbuild/linux-ia32': 0.17.16 + '@esbuild/linux-loong64': 0.17.16 + '@esbuild/linux-mips64el': 0.17.16 + '@esbuild/linux-ppc64': 0.17.16 + '@esbuild/linux-riscv64': 0.17.16 + '@esbuild/linux-s390x': 0.17.16 + '@esbuild/linux-x64': 0.17.16 + '@esbuild/netbsd-x64': 0.17.16 + '@esbuild/openbsd-x64': 0.17.16 + '@esbuild/sunos-x64': 0.17.16 + '@esbuild/win32-arm64': 0.17.16 + '@esbuild/win32-ia32': 0.17.16 + '@esbuild/win32-x64': 0.17.16 + dev: true + + /esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + dev: true + + /fast-diff@1.2.0: + resolution: {integrity: sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==} + dev: true + + /fsevents@2.3.2: + resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /function-bind@1.1.1: + resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} + dev: true + + /get-func-name@2.0.0: + resolution: {integrity: sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==} + dev: true + + /has@1.0.3: + resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} + engines: {node: '>= 0.4.0'} + dependencies: + function-bind: 1.1.1 + dev: true + + /is-core-module@2.11.0: + resolution: {integrity: sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==} + dependencies: + has: 1.0.3 + dev: true + + /js-string-escape@1.0.1: + resolution: {integrity: sha512-Smw4xcfIQ5LVjAOuJCvN/zIodzA/BBSsluuoSykP+lUvScIi4U6RJLfwHet5cxFnCswUjISV8oAXaqaJDY3chg==} + engines: {node: '>= 0.8'} + dev: true + + /jsonc-parser@3.2.0: + resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} + dev: true + + /local-pkg@0.4.3: + resolution: {integrity: sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==} + engines: {node: '>=14'} + dev: true + + /lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + dev: true + + /loupe@2.3.6: + resolution: {integrity: sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==} + dependencies: + get-func-name: 2.0.0 + dev: true + + /lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + dependencies: + yallist: 4.0.0 + dev: true + + /magic-string@0.30.0: + resolution: {integrity: sha512-LA+31JYDJLs82r2ScLrlz1GjSgu66ZV518eyWT+S8VhyQn/JL0u9MeBOvQMGYiPk1DBiSN9DDMOcXvigJZaViQ==} + engines: {node: '>=12'} + dependencies: + '@jridgewell/sourcemap-codec': 1.4.15 + dev: true + + /md5-hex@3.0.1: + resolution: {integrity: sha512-BUiRtTtV39LIJwinWBjqVsU9xhdnz7/i889V859IBFpuqGAj6LuOvHv5XLbgZ2R7ptJoJaEcxkv88/h25T7Ciw==} + engines: {node: '>=8'} + dependencies: + blueimp-md5: 2.19.0 + dev: true + + /mlly@1.2.0: + resolution: {integrity: sha512-+c7A3CV0KGdKcylsI6khWyts/CYrGTrRVo4R/I7u/cUsy0Conxa6LUhiEzVKIw14lc2L5aiO4+SeVe4TeGRKww==} + dependencies: + acorn: 8.8.2 + pathe: 1.1.0 + pkg-types: 1.0.2 + ufo: 1.1.1 + dev: true + + /ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + dev: true + + /nanoid@3.3.6: + resolution: {integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + dev: true + + /p-limit@4.0.0: + resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + yocto-queue: 1.0.0 + dev: true + + /path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + dev: true + + /pathe@1.1.0: + resolution: {integrity: sha512-ODbEPR0KKHqECXW1GoxdDb+AZvULmXjVPy4rt+pGo2+TnjJTIPJQSVS6N63n8T2Ip+syHhbn52OewKicV0373w==} + dev: true + + /pathval@1.1.1: + resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} + dev: true + + /picocolors@1.0.0: + resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + dev: true + + /pkg-types@1.0.2: + resolution: {integrity: sha512-hM58GKXOcj8WTqUXnsQyJYXdeAPbythQgEF3nTcEo+nkD49chjQ9IKm/QJy9xf6JakXptz86h7ecP2024rrLaQ==} + dependencies: + jsonc-parser: 3.2.0 + mlly: 1.2.0 + pathe: 1.1.0 + dev: true + + /postcss@8.4.21: + resolution: {integrity: sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==} + engines: {node: ^10 || ^12 || >=14} + dependencies: + nanoid: 3.3.6 + picocolors: 1.0.0 + source-map-js: 1.0.2 + dev: true + + /pretty-format@27.5.1: + resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + ansi-regex: 5.0.1 + ansi-styles: 5.2.0 + react-is: 17.0.2 + dev: true + + /react-is@17.0.2: + resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} + dev: true + + /resolve@1.22.2: + resolution: {integrity: sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==} + hasBin: true + dependencies: + is-core-module: 2.11.0 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + dev: true + + /rollup@3.20.2: + resolution: {integrity: sha512-3zwkBQl7Ai7MFYQE0y1MeQ15+9jsi7XxfrqwTb/9EK8D9C9+//EBR4M+CuA1KODRaNbFez/lWxA5vhEGZp4MUg==} + engines: {node: '>=14.18.0', npm: '>=8.0.0'} + hasBin: true + optionalDependencies: + fsevents: 2.3.2 + dev: true + + /semver@7.3.8: + resolution: {integrity: sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==} + engines: {node: '>=10'} + hasBin: true + dependencies: + lru-cache: 6.0.0 + dev: true + + /siginfo@2.0.0: + resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} + dev: true + + /source-map-js@1.0.2: + resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} + engines: {node: '>=0.10.0'} + dev: true + + /source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + dev: true + + /stackback@0.0.2: + resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + dev: true + + /std-env@3.3.2: + resolution: {integrity: sha512-uUZI65yrV2Qva5gqE0+A7uVAvO40iPo6jGhs7s8keRfHCmtg+uB2X6EiLGCI9IgL1J17xGhvoOqSz79lzICPTA==} + dev: true + + /strip-literal@1.0.1: + resolution: {integrity: sha512-QZTsipNpa2Ppr6v1AmJHESqJ3Uz247MUS0OjrnnZjFAvEoWqxuyFuXn2xLgMtRnijJShAa1HL0gtJyUs7u7n3Q==} + dependencies: + acorn: 8.8.2 + dev: true + + /supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + dev: true + + /time-zone@1.0.0: + resolution: {integrity: sha512-TIsDdtKo6+XrPtiTm1ssmMngN1sAhyKnTO2kunQWqNPWIVvCm15Wmw4SWInwTVgJ5u/Tr04+8Ei9TNcw4x4ONA==} + engines: {node: '>=4'} + dev: true + + /tinybench@2.4.0: + resolution: {integrity: sha512-iyziEiyFxX4kyxSp+MtY1oCH/lvjH3PxFN8PGCDeqcZWAJ/i+9y+nL85w99PxVzrIvew/GSkSbDYtiGVa85Afg==} + dev: true + + /tinypool@0.4.0: + resolution: {integrity: sha512-2ksntHOKf893wSAH4z/+JbPpi92esw8Gn9N2deXX+B0EO92hexAVI9GIZZPx7P5aYo5KULfeOSt3kMOmSOy6uA==} + engines: {node: '>=14.0.0'} + dev: true + + /tinyspy@2.1.0: + resolution: {integrity: sha512-7eORpyqImoOvkQJCSkL0d0mB4NHHIFAy4b1u8PHdDa7SjGS2njzl6/lyGoZLm+eyYEtlUmFGE0rFj66SWxZgQQ==} + engines: {node: '>=14.0.0'} + dev: true + + /ts-essentials@9.3.1(typescript@5.0.4): + resolution: {integrity: sha512-9CChSvQMyVRo29Vb1A2jbs+LKo3d/bAf+ndSaX0T8cEiy/HChVaRN/HY5DqUryZ8hZ6uol9bEgCnGmnDbwBR9Q==} + peerDependencies: + typescript: '>=4.1.0' + dependencies: + typescript: 5.0.4 + dev: true + + /type-detect@4.0.8: + resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} + engines: {node: '>=4'} + dev: true + + /typescript@5.0.4: + resolution: {integrity: sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==} + engines: {node: '>=12.20'} + hasBin: true + dev: true + + /ufo@1.1.1: + resolution: {integrity: sha512-MvlCc4GHrmZdAllBc0iUDowff36Q9Ndw/UzqmEKyrfSzokTd9ZCy1i+IIk5hrYKkjoYVQyNbrw7/F8XJ2rEwTg==} + dev: true + + /vite-node@0.30.0(@types/node@18.15.11): + resolution: {integrity: sha512-23X5Ggylx0kU/bMf8MCcEEl55d/gsTtU81mMZjm7Z0FSpgKZexUqmX3mJtgglP9SySQQs9ydYg/GEahi/cKHaA==} + engines: {node: '>=v14.18.0'} + hasBin: true + dependencies: + cac: 6.7.14 + debug: 4.3.4 + mlly: 1.2.0 + pathe: 1.1.0 + picocolors: 1.0.0 + vite: 4.2.1(@types/node@18.15.11) + transitivePeerDependencies: + - '@types/node' + - less + - sass + - stylus + - sugarss + - supports-color + - terser + dev: true + + /vite@4.2.1(@types/node@18.15.11): + resolution: {integrity: sha512-7MKhqdy0ISo4wnvwtqZkjke6XN4taqQ2TBaTccLIpOKv7Vp2h4Y+NpmWCnGDeSvvn45KxvWgGyb0MkHvY1vgbg==} + engines: {node: ^14.18.0 || >=16.0.0} + hasBin: true + peerDependencies: + '@types/node': '>= 14' + less: '*' + sass: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + dependencies: + '@types/node': 18.15.11 + esbuild: 0.17.16 + postcss: 8.4.21 + resolve: 1.22.2 + rollup: 3.20.2 + optionalDependencies: + fsevents: 2.3.2 + dev: true + + /vitest-mock-extended@1.1.3(typescript@5.0.4)(vitest@0.30.0): + resolution: {integrity: sha512-MiaKYZbTg+fjozKnCpoTTva0BnlSNYyk4jiPuM2xVhg4aou112QIrALdH3/ZKK6qfXWh0A17gFIjWJjylOlXxg==} + peerDependencies: + typescript: 3.x || 4.x || 5.x + vitest: '>=0.29.2' + dependencies: + ts-essentials: 9.3.1(typescript@5.0.4) + typescript: 5.0.4 + vitest: 0.30.0 + dev: true + + /vitest@0.30.0: + resolution: {integrity: sha512-2WW4WeTHtrLFeoiuotWvEW6khozx1NvMGYoGsNz2btdddEbqvEdPJIouIdoiC5i61Rl1ctZvm9cn2R9TcPQlzw==} + engines: {node: '>=v14.18.0'} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@vitest/browser': '*' + '@vitest/ui': '*' + happy-dom: '*' + jsdom: '*' + playwright: '*' + safaridriver: '*' + webdriverio: '*' + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@vitest/browser': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true + playwright: + optional: true + safaridriver: + optional: true + webdriverio: + optional: true + dependencies: + '@types/chai': 4.3.4 + '@types/chai-subset': 1.3.3 + '@types/node': 18.15.11 + '@vitest/expect': 0.30.0 + '@vitest/runner': 0.30.0 + '@vitest/snapshot': 0.30.0 + '@vitest/spy': 0.30.0 + '@vitest/utils': 0.30.0 + acorn: 8.8.2 + acorn-walk: 8.2.0 + cac: 6.7.14 + chai: 4.3.7 + concordance: 5.0.4 + debug: 4.3.4 + local-pkg: 0.4.3 + magic-string: 0.30.0 + pathe: 1.1.0 + picocolors: 1.0.0 + source-map: 0.6.1 + std-env: 3.3.2 + strip-literal: 1.0.1 + tinybench: 2.4.0 + tinypool: 0.4.0 + vite: 4.2.1(@types/node@18.15.11) + vite-node: 0.30.0(@types/node@18.15.11) + why-is-node-running: 2.2.2 + transitivePeerDependencies: + - less + - sass + - stylus + - sugarss + - supports-color + - terser + dev: true + + /well-known-symbols@2.0.0: + resolution: {integrity: sha512-ZMjC3ho+KXo0BfJb7JgtQ5IBuvnShdlACNkKkdsqBmYw3bPAaJfPeYUo6tLUaT5tG/Gkh7xkpBhKRQ9e7pyg9Q==} + engines: {node: '>=6'} + 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 + + /yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + dev: true + + /yocto-queue@1.0.0: + resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} + engines: {node: '>=12.20'} + dev: true diff --git a/services/delivery/package.json b/services/delivery/package.json index 43cb5383..5df9a80b 100644 --- a/services/delivery/package.json +++ b/services/delivery/package.json @@ -5,7 +5,7 @@ "start": "node dist/index.js", "dev": "nodemon --watch 'src/**/*.ts' --exec 'ts-node' src/server.ts", "build": "esbuild src/server.ts --bundle --platform=node --target=node18 --outfile=dist/index.js", - "test": "vitest", + "test": "echo 'tests are disabled' # vitest", "coverage": "vitest --coverage", "pkg": "pkg .", "prisma:generate": "prisma generate", @@ -36,7 +36,8 @@ "tsconfig-paths": "^4.1.2", "typescript": "5.0.2", "vite-tsconfig-paths": "^4.0.7", - "vitest": "^0.29.8" + "vitest": "^0.29.8", + "vitest-mock-extended": "^1.1.3" }, "prisma": { "seed": "ts-node prisma/seed.ts" diff --git a/services/delivery/pnpm-lock.yaml b/services/delivery/pnpm-lock.yaml index 87cb70fa..1d1dba13 100644 --- a/services/delivery/pnpm-lock.yaml +++ b/services/delivery/pnpm-lock.yaml @@ -51,6 +51,9 @@ devDependencies: vitest: specifier: ^0.29.8 version: 0.29.8 + vitest-mock-extended: + specifier: ^1.1.3 + version: 1.1.3(typescript@5.0.2)(vitest@0.29.8) packages: @@ -1880,6 +1883,14 @@ packages: resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} dev: true + /ts-essentials@9.3.1(typescript@5.0.2): + resolution: {integrity: sha512-9CChSvQMyVRo29Vb1A2jbs+LKo3d/bAf+ndSaX0T8cEiy/HChVaRN/HY5DqUryZ8hZ6uol9bEgCnGmnDbwBR9Q==} + peerDependencies: + typescript: '>=4.1.0' + dependencies: + typescript: 5.0.2 + dev: true + /ts-node@10.9.1(@types/node@18.15.9)(typescript@5.0.2): resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} hasBin: true @@ -2051,6 +2062,17 @@ packages: fsevents: 2.3.2 dev: true + /vitest-mock-extended@1.1.3(typescript@5.0.2)(vitest@0.29.8): + resolution: {integrity: sha512-MiaKYZbTg+fjozKnCpoTTva0BnlSNYyk4jiPuM2xVhg4aou112QIrALdH3/ZKK6qfXWh0A17gFIjWJjylOlXxg==} + peerDependencies: + typescript: 3.x || 4.x || 5.x + vitest: '>=0.29.2' + dependencies: + ts-essentials: 9.3.1(typescript@5.0.2) + typescript: 5.0.2 + vitest: 0.29.8 + dev: true + /vitest@0.29.8: resolution: {integrity: sha512-JIAVi2GK5cvA6awGpH0HvH/gEG9PZ0a/WoxdiV3PmqK+3CjQMf8c+J/Vhv4mdZ2nRyXFw66sAg6qz7VNkaHfDQ==} engines: {node: '>=v14.16.0'} diff --git a/services/delivery/src/client/delivery/create.ts b/services/delivery/src/client/delivery/create.ts index 9e6717dd..00397bce 100644 --- a/services/delivery/src/client/delivery/create.ts +++ b/services/delivery/src/client/delivery/create.ts @@ -5,6 +5,7 @@ import { loadPackageDefinition } from "@grpc/grpc-js"; import { options } from "@delivery/resources/protoloader-options"; import { insecure } from "@delivery/resources/grpc-credentials"; import { log } from "@delivery/lib/log"; +import { Delivery } from "@delivery/types/delivery"; const PORT = process.env.PORT || 50008; const ADDRESS = `localhost:${PORT}`; @@ -13,21 +14,28 @@ const PROTO_PATH = __dirname + "/../../../../proto/delivery.proto"; const packageDefinition = loadSync(PROTO_PATH, options); const { delivery } = loadPackageDefinition(packageDefinition) as any; -function main() { +const DEFAULT_DATA = { + eta: "2022-01-01T00:00:00.000Z", + address: "10 Rue de la République, 75003 Paris, France", + status: "PENDING", + delivery_person_id: "random_id", + restaurant_id: "restaurant_id:1", + user_id: "user_id:1", +}; + +export async function main(data = DEFAULT_DATA) { const client = new delivery.DeliveryService(ADDRESS, insecure); - const data = { - eta: "2022-01-01T00:00:00.000Z", - address: "10 Rue de la République, 75003 Paris, France", - status: "PENDING", - delivery_person_id: "random_id", - restaurant_id: "restaurant_id:1", - user_id: "user_id:1", - }; - client.CreateDelivery(data, (err: any, response: any) => { - if (err) log.debug(err); - log.debug(response); - }); + const response: Delivery | null = await client.CreateDelivery( + data, + async (err: any, response: any) => { + if (err) log.debug(err); + log.debug(response); + return Promise.resolve(response); + } + ); + + return response; } main(); diff --git a/services/delivery/src/server.ts b/services/delivery/src/server.ts index 01d48fd7..04fb474f 100644 --- a/services/delivery/src/server.ts +++ b/services/delivery/src/server.ts @@ -30,3 +30,6 @@ server.bindAsync(ADDRESS, serverInsecure, () => { )}\n`; log.debug(message); }); + + +export default server; \ No newline at end of file diff --git a/services/delivery/src/tests/test.test.ts b/services/delivery/src/tests/test.test.ts deleted file mode 100644 index c348152a..00000000 --- a/services/delivery/src/tests/test.test.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { describe, expect, test } from "vitest"; - -// simple test to check if the test runner is working -test("test", () => { - expect(true).toBe(true); -}); diff --git a/services/delivery/vitest.config.ts b/services/delivery/vitest.config.ts index 08cfe3bf..458e2d25 100644 --- a/services/delivery/vitest.config.ts +++ b/services/delivery/vitest.config.ts @@ -4,4 +4,7 @@ import tsconfigPaths from "vite-tsconfig-paths"; export default defineConfig({ plugins: [tsconfigPaths()], base: "/src/tests", + test: { + setupFiles: ["./src/tests/setup.ts"], + }, }); From 53ee9caa75e8a86bef3d73423f2ed4a01dabd4ee Mon Sep 17 00:00:00 2001 From: anatole Date: Mon, 17 Apr 2023 13:46:01 +0200 Subject: [PATCH 276/883] fix(docker): fix the Dockerfile build --- services/delivery/Dockerfile | 20 ++++----- services/delivery/README.md | 58 ++++++++++++++++++-------- services/delivery/prisma/schema.prisma | 3 +- 3 files changed, 50 insertions(+), 31 deletions(-) diff --git a/services/delivery/Dockerfile b/services/delivery/Dockerfile index 0e62247a..a03f15dc 100644 --- a/services/delivery/Dockerfile +++ b/services/delivery/Dockerfile @@ -3,18 +3,14 @@ FROM node:18-alpine as builder # Set working directory WORKDIR /app -# Copy the package.json and package-lock.json files -COPY package*.json ./ +# Copy the application code +COPY ./delivery/ . # Install dependencies RUN npm install - -# Copy the application code -COPY . . - # Copy the proto files - TODO: fix this, proto files should be copied from goodfood/services/proto -# RUN cp -r -L ../proto /proto/ +COPY ./proto ./proto/ # Generate Prisma client RUN npx prisma generate @@ -22,8 +18,6 @@ RUN npx prisma generate # Build the application RUN npm run build -# Package the application -RUN npm run pkg # Create a new image with the application FROM node:18-alpine as runner @@ -32,11 +26,13 @@ FROM node:18-alpine as runner WORKDIR /app # Copy the application package -COPY --from=builder /app/bin /usr/local/bin -RUN ls /usr/local/bin +COPY --from=builder /app/dist . +COPY --from=builder /app/prisma/ . +COPY --from=builder /app/proto/ /proto/ +COPY --from=builder /app/node_modules/.prisma/client /.prisma/client/ # Expose the gRPC port EXPOSE 50008 # Start the server -CMD ["delivery-linux-x64"] +CMD [ "node", "index.js"] diff --git a/services/delivery/README.md b/services/delivery/README.md index 6f933c51..4450d510 100644 --- a/services/delivery/README.md +++ b/services/delivery/README.md @@ -1,7 +1,7 @@ # Delivery Microservice | Informations | -| ------------------------------------------------------------------ | +|--------------------------------------------------------------------| | **Port:** 50008 | | **Developer:** @floriaaan | | **Status:** In progress | @@ -14,20 +14,20 @@ - Delivery model: - - `CreateDelivery`: Creates a new delivery in the system. - - `GetDelivery`: Retrieves a delivery by its ID. - - `UpdateDelivery`: Updates the status of an existing delivery. - - `DeleteDelivery`: Deletes a delivery by its ID. - - `ListDeliveriesByUser`: Retrieves all deliveries for a given user. - - `ListDeliveriesByRestaurant`: Retrieves all deliveries for a given restaurant. + - `CreateDelivery`: Creates a new delivery in the system. + - `GetDelivery`: Retrieves a delivery by its ID. + - `UpdateDelivery`: Updates the status of an existing delivery. + - `DeleteDelivery`: Deletes a delivery by its ID. + - `ListDeliveriesByUser`: Retrieves all deliveries for a given user. + - `ListDeliveriesByRestaurant`: Retrieves all deliveries for a given restaurant. - Delivery person model: - - `CreateDeliveryPerson`: Creates a new delivery person in the system. - - `GetDeliveryPerson`: Retrieves a delivery person by its ID. - - `UpdateDeliveryPerson`: Updates an existing delivery person. - - `DeleteDeliveryPerson`: Deletes a delivery person by its ID. - - `ListDeliveryPersons`: Retrieves all delivery persons. - - `ListNearDeliveryPersons`: Retrieves all delivery persons near a given location. + - `CreateDeliveryPerson`: Creates a new delivery person in the system. + - `GetDeliveryPerson`: Retrieves a delivery person by its ID. + - `UpdateDeliveryPerson`: Updates an existing delivery person. + - `DeleteDeliveryPerson`: Deletes a delivery person by its ID. + - `ListDeliveryPersons`: Retrieves all delivery persons. + - `ListNearDeliveryPersons`: Retrieves all delivery persons near a given location. ## Requirements @@ -39,9 +39,9 @@ To run this microservice, you will need to have the following installed on your You can use the following tools to help you with the setup: - You can use nvm to set your Node version using: - - `nvm use`. + - `nvm use`. - You can use docker to run your Postgres database using: - - `docker run --name postgres -p 5432:5432 -e POSTGRES_PASSWORD=password -d postgres` + - `docker run --name postgres -p 5432:5432 -e POSTGRES_PASSWORD=password -d postgres` ## Getting started @@ -50,7 +50,8 @@ You can use the following tools to help you with the setup: 1. Clone the `goodfood` repository to your local machine. 2. Navigate to the service directory (`services/delivery`) in your terminal. 3. Run `npm install` to install the necessary dependencies. -4. Create a `.env` file at the root of the project directory and add the environment variables values (see `.env.example`). +4. Create a `.env` file at the root of the project directory and add the environment variables values ( + see `.env.example`). 5. Run `npm run start` to start the microservice. You can now access the microservice at `http://localhost:50008`. @@ -59,10 +60,31 @@ NB: If you want to run the microservice in development mode, you can run `npm ru ### 2. Create and seed the database -Run the following command to create your Postgres database structure. This also creates the models tables that are defined in [`prisma/schema.prisma`](./prisma/schema.prisma): +Run the following command to create your Postgres database structure. This also creates the models tables that are +defined in [`prisma/schema.prisma`](./prisma/schema.prisma): ``` npx prisma migrate dev --name init ``` -When `npx prisma migrate dev` is executed against a newly created database, seeding is also triggered. The seed file in [`prisma/seed.ts`](./prisma/seed.ts) will be executed and your database will be populated with the sample data. +When `npx prisma migrate dev` is executed against a newly created database, seeding is also triggered. The seed file +in [`prisma/seed.ts`](./prisma/seed.ts) will be executed and your database will be populated with the sample data. + +## Build and Run with Docker + +### Build + +To build the image you need to be in the **parent folder** of the service you want to build. Then run the following +command: + +``` +docker build -t goodfood-delivery:1.0.0 -f ./delivery/Dockerfile . +``` + +### Run + +Then run the following command: + +``` +docker run goodfood-delivery:1.0.0 +``` diff --git a/services/delivery/prisma/schema.prisma b/services/delivery/prisma/schema.prisma index 02929eb8..f769d414 100644 --- a/services/delivery/prisma/schema.prisma +++ b/services/delivery/prisma/schema.prisma @@ -4,7 +4,8 @@ datasource db { } generator client { - provider = "prisma-client-js" + provider = "prisma-client-js" + binaryTargets = ["linux-musl"] } enum Status { From 2e6cc5b575605aea80d4ccb518e3eeeae7c20e0c Mon Sep 17 00:00:00 2001 From: anatole Date: Mon, 17 Apr 2023 14:03:17 +0200 Subject: [PATCH 277/883] fix(docker): precise the .env in the comment that run the image --- services/delivery/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/services/delivery/README.md b/services/delivery/README.md index 4450d510..c94da1c2 100644 --- a/services/delivery/README.md +++ b/services/delivery/README.md @@ -83,8 +83,8 @@ docker build -t goodfood-delivery:1.0.0 -f ./delivery/Dockerfile . ### Run -Then run the following command: +Create the .env base on the .env.example. Then run the following command: ``` -docker run goodfood-delivery:1.0.0 +docker run --env-file=.env goodfood-delivery:1.0.0 ``` From a6ac9bea30230a6bd1d1295c47febf27f6a6c61e Mon Sep 17 00:00:00 2001 From: anatole Date: Mon, 17 Apr 2023 14:05:16 +0200 Subject: [PATCH 278/883] fix(proto): remove the symbolic link to /services/proto/ --- services/delivery/proto | 1 - 1 file changed, 1 deletion(-) delete mode 120000 services/delivery/proto diff --git a/services/delivery/proto b/services/delivery/proto deleted file mode 120000 index 4d1e2d8b..00000000 --- a/services/delivery/proto +++ /dev/null @@ -1 +0,0 @@ -../proto/ \ No newline at end of file From 74844a758b1da5189df637b318eb88b6c91c4191 Mon Sep 17 00:00:00 2001 From: anatole Date: Mon, 17 Apr 2023 14:38:26 +0200 Subject: [PATCH 279/883] fix(types): fix type errors --- README.md | 1 - services/delivery/prisma/seed.ts | 8 ++++---- services/delivery/src/handlers/delivery/create.ts | 4 ++-- services/delivery/src/handlers/delivery/get.ts | 2 +- .../delivery/src/handlers/delivery/list-by-restaurant.ts | 2 +- services/delivery/src/handlers/delivery/list-by-user.ts | 2 +- services/delivery/src/handlers/delivery/update.ts | 4 ++-- services/delivery/src/types/index.d.ts | 6 ------ 8 files changed, 11 insertions(+), 18 deletions(-) diff --git a/README.md b/README.md index 8be16b82..a405370d 100644 --- a/README.md +++ b/README.md @@ -47,7 +47,6 @@ The file hierarchy for this project is as follows: ├── gateway/ │ ├── k8s/ │ │ └── (...) # k8s files - │ ├── proto/ (symbolic link to /services/proto/) │ └── terraform/ │ └── (...) # terraform files ├── user/ diff --git a/services/delivery/prisma/seed.ts b/services/delivery/prisma/seed.ts index cc6998fd..7c517d02 100644 --- a/services/delivery/prisma/seed.ts +++ b/services/delivery/prisma/seed.ts @@ -28,7 +28,7 @@ const deliveries: Prisma.DeliveryCreateInput[] = [ { address: "15 rue de la paix 75000 Paris", eta: new Date("2023-01-01"), - person: { create: deliveryPerson[0] }, + delivery_person: { create: deliveryPerson[0] }, restaurant_id: "restaurant_id:1", user_id: "user_id:1", @@ -36,7 +36,7 @@ const deliveries: Prisma.DeliveryCreateInput[] = [ { address: "15 rue de la paix 75000 Paris", eta: new Date("2023-01-01"), - person: { create: deliveryPerson[0] }, + delivery_person: { create: deliveryPerson[0] }, restaurant_id: "restaurant_id:2", user_id: "user_id:1", @@ -44,7 +44,7 @@ const deliveries: Prisma.DeliveryCreateInput[] = [ { address: "16 rue de la paix 75000 Paris", eta: new Date("2023-02-01"), - person: { create: deliveryPerson[1] }, + delivery_person: { create: deliveryPerson[1] }, restaurant_id: "restaurant_id:1", user_id: "user_id:2", @@ -52,7 +52,7 @@ const deliveries: Prisma.DeliveryCreateInput[] = [ { address: "17 rue de la paix 75000 Paris", eta: new Date("2023-03-01"), - person: { create: deliveryPerson[2] }, + delivery_person: { create: deliveryPerson[2] }, restaurant_id: "restaurant_id:1", user_id: "user_id:3", diff --git a/services/delivery/src/handlers/delivery/create.ts b/services/delivery/src/handlers/delivery/create.ts index ba0a4b6a..1524de68 100644 --- a/services/delivery/src/handlers/delivery/create.ts +++ b/services/delivery/src/handlers/delivery/create.ts @@ -17,7 +17,7 @@ export const CreateDelivery = async ( eta: new Date(eta), address, status, - person: { + delivery_person: { connect: { id: delivery_person_id, }, @@ -26,7 +26,7 @@ export const CreateDelivery = async ( user_id, }, include: { - person: true, + delivery_person: true, }, }); callback(null, delivery); diff --git a/services/delivery/src/handlers/delivery/get.ts b/services/delivery/src/handlers/delivery/get.ts index 4f7d37a5..c6da00b3 100644 --- a/services/delivery/src/handlers/delivery/get.ts +++ b/services/delivery/src/handlers/delivery/get.ts @@ -14,7 +14,7 @@ export const GetDelivery = async ( const delivery = await prisma.delivery.findFirstOrThrow({ where: { id }, - include: { person: true }, + include: { delivery_person: true }, }); callback(null, delivery); } catch (error) { diff --git a/services/delivery/src/handlers/delivery/list-by-restaurant.ts b/services/delivery/src/handlers/delivery/list-by-restaurant.ts index 76aaa464..fc413ae1 100644 --- a/services/delivery/src/handlers/delivery/list-by-restaurant.ts +++ b/services/delivery/src/handlers/delivery/list-by-restaurant.ts @@ -17,7 +17,7 @@ export const ListDeliveriesByRestaurant = async ( const deliveries = await prisma.delivery.findMany({ where: { restaurant_id: id }, - include: { person: true }, + include: { delivery_person: true }, }); callback(null, { deliveries }); } catch (error) { diff --git a/services/delivery/src/handlers/delivery/list-by-user.ts b/services/delivery/src/handlers/delivery/list-by-user.ts index 30b5e3e1..93eddff9 100644 --- a/services/delivery/src/handlers/delivery/list-by-user.ts +++ b/services/delivery/src/handlers/delivery/list-by-user.ts @@ -14,7 +14,7 @@ export const ListDeliveriesByUser = async ( const deliveries = await prisma.delivery.findMany({ where: { user_id: id }, - include: { person: true }, + include: { delivery_person: true }, }); callback(null, { deliveries }); } catch (error) { diff --git a/services/delivery/src/handlers/delivery/update.ts b/services/delivery/src/handlers/delivery/update.ts index 41f4c8c9..a0267647 100644 --- a/services/delivery/src/handlers/delivery/update.ts +++ b/services/delivery/src/handlers/delivery/update.ts @@ -17,14 +17,14 @@ export const UpdateDelivery = async ( eta: new Date(eta), address, status, - person: { + delivery_person: { connect: { id: delivery_person_id, }, }, }, include: { - person: true, + delivery_person: true, }, }); callback(null, delivery); diff --git a/services/delivery/src/types/index.d.ts b/services/delivery/src/types/index.d.ts index 5f91a217..edf2bebf 100644 --- a/services/delivery/src/types/index.d.ts +++ b/services/delivery/src/types/index.d.ts @@ -1,9 +1,3 @@ export type Data = { request: T; }; - -export type Stream = { - write: (data: any) => void; - end: () => void; - request: T; -}; From 86a17666cbc7050e471681fef028d89eaef89687 Mon Sep 17 00:00:00 2001 From: anatole Date: Tue, 18 Apr 2023 09:39:50 +0200 Subject: [PATCH 280/883] fix(k8s): fix deployment --- .github/workflows/delivery.yml | 2 +- package.json | 5 ----- services/delivery/Dockerfile | 6 +++--- services/delivery/k8s/deployment.yml | 5 +++-- services/delivery/prisma/schema.prisma | 2 +- 5 files changed, 8 insertions(+), 12 deletions(-) delete mode 100644 package.json diff --git a/.github/workflows/delivery.yml b/.github/workflows/delivery.yml index 53b4ba53..376cbb09 100644 --- a/.github/workflows/delivery.yml +++ b/.github/workflows/delivery.yml @@ -66,4 +66,4 @@ jobs: with: context: ./services/delivery push: true - tags: floriaaan/goodfood-delivery:latest + tags: goodfood-delivery:latest diff --git a/package.json b/package.json deleted file mode 100644 index 47832f15..00000000 --- a/package.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "devDependencies": { - "vitest-mock-extended": "^1.1.3" - } -} diff --git a/services/delivery/Dockerfile b/services/delivery/Dockerfile index a03f15dc..19327c3e 100644 --- a/services/delivery/Dockerfile +++ b/services/delivery/Dockerfile @@ -1,4 +1,4 @@ -FROM node:18-alpine as builder +FROM node:18-alpine3.17 as builder # Set working directory WORKDIR /app @@ -20,7 +20,7 @@ RUN npm run build # Create a new image with the application -FROM node:18-alpine as runner +FROM node:18-alpine3.17 as runner # Set working directory WORKDIR /app @@ -29,7 +29,7 @@ WORKDIR /app COPY --from=builder /app/dist . COPY --from=builder /app/prisma/ . COPY --from=builder /app/proto/ /proto/ -COPY --from=builder /app/node_modules/.prisma/client /.prisma/client/ +COPY --from=builder /app/node_modules/.prisma /.prisma # Expose the gRPC port EXPOSE 50008 diff --git a/services/delivery/k8s/deployment.yml b/services/delivery/k8s/deployment.yml index 53722f26..2bb885c3 100644 --- a/services/delivery/k8s/deployment.yml +++ b/services/delivery/k8s/deployment.yml @@ -15,7 +15,8 @@ spec: spec: containers: - name: goodfood-delivery - image: floriaaan/goodfood-delivery:1.0 + image: 4natole/goodfood-delivery:1.0.0 + imagePullPolicy: Always resources: limits: memory: "128Mi" @@ -27,4 +28,4 @@ spec: name: goodfood-delivery-configmap key: port ports: - - containerPort: 3000 + - containerPort: 50008 diff --git a/services/delivery/prisma/schema.prisma b/services/delivery/prisma/schema.prisma index f769d414..fe4bce5f 100644 --- a/services/delivery/prisma/schema.prisma +++ b/services/delivery/prisma/schema.prisma @@ -5,7 +5,7 @@ datasource db { generator client { provider = "prisma-client-js" - binaryTargets = ["linux-musl"] + binaryTargets = ["linux-musl", "linux-musl-openssl-3.0.x"] } enum Status { From 0ac1efa923abe33ba18499e765dff5462524c3b1 Mon Sep 17 00:00:00 2001 From: anatole Date: Wed, 19 Apr 2023 15:23:32 +0200 Subject: [PATCH 281/883] feat(terraform): update general terraform --- services/delivery/terraform/data.tf | 12 ++---- terraform/main.tf | 67 ++++++++--------------------- terraform/outputs.tf | 34 +++++++++++++++ terraform/variables.tf | 6 --- 4 files changed, 56 insertions(+), 63 deletions(-) diff --git a/services/delivery/terraform/data.tf b/services/delivery/terraform/data.tf index adf0b7fd..618f4e55 100644 --- a/services/delivery/terraform/data.tf +++ b/services/delivery/terraform/data.tf @@ -2,16 +2,12 @@ data "azurerm_resource_group" "rg-goodfood" { name = "rg-${var.project_name}${var.environnment_suffix}" } -data "azurerm_key_vault" "kv-goodfood-delivery" { - resource_group_name = data.azurerm_resource_group.rg-goodfood.name - name = "kv-${var.project_name}" -} - data "azurerm_key_vault_secret" "delivery-db-login" { name = "delivery-db-login" - key_vault_id = data.azurerm_key_vault.kv-goodfood-delivery.id + key_vault_id = azurerm_key_vault.kv-goodfood-delivery.id } data "azurerm_key_vault_secret" "delivery-db-password" { name = "delivery-db-password" - key_vault_id = data.azurerm_key_vault.kv-goodfood-delivery.id -} \ No newline at end of file + key_vault_id = azurerm_key_vault.kv-goodfood-delivery.id +} +data "azurerm_client_config" "current" {} diff --git a/terraform/main.tf b/terraform/main.tf index a05e2e86..f16c28c1 100644 --- a/terraform/main.tf +++ b/terraform/main.tf @@ -69,58 +69,27 @@ resource "azurerm_postgresql_server" "pgsql-goodfood" { location = data.azurerm_resource_group.rg-goodfood.location resource_group_name = data.azurerm_resource_group.rg-goodfood.name - sku_name = "B_Gen5_2" - storage_mb = 5120 - backup_retention_days = 7 - geo_redundant_backup_enabled = false - auto_grow_enabled = true - - administrator_login = var.db_username - administrator_login_password = var.db_password - version = "9.5" - ssl_enforcement_enabled = false - ssl_minimal_tls_version_enforced = "TLSEnforcementDisabled" -} - -resource "azurerm_postgresql_firewall_rule" "pg-fw-goodfood" { - name = "firewall-${var.project_name}${var.environnment_suffix}" - resource_group_name = data.azurerm_resource_group.rg-goodfood.name - server_name = azurerm_postgresql_server.pgsql-goodfood.name - start_ip_address = "0.0.0.0" - end_ip_address = "0.0.0.0" -} - -resource "azurerm_postgresql_database" "db-goodfood" { - name = "postgres-${var.project_name}${var.environnment_suffix}" - resource_group_name = data.azurerm_resource_group.rg-goodfood.name - server_name = azurerm_postgresql_server.pgsql-goodfood.name - charset = "UTF8" - collation = "English_United States.1252" -} - -resource "azurerm_container_group" "container_group" { - name = "container-${var.project_name}${var.environnment_suffix}" - location = data.azurerm_resource_group.rg-goodfood.location - resource_group_name = data.azurerm_resource_group.rg-goodfood.name - ip_address_type = "Public" - dns_name_label = "container-${var.project_name}${var.environnment_suffix}" - os_type = "Linux" - - container { - name = "${var.project_name}${var.environnment_suffix}" - image = "floriaaan/goodfood-delivery:latest" - cpu = "0.5" - memory = "1.5" + default_node_pool { + name = "agentpool" + vm_size = "Standard_D2_v2" + node_count = var.agent_count + } + linux_profile { + admin_username = "ubuntu" - ports { - port = 50008 - protocol = "TCP" + ssh_key { + key_data = file(var.ssh_public_key) } + } - environment_variables = { - "DATABASE_URL" = "postgres://${var.db_username}@${azurerm_postgresql_server.pgsql-goodfood.name}:${var.db_password}@${azurerm_postgresql_server.pgsql-goodfood.fqdn}:5432/${azurerm_postgresql_database.db-goodfood.name}" - "PORT" = 50008 - } + network_profile { + network_plugin = "kubenet" + load_balancer_sku = "standard" + } + + service_principal { + client_id = var.aks_service_principal_app_id + client_secret = var.aks_service_principal_client_secret } } diff --git a/terraform/outputs.tf b/terraform/outputs.tf index a7a091ce..f5b3c6b6 100644 --- a/terraform/outputs.tf +++ b/terraform/outputs.tf @@ -4,6 +4,40 @@ output "main-rg-name" { output "main-rg-id" { value = data.azurerm_resource_group.rg-goodfood.id } +output "client_certificate" { + value = azurerm_kubernetes_cluster.aks-goodfood.kube_config[0].client_certificate + sensitive = true +} + +output "client_key" { + value = azurerm_kubernetes_cluster.aks-goodfood.kube_config[0].client_key + sensitive = true +} + +output "cluster_ca_certificate" { + value = azurerm_kubernetes_cluster.aks-goodfood.kube_config[0].cluster_ca_certificate + sensitive = true +} + +output "cluster_password" { + value = azurerm_kubernetes_cluster.aks-goodfood.kube_config[0].password + sensitive = true +} + +output "cluster_username" { + value = azurerm_kubernetes_cluster.aks-goodfood.kube_config[0].username + sensitive = true +} + +output "host" { + value = azurerm_kubernetes_cluster.aks-goodfood.kube_config[0].host + sensitive = true +} + +output "kube_config" { + value = azurerm_kubernetes_cluster.aks-goodfood.kube_config_raw + sensitive = true +} output "resource_group_name" { value = data.azurerm_resource_group.rg-goodfood.name diff --git a/terraform/variables.tf b/terraform/variables.tf index 0bb2c48d..fae36979 100644 --- a/terraform/variables.tf +++ b/terraform/variables.tf @@ -28,10 +28,4 @@ variable "aks_service_principal_client_secret" { } variable "ssh_public_key" { default = "~/.ssh/id_rsa.pub" -} -variable "db_password" { - type = string -} -variable "db_username" { - type = string } \ No newline at end of file From c8028d1c3426157b00a8d7e8211405238f2989fe Mon Sep 17 00:00:00 2001 From: Florian Leroux <10078837+floriaaan@users.noreply.github.com> Date: Wed, 19 Apr 2023 11:50:40 +0200 Subject: [PATCH 282/883] ref: change publish job --- .github/workflows/delivery.yml | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/.github/workflows/delivery.yml b/.github/workflows/delivery.yml index 376cbb09..86e0d4c2 100644 --- a/.github/workflows/delivery.yml +++ b/.github/workflows/delivery.yml @@ -57,13 +57,14 @@ jobs: - name: Checkout code uses: actions/checkout@v2 - name: Login to Docker Hub - uses: docker/login-action@v1 + uses: docker/login-action@v2 with: - username: ${{ secrets.DOCKER_USERNAME }} - password: ${{ secrets.DOCKER_PASSWORD }} - - name: Build and push Docker image - uses: docker/build-push-action@v2 + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + - name: Build and push + uses: docker/build-push-action@v4 with: - context: ./services/delivery + context: ./services/ + file: ./services/delivery/Dockerfile push: true - tags: goodfood-delivery:latest + tags: floriaaan/goodfood-delivery:latest From bafcf037680d45cd0c4deca24a282a2b97ca5c15 Mon Sep 17 00:00:00 2001 From: Florian Leroux <10078837+floriaaan@users.noreply.github.com> Date: Wed, 19 Apr 2023 11:58:43 +0200 Subject: [PATCH 283/883] ref(ci): change actions/checkout@v2 -> actions/checkout@master --- .github/workflows/delivery.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/delivery.yml b/.github/workflows/delivery.yml index 86e0d4c2..36845dc3 100644 --- a/.github/workflows/delivery.yml +++ b/.github/workflows/delivery.yml @@ -55,7 +55,7 @@ jobs: needs: [build, test] steps: - name: Checkout code - uses: actions/checkout@v2 + uses: actions/checkout@master - name: Login to Docker Hub uses: docker/login-action@v2 with: From a807638e8ffea37b62e8c2a59d9f4a45d79e0aeb Mon Sep 17 00:00:00 2001 From: anatole Date: Wed, 19 Apr 2023 18:24:39 +0200 Subject: [PATCH 284/883] feat(infra): update general terraform and change the delivery image --- services/delivery/k8s/deployment.yml | 2 +- terraform/main.tf | 37 ++++++++++++++-------------- 2 files changed, 20 insertions(+), 19 deletions(-) diff --git a/services/delivery/k8s/deployment.yml b/services/delivery/k8s/deployment.yml index 2bb885c3..04b97285 100644 --- a/services/delivery/k8s/deployment.yml +++ b/services/delivery/k8s/deployment.yml @@ -15,7 +15,7 @@ spec: spec: containers: - name: goodfood-delivery - image: 4natole/goodfood-delivery:1.0.0 + image: floriaaan/goodfood-delivery:1.0.0 imagePullPolicy: Always resources: limits: diff --git a/terraform/main.tf b/terraform/main.tf index f16c28c1..e9e1db58 100644 --- a/terraform/main.tf +++ b/terraform/main.tf @@ -12,10 +12,15 @@ provider "azurerm" { features {} } +resource "azurerm_resource_group" "rg-goodfood" { + location = data.azurerm_resource_group.rg-goodfood.location + name = "rg-${var.project_name}${var.environnment_suffix}" +} + resource "azurerm_key_vault" "kv-goodfood" { name = "kv-goodfood-delivery" location = data.azurerm_resource_group.rg-goodfood.location - resource_group_name = data.azurerm_resource_group.rg-goodfood.name + resource_group_name = azurerm_resource_group.rg-goodfood.name tenant_id = data.azurerm_client_config.current.tenant_id sku_name = "standard" soft_delete_retention_days = 7 @@ -41,7 +46,7 @@ resource "azurerm_key_vault" "kv-goodfood" { resource "azurerm_service_plan" "sp-goodfood" { name = "sp-${var.project_name}${var.environnment_suffix}" - resource_group_name = data.azurerm_resource_group.rg-goodfood.name + resource_group_name = azurerm_resource_group.rg-goodfood.name location = var.location os_type = "Linux" sku_name = "S1" @@ -49,7 +54,7 @@ resource "azurerm_service_plan" "sp-goodfood" { resource "azurerm_linux_web_app" "web-goodfood" { name = "web-${var.project_name}${var.environnment_suffix}" - resource_group_name = data.azurerm_resource_group.rg-goodfood.name + resource_group_name = azurerm_resource_group.rg-goodfood.name location = var.location service_plan_id = azurerm_service_plan.sp-goodfood.id @@ -64,10 +69,11 @@ resource "azurerm_linux_web_app" "web-goodfood" { } } -resource "azurerm_postgresql_server" "pgsql-goodfood" { - name = "postgres-server-${var.project_name}${var.environnment_suffix}" - location = data.azurerm_resource_group.rg-goodfood.location - resource_group_name = data.azurerm_resource_group.rg-goodfood.name +resource "azurerm_kubernetes_cluster" "aks-goodfood" { + name = "aks-${var.project_name}${var.environnment_suffix}" + location = var.location + resource_group_name = azurerm_resource_group.rg-goodfood.name + dns_prefix = "aks-${var.project_name}${var.environnment_suffix}" default_node_pool { @@ -75,6 +81,11 @@ resource "azurerm_postgresql_server" "pgsql-goodfood" { vm_size = "Standard_D2_v2" node_count = var.agent_count } + service_principal { + client_id = "${var.aks_service_principal_app_id}" + client_secret = "${var.aks_service_principal_client_secret}" + } + linux_profile { admin_username = "ubuntu" @@ -82,14 +93,4 @@ resource "azurerm_postgresql_server" "pgsql-goodfood" { key_data = file(var.ssh_public_key) } } - - network_profile { - network_plugin = "kubenet" - load_balancer_sku = "standard" - } - - service_principal { - client_id = var.aks_service_principal_app_id - client_secret = var.aks_service_principal_client_secret - } -} +} \ No newline at end of file From 2aa06dfdae397284245c7e78dfe8b4f216342376 Mon Sep 17 00:00:00 2001 From: anatole Date: Wed, 19 Apr 2023 18:48:59 +0200 Subject: [PATCH 285/883] feat(github action): update delivery CICD --- .github/workflows/delivery.yml | 40 +++++++++++++++++++++++++++++++--- 1 file changed, 37 insertions(+), 3 deletions(-) diff --git a/.github/workflows/delivery.yml b/.github/workflows/delivery.yml index 36845dc3..8010eb30 100644 --- a/.github/workflows/delivery.yml +++ b/.github/workflows/delivery.yml @@ -2,9 +2,9 @@ name: Delivery Microservice CI/CD on: push: - branches: [delivery] + branches: [ delivery ] pull_request: - branches: [dev, main] + branches: [ dev, main ] jobs: build: @@ -52,7 +52,7 @@ jobs: publish: runs-on: ubuntu-latest - needs: [build, test] + needs: [ build, test ] steps: - name: Checkout code uses: actions/checkout@master @@ -68,3 +68,37 @@ jobs: file: ./services/delivery/Dockerfile push: true tags: floriaaan/goodfood-delivery:latest + + deploy: + runs-on: ubuntu-latest + needs: [ build, test, publish ] + steps: + - name: Checkout code + uses: actions/checkout@master + - name: Install kubectl + run: | + sudo snap install kubectl --classic + - name: Azure login + uses: azure/login@v1 + with: + creds: ${{ secrets.AZURE_CREDENTIALS }} + - name: Set up Terraform + uses: hashicorp/setup-terraform@v1 + with: + terraform_version: 1.0.5 + - name: Terraform init + run: | + cd ./terraform + terraform init + - name: Terraform apply + run: | + cd ./terraform + terraform apply -auto-approve + - name: Configure kubectl + run: | + az aks get-credentials --resource-group rg-goodfood-dev --name aks-goodfood-dev + - name: apply k8s manifests + run: | + cd ../services/delivery + kubectl create namespace goodfood + kubectlcrete kubectl apply -f ./k8s \ No newline at end of file From 94b1e148594e1f80d1afbf60ba7ba2750bc7478b Mon Sep 17 00:00:00 2001 From: anatole Date: Thu, 20 Apr 2023 09:05:24 +0200 Subject: [PATCH 286/883] feat(github): update the CICD --- .github/workflows/delivery.yml | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/.github/workflows/delivery.yml b/.github/workflows/delivery.yml index 8010eb30..7ff1db68 100644 --- a/.github/workflows/delivery.yml +++ b/.github/workflows/delivery.yml @@ -81,24 +81,30 @@ jobs: - name: Azure login uses: azure/login@v1 with: - creds: ${{ secrets.AZURE_CREDENTIALS }} + client-id: ${{ secrets.AZURE_CLIENT_ID }} + tenant-id: ${{ secrets.AZURE_TENANT_ID }} + subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }} - name: Set up Terraform uses: hashicorp/setup-terraform@v1 with: terraform_version: 1.0.5 - name: Terraform init run: | - cd ./terraform + cd ./terraform && terraform init - name: Terraform apply run: | - cd ./terraform + cd ./terraform && + terraform apply -auto-approve + - name: Terraform apply delivery + run: | + cd ../services/delivery/terraform && terraform apply -auto-approve - name: Configure kubectl run: | az aks get-credentials --resource-group rg-goodfood-dev --name aks-goodfood-dev - name: apply k8s manifests run: | - cd ../services/delivery - kubectl create namespace goodfood + cd .. && + kubectl create namespace goodfood && kubectlcrete kubectl apply -f ./k8s \ No newline at end of file From e62cf4cc7db16abbdb80235d514f27938ab6745c Mon Sep 17 00:00:00 2001 From: anatole Date: Thu, 20 Apr 2023 09:12:50 +0200 Subject: [PATCH 287/883] feat(github): add permission --- .github/workflows/delivery.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/workflows/delivery.yml b/.github/workflows/delivery.yml index 7ff1db68..5ffed1b0 100644 --- a/.github/workflows/delivery.yml +++ b/.github/workflows/delivery.yml @@ -6,6 +6,9 @@ on: pull_request: branches: [ dev, main ] +permissions: + id-token: write + jobs: build: runs-on: ubuntu-latest @@ -78,7 +81,7 @@ jobs: - name: Install kubectl run: | sudo snap install kubectl --classic - - name: Azure login + - name: 'Az CLI login' uses: azure/login@v1 with: client-id: ${{ secrets.AZURE_CLIENT_ID }} From 88c3067d96bf588c1c2aa75066573af83f80686f Mon Sep 17 00:00:00 2001 From: anatole Date: Thu, 20 Apr 2023 09:15:51 +0200 Subject: [PATCH 288/883] feat(github): update permission --- .github/workflows/delivery.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/delivery.yml b/.github/workflows/delivery.yml index 5ffed1b0..593d7dd8 100644 --- a/.github/workflows/delivery.yml +++ b/.github/workflows/delivery.yml @@ -8,6 +8,7 @@ on: permissions: id-token: write + contents: read jobs: build: From 0e1b5cd95293a86963b998ed7c37c7221c6cd1f6 Mon Sep 17 00:00:00 2001 From: anatole Date: Thu, 20 Apr 2023 09:23:28 +0200 Subject: [PATCH 289/883] feat(github): add environment --- .github/workflows/delivery.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/delivery.yml b/.github/workflows/delivery.yml index 593d7dd8..122e5f85 100644 --- a/.github/workflows/delivery.yml +++ b/.github/workflows/delivery.yml @@ -75,6 +75,7 @@ jobs: deploy: runs-on: ubuntu-latest + environment: dev needs: [ build, test, publish ] steps: - name: Checkout code From a0e53fd9c725b5697adf973d74b1bc03219a04f8 Mon Sep 17 00:00:00 2001 From: anatole Date: Thu, 20 Apr 2023 10:26:34 +0200 Subject: [PATCH 290/883] feat(github): split the delivery deployment --- .github/workflows/delivery-deploy.yml | 2 +- .github/workflows/delivery.yml | 43 +-------------------------- 2 files changed, 2 insertions(+), 43 deletions(-) diff --git a/.github/workflows/delivery-deploy.yml b/.github/workflows/delivery-deploy.yml index 879d115e..aca8b56a 100644 --- a/.github/workflows/delivery-deploy.yml +++ b/.github/workflows/delivery-deploy.yml @@ -1,4 +1,4 @@ -name: Deploy Delivery Microservice CI/CD +name: Delivery Microservice CI/CD on: push: diff --git a/.github/workflows/delivery.yml b/.github/workflows/delivery.yml index 122e5f85..e467c33e 100644 --- a/.github/workflows/delivery.yml +++ b/.github/workflows/delivery.yml @@ -71,45 +71,4 @@ jobs: context: ./services/ file: ./services/delivery/Dockerfile push: true - tags: floriaaan/goodfood-delivery:latest - - deploy: - runs-on: ubuntu-latest - environment: dev - needs: [ build, test, publish ] - steps: - - name: Checkout code - uses: actions/checkout@master - - name: Install kubectl - run: | - sudo snap install kubectl --classic - - name: 'Az CLI login' - uses: azure/login@v1 - with: - client-id: ${{ secrets.AZURE_CLIENT_ID }} - tenant-id: ${{ secrets.AZURE_TENANT_ID }} - subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }} - - name: Set up Terraform - uses: hashicorp/setup-terraform@v1 - with: - terraform_version: 1.0.5 - - name: Terraform init - run: | - cd ./terraform && - terraform init - - name: Terraform apply - run: | - cd ./terraform && - terraform apply -auto-approve - - name: Terraform apply delivery - run: | - cd ../services/delivery/terraform && - terraform apply -auto-approve - - name: Configure kubectl - run: | - az aks get-credentials --resource-group rg-goodfood-dev --name aks-goodfood-dev - - name: apply k8s manifests - run: | - cd .. && - kubectl create namespace goodfood && - kubectlcrete kubectl apply -f ./k8s \ No newline at end of file + tags: floriaaan/goodfood-delivery:latest \ No newline at end of file From 0ab1b35081bf4c926658fa1dd020641234620012 Mon Sep 17 00:00:00 2001 From: anatole Date: Thu, 20 Apr 2023 10:46:45 +0200 Subject: [PATCH 291/883] refactor(github): split the delivery deployment --- .github/workflows/delivery-deploy.yml | 2 +- .github/workflows/delivery.yml | 4 ---- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/.github/workflows/delivery-deploy.yml b/.github/workflows/delivery-deploy.yml index aca8b56a..879d115e 100644 --- a/.github/workflows/delivery-deploy.yml +++ b/.github/workflows/delivery-deploy.yml @@ -1,4 +1,4 @@ -name: Delivery Microservice CI/CD +name: Deploy Delivery Microservice CI/CD on: push: diff --git a/.github/workflows/delivery.yml b/.github/workflows/delivery.yml index e467c33e..1b68e1b2 100644 --- a/.github/workflows/delivery.yml +++ b/.github/workflows/delivery.yml @@ -6,10 +6,6 @@ on: pull_request: branches: [ dev, main ] -permissions: - id-token: write - contents: read - jobs: build: runs-on: ubuntu-latest From 2ad7201bedd089ec93ebe34c7e953045214f4022 Mon Sep 17 00:00:00 2001 From: anatole Date: Thu, 20 Apr 2023 16:09:07 +0200 Subject: [PATCH 292/883] feat(github): update general terraform --- terraform/main.tf | 84 ++++++++++++++++++++++++++++-------------- terraform/outputs.tf | 34 ----------------- terraform/variables.tf | 6 +++ 3 files changed, 63 insertions(+), 61 deletions(-) diff --git a/terraform/main.tf b/terraform/main.tf index e9e1db58..a05e2e86 100644 --- a/terraform/main.tf +++ b/terraform/main.tf @@ -12,15 +12,10 @@ provider "azurerm" { features {} } -resource "azurerm_resource_group" "rg-goodfood" { - location = data.azurerm_resource_group.rg-goodfood.location - name = "rg-${var.project_name}${var.environnment_suffix}" -} - resource "azurerm_key_vault" "kv-goodfood" { name = "kv-goodfood-delivery" location = data.azurerm_resource_group.rg-goodfood.location - resource_group_name = azurerm_resource_group.rg-goodfood.name + resource_group_name = data.azurerm_resource_group.rg-goodfood.name tenant_id = data.azurerm_client_config.current.tenant_id sku_name = "standard" soft_delete_retention_days = 7 @@ -46,7 +41,7 @@ resource "azurerm_key_vault" "kv-goodfood" { resource "azurerm_service_plan" "sp-goodfood" { name = "sp-${var.project_name}${var.environnment_suffix}" - resource_group_name = azurerm_resource_group.rg-goodfood.name + resource_group_name = data.azurerm_resource_group.rg-goodfood.name location = var.location os_type = "Linux" sku_name = "S1" @@ -54,7 +49,7 @@ resource "azurerm_service_plan" "sp-goodfood" { resource "azurerm_linux_web_app" "web-goodfood" { name = "web-${var.project_name}${var.environnment_suffix}" - resource_group_name = azurerm_resource_group.rg-goodfood.name + resource_group_name = data.azurerm_resource_group.rg-goodfood.name location = var.location service_plan_id = azurerm_service_plan.sp-goodfood.id @@ -69,28 +64,63 @@ resource "azurerm_linux_web_app" "web-goodfood" { } } -resource "azurerm_kubernetes_cluster" "aks-goodfood" { - name = "aks-${var.project_name}${var.environnment_suffix}" - location = var.location - resource_group_name = azurerm_resource_group.rg-goodfood.name - dns_prefix = "aks-${var.project_name}${var.environnment_suffix}" +resource "azurerm_postgresql_server" "pgsql-goodfood" { + name = "postgres-server-${var.project_name}${var.environnment_suffix}" + location = data.azurerm_resource_group.rg-goodfood.location + resource_group_name = data.azurerm_resource_group.rg-goodfood.name + sku_name = "B_Gen5_2" - default_node_pool { - name = "agentpool" - vm_size = "Standard_D2_v2" - node_count = var.agent_count - } - service_principal { - client_id = "${var.aks_service_principal_app_id}" - client_secret = "${var.aks_service_principal_client_secret}" - } + storage_mb = 5120 + backup_retention_days = 7 + geo_redundant_backup_enabled = false + auto_grow_enabled = true + + administrator_login = var.db_username + administrator_login_password = var.db_password + version = "9.5" + ssl_enforcement_enabled = false + ssl_minimal_tls_version_enforced = "TLSEnforcementDisabled" +} + +resource "azurerm_postgresql_firewall_rule" "pg-fw-goodfood" { + name = "firewall-${var.project_name}${var.environnment_suffix}" + resource_group_name = data.azurerm_resource_group.rg-goodfood.name + server_name = azurerm_postgresql_server.pgsql-goodfood.name + start_ip_address = "0.0.0.0" + end_ip_address = "0.0.0.0" +} + +resource "azurerm_postgresql_database" "db-goodfood" { + name = "postgres-${var.project_name}${var.environnment_suffix}" + resource_group_name = data.azurerm_resource_group.rg-goodfood.name + server_name = azurerm_postgresql_server.pgsql-goodfood.name + charset = "UTF8" + collation = "English_United States.1252" +} + +resource "azurerm_container_group" "container_group" { + name = "container-${var.project_name}${var.environnment_suffix}" + location = data.azurerm_resource_group.rg-goodfood.location + resource_group_name = data.azurerm_resource_group.rg-goodfood.name + ip_address_type = "Public" + dns_name_label = "container-${var.project_name}${var.environnment_suffix}" + os_type = "Linux" + + container { + name = "${var.project_name}${var.environnment_suffix}" + image = "floriaaan/goodfood-delivery:latest" + cpu = "0.5" + memory = "1.5" - linux_profile { - admin_username = "ubuntu" + ports { + port = 50008 + protocol = "TCP" + } - ssh_key { - key_data = file(var.ssh_public_key) + environment_variables = { + "DATABASE_URL" = "postgres://${var.db_username}@${azurerm_postgresql_server.pgsql-goodfood.name}:${var.db_password}@${azurerm_postgresql_server.pgsql-goodfood.fqdn}:5432/${azurerm_postgresql_database.db-goodfood.name}" + "PORT" = 50008 } } -} \ No newline at end of file +} diff --git a/terraform/outputs.tf b/terraform/outputs.tf index f5b3c6b6..a7a091ce 100644 --- a/terraform/outputs.tf +++ b/terraform/outputs.tf @@ -4,40 +4,6 @@ output "main-rg-name" { output "main-rg-id" { value = data.azurerm_resource_group.rg-goodfood.id } -output "client_certificate" { - value = azurerm_kubernetes_cluster.aks-goodfood.kube_config[0].client_certificate - sensitive = true -} - -output "client_key" { - value = azurerm_kubernetes_cluster.aks-goodfood.kube_config[0].client_key - sensitive = true -} - -output "cluster_ca_certificate" { - value = azurerm_kubernetes_cluster.aks-goodfood.kube_config[0].cluster_ca_certificate - sensitive = true -} - -output "cluster_password" { - value = azurerm_kubernetes_cluster.aks-goodfood.kube_config[0].password - sensitive = true -} - -output "cluster_username" { - value = azurerm_kubernetes_cluster.aks-goodfood.kube_config[0].username - sensitive = true -} - -output "host" { - value = azurerm_kubernetes_cluster.aks-goodfood.kube_config[0].host - sensitive = true -} - -output "kube_config" { - value = azurerm_kubernetes_cluster.aks-goodfood.kube_config_raw - sensitive = true -} output "resource_group_name" { value = data.azurerm_resource_group.rg-goodfood.name diff --git a/terraform/variables.tf b/terraform/variables.tf index fae36979..0bb2c48d 100644 --- a/terraform/variables.tf +++ b/terraform/variables.tf @@ -28,4 +28,10 @@ variable "aks_service_principal_client_secret" { } variable "ssh_public_key" { default = "~/.ssh/id_rsa.pub" +} +variable "db_password" { + type = string +} +variable "db_username" { + type = string } \ No newline at end of file From ec3016a0429a4366580bd647449b057469ee0592 Mon Sep 17 00:00:00 2001 From: Florian LEROUX <10078837+floriaaan@users.noreply.github.com> Date: Wed, 10 May 2023 15:59:32 +0200 Subject: [PATCH 293/883] git(ignore): remove root lockfile and add ignore files --- .gitignore | 11 +- pnpm-lock.yaml | 794 ------------------------------------------------- 2 files changed, 5 insertions(+), 800 deletions(-) delete mode 100644 pnpm-lock.yaml diff --git a/.gitignore b/.gitignore index b27e8415..5977dc50 100644 --- a/.gitignore +++ b/.gitignore @@ -57,12 +57,11 @@ terraform.rc /**/.DS_Store /**/node_modules -/**/dist -/**/build /**/.env +!/**/.env.example +/**/bin +/**/obj +/**/.vs -# reporting service -/services/reporting/**/bin -/services/reporting/**/obj -/services/reporting/**/.vs +/**/goodfood-log \ No newline at end of file diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml deleted file mode 100644 index cccf0383..00000000 --- a/pnpm-lock.yaml +++ /dev/null @@ -1,794 +0,0 @@ -lockfileVersion: '6.0' - -devDependencies: - vitest-mock-extended: - specifier: ^1.1.3 - version: 1.1.3(typescript@5.0.4)(vitest@0.30.0) - -packages: - - /@esbuild/android-arm64@0.17.16: - resolution: {integrity: sha512-QX48qmsEZW+gcHgTmAj+x21mwTz8MlYQBnzF6861cNdQGvj2jzzFjqH0EBabrIa/WVZ2CHolwMoqxVryqKt8+Q==} - engines: {node: '>=12'} - cpu: [arm64] - os: [android] - requiresBuild: true - dev: true - optional: true - - /@esbuild/android-arm@0.17.16: - resolution: {integrity: sha512-baLqRpLe4JnKrUXLJChoTN0iXZH7El/mu58GE3WIA6/H834k0XWvLRmGLG8y8arTRS9hJJibPnF0tiGhmWeZgw==} - engines: {node: '>=12'} - cpu: [arm] - os: [android] - requiresBuild: true - dev: true - optional: true - - /@esbuild/android-x64@0.17.16: - resolution: {integrity: sha512-G4wfHhrrz99XJgHnzFvB4UwwPxAWZaZBOFXh+JH1Duf1I4vIVfuYY9uVLpx4eiV2D/Jix8LJY+TAdZ3i40tDow==} - engines: {node: '>=12'} - cpu: [x64] - os: [android] - requiresBuild: true - dev: true - optional: true - - /@esbuild/darwin-arm64@0.17.16: - resolution: {integrity: sha512-/Ofw8UXZxuzTLsNFmz1+lmarQI6ztMZ9XktvXedTbt3SNWDn0+ODTwxExLYQ/Hod91EZB4vZPQJLoqLF0jvEzA==} - engines: {node: '>=12'} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /@esbuild/darwin-x64@0.17.16: - resolution: {integrity: sha512-SzBQtCV3Pdc9kyizh36Ol+dNVhkDyIrGb/JXZqFq8WL37LIyrXU0gUpADcNV311sCOhvY+f2ivMhb5Tuv8nMOQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /@esbuild/freebsd-arm64@0.17.16: - resolution: {integrity: sha512-ZqftdfS1UlLiH1DnS2u3It7l4Bc3AskKeu+paJSfk7RNOMrOxmeFDhLTMQqMxycP1C3oj8vgkAT6xfAuq7ZPRA==} - engines: {node: '>=12'} - cpu: [arm64] - os: [freebsd] - requiresBuild: true - dev: true - optional: true - - /@esbuild/freebsd-x64@0.17.16: - resolution: {integrity: sha512-rHV6zNWW1tjgsu0dKQTX9L0ByiJHHLvQKrWtnz8r0YYJI27FU3Xu48gpK2IBj1uCSYhJ+pEk6Y0Um7U3rIvV8g==} - engines: {node: '>=12'} - cpu: [x64] - os: [freebsd] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-arm64@0.17.16: - resolution: {integrity: sha512-8yoZhGkU6aHu38WpaM4HrRLTFc7/VVD9Q2SvPcmIQIipQt2I/GMTZNdEHXoypbbGao5kggLcxg0iBKjo0SQYKA==} - engines: {node: '>=12'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-arm@0.17.16: - resolution: {integrity: sha512-n4O8oVxbn7nl4+m+ISb0a68/lcJClIbaGAoXwqeubj/D1/oMMuaAXmJVfFlRjJLu/ZvHkxoiFJnmbfp4n8cdSw==} - engines: {node: '>=12'} - cpu: [arm] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-ia32@0.17.16: - resolution: {integrity: sha512-9ZBjlkdaVYxPNO8a7OmzDbOH9FMQ1a58j7Xb21UfRU29KcEEU3VTHk+Cvrft/BNv0gpWJMiiZ/f4w0TqSP0gLA==} - engines: {node: '>=12'} - cpu: [ia32] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-loong64@0.17.16: - resolution: {integrity: sha512-TIZTRojVBBzdgChY3UOG7BlPhqJz08AL7jdgeeu+kiObWMFzGnQD7BgBBkWRwOtKR1i2TNlO7YK6m4zxVjjPRQ==} - engines: {node: '>=12'} - cpu: [loong64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-mips64el@0.17.16: - resolution: {integrity: sha512-UPeRuFKCCJYpBbIdczKyHLAIU31GEm0dZl1eMrdYeXDH+SJZh/i+2cAmD3A1Wip9pIc5Sc6Kc5cFUrPXtR0XHA==} - engines: {node: '>=12'} - cpu: [mips64el] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-ppc64@0.17.16: - resolution: {integrity: sha512-io6yShgIEgVUhExJejJ21xvO5QtrbiSeI7vYUnr7l+v/O9t6IowyhdiYnyivX2X5ysOVHAuyHW+Wyi7DNhdw6Q==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-riscv64@0.17.16: - resolution: {integrity: sha512-WhlGeAHNbSdG/I2gqX2RK2gfgSNwyJuCiFHMc8s3GNEMMHUI109+VMBfhVqRb0ZGzEeRiibi8dItR3ws3Lk+cA==} - engines: {node: '>=12'} - cpu: [riscv64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-s390x@0.17.16: - resolution: {integrity: sha512-gHRReYsJtViir63bXKoFaQ4pgTyah4ruiMRQ6im9YZuv+gp3UFJkNTY4sFA73YDynmXZA6hi45en4BGhNOJUsw==} - engines: {node: '>=12'} - cpu: [s390x] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-x64@0.17.16: - resolution: {integrity: sha512-mfiiBkxEbUHvi+v0P+TS7UnA9TeGXR48aK4XHkTj0ZwOijxexgMF01UDFaBX7Q6CQsB0d+MFNv9IiXbIHTNd4g==} - engines: {node: '>=12'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/netbsd-x64@0.17.16: - resolution: {integrity: sha512-n8zK1YRDGLRZfVcswcDMDM0j2xKYLNXqei217a4GyBxHIuPMGrrVuJ+Ijfpr0Kufcm7C1k/qaIrGy6eG7wvgmA==} - engines: {node: '>=12'} - cpu: [x64] - os: [netbsd] - requiresBuild: true - dev: true - optional: true - - /@esbuild/openbsd-x64@0.17.16: - resolution: {integrity: sha512-lEEfkfsUbo0xC47eSTBqsItXDSzwzwhKUSsVaVjVji07t8+6KA5INp2rN890dHZeueXJAI8q0tEIfbwVRYf6Ew==} - engines: {node: '>=12'} - cpu: [x64] - os: [openbsd] - requiresBuild: true - dev: true - optional: true - - /@esbuild/sunos-x64@0.17.16: - resolution: {integrity: sha512-jlRjsuvG1fgGwnE8Afs7xYDnGz0dBgTNZfgCK6TlvPH3Z13/P5pi6I57vyLE8qZYLrGVtwcm9UbUx1/mZ8Ukag==} - engines: {node: '>=12'} - cpu: [x64] - os: [sunos] - requiresBuild: true - dev: true - optional: true - - /@esbuild/win32-arm64@0.17.16: - resolution: {integrity: sha512-TzoU2qwVe2boOHl/3KNBUv2PNUc38U0TNnzqOAcgPiD/EZxT2s736xfC2dYQbszAwo4MKzzwBV0iHjhfjxMimg==} - engines: {node: '>=12'} - cpu: [arm64] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /@esbuild/win32-ia32@0.17.16: - resolution: {integrity: sha512-B8b7W+oo2yb/3xmwk9Vc99hC9bNolvqjaTZYEfMQhzdpBsjTvZBlXQ/teUE55Ww6sg//wlcDjOaqldOKyigWdA==} - engines: {node: '>=12'} - cpu: [ia32] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /@esbuild/win32-x64@0.17.16: - resolution: {integrity: sha512-xJ7OH/nanouJO9pf03YsL9NAFQBHd8AqfrQd7Pf5laGyyTt/gToul6QYOA/i5i/q8y9iaM5DQFNTgpi995VkOg==} - engines: {node: '>=12'} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /@jridgewell/sourcemap-codec@1.4.15: - resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} - dev: true - - /@types/chai-subset@1.3.3: - resolution: {integrity: sha512-frBecisrNGz+F4T6bcc+NLeolfiojh5FxW2klu669+8BARtyQv2C/GkNW6FUodVe4BroGMP/wER/YDGc7rEllw==} - dependencies: - '@types/chai': 4.3.4 - dev: true - - /@types/chai@4.3.4: - resolution: {integrity: sha512-KnRanxnpfpjUTqTCXslZSEdLfXExwgNxYPdiO2WGUj8+HDjFi8R3k5RVKPeSCzLjCcshCAtVO2QBbVuAV4kTnw==} - dev: true - - /@types/node@18.15.11: - resolution: {integrity: sha512-E5Kwq2n4SbMzQOn6wnmBjuK9ouqlURrcZDVfbo9ftDDTFt3nk7ZKK4GMOzoYgnpQJKcxwQw+lGaBvvlMo0qN/Q==} - dev: true - - /@vitest/expect@0.30.0: - resolution: {integrity: sha512-b/jLWBqi6WQHfezWm8VjgXdIyfejAurtxqdyCdDqoToCim5W/nDxKjFAADitEHPz80oz+IP+c+wmkGKBucSpiw==} - dependencies: - '@vitest/spy': 0.30.0 - '@vitest/utils': 0.30.0 - chai: 4.3.7 - dev: true - - /@vitest/runner@0.30.0: - resolution: {integrity: sha512-Xh4xkdRcymdeRNrSwjhgarCTSgnQu2J59wsFI6i4UhKrL5whzo5+vWyq7iWK1ht3fppPeNAtvkbqUDf+OJSCbQ==} - dependencies: - '@vitest/utils': 0.30.0 - concordance: 5.0.4 - p-limit: 4.0.0 - pathe: 1.1.0 - dev: true - - /@vitest/snapshot@0.30.0: - resolution: {integrity: sha512-e4eSGCy36Bw3/Tkir9qYJDlFsUz3NALFPNJSxzlY8CFl901TV9iZdKgpqXpyG1sAhLO0tPHThBAMHRi8hRA8cg==} - dependencies: - magic-string: 0.30.0 - pathe: 1.1.0 - pretty-format: 27.5.1 - dev: true - - /@vitest/spy@0.30.0: - resolution: {integrity: sha512-olTWyG5gVWdfhCrdgxWQb2K3JYtj1/ZwInFFOb4GZ2HFI91PUWHWHhLRPORxwRwVvoXD1MS1162vPJZuHlKJkg==} - dependencies: - tinyspy: 2.1.0 - dev: true - - /@vitest/utils@0.30.0: - resolution: {integrity: sha512-qFZgoOKQ+rJV9xG4BBxgOSilnLQ2gkfG4I+z1wBuuQ3AD33zQrnB88kMFfzsot1E1AbF3dNK1e4CU7q3ojahRA==} - dependencies: - concordance: 5.0.4 - loupe: 2.3.6 - pretty-format: 27.5.1 - dev: true - - /acorn-walk@8.2.0: - resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} - engines: {node: '>=0.4.0'} - dev: true - - /acorn@8.8.2: - resolution: {integrity: sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==} - engines: {node: '>=0.4.0'} - hasBin: true - dev: true - - /ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} - dev: true - - /ansi-styles@5.2.0: - resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} - engines: {node: '>=10'} - dev: true - - /assertion-error@1.1.0: - resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} - dev: true - - /blueimp-md5@2.19.0: - resolution: {integrity: sha512-DRQrD6gJyy8FbiE4s+bDoXS9hiW3Vbx5uCdwvcCf3zLHL+Iv7LtGHLpr+GZV8rHG8tK766FGYBwRbu8pELTt+w==} - dev: true - - /cac@6.7.14: - resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} - engines: {node: '>=8'} - dev: true - - /chai@4.3.7: - resolution: {integrity: sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==} - engines: {node: '>=4'} - dependencies: - assertion-error: 1.1.0 - check-error: 1.0.2 - deep-eql: 4.1.3 - get-func-name: 2.0.0 - loupe: 2.3.6 - pathval: 1.1.1 - type-detect: 4.0.8 - dev: true - - /check-error@1.0.2: - resolution: {integrity: sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==} - dev: true - - /concordance@5.0.4: - resolution: {integrity: sha512-OAcsnTEYu1ARJqWVGwf4zh4JDfHZEaSNlNccFmt8YjB2l/n19/PF2viLINHc57vO4FKIAFl2FWASIGZZWZ2Kxw==} - engines: {node: '>=10.18.0 <11 || >=12.14.0 <13 || >=14'} - dependencies: - date-time: 3.1.0 - esutils: 2.0.3 - fast-diff: 1.2.0 - js-string-escape: 1.0.1 - lodash: 4.17.21 - md5-hex: 3.0.1 - semver: 7.3.8 - well-known-symbols: 2.0.0 - dev: true - - /date-time@3.1.0: - resolution: {integrity: sha512-uqCUKXE5q1PNBXjPqvwhwJf9SwMoAHBgWJ6DcrnS5o+W2JOiIILl0JEdVD8SGujrNS02GGxgwAg2PN2zONgtjg==} - engines: {node: '>=6'} - dependencies: - time-zone: 1.0.0 - dev: true - - /debug@4.3.4: - resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - dependencies: - ms: 2.1.2 - dev: true - - /deep-eql@4.1.3: - resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==} - engines: {node: '>=6'} - dependencies: - type-detect: 4.0.8 - dev: true - - /esbuild@0.17.16: - resolution: {integrity: sha512-aeSuUKr9aFVY9Dc8ETVELGgkj4urg5isYx8pLf4wlGgB0vTFjxJQdHnNH6Shmx4vYYrOTLCHtRI5i1XZ9l2Zcg==} - engines: {node: '>=12'} - hasBin: true - requiresBuild: true - optionalDependencies: - '@esbuild/android-arm': 0.17.16 - '@esbuild/android-arm64': 0.17.16 - '@esbuild/android-x64': 0.17.16 - '@esbuild/darwin-arm64': 0.17.16 - '@esbuild/darwin-x64': 0.17.16 - '@esbuild/freebsd-arm64': 0.17.16 - '@esbuild/freebsd-x64': 0.17.16 - '@esbuild/linux-arm': 0.17.16 - '@esbuild/linux-arm64': 0.17.16 - '@esbuild/linux-ia32': 0.17.16 - '@esbuild/linux-loong64': 0.17.16 - '@esbuild/linux-mips64el': 0.17.16 - '@esbuild/linux-ppc64': 0.17.16 - '@esbuild/linux-riscv64': 0.17.16 - '@esbuild/linux-s390x': 0.17.16 - '@esbuild/linux-x64': 0.17.16 - '@esbuild/netbsd-x64': 0.17.16 - '@esbuild/openbsd-x64': 0.17.16 - '@esbuild/sunos-x64': 0.17.16 - '@esbuild/win32-arm64': 0.17.16 - '@esbuild/win32-ia32': 0.17.16 - '@esbuild/win32-x64': 0.17.16 - dev: true - - /esutils@2.0.3: - resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} - engines: {node: '>=0.10.0'} - dev: true - - /fast-diff@1.2.0: - resolution: {integrity: sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==} - dev: true - - /fsevents@2.3.2: - resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /function-bind@1.1.1: - resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} - dev: true - - /get-func-name@2.0.0: - resolution: {integrity: sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==} - dev: true - - /has@1.0.3: - resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} - engines: {node: '>= 0.4.0'} - dependencies: - function-bind: 1.1.1 - dev: true - - /is-core-module@2.11.0: - resolution: {integrity: sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==} - dependencies: - has: 1.0.3 - dev: true - - /js-string-escape@1.0.1: - resolution: {integrity: sha512-Smw4xcfIQ5LVjAOuJCvN/zIodzA/BBSsluuoSykP+lUvScIi4U6RJLfwHet5cxFnCswUjISV8oAXaqaJDY3chg==} - engines: {node: '>= 0.8'} - dev: true - - /jsonc-parser@3.2.0: - resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} - dev: true - - /local-pkg@0.4.3: - resolution: {integrity: sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==} - engines: {node: '>=14'} - dev: true - - /lodash@4.17.21: - resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} - dev: true - - /loupe@2.3.6: - resolution: {integrity: sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==} - dependencies: - get-func-name: 2.0.0 - dev: true - - /lru-cache@6.0.0: - resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} - engines: {node: '>=10'} - dependencies: - yallist: 4.0.0 - dev: true - - /magic-string@0.30.0: - resolution: {integrity: sha512-LA+31JYDJLs82r2ScLrlz1GjSgu66ZV518eyWT+S8VhyQn/JL0u9MeBOvQMGYiPk1DBiSN9DDMOcXvigJZaViQ==} - engines: {node: '>=12'} - dependencies: - '@jridgewell/sourcemap-codec': 1.4.15 - dev: true - - /md5-hex@3.0.1: - resolution: {integrity: sha512-BUiRtTtV39LIJwinWBjqVsU9xhdnz7/i889V859IBFpuqGAj6LuOvHv5XLbgZ2R7ptJoJaEcxkv88/h25T7Ciw==} - engines: {node: '>=8'} - dependencies: - blueimp-md5: 2.19.0 - dev: true - - /mlly@1.2.0: - resolution: {integrity: sha512-+c7A3CV0KGdKcylsI6khWyts/CYrGTrRVo4R/I7u/cUsy0Conxa6LUhiEzVKIw14lc2L5aiO4+SeVe4TeGRKww==} - dependencies: - acorn: 8.8.2 - pathe: 1.1.0 - pkg-types: 1.0.2 - ufo: 1.1.1 - dev: true - - /ms@2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - dev: true - - /nanoid@3.3.6: - resolution: {integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true - dev: true - - /p-limit@4.0.0: - resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dependencies: - yocto-queue: 1.0.0 - dev: true - - /path-parse@1.0.7: - resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} - dev: true - - /pathe@1.1.0: - resolution: {integrity: sha512-ODbEPR0KKHqECXW1GoxdDb+AZvULmXjVPy4rt+pGo2+TnjJTIPJQSVS6N63n8T2Ip+syHhbn52OewKicV0373w==} - dev: true - - /pathval@1.1.1: - resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} - dev: true - - /picocolors@1.0.0: - resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} - dev: true - - /pkg-types@1.0.2: - resolution: {integrity: sha512-hM58GKXOcj8WTqUXnsQyJYXdeAPbythQgEF3nTcEo+nkD49chjQ9IKm/QJy9xf6JakXptz86h7ecP2024rrLaQ==} - dependencies: - jsonc-parser: 3.2.0 - mlly: 1.2.0 - pathe: 1.1.0 - dev: true - - /postcss@8.4.21: - resolution: {integrity: sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==} - engines: {node: ^10 || ^12 || >=14} - dependencies: - nanoid: 3.3.6 - picocolors: 1.0.0 - source-map-js: 1.0.2 - dev: true - - /pretty-format@27.5.1: - resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - dependencies: - ansi-regex: 5.0.1 - ansi-styles: 5.2.0 - react-is: 17.0.2 - dev: true - - /react-is@17.0.2: - resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} - dev: true - - /resolve@1.22.2: - resolution: {integrity: sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==} - hasBin: true - dependencies: - is-core-module: 2.11.0 - path-parse: 1.0.7 - supports-preserve-symlinks-flag: 1.0.0 - dev: true - - /rollup@3.20.2: - resolution: {integrity: sha512-3zwkBQl7Ai7MFYQE0y1MeQ15+9jsi7XxfrqwTb/9EK8D9C9+//EBR4M+CuA1KODRaNbFez/lWxA5vhEGZp4MUg==} - engines: {node: '>=14.18.0', npm: '>=8.0.0'} - hasBin: true - optionalDependencies: - fsevents: 2.3.2 - dev: true - - /semver@7.3.8: - resolution: {integrity: sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==} - engines: {node: '>=10'} - hasBin: true - dependencies: - lru-cache: 6.0.0 - dev: true - - /siginfo@2.0.0: - resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} - dev: true - - /source-map-js@1.0.2: - resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} - engines: {node: '>=0.10.0'} - dev: true - - /source-map@0.6.1: - resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} - engines: {node: '>=0.10.0'} - dev: true - - /stackback@0.0.2: - resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} - dev: true - - /std-env@3.3.2: - resolution: {integrity: sha512-uUZI65yrV2Qva5gqE0+A7uVAvO40iPo6jGhs7s8keRfHCmtg+uB2X6EiLGCI9IgL1J17xGhvoOqSz79lzICPTA==} - dev: true - - /strip-literal@1.0.1: - resolution: {integrity: sha512-QZTsipNpa2Ppr6v1AmJHESqJ3Uz247MUS0OjrnnZjFAvEoWqxuyFuXn2xLgMtRnijJShAa1HL0gtJyUs7u7n3Q==} - dependencies: - acorn: 8.8.2 - dev: true - - /supports-preserve-symlinks-flag@1.0.0: - resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} - engines: {node: '>= 0.4'} - dev: true - - /time-zone@1.0.0: - resolution: {integrity: sha512-TIsDdtKo6+XrPtiTm1ssmMngN1sAhyKnTO2kunQWqNPWIVvCm15Wmw4SWInwTVgJ5u/Tr04+8Ei9TNcw4x4ONA==} - engines: {node: '>=4'} - dev: true - - /tinybench@2.4.0: - resolution: {integrity: sha512-iyziEiyFxX4kyxSp+MtY1oCH/lvjH3PxFN8PGCDeqcZWAJ/i+9y+nL85w99PxVzrIvew/GSkSbDYtiGVa85Afg==} - dev: true - - /tinypool@0.4.0: - resolution: {integrity: sha512-2ksntHOKf893wSAH4z/+JbPpi92esw8Gn9N2deXX+B0EO92hexAVI9GIZZPx7P5aYo5KULfeOSt3kMOmSOy6uA==} - engines: {node: '>=14.0.0'} - dev: true - - /tinyspy@2.1.0: - resolution: {integrity: sha512-7eORpyqImoOvkQJCSkL0d0mB4NHHIFAy4b1u8PHdDa7SjGS2njzl6/lyGoZLm+eyYEtlUmFGE0rFj66SWxZgQQ==} - engines: {node: '>=14.0.0'} - dev: true - - /ts-essentials@9.3.1(typescript@5.0.4): - resolution: {integrity: sha512-9CChSvQMyVRo29Vb1A2jbs+LKo3d/bAf+ndSaX0T8cEiy/HChVaRN/HY5DqUryZ8hZ6uol9bEgCnGmnDbwBR9Q==} - peerDependencies: - typescript: '>=4.1.0' - dependencies: - typescript: 5.0.4 - dev: true - - /type-detect@4.0.8: - resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} - engines: {node: '>=4'} - dev: true - - /typescript@5.0.4: - resolution: {integrity: sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==} - engines: {node: '>=12.20'} - hasBin: true - dev: true - - /ufo@1.1.1: - resolution: {integrity: sha512-MvlCc4GHrmZdAllBc0iUDowff36Q9Ndw/UzqmEKyrfSzokTd9ZCy1i+IIk5hrYKkjoYVQyNbrw7/F8XJ2rEwTg==} - dev: true - - /vite-node@0.30.0(@types/node@18.15.11): - resolution: {integrity: sha512-23X5Ggylx0kU/bMf8MCcEEl55d/gsTtU81mMZjm7Z0FSpgKZexUqmX3mJtgglP9SySQQs9ydYg/GEahi/cKHaA==} - engines: {node: '>=v14.18.0'} - hasBin: true - dependencies: - cac: 6.7.14 - debug: 4.3.4 - mlly: 1.2.0 - pathe: 1.1.0 - picocolors: 1.0.0 - vite: 4.2.1(@types/node@18.15.11) - transitivePeerDependencies: - - '@types/node' - - less - - sass - - stylus - - sugarss - - supports-color - - terser - dev: true - - /vite@4.2.1(@types/node@18.15.11): - resolution: {integrity: sha512-7MKhqdy0ISo4wnvwtqZkjke6XN4taqQ2TBaTccLIpOKv7Vp2h4Y+NpmWCnGDeSvvn45KxvWgGyb0MkHvY1vgbg==} - engines: {node: ^14.18.0 || >=16.0.0} - hasBin: true - peerDependencies: - '@types/node': '>= 14' - less: '*' - sass: '*' - stylus: '*' - sugarss: '*' - terser: ^5.4.0 - peerDependenciesMeta: - '@types/node': - optional: true - less: - optional: true - sass: - optional: true - stylus: - optional: true - sugarss: - optional: true - terser: - optional: true - dependencies: - '@types/node': 18.15.11 - esbuild: 0.17.16 - postcss: 8.4.21 - resolve: 1.22.2 - rollup: 3.20.2 - optionalDependencies: - fsevents: 2.3.2 - dev: true - - /vitest-mock-extended@1.1.3(typescript@5.0.4)(vitest@0.30.0): - resolution: {integrity: sha512-MiaKYZbTg+fjozKnCpoTTva0BnlSNYyk4jiPuM2xVhg4aou112QIrALdH3/ZKK6qfXWh0A17gFIjWJjylOlXxg==} - peerDependencies: - typescript: 3.x || 4.x || 5.x - vitest: '>=0.29.2' - dependencies: - ts-essentials: 9.3.1(typescript@5.0.4) - typescript: 5.0.4 - vitest: 0.30.0 - dev: true - - /vitest@0.30.0: - resolution: {integrity: sha512-2WW4WeTHtrLFeoiuotWvEW6khozx1NvMGYoGsNz2btdddEbqvEdPJIouIdoiC5i61Rl1ctZvm9cn2R9TcPQlzw==} - engines: {node: '>=v14.18.0'} - hasBin: true - peerDependencies: - '@edge-runtime/vm': '*' - '@vitest/browser': '*' - '@vitest/ui': '*' - happy-dom: '*' - jsdom: '*' - playwright: '*' - safaridriver: '*' - webdriverio: '*' - peerDependenciesMeta: - '@edge-runtime/vm': - optional: true - '@vitest/browser': - optional: true - '@vitest/ui': - optional: true - happy-dom: - optional: true - jsdom: - optional: true - playwright: - optional: true - safaridriver: - optional: true - webdriverio: - optional: true - dependencies: - '@types/chai': 4.3.4 - '@types/chai-subset': 1.3.3 - '@types/node': 18.15.11 - '@vitest/expect': 0.30.0 - '@vitest/runner': 0.30.0 - '@vitest/snapshot': 0.30.0 - '@vitest/spy': 0.30.0 - '@vitest/utils': 0.30.0 - acorn: 8.8.2 - acorn-walk: 8.2.0 - cac: 6.7.14 - chai: 4.3.7 - concordance: 5.0.4 - debug: 4.3.4 - local-pkg: 0.4.3 - magic-string: 0.30.0 - pathe: 1.1.0 - picocolors: 1.0.0 - source-map: 0.6.1 - std-env: 3.3.2 - strip-literal: 1.0.1 - tinybench: 2.4.0 - tinypool: 0.4.0 - vite: 4.2.1(@types/node@18.15.11) - vite-node: 0.30.0(@types/node@18.15.11) - why-is-node-running: 2.2.2 - transitivePeerDependencies: - - less - - sass - - stylus - - sugarss - - supports-color - - terser - dev: true - - /well-known-symbols@2.0.0: - resolution: {integrity: sha512-ZMjC3ho+KXo0BfJb7JgtQ5IBuvnShdlACNkKkdsqBmYw3bPAaJfPeYUo6tLUaT5tG/Gkh7xkpBhKRQ9e7pyg9Q==} - engines: {node: '>=6'} - 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 - - /yallist@4.0.0: - resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} - dev: true - - /yocto-queue@1.0.0: - resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} - engines: {node: '>=12.20'} - dev: true From cbd4c663d73ef9366a48ff74dad7ec3d1f96a2cc Mon Sep 17 00:00:00 2001 From: Florian LEROUX <10078837+floriaaan@users.noreply.github.com> Date: Wed, 10 May 2023 16:19:22 +0200 Subject: [PATCH 294/883] fix(prisma): add "native" to targets --- services/delivery/prisma/schema.prisma | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/delivery/prisma/schema.prisma b/services/delivery/prisma/schema.prisma index fe4bce5f..abfaba00 100644 --- a/services/delivery/prisma/schema.prisma +++ b/services/delivery/prisma/schema.prisma @@ -5,7 +5,7 @@ datasource db { generator client { provider = "prisma-client-js" - binaryTargets = ["linux-musl", "linux-musl-openssl-3.0.x"] + binaryTargets = ["native", "linux-musl", "linux-musl-openssl-3.0.x"] } enum Status { From 44c31df36e95b8bd692c6ee8b42710606f2bb69a Mon Sep 17 00:00:00 2001 From: Florian LEROUX <10078837+floriaaan@users.noreply.github.com> Date: Wed, 10 May 2023 16:19:38 +0200 Subject: [PATCH 295/883] fix(proto): add proto symlink --- services/delivery/proto | 1 + 1 file changed, 1 insertion(+) create mode 120000 services/delivery/proto diff --git a/services/delivery/proto b/services/delivery/proto new file mode 120000 index 00000000..4d1e2d8b --- /dev/null +++ b/services/delivery/proto @@ -0,0 +1 @@ +../proto/ \ No newline at end of file From df009129e551a4ed4b94768ddf4e45ba2b0d0855 Mon Sep 17 00:00:00 2001 From: Florian LEROUX <10078837+floriaaan@users.noreply.github.com> Date: Wed, 10 May 2023 16:19:59 +0200 Subject: [PATCH 296/883] feat(amqp): add amqp log publisher --- services/delivery/package.json | 6 +- services/delivery/pnpm-lock.yaml | 106 ++++++++++++++++++++++++------ services/delivery/src/lib/amqp.ts | 32 +++++++++ 3 files changed, 122 insertions(+), 22 deletions(-) create mode 100644 services/delivery/src/lib/amqp.ts diff --git a/services/delivery/package.json b/services/delivery/package.json index 5df9a80b..dfc8839e 100644 --- a/services/delivery/package.json +++ b/services/delivery/package.json @@ -21,17 +21,19 @@ "dependencies": { "@grpc/grpc-js": "^1.8.13", "@grpc/proto-loader": "0.7.6", - "@prisma/client": "4.11.0", + "@prisma/client": "4.14.0", + "amqplib": "^0.10.3", "dotenv": "^16.0.3", "protobufjs": "7.2.2" }, "devDependencies": { + "@types/amqplib": "^0.10.1", "@types/node": "18.15.9", "@vitest/coverage-c8": "^0.29.8", "esbuild": "^0.17.14", "nodemon": "^2.0.22", "pkg": "^5.8.1", - "prisma": "4.11.0", + "prisma": "4.14.0", "ts-node": "10.9.1", "tsconfig-paths": "^4.1.2", "typescript": "5.0.2", diff --git a/services/delivery/pnpm-lock.yaml b/services/delivery/pnpm-lock.yaml index 1d1dba13..9d320234 100644 --- a/services/delivery/pnpm-lock.yaml +++ b/services/delivery/pnpm-lock.yaml @@ -8,8 +8,11 @@ dependencies: specifier: 0.7.6 version: 0.7.6 '@prisma/client': - specifier: 4.11.0 - version: 4.11.0(prisma@4.11.0) + specifier: 4.14.0 + version: 4.14.0(prisma@4.14.0) + amqplib: + specifier: ^0.10.3 + version: 0.10.3 dotenv: specifier: ^16.0.3 version: 16.0.3 @@ -18,6 +21,9 @@ dependencies: version: 7.2.2 devDependencies: + '@types/amqplib': + specifier: ^0.10.1 + version: 0.10.1 '@types/node': specifier: 18.15.9 version: 18.15.9 @@ -34,8 +40,8 @@ devDependencies: specifier: ^5.8.1 version: 5.8.1 prisma: - specifier: 4.11.0 - version: 4.11.0 + specifier: 4.14.0 + version: 4.14.0 ts-node: specifier: 10.9.1 version: 10.9.1(@types/node@18.15.9)(typescript@5.0.2) @@ -57,6 +63,17 @@ devDependencies: packages: + /@acuminous/bitsyntax@0.1.2: + resolution: {integrity: sha512-29lUK80d1muEQqiUsSo+3A0yP6CdspgC95EnKBMi22Xlwt79i/En4Vr67+cXhU+cZjbti3TgGGC5wy1stIywVQ==} + engines: {node: '>=0.8'} + dependencies: + buffer-more-ints: 1.0.0 + debug: 4.3.4 + safe-buffer: 5.1.2 + transitivePeerDependencies: + - supports-color + dev: false + /@babel/generator@7.18.2: resolution: {integrity: sha512-W1lG5vUwFvfMd8HVXqdfbuG7RuaSrTCCD8cl8fP8wOivdbtbIg2Db3IWUcgvfxKbbn6ZBGYRW/Zk1MIwK49mgw==} engines: {node: '>=6.9.0'} @@ -385,8 +402,8 @@ packages: fastq: 1.15.0 dev: true - /@prisma/client@4.11.0(prisma@4.11.0): - resolution: {integrity: sha512-0INHYkQIqgAjrt7NzhYpeDQi8x3Nvylc2uDngKyFDDj1tTRQ4uV1HnVmd1sQEraeVAN63SOK0dgCKQHlvjL0KA==} + /@prisma/client@4.14.0(prisma@4.14.0): + resolution: {integrity: sha512-MK/XaA2sFdfaOa7I9MjNKz6dxeIEdeZlnpNRoF2w3JuRLlFJLkpp6cD3yaqw2nUUhbrn3Iqe3ZpVV+VuGGil7Q==} engines: {node: '>=14.17'} requiresBuild: true peerDependencies: @@ -395,16 +412,16 @@ packages: prisma: optional: true dependencies: - '@prisma/engines-version': 4.11.0-57.8fde8fef4033376662cad983758335009d522acb - prisma: 4.11.0 + '@prisma/engines-version': 4.14.0-67.d9a4c5988f480fa576d43970d5a23641aa77bc9c + prisma: 4.14.0 dev: false - /@prisma/engines-version@4.11.0-57.8fde8fef4033376662cad983758335009d522acb: - resolution: {integrity: sha512-3Vd8Qq06d5xD8Ch5WauWcUUrsVPdMC6Ge8ILji8RFfyhUpqon6qSyGM0apvr1O8n8qH8cKkEFqRPsYjuz5r83g==} + /@prisma/engines-version@4.14.0-67.d9a4c5988f480fa576d43970d5a23641aa77bc9c: + resolution: {integrity: sha512-3jum8/YSudeSN0zGW5qkpz+wAN2V/NYCQ+BPjvHYDfWatLWlQkqy99toX0GysDeaUoBIJg1vaz2yKqiA3CFcQw==} dev: false - /@prisma/engines@4.11.0: - resolution: {integrity: sha512-0AEBi2HXGV02cf6ASsBPhfsVIbVSDC9nbQed4iiY5eHttW9ZtMxHThuKZE1pnESbr8HRdgmFSa/Kn4OSNYuibg==} + /@prisma/engines@4.14.0: + resolution: {integrity: sha512-PDNlhP/1vyTgmNyiucGqGCdXIp7HIkkvKO50si3y3PcceeHvqtiKPaH1iJdz63jCWMVMbj2MElSxXPOeBvEVIQ==} requiresBuild: true /@protobufjs/aspromise@1.1.2: @@ -466,6 +483,12 @@ packages: resolution: {integrity: sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==} dev: true + /@types/amqplib@0.10.1: + resolution: {integrity: sha512-j6ANKT79ncUDnAs/+9r9eDujxbeJoTjoVu33gHHcaPfmLQaMhvfbH2GqSe8KUM444epAp1Vl3peVOQfZk3UIqA==} + dependencies: + '@types/node': 18.15.9 + dev: true + /@types/chai-subset@1.3.3: resolution: {integrity: sha512-frBecisrNGz+F4T6bcc+NLeolfiojh5FxW2klu669+8BARtyQv2C/GkNW6FUodVe4BroGMP/wER/YDGc7rEllw==} dependencies: @@ -553,6 +576,18 @@ packages: - supports-color dev: true + /amqplib@0.10.3: + resolution: {integrity: sha512-UHmuSa7n8vVW/a5HGh2nFPqAEr8+cD4dEZ6u9GjP91nHfr1a54RyAKyra7Sb5NH7NBKOUlyQSMXIp0qAixKexw==} + engines: {node: '>=10'} + dependencies: + '@acuminous/bitsyntax': 0.1.2 + buffer-more-ints: 1.0.0 + readable-stream: 1.1.14 + url-parse: 1.5.10 + transitivePeerDependencies: + - supports-color + dev: false + /ansi-regex@5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} @@ -639,6 +674,10 @@ packages: fill-range: 7.0.1 dev: true + /buffer-more-ints@1.0.0: + resolution: {integrity: sha512-EMetuGFz5SLsT0QTnXzINh4Ksr+oo4i+UGTXEshiGCQWnsgSs7ZhJ8fzlwQ+OzEMs0MpDAMr1hxnblp5a4vcHg==} + dev: false + /buffer@5.7.1: resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} dependencies: @@ -748,7 +787,6 @@ packages: /core-util-is@1.0.3: resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} - dev: true /create-require@1.1.1: resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} @@ -785,7 +823,6 @@ packages: optional: true dependencies: ms: 2.1.2 - dev: true /decompress-response@6.0.0: resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} @@ -1069,7 +1106,6 @@ packages: /inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - dev: true /ini@1.3.8: resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} @@ -1122,6 +1158,10 @@ packages: engines: {node: '>=0.12.0'} dev: true + /isarray@0.0.1: + resolution: {integrity: sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==} + dev: false + /isarray@1.0.0: resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} dev: true @@ -1267,7 +1307,6 @@ packages: /ms@2.1.2: resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - dev: true /ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} @@ -1501,13 +1540,13 @@ packages: react-is: 17.0.2 dev: true - /prisma@4.11.0: - resolution: {integrity: sha512-4zZmBXssPUEiX+GeL0MUq/Yyie4ltiKmGu7jCJFnYMamNrrulTBc+D+QwAQSJ01tyzeGHlD13kOnqPwRipnlNw==} + /prisma@4.14.0: + resolution: {integrity: sha512-+5dMl1uxMQb4RepndY6AwR9xi1cDcaGFICu+ws6/Nmgt93mFPNj8tYxSfTdmfg+rkNrUId9rk/Ac2vTgLe/oXA==} engines: {node: '>=14.17'} hasBin: true requiresBuild: true dependencies: - '@prisma/engines': 4.11.0 + '@prisma/engines': 4.14.0 /process-nextick-args@2.0.1: resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} @@ -1548,6 +1587,10 @@ packages: once: 1.4.0 dev: true + /querystringify@2.2.0: + resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} + dev: false + /queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} dev: true @@ -1566,6 +1609,15 @@ packages: resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} dev: true + /readable-stream@1.1.14: + resolution: {integrity: sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==} + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 0.0.1 + string_decoder: 0.10.31 + dev: false + /readable-stream@2.3.8: resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} dependencies: @@ -1598,6 +1650,10 @@ packages: resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} engines: {node: '>=0.10.0'} + /requires-port@1.0.0: + resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} + dev: false + /resolve@1.22.1: resolution: {integrity: sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==} hasBin: true @@ -1635,7 +1691,6 @@ packages: /safe-buffer@5.1.2: resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} - dev: true /safe-buffer@5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} @@ -1757,6 +1812,10 @@ packages: strip-ansi: 7.0.1 dev: true + /string_decoder@0.10.31: + resolution: {integrity: sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==} + dev: false + /string_decoder@1.1.1: resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} dependencies: @@ -1974,6 +2033,13 @@ packages: engines: {node: '>= 10.0.0'} dev: true + /url-parse@1.5.10: + resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} + dependencies: + querystringify: 2.2.0 + requires-port: 1.0.0 + dev: false + /util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} dev: true diff --git a/services/delivery/src/lib/amqp.ts b/services/delivery/src/lib/amqp.ts new file mode 100644 index 00000000..bd4780f7 --- /dev/null +++ b/services/delivery/src/lib/amqp.ts @@ -0,0 +1,32 @@ +import amqp from "amqplib"; +import { msg } from "@delivery/middleware/log"; +import { log } from "@delivery/lib/log"; + +const DEFAULT_QUEUE = "log"; + +async function connectQueue(queue = DEFAULT_QUEUE) { + try { + const connection = await amqp.connect(process.env.AMQP_URL || ""); + const channel = await connection.createChannel(); + await channel.assertExchange(queue, "fanout", { durable: true }); + return channel; + } catch (error) { + return error as Error; + } +} + +const toLog = (message: any) => { + const { request, path } = message; + return { event_message: path, metadata: { request } }; +}; + +export const publish = async (message: any, queue = DEFAULT_QUEUE) => { + const channel = await connectQueue(queue); + if (channel instanceof Error) + return console.log("Error to connect to queue: ", channel); + channel.sendToQueue(queue, Buffer.from(JSON.stringify(toLog(message)))); + log.debug( + msg("AMQP", `${queue} (queue)`, new Date(), new Date()), + JSON.stringify(message) + ); +}; From 9d1663d8bce5aab61bc3f578da4f622d746a7f61 Mon Sep 17 00:00:00 2001 From: Florian LEROUX <10078837+floriaaan@users.noreply.github.com> Date: Wed, 10 May 2023 16:20:21 +0200 Subject: [PATCH 297/883] feat(proxy): add serverproxy --- services/delivery/src/lib/proxy.ts | 132 ++++++++++++++++++++++++ services/delivery/src/middleware/log.ts | 41 ++++++++ services/delivery/src/server.ts | 21 ++-- 3 files changed, 187 insertions(+), 7 deletions(-) create mode 100644 services/delivery/src/lib/proxy.ts create mode 100644 services/delivery/src/middleware/log.ts diff --git a/services/delivery/src/lib/proxy.ts b/services/delivery/src/lib/proxy.ts new file mode 100644 index 00000000..b05d24a6 --- /dev/null +++ b/services/delivery/src/lib/proxy.ts @@ -0,0 +1,132 @@ +import { Server, status } from "@grpc/grpc-js"; + +const getType = (method: { + requestStream: boolean; + responseStream: boolean; +}) => { + if (method.requestStream === false && method.responseStream === false) { + return "unary"; + } + return "unknown"; +}; + + +const lookupServiceMetadata = (service: { [x: string]: any }) => { + const serviceKeys = Object.keys(service); + const intersectingMethods = serviceKeys.reduce((acc, k) => { + const method = service[k]; + if (!method) { + throw new Error(`cannot find method ${k} on service`); + } + const components = method.path.split("/"); + acc[k] = { + name: components[1], + method: components[2], + type: getType(method), + path: method.path, + responseType: method.responseType, + requestType: method.requestType, + }; + return acc; + }, {} as any); + + return (key: string) => intersectingMethods[key]; +}; + +export const handler = { + get( + target: { + [x: string]: any; + intercept: () => any; + addService: (arg0: any, arg1: {}) => any; + }, + propKey: string + ) { + if (propKey !== "addService") { + return target[propKey]; + } + return (service: any, implementation: { [x: string]: any }) => { + const newImplementation = {} as any; + const lookup = lookupServiceMetadata(service); + for (const k in implementation) { + const name = k; + const fn = implementation[k]; + newImplementation[name] = (call: any, callback: any) => { + const ctx = { + call, + name, + service: lookup(name), + status: { + code: status.UNKNOWN, + details: "", + }, + }; + const newCallback = (callback: (arg0: any) => void) => { + return (...args: any[]) => { + ctx.status = { + code: status.OK, + details: "", + }; + const err = args[0]; + if (err) { + ctx.status = { + code: status.UNKNOWN, + details: err, + }; + } + // @ts-ignore + callback(...args); + }; + }; + + const interceptors = target.intercept(); + const first = interceptors.next(); + if (!first.value) { + // if we don't have any interceptors + return new Promise((resolve) => { + return resolve(fn(call, newCallback(callback))); + }); + } + first.value(ctx, function next() { + return new Promise((resolve) => { + const i = interceptors.next(); + if (i.done) { + return resolve(fn(call, newCallback(callback))); + } + return resolve(i.value(ctx, next)); + }); + }); + }; + } + return target.addService(service, newImplementation); + }; + }, +}; + +export const createServerProxy = ( + server: Server +): Server & { + intercept: Generator; + interceptors: any[]; + use: (fn: any) => void; +} => { + // @ts-ignore + server.interceptors = []; + // @ts-ignore + server.use = (fn: any) => { + // @ts-ignore + server.interceptors.push(fn); + }; + // @ts-ignore + server.intercept = function* intercept() { + let i = 0; + // @ts-ignore + while (i < server.interceptors.length) { + // @ts-ignore + yield server.interceptors[i]; + i++; + } + }; + // @ts-ignore + return new Proxy(server, handler); +}; \ No newline at end of file diff --git a/services/delivery/src/middleware/log.ts b/services/delivery/src/middleware/log.ts new file mode 100644 index 00000000..1a8c08eb --- /dev/null +++ b/services/delivery/src/middleware/log.ts @@ -0,0 +1,41 @@ +import { publish } from "@delivery/lib/amqp"; +import { utils } from "@delivery/lib/log"; +import { log } from "@delivery/lib/log"; + +type Context = { + call: { + request: Map; + }; + service: { + path: string; + }; +}; + +const parseContext = (ctx: Context) => { + const { + call: { request }, + service: { path }, + } = ctx; + return { request, path }; +}; + +export const msg = ( + type: "GRPC" | "AMQP", + path: string | undefined, + requestAt: Date, + responseAt: Date +) => + `${utils.magenta(requestAt.toISOString())} | ${utils[ + type === "GRPC" ? "cyan" : "red" + ](type)}${path ? ` | ${utils.yellow(path)}` : ""} | ${utils.green( + responseAt.getTime() - requestAt.getTime() + "ms" + )} |`; + +export const logGRPC = async (ctx: Context, next: () => Promise) => { + const requestAt = new Date(); + await next(); + const responseAt = new Date(); + const { request, path } = parseContext(ctx); + publish({ request, path }, "log"); + log.debug(msg("GRPC", path, requestAt, responseAt), JSON.stringify(request)); +}; \ No newline at end of file diff --git a/services/delivery/src/server.ts b/services/delivery/src/server.ts index 04fb474f..238462c3 100644 --- a/services/delivery/src/server.ts +++ b/services/delivery/src/server.ts @@ -1,4 +1,5 @@ import "dotenv/config"; +import { resolve as resolvePath } from "path"; import { loadSync } from "@grpc/proto-loader"; import { loadPackageDefinition, Server } from "@grpc/grpc-js"; @@ -9,17 +10,24 @@ import { serverInsecure } from "@delivery/resources/grpc-credentials"; import deliveryHandlers from "@delivery/handlers/delivery"; import personHandlers from "@delivery/handlers/person"; +import { createServerProxy } from "@delivery/lib/proxy"; +import { logGRPC } from "@delivery/middleware/log"; const PORT = process.env.PORT || 50008; const ADDRESS = `0.0.0.0:${PORT}`; -const PROTO_PATH = __dirname + "/../../proto/delivery.proto"; +const PROTO_PATH = resolvePath(__dirname + "/../../proto/delivery.proto"); const packageDefinition = loadSync(PROTO_PATH, options); -const { delivery } = loadPackageDefinition(packageDefinition) as any; // todo: fix any -const server = new Server(); +const grpc = loadPackageDefinition(packageDefinition) as any; +const { + DeliveryService: { service: ds }, + DeliveryPersonService: { service: dps }, +} = grpc.com.goodfood.delivery; -server.addService(delivery.DeliveryService.service, deliveryHandlers); -server.addService(delivery.DeliveryPersonService.service, personHandlers); +const server = createServerProxy(new Server()); +server.addService(ds, deliveryHandlers); +server.addService(dps, personHandlers); +server.use(logGRPC); server.bindAsync(ADDRESS, serverInsecure, () => { server.start(); @@ -31,5 +39,4 @@ server.bindAsync(ADDRESS, serverInsecure, () => { log.debug(message); }); - -export default server; \ No newline at end of file +export default server; From 947eb8e76b07b9d3ba994fd3abf56893c9b5e5d6 Mon Sep 17 00:00:00 2001 From: Florian LEROUX <10078837+floriaaan@users.noreply.github.com> Date: Wed, 10 May 2023 16:20:32 +0200 Subject: [PATCH 298/883] ref(proxy): remove log in handlers --- services/delivery/src/handlers/delivery/create.ts | 1 - services/delivery/src/handlers/delivery/delete.ts | 1 - services/delivery/src/handlers/delivery/get.ts | 1 - services/delivery/src/handlers/delivery/list-by-restaurant.ts | 4 ---- services/delivery/src/handlers/delivery/list-by-user.ts | 1 - services/delivery/src/handlers/delivery/update.ts | 1 - services/delivery/src/handlers/person/create.ts | 1 - services/delivery/src/handlers/person/delete.ts | 1 - services/delivery/src/handlers/person/get.ts | 1 - services/delivery/src/handlers/person/list-near.ts | 1 - services/delivery/src/handlers/person/list.ts | 1 - services/delivery/src/handlers/person/update.ts | 1 - services/proto/delivery.proto | 2 +- 13 files changed, 1 insertion(+), 16 deletions(-) diff --git a/services/delivery/src/handlers/delivery/create.ts b/services/delivery/src/handlers/delivery/create.ts index 1524de68..bba17ce1 100644 --- a/services/delivery/src/handlers/delivery/create.ts +++ b/services/delivery/src/handlers/delivery/create.ts @@ -7,7 +7,6 @@ export const CreateDelivery = async ( { request }: Data, callback: (err: any, response: any) => void ) => { - log.debug("request received at CreateDelivery handler\n", request); try { const { eta, address, status, delivery_person_id, restaurant_id, user_id } = request; diff --git a/services/delivery/src/handlers/delivery/delete.ts b/services/delivery/src/handlers/delivery/delete.ts index 35b5ade7..d6104883 100644 --- a/services/delivery/src/handlers/delivery/delete.ts +++ b/services/delivery/src/handlers/delivery/delete.ts @@ -7,7 +7,6 @@ export const DeleteDelivery = async ( data: Data, callback: (err: any, response: any) => void ) => { - log.debug("request received at DeleteDelivery handler\n", data.request); try { const { request } = data; const { id } = request; diff --git a/services/delivery/src/handlers/delivery/get.ts b/services/delivery/src/handlers/delivery/get.ts index c6da00b3..531a1dc9 100644 --- a/services/delivery/src/handlers/delivery/get.ts +++ b/services/delivery/src/handlers/delivery/get.ts @@ -7,7 +7,6 @@ export const GetDelivery = async ( data: Data, callback: (err: any, response: any) => void ) => { - log.debug("request received at GetDelivery handler\n", data.request); try { const { request } = data; const { id } = request; diff --git a/services/delivery/src/handlers/delivery/list-by-restaurant.ts b/services/delivery/src/handlers/delivery/list-by-restaurant.ts index fc413ae1..d0769b65 100644 --- a/services/delivery/src/handlers/delivery/list-by-restaurant.ts +++ b/services/delivery/src/handlers/delivery/list-by-restaurant.ts @@ -7,10 +7,6 @@ export const ListDeliveriesByRestaurant = async ( data: Data, callback: (err: any, response: any) => void ) => { - log.debug( - "request received at ListDeliveriesByRestaurant handler\n", - data.request - ); try { const { request } = data; const { id } = request; diff --git a/services/delivery/src/handlers/delivery/list-by-user.ts b/services/delivery/src/handlers/delivery/list-by-user.ts index 93eddff9..516b0d8e 100644 --- a/services/delivery/src/handlers/delivery/list-by-user.ts +++ b/services/delivery/src/handlers/delivery/list-by-user.ts @@ -7,7 +7,6 @@ export const ListDeliveriesByUser = async ( data: Data, callback: (err: any, response: any) => void ) => { - log.debug("request received at ListDeliveriesByUser handler\n", data.request); try { const { request } = data; const { id } = request; diff --git a/services/delivery/src/handlers/delivery/update.ts b/services/delivery/src/handlers/delivery/update.ts index a0267647..2c3f7f47 100644 --- a/services/delivery/src/handlers/delivery/update.ts +++ b/services/delivery/src/handlers/delivery/update.ts @@ -7,7 +7,6 @@ export const UpdateDelivery = async ( data: Data, callback: (err: any, response: any) => void ) => { - log.debug("request received at UpdateDelivery handler\n", data.request); try { const { eta, address, status, delivery_person_id, id } = data.request; diff --git a/services/delivery/src/handlers/person/create.ts b/services/delivery/src/handlers/person/create.ts index 1a918438..6e8d7701 100644 --- a/services/delivery/src/handlers/person/create.ts +++ b/services/delivery/src/handlers/person/create.ts @@ -7,7 +7,6 @@ export const CreateDeliveryPerson = async ( { request }: Data, callback: (err: any, response: any) => void ) => { - log.debug("request received at CreateDeliveryPerson handler\n", request); try { const { first_name, last_name, phone, location } = request; diff --git a/services/delivery/src/handlers/person/delete.ts b/services/delivery/src/handlers/person/delete.ts index 9edfd117..de459ec3 100644 --- a/services/delivery/src/handlers/person/delete.ts +++ b/services/delivery/src/handlers/person/delete.ts @@ -7,7 +7,6 @@ export const DeleteDeliveryPerson = async ( { request }: Data, callback: (err: any, response: any) => void ) => { - log.debug("request received at DeleteDeliveryPerson handler\n", request); try { const { id } = request; await prisma.deliveryPerson.delete({ where: { id } }); diff --git a/services/delivery/src/handlers/person/get.ts b/services/delivery/src/handlers/person/get.ts index e94093df..b92c0ead 100644 --- a/services/delivery/src/handlers/person/get.ts +++ b/services/delivery/src/handlers/person/get.ts @@ -7,7 +7,6 @@ export const GetDeliveryPerson = async ( { request }: Data, callback: (err: any, response: any) => void ) => { - log.debug("request received at GetDeliveryPerson handler\n", request); try { const { id } = request; const deliveryPerson = await prisma.deliveryPerson.findUnique({ diff --git a/services/delivery/src/handlers/person/list-near.ts b/services/delivery/src/handlers/person/list-near.ts index 900e5ac9..5daec2e2 100644 --- a/services/delivery/src/handlers/person/list-near.ts +++ b/services/delivery/src/handlers/person/list-near.ts @@ -7,7 +7,6 @@ export const ListNearDeliveryPersons = async ( { request }: Data, callback: (err: any, response: any) => void ) => { - log.debug("request received at ListNearDeliveryPersons handler\n", request); try { const { latitude, longitude } = request; const maxDistance = 10; // in km //TODO: make this a parameter diff --git a/services/delivery/src/handlers/person/list.ts b/services/delivery/src/handlers/person/list.ts index 468ea5e3..83cf2536 100644 --- a/services/delivery/src/handlers/person/list.ts +++ b/services/delivery/src/handlers/person/list.ts @@ -6,7 +6,6 @@ export const ListDeliveryPersons = async ( { request }: Data<{}>, callback: (err: any, response: any) => void ) => { - log.debug("request received at ListDeliveryPersons handler\n", request); try { const delivery_persons = await prisma.deliveryPerson.findMany(); callback(null, { delivery_persons }); diff --git a/services/delivery/src/handlers/person/update.ts b/services/delivery/src/handlers/person/update.ts index 7a6b1743..e177a9f2 100644 --- a/services/delivery/src/handlers/person/update.ts +++ b/services/delivery/src/handlers/person/update.ts @@ -7,7 +7,6 @@ export const UpdateDeliveryPerson = async ( { request }: Data, callback: (err: any, response: any) => void ) => { - log.debug("request received at UpdateDeliveryPerson handler\n", request); try { const { id, first_name, last_name, location, phone } = request; diff --git a/services/proto/delivery.proto b/services/proto/delivery.proto index 91a86b21..6ae4a8c3 100644 --- a/services/proto/delivery.proto +++ b/services/proto/delivery.proto @@ -1,7 +1,7 @@ syntax = "proto3"; import "google/protobuf/empty.proto"; -package delivery; +package com.goodfood.delivery; message Delivery { string id = 1; From b8d273f8964c31919424e7b8bf794df421dc47b0 Mon Sep 17 00:00:00 2001 From: Florian LEROUX <10078837+floriaaan@users.noreply.github.com> Date: Fri, 12 May 2023 15:24:06 +0200 Subject: [PATCH 299/883] test: remove tests --- services/delivery/log.docker-compose.yml | 50 +++++++++++ services/delivery/src/lib/mocks/prisma.ts | 23 ----- .../src/tests/grpc/create-delivery.test.ts | 84 ------------------- .../src/tests/prisma/delivery.test.ts | 36 -------- services/delivery/src/tests/setup.ts | 13 --- services/delivery/vitest.config.ts | 3 - 6 files changed, 50 insertions(+), 159 deletions(-) create mode 100644 services/delivery/log.docker-compose.yml delete mode 100644 services/delivery/src/lib/mocks/prisma.ts delete mode 100644 services/delivery/src/tests/grpc/create-delivery.test.ts delete mode 100644 services/delivery/src/tests/prisma/delivery.test.ts delete mode 100644 services/delivery/src/tests/setup.ts diff --git a/services/delivery/log.docker-compose.yml b/services/delivery/log.docker-compose.yml new file mode 100644 index 00000000..958a2964 --- /dev/null +++ b/services/delivery/log.docker-compose.yml @@ -0,0 +1,50 @@ +services: + goodfood-log: + depends_on: + - postgres + - rabbitmq + image: floriaaan/goodfood-log:latest + environment: + - DATABASE_URL=postgres://postgres:password@postgres:5432/postgres + - PORT=50021 + - AMQP_URL=amqp://guest:guest@rabbitmq:5672 + ports: + - "50021:50021" + networks: + - goodfood-log-network + + rabbitmq: + restart: always + image: rabbitmq:3-management + ports: + - "5672:5672" + - "15672:15672" + networks: + - goodfood-log-network + + postgres: + image: postgres:15.2 + environment: + - POSTGRES_USER=postgres + - POSTGRES_PASSWORD=password + ports: + - "5432:5432" + volumes: + - goodfood-log-volume:/var/lib/postgresql/data + networks: + - goodfood-log-network + + adminer: + depends_on: + - postgres + image: adminer + ports: + - "8080:8080" + networks: + - goodfood-log-network + +volumes: + goodfood-log-volume: + +networks: + goodfood-log-network: diff --git a/services/delivery/src/lib/mocks/prisma.ts b/services/delivery/src/lib/mocks/prisma.ts deleted file mode 100644 index 5f3da3d5..00000000 --- a/services/delivery/src/lib/mocks/prisma.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { mockDeep } from "vitest-mock-extended"; -import { Delivery, Prisma, PrismaClient } from "@prisma/client"; - -// Mock the PrismaClient -const prismaMock = mockDeep(); - -// Mock the Delivery model's `create` method -//@ts-ignore -prismaMock.delivery.create.mockImplementation(async ({ data }: Prisma.DeliveryCreateArgs) => { - const createdDelivery: Delivery = { - address: data.address, - eta: data.eta as Date, - user_id: data.user_id, - restaurant_id: data.restaurant_id, - // @ts-ignore - person: data.person, - id: "random_id", // set an example ID - status: "PENDING", // set an example status - }; - return createdDelivery; -}); - -export default prismaMock; diff --git a/services/delivery/src/tests/grpc/create-delivery.test.ts b/services/delivery/src/tests/grpc/create-delivery.test.ts deleted file mode 100644 index 48c77cd2..00000000 --- a/services/delivery/src/tests/grpc/create-delivery.test.ts +++ /dev/null @@ -1,84 +0,0 @@ -import { afterAll, describe, expect, it } from "vitest"; -import server from "@delivery/server"; -import { main as client_createDelivery } from "@delivery/client/delivery/create"; -import { Status } from "@prisma/client"; - -afterAll( - async () => - new Promise((resolve) => { - resolve( - server.tryShutdown((err) => { - if (err) console.log(err); - console.log("Server stopped"); - }) - ); - }) -); - -/* -Code Analysis - -Objective: -The main objective of the "main" function is to create a new delivery by calling the "CreateDelivery" method of the "DeliveryService" client and return the response. - -Inputs: -- "data" (optional): an object containing delivery data. If not provided, default data will be used. - -Flow: -1. Create a new instance of the "DeliveryService" client with the specified address and insecure credentials. -2. Call the "CreateDelivery" method of the client with the provided data. -3. Handle any errors or responses returned by the method. -4. Return the response. - -Outputs: -- "response": a Delivery object or null if an error occurred. - -Additional aspects: -- The function uses the "insecure" credentials and the address specified in the "ADDRESS" constant. -- The function uses the "DEFAULT_DATA" constant if no data is provided. -- The function logs any errors or responses using the "log.debug" function. -- The function returns a Promise that resolves to the response. -*/ - -describe("GRPC: create a Delivery object", () => { - // Tests that the function returns a delivery object with default data when no delivery data is provided. - it("test_default_data", async () => { - const response = await client_createDelivery(); - expect(response).toMatchObject({ - eta: "2022-01-01T00:00:00.000Z", - address: "10 Rue de la République, 75003 Paris, France", - status: Status.PENDING, - delivery_person_id: "random_id", - restaurant_id: "restaurant_id:1", - user_id: "user_id:1", - }); - }); - - // Tests that the function returns a delivery object when valid delivery data is provided. - it("test_valid_data", async () => { - const data = { - eta: "2022-01-01T00:00:00.000Z", - address: "123 Main St, Anytown USA", - status: Status.IN_PROGRESS, - delivery_person_id: "random_id", - restaurant_id: "restaurant_id:2", - user_id: "user_id:3", - }; - const response = await client_createDelivery(data); - expect(response).toMatchObject(data); - }); - - // Tests that the function returns null when invalid delivery data is provided. - it("test_invalid_data", async () => { - const data = { - eta: "invalid_date_format", - address: "", - status: "INVALID_STATUS", - delivery_person_id: "", - restaurant_id: "", - user_id: "", - }; - const response = await client_createDelivery(data); - expect(response).toBeNull(); - }); -}); diff --git a/services/delivery/src/tests/prisma/delivery.test.ts b/services/delivery/src/tests/prisma/delivery.test.ts deleted file mode 100644 index f03d8a13..00000000 --- a/services/delivery/src/tests/prisma/delivery.test.ts +++ /dev/null @@ -1,36 +0,0 @@ -import prisma from "@delivery/lib/mocks/prisma"; -import { Prisma, Status } from "@prisma/client"; -import { expect, test } from "vitest"; - - - -test("PRISMA: create a Delivery object", async () => { - const input: Prisma.DeliveryCreateInput = { - address: "123 Main St", - eta: new Date(), - - user_id: "random_user_id", - restaurant_id: "random_restaurant_id", - - person: { - create: { - first_name: "Food", - last_name: "Good", - phone: "123456789", - }, - }, - }; - - - const delivery = await prisma.delivery.create({ - data: input, - }); - - - - expect(delivery).toStrictEqual({ - ...input, - id: 1, - status: Status.PENDING, - }); -}); diff --git a/services/delivery/src/tests/setup.ts b/services/delivery/src/tests/setup.ts deleted file mode 100644 index 69307e38..00000000 --- a/services/delivery/src/tests/setup.ts +++ /dev/null @@ -1,13 +0,0 @@ -/** - * Tests mocks - * - * This file is used to mock the Prisma client in tests. - * - */ - -import prisma from "@delivery/lib/mocks/prisma"; -import { vitest } from "vitest"; - -vitest.mock("@prisma/client", () => prisma); -vitest.mock("@delivery/lib/prisma", () => prisma); - diff --git a/services/delivery/vitest.config.ts b/services/delivery/vitest.config.ts index 458e2d25..08cfe3bf 100644 --- a/services/delivery/vitest.config.ts +++ b/services/delivery/vitest.config.ts @@ -4,7 +4,4 @@ import tsconfigPaths from "vite-tsconfig-paths"; export default defineConfig({ plugins: [tsconfigPaths()], base: "/src/tests", - test: { - setupFiles: ["./src/tests/setup.ts"], - }, }); From 81adf35ed902196051e38646258ffa6d738040c8 Mon Sep 17 00:00:00 2001 From: Florian LEROUX Date: Sat, 8 Jul 2023 14:34:10 +0200 Subject: [PATCH 300/883] fix(ci): update ci to match order ci workflow --- .github/workflows/delivery.yml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/delivery.yml b/.github/workflows/delivery.yml index 1b68e1b2..111ae5b4 100644 --- a/.github/workflows/delivery.yml +++ b/.github/workflows/delivery.yml @@ -2,9 +2,9 @@ name: Delivery Microservice CI/CD on: push: - branches: [ delivery ] + branches: [delivery] pull_request: - branches: [ dev, main ] + branches: [main] jobs: build: @@ -13,7 +13,7 @@ jobs: - uses: actions/checkout@master - uses: pnpm/action-setup@v2 with: - version: 7 + version: latest - uses: actions/setup-node@v3 with: node-version: "18.x" @@ -35,7 +35,7 @@ jobs: - uses: actions/checkout@master - uses: pnpm/action-setup@v2 with: - version: 7 + version: latest - uses: actions/setup-node@v3 with: node-version: "18.x" @@ -52,7 +52,7 @@ jobs: publish: runs-on: ubuntu-latest - needs: [ build, test ] + needs: [build, test] steps: - name: Checkout code uses: actions/checkout@master @@ -67,4 +67,4 @@ jobs: context: ./services/ file: ./services/delivery/Dockerfile push: true - tags: floriaaan/goodfood-delivery:latest \ No newline at end of file + tags: floriaaan/goodfood-delivery:latest From b26be0959961195848228d3170b5cb3c548ff06e Mon Sep 17 00:00:00 2001 From: Florian LEROUX Date: Sat, 8 Jul 2023 14:49:56 +0200 Subject: [PATCH 301/883] ref(prisma): update prisma, fix seed --- services/delivery/package.json | 4 ++-- services/delivery/pnpm-lock.yaml | 34 +++++++++++++++++-------------- services/delivery/prisma/seed.ts | 35 +++++++++++++++++++++++++++----- 3 files changed, 51 insertions(+), 22 deletions(-) diff --git a/services/delivery/package.json b/services/delivery/package.json index dfc8839e..f2914581 100644 --- a/services/delivery/package.json +++ b/services/delivery/package.json @@ -21,7 +21,7 @@ "dependencies": { "@grpc/grpc-js": "^1.8.13", "@grpc/proto-loader": "0.7.6", - "@prisma/client": "4.14.0", + "@prisma/client": "4.16.2", "amqplib": "^0.10.3", "dotenv": "^16.0.3", "protobufjs": "7.2.2" @@ -33,7 +33,7 @@ "esbuild": "^0.17.14", "nodemon": "^2.0.22", "pkg": "^5.8.1", - "prisma": "4.14.0", + "prisma": "4.16.2", "ts-node": "10.9.1", "tsconfig-paths": "^4.1.2", "typescript": "5.0.2", diff --git a/services/delivery/pnpm-lock.yaml b/services/delivery/pnpm-lock.yaml index 9d320234..12b035df 100644 --- a/services/delivery/pnpm-lock.yaml +++ b/services/delivery/pnpm-lock.yaml @@ -1,5 +1,9 @@ lockfileVersion: '6.0' +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + dependencies: '@grpc/grpc-js': specifier: ^1.8.13 @@ -8,8 +12,8 @@ dependencies: specifier: 0.7.6 version: 0.7.6 '@prisma/client': - specifier: 4.14.0 - version: 4.14.0(prisma@4.14.0) + specifier: 4.16.2 + version: 4.16.2(prisma@4.16.2) amqplib: specifier: ^0.10.3 version: 0.10.3 @@ -40,8 +44,8 @@ devDependencies: specifier: ^5.8.1 version: 5.8.1 prisma: - specifier: 4.14.0 - version: 4.14.0 + specifier: 4.16.2 + version: 4.16.2 ts-node: specifier: 10.9.1 version: 10.9.1(@types/node@18.15.9)(typescript@5.0.2) @@ -402,8 +406,8 @@ packages: fastq: 1.15.0 dev: true - /@prisma/client@4.14.0(prisma@4.14.0): - resolution: {integrity: sha512-MK/XaA2sFdfaOa7I9MjNKz6dxeIEdeZlnpNRoF2w3JuRLlFJLkpp6cD3yaqw2nUUhbrn3Iqe3ZpVV+VuGGil7Q==} + /@prisma/client@4.16.2(prisma@4.16.2): + resolution: {integrity: sha512-qCoEyxv1ZrQ4bKy39GnylE8Zq31IRmm8bNhNbZx7bF2cU5aiCCnSa93J2imF88MBjn7J9eUQneNxUQVJdl/rPQ==} engines: {node: '>=14.17'} requiresBuild: true peerDependencies: @@ -412,16 +416,16 @@ packages: prisma: optional: true dependencies: - '@prisma/engines-version': 4.14.0-67.d9a4c5988f480fa576d43970d5a23641aa77bc9c - prisma: 4.14.0 + '@prisma/engines-version': 4.16.1-1.4bc8b6e1b66cb932731fb1bdbbc550d1e010de81 + prisma: 4.16.2 dev: false - /@prisma/engines-version@4.14.0-67.d9a4c5988f480fa576d43970d5a23641aa77bc9c: - resolution: {integrity: sha512-3jum8/YSudeSN0zGW5qkpz+wAN2V/NYCQ+BPjvHYDfWatLWlQkqy99toX0GysDeaUoBIJg1vaz2yKqiA3CFcQw==} + /@prisma/engines-version@4.16.1-1.4bc8b6e1b66cb932731fb1bdbbc550d1e010de81: + resolution: {integrity: sha512-q617EUWfRIDTriWADZ4YiWRZXCa/WuhNgLTVd+HqWLffjMSPzyM5uOWoauX91wvQClSKZU4pzI4JJLQ9Kl62Qg==} dev: false - /@prisma/engines@4.14.0: - resolution: {integrity: sha512-PDNlhP/1vyTgmNyiucGqGCdXIp7HIkkvKO50si3y3PcceeHvqtiKPaH1iJdz63jCWMVMbj2MElSxXPOeBvEVIQ==} + /@prisma/engines@4.16.2: + resolution: {integrity: sha512-vx1nxVvN4QeT/cepQce68deh/Turxy5Mr+4L4zClFuK1GlxN3+ivxfuv+ej/gvidWn1cE1uAhW7ALLNlYbRUAw==} requiresBuild: true /@protobufjs/aspromise@1.1.2: @@ -1540,13 +1544,13 @@ packages: react-is: 17.0.2 dev: true - /prisma@4.14.0: - resolution: {integrity: sha512-+5dMl1uxMQb4RepndY6AwR9xi1cDcaGFICu+ws6/Nmgt93mFPNj8tYxSfTdmfg+rkNrUId9rk/Ac2vTgLe/oXA==} + /prisma@4.16.2: + resolution: {integrity: sha512-SYCsBvDf0/7XSJyf2cHTLjLeTLVXYfqp7pG5eEVafFLeT0u/hLFz/9W196nDRGUOo1JfPatAEb+uEnTQImQC1g==} engines: {node: '>=14.17'} hasBin: true requiresBuild: true dependencies: - '@prisma/engines': 4.14.0 + '@prisma/engines': 4.16.2 /process-nextick-args@2.0.1: resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} diff --git a/services/delivery/prisma/seed.ts b/services/delivery/prisma/seed.ts index 7c517d02..66207fd5 100644 --- a/services/delivery/prisma/seed.ts +++ b/services/delivery/prisma/seed.ts @@ -4,7 +4,7 @@ const prisma = new PrismaClient(); const deliveryPerson: Prisma.DeliveryPersonCreateInput[] = [ { - id: "random_id", + // id: "random_id", first_name: "John", last_name: "Doe", phone: "0612345678", @@ -28,7 +28,12 @@ const deliveries: Prisma.DeliveryCreateInput[] = [ { address: "15 rue de la paix 75000 Paris", eta: new Date("2023-01-01"), - delivery_person: { create: deliveryPerson[0] }, + delivery_person: { + connectOrCreate: { + where: { phone: deliveryPerson[0].phone }, + create: deliveryPerson[0], + }, + }, restaurant_id: "restaurant_id:1", user_id: "user_id:1", @@ -36,7 +41,12 @@ const deliveries: Prisma.DeliveryCreateInput[] = [ { address: "15 rue de la paix 75000 Paris", eta: new Date("2023-01-01"), - delivery_person: { create: deliveryPerson[0] }, + delivery_person: { + connectOrCreate: { + where: { phone: deliveryPerson[0].phone }, + create: deliveryPerson[0], + }, + }, restaurant_id: "restaurant_id:2", user_id: "user_id:1", @@ -44,7 +54,12 @@ const deliveries: Prisma.DeliveryCreateInput[] = [ { address: "16 rue de la paix 75000 Paris", eta: new Date("2023-02-01"), - delivery_person: { create: deliveryPerson[1] }, + delivery_person: { + connectOrCreate: { + where: { phone: deliveryPerson[1].phone }, + create: deliveryPerson[1], + }, + }, restaurant_id: "restaurant_id:1", user_id: "user_id:2", @@ -52,7 +67,12 @@ const deliveries: Prisma.DeliveryCreateInput[] = [ { address: "17 rue de la paix 75000 Paris", eta: new Date("2023-03-01"), - delivery_person: { create: deliveryPerson[2] }, + delivery_person: { + connectOrCreate: { + where: { phone: deliveryPerson[2].phone }, + create: deliveryPerson[2], + }, + }, restaurant_id: "restaurant_id:1", user_id: "user_id:3", @@ -60,6 +80,11 @@ const deliveries: Prisma.DeliveryCreateInput[] = [ ]; async function main() { + console.log(`Delete existing data ...`); + await prisma.delivery.deleteMany(); + await prisma.deliveryPerson.deleteMany(); + console.log(`Existing data deleted.`); + console.log(`Start seeding ...`); for (const d of deliveries) { const delivery = await prisma.delivery.create({ From c4dd8c115d55168fb54e7004fc4bee7020d13761 Mon Sep 17 00:00:00 2001 From: Florian LEROUX Date: Sat, 8 Jul 2023 15:06:08 +0200 Subject: [PATCH 302/883] ref(log): change path in log amqp publish --- services/delivery/src/middleware/log.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/services/delivery/src/middleware/log.ts b/services/delivery/src/middleware/log.ts index 1a8c08eb..3e7c48e6 100644 --- a/services/delivery/src/middleware/log.ts +++ b/services/delivery/src/middleware/log.ts @@ -35,7 +35,8 @@ export const logGRPC = async (ctx: Context, next: () => Promise) => { const requestAt = new Date(); await next(); const responseAt = new Date(); - const { request, path } = parseContext(ctx); + let { request, path } = parseContext(ctx); + path = path?.split(".").at(-1) || ""; publish({ request, path }, "log"); log.debug(msg("GRPC", path, requestAt, responseAt), JSON.stringify(request)); -}; \ No newline at end of file +}; From 79b4fb6aee65530962bd7b7a34c9dc8ac699cfe0 Mon Sep 17 00:00:00 2001 From: Florian LEROUX Date: Sun, 9 Jul 2023 12:25:08 +0200 Subject: [PATCH 303/883] fix(proto): fix typo in proto --- services/proto/delivery.proto | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/proto/delivery.proto b/services/proto/delivery.proto index 6ae4a8c3..1e43d08e 100644 --- a/services/proto/delivery.proto +++ b/services/proto/delivery.proto @@ -80,7 +80,7 @@ message DeliveryList { } message DeliveryPersonList { - repeated DeliveryPersonList delivery_persons = 1; + repeated DeliveryPerson delivery_persons = 1; } message DeliveryPersonId { From 83584923173b4a7a4b5bca43115b5596e207518e Mon Sep 17 00:00:00 2001 From: Florian LEROUX Date: Sun, 9 Jul 2023 12:25:48 +0200 Subject: [PATCH 304/883] feat(redis): add redis caching system --- services/delivery/docker-compose.yml | 34 ++++++++++ services/delivery/package.json | 2 + services/delivery/pnpm-lock.yaml | 93 ++++++++++++++++++++++++++++ services/delivery/src/lib/prisma.ts | 16 +++++ services/delivery/src/lib/redis.ts | 7 +++ 5 files changed, 152 insertions(+) create mode 100644 services/delivery/docker-compose.yml create mode 100644 services/delivery/src/lib/redis.ts diff --git a/services/delivery/docker-compose.yml b/services/delivery/docker-compose.yml new file mode 100644 index 00000000..2c4e9bff --- /dev/null +++ b/services/delivery/docker-compose.yml @@ -0,0 +1,34 @@ +services: + delivery-redis: + image: redis:latest + ports: + - "6379:6379" + volumes: + - goodfood-delivery-volume:/data + networks: + - goodfood-delivery-network + command: redis-server --appendonly yes + environment: + REDIS_USERNAME: redis + REDIS_PASSWORD: password + + + delivery-postgres: + image: postgres:latest + ports: + - "5432:5432" + volumes: + - goodfood-delivery-volume:/var/lib/postgresql/data + networks: + - goodfood-delivery-network + environment: + POSTGRES_USER: postgres + POSTGRES_PASSWORD: password + POSTGRES_DB: postgres + PGDATA: /var/lib/postgresql/data/pgdata + +volumes: + goodfood-delivery-volume: + +networks: + goodfood-delivery-network: diff --git a/services/delivery/package.json b/services/delivery/package.json index f2914581..8a8387c8 100644 --- a/services/delivery/package.json +++ b/services/delivery/package.json @@ -24,6 +24,8 @@ "@prisma/client": "4.16.2", "amqplib": "^0.10.3", "dotenv": "^16.0.3", + "ioredis": "5.3.2", + "prisma-redis-middleware": "4.8.0", "protobufjs": "7.2.2" }, "devDependencies": { diff --git a/services/delivery/pnpm-lock.yaml b/services/delivery/pnpm-lock.yaml index 12b035df..701ed3dc 100644 --- a/services/delivery/pnpm-lock.yaml +++ b/services/delivery/pnpm-lock.yaml @@ -20,6 +20,12 @@ dependencies: dotenv: specifier: ^16.0.3 version: 16.0.3 + ioredis: + specifier: 5.3.2 + version: 5.3.2 + prisma-redis-middleware: + specifier: 4.8.0 + version: 4.8.0 protobufjs: specifier: 7.2.2 version: 7.2.2 @@ -343,6 +349,10 @@ packages: yargs: 16.2.0 dev: false + /@ioredis/commands@1.2.0: + resolution: {integrity: sha512-Sx1pU8EM64o2BrqNpEO1CNLtKQwyhuXuqyfH7oGKCk+1a33d2r5saW8zNwm3j6BTExtjrv2BxTgzzkMwts6vGg==} + dev: false + /@istanbuljs/schema@0.1.3: resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} engines: {node: '>=8'} @@ -638,6 +648,13 @@ packages: resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} dev: true + /async-cache-dedupe@1.12.0: + resolution: {integrity: sha512-LKumaBNhzvZrbrRi3DtIf0ETgjqcGOa/M2U+0DpTp8f+RzIiWubiQmBjuYUaihxetR3cWWC6hQj/uDVBuYajRA==} + dependencies: + mnemonist: 0.39.5 + safe-stable-stringify: 2.4.3 + dev: false + /at-least-node@1.0.0: resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} engines: {node: '>= 4.0.0'} @@ -772,6 +789,11 @@ packages: strip-ansi: 6.0.1 wrap-ansi: 7.0.0 + /cluster-key-slot@1.1.2: + resolution: {integrity: sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==} + engines: {node: '>=0.10.0'} + dev: false + /color-convert@2.0.1: resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} engines: {node: '>=7.0.0'} @@ -847,6 +869,11 @@ packages: engines: {node: '>=4.0.0'} dev: true + /denque@2.1.0: + resolution: {integrity: sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==} + engines: {node: '>=0.10'} + dev: false + /detect-libc@2.0.1: resolution: {integrity: sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==} engines: {node: '>=8'} @@ -1123,6 +1150,23 @@ packages: p-is-promise: 3.0.0 dev: true + /ioredis@5.3.2: + resolution: {integrity: sha512-1DKMMzlIHM02eBBVOFQ1+AolGjs6+xEcM4PDL7NqOS6szq7H9jSaEkIUH6/a5Hl241LzW6JLSiAbNvTQjUupUA==} + engines: {node: '>=12.22.0'} + dependencies: + '@ioredis/commands': 1.2.0 + cluster-key-slot: 1.1.2 + debug: 4.3.4 + denque: 2.1.0 + lodash.defaults: 4.2.0 + lodash.isarguments: 3.1.0 + redis-errors: 1.2.0 + redis-parser: 3.0.0 + standard-as-callback: 2.1.0 + transitivePeerDependencies: + - supports-color + dev: false + /is-binary-path@2.1.0: resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} engines: {node: '>=8'} @@ -1236,6 +1280,14 @@ packages: resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} dev: false + /lodash.defaults@4.2.0: + resolution: {integrity: sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==} + dev: false + + /lodash.isarguments@3.1.0: + resolution: {integrity: sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==} + dev: false + /long@4.0.0: resolution: {integrity: sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==} dev: false @@ -1309,6 +1361,12 @@ packages: ufo: 1.1.1 dev: true + /mnemonist@0.39.5: + resolution: {integrity: sha512-FPUtkhtJ0efmEFGpU14x7jGbTB+s18LrzRL2KgoWz9YvcY3cPomz8tih01GbHwnGk/OmkOKfqd/RAQoc8Lm7DQ==} + dependencies: + obliterator: 2.0.4 + dev: false + /ms@2.1.2: resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} @@ -1381,6 +1439,10 @@ packages: engines: {node: '>=0.10.0'} dev: true + /obliterator@2.0.4: + resolution: {integrity: sha512-lgHwxlxV1qIg1Eap7LgIeoBWIMFibOjbrYPIPJZcI1mmGAI2m3lNYpK12Y+GBdPQ0U1hRwSord7GIaawz962qQ==} + dev: false + /once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} dependencies: @@ -1544,6 +1606,16 @@ packages: react-is: 17.0.2 dev: true + /prisma-redis-middleware@4.8.0: + resolution: {integrity: sha512-d1B7TVLiR8aSiOY2GPKKDb5EWGTK+EmlIkztAZCPWxs4/IHGfIAZiDoLklp6CcK+5ckjcaJq8aWE5AjRJ3+Rpg==} + engines: {node: ^16.x || ^18.x, npm: ^7.x || ^8.x || ^9.x} + dependencies: + async-cache-dedupe: 1.12.0 + ioredis: 5.3.2 + transitivePeerDependencies: + - supports-color + dev: false + /prisma@4.16.2: resolution: {integrity: sha512-SYCsBvDf0/7XSJyf2cHTLjLeTLVXYfqp7pG5eEVafFLeT0u/hLFz/9W196nDRGUOo1JfPatAEb+uEnTQImQC1g==} engines: {node: '>=14.17'} @@ -1650,6 +1722,18 @@ packages: picomatch: 2.3.1 dev: true + /redis-errors@1.2.0: + resolution: {integrity: sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w==} + engines: {node: '>=4'} + dev: false + + /redis-parser@3.0.0: + resolution: {integrity: sha512-DJnGAeenTdpMEH6uAJRK/uiyEIH9WVsUmoLwzudwGJUwZPp80PDBWPHXSAGNPwNvIXAbe7MSUB1zQFugFml66A==} + engines: {node: '>=4'} + dependencies: + redis-errors: 1.2.0 + dev: false + /require-directory@2.1.1: resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} engines: {node: '>=0.10.0'} @@ -1700,6 +1784,11 @@ packages: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} dev: true + /safe-stable-stringify@2.4.3: + resolution: {integrity: sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==} + engines: {node: '>=10'} + dev: false + /semver@5.7.1: resolution: {integrity: sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==} hasBin: true @@ -1789,6 +1878,10 @@ packages: resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} dev: true + /standard-as-callback@2.1.0: + resolution: {integrity: sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A==} + dev: false + /std-env@3.3.2: resolution: {integrity: sha512-uUZI65yrV2Qva5gqE0+A7uVAvO40iPo6jGhs7s8keRfHCmtg+uB2X6EiLGCI9IgL1J17xGhvoOqSz79lzICPTA==} dev: true diff --git a/services/delivery/src/lib/prisma.ts b/services/delivery/src/lib/prisma.ts index 4d495ef0..ff8519b4 100644 --- a/services/delivery/src/lib/prisma.ts +++ b/services/delivery/src/lib/prisma.ts @@ -1,4 +1,6 @@ import { Prisma, PrismaClient } from "@prisma/client"; +import { createPrismaRedisCache } from "prisma-redis-middleware"; +import { redis } from "@delivery/lib/redis"; let prisma: PrismaClient; type GlobalWithPrisma = typeof globalThis & { @@ -24,6 +26,20 @@ if (process.env.NODE_ENV === "production") { prisma = (global as GlobalWithPrisma).prisma; } +const cacheMiddleware: Prisma.Middleware = createPrismaRedisCache({ + models: [ + { model: "DeliveryPerson", cacheTime: 300, cacheKey: "delivery_person" }, + ], + storage: { + type: "redis", + options: { client: redis, invalidation: { referencesTTL: 300 } }, + }, + cacheTime: 300, +}); + +//todo: change to $extends when it's available for prisma-redis-middleware +prisma.$use(cacheMiddleware); + export default prisma; export { prisma }; diff --git a/services/delivery/src/lib/redis.ts b/services/delivery/src/lib/redis.ts new file mode 100644 index 00000000..0eb33bb2 --- /dev/null +++ b/services/delivery/src/lib/redis.ts @@ -0,0 +1,7 @@ +import { Redis } from "ioredis" + +export const redis = new Redis({ + host: process.env.REDIS_HOST || "localhost", + username: process.env.REDIS_USERNAME || undefined, + password: process.env.REDIS_PASSWORD || undefined, +}) \ No newline at end of file From ee86bb447b4efba204f13eb809e51a0e023c062c Mon Sep 17 00:00:00 2001 From: Florian LEROUX Date: Sun, 9 Jul 2023 12:28:19 +0200 Subject: [PATCH 305/883] fix(ci): remove library --- services/delivery/package.json | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/services/delivery/package.json b/services/delivery/package.json index 8a8387c8..93d60e05 100644 --- a/services/delivery/package.json +++ b/services/delivery/package.json @@ -31,7 +31,6 @@ "devDependencies": { "@types/amqplib": "^0.10.1", "@types/node": "18.15.9", - "@vitest/coverage-c8": "^0.29.8", "esbuild": "^0.17.14", "nodemon": "^2.0.22", "pkg": "^5.8.1", @@ -40,8 +39,7 @@ "tsconfig-paths": "^4.1.2", "typescript": "5.0.2", "vite-tsconfig-paths": "^4.0.7", - "vitest": "^0.29.8", - "vitest-mock-extended": "^1.1.3" + "vitest": "^0.29.8" }, "prisma": { "seed": "ts-node prisma/seed.ts" From d817676ef9eb6ef8acd5b91c31871995f47f59ca Mon Sep 17 00:00:00 2001 From: Florian LEROUX Date: Sun, 9 Jul 2023 12:29:19 +0200 Subject: [PATCH 306/883] fix(ci): remove library --- services/delivery/package.json | 4 +- services/delivery/pnpm-lock.yaml | 258 ------------------------------- 2 files changed, 1 insertion(+), 261 deletions(-) diff --git a/services/delivery/package.json b/services/delivery/package.json index 8a8387c8..93d60e05 100644 --- a/services/delivery/package.json +++ b/services/delivery/package.json @@ -31,7 +31,6 @@ "devDependencies": { "@types/amqplib": "^0.10.1", "@types/node": "18.15.9", - "@vitest/coverage-c8": "^0.29.8", "esbuild": "^0.17.14", "nodemon": "^2.0.22", "pkg": "^5.8.1", @@ -40,8 +39,7 @@ "tsconfig-paths": "^4.1.2", "typescript": "5.0.2", "vite-tsconfig-paths": "^4.0.7", - "vitest": "^0.29.8", - "vitest-mock-extended": "^1.1.3" + "vitest": "^0.29.8" }, "prisma": { "seed": "ts-node prisma/seed.ts" diff --git a/services/delivery/pnpm-lock.yaml b/services/delivery/pnpm-lock.yaml index 701ed3dc..3afeb09a 100644 --- a/services/delivery/pnpm-lock.yaml +++ b/services/delivery/pnpm-lock.yaml @@ -37,9 +37,6 @@ devDependencies: '@types/node': specifier: 18.15.9 version: 18.15.9 - '@vitest/coverage-c8': - specifier: ^0.29.8 - version: 0.29.8(vitest@0.29.8) esbuild: specifier: ^0.17.14 version: 0.17.14 @@ -67,9 +64,6 @@ devDependencies: vitest: specifier: ^0.29.8 version: 0.29.8 - vitest-mock-extended: - specifier: ^1.1.3 - version: 1.1.3(typescript@5.0.2)(vitest@0.29.8) packages: @@ -120,10 +114,6 @@ packages: 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'} @@ -353,11 +343,6 @@ packages: resolution: {integrity: sha512-Sx1pU8EM64o2BrqNpEO1CNLtKQwyhuXuqyfH7oGKCk+1a33d2r5saW8zNwm3j6BTExtjrv2BxTgzzkMwts6vGg==} dev: false - /@istanbuljs/schema@0.1.3: - resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} - engines: {node: '>=8'} - dev: true - /@jridgewell/gen-mapping@0.3.2: resolution: {integrity: sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==} engines: {node: '>=6.0.0'} @@ -381,13 +366,6 @@ packages: resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==} dev: true - /@jridgewell/trace-mapping@0.3.17: - resolution: {integrity: sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==} - dependencies: - '@jridgewell/resolve-uri': 3.1.0 - '@jridgewell/sourcemap-codec': 1.4.14 - dev: true - /@jridgewell/trace-mapping@0.3.9: resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} dependencies: @@ -513,10 +491,6 @@ packages: resolution: {integrity: sha512-KnRanxnpfpjUTqTCXslZSEdLfXExwgNxYPdiO2WGUj8+HDjFi8R3k5RVKPeSCzLjCcshCAtVO2QBbVuAV4kTnw==} dev: true - /@types/istanbul-lib-coverage@2.0.4: - resolution: {integrity: sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==} - dev: true - /@types/long@4.0.2: resolution: {integrity: sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==} dev: false @@ -524,17 +498,6 @@ packages: /@types/node@18.15.9: resolution: {integrity: sha512-dUxhiNzBLr6IqlZXz6e/rN2YQXlFgOei/Dxy+e3cyXTJ4txSUbGT2/fmnD6zd/75jDMeW5bDee+YXxlFKHoV0A==} - /@vitest/coverage-c8@0.29.8(vitest@0.29.8): - resolution: {integrity: sha512-y+sEMQMctWokjnSqm3FCQEYFkjLrYaznsxEZHxcx8z2aftpYg3A5tvI1S5himfdEFo7o+OeHzh40bPSWZHW4oQ==} - peerDependencies: - vitest: '>=0.29.0 <1' - dependencies: - c8: 7.13.0 - picocolors: 1.0.0 - std-env: 3.3.2 - vitest: 0.29.8 - dev: true - /@vitest/expect@0.29.8: resolution: {integrity: sha512-xlcVXn5I5oTq6NiZSY3ykyWixBxr5mG8HYtjvpgg6KaqHm0mvhX18xuwl5YGxIRNt/A5jidd7CWcNHrSvgaQqQ==} dependencies: @@ -706,25 +669,6 @@ packages: ieee754: 1.2.1 dev: true - /c8@7.13.0: - resolution: {integrity: sha512-/NL4hQTv1gBL6J6ei80zu3IiTrmePDKXKXOTLpHvcIWZTVYQlDhVWjjWvkhICylE8EwwnMVzDZugCvdx0/DIIA==} - engines: {node: '>=10.12.0'} - hasBin: true - dependencies: - '@bcoe/v8-coverage': 0.2.3 - '@istanbuljs/schema': 0.1.3 - find-up: 5.0.0 - foreground-child: 2.0.0 - istanbul-lib-coverage: 3.2.0 - istanbul-lib-report: 3.0.0 - istanbul-reports: 3.1.5 - rimraf: 3.0.2 - test-exclude: 6.0.0 - v8-to-istanbul: 9.1.0 - yargs: 16.2.0 - yargs-parser: 20.2.9 - dev: true - /cac@6.7.14: resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} engines: {node: '>=8'} @@ -807,10 +751,6 @@ packages: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} dev: true - /convert-source-map@1.9.0: - resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} - dev: true - /core-util-is@1.0.3: resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} @@ -818,15 +758,6 @@ packages: resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} dev: true - /cross-spawn@7.0.3: - resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} - engines: {node: '>= 8'} - dependencies: - path-key: 3.1.1 - shebang-command: 2.0.0 - which: 2.0.2 - dev: true - /debug@3.2.7(supports-color@5.5.0): resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} peerDependencies: @@ -981,22 +912,6 @@ packages: to-regex-range: 5.0.1 dev: true - /find-up@5.0.0: - resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} - engines: {node: '>=10'} - dependencies: - locate-path: 6.0.0 - path-exists: 4.0.0 - dev: true - - /foreground-child@2.0.0: - resolution: {integrity: sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==} - engines: {node: '>=8.0.0'} - dependencies: - cross-spawn: 7.0.3 - signal-exit: 3.0.7 - dev: true - /from2@2.3.0: resolution: {integrity: sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==} dependencies: @@ -1018,10 +933,6 @@ packages: universalify: 2.0.0 dev: true - /fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - dev: true - /fsevents@2.3.2: resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} @@ -1053,17 +964,6 @@ packages: is-glob: 4.0.3 dev: true - /glob@7.2.3: - resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - dev: true - /globby@11.1.0: resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} engines: {node: '>=10'} @@ -1101,10 +1001,6 @@ packages: function-bind: 1.1.1 dev: true - /html-escaper@2.0.2: - resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} - dev: true - /https-proxy-agent@5.0.1: resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} engines: {node: '>= 6'} @@ -1128,13 +1024,6 @@ packages: engines: {node: '>= 4'} dev: true - /inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} - dependencies: - once: 1.4.0 - wrappy: 1.0.2 - dev: true - /inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} @@ -1214,32 +1103,6 @@ packages: resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} dev: true - /isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - dev: true - - /istanbul-lib-coverage@3.2.0: - resolution: {integrity: sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==} - engines: {node: '>=8'} - dev: true - - /istanbul-lib-report@3.0.0: - resolution: {integrity: sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==} - engines: {node: '>=8'} - dependencies: - istanbul-lib-coverage: 3.2.0 - make-dir: 3.1.0 - supports-color: 7.2.0 - dev: true - - /istanbul-reports@3.1.5: - resolution: {integrity: sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==} - engines: {node: '>=8'} - dependencies: - html-escaper: 2.0.2 - istanbul-lib-report: 3.0.0 - dev: true - /jsesc@2.5.2: resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} engines: {node: '>=4'} @@ -1269,13 +1132,6 @@ packages: engines: {node: '>=14'} dev: true - /locate-path@6.0.0: - resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} - engines: {node: '>=10'} - dependencies: - p-locate: 5.0.0 - dev: true - /lodash.camelcase@4.3.0: resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} dev: false @@ -1309,13 +1165,6 @@ packages: yallist: 4.0.0 dev: true - /make-dir@3.1.0: - resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} - engines: {node: '>=8'} - dependencies: - semver: 6.3.0 - dev: true - /make-error@1.3.6: resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} dev: true @@ -1454,13 +1303,6 @@ packages: engines: {node: '>=8'} dev: true - /p-limit@3.1.0: - resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} - engines: {node: '>=10'} - dependencies: - yocto-queue: 0.1.0 - dev: true - /p-limit@4.0.0: resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -1468,28 +1310,6 @@ packages: yocto-queue: 1.0.0 dev: true - /p-locate@5.0.0: - resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} - engines: {node: '>=10'} - dependencies: - p-limit: 3.1.0 - dev: true - - /path-exists@4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} - dev: true - - /path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} - dev: true - - /path-key@3.1.1: - resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} - engines: {node: '>=8'} - dev: true - /path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} dev: true @@ -1756,13 +1576,6 @@ packages: engines: {iojs: '>=1.0.0', node: '>=0.10.0'} dev: true - /rimraf@3.0.2: - resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} - hasBin: true - dependencies: - glob: 7.2.3 - dev: true - /rollup@3.20.2: resolution: {integrity: sha512-3zwkBQl7Ai7MFYQE0y1MeQ15+9jsi7XxfrqwTb/9EK8D9C9+//EBR4M+CuA1KODRaNbFez/lWxA5vhEGZp4MUg==} engines: {node: '>=14.18.0', npm: '>=8.0.0'} @@ -1794,11 +1607,6 @@ packages: hasBin: true dev: true - /semver@6.3.0: - resolution: {integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==} - hasBin: true - dev: true - /semver@7.0.0: resolution: {integrity: sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==} hasBin: true @@ -1812,26 +1620,10 @@ packages: lru-cache: 6.0.0 dev: true - /shebang-command@2.0.0: - resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} - engines: {node: '>=8'} - dependencies: - shebang-regex: 3.0.0 - dev: true - - /shebang-regex@3.0.0: - resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} - 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==} - dev: true - /simple-concat@1.0.1: resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} dev: true @@ -1993,15 +1785,6 @@ packages: readable-stream: 3.6.2 dev: true - /test-exclude@6.0.0: - resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} - engines: {node: '>=8'} - dependencies: - '@istanbuljs/schema': 0.1.3 - glob: 7.2.3 - minimatch: 3.1.2 - dev: true - /tinybench@2.4.0: resolution: {integrity: sha512-iyziEiyFxX4kyxSp+MtY1oCH/lvjH3PxFN8PGCDeqcZWAJ/i+9y+nL85w99PxVzrIvew/GSkSbDYtiGVa85Afg==} dev: true @@ -2039,14 +1822,6 @@ packages: resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} dev: true - /ts-essentials@9.3.1(typescript@5.0.2): - resolution: {integrity: sha512-9CChSvQMyVRo29Vb1A2jbs+LKo3d/bAf+ndSaX0T8cEiy/HChVaRN/HY5DqUryZ8hZ6uol9bEgCnGmnDbwBR9Q==} - peerDependencies: - typescript: '>=4.1.0' - dependencies: - typescript: 5.0.2 - dev: true - /ts-node@10.9.1(@types/node@18.15.9)(typescript@5.0.2): resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} hasBin: true @@ -2145,15 +1920,6 @@ packages: resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} dev: true - /v8-to-istanbul@9.1.0: - resolution: {integrity: sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA==} - engines: {node: '>=10.12.0'} - dependencies: - '@jridgewell/trace-mapping': 0.3.17 - '@types/istanbul-lib-coverage': 2.0.4 - convert-source-map: 1.9.0 - dev: true - /vite-node@0.29.8(@types/node@18.15.9): resolution: {integrity: sha512-b6OtCXfk65L6SElVM20q5G546yu10/kNrhg08afEoWlFRJXFq9/6glsvSVY+aI6YeC1tu2TtAqI2jHEQmOmsFw==} engines: {node: '>=v14.16.0'} @@ -2225,17 +1991,6 @@ packages: fsevents: 2.3.2 dev: true - /vitest-mock-extended@1.1.3(typescript@5.0.2)(vitest@0.29.8): - resolution: {integrity: sha512-MiaKYZbTg+fjozKnCpoTTva0BnlSNYyk4jiPuM2xVhg4aou112QIrALdH3/ZKK6qfXWh0A17gFIjWJjylOlXxg==} - peerDependencies: - typescript: 3.x || 4.x || 5.x - vitest: '>=0.29.2' - dependencies: - ts-essentials: 9.3.1(typescript@5.0.2) - typescript: 5.0.2 - vitest: 0.29.8 - dev: true - /vitest@0.29.8: resolution: {integrity: sha512-JIAVi2GK5cvA6awGpH0HvH/gEG9PZ0a/WoxdiV3PmqK+3CjQMf8c+J/Vhv4mdZ2nRyXFw66sAg6qz7VNkaHfDQ==} engines: {node: '>=v14.16.0'} @@ -2311,14 +2066,6 @@ packages: webidl-conversions: 3.0.1 dev: true - /which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} - hasBin: true - dependencies: - isexe: 2.0.0 - dev: true - /why-is-node-running@2.2.2: resolution: {integrity: sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==} engines: {node: '>=8'} @@ -2369,11 +2116,6 @@ packages: engines: {node: '>=6'} dev: true - /yocto-queue@0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} - engines: {node: '>=10'} - dev: true - /yocto-queue@1.0.0: resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} engines: {node: '>=12.20'} From 72c1fc2b58720bb418da2ed42d07afb418fa388f Mon Sep 17 00:00:00 2001 From: Florian LEROUX Date: Sun, 9 Jul 2023 12:34:56 +0200 Subject: [PATCH 307/883] fix(ci): remove lib in order service --- services/order/package.json | 4 +- services/order/pnpm-lock.yaml | 201 ---------------------------------- 2 files changed, 1 insertion(+), 204 deletions(-) diff --git a/services/order/package.json b/services/order/package.json index 5760c17e..cfd63d95 100644 --- a/services/order/package.json +++ b/services/order/package.json @@ -25,7 +25,6 @@ "devDependencies": { "@types/amqplib": "^0.10.1", "@types/node": "18.15.9", - "@vitest/coverage-c8": "^0.29.8", "esbuild": "^0.17.18", "grpc-tools": "^1.12.4", "nodemon": "^2.0.22", @@ -35,8 +34,7 @@ "tsconfig-paths": "^4.2.0", "typescript": "5.0.2", "vite-tsconfig-paths": "^4.2.0", - "vitest": "^0.29.8", - "vitest-mock-extended": "^1.1.3" + "vitest": "^0.29.8" }, "prisma": { "seed": "ts-node prisma/seed.ts" diff --git a/services/order/pnpm-lock.yaml b/services/order/pnpm-lock.yaml index 4e86a700..e6715440 100644 --- a/services/order/pnpm-lock.yaml +++ b/services/order/pnpm-lock.yaml @@ -34,9 +34,6 @@ devDependencies: '@types/node': specifier: 18.15.9 version: 18.15.9 - '@vitest/coverage-c8': - specifier: ^0.29.8 - version: 0.29.8(vitest@0.29.8) esbuild: specifier: ^0.17.18 version: 0.17.18 @@ -67,9 +64,6 @@ devDependencies: vitest: specifier: ^0.29.8 version: 0.29.8 - vitest-mock-extended: - specifier: ^1.1.3 - version: 1.1.3(typescript@5.0.2)(vitest@0.29.8) packages: @@ -120,10 +114,6 @@ packages: 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'} @@ -349,11 +339,6 @@ packages: yargs: 16.2.0 dev: false - /@istanbuljs/schema@0.1.3: - resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} - engines: {node: '>=8'} - dev: true - /@jridgewell/gen-mapping@0.3.3: resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==} engines: {node: '>=6.0.0'} @@ -536,10 +521,6 @@ packages: resolution: {integrity: sha512-mEo1sAde+UCE6b2hxn332f1g1E8WfYRu6p5SvTKr2ZKC1f7gFJXk4h5PyGP9Dt6gCaG8y8XhwnXWC6Iy2cmBng==} dev: true - /@types/istanbul-lib-coverage@2.0.4: - resolution: {integrity: sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==} - dev: true - /@types/long@4.0.2: resolution: {integrity: sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==} dev: false @@ -547,17 +528,6 @@ packages: /@types/node@18.15.9: resolution: {integrity: sha512-dUxhiNzBLr6IqlZXz6e/rN2YQXlFgOei/Dxy+e3cyXTJ4txSUbGT2/fmnD6zd/75jDMeW5bDee+YXxlFKHoV0A==} - /@vitest/coverage-c8@0.29.8(vitest@0.29.8): - resolution: {integrity: sha512-y+sEMQMctWokjnSqm3FCQEYFkjLrYaznsxEZHxcx8z2aftpYg3A5tvI1S5himfdEFo7o+OeHzh40bPSWZHW4oQ==} - peerDependencies: - vitest: '>=0.29.0 <1' - dependencies: - c8: 7.13.0 - picocolors: 1.0.0 - std-env: 3.3.3 - vitest: 0.29.8 - dev: true - /@vitest/expect@0.29.8: resolution: {integrity: sha512-xlcVXn5I5oTq6NiZSY3ykyWixBxr5mG8HYtjvpgg6KaqHm0mvhX18xuwl5YGxIRNt/A5jidd7CWcNHrSvgaQqQ==} dependencies: @@ -734,25 +704,6 @@ packages: ieee754: 1.2.1 dev: true - /c8@7.13.0: - resolution: {integrity: sha512-/NL4hQTv1gBL6J6ei80zu3IiTrmePDKXKXOTLpHvcIWZTVYQlDhVWjjWvkhICylE8EwwnMVzDZugCvdx0/DIIA==} - engines: {node: '>=10.12.0'} - hasBin: true - dependencies: - '@bcoe/v8-coverage': 0.2.3 - '@istanbuljs/schema': 0.1.3 - find-up: 5.0.0 - foreground-child: 2.0.0 - istanbul-lib-coverage: 3.2.0 - istanbul-lib-report: 3.0.0 - istanbul-reports: 3.1.5 - rimraf: 3.0.2 - test-exclude: 6.0.0 - v8-to-istanbul: 9.1.0 - yargs: 16.2.0 - yargs-parser: 20.2.9 - dev: true - /cac@6.7.14: resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} engines: {node: '>=8'} @@ -844,10 +795,6 @@ packages: resolution: {integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==} dev: true - /convert-source-map@1.9.0: - resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} - dev: true - /core-util-is@1.0.3: resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} @@ -855,15 +802,6 @@ packages: resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} dev: true - /cross-spawn@7.0.3: - resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} - engines: {node: '>= 8'} - dependencies: - path-key: 3.1.1 - shebang-command: 2.0.0 - which: 2.0.2 - dev: true - /debug@3.2.7(supports-color@5.5.0): resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} peerDependencies: @@ -1017,22 +955,6 @@ packages: to-regex-range: 5.0.1 dev: true - /find-up@5.0.0: - resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} - engines: {node: '>=10'} - dependencies: - locate-path: 6.0.0 - path-exists: 4.0.0 - dev: true - - /foreground-child@2.0.0: - resolution: {integrity: sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==} - engines: {node: '>=8.0.0'} - dependencies: - cross-spawn: 7.0.3 - signal-exit: 3.0.7 - dev: true - /from2@2.3.0: resolution: {integrity: sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==} dependencies: @@ -1184,10 +1106,6 @@ packages: function-bind: 1.1.1 dev: true - /html-escaper@2.0.2: - resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} - dev: true - /https-proxy-agent@5.0.1: resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} engines: {node: '>= 6'} @@ -1286,32 +1204,6 @@ packages: resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} dev: true - /isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - dev: true - - /istanbul-lib-coverage@3.2.0: - resolution: {integrity: sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==} - engines: {node: '>=8'} - dev: true - - /istanbul-lib-report@3.0.0: - resolution: {integrity: sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==} - engines: {node: '>=8'} - dependencies: - istanbul-lib-coverage: 3.2.0 - make-dir: 3.1.0 - supports-color: 7.2.0 - dev: true - - /istanbul-reports@3.1.5: - resolution: {integrity: sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==} - engines: {node: '>=8'} - dependencies: - html-escaper: 2.0.2 - istanbul-lib-report: 3.0.0 - dev: true - /jsesc@2.5.2: resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} engines: {node: '>=4'} @@ -1341,13 +1233,6 @@ packages: engines: {node: '>=14'} dev: true - /locate-path@6.0.0: - resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} - engines: {node: '>=10'} - dependencies: - p-locate: 5.0.0 - dev: true - /lodash.camelcase@4.3.0: resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} dev: false @@ -1556,13 +1441,6 @@ packages: engines: {node: '>=8'} dev: true - /p-limit@3.1.0: - resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} - engines: {node: '>=10'} - dependencies: - yocto-queue: 0.1.0 - dev: true - /p-limit@4.0.0: resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -1570,28 +1448,11 @@ packages: yocto-queue: 1.0.0 dev: true - /p-locate@5.0.0: - resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} - engines: {node: '>=10'} - dependencies: - p-limit: 3.1.0 - dev: true - - /path-exists@4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} - dev: true - /path-is-absolute@1.0.1: resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} engines: {node: '>=0.10.0'} dev: true - /path-key@3.1.1: - resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} - engines: {node: '>=8'} - dev: true - /path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} dev: true @@ -1891,18 +1752,6 @@ packages: resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} dev: true - /shebang-command@2.0.0: - resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} - engines: {node: '>=8'} - dependencies: - shebang-regex: 3.0.0 - dev: true - - /shebang-regex@3.0.0: - resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} - engines: {node: '>=8'} - dev: true - /siginfo@2.0.0: resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} dev: true @@ -2080,15 +1929,6 @@ packages: yallist: 4.0.0 dev: true - /test-exclude@6.0.0: - resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} - engines: {node: '>=8'} - dependencies: - '@istanbuljs/schema': 0.1.3 - glob: 7.2.3 - minimatch: 3.1.2 - dev: true - /tinybench@2.5.0: resolution: {integrity: sha512-kRwSG8Zx4tjF9ZiyH4bhaebu+EDz1BOx9hOigYHlUW4xxI/wKIUQUqo018UlU4ar6ATPBsaMrdbKZ+tmPdohFA==} dev: true @@ -2126,14 +1966,6 @@ packages: resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} dev: true - /ts-essentials@9.3.2(typescript@5.0.2): - resolution: {integrity: sha512-JxKJzuWqH1MmH4ZFHtJzGEhkfN3QvVR3C3w+4BIoWeoY68UVVoA2Np/Bca9z0IPSErVCWhv439aT0We4Dks8kQ==} - peerDependencies: - typescript: '>=4.1.0' - dependencies: - typescript: 5.0.2 - dev: true - /ts-node@10.9.1(@types/node@18.15.9)(typescript@5.0.2): resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} hasBin: true @@ -2232,15 +2064,6 @@ packages: resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} dev: true - /v8-to-istanbul@9.1.0: - resolution: {integrity: sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA==} - engines: {node: '>=10.12.0'} - dependencies: - '@jridgewell/trace-mapping': 0.3.18 - '@types/istanbul-lib-coverage': 2.0.4 - convert-source-map: 1.9.0 - dev: true - /vite-node@0.29.8(@types/node@18.15.9): resolution: {integrity: sha512-b6OtCXfk65L6SElVM20q5G546yu10/kNrhg08afEoWlFRJXFq9/6glsvSVY+aI6YeC1tu2TtAqI2jHEQmOmsFw==} engines: {node: '>=v14.16.0'} @@ -2311,17 +2134,6 @@ packages: fsevents: 2.3.2 dev: true - /vitest-mock-extended@1.1.3(typescript@5.0.2)(vitest@0.29.8): - resolution: {integrity: sha512-MiaKYZbTg+fjozKnCpoTTva0BnlSNYyk4jiPuM2xVhg4aou112QIrALdH3/ZKK6qfXWh0A17gFIjWJjylOlXxg==} - peerDependencies: - typescript: 3.x || 4.x || 5.x - vitest: '>=0.29.2' - dependencies: - ts-essentials: 9.3.2(typescript@5.0.2) - typescript: 5.0.2 - vitest: 0.29.8 - dev: true - /vitest@0.29.8: resolution: {integrity: sha512-JIAVi2GK5cvA6awGpH0HvH/gEG9PZ0a/WoxdiV3PmqK+3CjQMf8c+J/Vhv4mdZ2nRyXFw66sAg6qz7VNkaHfDQ==} engines: {node: '>=v14.16.0'} @@ -2397,14 +2209,6 @@ packages: webidl-conversions: 3.0.1 dev: true - /which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} - hasBin: true - dependencies: - isexe: 2.0.0 - dev: true - /why-is-node-running@2.2.2: resolution: {integrity: sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==} engines: {node: '>=8'} @@ -2461,11 +2265,6 @@ packages: engines: {node: '>=6'} dev: true - /yocto-queue@0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} - engines: {node: '>=10'} - dev: true - /yocto-queue@1.0.0: resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} engines: {node: '>=12.20'} From db24ca01eb7456c92ae242ab14537bae40a76f74 Mon Sep 17 00:00:00 2001 From: anatole Date: Sun, 9 Jul 2023 19:36:23 +0200 Subject: [PATCH 308/883] feat(user service): add dockerFile and remove src directory --- .../user/{src/pkg/config/env => }/.env.dist | 0 services/user/.gitignore | 4 +- services/user/Dockerfile | 25 ++++ services/user/{src => }/Makefile | 0 services/user/{src => }/config.yml | 0 services/user/go.mod | 48 ++++++++ services/user/{src => }/go.sum | 110 +++--------------- services/user/{src => }/main.go | 0 services/user/{src => }/pkg/config/config.go | 2 +- services/user/{src => }/pkg/db/db.go | 0 .../user/{src => }/pkg/db/init/initialize.go | 0 .../user/{src => }/pkg/mapper/userMapper.go | 0 .../user/{src => }/pkg/models/main_address.go | 0 services/user/{src => }/pkg/models/role.go | 0 services/user/{src => }/pkg/models/user.go | 0 services/user/{src => }/pkg/services/auth.go | 0 .../{src => }/pkg/services/mainAddress.go | 0 services/user/{src => }/pkg/services/user.go | 0 services/user/{src => }/pkg/utils/hash.go | 0 services/user/{src => }/pkg/utils/jwt.go | 0 services/user/{src => }/pkg/utils/log.go | 0 services/user/src/go.mod | 74 ------------ services/user/src/proto | 1 - 23 files changed, 91 insertions(+), 173 deletions(-) rename services/user/{src/pkg/config/env => }/.env.dist (100%) create mode 100644 services/user/Dockerfile rename services/user/{src => }/Makefile (100%) rename services/user/{src => }/config.yml (100%) create mode 100644 services/user/go.mod rename services/user/{src => }/go.sum (71%) rename services/user/{src => }/main.go (100%) rename services/user/{src => }/pkg/config/config.go (94%) rename services/user/{src => }/pkg/db/db.go (100%) rename services/user/{src => }/pkg/db/init/initialize.go (100%) rename services/user/{src => }/pkg/mapper/userMapper.go (100%) rename services/user/{src => }/pkg/models/main_address.go (100%) rename services/user/{src => }/pkg/models/role.go (100%) rename services/user/{src => }/pkg/models/user.go (100%) rename services/user/{src => }/pkg/services/auth.go (100%) rename services/user/{src => }/pkg/services/mainAddress.go (100%) rename services/user/{src => }/pkg/services/user.go (100%) rename services/user/{src => }/pkg/utils/hash.go (100%) rename services/user/{src => }/pkg/utils/jwt.go (100%) rename services/user/{src => }/pkg/utils/log.go (100%) delete mode 100644 services/user/src/go.mod delete mode 120000 services/user/src/proto diff --git a/services/user/src/pkg/config/env/.env.dist b/services/user/.env.dist similarity index 100% rename from services/user/src/pkg/config/env/.env.dist rename to services/user/.env.dist diff --git a/services/user/.gitignore b/services/user/.gitignore index ce27869a..a640ce06 100644 --- a/services/user/.gitignore +++ b/services/user/.gitignore @@ -1,3 +1,3 @@ -src/logs/* +logs/* -src/pkg/config/env/*.env \ No newline at end of file +*.env \ No newline at end of file diff --git a/services/user/Dockerfile b/services/user/Dockerfile new file mode 100644 index 00000000..ec54b07d --- /dev/null +++ b/services/user/Dockerfile @@ -0,0 +1,25 @@ +FROM golang:1.20-alpine as builder + +# Set destination for COPY +WORKDIR /app + +# Download Go modules +COPY ./user/go.mod ./user/go.sum ./ +RUN go mod download + +COPY ./user/main.go ./ +COPY ./user/pkg ./pkg +COPY ./proto ./proto + +RUN go build -o goodfood-user + +FROM scratch as runner + +# Copy binary from builder +COPY --from=builder /app/goodfood-user /usr/local/bin/goodfood-user +COPY ./user/config.yml ./user/dev.env ./ +# Expose port +EXPOSE 50001 + +# Run +CMD ["goodfood-user"] \ No newline at end of file diff --git a/services/user/src/Makefile b/services/user/Makefile similarity index 100% rename from services/user/src/Makefile rename to services/user/Makefile diff --git a/services/user/src/config.yml b/services/user/config.yml similarity index 100% rename from services/user/src/config.yml rename to services/user/config.yml diff --git a/services/user/go.mod b/services/user/go.mod new file mode 100644 index 00000000..8b5f6090 --- /dev/null +++ b/services/user/go.mod @@ -0,0 +1,48 @@ +module goodfood-user + +go 1.19 + +require ( + github.com/golang-jwt/jwt v3.2.2+incompatible + github.com/golang/protobuf v1.5.2 + github.com/hhkbp2/go-logging v0.3.7 + github.com/spf13/viper v1.10.1 + golang.org/x/crypto v0.0.0-20220321153916-2c7772ba3064 + google.golang.org/grpc v1.53.0 + google.golang.org/protobuf v1.28.1 + gorm.io/driver/postgres v1.3.1 + gorm.io/gorm v1.23.3 +) + +require ( + github.com/fsnotify/fsnotify v1.5.1 // indirect + github.com/hashicorp/hcl v1.0.0 // indirect + github.com/hhkbp2/go-strftime v0.0.0-20150709091403-d82166ec6782 // indirect + github.com/jackc/chunkreader/v2 v2.0.1 // indirect + github.com/jackc/pgconn v1.10.1 // indirect + github.com/jackc/pgio v1.0.0 // indirect + github.com/jackc/pgpassfile v1.0.0 // indirect + github.com/jackc/pgproto3/v2 v2.2.0 // indirect + github.com/jackc/pgservicefile v0.0.0-20200714003250-2b9c44734f2b // indirect + github.com/jackc/pgtype v1.9.1 // indirect + github.com/jackc/pgx/v4 v4.14.1 // indirect + github.com/jinzhu/inflection v1.0.0 // indirect + github.com/jinzhu/now v1.1.4 // indirect + github.com/kr/text v0.2.0 // indirect + github.com/magiconair/properties v1.8.5 // indirect + github.com/mitchellh/mapstructure v1.4.3 // indirect + github.com/pelletier/go-toml v1.9.4 // indirect + github.com/pkg/errors v0.9.1 // indirect + github.com/spf13/afero v1.6.0 // indirect + github.com/spf13/cast v1.4.1 // indirect + github.com/spf13/jwalterweatherman v1.1.0 // indirect + github.com/spf13/pflag v1.0.5 // indirect + github.com/subosito/gotenv v1.2.0 // indirect + golang.org/x/net v0.8.0 // indirect + golang.org/x/sys v0.6.0 // indirect + golang.org/x/text v0.8.0 // indirect + google.golang.org/genproto v0.0.0-20230306155012-7f2fa6fef1f4 // indirect + gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect + gopkg.in/ini.v1 v1.66.2 // indirect + gopkg.in/yaml.v2 v2.4.0 // indirect +) diff --git a/services/user/src/go.sum b/services/user/go.sum similarity index 71% rename from services/user/src/go.sum rename to services/user/go.sum index 368d6615..05f9755e 100644 --- a/services/user/src/go.sum +++ b/services/user/go.sum @@ -1,68 +1,38 @@ github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/Masterminds/semver/v3 v3.1.1 h1:hLg3sBzpNErnxhQtUy/mmLR2I9foDujNK030IGemrRc= github.com/Masterminds/semver/v3 v3.1.1/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= -github.com/Microsoft/go-winio v0.4.14/go.mod h1:qXqCSQ3Xa7+6tgxaGTIe4Kpcdsi+P8jBhyzoq1bpyYA= -github.com/Microsoft/go-winio v0.4.16/go.mod h1:XB6nPKklQyQ7GC9LdcBEcBl8PF76WugXOPRXwdLnMv0= -github.com/Microsoft/go-winio v0.6.0 h1:slsWYD/zyx7lCXoZVlvQrj0hPTM1HI4+v1sIda2yDvg= -github.com/Microsoft/go-winio v0.6.0/go.mod h1:cTAf44im0RAYeL23bpB+fzCyDH2MJiz2BO69KH/soAE= -github.com/ProtonMail/go-crypto v0.0.0-20210428141323-04723f9f07d7 h1:YoJbenK9C67SkzkDfmQuVln04ygHj3vjZfd9FL+GmQQ= -github.com/ProtonMail/go-crypto v0.0.0-20210428141323-04723f9f07d7/go.mod h1:z4/9nQmJSSwwds7ejkxaJwO37dru3geImFUdJlaLzQo= -github.com/acomagu/bufpipe v1.0.3 h1:fxAGrHZTgQ9w5QqVItgzwj235/uYZYgbXitB+dLupOk= -github.com/acomagu/bufpipe v1.0.3/go.mod h1:mxdxdup/WdsKVreO5GpW4+M/1CE2sMG4jeGJ2sYmHc4= -github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c= -github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= -github.com/bitly/go-simplejson v0.5.0 h1:6IH+V8/tVMab511d5bn4M7EwGXZf9Hj6i2xSwkNEM+Y= -github.com/bitly/go-simplejson v0.5.0/go.mod h1:cXHtHw4XUPsvGaxgjIAn8PhEWG9NfngEKAMDJEczWVA= +github.com/cockroachdb/apd v1.1.0 h1:3LFP3629v+1aKXU5Q37mxmRxX/pIu1nijXydLShEq5I= github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ= github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd v0.0.0-20190719114852-fd7a80b32e1f/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= -github.com/cpuguy83/go-md2man/v2 v2.0.0 h1:EoUDS0afbrsXAZ9YQ9jdu/mZ2sXgT1/2yyNng4PGlyM= -github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/emirpasic/gods v1.12.0 h1:QAUIPSaCu4G+POclxeqb3F+WPpdKqFGlw36+yOzGlrg= -github.com/emirpasic/gods v1.12.0/go.mod h1:YfzfFFoVP/catgzJb4IKIqXjX78Ha8FMSDh3ymbK86o= -github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= -github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= -github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.5.1 h1:mZcQUHVQUQWoPXXtuf9yuEXKudkV2sx1E06UadKWpgI= github.com/fsnotify/fsnotify v1.5.1/go.mod h1:T3375wBYaZdLLcVNkcVbzGHY7f1l/uK5T5Ai1i3InKU= -github.com/gliderlabs/ssh v0.2.2/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0= -github.com/go-git/gcfg v1.5.0 h1:Q5ViNfGF8zFgyJWPqYwA7qGFoMTEiBmdlkcfRmpIMa4= -github.com/go-git/gcfg v1.5.0/go.mod h1:5m20vg6GwYabIxaOonVkTdrILxQMpEShl1xiMF4ua+E= -github.com/go-git/go-billy/v5 v5.2.0/go.mod h1:pmpqyWchKfYfrkb/UVH4otLvyi/5gJlGI4Hb3ZqZ3W0= -github.com/go-git/go-billy/v5 v5.3.1 h1:CPiOUAzKtMRvolEKw+bG1PLRpT7D3LIs3/3ey4Aiu34= -github.com/go-git/go-billy/v5 v5.3.1/go.mod h1:pmpqyWchKfYfrkb/UVH4otLvyi/5gJlGI4Hb3ZqZ3W0= -github.com/go-git/go-git-fixtures/v4 v4.2.1/go.mod h1:K8zd3kDUAykwTdDCr+I0per6Y6vMiRR/nnVTBtavnB0= -github.com/go-git/go-git/v5 v5.4.2 h1:BXyZu9t0VkbiHtqrsvdq39UDhGJTl1h55VW6CSC4aY4= -github.com/go-git/go-git/v5 v5.4.2/go.mod h1:gQ1kArt6d+n+BGd+/B/I74HwRTLhth2+zti4ihgckDc= github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/gofrs/uuid v4.0.0+incompatible h1:1SD/1F5pU8p29ybwgQSwpQk+mwdRrXCYuPhW6m+TnJw= github.com/gofrs/uuid v4.0.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= github.com/golang-jwt/jwt v3.2.2+incompatible h1:IfV12K8xAKAnZqdXVzCZ+TOjboZ2keLg81eXfW3O+oY= github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= -github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= -github.com/hellokvn/go-grpc-auth-svc v0.0.0-20220329201106-de9b08c8e812 h1:LU6I+7QVwjBBbWirc3+KEr0PWy675bZMyvG5zuW9C6I= -github.com/hellokvn/go-grpc-auth-svc v0.0.0-20220329201106-de9b08c8e812/go.mod h1:5SRSCOJcnlIsTZsiiRiYgwFHdjr9tR6vESwJcoSiqrg= github.com/hhkbp2/go-logging v0.3.7 h1:Dxy1of13MlvAVVVeDUizaA7I2++yZ/HLQpJ/eSf8ttQ= github.com/hhkbp2/go-logging v0.3.7/go.mod h1:lFqQYJ6YeTqe4yyw+h8dZWYvzzWAqjmlpvdFLEIcRHc= github.com/hhkbp2/go-strftime v0.0.0-20150709091403-d82166ec6782 h1:Evl9i7wBY3bjJ3NqHs0ldhnKOdQL4Kaum9ve1JAmiCE= github.com/hhkbp2/go-strftime v0.0.0-20150709091403-d82166ec6782/go.mod h1:x8/IOQ5qQ4DKfiTmD9wBhQ40edg5wh7gMRwdLg07mMw= +github.com/hhkbp2/testify v0.0.0-20150512090439-112845ebc045 h1:MmQwR3zANTXzs2yZexVBDY6qcH2vJXOl/2dZFkWVM7w= github.com/hhkbp2/testify v0.0.0-20150512090439-112845ebc045/go.mod h1:8DUHF4igllRoOCbQKJsylsDqROcRtPTdb+SQUfjCYLo= -github.com/imdario/mergo v0.3.12 h1:b6R2BslTbIEToALKP7LxUvijTsNI9TAe80pLWN2g/HU= -github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= github.com/jackc/chunkreader v1.0.0/go.mod h1:RT6O25fNZIuasFJRyZ4R/Y2BbhasbmZXF9QQ7T3kePo= github.com/jackc/chunkreader/v2 v2.0.0/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk= github.com/jackc/chunkreader/v2 v2.0.1 h1:i+RDz65UE+mmpjTfyz0MoVTnzeYxroil2G82ki7MGG8= @@ -79,6 +49,7 @@ github.com/jackc/pgio v1.0.0 h1:g12B9UwVnzGhueNavwioyEEpAmqMe1E/BN9ES+8ovkE= github.com/jackc/pgio v1.0.0/go.mod h1:oP+2QK2wFfUWgr+gxjoBH9KGBb31Eio69xUb0w5bYf8= github.com/jackc/pgmock v0.0.0-20190831213851-13a1b77aafa2/go.mod h1:fGZlG77KXmcq05nJLRkk0+p82V8B8Dw8KN2/V9c/OAE= github.com/jackc/pgmock v0.0.0-20201204152224-4fe30f7445fd/go.mod h1:hrBW0Enj2AZTNpt/7Y5rr2xe/9Mn757Wtb2xeBzPv2c= +github.com/jackc/pgmock v0.0.0-20210724152146-4ad1a8207f65 h1:DadwsjnMwFjfWc9y5Wi/+Zz7xoE5ALHsRQlOctkOiHc= github.com/jackc/pgmock v0.0.0-20210724152146-4ad1a8207f65/go.mod h1:5R2h2EEX+qri8jOWMbJCtaPWkrrNc7OHwsp2TCqp7ak= github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM= github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg= @@ -109,70 +80,52 @@ github.com/jackc/puddle v0.0.0-20190413234325-e4ced69a3a2b/go.mod h1:m4B5Dj62Y0f github.com/jackc/puddle v0.0.0-20190608224051-11cab39313c9/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= github.com/jackc/puddle v1.1.3/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= github.com/jackc/puddle v1.2.0/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= -github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOlocH6Fxy8MmwDt+yVQYULKfN0RoTN8A= -github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo= -github.com/jessevdk/go-flags v1.5.0/go.mod h1:Fw0T6WPc1dYxT4mKEZRfG5kJhaTDP9pj1c2EWnYs/m4= github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E= github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= github.com/jinzhu/now v1.1.4 h1:tHnRBy1i5F2Dh8BAFxqFzxKqqvezXrL2OW1TnX+Mlas= github.com/jinzhu/now v1.1.4/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= -github.com/kevinburke/ssh_config v0.0.0-20201106050909-4977a11b4351 h1:DowS9hvgyYSX4TO5NpyC606/Z4SxnNYbT+WX27or6Ck= -github.com/kevinburke/ssh_config v0.0.0-20201106050909-4977a11b4351/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.1.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +github.com/lib/pq v1.10.2 h1:AqzbZs4ZoCBp+GtejcpCpcxM3zlSMx29dXbUSeVtJb8= github.com/lib/pq v1.10.2/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/magiconair/properties v1.8.5 h1:b6kJs+EmPFMYGkow9GiUyCyOvIwYetYJ3fSaWak/Gls= github.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= -github.com/matryer/is v1.2.0/go.mod h1:2fLPjFQM9rhQ15aVEtbuwhJinnOqrmgXPNdZsdwlWXA= github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -github.com/miekg/dns v1.1.43 h1:JKfpVSCB84vrAmHzyrsxB5NAr5kLoMXZArPSw7Qlgyg= -github.com/miekg/dns v1.1.43/go.mod h1:+evo5L0630/F6ca/Z9+GAqzhjGyn8/c+TBaOyfEl0V4= -github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= -github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/mapstructure v1.4.3 h1:OVowDSCllw/YjdLkam3/sm7wEtOy59d8ndGgCcyj8cs= github.com/mitchellh/mapstructure v1.4.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= -github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= -github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= -github.com/oxtoacart/bpool v0.0.0-20190530202638-03653db5a59c h1:rp5dCmg/yLR3mgFuSOe4oEnDDmGLROTvMragMUXpTQw= -github.com/oxtoacart/bpool v0.0.0-20190530202638-03653db5a59c/go.mod h1:X07ZCGwUbLaax7L0S3Tw4hpejzu63ZrrQiUe6W0hcy0= -github.com/patrickmn/go-cache v2.1.0+incompatible h1:HRMgzkcYKYpi3C8ajMPV8OFXaaRUnok+kx1WdO15EQc= -github.com/patrickmn/go-cache v2.1.0+incompatible/go.mod h1:3Qf8kWWT7OJRJbdiICTKqZju1ZixQ/KpMGzzAfe6+WQ= github.com/pelletier/go-toml v1.9.4 h1:tjENF6MfZAg8e4ZmZTeWaWiT2vXtsoO6+iuOjFhECwM= github.com/pelletier/go-toml v1.9.4/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= github.com/rs/zerolog v1.13.0/go.mod h1:YbFCdg8HfsridGWAh22vktObvhZbQsZXe4/zB0OKkWU= github.com/rs/zerolog v1.15.0/go.mod h1:xYTKnLHcpfU2225ny5qZjxnj9NvkumZYjJHlAThCjNc= -github.com/russross/blackfriday/v2 v2.0.1 h1:lPqVAte+HuHNfhJ/0LC98ESWRz8afy9tM/0RK8m9o+Q= -github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= -github.com/sergi/go-diff v1.1.0 h1:we8PVUC3FE2uYfodKH/nBHMSetSfHDR6scGdBi+erh0= -github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24/go.mod h1:M+9NzErvs504Cn4c5DxATwIqPbtswREoFCre64PpcG4= +github.com/shopspring/decimal v1.2.0 h1:abSATXmQEYyShuxI4/vyW3tV1MrKAJzCZ/0zLUXYbsQ= github.com/shopspring/decimal v1.2.0/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= -github.com/shurcooL/sanitized_anchor_name v1.0.0 h1:PdmoCO6wvbs+7yrJyMORt4/BmY5IYyJwS/kOiWx8mHo= -github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/spf13/afero v1.6.0 h1:xoax2sJ2DT8S8xA2paPFjDCScCNeWsg75VG0DLRreiY= @@ -192,16 +145,11 @@ github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXf github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s= github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= -github.com/urfave/cli/v2 v2.3.0 h1:qph92Y649prgesehzOrQjdWyxFOp/QVM+6imKHad91M= -github.com/urfave/cli/v2 v2.3.0/go.mod h1:LJmUH05zAU44vOAcrfzZQKsZbVcdbOG8rtL3/XcUArI= -github.com/xanzy/ssh-agent v0.3.0 h1:wUMzuKtKilRgBAD1sUb8gOwwRr2FGoBVumcjoOACClI= -github.com/xanzy/ssh-agent v0.3.0/go.mod h1:3s9xbODqPuuhK9JV1R321M/FlMZSBvE5aY6eAcqrDh0= github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q= -go-micro.dev/v4 v4.10.0 h1:YWiOyGHNFEcD90umbuJLiwOtAVHKO2zVxZPIUv/wcKM= -go-micro.dev/v4 v4.10.0/go.mod h1:KhUBhqhahZ8Ur5qNWFYXvU4cpG5/GHozNcCdihuyZmI= go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= @@ -213,7 +161,6 @@ go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9E go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= -golang.org/x/crypto v0.0.0-20190219172222-a4c6cb3142f2/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190411191339-88737f569e3a/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= @@ -221,51 +168,33 @@ golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201203163018-be400aefbc4c/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= -golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= -golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20220315160706-3147a52a75dd h1:XcWmESyNjXJMLahc3mqVQJcgSTDxFxhETVlfk9uGc38= -golang.org/x/crypto v0.0.0-20220315160706-3147a52a75dd/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220321153916-2c7772ba3064 h1:S25/rfnfsMVgORT4/J61MJ7rdyseOZOyvLIrZEZ7s6s= golang.org/x/crypto v0.0.0-20220321153916-2c7772ba3064/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.9.0 h1:KENHtAZL2y3NLMYZeHY9DW8HW8V+kQyJsY/V9JlKvCs= -golang.org/x/mod v0.9.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210326060303-6b1517762897/go.mod h1:uSPa2vr4CLtc/ILN5odXGNXS6mhrKVzTaCXzk9m6W3k= golang.org/x/net v0.8.0 h1:Zrh2ngAOFYneWTAIAPethzeaQLuHwhuBkuV6ZiRnUaQ= golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o= -golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210324051608-47abb6519492/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210502180810-71e4cd670f79/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0 h1:MVltZSvRTcU2ljQOhs94SXPftV6DCNnZViHeQps87pQ= @@ -288,8 +217,6 @@ golang.org/x/tools v0.0.0-20190823170909-c4a336ef6a2f/go.mod h1:b+2E5dAYhXwXZwtn golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200103221440-774c71fcf114/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.7.0 h1:W4OVu8VVOaIO0yzWMNdepAulS7YfoS3Zabrm8DOXXU4= -golang.org/x/tools v0.7.0/go.mod h1:4pg6aUX35JBAogB10C9AtvVL+qowtN4pT3CGSQex14s= golang.org/x/xerrors v0.0.0-20190410155217-1f06c39b4373/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20190513163551-3ee3066db522/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -306,24 +233,17 @@ google.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175 google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/inconshreveable/log15.v2 v2.0.0-20180818164646-67afb5ed74ec/go.mod h1:aPpfJ7XW+gOuirDoZ8gHhLh3kZ1B08FtV2bbmy7Jv3s= gopkg.in/ini.v1 v1.66.2 h1:XfR1dOYubytKy4Shzc2LHrrGhU0lDCfDGG1yLPmpgsI= gopkg.in/ini.v1 v1.66.2/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= -gopkg.in/warnings.v0 v0.1.2 h1:wFXVbFY8DY5/xOe1ECiWdKCzZlxgshcYVNkBHstARME= -gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo= gorm.io/driver/postgres v1.3.1 h1:Pyv+gg1Gq1IgsLYytj/S2k7ebII3CzEdpqQkPOdH24g= gorm.io/driver/postgres v1.3.1/go.mod h1:WwvWOuR9unCLpGWCL6Y3JOeBWvbKi6JLhayiVclSZZU= gorm.io/gorm v1.23.1/go.mod h1:l2lP/RyAtc1ynaTjFksBde/O8v9oOGIApu2/xRitmZk= diff --git a/services/user/src/main.go b/services/user/main.go similarity index 100% rename from services/user/src/main.go rename to services/user/main.go diff --git a/services/user/src/pkg/config/config.go b/services/user/pkg/config/config.go similarity index 94% rename from services/user/src/pkg/config/config.go rename to services/user/pkg/config/config.go index 76a72dd1..152a8420 100644 --- a/services/user/src/pkg/config/config.go +++ b/services/user/pkg/config/config.go @@ -12,7 +12,7 @@ type Config struct { } func LoadConfig() (config Config, err error) { - viper.AddConfigPath("./pkg/config/env") + viper.AddConfigPath(".") viper.SetConfigName("dev") viper.SetConfigType("env") diff --git a/services/user/src/pkg/db/db.go b/services/user/pkg/db/db.go similarity index 100% rename from services/user/src/pkg/db/db.go rename to services/user/pkg/db/db.go diff --git a/services/user/src/pkg/db/init/initialize.go b/services/user/pkg/db/init/initialize.go similarity index 100% rename from services/user/src/pkg/db/init/initialize.go rename to services/user/pkg/db/init/initialize.go diff --git a/services/user/src/pkg/mapper/userMapper.go b/services/user/pkg/mapper/userMapper.go similarity index 100% rename from services/user/src/pkg/mapper/userMapper.go rename to services/user/pkg/mapper/userMapper.go diff --git a/services/user/src/pkg/models/main_address.go b/services/user/pkg/models/main_address.go similarity index 100% rename from services/user/src/pkg/models/main_address.go rename to services/user/pkg/models/main_address.go diff --git a/services/user/src/pkg/models/role.go b/services/user/pkg/models/role.go similarity index 100% rename from services/user/src/pkg/models/role.go rename to services/user/pkg/models/role.go diff --git a/services/user/src/pkg/models/user.go b/services/user/pkg/models/user.go similarity index 100% rename from services/user/src/pkg/models/user.go rename to services/user/pkg/models/user.go diff --git a/services/user/src/pkg/services/auth.go b/services/user/pkg/services/auth.go similarity index 100% rename from services/user/src/pkg/services/auth.go rename to services/user/pkg/services/auth.go diff --git a/services/user/src/pkg/services/mainAddress.go b/services/user/pkg/services/mainAddress.go similarity index 100% rename from services/user/src/pkg/services/mainAddress.go rename to services/user/pkg/services/mainAddress.go diff --git a/services/user/src/pkg/services/user.go b/services/user/pkg/services/user.go similarity index 100% rename from services/user/src/pkg/services/user.go rename to services/user/pkg/services/user.go diff --git a/services/user/src/pkg/utils/hash.go b/services/user/pkg/utils/hash.go similarity index 100% rename from services/user/src/pkg/utils/hash.go rename to services/user/pkg/utils/hash.go diff --git a/services/user/src/pkg/utils/jwt.go b/services/user/pkg/utils/jwt.go similarity index 100% rename from services/user/src/pkg/utils/jwt.go rename to services/user/pkg/utils/jwt.go diff --git a/services/user/src/pkg/utils/log.go b/services/user/pkg/utils/log.go similarity index 100% rename from services/user/src/pkg/utils/log.go rename to services/user/pkg/utils/log.go diff --git a/services/user/src/go.mod b/services/user/src/go.mod deleted file mode 100644 index 2120d42f..00000000 --- a/services/user/src/go.mod +++ /dev/null @@ -1,74 +0,0 @@ -module goodfood-user - -go 1.19 - -require ( - google.golang.org/grpc v1.53.0 -) - -require ( - github.com/Microsoft/go-winio v0.6.0 // indirect - github.com/ProtonMail/go-crypto v0.0.0-20210428141323-04723f9f07d7 // indirect - github.com/acomagu/bufpipe v1.0.3 // indirect - github.com/bitly/go-simplejson v0.5.0 // indirect - github.com/cpuguy83/go-md2man/v2 v2.0.0 // indirect - github.com/emirpasic/gods v1.12.0 // indirect - github.com/fsnotify/fsnotify v1.5.1 // indirect - github.com/go-git/gcfg v1.5.0 // indirect - github.com/go-git/go-billy/v5 v5.3.1 // indirect - github.com/go-git/go-git/v5 v5.4.2 // indirect - github.com/golang-jwt/jwt v3.2.2+incompatible // indirect - github.com/golang/protobuf v1.5.2 // indirect - github.com/google/uuid v1.3.0 // indirect - github.com/hashicorp/hcl v1.0.0 // indirect - github.com/hhkbp2/go-logging v0.3.7 // indirect - github.com/hhkbp2/go-strftime v0.0.0-20150709091403-d82166ec6782 // indirect - github.com/imdario/mergo v0.3.12 // indirect - github.com/jackc/chunkreader/v2 v2.0.1 // indirect - github.com/jackc/pgconn v1.10.1 // indirect - github.com/jackc/pgio v1.0.0 // indirect - github.com/jackc/pgpassfile v1.0.0 // indirect - github.com/jackc/pgproto3/v2 v2.2.0 // indirect - github.com/jackc/pgservicefile v0.0.0-20200714003250-2b9c44734f2b // indirect - github.com/jackc/pgtype v1.9.1 // indirect - github.com/jackc/pgx/v4 v4.14.1 // indirect - github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 // indirect - github.com/jinzhu/inflection v1.0.0 // indirect - github.com/jinzhu/now v1.1.4 // indirect - github.com/kevinburke/ssh_config v0.0.0-20201106050909-4977a11b4351 // indirect - github.com/magiconair/properties v1.8.5 // indirect - github.com/miekg/dns v1.1.43 // indirect - github.com/mitchellh/go-homedir v1.1.0 // indirect - github.com/mitchellh/mapstructure v1.4.3 // indirect - github.com/nxadm/tail v1.4.8 // indirect - github.com/oxtoacart/bpool v0.0.0-20190530202638-03653db5a59c // indirect - github.com/patrickmn/go-cache v2.1.0+incompatible // indirect - github.com/pelletier/go-toml v1.9.4 // indirect - github.com/pkg/errors v0.9.1 // indirect - github.com/russross/blackfriday/v2 v2.0.1 // indirect - github.com/sergi/go-diff v1.1.0 // indirect - github.com/shurcooL/sanitized_anchor_name v1.0.0 // indirect - github.com/spf13/afero v1.6.0 // indirect - github.com/spf13/cast v1.4.1 // indirect - github.com/spf13/jwalterweatherman v1.1.0 // indirect - github.com/spf13/pflag v1.0.5 // indirect - github.com/spf13/viper v1.10.1 // indirect - github.com/subosito/gotenv v1.2.0 // indirect - github.com/urfave/cli/v2 v2.3.0 // indirect - github.com/xanzy/ssh-agent v0.3.0 // indirect - golang.org/x/crypto v0.0.0-20220321153916-2c7772ba3064 // indirect - golang.org/x/mod v0.9.0 // indirect - golang.org/x/net v0.8.0 // indirect - golang.org/x/sync v0.1.0 // indirect - golang.org/x/sys v0.6.0 // indirect - golang.org/x/text v0.8.0 // indirect - golang.org/x/tools v0.7.0 // indirect - google.golang.org/genproto v0.0.0-20230306155012-7f2fa6fef1f4 // indirect - google.golang.org/protobuf v1.28.1 // indirect - gopkg.in/ini.v1 v1.66.2 // indirect - gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 // indirect - gopkg.in/warnings.v0 v0.1.2 // indirect - gopkg.in/yaml.v2 v2.4.0 // indirect - gorm.io/driver/postgres v1.3.1 // indirect - gorm.io/gorm v1.23.3 // indirect -) diff --git a/services/user/src/proto b/services/user/src/proto deleted file mode 120000 index 15de3591..00000000 --- a/services/user/src/proto +++ /dev/null @@ -1 +0,0 @@ -../../proto/ \ No newline at end of file From 54a36f47bc352c19191c20637616643b655af93f Mon Sep 17 00:00:00 2001 From: anatole Date: Sat, 15 Jul 2023 01:12:01 +0200 Subject: [PATCH 309/883] feat(gateway): create the base of the gateway --- services/gateway/.env.example | 1 + services/gateway/.gitignore | 5 + services/gateway/.gitinclude | 0 services/gateway/.nvmrc | 1 + services/gateway/Dockerfile | 38 + services/gateway/README.md | 49 + services/gateway/package-lock.json | 8513 ++++++++++++++++++++++++++++ services/gateway/package.json | 54 + services/gateway/proto | 1 + services/gateway/src/index.ts | 17 + services/gateway/tsconfig.json | 18 + services/gateway/vitest.config.ts | 10 + 12 files changed, 8707 insertions(+) create mode 100644 services/gateway/.env.example create mode 100644 services/gateway/.gitignore delete mode 100644 services/gateway/.gitinclude create mode 100644 services/gateway/.nvmrc create mode 100644 services/gateway/Dockerfile create mode 100644 services/gateway/README.md create mode 100644 services/gateway/package-lock.json create mode 100644 services/gateway/package.json create mode 120000 services/gateway/proto create mode 100644 services/gateway/src/index.ts create mode 100644 services/gateway/tsconfig.json create mode 100644 services/gateway/vitest.config.ts diff --git a/services/gateway/.env.example b/services/gateway/.env.example new file mode 100644 index 00000000..125a90fe --- /dev/null +++ b/services/gateway/.env.example @@ -0,0 +1 @@ +PORT=50000 \ No newline at end of file diff --git a/services/gateway/.gitignore b/services/gateway/.gitignore new file mode 100644 index 00000000..583204b4 --- /dev/null +++ b/services/gateway/.gitignore @@ -0,0 +1,5 @@ +node_modules/ +dist/ +bin/ +*.env* +!*.env.example diff --git a/services/gateway/.gitinclude b/services/gateway/.gitinclude deleted file mode 100644 index e69de29b..00000000 diff --git a/services/gateway/.nvmrc b/services/gateway/.nvmrc new file mode 100644 index 00000000..9dfef472 --- /dev/null +++ b/services/gateway/.nvmrc @@ -0,0 +1 @@ +v18.12.0 diff --git a/services/gateway/Dockerfile b/services/gateway/Dockerfile new file mode 100644 index 00000000..6e37d753 --- /dev/null +++ b/services/gateway/Dockerfile @@ -0,0 +1,38 @@ +FROM node:18-alpine3.17 as builder + +# Set working directory +WORKDIR /app + +# Copy the application code +COPY ./order/ . + +# Install dependencies +RUN npm install + +# Copy the proto files +COPY ./proto ./proto/ + +# Generate Prisma client +RUN npx prisma generate + +# Build the application +RUN npm run build + + +# Create a new image with the application +FROM node:18-alpine3.17 as runner + +# Set working directory +WORKDIR /app + +# Copy the application package +COPY --from=builder /app/dist . +COPY --from=builder /app/prisma/ . +COPY --from=builder /app/proto/ /proto/ +COPY --from=builder /app/node_modules/.prisma /.prisma + +# Expose the gRPC port +EXPOSE 50007 + +# Start the server +CMD [ "node", "index.js"] diff --git a/services/gateway/README.md b/services/gateway/README.md new file mode 100644 index 00000000..d39465e4 --- /dev/null +++ b/services/gateway/README.md @@ -0,0 +1,49 @@ +# Gateway Microservice + +| Informations | +|------------------------------------| +| **Port:** 50000 | +| **Developer:** @Anatole-Godard | +| **Status:** In progress | +| **Last update:** 2023-07-15 | +| **Language:** NodeJS | +| **Dependencies:** TypeScript, gRPC | +| **Models:** | + +## Http Routes + +The gateway provides the following routes: + +[//]: # (TODO: Add routes) + +## Requirements + +To run this microservice, you will need to have the following installed on your system: + +- NodeJS (v18.12.0 or higher) (dev. with v18.12.0) + +You can use the following tools to help you with the setup: + +- You can use nvm to set your Node version using: + - `nvm use`. + +## Getting started + +### 1. Clone the repository and install dependencies + +1. Clone the `goodfood` repository to your local machine. +2. Navigate to the service directory (`services/gateway`) in your terminal. +3. Run `npm install` to install the necessary dependencies. +4. Create a `.env` file at the root of the project directory and add the environment variables values ( + see `.env.example`). +5. Run `npm run start` to start the microservice. + +You can now access the microservice at `http://localhost:50000`. + +NB: If you want to run the microservice in development mode, you can run `npm run dev` instead. + +## Testing + +### Requests examples + +[//]: # (TODO: Add requests examples) \ No newline at end of file diff --git a/services/gateway/package-lock.json b/services/gateway/package-lock.json new file mode 100644 index 00000000..54f22426 --- /dev/null +++ b/services/gateway/package-lock.json @@ -0,0 +1,8513 @@ +{ + "name": "@goodfood/gateway", + "version": "1.0.0", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "@goodfood/gateway", + "version": "1.0.0", + "license": "ISC", + "dependencies": { + "@grpc/grpc-js": "1.8.14", + "@grpc/proto-loader": "0.7.6", + "@types/express": "^4.17.17", + "axios": "^1.4.0", + "body-parser": "^1.20.2", + "dotenv": "^16.0.3", + "express": "^4.18.2", + "grpc-server-reflection": "^0.1.5", + "protobufjs": "^7.2.4" + }, + "bin": { + "gateway": "dist/index.js" + }, + "devDependencies": { + "@types/amqplib": "^0.10.1", + "@types/node": "^18.15.9", + "@vitest/coverage-c8": "^0.33.0", + "esbuild": "^0.17.18", + "grpc-tools": "^1.12.4", + "nodemon": "^3.0.1", + "pkg": "^5.8.1", + "ts-node": "10.9.1", + "tsconfig-paths": "^4.2.0", + "typescript": "5.0.2", + "vite-tsconfig-paths": "^4.2.0", + "vitest": "^0.33.0", + "vitest-mock-extended": "^1.1.4" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", + "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/generator": { + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.2.tgz", + "integrity": "sha512-W1lG5vUwFvfMd8HVXqdfbuG7RuaSrTCCD8cl8fP8wOivdbtbIg2Db3IWUcgvfxKbbn6ZBGYRW/Zk1MIwK49mgw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.18.2", + "@jridgewell/gen-mapping": "^0.3.0", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", + "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz", + "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.18.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.4.tgz", + "integrity": "sha512-FDge0dFazETFcxGw/EXzOkN8uJp0PC7Qbm+Pe9T+av2zlBpOgunFHkQPPn+eRuClU73JF+98D531UgayY89tow==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/types": { + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.19.0.tgz", + "integrity": "sha512-YuGopBq3ke25BVSiS6fgF49Ul9gH1x70Bcr6bqRLjWCkcX8Hre1/5+z+IiWOIerRMSSEfGZVB9z9kyq7wVs9YA==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.18.10", + "@babel/helper-validator-identifier": "^7.18.6", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true + }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.19.tgz", + "integrity": "sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.19.tgz", + "integrity": "sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.19.tgz", + "integrity": "sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.19.tgz", + "integrity": "sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.19.tgz", + "integrity": "sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.19.tgz", + "integrity": "sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.19.tgz", + "integrity": "sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.19.tgz", + "integrity": "sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.19.tgz", + "integrity": "sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.19.tgz", + "integrity": "sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.19.tgz", + "integrity": "sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.19.tgz", + "integrity": "sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.19.tgz", + "integrity": "sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.19.tgz", + "integrity": "sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.19.tgz", + "integrity": "sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.19.tgz", + "integrity": "sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.19.tgz", + "integrity": "sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.19.tgz", + "integrity": "sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.19.tgz", + "integrity": "sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.19.tgz", + "integrity": "sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.19.tgz", + "integrity": "sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.19.tgz", + "integrity": "sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@grpc/grpc-js": { + "version": "1.8.14", + "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.8.14.tgz", + "integrity": "sha512-w84maJ6CKl5aApCMzFll0hxtFNT6or9WwMslobKaqWUEf1K+zhlL43bSQhFreyYWIWR+Z0xnVFC1KtLm4ZpM/A==", + "dependencies": { + "@grpc/proto-loader": "^0.7.0", + "@types/node": ">=12.12.47" + }, + "engines": { + "node": "^8.13.0 || >=10.10.0" + } + }, + "node_modules/@grpc/proto-loader": { + "version": "0.7.6", + "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.6.tgz", + "integrity": "sha512-QyAXR8Hyh7uMDmveWxDSUcJr9NAWaZ2I6IXgAYvQmfflwouTM+rArE2eEaCtLlRqO81j7pRLCt81IefUei6Zbw==", + "dependencies": { + "@types/long": "^4.0.1", + "lodash.camelcase": "^4.3.0", + "long": "^4.0.0", + "protobufjs": "^7.0.0", + "yargs": "^16.2.0" + }, + "bin": { + "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/schemas": { + "version": "29.6.0", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.0.tgz", + "integrity": "sha512-rxLjXyJBTL4LQeJW3aKo0M/+GkCOXsO+8i9Iu7eDb6KwtP65ayoDsitrdPBtujxQ88k4wI2FNYfa6TOGwSn6cQ==", + "dev": true, + "dependencies": { + "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.18", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", + "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" + } + }, + "node_modules/@jridgewell/trace-mapping/node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "dev": true + }, + "node_modules/@mapbox/node-pre-gyp": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.11.tgz", + "integrity": "sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==", + "dev": true, + "dependencies": { + "detect-libc": "^2.0.0", + "https-proxy-agent": "^5.0.0", + "make-dir": "^3.1.0", + "node-fetch": "^2.6.7", + "nopt": "^5.0.0", + "npmlog": "^5.0.1", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.11" + }, + "bin": { + "node-pre-gyp": "bin/node-pre-gyp" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@protobufjs/aspromise": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==" + }, + "node_modules/@protobufjs/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" + }, + "node_modules/@protobufjs/codegen": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", + "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" + }, + "node_modules/@protobufjs/eventemitter": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", + "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==" + }, + "node_modules/@protobufjs/fetch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", + "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", + "dependencies": { + "@protobufjs/aspromise": "^1.1.1", + "@protobufjs/inquire": "^1.1.0" + } + }, + "node_modules/@protobufjs/float": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", + "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==" + }, + "node_modules/@protobufjs/inquire": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", + "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==" + }, + "node_modules/@protobufjs/path": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==" + }, + "node_modules/@protobufjs/pool": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==" + }, + "node_modules/@protobufjs/utf8": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", + "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==" + }, + "node_modules/@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "dev": true + }, + "node_modules/@tsconfig/node10": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", + "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", + "dev": true + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", + "dev": true + }, + "node_modules/@types/amqplib": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/@types/amqplib/-/amqplib-0.10.1.tgz", + "integrity": "sha512-j6ANKT79ncUDnAs/+9r9eDujxbeJoTjoVu33gHHcaPfmLQaMhvfbH2GqSe8KUM444epAp1Vl3peVOQfZk3UIqA==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/body-parser": { + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", + "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/chai": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.5.tgz", + "integrity": "sha512-mEo1sAde+UCE6b2hxn332f1g1E8WfYRu6p5SvTKr2ZKC1f7gFJXk4h5PyGP9Dt6gCaG8y8XhwnXWC6Iy2cmBng==", + "dev": true + }, + "node_modules/@types/chai-subset": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@types/chai-subset/-/chai-subset-1.3.3.tgz", + "integrity": "sha512-frBecisrNGz+F4T6bcc+NLeolfiojh5FxW2klu669+8BARtyQv2C/GkNW6FUodVe4BroGMP/wER/YDGc7rEllw==", + "dev": true, + "dependencies": { + "@types/chai": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.35", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", + "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/express": { + "version": "4.17.17", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.17.tgz", + "integrity": "sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==", + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "4.17.35", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.35.tgz", + "integrity": "sha512-wALWQwrgiB2AWTT91CB62b6Yt0sNHpznUXeZEcnPU3DRdlDIz74x8Qg1UUYKSVFi+va5vKOLYRBI1bRKiLLKIg==", + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/http-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-/K3ds8TRAfBvi5vfjuz8y6+GiAYBZ0x4tXv1Av6CWBWn0IlADc+ZX9pMq7oU0fNQPnBwIZl3rmeLp6SBApbxSQ==" + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", + "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", + "dev": true + }, + "node_modules/@types/long": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz", + "integrity": "sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==" + }, + "node_modules/@types/mime": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", + "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==" + }, + "node_modules/@types/node": { + "version": "18.15.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.9.tgz", + "integrity": "sha512-dUxhiNzBLr6IqlZXz6e/rN2YQXlFgOei/Dxy+e3cyXTJ4txSUbGT2/fmnD6zd/75jDMeW5bDee+YXxlFKHoV0A==" + }, + "node_modules/@types/qs": { + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==" + }, + "node_modules/@types/range-parser": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", + "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==" + }, + "node_modules/@types/send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.1.tgz", + "integrity": "sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q==", + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.2.tgz", + "integrity": "sha512-J2LqtvFYCzaj8pVYKw8klQXrLLk7TBZmQ4ShlcdkELFKGwGMfevMLneMMRkMgZxotOD9wg497LpC7O8PcvAmfw==", + "dependencies": { + "@types/http-errors": "*", + "@types/mime": "*", + "@types/node": "*" + } + }, + "node_modules/@vitest/coverage-c8": { + "version": "0.33.0", + "resolved": "https://registry.npmjs.org/@vitest/coverage-c8/-/coverage-c8-0.33.0.tgz", + "integrity": "sha512-DaF1zJz4dcOZS4k/neiQJokmOWqsGXwhthfmUdPGorXIQHjdPvV6JQSYhQDI41MyI8c+IieQUdIDs5XAMHtDDw==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.2.1", + "c8": "^7.14.0", + "magic-string": "^0.30.1", + "picocolors": "^1.0.0", + "std-env": "^3.3.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "vitest": ">=0.30.0 <1" + } + }, + "node_modules/@vitest/expect": { + "version": "0.33.0", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-0.33.0.tgz", + "integrity": "sha512-sVNf+Gla3mhTCxNJx+wJLDPp/WcstOe0Ksqz4Vec51MmgMth/ia0MGFEkIZmVGeTL5HtjYR4Wl/ZxBxBXZJTzQ==", + "dev": true, + "dependencies": { + "@vitest/spy": "0.33.0", + "@vitest/utils": "0.33.0", + "chai": "^4.3.7" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/runner": { + "version": "0.33.0", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-0.33.0.tgz", + "integrity": "sha512-UPfACnmCB6HKRHTlcgCoBh6ppl6fDn+J/xR8dTufWiKt/74Y9bHci5CKB8tESSV82zKYtkBJo9whU3mNvfaisg==", + "dev": true, + "dependencies": { + "@vitest/utils": "0.33.0", + "p-limit": "^4.0.0", + "pathe": "^1.1.1" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/runner/node_modules/p-limit": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", + "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^1.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@vitest/runner/node_modules/yocto-queue": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", + "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", + "dev": true, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@vitest/snapshot": { + "version": "0.33.0", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-0.33.0.tgz", + "integrity": "sha512-tJjrl//qAHbyHajpFvr8Wsk8DIOODEebTu7pgBrP07iOepR5jYkLFiqLq2Ltxv+r0uptUb4izv1J8XBOwKkVYA==", + "dev": true, + "dependencies": { + "magic-string": "^0.30.1", + "pathe": "^1.1.1", + "pretty-format": "^29.5.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/spy": { + "version": "0.33.0", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-0.33.0.tgz", + "integrity": "sha512-Kv+yZ4hnH1WdiAkPUQTpRxW8kGtH8VRTnus7ZTGovFYM1ZezJpvGtb9nPIjPnptHbsyIAxYZsEpVPYgtpjGnrg==", + "dev": true, + "dependencies": { + "tinyspy": "^2.1.1" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/utils": { + "version": "0.33.0", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-0.33.0.tgz", + "integrity": "sha512-pF1w22ic965sv+EN6uoePkAOTkAPWM03Ri/jXNyMIKBb/XHLDPfhLvf/Fa9g0YECevAIz56oVYXhodLvLQ/awA==", + "dev": true, + "dependencies": { + "diff-sequences": "^29.4.3", + "loupe": "^2.3.6", + "pretty-format": "^29.5.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/aproba": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", + "dev": true + }, + "node_modules/are-we-there-yet": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", + "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", + "dev": true, + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "node_modules/at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/axios": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.4.0.tgz", + "integrity": "sha512-S4XCWMEmzvo64T9GfvQDOXgYRDJ/wsSZc7Jvdgx5u1sd0JwsuPLqb3SYmusag+edF6ziyMensPVqLTSc1PiSEA==", + "dependencies": { + "follow-redirects": "^1.15.0", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dev": true, + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/body-parser": { + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", + "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/c8": { + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/c8/-/c8-7.14.0.tgz", + "integrity": "sha512-i04rtkkcNcCf7zsQcSv/T9EbUn4RXQ6mropeMcjFOsQXQ0iGLAr/xT6TImQg4+U9hmNpN9XdvPkjUL1IzbgxJw==", + "dev": true, + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@istanbuljs/schema": "^0.1.3", + "find-up": "^5.0.0", + "foreground-child": "^2.0.0", + "istanbul-lib-coverage": "^3.2.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-reports": "^3.1.4", + "rimraf": "^3.0.2", + "test-exclude": "^6.0.0", + "v8-to-istanbul": "^9.0.0", + "yargs": "^16.2.0", + "yargs-parser": "^20.2.9" + }, + "bin": { + "c8": "bin/c8.js" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/cac": { + "version": "6.7.14", + "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", + "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/chai": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.7.tgz", + "integrity": "sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==", + "dev": true, + "dependencies": { + "assertion-error": "^1.1.0", + "check-error": "^1.0.2", + "deep-eql": "^4.1.2", + "get-func-name": "^2.0.0", + "loupe": "^2.3.1", + "pathval": "^1.1.1", + "type-detect": "^4.0.5" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/check-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", + "integrity": "sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "dev": true, + "bin": { + "color-support": "bin.js" + } + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", + "dev": true + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true + }, + "node_modules/cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "dev": true + }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "dev": true, + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/deep-eql": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz", + "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==", + "dev": true, + "dependencies": { + "type-detect": "^4.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "dev": true, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", + "dev": true + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detect-libc": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz", + "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/diff-sequences": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.4.3.tgz", + "integrity": "sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dotenv": { + "version": "16.3.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.3.1.tgz", + "integrity": "sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/motdotla/dotenv?sponsor=1" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/esbuild": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.19.tgz", + "integrity": "sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.17.19", + "@esbuild/android-arm64": "0.17.19", + "@esbuild/android-x64": "0.17.19", + "@esbuild/darwin-arm64": "0.17.19", + "@esbuild/darwin-x64": "0.17.19", + "@esbuild/freebsd-arm64": "0.17.19", + "@esbuild/freebsd-x64": "0.17.19", + "@esbuild/linux-arm": "0.17.19", + "@esbuild/linux-arm64": "0.17.19", + "@esbuild/linux-ia32": "0.17.19", + "@esbuild/linux-loong64": "0.17.19", + "@esbuild/linux-mips64el": "0.17.19", + "@esbuild/linux-ppc64": "0.17.19", + "@esbuild/linux-riscv64": "0.17.19", + "@esbuild/linux-s390x": "0.17.19", + "@esbuild/linux-x64": "0.17.19", + "@esbuild/netbsd-x64": "0.17.19", + "@esbuild/openbsd-x64": "0.17.19", + "@esbuild/sunos-x64": "0.17.19", + "@esbuild/win32-arm64": "0.17.19", + "@esbuild/win32-ia32": "0.17.19", + "@esbuild/win32-x64": "0.17.19" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/expand-template": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", + "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/express": { + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.1", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.5.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/express/node_modules/body-parser": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/express/node_modules/raw-body": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/fast-glob": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.0.tgz", + "integrity": "sha512-ChDuvbOypPuNjO8yIDf36x7BlZX1smcUMTTcyoIjycexOxd6DFsKsg21qVBzEmr3G7fUKIRy2/psii+CIUt7FA==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/follow-redirects": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/foreground-child": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", + "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + } + }, + "node_modules/from2/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/from2/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/from2/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "dev": true + }, + "node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/fs-minipass/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "node_modules/gauge": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", + "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", + "dev": true, + "dependencies": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.2", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.1", + "object-assign": "^4.1.1", + "signal-exit": "^3.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-func-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", + "integrity": "sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/github-from-package": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", + "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==", + "dev": true + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globrex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz", + "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==", + "dev": true + }, + "node_modules/google-protobuf": { + "version": "3.21.2", + "resolved": "https://registry.npmjs.org/google-protobuf/-/google-protobuf-3.21.2.tgz", + "integrity": "sha512-3MSOYFO5U9mPGikIYCzK0SaThypfGgS6bHqrUGXG3DPHCrb+txNqeEcns1W0lkGfk0rCyNXm7xB9rMxnCiZOoA==" + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true + }, + "node_modules/grpc-server-reflection": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/grpc-server-reflection/-/grpc-server-reflection-0.1.5.tgz", + "integrity": "sha512-i69RYu6v65enzknNAPUgerFuVQfo+L3n9g4c1A/Sv5jUHMpxMIjSbBA+YWls9Sr4Flac4oohp4Gx8f389CaHuw==", + "dependencies": { + "google-protobuf": "^3.19.1" + } + }, + "node_modules/grpc-tools": { + "version": "1.12.4", + "resolved": "https://registry.npmjs.org/grpc-tools/-/grpc-tools-1.12.4.tgz", + "integrity": "sha512-5+mLAJJma3BjnW/KQp6JBjUMgvu7Mu3dBvBPd1dcbNIb+qiR0817zDpgPjS7gRb+l/8EVNIa3cB02xI9JLToKg==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "@mapbox/node-pre-gyp": "^1.0.5" + }, + "bin": { + "grpc_tools_node_protoc": "bin/protoc.js", + "grpc_tools_node_protoc_plugin": "bin/protoc_plugin.js" + } + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", + "dev": true + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dev": true, + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/ignore": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/ignore-by-default": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", + "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==", + "dev": true + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true + }, + "node_modules/into-stream": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/into-stream/-/into-stream-6.0.0.tgz", + "integrity": "sha512-XHbaOAvP+uFKUFsOgoNPRjLkwB+I22JFPFe5OjTkQ0nwgj6+pSjb4NmB6VMxaPshLiOf+zcpOCBQuLwC1KHhZA==", + "dev": true, + "dependencies": { + "from2": "^2.3.0", + "p-is-promise": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz", + "integrity": "sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", + "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "dev": true, + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-reports": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", + "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", + "dev": true, + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonc-parser": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", + "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", + "dev": true + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/local-pkg": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.4.3.tgz", + "integrity": "sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==" + }, + "node_modules/long": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", + "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" + }, + "node_modules/loupe": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.6.tgz", + "integrity": "sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==", + "dev": true, + "dependencies": { + "get-func-name": "^2.0.0" + } + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/magic-string": { + "version": "0.30.1", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.1.tgz", + "integrity": "sha512-mbVKXPmS0z0G4XqFDCTllmDQ6coZzn94aMlb0o/A4HEHJCKcanlDZwYJgwnkmgD3jyWhUgj9VsPrfd972yPffA==", + "dev": true, + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.15" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minizlib/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mkdirp-classic": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", + "dev": true + }, + "node_modules/mlly": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.4.0.tgz", + "integrity": "sha512-ua8PAThnTwpprIaU47EPeZ/bPUVp2QYBbWMphUQpVdBI3Lgqzm5KZQ45Agm3YJedHXaIHl6pBGabaLSUPPSptg==", + "dev": true, + "dependencies": { + "acorn": "^8.9.0", + "pathe": "^1.1.1", + "pkg-types": "^1.0.3", + "ufo": "^1.1.2" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/multistream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/multistream/-/multistream-4.1.0.tgz", + "integrity": "sha512-J1XDiAmmNpRCBfIWJv+n0ymC4ABcf/Pl+5YvC5B/D2f/2+8PtHvCNxMPKiQcZyi922Hq69J2YOpb1pTywfifyw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "once": "^1.4.0", + "readable-stream": "^3.6.0" + } + }, + "node_modules/nanoid": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", + "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/napi-build-utils": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", + "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==", + "dev": true + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/node-abi": { + "version": "3.45.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.45.0.tgz", + "integrity": "sha512-iwXuFrMAcFVi/ZoZiqq8BzAdsLw9kxDfTC0HMyjXfSL/6CSDAGD5UmR7azrAgWV1zKYq7dUUMj4owusBWKLsiQ==", + "dev": true, + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/node-fetch": { + "version": "2.6.12", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.12.tgz", + "integrity": "sha512-C/fGU2E8ToujUivIO0H+tpQ6HWo4eEmchoPIoXtxCrVghxdKq+QOHqEZW7tuP3KlV3bC8FRMO5nMCC7Zm1VP6g==", + "dev": true, + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/nodemon": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.0.1.tgz", + "integrity": "sha512-g9AZ7HmkhQkqXkRc20w+ZfQ73cHLbE8hnPbtaFbFtCumZsjyMhKk9LajQ07U5Ux28lvFjZ5X7HvWR1xzU8jHVw==", + "dev": true, + "dependencies": { + "chokidar": "^3.5.2", + "debug": "^3.2.7", + "ignore-by-default": "^1.0.1", + "minimatch": "^3.1.2", + "pstree.remy": "^1.1.8", + "semver": "^7.5.3", + "simple-update-notifier": "^2.0.0", + "supports-color": "^5.5.0", + "touch": "^3.1.0", + "undefsafe": "^2.0.5" + }, + "bin": { + "nodemon": "bin/nodemon.js" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/nodemon" + } + }, + "node_modules/nodemon/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/nodemon/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/nodemon/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "dev": true, + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npmlog": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", + "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", + "dev": true, + "dependencies": { + "are-we-there-yet": "^2.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^3.0.0", + "set-blocking": "^2.0.0" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/p-is-promise": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-3.0.0.tgz", + "integrity": "sha512-Wo8VsW4IRQSKVXsJCn7TomUaVtyfjVDn3nUP7kE967BQk0CwFpdbZs0X0uk5sW9mkBa9eNM7hCMaG93WUAwxYQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/pathe": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.1.tgz", + "integrity": "sha512-d+RQGp0MAYTIaDBIMmOfMwz3E+LOZnxx1HZd5R18mmCZY0QBlK0LDZfPc8FW8Ed2DlvsuE6PRjroDY+wg4+j/Q==", + "dev": true + }, + "node_modules/pathval": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", + "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pkg": { + "version": "5.8.1", + "resolved": "https://registry.npmjs.org/pkg/-/pkg-5.8.1.tgz", + "integrity": "sha512-CjBWtFStCfIiT4Bde9QpJy0KeH19jCfwZRJqHFDFXfhUklCx8JoFmMj3wgnEYIwGmZVNkhsStPHEOnrtrQhEXA==", + "dev": true, + "dependencies": { + "@babel/generator": "7.18.2", + "@babel/parser": "7.18.4", + "@babel/types": "7.19.0", + "chalk": "^4.1.2", + "fs-extra": "^9.1.0", + "globby": "^11.1.0", + "into-stream": "^6.0.0", + "is-core-module": "2.9.0", + "minimist": "^1.2.6", + "multistream": "^4.1.0", + "pkg-fetch": "3.4.2", + "prebuild-install": "7.1.1", + "resolve": "^1.22.0", + "stream-meter": "^1.0.4" + }, + "bin": { + "pkg": "lib-es5/bin.js" + }, + "peerDependencies": { + "node-notifier": ">=9.0.1" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/pkg-fetch": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/pkg-fetch/-/pkg-fetch-3.4.2.tgz", + "integrity": "sha512-0+uijmzYcnhC0hStDjm/cl2VYdrmVVBpe7Q8k9YBojxmR5tG8mvR9/nooQq3QSXiQqORDVOTY3XqMEqJVIzkHA==", + "dev": true, + "dependencies": { + "chalk": "^4.1.2", + "fs-extra": "^9.1.0", + "https-proxy-agent": "^5.0.0", + "node-fetch": "^2.6.6", + "progress": "^2.0.3", + "semver": "^7.3.5", + "tar-fs": "^2.1.1", + "yargs": "^16.2.0" + }, + "bin": { + "pkg-fetch": "lib-es5/bin.js" + } + }, + "node_modules/pkg-types": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.0.3.tgz", + "integrity": "sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==", + "dev": true, + "dependencies": { + "jsonc-parser": "^3.2.0", + "mlly": "^1.2.0", + "pathe": "^1.1.0" + } + }, + "node_modules/postcss": { + "version": "8.4.26", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.26.tgz", + "integrity": "sha512-jrXHFF8iTloAenySjM/ob3gSj7pCu0Ji49hnjqzsgSRa50hkWCKD0HQ+gMNJkW38jBI68MpAAg7ZWwHwX8NMMw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/prebuild-install": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.1.tgz", + "integrity": "sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==", + "dev": true, + "dependencies": { + "detect-libc": "^2.0.0", + "expand-template": "^2.0.3", + "github-from-package": "0.0.0", + "minimist": "^1.2.3", + "mkdirp-classic": "^0.5.3", + "napi-build-utils": "^1.0.1", + "node-abi": "^3.3.0", + "pump": "^3.0.0", + "rc": "^1.2.7", + "simple-get": "^4.0.0", + "tar-fs": "^2.0.0", + "tunnel-agent": "^0.6.0" + }, + "bin": { + "prebuild-install": "bin.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/pretty-format": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.1.tgz", + "integrity": "sha512-7jRj+yXO0W7e4/tSJKoR7HRIHLPPjtNaUGG2xxKQnGvPNRkgWcQ0AZX6P4KBRJN4FcTBWb3sa7DVUJmocYuoog==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.6.0", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/protobufjs": { + "version": "7.2.4", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.2.4.tgz", + "integrity": "sha512-AT+RJgD2sH8phPmCf7OUZR8xGdcJRga4+1cOaXJ64hvcSkVhNcRHOwIxUatPH15+nj59WAGTDv3LSGZPEQbJaQ==", + "hasInstallScript": true, + "dependencies": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/node": ">=13.7.0", + "long": "^5.0.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/protobufjs/node_modules/long": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", + "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==" + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, + "node_modules/pstree.remy": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", + "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", + "dev": true + }, + "node_modules/pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dev": true, + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, + "node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", + "dev": true + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.2", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", + "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", + "dev": true, + "dependencies": { + "is-core-module": "^2.11.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve/node_modules/is-core-module": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz", + "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rollup": { + "version": "3.26.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.26.2.tgz", + "integrity": "sha512-6umBIGVz93er97pMgQO08LuH3m6PUb3jlDUUGFsNJB6VgTCUaDFpupf5JfU30529m/UKOgmiX+uY6Sx8cOYpLA==", + "dev": true, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=14.18.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "dev": true + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/siginfo": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", + "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", + "dev": true + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "node_modules/simple-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/simple-get": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", + "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "decompress-response": "^6.0.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } + }, + "node_modules/simple-update-notifier": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", + "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==", + "dev": true, + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stackback": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", + "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", + "dev": true + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/std-env": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.3.3.tgz", + "integrity": "sha512-Rz6yejtVyWnVjC1RFvNmYL10kgjC49EOghxWn0RFqlCHGFpQx+Xe7yW3I4ceK1SGrWIGMjD5Kbue8W/udkbMJg==", + "dev": true + }, + "node_modules/stream-meter": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/stream-meter/-/stream-meter-1.0.4.tgz", + "integrity": "sha512-4sOEtrbgFotXwnEuzzsQBYEV1elAeFSO8rSGeTwabuX1RRn/kEq9JVH7I0MRBhKVRR0sJkr0M0QCH7yOLf9fhQ==", + "dev": true, + "dependencies": { + "readable-stream": "^2.1.4" + } + }, + "node_modules/stream-meter/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/stream-meter/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/stream-meter/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-literal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-1.0.1.tgz", + "integrity": "sha512-QZTsipNpa2Ppr6v1AmJHESqJ3Uz247MUS0OjrnnZjFAvEoWqxuyFuXn2xLgMtRnijJShAa1HL0gtJyUs7u7n3Q==", + "dev": true, + "dependencies": { + "acorn": "^8.8.2" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tar": { + "version": "6.1.15", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.15.tgz", + "integrity": "sha512-/zKt9UyngnxIT/EAGYuxaMYgOIJiP81ab9ZfkILq4oNLPFX50qyYmu7jRj9qeXoxmJHjGlbH0+cm2uy1WCs10A==", + "dev": true, + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/tar-fs": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", + "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", + "dev": true, + "dependencies": { + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.1.4" + } + }, + "node_modules/tar-fs/node_modules/chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "dev": true + }, + "node_modules/tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "dev": true, + "dependencies": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tinybench": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.5.0.tgz", + "integrity": "sha512-kRwSG8Zx4tjF9ZiyH4bhaebu+EDz1BOx9hOigYHlUW4xxI/wKIUQUqo018UlU4ar6ATPBsaMrdbKZ+tmPdohFA==", + "dev": true + }, + "node_modules/tinypool": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-0.6.0.tgz", + "integrity": "sha512-FdswUUo5SxRizcBc6b1GSuLpLjisa8N8qMyYoP3rl+bym+QauhtJP5bvZY1ytt8krKGmMLYIRl36HBZfeAoqhQ==", + "dev": true, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tinyspy": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-2.1.1.tgz", + "integrity": "sha512-XPJL2uSzcOyBMky6OFrusqWlzfFrXtE0hPuMgW8A2HmaqrPo4ZQHRN/V0QXN3FSjKxpsbRrFc5LI7KOwBsT1/w==", + "dev": true, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/touch": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", + "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", + "dev": true, + "dependencies": { + "nopt": "~1.0.10" + }, + "bin": { + "nodetouch": "bin/nodetouch.js" + } + }, + "node_modules/touch/node_modules/nopt": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", + "integrity": "sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==", + "dev": true, + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "*" + } + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "dev": true + }, + "node_modules/ts-essentials": { + "version": "9.3.2", + "resolved": "https://registry.npmjs.org/ts-essentials/-/ts-essentials-9.3.2.tgz", + "integrity": "sha512-JxKJzuWqH1MmH4ZFHtJzGEhkfN3QvVR3C3w+4BIoWeoY68UVVoA2Np/Bca9z0IPSErVCWhv439aT0We4Dks8kQ==", + "dev": true, + "peerDependencies": { + "typescript": ">=4.1.0" + } + }, + "node_modules/ts-node": { + "version": "10.9.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", + "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", + "dev": true, + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "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 + } + } + }, + "node_modules/tsconfck": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/tsconfck/-/tsconfck-2.1.1.tgz", + "integrity": "sha512-ZPCkJBKASZBmBUNqGHmRhdhM8pJYDdOXp4nRgj/O0JwUwsMq50lCDRQP/M5GBNAA0elPrq4gAeu4dkaVCuKWww==", + "dev": true, + "bin": { + "tsconfck": "bin/tsconfck.js" + }, + "engines": { + "node": "^14.13.1 || ^16 || >=18" + }, + "peerDependencies": { + "typescript": "^4.3.5 || ^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/tsconfig-paths": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", + "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==", + "dev": true, + "dependencies": { + "json5": "^2.2.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "dev": true, + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typescript": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.2.tgz", + "integrity": "sha512-wVORMBGO/FAs/++blGNeAVdbNKtIh1rbBL2EyQ1+J9lClJ93KiiKe8PmFIVdXhHcyv44SL9oglmfeSsndo0jRw==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=12.20" + } + }, + "node_modules/ufo": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.1.2.tgz", + "integrity": "sha512-TrY6DsjTQQgyS3E3dBaOXf0TpPD8u9FVrVYmKVegJuFw51n/YB9XPt+U6ydzFG5ZIN7+DIjPbNmXoBj9esYhgQ==", + "dev": true + }, + "node_modules/undefsafe": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", + "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", + "dev": true + }, + "node_modules/universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true + }, + "node_modules/v8-to-istanbul": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.1.0.tgz", + "integrity": "sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.12", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^1.6.0" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/vite": { + "version": "4.4.4", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.4.4.tgz", + "integrity": "sha512-4mvsTxjkveWrKDJI70QmelfVqTm+ihFAb6+xf4sjEU2TmUCTlVX87tmg/QooPEMQb/lM9qGHT99ebqPziEd3wg==", + "dev": true, + "dependencies": { + "esbuild": "^0.18.10", + "postcss": "^8.4.25", + "rollup": "^3.25.2" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + }, + "peerDependencies": { + "@types/node": ">= 14", + "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 + } + } + }, + "node_modules/vite-node": { + "version": "0.33.0", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-0.33.0.tgz", + "integrity": "sha512-19FpHYbwWWxDr73ruNahC+vtEdza52kA90Qb3La98yZ0xULqV8A5JLNPUff0f5zID4984tW7l3DH2przTJUZSw==", + "dev": true, + "dependencies": { + "cac": "^6.7.14", + "debug": "^4.3.4", + "mlly": "^1.4.0", + "pathe": "^1.1.1", + "picocolors": "^1.0.0", + "vite": "^3.0.0 || ^4.0.0" + }, + "bin": { + "vite-node": "vite-node.mjs" + }, + "engines": { + "node": ">=v14.18.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/vite-tsconfig-paths": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/vite-tsconfig-paths/-/vite-tsconfig-paths-4.2.0.tgz", + "integrity": "sha512-jGpus0eUy5qbbMVGiTxCL1iB9ZGN6Bd37VGLJU39kTDD6ZfULTTb1bcc5IeTWqWJKiWV5YihCaibeASPiGi8kw==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "globrex": "^0.1.2", + "tsconfck": "^2.1.0" + }, + "peerDependencies": { + "vite": "*" + }, + "peerDependenciesMeta": { + "vite": { + "optional": true + } + } + }, + "node_modules/vite/node_modules/@esbuild/android-arm": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.12.tgz", + "integrity": "sha512-LIxaNIQfkFZbTLb4+cX7dozHlAbAshhFE5PKdro0l+FnCpx1GDJaQ2WMcqm+ToXKMt8p8Uojk/MFRuGyz3V5Sw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/android-arm64": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.12.tgz", + "integrity": "sha512-BMAlczRqC/LUt2P97E4apTBbkvS9JTJnp2DKFbCwpZ8vBvXVbNdqmvzW/OsdtI/+mGr+apkkpqGM8WecLkPgrA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/android-x64": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.12.tgz", + "integrity": "sha512-zU5MyluNsykf5cOJ0LZZZjgAHbhPJ1cWfdH1ZXVMXxVMhEV0VZiZXQdwBBVvmvbF28EizeK7obG9fs+fpmS0eQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/darwin-arm64": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.12.tgz", + "integrity": "sha512-zUZMep7YONnp6954QOOwEBwFX9svlKd3ov6PkxKd53LGTHsp/gy7vHaPGhhjBmEpqXEXShi6dddjIkmd+NgMsA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/darwin-x64": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.12.tgz", + "integrity": "sha512-ohqLPc7i67yunArPj1+/FeeJ7AgwAjHqKZ512ADk3WsE3FHU9l+m5aa7NdxXr0HmN1bjDlUslBjWNbFlD9y12Q==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/freebsd-arm64": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.12.tgz", + "integrity": "sha512-GIIHtQXqgeOOqdG16a/A9N28GpkvjJnjYMhOnXVbn3EDJcoItdR58v/pGN31CHjyXDc8uCcRnFWmqaJt24AYJg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/freebsd-x64": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.12.tgz", + "integrity": "sha512-zK0b9a1/0wZY+6FdOS3BpZcPc1kcx2G5yxxfEJtEUzVxI6n/FrC2Phsxj/YblPuBchhBZ/1wwn7AyEBUyNSa6g==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-arm": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.12.tgz", + "integrity": "sha512-y75OijvrBE/1XRrXq1jtrJfG26eHeMoqLJ2dwQNwviwTuTtHGCojsDO6BJNF8gU+3jTn1KzJEMETytwsFSvc+Q==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-arm64": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.12.tgz", + "integrity": "sha512-JKgG8Q/LL/9sw/iHHxQyVMoQYu3rU3+a5Z87DxC+wAu3engz+EmctIrV+FGOgI6gWG1z1+5nDDbXiRMGQZXqiw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-ia32": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.12.tgz", + "integrity": "sha512-yoRIAqc0B4lDIAAEFEIu9ttTRFV84iuAl0KNCN6MhKLxNPfzwCBvEMgwco2f71GxmpBcTtn7KdErueZaM2rEvw==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-loong64": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.12.tgz", + "integrity": "sha512-qYgt3dHPVvf/MgbIBpJ4Sup/yb9DAopZ3a2JgMpNKIHUpOdnJ2eHBo/aQdnd8dJ21X/+sS58wxHtA9lEazYtXQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-mips64el": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.12.tgz", + "integrity": "sha512-wHphlMLK4ufNOONqukELfVIbnGQJrHJ/mxZMMrP2jYrPgCRZhOtf0kC4yAXBwnfmULimV1qt5UJJOw4Kh13Yfg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-ppc64": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.12.tgz", + "integrity": "sha512-TeN//1Ft20ZZW41+zDSdOI/Os1bEq5dbvBvYkberB7PHABbRcsteeoNVZFlI0YLpGdlBqohEpjrn06kv8heCJg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-riscv64": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.12.tgz", + "integrity": "sha512-AgUebVS4DoAblBgiB2ACQ/8l4eGE5aWBb8ZXtkXHiET9mbj7GuWt3OnsIW/zX+XHJt2RYJZctbQ2S/mDjbp0UA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-s390x": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.12.tgz", + "integrity": "sha512-dJ3Rb3Ei2u/ysSXd6pzleGtfDdc2MuzKt8qc6ls8vreP1G3B7HInX3i7gXS4BGeVd24pp0yqyS7bJ5NHaI9ing==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-x64": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.12.tgz", + "integrity": "sha512-OrNJMGQbPaVyHHcDF8ybNSwu7TDOfX8NGpXCbetwOSP6txOJiWlgQnRymfC9ocR1S0Y5PW0Wb1mV6pUddqmvmQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/netbsd-x64": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.12.tgz", + "integrity": "sha512-55FzVCAiwE9FK8wWeCRuvjazNRJ1QqLCYGZVB6E8RuQuTeStSwotpSW4xoRGwp3a1wUsaVCdYcj5LGCASVJmMg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/openbsd-x64": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.12.tgz", + "integrity": "sha512-qnluf8rfb6Y5Lw2tirfK2quZOBbVqmwxut7GPCIJsM8lc4AEUj9L8y0YPdLaPK0TECt4IdyBdBD/KRFKorlK3g==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/sunos-x64": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.12.tgz", + "integrity": "sha512-+RkKpVQR7bICjTOPUpkTBTaJ4TFqQBX5Ywyd/HSdDkQGn65VPkTsR/pL4AMvuMWy+wnXgIl4EY6q4mVpJal8Kg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/win32-arm64": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.12.tgz", + "integrity": "sha512-GNHuciv0mFM7ouzsU0+AwY+7eV4Mgo5WnbhfDCQGtpvOtD1vbOiRjPYG6dhmMoFyBjj+pNqQu2X+7DKn0KQ/Gw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/win32-ia32": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.12.tgz", + "integrity": "sha512-kR8cezhYipbbypGkaqCTWIeu4zID17gamC8YTPXYtcN3E5BhhtTnwKBn9I0PJur/T6UVwIEGYzkffNL0lFvxEw==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/win32-x64": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.12.tgz", + "integrity": "sha512-O0UYQVkvfM/jO8a4OwoV0mAKSJw+mjWTAd1MJd/1FCX6uiMdLmMRPK/w6e9OQ0ob2WGxzIm9va/KG0Ja4zIOgg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/esbuild": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.12.tgz", + "integrity": "sha512-XuOVLDdtsDslXStStduT41op21Ytmf4/BDS46aa3xPJ7X5h2eMWBF1oAe3QjUH3bDksocNXgzGUZ7XHIBya6Tg==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.18.12", + "@esbuild/android-arm64": "0.18.12", + "@esbuild/android-x64": "0.18.12", + "@esbuild/darwin-arm64": "0.18.12", + "@esbuild/darwin-x64": "0.18.12", + "@esbuild/freebsd-arm64": "0.18.12", + "@esbuild/freebsd-x64": "0.18.12", + "@esbuild/linux-arm": "0.18.12", + "@esbuild/linux-arm64": "0.18.12", + "@esbuild/linux-ia32": "0.18.12", + "@esbuild/linux-loong64": "0.18.12", + "@esbuild/linux-mips64el": "0.18.12", + "@esbuild/linux-ppc64": "0.18.12", + "@esbuild/linux-riscv64": "0.18.12", + "@esbuild/linux-s390x": "0.18.12", + "@esbuild/linux-x64": "0.18.12", + "@esbuild/netbsd-x64": "0.18.12", + "@esbuild/openbsd-x64": "0.18.12", + "@esbuild/sunos-x64": "0.18.12", + "@esbuild/win32-arm64": "0.18.12", + "@esbuild/win32-ia32": "0.18.12", + "@esbuild/win32-x64": "0.18.12" + } + }, + "node_modules/vitest": { + "version": "0.33.0", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-0.33.0.tgz", + "integrity": "sha512-1CxaugJ50xskkQ0e969R/hW47za4YXDUfWJDxip1hwbnhUjYolpfUn2AMOulqG/Dtd9WYAtkHmM/m3yKVrEejQ==", + "dev": true, + "dependencies": { + "@types/chai": "^4.3.5", + "@types/chai-subset": "^1.3.3", + "@types/node": "*", + "@vitest/expect": "0.33.0", + "@vitest/runner": "0.33.0", + "@vitest/snapshot": "0.33.0", + "@vitest/spy": "0.33.0", + "@vitest/utils": "0.33.0", + "acorn": "^8.9.0", + "acorn-walk": "^8.2.0", + "cac": "^6.7.14", + "chai": "^4.3.7", + "debug": "^4.3.4", + "local-pkg": "^0.4.3", + "magic-string": "^0.30.1", + "pathe": "^1.1.1", + "picocolors": "^1.0.0", + "std-env": "^3.3.3", + "strip-literal": "^1.0.1", + "tinybench": "^2.5.0", + "tinypool": "^0.6.0", + "vite": "^3.0.0 || ^4.0.0", + "vite-node": "0.33.0", + "why-is-node-running": "^2.2.2" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": ">=v14.18.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@vitest/browser": "*", + "@vitest/ui": "*", + "happy-dom": "*", + "jsdom": "*", + "playwright": "*", + "safaridriver": "*", + "webdriverio": "*" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@vitest/browser": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + }, + "playwright": { + "optional": true + }, + "safaridriver": { + "optional": true + }, + "webdriverio": { + "optional": true + } + } + }, + "node_modules/vitest-mock-extended": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/vitest-mock-extended/-/vitest-mock-extended-1.1.4.tgz", + "integrity": "sha512-MKPdepFjk0CE7Ocb5txntHK/sloHO9s0Kk9dr630uL03shRSHMkZtSs5CBPsbJ8K/CvYLv0GHUmMt2zWks2eXg==", + "dev": true, + "dependencies": { + "ts-essentials": "^9.3.2" + }, + "peerDependencies": { + "typescript": "3.x || 4.x || 5.x", + "vitest": ">=0.31.1" + } + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "dev": true + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dev": true, + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/why-is-node-running": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.2.2.tgz", + "integrity": "sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==", + "dev": true, + "dependencies": { + "siginfo": "^2.0.0", + "stackback": "0.0.2" + }, + "bin": { + "why-is-node-running": "cli.js" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wide-align": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", + "dev": true, + "dependencies": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "engines": { + "node": ">=10" + } + }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + }, + "dependencies": { + "@ampproject/remapping": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", + "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", + "dev": true, + "requires": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "@babel/generator": { + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.2.tgz", + "integrity": "sha512-W1lG5vUwFvfMd8HVXqdfbuG7RuaSrTCCD8cl8fP8wOivdbtbIg2Db3IWUcgvfxKbbn6ZBGYRW/Zk1MIwK49mgw==", + "dev": true, + "requires": { + "@babel/types": "^7.18.2", + "@jridgewell/gen-mapping": "^0.3.0", + "jsesc": "^2.5.1" + } + }, + "@babel/helper-string-parser": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", + "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", + "dev": true + }, + "@babel/helper-validator-identifier": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz", + "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==", + "dev": true + }, + "@babel/parser": { + "version": "7.18.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.4.tgz", + "integrity": "sha512-FDge0dFazETFcxGw/EXzOkN8uJp0PC7Qbm+Pe9T+av2zlBpOgunFHkQPPn+eRuClU73JF+98D531UgayY89tow==", + "dev": true + }, + "@babel/types": { + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.19.0.tgz", + "integrity": "sha512-YuGopBq3ke25BVSiS6fgF49Ul9gH1x70Bcr6bqRLjWCkcX8Hre1/5+z+IiWOIerRMSSEfGZVB9z9kyq7wVs9YA==", + "dev": true, + "requires": { + "@babel/helper-string-parser": "^7.18.10", + "@babel/helper-validator-identifier": "^7.18.6", + "to-fast-properties": "^2.0.0" + } + }, + "@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true + }, + "@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "requires": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "dependencies": { + "@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "requires": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + } + } + }, + "@esbuild/android-arm": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.19.tgz", + "integrity": "sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==", + "dev": true, + "optional": true + }, + "@esbuild/android-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.19.tgz", + "integrity": "sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==", + "dev": true, + "optional": true + }, + "@esbuild/android-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.19.tgz", + "integrity": "sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==", + "dev": true, + "optional": true + }, + "@esbuild/darwin-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.19.tgz", + "integrity": "sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==", + "dev": true, + "optional": true + }, + "@esbuild/darwin-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.19.tgz", + "integrity": "sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==", + "dev": true, + "optional": true + }, + "@esbuild/freebsd-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.19.tgz", + "integrity": "sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==", + "dev": true, + "optional": true + }, + "@esbuild/freebsd-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.19.tgz", + "integrity": "sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==", + "dev": true, + "optional": true + }, + "@esbuild/linux-arm": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.19.tgz", + "integrity": "sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==", + "dev": true, + "optional": true + }, + "@esbuild/linux-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.19.tgz", + "integrity": "sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==", + "dev": true, + "optional": true + }, + "@esbuild/linux-ia32": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.19.tgz", + "integrity": "sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==", + "dev": true, + "optional": true + }, + "@esbuild/linux-loong64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.19.tgz", + "integrity": "sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==", + "dev": true, + "optional": true + }, + "@esbuild/linux-mips64el": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.19.tgz", + "integrity": "sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==", + "dev": true, + "optional": true + }, + "@esbuild/linux-ppc64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.19.tgz", + "integrity": "sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==", + "dev": true, + "optional": true + }, + "@esbuild/linux-riscv64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.19.tgz", + "integrity": "sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==", + "dev": true, + "optional": true + }, + "@esbuild/linux-s390x": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.19.tgz", + "integrity": "sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==", + "dev": true, + "optional": true + }, + "@esbuild/linux-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.19.tgz", + "integrity": "sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==", + "dev": true, + "optional": true + }, + "@esbuild/netbsd-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.19.tgz", + "integrity": "sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==", + "dev": true, + "optional": true + }, + "@esbuild/openbsd-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.19.tgz", + "integrity": "sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==", + "dev": true, + "optional": true + }, + "@esbuild/sunos-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.19.tgz", + "integrity": "sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==", + "dev": true, + "optional": true + }, + "@esbuild/win32-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.19.tgz", + "integrity": "sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==", + "dev": true, + "optional": true + }, + "@esbuild/win32-ia32": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.19.tgz", + "integrity": "sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==", + "dev": true, + "optional": true + }, + "@esbuild/win32-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.19.tgz", + "integrity": "sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==", + "dev": true, + "optional": true + }, + "@grpc/grpc-js": { + "version": "1.8.14", + "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.8.14.tgz", + "integrity": "sha512-w84maJ6CKl5aApCMzFll0hxtFNT6or9WwMslobKaqWUEf1K+zhlL43bSQhFreyYWIWR+Z0xnVFC1KtLm4ZpM/A==", + "requires": { + "@grpc/proto-loader": "^0.7.0", + "@types/node": ">=12.12.47" + } + }, + "@grpc/proto-loader": { + "version": "0.7.6", + "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.6.tgz", + "integrity": "sha512-QyAXR8Hyh7uMDmveWxDSUcJr9NAWaZ2I6IXgAYvQmfflwouTM+rArE2eEaCtLlRqO81j7pRLCt81IefUei6Zbw==", + "requires": { + "@types/long": "^4.0.1", + "lodash.camelcase": "^4.3.0", + "long": "^4.0.0", + "protobufjs": "^7.0.0", + "yargs": "^16.2.0" + } + }, + "@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true + }, + "@jest/schemas": { + "version": "29.6.0", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.0.tgz", + "integrity": "sha512-rxLjXyJBTL4LQeJW3aKo0M/+GkCOXsO+8i9Iu7eDb6KwtP65ayoDsitrdPBtujxQ88k4wI2FNYfa6TOGwSn6cQ==", + "dev": true, + "requires": { + "@sinclair/typebox": "^0.27.8" + } + }, + "@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dev": true, + "requires": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "dev": true + }, + "@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true + }, + "@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true + }, + "@jridgewell/trace-mapping": { + "version": "0.3.18", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", + "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", + "dev": true, + "requires": { + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" + }, + "dependencies": { + "@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "dev": true + } + } + }, + "@mapbox/node-pre-gyp": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.11.tgz", + "integrity": "sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==", + "dev": true, + "requires": { + "detect-libc": "^2.0.0", + "https-proxy-agent": "^5.0.0", + "make-dir": "^3.1.0", + "node-fetch": "^2.6.7", + "nopt": "^5.0.0", + "npmlog": "^5.0.1", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.11" + } + }, + "@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + } + }, + "@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true + }, + "@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "requires": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + } + }, + "@protobufjs/aspromise": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==" + }, + "@protobufjs/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" + }, + "@protobufjs/codegen": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", + "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" + }, + "@protobufjs/eventemitter": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", + "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==" + }, + "@protobufjs/fetch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", + "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", + "requires": { + "@protobufjs/aspromise": "^1.1.1", + "@protobufjs/inquire": "^1.1.0" + } + }, + "@protobufjs/float": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", + "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==" + }, + "@protobufjs/inquire": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", + "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==" + }, + "@protobufjs/path": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==" + }, + "@protobufjs/pool": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==" + }, + "@protobufjs/utf8": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", + "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==" + }, + "@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "dev": true + }, + "@tsconfig/node10": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", + "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", + "dev": true + }, + "@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true + }, + "@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true + }, + "@tsconfig/node16": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", + "dev": true + }, + "@types/amqplib": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/@types/amqplib/-/amqplib-0.10.1.tgz", + "integrity": "sha512-j6ANKT79ncUDnAs/+9r9eDujxbeJoTjoVu33gHHcaPfmLQaMhvfbH2GqSe8KUM444epAp1Vl3peVOQfZk3UIqA==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/body-parser": { + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", + "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", + "requires": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "@types/chai": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.5.tgz", + "integrity": "sha512-mEo1sAde+UCE6b2hxn332f1g1E8WfYRu6p5SvTKr2ZKC1f7gFJXk4h5PyGP9Dt6gCaG8y8XhwnXWC6Iy2cmBng==", + "dev": true + }, + "@types/chai-subset": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@types/chai-subset/-/chai-subset-1.3.3.tgz", + "integrity": "sha512-frBecisrNGz+F4T6bcc+NLeolfiojh5FxW2klu669+8BARtyQv2C/GkNW6FUodVe4BroGMP/wER/YDGc7rEllw==", + "dev": true, + "requires": { + "@types/chai": "*" + } + }, + "@types/connect": { + "version": "3.4.35", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", + "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", + "requires": { + "@types/node": "*" + } + }, + "@types/express": { + "version": "4.17.17", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.17.tgz", + "integrity": "sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==", + "requires": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "@types/express-serve-static-core": { + "version": "4.17.35", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.35.tgz", + "integrity": "sha512-wALWQwrgiB2AWTT91CB62b6Yt0sNHpznUXeZEcnPU3DRdlDIz74x8Qg1UUYKSVFi+va5vKOLYRBI1bRKiLLKIg==", + "requires": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "@types/http-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-/K3ds8TRAfBvi5vfjuz8y6+GiAYBZ0x4tXv1Av6CWBWn0IlADc+ZX9pMq7oU0fNQPnBwIZl3rmeLp6SBApbxSQ==" + }, + "@types/istanbul-lib-coverage": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", + "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", + "dev": true + }, + "@types/long": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz", + "integrity": "sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==" + }, + "@types/mime": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", + "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==" + }, + "@types/node": { + "version": "18.15.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.9.tgz", + "integrity": "sha512-dUxhiNzBLr6IqlZXz6e/rN2YQXlFgOei/Dxy+e3cyXTJ4txSUbGT2/fmnD6zd/75jDMeW5bDee+YXxlFKHoV0A==" + }, + "@types/qs": { + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==" + }, + "@types/range-parser": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", + "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==" + }, + "@types/send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.1.tgz", + "integrity": "sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q==", + "requires": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "@types/serve-static": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.2.tgz", + "integrity": "sha512-J2LqtvFYCzaj8pVYKw8klQXrLLk7TBZmQ4ShlcdkELFKGwGMfevMLneMMRkMgZxotOD9wg497LpC7O8PcvAmfw==", + "requires": { + "@types/http-errors": "*", + "@types/mime": "*", + "@types/node": "*" + } + }, + "@vitest/coverage-c8": { + "version": "0.33.0", + "resolved": "https://registry.npmjs.org/@vitest/coverage-c8/-/coverage-c8-0.33.0.tgz", + "integrity": "sha512-DaF1zJz4dcOZS4k/neiQJokmOWqsGXwhthfmUdPGorXIQHjdPvV6JQSYhQDI41MyI8c+IieQUdIDs5XAMHtDDw==", + "dev": true, + "requires": { + "@ampproject/remapping": "^2.2.1", + "c8": "^7.14.0", + "magic-string": "^0.30.1", + "picocolors": "^1.0.0", + "std-env": "^3.3.3" + } + }, + "@vitest/expect": { + "version": "0.33.0", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-0.33.0.tgz", + "integrity": "sha512-sVNf+Gla3mhTCxNJx+wJLDPp/WcstOe0Ksqz4Vec51MmgMth/ia0MGFEkIZmVGeTL5HtjYR4Wl/ZxBxBXZJTzQ==", + "dev": true, + "requires": { + "@vitest/spy": "0.33.0", + "@vitest/utils": "0.33.0", + "chai": "^4.3.7" + } + }, + "@vitest/runner": { + "version": "0.33.0", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-0.33.0.tgz", + "integrity": "sha512-UPfACnmCB6HKRHTlcgCoBh6ppl6fDn+J/xR8dTufWiKt/74Y9bHci5CKB8tESSV82zKYtkBJo9whU3mNvfaisg==", + "dev": true, + "requires": { + "@vitest/utils": "0.33.0", + "p-limit": "^4.0.0", + "pathe": "^1.1.1" + }, + "dependencies": { + "p-limit": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", + "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", + "dev": true, + "requires": { + "yocto-queue": "^1.0.0" + } + }, + "yocto-queue": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", + "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", + "dev": true + } + } + }, + "@vitest/snapshot": { + "version": "0.33.0", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-0.33.0.tgz", + "integrity": "sha512-tJjrl//qAHbyHajpFvr8Wsk8DIOODEebTu7pgBrP07iOepR5jYkLFiqLq2Ltxv+r0uptUb4izv1J8XBOwKkVYA==", + "dev": true, + "requires": { + "magic-string": "^0.30.1", + "pathe": "^1.1.1", + "pretty-format": "^29.5.0" + } + }, + "@vitest/spy": { + "version": "0.33.0", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-0.33.0.tgz", + "integrity": "sha512-Kv+yZ4hnH1WdiAkPUQTpRxW8kGtH8VRTnus7ZTGovFYM1ZezJpvGtb9nPIjPnptHbsyIAxYZsEpVPYgtpjGnrg==", + "dev": true, + "requires": { + "tinyspy": "^2.1.1" + } + }, + "@vitest/utils": { + "version": "0.33.0", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-0.33.0.tgz", + "integrity": "sha512-pF1w22ic965sv+EN6uoePkAOTkAPWM03Ri/jXNyMIKBb/XHLDPfhLvf/Fa9g0YECevAIz56oVYXhodLvLQ/awA==", + "dev": true, + "requires": { + "diff-sequences": "^29.4.3", + "loupe": "^2.3.6", + "pretty-format": "^29.5.0" + } + }, + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true + }, + "accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "requires": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + } + }, + "acorn": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", + "dev": true + }, + "acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "dev": true + }, + "agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "requires": { + "debug": "4" + } + }, + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "aproba": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", + "dev": true + }, + "are-we-there-yet": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", + "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", + "dev": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + } + }, + "arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true + }, + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" + }, + "array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true + }, + "assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", + "dev": true + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "dev": true + }, + "axios": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.4.0.tgz", + "integrity": "sha512-S4XCWMEmzvo64T9GfvQDOXgYRDJ/wsSZc7Jvdgx5u1sd0JwsuPLqb3SYmusag+edF6ziyMensPVqLTSc1PiSEA==", + "requires": { + "follow-redirects": "^1.15.0", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true + }, + "binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true + }, + "bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dev": true, + "requires": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "body-parser": { + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", + "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", + "requires": { + "bytes": "3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + } + } + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" + }, + "c8": { + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/c8/-/c8-7.14.0.tgz", + "integrity": "sha512-i04rtkkcNcCf7zsQcSv/T9EbUn4RXQ6mropeMcjFOsQXQ0iGLAr/xT6TImQg4+U9hmNpN9XdvPkjUL1IzbgxJw==", + "dev": true, + "requires": { + "@bcoe/v8-coverage": "^0.2.3", + "@istanbuljs/schema": "^0.1.3", + "find-up": "^5.0.0", + "foreground-child": "^2.0.0", + "istanbul-lib-coverage": "^3.2.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-reports": "^3.1.4", + "rimraf": "^3.0.2", + "test-exclude": "^6.0.0", + "v8-to-istanbul": "^9.0.0", + "yargs": "^16.2.0", + "yargs-parser": "^20.2.9" + } + }, + "cac": { + "version": "6.7.14", + "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", + "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", + "dev": true + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "chai": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.7.tgz", + "integrity": "sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==", + "dev": true, + "requires": { + "assertion-error": "^1.1.0", + "check-error": "^1.0.2", + "deep-eql": "^4.1.2", + "get-func-name": "^2.0.0", + "loupe": "^2.3.1", + "pathval": "^1.1.1", + "type-detect": "^4.0.5" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "check-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", + "integrity": "sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==", + "dev": true + }, + "chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "requires": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "fsevents": "~2.3.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + } + }, + "chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "dev": true + }, + "cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "dev": true + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", + "dev": true + }, + "content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "requires": { + "safe-buffer": "5.2.1" + } + }, + "content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==" + }, + "convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true + }, + "cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==" + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" + }, + "core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "dev": true + }, + "create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "dev": true, + "requires": { + "mimic-response": "^3.1.0" + } + }, + "deep-eql": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz", + "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==", + "dev": true, + "requires": { + "type-detect": "^4.0.0" + } + }, + "deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "dev": true + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" + }, + "delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", + "dev": true + }, + "depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" + }, + "destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==" + }, + "detect-libc": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz", + "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==", + "dev": true + }, + "diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true + }, + "diff-sequences": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.4.3.tgz", + "integrity": "sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA==", + "dev": true + }, + "dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "requires": { + "path-type": "^4.0.0" + } + }, + "dotenv": { + "version": "16.3.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.3.1.tgz", + "integrity": "sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==" + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==" + }, + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "requires": { + "once": "^1.4.0" + } + }, + "esbuild": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.19.tgz", + "integrity": "sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==", + "dev": true, + "requires": { + "@esbuild/android-arm": "0.17.19", + "@esbuild/android-arm64": "0.17.19", + "@esbuild/android-x64": "0.17.19", + "@esbuild/darwin-arm64": "0.17.19", + "@esbuild/darwin-x64": "0.17.19", + "@esbuild/freebsd-arm64": "0.17.19", + "@esbuild/freebsd-x64": "0.17.19", + "@esbuild/linux-arm": "0.17.19", + "@esbuild/linux-arm64": "0.17.19", + "@esbuild/linux-ia32": "0.17.19", + "@esbuild/linux-loong64": "0.17.19", + "@esbuild/linux-mips64el": "0.17.19", + "@esbuild/linux-ppc64": "0.17.19", + "@esbuild/linux-riscv64": "0.17.19", + "@esbuild/linux-s390x": "0.17.19", + "@esbuild/linux-x64": "0.17.19", + "@esbuild/netbsd-x64": "0.17.19", + "@esbuild/openbsd-x64": "0.17.19", + "@esbuild/sunos-x64": "0.17.19", + "@esbuild/win32-arm64": "0.17.19", + "@esbuild/win32-ia32": "0.17.19", + "@esbuild/win32-x64": "0.17.19" + } + }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==" + }, + "expand-template": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", + "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", + "dev": true + }, + "express": { + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "requires": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.1", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.5.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "dependencies": { + "body-parser": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "requires": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + } + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "raw-body": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "requires": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + } + } + } + }, + "fast-glob": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.0.tgz", + "integrity": "sha512-ChDuvbOypPuNjO8yIDf36x7BlZX1smcUMTTcyoIjycexOxd6DFsKsg21qVBzEmr3G7fUKIRy2/psii+CIUt7FA==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + } + }, + "fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "dev": true, + "requires": { + "reusify": "^1.0.4" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + } + } + }, + "find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "requires": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + } + }, + "follow-redirects": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==" + }, + "foreground-child": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", + "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.0", + "signal-exit": "^3.0.2" + } + }, + "form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + }, + "forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==" + }, + "from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "dev": true + }, + "fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "requires": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dev": true, + "requires": { + "minipass": "^3.0.0" + }, + "dependencies": { + "minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + } + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "optional": true + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "gauge": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", + "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", + "dev": true, + "requires": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.2", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.1", + "object-assign": "^4.1.1", + "signal-exit": "^3.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.2" + } + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" + }, + "get-func-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", + "integrity": "sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==", + "dev": true + }, + "get-intrinsic": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" + } + }, + "github-from-package": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", + "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==", + "dev": true + }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "requires": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + } + }, + "globrex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz", + "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==", + "dev": true + }, + "google-protobuf": { + "version": "3.21.2", + "resolved": "https://registry.npmjs.org/google-protobuf/-/google-protobuf-3.21.2.tgz", + "integrity": "sha512-3MSOYFO5U9mPGikIYCzK0SaThypfGgS6bHqrUGXG3DPHCrb+txNqeEcns1W0lkGfk0rCyNXm7xB9rMxnCiZOoA==" + }, + "graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true + }, + "grpc-server-reflection": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/grpc-server-reflection/-/grpc-server-reflection-0.1.5.tgz", + "integrity": "sha512-i69RYu6v65enzknNAPUgerFuVQfo+L3n9g4c1A/Sv5jUHMpxMIjSbBA+YWls9Sr4Flac4oohp4Gx8f389CaHuw==", + "requires": { + "google-protobuf": "^3.19.1" + } + }, + "grpc-tools": { + "version": "1.12.4", + "resolved": "https://registry.npmjs.org/grpc-tools/-/grpc-tools-1.12.4.tgz", + "integrity": "sha512-5+mLAJJma3BjnW/KQp6JBjUMgvu7Mu3dBvBPd1dcbNIb+qiR0817zDpgPjS7gRb+l/8EVNIa3cB02xI9JLToKg==", + "dev": true, + "requires": { + "@mapbox/node-pre-gyp": "^1.0.5" + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==" + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" + }, + "has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", + "dev": true + }, + "html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, + "http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "requires": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + } + }, + "https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dev": true, + "requires": { + "agent-base": "6", + "debug": "4" + } + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true + }, + "ignore": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "dev": true + }, + "ignore-by-default": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", + "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true + }, + "into-stream": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/into-stream/-/into-stream-6.0.0.tgz", + "integrity": "sha512-XHbaOAvP+uFKUFsOgoNPRjLkwB+I22JFPFe5OjTkQ0nwgj6+pSjb4NmB6VMxaPshLiOf+zcpOCBQuLwC1KHhZA==", + "dev": true, + "requires": { + "from2": "^2.3.0", + "p-is-promise": "^3.0.0" + } + }, + "ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-core-module": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz", + "integrity": "sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" + }, + "is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "istanbul-lib-coverage": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", + "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", + "dev": true + }, + "istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "dev": true, + "requires": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" + } + }, + "istanbul-reports": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", + "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", + "dev": true, + "requires": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + } + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true + }, + "json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true + }, + "jsonc-parser": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", + "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", + "dev": true + }, + "jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" + } + }, + "local-pkg": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.4.3.tgz", + "integrity": "sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==", + "dev": true + }, + "locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "requires": { + "p-locate": "^5.0.0" + } + }, + "lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==" + }, + "long": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", + "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" + }, + "loupe": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.6.tgz", + "integrity": "sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==", + "dev": true, + "requires": { + "get-func-name": "^2.0.0" + } + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "magic-string": { + "version": "0.30.1", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.1.tgz", + "integrity": "sha512-mbVKXPmS0z0G4XqFDCTllmDQ6coZzn94aMlb0o/A4HEHJCKcanlDZwYJgwnkmgD3jyWhUgj9VsPrfd972yPffA==", + "dev": true, + "requires": { + "@jridgewell/sourcemap-codec": "^1.4.15" + } + }, + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "requires": { + "semver": "^6.0.0" + }, + "dependencies": { + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true + } + } + }, + "make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==" + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" + }, + "merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==" + }, + "micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "requires": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + } + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" + }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "requires": { + "mime-db": "1.52.0" + } + }, + "mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "dev": true + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true + }, + "minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "dev": true + }, + "minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dev": true, + "requires": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "dependencies": { + "minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + } + } + }, + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true + }, + "mkdirp-classic": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", + "dev": true + }, + "mlly": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.4.0.tgz", + "integrity": "sha512-ua8PAThnTwpprIaU47EPeZ/bPUVp2QYBbWMphUQpVdBI3Lgqzm5KZQ45Agm3YJedHXaIHl6pBGabaLSUPPSptg==", + "dev": true, + "requires": { + "acorn": "^8.9.0", + "pathe": "^1.1.1", + "pkg-types": "^1.0.3", + "ufo": "^1.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "multistream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/multistream/-/multistream-4.1.0.tgz", + "integrity": "sha512-J1XDiAmmNpRCBfIWJv+n0ymC4ABcf/Pl+5YvC5B/D2f/2+8PtHvCNxMPKiQcZyi922Hq69J2YOpb1pTywfifyw==", + "dev": true, + "requires": { + "once": "^1.4.0", + "readable-stream": "^3.6.0" + } + }, + "nanoid": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", + "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "dev": true + }, + "napi-build-utils": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", + "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==", + "dev": true + }, + "negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==" + }, + "node-abi": { + "version": "3.45.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.45.0.tgz", + "integrity": "sha512-iwXuFrMAcFVi/ZoZiqq8BzAdsLw9kxDfTC0HMyjXfSL/6CSDAGD5UmR7azrAgWV1zKYq7dUUMj4owusBWKLsiQ==", + "dev": true, + "requires": { + "semver": "^7.3.5" + } + }, + "node-fetch": { + "version": "2.6.12", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.12.tgz", + "integrity": "sha512-C/fGU2E8ToujUivIO0H+tpQ6HWo4eEmchoPIoXtxCrVghxdKq+QOHqEZW7tuP3KlV3bC8FRMO5nMCC7Zm1VP6g==", + "dev": true, + "requires": { + "whatwg-url": "^5.0.0" + } + }, + "nodemon": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.0.1.tgz", + "integrity": "sha512-g9AZ7HmkhQkqXkRc20w+ZfQ73cHLbE8hnPbtaFbFtCumZsjyMhKk9LajQ07U5Ux28lvFjZ5X7HvWR1xzU8jHVw==", + "dev": true, + "requires": { + "chokidar": "^3.5.2", + "debug": "^3.2.7", + "ignore-by-default": "^1.0.1", + "minimatch": "^3.1.2", + "pstree.remy": "^1.1.8", + "semver": "^7.5.3", + "simple-update-notifier": "^2.0.0", + "supports-color": "^5.5.0", + "touch": "^3.1.0", + "undefsafe": "^2.0.5" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "dev": true, + "requires": { + "abbrev": "1" + } + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, + "npmlog": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", + "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", + "dev": true, + "requires": { + "are-we-there-yet": "^2.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^3.0.0", + "set-blocking": "^2.0.0" + } + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true + }, + "object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==" + }, + "on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "requires": { + "ee-first": "1.1.1" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "p-is-promise": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-3.0.0.tgz", + "integrity": "sha512-Wo8VsW4IRQSKVXsJCn7TomUaVtyfjVDn3nUP7kE967BQk0CwFpdbZs0X0uk5sW9mkBa9eNM7hCMaG93WUAwxYQ==", + "dev": true + }, + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "requires": { + "yocto-queue": "^0.1.0" + } + }, + "p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "requires": { + "p-limit": "^3.0.2" + } + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" + }, + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true + }, + "pathe": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.1.tgz", + "integrity": "sha512-d+RQGp0MAYTIaDBIMmOfMwz3E+LOZnxx1HZd5R18mmCZY0QBlK0LDZfPc8FW8Ed2DlvsuE6PRjroDY+wg4+j/Q==", + "dev": true + }, + "pathval": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", + "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", + "dev": true + }, + "picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true + }, + "pkg": { + "version": "5.8.1", + "resolved": "https://registry.npmjs.org/pkg/-/pkg-5.8.1.tgz", + "integrity": "sha512-CjBWtFStCfIiT4Bde9QpJy0KeH19jCfwZRJqHFDFXfhUklCx8JoFmMj3wgnEYIwGmZVNkhsStPHEOnrtrQhEXA==", + "dev": true, + "requires": { + "@babel/generator": "7.18.2", + "@babel/parser": "7.18.4", + "@babel/types": "7.19.0", + "chalk": "^4.1.2", + "fs-extra": "^9.1.0", + "globby": "^11.1.0", + "into-stream": "^6.0.0", + "is-core-module": "2.9.0", + "minimist": "^1.2.6", + "multistream": "^4.1.0", + "pkg-fetch": "3.4.2", + "prebuild-install": "7.1.1", + "resolve": "^1.22.0", + "stream-meter": "^1.0.4" + } + }, + "pkg-fetch": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/pkg-fetch/-/pkg-fetch-3.4.2.tgz", + "integrity": "sha512-0+uijmzYcnhC0hStDjm/cl2VYdrmVVBpe7Q8k9YBojxmR5tG8mvR9/nooQq3QSXiQqORDVOTY3XqMEqJVIzkHA==", + "dev": true, + "requires": { + "chalk": "^4.1.2", + "fs-extra": "^9.1.0", + "https-proxy-agent": "^5.0.0", + "node-fetch": "^2.6.6", + "progress": "^2.0.3", + "semver": "^7.3.5", + "tar-fs": "^2.1.1", + "yargs": "^16.2.0" + } + }, + "pkg-types": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.0.3.tgz", + "integrity": "sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==", + "dev": true, + "requires": { + "jsonc-parser": "^3.2.0", + "mlly": "^1.2.0", + "pathe": "^1.1.0" + } + }, + "postcss": { + "version": "8.4.26", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.26.tgz", + "integrity": "sha512-jrXHFF8iTloAenySjM/ob3gSj7pCu0Ji49hnjqzsgSRa50hkWCKD0HQ+gMNJkW38jBI68MpAAg7ZWwHwX8NMMw==", + "dev": true, + "requires": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + } + }, + "prebuild-install": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.1.tgz", + "integrity": "sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==", + "dev": true, + "requires": { + "detect-libc": "^2.0.0", + "expand-template": "^2.0.3", + "github-from-package": "0.0.0", + "minimist": "^1.2.3", + "mkdirp-classic": "^0.5.3", + "napi-build-utils": "^1.0.1", + "node-abi": "^3.3.0", + "pump": "^3.0.0", + "rc": "^1.2.7", + "simple-get": "^4.0.0", + "tar-fs": "^2.0.0", + "tunnel-agent": "^0.6.0" + } + }, + "pretty-format": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.1.tgz", + "integrity": "sha512-7jRj+yXO0W7e4/tSJKoR7HRIHLPPjtNaUGG2xxKQnGvPNRkgWcQ0AZX6P4KBRJN4FcTBWb3sa7DVUJmocYuoog==", + "dev": true, + "requires": { + "@jest/schemas": "^29.6.0", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true + } + } + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true + }, + "protobufjs": { + "version": "7.2.4", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.2.4.tgz", + "integrity": "sha512-AT+RJgD2sH8phPmCf7OUZR8xGdcJRga4+1cOaXJ64hvcSkVhNcRHOwIxUatPH15+nj59WAGTDv3LSGZPEQbJaQ==", + "requires": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/node": ">=13.7.0", + "long": "^5.0.0" + }, + "dependencies": { + "long": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", + "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==" + } + } + }, + "proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "requires": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + } + }, + "proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, + "pstree.remy": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", + "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", + "dev": true + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "requires": { + "side-channel": "^1.0.4" + } + }, + "queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true + }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" + }, + "raw-body": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "requires": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + } + }, + "rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dev": true, + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + } + }, + "react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", + "dev": true + }, + "readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "requires": { + "picomatch": "^2.2.1" + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==" + }, + "resolve": { + "version": "1.22.2", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", + "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", + "dev": true, + "requires": { + "is-core-module": "^2.11.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "dependencies": { + "is-core-module": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz", + "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + } + } + }, + "reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "rollup": { + "version": "3.26.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.26.2.tgz", + "integrity": "sha512-6umBIGVz93er97pMgQO08LuH3m6PUb3jlDUUGFsNJB6VgTCUaDFpupf5JfU30529m/UKOgmiX+uY6Sx8cOYpLA==", + "dev": true, + "requires": { + "fsevents": "~2.3.2" + } + }, + "run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "requires": { + "queue-microtask": "^1.2.2" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "requires": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + }, + "dependencies": { + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + } + } + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + } + } + }, + "serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + } + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "dev": true + }, + "setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, + "siginfo": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", + "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", + "dev": true + }, + "signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "simple-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", + "dev": true + }, + "simple-get": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", + "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", + "dev": true, + "requires": { + "decompress-response": "^6.0.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } + }, + "simple-update-notifier": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", + "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==", + "dev": true, + "requires": { + "semver": "^7.5.3" + } + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true + }, + "source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "dev": true + }, + "stackback": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", + "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", + "dev": true + }, + "statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" + }, + "std-env": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.3.3.tgz", + "integrity": "sha512-Rz6yejtVyWnVjC1RFvNmYL10kgjC49EOghxWn0RFqlCHGFpQx+Xe7yW3I4ceK1SGrWIGMjD5Kbue8W/udkbMJg==", + "dev": true + }, + "stream-meter": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/stream-meter/-/stream-meter-1.0.4.tgz", + "integrity": "sha512-4sOEtrbgFotXwnEuzzsQBYEV1elAeFSO8rSGeTwabuX1RRn/kEq9JVH7I0MRBhKVRR0sJkr0M0QCH7yOLf9fhQ==", + "dev": true, + "requires": { + "readable-stream": "^2.1.4" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "requires": { + "safe-buffer": "~5.2.0" + } + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true + }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "dev": true + }, + "strip-literal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-1.0.1.tgz", + "integrity": "sha512-QZTsipNpa2Ppr6v1AmJHESqJ3Uz247MUS0OjrnnZjFAvEoWqxuyFuXn2xLgMtRnijJShAa1HL0gtJyUs7u7n3Q==", + "dev": true, + "requires": { + "acorn": "^8.8.2" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true + }, + "tar": { + "version": "6.1.15", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.15.tgz", + "integrity": "sha512-/zKt9UyngnxIT/EAGYuxaMYgOIJiP81ab9ZfkILq4oNLPFX50qyYmu7jRj9qeXoxmJHjGlbH0+cm2uy1WCs10A==", + "dev": true, + "requires": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + } + }, + "tar-fs": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", + "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", + "dev": true, + "requires": { + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.1.4" + }, + "dependencies": { + "chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "dev": true + } + } + }, + "tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "dev": true, + "requires": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + } + }, + "test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "requires": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + } + }, + "tinybench": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.5.0.tgz", + "integrity": "sha512-kRwSG8Zx4tjF9ZiyH4bhaebu+EDz1BOx9hOigYHlUW4xxI/wKIUQUqo018UlU4ar6ATPBsaMrdbKZ+tmPdohFA==", + "dev": true + }, + "tinypool": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-0.6.0.tgz", + "integrity": "sha512-FdswUUo5SxRizcBc6b1GSuLpLjisa8N8qMyYoP3rl+bym+QauhtJP5bvZY1ytt8krKGmMLYIRl36HBZfeAoqhQ==", + "dev": true + }, + "tinyspy": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-2.1.1.tgz", + "integrity": "sha512-XPJL2uSzcOyBMky6OFrusqWlzfFrXtE0hPuMgW8A2HmaqrPo4ZQHRN/V0QXN3FSjKxpsbRrFc5LI7KOwBsT1/w==", + "dev": true + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "dev": true + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + }, + "toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" + }, + "touch": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", + "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", + "dev": true, + "requires": { + "nopt": "~1.0.10" + }, + "dependencies": { + "nopt": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", + "integrity": "sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==", + "dev": true, + "requires": { + "abbrev": "1" + } + } + } + }, + "tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "dev": true + }, + "ts-essentials": { + "version": "9.3.2", + "resolved": "https://registry.npmjs.org/ts-essentials/-/ts-essentials-9.3.2.tgz", + "integrity": "sha512-JxKJzuWqH1MmH4ZFHtJzGEhkfN3QvVR3C3w+4BIoWeoY68UVVoA2Np/Bca9z0IPSErVCWhv439aT0We4Dks8kQ==", + "dev": true, + "requires": {} + }, + "ts-node": { + "version": "10.9.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", + "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", + "dev": true, + "requires": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + } + }, + "tsconfck": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/tsconfck/-/tsconfck-2.1.1.tgz", + "integrity": "sha512-ZPCkJBKASZBmBUNqGHmRhdhM8pJYDdOXp4nRgj/O0JwUwsMq50lCDRQP/M5GBNAA0elPrq4gAeu4dkaVCuKWww==", + "dev": true, + "requires": {} + }, + "tsconfig-paths": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", + "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==", + "dev": true, + "requires": { + "json5": "^2.2.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "dev": true, + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true + }, + "type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } + }, + "typescript": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.2.tgz", + "integrity": "sha512-wVORMBGO/FAs/++blGNeAVdbNKtIh1rbBL2EyQ1+J9lClJ93KiiKe8PmFIVdXhHcyv44SL9oglmfeSsndo0jRw==", + "dev": true + }, + "ufo": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.1.2.tgz", + "integrity": "sha512-TrY6DsjTQQgyS3E3dBaOXf0TpPD8u9FVrVYmKVegJuFw51n/YB9XPt+U6ydzFG5ZIN7+DIjPbNmXoBj9esYhgQ==", + "dev": true + }, + "undefsafe": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", + "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", + "dev": true + }, + "universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==" + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==" + }, + "v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true + }, + "v8-to-istanbul": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.1.0.tgz", + "integrity": "sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA==", + "dev": true, + "requires": { + "@jridgewell/trace-mapping": "^0.3.12", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^1.6.0" + } + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==" + }, + "vite": { + "version": "4.4.4", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.4.4.tgz", + "integrity": "sha512-4mvsTxjkveWrKDJI70QmelfVqTm+ihFAb6+xf4sjEU2TmUCTlVX87tmg/QooPEMQb/lM9qGHT99ebqPziEd3wg==", + "dev": true, + "requires": { + "esbuild": "^0.18.10", + "fsevents": "~2.3.2", + "postcss": "^8.4.25", + "rollup": "^3.25.2" + }, + "dependencies": { + "@esbuild/android-arm": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.12.tgz", + "integrity": "sha512-LIxaNIQfkFZbTLb4+cX7dozHlAbAshhFE5PKdro0l+FnCpx1GDJaQ2WMcqm+ToXKMt8p8Uojk/MFRuGyz3V5Sw==", + "dev": true, + "optional": true + }, + "@esbuild/android-arm64": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.12.tgz", + "integrity": "sha512-BMAlczRqC/LUt2P97E4apTBbkvS9JTJnp2DKFbCwpZ8vBvXVbNdqmvzW/OsdtI/+mGr+apkkpqGM8WecLkPgrA==", + "dev": true, + "optional": true + }, + "@esbuild/android-x64": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.12.tgz", + "integrity": "sha512-zU5MyluNsykf5cOJ0LZZZjgAHbhPJ1cWfdH1ZXVMXxVMhEV0VZiZXQdwBBVvmvbF28EizeK7obG9fs+fpmS0eQ==", + "dev": true, + "optional": true + }, + "@esbuild/darwin-arm64": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.12.tgz", + "integrity": "sha512-zUZMep7YONnp6954QOOwEBwFX9svlKd3ov6PkxKd53LGTHsp/gy7vHaPGhhjBmEpqXEXShi6dddjIkmd+NgMsA==", + "dev": true, + "optional": true + }, + "@esbuild/darwin-x64": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.12.tgz", + "integrity": "sha512-ohqLPc7i67yunArPj1+/FeeJ7AgwAjHqKZ512ADk3WsE3FHU9l+m5aa7NdxXr0HmN1bjDlUslBjWNbFlD9y12Q==", + "dev": true, + "optional": true + }, + "@esbuild/freebsd-arm64": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.12.tgz", + "integrity": "sha512-GIIHtQXqgeOOqdG16a/A9N28GpkvjJnjYMhOnXVbn3EDJcoItdR58v/pGN31CHjyXDc8uCcRnFWmqaJt24AYJg==", + "dev": true, + "optional": true + }, + "@esbuild/freebsd-x64": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.12.tgz", + "integrity": "sha512-zK0b9a1/0wZY+6FdOS3BpZcPc1kcx2G5yxxfEJtEUzVxI6n/FrC2Phsxj/YblPuBchhBZ/1wwn7AyEBUyNSa6g==", + "dev": true, + "optional": true + }, + "@esbuild/linux-arm": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.12.tgz", + "integrity": "sha512-y75OijvrBE/1XRrXq1jtrJfG26eHeMoqLJ2dwQNwviwTuTtHGCojsDO6BJNF8gU+3jTn1KzJEMETytwsFSvc+Q==", + "dev": true, + "optional": true + }, + "@esbuild/linux-arm64": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.12.tgz", + "integrity": "sha512-JKgG8Q/LL/9sw/iHHxQyVMoQYu3rU3+a5Z87DxC+wAu3engz+EmctIrV+FGOgI6gWG1z1+5nDDbXiRMGQZXqiw==", + "dev": true, + "optional": true + }, + "@esbuild/linux-ia32": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.12.tgz", + "integrity": "sha512-yoRIAqc0B4lDIAAEFEIu9ttTRFV84iuAl0KNCN6MhKLxNPfzwCBvEMgwco2f71GxmpBcTtn7KdErueZaM2rEvw==", + "dev": true, + "optional": true + }, + "@esbuild/linux-loong64": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.12.tgz", + "integrity": "sha512-qYgt3dHPVvf/MgbIBpJ4Sup/yb9DAopZ3a2JgMpNKIHUpOdnJ2eHBo/aQdnd8dJ21X/+sS58wxHtA9lEazYtXQ==", + "dev": true, + "optional": true + }, + "@esbuild/linux-mips64el": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.12.tgz", + "integrity": "sha512-wHphlMLK4ufNOONqukELfVIbnGQJrHJ/mxZMMrP2jYrPgCRZhOtf0kC4yAXBwnfmULimV1qt5UJJOw4Kh13Yfg==", + "dev": true, + "optional": true + }, + "@esbuild/linux-ppc64": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.12.tgz", + "integrity": "sha512-TeN//1Ft20ZZW41+zDSdOI/Os1bEq5dbvBvYkberB7PHABbRcsteeoNVZFlI0YLpGdlBqohEpjrn06kv8heCJg==", + "dev": true, + "optional": true + }, + "@esbuild/linux-riscv64": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.12.tgz", + "integrity": "sha512-AgUebVS4DoAblBgiB2ACQ/8l4eGE5aWBb8ZXtkXHiET9mbj7GuWt3OnsIW/zX+XHJt2RYJZctbQ2S/mDjbp0UA==", + "dev": true, + "optional": true + }, + "@esbuild/linux-s390x": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.12.tgz", + "integrity": "sha512-dJ3Rb3Ei2u/ysSXd6pzleGtfDdc2MuzKt8qc6ls8vreP1G3B7HInX3i7gXS4BGeVd24pp0yqyS7bJ5NHaI9ing==", + "dev": true, + "optional": true + }, + "@esbuild/linux-x64": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.12.tgz", + "integrity": "sha512-OrNJMGQbPaVyHHcDF8ybNSwu7TDOfX8NGpXCbetwOSP6txOJiWlgQnRymfC9ocR1S0Y5PW0Wb1mV6pUddqmvmQ==", + "dev": true, + "optional": true + }, + "@esbuild/netbsd-x64": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.12.tgz", + "integrity": "sha512-55FzVCAiwE9FK8wWeCRuvjazNRJ1QqLCYGZVB6E8RuQuTeStSwotpSW4xoRGwp3a1wUsaVCdYcj5LGCASVJmMg==", + "dev": true, + "optional": true + }, + "@esbuild/openbsd-x64": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.12.tgz", + "integrity": "sha512-qnluf8rfb6Y5Lw2tirfK2quZOBbVqmwxut7GPCIJsM8lc4AEUj9L8y0YPdLaPK0TECt4IdyBdBD/KRFKorlK3g==", + "dev": true, + "optional": true + }, + "@esbuild/sunos-x64": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.12.tgz", + "integrity": "sha512-+RkKpVQR7bICjTOPUpkTBTaJ4TFqQBX5Ywyd/HSdDkQGn65VPkTsR/pL4AMvuMWy+wnXgIl4EY6q4mVpJal8Kg==", + "dev": true, + "optional": true + }, + "@esbuild/win32-arm64": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.12.tgz", + "integrity": "sha512-GNHuciv0mFM7ouzsU0+AwY+7eV4Mgo5WnbhfDCQGtpvOtD1vbOiRjPYG6dhmMoFyBjj+pNqQu2X+7DKn0KQ/Gw==", + "dev": true, + "optional": true + }, + "@esbuild/win32-ia32": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.12.tgz", + "integrity": "sha512-kR8cezhYipbbypGkaqCTWIeu4zID17gamC8YTPXYtcN3E5BhhtTnwKBn9I0PJur/T6UVwIEGYzkffNL0lFvxEw==", + "dev": true, + "optional": true + }, + "@esbuild/win32-x64": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.12.tgz", + "integrity": "sha512-O0UYQVkvfM/jO8a4OwoV0mAKSJw+mjWTAd1MJd/1FCX6uiMdLmMRPK/w6e9OQ0ob2WGxzIm9va/KG0Ja4zIOgg==", + "dev": true, + "optional": true + }, + "esbuild": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.12.tgz", + "integrity": "sha512-XuOVLDdtsDslXStStduT41op21Ytmf4/BDS46aa3xPJ7X5h2eMWBF1oAe3QjUH3bDksocNXgzGUZ7XHIBya6Tg==", + "dev": true, + "requires": { + "@esbuild/android-arm": "0.18.12", + "@esbuild/android-arm64": "0.18.12", + "@esbuild/android-x64": "0.18.12", + "@esbuild/darwin-arm64": "0.18.12", + "@esbuild/darwin-x64": "0.18.12", + "@esbuild/freebsd-arm64": "0.18.12", + "@esbuild/freebsd-x64": "0.18.12", + "@esbuild/linux-arm": "0.18.12", + "@esbuild/linux-arm64": "0.18.12", + "@esbuild/linux-ia32": "0.18.12", + "@esbuild/linux-loong64": "0.18.12", + "@esbuild/linux-mips64el": "0.18.12", + "@esbuild/linux-ppc64": "0.18.12", + "@esbuild/linux-riscv64": "0.18.12", + "@esbuild/linux-s390x": "0.18.12", + "@esbuild/linux-x64": "0.18.12", + "@esbuild/netbsd-x64": "0.18.12", + "@esbuild/openbsd-x64": "0.18.12", + "@esbuild/sunos-x64": "0.18.12", + "@esbuild/win32-arm64": "0.18.12", + "@esbuild/win32-ia32": "0.18.12", + "@esbuild/win32-x64": "0.18.12" + } + } + } + }, + "vite-node": { + "version": "0.33.0", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-0.33.0.tgz", + "integrity": "sha512-19FpHYbwWWxDr73ruNahC+vtEdza52kA90Qb3La98yZ0xULqV8A5JLNPUff0f5zID4984tW7l3DH2przTJUZSw==", + "dev": true, + "requires": { + "cac": "^6.7.14", + "debug": "^4.3.4", + "mlly": "^1.4.0", + "pathe": "^1.1.1", + "picocolors": "^1.0.0", + "vite": "^3.0.0 || ^4.0.0" + } + }, + "vite-tsconfig-paths": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/vite-tsconfig-paths/-/vite-tsconfig-paths-4.2.0.tgz", + "integrity": "sha512-jGpus0eUy5qbbMVGiTxCL1iB9ZGN6Bd37VGLJU39kTDD6ZfULTTb1bcc5IeTWqWJKiWV5YihCaibeASPiGi8kw==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "globrex": "^0.1.2", + "tsconfck": "^2.1.0" + } + }, + "vitest": { + "version": "0.33.0", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-0.33.0.tgz", + "integrity": "sha512-1CxaugJ50xskkQ0e969R/hW47za4YXDUfWJDxip1hwbnhUjYolpfUn2AMOulqG/Dtd9WYAtkHmM/m3yKVrEejQ==", + "dev": true, + "requires": { + "@types/chai": "^4.3.5", + "@types/chai-subset": "^1.3.3", + "@types/node": "*", + "@vitest/expect": "0.33.0", + "@vitest/runner": "0.33.0", + "@vitest/snapshot": "0.33.0", + "@vitest/spy": "0.33.0", + "@vitest/utils": "0.33.0", + "acorn": "^8.9.0", + "acorn-walk": "^8.2.0", + "cac": "^6.7.14", + "chai": "^4.3.7", + "debug": "^4.3.4", + "local-pkg": "^0.4.3", + "magic-string": "^0.30.1", + "pathe": "^1.1.1", + "picocolors": "^1.0.0", + "std-env": "^3.3.3", + "strip-literal": "^1.0.1", + "tinybench": "^2.5.0", + "tinypool": "^0.6.0", + "vite": "^3.0.0 || ^4.0.0", + "vite-node": "0.33.0", + "why-is-node-running": "^2.2.2" + } + }, + "vitest-mock-extended": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/vitest-mock-extended/-/vitest-mock-extended-1.1.4.tgz", + "integrity": "sha512-MKPdepFjk0CE7Ocb5txntHK/sloHO9s0Kk9dr630uL03shRSHMkZtSs5CBPsbJ8K/CvYLv0GHUmMt2zWks2eXg==", + "dev": true, + "requires": { + "ts-essentials": "^9.3.2" + } + }, + "webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "dev": true + }, + "whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dev": true, + "requires": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "why-is-node-running": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.2.2.tgz", + "integrity": "sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==", + "dev": true, + "requires": { + "siginfo": "^2.0.0", + "stackback": "0.0.2" + } + }, + "wide-align": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", + "dev": true, + "requires": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, + "wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==" + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "requires": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + } + }, + "yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==" + }, + "yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true + }, + "yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true + } + } +} diff --git a/services/gateway/package.json b/services/gateway/package.json new file mode 100644 index 00000000..8cec896d --- /dev/null +++ b/services/gateway/package.json @@ -0,0 +1,54 @@ +{ + "name": "@goodfood/gateway", + "bin": "dist/index.js", + "version": "1.0.0", + "scripts": { + "start": "node dist/index.js", + "dev": "nodemon --watch 'src/**/*.ts' --exec 'ts-node' src/server.ts", + "build": "esbuild src/server.ts --bundle --platform=node --target=node18 --outfile=dist/index.js", + "test": "vitest", + "coverage": "vitest --coverage", + "pkg": "pkg ." + }, + "dependencies": { + "@grpc/grpc-js": "1.8.14", + "@grpc/proto-loader": "0.7.6", + "@types/express": "^4.17.17", + "axios": "^1.4.0", + "body-parser": "^1.20.2", + "dotenv": "^16.0.3", + "express": "^4.18.2", + "grpc-server-reflection": "^0.1.5", + "protobufjs": "^7.2.4" + }, + "devDependencies": { + "@types/amqplib": "^0.10.1", + "@types/node": "^18.15.9", + "@vitest/coverage-c8": "^0.33.0", + "esbuild": "^0.17.18", + "grpc-tools": "^1.12.4", + "nodemon": "^3.0.1", + "pkg": "^5.8.1", + "ts-node": "10.9.1", + "tsconfig-paths": "^4.2.0", + "typescript": "5.0.2", + "vite-tsconfig-paths": "^4.2.0", + "vitest": "^0.33.0", + "vitest-mock-extended": "^1.1.4" + }, + "pkg": { + "scripts": "./src/dist/index.js", + "assets": [ + "../proto/**/*" + ], + "targets": [ + "node18-macos-arm64", + "node18-linux-x64", + "node18-linux-arm64" + ], + "outputPath": "bin/" + }, + "keywords": [], + "author": "", + "license": "ISC" +} diff --git a/services/gateway/proto b/services/gateway/proto new file mode 120000 index 00000000..4d1e2d8b --- /dev/null +++ b/services/gateway/proto @@ -0,0 +1 @@ +../proto/ \ No newline at end of file diff --git a/services/gateway/src/index.ts b/services/gateway/src/index.ts new file mode 100644 index 00000000..4bb2a14d --- /dev/null +++ b/services/gateway/src/index.ts @@ -0,0 +1,17 @@ +import {Request, Response} from "express"; + +const express = require('express'); +const bodyParser = require('body-parser'); + +const app = express(); +app.use(bodyParser.json()); + +const PORT = process.env.PORT || 50000; + +app.get('/', (req: Request, res: Response) => { + res.send('Node.js API Gateway is up and running!'); +}); + +app.listen(PORT, () => { + console.log(`API Gateway is running on port ${PORT}`); +}); \ No newline at end of file diff --git a/services/gateway/tsconfig.json b/services/gateway/tsconfig.json new file mode 100644 index 00000000..f7f47ecc --- /dev/null +++ b/services/gateway/tsconfig.json @@ -0,0 +1,18 @@ +{ + "compilerOptions": { + "sourceMap": true, + "outDir": "dist", + "strict": true, + "lib": ["esnext"], + "esModuleInterop": true, + "baseUrl": ".", + "paths": { + "@order/*": ["src/*"] + } + }, + "include": ["src/**/*.ts"], + "exclude": ["node_modules"], + "ts-node": { + "require": ["tsconfig-paths/register"] + } +} diff --git a/services/gateway/vitest.config.ts b/services/gateway/vitest.config.ts new file mode 100644 index 00000000..773de309 --- /dev/null +++ b/services/gateway/vitest.config.ts @@ -0,0 +1,10 @@ +import { defineConfig } from "vitest/config"; +import tsconfigPaths from "vite-tsconfig-paths"; + +export default defineConfig({ + plugins: [tsconfigPaths()], + base: "/src/tests", + // test: { + // setupFiles: ["./src/tests/setup.ts"], + // }, +}); From 5f8c25aa24cf3c83899f36a7340c85f1949e63c3 Mon Sep 17 00:00:00 2001 From: Pierre Lebigre Date: Tue, 18 Jul 2023 08:40:25 +0200 Subject: [PATCH 310/883] Modify readme and try to deploy on azure --- services/product/README.md | 6 +- services/product/k8s/ingress.yml | 17 ---- services/product/k8s/service.yml | 3 +- .../product/terraform/.terraform.lock.hcl | 88 +++++++++++++++--- services/product/terraform/azurek8s | 20 ++++ .../product/terraform/main.destroy.tfplan | Bin 0 -> 48778 bytes services/product/terraform/outputs.tf | 2 +- services/product/terraform/tf.destroy.plan | Bin 0 -> 47426 bytes services/product/terraform/tf.plan | Bin 15671 -> 11450 bytes 9 files changed, 102 insertions(+), 34 deletions(-) delete mode 100644 services/product/k8s/ingress.yml create mode 100644 services/product/terraform/azurek8s create mode 100644 services/product/terraform/main.destroy.tfplan create mode 100644 services/product/terraform/tf.destroy.plan diff --git a/services/product/README.md b/services/product/README.md index 35e59f1a..66de1c00 100644 --- a/services/product/README.md +++ b/services/product/README.md @@ -101,7 +101,7 @@ npx prisma migrate dev --name init Open an other terminal at the root folder (/service) and execute those ``` -docker build -t goodfood-product:1.0.0 -f ./product/Dockerfile . +docker build -t product-service:1.0.0 -f ./product/Dockerfile . docker push pierrelbg/product-service:1.0.0 ``` @@ -109,8 +109,12 @@ Back to the first terminal and execute ``` echo "$(terraform output kube_config)" > ./azurek8s export KUBECONFIG=./azurek8s +``` +Remove la première et dernière ligne du fichier azurek8s puis execute +``` kubectl apply -f ../k8s/ ``` + Puis tu peux crée de quoi monitorer dans l'onglet Monitoring/Insights ça ne fonctionne pas, le contenaire est en erreur. Ce qui n'est normalement pas possible si le conteneur fonctionne en local. diff --git a/services/product/k8s/ingress.yml b/services/product/k8s/ingress.yml deleted file mode 100644 index 5e580817..00000000 --- a/services/product/k8s/ingress.yml +++ /dev/null @@ -1,17 +0,0 @@ -apiVersion: networking.k8s.io/v1 -kind: Ingress -metadata: - name: goodfood-product -spec: - ingressClassName: nginx - rules: - - host: product.localdev.me - http: - paths: - - pathType: Prefix - backend: - service: - name: goodfood-product - port: - number: 50004 - path: / \ No newline at end of file diff --git a/services/product/k8s/service.yml b/services/product/k8s/service.yml index b5034547..b1e75fa4 100644 --- a/services/product/k8s/service.yml +++ b/services/product/k8s/service.yml @@ -10,4 +10,5 @@ spec: port: 50004 targetPort: 50004 type: LoadBalancer - loadBalancerIP: 10.10.10.10 \ No newline at end of file + externalIPs: + - 192.168.0.10 \ No newline at end of file diff --git a/services/product/terraform/.terraform.lock.hcl b/services/product/terraform/.terraform.lock.hcl index aaa84b6d..4bde616a 100644 --- a/services/product/terraform/.terraform.lock.hcl +++ b/services/product/terraform/.terraform.lock.hcl @@ -1,22 +1,82 @@ # This file is maintained automatically by "terraform init". # Manual edits may be lost in future updates. +provider "registry.terraform.io/azure/azapi" { + version = "1.7.0" + constraints = "~> 1.5" + hashes = [ + "h1:hyHiXqegENqTo4e1ooCkay1mHhBRooHH/nGIF8PuS1w=", + "zh:39713f9aa01824a6db818dffcb2fff9175cf888c70c6805e1dced17d42dd0d24", + "zh:4bb38a1861491ea380d5fe65062b73299aab49ec5baf58ad55edd9c99b2f5072", + "zh:4d572e30973b8dd1936ee60a2fd3dab201ec55ea16521905b06ac7e8e41ecc57", + "zh:78200e4e0a0f515a0c5752cb79954a4cd06b9eb2c70241cebff7372c212e5d94", + "zh:78675e6345890d0e04041abd2c14cc5f4f011e9482484a45856f2ac7a9931e76", + "zh:a4e8ade7559febda858b406116595d8fab27290751c4b09817bbd56af79c146f", + "zh:a7761ed0fb78dfb773a81af953ba4a552642bbe76e9ad7e373e1a98875b9206f", + "zh:aaa8da2ead6eb3b37a74e4a123788c099635ee8ef6236b26a4eb6f27c1626f0b", + "zh:b1e146bee793751ee432e5eb538feda225e78c63cd79e1f3ef05ef7a5dd02b5d", + "zh:d415471c445eada01a7bedf5fe3132b937488b80d99454403991b3f96e092f85", + "zh:dc984774af24948ffe1f1611f443380e204a465e3512045b5c1e6c8e845a8d3f", + "zh:eb95f8d87116bc8b3a8b2be2d80216da21d4274329fbc69033d3c0062c3345cc", + ] +} + provider "registry.terraform.io/hashicorp/azurerm" { - version = "3.48.0" - constraints = "3.48.0" + version = "3.63.0" + constraints = "~> 3.0" hashes = [ - "h1:5sGcXKelc4o4MnPZfKKs9pd8w969TtlCV+0IZvW58Cs=", - "zh:01bd328009f2803ebc18ac27535e7d1548c735bb5bd02460e471acc835e5dd19", - "zh:070b0bdd5ff27232eec7ef9128fc9bd17e6bdae503ddcc450c944449f3a8d216", - "zh:0a0a0e81f7ab8757aa83876fffbc57328843664900923d8b3c577e7596884726", - "zh:30994e6988c92d90a71b88bff0bbc4fa8f3b48034d18eb068bd5281888304579", - "zh:54dfdbae2bf79f8104ae73e5c6cd94a69d1e6de4345322f6c8eb6affb04a66c5", - "zh:55ba99b32346237435d7212b3f2521952ee67934dd5ee942a51642357b0ad4fc", - "zh:881bc29857511f7eedc3d359a0f2dcca6b526a48f6d54887cafdb25647abd1fd", - "zh:892bfa34b95b6b4b2ced24dc2989edf512b193bd9e5cf121ae47bb9d9e6d0b94", - "zh:c7d2c778b0f251990874ee859b9093fbb4beb9b3968858137da6c5167c797ea9", - "zh:db558aa70b163af44a73fcb1306d0e4dcafcafe585bedb90ef69f063fa9766a3", - "zh:e0ae252b7bea560e05fde09fe632f012430fb91ff9063fce560d997ecdb1cf75", + "h1:PT0lfMSxYAL+Pcu5BwWiWDLq6u/mzx1O/dVfxFotDDU=", + "zh:0bb8263de0abf1a7457168673f9fcf7e404ae59d03d0e8eda91f1e024f8d9253", + "zh:24dd5883c95801f2d4a88be22b9a3bb4e20de7b6b65e8b7cc90b12a0895d7adf", + "zh:4fe19fe81a68811d09d33aeea05f20987bef84dc7377c4b34782b94dda2c658f", + "zh:673fcd9d15b3f1307a1c41323598678b9a705751851d0f65e6abdf78c9e5361f", + "zh:6c401d348d04436ed891482c3e2151c34d6fbce0a6ee8880c6025de589e22e9a", + "zh:6f6b9909d62e9928d56b1d02c88a514d45022fae72048166e58e288759c73493", + "zh:7de2aa6636ba657166ef992a3b7a822394a2d1f8c319fdbabec69b99950990ea", + "zh:976ca97ab21708f8707c360c18dc64c03a6e497b7a157bb0ff7a8a54c03ebc55", + "zh:af220c20ce6e76c4c072fbc9aa3c02597260117ba7deaa0e0d585fb1957a775b", "zh:f569b65999264a9416862bca5cd2a6177d94ccb0424f3a4ef424428912b9cb3c", + "zh:fb4055762069cf0f58a36110853811f63e52c7077e332d8731a66fade1ba9f15", + "zh:fc95c1c80e98c317ec38fa33d16d55b5a62058dc893fbf578d100fb91401356e", + ] +} + +provider "registry.terraform.io/hashicorp/random" { + version = "3.5.1" + constraints = "~> 3.0" + hashes = [ + "h1:VSnd9ZIPyfKHOObuQCaKfnjIHRtR7qTw19Rz8tJxm+k=", + "zh:04e3fbd610cb52c1017d282531364b9c53ef72b6bc533acb2a90671957324a64", + "zh:119197103301ebaf7efb91df8f0b6e0dd31e6ff943d231af35ee1831c599188d", + "zh:4d2b219d09abf3b1bb4df93d399ed156cadd61f44ad3baf5cf2954df2fba0831", + "zh:6130bdde527587bbe2dcaa7150363e96dbc5250ea20154176d82bc69df5d4ce3", + "zh:6cc326cd4000f724d3086ee05587e7710f032f94fc9af35e96a386a1c6f2214f", + "zh:78d5eefdd9e494defcb3c68d282b8f96630502cac21d1ea161f53cfe9bb483b3", + "zh:b6d88e1d28cf2dfa24e9fdcc3efc77adcdc1c3c3b5c7ce503a423efbdd6de57b", + "zh:ba74c592622ecbcef9dc2a4d81ed321c4e44cddf7da799faa324da9bf52a22b2", + "zh:c7c5cde98fe4ef1143bd1b3ec5dc04baf0d4cc3ca2c5c7d40d17c0e9b2076865", + "zh:dac4bad52c940cd0dfc27893507c1e92393846b024c5a9db159a93c534a3da03", + "zh:de8febe2a2acd9ac454b844a4106ed295ae9520ef54dc8ed2faf29f12716b602", + "zh:eab0d0495e7e711cca367f7d4df6e322e6c562fc52151ec931176115b83ed014", + ] +} + +provider "registry.terraform.io/hashicorp/time" { + version = "0.9.1" + constraints = "0.9.1" + hashes = [ + "h1:NUv/YtEytDQncBQ2mTxnUZEy/rmDlPYmE9h2iokR0vk=", + "zh:00a1476ecf18c735cc08e27bfa835c33f8ac8fa6fa746b01cd3bcbad8ca84f7f", + "zh:3007f8fc4a4f8614c43e8ef1d4b0c773a5de1dcac50e701d8abc9fdc8fcb6bf5", + "zh:5f79d0730fdec8cb148b277de3f00485eff3e9cf1ff47fb715b1c969e5bbd9d4", + "zh:78d5eefdd9e494defcb3c68d282b8f96630502cac21d1ea161f53cfe9bb483b3", + "zh:8c8094689a2bed4bb597d24a418bbbf846e15507f08be447d0a5acea67c2265a", + "zh:a6d9206e95d5681229429b406bc7a9ba4b2d9b67470bda7df88fa161508ace57", + "zh:aa299ec058f23ebe68976c7581017de50da6204883950de228ed9246f309e7f1", + "zh:b129f00f45fba1991db0aa954a6ba48d90f64a738629119bfb8e9a844b66e80b", + "zh:ef6cecf5f50cda971c1b215847938ced4cb4a30a18095509c068643b14030b00", + "zh:f1f46a4f6c65886d2dd27b66d92632232adc64f92145bf8403fe64d5ffa5caea", + "zh:f79d6155cda7d559c60d74883a24879a01c4d5f6fd7e8d1e3250f3cd215fb904", + "zh:fd59fa73074805c3575f08cd627eef7acda14ab6dac2c135a66e7a38d262201c", ] } diff --git a/services/product/terraform/azurek8s b/services/product/terraform/azurek8s new file mode 100644 index 00000000..30283a92 --- /dev/null +++ b/services/product/terraform/azurek8s @@ -0,0 +1,20 @@ +apiVersion: v1 +clusters: +- cluster: + certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUU2RENDQXRDZ0F3SUJBZ0lRS1dVa04rbWpOVktEbW9IYlpFMFlLVEFOQmdrcWhraUc5dzBCQVFzRkFEQU4KTVFzd0NRWURWUVFERXdKallUQWdGdzB5TXpBM01EZ3hNekEyTkRWYUdBOHlNRFV6TURjd09ERXpNVFkwTlZvdwpEVEVMTUFrR0ExVUVBeE1DWTJFd2dnSWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUNEd0F3Z2dJS0FvSUNBUUNhCmhpSThtUFhTbUU5NTY4UFRqb29TUGFIYXNYM3BCSEg1bkd1U3h1a2w2Vzd3NSt2a2EvZ3FlSTZCS3J5LzNVMFMKOGRGRStxQVdibnI1aTZIdStnVW1ZS0JnUXA3dU5RUFdXTG5GWWxWTnJrOWY5WElQRWRjV2N2MGltZjBvQW1QeQp0UitDTDcwWkVlYzAzbHlLbkd1ODhWaW9Oa0JOUG9XMm82RFR1ZkI4d1EvSFo2OGh3NnpPMGsyakZORmlzM0s1CnplS3pZUTVlTWc3MEpmWm14V1RLTzdpb0JnT1FGY1FWSFJyS0RTRU4yZGh6bU9OeXVGdmVSMHRRbTVLOWxnRGwKckc2aXJTSmpjd1FrUzZWSXE3WXptcUphTlFtVy9ZM1pGMWRDVHBLUThSL3BFRUFnZVdLck5BNmoxVGZIeDBSSAppYUp6SVpJb2daNmdnYXhTWDI3MEU3aWFyUGlTZlR2WEdVdUZ0V1lZRGdXQWVXem1xMTFMRzh0Y1VrTXZSZE5lCm5zTUgwRTltd2gxMzY4SG9pOTlneEM5OFRzQjV6L0pnZXhuTlBaWXh0UzlTYWVBRU1md3d6ak0rQ01JZmtidlEKb20zT2F3Q3JVY1l6NlFmRVl0YmdoL0xQQ3hDUVZWendaZFRoa28vRkswdVcxcDB0d21za1V0TU5qTzZKYzN6OApyZzdYUytVUEx1M3pyb2pvSHlzYlpCS29WblpROFB2U1h6SHlHWjJZcERWOUcvWVhmV21kZlNQTkFHNEhBQTR5CkZQZmdWbzZwc0xteGdRVVV3cGZKZlFvMHh3SkNOdUxiY2l1eExQcDM2dlBFdjIyWXVZMWRjKzBRRkdBQlU0dFMKem1NV2J3LzYyQUU4ZEtsOU1YMi9ZRHB2VThyZ1MxMGVYQWZPWnBwMXB3SURBUUFCbzBJd1FEQU9CZ05WSFE4QgpBZjhFQkFNQ0FxUXdEd1lEVlIwVEFRSC9CQVV3QXdFQi96QWRCZ05WSFE0RUZnUVU1dkR0alpnSXNoL0VnUUZNCklweG1YUkxQNDI0d0RRWUpLb1pJaHZjTkFRRUxCUUFEZ2dJQkFENVcwZUVrYWhGc29lVFp1REhzMXNFa1NUTXUKenEzak9iQ0htUzBPKzl3MFFENkM1NjV6bUtzU29WVEVJZWlLclJMQm9IYVBBbGl2RVFHdFJwK0tnT01VdVllZgp4WnBnWFZ2WWMyMjRQaTkrbXJueHRyZE1zTWZaTUhXYmVsa1FTcmo5bFhBYUxpWDhxNk1VTXptRUpPd21kNnFNClhTaVlSUGRvdzV5b1ZCRktObGpXYTZTSEdyNTcrbWdtd2hHOWpORXdHMDBEeVBRdmU5RkZUSkRtSm05K2dIak8Kd3F4RjJEY3F6VU5WTEFXMytBZXJPV0xjYk1GRVR2UGEvdVQ2Qkpwd3FiU2pKbnlzZkxyWUExRWZvbXZXMFZDMApoK3JFcWQyTG5IMnRIVjhhMzRuQmdaVGdtUjg1NTFIcktLUEpzS3R3dlpmeDM3VTIvaVV0UXRIWEU1V0k4QkNGCkZOQjFRREoyWXQrbExMNlFidkh5Mi92R042RllXVUZmNGhadEhxd1QraXFtYkY1cVZobDMybWFmRVBnVnVEZlYKejRlS2pYS2Z6NVNrT21WVGZrZzIwOTZpQnliR3JzUk9jTUxmZ3dNN003ZkU0SVljWnJrMk8vZ0J2SmNBQmsrQwpJdmN0a1A1STdyVjh3bUZqSmJhUC9aenVyQWRVY2hGeGFSNXVKVnlicHQraGVOT1JlWnRuMS8zRnlZSkdMMW0yCkd5cHcrWUg4dkJyMUVYL0JZSkNka1RqRU9zdWlMcy9LUE90MU8rejlVVUc3c00xMFZtNzVNSG1RSFVnQ2hLTDgKRWZ5VUpuS1BhQkFuZ01SZDNrczFzMkRPNkZQb1A1djNGRnp4aW9CaWZTaDJ0S2N3ZmMxUlZYZmUwL1hReUMwVQp5Z0JVWGVhTmQ1VDIyYXdjCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K + server: https://goodfood-product-yv0i81x1.hcp.francecentral.azmk8s.io:443 + name: aks-goodfood-product-dev +contexts: +- context: + cluster: aks-goodfood-product-dev + user: clusterUser_rg-goodfood-dev_aks-goodfood-product-dev + name: aks-goodfood-product-dev +current-context: aks-goodfood-product-dev +kind: Config +preferences: {} +users: +- name: clusterUser_rg-goodfood-dev_aks-goodfood-product-dev + user: + client-certificate-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZIakNDQXdhZ0F3SUJBZ0lSQU03RmU4UHo3RjBTYXlXOWdpSytjMW93RFFZSktvWklodmNOQVFFTEJRQXcKRFRFTE1Ba0dBMVVFQXhNQ1kyRXdIaGNOTWpNd056QTRNVE13TmpRMVdoY05NalV3TnpBNE1UTXhOalExV2pBdwpNUmN3RlFZRFZRUUtFdzV6ZVhOMFpXMDZiV0Z6ZEdWeWN6RVZNQk1HQTFVRUF4TU1iV0Z6ZEdWeVkyeHBaVzUwCk1JSUNJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBZzhBTUlJQ0NnS0NBZ0VBc2toQmgzY01qUTRLVlZWVHliYSsKWlhnUkpaVXQ2bU9SOU41R1BEN2o2YThqVklZakdJdnYyakw5WS9VRFdTV0o4WXp0NDdTQjFOUWE0VmYrRy83Rwowd1BFYWtOZ3JmMERnRmN0NFRYY0RwZG5OSmc3Vy9TMXVZVFNFaUNnYU55aDNNRks5dUxyYkF0SWhBZEtvbldFCk1jaUZPSTlvMytFT0J6UlJMSWRPZWJkR0N4QlZ5MUI1Z0FKemErL3hkSkdXT3lyUjEwYi80Vk9zTi8yZGsxUWYKM2FYL01wcFRNSWJkTldScmoyMHRLN2NwZVMwY0xvZm1qK0JtSm1iOFpaV3JUUU9wUXlydjZ0a1ZJYnpGejRWNQpHQUl6Q1FnK1pWUGw5RDVjYmVtWHZQRXdWVDBxeUZWM0VFSk81aVB4RkVQL2Z2UDJpcy8yeFBQakt4ZjdXMVhECnJHRnNhWHFFYU9ncU9zbXFlMWRQYzJ0a3k4MHEzTGdLdG4zKzZGODNkTHlic2ptb2VWcHkrbWxkY1NRZUc4a0QKSDJGZVM2OVIzcFRYMjFhaS85cDJncUVMOStRbko2NTNNQzZrZmpqQk94T1FjOVBnTzBjWDY3RkttcThSa1ljMAo0NlRMTUpVZytRT2EvWkUzZHZZVHJTakRjbGNicy8xUFJYYVpkQUZxNHhpczJrQ2s3T2UzcGZOOGRSRzQyb2RBClVtSE81OGt5UW5RYXVZTjNOQVFkT3BpS1NTcVBCT0tGaTdtN3pJemdpYnBzNzJVMGUxSC95K252d0p1TkRzZG8KTklJdEZFQ3Y3Vml5aUYxQmNHUDE1Q1NGbDFsN3RRTmVSN1cvTmpOQjgxT2NqNWpnZm8reEtYN1Bac1BVMEI2TApJaTllQUMzRGFNdW5vNlJLY0JQb04zY0NBd0VBQWFOV01GUXdEZ1lEVlIwUEFRSC9CQVFEQWdXZ01CTUdBMVVkCkpRUU1NQW9HQ0NzR0FRVUZCd01DTUF3R0ExVWRFd0VCL3dRQ01BQXdId1lEVlIwakJCZ3dGb0FVNXZEdGpaZ0kKc2gvRWdRRk1JcHhtWFJMUDQyNHdEUVlKS29aSWh2Y05BUUVMQlFBRGdnSUJBRitUYzBGQnFUTUlyMnBRa1dOTAoySERQZkVmMWVYenBsNFVJQXcxM25ERzdvTnNxcjJEV3ZWcnpxNGpoRFQwOGJsSFFPNEovYWV6bVZxYWxIUFA2CkMwTk1FMFZIQUpzUERqQ0RqQ0RYb1F3VjdZeG1YN2hucUZHVThGL0kzMCthQXcvUXYxbE5TZklPZ3IyODc4SXcKRE9uYnBMbS9jWlR5dUpYcDNiYlVWVHFjdnpKcnUrVUZVbkZiT0FDbGxId1VaT0grQ1J6Z1l4RGZJaWhrRU1ITgpUaitmNHpvUldPaks3cDZpb200cXFTRmM0b0tXVmJmRHB3clM4cW5HalhiTTNiN21SVW5hTld1OGFYTXN1SFZQCnRmM0QxQjFGcldvQzlWZVBZd2M3U3E4TFVIZitTdFhneDdvL0pqWmtKWTdwN055QTdZcVNrVHdHY2pqc1lud24KejQ4SkZnWkx0UWtLRGUxbmYxbDFhVk1NS1IrS3NnUG1LWlA1clo5a1oxSnl1c2QzcVYvc0cxK1kwTm1ENUZOZwpGeUkxS1pyYzNLeXBMWlk0S2U3K3puYjB6SDR6TFV4Y0F1WWRRSFhGck56bDNGOHR4RGNlVk53bkFxQ3M4QlJlCnZJMHcrQ3dZUTZqRTBjMzIwUmpxbU5JY2gzdEM2VjByS2lZZWR1cWlQQ2tKTGorYThGUEZxM2RXYzN1UkdjRG4KS3pUeENhSVBFQW53TUQvQ051RkJSUm9CWkpLL0VNM2J5OEJHaHduUjVlZTZuSHM4Y1NXdklLM0ZXdVVzTGdraQpYKzQyK09UbDRKOXBweDJoZHlBNGQzeWplZU5KMFJmaEhmZEpkN0xiZ3cweGNIRWZ3MEthU1dwandaNHAvWHJ5CkVXMU5wTm4vZkF5ZWNtWWVPTk9MN0FEbgotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg== + client-key-data: LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlKS3dJQkFBS0NBZ0VBc2toQmgzY01qUTRLVlZWVHliYStaWGdSSlpVdDZtT1I5TjVHUEQ3ajZhOGpWSVlqCkdJdnYyakw5WS9VRFdTV0o4WXp0NDdTQjFOUWE0VmYrRy83RzB3UEVha05ncmYwRGdGY3Q0VFhjRHBkbk5KZzcKVy9TMXVZVFNFaUNnYU55aDNNRks5dUxyYkF0SWhBZEtvbldFTWNpRk9JOW8zK0VPQnpSUkxJZE9lYmRHQ3hCVgp5MUI1Z0FKemErL3hkSkdXT3lyUjEwYi80Vk9zTi8yZGsxUWYzYVgvTXBwVE1JYmROV1JyajIwdEs3Y3BlUzBjCkxvZm1qK0JtSm1iOFpaV3JUUU9wUXlydjZ0a1ZJYnpGejRWNUdBSXpDUWcrWlZQbDlENWNiZW1YdlBFd1ZUMHEKeUZWM0VFSk81aVB4RkVQL2Z2UDJpcy8yeFBQakt4ZjdXMVhEckdGc2FYcUVhT2dxT3NtcWUxZFBjMnRreTgwcQozTGdLdG4zKzZGODNkTHlic2ptb2VWcHkrbWxkY1NRZUc4a0RIMkZlUzY5UjNwVFgyMWFpLzlwMmdxRUw5K1FuCko2NTNNQzZrZmpqQk94T1FjOVBnTzBjWDY3RkttcThSa1ljMDQ2VExNSlVnK1FPYS9aRTNkdllUclNqRGNsY2IKcy8xUFJYYVpkQUZxNHhpczJrQ2s3T2UzcGZOOGRSRzQyb2RBVW1ITzU4a3lRblFhdVlOM05BUWRPcGlLU1NxUApCT0tGaTdtN3pJemdpYnBzNzJVMGUxSC95K252d0p1TkRzZG9OSUl0RkVDdjdWaXlpRjFCY0dQMTVDU0ZsMWw3CnRRTmVSN1cvTmpOQjgxT2NqNWpnZm8reEtYN1Bac1BVMEI2TElpOWVBQzNEYU11bm82UktjQlBvTjNjQ0F3RUEKQVFLQ0FnRUFpbTZnczFjMVg3R3ZSR05sRkJQWjgyQXZzRWNOeUJwWWt4S2s1dExPbGYxd0tZbWVac2tDRFNQYQpyV3JxbHFZWFhvQlhsNS9wMENDQ1hzZThnSEJzWWgxaXZrQmpLYlowcVlzSURQK05SNmM0ZEJaZ3dSNWFuUnNOCkl4WkNlQ29aWlJpUjVQSithdjYzNkF6aFh4UncrVmNDV3REQVZsYWlWZVhCd2htdVRjU0pscjJ3WUphMFFUbWwKOWdIeU10bDVGYWhDR0M4Qk1TMlBaRXFCdUl4eDBlRzdMc2UySU5BWHBBVzluempmQWpyTzhWQ2R1V085RzZyYQpwcWNCQk1BYXEwcFVlOXN6UCtBZ0VIcEwvcjlkTDg5RllaWU5IUkR3Vlo2MmxvSHpXTHJQRk9EUi80eWRUdnF0CjJQVy9sRVRZZHZOb1ZKRDJ4Q2U4RlJJaUV1R2RkVWZ0TUVha2E2MEc0cFVBNUhhUXBBeDJvbTdmR09Lb2dMTnoKV3YzdEVZUk9yTEM0TlRWVGhKSnIvS2xkdy94dk9BMW52M3llUy9PSUZ0YkNGQ1o0VHMyK1RYdlVjVVQyVFh3VQo1R3VqRUd1anJ3THFEVi9jS0RLbzJZczZORWMxcTdiTThpN0huOUtVZURiNlcxMEVrQkNOZFRhWVlmQVc0YlBOCmZ6NzNSdFVGb05YbHJleVlnajBwVURrbDVhSENyK1R1Y3IydGYwTHVxTURHcWw3MzVmWXVPTzZtbElvT0tYQ3kKcXdpQVgvdUFveEdaRkNqSGhHTmR3b0pNUTVDcHkwWTR0VllBRlczZ0MyOFgyUjhLZEpUZ0Z4Mys3TlJyRFFXbwpEakVrMG5QUjM2Ymd6YXA4c2pqckVnakszT1FSTnkwVXd5YWN1aXl4YngwaXYxU0JvSUVDZ2dFQkFNYTluM3pqCmU5SGgwTlkwMFZCZWpySDRHcXdNYzVTZ3ZHcjcxcFBSTUNEUkt4T3VDaHoySmJ3eHltcjBNRVpEK3NNL0VSeTIKSmpuNE9VTWFFTExaYkNsUTc0MzEweEd3SytDVDlwVXJTakFSZ3lab2ZrOEFHOWFTZEhIeDNYOXp3RE9BT3dZVApjNGpYZHdHVHl3bEdXek50QlBOc1AvdXIrd0ZmY1ZCWCtiYklrRlRCYVJhd3JyU3Y5M3c4b1FQT0RNbWNiNzBZCjNjQTNjdUd5R0w1VDdoeGxzU1JIWXkrb204QlhDVkdHR3Y5R21tM2ZiV0VRYVB6K1RhM01Yak16MkNnNmUrSkUKWGxlZGcwcEFSaWlheDhEc0lSQkJvQlFUWDdXeFhTYUFIK0l2V3VGb29NeDYrZUw3Q2t0eDdrYi9DM2YvTkdzLwp0WU9qbVNPVjl3Sk9vZThDZ2dFQkFPV2xzVTBXMzQ2dkNvemJaWktiUjFiNG9WTldVQVEzaUZ5UFZQOWxZcW95CnJYY0I3am54UUM2T1lLRWdDRytkTVpmM0tRRDR6ZlVjL3NSVDRGZDdxRjNUeEdSWmJldHJOSUc2UGRPWjB3aUEKTnZQdWltbFYzcXVxMk9nNlRzNXZkMVRXQ3JXRXA0UVVQbGdCNmdiTkEwc2MyUHdiTDk1clRQcllSNXYrSi90OApRL3pXNWgvTGg0bEdYY2NkK2ZmTE5KenFCM1huR2lxVTNCQzZvSDhMUEdXQkNxaWhyemZIakxIbHV0aEs1VHZaCjFUZHNDN2ZqbTl1cXlmcVkyNU9JblU2ZVlsMi92QUk0d0VKYlVEQlBpdE5MK0VtdDd3SEVDWVZjYlcyU2NHL0IKT0hTb3FTK0tQQTUyTENnU2hpc3Z0YWRBbkYvTEliVUZvYllaM2xSY3F2a0NnZ0VCQUlhSW5vb2dSQlZUMDlidApjalFCam44VEFKc3U0cDdlSUM0YnhLblRsY3poUzFQTElMVnlPeUVtWTJ2N1dTSjNxaXk1YUpBVERkVjRIdXM1Cm5jdzBPbS9OaGh5SEtCWjFOMzZUS3Z6WGpTVDA5ZDd1SlhLOUZCc3drUHNCUzN1WGs2aEpTYXRYUjRKK3VPU3MKYzJrWDQyendnOFYwcGV0c0JFSnRwWHRKMHBUVk9EN25ub2ZwbXBwZDlCNTV2RldqQ2kwQVpQT1EvYXU4M1Z2QwovOVQzWTl4OVNtalFtbWdNcjBLSXFKb3pPZHRNcEFWMGxjcDdIVmNGbnZmanZIRFV5NktQMUlUYTJ6SmNRaC9sCldwanFEZ2FlMGRMN1dhMjlYN0RURzhlUVBBVVZJV1F0TzR5d1FyQlFXQ3V5T0NaL1IvZzNIZmpyNjZmcyt5R0gKeHVvYzZLa0NnZ0VCQUpxQWkzVE4rc0pJU2RUU2x0ZTMySnRPMDFyNkt3TnJTVGJjeDlhOEkxRldueFgrR29TcApKd0Vya1I5V0tkYk43MXZLVWEveHRMOUFMcmR2cHZPMG9tWGQzN2VUNHp3TCtGdC9MYkY3UUZ2cnh3eitZK2pTCmVPa09ITGpBNGR4SmFnT05yYzdKM05vanRINEphNlgvc0VPTXVQK0VXd1JOTkpGZmlXNE41R0J5RGx2QlNUb0MKK01FR3Nua1FWZWk4c2owUHhzMHdHbzZqY0J0aE5ESEZJWEU1REM2LytONlNScm81VVNmTDI4WVVuRHFaV3BqeApiUjZ4SFFxWVpNSXhtNFFWVXlDM3FvbmtISldJVWI3dkJQdDdsU1FjL1R3MjVDRHhPajRKMDlPY0w1dHREY2FLClBqV01rOUN5QmNwd1lzcVAwYVV4U1JBOUpic2FWRloxc2lFQ2dnRUJBSnRKTzJtZVdkK2thNkh0WDFvNC9yZG8KYzBYYjR2YjVYcFArUm5sYkhhSXUzZ0phdlN3QStiQUp4UC9teS9kWUM4V2lTVklkd1lDOW55SUp1b1F3c09hQgplWUlaUFNKR2FycXJybVZtZmVUUzYrbHpNVmVETng0NlJEb1dtYlB3Vk1jbmRMVHZYckFSYVgrMkxUdWZNVzNyCnF3SXpwU1phdFBzOEppK2Q2RWJEZDIxNURSVk1wTlg4ZkJNbWczNUhKY3JMQW42anRERHpsU1lXaFltQnhTMSsKUlJpYlJ2WjBBdkcrcTdFRjRNRHd0aXRFdGYyK0ErcCtpcHZjK2dHN1pIMDJBZy8rbnRGNldwZ2NLSktVamxjTgp5enFUc2pOVWJweGlUK1l3SXZmU0ROR2ZUUmdNT2pBQUF6UzRTNlRoMklyaG1VYlpmMkVNS0NBYlVLRnRJZVE9Ci0tLS0tRU5EIFJTQSBQUklWQVRFIEtFWS0tLS0tCg== + token: 8cncmnihh4unt2xmqfcw39s58crd5f83x4zfznf6mp4uu3lsp5b1sy16kgjoa7qzl8na1hufg8k3cv109jk181fuv3qie3tx4v8fhwi9i8nhmazpclq9505vre13pq2q diff --git a/services/product/terraform/main.destroy.tfplan b/services/product/terraform/main.destroy.tfplan new file mode 100644 index 0000000000000000000000000000000000000000..6b24de4c34ae25711e764e6dab3073d67cb8a3fa GIT binary patch literal 48778 zcmce-Q*drg^zIwmw(Vrawyl*nwrwXXwr$&XR&3k0@vb=8-+!N*eX7p6I5(%~m{qf? ztGcSIYxI0Z_wP}b1Bbu>f%)(8@jTN6`9B&I2rP)JxudO-y@om@2q-UNh3R##O$^0^ z7fG9(bwy`iGh_TM!yl}Wg&c8sT{jOwy6)~UeK|diOpRQP%oW^BR6yovAxb8yUS?`y z{Oq(hr9z-b62l&@;PiTeU5?Yg4Bgw{53-jDJ=L*+#c!j(7WmxYXN7in+*|hp79a6H zxGaY18oxc}uBV+n#4kJ@lh=3ZJbm9runm0UBVPMDzTcSp{A)?gy?7B}XMTV>JcOYV znau98S!b^lGe@~BJBW^`A^uqw-5puS?C}m?9Ke-1gMRm;kvRvyr>B4?Js|~I0xEW5 zyd}hco$fX})}fsgT-paB|0G5$j5&&jrd>=7O^2z`5p5faq|_3}?wz z73*an;Pv{qgUSHk!#@f8>~|c8C;pu+L2e%Ibu631yz{pY|CuxUo$pIVq4JKBcKavj z?U5hkizF zw*(KkpP+Gzq4z_fx6tyVwVxZ8wfdb`sr;??e8Cqf<~Pt;cyxyIlQ@NlU^Wu0^6G)SZ zM4mmv)W{q@?X<987$h@#-ocH-mUfyg8DTXS36^xUo~1+d=imQk7%$4hwhp` z{lhN(KN$Qk&1nt>_;&(fy`1a>r|6O%O$!s(N4ozEbOU&qK8X7qzcyn7UPEht{=xsu z()(v6I8F$@^!a?Bg?-!!ye>MslIyBEm%&W1P_WacU%vWgi8|kDh|ay;?5=vqiAZ^tG|iff~NMNUi@>s zf>iM{Dv@65_YB5h`MruZLt02})Rfnl!2hbFB=)Ezm9Y929;Ju87K%PmZ3iE6)^3v| z-R2aF-frbLcf?(IyQXx`7hlv)F`u6^voZrE*PG3#dzd}LPWv>UonrM}JE-*QeLp_m z93|k?_i5i8HFTpvO9wC%4Lgv5@D=#J@RiS3=xk41dkU7{{H!?Z_}~Oc;?Jdd8@XDu z_w~Qp_&CZf72MwNU9uomm@JiXM~idk6!p^U>Sg#kM9x=r|C;#k?O$vA&bJZrI{m#j zN`aJYrlec;mQY&E;^jpy9&n#AX%rT1oOXJAr%^=xUJgeXy5r6&RO{o+Pb>|MOQ#q| z5A60-EtC8Dg}(^l6O%;Tdu1e)Wjd6TCI^~9B^HD|!ra%DH(->5_O5DU=NHgGr^CsU zoM5p@NAY67%|kf>{s2p7V-fr@+v(Pb_ZF8wDulD(nxV!f1EV;3fXivIUYk=8@H1z1 z<16X1e-b;|@wCr1cuX-Sk*W0QoU}x$@afw)_|KPwxp~=O;TD)oKrINgQa#P+y_d=Q zR%(hI6Aj3icTPK97|q_E-Y#dQ*`2vi#h5or3zOkNNIq~D*bC^4psN1I%oS#rB`tRF zRb(iZl~dBGls8J$)JCZ4?9qtUwxO*EO|;V;)GA+daMdr`QLhryE>hP+hQ~5%c`+mU_P8`7v6Pj}YXB##6k>$Li3&=DB?U70MY*Dm@~w5>=by2O?y3Ul6r$ zESTG(8n?G44A~!!H`TG>S8+UGbgvV^K6KUs@CGj`gZzfC#m-?; z=nFJ<+IsF5cXQyk`yz8Kw&)59x!uCub*RTD9Qg>l7K2X$)6xIo=Eg`N%)h!?pDr=mv+e1 z^=u20iPL<9&t~ghWhc^34nZm9)-jJ#Wq(6M%qx_BL<$`>UDNjjDF z((A3z9VWKd|2~KA#66z|ota1r<2t!C;n$cOX`aB(XK*(5o=?wv&&xMCBPYMt&y5sa z+P2%z2X<({YS7PI6qS&|eZL3m@Kn*yw+?c8{kT)4C$h}h)G%LqOFF6T@L9FZ1E3_C z?R8fIICS{*%@@B~^H3{4e)R*X1!o%q z-0LKtE;c#zAeeJ(SdWcBgx9x2IgN(Uz?+eG6QBx-+LNjGVRlkq^Ed#?==3`rnzQ zCDOZ5Rw@iUOai!Rpn6sHKJ^TGGj2nvK5uYD3njX$CtLIkzcuFiy56&m;+qby?rQvP zuY+cW1MUt)5Sw%ILY`I*j;qRsli&4!zT0FcrP9o=c4IJ?jWk41F^f7Rr6jL4r|5Fmy!a=aT=2*I z{^lRD;2S?H@pl=S5=)v*TJai;u1$r}f=|CoXP;g4rA174#mg&sV^NyI%-{AgiX8Z` zyrHpKM;;8xk~5@YjJ{LU$~-bs(Y?0zJF`_lfY)XMw0Ar$vg;#W$IgUpHBcgy58^LT zo??T)&L*8QjF@I9C6#t`ztqwxSUR2cVv;gNjvMbBY*En8o*weWPo^O=Uxwk&?O7xj zmAv)JZE+LlIo(91EaxAmGX>Yqsg=a%!o^Ux0=mM>`TpeJ@E^ln@6*L0Mdh;i{r403 z4(IM(kK+9m%j8~bFVHxF*196U{c&40<7|$N|L;dqnrQpOWmDhUo|9zGb>Viy9pIuc zVT>(BEOh5{Zg_f2+~e+FMVxdvOCG+QcfR7Nci%2yaNlkN^y|7=c?rEi&rgSlU+&-y zH{jV?(`h@q%2BcbYrlC|{C2MmyJ$Ou|4*{ISt&iUq&1w^;`~E&QAuIfCvI1JyuB>j zoVUQBW*5p2Cg#^ApgK|IZ#q~EWbU{NpP(^_x}I`jAEeAZ7|DG}^Y&JVTao44y6Sm4 zDDJ+auWc^6*6u_6Ek&KZ;rn7DF+?zT+uKE_kG=iHwYQn$r62K0{1eJ2kWBAGwFi+< zp}B4eS|W=?@4$O z#W;j}Q!ys2`7SB%yocnB;1{VLTlOafPCUx?ulAa#tOPgVI?6fx9vH(b#c0(7>5=}hHx*z$-vVfAFSGOA^Kl*^)l)X?O>xS1eM9PsSn zsHm-{vIFiIX<jlVuEPL^M;I#!$!!@)eh-gP9H75+{Yl^>kE!5l3H;`L(T1{@;eEf7@mYLk-_$<-?!D5O@ayCYX9V1)h6ysE)@NK(~bY_lU3T{ z3&lf|5Geo^s#ch`1&ZUYTsZ}ZT`riB0NP6lN&Ece|1=LUbASDWESV>ESY(v2yP3g0D6 zRaJjp6)Q|UVtKt4RWs!+vq^9li`=b;>ev>_AXh=JM|#pD&ZP`V8O(7_v=^9nUZojr z7NKUB>!LtX0v{51@oUg4k&SeEMtF*ld}^oIjsobZF>jt(D5mKdA;RJa&zROla%$oi z10@U_2rB|ET6&=oCFl8@)3Eo#ImwRBc_t#IgSog2^eqjQ9&wP=iL!b$wg|Tpkt``~ z>emWJq>VV8FpDKhT%@q3Zb3&`8G})LnPf>th??n;`<&qwZ=g6QiVQ;8n7@>UD<2FZ zm50EAq0u_vkEdB-yM}^T!6~52R=Dy4?u4Ly3PD|d*|ZfD+IuT-vT=YGHZTfwRNAdz z%Vo6gWCZk)C+XuzvS_ABfLbzwjI%*ps>QC%#)QO%;NbnH>t^if4qE9qQ71hxmL=h64o8A%8sTW% zvjq266%HuQyPN%97B^0M6)vJN6t4K~?#xa(z4C{^lthv##SK^8I$o4k9DGpcf&bh? zUB}{9w;lIxbn>r#<=9L}rGI#2#nCB~@lsvItRE74Vu9p*-dt-O|4@-ChyR6P$OM(gY7G->|}Jf|%z=xLml4y>=-f~&ZA4FqBVyZ5M;05BBIvO()r^b3a2{FhD4d)&-SFBZD% z!bz*R6`2vN&K@~qt>ma9obm4<6rgubiT7m0i%!%z?fA2q0?YLxsfsfA5eccW=6<7r zjijIj90M4k>0#S)*+Ru)$OcB($+qcapf(-*)+eozV`H92OFDGVAVC z^fg8h;AGs2w1Y(lvW6`{rEaUP1i6VPj%|a$tZ+j#X;yknCZ$h6S*Z~$s|>_t7zcs? zO%HI|lQ!jA5kVt~m=7u7GfmdZC?_lq?q{psXLsDi(%w^nFrztd9hW+Yc?z-x`e@p_ zeC&NI>8o>B5SfUx-I!QsTS+ADH}4yi%kf{8`lKh|=ajFTFpSCSeqK%oGG^q_E_NAv~S_N^88=t~&ZvWc6KM4;z@u3?38txQ@L$ElYtvth-d(94dpj8qSPzHVH*Km`JP%vymSf7LP3l!y?q*_7oGtwQlX0E(I(CF&#Km zhX{Y@*6R)w)OyWX;a1=Cr!q*_eqOYDVL*n){GAwW0bAm`B?TJ1JOkE>FVhye4Ck#z zlOd(|p;IeUk%MAyX3FxVkKZ)*V$%;OlPk8_ z&|O7FfqD=jhqx}`fw=01A*cblyB%3h=0xnU3h&I=~HYS}#895OH(55$t^ zG`#JIE1&m_2W<&iJc~F!DyKbX9bxXnRuMxIars|)E>Nmv_VSxp$O(*31fkxS7F9A6!m2=!dgaey#urzF|_)RiaqY6d}6YueR+j4^;Avr*R)7DDT zwC|B5*^R~uWp!)aS;xHk08Km&R!xl$R=bRa*>IYdO1@hX0ZTyN4ornmP0pd~-cs?H zoQM+96o#qHIhT|ul!nf$*4XErdoo>n;|y#H>1sayxz7O-t4V!-WU*uFmj)MG*yg6F zO(jZ8DGF^<1g5$nYLsOSoqn@myAf7$Bj-xd#&l@YezD{lN=YC5FI@4`69n~%KyO14 z)y>4Lf3JqS@ ztH~N2=>5`ZLy0N{HWyx=#{oDhk$RrR5w8 zFA+*PO2lAH5jB%H7e}%%K>W5E*BqP6)rxm(EJXF%U15A#Z!D0e(`?2_32bANXmnjB zAcoBwN{4N>Dj#1I4Hs9bl(qEcNty{d(> zm5>{hw)J?Ny1F*gvCH;Wv**x_r5*@pw8558gcDqVOvmwLc*;KHZRR1owEs%(Q_xO= zz`lIyCRXtR;~LF`45nTg#-of$cExD(7h)KCJ~~)%KS35+yj3e~o3#RG!21-{b~Xgp#zbdVs2Yi%W}*J5m9q=9%W zoExsfPL5zoRKD2@IOQ#31(KIsVNN^w2y%Eel(#3u7=JB`$C4{mxbTWrA-e6;Ya>!r zMbI&pN2ML5HU4dDYk=rGDHf(=R0bFAwTw%RWSz%nhaK(%+!^g=Sf$=3G|pv$1Loi4 z8+j+y+oi+F{FKz5E6Ec|Z&zw1RF*ml4n$(5;I0_G)>@-8N&nW7HsHWtuZu4rP|35H z0U#=j&{bA?CQ+yVj23g^XwgJOvT(IP$fHR8bL7w00#{$cXk*ECi_qb1wxzIyG23N8 zXP{IQ=p%i8wY+q+|MAslH03rqJZFnWQS-zv8}E#sXuc;2i7|Qf9hmFQ)_(@$XzzU6$YcqR2JN%UFr|D=rKz(ry}E!Pwh9Ip z$U7+-8xNrdfrM3(sZYxR57o4~%9<*p6TJ;EkStqWd@)Kin~l+$Yfj~i^NI+?izkzLLMOaBidZ{d(8a$3Pfw<^ti)>rETw#6u}rpsMHo379`7E{9RTO0cQddIvr zunH885<;e(MXs5SMy_CsOhZwaFdl{c9%^Y;~q8*r;6;}p&;tm59OHg zD8_6H+n=n%0F4}F0a%?6wq>EvJx0|@L){8$>IB^56nb@H6y|hT0P}Dlk<5G}k21GX z-HZ%8VQ0mH6xg1<OXwey)!+DGs z%@;rn0@3v?Z0D0(um~j*%KN9VRl0nSvn%AH%xtc@FZX7{g!@T+v2`p2KxlHgA*pbN zZ$iy;%TV`w=>9 zT^?hPhi8WCS7Z7~jDvnT#9 z1iki}EeCJf3>yu^Jf?D`hJ7fGrCMmKUx_jOgm(AR9S&r!%?RA;R`(t8C(9Mrt_h) z*0L^ImV=_kXYn$0eQA=fn(k79WoDor^k@zrHBKE2qq^y!fi7CNtvL2}*q%G%X5Kj4 zy5XhbcE?q+pY|0wa;t8MBbB{tF&0qDjgLd@QK{9Qqy-jY9s0pO3_xUz3?3}^#0#H# zq+u2PYDG%}g#kGP1)r35gbYgWgB9n!qc~29^Q&~|29M8X&T`s#g#L4hcswZ^aRG?% z@M8amJ9Vvyq5=@{>%>rjh!fCB^L;((5rIbA*4zYNW{ocs=H85#?v%KK=5a5DH{+nPUhVqtHJp9 zg|S;!)?=e}ZRRAz=CQR?IM@Nq?``U0j(zi^5P;kQBdNOH5>VSeCVaD-NW?M~$*o^B z=RDwt9jAXvbiN5TaND2zNPgGn$mV(TXLQ45CQkyiSh-utBRk2mlVM8h{-l~A*eCIBxs_w27Z4RQhd>k8EEc4GQPBUjUCo9P zEn+2!LS219z_)#O2I+zow=5cyojKeHysxluRyEchw;wgDpF*vSH=I!nlxC{Vp+AX6uA0>~L&rwtM~1$V^k#3M;>k6M2K`8hB)4l%?CKXsc=UjZ zJXTQXF%Cio@zIc%nXpFiA^a?!FLiGSdfgS4z>E@?{+@7LGUIJu(~`KZEO08PKP*O0 zW&&RsDL5%h?aYn;80?>Y^aqempyGB=lxL$W(7rj@Xav95g}-EX3EGet*0oK{6XCW1ym^BN7w| z2I)xIY)i|Uu*jL*GAOO!w~N|?wBb@f_sYl_R;2nCxfIHelJ>MuA{9u3X3NLzEdIOI zwlvz*xn_%hu!!ieg29dk@J^DQZOrLth=QBA=?>|?=}=6Ik^ocGq>#)o+$`^QK+rjV za|rP~t|jnKVpY;vQ@L|m84N6BF;fS1D?T9%J#9Zt$E`Z7_`%!M$r}#Rlbc%q|#Aybx+l?iaJG}(7a^`DK71^+N9;T^h0S51~naB2DZqi@O zRWppuF}n2hVqHcwgQ_0cR3TMVy(O@LO zS4ZqB&)^!WrKB`|n^GP`guT_6JJLK|H-XuOx_FZ5sGKG_B^cte_jvB!o1}CS7O2o` zt>;P_*non&El)R{@!rIkON+!=nbsvIR82YY+XnaT=Fu-Ri2Tys;sud?Ost_#0L2uq zF(WCkt*OA)WJL(ic8n2F#uhuZnF6oIB-bpVy~jLO zo@^>8H>HxPh;3DS|H+;)qgd+d+eK6CtBO3NLa-vh1Q>4RK0>BrMWSvY@tyR7HVv4i z{xHT}$aHjMA@{|>PC>6uGBdi&%^`?EqEPYlQl0lr?JRLOCmRep9g?ccLCkmcxt@`0 z&ky6t`+Ai_%n7yhGkg3uL)-5L)!Nb9>i2Ygx2417u-oG`fv_Xky`jU@_8**hll@!r zB2~rPEJYu;^#A^u9J`px+8US8<@cmymu0`x)7b*$u;-gJ(tc7dBXf4LS)lXdXFi_` z@KCz#vTbeQ`mYmD=Si)AbKuZ)_^32P+elg&gT1QEO?gvzReSSx_x8K~{Ic;%hqqiaZ zB02cvxi1MUhm_g?@(>8Ra(}GrI#}>P#m^>e>mByVhgen#=HdMvW1f|wOGy$}uPq6~2sMt1tYoyD=M$4~-3 zJL@qd8gj8;PY(_bjKr4dw~w*=NSFiKkYa~Mn>$^xmKVkt zF+Aains^vG6#LcGvgz_)4_)qY4#8`$Q~Z~y#!g*K!kb zm^=;blyPvgK4lV=h+jta+~iNjT$O#K!h7FVptrOD=yT(s^(hteuX4FTYyO~y&e7g- z<1^%BHK0(TPZHuLFxU3>B)>|GZ4=&QKY3Rl!I}Nu^RTEAXjJK2$KQH#H-;Vyo}N(e zZ`%{_n#I;IS!K<)sgQ~p1y;H>S!*MK{MeA79hD$1_HG z*#yR@j=CvqI^e9hOfQg!-n4b}*6ck&9rpz%n~SYZ%pV$Oph)4B*I zS){tS9^Xcp@-kvU9}KoP1s~}%bFUumwCrwiILh<(s_0G~pE<-?in{2kHr+6;zFF>> zT+k7pZEP`9Fx*r3LIX8phD=jk=F5lNl8*U=K0P;h87~1%Q+&jNWdn3vmfG81^t%jA z|3R1Rr0o4q<~dYGnR(@~{mqlg@4eK!5q=bu7d!d8 z{cA-W8m29L+2yt%=EM!1kduSWoqxOuk0!S3mJRm41G?l)N=O>$94>H+9i1>x(*N_$ zJ#!Dywwnm({@kU{K0Le~!mPLJa09$u;`TGq>-X!bZ1?H{zc=W-*-sw7+J9prQz@MQ8M~HIUi71yy(ju8F#4mdj$N5rNxDD57?@N z`LpUOnkF6q<*I~Yq8(Fjy;JvJ1AXF+qf=sX0ae`V!FXJ%jx@Q~FrWnwfR z&?(*azaLK-U76>*N?m_RsXpsdOngH9yCsQ}9sRLSa+&ccqrZL$Z=mVAVQ zJwAy(N70kL41#{ig!$u*ar4YYd=`5U744db`oEYc`R@V*V70>714Jfh{alj8{g#dv zyuXEV(y-)91S0ePxkl{G{P7XJEP_8Imt@9I3KrJE)$(?Y7BGCZfm z*6$qzPlG4W&CHpZ7SoMS9U8z9pwEY?duY7%t7nFR^4pdQ^RcXo zP|P!~t2bQ@-D$%5%_oQbE`P-6caEwc$b|j#VUw@H^u3qg?|(D;1AMCuczpYxgrY}% zjji{;!51<}_J0^XxH_Pbap8S-`rk~G&#`FpRIYx)z8{%vj${{Mmln9H4b^^5_g%Lcs=X!|{{=dc8RKf$qO!weM2{l0G% z3-@z$#drME=kboOW1T+FuFO+8{SF`X{Lg(iL#GF`r5Epq0gtv~ug?aPPNIt^;r=i0 zt@s8TRX+z@qK_=`y%;K43q2h_WW^H|2!bz%n_gSi;iRk9f5p}J zb`7-Q`aZH~|1P#**5miNZx3kC5M*}z9JpLG`I3|P?)fP#^3~smaLV4=JN?I~-@ype zZUcRr4(F{u>ykdzeCBdJ2lJttcrsUyq}Hz_rH zqu|OXkZqf6|N4wtuIe(-&#$p;Nb=md^yX@# z+-jnfN|6Te`%Owjwopdnkxe8k-u!$|s%dH(TWIzAbTRiC?LUXUJ3rNUG`gYPZ#CEWS^b#cRpSax{h+BKHMSmmpdYS5==3+?3ea5CF)OO1j+ z{L@5;cMwgepTvK>S662auc^7`{__*yiG@OBZq_=~4qngshSXIPMU(5d@%3i#<0TwV zs!ZMX3(P~$4NTn!LPRGw!z0Z5G1^Qb2#~g5mA23`eoj_Fqw_u8e$D4|7z0)1^~m?* z(D|u>HoPUL(u0xJ&j=yX#T0E2JQSeOFB?Q*0LPU+7)vg@M{%KZghhunb zDBV!>`P%%-QB&2!{~2T6-=S7>SKp;^)x*xE;Y<`^+Rcu#M*S0 zlyW@ylf-wI?RPfYX|uC&2{1kd0A}Dc1@9ex{~ja$q0ZMMTKjlx*iTPk>|beOhDOHA zmI$`*^tXJsZX%*@=bk-lo;rP0z4{MjW1#XmE3*z2=1i* z@^ElTpoEOVBV3R@03OK0JP(>>5=xgW-LsCKU~by?+M`Qfb@1*b0F6bT|8%^)oL(Pp z+FiG34J9xYiUZZJlNhR4=!>jfI&)vzqYD|;#dK`JrQN8l-9Q!#5gYAc@gTZ63$4eB z?8Rt6SFW{8<_ChPwv-)={(xg^zSv{iHeg`WtoT&e>!HuMCMZWquSjZ&M*l^G2LlgX zt!)c!!5hx99vJ;AqOAal-htAAVnv6u1bRTA&2+QaRmy$TV+K=nIZ-HM>~<9MR0nNk zvwTD~Ki>*IkOMc#f#ZU1^|>kHDf7ECO5K!OnLer#6o= z%Z4PYi;GJGX2D%|JgCZ0OszDC$|Ul#t$@+avW6jSi-6?8{ zh|{S3q0)TtA`GinN@6vOIHtWtFqRg~DFSUL&48gVZ)XvQuxcYhQPc)IHBhl6i=Z*A zUIfoq7PJ>B!8QgaBe3C$iAz#^z{_||tuduuy?(3dQodGo1L4!Qstuh*m7sN}%AuR( z(i;+2MM9qrmd+H5R0kqONC5?hHU!x)6-#|S0`rIee4#G1r!@JIKo}$ehI`%|Escg1 zT`g=Jqc=sc!K)xfm;YZVuq;oT13;uh;Fr!Hh~gyvo!VW5>Jh zENhr3OxMH^j-6HwJ;S<){dIx^_s&5&%pC}N&fn1Hh^FOwvLePXan-Jk^wRz{JRN$d zWcQ?%L(mMDi14R%+3eVTqiWcfi1Qa*F^w8JEdA70W^vU zjM&?Gw0KR5F?Eqr_I2Rh3@8Xb3{Y~5_Oc{aym2*V3>VDdgS7~rG~^Y)iV}wD6gkB; zb+Goyt;nPXo=di2_|*Y{{i4+B&^X8^ur4iUYZ5R}1mWLGj;dIa9*jCkovepFW)qtVJ(r~9{k~hd3-hGt@fx32%FCVul6#BImjVExB>o0bjlFbQXH6- zFgZP`JK_sMt^vYHt8iDBIjlR3VvA9G+uE9rjZoF4ziifC$~tXF{O#g;&t|vA z?Or!B8rB{(!en%yXL`}$>#l>F@=n$=v52=19Lx6vJOiWHBA`Y+CA4u;Sy&5ojiWB? z?i>#La^_Rv#)tn}XwD%ZQFZ8{PdFnm(;pj5x@1KX=?c3_5hxZw@j#e#!SREzLbSK) zb$Bt`n@TrEgAO;dHXF>n;OE3dpf#dMTaw?ypuD#O74(2+yn+rydC*^VV4`?0RcApZw6fP>U+ zp;%vPrfD^=2`k~H>OkFRqio?Vi z{%S9@^t`>%T#JO+wGZ54M}ecDi;yN>l$C8?cm7@1*{1@!FAFL>=2giK7wP}O93+tlmwY7AUN(E@)VO(_y)?$}? z)(XT0fW$j#uXv4UxwK&DOnLQ^1PG-Jv6zNL^hgn5JmEIfM{Tm>)C#J4(R&dUF>Wq? zSmj)Jm~rH5H}$q2Y-Bs)jV*WRyeuI{LW(=AkzVR0uGtxPfM*l|O#vy!yLJbj>5-U~ zE??`M5`>(N zw$`86kj+Bb_as5LnuAp^f~l;b9*XV3y0ERvqG!?NwZq6I)dEIK6u(K2_hAX2W((0}^Y|rOy zIO;-@fnv7oOk0Wm{$swWWowje!;|u`uG}i9kTrkuOeB+1z)GA@$2N>ckm1x%G~QDL z#u1Uh#Q=KJr?XN}4Vx#eK|RZw8&0btGNrUyOCrK^3mVLGFnZG}DG9ArQGOQJ%?WU5 z6UBS9r61Fmz4}8E(Eu-L?orFy4R&Mca0OCP;kU9(0?ixYH6|*&wIw}h=%A2Vqt$e{ zH8QKco5z!fANeFIS^5h_Jq$qY&eT!ZM5d?GM zT82;NId4x-N^tGi{c#DZ*%nsgqO{=bu>t<{Z)s#%@@R8mGdBqtTQTU$FcQN-FAgp%BD%| zRju|4Jn7w>a0qL(W1}1Rj%W><4C$#Lg=Wc%9Xu%w%#Im?k@2vs!i)s;ivRq6$2cAd zND_X>yq{T*fZ~~tMd8(O%_7dAkjc1UxFsM&@!Ic&mk!A=nh!BOXE9cLQ| z-bRR1ZL=17_(4yJqcRh2?l73vuSPBy^#(X&IS|6C1iY9?a5FM6fsDCTMJWws>_C;d z{|*rACH1Nn{=3TLws~b6g9?YcIE^*(qXq=wHs!4vu@ZH8bXrp2{fQgxbvpN=W$wj$ zv0a!Jwy3sr0k0B8)YTYuf~jfrzx%5Sq1*z7c&@*!t~{NNGs1UjuoJvlAaZ`X;w>_><6n73z|tu)QIB2li}nQq9boIvK2vkEe!IT z-S!%&Lt9`hZ5Ov@2=^+S(7H&icev2C;ec`D}7jn zBK;xGw4jcYxT9z>QlLoP6>Eg0a3jcwEr>Mmu%LWJ?zw605xrobaMIM)B>b`~Qmm0w)i9oC&IWC6VM100&Q1e-xqF<&=KMubMds4&$}r|MnC094 z1`QVcSKA1UNPJU29SS|*V7u6z--(3$_#%F7OGGJqUlD`R4~|4%j#W=c8^91u1A1O%2B8X9s;_&sM1kav7vuslOImCY_)elotzFrru%ZBhJp^hjEO@k5*m` zVeU1Wi;!2vpH?{_FY6*5y;3|OoM~#%Qn1saSPjZeQ-DK5w?E-mSpx{r7*{wlt6dY7 z-A+)i@>9BoPx=VYY;<-`84{hLN;95%-ea)<5-OvZe0rJClnOf)x>rlpOsUB~@w^gH zwRxOXX^0w*{`i<>aVx4KB2Bx^?<}vdX8Z<|UWb7|s0VXVn@M{Z3`cu>T8hlPU=rMcB zm|;D@$$`XiH}PZs0&Gx!>fdM&vC{1lDMJnGu_}^i$`%@_M~*_7#V++Z-}7Fv_V4!1)qq4gY}Z11#)qt^LuOfrOc|? zOcR2n1>YvzOSw9_c|&jADzk^FUQx2GjS;7&IoKRng`c5G4+}84PEnhqV(6D%8JCmGWa?CEs$3O3Q@31T1}UKwGY(L3AHnAG?IUu8eUVsO z=3VNwNI!1>m#z&)#7cme=8OWqg$w8MB>s5KMuTAh))72;B0-?IkuIm%Iu>uyr=K#= z16MV%5fmi>AWEgx((S_Hzxgom8!)PCGd@=QXfJ;1~}DPO=<8g8Uh`bXy7ht>Cl->m+~W)Xyq)1;@f#*s{EjYAOT0El+KoA_-*B( zrEtchMG(n+R=Hev-&Gza2aq6o!QgDKqPGdLYn7p`xF(?27izpzHB+@GwZZ7FrXXO0 zJb~OcZjP4a`W=8I*OHAX7mL8kl7!?hwq;*JMT`JAsY9Frz_6}xTBrQta``hto@SK^ zh&1eH1+iJljfl>hSeLVYfaG8OU@Uz@K)1l`fDt7u4U{Sx2b(fH_YE325WzcKVVXJ_ z&`8Q$l=8}>&jqjME{p*yG^kX;mlD`OwB5O!#kr;+iE|v2tur+D6k6yACY~~E$zZiz zF;A5*;uL2j%~~5jOOtFU(KSGYzEszN2Nxvr_v2MfY4+6)ZUpf|CWtkUG?!L|_rMU}-dLQG|^txuRV{#t$9%a5SoIA)=}c z%9V2ER_nZ#du!l{yO@VMx;>t8f8l2evnjNg+KymXQ^c1|3!+I_p`x0cJNBa-5YlX* zilQa{xQYEFUw$E+xGm&_37x$au&~=SQVX{ECBsubKh^DxEO#ltG@I zBrFe2p$M}=3Z{^5fMLiQt0sWG%cUb7xWKrNiL1A+%xzv{u!*>xtdj)cNDj`zLNV!h zvm%aYI)FwDx(fJ`JzlRI1!#JZrGzH5X;kbH{z?vYNH1tEi_ShN888E=?6vENg0eik z3AW8#V92+2jTq*7H4CLUbX&37#2Uld(oDNQ@X0b2x)R7TIDZ?Yp2sA5ZMe3l*j!i0 z3{o9|M9RvZC?9Mn$#n63J#%D8g&S1hv{fDvq>ddTbCy3E=3OWaR;W5dWmqzf`%4y1mb%kaUk%Ki^q*Ft$R06;pno1m9FSP=%8q21V5`{?+bbdVQ z(UL6q!Wn}{ZMM?C4V|4vgHyY~Nb({nYrdQK9Fw$Lxsts{B%}DcV+tNk5WQo{QElXI zbV(%Dq6qy$aG9}YYIQ@+PMEF}`sqa5>zA|eUjo$hSGMNRG983EV6}kRxIeE+zM*>{D+PE?n4W$ zTSF_cKv%1g_05?e!3Ds)NR$OdS8l0vGu6m0>N}EW1?}ZDCl1q8JP8e6_QU zdlfMDD}fbED8ozj>vpT?v-w!J4V3Yy3pwQSz4aSc1S#lm%ggM?1-)5rRhncf=H?&o z1jeb9OF&wU0^=9JLD&s*kbhqTOf1pC%x;Y0^_Scd>aUZ-JC3(aKRww;l;$v zAxQi7c>Zup?M5+9QRT)X=nmjv_zwxTKtP2J^h?;;gj}G|BjC`JnksT0fUHZ6d2--_ zdFF29ct6RXrKYCy$TKc>XXlS%O=+0M}v6rB+)4i>2o`4t20I`gp( zyK_4Rl%u)VG`<7bDGZdt4xM#^Ru)b%;jouq1u8o!>HcA{*8+$@>2p8IXbRTJQjL)c z4Xi>fEV0BdfyfrkK$(0OsWu#}^rEIvBn90JSwn;xRYa`Z9dW?^s3l3!uViL7GhweA zjCQgxIh=_*R(MF8D6&A|TfWS~#SMpOZVy?v)f2JR5@o}M?QD?g^d(9*myiEw(xSKs z*7bOCr9%gm!02d!QjE*1z%-hsGiZ3{7r)@6G zL!;#eh`~8K$D7DdoKbR%Y$a(2t0JFSDZpv^vGOD0%|aI@9j)86bDALGKTZQ01n1nb$DSIYZfgT|x_shxC^k#>`Q7`oI&a`tvh=siTTG{VL zwtp1&3ei)QYMZglv+xx9vbD-CmKzN#1KMu-R+IW!H`Eu9p!F&EB7kbXp$d5YXyc zBc7)n8Yx5sL<)jJb^1VM;*)Mv80VH&lT-94i5ML1{94;Ei@$cune4Ud48Zyj*f>C8 za4_KT6fm1kcHzqN%wwjI?E;9ur~46c;fU5Cvsi50yDtaH77(6iL`DO0ZYFrsLY^tG zA8i_RE%9;^e%O?liA>A2DJg~vRO%g;P()o(-|tY)H?;NczDNz3(4vG;1Ef1X(r92T zSVj&CgAFab#o`{kn5}7%OR!+;@2+N$Mj~MeAz|v!g;i!e;XsKxtn~+r<1WAWtW83u zupA)P?JD}7MeLzz$66)0&^k1DB{*DFEED=xt46w%+N!jr`3^a90A5kGiLg@B+h5rQ zXM#`~Ij?Y42f|&%l16(8D?U|4#@{NVf|BTvT!o+hTt0xU)u`sqzfeUFU(16=fDny` zE_;Mcy(;olrBO@!x6o#@(Nw^J7X1>5kbN~`+KKfd);!YIhJp0$(r~)79B#ofn7Dom zHmJp}Ka1oY7-yqzIZi=#TRwQO8XYhOB^FT&1af8Y5gM>aRlmclLT z@-SPaJZ)nn%vDtTvakJu^QIHG{k???jB2+O=yj%ji3zpW_Y6Yc;=0J?C%>O%Op`@J z0Ad5oBVTYny+}B**=Y0>*Xnsyb@oeX501Lqz^N(wscqPU0K7!;)!1u5lIh^hZiw&2 z6B58aq`ts0S-$}g;9O%D8fJ7M`Z3$39Q;}C0&Oi(vtNg^e;sj)BJ^{XI^fzAk(fU4 zXz{P{bvP&C6**Pt%J2d|JZI0c^Iu`+C`uyU<+Nrc%s9*LdqdLfv$2!Am3qS$O^nve zqimR~PLg17R8q($&Q{4nL->kQ>4jA+QgJv$lT(H+R<9+srIRg zOIY}Ukd+jY=>qTq9{^)IR#9e@woP#f=8^@14J;!;v}jFRM{|FquE+QY4W^jz_7|6M zL}oY6L$bH{agy2W+2`}dL2>$<6GDRyOrz6WgR1g@*oWN%d;Lv^d#@YaqbD55g5V@e z8O*f^VcMk*wtk#(16HHu*le> ztGQj`%NlZL0f7e_3#dZw9}Ng(Bb_W)J8z5K@*I zF^@9v+KaNg*oFrI-3dA#T!yl5SX$9&jU{igzA}pRL zG^Yw8L%gHfF`UXU|Ev{Tsi;g>Ub9bNmf#)jUpnU>JBH1mph1};ODDElK%JMK7qkD} zoSb0VCqZHC?;~lmtnW^!O0Oy2(n3igB0dJxR_%&o^y%o%*`aKB*79KKxN)!}nVc+- zOx+TtT=(lOx9N)wsM?EMEsZ+d_pgn}_m%1^dPnN9Qy4;GWVe?r?Fa2RsXsco28SDj zY7+5Ymb-h+H?A!yMGH54ZgJFv@I-z$j~v59&}hQi)X z&kr`bpKqMyWYm=LJXs?PZI`M9VCn+dKz$HjFO6wR%J44{;YqUlPcT*?;v$Zm3VC~w ztgO;UcgYH0^>)UZ+!>ogxsn~~ZPL0CxjJmCsu`}WL=SEarHT z59THdaS^#(4!5XcT_RV!rX>V`g;;+PEd^^z6o_7mH=Z}EC* zn3}rGU8HE=aR}|@*GrB`PmA_lrYL}0KiQ0FYk)gKINg|foY0Z8f$Pm% z;;x_GZm^8D0hMNfD#5QLfl74zyAa&aN0F-SB^B}p}_h~lZ?QkB@f>MhU{7t$rZjb2*ypb^`eRk44h3fJ_mhy%#kOL>&#(nUK$`zHNq(r+VY$uZ4w{A#M-2qoh z4|-0pCUL0R;nboi>O=ln`kydf=2J10tZ7y$*7jI$4alB6*9Z$HV6mX;QvpHeVV6S~+wU|!zQ z#6Bdmr}9ZpmVF}Q+91=UE5_{ZX3Qp*-IOk&$Fp>J#rL@{JOi8Gkg033Yj%@X@eCz~ z%&Y_D9-q=x(bw|VdJIUv3JP6h#_f~1<J5V{U563hQ=vXKimYP`v9B59roT!#{j+(0_{Uh>Cy8 z3w#+6zpxX0$>@E$&-x@5>a{Y!)yz*IGcAdtNotfk1 zLiU77z3j|#+_#Y_OLxgu-f1)Yw4LUVI!1Dc<8n8wN|91d-aFg{3tc-jjaQ?pa!`cYcQqkIHD%>(@o-E6Vc4TCpqMW5< zlWC4>i(=b1QJ#bIWOIGs@;&g(G9FcZIvl$lQ6{s5({O0qTz;ICMcz|nmsc+9=k;tXc9hzvf37G6%5Wo?VMleDGo_Udn}U%esNfkRS1cdleNlj$ON zYC|=G92(dqUz6A3L=SzayUR_~BC=HB-zs@?rF)EneHJxDm1MYZe>hZ+T6&eC(Xq}2 zRG7wG(=KiG$~Wk4t@AOjh6s?<)fcXIAq?uG7>UcriF^EA${2G_T^n8XY3oSP3-QF$ z%Vo)VSg}K`Oiv`qkE*>dU_6N5ScC78UNdl;rIbDl?j_v!(*4ds8N8+||~?t~_jT$*a%x?i5w-svB*K>sXs{CzHrZ z31Vr%HZ%1{+D%4-C|#$(3(wl!D3Exp%Pn_6@ivs3@$YQmh7IwEBkA>4OsSeZg`y%? zWZDz~A2B2&I%~P#&T<|-q48_D`%6)C(}_hHHIGMDspa72vhq&Zy0p=q;0k z;|RMG=bv8-gKoO2FRd3xhno&prKc^Y!dFJJoIx@he>RMpfe?^=t#*lMYgkLR6e!SV z9hxc}Wy^RjG<;x7!jr5ZI3VS19jJrN_c%EBLcQwXRJM-c;)HMH<>}_bpcZBQ1FS8J~bx&axpr8h-S-+XxHmN<4bA z2B(|#T0MeqcoY|F5;HBEH((j^_IR66g8j!~M>3Dh2iP0q=!jFK3$yq8LnDJ`D(^6+ zWkZ2;2wVx6M^bqaTSb+wdKtI4ssckw278&G z$+Ztx-1P}ti0M`HWAank(5IXyX=^QYL^BWymye$`hm~wV;@NM1?5yOJlpy<|5d!7M zFRwx^of#hfO!%t;rzH}5f!e`R7%SA9Q_juYO*5>?J8&Yr!3i;+i6s;{n*W%f2H!3m zbVj|6oE5JVYf-snZ{?88@u++H>claArh2vE99Rf=5m>mZ?Qz!eYq9JRJss;)@op@T z*`i-S&#*MHt+%6na`Bw-7p^-PH;{TGXXf(CJu9Q{rYzdKuL)63lFbetLS2)o=+T47 zylT!mGAP^{i?MpzKJL_cZup=$Q_-sLHy&buSY7J-uHt;>sGB9J|Lkcl+jTX=_7FH^ zADAulaA`adK?a?lc?&r3TEBxQP2QRaNZxA6WV2ed(-}uo;#VrhV+AJdmzjv&!|3^Y zzwAdntI<$=M}4F*c>yluOH_PSF$^0aIpy|l4X$26Il!^Jka%BTH9zjiCnzSzw;;QBv|(NhnXc&9hFT(MeVptc67p(^ zDWmbjcol1(4fL#K^P8jnw25M7c?@4Sh7{hZxuN#uXkX>5Wbwz-3%a>i_ISk7- zWmn5DO~J>Fp_$au8;qTNGMFV-XF(5Orf7xNtNboTeILnte`)o;dEcZRn$Hv6o}vxA z>yoywuR&#v1S_r0YR zNZwQndd`E4chCCU7sI{#vHp{Upczug99a~e94b#9_2>V!LzG8-wS%Xe%J{4$qK9Ml zss%L(G3HF2H#z(|)=fVLr+V&oD5K2B>ug60G6i}$mc|CqPwTatp{p&q=vav(>*C%_ z{yO7gL*#zAr_E5>Plp9Vs=d=F+!g&f9zhIRH_r54D|I^%OJPDfyKwZ4^$3t@{iZuJ z^W7HNlfhvZU)t=8ZnEO)G{)^Wj8Ek1%e!C7&i$k}Tl;Nn>su97We8EHtiojX6!cr8 zqbwi^stIEiPJK!apQjzd%Mg9ecD3PJcj>6fW9ZB|Jg*}6zERuT3FgUuNaIThUbYQ& z_7wvGXvh0BB1TdTap^mscq`df(Js`gA#xFuX4W|P3xau$$-Bqh)05*`k56XT1?uuTP1=O zZFhs5Tk4{4)#bhY&PBro@(q)h8I+_PYK8C7$w6@A@pv z6T%tLsdyre zxnSn#ySLr%LfeCcBQNTiw>F-MixvCH8+Y!HpKCRJlv@Q%^5xNoin>e$P(KN#do3Gd@-bMiKt-}f9)_*=u^U5b-R1QV3)ZIGQJ!r z0aqh1**;y&U|Vmvna{iSc5bo?L?;;;<?sl=Voyb3e)cu%R0h(Rrgj;6B?Xa=bG8l$ zP|%6}k;yw+Ne!KMx_aE`dfbC*DwDGU@VHtAPlLW@|M=Unjkd=pUtICJuS&jNO+Ysg zuhP#t>{U(=>!=cKj8AMc8OvhAUAuZ(kj}3|c^VvZur7_ThqYxllcIx$pz!VIRe~%a z_4wGtZkT7l4_)$h$3PFMHXj5s9jS6t-Ccgl)%$u}-Ej)a(a5epSveIe?fRdAhc9)5 z{p5olZ(mFC$}vGK%_re47joSGysvuM^gD>RJ>C78rrjEPFc7@zde^|)WnJMv$0lnj zgALH{@t7TS&4mg|d(KLHj33()f;4-)3uP|sV!w77oZVDZ8vK)BJzYvS!sBmxMe&6` zdTh`;aHmmflIu2-QjI%AH)rRpa}o$g*?b(uO3xxijoAFml<3{{R15WwROJ=2d1F2u zBB~rU7AjkJ5+<92Ro_;u^di`(E#J#?0ZT=N%J(JoTIXZEl@9(`oWWNO29x zMV);{fxWx#1#K;LxuxXl(nT~-&i86Y4pQYhPH=;xz?d;-Qih2wf1lV;_9E!k5~H_X zg-xFG64_Iv6P(w{CbKB(6nfnAW2=I0%%8h#r=IWR_V)?KWN8QyRB~c7X7+*RPOukSlvb8q}pk0fC*1 zMxCyM>*`hRoXhsX&93{5pf(!& zJ}=IBq4NzFjrY}!wjFIGiOQBI@GssK_w$%ff&j4$jn-`+Lc@36e z78)K``>4QmFP#Q07;e>jRJRU&`g^z0W)gIL3jH2qxc0r*WqSs^*SDxI3&30K&x;}7aeUy0xfGkScrZc8Fn^Ub z2Xw8Vse(?~wZt4y)QpD%jZA}5g?GQb;b1++#;BFW+fN#?VCs&EIV} zWuXgKXgr(Q-D>W^vwc8;tG1gz#Q2pjNMS!WJ^wL1rX$r3RsRwGKFRfE`{_x)&Nfa; zdreLnI4cfUkH=#*==sX!9WrxZ>W@Pp&|?k$NI&IKInp&z@L0+gQ&wH?`0ApRIaB|7vwU~=xhn*UQ4%p?Ix!Ik`P`o$m9AWOSUL>cA)GYcNz(P& zbO(@nZsTU7r;%6sw=!YdAHAd8GO|Y}QNMY&#JrZi(upF%pW%0K zC}%j2yqBdhlM?8tckYhj^_x}Q6Bvkw6m@v@xOz73Glb3*Z;n$MWTr|`7B?!~9HDI< z7de%yd&b1wWHPnR`^J}+c~-*2w$o>u={&@cTq!+C4} z7+t}mTwM{IJY7jtR{eUbos*8Q)%`w0#~*6-c%{eCXjLy*H#?F3WtK>H$eSwm4nFb( z?h^|73kT?VXJl_J;*3e->vbD_!R!V8b=K^~`_9s?hd)d4c{*=H{0lbH3G(Z+@4B{! zemwzg2H&#R`bO zHQGPg^>JgxHQ#NZp0TD;$#}izJP-3kHzX=j*}3@jIZG5yNh@d7bd7TN)QT7YcuS$y+wJ7`+tHHhZ5&D(AP`}&PB z=+N;*8X!E~Lr)?8GTvr&bLna(M3^+TRDVfjW_!R3mE17jytVu>d9~akPy%&IRaexG z7Sf=pagzDsZD+E{f8mbwnNJzSnZMpII}8KJ>S$56dS9GasgoYQ)8n%p>0K~`=;lqq zaxA(VVC#*18`A>#Rl4+1iv8?0Jww%}x^fa`^hB}gkZ@(S`}E7pOg(8WA7V!KD#+-O z;uZI@P!(S{mG{Qi8+O}-Wjv#{W;avCCJ6lcgZ#_+(PuouO+YPMF#r_#gXg#V{{0cn z`(*%5$dK|dI%d>9LNHDt_x|?YuI+tM^|eyhl-?!SD6@BQBcAm}+OoEvNln|Ev`y0Q0X;72aoj~_2T0senm^;_IS|O zuMZ@C!221_glLqBFb~^Xl4fGge}rQuBOO^>ouRxWk=w%1%Qfuw{Mn%Myw@MMw7xde zkRgPXa@>faa-Xk@{rv@hWTV8QoNg_qPlx*sePMo_dV(}h>K7t!YtLjJs|iUJp+KKk zdwffuJ2E4~aTcMDJ4>CT`||gPBmIHT@8_%Zwq)_pcs`8o<@--IIEdUPd$hErPbw?B zEx(?6-2U;4M=iuP%P+})`$g~d&zF_2&4v-UQp62(zm04TfO2mC+ya?NO+oJ0p?ZQo zrioL*zx^WDw_ki8ZMoF^$1gtoJM|Dkx~5cni*EuAC{TJ_Y9!>!&qd^r3>S zdjR#llGW2rL!aFrapOtQ2|Y-}#cAF{HobIjI$EZ!-j-ElWsI|vmKuK@5q{Y_IX(a0 zd3m^_+fI1{=qa@PU6ky_?z*_jgz+%GWH6zcu%y;DCjVlqdr?yE#dG^1B`)l#P(M?c zje6-2ORSq1Or zM`1f+Q^$|9*{UvuXw`cr-Wgzwafx?VrX3Xc}hWwmg~#B(pD zmJA_AY@$R0g{HWqSpwSu|6aa4rw#-BDv-Kjjaqu!SQW)SAQ~VVp>&90M?SWYWJ!-k zYszUh8%+OFcYD)#HEqs=&J+H1oX0kBrbS1*RC#_ge|pxq;S895$o5I)LV^K54FDjg zAUtzM<;(WyYWc9@<_YNuvnT2~Er7YjuCy|NP?jqJ6eVEHbP8l9bV;QaU@JYr2I#yr z=lt=0GRuNAm5og*-w39~8Ds*B-q5A>7!BwiScy{#U~va)w&n3-wq~qGn08ZX{k&U! zb52IXT5n7Ocqb_}7?CY!{ZfKrgscsE>tinq^k{0e<)^|{07})%J=#+&xjqBfYsZOTECUC9WdKD0li!-+O(f`H8(%42-qQi z&L65n>deHGA3uGCdi_|EYK6kmQW=DbPm3PnrhXb7?$^;)E@u^c~)I@{?kDiXyh2oWt>>0?36^Uu8o7v z0*^CG0RlnLR;wsPoBz&WsxK=X&JR``n@3;XMvcy8tC0DLIlEoX#`ju#08O(A_}(Kv z7|ZT*FKx|54rkAZhovJ=fY^q9-oEcDBOm`_@HEZ!@R*}^;%8s&jD9U%Rx(h0^1-Oa zaD2y*Tx%QvtPxNXPf}uAn*G>Wn#8V(8>u`3iy(KfYhQaStX89A(`?-@9X?b^8E7Fq zUx3pyaGCM`(<(zrh82;_7U(4^(dv0V+a?xcB=(QmtKrqHNPtU!57se{Y&6Q!oF{)a zEO&!*y*Cm1tY1N!TE5y8e0j$YVVq3hwrZC8X{7bLBc>{szR*K7M#`VUj9QB_6A zE$(vW=xQQXu;vjmnJ3Am5#5v8m(A(fN=42oKZ)`YY_}U+L#0V8r;tjL7u61UborrY zVi7C7;E~{lA=CF=3(erK&?&hD4OH(zx(%DX$VjYpBmAx9;Oe>@<*WnL?8sp|iYt(i z$`Hyo#`zGia{+eyk!$fy1xuaY+p84q2sJgZsmQ9U%AhUMTYgh5R;n>l^K16eE0>Kb z58fn;E%|PlIZ*`~T1YWdnln?QVx2?$*heB@VnwXl3-y!|W@-c`Zo)ovjyGq6D`gO< z-7DrR?k}c(nMHNTdiXsV#{6Tq95Aog+As{+0(;?zIcpAHx$L@h|5u?ILG=A%fWC0P zgrf&*0N?JDp)+Yex@m?NM=)3)yyX!K67)>h+9?NoUk0v&A9C*xmKZb1O?#K{}9l>NGD!2GA@Z;^4w3EH?^(7a4!KNp0v&b!G;& z5@uX84rgYfHL^utIlB>M1xPb)&M9;M2P!!3v73crP$%-!JM_dR4zVr(B)`TqP*^tv zp}NENy{!MmFB<*ZFTzUh>n{pI{_PiIzWrkIw_k+#mtS1?_KQ!k|M81q|JN@Lefvd^ zfBVH{0P`00zx*Qdw_nUcKYu+{(d#;&4(OaR#%}~F!pd{zo_|Q6xI zUg}4zVzzrI{@X83{L3$DEUeri!Wl|yFaj(d`;}gR{m#1yWJk9s0+&XfSr069 zJR6BhGEfcUEzVz9Fs?pc0x?hFuZ;05qu}<-h=ye7DF%|hhffP4&NR!bvO9&u&$X7s zU~jBdUdLzL(lanP8jwIQ+jK@R#TnUu3*hU;tiiLo!c-5N%fR0*Wp^gJBT6S>IwSVPxXLDYU z8-AQ2n2k16VR?{Of%@b1sBNaPX!-Xox7CcL>z}beUQR;%3jrY2G>`**NSqLM5_1YJB@6JscRh&obZNx2 zaE8)*3i*>&ES0b1x2{J3magcx)7CNT-P-cj5C`Is6ZX-+`64~L>etktsR;j~rK3DE z6R`ubB3&8|O`$i*bks{fWGZO2m!tiip3ive^|p)S>kQuYeJdYWLL{q=KTx0E-;uV9 zDWv<^GyCadARGW_O>E(e|C$n0Tv;21R(-cOtT)<2K4UKGgh)R#x<*LgSul4aO^xan>PZvk5+v5CbKtgY!EMB?WQ_MH@07OrUmp%&JuEfe8LPK zDl!ONH%}^YGt6xX?{vSCsq-khkRG&g{`5k%GR-;8YdTr&S?{*D3E=m@E>ka|CUO?2 zhP!epLzUVVWLJA7Q2^xU8>BE_pZia}plwvGiu>)FJIWwTIUo|X8eA$=Z;+fIs2@96 zRB9?g6WI(4{$vKftNjDKIY5CVRcO@Lu3Yfo98^#av8fWRZzwn=Cp8MLr0RfcAK4)m zlFwt0yBa74qi?;~ z@;~*W)wf=BDfnOYqJq|_Dx1|zD#-fZda;CYA%jdEe371&i<1Ruh))^rn5)s_#hCj+ z#H+Q~F5*9Wkw#qV&7E1tjgB3kI$`agPcxe98Zjsm^O_SuXD25HlKno*`;YV0%DkBq!#xoS1MQZr7 zW-pe-n3ym&WVklv+`1Cqor=oTx)JH}hElOMmHk#Sd9yw?9$Ir*uTic!n&~P_BlOK# ze>ig%M7nvK>&yldKw){1skt2^_-ngyyPlz))2<||#l(~(k-0@f2`0!-=pA}xND6E! zWy<*qdpUk>@4y5ZP@CTd*f^G^r)T%TJ_DMK^bOp z1v#@?nStslDfZ+^Yh1{rfUx=o{?u;@oBX70oW5x8>U+3(SAc))0< zSl{X(vZs}*sLiW5CrGziDySyrX1raXVdl=My;^I`THHUi;YNbREYj9U!2&RaDp$oW zkmGgWi*%si{c_C8au@9el~hOf*r&g%JWx2dPMLLYxL1C4&XlJZLa0%5p}|jUsCys6q2fsmiiCDy=}U zgOo=BW@R{an_b~qOt=8PP-h^CEYQ$OFLd~qT!BZj(o=A`SvM3; z)#4&Gzm_^UPTN`IUSVgp=~Y$1Gn3@XZfH~Q8B(jwsIpj=q(j5rzG$^Z-)8H^P$ zS`~CfNe3g!hAsovCdEl=8UXvjqpDNma+<)=L)mMh4wOxS9+VsUW%xpbv+RBi#k^nd z(BF6weB&>?2=NzQEOz(!#)}63!iy~@m(A3vR#dsp|BV;Nw$d$?x+WBf2BYxy%zHQL z(E&Yx?mb#;NYnsvt{O%BidV9fCdU7wMQ}n}N5SnLoDSi_>u3zSu6<8uBbG3)C1HfGx5W~ z`RQ|zfeMV~`9c)RPgDdf$?;_tr~3<2tTEI1trJAEQD?SlxiUnD;&DulN5rAjRAHQX z*DyPJI0i8}`EAiTEB=a8@308Foh<&ri`d&N|Hg|feCyNy z!HXyVjTgroN&k%(QE0TAlD_dG-+$pn#ed_)qHny2`i&QdN=coq{y*@d(PaO>@M85g zsdlYAG&a{1^!iFhcg55c&M^&8>YtLJ5CI$r0z(tAtQm>m5 zPoaW(->qgrj~_tM&aj)yy<)Su0|OqX6z~Yt?573Q8Ho%CkL#EhGCu(4oPE(3UB2<6 z#eeXkw9&b5+uwLmI{mmouS!D3ytsQ7Z5C(+XI>O&o?fK_jwJ62{CWCvp68nUzwqKl zFtM~zOA4#)%s+UMl632A{wxEsp@y|C0^|=Yv#Yf2h>jtmU5RyJ62~Aq{QLrd%EH(g9iFnTu(JH*F|mPwx9b442O55tz{V zoPOb3waOo<%$uh((qJ%Gsl|J^iX_AZbnvw!M%kI-3t4fhgQLu&u;p=!0*xvQ`|&#j zB50FPj1bWy36?t=q>cF@8LJhqMja^A6+BtXHvC$oNDT&MV_}xn2y1N?LJg88kcR=T zYhG41o9@IA-={kDTby0*&BjOn7Vo=Cm$v8rY7vo2xN|g4@>nWpTM&e*W}LOcvE@6O z)%AttYHzU>BuY?Vn%w)l)mv5u;iue3?#IP?E6FOvQm#9}YrPV^?quiKco&Svsn}3A zDoS05^6MhWf#8aoSYc!WcElLWHt7wmtEDG=VA!nYeRwRQeux~SbACBw4Su6e3*+qP z=oSSPg0qSQg=GwLa^i+$1!>hUSaN5?v9IBWMyhdM*7b3fwkX3;OG5}PV{T?-nLHW@gA3@?aiZhx!l*Vr?qiC>G zN`jp!2fBGevJ^lNaB8#Lz=n~Y%bOm8W|@reVpl6GS1kd}j2J0ZYcoQG=!|Il+P8#_ z@lvx%_0sUB>`dOLuQ3@SCBQALmd-$fQc}anTcFFUL5c%zxIxDokD)~c$xqE76Ukh% z*0TODUNjn6pN!G`#)~rA?x1gK!)BQ5UO;B5H~5aKn2g*`!+Il*$lPLyoLU!fL*rT8 z79p_r}D#)m7X-JL|;XdU@D`6KipQ{ncHj@q_Sds(xXzeVh~Qq-D95FgFpNMma$CEBbZn}%)atD#Fm`F!!bv; z1kT20^r?S!!grg*&?8`=hHYjzJhx3TkZHi;5C2vh2y;}9)c}`jj9pCinb>N!<0d~* z_hVk`B=iqs7QT{^BGz{WxG+cR7Tb6hqG+v<@0^xl5J~EX$G@d%7}SnU%MvY>e?TqI zmrEncfbr#4CRZ5!Qdmj%E$AMXDJ{^Lo-4%KvGS;FB=Cd36*1n&=||gI=V}dlI(Q`7 z5K5u#2iDLe#=Y3`5+**Yq~VsWg-pXJMAW;kMSeYj`~;&s-AL$VvLW;HaJk;e$K~@n zlB3jByBI@~c;JYpeVyh*e*+7~P5|ZR)Jz-a;I;8Avl0<$MF_nB&G5}!kqlkem#*#B z1cm@X9aW|5kp+wZsjM`D1q>(o)m(9&DvQjB)pX=z+fy;gsmW`Y(-f)1Lt~P4`ry0C8Iy0e@Xhw#%L2&TrIVJ-d48=k2{Vr;XWLPLG)8iM8%T7I1NQeBBb6P z8eN+~NRf*^%68KSpmmkw@jcV`au{)S2Veau#qLQdbqGGeJm#uf4^OE{Ej@9~FXYVc z-BqvjwZKr`!A+I_p)`qgBzPkAotjbZJ%YJPYD8TrM$IyEWfJ9ABl< zk{m*~E;V0>AL46(Eb(_DNboB@X*jK1qWbb9 z*Z;s9{}!Rn*F`jY86Dazoo~M-ST5uK!?d8;e{Oym&1Qk`jRnDp1*3?cbU5K+zD0KN z$L(3jYNYSOXM9K=q;w2^*0hVCiJvOwNkia5W>MtIaQMy99I(OyIkj+^9l~Mq10$_b zl3d<=!D;#wL7;MqCr||uIsU^h=q+^ctjHM$yT5r6*l1ULRriP1+NFNpwtpHV3#>G; z>ub|l>Kh$)@g+vZb;4i;)Qx>Xp8~AWar8P%OYFQ&IpA_@xxnH zB$3WpdRXuEB#&eYifYd?ajOi4fXykH($3j0z6wbZkPR+ zdjj1(NOii|2|hcieeEeZqf~V=spgtiM3o3V%g?sy+wV~t`w(KbN4D6|+#)29sgH?~ z%kw4JZ{?neLChQztEc|pBa81A>5f}?+}?Dswa~~Mrc589#yl7MIHrOXKiL6ijN7?L z`3I?~cJ6s-9jh`^>@~evq7UMyPTRULnv;6sM0!D3vU3KrY)LHLCB8zNDg=dhb8XI`JIO-R%eteV?b*@ZGV}qkb z2dhON<4q+nRL8C6Q->DusP&9v`;z&Q&y)Y#;Co@$a9xtr25f`g7?xgwAgxay2^}xq z(S{IiR;24%4rM4pdAlt0In%($szTOKC)cnFaZi1jHG(SLHYEwx(kW?C%}Iqxh{-xe zShk7^s@Hb4lSE=6V`jHXzB1nnUqNIVf9t%4^#&S2p+7|{ja<%dP_dT6tQATj4|Yf% zNzse7tk+`}fegz8P0>bq5FRqJw+9Ol9NH}I-fS5|{x^CN;SYKd^$&XS>mT$YLat;j(x3F=&eZBw11_r>uPj*xS>!&|q7;F9#nIlO_VRs5a%cGCCv z4G3c)<e4wJG{wpAuZZp1 zAxHI^{g%{gtF*;9PCf z-I+r7u%$M18Tc{ewoikROofHGNFxDt@!-jYW&1^_VNLBDLavR>LHXEIPpF4Rub|d; zTCYcmc)k|GMk z=)JP4CHdV=KTr8I-Q$nRfBsdMV!G@zmoQa#w zRo7?+5v2Th9I{Mg+_wZ6c++bW45HLGCbaDDnOm`poOi;K*!-hM0tM2N%74{+y4_5A z%35P|+V%P-y&rDYc`F>RB9}#rQ8bx}OGsw(cnlTj zQ@f>FSCd1ReSlBuC<1>8&tL25$F1#>CAHKNrO<~OP$++VmE{3q#yE$M^5Y4c#krY- zbcdQ3=%!OfsPi0j*Ex|P)#(uS%aU6ynxj(NX2SLASpSu{iCY|{swRCGH_G>pO=t0C zqf_U3U2({P2xfOl!0mI8Mu|xUTwFS)xT5v4G7+FJv2CD)RFj^b2Ql|r2!52hSew4f zORZ3sa^yUgi$?nLlxbXg4vKaVtBhTHk%FIVLPm+Uw2Zxbj)Xd;MmkZMtZ3MQ#l?uj zq#r((sB}EhCh&^($IDy4wLt4?`GRdkFrEM_qT!rNK9azdg zk|m$&e4Sl!x;`4|huR|lDj`FOtoHdQ?ZFbKp4lC^yiPbJEn=wCtMomlqxN^z^v z7CIDk`TTf2i0$wdX~;PYY&JyJ);O52GDDXtk_UWGKGNa5V;6B`p!JZ~0f}pcxM%zT z03aLEMCkbe>G^_wJL~Olf^h>(FpfN$SZotht$>Qkuk78pctw3~6fep3YU-V*Lppg1 z%-7wNy$%WhVJh?8@j|{NX@zrr2PwQuR2pdcWy$e*p6$yL*D~5xknlZLRZ%5_k9I?t zhGs2|`lmLAotmDs5SiBj&3RO9QVEkZq(xF<5$u9>G}^2FFICs0uN zO%nE2IG1UHwbcIW{(z{pba!looVid{Z!oLavr*v)k2at<6@vf#z>4iJCHfTbY3W6ZdgJ zfTpRV`3j2Pa3NxTq*4UnFRNa4?VreH)5hZr5RTH=YzXK+Ki)FrSX-))NxUg4lTN}4 zPY2xB1ZS#tQgPb|t;41Gm|x}#Vt*?UGvvrlqUShj5caays3(nEB@M#p4?Xm@<9CEs7zFD}7IKoLufxDS27`sb$$4D5EIqEz*c~ zy3yGYOW=b-%jvFvXeiE8xu~QT_^=W~SOqSj_Jyv-s0DRz>Eyn;F0|yX8o}Q*)jHB2 zlG;UL^RRv-(wOFD`iP97CLMDQe(RZ_l@4sdEeU{Y3zLCcGC??S^l|3DjGPdb4z1)7 z>IB8N@$geD=`&Lqjr#^)ilfBlaCs%fnwSkySSFYVe_68LLx-|cE%FzQZ)+;xU^>3& zt74FRSb2JuIR*b)73Z z_##61leIO_Q0!?m{(X0;O|G1}NM@M>I3aJ1RwJUNQF3R=r#F(wz@^^|StK`QnX!Y8 z;X*#cqXIL+_!rw<_&8I}jN!=$BsAc*N|@_T^giOBSz|tosbL4aF57GV5L?8*!*>_Op5c3i zUl+7DP<;6m>~XvPYPLTWvz{!YAkNAylgaS(W4XDazVyz3PhIV#WMP_!C`5H)v@{Ek z=3{mZuPU0wmy2!f&@0lz-QMR{XKy;r5t^Ojjz-tA%ANE|>q^e?$8P#W@PeNaNtpFz zk-c8D)&kD^t2$!m2qQL)(O=$l4BmJ=t{*JFQ~U9nxh6&}XbY-K-f*Cw(^4r**B%z~ zFEv&gFWi^Rof#D4B`>%Zw>n^Bp6rim-O01H5g%w*z($;O_saYz(-`S^QPAkzp*5pR z4=TvLyEeT=;i<6`2MT^g!&>&5=}1cQIvckzKaZ{)QF8fBn9>P0TWj3O{7IMw81p3G zh(L)W-CMW)$YbeWVJftrI(C}Tx65F)hDDZYk~O2&?hgyFWg`n^!eJ|NWiD#Z5*lj5 z-`=aA8j24{tGw-(0u!dkwA+Ube-fr4)h%W1tzSLKXZmwAH-t{QhHTD*dN0?-Dr)90 zhd;ufAs331s`zxUmr1!FRWdYcye7$1);;PN1bGk4b52k0e0m{Y2DNB)1ROD3Ee7?x zN@CnM4qx1OOwhrugT$OVJCo9ZWnyam!$UkxixwF^v^9&!p8y*h*;HOZB~cVW1qbDC zuJPk41Cc^$2~`LtE|-PFVW%IqPwBSXH3)O#sIoA~GKiLB(>~pNN{ffwDq|mU(>8)H z&e3%!5L5U?dE==by;j$uDY4SMst+zEFj=(dY{yN_G)}=ojmz!0SITjB2iwTye7-gz zjX!|sjod1@x8GNrz}GsnLzCIvR#sz(7A>wcI%0l3I@h|&TDHXg3g5!KEj=A>yoYZ2i)6Qg=V3Ekn8M}e>@7`btg(K;O`4^$ zc;`hKnDhMpMKC_;!t|~I(gyLD2$8L_7h;Xqti~N*{oOrRaD0qc_?B~)RLwPFB)pnb zgYrYt;ftDE=G0guT7NEd8SPNKR85dLW(_>~z`4J3yqx>Jf{eb+@U(gBeI%+C#X*-a zmvC3e#A9_FKqc1iV&6>eGU49r^S5hXZlO}shEy%TX+AtekHo)7WH zM;=)6%FrKZN_{PN57|QAlkMG%sHnB#?O7N9#!D4^m<^}La9b#|Zv?!&B-MZ2AfnzL zn0?_Di8FDOAAgBgG7UQ>~n&ub?Wsf70%WG<)P^II_ZZgOdR(_M zJC1g)_C0gVnm3FzcDgiBE<@aFf<|R*kCV|cGHQkjkVO$(rhQtS)fgEXXl^bKkCU~o zwqgnfmLDsUTNyful$ChgUad<98%nbD=>=nDGAvW=p6TMmjhhKB%jQc-= z`BEZ&m-`g53h96)FOKMm@^gm7L)1D{s4Gs#Po5 z=|rc+1D*2`PzTO}u~+>5EP@RTJCGmLPQsM59$`u?2>0HojXxv5C)*6qD|6i;?`f=) zQ@4U3%JN_Gw6L>TZOfA>?0rlqKgMnRTIQ|S-d?wKK@>>|8;|C zpcjud%+h+R^qcD)7gb{MC*IgwAF?Bm*fc064@4>s5{-S0B6|UWB&U7es|75v`u7!X zq}PCo6wW@7%p`@$_&B|Z%6$a`rbyoFys?TP;Oc6on-w8Js~FMGjDy>xuz*L&7Mni$ zCD7}@2Ln*8;tNoeVlKq8ikRdP3fkxUCNj!1q%SYuB`n-4L^rq-7jFG$@tVaN19m6w zz4f9M$!=1Z0?Ad9BR-zZKN4OLWnb*CNKx*z&eE{^c??z?{*&f{^8b_OQa57!@JE`< zi);I(-*>>yUC+QtK-2;PF&Hn^X7B`4%HR!G?pvoP0XCcJqtc5MyqUC~TxyT5HJ4Y0 zTRTHN191USlnBIN$n?K$c#V<4axRGa6sGpHw_WM%2;5V0-VjWmzd#UajN+=EsGYm) zKY{IZJJMkb7={)C^C=z1ordb4Y{#cjq^3%HO}Mm{+r;wPTO z_6?N*N=N=p@fHo5S4#BB_GSUw2jHZAoC*K6cVX~%k%P6QxHy{%->6?mtD-dRD{MFB zGf#q=Z7;;6&YZrRdkf!dH_o)0khflx8RxxN)=jF7H?$F3s~jf?DGn&1D$aM3iS<0~ z;sO01GS^uFTlDRNqC_E4Txh(pqT71~&93!!^xC`p9#U8K7FU+|IBr=EaUy%o5D6PG z4J;CkAK0N-m-allu+Xo+%+YT?E-+qR6xT#RWe_3?Wf4Fx_}9QDW(Mn|7@8>>^^@r- zp~8sbW{jZQ(y|=KL@(HceMn6V%1&=JJThGCX4HtIOd0%e zZHynCAa1xeiFL4NA-hPV9Y&tMQ}vFb8(MqGxpK!OLda-~uscQXNGaYPW!FqkOg-KD zakl+pax*-!Pn{tIC@!$Fcs{$$Z`OcSX|39Kd1!2XPWzKD)!g9HtVw&@Y{|0wi#$es zA*nk;tP($-%G=h#vXhwbEbQ!7Zkz&m`YDbogG{bv0?m#L`nkWqcDH9D@IkZdLBR=Y z%%OX~u|CsBFU!x781_+h^-M)6Q@^{jQX~^oiQ|JOO+`b`H`lCPPY1$_o$4f@?&g5A zoJ5Hr$~qhA`bB=4r`J`|zKb1?;8w5rV>2=2pV4f+Q|nQ` zrc^%TdZ7vDT&kI~u%ewxaJ|b$?xXA2+^=205%qMg8~-=r>?$MDr(LdSLTw!dsey;j#MgH(=Tj6m6i+ zGotpC_XAxy@IbJ~rtke$T%+I21zabk$V(U;(B>9Me#aB?t3dCftoaAg3g7)yamP74 za)#I3<{Blkyir!zfu+ay zQkdFUrcx&7@9}0p%v4m@P2Uf7E`bdzvICLHdpc*l`d{xH!^c_$M7zF z)~4+=+4b?NV4dPhD@A%R>}eWRN(N!}u^wk6XiPN+JU?u}_M|S?SRYcb`vz zEiH|_BE!D1k1U9CXsXlh*Cw(W;Oo%vS`#69td9;DjErt>=ZQdCVsb%mF}vviF&yl} z0e0OOGt}?*HsuUvOebknqUdy_lnwSMME82V$~(7ND{IF3=qHFzywLh?Jmss*9T>-^ z;mJ>=R4Q~PVPHrxJrb|&)AAlLt=DC(;%LsX=C!|PFl7>iQ&2*$9Q2BL@#rqBO}`Kr z4vjF#sIgMxWE95d%^7Z#vegW~L|{%^>;dM&c9baEZ-0^)DUJG>YgZjm(@#8r){+u8 zihW+W;;?B-Ez_DfB^uej0^5FyDy!p8WHmKVawmR@Qz>k$*+oy}G3@6-KXr3Z9imJ- zOGV)+evAY5|LAr$;}F!~x=v}gqPgPrYL*oecP);S!EfjpyHAx>t}gf5J|XP4I9XJ~ zUv$txy=pG=$(jcRE`2?>L4Kz@TtZifO|)eys0DJR=KbmH-|6A{TBB=>nx9xr3i{H6Y~8Fr=gNIzXl zy#H|5cI?$q%qO)Cy*Yg;&YoBKxlkX%gA!1AkGJW3prNRpfC-P3@KEa++J8n5r`xWy zs*;B32(0@)T*_yr1pdk92-&IQSWGTGv%RT3*Bha>oy|_dVw5KQ8{c~p&KU3acorf_FP|QD_JX) zNl@W26GsMrE53+In-wEPJ2sF+r$%`O8@d>?j!0Wex83qWFaAMtGiMA;ib{e>(V^)z zFe&N;CPmkRpT&4Vmv?}Ydb@ZT?X_1axSw$(hWyVJBP}KY7rh^S^7LO;G)RzS?Jx2l z-I(PzOn$KM2Cx5ec9%~Nx|CFVx&#BG3@tC}cA3OMo$7YO7s~0t+?lO{wygG!##Lb9 zFFA>J-=H6}qJQZ+=t+CHd%MB&p%NwTPS!({b0%zlqTXlgLhIIB`y+IM`o@fZA)C zrcPep)5(h^=B$^xw)>W&}K6eqtbaJ9Icixj*V_{CyQ zv2Y#{dR{^Gjw!n-zkWbZiJmhg<<50<&>o&X(_Cl4?}-BXPG@|%6bELBTzgz!EWb;S zpW7A3pg1MexGOa}B-rs{&UJMEMR>4H_qDeW(eo3f#sSb~??eqso{^!HHf56b!<1Y| z1F3HROpFPrWuJUa@3Pb~)@paxLeFjVao{lCihCt8WL>M5a)mtw%!?u;%P|hgckrwy z5X0{HaEftTh)Tt}2|owhL?#qUS@4=$M+}Q6C)z9-iho|CZWqUm_04dp^K67+3zYFRt<^q>UOqJS^NiJ);Ki<$eC2w5Hqmz-w{ z$*5}1NBe6k?&NZr(8!{qeScouX0TbJHL=FIxo6U|81Znxa|5rrKSO2Bx{^iAINRX3hCby4kurhCF%?;&dc0~bANXQq-bSa zG@x?v1{3?e(PIVehn%8nIvf)oq!96-3Y&Eu#7l`0B^*%eWEM&{*>g?#pnv9bJ-|OE zh3cw3asNQeWrm?J6D^ zum*_PWiRmkeKK-gLp*#Yk9KZbGh*XS#;v{@3|OE)i-B_6TYoDdRx3$n;1{4BiLWL z!Hbx?QFQYyllaCCkm$;gK7san#eNxuw|3G0LkIZ$20oK8%VhAJc1?2dp7qM3sY68B zh_$k3M$03hY`g~amNFyX6UJwq|AnZ7fpIvk&cu~R(WV)Ac1qpZ`owG8&-Ia3rntL3 z)H}B66RB6?7&$X<~ngsMGkH6;1hJUx*dO^=p+b`r?Pdg?AUA?6R^G{q-xm z#$4yn(lJ9vomUGgP~yqZ@flxdxntu5c#^QOHLlN#78LNPUmuj0PQb=Z9H)_>}sudI8uF1|M4e z&JFq00%tyI6tGAXR`z)Ih3~a$To^QJ(`G1d6*6E?hxux;?Q~pcfNGpYKtvy=vx@X8A4pqP*>cGK z9R?M{TjL<+-m6bJAK0J2z=2|yyz|HlP=;3f74@Md=a3@}yze*T? z^%t~2T0J>3Z%9Me`L<9^fxjq-T0%@&iQRl6phKaP{$luah?@24BX*kL8%=i{5u`OD zHSD4^CXKHQV~Z|%^(wxg_L7~<+20v4pL>iy@#M3Q=es#oNR!N3pK@MQVw6IqLsLZg`dvErM&r7=s zyH=a~;NG)z&M>>A1Y%a!Qb1l5XGZ~`)LY@>{z|;si2a}mIq8wL`%Hc^@E|~A&n=#$ zh;EYc>C*<>uQVfmMiEs~ez=Il!8Ed5OiFo43+c4kL{5V*uSowIQ*wP?{!lOvYz_Ut z>YM&^Os(|Htp7Tuv#MG)_>E{@3za0nK-&x9x|sNrm0Nz{xJ9QhvItZT8DT!#q*|I^ znz6XCH5q&_XE4pgPnW}?p*(f(-iYm9j&5y@+L|H1Gh@iNvV@r(Co-_K;gf7^GWOUa{0>eP*?_KDW4I^V zYdID1BhLuMO7LJkqbMYPsZIAyO`w74lre-wtXGy4o9fAwJIisNWkOFX#UWY~GF+sm zlrmg-)_ADej%UCo56wP=%J+C#jR+b8A+vBC4VI4>9sDzGZ)+Y>ke8!CcTWAEq1t0j z>niv?_65|2Tb;-%zIA)8jv+;FW||OIM}8`ugihP~B|2X&{j<)hAFbO4HgrE1^}{)Z zqvVmKGyGHdm}%eZ;8kWZIZ8kH@U1c*l zs8BrTGol9v%#0egKXoyFs$Ff?@Y}|iwU$C&4LIL4kv?=>4nD(x(!!%9=^ufDSBJzK z8LZzAb=y-t$<`oTnm%C*qfV1!;>3HfGvILHgU1Az#qjF-kX?g(zmw+;DK-e2OCuFH zvPNeUDpv0vc3s$<_TI@%kgoMm)n^qu2rxM2=V{a+tGlBZZZ*RuNtu{1yDOf{e_XZC z$9W4=yd2+HSUjG<)VKr9eXiNuncFn(aQjXDR{)=F#UAg_bmt&W-C~*yR&8yqfZu-LGz6+UhcC;AXG z*=2d&hv?^Jc2Tw^0K%{sQm3*F5lZz55U6t~k4>%drT;0WizfVD^LUn}Y37ZMbWxdG z!g5+WyLGQwoP)>Bl5YG1O!*GRSalkfiV$>EAMV{5gJj@M!hL>{h zG(&FHtRaP+Hl0B^UsK73Yz|tm_31YXoi5nF!z!MRz}uKNg{8&%bW7_LDwR@0sPkmU zu3#g8RMhQf5b$oi@VM6oY47+ak-ly>@8Og{@MNUbwY38r@S{+3elRk+&qfDpYiLuG z3(+xl@gaW;_QI4pUkay(6*QwoxOtKlH7-mUACP^8OGxF5!!<(mT5Dp)#G?7UDp`{v z%24_@(J{o_JS3N^M7n(6^Gb*-!X96!(-OTwzxxkXMnWoFY8WS`VWpT@DpZ?C+y% z{tXw$8nJh#FQWghIPFeQn;-@Q0YQQKzpltw|G3NAI62xnIXe9HqMRPfZaZ<(0<1m$$U{mP7(4F+kWnz5DDXi)EU=^1ujaIat( zzR%gNG)n;2?jE%aCB9O~o5gziek{*nA0GMjsNs=^C?x-G5ZS9nz1_o?w>y`3bfi}A zR^!&)azZ_4KeC7epZiO9XrS?-=D;@pU|Qz#xRi0)?aANv`9o@sX=C#3Lc!oSwLRe{I%XsF)K8$ywZ7xs zSYzMy7_~vcu(xITn|-s~bH8HI4+-3RyHfRRgqSaR4~3QY)3zmzt*1{;HzlMuSr8U? zJ}1Smv=t#iX_YOU+(3~o@Y?9C8NcuCO)gWm;!E5G_{_xxys}mIjobrecL;zL7D?Fv zkI%f=Zb815mc*))7EK2W_t^TsdJXbsy&sR|Ly&Q#e4zey7rh_ZZ!!VjMZrZ}|A&tT z&OgS?Slp4;@zX2O*4~y3%U9ugGyhn)}|^ zXd1V22#DEF)up(grOLh2nqws6^8I(-cez?YbEStk-}_Ev^P7@$pkAcH*zA zK22_NdYAz93RS*;{}W{7TM$x%KmC6H_k;eHCG?I)_V#+lHuhHZmNo_!^ri-u|2|}$ zibhoCfK|sr2SVtGhAr>B`N_OeZf#Mn`39{Pmv1Gl~)PqK30E7gupgd+#VNCiDqHQE&!qksUUY;{Xe)kuNJO7fWS~UHcuZg>{T*}Es3}?Y2Vr7AeQ^k8H}H))0^}?$ zqp1ih-1@gIjfBE6G1ZDa4181lc$bT6YPe!{Cmvt*G>eF#oM>4_y&O0B&G5}k#Nd1d z)8V?Ip3))xwBxSjlQ+Z0Ax2ilXV)xxSMUgS)%Fr;GZX=1I5Ye(jULxE>v-%cIs#|y zRcOnNhQRe+=<J ziqZ!i3`U2H%)U3Y*ECyfk}Omg1|#Gh?{erB#1>$2_9*7apkn5_R77>fQRSO{eF>9q;pg zA;b0$pQ~Qtai7OswvF;2lLg}St%Hf{hnI7e#)mA=>p60Z@2!(~YP##D9@oFfEu!Wl z*T3kgS5t)h$4V$z(q=EkN^sF)!WltY4x4?{7OG%fH98M1?c{Z?w4TtI=!^sL{u~1(82!{3xp24!qnc-Ox}_3ABv>dW z)uyNk%jAj-DllWh`4X{h1n5*k;dc9mB<7`3j4%tI5_1fuzuYIgtKDY^8(T!|HAF6G z%#|2|pWIGOn#C`oLDkQU(ImE%Fck@CWlB7}o3WB^;#UWwdfvC1t|K7CboQR7-hR~RM-Ovt*{hpfiq_33! zMe1NGYgdmzyutQj7I%x$?7m8k+e{iw*dCGC4t@_k`Qf7~9%7JdL;zfmAc{xCwjj@a z#b+ubY>sW5$A`KUXDLU=Z&fd;vZNx8YH#Imd|T5ujiE{&}rj&#biQfy>oS={R#4J54IUp z=(523vX5#qig(tG(v$KA(j^uJnZTmuZPc+;2bb%61WE-}pzE?7PMqWi5yjaE#<#l7 zcNMupOVgXBBo4ae))}N`*>^wHsi6Fn(_JF%z4Sys8L- zY(gmZQl!q_GF{qp+I=^{nlWDTHsw#YGQ_cnuejCKry}LcY*KkgI2}F4k^75uJeZ%x z{tcf^DhHo3CgVs&J1XAW`f;R}E9Vx=L8kCIA$DMlnRvzVxAJ1<(x`oH`}p;Ir*g>m z7+C%xLAgEqs9MK7Mvr^Np7~;Wu|f(BQ?zH{ICIsFMuxiKIOEm1IDt}lbD7OGuDms{ z4JK97A4@Ka=HJ((_$K%<8js0)_o90#+P?kP z7?_Sq8t!Xw;NM3mdkpO{ShCcVS5kZMAnW&StWF=oL}#pUAoW;@p~N!YXwV#&kx7NjDJs;w^L zr%HZB%9lAvJhyoQu-n?fr%d3w_8UF84+ketR0drM-tnJbuR)~#SFM#DKKFMog%=mR zfNcuzD;TX#cbA(vVqP!M>G@L}8$(COtD?>f;65$s^2MMBqPJN^IJb|808+lLUFz)s z4jtBX!}9$V6%Gg2s(g>(eFuRrWR(VI!5GiA_^92Y>gW+lkikAzYy^y;RTst$ySfIa zr<=|_+{3&-cXq8nk6q}@x>_z|fvr>2wCQPPs~73lKzcf7nK1x}ITh^ZaLO zjl8JZ&%wgn!`jAq>X5WjxowFA+IqFmVz2$tLF-a6Ki{hf$rrPzAWtrPiC0ACAx_4v zAS!((9F2r)TrJ2Gs5J8!{3xtwlO!L<;Z+_hI+f=xEbPE6lxqFnQ6RC|NlbD4(hTZ7 zOgt`&?oev4T@M6oQ@q1zv*kVKb8cDQx8;t=cNP3BgGdOo66^q17#uAN3K#q!ZhJXV z4LZZf+=5X&gljm~UejS^sBnXw<5lvIFTp=W$v!mFXx=MPTC5ON6+#Sbjv=Bon=Zsu ze?%+XNbQpEdADL|7jUTzeD`@1;T$u`s;+~?~&|E{vPR{%ToW0 z^jDewdjj>J237UYu^>s*8Us`~S4Y>c0p3KXv{;!~Iq9{ua~!X>m1w4flUZ n>wm`j>sj^pzZhIC#Q#*xvXU@we;*kh{PKST0dd*-`_umeYQA6} literal 0 HcmV?d00001 diff --git a/services/product/terraform/outputs.tf b/services/product/terraform/outputs.tf index 1adaea7a..216a4f47 100644 --- a/services/product/terraform/outputs.tf +++ b/services/product/terraform/outputs.tf @@ -15,7 +15,7 @@ output "PORT" { } output "AMQP_URL"{ - value = "amqp://guest:guest@localhost" + value = "amqp://guest:guest@10.176.130.136" } output "kube_config" { diff --git a/services/product/terraform/tf.destroy.plan b/services/product/terraform/tf.destroy.plan new file mode 100644 index 0000000000000000000000000000000000000000..c922ae992e042b12e0a1df3d53e8256eb2c8366e GIT binary patch literal 47426 zcmce7Ly#{#^kw&J+qP}nwr$(CZQHhO>({pJ?$>_p`Tnz-%`9d!H#eJ9Qc0a8H>tYk zD9V6GO#toysC;m)ZM!rrqq9 zpW+Mg;h2fDy9jaT=D}ZW-5svK@1}01{$EwKFcmjd!xkoDA?aqOAt6Y~dXdfsD(iXD zdIVu%1|SRtOPn|p>|k^$+$Ezz$h;$fq<<#>`%s3k(_$hMP6bT3>uD=1k zpV|UB9M<`&Ry}q>?hC0_a&Vn4{l%Y5 z)4f_#$XZzU=gE6gNQo$D=q;2{POtS z(A3aSy(S7y@wMKYHNMB~ct(R4mK(J9EqK7-?(hD+0ZHnj1gXUe(Yk#kLg}3H;{$sC zW17{mD$w|4_{6&$``)8t?i}W>3%LI26SeERYc zm?pFqN4LEWp419Pp={d_0T7Pq4EH!!cmu^;+@}#K+BlU z{a%3lse;V&{N#GT8~Pm?Cn2>VB3VGHAD{9gZGRx$hd(aYX{?(ts$sWt+~9NC^%qIF z<8*(Ig!B1*oq;c}weMqdCZoRh-)3Gzz^g;=HJQ^PDAU|{{P`j;0Y*(~f2#S=4%NkH ze@a3KWj0zoPGg~F+;S+`-c<=lHLN%VJkBQ+34t21=LkbI>p;^$0Y-dB*-NUb@VO7Y z%nl#J)Wsfgq*U|do3Zu{L=sC8gG8%ib-lkE9sIr~#U8=eWKpWEwupWowsDed>vh3EI_{AXFCmy}$H?bV~- z@AW*rn&+)w@x}EBH8mF+4htf5T#T&S;s`a7rvcfUT-1a5@Y`Y_)A^;69Nr?Vz*MM9 zAN{o@ba8|if!s;7CLFYA^Mq4khp+1Ch`y}8h2}3@w+_nHdes5o!mYzyu#e+Tqsny(hO%N) z2QAA)SRvSx#rQv5I10i~3*w1xTM$k^>z7gGuk7tK2zdu|YGO>+tDKJL?bvnWQL^=) zLi?W>z0gAX1Gv>S$kIDCw&f3X?Z}*x!0u`#n;lN{lb3t~URm@0WzEd>)p%i+9{ZLg zjlV&RI!$goRblLXhlS``ber;_1F|IV&1RSc~9RLBN=|3h#7j@QSdTZ4|nXWPM> zw$Mqbsv*U&xkC&-XJwcA=Bcb`a8owH`b6-D&mK-Pm8i&qkK(tuJxpfBwAt*L+%dg1K$Hv zr?rF3=N^{4)|>CVO!2*(B{P6BYiu+s=7EZ>Vx=KaYS0KH*-00JrlFcmJo9lb@=E`FW^@d;UKS4yHEuNFcxOISLhm z09N$hz;WnHYu*O(d(H}d@femev7KGIC;w^b#}xi9EWl;KlaGP#^V{q2`^4tEg+{@h z$?v;^Ucc+9z-L|F@4pWJuh_?{wF@ZA*B5)`-uAFFBg7O9c?>;TUyGdF#Z<7I_kM5= zgL}c_TKUz<8S%r>(Wyy~bR9v&j-$CjI(70xt%ItzW zky}W~-+%wjwtQ&p3$#@O1n1D727Wv3eIvNMoXl6jk@$`mao*C-yH9i~?7$vQYG?au zRv(iRV6b@*;J(yD`tRl*iKE6zqjCxRUjSzma{$?d#CrR0Lm7{x*c59?0_^n!{UTH0 z2{Ytn9s*l!{06v7rz9>4iXaYo#9r(cFCFgF?;F!rSZPul^H#XZ$4XSeGJHB_B# zr~4c6`7QdV{Z5)ue`kcctK6<{m;I8NV2*B?{jW#7646*9^62j0XXC7x;3fU9U;dF6 z#8}|@(aZ%;PO0lq!ChYMHQoXIDL>w!)l%L`KfyK?suh@9*nwpN~rImTPmqJ4^WTw zd;=C=Sf<~t5l}1W{}wdyPsVuj|CPf2XQ=ag4Dz`D9SZzDc5s%_euCAKl4AJ&HG=1B zu`T4Byl>%tOTn0vdqQyj(gEOTGk|*QcQCJzp5*qUk`&a?3iwXE6lykonz zc$5dn?(2EW>J!nLKkerqXzb74i_f6EVz(}4Nt@%00}sCnqQvcL0etc?(@zy@thBB0 zY~tYR_?)|F$eaflDVD3NT&+#jeIv}}`fn=-JYIg@@cVrCync(2b+URtUq!IeTz9|k zzDEn%j()WsPAI5;-tIgedanjP*Fr9B+;dI#K(^j_p8%}4@96DUPpfesvng7K0q6d& zAy-d#JP7BtIXoIaLbvYyUw&e4Z@Loznt~@&ySB;Q^~aQ>pZfIpl`kEH z`Hby=+pw4CZ*Tmr4t~vbvh&ez*^b^M40$BaRgI^@!Vdlo_v5B+^Ol&Wb6(RAF58yK z1a4FAwvIRI#ovGZg9HEeS`<2%{>}^dzCM=G{QeuU@c3DbnE&~g^|~F8VM}3=tcDoS z-un`i0=|8_xSS-}Qi?pMBfweU=1nTJjv?MWO+4?=*SA+X#}~19Q@aMCX55P3Kkb}A zg)_e-b%yADj^D8fUum1bg_lC8qtd)}lh`BgZ-7l*!Y{K?=fTbn(gXTa5F$Y-Hz+R}^Zlct%kT23{$ZeY1$@8@F!G6q$ZEx&O~An??)|CYP* zAV0rq$-bXCjzfo^$a62S^O&CAp($Z^ekswA z2YTse^YG$U*TOJ>1lW;AR^WJY@bmf10rl$42Q|RKbf}kb$vxRtZV&}H_oCNW=-2-s=BB;*%=I+$XV&B>wR71PPwl)HP!=ICdz1kuXwHr zbaWf>{@wF#R5@iYrWkhd=jxuL%9p)6_%$&9PUxef2AwxHiAXvFl>I5Dcnj=1_*v;yoTj%JNH)_vozBDYZ-CXa(aGQtW_aV>${C{Ypwt z0tZ;LxrZ;pa`Dwnp_s327Ijkq=luP>wcoX?e5{MMYH`lKw-tUJ&+EARh}{nQxXWRj zm)QF^yl>4Bmkcg5z}%_q?#{PF);N3L+hH!!g_?O^^&ffE({j_lwUO@Akx#GVy3_k6 zE&YWXK$l%Ef5D)#PvTleb*F`CtNQs>jHTb8w{hR(yUw&30FJC_|pTRTo-h0Ws6rMs5R z$dvCslz{)<+u+dbe^KQ2Mpc0Dy)FX23L#hgDb%A&?=Z0DcCFqeZrA*2aI@?r)FX1a zuvk!^Yj?e7`biE@!WOjc_Wtp*t36lLQ%{k5!=C*Te!(rji?rJ|*l$$(7%ZN1>@K~h zw||A{6U)ss2N*x_K_G|t?*}NsUJv98@Z*T2&?;-5PgoqKx)|2l^={Cv;JDG8Z(Z&K z=n(MtzVz$6t>x}sbUb{(n(<`c`_o$Ga>ej8)TeMjb^MNWv|HrAsr@AQpQ`U4ME4JM z5E55oN!mrKnG))(a)AxG;cK)C>$4^LorD(FAw)U2L|YQ7HFKF?R9*&N9_n5PqmRzM zZV8GM>$UJ$U9=WKqK&Z+8{3D`5+Pw;Xe!BSg?%hs3xQFW&&t3{kiwaW5qt=qkD%cu zlT?6!m#6(1Ud8E#0!r^H!z!a5B*k)aJ7A>EcA~bzO;|{T&1F1kN|ZKD`hyCL#5@)r z4TnUHs(ch4_Z?JTDpF?$k=cUNE=y}21U|~XAktrx1060|l@&QqkT8OFD-BP-XgmT^ z$X&#|K$7g0Ucfb3lcH>`<`-Nq_s+tGVr1X8(SlX7BPV@v<^85gq5{@sE zWmWY>dF0I(^z0Ty7YF&)w=^FWg>*YuMuLn3t1^?5>}p8IRadj>w#NW0{i$Bl)httX z+p1+ROTpWuxi4;5Z6Y9|Sx3Zo2#%-dIjJ5bh2E+b*{v3PvBF@h1y;Ipruf%P5uZ*F zlG{9Dl9D)^1Z0MW;t#g)5Y$Ll+*Q?fILkJ1JN}_PO|uP4b01=>DIJK@}ct_ z{DG7tT5^h1b71Z?u8LVXu~ARxhh*b*U=2=tm<_k~8n4hT=bAI5oSi*mK)uNVxE;YO z7cZ`y(15|wD3W+D&J^y&g$!|_8I8Iu=L-v|G)o1DL$G>Fol9>?Lv|A2W~tF|-)wpZ zRdWt1n~!k1xM+hnQXFQ39L8gkQ$;_$^A-mlB-re5mWG0_WKMR1*f{|PY?)HJL4=rw zlp9^moDtJ9y5NO}?4GKYsnKzMtoqi`DpskvvD_U&H1X+K^a7@^ zq(t@kWb6-dr(=oPnPcNB%D;O4=Lqj8^-1k$$4MZ2AD0Rff-EA=Vd6x+JHtCoP2l3K zwQj;CrRt%oX6vw&Y`hRE)U5mVvUHn=ew1(+5_uc?3U@u3oE%*}$1TRDU}Hn(W=3v_ zV0`4cTh?vQ=(En6xldncS@|$>lZBY!{9V2y%3_sVRBpAtsR8!8j2*zrU zRyCweUQTlK6kK@8(2-<&Dv;R+JXX@?IToyz60l@6%hv4GuXMKxqh-dPbEuKAQTvrkX+51Xd_*jc>oQU5H8(4Cgr?DMA`vTEE{;>S^`j6T)LcA= z8KhGY4+$+n5tZFE;f*7(=&?IYZ+oq9X=sw~t@L{4rB2~}CWx%y(NSCxcA@bbo-PSg! zBUMx@YOHM}++-7}LF{eHIqo<1G4HsCrb-EZW9jdPro&s3pfH@IOtgLkPwt1*QtU_M zW!w3)ef0y(vY+G!f|9g8pwm;(Ze{rz;eS~9fM=}l+z@=!L*)Xakw&FqsHSm=(z9}# z356G(hd<;jqRlkI-E{PYZG&-J)8c1*Z46IkAc9EXXo_dhs_i}pyC#Hn1kvh!dMbltAea$ z4C&DAPdH-Ri??zeuzLx(L~>T0 zTe@_HD)k+cqND`RErV~U+0r8|{x7j& zRv(zCwxgIr6u(>_2kHwsoCra*Y7HgoLYX#BnS0D%izETu8NJP8H`2O++4$IQyh>&)Vi}O z)Hjxo=p|cLkAJ8d(-@A53nG@iK}Xi}Nhn*a)^A)XVxzyfczl61EC;UibIE z9$eW8oI1?L&5Ya0e|nZ?Z&9&Q6PPiOqNq#ZW=r-`h!IL|CGvr~SCpOQ)M3_@?Xk;O zN}2@LMU-RJ=S*CZ`H3D4i#WpEA_*Os211Dpvx!efNm*zc6SaF;qrcUzrII8n|B}cn zv0}Lck>GLQrtuBMBdwp{m6~!_L?TY{;nDczsTfD10;tFiWU~Uj*jGR|?w>w(Y}k6} zn}MU2S7NjHF!9awp=1VcNOFey%La><54Q(R-EiOA@s7jGEA&RIWDMDS$~`qj>;~A5 zl=W>)rYvbdP-sZ355sB>Mok!(9h(Vwcqe)H1XGc*P~P*EHtOpf;hg zvM~?`8_{`+sN2+2mX(^0jK0(Lzvjn%ps%A+*J1?Ig#Z3%wbo#lQVM3n}O3~Mj?fa zQeTs3j)f{AHLS;tthknZK#y8-2}UoX*ribRvqTH-#z&{&A8`p2f(iFGZdF@nG@iEJz78sj zRhO#pD4%6lxx$u53Tj4|uB5kH+0;2Uk1`?MB%U;;)W#-jsb`w6sBVXrmEd_*1&9lkD)s)c;7uj!3wmjoEM*qpOt#a9c?f~A$NM{;G zUhev6syRR%bvF{N7Ov}-AL%w_iG`y-jr2`jtWsW|7C{;%glN+9HX1IX)J5V$;)6{Q ziVy?oYJ}ZHP~@;9%qOA_S)hLy%tMBX7+Z=A!|nC4YM1#3rl$yln0x9?}~#L zKM}w*Oow+IkF!;_1{}>X3c^PnFX`F1(8%1Z)W?WnH8855q?uXQIu_N)k~fdwipg)k`_}h%bD_|*3yy+buZCgI4Rsy zGc8Gqx21;I)|-#t98R-MV*#BIcqBn-9&A$Ggt6w52NFJUI5cUAU0L#nb!^#=rwwHSnq->ND7JWzXdixbM`4)D`~z!Q~2;PB)sY!NuUW) z!Vq9+772Ccp3sFjTYR~)Du9feN<9o}RSCZYHa9liB_b(FJV#$UK}h7NH|FcjWWEu9 z6-Z2MVU^&V_KJ6}LvXx6qsTxwU4H`<`-q5C;2$VnSX|p`WMQvM;(#l7BdOwYrf5H{ zl!qnC@3ekNJJJy>)xctx!iKi8tf2J1q_hUY z8)CbWF2HqJmEoT7BXo?ZxNOxP^mh;r>UiZSH`OYrg4tqpXZHAe`wX3$&VsdPb>`sF z3(^EEjW)d7VIarDp>oVJqNDFRv3Ydri zvvE34Z|iV$sxY`qf(mq<%6eWEYalNOV$jB!ql`qAof{Mg(mpWWLUTxQ7`c^wAur2T z^>J(2=%MY@O{E_RrMF+u?lY*`V{I`Lb9DRWAsi(|?_!!VPdYRuDpcGp{Yju%+Y2{( zneC|ZYJRX04Yez7Qq{7$H0m%BYQhz^27;u9loalxHU@U(h({Gv5})dl&^4h*l5;Fr zJFCb=PaQ}T#RpL2-ja~a(5aIg&1pW-Fd3@mKE2v1w4K2*n!zyFQCdYvL=Pst>~QQJW}&x%o8Xq5xC z=J_R{tbdcXBZwu$tC<3hs8K_VY`5*GnbFjmljiaj_&_8W;F5h%Bf~>GN(t`E;tB_H z9WgGHAfmLvtl-}1SZi~Q{7bZDc9VmDgs~C04N|f$ou>x~-_*O6p(X&g<9}3@yFgO4j`?3>9V*)dP0}rontK#^34Ob zh-`F-m{UZ_F2h1?UnG;AD6(|3iyE!vFot%YTMWh=izLh(M&^heF+FvK2B2BHa7Z&9 zNx;<9fZA7`fH#=pC!jTutk=AVCZzR~#By$sN23KVopJ(Tofk8uMNEgdvAl!P(aP#d zU({327*8rh)juOUB;0kV69+NGK{J=zqOh!lJ+F-(zA*Dgc}U1kI`FYvT#@FrenQ-sW-mzbg@*(x8&WFsqS zXrN}qucE{V-9HbJLnIoiz_-M}(C&q9N>b!j@TRbFheo^bUIo*ft=kKKX>s19!&rFa zM0+l!Q`GcP(zFsxmiaYk;Og`MEfLost0(o^zwW9uLO2p2VUymX zh>=&sY)0i#Thno9IBr)h{1!N*man+L^lso{fn-7Mk(EE5$?8f50g;YdLqwUc^b43n?TyVC+VH#VlpUC z(iRKprasi~`DP83`Q`bA7J!v{wY6rV6_OU5HCtIyQ)v;Ls;FJ1OcYd-1tq_E)$;B# z**?wNI8n0Y#$sz;%r14Kc+a-ebmfb%uST>aaf4KCc6A-~iiHJ6Ev_cIYjoQjXhlW@ z6qrvxpR094oL6r$7$s7MTR;+IV=-rw_5}JXov1Q0dxBk1l;DbwD7@Dw93GY;(7&NCEaP&?8%m^9m2$;PO4R5NnhW_KXGwI++ zXv;e*o{=Z(k)Zh)vqOxnP`6zF&j4{*I~A!Z1UkslWm+V@}lbB;mAY8DCxuW zN90zrNRnhFE#SZ>65Gv1$%6`cOnS=;f^FYUY_YEul}yt%re{&~MCV~F%(Y$kz zx43Xk#u8Ok2xam7xzDuAcSGLCFr?cD*uIi0bD4# zeK;ak#8gCOYA!V>gUfXDnX{|(qDeNtWa-zHhFZizmuY0Us9rvbVG9dI&6Nnz#Sn9m zj)Qi32qiKH&r*b`opHs#!)B16W`Pw;wP@Qi+-hhl2WB3b@=y>(VN3lp71hga73P|C z-81OI(Y6lm@t@+h5tGW;eEQl#n*y(>QiH*DLZy$6(R4al&o_>&9K;THP?%e*7lfUx z+}QV;)aTHzxql;SlG;wBG_tN#(z(l1F%N?djP2NlWeL@rM4k0ILO=kw&FLfrD{WHM zI+GG4!0|vZUUb&!q|#%HsA`dxX5ukq%)sl%Y28ewj--g9r>Pz$oT0H0Qea$XCESAIg5+)7(`S_kEeY2x~le<(^YN~uYVxY{yNQG))4b5@anlZdn?(5hTvPMbn;(*`%$1w+>A(i?E+naS9o z46ucT=@+fBCp}Z?BfYr^d5#8Fb^;!*R<2A}6OW62nIj zBZS3-m)lYk;nM)Cn027>?#0=3Dm0gPp`u$6l8~nBgbuN+v*i1nRSK{FGM6@ znfOqcBCL$r**vNuJvE~sSnU_8)i?E`6aFQ_6QRct@qcUvo5RpYy4M~svOQH@Xhu;! zfJMIsFUp@5R|txUU?7`eP-q^;LP>7Mkx~eej{CY%r<8 z){Q}XsK#zb2pa&oa7&pr)GXRO-e4V8JqBLCwZ{VS@mIG)%g_IcW&t8_Y}^?wFil>+JQ z;`Tbe%H8L(V;g8{@p*Z^$Klav(C_nx55LRb`%98Vwp&&*Q6O#Qpe;Q7}Dp9KnwFPt=9H;+_eO zI%ze}r}5Q_q3nX-R;~2BaZH_*mw(Csu}^R`bZmCIQ_P=3%~@Y9{g1CQ2AWlpI`8(* zTok0PyGtr!H%0k*AUq3D&-DL6=>A{)i}niyP|}vjZ_e^KtZ?xE+ptF3tsb|G;2Vbq@`8uBEZw)ykbDj5!myW+Qj+jVR>b9xn8HTT`{3~Sg&L%@Ch z-)Wkt7j0Fh@fbHLCH;#1BN?J0}Spz6< z4zF_-;wy~M9e!Up*qs*IGr$dU>yB~zQ_p`mOKbkioS!Dvug%l`T(B5Sy998|btMal-Z8Bn!$F>Xm;Po-@3;QgBBKB!bW zzhT88D5ZO|+?{DBKY)*H#S*PhMh``HpgO4U8fMRmzuntEmgQd z#ul#(7aS4b_^sWSYAIY4m4M=RjUr7S3QzJ)2OCqu-ne6I=AL)@ZY2U(|H#!-#gv37O*nv1x3T#<=7rA7y=I7z&C?A< zlBA`#>l`N7sAD3+D;OaZ%pXXl>SumNi{{^l zm-4J-LrStOJ+5iCG*Ou__ygR8O|rSb$a?OqQ3_u9(rb@h^83L=f_L6a--`C4a|!h) z2%j%JQCQ#C5cu=kp;ElDzaG~j5-1zv(XvlE_M+QUY-KN?;-Kd2`>@EI6iF?NMjYx$ z(*4hyI7|qjmApSE=D)6RNCETtx=>3R|K?))c;C>adK1k}IAA7255iXyw<9)Cd5@2YWxuZx>TgyQ5ul=3zOrYYKGd9rxb~ z1CHFVww|6uihT}Fm zR&~qXYV2X6bjfzN+3#yQ3Xt{OMr5yG!~ z2-%++_yDfBXWjRB;U51t|IenOzWFwmm_Hr)&1Nyd|j+n*g=%t<(S5$X|IgJOQ7N`@T+3-77gds*5ExCKQwUjwsFD zpZ~)x-xdJ-{(C9RB5_$;_~~^=&>+?&q2cv%9af%z@a(A2_*S%FEd$Ekx z&|E~p`qQcZ6_Jsz%J3sl(C2$O{rkO{7x1z9A9tt52JK%PL%^xcfM$sQ@7&0Gh*Ykr z>kXF|q5{A7@3RH!$?E;B3_}e;epV0zou&S)^Mk5GJzeuUf#sK~pa1QQfft!u^Ku=@ zzvcTcAFQ}!FEO)xWruI($a~XwiG-w!9s*kp=?Jisp$tX>aJb)U=#RaS;Ge|M0Nrj1 zg}0^IO`ncm0Lc9=KP18%0B-&KciV#Oa5;d=#W-1&;3MQe;C-zs-YE=VCPSECl_jmD zTfXjMV#ia4e`jNGKpw8W?go;VSF{8uoh?3ma>~c4=w9VLX4e{DOlmvVHs3oC>_AVO zjNlK9B=AKxF$p)4Ck_--8ou^UWiivE<^9%wKp^q0Zb3*cA>%Vp_ z82%fx&)f54AmCHqkk4PhwHMsTaAMW&RdNmE#puNk0ur0XO6jIdVD{u{-DaO(h{E@-Cv+vo zWYtujUe~+SRdum-AAM`{TRiZD0qCMIco+Ei9~nf%ciwMXK>Qg@#OeQM&)fHW-Ez45 zT6zG=*7#ZaAC%qB4Ssb3ejnRB(YsiCUJ?8)^*;|=cmkUIEb*ly!h8Eu-qu?FTea7J zhth%HG2!mMR7zi#IeXufG~>}8zqb@R7y*5hp?{HN}~9^ z)7od-{Vh_3vp!{cZg+~0AdnKE54cKFx4@BTzimk`yqiSYR@h;r@zmC?%E6_X;Q- z+0_epn{K%IdIXfcsGUFVZyyS{oziukU$49O|GW6`Is7^n4X{7YaOX!!d^9|VY9J_B zJrVf+=TP%CB=W@tr`*`(;k`C+Tjh;hp!>e={xb|{$Q>i6Y!ImGv>({n^z!xyrs3hq z@Zj(0A~1mFDfn=I+?+_uW8ho3jgTbhp>Ju9D_uK{-WN^Z# z%#e5W4OX5M`un?hohLKhnro{S4H!M*|IN_NRJV;4eEd0ZlYRDdn%_|1Pt&ijH!8={!J@25P?-0Z1rk3Hv{@eQdH1KmgnNL_bXKV4t;bRNd`W1Ajo*jgv z-2F91?Ka|xx5C3qK8Cqsrm@`ig=N3l;UQ=1J&e@{3*O%{ zP?XpgVtd+Z&(mtn&RqwO3&8YmLTUU`th?6)ZHLiuz%t#_?_^)cOP|N_P9;bC>y0Y9 zm)g9Hy5F%uL%qDfPfeylzWC=O=T1gyU4OPdt3t@2a$Fg09pP*a_7VH-8D8=18yy1x}>Xbz2Q8Q!~8%u_A*OnE)*bFRbx?6>wgPQW9iE(>+PV?jyfRe7brAkW*6dR3BqCQ*6YLGASik*iZ&;PeMNr)>4WKq zyTL15Ph8?@GhVGqr~$2tazZP-Tz_Iq>WP;?Gi?eQ>4Y{rck%z#e2mhiAia_3Ph0&ElvH!tFbIp=m zX$12#BPk>{t?$mFPi|ce#FwYw{*UEMoJh^=VrVse#y;s9{4woJim&7m>H&z7O zNZs_~d(F`usLbiqDru3`2ImHybQ2dT+pefe(WqqN66BZbEUEMj_wqiSjqaD5IICwk zpTGm66Avo0qDO!Pq^AUjy~Dg57b4ata9M?|RjG85OxF@koLakNkeE(^Sw%-x#UiN< zs)ELKl}boL;g|R6bQ{!<6c*p#sOyJhK0cZ9vNYOl6g>#Dv-Kcag2QT!On%gwv-GN| z-UEuG*I|%jneFf$Yncw?6A$l7JG?Wtm`PiVelxUKc?c!l26u^I7U;G+4-3}A>5N2Y zxzt65oDpOjSD79u*{Od_`^Q~bqqc!zAyu695Qp}!EomS!8zB@+G7&FBkc>?yBarkI zC*mPE`4slsFkODNT%p~l)3MZFa*Rk#RQzxe1)#DVE8?X0Z1_QNnQ;ydnovcO`h>U* zHy$df66h{hNE|gGzuIMgdWdcBFrU&f#oO=@VVETTEAp3)D3N|JIQ${Ix;X4iCeXO3 zlIfsrrIFSa$9F|TsYSBj4G&k7D+RdK(~-Eif6O=6#Ch0PlA}yFBgB%P4y14r^hezj zF})sSaJ!+(63(BJjS#qUA3zaXWxnLSCgprQSjpe$;m~W0DVgn6Swu-iXMBQuM}q zA?2zi#OsU%^-bj>J=>Ssm@{jsSL!=fI`q7&XoOo+IIp!-dPuNkjGLr_OB9|(^gURc zjbTMR$(3Ns#zJ6_daAJ?O^jc_TAWevL|d*%OKo`Rno<1iEXjl#4hf=eFl`s?D{4?O zqoI?ChktrR3lb!c>TXzd!;r&GId~xLZ~Cb|>WM&+wUi#rue)%P;Ge_V4#Ms$yYh5p zfZ03n&yd}&;g(QiM%RTI5A+Or)Mvenx+sP7LHPzz7G-(h+2&cqMuS>7toC6t= z-Ny2rFQibJ>JUR<<%?Ra63^^t>#xoTg9{_fN~zLLwd?G+7RmjDuw*_46=H(UgB@N4 zUxq`+{e{aI!;;99XJi76UmsScVGE|8;7&Q&d-BStvZM2cp^0i9cHjx8dRyCGCNHs| zmM6#8W5+L15NwQjlS@WNU7>x}*io&_-Gf1bS2}fYj z2@47(%|S@YuX~@FlE}AuhwLqmVQ0rvx`Z(tBa@1Jmdp>G*-DVn?7Zp;;Z=0VMb?!* z+xhnc`4x=BaT9~>2vu7-ba`CCYs9q0v4Um#* zMZESDf!jqEcfk2f4$XXFK7C=i>V}LdjbIl??=pv0Bqs&u$+2&m!?FjdX6bO-s$`JR zMxz==&>f>zPB)l87q?O)>I?(1vqhOik4EuPX&jK`7E>osleUJ&x9*4N9RC76b40PQ zg$IcwM#bvbV2`yMjtcEyd1Yy3-+7CM6$8Vk4)+%g0Wb2A+UCNJ!h%?Gm<~B6ZE6Ym zN;&Y*2ObW0wkb(CK`cU=u|DB}hu@j!mP{4Cvpuo$f{*HzjYtx37N5j0#8?J-pXH zwohudB=KHO+jb`t|)yxvH&yw?RMCnqz-as^R(Kv~rWcyARvq zX*O#s;X*EnPHTA#5|`byepUX~*zTZ}Nng#VDDM-@9>x0hUfi{59WWQ0y3?F$PE<2s z_<1uJFz<24@Amq4Hs9{KzrPGQ_Sw#-7_eXSoLp3Jld6x+r|4}5;Zn-znjP50`wqZQ)0!(Deu=(1<|8 zngkHF74fRjP9tdIX3zc~^|}1LHnt`^4y0E`JDn_T?s_8cDn@K6S6eAxlL}8< zb|o>qSWNymKj}KK5DmFj3P9v6#1yt$( zVmG96bRk5>XxXUrLtzeba7DGK8GqBK*vx9QCo>x@4Op)9mN_j2O>(j`^Wa8~G6>{C z3mb_D)-o)Ez4zSvXc9r94gn@w7HVBFd>9zVovnGD>{J>okLv=UdD;me=c-zsEgz{ zmhn0xrAcdK1`q~<>?Y;DdK_^b{Z1u&Pbcz_64^G_q9BzW;Cx*1WV;S5 zbHLw-x6cKg^>oAMd`;gvk9$;cprTGT+)!SvuEy z1Xd@C0NW@S34d%64JesoAKQ8eNfL#LS|9Ni-sn^(i`w-?K-Y!3sr-Q5C6YNC%NJLy z7tp(Ku;jT0`y5Z-rWT|I5oZKpLa+Z9U-uZ@NtZ1QJhpAywvCQD>DadaNjkQjbZmEQ zc5K_WZNGV*nYnlFtoPpfRJHb6RjcaDIknIJ?epu>5PwKw63=%|BnTSwr7?X>iwqQ& z>Xz#0_j(t4e&&p|nK&&{r0`Z6t)wDZC!`Z+B_%?!RhwX9d0?7w=WH)*eGjM;I|l3) z6ofNZh(TK9kUkYtAbU70BbrnUS1CGNES|k)EN~V5qIpnQN)BAT#P>Ov?p-kehb>cXW=_>kY8Hd%ac+snuf1 z%5#m$){R*Ud9Zk;8^}>~h~gIKY;48|$n}LJ3_kkZI2t@N-H_WGK!e&{h)Y z2(}Wo;rPCmh=%PE&R#)CjQGNO%D*pO!fwX(^y#N^MC#%D5K4p;E+P3GDQz3Bk+IU$ zlRxe=6p;kC{UKEvMsEFr5j-?`BNyw!vUEl5AZ{(64~GxacyImo_NY zH#p_XgL{k8BR#)`pVY2(|b3u!Ue=+P=1I8@V5bzdyjCxspKebBd709;)%H@*H! zuCiIP{-)51dg^J&*#Hhq+%Lj@cgP*~-Uym=J9EG%oZC-f^&Bf(`%x=isPshu$T@o3fN$H_ur@M2>utB{(k$Ha}j_i3}V} z&oU)TLqW1@3|k;}Ty&`-j90cVy#qlJ24&p99{>9!LdjzW6O|U(#Ay}#DUIE|3Pyx$ zaNBnXj#^YOf{z!UhFGmFE6`+eT6OHAz*zT>GI%$Fs3CV!--wt*M1h!NyxcL|9YYOm zoO~{>b=5BhpJJF=MM%|fSk``u83zbwfN-stOLO-y+xJZ2Ikzy*uLqzQPG#R&QJ&Fq zA0PIp1Mx#*w%3TYa)CljpODvvyOt77+xrU(gO%0egGjKbqlP^xsuUZ9OEwE?x4j#G zl>q(r=h_%S4Yf3LKEG4JN0>92s*){%9|cnSbzBdbv3=A|6S^KTqX+_eaPsRnHel;y z(^?Y0hE7uhx}x3Ya3K}*>npgSFyw$Bqv;T^GXby7&3~1egpp@4sj0Nnt+;HK`IEIC zLATmkRwHtqLxwFzlEo9}lDr3p;zH!6lgp@*)4_kPtmOL6AEYsjZ)Y_)muv300_!XQ)6C$y z8;xD0QoG(@ZY4n*JMYio$rFF_P%>?oDIp0qi{|JbrhDd|)f1ScYZ;CJ0h`eU50K(U zApt%u=*xf+n~|WqAhRwl^%Fw6Fp9*_T#dhI^&+iR77mUGT~!tpUXfrj5$M*;T!k(< z4~7H9R!|C$>;Dm#2MBZaf~#pT;p`v4@IwyIDS%f50V5?uhhhlzXUSknezd@tSEs~4 z%h!tkz8KdvB5eT+Cj!1D6~qq}K58fXIpZ*czxTpdX5$O&<;t)`)LL zrMQk}0n$vrXN73AoQ>Ga5+1kD+1!+G#u2SCZ+# zAFjeyuw_}}KhPPakzf2QHt8E zlejDK4q+`R>$gSM)B^nRZCG!VJN$nWY1sl-t0vO*8^KOmWgh4X6c`>K<+RMvz5nh8_Kfc zVl9|i<>HZ1CXA0bH6l3&C6*Tn_UGJ@qy-cJ7E94pKv4Ue*bSw*5GC`Q;`f&{-FS!| zB61SV5?EOkbV+5hU^qLvsm7o`@ag_*sA807;@DCarsTt+1;%0h+Q1C=Ir*ZqI!zLW zd%oUm#L{y;m0TR;J=ZF~a>RC#KnZz+!xiVjsJ^mZOH=hm9vTIyI2%iH^$iQ)!Z_L@ z_(w@V1EvZ(E9R^>YueXEedPXJP}dtYE z{VY1)C4aO^vqA5yJm6SQ4-8$4B&@5Lr;3Py7#JZ9TW<$l0IAjU`K{WvrfSYK9BrjX zrJ_S4_4%cfv82sFquryl{DDh122;k_J}{N_@C;<{?Ou-tE{d}>`*R}>hyXPB;;H85 zESl=oyan<2kw7B(MM5=O<@z^+jtJ8{2opL>Yr9VWDX~`hw` zmh{x5$TBxov6`jxn9*S_N{@N&ry2XLB3I>*juey%Xz^SFCTV_VH%J&me?`s;w%B?5 z@eYFA9%et+5Ju)3q`PpP7#rl2gqK4XUg(etBgOhDO5qEA($j#nKALmYejFY!Q3x)f zO@UA!eciM~BOIsVj?oNOaC+~Z(SHpg6*(Uht%F9}uChq`+YZ7p`P$|IWdH+M<~=q_FGejVz2-MQV;I-0?|tz^N&P)FZqDz!TAk)`kTb4fnQkX9J)m00uYaJEt@u z(%Z3FIJ~XIEur?ERefER1<))V-31RdOn5cI(*)9asBre+?7k(kal_q10F-`dv`Odt ztO{UEDRGYD0OFxLEoDZCrS(3tD6}>`G?z!sJ68`aOQ2${!R>@F`k;V7iSpa}HPr&!{(zmTQ}r>;?q!Z7(H5i*F{^0)i7YjM>z5iAuYggJjF z=R%b$21GY7;m{?3Pkn(lrEUnJU|51x=q!1N`VfQ{#z3h_hqY;bw8|}C`y~C*oiu%p zEPWH9oOk;@D<|l$xjdwLwUXI4=8GADJ~rU2%o9?gUS?^YFlqn}Wn~zD&RS2{8A7NG ztH4cjH0Yp~a@zxyKe)C1YR7PscP9qO?*^C|5YlO_Hc);9oc3Drb~y3!5HGpqb4t~s z7_VVe{g@M5kTfAAFv?0}k6igUSacqEa@GpmJWLr*dYY6_*ivjGGL)FRIUH$2n_}Nr z&>b!i-EPwL|MRx{9P*_%4YM{UA%bJMpHN8=PS3*Px%_7g0@Wub;z!qyF2YnaHb_|?AbPaFaR&TV-4Q#^*eo-s~JcdCROrR!twJTzLC!SJmfo~Kq zqeic3uv`$gqKCDZ3g;c?nN(v@;DD9Szfb0XccW76Cz0VCVHw_`I3F_XVO^*!cyXUa zOW)E;@G6T>!dk!1I5en^3~vK?&{m|$nWYX*FI3gZ#fRKRj>5dMdn}Bee_W!EmNrML zwe_@W*9P3K2u34VXUnMWkFps5wY>J(&e-N^AnVk6DD}SL^OD()shc{1u#l4gxyG+? zPz*`fy<4$)9L+d+(SeF?(h*Kg8x#2I^Z8hnEyEF0*1G21@u>HXcc>PpC+?7v+&_Ok z+v)w1eObO!UiyA!AV~1A&xB&o_x;n4w)~0^G2*?IVOL+H?!=F9v*v7RIORf%|i! z%C!^}%b&0nS$FqCb>P6wNo+1Cz-*@c#~vseIT-dKJq0nCsMw*p5Eup{i}jOg!aWIE zn2g^jM>~D@%(|i&>S(b z$JccwDLZ zIHq^mwYD7(Z}9PL4P(@C!c;tUk#4QG&-KJ9-y5fG*^|?)PI;9uY8w?#Ch4(&x4YO| zI$J+ba5Lhj)7$Lor%G$~)N*a4>zP7_l3CHtZPwM1b#~3m$*dlDzbQJbtP8~01%IT! zY}VxNnO&%{$7gwYRwmDBdXrZ>XwTjO5jcrn$0kPJG^) zP7~Vibp!g7(Zz23HluhV{$<}zg&95kN?r6cR2|((5SQfSvmoS7$*@k%s_g9Ld}r0m ztew{m0`4pPy$_q0cT+TPa4|xDKlibRZjZLd=*wAycY4*EO_+Ar&eDbF0Qy_du1&%7 zV&OlQH3+DcRr_sMvP<#c!-yh5wT);@o%1Mxl;OjhIKA1S6Jd9su1wy7osUu<8(|-- zB+pI>Z+8CAql_wgzE6(`Z*~aRkDxb{`EN1Bg~eE(LKGjtOCKKeQG+|z2MNw6W*-^T z8rA$w^M9_(Uk1c)+hiANSPuh78FxIU-Dy;QppQof`v%(h(0VNB{;7P}`~VfF8#?x8 z_8NX78=p1Qs4FWCw|yk#HC(lPJdL*7wI?eL@5~eEz`8)6B?@=wa;C zgM52XzH!c$zn!;LEcFknnKU!lOP;@lC?lDq;V?=kVLV;-cJ(kNlJ`HkO?iolG%%BR zkCM7>zH5%ui>v&M2a{e2nLzR}#C-KDrP`er9(?UnvDE$ zpLx_wsGRc6qE3yk0g9(~8<*o7E?r81zmOv)WVjhGaINDYeB->pfp*}`cu?ZgFsHvA zys=EdUURB&t7Y;jF>_gD&MX~v^1LkSiQy#4rlM7s(7+go**Z`>S^PM><-I&~!ac9i zJT_xfFas|Wyo_}!KEK51Q(p5_Ja_H6N$uq9{%Yn_$36P7QSE(pxEP_}lvFcQwH#_= z_x=QZf_MG7%(`ud$RQZ3$Eo^?q-@MObrQmEG~tiW)Im zd&6k^b*Nyod8@4j$2Yz%x7FCrt!E#qDqKPUHj^69Mx*ZKN?2T3{v0FrINnS~_qJ_6 zxl9WkkMh;#M-if}s5Mk#tFa8%Nu|50wUfnr zcxv10G}9QkN6qkQr@1!8o9dAI9mNmun0GJ%iMZY}GIg~7N=2p$hJ%g8c7LOfm*viR ztL%`+r=tzvU@%(T#9_nfMXHk1vVUpPnYz8GY$~&xcTeQ~5NyduTuFNF&(yVhX(z{C zOxQ_xj|iTLQnX!`tCH=d?Qh;SKT;vx&&Cke!rlDcTBp>nRcKw74yu3ubWx5Uk|w>cHqs%pbp($#hAozI$bFI!%|%_O(}AsFN^os?X0ls+|We7SNe$=@}XMJ?YkwU>QcHm*`d zqgGotr!QA#I64Pjuh!%okO@7^h)KCzklg*?*tzHPerJsN=_LPZr><#+Kj z&CZT2cB5u~u#Rbx1!LhS_pU?ZS_Uu5IoUQ+?vAsSPU5r9*s@ihX7+U3U3HrG@wAjQGgj)3b+7TNRKsA>yN&JX)H?A4;Zl zuC-vBSthZ(zA=`$@4Q$b8sJ0J;>OnYYMHC|WT0*58WH=ethf7ki@<(KnjmVmzlEY> z>E0_Ue{$qqOu)n0TMB>QV}p@5hp*iJ=oL6ck6F7dH|g&tBCBG5yia z(mQ8`cRmBj#4y{aSj=iH4m(N)`kSaSPEMn7XZ{!^GP;M|RY`oNkavw$vKKU_ z9@W(&^*GC#_RJiYU$wSt!Xx0Ny$H*$8N(Y<*W4@ABY1dkpVdfRd_1VDJBv07*saxl zS-b0{nn-E4iW@%}OkRJbk=0H9C@($2rFd-aAEQydM0(d))+l^kUTf$R;87ZPpRp#- zwCb|t1h1OtvqisJE3R`)J+I$7JWAv9usZX6SZAK)PCs|IZ@lt-^=L8Ku3eMeA9lD|*Dtgk0=_Hs3 zFyBV_4?==ol#e~Oz0j6+)y=!K|9PzEeXUtvSrzDHe4BRpWeu5JUa!#-F6si9%V- zuiCAn(z`f6t2iCJTmG{~-HIsgc(G`Gp56Yrgx`w5+8*+8!t^|;B;cH|Ob9CvnO!_L z>O1b~KEL{W+=m>LqIZc{%${P7ArUhlJ5<=;i}*=Q*kOs^nW^%##h_^{T*5lUJYJ{~pj9 zwBxmdU*7DP5cxd3tQDxW^)_CA8)|)y1Kg6H9!M^X$CRfNYH)sDj<)`kuUnzK_d(j& zDfWcwY}Aa=bG=O6glvCuzdoLf?(5XO*m~;zl=Tn8*`n~A~^W55*@X()4DuJA3uUqo{vk=0tv7)rNi{)@A=cDNY7KY9@(?rm%RCe29Rir7H`MdQ7f+A+S9ZT^5g{|P;U%-Pe61vw@kg`5%u)|D zv=8^`OaRy+X4vhC^jq3FbF6VydLhJVKZ=PmLvoI?#kOxRKE=23P^S65sdK}Qq)aT+ zMIN`5{PB>%Ky&qYOGRH3#Lae9z`&$*=1<-?QegR`(~u>z-O^S0YCq^V>B{<}g9!n1 zGM}QY%_yYg^SKt`#^h_bxYnM1VE=G@CFdIIo+oa7zIq6riT{CKR*9yB;(yB6vyZuO zq20J*vps_dx_u)nd-blmWVnO*x#lj&yMp<8oS!is&8=$cz#+SPmO{JpjqE8R0x}Gb z5bjdeVKcj|&axBD$y@Jq8}qFf>kkt8lk~6G*ekm-r9Bg!anFvBGX4~3JJAWX{U@xH zcAf!n!KQGQP66xjqH zY&W)CbGzmlUib;K9#kknli$l4M5}49t*_otuj}k@Nkcft7omj+*+krOp%I7mEQ7B+ zNeSNf_s<`iH8O`i92t!EqMwu;SF13yy>arg&b})=e}W?r#Au}svSsxDXz*mudJr8k z8J-kRpP0356b$@hBYW`dd0-~6x!|Ba?gCpx^Y*%?a|lLLvE$X4;WZGDZ+dN1@LWvI z!02thj3~MMD6OVjeWn{ErGehgqR*Ri_k4D*{tDUi7`Wz>$h6fE%$Fx%3cAdG7RBy5 zGAls$>1{bdSA@F#yG{Ye^JxznGln}zckJ7X`SBm-+v~cp2;Ju;mh_;XX)oAbsaGM- zKE%+oVHW~mpBj0_+-19>J&^6jF>+Yhr96!9+#bigg2|nLasO03wBkhALoC9(PfTU? zb;^yUOj_MZS%8AKUC2)|PsE|mw@4=vH|AYD6mOQ@HPjB*2Ob3SSX8yhB9?6fh;Sjx z{sgyXd{ZA|j@G&`ZNW}TyVKusKD+fU;=1#<@jo`7J`|e*;xGFsk@C9rI4jl>%_1;o zSI(8?>)wrQ_l_20ib=<~J2|Dymoo-`u!(ADv$`8BdXJY*<`wYCuiXw(=pFxd{rS@) zg=G~-4`26KMXmp>oWU88Hgj?^hL+X9&L_BgIP3m7RsEqP!acqb~zXAmoePtI9(bZrQ-AY_$~ zj=fi#VOytTw8C!*MATNR+nUdq!vnbIGXo-$*@y!RB=ypo#6tAIpUR?ZMeBb=zc2sn zvC%ke3)AVemV$a?(!i*TpKt56&l)f3TnFrrlD1YGdyf2dgqm0mOLy|Bl-gZ zI}XR#DOtx^W1pVczGo}E+z2}hhWvba8g)vVl#xirzOQq4Ih&_Veg5dtTAsCe^lQ0t z&~Q#k87!Y!hA@tMx(zS-jR?jXUTI{z%N@0xLL*Bfo2HYug~i|(?ev`%0& zaXA6i=*Kno=*7)Vio~M{sCK_u+kV=Mr|PXo@-NhYc5`kcExy~-e0F+xfv;?u*zq)A z<+iBays6nVao*Yv`PsYdb`Iw;Z~i>jHR=iJc(aK9t?LZ_;2!mDQltIw&YbUojW(MR z(W6fm>#1ZT!t_Qk$DpeIu)Atgx%)+nz(Me?*hkc7Ws@H7540=Sy^04-%jX@!1!KNo z`@22P0d`cjG{r~zRc_N(!m(k-_dJE-21Uj6(Cj$N)V4TcgRY;Z%Ao7*EOZOQy;6 z($75wUB$v}_Zi=>SOJ8Tfu?$5sXCB5`wf?`$@D>ujJy?$H~aTGuktOb{tN7|*@q6A zgeC4fmG;dc`DY9h2(>r2w-1d<=j%SDtuSxV&c$FAvSHynCbDtIg_|gQvI`cF{zQPD ziS>lC#=&#`s2e3P29+#GO#aRX#@3%M>fFx>@@fX&SaI3MhnEc53YzJC{b$4c`(uyC zbdl;Q8ES?C)&!ry?*l(!e*Q9Z_34kgRcgw%&0vh_ z&2D!XvD@H^k*u7}{2=miA9TM1m*0sL=)!#4t9K-!TYhxDD|R>+edWHHEk3`McZPI2 zr8AnhwTre&Qmy0320wG__xKoVsOmeS8;dwUBiPHT-hh8RV>l>Z;XOWkczq4HNXY-* zb*rzM__KTDWi5^SvzF|pjyrvwSwc_1NHF)q)-3E&j^6Bz+I22 zjz*zSD}@zO&TqQ8A^KlWzVJqc9nZF#S1yaMNfp zH)4?vE!*WpnSE8z`3YH1kBu*Av~*$?dt6yiAi^9HM0JDkXEb9f!E7c(=Y-kwM(Q=R zdKN1V3y+xx;UA|d5A!E$!gOcVUY+Y!Z_h!)RqSqw1;akO+pQNL(($RXdo!D#HfEg4<#mhsCgcw;%yLN? zP75b5qju+6h8_^L5ZO0^2$yvl;`JUg zzgAuTDrcIk&EIb=9SvwZJSLDHJ=zG>TTl9#8N&T(5<~pi!h4Z5;>{hzC%|Zw?MnEJ zcR>E?d58U;@s<4(jDf{}qJG`?97i1vwefjYmI%i8csds5NpJ<+h+hm<1_D>O!To;t*7zvAu=E2`iV7!=dux*k1sS^89dMP zxz}lr)qUK_&Q$NGX+33lT`VJY`m?xp`?u#OzWYenA^vy7Y3xAG4mCkmAinI$m@0vd zjmKW>t7p=+{#?lq*y2AC$vp3Cy9<(;-ochS1Dm*yv!G6HbFY^p1G4QtWO$vsLhUw4 zAJ-`TM(vN3nc`VKMk>$qu!oHSHM_r2&LeG8zMC64__H{0zsFa=vK>*g)N|rjKvHrJ zG?Z_Ejbg#KV$hp zPgx=OJo4}%aK?MwK77sSY4Yl#cm1`MM=@^1u2crtbzHrqH#@JLn?Q&GujRynK(;uy z&obdlF`S~q$z(Pgvq^&wTZ$6o!j}_1tz#!8!)#)4@>Nx|!`r=GW{>)hr9;{jsu@TJ21@s_y5bC!Tq;8qqlc7arqzkEPtey zE7bA{KJ5iFij+j2F-$2EU;!Fj(Zr7`7=o?F==~8lZOv9I%YFRv zp1a1S{+sG|(Hmn`Rn-HZ4}i;q#qbEtM4f`(gyv_%yG~v0-Q^8Srnkq9^xN7Co!1I~ zl{)t8+iWtc!DGT8_N|$)lVr6Ad5s?6=q-hgL9(yheD6BOorniz>O@R6n)c^`h?&X75k_Ma#C$_+DGU zjQ&N-YE#a$(KjrWoQJCpKHRv=BK)=e3}SQkh7FK4e%4}evQx-w{HQ0kBsd%*D04!SXjS*^9?ih=1k)nbHN)byg9G+t;l^-66R3%DsqX+fHz zkf-qIK+ed{$P4UTxuV%l#x3;GGJtI zd1!oj)bQfyj!UPigXJKP$m#F{ zuUpDSS~^pBh9sqQNQn{*oBQ~5EyfD*E{e+eu4Vt^mWeeut2~)v0bUtQcWWV<5@$U} zDS-)@ay_w8vUY`h>8SO6MJ&N{*G#NVd&$W;#|Zg=AzH$ipg|uIAp~AQv9v<^QvyPL z@qJ9OI)W5)+Mgm*i^KtYXd%`zEHtnTeS$=v643whf+uG#hT1UzG8qg)r34z!M2g*0 zhtgah>;#&V7zu)0X%Js-&$zY~wgR@IiN~G=R^{XuD!y&twhNu(%qmC5qBjk!ZZ!OK zVj6^G*>_)q+-6HjZlOY)ywN4`Ly_>bK6|vgNOy<8f?1_)J7-Fy0I^N_9dH&~B^(f9 zuWZ!|VG1W~bXMZHx=IHc(To*Hr#8QYn9nL=A4Swp@b8X+#fl8u zdr8ykz)yH3r#L5#Mn|i;Ku}68oaRg~?26$ivv&2}iqFTfK%0bMjqLgu!N7^>lmunVdy4Z$@@YYja%2|36akfGra>n~p zzt&3ZLf&&{DqT>bkG1MouiGo&`W~!e?hlB^h-O!MT`=Zw#%BriLOAkm^9zPlT*OqN zk)R5&i4_KB_w3eghB}-Bm1nyykVhj!T7fEsI@aQ5FKO;il23*Tw>s4vO+%+im2CZW z)P-`#o~9TTuHE})8pMvjvM#^aquxlN(zGML>bPA~0W__;QEeu76t7PeG|U4WFEHQ) zm>wTW8;4(y6QfT-bNcG?l4pn(8nlf#v?lEgHQgE!TWM3%Cvz8<83)$l?m<PWgcO|fVbW)Q()03R)8?G*VQsL)hiYcOa0TNn#BEbp6_5mxamKeW48I>@GpWkuX~DNrvnrN^@$u*9 z8ch}>D^tv3SMfbpWaAW`O!2_p>=GapmbYT+jAIHmw{{)VHzYI8F*Aa9S=N@@0z1Hn zUYRQlh1pqJG=OauJ8`s5eK$85;ruULwnTs?YeyhA75EQaHgeew{}(P>3}a=s1qmTS z#co<43%BVG4QOV)W2s|XpO1wR2gRcb@)8XI&GV2_=fw`ihM2M)%Gf5UtMh+~-*C|e z>TPkb%8%Yb$Ri#xKj4K3zOW29>8)$xFGURvum`AcS}Rh$O=X!>-hKSAKwfURgUjNU7bwD}1PWuv1E+E1Qhb@$h2{V}02#Z>ux+84izMuZcGyF6+p6KU~zS zwGn*mUF*D+^!S5&=@7i5vq_NBdCBfR9F=Vy^@Yor{>EiYow{lNe_S^6H!f@Z2QHK5 z3jB9m7WRe9aJh0hy$K`nn}D?P7aW1Q(yCo%dVo?6vT}g3jh2U9B$!1|c^(qP`o8DR z`~X&jF&+Yd06>sS0V`V^-P22R5n;=u%otMX=5rfSM`di;RBZxgsDI}^r8rv+WEk$vwOHNF7!37i!Jrm+n87$HwPaT z_SjQR$B|z*WbP;}iJ=3S4858kOk}zW?0dQC2QD<3Ad3vclt2}k9osVDE$*^5cYpC` zf6+x!|E{$jrLgL05mkoB*Bk_7W?xaYa;?!MEe~sgc`;TXn=$f45_mRF+F0L?*{ z3}1TOZ3@lHz`!ze=?7DW9D3QjhMXB<8X@>OIf>QIg^uq0q)>}y!zXUg z(cmt4AzYo&6CgCR#L$SSI2;^CMNU{w4BpNzTUQg)Gy!^6AURJZx^zt~XLHWL?vXVRWf){Xp<-?8g zVzKVDOZjE`J>ZgBoXwca0+8{iJ1o|wqHTltn}sWiQe=ab>D3C#oVgfD@U~7^>Fz3# zV6FP8E07k(piRx!%3f$EfB0RlnYtjZgGhR*^je%)z^KtgXg5K=Ql3G0mSyN-_UHwt zGno3WRAHc2D01ZxHnD9<+kv2Ku*u%pYh2LH-7Hfe+m^>|>X5b5tdK+viUvI`9mf=P z7{gt7BYZIKmYnwe=2mR08q+XfMo7&EGstMem)&bor!~FDBNv-esv_e#o5$PSnmc|i zcwyl7V4yr1y-ae!#`dKDr!EWrTbKF&t;^KDbQwpdZqUDU*}Co1Qu#l1Sw;f%U%Kq~ zf9SG-FI|Syzo-AD%kux$WubrRvflqym)Z9ILzl(>t;;Cx4$SRe!=}ku&LRDyb>xyk zp-I!$;W9hOJ)|7QJ4k{OJVBL;gS~3bhgC#V5N&?%uG*6Q^v@#+l#4i}Ih(bP7?jsb z0D+X3LapTgv+jE{E|nABLIajzZ@@=Ip{Pt}z9;}d?Oz~rcGh0jP)b?(A{Y4f_!`hT?QYW;)H_3H{L`qEK5nzS=)N&N<;e@I-%)Y(7}ZIa*9txv7D}BheQa zI~e;>QJYd&Gh#b1>40d*#jua8LYAo*XTm&kA2;=`duaF$gFv0+*h6%5-YpL%EUi)Y8uyhy$oFu=) zu~AZ|&uR?_$FzVOc(EMaNagrbXlWFn%0==+Hu7PYZv~oGhmp|5^Gw~&pqk1}rPKEc z*Vo|RphFSmGF%I>uIBjhz@>}%%TpPQm-KYsPs!DQDxM3MyT(;ABJUKE9?{aw>j)}! zyf~GE70@*X)=4r-eZ>?LuN=5y?M4htAqhOBMC>_sPuOMEBX|g)bHq~3m&Pl#v zAIe5V9H%MV$%@c-noAjvakfbZ%(&2ZamOFBM<*(~2;3)QW?Ln0b&mWzK z@qoC$_0^Dncc9ws>6mbBoP*kCJ`*r98~6Tr=5?Ysn0%tJAv0$!z=e=+9G^$-8_sI~ z0fcK~VAwRNx~cD{&G4DL zjA=iw9MTyRSrVyq`8VTwDH$?KjpPZTOO!U0W3bll1DWF+*EAw0fPP^!ld?4lzL}8P zA(^ak2yVtVl6h>gsARX^$21~hhC2ZH%Gk4^RG9pmFT+-_9jW$%-`Wed=W+yaUB4P4a%p#4h)D&n z7X5&W)i3v3#pbyIz~1LoQljN8_m-~D4k9e@AME_d+2z}-W^?FZ0RWELT6d)G!A!+n z>wn`bhvW@gFit%)ZMCjN@tUT5A9hj8tH7=hQiWZ)8dfY_?Um>R;NT;FQyzk*_-YaT z69!e&{Wmoa)|dmx;vDh5VklU70*Vt2k~D5@b3%1kDFldca}2YKv#o6F=|j|zJUI3Q zsjUJWxP?`B;xm>Nz?L$n5!VrQ$j$$IBwb}VT7^u(DQRd0d>g|;BUGd!7`crv3K7_QuXItoFMaZaTLC*A{{qON$M$VRmywHInZL<~;==~TK?kQHK~5*S8oQ2r>) zc%o^WIa9z&337oPcA}cMX?y<#%uHP6{|U?{rT+oU(wzPRX4PR|z--dsFJRV)XY~(Y zCKHVM-@pvFO$ZEi$_>>?3a_fRV{vV`UyM_syS_O4 zFJJ~1Q&HcMJ3K$q*D4wNowv-84UMOg9H*A|+IS^^1ptfED&)eh5WG?p( ztj!3C?b0Ji2IjFlOB)*=J|ylgTd&Sa7uE9WGH7|t0>K*X&k74#8C6f33{a; zcye)AEPvvJRxxfCtU(+VkTR<=O^6Cpf02pC$Ae=yfj7?uL?g(#&f|o~fxb+qkSW2o z?F=PC4Wj<=M~M=J^E|_%5&40dV@~i*UvxJ5+$7G_(#?i*dO#B$%)%ZRkfQ~HmC6q= z$iJU*a_Ub%M_hQhH0~J-fS(!rYiGA=VRmrit zxHBa|$>`o)4Jhj3a5^?t%F+I|W_#v_)-rC}P8pg|y-by;R<_nlVC5o`U(Is}o~7#_ z`lv$Q8&F}atSMeV;6m+Mg#d>IBo{A5yoVGiNRT{XSQHXC1^wqsL3xb0oVlPnCB0SO zA}AOZ0g`2hNxjgCrZPlnxWPF>$^yjD^lxn1M$&p(PBwBGr^GUSV5Uk3ux)@J4g>TB zqTO=+%vrO1-_#28sZq)1X=eu0GN)1~GIQlMi>F+mh-$rO6#Z zm0Rs&FMuVRY*NXDoBm&GZynagwl)3(Ed@$Tpg@5ZDFq4?Yk?LgI4xS--Q8W%B88&G zp}4y{L5e#m?(V^z5JJA`J?}mDob!9{``2&Jljq6IJbO)c_RQ?H*Iu8sj2@5*aVemU zeCAEt5wI&OOOZL~JXmmYl>Q`ZEn7)J;r?`t>x*qoWlfz;rn(zp3tm*2Uo7E^60x>+ z45^3swkGK$Zyk@r|4o?f|8IoZTlUrt6k&$4&G=^t#EQ|At~|6vQ%HCj&3X8YzwKr8$}GK;=ZrK%p%k1GPG_2O|CwoQ-fNw!05ZOmX;qw zQ%i8?tB?%2YN^@@Lu+qeDe63a`X!I1K*57S$%a4JRshcqV;0T& zGc7~Z40*=ak&uVxq;oM=fwYEQoGITaYeW-P46og_TNL=@P?HqOrCAD=*M8xWRr#Gdf* zOWlBM1*4{HVQ{HQ^=nNgjSv2)IAE$Ct+5_eX->~dS?4)dGS!LC7<8CIX+x81XhLxy z>fmT-v5QiPf4S^st(2yrbFWicQ2Wc*hpGqRHP%z9;x8qiw~b7Fq#R*qW!g{JpJk|r zx2Z7~ukq^IQcZ389r#b*xnS$Vm8)Ls#Zngw`tZQh7pvj;b)5Np5fkNz{G(a%)wo^f zqsP1wKNn+6e48Q(_)~5uAlIk+htCxhwgwZcPK6raSIFDbLgVU&qQT*9c;5uX!IuE0 zLKNhop-rxf7|cf^dR~td%|R$5)>qXpIS3?}FR1P}qOhjpO1)_la%M|af#7vMe!fTS zdGl!xONAPm_Zha;Vjpam*6pNYp&M=cIZqoH+Pjg}%%$J$c|Cx~r`50q7h}gyXnc<~ zTg~GD+@xTUaek0j|8h6{kTVm*I#c}S4JA*!ag*jj?gRR|3U(!V>Iljho^W9Z_z~?o zlfxH%uxb$Z>Rjxn!DOq8hH}X?7VMw3IZ-j#8E^L-mSg(JYd?F@gu&efBn^cdZ)kIwvXuxgTY5Zy`^rh0ypfBgJc)6OoY9o3r>hWi?e%CT za<4Lbbf3xKBpKMhM-zOq3mFNBTB)N8ne*)23i$IeIKv!uI*GbHQh>k`{wsj+k1> z`3>;%nU{OT%y37j_-`-xlE6sr{N<0!$lD`<(efY=;;1uY+|4%&XI>`Z&Tm>C2r-6j ze7>W)_P8`u8vAN&9wAEcPIS(a=ZCQSr(Lpt>TvvIVHNAChQlY zx~ZDeh6KmlDZVuG{p|+6^5r&_3})7vu^z)66f)k~g75Zv8k@5u@aS?U}|7 z@=e6v(1ddwiRE7fqNUqJaYHtLtQ9j0J`gN9623d8rrbnW2yw5-amhGB)%VB{wAB!~Xt_54f3;wn@nlV@!6f>YnkqhB}i#4Gk19DW0f z6Zl|uaY)xnwfE)TvdAIObiqzyRZZx8l(?YRnrb1(>*!W6b!vHC`c5*_ZB=dZH7J7} zh<1w@^iAmseY*E%6)M$=%hnms{J|Ihb!=_!XIN?c3;wqYwx?O9voVl|1I+sV!L8@AbPm6TC$6&vBh%J05fyX$K` zg+Q;h1_4by&ax11rZ_MUP{4^#BtDR5QGNkec>!V?>N65bQh@i;%g@m4{GfGINrRFS zU|26V&cB{KPFW)G=;K)GOI`M7b*#jhi>*&Oiop@fwm1iJq`DykI`e=|rlL*rah8$55P8WL|}<4Zgxq@R|^tXrCyd($7nk#I=%ves-~zJNVA$e{mH zb%q1NxW1pe&0hxHPLCe~tu7X`x0)e#cFUI$zWX){enUVGNUsB0t=<%%``7@Gz7x0{ zj9hl`@^2<50QEpA^5yB{50{j^LcH0^H`?S7a2wCv3}gAiS8c&ZvT20S{E$2>ESHY= zZPPr1as)d2O9=Yc*)Q_>Zf_vv^7iWh_7J&4k|qyLW=mHEmC*xR(;#al8_?p3Y|60T z0*Lv2y5T?-Z<#zLZg;gcnEDaIvK&K>61;EWI+HM*C!R!7Qj-2R_5u6{}t!219oqv0A)J7|R6=~7BASb0#@#Yf78FpLcdG{i>uR26_wyAH> zvk4xXo)ny&al@Z?mo55(u=-8{_wr=C)9g0H8BtIBVGIx2O*NzABdHR5;#htmSQ*|v zJn^B$VP6%3^YXU>fX`P6 zo$aVsqA%=xGoe&HB_R&v>f_^6I*@S!UV9Z=a{yVYbt$z)@>hF$auvYqY77#lr_?eB z7EXp;K=|?N>AZMHU$f^u?&S_@7)x3K8Jc+TsWBu(Z)hw`Uu{ZJs-C1=T376Fyu)L& z)Zt(?jy8*WzsKtJk@o7kV5P}kq2v5vu1CY0BU`%RCJ~HLx^S0Y*0yK?ho%XChXUXI z4-_c%ClpA^`K%qkT;@+G@cm%?(K*I$G=XGV#P5RJ`@bDw$MUCRMQpLK-3$*g7vs!N3;`*M&cLvtz(B$FC1`6%@ ze?ftt{(u5wP*9-Czo5V;Y=f&emW6V>xav2EAM-8)x&2S_o~s-(J*N;efCN^lb%F?k_Ujdno~}>wMyh|zSTunKvJB; z@?H{z=W(*Si7vs<{iiHd;F_mzSVC|69wGU!O~3*W1&Q$fP>pN z?y_y!bK+i<)F#&Hh7ItMJdcZqy%T!!Zh}|6Q*i%nak+ZEScWuOeU(kf3};*N6hX2g za^l;sG!zQxJt?q1tgd=wd_*+r>Jag76wuP_E_{Qu5ynsCosB{PEqv$W>;-{qa>bGzV3|s4D(7fzH0xX+!$+F z=|_3huEO}`<=qWo7uNO=ht;R*nm*~a1tz49m@^6l6s(DP1gQQE0$%?Q2zU^K0s*7c z!LM*pAYcs&1dPARFv}w@u5a*_`gX7rziTT{FHi{}XdO@E)RD^Ptyo~~D7LCZJaIo9 zw`lCE%R6>*mQAZ9w1rix0p3ss=G*nUH}R#Lt5UR9r8=#=BRo#?^n8bQ&~J?tT?#ntyYhcODVB{2K$jKw*Ghz{8p$w>gAK=*q0> zyf7tzIo+xrfyM2NgyW9-uzL3mcvM~^MF;yoV1>E z%o2t_AV937meYShfFrp~nJ!CBM04AzBXOXSozxwrwqfI4TGzWNGE;9A`&O@Xpn?Lx5x?T9v1yM+h31 zlx32`%NL$|q$`^wZLw47vxs&W99sk!8k*!S?ZeJ!mI;z;rKrX1HSn`$#%CovwHl9Ul!frtw za3+)59h~BW=yyJUVPgw z9V{L^iy*HVDMz^;#Db5<>;#^daa{lkxAFkdTL?KajN!v%0Av0#1y1@9oqM0Ir_;_> zcimMlzeftu|a%;ao$mz0xbxtXyH~lHZ?OQZ}nA<|TCAQ*} zLR@CuIw6|Fc-#lGPl@Mcy5a%hcaStLGX52~`4_Ce>wK4>Auo2ZazDvC-Xg8rMORKq zHNn9>dQ{rwo?Nb!Kokbtg)~dUMP{rK5^?vDNYDd+Ov_jCy~NQQTBA6&4bRMhbNwzYvoa*hF&8xbq*HP>$O_Q=43y^qvDSlF$L;Y@35itRAzH=yE)+|Ftia{O>>50fI-3Xt1cU)nf zYqwDeqznD@H4#i#k0N<{ zp|gw7qtFby^1R_zCrxWG6XU=(77~&D^Q6JtzFos*)hVs~vTXBgeUNHe6TWrhjeC-g z6QOdDaFJchV?BZV$bG|A_Tu(STpOY4;r0R1hdUqY(*udE!)s1KRmcL{P8}rZ1gM)# zxG^5|(M5*sN3O7bVUI|BJpPvKV~1qdGrW(R^u)JrSQ6FjdM(YR02EkAG#))UA8wH* zTi7;>w|PpSqt4!D3Xsx247n7nOs-c38-{wd^P*sxYte~qrh`z58u!=cSQ|0FcYGPmBgThVYV|mfh`g_929>v z0R*KDhN`%aC?2+0~8^^m_^G!)eqsT%R1P8ms?`WhwQ572+3cnB=OM) z7>RcUsUzQ)A}Ol5QkE%+e}+x+$witPOIDx549n?sMcO3~bomvpQBH7DAj;btn#Z}I zjjw0J@k7WK*Iy$>ZISl#Yr{%R1siwcPMK}t6z7+vhKXjJzIg)|^+5odnKWjSb?dF^ zFuBOy{i}#`c()gdHvp?0=2IdI-+ykAybJYz(6H3|RD}eE7WVc8si4rp3qdmdYNZ7d zEu5xSk_@OwG%tnl@#Yzycr1hr_txp7b@f?%jy5~vvBfW2f&2wf&cXW2?tR7BS(O)Q zdazc|lA<}hdAunWQhtaEL=}e$M5TVsAGv<@rHEc~2R_a+aJXj8#sqA&wM(8{LKGK; z{yh5NCiROqp@1Q+o+v2|&LS*mmg@QfTakW$L4fC{=fd(jGnLqi%%+F^)R`5sB-sqk zMh{}&c|CN+aZ0m(+qrr6(JrPTQIH3bd?T3pl>j$}i(*Q^{rbJuMx=5H$P3Ul8p|)n z=)1%^0q4i>{V@tAm%j=*OZ>_RIlPMqIUB7=e?5}0y;`oCa+*xMZLsIe&q%c)4`BhE z6n;z@#k%%O-{*}8po6QvL~xh;m;)t!y=#4VE3A%gQ%p57Vk>WEPmqk=H*|> zfhEG^I-6%?j)V_!_70roj|@kO3fl^@OIzEPD+Fhc@ACuxusq27aOB(ZiTS=a8t3cT z8T8tupIE-7J82o*5DQzLYAQr<8*MsUbxiCFcbak81${NC1q!>XneRAQ(rnqaBa(Xf z#*o`S3bB$SjK$e0t$mH<0+$j3?%co1ydc09ig~u07I8NIeG3{CVF*G6_(gWCpOiXr zJh+UMmD260zMkD#sisP_tz$if0yO$ilau-#GP8MvV%ovfY0=^nU;d}Dhb>>O=8zuJ zcS3h%@?YR80xdxuu`R1gh%GYDZzq|_4)49F$+!340Xy?cVal>@?N`g|d!cwa_6n08 zyty9GUU~u>`JV%D7RajWuu;?c#x#s`d2K_ff`9YY$hpTg$|gUc7LKN4ZP_b&nw2S5* z|Nmh0^U;jkyF1{cVH&F5Ujdat9jQb-_yJ?=O-?;(^(MO81|y&)gTA)<`Nj3>^hgVL z`N5g(18Kn^kA6X_wKqVslGf|1RZ%S80bjwz(+}*%$?3@GB!eIVU(Zj5>pK44QSeIl zUN3IJ-ebwBZ2Pid|2;1Ban^JU{xBo`{wP zF%3#4vZI3g0MMta6(Z0K-7+!t!!g1LLD}?)^MJ!JqAFhKrVM5uFDQmAz`+*Vwmog_evWT3{I4{;1`Wq~m4k znIf2MyDI1;^8oQ}hHK0#e|`D-*X4o2@^Zv&gxS-eB<_c6G!~J!mY#DL-VeL$CQ^pI z1;ZWh9F5NajTvhb=>ofk1D43|d3(S%K~Goh=9tGvCN^x8n|8tTu+GSbtaXHr=K^}< z3j-uq#Tuz;KO`%$$FF#PAxA!3ZHu?vMi}I_=@}2DKZ;pq{ha=@o5U^vsT#1*2IIQ7 zG2bbCMfyo)lw!GSmbni>A7zJQ)O|MrpC}|5G<7-O9ZWjkX%~Dx_64TI)OhTcIS=-k zg16OdKfTezI)je0_SrDK$Gto7zq`;w>Y@FcFSHP{(t1PBm5U%Xk=$= zYGKA^!@_24;B3I^Z2Bi=SfbQ!i}KHJ-eY>&#Yg+I`qTMXOk1EjYOOWAi`Z37Zb1mC z`$^Th-|-<41KR`BAdb$H*ICrux9_k&Zi^-}Bm+_+3msNGSGn)c>m2K}Q+O*Isgxe! zFanjFIey$0Nhr05i_Fn)ebh^q?Jd>8<3<;Z*K6cS zwK#PWH*yysYK6D3w`*CKOsFR_UHR(yj3_}76@58Lti@y!lF`W@)Qew^QT z7HD{o&Y6GHb+>UzD2X8-MaBRdmf3e;jzczlz(f`MC4FG+Uu44?KKK+@}s%VqEOI zIdLQ8qgz2ztt+s7>0LZ&oKaMSHu1??L{XA-T?wYrSqAdFqgtpZxza}e<(0m1OSjj1 zCBoz=@G(J|&@A=!>t*boWE0^x66!R<*x~Vg$+X$T^or6}a>*0%yhiWt@c!MWbcR6T z5Og#&+x!0)Gy2aywK1@;{cE32sO#80uYck*UH&2%Zhs_R6BWBRe=aN@Gvg9U8&1F@ zFD_)CP|eh%9ZeQpl`4cdz-*+tIUWcJ5v+NL@nPe5XmxeS-W(9z%&8tzP9uUZi1qD7 zqIh*Q#;;rhk!uoLx}^FxY=>9+=mA4Gn|c@> zBbG+3fsPEHxgU>T3J$)S5ALgdBZ>aJ*slGo>Z_6Ys41FNv`@M$m-^nQCnq$=IAiw8EK;#4N%{wK!iAwF-|nKd8D&0?b7s zFI>9c-fM|AuPGDu+7i(i0K3qZ$+Y_{4C8%YNi(CUjCfuA>wfZTkK|M-Dle8z_mg%z ztdOm20_ww8&eFTmt~fVg!{$GZA9!Gvj9k^HVyDZR#Sl>Qu-W>VU{gA8bl-1tdtQ7b z5umJ3>W8gqf1m+IugGqA%tH>Y&q$x>v04`9p7pf|=gH7r)Xk1u z+O4FOx_?UJVZisEO8wr~YhhBi_WI|W*VPM+TK;Q96SlH|g}}oVGr1k-x!?n$dpggU zUvv-N!_h>4HrQ9Y72>g}zL%jzF*~-$70Q^bz|Q;Z%E5@oO$dh=W)TI{2hpA){XWy> z^efkiTFT+&Ilup&L7`l^vGeoDZol(F9zwI&!BCrC=p@4CoSUOn1<>@wH(qVTN{}@( z27yec2|kf2^&Kv}Pt* z{%Lh}we=nnT>%X33hlUmz?eC5wsxO|&&@%jzDUQ}lc-*wzDU5CFeSLgg`!644IBCu zSL3lZF3M?XmRg-Id2(oZ-WgrHRWHXemMNweuN%V?r>wC6*Pj*B*3FJEI*Z`G7KVK3 zP|B?YQW_|jSl-SSZob9FR<=ucbJiW|bQ7T4qSd9RMuj>c0%2Ry*4FE?vtwJ*%VRq# zD+764?HQttXO!gl?hqc9I7HeP!6-tbXk1E`CFnIFNMu`o4wptfqWdQ5CsWv^Hgtls zVI0FwuAsytZZ5fn+qTmp#>wk!RzLO%vvi$kxV`aCn`MCb%Kk;dF9!Vu9*tc6{D7>r z!=Lfm2Kzz=yy4|UZ=y4RUup=oL-l~$UpCbR2Cpe7Lg1PPQ6@R`>S{n!8&6a#P**XMff1@iV37F6) z-pLNR#gX-FvjBj#t7x#s%*XK$7u7P*8-u3pLER=HV|iN_PYcJwpDj zBAZl2p?BlJtz;*HSJ3Wn6!>r?AKGb$w+YRpG}Lbg?u?2A|BA3VwROUVzZ7fC4F(W` zmRsM0LmC>~D4`^UJHkyQ)1#U~NxWV*_up8BSti&pl3|tz!MW%8#nj$8o#K991jnaB zW-O=FX&aRB`%`2jhaYF>;JKZ|v*h|6mZP0ebokxdFEZ%!zofRIdyizafG0S~L={jZ z#mJACqX!Zkqwtl1R_bbY!sf?!Kn<#3Er5*(=e3qUmsc!Yfq1TdCgm4t!87k_FOvp+ z9yM)}&qIp=bw^OG=nHd%CI=TB9CKO1mAAmwIJoU+>1VdPnBkimmjb_ zn`&sV+TdL4+|wGOnY9&B!1G+-U38o@&L<@e95v0E^9~MI9aPcGpi}`=QA<0rt1lKeEj06VIpf`eZaV#cxlI{00m(854NNRoOLo3IDWC z4llDx$bfmh1(J9K`B__2ssFNS*q**5G3@Cy%9-%JhAMsokjjGY{d*L>9NcO!Lye;9 zs3ZS9<1gty`pnh9(Zayc+T?G&78@a4=Ktmq<`qwO3@R_*9pxq=mi8A4On*(4g%&>v zXkN1C=I~Imfa*6Shrha8VO~>(XPYh0VCwOs&%lS-Izf}gJEWhx_CDn{Bxc=1$cAxY za&;-HkHcVH=Fss+;ke_0+YQ4@C9&@L_5sJcjFYzf?jUsF*OW)hdh5eyCQh8vv&;(I zx~SItkT+Dzd!%|qQBJ=R%a7OM*~wkM;lgaJ0mMr zb0h0NFIl6e6`9s+(>h&#ouQql9+k5Ci0lRCkD0;+a^^ut#rz%2$Wb*bw}Z(tmO^uo z*9kA`KFi23|J<5zq)$0y-?x1nGhRHsU7s)5RyYnj*qs~Ux^itT;PH!8?!*So^<{9Yn261)< z1gU{;&fS()UR7mew!MrrX>-yx_O6>SWOEzS`;9s`TyZwmk9>GB4PCH~T9* zd-BmI^EoM!*nPbGL)8UxmY0>(@n|Hb%4;JZlfHAZW#qx}MK!pI2fqqAP8+IkczrKQ zk}uV-H?1@-lXS*h}+>9 zmbmB>%x}yk-eWJxtZK#O4}VZE+a!8!ZW!x!RLO{4$n7HNrA1rC#r3uD%MomMS9 z<5trXIcTYPGFNX5U+TPH8W%LrX{s5sU{$U-sACi8zFoBTOU;lWnYB?OJN6_W4l zFW!&bcO1bjNa=Gj8tON(_*~ag)o8WyV!ARv7&iyH!DCR66*;AnG0~CmDUFhtU;oILS`n#N$r}wNDvgfP0}|SlYn@&Fp^BgFa|yO`1h6c; zm;>KB-v60JYUJ1z`3ZTm0laf-;{J*tuXkI%OX5B(14=zxw+wIVd4_B`CYW+RdAM|L z*XDh70leMHXIuLMI_abu0bOr!EtdwFO;atcZbMG55Ql2@SLxoTlXNJX#II)>`b*|s zr#*C5ky8;%?+i36UxfukODS11XUs-R@v~-_n^yH!=@n zg3qw5I}^FhD+cD)ET6k`JTwwvD>F%Jp{sFc_P$R{_@*~DfTy>JsGE@}8=K5%Nc%uR zzgSA_#Z!E~l7@nM`t0j9f_zx9;zCZ=a~K^Uc51@5iS&7}k1% zK1WQyvZ4aQwOW{!UAlWWw!(DV=Gb%8*8CB%ZpOBRN&o@6YXo|qNW)#0Z|BV*dP{8! z%PlwP7n@j($b7eHAYzNaZ0OlRBYsB`2D)1`K7ib+=|Ln^ww2%g5iY%wI^2EEfiy;% zT0(gu{LKUX#*4CSvDvYe;ulW(rM9Uw78w_rnhf{+RTOBccpf{7$bLGbj5y@blEj;o z+8~Z^#Pg{j53>9AYBNdp-~s!wBd^0}v!~;zg*S8IL>psLtJt!0eM1Hsp|l3IhZJMq zhk3GlXhwpCnH({M?0)bFsS>{#ENdZn_MmnI4{_q!WZlOeHYvspkFxk!29+r-IQr#%?K^W;|Wxa{9ei-RUWj5(o z*=Lh!jaBZzDy%xQim{hP#|2Z5s*?QT{NI=klO?r`*I6b%{$T+fHWu^UB{ss6jF*}& zkx1zz^ij5dAXEP}g@7i^&uBZKi{caXzE{7eF@QNwi#<>-IAA}6g_qP-pYbsTd&0e8 z{c&gGcNFbLb07Q%HBCMykdSHQXv(CqI?aix$K_b(%6uB;5Pe-(`tiBN`YC1t3A59O z#DQ8X8i^Tou-nMKihqIXaTcE7d5#Fynr`qu`)l;=y5)MlM{{+MjfaC3Toon zU6kbLiZv~=4|+*io{rVcU7j$I^6)R9V5-YjazFG6E#ACg!PAdJ4m0XQyZAvyTl~@C zn4&g6iO#q+wRpWf^e(ZlrUC>qszo{+LdKUgveEPGT_VTK_tU^WG<;uKSzP6ZVMvZ2 zPcTr64pC}yZd0kwHOUQLgW7>Z70Dy)dJ7=mOohcfpyGwAA%X+LtQyR`Zk< z`Dnc>!;hadnombnzI>bylfr#SZf!MLNA2XY=}EB`eX7}nn^`=CTR zn>slgIGg;bDE+hcUoCyV#uj!-~X|nC|UoP#{5Yd^TF>c_WuC) C$Va3A literal 0 HcmV?d00001 diff --git a/services/product/terraform/tf.plan b/services/product/terraform/tf.plan index a2d97ae06e9e16bb3c3bf91cdc21f444117b67b5..42d830f97399f1bd14b7a53cffbac8bcaf06af8e 100644 GIT binary patch delta 10429 zcmZ{KWmFx@wlx~u-7RQv2o^j@&=7(sS-Z=N& zd&c{^e)L$?wW?QD^_Xkc>}vFE*2Yj#fJeZGLH<)7JoaKS$bm5964NQ2LkGQnx77r* zG>Dvy7e#+X9N`6n9Xef$w?aI6T_USaiJdmL9EoL^k&xH!(K60y1|%~@!P*Mh(!Wpw z6<;3_mNXkVMhBm2Dj|uWrS06Bh|7*! zX1j~|yG()eOW^2^((sH+Ui{I_!1sLt?sP63jbjR0Xn(8H-iQWQG_i zNx*d^(Yc-;FUW{!=!iRa(9;E9u=07^<|= z5=Z9Tmvaps9r&aL5hIvy*sI`AZ3V#cZt zFPwVBS*Sx;&R(mMC&1iE3>I9EmKwwO*`8>|)6~kxJndr5C3Y<=HuC z3>~QgfLv;aXIE&2(GCm?JT?M)k{)#y5XXS3;)ytlZ5Fat3O;SMbt&XDqsE3M!p~3k zK2dGaNvns%d_Z7ddOTP49zr#OlU#XB(!`5HD(wn=EYc-Hl4WQY`*zZ`l`z~**I1!P zk{?qEz9~2?JG6G4fZ-^A-I9^yPr6v`5bI+dE>RVw{tJfti0W?qup9@a&f$L zK*Hyp9*KJV1-&X<((sf_I%GOyJkp%$7ms>xt)ryD&&bJq% zj{FBHQ&G*#1Pvw@k=_X%b8zr)M|+E_fj5w}LDs4o@I1X`<4=*(Z&9b06?Z0+ zts_={DGR3+C+i3$W~8@6<4EJS(jcYi$=dl zT3x?5gD$l+h*~Y+&XWR7zLtQIn8YoE()}VuY3C-Kh!P_Yy#*~sye~Pn;}zL>0$xYR zG0l9+_n#YS+@xb@$j_^Z0w%k2_}PQWBlqgk2EiyX!q|M&vS%IqpS{Pkea5-j6+t#1upR~O+4?w- zby>Z2VR5O{$pUP8dF(MKC=_|MpckKHPDCC(ssjmuZlUd_j**r$zCFKS5-BOj@nKl(*D30m)psJ z%#VYqwj^3#YH-DU&DEU)K#y-mgD2jUG!zq57npQ!Zsb%ERX?HH-3;!wZySlKQB5mj|DuC6Jf=%C^gHDUyz=JhaL;bo7{;h6Xx zq0Z$A)xJI2C$c-2>(?Sv0;Yg@>U`Jbl#*$zP zOVi--d#U^z!W(g{ANcJiED;Wg$W2U(0?%X7#a)J!hXRRST|+Z2FKPA9j1SRhd<}2b z&HY*!;Eoh*!!h)MBK*A24t!d*d%Yl7Q$Yr}TEUzVD;2$wbeMN4S<%c3MhBlAmy0CH z`ZBOb3dN5o4(Jp^V3-eGM3JNADL`A$_Le}D`4rTIY90c4z+$36^;pq5=X8mZNUd{} zEz~U&!bU(?I+%9Jp*5yEcHDAos6A^iDWfG!jn3#u8y5`p)G#^aX5ziLJ$kQ)Pkl)| z>A{;T`h)jZSwgsC0_IQs)krB8j0)*$V)th{pISu(FjLMN@= z7$r6)H>uUBy&PJWC=;#(2tS^S-~CAJ1xE*Jz|(uZ&){aF|E2rYZ`o(Z6%vf!?AfAB zbU)y$&y)Z>+@lr1daWsbd`V$f^&6ez;;^1#c&CfKSO^mxy`LvXWgDh%s#z72<$xL^ zYJnS5u^%95GKV2P(^#Mni*@)>KDCSyG?y07U!r7jI<26lY48&q=HNJnh3_h_4f#TS zu&9zydE$Sfay_l~J2+)k zD)uFs?l#4|AV&qv*8Co`>goRBcW<8brD5xMEcEFTZHB|(TMVQs$c~hVL617AX3f)1 zmr4$JpDvSojW{daYtL}0?a8S^z`hsI=PrtyENJW&1m7E5SB*yd)@IHzpkwEBr5BNY0pTWMbWoXPEO-jg^&nTT&hp!h4jCg)t#@m^GE=rY zUHtT}x9>x!IE(3FSgxWSSUii41q+Xr5nc{x-k$Ks7$xUcD_z^E;bIz?wAdaAUSW9V!Q#J@7 z*3Q8e*6E!jyQJnErQa>~(mP&B9`5k4-_Tvnp70r>2U6&KMo7lVAWHzR&X$nR`>|Nt zs3{>k)PW8T_2vj-hJL$z)^Da~?|!Es1UtaIe^0|e65_!OmMm6&lReqXXGy*ka~a2FCUpx4yr*R3bn6uOt|j~(+;IsRcLNjRu(SMLdyNIa0uGQLgpa=^;sf6L=sv|CCg1UCyB*KJNVNQ*L-QJD=e*MYc$GC z1Kwp#rNj?-e#R+TSD13Zc%xLF*1KM+wwA#&jTM6d|2g&;Zsr4<#_*Flx0!q}tbPQ7 ziB^=;uE3|*g7bmC76v^ zlA|a;+CM`h+N9Nd?W~Qq7_yU8NUU#sMNdnML<|nQU-2rFtZ&wjT~Bradn6F)V*|2R zc%n_G%QBzYCx8AaljaM>H8CQ@Jada3e1U+NgUwPwhn&ww~`Ac7N40F@1LmTw6 zxj0pxolTPiqkNn4tvP#OO@*&qeOSEwEeONCwUdl!7EM@%o|5y6Ivb2=|M6}X2+Jwe19wm)ksf2gO$=Kb(6Pxt-|!`l1SRyeQz zb2Bd{J;m9^2Yp@CWiAW?G3B_puN&sVT8qlBKrs~ISB<{{k56sTwsi-v{4bQi{Pud` zG<@>XGXvkkj^Rc_fh-XpUYM8F{&zJH=;qAAIZ{f}jAB3`7lSk8{d~k&!36XE_cVzu z6Xt#hb(X<>c-Urw{AmX8X78AUjC2FfdhhA;7RL7-B!km|FqEHBYn!2LcJWmrq_-vg zDt=`b`w*2vhBie*WSrj(IV5#BsbAH&RN`R#A21zX`yxc_0qNxB6pP}Ape?$eqLlGg ziX*ER84WZqT(>(io1ID4j-4Z3j>`h^J6VF!>~M#&BD$*94s0$sG$Y@VT0x#tWkcQe z_vbu248Pv&Wz4a)PE@vMqWCx~sMmpUUrfRco7~=r18Iu^^F=mG+3f>rG7^3$g+$ z%YsY8>c{|P@2^tz(fX61KB9|?b?@X1Vx7#!@M0vv_U3j3Dbj|;DP!IEI2yC&W` zThg%-kfJ*QwB0c1fD({BR3n>CDDibVYTiL2m0o3zK5g-M22VSkOn7OIPv^Kh_eR;C zs2?U|J=w^L+E(wLnw-MF*jg0f`Knn!Ukv%LWC9fuUJ~6NhqiNKmuCO0v_<*q?4{OP zg7_8ywDQEYTl!osVO3ya`YBt#3;$?Q>qW9FF&3PFo$+F>GGqd_ zD_dYEs+q~K4f8rp!br(HK8g@C5bKB;6%__Lsd&qYD|HoxM~mw$T~2KQLx+#Murvn? zWiucdMo1Fa;n8xUzf{$5Tu%Ldj!&ueKC~zgGwoYV%bey>ih!L@9e6w)Sn55!J*!jaag z!-72F(@HzsIi%0Ox|6#6_XHo-Te9~w49GX?GmlL{u#20c5pshpFAqa~*r>cpbv_H` z^@g-Zf-dGKt-F+CTZRtS_4lOt8?@y&*4K+0+WzqZxZEgIvIo$h<*I}2Cb&T-z0+yd ztwfG5nQ)o!VZ)naZKUH#fUiXFWTuWe{c#S61Eea3EvH=bEQe{GGq!c6z3RW<)$2TU zk@=u9ZXQ0ReX$W3RWL~RhI$qXj!Enr+}%WLsgQF7Owb#m%%*{*-mrNHRVGzZt!Vu2 zH1#G~x$Qoee&HrJTtR2tyh&PL>uM2h$(=|Z4K#|yW(E0etMO=w0S@I@M9;k~;c3HE zK_HZZUEHbJCX3XTV6hrVweGLtL|$UB*NQFIM`V)LmLc64Phr9vPwz$ZQ)&JWI?vIC zZ@>P;2ztw)B>}&>i%Y8ZTBP4zn}N=PQIwumcm30Xs#6}bN1oWqTs62Q9?a}X28yKyP26$Y|PEz54;%<~oT<7S>o{{i;h zJ{<$5=|>l|Kc@XY)9}>l+*jTw$+Bd!L{4@KV45(~gt1e1B2fgcP-2>t z(=$R|xy4LcgHhvZzZ4BH6i@C81q~B(9eu?k3xFXW2x}gH4SWioJHB5$MQPx%m}z89 z7P2&TyQB{N+`P{&Cl)0q)P^dW-6HX_xxAJspY{C`94ew~aA5p0)_e3Sr_AT;rFof`BbXYOQNkzMOae{dp>QW4dVnc;ZsC+{mN8`I_UT6-y24p3bYm>cU9S z+Tf$uLhS=&lZ`QImg=%&mMK{%-1=oT=()vgEt+rTf#K#+?r?!BXWli}BD4`jpeE?K z=K@^TJJPQIZKfX}w~&jWAJ8g0&F`!4(;Ve>%K;M2p%Gh(6&e6l7<@ ziCj;cx9qmS=2z{nyA|NeNZl}#y5r={d3%!c~y1mK>Tqsg%;5=P4d0ho18~IY?j@jpj~dX3?x}WSuoV zFgAw9pOr8TK~?{BnwGqbu~V;H@ALA>FsB!MK_`E>m_V!fhPV znarOly}`s_sJ>Ogz7tCzZmj(y9$#bNml0L|A;4Rnar!x|Tb#gEBu=`TIbUbvmiU(Z z_&7WJG(ayfx$i(vzc#%mJt(?L6-oX3*eu`hHhGsKDn?yhsO)bD_|%zbG<++trIl*? ztS4CGj#39X%Xm;(7;a2~S?m$Ibc6PWwe)k5x^a z9!Te^eS!@mu1>!EO&~- z##~T&Yawd-#1HB?OphaFM02oC52ihX&{ z1KekMf7E(ZzfY=F=ahgheka z?nesm+=e_qmnGcX3hBe>6QnYG0*xcxX#mpS5Pk~`_QxT@z~GYn6T*EcY5#(7sjya5 zI4*SG8&T;2*5Dx}AA;Dt_~PC<`H3cSA9pKq^7bqdn6+Rjg)(Ae5yg|&arR0Ei|uPx z+DSZ~nsIT&bmSBeHF@{c$x8l1hr=+O>vhQwX>x@n?3$W)5_b@klIpDKy3x6GnBluBT+%c*4O`l#INnA~a_|q{WgzElmC@f60 z4i)ah*4fDV`iP??R>)6YEl?$$B(^A0D0Q-QZ5-TqfwAN*kv)A%V>_}FgAr`N2+Fo0 zT-T(j_~JZ4Hb|y_9#{pE%`Kp}&C;mIT39A*5Z$4!Y@dZx3|i4)hQ*M9dQMqbvNDIx z%bFk)%U|X&HgP^#O8i=fzdU&l@@*5kQW^Geo3N0hyp=SN%d4mkYi%&a$pT0`S_A)E;VadtIT}>9YjI zj9JUHps0>wDH}&fTkn&dDOb*^v+Kp}bU+H*$-|*JVQ^L0SNMu@9|5&YJ$vPW2p+v@ z%s|dkvH;=G2y)o_nITiUZuKIxyOWij$^@tx5&I$QI38=a!0?U{AagU)Yhua-oUJKs zc`S|{-(C{q0*36?B?XrQtrCTb^j8h@qt^~=ndRS9G6k8iy=O9F2Kuec8a7xuI9Y0! zAiDk=_*3>uSWAH?YZl6Tt_vZ@`0)Cqtkk{3@F+U4q{9RCJ7FH%T8G)X6!Q~@{Nc=L zpSXocZ=6g7-NjJ|?yO?PjDXh{FMhuC`GaZ=@2!aD$wQ-`DOtB+%J z%Uw+MStTx#9IgfVx;0ojp4g`A5Tqm}3kx1kwG&m^CFcU-SBNDG@r^|#qY2!Nn+PH& zdXVf|{&U~l*#XL@K+e)jV;TJ&ktBdd$9uzGEV`Ofig zK>e7#aGod?kYY4{c0_x32fVmk90XmskL4rjk1{U`Vxq~Fog9&tI~*Jp`*`=4z2PqR z0S2wQJ%*Z8e<~!$I9BxZ40{|LI93b`IZi8p3c%y$@C(djHaP$L9^MJqDcZ60jv_pk z&JDaO!>BX%^3pz-&#&G1)O#P>@h0M0?_i3zX%fysxftw`u#na&VBc*8a`C#HH;TVO zEZ@Y3c0!)@*oFvh9I2DWnT(bMwF``j0&+J_IuiAakHn3IA}jH^Vsmw23#Pacjc0*C zR#M~()s*yfm$AV&c_Kr?-~2!EgsT!wIQQnyh_Tp*uCQjWguqg`!ZD zR>WO@uf*TG#PtbSLV2>N(`_Ry+?)ndvRG3_1bca5k0?r>?N(SVdNp)N6PAsTM?6Ky z%MO9lCc-+&j+q1zEdC&{C@iJ<*5v{%X1OIXV{FcPM(cHx8unniqAV06FCWwWJdv%y z@1zpuoTAGQ{;1S=!2g=YjvnB9VYYfma#4&erbq#O9JPcE#5p_dTpDVlspZD|iSaC^ zO%B?K zUYqdYPoiMJ`3ER#{Au#{1%mQY|AoQnaS{&c;^={=k6}0mIU=TCrx}RyKjg3-DtxzA1X{Mx|B4cje&`+c2v0&-qh? z_r3?Jg3b|9@AeyRMJYoIt_HAtYIIt?{KPu*s78isjeqO@_Ou<-$=!(piUr9;-gbrs zneXZKZ%7QJWiE^=X*v)%ajwPxtUp9vi0F9y(02C`%Tu$A47>QpC$Tb1h4;=*&-7nkwFlmZzXBJm^-PIO z_r>Auk$ZM`q#8R&@tle60n!>fX&VaW_7jIkYx2r#yl8WqTuJeZKZ`Np^}(};m+*A6 zVh)DO=IGts$zTmT@x-k=U>X$o%wOFzeEp!ZN&Zk_lazhu#U)1M5$tDcOQkh#)3iH# zP4uO&+a!PL`|W{hC>F620RMLmzaHLcvVetw(fU)PqJZ`vKX*a$eC+Ulk|fBBulTPV z$-w{SFI$aY>MuKu|9^63ou+PdX1`tAY~^jXUZGZO`Z_uZHDc;q$r3s1u(N8>9%A$_ zO&j;)=?bsFpEw!mdM#?t7#Hph|JYCM&(jscsa5QAF$tR z3lIzki964J(c1EgDNXrUZq#UAZCas-p`O3W z)|9OBgCen)y(E;N^8wBp4R(r^(^7^Hc|~zuH=zjnL91dLpUm=0y!&Z2GjfT5o2Z{o znoZzLWi)!&2Z1uq;9HF?PQ(d*ylC{XJ*8A;ohjdvdM>aXy?nP<236BO;qIX+3 z|4n3wjRF`4QeP$e*71sO6v25EtvG$a1uz*IG_&$;Xsv0;@xu6^3N=C^x!$ z2E$c-9Sd-F@^n+1ZN$Q#{PpHl=*D#YYTflcek z_CC^=)-#-$Z|A5hza84WZ?421cZxVRegNm)RHMM{7XNB_u*EFZ%KGlu#m&=+X5&qk z_r)~5jc?01skYIIrPoCty-oB?)XH09ooa@NfH?WjwyfFnaq`0K*_P%t1IT8uwnJ95 z22vG#OBOh$c7|Waev;!cNkusA0H)N|WlEfg zvn+|ZCKGS3lRdSsGo;OJBDWi&W_71aO}iUWevMnj&*8$?PeR`$HkWc2OX_FJ-=I#~ zDK|;z@EsAO!O@#QeT~Zs?N@_-F6Vfq5mUX{?o7J0QbLfxuD7mChD}>|50!zbw%74( zTK<|yg8v$=G4GgpG2#+Ar8IOcN5iQx)lt=xNK8n|#Z zx!*0)8VzDo97A<+VHXG(*VfblG@GS)rIqKm6KiiC+nxJP+keVEZ2}e?D>s!{z%xY5 z`&{9{ZS`@{V$5)*eQCAz9`0}=CSst1d3|)FArfz#;lv$M1;sT8IEO1*aY$d)k77QZe{HrM;EtG< z5_pKUlB+mSEHB|Hi{3GCj$bKoD~CnLCkzM;&gCHL0fuOJcC}7;+NphX$~bxX`O7aPQysG zI)Iu=ecvZAL6S|Bp9RaLcjNh}IlfYC3`)nLi|{kq4d|gzIY96l^fbj{E!5=>R1OI^ z%4QQH{%XXGK>=_l!9$HET}|Iobeb%D@E_JOlS?8Z(azUV%w%_2kkU%Xw=Gaqf%3d( zDJhpDv)a5sOd?`+`H(zRZ$l?Dr`6&XwLPmD zPTpOoC7nH)bis5(G^O);D9K?}>spmw^%JuZPBbiBpED5)3NNX4nO?V%`@vS}3Kc>{ zFXTp?=Cnrkv4c%^gySL+-`jQIUkd2x3VC}NUL)Vk1c+qUN_IJgO|EF?!4^8YMNe2B zWw!Xxy#s>S*}i^+-o5ao;=&0f6~}5SyU%2})}=Lh4eJGtRFU=AjAj_werouN&DIw0 zqU*8cr>bn=CnY2o?YJQu=ai;g(ssSHX7x@tKf0DHL|SCXz&u|EmQ^Y5XCk?QaqZ)W z=iZp$6{Xl5bZsfs5?)QL@dY2bil}^yanK@$Iu}4O5{2BjRG2SWY2`IQE3M{`qzV%B zDUXx=mG3Dn?ZP9KYLD(JnFw+Fpf-AD1&@vxPr_?7nA+{s1%uQS?{WmOy%u`R1LrF) zv_+v-Nbn9|qD{#Q+ zv62B5XClMEy#0%i!ouOh{QFFs#{UY_phh98zZj{C!hbjUPvHXz2IX%C`{%CoN6~gQ zcX2g#HTzp+F#V_Z|7sL4FzEl~O+ol?Z#G9~v#)=;AoxqD_-7v=>vv>|(7#%nIM|z8 zS#a2~ar{Hv_@|G?f3k4A|9Wo@G3eJjQm%g;<@;x_|H%&t|I3Mo5(e~(mmKf^@B%3a zlfmy&!GLu5DF4srslsF*yQ%***uTSfFm~D78@3&`n&-VSNt8YEG z`rO-9-Su?cc8wNK1VtHe2y_sbzs*DCFdhLPIP@+yKG*WG#vgW}5>qzCvYpZWNvZlh zkbhYi<+UqzKc03C|2G=NSs?nAxeQ~($@%2@W>^Q$So#WCtPn^`I9{QU)~uMo2TgfK zlB5PI#aVyCPfo5lhL;~NseTVH5&`Hiary5Z%&_Rxu8$A4QiK9FZ9xvGcfBj=-|RNu zfWvQBojz*|4(Ckmq2DnJC<2&YJDK}&cLI_Nz*wPFN293o>PYv+@)b=7w|`DBv-Wj= zuJ*y@33v&;Y{Cgx@OXgJ!XDzo1gz}R(Ao-%rOY2p@KyZ z$`DLq_{GT`UlZ#PRJjkyhGKjyp}2Gc4=}S}VS|#^_WI`v4)xTVWKo~FZ6IQU25Xx1 zU|8yG|4bwmcyzA|4$lW-8jOg&CW@1k;#71Mu$7W3}4J(PW z8MfzNSBgDDowy-z!sUh#M02T?hCd0kH0imYk@V3vx`1+;QsnC^_C=vt>Uy+pd?h@I zgHznn2Vb&j9A(BzGUz_q$e=g01n&74Y=f1|h>Oqib9=x{H>z6~T!u1q~;+9(@Pk zv8RJ@#r0uRkAVF%2I}0&6x-FMrZa2{>~SSDJ&$uKC@~UxM2Nt0X>>uk&R-vlLJQqd z4qAt>WGSq1!?g*=SIUXhs0xFxq!vj^r1cq>;UhQ{b2;ZHv1B;I*oX6`04$-&e6xF$ z1xoby!tW8JFsX(g&pUNa0~*Y#VvSI**pD9*p4W#gjJdl=&Ddhiq{xg_$orMzNk>;G z{k4!u;qsy@EjIUJhUM^%z1Cu!+e5{DqiWM}Ruw^k`M=Ku1ZGL*ei?zdqtw4ls;W7k zreCCt=9cM0W(EkoHw(!U1J0L$yP7-J{GbUklx)|~6AN7?hAbj0Ns&%n*AMJ%)+Rcuw zd}B0pe%Zesq5j!14IpAvw(UNh$cWUG4*DiAQI5_z9d!NriJeKnF_<8CNfQvW$_g&SrQ7+%UM zrjiFQVHOsC3?G}J4h+c8=QB4APWdn1eLxwAjf&kb zyu-Mk$8NQge725-;3HaPUoVWUl}npKe`C7t>J}{g6H+(VfsI$@T~T!fA=XyxYeLk2 zws!evG`nTvq_e-dqtA8yp&0B`#zNkl=qa|u#u_^5Vna-$1$b4nxw1t+D#u$%4Qm(f z>&$zoj9c@84(4^>p`F(jB~WAKv=3qJC}m9@7d5j_H1ejRo>VpKCguP0*3NylM7`mL zN%+d6(fwX*zj9BKYLz-cP$SXP|LWS0mf5XQ$l;{TD30EBePN<^DQ8IA9?k5BxpRiZ z;U!eP^my)g0qAPWitdeZFR&R}!rAHF@|HAFgpg=j@i#JX-krjefz?#u4m3h;mXEJO znLLo*WM5^2Ox!5=IT>ti?ibLrTEZDx-d;J3__XYH9pTw_@tB!yr3sCyUs<1i@B77; zLFB1Jfa?>ebF5l>A3{6TGe=*PgGU+uk>LC1JU#OK4=`S8I5oSIn9grNX*zk-xW8{+ z7Kbkt#Z5l!KvZ8J7`Sjbwf&uzK_nFIpkTm)g*SKw09%^Qn|kMHh_V3+#SCW@Qx>{`h}ie zl3%FF8^A1E-!HE{{n#X!%0$4wv4f0x%9=Pb*+EKO-|HAb@c5|X!Gzq_JxWn!%q5Os zrK19y5_m|hV_2g9QhL*(_Omo>HQ)#3NAWwJ!OtYsHYSW%eaJpZQhzTp9QMTU!r8LT zq{=%Q3kpKQCvkNHY*>6k$@?L^Ze0W~>-wS<5+L)A4mPRv?xD-sDQ zNO{LjH)fvHO)*kJkYO{1d)kg!4B>6q)|rr=&c2h(xk^Oy{OK}KJm?%cHs-*x`lFw8 zKUXTZq4|_|x(>=kv5;HSiL}`tye(7KbF@o-{B}XJOk(&NWG-i%k?*2>D{sCr-GrlwHZiTK=a}?O=&YOH ziMjEkvfxazRK&6-h?Zbhf&lQ9@t2;-j8f|S^D)<@^3k0izA&@{j}KRZk_krK$1ob+ za6U@Vjgko~HZYINz|F>vXW8mFXXhaA4jkZSH^I;eSXg;YjrBaGW0eG}gOCm|A0^{q znnLYN7T*R7=mx=5>D?+e>pGP!raJcxwx6k2dFjr*kcPfVX|1U;5~C@suHxDw0!l9d zcUD@i=SYQPRQO4XqDN9c_dv|M@=|Z^y`6-}r=yCe8A7Mc-##m=nzQmrFEp_>BYb2vUlJ$X$tMcCfP2zW zo^7rthL|fc<}qIvU#f8SM3OuGJba|{{kNo^=0$YLL6lgNB?@b{FG>zh5>@D>XjdozY@|jQ&+9f(&5@O`s%zN5I}rb3`_0mER{8~5E&SvH zTWCRmEA029XP=xCTV+-PM_#`FvH7_j!@@QF2RVqt^u;FC=S*kDdgYWjUZ-M~#Ks{{}5b z2nOfKFM{*3qb)5@Ge=b?J{k3A<;0iEY+U#Jw|b3}i}z*IV;(~(8sFsn#t!sXm11kU zYw@1@d^`6C2q-c4Hdh>ez;#V~^8RUbMSQ8MoW5*sq_UXaCXx?-ThwQx08wl#&M3CH z0G8c1*8mnIJy z8F!?Xbc0m#-@3D)NVrUPVKg8t8*V(w82lz3?>|C%s5!g@|BxJU13ksk=>Z5+DA%TC zt~?6(12~9w9J+W4VxLN=eq z)CT7QaW@`<6`tyTT;?4|-qR0$=N3&nH1lT;XI6S88D+C(!*c<|u(}+gFYm7?CnXYH z4VCC5d+PLZnDVC8bSg_ax^K*8mfSmH%oeErN^ZJ>{vK@cz_}E6t(UW;!I7RhZ^(Wz zA8*Lk;Z6x;hXVEmAa0Fm1=iLsGCd%?Bi(Vw8;ZXy3q8kSdZ1a0rD=P03g5ZL_^$KH z^Er+2fZM;|=9`)dm3SjcnII{;`##KtrxN4Dk`_g!9Ph42zNr=V*!gqxp-@-eWRA~{ z@Tm2s61Zgrtm1@BpiYL{27i@)a#F44Dvf88lrR-bmnu>t^e;_Bnl&|?+{j=hq@#GN z)kXAszc@+}O%|PumBllsl7pkN_BFx?k*qJ^1fasu^4*+(^ZbmZavm<>yd>;oDjud{I65f&Zo0W+W{b_@xUIE3Nmti;F8B{JC#g)RhgI(($?OclZuI zXAWN~+`HNjuVV@t{503hbu~^(AB%!qZw@3_BQwXNK-Q%oUJEO@niiR|tZ;MgjGrCE7gND77pD>v?=eZsapviLCW_@4 zcr@^l<~k-^yGXF_33rwA8UgLmNAedxiZ1YhmbTm3kNS;CoH$>jHPnE%kN45Dgc#{5 zPAcom!aJ#Yg*>w&`LaL}LKOqMA&XLb;Z>$?TWtJ|+v4^iq)T(Oj*GNmoAFoq*GDL% zLwWjl*B=rU%yp`1%e1m@&ZtgReFJI+yQX{1uxO9;xvFWcN27gzFI2nu{j<; z4PBd$-Aj1vn9y(dyr72#KH622_ybRMk5>RZm_G|ulvh}%hqsN_9CpcaMslYB@Xn`h z=IOSkD!#X4Q?jIL+flHyaiQ@8$N6Prz6b}}UOcQA4ai?fGDqCU^`vcH^e|iJx`=8| zcU}p)!4W&3;jC8cNBXQY6K>5%rl&DKK6xstUfkKEV(SO)mv4=>(}Bdi#cNjeyOFH zPWNk40SHyo3%*L$O|aCdWAtivl*wceFAf$HTQN|Vwyz`4V_G*AiEGWPs1${vgbL3W z4Af~Pi*qWc)!J)eGAo@9=>{i*7IV%k5)z0mNrS|PyaOw9;pB^&!c~-E7XZFeQVceq zf3Mw}C~8qVF$d(0IX%ax>J{7RXSv({5F3afpylUE>*pg3s%;_u6rVlL)uM5YG9^Fm zam3_(qX^6n?Uk@zuXwg*==@$v#4B@&sm|pSFp7<&+N-2X1QwUjd^4 z`ULZyv(8Fd7cAuhm%bDHm!^u|+0UeIYbAq72Ys=Vu-RRIW=;vpFmZ^`7nk;;GJX zvl(qIe>`IS**94{X1c_E-(<*+Y2)m)8xMRJKpHNIJb5zR5UAMsc&heg??Rz^bn`ZR zSW>2!?!U>JPh~txygBmFYv&Ai3NM9&5aB2=t%}jKlrskffoRJk_+rzhfu;EpziG~{ z(iW_bFEq~)Yz~WE%8468UyI@fR51vX%jD-S;>ro7fTF5UpY$npIH>#pHTP@J5cHE1 z^#&}tLQrtt+6$cEHQ=4zf|3X>USG$cj;*fOQcG93ufrH;G(Es#dJ~78o|CTGiLTwj zU{H)A5mJsfft6lU$%}7Y5UC(Lhzdj$3YCFqGQ-2O)<@wMRtWgG3;y#wLeVh zr5H!}c`%oz8Fwvcxl3XL0q8g160WJOMl&PIkZ-jWnPt?Q*rxkC4d92DvZm@NMn}NP z{n5+8N&DXD7wVa5G~|2QQ&#DT;|S3oTOCyQAojr@+<|>#RY}I2o^oSiL@0 z@39`e9*HkZU)5U@iAZD5cpNY_ew?@8mLJV)uup|UzdAMi@jI>u#He$~LQ#28p3uL* z2`di#2x7zliDsLiS&OmMFSYLF#Uik8@z&m*4`-cmEv<-8vWMUs{uM00=P|-%a#%0_ zvyf=?aMiC4zzFAT*E4mK$R`2HC2}D% zED0L%zQzrvECx)FbrvtiYI;@#v)z0qAIO=DfxP5JU5Pv6y?T|x3sk;OBy4@l*nab> z!teK{-s|o#*ksU1#K zhi_4Y0*zlMEoUit!qWS=G_A7d<6DmAc@b&t?4)WE*8a29bp7*(NPK-K);lOW7pej{ zV4^Xwb`QmEbQ?}~UnOA%JzD(q#oo@Rv5W2Hu!u_o=t=$1m`Ib%IsCDAdF#x()4wT7 zm>td(c-!^YwXwj<1JC(D7Z_crbhZTYJlgetet(8w-y zg0mdAJ*-N|ix-5_P28=~Q`BV+}`x#gf3&G;Yre_f!OF=9BiiD`pr`_j1R5v@W zG2D6}zK8_QFo~YMBppQWYchKHK+%q+8bv&j3M@qE32WeZem&Cx9WM`^{)$j-MR#&( zP1LxjOhJWFgjx?X`YAR|%2M`8#iNy1_beFI^(j(!<#}jB zJ^%3B_}MFa^&q%bZu+w0BLrt&1k?1-Kc=v)_3?YXTwL~?4v-zA-FC{IW5&UxG4xkm za^O~}Nv80Ko)a+A)ca0_S8QlvdD`^;hLFWmPPjA&Q140&jc_^8m#c|X%UMKd&77@9U6FDRrwg$gb;P>uRo>_Jdi%Dnp2OKI_ptQ4DfA%a z@-A#M`Vva9mFC^hqsj?MMIQNA@gaCf4emVT^pV|X9#{X3Jxef=9Voa9k+2@+s+)z< zlzQ1|7lZPHz3&B-;dM9TsDtZ#+7Tf@U*?TXg_bti1Nt-R5_MDmm@&@?tn*6nArR6U zN;8CnWUA~o-sE5B(Z)a_pl{^$fcAWs0=gI~>i`TYY#|FM84^P>hnS@-MK^-3r^$iW zKH>>rD9Dr4vEh4`ik6}visy(@3xn`(9C& z+g#kpsKdLJ86SwW7-CebDnDGqLi*S9s`fXX}E=Y&L7+wOFdN?NSU?F&Zg4 z^F{*-7c2wTORd1-2HX8sCCUM6X`AImvW$BwyjBK%eeyQY5;_%(ivCJSgNK~&X>nLrorZHQwVJJgg zrna-IZ{fD2s^1avX*no3@_8@D3r!L25i4=NI|nts;q!oYRyAzPm5Iq_iqIq02AAf0 zOhJ&MvCehrlbU>FiM;@5A>`~u)K*6@twVf9_0TT@zlR};K2E2LDBX`m}_cT;|(6jx^GiLJYTo=XD!AOgqK*nSQsMzC@! z+oiU2(jH-fHilN15;%bqz};?$g6x+~G|>wy+nq1mQE19DVPEXa#cn~7Hwt-Wk~GO- z)2G6PwRzInQpyyJ8gahsh9z5i2Ac8eLZ|l8OuN8i7~-5cf7d07`n)D)Z~3syK!m2{ zSa1B=LH)S;mBADkT{nESZ1bD+E-9(y%2m=)_>v9x!&lB)tRnMZJl~WpV0CJumhJqd zEP(Nc&YGV|dV}Ne{WIBC1iJSePPu>|2^Dv>l6(Wt^5!KQf@&NeHB@t-qg(MwPZCeh zGWu|Ofo2%pvRjlMVm(pHWcI1oU0?Asgfl^g&=z`9^p|d+^WDh;*V2Z|s}+Clcj6mo zTKAjO=YVqk@wx!<#qQjS2hy+g#@E$l-*i1aS^3YZsWo@Dnkpi_#ff-LJpP>YKixcJ zAMP!pfs<0Z3_xo;ma&kbhR}iMEdkyR-}j~2U!?pU#X)G2@Sl-PANF$__UGi*@N!Fa z5gn3{s1dXPowbGW;4j1(fq+1M5K3;T9Grl+;6*BdU{>nfTKp4VzOWJP^UcR=W5NmN zC=D1rvi?UBKY_lBXndXFDJn6VMQ7JAZ?-H9tk_7eSm)Vmlf2u?Pf#zHok+XI{w}kY zGVBIqOjqHZAPHzLXq00)YWcia04e;0vq903iI5x6AKMJt)q1$OT5;r_q)(!AjuY~X z*G$IX?xAdZdbH+*GXp!=!J5cJv@xuq(6l?n5duNc8_IFAk0#CtD+va3+Ex5USBz~s z$d2>dlQ0;M*jlK6CJxMc{13_Avx+#}2$b&;-SI#pdA<6BS=`FF8wvFE<&obCjrQ*n zn0;fwqlh=}RR)8Y~+m z0GS)P9X&|xW#D9g>aCZVtEcdMc_~m8k#0!eu&%$IADO#9H4YZQ!G7w83e z?sINqx1;KJX~}YwL&7>raz2g5T|4rlISD>u!#fnlGlzmVk&k-wJ^q1_Tl>W{oFO9&{3_ac)Bqtk zmD{1fs>^fQ?s(PXHZq`mEUxyCHbTVr(S>L>4Q?yLESOP)gWE^z6JPDCF*j?8cV8ct zEpti$&f9k7%-gY!Ye;QU4|wec`G2$mS9Y`=3Ni=?f$o3P3bdG{|3@omzuN6`KYaRp zzy>)3&zF$GlJ4W>FXeNtX|Aw7f+fLT67hSS`jWfzuF@x#ACIcpg1ZpMjjR`^m#5Nm zFHZyfM^8?K{FeZKlJo(zC=R9kvys&E+-EwOw7*noRh9VYefjs~v0hFQbnuF|I&w$> z&1E6|0PlSJpMd-NJtrMN|9mb}RF6=roRe?<%3jlaN<{D;DLBp3g{;J!a|rJssIFEeIO}oDbp*hQBY> z_8MV`#+CA5dr9D9T{{Kbnp}Iiq4jGITdd}4XXx?wNPt>&{WFITf8=|oPT3OO_ai%n zgnh~aXyz9zfjEjbrFcz@GOi>|fDLhBh$vb_j6edyTx=QzwG|q@C)i+6U^bBEh%wT4 zAQ9Zl^9dtolbtYX=XwXm+v#$W>S*-fSlX7T!0A{%cKQ9hmz!H@geZECVeJz+JQu%W z=$l`608nRq#laE~4z*1@hRExIuA~)+DUP^A>>$gl5ie#*+mVD#xSt$XxtmxOrY%ia z>u)ZK{q|bZJ%%p#HyziIv+jtHvVmPj7ZKjjygTV0+xk&i+s|pg_*mDK>KD{YQ{TJF z691u11ocz7(hI+i9XxC(Uk*wlpPr_D-qK}W8dzh#izHeKVp%e~fJ^5j=)` zi@x1SW^3=p(!uUm)F~7wc$D8^8sNR_yovL^tkZAmT}7FgmN7X(PZC#X{>fEL`VJ zMW6*C5%~H+*202HPu)|RIG&9953wDw51&9S@D?AJ9)pf0?rN^iYMYKwvI>eG01)0t zv)H3I1IUaSC7;k?G{G?JIc-CO*7Yahr|!=}--nXc>R=Le)}$mvaN02H;bMhQHY_DP zR=`H~I^6G9WUHS{nF{|fz1jW{JBR|FKAWqk(&cj51!_kBEw%==-6ng$KB&^oHWkQG zcILNu2Vtky2S0Gi<1kKq!N~}7Kpy87d4lAGRG0HIvMx@)Hdu%{J&j!CMn@m)W9M1o z{<-{$)K|{kK8~^fHnk*OX9NtlG1Js{Q42yA`)^AAWA>WZZnUD@f@ zlX-A&cxb9jAt@f*8O}llS`nNu2Q?xGjE4rGPwz35l(aLa%**iCj-p9p|IOiC zJ3^HqQB!cAVN;{Mr3)m;Txn)jGc3lmI6-H11_C5?mAFXqxaSKnNB7+Ag1>5sgreiv zytNwgCmC}EeND^jw=NlC3R2RQ=@yUC5$18^sWqd4x3ChoFH;THx5p$qwMr%j$t{e- zcE37E4JYT%p34w%qv!dITm(%|aAy@r>hEjj{c3ZSXVIo>)-CZQ?+PS#L$su`ZjfE! zr>JimKSHlCf!jOaF%kJ~ej4xkgEeEjM(4qOYewOGn5XH&*XZzIP6L$ritY&u`cRa( z8z=J{Ya;#Enw0?_(fuWET#H-vDGj;PD`?VCW&H!8HB4U~!pJRa9tQ&`K}p_Ft9CKx z3AX?co-j-J+Dbl_>+Fj!V4PyTm^5_*%MjsvqU`?rG0omUlq?adJbpjL^3HhzsyuOB zU*sG>6asb*jz_?Zs862Q*pXI8HPsYb5I22w62je?lGE)Q|FSwjBcH(XkQS@^+-tiQ@QHG}X{z$vPMuJh>Zc zE*c4|lAwzI#q@LpFskz^stw>E)@;Vp)o$GNtJWhxZc$H28QX-K&Uc=4znKL;1H}Qy zH+=^hb?0Q`urrNbVtBacwmot6FOvi<%zMuT=>7qAOw{t~CE}4X_535hj&*m0tF&_^aGq`1j3OZ-rv; zka|Mk_w?3fr=ySC6dPnxUQdv1NY0uDa&slQFqZ=*rm6D9P%l1C5$Ins#ZpJj#9`>= z&rKq86X%C9swYmlwY`h3QP@jDXut^>+5Yve<3Ioj#Z!S1{G zO~1i@fn@!f_h%(^XdQ4FB!6U$(8EZ$xP~a8FWXk8^Q|abCBA@kF%j+Q4 zX8eqRq1NHiB71lVpPo7C)!19>?>l)2)A^;Ek?sjBhd-Np))Yy8MUc@EeqWGYkR3pQ z2+AmfWlLBLvC~-ib*k#3rQvY2;vsbd6(~nnS$$;G4Z|%bI|HVkBF-n{mvcFw{YwX8 zgRfa4CeH>!+eAaP!s@e=&OR#H^+F?T!OtXKj3Um$WI;R~JeCLLQ`#OrpdiV%(DM58 zF{mIGYgmlaGoKetg4KJX1E~G;%>Xc={)Qsir4zQ!Hv$n7O#sOGp_K>2GPJ^=#aV?D zK2~pn#iHreMea_*^O^I^QvbOH1mIYDX1Ap2#IQ^|G%NQ@g%iUweaeYbzaY?o)q=c0 zerfZt6SGHd-o`gb&a9_yd6wP1^4SzirR3s_KyXTgz2a0JBX!dVwADS!N+WX%-mM~ zbhm(t=qOdQnX$-Rb|h(ZJpgpKKBY|pS7fk6VU?KKYibwo;V_#es!T;{neeDP$AX-W zBoBdai1`D;xccx4KXX6XNMyICz|Jp*ggQzh;yA^<u-%&Chp{nF(0IPVgS>y_l#s~i|UIN<<6H33vFp_(YE7pm_2|KauULVQdr!f`e&Z* zf{gw5ukoTz3B|Fs1o}3Hwtq0?3h93dAq!}ZT^2VouF`<iAv@2(M#i%06o_YFmdZ9+Kd8C)++jTf#F#}ic;>|!$EEMZtXa!XV zib<*|>1UqsXFR@k9t|!BE&7Qw9a3h;NYW^vk!lwv@0({Uj;n(MtSnl8)rR&JsU$;X z!D{oce++{_)i_fXU(0$#I)}@0a|V5G;`E7yHSBSF6taRH!TRpLCq$D@ zhC}$$qcRWBuI+OImI7^dAhLCYB#gdtg8^87fD9#Y-U(?0@ht09sSMDL60*VZIIM7E zaWfwf)+UgCyLE@ZqV zaNDa3e4_DN9xDHkC_gb>UB$C_VMv0Ha8=j!x~c`1DB;=^q^6lNoY)5OZ?X9$LhVFA zUtM*Ec{pU7V}0QhFRBT19x*S%o(}5Zrh(X|m%9!oj_od!CgB(lcsEz!n;cjNm1n8S-LK#HL^RE54&lHMCkHb3c+)j`aDcc`d=18)Cp6xX338&!4 z-kE?XBRpxt8ZJ%B`zUHZNr3WagIlyd9|~45nDVZYz+b}RaFCtrx91EZ8tJ*<7;7Aq z_IL!%+_Q>2orG}r%?}C+CDb;p2ebI!^qlsVyYesbURI}Y_R@H2S1?OFNQ+0eHEzz$$HG_f_&&BR zt;%|L3Y3539u268mO6Y3`xM9QA@g=mU!M)`Qn;+#8BZNn$YXli;;!%adX^F{yBvUR z%c(NST19@VcpVZQZsRriUvNv-#)DzQCC^%8qH4kC-*yXyM`fQH!0#Eom03pBR>86< zw-zt47L|3^-y_S@z-q^x0^=h$5p*GQ%!Ke(vN1vh(T8vmZBJbG{EUvR{DN&+)@(6x zM)-Hsg>u&Ly3l;#Ce#!J7Od|xnQVYWygCev@6O)+sm&d3J~h>EyF8JSsC6X8l|Ha( zl#G0lisL2C(-7*bN$P`tvoBhqFI$CcVS(FrcrYJB!aGI}1B=49xdJmSx2HcK+4YDW zF4{1YldZxz($(2c1Ws%9K;Ie2Hfqj%J$jpGQ_rHFrPAJzJvJPtU-zAEE0d|R0q-Zf ze{mHmgJsMnf4Pc32LH`fRAUn)V$;Ec|1FkpfWj&Q1^-(-pID7e^G^a}TusUDj04H% zv4%M4>O^F(Y2{)umG`__B9*J$j1VU19-y@Zcj&y3|N}KdY<0Nti$UB z2pYJl+<8+2%B>CXu|q0wfsjf6!J)xn3d+J=e2rmnoW{#bfj$>!CHi~uS&{XbN!)Xn zy$)n%F>#ekm8*o3foCB(FV?hR31NlU=ZETx0a`fT55us7 zUoeHt`uwPPWuqB7ONVbi$%s0YQ{9xlqP!jXlk$#%yy<)c+9P8BM4Y$%j4+0YsiRy$ ze>I`%J2IP_gU{{xQ*A||OpNCt6&(A4bMFJCn3yPA-T-S87YMFF4^NXO6g;F1<)>pG zfAqfiK&rRRcq6u8Ug4t;A5-Me)Z9^vb+9#4plxIpaHsM$*xOsUJdJ$HJG!`_U&$nL zbBjl9Sd_pAX!e)5AbcAa{F!w>@gSa1g`b*q_op0E1l-eje>FG0*PV+TyOT_-?yZqC zQ5kflqdhhl<5jk{tVCueUVCLlAPF{h@V7)KgKTCCh>xO4c=e`+QXb> z%*H6b}e!u#ET4Z;{vuHG#DTJLodvx7;6_o9r1eu(0<3Yd>)$-=28nqvD zcp}ITSGdEt8n+_*W9-hbD@EW^bE{3$f_lS=v=xZfq zyh`B&%>TUCGZMU#uRFMbld~rz(DgMQm|b@~bwBMTcjnbPmbd6lr0$Bo@qX@n{~4Bf zCibhnO(y~kIrUcI_JH@})#c-v_Pwo3l3yFipW?crupX0 zm1Cy;>9YUi1hXDzlZitQMfb#7&}L31P~dO%Dl2k(Z^po63PFza)eWzc*TY-xXbbe} z2u4m8wTT< zP`}tA4Eu1<9SJk=vwXN1qbbeB=6MF(vIWFoELLS)f}>{V=Gl8!kw-VG8{5kWfin2- zloi&uZvXP%0vpq>zThArU9kV{zk-DH|8&)#3B6Vog2+Qx9~h)p*PA3(?sAO6#LdZs zs{<+%MX4t9RT$30=i|lG+n>6qVH9jMg{ge-4O>^4=|~K2DLPmD<9%z)(fiyUe_UhE zZ1d_yv)XXkY2?_KwCzj8RHgzjU*~4I@0Bx%_fd9He^$z`6A}8)-aAY zZsMPjw>T;Zh6)jgA|xmw=}O&KaD{tSMC{SUP1-= zpY+*3w)(hK%%*MIdmia3!UFqw>}vfE5yJUOKH>i#p9`aI48jWv0&)cQ-*bFN#Q2Z+ zm`Fif`p@ta&;LpX}Wmyk~DCvs12Jx`XwwA`hI~F2?{*-9IM4ilK*x z>&D)TJtwbSYE8v(Gk(jHQRn5_S%3F_zo*A*>C&)^Zu3#g%Y{kg#YyX%i+V~;ozBvj zM_bn8SREg+K+>Lp#^HhYM$1}k&8JVRkVD7og*_Yr(HT$s2Q%=FT@sG<=KOIY!+jqE$Ey*x_|S$i8)@*zLf_w;};>Xjq{%kGj! z^Dot0^X}7%2SWvB#d5d^X?6E8-y;N_nmH_@u*tJn)sEnFSO|0;a7bSXYiUZ8#< zho&SkX3>;5y2O(`HOvx);4as{Snn;Kb)ME8w(sStBG%^^l!Oq~FVp{8&p7non*aWn z1o|JE|2jwzK|q{MotzDvO;lANK|uepUGKlq|Nh+q{~u_3!hfL|>>W*9{| Date: Tue, 18 Jul 2023 10:25:36 +0200 Subject: [PATCH 311/883] Add github work flow --- .github/workflows/product.yml | 70 +++++++++++++++++++++++++++++ services/product/README.md | 5 ++- services/product/k8s/deployment.yml | 2 +- 3 files changed, 74 insertions(+), 3 deletions(-) create mode 100644 .github/workflows/product.yml diff --git a/.github/workflows/product.yml b/.github/workflows/product.yml new file mode 100644 index 00000000..438d5823 --- /dev/null +++ b/.github/workflows/product.yml @@ -0,0 +1,70 @@ +name: Product Microservice CI/CD + +on: + push: + branches: [product-service] + pull_request: + branches: [main] + +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@master + - uses: pnpm/action-setup@v2 + with: + version: latest + - uses: actions/setup-node@v3 + with: + node-version: "18.x" + cache: "pnpm" + cache-dependency-path: services/product/pnpm-lock.yaml + - name: Install dependencies + run: | + cd ./services/product + pnpm install --frozen-lockfile + - name: Build + run: | + cd ./services/product + pnpm build + + test: + runs-on: ubuntu-latest + needs: build + steps: + - uses: actions/checkout@master + - uses: pnpm/action-setup@v2 + with: + version: latest + - uses: actions/setup-node@v3 + with: + node-version: "18.x" + cache: "pnpm" + cache-dependency-path: services/product/pnpm-lock.yaml + - name: Install dependencies + run: | + cd ./services/product + pnpm install --frozen-lockfile + - name: Execute tests + run: | + cd ./services/product + pnpm test + + publish: + runs-on: ubuntu-latest + needs: [build, test] + steps: + - name: Checkout code + uses: actions/checkout@master + - name: Login to Docker Hub + uses: docker/login-action@v2 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + - name: Build and push + uses: docker/build-push-action@v4 + with: + context: ./services/ + file: ./services/product/Dockerfile + push: true + tags: pierrelbg/goodfood-product:latest \ No newline at end of file diff --git a/services/product/README.md b/services/product/README.md index 66de1c00..3981b6df 100644 --- a/services/product/README.md +++ b/services/product/README.md @@ -101,8 +101,9 @@ npx prisma migrate dev --name init Open an other terminal at the root folder (/service) and execute those ``` -docker build -t product-service:1.0.0 -f ./product/Dockerfile . -docker push pierrelbg/product-service:1.0.0 +docker build -t goodfood-product:1.0.x -f ./product/Dockerfile . +docker tag goodfood-product:1.0.x pierrelbg/goodfood-product:1.0.x +docker push pierrelbg/goodfood-product:1.0.x ``` Back to the first terminal and execute diff --git a/services/product/k8s/deployment.yml b/services/product/k8s/deployment.yml index fe09f06b..45d171b1 100644 --- a/services/product/k8s/deployment.yml +++ b/services/product/k8s/deployment.yml @@ -15,7 +15,7 @@ spec: spec: containers: - name: goodfood-product - image: pierrelbg/product-service:1.0.0 + image: pierrelbg/goodfood-product:1.0.0 resources: limits: memory: "128Mi" From f3e8b75c74e8563a7ddecad1ceea06093421b256 Mon Sep 17 00:00:00 2001 From: Pierre Lebigre Date: Tue, 18 Jul 2023 10:48:55 +0200 Subject: [PATCH 312/883] Update lock file --- services/product/package-lock.json | 6000 ---------------------------- services/product/pnpm-lock.yaml | 333 +- 2 files changed, 192 insertions(+), 6141 deletions(-) delete mode 100644 services/product/package-lock.json diff --git a/services/product/package-lock.json b/services/product/package-lock.json deleted file mode 100644 index 1fb3a402..00000000 --- a/services/product/package-lock.json +++ /dev/null @@ -1,6000 +0,0 @@ -{ - "name": "@goodfood/product", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "@goodfood/product", - "hasInstallScript": true, - "dependencies": { - "@azure/storage-blob": "^12.14.0", - "@grpc/grpc-js": "^1.8.14", - "@grpc/proto-loader": "^0.7.6", - "@prisma/client": "^4.16.2", - "amqplib": "^0.10.3", - "base64-arraybuffer": "^1.0.2", - "express": "^4.18.2", - "nodemon": "^1.14.9", - "pkg": "^5.8.1", - "vite-tsconfig-paths": "^4.2.0" - }, - "bin": { - "product": "dist/index.js" - }, - "devDependencies": { - "@types/amqplib": "^0.10.1", - "@types/node": "^18.16.7", - "esbuild": "^0.18.11", - "prisma": "^4.16.2", - "ts-node": "^10.9.1", - "tsconfig-paths": "^4.2.0", - "typescript": "^5.0.2" - } - }, - "node_modules/@acuminous/bitsyntax": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/@acuminous/bitsyntax/-/bitsyntax-0.1.2.tgz", - "integrity": "sha512-29lUK80d1muEQqiUsSo+3A0yP6CdspgC95EnKBMi22Xlwt79i/En4Vr67+cXhU+cZjbti3TgGGC5wy1stIywVQ==", - "dependencies": { - "buffer-more-ints": "~1.0.0", - "debug": "^4.3.4", - "safe-buffer": "~5.1.2" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/@azure/abort-controller": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@azure/abort-controller/-/abort-controller-1.1.0.tgz", - "integrity": "sha512-TrRLIoSQVzfAJX9H1JeFjzAoDGcoK1IYX1UImfceTZpsyYfWr09Ss1aHW1y5TrrR3iq6RZLBwJ3E24uwPhwahw==", - "dependencies": { - "tslib": "^2.2.0" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/@azure/core-auth": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@azure/core-auth/-/core-auth-1.4.0.tgz", - "integrity": "sha512-HFrcTgmuSuukRf/EdPmqBrc5l6Q5Uu+2TbuhaKbgaCpP2TfAeiNaQPAadxO+CYBRHGUzIDteMAjFspFLDLnKVQ==", - "dependencies": { - "@azure/abort-controller": "^1.0.0", - "tslib": "^2.2.0" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/@azure/core-http": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@azure/core-http/-/core-http-3.0.2.tgz", - "integrity": "sha512-o1wR9JrmoM0xEAa0Ue7Sp8j+uJvmqYaGoHOCT5qaVYmvgmnZDC0OvQimPA/JR3u77Sz6D1y3Xmk1y69cDU9q9A==", - "dependencies": { - "@azure/abort-controller": "^1.0.0", - "@azure/core-auth": "^1.3.0", - "@azure/core-tracing": "1.0.0-preview.13", - "@azure/core-util": "^1.1.1", - "@azure/logger": "^1.0.0", - "@types/node-fetch": "^2.5.0", - "@types/tunnel": "^0.0.3", - "form-data": "^4.0.0", - "node-fetch": "^2.6.7", - "process": "^0.11.10", - "tslib": "^2.2.0", - "tunnel": "^0.0.6", - "uuid": "^8.3.0", - "xml2js": "^0.5.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@azure/core-lro": { - "version": "2.5.3", - "resolved": "https://registry.npmjs.org/@azure/core-lro/-/core-lro-2.5.3.tgz", - "integrity": "sha512-ubkOf2YCnVtq7KqEJQqAI8dDD5rH1M6OP5kW0KO/JQyTaxLA0N0pjFWvvaysCj9eHMNBcuuoZXhhl0ypjod2DA==", - "dependencies": { - "@azure/abort-controller": "^1.0.0", - "@azure/core-util": "^1.2.0", - "@azure/logger": "^1.0.0", - "tslib": "^2.2.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@azure/core-paging": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@azure/core-paging/-/core-paging-1.5.0.tgz", - "integrity": "sha512-zqWdVIt+2Z+3wqxEOGzR5hXFZ8MGKK52x4vFLw8n58pR6ZfKRx3EXYTxTaYxYHc/PexPUTyimcTWFJbji9Z6Iw==", - "dependencies": { - "tslib": "^2.2.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@azure/core-tracing": { - "version": "1.0.0-preview.13", - "resolved": "https://registry.npmjs.org/@azure/core-tracing/-/core-tracing-1.0.0-preview.13.tgz", - "integrity": "sha512-KxDlhXyMlh2Jhj2ykX6vNEU0Vou4nHr025KoSEiz7cS3BNiHNaZcdECk/DmLkEB0as5T7b/TpRcehJ5yV6NeXQ==", - "dependencies": { - "@opentelemetry/api": "^1.0.1", - "tslib": "^2.2.0" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/@azure/core-util": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@azure/core-util/-/core-util-1.3.2.tgz", - "integrity": "sha512-2bECOUh88RvL1pMZTcc6OzfobBeWDBf5oBbhjIhT1MV9otMVWCzpOJkkiKtrnO88y5GGBelgY8At73KGAdbkeQ==", - "dependencies": { - "@azure/abort-controller": "^1.0.0", - "tslib": "^2.2.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@azure/logger": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@azure/logger/-/logger-1.0.4.tgz", - "integrity": "sha512-ustrPY8MryhloQj7OWGe+HrYx+aoiOxzbXTtgblbV3xwCqpzUK36phH3XNHQKj3EPonyFUuDTfR3qFhTEAuZEg==", - "dependencies": { - "tslib": "^2.2.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@azure/storage-blob": { - "version": "12.14.0", - "resolved": "https://registry.npmjs.org/@azure/storage-blob/-/storage-blob-12.14.0.tgz", - "integrity": "sha512-g8GNUDpMisGXzBeD+sKphhH5yLwesB4JkHr1U6be/X3F+cAMcyGLPD1P89g2M7wbEtUJWoikry1rlr83nNRBzg==", - "dependencies": { - "@azure/abort-controller": "^1.0.0", - "@azure/core-http": "^3.0.0", - "@azure/core-lro": "^2.2.0", - "@azure/core-paging": "^1.1.1", - "@azure/core-tracing": "1.0.0-preview.13", - "@azure/logger": "^1.0.0", - "events": "^3.0.0", - "tslib": "^2.2.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@babel/generator": { - "version": "7.18.2", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.2.tgz", - "integrity": "sha512-W1lG5vUwFvfMd8HVXqdfbuG7RuaSrTCCD8cl8fP8wOivdbtbIg2Db3IWUcgvfxKbbn6ZBGYRW/Zk1MIwK49mgw==", - "dependencies": { - "@babel/types": "^7.18.2", - "@jridgewell/gen-mapping": "^0.3.0", - "jsesc": "^2.5.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.21.5.tgz", - "integrity": "sha512-5pTUx3hAJaZIdW99sJ6ZUUgWq/Y+Hja7TowEnLNMm1VivRgZQL3vpBY3qUACVsvw+yQU6+YgfBVmcbLaZtrA1w==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", - "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.18.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.4.tgz", - "integrity": "sha512-FDge0dFazETFcxGw/EXzOkN8uJp0PC7Qbm+Pe9T+av2zlBpOgunFHkQPPn+eRuClU73JF+98D531UgayY89tow==", - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/types": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.19.0.tgz", - "integrity": "sha512-YuGopBq3ke25BVSiS6fgF49Ul9gH1x70Bcr6bqRLjWCkcX8Hre1/5+z+IiWOIerRMSSEfGZVB9z9kyq7wVs9YA==", - "dependencies": { - "@babel/helper-string-parser": "^7.18.10", - "@babel/helper-validator-identifier": "^7.18.6", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@cspotcode/source-map-support": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", - "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", - "dev": true, - "dependencies": { - "@jridgewell/trace-mapping": "0.3.9" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", - "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", - "dev": true, - "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.18.11", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.11.tgz", - "integrity": "sha512-q4qlUf5ucwbUJZXF5tEQ8LF7y0Nk4P58hOsGk3ucY0oCwgQqAnqXVbUuahCddVHfrxmpyewRpiTHwVHIETYu7Q==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.18.11", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.11.tgz", - "integrity": "sha512-snieiq75Z1z5LJX9cduSAjUr7vEI1OdlzFPMw0HH5YI7qQHDd3qs+WZoMrWYDsfRJSq36lIA6mfZBkvL46KoIw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.18.11", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.11.tgz", - "integrity": "sha512-iPuoxQEV34+hTF6FT7om+Qwziv1U519lEOvekXO9zaMMlT9+XneAhKL32DW3H7okrCOBQ44BMihE8dclbZtTuw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.18.11", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.11.tgz", - "integrity": "sha512-Gm0QkI3k402OpfMKyQEEMG0RuW2LQsSmI6OeO4El2ojJMoF5NLYb3qMIjvbG/lbMeLOGiW6ooU8xqc+S0fgz2w==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.18.11", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.11.tgz", - "integrity": "sha512-N15Vzy0YNHu6cfyDOjiyfJlRJCB/ngKOAvoBf1qybG3eOq0SL2Lutzz9N7DYUbb7Q23XtHPn6lMDF6uWbGv9Fw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.18.11", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.11.tgz", - "integrity": "sha512-atEyuq6a3omEY5qAh5jIORWk8MzFnCpSTUruBgeyN9jZq1K/QI9uke0ATi3MHu4L8c59CnIi4+1jDKMuqmR71A==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.18.11", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.11.tgz", - "integrity": "sha512-XtuPrEfBj/YYYnAAB7KcorzzpGTvOr/dTtXPGesRfmflqhA4LMF0Gh/n5+a9JBzPuJ+CGk17CA++Hmr1F/gI0Q==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.18.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.11.tgz", - "integrity": "sha512-Idipz+Taso/toi2ETugShXjQ3S59b6m62KmLHkJlSq/cBejixmIydqrtM2XTvNCywFl3VC7SreSf6NV0i6sRyg==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.18.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.11.tgz", - "integrity": "sha512-c6Vh2WS9VFKxKZ2TvJdA7gdy0n6eSy+yunBvv4aqNCEhSWVor1TU43wNRp2YLO9Vng2G+W94aRz+ILDSwAiYog==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.18.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.11.tgz", - "integrity": "sha512-S3hkIF6KUqRh9n1Q0dSyYcWmcVa9Cg+mSoZEfFuzoYXXsk6196qndrM+ZiHNwpZKi3XOXpShZZ+9dfN5ykqjjw==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.18.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.11.tgz", - "integrity": "sha512-MRESANOoObQINBA+RMZW+Z0TJWpibtE7cPFnahzyQHDCA9X9LOmGh68MVimZlM9J8n5Ia8lU773te6O3ILW8kw==", - "cpu": [ - "loong64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.18.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.11.tgz", - "integrity": "sha512-qVyPIZrXNMOLYegtD1u8EBccCrBVshxMrn5MkuFc3mEVsw7CCQHaqZ4jm9hbn4gWY95XFnb7i4SsT3eflxZsUg==", - "cpu": [ - "mips64el" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.18.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.11.tgz", - "integrity": "sha512-T3yd8vJXfPirZaUOoA9D2ZjxZX4Gr3QuC3GztBJA6PklLotc/7sXTOuuRkhE9W/5JvJP/K9b99ayPNAD+R+4qQ==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.18.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.11.tgz", - "integrity": "sha512-evUoRPWiwuFk++snjH9e2cAjF5VVSTj+Dnf+rkO/Q20tRqv+644279TZlPK8nUGunjPAtQRCj1jQkDAvL6rm2w==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.18.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.11.tgz", - "integrity": "sha512-/SlRJ15XR6i93gRWquRxYCfhTeC5PdqEapKoLbX63PLCmAkXZHY2uQm2l9bN0oPHBsOw2IswRZctMYS0MijFcg==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.18.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.11.tgz", - "integrity": "sha512-xcncej+wF16WEmIwPtCHi0qmx1FweBqgsRtEL1mSHLFR6/mb3GEZfLQnx+pUDfRDEM4DQF8dpXIW7eDOZl1IbA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.18.11", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.11.tgz", - "integrity": "sha512-aSjMHj/F7BuS1CptSXNg6S3M4F3bLp5wfFPIJM+Km2NfIVfFKhdmfHF9frhiCLIGVzDziggqWll0B+9AUbud/Q==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.18.11", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.11.tgz", - "integrity": "sha512-tNBq+6XIBZtht0xJGv7IBB5XaSyvYPCm1PxJ33zLQONdZoLVM0bgGqUrXnJyiEguD9LU4AHiu+GCXy/Hm9LsdQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.18.11", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.11.tgz", - "integrity": "sha512-kxfbDOrH4dHuAAOhr7D7EqaYf+W45LsAOOhAet99EyuxxQmjbk8M9N4ezHcEiCYPaiW8Dj3K26Z2V17Gt6p3ng==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.18.11", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.11.tgz", - "integrity": "sha512-Sh0dDRyk1Xi348idbal7lZyfSkjhJsdFeuC13zqdipsvMetlGiFQNdO+Yfp6f6B4FbyQm7qsk16yaZk25LChzg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.18.11", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.11.tgz", - "integrity": "sha512-o9JUIKF1j0rqJTFbIoF4bXj6rvrTZYOrfRcGyL0Vm5uJ/j5CkBD/51tpdxe9lXEDouhRgdr/BYzUrDOvrWwJpg==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.18.11", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.11.tgz", - "integrity": "sha512-rQI4cjLHd2hGsM1LqgDI7oOCYbQ6IBOVsX9ejuRMSze0GqXUG2ekwiKkiBU1pRGSeCqFFHxTrcEydB2Hyoz9CA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@grpc/grpc-js": { - "version": "1.8.14", - "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.8.14.tgz", - "integrity": "sha512-w84maJ6CKl5aApCMzFll0hxtFNT6or9WwMslobKaqWUEf1K+zhlL43bSQhFreyYWIWR+Z0xnVFC1KtLm4ZpM/A==", - "dependencies": { - "@grpc/proto-loader": "^0.7.0", - "@types/node": ">=12.12.47" - }, - "engines": { - "node": "^8.13.0 || >=10.10.0" - } - }, - "node_modules/@grpc/proto-loader": { - "version": "0.7.7", - "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.7.tgz", - "integrity": "sha512-1TIeXOi8TuSCQprPItwoMymZXxWT0CPxUhkrkeCUH+D8U7QDwQ6b7SUz2MaLuWM2llT+J/TVFLmQI5KtML3BhQ==", - "dependencies": { - "@types/long": "^4.0.1", - "lodash.camelcase": "^4.3.0", - "long": "^4.0.0", - "protobufjs": "^7.0.0", - "yargs": "^17.7.2" - }, - "bin": { - "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", - "dependencies": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.18", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", - "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", - "dependencies": { - "@jridgewell/resolve-uri": "3.1.0", - "@jridgewell/sourcemap-codec": "1.4.14" - } - }, - "node_modules/@jridgewell/trace-mapping/node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==" - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@opentelemetry/api": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.4.1.tgz", - "integrity": "sha512-O2yRJce1GOc6PAy3QxFM4NzFiWzvScDC1/5ihYBL6BUEVdq0XMWN01sppE+H6bBXbaFYipjwFLEWLg5PaSOThA==", - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@prisma/client": { - "version": "4.16.2", - "resolved": "https://registry.npmjs.org/@prisma/client/-/client-4.16.2.tgz", - "integrity": "sha512-qCoEyxv1ZrQ4bKy39GnylE8Zq31IRmm8bNhNbZx7bF2cU5aiCCnSa93J2imF88MBjn7J9eUQneNxUQVJdl/rPQ==", - "hasInstallScript": true, - "dependencies": { - "@prisma/engines-version": "4.16.1-1.4bc8b6e1b66cb932731fb1bdbbc550d1e010de81" - }, - "engines": { - "node": ">=14.17" - }, - "peerDependencies": { - "prisma": "*" - }, - "peerDependenciesMeta": { - "prisma": { - "optional": true - } - } - }, - "node_modules/@prisma/engines": { - "version": "4.16.2", - "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-4.16.2.tgz", - "integrity": "sha512-vx1nxVvN4QeT/cepQce68deh/Turxy5Mr+4L4zClFuK1GlxN3+ivxfuv+ej/gvidWn1cE1uAhW7ALLNlYbRUAw==", - "devOptional": true, - "hasInstallScript": true - }, - "node_modules/@prisma/engines-version": { - "version": "4.16.1-1.4bc8b6e1b66cb932731fb1bdbbc550d1e010de81", - "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-4.16.1-1.4bc8b6e1b66cb932731fb1bdbbc550d1e010de81.tgz", - "integrity": "sha512-q617EUWfRIDTriWADZ4YiWRZXCa/WuhNgLTVd+HqWLffjMSPzyM5uOWoauX91wvQClSKZU4pzI4JJLQ9Kl62Qg==" - }, - "node_modules/@protobufjs/aspromise": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", - "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==" - }, - "node_modules/@protobufjs/base64": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", - "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" - }, - "node_modules/@protobufjs/codegen": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", - "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" - }, - "node_modules/@protobufjs/eventemitter": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", - "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==" - }, - "node_modules/@protobufjs/fetch": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", - "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", - "dependencies": { - "@protobufjs/aspromise": "^1.1.1", - "@protobufjs/inquire": "^1.1.0" - } - }, - "node_modules/@protobufjs/float": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", - "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==" - }, - "node_modules/@protobufjs/inquire": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", - "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==" - }, - "node_modules/@protobufjs/path": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", - "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==" - }, - "node_modules/@protobufjs/pool": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", - "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==" - }, - "node_modules/@protobufjs/utf8": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", - "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==" - }, - "node_modules/@tsconfig/node10": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", - "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", - "dev": true - }, - "node_modules/@tsconfig/node12": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", - "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", - "dev": true - }, - "node_modules/@tsconfig/node14": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", - "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", - "dev": true - }, - "node_modules/@tsconfig/node16": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.3.tgz", - "integrity": "sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==", - "dev": true - }, - "node_modules/@types/amqplib": { - "version": "0.10.1", - "resolved": "https://registry.npmjs.org/@types/amqplib/-/amqplib-0.10.1.tgz", - "integrity": "sha512-j6ANKT79ncUDnAs/+9r9eDujxbeJoTjoVu33gHHcaPfmLQaMhvfbH2GqSe8KUM444epAp1Vl3peVOQfZk3UIqA==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/long": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz", - "integrity": "sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==" - }, - "node_modules/@types/node": { - "version": "18.16.7", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.16.7.tgz", - "integrity": "sha512-MFg7ua/bRtnA1hYE3pVyWxGd/r7aMqjNOdHvlSsXV3n8iaeGKkOaPzpJh6/ovf4bEXWcojkeMJpTsq3mzXW4IQ==" - }, - "node_modules/@types/node-fetch": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.4.tgz", - "integrity": "sha512-1ZX9fcN4Rvkvgv4E6PAY5WXUFWFcRWxZa3EW83UjycOB9ljJCedb2CupIP4RZMEwF/M3eTcCihbBRgwtGbg5Rg==", - "dependencies": { - "@types/node": "*", - "form-data": "^3.0.0" - } - }, - "node_modules/@types/node-fetch/node_modules/form-data": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", - "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/@types/tunnel": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/@types/tunnel/-/tunnel-0.0.3.tgz", - "integrity": "sha512-sOUTGn6h1SfQ+gbgqC364jLFBw2lnFqkgF3q0WovEHRLMrVD1sd5aufqi/aJObLekJO+Aq5z646U4Oxy6shXMA==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" - }, - "node_modules/accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/acorn": { - "version": "8.8.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", - "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-walk": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", - "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/amqplib": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/amqplib/-/amqplib-0.10.3.tgz", - "integrity": "sha512-UHmuSa7n8vVW/a5HGh2nFPqAEr8+cD4dEZ6u9GjP91nHfr1a54RyAKyra7Sb5NH7NBKOUlyQSMXIp0qAixKexw==", - "dependencies": { - "@acuminous/bitsyntax": "^0.1.2", - "buffer-more-ints": "~1.0.0", - "readable-stream": "1.x >=1.1.9", - "url-parse": "~1.5.10" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/ansi-align": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-2.0.0.tgz", - "integrity": "sha512-TdlOggdA/zURfMYa7ABC66j+oqfMew58KpJMbUlH3bcZP1b+cBHIHDDn5uH9INsxrHBPjsqM0tDB4jPTF/vgJA==", - "dependencies": { - "string-width": "^2.0.0" - } - }, - "node_modules/ansi-align/node_modules/ansi-regex": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", - "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", - "engines": { - "node": ">=4" - } - }, - "node_modules/ansi-align/node_modules/is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", - "engines": { - "node": ">=4" - } - }, - "node_modules/ansi-align/node_modules/string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dependencies": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/ansi-align/node_modules/strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", - "dependencies": { - "ansi-regex": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", - "dependencies": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" - } - }, - "node_modules/anymatch/node_modules/braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dependencies": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/anymatch/node_modules/braces/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/anymatch/node_modules/fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==", - "dependencies": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/anymatch/node_modules/fill-range/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/anymatch/node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/anymatch/node_modules/is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/anymatch/node_modules/is-number/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/anymatch/node_modules/micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dependencies": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/anymatch/node_modules/normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==", - "dependencies": { - "remove-trailing-separator": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/anymatch/node_modules/to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==", - "dependencies": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true - }, - "node_modules/arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" - }, - "node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "engines": { - "node": ">=8" - } - }, - "node_modules/array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/assign-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/async-each": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.6.tgz", - "integrity": "sha512-c646jH1avxr+aVpndVMeAfYw7wAa6idufrlN3LPA4PmKS0QEGp6PIC9nwz0WQkkvBGAMEki3pFdtxaF39J9vvg==", - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ] - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" - }, - "node_modules/at-least-node": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", - "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", - "bin": { - "atob": "bin/atob.js" - }, - "engines": { - "node": ">= 4.5.0" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" - }, - "node_modules/base": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", - "dependencies": { - "cache-base": "^1.0.1", - "class-utils": "^0.3.5", - "component-emitter": "^1.2.1", - "define-property": "^1.0.0", - "isobject": "^3.0.1", - "mixin-deep": "^1.2.0", - "pascalcase": "^0.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/base/node_modules/define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", - "dependencies": { - "is-descriptor": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/base64-arraybuffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz", - "integrity": "sha512-I3yl4r9QB5ZRY3XuJVEPfc2XhZO6YweFPI+UovAzn+8/hb3oJ6lnysaFcjVpkCPfVWFUDvoZ8kmVDP7WyRtYtQ==", - "engines": { - "node": ">= 0.6.0" - } - }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/binary-extensions": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", - "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/bindings": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", - "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", - "optional": true, - "dependencies": { - "file-uri-to-path": "1.0.0" - } - }, - "node_modules/bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "dependencies": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, - "node_modules/bl/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/bl/node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/bl/node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/body-parser": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", - "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", - "dependencies": { - "bytes": "3.1.2", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.11.0", - "raw-body": "2.5.1", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/body-parser/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/body-parser/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/boxen": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-1.3.0.tgz", - "integrity": "sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw==", - "dependencies": { - "ansi-align": "^2.0.0", - "camelcase": "^4.0.0", - "chalk": "^2.0.1", - "cli-boxes": "^1.0.0", - "string-width": "^2.0.0", - "term-size": "^1.2.0", - "widest-line": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/boxen/node_modules/ansi-regex": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", - "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", - "engines": { - "node": ">=4" - } - }, - "node_modules/boxen/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/boxen/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/boxen/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/boxen/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" - }, - "node_modules/boxen/node_modules/is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", - "engines": { - "node": ">=4" - } - }, - "node_modules/boxen/node_modules/string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dependencies": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/boxen/node_modules/strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", - "dependencies": { - "ansi-regex": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "node_modules/buffer-more-ints": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-more-ints/-/buffer-more-ints-1.0.0.tgz", - "integrity": "sha512-EMetuGFz5SLsT0QTnXzINh4Ksr+oo4i+UGTXEshiGCQWnsgSs7ZhJ8fzlwQ+OzEMs0MpDAMr1hxnblp5a4vcHg==" - }, - "node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/cache-base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", - "dependencies": { - "collection-visit": "^1.0.0", - "component-emitter": "^1.2.1", - "get-value": "^2.0.6", - "has-value": "^1.0.0", - "isobject": "^3.0.1", - "set-value": "^2.0.0", - "to-object-path": "^0.3.0", - "union-value": "^1.0.0", - "unset-value": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha512-FxAv7HpHrXbh3aPo4o2qxHay2lkLY3x5Mw3KeE4KQE8ysVfziWeRZDwcjauvwBSGEC/nXUPzZy8zeh4HokqOnw==", - "engines": { - "node": ">=4" - } - }, - "node_modules/capture-stack-trace": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.2.tgz", - "integrity": "sha512-X/WM2UQs6VMHUtjUDnZTRI+i1crWteJySFzr9UpGoQa4WQffXVTTXuekjl7TjZRlcF2XfjgITT0HxZ9RnxeT0w==", - "engines": { - "node": ">=0.10.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/chalk/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/chalk/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/chokidar": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", - "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", - "deprecated": "Chokidar 2 does not receive security updates since 2019. Upgrade to chokidar 3 with 15x fewer dependencies", - "dependencies": { - "anymatch": "^2.0.0", - "async-each": "^1.0.1", - "braces": "^2.3.2", - "glob-parent": "^3.1.0", - "inherits": "^2.0.3", - "is-binary-path": "^1.0.0", - "is-glob": "^4.0.0", - "normalize-path": "^3.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.2.1", - "upath": "^1.1.1" - }, - "optionalDependencies": { - "fsevents": "^1.2.7" - } - }, - "node_modules/chokidar/node_modules/braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dependencies": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/chokidar/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/chokidar/node_modules/fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==", - "dependencies": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/chokidar/node_modules/glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA==", - "dependencies": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - } - }, - "node_modules/chokidar/node_modules/glob-parent/node_modules/is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw==", - "dependencies": { - "is-extglob": "^2.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/chokidar/node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/chokidar/node_modules/is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/chokidar/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/chokidar/node_modules/to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==", - "dependencies": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" - }, - "node_modules/ci-info": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.6.0.tgz", - "integrity": "sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==" - }, - "node_modules/class-utils": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", - "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", - "dependencies": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/class-utils/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", - "dependencies": { - "is-descriptor": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/class-utils/node_modules/is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/class-utils/node_modules/is-accessor-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/class-utils/node_modules/is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/class-utils/node_modules/is-data-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/class-utils/node_modules/is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dependencies": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/class-utils/node_modules/kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/cli-boxes": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz", - "integrity": "sha512-3Fo5wu8Ytle8q9iCzS4D2MWVL2X7JVWRiS1BnXbTFDhS9c/REkM9vd1AmabsoZoY5/dGi5TT9iKL8Kb6DeBRQg==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/collection-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw==", - "dependencies": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/component-emitter": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", - "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" - }, - "node_modules/configstore": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.5.tgz", - "integrity": "sha512-nlOhI4+fdzoK5xmJ+NY+1gZK56bwEaWZr8fYuXohZ9Vkc1o3a4T/R3M+yE/w7x/ZVJ1zF8c+oaOvF0dztdUgmA==", - "dependencies": { - "dot-prop": "^4.2.1", - "graceful-fs": "^4.1.2", - "make-dir": "^1.0.0", - "unique-string": "^1.0.0", - "write-file-atomic": "^2.0.0", - "xdg-basedir": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", - "dependencies": { - "safe-buffer": "5.2.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/content-disposition/node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", - "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" - }, - "node_modules/copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" - }, - "node_modules/create-error-class": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz", - "integrity": "sha512-gYTKKexFO3kh200H1Nit76sRwRtOY32vQd3jpAQKpLtZqyNsSQNfI4N7o3eP2wUjV35pTWKRYqFUDBvUha/Pkw==", - "dependencies": { - "capture-stack-trace": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "dev": true - }, - "node_modules/cross-spawn": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", - "integrity": "sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==", - "dependencies": { - "lru-cache": "^4.0.1", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "node_modules/cross-spawn/node_modules/lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", - "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", - "dependencies": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, - "node_modules/cross-spawn/node_modules/yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==" - }, - "node_modules/crypto-random-string": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", - "integrity": "sha512-GsVpkFPlycH7/fRR7Dhcmnoii54gV1nz7y4CWyeFS14N+JVBBhY+r8amRHE4BwSYal7BPTDp8isvAlCxyFt3Hg==", - "engines": { - "node": ">=4" - } - }, - "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decode-uri-component": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", - "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", - "engines": { - "node": ">=0.10" - } - }, - "node_modules/decompress-response": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", - "dependencies": { - "mimic-response": "^3.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "dependencies": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/detect-libc": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz", - "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==", - "engines": { - "node": ">=8" - } - }, - "node_modules/diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true, - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/dot-prop": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.1.tgz", - "integrity": "sha512-l0p4+mIuJIua0mhxGoh4a+iNL9bmeK5DvnSVQa6T0OhrVmaEa1XScX5Etc673FePCJOArq/4Pa2cLGODUWTPOQ==", - "dependencies": { - "is-obj": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/duplexer3": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.5.tgz", - "integrity": "sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA==" - }, - "node_modules/ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" - }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dependencies": { - "once": "^1.4.0" - } - }, - "node_modules/esbuild": { - "version": "0.18.11", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.11.tgz", - "integrity": "sha512-i8u6mQF0JKJUlGR3OdFLKldJQMMs8OqM9Cc3UCi9XXziJ9WERM5bfkHaEAy0YAvPRMgqSW55W7xYn84XtEFTtA==", - "dev": true, - "hasInstallScript": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/android-arm": "0.18.11", - "@esbuild/android-arm64": "0.18.11", - "@esbuild/android-x64": "0.18.11", - "@esbuild/darwin-arm64": "0.18.11", - "@esbuild/darwin-x64": "0.18.11", - "@esbuild/freebsd-arm64": "0.18.11", - "@esbuild/freebsd-x64": "0.18.11", - "@esbuild/linux-arm": "0.18.11", - "@esbuild/linux-arm64": "0.18.11", - "@esbuild/linux-ia32": "0.18.11", - "@esbuild/linux-loong64": "0.18.11", - "@esbuild/linux-mips64el": "0.18.11", - "@esbuild/linux-ppc64": "0.18.11", - "@esbuild/linux-riscv64": "0.18.11", - "@esbuild/linux-s390x": "0.18.11", - "@esbuild/linux-x64": "0.18.11", - "@esbuild/netbsd-x64": "0.18.11", - "@esbuild/openbsd-x64": "0.18.11", - "@esbuild/sunos-x64": "0.18.11", - "@esbuild/win32-arm64": "0.18.11", - "@esbuild/win32-ia32": "0.18.11", - "@esbuild/win32-x64": "0.18.11" - } - }, - "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" - }, - "node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "engines": { - "node": ">=0.8.x" - } - }, - "node_modules/execa": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", - "integrity": "sha512-RztN09XglpYI7aBBrJCPW95jEH7YF1UEPOoX9yDhUTPdp7mK+CQvnLTuD10BNXZ3byLTu2uehZ8EcKT/4CGiFw==", - "dependencies": { - "cross-spawn": "^5.0.1", - "get-stream": "^3.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==", - "dependencies": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-brackets/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/expand-brackets/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", - "dependencies": { - "is-descriptor": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-brackets/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-brackets/node_modules/is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-brackets/node_modules/is-accessor-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-brackets/node_modules/is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-brackets/node_modules/is-data-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-brackets/node_modules/is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dependencies": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-brackets/node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-brackets/node_modules/kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-brackets/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/expand-template": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", - "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", - "engines": { - "node": ">=6" - } - }, - "node_modules/express": { - "version": "4.18.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", - "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", - "dependencies": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.1", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.5.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.2.0", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.7", - "qs": "6.11.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.18.0", - "serve-static": "1.15.0", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/express/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/express/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/express/node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", - "dependencies": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "dependencies": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extglob/node_modules/define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", - "dependencies": { - "is-descriptor": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extglob/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extglob/node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/fast-glob": { - "version": "3.2.12", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", - "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fastq": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", - "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/file-uri-to-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", - "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", - "optional": true - }, - "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/finalhandler": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/finalhandler/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/finalhandler/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA==", - "dependencies": { - "map-cache": "^0.2.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/from2": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", - "integrity": "sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==", - "dependencies": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.0" - } - }, - "node_modules/from2/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" - }, - "node_modules/from2/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/from2/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/fs-constants": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" - }, - "node_modules/fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/fsevents": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", - "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", - "deprecated": "The v1 package contains DANGEROUS / INSECURE binaries. Upgrade to safe fsevents v2", - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "dependencies": { - "bindings": "^1.5.0", - "nan": "^2.12.1" - }, - "engines": { - "node": ">= 4.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-intrinsic": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", - "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", - "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==", - "engines": { - "node": ">=4" - } - }, - "node_modules/get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/github-from-package": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", - "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==" - }, - "node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/global-dirs": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", - "integrity": "sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg==", - "dependencies": { - "ini": "^1.3.4" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/globrex": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz", - "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==" - }, - "node_modules/got": { - "version": "6.7.1", - "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz", - "integrity": "sha512-Y/K3EDuiQN9rTZhBvPRWMLXIKdeD1Rj0nzunfoi0Yyn5WBEbzxXKU9Ub2X41oZBagVWOBU3MuDonFMgPWQFnwg==", - "dependencies": { - "create-error-class": "^3.0.0", - "duplexer3": "^0.1.4", - "get-stream": "^3.0.0", - "is-redirect": "^1.0.0", - "is-retry-allowed": "^1.0.0", - "is-stream": "^1.0.0", - "lowercase-keys": "^1.0.0", - "safe-buffer": "^5.0.1", - "timed-out": "^4.0.0", - "unzip-response": "^2.0.1", - "url-parse-lax": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" - }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "engines": { - "node": ">=4" - } - }, - "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw==", - "dependencies": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/has-values": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", - "integrity": "sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ==", - "dependencies": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/has-values/node_modules/is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/has-values/node_modules/is-number/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/has-values/node_modules/kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw==", - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/ignore": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", - "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", - "engines": { - "node": ">= 4" - } - }, - "node_modules/ignore-by-default": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", - "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==" - }, - "node_modules/import-lazy": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", - "integrity": "sha512-m7ZEHgtw69qOGw+jwxXkHlrlIPdTGkyh66zXZ1ajZbxkDBNjSY/LGbmjc7h0s2ELsUDTAhFr55TrPSSqJGPG0A==", - "engines": { - "node": ">=4" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" - }, - "node_modules/into-stream": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/into-stream/-/into-stream-6.0.0.tgz", - "integrity": "sha512-XHbaOAvP+uFKUFsOgoNPRjLkwB+I22JFPFe5OjTkQ0nwgj6+pSjb4NmB6VMxaPshLiOf+zcpOCBQuLwC1KHhZA==", - "dependencies": { - "from2": "^2.3.0", - "p-is-promise": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-binary-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", - "integrity": "sha512-9fRVlXc0uCxEDj1nQzaWONSpbTfx0FmJfzHF7pwlI8DkWGoHBBea4Pg5Ky0ojwwxQmnSifgbKkI06Qv0Ljgj+Q==", - "dependencies": { - "binary-extensions": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" - }, - "node_modules/is-ci": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.2.1.tgz", - "integrity": "sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg==", - "dependencies": { - "ci-info": "^1.5.0" - }, - "bin": { - "is-ci": "bin.js" - } - }, - "node_modules/is-core-module": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz", - "integrity": "sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==", - "dependencies": { - "has": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dependencies": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dependencies": { - "is-plain-object": "^2.0.4" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-installed-globally": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.1.0.tgz", - "integrity": "sha512-ERNhMg+i/XgDwPIPF3u24qpajVreaiSuvpb1Uu0jugw7KKcxGyCX8cgp8P5fwTmAuXku6beDHHECdKArjlg7tw==", - "dependencies": { - "global-dirs": "^0.1.0", - "is-path-inside": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/is-npm": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-1.0.0.tgz", - "integrity": "sha512-9r39FIr3d+KD9SbX0sfMsHzb5PP3uimOiwr3YupUaUFG4W0l1U57Rx3utpttV7qz5U3jmrO5auUa04LU9pyHsg==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", - "integrity": "sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-path-inside": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", - "integrity": "sha512-qhsCR/Esx4U4hg/9I19OVUAJkGWtjRYHMRgUMZE2TDdj+Ag+kttZanLupfddNyglzz50cUlmWzUaI37GDfNx/g==", - "dependencies": { - "path-is-inside": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dependencies": { - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-redirect": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz", - "integrity": "sha512-cr/SlUEe5zOGmzvj9bUyC4LVvkNVAXu4GytXLNMr1pny+a65MpQ9IJzFHD5vi7FyJgb4qt27+eS3TuQnqB+RQw==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-retry-allowed": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz", - "integrity": "sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" - }, - "node_modules/isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true, - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/latest-version": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-3.1.0.tgz", - "integrity": "sha512-Be1YRHWWlZaSsrz2U+VInk+tO0EwLIyV+23RhWLINJYwg/UIikxjlj3MhH37/6/EDCAusjajvMkMMUXRaMWl/w==", - "dependencies": { - "package-json": "^4.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/lodash.camelcase": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", - "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==" - }, - "node_modules/long": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", - "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" - }, - "node_modules/lowercase-keys": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", - "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/make-dir": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", - "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", - "dependencies": { - "pify": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true - }, - "node_modules/map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/map-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w==", - "dependencies": { - "object-visit": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "engines": { - "node": ">= 8" - } - }, - "node_modules/methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mimic-response": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/mixin-deep": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", - "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", - "dependencies": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/mkdirp-classic": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", - "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==" - }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "node_modules/multistream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/multistream/-/multistream-4.1.0.tgz", - "integrity": "sha512-J1XDiAmmNpRCBfIWJv+n0ymC4ABcf/Pl+5YvC5B/D2f/2+8PtHvCNxMPKiQcZyi922Hq69J2YOpb1pTywfifyw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "once": "^1.4.0", - "readable-stream": "^3.6.0" - } - }, - "node_modules/multistream/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/multistream/node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/multistream/node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/nan": { - "version": "2.17.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.17.0.tgz", - "integrity": "sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ==", - "optional": true - }, - "node_modules/nanomatch": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", - "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", - "dependencies": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "fragment-cache": "^0.2.1", - "is-windows": "^1.0.2", - "kind-of": "^6.0.2", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/napi-build-utils": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", - "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==" - }, - "node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/node-abi": { - "version": "3.40.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.40.0.tgz", - "integrity": "sha512-zNy02qivjjRosswoYmPi8hIKJRr8MpQyeKT6qlcq/OnOgA3Rhoae+IYOqsM9V5+JnHWmxKnWOT2GxvtqdtOCXA==", - "dependencies": { - "semver": "^7.3.5" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/node-fetch": { - "version": "2.6.11", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.11.tgz", - "integrity": "sha512-4I6pdBY1EthSqDmJkiNk3JIT8cswwR9nfeW/cPdUagJYEQG7R95WRH74wpz7ma8Gh/9dI9FP+OU+0E4FvtA55w==", - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/nodemon": { - "version": "1.19.4", - "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-1.19.4.tgz", - "integrity": "sha512-VGPaqQBNk193lrJFotBU8nvWZPqEZY2eIzymy2jjY0fJ9qIsxA0sxQ8ATPl0gZC645gijYEc1jtZvpS8QWzJGQ==", - "hasInstallScript": true, - "dependencies": { - "chokidar": "^2.1.8", - "debug": "^3.2.6", - "ignore-by-default": "^1.0.1", - "minimatch": "^3.0.4", - "pstree.remy": "^1.1.7", - "semver": "^5.7.1", - "supports-color": "^5.5.0", - "touch": "^3.1.0", - "undefsafe": "^2.0.2", - "update-notifier": "^2.5.0" - }, - "bin": { - "nodemon": "bin/nodemon.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/nodemon/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/nodemon/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/nopt": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", - "integrity": "sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==", - "dependencies": { - "abbrev": "1" - }, - "bin": { - "nopt": "bin/nopt.js" - }, - "engines": { - "node": "*" - } - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==", - "dependencies": { - "path-key": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/object-copy": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", - "integrity": "sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ==", - "dependencies": { - "copy-descriptor": "^0.1.0", - "define-property": "^0.2.5", - "kind-of": "^3.0.3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-copy/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", - "dependencies": { - "is-descriptor": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-copy/node_modules/is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-copy/node_modules/is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-copy/node_modules/is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dependencies": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-copy/node_modules/is-descriptor/node_modules/kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-copy/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-inspect": { - "version": "1.12.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", - "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-visit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", - "integrity": "sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA==", - "dependencies": { - "isobject": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==", - "dependencies": { - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", - "engines": { - "node": ">=4" - } - }, - "node_modules/p-is-promise": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-3.0.0.tgz", - "integrity": "sha512-Wo8VsW4IRQSKVXsJCn7TomUaVtyfjVDn3nUP7kE967BQk0CwFpdbZs0X0uk5sW9mkBa9eNM7hCMaG93WUAwxYQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/package-json": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/package-json/-/package-json-4.0.1.tgz", - "integrity": "sha512-q/R5GrMek0vzgoomq6rm9OX+3PQve8sLwTirmK30YB3Cu0Bbt9OX9M/SIUnroN5BGJkzwGsFwDaRGD9EwBOlCA==", - "dependencies": { - "got": "^6.7.1", - "registry-auth-token": "^3.0.1", - "registry-url": "^3.0.3", - "semver": "^5.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/package-json/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-dirname": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", - "integrity": "sha512-ALzNPpyNq9AqXMBjeymIjFDAkAFH06mHJH/cSBHAgU0s4vfpBn6b2nf8tiRLvagKD8RbTpq2FKTBg7cl9l3c7Q==" - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-is-inside": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==" - }, - "node_modules/path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", - "engines": { - "node": ">=4" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" - }, - "node_modules/path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" - }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "engines": { - "node": ">=8" - } - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", - "engines": { - "node": ">=4" - } - }, - "node_modules/pkg": { - "version": "5.8.1", - "resolved": "https://registry.npmjs.org/pkg/-/pkg-5.8.1.tgz", - "integrity": "sha512-CjBWtFStCfIiT4Bde9QpJy0KeH19jCfwZRJqHFDFXfhUklCx8JoFmMj3wgnEYIwGmZVNkhsStPHEOnrtrQhEXA==", - "dependencies": { - "@babel/generator": "7.18.2", - "@babel/parser": "7.18.4", - "@babel/types": "7.19.0", - "chalk": "^4.1.2", - "fs-extra": "^9.1.0", - "globby": "^11.1.0", - "into-stream": "^6.0.0", - "is-core-module": "2.9.0", - "minimist": "^1.2.6", - "multistream": "^4.1.0", - "pkg-fetch": "3.4.2", - "prebuild-install": "7.1.1", - "resolve": "^1.22.0", - "stream-meter": "^1.0.4" - }, - "bin": { - "pkg": "lib-es5/bin.js" - }, - "peerDependencies": { - "node-notifier": ">=9.0.1" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/pkg-fetch": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/pkg-fetch/-/pkg-fetch-3.4.2.tgz", - "integrity": "sha512-0+uijmzYcnhC0hStDjm/cl2VYdrmVVBpe7Q8k9YBojxmR5tG8mvR9/nooQq3QSXiQqORDVOTY3XqMEqJVIzkHA==", - "dependencies": { - "chalk": "^4.1.2", - "fs-extra": "^9.1.0", - "https-proxy-agent": "^5.0.0", - "node-fetch": "^2.6.6", - "progress": "^2.0.3", - "semver": "^7.3.5", - "tar-fs": "^2.1.1", - "yargs": "^16.2.0" - }, - "bin": { - "pkg-fetch": "lib-es5/bin.js" - } - }, - "node_modules/pkg-fetch/node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "node_modules/pkg-fetch/node_modules/yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/pkg-fetch/node_modules/yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "engines": { - "node": ">=10" - } - }, - "node_modules/posix-character-classes": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", - "integrity": "sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/prebuild-install": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.1.tgz", - "integrity": "sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==", - "dependencies": { - "detect-libc": "^2.0.0", - "expand-template": "^2.0.3", - "github-from-package": "0.0.0", - "minimist": "^1.2.3", - "mkdirp-classic": "^0.5.3", - "napi-build-utils": "^1.0.1", - "node-abi": "^3.3.0", - "pump": "^3.0.0", - "rc": "^1.2.7", - "simple-get": "^4.0.0", - "tar-fs": "^2.0.0", - "tunnel-agent": "^0.6.0" - }, - "bin": { - "prebuild-install": "bin.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/prepend-http": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", - "integrity": "sha512-PhmXi5XmoyKw1Un4E+opM2KcsJInDvKyuOumcjjw3waw86ZNjHwVUOOWLc4bCzLdcKNaWBH9e99sbWzDQsVaYg==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/prisma": { - "version": "4.16.2", - "resolved": "https://registry.npmjs.org/prisma/-/prisma-4.16.2.tgz", - "integrity": "sha512-SYCsBvDf0/7XSJyf2cHTLjLeTLVXYfqp7pG5eEVafFLeT0u/hLFz/9W196nDRGUOo1JfPatAEb+uEnTQImQC1g==", - "devOptional": true, - "hasInstallScript": true, - "dependencies": { - "@prisma/engines": "4.16.2" - }, - "bin": { - "prisma": "build/index.js", - "prisma2": "build/index.js" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", - "engines": { - "node": ">= 0.6.0" - } - }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" - }, - "node_modules/progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/protobufjs": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.2.3.tgz", - "integrity": "sha512-TtpvOqwB5Gdz/PQmOjgsrGH1nHjAQVCN7JG4A6r1sXRWESL5rNMAiRcBQlCAdKxZcAbstExQePYG8xof/JVRgg==", - "hasInstallScript": true, - "dependencies": { - "@protobufjs/aspromise": "^1.1.2", - "@protobufjs/base64": "^1.1.2", - "@protobufjs/codegen": "^2.0.4", - "@protobufjs/eventemitter": "^1.1.0", - "@protobufjs/fetch": "^1.1.0", - "@protobufjs/float": "^1.0.2", - "@protobufjs/inquire": "^1.1.0", - "@protobufjs/path": "^1.1.2", - "@protobufjs/pool": "^1.1.0", - "@protobufjs/utf8": "^1.1.0", - "@types/node": ">=13.7.0", - "long": "^5.0.0" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/protobufjs/node_modules/long": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", - "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==" - }, - "node_modules/proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "dependencies": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==" - }, - "node_modules/pstree.remy": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", - "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==" - }, - "node_modules/pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "node_modules/qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", - "dependencies": { - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/querystringify": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", - "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==" - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/raw-body": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", - "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", - "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "dependencies": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "bin": { - "rc": "cli.js" - } - }, - "node_modules/readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "node_modules/readdirp": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", - "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", - "dependencies": { - "graceful-fs": "^4.1.11", - "micromatch": "^3.1.10", - "readable-stream": "^2.0.2" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/readdirp/node_modules/braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dependencies": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/readdirp/node_modules/braces/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/readdirp/node_modules/fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==", - "dependencies": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/readdirp/node_modules/fill-range/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/readdirp/node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/readdirp/node_modules/is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/readdirp/node_modules/is-number/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/readdirp/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" - }, - "node_modules/readdirp/node_modules/micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dependencies": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/readdirp/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/readdirp/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/readdirp/node_modules/to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==", - "dependencies": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/regex-not": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", - "dependencies": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/registry-auth-token": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.4.0.tgz", - "integrity": "sha512-4LM6Fw8eBQdwMYcES4yTnn2TqIasbXuwDx3um+QRs7S55aMKCBKBxvPXl2RiUjHwuJLTyYfxSpmfSAjQpcuP+A==", - "dependencies": { - "rc": "^1.1.6", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/registry-url": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz", - "integrity": "sha512-ZbgR5aZEdf4UKZVBPYIgaglBmSF2Hi94s2PcIHhRGFjKYu+chjJdYfHn4rt3hB6eCKLJ8giVIIfgMa1ehDfZKA==", - "dependencies": { - "rc": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/remove-trailing-separator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==" - }, - "node_modules/repeat-element": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz", - "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", - "engines": { - "node": ">=0.10" - } - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==" - }, - "node_modules/resolve": { - "version": "1.22.2", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", - "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", - "dependencies": { - "is-core-module": "^2.11.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==", - "deprecated": "https://github.com/lydell/resolve-url#deprecated" - }, - "node_modules/resolve/node_modules/is-core-module": { - "version": "2.12.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.0.tgz", - "integrity": "sha512-RECHCBCd/viahWmwj6enj19sKbHfJrddi/6cBDsNTKbNq0f7VeaUkBo60BqzvPqo/W54ChS62Z5qyun7cfOMqQ==", - "dependencies": { - "has": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/ret": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", - "engines": { - "node": ">=0.12" - } - }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "node_modules/safe-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==", - "dependencies": { - "ret": "~0.1.10" - } - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "node_modules/sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" - }, - "node_modules/semver": { - "version": "7.5.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.3.tgz", - "integrity": "sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/semver-diff": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz", - "integrity": "sha512-gL8F8L4ORwsS0+iQ34yCYv///jsOq0ZL7WP55d1HnJ32o7tyFYEFQZQA22mrLIacZdU6xecaBBZ+uEiffGNyXw==", - "dependencies": { - "semver": "^5.0.3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/semver-diff/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/send": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", - "dependencies": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.0.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/send/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/send/node_modules/debug/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/send/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - }, - "node_modules/serve-static": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", - "dependencies": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.18.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/set-value": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", - "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", - "dependencies": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.3", - "split-string": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/set-value/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/set-value/node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" - }, - "node_modules/shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", - "dependencies": { - "shebang-regex": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" - }, - "node_modules/simple-concat": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", - "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/simple-get": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", - "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "decompress-response": "^6.0.0", - "once": "^1.3.1", - "simple-concat": "^1.0.0" - } - }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "engines": { - "node": ">=8" - } - }, - "node_modules/snapdragon": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", - "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", - "dependencies": { - "base": "^0.11.1", - "debug": "^2.2.0", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "map-cache": "^0.2.2", - "source-map": "^0.5.6", - "source-map-resolve": "^0.5.0", - "use": "^3.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-node": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", - "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", - "dependencies": { - "define-property": "^1.0.0", - "isobject": "^3.0.0", - "snapdragon-util": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-node/node_modules/define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", - "dependencies": { - "is-descriptor": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-util": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", - "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", - "dependencies": { - "kind-of": "^3.2.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-util/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/snapdragon/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", - "dependencies": { - "is-descriptor": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/is-accessor-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/is-data-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dependencies": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-resolve": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", - "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", - "deprecated": "See https://github.com/lydell/source-map-resolve#deprecated", - "dependencies": { - "atob": "^2.1.2", - "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "urix": "^0.1.0" - } - }, - "node_modules/source-map-url": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz", - "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==", - "deprecated": "See https://github.com/lydell/source-map-url#deprecated" - }, - "node_modules/split-string": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", - "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", - "dependencies": { - "extend-shallow": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/static-extend": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", - "integrity": "sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g==", - "dependencies": { - "define-property": "^0.2.5", - "object-copy": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/static-extend/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", - "dependencies": { - "is-descriptor": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/static-extend/node_modules/is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/static-extend/node_modules/is-accessor-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/static-extend/node_modules/is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/static-extend/node_modules/is-data-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/static-extend/node_modules/is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dependencies": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/static-extend/node_modules/kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/stream-meter": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/stream-meter/-/stream-meter-1.0.4.tgz", - "integrity": "sha512-4sOEtrbgFotXwnEuzzsQBYEV1elAeFSO8rSGeTwabuX1RRn/kEq9JVH7I0MRBhKVRR0sJkr0M0QCH7yOLf9fhQ==", - "dependencies": { - "readable-stream": "^2.1.4" - } - }, - "node_modules/stream-meter/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" - }, - "node_modules/stream-meter/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/stream-meter/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==" - }, - "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/tar-fs": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", - "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", - "dependencies": { - "chownr": "^1.1.1", - "mkdirp-classic": "^0.5.2", - "pump": "^3.0.0", - "tar-stream": "^2.1.4" - } - }, - "node_modules/tar-stream": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", - "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", - "dependencies": { - "bl": "^4.0.3", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/tar-stream/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/tar-stream/node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/tar-stream/node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/term-size": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz", - "integrity": "sha512-7dPUZQGy/+m3/wjVz3ZW5dobSoD/02NxJpoXUX0WIyjfVS3l0c+b/+9phIDFA7FHzkYtwtMFgeGZ/Y8jVTeqQQ==", - "dependencies": { - "execa": "^0.7.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/timed-out": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", - "integrity": "sha512-G7r3AhovYtr5YKOWQkta8RKAPb+J9IsO4uVmzjl8AZwfhs8UcUwTiD6gcJYSgOtzyjvQKrKYn41syHbUWMkafA==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "engines": { - "node": ">=4" - } - }, - "node_modules/to-object-path": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", - "integrity": "sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==", - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/to-object-path/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/to-regex": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", - "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", - "dependencies": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/touch": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", - "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", - "dependencies": { - "nopt": "~1.0.10" - }, - "bin": { - "nodetouch": "bin/nodetouch.js" - } - }, - "node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" - }, - "node_modules/ts-node": { - "version": "10.9.1", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", - "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", - "dev": true, - "dependencies": { - "@cspotcode/source-map-support": "^0.8.0", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "v8-compile-cache-lib": "^3.0.1", - "yn": "3.1.1" - }, - "bin": { - "ts-node": "dist/bin.js", - "ts-node-cwd": "dist/bin-cwd.js", - "ts-node-esm": "dist/bin-esm.js", - "ts-node-script": "dist/bin-script.js", - "ts-node-transpile-only": "dist/bin-transpile.js", - "ts-script": "dist/bin-script-deprecated.js" - }, - "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 - } - } - }, - "node_modules/tsconfck": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/tsconfck/-/tsconfck-2.1.1.tgz", - "integrity": "sha512-ZPCkJBKASZBmBUNqGHmRhdhM8pJYDdOXp4nRgj/O0JwUwsMq50lCDRQP/M5GBNAA0elPrq4gAeu4dkaVCuKWww==", - "bin": { - "tsconfck": "bin/tsconfck.js" - }, - "engines": { - "node": "^14.13.1 || ^16 || >=18" - }, - "peerDependencies": { - "typescript": "^4.3.5 || ^5.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/tsconfig-paths": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", - "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==", - "dev": true, - "dependencies": { - "json5": "^2.2.2", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/tslib": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.0.tgz", - "integrity": "sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA==" - }, - "node_modules/tunnel": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz", - "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==", - "engines": { - "node": ">=0.6.11 <=0.7.0 || >=0.7.3" - } - }, - "node_modules/tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", - "dependencies": { - "safe-buffer": "^5.0.1" - }, - "engines": { - "node": "*" - } - }, - "node_modules/type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/typescript": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.4.tgz", - "integrity": "sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==", - "devOptional": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=12.20" - } - }, - "node_modules/undefsafe": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", - "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==" - }, - "node_modules/union-value": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", - "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", - "dependencies": { - "arr-union": "^3.1.0", - "get-value": "^2.0.6", - "is-extendable": "^0.1.1", - "set-value": "^2.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/union-value/node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/unique-string": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", - "integrity": "sha512-ODgiYu03y5g76A1I9Gt0/chLCzQjvzDy7DsZGsLOE/1MrF6wriEskSncj1+/C58Xk/kPZDppSctDybCwOSaGAg==", - "dependencies": { - "crypto-random-string": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/unset-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", - "integrity": "sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ==", - "dependencies": { - "has-value": "^0.3.1", - "isobject": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/unset-value/node_modules/has-value": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q==", - "dependencies": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/unset-value/node_modules/has-value/node_modules/isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==", - "dependencies": { - "isarray": "1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/unset-value/node_modules/has-values": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/unset-value/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" - }, - "node_modules/unzip-response": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz", - "integrity": "sha512-N0XH6lqDtFH84JxptQoZYmloF4nzrQqqrAymNj+/gW60AO2AZgOcf4O/nUXJcYfyQkqvMo9lSupBZmmgvuVXlw==", - "engines": { - "node": ">=4" - } - }, - "node_modules/upath": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", - "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", - "engines": { - "node": ">=4", - "yarn": "*" - } - }, - "node_modules/update-notifier": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-2.5.0.tgz", - "integrity": "sha512-gwMdhgJHGuj/+wHJJs9e6PcCszpxR1b236igrOkUofGhqJuG+amlIKwApH1IW1WWl7ovZxsX49lMBWLxSdm5Dw==", - "dependencies": { - "boxen": "^1.2.1", - "chalk": "^2.0.1", - "configstore": "^3.0.0", - "import-lazy": "^2.1.0", - "is-ci": "^1.0.10", - "is-installed-globally": "^0.1.0", - "is-npm": "^1.0.0", - "latest-version": "^3.0.0", - "semver-diff": "^2.0.0", - "xdg-basedir": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/update-notifier/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/update-notifier/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/update-notifier/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/update-notifier/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" - }, - "node_modules/urix": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==", - "deprecated": "Please see https://github.com/lydell/urix#deprecated" - }, - "node_modules/url-parse": { - "version": "1.5.10", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", - "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", - "dependencies": { - "querystringify": "^2.1.1", - "requires-port": "^1.0.0" - } - }, - "node_modules/url-parse-lax": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", - "integrity": "sha512-BVA4lR5PIviy2PMseNd2jbFQ+jwSwQGdJejf5ctd1rEXt0Ypd7yanUK9+lYechVlN5VaTJGsu2U/3MDDu6KgBA==", - "dependencies": { - "prepend-http": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/use": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", - "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" - }, - "node_modules/utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/v8-compile-cache-lib": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", - "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", - "dev": true - }, - "node_modules/vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/vite-tsconfig-paths": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/vite-tsconfig-paths/-/vite-tsconfig-paths-4.2.0.tgz", - "integrity": "sha512-jGpus0eUy5qbbMVGiTxCL1iB9ZGN6Bd37VGLJU39kTDD6ZfULTTb1bcc5IeTWqWJKiWV5YihCaibeASPiGi8kw==", - "dependencies": { - "debug": "^4.1.1", - "globrex": "^0.1.2", - "tsconfck": "^2.1.0" - }, - "peerDependencies": { - "vite": "*" - }, - "peerDependenciesMeta": { - "vite": { - "optional": true - } - } - }, - "node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" - }, - "node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" - } - }, - "node_modules/widest-line": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-2.0.1.tgz", - "integrity": "sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA==", - "dependencies": { - "string-width": "^2.1.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/widest-line/node_modules/ansi-regex": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", - "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", - "engines": { - "node": ">=4" - } - }, - "node_modules/widest-line/node_modules/is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", - "engines": { - "node": ">=4" - } - }, - "node_modules/widest-line/node_modules/string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dependencies": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/widest-line/node_modules/strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", - "dependencies": { - "ansi-regex": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" - }, - "node_modules/write-file-atomic": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz", - "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==", - "dependencies": { - "graceful-fs": "^4.1.11", - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.2" - } - }, - "node_modules/xdg-basedir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz", - "integrity": "sha512-1Dly4xqlulvPD3fZUQJLY+FUIeqN3N2MM3uqe4rCJftAvOjFa3jFGfctOgluGx4ahPbUCsZkmJILiP0Vi4T6lQ==", - "engines": { - "node": ">=4" - } - }, - "node_modules/xml2js": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.5.0.tgz", - "integrity": "sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==", - "dependencies": { - "sax": ">=0.6.0", - "xmlbuilder": "~11.0.0" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/xmlbuilder": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", - "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "engines": { - "node": ">=10" - } - }, - "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, - "node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "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.5", - "yargs-parser": "^21.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "engines": { - "node": ">=12" - } - }, - "node_modules/yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true, - "engines": { - "node": ">=6" - } - } - } -} diff --git a/services/product/pnpm-lock.yaml b/services/product/pnpm-lock.yaml index 97e33af7..e63d677d 100644 --- a/services/product/pnpm-lock.yaml +++ b/services/product/pnpm-lock.yaml @@ -20,25 +20,25 @@ specifiers: vite-tsconfig-paths: ^4.2.0 dependencies: - '@azure/storage-blob': 12.14.0 - '@grpc/grpc-js': 1.8.14 - '@grpc/proto-loader': 0.7.6 + '@azure/storage-blob': 12.15.0 + '@grpc/grpc-js': 1.8.18 + '@grpc/proto-loader': 0.7.8 '@prisma/client': 4.16.2_prisma@4.16.2 amqplib: 0.10.3 base64-arraybuffer: 1.0.2 express: 4.18.2 nodemon: 1.19.4 pkg: 5.8.1 - vite-tsconfig-paths: 4.2.0_typescript@5.0.2 + vite-tsconfig-paths: 4.2.0_typescript@5.1.6 devDependencies: '@types/amqplib': 0.10.1 '@types/node': 18.16.19 - esbuild: 0.18.11 + esbuild: 0.18.14 prisma: 4.16.2 - ts-node: 10.9.1_3n2f44gk7n7p32zpas3y4w4iqy + ts-node: 10.9.1_pqdfkuhuhnwv2d7uogwywwxtqq tsconfig-paths: 4.2.0 - typescript: 5.0.2 + typescript: 5.1.6 packages: @@ -80,7 +80,7 @@ packages: '@types/node-fetch': 2.6.4 '@types/tunnel': 0.0.3 form-data: 4.0.0 - node-fetch: 2.6.11 + node-fetch: 2.6.12 process: 0.11.10 tslib: 2.6.0 tunnel: 0.0.6 @@ -130,8 +130,8 @@ packages: tslib: 2.6.0 dev: false - /@azure/storage-blob/12.14.0: - resolution: {integrity: sha512-g8GNUDpMisGXzBeD+sKphhH5yLwesB4JkHr1U6be/X3F+cAMcyGLPD1P89g2M7wbEtUJWoikry1rlr83nNRBzg==} + /@azure/storage-blob/12.15.0: + resolution: {integrity: sha512-e7JBKLOFi0QVJqqLzrjx1eL3je3/Ug2IQj24cTM9b85CsnnFjLGeGjJVIjbGGZaytewiCEG7r3lRwQX7fKj0/w==} engines: {node: '>=14.0.0'} dependencies: '@azure/abort-controller': 1.1.0 @@ -155,13 +155,13 @@ packages: jsesc: 2.5.2 dev: false - /@babel/helper-string-parser/7.21.5: - resolution: {integrity: sha512-5pTUx3hAJaZIdW99sJ6ZUUgWq/Y+Hja7TowEnLNMm1VivRgZQL3vpBY3qUACVsvw+yQU6+YgfBVmcbLaZtrA1w==} + /@babel/helper-string-parser/7.22.5: + resolution: {integrity: sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==} engines: {node: '>=6.9.0'} dev: false - /@babel/helper-validator-identifier/7.19.1: - resolution: {integrity: sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==} + /@babel/helper-validator-identifier/7.22.5: + resolution: {integrity: sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==} engines: {node: '>=6.9.0'} dev: false @@ -177,8 +177,8 @@ packages: resolution: {integrity: sha512-YuGopBq3ke25BVSiS6fgF49Ul9gH1x70Bcr6bqRLjWCkcX8Hre1/5+z+IiWOIerRMSSEfGZVB9z9kyq7wVs9YA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/helper-string-parser': 7.21.5 - '@babel/helper-validator-identifier': 7.19.1 + '@babel/helper-string-parser': 7.22.5 + '@babel/helper-validator-identifier': 7.22.5 to-fast-properties: 2.0.0 dev: false @@ -189,8 +189,8 @@ packages: '@jridgewell/trace-mapping': 0.3.9 dev: true - /@esbuild/android-arm/0.18.11: - resolution: {integrity: sha512-q4qlUf5ucwbUJZXF5tEQ8LF7y0Nk4P58hOsGk3ucY0oCwgQqAnqXVbUuahCddVHfrxmpyewRpiTHwVHIETYu7Q==} + /@esbuild/android-arm/0.18.14: + resolution: {integrity: sha512-blODaaL+lngG5bdK/t4qZcQvq2BBqrABmYwqPPcS5VRxrCSGHb9R/rA3fqxh7R18I7WU4KKv+NYkt22FDfalcg==} engines: {node: '>=12'} cpu: [arm] os: [android] @@ -198,8 +198,8 @@ packages: dev: true optional: true - /@esbuild/android-arm64/0.18.11: - resolution: {integrity: sha512-snieiq75Z1z5LJX9cduSAjUr7vEI1OdlzFPMw0HH5YI7qQHDd3qs+WZoMrWYDsfRJSq36lIA6mfZBkvL46KoIw==} + /@esbuild/android-arm64/0.18.14: + resolution: {integrity: sha512-rZ2v+Luba5/3D6l8kofWgTnqE+qsC/L5MleKIKFyllHTKHrNBMqeRCnZI1BtRx8B24xMYxeU32iIddRQqMsOsg==} engines: {node: '>=12'} cpu: [arm64] os: [android] @@ -207,8 +207,8 @@ packages: dev: true optional: true - /@esbuild/android-x64/0.18.11: - resolution: {integrity: sha512-iPuoxQEV34+hTF6FT7om+Qwziv1U519lEOvekXO9zaMMlT9+XneAhKL32DW3H7okrCOBQ44BMihE8dclbZtTuw==} + /@esbuild/android-x64/0.18.14: + resolution: {integrity: sha512-qSwh8y38QKl+1Iqg+YhvCVYlSk3dVLk9N88VO71U4FUjtiSFylMWK3Ugr8GC6eTkkP4Tc83dVppt2n8vIdlSGg==} engines: {node: '>=12'} cpu: [x64] os: [android] @@ -216,8 +216,8 @@ packages: dev: true optional: true - /@esbuild/darwin-arm64/0.18.11: - resolution: {integrity: sha512-Gm0QkI3k402OpfMKyQEEMG0RuW2LQsSmI6OeO4El2ojJMoF5NLYb3qMIjvbG/lbMeLOGiW6ooU8xqc+S0fgz2w==} + /@esbuild/darwin-arm64/0.18.14: + resolution: {integrity: sha512-9Hl2D2PBeDYZiNbnRKRWuxwHa9v5ssWBBjisXFkVcSP5cZqzZRFBUWEQuqBHO4+PKx4q4wgHoWtfQ1S7rUqJ2Q==} engines: {node: '>=12'} cpu: [arm64] os: [darwin] @@ -225,8 +225,8 @@ packages: dev: true optional: true - /@esbuild/darwin-x64/0.18.11: - resolution: {integrity: sha512-N15Vzy0YNHu6cfyDOjiyfJlRJCB/ngKOAvoBf1qybG3eOq0SL2Lutzz9N7DYUbb7Q23XtHPn6lMDF6uWbGv9Fw==} + /@esbuild/darwin-x64/0.18.14: + resolution: {integrity: sha512-ZnI3Dg4ElQ6tlv82qLc/UNHtFsgZSKZ7KjsUNAo1BF1SoYDjkGKHJyCrYyWjFecmXpvvG/KJ9A/oe0H12odPLQ==} engines: {node: '>=12'} cpu: [x64] os: [darwin] @@ -234,8 +234,8 @@ packages: dev: true optional: true - /@esbuild/freebsd-arm64/0.18.11: - resolution: {integrity: sha512-atEyuq6a3omEY5qAh5jIORWk8MzFnCpSTUruBgeyN9jZq1K/QI9uke0ATi3MHu4L8c59CnIi4+1jDKMuqmR71A==} + /@esbuild/freebsd-arm64/0.18.14: + resolution: {integrity: sha512-h3OqR80Da4oQCIa37zl8tU5MwHQ7qgPV0oVScPfKJK21fSRZEhLE4IIVpmcOxfAVmqjU6NDxcxhYaM8aDIGRLw==} engines: {node: '>=12'} cpu: [arm64] os: [freebsd] @@ -243,8 +243,8 @@ packages: dev: true optional: true - /@esbuild/freebsd-x64/0.18.11: - resolution: {integrity: sha512-XtuPrEfBj/YYYnAAB7KcorzzpGTvOr/dTtXPGesRfmflqhA4LMF0Gh/n5+a9JBzPuJ+CGk17CA++Hmr1F/gI0Q==} + /@esbuild/freebsd-x64/0.18.14: + resolution: {integrity: sha512-ha4BX+S6CZG4BoH9tOZTrFIYC1DH13UTCRHzFc3GWX74nz3h/N6MPF3tuR3XlsNjMFUazGgm35MPW5tHkn2lzQ==} engines: {node: '>=12'} cpu: [x64] os: [freebsd] @@ -252,8 +252,8 @@ packages: dev: true optional: true - /@esbuild/linux-arm/0.18.11: - resolution: {integrity: sha512-Idipz+Taso/toi2ETugShXjQ3S59b6m62KmLHkJlSq/cBejixmIydqrtM2XTvNCywFl3VC7SreSf6NV0i6sRyg==} + /@esbuild/linux-arm/0.18.14: + resolution: {integrity: sha512-5+7vehI1iqru5WRtJyU2XvTOvTGURw3OZxe3YTdE9muNNIdmKAVmSHpB3Vw2LazJk2ifEdIMt/wTWnVe5V98Kg==} engines: {node: '>=12'} cpu: [arm] os: [linux] @@ -261,8 +261,8 @@ packages: dev: true optional: true - /@esbuild/linux-arm64/0.18.11: - resolution: {integrity: sha512-c6Vh2WS9VFKxKZ2TvJdA7gdy0n6eSy+yunBvv4aqNCEhSWVor1TU43wNRp2YLO9Vng2G+W94aRz+ILDSwAiYog==} + /@esbuild/linux-arm64/0.18.14: + resolution: {integrity: sha512-IXORRe22In7U65NZCzjwAUc03nn8SDIzWCnfzJ6t/8AvGx5zBkcLfknI+0P+hhuftufJBmIXxdSTbzWc8X/V4w==} engines: {node: '>=12'} cpu: [arm64] os: [linux] @@ -270,8 +270,8 @@ packages: dev: true optional: true - /@esbuild/linux-ia32/0.18.11: - resolution: {integrity: sha512-S3hkIF6KUqRh9n1Q0dSyYcWmcVa9Cg+mSoZEfFuzoYXXsk6196qndrM+ZiHNwpZKi3XOXpShZZ+9dfN5ykqjjw==} + /@esbuild/linux-ia32/0.18.14: + resolution: {integrity: sha512-BfHlMa0nibwpjG+VXbOoqJDmFde4UK2gnW351SQ2Zd4t1N3zNdmUEqRkw/srC1Sa1DRBE88Dbwg4JgWCbNz/FQ==} engines: {node: '>=12'} cpu: [ia32] os: [linux] @@ -279,8 +279,8 @@ packages: dev: true optional: true - /@esbuild/linux-loong64/0.18.11: - resolution: {integrity: sha512-MRESANOoObQINBA+RMZW+Z0TJWpibtE7cPFnahzyQHDCA9X9LOmGh68MVimZlM9J8n5Ia8lU773te6O3ILW8kw==} + /@esbuild/linux-loong64/0.18.14: + resolution: {integrity: sha512-j2/Ex++DRUWIAaUDprXd3JevzGtZ4/d7VKz+AYDoHZ3HjJzCyYBub9CU1wwIXN+viOP0b4VR3RhGClsvyt/xSw==} engines: {node: '>=12'} cpu: [loong64] os: [linux] @@ -288,8 +288,8 @@ packages: dev: true optional: true - /@esbuild/linux-mips64el/0.18.11: - resolution: {integrity: sha512-qVyPIZrXNMOLYegtD1u8EBccCrBVshxMrn5MkuFc3mEVsw7CCQHaqZ4jm9hbn4gWY95XFnb7i4SsT3eflxZsUg==} + /@esbuild/linux-mips64el/0.18.14: + resolution: {integrity: sha512-qn2+nc+ZCrJmiicoAnJXJJkZWt8Nwswgu1crY7N+PBR8ChBHh89XRxj38UU6Dkthl2yCVO9jWuafZ24muzDC/A==} engines: {node: '>=12'} cpu: [mips64el] os: [linux] @@ -297,8 +297,8 @@ packages: dev: true optional: true - /@esbuild/linux-ppc64/0.18.11: - resolution: {integrity: sha512-T3yd8vJXfPirZaUOoA9D2ZjxZX4Gr3QuC3GztBJA6PklLotc/7sXTOuuRkhE9W/5JvJP/K9b99ayPNAD+R+4qQ==} + /@esbuild/linux-ppc64/0.18.14: + resolution: {integrity: sha512-aGzXzd+djqeEC5IRkDKt3kWzvXoXC6K6GyYKxd+wsFJ2VQYnOWE954qV2tvy5/aaNrmgPTb52cSCHFE+Z7Z0yg==} engines: {node: '>=12'} cpu: [ppc64] os: [linux] @@ -306,8 +306,8 @@ packages: dev: true optional: true - /@esbuild/linux-riscv64/0.18.11: - resolution: {integrity: sha512-evUoRPWiwuFk++snjH9e2cAjF5VVSTj+Dnf+rkO/Q20tRqv+644279TZlPK8nUGunjPAtQRCj1jQkDAvL6rm2w==} + /@esbuild/linux-riscv64/0.18.14: + resolution: {integrity: sha512-8C6vWbfr0ygbAiMFLS6OPz0BHvApkT2gCboOGV76YrYw+sD/MQJzyITNsjZWDXJwPu9tjrFQOVG7zijRzBCnLw==} engines: {node: '>=12'} cpu: [riscv64] os: [linux] @@ -315,8 +315,8 @@ packages: dev: true optional: true - /@esbuild/linux-s390x/0.18.11: - resolution: {integrity: sha512-/SlRJ15XR6i93gRWquRxYCfhTeC5PdqEapKoLbX63PLCmAkXZHY2uQm2l9bN0oPHBsOw2IswRZctMYS0MijFcg==} + /@esbuild/linux-s390x/0.18.14: + resolution: {integrity: sha512-G/Lf9iu8sRMM60OVGOh94ZW2nIStksEcITkXdkD09/T6QFD/o+g0+9WVyR/jajIb3A0LvBJ670tBnGe1GgXMgw==} engines: {node: '>=12'} cpu: [s390x] os: [linux] @@ -324,8 +324,8 @@ packages: dev: true optional: true - /@esbuild/linux-x64/0.18.11: - resolution: {integrity: sha512-xcncej+wF16WEmIwPtCHi0qmx1FweBqgsRtEL1mSHLFR6/mb3GEZfLQnx+pUDfRDEM4DQF8dpXIW7eDOZl1IbA==} + /@esbuild/linux-x64/0.18.14: + resolution: {integrity: sha512-TBgStYBQaa3EGhgqIDM+ECnkreb0wkcKqL7H6m+XPcGUoU4dO7dqewfbm0mWEQYH3kzFHrzjOFNpSAVzDZRSJw==} engines: {node: '>=12'} cpu: [x64] os: [linux] @@ -333,8 +333,8 @@ packages: dev: true optional: true - /@esbuild/netbsd-x64/0.18.11: - resolution: {integrity: sha512-aSjMHj/F7BuS1CptSXNg6S3M4F3bLp5wfFPIJM+Km2NfIVfFKhdmfHF9frhiCLIGVzDziggqWll0B+9AUbud/Q==} + /@esbuild/netbsd-x64/0.18.14: + resolution: {integrity: sha512-stvCcjyCQR2lMTroqNhAbvROqRjxPEq0oQ380YdXxA81TaRJEucH/PzJ/qsEtsHgXlWFW6Ryr/X15vxQiyRXVg==} engines: {node: '>=12'} cpu: [x64] os: [netbsd] @@ -342,8 +342,8 @@ packages: dev: true optional: true - /@esbuild/openbsd-x64/0.18.11: - resolution: {integrity: sha512-tNBq+6XIBZtht0xJGv7IBB5XaSyvYPCm1PxJ33zLQONdZoLVM0bgGqUrXnJyiEguD9LU4AHiu+GCXy/Hm9LsdQ==} + /@esbuild/openbsd-x64/0.18.14: + resolution: {integrity: sha512-apAOJF14CIsN5ht1PA57PboEMsNV70j3FUdxLmA2liZ20gEQnfTG5QU0FhENo5nwbTqCB2O3WDsXAihfODjHYw==} engines: {node: '>=12'} cpu: [x64] os: [openbsd] @@ -351,8 +351,8 @@ packages: dev: true optional: true - /@esbuild/sunos-x64/0.18.11: - resolution: {integrity: sha512-kxfbDOrH4dHuAAOhr7D7EqaYf+W45LsAOOhAet99EyuxxQmjbk8M9N4ezHcEiCYPaiW8Dj3K26Z2V17Gt6p3ng==} + /@esbuild/sunos-x64/0.18.14: + resolution: {integrity: sha512-fYRaaS8mDgZcGybPn2MQbn1ZNZx+UXFSUoS5Hd2oEnlsyUcr/l3c6RnXf1bLDRKKdLRSabTmyCy7VLQ7VhGdOQ==} engines: {node: '>=12'} cpu: [x64] os: [sunos] @@ -360,8 +360,8 @@ packages: dev: true optional: true - /@esbuild/win32-arm64/0.18.11: - resolution: {integrity: sha512-Sh0dDRyk1Xi348idbal7lZyfSkjhJsdFeuC13zqdipsvMetlGiFQNdO+Yfp6f6B4FbyQm7qsk16yaZk25LChzg==} + /@esbuild/win32-arm64/0.18.14: + resolution: {integrity: sha512-1c44RcxKEJPrVj62XdmYhxXaU/V7auELCmnD+Ri+UCt+AGxTvzxl9uauQhrFso8gj6ZV1DaORV0sT9XSHOAk8Q==} engines: {node: '>=12'} cpu: [arm64] os: [win32] @@ -369,8 +369,8 @@ packages: dev: true optional: true - /@esbuild/win32-ia32/0.18.11: - resolution: {integrity: sha512-o9JUIKF1j0rqJTFbIoF4bXj6rvrTZYOrfRcGyL0Vm5uJ/j5CkBD/51tpdxe9lXEDouhRgdr/BYzUrDOvrWwJpg==} + /@esbuild/win32-ia32/0.18.14: + resolution: {integrity: sha512-EXAFttrdAxZkFQmpvcAQ2bywlWUsONp/9c2lcfvPUhu8vXBBenCXpoq9YkUvVP639ld3YGiYx0YUQ6/VQz3Maw==} engines: {node: '>=12'} cpu: [ia32] os: [win32] @@ -378,8 +378,8 @@ packages: dev: true optional: true - /@esbuild/win32-x64/0.18.11: - resolution: {integrity: sha512-rQI4cjLHd2hGsM1LqgDI7oOCYbQ6IBOVsX9ejuRMSze0GqXUG2ekwiKkiBU1pRGSeCqFFHxTrcEydB2Hyoz9CA==} + /@esbuild/win32-x64/0.18.14: + resolution: {integrity: sha512-K0QjGbcskx+gY+qp3v4/940qg8JitpXbdxFhRDA1aYoNaPff88+aEwoq45aqJ+ogpxQxmU0ZTjgnrQD/w8iiUg==} engines: {node: '>=12'} cpu: [x64] os: [win32] @@ -387,24 +387,24 @@ packages: dev: true optional: true - /@grpc/grpc-js/1.8.14: - resolution: {integrity: sha512-w84maJ6CKl5aApCMzFll0hxtFNT6or9WwMslobKaqWUEf1K+zhlL43bSQhFreyYWIWR+Z0xnVFC1KtLm4ZpM/A==} + /@grpc/grpc-js/1.8.18: + resolution: {integrity: sha512-2uWPtxhsXmVgd8WzDhfamSjHpZDXfMjMDciY6VRTq4Sn7rFzazyf0LLDa0oav+61UHIoEZb4KKaAV6S7NuJFbQ==} engines: {node: ^8.13.0 || >=10.10.0} dependencies: - '@grpc/proto-loader': 0.7.6 + '@grpc/proto-loader': 0.7.8 '@types/node': 18.16.19 dev: false - /@grpc/proto-loader/0.7.6: - resolution: {integrity: sha512-QyAXR8Hyh7uMDmveWxDSUcJr9NAWaZ2I6IXgAYvQmfflwouTM+rArE2eEaCtLlRqO81j7pRLCt81IefUei6Zbw==} + /@grpc/proto-loader/0.7.8: + resolution: {integrity: sha512-GU12e2c8dmdXb7XUlOgYWZ2o2i+z9/VeACkxTA/zzAe2IjclC5PnVL0lpgjhrqfpDYHzM8B1TF6pqWegMYAzlA==} engines: {node: '>=6'} hasBin: true dependencies: '@types/long': 4.0.2 lodash.camelcase: 4.3.0 long: 4.0.0 - protobufjs: 7.2.3 - yargs: 16.2.0 + protobufjs: 7.2.4 + yargs: 17.7.2 dev: false /@jridgewell/gen-mapping/0.3.3: @@ -412,13 +412,19 @@ packages: engines: {node: '>=6.0.0'} dependencies: '@jridgewell/set-array': 1.1.2 - '@jridgewell/sourcemap-codec': 1.4.14 - '@jridgewell/trace-mapping': 0.3.9 + '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/trace-mapping': 0.3.18 dev: false /@jridgewell/resolve-uri/3.1.0: resolution: {integrity: sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==} engines: {node: '>=6.0.0'} + dev: false + + /@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==} @@ -427,12 +433,24 @@ packages: /@jridgewell/sourcemap-codec/1.4.14: resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==} + dev: false - /@jridgewell/trace-mapping/0.3.9: - resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} + /@jridgewell/sourcemap-codec/1.4.15: + resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + + /@jridgewell/trace-mapping/0.3.18: + resolution: {integrity: sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==} dependencies: '@jridgewell/resolve-uri': 3.1.0 '@jridgewell/sourcemap-codec': 1.4.14 + dev: false + + /@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 /@nodelib/fs.scandir/2.1.5: resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} @@ -537,8 +555,8 @@ packages: resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} dev: true - /@tsconfig/node16/1.0.3: - resolution: {integrity: sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==} + /@tsconfig/node16/1.0.4: + resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} dev: true /@types/amqplib/0.10.1: @@ -596,8 +614,8 @@ packages: engines: {node: '>=0.4.0'} dev: true - /acorn/8.8.2: - resolution: {integrity: sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==} + /acorn/8.10.0: + resolution: {integrity: sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==} engines: {node: '>=0.4.0'} hasBin: true dev: true @@ -866,7 +884,7 @@ packages: resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==} dependencies: function-bind: 1.1.1 - get-intrinsic: 1.2.0 + get-intrinsic: 1.2.1 dev: false /camelcase/4.1.0: @@ -948,6 +966,15 @@ packages: 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 + dev: false + /collection-visit/1.0.0: resolution: {integrity: sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw==} engines: {node: '>=0.10.0'} @@ -1159,8 +1186,8 @@ packages: engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} dev: false - /detect-libc/2.0.1: - resolution: {integrity: sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==} + /detect-libc/2.0.2: + resolution: {integrity: sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==} engines: {node: '>=8'} dev: false @@ -1206,34 +1233,34 @@ packages: once: 1.4.0 dev: false - /esbuild/0.18.11: - resolution: {integrity: sha512-i8u6mQF0JKJUlGR3OdFLKldJQMMs8OqM9Cc3UCi9XXziJ9WERM5bfkHaEAy0YAvPRMgqSW55W7xYn84XtEFTtA==} + /esbuild/0.18.14: + resolution: {integrity: sha512-uNPj5oHPYmj+ZhSQeYQVFZ+hAlJZbAGOmmILWIqrGvPVlNLbyOvU5Bu6Woi8G8nskcx0vwY0iFoMPrzT86Ko+w==} engines: {node: '>=12'} hasBin: true requiresBuild: true optionalDependencies: - '@esbuild/android-arm': 0.18.11 - '@esbuild/android-arm64': 0.18.11 - '@esbuild/android-x64': 0.18.11 - '@esbuild/darwin-arm64': 0.18.11 - '@esbuild/darwin-x64': 0.18.11 - '@esbuild/freebsd-arm64': 0.18.11 - '@esbuild/freebsd-x64': 0.18.11 - '@esbuild/linux-arm': 0.18.11 - '@esbuild/linux-arm64': 0.18.11 - '@esbuild/linux-ia32': 0.18.11 - '@esbuild/linux-loong64': 0.18.11 - '@esbuild/linux-mips64el': 0.18.11 - '@esbuild/linux-ppc64': 0.18.11 - '@esbuild/linux-riscv64': 0.18.11 - '@esbuild/linux-s390x': 0.18.11 - '@esbuild/linux-x64': 0.18.11 - '@esbuild/netbsd-x64': 0.18.11 - '@esbuild/openbsd-x64': 0.18.11 - '@esbuild/sunos-x64': 0.18.11 - '@esbuild/win32-arm64': 0.18.11 - '@esbuild/win32-ia32': 0.18.11 - '@esbuild/win32-x64': 0.18.11 + '@esbuild/android-arm': 0.18.14 + '@esbuild/android-arm64': 0.18.14 + '@esbuild/android-x64': 0.18.14 + '@esbuild/darwin-arm64': 0.18.14 + '@esbuild/darwin-x64': 0.18.14 + '@esbuild/freebsd-arm64': 0.18.14 + '@esbuild/freebsd-x64': 0.18.14 + '@esbuild/linux-arm': 0.18.14 + '@esbuild/linux-arm64': 0.18.14 + '@esbuild/linux-ia32': 0.18.14 + '@esbuild/linux-loong64': 0.18.14 + '@esbuild/linux-mips64el': 0.18.14 + '@esbuild/linux-ppc64': 0.18.14 + '@esbuild/linux-riscv64': 0.18.14 + '@esbuild/linux-s390x': 0.18.14 + '@esbuild/linux-x64': 0.18.14 + '@esbuild/netbsd-x64': 0.18.14 + '@esbuild/openbsd-x64': 0.18.14 + '@esbuild/sunos-x64': 0.18.14 + '@esbuild/win32-arm64': 0.18.14 + '@esbuild/win32-ia32': 0.18.14 + '@esbuild/win32-x64': 0.18.14 dev: true /escalade/3.1.1: @@ -1363,8 +1390,8 @@ packages: - supports-color dev: false - /fast-glob/3.2.12: - resolution: {integrity: sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==} + /fast-glob/3.3.0: + resolution: {integrity: sha512-ChDuvbOypPuNjO8yIDf36x7BlZX1smcUMTTcyoIjycexOxd6DFsKsg21qVBzEmr3G7fUKIRy2/psii+CIUt7FA==} engines: {node: '>=8.6.0'} dependencies: '@nodelib/fs.stat': 2.0.5 @@ -1500,11 +1527,12 @@ packages: engines: {node: 6.* || 8.* || >= 10.*} dev: false - /get-intrinsic/1.2.0: - resolution: {integrity: sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==} + /get-intrinsic/1.2.1: + resolution: {integrity: sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==} dependencies: function-bind: 1.1.1 has: 1.0.3 + has-proto: 1.0.1 has-symbols: 1.0.3 dev: false @@ -1549,7 +1577,7 @@ packages: dependencies: array-union: 2.1.0 dir-glob: 3.0.1 - fast-glob: 3.2.12 + fast-glob: 3.3.0 ignore: 5.2.4 merge2: 1.4.1 slash: 3.0.0 @@ -1592,6 +1620,11 @@ packages: engines: {node: '>=8'} dev: false + /has-proto/1.0.1: + resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} + engines: {node: '>= 0.4'} + dev: false + /has-symbols/1.0.3: resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} engines: {node: '>= 0.4'} @@ -1739,8 +1772,8 @@ packages: ci-info: 1.6.0 dev: false - /is-core-module/2.12.0: - resolution: {integrity: sha512-RECHCBCd/viahWmwj6enj19sKbHfJrddi/6cBDsNTKbNq0f7VeaUkBo60BqzvPqo/W54ChS62Z5qyun7cfOMqQ==} + /is-core-module/2.12.1: + resolution: {integrity: sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==} dependencies: has: 1.0.3 dev: false @@ -2162,15 +2195,15 @@ packages: engines: {node: '>= 0.6'} dev: false - /node-abi/3.40.0: - resolution: {integrity: sha512-zNy02qivjjRosswoYmPi8hIKJRr8MpQyeKT6qlcq/OnOgA3Rhoae+IYOqsM9V5+JnHWmxKnWOT2GxvtqdtOCXA==} + /node-abi/3.45.0: + resolution: {integrity: sha512-iwXuFrMAcFVi/ZoZiqq8BzAdsLw9kxDfTC0HMyjXfSL/6CSDAGD5UmR7azrAgWV1zKYq7dUUMj4owusBWKLsiQ==} engines: {node: '>=10'} dependencies: - semver: 7.5.0 + semver: 7.5.4 dev: false - /node-fetch/2.6.11: - resolution: {integrity: sha512-4I6pdBY1EthSqDmJkiNk3JIT8cswwR9nfeW/cPdUagJYEQG7R95WRH74wpz7ma8Gh/9dI9FP+OU+0E4FvtA55w==} + /node-fetch/2.6.12: + resolution: {integrity: sha512-C/fGU2E8ToujUivIO0H+tpQ6HWo4eEmchoPIoXtxCrVghxdKq+QOHqEZW7tuP3KlV3bC8FRMO5nMCC7Zm1VP6g==} engines: {node: 4.x || >=6.0.0} peerDependencies: encoding: ^0.1.0 @@ -2192,7 +2225,7 @@ packages: ignore-by-default: 1.0.1 minimatch: 3.1.2 pstree.remy: 1.1.8 - semver: 5.7.1 + semver: 5.7.2 supports-color: 5.5.0 touch: 3.1.0 undefsafe: 2.0.5 @@ -2282,7 +2315,7 @@ packages: got: 6.7.1 registry-auth-token: 3.4.0 registry-url: 3.1.0 - semver: 5.7.1 + semver: 5.7.2 dev: false /parseurl/1.3.3: @@ -2343,9 +2376,9 @@ packages: chalk: 4.1.2 fs-extra: 9.1.0 https-proxy-agent: 5.0.1 - node-fetch: 2.6.11 + node-fetch: 2.6.12 progress: 2.0.3 - semver: 7.5.0 + semver: 7.5.4 tar-fs: 2.1.1 yargs: 16.2.0 transitivePeerDependencies: @@ -2391,13 +2424,13 @@ packages: engines: {node: '>=10'} hasBin: true dependencies: - detect-libc: 2.0.1 + detect-libc: 2.0.2 expand-template: 2.0.3 github-from-package: 0.0.0 minimist: 1.2.8 mkdirp-classic: 0.5.3 napi-build-utils: 1.0.2 - node-abi: 3.40.0 + node-abi: 3.45.0 pump: 3.0.0 rc: 1.2.8 simple-get: 4.0.1 @@ -2432,8 +2465,8 @@ packages: engines: {node: '>=0.4.0'} dev: false - /protobufjs/7.2.3: - resolution: {integrity: sha512-TtpvOqwB5Gdz/PQmOjgsrGH1nHjAQVCN7JG4A6r1sXRWESL5rNMAiRcBQlCAdKxZcAbstExQePYG8xof/JVRgg==} + /protobufjs/7.2.4: + resolution: {integrity: sha512-AT+RJgD2sH8phPmCf7OUZR8xGdcJRga4+1cOaXJ64hvcSkVhNcRHOwIxUatPH15+nj59WAGTDv3LSGZPEQbJaQ==} engines: {node: '>=12.0.0'} requiresBuild: true dependencies: @@ -2609,7 +2642,7 @@ packages: resolution: {integrity: sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==} hasBin: true dependencies: - is-core-module: 2.12.0 + is-core-module: 2.12.1 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 dev: false @@ -2656,16 +2689,16 @@ packages: resolution: {integrity: sha512-gL8F8L4ORwsS0+iQ34yCYv///jsOq0ZL7WP55d1HnJ32o7tyFYEFQZQA22mrLIacZdU6xecaBBZ+uEiffGNyXw==} engines: {node: '>=0.10.0'} dependencies: - semver: 5.7.1 + semver: 5.7.2 dev: false - /semver/5.7.1: - resolution: {integrity: sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==} + /semver/5.7.2: + resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} hasBin: true dev: false - /semver/7.5.0: - resolution: {integrity: sha512-+XC0AD/R7Q2mPSRuy2Id0+CGTZ98+8f+KvwirxOKIEyid+XSx6HbC63p+O4IndTHuX5Z+JxQ0TghCkO5Cg/2HA==} + /semver/7.5.4: + resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} engines: {node: '>=10'} hasBin: true dependencies: @@ -2735,7 +2768,7 @@ packages: resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} dependencies: call-bind: 1.0.2 - get-intrinsic: 1.2.0 + get-intrinsic: 1.2.1 object-inspect: 1.12.3 dev: false @@ -3005,7 +3038,7 @@ packages: resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} dev: false - /ts-node/10.9.1_3n2f44gk7n7p32zpas3y4w4iqy: + /ts-node/10.9.1_pqdfkuhuhnwv2d7uogwywwxtqq: resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} hasBin: true peerDependencies: @@ -3023,21 +3056,21 @@ packages: '@tsconfig/node10': 1.0.9 '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 - '@tsconfig/node16': 1.0.3 + '@tsconfig/node16': 1.0.4 '@types/node': 18.16.19 - acorn: 8.8.2 + 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.0.2 + typescript: 5.1.6 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 dev: true - /tsconfck/2.1.1_typescript@5.0.2: - resolution: {integrity: sha512-ZPCkJBKASZBmBUNqGHmRhdhM8pJYDdOXp4nRgj/O0JwUwsMq50lCDRQP/M5GBNAA0elPrq4gAeu4dkaVCuKWww==} + /tsconfck/2.1.2_typescript@5.1.6: + resolution: {integrity: sha512-ghqN1b0puy3MhhviwO2kGF8SeMDNhEbnKxjK7h6+fvY9JAxqvXi8y5NAHSQv687OVboS2uZIByzGd45/YxrRHg==} engines: {node: ^14.13.1 || ^16 || >=18} hasBin: true peerDependencies: @@ -3046,7 +3079,7 @@ packages: typescript: optional: true dependencies: - typescript: 5.0.2 + typescript: 5.1.6 dev: false /tsconfig-paths/4.2.0: @@ -3081,9 +3114,9 @@ packages: mime-types: 2.1.35 dev: false - /typescript/5.0.2: - resolution: {integrity: sha512-wVORMBGO/FAs/++blGNeAVdbNKtIh1rbBL2EyQ1+J9lClJ93KiiKe8PmFIVdXhHcyv44SL9oglmfeSsndo0jRw==} - engines: {node: '>=12.20'} + /typescript/5.1.6: + resolution: {integrity: sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==} + engines: {node: '>=14.17'} hasBin: true /undefsafe/2.0.5: @@ -3198,7 +3231,7 @@ packages: engines: {node: '>= 0.8'} dev: false - /vite-tsconfig-paths/4.2.0_typescript@5.0.2: + /vite-tsconfig-paths/4.2.0_typescript@5.1.6: resolution: {integrity: sha512-jGpus0eUy5qbbMVGiTxCL1iB9ZGN6Bd37VGLJU39kTDD6ZfULTTb1bcc5IeTWqWJKiWV5YihCaibeASPiGi8kw==} peerDependencies: vite: '*' @@ -3208,7 +3241,7 @@ packages: dependencies: debug: 4.3.4 globrex: 0.1.2 - tsconfck: 2.1.1_typescript@5.0.2 + tsconfck: 2.1.2_typescript@5.1.6 transitivePeerDependencies: - supports-color - typescript @@ -3296,6 +3329,11 @@ packages: engines: {node: '>=10'} dev: false + /yargs-parser/21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + dev: false + /yargs/16.2.0: resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} engines: {node: '>=10'} @@ -3309,6 +3347,19 @@ packages: 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 + dev: false + /yn/3.1.1: resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} engines: {node: '>=6'} From 131becb56d0346c8198ccefff1a8e5a9701cdce9 Mon Sep 17 00:00:00 2001 From: Pierre Lebigre Date: Tue, 18 Jul 2023 10:56:56 +0200 Subject: [PATCH 313/883] feat: add .nvmrc file --- services/product/.nvmrc | 1 + 1 file changed, 1 insertion(+) create mode 100644 services/product/.nvmrc diff --git a/services/product/.nvmrc b/services/product/.nvmrc new file mode 100644 index 00000000..12ea1eeb --- /dev/null +++ b/services/product/.nvmrc @@ -0,0 +1 @@ +v18.12.0 \ No newline at end of file From 662d383dcf8a132bebd05cc1331eb450de4de277 Mon Sep 17 00:00:00 2001 From: Pierre Lebigre Date: Tue, 18 Jul 2023 12:20:51 +0200 Subject: [PATCH 314/883] fix:update pnpm lock --- services/product/.nvmrc | 1 - services/product/pnpm-lock.yaml | 1472 +++++++++++++++++-------------- 2 files changed, 797 insertions(+), 676 deletions(-) delete mode 100644 services/product/.nvmrc diff --git a/services/product/.nvmrc b/services/product/.nvmrc deleted file mode 100644 index 12ea1eeb..00000000 --- a/services/product/.nvmrc +++ /dev/null @@ -1 +0,0 @@ -v18.12.0 \ No newline at end of file diff --git a/services/product/pnpm-lock.yaml b/services/product/pnpm-lock.yaml index e63d677d..7c69ab14 100644 --- a/services/product/pnpm-lock.yaml +++ b/services/product/pnpm-lock.yaml @@ -1,48 +1,67 @@ -lockfileVersion: 5.4 - -specifiers: - '@azure/storage-blob': ^12.14.0 - '@grpc/grpc-js': ^1.8.14 - '@grpc/proto-loader': ^0.7.6 - '@prisma/client': ^4.16.2 - '@types/amqplib': ^0.10.1 - '@types/node': ^18.16.7 - amqplib: ^0.10.3 - base64-arraybuffer: ^1.0.2 - esbuild: ^0.18.11 - express: ^4.18.2 - nodemon: ^1.14.9 - pkg: ^5.8.1 - prisma: ^4.16.2 - ts-node: ^10.9.1 - tsconfig-paths: ^4.2.0 - typescript: ^5.0.2 - vite-tsconfig-paths: ^4.2.0 +lockfileVersion: '6.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false dependencies: - '@azure/storage-blob': 12.15.0 - '@grpc/grpc-js': 1.8.18 - '@grpc/proto-loader': 0.7.8 - '@prisma/client': 4.16.2_prisma@4.16.2 - amqplib: 0.10.3 - base64-arraybuffer: 1.0.2 - express: 4.18.2 - nodemon: 1.19.4 - pkg: 5.8.1 - vite-tsconfig-paths: 4.2.0_typescript@5.1.6 + '@azure/storage-blob': + specifier: ^12.14.0 + version: 12.14.0 + '@grpc/grpc-js': + specifier: ^1.8.14 + version: 1.8.14 + '@grpc/proto-loader': + specifier: ^0.7.6 + version: 0.7.6 + '@prisma/client': + specifier: ^4.16.2 + version: 4.16.2(prisma@4.16.2) + amqplib: + specifier: ^0.10.3 + version: 0.10.3 + base64-arraybuffer: + specifier: ^1.0.2 + version: 1.0.2 + express: + specifier: ^4.18.2 + version: 4.18.2 + nodemon: + specifier: ^1.14.9 + version: 1.14.9 + pkg: + specifier: ^5.8.1 + version: 5.8.1 + vite-tsconfig-paths: + specifier: ^4.2.0 + version: 4.2.0(typescript@5.0.2) devDependencies: - '@types/amqplib': 0.10.1 - '@types/node': 18.16.19 - esbuild: 0.18.14 - prisma: 4.16.2 - ts-node: 10.9.1_pqdfkuhuhnwv2d7uogwywwxtqq - tsconfig-paths: 4.2.0 - typescript: 5.1.6 + '@types/amqplib': + specifier: ^0.10.1 + version: 0.10.1 + '@types/node': + specifier: ^18.16.7 + version: 18.16.7 + esbuild: + specifier: ^0.18.11 + version: 0.18.11 + prisma: + specifier: ^4.16.2 + version: 4.16.2 + ts-node: + specifier: ^10.9.1 + version: 10.9.1(@types/node@18.16.7)(typescript@5.0.2) + tsconfig-paths: + specifier: ^4.2.0 + version: 4.2.0 + typescript: + specifier: ^5.0.2 + version: 5.0.2 packages: - /@acuminous/bitsyntax/0.1.2: + /@acuminous/bitsyntax@0.1.2: resolution: {integrity: sha512-29lUK80d1muEQqiUsSo+3A0yP6CdspgC95EnKBMi22Xlwt79i/En4Vr67+cXhU+cZjbti3TgGGC5wy1stIywVQ==} engines: {node: '>=0.8'} dependencies: @@ -53,14 +72,14 @@ packages: - supports-color dev: false - /@azure/abort-controller/1.1.0: + /@azure/abort-controller@1.1.0: resolution: {integrity: sha512-TrRLIoSQVzfAJX9H1JeFjzAoDGcoK1IYX1UImfceTZpsyYfWr09Ss1aHW1y5TrrR3iq6RZLBwJ3E24uwPhwahw==} engines: {node: '>=12.0.0'} dependencies: tslib: 2.6.0 dev: false - /@azure/core-auth/1.4.0: + /@azure/core-auth@1.4.0: resolution: {integrity: sha512-HFrcTgmuSuukRf/EdPmqBrc5l6Q5Uu+2TbuhaKbgaCpP2TfAeiNaQPAadxO+CYBRHGUzIDteMAjFspFLDLnKVQ==} engines: {node: '>=12.0.0'} dependencies: @@ -68,7 +87,7 @@ packages: tslib: 2.6.0 dev: false - /@azure/core-http/3.0.2: + /@azure/core-http@3.0.2: resolution: {integrity: sha512-o1wR9JrmoM0xEAa0Ue7Sp8j+uJvmqYaGoHOCT5qaVYmvgmnZDC0OvQimPA/JR3u77Sz6D1y3Xmk1y69cDU9q9A==} engines: {node: '>=14.0.0'} dependencies: @@ -90,7 +109,7 @@ packages: - encoding dev: false - /@azure/core-lro/2.5.3: + /@azure/core-lro@2.5.3: resolution: {integrity: sha512-ubkOf2YCnVtq7KqEJQqAI8dDD5rH1M6OP5kW0KO/JQyTaxLA0N0pjFWvvaysCj9eHMNBcuuoZXhhl0ypjod2DA==} engines: {node: '>=14.0.0'} dependencies: @@ -100,14 +119,14 @@ packages: tslib: 2.6.0 dev: false - /@azure/core-paging/1.5.0: + /@azure/core-paging@1.5.0: resolution: {integrity: sha512-zqWdVIt+2Z+3wqxEOGzR5hXFZ8MGKK52x4vFLw8n58pR6ZfKRx3EXYTxTaYxYHc/PexPUTyimcTWFJbji9Z6Iw==} engines: {node: '>=14.0.0'} dependencies: tslib: 2.6.0 dev: false - /@azure/core-tracing/1.0.0-preview.13: + /@azure/core-tracing@1.0.0-preview.13: resolution: {integrity: sha512-KxDlhXyMlh2Jhj2ykX6vNEU0Vou4nHr025KoSEiz7cS3BNiHNaZcdECk/DmLkEB0as5T7b/TpRcehJ5yV6NeXQ==} engines: {node: '>=12.0.0'} dependencies: @@ -115,7 +134,7 @@ packages: tslib: 2.6.0 dev: false - /@azure/core-util/1.3.2: + /@azure/core-util@1.3.2: resolution: {integrity: sha512-2bECOUh88RvL1pMZTcc6OzfobBeWDBf5oBbhjIhT1MV9otMVWCzpOJkkiKtrnO88y5GGBelgY8At73KGAdbkeQ==} engines: {node: '>=14.0.0'} dependencies: @@ -123,15 +142,15 @@ packages: tslib: 2.6.0 dev: false - /@azure/logger/1.0.4: + /@azure/logger@1.0.4: resolution: {integrity: sha512-ustrPY8MryhloQj7OWGe+HrYx+aoiOxzbXTtgblbV3xwCqpzUK36phH3XNHQKj3EPonyFUuDTfR3qFhTEAuZEg==} engines: {node: '>=14.0.0'} dependencies: tslib: 2.6.0 dev: false - /@azure/storage-blob/12.15.0: - resolution: {integrity: sha512-e7JBKLOFi0QVJqqLzrjx1eL3je3/Ug2IQj24cTM9b85CsnnFjLGeGjJVIjbGGZaytewiCEG7r3lRwQX7fKj0/w==} + /@azure/storage-blob@12.14.0: + resolution: {integrity: sha512-g8GNUDpMisGXzBeD+sKphhH5yLwesB4JkHr1U6be/X3F+cAMcyGLPD1P89g2M7wbEtUJWoikry1rlr83nNRBzg==} engines: {node: '>=14.0.0'} dependencies: '@azure/abort-controller': 1.1.0 @@ -146,7 +165,7 @@ packages: - encoding dev: false - /@babel/generator/7.18.2: + /@babel/generator@7.18.2: resolution: {integrity: sha512-W1lG5vUwFvfMd8HVXqdfbuG7RuaSrTCCD8cl8fP8wOivdbtbIg2Db3IWUcgvfxKbbn6ZBGYRW/Zk1MIwK49mgw==} engines: {node: '>=6.9.0'} dependencies: @@ -155,17 +174,17 @@ packages: jsesc: 2.5.2 dev: false - /@babel/helper-string-parser/7.22.5: + /@babel/helper-string-parser@7.22.5: resolution: {integrity: sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==} engines: {node: '>=6.9.0'} dev: false - /@babel/helper-validator-identifier/7.22.5: + /@babel/helper-validator-identifier@7.22.5: resolution: {integrity: sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==} engines: {node: '>=6.9.0'} dev: false - /@babel/parser/7.18.4: + /@babel/parser@7.18.4: resolution: {integrity: sha512-FDge0dFazETFcxGw/EXzOkN8uJp0PC7Qbm+Pe9T+av2zlBpOgunFHkQPPn+eRuClU73JF+98D531UgayY89tow==} engines: {node: '>=6.0.0'} hasBin: true @@ -173,7 +192,7 @@ packages: '@babel/types': 7.19.0 dev: false - /@babel/types/7.19.0: + /@babel/types@7.19.0: resolution: {integrity: sha512-YuGopBq3ke25BVSiS6fgF49Ul9gH1x70Bcr6bqRLjWCkcX8Hre1/5+z+IiWOIerRMSSEfGZVB9z9kyq7wVs9YA==} engines: {node: '>=6.9.0'} dependencies: @@ -182,33 +201,33 @@ packages: to-fast-properties: 2.0.0 dev: false - /@cspotcode/source-map-support/0.8.1: + /@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 - /@esbuild/android-arm/0.18.14: - resolution: {integrity: sha512-blODaaL+lngG5bdK/t4qZcQvq2BBqrABmYwqPPcS5VRxrCSGHb9R/rA3fqxh7R18I7WU4KKv+NYkt22FDfalcg==} + /@esbuild/android-arm64@0.18.11: + resolution: {integrity: sha512-snieiq75Z1z5LJX9cduSAjUr7vEI1OdlzFPMw0HH5YI7qQHDd3qs+WZoMrWYDsfRJSq36lIA6mfZBkvL46KoIw==} engines: {node: '>=12'} - cpu: [arm] + cpu: [arm64] os: [android] requiresBuild: true dev: true optional: true - /@esbuild/android-arm64/0.18.14: - resolution: {integrity: sha512-rZ2v+Luba5/3D6l8kofWgTnqE+qsC/L5MleKIKFyllHTKHrNBMqeRCnZI1BtRx8B24xMYxeU32iIddRQqMsOsg==} + /@esbuild/android-arm@0.18.11: + resolution: {integrity: sha512-q4qlUf5ucwbUJZXF5tEQ8LF7y0Nk4P58hOsGk3ucY0oCwgQqAnqXVbUuahCddVHfrxmpyewRpiTHwVHIETYu7Q==} engines: {node: '>=12'} - cpu: [arm64] + cpu: [arm] os: [android] requiresBuild: true dev: true optional: true - /@esbuild/android-x64/0.18.14: - resolution: {integrity: sha512-qSwh8y38QKl+1Iqg+YhvCVYlSk3dVLk9N88VO71U4FUjtiSFylMWK3Ugr8GC6eTkkP4Tc83dVppt2n8vIdlSGg==} + /@esbuild/android-x64@0.18.11: + resolution: {integrity: sha512-iPuoxQEV34+hTF6FT7om+Qwziv1U519lEOvekXO9zaMMlT9+XneAhKL32DW3H7okrCOBQ44BMihE8dclbZtTuw==} engines: {node: '>=12'} cpu: [x64] os: [android] @@ -216,8 +235,8 @@ packages: dev: true optional: true - /@esbuild/darwin-arm64/0.18.14: - resolution: {integrity: sha512-9Hl2D2PBeDYZiNbnRKRWuxwHa9v5ssWBBjisXFkVcSP5cZqzZRFBUWEQuqBHO4+PKx4q4wgHoWtfQ1S7rUqJ2Q==} + /@esbuild/darwin-arm64@0.18.11: + resolution: {integrity: sha512-Gm0QkI3k402OpfMKyQEEMG0RuW2LQsSmI6OeO4El2ojJMoF5NLYb3qMIjvbG/lbMeLOGiW6ooU8xqc+S0fgz2w==} engines: {node: '>=12'} cpu: [arm64] os: [darwin] @@ -225,8 +244,8 @@ packages: dev: true optional: true - /@esbuild/darwin-x64/0.18.14: - resolution: {integrity: sha512-ZnI3Dg4ElQ6tlv82qLc/UNHtFsgZSKZ7KjsUNAo1BF1SoYDjkGKHJyCrYyWjFecmXpvvG/KJ9A/oe0H12odPLQ==} + /@esbuild/darwin-x64@0.18.11: + resolution: {integrity: sha512-N15Vzy0YNHu6cfyDOjiyfJlRJCB/ngKOAvoBf1qybG3eOq0SL2Lutzz9N7DYUbb7Q23XtHPn6lMDF6uWbGv9Fw==} engines: {node: '>=12'} cpu: [x64] os: [darwin] @@ -234,8 +253,8 @@ packages: dev: true optional: true - /@esbuild/freebsd-arm64/0.18.14: - resolution: {integrity: sha512-h3OqR80Da4oQCIa37zl8tU5MwHQ7qgPV0oVScPfKJK21fSRZEhLE4IIVpmcOxfAVmqjU6NDxcxhYaM8aDIGRLw==} + /@esbuild/freebsd-arm64@0.18.11: + resolution: {integrity: sha512-atEyuq6a3omEY5qAh5jIORWk8MzFnCpSTUruBgeyN9jZq1K/QI9uke0ATi3MHu4L8c59CnIi4+1jDKMuqmR71A==} engines: {node: '>=12'} cpu: [arm64] os: [freebsd] @@ -243,8 +262,8 @@ packages: dev: true optional: true - /@esbuild/freebsd-x64/0.18.14: - resolution: {integrity: sha512-ha4BX+S6CZG4BoH9tOZTrFIYC1DH13UTCRHzFc3GWX74nz3h/N6MPF3tuR3XlsNjMFUazGgm35MPW5tHkn2lzQ==} + /@esbuild/freebsd-x64@0.18.11: + resolution: {integrity: sha512-XtuPrEfBj/YYYnAAB7KcorzzpGTvOr/dTtXPGesRfmflqhA4LMF0Gh/n5+a9JBzPuJ+CGk17CA++Hmr1F/gI0Q==} engines: {node: '>=12'} cpu: [x64] os: [freebsd] @@ -252,26 +271,26 @@ packages: dev: true optional: true - /@esbuild/linux-arm/0.18.14: - resolution: {integrity: sha512-5+7vehI1iqru5WRtJyU2XvTOvTGURw3OZxe3YTdE9muNNIdmKAVmSHpB3Vw2LazJk2ifEdIMt/wTWnVe5V98Kg==} + /@esbuild/linux-arm64@0.18.11: + resolution: {integrity: sha512-c6Vh2WS9VFKxKZ2TvJdA7gdy0n6eSy+yunBvv4aqNCEhSWVor1TU43wNRp2YLO9Vng2G+W94aRz+ILDSwAiYog==} engines: {node: '>=12'} - cpu: [arm] + cpu: [arm64] os: [linux] requiresBuild: true dev: true optional: true - /@esbuild/linux-arm64/0.18.14: - resolution: {integrity: sha512-IXORRe22In7U65NZCzjwAUc03nn8SDIzWCnfzJ6t/8AvGx5zBkcLfknI+0P+hhuftufJBmIXxdSTbzWc8X/V4w==} + /@esbuild/linux-arm@0.18.11: + resolution: {integrity: sha512-Idipz+Taso/toi2ETugShXjQ3S59b6m62KmLHkJlSq/cBejixmIydqrtM2XTvNCywFl3VC7SreSf6NV0i6sRyg==} engines: {node: '>=12'} - cpu: [arm64] + cpu: [arm] os: [linux] requiresBuild: true dev: true optional: true - /@esbuild/linux-ia32/0.18.14: - resolution: {integrity: sha512-BfHlMa0nibwpjG+VXbOoqJDmFde4UK2gnW351SQ2Zd4t1N3zNdmUEqRkw/srC1Sa1DRBE88Dbwg4JgWCbNz/FQ==} + /@esbuild/linux-ia32@0.18.11: + resolution: {integrity: sha512-S3hkIF6KUqRh9n1Q0dSyYcWmcVa9Cg+mSoZEfFuzoYXXsk6196qndrM+ZiHNwpZKi3XOXpShZZ+9dfN5ykqjjw==} engines: {node: '>=12'} cpu: [ia32] os: [linux] @@ -279,8 +298,8 @@ packages: dev: true optional: true - /@esbuild/linux-loong64/0.18.14: - resolution: {integrity: sha512-j2/Ex++DRUWIAaUDprXd3JevzGtZ4/d7VKz+AYDoHZ3HjJzCyYBub9CU1wwIXN+viOP0b4VR3RhGClsvyt/xSw==} + /@esbuild/linux-loong64@0.18.11: + resolution: {integrity: sha512-MRESANOoObQINBA+RMZW+Z0TJWpibtE7cPFnahzyQHDCA9X9LOmGh68MVimZlM9J8n5Ia8lU773te6O3ILW8kw==} engines: {node: '>=12'} cpu: [loong64] os: [linux] @@ -288,8 +307,8 @@ packages: dev: true optional: true - /@esbuild/linux-mips64el/0.18.14: - resolution: {integrity: sha512-qn2+nc+ZCrJmiicoAnJXJJkZWt8Nwswgu1crY7N+PBR8ChBHh89XRxj38UU6Dkthl2yCVO9jWuafZ24muzDC/A==} + /@esbuild/linux-mips64el@0.18.11: + resolution: {integrity: sha512-qVyPIZrXNMOLYegtD1u8EBccCrBVshxMrn5MkuFc3mEVsw7CCQHaqZ4jm9hbn4gWY95XFnb7i4SsT3eflxZsUg==} engines: {node: '>=12'} cpu: [mips64el] os: [linux] @@ -297,8 +316,8 @@ packages: dev: true optional: true - /@esbuild/linux-ppc64/0.18.14: - resolution: {integrity: sha512-aGzXzd+djqeEC5IRkDKt3kWzvXoXC6K6GyYKxd+wsFJ2VQYnOWE954qV2tvy5/aaNrmgPTb52cSCHFE+Z7Z0yg==} + /@esbuild/linux-ppc64@0.18.11: + resolution: {integrity: sha512-T3yd8vJXfPirZaUOoA9D2ZjxZX4Gr3QuC3GztBJA6PklLotc/7sXTOuuRkhE9W/5JvJP/K9b99ayPNAD+R+4qQ==} engines: {node: '>=12'} cpu: [ppc64] os: [linux] @@ -306,8 +325,8 @@ packages: dev: true optional: true - /@esbuild/linux-riscv64/0.18.14: - resolution: {integrity: sha512-8C6vWbfr0ygbAiMFLS6OPz0BHvApkT2gCboOGV76YrYw+sD/MQJzyITNsjZWDXJwPu9tjrFQOVG7zijRzBCnLw==} + /@esbuild/linux-riscv64@0.18.11: + resolution: {integrity: sha512-evUoRPWiwuFk++snjH9e2cAjF5VVSTj+Dnf+rkO/Q20tRqv+644279TZlPK8nUGunjPAtQRCj1jQkDAvL6rm2w==} engines: {node: '>=12'} cpu: [riscv64] os: [linux] @@ -315,8 +334,8 @@ packages: dev: true optional: true - /@esbuild/linux-s390x/0.18.14: - resolution: {integrity: sha512-G/Lf9iu8sRMM60OVGOh94ZW2nIStksEcITkXdkD09/T6QFD/o+g0+9WVyR/jajIb3A0LvBJ670tBnGe1GgXMgw==} + /@esbuild/linux-s390x@0.18.11: + resolution: {integrity: sha512-/SlRJ15XR6i93gRWquRxYCfhTeC5PdqEapKoLbX63PLCmAkXZHY2uQm2l9bN0oPHBsOw2IswRZctMYS0MijFcg==} engines: {node: '>=12'} cpu: [s390x] os: [linux] @@ -324,8 +343,8 @@ packages: dev: true optional: true - /@esbuild/linux-x64/0.18.14: - resolution: {integrity: sha512-TBgStYBQaa3EGhgqIDM+ECnkreb0wkcKqL7H6m+XPcGUoU4dO7dqewfbm0mWEQYH3kzFHrzjOFNpSAVzDZRSJw==} + /@esbuild/linux-x64@0.18.11: + resolution: {integrity: sha512-xcncej+wF16WEmIwPtCHi0qmx1FweBqgsRtEL1mSHLFR6/mb3GEZfLQnx+pUDfRDEM4DQF8dpXIW7eDOZl1IbA==} engines: {node: '>=12'} cpu: [x64] os: [linux] @@ -333,8 +352,8 @@ packages: dev: true optional: true - /@esbuild/netbsd-x64/0.18.14: - resolution: {integrity: sha512-stvCcjyCQR2lMTroqNhAbvROqRjxPEq0oQ380YdXxA81TaRJEucH/PzJ/qsEtsHgXlWFW6Ryr/X15vxQiyRXVg==} + /@esbuild/netbsd-x64@0.18.11: + resolution: {integrity: sha512-aSjMHj/F7BuS1CptSXNg6S3M4F3bLp5wfFPIJM+Km2NfIVfFKhdmfHF9frhiCLIGVzDziggqWll0B+9AUbud/Q==} engines: {node: '>=12'} cpu: [x64] os: [netbsd] @@ -342,8 +361,8 @@ packages: dev: true optional: true - /@esbuild/openbsd-x64/0.18.14: - resolution: {integrity: sha512-apAOJF14CIsN5ht1PA57PboEMsNV70j3FUdxLmA2liZ20gEQnfTG5QU0FhENo5nwbTqCB2O3WDsXAihfODjHYw==} + /@esbuild/openbsd-x64@0.18.11: + resolution: {integrity: sha512-tNBq+6XIBZtht0xJGv7IBB5XaSyvYPCm1PxJ33zLQONdZoLVM0bgGqUrXnJyiEguD9LU4AHiu+GCXy/Hm9LsdQ==} engines: {node: '>=12'} cpu: [x64] os: [openbsd] @@ -351,8 +370,8 @@ packages: dev: true optional: true - /@esbuild/sunos-x64/0.18.14: - resolution: {integrity: sha512-fYRaaS8mDgZcGybPn2MQbn1ZNZx+UXFSUoS5Hd2oEnlsyUcr/l3c6RnXf1bLDRKKdLRSabTmyCy7VLQ7VhGdOQ==} + /@esbuild/sunos-x64@0.18.11: + resolution: {integrity: sha512-kxfbDOrH4dHuAAOhr7D7EqaYf+W45LsAOOhAet99EyuxxQmjbk8M9N4ezHcEiCYPaiW8Dj3K26Z2V17Gt6p3ng==} engines: {node: '>=12'} cpu: [x64] os: [sunos] @@ -360,8 +379,8 @@ packages: dev: true optional: true - /@esbuild/win32-arm64/0.18.14: - resolution: {integrity: sha512-1c44RcxKEJPrVj62XdmYhxXaU/V7auELCmnD+Ri+UCt+AGxTvzxl9uauQhrFso8gj6ZV1DaORV0sT9XSHOAk8Q==} + /@esbuild/win32-arm64@0.18.11: + resolution: {integrity: sha512-Sh0dDRyk1Xi348idbal7lZyfSkjhJsdFeuC13zqdipsvMetlGiFQNdO+Yfp6f6B4FbyQm7qsk16yaZk25LChzg==} engines: {node: '>=12'} cpu: [arm64] os: [win32] @@ -369,8 +388,8 @@ packages: dev: true optional: true - /@esbuild/win32-ia32/0.18.14: - resolution: {integrity: sha512-EXAFttrdAxZkFQmpvcAQ2bywlWUsONp/9c2lcfvPUhu8vXBBenCXpoq9YkUvVP639ld3YGiYx0YUQ6/VQz3Maw==} + /@esbuild/win32-ia32@0.18.11: + resolution: {integrity: sha512-o9JUIKF1j0rqJTFbIoF4bXj6rvrTZYOrfRcGyL0Vm5uJ/j5CkBD/51tpdxe9lXEDouhRgdr/BYzUrDOvrWwJpg==} engines: {node: '>=12'} cpu: [ia32] os: [win32] @@ -378,8 +397,8 @@ packages: dev: true optional: true - /@esbuild/win32-x64/0.18.14: - resolution: {integrity: sha512-K0QjGbcskx+gY+qp3v4/940qg8JitpXbdxFhRDA1aYoNaPff88+aEwoq45aqJ+ogpxQxmU0ZTjgnrQD/w8iiUg==} + /@esbuild/win32-x64@0.18.11: + resolution: {integrity: sha512-rQI4cjLHd2hGsM1LqgDI7oOCYbQ6IBOVsX9ejuRMSze0GqXUG2ekwiKkiBU1pRGSeCqFFHxTrcEydB2Hyoz9CA==} engines: {node: '>=12'} cpu: [x64] os: [win32] @@ -387,16 +406,16 @@ packages: dev: true optional: true - /@grpc/grpc-js/1.8.18: - resolution: {integrity: sha512-2uWPtxhsXmVgd8WzDhfamSjHpZDXfMjMDciY6VRTq4Sn7rFzazyf0LLDa0oav+61UHIoEZb4KKaAV6S7NuJFbQ==} + /@grpc/grpc-js@1.8.14: + resolution: {integrity: sha512-w84maJ6CKl5aApCMzFll0hxtFNT6or9WwMslobKaqWUEf1K+zhlL43bSQhFreyYWIWR+Z0xnVFC1KtLm4ZpM/A==} engines: {node: ^8.13.0 || >=10.10.0} dependencies: - '@grpc/proto-loader': 0.7.8 - '@types/node': 18.16.19 + '@grpc/proto-loader': 0.7.6 + '@types/node': 18.16.7 dev: false - /@grpc/proto-loader/0.7.8: - resolution: {integrity: sha512-GU12e2c8dmdXb7XUlOgYWZ2o2i+z9/VeACkxTA/zzAe2IjclC5PnVL0lpgjhrqfpDYHzM8B1TF6pqWegMYAzlA==} + /@grpc/proto-loader@0.7.6: + resolution: {integrity: sha512-QyAXR8Hyh7uMDmveWxDSUcJr9NAWaZ2I6IXgAYvQmfflwouTM+rArE2eEaCtLlRqO81j7pRLCt81IefUei6Zbw==} engines: {node: '>=6'} hasBin: true dependencies: @@ -404,10 +423,10 @@ packages: lodash.camelcase: 4.3.0 long: 4.0.0 protobufjs: 7.2.4 - yargs: 17.7.2 + yargs: 16.2.0 dev: false - /@jridgewell/gen-mapping/0.3.3: + /@jridgewell/gen-mapping@0.3.3: resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==} engines: {node: '>=6.0.0'} dependencies: @@ -416,43 +435,43 @@ packages: '@jridgewell/trace-mapping': 0.3.18 dev: false - /@jridgewell/resolve-uri/3.1.0: + /@jridgewell/resolve-uri@3.1.0: resolution: {integrity: sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==} engines: {node: '>=6.0.0'} dev: false - /@jridgewell/resolve-uri/3.1.1: + /@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: + /@jridgewell/set-array@1.1.2: resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} engines: {node: '>=6.0.0'} dev: false - /@jridgewell/sourcemap-codec/1.4.14: + /@jridgewell/sourcemap-codec@1.4.14: resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==} dev: false - /@jridgewell/sourcemap-codec/1.4.15: + /@jridgewell/sourcemap-codec@1.4.15: resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} - /@jridgewell/trace-mapping/0.3.18: + /@jridgewell/trace-mapping@0.3.18: resolution: {integrity: sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==} dependencies: '@jridgewell/resolve-uri': 3.1.0 '@jridgewell/sourcemap-codec': 1.4.14 dev: false - /@jridgewell/trace-mapping/0.3.9: + /@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 - /@nodelib/fs.scandir/2.1.5: + /@nodelib/fs.scandir@2.1.5: resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} dependencies: @@ -460,12 +479,12 @@ packages: run-parallel: 1.2.0 dev: false - /@nodelib/fs.stat/2.0.5: + /@nodelib/fs.stat@2.0.5: resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} engines: {node: '>= 8'} dev: false - /@nodelib/fs.walk/1.2.8: + /@nodelib/fs.walk@1.2.8: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} dependencies: @@ -473,12 +492,12 @@ packages: fastq: 1.15.0 dev: false - /@opentelemetry/api/1.4.1: + /@opentelemetry/api@1.4.1: resolution: {integrity: sha512-O2yRJce1GOc6PAy3QxFM4NzFiWzvScDC1/5ihYBL6BUEVdq0XMWN01sppE+H6bBXbaFYipjwFLEWLg5PaSOThA==} engines: {node: '>=8.0.0'} dev: false - /@prisma/client/4.16.2_prisma@4.16.2: + /@prisma/client@4.16.2(prisma@4.16.2): resolution: {integrity: sha512-qCoEyxv1ZrQ4bKy39GnylE8Zq31IRmm8bNhNbZx7bF2cU5aiCCnSa93J2imF88MBjn7J9eUQneNxUQVJdl/rPQ==} engines: {node: '>=14.17'} requiresBuild: true @@ -492,116 +511,116 @@ packages: prisma: 4.16.2 dev: false - /@prisma/engines-version/4.16.1-1.4bc8b6e1b66cb932731fb1bdbbc550d1e010de81: + /@prisma/engines-version@4.16.1-1.4bc8b6e1b66cb932731fb1bdbbc550d1e010de81: resolution: {integrity: sha512-q617EUWfRIDTriWADZ4YiWRZXCa/WuhNgLTVd+HqWLffjMSPzyM5uOWoauX91wvQClSKZU4pzI4JJLQ9Kl62Qg==} dev: false - /@prisma/engines/4.16.2: + /@prisma/engines@4.16.2: resolution: {integrity: sha512-vx1nxVvN4QeT/cepQce68deh/Turxy5Mr+4L4zClFuK1GlxN3+ivxfuv+ej/gvidWn1cE1uAhW7ALLNlYbRUAw==} requiresBuild: true - /@protobufjs/aspromise/1.1.2: + /@protobufjs/aspromise@1.1.2: resolution: {integrity: sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==} dev: false - /@protobufjs/base64/1.1.2: + /@protobufjs/base64@1.1.2: resolution: {integrity: sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==} dev: false - /@protobufjs/codegen/2.0.4: + /@protobufjs/codegen@2.0.4: resolution: {integrity: sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==} dev: false - /@protobufjs/eventemitter/1.1.0: + /@protobufjs/eventemitter@1.1.0: resolution: {integrity: sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==} dev: false - /@protobufjs/fetch/1.1.0: + /@protobufjs/fetch@1.1.0: resolution: {integrity: sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==} dependencies: '@protobufjs/aspromise': 1.1.2 '@protobufjs/inquire': 1.1.0 dev: false - /@protobufjs/float/1.0.2: + /@protobufjs/float@1.0.2: resolution: {integrity: sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==} dev: false - /@protobufjs/inquire/1.1.0: + /@protobufjs/inquire@1.1.0: resolution: {integrity: sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==} dev: false - /@protobufjs/path/1.1.2: + /@protobufjs/path@1.1.2: resolution: {integrity: sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==} dev: false - /@protobufjs/pool/1.1.0: + /@protobufjs/pool@1.1.0: resolution: {integrity: sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==} dev: false - /@protobufjs/utf8/1.1.0: + /@protobufjs/utf8@1.1.0: resolution: {integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==} dev: false - /@tsconfig/node10/1.0.9: + /@tsconfig/node10@1.0.9: resolution: {integrity: sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==} dev: true - /@tsconfig/node12/1.0.11: + /@tsconfig/node12@1.0.11: resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} dev: true - /@tsconfig/node14/1.0.3: + /@tsconfig/node14@1.0.3: resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} dev: true - /@tsconfig/node16/1.0.4: + /@tsconfig/node16@1.0.4: resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} dev: true - /@types/amqplib/0.10.1: + /@types/amqplib@0.10.1: resolution: {integrity: sha512-j6ANKT79ncUDnAs/+9r9eDujxbeJoTjoVu33gHHcaPfmLQaMhvfbH2GqSe8KUM444epAp1Vl3peVOQfZk3UIqA==} dependencies: - '@types/node': 18.16.19 + '@types/node': 18.16.7 dev: true - /@types/keyv/3.1.4: + /@types/keyv@3.1.4: resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} dependencies: - '@types/node': 18.16.19 + '@types/node': 18.16.7 dev: false - /@types/long/4.0.2: + /@types/long@4.0.2: resolution: {integrity: sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==} dev: false - /@types/node-fetch/2.6.4: + /@types/node-fetch@2.6.4: resolution: {integrity: sha512-1ZX9fcN4Rvkvgv4E6PAY5WXUFWFcRWxZa3EW83UjycOB9ljJCedb2CupIP4RZMEwF/M3eTcCihbBRgwtGbg5Rg==} dependencies: - '@types/node': 18.16.19 + '@types/node': 18.16.7 form-data: 3.0.1 dev: false - /@types/node/18.16.19: - resolution: {integrity: sha512-IXl7o+R9iti9eBW4Wg2hx1xQDig183jj7YLn8F7udNceyfkbn1ZxmzZXuak20gR40D7pIkIY1kYGx5VIGbaHKA==} + /@types/node@18.16.7: + resolution: {integrity: sha512-MFg7ua/bRtnA1hYE3pVyWxGd/r7aMqjNOdHvlSsXV3n8iaeGKkOaPzpJh6/ovf4bEXWcojkeMJpTsq3mzXW4IQ==} - /@types/responselike/1.0.0: + /@types/responselike@1.0.0: resolution: {integrity: sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==} dependencies: - '@types/node': 18.16.19 + '@types/node': 18.16.7 dev: false - /@types/tunnel/0.0.3: + /@types/tunnel@0.0.3: resolution: {integrity: sha512-sOUTGn6h1SfQ+gbgqC364jLFBw2lnFqkgF3q0WovEHRLMrVD1sd5aufqi/aJObLekJO+Aq5z646U4Oxy6shXMA==} dependencies: - '@types/node': 18.16.19 + '@types/node': 18.16.7 dev: false - /abbrev/1.1.1: + /abbrev@1.1.1: resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} dev: false - /accepts/1.3.8: + /accepts@1.3.8: resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} engines: {node: '>= 0.6'} dependencies: @@ -609,18 +628,18 @@ packages: negotiator: 0.6.3 dev: false - /acorn-walk/8.2.0: + /acorn-walk@8.2.0: resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} engines: {node: '>=0.4.0'} dev: true - /acorn/8.10.0: + /acorn@8.10.0: resolution: {integrity: sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==} engines: {node: '>=0.4.0'} hasBin: true dev: true - /agent-base/6.0.2: + /agent-base@6.0.2: resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} engines: {node: '>= 6.0.0'} dependencies: @@ -629,7 +648,7 @@ packages: - supports-color dev: false - /amqplib/0.10.3: + /amqplib@0.10.3: resolution: {integrity: sha512-UHmuSa7n8vVW/a5HGh2nFPqAEr8+cD4dEZ6u9GjP91nHfr1a54RyAKyra7Sb5NH7NBKOUlyQSMXIp0qAixKexw==} engines: {node: '>=10'} dependencies: @@ -641,107 +660,126 @@ packages: - supports-color dev: false - /ansi-align/2.0.0: + /ansi-align@2.0.0: resolution: {integrity: sha512-TdlOggdA/zURfMYa7ABC66j+oqfMew58KpJMbUlH3bcZP1b+cBHIHDDn5uH9INsxrHBPjsqM0tDB4jPTF/vgJA==} dependencies: string-width: 2.1.1 dev: false - /ansi-regex/3.0.1: + /ansi-regex@3.0.1: resolution: {integrity: sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==} engines: {node: '>=4'} dev: false - /ansi-regex/5.0.1: + /ansi-regex@5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} dev: false - /ansi-styles/3.2.1: + /ansi-styles@3.2.1: resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} engines: {node: '>=4'} dependencies: color-convert: 1.9.3 dev: false - /ansi-styles/4.3.0: + /ansi-styles@4.3.0: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} engines: {node: '>=8'} dependencies: color-convert: 2.0.1 dev: false - /anymatch/2.0.0_supports-color@5.5.0: - resolution: {integrity: sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==} + /anymatch@1.3.2: + resolution: {integrity: sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==} dependencies: - micromatch: 3.1.10_supports-color@5.5.0 + micromatch: 2.3.11 normalize-path: 2.1.1 - transitivePeerDependencies: - - supports-color dev: false - /arg/4.1.3: + /arg@4.1.3: resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} dev: true - /arr-diff/4.0.0: + /arr-diff@2.0.0: + resolution: {integrity: sha512-dtXTVMkh6VkEEA7OhXnN1Ecb8aAGFdZ1LFxtOCoqj4qkyOJMt7+qs6Ahdy6p/NQCPYsRSXXivhSB/J5E9jmYKA==} + engines: {node: '>=0.10.0'} + dependencies: + arr-flatten: 1.1.0 + dev: false + + /arr-diff@4.0.0: resolution: {integrity: sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==} engines: {node: '>=0.10.0'} dev: false - /arr-flatten/1.1.0: + /arr-flatten@1.1.0: resolution: {integrity: sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==} engines: {node: '>=0.10.0'} dev: false - /arr-union/3.1.0: + /arr-union@3.1.0: resolution: {integrity: sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==} engines: {node: '>=0.10.0'} dev: false - /array-flatten/1.1.1: + /array-flatten@1.1.1: resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} dev: false - /array-union/2.1.0: + /array-union@2.1.0: resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} engines: {node: '>=8'} dev: false - /array-unique/0.3.2: + /array-unique@0.2.1: + resolution: {integrity: sha512-G2n5bG5fSUCpnsXz4+8FUkYsGPkNfLn9YvS66U5qbTIXI2Ynnlo4Bi42bWv+omKUCqz+ejzfClwne0alJWJPhg==} + engines: {node: '>=0.10.0'} + dev: false + + /array-unique@0.3.2: resolution: {integrity: sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==} engines: {node: '>=0.10.0'} dev: false - /assign-symbols/1.0.0: + /assign-symbols@1.0.0: resolution: {integrity: sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==} engines: {node: '>=0.10.0'} dev: false - /async-each/1.0.6: + /async-each@1.0.6: resolution: {integrity: sha512-c646jH1avxr+aVpndVMeAfYw7wAa6idufrlN3LPA4PmKS0QEGp6PIC9nwz0WQkkvBGAMEki3pFdtxaF39J9vvg==} dev: false - /asynckit/0.4.0: + /asynckit@0.4.0: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} dev: false - /at-least-node/1.0.0: + /at-least-node@1.0.0: resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} engines: {node: '>= 4.0.0'} dev: false - /atob/2.1.2: + /atob@2.1.2: resolution: {integrity: sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==} engines: {node: '>= 4.5.0'} hasBin: true dev: false - /balanced-match/1.0.2: + /balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} dev: false - /base/0.11.2: + /base64-arraybuffer@1.0.2: + resolution: {integrity: sha512-I3yl4r9QB5ZRY3XuJVEPfc2XhZO6YweFPI+UovAzn+8/hb3oJ6lnysaFcjVpkCPfVWFUDvoZ8kmVDP7WyRtYtQ==} + engines: {node: '>= 0.6.0'} + dev: false + + /base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + dev: false + + /base@0.11.2: resolution: {integrity: sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==} engines: {node: '>=0.10.0'} dependencies: @@ -754,21 +792,12 @@ packages: pascalcase: 0.1.1 dev: false - /base64-arraybuffer/1.0.2: - resolution: {integrity: sha512-I3yl4r9QB5ZRY3XuJVEPfc2XhZO6YweFPI+UovAzn+8/hb3oJ6lnysaFcjVpkCPfVWFUDvoZ8kmVDP7WyRtYtQ==} - engines: {node: '>= 0.6.0'} - dev: false - - /base64-js/1.5.1: - resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - dev: false - - /binary-extensions/1.13.1: + /binary-extensions@1.13.1: resolution: {integrity: sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==} engines: {node: '>=0.10.0'} dev: false - /bindings/1.5.0: + /bindings@1.5.0: resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} requiresBuild: true dependencies: @@ -776,7 +805,7 @@ packages: dev: false optional: true - /bl/4.1.0: + /bl@4.1.0: resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} dependencies: buffer: 5.7.1 @@ -784,7 +813,7 @@ packages: readable-stream: 3.6.2 dev: false - /body-parser/1.20.1: + /body-parser@1.20.1: resolution: {integrity: sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} dependencies: @@ -804,7 +833,7 @@ packages: - supports-color dev: false - /boxen/1.3.0: + /boxen@1.3.0: resolution: {integrity: sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw==} engines: {node: '>=4'} dependencies: @@ -817,14 +846,23 @@ packages: widest-line: 2.0.1 dev: false - /brace-expansion/1.1.11: + /brace-expansion@1.1.11: resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} dependencies: balanced-match: 1.0.2 concat-map: 0.0.1 dev: false - /braces/2.3.2_supports-color@5.5.0: + /braces@1.8.5: + resolution: {integrity: sha512-xU7bpz2ytJl1bH9cgIurjpg/n8Gohy9GTw81heDYLJQ4RU60dlyJsa+atVF2pI0yMMvKxI9HkKwjePCj5XI1hw==} + engines: {node: '>=0.10.0'} + dependencies: + expand-range: 1.8.2 + preserve: 0.2.0 + repeat-element: 1.1.4 + dev: false + + /braces@2.3.2: resolution: {integrity: sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==} engines: {node: '>=0.10.0'} dependencies: @@ -834,7 +872,7 @@ packages: fill-range: 4.0.0 isobject: 3.0.1 repeat-element: 1.1.4 - snapdragon: 0.8.2_supports-color@5.5.0 + snapdragon: 0.8.2 snapdragon-node: 2.1.1 split-string: 3.1.0 to-regex: 3.0.2 @@ -842,30 +880,30 @@ packages: - supports-color dev: false - /braces/3.0.2: + /braces@3.0.2: resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} engines: {node: '>=8'} dependencies: fill-range: 7.0.1 dev: false - /buffer-more-ints/1.0.0: + /buffer-more-ints@1.0.0: resolution: {integrity: sha512-EMetuGFz5SLsT0QTnXzINh4Ksr+oo4i+UGTXEshiGCQWnsgSs7ZhJ8fzlwQ+OzEMs0MpDAMr1hxnblp5a4vcHg==} dev: false - /buffer/5.7.1: + /buffer@5.7.1: resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} dependencies: base64-js: 1.5.1 ieee754: 1.2.1 dev: false - /bytes/3.1.2: + /bytes@3.1.2: resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} engines: {node: '>= 0.8'} dev: false - /cache-base/1.0.1: + /cache-base@1.0.1: resolution: {integrity: sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==} engines: {node: '>=0.10.0'} dependencies: @@ -880,24 +918,24 @@ packages: unset-value: 1.0.0 dev: false - /call-bind/1.0.2: + /call-bind@1.0.2: resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==} dependencies: function-bind: 1.1.1 get-intrinsic: 1.2.1 dev: false - /camelcase/4.1.0: + /camelcase@4.1.0: resolution: {integrity: sha512-FxAv7HpHrXbh3aPo4o2qxHay2lkLY3x5Mw3KeE4KQE8ysVfziWeRZDwcjauvwBSGEC/nXUPzZy8zeh4HokqOnw==} engines: {node: '>=4'} dev: false - /capture-stack-trace/1.0.2: + /capture-stack-trace@1.0.2: resolution: {integrity: sha512-X/WM2UQs6VMHUtjUDnZTRI+i1crWteJySFzr9UpGoQa4WQffXVTTXuekjl7TjZRlcF2XfjgITT0HxZ9RnxeT0w==} engines: {node: '>=0.10.0'} dev: false - /chalk/2.4.2: + /chalk@2.4.2: resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} engines: {node: '>=4'} dependencies: @@ -906,7 +944,7 @@ packages: supports-color: 5.5.0 dev: false - /chalk/4.1.2: + /chalk@4.1.2: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} dependencies: @@ -914,36 +952,33 @@ packages: supports-color: 7.2.0 dev: false - /chokidar/2.1.8_supports-color@5.5.0: - resolution: {integrity: sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==} - deprecated: Chokidar 2 does not receive security updates since 2019. Upgrade to chokidar 3 with 15x fewer dependencies + /chokidar@1.7.0: + resolution: {integrity: sha512-mk8fAWcRUOxY7btlLtitj3A45jOwSAxH4tOFOoEGbVsl6cL6pPMWUy7dwZ/canfj3QEdP6FHSnf/l1c6/WkzVg==} + deprecated: Chokidar 2 will break on node v14+. Upgrade to chokidar 3 with 15x less dependencies. dependencies: - anymatch: 2.0.0_supports-color@5.5.0 + anymatch: 1.3.2 async-each: 1.0.6 - braces: 2.3.2_supports-color@5.5.0 - glob-parent: 3.1.0 + glob-parent: 2.0.0 inherits: 2.0.4 is-binary-path: 1.0.1 - is-glob: 4.0.3 - normalize-path: 3.0.0 + is-glob: 2.0.1 path-is-absolute: 1.0.1 - readdirp: 2.2.1_supports-color@5.5.0 - upath: 1.2.0 + readdirp: 2.2.1 optionalDependencies: fsevents: 1.2.13 transitivePeerDependencies: - supports-color dev: false - /chownr/1.1.4: + /chownr@1.1.4: resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} dev: false - /ci-info/1.6.0: + /ci-info@1.6.0: resolution: {integrity: sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==} dev: false - /class-utils/0.3.6: + /class-utils@0.3.6: resolution: {integrity: sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==} engines: {node: '>=0.10.0'} dependencies: @@ -953,12 +988,12 @@ packages: static-extend: 0.1.2 dev: false - /cli-boxes/1.0.0: + /cli-boxes@1.0.0: resolution: {integrity: sha512-3Fo5wu8Ytle8q9iCzS4D2MWVL2X7JVWRiS1BnXbTFDhS9c/REkM9vd1AmabsoZoY5/dGi5TT9iKL8Kb6DeBRQg==} engines: {node: '>=0.10.0'} dev: false - /cliui/7.0.4: + /cliui@7.0.4: resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} dependencies: string-width: 4.2.3 @@ -966,16 +1001,7 @@ packages: 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 - dev: false - - /collection-visit/1.0.0: + /collection-visit@1.0.0: resolution: {integrity: sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw==} engines: {node: '>=0.10.0'} dependencies: @@ -983,43 +1009,43 @@ packages: object-visit: 1.0.1 dev: false - /color-convert/1.9.3: + /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: + /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.3: + /color-name@1.1.3: resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} dev: false - /color-name/1.1.4: + /color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} dev: false - /combined-stream/1.0.8: + /combined-stream@1.0.8: resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} engines: {node: '>= 0.8'} dependencies: delayed-stream: 1.0.0 dev: false - /component-emitter/1.3.0: + /component-emitter@1.3.0: resolution: {integrity: sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==} dev: false - /concat-map/0.0.1: + /concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} dev: false - /configstore/3.1.5: + /configstore@3.1.5: resolution: {integrity: sha512-nlOhI4+fdzoK5xmJ+NY+1gZK56bwEaWZr8fYuXohZ9Vkc1o3a4T/R3M+yE/w7x/ZVJ1zF8c+oaOvF0dztdUgmA==} engines: {node: '>=4'} dependencies: @@ -1031,48 +1057,48 @@ packages: xdg-basedir: 3.0.0 dev: false - /content-disposition/0.5.4: + /content-disposition@0.5.4: resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} engines: {node: '>= 0.6'} dependencies: safe-buffer: 5.2.1 dev: false - /content-type/1.0.5: + /content-type@1.0.5: resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} engines: {node: '>= 0.6'} dev: false - /cookie-signature/1.0.6: + /cookie-signature@1.0.6: resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} dev: false - /cookie/0.5.0: + /cookie@0.5.0: resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==} engines: {node: '>= 0.6'} dev: false - /copy-descriptor/0.1.1: + /copy-descriptor@0.1.1: resolution: {integrity: sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw==} engines: {node: '>=0.10.0'} dev: false - /core-util-is/1.0.3: + /core-util-is@1.0.3: resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} dev: false - /create-error-class/3.0.2: + /create-error-class@3.0.2: resolution: {integrity: sha512-gYTKKexFO3kh200H1Nit76sRwRtOY32vQd3jpAQKpLtZqyNsSQNfI4N7o3eP2wUjV35pTWKRYqFUDBvUha/Pkw==} engines: {node: '>=0.10.0'} dependencies: capture-stack-trace: 1.0.2 dev: false - /create-require/1.1.1: + /create-require@1.1.1: resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} dev: true - /cross-spawn/5.1.0: + /cross-spawn@5.1.0: resolution: {integrity: sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==} dependencies: lru-cache: 4.1.5 @@ -1080,23 +1106,12 @@ packages: which: 1.3.1 dev: false - /crypto-random-string/1.0.0: + /crypto-random-string@1.0.0: resolution: {integrity: sha512-GsVpkFPlycH7/fRR7Dhcmnoii54gV1nz7y4CWyeFS14N+JVBBhY+r8amRHE4BwSYal7BPTDp8isvAlCxyFt3Hg==} engines: {node: '>=4'} 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 - dev: false - - /debug/2.6.9_supports-color@5.5.0: + /debug@2.6.9: resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} peerDependencies: supports-color: '*' @@ -1105,22 +1120,9 @@ packages: optional: true dependencies: ms: 2.0.0 - supports-color: 5.5.0 dev: false - /debug/3.2.7_supports-color@5.5.0: - resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - dependencies: - ms: 2.1.3 - supports-color: 5.5.0 - dev: false - - /debug/4.3.4: + /debug@4.3.4: resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} engines: {node: '>=6.0'} peerDependencies: @@ -1132,38 +1134,38 @@ packages: ms: 2.1.2 dev: false - /decode-uri-component/0.2.2: + /decode-uri-component@0.2.2: resolution: {integrity: sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==} engines: {node: '>=0.10'} dev: false - /decompress-response/6.0.0: + /decompress-response@6.0.0: resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} engines: {node: '>=10'} dependencies: mimic-response: 3.1.0 dev: false - /deep-extend/0.6.0: + /deep-extend@0.6.0: resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} engines: {node: '>=4.0.0'} dev: false - /define-property/0.2.5: + /define-property@0.2.5: resolution: {integrity: sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==} engines: {node: '>=0.10.0'} dependencies: is-descriptor: 0.1.6 dev: false - /define-property/1.0.0: + /define-property@1.0.0: resolution: {integrity: sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==} engines: {node: '>=0.10.0'} dependencies: is-descriptor: 1.0.2 dev: false - /define-property/2.0.2: + /define-property@2.0.2: resolution: {integrity: sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==} engines: {node: '>=0.10.0'} dependencies: @@ -1171,123 +1173,123 @@ packages: isobject: 3.0.1 dev: false - /delayed-stream/1.0.0: + /delayed-stream@1.0.0: resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} engines: {node: '>=0.4.0'} dev: false - /depd/2.0.0: + /depd@2.0.0: resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} engines: {node: '>= 0.8'} dev: false - /destroy/1.2.0: + /destroy@1.2.0: resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} dev: false - /detect-libc/2.0.2: + /detect-libc@2.0.2: resolution: {integrity: sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==} engines: {node: '>=8'} dev: false - /diff/4.0.2: + /diff@4.0.2: resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} engines: {node: '>=0.3.1'} dev: true - /dir-glob/3.0.1: + /dir-glob@3.0.1: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} dependencies: path-type: 4.0.0 dev: false - /dot-prop/4.2.1: + /dot-prop@4.2.1: resolution: {integrity: sha512-l0p4+mIuJIua0mhxGoh4a+iNL9bmeK5DvnSVQa6T0OhrVmaEa1XScX5Etc673FePCJOArq/4Pa2cLGODUWTPOQ==} engines: {node: '>=4'} dependencies: is-obj: 1.0.1 dev: false - /duplexer3/0.1.5: + /duplexer3@0.1.5: resolution: {integrity: sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA==} dev: false - /ee-first/1.1.1: + /ee-first@1.1.1: resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} dev: false - /emoji-regex/8.0.0: + /emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} dev: false - /encodeurl/1.0.2: + /encodeurl@1.0.2: resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} engines: {node: '>= 0.8'} dev: false - /end-of-stream/1.4.4: + /end-of-stream@1.4.4: resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} dependencies: once: 1.4.0 dev: false - /esbuild/0.18.14: - resolution: {integrity: sha512-uNPj5oHPYmj+ZhSQeYQVFZ+hAlJZbAGOmmILWIqrGvPVlNLbyOvU5Bu6Woi8G8nskcx0vwY0iFoMPrzT86Ko+w==} + /esbuild@0.18.11: + resolution: {integrity: sha512-i8u6mQF0JKJUlGR3OdFLKldJQMMs8OqM9Cc3UCi9XXziJ9WERM5bfkHaEAy0YAvPRMgqSW55W7xYn84XtEFTtA==} engines: {node: '>=12'} hasBin: true requiresBuild: true optionalDependencies: - '@esbuild/android-arm': 0.18.14 - '@esbuild/android-arm64': 0.18.14 - '@esbuild/android-x64': 0.18.14 - '@esbuild/darwin-arm64': 0.18.14 - '@esbuild/darwin-x64': 0.18.14 - '@esbuild/freebsd-arm64': 0.18.14 - '@esbuild/freebsd-x64': 0.18.14 - '@esbuild/linux-arm': 0.18.14 - '@esbuild/linux-arm64': 0.18.14 - '@esbuild/linux-ia32': 0.18.14 - '@esbuild/linux-loong64': 0.18.14 - '@esbuild/linux-mips64el': 0.18.14 - '@esbuild/linux-ppc64': 0.18.14 - '@esbuild/linux-riscv64': 0.18.14 - '@esbuild/linux-s390x': 0.18.14 - '@esbuild/linux-x64': 0.18.14 - '@esbuild/netbsd-x64': 0.18.14 - '@esbuild/openbsd-x64': 0.18.14 - '@esbuild/sunos-x64': 0.18.14 - '@esbuild/win32-arm64': 0.18.14 - '@esbuild/win32-ia32': 0.18.14 - '@esbuild/win32-x64': 0.18.14 + '@esbuild/android-arm': 0.18.11 + '@esbuild/android-arm64': 0.18.11 + '@esbuild/android-x64': 0.18.11 + '@esbuild/darwin-arm64': 0.18.11 + '@esbuild/darwin-x64': 0.18.11 + '@esbuild/freebsd-arm64': 0.18.11 + '@esbuild/freebsd-x64': 0.18.11 + '@esbuild/linux-arm': 0.18.11 + '@esbuild/linux-arm64': 0.18.11 + '@esbuild/linux-ia32': 0.18.11 + '@esbuild/linux-loong64': 0.18.11 + '@esbuild/linux-mips64el': 0.18.11 + '@esbuild/linux-ppc64': 0.18.11 + '@esbuild/linux-riscv64': 0.18.11 + '@esbuild/linux-s390x': 0.18.11 + '@esbuild/linux-x64': 0.18.11 + '@esbuild/netbsd-x64': 0.18.11 + '@esbuild/openbsd-x64': 0.18.11 + '@esbuild/sunos-x64': 0.18.11 + '@esbuild/win32-arm64': 0.18.11 + '@esbuild/win32-ia32': 0.18.11 + '@esbuild/win32-x64': 0.18.11 dev: true - /escalade/3.1.1: + /escalade@3.1.1: resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} engines: {node: '>=6'} dev: false - /escape-html/1.0.3: + /escape-html@1.0.3: resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} dev: false - /escape-string-regexp/1.0.5: + /escape-string-regexp@1.0.5: resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} engines: {node: '>=0.8.0'} dev: false - /etag/1.8.1: + /etag@1.8.1: resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} engines: {node: '>= 0.6'} dev: false - /events/3.3.0: + /events@3.3.0: resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} engines: {node: '>=0.8.x'} dev: false - /execa/0.7.0: + /execa@0.7.0: resolution: {integrity: sha512-RztN09XglpYI7aBBrJCPW95jEH7YF1UEPOoX9yDhUTPdp7mK+CQvnLTuD10BNXZ3byLTu2uehZ8EcKT/4CGiFw==} engines: {node: '>=4'} dependencies: @@ -1300,27 +1302,41 @@ packages: strip-eof: 1.0.0 dev: false - /expand-brackets/2.1.4_supports-color@5.5.0: + /expand-brackets@0.1.5: + resolution: {integrity: sha512-hxx03P2dJxss6ceIeri9cmYOT4SRs3Zk3afZwWpOsRqLqprhTR8u++SlC+sFGsQr7WGFPdMF7Gjc1njDLDK6UA==} + engines: {node: '>=0.10.0'} + dependencies: + is-posix-bracket: 0.1.1 + dev: false + + /expand-brackets@2.1.4: resolution: {integrity: sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==} engines: {node: '>=0.10.0'} dependencies: - debug: 2.6.9_supports-color@5.5.0 + debug: 2.6.9 define-property: 0.2.5 extend-shallow: 2.0.1 posix-character-classes: 0.1.1 regex-not: 1.0.2 - snapdragon: 0.8.2_supports-color@5.5.0 + snapdragon: 0.8.2 to-regex: 3.0.2 transitivePeerDependencies: - supports-color dev: false - /expand-template/2.0.3: + /expand-range@1.8.2: + resolution: {integrity: sha512-AFASGfIlnIbkKPQwX1yHaDjFvh/1gyKJODme52V6IORh69uEYgZp0o9C+qsIGNVEiuuhQU0CSSl++Rlegg1qvA==} + engines: {node: '>=0.10.0'} + dependencies: + fill-range: 2.2.4 + dev: false + + /expand-template@2.0.3: resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} engines: {node: '>=6'} dev: false - /express/4.18.2: + /express@4.18.2: resolution: {integrity: sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==} engines: {node: '>= 0.10.0'} dependencies: @@ -1359,14 +1375,14 @@ packages: - supports-color dev: false - /extend-shallow/2.0.1: + /extend-shallow@2.0.1: resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} engines: {node: '>=0.10.0'} dependencies: is-extendable: 0.1.1 dev: false - /extend-shallow/3.0.2: + /extend-shallow@3.0.2: resolution: {integrity: sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==} engines: {node: '>=0.10.0'} dependencies: @@ -1374,23 +1390,30 @@ packages: is-extendable: 1.0.1 dev: false - /extglob/2.0.4_supports-color@5.5.0: + /extglob@0.3.2: + resolution: {integrity: sha512-1FOj1LOwn42TMrruOHGt18HemVnbwAmAak7krWk+wa93KXxGbK+2jpezm+ytJYDaBX0/SPLZFHKM7m+tKobWGg==} + engines: {node: '>=0.10.0'} + dependencies: + is-extglob: 1.0.0 + dev: false + + /extglob@2.0.4: resolution: {integrity: sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==} engines: {node: '>=0.10.0'} dependencies: array-unique: 0.3.2 define-property: 1.0.0 - expand-brackets: 2.1.4_supports-color@5.5.0 + expand-brackets: 2.1.4 extend-shallow: 2.0.1 fragment-cache: 0.2.1 regex-not: 1.0.2 - snapdragon: 0.8.2_supports-color@5.5.0 + snapdragon: 0.8.2 to-regex: 3.0.2 transitivePeerDependencies: - supports-color dev: false - /fast-glob/3.3.0: + /fast-glob@3.3.0: resolution: {integrity: sha512-ChDuvbOypPuNjO8yIDf36x7BlZX1smcUMTTcyoIjycexOxd6DFsKsg21qVBzEmr3G7fUKIRy2/psii+CIUt7FA==} engines: {node: '>=8.6.0'} dependencies: @@ -1401,19 +1424,35 @@ packages: micromatch: 4.0.5 dev: false - /fastq/1.15.0: + /fastq@1.15.0: resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} dependencies: reusify: 1.0.4 dev: false - /file-uri-to-path/1.0.0: + /file-uri-to-path@1.0.0: resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} requiresBuild: true dev: false optional: true - /fill-range/4.0.0: + /filename-regex@2.0.1: + resolution: {integrity: sha512-BTCqyBaWBTsauvnHiE8i562+EdJj+oUpkqWp2R1iCoR8f6oo8STRu3of7WJJ0TqWtxN50a5YFpzYK4Jj9esYfQ==} + engines: {node: '>=0.10.0'} + dev: false + + /fill-range@2.2.4: + resolution: {integrity: sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==} + engines: {node: '>=0.10.0'} + dependencies: + is-number: 2.1.0 + isobject: 2.1.0 + randomatic: 3.1.1 + repeat-element: 1.1.4 + repeat-string: 1.6.1 + dev: false + + /fill-range@4.0.0: resolution: {integrity: sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==} engines: {node: '>=0.10.0'} dependencies: @@ -1423,14 +1462,14 @@ packages: to-regex-range: 2.1.1 dev: false - /fill-range/7.0.1: + /fill-range@7.0.1: resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} engines: {node: '>=8'} dependencies: to-regex-range: 5.0.1 dev: false - /finalhandler/1.2.0: + /finalhandler@1.2.0: resolution: {integrity: sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==} engines: {node: '>= 0.8'} dependencies: @@ -1445,12 +1484,19 @@ packages: - supports-color dev: false - /for-in/1.0.2: + /for-in@1.0.2: resolution: {integrity: sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==} engines: {node: '>=0.10.0'} dev: false - /form-data/3.0.1: + /for-own@0.1.5: + resolution: {integrity: sha512-SKmowqGTJoPzLO1T0BBJpkfp3EMacCMOuH40hOUbrbzElVktk4DioXVM99QkLCyKoiuOmyjgcWMpVz2xjE7LZw==} + engines: {node: '>=0.10.0'} + dependencies: + for-in: 1.0.2 + dev: false + + /form-data@3.0.1: resolution: {integrity: sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==} engines: {node: '>= 6'} dependencies: @@ -1459,7 +1505,7 @@ packages: mime-types: 2.1.35 dev: false - /form-data/4.0.0: + /form-data@4.0.0: resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} engines: {node: '>= 6'} dependencies: @@ -1468,35 +1514,35 @@ packages: mime-types: 2.1.35 dev: false - /forwarded/0.2.0: + /forwarded@0.2.0: resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} engines: {node: '>= 0.6'} dev: false - /fragment-cache/0.2.1: + /fragment-cache@0.2.1: resolution: {integrity: sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA==} engines: {node: '>=0.10.0'} dependencies: map-cache: 0.2.2 dev: false - /fresh/0.5.2: + /fresh@0.5.2: resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} engines: {node: '>= 0.6'} dev: false - /from2/2.3.0: + /from2@2.3.0: resolution: {integrity: sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==} dependencies: inherits: 2.0.4 readable-stream: 2.3.8 dev: false - /fs-constants/1.0.0: + /fs-constants@1.0.0: resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} dev: false - /fs-extra/9.1.0: + /fs-extra@9.1.0: resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==} engines: {node: '>=10'} dependencies: @@ -1506,7 +1552,7 @@ packages: universalify: 2.0.0 dev: false - /fsevents/1.2.13: + /fsevents@1.2.13: resolution: {integrity: sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==} engines: {node: '>= 4.0'} os: [darwin] @@ -1518,16 +1564,16 @@ packages: dev: false optional: true - /function-bind/1.1.1: + /function-bind@1.1.1: resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} dev: false - /get-caller-file/2.0.5: + /get-caller-file@2.0.5: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} dev: false - /get-intrinsic/1.2.1: + /get-intrinsic@1.2.1: resolution: {integrity: sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==} dependencies: function-bind: 1.1.1 @@ -1536,42 +1582,49 @@ packages: has-symbols: 1.0.3 dev: false - /get-stream/3.0.0: + /get-stream@3.0.0: resolution: {integrity: sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==} engines: {node: '>=4'} dev: false - /get-value/2.0.6: + /get-value@2.0.6: resolution: {integrity: sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==} engines: {node: '>=0.10.0'} dev: false - /github-from-package/0.0.0: + /github-from-package@0.0.0: resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==} dev: false - /glob-parent/3.1.0: - resolution: {integrity: sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA==} + /glob-base@0.3.0: + resolution: {integrity: sha512-ab1S1g1EbO7YzauaJLkgLp7DZVAqj9M/dvKlTt8DkXA2tiOIcSMrlVI2J1RZyB5iJVccEscjGn+kpOG9788MHA==} + engines: {node: '>=0.10.0'} + dependencies: + glob-parent: 2.0.0 + is-glob: 2.0.1 + dev: false + + /glob-parent@2.0.0: + resolution: {integrity: sha512-JDYOvfxio/t42HKdxkAYaCiBN7oYiuxykOxKxdaUW5Qn0zaYN3gRQWolrwdnf0shM9/EP0ebuuTmyoXNr1cC5w==} dependencies: - is-glob: 3.1.0 - path-dirname: 1.0.2 + is-glob: 2.0.1 dev: false - /glob-parent/5.1.2: + /glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} dependencies: is-glob: 4.0.3 dev: false - /global-dirs/0.1.1: + /global-dirs@0.1.1: resolution: {integrity: sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg==} engines: {node: '>=4'} dependencies: ini: 1.3.8 dev: false - /globby/11.1.0: + /globby@11.1.0: resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} engines: {node: '>=10'} dependencies: @@ -1583,11 +1636,11 @@ packages: slash: 3.0.0 dev: false - /globrex/0.1.2: + /globrex@0.1.2: resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} dev: false - /got/6.7.1: + /got@6.7.1: resolution: {integrity: sha512-Y/K3EDuiQN9rTZhBvPRWMLXIKdeD1Rj0nzunfoi0Yyn5WBEbzxXKU9Ub2X41oZBagVWOBU3MuDonFMgPWQFnwg==} engines: {node: '>=4'} dependencies: @@ -1606,31 +1659,31 @@ packages: url-parse-lax: 1.0.0 dev: false - /graceful-fs/4.2.11: + /graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} dev: false - /has-flag/3.0.0: + /has-flag@3.0.0: resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} engines: {node: '>=4'} dev: false - /has-flag/4.0.0: + /has-flag@4.0.0: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} dev: false - /has-proto/1.0.1: + /has-proto@1.0.1: resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} engines: {node: '>= 0.4'} dev: false - /has-symbols/1.0.3: + /has-symbols@1.0.3: resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} engines: {node: '>= 0.4'} dev: false - /has-value/0.3.1: + /has-value@0.3.1: resolution: {integrity: sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q==} engines: {node: '>=0.10.0'} dependencies: @@ -1639,7 +1692,7 @@ packages: isobject: 2.1.0 dev: false - /has-value/1.0.0: + /has-value@1.0.0: resolution: {integrity: sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw==} engines: {node: '>=0.10.0'} dependencies: @@ -1648,12 +1701,12 @@ packages: isobject: 3.0.1 dev: false - /has-values/0.1.4: + /has-values@0.1.4: resolution: {integrity: sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ==} engines: {node: '>=0.10.0'} dev: false - /has-values/1.0.0: + /has-values@1.0.0: resolution: {integrity: sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ==} engines: {node: '>=0.10.0'} dependencies: @@ -1661,14 +1714,14 @@ packages: kind-of: 4.0.0 dev: false - /has/1.0.3: + /has@1.0.3: resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} engines: {node: '>= 0.4.0'} dependencies: function-bind: 1.1.1 dev: false - /http-errors/2.0.0: + /http-errors@2.0.0: resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} engines: {node: '>= 0.8'} dependencies: @@ -1679,7 +1732,7 @@ packages: toidentifier: 1.0.1 dev: false - /https-proxy-agent/5.0.1: + /https-proxy-agent@5.0.1: resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} engines: {node: '>= 6'} dependencies: @@ -1689,45 +1742,45 @@ packages: - supports-color dev: false - /iconv-lite/0.4.24: + /iconv-lite@0.4.24: resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} engines: {node: '>=0.10.0'} dependencies: safer-buffer: 2.1.2 dev: false - /ieee754/1.2.1: + /ieee754@1.2.1: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} dev: false - /ignore-by-default/1.0.1: + /ignore-by-default@1.0.1: resolution: {integrity: sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==} dev: false - /ignore/5.2.4: + /ignore@5.2.4: resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} engines: {node: '>= 4'} dev: false - /import-lazy/2.1.0: + /import-lazy@2.1.0: resolution: {integrity: sha512-m7ZEHgtw69qOGw+jwxXkHlrlIPdTGkyh66zXZ1ajZbxkDBNjSY/LGbmjc7h0s2ELsUDTAhFr55TrPSSqJGPG0A==} engines: {node: '>=4'} dev: false - /imurmurhash/0.1.4: + /imurmurhash@0.1.4: resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} engines: {node: '>=0.8.19'} dev: false - /inherits/2.0.4: + /inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} dev: false - /ini/1.3.8: + /ini@1.3.8: resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} dev: false - /into-stream/6.0.0: + /into-stream@6.0.0: resolution: {integrity: sha512-XHbaOAvP+uFKUFsOgoNPRjLkwB+I22JFPFe5OjTkQ0nwgj6+pSjb4NmB6VMxaPshLiOf+zcpOCBQuLwC1KHhZA==} engines: {node: '>=10'} dependencies: @@ -1735,70 +1788,70 @@ packages: p-is-promise: 3.0.0 dev: false - /ipaddr.js/1.9.1: + /ipaddr.js@1.9.1: resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} engines: {node: '>= 0.10'} dev: false - /is-accessor-descriptor/0.1.6: + /is-accessor-descriptor@0.1.6: resolution: {integrity: sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==} engines: {node: '>=0.10.0'} dependencies: kind-of: 3.2.2 dev: false - /is-accessor-descriptor/1.0.0: + /is-accessor-descriptor@1.0.0: resolution: {integrity: sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==} engines: {node: '>=0.10.0'} dependencies: kind-of: 6.0.3 dev: false - /is-binary-path/1.0.1: + /is-binary-path@1.0.1: resolution: {integrity: sha512-9fRVlXc0uCxEDj1nQzaWONSpbTfx0FmJfzHF7pwlI8DkWGoHBBea4Pg5Ky0ojwwxQmnSifgbKkI06Qv0Ljgj+Q==} engines: {node: '>=0.10.0'} dependencies: binary-extensions: 1.13.1 dev: false - /is-buffer/1.1.6: + /is-buffer@1.1.6: resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==} dev: false - /is-ci/1.2.1: + /is-ci@1.2.1: resolution: {integrity: sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg==} hasBin: true dependencies: ci-info: 1.6.0 dev: false - /is-core-module/2.12.1: + /is-core-module@2.12.1: resolution: {integrity: sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==} dependencies: has: 1.0.3 dev: false - /is-core-module/2.9.0: + /is-core-module@2.9.0: resolution: {integrity: sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==} dependencies: has: 1.0.3 dev: false - /is-data-descriptor/0.1.4: + /is-data-descriptor@0.1.4: resolution: {integrity: sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==} engines: {node: '>=0.10.0'} dependencies: kind-of: 3.2.2 dev: false - /is-data-descriptor/1.0.0: + /is-data-descriptor@1.0.0: resolution: {integrity: sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==} engines: {node: '>=0.10.0'} dependencies: kind-of: 6.0.3 dev: false - /is-descriptor/0.1.6: + /is-descriptor@0.1.6: resolution: {integrity: sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==} engines: {node: '>=0.10.0'} dependencies: @@ -1807,7 +1860,7 @@ packages: kind-of: 5.1.0 dev: false - /is-descriptor/1.0.2: + /is-descriptor@1.0.2: resolution: {integrity: sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==} engines: {node: '>=0.10.0'} dependencies: @@ -1816,48 +1869,65 @@ packages: kind-of: 6.0.3 dev: false - /is-extendable/0.1.1: + /is-dotfile@1.0.3: + resolution: {integrity: sha512-9YclgOGtN/f8zx0Pr4FQYMdibBiTaH3sn52vjYip4ZSf6C4/6RfTEZ+MR4GvKhCxdPh21Bg42/WL55f6KSnKpg==} + engines: {node: '>=0.10.0'} + dev: false + + /is-equal-shallow@0.1.3: + resolution: {integrity: sha512-0EygVC5qPvIyb+gSz7zdD5/AAoS6Qrx1e//6N4yv4oNm30kqvdmG66oZFWVlQHUWe5OjP08FuTw2IdT0EOTcYA==} + engines: {node: '>=0.10.0'} + dependencies: + is-primitive: 2.0.0 + dev: false + + /is-extendable@0.1.1: resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==} engines: {node: '>=0.10.0'} dev: false - /is-extendable/1.0.1: + /is-extendable@1.0.1: resolution: {integrity: sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==} engines: {node: '>=0.10.0'} dependencies: is-plain-object: 2.0.4 dev: false - /is-extglob/2.1.1: + /is-extglob@1.0.0: + resolution: {integrity: sha512-7Q+VbVafe6x2T+Tu6NcOf6sRklazEPmBoB3IWk3WdGZM2iGUwU/Oe3Wtq5lSEkDTTlpp8yx+5t4pzO/i9Ty1ww==} + engines: {node: '>=0.10.0'} + dev: false + + /is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} dev: false - /is-fullwidth-code-point/2.0.0: + /is-fullwidth-code-point@2.0.0: resolution: {integrity: sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==} engines: {node: '>=4'} dev: false - /is-fullwidth-code-point/3.0.0: + /is-fullwidth-code-point@3.0.0: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} engines: {node: '>=8'} dev: false - /is-glob/3.1.0: - resolution: {integrity: sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw==} + /is-glob@2.0.1: + resolution: {integrity: sha512-a1dBeB19NXsf/E0+FHqkagizel/LQw2DjSQpvQrj3zT+jYPpaUCryPnrQajXKFLCMuf4I6FhRpaGtw4lPrG6Eg==} engines: {node: '>=0.10.0'} dependencies: - is-extglob: 2.1.1 + is-extglob: 1.0.0 dev: false - /is-glob/4.0.3: + /is-glob@4.0.3: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} dependencies: is-extglob: 2.1.1 dev: false - /is-installed-globally/0.1.0: + /is-installed-globally@0.1.0: resolution: {integrity: sha512-ERNhMg+i/XgDwPIPF3u24qpajVreaiSuvpb1Uu0jugw7KKcxGyCX8cgp8P5fwTmAuXku6beDHHECdKArjlg7tw==} engines: {node: '>=4'} dependencies: @@ -1865,99 +1935,121 @@ packages: is-path-inside: 1.0.1 dev: false - /is-npm/1.0.0: + /is-npm@1.0.0: resolution: {integrity: sha512-9r39FIr3d+KD9SbX0sfMsHzb5PP3uimOiwr3YupUaUFG4W0l1U57Rx3utpttV7qz5U3jmrO5auUa04LU9pyHsg==} engines: {node: '>=0.10.0'} dev: false - /is-number/3.0.0: + /is-number@2.1.0: + resolution: {integrity: sha512-QUzH43Gfb9+5yckcrSA0VBDwEtDUchrk4F6tfJZQuNzDJbEDB9cZNzSfXGQ1jqmdDY/kl41lUOWM9syA8z8jlg==} + engines: {node: '>=0.10.0'} + dependencies: + kind-of: 3.2.2 + dev: false + + /is-number@3.0.0: resolution: {integrity: sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==} engines: {node: '>=0.10.0'} dependencies: kind-of: 3.2.2 dev: false - /is-number/7.0.0: + /is-number@4.0.0: + resolution: {integrity: sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==} + engines: {node: '>=0.10.0'} + dev: false + + /is-number@7.0.0: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} dev: false - /is-obj/1.0.1: + /is-obj@1.0.1: resolution: {integrity: sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==} engines: {node: '>=0.10.0'} dev: false - /is-path-inside/1.0.1: + /is-path-inside@1.0.1: resolution: {integrity: sha512-qhsCR/Esx4U4hg/9I19OVUAJkGWtjRYHMRgUMZE2TDdj+Ag+kttZanLupfddNyglzz50cUlmWzUaI37GDfNx/g==} engines: {node: '>=0.10.0'} dependencies: path-is-inside: 1.0.2 dev: false - /is-plain-object/2.0.4: + /is-plain-object@2.0.4: resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} engines: {node: '>=0.10.0'} dependencies: isobject: 3.0.1 dev: false - /is-redirect/1.0.0: + /is-posix-bracket@0.1.1: + resolution: {integrity: sha512-Yu68oeXJ7LeWNmZ3Zov/xg/oDBnBK2RNxwYY1ilNJX+tKKZqgPK+qOn/Gs9jEu66KDY9Netf5XLKNGzas/vPfQ==} + engines: {node: '>=0.10.0'} + dev: false + + /is-primitive@2.0.0: + resolution: {integrity: sha512-N3w1tFaRfk3UrPfqeRyD+GYDASU3W5VinKhlORy8EWVf/sIdDL9GAcew85XmktCfH+ngG7SRXEVDoO18WMdB/Q==} + engines: {node: '>=0.10.0'} + dev: false + + /is-redirect@1.0.0: resolution: {integrity: sha512-cr/SlUEe5zOGmzvj9bUyC4LVvkNVAXu4GytXLNMr1pny+a65MpQ9IJzFHD5vi7FyJgb4qt27+eS3TuQnqB+RQw==} engines: {node: '>=0.10.0'} dev: false - /is-retry-allowed/1.2.0: + /is-retry-allowed@1.2.0: resolution: {integrity: sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==} engines: {node: '>=0.10.0'} dev: false - /is-stream/1.1.0: + /is-stream@1.1.0: resolution: {integrity: sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==} engines: {node: '>=0.10.0'} dev: false - /is-windows/1.0.2: + /is-windows@1.0.2: resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} engines: {node: '>=0.10.0'} dev: false - /isarray/0.0.1: + /isarray@0.0.1: resolution: {integrity: sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==} dev: false - /isarray/1.0.0: + /isarray@1.0.0: resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} dev: false - /isexe/2.0.0: + /isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} dev: false - /isobject/2.1.0: + /isobject@2.1.0: resolution: {integrity: sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==} engines: {node: '>=0.10.0'} dependencies: isarray: 1.0.0 dev: false - /isobject/3.0.1: + /isobject@3.0.1: resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} engines: {node: '>=0.10.0'} dev: false - /jsesc/2.5.2: + /jsesc@2.5.2: resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} engines: {node: '>=4'} hasBin: true dev: false - /json5/2.2.3: + /json5@2.2.3: resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} engines: {node: '>=6'} hasBin: true dev: true - /jsonfile/6.1.0: + /jsonfile@6.1.0: resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} dependencies: universalify: 2.0.0 @@ -1965,132 +2057,155 @@ packages: graceful-fs: 4.2.11 dev: false - /kind-of/3.2.2: + /kind-of@3.2.2: resolution: {integrity: sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==} engines: {node: '>=0.10.0'} dependencies: is-buffer: 1.1.6 dev: false - /kind-of/4.0.0: + /kind-of@4.0.0: resolution: {integrity: sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw==} engines: {node: '>=0.10.0'} dependencies: is-buffer: 1.1.6 dev: false - /kind-of/5.1.0: + /kind-of@5.1.0: resolution: {integrity: sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==} engines: {node: '>=0.10.0'} dev: false - /kind-of/6.0.3: + /kind-of@6.0.3: resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} engines: {node: '>=0.10.0'} dev: false - /latest-version/3.1.0: + /latest-version@3.1.0: resolution: {integrity: sha512-Be1YRHWWlZaSsrz2U+VInk+tO0EwLIyV+23RhWLINJYwg/UIikxjlj3MhH37/6/EDCAusjajvMkMMUXRaMWl/w==} engines: {node: '>=4'} dependencies: package-json: 4.0.1 dev: false - /lodash.camelcase/4.3.0: + /lodash.camelcase@4.3.0: resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} dev: false - /long/4.0.0: + /long@4.0.0: resolution: {integrity: sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==} dev: false - /long/5.2.3: + /long@5.2.3: resolution: {integrity: sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==} dev: false - /lowercase-keys/1.0.1: + /lowercase-keys@1.0.1: resolution: {integrity: sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==} engines: {node: '>=0.10.0'} dev: false - /lru-cache/4.1.5: + /lru-cache@4.1.5: resolution: {integrity: sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==} dependencies: pseudomap: 1.0.2 yallist: 2.1.2 dev: false - /lru-cache/6.0.0: + /lru-cache@6.0.0: resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} engines: {node: '>=10'} dependencies: yallist: 4.0.0 dev: false - /make-dir/1.3.0: + /make-dir@1.3.0: resolution: {integrity: sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==} engines: {node: '>=4'} dependencies: pify: 3.0.0 dev: false - /make-error/1.3.6: + /make-error@1.3.6: resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} dev: true - /map-cache/0.2.2: + /map-cache@0.2.2: resolution: {integrity: sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==} engines: {node: '>=0.10.0'} dev: false - /map-visit/1.0.0: + /map-visit@1.0.0: resolution: {integrity: sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w==} engines: {node: '>=0.10.0'} dependencies: object-visit: 1.0.1 dev: false - /media-typer/0.3.0: + /math-random@1.0.4: + resolution: {integrity: sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A==} + dev: false + + /media-typer@0.3.0: resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} engines: {node: '>= 0.6'} dev: false - /merge-descriptors/1.0.1: + /merge-descriptors@1.0.1: resolution: {integrity: sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==} dev: false - /merge2/1.4.1: + /merge2@1.4.1: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} dev: false - /methods/1.1.2: + /methods@1.1.2: resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} engines: {node: '>= 0.6'} dev: false - /micromatch/3.1.10_supports-color@5.5.0: + /micromatch@2.3.11: + resolution: {integrity: sha512-LnU2XFEk9xxSJ6rfgAry/ty5qwUTyHYOBU0g4R6tIw5ljwgGIBmiKhRWLw5NpMOnrgUNcDJ4WMp8rl3sYVHLNA==} + engines: {node: '>=0.10.0'} + dependencies: + arr-diff: 2.0.0 + array-unique: 0.2.1 + braces: 1.8.5 + expand-brackets: 0.1.5 + extglob: 0.3.2 + filename-regex: 2.0.1 + is-extglob: 1.0.0 + is-glob: 2.0.1 + kind-of: 3.2.2 + normalize-path: 2.1.1 + object.omit: 2.0.1 + parse-glob: 3.0.4 + regex-cache: 0.4.4 + dev: false + + /micromatch@3.1.10: resolution: {integrity: sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==} engines: {node: '>=0.10.0'} dependencies: arr-diff: 4.0.0 array-unique: 0.3.2 - braces: 2.3.2_supports-color@5.5.0 + braces: 2.3.2 define-property: 2.0.2 extend-shallow: 3.0.2 - extglob: 2.0.4_supports-color@5.5.0 + extglob: 2.0.4 fragment-cache: 0.2.1 kind-of: 6.0.3 - nanomatch: 1.2.13_supports-color@5.5.0 + nanomatch: 1.2.13 object.pick: 1.3.0 regex-not: 1.0.2 - snapdragon: 0.8.2_supports-color@5.5.0 + snapdragon: 0.8.2 to-regex: 3.0.2 transitivePeerDependencies: - supports-color dev: false - /micromatch/4.0.5: + /micromatch@4.0.5: resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} engines: {node: '>=8.6'} dependencies: @@ -2098,39 +2213,39 @@ packages: picomatch: 2.3.1 dev: false - /mime-db/1.52.0: + /mime-db@1.52.0: resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} engines: {node: '>= 0.6'} dev: false - /mime-types/2.1.35: + /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 - /mime/1.6.0: + /mime@1.6.0: resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} engines: {node: '>=4'} hasBin: true dev: false - /mimic-response/3.1.0: + /mimic-response@3.1.0: resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} engines: {node: '>=10'} dev: false - /minimatch/3.1.2: + /minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} dependencies: brace-expansion: 1.1.11 dev: false - /minimist/1.2.8: + /minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - /mixin-deep/1.3.2: + /mixin-deep@1.3.2: resolution: {integrity: sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==} engines: {node: '>=0.10.0'} dependencies: @@ -2138,36 +2253,36 @@ packages: is-extendable: 1.0.1 dev: false - /mkdirp-classic/0.5.3: + /mkdirp-classic@0.5.3: resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} dev: false - /ms/2.0.0: + /ms@2.0.0: resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} dev: false - /ms/2.1.2: + /ms@2.1.2: resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} dev: false - /ms/2.1.3: + /ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} dev: false - /multistream/4.1.0: + /multistream@4.1.0: resolution: {integrity: sha512-J1XDiAmmNpRCBfIWJv+n0ymC4ABcf/Pl+5YvC5B/D2f/2+8PtHvCNxMPKiQcZyi922Hq69J2YOpb1pTywfifyw==} dependencies: once: 1.4.0 readable-stream: 3.6.2 dev: false - /nan/2.17.0: + /nan@2.17.0: resolution: {integrity: sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ==} requiresBuild: true dev: false optional: true - /nanomatch/1.2.13_supports-color@5.5.0: + /nanomatch@1.2.13: resolution: {integrity: sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==} engines: {node: '>=0.10.0'} dependencies: @@ -2180,29 +2295,29 @@ packages: kind-of: 6.0.3 object.pick: 1.3.0 regex-not: 1.0.2 - snapdragon: 0.8.2_supports-color@5.5.0 + snapdragon: 0.8.2 to-regex: 3.0.2 transitivePeerDependencies: - supports-color dev: false - /napi-build-utils/1.0.2: + /napi-build-utils@1.0.2: resolution: {integrity: sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==} dev: false - /negotiator/0.6.3: + /negotiator@0.6.3: resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} engines: {node: '>= 0.6'} dev: false - /node-abi/3.45.0: + /node-abi@3.45.0: resolution: {integrity: sha512-iwXuFrMAcFVi/ZoZiqq8BzAdsLw9kxDfTC0HMyjXfSL/6CSDAGD5UmR7azrAgWV1zKYq7dUUMj4owusBWKLsiQ==} engines: {node: '>=10'} dependencies: semver: 7.5.4 dev: false - /node-fetch/2.6.12: + /node-fetch@2.6.12: resolution: {integrity: sha512-C/fGU2E8ToujUivIO0H+tpQ6HWo4eEmchoPIoXtxCrVghxdKq+QOHqEZW7tuP3KlV3bC8FRMO5nMCC7Zm1VP6g==} engines: {node: 4.x || >=6.0.0} peerDependencies: @@ -2214,51 +2329,46 @@ packages: whatwg-url: 5.0.0 dev: false - /nodemon/1.19.4: - resolution: {integrity: sha512-VGPaqQBNk193lrJFotBU8nvWZPqEZY2eIzymy2jjY0fJ9qIsxA0sxQ8ATPl0gZC645gijYEc1jtZvpS8QWzJGQ==} + /nodemon@1.14.9: + resolution: {integrity: sha512-PdavUHQrTPREoeGDMvMxfAkL8Y4ENkxTPZsBKJUPpitQbiQ4eswqKe1M0CbDfx1NVti4NQjtXUfndrL6NQ4R+Q==} engines: {node: '>=4'} hasBin: true requiresBuild: true dependencies: - chokidar: 2.1.8_supports-color@5.5.0 - debug: 3.2.7_supports-color@5.5.0 + chokidar: 1.7.0 + debug: 2.6.9 ignore-by-default: 1.0.1 minimatch: 3.1.2 pstree.remy: 1.1.8 - semver: 5.7.2 - supports-color: 5.5.0 touch: 3.1.0 - undefsafe: 2.0.5 + undefsafe: 0.0.3 update-notifier: 2.5.0 + transitivePeerDependencies: + - supports-color dev: false - /nopt/1.0.10: + /nopt@1.0.10: resolution: {integrity: sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==} hasBin: true dependencies: abbrev: 1.1.1 dev: false - /normalize-path/2.1.1: + /normalize-path@2.1.1: resolution: {integrity: sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==} engines: {node: '>=0.10.0'} dependencies: remove-trailing-separator: 1.1.0 dev: false - /normalize-path/3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} - engines: {node: '>=0.10.0'} - dev: false - - /npm-run-path/2.0.2: + /npm-run-path@2.0.2: resolution: {integrity: sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==} engines: {node: '>=4'} dependencies: path-key: 2.0.1 dev: false - /object-copy/0.1.0: + /object-copy@0.1.0: resolution: {integrity: sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ==} engines: {node: '>=0.10.0'} dependencies: @@ -2267,48 +2377,56 @@ packages: kind-of: 3.2.2 dev: false - /object-inspect/1.12.3: + /object-inspect@1.12.3: resolution: {integrity: sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==} dev: false - /object-visit/1.0.1: + /object-visit@1.0.1: resolution: {integrity: sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA==} engines: {node: '>=0.10.0'} dependencies: isobject: 3.0.1 dev: false - /object.pick/1.3.0: + /object.omit@2.0.1: + resolution: {integrity: sha512-UiAM5mhmIuKLsOvrL+B0U2d1hXHF3bFYWIuH1LMpuV2EJEHG1Ntz06PgLEHjm6VFd87NpH8rastvPoyv6UW2fA==} + engines: {node: '>=0.10.0'} + dependencies: + for-own: 0.1.5 + is-extendable: 0.1.1 + dev: false + + /object.pick@1.3.0: resolution: {integrity: sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==} engines: {node: '>=0.10.0'} dependencies: isobject: 3.0.1 dev: false - /on-finished/2.4.1: + /on-finished@2.4.1: resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} engines: {node: '>= 0.8'} dependencies: ee-first: 1.1.1 dev: false - /once/1.4.0: + /once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} dependencies: wrappy: 1.0.2 dev: false - /p-finally/1.0.0: + /p-finally@1.0.0: resolution: {integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==} engines: {node: '>=4'} dev: false - /p-is-promise/3.0.0: + /p-is-promise@3.0.0: resolution: {integrity: sha512-Wo8VsW4IRQSKVXsJCn7TomUaVtyfjVDn3nUP7kE967BQk0CwFpdbZs0X0uk5sW9mkBa9eNM7hCMaG93WUAwxYQ==} engines: {node: '>=8'} dev: false - /package-json/4.0.1: + /package-json@4.0.1: resolution: {integrity: sha512-q/R5GrMek0vzgoomq6rm9OX+3PQve8sLwTirmK30YB3Cu0Bbt9OX9M/SIUnroN5BGJkzwGsFwDaRGD9EwBOlCA==} engines: {node: '>=4'} dependencies: @@ -2318,58 +2436,64 @@ packages: semver: 5.7.2 dev: false - /parseurl/1.3.3: + /parse-glob@3.0.4: + resolution: {integrity: sha512-FC5TeK0AwXzq3tUBFtH74naWkPQCEWs4K+xMxWZBlKDWu0bVHXGZa+KKqxKidd7xwhdZ19ZNuF2uO1M/r196HA==} + engines: {node: '>=0.10.0'} + dependencies: + glob-base: 0.3.0 + is-dotfile: 1.0.3 + is-extglob: 1.0.0 + is-glob: 2.0.1 + dev: false + + /parseurl@1.3.3: resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} engines: {node: '>= 0.8'} dev: false - /pascalcase/0.1.1: + /pascalcase@0.1.1: resolution: {integrity: sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw==} engines: {node: '>=0.10.0'} dev: false - /path-dirname/1.0.2: - resolution: {integrity: sha512-ALzNPpyNq9AqXMBjeymIjFDAkAFH06mHJH/cSBHAgU0s4vfpBn6b2nf8tiRLvagKD8RbTpq2FKTBg7cl9l3c7Q==} - dev: false - - /path-is-absolute/1.0.1: + /path-is-absolute@1.0.1: resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} engines: {node: '>=0.10.0'} dev: false - /path-is-inside/1.0.2: + /path-is-inside@1.0.2: resolution: {integrity: sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==} dev: false - /path-key/2.0.1: + /path-key@2.0.1: resolution: {integrity: sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==} engines: {node: '>=4'} dev: false - /path-parse/1.0.7: + /path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} dev: false - /path-to-regexp/0.1.7: + /path-to-regexp@0.1.7: resolution: {integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==} dev: false - /path-type/4.0.0: + /path-type@4.0.0: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} dev: false - /picomatch/2.3.1: + /picomatch@2.3.1: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} dev: false - /pify/3.0.0: + /pify@3.0.0: resolution: {integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==} engines: {node: '>=4'} dev: false - /pkg-fetch/3.4.2: + /pkg-fetch@3.4.2: resolution: {integrity: sha512-0+uijmzYcnhC0hStDjm/cl2VYdrmVVBpe7Q8k9YBojxmR5tG8mvR9/nooQq3QSXiQqORDVOTY3XqMEqJVIzkHA==} hasBin: true dependencies: @@ -2386,7 +2510,7 @@ packages: - supports-color dev: false - /pkg/5.8.1: + /pkg@5.8.1: resolution: {integrity: sha512-CjBWtFStCfIiT4Bde9QpJy0KeH19jCfwZRJqHFDFXfhUklCx8JoFmMj3wgnEYIwGmZVNkhsStPHEOnrtrQhEXA==} hasBin: true peerDependencies: @@ -2414,12 +2538,12 @@ packages: - supports-color dev: false - /posix-character-classes/0.1.1: + /posix-character-classes@0.1.1: resolution: {integrity: sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg==} engines: {node: '>=0.10.0'} dev: false - /prebuild-install/7.1.1: + /prebuild-install@7.1.1: resolution: {integrity: sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==} engines: {node: '>=10'} hasBin: true @@ -2438,12 +2562,17 @@ packages: tunnel-agent: 0.6.0 dev: false - /prepend-http/1.0.4: + /prepend-http@1.0.4: resolution: {integrity: sha512-PhmXi5XmoyKw1Un4E+opM2KcsJInDvKyuOumcjjw3waw86ZNjHwVUOOWLc4bCzLdcKNaWBH9e99sbWzDQsVaYg==} engines: {node: '>=0.10.0'} dev: false - /prisma/4.16.2: + /preserve@0.2.0: + resolution: {integrity: sha512-s/46sYeylUfHNjI+sA/78FAHlmIuKqI9wNnzEOGehAlUUYeObv5C2mOinXBjyUyWmJ2SfcS2/ydApH4hTF4WXQ==} + engines: {node: '>=0.10.0'} + dev: false + + /prisma@4.16.2: resolution: {integrity: sha512-SYCsBvDf0/7XSJyf2cHTLjLeTLVXYfqp7pG5eEVafFLeT0u/hLFz/9W196nDRGUOo1JfPatAEb+uEnTQImQC1g==} engines: {node: '>=14.17'} hasBin: true @@ -2451,21 +2580,21 @@ packages: dependencies: '@prisma/engines': 4.16.2 - /process-nextick-args/2.0.1: + /process-nextick-args@2.0.1: resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} dev: false - /process/0.11.10: + /process@0.11.10: resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} engines: {node: '>= 0.6.0'} dev: false - /progress/2.0.3: + /progress@2.0.3: resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} engines: {node: '>=0.4.0'} dev: false - /protobufjs/7.2.4: + /protobufjs@7.2.4: resolution: {integrity: sha512-AT+RJgD2sH8phPmCf7OUZR8xGdcJRga4+1cOaXJ64hvcSkVhNcRHOwIxUatPH15+nj59WAGTDv3LSGZPEQbJaQ==} engines: {node: '>=12.0.0'} requiresBuild: true @@ -2480,11 +2609,11 @@ packages: '@protobufjs/path': 1.1.2 '@protobufjs/pool': 1.1.0 '@protobufjs/utf8': 1.1.0 - '@types/node': 18.16.19 + '@types/node': 18.16.7 long: 5.2.3 dev: false - /proxy-addr/2.0.7: + /proxy-addr@2.0.7: resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} engines: {node: '>= 0.10'} dependencies: @@ -2492,42 +2621,51 @@ packages: ipaddr.js: 1.9.1 dev: false - /pseudomap/1.0.2: + /pseudomap@1.0.2: resolution: {integrity: sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==} dev: false - /pstree.remy/1.1.8: + /pstree.remy@1.1.8: resolution: {integrity: sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==} dev: false - /pump/3.0.0: + /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 - /qs/6.11.0: + /qs@6.11.0: resolution: {integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==} engines: {node: '>=0.6'} dependencies: side-channel: 1.0.4 dev: false - /querystringify/2.2.0: + /querystringify@2.2.0: resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} dev: false - /queue-microtask/1.2.3: + /queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} dev: false - /range-parser/1.2.1: + /randomatic@3.1.1: + resolution: {integrity: sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw==} + engines: {node: '>= 0.10.0'} + dependencies: + is-number: 4.0.0 + kind-of: 6.0.3 + math-random: 1.0.4 + dev: false + + /range-parser@1.2.1: resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} engines: {node: '>= 0.6'} dev: false - /raw-body/2.5.1: + /raw-body@2.5.1: resolution: {integrity: sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==} engines: {node: '>= 0.8'} dependencies: @@ -2537,7 +2675,7 @@ packages: unpipe: 1.0.0 dev: false - /rc/1.2.8: + /rc@1.2.8: resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} hasBin: true dependencies: @@ -2547,7 +2685,7 @@ packages: strip-json-comments: 2.0.1 dev: false - /readable-stream/1.1.14: + /readable-stream@1.1.14: resolution: {integrity: sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==} dependencies: core-util-is: 1.0.3 @@ -2556,7 +2694,7 @@ packages: string_decoder: 0.10.31 dev: false - /readable-stream/2.3.8: + /readable-stream@2.3.8: resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} dependencies: core-util-is: 1.0.3 @@ -2568,7 +2706,7 @@ packages: util-deprecate: 1.0.2 dev: false - /readable-stream/3.6.2: + /readable-stream@3.6.2: resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} engines: {node: '>= 6'} dependencies: @@ -2577,18 +2715,25 @@ packages: util-deprecate: 1.0.2 dev: false - /readdirp/2.2.1_supports-color@5.5.0: + /readdirp@2.2.1: resolution: {integrity: sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==} engines: {node: '>=0.10'} dependencies: graceful-fs: 4.2.11 - micromatch: 3.1.10_supports-color@5.5.0 + micromatch: 3.1.10 readable-stream: 2.3.8 transitivePeerDependencies: - supports-color dev: false - /regex-not/1.0.2: + /regex-cache@0.4.4: + resolution: {integrity: sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==} + engines: {node: '>=0.10.0'} + dependencies: + is-equal-shallow: 0.1.3 + dev: false + + /regex-not@1.0.2: resolution: {integrity: sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==} engines: {node: '>=0.10.0'} dependencies: @@ -2596,49 +2741,49 @@ packages: safe-regex: 1.1.0 dev: false - /registry-auth-token/3.4.0: + /registry-auth-token@3.4.0: resolution: {integrity: sha512-4LM6Fw8eBQdwMYcES4yTnn2TqIasbXuwDx3um+QRs7S55aMKCBKBxvPXl2RiUjHwuJLTyYfxSpmfSAjQpcuP+A==} dependencies: rc: 1.2.8 safe-buffer: 5.2.1 dev: false - /registry-url/3.1.0: + /registry-url@3.1.0: resolution: {integrity: sha512-ZbgR5aZEdf4UKZVBPYIgaglBmSF2Hi94s2PcIHhRGFjKYu+chjJdYfHn4rt3hB6eCKLJ8giVIIfgMa1ehDfZKA==} engines: {node: '>=0.10.0'} dependencies: rc: 1.2.8 dev: false - /remove-trailing-separator/1.1.0: + /remove-trailing-separator@1.1.0: resolution: {integrity: sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==} dev: false - /repeat-element/1.1.4: + /repeat-element@1.1.4: resolution: {integrity: sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==} engines: {node: '>=0.10.0'} dev: false - /repeat-string/1.6.1: + /repeat-string@1.6.1: resolution: {integrity: sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==} engines: {node: '>=0.10'} dev: false - /require-directory/2.1.1: + /require-directory@2.1.1: resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} engines: {node: '>=0.10.0'} dev: false - /requires-port/1.0.0: + /requires-port@1.0.0: resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} dev: false - /resolve-url/0.2.1: + /resolve-url@0.2.1: resolution: {integrity: sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==} deprecated: https://github.com/lydell/resolve-url#deprecated dev: false - /resolve/1.22.2: + /resolve@1.22.2: resolution: {integrity: sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==} hasBin: true dependencies: @@ -2647,57 +2792,57 @@ packages: supports-preserve-symlinks-flag: 1.0.0 dev: false - /ret/0.1.15: + /ret@0.1.15: resolution: {integrity: sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==} engines: {node: '>=0.12'} dev: false - /reusify/1.0.4: + /reusify@1.0.4: resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} dev: false - /run-parallel/1.2.0: + /run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} dependencies: queue-microtask: 1.2.3 dev: false - /safe-buffer/5.1.2: + /safe-buffer@5.1.2: resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} dev: false - /safe-buffer/5.2.1: + /safe-buffer@5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} dev: false - /safe-regex/1.1.0: + /safe-regex@1.1.0: resolution: {integrity: sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==} dependencies: ret: 0.1.15 dev: false - /safer-buffer/2.1.2: + /safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} dev: false - /sax/1.2.4: + /sax@1.2.4: resolution: {integrity: sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==} dev: false - /semver-diff/2.1.0: + /semver-diff@2.1.0: resolution: {integrity: sha512-gL8F8L4ORwsS0+iQ34yCYv///jsOq0ZL7WP55d1HnJ32o7tyFYEFQZQA22mrLIacZdU6xecaBBZ+uEiffGNyXw==} engines: {node: '>=0.10.0'} dependencies: semver: 5.7.2 dev: false - /semver/5.7.2: + /semver@5.7.2: resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} hasBin: true dev: false - /semver/7.5.4: + /semver@7.5.4: resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} engines: {node: '>=10'} hasBin: true @@ -2705,7 +2850,7 @@ packages: lru-cache: 6.0.0 dev: false - /send/0.18.0: + /send@0.18.0: resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==} engines: {node: '>= 0.8.0'} dependencies: @@ -2726,7 +2871,7 @@ packages: - supports-color dev: false - /serve-static/1.15.0: + /serve-static@1.15.0: resolution: {integrity: sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==} engines: {node: '>= 0.8.0'} dependencies: @@ -2738,7 +2883,7 @@ packages: - supports-color dev: false - /set-value/2.0.1: + /set-value@2.0.1: resolution: {integrity: sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==} engines: {node: '>=0.10.0'} dependencies: @@ -2748,23 +2893,23 @@ packages: split-string: 3.1.0 dev: false - /setprototypeof/1.2.0: + /setprototypeof@1.2.0: resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} dev: false - /shebang-command/1.2.0: + /shebang-command@1.2.0: resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==} engines: {node: '>=0.10.0'} dependencies: shebang-regex: 1.0.0 dev: false - /shebang-regex/1.0.0: + /shebang-regex@1.0.0: resolution: {integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==} engines: {node: '>=0.10.0'} dev: false - /side-channel/1.0.4: + /side-channel@1.0.4: resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} dependencies: call-bind: 1.0.2 @@ -2772,15 +2917,15 @@ packages: object-inspect: 1.12.3 dev: false - /signal-exit/3.0.7: + /signal-exit@3.0.7: resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} dev: false - /simple-concat/1.0.1: + /simple-concat@1.0.1: resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} dev: false - /simple-get/4.0.1: + /simple-get@4.0.1: resolution: {integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==} dependencies: decompress-response: 6.0.0 @@ -2788,12 +2933,12 @@ packages: simple-concat: 1.0.1 dev: false - /slash/3.0.0: + /slash@3.0.0: resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} engines: {node: '>=8'} dev: false - /snapdragon-node/2.1.1: + /snapdragon-node@2.1.1: resolution: {integrity: sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==} engines: {node: '>=0.10.0'} dependencies: @@ -2802,19 +2947,19 @@ packages: snapdragon-util: 3.0.1 dev: false - /snapdragon-util/3.0.1: + /snapdragon-util@3.0.1: resolution: {integrity: sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==} engines: {node: '>=0.10.0'} dependencies: kind-of: 3.2.2 dev: false - /snapdragon/0.8.2_supports-color@5.5.0: + /snapdragon@0.8.2: resolution: {integrity: sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==} engines: {node: '>=0.10.0'} dependencies: base: 0.11.2 - debug: 2.6.9_supports-color@5.5.0 + debug: 2.6.9 define-property: 0.2.5 extend-shallow: 2.0.1 map-cache: 0.2.2 @@ -2825,7 +2970,7 @@ packages: - supports-color dev: false - /source-map-resolve/0.5.3: + /source-map-resolve@0.5.3: resolution: {integrity: sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==} deprecated: See https://github.com/lydell/source-map-resolve#deprecated dependencies: @@ -2836,24 +2981,24 @@ packages: urix: 0.1.0 dev: false - /source-map-url/0.4.1: + /source-map-url@0.4.1: resolution: {integrity: sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==} deprecated: See https://github.com/lydell/source-map-url#deprecated dev: false - /source-map/0.5.7: + /source-map@0.5.7: resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==} engines: {node: '>=0.10.0'} dev: false - /split-string/3.1.0: + /split-string@3.1.0: resolution: {integrity: sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==} engines: {node: '>=0.10.0'} dependencies: extend-shallow: 3.0.2 dev: false - /static-extend/0.1.2: + /static-extend@0.1.2: resolution: {integrity: sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g==} engines: {node: '>=0.10.0'} dependencies: @@ -2861,18 +3006,18 @@ packages: object-copy: 0.1.0 dev: false - /statuses/2.0.1: + /statuses@2.0.1: resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} engines: {node: '>= 0.8'} dev: false - /stream-meter/1.0.4: + /stream-meter@1.0.4: resolution: {integrity: sha512-4sOEtrbgFotXwnEuzzsQBYEV1elAeFSO8rSGeTwabuX1RRn/kEq9JVH7I0MRBhKVRR0sJkr0M0QCH7yOLf9fhQ==} dependencies: readable-stream: 2.3.8 dev: false - /string-width/2.1.1: + /string-width@2.1.1: resolution: {integrity: sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==} engines: {node: '>=4'} dependencies: @@ -2880,7 +3025,7 @@ packages: strip-ansi: 4.0.0 dev: false - /string-width/4.2.3: + /string-width@4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} dependencies: @@ -2889,71 +3034,71 @@ packages: strip-ansi: 6.0.1 dev: false - /string_decoder/0.10.31: + /string_decoder@0.10.31: resolution: {integrity: sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==} dev: false - /string_decoder/1.1.1: + /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: + /string_decoder@1.3.0: resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} dependencies: safe-buffer: 5.2.1 dev: false - /strip-ansi/4.0.0: + /strip-ansi@4.0.0: resolution: {integrity: sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==} engines: {node: '>=4'} dependencies: ansi-regex: 3.0.1 dev: false - /strip-ansi/6.0.1: + /strip-ansi@6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} dependencies: ansi-regex: 5.0.1 dev: false - /strip-bom/3.0.0: + /strip-bom@3.0.0: resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} engines: {node: '>=4'} dev: true - /strip-eof/1.0.0: + /strip-eof@1.0.0: resolution: {integrity: sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==} engines: {node: '>=0.10.0'} dev: false - /strip-json-comments/2.0.1: + /strip-json-comments@2.0.1: resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} engines: {node: '>=0.10.0'} dev: false - /supports-color/5.5.0: + /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: + /supports-color@7.2.0: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} engines: {node: '>=8'} dependencies: has-flag: 4.0.0 dev: false - /supports-preserve-symlinks-flag/1.0.0: + /supports-preserve-symlinks-flag@1.0.0: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} dev: false - /tar-fs/2.1.1: + /tar-fs@2.1.1: resolution: {integrity: sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==} dependencies: chownr: 1.1.4 @@ -2962,7 +3107,7 @@ packages: tar-stream: 2.2.0 dev: false - /tar-stream/2.2.0: + /tar-stream@2.2.0: resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} engines: {node: '>=6'} dependencies: @@ -2973,31 +3118,31 @@ packages: readable-stream: 3.6.2 dev: false - /term-size/1.2.0: + /term-size@1.2.0: resolution: {integrity: sha512-7dPUZQGy/+m3/wjVz3ZW5dobSoD/02NxJpoXUX0WIyjfVS3l0c+b/+9phIDFA7FHzkYtwtMFgeGZ/Y8jVTeqQQ==} engines: {node: '>=4'} dependencies: execa: 0.7.0 dev: false - /timed-out/4.0.1: + /timed-out@4.0.1: resolution: {integrity: sha512-G7r3AhovYtr5YKOWQkta8RKAPb+J9IsO4uVmzjl8AZwfhs8UcUwTiD6gcJYSgOtzyjvQKrKYn41syHbUWMkafA==} engines: {node: '>=0.10.0'} dev: false - /to-fast-properties/2.0.0: + /to-fast-properties@2.0.0: resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} engines: {node: '>=4'} dev: false - /to-object-path/0.3.0: + /to-object-path@0.3.0: resolution: {integrity: sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==} engines: {node: '>=0.10.0'} dependencies: kind-of: 3.2.2 dev: false - /to-regex-range/2.1.1: + /to-regex-range@2.1.1: resolution: {integrity: sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==} engines: {node: '>=0.10.0'} dependencies: @@ -3005,14 +3150,14 @@ packages: repeat-string: 1.6.1 dev: false - /to-regex-range/5.0.1: + /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 - /to-regex/3.0.2: + /to-regex@3.0.2: resolution: {integrity: sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==} engines: {node: '>=0.10.0'} dependencies: @@ -3022,23 +3167,23 @@ packages: safe-regex: 1.1.0 dev: false - /toidentifier/1.0.1: + /toidentifier@1.0.1: resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} engines: {node: '>=0.6'} dev: false - /touch/3.1.0: + /touch@3.1.0: resolution: {integrity: sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==} hasBin: true dependencies: nopt: 1.0.10 dev: false - /tr46/0.0.3: + /tr46@0.0.3: resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} dev: false - /ts-node/10.9.1_pqdfkuhuhnwv2d7uogwywwxtqq: + /ts-node@10.9.1(@types/node@18.16.7)(typescript@5.0.2): resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} hasBin: true peerDependencies: @@ -3057,19 +3202,19 @@ packages: '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 - '@types/node': 18.16.19 + '@types/node': 18.16.7 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.1.6 + typescript: 5.0.2 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 dev: true - /tsconfck/2.1.2_typescript@5.1.6: + /tsconfck@2.1.2(typescript@5.0.2): resolution: {integrity: sha512-ghqN1b0puy3MhhviwO2kGF8SeMDNhEbnKxjK7h6+fvY9JAxqvXi8y5NAHSQv687OVboS2uZIByzGd45/YxrRHg==} engines: {node: ^14.13.1 || ^16 || >=18} hasBin: true @@ -3079,10 +3224,10 @@ packages: typescript: optional: true dependencies: - typescript: 5.1.6 + typescript: 5.0.2 dev: false - /tsconfig-paths/4.2.0: + /tsconfig-paths@4.2.0: resolution: {integrity: sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==} engines: {node: '>=6'} dependencies: @@ -3091,22 +3236,22 @@ packages: strip-bom: 3.0.0 dev: true - /tslib/2.6.0: + /tslib@2.6.0: resolution: {integrity: sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA==} dev: false - /tunnel-agent/0.6.0: + /tunnel-agent@0.6.0: resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} dependencies: safe-buffer: 5.2.1 dev: false - /tunnel/0.0.6: + /tunnel@0.0.6: resolution: {integrity: sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==} engines: {node: '>=0.6.11 <=0.7.0 || >=0.7.3'} dev: false - /type-is/1.6.18: + /type-is@1.6.18: resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} engines: {node: '>= 0.6'} dependencies: @@ -3114,16 +3259,16 @@ packages: mime-types: 2.1.35 dev: false - /typescript/5.1.6: - resolution: {integrity: sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==} - engines: {node: '>=14.17'} + /typescript@5.0.2: + resolution: {integrity: sha512-wVORMBGO/FAs/++blGNeAVdbNKtIh1rbBL2EyQ1+J9lClJ93KiiKe8PmFIVdXhHcyv44SL9oglmfeSsndo0jRw==} + engines: {node: '>=12.20'} hasBin: true - /undefsafe/2.0.5: - resolution: {integrity: sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==} + /undefsafe@0.0.3: + resolution: {integrity: sha512-mISmZCZVGRI3y3dxtKcOhlfK46hFVleOUTVTRT8BLByUJ3ioLlQ/Nkda54ndIYBJ53Hga3T/FazHXxUw7Pbtew==} dev: false - /union-value/1.0.1: + /union-value@1.0.1: resolution: {integrity: sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==} engines: {node: '>=0.10.0'} dependencies: @@ -3133,24 +3278,24 @@ packages: set-value: 2.0.1 dev: false - /unique-string/1.0.0: + /unique-string@1.0.0: resolution: {integrity: sha512-ODgiYu03y5g76A1I9Gt0/chLCzQjvzDy7DsZGsLOE/1MrF6wriEskSncj1+/C58Xk/kPZDppSctDybCwOSaGAg==} engines: {node: '>=4'} dependencies: crypto-random-string: 1.0.0 dev: false - /universalify/2.0.0: + /universalify@2.0.0: resolution: {integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==} engines: {node: '>= 10.0.0'} dev: false - /unpipe/1.0.0: + /unpipe@1.0.0: resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} engines: {node: '>= 0.8'} dev: false - /unset-value/1.0.0: + /unset-value@1.0.0: resolution: {integrity: sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ==} engines: {node: '>=0.10.0'} dependencies: @@ -3158,17 +3303,12 @@ packages: isobject: 3.0.1 dev: false - /unzip-response/2.0.1: + /unzip-response@2.0.1: resolution: {integrity: sha512-N0XH6lqDtFH84JxptQoZYmloF4nzrQqqrAymNj+/gW60AO2AZgOcf4O/nUXJcYfyQkqvMo9lSupBZmmgvuVXlw==} engines: {node: '>=4'} dev: false - /upath/1.2.0: - resolution: {integrity: sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==} - engines: {node: '>=4'} - dev: false - - /update-notifier/2.5.0: + /update-notifier@2.5.0: resolution: {integrity: sha512-gwMdhgJHGuj/+wHJJs9e6PcCszpxR1b236igrOkUofGhqJuG+amlIKwApH1IW1WWl7ovZxsX49lMBWLxSdm5Dw==} engines: {node: '>=4'} dependencies: @@ -3184,54 +3324,54 @@ packages: xdg-basedir: 3.0.0 dev: false - /urix/0.1.0: + /urix@0.1.0: resolution: {integrity: sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==} deprecated: Please see https://github.com/lydell/urix#deprecated dev: false - /url-parse-lax/1.0.0: + /url-parse-lax@1.0.0: resolution: {integrity: sha512-BVA4lR5PIviy2PMseNd2jbFQ+jwSwQGdJejf5ctd1rEXt0Ypd7yanUK9+lYechVlN5VaTJGsu2U/3MDDu6KgBA==} engines: {node: '>=0.10.0'} dependencies: prepend-http: 1.0.4 dev: false - /url-parse/1.5.10: + /url-parse@1.5.10: resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} dependencies: querystringify: 2.2.0 requires-port: 1.0.0 dev: false - /use/3.1.1: + /use@3.1.1: resolution: {integrity: sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==} engines: {node: '>=0.10.0'} dev: false - /util-deprecate/1.0.2: + /util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} dev: false - /utils-merge/1.0.1: + /utils-merge@1.0.1: resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} engines: {node: '>= 0.4.0'} dev: false - /uuid/8.3.2: + /uuid@8.3.2: resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} hasBin: true dev: false - /v8-compile-cache-lib/3.0.1: + /v8-compile-cache-lib@3.0.1: resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} dev: true - /vary/1.1.2: + /vary@1.1.2: resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} engines: {node: '>= 0.8'} dev: false - /vite-tsconfig-paths/4.2.0_typescript@5.1.6: + /vite-tsconfig-paths@4.2.0(typescript@5.0.2): resolution: {integrity: sha512-jGpus0eUy5qbbMVGiTxCL1iB9ZGN6Bd37VGLJU39kTDD6ZfULTTb1bcc5IeTWqWJKiWV5YihCaibeASPiGi8kw==} peerDependencies: vite: '*' @@ -3241,38 +3381,38 @@ packages: dependencies: debug: 4.3.4 globrex: 0.1.2 - tsconfck: 2.1.2_typescript@5.1.6 + tsconfck: 2.1.2(typescript@5.0.2) transitivePeerDependencies: - supports-color - typescript dev: false - /webidl-conversions/3.0.1: + /webidl-conversions@3.0.1: resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} dev: false - /whatwg-url/5.0.0: + /whatwg-url@5.0.0: resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} dependencies: tr46: 0.0.3 webidl-conversions: 3.0.1 dev: false - /which/1.3.1: + /which@1.3.1: resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} hasBin: true dependencies: isexe: 2.0.0 dev: false - /widest-line/2.0.1: + /widest-line@2.0.1: resolution: {integrity: sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA==} engines: {node: '>=4'} dependencies: string-width: 2.1.1 dev: false - /wrap-ansi/7.0.0: + /wrap-ansi@7.0.0: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} engines: {node: '>=10'} dependencies: @@ -3281,11 +3421,11 @@ packages: strip-ansi: 6.0.1 dev: false - /wrappy/1.0.2: + /wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} dev: false - /write-file-atomic/2.4.3: + /write-file-atomic@2.4.3: resolution: {integrity: sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==} dependencies: graceful-fs: 4.2.11 @@ -3293,12 +3433,12 @@ packages: signal-exit: 3.0.7 dev: false - /xdg-basedir/3.0.0: + /xdg-basedir@3.0.0: resolution: {integrity: sha512-1Dly4xqlulvPD3fZUQJLY+FUIeqN3N2MM3uqe4rCJftAvOjFa3jFGfctOgluGx4ahPbUCsZkmJILiP0Vi4T6lQ==} engines: {node: '>=4'} dev: false - /xml2js/0.5.0: + /xml2js@0.5.0: resolution: {integrity: sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==} engines: {node: '>=4.0.0'} dependencies: @@ -3306,35 +3446,30 @@ packages: xmlbuilder: 11.0.1 dev: false - /xmlbuilder/11.0.1: + /xmlbuilder@11.0.1: resolution: {integrity: sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==} engines: {node: '>=4.0'} dev: false - /y18n/5.0.8: + /y18n@5.0.8: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} engines: {node: '>=10'} dev: false - /yallist/2.1.2: + /yallist@2.1.2: resolution: {integrity: sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==} dev: false - /yallist/4.0.0: + /yallist@4.0.0: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} dev: false - /yargs-parser/20.2.9: + /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'} - dev: false - - /yargs/16.2.0: + /yargs@16.2.0: resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} engines: {node: '>=10'} dependencies: @@ -3347,20 +3482,7 @@ packages: 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 - dev: false - - /yn/3.1.1: + /yn@3.1.1: resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} engines: {node: '>=6'} dev: true From 5ed0f26eb41d8e7ceac7bb668c8b0907ee392f21 Mon Sep 17 00:00:00 2001 From: anatole Date: Wed, 19 Jul 2023 00:39:57 +0200 Subject: [PATCH 315/883] feat(user controller): create userController and user grpc client service --- services/gateway/package-lock.json | 8513 ----------------- services/gateway/package.json | 9 +- .../src/controller/user/userController.ts | 31 + services/gateway/src/{index.ts => server.ts} | 3 + services/gateway/src/services/user_service.ts | 6 + services/gateway/src/utils/swagger.utils.js | 17 + services/proto/build-protos.sh | 23 + 7 files changed, 85 insertions(+), 8517 deletions(-) delete mode 100644 services/gateway/package-lock.json create mode 100644 services/gateway/src/controller/user/userController.ts rename services/gateway/src/{index.ts => server.ts} (81%) create mode 100644 services/gateway/src/services/user_service.ts create mode 100644 services/gateway/src/utils/swagger.utils.js create mode 100644 services/proto/build-protos.sh diff --git a/services/gateway/package-lock.json b/services/gateway/package-lock.json deleted file mode 100644 index 54f22426..00000000 --- a/services/gateway/package-lock.json +++ /dev/null @@ -1,8513 +0,0 @@ -{ - "name": "@goodfood/gateway", - "version": "1.0.0", - "lockfileVersion": 2, - "requires": true, - "packages": { - "": { - "name": "@goodfood/gateway", - "version": "1.0.0", - "license": "ISC", - "dependencies": { - "@grpc/grpc-js": "1.8.14", - "@grpc/proto-loader": "0.7.6", - "@types/express": "^4.17.17", - "axios": "^1.4.0", - "body-parser": "^1.20.2", - "dotenv": "^16.0.3", - "express": "^4.18.2", - "grpc-server-reflection": "^0.1.5", - "protobufjs": "^7.2.4" - }, - "bin": { - "gateway": "dist/index.js" - }, - "devDependencies": { - "@types/amqplib": "^0.10.1", - "@types/node": "^18.15.9", - "@vitest/coverage-c8": "^0.33.0", - "esbuild": "^0.17.18", - "grpc-tools": "^1.12.4", - "nodemon": "^3.0.1", - "pkg": "^5.8.1", - "ts-node": "10.9.1", - "tsconfig-paths": "^4.2.0", - "typescript": "5.0.2", - "vite-tsconfig-paths": "^4.2.0", - "vitest": "^0.33.0", - "vitest-mock-extended": "^1.1.4" - } - }, - "node_modules/@ampproject/remapping": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", - "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", - "dev": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/generator": { - "version": "7.18.2", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.2.tgz", - "integrity": "sha512-W1lG5vUwFvfMd8HVXqdfbuG7RuaSrTCCD8cl8fP8wOivdbtbIg2Db3IWUcgvfxKbbn6ZBGYRW/Zk1MIwK49mgw==", - "dev": true, - "dependencies": { - "@babel/types": "^7.18.2", - "@jridgewell/gen-mapping": "^0.3.0", - "jsesc": "^2.5.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", - "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz", - "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.18.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.4.tgz", - "integrity": "sha512-FDge0dFazETFcxGw/EXzOkN8uJp0PC7Qbm+Pe9T+av2zlBpOgunFHkQPPn+eRuClU73JF+98D531UgayY89tow==", - "dev": true, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/types": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.19.0.tgz", - "integrity": "sha512-YuGopBq3ke25BVSiS6fgF49Ul9gH1x70Bcr6bqRLjWCkcX8Hre1/5+z+IiWOIerRMSSEfGZVB9z9kyq7wVs9YA==", - "dev": true, - "dependencies": { - "@babel/helper-string-parser": "^7.18.10", - "@babel/helper-validator-identifier": "^7.18.6", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@bcoe/v8-coverage": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", - "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", - "dev": true - }, - "node_modules/@cspotcode/source-map-support": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", - "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", - "dev": true, - "dependencies": { - "@jridgewell/trace-mapping": "0.3.9" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", - "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", - "dev": true, - "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.19.tgz", - "integrity": "sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.19.tgz", - "integrity": "sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.19.tgz", - "integrity": "sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.19.tgz", - "integrity": "sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.19.tgz", - "integrity": "sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.19.tgz", - "integrity": "sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.19.tgz", - "integrity": "sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.19.tgz", - "integrity": "sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.19.tgz", - "integrity": "sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.19.tgz", - "integrity": "sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.19.tgz", - "integrity": "sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==", - "cpu": [ - "loong64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.19.tgz", - "integrity": "sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==", - "cpu": [ - "mips64el" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.19.tgz", - "integrity": "sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.19.tgz", - "integrity": "sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.19.tgz", - "integrity": "sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.19.tgz", - "integrity": "sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.19.tgz", - "integrity": "sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.19.tgz", - "integrity": "sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.19.tgz", - "integrity": "sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.19.tgz", - "integrity": "sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.19.tgz", - "integrity": "sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.19.tgz", - "integrity": "sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@grpc/grpc-js": { - "version": "1.8.14", - "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.8.14.tgz", - "integrity": "sha512-w84maJ6CKl5aApCMzFll0hxtFNT6or9WwMslobKaqWUEf1K+zhlL43bSQhFreyYWIWR+Z0xnVFC1KtLm4ZpM/A==", - "dependencies": { - "@grpc/proto-loader": "^0.7.0", - "@types/node": ">=12.12.47" - }, - "engines": { - "node": "^8.13.0 || >=10.10.0" - } - }, - "node_modules/@grpc/proto-loader": { - "version": "0.7.6", - "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.6.tgz", - "integrity": "sha512-QyAXR8Hyh7uMDmveWxDSUcJr9NAWaZ2I6IXgAYvQmfflwouTM+rArE2eEaCtLlRqO81j7pRLCt81IefUei6Zbw==", - "dependencies": { - "@types/long": "^4.0.1", - "lodash.camelcase": "^4.3.0", - "long": "^4.0.0", - "protobufjs": "^7.0.0", - "yargs": "^16.2.0" - }, - "bin": { - "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/schemas": { - "version": "29.6.0", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.0.tgz", - "integrity": "sha512-rxLjXyJBTL4LQeJW3aKo0M/+GkCOXsO+8i9Iu7eDb6KwtP65ayoDsitrdPBtujxQ88k4wI2FNYfa6TOGwSn6cQ==", - "dev": true, - "dependencies": { - "@sinclair/typebox": "^0.27.8" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", - "dev": true, - "dependencies": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", - "dev": true - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.18", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", - "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", - "dev": true, - "dependencies": { - "@jridgewell/resolve-uri": "3.1.0", - "@jridgewell/sourcemap-codec": "1.4.14" - } - }, - "node_modules/@jridgewell/trace-mapping/node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", - "dev": true - }, - "node_modules/@mapbox/node-pre-gyp": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.11.tgz", - "integrity": "sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==", - "dev": true, - "dependencies": { - "detect-libc": "^2.0.0", - "https-proxy-agent": "^5.0.0", - "make-dir": "^3.1.0", - "node-fetch": "^2.6.7", - "nopt": "^5.0.0", - "npmlog": "^5.0.1", - "rimraf": "^3.0.2", - "semver": "^7.3.5", - "tar": "^6.1.11" - }, - "bin": { - "node-pre-gyp": "bin/node-pre-gyp" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@protobufjs/aspromise": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", - "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==" - }, - "node_modules/@protobufjs/base64": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", - "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" - }, - "node_modules/@protobufjs/codegen": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", - "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" - }, - "node_modules/@protobufjs/eventemitter": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", - "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==" - }, - "node_modules/@protobufjs/fetch": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", - "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", - "dependencies": { - "@protobufjs/aspromise": "^1.1.1", - "@protobufjs/inquire": "^1.1.0" - } - }, - "node_modules/@protobufjs/float": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", - "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==" - }, - "node_modules/@protobufjs/inquire": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", - "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==" - }, - "node_modules/@protobufjs/path": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", - "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==" - }, - "node_modules/@protobufjs/pool": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", - "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==" - }, - "node_modules/@protobufjs/utf8": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", - "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==" - }, - "node_modules/@sinclair/typebox": { - "version": "0.27.8", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", - "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", - "dev": true - }, - "node_modules/@tsconfig/node10": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", - "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", - "dev": true - }, - "node_modules/@tsconfig/node12": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", - "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", - "dev": true - }, - "node_modules/@tsconfig/node14": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", - "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", - "dev": true - }, - "node_modules/@tsconfig/node16": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", - "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", - "dev": true - }, - "node_modules/@types/amqplib": { - "version": "0.10.1", - "resolved": "https://registry.npmjs.org/@types/amqplib/-/amqplib-0.10.1.tgz", - "integrity": "sha512-j6ANKT79ncUDnAs/+9r9eDujxbeJoTjoVu33gHHcaPfmLQaMhvfbH2GqSe8KUM444epAp1Vl3peVOQfZk3UIqA==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/body-parser": { - "version": "1.19.2", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", - "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", - "dependencies": { - "@types/connect": "*", - "@types/node": "*" - } - }, - "node_modules/@types/chai": { - "version": "4.3.5", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.5.tgz", - "integrity": "sha512-mEo1sAde+UCE6b2hxn332f1g1E8WfYRu6p5SvTKr2ZKC1f7gFJXk4h5PyGP9Dt6gCaG8y8XhwnXWC6Iy2cmBng==", - "dev": true - }, - "node_modules/@types/chai-subset": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/@types/chai-subset/-/chai-subset-1.3.3.tgz", - "integrity": "sha512-frBecisrNGz+F4T6bcc+NLeolfiojh5FxW2klu669+8BARtyQv2C/GkNW6FUodVe4BroGMP/wER/YDGc7rEllw==", - "dev": true, - "dependencies": { - "@types/chai": "*" - } - }, - "node_modules/@types/connect": { - "version": "3.4.35", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", - "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/express": { - "version": "4.17.17", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.17.tgz", - "integrity": "sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==", - "dependencies": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "^4.17.33", - "@types/qs": "*", - "@types/serve-static": "*" - } - }, - "node_modules/@types/express-serve-static-core": { - "version": "4.17.35", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.35.tgz", - "integrity": "sha512-wALWQwrgiB2AWTT91CB62b6Yt0sNHpznUXeZEcnPU3DRdlDIz74x8Qg1UUYKSVFi+va5vKOLYRBI1bRKiLLKIg==", - "dependencies": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*", - "@types/send": "*" - } - }, - "node_modules/@types/http-errors": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.1.tgz", - "integrity": "sha512-/K3ds8TRAfBvi5vfjuz8y6+GiAYBZ0x4tXv1Av6CWBWn0IlADc+ZX9pMq7oU0fNQPnBwIZl3rmeLp6SBApbxSQ==" - }, - "node_modules/@types/istanbul-lib-coverage": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", - "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", - "dev": true - }, - "node_modules/@types/long": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz", - "integrity": "sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==" - }, - "node_modules/@types/mime": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", - "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==" - }, - "node_modules/@types/node": { - "version": "18.15.9", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.9.tgz", - "integrity": "sha512-dUxhiNzBLr6IqlZXz6e/rN2YQXlFgOei/Dxy+e3cyXTJ4txSUbGT2/fmnD6zd/75jDMeW5bDee+YXxlFKHoV0A==" - }, - "node_modules/@types/qs": { - "version": "6.9.7", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", - "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==" - }, - "node_modules/@types/range-parser": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", - "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==" - }, - "node_modules/@types/send": { - "version": "0.17.1", - "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.1.tgz", - "integrity": "sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q==", - "dependencies": { - "@types/mime": "^1", - "@types/node": "*" - } - }, - "node_modules/@types/serve-static": { - "version": "1.15.2", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.2.tgz", - "integrity": "sha512-J2LqtvFYCzaj8pVYKw8klQXrLLk7TBZmQ4ShlcdkELFKGwGMfevMLneMMRkMgZxotOD9wg497LpC7O8PcvAmfw==", - "dependencies": { - "@types/http-errors": "*", - "@types/mime": "*", - "@types/node": "*" - } - }, - "node_modules/@vitest/coverage-c8": { - "version": "0.33.0", - "resolved": "https://registry.npmjs.org/@vitest/coverage-c8/-/coverage-c8-0.33.0.tgz", - "integrity": "sha512-DaF1zJz4dcOZS4k/neiQJokmOWqsGXwhthfmUdPGorXIQHjdPvV6JQSYhQDI41MyI8c+IieQUdIDs5XAMHtDDw==", - "dev": true, - "dependencies": { - "@ampproject/remapping": "^2.2.1", - "c8": "^7.14.0", - "magic-string": "^0.30.1", - "picocolors": "^1.0.0", - "std-env": "^3.3.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "vitest": ">=0.30.0 <1" - } - }, - "node_modules/@vitest/expect": { - "version": "0.33.0", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-0.33.0.tgz", - "integrity": "sha512-sVNf+Gla3mhTCxNJx+wJLDPp/WcstOe0Ksqz4Vec51MmgMth/ia0MGFEkIZmVGeTL5HtjYR4Wl/ZxBxBXZJTzQ==", - "dev": true, - "dependencies": { - "@vitest/spy": "0.33.0", - "@vitest/utils": "0.33.0", - "chai": "^4.3.7" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/runner": { - "version": "0.33.0", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-0.33.0.tgz", - "integrity": "sha512-UPfACnmCB6HKRHTlcgCoBh6ppl6fDn+J/xR8dTufWiKt/74Y9bHci5CKB8tESSV82zKYtkBJo9whU3mNvfaisg==", - "dev": true, - "dependencies": { - "@vitest/utils": "0.33.0", - "p-limit": "^4.0.0", - "pathe": "^1.1.1" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/runner/node_modules/p-limit": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", - "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", - "dev": true, - "dependencies": { - "yocto-queue": "^1.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@vitest/runner/node_modules/yocto-queue": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", - "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", - "dev": true, - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@vitest/snapshot": { - "version": "0.33.0", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-0.33.0.tgz", - "integrity": "sha512-tJjrl//qAHbyHajpFvr8Wsk8DIOODEebTu7pgBrP07iOepR5jYkLFiqLq2Ltxv+r0uptUb4izv1J8XBOwKkVYA==", - "dev": true, - "dependencies": { - "magic-string": "^0.30.1", - "pathe": "^1.1.1", - "pretty-format": "^29.5.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/spy": { - "version": "0.33.0", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-0.33.0.tgz", - "integrity": "sha512-Kv+yZ4hnH1WdiAkPUQTpRxW8kGtH8VRTnus7ZTGovFYM1ZezJpvGtb9nPIjPnptHbsyIAxYZsEpVPYgtpjGnrg==", - "dev": true, - "dependencies": { - "tinyspy": "^2.1.1" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/utils": { - "version": "0.33.0", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-0.33.0.tgz", - "integrity": "sha512-pF1w22ic965sv+EN6uoePkAOTkAPWM03Ri/jXNyMIKBb/XHLDPfhLvf/Fa9g0YECevAIz56oVYXhodLvLQ/awA==", - "dev": true, - "dependencies": { - "diff-sequences": "^29.4.3", - "loupe": "^2.3.6", - "pretty-format": "^29.5.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "dev": true - }, - "node_modules/accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/acorn": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", - "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-walk": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", - "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dev": true, - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/aproba": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", - "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", - "dev": true - }, - "node_modules/are-we-there-yet": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", - "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", - "dev": true, - "dependencies": { - "delegates": "^1.0.0", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true - }, - "node_modules/array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" - }, - "node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/assertion-error": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", - "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" - }, - "node_modules/at-least-node": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", - "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", - "dev": true, - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/axios": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.4.0.tgz", - "integrity": "sha512-S4XCWMEmzvo64T9GfvQDOXgYRDJ/wsSZc7Jvdgx5u1sd0JwsuPLqb3SYmusag+edF6ziyMensPVqLTSc1PiSEA==", - "dependencies": { - "follow-redirects": "^1.15.0", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "dev": true, - "dependencies": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, - "node_modules/body-parser": { - "version": "1.20.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", - "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", - "dependencies": { - "bytes": "3.1.2", - "content-type": "~1.0.5", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.11.0", - "raw-body": "2.5.2", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/body-parser/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/body-parser/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/c8": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/c8/-/c8-7.14.0.tgz", - "integrity": "sha512-i04rtkkcNcCf7zsQcSv/T9EbUn4RXQ6mropeMcjFOsQXQ0iGLAr/xT6TImQg4+U9hmNpN9XdvPkjUL1IzbgxJw==", - "dev": true, - "dependencies": { - "@bcoe/v8-coverage": "^0.2.3", - "@istanbuljs/schema": "^0.1.3", - "find-up": "^5.0.0", - "foreground-child": "^2.0.0", - "istanbul-lib-coverage": "^3.2.0", - "istanbul-lib-report": "^3.0.0", - "istanbul-reports": "^3.1.4", - "rimraf": "^3.0.2", - "test-exclude": "^6.0.0", - "v8-to-istanbul": "^9.0.0", - "yargs": "^16.2.0", - "yargs-parser": "^20.2.9" - }, - "bin": { - "c8": "bin/c8.js" - }, - "engines": { - "node": ">=10.12.0" - } - }, - "node_modules/cac": { - "version": "6.7.14", - "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", - "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/chai": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.7.tgz", - "integrity": "sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==", - "dev": true, - "dependencies": { - "assertion-error": "^1.1.0", - "check-error": "^1.0.2", - "deep-eql": "^4.1.2", - "get-func-name": "^2.0.0", - "loupe": "^2.3.1", - "pathval": "^1.1.1", - "type-detect": "^4.0.5" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/check-error": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", - "integrity": "sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/color-support": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", - "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", - "dev": true, - "bin": { - "color-support": "bin.js" - } - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true - }, - "node_modules/console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", - "dev": true - }, - "node_modules/content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", - "dependencies": { - "safe-buffer": "5.2.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", - "dev": true - }, - "node_modules/cookie": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", - "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" - }, - "node_modules/core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "dev": true - }, - "node_modules/create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "dev": true - }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decompress-response": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", - "dev": true, - "dependencies": { - "mimic-response": "^3.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/deep-eql": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz", - "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==", - "dev": true, - "dependencies": { - "type-detect": "^4.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "dev": true, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", - "dev": true - }, - "node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/detect-libc": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz", - "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true, - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/diff-sequences": { - "version": "29.4.3", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.4.3.tgz", - "integrity": "sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA==", - "dev": true, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/dotenv": { - "version": "16.3.1", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.3.1.tgz", - "integrity": "sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/motdotla/dotenv?sponsor=1" - } - }, - "node_modules/ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" - }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dev": true, - "dependencies": { - "once": "^1.4.0" - } - }, - "node_modules/esbuild": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.19.tgz", - "integrity": "sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==", - "dev": true, - "hasInstallScript": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/android-arm": "0.17.19", - "@esbuild/android-arm64": "0.17.19", - "@esbuild/android-x64": "0.17.19", - "@esbuild/darwin-arm64": "0.17.19", - "@esbuild/darwin-x64": "0.17.19", - "@esbuild/freebsd-arm64": "0.17.19", - "@esbuild/freebsd-x64": "0.17.19", - "@esbuild/linux-arm": "0.17.19", - "@esbuild/linux-arm64": "0.17.19", - "@esbuild/linux-ia32": "0.17.19", - "@esbuild/linux-loong64": "0.17.19", - "@esbuild/linux-mips64el": "0.17.19", - "@esbuild/linux-ppc64": "0.17.19", - "@esbuild/linux-riscv64": "0.17.19", - "@esbuild/linux-s390x": "0.17.19", - "@esbuild/linux-x64": "0.17.19", - "@esbuild/netbsd-x64": "0.17.19", - "@esbuild/openbsd-x64": "0.17.19", - "@esbuild/sunos-x64": "0.17.19", - "@esbuild/win32-arm64": "0.17.19", - "@esbuild/win32-ia32": "0.17.19", - "@esbuild/win32-x64": "0.17.19" - } - }, - "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" - }, - "node_modules/etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/expand-template": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", - "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/express": { - "version": "4.18.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", - "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", - "dependencies": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.1", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.5.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.2.0", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.7", - "qs": "6.11.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.18.0", - "serve-static": "1.15.0", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/express/node_modules/body-parser": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", - "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", - "dependencies": { - "bytes": "3.1.2", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.11.0", - "raw-body": "2.5.1", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/express/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/express/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/express/node_modules/raw-body": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", - "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", - "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/fast-glob": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.0.tgz", - "integrity": "sha512-ChDuvbOypPuNjO8yIDf36x7BlZX1smcUMTTcyoIjycexOxd6DFsKsg21qVBzEmr3G7fUKIRy2/psii+CIUt7FA==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fastq": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", - "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", - "dev": true, - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/finalhandler": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/finalhandler/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/finalhandler/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/follow-redirects": { - "version": "1.15.2", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", - "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "node_modules/foreground-child": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", - "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/from2": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", - "integrity": "sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==", - "dev": true, - "dependencies": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.0" - } - }, - "node_modules/from2/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dev": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/from2/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "node_modules/from2/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/fs-constants": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", - "dev": true - }, - "node_modules/fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "dev": true, - "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "dev": true, - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/fs-minipass/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true - }, - "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" - }, - "node_modules/gauge": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", - "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", - "dev": true, - "dependencies": { - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.2", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.1", - "object-assign": "^4.1.1", - "signal-exit": "^3.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wide-align": "^1.1.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-func-name": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", - "integrity": "sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/get-intrinsic": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", - "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", - "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/github-from-package": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", - "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==", - "dev": true - }, - "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/globrex": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz", - "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==", - "dev": true - }, - "node_modules/google-protobuf": { - "version": "3.21.2", - "resolved": "https://registry.npmjs.org/google-protobuf/-/google-protobuf-3.21.2.tgz", - "integrity": "sha512-3MSOYFO5U9mPGikIYCzK0SaThypfGgS6bHqrUGXG3DPHCrb+txNqeEcns1W0lkGfk0rCyNXm7xB9rMxnCiZOoA==" - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true - }, - "node_modules/grpc-server-reflection": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/grpc-server-reflection/-/grpc-server-reflection-0.1.5.tgz", - "integrity": "sha512-i69RYu6v65enzknNAPUgerFuVQfo+L3n9g4c1A/Sv5jUHMpxMIjSbBA+YWls9Sr4Flac4oohp4Gx8f389CaHuw==", - "dependencies": { - "google-protobuf": "^3.19.1" - } - }, - "node_modules/grpc-tools": { - "version": "1.12.4", - "resolved": "https://registry.npmjs.org/grpc-tools/-/grpc-tools-1.12.4.tgz", - "integrity": "sha512-5+mLAJJma3BjnW/KQp6JBjUMgvu7Mu3dBvBPd1dcbNIb+qiR0817zDpgPjS7gRb+l/8EVNIa3cB02xI9JLToKg==", - "dev": true, - "hasInstallScript": true, - "dependencies": { - "@mapbox/node-pre-gyp": "^1.0.5" - }, - "bin": { - "grpc_tools_node_protoc": "bin/protoc.js", - "grpc_tools_node_protoc_plugin": "bin/protoc_plugin.js" - } - }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/has-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", - "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", - "dev": true - }, - "node_modules/html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true - }, - "node_modules/http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "dev": true, - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/ignore": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", - "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/ignore-by-default": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", - "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==", - "dev": true - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dev": true, - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true - }, - "node_modules/into-stream": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/into-stream/-/into-stream-6.0.0.tgz", - "integrity": "sha512-XHbaOAvP+uFKUFsOgoNPRjLkwB+I22JFPFe5OjTkQ0nwgj6+pSjb4NmB6VMxaPshLiOf+zcpOCBQuLwC1KHhZA==", - "dev": true, - "dependencies": { - "from2": "^2.3.0", - "p-is-promise": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-core-module": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz", - "integrity": "sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==", - "dev": true, - "dependencies": { - "has": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "node_modules/istanbul-lib-coverage": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", - "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", - "dev": true, - "dependencies": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^3.0.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-reports": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", - "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", - "dev": true, - "dependencies": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true, - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true, - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/jsonc-parser": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", - "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", - "dev": true - }, - "node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/local-pkg": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.4.3.tgz", - "integrity": "sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==", - "dev": true, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lodash.camelcase": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", - "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==" - }, - "node_modules/long": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", - "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" - }, - "node_modules/loupe": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.6.tgz", - "integrity": "sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==", - "dev": true, - "dependencies": { - "get-func-name": "^2.0.0" - } - }, - "node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/magic-string": { - "version": "0.30.1", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.1.tgz", - "integrity": "sha512-mbVKXPmS0z0G4XqFDCTllmDQ6coZzn94aMlb0o/A4HEHJCKcanlDZwYJgwnkmgD3jyWhUgj9VsPrfd972yPffA==", - "dev": true, - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.4.15" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, - "dependencies": { - "semver": "^6.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/make-dir/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true - }, - "node_modules/media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mimic-response": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/minipass": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/minizlib": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", - "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", - "dev": true, - "dependencies": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/minizlib/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true, - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/mkdirp-classic": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", - "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", - "dev": true - }, - "node_modules/mlly": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.4.0.tgz", - "integrity": "sha512-ua8PAThnTwpprIaU47EPeZ/bPUVp2QYBbWMphUQpVdBI3Lgqzm5KZQ45Agm3YJedHXaIHl6pBGabaLSUPPSptg==", - "dev": true, - "dependencies": { - "acorn": "^8.9.0", - "pathe": "^1.1.1", - "pkg-types": "^1.0.3", - "ufo": "^1.1.2" - } - }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "node_modules/multistream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/multistream/-/multistream-4.1.0.tgz", - "integrity": "sha512-J1XDiAmmNpRCBfIWJv+n0ymC4ABcf/Pl+5YvC5B/D2f/2+8PtHvCNxMPKiQcZyi922Hq69J2YOpb1pTywfifyw==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "once": "^1.4.0", - "readable-stream": "^3.6.0" - } - }, - "node_modules/nanoid": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", - "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/napi-build-utils": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", - "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==", - "dev": true - }, - "node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/node-abi": { - "version": "3.45.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.45.0.tgz", - "integrity": "sha512-iwXuFrMAcFVi/ZoZiqq8BzAdsLw9kxDfTC0HMyjXfSL/6CSDAGD5UmR7azrAgWV1zKYq7dUUMj4owusBWKLsiQ==", - "dev": true, - "dependencies": { - "semver": "^7.3.5" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/node-fetch": { - "version": "2.6.12", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.12.tgz", - "integrity": "sha512-C/fGU2E8ToujUivIO0H+tpQ6HWo4eEmchoPIoXtxCrVghxdKq+QOHqEZW7tuP3KlV3bC8FRMO5nMCC7Zm1VP6g==", - "dev": true, - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/nodemon": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.0.1.tgz", - "integrity": "sha512-g9AZ7HmkhQkqXkRc20w+ZfQ73cHLbE8hnPbtaFbFtCumZsjyMhKk9LajQ07U5Ux28lvFjZ5X7HvWR1xzU8jHVw==", - "dev": true, - "dependencies": { - "chokidar": "^3.5.2", - "debug": "^3.2.7", - "ignore-by-default": "^1.0.1", - "minimatch": "^3.1.2", - "pstree.remy": "^1.1.8", - "semver": "^7.5.3", - "simple-update-notifier": "^2.0.0", - "supports-color": "^5.5.0", - "touch": "^3.1.0", - "undefsafe": "^2.0.5" - }, - "bin": { - "nodemon": "bin/nodemon.js" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/nodemon" - } - }, - "node_modules/nodemon/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/nodemon/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/nodemon/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/nopt": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", - "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", - "dev": true, - "dependencies": { - "abbrev": "1" - }, - "bin": { - "nopt": "bin/nopt.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npmlog": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", - "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", - "dev": true, - "dependencies": { - "are-we-there-yet": "^2.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^3.0.0", - "set-blocking": "^2.0.0" - } - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-inspect": { - "version": "1.12.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", - "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/p-is-promise": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-3.0.0.tgz", - "integrity": "sha512-Wo8VsW4IRQSKVXsJCn7TomUaVtyfjVDn3nUP7kE967BQk0CwFpdbZs0X0uk5sW9mkBa9eNM7hCMaG93WUAwxYQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "node_modules/path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" - }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/pathe": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.1.tgz", - "integrity": "sha512-d+RQGp0MAYTIaDBIMmOfMwz3E+LOZnxx1HZd5R18mmCZY0QBlK0LDZfPc8FW8Ed2DlvsuE6PRjroDY+wg4+j/Q==", - "dev": true - }, - "node_modules/pathval": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", - "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pkg": { - "version": "5.8.1", - "resolved": "https://registry.npmjs.org/pkg/-/pkg-5.8.1.tgz", - "integrity": "sha512-CjBWtFStCfIiT4Bde9QpJy0KeH19jCfwZRJqHFDFXfhUklCx8JoFmMj3wgnEYIwGmZVNkhsStPHEOnrtrQhEXA==", - "dev": true, - "dependencies": { - "@babel/generator": "7.18.2", - "@babel/parser": "7.18.4", - "@babel/types": "7.19.0", - "chalk": "^4.1.2", - "fs-extra": "^9.1.0", - "globby": "^11.1.0", - "into-stream": "^6.0.0", - "is-core-module": "2.9.0", - "minimist": "^1.2.6", - "multistream": "^4.1.0", - "pkg-fetch": "3.4.2", - "prebuild-install": "7.1.1", - "resolve": "^1.22.0", - "stream-meter": "^1.0.4" - }, - "bin": { - "pkg": "lib-es5/bin.js" - }, - "peerDependencies": { - "node-notifier": ">=9.0.1" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/pkg-fetch": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/pkg-fetch/-/pkg-fetch-3.4.2.tgz", - "integrity": "sha512-0+uijmzYcnhC0hStDjm/cl2VYdrmVVBpe7Q8k9YBojxmR5tG8mvR9/nooQq3QSXiQqORDVOTY3XqMEqJVIzkHA==", - "dev": true, - "dependencies": { - "chalk": "^4.1.2", - "fs-extra": "^9.1.0", - "https-proxy-agent": "^5.0.0", - "node-fetch": "^2.6.6", - "progress": "^2.0.3", - "semver": "^7.3.5", - "tar-fs": "^2.1.1", - "yargs": "^16.2.0" - }, - "bin": { - "pkg-fetch": "lib-es5/bin.js" - } - }, - "node_modules/pkg-types": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.0.3.tgz", - "integrity": "sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==", - "dev": true, - "dependencies": { - "jsonc-parser": "^3.2.0", - "mlly": "^1.2.0", - "pathe": "^1.1.0" - } - }, - "node_modules/postcss": { - "version": "8.4.26", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.26.tgz", - "integrity": "sha512-jrXHFF8iTloAenySjM/ob3gSj7pCu0Ji49hnjqzsgSRa50hkWCKD0HQ+gMNJkW38jBI68MpAAg7ZWwHwX8NMMw==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "nanoid": "^3.3.6", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/prebuild-install": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.1.tgz", - "integrity": "sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==", - "dev": true, - "dependencies": { - "detect-libc": "^2.0.0", - "expand-template": "^2.0.3", - "github-from-package": "0.0.0", - "minimist": "^1.2.3", - "mkdirp-classic": "^0.5.3", - "napi-build-utils": "^1.0.1", - "node-abi": "^3.3.0", - "pump": "^3.0.0", - "rc": "^1.2.7", - "simple-get": "^4.0.0", - "tar-fs": "^2.0.0", - "tunnel-agent": "^0.6.0" - }, - "bin": { - "prebuild-install": "bin.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/pretty-format": { - "version": "29.6.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.1.tgz", - "integrity": "sha512-7jRj+yXO0W7e4/tSJKoR7HRIHLPPjtNaUGG2xxKQnGvPNRkgWcQ0AZX6P4KBRJN4FcTBWb3sa7DVUJmocYuoog==", - "dev": true, - "dependencies": { - "@jest/schemas": "^29.6.0", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/pretty-format/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true - }, - "node_modules/progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/protobufjs": { - "version": "7.2.4", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.2.4.tgz", - "integrity": "sha512-AT+RJgD2sH8phPmCf7OUZR8xGdcJRga4+1cOaXJ64hvcSkVhNcRHOwIxUatPH15+nj59WAGTDv3LSGZPEQbJaQ==", - "hasInstallScript": true, - "dependencies": { - "@protobufjs/aspromise": "^1.1.2", - "@protobufjs/base64": "^1.1.2", - "@protobufjs/codegen": "^2.0.4", - "@protobufjs/eventemitter": "^1.1.0", - "@protobufjs/fetch": "^1.1.0", - "@protobufjs/float": "^1.0.2", - "@protobufjs/inquire": "^1.1.0", - "@protobufjs/path": "^1.1.2", - "@protobufjs/pool": "^1.1.0", - "@protobufjs/utf8": "^1.1.0", - "@types/node": ">=13.7.0", - "long": "^5.0.0" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/protobufjs/node_modules/long": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", - "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==" - }, - "node_modules/proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "dependencies": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" - }, - "node_modules/pstree.remy": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", - "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", - "dev": true - }, - "node_modules/pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "node_modules/qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", - "dependencies": { - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/raw-body": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", - "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", - "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "dev": true, - "dependencies": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "bin": { - "rc": "cli.js" - } - }, - "node_modules/react-is": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", - "dev": true - }, - "node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/resolve": { - "version": "1.22.2", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", - "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", - "dev": true, - "dependencies": { - "is-core-module": "^2.11.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve/node_modules/is-core-module": { - "version": "2.12.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz", - "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==", - "dev": true, - "dependencies": { - "has": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true, - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rollup": { - "version": "3.26.2", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.26.2.tgz", - "integrity": "sha512-6umBIGVz93er97pMgQO08LuH3m6PUb3jlDUUGFsNJB6VgTCUaDFpupf5JfU30529m/UKOgmiX+uY6Sx8cOYpLA==", - "dev": true, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=14.18.0", - "npm": ">=8.0.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/send": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", - "dependencies": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.0.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/send/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/send/node_modules/debug/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/send/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - }, - "node_modules/serve-static": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", - "dependencies": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.18.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", - "dev": true - }, - "node_modules/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/siginfo": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", - "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", - "dev": true - }, - "node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, - "node_modules/simple-concat": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", - "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/simple-get": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", - "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "decompress-response": "^6.0.0", - "once": "^1.3.1", - "simple-concat": "^1.0.0" - } - }, - "node_modules/simple-update-notifier": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", - "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==", - "dev": true, - "dependencies": { - "semver": "^7.5.3" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/stackback": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", - "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", - "dev": true - }, - "node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/std-env": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.3.3.tgz", - "integrity": "sha512-Rz6yejtVyWnVjC1RFvNmYL10kgjC49EOghxWn0RFqlCHGFpQx+Xe7yW3I4ceK1SGrWIGMjD5Kbue8W/udkbMJg==", - "dev": true - }, - "node_modules/stream-meter": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/stream-meter/-/stream-meter-1.0.4.tgz", - "integrity": "sha512-4sOEtrbgFotXwnEuzzsQBYEV1elAeFSO8rSGeTwabuX1RRn/kEq9JVH7I0MRBhKVRR0sJkr0M0QCH7yOLf9fhQ==", - "dev": true, - "dependencies": { - "readable-stream": "^2.1.4" - } - }, - "node_modules/stream-meter/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dev": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/stream-meter/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "node_modules/stream-meter/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/strip-literal": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-1.0.1.tgz", - "integrity": "sha512-QZTsipNpa2Ppr6v1AmJHESqJ3Uz247MUS0OjrnnZjFAvEoWqxuyFuXn2xLgMtRnijJShAa1HL0gtJyUs7u7n3Q==", - "dev": true, - "dependencies": { - "acorn": "^8.8.2" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/tar": { - "version": "6.1.15", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.15.tgz", - "integrity": "sha512-/zKt9UyngnxIT/EAGYuxaMYgOIJiP81ab9ZfkILq4oNLPFX50qyYmu7jRj9qeXoxmJHjGlbH0+cm2uy1WCs10A==", - "dev": true, - "dependencies": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^5.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/tar-fs": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", - "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", - "dev": true, - "dependencies": { - "chownr": "^1.1.1", - "mkdirp-classic": "^0.5.2", - "pump": "^3.0.0", - "tar-stream": "^2.1.4" - } - }, - "node_modules/tar-fs/node_modules/chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", - "dev": true - }, - "node_modules/tar-stream": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", - "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", - "dev": true, - "dependencies": { - "bl": "^4.0.3", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", - "dev": true, - "dependencies": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/tinybench": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.5.0.tgz", - "integrity": "sha512-kRwSG8Zx4tjF9ZiyH4bhaebu+EDz1BOx9hOigYHlUW4xxI/wKIUQUqo018UlU4ar6ATPBsaMrdbKZ+tmPdohFA==", - "dev": true - }, - "node_modules/tinypool": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-0.6.0.tgz", - "integrity": "sha512-FdswUUo5SxRizcBc6b1GSuLpLjisa8N8qMyYoP3rl+bym+QauhtJP5bvZY1ytt8krKGmMLYIRl36HBZfeAoqhQ==", - "dev": true, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/tinyspy": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-2.1.1.tgz", - "integrity": "sha512-XPJL2uSzcOyBMky6OFrusqWlzfFrXtE0hPuMgW8A2HmaqrPo4ZQHRN/V0QXN3FSjKxpsbRrFc5LI7KOwBsT1/w==", - "dev": true, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/touch": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", - "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", - "dev": true, - "dependencies": { - "nopt": "~1.0.10" - }, - "bin": { - "nodetouch": "bin/nodetouch.js" - } - }, - "node_modules/touch/node_modules/nopt": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", - "integrity": "sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==", - "dev": true, - "dependencies": { - "abbrev": "1" - }, - "bin": { - "nopt": "bin/nopt.js" - }, - "engines": { - "node": "*" - } - }, - "node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "dev": true - }, - "node_modules/ts-essentials": { - "version": "9.3.2", - "resolved": "https://registry.npmjs.org/ts-essentials/-/ts-essentials-9.3.2.tgz", - "integrity": "sha512-JxKJzuWqH1MmH4ZFHtJzGEhkfN3QvVR3C3w+4BIoWeoY68UVVoA2Np/Bca9z0IPSErVCWhv439aT0We4Dks8kQ==", - "dev": true, - "peerDependencies": { - "typescript": ">=4.1.0" - } - }, - "node_modules/ts-node": { - "version": "10.9.1", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", - "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", - "dev": true, - "dependencies": { - "@cspotcode/source-map-support": "^0.8.0", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "v8-compile-cache-lib": "^3.0.1", - "yn": "3.1.1" - }, - "bin": { - "ts-node": "dist/bin.js", - "ts-node-cwd": "dist/bin-cwd.js", - "ts-node-esm": "dist/bin-esm.js", - "ts-node-script": "dist/bin-script.js", - "ts-node-transpile-only": "dist/bin-transpile.js", - "ts-script": "dist/bin-script-deprecated.js" - }, - "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 - } - } - }, - "node_modules/tsconfck": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/tsconfck/-/tsconfck-2.1.1.tgz", - "integrity": "sha512-ZPCkJBKASZBmBUNqGHmRhdhM8pJYDdOXp4nRgj/O0JwUwsMq50lCDRQP/M5GBNAA0elPrq4gAeu4dkaVCuKWww==", - "dev": true, - "bin": { - "tsconfck": "bin/tsconfck.js" - }, - "engines": { - "node": "^14.13.1 || ^16 || >=18" - }, - "peerDependencies": { - "typescript": "^4.3.5 || ^5.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/tsconfig-paths": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", - "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==", - "dev": true, - "dependencies": { - "json5": "^2.2.2", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", - "dev": true, - "dependencies": { - "safe-buffer": "^5.0.1" - }, - "engines": { - "node": "*" - } - }, - "node_modules/type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/typescript": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.2.tgz", - "integrity": "sha512-wVORMBGO/FAs/++blGNeAVdbNKtIh1rbBL2EyQ1+J9lClJ93KiiKe8PmFIVdXhHcyv44SL9oglmfeSsndo0jRw==", - "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=12.20" - } - }, - "node_modules/ufo": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.1.2.tgz", - "integrity": "sha512-TrY6DsjTQQgyS3E3dBaOXf0TpPD8u9FVrVYmKVegJuFw51n/YB9XPt+U6ydzFG5ZIN7+DIjPbNmXoBj9esYhgQ==", - "dev": true - }, - "node_modules/undefsafe": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", - "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", - "dev": true - }, - "node_modules/universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true - }, - "node_modules/utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/v8-compile-cache-lib": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", - "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", - "dev": true - }, - "node_modules/v8-to-istanbul": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.1.0.tgz", - "integrity": "sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA==", - "dev": true, - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.12", - "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^1.6.0" - }, - "engines": { - "node": ">=10.12.0" - } - }, - "node_modules/vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/vite": { - "version": "4.4.4", - "resolved": "https://registry.npmjs.org/vite/-/vite-4.4.4.tgz", - "integrity": "sha512-4mvsTxjkveWrKDJI70QmelfVqTm+ihFAb6+xf4sjEU2TmUCTlVX87tmg/QooPEMQb/lM9qGHT99ebqPziEd3wg==", - "dev": true, - "dependencies": { - "esbuild": "^0.18.10", - "postcss": "^8.4.25", - "rollup": "^3.25.2" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - }, - "peerDependencies": { - "@types/node": ">= 14", - "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 - } - } - }, - "node_modules/vite-node": { - "version": "0.33.0", - "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-0.33.0.tgz", - "integrity": "sha512-19FpHYbwWWxDr73ruNahC+vtEdza52kA90Qb3La98yZ0xULqV8A5JLNPUff0f5zID4984tW7l3DH2przTJUZSw==", - "dev": true, - "dependencies": { - "cac": "^6.7.14", - "debug": "^4.3.4", - "mlly": "^1.4.0", - "pathe": "^1.1.1", - "picocolors": "^1.0.0", - "vite": "^3.0.0 || ^4.0.0" - }, - "bin": { - "vite-node": "vite-node.mjs" - }, - "engines": { - "node": ">=v14.18.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/vite-tsconfig-paths": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/vite-tsconfig-paths/-/vite-tsconfig-paths-4.2.0.tgz", - "integrity": "sha512-jGpus0eUy5qbbMVGiTxCL1iB9ZGN6Bd37VGLJU39kTDD6ZfULTTb1bcc5IeTWqWJKiWV5YihCaibeASPiGi8kw==", - "dev": true, - "dependencies": { - "debug": "^4.1.1", - "globrex": "^0.1.2", - "tsconfck": "^2.1.0" - }, - "peerDependencies": { - "vite": "*" - }, - "peerDependenciesMeta": { - "vite": { - "optional": true - } - } - }, - "node_modules/vite/node_modules/@esbuild/android-arm": { - "version": "0.18.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.12.tgz", - "integrity": "sha512-LIxaNIQfkFZbTLb4+cX7dozHlAbAshhFE5PKdro0l+FnCpx1GDJaQ2WMcqm+ToXKMt8p8Uojk/MFRuGyz3V5Sw==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/android-arm64": { - "version": "0.18.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.12.tgz", - "integrity": "sha512-BMAlczRqC/LUt2P97E4apTBbkvS9JTJnp2DKFbCwpZ8vBvXVbNdqmvzW/OsdtI/+mGr+apkkpqGM8WecLkPgrA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/android-x64": { - "version": "0.18.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.12.tgz", - "integrity": "sha512-zU5MyluNsykf5cOJ0LZZZjgAHbhPJ1cWfdH1ZXVMXxVMhEV0VZiZXQdwBBVvmvbF28EizeK7obG9fs+fpmS0eQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/darwin-arm64": { - "version": "0.18.12", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.12.tgz", - "integrity": "sha512-zUZMep7YONnp6954QOOwEBwFX9svlKd3ov6PkxKd53LGTHsp/gy7vHaPGhhjBmEpqXEXShi6dddjIkmd+NgMsA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/darwin-x64": { - "version": "0.18.12", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.12.tgz", - "integrity": "sha512-ohqLPc7i67yunArPj1+/FeeJ7AgwAjHqKZ512ADk3WsE3FHU9l+m5aa7NdxXr0HmN1bjDlUslBjWNbFlD9y12Q==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/freebsd-arm64": { - "version": "0.18.12", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.12.tgz", - "integrity": "sha512-GIIHtQXqgeOOqdG16a/A9N28GpkvjJnjYMhOnXVbn3EDJcoItdR58v/pGN31CHjyXDc8uCcRnFWmqaJt24AYJg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/freebsd-x64": { - "version": "0.18.12", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.12.tgz", - "integrity": "sha512-zK0b9a1/0wZY+6FdOS3BpZcPc1kcx2G5yxxfEJtEUzVxI6n/FrC2Phsxj/YblPuBchhBZ/1wwn7AyEBUyNSa6g==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-arm": { - "version": "0.18.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.12.tgz", - "integrity": "sha512-y75OijvrBE/1XRrXq1jtrJfG26eHeMoqLJ2dwQNwviwTuTtHGCojsDO6BJNF8gU+3jTn1KzJEMETytwsFSvc+Q==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-arm64": { - "version": "0.18.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.12.tgz", - "integrity": "sha512-JKgG8Q/LL/9sw/iHHxQyVMoQYu3rU3+a5Z87DxC+wAu3engz+EmctIrV+FGOgI6gWG1z1+5nDDbXiRMGQZXqiw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-ia32": { - "version": "0.18.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.12.tgz", - "integrity": "sha512-yoRIAqc0B4lDIAAEFEIu9ttTRFV84iuAl0KNCN6MhKLxNPfzwCBvEMgwco2f71GxmpBcTtn7KdErueZaM2rEvw==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-loong64": { - "version": "0.18.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.12.tgz", - "integrity": "sha512-qYgt3dHPVvf/MgbIBpJ4Sup/yb9DAopZ3a2JgMpNKIHUpOdnJ2eHBo/aQdnd8dJ21X/+sS58wxHtA9lEazYtXQ==", - "cpu": [ - "loong64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-mips64el": { - "version": "0.18.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.12.tgz", - "integrity": "sha512-wHphlMLK4ufNOONqukELfVIbnGQJrHJ/mxZMMrP2jYrPgCRZhOtf0kC4yAXBwnfmULimV1qt5UJJOw4Kh13Yfg==", - "cpu": [ - "mips64el" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-ppc64": { - "version": "0.18.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.12.tgz", - "integrity": "sha512-TeN//1Ft20ZZW41+zDSdOI/Os1bEq5dbvBvYkberB7PHABbRcsteeoNVZFlI0YLpGdlBqohEpjrn06kv8heCJg==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-riscv64": { - "version": "0.18.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.12.tgz", - "integrity": "sha512-AgUebVS4DoAblBgiB2ACQ/8l4eGE5aWBb8ZXtkXHiET9mbj7GuWt3OnsIW/zX+XHJt2RYJZctbQ2S/mDjbp0UA==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-s390x": { - "version": "0.18.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.12.tgz", - "integrity": "sha512-dJ3Rb3Ei2u/ysSXd6pzleGtfDdc2MuzKt8qc6ls8vreP1G3B7HInX3i7gXS4BGeVd24pp0yqyS7bJ5NHaI9ing==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-x64": { - "version": "0.18.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.12.tgz", - "integrity": "sha512-OrNJMGQbPaVyHHcDF8ybNSwu7TDOfX8NGpXCbetwOSP6txOJiWlgQnRymfC9ocR1S0Y5PW0Wb1mV6pUddqmvmQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/netbsd-x64": { - "version": "0.18.12", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.12.tgz", - "integrity": "sha512-55FzVCAiwE9FK8wWeCRuvjazNRJ1QqLCYGZVB6E8RuQuTeStSwotpSW4xoRGwp3a1wUsaVCdYcj5LGCASVJmMg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/openbsd-x64": { - "version": "0.18.12", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.12.tgz", - "integrity": "sha512-qnluf8rfb6Y5Lw2tirfK2quZOBbVqmwxut7GPCIJsM8lc4AEUj9L8y0YPdLaPK0TECt4IdyBdBD/KRFKorlK3g==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/sunos-x64": { - "version": "0.18.12", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.12.tgz", - "integrity": "sha512-+RkKpVQR7bICjTOPUpkTBTaJ4TFqQBX5Ywyd/HSdDkQGn65VPkTsR/pL4AMvuMWy+wnXgIl4EY6q4mVpJal8Kg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/win32-arm64": { - "version": "0.18.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.12.tgz", - "integrity": "sha512-GNHuciv0mFM7ouzsU0+AwY+7eV4Mgo5WnbhfDCQGtpvOtD1vbOiRjPYG6dhmMoFyBjj+pNqQu2X+7DKn0KQ/Gw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/win32-ia32": { - "version": "0.18.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.12.tgz", - "integrity": "sha512-kR8cezhYipbbypGkaqCTWIeu4zID17gamC8YTPXYtcN3E5BhhtTnwKBn9I0PJur/T6UVwIEGYzkffNL0lFvxEw==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/win32-x64": { - "version": "0.18.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.12.tgz", - "integrity": "sha512-O0UYQVkvfM/jO8a4OwoV0mAKSJw+mjWTAd1MJd/1FCX6uiMdLmMRPK/w6e9OQ0ob2WGxzIm9va/KG0Ja4zIOgg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/esbuild": { - "version": "0.18.12", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.12.tgz", - "integrity": "sha512-XuOVLDdtsDslXStStduT41op21Ytmf4/BDS46aa3xPJ7X5h2eMWBF1oAe3QjUH3bDksocNXgzGUZ7XHIBya6Tg==", - "dev": true, - "hasInstallScript": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/android-arm": "0.18.12", - "@esbuild/android-arm64": "0.18.12", - "@esbuild/android-x64": "0.18.12", - "@esbuild/darwin-arm64": "0.18.12", - "@esbuild/darwin-x64": "0.18.12", - "@esbuild/freebsd-arm64": "0.18.12", - "@esbuild/freebsd-x64": "0.18.12", - "@esbuild/linux-arm": "0.18.12", - "@esbuild/linux-arm64": "0.18.12", - "@esbuild/linux-ia32": "0.18.12", - "@esbuild/linux-loong64": "0.18.12", - "@esbuild/linux-mips64el": "0.18.12", - "@esbuild/linux-ppc64": "0.18.12", - "@esbuild/linux-riscv64": "0.18.12", - "@esbuild/linux-s390x": "0.18.12", - "@esbuild/linux-x64": "0.18.12", - "@esbuild/netbsd-x64": "0.18.12", - "@esbuild/openbsd-x64": "0.18.12", - "@esbuild/sunos-x64": "0.18.12", - "@esbuild/win32-arm64": "0.18.12", - "@esbuild/win32-ia32": "0.18.12", - "@esbuild/win32-x64": "0.18.12" - } - }, - "node_modules/vitest": { - "version": "0.33.0", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-0.33.0.tgz", - "integrity": "sha512-1CxaugJ50xskkQ0e969R/hW47za4YXDUfWJDxip1hwbnhUjYolpfUn2AMOulqG/Dtd9WYAtkHmM/m3yKVrEejQ==", - "dev": true, - "dependencies": { - "@types/chai": "^4.3.5", - "@types/chai-subset": "^1.3.3", - "@types/node": "*", - "@vitest/expect": "0.33.0", - "@vitest/runner": "0.33.0", - "@vitest/snapshot": "0.33.0", - "@vitest/spy": "0.33.0", - "@vitest/utils": "0.33.0", - "acorn": "^8.9.0", - "acorn-walk": "^8.2.0", - "cac": "^6.7.14", - "chai": "^4.3.7", - "debug": "^4.3.4", - "local-pkg": "^0.4.3", - "magic-string": "^0.30.1", - "pathe": "^1.1.1", - "picocolors": "^1.0.0", - "std-env": "^3.3.3", - "strip-literal": "^1.0.1", - "tinybench": "^2.5.0", - "tinypool": "^0.6.0", - "vite": "^3.0.0 || ^4.0.0", - "vite-node": "0.33.0", - "why-is-node-running": "^2.2.2" - }, - "bin": { - "vitest": "vitest.mjs" - }, - "engines": { - "node": ">=v14.18.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "@edge-runtime/vm": "*", - "@vitest/browser": "*", - "@vitest/ui": "*", - "happy-dom": "*", - "jsdom": "*", - "playwright": "*", - "safaridriver": "*", - "webdriverio": "*" - }, - "peerDependenciesMeta": { - "@edge-runtime/vm": { - "optional": true - }, - "@vitest/browser": { - "optional": true - }, - "@vitest/ui": { - "optional": true - }, - "happy-dom": { - "optional": true - }, - "jsdom": { - "optional": true - }, - "playwright": { - "optional": true - }, - "safaridriver": { - "optional": true - }, - "webdriverio": { - "optional": true - } - } - }, - "node_modules/vitest-mock-extended": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/vitest-mock-extended/-/vitest-mock-extended-1.1.4.tgz", - "integrity": "sha512-MKPdepFjk0CE7Ocb5txntHK/sloHO9s0Kk9dr630uL03shRSHMkZtSs5CBPsbJ8K/CvYLv0GHUmMt2zWks2eXg==", - "dev": true, - "dependencies": { - "ts-essentials": "^9.3.2" - }, - "peerDependencies": { - "typescript": "3.x || 4.x || 5.x", - "vitest": ">=0.31.1" - } - }, - "node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "dev": true - }, - "node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dev": true, - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/why-is-node-running": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.2.2.tgz", - "integrity": "sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==", - "dev": true, - "dependencies": { - "siginfo": "^2.0.0", - "stackback": "0.0.2" - }, - "bin": { - "why-is-node-running": "cli.js" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wide-align": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", - "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", - "dev": true, - "dependencies": { - "string-width": "^1.0.2 || 2 || 3 || 4" - } - }, - "node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true - }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "engines": { - "node": ">=10" - } - }, - "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "engines": { - "node": ">=10" - } - }, - "node_modules/yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - } - }, - "dependencies": { - "@ampproject/remapping": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", - "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", - "dev": true, - "requires": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" - } - }, - "@babel/generator": { - "version": "7.18.2", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.2.tgz", - "integrity": "sha512-W1lG5vUwFvfMd8HVXqdfbuG7RuaSrTCCD8cl8fP8wOivdbtbIg2Db3IWUcgvfxKbbn6ZBGYRW/Zk1MIwK49mgw==", - "dev": true, - "requires": { - "@babel/types": "^7.18.2", - "@jridgewell/gen-mapping": "^0.3.0", - "jsesc": "^2.5.1" - } - }, - "@babel/helper-string-parser": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", - "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", - "dev": true - }, - "@babel/helper-validator-identifier": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz", - "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==", - "dev": true - }, - "@babel/parser": { - "version": "7.18.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.4.tgz", - "integrity": "sha512-FDge0dFazETFcxGw/EXzOkN8uJp0PC7Qbm+Pe9T+av2zlBpOgunFHkQPPn+eRuClU73JF+98D531UgayY89tow==", - "dev": true - }, - "@babel/types": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.19.0.tgz", - "integrity": "sha512-YuGopBq3ke25BVSiS6fgF49Ul9gH1x70Bcr6bqRLjWCkcX8Hre1/5+z+IiWOIerRMSSEfGZVB9z9kyq7wVs9YA==", - "dev": true, - "requires": { - "@babel/helper-string-parser": "^7.18.10", - "@babel/helper-validator-identifier": "^7.18.6", - "to-fast-properties": "^2.0.0" - } - }, - "@bcoe/v8-coverage": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", - "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", - "dev": true - }, - "@cspotcode/source-map-support": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", - "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", - "dev": true, - "requires": { - "@jridgewell/trace-mapping": "0.3.9" - }, - "dependencies": { - "@jridgewell/trace-mapping": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", - "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", - "dev": true, - "requires": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - } - } - }, - "@esbuild/android-arm": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.19.tgz", - "integrity": "sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==", - "dev": true, - "optional": true - }, - "@esbuild/android-arm64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.19.tgz", - "integrity": "sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==", - "dev": true, - "optional": true - }, - "@esbuild/android-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.19.tgz", - "integrity": "sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==", - "dev": true, - "optional": true - }, - "@esbuild/darwin-arm64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.19.tgz", - "integrity": "sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==", - "dev": true, - "optional": true - }, - "@esbuild/darwin-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.19.tgz", - "integrity": "sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==", - "dev": true, - "optional": true - }, - "@esbuild/freebsd-arm64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.19.tgz", - "integrity": "sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==", - "dev": true, - "optional": true - }, - "@esbuild/freebsd-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.19.tgz", - "integrity": "sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==", - "dev": true, - "optional": true - }, - "@esbuild/linux-arm": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.19.tgz", - "integrity": "sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==", - "dev": true, - "optional": true - }, - "@esbuild/linux-arm64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.19.tgz", - "integrity": "sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==", - "dev": true, - "optional": true - }, - "@esbuild/linux-ia32": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.19.tgz", - "integrity": "sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==", - "dev": true, - "optional": true - }, - "@esbuild/linux-loong64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.19.tgz", - "integrity": "sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==", - "dev": true, - "optional": true - }, - "@esbuild/linux-mips64el": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.19.tgz", - "integrity": "sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==", - "dev": true, - "optional": true - }, - "@esbuild/linux-ppc64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.19.tgz", - "integrity": "sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==", - "dev": true, - "optional": true - }, - "@esbuild/linux-riscv64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.19.tgz", - "integrity": "sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==", - "dev": true, - "optional": true - }, - "@esbuild/linux-s390x": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.19.tgz", - "integrity": "sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==", - "dev": true, - "optional": true - }, - "@esbuild/linux-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.19.tgz", - "integrity": "sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==", - "dev": true, - "optional": true - }, - "@esbuild/netbsd-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.19.tgz", - "integrity": "sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==", - "dev": true, - "optional": true - }, - "@esbuild/openbsd-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.19.tgz", - "integrity": "sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==", - "dev": true, - "optional": true - }, - "@esbuild/sunos-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.19.tgz", - "integrity": "sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==", - "dev": true, - "optional": true - }, - "@esbuild/win32-arm64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.19.tgz", - "integrity": "sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==", - "dev": true, - "optional": true - }, - "@esbuild/win32-ia32": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.19.tgz", - "integrity": "sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==", - "dev": true, - "optional": true - }, - "@esbuild/win32-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.19.tgz", - "integrity": "sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==", - "dev": true, - "optional": true - }, - "@grpc/grpc-js": { - "version": "1.8.14", - "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.8.14.tgz", - "integrity": "sha512-w84maJ6CKl5aApCMzFll0hxtFNT6or9WwMslobKaqWUEf1K+zhlL43bSQhFreyYWIWR+Z0xnVFC1KtLm4ZpM/A==", - "requires": { - "@grpc/proto-loader": "^0.7.0", - "@types/node": ">=12.12.47" - } - }, - "@grpc/proto-loader": { - "version": "0.7.6", - "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.6.tgz", - "integrity": "sha512-QyAXR8Hyh7uMDmveWxDSUcJr9NAWaZ2I6IXgAYvQmfflwouTM+rArE2eEaCtLlRqO81j7pRLCt81IefUei6Zbw==", - "requires": { - "@types/long": "^4.0.1", - "lodash.camelcase": "^4.3.0", - "long": "^4.0.0", - "protobufjs": "^7.0.0", - "yargs": "^16.2.0" - } - }, - "@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "dev": true - }, - "@jest/schemas": { - "version": "29.6.0", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.0.tgz", - "integrity": "sha512-rxLjXyJBTL4LQeJW3aKo0M/+GkCOXsO+8i9Iu7eDb6KwtP65ayoDsitrdPBtujxQ88k4wI2FNYfa6TOGwSn6cQ==", - "dev": true, - "requires": { - "@sinclair/typebox": "^0.27.8" - } - }, - "@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", - "dev": true, - "requires": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - } - }, - "@jridgewell/resolve-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", - "dev": true - }, - "@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", - "dev": true - }, - "@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", - "dev": true - }, - "@jridgewell/trace-mapping": { - "version": "0.3.18", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", - "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", - "dev": true, - "requires": { - "@jridgewell/resolve-uri": "3.1.0", - "@jridgewell/sourcemap-codec": "1.4.14" - }, - "dependencies": { - "@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", - "dev": true - } - } - }, - "@mapbox/node-pre-gyp": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.11.tgz", - "integrity": "sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==", - "dev": true, - "requires": { - "detect-libc": "^2.0.0", - "https-proxy-agent": "^5.0.0", - "make-dir": "^3.1.0", - "node-fetch": "^2.6.7", - "nopt": "^5.0.0", - "npmlog": "^5.0.1", - "rimraf": "^3.0.2", - "semver": "^7.3.5", - "tar": "^6.1.11" - } - }, - "@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - } - }, - "@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true - }, - "@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "requires": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - } - }, - "@protobufjs/aspromise": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", - "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==" - }, - "@protobufjs/base64": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", - "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" - }, - "@protobufjs/codegen": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", - "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" - }, - "@protobufjs/eventemitter": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", - "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==" - }, - "@protobufjs/fetch": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", - "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", - "requires": { - "@protobufjs/aspromise": "^1.1.1", - "@protobufjs/inquire": "^1.1.0" - } - }, - "@protobufjs/float": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", - "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==" - }, - "@protobufjs/inquire": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", - "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==" - }, - "@protobufjs/path": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", - "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==" - }, - "@protobufjs/pool": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", - "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==" - }, - "@protobufjs/utf8": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", - "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==" - }, - "@sinclair/typebox": { - "version": "0.27.8", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", - "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", - "dev": true - }, - "@tsconfig/node10": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", - "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", - "dev": true - }, - "@tsconfig/node12": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", - "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", - "dev": true - }, - "@tsconfig/node14": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", - "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", - "dev": true - }, - "@tsconfig/node16": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", - "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", - "dev": true - }, - "@types/amqplib": { - "version": "0.10.1", - "resolved": "https://registry.npmjs.org/@types/amqplib/-/amqplib-0.10.1.tgz", - "integrity": "sha512-j6ANKT79ncUDnAs/+9r9eDujxbeJoTjoVu33gHHcaPfmLQaMhvfbH2GqSe8KUM444epAp1Vl3peVOQfZk3UIqA==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/body-parser": { - "version": "1.19.2", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", - "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", - "requires": { - "@types/connect": "*", - "@types/node": "*" - } - }, - "@types/chai": { - "version": "4.3.5", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.5.tgz", - "integrity": "sha512-mEo1sAde+UCE6b2hxn332f1g1E8WfYRu6p5SvTKr2ZKC1f7gFJXk4h5PyGP9Dt6gCaG8y8XhwnXWC6Iy2cmBng==", - "dev": true - }, - "@types/chai-subset": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/@types/chai-subset/-/chai-subset-1.3.3.tgz", - "integrity": "sha512-frBecisrNGz+F4T6bcc+NLeolfiojh5FxW2klu669+8BARtyQv2C/GkNW6FUodVe4BroGMP/wER/YDGc7rEllw==", - "dev": true, - "requires": { - "@types/chai": "*" - } - }, - "@types/connect": { - "version": "3.4.35", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", - "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", - "requires": { - "@types/node": "*" - } - }, - "@types/express": { - "version": "4.17.17", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.17.tgz", - "integrity": "sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==", - "requires": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "^4.17.33", - "@types/qs": "*", - "@types/serve-static": "*" - } - }, - "@types/express-serve-static-core": { - "version": "4.17.35", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.35.tgz", - "integrity": "sha512-wALWQwrgiB2AWTT91CB62b6Yt0sNHpznUXeZEcnPU3DRdlDIz74x8Qg1UUYKSVFi+va5vKOLYRBI1bRKiLLKIg==", - "requires": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*", - "@types/send": "*" - } - }, - "@types/http-errors": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.1.tgz", - "integrity": "sha512-/K3ds8TRAfBvi5vfjuz8y6+GiAYBZ0x4tXv1Av6CWBWn0IlADc+ZX9pMq7oU0fNQPnBwIZl3rmeLp6SBApbxSQ==" - }, - "@types/istanbul-lib-coverage": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", - "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", - "dev": true - }, - "@types/long": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz", - "integrity": "sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==" - }, - "@types/mime": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", - "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==" - }, - "@types/node": { - "version": "18.15.9", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.9.tgz", - "integrity": "sha512-dUxhiNzBLr6IqlZXz6e/rN2YQXlFgOei/Dxy+e3cyXTJ4txSUbGT2/fmnD6zd/75jDMeW5bDee+YXxlFKHoV0A==" - }, - "@types/qs": { - "version": "6.9.7", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", - "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==" - }, - "@types/range-parser": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", - "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==" - }, - "@types/send": { - "version": "0.17.1", - "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.1.tgz", - "integrity": "sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q==", - "requires": { - "@types/mime": "^1", - "@types/node": "*" - } - }, - "@types/serve-static": { - "version": "1.15.2", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.2.tgz", - "integrity": "sha512-J2LqtvFYCzaj8pVYKw8klQXrLLk7TBZmQ4ShlcdkELFKGwGMfevMLneMMRkMgZxotOD9wg497LpC7O8PcvAmfw==", - "requires": { - "@types/http-errors": "*", - "@types/mime": "*", - "@types/node": "*" - } - }, - "@vitest/coverage-c8": { - "version": "0.33.0", - "resolved": "https://registry.npmjs.org/@vitest/coverage-c8/-/coverage-c8-0.33.0.tgz", - "integrity": "sha512-DaF1zJz4dcOZS4k/neiQJokmOWqsGXwhthfmUdPGorXIQHjdPvV6JQSYhQDI41MyI8c+IieQUdIDs5XAMHtDDw==", - "dev": true, - "requires": { - "@ampproject/remapping": "^2.2.1", - "c8": "^7.14.0", - "magic-string": "^0.30.1", - "picocolors": "^1.0.0", - "std-env": "^3.3.3" - } - }, - "@vitest/expect": { - "version": "0.33.0", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-0.33.0.tgz", - "integrity": "sha512-sVNf+Gla3mhTCxNJx+wJLDPp/WcstOe0Ksqz4Vec51MmgMth/ia0MGFEkIZmVGeTL5HtjYR4Wl/ZxBxBXZJTzQ==", - "dev": true, - "requires": { - "@vitest/spy": "0.33.0", - "@vitest/utils": "0.33.0", - "chai": "^4.3.7" - } - }, - "@vitest/runner": { - "version": "0.33.0", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-0.33.0.tgz", - "integrity": "sha512-UPfACnmCB6HKRHTlcgCoBh6ppl6fDn+J/xR8dTufWiKt/74Y9bHci5CKB8tESSV82zKYtkBJo9whU3mNvfaisg==", - "dev": true, - "requires": { - "@vitest/utils": "0.33.0", - "p-limit": "^4.0.0", - "pathe": "^1.1.1" - }, - "dependencies": { - "p-limit": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", - "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", - "dev": true, - "requires": { - "yocto-queue": "^1.0.0" - } - }, - "yocto-queue": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", - "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", - "dev": true - } - } - }, - "@vitest/snapshot": { - "version": "0.33.0", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-0.33.0.tgz", - "integrity": "sha512-tJjrl//qAHbyHajpFvr8Wsk8DIOODEebTu7pgBrP07iOepR5jYkLFiqLq2Ltxv+r0uptUb4izv1J8XBOwKkVYA==", - "dev": true, - "requires": { - "magic-string": "^0.30.1", - "pathe": "^1.1.1", - "pretty-format": "^29.5.0" - } - }, - "@vitest/spy": { - "version": "0.33.0", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-0.33.0.tgz", - "integrity": "sha512-Kv+yZ4hnH1WdiAkPUQTpRxW8kGtH8VRTnus7ZTGovFYM1ZezJpvGtb9nPIjPnptHbsyIAxYZsEpVPYgtpjGnrg==", - "dev": true, - "requires": { - "tinyspy": "^2.1.1" - } - }, - "@vitest/utils": { - "version": "0.33.0", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-0.33.0.tgz", - "integrity": "sha512-pF1w22ic965sv+EN6uoePkAOTkAPWM03Ri/jXNyMIKBb/XHLDPfhLvf/Fa9g0YECevAIz56oVYXhodLvLQ/awA==", - "dev": true, - "requires": { - "diff-sequences": "^29.4.3", - "loupe": "^2.3.6", - "pretty-format": "^29.5.0" - } - }, - "abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "dev": true - }, - "accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "requires": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - } - }, - "acorn": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", - "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", - "dev": true - }, - "acorn-walk": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", - "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", - "dev": true - }, - "agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dev": true, - "requires": { - "debug": "4" - } - }, - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "aproba": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", - "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", - "dev": true - }, - "are-we-there-yet": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", - "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", - "dev": true, - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^3.6.0" - } - }, - "arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true - }, - "array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" - }, - "array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true - }, - "assertion-error": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", - "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", - "dev": true - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" - }, - "at-least-node": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", - "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", - "dev": true - }, - "axios": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.4.0.tgz", - "integrity": "sha512-S4XCWMEmzvo64T9GfvQDOXgYRDJ/wsSZc7Jvdgx5u1sd0JwsuPLqb3SYmusag+edF6ziyMensPVqLTSc1PiSEA==", - "requires": { - "follow-redirects": "^1.15.0", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" - } - }, - "balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "dev": true - }, - "binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true - }, - "bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "dev": true, - "requires": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, - "body-parser": { - "version": "1.20.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", - "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", - "requires": { - "bytes": "3.1.2", - "content-type": "~1.0.5", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.11.0", - "raw-body": "2.5.2", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - } - } - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "dev": true, - "requires": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" - }, - "c8": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/c8/-/c8-7.14.0.tgz", - "integrity": "sha512-i04rtkkcNcCf7zsQcSv/T9EbUn4RXQ6mropeMcjFOsQXQ0iGLAr/xT6TImQg4+U9hmNpN9XdvPkjUL1IzbgxJw==", - "dev": true, - "requires": { - "@bcoe/v8-coverage": "^0.2.3", - "@istanbuljs/schema": "^0.1.3", - "find-up": "^5.0.0", - "foreground-child": "^2.0.0", - "istanbul-lib-coverage": "^3.2.0", - "istanbul-lib-report": "^3.0.0", - "istanbul-reports": "^3.1.4", - "rimraf": "^3.0.2", - "test-exclude": "^6.0.0", - "v8-to-istanbul": "^9.0.0", - "yargs": "^16.2.0", - "yargs-parser": "^20.2.9" - } - }, - "cac": { - "version": "6.7.14", - "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", - "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", - "dev": true - }, - "call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "requires": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - } - }, - "chai": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.7.tgz", - "integrity": "sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==", - "dev": true, - "requires": { - "assertion-error": "^1.1.0", - "check-error": "^1.0.2", - "deep-eql": "^4.1.2", - "get-func-name": "^2.0.0", - "loupe": "^2.3.1", - "pathval": "^1.1.1", - "type-detect": "^4.0.5" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "check-error": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", - "integrity": "sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==", - "dev": true - }, - "chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "dev": true, - "requires": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "fsevents": "~2.3.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - } - }, - "chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", - "dev": true - }, - "cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "color-support": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", - "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", - "dev": true - }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true - }, - "console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", - "dev": true - }, - "content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", - "requires": { - "safe-buffer": "5.2.1" - } - }, - "content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==" - }, - "convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", - "dev": true - }, - "cookie": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", - "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==" - }, - "cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" - }, - "core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "dev": true - }, - "create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "dev": true - }, - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "decompress-response": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", - "dev": true, - "requires": { - "mimic-response": "^3.1.0" - } - }, - "deep-eql": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz", - "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==", - "dev": true, - "requires": { - "type-detect": "^4.0.0" - } - }, - "deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "dev": true - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" - }, - "delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", - "dev": true - }, - "depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" - }, - "destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==" - }, - "detect-libc": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz", - "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==", - "dev": true - }, - "diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true - }, - "diff-sequences": { - "version": "29.4.3", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.4.3.tgz", - "integrity": "sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA==", - "dev": true - }, - "dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "requires": { - "path-type": "^4.0.0" - } - }, - "dotenv": { - "version": "16.3.1", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.3.1.tgz", - "integrity": "sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==" - }, - "ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==" - }, - "end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dev": true, - "requires": { - "once": "^1.4.0" - } - }, - "esbuild": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.19.tgz", - "integrity": "sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==", - "dev": true, - "requires": { - "@esbuild/android-arm": "0.17.19", - "@esbuild/android-arm64": "0.17.19", - "@esbuild/android-x64": "0.17.19", - "@esbuild/darwin-arm64": "0.17.19", - "@esbuild/darwin-x64": "0.17.19", - "@esbuild/freebsd-arm64": "0.17.19", - "@esbuild/freebsd-x64": "0.17.19", - "@esbuild/linux-arm": "0.17.19", - "@esbuild/linux-arm64": "0.17.19", - "@esbuild/linux-ia32": "0.17.19", - "@esbuild/linux-loong64": "0.17.19", - "@esbuild/linux-mips64el": "0.17.19", - "@esbuild/linux-ppc64": "0.17.19", - "@esbuild/linux-riscv64": "0.17.19", - "@esbuild/linux-s390x": "0.17.19", - "@esbuild/linux-x64": "0.17.19", - "@esbuild/netbsd-x64": "0.17.19", - "@esbuild/openbsd-x64": "0.17.19", - "@esbuild/sunos-x64": "0.17.19", - "@esbuild/win32-arm64": "0.17.19", - "@esbuild/win32-ia32": "0.17.19", - "@esbuild/win32-x64": "0.17.19" - } - }, - "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" - }, - "escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" - }, - "etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==" - }, - "expand-template": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", - "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", - "dev": true - }, - "express": { - "version": "4.18.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", - "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", - "requires": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.1", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.5.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.2.0", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.7", - "qs": "6.11.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.18.0", - "serve-static": "1.15.0", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "dependencies": { - "body-parser": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", - "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", - "requires": { - "bytes": "3.1.2", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.11.0", - "raw-body": "2.5.1", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - } - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "raw-body": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", - "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", - "requires": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - } - } - } - }, - "fast-glob": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.0.tgz", - "integrity": "sha512-ChDuvbOypPuNjO8yIDf36x7BlZX1smcUMTTcyoIjycexOxd6DFsKsg21qVBzEmr3G7fUKIRy2/psii+CIUt7FA==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - } - }, - "fastq": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", - "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", - "dev": true, - "requires": { - "reusify": "^1.0.4" - } - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "finalhandler": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", - "requires": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - } - } - }, - "find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "requires": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - } - }, - "follow-redirects": { - "version": "1.15.2", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", - "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==" - }, - "foreground-child": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", - "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", - "dev": true, - "requires": { - "cross-spawn": "^7.0.0", - "signal-exit": "^3.0.2" - } - }, - "form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - } - }, - "forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" - }, - "fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==" - }, - "from2": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", - "integrity": "sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.0" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "fs-constants": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", - "dev": true - }, - "fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "dev": true, - "requires": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - } - }, - "fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "dev": true, - "requires": { - "minipass": "^3.0.0" - }, - "dependencies": { - "minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - } - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true - }, - "fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "optional": true - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" - }, - "gauge": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", - "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", - "dev": true, - "requires": { - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.2", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.1", - "object-assign": "^4.1.1", - "signal-exit": "^3.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wide-align": "^1.1.2" - } - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" - }, - "get-func-name": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", - "integrity": "sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==", - "dev": true - }, - "get-intrinsic": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", - "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", - "requires": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3" - } - }, - "github-from-package": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", - "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==", - "dev": true - }, - "glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "requires": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - } - }, - "globrex": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz", - "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==", - "dev": true - }, - "google-protobuf": { - "version": "3.21.2", - "resolved": "https://registry.npmjs.org/google-protobuf/-/google-protobuf-3.21.2.tgz", - "integrity": "sha512-3MSOYFO5U9mPGikIYCzK0SaThypfGgS6bHqrUGXG3DPHCrb+txNqeEcns1W0lkGfk0rCyNXm7xB9rMxnCiZOoA==" - }, - "graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true - }, - "grpc-server-reflection": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/grpc-server-reflection/-/grpc-server-reflection-0.1.5.tgz", - "integrity": "sha512-i69RYu6v65enzknNAPUgerFuVQfo+L3n9g4c1A/Sv5jUHMpxMIjSbBA+YWls9Sr4Flac4oohp4Gx8f389CaHuw==", - "requires": { - "google-protobuf": "^3.19.1" - } - }, - "grpc-tools": { - "version": "1.12.4", - "resolved": "https://registry.npmjs.org/grpc-tools/-/grpc-tools-1.12.4.tgz", - "integrity": "sha512-5+mLAJJma3BjnW/KQp6JBjUMgvu7Mu3dBvBPd1dcbNIb+qiR0817zDpgPjS7gRb+l/8EVNIa3cB02xI9JLToKg==", - "dev": true, - "requires": { - "@mapbox/node-pre-gyp": "^1.0.5" - } - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "has-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", - "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==" - }, - "has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" - }, - "has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", - "dev": true - }, - "html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true - }, - "http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "requires": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - } - }, - "https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "dev": true, - "requires": { - "agent-base": "6", - "debug": "4" - } - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "dev": true - }, - "ignore": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", - "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", - "dev": true - }, - "ignore-by-default": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", - "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true - }, - "into-stream": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/into-stream/-/into-stream-6.0.0.tgz", - "integrity": "sha512-XHbaOAvP+uFKUFsOgoNPRjLkwB+I22JFPFe5OjTkQ0nwgj6+pSjb4NmB6VMxaPshLiOf+zcpOCBQuLwC1KHhZA==", - "dev": true, - "requires": { - "from2": "^2.3.0", - "p-is-promise": "^3.0.0" - } - }, - "ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" - }, - "is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "requires": { - "binary-extensions": "^2.0.0" - } - }, - "is-core-module": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz", - "integrity": "sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==", - "dev": true, - "requires": { - "has": "^1.0.3" - } - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" - }, - "is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "istanbul-lib-coverage": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", - "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", - "dev": true - }, - "istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", - "dev": true, - "requires": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^3.0.0", - "supports-color": "^7.1.0" - } - }, - "istanbul-reports": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", - "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", - "dev": true, - "requires": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - } - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true - }, - "json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true - }, - "jsonc-parser": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", - "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", - "dev": true - }, - "jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^2.0.0" - } - }, - "local-pkg": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.4.3.tgz", - "integrity": "sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==", - "dev": true - }, - "locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "requires": { - "p-locate": "^5.0.0" - } - }, - "lodash.camelcase": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", - "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==" - }, - "long": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", - "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" - }, - "loupe": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.6.tgz", - "integrity": "sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==", - "dev": true, - "requires": { - "get-func-name": "^2.0.0" - } - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "magic-string": { - "version": "0.30.1", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.1.tgz", - "integrity": "sha512-mbVKXPmS0z0G4XqFDCTllmDQ6coZzn94aMlb0o/A4HEHJCKcanlDZwYJgwnkmgD3jyWhUgj9VsPrfd972yPffA==", - "dev": true, - "requires": { - "@jridgewell/sourcemap-codec": "^1.4.15" - } - }, - "make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, - "requires": { - "semver": "^6.0.0" - }, - "dependencies": { - "semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true - } - } - }, - "make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true - }, - "media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==" - }, - "merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" - }, - "merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true - }, - "methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==" - }, - "micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "requires": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - } - }, - "mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" - }, - "mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" - }, - "mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "requires": { - "mime-db": "1.52.0" - } - }, - "mimic-response": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", - "dev": true - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "dev": true - }, - "minipass": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", - "dev": true - }, - "minizlib": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", - "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", - "dev": true, - "requires": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - }, - "dependencies": { - "minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - } - } - }, - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true - }, - "mkdirp-classic": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", - "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", - "dev": true - }, - "mlly": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.4.0.tgz", - "integrity": "sha512-ua8PAThnTwpprIaU47EPeZ/bPUVp2QYBbWMphUQpVdBI3Lgqzm5KZQ45Agm3YJedHXaIHl6pBGabaLSUPPSptg==", - "dev": true, - "requires": { - "acorn": "^8.9.0", - "pathe": "^1.1.1", - "pkg-types": "^1.0.3", - "ufo": "^1.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "multistream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/multistream/-/multistream-4.1.0.tgz", - "integrity": "sha512-J1XDiAmmNpRCBfIWJv+n0ymC4ABcf/Pl+5YvC5B/D2f/2+8PtHvCNxMPKiQcZyi922Hq69J2YOpb1pTywfifyw==", - "dev": true, - "requires": { - "once": "^1.4.0", - "readable-stream": "^3.6.0" - } - }, - "nanoid": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", - "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", - "dev": true - }, - "napi-build-utils": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", - "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==", - "dev": true - }, - "negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==" - }, - "node-abi": { - "version": "3.45.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.45.0.tgz", - "integrity": "sha512-iwXuFrMAcFVi/ZoZiqq8BzAdsLw9kxDfTC0HMyjXfSL/6CSDAGD5UmR7azrAgWV1zKYq7dUUMj4owusBWKLsiQ==", - "dev": true, - "requires": { - "semver": "^7.3.5" - } - }, - "node-fetch": { - "version": "2.6.12", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.12.tgz", - "integrity": "sha512-C/fGU2E8ToujUivIO0H+tpQ6HWo4eEmchoPIoXtxCrVghxdKq+QOHqEZW7tuP3KlV3bC8FRMO5nMCC7Zm1VP6g==", - "dev": true, - "requires": { - "whatwg-url": "^5.0.0" - } - }, - "nodemon": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.0.1.tgz", - "integrity": "sha512-g9AZ7HmkhQkqXkRc20w+ZfQ73cHLbE8hnPbtaFbFtCumZsjyMhKk9LajQ07U5Ux28lvFjZ5X7HvWR1xzU8jHVw==", - "dev": true, - "requires": { - "chokidar": "^3.5.2", - "debug": "^3.2.7", - "ignore-by-default": "^1.0.1", - "minimatch": "^3.1.2", - "pstree.remy": "^1.1.8", - "semver": "^7.5.3", - "simple-update-notifier": "^2.0.0", - "supports-color": "^5.5.0", - "touch": "^3.1.0", - "undefsafe": "^2.0.5" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "nopt": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", - "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", - "dev": true, - "requires": { - "abbrev": "1" - } - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true - }, - "npmlog": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", - "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", - "dev": true, - "requires": { - "are-we-there-yet": "^2.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^3.0.0", - "set-blocking": "^2.0.0" - } - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "dev": true - }, - "object-inspect": { - "version": "1.12.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", - "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==" - }, - "on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "requires": { - "ee-first": "1.1.1" - } - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, - "requires": { - "wrappy": "1" - } - }, - "p-is-promise": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-3.0.0.tgz", - "integrity": "sha512-Wo8VsW4IRQSKVXsJCn7TomUaVtyfjVDn3nUP7kE967BQk0CwFpdbZs0X0uk5sW9mkBa9eNM7hCMaG93WUAwxYQ==", - "dev": true - }, - "p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "requires": { - "yocto-queue": "^0.1.0" - } - }, - "p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "requires": { - "p-limit": "^3.0.2" - } - }, - "parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true - }, - "path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" - }, - "path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true - }, - "pathe": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.1.tgz", - "integrity": "sha512-d+RQGp0MAYTIaDBIMmOfMwz3E+LOZnxx1HZd5R18mmCZY0QBlK0LDZfPc8FW8Ed2DlvsuE6PRjroDY+wg4+j/Q==", - "dev": true - }, - "pathval": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", - "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", - "dev": true - }, - "picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true - }, - "picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true - }, - "pkg": { - "version": "5.8.1", - "resolved": "https://registry.npmjs.org/pkg/-/pkg-5.8.1.tgz", - "integrity": "sha512-CjBWtFStCfIiT4Bde9QpJy0KeH19jCfwZRJqHFDFXfhUklCx8JoFmMj3wgnEYIwGmZVNkhsStPHEOnrtrQhEXA==", - "dev": true, - "requires": { - "@babel/generator": "7.18.2", - "@babel/parser": "7.18.4", - "@babel/types": "7.19.0", - "chalk": "^4.1.2", - "fs-extra": "^9.1.0", - "globby": "^11.1.0", - "into-stream": "^6.0.0", - "is-core-module": "2.9.0", - "minimist": "^1.2.6", - "multistream": "^4.1.0", - "pkg-fetch": "3.4.2", - "prebuild-install": "7.1.1", - "resolve": "^1.22.0", - "stream-meter": "^1.0.4" - } - }, - "pkg-fetch": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/pkg-fetch/-/pkg-fetch-3.4.2.tgz", - "integrity": "sha512-0+uijmzYcnhC0hStDjm/cl2VYdrmVVBpe7Q8k9YBojxmR5tG8mvR9/nooQq3QSXiQqORDVOTY3XqMEqJVIzkHA==", - "dev": true, - "requires": { - "chalk": "^4.1.2", - "fs-extra": "^9.1.0", - "https-proxy-agent": "^5.0.0", - "node-fetch": "^2.6.6", - "progress": "^2.0.3", - "semver": "^7.3.5", - "tar-fs": "^2.1.1", - "yargs": "^16.2.0" - } - }, - "pkg-types": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.0.3.tgz", - "integrity": "sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==", - "dev": true, - "requires": { - "jsonc-parser": "^3.2.0", - "mlly": "^1.2.0", - "pathe": "^1.1.0" - } - }, - "postcss": { - "version": "8.4.26", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.26.tgz", - "integrity": "sha512-jrXHFF8iTloAenySjM/ob3gSj7pCu0Ji49hnjqzsgSRa50hkWCKD0HQ+gMNJkW38jBI68MpAAg7ZWwHwX8NMMw==", - "dev": true, - "requires": { - "nanoid": "^3.3.6", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - } - }, - "prebuild-install": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.1.tgz", - "integrity": "sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==", - "dev": true, - "requires": { - "detect-libc": "^2.0.0", - "expand-template": "^2.0.3", - "github-from-package": "0.0.0", - "minimist": "^1.2.3", - "mkdirp-classic": "^0.5.3", - "napi-build-utils": "^1.0.1", - "node-abi": "^3.3.0", - "pump": "^3.0.0", - "rc": "^1.2.7", - "simple-get": "^4.0.0", - "tar-fs": "^2.0.0", - "tunnel-agent": "^0.6.0" - } - }, - "pretty-format": { - "version": "29.6.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.1.tgz", - "integrity": "sha512-7jRj+yXO0W7e4/tSJKoR7HRIHLPPjtNaUGG2xxKQnGvPNRkgWcQ0AZX6P4KBRJN4FcTBWb3sa7DVUJmocYuoog==", - "dev": true, - "requires": { - "@jest/schemas": "^29.6.0", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true - } - } - }, - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true - }, - "progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true - }, - "protobufjs": { - "version": "7.2.4", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.2.4.tgz", - "integrity": "sha512-AT+RJgD2sH8phPmCf7OUZR8xGdcJRga4+1cOaXJ64hvcSkVhNcRHOwIxUatPH15+nj59WAGTDv3LSGZPEQbJaQ==", - "requires": { - "@protobufjs/aspromise": "^1.1.2", - "@protobufjs/base64": "^1.1.2", - "@protobufjs/codegen": "^2.0.4", - "@protobufjs/eventemitter": "^1.1.0", - "@protobufjs/fetch": "^1.1.0", - "@protobufjs/float": "^1.0.2", - "@protobufjs/inquire": "^1.1.0", - "@protobufjs/path": "^1.1.2", - "@protobufjs/pool": "^1.1.0", - "@protobufjs/utf8": "^1.1.0", - "@types/node": ">=13.7.0", - "long": "^5.0.0" - }, - "dependencies": { - "long": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", - "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==" - } - } - }, - "proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "requires": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - } - }, - "proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" - }, - "pstree.remy": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", - "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", - "dev": true - }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", - "requires": { - "side-channel": "^1.0.4" - } - }, - "queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true - }, - "range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" - }, - "raw-body": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", - "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", - "requires": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - } - }, - "rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "dev": true, - "requires": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - } - }, - "react-is": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", - "dev": true - }, - "readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "requires": { - "picomatch": "^2.2.1" - } - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==" - }, - "resolve": { - "version": "1.22.2", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", - "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", - "dev": true, - "requires": { - "is-core-module": "^2.11.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "dependencies": { - "is-core-module": { - "version": "2.12.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz", - "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==", - "dev": true, - "requires": { - "has": "^1.0.3" - } - } - } - }, - "reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "rollup": { - "version": "3.26.2", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.26.2.tgz", - "integrity": "sha512-6umBIGVz93er97pMgQO08LuH3m6PUb3jlDUUGFsNJB6VgTCUaDFpupf5JfU30529m/UKOgmiX+uY6Sx8cOYpLA==", - "dev": true, - "requires": { - "fsevents": "~2.3.2" - } - }, - "run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "requires": { - "queue-microtask": "^1.2.2" - } - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "send": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", - "requires": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.0.1" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - }, - "dependencies": { - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - } - } - }, - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - } - } - }, - "serve-static": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", - "requires": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.18.0" - } - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", - "dev": true - }, - "setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true - }, - "side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "requires": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - } - }, - "siginfo": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", - "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", - "dev": true - }, - "signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, - "simple-concat": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", - "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", - "dev": true - }, - "simple-get": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", - "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", - "dev": true, - "requires": { - "decompress-response": "^6.0.0", - "once": "^1.3.1", - "simple-concat": "^1.0.0" - } - }, - "simple-update-notifier": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", - "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==", - "dev": true, - "requires": { - "semver": "^7.5.3" - } - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - }, - "source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", - "dev": true - }, - "stackback": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", - "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", - "dev": true - }, - "statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" - }, - "std-env": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.3.3.tgz", - "integrity": "sha512-Rz6yejtVyWnVjC1RFvNmYL10kgjC49EOghxWn0RFqlCHGFpQx+Xe7yW3I4ceK1SGrWIGMjD5Kbue8W/udkbMJg==", - "dev": true - }, - "stream-meter": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/stream-meter/-/stream-meter-1.0.4.tgz", - "integrity": "sha512-4sOEtrbgFotXwnEuzzsQBYEV1elAeFSO8rSGeTwabuX1RRn/kEq9JVH7I0MRBhKVRR0sJkr0M0QCH7yOLf9fhQ==", - "dev": true, - "requires": { - "readable-stream": "^2.1.4" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dev": true, - "requires": { - "safe-buffer": "~5.2.0" - } - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true - }, - "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", - "dev": true - }, - "strip-literal": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-1.0.1.tgz", - "integrity": "sha512-QZTsipNpa2Ppr6v1AmJHESqJ3Uz247MUS0OjrnnZjFAvEoWqxuyFuXn2xLgMtRnijJShAa1HL0gtJyUs7u7n3Q==", - "dev": true, - "requires": { - "acorn": "^8.8.2" - } - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - }, - "supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true - }, - "tar": { - "version": "6.1.15", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.15.tgz", - "integrity": "sha512-/zKt9UyngnxIT/EAGYuxaMYgOIJiP81ab9ZfkILq4oNLPFX50qyYmu7jRj9qeXoxmJHjGlbH0+cm2uy1WCs10A==", - "dev": true, - "requires": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^5.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - } - }, - "tar-fs": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", - "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", - "dev": true, - "requires": { - "chownr": "^1.1.1", - "mkdirp-classic": "^0.5.2", - "pump": "^3.0.0", - "tar-stream": "^2.1.4" - }, - "dependencies": { - "chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", - "dev": true - } - } - }, - "tar-stream": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", - "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", - "dev": true, - "requires": { - "bl": "^4.0.3", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" - } - }, - "test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", - "dev": true, - "requires": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - } - }, - "tinybench": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.5.0.tgz", - "integrity": "sha512-kRwSG8Zx4tjF9ZiyH4bhaebu+EDz1BOx9hOigYHlUW4xxI/wKIUQUqo018UlU4ar6ATPBsaMrdbKZ+tmPdohFA==", - "dev": true - }, - "tinypool": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-0.6.0.tgz", - "integrity": "sha512-FdswUUo5SxRizcBc6b1GSuLpLjisa8N8qMyYoP3rl+bym+QauhtJP5bvZY1ytt8krKGmMLYIRl36HBZfeAoqhQ==", - "dev": true - }, - "tinyspy": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-2.1.1.tgz", - "integrity": "sha512-XPJL2uSzcOyBMky6OFrusqWlzfFrXtE0hPuMgW8A2HmaqrPo4ZQHRN/V0QXN3FSjKxpsbRrFc5LI7KOwBsT1/w==", - "dev": true - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "dev": true - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - }, - "toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" - }, - "touch": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", - "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", - "dev": true, - "requires": { - "nopt": "~1.0.10" - }, - "dependencies": { - "nopt": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", - "integrity": "sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==", - "dev": true, - "requires": { - "abbrev": "1" - } - } - } - }, - "tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "dev": true - }, - "ts-essentials": { - "version": "9.3.2", - "resolved": "https://registry.npmjs.org/ts-essentials/-/ts-essentials-9.3.2.tgz", - "integrity": "sha512-JxKJzuWqH1MmH4ZFHtJzGEhkfN3QvVR3C3w+4BIoWeoY68UVVoA2Np/Bca9z0IPSErVCWhv439aT0We4Dks8kQ==", - "dev": true, - "requires": {} - }, - "ts-node": { - "version": "10.9.1", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", - "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", - "dev": true, - "requires": { - "@cspotcode/source-map-support": "^0.8.0", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "v8-compile-cache-lib": "^3.0.1", - "yn": "3.1.1" - } - }, - "tsconfck": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/tsconfck/-/tsconfck-2.1.1.tgz", - "integrity": "sha512-ZPCkJBKASZBmBUNqGHmRhdhM8pJYDdOXp4nRgj/O0JwUwsMq50lCDRQP/M5GBNAA0elPrq4gAeu4dkaVCuKWww==", - "dev": true, - "requires": {} - }, - "tsconfig-paths": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", - "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==", - "dev": true, - "requires": { - "json5": "^2.2.2", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" - } - }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", - "dev": true, - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true - }, - "type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "requires": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - } - }, - "typescript": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.2.tgz", - "integrity": "sha512-wVORMBGO/FAs/++blGNeAVdbNKtIh1rbBL2EyQ1+J9lClJ93KiiKe8PmFIVdXhHcyv44SL9oglmfeSsndo0jRw==", - "dev": true - }, - "ufo": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.1.2.tgz", - "integrity": "sha512-TrY6DsjTQQgyS3E3dBaOXf0TpPD8u9FVrVYmKVegJuFw51n/YB9XPt+U6ydzFG5ZIN7+DIjPbNmXoBj9esYhgQ==", - "dev": true - }, - "undefsafe": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", - "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", - "dev": true - }, - "universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true - }, - "unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==" - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true - }, - "utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==" - }, - "v8-compile-cache-lib": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", - "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", - "dev": true - }, - "v8-to-istanbul": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.1.0.tgz", - "integrity": "sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA==", - "dev": true, - "requires": { - "@jridgewell/trace-mapping": "^0.3.12", - "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^1.6.0" - } - }, - "vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==" - }, - "vite": { - "version": "4.4.4", - "resolved": "https://registry.npmjs.org/vite/-/vite-4.4.4.tgz", - "integrity": "sha512-4mvsTxjkveWrKDJI70QmelfVqTm+ihFAb6+xf4sjEU2TmUCTlVX87tmg/QooPEMQb/lM9qGHT99ebqPziEd3wg==", - "dev": true, - "requires": { - "esbuild": "^0.18.10", - "fsevents": "~2.3.2", - "postcss": "^8.4.25", - "rollup": "^3.25.2" - }, - "dependencies": { - "@esbuild/android-arm": { - "version": "0.18.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.12.tgz", - "integrity": "sha512-LIxaNIQfkFZbTLb4+cX7dozHlAbAshhFE5PKdro0l+FnCpx1GDJaQ2WMcqm+ToXKMt8p8Uojk/MFRuGyz3V5Sw==", - "dev": true, - "optional": true - }, - "@esbuild/android-arm64": { - "version": "0.18.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.12.tgz", - "integrity": "sha512-BMAlczRqC/LUt2P97E4apTBbkvS9JTJnp2DKFbCwpZ8vBvXVbNdqmvzW/OsdtI/+mGr+apkkpqGM8WecLkPgrA==", - "dev": true, - "optional": true - }, - "@esbuild/android-x64": { - "version": "0.18.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.12.tgz", - "integrity": "sha512-zU5MyluNsykf5cOJ0LZZZjgAHbhPJ1cWfdH1ZXVMXxVMhEV0VZiZXQdwBBVvmvbF28EizeK7obG9fs+fpmS0eQ==", - "dev": true, - "optional": true - }, - "@esbuild/darwin-arm64": { - "version": "0.18.12", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.12.tgz", - "integrity": "sha512-zUZMep7YONnp6954QOOwEBwFX9svlKd3ov6PkxKd53LGTHsp/gy7vHaPGhhjBmEpqXEXShi6dddjIkmd+NgMsA==", - "dev": true, - "optional": true - }, - "@esbuild/darwin-x64": { - "version": "0.18.12", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.12.tgz", - "integrity": "sha512-ohqLPc7i67yunArPj1+/FeeJ7AgwAjHqKZ512ADk3WsE3FHU9l+m5aa7NdxXr0HmN1bjDlUslBjWNbFlD9y12Q==", - "dev": true, - "optional": true - }, - "@esbuild/freebsd-arm64": { - "version": "0.18.12", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.12.tgz", - "integrity": "sha512-GIIHtQXqgeOOqdG16a/A9N28GpkvjJnjYMhOnXVbn3EDJcoItdR58v/pGN31CHjyXDc8uCcRnFWmqaJt24AYJg==", - "dev": true, - "optional": true - }, - "@esbuild/freebsd-x64": { - "version": "0.18.12", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.12.tgz", - "integrity": "sha512-zK0b9a1/0wZY+6FdOS3BpZcPc1kcx2G5yxxfEJtEUzVxI6n/FrC2Phsxj/YblPuBchhBZ/1wwn7AyEBUyNSa6g==", - "dev": true, - "optional": true - }, - "@esbuild/linux-arm": { - "version": "0.18.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.12.tgz", - "integrity": "sha512-y75OijvrBE/1XRrXq1jtrJfG26eHeMoqLJ2dwQNwviwTuTtHGCojsDO6BJNF8gU+3jTn1KzJEMETytwsFSvc+Q==", - "dev": true, - "optional": true - }, - "@esbuild/linux-arm64": { - "version": "0.18.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.12.tgz", - "integrity": "sha512-JKgG8Q/LL/9sw/iHHxQyVMoQYu3rU3+a5Z87DxC+wAu3engz+EmctIrV+FGOgI6gWG1z1+5nDDbXiRMGQZXqiw==", - "dev": true, - "optional": true - }, - "@esbuild/linux-ia32": { - "version": "0.18.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.12.tgz", - "integrity": "sha512-yoRIAqc0B4lDIAAEFEIu9ttTRFV84iuAl0KNCN6MhKLxNPfzwCBvEMgwco2f71GxmpBcTtn7KdErueZaM2rEvw==", - "dev": true, - "optional": true - }, - "@esbuild/linux-loong64": { - "version": "0.18.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.12.tgz", - "integrity": "sha512-qYgt3dHPVvf/MgbIBpJ4Sup/yb9DAopZ3a2JgMpNKIHUpOdnJ2eHBo/aQdnd8dJ21X/+sS58wxHtA9lEazYtXQ==", - "dev": true, - "optional": true - }, - "@esbuild/linux-mips64el": { - "version": "0.18.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.12.tgz", - "integrity": "sha512-wHphlMLK4ufNOONqukELfVIbnGQJrHJ/mxZMMrP2jYrPgCRZhOtf0kC4yAXBwnfmULimV1qt5UJJOw4Kh13Yfg==", - "dev": true, - "optional": true - }, - "@esbuild/linux-ppc64": { - "version": "0.18.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.12.tgz", - "integrity": "sha512-TeN//1Ft20ZZW41+zDSdOI/Os1bEq5dbvBvYkberB7PHABbRcsteeoNVZFlI0YLpGdlBqohEpjrn06kv8heCJg==", - "dev": true, - "optional": true - }, - "@esbuild/linux-riscv64": { - "version": "0.18.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.12.tgz", - "integrity": "sha512-AgUebVS4DoAblBgiB2ACQ/8l4eGE5aWBb8ZXtkXHiET9mbj7GuWt3OnsIW/zX+XHJt2RYJZctbQ2S/mDjbp0UA==", - "dev": true, - "optional": true - }, - "@esbuild/linux-s390x": { - "version": "0.18.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.12.tgz", - "integrity": "sha512-dJ3Rb3Ei2u/ysSXd6pzleGtfDdc2MuzKt8qc6ls8vreP1G3B7HInX3i7gXS4BGeVd24pp0yqyS7bJ5NHaI9ing==", - "dev": true, - "optional": true - }, - "@esbuild/linux-x64": { - "version": "0.18.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.12.tgz", - "integrity": "sha512-OrNJMGQbPaVyHHcDF8ybNSwu7TDOfX8NGpXCbetwOSP6txOJiWlgQnRymfC9ocR1S0Y5PW0Wb1mV6pUddqmvmQ==", - "dev": true, - "optional": true - }, - "@esbuild/netbsd-x64": { - "version": "0.18.12", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.12.tgz", - "integrity": "sha512-55FzVCAiwE9FK8wWeCRuvjazNRJ1QqLCYGZVB6E8RuQuTeStSwotpSW4xoRGwp3a1wUsaVCdYcj5LGCASVJmMg==", - "dev": true, - "optional": true - }, - "@esbuild/openbsd-x64": { - "version": "0.18.12", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.12.tgz", - "integrity": "sha512-qnluf8rfb6Y5Lw2tirfK2quZOBbVqmwxut7GPCIJsM8lc4AEUj9L8y0YPdLaPK0TECt4IdyBdBD/KRFKorlK3g==", - "dev": true, - "optional": true - }, - "@esbuild/sunos-x64": { - "version": "0.18.12", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.12.tgz", - "integrity": "sha512-+RkKpVQR7bICjTOPUpkTBTaJ4TFqQBX5Ywyd/HSdDkQGn65VPkTsR/pL4AMvuMWy+wnXgIl4EY6q4mVpJal8Kg==", - "dev": true, - "optional": true - }, - "@esbuild/win32-arm64": { - "version": "0.18.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.12.tgz", - "integrity": "sha512-GNHuciv0mFM7ouzsU0+AwY+7eV4Mgo5WnbhfDCQGtpvOtD1vbOiRjPYG6dhmMoFyBjj+pNqQu2X+7DKn0KQ/Gw==", - "dev": true, - "optional": true - }, - "@esbuild/win32-ia32": { - "version": "0.18.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.12.tgz", - "integrity": "sha512-kR8cezhYipbbypGkaqCTWIeu4zID17gamC8YTPXYtcN3E5BhhtTnwKBn9I0PJur/T6UVwIEGYzkffNL0lFvxEw==", - "dev": true, - "optional": true - }, - "@esbuild/win32-x64": { - "version": "0.18.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.12.tgz", - "integrity": "sha512-O0UYQVkvfM/jO8a4OwoV0mAKSJw+mjWTAd1MJd/1FCX6uiMdLmMRPK/w6e9OQ0ob2WGxzIm9va/KG0Ja4zIOgg==", - "dev": true, - "optional": true - }, - "esbuild": { - "version": "0.18.12", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.12.tgz", - "integrity": "sha512-XuOVLDdtsDslXStStduT41op21Ytmf4/BDS46aa3xPJ7X5h2eMWBF1oAe3QjUH3bDksocNXgzGUZ7XHIBya6Tg==", - "dev": true, - "requires": { - "@esbuild/android-arm": "0.18.12", - "@esbuild/android-arm64": "0.18.12", - "@esbuild/android-x64": "0.18.12", - "@esbuild/darwin-arm64": "0.18.12", - "@esbuild/darwin-x64": "0.18.12", - "@esbuild/freebsd-arm64": "0.18.12", - "@esbuild/freebsd-x64": "0.18.12", - "@esbuild/linux-arm": "0.18.12", - "@esbuild/linux-arm64": "0.18.12", - "@esbuild/linux-ia32": "0.18.12", - "@esbuild/linux-loong64": "0.18.12", - "@esbuild/linux-mips64el": "0.18.12", - "@esbuild/linux-ppc64": "0.18.12", - "@esbuild/linux-riscv64": "0.18.12", - "@esbuild/linux-s390x": "0.18.12", - "@esbuild/linux-x64": "0.18.12", - "@esbuild/netbsd-x64": "0.18.12", - "@esbuild/openbsd-x64": "0.18.12", - "@esbuild/sunos-x64": "0.18.12", - "@esbuild/win32-arm64": "0.18.12", - "@esbuild/win32-ia32": "0.18.12", - "@esbuild/win32-x64": "0.18.12" - } - } - } - }, - "vite-node": { - "version": "0.33.0", - "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-0.33.0.tgz", - "integrity": "sha512-19FpHYbwWWxDr73ruNahC+vtEdza52kA90Qb3La98yZ0xULqV8A5JLNPUff0f5zID4984tW7l3DH2przTJUZSw==", - "dev": true, - "requires": { - "cac": "^6.7.14", - "debug": "^4.3.4", - "mlly": "^1.4.0", - "pathe": "^1.1.1", - "picocolors": "^1.0.0", - "vite": "^3.0.0 || ^4.0.0" - } - }, - "vite-tsconfig-paths": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/vite-tsconfig-paths/-/vite-tsconfig-paths-4.2.0.tgz", - "integrity": "sha512-jGpus0eUy5qbbMVGiTxCL1iB9ZGN6Bd37VGLJU39kTDD6ZfULTTb1bcc5IeTWqWJKiWV5YihCaibeASPiGi8kw==", - "dev": true, - "requires": { - "debug": "^4.1.1", - "globrex": "^0.1.2", - "tsconfck": "^2.1.0" - } - }, - "vitest": { - "version": "0.33.0", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-0.33.0.tgz", - "integrity": "sha512-1CxaugJ50xskkQ0e969R/hW47za4YXDUfWJDxip1hwbnhUjYolpfUn2AMOulqG/Dtd9WYAtkHmM/m3yKVrEejQ==", - "dev": true, - "requires": { - "@types/chai": "^4.3.5", - "@types/chai-subset": "^1.3.3", - "@types/node": "*", - "@vitest/expect": "0.33.0", - "@vitest/runner": "0.33.0", - "@vitest/snapshot": "0.33.0", - "@vitest/spy": "0.33.0", - "@vitest/utils": "0.33.0", - "acorn": "^8.9.0", - "acorn-walk": "^8.2.0", - "cac": "^6.7.14", - "chai": "^4.3.7", - "debug": "^4.3.4", - "local-pkg": "^0.4.3", - "magic-string": "^0.30.1", - "pathe": "^1.1.1", - "picocolors": "^1.0.0", - "std-env": "^3.3.3", - "strip-literal": "^1.0.1", - "tinybench": "^2.5.0", - "tinypool": "^0.6.0", - "vite": "^3.0.0 || ^4.0.0", - "vite-node": "0.33.0", - "why-is-node-running": "^2.2.2" - } - }, - "vitest-mock-extended": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/vitest-mock-extended/-/vitest-mock-extended-1.1.4.tgz", - "integrity": "sha512-MKPdepFjk0CE7Ocb5txntHK/sloHO9s0Kk9dr630uL03shRSHMkZtSs5CBPsbJ8K/CvYLv0GHUmMt2zWks2eXg==", - "dev": true, - "requires": { - "ts-essentials": "^9.3.2" - } - }, - "webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "dev": true - }, - "whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dev": true, - "requires": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "why-is-node-running": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.2.2.tgz", - "integrity": "sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==", - "dev": true, - "requires": { - "siginfo": "^2.0.0", - "stackback": "0.0.2" - } - }, - "wide-align": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", - "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", - "dev": true, - "requires": { - "string-width": "^1.0.2 || 2 || 3 || 4" - } - }, - "wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true - }, - "y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==" - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "requires": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - } - }, - "yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==" - }, - "yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true - }, - "yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true - } - } -} diff --git a/services/gateway/package.json b/services/gateway/package.json index 8cec896d..7c7763b7 100644 --- a/services/gateway/package.json +++ b/services/gateway/package.json @@ -8,21 +8,22 @@ "build": "esbuild src/server.ts --bundle --platform=node --target=node18 --outfile=dist/index.js", "test": "vitest", "coverage": "vitest --coverage", + "swagger": "node src/utils/swagger.utils.js", "pkg": "pkg ." }, "dependencies": { - "@grpc/grpc-js": "1.8.14", - "@grpc/proto-loader": "0.7.6", "@types/express": "^4.17.17", "axios": "^1.4.0", "body-parser": "^1.20.2", "dotenv": "^16.0.3", "express": "^4.18.2", - "grpc-server-reflection": "^0.1.5", - "protobufjs": "^7.2.4" + "google-protobuf": "^3.21.2", + "grpc": "^1.24.11", + "swagger-autogen": "^2.23.5" }, "devDependencies": { "@types/amqplib": "^0.10.1", + "@types/google-protobuf": "^3.15.6", "@types/node": "^18.15.9", "@vitest/coverage-c8": "^0.33.0", "esbuild": "^0.17.18", diff --git a/services/gateway/src/controller/user/userController.ts b/services/gateway/src/controller/user/userController.ts new file mode 100644 index 00000000..df9de11d --- /dev/null +++ b/services/gateway/src/controller/user/userController.ts @@ -0,0 +1,31 @@ +import express, {Request, Response} from 'express'; +import userService from '../../services/user_service'; +import {UserId} from "@order/proto/user_pb"; +import {Empty} from "google-protobuf/google/protobuf/empty_pb"; + + +export const userController = (app: express.Application) => { + app.get('/api/user/:id', (req: Request, res: Response) => { + const {id} = req.params; + const userId = new UserId(); + userId.setId(Number(id)); + + userService.getUser(userId, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } + }); + }); + + app.get('/api/user', (req: Request, res: Response) => { + userService.listUser(new Empty(), (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } + }); + }); +} \ No newline at end of file diff --git a/services/gateway/src/index.ts b/services/gateway/src/server.ts similarity index 81% rename from services/gateway/src/index.ts rename to services/gateway/src/server.ts index 4bb2a14d..8c751ad9 100644 --- a/services/gateway/src/index.ts +++ b/services/gateway/src/server.ts @@ -1,4 +1,5 @@ import {Request, Response} from "express"; +import {userController} from "@order/controller/user/userController"; const express = require('express'); const bodyParser = require('body-parser'); @@ -12,6 +13,8 @@ app.get('/', (req: Request, res: Response) => { res.send('Node.js API Gateway is up and running!'); }); +userController(app); + app.listen(PORT, () => { console.log(`API Gateway is running on port ${PORT}`); }); \ No newline at end of file diff --git a/services/gateway/src/services/user_service.ts b/services/gateway/src/services/user_service.ts new file mode 100644 index 00000000..25693673 --- /dev/null +++ b/services/gateway/src/services/user_service.ts @@ -0,0 +1,6 @@ +import services from '../proto/user_grpc_pb'; +import * as grpc from "grpc"; + +export default new services.UserServiceClient( + 'http://localhost:50001', + grpc.credentials.createInsecure()); \ No newline at end of file diff --git a/services/gateway/src/utils/swagger.utils.js b/services/gateway/src/utils/swagger.utils.js new file mode 100644 index 00000000..00b6a82d --- /dev/null +++ b/services/gateway/src/utils/swagger.utils.js @@ -0,0 +1,17 @@ +const swaggerAutogen = require('swagger-autogen')();userController + +const doc = { + info: { + title: 'My API', + description: 'Description' + }, + host: 'localhost:3000' +}; + +const outputFile = './swagger-output.json'; +const routes = ['../controller/user/userController.ts']; + +/* NOTE: If you are using the express Router, you must pass in the 'routes' only the +root file where the route starts, such as index.js, app.js, routes.js, etc ... */ + +swaggerAutogen(outputFile, routes, doc); \ No newline at end of file diff --git a/services/proto/build-protos.sh b/services/proto/build-protos.sh new file mode 100644 index 00000000..3334dd19 --- /dev/null +++ b/services/proto/build-protos.sh @@ -0,0 +1,23 @@ +#!/bin/bash + +BASEDIR=$(dirname "$0") +cd ${BASEDIR}/../ + +PROTO_DEST=./src/proto + +mkdir -p ${PROTO_DEST} + +# JavaScript code generation +yarn run grpc_tools_node_protoc \ + --js_out=import_style=commonjs,binary:${PROTO_DEST} \ + --grpc_out=${PROTO_DEST} \ + --plugin=protoc-gen-grpc=./node_modules/.bin/grpc_tools_node_protoc_plugin \ + -I ./proto \ + proto/*.proto + +# TypeScript code generation +yarn run grpc_tools_node_protoc \ + --plugin=protoc-gen-ts=./node_modules/.bin/protoc-gen-ts \ + --ts_out=${PROTO_DEST} \ + -I ./proto \ + proto/*.proto \ No newline at end of file From dd2f37ec61e37b759ad42df6aced54ce3f537889 Mon Sep 17 00:00:00 2001 From: anatole Date: Wed, 19 Jul 2023 00:40:40 +0200 Subject: [PATCH 316/883] feat(app): add package-lock.json --- services/gateway/package-lock.json | 7718 ++++++++++++++++++++++++++++ 1 file changed, 7718 insertions(+) create mode 100644 services/gateway/package-lock.json diff --git a/services/gateway/package-lock.json b/services/gateway/package-lock.json new file mode 100644 index 00000000..ba01f642 --- /dev/null +++ b/services/gateway/package-lock.json @@ -0,0 +1,7718 @@ +{ + "name": "@goodfood/gateway", + "version": "1.0.0", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "@goodfood/gateway", + "version": "1.0.0", + "license": "ISC", + "dependencies": { + "@types/express": "^4.17.17", + "axios": "^1.4.0", + "body-parser": "^1.20.2", + "dotenv": "^16.0.3", + "express": "^4.18.2", + "google-protobuf": "^3.21.2", + "grpc": "^1.24.11", + "swagger-autogen": "^2.23.5" + }, + "bin": { + "gateway": "dist/index.js" + }, + "devDependencies": { + "@types/amqplib": "^0.10.1", + "@types/google-protobuf": "^3.15.6", + "@types/node": "^18.15.9", + "@vitest/coverage-c8": "^0.33.0", + "esbuild": "^0.17.18", + "grpc-tools": "^1.12.4", + "nodemon": "^3.0.1", + "pkg": "^5.8.1", + "ts-node": "10.9.1", + "tsconfig-paths": "^4.2.0", + "typescript": "5.0.2", + "vite-tsconfig-paths": "^4.2.0", + "vitest": "^0.33.0", + "vitest-mock-extended": "^1.1.4" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", + "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/generator": { + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.2.tgz", + "integrity": "sha512-W1lG5vUwFvfMd8HVXqdfbuG7RuaSrTCCD8cl8fP8wOivdbtbIg2Db3IWUcgvfxKbbn6ZBGYRW/Zk1MIwK49mgw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.18.2", + "@jridgewell/gen-mapping": "^0.3.0", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", + "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz", + "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.18.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.4.tgz", + "integrity": "sha512-FDge0dFazETFcxGw/EXzOkN8uJp0PC7Qbm+Pe9T+av2zlBpOgunFHkQPPn+eRuClU73JF+98D531UgayY89tow==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/types": { + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.19.0.tgz", + "integrity": "sha512-YuGopBq3ke25BVSiS6fgF49Ul9gH1x70Bcr6bqRLjWCkcX8Hre1/5+z+IiWOIerRMSSEfGZVB9z9kyq7wVs9YA==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.18.10", + "@babel/helper-validator-identifier": "^7.18.6", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true + }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.19.tgz", + "integrity": "sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/schemas": { + "version": "29.6.0", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.0.tgz", + "integrity": "sha512-rxLjXyJBTL4LQeJW3aKo0M/+GkCOXsO+8i9Iu7eDb6KwtP65ayoDsitrdPBtujxQ88k4wI2FNYfa6TOGwSn6cQ==", + "dev": true, + "dependencies": { + "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.18", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", + "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" + } + }, + "node_modules/@jridgewell/trace-mapping/node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "dev": true + }, + "node_modules/@mapbox/node-pre-gyp": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.11.tgz", + "integrity": "sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==", + "dependencies": { + "detect-libc": "^2.0.0", + "https-proxy-agent": "^5.0.0", + "make-dir": "^3.1.0", + "node-fetch": "^2.6.7", + "nopt": "^5.0.0", + "npmlog": "^5.0.1", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.11" + }, + "bin": { + "node-pre-gyp": "bin/node-pre-gyp" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "dev": true + }, + "node_modules/@tsconfig/node10": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", + "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", + "dev": true + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", + "dev": true + }, + "node_modules/@types/amqplib": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/@types/amqplib/-/amqplib-0.10.1.tgz", + "integrity": "sha512-j6ANKT79ncUDnAs/+9r9eDujxbeJoTjoVu33gHHcaPfmLQaMhvfbH2GqSe8KUM444epAp1Vl3peVOQfZk3UIqA==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/body-parser": { + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", + "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/bytebuffer": { + "version": "5.0.44", + "resolved": "https://registry.npmjs.org/@types/bytebuffer/-/bytebuffer-5.0.44.tgz", + "integrity": "sha512-k1qonHga/SfQT02NF633i+7tIfKd+cfC/8pjnedcfuXJNMWooss/FkCgRMSnLf2WorLjbuH4bfgAZEbtyHBDoQ==", + "dependencies": { + "@types/long": "^3.0.0", + "@types/node": "*" + } + }, + "node_modules/@types/bytebuffer/node_modules/@types/long": { + "version": "3.0.32", + "resolved": "https://registry.npmjs.org/@types/long/-/long-3.0.32.tgz", + "integrity": "sha512-ZXyOOm83p7X8p3s0IYM3VeueNmHpkk/yMlP8CLeOnEcu6hIwPH7YjZBvhQkR0ZFS2DqZAxKtJ/M5fcuv3OU5BA==" + }, + "node_modules/@types/chai": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.5.tgz", + "integrity": "sha512-mEo1sAde+UCE6b2hxn332f1g1E8WfYRu6p5SvTKr2ZKC1f7gFJXk4h5PyGP9Dt6gCaG8y8XhwnXWC6Iy2cmBng==", + "dev": true + }, + "node_modules/@types/chai-subset": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@types/chai-subset/-/chai-subset-1.3.3.tgz", + "integrity": "sha512-frBecisrNGz+F4T6bcc+NLeolfiojh5FxW2klu669+8BARtyQv2C/GkNW6FUodVe4BroGMP/wER/YDGc7rEllw==", + "dev": true, + "dependencies": { + "@types/chai": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.35", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", + "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/express": { + "version": "4.17.17", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.17.tgz", + "integrity": "sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==", + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "4.17.35", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.35.tgz", + "integrity": "sha512-wALWQwrgiB2AWTT91CB62b6Yt0sNHpznUXeZEcnPU3DRdlDIz74x8Qg1UUYKSVFi+va5vKOLYRBI1bRKiLLKIg==", + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/google-protobuf": { + "version": "3.15.6", + "resolved": "https://registry.npmjs.org/@types/google-protobuf/-/google-protobuf-3.15.6.tgz", + "integrity": "sha512-pYVNNJ+winC4aek+lZp93sIKxnXt5qMkuKmaqS3WGuTq0Bw1ZDYNBgzG5kkdtwcv+GmYJGo3yEg6z2cKKAiEdw==", + "dev": true + }, + "node_modules/@types/http-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-/K3ds8TRAfBvi5vfjuz8y6+GiAYBZ0x4tXv1Av6CWBWn0IlADc+ZX9pMq7oU0fNQPnBwIZl3rmeLp6SBApbxSQ==" + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", + "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", + "dev": true + }, + "node_modules/@types/mime": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", + "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==" + }, + "node_modules/@types/node": { + "version": "18.15.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.9.tgz", + "integrity": "sha512-dUxhiNzBLr6IqlZXz6e/rN2YQXlFgOei/Dxy+e3cyXTJ4txSUbGT2/fmnD6zd/75jDMeW5bDee+YXxlFKHoV0A==" + }, + "node_modules/@types/qs": { + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==" + }, + "node_modules/@types/range-parser": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", + "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==" + }, + "node_modules/@types/send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.1.tgz", + "integrity": "sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q==", + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.2.tgz", + "integrity": "sha512-J2LqtvFYCzaj8pVYKw8klQXrLLk7TBZmQ4ShlcdkELFKGwGMfevMLneMMRkMgZxotOD9wg497LpC7O8PcvAmfw==", + "dependencies": { + "@types/http-errors": "*", + "@types/mime": "*", + "@types/node": "*" + } + }, + "node_modules/@vitest/coverage-c8": { + "version": "0.33.0", + "resolved": "https://registry.npmjs.org/@vitest/coverage-c8/-/coverage-c8-0.33.0.tgz", + "integrity": "sha512-DaF1zJz4dcOZS4k/neiQJokmOWqsGXwhthfmUdPGorXIQHjdPvV6JQSYhQDI41MyI8c+IieQUdIDs5XAMHtDDw==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.2.1", + "c8": "^7.14.0", + "magic-string": "^0.30.1", + "picocolors": "^1.0.0", + "std-env": "^3.3.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "vitest": ">=0.30.0 <1" + } + }, + "node_modules/@vitest/expect": { + "version": "0.33.0", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-0.33.0.tgz", + "integrity": "sha512-sVNf+Gla3mhTCxNJx+wJLDPp/WcstOe0Ksqz4Vec51MmgMth/ia0MGFEkIZmVGeTL5HtjYR4Wl/ZxBxBXZJTzQ==", + "dev": true, + "dependencies": { + "@vitest/spy": "0.33.0", + "@vitest/utils": "0.33.0", + "chai": "^4.3.7" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/runner": { + "version": "0.33.0", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-0.33.0.tgz", + "integrity": "sha512-UPfACnmCB6HKRHTlcgCoBh6ppl6fDn+J/xR8dTufWiKt/74Y9bHci5CKB8tESSV82zKYtkBJo9whU3mNvfaisg==", + "dev": true, + "dependencies": { + "@vitest/utils": "0.33.0", + "p-limit": "^4.0.0", + "pathe": "^1.1.1" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/runner/node_modules/p-limit": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", + "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^1.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@vitest/runner/node_modules/yocto-queue": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", + "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", + "dev": true, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@vitest/snapshot": { + "version": "0.33.0", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-0.33.0.tgz", + "integrity": "sha512-tJjrl//qAHbyHajpFvr8Wsk8DIOODEebTu7pgBrP07iOepR5jYkLFiqLq2Ltxv+r0uptUb4izv1J8XBOwKkVYA==", + "dev": true, + "dependencies": { + "magic-string": "^0.30.1", + "pathe": "^1.1.1", + "pretty-format": "^29.5.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/spy": { + "version": "0.33.0", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-0.33.0.tgz", + "integrity": "sha512-Kv+yZ4hnH1WdiAkPUQTpRxW8kGtH8VRTnus7ZTGovFYM1ZezJpvGtb9nPIjPnptHbsyIAxYZsEpVPYgtpjGnrg==", + "dev": true, + "dependencies": { + "tinyspy": "^2.1.1" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/utils": { + "version": "0.33.0", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-0.33.0.tgz", + "integrity": "sha512-pF1w22ic965sv+EN6uoePkAOTkAPWM03Ri/jXNyMIKBb/XHLDPfhLvf/Fa9g0YECevAIz56oVYXhodLvLQ/awA==", + "dev": true, + "dependencies": { + "diff-sequences": "^29.4.3", + "loupe": "^2.3.6", + "pretty-format": "^29.5.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/aproba": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==" + }, + "node_modules/are-we-there-yet": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", + "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ascli": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ascli/-/ascli-1.0.1.tgz", + "integrity": "sha512-JGQaNxpaCJz9Bd1JvVaFIHuWn9S+l3xhN17R0V/vmUDiGE0QngNMXhjlqpwqV+91plWz9Fg+Lt28Lj7p5vjs8A==", + "dependencies": { + "colour": "~0.7.1", + "optjs": "~3.2.2" + } + }, + "node_modules/assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "node_modules/at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/axios": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.4.0.tgz", + "integrity": "sha512-S4XCWMEmzvo64T9GfvQDOXgYRDJ/wsSZc7Jvdgx5u1sd0JwsuPLqb3SYmusag+edF6ziyMensPVqLTSc1PiSEA==", + "dependencies": { + "follow-redirects": "^1.15.0", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dev": true, + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/body-parser": { + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", + "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/bytebuffer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/bytebuffer/-/bytebuffer-5.0.1.tgz", + "integrity": "sha512-IuzSdmADppkZ6DlpycMkm8l9zeEq16fWtLvunEwFiYciR/BHo4E8/xs5piFquG+Za8OWmMqHF8zuRviz2LHvRQ==", + "dependencies": { + "long": "~3" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/bytebuffer/node_modules/long": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/long/-/long-3.2.0.tgz", + "integrity": "sha512-ZYvPPOMqUwPoDsbJaR10iQJYnMuZhRTvHYl62ErLIEX7RgFlziSBUUvrt3OVfc47QlHHpzPZYP17g3Fv7oeJkg==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/c8": { + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/c8/-/c8-7.14.0.tgz", + "integrity": "sha512-i04rtkkcNcCf7zsQcSv/T9EbUn4RXQ6mropeMcjFOsQXQ0iGLAr/xT6TImQg4+U9hmNpN9XdvPkjUL1IzbgxJw==", + "dev": true, + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@istanbuljs/schema": "^0.1.3", + "find-up": "^5.0.0", + "foreground-child": "^2.0.0", + "istanbul-lib-coverage": "^3.2.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-reports": "^3.1.4", + "rimraf": "^3.0.2", + "test-exclude": "^6.0.0", + "v8-to-istanbul": "^9.0.0", + "yargs": "^16.2.0", + "yargs-parser": "^20.2.9" + }, + "bin": { + "c8": "bin/c8.js" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/cac": { + "version": "6.7.14", + "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", + "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha512-DLIsRzJVBQu72meAKPkWQOLcujdXT32hwdfnkI1frSiSRMK1MofjKHf+MEx0SB6fjEFXL8fBDv1dKymBlOp4Qw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/chai": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.7.tgz", + "integrity": "sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==", + "dev": true, + "dependencies": { + "assertion-error": "^1.1.0", + "check-error": "^1.0.2", + "deep-eql": "^4.1.2", + "get-func-name": "^2.0.0", + "loupe": "^2.3.1", + "pathval": "^1.1.1", + "type-detect": "^4.0.5" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/check-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", + "integrity": "sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "engines": { + "node": ">=10" + } + }, + "node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "bin": { + "color-support": "bin.js" + } + }, + "node_modules/colour": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/colour/-/colour-0.7.1.tgz", + "integrity": "sha512-Rel466v0EnmKPcsxHo91L4kgPs/6XF7Pu2LJNszq9lXYwi5CFWEeIiRaTX5ym7PPMdj4udDHkLSVC1//JVkZQg==", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "node_modules/console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==" + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true + }, + "node_modules/cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "dev": true + }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "dev": true, + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/deep-eql": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz", + "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==", + "dev": true, + "dependencies": { + "type-detect": "^4.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "dev": true, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==" + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detect-libc": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz", + "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/diff-sequences": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.4.3.tgz", + "integrity": "sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dotenv": { + "version": "16.3.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.3.1.tgz", + "integrity": "sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/motdotla/dotenv?sponsor=1" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/esbuild": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.19.tgz", + "integrity": "sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.17.19", + "@esbuild/android-arm64": "0.17.19", + "@esbuild/android-x64": "0.17.19", + "@esbuild/darwin-arm64": "0.17.19", + "@esbuild/darwin-x64": "0.17.19", + "@esbuild/freebsd-arm64": "0.17.19", + "@esbuild/freebsd-x64": "0.17.19", + "@esbuild/linux-arm": "0.17.19", + "@esbuild/linux-arm64": "0.17.19", + "@esbuild/linux-ia32": "0.17.19", + "@esbuild/linux-loong64": "0.17.19", + "@esbuild/linux-mips64el": "0.17.19", + "@esbuild/linux-ppc64": "0.17.19", + "@esbuild/linux-riscv64": "0.17.19", + "@esbuild/linux-s390x": "0.17.19", + "@esbuild/linux-x64": "0.17.19", + "@esbuild/netbsd-x64": "0.17.19", + "@esbuild/openbsd-x64": "0.17.19", + "@esbuild/sunos-x64": "0.17.19", + "@esbuild/win32-arm64": "0.17.19", + "@esbuild/win32-ia32": "0.17.19", + "@esbuild/win32-x64": "0.17.19" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/expand-template": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", + "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/express": { + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.1", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.5.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/express/node_modules/body-parser": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/express/node_modules/raw-body": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/fast-glob": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.0.tgz", + "integrity": "sha512-ChDuvbOypPuNjO8yIDf36x7BlZX1smcUMTTcyoIjycexOxd6DFsKsg21qVBzEmr3G7fUKIRy2/psii+CIUt7FA==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/follow-redirects": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/foreground-child": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", + "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + } + }, + "node_modules/from2/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/from2/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/from2/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "dev": true + }, + "node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/fs-minipass/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "node_modules/gauge": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", + "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", + "dependencies": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.2", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.1", + "object-assign": "^4.1.1", + "signal-exit": "^3.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-func-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", + "integrity": "sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/github-from-package": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", + "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==", + "dev": true + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globrex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz", + "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==", + "dev": true + }, + "node_modules/google-protobuf": { + "version": "3.21.2", + "resolved": "https://registry.npmjs.org/google-protobuf/-/google-protobuf-3.21.2.tgz", + "integrity": "sha512-3MSOYFO5U9mPGikIYCzK0SaThypfGgS6bHqrUGXG3DPHCrb+txNqeEcns1W0lkGfk0rCyNXm7xB9rMxnCiZOoA==" + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true + }, + "node_modules/grpc": { + "version": "1.24.11", + "resolved": "https://registry.npmjs.org/grpc/-/grpc-1.24.11.tgz", + "integrity": "sha512-8/AQdFCzCeCDWW3SoaMNp6ccbRvTQEH1O1u1uFtt29eWsg5gSZCJ3m6fbkduEIh3smY7WAPP+LgVJ5n3nZRxcA==", + "deprecated": "This library will not receive further updates other than security fixes. We recommend using @grpc/grpc-js instead.", + "hasInstallScript": true, + "dependencies": { + "@mapbox/node-pre-gyp": "^1.0.4", + "@types/bytebuffer": "^5.0.40", + "lodash.camelcase": "^4.3.0", + "lodash.clone": "^4.5.0", + "nan": "^2.13.2", + "protobufjs": "^5.0.3" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/grpc-tools": { + "version": "1.12.4", + "resolved": "https://registry.npmjs.org/grpc-tools/-/grpc-tools-1.12.4.tgz", + "integrity": "sha512-5+mLAJJma3BjnW/KQp6JBjUMgvu7Mu3dBvBPd1dcbNIb+qiR0817zDpgPjS7gRb+l/8EVNIa3cB02xI9JLToKg==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "@mapbox/node-pre-gyp": "^1.0.5" + }, + "bin": { + "grpc_tools_node_protoc": "bin/protoc.js", + "grpc_tools_node_protoc_plugin": "bin/protoc_plugin.js" + } + }, + "node_modules/grpc/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/grpc/node_modules/cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha512-0yayqDxWQbqk3ojkYqUKqaAQ6AfNKeKWRNA8kR0WXzAsdHpP4BIaOmMAG87JGuO6qcobyW4GjxHd9PmhEd+T9w==", + "dependencies": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" + } + }, + "node_modules/grpc/node_modules/is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==", + "dependencies": { + "number-is-nan": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/grpc/node_modules/protobufjs": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-5.0.3.tgz", + "integrity": "sha512-55Kcx1MhPZX0zTbVosMQEO5R6/rikNXd9b6RQK4KSPcrSIIwoXTtebIczUrXlwaSrbz4x8XUVThGPob1n8I4QA==", + "dependencies": { + "ascli": "~1", + "bytebuffer": "~5", + "glob": "^7.0.5", + "yargs": "^3.10.0" + }, + "bin": { + "pbjs": "bin/pbjs" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/grpc/node_modules/string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==", + "dependencies": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/grpc/node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/grpc/node_modules/wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha512-vAaEaDM946gbNpH5pLVNR+vX2ht6n0Bt3GXwVB1AuAqZosOvHNF3P7wDnh8KLkSqgUh0uh77le7Owgoz+Z9XBw==", + "dependencies": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/grpc/node_modules/y18n": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.2.tgz", + "integrity": "sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==" + }, + "node_modules/grpc/node_modules/yargs": { + "version": "3.32.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.32.0.tgz", + "integrity": "sha512-ONJZiimStfZzhKamYvR/xvmgW3uEkAUFSP91y2caTEPhzF6uP2JfPiVZcq66b/YR0C3uitxSV7+T1x8p5bkmMg==", + "dependencies": { + "camelcase": "^2.0.1", + "cliui": "^3.0.3", + "decamelize": "^1.1.1", + "os-locale": "^1.4.0", + "string-width": "^1.0.1", + "window-size": "^0.1.4", + "y18n": "^3.2.0" + } + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==" + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/ignore": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/ignore-by-default": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", + "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==", + "dev": true + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true + }, + "node_modules/into-stream": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/into-stream/-/into-stream-6.0.0.tgz", + "integrity": "sha512-XHbaOAvP+uFKUFsOgoNPRjLkwB+I22JFPFe5OjTkQ0nwgj6+pSjb4NmB6VMxaPshLiOf+zcpOCBQuLwC1KHhZA==", + "dev": true, + "dependencies": { + "from2": "^2.3.0", + "p-is-promise": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/invert-kv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha512-xgs2NH9AE66ucSq4cNG1nhSFghr5l6tdL15Pk+jl46bmmBapgoaY/AacXyaDznAqmGL99TiLSQgO/XazFSKYeQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz", + "integrity": "sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", + "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "dev": true, + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-reports": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", + "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", + "dev": true, + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonc-parser": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", + "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", + "dev": true + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/lcid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha512-YiGkH6EnGrDGqLMITnGjXtGmNtjoXw9SVUzcaos8RBi7Ps0VBylkq+vOcY9QE5poLasPCR849ucFUkl0UzUyOw==", + "dependencies": { + "invert-kv": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/local-pkg": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.4.3.tgz", + "integrity": "sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==" + }, + "node_modules/lodash.clone": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clone/-/lodash.clone-4.5.0.tgz", + "integrity": "sha512-GhrVeweiTD6uTmmn5hV/lzgCQhccwReIVRLHp7LT4SopOjqEZ5BbX8b5WWEtAKasjmy8hR7ZPwsYlxRCku5odg==" + }, + "node_modules/loupe": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.6.tgz", + "integrity": "sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==", + "dev": true, + "dependencies": { + "get-func-name": "^2.0.0" + } + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/magic-string": { + "version": "0.30.1", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.1.tgz", + "integrity": "sha512-mbVKXPmS0z0G4XqFDCTllmDQ6coZzn94aMlb0o/A4HEHJCKcanlDZwYJgwnkmgD3jyWhUgj9VsPrfd972yPffA==", + "dev": true, + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.15" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minizlib/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mkdirp-classic": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", + "dev": true + }, + "node_modules/mlly": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.4.0.tgz", + "integrity": "sha512-ua8PAThnTwpprIaU47EPeZ/bPUVp2QYBbWMphUQpVdBI3Lgqzm5KZQ45Agm3YJedHXaIHl6pBGabaLSUPPSptg==", + "dev": true, + "dependencies": { + "acorn": "^8.9.0", + "pathe": "^1.1.1", + "pkg-types": "^1.0.3", + "ufo": "^1.1.2" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/multistream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/multistream/-/multistream-4.1.0.tgz", + "integrity": "sha512-J1XDiAmmNpRCBfIWJv+n0ymC4ABcf/Pl+5YvC5B/D2f/2+8PtHvCNxMPKiQcZyi922Hq69J2YOpb1pTywfifyw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "once": "^1.4.0", + "readable-stream": "^3.6.0" + } + }, + "node_modules/nan": { + "version": "2.17.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.17.0.tgz", + "integrity": "sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ==" + }, + "node_modules/nanoid": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", + "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/napi-build-utils": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", + "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==", + "dev": true + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/node-abi": { + "version": "3.45.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.45.0.tgz", + "integrity": "sha512-iwXuFrMAcFVi/ZoZiqq8BzAdsLw9kxDfTC0HMyjXfSL/6CSDAGD5UmR7azrAgWV1zKYq7dUUMj4owusBWKLsiQ==", + "dev": true, + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/node-fetch": { + "version": "2.6.12", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.12.tgz", + "integrity": "sha512-C/fGU2E8ToujUivIO0H+tpQ6HWo4eEmchoPIoXtxCrVghxdKq+QOHqEZW7tuP3KlV3bC8FRMO5nMCC7Zm1VP6g==", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/nodemon": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.0.1.tgz", + "integrity": "sha512-g9AZ7HmkhQkqXkRc20w+ZfQ73cHLbE8hnPbtaFbFtCumZsjyMhKk9LajQ07U5Ux28lvFjZ5X7HvWR1xzU8jHVw==", + "dev": true, + "dependencies": { + "chokidar": "^3.5.2", + "debug": "^3.2.7", + "ignore-by-default": "^1.0.1", + "minimatch": "^3.1.2", + "pstree.remy": "^1.1.8", + "semver": "^7.5.3", + "simple-update-notifier": "^2.0.0", + "supports-color": "^5.5.0", + "touch": "^3.1.0", + "undefsafe": "^2.0.5" + }, + "bin": { + "nodemon": "bin/nodemon.js" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/nodemon" + } + }, + "node_modules/nodemon/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/nodemon/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/nodemon/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npmlog": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", + "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", + "dependencies": { + "are-we-there-yet": "^2.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^3.0.0", + "set-blocking": "^2.0.0" + } + }, + "node_modules/number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/optjs": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/optjs/-/optjs-3.2.2.tgz", + "integrity": "sha512-f8lTJm4LKirX+45xsFhuRNjA4f46QVLQKfGoNH7e2AEWS+24eM4XNH4pQ8Tw2LISCIvbST/wNcLdtgvgcqVaxA==" + }, + "node_modules/os-locale": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "integrity": "sha512-PRT7ZORmwu2MEFt4/fv3Q+mEfN4zetKxufQrkShY2oGvUms9r8otu5HfdyIFHkYXjO7laNsoVGmM2MANfuTA8g==", + "dependencies": { + "lcid": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/p-is-promise": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-3.0.0.tgz", + "integrity": "sha512-Wo8VsW4IRQSKVXsJCn7TomUaVtyfjVDn3nUP7kE967BQk0CwFpdbZs0X0uk5sW9mkBa9eNM7hCMaG93WUAwxYQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/pathe": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.1.tgz", + "integrity": "sha512-d+RQGp0MAYTIaDBIMmOfMwz3E+LOZnxx1HZd5R18mmCZY0QBlK0LDZfPc8FW8Ed2DlvsuE6PRjroDY+wg4+j/Q==", + "dev": true + }, + "node_modules/pathval": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", + "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pkg": { + "version": "5.8.1", + "resolved": "https://registry.npmjs.org/pkg/-/pkg-5.8.1.tgz", + "integrity": "sha512-CjBWtFStCfIiT4Bde9QpJy0KeH19jCfwZRJqHFDFXfhUklCx8JoFmMj3wgnEYIwGmZVNkhsStPHEOnrtrQhEXA==", + "dev": true, + "dependencies": { + "@babel/generator": "7.18.2", + "@babel/parser": "7.18.4", + "@babel/types": "7.19.0", + "chalk": "^4.1.2", + "fs-extra": "^9.1.0", + "globby": "^11.1.0", + "into-stream": "^6.0.0", + "is-core-module": "2.9.0", + "minimist": "^1.2.6", + "multistream": "^4.1.0", + "pkg-fetch": "3.4.2", + "prebuild-install": "7.1.1", + "resolve": "^1.22.0", + "stream-meter": "^1.0.4" + }, + "bin": { + "pkg": "lib-es5/bin.js" + }, + "peerDependencies": { + "node-notifier": ">=9.0.1" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/pkg-fetch": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/pkg-fetch/-/pkg-fetch-3.4.2.tgz", + "integrity": "sha512-0+uijmzYcnhC0hStDjm/cl2VYdrmVVBpe7Q8k9YBojxmR5tG8mvR9/nooQq3QSXiQqORDVOTY3XqMEqJVIzkHA==", + "dev": true, + "dependencies": { + "chalk": "^4.1.2", + "fs-extra": "^9.1.0", + "https-proxy-agent": "^5.0.0", + "node-fetch": "^2.6.6", + "progress": "^2.0.3", + "semver": "^7.3.5", + "tar-fs": "^2.1.1", + "yargs": "^16.2.0" + }, + "bin": { + "pkg-fetch": "lib-es5/bin.js" + } + }, + "node_modules/pkg-types": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.0.3.tgz", + "integrity": "sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==", + "dev": true, + "dependencies": { + "jsonc-parser": "^3.2.0", + "mlly": "^1.2.0", + "pathe": "^1.1.0" + } + }, + "node_modules/postcss": { + "version": "8.4.26", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.26.tgz", + "integrity": "sha512-jrXHFF8iTloAenySjM/ob3gSj7pCu0Ji49hnjqzsgSRa50hkWCKD0HQ+gMNJkW38jBI68MpAAg7ZWwHwX8NMMw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/prebuild-install": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.1.tgz", + "integrity": "sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==", + "dev": true, + "dependencies": { + "detect-libc": "^2.0.0", + "expand-template": "^2.0.3", + "github-from-package": "0.0.0", + "minimist": "^1.2.3", + "mkdirp-classic": "^0.5.3", + "napi-build-utils": "^1.0.1", + "node-abi": "^3.3.0", + "pump": "^3.0.0", + "rc": "^1.2.7", + "simple-get": "^4.0.0", + "tar-fs": "^2.0.0", + "tunnel-agent": "^0.6.0" + }, + "bin": { + "prebuild-install": "bin.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/pretty-format": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.1.tgz", + "integrity": "sha512-7jRj+yXO0W7e4/tSJKoR7HRIHLPPjtNaUGG2xxKQnGvPNRkgWcQ0AZX6P4KBRJN4FcTBWb3sa7DVUJmocYuoog==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.6.0", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, + "node_modules/pstree.remy": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", + "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", + "dev": true + }, + "node_modules/pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dev": true, + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, + "node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", + "dev": true + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.2", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", + "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", + "dev": true, + "dependencies": { + "is-core-module": "^2.11.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve/node_modules/is-core-module": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz", + "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rollup": { + "version": "3.26.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.26.2.tgz", + "integrity": "sha512-6umBIGVz93er97pMgQO08LuH3m6PUb3jlDUUGFsNJB6VgTCUaDFpupf5JfU30529m/UKOgmiX+uY6Sx8cOYpLA==", + "dev": true, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=14.18.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/siginfo": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", + "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", + "dev": true + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + }, + "node_modules/simple-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/simple-get": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", + "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "decompress-response": "^6.0.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } + }, + "node_modules/simple-update-notifier": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", + "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==", + "dev": true, + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stackback": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", + "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", + "dev": true + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/std-env": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.3.3.tgz", + "integrity": "sha512-Rz6yejtVyWnVjC1RFvNmYL10kgjC49EOghxWn0RFqlCHGFpQx+Xe7yW3I4ceK1SGrWIGMjD5Kbue8W/udkbMJg==", + "dev": true + }, + "node_modules/stream-meter": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/stream-meter/-/stream-meter-1.0.4.tgz", + "integrity": "sha512-4sOEtrbgFotXwnEuzzsQBYEV1elAeFSO8rSGeTwabuX1RRn/kEq9JVH7I0MRBhKVRR0sJkr0M0QCH7yOLf9fhQ==", + "dev": true, + "dependencies": { + "readable-stream": "^2.1.4" + } + }, + "node_modules/stream-meter/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/stream-meter/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/stream-meter/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-literal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-1.0.1.tgz", + "integrity": "sha512-QZTsipNpa2Ppr6v1AmJHESqJ3Uz247MUS0OjrnnZjFAvEoWqxuyFuXn2xLgMtRnijJShAa1HL0gtJyUs7u7n3Q==", + "dev": true, + "dependencies": { + "acorn": "^8.8.2" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/swagger-autogen": { + "version": "2.23.5", + "resolved": "https://registry.npmjs.org/swagger-autogen/-/swagger-autogen-2.23.5.tgz", + "integrity": "sha512-4Tl2+XhZMyHoBYkABnScHtQE0lKPKUD3NBt09mClrI6UKOUYljKlYw1xiFVwsHCTGR2hAXmhT4PpgjruCtt1ZA==", + "dependencies": { + "acorn": "^7.4.1", + "deepmerge": "^4.2.2", + "glob": "^7.1.7", + "json5": "^2.2.3" + } + }, + "node_modules/swagger-autogen/node_modules/acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/tar": { + "version": "6.1.15", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.15.tgz", + "integrity": "sha512-/zKt9UyngnxIT/EAGYuxaMYgOIJiP81ab9ZfkILq4oNLPFX50qyYmu7jRj9qeXoxmJHjGlbH0+cm2uy1WCs10A==", + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/tar-fs": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", + "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", + "dev": true, + "dependencies": { + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.1.4" + } + }, + "node_modules/tar-fs/node_modules/chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "dev": true + }, + "node_modules/tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "dev": true, + "dependencies": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tinybench": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.5.0.tgz", + "integrity": "sha512-kRwSG8Zx4tjF9ZiyH4bhaebu+EDz1BOx9hOigYHlUW4xxI/wKIUQUqo018UlU4ar6ATPBsaMrdbKZ+tmPdohFA==", + "dev": true + }, + "node_modules/tinypool": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-0.6.0.tgz", + "integrity": "sha512-FdswUUo5SxRizcBc6b1GSuLpLjisa8N8qMyYoP3rl+bym+QauhtJP5bvZY1ytt8krKGmMLYIRl36HBZfeAoqhQ==", + "dev": true, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tinyspy": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-2.1.1.tgz", + "integrity": "sha512-XPJL2uSzcOyBMky6OFrusqWlzfFrXtE0hPuMgW8A2HmaqrPo4ZQHRN/V0QXN3FSjKxpsbRrFc5LI7KOwBsT1/w==", + "dev": true, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/touch": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", + "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", + "dev": true, + "dependencies": { + "nopt": "~1.0.10" + }, + "bin": { + "nodetouch": "bin/nodetouch.js" + } + }, + "node_modules/touch/node_modules/nopt": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", + "integrity": "sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==", + "dev": true, + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "*" + } + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, + "node_modules/ts-essentials": { + "version": "9.3.2", + "resolved": "https://registry.npmjs.org/ts-essentials/-/ts-essentials-9.3.2.tgz", + "integrity": "sha512-JxKJzuWqH1MmH4ZFHtJzGEhkfN3QvVR3C3w+4BIoWeoY68UVVoA2Np/Bca9z0IPSErVCWhv439aT0We4Dks8kQ==", + "dev": true, + "peerDependencies": { + "typescript": ">=4.1.0" + } + }, + "node_modules/ts-node": { + "version": "10.9.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", + "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", + "dev": true, + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "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 + } + } + }, + "node_modules/tsconfck": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/tsconfck/-/tsconfck-2.1.1.tgz", + "integrity": "sha512-ZPCkJBKASZBmBUNqGHmRhdhM8pJYDdOXp4nRgj/O0JwUwsMq50lCDRQP/M5GBNAA0elPrq4gAeu4dkaVCuKWww==", + "dev": true, + "bin": { + "tsconfck": "bin/tsconfck.js" + }, + "engines": { + "node": "^14.13.1 || ^16 || >=18" + }, + "peerDependencies": { + "typescript": "^4.3.5 || ^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/tsconfig-paths": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", + "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==", + "dev": true, + "dependencies": { + "json5": "^2.2.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "dev": true, + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typescript": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.2.tgz", + "integrity": "sha512-wVORMBGO/FAs/++blGNeAVdbNKtIh1rbBL2EyQ1+J9lClJ93KiiKe8PmFIVdXhHcyv44SL9oglmfeSsndo0jRw==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=12.20" + } + }, + "node_modules/ufo": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.1.2.tgz", + "integrity": "sha512-TrY6DsjTQQgyS3E3dBaOXf0TpPD8u9FVrVYmKVegJuFw51n/YB9XPt+U6ydzFG5ZIN7+DIjPbNmXoBj9esYhgQ==", + "dev": true + }, + "node_modules/undefsafe": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", + "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", + "dev": true + }, + "node_modules/universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true + }, + "node_modules/v8-to-istanbul": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.1.0.tgz", + "integrity": "sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.12", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^1.6.0" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/vite": { + "version": "4.4.4", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.4.4.tgz", + "integrity": "sha512-4mvsTxjkveWrKDJI70QmelfVqTm+ihFAb6+xf4sjEU2TmUCTlVX87tmg/QooPEMQb/lM9qGHT99ebqPziEd3wg==", + "dev": true, + "dependencies": { + "esbuild": "^0.18.10", + "postcss": "^8.4.25", + "rollup": "^3.25.2" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + }, + "peerDependencies": { + "@types/node": ">= 14", + "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 + } + } + }, + "node_modules/vite-node": { + "version": "0.33.0", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-0.33.0.tgz", + "integrity": "sha512-19FpHYbwWWxDr73ruNahC+vtEdza52kA90Qb3La98yZ0xULqV8A5JLNPUff0f5zID4984tW7l3DH2przTJUZSw==", + "dev": true, + "dependencies": { + "cac": "^6.7.14", + "debug": "^4.3.4", + "mlly": "^1.4.0", + "pathe": "^1.1.1", + "picocolors": "^1.0.0", + "vite": "^3.0.0 || ^4.0.0" + }, + "bin": { + "vite-node": "vite-node.mjs" + }, + "engines": { + "node": ">=v14.18.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/vite-tsconfig-paths": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/vite-tsconfig-paths/-/vite-tsconfig-paths-4.2.0.tgz", + "integrity": "sha512-jGpus0eUy5qbbMVGiTxCL1iB9ZGN6Bd37VGLJU39kTDD6ZfULTTb1bcc5IeTWqWJKiWV5YihCaibeASPiGi8kw==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "globrex": "^0.1.2", + "tsconfck": "^2.1.0" + }, + "peerDependencies": { + "vite": "*" + }, + "peerDependenciesMeta": { + "vite": { + "optional": true + } + } + }, + "node_modules/vite/node_modules/@esbuild/linux-x64": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.12.tgz", + "integrity": "sha512-OrNJMGQbPaVyHHcDF8ybNSwu7TDOfX8NGpXCbetwOSP6txOJiWlgQnRymfC9ocR1S0Y5PW0Wb1mV6pUddqmvmQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/esbuild": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.12.tgz", + "integrity": "sha512-XuOVLDdtsDslXStStduT41op21Ytmf4/BDS46aa3xPJ7X5h2eMWBF1oAe3QjUH3bDksocNXgzGUZ7XHIBya6Tg==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.18.12", + "@esbuild/android-arm64": "0.18.12", + "@esbuild/android-x64": "0.18.12", + "@esbuild/darwin-arm64": "0.18.12", + "@esbuild/darwin-x64": "0.18.12", + "@esbuild/freebsd-arm64": "0.18.12", + "@esbuild/freebsd-x64": "0.18.12", + "@esbuild/linux-arm": "0.18.12", + "@esbuild/linux-arm64": "0.18.12", + "@esbuild/linux-ia32": "0.18.12", + "@esbuild/linux-loong64": "0.18.12", + "@esbuild/linux-mips64el": "0.18.12", + "@esbuild/linux-ppc64": "0.18.12", + "@esbuild/linux-riscv64": "0.18.12", + "@esbuild/linux-s390x": "0.18.12", + "@esbuild/linux-x64": "0.18.12", + "@esbuild/netbsd-x64": "0.18.12", + "@esbuild/openbsd-x64": "0.18.12", + "@esbuild/sunos-x64": "0.18.12", + "@esbuild/win32-arm64": "0.18.12", + "@esbuild/win32-ia32": "0.18.12", + "@esbuild/win32-x64": "0.18.12" + } + }, + "node_modules/vitest": { + "version": "0.33.0", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-0.33.0.tgz", + "integrity": "sha512-1CxaugJ50xskkQ0e969R/hW47za4YXDUfWJDxip1hwbnhUjYolpfUn2AMOulqG/Dtd9WYAtkHmM/m3yKVrEejQ==", + "dev": true, + "dependencies": { + "@types/chai": "^4.3.5", + "@types/chai-subset": "^1.3.3", + "@types/node": "*", + "@vitest/expect": "0.33.0", + "@vitest/runner": "0.33.0", + "@vitest/snapshot": "0.33.0", + "@vitest/spy": "0.33.0", + "@vitest/utils": "0.33.0", + "acorn": "^8.9.0", + "acorn-walk": "^8.2.0", + "cac": "^6.7.14", + "chai": "^4.3.7", + "debug": "^4.3.4", + "local-pkg": "^0.4.3", + "magic-string": "^0.30.1", + "pathe": "^1.1.1", + "picocolors": "^1.0.0", + "std-env": "^3.3.3", + "strip-literal": "^1.0.1", + "tinybench": "^2.5.0", + "tinypool": "^0.6.0", + "vite": "^3.0.0 || ^4.0.0", + "vite-node": "0.33.0", + "why-is-node-running": "^2.2.2" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": ">=v14.18.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@vitest/browser": "*", + "@vitest/ui": "*", + "happy-dom": "*", + "jsdom": "*", + "playwright": "*", + "safaridriver": "*", + "webdriverio": "*" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@vitest/browser": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + }, + "playwright": { + "optional": true + }, + "safaridriver": { + "optional": true + }, + "webdriverio": { + "optional": true + } + } + }, + "node_modules/vitest-mock-extended": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/vitest-mock-extended/-/vitest-mock-extended-1.1.4.tgz", + "integrity": "sha512-MKPdepFjk0CE7Ocb5txntHK/sloHO9s0Kk9dr630uL03shRSHMkZtSs5CBPsbJ8K/CvYLv0GHUmMt2zWks2eXg==", + "dev": true, + "dependencies": { + "ts-essentials": "^9.3.2" + }, + "peerDependencies": { + "typescript": "3.x || 4.x || 5.x", + "vitest": ">=0.31.1" + } + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/why-is-node-running": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.2.2.tgz", + "integrity": "sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==", + "dev": true, + "dependencies": { + "siginfo": "^2.0.0", + "stackback": "0.0.2" + }, + "bin": { + "why-is-node-running": "cli.js" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wide-align": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", + "dependencies": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, + "node_modules/window-size": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.4.tgz", + "integrity": "sha512-2thx4pB0cV3h+Bw7QmMXcEbdmOzv9t0HFplJH/Lz6yu60hXYy5RT8rUu+wlIreVxWsGN20mo+MHeCSfUpQBwPw==", + "bin": { + "window-size": "cli.js" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + }, + "dependencies": { + "@ampproject/remapping": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", + "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", + "dev": true, + "requires": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "@babel/generator": { + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.2.tgz", + "integrity": "sha512-W1lG5vUwFvfMd8HVXqdfbuG7RuaSrTCCD8cl8fP8wOivdbtbIg2Db3IWUcgvfxKbbn6ZBGYRW/Zk1MIwK49mgw==", + "dev": true, + "requires": { + "@babel/types": "^7.18.2", + "@jridgewell/gen-mapping": "^0.3.0", + "jsesc": "^2.5.1" + } + }, + "@babel/helper-string-parser": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", + "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", + "dev": true + }, + "@babel/helper-validator-identifier": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz", + "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==", + "dev": true + }, + "@babel/parser": { + "version": "7.18.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.4.tgz", + "integrity": "sha512-FDge0dFazETFcxGw/EXzOkN8uJp0PC7Qbm+Pe9T+av2zlBpOgunFHkQPPn+eRuClU73JF+98D531UgayY89tow==", + "dev": true + }, + "@babel/types": { + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.19.0.tgz", + "integrity": "sha512-YuGopBq3ke25BVSiS6fgF49Ul9gH1x70Bcr6bqRLjWCkcX8Hre1/5+z+IiWOIerRMSSEfGZVB9z9kyq7wVs9YA==", + "dev": true, + "requires": { + "@babel/helper-string-parser": "^7.18.10", + "@babel/helper-validator-identifier": "^7.18.6", + "to-fast-properties": "^2.0.0" + } + }, + "@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true + }, + "@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "requires": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "dependencies": { + "@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "requires": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + } + } + }, + "@esbuild/linux-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.19.tgz", + "integrity": "sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==", + "dev": true, + "optional": true + }, + "@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true + }, + "@jest/schemas": { + "version": "29.6.0", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.0.tgz", + "integrity": "sha512-rxLjXyJBTL4LQeJW3aKo0M/+GkCOXsO+8i9Iu7eDb6KwtP65ayoDsitrdPBtujxQ88k4wI2FNYfa6TOGwSn6cQ==", + "dev": true, + "requires": { + "@sinclair/typebox": "^0.27.8" + } + }, + "@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dev": true, + "requires": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "dev": true + }, + "@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true + }, + "@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true + }, + "@jridgewell/trace-mapping": { + "version": "0.3.18", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", + "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", + "dev": true, + "requires": { + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" + }, + "dependencies": { + "@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "dev": true + } + } + }, + "@mapbox/node-pre-gyp": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.11.tgz", + "integrity": "sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==", + "requires": { + "detect-libc": "^2.0.0", + "https-proxy-agent": "^5.0.0", + "make-dir": "^3.1.0", + "node-fetch": "^2.6.7", + "nopt": "^5.0.0", + "npmlog": "^5.0.1", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.11" + } + }, + "@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + } + }, + "@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true + }, + "@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "requires": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + } + }, + "@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "dev": true + }, + "@tsconfig/node10": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", + "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", + "dev": true + }, + "@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true + }, + "@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true + }, + "@tsconfig/node16": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", + "dev": true + }, + "@types/amqplib": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/@types/amqplib/-/amqplib-0.10.1.tgz", + "integrity": "sha512-j6ANKT79ncUDnAs/+9r9eDujxbeJoTjoVu33gHHcaPfmLQaMhvfbH2GqSe8KUM444epAp1Vl3peVOQfZk3UIqA==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/body-parser": { + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", + "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", + "requires": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "@types/bytebuffer": { + "version": "5.0.44", + "resolved": "https://registry.npmjs.org/@types/bytebuffer/-/bytebuffer-5.0.44.tgz", + "integrity": "sha512-k1qonHga/SfQT02NF633i+7tIfKd+cfC/8pjnedcfuXJNMWooss/FkCgRMSnLf2WorLjbuH4bfgAZEbtyHBDoQ==", + "requires": { + "@types/long": "^3.0.0", + "@types/node": "*" + }, + "dependencies": { + "@types/long": { + "version": "3.0.32", + "resolved": "https://registry.npmjs.org/@types/long/-/long-3.0.32.tgz", + "integrity": "sha512-ZXyOOm83p7X8p3s0IYM3VeueNmHpkk/yMlP8CLeOnEcu6hIwPH7YjZBvhQkR0ZFS2DqZAxKtJ/M5fcuv3OU5BA==" + } + } + }, + "@types/chai": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.5.tgz", + "integrity": "sha512-mEo1sAde+UCE6b2hxn332f1g1E8WfYRu6p5SvTKr2ZKC1f7gFJXk4h5PyGP9Dt6gCaG8y8XhwnXWC6Iy2cmBng==", + "dev": true + }, + "@types/chai-subset": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@types/chai-subset/-/chai-subset-1.3.3.tgz", + "integrity": "sha512-frBecisrNGz+F4T6bcc+NLeolfiojh5FxW2klu669+8BARtyQv2C/GkNW6FUodVe4BroGMP/wER/YDGc7rEllw==", + "dev": true, + "requires": { + "@types/chai": "*" + } + }, + "@types/connect": { + "version": "3.4.35", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", + "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", + "requires": { + "@types/node": "*" + } + }, + "@types/express": { + "version": "4.17.17", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.17.tgz", + "integrity": "sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==", + "requires": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "@types/express-serve-static-core": { + "version": "4.17.35", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.35.tgz", + "integrity": "sha512-wALWQwrgiB2AWTT91CB62b6Yt0sNHpznUXeZEcnPU3DRdlDIz74x8Qg1UUYKSVFi+va5vKOLYRBI1bRKiLLKIg==", + "requires": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "@types/google-protobuf": { + "version": "3.15.6", + "resolved": "https://registry.npmjs.org/@types/google-protobuf/-/google-protobuf-3.15.6.tgz", + "integrity": "sha512-pYVNNJ+winC4aek+lZp93sIKxnXt5qMkuKmaqS3WGuTq0Bw1ZDYNBgzG5kkdtwcv+GmYJGo3yEg6z2cKKAiEdw==", + "dev": true + }, + "@types/http-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-/K3ds8TRAfBvi5vfjuz8y6+GiAYBZ0x4tXv1Av6CWBWn0IlADc+ZX9pMq7oU0fNQPnBwIZl3rmeLp6SBApbxSQ==" + }, + "@types/istanbul-lib-coverage": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", + "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", + "dev": true + }, + "@types/mime": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", + "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==" + }, + "@types/node": { + "version": "18.15.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.9.tgz", + "integrity": "sha512-dUxhiNzBLr6IqlZXz6e/rN2YQXlFgOei/Dxy+e3cyXTJ4txSUbGT2/fmnD6zd/75jDMeW5bDee+YXxlFKHoV0A==" + }, + "@types/qs": { + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==" + }, + "@types/range-parser": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", + "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==" + }, + "@types/send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.1.tgz", + "integrity": "sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q==", + "requires": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "@types/serve-static": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.2.tgz", + "integrity": "sha512-J2LqtvFYCzaj8pVYKw8klQXrLLk7TBZmQ4ShlcdkELFKGwGMfevMLneMMRkMgZxotOD9wg497LpC7O8PcvAmfw==", + "requires": { + "@types/http-errors": "*", + "@types/mime": "*", + "@types/node": "*" + } + }, + "@vitest/coverage-c8": { + "version": "0.33.0", + "resolved": "https://registry.npmjs.org/@vitest/coverage-c8/-/coverage-c8-0.33.0.tgz", + "integrity": "sha512-DaF1zJz4dcOZS4k/neiQJokmOWqsGXwhthfmUdPGorXIQHjdPvV6JQSYhQDI41MyI8c+IieQUdIDs5XAMHtDDw==", + "dev": true, + "requires": { + "@ampproject/remapping": "^2.2.1", + "c8": "^7.14.0", + "magic-string": "^0.30.1", + "picocolors": "^1.0.0", + "std-env": "^3.3.3" + } + }, + "@vitest/expect": { + "version": "0.33.0", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-0.33.0.tgz", + "integrity": "sha512-sVNf+Gla3mhTCxNJx+wJLDPp/WcstOe0Ksqz4Vec51MmgMth/ia0MGFEkIZmVGeTL5HtjYR4Wl/ZxBxBXZJTzQ==", + "dev": true, + "requires": { + "@vitest/spy": "0.33.0", + "@vitest/utils": "0.33.0", + "chai": "^4.3.7" + } + }, + "@vitest/runner": { + "version": "0.33.0", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-0.33.0.tgz", + "integrity": "sha512-UPfACnmCB6HKRHTlcgCoBh6ppl6fDn+J/xR8dTufWiKt/74Y9bHci5CKB8tESSV82zKYtkBJo9whU3mNvfaisg==", + "dev": true, + "requires": { + "@vitest/utils": "0.33.0", + "p-limit": "^4.0.0", + "pathe": "^1.1.1" + }, + "dependencies": { + "p-limit": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", + "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", + "dev": true, + "requires": { + "yocto-queue": "^1.0.0" + } + }, + "yocto-queue": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", + "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", + "dev": true + } + } + }, + "@vitest/snapshot": { + "version": "0.33.0", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-0.33.0.tgz", + "integrity": "sha512-tJjrl//qAHbyHajpFvr8Wsk8DIOODEebTu7pgBrP07iOepR5jYkLFiqLq2Ltxv+r0uptUb4izv1J8XBOwKkVYA==", + "dev": true, + "requires": { + "magic-string": "^0.30.1", + "pathe": "^1.1.1", + "pretty-format": "^29.5.0" + } + }, + "@vitest/spy": { + "version": "0.33.0", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-0.33.0.tgz", + "integrity": "sha512-Kv+yZ4hnH1WdiAkPUQTpRxW8kGtH8VRTnus7ZTGovFYM1ZezJpvGtb9nPIjPnptHbsyIAxYZsEpVPYgtpjGnrg==", + "dev": true, + "requires": { + "tinyspy": "^2.1.1" + } + }, + "@vitest/utils": { + "version": "0.33.0", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-0.33.0.tgz", + "integrity": "sha512-pF1w22ic965sv+EN6uoePkAOTkAPWM03Ri/jXNyMIKBb/XHLDPfhLvf/Fa9g0YECevAIz56oVYXhodLvLQ/awA==", + "dev": true, + "requires": { + "diff-sequences": "^29.4.3", + "loupe": "^2.3.6", + "pretty-format": "^29.5.0" + } + }, + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" + }, + "accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "requires": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + } + }, + "acorn": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", + "dev": true + }, + "acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "dev": true + }, + "agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "requires": { + "debug": "4" + } + }, + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "aproba": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==" + }, + "are-we-there-yet": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", + "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + } + }, + "arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true + }, + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" + }, + "array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true + }, + "ascli": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ascli/-/ascli-1.0.1.tgz", + "integrity": "sha512-JGQaNxpaCJz9Bd1JvVaFIHuWn9S+l3xhN17R0V/vmUDiGE0QngNMXhjlqpwqV+91plWz9Fg+Lt28Lj7p5vjs8A==", + "requires": { + "colour": "~0.7.1", + "optjs": "~3.2.2" + } + }, + "assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", + "dev": true + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "dev": true + }, + "axios": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.4.0.tgz", + "integrity": "sha512-S4XCWMEmzvo64T9GfvQDOXgYRDJ/wsSZc7Jvdgx5u1sd0JwsuPLqb3SYmusag+edF6ziyMensPVqLTSc1PiSEA==", + "requires": { + "follow-redirects": "^1.15.0", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true + }, + "binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true + }, + "bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dev": true, + "requires": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "body-parser": { + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", + "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", + "requires": { + "bytes": "3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + } + } + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "bytebuffer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/bytebuffer/-/bytebuffer-5.0.1.tgz", + "integrity": "sha512-IuzSdmADppkZ6DlpycMkm8l9zeEq16fWtLvunEwFiYciR/BHo4E8/xs5piFquG+Za8OWmMqHF8zuRviz2LHvRQ==", + "requires": { + "long": "~3" + }, + "dependencies": { + "long": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/long/-/long-3.2.0.tgz", + "integrity": "sha512-ZYvPPOMqUwPoDsbJaR10iQJYnMuZhRTvHYl62ErLIEX7RgFlziSBUUvrt3OVfc47QlHHpzPZYP17g3Fv7oeJkg==" + } + } + }, + "bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" + }, + "c8": { + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/c8/-/c8-7.14.0.tgz", + "integrity": "sha512-i04rtkkcNcCf7zsQcSv/T9EbUn4RXQ6mropeMcjFOsQXQ0iGLAr/xT6TImQg4+U9hmNpN9XdvPkjUL1IzbgxJw==", + "dev": true, + "requires": { + "@bcoe/v8-coverage": "^0.2.3", + "@istanbuljs/schema": "^0.1.3", + "find-up": "^5.0.0", + "foreground-child": "^2.0.0", + "istanbul-lib-coverage": "^3.2.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-reports": "^3.1.4", + "rimraf": "^3.0.2", + "test-exclude": "^6.0.0", + "v8-to-istanbul": "^9.0.0", + "yargs": "^16.2.0", + "yargs-parser": "^20.2.9" + } + }, + "cac": { + "version": "6.7.14", + "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", + "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", + "dev": true + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha512-DLIsRzJVBQu72meAKPkWQOLcujdXT32hwdfnkI1frSiSRMK1MofjKHf+MEx0SB6fjEFXL8fBDv1dKymBlOp4Qw==" + }, + "chai": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.7.tgz", + "integrity": "sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==", + "dev": true, + "requires": { + "assertion-error": "^1.1.0", + "check-error": "^1.0.2", + "deep-eql": "^4.1.2", + "get-func-name": "^2.0.0", + "loupe": "^2.3.1", + "pathval": "^1.1.1", + "type-detect": "^4.0.5" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "check-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", + "integrity": "sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==", + "dev": true + }, + "chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "requires": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "fsevents": "~2.3.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + } + }, + "chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==" + }, + "cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==" + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==" + }, + "colour": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/colour/-/colour-0.7.1.tgz", + "integrity": "sha512-Rel466v0EnmKPcsxHo91L4kgPs/6XF7Pu2LJNszq9lXYwi5CFWEeIiRaTX5ym7PPMdj4udDHkLSVC1//JVkZQg==" + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==" + }, + "content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "requires": { + "safe-buffer": "5.2.1" + } + }, + "content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==" + }, + "convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true + }, + "cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==" + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" + }, + "core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "dev": true + }, + "create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "requires": { + "ms": "2.1.2" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==" + }, + "decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "dev": true, + "requires": { + "mimic-response": "^3.1.0" + } + }, + "deep-eql": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz", + "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==", + "dev": true, + "requires": { + "type-detect": "^4.0.0" + } + }, + "deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "dev": true + }, + "deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==" + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" + }, + "delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==" + }, + "depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" + }, + "destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==" + }, + "detect-libc": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz", + "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==" + }, + "diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true + }, + "diff-sequences": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.4.3.tgz", + "integrity": "sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA==", + "dev": true + }, + "dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "requires": { + "path-type": "^4.0.0" + } + }, + "dotenv": { + "version": "16.3.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.3.1.tgz", + "integrity": "sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==" + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==" + }, + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "requires": { + "once": "^1.4.0" + } + }, + "esbuild": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.19.tgz", + "integrity": "sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==", + "dev": true, + "requires": { + "@esbuild/android-arm": "0.17.19", + "@esbuild/android-arm64": "0.17.19", + "@esbuild/android-x64": "0.17.19", + "@esbuild/darwin-arm64": "0.17.19", + "@esbuild/darwin-x64": "0.17.19", + "@esbuild/freebsd-arm64": "0.17.19", + "@esbuild/freebsd-x64": "0.17.19", + "@esbuild/linux-arm": "0.17.19", + "@esbuild/linux-arm64": "0.17.19", + "@esbuild/linux-ia32": "0.17.19", + "@esbuild/linux-loong64": "0.17.19", + "@esbuild/linux-mips64el": "0.17.19", + "@esbuild/linux-ppc64": "0.17.19", + "@esbuild/linux-riscv64": "0.17.19", + "@esbuild/linux-s390x": "0.17.19", + "@esbuild/linux-x64": "0.17.19", + "@esbuild/netbsd-x64": "0.17.19", + "@esbuild/openbsd-x64": "0.17.19", + "@esbuild/sunos-x64": "0.17.19", + "@esbuild/win32-arm64": "0.17.19", + "@esbuild/win32-ia32": "0.17.19", + "@esbuild/win32-x64": "0.17.19" + } + }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==" + }, + "expand-template": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", + "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", + "dev": true + }, + "express": { + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "requires": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.1", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.5.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "dependencies": { + "body-parser": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "requires": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + } + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "raw-body": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "requires": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + } + } + } + }, + "fast-glob": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.0.tgz", + "integrity": "sha512-ChDuvbOypPuNjO8yIDf36x7BlZX1smcUMTTcyoIjycexOxd6DFsKsg21qVBzEmr3G7fUKIRy2/psii+CIUt7FA==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + } + }, + "fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "dev": true, + "requires": { + "reusify": "^1.0.4" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + } + } + }, + "find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "requires": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + } + }, + "follow-redirects": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==" + }, + "foreground-child": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", + "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.0", + "signal-exit": "^3.0.2" + } + }, + "form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + }, + "forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==" + }, + "from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "dev": true + }, + "fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "requires": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "requires": { + "minipass": "^3.0.0" + }, + "dependencies": { + "minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "requires": { + "yallist": "^4.0.0" + } + } + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "gauge": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", + "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", + "requires": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.2", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.1", + "object-assign": "^4.1.1", + "signal-exit": "^3.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.2" + } + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true + }, + "get-func-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", + "integrity": "sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==", + "dev": true + }, + "get-intrinsic": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" + } + }, + "github-from-package": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", + "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==", + "dev": true + }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "requires": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + } + }, + "globrex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz", + "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==", + "dev": true + }, + "google-protobuf": { + "version": "3.21.2", + "resolved": "https://registry.npmjs.org/google-protobuf/-/google-protobuf-3.21.2.tgz", + "integrity": "sha512-3MSOYFO5U9mPGikIYCzK0SaThypfGgS6bHqrUGXG3DPHCrb+txNqeEcns1W0lkGfk0rCyNXm7xB9rMxnCiZOoA==" + }, + "graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true + }, + "grpc": { + "version": "1.24.11", + "resolved": "https://registry.npmjs.org/grpc/-/grpc-1.24.11.tgz", + "integrity": "sha512-8/AQdFCzCeCDWW3SoaMNp6ccbRvTQEH1O1u1uFtt29eWsg5gSZCJ3m6fbkduEIh3smY7WAPP+LgVJ5n3nZRxcA==", + "requires": { + "@mapbox/node-pre-gyp": "^1.0.4", + "@types/bytebuffer": "^5.0.40", + "lodash.camelcase": "^4.3.0", + "lodash.clone": "^4.5.0", + "nan": "^2.13.2", + "protobufjs": "^5.0.3" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==" + }, + "cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha512-0yayqDxWQbqk3ojkYqUKqaAQ6AfNKeKWRNA8kR0WXzAsdHpP4BIaOmMAG87JGuO6qcobyW4GjxHd9PmhEd+T9w==", + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" + } + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==", + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "protobufjs": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-5.0.3.tgz", + "integrity": "sha512-55Kcx1MhPZX0zTbVosMQEO5R6/rikNXd9b6RQK4KSPcrSIIwoXTtebIczUrXlwaSrbz4x8XUVThGPob1n8I4QA==", + "requires": { + "ascli": "~1", + "bytebuffer": "~5", + "glob": "^7.0.5", + "yargs": "^3.10.0" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==", + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha512-vAaEaDM946gbNpH5pLVNR+vX2ht6n0Bt3GXwVB1AuAqZosOvHNF3P7wDnh8KLkSqgUh0uh77le7Owgoz+Z9XBw==", + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + } + }, + "y18n": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.2.tgz", + "integrity": "sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==" + }, + "yargs": { + "version": "3.32.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.32.0.tgz", + "integrity": "sha512-ONJZiimStfZzhKamYvR/xvmgW3uEkAUFSP91y2caTEPhzF6uP2JfPiVZcq66b/YR0C3uitxSV7+T1x8p5bkmMg==", + "requires": { + "camelcase": "^2.0.1", + "cliui": "^3.0.3", + "decamelize": "^1.1.1", + "os-locale": "^1.4.0", + "string-width": "^1.0.1", + "window-size": "^0.1.4", + "y18n": "^3.2.0" + } + } + } + }, + "grpc-tools": { + "version": "1.12.4", + "resolved": "https://registry.npmjs.org/grpc-tools/-/grpc-tools-1.12.4.tgz", + "integrity": "sha512-5+mLAJJma3BjnW/KQp6JBjUMgvu7Mu3dBvBPd1dcbNIb+qiR0817zDpgPjS7gRb+l/8EVNIa3cB02xI9JLToKg==", + "dev": true, + "requires": { + "@mapbox/node-pre-gyp": "^1.0.5" + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==" + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" + }, + "has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==" + }, + "html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, + "http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "requires": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + } + }, + "https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "requires": { + "agent-base": "6", + "debug": "4" + } + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true + }, + "ignore": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "dev": true + }, + "ignore-by-default": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", + "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true + }, + "into-stream": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/into-stream/-/into-stream-6.0.0.tgz", + "integrity": "sha512-XHbaOAvP+uFKUFsOgoNPRjLkwB+I22JFPFe5OjTkQ0nwgj6+pSjb4NmB6VMxaPshLiOf+zcpOCBQuLwC1KHhZA==", + "dev": true, + "requires": { + "from2": "^2.3.0", + "p-is-promise": "^3.0.0" + } + }, + "invert-kv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha512-xgs2NH9AE66ucSq4cNG1nhSFghr5l6tdL15Pk+jl46bmmBapgoaY/AacXyaDznAqmGL99TiLSQgO/XazFSKYeQ==" + }, + "ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-core-module": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz", + "integrity": "sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" + }, + "is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "istanbul-lib-coverage": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", + "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", + "dev": true + }, + "istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "dev": true, + "requires": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" + } + }, + "istanbul-reports": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", + "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", + "dev": true, + "requires": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + } + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true + }, + "json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==" + }, + "jsonc-parser": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", + "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", + "dev": true + }, + "jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" + } + }, + "lcid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha512-YiGkH6EnGrDGqLMITnGjXtGmNtjoXw9SVUzcaos8RBi7Ps0VBylkq+vOcY9QE5poLasPCR849ucFUkl0UzUyOw==", + "requires": { + "invert-kv": "^1.0.0" + } + }, + "local-pkg": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.4.3.tgz", + "integrity": "sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==", + "dev": true + }, + "locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "requires": { + "p-locate": "^5.0.0" + } + }, + "lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==" + }, + "lodash.clone": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clone/-/lodash.clone-4.5.0.tgz", + "integrity": "sha512-GhrVeweiTD6uTmmn5hV/lzgCQhccwReIVRLHp7LT4SopOjqEZ5BbX8b5WWEtAKasjmy8hR7ZPwsYlxRCku5odg==" + }, + "loupe": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.6.tgz", + "integrity": "sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==", + "dev": true, + "requires": { + "get-func-name": "^2.0.0" + } + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "requires": { + "yallist": "^4.0.0" + } + }, + "magic-string": { + "version": "0.30.1", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.1.tgz", + "integrity": "sha512-mbVKXPmS0z0G4XqFDCTllmDQ6coZzn94aMlb0o/A4HEHJCKcanlDZwYJgwnkmgD3jyWhUgj9VsPrfd972yPffA==", + "dev": true, + "requires": { + "@jridgewell/sourcemap-codec": "^1.4.15" + } + }, + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "requires": { + "semver": "^6.0.0" + }, + "dependencies": { + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" + } + } + }, + "make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==" + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" + }, + "merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==" + }, + "micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "requires": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + } + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" + }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "requires": { + "mime-db": "1.52.0" + } + }, + "mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "dev": true + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true + }, + "minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==" + }, + "minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "requires": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "dependencies": { + "minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "requires": { + "yallist": "^4.0.0" + } + } + } + }, + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" + }, + "mkdirp-classic": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", + "dev": true + }, + "mlly": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.4.0.tgz", + "integrity": "sha512-ua8PAThnTwpprIaU47EPeZ/bPUVp2QYBbWMphUQpVdBI3Lgqzm5KZQ45Agm3YJedHXaIHl6pBGabaLSUPPSptg==", + "dev": true, + "requires": { + "acorn": "^8.9.0", + "pathe": "^1.1.1", + "pkg-types": "^1.0.3", + "ufo": "^1.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "multistream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/multistream/-/multistream-4.1.0.tgz", + "integrity": "sha512-J1XDiAmmNpRCBfIWJv+n0ymC4ABcf/Pl+5YvC5B/D2f/2+8PtHvCNxMPKiQcZyi922Hq69J2YOpb1pTywfifyw==", + "dev": true, + "requires": { + "once": "^1.4.0", + "readable-stream": "^3.6.0" + } + }, + "nan": { + "version": "2.17.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.17.0.tgz", + "integrity": "sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ==" + }, + "nanoid": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", + "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "dev": true + }, + "napi-build-utils": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", + "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==", + "dev": true + }, + "negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==" + }, + "node-abi": { + "version": "3.45.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.45.0.tgz", + "integrity": "sha512-iwXuFrMAcFVi/ZoZiqq8BzAdsLw9kxDfTC0HMyjXfSL/6CSDAGD5UmR7azrAgWV1zKYq7dUUMj4owusBWKLsiQ==", + "dev": true, + "requires": { + "semver": "^7.3.5" + } + }, + "node-fetch": { + "version": "2.6.12", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.12.tgz", + "integrity": "sha512-C/fGU2E8ToujUivIO0H+tpQ6HWo4eEmchoPIoXtxCrVghxdKq+QOHqEZW7tuP3KlV3bC8FRMO5nMCC7Zm1VP6g==", + "requires": { + "whatwg-url": "^5.0.0" + } + }, + "nodemon": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.0.1.tgz", + "integrity": "sha512-g9AZ7HmkhQkqXkRc20w+ZfQ73cHLbE8hnPbtaFbFtCumZsjyMhKk9LajQ07U5Ux28lvFjZ5X7HvWR1xzU8jHVw==", + "dev": true, + "requires": { + "chokidar": "^3.5.2", + "debug": "^3.2.7", + "ignore-by-default": "^1.0.1", + "minimatch": "^3.1.2", + "pstree.remy": "^1.1.8", + "semver": "^7.5.3", + "simple-update-notifier": "^2.0.0", + "supports-color": "^5.5.0", + "touch": "^3.1.0", + "undefsafe": "^2.0.5" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "requires": { + "abbrev": "1" + } + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, + "npmlog": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", + "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", + "requires": { + "are-we-there-yet": "^2.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^3.0.0", + "set-blocking": "^2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==" + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==" + }, + "object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==" + }, + "on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "requires": { + "ee-first": "1.1.1" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "requires": { + "wrappy": "1" + } + }, + "optjs": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/optjs/-/optjs-3.2.2.tgz", + "integrity": "sha512-f8lTJm4LKirX+45xsFhuRNjA4f46QVLQKfGoNH7e2AEWS+24eM4XNH4pQ8Tw2LISCIvbST/wNcLdtgvgcqVaxA==" + }, + "os-locale": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "integrity": "sha512-PRT7ZORmwu2MEFt4/fv3Q+mEfN4zetKxufQrkShY2oGvUms9r8otu5HfdyIFHkYXjO7laNsoVGmM2MANfuTA8g==", + "requires": { + "lcid": "^1.0.0" + } + }, + "p-is-promise": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-3.0.0.tgz", + "integrity": "sha512-Wo8VsW4IRQSKVXsJCn7TomUaVtyfjVDn3nUP7kE967BQk0CwFpdbZs0X0uk5sW9mkBa9eNM7hCMaG93WUAwxYQ==", + "dev": true + }, + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "requires": { + "yocto-queue": "^0.1.0" + } + }, + "p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "requires": { + "p-limit": "^3.0.2" + } + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" + }, + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true + }, + "pathe": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.1.tgz", + "integrity": "sha512-d+RQGp0MAYTIaDBIMmOfMwz3E+LOZnxx1HZd5R18mmCZY0QBlK0LDZfPc8FW8Ed2DlvsuE6PRjroDY+wg4+j/Q==", + "dev": true + }, + "pathval": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", + "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", + "dev": true + }, + "picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true + }, + "pkg": { + "version": "5.8.1", + "resolved": "https://registry.npmjs.org/pkg/-/pkg-5.8.1.tgz", + "integrity": "sha512-CjBWtFStCfIiT4Bde9QpJy0KeH19jCfwZRJqHFDFXfhUklCx8JoFmMj3wgnEYIwGmZVNkhsStPHEOnrtrQhEXA==", + "dev": true, + "requires": { + "@babel/generator": "7.18.2", + "@babel/parser": "7.18.4", + "@babel/types": "7.19.0", + "chalk": "^4.1.2", + "fs-extra": "^9.1.0", + "globby": "^11.1.0", + "into-stream": "^6.0.0", + "is-core-module": "2.9.0", + "minimist": "^1.2.6", + "multistream": "^4.1.0", + "pkg-fetch": "3.4.2", + "prebuild-install": "7.1.1", + "resolve": "^1.22.0", + "stream-meter": "^1.0.4" + } + }, + "pkg-fetch": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/pkg-fetch/-/pkg-fetch-3.4.2.tgz", + "integrity": "sha512-0+uijmzYcnhC0hStDjm/cl2VYdrmVVBpe7Q8k9YBojxmR5tG8mvR9/nooQq3QSXiQqORDVOTY3XqMEqJVIzkHA==", + "dev": true, + "requires": { + "chalk": "^4.1.2", + "fs-extra": "^9.1.0", + "https-proxy-agent": "^5.0.0", + "node-fetch": "^2.6.6", + "progress": "^2.0.3", + "semver": "^7.3.5", + "tar-fs": "^2.1.1", + "yargs": "^16.2.0" + } + }, + "pkg-types": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.0.3.tgz", + "integrity": "sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==", + "dev": true, + "requires": { + "jsonc-parser": "^3.2.0", + "mlly": "^1.2.0", + "pathe": "^1.1.0" + } + }, + "postcss": { + "version": "8.4.26", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.26.tgz", + "integrity": "sha512-jrXHFF8iTloAenySjM/ob3gSj7pCu0Ji49hnjqzsgSRa50hkWCKD0HQ+gMNJkW38jBI68MpAAg7ZWwHwX8NMMw==", + "dev": true, + "requires": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + } + }, + "prebuild-install": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.1.tgz", + "integrity": "sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==", + "dev": true, + "requires": { + "detect-libc": "^2.0.0", + "expand-template": "^2.0.3", + "github-from-package": "0.0.0", + "minimist": "^1.2.3", + "mkdirp-classic": "^0.5.3", + "napi-build-utils": "^1.0.1", + "node-abi": "^3.3.0", + "pump": "^3.0.0", + "rc": "^1.2.7", + "simple-get": "^4.0.0", + "tar-fs": "^2.0.0", + "tunnel-agent": "^0.6.0" + } + }, + "pretty-format": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.1.tgz", + "integrity": "sha512-7jRj+yXO0W7e4/tSJKoR7HRIHLPPjtNaUGG2xxKQnGvPNRkgWcQ0AZX6P4KBRJN4FcTBWb3sa7DVUJmocYuoog==", + "dev": true, + "requires": { + "@jest/schemas": "^29.6.0", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true + } + } + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true + }, + "proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "requires": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + } + }, + "proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, + "pstree.remy": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", + "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", + "dev": true + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "requires": { + "side-channel": "^1.0.4" + } + }, + "queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true + }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" + }, + "raw-body": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "requires": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + } + }, + "rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dev": true, + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + } + }, + "react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", + "dev": true + }, + "readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "requires": { + "picomatch": "^2.2.1" + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true + }, + "resolve": { + "version": "1.22.2", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", + "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", + "dev": true, + "requires": { + "is-core-module": "^2.11.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "dependencies": { + "is-core-module": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz", + "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + } + } + }, + "reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "requires": { + "glob": "^7.1.3" + } + }, + "rollup": { + "version": "3.26.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.26.2.tgz", + "integrity": "sha512-6umBIGVz93er97pMgQO08LuH3m6PUb3jlDUUGFsNJB6VgTCUaDFpupf5JfU30529m/UKOgmiX+uY6Sx8cOYpLA==", + "dev": true, + "requires": { + "fsevents": "~2.3.2" + } + }, + "run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "requires": { + "queue-microtask": "^1.2.2" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "requires": { + "lru-cache": "^6.0.0" + } + }, + "send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "requires": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + }, + "dependencies": { + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + } + } + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + } + } + }, + "serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + } + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" + }, + "setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, + "siginfo": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", + "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", + "dev": true + }, + "signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + }, + "simple-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", + "dev": true + }, + "simple-get": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", + "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", + "dev": true, + "requires": { + "decompress-response": "^6.0.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } + }, + "simple-update-notifier": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", + "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==", + "dev": true, + "requires": { + "semver": "^7.5.3" + } + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true + }, + "source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "dev": true + }, + "stackback": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", + "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", + "dev": true + }, + "statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" + }, + "std-env": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.3.3.tgz", + "integrity": "sha512-Rz6yejtVyWnVjC1RFvNmYL10kgjC49EOghxWn0RFqlCHGFpQx+Xe7yW3I4ceK1SGrWIGMjD5Kbue8W/udkbMJg==", + "dev": true + }, + "stream-meter": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/stream-meter/-/stream-meter-1.0.4.tgz", + "integrity": "sha512-4sOEtrbgFotXwnEuzzsQBYEV1elAeFSO8rSGeTwabuX1RRn/kEq9JVH7I0MRBhKVRR0sJkr0M0QCH7yOLf9fhQ==", + "dev": true, + "requires": { + "readable-stream": "^2.1.4" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "requires": { + "safe-buffer": "~5.2.0" + } + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true + }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "dev": true + }, + "strip-literal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-1.0.1.tgz", + "integrity": "sha512-QZTsipNpa2Ppr6v1AmJHESqJ3Uz247MUS0OjrnnZjFAvEoWqxuyFuXn2xLgMtRnijJShAa1HL0gtJyUs7u7n3Q==", + "dev": true, + "requires": { + "acorn": "^8.8.2" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true + }, + "swagger-autogen": { + "version": "2.23.5", + "resolved": "https://registry.npmjs.org/swagger-autogen/-/swagger-autogen-2.23.5.tgz", + "integrity": "sha512-4Tl2+XhZMyHoBYkABnScHtQE0lKPKUD3NBt09mClrI6UKOUYljKlYw1xiFVwsHCTGR2hAXmhT4PpgjruCtt1ZA==", + "requires": { + "acorn": "^7.4.1", + "deepmerge": "^4.2.2", + "glob": "^7.1.7", + "json5": "^2.2.3" + }, + "dependencies": { + "acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==" + } + } + }, + "tar": { + "version": "6.1.15", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.15.tgz", + "integrity": "sha512-/zKt9UyngnxIT/EAGYuxaMYgOIJiP81ab9ZfkILq4oNLPFX50qyYmu7jRj9qeXoxmJHjGlbH0+cm2uy1WCs10A==", + "requires": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + } + }, + "tar-fs": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", + "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", + "dev": true, + "requires": { + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.1.4" + }, + "dependencies": { + "chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "dev": true + } + } + }, + "tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "dev": true, + "requires": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + } + }, + "test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "requires": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + } + }, + "tinybench": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.5.0.tgz", + "integrity": "sha512-kRwSG8Zx4tjF9ZiyH4bhaebu+EDz1BOx9hOigYHlUW4xxI/wKIUQUqo018UlU4ar6ATPBsaMrdbKZ+tmPdohFA==", + "dev": true + }, + "tinypool": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-0.6.0.tgz", + "integrity": "sha512-FdswUUo5SxRizcBc6b1GSuLpLjisa8N8qMyYoP3rl+bym+QauhtJP5bvZY1ytt8krKGmMLYIRl36HBZfeAoqhQ==", + "dev": true + }, + "tinyspy": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-2.1.1.tgz", + "integrity": "sha512-XPJL2uSzcOyBMky6OFrusqWlzfFrXtE0hPuMgW8A2HmaqrPo4ZQHRN/V0QXN3FSjKxpsbRrFc5LI7KOwBsT1/w==", + "dev": true + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "dev": true + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + }, + "toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" + }, + "touch": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", + "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", + "dev": true, + "requires": { + "nopt": "~1.0.10" + }, + "dependencies": { + "nopt": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", + "integrity": "sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==", + "dev": true, + "requires": { + "abbrev": "1" + } + } + } + }, + "tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, + "ts-essentials": { + "version": "9.3.2", + "resolved": "https://registry.npmjs.org/ts-essentials/-/ts-essentials-9.3.2.tgz", + "integrity": "sha512-JxKJzuWqH1MmH4ZFHtJzGEhkfN3QvVR3C3w+4BIoWeoY68UVVoA2Np/Bca9z0IPSErVCWhv439aT0We4Dks8kQ==", + "dev": true, + "requires": {} + }, + "ts-node": { + "version": "10.9.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", + "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", + "dev": true, + "requires": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + } + }, + "tsconfck": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/tsconfck/-/tsconfck-2.1.1.tgz", + "integrity": "sha512-ZPCkJBKASZBmBUNqGHmRhdhM8pJYDdOXp4nRgj/O0JwUwsMq50lCDRQP/M5GBNAA0elPrq4gAeu4dkaVCuKWww==", + "dev": true, + "requires": {} + }, + "tsconfig-paths": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", + "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==", + "dev": true, + "requires": { + "json5": "^2.2.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "dev": true, + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true + }, + "type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } + }, + "typescript": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.2.tgz", + "integrity": "sha512-wVORMBGO/FAs/++blGNeAVdbNKtIh1rbBL2EyQ1+J9lClJ93KiiKe8PmFIVdXhHcyv44SL9oglmfeSsndo0jRw==", + "dev": true + }, + "ufo": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.1.2.tgz", + "integrity": "sha512-TrY6DsjTQQgyS3E3dBaOXf0TpPD8u9FVrVYmKVegJuFw51n/YB9XPt+U6ydzFG5ZIN7+DIjPbNmXoBj9esYhgQ==", + "dev": true + }, + "undefsafe": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", + "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", + "dev": true + }, + "universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==" + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==" + }, + "v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true + }, + "v8-to-istanbul": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.1.0.tgz", + "integrity": "sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA==", + "dev": true, + "requires": { + "@jridgewell/trace-mapping": "^0.3.12", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^1.6.0" + } + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==" + }, + "vite": { + "version": "4.4.4", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.4.4.tgz", + "integrity": "sha512-4mvsTxjkveWrKDJI70QmelfVqTm+ihFAb6+xf4sjEU2TmUCTlVX87tmg/QooPEMQb/lM9qGHT99ebqPziEd3wg==", + "dev": true, + "requires": { + "esbuild": "^0.18.10", + "fsevents": "~2.3.2", + "postcss": "^8.4.25", + "rollup": "^3.25.2" + }, + "dependencies": { + "@esbuild/linux-x64": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.12.tgz", + "integrity": "sha512-OrNJMGQbPaVyHHcDF8ybNSwu7TDOfX8NGpXCbetwOSP6txOJiWlgQnRymfC9ocR1S0Y5PW0Wb1mV6pUddqmvmQ==", + "dev": true, + "optional": true + }, + "esbuild": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.12.tgz", + "integrity": "sha512-XuOVLDdtsDslXStStduT41op21Ytmf4/BDS46aa3xPJ7X5h2eMWBF1oAe3QjUH3bDksocNXgzGUZ7XHIBya6Tg==", + "dev": true, + "requires": { + "@esbuild/android-arm": "0.18.12", + "@esbuild/android-arm64": "0.18.12", + "@esbuild/android-x64": "0.18.12", + "@esbuild/darwin-arm64": "0.18.12", + "@esbuild/darwin-x64": "0.18.12", + "@esbuild/freebsd-arm64": "0.18.12", + "@esbuild/freebsd-x64": "0.18.12", + "@esbuild/linux-arm": "0.18.12", + "@esbuild/linux-arm64": "0.18.12", + "@esbuild/linux-ia32": "0.18.12", + "@esbuild/linux-loong64": "0.18.12", + "@esbuild/linux-mips64el": "0.18.12", + "@esbuild/linux-ppc64": "0.18.12", + "@esbuild/linux-riscv64": "0.18.12", + "@esbuild/linux-s390x": "0.18.12", + "@esbuild/linux-x64": "0.18.12", + "@esbuild/netbsd-x64": "0.18.12", + "@esbuild/openbsd-x64": "0.18.12", + "@esbuild/sunos-x64": "0.18.12", + "@esbuild/win32-arm64": "0.18.12", + "@esbuild/win32-ia32": "0.18.12", + "@esbuild/win32-x64": "0.18.12" + } + } + } + }, + "vite-node": { + "version": "0.33.0", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-0.33.0.tgz", + "integrity": "sha512-19FpHYbwWWxDr73ruNahC+vtEdza52kA90Qb3La98yZ0xULqV8A5JLNPUff0f5zID4984tW7l3DH2przTJUZSw==", + "dev": true, + "requires": { + "cac": "^6.7.14", + "debug": "^4.3.4", + "mlly": "^1.4.0", + "pathe": "^1.1.1", + "picocolors": "^1.0.0", + "vite": "^3.0.0 || ^4.0.0" + } + }, + "vite-tsconfig-paths": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/vite-tsconfig-paths/-/vite-tsconfig-paths-4.2.0.tgz", + "integrity": "sha512-jGpus0eUy5qbbMVGiTxCL1iB9ZGN6Bd37VGLJU39kTDD6ZfULTTb1bcc5IeTWqWJKiWV5YihCaibeASPiGi8kw==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "globrex": "^0.1.2", + "tsconfck": "^2.1.0" + } + }, + "vitest": { + "version": "0.33.0", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-0.33.0.tgz", + "integrity": "sha512-1CxaugJ50xskkQ0e969R/hW47za4YXDUfWJDxip1hwbnhUjYolpfUn2AMOulqG/Dtd9WYAtkHmM/m3yKVrEejQ==", + "dev": true, + "requires": { + "@types/chai": "^4.3.5", + "@types/chai-subset": "^1.3.3", + "@types/node": "*", + "@vitest/expect": "0.33.0", + "@vitest/runner": "0.33.0", + "@vitest/snapshot": "0.33.0", + "@vitest/spy": "0.33.0", + "@vitest/utils": "0.33.0", + "acorn": "^8.9.0", + "acorn-walk": "^8.2.0", + "cac": "^6.7.14", + "chai": "^4.3.7", + "debug": "^4.3.4", + "local-pkg": "^0.4.3", + "magic-string": "^0.30.1", + "pathe": "^1.1.1", + "picocolors": "^1.0.0", + "std-env": "^3.3.3", + "strip-literal": "^1.0.1", + "tinybench": "^2.5.0", + "tinypool": "^0.6.0", + "vite": "^3.0.0 || ^4.0.0", + "vite-node": "0.33.0", + "why-is-node-running": "^2.2.2" + } + }, + "vitest-mock-extended": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/vitest-mock-extended/-/vitest-mock-extended-1.1.4.tgz", + "integrity": "sha512-MKPdepFjk0CE7Ocb5txntHK/sloHO9s0Kk9dr630uL03shRSHMkZtSs5CBPsbJ8K/CvYLv0GHUmMt2zWks2eXg==", + "dev": true, + "requires": { + "ts-essentials": "^9.3.2" + } + }, + "webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, + "whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "requires": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "why-is-node-running": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.2.2.tgz", + "integrity": "sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==", + "dev": true, + "requires": { + "siginfo": "^2.0.0", + "stackback": "0.0.2" + } + }, + "wide-align": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", + "requires": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, + "window-size": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.4.tgz", + "integrity": "sha512-2thx4pB0cV3h+Bw7QmMXcEbdmOzv9t0HFplJH/Lz6yu60hXYy5RT8rUu+wlIreVxWsGN20mo+MHeCSfUpQBwPw==" + }, + "wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "requires": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + } + }, + "yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true + }, + "yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true + }, + "yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true + } + } +} From ecb4159e746f056a6343178c360e1e9430387570 Mon Sep 17 00:00:00 2001 From: anatole Date: Wed, 19 Jul 2023 00:42:48 +0200 Subject: [PATCH 317/883] feat(README): update Getting started --- services/gateway/README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/services/gateway/README.md b/services/gateway/README.md index d39465e4..e8a4dbf7 100644 --- a/services/gateway/README.md +++ b/services/gateway/README.md @@ -36,7 +36,8 @@ You can use the following tools to help you with the setup: 3. Run `npm install` to install the necessary dependencies. 4. Create a `.env` file at the root of the project directory and add the environment variables values ( see `.env.example`). -5. Run `npm run start` to start the microservice. +5. Run `cd proto && sh ./build-protos.sh ./proto/user.proto ./src/proto && cd ..` to generate js file to create the clients. +6. Run `npm run start` to start the microservice. You can now access the microservice at `http://localhost:50000`. From 72ef10d41a2786fdfc59361e1d5440eacaaae2cf Mon Sep 17 00:00:00 2001 From: Pierre Lebigre Date: Thu, 20 Jul 2023 18:32:35 +0200 Subject: [PATCH 318/883] Init promotion --- services/promotions/.gitignore | 3 + services/promotions/README.md | 82 ++ services/promotions/package.json | 28 + services/promotions/pnpm-lock.yaml | 761 ++++++++++++++++++ .../prisma/migrations/0_init/migration.sql | 13 + .../20230719074150_unique_code/migration.sql | 8 + .../20230719074429_rename_table/migration.sql | 21 + .../prisma/migrations/migration_lock.toml | 3 + services/promotions/prisma/schema.prisma | 21 + services/promotions/src/handler/create.ts | 15 + services/promotions/src/handler/delete.ts | 15 + services/promotions/src/handler/get.ts | 15 + services/promotions/src/handler/index.ts | 15 + services/promotions/src/handler/list-all.ts | 15 + .../src/handler/list-by-restaurant.ts | 15 + services/promotions/src/handler/update.ts | 15 + services/promotions/src/lib/amqp.ts | 32 + services/promotions/src/lib/log.ts | 74 ++ services/promotions/src/lib/prisma.ts | 45 ++ services/promotions/src/lib/proxy.ts | 132 +++ services/promotions/src/lib/redis.ts | 7 + services/promotions/src/middleware/log.ts | 42 + .../src/resources/grpc-credentials.ts | 5 + .../src/resources/protoloader-options.ts | 7 + services/promotions/src/server.ts | 39 + services/promotions/src/types/index.d.ts | 3 + services/promotions/src/types/promotion.d.ts | 34 + services/promotions/tsconfig.json | 18 + services/proto/promotions.proto | 53 ++ 29 files changed, 1536 insertions(+) create mode 100644 services/promotions/.gitignore create mode 100644 services/promotions/README.md create mode 100644 services/promotions/package.json create mode 100644 services/promotions/pnpm-lock.yaml create mode 100644 services/promotions/prisma/migrations/0_init/migration.sql create mode 100644 services/promotions/prisma/migrations/20230719074150_unique_code/migration.sql create mode 100644 services/promotions/prisma/migrations/20230719074429_rename_table/migration.sql create mode 100644 services/promotions/prisma/migrations/migration_lock.toml create mode 100644 services/promotions/prisma/schema.prisma create mode 100644 services/promotions/src/handler/create.ts create mode 100644 services/promotions/src/handler/delete.ts create mode 100644 services/promotions/src/handler/get.ts create mode 100644 services/promotions/src/handler/index.ts create mode 100644 services/promotions/src/handler/list-all.ts create mode 100644 services/promotions/src/handler/list-by-restaurant.ts create mode 100644 services/promotions/src/handler/update.ts create mode 100644 services/promotions/src/lib/amqp.ts create mode 100644 services/promotions/src/lib/log.ts create mode 100644 services/promotions/src/lib/prisma.ts create mode 100644 services/promotions/src/lib/proxy.ts create mode 100644 services/promotions/src/lib/redis.ts create mode 100644 services/promotions/src/middleware/log.ts create mode 100644 services/promotions/src/resources/grpc-credentials.ts create mode 100644 services/promotions/src/resources/protoloader-options.ts create mode 100644 services/promotions/src/server.ts create mode 100644 services/promotions/src/types/index.d.ts create mode 100644 services/promotions/src/types/promotion.d.ts create mode 100644 services/promotions/tsconfig.json create mode 100644 services/proto/promotions.proto diff --git a/services/promotions/.gitignore b/services/promotions/.gitignore new file mode 100644 index 00000000..11ddd8db --- /dev/null +++ b/services/promotions/.gitignore @@ -0,0 +1,3 @@ +node_modules +# Keep environment variables out of version control +.env diff --git a/services/promotions/README.md b/services/promotions/README.md new file mode 100644 index 00000000..3496bcf0 --- /dev/null +++ b/services/promotions/README.md @@ -0,0 +1,82 @@ +# Delivery Microservice + +| Informations | +|--------------------------------------------------------------------| +| **Port:** 50006 | +| **Developer:** @PierreLgb | +| **Status:** In progress | +| **Last update:** 2023-07-20 | +| **Language:** NodeJS | +| **Dependencies:** TypeScript, Prisma, gRPC, Postgres | +| **Models:** (see [`prisma/schema.prisma`](./prisma/schema.prisma)) | + +## gRPC Methods + +- Promotions model: + + - `CreatePromotion`: Creates a new promotion in the system. + - `GetPromotion`: Retrieves a promotion by its ID. + - `UpdatePromotion`: Updates an existing promotion. + - `DeletePromotion`: Deletes a promotion by its ID. + - `GetPromotions`: Retrieves all promotions. + - `ListPromotionsByRestaurant`: Retrieves all promotion for a given restaurant. + +## Requirements + +To run this microservice, you will need to have the following installed on your system: + +- NodeJS (v18.12.0 or higher) (dev. with v18.12.0) +- Postgres (v15.2 or higher) (dev. with docker image `postgres:15.2`) + +You can use the following tools to help you with the setup: + +- You can use nvm to set your Node version using: + - `nvm use`. +- You can use docker to run your Postgres database using: + - `docker run --name postgres -p 5432:5432 -e POSTGRES_PASSWORD=password -d postgres` + +## Getting started + +### 1. Clone the repository and install dependencies + +1. Clone the `goodfood` repository to your local machine. +2. Navigate to the service directory (`services/delivery`) in your terminal. +3. Run `npm install` to install the necessary dependencies. +4. Create a `.env` file at the root of the project directory and add the environment variables values ( + see `.env.example`). +5. Run `npm run start` to start the microservice. + +You can now access the microservice at `http://localhost:50006`. + +NB: If you want to run the microservice in development mode, you can run `npm run dev` instead. + +### 2. Create and seed the database + +Run the following command to create your Postgres database structure. This also creates the models tables that are +defined in [`prisma/schema.prisma`](./prisma/schema.prisma): + +``` +npx prisma migrate dev --name init +``` + +When `npx prisma migrate dev` is executed against a newly created database, seeding is also triggered. The seed file +in [`prisma/seed.ts`](./prisma/seed.ts) will be executed and your database will be populated with the sample data. + +## Build and Run with Docker + +### Build + +To build the image you need to be in the **parent folder** of the service you want to build. Then run the following +command: + +``` +docker build -t goodfood-delivery:1.0.0 -f ./delivery/Dockerfile . +``` + +### Run + +Create the .env base on the .env.example. Then run the following command: + +``` +docker run --env-file=.env goodfood-delivery:1.0.0 +``` diff --git a/services/promotions/package.json b/services/promotions/package.json new file mode 100644 index 00000000..a7184064 --- /dev/null +++ b/services/promotions/package.json @@ -0,0 +1,28 @@ +{ + "name": "@goodfood/delivery", + "bin": "dist/index.js", + "scripts": { + "start": "node dist/index.js", + "dev": "nodemon --watch 'src/**/*.ts' --exec 'ts-node' src/server.ts", + "build": "esbuild src/server.ts --bundle --platform=node --target=node18 --outfile=dist/index.js", + "test": "echo 'tests are disabled'", + "prisma:generate": "prisma generate", + "postinstall": "npm run prisma:generate" + }, + "devDependencies": { + "@types/amqplib": "^0.10.1", + "prisma": "^5.0.0", + "typescript": "^5.1.6" + }, + "dependencies": { + "@grpc/grpc-js": "^1.8.18", + "@grpc/proto-loader": "^0.7.8", + "@prisma/client": "5.0.0", + "amqplib": "^0.10.3", + "dotenv": "^16.3.1", + "nodemon": "^3.0.1", + "path": "^0.12.7", + "ts-node": "^10.9.1", + "tsconfig-paths": "^4.2.0" + } +} diff --git a/services/promotions/pnpm-lock.yaml b/services/promotions/pnpm-lock.yaml new file mode 100644 index 00000000..d398f532 --- /dev/null +++ b/services/promotions/pnpm-lock.yaml @@ -0,0 +1,761 @@ +lockfileVersion: '6.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +dependencies: + '@grpc/grpc-js': + specifier: ^1.8.18 + version: 1.8.18 + '@grpc/proto-loader': + specifier: ^0.7.8 + version: 0.7.8 + '@prisma/client': + specifier: 5.0.0 + version: 5.0.0(prisma@5.0.0) + amqplib: + specifier: ^0.10.3 + version: 0.10.3 + dotenv: + specifier: ^16.3.1 + version: 16.3.1 + nodemon: + specifier: ^3.0.1 + version: 3.0.1 + path: + specifier: ^0.12.7 + version: 0.12.7 + ts-node: + specifier: ^10.9.1 + version: 10.9.1(@types/node@20.4.2)(typescript@5.1.6) + tsconfig-paths: + specifier: ^4.2.0 + version: 4.2.0 + +devDependencies: + '@types/amqplib': + specifier: ^0.10.1 + version: 0.10.1 + prisma: + specifier: ^5.0.0 + version: 5.0.0 + typescript: + specifier: ^5.1.6 + version: 5.1.6 + +packages: + + /@acuminous/bitsyntax@0.1.2: + resolution: {integrity: sha512-29lUK80d1muEQqiUsSo+3A0yP6CdspgC95EnKBMi22Xlwt79i/En4Vr67+cXhU+cZjbti3TgGGC5wy1stIywVQ==} + engines: {node: '>=0.8'} + dependencies: + buffer-more-ints: 1.0.0 + debug: 4.3.4 + safe-buffer: 5.1.2 + transitivePeerDependencies: + - supports-color + dev: false + + /@cspotcode/source-map-support@0.8.1: + resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} + engines: {node: '>=12'} + dependencies: + '@jridgewell/trace-mapping': 0.3.9 + dev: false + + /@grpc/grpc-js@1.8.18: + resolution: {integrity: sha512-2uWPtxhsXmVgd8WzDhfamSjHpZDXfMjMDciY6VRTq4Sn7rFzazyf0LLDa0oav+61UHIoEZb4KKaAV6S7NuJFbQ==} + engines: {node: ^8.13.0 || >=10.10.0} + dependencies: + '@grpc/proto-loader': 0.7.8 + '@types/node': 20.4.2 + dev: false + + /@grpc/proto-loader@0.7.8: + resolution: {integrity: sha512-GU12e2c8dmdXb7XUlOgYWZ2o2i+z9/VeACkxTA/zzAe2IjclC5PnVL0lpgjhrqfpDYHzM8B1TF6pqWegMYAzlA==} + engines: {node: '>=6'} + hasBin: true + dependencies: + '@types/long': 4.0.2 + lodash.camelcase: 4.3.0 + long: 4.0.0 + protobufjs: 7.2.4 + yargs: 17.7.2 + dev: false + + /@jridgewell/resolve-uri@3.1.1: + resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} + engines: {node: '>=6.0.0'} + dev: false + + /@jridgewell/sourcemap-codec@1.4.15: + resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + dev: false + + /@jridgewell/trace-mapping@0.3.9: + resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} + dependencies: + '@jridgewell/resolve-uri': 3.1.1 + '@jridgewell/sourcemap-codec': 1.4.15 + dev: false + + /@prisma/client@5.0.0(prisma@5.0.0): + resolution: {integrity: sha512-XlO5ELNAQ7rV4cXIDJUNBEgdLwX3pjtt9Q/RHqDpGf43szpNJx2hJnggfFs7TKNx0cOFsl6KJCSfqr5duEU/bQ==} + engines: {node: '>=16.13'} + requiresBuild: true + peerDependencies: + prisma: '*' + peerDependenciesMeta: + prisma: + optional: true + dependencies: + '@prisma/engines-version': 4.17.0-26.6b0aef69b7cdfc787f822ecd7cdc76d5f1991584 + prisma: 5.0.0 + dev: false + + /@prisma/engines-version@4.17.0-26.6b0aef69b7cdfc787f822ecd7cdc76d5f1991584: + resolution: {integrity: sha512-HHiUF6NixsldsP3JROq07TYBLEjXFKr6PdH8H4gK/XAoTmIplOJBCgrIUMrsRAnEuGyRoRLXKXWUb943+PFoKQ==} + dev: false + + /@prisma/engines@5.0.0: + resolution: {integrity: sha512-kyT/8fd0OpWmhAU5YnY7eP31brW1q1YrTGoblWrhQJDiN/1K+Z8S1kylcmtjqx5wsUGcP1HBWutayA/jtyt+sg==} + requiresBuild: true + + /@protobufjs/aspromise@1.1.2: + resolution: {integrity: sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==} + dev: false + + /@protobufjs/base64@1.1.2: + resolution: {integrity: sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==} + dev: false + + /@protobufjs/codegen@2.0.4: + resolution: {integrity: sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==} + dev: false + + /@protobufjs/eventemitter@1.1.0: + resolution: {integrity: sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==} + dev: false + + /@protobufjs/fetch@1.1.0: + resolution: {integrity: sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==} + dependencies: + '@protobufjs/aspromise': 1.1.2 + '@protobufjs/inquire': 1.1.0 + dev: false + + /@protobufjs/float@1.0.2: + resolution: {integrity: sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==} + dev: false + + /@protobufjs/inquire@1.1.0: + resolution: {integrity: sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==} + dev: false + + /@protobufjs/path@1.1.2: + resolution: {integrity: sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==} + dev: false + + /@protobufjs/pool@1.1.0: + resolution: {integrity: sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==} + dev: false + + /@protobufjs/utf8@1.1.0: + resolution: {integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==} + dev: false + + /@tsconfig/node10@1.0.9: + resolution: {integrity: sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==} + dev: false + + /@tsconfig/node12@1.0.11: + resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} + dev: false + + /@tsconfig/node14@1.0.3: + resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} + dev: false + + /@tsconfig/node16@1.0.4: + resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} + dev: false + + /@types/amqplib@0.10.1: + resolution: {integrity: sha512-j6ANKT79ncUDnAs/+9r9eDujxbeJoTjoVu33gHHcaPfmLQaMhvfbH2GqSe8KUM444epAp1Vl3peVOQfZk3UIqA==} + dependencies: + '@types/node': 20.4.2 + dev: true + + /@types/long@4.0.2: + resolution: {integrity: sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==} + dev: false + + /@types/node@20.4.2: + resolution: {integrity: sha512-Dd0BYtWgnWJKwO1jkmTrzofjK2QXXcai0dmtzvIBhcA+RsG5h8R3xlyta0kGOZRNfL9GuRtb1knmPEhQrePCEw==} + + /abbrev@1.1.1: + resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} + dev: false + + /acorn-walk@8.2.0: + resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} + engines: {node: '>=0.4.0'} + dev: false + + /acorn@8.10.0: + resolution: {integrity: sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==} + engines: {node: '>=0.4.0'} + hasBin: true + dev: false + + /amqplib@0.10.3: + resolution: {integrity: sha512-UHmuSa7n8vVW/a5HGh2nFPqAEr8+cD4dEZ6u9GjP91nHfr1a54RyAKyra7Sb5NH7NBKOUlyQSMXIp0qAixKexw==} + engines: {node: '>=10'} + dependencies: + '@acuminous/bitsyntax': 0.1.2 + buffer-more-ints: 1.0.0 + readable-stream: 1.1.14 + url-parse: 1.5.10 + transitivePeerDependencies: + - supports-color + dev: false + + /ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + dev: false + + /ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + dependencies: + color-convert: 2.0.1 + dev: false + + /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: false + + /arg@4.1.3: + resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} + dev: false + + /balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + dev: false + + /binary-extensions@2.2.0: + resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} + engines: {node: '>=8'} + 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 + + /buffer-more-ints@1.0.0: + resolution: {integrity: sha512-EMetuGFz5SLsT0QTnXzINh4Ksr+oo4i+UGTXEshiGCQWnsgSs7ZhJ8fzlwQ+OzEMs0MpDAMr1hxnblp5a4vcHg==} + dev: false + + /chokidar@3.5.3: + resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} + engines: {node: '>= 8.10.0'} + dependencies: + anymatch: 3.1.3 + braces: 3.0.2 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.2 + 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 + 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 + + /core-util-is@1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + dev: false + + /create-require@1.1.1: + resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} + dev: false + + /debug@3.2.7(supports-color@5.5.0): + resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.3 + supports-color: 5.5.0 + 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 + dev: false + + /diff@4.0.2: + resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} + engines: {node: '>=0.3.1'} + dev: false + + /dotenv@16.3.1: + resolution: {integrity: sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==} + engines: {node: '>=12'} + dev: false + + /emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + dev: false + + /escalade@3.1.1: + resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} + engines: {node: '>=6'} + 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 + + /fsevents@2.3.2: + resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + dev: false + + /glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + dependencies: + is-glob: 4.0.3 + dev: false + + /has-flag@3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + dev: false + + /ignore-by-default@1.0.1: + resolution: {integrity: sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==} + dev: false + + /inherits@2.0.3: + resolution: {integrity: sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==} + dev: false + + /is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + dependencies: + binary-extensions: 2.2.0 + dev: false + + /is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + dev: false + + /is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + 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-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + dev: false + + /isarray@0.0.1: + resolution: {integrity: sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==} + dev: false + + /json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + dev: false + + /lodash.camelcase@4.3.0: + resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} + dev: false + + /long@4.0.0: + resolution: {integrity: sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==} + dev: false + + /long@5.2.3: + resolution: {integrity: sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==} + dev: false + + /lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + dependencies: + yallist: 4.0.0 + dev: false + + /make-error@1.3.6: + resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + dev: false + + /minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + dependencies: + brace-expansion: 1.1.11 + dev: false + + /minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + dev: false + + /ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + dev: false + + /ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + dev: false + + /nodemon@3.0.1: + resolution: {integrity: sha512-g9AZ7HmkhQkqXkRc20w+ZfQ73cHLbE8hnPbtaFbFtCumZsjyMhKk9LajQ07U5Ux28lvFjZ5X7HvWR1xzU8jHVw==} + engines: {node: '>=10'} + hasBin: true + dependencies: + chokidar: 3.5.3 + debug: 3.2.7(supports-color@5.5.0) + ignore-by-default: 1.0.1 + minimatch: 3.1.2 + pstree.remy: 1.1.8 + semver: 7.5.4 + simple-update-notifier: 2.0.0 + supports-color: 5.5.0 + touch: 3.1.0 + undefsafe: 2.0.5 + dev: false + + /nopt@1.0.10: + resolution: {integrity: sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==} + hasBin: true + dependencies: + abbrev: 1.1.1 + dev: false + + /normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + dev: false + + /path@0.12.7: + resolution: {integrity: sha512-aXXC6s+1w7otVF9UletFkFcDsJeO7lSZBPUQhtb5O0xJe8LtYhj/GxldoL09bBj9+ZmE2hNoHqQSFMN5fikh4Q==} + dependencies: + process: 0.11.10 + util: 0.10.4 + dev: false + + /picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + dev: false + + /prisma@5.0.0: + resolution: {integrity: sha512-KYWk83Fhi1FH59jSpavAYTt2eoMVW9YKgu8ci0kuUnt6Dup5Qy47pcB4/TLmiPAbhGrxxSz7gsSnJcCmkyPANA==} + engines: {node: '>=16.13'} + hasBin: true + requiresBuild: true + dependencies: + '@prisma/engines': 5.0.0 + + /process@0.11.10: + resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} + engines: {node: '>= 0.6.0'} + dev: false + + /protobufjs@7.2.4: + resolution: {integrity: sha512-AT+RJgD2sH8phPmCf7OUZR8xGdcJRga4+1cOaXJ64hvcSkVhNcRHOwIxUatPH15+nj59WAGTDv3LSGZPEQbJaQ==} + engines: {node: '>=12.0.0'} + requiresBuild: true + dependencies: + '@protobufjs/aspromise': 1.1.2 + '@protobufjs/base64': 1.1.2 + '@protobufjs/codegen': 2.0.4 + '@protobufjs/eventemitter': 1.1.0 + '@protobufjs/fetch': 1.1.0 + '@protobufjs/float': 1.0.2 + '@protobufjs/inquire': 1.1.0 + '@protobufjs/path': 1.1.2 + '@protobufjs/pool': 1.1.0 + '@protobufjs/utf8': 1.1.0 + '@types/node': 20.4.2 + long: 5.2.3 + dev: false + + /pstree.remy@1.1.8: + resolution: {integrity: sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==} + dev: false + + /querystringify@2.2.0: + resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} + dev: false + + /readable-stream@1.1.14: + resolution: {integrity: sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==} + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.3 + isarray: 0.0.1 + string_decoder: 0.10.31 + dev: false + + /readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + dependencies: + picomatch: 2.3.1 + dev: false + + /require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + dev: false + + /requires-port@1.0.0: + resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} + dev: false + + /safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + dev: false + + /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 + dev: false + + /simple-update-notifier@2.0.0: + resolution: {integrity: sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==} + engines: {node: '>=10'} + dependencies: + semver: 7.5.4 + dev: false + + /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 + dev: false + + /string_decoder@0.10.31: + resolution: {integrity: sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==} + dev: false + + /strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + dependencies: + ansi-regex: 5.0.1 + dev: false + + /strip-bom@3.0.0: + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} + dev: false + + /supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + dependencies: + has-flag: 3.0.0 + 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 + + /touch@3.1.0: + resolution: {integrity: sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==} + hasBin: true + dependencies: + nopt: 1.0.10 + dev: false + + /ts-node@10.9.1(@types/node@20.4.2)(typescript@5.1.6): + 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': 20.4.2 + 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.1.6 + v8-compile-cache-lib: 3.0.1 + yn: 3.1.1 + dev: false + + /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: false + + /typescript@5.1.6: + resolution: {integrity: sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==} + engines: {node: '>=14.17'} + hasBin: true + + /undefsafe@2.0.5: + resolution: {integrity: sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==} + dev: false + + /url-parse@1.5.10: + resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} + dependencies: + querystringify: 2.2.0 + requires-port: 1.0.0 + dev: false + + /util@0.10.4: + resolution: {integrity: sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==} + dependencies: + inherits: 2.0.3 + dev: false + + /v8-compile-cache-lib@3.0.1: + resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} + dev: false + + /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 + dev: false + + /y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + dev: false + + /yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + dev: false + + /yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + 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 + dev: false + + /yn@3.1.1: + resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} + engines: {node: '>=6'} + dev: false diff --git a/services/promotions/prisma/migrations/0_init/migration.sql b/services/promotions/prisma/migrations/0_init/migration.sql new file mode 100644 index 00000000..8816c8d9 --- /dev/null +++ b/services/promotions/prisma/migrations/0_init/migration.sql @@ -0,0 +1,13 @@ +-- CreateEnum +CREATE TYPE "Method" AS ENUM ('PERCENT', 'VALUE'); + +-- CreateTable +CREATE TABLE "Promotions" ( + "id" TEXT NOT NULL, + "code" TEXT NOT NULL, + "reduction" TEXT NOT NULL, + "method" "Method" NOT NULL, + + CONSTRAINT "Promotions_pkey" PRIMARY KEY ("id") +); + diff --git a/services/promotions/prisma/migrations/20230719074150_unique_code/migration.sql b/services/promotions/prisma/migrations/20230719074150_unique_code/migration.sql new file mode 100644 index 00000000..d7807ca3 --- /dev/null +++ b/services/promotions/prisma/migrations/20230719074150_unique_code/migration.sql @@ -0,0 +1,8 @@ +/* + Warnings: + + - A unique constraint covering the columns `[code]` on the table `Promotions` will be added. If there are existing duplicate values, this will fail. + +*/ +-- CreateIndex +CREATE UNIQUE INDEX "Promotions_code_key" ON "Promotions"("code"); diff --git a/services/promotions/prisma/migrations/20230719074429_rename_table/migration.sql b/services/promotions/prisma/migrations/20230719074429_rename_table/migration.sql new file mode 100644 index 00000000..26553d76 --- /dev/null +++ b/services/promotions/prisma/migrations/20230719074429_rename_table/migration.sql @@ -0,0 +1,21 @@ +/* + Warnings: + + - You are about to drop the `Promotions` table. If the table is not empty, all the data it contains will be lost. + +*/ +-- DropTable +DROP TABLE "Promotions"; + +-- CreateTable +CREATE TABLE "Promotion" ( + "id" TEXT NOT NULL, + "code" TEXT NOT NULL, + "reduction" TEXT NOT NULL, + "method" "Method" NOT NULL, + + CONSTRAINT "Promotion_pkey" PRIMARY KEY ("id") +); + +-- CreateIndex +CREATE UNIQUE INDEX "Promotion_code_key" ON "Promotion"("code"); diff --git a/services/promotions/prisma/migrations/migration_lock.toml b/services/promotions/prisma/migrations/migration_lock.toml new file mode 100644 index 00000000..fbffa92c --- /dev/null +++ b/services/promotions/prisma/migrations/migration_lock.toml @@ -0,0 +1,3 @@ +# Please do not edit this file manually +# It should be added in your version-control system (i.e. Git) +provider = "postgresql" \ No newline at end of file diff --git a/services/promotions/prisma/schema.prisma b/services/promotions/prisma/schema.prisma new file mode 100644 index 00000000..5b4e9914 --- /dev/null +++ b/services/promotions/prisma/schema.prisma @@ -0,0 +1,21 @@ +generator client { + provider = "prisma-client-js" +} + +datasource db { + provider = "postgresql" + url = env("DATABASE_URL") +} + +enum Method { + PERCENT + VALUE +} + +model Promotion{ + id String @id @default(cuid()) + + code String @unique + reduction String + method Method +} \ No newline at end of file diff --git a/services/promotions/src/handler/create.ts b/services/promotions/src/handler/create.ts new file mode 100644 index 00000000..0fe90f9c --- /dev/null +++ b/services/promotions/src/handler/create.ts @@ -0,0 +1,15 @@ +import { PromotionCreateInput } from "@promotions/types/promotion"; +import { log } from "@promotions/lib/log"; +import { Data } from "@promotions/types"; + +export const CreatePromotion = async ( + { request }: Data, + callback: (err: any, response: any) => void + ) => { + try { + callback(null, null); + } catch (error) { + log.error(error); + callback(error, null); + } +}; \ No newline at end of file diff --git a/services/promotions/src/handler/delete.ts b/services/promotions/src/handler/delete.ts new file mode 100644 index 00000000..fa3214b8 --- /dev/null +++ b/services/promotions/src/handler/delete.ts @@ -0,0 +1,15 @@ +import { PromotionId } from "@promotions/types/promotion"; +import { log } from "@promotions/lib/log"; +import { Data } from "@promotions/types"; + +export const DeletePromotion = async ( + { request }: Data, + callback: (err: any, response: null) => void + ) => { + try { + callback(null, null); + } catch (error) { + log.error(error); + callback(error, null); + } +}; \ No newline at end of file diff --git a/services/promotions/src/handler/get.ts b/services/promotions/src/handler/get.ts new file mode 100644 index 00000000..9e784007 --- /dev/null +++ b/services/promotions/src/handler/get.ts @@ -0,0 +1,15 @@ +import { PromotionCode } from "@promotions/types/promotion"; +import { log } from "@promotions/lib/log"; +import { Data } from "@promotions/types"; + +export const GetPromotion = async ( + { request }: Data, + callback: (err: any, response: any) => void + ) => { + try { + callback(null, null); + } catch (error) { + log.error(error); + callback(error, null); + } +}; \ No newline at end of file diff --git a/services/promotions/src/handler/index.ts b/services/promotions/src/handler/index.ts new file mode 100644 index 00000000..57c52450 --- /dev/null +++ b/services/promotions/src/handler/index.ts @@ -0,0 +1,15 @@ +import { CreatePromotion } from "@promotions/handler/create"; +import { GetPromotion } from "@promotions/handler/get"; +import { UpdatePromotion } from "@promotions/handler/update"; +import { DeletePromotion } from "@promotions/handler/delete"; +import { GetPromotions } from "@promotions/handler/list-all"; +import { GetPromotionsByRestaurant } from "@promotions/handler/list-by-restaurant"; + +export default { + CreatePromotion, + GetPromotion, + UpdatePromotion, + DeletePromotion, + GetPromotions, + GetPromotionsByRestaurant, +}; diff --git a/services/promotions/src/handler/list-all.ts b/services/promotions/src/handler/list-all.ts new file mode 100644 index 00000000..529a4ec6 --- /dev/null +++ b/services/promotions/src/handler/list-all.ts @@ -0,0 +1,15 @@ +import { PromotionId, PromotionList } from "@promotions/types/promotion"; +import { log } from "@promotions/lib/log"; +import { Data } from "@promotions/types"; + +export const GetPromotions = async ( + { request }: Data, + callback: (err: any, response: PromotionList | null) => void + ) => { + try { + callback(null, null); + } catch (error) { + log.error(error); + callback(error, null); + } +}; \ No newline at end of file diff --git a/services/promotions/src/handler/list-by-restaurant.ts b/services/promotions/src/handler/list-by-restaurant.ts new file mode 100644 index 00000000..02107914 --- /dev/null +++ b/services/promotions/src/handler/list-by-restaurant.ts @@ -0,0 +1,15 @@ +import { RestaurantId, PromotionList } from "@promotions/types/promotion"; +import { log } from "@promotions/lib/log"; +import { Data } from "@promotions/types"; + +export const GetPromotionsByRestaurant = async ( + { request }: Data, + callback: (err: any, response: PromotionList | null) => void + ) => { + try { + callback(null, null); + } catch (error) { + log.error(error); + callback(error, null); + } +}; \ No newline at end of file diff --git a/services/promotions/src/handler/update.ts b/services/promotions/src/handler/update.ts new file mode 100644 index 00000000..41ab985e --- /dev/null +++ b/services/promotions/src/handler/update.ts @@ -0,0 +1,15 @@ +import { Promotion } from "@promotions/types/promotion"; +import { log } from "@promotions/lib/log"; +import { Data } from "@promotions/types"; + +export const UpdatePromotion = async ( + { request }: Data, + callback: (err: any, response: Promotion | null) => void + ) => { + try { + callback(null, null); + } catch (error) { + log.error(error); + callback(error, null); + } +}; \ No newline at end of file diff --git a/services/promotions/src/lib/amqp.ts b/services/promotions/src/lib/amqp.ts new file mode 100644 index 00000000..0f2edcde --- /dev/null +++ b/services/promotions/src/lib/amqp.ts @@ -0,0 +1,32 @@ +import amqp from "amqplib"; +import { msg } from "@promotions/middleware/log"; +import { log } from "@promotions/lib/log"; + +const DEFAULT_QUEUE = "log"; + +async function connectQueue(queue = DEFAULT_QUEUE) { + try { + const connection = await amqp.connect(process.env.AMQP_URL || ""); + const channel = await connection.createChannel(); + await channel.assertExchange(queue, "fanout", { durable: true }); + return channel; + } catch (error) { + return error as Error; + } +} + +const toLog = (message: any) => { + const { request, path } = message; + return { event_message: path, metadata: { request } }; +}; + +export const publish = async (message: any, queue = DEFAULT_QUEUE) => { + const channel = await connectQueue(queue); + if (channel instanceof Error) + return console.log("Error to connect to queue: ", channel); + channel.sendToQueue(queue, Buffer.from(JSON.stringify(toLog(message)))); + log.debug( + msg("AMQP", `${queue} (queue)`, new Date(), new Date()), + JSON.stringify(message) + ); +}; diff --git a/services/promotions/src/lib/log.ts b/services/promotions/src/lib/log.ts new file mode 100644 index 00000000..2404af54 --- /dev/null +++ b/services/promotions/src/lib/log.ts @@ -0,0 +1,74 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ +/* eslint-disable no-console */ + +function getStackTrace() { + let stack; + + try { + throw new Error(""); + } catch (error) { + stack = (error as Error).stack || ""; + } + + stack = stack.split("\n").map((line) => line.trim()); + return stack.splice(stack[0] === "Error" ? 2 : 1); +} + +const getInitiator = () => { + // _getInitiatorLine, _ObjectInfoLine, caller + const [, , caller] = getStackTrace(); + const file = caller.split("/").at(-1) || ""; + return file.replace(")", ""); +}; + +const warn = (...args: any[]) => { + console.group( + `\x1b[33m${new Date().toISOString()} - WARN - ${getInitiator()}\x1b[0m` + ); + console.warn(...args); + console.groupEnd(); +}; +const error = (...args: any[]) => { + console.group( + `\x1b[31m${new Date().toISOString()} - ERROR - ${getInitiator()}\x1b[0m` + ); + console.error(...args); + console.groupEnd(); +}; +const info = (...args: any[]) => { + console.group( + `\x1b[34m${new Date().toISOString()} - INFO - ${getInitiator()}\x1b[0m` + ); + console.log(...args); + console.groupEnd(); +}; +const debug = (...args: any[]) => { + console.log(...args); +}; + +/** + * @description a simple interface logger for logging to the console and into a log drain in the future + * @example + * log.warn('this is a warning'); + * log.error('this is an error'); + * log.info('this is an info'); + * @exports log + */ +export const log = { + warn, + error, + info, + debug, +}; + +export const utils = { + bold: (text: string) => `\x1b[1m${text}\x1b[0m`, + red: (text: string) => `\x1b[31m${text}\x1b[0m`, + green: (text: string) => `\x1b[32m${text}\x1b[0m`, + yellow: (text: string) => `\x1b[33m${text}\x1b[0m`, + blue: (text: string) => `\x1b[34m${text}\x1b[0m`, + magenta: (text: string) => `\x1b[35m${text}\x1b[0m`, + cyan: (text: string) => `\x1b[36m${text}\x1b[0m`, + white: (text: string) => `\x1b[37m${text}\x1b[0m`, + gray: (text: string) => `\x1b[90m${text}\x1b[0m`, +}; diff --git a/services/promotions/src/lib/prisma.ts b/services/promotions/src/lib/prisma.ts new file mode 100644 index 00000000..ff8519b4 --- /dev/null +++ b/services/promotions/src/lib/prisma.ts @@ -0,0 +1,45 @@ +import { Prisma, PrismaClient } from "@prisma/client"; +import { createPrismaRedisCache } from "prisma-redis-middleware"; +import { redis } from "@delivery/lib/redis"; + +let prisma: PrismaClient; +type GlobalWithPrisma = typeof globalThis & { + prisma: PrismaClient; +}; + +const OPTIONS: Prisma.PrismaClientOptions = { + log: + process.env.NEXT_PUBLIC_APP_ENV !== "production" + ? ["info", "warn"] + : undefined, +}; + +if (process.env.NODE_ENV === "production") { + prisma = new PrismaClient(OPTIONS); +} else { + // Ensure the prisma instance is re-used during hot-reloading + // Otherwise, a new client will be created on every reload + if (!("prisma" in global)) { + (global as GlobalWithPrisma).prisma = new PrismaClient(OPTIONS); + } + + prisma = (global as GlobalWithPrisma).prisma; +} + +const cacheMiddleware: Prisma.Middleware = createPrismaRedisCache({ + models: [ + { model: "DeliveryPerson", cacheTime: 300, cacheKey: "delivery_person" }, + ], + storage: { + type: "redis", + options: { client: redis, invalidation: { referencesTTL: 300 } }, + }, + cacheTime: 300, +}); + +//todo: change to $extends when it's available for prisma-redis-middleware +prisma.$use(cacheMiddleware); + +export default prisma; + +export { prisma }; diff --git a/services/promotions/src/lib/proxy.ts b/services/promotions/src/lib/proxy.ts new file mode 100644 index 00000000..b05d24a6 --- /dev/null +++ b/services/promotions/src/lib/proxy.ts @@ -0,0 +1,132 @@ +import { Server, status } from "@grpc/grpc-js"; + +const getType = (method: { + requestStream: boolean; + responseStream: boolean; +}) => { + if (method.requestStream === false && method.responseStream === false) { + return "unary"; + } + return "unknown"; +}; + + +const lookupServiceMetadata = (service: { [x: string]: any }) => { + const serviceKeys = Object.keys(service); + const intersectingMethods = serviceKeys.reduce((acc, k) => { + const method = service[k]; + if (!method) { + throw new Error(`cannot find method ${k} on service`); + } + const components = method.path.split("/"); + acc[k] = { + name: components[1], + method: components[2], + type: getType(method), + path: method.path, + responseType: method.responseType, + requestType: method.requestType, + }; + return acc; + }, {} as any); + + return (key: string) => intersectingMethods[key]; +}; + +export const handler = { + get( + target: { + [x: string]: any; + intercept: () => any; + addService: (arg0: any, arg1: {}) => any; + }, + propKey: string + ) { + if (propKey !== "addService") { + return target[propKey]; + } + return (service: any, implementation: { [x: string]: any }) => { + const newImplementation = {} as any; + const lookup = lookupServiceMetadata(service); + for (const k in implementation) { + const name = k; + const fn = implementation[k]; + newImplementation[name] = (call: any, callback: any) => { + const ctx = { + call, + name, + service: lookup(name), + status: { + code: status.UNKNOWN, + details: "", + }, + }; + const newCallback = (callback: (arg0: any) => void) => { + return (...args: any[]) => { + ctx.status = { + code: status.OK, + details: "", + }; + const err = args[0]; + if (err) { + ctx.status = { + code: status.UNKNOWN, + details: err, + }; + } + // @ts-ignore + callback(...args); + }; + }; + + const interceptors = target.intercept(); + const first = interceptors.next(); + if (!first.value) { + // if we don't have any interceptors + return new Promise((resolve) => { + return resolve(fn(call, newCallback(callback))); + }); + } + first.value(ctx, function next() { + return new Promise((resolve) => { + const i = interceptors.next(); + if (i.done) { + return resolve(fn(call, newCallback(callback))); + } + return resolve(i.value(ctx, next)); + }); + }); + }; + } + return target.addService(service, newImplementation); + }; + }, +}; + +export const createServerProxy = ( + server: Server +): Server & { + intercept: Generator; + interceptors: any[]; + use: (fn: any) => void; +} => { + // @ts-ignore + server.interceptors = []; + // @ts-ignore + server.use = (fn: any) => { + // @ts-ignore + server.interceptors.push(fn); + }; + // @ts-ignore + server.intercept = function* intercept() { + let i = 0; + // @ts-ignore + while (i < server.interceptors.length) { + // @ts-ignore + yield server.interceptors[i]; + i++; + } + }; + // @ts-ignore + return new Proxy(server, handler); +}; \ No newline at end of file diff --git a/services/promotions/src/lib/redis.ts b/services/promotions/src/lib/redis.ts new file mode 100644 index 00000000..0eb33bb2 --- /dev/null +++ b/services/promotions/src/lib/redis.ts @@ -0,0 +1,7 @@ +import { Redis } from "ioredis" + +export const redis = new Redis({ + host: process.env.REDIS_HOST || "localhost", + username: process.env.REDIS_USERNAME || undefined, + password: process.env.REDIS_PASSWORD || undefined, +}) \ No newline at end of file diff --git a/services/promotions/src/middleware/log.ts b/services/promotions/src/middleware/log.ts new file mode 100644 index 00000000..093a4a4c --- /dev/null +++ b/services/promotions/src/middleware/log.ts @@ -0,0 +1,42 @@ +import { publish } from "@promotions/lib/amqp"; +import { utils } from "@promotions/lib/log"; +import { log } from "@promotions/lib/log"; + +type Context = { + call: { + request: Map; + }; + service: { + path: string; + }; +}; + +const parseContext = (ctx: Context) => { + const { + call: { request }, + service: { path }, + } = ctx; + return { request, path }; +}; + +export const msg = ( + type: "GRPC" | "AMQP", + path: string | undefined, + requestAt: Date, + responseAt: Date +) => + `${utils.magenta(requestAt.toISOString())} | ${utils[ + type === "GRPC" ? "cyan" : "red" + ](type)}${path ? ` | ${utils.yellow(path)}` : ""} | ${utils.green( + responseAt.getTime() - requestAt.getTime() + "ms" + )} |`; + +export const logGRPC = async (ctx: Context, next: () => Promise) => { + const requestAt = new Date(); + await next(); + const responseAt = new Date(); + let { request, path } = parseContext(ctx); + path = path?.split(".").at(-1) || ""; + publish({ request, path }, "log"); + log.debug(msg("GRPC", path, requestAt, responseAt), JSON.stringify(request)); +}; diff --git a/services/promotions/src/resources/grpc-credentials.ts b/services/promotions/src/resources/grpc-credentials.ts new file mode 100644 index 00000000..75a2b5d5 --- /dev/null +++ b/services/promotions/src/resources/grpc-credentials.ts @@ -0,0 +1,5 @@ +import { credentials, ServerCredentials } from "@grpc/grpc-js"; + +export const insecure = credentials.createInsecure(); + +export const serverInsecure = ServerCredentials.createInsecure(); diff --git a/services/promotions/src/resources/protoloader-options.ts b/services/promotions/src/resources/protoloader-options.ts new file mode 100644 index 00000000..5022d96d --- /dev/null +++ b/services/promotions/src/resources/protoloader-options.ts @@ -0,0 +1,7 @@ +export const options = { + keepCase: true, + longs: String, + enums: String, + defaults: true, + oneofs: true, +}; diff --git a/services/promotions/src/server.ts b/services/promotions/src/server.ts new file mode 100644 index 00000000..e0627e0b --- /dev/null +++ b/services/promotions/src/server.ts @@ -0,0 +1,39 @@ +import "dotenv/config"; +import { resolve as resolvePath } from "path"; + +import { loadSync } from "@grpc/proto-loader"; +import { loadPackageDefinition, Server } from "@grpc/grpc-js"; + +import { log, utils } from "@promotions/lib/log"; +import { options } from "@promotions/resources/protoloader-options"; +import { serverInsecure } from "@promotions/resources/grpc-credentials"; + +import promotionHandler from "@promotions/handler"; +import { createServerProxy } from "@promotions/lib/proxy"; +import { logGRPC } from "@promotions/middleware/log"; + +const PORT = process.env.PORT || 50006; +const ADDRESS = `0.0.0.0:${PORT}`; +const PROTO_PATH = resolvePath(__dirname + "/../../proto/promotions.proto"); + +const packageDefinition = loadSync(PROTO_PATH, options); +const grpc = loadPackageDefinition(packageDefinition) as any; +const { + PromotionService: { service: ds }, +} = grpc.com.goodfood.promotions; + +const server = createServerProxy(new Server()); +server.addService(ds, promotionHandler); +server.use(logGRPC); + +server.bindAsync(ADDRESS, serverInsecure, () => { + server.start(); + const message = `---- ${utils.green("good")}${utils.yellow( + "food" + )} Promotions Service ----\nstarted on: ${utils.bold(ADDRESS)} ${utils.green( + "✓" + )}\n`; + log.debug(message); +}); + +export default server; diff --git a/services/promotions/src/types/index.d.ts b/services/promotions/src/types/index.d.ts new file mode 100644 index 00000000..edf2bebf --- /dev/null +++ b/services/promotions/src/types/index.d.ts @@ -0,0 +1,3 @@ +export type Data = { + request: T; +}; diff --git a/services/promotions/src/types/promotion.d.ts b/services/promotions/src/types/promotion.d.ts new file mode 100644 index 00000000..aef3a006 --- /dev/null +++ b/services/promotions/src/types/promotion.d.ts @@ -0,0 +1,34 @@ +import { Method } from "@prisma/client"; + +export type Promotion = { + id: string; + + code: string; + reduction: string; + method: Method; +} + + +export type PromotionCreateInput = { + code: string; + reduction: string; + method: Method; + + restaurant_id: string; +} + +export type PromotionId = { + id: Promotion["id"]; +} + +export type RestaurantId = { + id: string; +} + +export type PromotionCode = { + code: Promotion["code"]; +} + +export type PromotionList = { + promotions: Promotion[]; +} \ No newline at end of file diff --git a/services/promotions/tsconfig.json b/services/promotions/tsconfig.json new file mode 100644 index 00000000..4eb46577 --- /dev/null +++ b/services/promotions/tsconfig.json @@ -0,0 +1,18 @@ +{ + "compilerOptions": { + "sourceMap": true, + "outDir": "dist", + "strict": true, + "lib": ["esnext"], + "esModuleInterop": true, + "baseUrl": ".", + "paths": { + "@promotions/*": ["src/*"] + } + }, + "include": ["src/**/*.ts"], + "exclude": ["node_modules"], + "ts-node": { + "require": ["tsconfig-paths/register"] + } +} diff --git a/services/proto/promotions.proto b/services/proto/promotions.proto new file mode 100644 index 00000000..43333e43 --- /dev/null +++ b/services/proto/promotions.proto @@ -0,0 +1,53 @@ +syntax = "proto3"; +import "google/protobuf/empty.proto"; + +package com.goodfood.promotions; + +message Promotion { + string id = 1; + + string code = 2; + string reduction = 3; + Method method = 4; + + string restaurant_id = 5; +} + +message PromotionCreateInput{ + string code = 1; + string reduction = 2; + Method method = 3; + + string restaurant_id = 4; +} + +message PromotionId{ + string id = 1; +} + +message RestaurantId{ + string id = 1; +} + +message PromotionCode{ + string code = 1; +} + +message PromotionList{ + repeated Promotion promotions = 1; +} + +enum Method { + PERCENT = 0; + VALUE = 1; +} + +service PromotionService { + rpc CreatePromotion (PromotionCreateInput) returns (Promotion) {} + rpc GetPromotion (PromotionCode) returns (Promotion) {} + rpc UpdatePromotion (Promotion) returns (Promotion) {} + rpc DeletePromotion (PromotionId) returns (google.protobuf.Empty) {} + rpc GetPromotions (google.protobuf.Empty) returns (PromotionList) {} + rpc GetPromotionsByRestaurant (RestaurantId) returns (PromotionList) {} + +} From 2bbaaf9b1e578545671861f4fa4fc1d2ffdc9c1b Mon Sep 17 00:00:00 2001 From: Pierre Lebigre <50985406+PierreLbg@users.noreply.github.com> Date: Fri, 21 Jul 2023 14:20:36 +0200 Subject: [PATCH 319/883] Update container port Co-authored-by: Florian Leroux <10078837+floriaaan@users.noreply.github.com> --- services/product/k8s/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/product/k8s/deployment.yml b/services/product/k8s/deployment.yml index 45d171b1..ecb37269 100644 --- a/services/product/k8s/deployment.yml +++ b/services/product/k8s/deployment.yml @@ -27,4 +27,4 @@ spec: name: goodfood-product-configmap key: port ports: - - containerPort: 3000 \ No newline at end of file + - containerPort: 50004 \ No newline at end of file From ba6430083320d48a40ee252c867fcf21d55fdd34 Mon Sep 17 00:00:00 2001 From: Pierre Lebigre <50985406+PierreLbg@users.noreply.github.com> Date: Fri, 21 Jul 2023 14:20:51 +0200 Subject: [PATCH 320/883] Update readme Co-authored-by: Florian Leroux <10078837+floriaaan@users.noreply.github.com> --- services/product/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/product/README.md b/services/product/README.md index 3981b6df..ccd63810 100644 --- a/services/product/README.md +++ b/services/product/README.md @@ -94,7 +94,7 @@ terraform output | sed 's/ //g' > ../.env ``` Check if the AMQP_URL value is good. (Ip de florian pour l'instant) -Then go to [terraform](./prisma) to migrate your table schema in your azure database. +Then go to [terraform](./terraform) to migrate your table schema in your azure database. ``` npx prisma migrate dev --name init ``` From 385d49962c1e4d1eb84197956dd6541e59d46bd8 Mon Sep 17 00:00:00 2001 From: Pierre Lebigre <50985406+PierreLbg@users.noreply.github.com> Date: Fri, 21 Jul 2023 14:26:08 +0200 Subject: [PATCH 321/883] Update .env.example Co-authored-by: Florian Leroux <10078837+floriaaan@users.noreply.github.com> --- services/product/.env.example | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/services/product/.env.example b/services/product/.env.example index ca737d6e..aa4adfe8 100644 --- a/services/product/.env.example +++ b/services/product/.env.example @@ -1,4 +1,4 @@ DATABASE_URL="postgresql://postgres:postgres@127.0.0.1:5432/postgres" PORT = 50004 -REACT_APP_AZURE_STORAGE_SAS_TOKEN = "example" -REACT_APP_AZURE_STORAGE_RESOURCE_NAME = "exemple" \ No newline at end of file +AZURE_STORAGE_SAS_TOKEN = "example" +AZURE_STORAGE_RESOURCE_NAME = "exemple" \ No newline at end of file From 69803d077ddd6256403b13179018c9351a41c071 Mon Sep 17 00:00:00 2001 From: Pierre Lebigre Date: Fri, 21 Jul 2023 15:27:42 +0200 Subject: [PATCH 322/883] Add functionnalities --- .../migration.sql | 8 +++++ services/promotions/prisma/schema.prisma | 1 + services/promotions/src/handler/create.ts | 32 +++++++++++++------ services/promotions/src/handler/delete.ts | 23 +++++++------ services/promotions/src/handler/get.ts | 25 +++++++++------ services/promotions/src/handler/list-all.ts | 26 +++++++++------ .../src/handler/list-by-restaurant.ts | 26 +++++++++------ services/promotions/src/handler/update.ts | 30 +++++++++++------ services/promotions/src/lib/prisma.ts | 16 ---------- services/promotions/src/lib/redis.ts | 7 ---- services/promotions/src/types/promotion.d.ts | 2 ++ 11 files changed, 115 insertions(+), 81 deletions(-) create mode 100644 services/promotions/prisma/migrations/20230721123549_add_restaurant_id/migration.sql delete mode 100644 services/promotions/src/lib/redis.ts diff --git a/services/promotions/prisma/migrations/20230721123549_add_restaurant_id/migration.sql b/services/promotions/prisma/migrations/20230721123549_add_restaurant_id/migration.sql new file mode 100644 index 00000000..634ce104 --- /dev/null +++ b/services/promotions/prisma/migrations/20230721123549_add_restaurant_id/migration.sql @@ -0,0 +1,8 @@ +/* + Warnings: + + - Added the required column `restaurant_id` to the `Promotion` table without a default value. This is not possible if the table is not empty. + +*/ +-- AlterTable +ALTER TABLE "Promotion" ADD COLUMN "restaurant_id" TEXT NOT NULL; diff --git a/services/promotions/prisma/schema.prisma b/services/promotions/prisma/schema.prisma index 5b4e9914..51eddb16 100644 --- a/services/promotions/prisma/schema.prisma +++ b/services/promotions/prisma/schema.prisma @@ -18,4 +18,5 @@ model Promotion{ code String @unique reduction String method Method + restaurant_id String } \ No newline at end of file diff --git a/services/promotions/src/handler/create.ts b/services/promotions/src/handler/create.ts index 0fe90f9c..69d08f9a 100644 --- a/services/promotions/src/handler/create.ts +++ b/services/promotions/src/handler/create.ts @@ -1,15 +1,27 @@ -import { PromotionCreateInput } from "@promotions/types/promotion"; +import { PromotionCreateInput, Promotion } from "@promotions/types/promotion"; import { log } from "@promotions/lib/log"; import { Data } from "@promotions/types"; +import prisma from "@promotions/lib/prisma"; export const CreatePromotion = async ( - { request }: Data, - callback: (err: any, response: any) => void - ) => { - try { - callback(null, null); - } catch (error) { - log.error(error); - callback(error, null); - } + { request }: Data, + callback: (err: any, response: Promotion | null) => void +) => { + try { + const { code, reduction, method, restaurant_id } = request; + + const promotion = await prisma.promotion.create({ + data: { + code, + reduction, + method, + restaurant_id + }, + }) as unknown as Promotion; + + callback(null, promotion); + } catch (error) { + log.error(error); + callback(error, null); + } }; \ No newline at end of file diff --git a/services/promotions/src/handler/delete.ts b/services/promotions/src/handler/delete.ts index fa3214b8..3e1edd13 100644 --- a/services/promotions/src/handler/delete.ts +++ b/services/promotions/src/handler/delete.ts @@ -1,15 +1,20 @@ import { PromotionId } from "@promotions/types/promotion"; import { log } from "@promotions/lib/log"; import { Data } from "@promotions/types"; +import prisma from "@promotions/lib/prisma"; export const DeletePromotion = async ( - { request }: Data, - callback: (err: any, response: null) => void - ) => { - try { - callback(null, null); - } catch (error) { - log.error(error); - callback(error, null); - } + { request }: Data, + callback: (err: any, response: null) => void +) => { + try { + const { id } = request; + + await prisma.promotion.delete({ where : { id } }); + + callback(null, null); + } catch (error) { + log.error(error); + callback(error, null); + } }; \ No newline at end of file diff --git a/services/promotions/src/handler/get.ts b/services/promotions/src/handler/get.ts index 9e784007..0f1af986 100644 --- a/services/promotions/src/handler/get.ts +++ b/services/promotions/src/handler/get.ts @@ -1,15 +1,20 @@ -import { PromotionCode } from "@promotions/types/promotion"; +import { PromotionCode, Promotion } from "@promotions/types/promotion"; import { log } from "@promotions/lib/log"; import { Data } from "@promotions/types"; +import prisma from "@promotions/lib/prisma"; export const GetPromotion = async ( - { request }: Data, - callback: (err: any, response: any) => void - ) => { - try { - callback(null, null); - } catch (error) { - log.error(error); - callback(error, null); - } + { request }: Data, + callback: (err: any, response: Promotion | null) => void +) => { + try { + const { code } = request; + + const promotion = await prisma.promotion.findFirst({ where: { code } }) as unknown as Promotion; + + callback(null, promotion); + } catch (error) { + log.error(error); + callback(error, null); + } }; \ No newline at end of file diff --git a/services/promotions/src/handler/list-all.ts b/services/promotions/src/handler/list-all.ts index 529a4ec6..b9df0f52 100644 --- a/services/promotions/src/handler/list-all.ts +++ b/services/promotions/src/handler/list-all.ts @@ -1,15 +1,21 @@ -import { PromotionId, PromotionList } from "@promotions/types/promotion"; +import { PromotionId, PromotionList, Promotion } from "@promotions/types/promotion"; import { log } from "@promotions/lib/log"; import { Data } from "@promotions/types"; +import prisma from "@promotions/lib/prisma"; export const GetPromotions = async ( - { request }: Data, - callback: (err: any, response: PromotionList | null) => void - ) => { - try { - callback(null, null); - } catch (error) { - log.error(error); - callback(error, null); - } + { request }: Data, + callback: (err: any, response: PromotionList | null) => void +) => { + try { + const { id } = request; + + const promotions = await prisma.promotion.findMany() as unknown as Promotion[]; + const promotionList = {promotions} as PromotionList; + + callback(null, promotionList); + } catch (error) { + log.error(error); + callback(error, null); + } }; \ No newline at end of file diff --git a/services/promotions/src/handler/list-by-restaurant.ts b/services/promotions/src/handler/list-by-restaurant.ts index 02107914..c59d669c 100644 --- a/services/promotions/src/handler/list-by-restaurant.ts +++ b/services/promotions/src/handler/list-by-restaurant.ts @@ -1,15 +1,21 @@ -import { RestaurantId, PromotionList } from "@promotions/types/promotion"; +import { RestaurantId, PromotionList, Promotion } from "@promotions/types/promotion"; import { log } from "@promotions/lib/log"; import { Data } from "@promotions/types"; +import prisma from "@promotions/lib/prisma"; export const GetPromotionsByRestaurant = async ( - { request }: Data, - callback: (err: any, response: PromotionList | null) => void - ) => { - try { - callback(null, null); - } catch (error) { - log.error(error); - callback(error, null); - } + { request }: Data, + callback: (err: any, response: PromotionList | null) => void +) => { + try { + const { id } = request; + + const promotions = await prisma.promotion.findMany({where : { restaurant_id : id }}) as unknown as Promotion[]; + const promotionList = { promotions } as PromotionList; + + callback(null, promotionList); + } catch (error) { + log.error(error); + callback(error, null); + } }; \ No newline at end of file diff --git a/services/promotions/src/handler/update.ts b/services/promotions/src/handler/update.ts index 41ab985e..ae9e777d 100644 --- a/services/promotions/src/handler/update.ts +++ b/services/promotions/src/handler/update.ts @@ -1,15 +1,27 @@ import { Promotion } from "@promotions/types/promotion"; import { log } from "@promotions/lib/log"; import { Data } from "@promotions/types"; +import prisma from "@promotions/lib/prisma"; export const UpdatePromotion = async ( - { request }: Data, - callback: (err: any, response: Promotion | null) => void - ) => { - try { - callback(null, null); - } catch (error) { - log.error(error); - callback(error, null); - } + { request }: Data, + callback: (err: any, response: Promotion | null) => void +) => { + try { + const { id, code, method, reduction } = request; + + const promotion = await prisma.promotion.update({ + where: { id }, + data: { + code, + method, + reduction, + }, + }); + + callback(null, promotion); + } catch (error) { + log.error(error); + callback(error, null); + } }; \ No newline at end of file diff --git a/services/promotions/src/lib/prisma.ts b/services/promotions/src/lib/prisma.ts index ff8519b4..4d495ef0 100644 --- a/services/promotions/src/lib/prisma.ts +++ b/services/promotions/src/lib/prisma.ts @@ -1,6 +1,4 @@ import { Prisma, PrismaClient } from "@prisma/client"; -import { createPrismaRedisCache } from "prisma-redis-middleware"; -import { redis } from "@delivery/lib/redis"; let prisma: PrismaClient; type GlobalWithPrisma = typeof globalThis & { @@ -26,20 +24,6 @@ if (process.env.NODE_ENV === "production") { prisma = (global as GlobalWithPrisma).prisma; } -const cacheMiddleware: Prisma.Middleware = createPrismaRedisCache({ - models: [ - { model: "DeliveryPerson", cacheTime: 300, cacheKey: "delivery_person" }, - ], - storage: { - type: "redis", - options: { client: redis, invalidation: { referencesTTL: 300 } }, - }, - cacheTime: 300, -}); - -//todo: change to $extends when it's available for prisma-redis-middleware -prisma.$use(cacheMiddleware); - export default prisma; export { prisma }; diff --git a/services/promotions/src/lib/redis.ts b/services/promotions/src/lib/redis.ts deleted file mode 100644 index 0eb33bb2..00000000 --- a/services/promotions/src/lib/redis.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { Redis } from "ioredis" - -export const redis = new Redis({ - host: process.env.REDIS_HOST || "localhost", - username: process.env.REDIS_USERNAME || undefined, - password: process.env.REDIS_PASSWORD || undefined, -}) \ No newline at end of file diff --git a/services/promotions/src/types/promotion.d.ts b/services/promotions/src/types/promotion.d.ts index aef3a006..4c401b41 100644 --- a/services/promotions/src/types/promotion.d.ts +++ b/services/promotions/src/types/promotion.d.ts @@ -6,6 +6,8 @@ export type Promotion = { code: string; reduction: string; method: Method; + + restaurant_id: string; } From d64c51b5201e49c2fdaa071c8522c811fab5225a Mon Sep 17 00:00:00 2001 From: Pierre Lebigre Date: Fri, 21 Jul 2023 16:58:17 +0200 Subject: [PATCH 323/883] Add docker file --- services/promotions/.dockerignore | 2 + services/promotions/.env.example | 4 + services/promotions/.gitignore | 8 +- services/promotions/Dockerfile | 38 ++++ services/promotions/README.md | 6 +- services/promotions/package.json | 1 + services/promotions/pnpm-lock.yaml | 231 +++++++++++++++++++++++++ services/promotions/src/handler/get.ts | 2 +- 8 files changed, 286 insertions(+), 6 deletions(-) create mode 100644 services/promotions/.dockerignore create mode 100644 services/promotions/.env.example create mode 100644 services/promotions/Dockerfile diff --git a/services/promotions/.dockerignore b/services/promotions/.dockerignore new file mode 100644 index 00000000..b7dab5e9 --- /dev/null +++ b/services/promotions/.dockerignore @@ -0,0 +1,2 @@ +node_modules +build \ No newline at end of file diff --git a/services/promotions/.env.example b/services/promotions/.env.example new file mode 100644 index 00000000..b1adbc98 --- /dev/null +++ b/services/promotions/.env.example @@ -0,0 +1,4 @@ +DATABASE_URL=postgresql://postgres:postgres@localhost:5432/promotions +AMQP_URL=amqp://guest:guest@localhost + +PORT=50006 \ No newline at end of file diff --git a/services/promotions/.gitignore b/services/promotions/.gitignore index 11ddd8db..bab9187d 100644 --- a/services/promotions/.gitignore +++ b/services/promotions/.gitignore @@ -1,3 +1,5 @@ -node_modules -# Keep environment variables out of version control -.env +node_modules/ +dist/ +bin/ +*.env* +!*.env.example \ No newline at end of file diff --git a/services/promotions/Dockerfile b/services/promotions/Dockerfile new file mode 100644 index 00000000..a1fc70da --- /dev/null +++ b/services/promotions/Dockerfile @@ -0,0 +1,38 @@ +FROM node:18-alpine3.17 as builder + +# Set working directory +WORKDIR /app + +# Copy the application code +COPY ./promotions/ . + +# Install dependencies +RUN npm install + +# Copy the proto files +COPY ./proto ./proto/ + +# Generate Prisma client +RUN npx prisma generate + +# Build the application +RUN npm run build + + +# Create a new image with the application +FROM node:18-alpine3.17 as runner + +# Set working directory +WORKDIR /app + +# Copy the application package +COPY --from=builder /app/dist . +COPY --from=builder /app/prisma/ . +COPY --from=builder /app/proto/ /proto/ +COPY --from=builder /app/node_modules/.prisma /.prisma + +# Expose the gRPC port +EXPOSE 50006 + +# Start the server +CMD [ "node", "index.js"] diff --git a/services/promotions/README.md b/services/promotions/README.md index 3496bcf0..8aa04cda 100644 --- a/services/promotions/README.md +++ b/services/promotions/README.md @@ -40,7 +40,7 @@ You can use the following tools to help you with the setup: ### 1. Clone the repository and install dependencies 1. Clone the `goodfood` repository to your local machine. -2. Navigate to the service directory (`services/delivery`) in your terminal. +2. Navigate to the service directory (`services/promotions`) in your terminal. 3. Run `npm install` to install the necessary dependencies. 4. Create a `.env` file at the root of the project directory and add the environment variables values ( see `.env.example`). @@ -70,7 +70,9 @@ To build the image you need to be in the **parent folder** of the service you wa command: ``` -docker build -t goodfood-delivery:1.0.0 -f ./delivery/Dockerfile . +docker build -t goodfood-promotions:1.0.0 -f ./promotions/Dockerfile . +docker tag goodfood-promotions:1.0.0 pierrelbg/goodfood-promotions:1.0.0 +docker push pierrelbg/goodfood-promotions:1.0.0 ``` ### Run diff --git a/services/promotions/package.json b/services/promotions/package.json index a7184064..6506e8a7 100644 --- a/services/promotions/package.json +++ b/services/promotions/package.json @@ -20,6 +20,7 @@ "@prisma/client": "5.0.0", "amqplib": "^0.10.3", "dotenv": "^16.3.1", + "esbuild": "^0.18.15", "nodemon": "^3.0.1", "path": "^0.12.7", "ts-node": "^10.9.1", diff --git a/services/promotions/pnpm-lock.yaml b/services/promotions/pnpm-lock.yaml index d398f532..22f8d01f 100644 --- a/services/promotions/pnpm-lock.yaml +++ b/services/promotions/pnpm-lock.yaml @@ -20,6 +20,9 @@ dependencies: dotenv: specifier: ^16.3.1 version: 16.3.1 + esbuild: + specifier: ^0.18.15 + version: 0.18.15 nodemon: specifier: ^3.0.1 version: 3.0.1 @@ -64,6 +67,204 @@ packages: '@jridgewell/trace-mapping': 0.3.9 dev: false + /@esbuild/android-arm64@0.18.15: + resolution: {integrity: sha512-NI/gnWcMl2kXt1HJKOn2H69SYn4YNheKo6NZt1hyfKWdMbaGadxjZIkcj4Gjk/WPxnbFXs9/3HjGHaknCqjrww==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: false + optional: true + + /@esbuild/android-arm@0.18.15: + resolution: {integrity: sha512-wlkQBWb79/jeEEoRmrxt/yhn5T1lU236OCNpnfRzaCJHZ/5gf82uYx1qmADTBWE0AR/v7FiozE1auk2riyQd3w==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + requiresBuild: true + dev: false + optional: true + + /@esbuild/android-x64@0.18.15: + resolution: {integrity: sha512-FM9NQamSaEm/IZIhegF76aiLnng1kEsZl2eve/emxDeReVfRuRNmvT28l6hoFD9TsCxpK+i4v8LPpEj74T7yjA==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + requiresBuild: true + dev: false + optional: true + + /@esbuild/darwin-arm64@0.18.15: + resolution: {integrity: sha512-XmrFwEOYauKte9QjS6hz60FpOCnw4zaPAb7XV7O4lx1r39XjJhTN7ZpXqJh4sN6q60zbP6QwAVVA8N/wUyBH/w==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@esbuild/darwin-x64@0.18.15: + resolution: {integrity: sha512-bMqBmpw1e//7Fh5GLetSZaeo9zSC4/CMtrVFdj+bqKPGJuKyfNJ5Nf2m3LknKZTS+Q4oyPiON+v3eaJ59sLB5A==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@esbuild/freebsd-arm64@0.18.15: + resolution: {integrity: sha512-LoTK5N3bOmNI9zVLCeTgnk5Rk0WdUTrr9dyDAQGVMrNTh9EAPuNwSTCgaKOKiDpverOa0htPcO9NwslSE5xuLA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: false + optional: true + + /@esbuild/freebsd-x64@0.18.15: + resolution: {integrity: sha512-62jX5n30VzgrjAjOk5orYeHFq6sqjvsIj1QesXvn5OZtdt5Gdj0vUNJy9NIpjfdNdqr76jjtzBJKf+h2uzYuTQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-arm64@0.18.15: + resolution: {integrity: sha512-BWncQeuWDgYv0jTNzJjaNgleduV4tMbQjmk/zpPh/lUdMcNEAxy+jvneDJ6RJkrqloG7tB9S9rCrtfk/kuplsQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-arm@0.18.15: + resolution: {integrity: sha512-dT4URUv6ir45ZkBqhwZwyFV6cH61k8MttIwhThp2BGiVtagYvCToF+Bggyx2VI57RG4Fbt21f9TmXaYx0DeUJg==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-ia32@0.18.15: + resolution: {integrity: sha512-JPXORvgHRHITqfms1dWT/GbEY89u848dC08o0yK3fNskhp0t2TuNUnsrrSgOdH28ceb1hJuwyr8R/1RnyPwocw==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-loong64@0.18.15: + resolution: {integrity: sha512-kArPI0DopjJCEplsVj/H+2Qgzz7vdFSacHNsgoAKpPS6W/Ndh8Oe24HRDQ5QCu4jHgN6XOtfFfLpRx3TXv/mEg==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-mips64el@0.18.15: + resolution: {integrity: sha512-b/tmngUfO02E00c1XnNTw/0DmloKjb6XQeqxaYuzGwHe0fHVgx5/D6CWi+XH1DvkszjBUkK9BX7n1ARTOst59w==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-ppc64@0.18.15: + resolution: {integrity: sha512-KXPY69MWw79QJkyvUYb2ex/OgnN/8N/Aw5UDPlgoRtoEfcBqfeLodPr42UojV3NdkoO4u10NXQdamWm1YEzSKw==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-riscv64@0.18.15: + resolution: {integrity: sha512-komK3NEAeeGRnvFEjX1SfVg6EmkfIi5aKzevdvJqMydYr9N+pRQK0PGJXk+bhoPZwOUgLO4l99FZmLGk/L1jWg==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-s390x@0.18.15: + resolution: {integrity: sha512-632T5Ts6gQ2WiMLWRRyeflPAm44u2E/s/TJvn+BP6M5mnHSk93cieaypj3VSMYO2ePTCRqAFXtuYi1yv8uZJNA==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-x64@0.18.15: + resolution: {integrity: sha512-MsHtX0NgvRHsoOtYkuxyk4Vkmvk3PLRWfA4okK7c+6dT0Fu4SUqXAr9y4Q3d8vUf1VWWb6YutpL4XNe400iQ1g==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/netbsd-x64@0.18.15: + resolution: {integrity: sha512-djST6s+jQiwxMIVQ5rlt24JFIAr4uwUnzceuFL7BQT4CbrRtqBPueS4GjXSiIpmwVri1Icj/9pFRJ7/aScvT+A==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: false + optional: true + + /@esbuild/openbsd-x64@0.18.15: + resolution: {integrity: sha512-naeRhUIvhsgeounjkF5mvrNAVMGAm6EJWiabskeE5yOeBbLp7T89tAEw0j5Jm/CZAwyLe3c67zyCWH6fsBLCpw==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: false + optional: true + + /@esbuild/sunos-x64@0.18.15: + resolution: {integrity: sha512-qkT2+WxyKbNIKV1AEhI8QiSIgTHMcRctzSaa/I3kVgMS5dl3fOeoqkb7pW76KwxHoriImhx7Mg3TwN/auMDsyQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: false + optional: true + + /@esbuild/win32-arm64@0.18.15: + resolution: {integrity: sha512-HC4/feP+pB2Vb+cMPUjAnFyERs+HJN7E6KaeBlFdBv799MhD+aPJlfi/yk36SED58J9TPwI8MAcVpJgej4ud0A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@esbuild/win32-ia32@0.18.15: + resolution: {integrity: sha512-ovjwoRXI+gf52EVF60u9sSDj7myPixPxqzD5CmkEUmvs+W9Xd0iqISVBQn8xcx4ciIaIVlWCuTbYDOXOnOL44Q==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@esbuild/win32-x64@0.18.15: + resolution: {integrity: sha512-imUxH9a3WJARyAvrG7srLyiK73XdX83NXQkjKvQ+7vPh3ZxoLrzvPkQKKw2DwZ+RV2ZB6vBfNHP8XScAmQC3aA==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: false + optional: true + /@grpc/grpc-js@1.8.18: resolution: {integrity: sha512-2uWPtxhsXmVgd8WzDhfamSjHpZDXfMjMDciY6VRTq4Sn7rFzazyf0LLDa0oav+61UHIoEZb4KKaAV6S7NuJFbQ==} engines: {node: ^8.13.0 || >=10.10.0} @@ -357,6 +558,36 @@ packages: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} dev: false + /esbuild@0.18.15: + resolution: {integrity: sha512-3WOOLhrvuTGPRzQPU6waSDWrDTnQriia72McWcn6UCi43GhCHrXH4S59hKMeez+IITmdUuUyvbU9JIp+t3xlPQ==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/android-arm': 0.18.15 + '@esbuild/android-arm64': 0.18.15 + '@esbuild/android-x64': 0.18.15 + '@esbuild/darwin-arm64': 0.18.15 + '@esbuild/darwin-x64': 0.18.15 + '@esbuild/freebsd-arm64': 0.18.15 + '@esbuild/freebsd-x64': 0.18.15 + '@esbuild/linux-arm': 0.18.15 + '@esbuild/linux-arm64': 0.18.15 + '@esbuild/linux-ia32': 0.18.15 + '@esbuild/linux-loong64': 0.18.15 + '@esbuild/linux-mips64el': 0.18.15 + '@esbuild/linux-ppc64': 0.18.15 + '@esbuild/linux-riscv64': 0.18.15 + '@esbuild/linux-s390x': 0.18.15 + '@esbuild/linux-x64': 0.18.15 + '@esbuild/netbsd-x64': 0.18.15 + '@esbuild/openbsd-x64': 0.18.15 + '@esbuild/sunos-x64': 0.18.15 + '@esbuild/win32-arm64': 0.18.15 + '@esbuild/win32-ia32': 0.18.15 + '@esbuild/win32-x64': 0.18.15 + dev: false + /escalade@3.1.1: resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} engines: {node: '>=6'} diff --git a/services/promotions/src/handler/get.ts b/services/promotions/src/handler/get.ts index 0f1af986..b92b5cd0 100644 --- a/services/promotions/src/handler/get.ts +++ b/services/promotions/src/handler/get.ts @@ -10,7 +10,7 @@ export const GetPromotion = async ( try { const { code } = request; - const promotion = await prisma.promotion.findFirst({ where: { code } }) as unknown as Promotion; + const promotion = await prisma.promotion.findFirstOrThrow({ where: { code } }) as unknown as Promotion; callback(null, promotion); } catch (error) { From 04eefbc7b7ecee49a672a5fa68a8d68445506596 Mon Sep 17 00:00:00 2001 From: anatole Date: Tue, 25 Jul 2023 00:48:59 +0200 Subject: [PATCH 324/883] feat(user): create the user controller --- .../src/controller/user/userController.ts | 179 +++++++++++++++++- .../src/services/clients/user_client.ts | 6 + services/gateway/src/services/user_service.ts | 20 +- 3 files changed, 192 insertions(+), 13 deletions(-) create mode 100644 services/gateway/src/services/clients/user_client.ts diff --git a/services/gateway/src/controller/user/userController.ts b/services/gateway/src/controller/user/userController.ts index df9de11d..c3f89dc8 100644 --- a/services/gateway/src/controller/user/userController.ts +++ b/services/gateway/src/controller/user/userController.ts @@ -1,16 +1,30 @@ import express, {Request, Response} from 'express'; -import userService from '../../services/user_service'; -import {UserId} from "@order/proto/user_pb"; +import userServiceClient from '../../services/clients/user_client'; +import { + changePasswordInput, + changeRoleInput, + DeleteInput, + logInInput, + UpdateUserInput, + User, + UserCreateInput, + validateInput +} from "@order/proto/user_pb"; import {Empty} from "google-protobuf/google/protobuf/empty_pb"; - +import {getUser} from "@order/services/user_service"; export const userController = (app: express.Application) => { app.get('/api/user/:id', (req: Request, res: Response) => { const {id} = req.params; - const userId = new UserId(); - userId.setId(Number(id)); + try { + res.json(getUser(Number(id))); + } catch (e: any) { + res.json({error: e.message}); + } + }); - userService.getUser(userId, (error, response) => { + app.get('/api/user', (req: Request, res: Response) => { + userServiceClient.listUser(new Empty(), (error, response) => { if (error) { res.json({error: error.message}); } else { @@ -19,8 +33,23 @@ export const userController = (app: express.Application) => { }); }); - app.get('/api/user', (req: Request, res: Response) => { - userService.listUser(new Empty(), (error, response) => { + app.post('/api/user', (req: Request, res: Response) => { + const body = req.body; + let userInput = new UserCreateInput(); + try { + userInput.setFirstName(body.firstName) + .setLastName(body.lastName) + .setEmail(body.email) + .setPassword(body.password) + .setPhone(body.phone) + .setMainaddress(body.address) + .setRole(body.role); + + } catch (e: any) { + res.json({error: e.message}); + } + + userServiceClient.register(userInput, (error, response) => { if (error) { res.json({error: error.message}); } else { @@ -28,4 +57,138 @@ export const userController = (app: express.Application) => { } }); }); + + app.put('/api/user/:id', (req: Request, res: Response) => { + const {authorization} = req.headers; + if (!authorization) { + res.json({error: 'Not authorized'}); + return; + } + + const body = req.body; + const userInput = new UpdateUserInput() + try { + const user = new User().setId(Number(req.params.id)) + .setFirstName(body.firstName) + .setLastName(body.lastName) + .setEmail(body.email) + .setPhone(body.phone) + .setMainaddress(body.address) + .setRole(body.role); + + userInput.setUser(user).setToken(authorization); + + } catch (e: any) { + res.json({error: e.message}); + } + + userServiceClient.updateUser(userInput, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } + }); + }); + + app.delete('/api/user/:id', (req: Request, res: Response) => { + const {id} = req.params; + const {authorization} = req.headers; + if (!authorization) { + res.json({error: 'Not authorized'}); + return; + } + + userServiceClient.deleteUser(new DeleteInput().setUserid(Number(id)).setToken(authorization), (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } + }); + }); + + app.post('/api/user/login', (req: Request, res: Response) => { + const body = req.body; + const inInput = new logInInput().setEmail(body.email).setPassword(body.password); + + userServiceClient.logIn(inInput, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } + }); + }); + + app.post('/api/user/validate', (req: Request, res: Response) => { + const {authorization} = req.headers; + if (!authorization) { + res.json({error: 'Not authorized'}); + return; + } + const validate = new validateInput().setToken(authorization); + + userServiceClient.validate(validate, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } + }); + }); + + app.put('/api/user/:id/password', (req: Request, res: Response) => { + const {authorization} = req.headers; + if (!authorization) { + res.json({error: 'Not authorized'}); + return; + } + + const body = req.body; + const updatePasswordInput = new changePasswordInput(); + try { + updatePasswordInput + .setToken(authorization) + .setOldpassword(body.oldpassword) + .setNewpassword(body.password); + } catch (e: any) { + res.json({error: e.message}); + } + + userServiceClient.changePassword(updatePasswordInput, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } + }); + }); + + app.put('/api/user/:id/role', (req: Request, res: Response) => { + const {authorization} = req.headers; + if (!authorization) { + res.json({error: 'Not authorized'}); + return; + } + const body = req.body; + const id = req.params.id; + const updatePasswordInput = new changeRoleInput(); + try { + updatePasswordInput + .setToken(authorization) + .setUserid(Number(id)) + .setRolecode(body.role); + } catch (e: any) { + res.json({error: e.message}); + } + userServiceClient.changeRole(updatePasswordInput, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } + }); + + }); } \ No newline at end of file diff --git a/services/gateway/src/services/clients/user_client.ts b/services/gateway/src/services/clients/user_client.ts new file mode 100644 index 00000000..0f8db947 --- /dev/null +++ b/services/gateway/src/services/clients/user_client.ts @@ -0,0 +1,6 @@ +import services from '../../proto/user_grpc_pb'; +import * as grpc from "grpc"; + +export default new services.UserServiceClient( + 'http://localhost:50001', + grpc.credentials.createInsecure()); \ No newline at end of file diff --git a/services/gateway/src/services/user_service.ts b/services/gateway/src/services/user_service.ts index 25693673..667bb9cc 100644 --- a/services/gateway/src/services/user_service.ts +++ b/services/gateway/src/services/user_service.ts @@ -1,6 +1,16 @@ -import services from '../proto/user_grpc_pb'; -import * as grpc from "grpc"; +import {User, UserId} from "@order/proto/user_pb"; +import userServiceClient from "@order/services/clients/user_client"; -export default new services.UserServiceClient( - 'http://localhost:50001', - grpc.credentials.createInsecure()); \ No newline at end of file +export const getUser = (id: number): User | undefined => { + const userId = new UserId(); + userId.setId(Number(id)); + let user: User | undefined = undefined; + userServiceClient.getUser(userId, (error, response) => { + if (error) { + throw Error(error.message); + } else { + user = response.getUser() + } + }); + return user; +} \ No newline at end of file From 56ef2129592984438054388b2593d6968a9fadb9 Mon Sep 17 00:00:00 2001 From: anatole Date: Tue, 25 Jul 2023 00:49:21 +0200 Subject: [PATCH 325/883] feat(order): create the order controller --- .../src/controller/order/orderController.ts | 145 ++++++++++++++++++ services/gateway/src/server.ts | 2 + .../src/services/clients/order_client.ts | 7 + 3 files changed, 154 insertions(+) create mode 100644 services/gateway/src/controller/order/orderController.ts create mode 100644 services/gateway/src/services/clients/order_client.ts diff --git a/services/gateway/src/controller/order/orderController.ts b/services/gateway/src/controller/order/orderController.ts new file mode 100644 index 00000000..6d9e4ca4 --- /dev/null +++ b/services/gateway/src/controller/order/orderController.ts @@ -0,0 +1,145 @@ +import orderService from '../../services/clients/order_client'; +import express, {Request, Response} from "express"; +import { + CreateOrderRequest, + DeleteOrderRequest, + GetOrderByDeliveryRequest, + GetOrderByPaymentRequest, + GetOrderRequest, + GetOrdersByStatusRequest, + GetOrdersByUserRequest, + UpdateOrderRequest, + UserMinimum +} from "@order/proto/order_pb"; +import {getUser} from "@order/services/user_service"; +import {User} from "@order/proto/user_pb"; + +export const orderController = (app: express.Application) => { + app.get('/api/order/:id', (req: Request, res: Response) => { + const {id} = req.params; + const orderId = new GetOrderRequest(); + orderId.setId(id); + + orderService.getOrder(orderId, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } + }); + }); + + app.post('/api/order', (req: Request, res: Response) => { + const body = req.body; + let user: User | undefined = undefined; + try { + user = getUser(Number(req.body.userId)); + } catch (e: any) { + res.json({error: e.message}); + } + + if (!user) { + res.json({error: "User not found"}); + return; + } + + const miniUser = new UserMinimum().setId(String(user.getId())) + .setEmail(user.getEmail()) + .setFirstName(user.getFirstName()) + .setLastName(user.getLastName()) + .setPhone(user.getPhone()); + + let orderInput = new CreateOrderRequest() + .setUser(miniUser) + .setPaymentId(body.paymentId) + .setDeliveryId(body.deliveryId) + .setDeliveryType(body.deliveryType) + .setBasketSnapshot(body.basketSnapshot) + .setRestaurantId(body.restaurantId); + + orderService.createOrder(orderInput, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } + }); + }); + + app.get('/api/order/by-user/:userId', (req: Request, res: Response) => { + const {userId} = req.params; + const orderInput = new GetOrdersByUserRequest().setId(userId); + orderService.getOrdersByUser(orderInput, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } + }); + }); + + app.post('/api/order/by-status', (req: Request, res: Response) => { + const orderInput = new GetOrdersByStatusRequest().setStatus(req.body.status); + + orderService.getOrdersByStatus(orderInput, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } + }); + }); + + app.get('/api/order/by-delivery/:deliveryId', (req: Request, res: Response) => { + const {deliveryId} = req.params; + const orderInput = new GetOrderByDeliveryRequest().setId(deliveryId); + orderService.getOrderByDelivery(orderInput, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } + }); + }); + + app.get('/api/order/by-payment/:paymentId', (req: Request, res: Response) => { + const {paymentId} = req.params; + const orderInput = new GetOrderByPaymentRequest().setId(paymentId); + orderService.getOrderByPayment(orderInput, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } + }); + }); + + app.put('/api/order/:orderId', (req: Request, res: Response) => { + const {orderId} = req.params; + const orderInput = new UpdateOrderRequest() + .setId(orderId) + .setStatus(req.body.status) + .setDeliveryId(req.body.deliveryId) + .setPaymentId(req.body.paymentId) + .setRestaurantId(req.body.restaurantId); + orderService.updateOrder(orderInput, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } + }); + }); + + app.delete('/api/order/:orderId', (req: Request, res: Response) => { + const {orderId} = req.params; + const orderInput = new DeleteOrderRequest().setId(orderId); + orderService.deleteOrder(orderInput, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } + }); + }); +} \ No newline at end of file diff --git a/services/gateway/src/server.ts b/services/gateway/src/server.ts index 8c751ad9..748358d8 100644 --- a/services/gateway/src/server.ts +++ b/services/gateway/src/server.ts @@ -1,5 +1,6 @@ import {Request, Response} from "express"; import {userController} from "@order/controller/user/userController"; +import {orderController} from "@order/controller/order/orderController"; const express = require('express'); const bodyParser = require('body-parser'); @@ -14,6 +15,7 @@ app.get('/', (req: Request, res: Response) => { }); userController(app); +orderController(app); app.listen(PORT, () => { console.log(`API Gateway is running on port ${PORT}`); diff --git a/services/gateway/src/services/clients/order_client.ts b/services/gateway/src/services/clients/order_client.ts new file mode 100644 index 00000000..fc3efbd3 --- /dev/null +++ b/services/gateway/src/services/clients/order_client.ts @@ -0,0 +1,7 @@ +import services from '../../proto/order_grpc_pb'; +import * as grpc from "grpc"; + +// TODO: add order env +export default new services.OrderServiceClient( + 'http://localhost:50007', + grpc.credentials.createInsecure()); \ No newline at end of file From b04c91f8e8fde16550bcf2b321856434e73a1d17 Mon Sep 17 00:00:00 2001 From: Pierre Lebigre Date: Tue, 25 Jul 2023 13:22:30 +0200 Subject: [PATCH 326/883] Add CI/CD --- .github/workflows/promotions.yml | 69 ++++++++++++++++++++++++++++++++ 1 file changed, 69 insertions(+) create mode 100644 .github/workflows/promotions.yml diff --git a/.github/workflows/promotions.yml b/.github/workflows/promotions.yml new file mode 100644 index 00000000..fb95fee0 --- /dev/null +++ b/.github/workflows/promotions.yml @@ -0,0 +1,69 @@ +name: Promotions Microservice CI/CD + +on: + push: + branches: [ promotions ] + pull_request: + branches: [ dev, main ] + +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@master + - uses: pnpm/action-setup@v2 + with: + version: latest + - uses: actions/setup-node@v3 + with: + node-version: "18.x" + cache: "pnpm" + cache-dependency-path: services/promotions/pnpm-lock.yaml + - name: Install dependencies + run: | + cd ./services/promotions + pnpm install --frozen-lockfile + - name: Build + run: | + cd ./services/promotions + pnpm build + + test: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@master + - uses: pnpm/action-setup@v2 + with: + version: latest + - uses: actions/setup-node@v3 + with: + node-version: "18.x" + cache: "pnpm" + cache-dependency-path: services/promotions/pnpm-lock.yaml + - name: Install dependencies + run: | + cd ./services/promotions + pnpm install --frozen-lockfile + - name: Execute tests + run: | + cd ./services/promotions + pnpm test + + publish: + runs-on: ubuntu-latest + needs: [ build, test ] + steps: + - name: Checkout code + uses: actions/checkout@master + - name: Login to Docker Hub + uses: docker/login-action@v2 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + - name: Build and push + uses: docker/build-push-action@v4 + with: + context: ./services/ + file: ./services/promotions/Dockerfile + push: true + tags: pierrelbg/goodfood-promotions:latest \ No newline at end of file From 64596763436d34a9a702444b9c536bc5d95a3b56 Mon Sep 17 00:00:00 2001 From: anatole Date: Wed, 2 Aug 2023 11:07:15 +0200 Subject: [PATCH 327/883] feat(gateway config): add dependency --- services/gateway/package-lock.json | 210 +++++++++++++++++++++++++---- services/gateway/package.json | 1 + services/gateway/tsconfig.json | 2 +- 3 files changed, 185 insertions(+), 28 deletions(-) diff --git a/services/gateway/package-lock.json b/services/gateway/package-lock.json index ba01f642..cdcd3cf2 100644 --- a/services/gateway/package-lock.json +++ b/services/gateway/package-lock.json @@ -27,6 +27,7 @@ "@types/node": "^18.15.9", "@vitest/coverage-c8": "^0.33.0", "esbuild": "^0.17.18", + "grpc_tools_node_protoc_ts": "^5.3.3", "grpc-tools": "^1.12.4", "nodemon": "^3.0.1", "pkg": "^5.8.1", @@ -1860,6 +1861,25 @@ "node": ">=4" } }, + "node_modules/grpc_tools_node_protoc_ts": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/grpc_tools_node_protoc_ts/-/grpc_tools_node_protoc_ts-5.3.3.tgz", + "integrity": "sha512-M/YrklvVXMtuuj9kb42PxeouZhs7Ul+R4e/31XwrankUcKL8cQQP50Q9q+KEHGyHQaPt6VtKKsxMgLaKbCxeww==", + "dev": true, + "dependencies": { + "google-protobuf": "3.15.8", + "handlebars": "4.7.7" + }, + "bin": { + "protoc-gen-ts": "bin/protoc-gen-ts" + } + }, + "node_modules/grpc_tools_node_protoc_ts/node_modules/google-protobuf": { + "version": "3.15.8", + "resolved": "https://registry.npmjs.org/google-protobuf/-/google-protobuf-3.15.8.tgz", + "integrity": "sha512-2jtfdqTaSxk0cuBJBtTTWsot4WtR9RVr2rXg7x7OoqiuOKopPrwXpM1G4dXIkLcUNRh3RKzz76C8IOkksZSeOw==", + "dev": true + }, "node_modules/grpc-tools": { "version": "1.12.4", "resolved": "https://registry.npmjs.org/grpc-tools/-/grpc-tools-1.12.4.tgz", @@ -1975,6 +1995,27 @@ "y18n": "^3.2.0" } }, + "node_modules/handlebars": { + "version": "4.7.7", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz", + "integrity": "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==", + "dev": true, + "dependencies": { + "minimist": "^1.2.5", + "neo-async": "^2.6.0", + "source-map": "^0.6.1", + "wordwrap": "^1.0.0" + }, + "bin": { + "handlebars": "bin/handlebars" + }, + "engines": { + "node": ">=0.4.7" + }, + "optionalDependencies": { + "uglify-js": "^3.1.4" + } + }, "node_modules/has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", @@ -2643,6 +2684,12 @@ "node": ">= 0.6" } }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true + }, "node_modules/node-abi": { "version": "3.45.0", "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.45.0.tgz", @@ -3559,6 +3606,15 @@ "node": ">=8" } }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/source-map-js": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", @@ -3936,26 +3992,6 @@ } } }, - "node_modules/tsconfck": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/tsconfck/-/tsconfck-2.1.1.tgz", - "integrity": "sha512-ZPCkJBKASZBmBUNqGHmRhdhM8pJYDdOXp4nRgj/O0JwUwsMq50lCDRQP/M5GBNAA0elPrq4gAeu4dkaVCuKWww==", - "dev": true, - "bin": { - "tsconfck": "bin/tsconfck.js" - }, - "engines": { - "node": "^14.13.1 || ^16 || >=18" - }, - "peerDependencies": { - "typescript": "^4.3.5 || ^5.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, "node_modules/tsconfig-paths": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", @@ -4022,6 +4058,19 @@ "integrity": "sha512-TrY6DsjTQQgyS3E3dBaOXf0TpPD8u9FVrVYmKVegJuFw51n/YB9XPt+U6ydzFG5ZIN7+DIjPbNmXoBj9esYhgQ==", "dev": true }, + "node_modules/uglify-js": { + "version": "3.17.4", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz", + "integrity": "sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==", + "dev": true, + "optional": true, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + } + }, "node_modules/undefsafe": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", @@ -4183,6 +4232,41 @@ } } }, + "node_modules/vite-tsconfig-paths/node_modules/tsconfck": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/tsconfck/-/tsconfck-2.1.2.tgz", + "integrity": "sha512-ghqN1b0puy3MhhviwO2kGF8SeMDNhEbnKxjK7h6+fvY9JAxqvXi8y5NAHSQv687OVboS2uZIByzGd45/YxrRHg==", + "dev": true, + "bin": { + "tsconfck": "bin/tsconfck.js" + }, + "engines": { + "node": "^14.13.1 || ^16 || >=18" + }, + "peerDependencies": { + "typescript": "^4.3.5 || ^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/vite-tsconfig-paths/node_modules/typescript": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz", + "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==", + "dev": true, + "optional": true, + "peer": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, "node_modules/vite/node_modules/@esbuild/linux-x64": { "version": "0.18.12", "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.12.tgz", @@ -4390,6 +4474,12 @@ "node": ">= 0.10.0" } }, + "node_modules/wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", + "dev": true + }, "node_modules/wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", @@ -5988,6 +6078,24 @@ } } }, + "grpc_tools_node_protoc_ts": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/grpc_tools_node_protoc_ts/-/grpc_tools_node_protoc_ts-5.3.3.tgz", + "integrity": "sha512-M/YrklvVXMtuuj9kb42PxeouZhs7Ul+R4e/31XwrankUcKL8cQQP50Q9q+KEHGyHQaPt6VtKKsxMgLaKbCxeww==", + "dev": true, + "requires": { + "google-protobuf": "3.15.8", + "handlebars": "4.7.7" + }, + "dependencies": { + "google-protobuf": { + "version": "3.15.8", + "resolved": "https://registry.npmjs.org/google-protobuf/-/google-protobuf-3.15.8.tgz", + "integrity": "sha512-2jtfdqTaSxk0cuBJBtTTWsot4WtR9RVr2rXg7x7OoqiuOKopPrwXpM1G4dXIkLcUNRh3RKzz76C8IOkksZSeOw==", + "dev": true + } + } + }, "grpc-tools": { "version": "1.12.4", "resolved": "https://registry.npmjs.org/grpc-tools/-/grpc-tools-1.12.4.tgz", @@ -5997,6 +6105,19 @@ "@mapbox/node-pre-gyp": "^1.0.5" } }, + "handlebars": { + "version": "4.7.7", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz", + "integrity": "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==", + "dev": true, + "requires": { + "minimist": "^1.2.5", + "neo-async": "^2.6.0", + "source-map": "^0.6.1", + "uglify-js": "^3.1.4", + "wordwrap": "^1.0.0" + } + }, "has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", @@ -6462,6 +6583,12 @@ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==" }, + "neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true + }, "node-abi": { "version": "3.45.0", "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.45.0.tgz", @@ -7096,6 +7223,12 @@ "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, "source-map-js": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", @@ -7388,13 +7521,6 @@ "yn": "3.1.1" } }, - "tsconfck": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/tsconfck/-/tsconfck-2.1.1.tgz", - "integrity": "sha512-ZPCkJBKASZBmBUNqGHmRhdhM8pJYDdOXp4nRgj/O0JwUwsMq50lCDRQP/M5GBNAA0elPrq4gAeu4dkaVCuKWww==", - "dev": true, - "requires": {} - }, "tsconfig-paths": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", @@ -7442,6 +7568,13 @@ "integrity": "sha512-TrY6DsjTQQgyS3E3dBaOXf0TpPD8u9FVrVYmKVegJuFw51n/YB9XPt+U6ydzFG5ZIN7+DIjPbNmXoBj9esYhgQ==", "dev": true }, + "uglify-js": { + "version": "3.17.4", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz", + "integrity": "sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==", + "dev": true, + "optional": true + }, "undefsafe": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", @@ -7565,6 +7698,23 @@ "debug": "^4.1.1", "globrex": "^0.1.2", "tsconfck": "^2.1.0" + }, + "dependencies": { + "tsconfck": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/tsconfck/-/tsconfck-2.1.2.tgz", + "integrity": "sha512-ghqN1b0puy3MhhviwO2kGF8SeMDNhEbnKxjK7h6+fvY9JAxqvXi8y5NAHSQv687OVboS2uZIByzGd45/YxrRHg==", + "dev": true, + "requires": {} + }, + "typescript": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz", + "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==", + "dev": true, + "optional": true, + "peer": true + } } }, "vitest": { @@ -7654,6 +7804,12 @@ "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.4.tgz", "integrity": "sha512-2thx4pB0cV3h+Bw7QmMXcEbdmOzv9t0HFplJH/Lz6yu60hXYy5RT8rUu+wlIreVxWsGN20mo+MHeCSfUpQBwPw==" }, + "wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", + "dev": true + }, "wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", diff --git a/services/gateway/package.json b/services/gateway/package.json index 7c7763b7..f4920a50 100644 --- a/services/gateway/package.json +++ b/services/gateway/package.json @@ -27,6 +27,7 @@ "@types/node": "^18.15.9", "@vitest/coverage-c8": "^0.33.0", "esbuild": "^0.17.18", + "grpc_tools_node_protoc_ts": "^5.3.3", "grpc-tools": "^1.12.4", "nodemon": "^3.0.1", "pkg": "^5.8.1", diff --git a/services/gateway/tsconfig.json b/services/gateway/tsconfig.json index f7f47ecc..e59b3816 100644 --- a/services/gateway/tsconfig.json +++ b/services/gateway/tsconfig.json @@ -7,7 +7,7 @@ "esModuleInterop": true, "baseUrl": ".", "paths": { - "@order/*": ["src/*"] + "@gateway/*": ["src/*"] } }, "include": ["src/**/*.ts"], From 050d08a0f6d420a42ef71ffe12f128f6cfea6ca5 Mon Sep 17 00:00:00 2001 From: anatole Date: Wed, 2 Aug 2023 13:13:02 +0200 Subject: [PATCH 328/883] feat(gateway config): rename path --- services/order/tsconfig.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/order/tsconfig.json b/services/order/tsconfig.json index f7f47ecc..e59b3816 100644 --- a/services/order/tsconfig.json +++ b/services/order/tsconfig.json @@ -7,7 +7,7 @@ "esModuleInterop": true, "baseUrl": ".", "paths": { - "@order/*": ["src/*"] + "@gateway/*": ["src/*"] } }, "include": ["src/**/*.ts"], From da1c70d93b26ae31fb7035c8ddc5d791370d7e48 Mon Sep 17 00:00:00 2001 From: anatole Date: Wed, 2 Aug 2023 13:13:54 +0200 Subject: [PATCH 329/883] feat(gateway): rename packages --- .../gateway/src/controller/order/orderController.ts | 8 ++++---- services/gateway/src/controller/user/userController.ts | 6 +++--- .../clients/{order_client.ts => order.client.ts} | 0 services/gateway/src/services/clients/user.client.ts | 10 ++++++++++ services/gateway/src/services/clients/user_client.ts | 6 ------ .../src/services/{user_service.ts => user.service.ts} | 4 ++-- 6 files changed, 19 insertions(+), 15 deletions(-) rename services/gateway/src/services/clients/{order_client.ts => order.client.ts} (100%) create mode 100644 services/gateway/src/services/clients/user.client.ts delete mode 100644 services/gateway/src/services/clients/user_client.ts rename services/gateway/src/services/{user_service.ts => user.service.ts} (75%) diff --git a/services/gateway/src/controller/order/orderController.ts b/services/gateway/src/controller/order/orderController.ts index 6d9e4ca4..1ca0d4c2 100644 --- a/services/gateway/src/controller/order/orderController.ts +++ b/services/gateway/src/controller/order/orderController.ts @@ -1,4 +1,4 @@ -import orderService from '../../services/clients/order_client'; +import orderService from '../../services/clients/order.client'; import express, {Request, Response} from "express"; import { CreateOrderRequest, @@ -10,9 +10,9 @@ import { GetOrdersByUserRequest, UpdateOrderRequest, UserMinimum -} from "@order/proto/order_pb"; -import {getUser} from "@order/services/user_service"; -import {User} from "@order/proto/user_pb"; +} from "@gateway/proto/order_pb"; +import {getUser} from "@gateway/services/user.service"; +import {User} from "@gateway/proto/user_pb"; export const orderController = (app: express.Application) => { app.get('/api/order/:id', (req: Request, res: Response) => { diff --git a/services/gateway/src/controller/user/userController.ts b/services/gateway/src/controller/user/userController.ts index c3f89dc8..5d27c879 100644 --- a/services/gateway/src/controller/user/userController.ts +++ b/services/gateway/src/controller/user/userController.ts @@ -1,5 +1,5 @@ import express, {Request, Response} from 'express'; -import userServiceClient from '../../services/clients/user_client'; +import {userServiceClient} from '../../services/clients/user.client'; import { changePasswordInput, changeRoleInput, @@ -9,9 +9,9 @@ import { User, UserCreateInput, validateInput -} from "@order/proto/user_pb"; +} from "@gateway/proto/user_pb"; import {Empty} from "google-protobuf/google/protobuf/empty_pb"; -import {getUser} from "@order/services/user_service"; +import {getUser} from "@gateway/services/user.service"; export const userController = (app: express.Application) => { app.get('/api/user/:id', (req: Request, res: Response) => { diff --git a/services/gateway/src/services/clients/order_client.ts b/services/gateway/src/services/clients/order.client.ts similarity index 100% rename from services/gateway/src/services/clients/order_client.ts rename to services/gateway/src/services/clients/order.client.ts diff --git a/services/gateway/src/services/clients/user.client.ts b/services/gateway/src/services/clients/user.client.ts new file mode 100644 index 00000000..6b53adba --- /dev/null +++ b/services/gateway/src/services/clients/user.client.ts @@ -0,0 +1,10 @@ +import services from '../../proto/user_grpc_pb'; +import * as grpc from "grpc"; + +export const userServiceClient = new services.UserServiceClient( + 'http://localhost:50001', + grpc.credentials.createInsecure()); + +export const mainAddressServiceClient = new services.MainAddressServiceClient( + 'http://localhost:50001', + grpc.credentials.createInsecure()); \ No newline at end of file diff --git a/services/gateway/src/services/clients/user_client.ts b/services/gateway/src/services/clients/user_client.ts deleted file mode 100644 index 0f8db947..00000000 --- a/services/gateway/src/services/clients/user_client.ts +++ /dev/null @@ -1,6 +0,0 @@ -import services from '../../proto/user_grpc_pb'; -import * as grpc from "grpc"; - -export default new services.UserServiceClient( - 'http://localhost:50001', - grpc.credentials.createInsecure()); \ No newline at end of file diff --git a/services/gateway/src/services/user_service.ts b/services/gateway/src/services/user.service.ts similarity index 75% rename from services/gateway/src/services/user_service.ts rename to services/gateway/src/services/user.service.ts index 667bb9cc..06328da1 100644 --- a/services/gateway/src/services/user_service.ts +++ b/services/gateway/src/services/user.service.ts @@ -1,5 +1,5 @@ -import {User, UserId} from "@order/proto/user_pb"; -import userServiceClient from "@order/services/clients/user_client"; +import {User, UserId} from "@gateway/proto/user_pb"; +import {userServiceClient} from "@gateway/services/clients/user.client"; export const getUser = (id: number): User | undefined => { const userId = new UserId(); From 28eb49d181151a839d744694e4e0eece806f68e7 Mon Sep 17 00:00:00 2001 From: anatole Date: Wed, 2 Aug 2023 13:14:15 +0200 Subject: [PATCH 330/883] feat(gateway): add product controller --- .../controller/product/allergenController.ts | 65 +++++++++ .../controller/product/categoryController.ts | 65 +++++++++ .../controller/product/productController.ts | 131 ++++++++++++++++++ .../src/services/clients/product.client.ts | 15 ++ 4 files changed, 276 insertions(+) create mode 100644 services/gateway/src/controller/product/allergenController.ts create mode 100644 services/gateway/src/controller/product/categoryController.ts create mode 100644 services/gateway/src/controller/product/productController.ts create mode 100644 services/gateway/src/services/clients/product.client.ts diff --git a/services/gateway/src/controller/product/allergenController.ts b/services/gateway/src/controller/product/allergenController.ts new file mode 100644 index 00000000..7511087d --- /dev/null +++ b/services/gateway/src/controller/product/allergenController.ts @@ -0,0 +1,65 @@ +import express, {Request, Response} from 'express'; +import {allergenServiceClient} from '../../services/clients/product.client'; +import {Empty} from "google-protobuf/google/protobuf/empty_pb"; +import {Allergen, AllergenId} from "@gateway/proto/product_pb"; + +export const allergenController = (app: express.Application) => { + app.get('/api/allergen', (req: Request, res: Response) => { + allergenServiceClient.getAllergenList(new Empty(), (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } + }); + }); + + app.get('/api/allergen/:id', (req: Request, res: Response) => { + const {id} = req.params; + const allergenId = new AllergenId().setId(id) + + allergenServiceClient.readAllergen(allergenId, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } + }); + }); + + app.post('/api/allergen', (req: Request, res: Response) => { + const {label} = req.body; + const allergen = new Allergen().setLibelle(label); + allergenServiceClient.createAllergen(allergen, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } + }); + }); + + app.put('/api/allergen/:id', (req: Request, res: Response) => { + const {id} = req.params; + const {label, icon, hexaColor} = req.body; + const allergen = new Allergen().setId(id).setLibelle(label); + allergenServiceClient.updateAllergen(allergen, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } + }); + }); + + app.delete('/api/allergen/:id', (req: Request, res: Response) => { + const {id} = req.params; + allergenServiceClient.deleteAllergen(new AllergenId().setId(id), (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } + }); + }); +} \ No newline at end of file diff --git a/services/gateway/src/controller/product/categoryController.ts b/services/gateway/src/controller/product/categoryController.ts new file mode 100644 index 00000000..d7a0271c --- /dev/null +++ b/services/gateway/src/controller/product/categoryController.ts @@ -0,0 +1,65 @@ +import express, {Request, Response} from 'express'; +import {categoryServiceClient} from '../../services/clients/product.client'; +import {Empty} from "google-protobuf/google/protobuf/empty_pb"; +import {Category, CategoryId} from "@gateway/proto/product_pb"; + +export const categoryController = (app: express.Application) => { + app.get('/api/category', (req: Request, res: Response) => { + categoryServiceClient.getCategoryList(new Empty(), (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } + }); + }); + + app.get('/api/category/:id', (req: Request, res: Response) => { + const {id} = req.params; + const categoryId = new CategoryId().setId(id) + + categoryServiceClient.readCategory(categoryId, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } + }); + }); + + app.post('/api/category', (req: Request, res: Response) => { + const {label, icon, hexaColor} = req.body; + const category = new Category().setLibelle(label).setIcon(icon).setHexaColor(hexaColor) + categoryServiceClient.createCategory(category, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } + }); + }); + + app.put('/api/category/:id', (req: Request, res: Response) => { + const {id} = req.params; + const {label, icon, hexaColor} = req.body; + const category = new Category().setId(id).setLibelle(label).setIcon(icon).setHexaColor(hexaColor) + categoryServiceClient.updateCategory(category, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } + }); + }); + + app.delete('/api/category/:id', (req: Request, res: Response) => { + const {id} = req.params; + categoryServiceClient.deleteCategory(new CategoryId().setId(id), (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } + }); + }); +} \ No newline at end of file diff --git a/services/gateway/src/controller/product/productController.ts b/services/gateway/src/controller/product/productController.ts new file mode 100644 index 00000000..818a1057 --- /dev/null +++ b/services/gateway/src/controller/product/productController.ts @@ -0,0 +1,131 @@ +import express, {Request, Response} from 'express'; +import {productServiceClient} from '../../services/clients/product.client'; +import {Allergen, Category, File, Product, ProductId, RestaurantId} from '../../proto/product_pb'; +import {Empty} from "google-protobuf/google/protobuf/empty_pb"; +import * as fs from "fs"; + +export const productController = (app: express.Application) => { + app.get('/api/product/by-restaurant/:id', (req: Request, res: Response) => { + const {id} = req.params; + const restaurantId = new RestaurantId().setId(id) + + productServiceClient.getProductList(restaurantId, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } + }); + }); + + app.get('/api/product/:id', (req: Request, res: Response) => { + const {id} = req.params; + const productId = new ProductId().setId(id) + + productServiceClient.readProduct(productId, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } + }); + }); + + app.get('/api/product/type', (req: Request, res: Response) => { + productServiceClient.getProductTypeList(new Empty(), (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } + }); + }); + + app.delete('/api/product/:id', (req: Request, res: Response) => { + const {id} = req.params; + const productId = new ProductId().setId(id) + productServiceClient.deleteProduct(productId, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } + }); + }); + + app.post('/api/product', (req: Request, res: Response) => { + const {restaurantId, type, name, image, comment, price, preparation, weight, kilocalories, nutriscore, categories, allergens} = req.body; + + const allergensList = allergens.map((allergen: any) => new Allergen().setLibelle(allergen.label)); + const categoryList = categories.map((category: any) => new Category() + .setLibelle(category.label) + .setHexaColor(category.hexaColor) + .setIcon(category.icon)); + + const productId = new Product().setRestaurantId(Number(restaurantId)).setType(type) + .setName(name) + .setImage(image) + .setComment(comment) + .setPrice(price) + .setPreparation(preparation) + .setWeight(weight) + .setKilocalories(kilocalories) + .setNutriscore(nutriscore) + .setCategoriesList(categoryList) + .setAllergensList(allergensList); + + productServiceClient.createProduct(productId, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } + }); + }); + + app.put('/api/product/:id', (req: Request, res: Response) => { + const {id} = req.params + const {restaurantId, type, name, image, comment, price, preparation, weight, kilocalories, nutriscore, categories, allergens} = req.body; + + const allergensList = allergens.map((allergen: any) => new Allergen().setLibelle(allergen.label)); + const categoryList = categories.map((category: any) => new Category() + .setLibelle(category.label) + .setHexaColor(category.hexaColor) + .setIcon(category.icon)); + + const productId = new Product().setId(id).setRestaurantId(Number(restaurantId)).setType(type) + .setName(name) + .setImage(image) + .setComment(comment) + .setPrice(price) + .setPreparation(preparation) + .setWeight(weight) + .setKilocalories(kilocalories) + .setNutriscore(nutriscore) + .setCategoriesList(categoryList) + .setAllergensList(allergensList); + + productServiceClient.createProduct(productId, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } + }); + }); + + app.post('/api/product/image', (req: Request, res: Response) => { + const {input_file} = req.body; + var bitmap = fs.readFileSync(input_file); + var base64File = new Buffer(bitmap).toString('base64'); + + const file = new File().setName(input_file).setData(base64File); + productServiceClient.uploadImage(file, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } + }); + }); +} \ No newline at end of file diff --git a/services/gateway/src/services/clients/product.client.ts b/services/gateway/src/services/clients/product.client.ts new file mode 100644 index 00000000..7eb30f74 --- /dev/null +++ b/services/gateway/src/services/clients/product.client.ts @@ -0,0 +1,15 @@ +import * as grpc from "grpc"; +import {AllergenServiceClient, CategoryServiceClient, ProductServiceClient} from "@gateway/proto/product_grpc_pb"; + +// TODO: add order env +export const categoryServiceClient = new CategoryServiceClient( + 'http://localhost:50007', + grpc.credentials.createInsecure()); + +export const allergenServiceClient = new AllergenServiceClient( + 'http://localhost:50007', + grpc.credentials.createInsecure()); + +export const productServiceClient = new ProductServiceClient( + 'http://localhost:50007', + grpc.credentials.createInsecure()); \ No newline at end of file From f79b2d8c99b83fd5439b072d9c0f6f58f71489db Mon Sep 17 00:00:00 2001 From: anatole Date: Wed, 2 Aug 2023 13:14:25 +0200 Subject: [PATCH 331/883] feat(gateway): add metric controller --- .../src/controller/metric/metricController.ts | 32 +++++++++++++++++++ .../src/services/clients/metric.client.ts | 7 ++++ 2 files changed, 39 insertions(+) create mode 100644 services/gateway/src/controller/metric/metricController.ts create mode 100644 services/gateway/src/services/clients/metric.client.ts diff --git a/services/gateway/src/controller/metric/metricController.ts b/services/gateway/src/controller/metric/metricController.ts new file mode 100644 index 00000000..339d4955 --- /dev/null +++ b/services/gateway/src/controller/metric/metricController.ts @@ -0,0 +1,32 @@ +import metricService from '../../services/clients/metric.client'; +import express from "express"; +import {GetMetricRequest, Metric} from "@gateway/proto/metric_pb"; + +export const metricController = (app: express.Application) => { + app.get('/api/metric/:key', (req, res) => { + const {key} = req.params; + const metricInput = new GetMetricRequest().setKey(key); + metricService.getMetric(metricInput, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } + }); + }); + + + app.post('/api/metric', (req, res) => { + const {restaurantId, code, value, key} = req.body + const newMetric = new Metric().setKey(key).setRestaurantId(restaurantId).setCode(code).setValue(value) + + metricService.pushMetric(newMetric, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } + }); + }); +} + diff --git a/services/gateway/src/services/clients/metric.client.ts b/services/gateway/src/services/clients/metric.client.ts new file mode 100644 index 00000000..8a9232e5 --- /dev/null +++ b/services/gateway/src/services/clients/metric.client.ts @@ -0,0 +1,7 @@ +import services from '../../proto/metric_grpc_pb'; +import * as grpc from "grpc"; + +// TODO: add metric env +export default new services.ReportingServiceClient( + 'http://localhost:50007', + grpc.credentials.createInsecure()); \ No newline at end of file From 0bfe5ec5e0352e3f867aaa1fadeadb1c567bcf0b Mon Sep 17 00:00:00 2001 From: anatole Date: Wed, 2 Aug 2023 13:14:41 +0200 Subject: [PATCH 332/883] feat(gateway): add log controller --- .../src/controller/log/logController.ts | 29 +++++++++++++++++++ .../src/services/clients/log.client.ts | 7 +++++ 2 files changed, 36 insertions(+) create mode 100644 services/gateway/src/controller/log/logController.ts create mode 100644 services/gateway/src/services/clients/log.client.ts diff --git a/services/gateway/src/controller/log/logController.ts b/services/gateway/src/controller/log/logController.ts new file mode 100644 index 00000000..c9faf8d2 --- /dev/null +++ b/services/gateway/src/controller/log/logController.ts @@ -0,0 +1,29 @@ +import express from "express"; +import {logServiceClient} from "@gateway/services/clients/log.client"; +import {Empty} from "google-protobuf/google/protobuf/empty_pb"; +import {GetLogRequest} from "@gateway/proto/log_pb"; + +const logController = (app: express.Application) => { + app.get('/api/log', (req: express.Request, res: express.Response) => { + + logServiceClient.listLog(new Empty(), (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } + }); + }); + + app.get('/api/log/:id', (req: express.Request, res: express.Response) => { + const {id} = req.params + + logServiceClient.getLog(new GetLogRequest().setId(Number(id)), (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } + }); + }); +}; \ No newline at end of file diff --git a/services/gateway/src/services/clients/log.client.ts b/services/gateway/src/services/clients/log.client.ts new file mode 100644 index 00000000..5abe375e --- /dev/null +++ b/services/gateway/src/services/clients/log.client.ts @@ -0,0 +1,7 @@ +import services from '../../proto/log_grpc_pb'; +import * as grpc from "grpc"; + +// TODO: add log env +export const logServiceClient = new services.LogServiceClient( + 'http://localhost:50007', + grpc.credentials.createInsecure()); \ No newline at end of file From 4a443445105d25a5033e7df9fa1c7bdaf46cf002 Mon Sep 17 00:00:00 2001 From: anatole Date: Wed, 2 Aug 2023 13:15:05 +0200 Subject: [PATCH 333/883] feat(gateway): add new controller to the server.ts --- services/gateway/src/server.ts | 10 ++++++++-- services/gateway/src/utils/swagger.utils.js | 16 +++++++++------- 2 files changed, 17 insertions(+), 9 deletions(-) diff --git a/services/gateway/src/server.ts b/services/gateway/src/server.ts index 748358d8..1cb51b64 100644 --- a/services/gateway/src/server.ts +++ b/services/gateway/src/server.ts @@ -1,6 +1,9 @@ import {Request, Response} from "express"; -import {userController} from "@order/controller/user/userController"; -import {orderController} from "@order/controller/order/orderController"; +import {userController} from "@gateway/controller/user/userController"; +import {orderController} from "@gateway/controller/order/orderController"; +import {productController} from "@gateway/controller/product/productController"; +import {categoryController} from "@gateway/controller/product/categoryController"; +import {allergenController} from "@gateway/controller/product/allergenController"; const express = require('express'); const bodyParser = require('body-parser'); @@ -16,6 +19,9 @@ app.get('/', (req: Request, res: Response) => { userController(app); orderController(app); +categoryController(app); +allergenController(app); +productController(app); app.listen(PORT, () => { console.log(`API Gateway is running on port ${PORT}`); diff --git a/services/gateway/src/utils/swagger.utils.js b/services/gateway/src/utils/swagger.utils.js index 00b6a82d..b02415e2 100644 --- a/services/gateway/src/utils/swagger.utils.js +++ b/services/gateway/src/utils/swagger.utils.js @@ -1,15 +1,17 @@ -const swaggerAutogen = require('swagger-autogen')();userController +const swaggerAutogen = require('swagger-autogen')(); const doc = { - info: { - title: 'My API', - description: 'Description' - }, - host: 'localhost:3000' + info: { + title: 'My API', + description: 'Description' + }, + host: 'localhost:3000' }; const outputFile = './swagger-output.json'; -const routes = ['../controller/user/userController.ts']; +const routes = ['../controller/user/userController.ts', + '../controller/order/orderController.ts', + '../controller/product/productController.ts',]; /* NOTE: If you are using the express Router, you must pass in the 'routes' only the root file where the route starts, such as index.js, app.js, routes.js, etc ... */ From e4d0be029b401a9015a88b72582bd4e9e6aa8b47 Mon Sep 17 00:00:00 2001 From: anatole Date: Thu, 3 Aug 2023 17:12:24 +0200 Subject: [PATCH 334/883] feat(gateway): create the deliveryPersonController --- .../controller/delivery/deliveryController.ts | 92 +++++++++++++++++++ .../delivery/deliveryPersonController.ts | 88 ++++++++++++++++++ services/gateway/src/server.ts | 4 + .../src/services/clients/delivery.client.ts | 11 +++ 4 files changed, 195 insertions(+) create mode 100644 services/gateway/src/controller/delivery/deliveryController.ts create mode 100644 services/gateway/src/controller/delivery/deliveryPersonController.ts create mode 100644 services/gateway/src/services/clients/delivery.client.ts diff --git a/services/gateway/src/controller/delivery/deliveryController.ts b/services/gateway/src/controller/delivery/deliveryController.ts new file mode 100644 index 00000000..e5d90308 --- /dev/null +++ b/services/gateway/src/controller/delivery/deliveryController.ts @@ -0,0 +1,92 @@ +import {Application, Request, Response} from "express"; +import {deliveryServiceClient} from "@gateway/services/clients/delivery.client"; +import {Delivery, DeliveryCreateInput, DeliveryId, RestaurantId, UserId} from "@gateway/proto/delivery_pb"; + +export const deliveryController = (app: Application) => { + app.get('/api/delivery/:id', (req: Request, res: Response) => { + const {id} = req.params; + + deliveryServiceClient.getDelivery(new DeliveryId().setId(id), (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } + }); + }); + + app.get('/api/delivery/by-restaurant/:id', (req: Request, res: Response) => { + const {id} = req.params; + const restaurantId = new RestaurantId().setId(id); + + deliveryServiceClient.listDeliveriesByRestaurant(restaurantId, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } + }); + }); + + app.get('/api/delivery/by-user/:id', (req: Request, res: Response) => { + const {id} = req.params; + const userId = new UserId().setId(id); + + deliveryServiceClient.listDeliveriesByUser(userId, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } + }); + }); + + app.post('/api/delivery', (req: Request, res: Response) => { + const {eta, address, status, deliveryPersonId, userId, restaurantId} = req.body; + const deliveryCreateInput = new DeliveryCreateInput().setEta(eta) + .setAddress(address) + .setStatus(status) + .setDeliveryPersonId(deliveryPersonId) + .setUserId(userId) + .setRestaurantId(restaurantId); + + deliveryServiceClient.createDelivery(deliveryCreateInput, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } + }); + }); + + app.put('/api/delivery/:id', (req: Request, res: Response) => { + const {id} = req.params; + const {eta, address, status, deliveryPersonId, userId, restaurantId} = req.body; + const delivery = new Delivery().setId(id).setEta(eta) + .setAddress(address) + .setStatus(status) + .setDeliveryPersonId(deliveryPersonId) + .setUserId(userId) + .setRestaurantId(restaurantId); + + deliveryServiceClient.updateDelivery(delivery, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } + }); + }); + + app.delete('/api/delivery/:id', (req: Request, res: Response) => { + const {id} = req.params; + + deliveryServiceClient.deleteDelivery(new DeliveryId().setId(id), (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } + }); + }); +} \ No newline at end of file diff --git a/services/gateway/src/controller/delivery/deliveryPersonController.ts b/services/gateway/src/controller/delivery/deliveryPersonController.ts new file mode 100644 index 00000000..8ab0c64f --- /dev/null +++ b/services/gateway/src/controller/delivery/deliveryPersonController.ts @@ -0,0 +1,88 @@ +import {Application} from "express"; +import {deliveryPersonServiceClient} from "@gateway/services/clients/delivery.client"; +import {DeliveryPerson, DeliveryPersonCreateInput, DeliveryPersonId, Location} from "@gateway/proto/delivery_pb"; +import {Empty} from "google-protobuf/google/protobuf/empty_pb"; + +export const deliveryPersonController = (app: Application) => { + app.get('/api/delivery-person/:id', (req, res) => { + const {id} = req.params; + + deliveryPersonServiceClient.getDeliveryPerson(new DeliveryPersonId().setId(id), (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } + }); + }); + + app.get('/api/delivery-person', (req, res) => { + deliveryPersonServiceClient.listDeliveryPersons(new Empty(), (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } + }); + }); + + app.post('/api/delivery-person', (req, res) => { + const {lat, lng} = req.body; + const location = new Location() + .setLatitude(lat) + .setLongitude(lng); + deliveryPersonServiceClient.listNearDeliveryPersons(location, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } + }); + }); + + app.post('/api/delivery-person', (req, res) => { + const {firstName, lastName, phone, locationList} = req.body; + const deliveryPerson = new DeliveryPersonCreateInput() + .setFirstName(firstName) + .setLastName(lastName) + .setPhone(phone) + .setLocationList(locationList); + deliveryPersonServiceClient.createDeliveryPerson(deliveryPerson, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } + }); + }); + + app.put('/api/delivery-person/:id', (req, res) => { + const {id} = req.params; + const {firstName, lastName, phone, locationList} = req.body; + const deliveryPerson = new DeliveryPerson().setId(id) + .setFirstName(firstName) + .setLastName(lastName) + .setPhone(phone) + .setLocationList(locationList); + + deliveryPersonServiceClient.updateDeliveryPerson(deliveryPerson, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } + }); + }); + + app.delete('/api/delivery-person/:id', (req, res) => { + const {id} = req.params; + + deliveryPersonServiceClient.deleteDeliveryPerson(new DeliveryPersonId().setId(id), (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } + }); + }); +} \ No newline at end of file diff --git a/services/gateway/src/server.ts b/services/gateway/src/server.ts index 1cb51b64..b3e2d635 100644 --- a/services/gateway/src/server.ts +++ b/services/gateway/src/server.ts @@ -4,6 +4,8 @@ import {orderController} from "@gateway/controller/order/orderController"; import {productController} from "@gateway/controller/product/productController"; import {categoryController} from "@gateway/controller/product/categoryController"; import {allergenController} from "@gateway/controller/product/allergenController"; +import {deliveryController} from "@gateway/controller/delivery/deliveryController"; +import {deliveryPersonController} from "@gateway/controller/delivery/deliveryPersonController"; const express = require('express'); const bodyParser = require('body-parser'); @@ -22,6 +24,8 @@ orderController(app); categoryController(app); allergenController(app); productController(app); +deliveryController(app); +deliveryPersonController(app); app.listen(PORT, () => { console.log(`API Gateway is running on port ${PORT}`); diff --git a/services/gateway/src/services/clients/delivery.client.ts b/services/gateway/src/services/clients/delivery.client.ts new file mode 100644 index 00000000..6ec48147 --- /dev/null +++ b/services/gateway/src/services/clients/delivery.client.ts @@ -0,0 +1,11 @@ +import services from '../../proto/delivery_grpc_pb'; +import * as grpc from "grpc"; + +// TODO: add delivery env +export const deliveryServiceClient = new services.DeliveryServiceClient( + 'http://localhost:50007', + grpc.credentials.createInsecure()); + +export const deliveryPersonServiceClient = new services.DeliveryPersonServiceClient( + 'http://localhost:50007', + grpc.credentials.createInsecure()); \ No newline at end of file From a3fb8f9fe5abe842929f53f35ab62c1335f3d819 Mon Sep 17 00:00:00 2001 From: anatole Date: Thu, 3 Aug 2023 17:33:42 +0200 Subject: [PATCH 335/883] feat(gateway): rename controller files --- ...eliveryController.ts => delivery.controller.ts} | 0 ...nController.ts => deliveryPerson.controller.ts} | 0 .../log/{logController.ts => log.controller.ts} | 0 .../{metricController.ts => metric.controller.ts} | 0 .../{orderController.ts => order.controller.ts} | 0 ...llergenController.ts => allergen.controller.ts} | 0 ...ategoryController.ts => category.controller.ts} | 0 ...{productController.ts => product.controller.ts} | 0 .../user/{userController.ts => user.controller.ts} | 0 services/gateway/src/server.ts | 14 +++++++------- 10 files changed, 7 insertions(+), 7 deletions(-) rename services/gateway/src/controller/delivery/{deliveryController.ts => delivery.controller.ts} (100%) rename services/gateway/src/controller/delivery/{deliveryPersonController.ts => deliveryPerson.controller.ts} (100%) rename services/gateway/src/controller/log/{logController.ts => log.controller.ts} (100%) rename services/gateway/src/controller/metric/{metricController.ts => metric.controller.ts} (100%) rename services/gateway/src/controller/order/{orderController.ts => order.controller.ts} (100%) rename services/gateway/src/controller/product/{allergenController.ts => allergen.controller.ts} (100%) rename services/gateway/src/controller/product/{categoryController.ts => category.controller.ts} (100%) rename services/gateway/src/controller/product/{productController.ts => product.controller.ts} (100%) rename services/gateway/src/controller/user/{userController.ts => user.controller.ts} (100%) diff --git a/services/gateway/src/controller/delivery/deliveryController.ts b/services/gateway/src/controller/delivery/delivery.controller.ts similarity index 100% rename from services/gateway/src/controller/delivery/deliveryController.ts rename to services/gateway/src/controller/delivery/delivery.controller.ts diff --git a/services/gateway/src/controller/delivery/deliveryPersonController.ts b/services/gateway/src/controller/delivery/deliveryPerson.controller.ts similarity index 100% rename from services/gateway/src/controller/delivery/deliveryPersonController.ts rename to services/gateway/src/controller/delivery/deliveryPerson.controller.ts diff --git a/services/gateway/src/controller/log/logController.ts b/services/gateway/src/controller/log/log.controller.ts similarity index 100% rename from services/gateway/src/controller/log/logController.ts rename to services/gateway/src/controller/log/log.controller.ts diff --git a/services/gateway/src/controller/metric/metricController.ts b/services/gateway/src/controller/metric/metric.controller.ts similarity index 100% rename from services/gateway/src/controller/metric/metricController.ts rename to services/gateway/src/controller/metric/metric.controller.ts diff --git a/services/gateway/src/controller/order/orderController.ts b/services/gateway/src/controller/order/order.controller.ts similarity index 100% rename from services/gateway/src/controller/order/orderController.ts rename to services/gateway/src/controller/order/order.controller.ts diff --git a/services/gateway/src/controller/product/allergenController.ts b/services/gateway/src/controller/product/allergen.controller.ts similarity index 100% rename from services/gateway/src/controller/product/allergenController.ts rename to services/gateway/src/controller/product/allergen.controller.ts diff --git a/services/gateway/src/controller/product/categoryController.ts b/services/gateway/src/controller/product/category.controller.ts similarity index 100% rename from services/gateway/src/controller/product/categoryController.ts rename to services/gateway/src/controller/product/category.controller.ts diff --git a/services/gateway/src/controller/product/productController.ts b/services/gateway/src/controller/product/product.controller.ts similarity index 100% rename from services/gateway/src/controller/product/productController.ts rename to services/gateway/src/controller/product/product.controller.ts diff --git a/services/gateway/src/controller/user/userController.ts b/services/gateway/src/controller/user/user.controller.ts similarity index 100% rename from services/gateway/src/controller/user/userController.ts rename to services/gateway/src/controller/user/user.controller.ts diff --git a/services/gateway/src/server.ts b/services/gateway/src/server.ts index b3e2d635..534739d1 100644 --- a/services/gateway/src/server.ts +++ b/services/gateway/src/server.ts @@ -1,11 +1,11 @@ import {Request, Response} from "express"; -import {userController} from "@gateway/controller/user/userController"; -import {orderController} from "@gateway/controller/order/orderController"; -import {productController} from "@gateway/controller/product/productController"; -import {categoryController} from "@gateway/controller/product/categoryController"; -import {allergenController} from "@gateway/controller/product/allergenController"; -import {deliveryController} from "@gateway/controller/delivery/deliveryController"; -import {deliveryPersonController} from "@gateway/controller/delivery/deliveryPersonController"; +import {userController} from "@gateway/controller/user/user.controller"; +import {orderController} from "@gateway/controller/order/order.controller"; +import {productController} from "@gateway/controller/product/product.controller"; +import {categoryController} from "@gateway/controller/product/category.controller"; +import {allergenController} from "@gateway/controller/product/allergen.controller"; +import {deliveryController} from "@gateway/controller/delivery/delivery.controller"; +import {deliveryPersonController} from "@gateway/controller/delivery/deliveryPerson.controller"; const express = require('express'); const bodyParser = require('body-parser'); From 17d5420b40b2cfbf5f041dfd19c5491c15b3df75 Mon Sep 17 00:00:00 2001 From: anatole Date: Thu, 3 Aug 2023 18:07:19 +0200 Subject: [PATCH 336/883] feat(gateway): create the promotions controller --- .../promotions/promotions.controller.ts | 82 +++++++++++++++++++ services/gateway/src/server.ts | 2 + .../src/services/clients/promotions.client.ts | 7 ++ 3 files changed, 91 insertions(+) create mode 100644 services/gateway/src/controller/promotions/promotions.controller.ts create mode 100644 services/gateway/src/services/clients/promotions.client.ts diff --git a/services/gateway/src/controller/promotions/promotions.controller.ts b/services/gateway/src/controller/promotions/promotions.controller.ts new file mode 100644 index 00000000..e763d90b --- /dev/null +++ b/services/gateway/src/controller/promotions/promotions.controller.ts @@ -0,0 +1,82 @@ +import {Application} from "express"; +import {promotionsServiceClient} from "@gateway/services/clients/promotions.client"; +import {Empty} from "google-protobuf/google/protobuf/empty_pb"; +import {Promotion, PromotionCode, PromotionCreateInput, PromotionId, RestaurantId} from "@gateway/proto/promotions_pb"; + +export const promotionsController = (app: Application) => { + app.get('/api/promotions/:code', (req, res) => { + const {code} = req.params; + promotionsServiceClient.getPromotion(new PromotionCode().setCode(code), (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } + }); + }); + + app.get('/api/promotions', (req, res) => { + promotionsServiceClient.getPromotions(new Empty(), (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } + }); + }); + + app.get('/api/promotions/by-restaurant/:restaurantId', (req, res) => { + const {restaurantId} = req.params; + promotionsServiceClient.getPromotionsByRestaurant(new RestaurantId().setId(restaurantId), (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } + }); + }); + + app.post('/api/promotions', (req, res) => { + const {code, reduction, method, restaurantId} = req.body; + const promotionCreateInput = new PromotionCreateInput().setCode(code) + .setReduction(reduction) + .setMethod(method) + .setRestaurantId(restaurantId); + promotionsServiceClient.createPromotion(promotionCreateInput, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } + }); + }); + + app.put('/api/promotions/:id', (req, res) => { + const {id} = req.params; + const {code, reduction, method, restaurantId} = req.body; + const promotionUpdateInput = new Promotion().setId(id).setCode(code) + .setReduction(reduction) + .setMethod(method) + .setRestaurantId(restaurantId); + + promotionsServiceClient.createPromotion(promotionUpdateInput, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } + }); + }); + + app.delete('/api/promotions/:id', (req, res) => { + const {id} = req.params; + + promotionsServiceClient.deletePromotion(new PromotionId().setId(id), (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } + }); + }); +}; \ No newline at end of file diff --git a/services/gateway/src/server.ts b/services/gateway/src/server.ts index 534739d1..43acc000 100644 --- a/services/gateway/src/server.ts +++ b/services/gateway/src/server.ts @@ -6,6 +6,7 @@ import {categoryController} from "@gateway/controller/product/category.controlle import {allergenController} from "@gateway/controller/product/allergen.controller"; import {deliveryController} from "@gateway/controller/delivery/delivery.controller"; import {deliveryPersonController} from "@gateway/controller/delivery/deliveryPerson.controller"; +import {promotionsController} from "@gateway/controller/promotions/promotions.controller"; const express = require('express'); const bodyParser = require('body-parser'); @@ -26,6 +27,7 @@ allergenController(app); productController(app); deliveryController(app); deliveryPersonController(app); +promotionsController(app); app.listen(PORT, () => { console.log(`API Gateway is running on port ${PORT}`); diff --git a/services/gateway/src/services/clients/promotions.client.ts b/services/gateway/src/services/clients/promotions.client.ts new file mode 100644 index 00000000..063781eb --- /dev/null +++ b/services/gateway/src/services/clients/promotions.client.ts @@ -0,0 +1,7 @@ +import services from '../../proto/promotions_grpc_pb'; +import * as grpc from "grpc"; + +// TODO: add promotions env +export const promotionsServiceClient = new services.PromotionServiceClient( + 'http://localhost:50007', + grpc.credentials.createInsecure()); \ No newline at end of file From 62bdf933b5fa7643a528156aa2c885a426702fe9 Mon Sep 17 00:00:00 2001 From: Florian LEROUX Date: Fri, 4 Aug 2023 10:43:15 +0200 Subject: [PATCH 337/883] git: ignore expo cache files --- .gitignore | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.gitignore b/.gitignore index 51fc7c5f..bfed1079 100644 --- a/.gitignore +++ b/.gitignore @@ -76,3 +76,7 @@ terraform.rc /services/reporting/**/bin /services/reporting/**/obj /services/reporting/**/.vs + + +# expo cache files +/apps/mobile/.expo \ No newline at end of file From c75d9e9f5862592431354f9c1941fb74be728666 Mon Sep 17 00:00:00 2001 From: Florian LEROUX Date: Fri, 4 Aug 2023 12:02:03 +0200 Subject: [PATCH 338/883] feat(payment): init microservice --- README.md | 28 +- services/payment/.dockerignore | 2 + services/payment/.env.example | 4 + services/payment/.gitignore | 5 + services/payment/.nvmrc | 1 + services/payment/Dockerfile | 38 + services/payment/README.md | 50 + services/payment/generate_grpc_reflection.sh | 15 + services/payment/k8s/configmap.yml | 8 + services/payment/k8s/deployment.yml | 31 + services/payment/k8s/hpa.yml | 18 + services/payment/k8s/ingress.yml | 17 + services/payment/k8s/service.yml | 13 + services/payment/package.json | 55 + services/payment/pnpm-lock.yaml | 2271 +++++++++++++++++ .../20230804092434_init/migration.sql | 26 + .../prisma/migrations/migration_lock.toml | 3 + services/payment/prisma/schema.prisma | 35 + services/payment/prisma/seed.ts | 82 + services/payment/proto | 1 + services/payment/reflection_descriptor.bin | Bin 0 -> 2262 bytes services/payment/src/handlers/.gitinclude | 0 .../payment/src/handlers/payment/create.ts | 31 + .../payment/src/handlers/payment/get-user.ts | 24 + services/payment/src/handlers/payment/get.ts | 21 + .../payment/src/handlers/payment/index.ts | 15 + .../payment/src/handlers/payment/update.ts | 23 + services/payment/src/lib/amqp.ts | 32 + services/payment/src/lib/log.ts | 74 + services/payment/src/lib/prisma.ts | 29 + services/payment/src/lib/proxy.ts | 132 + services/payment/src/lib/reflection.ts | 23 + services/payment/src/lib/struct.ts | 53 + services/payment/src/middleware/log.ts | 42 + .../payment/src/resources/grpc-credentials.ts | 5 + .../src/resources/protoloader-options.ts | 7 + services/payment/src/server.ts | 43 + services/payment/src/types/index.d.ts | 3 + services/payment/src/types/payment.d.ts | 44 + services/payment/terraform/data.tf | 17 + .../terraform/env/dev-backend.tfvars.example | 4 + .../payment/terraform/env/dev.tfvars.example | 1 + services/payment/terraform/main.tf | 74 + services/payment/terraform/outputs.tf | 6 + services/payment/terraform/variables.tf | 16 + services/payment/tsconfig.json | 18 + services/payment/vitest.config.ts | 10 + services/proto/payment.proto | 56 + 48 files changed, 3492 insertions(+), 14 deletions(-) create mode 100644 services/payment/.dockerignore create mode 100644 services/payment/.env.example create mode 100644 services/payment/.gitignore create mode 100644 services/payment/.nvmrc create mode 100644 services/payment/Dockerfile create mode 100644 services/payment/README.md create mode 100755 services/payment/generate_grpc_reflection.sh create mode 100644 services/payment/k8s/configmap.yml create mode 100644 services/payment/k8s/deployment.yml create mode 100644 services/payment/k8s/hpa.yml create mode 100644 services/payment/k8s/ingress.yml create mode 100644 services/payment/k8s/service.yml create mode 100644 services/payment/package.json create mode 100644 services/payment/pnpm-lock.yaml create mode 100644 services/payment/prisma/migrations/20230804092434_init/migration.sql create mode 100644 services/payment/prisma/migrations/migration_lock.toml create mode 100644 services/payment/prisma/schema.prisma create mode 100644 services/payment/prisma/seed.ts create mode 120000 services/payment/proto create mode 100644 services/payment/reflection_descriptor.bin create mode 100644 services/payment/src/handlers/.gitinclude create mode 100644 services/payment/src/handlers/payment/create.ts create mode 100644 services/payment/src/handlers/payment/get-user.ts create mode 100644 services/payment/src/handlers/payment/get.ts create mode 100644 services/payment/src/handlers/payment/index.ts create mode 100644 services/payment/src/handlers/payment/update.ts create mode 100644 services/payment/src/lib/amqp.ts create mode 100644 services/payment/src/lib/log.ts create mode 100644 services/payment/src/lib/prisma.ts create mode 100644 services/payment/src/lib/proxy.ts create mode 100644 services/payment/src/lib/reflection.ts create mode 100644 services/payment/src/lib/struct.ts create mode 100644 services/payment/src/middleware/log.ts create mode 100644 services/payment/src/resources/grpc-credentials.ts create mode 100644 services/payment/src/resources/protoloader-options.ts create mode 100644 services/payment/src/server.ts create mode 100644 services/payment/src/types/index.d.ts create mode 100644 services/payment/src/types/payment.d.ts create mode 100644 services/payment/terraform/data.tf create mode 100644 services/payment/terraform/env/dev-backend.tfvars.example create mode 100644 services/payment/terraform/env/dev.tfvars.example create mode 100644 services/payment/terraform/main.tf create mode 100644 services/payment/terraform/outputs.tf create mode 100644 services/payment/terraform/variables.tf create mode 100644 services/payment/tsconfig.json create mode 100644 services/payment/vitest.config.ts create mode 100644 services/proto/payment.proto diff --git a/README.md b/README.md index a405370d..18f49ea8 100644 --- a/README.md +++ b/README.md @@ -10,20 +10,20 @@ The GoodFood 2.0 project was initiated to update the existing ordering applicati ## Microservices ports -| Service | Port | Language | Database | Status | Assignee | -| ----------- | ----- | ----------- | ---------- | ------ | --------------- | -| Gateway | 50000 | Go | ❌ | ❌ | @Anatole-Godard | -| User (auth) | 50001 | Go | PostgreSQL | ❌ | @Anatole-Godard | -| Basket | 50002 | NodeJS (ts) | Redis | ❌ | @Anatole-Godard | -| Payment | 50003 | NodeJS (ts) | PostgreSQL | ❌ | @Anatole-Godard | -| Product | 50004 | NodeJS (ts) | PostgreSQL | ❌ | @PierreLbg | -| Restaurant | 50005 | NodeJS (ts) | PostgreSQL | ❌ | @PierreLbg | -| Promotion | 50006 | NodeJS (ts) | PostgreSQL | ❌ | @PierreLbg | -| Order | 50007 | NodeJS (ts) | PostgreSQL | ✅ | @floriaaan | -| Delivery | 50008 | NodeJS (ts) | PostgreSQL | ⚠️ | @floriaaan | -| Stock | 50009 | NodeJS (ts) | PostgreSQL | ❌ | @floriaaan | -| Reporting | 50020 | C# (dotnet) | PostgreSQL | ❌ | @floriaaan | -| Log | 50021 | Go | PostgreSQL | ✅ | @floriaaan | +| Service | Port | Language | Database | Status | Assignee | +| ----------- | ----- | ----------- | ---------- | ------ | ---------------------------- | +| Gateway | 50000 | Go | ❌ | ❌ | @Anatole-Godard | +| User (auth) | 50001 | Go | PostgreSQL | ❌ | @Anatole-Godard | +| Basket | 50002 | NodeJS (ts) | Redis | ❌ | @Anatole-Godard | +| Payment | 50003 | NodeJS (ts) | PostgreSQL | ❌ | @Anatole-Godard & @floriaaan | +| Product | 50004 | NodeJS (ts) | PostgreSQL | ❌ | @PierreLbg | +| Restaurant | 50005 | NodeJS (ts) | PostgreSQL | ❌ | @PierreLbg | +| Promotion | 50006 | NodeJS (ts) | PostgreSQL | ❌ | @PierreLbg | +| Order | 50007 | NodeJS (ts) | PostgreSQL | ✅ | @floriaaan | +| Delivery | 50008 | NodeJS (ts) | PostgreSQL | ⚠️ | @floriaaan | +| Stock | 50009 | NodeJS (ts) | PostgreSQL | ❌ | @floriaaan | +| Reporting | 50020 | C# (dotnet) | PostgreSQL | ❌ | @floriaaan | +| Log | 50021 | Go | PostgreSQL | ✅ | @floriaaan | | (...) | (...) | (...) | (...) | (...) | ## File Hierarchy diff --git a/services/payment/.dockerignore b/services/payment/.dockerignore new file mode 100644 index 00000000..b7dab5e9 --- /dev/null +++ b/services/payment/.dockerignore @@ -0,0 +1,2 @@ +node_modules +build \ No newline at end of file diff --git a/services/payment/.env.example b/services/payment/.env.example new file mode 100644 index 00000000..fe2eb7b2 --- /dev/null +++ b/services/payment/.env.example @@ -0,0 +1,4 @@ +DATABASE_URL=postgres://postgres:password@localhost:5432/postgres +AMQP_URL=amqp://guest:guest@localhost + +PORT=50003 \ No newline at end of file diff --git a/services/payment/.gitignore b/services/payment/.gitignore new file mode 100644 index 00000000..583204b4 --- /dev/null +++ b/services/payment/.gitignore @@ -0,0 +1,5 @@ +node_modules/ +dist/ +bin/ +*.env* +!*.env.example diff --git a/services/payment/.nvmrc b/services/payment/.nvmrc new file mode 100644 index 00000000..9dfef472 --- /dev/null +++ b/services/payment/.nvmrc @@ -0,0 +1 @@ +v18.12.0 diff --git a/services/payment/Dockerfile b/services/payment/Dockerfile new file mode 100644 index 00000000..f2451ca0 --- /dev/null +++ b/services/payment/Dockerfile @@ -0,0 +1,38 @@ +FROM node:18-alpine3.17 as builder + +# Set working directory +WORKDIR /app + +# Copy the application code +COPY ./payment/ . + +# Install dependencies +RUN npm install + +# Copy the proto files +COPY ./proto ./proto/ + +# Generate Prisma client +RUN npx prisma generate + +# Build the application +RUN npm run build + + +# Create a new image with the application +FROM node:18-alpine3.17 as runner + +# Set working directory +WORKDIR /app + +# Copy the application package +COPY --from=builder /app/dist . +COPY --from=builder /app/prisma/ . +COPY --from=builder /app/proto/ /proto/ +COPY --from=builder /app/node_modules/.prisma /.prisma + +# Expose the gRPC port +EXPOSE 50003 + +# Start the server +CMD [ "node", "index.js"] diff --git a/services/payment/README.md b/services/payment/README.md new file mode 100644 index 00000000..b90eb1d2 --- /dev/null +++ b/services/payment/README.md @@ -0,0 +1,50 @@ +# Payment Microservice + +| Informations | +| -------------------------------------------------- | +| **Port:** 50003 | +| **Developer:** @Anatole-Godard & @floriaaan | +| **Status:** In progress | +| **Last update:** 2023-08-04 | +| **Language:** NodeJS | +| **Dependencies:** TypeScript, gRPC, Postgres, AMQP | + +## gRPC Methods + +The service provides the following gRPC methods: + +## Requirements + +To run this microservice, you will need to have the following installed on your system: + +- NodeJS (v18.12.0 or higher) (dev. with v18.12.0) +- Postgres (v15.2 or higher) (dev. with docker image `postgres:15.2`) + +You can use the following tools to help you with the setup: + +- You can use nvm to set your Node version using: + - `nvm use`. +- You can use docker to run your Postgres database using: + - `docker run --name postgres -p 5432:5432 -e POSTGRES_PASSWORD=password -d postgres` +- You can use docker to run your RabbitMQ server using: + - `docker run --name rabbitmq -p 5672:5672 -p 15672:15672 -d rabbitmq:3-management` + +## Getting started + +### 1. Clone the repository and install dependencies + +1. Clone the `goodfood` repository to your local machine. +2. Navigate to the service directory (`services/payment`) in your terminal. +3. Run `npm install` to install the necessary dependencies. +4. Create a `.env` file at the root of the project directory and add the environment variables values (see `.env.example`). +5. Run `npm run start` to start the microservice. + +You can now access the microservice at `http://localhost:50003`. + +NB: If you want to run the microservice in development mode, you can run `npm run dev` instead. + +## Testing + +### Requests examples + +**Install `grpcurl` on your machine.** diff --git a/services/payment/generate_grpc_reflection.sh b/services/payment/generate_grpc_reflection.sh new file mode 100755 index 00000000..34a10e1d --- /dev/null +++ b/services/payment/generate_grpc_reflection.sh @@ -0,0 +1,15 @@ +#!/usr/bin/env bash + +# bash list of proto files ([payment.proto]) + + +IN_DIR="$(pwd)/../proto" +OUT_DIR="." +PROTOC="$(npm bin)/grpc_tools_node_protoc" + +# Generate reflection descriptor +$PROTOC \ + -I $IN_DIR \ + $IN_DIR/payment.proto \ + --descriptor_set_out=$OUT_DIR/reflection_descriptor.bin \ + \ No newline at end of file diff --git a/services/payment/k8s/configmap.yml b/services/payment/k8s/configmap.yml new file mode 100644 index 00000000..e5f407b5 --- /dev/null +++ b/services/payment/k8s/configmap.yml @@ -0,0 +1,8 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: goodfood-payment-configmap + labels: + app: goodfood-payment +data: + port: "50003" \ No newline at end of file diff --git a/services/payment/k8s/deployment.yml b/services/payment/k8s/deployment.yml new file mode 100644 index 00000000..6f6438e2 --- /dev/null +++ b/services/payment/k8s/deployment.yml @@ -0,0 +1,31 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: goodfood-payment + labels: + app: goodfood-payment +spec: + selector: + matchLabels: + app: goodfood-payment + template: + metadata: + labels: + app: goodfood-payment + spec: + containers: + - name: goodfood-payment + image: floriaaan/goodfood-payment:1.0.0 + imagePullPolicy: Always + resources: + limits: + memory: "128Mi" + cpu: "200m" + env: + - name: PORT + valueFrom: + configMapKeyRef: + name: goodfood-payment-configmap + key: port + ports: + - containerPort: 50003 diff --git a/services/payment/k8s/hpa.yml b/services/payment/k8s/hpa.yml new file mode 100644 index 00000000..f27155c1 --- /dev/null +++ b/services/payment/k8s/hpa.yml @@ -0,0 +1,18 @@ +apiVersion: autoscaling/v2 +kind: HorizontalPodAutoscaler +metadata: + name: goodfood-payment-hpa +spec: + scaleTargetRef: + apiVersion: apps/v1 + kind: Deployment + name: goodfood-payment + minReplicas: 1 + maxReplicas: 3 + metrics: + - type: Resource + resource: + name: cpu + target: + type: Utilization + averageUtilization: 50 diff --git a/services/payment/k8s/ingress.yml b/services/payment/k8s/ingress.yml new file mode 100644 index 00000000..37555a66 --- /dev/null +++ b/services/payment/k8s/ingress.yml @@ -0,0 +1,17 @@ +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + name: goodfood-payment +spec: + ingressClassName: nginx + rules: + - host: payment.localdev.me + http: + paths: + - pathType: Prefix + backend: + service: + name: goodfood-payment + port: + number: 50003 + path: / \ No newline at end of file diff --git a/services/payment/k8s/service.yml b/services/payment/k8s/service.yml new file mode 100644 index 00000000..ea86b40e --- /dev/null +++ b/services/payment/k8s/service.yml @@ -0,0 +1,13 @@ +apiVersion: v1 +kind: Service +metadata: + name: goodfood-payment +spec: + selector: + app: goodfood-payment + ports: + - name: "grpc" + port: 50003 + targetPort: 50003 +status: + loadBalancer: {} diff --git a/services/payment/package.json b/services/payment/package.json new file mode 100644 index 00000000..dec0bacc --- /dev/null +++ b/services/payment/package.json @@ -0,0 +1,55 @@ +{ + "name": "@goodfood/order", + "bin": "dist/index.js", + "scripts": { + "start": "node dist/index.js", + "dev": "nodemon --watch 'src/**/*.ts' --exec 'ts-node' src/server.ts", + "build": "esbuild src/server.ts --bundle --platform=node --target=node18 --outfile=dist/index.js", + "test": "vitest", + "coverage": "vitest --coverage", + "pkg": "pkg .", + "prisma:generate": "prisma generate", + "seed": "ts-node prisma/seed.ts", + "grpc:reflection": "./generate_grpc_reflection.sh", + "postinstall": "npm run prisma:generate" + }, + "dependencies": { + "@grpc/grpc-js": "1.8.14", + "@grpc/proto-loader": "0.7.6", + "@prisma/client": "5.1.1", + "amqplib": "^0.10.3", + "dotenv": "^16.0.3", + "grpc-server-reflection": "^0.1.5", + "protobufjs": "7.2.2" + }, + "devDependencies": { + "@types/amqplib": "^0.10.1", + "@types/node": "18.15.9", + "esbuild": "^0.17.18", + "grpc-tools": "^1.12.4", + "nodemon": "^2.0.22", + "pkg": "^5.8.1", + "prisma": "5.1.1", + "ts-node": "10.9.1", + "tsconfig-paths": "^4.2.0", + "typescript": "5.0.2", + "vite-tsconfig-paths": "^4.2.0", + "vitest": "^0.29.8" + }, + "prisma": { + "seed": "ts-node prisma/seed.ts" + }, + "pkg": { + "scripts": "./src/dist/index.js", + "assets": [ + "./prisma/**/*", + "../proto/**/*" + ], + "targets": [ + "node18-macos-arm64", + "node18-linux-x64", + "node18-linux-arm64" + ], + "outputPath": "bin/" + } +} diff --git a/services/payment/pnpm-lock.yaml b/services/payment/pnpm-lock.yaml new file mode 100644 index 00000000..87352acc --- /dev/null +++ b/services/payment/pnpm-lock.yaml @@ -0,0 +1,2271 @@ +lockfileVersion: '6.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +dependencies: + '@grpc/grpc-js': + specifier: 1.8.14 + version: 1.8.14 + '@grpc/proto-loader': + specifier: 0.7.6 + version: 0.7.6 + '@prisma/client': + specifier: 5.1.1 + version: 5.1.1(prisma@5.1.1) + amqplib: + specifier: ^0.10.3 + version: 0.10.3 + dotenv: + specifier: ^16.0.3 + version: 16.0.3 + grpc-server-reflection: + specifier: ^0.1.5 + version: 0.1.5 + protobufjs: + specifier: 7.2.2 + version: 7.2.2 + +devDependencies: + '@types/amqplib': + specifier: ^0.10.1 + version: 0.10.1 + '@types/node': + specifier: 18.15.9 + version: 18.15.9 + esbuild: + specifier: ^0.17.18 + version: 0.17.18 + grpc-tools: + specifier: ^1.12.4 + version: 1.12.4 + nodemon: + specifier: ^2.0.22 + version: 2.0.22 + pkg: + specifier: ^5.8.1 + version: 5.8.1 + prisma: + specifier: 5.1.1 + version: 5.1.1 + ts-node: + specifier: 10.9.1 + version: 10.9.1(@types/node@18.15.9)(typescript@5.0.2) + tsconfig-paths: + specifier: ^4.2.0 + version: 4.2.0 + typescript: + specifier: 5.0.2 + version: 5.0.2 + vite-tsconfig-paths: + specifier: ^4.2.0 + version: 4.2.0(typescript@5.0.2) + vitest: + specifier: ^0.29.8 + version: 0.29.8 + +packages: + + /@acuminous/bitsyntax@0.1.2: + resolution: {integrity: sha512-29lUK80d1muEQqiUsSo+3A0yP6CdspgC95EnKBMi22Xlwt79i/En4Vr67+cXhU+cZjbti3TgGGC5wy1stIywVQ==} + engines: {node: '>=0.8'} + dependencies: + buffer-more-ints: 1.0.0 + debug: 4.3.4 + safe-buffer: 5.1.2 + transitivePeerDependencies: + - supports-color + dev: false + + /@babel/generator@7.18.2: + resolution: {integrity: sha512-W1lG5vUwFvfMd8HVXqdfbuG7RuaSrTCCD8cl8fP8wOivdbtbIg2Db3IWUcgvfxKbbn6ZBGYRW/Zk1MIwK49mgw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.19.0 + '@jridgewell/gen-mapping': 0.3.3 + jsesc: 2.5.2 + dev: true + + /@babel/helper-string-parser@7.21.5: + resolution: {integrity: sha512-5pTUx3hAJaZIdW99sJ6ZUUgWq/Y+Hja7TowEnLNMm1VivRgZQL3vpBY3qUACVsvw+yQU6+YgfBVmcbLaZtrA1w==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helper-validator-identifier@7.19.1: + resolution: {integrity: sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/parser@7.18.4: + resolution: {integrity: sha512-FDge0dFazETFcxGw/EXzOkN8uJp0PC7Qbm+Pe9T+av2zlBpOgunFHkQPPn+eRuClU73JF+98D531UgayY89tow==} + engines: {node: '>=6.0.0'} + hasBin: true + dependencies: + '@babel/types': 7.19.0 + dev: true + + /@babel/types@7.19.0: + resolution: {integrity: sha512-YuGopBq3ke25BVSiS6fgF49Ul9gH1x70Bcr6bqRLjWCkcX8Hre1/5+z+IiWOIerRMSSEfGZVB9z9kyq7wVs9YA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-string-parser': 7.21.5 + '@babel/helper-validator-identifier': 7.19.1 + to-fast-properties: 2.0.0 + 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 + + /@esbuild/android-arm64@0.17.18: + resolution: {integrity: sha512-/iq0aK0eeHgSC3z55ucMAHO05OIqmQehiGay8eP5l/5l+iEr4EIbh4/MI8xD9qRFjqzgkc0JkX0LculNC9mXBw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-arm@0.17.18: + resolution: {integrity: sha512-EmwL+vUBZJ7mhFCs5lA4ZimpUH3WMAoqvOIYhVQwdIgSpHC8ImHdsRyhHAVxpDYUSm0lWvd63z0XH1IlImS2Qw==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-x64@0.17.18: + resolution: {integrity: sha512-x+0efYNBF3NPW2Xc5bFOSFW7tTXdAcpfEg2nXmxegm4mJuVeS+i109m/7HMiOQ6M12aVGGFlqJX3RhNdYM2lWg==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-arm64@0.17.18: + resolution: {integrity: sha512-6tY+djEAdF48M1ONWnQb1C+6LiXrKjmqjzPNPWXhu/GzOHTHX2nh8Mo2ZAmBFg0kIodHhciEgUBtcYCAIjGbjQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-x64@0.17.18: + resolution: {integrity: sha512-Qq84ykvLvya3dO49wVC9FFCNUfSrQJLbxhoQk/TE1r6MjHo3sFF2tlJCwMjhkBVq3/ahUisj7+EpRSz0/+8+9A==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-arm64@0.17.18: + resolution: {integrity: sha512-fw/ZfxfAzuHfaQeMDhbzxp9mc+mHn1Y94VDHFHjGvt2Uxl10mT4CDavHm+/L9KG441t1QdABqkVYwakMUeyLRA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-x64@0.17.18: + resolution: {integrity: sha512-FQFbRtTaEi8ZBi/A6kxOC0V0E9B/97vPdYjY9NdawyLd4Qk5VD5g2pbWN2VR1c0xhzcJm74HWpObPszWC+qTew==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm64@0.17.18: + resolution: {integrity: sha512-R7pZvQZFOY2sxUG8P6A21eq6q+eBv7JPQYIybHVf1XkQYC+lT7nDBdC7wWKTrbvMXKRaGudp/dzZCwL/863mZQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm@0.17.18: + resolution: {integrity: sha512-jW+UCM40LzHcouIaqv3e/oRs0JM76JfhHjCavPxMUti7VAPh8CaGSlS7cmyrdpzSk7A+8f0hiedHqr/LMnfijg==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ia32@0.17.18: + resolution: {integrity: sha512-ygIMc3I7wxgXIxk6j3V00VlABIjq260i967Cp9BNAk5pOOpIXmd1RFQJQX9Io7KRsthDrQYrtcx7QCof4o3ZoQ==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-loong64@0.17.18: + resolution: {integrity: sha512-bvPG+MyFs5ZlwYclCG1D744oHk1Pv7j8psF5TfYx7otCVmcJsEXgFEhQkbhNW8otDHL1a2KDINW20cfCgnzgMQ==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-mips64el@0.17.18: + resolution: {integrity: sha512-oVqckATOAGuiUOa6wr8TXaVPSa+6IwVJrGidmNZS1cZVx0HqkTMkqFGD2HIx9H1RvOwFeWYdaYbdY6B89KUMxA==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ppc64@0.17.18: + resolution: {integrity: sha512-3dLlQO+b/LnQNxgH4l9rqa2/IwRJVN9u/bK63FhOPB4xqiRqlQAU0qDU3JJuf0BmaH0yytTBdoSBHrb2jqc5qQ==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-riscv64@0.17.18: + resolution: {integrity: sha512-/x7leOyDPjZV3TcsdfrSI107zItVnsX1q2nho7hbbQoKnmoeUWjs+08rKKt4AUXju7+3aRZSsKrJtaRmsdL1xA==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-s390x@0.17.18: + resolution: {integrity: sha512-cX0I8Q9xQkL/6F5zWdYmVf5JSQt+ZfZD2bJudZrWD+4mnUvoZ3TDDXtDX2mUaq6upMFv9FlfIh4Gfun0tbGzuw==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-x64@0.17.18: + resolution: {integrity: sha512-66RmRsPlYy4jFl0vG80GcNRdirx4nVWAzJmXkevgphP1qf4dsLQCpSKGM3DUQCojwU1hnepI63gNZdrr02wHUA==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/netbsd-x64@0.17.18: + resolution: {integrity: sha512-95IRY7mI2yrkLlTLb1gpDxdC5WLC5mZDi+kA9dmM5XAGxCME0F8i4bYH4jZreaJ6lIZ0B8hTrweqG1fUyW7jbg==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/openbsd-x64@0.17.18: + resolution: {integrity: sha512-WevVOgcng+8hSZ4Q3BKL3n1xTv5H6Nb53cBrtzzEjDbbnOmucEVcZeGCsCOi9bAOcDYEeBZbD2SJNBxlfP3qiA==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/sunos-x64@0.17.18: + resolution: {integrity: sha512-Rzf4QfQagnwhQXVBS3BYUlxmEbcV7MY+BH5vfDZekU5eYpcffHSyjU8T0xucKVuOcdCsMo+Ur5wmgQJH2GfNrg==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-arm64@0.17.18: + resolution: {integrity: sha512-Kb3Ko/KKaWhjeAm2YoT/cNZaHaD1Yk/pa3FTsmqo9uFh1D1Rfco7BBLIPdDOozrObj2sahslFuAQGvWbgWldAg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-ia32@0.17.18: + resolution: {integrity: sha512-0/xUMIdkVHwkvxfbd5+lfG7mHOf2FRrxNbPiKWg9C4fFrB8H0guClmaM3BFiRUYrznVoyxTIyC/Ou2B7QQSwmw==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-x64@0.17.18: + resolution: {integrity: sha512-qU25Ma1I3NqTSHJUOKi9sAH1/Mzuvlke0ioMJRthLXKm7JiSKVwFghlGbDLOO2sARECGhja4xYfRAZNPAkooYg==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@grpc/grpc-js@1.8.14: + resolution: {integrity: sha512-w84maJ6CKl5aApCMzFll0hxtFNT6or9WwMslobKaqWUEf1K+zhlL43bSQhFreyYWIWR+Z0xnVFC1KtLm4ZpM/A==} + engines: {node: ^8.13.0 || >=10.10.0} + dependencies: + '@grpc/proto-loader': 0.7.6 + '@types/node': 18.15.9 + dev: false + + /@grpc/proto-loader@0.7.6: + resolution: {integrity: sha512-QyAXR8Hyh7uMDmveWxDSUcJr9NAWaZ2I6IXgAYvQmfflwouTM+rArE2eEaCtLlRqO81j7pRLCt81IefUei6Zbw==} + engines: {node: '>=6'} + hasBin: true + dependencies: + '@types/long': 4.0.2 + lodash.camelcase: 4.3.0 + long: 4.0.0 + protobufjs: 7.2.2 + yargs: 16.2.0 + dev: false + + /@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.18 + dev: true + + /@jridgewell/resolve-uri@3.1.0: + resolution: {integrity: sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==} + engines: {node: '>=6.0.0'} + 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.14: + resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==} + dev: true + + /@jridgewell/sourcemap-codec@1.4.15: + resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + dev: true + + /@jridgewell/trace-mapping@0.3.18: + resolution: {integrity: sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==} + dependencies: + '@jridgewell/resolve-uri': 3.1.0 + '@jridgewell/sourcemap-codec': 1.4.14 + 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 + + /@mapbox/node-pre-gyp@1.0.10: + resolution: {integrity: sha512-4ySo4CjzStuprMwk35H5pPbkymjv1SF3jGLj6rAHp/xT/RF7TL7bd9CTm1xDY49K2qF7jmR/g7k+SkLETP6opA==} + hasBin: true + dependencies: + detect-libc: 2.0.1 + https-proxy-agent: 5.0.1 + make-dir: 3.1.0 + node-fetch: 2.6.10 + nopt: 5.0.0 + npmlog: 5.0.1 + rimraf: 3.0.2 + semver: 7.5.0 + tar: 6.1.14 + transitivePeerDependencies: + - encoding + - supports-color + dev: true + + /@nodelib/fs.scandir@2.1.5: + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + dev: true + + /@nodelib/fs.stat@2.0.5: + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + dev: true + + /@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: true + + /@prisma/client@5.1.1(prisma@5.1.1): + resolution: {integrity: sha512-fxcCeK5pMQGcgCqCrWsi+I2rpIbk0rAhdrN+ke7f34tIrgPwA68ensrpin+9+fZvuV2OtzHmuipwduSY6HswdA==} + engines: {node: '>=16.13'} + requiresBuild: true + peerDependencies: + prisma: '*' + peerDependenciesMeta: + prisma: + optional: true + dependencies: + '@prisma/engines-version': 5.1.1-1.6a3747c37ff169c90047725a05a6ef02e32ac97e + prisma: 5.1.1 + dev: false + + /@prisma/engines-version@5.1.1-1.6a3747c37ff169c90047725a05a6ef02e32ac97e: + resolution: {integrity: sha512-owZqbY/wucbr65bXJ/ljrHPgQU5xXTSkmcE/JcbqE1kusuAXV/TLN3/exmz21SZ5rJ7WDkyk70J2G/n68iogbQ==} + dev: false + + /@prisma/engines@5.1.1: + resolution: {integrity: sha512-NV/4nVNWFZSJCCIA3HIFJbbDKO/NARc9ej0tX5S9k2EVbkrFJC4Xt9b0u4rNZWL4V+F5LAjvta8vzEUw0rw+HA==} + requiresBuild: true + + /@protobufjs/aspromise@1.1.2: + resolution: {integrity: sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==} + dev: false + + /@protobufjs/base64@1.1.2: + resolution: {integrity: sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==} + dev: false + + /@protobufjs/codegen@2.0.4: + resolution: {integrity: sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==} + dev: false + + /@protobufjs/eventemitter@1.1.0: + resolution: {integrity: sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==} + dev: false + + /@protobufjs/fetch@1.1.0: + resolution: {integrity: sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==} + dependencies: + '@protobufjs/aspromise': 1.1.2 + '@protobufjs/inquire': 1.1.0 + dev: false + + /@protobufjs/float@1.0.2: + resolution: {integrity: sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==} + dev: false + + /@protobufjs/inquire@1.1.0: + resolution: {integrity: sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==} + dev: false + + /@protobufjs/path@1.1.2: + resolution: {integrity: sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==} + dev: false + + /@protobufjs/pool@1.1.0: + resolution: {integrity: sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==} + dev: false + + /@protobufjs/utf8@1.1.0: + resolution: {integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==} + 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.3: + resolution: {integrity: sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==} + dev: true + + /@types/amqplib@0.10.1: + resolution: {integrity: sha512-j6ANKT79ncUDnAs/+9r9eDujxbeJoTjoVu33gHHcaPfmLQaMhvfbH2GqSe8KUM444epAp1Vl3peVOQfZk3UIqA==} + dependencies: + '@types/node': 18.15.9 + dev: true + + /@types/chai-subset@1.3.3: + resolution: {integrity: sha512-frBecisrNGz+F4T6bcc+NLeolfiojh5FxW2klu669+8BARtyQv2C/GkNW6FUodVe4BroGMP/wER/YDGc7rEllw==} + dependencies: + '@types/chai': 4.3.5 + dev: true + + /@types/chai@4.3.5: + resolution: {integrity: sha512-mEo1sAde+UCE6b2hxn332f1g1E8WfYRu6p5SvTKr2ZKC1f7gFJXk4h5PyGP9Dt6gCaG8y8XhwnXWC6Iy2cmBng==} + dev: true + + /@types/long@4.0.2: + resolution: {integrity: sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==} + dev: false + + /@types/node@18.15.9: + resolution: {integrity: sha512-dUxhiNzBLr6IqlZXz6e/rN2YQXlFgOei/Dxy+e3cyXTJ4txSUbGT2/fmnD6zd/75jDMeW5bDee+YXxlFKHoV0A==} + + /@vitest/expect@0.29.8: + resolution: {integrity: sha512-xlcVXn5I5oTq6NiZSY3ykyWixBxr5mG8HYtjvpgg6KaqHm0mvhX18xuwl5YGxIRNt/A5jidd7CWcNHrSvgaQqQ==} + dependencies: + '@vitest/spy': 0.29.8 + '@vitest/utils': 0.29.8 + chai: 4.3.7 + dev: true + + /@vitest/runner@0.29.8: + resolution: {integrity: sha512-FzdhnRDwEr/A3Oo1jtIk/B952BBvP32n1ObMEb23oEJNO+qO5cBet6M2XWIDQmA7BDKGKvmhUf2naXyp/2JEwQ==} + dependencies: + '@vitest/utils': 0.29.8 + p-limit: 4.0.0 + pathe: 1.1.0 + dev: true + + /@vitest/spy@0.29.8: + resolution: {integrity: sha512-VdjBe9w34vOMl5I5mYEzNX8inTxrZ+tYUVk9jxaZJmHFwmDFC/GV3KBFTA/JKswr3XHvZL+FE/yq5EVhb6pSAw==} + dependencies: + tinyspy: 1.1.1 + dev: true + + /@vitest/utils@0.29.8: + resolution: {integrity: sha512-qGzuf3vrTbnoY+RjjVVIBYfuWMjn3UMUqyQtdGNZ6ZIIyte7B37exj6LaVkrZiUTvzSadVvO/tJm8AEgbGCBPg==} + dependencies: + cli-truncate: 3.1.0 + diff: 5.1.0 + loupe: 2.3.6 + pretty-format: 27.5.1 + dev: true + + /abbrev@1.1.1: + resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} + dev: true + + /acorn-walk@8.2.0: + resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} + engines: {node: '>=0.4.0'} + dev: true + + /acorn@8.8.2: + resolution: {integrity: sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==} + engines: {node: '>=0.4.0'} + hasBin: true + dev: true + + /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 + dev: true + + /amqplib@0.10.3: + resolution: {integrity: sha512-UHmuSa7n8vVW/a5HGh2nFPqAEr8+cD4dEZ6u9GjP91nHfr1a54RyAKyra7Sb5NH7NBKOUlyQSMXIp0qAixKexw==} + engines: {node: '>=10'} + dependencies: + '@acuminous/bitsyntax': 0.1.2 + buffer-more-ints: 1.0.0 + readable-stream: 1.1.14 + url-parse: 1.5.10 + transitivePeerDependencies: + - supports-color + dev: false + + /ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + /ansi-regex@6.0.1: + resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} + engines: {node: '>=12'} + dev: true + + /ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + dependencies: + color-convert: 2.0.1 + + /ansi-styles@5.2.0: + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} + engines: {node: '>=10'} + dev: true + + /ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + dev: true + + /anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + dev: true + + /aproba@2.0.0: + resolution: {integrity: sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==} + dev: true + + /are-we-there-yet@2.0.0: + resolution: {integrity: sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==} + engines: {node: '>=10'} + dependencies: + delegates: 1.0.0 + readable-stream: 3.6.2 + dev: true + + /arg@4.1.3: + resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} + dev: true + + /array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + dev: true + + /assertion-error@1.1.0: + resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} + dev: true + + /at-least-node@1.0.0: + resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} + engines: {node: '>= 4.0.0'} + dev: true + + /balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + dev: true + + /base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + dev: true + + /binary-extensions@2.2.0: + resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} + engines: {node: '>=8'} + dev: true + + /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: true + + /brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + dev: true + + /braces@3.0.2: + resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + engines: {node: '>=8'} + dependencies: + fill-range: 7.0.1 + dev: true + + /buffer-more-ints@1.0.0: + resolution: {integrity: sha512-EMetuGFz5SLsT0QTnXzINh4Ksr+oo4i+UGTXEshiGCQWnsgSs7ZhJ8fzlwQ+OzEMs0MpDAMr1hxnblp5a4vcHg==} + dev: false + + /buffer@5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + dev: true + + /cac@6.7.14: + resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} + engines: {node: '>=8'} + dev: true + + /chai@4.3.7: + resolution: {integrity: sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==} + engines: {node: '>=4'} + dependencies: + assertion-error: 1.1.0 + check-error: 1.0.2 + deep-eql: 4.1.3 + get-func-name: 2.0.0 + loupe: 2.3.6 + pathval: 1.1.1 + type-detect: 4.0.8 + dev: true + + /chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + dev: true + + /check-error@1.0.2: + resolution: {integrity: sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==} + dev: true + + /chokidar@3.5.3: + resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} + engines: {node: '>= 8.10.0'} + dependencies: + anymatch: 3.1.3 + braces: 3.0.2 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.2 + dev: true + + /chownr@1.1.4: + resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} + dev: true + + /chownr@2.0.0: + resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} + engines: {node: '>=10'} + dev: true + + /cli-truncate@3.1.0: + resolution: {integrity: sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + slice-ansi: 5.0.0 + string-width: 5.1.2 + dev: true + + /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 + + /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.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + /color-support@1.1.3: + resolution: {integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==} + hasBin: true + dev: true + + /concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + dev: true + + /console-control-strings@1.1.0: + resolution: {integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==} + dev: true + + /core-util-is@1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + + /create-require@1.1.1: + resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} + dev: true + + /debug@3.2.7(supports-color@5.5.0): + resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.3 + supports-color: 5.5.0 + dev: true + + /debug@4.3.4: + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.2 + + /decompress-response@6.0.0: + resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} + engines: {node: '>=10'} + dependencies: + mimic-response: 3.1.0 + dev: true + + /deep-eql@4.1.3: + resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==} + engines: {node: '>=6'} + dependencies: + type-detect: 4.0.8 + dev: true + + /deep-extend@0.6.0: + resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} + engines: {node: '>=4.0.0'} + dev: true + + /delegates@1.0.0: + resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==} + dev: true + + /detect-libc@2.0.1: + resolution: {integrity: sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==} + engines: {node: '>=8'} + dev: true + + /diff@4.0.2: + resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} + engines: {node: '>=0.3.1'} + dev: true + + /diff@5.1.0: + resolution: {integrity: sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==} + 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 + dev: true + + /dotenv@16.0.3: + resolution: {integrity: sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==} + engines: {node: '>=12'} + dev: false + + /eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + dev: true + + /emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + /emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + dev: true + + /end-of-stream@1.4.4: + resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + dependencies: + once: 1.4.0 + dev: true + + /esbuild@0.17.18: + resolution: {integrity: sha512-z1lix43jBs6UKjcZVKOw2xx69ffE2aG0PygLL5qJ9OS/gy0Ewd1gW/PUQIOIQGXBHWNywSc0floSKoMFF8aK2w==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/android-arm': 0.17.18 + '@esbuild/android-arm64': 0.17.18 + '@esbuild/android-x64': 0.17.18 + '@esbuild/darwin-arm64': 0.17.18 + '@esbuild/darwin-x64': 0.17.18 + '@esbuild/freebsd-arm64': 0.17.18 + '@esbuild/freebsd-x64': 0.17.18 + '@esbuild/linux-arm': 0.17.18 + '@esbuild/linux-arm64': 0.17.18 + '@esbuild/linux-ia32': 0.17.18 + '@esbuild/linux-loong64': 0.17.18 + '@esbuild/linux-mips64el': 0.17.18 + '@esbuild/linux-ppc64': 0.17.18 + '@esbuild/linux-riscv64': 0.17.18 + '@esbuild/linux-s390x': 0.17.18 + '@esbuild/linux-x64': 0.17.18 + '@esbuild/netbsd-x64': 0.17.18 + '@esbuild/openbsd-x64': 0.17.18 + '@esbuild/sunos-x64': 0.17.18 + '@esbuild/win32-arm64': 0.17.18 + '@esbuild/win32-ia32': 0.17.18 + '@esbuild/win32-x64': 0.17.18 + dev: true + + /escalade@3.1.1: + resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} + engines: {node: '>=6'} + + /expand-template@2.0.3: + resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} + engines: {node: '>=6'} + dev: true + + /fast-glob@3.2.12: + resolution: {integrity: sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==} + 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: true + + /fastq@1.15.0: + resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} + dependencies: + reusify: 1.0.4 + dev: true + + /fill-range@7.0.1: + resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} + engines: {node: '>=8'} + dependencies: + to-regex-range: 5.0.1 + dev: true + + /from2@2.3.0: + resolution: {integrity: sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==} + dependencies: + inherits: 2.0.4 + readable-stream: 2.3.8 + dev: true + + /fs-constants@1.0.0: + resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} + dev: true + + /fs-extra@9.1.0: + resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==} + engines: {node: '>=10'} + dependencies: + at-least-node: 1.0.0 + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.0 + dev: true + + /fs-minipass@2.1.0: + resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} + engines: {node: '>= 8'} + dependencies: + minipass: 3.3.6 + dev: true + + /fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + dev: true + + /fsevents@2.3.2: + resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /function-bind@1.1.1: + resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} + dev: true + + /gauge@3.0.2: + resolution: {integrity: sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==} + engines: {node: '>=10'} + dependencies: + aproba: 2.0.0 + color-support: 1.1.3 + console-control-strings: 1.1.0 + has-unicode: 2.0.1 + object-assign: 4.1.1 + signal-exit: 3.0.7 + string-width: 4.2.3 + strip-ansi: 6.0.1 + wide-align: 1.1.5 + dev: true + + /get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + + /get-func-name@2.0.0: + resolution: {integrity: sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==} + dev: true + + /github-from-package@0.0.0: + resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==} + dev: true + + /glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + dependencies: + is-glob: 4.0.3 + dev: true + + /glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + dev: true + + /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.2.12 + ignore: 5.2.4 + merge2: 1.4.1 + slash: 3.0.0 + dev: true + + /globrex@0.1.2: + resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} + dev: true + + /google-protobuf@3.21.2: + resolution: {integrity: sha512-3MSOYFO5U9mPGikIYCzK0SaThypfGgS6bHqrUGXG3DPHCrb+txNqeEcns1W0lkGfk0rCyNXm7xB9rMxnCiZOoA==} + dev: false + + /graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + dev: true + + /grpc-server-reflection@0.1.5: + resolution: {integrity: sha512-i69RYu6v65enzknNAPUgerFuVQfo+L3n9g4c1A/Sv5jUHMpxMIjSbBA+YWls9Sr4Flac4oohp4Gx8f389CaHuw==} + dependencies: + google-protobuf: 3.21.2 + dev: false + + /grpc-tools@1.12.4: + resolution: {integrity: sha512-5+mLAJJma3BjnW/KQp6JBjUMgvu7Mu3dBvBPd1dcbNIb+qiR0817zDpgPjS7gRb+l/8EVNIa3cB02xI9JLToKg==} + hasBin: true + requiresBuild: true + dependencies: + '@mapbox/node-pre-gyp': 1.0.10 + transitivePeerDependencies: + - encoding + - supports-color + dev: true + + /has-flag@3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + dev: true + + /has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + dev: true + + /has-unicode@2.0.1: + resolution: {integrity: sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==} + dev: true + + /has@1.0.3: + resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} + engines: {node: '>= 0.4.0'} + dependencies: + function-bind: 1.1.1 + dev: true + + /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 + dev: true + + /ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + dev: true + + /ignore-by-default@1.0.1: + resolution: {integrity: sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==} + dev: true + + /ignore@5.2.4: + resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} + engines: {node: '>= 4'} + dev: true + + /inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + dev: true + + /inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + /ini@1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + dev: true + + /into-stream@6.0.0: + resolution: {integrity: sha512-XHbaOAvP+uFKUFsOgoNPRjLkwB+I22JFPFe5OjTkQ0nwgj6+pSjb4NmB6VMxaPshLiOf+zcpOCBQuLwC1KHhZA==} + engines: {node: '>=10'} + dependencies: + from2: 2.3.0 + p-is-promise: 3.0.0 + dev: true + + /is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + dependencies: + binary-extensions: 2.2.0 + dev: true + + /is-core-module@2.12.0: + resolution: {integrity: sha512-RECHCBCd/viahWmwj6enj19sKbHfJrddi/6cBDsNTKbNq0f7VeaUkBo60BqzvPqo/W54ChS62Z5qyun7cfOMqQ==} + dependencies: + has: 1.0.3 + dev: true + + /is-core-module@2.9.0: + resolution: {integrity: sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==} + dependencies: + has: 1.0.3 + dev: true + + /is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + dev: true + + /is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + /is-fullwidth-code-point@4.0.0: + resolution: {integrity: sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==} + engines: {node: '>=12'} + dev: true + + /is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + dependencies: + is-extglob: 2.1.1 + dev: true + + /is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + dev: true + + /isarray@0.0.1: + resolution: {integrity: sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==} + dev: false + + /isarray@1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + dev: true + + /jsesc@2.5.2: + resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} + engines: {node: '>=4'} + hasBin: true + dev: true + + /json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + dev: true + + /jsonc-parser@3.2.0: + resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} + dev: true + + /jsonfile@6.1.0: + resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + dependencies: + universalify: 2.0.0 + optionalDependencies: + graceful-fs: 4.2.11 + dev: true + + /local-pkg@0.4.3: + resolution: {integrity: sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==} + engines: {node: '>=14'} + dev: true + + /lodash.camelcase@4.3.0: + resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} + dev: false + + /long@4.0.0: + resolution: {integrity: sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==} + dev: false + + /long@5.2.3: + resolution: {integrity: sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==} + dev: false + + /loupe@2.3.6: + resolution: {integrity: sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==} + dependencies: + get-func-name: 2.0.0 + dev: true + + /lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + dependencies: + yallist: 4.0.0 + dev: true + + /make-dir@3.1.0: + resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} + engines: {node: '>=8'} + dependencies: + semver: 6.3.0 + dev: true + + /make-error@1.3.6: + resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + dev: true + + /merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + dev: true + + /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: true + + /mimic-response@3.1.0: + resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} + engines: {node: '>=10'} + dev: true + + /minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + dependencies: + brace-expansion: 1.1.11 + dev: true + + /minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + dev: true + + /minipass@3.3.6: + resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} + engines: {node: '>=8'} + dependencies: + yallist: 4.0.0 + dev: true + + /minipass@5.0.0: + resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} + engines: {node: '>=8'} + dev: true + + /minizlib@2.1.2: + resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} + engines: {node: '>= 8'} + dependencies: + minipass: 3.3.6 + yallist: 4.0.0 + dev: true + + /mkdirp-classic@0.5.3: + resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} + dev: true + + /mkdirp@1.0.4: + resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} + engines: {node: '>=10'} + hasBin: true + dev: true + + /mlly@1.2.0: + resolution: {integrity: sha512-+c7A3CV0KGdKcylsI6khWyts/CYrGTrRVo4R/I7u/cUsy0Conxa6LUhiEzVKIw14lc2L5aiO4+SeVe4TeGRKww==} + dependencies: + acorn: 8.8.2 + pathe: 1.1.0 + pkg-types: 1.0.3 + ufo: 1.1.2 + dev: true + + /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: true + + /multistream@4.1.0: + resolution: {integrity: sha512-J1XDiAmmNpRCBfIWJv+n0ymC4ABcf/Pl+5YvC5B/D2f/2+8PtHvCNxMPKiQcZyi922Hq69J2YOpb1pTywfifyw==} + dependencies: + once: 1.4.0 + readable-stream: 3.6.2 + dev: true + + /nanoid@3.3.6: + resolution: {integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + dev: true + + /napi-build-utils@1.0.2: + resolution: {integrity: sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==} + dev: true + + /node-abi@3.40.0: + resolution: {integrity: sha512-zNy02qivjjRosswoYmPi8hIKJRr8MpQyeKT6qlcq/OnOgA3Rhoae+IYOqsM9V5+JnHWmxKnWOT2GxvtqdtOCXA==} + engines: {node: '>=10'} + dependencies: + semver: 7.5.0 + dev: true + + /node-fetch@2.6.10: + resolution: {integrity: sha512-5YytjUVbwzjE/BX4N62vnPPkGNxlJPwdA9/ArUc4pcM6cYS4Hinuv4VazzwjMGgnWuiQqcemOanib/5PpcsGug==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + dependencies: + whatwg-url: 5.0.0 + dev: true + + /nodemon@2.0.22: + resolution: {integrity: sha512-B8YqaKMmyuCO7BowF1Z1/mkPqLk6cs/l63Ojtd6otKjMx47Dq1utxfRxcavH1I7VSaL8n5BUaoutadnsX3AAVQ==} + engines: {node: '>=8.10.0'} + hasBin: true + dependencies: + chokidar: 3.5.3 + debug: 3.2.7(supports-color@5.5.0) + ignore-by-default: 1.0.1 + minimatch: 3.1.2 + pstree.remy: 1.1.8 + semver: 5.7.1 + simple-update-notifier: 1.1.0 + supports-color: 5.5.0 + touch: 3.1.0 + undefsafe: 2.0.5 + dev: true + + /nopt@1.0.10: + resolution: {integrity: sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==} + hasBin: true + dependencies: + abbrev: 1.1.1 + dev: true + + /nopt@5.0.0: + resolution: {integrity: sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==} + engines: {node: '>=6'} + hasBin: true + dependencies: + abbrev: 1.1.1 + dev: true + + /normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + dev: true + + /npmlog@5.0.1: + resolution: {integrity: sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==} + dependencies: + are-we-there-yet: 2.0.0 + console-control-strings: 1.1.0 + gauge: 3.0.2 + set-blocking: 2.0.0 + dev: true + + /object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + dev: true + + /once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + dependencies: + wrappy: 1.0.2 + dev: true + + /p-is-promise@3.0.0: + resolution: {integrity: sha512-Wo8VsW4IRQSKVXsJCn7TomUaVtyfjVDn3nUP7kE967BQk0CwFpdbZs0X0uk5sW9mkBa9eNM7hCMaG93WUAwxYQ==} + engines: {node: '>=8'} + dev: true + + /p-limit@4.0.0: + resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + yocto-queue: 1.0.0 + dev: true + + /path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + dev: true + + /path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + dev: true + + /path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + dev: true + + /pathe@1.1.0: + resolution: {integrity: sha512-ODbEPR0KKHqECXW1GoxdDb+AZvULmXjVPy4rt+pGo2+TnjJTIPJQSVS6N63n8T2Ip+syHhbn52OewKicV0373w==} + dev: true + + /pathval@1.1.1: + resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} + dev: true + + /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'} + dev: true + + /pkg-fetch@3.4.2: + resolution: {integrity: sha512-0+uijmzYcnhC0hStDjm/cl2VYdrmVVBpe7Q8k9YBojxmR5tG8mvR9/nooQq3QSXiQqORDVOTY3XqMEqJVIzkHA==} + hasBin: true + dependencies: + chalk: 4.1.2 + fs-extra: 9.1.0 + https-proxy-agent: 5.0.1 + node-fetch: 2.6.10 + progress: 2.0.3 + semver: 7.5.0 + tar-fs: 2.1.1 + yargs: 16.2.0 + transitivePeerDependencies: + - encoding + - supports-color + dev: true + + /pkg-types@1.0.3: + resolution: {integrity: sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==} + dependencies: + jsonc-parser: 3.2.0 + mlly: 1.2.0 + pathe: 1.1.0 + dev: true + + /pkg@5.8.1: + resolution: {integrity: sha512-CjBWtFStCfIiT4Bde9QpJy0KeH19jCfwZRJqHFDFXfhUklCx8JoFmMj3wgnEYIwGmZVNkhsStPHEOnrtrQhEXA==} + hasBin: true + peerDependencies: + node-notifier: '>=9.0.1' + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@babel/generator': 7.18.2 + '@babel/parser': 7.18.4 + '@babel/types': 7.19.0 + chalk: 4.1.2 + fs-extra: 9.1.0 + globby: 11.1.0 + into-stream: 6.0.0 + is-core-module: 2.9.0 + minimist: 1.2.8 + multistream: 4.1.0 + pkg-fetch: 3.4.2 + prebuild-install: 7.1.1 + resolve: 1.22.2 + stream-meter: 1.0.4 + transitivePeerDependencies: + - encoding + - supports-color + dev: true + + /postcss@8.4.23: + resolution: {integrity: sha512-bQ3qMcpF6A/YjR55xtoTr0jGOlnPOKAIMdOWiv0EIT6HVPEaJiJB4NLljSbiHoC2RX7DN5Uvjtpbg1NPdwv1oA==} + engines: {node: ^10 || ^12 || >=14} + dependencies: + nanoid: 3.3.6 + picocolors: 1.0.0 + source-map-js: 1.0.2 + dev: true + + /prebuild-install@7.1.1: + resolution: {integrity: sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==} + engines: {node: '>=10'} + hasBin: true + dependencies: + detect-libc: 2.0.1 + expand-template: 2.0.3 + github-from-package: 0.0.0 + minimist: 1.2.8 + mkdirp-classic: 0.5.3 + napi-build-utils: 1.0.2 + node-abi: 3.40.0 + pump: 3.0.0 + rc: 1.2.8 + simple-get: 4.0.1 + tar-fs: 2.1.1 + tunnel-agent: 0.6.0 + dev: true + + /pretty-format@27.5.1: + resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + ansi-regex: 5.0.1 + ansi-styles: 5.2.0 + react-is: 17.0.2 + dev: true + + /prisma@5.1.1: + resolution: {integrity: sha512-WJFG/U7sMmcc6TjJTTifTfpI6Wjoh55xl4AzopVwAdyK68L9/ogNo8QQ2cxuUjJf/Wa82z/uhyh3wMzvRIBphg==} + engines: {node: '>=16.13'} + hasBin: true + requiresBuild: true + dependencies: + '@prisma/engines': 5.1.1 + + /process-nextick-args@2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + dev: true + + /progress@2.0.3: + resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} + engines: {node: '>=0.4.0'} + dev: true + + /protobufjs@7.2.2: + resolution: {integrity: sha512-++PrQIjrom+bFDPpfmqXfAGSQs40116JRrqqyf53dymUMvvb5d/LMRyicRoF1AUKoXVS1/IgJXlEgcpr4gTF3Q==} + engines: {node: '>=12.0.0'} + requiresBuild: true + dependencies: + '@protobufjs/aspromise': 1.1.2 + '@protobufjs/base64': 1.1.2 + '@protobufjs/codegen': 2.0.4 + '@protobufjs/eventemitter': 1.1.0 + '@protobufjs/fetch': 1.1.0 + '@protobufjs/float': 1.0.2 + '@protobufjs/inquire': 1.1.0 + '@protobufjs/path': 1.1.2 + '@protobufjs/pool': 1.1.0 + '@protobufjs/utf8': 1.1.0 + '@types/node': 18.15.9 + long: 5.2.3 + dev: false + + /pstree.remy@1.1.8: + resolution: {integrity: sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==} + dev: true + + /pump@3.0.0: + resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} + dependencies: + end-of-stream: 1.4.4 + once: 1.4.0 + dev: true + + /querystringify@2.2.0: + resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} + dev: false + + /queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + dev: true + + /rc@1.2.8: + resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} + hasBin: true + dependencies: + deep-extend: 0.6.0 + ini: 1.3.8 + minimist: 1.2.8 + strip-json-comments: 2.0.1 + dev: true + + /react-is@17.0.2: + resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} + dev: true + + /readable-stream@1.1.14: + resolution: {integrity: sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==} + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 0.0.1 + string_decoder: 0.10.31 + dev: false + + /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: true + + /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: true + + /readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + dependencies: + picomatch: 2.3.1 + dev: true + + /require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + + /requires-port@1.0.0: + resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} + dev: false + + /resolve@1.22.2: + resolution: {integrity: sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==} + hasBin: true + dependencies: + is-core-module: 2.12.0 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + dev: true + + /reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + dev: true + + /rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + hasBin: true + dependencies: + glob: 7.2.3 + dev: true + + /rollup@3.21.5: + resolution: {integrity: sha512-a4NTKS4u9PusbUJcfF4IMxuqjFzjm6ifj76P54a7cKnvVzJaG12BLVR+hgU2YDGHzyMMQNxLAZWuALsn8q2oQg==} + engines: {node: '>=14.18.0', npm: '>=8.0.0'} + hasBin: true + optionalDependencies: + fsevents: 2.3.2 + dev: true + + /run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + dependencies: + queue-microtask: 1.2.3 + dev: true + + /safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + + /safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + dev: true + + /semver@5.7.1: + resolution: {integrity: sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==} + hasBin: true + dev: true + + /semver@6.3.0: + resolution: {integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==} + hasBin: true + dev: true + + /semver@7.0.0: + resolution: {integrity: sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==} + hasBin: true + dev: true + + /semver@7.5.0: + resolution: {integrity: sha512-+XC0AD/R7Q2mPSRuy2Id0+CGTZ98+8f+KvwirxOKIEyid+XSx6HbC63p+O4IndTHuX5Z+JxQ0TghCkO5Cg/2HA==} + engines: {node: '>=10'} + hasBin: true + dependencies: + lru-cache: 6.0.0 + dev: true + + /set-blocking@2.0.0: + resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} + 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==} + dev: true + + /simple-concat@1.0.1: + resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} + dev: true + + /simple-get@4.0.1: + resolution: {integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==} + dependencies: + decompress-response: 6.0.0 + once: 1.4.0 + simple-concat: 1.0.1 + dev: true + + /simple-update-notifier@1.1.0: + resolution: {integrity: sha512-VpsrsJSUcJEseSbMHkrsrAVSdvVS5I96Qo1QAQ4FxQ9wXFcB+pjj7FB7/us9+GcgfW4ziHtYMc1J0PLczb55mg==} + engines: {node: '>=8.10.0'} + dependencies: + semver: 7.0.0 + dev: true + + /slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + dev: true + + /slice-ansi@5.0.0: + resolution: {integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==} + engines: {node: '>=12'} + dependencies: + ansi-styles: 6.2.1 + is-fullwidth-code-point: 4.0.0 + dev: true + + /source-map-js@1.0.2: + resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} + engines: {node: '>=0.10.0'} + dev: true + + /source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + dev: true + + /stackback@0.0.2: + resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + dev: true + + /std-env@3.3.3: + resolution: {integrity: sha512-Rz6yejtVyWnVjC1RFvNmYL10kgjC49EOghxWn0RFqlCHGFpQx+Xe7yW3I4ceK1SGrWIGMjD5Kbue8W/udkbMJg==} + dev: true + + /stream-meter@1.0.4: + resolution: {integrity: sha512-4sOEtrbgFotXwnEuzzsQBYEV1elAeFSO8rSGeTwabuX1RRn/kEq9JVH7I0MRBhKVRR0sJkr0M0QCH7yOLf9fhQ==} + dependencies: + readable-stream: 2.3.8 + 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.0.1 + dev: true + + /string_decoder@0.10.31: + resolution: {integrity: sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==} + dev: false + + /string_decoder@1.1.1: + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + dependencies: + safe-buffer: 5.1.2 + dev: true + + /string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + dependencies: + safe-buffer: 5.2.1 + dev: true + + /strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + dependencies: + ansi-regex: 5.0.1 + + /strip-ansi@7.0.1: + resolution: {integrity: sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==} + engines: {node: '>=12'} + dependencies: + ansi-regex: 6.0.1 + dev: true + + /strip-bom@3.0.0: + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} + dev: true + + /strip-json-comments@2.0.1: + resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} + engines: {node: '>=0.10.0'} + dev: true + + /strip-literal@1.0.1: + resolution: {integrity: sha512-QZTsipNpa2Ppr6v1AmJHESqJ3Uz247MUS0OjrnnZjFAvEoWqxuyFuXn2xLgMtRnijJShAa1HL0gtJyUs7u7n3Q==} + dependencies: + acorn: 8.8.2 + dev: true + + /supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + dependencies: + has-flag: 3.0.0 + dev: true + + /supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + dependencies: + has-flag: 4.0.0 + dev: true + + /supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + dev: true + + /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: true + + /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: true + + /tar@6.1.14: + resolution: {integrity: sha512-piERznXu0U7/pW7cdSn7hjqySIVTYT6F76icmFk7ptU7dDYlXTm5r9A6K04R2vU3olYgoKeo1Cg3eeu5nhftAw==} + engines: {node: '>=10'} + dependencies: + chownr: 2.0.0 + fs-minipass: 2.1.0 + minipass: 5.0.0 + minizlib: 2.1.2 + mkdirp: 1.0.4 + yallist: 4.0.0 + dev: true + + /tinybench@2.5.0: + resolution: {integrity: sha512-kRwSG8Zx4tjF9ZiyH4bhaebu+EDz1BOx9hOigYHlUW4xxI/wKIUQUqo018UlU4ar6ATPBsaMrdbKZ+tmPdohFA==} + dev: true + + /tinypool@0.4.0: + resolution: {integrity: sha512-2ksntHOKf893wSAH4z/+JbPpi92esw8Gn9N2deXX+B0EO92hexAVI9GIZZPx7P5aYo5KULfeOSt3kMOmSOy6uA==} + engines: {node: '>=14.0.0'} + dev: true + + /tinyspy@1.1.1: + resolution: {integrity: sha512-UVq5AXt/gQlti7oxoIg5oi/9r0WpF7DGEVwXgqWSMmyN16+e3tl5lIvTaOpJ3TAtu5xFzWccFRM4R5NaWHF+4g==} + engines: {node: '>=14.0.0'} + 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 + dev: true + + /touch@3.1.0: + resolution: {integrity: sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==} + hasBin: true + dependencies: + nopt: 1.0.10 + dev: true + + /tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + dev: true + + /ts-node@10.9.1(@types/node@18.15.9)(typescript@5.0.2): + 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.3 + '@types/node': 18.15.9 + acorn: 8.8.2 + 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.0.2 + v8-compile-cache-lib: 3.0.1 + yn: 3.1.1 + dev: true + + /tsconfck@2.1.1(typescript@5.0.2): + resolution: {integrity: sha512-ZPCkJBKASZBmBUNqGHmRhdhM8pJYDdOXp4nRgj/O0JwUwsMq50lCDRQP/M5GBNAA0elPrq4gAeu4dkaVCuKWww==} + engines: {node: ^14.13.1 || ^16 || >=18} + hasBin: true + peerDependencies: + typescript: ^4.3.5 || ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + dependencies: + typescript: 5.0.2 + 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 + + /tunnel-agent@0.6.0: + resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} + dependencies: + safe-buffer: 5.2.1 + dev: true + + /type-detect@4.0.8: + resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} + engines: {node: '>=4'} + dev: true + + /typescript@5.0.2: + resolution: {integrity: sha512-wVORMBGO/FAs/++blGNeAVdbNKtIh1rbBL2EyQ1+J9lClJ93KiiKe8PmFIVdXhHcyv44SL9oglmfeSsndo0jRw==} + engines: {node: '>=12.20'} + hasBin: true + dev: true + + /ufo@1.1.2: + resolution: {integrity: sha512-TrY6DsjTQQgyS3E3dBaOXf0TpPD8u9FVrVYmKVegJuFw51n/YB9XPt+U6ydzFG5ZIN7+DIjPbNmXoBj9esYhgQ==} + dev: true + + /undefsafe@2.0.5: + resolution: {integrity: sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==} + dev: true + + /universalify@2.0.0: + resolution: {integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==} + engines: {node: '>= 10.0.0'} + dev: true + + /url-parse@1.5.10: + resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} + dependencies: + querystringify: 2.2.0 + requires-port: 1.0.0 + dev: false + + /util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + dev: true + + /v8-compile-cache-lib@3.0.1: + resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} + dev: true + + /vite-node@0.29.8(@types/node@18.15.9): + resolution: {integrity: sha512-b6OtCXfk65L6SElVM20q5G546yu10/kNrhg08afEoWlFRJXFq9/6glsvSVY+aI6YeC1tu2TtAqI2jHEQmOmsFw==} + engines: {node: '>=v14.16.0'} + hasBin: true + dependencies: + cac: 6.7.14 + debug: 4.3.4 + mlly: 1.2.0 + pathe: 1.1.0 + picocolors: 1.0.0 + vite: 4.3.5(@types/node@18.15.9) + transitivePeerDependencies: + - '@types/node' + - less + - sass + - stylus + - sugarss + - supports-color + - terser + dev: true + + /vite-tsconfig-paths@4.2.0(typescript@5.0.2): + resolution: {integrity: sha512-jGpus0eUy5qbbMVGiTxCL1iB9ZGN6Bd37VGLJU39kTDD6ZfULTTb1bcc5IeTWqWJKiWV5YihCaibeASPiGi8kw==} + peerDependencies: + vite: '*' + peerDependenciesMeta: + vite: + optional: true + dependencies: + debug: 4.3.4 + globrex: 0.1.2 + tsconfck: 2.1.1(typescript@5.0.2) + transitivePeerDependencies: + - supports-color + - typescript + dev: true + + /vite@4.3.5(@types/node@18.15.9): + resolution: {integrity: sha512-0gEnL9wiRFxgz40o/i/eTBwm+NEbpUeTWhzKrZDSdKm6nplj+z4lKz8ANDgildxHm47Vg8EUia0aicKbawUVVA==} + engines: {node: ^14.18.0 || >=16.0.0} + hasBin: true + peerDependencies: + '@types/node': '>= 14' + less: '*' + sass: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + dependencies: + '@types/node': 18.15.9 + esbuild: 0.17.18 + postcss: 8.4.23 + rollup: 3.21.5 + optionalDependencies: + fsevents: 2.3.2 + dev: true + + /vitest@0.29.8: + resolution: {integrity: sha512-JIAVi2GK5cvA6awGpH0HvH/gEG9PZ0a/WoxdiV3PmqK+3CjQMf8c+J/Vhv4mdZ2nRyXFw66sAg6qz7VNkaHfDQ==} + engines: {node: '>=v14.16.0'} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@vitest/browser': '*' + '@vitest/ui': '*' + happy-dom: '*' + jsdom: '*' + playwright: '*' + safaridriver: '*' + webdriverio: '*' + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@vitest/browser': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true + playwright: + optional: true + safaridriver: + optional: true + webdriverio: + optional: true + dependencies: + '@types/chai': 4.3.5 + '@types/chai-subset': 1.3.3 + '@types/node': 18.15.9 + '@vitest/expect': 0.29.8 + '@vitest/runner': 0.29.8 + '@vitest/spy': 0.29.8 + '@vitest/utils': 0.29.8 + acorn: 8.8.2 + acorn-walk: 8.2.0 + cac: 6.7.14 + chai: 4.3.7 + debug: 4.3.4 + local-pkg: 0.4.3 + pathe: 1.1.0 + picocolors: 1.0.0 + source-map: 0.6.1 + std-env: 3.3.3 + strip-literal: 1.0.1 + tinybench: 2.5.0 + tinypool: 0.4.0 + tinyspy: 1.1.1 + vite: 4.3.5(@types/node@18.15.9) + vite-node: 0.29.8(@types/node@18.15.9) + why-is-node-running: 2.2.2 + transitivePeerDependencies: + - less + - sass + - stylus + - sugarss + - supports-color + - terser + dev: true + + /webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + dev: true + + /whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + 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 + + /wide-align@1.1.5: + resolution: {integrity: sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==} + dependencies: + string-width: 4.2.3 + 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 + + /wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + dev: true + + /y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + + /yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + dev: true + + /yargs-parser@20.2.9: + resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} + engines: {node: '>=10'} + + /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 + + /yn@3.1.1: + resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} + engines: {node: '>=6'} + dev: true + + /yocto-queue@1.0.0: + resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} + engines: {node: '>=12.20'} + dev: true diff --git a/services/payment/prisma/migrations/20230804092434_init/migration.sql b/services/payment/prisma/migrations/20230804092434_init/migration.sql new file mode 100644 index 00000000..5af2e978 --- /dev/null +++ b/services/payment/prisma/migrations/20230804092434_init/migration.sql @@ -0,0 +1,26 @@ +-- CreateEnum +CREATE TYPE "PaymentStatus" AS ENUM ('PENDING', 'APPROVED', 'REJECTED'); + +-- CreateTable +CREATE TABLE "User" ( + "id" TEXT NOT NULL, + "name" TEXT NOT NULL, + "email" TEXT NOT NULL, + + CONSTRAINT "User_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "Payment" ( + "id" TEXT NOT NULL, + "total" DOUBLE PRECISION NOT NULL, + "status" "PaymentStatus" NOT NULL DEFAULT 'PENDING', + "user_id" TEXT NOT NULL, + "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updated_at" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "Payment_pkey" PRIMARY KEY ("id") +); + +-- AddForeignKey +ALTER TABLE "Payment" ADD CONSTRAINT "Payment_user_id_fkey" FOREIGN KEY ("user_id") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE; diff --git a/services/payment/prisma/migrations/migration_lock.toml b/services/payment/prisma/migrations/migration_lock.toml new file mode 100644 index 00000000..fbffa92c --- /dev/null +++ b/services/payment/prisma/migrations/migration_lock.toml @@ -0,0 +1,3 @@ +# Please do not edit this file manually +# It should be added in your version-control system (i.e. Git) +provider = "postgresql" \ No newline at end of file diff --git a/services/payment/prisma/schema.prisma b/services/payment/prisma/schema.prisma new file mode 100644 index 00000000..3122670d --- /dev/null +++ b/services/payment/prisma/schema.prisma @@ -0,0 +1,35 @@ +datasource db { + provider = "postgresql" + url = env("DATABASE_URL") +} + +generator client { + provider = "prisma-client-js" + binaryTargets = ["native", "linux-musl", "linux-musl-openssl-3.0.x"] +} + +enum PaymentStatus { + PENDING + APPROVED + REJECTED +} + +model User { + id String @id // no default value because it is a foreign key created by the user microservice + name String + email String + payments Payment[] +} + +model Payment { + id String @id @default(cuid()) + + total Float + status PaymentStatus @default(PENDING) + + user User @relation(fields: [user_id], references: [id]) + user_id String + + created_at DateTime @default(now()) + updated_at DateTime @updatedAt +} diff --git a/services/payment/prisma/seed.ts b/services/payment/prisma/seed.ts new file mode 100644 index 00000000..931e0fb3 --- /dev/null +++ b/services/payment/prisma/seed.ts @@ -0,0 +1,82 @@ +import { PrismaClient, Prisma, PaymentStatus } from "@prisma/client"; + +const prisma = new PrismaClient(); + +const payments: Prisma.PaymentCreateInput[] = [ + { + id: "payment_id:1", + total: 100, + status: PaymentStatus.PENDING, + user: { + connectOrCreate: { + where: { + id: "user_id:1", + }, + create: { + id: "user_id:1", + name: "John Doe", + email: "honj@eod.com", + }, + }, + }, + }, + { + id: "payment_id:2", + total: 200, + status: PaymentStatus.APPROVED, + user: { + connectOrCreate: { + where: { + id: "user_id:2", + }, + create: { + id: "user_id:2", + name: "Jane Doe", + email: "janet@doe.com", + }, + }, + }, + }, + { + id: "payment_id:3", + total: 5, + status: PaymentStatus.REJECTED, + user: { + connectOrCreate: { + where: { + id: "user_id:1", + }, + create: { + id: "user_id:1", + name: "John Doe", + email: "honj@eod.com", + }, + }, + }, + }, +]; + +async function main() { + console.log(`Delete existing data ...`); + await prisma.payment.deleteMany(); + await prisma.user.deleteMany(); + console.log(`Existing data deleted.`); + + console.log(`Start seeding ...`); + for (const data of payments) { + const { id } = await prisma.payment.create({ data }); + console.log(`Created payment with id: ${id}`); + } + console.log(`Seeding finished.`); +} + +main() + .then(async () => { + await prisma.$disconnect(); + }) + .catch(async (e) => { + console.error(e); + await prisma.$disconnect(); + // @ts-ignore + process.exit(1); + }); diff --git a/services/payment/proto b/services/payment/proto new file mode 120000 index 00000000..4d1e2d8b --- /dev/null +++ b/services/payment/proto @@ -0,0 +1 @@ +../proto/ \ No newline at end of file diff --git a/services/payment/reflection_descriptor.bin b/services/payment/reflection_descriptor.bin new file mode 100644 index 0000000000000000000000000000000000000000..4ba1fbf44ae156a30482f4627ac96dd4b054e7ba GIT binary patch literal 2262 zcmbtW?Q+sU6m4ip%S{D(by|u#)%ewEl`4G$D6Ke1nIONMk*2V;QAjWwI>Q5W#_*hJ@A4DNmH$l)=8?V}PFJQm<{B1CmSd zc#22rEPxLo)i;CeGS9C00iJvSNis04er|;)!~t1!clev|>K)zL3R8iz`ie1B<>)rZ=KFmFbv{zuV*pLn8I3kU1e9SHd9QM}&IQ zg6O-j89-=h?DswkS%a-xNIGYZV+K@nfAGU*PrSXx}eAd%@ zkPE>LF~3>ZdWdC&q#%-fsG+~`i)mO78;#WacjCVlz_LqBk4(&k`7W}U!jGw$izya2 zZZZ9p{h!73t$U}%)PFHTtzmbXP|OcYgy7ws7tYRaak1Gw2V|>7rlg+gOn(9QCs1;> zQ?R`)}y?I3^EuY_C2rKkq zublw~-Gv^;H}i^wxP|z9fsOD5X?%P={{abGsJK=97oxwD!P3&z)s02Zow23o`x@iilWpysPMJ`=b=iF1|zMLGNnZu-yF literal 0 HcmV?d00001 diff --git a/services/payment/src/handlers/.gitinclude b/services/payment/src/handlers/.gitinclude new file mode 100644 index 00000000..e69de29b diff --git a/services/payment/src/handlers/payment/create.ts b/services/payment/src/handlers/payment/create.ts new file mode 100644 index 00000000..f70eaef3 --- /dev/null +++ b/services/payment/src/handlers/payment/create.ts @@ -0,0 +1,31 @@ +import { prisma } from "@payment/lib/prisma"; +import { log } from "@payment/lib/log"; +import { CreatePaymentRequest, Payment } from "@payment/types/payment"; +import { Data } from "@payment/types"; + +export const CreatePayment = async ( + { request }: Data, + callback: (err: any, response: Payment | null) => void +) => { + try { + const { total, user_id, name, email } = request; + + const payment = await prisma.payment.create({ + data: { + total, + user: { + connectOrCreate: { + where: { id: user_id }, + create: { id: user_id, name, email }, + }, + }, + }, + include: { user: true }, + }); + + callback(null, payment); + } catch (error) { + log.error(error); + callback(error, null); + } +}; diff --git a/services/payment/src/handlers/payment/get-user.ts b/services/payment/src/handlers/payment/get-user.ts new file mode 100644 index 00000000..616f33f5 --- /dev/null +++ b/services/payment/src/handlers/payment/get-user.ts @@ -0,0 +1,24 @@ +import { prisma } from "@payment/lib/prisma"; +import { log } from "@payment/lib/log"; +import { + GetPaymentsByUserRequest, + GetPaymentsByUserResponse, +} from "@payment/types/payment"; +import { Data } from "@payment/types"; + +export const GetPaymentsByUser = async ( + { request }: Data, + callback: (err: any, response: GetPaymentsByUserResponse | null) => void +) => { + try { + const { id } = request; + const payments = await prisma.payment.findMany({ + where: { user_id: id }, + include: { user: true }, + }); + callback(null, { payments }); + } catch (error) { + log.error(error); + callback(error, null); + } +}; diff --git a/services/payment/src/handlers/payment/get.ts b/services/payment/src/handlers/payment/get.ts new file mode 100644 index 00000000..3de482b3 --- /dev/null +++ b/services/payment/src/handlers/payment/get.ts @@ -0,0 +1,21 @@ +import { prisma } from "@payment/lib/prisma"; +import { log } from "@payment/lib/log"; +import { GetPaymentRequest, Payment } from "@payment/types/payment"; +import { Data } from "@payment/types"; + +export const GetPayment = async ( + { request }: Data, + callback: (err: any, response: Payment | null) => void +) => { + try { + const { id } = request; + const payment = await prisma.payment.findUniqueOrThrow({ + where: { id }, + include: { user: true }, + }); + callback(null, payment); + } catch (error) { + log.error(error); + callback(error, null); + } +}; diff --git a/services/payment/src/handlers/payment/index.ts b/services/payment/src/handlers/payment/index.ts new file mode 100644 index 00000000..42c8369f --- /dev/null +++ b/services/payment/src/handlers/payment/index.ts @@ -0,0 +1,15 @@ +import { UntypedServiceImplementation } from "@grpc/grpc-js"; + +import { CreatePayment } from "@payment/handlers/payment/create"; +import { GetPayment } from "@payment/handlers/payment/get"; +import { GetPaymentsByUser } from "@payment/handlers/payment/get-user"; +import { UpdatePayment } from "@payment/handlers/payment/update"; + +const paymentHandlers: UntypedServiceImplementation = { + CreatePayment, + GetPayment, + GetPaymentsByUser, + UpdatePayment, +}; + +export default paymentHandlers; diff --git a/services/payment/src/handlers/payment/update.ts b/services/payment/src/handlers/payment/update.ts new file mode 100644 index 00000000..34f6eca0 --- /dev/null +++ b/services/payment/src/handlers/payment/update.ts @@ -0,0 +1,23 @@ +import { prisma } from "@payment/lib/prisma"; +import { log } from "@payment/lib/log"; +import { UpdatePaymentRequest, Payment } from "@payment/types/payment"; +import { Data } from "@payment/types"; + +export const UpdatePayment = async ( + { request }: Data, + callback: (err: any, response: Payment | null) => void +) => { + try { + const { id, status } = request; + + const payment = await prisma.payment.update({ + where: { id }, + data: { status }, + include: { user: true }, + }); + callback(null, payment); + } catch (error) { + log.error(error); + callback(error, null); + } +}; diff --git a/services/payment/src/lib/amqp.ts b/services/payment/src/lib/amqp.ts new file mode 100644 index 00000000..38161cda --- /dev/null +++ b/services/payment/src/lib/amqp.ts @@ -0,0 +1,32 @@ +import amqp from "amqplib"; +import { msg } from "@payment/middleware/log"; +import { log } from "@payment/lib/log"; + +const DEFAULT_QUEUE = "log"; + +async function connectQueue(queue = DEFAULT_QUEUE) { + try { + const connection = await amqp.connect(process.env.AMQP_URL || ""); + const channel = await connection.createChannel(); + await channel.assertExchange(queue, "fanout", { durable: true }); + return channel; + } catch (error) { + return error as Error; + } +} + +const toLog = (message: any) => { + const { request, path } = message; + return { event_message: path, metadata: { request } }; +}; + +export const publish = async (message: any, queue = DEFAULT_QUEUE) => { + const channel = await connectQueue(queue); + if (channel instanceof Error) + return console.log("Error to connect to queue: ", channel); + channel.sendToQueue(queue, Buffer.from(JSON.stringify(toLog(message)))); + log.debug( + msg("AMQP", `${queue} (queue)`, new Date(), new Date()), + JSON.stringify(message) + ); +}; diff --git a/services/payment/src/lib/log.ts b/services/payment/src/lib/log.ts new file mode 100644 index 00000000..2404af54 --- /dev/null +++ b/services/payment/src/lib/log.ts @@ -0,0 +1,74 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ +/* eslint-disable no-console */ + +function getStackTrace() { + let stack; + + try { + throw new Error(""); + } catch (error) { + stack = (error as Error).stack || ""; + } + + stack = stack.split("\n").map((line) => line.trim()); + return stack.splice(stack[0] === "Error" ? 2 : 1); +} + +const getInitiator = () => { + // _getInitiatorLine, _ObjectInfoLine, caller + const [, , caller] = getStackTrace(); + const file = caller.split("/").at(-1) || ""; + return file.replace(")", ""); +}; + +const warn = (...args: any[]) => { + console.group( + `\x1b[33m${new Date().toISOString()} - WARN - ${getInitiator()}\x1b[0m` + ); + console.warn(...args); + console.groupEnd(); +}; +const error = (...args: any[]) => { + console.group( + `\x1b[31m${new Date().toISOString()} - ERROR - ${getInitiator()}\x1b[0m` + ); + console.error(...args); + console.groupEnd(); +}; +const info = (...args: any[]) => { + console.group( + `\x1b[34m${new Date().toISOString()} - INFO - ${getInitiator()}\x1b[0m` + ); + console.log(...args); + console.groupEnd(); +}; +const debug = (...args: any[]) => { + console.log(...args); +}; + +/** + * @description a simple interface logger for logging to the console and into a log drain in the future + * @example + * log.warn('this is a warning'); + * log.error('this is an error'); + * log.info('this is an info'); + * @exports log + */ +export const log = { + warn, + error, + info, + debug, +}; + +export const utils = { + bold: (text: string) => `\x1b[1m${text}\x1b[0m`, + red: (text: string) => `\x1b[31m${text}\x1b[0m`, + green: (text: string) => `\x1b[32m${text}\x1b[0m`, + yellow: (text: string) => `\x1b[33m${text}\x1b[0m`, + blue: (text: string) => `\x1b[34m${text}\x1b[0m`, + magenta: (text: string) => `\x1b[35m${text}\x1b[0m`, + cyan: (text: string) => `\x1b[36m${text}\x1b[0m`, + white: (text: string) => `\x1b[37m${text}\x1b[0m`, + gray: (text: string) => `\x1b[90m${text}\x1b[0m`, +}; diff --git a/services/payment/src/lib/prisma.ts b/services/payment/src/lib/prisma.ts new file mode 100644 index 00000000..4d495ef0 --- /dev/null +++ b/services/payment/src/lib/prisma.ts @@ -0,0 +1,29 @@ +import { Prisma, PrismaClient } from "@prisma/client"; + +let prisma: PrismaClient; +type GlobalWithPrisma = typeof globalThis & { + prisma: PrismaClient; +}; + +const OPTIONS: Prisma.PrismaClientOptions = { + log: + process.env.NEXT_PUBLIC_APP_ENV !== "production" + ? ["info", "warn"] + : undefined, +}; + +if (process.env.NODE_ENV === "production") { + prisma = new PrismaClient(OPTIONS); +} else { + // Ensure the prisma instance is re-used during hot-reloading + // Otherwise, a new client will be created on every reload + if (!("prisma" in global)) { + (global as GlobalWithPrisma).prisma = new PrismaClient(OPTIONS); + } + + prisma = (global as GlobalWithPrisma).prisma; +} + +export default prisma; + +export { prisma }; diff --git a/services/payment/src/lib/proxy.ts b/services/payment/src/lib/proxy.ts new file mode 100644 index 00000000..becdaabb --- /dev/null +++ b/services/payment/src/lib/proxy.ts @@ -0,0 +1,132 @@ +import { Server, status } from "@grpc/grpc-js"; + +const getType = (method: { + requestStream: boolean; + responseStream: boolean; +}) => { + if (method.requestStream === false && method.responseStream === false) { + return "unary"; + } + return "unknown"; +}; + + +const lookupServiceMetadata = (service: { [x: string]: any }) => { + const serviceKeys = Object.keys(service); + const intersectingMethods = serviceKeys.reduce((acc, k) => { + const method = service[k]; + if (!method) { + throw new Error(`cannot find method ${k} on service`); + } + const components = method.path.split("/"); + acc[k] = { + name: components[1], + method: components[2], + type: getType(method), + path: method.path, + responseType: method.responseType, + requestType: method.requestType, + }; + return acc; + }, {} as any); + + return (key: string) => intersectingMethods[key]; +}; + +export const handler = { + get( + target: { + [x: string]: any; + intercept: () => any; + addService: (arg0: any, arg1: {}) => any; + }, + propKey: string + ) { + if (propKey !== "addService") { + return target[propKey]; + } + return (service: any, implementation: { [x: string]: any }) => { + const newImplementation = {} as any; + const lookup = lookupServiceMetadata(service); + for (const k in implementation) { + const name = k; + const fn = implementation[k]; + newImplementation[name] = (call: any, callback: any) => { + const ctx = { + call, + name, + service: lookup(name), + status: { + code: status.UNKNOWN, + details: "", + }, + }; + const newCallback = (callback: (arg0: any) => void) => { + return (...args: any[]) => { + ctx.status = { + code: status.OK, + details: "", + }; + const err = args[0]; + if (err) { + ctx.status = { + code: status.UNKNOWN, + details: err, + }; + } + // @ts-ignore + callback(...args); + }; + }; + + const interceptors = target.intercept(); + const first = interceptors.next(); + if (!first.value) { + // if we don't have any interceptors + return new Promise((resolve) => { + return resolve(fn(call, newCallback(callback))); + }); + } + first.value(ctx, function next() { + return new Promise((resolve) => { + const i = interceptors.next(); + if (i.done) { + return resolve(fn(call, newCallback(callback))); + } + return resolve(i.value(ctx, next)); + }); + }); + }; + } + return target.addService(service, newImplementation); + }; + }, +}; + +export const createServerProxy = ( + server: Server +): Server & { + intercept: Generator; + interceptors: any[]; + use: (fn: any) => void; +} => { + // @ts-ignore + server.interceptors = []; + // @ts-ignore + server.use = (fn: any) => { + // @ts-ignore + server.interceptors.push(fn); + }; + // @ts-ignore + server.intercept = function* intercept() { + let i = 0; + // @ts-ignore + while (i < server.interceptors.length) { + // @ts-ignore + yield server.interceptors[i]; + i++; + } + }; + // @ts-ignore + return new Proxy(server, handler); +}; diff --git a/services/payment/src/lib/reflection.ts b/services/payment/src/lib/reflection.ts new file mode 100644 index 00000000..060091b0 --- /dev/null +++ b/services/payment/src/lib/reflection.ts @@ -0,0 +1,23 @@ +import { Server } from "@grpc/grpc-js"; +import { log } from "@payment/lib/log"; +import { access, constants } from "fs"; +import { addReflection as base_addReflection } from "grpc-server-reflection"; +import { resolve as resolvePath } from "path"; + +export const addReflection = (server: Server, path: string) => { + if (process.env.NODE_ENV === "production") { + log.warn("Reflection is disabled in production"); + return; + } + + const resolvedPath = resolvePath(path); + try { + access(resolvedPath, constants.R_OK, () => {}); + + base_addReflection(server, path); + } catch (err) { + console.log("here"); + log.warn(`Reflection file ${resolvedPath} is not readable`); + return; + } +}; diff --git a/services/payment/src/lib/struct.ts b/services/payment/src/lib/struct.ts new file mode 100644 index 00000000..b1b7f50e --- /dev/null +++ b/services/payment/src/lib/struct.ts @@ -0,0 +1,53 @@ +import { Prisma } from "@prisma/client"; + +export type Struct = { + fields: { + [key: string]: { + kind: string; + [key: string]: any; + }; + }; +}; + +export const parseStruct = (struct: Struct) => { + if (!struct) return null; + const fields = struct.fields; + + if (!fields || Object.keys(fields).length === 0) return null; + + const parsed = Object.entries(fields).reduce((acc: any, [key, value]) => { + return { + ...acc, + [key]: value[value.kind], + }; + }, {}); + + return parsed; +}; + +export const toStruct = ( + obj: { [key: string]: any } | Prisma.JsonValue | null +): Struct => { + if (!obj) return { fields: {} }; + const fields = Object.entries(obj).reduce((acc: any, [key, value]) => { + if (typeof value === "object") { + return { + ...acc, + [key]: { + kind: "structValue", + structValue: toStruct(value), + }, + }; + } + + return { + ...acc, + [key]: { + kind: `${typeof value}Value`, + [`${typeof value}Value`]: value, + }, + }; + }, {}); + + return { fields }; +}; diff --git a/services/payment/src/middleware/log.ts b/services/payment/src/middleware/log.ts new file mode 100644 index 00000000..6ef3eddc --- /dev/null +++ b/services/payment/src/middleware/log.ts @@ -0,0 +1,42 @@ +import { publish } from "@payment/lib/amqp"; +import { utils } from "@payment/lib/log"; +import { log } from "@payment/lib/log"; + +type Context = { + call: { + request: Map; + }; + service: { + path: string; + }; +}; + +const parseContext = (ctx: Context) => { + const { + call: { request }, + service: { path }, + } = ctx; + return { request, path }; +}; + +export const msg = ( + type: "GRPC" | "AMQP", + path: string | undefined, + requestAt: Date, + responseAt: Date +) => + `${utils.magenta(requestAt.toISOString())} | ${utils[ + type === "GRPC" ? "cyan" : "red" + ](type)}${path ? ` | ${utils.yellow(path)}` : ""} | ${utils.green( + responseAt.getTime() - requestAt.getTime() + "ms" + )} |`; + +export const logGRPC = async (ctx: Context, next: () => Promise) => { + const requestAt = new Date(); + await next(); + const responseAt = new Date(); + let { request, path } = parseContext(ctx); + path = path?.split(".").at(-1) || ""; + publish({ request, path }, "log"); + log.debug(msg("GRPC", path, requestAt, responseAt), JSON.stringify(request)); +}; diff --git a/services/payment/src/resources/grpc-credentials.ts b/services/payment/src/resources/grpc-credentials.ts new file mode 100644 index 00000000..75a2b5d5 --- /dev/null +++ b/services/payment/src/resources/grpc-credentials.ts @@ -0,0 +1,5 @@ +import { credentials, ServerCredentials } from "@grpc/grpc-js"; + +export const insecure = credentials.createInsecure(); + +export const serverInsecure = ServerCredentials.createInsecure(); diff --git a/services/payment/src/resources/protoloader-options.ts b/services/payment/src/resources/protoloader-options.ts new file mode 100644 index 00000000..5022d96d --- /dev/null +++ b/services/payment/src/resources/protoloader-options.ts @@ -0,0 +1,7 @@ +export const options = { + keepCase: true, + longs: String, + enums: String, + defaults: true, + oneofs: true, +}; diff --git a/services/payment/src/server.ts b/services/payment/src/server.ts new file mode 100644 index 00000000..2a5aede5 --- /dev/null +++ b/services/payment/src/server.ts @@ -0,0 +1,43 @@ +import "dotenv/config"; +import { resolve as resolvePath } from "path"; + +import { loadSync } from "@grpc/proto-loader"; +import { loadPackageDefinition, Server } from "@grpc/grpc-js"; + +import { log, utils } from "@payment/lib/log"; +import { options } from "@payment/resources/protoloader-options"; +import { serverInsecure } from "@payment/resources/grpc-credentials"; +import { addReflection } from "@payment/lib/reflection"; +import { createServerProxy } from "@payment/lib/proxy"; +import { logGRPC } from "@payment/middleware/log"; +import paymentHandlers from "@payment/handlers/payment"; + +const PORT = process.env.PORT || 50003; +const ADDRESS = `0.0.0.0:${PORT}`; + +const PROTO_PATH = resolvePath(__dirname + "/../../proto/payment.proto"); +const REFLECTION_PATH = resolvePath( + __dirname + "/../reflection_descriptor.bin" +); + +const packageDefinition = loadSync(PROTO_PATH, options); +const grpc = loadPackageDefinition(packageDefinition) as any; +const { service: p } = grpc.com.goodfood.payment.PaymentService; + +// const server = new Server(); + +const server = createServerProxy(new Server()); +server.addService(p, paymentHandlers); +server.use(logGRPC); + +server.bindAsync(ADDRESS, serverInsecure, () => { + server.start(); + addReflection(server, REFLECTION_PATH); + const message = + `---- ${utils.green("good")}${utils.yellow("food")} Payment Service ----` + + `\n` + + `started on: ${utils.bold(ADDRESS)} ${utils.green("✓")}\n`; + log.debug(message); +}); + +export default server; diff --git a/services/payment/src/types/index.d.ts b/services/payment/src/types/index.d.ts new file mode 100644 index 00000000..39126f25 --- /dev/null +++ b/services/payment/src/types/index.d.ts @@ -0,0 +1,3 @@ +export type Data = { + request: T; +}; \ No newline at end of file diff --git a/services/payment/src/types/payment.d.ts b/services/payment/src/types/payment.d.ts new file mode 100644 index 00000000..d397e04b --- /dev/null +++ b/services/payment/src/types/payment.d.ts @@ -0,0 +1,44 @@ +// import { Prisma } from "@prisma/client"; + +import { PaymentStatus } from "@prisma/client"; + +export type User = { + id: string; + name: string; + email: string; +}; + +export type Payment = { + id: string; + total: number; + status: PaymentStatus; + user: User; + user_id: string; + + created_at: Date | string; + updated_at: Date | string; +}; + +export type GetPaymentRequest = { + id: string; +}; + +export type GetPaymentsByUserRequest = { + id: string; +}; +export type GetPaymentsByUserResponse = { + payments: Payment[]; +}; + +export type CreatePaymentRequest = { + total: number; + + user_id: string; + name: string; + email: string; +}; + +export type UpdatePaymentRequest = { + id: string; + status: PaymentStatus; +}; diff --git a/services/payment/terraform/data.tf b/services/payment/terraform/data.tf new file mode 100644 index 00000000..7b4bb3bb --- /dev/null +++ b/services/payment/terraform/data.tf @@ -0,0 +1,17 @@ +data "azurerm_resource_group" "rg-goodfood" { + name = "rg-${var.project_name}${var.environnment_suffix}" +} + +data "azurerm_key_vault" "kv-goodfood-payment" { + resource_group_name = data.azurerm_resource_group.rg-goodfood.name + name = "kv-${var.project_name}" +} + +data "azurerm_key_vault_secret" "payment-db-login" { + name = "payment-db-login" + key_vault_id = data.azurerm_key_vault.kv-goodfood-payment.id +} +data "azurerm_key_vault_secret" "payment-db-password" { + name = "payment-db-password" + key_vault_id = data.azurerm_key_vault.kv-goodfood-payment.id +} \ No newline at end of file diff --git a/services/payment/terraform/env/dev-backend.tfvars.example b/services/payment/terraform/env/dev-backend.tfvars.example new file mode 100644 index 00000000..13bd462d --- /dev/null +++ b/services/payment/terraform/env/dev-backend.tfvars.example @@ -0,0 +1,4 @@ +resource_group_name = "rg-goodfood-dev" +storage_account_name = "sa-goodfood-states" +container_name = "tfstate" +key = "payment-dev.tfstate" diff --git a/services/payment/terraform/env/dev.tfvars.example b/services/payment/terraform/env/dev.tfvars.example new file mode 100644 index 00000000..4ac1f44d --- /dev/null +++ b/services/payment/terraform/env/dev.tfvars.example @@ -0,0 +1 @@ +environnment_suffix = "-dev" diff --git a/services/payment/terraform/main.tf b/services/payment/terraform/main.tf new file mode 100644 index 00000000..f6af9cba --- /dev/null +++ b/services/payment/terraform/main.tf @@ -0,0 +1,74 @@ +terraform { + required_providers { + azurerm = { + source = "hashicorp/azurerm" + version = "3.48.0" + } + } + backend "azurerm" {} +} + +provider "azurerm" { + features { + key_vault { + purge_soft_deleted_secrets_on_destroy = true + recover_soft_deleted_secrets = true + } + } +} + +resource "azurerm_key_vault" "kv-goodfood-payment" { + name = "kv-goodfood-payment" + location = data.azurerm_resource_group.rg-goodfood.location + resource_group_name = data.azurerm_resource_group.rg-goodfood.name + tenant_id = data.azurerm_client_config.current.tenant_id + sku_name = "standard" + soft_delete_retention_days = 7 + + access_policy { + tenant_id = data.azurerm_client_config.current.tenant_id + object_id = data.azurerm_client_config.current.object_id + + key_permissions = [ + "Create", + "Get", + ] + + secret_permissions = [ + "Set", + "Get", + "Delete", + "Purge", + "Recover" + ] + } +} + +resource "azurerm_postgresql_server" "pg-goodfood-payment" { + name = "pg-goodfood-payment${var.environnment_suffix}" + location = data.azurerm_resource_group.rg-goodfood.location + resource_group_name = data.azurerm_resource_group.rg-goodfood.name + + sku_name = "B_Gen5_2" + + storage_mb = 5120 + backup_retention_days = 7 + geo_redundant_backup_enabled = false + auto_grow_enabled = true + + administrator_login = data.azurerm_key_vault_secret.payment-db-login.value + administrator_login_password = data.azurerm_key_vault_secret.payment-db-password.value + version = "11" + + ssl_enforcement_enabled = false + ssl_minimal_tls_version_enforced = "TLSEnforcementDisabled" // TODO: change to TLS1_2 + +} + +resource "azurerm_postgresql_firewall_rule" "pgfw-goodfood-payment" { + name = "allow-azure-resources" + resource_group_name = data.azurerm_resource_group.rg-goodfood.name + server_name = azurerm_postgresql_server.pg-goodfood-payment.name + start_ip_address = "0.0.0.0" + end_ip_address = "0.0.0.0" +} diff --git a/services/payment/terraform/outputs.tf b/services/payment/terraform/outputs.tf new file mode 100644 index 00000000..a2d60616 --- /dev/null +++ b/services/payment/terraform/outputs.tf @@ -0,0 +1,6 @@ +output "main-rg-name" { + value = data.azurerm_resource_group.rg-goodfood.name +} +output "main-rg-id" { + value = data.azurerm_resource_group.rg-goodfood.id +} \ No newline at end of file diff --git a/services/payment/terraform/variables.tf b/services/payment/terraform/variables.tf new file mode 100644 index 00000000..65fd7547 --- /dev/null +++ b/services/payment/terraform/variables.tf @@ -0,0 +1,16 @@ +variable "environnment_suffix" { + type = string + description = "The suffix to append to the environment name" +} + +variable "location" { + type = string + description = "The location/region where all resources in this environment should be created" + default = "West Europe" +} + +variable "project_name" { + type = string + description = "The name of the project" + default = "goodfood" +} \ No newline at end of file diff --git a/services/payment/tsconfig.json b/services/payment/tsconfig.json new file mode 100644 index 00000000..8b50cab9 --- /dev/null +++ b/services/payment/tsconfig.json @@ -0,0 +1,18 @@ +{ + "compilerOptions": { + "sourceMap": true, + "outDir": "dist", + "strict": true, + "lib": ["esnext"], + "esModuleInterop": true, + "baseUrl": ".", + "paths": { + "@payment/*": ["src/*"] + } + }, + "include": ["src/**/*.ts"], + "exclude": ["node_modules"], + "ts-node": { + "require": ["tsconfig-paths/register"] + } +} diff --git a/services/payment/vitest.config.ts b/services/payment/vitest.config.ts new file mode 100644 index 00000000..773de309 --- /dev/null +++ b/services/payment/vitest.config.ts @@ -0,0 +1,10 @@ +import { defineConfig } from "vitest/config"; +import tsconfigPaths from "vite-tsconfig-paths"; + +export default defineConfig({ + plugins: [tsconfigPaths()], + base: "/src/tests", + // test: { + // setupFiles: ["./src/tests/setup.ts"], + // }, +}); diff --git a/services/proto/payment.proto b/services/proto/payment.proto new file mode 100644 index 00000000..5cc04768 --- /dev/null +++ b/services/proto/payment.proto @@ -0,0 +1,56 @@ +syntax = "proto3"; + +package com.goodfood.payment; + + +message User { + string id = 1; + + string name = 2; + string email = 3; +} + +message Payment { + string id = 1; + + float total = 2; + string status = 3; + + User user = 4; + string user_id = 5; + + string createdAt = 6; + string updatedAt = 7; +} + +service PaymentService { + rpc GetPayment(GetPaymentRequest) returns (Payment) {} + rpc GetPaymentsByUser(GetPaymentsByUserRequest) returns (GetPaymentsByUserResponse) {} + rpc CreatePayment(CreatePaymentRequest) returns (Payment) {} + rpc UpdatePayment(UpdatePaymentRequest) returns (Payment) {} +} + +message GetPaymentRequest { + string id = 1; +} + +message GetPaymentsByUserRequest { + string id = 1; +} + +message GetPaymentsByUserResponse { + repeated Payment payments = 1; +} + +message CreatePaymentRequest { + float total = 1; + string userId = 2; + + string name = 3; + string email = 4; +} + +message UpdatePaymentRequest { + string id = 1; + string status = 2; +} From bcf389098fda1db4090d1b8673946accf45dbed7 Mon Sep 17 00:00:00 2001 From: Florian LEROUX Date: Fri, 4 Aug 2023 23:24:00 +0200 Subject: [PATCH 339/883] feat(stripe): add stripe checkout session and webhook --- services/payment/.env.example | 8 +- services/payment/package.json | 5 +- services/payment/pnpm-lock.yaml | 477 +++++++++++++++++- .../migration.sql | 12 + services/payment/prisma/schema.prisma | 3 +- services/payment/prisma/seed.ts | 3 + .../payment/src/handlers/payment/create.ts | 31 -- .../payment/src/handlers/payment/get-user.ts | 8 +- services/payment/src/handlers/payment/get.ts | 6 +- .../payment/src/handlers/payment/index.ts | 4 - .../payment/src/handlers/payment/update.ts | 23 - .../stripe/create-checkout-session.ts | 59 +++ services/payment/src/handlers/stripe/index.ts | 7 + .../payment/src/handlers/stripe/webhook.ts | 87 ++++ services/payment/src/lib/stripe.ts | 8 + services/payment/src/server.ts | 8 +- services/payment/src/types/payment.d.ts | 13 - services/payment/src/types/stripe.d.ts | 13 + services/proto/payment.proto | 21 +- 19 files changed, 706 insertions(+), 90 deletions(-) create mode 100644 services/payment/prisma/migrations/20230804142527_add_stripe_id/migration.sql delete mode 100644 services/payment/src/handlers/payment/create.ts delete mode 100644 services/payment/src/handlers/payment/update.ts create mode 100644 services/payment/src/handlers/stripe/create-checkout-session.ts create mode 100644 services/payment/src/handlers/stripe/index.ts create mode 100644 services/payment/src/handlers/stripe/webhook.ts create mode 100644 services/payment/src/lib/stripe.ts create mode 100644 services/payment/src/types/stripe.d.ts diff --git a/services/payment/.env.example b/services/payment/.env.example index fe2eb7b2..7e687d7e 100644 --- a/services/payment/.env.example +++ b/services/payment/.env.example @@ -1,4 +1,10 @@ DATABASE_URL=postgres://postgres:password@localhost:5432/postgres AMQP_URL=amqp://guest:guest@localhost -PORT=50003 \ No newline at end of file +PORT=50003 + +STRIPE_API_KEY= +STRIPE_API_SECRET= +STRIPE_WEBHOOK_ENDPOINT="/webhook" +STRIPE_WEBHOOK_SECRET= +STRIPE_WEBHOOK_PORT=4242 \ No newline at end of file diff --git a/services/payment/package.json b/services/payment/package.json index dec0bacc..e41e4af8 100644 --- a/services/payment/package.json +++ b/services/payment/package.json @@ -19,11 +19,14 @@ "@prisma/client": "5.1.1", "amqplib": "^0.10.3", "dotenv": "^16.0.3", + "express": "^4.18.2", "grpc-server-reflection": "^0.1.5", - "protobufjs": "7.2.2" + "protobufjs": "7.2.2", + "stripe": "^12.17.0" }, "devDependencies": { "@types/amqplib": "^0.10.1", + "@types/express": "^4.17.17", "@types/node": "18.15.9", "esbuild": "^0.17.18", "grpc-tools": "^1.12.4", diff --git a/services/payment/pnpm-lock.yaml b/services/payment/pnpm-lock.yaml index 87352acc..7bde3f1c 100644 --- a/services/payment/pnpm-lock.yaml +++ b/services/payment/pnpm-lock.yaml @@ -20,17 +20,26 @@ dependencies: dotenv: specifier: ^16.0.3 version: 16.0.3 + express: + specifier: ^4.18.2 + version: 4.18.2 grpc-server-reflection: specifier: ^0.1.5 version: 0.1.5 protobufjs: specifier: 7.2.2 version: 7.2.2 + stripe: + specifier: ^12.17.0 + version: 12.17.0 devDependencies: '@types/amqplib': specifier: ^0.10.1 version: 0.10.1 + '@types/express': + specifier: ^4.17.17 + version: 4.17.17 '@types/node': specifier: 18.15.9 version: 18.15.9 @@ -511,6 +520,13 @@ packages: '@types/node': 18.15.9 dev: true + /@types/body-parser@1.19.2: + resolution: {integrity: sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==} + dependencies: + '@types/connect': 3.4.35 + '@types/node': 18.15.9 + dev: true + /@types/chai-subset@1.3.3: resolution: {integrity: sha512-frBecisrNGz+F4T6bcc+NLeolfiojh5FxW2klu669+8BARtyQv2C/GkNW6FUodVe4BroGMP/wER/YDGc7rEllw==} dependencies: @@ -521,13 +537,72 @@ packages: resolution: {integrity: sha512-mEo1sAde+UCE6b2hxn332f1g1E8WfYRu6p5SvTKr2ZKC1f7gFJXk4h5PyGP9Dt6gCaG8y8XhwnXWC6Iy2cmBng==} dev: true + /@types/connect@3.4.35: + resolution: {integrity: sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==} + dependencies: + '@types/node': 18.15.9 + dev: true + + /@types/express-serve-static-core@4.17.35: + resolution: {integrity: sha512-wALWQwrgiB2AWTT91CB62b6Yt0sNHpznUXeZEcnPU3DRdlDIz74x8Qg1UUYKSVFi+va5vKOLYRBI1bRKiLLKIg==} + dependencies: + '@types/node': 18.15.9 + '@types/qs': 6.9.7 + '@types/range-parser': 1.2.4 + '@types/send': 0.17.1 + dev: true + + /@types/express@4.17.17: + resolution: {integrity: sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==} + dependencies: + '@types/body-parser': 1.19.2 + '@types/express-serve-static-core': 4.17.35 + '@types/qs': 6.9.7 + '@types/serve-static': 1.15.2 + dev: true + + /@types/http-errors@2.0.1: + resolution: {integrity: sha512-/K3ds8TRAfBvi5vfjuz8y6+GiAYBZ0x4tXv1Av6CWBWn0IlADc+ZX9pMq7oU0fNQPnBwIZl3rmeLp6SBApbxSQ==} + dev: true + /@types/long@4.0.2: resolution: {integrity: sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==} dev: false + /@types/mime@1.3.2: + resolution: {integrity: sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==} + dev: true + + /@types/mime@3.0.1: + resolution: {integrity: sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA==} + dev: true + /@types/node@18.15.9: resolution: {integrity: sha512-dUxhiNzBLr6IqlZXz6e/rN2YQXlFgOei/Dxy+e3cyXTJ4txSUbGT2/fmnD6zd/75jDMeW5bDee+YXxlFKHoV0A==} + /@types/qs@6.9.7: + resolution: {integrity: sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==} + dev: true + + /@types/range-parser@1.2.4: + resolution: {integrity: sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==} + dev: true + + /@types/send@0.17.1: + resolution: {integrity: sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q==} + dependencies: + '@types/mime': 1.3.2 + '@types/node': 18.15.9 + dev: true + + /@types/serve-static@1.15.2: + resolution: {integrity: sha512-J2LqtvFYCzaj8pVYKw8klQXrLLk7TBZmQ4ShlcdkELFKGwGMfevMLneMMRkMgZxotOD9wg497LpC7O8PcvAmfw==} + dependencies: + '@types/http-errors': 2.0.1 + '@types/mime': 3.0.1 + '@types/node': 18.15.9 + dev: true + /@vitest/expect@0.29.8: resolution: {integrity: sha512-xlcVXn5I5oTq6NiZSY3ykyWixBxr5mG8HYtjvpgg6KaqHm0mvhX18xuwl5YGxIRNt/A5jidd7CWcNHrSvgaQqQ==} dependencies: @@ -563,6 +638,14 @@ packages: resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} dev: true + /accepts@1.3.8: + resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} + engines: {node: '>= 0.6'} + dependencies: + mime-types: 2.1.35 + negotiator: 0.6.3 + dev: false + /acorn-walk@8.2.0: resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} engines: {node: '>=0.4.0'} @@ -644,6 +727,10 @@ packages: resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} dev: true + /array-flatten@1.1.1: + resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} + dev: false + /array-union@2.1.0: resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} engines: {node: '>=8'} @@ -679,6 +766,26 @@ packages: readable-stream: 3.6.2 dev: true + /body-parser@1.20.1: + resolution: {integrity: sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + dependencies: + bytes: 3.1.2 + content-type: 1.0.5 + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + on-finished: 2.4.1 + qs: 6.11.0 + raw-body: 2.5.1 + type-is: 1.6.18 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color + dev: false + /brace-expansion@1.1.11: resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} dependencies: @@ -704,11 +811,23 @@ packages: ieee754: 1.2.1 dev: true + /bytes@3.1.2: + resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} + engines: {node: '>= 0.8'} + dev: false + /cac@6.7.14: resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} engines: {node: '>=8'} dev: true + /call-bind@1.0.2: + resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==} + dependencies: + function-bind: 1.1.1 + get-intrinsic: 1.2.1 + dev: false + /chai@4.3.7: resolution: {integrity: sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==} engines: {node: '>=4'} @@ -795,6 +914,27 @@ packages: resolution: {integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==} dev: true + /content-disposition@0.5.4: + resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} + engines: {node: '>= 0.6'} + dependencies: + safe-buffer: 5.2.1 + dev: false + + /content-type@1.0.5: + resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} + engines: {node: '>= 0.6'} + dev: false + + /cookie-signature@1.0.6: + resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} + dev: false + + /cookie@0.5.0: + resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==} + engines: {node: '>= 0.6'} + dev: false + /core-util-is@1.0.3: resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} @@ -802,6 +942,17 @@ packages: resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} dev: true + /debug@2.6.9: + resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.0.0 + dev: false + /debug@3.2.7(supports-color@5.5.0): resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} peerDependencies: @@ -848,6 +999,16 @@ packages: resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==} dev: true + /depd@2.0.0: + resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} + engines: {node: '>= 0.8'} + dev: false + + /destroy@1.2.0: + resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + dev: false + /detect-libc@2.0.1: resolution: {integrity: sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==} engines: {node: '>=8'} @@ -879,6 +1040,10 @@ packages: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} dev: true + /ee-first@1.1.1: + resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + dev: false + /emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} @@ -886,6 +1051,11 @@ packages: resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} dev: true + /encodeurl@1.0.2: + resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} + engines: {node: '>= 0.8'} + dev: false + /end-of-stream@1.4.4: resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} dependencies: @@ -926,11 +1096,59 @@ packages: resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} engines: {node: '>=6'} + /escape-html@1.0.3: + resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + dev: false + + /etag@1.8.1: + resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} + engines: {node: '>= 0.6'} + dev: false + /expand-template@2.0.3: resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} engines: {node: '>=6'} dev: true + /express@4.18.2: + resolution: {integrity: sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==} + engines: {node: '>= 0.10.0'} + dependencies: + accepts: 1.3.8 + array-flatten: 1.1.1 + body-parser: 1.20.1 + content-disposition: 0.5.4 + content-type: 1.0.5 + cookie: 0.5.0 + cookie-signature: 1.0.6 + debug: 2.6.9 + depd: 2.0.0 + encodeurl: 1.0.2 + escape-html: 1.0.3 + etag: 1.8.1 + finalhandler: 1.2.0 + fresh: 0.5.2 + http-errors: 2.0.0 + merge-descriptors: 1.0.1 + methods: 1.1.2 + on-finished: 2.4.1 + parseurl: 1.3.3 + path-to-regexp: 0.1.7 + proxy-addr: 2.0.7 + qs: 6.11.0 + range-parser: 1.2.1 + safe-buffer: 5.2.1 + send: 0.18.0 + serve-static: 1.15.0 + setprototypeof: 1.2.0 + statuses: 2.0.1 + type-is: 1.6.18 + utils-merge: 1.0.1 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + dev: false + /fast-glob@3.2.12: resolution: {integrity: sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==} engines: {node: '>=8.6.0'} @@ -955,6 +1173,31 @@ packages: to-regex-range: 5.0.1 dev: true + /finalhandler@1.2.0: + resolution: {integrity: sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==} + engines: {node: '>= 0.8'} + dependencies: + debug: 2.6.9 + encodeurl: 1.0.2 + escape-html: 1.0.3 + on-finished: 2.4.1 + parseurl: 1.3.3 + statuses: 2.0.1 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color + dev: false + + /forwarded@0.2.0: + resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} + engines: {node: '>= 0.6'} + dev: false + + /fresh@0.5.2: + resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} + engines: {node: '>= 0.6'} + dev: false + /from2@2.3.0: resolution: {integrity: sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==} dependencies: @@ -997,7 +1240,6 @@ packages: /function-bind@1.1.1: resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} - dev: true /gauge@3.0.2: resolution: {integrity: sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==} @@ -1022,6 +1264,15 @@ packages: resolution: {integrity: sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==} dev: true + /get-intrinsic@1.2.1: + resolution: {integrity: sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==} + dependencies: + function-bind: 1.1.1 + has: 1.0.3 + has-proto: 1.0.1 + has-symbols: 1.0.3 + dev: false + /github-from-package@0.0.0: resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==} dev: true @@ -1095,6 +1346,16 @@ packages: engines: {node: '>=8'} dev: true + /has-proto@1.0.1: + resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} + engines: {node: '>= 0.4'} + dev: false + + /has-symbols@1.0.3: + resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} + engines: {node: '>= 0.4'} + dev: false + /has-unicode@2.0.1: resolution: {integrity: sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==} dev: true @@ -1104,7 +1365,17 @@ packages: engines: {node: '>= 0.4.0'} dependencies: function-bind: 1.1.1 - dev: true + + /http-errors@2.0.0: + resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} + engines: {node: '>= 0.8'} + dependencies: + depd: 2.0.0 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 2.0.1 + toidentifier: 1.0.1 + dev: false /https-proxy-agent@5.0.1: resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} @@ -1116,6 +1387,13 @@ packages: - supports-color 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 + /ieee754@1.2.1: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} dev: true @@ -1151,6 +1429,11 @@ packages: p-is-promise: 3.0.0 dev: true + /ipaddr.js@1.9.1: + resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} + engines: {node: '>= 0.10'} + dev: false + /is-binary-path@2.1.0: resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} engines: {node: '>=8'} @@ -1269,11 +1552,25 @@ packages: resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} dev: true + /media-typer@0.3.0: + resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} + engines: {node: '>= 0.6'} + dev: false + + /merge-descriptors@1.0.1: + resolution: {integrity: sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==} + dev: false + /merge2@1.4.1: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} dev: true + /methods@1.1.2: + resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} + engines: {node: '>= 0.6'} + dev: false + /micromatch@4.0.5: resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} engines: {node: '>=8.6'} @@ -1282,6 +1579,24 @@ packages: picomatch: 2.3.1 dev: true + /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 + + /mime@1.6.0: + resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} + engines: {node: '>=4'} + hasBin: true + dev: false + /mimic-response@3.1.0: resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} engines: {node: '>=10'} @@ -1336,12 +1651,15 @@ packages: ufo: 1.1.2 dev: true + /ms@2.0.0: + resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} + dev: false + /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: true /multistream@4.1.0: resolution: {integrity: sha512-J1XDiAmmNpRCBfIWJv+n0ymC4ABcf/Pl+5YvC5B/D2f/2+8PtHvCNxMPKiQcZyi922Hq69J2YOpb1pTywfifyw==} @@ -1360,6 +1678,11 @@ packages: resolution: {integrity: sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==} dev: true + /negotiator@0.6.3: + resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} + engines: {node: '>= 0.6'} + dev: false + /node-abi@3.40.0: resolution: {integrity: sha512-zNy02qivjjRosswoYmPi8hIKJRr8MpQyeKT6qlcq/OnOgA3Rhoae+IYOqsM9V5+JnHWmxKnWOT2GxvtqdtOCXA==} engines: {node: '>=10'} @@ -1430,6 +1753,17 @@ packages: engines: {node: '>=0.10.0'} dev: true + /object-inspect@1.12.3: + resolution: {integrity: sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==} + dev: false + + /on-finished@2.4.1: + resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} + engines: {node: '>= 0.8'} + dependencies: + ee-first: 1.1.1 + dev: false + /once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} dependencies: @@ -1448,6 +1782,11 @@ packages: yocto-queue: 1.0.0 dev: true + /parseurl@1.3.3: + resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} + engines: {node: '>= 0.8'} + dev: false + /path-is-absolute@1.0.1: resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} engines: {node: '>=0.10.0'} @@ -1457,6 +1796,10 @@ packages: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} dev: true + /path-to-regexp@0.1.7: + resolution: {integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==} + dev: false + /path-type@4.0.0: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} @@ -1605,6 +1948,14 @@ packages: long: 5.2.3 dev: false + /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 + dev: false + /pstree.remy@1.1.8: resolution: {integrity: sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==} dev: true @@ -1616,6 +1967,20 @@ packages: once: 1.4.0 dev: true + /qs@6.11.0: + resolution: {integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==} + engines: {node: '>=0.6'} + dependencies: + side-channel: 1.0.4 + dev: false + + /qs@6.11.2: + resolution: {integrity: sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==} + engines: {node: '>=0.6'} + dependencies: + side-channel: 1.0.4 + dev: false + /querystringify@2.2.0: resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} dev: false @@ -1624,6 +1989,21 @@ packages: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} dev: true + /range-parser@1.2.1: + resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} + engines: {node: '>= 0.6'} + dev: false + + /raw-body@2.5.1: + resolution: {integrity: sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==} + engines: {node: '>= 0.8'} + dependencies: + bytes: 3.1.2 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + unpipe: 1.0.0 + dev: false + /rc@1.2.8: resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} hasBin: true @@ -1723,7 +2103,10 @@ packages: /safe-buffer@5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - dev: true + + /safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + dev: false /semver@5.7.1: resolution: {integrity: sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==} @@ -1748,10 +2131,55 @@ packages: lru-cache: 6.0.0 dev: true + /send@0.18.0: + resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==} + engines: {node: '>= 0.8.0'} + dependencies: + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + encodeurl: 1.0.2 + escape-html: 1.0.3 + etag: 1.8.1 + fresh: 0.5.2 + http-errors: 2.0.0 + mime: 1.6.0 + ms: 2.1.3 + on-finished: 2.4.1 + range-parser: 1.2.1 + statuses: 2.0.1 + transitivePeerDependencies: + - supports-color + dev: false + + /serve-static@1.15.0: + resolution: {integrity: sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==} + engines: {node: '>= 0.8.0'} + dependencies: + encodeurl: 1.0.2 + escape-html: 1.0.3 + parseurl: 1.3.3 + send: 0.18.0 + transitivePeerDependencies: + - supports-color + dev: false + /set-blocking@2.0.0: resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} dev: true + /setprototypeof@1.2.0: + resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + dev: false + + /side-channel@1.0.4: + resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.2.1 + object-inspect: 1.12.3 + dev: false + /siginfo@2.0.0: resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} dev: true @@ -1806,6 +2234,11 @@ packages: resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} dev: true + /statuses@2.0.1: + resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} + engines: {node: '>= 0.8'} + dev: false + /std-env@3.3.3: resolution: {integrity: sha512-Rz6yejtVyWnVjC1RFvNmYL10kgjC49EOghxWn0RFqlCHGFpQx+Xe7yW3I4ceK1SGrWIGMjD5Kbue8W/udkbMJg==} dev: true @@ -1878,6 +2311,14 @@ packages: acorn: 8.8.2 dev: true + /stripe@12.17.0: + resolution: {integrity: sha512-f8GhS2LQlGCDZ1Akyu57txgSWyLUEYf0yZYS7x2aTKJXVua5lLmmgfJFFYHfTgEdS5P6rurf0Ghcf/HVLggv5g==} + engines: {node: '>=12.*'} + dependencies: + '@types/node': 18.15.9 + qs: 6.11.2 + dev: false + /supports-color@5.5.0: resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} engines: {node: '>=4'} @@ -1955,6 +2396,11 @@ packages: is-number: 7.0.0 dev: true + /toidentifier@1.0.1: + resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} + engines: {node: '>=0.6'} + dev: false + /touch@3.1.0: resolution: {integrity: sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==} hasBin: true @@ -2030,6 +2476,14 @@ packages: engines: {node: '>=4'} dev: true + /type-is@1.6.18: + resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} + engines: {node: '>= 0.6'} + dependencies: + media-typer: 0.3.0 + mime-types: 2.1.35 + dev: false + /typescript@5.0.2: resolution: {integrity: sha512-wVORMBGO/FAs/++blGNeAVdbNKtIh1rbBL2EyQ1+J9lClJ93KiiKe8PmFIVdXhHcyv44SL9oglmfeSsndo0jRw==} engines: {node: '>=12.20'} @@ -2049,6 +2503,11 @@ packages: engines: {node: '>= 10.0.0'} dev: true + /unpipe@1.0.0: + resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} + engines: {node: '>= 0.8'} + dev: false + /url-parse@1.5.10: resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} dependencies: @@ -2060,10 +2519,20 @@ packages: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} dev: true + /utils-merge@1.0.1: + resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} + engines: {node: '>= 0.4.0'} + dev: false + /v8-compile-cache-lib@3.0.1: resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} dev: true + /vary@1.1.2: + resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} + engines: {node: '>= 0.8'} + dev: false + /vite-node@0.29.8(@types/node@18.15.9): resolution: {integrity: sha512-b6OtCXfk65L6SElVM20q5G546yu10/kNrhg08afEoWlFRJXFq9/6glsvSVY+aI6YeC1tu2TtAqI2jHEQmOmsFw==} engines: {node: '>=v14.16.0'} diff --git a/services/payment/prisma/migrations/20230804142527_add_stripe_id/migration.sql b/services/payment/prisma/migrations/20230804142527_add_stripe_id/migration.sql new file mode 100644 index 00000000..261066d4 --- /dev/null +++ b/services/payment/prisma/migrations/20230804142527_add_stripe_id/migration.sql @@ -0,0 +1,12 @@ +/* + Warnings: + + - A unique constraint covering the columns `[stripe_id]` on the table `Payment` will be added. If there are existing duplicate values, this will fail. + - Added the required column `stripe_id` to the `Payment` table without a default value. This is not possible if the table is not empty. + +*/ +-- AlterTable +ALTER TABLE "Payment" ADD COLUMN "stripe_id" TEXT NOT NULL; + +-- CreateIndex +CREATE UNIQUE INDEX "Payment_stripe_id_key" ON "Payment"("stripe_id"); diff --git a/services/payment/prisma/schema.prisma b/services/payment/prisma/schema.prisma index 3122670d..21efd775 100644 --- a/services/payment/prisma/schema.prisma +++ b/services/payment/prisma/schema.prisma @@ -22,7 +22,8 @@ model User { } model Payment { - id String @id @default(cuid()) + id String @id @default(cuid()) + stripe_id String @unique total Float status PaymentStatus @default(PENDING) diff --git a/services/payment/prisma/seed.ts b/services/payment/prisma/seed.ts index 931e0fb3..e208515d 100644 --- a/services/payment/prisma/seed.ts +++ b/services/payment/prisma/seed.ts @@ -5,6 +5,7 @@ const prisma = new PrismaClient(); const payments: Prisma.PaymentCreateInput[] = [ { id: "payment_id:1", + stripe_id: "stripe_id:1", total: 100, status: PaymentStatus.PENDING, user: { @@ -22,6 +23,7 @@ const payments: Prisma.PaymentCreateInput[] = [ }, { id: "payment_id:2", + stripe_id: "stripe_id:2", total: 200, status: PaymentStatus.APPROVED, user: { @@ -39,6 +41,7 @@ const payments: Prisma.PaymentCreateInput[] = [ }, { id: "payment_id:3", + stripe_id: "stripe_id:3", total: 5, status: PaymentStatus.REJECTED, user: { diff --git a/services/payment/src/handlers/payment/create.ts b/services/payment/src/handlers/payment/create.ts deleted file mode 100644 index f70eaef3..00000000 --- a/services/payment/src/handlers/payment/create.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { prisma } from "@payment/lib/prisma"; -import { log } from "@payment/lib/log"; -import { CreatePaymentRequest, Payment } from "@payment/types/payment"; -import { Data } from "@payment/types"; - -export const CreatePayment = async ( - { request }: Data, - callback: (err: any, response: Payment | null) => void -) => { - try { - const { total, user_id, name, email } = request; - - const payment = await prisma.payment.create({ - data: { - total, - user: { - connectOrCreate: { - where: { id: user_id }, - create: { id: user_id, name, email }, - }, - }, - }, - include: { user: true }, - }); - - callback(null, payment); - } catch (error) { - log.error(error); - callback(error, null); - } -}; diff --git a/services/payment/src/handlers/payment/get-user.ts b/services/payment/src/handlers/payment/get-user.ts index 616f33f5..86bb91bb 100644 --- a/services/payment/src/handlers/payment/get-user.ts +++ b/services/payment/src/handlers/payment/get-user.ts @@ -16,7 +16,13 @@ export const GetPaymentsByUser = async ( where: { user_id: id }, include: { user: true }, }); - callback(null, { payments }); + callback(null, { + payments: payments.map((payment) => ({ + ...payment, + created_at: payment.created_at.toISOString(), + updated_at: payment.updated_at.toISOString(), + })), + }); } catch (error) { log.error(error); callback(error, null); diff --git a/services/payment/src/handlers/payment/get.ts b/services/payment/src/handlers/payment/get.ts index 3de482b3..ce79c82f 100644 --- a/services/payment/src/handlers/payment/get.ts +++ b/services/payment/src/handlers/payment/get.ts @@ -13,7 +13,11 @@ export const GetPayment = async ( where: { id }, include: { user: true }, }); - callback(null, payment); + callback(null, { + ...payment, + created_at: payment.created_at.toISOString(), + updated_at: payment.updated_at.toISOString(), + }); } catch (error) { log.error(error); callback(error, null); diff --git a/services/payment/src/handlers/payment/index.ts b/services/payment/src/handlers/payment/index.ts index 42c8369f..9c51e661 100644 --- a/services/payment/src/handlers/payment/index.ts +++ b/services/payment/src/handlers/payment/index.ts @@ -1,15 +1,11 @@ import { UntypedServiceImplementation } from "@grpc/grpc-js"; -import { CreatePayment } from "@payment/handlers/payment/create"; import { GetPayment } from "@payment/handlers/payment/get"; import { GetPaymentsByUser } from "@payment/handlers/payment/get-user"; -import { UpdatePayment } from "@payment/handlers/payment/update"; const paymentHandlers: UntypedServiceImplementation = { - CreatePayment, GetPayment, GetPaymentsByUser, - UpdatePayment, }; export default paymentHandlers; diff --git a/services/payment/src/handlers/payment/update.ts b/services/payment/src/handlers/payment/update.ts deleted file mode 100644 index 34f6eca0..00000000 --- a/services/payment/src/handlers/payment/update.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { prisma } from "@payment/lib/prisma"; -import { log } from "@payment/lib/log"; -import { UpdatePaymentRequest, Payment } from "@payment/types/payment"; -import { Data } from "@payment/types"; - -export const UpdatePayment = async ( - { request }: Data, - callback: (err: any, response: Payment | null) => void -) => { - try { - const { id, status } = request; - - const payment = await prisma.payment.update({ - where: { id }, - data: { status }, - include: { user: true }, - }); - callback(null, payment); - } catch (error) { - log.error(error); - callback(error, null); - } -}; diff --git a/services/payment/src/handlers/stripe/create-checkout-session.ts b/services/payment/src/handlers/stripe/create-checkout-session.ts new file mode 100644 index 00000000..b9c8ff18 --- /dev/null +++ b/services/payment/src/handlers/stripe/create-checkout-session.ts @@ -0,0 +1,59 @@ +import { prisma } from "@payment/lib/prisma"; +import { log } from "@payment/lib/log"; +import { Data } from "@payment/types"; +import { stripe } from "@payment/lib/stripe"; +import { + CreateCheckoutSessionRequest, + CreateCheckoutSessionResponse, +} from "@payment/types/stripe"; + +export const CreateCheckoutSession = async ( + { request }: Data, + callback: (err: any, response: CreateCheckoutSessionResponse | null) => void +) => { + try { + const { total, user_id, name, email } = request; + + const { url, id } = await stripe.checkout.sessions.create({ + payment_method_types: ["card"], + line_items: [ + { + price_data: { + currency: "eur", + product_data: { + name: "Panier - GoodFood", + }, + unit_amount: total * 100, + }, + quantity: 1, + }, + ], + mode: "payment", + // todo: change this + success_url: "https://example.com/success", + cancel_url: "https://example.com/cancel", + }); + + const payment = await prisma.payment.create({ + data: { + stripe_id: id, + total, + user: { + connectOrCreate: { + where: { id: user_id }, + create: { id: user_id, name, email }, + }, + }, + }, + include: { user: true }, + }); + + callback(null, { + payment, + url: url as string, + }); + } catch (error) { + log.error(error); + callback(error, null); + } +}; diff --git a/services/payment/src/handlers/stripe/index.ts b/services/payment/src/handlers/stripe/index.ts new file mode 100644 index 00000000..c342466b --- /dev/null +++ b/services/payment/src/handlers/stripe/index.ts @@ -0,0 +1,7 @@ +import stripe_webhook_listener from "@payment/handlers/stripe/webhook"; +import { CreateCheckoutSession } from "@payment/handlers/stripe/create-checkout-session"; + +export { stripe_webhook_listener }; +export default { + CreateCheckoutSession, +}; diff --git a/services/payment/src/handlers/stripe/webhook.ts b/services/payment/src/handlers/stripe/webhook.ts new file mode 100644 index 00000000..f06145fa --- /dev/null +++ b/services/payment/src/handlers/stripe/webhook.ts @@ -0,0 +1,87 @@ +import { log, utils } from "@payment/lib/log"; +import prisma from "@payment/lib/prisma"; +import { STRIPE_ENDPOINT_SECRET, stripe } from "@payment/lib/stripe"; +import { PaymentStatus } from "@prisma/client"; +import express from "express"; + +const app = express(); + +const STRIPE_WEBHOOK_ENDPOINT = + process.env.STRIPE_WEBHOOK_ENDPOINT || "/webhook"; + +app.post( + STRIPE_WEBHOOK_ENDPOINT, + express.raw({ type: "application/json" }), + async (request, response) => { + let event = request.body; + // Only verify the event if you have an endpoint secret defined. + // Otherwise use the basic event deserialized with JSON.parse + if (STRIPE_ENDPOINT_SECRET) { + // Get the signature sent by Stripe + const signature = request.headers["stripe-signature"] as string; + try { + event = stripe.webhooks.constructEvent( + request.body, + signature, + STRIPE_ENDPOINT_SECRET + ); + } catch (err) { + log.error(err); + return response.status(400).send((err as Error).message); + } + } + + switch (event.type) { + case "checkout.session.completed": { + const { payment_status, id } = event.data.object; + + if (payment_status === "paid") + await prisma.payment.update({ + where: { stripe_id: id }, + data: { status: PaymentStatus.APPROVED }, + }); + break; + } + + // case checkout session expired + case "checkout.session.expired": { + const { payment_status, id } = event.data.object; + if (payment_status === "unpaid") + await prisma.payment.update({ + where: { stripe_id: id }, + data: { status: PaymentStatus.REJECTED }, + }); + break; + } + + default: + // Unexpected event type + console.log(`Unhandled event type ${event.type}.`); + } + + // Return a 200 response to acknowledge receipt of the event + response.send(); + } +); + +const PORT = Number(process.env.STRIPE_WEBHOOK_PORT) || 4242; +const ADDRESS = `0.0.0.0:${PORT}${STRIPE_WEBHOOK_ENDPOINT}`; + +/** + * Starts a Stripe webhook listener. + * + * TODO: implement TLS for production. + * + * @remarks This function starts an HTTP server using the `app` instance and listens on the specified `PORT`. + * @returns The express `app` instance. + */ +export default function stripe_webhook_listener() { + app.listen(PORT, () => { + log.debug( + `${utils.bold( + utils.magenta("stripe webhook") + )} started on port: ${utils.bold(ADDRESS)} ${utils.green("✓")}\n` + ); + }); + return app; +} diff --git a/services/payment/src/lib/stripe.ts b/services/payment/src/lib/stripe.ts new file mode 100644 index 00000000..ec1d10cc --- /dev/null +++ b/services/payment/src/lib/stripe.ts @@ -0,0 +1,8 @@ +import "dotenv/config"; +import Stripe from "stripe"; + +export const STRIPE_ENDPOINT_SECRET = process.env.STRIPE_WEBHOOK_SECRET; +export const stripe = new Stripe(process.env.STRIPE_API_SECRET!, { + typescript: true, + apiVersion: "2022-11-15", +}); diff --git a/services/payment/src/server.ts b/services/payment/src/server.ts index 2a5aede5..57d821d5 100644 --- a/services/payment/src/server.ts +++ b/services/payment/src/server.ts @@ -11,6 +11,9 @@ import { addReflection } from "@payment/lib/reflection"; import { createServerProxy } from "@payment/lib/proxy"; import { logGRPC } from "@payment/middleware/log"; import paymentHandlers from "@payment/handlers/payment"; +import stripeHandlers from "@payment/handlers/stripe"; + +import { stripe_webhook_listener } from "@payment/handlers/stripe"; const PORT = process.env.PORT || 50003; const ADDRESS = `0.0.0.0:${PORT}`; @@ -23,11 +26,13 @@ const REFLECTION_PATH = resolvePath( const packageDefinition = loadSync(PROTO_PATH, options); const grpc = loadPackageDefinition(packageDefinition) as any; const { service: p } = grpc.com.goodfood.payment.PaymentService; +const { service: s } = grpc.com.goodfood.payment.StripeService; // const server = new Server(); const server = createServerProxy(new Server()); server.addService(p, paymentHandlers); +server.addService(s, stripeHandlers); server.use(logGRPC); server.bindAsync(ADDRESS, serverInsecure, () => { @@ -36,8 +41,9 @@ server.bindAsync(ADDRESS, serverInsecure, () => { const message = `---- ${utils.green("good")}${utils.yellow("food")} Payment Service ----` + `\n` + - `started on: ${utils.bold(ADDRESS)} ${utils.green("✓")}\n`; + `started on: ${utils.bold(ADDRESS)} ${utils.green("✓")}`; log.debug(message); + stripe_webhook_listener(); }); export default server; diff --git a/services/payment/src/types/payment.d.ts b/services/payment/src/types/payment.d.ts index d397e04b..c775bf2b 100644 --- a/services/payment/src/types/payment.d.ts +++ b/services/payment/src/types/payment.d.ts @@ -29,16 +29,3 @@ export type GetPaymentsByUserRequest = { export type GetPaymentsByUserResponse = { payments: Payment[]; }; - -export type CreatePaymentRequest = { - total: number; - - user_id: string; - name: string; - email: string; -}; - -export type UpdatePaymentRequest = { - id: string; - status: PaymentStatus; -}; diff --git a/services/payment/src/types/stripe.d.ts b/services/payment/src/types/stripe.d.ts new file mode 100644 index 00000000..34b5c00e --- /dev/null +++ b/services/payment/src/types/stripe.d.ts @@ -0,0 +1,13 @@ +import { Payment } from "@payment/types/payment"; + +export type CreateCheckoutSessionRequest = { + total: number; + + user_id: string; + name: string; + email: string; +}; +export type CreateCheckoutSessionResponse = { + payment: Payment; + url: string; +}; diff --git a/services/proto/payment.proto b/services/proto/payment.proto index 5cc04768..dc512a10 100644 --- a/services/proto/payment.proto +++ b/services/proto/payment.proto @@ -12,6 +12,7 @@ message User { message Payment { string id = 1; + string stripe_id = 8; float total = 2; string status = 3; @@ -19,15 +20,17 @@ message Payment { User user = 4; string user_id = 5; - string createdAt = 6; - string updatedAt = 7; + string created_at = 6; + string updated_at = 7; } service PaymentService { rpc GetPayment(GetPaymentRequest) returns (Payment) {} rpc GetPaymentsByUser(GetPaymentsByUserRequest) returns (GetPaymentsByUserResponse) {} - rpc CreatePayment(CreatePaymentRequest) returns (Payment) {} - rpc UpdatePayment(UpdatePaymentRequest) returns (Payment) {} +} + +service StripeService { + rpc CreateCheckoutSession(CreateCheckoutSessionRequest) returns (CreateCheckoutSessionResponse) {} } message GetPaymentRequest { @@ -42,15 +45,15 @@ message GetPaymentsByUserResponse { repeated Payment payments = 1; } -message CreatePaymentRequest { +message CreateCheckoutSessionRequest { float total = 1; - string userId = 2; + string user_id = 2; string name = 3; string email = 4; } -message UpdatePaymentRequest { - string id = 1; - string status = 2; +message CreateCheckoutSessionResponse { + Payment payment = 1; + string url = 2; } From 81a11ca3e2fbf0fe462e005e306944e2d020cad3 Mon Sep 17 00:00:00 2001 From: Florian LEROUX Date: Fri, 4 Aug 2023 23:27:57 +0200 Subject: [PATCH 340/883] fix(config): fix typos (order -> payment), expose webhook port --- .github/workflows/payment.yml | 69 +++++++++++++++++++++++++++++ services/payment/Dockerfile | 3 ++ services/payment/k8s/deployment.yml | 3 ++ services/payment/k8s/service.yml | 3 ++ services/payment/package.json | 2 +- 5 files changed, 79 insertions(+), 1 deletion(-) create mode 100644 .github/workflows/payment.yml diff --git a/.github/workflows/payment.yml b/.github/workflows/payment.yml new file mode 100644 index 00000000..520401b8 --- /dev/null +++ b/.github/workflows/payment.yml @@ -0,0 +1,69 @@ +name: Payment Microservice CI/CD + +on: + push: + branches: [ payment ] + pull_request: + branches: [ dev, main ] + +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@master + - uses: pnpm/action-setup@v2 + with: + version: latest + - uses: actions/setup-node@v3 + with: + node-version: "18.x" + cache: "pnpm" + cache-dependency-path: services/payment/pnpm-lock.yaml + - name: Install dependencies + run: | + cd ./services/payment + pnpm install --frozen-lockfile + - name: Build + run: | + cd ./services/payment + pnpm build + + test: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@master + - uses: pnpm/action-setup@v2 + with: + version: latest + - uses: actions/setup-node@v3 + with: + node-version: "18.x" + cache: "pnpm" + cache-dependency-path: services/payment/pnpm-lock.yaml + - name: Install dependencies + run: | + cd ./services/payment + pnpm install --frozen-lockfile + - name: Execute tests + run: | + cd ./services/payment + pnpm test + + publish: + runs-on: ubuntu-latest + needs: [ build, test ] + steps: + - name: Checkout code + uses: actions/checkout@master + - name: Login to Docker Hub + uses: docker/login-action@v2 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + - name: Build and push + uses: docker/build-push-action@v4 + with: + context: ./services/ + file: ./services/payment/Dockerfile + push: true + tags: floriaaan/goodfood-payment:latest \ No newline at end of file diff --git a/services/payment/Dockerfile b/services/payment/Dockerfile index f2451ca0..76707cef 100644 --- a/services/payment/Dockerfile +++ b/services/payment/Dockerfile @@ -34,5 +34,8 @@ COPY --from=builder /app/node_modules/.prisma /.prisma # Expose the gRPC port EXPOSE 50003 +# Expose the Webhook port +EXPOSE 4242 + # Start the server CMD [ "node", "index.js"] diff --git a/services/payment/k8s/deployment.yml b/services/payment/k8s/deployment.yml index 6f6438e2..45db043b 100644 --- a/services/payment/k8s/deployment.yml +++ b/services/payment/k8s/deployment.yml @@ -29,3 +29,6 @@ spec: key: port ports: - containerPort: 50003 + name: grpc + - containerPort: 4242 + name: webhook diff --git a/services/payment/k8s/service.yml b/services/payment/k8s/service.yml index ea86b40e..4a18c919 100644 --- a/services/payment/k8s/service.yml +++ b/services/payment/k8s/service.yml @@ -9,5 +9,8 @@ spec: - name: "grpc" port: 50003 targetPort: 50003 + - name: "webook" + port: 4242 + targetPort: 4242 status: loadBalancer: {} diff --git a/services/payment/package.json b/services/payment/package.json index e41e4af8..5be2196a 100644 --- a/services/payment/package.json +++ b/services/payment/package.json @@ -1,5 +1,5 @@ { - "name": "@goodfood/order", + "name": "@goodfood/payment", "bin": "dist/index.js", "scripts": { "start": "node dist/index.js", From fe6da8a5fcaa3b42e7423d783259aeae7bbcd4fc Mon Sep 17 00:00:00 2001 From: Florian LEROUX Date: Sat, 5 Aug 2023 12:27:27 +0200 Subject: [PATCH 341/883] fix(ci): add test to make ci work --- services/payment/src/tests/fake.test.ts | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 services/payment/src/tests/fake.test.ts diff --git a/services/payment/src/tests/fake.test.ts b/services/payment/src/tests/fake.test.ts new file mode 100644 index 00000000..bc83eea4 --- /dev/null +++ b/services/payment/src/tests/fake.test.ts @@ -0,0 +1,7 @@ +import { assert, describe, it } from "vitest"; + +describe("tests@goodfood/payment", function () { + it("tests @goodfood/payment in expected situation", () => { + assert.equal(1, 1); + }); +}); From b5432c17efe70281b707bcfb6bd9205c640d66eb Mon Sep 17 00:00:00 2001 From: Florian LEROUX Date: Sat, 5 Aug 2023 12:55:18 +0200 Subject: [PATCH 342/883] doc: add testing --- services/payment/README.md | 25 ++++++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/services/payment/README.md b/services/payment/README.md index b90eb1d2..d9310988 100644 --- a/services/payment/README.md +++ b/services/payment/README.md @@ -11,7 +11,12 @@ ## gRPC Methods -The service provides the following gRPC methods: +- `GetPayment(GetPaymentRequest) returns (Payment) {}` + This RPC function is part of the PaymentService service. It is used to retrieve information about a single payment. The client sends a request GetPaymentRequest containing the necessary information (e.g., payment ID), and the server responds with a Payment message containing the details of the requested payment. +- `GetPaymentsByUser(GetPaymentsByUserRequest) returns (GetPaymentsByUserResponse) {}` + Also part of the PaymentService service, this RPC function allows the client to get a list of payments associated with a specific user. The client sends a GetPaymentsByUserRequest, typically containing the user's ID, and the server responds with a GetPaymentsByUserResponse message containing a list of payments relevant to that user. +- `CreateCheckoutSession(CreateCheckoutSessionRequest) returns (CreateCheckoutSessionResponse) {}` + This RPC function belongs to the StripeService service. It is utilized to create a checkout session for Stripe, which typically involves setting up a payment gateway or initiating a payment process for a user. The client sends a CreateCheckoutSessionRequest with relevant information required for the session, and the server responds with a CreateCheckoutSessionResponse, which may contain details or identifiers related to the created session. ## Requirements @@ -45,6 +50,20 @@ NB: If you want to run the microservice in development mode, you can run `npm ru ## Testing -### Requests examples +How to test the microservice: -**Install `grpcurl` on your machine.** +Pre-requisites: + +- You need to have a Postgres database running on your machine, the migrations need to be applied. +- You need to have an internet connection. + +1. Run the microservice (see [Getting started](#getting-started)). +2. Use a gRPC client (e.g. [Postman](https://www.postman.com/)) to send requests to the microservice (see [gRPC Methods](#grpc-methods)). + - Send a request to the `CreateCheckoutSession` method to create a payment. + It should return a `CreateCheckoutSessionResponse` with the created payment, and an URL by Stripe to pay the order. + The payment should be created in the database. + When the payment is paid, the order should be updated in the database using the webhook, it should also be updated in the database when the checkout has expired. + - Send a request to the `GetPayment` method to get a payment. + It should return a `GetPaymentResponse` with the payment. + - Send a request to the `GetPaymentsByUser` method to get all payments. + It should return a `GetPaymentsByUserResponse` with all payments. From 8153fb92ef876bd2f281d7819b55981e2322bb68 Mon Sep 17 00:00:00 2001 From: Florian Leroux <10078837+floriaaan@users.noreply.github.com> Date: Mon, 7 Aug 2023 10:42:33 +0200 Subject: [PATCH 343/883] Update README.md --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index a405370d..cd7a2b73 100644 --- a/README.md +++ b/README.md @@ -15,14 +15,14 @@ The GoodFood 2.0 project was initiated to update the existing ordering applicati | Gateway | 50000 | Go | ❌ | ❌ | @Anatole-Godard | | User (auth) | 50001 | Go | PostgreSQL | ❌ | @Anatole-Godard | | Basket | 50002 | NodeJS (ts) | Redis | ❌ | @Anatole-Godard | -| Payment | 50003 | NodeJS (ts) | PostgreSQL | ❌ | @Anatole-Godard | +| Payment | 50003 | NodeJS (ts) | PostgreSQL | ✅ | @floriaaan | | Product | 50004 | NodeJS (ts) | PostgreSQL | ❌ | @PierreLbg | | Restaurant | 50005 | NodeJS (ts) | PostgreSQL | ❌ | @PierreLbg | | Promotion | 50006 | NodeJS (ts) | PostgreSQL | ❌ | @PierreLbg | | Order | 50007 | NodeJS (ts) | PostgreSQL | ✅ | @floriaaan | -| Delivery | 50008 | NodeJS (ts) | PostgreSQL | ⚠️ | @floriaaan | -| Stock | 50009 | NodeJS (ts) | PostgreSQL | ❌ | @floriaaan | -| Reporting | 50020 | C# (dotnet) | PostgreSQL | ❌ | @floriaaan | +| Delivery | 50008 | NodeJS (ts) | PostgreSQL | ✅ | @floriaaan | +| Stock | 50009 | NodeJS (ts) | PostgreSQL | ⚠️ | @floriaaan | +| Reporting | 50020 | C# (dotnet) | PostgreSQL | ⚠️ | @floriaaan | | Log | 50021 | Go | PostgreSQL | ✅ | @floriaaan | | (...) | (...) | (...) | (...) | (...) | From 7c3b755262b1bce16e4f273c9de8b2cfba2b2613 Mon Sep 17 00:00:00 2001 From: Florian LEROUX Date: Mon, 7 Aug 2023 19:01:30 +0200 Subject: [PATCH 344/883] feat(stripe): add paypal --- services/payment/src/handlers/stripe/create-checkout-session.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/payment/src/handlers/stripe/create-checkout-session.ts b/services/payment/src/handlers/stripe/create-checkout-session.ts index b9c8ff18..7ad5800c 100644 --- a/services/payment/src/handlers/stripe/create-checkout-session.ts +++ b/services/payment/src/handlers/stripe/create-checkout-session.ts @@ -15,7 +15,7 @@ export const CreateCheckoutSession = async ( const { total, user_id, name, email } = request; const { url, id } = await stripe.checkout.sessions.create({ - payment_method_types: ["card"], + payment_method_types: ["card", "paypal"], line_items: [ { price_data: { From dc75ecda714564310414cf3dcf3ec2f9bd4ef432 Mon Sep 17 00:00:00 2001 From: Florian LEROUX Date: Fri, 4 Aug 2023 12:02:03 +0200 Subject: [PATCH 345/883] feat(payment): init microservice --- services/payment/.dockerignore | 2 + services/payment/.env.example | 4 + services/payment/.gitignore | 5 + services/payment/.nvmrc | 1 + services/payment/Dockerfile | 38 + services/payment/README.md | 50 + services/payment/generate_grpc_reflection.sh | 15 + services/payment/k8s/configmap.yml | 8 + services/payment/k8s/deployment.yml | 31 + services/payment/k8s/hpa.yml | 18 + services/payment/k8s/ingress.yml | 17 + services/payment/k8s/service.yml | 13 + services/payment/package.json | 55 + services/payment/pnpm-lock.yaml | 2271 +++++++++++++++++ .../20230804092434_init/migration.sql | 26 + .../prisma/migrations/migration_lock.toml | 3 + services/payment/prisma/schema.prisma | 35 + services/payment/prisma/seed.ts | 82 + services/payment/proto | 1 + services/payment/reflection_descriptor.bin | Bin 0 -> 2262 bytes services/payment/src/handlers/.gitinclude | 0 .../payment/src/handlers/payment/create.ts | 31 + .../payment/src/handlers/payment/get-user.ts | 24 + services/payment/src/handlers/payment/get.ts | 21 + .../payment/src/handlers/payment/index.ts | 15 + .../payment/src/handlers/payment/update.ts | 23 + services/payment/src/lib/amqp.ts | 32 + services/payment/src/lib/log.ts | 74 + services/payment/src/lib/prisma.ts | 29 + services/payment/src/lib/proxy.ts | 132 + services/payment/src/lib/reflection.ts | 23 + services/payment/src/lib/struct.ts | 53 + services/payment/src/middleware/log.ts | 42 + .../payment/src/resources/grpc-credentials.ts | 5 + .../src/resources/protoloader-options.ts | 7 + services/payment/src/server.ts | 43 + services/payment/src/types/index.d.ts | 3 + services/payment/src/types/payment.d.ts | 44 + services/payment/terraform/data.tf | 17 + .../terraform/env/dev-backend.tfvars.example | 4 + .../payment/terraform/env/dev.tfvars.example | 1 + services/payment/terraform/main.tf | 74 + services/payment/terraform/outputs.tf | 6 + services/payment/terraform/variables.tf | 16 + services/payment/tsconfig.json | 18 + services/payment/vitest.config.ts | 10 + services/proto/payment.proto | 56 + 47 files changed, 3478 insertions(+) create mode 100644 services/payment/.dockerignore create mode 100644 services/payment/.env.example create mode 100644 services/payment/.gitignore create mode 100644 services/payment/.nvmrc create mode 100644 services/payment/Dockerfile create mode 100644 services/payment/README.md create mode 100755 services/payment/generate_grpc_reflection.sh create mode 100644 services/payment/k8s/configmap.yml create mode 100644 services/payment/k8s/deployment.yml create mode 100644 services/payment/k8s/hpa.yml create mode 100644 services/payment/k8s/ingress.yml create mode 100644 services/payment/k8s/service.yml create mode 100644 services/payment/package.json create mode 100644 services/payment/pnpm-lock.yaml create mode 100644 services/payment/prisma/migrations/20230804092434_init/migration.sql create mode 100644 services/payment/prisma/migrations/migration_lock.toml create mode 100644 services/payment/prisma/schema.prisma create mode 100644 services/payment/prisma/seed.ts create mode 120000 services/payment/proto create mode 100644 services/payment/reflection_descriptor.bin create mode 100644 services/payment/src/handlers/.gitinclude create mode 100644 services/payment/src/handlers/payment/create.ts create mode 100644 services/payment/src/handlers/payment/get-user.ts create mode 100644 services/payment/src/handlers/payment/get.ts create mode 100644 services/payment/src/handlers/payment/index.ts create mode 100644 services/payment/src/handlers/payment/update.ts create mode 100644 services/payment/src/lib/amqp.ts create mode 100644 services/payment/src/lib/log.ts create mode 100644 services/payment/src/lib/prisma.ts create mode 100644 services/payment/src/lib/proxy.ts create mode 100644 services/payment/src/lib/reflection.ts create mode 100644 services/payment/src/lib/struct.ts create mode 100644 services/payment/src/middleware/log.ts create mode 100644 services/payment/src/resources/grpc-credentials.ts create mode 100644 services/payment/src/resources/protoloader-options.ts create mode 100644 services/payment/src/server.ts create mode 100644 services/payment/src/types/index.d.ts create mode 100644 services/payment/src/types/payment.d.ts create mode 100644 services/payment/terraform/data.tf create mode 100644 services/payment/terraform/env/dev-backend.tfvars.example create mode 100644 services/payment/terraform/env/dev.tfvars.example create mode 100644 services/payment/terraform/main.tf create mode 100644 services/payment/terraform/outputs.tf create mode 100644 services/payment/terraform/variables.tf create mode 100644 services/payment/tsconfig.json create mode 100644 services/payment/vitest.config.ts create mode 100644 services/proto/payment.proto diff --git a/services/payment/.dockerignore b/services/payment/.dockerignore new file mode 100644 index 00000000..b7dab5e9 --- /dev/null +++ b/services/payment/.dockerignore @@ -0,0 +1,2 @@ +node_modules +build \ No newline at end of file diff --git a/services/payment/.env.example b/services/payment/.env.example new file mode 100644 index 00000000..fe2eb7b2 --- /dev/null +++ b/services/payment/.env.example @@ -0,0 +1,4 @@ +DATABASE_URL=postgres://postgres:password@localhost:5432/postgres +AMQP_URL=amqp://guest:guest@localhost + +PORT=50003 \ No newline at end of file diff --git a/services/payment/.gitignore b/services/payment/.gitignore new file mode 100644 index 00000000..583204b4 --- /dev/null +++ b/services/payment/.gitignore @@ -0,0 +1,5 @@ +node_modules/ +dist/ +bin/ +*.env* +!*.env.example diff --git a/services/payment/.nvmrc b/services/payment/.nvmrc new file mode 100644 index 00000000..9dfef472 --- /dev/null +++ b/services/payment/.nvmrc @@ -0,0 +1 @@ +v18.12.0 diff --git a/services/payment/Dockerfile b/services/payment/Dockerfile new file mode 100644 index 00000000..f2451ca0 --- /dev/null +++ b/services/payment/Dockerfile @@ -0,0 +1,38 @@ +FROM node:18-alpine3.17 as builder + +# Set working directory +WORKDIR /app + +# Copy the application code +COPY ./payment/ . + +# Install dependencies +RUN npm install + +# Copy the proto files +COPY ./proto ./proto/ + +# Generate Prisma client +RUN npx prisma generate + +# Build the application +RUN npm run build + + +# Create a new image with the application +FROM node:18-alpine3.17 as runner + +# Set working directory +WORKDIR /app + +# Copy the application package +COPY --from=builder /app/dist . +COPY --from=builder /app/prisma/ . +COPY --from=builder /app/proto/ /proto/ +COPY --from=builder /app/node_modules/.prisma /.prisma + +# Expose the gRPC port +EXPOSE 50003 + +# Start the server +CMD [ "node", "index.js"] diff --git a/services/payment/README.md b/services/payment/README.md new file mode 100644 index 00000000..b90eb1d2 --- /dev/null +++ b/services/payment/README.md @@ -0,0 +1,50 @@ +# Payment Microservice + +| Informations | +| -------------------------------------------------- | +| **Port:** 50003 | +| **Developer:** @Anatole-Godard & @floriaaan | +| **Status:** In progress | +| **Last update:** 2023-08-04 | +| **Language:** NodeJS | +| **Dependencies:** TypeScript, gRPC, Postgres, AMQP | + +## gRPC Methods + +The service provides the following gRPC methods: + +## Requirements + +To run this microservice, you will need to have the following installed on your system: + +- NodeJS (v18.12.0 or higher) (dev. with v18.12.0) +- Postgres (v15.2 or higher) (dev. with docker image `postgres:15.2`) + +You can use the following tools to help you with the setup: + +- You can use nvm to set your Node version using: + - `nvm use`. +- You can use docker to run your Postgres database using: + - `docker run --name postgres -p 5432:5432 -e POSTGRES_PASSWORD=password -d postgres` +- You can use docker to run your RabbitMQ server using: + - `docker run --name rabbitmq -p 5672:5672 -p 15672:15672 -d rabbitmq:3-management` + +## Getting started + +### 1. Clone the repository and install dependencies + +1. Clone the `goodfood` repository to your local machine. +2. Navigate to the service directory (`services/payment`) in your terminal. +3. Run `npm install` to install the necessary dependencies. +4. Create a `.env` file at the root of the project directory and add the environment variables values (see `.env.example`). +5. Run `npm run start` to start the microservice. + +You can now access the microservice at `http://localhost:50003`. + +NB: If you want to run the microservice in development mode, you can run `npm run dev` instead. + +## Testing + +### Requests examples + +**Install `grpcurl` on your machine.** diff --git a/services/payment/generate_grpc_reflection.sh b/services/payment/generate_grpc_reflection.sh new file mode 100755 index 00000000..34a10e1d --- /dev/null +++ b/services/payment/generate_grpc_reflection.sh @@ -0,0 +1,15 @@ +#!/usr/bin/env bash + +# bash list of proto files ([payment.proto]) + + +IN_DIR="$(pwd)/../proto" +OUT_DIR="." +PROTOC="$(npm bin)/grpc_tools_node_protoc" + +# Generate reflection descriptor +$PROTOC \ + -I $IN_DIR \ + $IN_DIR/payment.proto \ + --descriptor_set_out=$OUT_DIR/reflection_descriptor.bin \ + \ No newline at end of file diff --git a/services/payment/k8s/configmap.yml b/services/payment/k8s/configmap.yml new file mode 100644 index 00000000..e5f407b5 --- /dev/null +++ b/services/payment/k8s/configmap.yml @@ -0,0 +1,8 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: goodfood-payment-configmap + labels: + app: goodfood-payment +data: + port: "50003" \ No newline at end of file diff --git a/services/payment/k8s/deployment.yml b/services/payment/k8s/deployment.yml new file mode 100644 index 00000000..6f6438e2 --- /dev/null +++ b/services/payment/k8s/deployment.yml @@ -0,0 +1,31 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: goodfood-payment + labels: + app: goodfood-payment +spec: + selector: + matchLabels: + app: goodfood-payment + template: + metadata: + labels: + app: goodfood-payment + spec: + containers: + - name: goodfood-payment + image: floriaaan/goodfood-payment:1.0.0 + imagePullPolicy: Always + resources: + limits: + memory: "128Mi" + cpu: "200m" + env: + - name: PORT + valueFrom: + configMapKeyRef: + name: goodfood-payment-configmap + key: port + ports: + - containerPort: 50003 diff --git a/services/payment/k8s/hpa.yml b/services/payment/k8s/hpa.yml new file mode 100644 index 00000000..f27155c1 --- /dev/null +++ b/services/payment/k8s/hpa.yml @@ -0,0 +1,18 @@ +apiVersion: autoscaling/v2 +kind: HorizontalPodAutoscaler +metadata: + name: goodfood-payment-hpa +spec: + scaleTargetRef: + apiVersion: apps/v1 + kind: Deployment + name: goodfood-payment + minReplicas: 1 + maxReplicas: 3 + metrics: + - type: Resource + resource: + name: cpu + target: + type: Utilization + averageUtilization: 50 diff --git a/services/payment/k8s/ingress.yml b/services/payment/k8s/ingress.yml new file mode 100644 index 00000000..37555a66 --- /dev/null +++ b/services/payment/k8s/ingress.yml @@ -0,0 +1,17 @@ +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + name: goodfood-payment +spec: + ingressClassName: nginx + rules: + - host: payment.localdev.me + http: + paths: + - pathType: Prefix + backend: + service: + name: goodfood-payment + port: + number: 50003 + path: / \ No newline at end of file diff --git a/services/payment/k8s/service.yml b/services/payment/k8s/service.yml new file mode 100644 index 00000000..ea86b40e --- /dev/null +++ b/services/payment/k8s/service.yml @@ -0,0 +1,13 @@ +apiVersion: v1 +kind: Service +metadata: + name: goodfood-payment +spec: + selector: + app: goodfood-payment + ports: + - name: "grpc" + port: 50003 + targetPort: 50003 +status: + loadBalancer: {} diff --git a/services/payment/package.json b/services/payment/package.json new file mode 100644 index 00000000..dec0bacc --- /dev/null +++ b/services/payment/package.json @@ -0,0 +1,55 @@ +{ + "name": "@goodfood/order", + "bin": "dist/index.js", + "scripts": { + "start": "node dist/index.js", + "dev": "nodemon --watch 'src/**/*.ts' --exec 'ts-node' src/server.ts", + "build": "esbuild src/server.ts --bundle --platform=node --target=node18 --outfile=dist/index.js", + "test": "vitest", + "coverage": "vitest --coverage", + "pkg": "pkg .", + "prisma:generate": "prisma generate", + "seed": "ts-node prisma/seed.ts", + "grpc:reflection": "./generate_grpc_reflection.sh", + "postinstall": "npm run prisma:generate" + }, + "dependencies": { + "@grpc/grpc-js": "1.8.14", + "@grpc/proto-loader": "0.7.6", + "@prisma/client": "5.1.1", + "amqplib": "^0.10.3", + "dotenv": "^16.0.3", + "grpc-server-reflection": "^0.1.5", + "protobufjs": "7.2.2" + }, + "devDependencies": { + "@types/amqplib": "^0.10.1", + "@types/node": "18.15.9", + "esbuild": "^0.17.18", + "grpc-tools": "^1.12.4", + "nodemon": "^2.0.22", + "pkg": "^5.8.1", + "prisma": "5.1.1", + "ts-node": "10.9.1", + "tsconfig-paths": "^4.2.0", + "typescript": "5.0.2", + "vite-tsconfig-paths": "^4.2.0", + "vitest": "^0.29.8" + }, + "prisma": { + "seed": "ts-node prisma/seed.ts" + }, + "pkg": { + "scripts": "./src/dist/index.js", + "assets": [ + "./prisma/**/*", + "../proto/**/*" + ], + "targets": [ + "node18-macos-arm64", + "node18-linux-x64", + "node18-linux-arm64" + ], + "outputPath": "bin/" + } +} diff --git a/services/payment/pnpm-lock.yaml b/services/payment/pnpm-lock.yaml new file mode 100644 index 00000000..87352acc --- /dev/null +++ b/services/payment/pnpm-lock.yaml @@ -0,0 +1,2271 @@ +lockfileVersion: '6.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +dependencies: + '@grpc/grpc-js': + specifier: 1.8.14 + version: 1.8.14 + '@grpc/proto-loader': + specifier: 0.7.6 + version: 0.7.6 + '@prisma/client': + specifier: 5.1.1 + version: 5.1.1(prisma@5.1.1) + amqplib: + specifier: ^0.10.3 + version: 0.10.3 + dotenv: + specifier: ^16.0.3 + version: 16.0.3 + grpc-server-reflection: + specifier: ^0.1.5 + version: 0.1.5 + protobufjs: + specifier: 7.2.2 + version: 7.2.2 + +devDependencies: + '@types/amqplib': + specifier: ^0.10.1 + version: 0.10.1 + '@types/node': + specifier: 18.15.9 + version: 18.15.9 + esbuild: + specifier: ^0.17.18 + version: 0.17.18 + grpc-tools: + specifier: ^1.12.4 + version: 1.12.4 + nodemon: + specifier: ^2.0.22 + version: 2.0.22 + pkg: + specifier: ^5.8.1 + version: 5.8.1 + prisma: + specifier: 5.1.1 + version: 5.1.1 + ts-node: + specifier: 10.9.1 + version: 10.9.1(@types/node@18.15.9)(typescript@5.0.2) + tsconfig-paths: + specifier: ^4.2.0 + version: 4.2.0 + typescript: + specifier: 5.0.2 + version: 5.0.2 + vite-tsconfig-paths: + specifier: ^4.2.0 + version: 4.2.0(typescript@5.0.2) + vitest: + specifier: ^0.29.8 + version: 0.29.8 + +packages: + + /@acuminous/bitsyntax@0.1.2: + resolution: {integrity: sha512-29lUK80d1muEQqiUsSo+3A0yP6CdspgC95EnKBMi22Xlwt79i/En4Vr67+cXhU+cZjbti3TgGGC5wy1stIywVQ==} + engines: {node: '>=0.8'} + dependencies: + buffer-more-ints: 1.0.0 + debug: 4.3.4 + safe-buffer: 5.1.2 + transitivePeerDependencies: + - supports-color + dev: false + + /@babel/generator@7.18.2: + resolution: {integrity: sha512-W1lG5vUwFvfMd8HVXqdfbuG7RuaSrTCCD8cl8fP8wOivdbtbIg2Db3IWUcgvfxKbbn6ZBGYRW/Zk1MIwK49mgw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.19.0 + '@jridgewell/gen-mapping': 0.3.3 + jsesc: 2.5.2 + dev: true + + /@babel/helper-string-parser@7.21.5: + resolution: {integrity: sha512-5pTUx3hAJaZIdW99sJ6ZUUgWq/Y+Hja7TowEnLNMm1VivRgZQL3vpBY3qUACVsvw+yQU6+YgfBVmcbLaZtrA1w==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helper-validator-identifier@7.19.1: + resolution: {integrity: sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/parser@7.18.4: + resolution: {integrity: sha512-FDge0dFazETFcxGw/EXzOkN8uJp0PC7Qbm+Pe9T+av2zlBpOgunFHkQPPn+eRuClU73JF+98D531UgayY89tow==} + engines: {node: '>=6.0.0'} + hasBin: true + dependencies: + '@babel/types': 7.19.0 + dev: true + + /@babel/types@7.19.0: + resolution: {integrity: sha512-YuGopBq3ke25BVSiS6fgF49Ul9gH1x70Bcr6bqRLjWCkcX8Hre1/5+z+IiWOIerRMSSEfGZVB9z9kyq7wVs9YA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-string-parser': 7.21.5 + '@babel/helper-validator-identifier': 7.19.1 + to-fast-properties: 2.0.0 + 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 + + /@esbuild/android-arm64@0.17.18: + resolution: {integrity: sha512-/iq0aK0eeHgSC3z55ucMAHO05OIqmQehiGay8eP5l/5l+iEr4EIbh4/MI8xD9qRFjqzgkc0JkX0LculNC9mXBw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-arm@0.17.18: + resolution: {integrity: sha512-EmwL+vUBZJ7mhFCs5lA4ZimpUH3WMAoqvOIYhVQwdIgSpHC8ImHdsRyhHAVxpDYUSm0lWvd63z0XH1IlImS2Qw==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-x64@0.17.18: + resolution: {integrity: sha512-x+0efYNBF3NPW2Xc5bFOSFW7tTXdAcpfEg2nXmxegm4mJuVeS+i109m/7HMiOQ6M12aVGGFlqJX3RhNdYM2lWg==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-arm64@0.17.18: + resolution: {integrity: sha512-6tY+djEAdF48M1ONWnQb1C+6LiXrKjmqjzPNPWXhu/GzOHTHX2nh8Mo2ZAmBFg0kIodHhciEgUBtcYCAIjGbjQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-x64@0.17.18: + resolution: {integrity: sha512-Qq84ykvLvya3dO49wVC9FFCNUfSrQJLbxhoQk/TE1r6MjHo3sFF2tlJCwMjhkBVq3/ahUisj7+EpRSz0/+8+9A==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-arm64@0.17.18: + resolution: {integrity: sha512-fw/ZfxfAzuHfaQeMDhbzxp9mc+mHn1Y94VDHFHjGvt2Uxl10mT4CDavHm+/L9KG441t1QdABqkVYwakMUeyLRA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-x64@0.17.18: + resolution: {integrity: sha512-FQFbRtTaEi8ZBi/A6kxOC0V0E9B/97vPdYjY9NdawyLd4Qk5VD5g2pbWN2VR1c0xhzcJm74HWpObPszWC+qTew==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm64@0.17.18: + resolution: {integrity: sha512-R7pZvQZFOY2sxUG8P6A21eq6q+eBv7JPQYIybHVf1XkQYC+lT7nDBdC7wWKTrbvMXKRaGudp/dzZCwL/863mZQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm@0.17.18: + resolution: {integrity: sha512-jW+UCM40LzHcouIaqv3e/oRs0JM76JfhHjCavPxMUti7VAPh8CaGSlS7cmyrdpzSk7A+8f0hiedHqr/LMnfijg==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ia32@0.17.18: + resolution: {integrity: sha512-ygIMc3I7wxgXIxk6j3V00VlABIjq260i967Cp9BNAk5pOOpIXmd1RFQJQX9Io7KRsthDrQYrtcx7QCof4o3ZoQ==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-loong64@0.17.18: + resolution: {integrity: sha512-bvPG+MyFs5ZlwYclCG1D744oHk1Pv7j8psF5TfYx7otCVmcJsEXgFEhQkbhNW8otDHL1a2KDINW20cfCgnzgMQ==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-mips64el@0.17.18: + resolution: {integrity: sha512-oVqckATOAGuiUOa6wr8TXaVPSa+6IwVJrGidmNZS1cZVx0HqkTMkqFGD2HIx9H1RvOwFeWYdaYbdY6B89KUMxA==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ppc64@0.17.18: + resolution: {integrity: sha512-3dLlQO+b/LnQNxgH4l9rqa2/IwRJVN9u/bK63FhOPB4xqiRqlQAU0qDU3JJuf0BmaH0yytTBdoSBHrb2jqc5qQ==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-riscv64@0.17.18: + resolution: {integrity: sha512-/x7leOyDPjZV3TcsdfrSI107zItVnsX1q2nho7hbbQoKnmoeUWjs+08rKKt4AUXju7+3aRZSsKrJtaRmsdL1xA==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-s390x@0.17.18: + resolution: {integrity: sha512-cX0I8Q9xQkL/6F5zWdYmVf5JSQt+ZfZD2bJudZrWD+4mnUvoZ3TDDXtDX2mUaq6upMFv9FlfIh4Gfun0tbGzuw==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-x64@0.17.18: + resolution: {integrity: sha512-66RmRsPlYy4jFl0vG80GcNRdirx4nVWAzJmXkevgphP1qf4dsLQCpSKGM3DUQCojwU1hnepI63gNZdrr02wHUA==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/netbsd-x64@0.17.18: + resolution: {integrity: sha512-95IRY7mI2yrkLlTLb1gpDxdC5WLC5mZDi+kA9dmM5XAGxCME0F8i4bYH4jZreaJ6lIZ0B8hTrweqG1fUyW7jbg==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/openbsd-x64@0.17.18: + resolution: {integrity: sha512-WevVOgcng+8hSZ4Q3BKL3n1xTv5H6Nb53cBrtzzEjDbbnOmucEVcZeGCsCOi9bAOcDYEeBZbD2SJNBxlfP3qiA==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/sunos-x64@0.17.18: + resolution: {integrity: sha512-Rzf4QfQagnwhQXVBS3BYUlxmEbcV7MY+BH5vfDZekU5eYpcffHSyjU8T0xucKVuOcdCsMo+Ur5wmgQJH2GfNrg==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-arm64@0.17.18: + resolution: {integrity: sha512-Kb3Ko/KKaWhjeAm2YoT/cNZaHaD1Yk/pa3FTsmqo9uFh1D1Rfco7BBLIPdDOozrObj2sahslFuAQGvWbgWldAg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-ia32@0.17.18: + resolution: {integrity: sha512-0/xUMIdkVHwkvxfbd5+lfG7mHOf2FRrxNbPiKWg9C4fFrB8H0guClmaM3BFiRUYrznVoyxTIyC/Ou2B7QQSwmw==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-x64@0.17.18: + resolution: {integrity: sha512-qU25Ma1I3NqTSHJUOKi9sAH1/Mzuvlke0ioMJRthLXKm7JiSKVwFghlGbDLOO2sARECGhja4xYfRAZNPAkooYg==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@grpc/grpc-js@1.8.14: + resolution: {integrity: sha512-w84maJ6CKl5aApCMzFll0hxtFNT6or9WwMslobKaqWUEf1K+zhlL43bSQhFreyYWIWR+Z0xnVFC1KtLm4ZpM/A==} + engines: {node: ^8.13.0 || >=10.10.0} + dependencies: + '@grpc/proto-loader': 0.7.6 + '@types/node': 18.15.9 + dev: false + + /@grpc/proto-loader@0.7.6: + resolution: {integrity: sha512-QyAXR8Hyh7uMDmveWxDSUcJr9NAWaZ2I6IXgAYvQmfflwouTM+rArE2eEaCtLlRqO81j7pRLCt81IefUei6Zbw==} + engines: {node: '>=6'} + hasBin: true + dependencies: + '@types/long': 4.0.2 + lodash.camelcase: 4.3.0 + long: 4.0.0 + protobufjs: 7.2.2 + yargs: 16.2.0 + dev: false + + /@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.18 + dev: true + + /@jridgewell/resolve-uri@3.1.0: + resolution: {integrity: sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==} + engines: {node: '>=6.0.0'} + 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.14: + resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==} + dev: true + + /@jridgewell/sourcemap-codec@1.4.15: + resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + dev: true + + /@jridgewell/trace-mapping@0.3.18: + resolution: {integrity: sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==} + dependencies: + '@jridgewell/resolve-uri': 3.1.0 + '@jridgewell/sourcemap-codec': 1.4.14 + 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 + + /@mapbox/node-pre-gyp@1.0.10: + resolution: {integrity: sha512-4ySo4CjzStuprMwk35H5pPbkymjv1SF3jGLj6rAHp/xT/RF7TL7bd9CTm1xDY49K2qF7jmR/g7k+SkLETP6opA==} + hasBin: true + dependencies: + detect-libc: 2.0.1 + https-proxy-agent: 5.0.1 + make-dir: 3.1.0 + node-fetch: 2.6.10 + nopt: 5.0.0 + npmlog: 5.0.1 + rimraf: 3.0.2 + semver: 7.5.0 + tar: 6.1.14 + transitivePeerDependencies: + - encoding + - supports-color + dev: true + + /@nodelib/fs.scandir@2.1.5: + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + dev: true + + /@nodelib/fs.stat@2.0.5: + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + dev: true + + /@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: true + + /@prisma/client@5.1.1(prisma@5.1.1): + resolution: {integrity: sha512-fxcCeK5pMQGcgCqCrWsi+I2rpIbk0rAhdrN+ke7f34tIrgPwA68ensrpin+9+fZvuV2OtzHmuipwduSY6HswdA==} + engines: {node: '>=16.13'} + requiresBuild: true + peerDependencies: + prisma: '*' + peerDependenciesMeta: + prisma: + optional: true + dependencies: + '@prisma/engines-version': 5.1.1-1.6a3747c37ff169c90047725a05a6ef02e32ac97e + prisma: 5.1.1 + dev: false + + /@prisma/engines-version@5.1.1-1.6a3747c37ff169c90047725a05a6ef02e32ac97e: + resolution: {integrity: sha512-owZqbY/wucbr65bXJ/ljrHPgQU5xXTSkmcE/JcbqE1kusuAXV/TLN3/exmz21SZ5rJ7WDkyk70J2G/n68iogbQ==} + dev: false + + /@prisma/engines@5.1.1: + resolution: {integrity: sha512-NV/4nVNWFZSJCCIA3HIFJbbDKO/NARc9ej0tX5S9k2EVbkrFJC4Xt9b0u4rNZWL4V+F5LAjvta8vzEUw0rw+HA==} + requiresBuild: true + + /@protobufjs/aspromise@1.1.2: + resolution: {integrity: sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==} + dev: false + + /@protobufjs/base64@1.1.2: + resolution: {integrity: sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==} + dev: false + + /@protobufjs/codegen@2.0.4: + resolution: {integrity: sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==} + dev: false + + /@protobufjs/eventemitter@1.1.0: + resolution: {integrity: sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==} + dev: false + + /@protobufjs/fetch@1.1.0: + resolution: {integrity: sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==} + dependencies: + '@protobufjs/aspromise': 1.1.2 + '@protobufjs/inquire': 1.1.0 + dev: false + + /@protobufjs/float@1.0.2: + resolution: {integrity: sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==} + dev: false + + /@protobufjs/inquire@1.1.0: + resolution: {integrity: sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==} + dev: false + + /@protobufjs/path@1.1.2: + resolution: {integrity: sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==} + dev: false + + /@protobufjs/pool@1.1.0: + resolution: {integrity: sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==} + dev: false + + /@protobufjs/utf8@1.1.0: + resolution: {integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==} + 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.3: + resolution: {integrity: sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==} + dev: true + + /@types/amqplib@0.10.1: + resolution: {integrity: sha512-j6ANKT79ncUDnAs/+9r9eDujxbeJoTjoVu33gHHcaPfmLQaMhvfbH2GqSe8KUM444epAp1Vl3peVOQfZk3UIqA==} + dependencies: + '@types/node': 18.15.9 + dev: true + + /@types/chai-subset@1.3.3: + resolution: {integrity: sha512-frBecisrNGz+F4T6bcc+NLeolfiojh5FxW2klu669+8BARtyQv2C/GkNW6FUodVe4BroGMP/wER/YDGc7rEllw==} + dependencies: + '@types/chai': 4.3.5 + dev: true + + /@types/chai@4.3.5: + resolution: {integrity: sha512-mEo1sAde+UCE6b2hxn332f1g1E8WfYRu6p5SvTKr2ZKC1f7gFJXk4h5PyGP9Dt6gCaG8y8XhwnXWC6Iy2cmBng==} + dev: true + + /@types/long@4.0.2: + resolution: {integrity: sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==} + dev: false + + /@types/node@18.15.9: + resolution: {integrity: sha512-dUxhiNzBLr6IqlZXz6e/rN2YQXlFgOei/Dxy+e3cyXTJ4txSUbGT2/fmnD6zd/75jDMeW5bDee+YXxlFKHoV0A==} + + /@vitest/expect@0.29.8: + resolution: {integrity: sha512-xlcVXn5I5oTq6NiZSY3ykyWixBxr5mG8HYtjvpgg6KaqHm0mvhX18xuwl5YGxIRNt/A5jidd7CWcNHrSvgaQqQ==} + dependencies: + '@vitest/spy': 0.29.8 + '@vitest/utils': 0.29.8 + chai: 4.3.7 + dev: true + + /@vitest/runner@0.29.8: + resolution: {integrity: sha512-FzdhnRDwEr/A3Oo1jtIk/B952BBvP32n1ObMEb23oEJNO+qO5cBet6M2XWIDQmA7BDKGKvmhUf2naXyp/2JEwQ==} + dependencies: + '@vitest/utils': 0.29.8 + p-limit: 4.0.0 + pathe: 1.1.0 + dev: true + + /@vitest/spy@0.29.8: + resolution: {integrity: sha512-VdjBe9w34vOMl5I5mYEzNX8inTxrZ+tYUVk9jxaZJmHFwmDFC/GV3KBFTA/JKswr3XHvZL+FE/yq5EVhb6pSAw==} + dependencies: + tinyspy: 1.1.1 + dev: true + + /@vitest/utils@0.29.8: + resolution: {integrity: sha512-qGzuf3vrTbnoY+RjjVVIBYfuWMjn3UMUqyQtdGNZ6ZIIyte7B37exj6LaVkrZiUTvzSadVvO/tJm8AEgbGCBPg==} + dependencies: + cli-truncate: 3.1.0 + diff: 5.1.0 + loupe: 2.3.6 + pretty-format: 27.5.1 + dev: true + + /abbrev@1.1.1: + resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} + dev: true + + /acorn-walk@8.2.0: + resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} + engines: {node: '>=0.4.0'} + dev: true + + /acorn@8.8.2: + resolution: {integrity: sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==} + engines: {node: '>=0.4.0'} + hasBin: true + dev: true + + /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 + dev: true + + /amqplib@0.10.3: + resolution: {integrity: sha512-UHmuSa7n8vVW/a5HGh2nFPqAEr8+cD4dEZ6u9GjP91nHfr1a54RyAKyra7Sb5NH7NBKOUlyQSMXIp0qAixKexw==} + engines: {node: '>=10'} + dependencies: + '@acuminous/bitsyntax': 0.1.2 + buffer-more-ints: 1.0.0 + readable-stream: 1.1.14 + url-parse: 1.5.10 + transitivePeerDependencies: + - supports-color + dev: false + + /ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + /ansi-regex@6.0.1: + resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} + engines: {node: '>=12'} + dev: true + + /ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + dependencies: + color-convert: 2.0.1 + + /ansi-styles@5.2.0: + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} + engines: {node: '>=10'} + dev: true + + /ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + dev: true + + /anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + dev: true + + /aproba@2.0.0: + resolution: {integrity: sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==} + dev: true + + /are-we-there-yet@2.0.0: + resolution: {integrity: sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==} + engines: {node: '>=10'} + dependencies: + delegates: 1.0.0 + readable-stream: 3.6.2 + dev: true + + /arg@4.1.3: + resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} + dev: true + + /array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + dev: true + + /assertion-error@1.1.0: + resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} + dev: true + + /at-least-node@1.0.0: + resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} + engines: {node: '>= 4.0.0'} + dev: true + + /balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + dev: true + + /base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + dev: true + + /binary-extensions@2.2.0: + resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} + engines: {node: '>=8'} + dev: true + + /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: true + + /brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + dev: true + + /braces@3.0.2: + resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + engines: {node: '>=8'} + dependencies: + fill-range: 7.0.1 + dev: true + + /buffer-more-ints@1.0.0: + resolution: {integrity: sha512-EMetuGFz5SLsT0QTnXzINh4Ksr+oo4i+UGTXEshiGCQWnsgSs7ZhJ8fzlwQ+OzEMs0MpDAMr1hxnblp5a4vcHg==} + dev: false + + /buffer@5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + dev: true + + /cac@6.7.14: + resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} + engines: {node: '>=8'} + dev: true + + /chai@4.3.7: + resolution: {integrity: sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==} + engines: {node: '>=4'} + dependencies: + assertion-error: 1.1.0 + check-error: 1.0.2 + deep-eql: 4.1.3 + get-func-name: 2.0.0 + loupe: 2.3.6 + pathval: 1.1.1 + type-detect: 4.0.8 + dev: true + + /chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + dev: true + + /check-error@1.0.2: + resolution: {integrity: sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==} + dev: true + + /chokidar@3.5.3: + resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} + engines: {node: '>= 8.10.0'} + dependencies: + anymatch: 3.1.3 + braces: 3.0.2 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.2 + dev: true + + /chownr@1.1.4: + resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} + dev: true + + /chownr@2.0.0: + resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} + engines: {node: '>=10'} + dev: true + + /cli-truncate@3.1.0: + resolution: {integrity: sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + slice-ansi: 5.0.0 + string-width: 5.1.2 + dev: true + + /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 + + /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.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + /color-support@1.1.3: + resolution: {integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==} + hasBin: true + dev: true + + /concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + dev: true + + /console-control-strings@1.1.0: + resolution: {integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==} + dev: true + + /core-util-is@1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + + /create-require@1.1.1: + resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} + dev: true + + /debug@3.2.7(supports-color@5.5.0): + resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.3 + supports-color: 5.5.0 + dev: true + + /debug@4.3.4: + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.2 + + /decompress-response@6.0.0: + resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} + engines: {node: '>=10'} + dependencies: + mimic-response: 3.1.0 + dev: true + + /deep-eql@4.1.3: + resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==} + engines: {node: '>=6'} + dependencies: + type-detect: 4.0.8 + dev: true + + /deep-extend@0.6.0: + resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} + engines: {node: '>=4.0.0'} + dev: true + + /delegates@1.0.0: + resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==} + dev: true + + /detect-libc@2.0.1: + resolution: {integrity: sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==} + engines: {node: '>=8'} + dev: true + + /diff@4.0.2: + resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} + engines: {node: '>=0.3.1'} + dev: true + + /diff@5.1.0: + resolution: {integrity: sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==} + 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 + dev: true + + /dotenv@16.0.3: + resolution: {integrity: sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==} + engines: {node: '>=12'} + dev: false + + /eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + dev: true + + /emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + /emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + dev: true + + /end-of-stream@1.4.4: + resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + dependencies: + once: 1.4.0 + dev: true + + /esbuild@0.17.18: + resolution: {integrity: sha512-z1lix43jBs6UKjcZVKOw2xx69ffE2aG0PygLL5qJ9OS/gy0Ewd1gW/PUQIOIQGXBHWNywSc0floSKoMFF8aK2w==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/android-arm': 0.17.18 + '@esbuild/android-arm64': 0.17.18 + '@esbuild/android-x64': 0.17.18 + '@esbuild/darwin-arm64': 0.17.18 + '@esbuild/darwin-x64': 0.17.18 + '@esbuild/freebsd-arm64': 0.17.18 + '@esbuild/freebsd-x64': 0.17.18 + '@esbuild/linux-arm': 0.17.18 + '@esbuild/linux-arm64': 0.17.18 + '@esbuild/linux-ia32': 0.17.18 + '@esbuild/linux-loong64': 0.17.18 + '@esbuild/linux-mips64el': 0.17.18 + '@esbuild/linux-ppc64': 0.17.18 + '@esbuild/linux-riscv64': 0.17.18 + '@esbuild/linux-s390x': 0.17.18 + '@esbuild/linux-x64': 0.17.18 + '@esbuild/netbsd-x64': 0.17.18 + '@esbuild/openbsd-x64': 0.17.18 + '@esbuild/sunos-x64': 0.17.18 + '@esbuild/win32-arm64': 0.17.18 + '@esbuild/win32-ia32': 0.17.18 + '@esbuild/win32-x64': 0.17.18 + dev: true + + /escalade@3.1.1: + resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} + engines: {node: '>=6'} + + /expand-template@2.0.3: + resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} + engines: {node: '>=6'} + dev: true + + /fast-glob@3.2.12: + resolution: {integrity: sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==} + 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: true + + /fastq@1.15.0: + resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} + dependencies: + reusify: 1.0.4 + dev: true + + /fill-range@7.0.1: + resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} + engines: {node: '>=8'} + dependencies: + to-regex-range: 5.0.1 + dev: true + + /from2@2.3.0: + resolution: {integrity: sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==} + dependencies: + inherits: 2.0.4 + readable-stream: 2.3.8 + dev: true + + /fs-constants@1.0.0: + resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} + dev: true + + /fs-extra@9.1.0: + resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==} + engines: {node: '>=10'} + dependencies: + at-least-node: 1.0.0 + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.0 + dev: true + + /fs-minipass@2.1.0: + resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} + engines: {node: '>= 8'} + dependencies: + minipass: 3.3.6 + dev: true + + /fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + dev: true + + /fsevents@2.3.2: + resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /function-bind@1.1.1: + resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} + dev: true + + /gauge@3.0.2: + resolution: {integrity: sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==} + engines: {node: '>=10'} + dependencies: + aproba: 2.0.0 + color-support: 1.1.3 + console-control-strings: 1.1.0 + has-unicode: 2.0.1 + object-assign: 4.1.1 + signal-exit: 3.0.7 + string-width: 4.2.3 + strip-ansi: 6.0.1 + wide-align: 1.1.5 + dev: true + + /get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + + /get-func-name@2.0.0: + resolution: {integrity: sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==} + dev: true + + /github-from-package@0.0.0: + resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==} + dev: true + + /glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + dependencies: + is-glob: 4.0.3 + dev: true + + /glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + dev: true + + /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.2.12 + ignore: 5.2.4 + merge2: 1.4.1 + slash: 3.0.0 + dev: true + + /globrex@0.1.2: + resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} + dev: true + + /google-protobuf@3.21.2: + resolution: {integrity: sha512-3MSOYFO5U9mPGikIYCzK0SaThypfGgS6bHqrUGXG3DPHCrb+txNqeEcns1W0lkGfk0rCyNXm7xB9rMxnCiZOoA==} + dev: false + + /graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + dev: true + + /grpc-server-reflection@0.1.5: + resolution: {integrity: sha512-i69RYu6v65enzknNAPUgerFuVQfo+L3n9g4c1A/Sv5jUHMpxMIjSbBA+YWls9Sr4Flac4oohp4Gx8f389CaHuw==} + dependencies: + google-protobuf: 3.21.2 + dev: false + + /grpc-tools@1.12.4: + resolution: {integrity: sha512-5+mLAJJma3BjnW/KQp6JBjUMgvu7Mu3dBvBPd1dcbNIb+qiR0817zDpgPjS7gRb+l/8EVNIa3cB02xI9JLToKg==} + hasBin: true + requiresBuild: true + dependencies: + '@mapbox/node-pre-gyp': 1.0.10 + transitivePeerDependencies: + - encoding + - supports-color + dev: true + + /has-flag@3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + dev: true + + /has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + dev: true + + /has-unicode@2.0.1: + resolution: {integrity: sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==} + dev: true + + /has@1.0.3: + resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} + engines: {node: '>= 0.4.0'} + dependencies: + function-bind: 1.1.1 + dev: true + + /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 + dev: true + + /ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + dev: true + + /ignore-by-default@1.0.1: + resolution: {integrity: sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==} + dev: true + + /ignore@5.2.4: + resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} + engines: {node: '>= 4'} + dev: true + + /inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + dev: true + + /inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + /ini@1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + dev: true + + /into-stream@6.0.0: + resolution: {integrity: sha512-XHbaOAvP+uFKUFsOgoNPRjLkwB+I22JFPFe5OjTkQ0nwgj6+pSjb4NmB6VMxaPshLiOf+zcpOCBQuLwC1KHhZA==} + engines: {node: '>=10'} + dependencies: + from2: 2.3.0 + p-is-promise: 3.0.0 + dev: true + + /is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + dependencies: + binary-extensions: 2.2.0 + dev: true + + /is-core-module@2.12.0: + resolution: {integrity: sha512-RECHCBCd/viahWmwj6enj19sKbHfJrddi/6cBDsNTKbNq0f7VeaUkBo60BqzvPqo/W54ChS62Z5qyun7cfOMqQ==} + dependencies: + has: 1.0.3 + dev: true + + /is-core-module@2.9.0: + resolution: {integrity: sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==} + dependencies: + has: 1.0.3 + dev: true + + /is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + dev: true + + /is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + /is-fullwidth-code-point@4.0.0: + resolution: {integrity: sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==} + engines: {node: '>=12'} + dev: true + + /is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + dependencies: + is-extglob: 2.1.1 + dev: true + + /is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + dev: true + + /isarray@0.0.1: + resolution: {integrity: sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==} + dev: false + + /isarray@1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + dev: true + + /jsesc@2.5.2: + resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} + engines: {node: '>=4'} + hasBin: true + dev: true + + /json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + dev: true + + /jsonc-parser@3.2.0: + resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} + dev: true + + /jsonfile@6.1.0: + resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + dependencies: + universalify: 2.0.0 + optionalDependencies: + graceful-fs: 4.2.11 + dev: true + + /local-pkg@0.4.3: + resolution: {integrity: sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==} + engines: {node: '>=14'} + dev: true + + /lodash.camelcase@4.3.0: + resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} + dev: false + + /long@4.0.0: + resolution: {integrity: sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==} + dev: false + + /long@5.2.3: + resolution: {integrity: sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==} + dev: false + + /loupe@2.3.6: + resolution: {integrity: sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==} + dependencies: + get-func-name: 2.0.0 + dev: true + + /lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + dependencies: + yallist: 4.0.0 + dev: true + + /make-dir@3.1.0: + resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} + engines: {node: '>=8'} + dependencies: + semver: 6.3.0 + dev: true + + /make-error@1.3.6: + resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + dev: true + + /merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + dev: true + + /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: true + + /mimic-response@3.1.0: + resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} + engines: {node: '>=10'} + dev: true + + /minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + dependencies: + brace-expansion: 1.1.11 + dev: true + + /minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + dev: true + + /minipass@3.3.6: + resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} + engines: {node: '>=8'} + dependencies: + yallist: 4.0.0 + dev: true + + /minipass@5.0.0: + resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} + engines: {node: '>=8'} + dev: true + + /minizlib@2.1.2: + resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} + engines: {node: '>= 8'} + dependencies: + minipass: 3.3.6 + yallist: 4.0.0 + dev: true + + /mkdirp-classic@0.5.3: + resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} + dev: true + + /mkdirp@1.0.4: + resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} + engines: {node: '>=10'} + hasBin: true + dev: true + + /mlly@1.2.0: + resolution: {integrity: sha512-+c7A3CV0KGdKcylsI6khWyts/CYrGTrRVo4R/I7u/cUsy0Conxa6LUhiEzVKIw14lc2L5aiO4+SeVe4TeGRKww==} + dependencies: + acorn: 8.8.2 + pathe: 1.1.0 + pkg-types: 1.0.3 + ufo: 1.1.2 + dev: true + + /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: true + + /multistream@4.1.0: + resolution: {integrity: sha512-J1XDiAmmNpRCBfIWJv+n0ymC4ABcf/Pl+5YvC5B/D2f/2+8PtHvCNxMPKiQcZyi922Hq69J2YOpb1pTywfifyw==} + dependencies: + once: 1.4.0 + readable-stream: 3.6.2 + dev: true + + /nanoid@3.3.6: + resolution: {integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + dev: true + + /napi-build-utils@1.0.2: + resolution: {integrity: sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==} + dev: true + + /node-abi@3.40.0: + resolution: {integrity: sha512-zNy02qivjjRosswoYmPi8hIKJRr8MpQyeKT6qlcq/OnOgA3Rhoae+IYOqsM9V5+JnHWmxKnWOT2GxvtqdtOCXA==} + engines: {node: '>=10'} + dependencies: + semver: 7.5.0 + dev: true + + /node-fetch@2.6.10: + resolution: {integrity: sha512-5YytjUVbwzjE/BX4N62vnPPkGNxlJPwdA9/ArUc4pcM6cYS4Hinuv4VazzwjMGgnWuiQqcemOanib/5PpcsGug==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + dependencies: + whatwg-url: 5.0.0 + dev: true + + /nodemon@2.0.22: + resolution: {integrity: sha512-B8YqaKMmyuCO7BowF1Z1/mkPqLk6cs/l63Ojtd6otKjMx47Dq1utxfRxcavH1I7VSaL8n5BUaoutadnsX3AAVQ==} + engines: {node: '>=8.10.0'} + hasBin: true + dependencies: + chokidar: 3.5.3 + debug: 3.2.7(supports-color@5.5.0) + ignore-by-default: 1.0.1 + minimatch: 3.1.2 + pstree.remy: 1.1.8 + semver: 5.7.1 + simple-update-notifier: 1.1.0 + supports-color: 5.5.0 + touch: 3.1.0 + undefsafe: 2.0.5 + dev: true + + /nopt@1.0.10: + resolution: {integrity: sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==} + hasBin: true + dependencies: + abbrev: 1.1.1 + dev: true + + /nopt@5.0.0: + resolution: {integrity: sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==} + engines: {node: '>=6'} + hasBin: true + dependencies: + abbrev: 1.1.1 + dev: true + + /normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + dev: true + + /npmlog@5.0.1: + resolution: {integrity: sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==} + dependencies: + are-we-there-yet: 2.0.0 + console-control-strings: 1.1.0 + gauge: 3.0.2 + set-blocking: 2.0.0 + dev: true + + /object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + dev: true + + /once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + dependencies: + wrappy: 1.0.2 + dev: true + + /p-is-promise@3.0.0: + resolution: {integrity: sha512-Wo8VsW4IRQSKVXsJCn7TomUaVtyfjVDn3nUP7kE967BQk0CwFpdbZs0X0uk5sW9mkBa9eNM7hCMaG93WUAwxYQ==} + engines: {node: '>=8'} + dev: true + + /p-limit@4.0.0: + resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + yocto-queue: 1.0.0 + dev: true + + /path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + dev: true + + /path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + dev: true + + /path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + dev: true + + /pathe@1.1.0: + resolution: {integrity: sha512-ODbEPR0KKHqECXW1GoxdDb+AZvULmXjVPy4rt+pGo2+TnjJTIPJQSVS6N63n8T2Ip+syHhbn52OewKicV0373w==} + dev: true + + /pathval@1.1.1: + resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} + dev: true + + /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'} + dev: true + + /pkg-fetch@3.4.2: + resolution: {integrity: sha512-0+uijmzYcnhC0hStDjm/cl2VYdrmVVBpe7Q8k9YBojxmR5tG8mvR9/nooQq3QSXiQqORDVOTY3XqMEqJVIzkHA==} + hasBin: true + dependencies: + chalk: 4.1.2 + fs-extra: 9.1.0 + https-proxy-agent: 5.0.1 + node-fetch: 2.6.10 + progress: 2.0.3 + semver: 7.5.0 + tar-fs: 2.1.1 + yargs: 16.2.0 + transitivePeerDependencies: + - encoding + - supports-color + dev: true + + /pkg-types@1.0.3: + resolution: {integrity: sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==} + dependencies: + jsonc-parser: 3.2.0 + mlly: 1.2.0 + pathe: 1.1.0 + dev: true + + /pkg@5.8.1: + resolution: {integrity: sha512-CjBWtFStCfIiT4Bde9QpJy0KeH19jCfwZRJqHFDFXfhUklCx8JoFmMj3wgnEYIwGmZVNkhsStPHEOnrtrQhEXA==} + hasBin: true + peerDependencies: + node-notifier: '>=9.0.1' + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@babel/generator': 7.18.2 + '@babel/parser': 7.18.4 + '@babel/types': 7.19.0 + chalk: 4.1.2 + fs-extra: 9.1.0 + globby: 11.1.0 + into-stream: 6.0.0 + is-core-module: 2.9.0 + minimist: 1.2.8 + multistream: 4.1.0 + pkg-fetch: 3.4.2 + prebuild-install: 7.1.1 + resolve: 1.22.2 + stream-meter: 1.0.4 + transitivePeerDependencies: + - encoding + - supports-color + dev: true + + /postcss@8.4.23: + resolution: {integrity: sha512-bQ3qMcpF6A/YjR55xtoTr0jGOlnPOKAIMdOWiv0EIT6HVPEaJiJB4NLljSbiHoC2RX7DN5Uvjtpbg1NPdwv1oA==} + engines: {node: ^10 || ^12 || >=14} + dependencies: + nanoid: 3.3.6 + picocolors: 1.0.0 + source-map-js: 1.0.2 + dev: true + + /prebuild-install@7.1.1: + resolution: {integrity: sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==} + engines: {node: '>=10'} + hasBin: true + dependencies: + detect-libc: 2.0.1 + expand-template: 2.0.3 + github-from-package: 0.0.0 + minimist: 1.2.8 + mkdirp-classic: 0.5.3 + napi-build-utils: 1.0.2 + node-abi: 3.40.0 + pump: 3.0.0 + rc: 1.2.8 + simple-get: 4.0.1 + tar-fs: 2.1.1 + tunnel-agent: 0.6.0 + dev: true + + /pretty-format@27.5.1: + resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + ansi-regex: 5.0.1 + ansi-styles: 5.2.0 + react-is: 17.0.2 + dev: true + + /prisma@5.1.1: + resolution: {integrity: sha512-WJFG/U7sMmcc6TjJTTifTfpI6Wjoh55xl4AzopVwAdyK68L9/ogNo8QQ2cxuUjJf/Wa82z/uhyh3wMzvRIBphg==} + engines: {node: '>=16.13'} + hasBin: true + requiresBuild: true + dependencies: + '@prisma/engines': 5.1.1 + + /process-nextick-args@2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + dev: true + + /progress@2.0.3: + resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} + engines: {node: '>=0.4.0'} + dev: true + + /protobufjs@7.2.2: + resolution: {integrity: sha512-++PrQIjrom+bFDPpfmqXfAGSQs40116JRrqqyf53dymUMvvb5d/LMRyicRoF1AUKoXVS1/IgJXlEgcpr4gTF3Q==} + engines: {node: '>=12.0.0'} + requiresBuild: true + dependencies: + '@protobufjs/aspromise': 1.1.2 + '@protobufjs/base64': 1.1.2 + '@protobufjs/codegen': 2.0.4 + '@protobufjs/eventemitter': 1.1.0 + '@protobufjs/fetch': 1.1.0 + '@protobufjs/float': 1.0.2 + '@protobufjs/inquire': 1.1.0 + '@protobufjs/path': 1.1.2 + '@protobufjs/pool': 1.1.0 + '@protobufjs/utf8': 1.1.0 + '@types/node': 18.15.9 + long: 5.2.3 + dev: false + + /pstree.remy@1.1.8: + resolution: {integrity: sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==} + dev: true + + /pump@3.0.0: + resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} + dependencies: + end-of-stream: 1.4.4 + once: 1.4.0 + dev: true + + /querystringify@2.2.0: + resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} + dev: false + + /queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + dev: true + + /rc@1.2.8: + resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} + hasBin: true + dependencies: + deep-extend: 0.6.0 + ini: 1.3.8 + minimist: 1.2.8 + strip-json-comments: 2.0.1 + dev: true + + /react-is@17.0.2: + resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} + dev: true + + /readable-stream@1.1.14: + resolution: {integrity: sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==} + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 0.0.1 + string_decoder: 0.10.31 + dev: false + + /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: true + + /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: true + + /readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + dependencies: + picomatch: 2.3.1 + dev: true + + /require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + + /requires-port@1.0.0: + resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} + dev: false + + /resolve@1.22.2: + resolution: {integrity: sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==} + hasBin: true + dependencies: + is-core-module: 2.12.0 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + dev: true + + /reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + dev: true + + /rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + hasBin: true + dependencies: + glob: 7.2.3 + dev: true + + /rollup@3.21.5: + resolution: {integrity: sha512-a4NTKS4u9PusbUJcfF4IMxuqjFzjm6ifj76P54a7cKnvVzJaG12BLVR+hgU2YDGHzyMMQNxLAZWuALsn8q2oQg==} + engines: {node: '>=14.18.0', npm: '>=8.0.0'} + hasBin: true + optionalDependencies: + fsevents: 2.3.2 + dev: true + + /run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + dependencies: + queue-microtask: 1.2.3 + dev: true + + /safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + + /safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + dev: true + + /semver@5.7.1: + resolution: {integrity: sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==} + hasBin: true + dev: true + + /semver@6.3.0: + resolution: {integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==} + hasBin: true + dev: true + + /semver@7.0.0: + resolution: {integrity: sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==} + hasBin: true + dev: true + + /semver@7.5.0: + resolution: {integrity: sha512-+XC0AD/R7Q2mPSRuy2Id0+CGTZ98+8f+KvwirxOKIEyid+XSx6HbC63p+O4IndTHuX5Z+JxQ0TghCkO5Cg/2HA==} + engines: {node: '>=10'} + hasBin: true + dependencies: + lru-cache: 6.0.0 + dev: true + + /set-blocking@2.0.0: + resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} + 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==} + dev: true + + /simple-concat@1.0.1: + resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} + dev: true + + /simple-get@4.0.1: + resolution: {integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==} + dependencies: + decompress-response: 6.0.0 + once: 1.4.0 + simple-concat: 1.0.1 + dev: true + + /simple-update-notifier@1.1.0: + resolution: {integrity: sha512-VpsrsJSUcJEseSbMHkrsrAVSdvVS5I96Qo1QAQ4FxQ9wXFcB+pjj7FB7/us9+GcgfW4ziHtYMc1J0PLczb55mg==} + engines: {node: '>=8.10.0'} + dependencies: + semver: 7.0.0 + dev: true + + /slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + dev: true + + /slice-ansi@5.0.0: + resolution: {integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==} + engines: {node: '>=12'} + dependencies: + ansi-styles: 6.2.1 + is-fullwidth-code-point: 4.0.0 + dev: true + + /source-map-js@1.0.2: + resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} + engines: {node: '>=0.10.0'} + dev: true + + /source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + dev: true + + /stackback@0.0.2: + resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + dev: true + + /std-env@3.3.3: + resolution: {integrity: sha512-Rz6yejtVyWnVjC1RFvNmYL10kgjC49EOghxWn0RFqlCHGFpQx+Xe7yW3I4ceK1SGrWIGMjD5Kbue8W/udkbMJg==} + dev: true + + /stream-meter@1.0.4: + resolution: {integrity: sha512-4sOEtrbgFotXwnEuzzsQBYEV1elAeFSO8rSGeTwabuX1RRn/kEq9JVH7I0MRBhKVRR0sJkr0M0QCH7yOLf9fhQ==} + dependencies: + readable-stream: 2.3.8 + 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.0.1 + dev: true + + /string_decoder@0.10.31: + resolution: {integrity: sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==} + dev: false + + /string_decoder@1.1.1: + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + dependencies: + safe-buffer: 5.1.2 + dev: true + + /string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + dependencies: + safe-buffer: 5.2.1 + dev: true + + /strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + dependencies: + ansi-regex: 5.0.1 + + /strip-ansi@7.0.1: + resolution: {integrity: sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==} + engines: {node: '>=12'} + dependencies: + ansi-regex: 6.0.1 + dev: true + + /strip-bom@3.0.0: + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} + dev: true + + /strip-json-comments@2.0.1: + resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} + engines: {node: '>=0.10.0'} + dev: true + + /strip-literal@1.0.1: + resolution: {integrity: sha512-QZTsipNpa2Ppr6v1AmJHESqJ3Uz247MUS0OjrnnZjFAvEoWqxuyFuXn2xLgMtRnijJShAa1HL0gtJyUs7u7n3Q==} + dependencies: + acorn: 8.8.2 + dev: true + + /supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + dependencies: + has-flag: 3.0.0 + dev: true + + /supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + dependencies: + has-flag: 4.0.0 + dev: true + + /supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + dev: true + + /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: true + + /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: true + + /tar@6.1.14: + resolution: {integrity: sha512-piERznXu0U7/pW7cdSn7hjqySIVTYT6F76icmFk7ptU7dDYlXTm5r9A6K04R2vU3olYgoKeo1Cg3eeu5nhftAw==} + engines: {node: '>=10'} + dependencies: + chownr: 2.0.0 + fs-minipass: 2.1.0 + minipass: 5.0.0 + minizlib: 2.1.2 + mkdirp: 1.0.4 + yallist: 4.0.0 + dev: true + + /tinybench@2.5.0: + resolution: {integrity: sha512-kRwSG8Zx4tjF9ZiyH4bhaebu+EDz1BOx9hOigYHlUW4xxI/wKIUQUqo018UlU4ar6ATPBsaMrdbKZ+tmPdohFA==} + dev: true + + /tinypool@0.4.0: + resolution: {integrity: sha512-2ksntHOKf893wSAH4z/+JbPpi92esw8Gn9N2deXX+B0EO92hexAVI9GIZZPx7P5aYo5KULfeOSt3kMOmSOy6uA==} + engines: {node: '>=14.0.0'} + dev: true + + /tinyspy@1.1.1: + resolution: {integrity: sha512-UVq5AXt/gQlti7oxoIg5oi/9r0WpF7DGEVwXgqWSMmyN16+e3tl5lIvTaOpJ3TAtu5xFzWccFRM4R5NaWHF+4g==} + engines: {node: '>=14.0.0'} + 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 + dev: true + + /touch@3.1.0: + resolution: {integrity: sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==} + hasBin: true + dependencies: + nopt: 1.0.10 + dev: true + + /tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + dev: true + + /ts-node@10.9.1(@types/node@18.15.9)(typescript@5.0.2): + 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.3 + '@types/node': 18.15.9 + acorn: 8.8.2 + 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.0.2 + v8-compile-cache-lib: 3.0.1 + yn: 3.1.1 + dev: true + + /tsconfck@2.1.1(typescript@5.0.2): + resolution: {integrity: sha512-ZPCkJBKASZBmBUNqGHmRhdhM8pJYDdOXp4nRgj/O0JwUwsMq50lCDRQP/M5GBNAA0elPrq4gAeu4dkaVCuKWww==} + engines: {node: ^14.13.1 || ^16 || >=18} + hasBin: true + peerDependencies: + typescript: ^4.3.5 || ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + dependencies: + typescript: 5.0.2 + 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 + + /tunnel-agent@0.6.0: + resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} + dependencies: + safe-buffer: 5.2.1 + dev: true + + /type-detect@4.0.8: + resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} + engines: {node: '>=4'} + dev: true + + /typescript@5.0.2: + resolution: {integrity: sha512-wVORMBGO/FAs/++blGNeAVdbNKtIh1rbBL2EyQ1+J9lClJ93KiiKe8PmFIVdXhHcyv44SL9oglmfeSsndo0jRw==} + engines: {node: '>=12.20'} + hasBin: true + dev: true + + /ufo@1.1.2: + resolution: {integrity: sha512-TrY6DsjTQQgyS3E3dBaOXf0TpPD8u9FVrVYmKVegJuFw51n/YB9XPt+U6ydzFG5ZIN7+DIjPbNmXoBj9esYhgQ==} + dev: true + + /undefsafe@2.0.5: + resolution: {integrity: sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==} + dev: true + + /universalify@2.0.0: + resolution: {integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==} + engines: {node: '>= 10.0.0'} + dev: true + + /url-parse@1.5.10: + resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} + dependencies: + querystringify: 2.2.0 + requires-port: 1.0.0 + dev: false + + /util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + dev: true + + /v8-compile-cache-lib@3.0.1: + resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} + dev: true + + /vite-node@0.29.8(@types/node@18.15.9): + resolution: {integrity: sha512-b6OtCXfk65L6SElVM20q5G546yu10/kNrhg08afEoWlFRJXFq9/6glsvSVY+aI6YeC1tu2TtAqI2jHEQmOmsFw==} + engines: {node: '>=v14.16.0'} + hasBin: true + dependencies: + cac: 6.7.14 + debug: 4.3.4 + mlly: 1.2.0 + pathe: 1.1.0 + picocolors: 1.0.0 + vite: 4.3.5(@types/node@18.15.9) + transitivePeerDependencies: + - '@types/node' + - less + - sass + - stylus + - sugarss + - supports-color + - terser + dev: true + + /vite-tsconfig-paths@4.2.0(typescript@5.0.2): + resolution: {integrity: sha512-jGpus0eUy5qbbMVGiTxCL1iB9ZGN6Bd37VGLJU39kTDD6ZfULTTb1bcc5IeTWqWJKiWV5YihCaibeASPiGi8kw==} + peerDependencies: + vite: '*' + peerDependenciesMeta: + vite: + optional: true + dependencies: + debug: 4.3.4 + globrex: 0.1.2 + tsconfck: 2.1.1(typescript@5.0.2) + transitivePeerDependencies: + - supports-color + - typescript + dev: true + + /vite@4.3.5(@types/node@18.15.9): + resolution: {integrity: sha512-0gEnL9wiRFxgz40o/i/eTBwm+NEbpUeTWhzKrZDSdKm6nplj+z4lKz8ANDgildxHm47Vg8EUia0aicKbawUVVA==} + engines: {node: ^14.18.0 || >=16.0.0} + hasBin: true + peerDependencies: + '@types/node': '>= 14' + less: '*' + sass: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + dependencies: + '@types/node': 18.15.9 + esbuild: 0.17.18 + postcss: 8.4.23 + rollup: 3.21.5 + optionalDependencies: + fsevents: 2.3.2 + dev: true + + /vitest@0.29.8: + resolution: {integrity: sha512-JIAVi2GK5cvA6awGpH0HvH/gEG9PZ0a/WoxdiV3PmqK+3CjQMf8c+J/Vhv4mdZ2nRyXFw66sAg6qz7VNkaHfDQ==} + engines: {node: '>=v14.16.0'} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@vitest/browser': '*' + '@vitest/ui': '*' + happy-dom: '*' + jsdom: '*' + playwright: '*' + safaridriver: '*' + webdriverio: '*' + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@vitest/browser': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true + playwright: + optional: true + safaridriver: + optional: true + webdriverio: + optional: true + dependencies: + '@types/chai': 4.3.5 + '@types/chai-subset': 1.3.3 + '@types/node': 18.15.9 + '@vitest/expect': 0.29.8 + '@vitest/runner': 0.29.8 + '@vitest/spy': 0.29.8 + '@vitest/utils': 0.29.8 + acorn: 8.8.2 + acorn-walk: 8.2.0 + cac: 6.7.14 + chai: 4.3.7 + debug: 4.3.4 + local-pkg: 0.4.3 + pathe: 1.1.0 + picocolors: 1.0.0 + source-map: 0.6.1 + std-env: 3.3.3 + strip-literal: 1.0.1 + tinybench: 2.5.0 + tinypool: 0.4.0 + tinyspy: 1.1.1 + vite: 4.3.5(@types/node@18.15.9) + vite-node: 0.29.8(@types/node@18.15.9) + why-is-node-running: 2.2.2 + transitivePeerDependencies: + - less + - sass + - stylus + - sugarss + - supports-color + - terser + dev: true + + /webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + dev: true + + /whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + 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 + + /wide-align@1.1.5: + resolution: {integrity: sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==} + dependencies: + string-width: 4.2.3 + 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 + + /wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + dev: true + + /y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + + /yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + dev: true + + /yargs-parser@20.2.9: + resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} + engines: {node: '>=10'} + + /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 + + /yn@3.1.1: + resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} + engines: {node: '>=6'} + dev: true + + /yocto-queue@1.0.0: + resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} + engines: {node: '>=12.20'} + dev: true diff --git a/services/payment/prisma/migrations/20230804092434_init/migration.sql b/services/payment/prisma/migrations/20230804092434_init/migration.sql new file mode 100644 index 00000000..5af2e978 --- /dev/null +++ b/services/payment/prisma/migrations/20230804092434_init/migration.sql @@ -0,0 +1,26 @@ +-- CreateEnum +CREATE TYPE "PaymentStatus" AS ENUM ('PENDING', 'APPROVED', 'REJECTED'); + +-- CreateTable +CREATE TABLE "User" ( + "id" TEXT NOT NULL, + "name" TEXT NOT NULL, + "email" TEXT NOT NULL, + + CONSTRAINT "User_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "Payment" ( + "id" TEXT NOT NULL, + "total" DOUBLE PRECISION NOT NULL, + "status" "PaymentStatus" NOT NULL DEFAULT 'PENDING', + "user_id" TEXT NOT NULL, + "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updated_at" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "Payment_pkey" PRIMARY KEY ("id") +); + +-- AddForeignKey +ALTER TABLE "Payment" ADD CONSTRAINT "Payment_user_id_fkey" FOREIGN KEY ("user_id") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE; diff --git a/services/payment/prisma/migrations/migration_lock.toml b/services/payment/prisma/migrations/migration_lock.toml new file mode 100644 index 00000000..fbffa92c --- /dev/null +++ b/services/payment/prisma/migrations/migration_lock.toml @@ -0,0 +1,3 @@ +# Please do not edit this file manually +# It should be added in your version-control system (i.e. Git) +provider = "postgresql" \ No newline at end of file diff --git a/services/payment/prisma/schema.prisma b/services/payment/prisma/schema.prisma new file mode 100644 index 00000000..3122670d --- /dev/null +++ b/services/payment/prisma/schema.prisma @@ -0,0 +1,35 @@ +datasource db { + provider = "postgresql" + url = env("DATABASE_URL") +} + +generator client { + provider = "prisma-client-js" + binaryTargets = ["native", "linux-musl", "linux-musl-openssl-3.0.x"] +} + +enum PaymentStatus { + PENDING + APPROVED + REJECTED +} + +model User { + id String @id // no default value because it is a foreign key created by the user microservice + name String + email String + payments Payment[] +} + +model Payment { + id String @id @default(cuid()) + + total Float + status PaymentStatus @default(PENDING) + + user User @relation(fields: [user_id], references: [id]) + user_id String + + created_at DateTime @default(now()) + updated_at DateTime @updatedAt +} diff --git a/services/payment/prisma/seed.ts b/services/payment/prisma/seed.ts new file mode 100644 index 00000000..931e0fb3 --- /dev/null +++ b/services/payment/prisma/seed.ts @@ -0,0 +1,82 @@ +import { PrismaClient, Prisma, PaymentStatus } from "@prisma/client"; + +const prisma = new PrismaClient(); + +const payments: Prisma.PaymentCreateInput[] = [ + { + id: "payment_id:1", + total: 100, + status: PaymentStatus.PENDING, + user: { + connectOrCreate: { + where: { + id: "user_id:1", + }, + create: { + id: "user_id:1", + name: "John Doe", + email: "honj@eod.com", + }, + }, + }, + }, + { + id: "payment_id:2", + total: 200, + status: PaymentStatus.APPROVED, + user: { + connectOrCreate: { + where: { + id: "user_id:2", + }, + create: { + id: "user_id:2", + name: "Jane Doe", + email: "janet@doe.com", + }, + }, + }, + }, + { + id: "payment_id:3", + total: 5, + status: PaymentStatus.REJECTED, + user: { + connectOrCreate: { + where: { + id: "user_id:1", + }, + create: { + id: "user_id:1", + name: "John Doe", + email: "honj@eod.com", + }, + }, + }, + }, +]; + +async function main() { + console.log(`Delete existing data ...`); + await prisma.payment.deleteMany(); + await prisma.user.deleteMany(); + console.log(`Existing data deleted.`); + + console.log(`Start seeding ...`); + for (const data of payments) { + const { id } = await prisma.payment.create({ data }); + console.log(`Created payment with id: ${id}`); + } + console.log(`Seeding finished.`); +} + +main() + .then(async () => { + await prisma.$disconnect(); + }) + .catch(async (e) => { + console.error(e); + await prisma.$disconnect(); + // @ts-ignore + process.exit(1); + }); diff --git a/services/payment/proto b/services/payment/proto new file mode 120000 index 00000000..4d1e2d8b --- /dev/null +++ b/services/payment/proto @@ -0,0 +1 @@ +../proto/ \ No newline at end of file diff --git a/services/payment/reflection_descriptor.bin b/services/payment/reflection_descriptor.bin new file mode 100644 index 0000000000000000000000000000000000000000..4ba1fbf44ae156a30482f4627ac96dd4b054e7ba GIT binary patch literal 2262 zcmbtW?Q+sU6m4ip%S{D(by|u#)%ewEl`4G$D6Ke1nIONMk*2V;QAjWwI>Q5W#_*hJ@A4DNmH$l)=8?V}PFJQm<{B1CmSd zc#22rEPxLo)i;CeGS9C00iJvSNis04er|;)!~t1!clev|>K)zL3R8iz`ie1B<>)rZ=KFmFbv{zuV*pLn8I3kU1e9SHd9QM}&IQ zg6O-j89-=h?DswkS%a-xNIGYZV+K@nfAGU*PrSXx}eAd%@ zkPE>LF~3>ZdWdC&q#%-fsG+~`i)mO78;#WacjCVlz_LqBk4(&k`7W}U!jGw$izya2 zZZZ9p{h!73t$U}%)PFHTtzmbXP|OcYgy7ws7tYRaak1Gw2V|>7rlg+gOn(9QCs1;> zQ?R`)}y?I3^EuY_C2rKkq zublw~-Gv^;H}i^wxP|z9fsOD5X?%P={{abGsJK=97oxwD!P3&z)s02Zow23o`x@iilWpysPMJ`=b=iF1|zMLGNnZu-yF literal 0 HcmV?d00001 diff --git a/services/payment/src/handlers/.gitinclude b/services/payment/src/handlers/.gitinclude new file mode 100644 index 00000000..e69de29b diff --git a/services/payment/src/handlers/payment/create.ts b/services/payment/src/handlers/payment/create.ts new file mode 100644 index 00000000..f70eaef3 --- /dev/null +++ b/services/payment/src/handlers/payment/create.ts @@ -0,0 +1,31 @@ +import { prisma } from "@payment/lib/prisma"; +import { log } from "@payment/lib/log"; +import { CreatePaymentRequest, Payment } from "@payment/types/payment"; +import { Data } from "@payment/types"; + +export const CreatePayment = async ( + { request }: Data, + callback: (err: any, response: Payment | null) => void +) => { + try { + const { total, user_id, name, email } = request; + + const payment = await prisma.payment.create({ + data: { + total, + user: { + connectOrCreate: { + where: { id: user_id }, + create: { id: user_id, name, email }, + }, + }, + }, + include: { user: true }, + }); + + callback(null, payment); + } catch (error) { + log.error(error); + callback(error, null); + } +}; diff --git a/services/payment/src/handlers/payment/get-user.ts b/services/payment/src/handlers/payment/get-user.ts new file mode 100644 index 00000000..616f33f5 --- /dev/null +++ b/services/payment/src/handlers/payment/get-user.ts @@ -0,0 +1,24 @@ +import { prisma } from "@payment/lib/prisma"; +import { log } from "@payment/lib/log"; +import { + GetPaymentsByUserRequest, + GetPaymentsByUserResponse, +} from "@payment/types/payment"; +import { Data } from "@payment/types"; + +export const GetPaymentsByUser = async ( + { request }: Data, + callback: (err: any, response: GetPaymentsByUserResponse | null) => void +) => { + try { + const { id } = request; + const payments = await prisma.payment.findMany({ + where: { user_id: id }, + include: { user: true }, + }); + callback(null, { payments }); + } catch (error) { + log.error(error); + callback(error, null); + } +}; diff --git a/services/payment/src/handlers/payment/get.ts b/services/payment/src/handlers/payment/get.ts new file mode 100644 index 00000000..3de482b3 --- /dev/null +++ b/services/payment/src/handlers/payment/get.ts @@ -0,0 +1,21 @@ +import { prisma } from "@payment/lib/prisma"; +import { log } from "@payment/lib/log"; +import { GetPaymentRequest, Payment } from "@payment/types/payment"; +import { Data } from "@payment/types"; + +export const GetPayment = async ( + { request }: Data, + callback: (err: any, response: Payment | null) => void +) => { + try { + const { id } = request; + const payment = await prisma.payment.findUniqueOrThrow({ + where: { id }, + include: { user: true }, + }); + callback(null, payment); + } catch (error) { + log.error(error); + callback(error, null); + } +}; diff --git a/services/payment/src/handlers/payment/index.ts b/services/payment/src/handlers/payment/index.ts new file mode 100644 index 00000000..42c8369f --- /dev/null +++ b/services/payment/src/handlers/payment/index.ts @@ -0,0 +1,15 @@ +import { UntypedServiceImplementation } from "@grpc/grpc-js"; + +import { CreatePayment } from "@payment/handlers/payment/create"; +import { GetPayment } from "@payment/handlers/payment/get"; +import { GetPaymentsByUser } from "@payment/handlers/payment/get-user"; +import { UpdatePayment } from "@payment/handlers/payment/update"; + +const paymentHandlers: UntypedServiceImplementation = { + CreatePayment, + GetPayment, + GetPaymentsByUser, + UpdatePayment, +}; + +export default paymentHandlers; diff --git a/services/payment/src/handlers/payment/update.ts b/services/payment/src/handlers/payment/update.ts new file mode 100644 index 00000000..34f6eca0 --- /dev/null +++ b/services/payment/src/handlers/payment/update.ts @@ -0,0 +1,23 @@ +import { prisma } from "@payment/lib/prisma"; +import { log } from "@payment/lib/log"; +import { UpdatePaymentRequest, Payment } from "@payment/types/payment"; +import { Data } from "@payment/types"; + +export const UpdatePayment = async ( + { request }: Data, + callback: (err: any, response: Payment | null) => void +) => { + try { + const { id, status } = request; + + const payment = await prisma.payment.update({ + where: { id }, + data: { status }, + include: { user: true }, + }); + callback(null, payment); + } catch (error) { + log.error(error); + callback(error, null); + } +}; diff --git a/services/payment/src/lib/amqp.ts b/services/payment/src/lib/amqp.ts new file mode 100644 index 00000000..38161cda --- /dev/null +++ b/services/payment/src/lib/amqp.ts @@ -0,0 +1,32 @@ +import amqp from "amqplib"; +import { msg } from "@payment/middleware/log"; +import { log } from "@payment/lib/log"; + +const DEFAULT_QUEUE = "log"; + +async function connectQueue(queue = DEFAULT_QUEUE) { + try { + const connection = await amqp.connect(process.env.AMQP_URL || ""); + const channel = await connection.createChannel(); + await channel.assertExchange(queue, "fanout", { durable: true }); + return channel; + } catch (error) { + return error as Error; + } +} + +const toLog = (message: any) => { + const { request, path } = message; + return { event_message: path, metadata: { request } }; +}; + +export const publish = async (message: any, queue = DEFAULT_QUEUE) => { + const channel = await connectQueue(queue); + if (channel instanceof Error) + return console.log("Error to connect to queue: ", channel); + channel.sendToQueue(queue, Buffer.from(JSON.stringify(toLog(message)))); + log.debug( + msg("AMQP", `${queue} (queue)`, new Date(), new Date()), + JSON.stringify(message) + ); +}; diff --git a/services/payment/src/lib/log.ts b/services/payment/src/lib/log.ts new file mode 100644 index 00000000..2404af54 --- /dev/null +++ b/services/payment/src/lib/log.ts @@ -0,0 +1,74 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ +/* eslint-disable no-console */ + +function getStackTrace() { + let stack; + + try { + throw new Error(""); + } catch (error) { + stack = (error as Error).stack || ""; + } + + stack = stack.split("\n").map((line) => line.trim()); + return stack.splice(stack[0] === "Error" ? 2 : 1); +} + +const getInitiator = () => { + // _getInitiatorLine, _ObjectInfoLine, caller + const [, , caller] = getStackTrace(); + const file = caller.split("/").at(-1) || ""; + return file.replace(")", ""); +}; + +const warn = (...args: any[]) => { + console.group( + `\x1b[33m${new Date().toISOString()} - WARN - ${getInitiator()}\x1b[0m` + ); + console.warn(...args); + console.groupEnd(); +}; +const error = (...args: any[]) => { + console.group( + `\x1b[31m${new Date().toISOString()} - ERROR - ${getInitiator()}\x1b[0m` + ); + console.error(...args); + console.groupEnd(); +}; +const info = (...args: any[]) => { + console.group( + `\x1b[34m${new Date().toISOString()} - INFO - ${getInitiator()}\x1b[0m` + ); + console.log(...args); + console.groupEnd(); +}; +const debug = (...args: any[]) => { + console.log(...args); +}; + +/** + * @description a simple interface logger for logging to the console and into a log drain in the future + * @example + * log.warn('this is a warning'); + * log.error('this is an error'); + * log.info('this is an info'); + * @exports log + */ +export const log = { + warn, + error, + info, + debug, +}; + +export const utils = { + bold: (text: string) => `\x1b[1m${text}\x1b[0m`, + red: (text: string) => `\x1b[31m${text}\x1b[0m`, + green: (text: string) => `\x1b[32m${text}\x1b[0m`, + yellow: (text: string) => `\x1b[33m${text}\x1b[0m`, + blue: (text: string) => `\x1b[34m${text}\x1b[0m`, + magenta: (text: string) => `\x1b[35m${text}\x1b[0m`, + cyan: (text: string) => `\x1b[36m${text}\x1b[0m`, + white: (text: string) => `\x1b[37m${text}\x1b[0m`, + gray: (text: string) => `\x1b[90m${text}\x1b[0m`, +}; diff --git a/services/payment/src/lib/prisma.ts b/services/payment/src/lib/prisma.ts new file mode 100644 index 00000000..4d495ef0 --- /dev/null +++ b/services/payment/src/lib/prisma.ts @@ -0,0 +1,29 @@ +import { Prisma, PrismaClient } from "@prisma/client"; + +let prisma: PrismaClient; +type GlobalWithPrisma = typeof globalThis & { + prisma: PrismaClient; +}; + +const OPTIONS: Prisma.PrismaClientOptions = { + log: + process.env.NEXT_PUBLIC_APP_ENV !== "production" + ? ["info", "warn"] + : undefined, +}; + +if (process.env.NODE_ENV === "production") { + prisma = new PrismaClient(OPTIONS); +} else { + // Ensure the prisma instance is re-used during hot-reloading + // Otherwise, a new client will be created on every reload + if (!("prisma" in global)) { + (global as GlobalWithPrisma).prisma = new PrismaClient(OPTIONS); + } + + prisma = (global as GlobalWithPrisma).prisma; +} + +export default prisma; + +export { prisma }; diff --git a/services/payment/src/lib/proxy.ts b/services/payment/src/lib/proxy.ts new file mode 100644 index 00000000..becdaabb --- /dev/null +++ b/services/payment/src/lib/proxy.ts @@ -0,0 +1,132 @@ +import { Server, status } from "@grpc/grpc-js"; + +const getType = (method: { + requestStream: boolean; + responseStream: boolean; +}) => { + if (method.requestStream === false && method.responseStream === false) { + return "unary"; + } + return "unknown"; +}; + + +const lookupServiceMetadata = (service: { [x: string]: any }) => { + const serviceKeys = Object.keys(service); + const intersectingMethods = serviceKeys.reduce((acc, k) => { + const method = service[k]; + if (!method) { + throw new Error(`cannot find method ${k} on service`); + } + const components = method.path.split("/"); + acc[k] = { + name: components[1], + method: components[2], + type: getType(method), + path: method.path, + responseType: method.responseType, + requestType: method.requestType, + }; + return acc; + }, {} as any); + + return (key: string) => intersectingMethods[key]; +}; + +export const handler = { + get( + target: { + [x: string]: any; + intercept: () => any; + addService: (arg0: any, arg1: {}) => any; + }, + propKey: string + ) { + if (propKey !== "addService") { + return target[propKey]; + } + return (service: any, implementation: { [x: string]: any }) => { + const newImplementation = {} as any; + const lookup = lookupServiceMetadata(service); + for (const k in implementation) { + const name = k; + const fn = implementation[k]; + newImplementation[name] = (call: any, callback: any) => { + const ctx = { + call, + name, + service: lookup(name), + status: { + code: status.UNKNOWN, + details: "", + }, + }; + const newCallback = (callback: (arg0: any) => void) => { + return (...args: any[]) => { + ctx.status = { + code: status.OK, + details: "", + }; + const err = args[0]; + if (err) { + ctx.status = { + code: status.UNKNOWN, + details: err, + }; + } + // @ts-ignore + callback(...args); + }; + }; + + const interceptors = target.intercept(); + const first = interceptors.next(); + if (!first.value) { + // if we don't have any interceptors + return new Promise((resolve) => { + return resolve(fn(call, newCallback(callback))); + }); + } + first.value(ctx, function next() { + return new Promise((resolve) => { + const i = interceptors.next(); + if (i.done) { + return resolve(fn(call, newCallback(callback))); + } + return resolve(i.value(ctx, next)); + }); + }); + }; + } + return target.addService(service, newImplementation); + }; + }, +}; + +export const createServerProxy = ( + server: Server +): Server & { + intercept: Generator; + interceptors: any[]; + use: (fn: any) => void; +} => { + // @ts-ignore + server.interceptors = []; + // @ts-ignore + server.use = (fn: any) => { + // @ts-ignore + server.interceptors.push(fn); + }; + // @ts-ignore + server.intercept = function* intercept() { + let i = 0; + // @ts-ignore + while (i < server.interceptors.length) { + // @ts-ignore + yield server.interceptors[i]; + i++; + } + }; + // @ts-ignore + return new Proxy(server, handler); +}; diff --git a/services/payment/src/lib/reflection.ts b/services/payment/src/lib/reflection.ts new file mode 100644 index 00000000..060091b0 --- /dev/null +++ b/services/payment/src/lib/reflection.ts @@ -0,0 +1,23 @@ +import { Server } from "@grpc/grpc-js"; +import { log } from "@payment/lib/log"; +import { access, constants } from "fs"; +import { addReflection as base_addReflection } from "grpc-server-reflection"; +import { resolve as resolvePath } from "path"; + +export const addReflection = (server: Server, path: string) => { + if (process.env.NODE_ENV === "production") { + log.warn("Reflection is disabled in production"); + return; + } + + const resolvedPath = resolvePath(path); + try { + access(resolvedPath, constants.R_OK, () => {}); + + base_addReflection(server, path); + } catch (err) { + console.log("here"); + log.warn(`Reflection file ${resolvedPath} is not readable`); + return; + } +}; diff --git a/services/payment/src/lib/struct.ts b/services/payment/src/lib/struct.ts new file mode 100644 index 00000000..b1b7f50e --- /dev/null +++ b/services/payment/src/lib/struct.ts @@ -0,0 +1,53 @@ +import { Prisma } from "@prisma/client"; + +export type Struct = { + fields: { + [key: string]: { + kind: string; + [key: string]: any; + }; + }; +}; + +export const parseStruct = (struct: Struct) => { + if (!struct) return null; + const fields = struct.fields; + + if (!fields || Object.keys(fields).length === 0) return null; + + const parsed = Object.entries(fields).reduce((acc: any, [key, value]) => { + return { + ...acc, + [key]: value[value.kind], + }; + }, {}); + + return parsed; +}; + +export const toStruct = ( + obj: { [key: string]: any } | Prisma.JsonValue | null +): Struct => { + if (!obj) return { fields: {} }; + const fields = Object.entries(obj).reduce((acc: any, [key, value]) => { + if (typeof value === "object") { + return { + ...acc, + [key]: { + kind: "structValue", + structValue: toStruct(value), + }, + }; + } + + return { + ...acc, + [key]: { + kind: `${typeof value}Value`, + [`${typeof value}Value`]: value, + }, + }; + }, {}); + + return { fields }; +}; diff --git a/services/payment/src/middleware/log.ts b/services/payment/src/middleware/log.ts new file mode 100644 index 00000000..6ef3eddc --- /dev/null +++ b/services/payment/src/middleware/log.ts @@ -0,0 +1,42 @@ +import { publish } from "@payment/lib/amqp"; +import { utils } from "@payment/lib/log"; +import { log } from "@payment/lib/log"; + +type Context = { + call: { + request: Map; + }; + service: { + path: string; + }; +}; + +const parseContext = (ctx: Context) => { + const { + call: { request }, + service: { path }, + } = ctx; + return { request, path }; +}; + +export const msg = ( + type: "GRPC" | "AMQP", + path: string | undefined, + requestAt: Date, + responseAt: Date +) => + `${utils.magenta(requestAt.toISOString())} | ${utils[ + type === "GRPC" ? "cyan" : "red" + ](type)}${path ? ` | ${utils.yellow(path)}` : ""} | ${utils.green( + responseAt.getTime() - requestAt.getTime() + "ms" + )} |`; + +export const logGRPC = async (ctx: Context, next: () => Promise) => { + const requestAt = new Date(); + await next(); + const responseAt = new Date(); + let { request, path } = parseContext(ctx); + path = path?.split(".").at(-1) || ""; + publish({ request, path }, "log"); + log.debug(msg("GRPC", path, requestAt, responseAt), JSON.stringify(request)); +}; diff --git a/services/payment/src/resources/grpc-credentials.ts b/services/payment/src/resources/grpc-credentials.ts new file mode 100644 index 00000000..75a2b5d5 --- /dev/null +++ b/services/payment/src/resources/grpc-credentials.ts @@ -0,0 +1,5 @@ +import { credentials, ServerCredentials } from "@grpc/grpc-js"; + +export const insecure = credentials.createInsecure(); + +export const serverInsecure = ServerCredentials.createInsecure(); diff --git a/services/payment/src/resources/protoloader-options.ts b/services/payment/src/resources/protoloader-options.ts new file mode 100644 index 00000000..5022d96d --- /dev/null +++ b/services/payment/src/resources/protoloader-options.ts @@ -0,0 +1,7 @@ +export const options = { + keepCase: true, + longs: String, + enums: String, + defaults: true, + oneofs: true, +}; diff --git a/services/payment/src/server.ts b/services/payment/src/server.ts new file mode 100644 index 00000000..2a5aede5 --- /dev/null +++ b/services/payment/src/server.ts @@ -0,0 +1,43 @@ +import "dotenv/config"; +import { resolve as resolvePath } from "path"; + +import { loadSync } from "@grpc/proto-loader"; +import { loadPackageDefinition, Server } from "@grpc/grpc-js"; + +import { log, utils } from "@payment/lib/log"; +import { options } from "@payment/resources/protoloader-options"; +import { serverInsecure } from "@payment/resources/grpc-credentials"; +import { addReflection } from "@payment/lib/reflection"; +import { createServerProxy } from "@payment/lib/proxy"; +import { logGRPC } from "@payment/middleware/log"; +import paymentHandlers from "@payment/handlers/payment"; + +const PORT = process.env.PORT || 50003; +const ADDRESS = `0.0.0.0:${PORT}`; + +const PROTO_PATH = resolvePath(__dirname + "/../../proto/payment.proto"); +const REFLECTION_PATH = resolvePath( + __dirname + "/../reflection_descriptor.bin" +); + +const packageDefinition = loadSync(PROTO_PATH, options); +const grpc = loadPackageDefinition(packageDefinition) as any; +const { service: p } = grpc.com.goodfood.payment.PaymentService; + +// const server = new Server(); + +const server = createServerProxy(new Server()); +server.addService(p, paymentHandlers); +server.use(logGRPC); + +server.bindAsync(ADDRESS, serverInsecure, () => { + server.start(); + addReflection(server, REFLECTION_PATH); + const message = + `---- ${utils.green("good")}${utils.yellow("food")} Payment Service ----` + + `\n` + + `started on: ${utils.bold(ADDRESS)} ${utils.green("✓")}\n`; + log.debug(message); +}); + +export default server; diff --git a/services/payment/src/types/index.d.ts b/services/payment/src/types/index.d.ts new file mode 100644 index 00000000..39126f25 --- /dev/null +++ b/services/payment/src/types/index.d.ts @@ -0,0 +1,3 @@ +export type Data = { + request: T; +}; \ No newline at end of file diff --git a/services/payment/src/types/payment.d.ts b/services/payment/src/types/payment.d.ts new file mode 100644 index 00000000..d397e04b --- /dev/null +++ b/services/payment/src/types/payment.d.ts @@ -0,0 +1,44 @@ +// import { Prisma } from "@prisma/client"; + +import { PaymentStatus } from "@prisma/client"; + +export type User = { + id: string; + name: string; + email: string; +}; + +export type Payment = { + id: string; + total: number; + status: PaymentStatus; + user: User; + user_id: string; + + created_at: Date | string; + updated_at: Date | string; +}; + +export type GetPaymentRequest = { + id: string; +}; + +export type GetPaymentsByUserRequest = { + id: string; +}; +export type GetPaymentsByUserResponse = { + payments: Payment[]; +}; + +export type CreatePaymentRequest = { + total: number; + + user_id: string; + name: string; + email: string; +}; + +export type UpdatePaymentRequest = { + id: string; + status: PaymentStatus; +}; diff --git a/services/payment/terraform/data.tf b/services/payment/terraform/data.tf new file mode 100644 index 00000000..7b4bb3bb --- /dev/null +++ b/services/payment/terraform/data.tf @@ -0,0 +1,17 @@ +data "azurerm_resource_group" "rg-goodfood" { + name = "rg-${var.project_name}${var.environnment_suffix}" +} + +data "azurerm_key_vault" "kv-goodfood-payment" { + resource_group_name = data.azurerm_resource_group.rg-goodfood.name + name = "kv-${var.project_name}" +} + +data "azurerm_key_vault_secret" "payment-db-login" { + name = "payment-db-login" + key_vault_id = data.azurerm_key_vault.kv-goodfood-payment.id +} +data "azurerm_key_vault_secret" "payment-db-password" { + name = "payment-db-password" + key_vault_id = data.azurerm_key_vault.kv-goodfood-payment.id +} \ No newline at end of file diff --git a/services/payment/terraform/env/dev-backend.tfvars.example b/services/payment/terraform/env/dev-backend.tfvars.example new file mode 100644 index 00000000..13bd462d --- /dev/null +++ b/services/payment/terraform/env/dev-backend.tfvars.example @@ -0,0 +1,4 @@ +resource_group_name = "rg-goodfood-dev" +storage_account_name = "sa-goodfood-states" +container_name = "tfstate" +key = "payment-dev.tfstate" diff --git a/services/payment/terraform/env/dev.tfvars.example b/services/payment/terraform/env/dev.tfvars.example new file mode 100644 index 00000000..4ac1f44d --- /dev/null +++ b/services/payment/terraform/env/dev.tfvars.example @@ -0,0 +1 @@ +environnment_suffix = "-dev" diff --git a/services/payment/terraform/main.tf b/services/payment/terraform/main.tf new file mode 100644 index 00000000..f6af9cba --- /dev/null +++ b/services/payment/terraform/main.tf @@ -0,0 +1,74 @@ +terraform { + required_providers { + azurerm = { + source = "hashicorp/azurerm" + version = "3.48.0" + } + } + backend "azurerm" {} +} + +provider "azurerm" { + features { + key_vault { + purge_soft_deleted_secrets_on_destroy = true + recover_soft_deleted_secrets = true + } + } +} + +resource "azurerm_key_vault" "kv-goodfood-payment" { + name = "kv-goodfood-payment" + location = data.azurerm_resource_group.rg-goodfood.location + resource_group_name = data.azurerm_resource_group.rg-goodfood.name + tenant_id = data.azurerm_client_config.current.tenant_id + sku_name = "standard" + soft_delete_retention_days = 7 + + access_policy { + tenant_id = data.azurerm_client_config.current.tenant_id + object_id = data.azurerm_client_config.current.object_id + + key_permissions = [ + "Create", + "Get", + ] + + secret_permissions = [ + "Set", + "Get", + "Delete", + "Purge", + "Recover" + ] + } +} + +resource "azurerm_postgresql_server" "pg-goodfood-payment" { + name = "pg-goodfood-payment${var.environnment_suffix}" + location = data.azurerm_resource_group.rg-goodfood.location + resource_group_name = data.azurerm_resource_group.rg-goodfood.name + + sku_name = "B_Gen5_2" + + storage_mb = 5120 + backup_retention_days = 7 + geo_redundant_backup_enabled = false + auto_grow_enabled = true + + administrator_login = data.azurerm_key_vault_secret.payment-db-login.value + administrator_login_password = data.azurerm_key_vault_secret.payment-db-password.value + version = "11" + + ssl_enforcement_enabled = false + ssl_minimal_tls_version_enforced = "TLSEnforcementDisabled" // TODO: change to TLS1_2 + +} + +resource "azurerm_postgresql_firewall_rule" "pgfw-goodfood-payment" { + name = "allow-azure-resources" + resource_group_name = data.azurerm_resource_group.rg-goodfood.name + server_name = azurerm_postgresql_server.pg-goodfood-payment.name + start_ip_address = "0.0.0.0" + end_ip_address = "0.0.0.0" +} diff --git a/services/payment/terraform/outputs.tf b/services/payment/terraform/outputs.tf new file mode 100644 index 00000000..a2d60616 --- /dev/null +++ b/services/payment/terraform/outputs.tf @@ -0,0 +1,6 @@ +output "main-rg-name" { + value = data.azurerm_resource_group.rg-goodfood.name +} +output "main-rg-id" { + value = data.azurerm_resource_group.rg-goodfood.id +} \ No newline at end of file diff --git a/services/payment/terraform/variables.tf b/services/payment/terraform/variables.tf new file mode 100644 index 00000000..65fd7547 --- /dev/null +++ b/services/payment/terraform/variables.tf @@ -0,0 +1,16 @@ +variable "environnment_suffix" { + type = string + description = "The suffix to append to the environment name" +} + +variable "location" { + type = string + description = "The location/region where all resources in this environment should be created" + default = "West Europe" +} + +variable "project_name" { + type = string + description = "The name of the project" + default = "goodfood" +} \ No newline at end of file diff --git a/services/payment/tsconfig.json b/services/payment/tsconfig.json new file mode 100644 index 00000000..8b50cab9 --- /dev/null +++ b/services/payment/tsconfig.json @@ -0,0 +1,18 @@ +{ + "compilerOptions": { + "sourceMap": true, + "outDir": "dist", + "strict": true, + "lib": ["esnext"], + "esModuleInterop": true, + "baseUrl": ".", + "paths": { + "@payment/*": ["src/*"] + } + }, + "include": ["src/**/*.ts"], + "exclude": ["node_modules"], + "ts-node": { + "require": ["tsconfig-paths/register"] + } +} diff --git a/services/payment/vitest.config.ts b/services/payment/vitest.config.ts new file mode 100644 index 00000000..773de309 --- /dev/null +++ b/services/payment/vitest.config.ts @@ -0,0 +1,10 @@ +import { defineConfig } from "vitest/config"; +import tsconfigPaths from "vite-tsconfig-paths"; + +export default defineConfig({ + plugins: [tsconfigPaths()], + base: "/src/tests", + // test: { + // setupFiles: ["./src/tests/setup.ts"], + // }, +}); diff --git a/services/proto/payment.proto b/services/proto/payment.proto new file mode 100644 index 00000000..5cc04768 --- /dev/null +++ b/services/proto/payment.proto @@ -0,0 +1,56 @@ +syntax = "proto3"; + +package com.goodfood.payment; + + +message User { + string id = 1; + + string name = 2; + string email = 3; +} + +message Payment { + string id = 1; + + float total = 2; + string status = 3; + + User user = 4; + string user_id = 5; + + string createdAt = 6; + string updatedAt = 7; +} + +service PaymentService { + rpc GetPayment(GetPaymentRequest) returns (Payment) {} + rpc GetPaymentsByUser(GetPaymentsByUserRequest) returns (GetPaymentsByUserResponse) {} + rpc CreatePayment(CreatePaymentRequest) returns (Payment) {} + rpc UpdatePayment(UpdatePaymentRequest) returns (Payment) {} +} + +message GetPaymentRequest { + string id = 1; +} + +message GetPaymentsByUserRequest { + string id = 1; +} + +message GetPaymentsByUserResponse { + repeated Payment payments = 1; +} + +message CreatePaymentRequest { + float total = 1; + string userId = 2; + + string name = 3; + string email = 4; +} + +message UpdatePaymentRequest { + string id = 1; + string status = 2; +} From 24fde65ea7c53ff1b91f7a7283480d0776a09801 Mon Sep 17 00:00:00 2001 From: Florian LEROUX Date: Fri, 4 Aug 2023 23:24:00 +0200 Subject: [PATCH 346/883] feat(stripe): add stripe checkout session and webhook --- services/payment/.env.example | 8 +- services/payment/package.json | 5 +- services/payment/pnpm-lock.yaml | 477 +++++++++++++++++- .../migration.sql | 12 + services/payment/prisma/schema.prisma | 3 +- services/payment/prisma/seed.ts | 3 + .../payment/src/handlers/payment/create.ts | 31 -- .../payment/src/handlers/payment/get-user.ts | 8 +- services/payment/src/handlers/payment/get.ts | 6 +- .../payment/src/handlers/payment/index.ts | 4 - .../payment/src/handlers/payment/update.ts | 23 - .../stripe/create-checkout-session.ts | 59 +++ services/payment/src/handlers/stripe/index.ts | 7 + .../payment/src/handlers/stripe/webhook.ts | 87 ++++ services/payment/src/lib/stripe.ts | 8 + services/payment/src/server.ts | 8 +- services/payment/src/types/payment.d.ts | 13 - services/payment/src/types/stripe.d.ts | 13 + services/proto/payment.proto | 21 +- 19 files changed, 706 insertions(+), 90 deletions(-) create mode 100644 services/payment/prisma/migrations/20230804142527_add_stripe_id/migration.sql delete mode 100644 services/payment/src/handlers/payment/create.ts delete mode 100644 services/payment/src/handlers/payment/update.ts create mode 100644 services/payment/src/handlers/stripe/create-checkout-session.ts create mode 100644 services/payment/src/handlers/stripe/index.ts create mode 100644 services/payment/src/handlers/stripe/webhook.ts create mode 100644 services/payment/src/lib/stripe.ts create mode 100644 services/payment/src/types/stripe.d.ts diff --git a/services/payment/.env.example b/services/payment/.env.example index fe2eb7b2..7e687d7e 100644 --- a/services/payment/.env.example +++ b/services/payment/.env.example @@ -1,4 +1,10 @@ DATABASE_URL=postgres://postgres:password@localhost:5432/postgres AMQP_URL=amqp://guest:guest@localhost -PORT=50003 \ No newline at end of file +PORT=50003 + +STRIPE_API_KEY= +STRIPE_API_SECRET= +STRIPE_WEBHOOK_ENDPOINT="/webhook" +STRIPE_WEBHOOK_SECRET= +STRIPE_WEBHOOK_PORT=4242 \ No newline at end of file diff --git a/services/payment/package.json b/services/payment/package.json index dec0bacc..e41e4af8 100644 --- a/services/payment/package.json +++ b/services/payment/package.json @@ -19,11 +19,14 @@ "@prisma/client": "5.1.1", "amqplib": "^0.10.3", "dotenv": "^16.0.3", + "express": "^4.18.2", "grpc-server-reflection": "^0.1.5", - "protobufjs": "7.2.2" + "protobufjs": "7.2.2", + "stripe": "^12.17.0" }, "devDependencies": { "@types/amqplib": "^0.10.1", + "@types/express": "^4.17.17", "@types/node": "18.15.9", "esbuild": "^0.17.18", "grpc-tools": "^1.12.4", diff --git a/services/payment/pnpm-lock.yaml b/services/payment/pnpm-lock.yaml index 87352acc..7bde3f1c 100644 --- a/services/payment/pnpm-lock.yaml +++ b/services/payment/pnpm-lock.yaml @@ -20,17 +20,26 @@ dependencies: dotenv: specifier: ^16.0.3 version: 16.0.3 + express: + specifier: ^4.18.2 + version: 4.18.2 grpc-server-reflection: specifier: ^0.1.5 version: 0.1.5 protobufjs: specifier: 7.2.2 version: 7.2.2 + stripe: + specifier: ^12.17.0 + version: 12.17.0 devDependencies: '@types/amqplib': specifier: ^0.10.1 version: 0.10.1 + '@types/express': + specifier: ^4.17.17 + version: 4.17.17 '@types/node': specifier: 18.15.9 version: 18.15.9 @@ -511,6 +520,13 @@ packages: '@types/node': 18.15.9 dev: true + /@types/body-parser@1.19.2: + resolution: {integrity: sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==} + dependencies: + '@types/connect': 3.4.35 + '@types/node': 18.15.9 + dev: true + /@types/chai-subset@1.3.3: resolution: {integrity: sha512-frBecisrNGz+F4T6bcc+NLeolfiojh5FxW2klu669+8BARtyQv2C/GkNW6FUodVe4BroGMP/wER/YDGc7rEllw==} dependencies: @@ -521,13 +537,72 @@ packages: resolution: {integrity: sha512-mEo1sAde+UCE6b2hxn332f1g1E8WfYRu6p5SvTKr2ZKC1f7gFJXk4h5PyGP9Dt6gCaG8y8XhwnXWC6Iy2cmBng==} dev: true + /@types/connect@3.4.35: + resolution: {integrity: sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==} + dependencies: + '@types/node': 18.15.9 + dev: true + + /@types/express-serve-static-core@4.17.35: + resolution: {integrity: sha512-wALWQwrgiB2AWTT91CB62b6Yt0sNHpznUXeZEcnPU3DRdlDIz74x8Qg1UUYKSVFi+va5vKOLYRBI1bRKiLLKIg==} + dependencies: + '@types/node': 18.15.9 + '@types/qs': 6.9.7 + '@types/range-parser': 1.2.4 + '@types/send': 0.17.1 + dev: true + + /@types/express@4.17.17: + resolution: {integrity: sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==} + dependencies: + '@types/body-parser': 1.19.2 + '@types/express-serve-static-core': 4.17.35 + '@types/qs': 6.9.7 + '@types/serve-static': 1.15.2 + dev: true + + /@types/http-errors@2.0.1: + resolution: {integrity: sha512-/K3ds8TRAfBvi5vfjuz8y6+GiAYBZ0x4tXv1Av6CWBWn0IlADc+ZX9pMq7oU0fNQPnBwIZl3rmeLp6SBApbxSQ==} + dev: true + /@types/long@4.0.2: resolution: {integrity: sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==} dev: false + /@types/mime@1.3.2: + resolution: {integrity: sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==} + dev: true + + /@types/mime@3.0.1: + resolution: {integrity: sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA==} + dev: true + /@types/node@18.15.9: resolution: {integrity: sha512-dUxhiNzBLr6IqlZXz6e/rN2YQXlFgOei/Dxy+e3cyXTJ4txSUbGT2/fmnD6zd/75jDMeW5bDee+YXxlFKHoV0A==} + /@types/qs@6.9.7: + resolution: {integrity: sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==} + dev: true + + /@types/range-parser@1.2.4: + resolution: {integrity: sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==} + dev: true + + /@types/send@0.17.1: + resolution: {integrity: sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q==} + dependencies: + '@types/mime': 1.3.2 + '@types/node': 18.15.9 + dev: true + + /@types/serve-static@1.15.2: + resolution: {integrity: sha512-J2LqtvFYCzaj8pVYKw8klQXrLLk7TBZmQ4ShlcdkELFKGwGMfevMLneMMRkMgZxotOD9wg497LpC7O8PcvAmfw==} + dependencies: + '@types/http-errors': 2.0.1 + '@types/mime': 3.0.1 + '@types/node': 18.15.9 + dev: true + /@vitest/expect@0.29.8: resolution: {integrity: sha512-xlcVXn5I5oTq6NiZSY3ykyWixBxr5mG8HYtjvpgg6KaqHm0mvhX18xuwl5YGxIRNt/A5jidd7CWcNHrSvgaQqQ==} dependencies: @@ -563,6 +638,14 @@ packages: resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} dev: true + /accepts@1.3.8: + resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} + engines: {node: '>= 0.6'} + dependencies: + mime-types: 2.1.35 + negotiator: 0.6.3 + dev: false + /acorn-walk@8.2.0: resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} engines: {node: '>=0.4.0'} @@ -644,6 +727,10 @@ packages: resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} dev: true + /array-flatten@1.1.1: + resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} + dev: false + /array-union@2.1.0: resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} engines: {node: '>=8'} @@ -679,6 +766,26 @@ packages: readable-stream: 3.6.2 dev: true + /body-parser@1.20.1: + resolution: {integrity: sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + dependencies: + bytes: 3.1.2 + content-type: 1.0.5 + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + on-finished: 2.4.1 + qs: 6.11.0 + raw-body: 2.5.1 + type-is: 1.6.18 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color + dev: false + /brace-expansion@1.1.11: resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} dependencies: @@ -704,11 +811,23 @@ packages: ieee754: 1.2.1 dev: true + /bytes@3.1.2: + resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} + engines: {node: '>= 0.8'} + dev: false + /cac@6.7.14: resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} engines: {node: '>=8'} dev: true + /call-bind@1.0.2: + resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==} + dependencies: + function-bind: 1.1.1 + get-intrinsic: 1.2.1 + dev: false + /chai@4.3.7: resolution: {integrity: sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==} engines: {node: '>=4'} @@ -795,6 +914,27 @@ packages: resolution: {integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==} dev: true + /content-disposition@0.5.4: + resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} + engines: {node: '>= 0.6'} + dependencies: + safe-buffer: 5.2.1 + dev: false + + /content-type@1.0.5: + resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} + engines: {node: '>= 0.6'} + dev: false + + /cookie-signature@1.0.6: + resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} + dev: false + + /cookie@0.5.0: + resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==} + engines: {node: '>= 0.6'} + dev: false + /core-util-is@1.0.3: resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} @@ -802,6 +942,17 @@ packages: resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} dev: true + /debug@2.6.9: + resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.0.0 + dev: false + /debug@3.2.7(supports-color@5.5.0): resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} peerDependencies: @@ -848,6 +999,16 @@ packages: resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==} dev: true + /depd@2.0.0: + resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} + engines: {node: '>= 0.8'} + dev: false + + /destroy@1.2.0: + resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + dev: false + /detect-libc@2.0.1: resolution: {integrity: sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==} engines: {node: '>=8'} @@ -879,6 +1040,10 @@ packages: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} dev: true + /ee-first@1.1.1: + resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + dev: false + /emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} @@ -886,6 +1051,11 @@ packages: resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} dev: true + /encodeurl@1.0.2: + resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} + engines: {node: '>= 0.8'} + dev: false + /end-of-stream@1.4.4: resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} dependencies: @@ -926,11 +1096,59 @@ packages: resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} engines: {node: '>=6'} + /escape-html@1.0.3: + resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + dev: false + + /etag@1.8.1: + resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} + engines: {node: '>= 0.6'} + dev: false + /expand-template@2.0.3: resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} engines: {node: '>=6'} dev: true + /express@4.18.2: + resolution: {integrity: sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==} + engines: {node: '>= 0.10.0'} + dependencies: + accepts: 1.3.8 + array-flatten: 1.1.1 + body-parser: 1.20.1 + content-disposition: 0.5.4 + content-type: 1.0.5 + cookie: 0.5.0 + cookie-signature: 1.0.6 + debug: 2.6.9 + depd: 2.0.0 + encodeurl: 1.0.2 + escape-html: 1.0.3 + etag: 1.8.1 + finalhandler: 1.2.0 + fresh: 0.5.2 + http-errors: 2.0.0 + merge-descriptors: 1.0.1 + methods: 1.1.2 + on-finished: 2.4.1 + parseurl: 1.3.3 + path-to-regexp: 0.1.7 + proxy-addr: 2.0.7 + qs: 6.11.0 + range-parser: 1.2.1 + safe-buffer: 5.2.1 + send: 0.18.0 + serve-static: 1.15.0 + setprototypeof: 1.2.0 + statuses: 2.0.1 + type-is: 1.6.18 + utils-merge: 1.0.1 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + dev: false + /fast-glob@3.2.12: resolution: {integrity: sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==} engines: {node: '>=8.6.0'} @@ -955,6 +1173,31 @@ packages: to-regex-range: 5.0.1 dev: true + /finalhandler@1.2.0: + resolution: {integrity: sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==} + engines: {node: '>= 0.8'} + dependencies: + debug: 2.6.9 + encodeurl: 1.0.2 + escape-html: 1.0.3 + on-finished: 2.4.1 + parseurl: 1.3.3 + statuses: 2.0.1 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color + dev: false + + /forwarded@0.2.0: + resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} + engines: {node: '>= 0.6'} + dev: false + + /fresh@0.5.2: + resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} + engines: {node: '>= 0.6'} + dev: false + /from2@2.3.0: resolution: {integrity: sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==} dependencies: @@ -997,7 +1240,6 @@ packages: /function-bind@1.1.1: resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} - dev: true /gauge@3.0.2: resolution: {integrity: sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==} @@ -1022,6 +1264,15 @@ packages: resolution: {integrity: sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==} dev: true + /get-intrinsic@1.2.1: + resolution: {integrity: sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==} + dependencies: + function-bind: 1.1.1 + has: 1.0.3 + has-proto: 1.0.1 + has-symbols: 1.0.3 + dev: false + /github-from-package@0.0.0: resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==} dev: true @@ -1095,6 +1346,16 @@ packages: engines: {node: '>=8'} dev: true + /has-proto@1.0.1: + resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} + engines: {node: '>= 0.4'} + dev: false + + /has-symbols@1.0.3: + resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} + engines: {node: '>= 0.4'} + dev: false + /has-unicode@2.0.1: resolution: {integrity: sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==} dev: true @@ -1104,7 +1365,17 @@ packages: engines: {node: '>= 0.4.0'} dependencies: function-bind: 1.1.1 - dev: true + + /http-errors@2.0.0: + resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} + engines: {node: '>= 0.8'} + dependencies: + depd: 2.0.0 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 2.0.1 + toidentifier: 1.0.1 + dev: false /https-proxy-agent@5.0.1: resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} @@ -1116,6 +1387,13 @@ packages: - supports-color 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 + /ieee754@1.2.1: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} dev: true @@ -1151,6 +1429,11 @@ packages: p-is-promise: 3.0.0 dev: true + /ipaddr.js@1.9.1: + resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} + engines: {node: '>= 0.10'} + dev: false + /is-binary-path@2.1.0: resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} engines: {node: '>=8'} @@ -1269,11 +1552,25 @@ packages: resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} dev: true + /media-typer@0.3.0: + resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} + engines: {node: '>= 0.6'} + dev: false + + /merge-descriptors@1.0.1: + resolution: {integrity: sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==} + dev: false + /merge2@1.4.1: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} dev: true + /methods@1.1.2: + resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} + engines: {node: '>= 0.6'} + dev: false + /micromatch@4.0.5: resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} engines: {node: '>=8.6'} @@ -1282,6 +1579,24 @@ packages: picomatch: 2.3.1 dev: true + /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 + + /mime@1.6.0: + resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} + engines: {node: '>=4'} + hasBin: true + dev: false + /mimic-response@3.1.0: resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} engines: {node: '>=10'} @@ -1336,12 +1651,15 @@ packages: ufo: 1.1.2 dev: true + /ms@2.0.0: + resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} + dev: false + /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: true /multistream@4.1.0: resolution: {integrity: sha512-J1XDiAmmNpRCBfIWJv+n0ymC4ABcf/Pl+5YvC5B/D2f/2+8PtHvCNxMPKiQcZyi922Hq69J2YOpb1pTywfifyw==} @@ -1360,6 +1678,11 @@ packages: resolution: {integrity: sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==} dev: true + /negotiator@0.6.3: + resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} + engines: {node: '>= 0.6'} + dev: false + /node-abi@3.40.0: resolution: {integrity: sha512-zNy02qivjjRosswoYmPi8hIKJRr8MpQyeKT6qlcq/OnOgA3Rhoae+IYOqsM9V5+JnHWmxKnWOT2GxvtqdtOCXA==} engines: {node: '>=10'} @@ -1430,6 +1753,17 @@ packages: engines: {node: '>=0.10.0'} dev: true + /object-inspect@1.12.3: + resolution: {integrity: sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==} + dev: false + + /on-finished@2.4.1: + resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} + engines: {node: '>= 0.8'} + dependencies: + ee-first: 1.1.1 + dev: false + /once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} dependencies: @@ -1448,6 +1782,11 @@ packages: yocto-queue: 1.0.0 dev: true + /parseurl@1.3.3: + resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} + engines: {node: '>= 0.8'} + dev: false + /path-is-absolute@1.0.1: resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} engines: {node: '>=0.10.0'} @@ -1457,6 +1796,10 @@ packages: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} dev: true + /path-to-regexp@0.1.7: + resolution: {integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==} + dev: false + /path-type@4.0.0: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} @@ -1605,6 +1948,14 @@ packages: long: 5.2.3 dev: false + /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 + dev: false + /pstree.remy@1.1.8: resolution: {integrity: sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==} dev: true @@ -1616,6 +1967,20 @@ packages: once: 1.4.0 dev: true + /qs@6.11.0: + resolution: {integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==} + engines: {node: '>=0.6'} + dependencies: + side-channel: 1.0.4 + dev: false + + /qs@6.11.2: + resolution: {integrity: sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==} + engines: {node: '>=0.6'} + dependencies: + side-channel: 1.0.4 + dev: false + /querystringify@2.2.0: resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} dev: false @@ -1624,6 +1989,21 @@ packages: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} dev: true + /range-parser@1.2.1: + resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} + engines: {node: '>= 0.6'} + dev: false + + /raw-body@2.5.1: + resolution: {integrity: sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==} + engines: {node: '>= 0.8'} + dependencies: + bytes: 3.1.2 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + unpipe: 1.0.0 + dev: false + /rc@1.2.8: resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} hasBin: true @@ -1723,7 +2103,10 @@ packages: /safe-buffer@5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - dev: true + + /safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + dev: false /semver@5.7.1: resolution: {integrity: sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==} @@ -1748,10 +2131,55 @@ packages: lru-cache: 6.0.0 dev: true + /send@0.18.0: + resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==} + engines: {node: '>= 0.8.0'} + dependencies: + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + encodeurl: 1.0.2 + escape-html: 1.0.3 + etag: 1.8.1 + fresh: 0.5.2 + http-errors: 2.0.0 + mime: 1.6.0 + ms: 2.1.3 + on-finished: 2.4.1 + range-parser: 1.2.1 + statuses: 2.0.1 + transitivePeerDependencies: + - supports-color + dev: false + + /serve-static@1.15.0: + resolution: {integrity: sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==} + engines: {node: '>= 0.8.0'} + dependencies: + encodeurl: 1.0.2 + escape-html: 1.0.3 + parseurl: 1.3.3 + send: 0.18.0 + transitivePeerDependencies: + - supports-color + dev: false + /set-blocking@2.0.0: resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} dev: true + /setprototypeof@1.2.0: + resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + dev: false + + /side-channel@1.0.4: + resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.2.1 + object-inspect: 1.12.3 + dev: false + /siginfo@2.0.0: resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} dev: true @@ -1806,6 +2234,11 @@ packages: resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} dev: true + /statuses@2.0.1: + resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} + engines: {node: '>= 0.8'} + dev: false + /std-env@3.3.3: resolution: {integrity: sha512-Rz6yejtVyWnVjC1RFvNmYL10kgjC49EOghxWn0RFqlCHGFpQx+Xe7yW3I4ceK1SGrWIGMjD5Kbue8W/udkbMJg==} dev: true @@ -1878,6 +2311,14 @@ packages: acorn: 8.8.2 dev: true + /stripe@12.17.0: + resolution: {integrity: sha512-f8GhS2LQlGCDZ1Akyu57txgSWyLUEYf0yZYS7x2aTKJXVua5lLmmgfJFFYHfTgEdS5P6rurf0Ghcf/HVLggv5g==} + engines: {node: '>=12.*'} + dependencies: + '@types/node': 18.15.9 + qs: 6.11.2 + dev: false + /supports-color@5.5.0: resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} engines: {node: '>=4'} @@ -1955,6 +2396,11 @@ packages: is-number: 7.0.0 dev: true + /toidentifier@1.0.1: + resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} + engines: {node: '>=0.6'} + dev: false + /touch@3.1.0: resolution: {integrity: sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==} hasBin: true @@ -2030,6 +2476,14 @@ packages: engines: {node: '>=4'} dev: true + /type-is@1.6.18: + resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} + engines: {node: '>= 0.6'} + dependencies: + media-typer: 0.3.0 + mime-types: 2.1.35 + dev: false + /typescript@5.0.2: resolution: {integrity: sha512-wVORMBGO/FAs/++blGNeAVdbNKtIh1rbBL2EyQ1+J9lClJ93KiiKe8PmFIVdXhHcyv44SL9oglmfeSsndo0jRw==} engines: {node: '>=12.20'} @@ -2049,6 +2503,11 @@ packages: engines: {node: '>= 10.0.0'} dev: true + /unpipe@1.0.0: + resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} + engines: {node: '>= 0.8'} + dev: false + /url-parse@1.5.10: resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} dependencies: @@ -2060,10 +2519,20 @@ packages: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} dev: true + /utils-merge@1.0.1: + resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} + engines: {node: '>= 0.4.0'} + dev: false + /v8-compile-cache-lib@3.0.1: resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} dev: true + /vary@1.1.2: + resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} + engines: {node: '>= 0.8'} + dev: false + /vite-node@0.29.8(@types/node@18.15.9): resolution: {integrity: sha512-b6OtCXfk65L6SElVM20q5G546yu10/kNrhg08afEoWlFRJXFq9/6glsvSVY+aI6YeC1tu2TtAqI2jHEQmOmsFw==} engines: {node: '>=v14.16.0'} diff --git a/services/payment/prisma/migrations/20230804142527_add_stripe_id/migration.sql b/services/payment/prisma/migrations/20230804142527_add_stripe_id/migration.sql new file mode 100644 index 00000000..261066d4 --- /dev/null +++ b/services/payment/prisma/migrations/20230804142527_add_stripe_id/migration.sql @@ -0,0 +1,12 @@ +/* + Warnings: + + - A unique constraint covering the columns `[stripe_id]` on the table `Payment` will be added. If there are existing duplicate values, this will fail. + - Added the required column `stripe_id` to the `Payment` table without a default value. This is not possible if the table is not empty. + +*/ +-- AlterTable +ALTER TABLE "Payment" ADD COLUMN "stripe_id" TEXT NOT NULL; + +-- CreateIndex +CREATE UNIQUE INDEX "Payment_stripe_id_key" ON "Payment"("stripe_id"); diff --git a/services/payment/prisma/schema.prisma b/services/payment/prisma/schema.prisma index 3122670d..21efd775 100644 --- a/services/payment/prisma/schema.prisma +++ b/services/payment/prisma/schema.prisma @@ -22,7 +22,8 @@ model User { } model Payment { - id String @id @default(cuid()) + id String @id @default(cuid()) + stripe_id String @unique total Float status PaymentStatus @default(PENDING) diff --git a/services/payment/prisma/seed.ts b/services/payment/prisma/seed.ts index 931e0fb3..e208515d 100644 --- a/services/payment/prisma/seed.ts +++ b/services/payment/prisma/seed.ts @@ -5,6 +5,7 @@ const prisma = new PrismaClient(); const payments: Prisma.PaymentCreateInput[] = [ { id: "payment_id:1", + stripe_id: "stripe_id:1", total: 100, status: PaymentStatus.PENDING, user: { @@ -22,6 +23,7 @@ const payments: Prisma.PaymentCreateInput[] = [ }, { id: "payment_id:2", + stripe_id: "stripe_id:2", total: 200, status: PaymentStatus.APPROVED, user: { @@ -39,6 +41,7 @@ const payments: Prisma.PaymentCreateInput[] = [ }, { id: "payment_id:3", + stripe_id: "stripe_id:3", total: 5, status: PaymentStatus.REJECTED, user: { diff --git a/services/payment/src/handlers/payment/create.ts b/services/payment/src/handlers/payment/create.ts deleted file mode 100644 index f70eaef3..00000000 --- a/services/payment/src/handlers/payment/create.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { prisma } from "@payment/lib/prisma"; -import { log } from "@payment/lib/log"; -import { CreatePaymentRequest, Payment } from "@payment/types/payment"; -import { Data } from "@payment/types"; - -export const CreatePayment = async ( - { request }: Data, - callback: (err: any, response: Payment | null) => void -) => { - try { - const { total, user_id, name, email } = request; - - const payment = await prisma.payment.create({ - data: { - total, - user: { - connectOrCreate: { - where: { id: user_id }, - create: { id: user_id, name, email }, - }, - }, - }, - include: { user: true }, - }); - - callback(null, payment); - } catch (error) { - log.error(error); - callback(error, null); - } -}; diff --git a/services/payment/src/handlers/payment/get-user.ts b/services/payment/src/handlers/payment/get-user.ts index 616f33f5..86bb91bb 100644 --- a/services/payment/src/handlers/payment/get-user.ts +++ b/services/payment/src/handlers/payment/get-user.ts @@ -16,7 +16,13 @@ export const GetPaymentsByUser = async ( where: { user_id: id }, include: { user: true }, }); - callback(null, { payments }); + callback(null, { + payments: payments.map((payment) => ({ + ...payment, + created_at: payment.created_at.toISOString(), + updated_at: payment.updated_at.toISOString(), + })), + }); } catch (error) { log.error(error); callback(error, null); diff --git a/services/payment/src/handlers/payment/get.ts b/services/payment/src/handlers/payment/get.ts index 3de482b3..ce79c82f 100644 --- a/services/payment/src/handlers/payment/get.ts +++ b/services/payment/src/handlers/payment/get.ts @@ -13,7 +13,11 @@ export const GetPayment = async ( where: { id }, include: { user: true }, }); - callback(null, payment); + callback(null, { + ...payment, + created_at: payment.created_at.toISOString(), + updated_at: payment.updated_at.toISOString(), + }); } catch (error) { log.error(error); callback(error, null); diff --git a/services/payment/src/handlers/payment/index.ts b/services/payment/src/handlers/payment/index.ts index 42c8369f..9c51e661 100644 --- a/services/payment/src/handlers/payment/index.ts +++ b/services/payment/src/handlers/payment/index.ts @@ -1,15 +1,11 @@ import { UntypedServiceImplementation } from "@grpc/grpc-js"; -import { CreatePayment } from "@payment/handlers/payment/create"; import { GetPayment } from "@payment/handlers/payment/get"; import { GetPaymentsByUser } from "@payment/handlers/payment/get-user"; -import { UpdatePayment } from "@payment/handlers/payment/update"; const paymentHandlers: UntypedServiceImplementation = { - CreatePayment, GetPayment, GetPaymentsByUser, - UpdatePayment, }; export default paymentHandlers; diff --git a/services/payment/src/handlers/payment/update.ts b/services/payment/src/handlers/payment/update.ts deleted file mode 100644 index 34f6eca0..00000000 --- a/services/payment/src/handlers/payment/update.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { prisma } from "@payment/lib/prisma"; -import { log } from "@payment/lib/log"; -import { UpdatePaymentRequest, Payment } from "@payment/types/payment"; -import { Data } from "@payment/types"; - -export const UpdatePayment = async ( - { request }: Data, - callback: (err: any, response: Payment | null) => void -) => { - try { - const { id, status } = request; - - const payment = await prisma.payment.update({ - where: { id }, - data: { status }, - include: { user: true }, - }); - callback(null, payment); - } catch (error) { - log.error(error); - callback(error, null); - } -}; diff --git a/services/payment/src/handlers/stripe/create-checkout-session.ts b/services/payment/src/handlers/stripe/create-checkout-session.ts new file mode 100644 index 00000000..b9c8ff18 --- /dev/null +++ b/services/payment/src/handlers/stripe/create-checkout-session.ts @@ -0,0 +1,59 @@ +import { prisma } from "@payment/lib/prisma"; +import { log } from "@payment/lib/log"; +import { Data } from "@payment/types"; +import { stripe } from "@payment/lib/stripe"; +import { + CreateCheckoutSessionRequest, + CreateCheckoutSessionResponse, +} from "@payment/types/stripe"; + +export const CreateCheckoutSession = async ( + { request }: Data, + callback: (err: any, response: CreateCheckoutSessionResponse | null) => void +) => { + try { + const { total, user_id, name, email } = request; + + const { url, id } = await stripe.checkout.sessions.create({ + payment_method_types: ["card"], + line_items: [ + { + price_data: { + currency: "eur", + product_data: { + name: "Panier - GoodFood", + }, + unit_amount: total * 100, + }, + quantity: 1, + }, + ], + mode: "payment", + // todo: change this + success_url: "https://example.com/success", + cancel_url: "https://example.com/cancel", + }); + + const payment = await prisma.payment.create({ + data: { + stripe_id: id, + total, + user: { + connectOrCreate: { + where: { id: user_id }, + create: { id: user_id, name, email }, + }, + }, + }, + include: { user: true }, + }); + + callback(null, { + payment, + url: url as string, + }); + } catch (error) { + log.error(error); + callback(error, null); + } +}; diff --git a/services/payment/src/handlers/stripe/index.ts b/services/payment/src/handlers/stripe/index.ts new file mode 100644 index 00000000..c342466b --- /dev/null +++ b/services/payment/src/handlers/stripe/index.ts @@ -0,0 +1,7 @@ +import stripe_webhook_listener from "@payment/handlers/stripe/webhook"; +import { CreateCheckoutSession } from "@payment/handlers/stripe/create-checkout-session"; + +export { stripe_webhook_listener }; +export default { + CreateCheckoutSession, +}; diff --git a/services/payment/src/handlers/stripe/webhook.ts b/services/payment/src/handlers/stripe/webhook.ts new file mode 100644 index 00000000..f06145fa --- /dev/null +++ b/services/payment/src/handlers/stripe/webhook.ts @@ -0,0 +1,87 @@ +import { log, utils } from "@payment/lib/log"; +import prisma from "@payment/lib/prisma"; +import { STRIPE_ENDPOINT_SECRET, stripe } from "@payment/lib/stripe"; +import { PaymentStatus } from "@prisma/client"; +import express from "express"; + +const app = express(); + +const STRIPE_WEBHOOK_ENDPOINT = + process.env.STRIPE_WEBHOOK_ENDPOINT || "/webhook"; + +app.post( + STRIPE_WEBHOOK_ENDPOINT, + express.raw({ type: "application/json" }), + async (request, response) => { + let event = request.body; + // Only verify the event if you have an endpoint secret defined. + // Otherwise use the basic event deserialized with JSON.parse + if (STRIPE_ENDPOINT_SECRET) { + // Get the signature sent by Stripe + const signature = request.headers["stripe-signature"] as string; + try { + event = stripe.webhooks.constructEvent( + request.body, + signature, + STRIPE_ENDPOINT_SECRET + ); + } catch (err) { + log.error(err); + return response.status(400).send((err as Error).message); + } + } + + switch (event.type) { + case "checkout.session.completed": { + const { payment_status, id } = event.data.object; + + if (payment_status === "paid") + await prisma.payment.update({ + where: { stripe_id: id }, + data: { status: PaymentStatus.APPROVED }, + }); + break; + } + + // case checkout session expired + case "checkout.session.expired": { + const { payment_status, id } = event.data.object; + if (payment_status === "unpaid") + await prisma.payment.update({ + where: { stripe_id: id }, + data: { status: PaymentStatus.REJECTED }, + }); + break; + } + + default: + // Unexpected event type + console.log(`Unhandled event type ${event.type}.`); + } + + // Return a 200 response to acknowledge receipt of the event + response.send(); + } +); + +const PORT = Number(process.env.STRIPE_WEBHOOK_PORT) || 4242; +const ADDRESS = `0.0.0.0:${PORT}${STRIPE_WEBHOOK_ENDPOINT}`; + +/** + * Starts a Stripe webhook listener. + * + * TODO: implement TLS for production. + * + * @remarks This function starts an HTTP server using the `app` instance and listens on the specified `PORT`. + * @returns The express `app` instance. + */ +export default function stripe_webhook_listener() { + app.listen(PORT, () => { + log.debug( + `${utils.bold( + utils.magenta("stripe webhook") + )} started on port: ${utils.bold(ADDRESS)} ${utils.green("✓")}\n` + ); + }); + return app; +} diff --git a/services/payment/src/lib/stripe.ts b/services/payment/src/lib/stripe.ts new file mode 100644 index 00000000..ec1d10cc --- /dev/null +++ b/services/payment/src/lib/stripe.ts @@ -0,0 +1,8 @@ +import "dotenv/config"; +import Stripe from "stripe"; + +export const STRIPE_ENDPOINT_SECRET = process.env.STRIPE_WEBHOOK_SECRET; +export const stripe = new Stripe(process.env.STRIPE_API_SECRET!, { + typescript: true, + apiVersion: "2022-11-15", +}); diff --git a/services/payment/src/server.ts b/services/payment/src/server.ts index 2a5aede5..57d821d5 100644 --- a/services/payment/src/server.ts +++ b/services/payment/src/server.ts @@ -11,6 +11,9 @@ import { addReflection } from "@payment/lib/reflection"; import { createServerProxy } from "@payment/lib/proxy"; import { logGRPC } from "@payment/middleware/log"; import paymentHandlers from "@payment/handlers/payment"; +import stripeHandlers from "@payment/handlers/stripe"; + +import { stripe_webhook_listener } from "@payment/handlers/stripe"; const PORT = process.env.PORT || 50003; const ADDRESS = `0.0.0.0:${PORT}`; @@ -23,11 +26,13 @@ const REFLECTION_PATH = resolvePath( const packageDefinition = loadSync(PROTO_PATH, options); const grpc = loadPackageDefinition(packageDefinition) as any; const { service: p } = grpc.com.goodfood.payment.PaymentService; +const { service: s } = grpc.com.goodfood.payment.StripeService; // const server = new Server(); const server = createServerProxy(new Server()); server.addService(p, paymentHandlers); +server.addService(s, stripeHandlers); server.use(logGRPC); server.bindAsync(ADDRESS, serverInsecure, () => { @@ -36,8 +41,9 @@ server.bindAsync(ADDRESS, serverInsecure, () => { const message = `---- ${utils.green("good")}${utils.yellow("food")} Payment Service ----` + `\n` + - `started on: ${utils.bold(ADDRESS)} ${utils.green("✓")}\n`; + `started on: ${utils.bold(ADDRESS)} ${utils.green("✓")}`; log.debug(message); + stripe_webhook_listener(); }); export default server; diff --git a/services/payment/src/types/payment.d.ts b/services/payment/src/types/payment.d.ts index d397e04b..c775bf2b 100644 --- a/services/payment/src/types/payment.d.ts +++ b/services/payment/src/types/payment.d.ts @@ -29,16 +29,3 @@ export type GetPaymentsByUserRequest = { export type GetPaymentsByUserResponse = { payments: Payment[]; }; - -export type CreatePaymentRequest = { - total: number; - - user_id: string; - name: string; - email: string; -}; - -export type UpdatePaymentRequest = { - id: string; - status: PaymentStatus; -}; diff --git a/services/payment/src/types/stripe.d.ts b/services/payment/src/types/stripe.d.ts new file mode 100644 index 00000000..34b5c00e --- /dev/null +++ b/services/payment/src/types/stripe.d.ts @@ -0,0 +1,13 @@ +import { Payment } from "@payment/types/payment"; + +export type CreateCheckoutSessionRequest = { + total: number; + + user_id: string; + name: string; + email: string; +}; +export type CreateCheckoutSessionResponse = { + payment: Payment; + url: string; +}; diff --git a/services/proto/payment.proto b/services/proto/payment.proto index 5cc04768..dc512a10 100644 --- a/services/proto/payment.proto +++ b/services/proto/payment.proto @@ -12,6 +12,7 @@ message User { message Payment { string id = 1; + string stripe_id = 8; float total = 2; string status = 3; @@ -19,15 +20,17 @@ message Payment { User user = 4; string user_id = 5; - string createdAt = 6; - string updatedAt = 7; + string created_at = 6; + string updated_at = 7; } service PaymentService { rpc GetPayment(GetPaymentRequest) returns (Payment) {} rpc GetPaymentsByUser(GetPaymentsByUserRequest) returns (GetPaymentsByUserResponse) {} - rpc CreatePayment(CreatePaymentRequest) returns (Payment) {} - rpc UpdatePayment(UpdatePaymentRequest) returns (Payment) {} +} + +service StripeService { + rpc CreateCheckoutSession(CreateCheckoutSessionRequest) returns (CreateCheckoutSessionResponse) {} } message GetPaymentRequest { @@ -42,15 +45,15 @@ message GetPaymentsByUserResponse { repeated Payment payments = 1; } -message CreatePaymentRequest { +message CreateCheckoutSessionRequest { float total = 1; - string userId = 2; + string user_id = 2; string name = 3; string email = 4; } -message UpdatePaymentRequest { - string id = 1; - string status = 2; +message CreateCheckoutSessionResponse { + Payment payment = 1; + string url = 2; } From d4069219b2a5b2cdd5b17fcba3887cc1222c7cff Mon Sep 17 00:00:00 2001 From: Florian LEROUX Date: Fri, 4 Aug 2023 23:27:57 +0200 Subject: [PATCH 347/883] fix(config): fix typos (order -> payment), expose webhook port --- .github/workflows/payment.yml | 69 +++++++++++++++++++++++++++++ services/payment/Dockerfile | 3 ++ services/payment/k8s/deployment.yml | 3 ++ services/payment/k8s/service.yml | 3 ++ services/payment/package.json | 2 +- 5 files changed, 79 insertions(+), 1 deletion(-) create mode 100644 .github/workflows/payment.yml diff --git a/.github/workflows/payment.yml b/.github/workflows/payment.yml new file mode 100644 index 00000000..520401b8 --- /dev/null +++ b/.github/workflows/payment.yml @@ -0,0 +1,69 @@ +name: Payment Microservice CI/CD + +on: + push: + branches: [ payment ] + pull_request: + branches: [ dev, main ] + +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@master + - uses: pnpm/action-setup@v2 + with: + version: latest + - uses: actions/setup-node@v3 + with: + node-version: "18.x" + cache: "pnpm" + cache-dependency-path: services/payment/pnpm-lock.yaml + - name: Install dependencies + run: | + cd ./services/payment + pnpm install --frozen-lockfile + - name: Build + run: | + cd ./services/payment + pnpm build + + test: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@master + - uses: pnpm/action-setup@v2 + with: + version: latest + - uses: actions/setup-node@v3 + with: + node-version: "18.x" + cache: "pnpm" + cache-dependency-path: services/payment/pnpm-lock.yaml + - name: Install dependencies + run: | + cd ./services/payment + pnpm install --frozen-lockfile + - name: Execute tests + run: | + cd ./services/payment + pnpm test + + publish: + runs-on: ubuntu-latest + needs: [ build, test ] + steps: + - name: Checkout code + uses: actions/checkout@master + - name: Login to Docker Hub + uses: docker/login-action@v2 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + - name: Build and push + uses: docker/build-push-action@v4 + with: + context: ./services/ + file: ./services/payment/Dockerfile + push: true + tags: floriaaan/goodfood-payment:latest \ No newline at end of file diff --git a/services/payment/Dockerfile b/services/payment/Dockerfile index f2451ca0..76707cef 100644 --- a/services/payment/Dockerfile +++ b/services/payment/Dockerfile @@ -34,5 +34,8 @@ COPY --from=builder /app/node_modules/.prisma /.prisma # Expose the gRPC port EXPOSE 50003 +# Expose the Webhook port +EXPOSE 4242 + # Start the server CMD [ "node", "index.js"] diff --git a/services/payment/k8s/deployment.yml b/services/payment/k8s/deployment.yml index 6f6438e2..45db043b 100644 --- a/services/payment/k8s/deployment.yml +++ b/services/payment/k8s/deployment.yml @@ -29,3 +29,6 @@ spec: key: port ports: - containerPort: 50003 + name: grpc + - containerPort: 4242 + name: webhook diff --git a/services/payment/k8s/service.yml b/services/payment/k8s/service.yml index ea86b40e..4a18c919 100644 --- a/services/payment/k8s/service.yml +++ b/services/payment/k8s/service.yml @@ -9,5 +9,8 @@ spec: - name: "grpc" port: 50003 targetPort: 50003 + - name: "webook" + port: 4242 + targetPort: 4242 status: loadBalancer: {} diff --git a/services/payment/package.json b/services/payment/package.json index e41e4af8..5be2196a 100644 --- a/services/payment/package.json +++ b/services/payment/package.json @@ -1,5 +1,5 @@ { - "name": "@goodfood/order", + "name": "@goodfood/payment", "bin": "dist/index.js", "scripts": { "start": "node dist/index.js", From ad43376348d4167a73a2b88a19536cce02f9ded9 Mon Sep 17 00:00:00 2001 From: Florian LEROUX Date: Sat, 5 Aug 2023 12:27:27 +0200 Subject: [PATCH 348/883] fix(ci): add test to make ci work --- services/payment/src/tests/fake.test.ts | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 services/payment/src/tests/fake.test.ts diff --git a/services/payment/src/tests/fake.test.ts b/services/payment/src/tests/fake.test.ts new file mode 100644 index 00000000..bc83eea4 --- /dev/null +++ b/services/payment/src/tests/fake.test.ts @@ -0,0 +1,7 @@ +import { assert, describe, it } from "vitest"; + +describe("tests@goodfood/payment", function () { + it("tests @goodfood/payment in expected situation", () => { + assert.equal(1, 1); + }); +}); From 15b54bf8bad5f2b93c3b6ea515b9ffa9b0042cbe Mon Sep 17 00:00:00 2001 From: Florian LEROUX Date: Sat, 5 Aug 2023 12:55:18 +0200 Subject: [PATCH 349/883] doc: add testing --- services/payment/README.md | 25 ++++++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/services/payment/README.md b/services/payment/README.md index b90eb1d2..d9310988 100644 --- a/services/payment/README.md +++ b/services/payment/README.md @@ -11,7 +11,12 @@ ## gRPC Methods -The service provides the following gRPC methods: +- `GetPayment(GetPaymentRequest) returns (Payment) {}` + This RPC function is part of the PaymentService service. It is used to retrieve information about a single payment. The client sends a request GetPaymentRequest containing the necessary information (e.g., payment ID), and the server responds with a Payment message containing the details of the requested payment. +- `GetPaymentsByUser(GetPaymentsByUserRequest) returns (GetPaymentsByUserResponse) {}` + Also part of the PaymentService service, this RPC function allows the client to get a list of payments associated with a specific user. The client sends a GetPaymentsByUserRequest, typically containing the user's ID, and the server responds with a GetPaymentsByUserResponse message containing a list of payments relevant to that user. +- `CreateCheckoutSession(CreateCheckoutSessionRequest) returns (CreateCheckoutSessionResponse) {}` + This RPC function belongs to the StripeService service. It is utilized to create a checkout session for Stripe, which typically involves setting up a payment gateway or initiating a payment process for a user. The client sends a CreateCheckoutSessionRequest with relevant information required for the session, and the server responds with a CreateCheckoutSessionResponse, which may contain details or identifiers related to the created session. ## Requirements @@ -45,6 +50,20 @@ NB: If you want to run the microservice in development mode, you can run `npm ru ## Testing -### Requests examples +How to test the microservice: -**Install `grpcurl` on your machine.** +Pre-requisites: + +- You need to have a Postgres database running on your machine, the migrations need to be applied. +- You need to have an internet connection. + +1. Run the microservice (see [Getting started](#getting-started)). +2. Use a gRPC client (e.g. [Postman](https://www.postman.com/)) to send requests to the microservice (see [gRPC Methods](#grpc-methods)). + - Send a request to the `CreateCheckoutSession` method to create a payment. + It should return a `CreateCheckoutSessionResponse` with the created payment, and an URL by Stripe to pay the order. + The payment should be created in the database. + When the payment is paid, the order should be updated in the database using the webhook, it should also be updated in the database when the checkout has expired. + - Send a request to the `GetPayment` method to get a payment. + It should return a `GetPaymentResponse` with the payment. + - Send a request to the `GetPaymentsByUser` method to get all payments. + It should return a `GetPaymentsByUserResponse` with all payments. From 21ee893867e3763f34cab3f6266880977ad762a4 Mon Sep 17 00:00:00 2001 From: Florian LEROUX Date: Mon, 7 Aug 2023 19:01:30 +0200 Subject: [PATCH 350/883] feat(stripe): add paypal --- services/payment/src/handlers/stripe/create-checkout-session.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/payment/src/handlers/stripe/create-checkout-session.ts b/services/payment/src/handlers/stripe/create-checkout-session.ts index b9c8ff18..7ad5800c 100644 --- a/services/payment/src/handlers/stripe/create-checkout-session.ts +++ b/services/payment/src/handlers/stripe/create-checkout-session.ts @@ -15,7 +15,7 @@ export const CreateCheckoutSession = async ( const { total, user_id, name, email } = request; const { url, id } = await stripe.checkout.sessions.create({ - payment_method_types: ["card"], + payment_method_types: ["card", "paypal"], line_items: [ { price_data: { From e8de9f975d0999e83259f23fec82a8cf45a30e8a Mon Sep 17 00:00:00 2001 From: anatole Date: Fri, 11 Aug 2023 15:59:00 +0200 Subject: [PATCH 351/883] feat(gateway): create the stocks controllers --- .../src/controller/stock/stock.controller.ts | 386 ++++++++++++++++++ .../stock/stockPerson.controller.ts | 20 + .../src/services/clients/stock.client.ts | 11 + 3 files changed, 417 insertions(+) create mode 100644 services/gateway/src/controller/stock/stock.controller.ts create mode 100644 services/gateway/src/controller/stock/stockPerson.controller.ts create mode 100644 services/gateway/src/services/clients/stock.client.ts diff --git a/services/gateway/src/controller/stock/stock.controller.ts b/services/gateway/src/controller/stock/stock.controller.ts new file mode 100644 index 00000000..2743f2ca --- /dev/null +++ b/services/gateway/src/controller/stock/stock.controller.ts @@ -0,0 +1,386 @@ +import express, {Request, Response} from 'express'; +import {stockServiceClient} from '../../services/clients/stock.client'; +import { + CreateIngredientRequest, + CreateIngredientRestaurantRequest, + CreateSupplierRequest, + CreateSupplyOrderRequest, + DeleteIngredientRequest, + DeleteIngredientRestaurantRequest, + DeleteSupplierRequest, + DeleteSupplyOrderRequest, + GetIngredientRequest, + GetIngredientRestaurantRequest, + GetIngredientRestaurantsByProductRequest, + GetIngredientRestaurantsByRestaurantRequest, + GetSupplierRequest, + GetSupplyOrderRequest, + GetSupplyOrdersByIngredientRestaurantRequest, + GetSupplyOrdersByRestaurantRequest, + GetSupplyOrdersBySupplierRequest, + UpdateIngredientRequest, + UpdateIngredientRestaurantRequest, + UpdateSupplierRequest, + UpdateSupplyOrderRequest +} from "@gateway/proto/stock_pb"; +import {Empty} from "google-protobuf/google/protobuf/empty_pb"; + + +export const stockController = (app: express.Application) => { + /** + * Ingredient Routes + */ + + app.get('/api/stock/supplier/:id', (req: Request, res: Response) => { + const {id} = req.params; + const supplierRequest = new GetSupplierRequest().setId(Number(id)); + + stockServiceClient.getSupplier(supplierRequest, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } + }); + }); + + app.get('/api/stock/supplier', (req: Request, res: Response) => { + + stockServiceClient.getSuppliers(new Empty(), (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } + }); + }); + + app.get('/api/stock/ingredient/:id', (req: Request, res: Response) => { + const {id} = req.params; + const ingredientRequest = new GetIngredientRequest().setId(Number(id)); + + stockServiceClient.getIngredient(ingredientRequest, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } + }); + }); + + app.get('/api/stock/ingredient', (req: Request, res: Response) => { + + stockServiceClient.getIngredients(new Empty(), (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } + }); + }); + + app.post('/api/stock/ingredient', (req: Request, res: Response) => { + const {name, desciption} = req.body + const ingredientRequest = new CreateIngredientRequest().setName(name).setDescription(desciption) + + stockServiceClient.createIngredient(ingredientRequest, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } + }); + }); + + app.put('/api/stock/ingredient/:id', (req: Request, res: Response) => { + const {id} = req.params + const {name, desciption} = req.body + const ingredientRequest = new UpdateIngredientRequest().setId(Number(id)).setName(name).setDescription(desciption) + + stockServiceClient.updateIngredient(ingredientRequest, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } + }); + }); + + app.delete('/api/stock/ingredient/:id', (req: Request, res: Response) => { + const {id} = req.params + const ingredientRequest = new DeleteIngredientRequest().setId(Number(id)); + + stockServiceClient.deleteIngredient(ingredientRequest, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } + }); + }); + + app.delete('/api/stock/ingredient/:id', (req: Request, res: Response) => { + const {id} = req.params + const ingredientRequest = new DeleteIngredientRequest().setId(Number(id)); + + stockServiceClient.deleteIngredient(ingredientRequest, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } + }); + }); + + /** + * Ingredient Restaurant Routes + */ + + app.get('/api/stock/ingredient/restaurant/:id', (req: Request, res: Response) => { + const {id} = req.params; + const ingredientRestaurantRequest = new GetIngredientRestaurantRequest().setId(Number(id)); + + stockServiceClient.getIngredientRestaurant(ingredientRestaurantRequest, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } + }); + }); + + app.get('/api/stock/ingredient/restaurant/by-restaurant/:id', (req: Request, res: Response) => { + const {id} = req.params; + const ingredientRestaurantsByRestaurantRequest = new GetIngredientRestaurantsByRestaurantRequest().setRestaurantId(id); + + stockServiceClient.getIngredientRestaurantsByRestaurant(ingredientRestaurantsByRestaurantRequest, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } + }); + }); + + app.get('/api/stock/ingredient/restaurant/by-product/:id', (req: Request, res: Response) => { + const {id} = req.params; + const ingredientRestaurantsByProductRequest = new GetIngredientRestaurantsByProductRequest().setProductId(id); + + stockServiceClient.getIngredientRestaurantsByProduct(ingredientRestaurantsByProductRequest, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } + }); + }); + + app.post('/api/stock/ingredient/restaurant', (req: Request, res: Response) => { + const {alertThreshold, quantity, productList, unitPrice, pricePerKilo, restaurantId, ingredientId} = req.body; + const ingredientRestaurant = new CreateIngredientRestaurantRequest().setAlertThreshold(alertThreshold) + .setQuantity(quantity) + .setInProductListList(productList) + .setUnitPrice(unitPrice) + .setPricePerKilo(pricePerKilo) + .setRestaurantId(restaurantId) + .setIngredientId(ingredientId) + + + stockServiceClient.createIngredientRestaurant(ingredientRestaurant, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } + }); + }); + + app.put('/api/stock/ingredient/restaurant/:id', (req: Request, res: Response) => { + const {id} = req.params; + const {alertThreshold, quantity, productList, unitPrice, pricePerKilo, restaurantId, ingredientId} = req.body; + const ingredientRestaurant = new UpdateIngredientRestaurantRequest().setId(Number(id)).setAlertThreshold(alertThreshold) + .setQuantity(quantity) + .setInProductListList(productList) + .setUnitPrice(unitPrice) + .setPricePerKilo(pricePerKilo) + .setRestaurantId(restaurantId) + .setIngredientId(ingredientId) + + + stockServiceClient.updateIngredientRestaurant(ingredientRestaurant, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } + }); + }); + + app.delete('/api/stock/ingredient/restaurant/:id', (req: Request, res: Response) => { + const {id} = req.params; + + stockServiceClient.deleteIngredientRestaurant(new DeleteIngredientRestaurantRequest().setId(Number(id)), (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } + }); + }); + + /** + * Supplier Routes + */ + + app.get('/api/stock/supplier/:id', (req: Request, res: Response) => { + const {id} = req.params; + + stockServiceClient.getSupplier(new GetSupplierRequest().setId(Number(id)), (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } + }); + }); + + app.get('/api/stock/supplier', (req: Request, res: Response) => { + stockServiceClient.getSuppliers(new Empty(), (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } + }); + }); + + app.post('/api/stock/supplier', (req: Request, res: Response) => { + const {name, contact} = req.body; + const supplierRequest = new CreateSupplierRequest().setName(name).setContact(contact) + + stockServiceClient.createSupplier(supplierRequest, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } + }); + }); + + app.put('/api/stock/supplier/:id', (req: Request, res: Response) => { + const {id} = req.params; + const {name, contact} = req.body; + const supplierRequest = new UpdateSupplierRequest().setId(Number(id)).setName(name).setContact(contact) + + stockServiceClient.updateSupplier(supplierRequest, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } + }); + }); + + app.delete('/api/stock/supplier/:id', (req: Request, res: Response) => { + const {id} = req.params; + + stockServiceClient.deleteSupplier(new DeleteSupplierRequest().setId(Number(id)), (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } + }); + }); + + /** + * Supply Order Routes + */ + + app.get('/api/stock/supply/order/:id', (req: Request, res: Response) => { + const {id} = req.params; + + stockServiceClient.getSupplyOrder(new GetSupplyOrderRequest().setId(Number(id)), (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } + }); + }); + + app.get('/api/stock/supply/order/by-restaurant/:id', (req: Request, res: Response) => { + const {id} = req.params; + stockServiceClient.getSupplyOrdersByRestaurant(new GetSupplyOrdersByRestaurantRequest().setRestaurantId(id), (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } + }); + }); + + app.get('/api/stock/supply/order/by-supplier/:id', (req: Request, res: Response) => { + const {id} = req.params; + stockServiceClient.getSupplyOrdersBySupplier(new GetSupplyOrdersBySupplierRequest().setSupplierId(Number(id)), (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } + }); + }); + + app.get('/api/stock/supply/order/by-ingredient-restaurant/:id', (req: Request, res: Response) => { + const {id} = req.params; + stockServiceClient.getSupplyOrdersByIngredientRestaurant(new GetSupplyOrdersByIngredientRestaurantRequest().setIngredientRestaurantId(Number(id)), (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } + }); + }); + + app.post('/api/stock/supply/order', (req: Request, res: Response) => { + const {quantity, ingredientRestaurantId, supplierId} = req.body; + const supplyOrderRequest = new CreateSupplyOrderRequest().setQuantity(quantity) + .setIngredientRestaurantId(ingredientRestaurantId) + .setSupplierId(supplierId); + + stockServiceClient.createSupplyOrder(supplyOrderRequest, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } + }); + }); + + app.put('/api/stock/supply/order/:id', (req: Request, res: Response) => { + const {id} = req.params; + const {quantity, ingredientRestaurantId, supplierId} = req.body; + const supplyOrderRequest = new UpdateSupplyOrderRequest().setId(Number(id)).setQuantity(quantity) + .setIngredientRestaurantId(ingredientRestaurantId) + .setSupplierId(supplierId); + + stockServiceClient.updateSupplyOrder(supplyOrderRequest, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } + }); + }); + + app.delete('/api/stock/supply/order/:id', (req: Request, res: Response) => { + const {id} = req.params; + stockServiceClient.deleteSupplyOrder(new DeleteSupplyOrderRequest().setId(Number(id)), (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } + }); + }); +} \ No newline at end of file diff --git a/services/gateway/src/controller/stock/stockPerson.controller.ts b/services/gateway/src/controller/stock/stockPerson.controller.ts new file mode 100644 index 00000000..56d3f931 --- /dev/null +++ b/services/gateway/src/controller/stock/stockPerson.controller.ts @@ -0,0 +1,20 @@ +import {stockPersonServiceClient} from "@gateway/services/clients/stock.client"; +import {Application, Request, Response} from "express"; +import {GetOutcomesByRestaurantRequest} from "@gateway/proto/stock_pb"; + + +export const stockPersonController = (app: Application) => { + app.post('/api/stock/outcomes/by-restaurant/:id', (req: Request, res: Response) => { + const {id} = req.params; + const {date, interval} = req.body; + const outcomesByRestaurantRequest = new GetOutcomesByRestaurantRequest().setRestaurantId(id).setDate(date).setInterval(interval); + + stockPersonServiceClient.getOutcomesByRestaurant(outcomesByRestaurantRequest, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } + }); + }); +} \ No newline at end of file diff --git a/services/gateway/src/services/clients/stock.client.ts b/services/gateway/src/services/clients/stock.client.ts new file mode 100644 index 00000000..6e59e8b6 --- /dev/null +++ b/services/gateway/src/services/clients/stock.client.ts @@ -0,0 +1,11 @@ +import services from '../../proto/stock_grpc_pb'; +import * as grpc from "grpc"; + +// TODO: add stock env +export const stockServiceClient = new services.StockServiceClient( + 'http://localhost:50007', + grpc.credentials.createInsecure()); + +export const stockPersonServiceClient = new services.StockReportingServiceClient( + 'http://localhost:50007', + grpc.credentials.createInsecure()); \ No newline at end of file From a3a74607cac819b005822ddbbf21f3b4891c8d7b Mon Sep 17 00:00:00 2001 From: anatole Date: Fri, 11 Aug 2023 16:17:09 +0200 Subject: [PATCH 352/883] feat(gateway): replace controller methods by the express router --- .../delivery/delivery.controller.ts | 144 ++-- .../delivery/deliveryPerson.controller.ts | 140 ++-- .../src/controller/log/log.controller.ts | 40 +- .../controller/metric/metric.controller.ts | 46 +- .../src/controller/order/order.controller.ts | 218 +++--- .../controller/product/allergen.controller.ts | 102 +-- .../controller/product/category.controller.ts | 102 +-- .../controller/product/product.controller.ts | 264 ++++---- .../promotions/promotions.controller.ts | 130 ++-- .../src/controller/stock/stock.controller.ts | 633 +++++++++--------- .../stock/stockPerson.controller.ts | 27 +- .../src/controller/user/user.controller.ts | 325 +++++---- services/gateway/src/server.ts | 45 +- services/gateway/src/utils/swagger.utils.js | 10 +- 14 files changed, 1125 insertions(+), 1101 deletions(-) diff --git a/services/gateway/src/controller/delivery/delivery.controller.ts b/services/gateway/src/controller/delivery/delivery.controller.ts index e5d90308..8be781d9 100644 --- a/services/gateway/src/controller/delivery/delivery.controller.ts +++ b/services/gateway/src/controller/delivery/delivery.controller.ts @@ -1,92 +1,92 @@ -import {Application, Request, Response} from "express"; +import {Request, Response, Router} from "express"; import {deliveryServiceClient} from "@gateway/services/clients/delivery.client"; import {Delivery, DeliveryCreateInput, DeliveryId, RestaurantId, UserId} from "@gateway/proto/delivery_pb"; -export const deliveryController = (app: Application) => { - app.get('/api/delivery/:id', (req: Request, res: Response) => { - const {id} = req.params; +export const deliveryRoutes = Router(); - deliveryServiceClient.getDelivery(new DeliveryId().setId(id), (error, response) => { - if (error) { - res.json({error: error.message}); - } else { - res.json(response.toObject()); - } - }); +deliveryRoutes.get('/api/delivery/:id', (req: Request, res: Response) => { + const {id} = req.params; + + deliveryServiceClient.getDelivery(new DeliveryId().setId(id), (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } }); +}); - app.get('/api/delivery/by-restaurant/:id', (req: Request, res: Response) => { - const {id} = req.params; - const restaurantId = new RestaurantId().setId(id); +deliveryRoutes.get('/api/delivery/by-restaurant/:id', (req: Request, res: Response) => { + const {id} = req.params; + const restaurantId = new RestaurantId().setId(id); - deliveryServiceClient.listDeliveriesByRestaurant(restaurantId, (error, response) => { - if (error) { - res.json({error: error.message}); - } else { - res.json(response.toObject()); - } - }); + deliveryServiceClient.listDeliveriesByRestaurant(restaurantId, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } }); +}); - app.get('/api/delivery/by-user/:id', (req: Request, res: Response) => { - const {id} = req.params; - const userId = new UserId().setId(id); +deliveryRoutes.get('/api/delivery/by-user/:id', (req: Request, res: Response) => { + const {id} = req.params; + const userId = new UserId().setId(id); - deliveryServiceClient.listDeliveriesByUser(userId, (error, response) => { - if (error) { - res.json({error: error.message}); - } else { - res.json(response.toObject()); - } - }); + deliveryServiceClient.listDeliveriesByUser(userId, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } }); +}); - app.post('/api/delivery', (req: Request, res: Response) => { - const {eta, address, status, deliveryPersonId, userId, restaurantId} = req.body; - const deliveryCreateInput = new DeliveryCreateInput().setEta(eta) - .setAddress(address) - .setStatus(status) - .setDeliveryPersonId(deliveryPersonId) - .setUserId(userId) - .setRestaurantId(restaurantId); +deliveryRoutes.post('/api/delivery', (req: Request, res: Response) => { + const {eta, address, status, deliveryPersonId, userId, restaurantId} = req.body; + const deliveryCreateInput = new DeliveryCreateInput().setEta(eta) + .setAddress(address) + .setStatus(status) + .setDeliveryPersonId(deliveryPersonId) + .setUserId(userId) + .setRestaurantId(restaurantId); - deliveryServiceClient.createDelivery(deliveryCreateInput, (error, response) => { - if (error) { - res.json({error: error.message}); - } else { - res.json(response.toObject()); - } - }); + deliveryServiceClient.createDelivery(deliveryCreateInput, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } }); +}); - app.put('/api/delivery/:id', (req: Request, res: Response) => { - const {id} = req.params; - const {eta, address, status, deliveryPersonId, userId, restaurantId} = req.body; - const delivery = new Delivery().setId(id).setEta(eta) - .setAddress(address) - .setStatus(status) - .setDeliveryPersonId(deliveryPersonId) - .setUserId(userId) - .setRestaurantId(restaurantId); +deliveryRoutes.put('/api/delivery/:id', (req: Request, res: Response) => { + const {id} = req.params; + const {eta, address, status, deliveryPersonId, userId, restaurantId} = req.body; + const delivery = new Delivery().setId(id).setEta(eta) + .setAddress(address) + .setStatus(status) + .setDeliveryPersonId(deliveryPersonId) + .setUserId(userId) + .setRestaurantId(restaurantId); - deliveryServiceClient.updateDelivery(delivery, (error, response) => { - if (error) { - res.json({error: error.message}); - } else { - res.json(response.toObject()); - } - }); + deliveryServiceClient.updateDelivery(delivery, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } }); +}); - app.delete('/api/delivery/:id', (req: Request, res: Response) => { - const {id} = req.params; +deliveryRoutes.delete('/api/delivery/:id', (req: Request, res: Response) => { + const {id} = req.params; - deliveryServiceClient.deleteDelivery(new DeliveryId().setId(id), (error, response) => { - if (error) { - res.json({error: error.message}); - } else { - res.json(response.toObject()); - } - }); + deliveryServiceClient.deleteDelivery(new DeliveryId().setId(id), (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } }); -} \ No newline at end of file +}); \ No newline at end of file diff --git a/services/gateway/src/controller/delivery/deliveryPerson.controller.ts b/services/gateway/src/controller/delivery/deliveryPerson.controller.ts index 8ab0c64f..6daf58ae 100644 --- a/services/gateway/src/controller/delivery/deliveryPerson.controller.ts +++ b/services/gateway/src/controller/delivery/deliveryPerson.controller.ts @@ -1,88 +1,88 @@ -import {Application} from "express"; +import {Router} from "express"; import {deliveryPersonServiceClient} from "@gateway/services/clients/delivery.client"; import {DeliveryPerson, DeliveryPersonCreateInput, DeliveryPersonId, Location} from "@gateway/proto/delivery_pb"; import {Empty} from "google-protobuf/google/protobuf/empty_pb"; -export const deliveryPersonController = (app: Application) => { - app.get('/api/delivery-person/:id', (req, res) => { - const {id} = req.params; +export const deliveryPersonRoutes = Router(); - deliveryPersonServiceClient.getDeliveryPerson(new DeliveryPersonId().setId(id), (error, response) => { - if (error) { - res.json({error: error.message}); - } else { - res.json(response.toObject()); - } - }); +deliveryPersonRoutes.get('/api/delivery-person/:id', (req, res) => { + const {id} = req.params; + + deliveryPersonServiceClient.getDeliveryPerson(new DeliveryPersonId().setId(id), (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } }); +}); - app.get('/api/delivery-person', (req, res) => { - deliveryPersonServiceClient.listDeliveryPersons(new Empty(), (error, response) => { - if (error) { - res.json({error: error.message}); - } else { - res.json(response.toObject()); - } - }); +deliveryPersonRoutes.get('/api/delivery-person', (req, res) => { + deliveryPersonServiceClient.listDeliveryPersons(new Empty(), (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } }); +}); - app.post('/api/delivery-person', (req, res) => { - const {lat, lng} = req.body; - const location = new Location() - .setLatitude(lat) - .setLongitude(lng); - deliveryPersonServiceClient.listNearDeliveryPersons(location, (error, response) => { - if (error) { - res.json({error: error.message}); - } else { - res.json(response.toObject()); - } - }); +deliveryPersonRoutes.post('/api/delivery-person', (req, res) => { + const {lat, lng} = req.body; + const location = new Location() + .setLatitude(lat) + .setLongitude(lng); + deliveryPersonServiceClient.listNearDeliveryPersons(location, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } }); +}); - app.post('/api/delivery-person', (req, res) => { - const {firstName, lastName, phone, locationList} = req.body; - const deliveryPerson = new DeliveryPersonCreateInput() - .setFirstName(firstName) - .setLastName(lastName) - .setPhone(phone) - .setLocationList(locationList); - deliveryPersonServiceClient.createDeliveryPerson(deliveryPerson, (error, response) => { - if (error) { - res.json({error: error.message}); - } else { - res.json(response.toObject()); - } - }); +deliveryPersonRoutes.post('/api/delivery-person', (req, res) => { + const {firstName, lastName, phone, locationList} = req.body; + const deliveryPerson = new DeliveryPersonCreateInput() + .setFirstName(firstName) + .setLastName(lastName) + .setPhone(phone) + .setLocationList(locationList); + deliveryPersonServiceClient.createDeliveryPerson(deliveryPerson, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } }); +}); - app.put('/api/delivery-person/:id', (req, res) => { - const {id} = req.params; - const {firstName, lastName, phone, locationList} = req.body; - const deliveryPerson = new DeliveryPerson().setId(id) - .setFirstName(firstName) - .setLastName(lastName) - .setPhone(phone) - .setLocationList(locationList); +deliveryPersonRoutes.put('/api/delivery-person/:id', (req, res) => { + const {id} = req.params; + const {firstName, lastName, phone, locationList} = req.body; + const deliveryPerson = new DeliveryPerson().setId(id) + .setFirstName(firstName) + .setLastName(lastName) + .setPhone(phone) + .setLocationList(locationList); - deliveryPersonServiceClient.updateDeliveryPerson(deliveryPerson, (error, response) => { - if (error) { - res.json({error: error.message}); - } else { - res.json(response.toObject()); - } - }); + deliveryPersonServiceClient.updateDeliveryPerson(deliveryPerson, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } }); +}); - app.delete('/api/delivery-person/:id', (req, res) => { - const {id} = req.params; +deliveryPersonRoutes.delete('/api/delivery-person/:id', (req, res) => { + const {id} = req.params; - deliveryPersonServiceClient.deleteDeliveryPerson(new DeliveryPersonId().setId(id), (error, response) => { - if (error) { - res.json({error: error.message}); - } else { - res.json(response.toObject()); - } - }); + deliveryPersonServiceClient.deleteDeliveryPerson(new DeliveryPersonId().setId(id), (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } }); -} \ No newline at end of file +}); \ No newline at end of file diff --git a/services/gateway/src/controller/log/log.controller.ts b/services/gateway/src/controller/log/log.controller.ts index c9faf8d2..46df363f 100644 --- a/services/gateway/src/controller/log/log.controller.ts +++ b/services/gateway/src/controller/log/log.controller.ts @@ -1,29 +1,29 @@ -import express from "express"; +import express, {Router} from "express"; import {logServiceClient} from "@gateway/services/clients/log.client"; import {Empty} from "google-protobuf/google/protobuf/empty_pb"; import {GetLogRequest} from "@gateway/proto/log_pb"; -const logController = (app: express.Application) => { - app.get('/api/log', (req: express.Request, res: express.Response) => { +export const logRoutes = Router(); - logServiceClient.listLog(new Empty(), (error, response) => { - if (error) { - res.json({error: error.message}); - } else { - res.json(response.toObject()); - } - }); +logRoutes.get('/api/log', (req: express.Request, res: express.Response) => { + + logServiceClient.listLog(new Empty(), (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } }); +}); - app.get('/api/log/:id', (req: express.Request, res: express.Response) => { - const {id} = req.params +logRoutes.get('/api/log/:id', (req: express.Request, res: express.Response) => { + const {id} = req.params - logServiceClient.getLog(new GetLogRequest().setId(Number(id)), (error, response) => { - if (error) { - res.json({error: error.message}); - } else { - res.json(response.toObject()); - } - }); + logServiceClient.getLog(new GetLogRequest().setId(Number(id)), (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } }); -}; \ No newline at end of file +}); \ No newline at end of file diff --git a/services/gateway/src/controller/metric/metric.controller.ts b/services/gateway/src/controller/metric/metric.controller.ts index 339d4955..c983b96d 100644 --- a/services/gateway/src/controller/metric/metric.controller.ts +++ b/services/gateway/src/controller/metric/metric.controller.ts @@ -1,32 +1,32 @@ import metricService from '../../services/clients/metric.client'; -import express from "express"; +import {Router} from "express"; import {GetMetricRequest, Metric} from "@gateway/proto/metric_pb"; -export const metricController = (app: express.Application) => { - app.get('/api/metric/:key', (req, res) => { - const {key} = req.params; - const metricInput = new GetMetricRequest().setKey(key); - metricService.getMetric(metricInput, (error, response) => { - if (error) { - res.json({error: error.message}); - } else { - res.json(response.toObject()); - } - }); +export const metricRoutes = Router(); + +metricRoutes.get('/api/metric/:key', (req, res) => { + const {key} = req.params; + const metricInput = new GetMetricRequest().setKey(key); + metricService.getMetric(metricInput, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } }); +}); - app.post('/api/metric', (req, res) => { - const {restaurantId, code, value, key} = req.body - const newMetric = new Metric().setKey(key).setRestaurantId(restaurantId).setCode(code).setValue(value) +metricRoutes.post('/api/metric', (req, res) => { + const {restaurantId, code, value, key} = req.body + const newMetric = new Metric().setKey(key).setRestaurantId(restaurantId).setCode(code).setValue(value) - metricService.pushMetric(newMetric, (error, response) => { - if (error) { - res.json({error: error.message}); - } else { - res.json(response.toObject()); - } - }); + metricService.pushMetric(newMetric, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } }); -} +}); diff --git a/services/gateway/src/controller/order/order.controller.ts b/services/gateway/src/controller/order/order.controller.ts index 1ca0d4c2..3a822e6b 100644 --- a/services/gateway/src/controller/order/order.controller.ts +++ b/services/gateway/src/controller/order/order.controller.ts @@ -1,5 +1,5 @@ import orderService from '../../services/clients/order.client'; -import express, {Request, Response} from "express"; +import {Request, Response, Router} from "express"; import { CreateOrderRequest, DeleteOrderRequest, @@ -14,132 +14,132 @@ import { import {getUser} from "@gateway/services/user.service"; import {User} from "@gateway/proto/user_pb"; -export const orderController = (app: express.Application) => { - app.get('/api/order/:id', (req: Request, res: Response) => { - const {id} = req.params; - const orderId = new GetOrderRequest(); - orderId.setId(id); +export const orderRoutes = Router(); - orderService.getOrder(orderId, (error, response) => { - if (error) { - res.json({error: error.message}); - } else { - res.json(response.toObject()); - } - }); - }); +orderRoutes.get('/api/order/:id', (req: Request, res: Response) => { + const {id} = req.params; + const orderId = new GetOrderRequest(); + orderId.setId(id); - app.post('/api/order', (req: Request, res: Response) => { - const body = req.body; - let user: User | undefined = undefined; - try { - user = getUser(Number(req.body.userId)); - } catch (e: any) { - res.json({error: e.message}); + orderService.getOrder(orderId, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); } + }); +}); - if (!user) { - res.json({error: "User not found"}); - return; - } +orderRoutes.post('/api/order', (req: Request, res: Response) => { + const body = req.body; + let user: User | undefined = undefined; + try { + user = getUser(Number(req.body.userId)); + } catch (e: any) { + res.json({error: e.message}); + } - const miniUser = new UserMinimum().setId(String(user.getId())) - .setEmail(user.getEmail()) - .setFirstName(user.getFirstName()) - .setLastName(user.getLastName()) - .setPhone(user.getPhone()); + if (!user) { + res.json({error: "User not found"}); + return; + } - let orderInput = new CreateOrderRequest() - .setUser(miniUser) - .setPaymentId(body.paymentId) - .setDeliveryId(body.deliveryId) - .setDeliveryType(body.deliveryType) - .setBasketSnapshot(body.basketSnapshot) - .setRestaurantId(body.restaurantId); + const miniUser = new UserMinimum().setId(String(user.getId())) + .setEmail(user.getEmail()) + .setFirstName(user.getFirstName()) + .setLastName(user.getLastName()) + .setPhone(user.getPhone()); - orderService.createOrder(orderInput, (error, response) => { - if (error) { - res.json({error: error.message}); - } else { - res.json(response.toObject()); - } - }); + let orderInput = new CreateOrderRequest() + .setUser(miniUser) + .setPaymentId(body.paymentId) + .setDeliveryId(body.deliveryId) + .setDeliveryType(body.deliveryType) + .setBasketSnapshot(body.basketSnapshot) + .setRestaurantId(body.restaurantId); + + orderService.createOrder(orderInput, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } }); +}); - app.get('/api/order/by-user/:userId', (req: Request, res: Response) => { - const {userId} = req.params; - const orderInput = new GetOrdersByUserRequest().setId(userId); - orderService.getOrdersByUser(orderInput, (error, response) => { - if (error) { - res.json({error: error.message}); - } else { - res.json(response.toObject()); - } - }); +orderRoutes.get('/api/order/by-user/:userId', (req: Request, res: Response) => { + const {userId} = req.params; + const orderInput = new GetOrdersByUserRequest().setId(userId); + orderService.getOrdersByUser(orderInput, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } }); +}); - app.post('/api/order/by-status', (req: Request, res: Response) => { - const orderInput = new GetOrdersByStatusRequest().setStatus(req.body.status); +orderRoutes.post('/api/order/by-status', (req: Request, res: Response) => { + const orderInput = new GetOrdersByStatusRequest().setStatus(req.body.status); - orderService.getOrdersByStatus(orderInput, (error, response) => { - if (error) { - res.json({error: error.message}); - } else { - res.json(response.toObject()); - } - }); + orderService.getOrdersByStatus(orderInput, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } }); +}); - app.get('/api/order/by-delivery/:deliveryId', (req: Request, res: Response) => { - const {deliveryId} = req.params; - const orderInput = new GetOrderByDeliveryRequest().setId(deliveryId); - orderService.getOrderByDelivery(orderInput, (error, response) => { - if (error) { - res.json({error: error.message}); - } else { - res.json(response.toObject()); - } - }); +orderRoutes.get('/api/order/by-delivery/:deliveryId', (req: Request, res: Response) => { + const {deliveryId} = req.params; + const orderInput = new GetOrderByDeliveryRequest().setId(deliveryId); + orderService.getOrderByDelivery(orderInput, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } }); +}); - app.get('/api/order/by-payment/:paymentId', (req: Request, res: Response) => { - const {paymentId} = req.params; - const orderInput = new GetOrderByPaymentRequest().setId(paymentId); - orderService.getOrderByPayment(orderInput, (error, response) => { - if (error) { - res.json({error: error.message}); - } else { - res.json(response.toObject()); - } - }); +orderRoutes.get('/api/order/by-payment/:paymentId', (req: Request, res: Response) => { + const {paymentId} = req.params; + const orderInput = new GetOrderByPaymentRequest().setId(paymentId); + orderService.getOrderByPayment(orderInput, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } }); +}); - app.put('/api/order/:orderId', (req: Request, res: Response) => { - const {orderId} = req.params; - const orderInput = new UpdateOrderRequest() - .setId(orderId) - .setStatus(req.body.status) - .setDeliveryId(req.body.deliveryId) - .setPaymentId(req.body.paymentId) - .setRestaurantId(req.body.restaurantId); - orderService.updateOrder(orderInput, (error, response) => { - if (error) { - res.json({error: error.message}); - } else { - res.json(response.toObject()); - } - }); +orderRoutes.put('/api/order/:orderId', (req: Request, res: Response) => { + const {orderId} = req.params; + const orderInput = new UpdateOrderRequest() + .setId(orderId) + .setStatus(req.body.status) + .setDeliveryId(req.body.deliveryId) + .setPaymentId(req.body.paymentId) + .setRestaurantId(req.body.restaurantId); + orderService.updateOrder(orderInput, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } }); +}); - app.delete('/api/order/:orderId', (req: Request, res: Response) => { - const {orderId} = req.params; - const orderInput = new DeleteOrderRequest().setId(orderId); - orderService.deleteOrder(orderInput, (error, response) => { - if (error) { - res.json({error: error.message}); - } else { - res.json(response.toObject()); - } - }); +orderRoutes.delete('/api/order/:orderId', (req: Request, res: Response) => { + const {orderId} = req.params; + const orderInput = new DeleteOrderRequest().setId(orderId); + orderService.deleteOrder(orderInput, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } }); -} \ No newline at end of file +}); \ No newline at end of file diff --git a/services/gateway/src/controller/product/allergen.controller.ts b/services/gateway/src/controller/product/allergen.controller.ts index 7511087d..55d7770d 100644 --- a/services/gateway/src/controller/product/allergen.controller.ts +++ b/services/gateway/src/controller/product/allergen.controller.ts @@ -1,65 +1,65 @@ -import express, {Request, Response} from 'express'; +import {Request, Response, Router} from 'express'; import {allergenServiceClient} from '../../services/clients/product.client'; import {Empty} from "google-protobuf/google/protobuf/empty_pb"; import {Allergen, AllergenId} from "@gateway/proto/product_pb"; -export const allergenController = (app: express.Application) => { - app.get('/api/allergen', (req: Request, res: Response) => { - allergenServiceClient.getAllergenList(new Empty(), (error, response) => { - if (error) { - res.json({error: error.message}); - } else { - res.json(response.toObject()); - } - }); +export const allergenRoutes = Router(); + +allergenRoutes.get('/api/allergen', (req: Request, res: Response) => { + allergenServiceClient.getAllergenList(new Empty(), (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } }); +}); - app.get('/api/allergen/:id', (req: Request, res: Response) => { - const {id} = req.params; - const allergenId = new AllergenId().setId(id) +allergenRoutes.get('/api/allergen/:id', (req: Request, res: Response) => { + const {id} = req.params; + const allergenId = new AllergenId().setId(id) - allergenServiceClient.readAllergen(allergenId, (error, response) => { - if (error) { - res.json({error: error.message}); - } else { - res.json(response.toObject()); - } - }); + allergenServiceClient.readAllergen(allergenId, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } }); +}); - app.post('/api/allergen', (req: Request, res: Response) => { - const {label} = req.body; - const allergen = new Allergen().setLibelle(label); - allergenServiceClient.createAllergen(allergen, (error, response) => { - if (error) { - res.json({error: error.message}); - } else { - res.json(response.toObject()); - } - }); +allergenRoutes.post('/api/allergen', (req: Request, res: Response) => { + const {label} = req.body; + const allergen = new Allergen().setLibelle(label); + allergenServiceClient.createAllergen(allergen, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } }); +}); - app.put('/api/allergen/:id', (req: Request, res: Response) => { - const {id} = req.params; - const {label, icon, hexaColor} = req.body; - const allergen = new Allergen().setId(id).setLibelle(label); - allergenServiceClient.updateAllergen(allergen, (error, response) => { - if (error) { - res.json({error: error.message}); - } else { - res.json(response.toObject()); - } - }); +allergenRoutes.put('/api/allergen/:id', (req: Request, res: Response) => { + const {id} = req.params; + const {label} = req.body; + const allergen = new Allergen().setId(id).setLibelle(label); + allergenServiceClient.updateAllergen(allergen, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } }); +}); - app.delete('/api/allergen/:id', (req: Request, res: Response) => { - const {id} = req.params; - allergenServiceClient.deleteAllergen(new AllergenId().setId(id), (error, response) => { - if (error) { - res.json({error: error.message}); - } else { - res.json(response.toObject()); - } - }); +allergenRoutes.delete('/api/allergen/:id', (req: Request, res: Response) => { + const {id} = req.params; + allergenServiceClient.deleteAllergen(new AllergenId().setId(id), (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } }); -} \ No newline at end of file +}); \ No newline at end of file diff --git a/services/gateway/src/controller/product/category.controller.ts b/services/gateway/src/controller/product/category.controller.ts index d7a0271c..dd9f9124 100644 --- a/services/gateway/src/controller/product/category.controller.ts +++ b/services/gateway/src/controller/product/category.controller.ts @@ -1,65 +1,65 @@ -import express, {Request, Response} from 'express'; +import {Request, Response, Router} from 'express'; import {categoryServiceClient} from '../../services/clients/product.client'; import {Empty} from "google-protobuf/google/protobuf/empty_pb"; import {Category, CategoryId} from "@gateway/proto/product_pb"; -export const categoryController = (app: express.Application) => { - app.get('/api/category', (req: Request, res: Response) => { - categoryServiceClient.getCategoryList(new Empty(), (error, response) => { - if (error) { - res.json({error: error.message}); - } else { - res.json(response.toObject()); - } - }); +export const categoryRoutes = Router(); + +categoryRoutes.get('/api/category', (req: Request, res: Response) => { + categoryServiceClient.getCategoryList(new Empty(), (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } }); +}); - app.get('/api/category/:id', (req: Request, res: Response) => { - const {id} = req.params; - const categoryId = new CategoryId().setId(id) +categoryRoutes.get('/api/category/:id', (req: Request, res: Response) => { + const {id} = req.params; + const categoryId = new CategoryId().setId(id) - categoryServiceClient.readCategory(categoryId, (error, response) => { - if (error) { - res.json({error: error.message}); - } else { - res.json(response.toObject()); - } - }); + categoryServiceClient.readCategory(categoryId, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } }); +}); - app.post('/api/category', (req: Request, res: Response) => { - const {label, icon, hexaColor} = req.body; - const category = new Category().setLibelle(label).setIcon(icon).setHexaColor(hexaColor) - categoryServiceClient.createCategory(category, (error, response) => { - if (error) { - res.json({error: error.message}); - } else { - res.json(response.toObject()); - } - }); +categoryRoutes.post('/api/category', (req: Request, res: Response) => { + const {label, icon, hexaColor} = req.body; + const category = new Category().setLibelle(label).setIcon(icon).setHexaColor(hexaColor) + categoryServiceClient.createCategory(category, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } }); +}); - app.put('/api/category/:id', (req: Request, res: Response) => { - const {id} = req.params; - const {label, icon, hexaColor} = req.body; - const category = new Category().setId(id).setLibelle(label).setIcon(icon).setHexaColor(hexaColor) - categoryServiceClient.updateCategory(category, (error, response) => { - if (error) { - res.json({error: error.message}); - } else { - res.json(response.toObject()); - } - }); +categoryRoutes.put('/api/category/:id', (req: Request, res: Response) => { + const {id} = req.params; + const {label, icon, hexaColor} = req.body; + const category = new Category().setId(id).setLibelle(label).setIcon(icon).setHexaColor(hexaColor) + categoryServiceClient.updateCategory(category, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } }); +}); - app.delete('/api/category/:id', (req: Request, res: Response) => { - const {id} = req.params; - categoryServiceClient.deleteCategory(new CategoryId().setId(id), (error, response) => { - if (error) { - res.json({error: error.message}); - } else { - res.json(response.toObject()); - } - }); +categoryRoutes.delete('/api/category/:id', (req: Request, res: Response) => { + const {id} = req.params; + categoryServiceClient.deleteCategory(new CategoryId().setId(id), (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } }); -} \ No newline at end of file +}); \ No newline at end of file diff --git a/services/gateway/src/controller/product/product.controller.ts b/services/gateway/src/controller/product/product.controller.ts index 818a1057..4e91d2e8 100644 --- a/services/gateway/src/controller/product/product.controller.ts +++ b/services/gateway/src/controller/product/product.controller.ts @@ -1,131 +1,157 @@ -import express, {Request, Response} from 'express'; +import {Request, Response, Router} from 'express'; import {productServiceClient} from '../../services/clients/product.client'; import {Allergen, Category, File, Product, ProductId, RestaurantId} from '../../proto/product_pb'; import {Empty} from "google-protobuf/google/protobuf/empty_pb"; import * as fs from "fs"; -export const productController = (app: express.Application) => { - app.get('/api/product/by-restaurant/:id', (req: Request, res: Response) => { - const {id} = req.params; - const restaurantId = new RestaurantId().setId(id) - - productServiceClient.getProductList(restaurantId, (error, response) => { - if (error) { - res.json({error: error.message}); - } else { - res.json(response.toObject()); - } - }); - }); +export const productRoutes = Router(); - app.get('/api/product/:id', (req: Request, res: Response) => { - const {id} = req.params; - const productId = new ProductId().setId(id) - - productServiceClient.readProduct(productId, (error, response) => { - if (error) { - res.json({error: error.message}); - } else { - res.json(response.toObject()); - } - }); - }); +productRoutes.get('/api/product/by-restaurant/:id', (req: Request, res: Response) => { + const {id} = req.params; + const restaurantId = new RestaurantId().setId(id) - app.get('/api/product/type', (req: Request, res: Response) => { - productServiceClient.getProductTypeList(new Empty(), (error, response) => { - if (error) { - res.json({error: error.message}); - } else { - res.json(response.toObject()); - } - }); + productServiceClient.getProductList(restaurantId, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } }); - - app.delete('/api/product/:id', (req: Request, res: Response) => { - const {id} = req.params; - const productId = new ProductId().setId(id) - productServiceClient.deleteProduct(productId, (error, response) => { - if (error) { - res.json({error: error.message}); - } else { - res.json(response.toObject()); - } - }); +}); + +productRoutes.get('/api/product/:id', (req: Request, res: Response) => { + const {id} = req.params; + const productId = new ProductId().setId(id) + + productServiceClient.readProduct(productId, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } }); - - app.post('/api/product', (req: Request, res: Response) => { - const {restaurantId, type, name, image, comment, price, preparation, weight, kilocalories, nutriscore, categories, allergens} = req.body; - - const allergensList = allergens.map((allergen: any) => new Allergen().setLibelle(allergen.label)); - const categoryList = categories.map((category: any) => new Category() - .setLibelle(category.label) - .setHexaColor(category.hexaColor) - .setIcon(category.icon)); - - const productId = new Product().setRestaurantId(Number(restaurantId)).setType(type) - .setName(name) - .setImage(image) - .setComment(comment) - .setPrice(price) - .setPreparation(preparation) - .setWeight(weight) - .setKilocalories(kilocalories) - .setNutriscore(nutriscore) - .setCategoriesList(categoryList) - .setAllergensList(allergensList); - - productServiceClient.createProduct(productId, (error, response) => { - if (error) { - res.json({error: error.message}); - } else { - res.json(response.toObject()); - } - }); +}); + +productRoutes.get('/api/product/type', (req: Request, res: Response) => { + productServiceClient.getProductTypeList(new Empty(), (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } }); - - app.put('/api/product/:id', (req: Request, res: Response) => { - const {id} = req.params - const {restaurantId, type, name, image, comment, price, preparation, weight, kilocalories, nutriscore, categories, allergens} = req.body; - - const allergensList = allergens.map((allergen: any) => new Allergen().setLibelle(allergen.label)); - const categoryList = categories.map((category: any) => new Category() - .setLibelle(category.label) - .setHexaColor(category.hexaColor) - .setIcon(category.icon)); - - const productId = new Product().setId(id).setRestaurantId(Number(restaurantId)).setType(type) - .setName(name) - .setImage(image) - .setComment(comment) - .setPrice(price) - .setPreparation(preparation) - .setWeight(weight) - .setKilocalories(kilocalories) - .setNutriscore(nutriscore) - .setCategoriesList(categoryList) - .setAllergensList(allergensList); - - productServiceClient.createProduct(productId, (error, response) => { - if (error) { - res.json({error: error.message}); - } else { - res.json(response.toObject()); - } - }); +}); + +productRoutes.delete('/api/product/:id', (req: Request, res: Response) => { + const {id} = req.params; + const productId = new ProductId().setId(id) + productServiceClient.deleteProduct(productId, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } }); - - app.post('/api/product/image', (req: Request, res: Response) => { - const {input_file} = req.body; - var bitmap = fs.readFileSync(input_file); - var base64File = new Buffer(bitmap).toString('base64'); - - const file = new File().setName(input_file).setData(base64File); - productServiceClient.uploadImage(file, (error, response) => { - if (error) { - res.json({error: error.message}); - } else { - res.json(response.toObject()); - } - }); +}); + +productRoutes.post('/api/product', (req: Request, res: Response) => { + const { + restaurantId, + type, + name, + image, + comment, + price, + preparation, + weight, + kilocalories, + nutriscore, + categories, + allergens + } = req.body; + + const allergensList = allergens.map((allergen: any) => new Allergen().setLibelle(allergen.label)); + const categoryList = categories.map((category: any) => new Category() + .setLibelle(category.label) + .setHexaColor(category.hexaColor) + .setIcon(category.icon)); + + const productId = new Product().setRestaurantId(Number(restaurantId)).setType(type) + .setName(name) + .setImage(image) + .setComment(comment) + .setPrice(price) + .setPreparation(preparation) + .setWeight(weight) + .setKilocalories(kilocalories) + .setNutriscore(nutriscore) + .setCategoriesList(categoryList) + .setAllergensList(allergensList); + + productServiceClient.createProduct(productId, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } + }); +}); + +productRoutes.put('/api/product/:id', (req: Request, res: Response) => { + const {id} = req.params + const { + restaurantId, + type, + name, + image, + comment, + price, + preparation, + weight, + kilocalories, + nutriscore, + categories, + allergens + } = req.body; + + const allergensList = allergens.map((allergen: any) => new Allergen().setLibelle(allergen.label)); + const categoryList = categories.map((category: any) => new Category() + .setLibelle(category.label) + .setHexaColor(category.hexaColor) + .setIcon(category.icon)); + + const productId = new Product().setId(id).setRestaurantId(Number(restaurantId)).setType(type) + .setName(name) + .setImage(image) + .setComment(comment) + .setPrice(price) + .setPreparation(preparation) + .setWeight(weight) + .setKilocalories(kilocalories) + .setNutriscore(nutriscore) + .setCategoriesList(categoryList) + .setAllergensList(allergensList); + + productServiceClient.createProduct(productId, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } + }); +}); + +productRoutes.post('/api/product/image', (req: Request, res: Response) => { + const {input_file} = req.body; + var bitmap = fs.readFileSync(input_file); + var base64File = new Buffer(bitmap).toString('base64'); + + const file = new File().setName(input_file).setData(base64File); + productServiceClient.uploadImage(file, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } }); -} \ No newline at end of file +}); \ No newline at end of file diff --git a/services/gateway/src/controller/promotions/promotions.controller.ts b/services/gateway/src/controller/promotions/promotions.controller.ts index e763d90b..66ac92e6 100644 --- a/services/gateway/src/controller/promotions/promotions.controller.ts +++ b/services/gateway/src/controller/promotions/promotions.controller.ts @@ -1,82 +1,82 @@ -import {Application} from "express"; +import {Router} from "express"; import {promotionsServiceClient} from "@gateway/services/clients/promotions.client"; import {Empty} from "google-protobuf/google/protobuf/empty_pb"; import {Promotion, PromotionCode, PromotionCreateInput, PromotionId, RestaurantId} from "@gateway/proto/promotions_pb"; -export const promotionsController = (app: Application) => { - app.get('/api/promotions/:code', (req, res) => { - const {code} = req.params; - promotionsServiceClient.getPromotion(new PromotionCode().setCode(code), (error, response) => { - if (error) { - res.json({error: error.message}); - } else { - res.json(response.toObject()); - } - }); +export const promotionsRoutes = Router(); + +promotionsRoutes.get('/api/promotions/:code', (req, res) => { + const {code} = req.params; + promotionsServiceClient.getPromotion(new PromotionCode().setCode(code), (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } }); +}); - app.get('/api/promotions', (req, res) => { - promotionsServiceClient.getPromotions(new Empty(), (error, response) => { - if (error) { - res.json({error: error.message}); - } else { - res.json(response.toObject()); - } - }); +promotionsRoutes.get('/api/promotions', (req, res) => { + promotionsServiceClient.getPromotions(new Empty(), (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } }); +}); - app.get('/api/promotions/by-restaurant/:restaurantId', (req, res) => { - const {restaurantId} = req.params; - promotionsServiceClient.getPromotionsByRestaurant(new RestaurantId().setId(restaurantId), (error, response) => { - if (error) { - res.json({error: error.message}); - } else { - res.json(response.toObject()); - } - }); +promotionsRoutes.get('/api/promotions/by-restaurant/:restaurantId', (req, res) => { + const {restaurantId} = req.params; + promotionsServiceClient.getPromotionsByRestaurant(new RestaurantId().setId(restaurantId), (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } }); +}); - app.post('/api/promotions', (req, res) => { - const {code, reduction, method, restaurantId} = req.body; - const promotionCreateInput = new PromotionCreateInput().setCode(code) - .setReduction(reduction) - .setMethod(method) - .setRestaurantId(restaurantId); - promotionsServiceClient.createPromotion(promotionCreateInput, (error, response) => { - if (error) { - res.json({error: error.message}); - } else { - res.json(response.toObject()); - } - }); +promotionsRoutes.post('/api/promotions', (req, res) => { + const {code, reduction, method, restaurantId} = req.body; + const promotionCreateInput = new PromotionCreateInput().setCode(code) + .setReduction(reduction) + .setMethod(method) + .setRestaurantId(restaurantId); + promotionsServiceClient.createPromotion(promotionCreateInput, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } }); +}); - app.put('/api/promotions/:id', (req, res) => { - const {id} = req.params; - const {code, reduction, method, restaurantId} = req.body; - const promotionUpdateInput = new Promotion().setId(id).setCode(code) - .setReduction(reduction) - .setMethod(method) - .setRestaurantId(restaurantId); +promotionsRoutes.put('/api/promotions/:id', (req, res) => { + const {id} = req.params; + const {code, reduction, method, restaurantId} = req.body; + const promotionUpdateInput = new Promotion().setId(id).setCode(code) + .setReduction(reduction) + .setMethod(method) + .setRestaurantId(restaurantId); - promotionsServiceClient.createPromotion(promotionUpdateInput, (error, response) => { - if (error) { - res.json({error: error.message}); - } else { - res.json(response.toObject()); - } - }); + promotionsServiceClient.createPromotion(promotionUpdateInput, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } }); +}); - app.delete('/api/promotions/:id', (req, res) => { - const {id} = req.params; +promotionsRoutes.delete('/api/promotions/:id', (req, res) => { + const {id} = req.params; - promotionsServiceClient.deletePromotion(new PromotionId().setId(id), (error, response) => { - if (error) { - res.json({error: error.message}); - } else { - res.json(response.toObject()); - } - }); + promotionsServiceClient.deletePromotion(new PromotionId().setId(id), (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } }); -}; \ No newline at end of file +}); \ No newline at end of file diff --git a/services/gateway/src/controller/stock/stock.controller.ts b/services/gateway/src/controller/stock/stock.controller.ts index 2743f2ca..677d9aca 100644 --- a/services/gateway/src/controller/stock/stock.controller.ts +++ b/services/gateway/src/controller/stock/stock.controller.ts @@ -1,4 +1,4 @@ -import express, {Request, Response} from 'express'; +import {Request, Response, Router} from 'express'; import {stockServiceClient} from '../../services/clients/stock.client'; import { CreateIngredientRequest, @@ -26,361 +26,360 @@ import { import {Empty} from "google-protobuf/google/protobuf/empty_pb"; -export const stockController = (app: express.Application) => { - /** - * Ingredient Routes - */ +export const stockRoutes = Router(); +/** + * Ingredient Routes + */ - app.get('/api/stock/supplier/:id', (req: Request, res: Response) => { - const {id} = req.params; - const supplierRequest = new GetSupplierRequest().setId(Number(id)); +stockRoutes.get('/api/stock/supplier/:id', (req: Request, res: Response) => { + const {id} = req.params; + const supplierRequest = new GetSupplierRequest().setId(Number(id)); - stockServiceClient.getSupplier(supplierRequest, (error, response) => { - if (error) { - res.json({error: error.message}); - } else { - res.json(response.toObject()); - } - }); + stockServiceClient.getSupplier(supplierRequest, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } }); +}); - app.get('/api/stock/supplier', (req: Request, res: Response) => { +stockRoutes.get('/api/stock/supplier', (req: Request, res: Response) => { - stockServiceClient.getSuppliers(new Empty(), (error, response) => { - if (error) { - res.json({error: error.message}); - } else { - res.json(response.toObject()); - } - }); + stockServiceClient.getSuppliers(new Empty(), (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } }); - - app.get('/api/stock/ingredient/:id', (req: Request, res: Response) => { - const {id} = req.params; - const ingredientRequest = new GetIngredientRequest().setId(Number(id)); - - stockServiceClient.getIngredient(ingredientRequest, (error, response) => { - if (error) { - res.json({error: error.message}); - } else { - res.json(response.toObject()); - } - }); +}); + +stockRoutes.get('/api/stock/ingredient/:id', (req: Request, res: Response) => { + const {id} = req.params; + const ingredientRequest = new GetIngredientRequest().setId(Number(id)); + + stockServiceClient.getIngredient(ingredientRequest, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } }); +}); - app.get('/api/stock/ingredient', (req: Request, res: Response) => { +stockRoutes.get('/api/stock/ingredient', (req: Request, res: Response) => { - stockServiceClient.getIngredients(new Empty(), (error, response) => { - if (error) { - res.json({error: error.message}); - } else { - res.json(response.toObject()); - } - }); + stockServiceClient.getIngredients(new Empty(), (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } }); - - app.post('/api/stock/ingredient', (req: Request, res: Response) => { - const {name, desciption} = req.body - const ingredientRequest = new CreateIngredientRequest().setName(name).setDescription(desciption) - - stockServiceClient.createIngredient(ingredientRequest, (error, response) => { - if (error) { - res.json({error: error.message}); - } else { - res.json(response.toObject()); - } - }); +}); + +stockRoutes.post('/api/stock/ingredient', (req: Request, res: Response) => { + const {name, desciption} = req.body + const ingredientRequest = new CreateIngredientRequest().setName(name).setDescription(desciption) + + stockServiceClient.createIngredient(ingredientRequest, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } }); - - app.put('/api/stock/ingredient/:id', (req: Request, res: Response) => { - const {id} = req.params - const {name, desciption} = req.body - const ingredientRequest = new UpdateIngredientRequest().setId(Number(id)).setName(name).setDescription(desciption) - - stockServiceClient.updateIngredient(ingredientRequest, (error, response) => { - if (error) { - res.json({error: error.message}); - } else { - res.json(response.toObject()); - } - }); +}); + +stockRoutes.put('/api/stock/ingredient/:id', (req: Request, res: Response) => { + const {id} = req.params + const {name, desciption} = req.body + const ingredientRequest = new UpdateIngredientRequest().setId(Number(id)).setName(name).setDescription(desciption) + + stockServiceClient.updateIngredient(ingredientRequest, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } }); - - app.delete('/api/stock/ingredient/:id', (req: Request, res: Response) => { - const {id} = req.params - const ingredientRequest = new DeleteIngredientRequest().setId(Number(id)); - - stockServiceClient.deleteIngredient(ingredientRequest, (error, response) => { - if (error) { - res.json({error: error.message}); - } else { - res.json(response.toObject()); - } - }); +}); + +stockRoutes.delete('/api/stock/ingredient/:id', (req: Request, res: Response) => { + const {id} = req.params + const ingredientRequest = new DeleteIngredientRequest().setId(Number(id)); + + stockServiceClient.deleteIngredient(ingredientRequest, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } }); - - app.delete('/api/stock/ingredient/:id', (req: Request, res: Response) => { - const {id} = req.params - const ingredientRequest = new DeleteIngredientRequest().setId(Number(id)); - - stockServiceClient.deleteIngredient(ingredientRequest, (error, response) => { - if (error) { - res.json({error: error.message}); - } else { - res.json(response.toObject()); - } - }); +}); + +stockRoutes.delete('/api/stock/ingredient/:id', (req: Request, res: Response) => { + const {id} = req.params + const ingredientRequest = new DeleteIngredientRequest().setId(Number(id)); + + stockServiceClient.deleteIngredient(ingredientRequest, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } }); - - /** - * Ingredient Restaurant Routes - */ - - app.get('/api/stock/ingredient/restaurant/:id', (req: Request, res: Response) => { - const {id} = req.params; - const ingredientRestaurantRequest = new GetIngredientRestaurantRequest().setId(Number(id)); - - stockServiceClient.getIngredientRestaurant(ingredientRestaurantRequest, (error, response) => { - if (error) { - res.json({error: error.message}); - } else { - res.json(response.toObject()); - } - }); +}); + +/** + * Ingredient Restaurant Routes + */ + +stockRoutes.get('/api/stock/ingredient/restaurant/:id', (req: Request, res: Response) => { + const {id} = req.params; + const ingredientRestaurantRequest = new GetIngredientRestaurantRequest().setId(Number(id)); + + stockServiceClient.getIngredientRestaurant(ingredientRestaurantRequest, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } }); - - app.get('/api/stock/ingredient/restaurant/by-restaurant/:id', (req: Request, res: Response) => { - const {id} = req.params; - const ingredientRestaurantsByRestaurantRequest = new GetIngredientRestaurantsByRestaurantRequest().setRestaurantId(id); - - stockServiceClient.getIngredientRestaurantsByRestaurant(ingredientRestaurantsByRestaurantRequest, (error, response) => { - if (error) { - res.json({error: error.message}); - } else { - res.json(response.toObject()); - } - }); +}); + +stockRoutes.get('/api/stock/ingredient/restaurant/by-restaurant/:id', (req: Request, res: Response) => { + const {id} = req.params; + const ingredientRestaurantsByRestaurantRequest = new GetIngredientRestaurantsByRestaurantRequest().setRestaurantId(id); + + stockServiceClient.getIngredientRestaurantsByRestaurant(ingredientRestaurantsByRestaurantRequest, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } }); - - app.get('/api/stock/ingredient/restaurant/by-product/:id', (req: Request, res: Response) => { - const {id} = req.params; - const ingredientRestaurantsByProductRequest = new GetIngredientRestaurantsByProductRequest().setProductId(id); - - stockServiceClient.getIngredientRestaurantsByProduct(ingredientRestaurantsByProductRequest, (error, response) => { - if (error) { - res.json({error: error.message}); - } else { - res.json(response.toObject()); - } - }); +}); + +stockRoutes.get('/api/stock/ingredient/restaurant/by-product/:id', (req: Request, res: Response) => { + const {id} = req.params; + const ingredientRestaurantsByProductRequest = new GetIngredientRestaurantsByProductRequest().setProductId(id); + + stockServiceClient.getIngredientRestaurantsByProduct(ingredientRestaurantsByProductRequest, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } }); - - app.post('/api/stock/ingredient/restaurant', (req: Request, res: Response) => { - const {alertThreshold, quantity, productList, unitPrice, pricePerKilo, restaurantId, ingredientId} = req.body; - const ingredientRestaurant = new CreateIngredientRestaurantRequest().setAlertThreshold(alertThreshold) - .setQuantity(quantity) - .setInProductListList(productList) - .setUnitPrice(unitPrice) - .setPricePerKilo(pricePerKilo) - .setRestaurantId(restaurantId) - .setIngredientId(ingredientId) - - - stockServiceClient.createIngredientRestaurant(ingredientRestaurant, (error, response) => { - if (error) { - res.json({error: error.message}); - } else { - res.json(response.toObject()); - } - }); +}); + +stockRoutes.post('/api/stock/ingredient/restaurant', (req: Request, res: Response) => { + const {alertThreshold, quantity, productList, unitPrice, pricePerKilo, restaurantId, ingredientId} = req.body; + const ingredientRestaurant = new CreateIngredientRestaurantRequest().setAlertThreshold(alertThreshold) + .setQuantity(quantity) + .setInProductListList(productList) + .setUnitPrice(unitPrice) + .setPricePerKilo(pricePerKilo) + .setRestaurantId(restaurantId) + .setIngredientId(ingredientId) + + + stockServiceClient.createIngredientRestaurant(ingredientRestaurant, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } }); - - app.put('/api/stock/ingredient/restaurant/:id', (req: Request, res: Response) => { - const {id} = req.params; - const {alertThreshold, quantity, productList, unitPrice, pricePerKilo, restaurantId, ingredientId} = req.body; - const ingredientRestaurant = new UpdateIngredientRestaurantRequest().setId(Number(id)).setAlertThreshold(alertThreshold) - .setQuantity(quantity) - .setInProductListList(productList) - .setUnitPrice(unitPrice) - .setPricePerKilo(pricePerKilo) - .setRestaurantId(restaurantId) - .setIngredientId(ingredientId) - - - stockServiceClient.updateIngredientRestaurant(ingredientRestaurant, (error, response) => { - if (error) { - res.json({error: error.message}); - } else { - res.json(response.toObject()); - } - }); +}); + +stockRoutes.put('/api/stock/ingredient/restaurant/:id', (req: Request, res: Response) => { + const {id} = req.params; + const {alertThreshold, quantity, productList, unitPrice, pricePerKilo, restaurantId, ingredientId} = req.body; + const ingredientRestaurant = new UpdateIngredientRestaurantRequest().setId(Number(id)).setAlertThreshold(alertThreshold) + .setQuantity(quantity) + .setInProductListList(productList) + .setUnitPrice(unitPrice) + .setPricePerKilo(pricePerKilo) + .setRestaurantId(restaurantId) + .setIngredientId(ingredientId) + + + stockServiceClient.updateIngredientRestaurant(ingredientRestaurant, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } }); +}); - app.delete('/api/stock/ingredient/restaurant/:id', (req: Request, res: Response) => { - const {id} = req.params; +stockRoutes.delete('/api/stock/ingredient/restaurant/:id', (req: Request, res: Response) => { + const {id} = req.params; - stockServiceClient.deleteIngredientRestaurant(new DeleteIngredientRestaurantRequest().setId(Number(id)), (error, response) => { - if (error) { - res.json({error: error.message}); - } else { - res.json(response.toObject()); - } - }); + stockServiceClient.deleteIngredientRestaurant(new DeleteIngredientRestaurantRequest().setId(Number(id)), (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } }); +}); - /** - * Supplier Routes - */ +/** + * Supplier Routes + */ - app.get('/api/stock/supplier/:id', (req: Request, res: Response) => { - const {id} = req.params; +stockRoutes.get('/api/stock/supplier/:id', (req: Request, res: Response) => { + const {id} = req.params; - stockServiceClient.getSupplier(new GetSupplierRequest().setId(Number(id)), (error, response) => { - if (error) { - res.json({error: error.message}); - } else { - res.json(response.toObject()); - } - }); + stockServiceClient.getSupplier(new GetSupplierRequest().setId(Number(id)), (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } }); - - app.get('/api/stock/supplier', (req: Request, res: Response) => { - stockServiceClient.getSuppliers(new Empty(), (error, response) => { - if (error) { - res.json({error: error.message}); - } else { - res.json(response.toObject()); - } - }); +}); + +stockRoutes.get('/api/stock/supplier', (req: Request, res: Response) => { + stockServiceClient.getSuppliers(new Empty(), (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } }); - - app.post('/api/stock/supplier', (req: Request, res: Response) => { - const {name, contact} = req.body; - const supplierRequest = new CreateSupplierRequest().setName(name).setContact(contact) - - stockServiceClient.createSupplier(supplierRequest, (error, response) => { - if (error) { - res.json({error: error.message}); - } else { - res.json(response.toObject()); - } - }); +}); + +stockRoutes.post('/api/stock/supplier', (req: Request, res: Response) => { + const {name, contact} = req.body; + const supplierRequest = new CreateSupplierRequest().setName(name).setContact(contact) + + stockServiceClient.createSupplier(supplierRequest, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } }); - - app.put('/api/stock/supplier/:id', (req: Request, res: Response) => { - const {id} = req.params; - const {name, contact} = req.body; - const supplierRequest = new UpdateSupplierRequest().setId(Number(id)).setName(name).setContact(contact) - - stockServiceClient.updateSupplier(supplierRequest, (error, response) => { - if (error) { - res.json({error: error.message}); - } else { - res.json(response.toObject()); - } - }); +}); + +stockRoutes.put('/api/stock/supplier/:id', (req: Request, res: Response) => { + const {id} = req.params; + const {name, contact} = req.body; + const supplierRequest = new UpdateSupplierRequest().setId(Number(id)).setName(name).setContact(contact) + + stockServiceClient.updateSupplier(supplierRequest, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } }); +}); - app.delete('/api/stock/supplier/:id', (req: Request, res: Response) => { - const {id} = req.params; +stockRoutes.delete('/api/stock/supplier/:id', (req: Request, res: Response) => { + const {id} = req.params; - stockServiceClient.deleteSupplier(new DeleteSupplierRequest().setId(Number(id)), (error, response) => { - if (error) { - res.json({error: error.message}); - } else { - res.json(response.toObject()); - } - }); + stockServiceClient.deleteSupplier(new DeleteSupplierRequest().setId(Number(id)), (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } }); +}); - /** - * Supply Order Routes - */ +/** + * Supply Order Routes + */ - app.get('/api/stock/supply/order/:id', (req: Request, res: Response) => { - const {id} = req.params; +stockRoutes.get('/api/stock/supply/order/:id', (req: Request, res: Response) => { + const {id} = req.params; - stockServiceClient.getSupplyOrder(new GetSupplyOrderRequest().setId(Number(id)), (error, response) => { - if (error) { - res.json({error: error.message}); - } else { - res.json(response.toObject()); - } - }); + stockServiceClient.getSupplyOrder(new GetSupplyOrderRequest().setId(Number(id)), (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } }); - - app.get('/api/stock/supply/order/by-restaurant/:id', (req: Request, res: Response) => { - const {id} = req.params; - stockServiceClient.getSupplyOrdersByRestaurant(new GetSupplyOrdersByRestaurantRequest().setRestaurantId(id), (error, response) => { - if (error) { - res.json({error: error.message}); - } else { - res.json(response.toObject()); - } - }); +}); + +stockRoutes.get('/api/stock/supply/order/by-restaurant/:id', (req: Request, res: Response) => { + const {id} = req.params; + stockServiceClient.getSupplyOrdersByRestaurant(new GetSupplyOrdersByRestaurantRequest().setRestaurantId(id), (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } }); - - app.get('/api/stock/supply/order/by-supplier/:id', (req: Request, res: Response) => { - const {id} = req.params; - stockServiceClient.getSupplyOrdersBySupplier(new GetSupplyOrdersBySupplierRequest().setSupplierId(Number(id)), (error, response) => { - if (error) { - res.json({error: error.message}); - } else { - res.json(response.toObject()); - } - }); +}); + +stockRoutes.get('/api/stock/supply/order/by-supplier/:id', (req: Request, res: Response) => { + const {id} = req.params; + stockServiceClient.getSupplyOrdersBySupplier(new GetSupplyOrdersBySupplierRequest().setSupplierId(Number(id)), (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } }); - - app.get('/api/stock/supply/order/by-ingredient-restaurant/:id', (req: Request, res: Response) => { - const {id} = req.params; - stockServiceClient.getSupplyOrdersByIngredientRestaurant(new GetSupplyOrdersByIngredientRestaurantRequest().setIngredientRestaurantId(Number(id)), (error, response) => { - if (error) { - res.json({error: error.message}); - } else { - res.json(response.toObject()); - } - }); +}); + +stockRoutes.get('/api/stock/supply/order/by-ingredient-restaurant/:id', (req: Request, res: Response) => { + const {id} = req.params; + stockServiceClient.getSupplyOrdersByIngredientRestaurant(new GetSupplyOrdersByIngredientRestaurantRequest().setIngredientRestaurantId(Number(id)), (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } }); - - app.post('/api/stock/supply/order', (req: Request, res: Response) => { - const {quantity, ingredientRestaurantId, supplierId} = req.body; - const supplyOrderRequest = new CreateSupplyOrderRequest().setQuantity(quantity) - .setIngredientRestaurantId(ingredientRestaurantId) - .setSupplierId(supplierId); - - stockServiceClient.createSupplyOrder(supplyOrderRequest, (error, response) => { - if (error) { - res.json({error: error.message}); - } else { - res.json(response.toObject()); - } - }); +}); + +stockRoutes.post('/api/stock/supply/order', (req: Request, res: Response) => { + const {quantity, ingredientRestaurantId, supplierId} = req.body; + const supplyOrderRequest = new CreateSupplyOrderRequest().setQuantity(quantity) + .setIngredientRestaurantId(ingredientRestaurantId) + .setSupplierId(supplierId); + + stockServiceClient.createSupplyOrder(supplyOrderRequest, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } }); - - app.put('/api/stock/supply/order/:id', (req: Request, res: Response) => { - const {id} = req.params; - const {quantity, ingredientRestaurantId, supplierId} = req.body; - const supplyOrderRequest = new UpdateSupplyOrderRequest().setId(Number(id)).setQuantity(quantity) - .setIngredientRestaurantId(ingredientRestaurantId) - .setSupplierId(supplierId); - - stockServiceClient.updateSupplyOrder(supplyOrderRequest, (error, response) => { - if (error) { - res.json({error: error.message}); - } else { - res.json(response.toObject()); - } - }); +}); + +stockRoutes.put('/api/stock/supply/order/:id', (req: Request, res: Response) => { + const {id} = req.params; + const {quantity, ingredientRestaurantId, supplierId} = req.body; + const supplyOrderRequest = new UpdateSupplyOrderRequest().setId(Number(id)).setQuantity(quantity) + .setIngredientRestaurantId(ingredientRestaurantId) + .setSupplierId(supplierId); + + stockServiceClient.updateSupplyOrder(supplyOrderRequest, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } }); - - app.delete('/api/stock/supply/order/:id', (req: Request, res: Response) => { - const {id} = req.params; - stockServiceClient.deleteSupplyOrder(new DeleteSupplyOrderRequest().setId(Number(id)), (error, response) => { - if (error) { - res.json({error: error.message}); - } else { - res.json(response.toObject()); - } - }); +}); + +stockRoutes.delete('/api/stock/supply/order/:id', (req: Request, res: Response) => { + const {id} = req.params; + stockServiceClient.deleteSupplyOrder(new DeleteSupplyOrderRequest().setId(Number(id)), (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } }); -} \ No newline at end of file +}); \ No newline at end of file diff --git a/services/gateway/src/controller/stock/stockPerson.controller.ts b/services/gateway/src/controller/stock/stockPerson.controller.ts index 56d3f931..48496f95 100644 --- a/services/gateway/src/controller/stock/stockPerson.controller.ts +++ b/services/gateway/src/controller/stock/stockPerson.controller.ts @@ -1,20 +1,19 @@ import {stockPersonServiceClient} from "@gateway/services/clients/stock.client"; -import {Application, Request, Response} from "express"; +import {Request, Response, Router} from "express"; import {GetOutcomesByRestaurantRequest} from "@gateway/proto/stock_pb"; +export const stockPersonRoutes = Router(); -export const stockPersonController = (app: Application) => { - app.post('/api/stock/outcomes/by-restaurant/:id', (req: Request, res: Response) => { - const {id} = req.params; - const {date, interval} = req.body; - const outcomesByRestaurantRequest = new GetOutcomesByRestaurantRequest().setRestaurantId(id).setDate(date).setInterval(interval); +stockPersonRoutes.post('/api/stock/outcomes/by-restaurant/:id', (req: Request, res: Response) => { + const {id} = req.params; + const {date, interval} = req.body; + const outcomesByRestaurantRequest = new GetOutcomesByRestaurantRequest().setRestaurantId(id).setDate(date).setInterval(interval); - stockPersonServiceClient.getOutcomesByRestaurant(outcomesByRestaurantRequest, (error, response) => { - if (error) { - res.json({error: error.message}); - } else { - res.json(response.toObject()); - } - }); + stockPersonServiceClient.getOutcomesByRestaurant(outcomesByRestaurantRequest, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } }); -} \ No newline at end of file +}); \ No newline at end of file diff --git a/services/gateway/src/controller/user/user.controller.ts b/services/gateway/src/controller/user/user.controller.ts index 5d27c879..c4467600 100644 --- a/services/gateway/src/controller/user/user.controller.ts +++ b/services/gateway/src/controller/user/user.controller.ts @@ -1,4 +1,4 @@ -import express, {Request, Response} from 'express'; +import {Request, Response, Router} from 'express'; import {userServiceClient} from '../../services/clients/user.client'; import { changePasswordInput, @@ -13,182 +13,181 @@ import { import {Empty} from "google-protobuf/google/protobuf/empty_pb"; import {getUser} from "@gateway/services/user.service"; -export const userController = (app: express.Application) => { - app.get('/api/user/:id', (req: Request, res: Response) => { - const {id} = req.params; - try { - res.json(getUser(Number(id))); - } catch (e: any) { - res.json({error: e.message}); +export const userRoutes = Router(); +userRoutes.get('/api/user/:id', (req: Request, res: Response) => { + const {id} = req.params; + try { + res.json(getUser(Number(id))); + } catch (e: any) { + res.json({error: e.message}); + } +}); + +userRoutes.get('/api/user', (req: Request, res: Response) => { + userServiceClient.listUser(new Empty(), (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); } }); - - app.get('/api/user', (req: Request, res: Response) => { - userServiceClient.listUser(new Empty(), (error, response) => { - if (error) { - res.json({error: error.message}); - } else { - res.json(response.toObject()); - } - }); - }); - - app.post('/api/user', (req: Request, res: Response) => { - const body = req.body; - let userInput = new UserCreateInput(); - try { - userInput.setFirstName(body.firstName) - .setLastName(body.lastName) - .setEmail(body.email) - .setPassword(body.password) - .setPhone(body.phone) - .setMainaddress(body.address) - .setRole(body.role); - - } catch (e: any) { - res.json({error: e.message}); +}); + +userRoutes.post('/api/user', (req: Request, res: Response) => { + const body = req.body; + let userInput = new UserCreateInput(); + try { + userInput.setFirstName(body.firstName) + .setLastName(body.lastName) + .setEmail(body.email) + .setPassword(body.password) + .setPhone(body.phone) + .setMainaddress(body.address) + .setRole(body.role); + + } catch (e: any) { + res.json({error: e.message}); + } + + userServiceClient.register(userInput, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); } - - userServiceClient.register(userInput, (error, response) => { - if (error) { - res.json({error: error.message}); - } else { - res.json(response.toObject()); - } - }); }); - - app.put('/api/user/:id', (req: Request, res: Response) => { - const {authorization} = req.headers; - if (!authorization) { - res.json({error: 'Not authorized'}); - return; +}); + +userRoutes.put('/api/user/:id', (req: Request, res: Response) => { + const {authorization} = req.headers; + if (!authorization) { + res.json({error: 'Not authorized'}); + return; + } + + const body = req.body; + const userInput = new UpdateUserInput() + try { + const user = new User().setId(Number(req.params.id)) + .setFirstName(body.firstName) + .setLastName(body.lastName) + .setEmail(body.email) + .setPhone(body.phone) + .setMainaddress(body.address) + .setRole(body.role); + + userInput.setUser(user).setToken(authorization); + + } catch (e: any) { + res.json({error: e.message}); + } + + userServiceClient.updateUser(userInput, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); } - - const body = req.body; - const userInput = new UpdateUserInput() - try { - const user = new User().setId(Number(req.params.id)) - .setFirstName(body.firstName) - .setLastName(body.lastName) - .setEmail(body.email) - .setPhone(body.phone) - .setMainaddress(body.address) - .setRole(body.role); - - userInput.setUser(user).setToken(authorization); - - } catch (e: any) { - res.json({error: e.message}); - } - - userServiceClient.updateUser(userInput, (error, response) => { - if (error) { - res.json({error: error.message}); - } else { - res.json(response.toObject()); - } - }); }); - - app.delete('/api/user/:id', (req: Request, res: Response) => { - const {id} = req.params; - const {authorization} = req.headers; - if (!authorization) { - res.json({error: 'Not authorized'}); - return; +}); + +userRoutes.delete('/api/user/:id', (req: Request, res: Response) => { + const {id} = req.params; + const {authorization} = req.headers; + if (!authorization) { + res.json({error: 'Not authorized'}); + return; + } + + userServiceClient.deleteUser(new DeleteInput().setUserid(Number(id)).setToken(authorization), (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); } - - userServiceClient.deleteUser(new DeleteInput().setUserid(Number(id)).setToken(authorization), (error, response) => { - if (error) { - res.json({error: error.message}); - } else { - res.json(response.toObject()); - } - }); }); +}); - app.post('/api/user/login', (req: Request, res: Response) => { - const body = req.body; - const inInput = new logInInput().setEmail(body.email).setPassword(body.password); - - userServiceClient.logIn(inInput, (error, response) => { - if (error) { - res.json({error: error.message}); - } else { - res.json(response.toObject()); - } - }); - }); +userRoutes.post('/api/user/login', (req: Request, res: Response) => { + const body = req.body; + const inInput = new logInInput().setEmail(body.email).setPassword(body.password); - app.post('/api/user/validate', (req: Request, res: Response) => { - const {authorization} = req.headers; - if (!authorization) { - res.json({error: 'Not authorized'}); - return; + userServiceClient.logIn(inInput, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); } - const validate = new validateInput().setToken(authorization); - - userServiceClient.validate(validate, (error, response) => { - if (error) { - res.json({error: error.message}); - } else { - res.json(response.toObject()); - } - }); }); - - app.put('/api/user/:id/password', (req: Request, res: Response) => { - const {authorization} = req.headers; - if (!authorization) { - res.json({error: 'Not authorized'}); - return; +}); + +userRoutes.post('/api/user/validate', (req: Request, res: Response) => { + const {authorization} = req.headers; + if (!authorization) { + res.json({error: 'Not authorized'}); + return; + } + const validate = new validateInput().setToken(authorization); + + userServiceClient.validate(validate, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); } - - const body = req.body; - const updatePasswordInput = new changePasswordInput(); - try { - updatePasswordInput - .setToken(authorization) - .setOldpassword(body.oldpassword) - .setNewpassword(body.password); - } catch (e: any) { - res.json({error: e.message}); - } - - userServiceClient.changePassword(updatePasswordInput, (error, response) => { - if (error) { - res.json({error: error.message}); - } else { - res.json(response.toObject()); - } - }); }); - - app.put('/api/user/:id/role', (req: Request, res: Response) => { - const {authorization} = req.headers; - if (!authorization) { - res.json({error: 'Not authorized'}); - return; +}); + +userRoutes.put('/api/user/:id/password', (req: Request, res: Response) => { + const {authorization} = req.headers; + if (!authorization) { + res.json({error: 'Not authorized'}); + return; + } + + const body = req.body; + const updatePasswordInput = new changePasswordInput(); + try { + updatePasswordInput + .setToken(authorization) + .setOldpassword(body.oldpassword) + .setNewpassword(body.password); + } catch (e: any) { + res.json({error: e.message}); + } + + userServiceClient.changePassword(updatePasswordInput, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); } - const body = req.body; - const id = req.params.id; - const updatePasswordInput = new changeRoleInput(); - try { - updatePasswordInput - .setToken(authorization) - .setUserid(Number(id)) - .setRolecode(body.role); - } catch (e: any) { - res.json({error: e.message}); + }); +}); + +userRoutes.put('/api/user/:id/role', (req: Request, res: Response) => { + const {authorization} = req.headers; + if (!authorization) { + res.json({error: 'Not authorized'}); + return; + } + const body = req.body; + const id = req.params.id; + const updatePasswordInput = new changeRoleInput(); + try { + updatePasswordInput + .setToken(authorization) + .setUserid(Number(id)) + .setRolecode(body.role); + } catch (e: any) { + res.json({error: e.message}); + } + userServiceClient.changeRole(updatePasswordInput, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); } - userServiceClient.changeRole(updatePasswordInput, (error, response) => { - if (error) { - res.json({error: error.message}); - } else { - res.json(response.toObject()); - } - }); - }); -} \ No newline at end of file + +}); \ No newline at end of file diff --git a/services/gateway/src/server.ts b/services/gateway/src/server.ts index 43acc000..3929226e 100644 --- a/services/gateway/src/server.ts +++ b/services/gateway/src/server.ts @@ -1,12 +1,15 @@ -import {Request, Response} from "express"; -import {userController} from "@gateway/controller/user/user.controller"; -import {orderController} from "@gateway/controller/order/order.controller"; -import {productController} from "@gateway/controller/product/product.controller"; -import {categoryController} from "@gateway/controller/product/category.controller"; -import {allergenController} from "@gateway/controller/product/allergen.controller"; -import {deliveryController} from "@gateway/controller/delivery/delivery.controller"; -import {deliveryPersonController} from "@gateway/controller/delivery/deliveryPerson.controller"; -import {promotionsController} from "@gateway/controller/promotions/promotions.controller"; +import {userRoutes} from "@gateway/controller/user/user.controller"; +import {orderRoutes} from "@gateway/controller/order/order.controller"; +import {productRoutes} from "@gateway/controller/product/product.controller"; +import {categoryRoutes} from "@gateway/controller/product/category.controller"; +import {allergenRoutes} from "@gateway/controller/product/allergen.controller"; +import {deliveryRoutes} from "@gateway/controller/delivery/delivery.controller"; +import {deliveryPersonRoutes} from "@gateway/controller/delivery/deliveryPerson.controller"; +import {promotionsRoutes} from "@gateway/controller/promotions/promotions.controller"; +import {stockPersonRoutes} from "@gateway/controller/stock/stockPerson.controller"; +import {stockRoutes} from "@gateway/controller/stock/stock.controller"; +import {logRoutes} from "@gateway/controller/log/log.controller"; +import {metricRoutes} from "@gateway/controller/metric/metric.controller"; const express = require('express'); const bodyParser = require('body-parser'); @@ -16,18 +19,18 @@ app.use(bodyParser.json()); const PORT = process.env.PORT || 50000; -app.get('/', (req: Request, res: Response) => { - res.send('Node.js API Gateway is up and running!'); -}); - -userController(app); -orderController(app); -categoryController(app); -allergenController(app); -productController(app); -deliveryController(app); -deliveryPersonController(app); -promotionsController(app); +app.use('/', userRoutes); +app.use('/', orderRoutes); +app.use('/', categoryRoutes); +app.use('/', allergenRoutes); +app.use('/', productRoutes); +app.use('/', deliveryRoutes); +app.use('/', deliveryPersonRoutes); +app.use('/', logRoutes); +app.use('/', metricRoutes); +app.use('/', promotionsRoutes); +app.use('/', stockRoutes); +app.use('/', stockPersonRoutes); app.listen(PORT, () => { console.log(`API Gateway is running on port ${PORT}`); diff --git a/services/gateway/src/utils/swagger.utils.js b/services/gateway/src/utils/swagger.utils.js index b02415e2..a882635b 100644 --- a/services/gateway/src/utils/swagger.utils.js +++ b/services/gateway/src/utils/swagger.utils.js @@ -2,16 +2,14 @@ const swaggerAutogen = require('swagger-autogen')(); const doc = { info: { - title: 'My API', - description: 'Description' + title: 'The Gateway API', + description: 'The Gateway API for the Microservices', }, - host: 'localhost:3000' + host: `localhost:${process.env.PORT || 50000}` }; const outputFile = './swagger-output.json'; -const routes = ['../controller/user/userController.ts', - '../controller/order/orderController.ts', - '../controller/product/productController.ts',]; +const routes = ['../server.ts',]; /* NOTE: If you are using the express Router, you must pass in the 'routes' only the root file where the route starts, such as index.js, app.js, routes.js, etc ... */ From 4c57946ad9187d004a8e3f3e099c00960133ce0a Mon Sep 17 00:00:00 2001 From: anatole Date: Sat, 12 Aug 2023 19:07:50 +0200 Subject: [PATCH 353/883] feat(gateway): add tags for the swagger --- services/gateway/src/server.ts | 48 +++++++++++++++++++++++++--------- 1 file changed, 36 insertions(+), 12 deletions(-) diff --git a/services/gateway/src/server.ts b/services/gateway/src/server.ts index 3929226e..8bb20b12 100644 --- a/services/gateway/src/server.ts +++ b/services/gateway/src/server.ts @@ -19,18 +19,42 @@ app.use(bodyParser.json()); const PORT = process.env.PORT || 50000; -app.use('/', userRoutes); -app.use('/', orderRoutes); -app.use('/', categoryRoutes); -app.use('/', allergenRoutes); -app.use('/', productRoutes); -app.use('/', deliveryRoutes); -app.use('/', deliveryPersonRoutes); -app.use('/', logRoutes); -app.use('/', metricRoutes); -app.use('/', promotionsRoutes); -app.use('/', stockRoutes); -app.use('/', stockPersonRoutes); +app.use('/', userRoutes +// #swagger.tags = ['User'] +); +app.use('/', orderRoutes +// #swagger.tags = ['Order'] +); +app.use('/', categoryRoutes +// #swagger.tags = ['Category'] +); +app.use('/', allergenRoutes +// #swagger.tags = ['Allergen'] +); +app.use('/', productRoutes +// #swagger.tags = ['Product'] +); +app.use('/', deliveryRoutes +// #swagger.tags = ['Delivery'] +); +app.use('/', deliveryPersonRoutes +// #swagger.tags = ['DeliveryPerson'] +); +app.use('/', logRoutes +// #swagger.tags = ['Log'] +); +app.use('/', metricRoutes +// #swagger.tags = ['Metric'] +); +app.use('/', promotionsRoutes +// #swagger.tags = ['Promotions'] +); +app.use('/', stockRoutes +// #swagger.tags = ['Stock'] +); +app.use('/', stockPersonRoutes +// #swagger.tags = ['StockPerson'] +); app.listen(PORT, () => { console.log(`API Gateway is running on port ${PORT}`); From a0bc0eb6b4fe314bdd02fd6bafbf131ce21fe2b3 Mon Sep 17 00:00:00 2001 From: anatole Date: Sat, 12 Aug 2023 19:09:02 +0200 Subject: [PATCH 354/883] feat(gateway): add tags for the swagger --- services/gateway/README.md | 2 +- services/gateway/package-lock.json | 930 ++++++++---------- services/gateway/package.json | 3 +- .../src/services/clients/delivery.client.ts | 2 +- .../src/services/clients/log.client.ts | 2 +- .../src/services/clients/metric.client.ts | 2 +- .../src/services/clients/order.client.ts | 2 +- .../src/services/clients/product.client.ts | 2 +- .../src/services/clients/promotions.client.ts | 2 +- .../src/services/clients/stock.client.ts | 2 +- .../src/services/clients/user.client.ts | 2 +- 11 files changed, 431 insertions(+), 520 deletions(-) diff --git a/services/gateway/README.md b/services/gateway/README.md index e8a4dbf7..9aeb77bc 100644 --- a/services/gateway/README.md +++ b/services/gateway/README.md @@ -36,7 +36,7 @@ You can use the following tools to help you with the setup: 3. Run `npm install` to install the necessary dependencies. 4. Create a `.env` file at the root of the project directory and add the environment variables values ( see `.env.example`). -5. Run `cd proto && sh ./build-protos.sh ./proto/user.proto ./src/proto && cd ..` to generate js file to create the clients. +5. Run `sh proto/build-protos.sh` to generate js file to create the clients. Then replace all "grpc" package iteration by "@grpc/grpc-js" 6. Run `npm run start` to start the microservice. You can now access the microservice at `http://localhost:50000`. diff --git a/services/gateway/package-lock.json b/services/gateway/package-lock.json index cdcd3cf2..9f8565a9 100644 --- a/services/gateway/package-lock.json +++ b/services/gateway/package-lock.json @@ -9,13 +9,13 @@ "version": "1.0.0", "license": "ISC", "dependencies": { + "@grpc/grpc-js": "^1.9.0", "@types/express": "^4.17.17", "axios": "^1.4.0", "body-parser": "^1.20.2", "dotenv": "^16.0.3", "express": "^4.18.2", "google-protobuf": "^3.21.2", - "grpc": "^1.24.11", "swagger-autogen": "^2.23.5" }, "bin": { @@ -154,6 +154,74 @@ "node": ">=12" } }, + "node_modules/@grpc/grpc-js": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.9.0.tgz", + "integrity": "sha512-H8+iZh+kCE6VR/Krj6W28Y/ZlxoZ1fOzsNt77nrdE3knkbSelW1Uus192xOFCxHyeszLj8i4APQkSIXjAoOxXg==", + "dependencies": { + "@grpc/proto-loader": "^0.7.0", + "@types/node": ">=12.12.47" + }, + "engines": { + "node": "^8.13.0 || >=10.10.0" + } + }, + "node_modules/@grpc/proto-loader": { + "version": "0.7.8", + "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.8.tgz", + "integrity": "sha512-GU12e2c8dmdXb7XUlOgYWZ2o2i+z9/VeACkxTA/zzAe2IjclC5PnVL0lpgjhrqfpDYHzM8B1TF6pqWegMYAzlA==", + "dependencies": { + "@types/long": "^4.0.1", + "lodash.camelcase": "^4.3.0", + "long": "^4.0.0", + "protobufjs": "^7.2.4", + "yargs": "^17.7.2" + }, + "bin": { + "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@grpc/proto-loader/node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@grpc/proto-loader/node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "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.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@grpc/proto-loader/node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "engines": { + "node": ">=12" + } + }, "node_modules/@istanbuljs/schema": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", @@ -233,6 +301,7 @@ "version": "1.0.11", "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.11.tgz", "integrity": "sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==", + "dev": true, "dependencies": { "detect-libc": "^2.0.0", "https-proxy-agent": "^5.0.0", @@ -283,6 +352,60 @@ "node": ">= 8" } }, + "node_modules/@protobufjs/aspromise": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==" + }, + "node_modules/@protobufjs/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" + }, + "node_modules/@protobufjs/codegen": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", + "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" + }, + "node_modules/@protobufjs/eventemitter": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", + "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==" + }, + "node_modules/@protobufjs/fetch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", + "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", + "dependencies": { + "@protobufjs/aspromise": "^1.1.1", + "@protobufjs/inquire": "^1.1.0" + } + }, + "node_modules/@protobufjs/float": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", + "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==" + }, + "node_modules/@protobufjs/inquire": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", + "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==" + }, + "node_modules/@protobufjs/path": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==" + }, + "node_modules/@protobufjs/pool": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==" + }, + "node_modules/@protobufjs/utf8": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", + "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==" + }, "node_modules/@sinclair/typebox": { "version": "0.27.8", "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", @@ -331,20 +454,6 @@ "@types/node": "*" } }, - "node_modules/@types/bytebuffer": { - "version": "5.0.44", - "resolved": "https://registry.npmjs.org/@types/bytebuffer/-/bytebuffer-5.0.44.tgz", - "integrity": "sha512-k1qonHga/SfQT02NF633i+7tIfKd+cfC/8pjnedcfuXJNMWooss/FkCgRMSnLf2WorLjbuH4bfgAZEbtyHBDoQ==", - "dependencies": { - "@types/long": "^3.0.0", - "@types/node": "*" - } - }, - "node_modules/@types/bytebuffer/node_modules/@types/long": { - "version": "3.0.32", - "resolved": "https://registry.npmjs.org/@types/long/-/long-3.0.32.tgz", - "integrity": "sha512-ZXyOOm83p7X8p3s0IYM3VeueNmHpkk/yMlP8CLeOnEcu6hIwPH7YjZBvhQkR0ZFS2DqZAxKtJ/M5fcuv3OU5BA==" - }, "node_modules/@types/chai": { "version": "4.3.5", "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.5.tgz", @@ -407,6 +516,11 @@ "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", "dev": true }, + "node_modules/@types/long": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz", + "integrity": "sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==" + }, "node_modules/@types/mime": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", @@ -563,7 +677,8 @@ "node_modules/abbrev": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true }, "node_modules/accepts": { "version": "1.3.8", @@ -602,6 +717,7 @@ "version": "6.0.2", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, "dependencies": { "debug": "4" }, @@ -621,7 +737,6 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -648,12 +763,14 @@ "node_modules/aproba": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", - "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==" + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", + "dev": true }, "node_modules/are-we-there-yet": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", + "dev": true, "dependencies": { "delegates": "^1.0.0", "readable-stream": "^3.6.0" @@ -682,15 +799,6 @@ "node": ">=8" } }, - "node_modules/ascli": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ascli/-/ascli-1.0.1.tgz", - "integrity": "sha512-JGQaNxpaCJz9Bd1JvVaFIHuWn9S+l3xhN17R0V/vmUDiGE0QngNMXhjlqpwqV+91plWz9Fg+Lt28Lj7p5vjs8A==", - "dependencies": { - "colour": "~0.7.1", - "optjs": "~3.2.2" - } - }, "node_modules/assertion-error": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", @@ -850,25 +958,6 @@ "ieee754": "^1.1.13" } }, - "node_modules/bytebuffer": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/bytebuffer/-/bytebuffer-5.0.1.tgz", - "integrity": "sha512-IuzSdmADppkZ6DlpycMkm8l9zeEq16fWtLvunEwFiYciR/BHo4E8/xs5piFquG+Za8OWmMqHF8zuRviz2LHvRQ==", - "dependencies": { - "long": "~3" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/bytebuffer/node_modules/long": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/long/-/long-3.2.0.tgz", - "integrity": "sha512-ZYvPPOMqUwPoDsbJaR10iQJYnMuZhRTvHYl62ErLIEX7RgFlziSBUUvrt3OVfc47QlHHpzPZYP17g3Fv7oeJkg==", - "engines": { - "node": ">=0.6" - } - }, "node_modules/bytes": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", @@ -924,14 +1013,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/camelcase": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", - "integrity": "sha512-DLIsRzJVBQu72meAKPkWQOLcujdXT32hwdfnkI1frSiSRMK1MofjKHf+MEx0SB6fjEFXL8fBDv1dKymBlOp4Qw==", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/chai": { "version": "4.3.7", "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.7.tgz", @@ -1006,6 +1087,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "dev": true, "engines": { "node": ">=10" } @@ -1021,19 +1103,10 @@ "wrap-ansi": "^7.0.0" } }, - "node_modules/code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, "dependencies": { "color-name": "~1.1.4" }, @@ -1044,25 +1117,17 @@ "node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "node_modules/color-support": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "dev": true, "bin": { "color-support": "bin.js" } }, - "node_modules/colour": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/colour/-/colour-0.7.1.tgz", - "integrity": "sha512-Rel466v0EnmKPcsxHo91L4kgPs/6XF7Pu2LJNszq9lXYwi5CFWEeIiRaTX5ym7PPMdj4udDHkLSVC1//JVkZQg==", - "engines": { - "node": ">=0.8" - } - }, "node_modules/combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", @@ -1082,7 +1147,8 @@ "node_modules/console-control-strings": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==" + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", + "dev": true }, "node_modules/content-disposition": { "version": "0.5.4", @@ -1152,6 +1218,7 @@ "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, "dependencies": { "ms": "2.1.2" }, @@ -1164,14 +1231,6 @@ } } }, - "node_modules/decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/decompress-response": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", @@ -1227,7 +1286,8 @@ "node_modules/delegates": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==" + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", + "dev": true }, "node_modules/depd": { "version": "2.0.0", @@ -1250,6 +1310,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz", "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==", + "dev": true, "engines": { "node": ">=8" } @@ -1363,7 +1424,6 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true, "engines": { "node": ">=6" } @@ -1690,6 +1750,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dev": true, "dependencies": { "minipass": "^3.0.0" }, @@ -1701,6 +1762,7 @@ "version": "3.3.6", "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, "dependencies": { "yallist": "^4.0.0" }, @@ -1722,6 +1784,7 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", + "dev": true, "dependencies": { "aproba": "^1.0.3 || ^2.0.0", "color-support": "^1.1.2", @@ -1741,7 +1804,6 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true, "engines": { "node": "6.* || 8.* || >= 10.*" } @@ -1843,24 +1905,6 @@ "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", "dev": true }, - "node_modules/grpc": { - "version": "1.24.11", - "resolved": "https://registry.npmjs.org/grpc/-/grpc-1.24.11.tgz", - "integrity": "sha512-8/AQdFCzCeCDWW3SoaMNp6ccbRvTQEH1O1u1uFtt29eWsg5gSZCJ3m6fbkduEIh3smY7WAPP+LgVJ5n3nZRxcA==", - "deprecated": "This library will not receive further updates other than security fixes. We recommend using @grpc/grpc-js instead.", - "hasInstallScript": true, - "dependencies": { - "@mapbox/node-pre-gyp": "^1.0.4", - "@types/bytebuffer": "^5.0.40", - "lodash.camelcase": "^4.3.0", - "lodash.clone": "^4.5.0", - "nan": "^2.13.2", - "protobufjs": "^5.0.3" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/grpc_tools_node_protoc_ts": { "version": "5.3.3", "resolved": "https://registry.npmjs.org/grpc_tools_node_protoc_ts/-/grpc_tools_node_protoc_ts-5.3.3.tgz", @@ -1894,107 +1938,6 @@ "grpc_tools_node_protoc_plugin": "bin/protoc_plugin.js" } }, - "node_modules/grpc/node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grpc/node_modules/cliui": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", - "integrity": "sha512-0yayqDxWQbqk3ojkYqUKqaAQ6AfNKeKWRNA8kR0WXzAsdHpP4BIaOmMAG87JGuO6qcobyW4GjxHd9PmhEd+T9w==", - "dependencies": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wrap-ansi": "^2.0.0" - } - }, - "node_modules/grpc/node_modules/is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==", - "dependencies": { - "number-is-nan": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grpc/node_modules/protobufjs": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-5.0.3.tgz", - "integrity": "sha512-55Kcx1MhPZX0zTbVosMQEO5R6/rikNXd9b6RQK4KSPcrSIIwoXTtebIczUrXlwaSrbz4x8XUVThGPob1n8I4QA==", - "dependencies": { - "ascli": "~1", - "bytebuffer": "~5", - "glob": "^7.0.5", - "yargs": "^3.10.0" - }, - "bin": { - "pbjs": "bin/pbjs" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/grpc/node_modules/string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==", - "dependencies": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grpc/node_modules/strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", - "dependencies": { - "ansi-regex": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grpc/node_modules/wrap-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha512-vAaEaDM946gbNpH5pLVNR+vX2ht6n0Bt3GXwVB1AuAqZosOvHNF3P7wDnh8KLkSqgUh0uh77le7Owgoz+Z9XBw==", - "dependencies": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grpc/node_modules/y18n": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.2.tgz", - "integrity": "sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==" - }, - "node_modules/grpc/node_modules/yargs": { - "version": "3.32.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.32.0.tgz", - "integrity": "sha512-ONJZiimStfZzhKamYvR/xvmgW3uEkAUFSP91y2caTEPhzF6uP2JfPiVZcq66b/YR0C3uitxSV7+T1x8p5bkmMg==", - "dependencies": { - "camelcase": "^2.0.1", - "cliui": "^3.0.3", - "decamelize": "^1.1.1", - "os-locale": "^1.4.0", - "string-width": "^1.0.1", - "window-size": "^0.1.4", - "y18n": "^3.2.0" - } - }, "node_modules/handlebars": { "version": "4.7.7", "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz", @@ -2061,7 +2004,8 @@ "node_modules/has-unicode": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==" + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", + "dev": true }, "node_modules/html-escaper": { "version": "2.0.2", @@ -2088,6 +2032,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dev": true, "dependencies": { "agent-base": "6", "debug": "4" @@ -2178,14 +2123,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/invert-kv": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", - "integrity": "sha512-xgs2NH9AE66ucSq4cNG1nhSFghr5l6tdL15Pk+jl46bmmBapgoaY/AacXyaDznAqmGL99TiLSQgO/XazFSKYeQ==", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/ipaddr.js": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", @@ -2345,17 +2282,6 @@ "graceful-fs": "^4.1.6" } }, - "node_modules/lcid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", - "integrity": "sha512-YiGkH6EnGrDGqLMITnGjXtGmNtjoXw9SVUzcaos8RBi7Ps0VBylkq+vOcY9QE5poLasPCR849ucFUkl0UzUyOw==", - "dependencies": { - "invert-kv": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/local-pkg": { "version": "0.4.3", "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.4.3.tgz", @@ -2388,10 +2314,10 @@ "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==" }, - "node_modules/lodash.clone": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.clone/-/lodash.clone-4.5.0.tgz", - "integrity": "sha512-GhrVeweiTD6uTmmn5hV/lzgCQhccwReIVRLHp7LT4SopOjqEZ5BbX8b5WWEtAKasjmy8hR7ZPwsYlxRCku5odg==" + "node_modules/long": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", + "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" }, "node_modules/loupe": { "version": "2.3.6", @@ -2406,6 +2332,7 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, "dependencies": { "yallist": "^4.0.0" }, @@ -2429,6 +2356,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, "dependencies": { "semver": "^6.0.0" }, @@ -2443,6 +2371,7 @@ "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, "bin": { "semver": "bin/semver.js" } @@ -2562,6 +2491,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "dev": true, "engines": { "node": ">=8" } @@ -2570,6 +2500,7 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dev": true, "dependencies": { "minipass": "^3.0.0", "yallist": "^4.0.0" @@ -2582,6 +2513,7 @@ "version": "3.3.6", "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, "dependencies": { "yallist": "^4.0.0" }, @@ -2593,6 +2525,7 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, "bin": { "mkdirp": "bin/cmd.js" }, @@ -2621,7 +2554,8 @@ "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true }, "node_modules/multistream": { "version": "4.1.0", @@ -2647,11 +2581,6 @@ "readable-stream": "^3.6.0" } }, - "node_modules/nan": { - "version": "2.17.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.17.0.tgz", - "integrity": "sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ==" - }, "node_modules/nanoid": { "version": "3.3.6", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", @@ -2706,6 +2635,7 @@ "version": "2.6.12", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.12.tgz", "integrity": "sha512-C/fGU2E8ToujUivIO0H+tpQ6HWo4eEmchoPIoXtxCrVghxdKq+QOHqEZW7tuP3KlV3bC8FRMO5nMCC7Zm1VP6g==", + "dev": true, "dependencies": { "whatwg-url": "^5.0.0" }, @@ -2783,6 +2713,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "dev": true, "dependencies": { "abbrev": "1" }, @@ -2806,6 +2737,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", + "dev": true, "dependencies": { "are-we-there-yet": "^2.0.0", "console-control-strings": "^1.1.0", @@ -2813,18 +2745,11 @@ "set-blocking": "^2.0.0" } }, - "node_modules/number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -2856,22 +2781,6 @@ "wrappy": "1" } }, - "node_modules/optjs": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/optjs/-/optjs-3.2.2.tgz", - "integrity": "sha512-f8lTJm4LKirX+45xsFhuRNjA4f46QVLQKfGoNH7e2AEWS+24eM4XNH4pQ8Tw2LISCIvbST/wNcLdtgvgcqVaxA==" - }, - "node_modules/os-locale": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", - "integrity": "sha512-PRT7ZORmwu2MEFt4/fv3Q+mEfN4zetKxufQrkShY2oGvUms9r8otu5HfdyIFHkYXjO7laNsoVGmM2MANfuTA8g==", - "dependencies": { - "lcid": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/p-is-promise": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-3.0.0.tgz", @@ -3156,6 +3065,34 @@ "node": ">=0.4.0" } }, + "node_modules/protobufjs": { + "version": "7.2.4", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.2.4.tgz", + "integrity": "sha512-AT+RJgD2sH8phPmCf7OUZR8xGdcJRga4+1cOaXJ64hvcSkVhNcRHOwIxUatPH15+nj59WAGTDv3LSGZPEQbJaQ==", + "hasInstallScript": true, + "dependencies": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/node": ">=13.7.0", + "long": "^5.0.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/protobufjs/node_modules/long": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", + "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==" + }, "node_modules/proxy-addr": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", @@ -3270,6 +3207,7 @@ "version": "3.6.2", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -3295,7 +3233,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -3343,6 +3280,7 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, "dependencies": { "glob": "^7.1.3" }, @@ -3420,6 +3358,7 @@ "version": "7.5.4", "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, "dependencies": { "lru-cache": "^6.0.0" }, @@ -3488,7 +3427,8 @@ "node_modules/set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "dev": true }, "node_modules/setprototypeof": { "version": "1.2.0", @@ -3538,7 +3478,8 @@ "node_modules/signal-exit": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true }, "node_modules/simple-concat": { "version": "1.0.1", @@ -3687,6 +3628,7 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, "dependencies": { "safe-buffer": "~5.2.0" } @@ -3795,6 +3737,7 @@ "version": "6.1.15", "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.15.tgz", "integrity": "sha512-/zKt9UyngnxIT/EAGYuxaMYgOIJiP81ab9ZfkILq4oNLPFX50qyYmu7jRj9qeXoxmJHjGlbH0+cm2uy1WCs10A==", + "dev": true, "dependencies": { "chownr": "^2.0.0", "fs-minipass": "^2.0.0", @@ -3938,7 +3881,8 @@ "node_modules/tr46": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "dev": true }, "node_modules/ts-essentials": { "version": "9.3.2", @@ -4097,7 +4041,8 @@ "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true }, "node_modules/utils-merge": { "version": "1.0.1", @@ -4413,12 +4358,14 @@ "node_modules/webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "dev": true }, "node_modules/whatwg-url": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dev": true, "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" @@ -4459,21 +4406,11 @@ "version": "1.1.5", "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", + "dev": true, "dependencies": { "string-width": "^1.0.2 || 2 || 3 || 4" } }, - "node_modules/window-size": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.4.tgz", - "integrity": "sha512-2thx4pB0cV3h+Bw7QmMXcEbdmOzv9t0HFplJH/Lz6yu60hXYy5RT8rUu+wlIreVxWsGN20mo+MHeCSfUpQBwPw==", - "bin": { - "window-size": "cli.js" - }, - "engines": { - "node": ">= 0.10.0" - } - }, "node_modules/wordwrap": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", @@ -4484,7 +4421,6 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -4506,7 +4442,6 @@ "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true, "engines": { "node": ">=10" } @@ -4514,7 +4449,8 @@ "node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true }, "node_modules/yargs": { "version": "16.2.0", @@ -4650,6 +4586,58 @@ "dev": true, "optional": true }, + "@grpc/grpc-js": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.9.0.tgz", + "integrity": "sha512-H8+iZh+kCE6VR/Krj6W28Y/ZlxoZ1fOzsNt77nrdE3knkbSelW1Uus192xOFCxHyeszLj8i4APQkSIXjAoOxXg==", + "requires": { + "@grpc/proto-loader": "^0.7.0", + "@types/node": ">=12.12.47" + } + }, + "@grpc/proto-loader": { + "version": "0.7.8", + "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.8.tgz", + "integrity": "sha512-GU12e2c8dmdXb7XUlOgYWZ2o2i+z9/VeACkxTA/zzAe2IjclC5PnVL0lpgjhrqfpDYHzM8B1TF6pqWegMYAzlA==", + "requires": { + "@types/long": "^4.0.1", + "lodash.camelcase": "^4.3.0", + "long": "^4.0.0", + "protobufjs": "^7.2.4", + "yargs": "^17.7.2" + }, + "dependencies": { + "cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + } + }, + "yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "requires": { + "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.5", + "yargs-parser": "^21.1.1" + } + }, + "yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==" + } + } + }, "@istanbuljs/schema": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", @@ -4716,6 +4704,7 @@ "version": "1.0.11", "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.11.tgz", "integrity": "sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==", + "dev": true, "requires": { "detect-libc": "^2.0.0", "https-proxy-agent": "^5.0.0", @@ -4754,6 +4743,60 @@ "fastq": "^1.6.0" } }, + "@protobufjs/aspromise": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==" + }, + "@protobufjs/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" + }, + "@protobufjs/codegen": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", + "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" + }, + "@protobufjs/eventemitter": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", + "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==" + }, + "@protobufjs/fetch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", + "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", + "requires": { + "@protobufjs/aspromise": "^1.1.1", + "@protobufjs/inquire": "^1.1.0" + } + }, + "@protobufjs/float": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", + "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==" + }, + "@protobufjs/inquire": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", + "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==" + }, + "@protobufjs/path": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==" + }, + "@protobufjs/pool": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==" + }, + "@protobufjs/utf8": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", + "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==" + }, "@sinclair/typebox": { "version": "0.27.8", "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", @@ -4802,22 +4845,6 @@ "@types/node": "*" } }, - "@types/bytebuffer": { - "version": "5.0.44", - "resolved": "https://registry.npmjs.org/@types/bytebuffer/-/bytebuffer-5.0.44.tgz", - "integrity": "sha512-k1qonHga/SfQT02NF633i+7tIfKd+cfC/8pjnedcfuXJNMWooss/FkCgRMSnLf2WorLjbuH4bfgAZEbtyHBDoQ==", - "requires": { - "@types/long": "^3.0.0", - "@types/node": "*" - }, - "dependencies": { - "@types/long": { - "version": "3.0.32", - "resolved": "https://registry.npmjs.org/@types/long/-/long-3.0.32.tgz", - "integrity": "sha512-ZXyOOm83p7X8p3s0IYM3VeueNmHpkk/yMlP8CLeOnEcu6hIwPH7YjZBvhQkR0ZFS2DqZAxKtJ/M5fcuv3OU5BA==" - } - } - }, "@types/chai": { "version": "4.3.5", "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.5.tgz", @@ -4880,6 +4907,11 @@ "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", "dev": true }, + "@types/long": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz", + "integrity": "sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==" + }, "@types/mime": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", @@ -5005,7 +5037,8 @@ "abbrev": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true }, "accepts": { "version": "1.3.8", @@ -5032,6 +5065,7 @@ "version": "6.0.2", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, "requires": { "debug": "4" } @@ -5045,7 +5079,6 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, "requires": { "color-convert": "^2.0.1" } @@ -5063,12 +5096,14 @@ "aproba": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", - "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==" + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", + "dev": true }, "are-we-there-yet": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", + "dev": true, "requires": { "delegates": "^1.0.0", "readable-stream": "^3.6.0" @@ -5091,15 +5126,6 @@ "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", "dev": true }, - "ascli": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ascli/-/ascli-1.0.1.tgz", - "integrity": "sha512-JGQaNxpaCJz9Bd1JvVaFIHuWn9S+l3xhN17R0V/vmUDiGE0QngNMXhjlqpwqV+91plWz9Fg+Lt28Lj7p5vjs8A==", - "requires": { - "colour": "~0.7.1", - "optjs": "~3.2.2" - } - }, "assertion-error": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", @@ -5217,21 +5243,6 @@ "ieee754": "^1.1.13" } }, - "bytebuffer": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/bytebuffer/-/bytebuffer-5.0.1.tgz", - "integrity": "sha512-IuzSdmADppkZ6DlpycMkm8l9zeEq16fWtLvunEwFiYciR/BHo4E8/xs5piFquG+Za8OWmMqHF8zuRviz2LHvRQ==", - "requires": { - "long": "~3" - }, - "dependencies": { - "long": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/long/-/long-3.2.0.tgz", - "integrity": "sha512-ZYvPPOMqUwPoDsbJaR10iQJYnMuZhRTvHYl62ErLIEX7RgFlziSBUUvrt3OVfc47QlHHpzPZYP17g3Fv7oeJkg==" - } - } - }, "bytes": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", @@ -5272,11 +5283,6 @@ "get-intrinsic": "^1.0.2" } }, - "camelcase": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", - "integrity": "sha512-DLIsRzJVBQu72meAKPkWQOLcujdXT32hwdfnkI1frSiSRMK1MofjKHf+MEx0SB6fjEFXL8fBDv1dKymBlOp4Qw==" - }, "chai": { "version": "4.3.7", "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.7.tgz", @@ -5327,7 +5333,8 @@ "chownr": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==" + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "dev": true }, "cliui": { "version": "7.0.4", @@ -5340,16 +5347,10 @@ "wrap-ansi": "^7.0.0" } }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==" - }, "color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, "requires": { "color-name": "~1.1.4" } @@ -5357,18 +5358,13 @@ "color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "color-support": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", - "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==" - }, - "colour": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/colour/-/colour-0.7.1.tgz", - "integrity": "sha512-Rel466v0EnmKPcsxHo91L4kgPs/6XF7Pu2LJNszq9lXYwi5CFWEeIiRaTX5ym7PPMdj4udDHkLSVC1//JVkZQg==" + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "dev": true }, "combined-stream": { "version": "1.0.8", @@ -5386,7 +5382,8 @@ "console-control-strings": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==" + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", + "dev": true }, "content-disposition": { "version": "0.5.4", @@ -5444,15 +5441,11 @@ "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, "requires": { "ms": "2.1.2" } }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==" - }, "decompress-response": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", @@ -5490,7 +5483,8 @@ "delegates": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==" + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", + "dev": true }, "depd": { "version": "2.0.0", @@ -5505,7 +5499,8 @@ "detect-libc": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz", - "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==" + "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==", + "dev": true }, "diff": { "version": "4.0.2", @@ -5590,8 +5585,7 @@ "escalade": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" }, "escape-html": { "version": "1.0.3", @@ -5861,6 +5855,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dev": true, "requires": { "minipass": "^3.0.0" }, @@ -5869,6 +5864,7 @@ "version": "3.3.6", "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, "requires": { "yallist": "^4.0.0" } @@ -5889,6 +5885,7 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", + "dev": true, "requires": { "aproba": "^1.0.3 || ^2.0.0", "color-support": "^1.1.2", @@ -5904,8 +5901,7 @@ "get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" }, "get-func-name": { "version": "2.0.0", @@ -5983,101 +5979,6 @@ "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", "dev": true }, - "grpc": { - "version": "1.24.11", - "resolved": "https://registry.npmjs.org/grpc/-/grpc-1.24.11.tgz", - "integrity": "sha512-8/AQdFCzCeCDWW3SoaMNp6ccbRvTQEH1O1u1uFtt29eWsg5gSZCJ3m6fbkduEIh3smY7WAPP+LgVJ5n3nZRxcA==", - "requires": { - "@mapbox/node-pre-gyp": "^1.0.4", - "@types/bytebuffer": "^5.0.40", - "lodash.camelcase": "^4.3.0", - "lodash.clone": "^4.5.0", - "nan": "^2.13.2", - "protobufjs": "^5.0.3" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==" - }, - "cliui": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", - "integrity": "sha512-0yayqDxWQbqk3ojkYqUKqaAQ6AfNKeKWRNA8kR0WXzAsdHpP4BIaOmMAG87JGuO6qcobyW4GjxHd9PmhEd+T9w==", - "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wrap-ansi": "^2.0.0" - } - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==", - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "protobufjs": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-5.0.3.tgz", - "integrity": "sha512-55Kcx1MhPZX0zTbVosMQEO5R6/rikNXd9b6RQK4KSPcrSIIwoXTtebIczUrXlwaSrbz4x8XUVThGPob1n8I4QA==", - "requires": { - "ascli": "~1", - "bytebuffer": "~5", - "glob": "^7.0.5", - "yargs": "^3.10.0" - } - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==", - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "wrap-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha512-vAaEaDM946gbNpH5pLVNR+vX2ht6n0Bt3GXwVB1AuAqZosOvHNF3P7wDnh8KLkSqgUh0uh77le7Owgoz+Z9XBw==", - "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1" - } - }, - "y18n": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.2.tgz", - "integrity": "sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==" - }, - "yargs": { - "version": "3.32.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.32.0.tgz", - "integrity": "sha512-ONJZiimStfZzhKamYvR/xvmgW3uEkAUFSP91y2caTEPhzF6uP2JfPiVZcq66b/YR0C3uitxSV7+T1x8p5bkmMg==", - "requires": { - "camelcase": "^2.0.1", - "cliui": "^3.0.3", - "decamelize": "^1.1.1", - "os-locale": "^1.4.0", - "string-width": "^1.0.1", - "window-size": "^0.1.4", - "y18n": "^3.2.0" - } - } - } - }, "grpc_tools_node_protoc_ts": { "version": "5.3.3", "resolved": "https://registry.npmjs.org/grpc_tools_node_protoc_ts/-/grpc_tools_node_protoc_ts-5.3.3.tgz", @@ -6145,7 +6046,8 @@ "has-unicode": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==" + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", + "dev": true }, "html-escaper": { "version": "2.0.2", @@ -6169,6 +6071,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dev": true, "requires": { "agent-base": "6", "debug": "4" @@ -6230,11 +6133,6 @@ "p-is-promise": "^3.0.0" } }, - "invert-kv": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", - "integrity": "sha512-xgs2NH9AE66ucSq4cNG1nhSFghr5l6tdL15Pk+jl46bmmBapgoaY/AacXyaDznAqmGL99TiLSQgO/XazFSKYeQ==" - }, "ipaddr.js": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", @@ -6350,14 +6248,6 @@ "universalify": "^2.0.0" } }, - "lcid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", - "integrity": "sha512-YiGkH6EnGrDGqLMITnGjXtGmNtjoXw9SVUzcaos8RBi7Ps0VBylkq+vOcY9QE5poLasPCR849ucFUkl0UzUyOw==", - "requires": { - "invert-kv": "^1.0.0" - } - }, "local-pkg": { "version": "0.4.3", "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.4.3.tgz", @@ -6378,10 +6268,10 @@ "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==" }, - "lodash.clone": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.clone/-/lodash.clone-4.5.0.tgz", - "integrity": "sha512-GhrVeweiTD6uTmmn5hV/lzgCQhccwReIVRLHp7LT4SopOjqEZ5BbX8b5WWEtAKasjmy8hR7ZPwsYlxRCku5odg==" + "long": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", + "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" }, "loupe": { "version": "2.3.6", @@ -6396,6 +6286,7 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, "requires": { "yallist": "^4.0.0" } @@ -6413,6 +6304,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, "requires": { "semver": "^6.0.0" }, @@ -6420,7 +6312,8 @@ "semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true } } }, @@ -6502,12 +6395,14 @@ "minipass": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==" + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "dev": true }, "minizlib": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dev": true, "requires": { "minipass": "^3.0.0", "yallist": "^4.0.0" @@ -6517,6 +6412,7 @@ "version": "3.3.6", "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, "requires": { "yallist": "^4.0.0" } @@ -6526,7 +6422,8 @@ "mkdirp": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true }, "mkdirp-classic": { "version": "0.5.3", @@ -6549,7 +6446,8 @@ "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true }, "multistream": { "version": "4.1.0", @@ -6561,11 +6459,6 @@ "readable-stream": "^3.6.0" } }, - "nan": { - "version": "2.17.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.17.0.tgz", - "integrity": "sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ==" - }, "nanoid": { "version": "3.3.6", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", @@ -6602,6 +6495,7 @@ "version": "2.6.12", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.12.tgz", "integrity": "sha512-C/fGU2E8ToujUivIO0H+tpQ6HWo4eEmchoPIoXtxCrVghxdKq+QOHqEZW7tuP3KlV3bC8FRMO5nMCC7Zm1VP6g==", + "dev": true, "requires": { "whatwg-url": "^5.0.0" } @@ -6654,6 +6548,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "dev": true, "requires": { "abbrev": "1" } @@ -6668,6 +6563,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", + "dev": true, "requires": { "are-we-there-yet": "^2.0.0", "console-control-strings": "^1.1.0", @@ -6675,15 +6571,11 @@ "set-blocking": "^2.0.0" } }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==" - }, "object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==" + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true }, "object-inspect": { "version": "1.12.3", @@ -6706,19 +6598,6 @@ "wrappy": "1" } }, - "optjs": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/optjs/-/optjs-3.2.2.tgz", - "integrity": "sha512-f8lTJm4LKirX+45xsFhuRNjA4f46QVLQKfGoNH7e2AEWS+24eM4XNH4pQ8Tw2LISCIvbST/wNcLdtgvgcqVaxA==" - }, - "os-locale": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", - "integrity": "sha512-PRT7ZORmwu2MEFt4/fv3Q+mEfN4zetKxufQrkShY2oGvUms9r8otu5HfdyIFHkYXjO7laNsoVGmM2MANfuTA8g==", - "requires": { - "lcid": "^1.0.0" - } - }, "p-is-promise": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-3.0.0.tgz", @@ -6917,6 +6796,32 @@ "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", "dev": true }, + "protobufjs": { + "version": "7.2.4", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.2.4.tgz", + "integrity": "sha512-AT+RJgD2sH8phPmCf7OUZR8xGdcJRga4+1cOaXJ64hvcSkVhNcRHOwIxUatPH15+nj59WAGTDv3LSGZPEQbJaQ==", + "requires": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/node": ">=13.7.0", + "long": "^5.0.0" + }, + "dependencies": { + "long": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", + "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==" + } + } + }, "proxy-addr": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", @@ -6999,6 +6904,7 @@ "version": "3.6.2", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, "requires": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -7017,8 +6923,7 @@ "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "dev": true + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==" }, "resolve": { "version": "1.22.2", @@ -7052,6 +6957,7 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, "requires": { "glob": "^7.1.3" } @@ -7088,6 +6994,7 @@ "version": "7.5.4", "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, "requires": { "lru-cache": "^6.0.0" } @@ -7148,7 +7055,8 @@ "set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "dev": true }, "setprototypeof": { "version": "1.2.0", @@ -7189,7 +7097,8 @@ "signal-exit": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true }, "simple-concat": { "version": "1.0.1", @@ -7297,6 +7206,7 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, "requires": { "safe-buffer": "~5.2.0" } @@ -7377,6 +7287,7 @@ "version": "6.1.15", "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.15.tgz", "integrity": "sha512-/zKt9UyngnxIT/EAGYuxaMYgOIJiP81ab9ZfkILq4oNLPFX50qyYmu7jRj9qeXoxmJHjGlbH0+cm2uy1WCs10A==", + "dev": true, "requires": { "chownr": "^2.0.0", "fs-minipass": "^2.0.0", @@ -7491,7 +7402,8 @@ "tr46": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "dev": true }, "ts-essentials": { "version": "9.3.2", @@ -7595,7 +7507,8 @@ "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true }, "utils-merge": { "version": "1.0.1", @@ -7761,12 +7674,14 @@ "webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "dev": true }, "whatwg-url": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dev": true, "requires": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" @@ -7795,15 +7710,11 @@ "version": "1.1.5", "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", + "dev": true, "requires": { "string-width": "^1.0.2 || 2 || 3 || 4" } }, - "window-size": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.4.tgz", - "integrity": "sha512-2thx4pB0cV3h+Bw7QmMXcEbdmOzv9t0HFplJH/Lz6yu60hXYy5RT8rUu+wlIreVxWsGN20mo+MHeCSfUpQBwPw==" - }, "wordwrap": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", @@ -7814,7 +7725,6 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, "requires": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -7829,13 +7739,13 @@ "y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==" }, "yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true }, "yargs": { "version": "16.2.0", diff --git a/services/gateway/package.json b/services/gateway/package.json index f4920a50..d9605784 100644 --- a/services/gateway/package.json +++ b/services/gateway/package.json @@ -8,17 +8,18 @@ "build": "esbuild src/server.ts --bundle --platform=node --target=node18 --outfile=dist/index.js", "test": "vitest", "coverage": "vitest --coverage", + "generate:proto": "sh proto/build-protos.sh", "swagger": "node src/utils/swagger.utils.js", "pkg": "pkg ." }, "dependencies": { + "@grpc/grpc-js": "^1.9.0", "@types/express": "^4.17.17", "axios": "^1.4.0", "body-parser": "^1.20.2", "dotenv": "^16.0.3", "express": "^4.18.2", "google-protobuf": "^3.21.2", - "grpc": "^1.24.11", "swagger-autogen": "^2.23.5" }, "devDependencies": { diff --git a/services/gateway/src/services/clients/delivery.client.ts b/services/gateway/src/services/clients/delivery.client.ts index 6ec48147..9c57b5dc 100644 --- a/services/gateway/src/services/clients/delivery.client.ts +++ b/services/gateway/src/services/clients/delivery.client.ts @@ -1,5 +1,5 @@ import services from '../../proto/delivery_grpc_pb'; -import * as grpc from "grpc"; +import * as grpc from '@grpc/grpc-js'; // TODO: add delivery env export const deliveryServiceClient = new services.DeliveryServiceClient( diff --git a/services/gateway/src/services/clients/log.client.ts b/services/gateway/src/services/clients/log.client.ts index 5abe375e..25f114c0 100644 --- a/services/gateway/src/services/clients/log.client.ts +++ b/services/gateway/src/services/clients/log.client.ts @@ -1,5 +1,5 @@ import services from '../../proto/log_grpc_pb'; -import * as grpc from "grpc"; +import * as grpc from '@grpc/grpc-js'; // TODO: add log env export const logServiceClient = new services.LogServiceClient( diff --git a/services/gateway/src/services/clients/metric.client.ts b/services/gateway/src/services/clients/metric.client.ts index 8a9232e5..dbe86d30 100644 --- a/services/gateway/src/services/clients/metric.client.ts +++ b/services/gateway/src/services/clients/metric.client.ts @@ -1,5 +1,5 @@ import services from '../../proto/metric_grpc_pb'; -import * as grpc from "grpc"; +import * as grpc from '@grpc/grpc-js'; // TODO: add metric env export default new services.ReportingServiceClient( diff --git a/services/gateway/src/services/clients/order.client.ts b/services/gateway/src/services/clients/order.client.ts index fc3efbd3..36363532 100644 --- a/services/gateway/src/services/clients/order.client.ts +++ b/services/gateway/src/services/clients/order.client.ts @@ -1,5 +1,5 @@ import services from '../../proto/order_grpc_pb'; -import * as grpc from "grpc"; +import * as grpc from '@grpc/grpc-js'; // TODO: add order env export default new services.OrderServiceClient( diff --git a/services/gateway/src/services/clients/product.client.ts b/services/gateway/src/services/clients/product.client.ts index 7eb30f74..4ec9837b 100644 --- a/services/gateway/src/services/clients/product.client.ts +++ b/services/gateway/src/services/clients/product.client.ts @@ -1,4 +1,4 @@ -import * as grpc from "grpc"; +import * as grpc from '@grpc/grpc-js'; import {AllergenServiceClient, CategoryServiceClient, ProductServiceClient} from "@gateway/proto/product_grpc_pb"; // TODO: add order env diff --git a/services/gateway/src/services/clients/promotions.client.ts b/services/gateway/src/services/clients/promotions.client.ts index 063781eb..c0a00fc7 100644 --- a/services/gateway/src/services/clients/promotions.client.ts +++ b/services/gateway/src/services/clients/promotions.client.ts @@ -1,5 +1,5 @@ import services from '../../proto/promotions_grpc_pb'; -import * as grpc from "grpc"; +import * as grpc from '@grpc/grpc-js'; // TODO: add promotions env export const promotionsServiceClient = new services.PromotionServiceClient( diff --git a/services/gateway/src/services/clients/stock.client.ts b/services/gateway/src/services/clients/stock.client.ts index 6e59e8b6..5c4a3aec 100644 --- a/services/gateway/src/services/clients/stock.client.ts +++ b/services/gateway/src/services/clients/stock.client.ts @@ -1,5 +1,5 @@ import services from '../../proto/stock_grpc_pb'; -import * as grpc from "grpc"; +import * as grpc from '@grpc/grpc-js'; // TODO: add stock env export const stockServiceClient = new services.StockServiceClient( diff --git a/services/gateway/src/services/clients/user.client.ts b/services/gateway/src/services/clients/user.client.ts index 6b53adba..be1aa52d 100644 --- a/services/gateway/src/services/clients/user.client.ts +++ b/services/gateway/src/services/clients/user.client.ts @@ -1,5 +1,5 @@ import services from '../../proto/user_grpc_pb'; -import * as grpc from "grpc"; +import * as grpc from '@grpc/grpc-js'; export const userServiceClient = new services.UserServiceClient( 'http://localhost:50001', From ae12abff3e2976c02ee8f5e873ed6697c333b574 Mon Sep 17 00:00:00 2001 From: anatole Date: Mon, 14 Aug 2023 00:41:33 +0200 Subject: [PATCH 355/883] feat(gateway): add services port in the dot env and create dockerfile --- services/gateway/.env.example | 13 ++++++++- services/gateway/Dockerfile | 9 ++---- .../promotion.controller.ts} | 28 +++++++++---------- services/gateway/src/server.ts | 2 +- .../src/services/clients/delivery.client.ts | 7 +++-- .../src/services/clients/log.client.ts | 5 ++-- .../src/services/clients/metric.client.ts | 5 ++-- .../src/services/clients/order.client.ts | 5 ++-- .../src/services/clients/product.client.ts | 9 +++--- .../src/services/clients/promotion.client.ts | 8 ++++++ .../src/services/clients/promotions.client.ts | 7 ----- .../src/services/clients/stock.client.ts | 7 +++-- .../src/services/clients/user.client.ts | 6 ++-- services/gateway/src/utils/swagger.utils.js | 2 +- services/proto/build-protos.sh | 2 +- 15 files changed, 65 insertions(+), 50 deletions(-) rename services/gateway/src/controller/{promotions/promotions.controller.ts => promotion/promotion.controller.ts} (61%) create mode 100644 services/gateway/src/services/clients/promotion.client.ts delete mode 100644 services/gateway/src/services/clients/promotions.client.ts diff --git a/services/gateway/.env.example b/services/gateway/.env.example index 125a90fe..0389f414 100644 --- a/services/gateway/.env.example +++ b/services/gateway/.env.example @@ -1 +1,12 @@ -PORT=50000 \ No newline at end of file +GATEWAY_PORT=50000 +GATEWAY_USER_URL=user-service:50001 +GATEWAY_BASKET_URL=50002 +GATEWAY_PAYMENT_URL=50003 +GATEWAY_PRODUCT_URL=product-service:50004 +GATEWAY_RESTAURANT_URL=50005 +GATEWAY_PROMOTION_URL=promotion-service:50006 +GATEWAY_ORDER_URL=order-service:50007 +GATEWAY_DELIVERY_URL=delivery-service:50008 +GATEWAY_STOCK_URL=stock-service:50009 +GATEWAY_REPORTING_URL=reporting-service:50020 +GATEWAY_LOG_URL=log-service:50021 diff --git a/services/gateway/Dockerfile b/services/gateway/Dockerfile index 6e37d753..49291bc7 100644 --- a/services/gateway/Dockerfile +++ b/services/gateway/Dockerfile @@ -4,7 +4,7 @@ FROM node:18-alpine3.17 as builder WORKDIR /app # Copy the application code -COPY ./order/ . +COPY ./gateway/ . # Install dependencies RUN npm install @@ -12,9 +12,6 @@ RUN npm install # Copy the proto files COPY ./proto ./proto/ -# Generate Prisma client -RUN npx prisma generate - # Build the application RUN npm run build @@ -27,12 +24,10 @@ WORKDIR /app # Copy the application package COPY --from=builder /app/dist . -COPY --from=builder /app/prisma/ . COPY --from=builder /app/proto/ /proto/ -COPY --from=builder /app/node_modules/.prisma /.prisma # Expose the gRPC port -EXPOSE 50007 +EXPOSE 50000 # Start the server CMD [ "node", "index.js"] diff --git a/services/gateway/src/controller/promotions/promotions.controller.ts b/services/gateway/src/controller/promotion/promotion.controller.ts similarity index 61% rename from services/gateway/src/controller/promotions/promotions.controller.ts rename to services/gateway/src/controller/promotion/promotion.controller.ts index 66ac92e6..5787c9f9 100644 --- a/services/gateway/src/controller/promotions/promotions.controller.ts +++ b/services/gateway/src/controller/promotion/promotion.controller.ts @@ -1,13 +1,13 @@ import {Router} from "express"; -import {promotionsServiceClient} from "@gateway/services/clients/promotions.client"; +import {promotionServiceClient} from "@gateway/services/clients/promotion.client"; import {Empty} from "google-protobuf/google/protobuf/empty_pb"; import {Promotion, PromotionCode, PromotionCreateInput, PromotionId, RestaurantId} from "@gateway/proto/promotions_pb"; -export const promotionsRoutes = Router(); +export const promotionRoutes = Router(); -promotionsRoutes.get('/api/promotions/:code', (req, res) => { +promotionRoutes.get('/api/promotion/:code', (req, res) => { const {code} = req.params; - promotionsServiceClient.getPromotion(new PromotionCode().setCode(code), (error, response) => { + promotionServiceClient.getPromotion(new PromotionCode().setCode(code), (error, response) => { if (error) { res.json({error: error.message}); } else { @@ -16,8 +16,8 @@ promotionsRoutes.get('/api/promotions/:code', (req, res) => { }); }); -promotionsRoutes.get('/api/promotions', (req, res) => { - promotionsServiceClient.getPromotions(new Empty(), (error, response) => { +promotionRoutes.get('/api/promotion', (req, res) => { + promotionServiceClient.getPromotions(new Empty(), (error, response) => { if (error) { res.json({error: error.message}); } else { @@ -26,9 +26,9 @@ promotionsRoutes.get('/api/promotions', (req, res) => { }); }); -promotionsRoutes.get('/api/promotions/by-restaurant/:restaurantId', (req, res) => { +promotionRoutes.get('/api/promotion/by-restaurant/:restaurantId', (req, res) => { const {restaurantId} = req.params; - promotionsServiceClient.getPromotionsByRestaurant(new RestaurantId().setId(restaurantId), (error, response) => { + promotionServiceClient.getPromotionsByRestaurant(new RestaurantId().setId(restaurantId), (error, response) => { if (error) { res.json({error: error.message}); } else { @@ -37,13 +37,13 @@ promotionsRoutes.get('/api/promotions/by-restaurant/:restaurantId', (req, res) = }); }); -promotionsRoutes.post('/api/promotions', (req, res) => { +promotionRoutes.post('/api/promotion', (req, res) => { const {code, reduction, method, restaurantId} = req.body; const promotionCreateInput = new PromotionCreateInput().setCode(code) .setReduction(reduction) .setMethod(method) .setRestaurantId(restaurantId); - promotionsServiceClient.createPromotion(promotionCreateInput, (error, response) => { + promotionServiceClient.createPromotion(promotionCreateInput, (error, response) => { if (error) { res.json({error: error.message}); } else { @@ -52,7 +52,7 @@ promotionsRoutes.post('/api/promotions', (req, res) => { }); }); -promotionsRoutes.put('/api/promotions/:id', (req, res) => { +promotionRoutes.put('/api/promotion/:id', (req, res) => { const {id} = req.params; const {code, reduction, method, restaurantId} = req.body; const promotionUpdateInput = new Promotion().setId(id).setCode(code) @@ -60,7 +60,7 @@ promotionsRoutes.put('/api/promotions/:id', (req, res) => { .setMethod(method) .setRestaurantId(restaurantId); - promotionsServiceClient.createPromotion(promotionUpdateInput, (error, response) => { + promotionServiceClient.createPromotion(promotionUpdateInput, (error, response) => { if (error) { res.json({error: error.message}); } else { @@ -69,10 +69,10 @@ promotionsRoutes.put('/api/promotions/:id', (req, res) => { }); }); -promotionsRoutes.delete('/api/promotions/:id', (req, res) => { +promotionRoutes.delete('/api/promotion/:id', (req, res) => { const {id} = req.params; - promotionsServiceClient.deletePromotion(new PromotionId().setId(id), (error, response) => { + promotionServiceClient.deletePromotion(new PromotionId().setId(id), (error, response) => { if (error) { res.json({error: error.message}); } else { diff --git a/services/gateway/src/server.ts b/services/gateway/src/server.ts index 8bb20b12..8a289c5e 100644 --- a/services/gateway/src/server.ts +++ b/services/gateway/src/server.ts @@ -17,7 +17,7 @@ const bodyParser = require('body-parser'); const app = express(); app.use(bodyParser.json()); -const PORT = process.env.PORT || 50000; +const PORT = process.env.GATEWAY_PORT || 50000; app.use('/', userRoutes // #swagger.tags = ['User'] diff --git a/services/gateway/src/services/clients/delivery.client.ts b/services/gateway/src/services/clients/delivery.client.ts index 9c57b5dc..a7cb34ca 100644 --- a/services/gateway/src/services/clients/delivery.client.ts +++ b/services/gateway/src/services/clients/delivery.client.ts @@ -1,11 +1,12 @@ import services from '../../proto/delivery_grpc_pb'; import * as grpc from '@grpc/grpc-js'; -// TODO: add delivery env +const url = process.env.GATEWAY_DELIVERY_URL || "localhost:50008"; + export const deliveryServiceClient = new services.DeliveryServiceClient( - 'http://localhost:50007', + url, grpc.credentials.createInsecure()); export const deliveryPersonServiceClient = new services.DeliveryPersonServiceClient( - 'http://localhost:50007', + url, grpc.credentials.createInsecure()); \ No newline at end of file diff --git a/services/gateway/src/services/clients/log.client.ts b/services/gateway/src/services/clients/log.client.ts index 25f114c0..bcc4e818 100644 --- a/services/gateway/src/services/clients/log.client.ts +++ b/services/gateway/src/services/clients/log.client.ts @@ -1,7 +1,8 @@ import services from '../../proto/log_grpc_pb'; import * as grpc from '@grpc/grpc-js'; -// TODO: add log env +const url = process.env.GATEWAY_LOG_URL || "localhost:50021"; + export const logServiceClient = new services.LogServiceClient( - 'http://localhost:50007', + url, grpc.credentials.createInsecure()); \ No newline at end of file diff --git a/services/gateway/src/services/clients/metric.client.ts b/services/gateway/src/services/clients/metric.client.ts index dbe86d30..0d9a2a7b 100644 --- a/services/gateway/src/services/clients/metric.client.ts +++ b/services/gateway/src/services/clients/metric.client.ts @@ -1,7 +1,8 @@ import services from '../../proto/metric_grpc_pb'; import * as grpc from '@grpc/grpc-js'; -// TODO: add metric env +const url = process.env.GATEWAY_REPORTING_URL || "localhost:50020"; + export default new services.ReportingServiceClient( - 'http://localhost:50007', + url, grpc.credentials.createInsecure()); \ No newline at end of file diff --git a/services/gateway/src/services/clients/order.client.ts b/services/gateway/src/services/clients/order.client.ts index 36363532..22d034ca 100644 --- a/services/gateway/src/services/clients/order.client.ts +++ b/services/gateway/src/services/clients/order.client.ts @@ -1,7 +1,8 @@ import services from '../../proto/order_grpc_pb'; import * as grpc from '@grpc/grpc-js'; -// TODO: add order env +const url = process.env.GATEWAY_ORDER_URL || "localhost:50007"; + export default new services.OrderServiceClient( - 'http://localhost:50007', + url, grpc.credentials.createInsecure()); \ No newline at end of file diff --git a/services/gateway/src/services/clients/product.client.ts b/services/gateway/src/services/clients/product.client.ts index 4ec9837b..b19c3b97 100644 --- a/services/gateway/src/services/clients/product.client.ts +++ b/services/gateway/src/services/clients/product.client.ts @@ -1,15 +1,16 @@ import * as grpc from '@grpc/grpc-js'; import {AllergenServiceClient, CategoryServiceClient, ProductServiceClient} from "@gateway/proto/product_grpc_pb"; -// TODO: add order env +const url = process.env.GATEWAY_PRODUCT_URL || "localhost:50004"; + export const categoryServiceClient = new CategoryServiceClient( - 'http://localhost:50007', + url, grpc.credentials.createInsecure()); export const allergenServiceClient = new AllergenServiceClient( - 'http://localhost:50007', + url, grpc.credentials.createInsecure()); export const productServiceClient = new ProductServiceClient( - 'http://localhost:50007', + url, grpc.credentials.createInsecure()); \ No newline at end of file diff --git a/services/gateway/src/services/clients/promotion.client.ts b/services/gateway/src/services/clients/promotion.client.ts new file mode 100644 index 00000000..38326c3a --- /dev/null +++ b/services/gateway/src/services/clients/promotion.client.ts @@ -0,0 +1,8 @@ +import services from '../../proto/promotions_grpc_pb'; +import * as grpc from '@grpc/grpc-js'; + +const url = process.env.GATEWAY_PROMOTION_URL || "localhost:50006"; + +export const promotionServiceClient = new services.PromotionServiceClient( + url, + grpc.credentials.createInsecure()); \ No newline at end of file diff --git a/services/gateway/src/services/clients/promotions.client.ts b/services/gateway/src/services/clients/promotions.client.ts deleted file mode 100644 index c0a00fc7..00000000 --- a/services/gateway/src/services/clients/promotions.client.ts +++ /dev/null @@ -1,7 +0,0 @@ -import services from '../../proto/promotions_grpc_pb'; -import * as grpc from '@grpc/grpc-js'; - -// TODO: add promotions env -export const promotionsServiceClient = new services.PromotionServiceClient( - 'http://localhost:50007', - grpc.credentials.createInsecure()); \ No newline at end of file diff --git a/services/gateway/src/services/clients/stock.client.ts b/services/gateway/src/services/clients/stock.client.ts index 5c4a3aec..f06291cb 100644 --- a/services/gateway/src/services/clients/stock.client.ts +++ b/services/gateway/src/services/clients/stock.client.ts @@ -1,11 +1,12 @@ import services from '../../proto/stock_grpc_pb'; import * as grpc from '@grpc/grpc-js'; -// TODO: add stock env +const url = process.env.GATEWAY_STOCK_URL || "localhost:50009"; + export const stockServiceClient = new services.StockServiceClient( - 'http://localhost:50007', + url, grpc.credentials.createInsecure()); export const stockPersonServiceClient = new services.StockReportingServiceClient( - 'http://localhost:50007', + url, grpc.credentials.createInsecure()); \ No newline at end of file diff --git a/services/gateway/src/services/clients/user.client.ts b/services/gateway/src/services/clients/user.client.ts index be1aa52d..2828d883 100644 --- a/services/gateway/src/services/clients/user.client.ts +++ b/services/gateway/src/services/clients/user.client.ts @@ -1,10 +1,12 @@ import services from '../../proto/user_grpc_pb'; import * as grpc from '@grpc/grpc-js'; +const url = process.env.GATEWAY_USER_URL || "localhost:50001"; + export const userServiceClient = new services.UserServiceClient( - 'http://localhost:50001', + url, grpc.credentials.createInsecure()); export const mainAddressServiceClient = new services.MainAddressServiceClient( - 'http://localhost:50001', + url, grpc.credentials.createInsecure()); \ No newline at end of file diff --git a/services/gateway/src/utils/swagger.utils.js b/services/gateway/src/utils/swagger.utils.js index a882635b..22323e2c 100644 --- a/services/gateway/src/utils/swagger.utils.js +++ b/services/gateway/src/utils/swagger.utils.js @@ -5,7 +5,7 @@ const doc = { title: 'The Gateway API', description: 'The Gateway API for the Microservices', }, - host: `localhost:${process.env.PORT || 50000}` + host: `localhost:${process.env.GATEWAY_PORT || 50000}` }; const outputFile = './swagger-output.json'; diff --git a/services/proto/build-protos.sh b/services/proto/build-protos.sh index 3334dd19..b2c08606 100644 --- a/services/proto/build-protos.sh +++ b/services/proto/build-protos.sh @@ -20,4 +20,4 @@ yarn run grpc_tools_node_protoc \ --plugin=protoc-gen-ts=./node_modules/.bin/protoc-gen-ts \ --ts_out=${PROTO_DEST} \ -I ./proto \ - proto/*.proto \ No newline at end of file + proto/*.proto From 7a9d1def5bcb77e2cb404ffee315342f7e7100fc Mon Sep 17 00:00:00 2001 From: anatole Date: Mon, 14 Aug 2023 01:05:46 +0200 Subject: [PATCH 356/883] feat(gateway): add docker compose to start all services --- services/docker-compose.yml | 59 +++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 services/docker-compose.yml diff --git a/services/docker-compose.yml b/services/docker-compose.yml new file mode 100644 index 00000000..d33b434f --- /dev/null +++ b/services/docker-compose.yml @@ -0,0 +1,59 @@ +version: "3" +services: + # gateway: + gateway: + image: goodfood-gateway:1.0.0 + build: + context: . + dockerfile: ./gateway/Dockerfile + + env_file: + - ./gateway/.env + ports: + - "50000:50000" + networks: + - goodfood-network + + # delivery-service: + delivery-redis: + image: redis:latest + ports: + - "6379:6379" + volumes: + - goodfood-delivery-volume:/data + networks: + - goodfood-network + command: redis-server --appendonly yes + environment: + REDIS_USERNAME: redis + REDIS_PASSWORD: password + + delivery-postgres: + image: postgres:latest + ports: + - "5432:5432" + volumes: + - goodfood-delivery-volume:/var/lib/postgresql/data + networks: + - goodfood-network + environment: + POSTGRES_USER: postgres + POSTGRES_PASSWORD: password + POSTGRES_DB: postgres + PGDATA: /var/lib/postgresql/data/pgdata + + delivery-service: + image: goodfood-delivery:1.0.0 + build: + context: . + dockerfile: ./delivery/Dockerfile + env_file: + - ./delivery/.env + ports: + - "50008:50008" + +volumes: + goodfood-delivery-volume: + +networks: + goodfood-network: \ No newline at end of file From 51160660df7477a9ad22e4311174f73c8463c988 Mon Sep 17 00:00:00 2001 From: anatole Date: Mon, 14 Aug 2023 01:38:47 +0200 Subject: [PATCH 357/883] feat(basket): create the basket service --- services/basket/.dockerignore | 2 + services/basket/.env.example | 2 + services/basket/.gitignore | 6 + services/basket/.nvmrc | 1 + services/basket/Dockerfile | 33 + services/basket/README.md | 27 + services/basket/docker-compose.yml | 19 + services/basket/k8s/configmap.yml | 8 + services/basket/k8s/deployment.yml | 31 + services/basket/k8s/hpa.yml | 18 + services/basket/k8s/ingress.yml | 17 + services/basket/k8s/service.yml | 13 + services/basket/package-lock.json | 4070 ++++++++++++++++++++++++++++ services/basket/package.json | 51 + services/basket/pnpm-lock.yaml | 2122 +++++++++++++++ services/basket/tsconfig.json | 18 + services/basket/vitest.config.ts | 7 + 17 files changed, 6445 insertions(+) create mode 100644 services/basket/.dockerignore create mode 100644 services/basket/.env.example create mode 100644 services/basket/.gitignore create mode 100644 services/basket/.nvmrc create mode 100644 services/basket/Dockerfile create mode 100644 services/basket/README.md create mode 100644 services/basket/docker-compose.yml create mode 100644 services/basket/k8s/configmap.yml create mode 100644 services/basket/k8s/deployment.yml create mode 100644 services/basket/k8s/hpa.yml create mode 100644 services/basket/k8s/ingress.yml create mode 100644 services/basket/k8s/service.yml create mode 100644 services/basket/package-lock.json create mode 100644 services/basket/package.json create mode 100644 services/basket/pnpm-lock.yaml create mode 100755 services/basket/tsconfig.json create mode 100644 services/basket/vitest.config.ts diff --git a/services/basket/.dockerignore b/services/basket/.dockerignore new file mode 100644 index 00000000..dd87e2d7 --- /dev/null +++ b/services/basket/.dockerignore @@ -0,0 +1,2 @@ +node_modules +build diff --git a/services/basket/.env.example b/services/basket/.env.example new file mode 100644 index 00000000..9fcb03c6 --- /dev/null +++ b/services/basket/.env.example @@ -0,0 +1,2 @@ +REDIS_URL=redis://localhost:6379/0 +PORT=50002 \ No newline at end of file diff --git a/services/basket/.gitignore b/services/basket/.gitignore new file mode 100644 index 00000000..31e50325 --- /dev/null +++ b/services/basket/.gitignore @@ -0,0 +1,6 @@ +node_modules/ +dist/ +bin/ +*.env* +!*.env.example + diff --git a/services/basket/.nvmrc b/services/basket/.nvmrc new file mode 100644 index 00000000..9dfef472 --- /dev/null +++ b/services/basket/.nvmrc @@ -0,0 +1 @@ +v18.12.0 diff --git a/services/basket/Dockerfile b/services/basket/Dockerfile new file mode 100644 index 00000000..9aefe070 --- /dev/null +++ b/services/basket/Dockerfile @@ -0,0 +1,33 @@ +FROM node:18-alpine3.17 as builder + +# Set working directory +WORKDIR /app + +# Copy the application code +COPY ./basket/ . + +# Install dependencies +RUN npm install + +# Copy the proto files - TODO: fix this, proto files should be copied from goodfood/services/proto +COPY ./proto ./proto/ + +# Build the application +RUN npm run build + + +# Create a new image with the application +FROM node:18-alpine3.17 as runner + +# Set working directory +WORKDIR /app + +# Copy the application package +COPY --from=builder /app/dist . +COPY --from=builder /app/proto/ /proto/ + +# Expose the gRPC port +EXPOSE 50002 + +# Start the server +CMD [ "node", "index.js"] diff --git a/services/basket/README.md b/services/basket/README.md new file mode 100644 index 00000000..f998b26e --- /dev/null +++ b/services/basket/README.md @@ -0,0 +1,27 @@ +# Basket Microservice + +| Informations | +|-------------------------------------------| +| **Port:** 50002 | +| **Developer:** @Anatole-Godard | +| **Status:** In progress | +| **Last update:** 2023-08-14 | +| **Language:** NodeJS | +| **Dependencies:** TypeScript, gRPC, Redis | + +## gRPC Methods + +- Basket model: + + - `GetBasket`: Retrieves a basket by its user ID. + - `AddProduct`: Adds a product to a basket. + - `DeleteProduct`: Deletes a product from a basket. + - `Reset`: Resets a basket. + - `SetRestaurant`: Sets a restaurant to a basket. + +## Requirements + +To run this microservice, you will need to have the following installed on your system: + +- NodeJS (v18.12.0 or higher) (dev. with v18.12.0) +- Redis (v6.2.6 or higher) (dev. with docker image `redis:6.2.6`) \ No newline at end of file diff --git a/services/basket/docker-compose.yml b/services/basket/docker-compose.yml new file mode 100644 index 00000000..b4e50000 --- /dev/null +++ b/services/basket/docker-compose.yml @@ -0,0 +1,19 @@ +services: + basket-redis: + image: redis:latest + ports: + - "6379:6379" + volumes: + - goodfood-basket-volume:/data + networks: + - goodfood-basket-network + command: redis-server --appendonly yes + environment: + REDIS_USERNAME: redis + REDIS_PASSWORD: password + +volumes: + goodfood-basket-volume: + +networks: + goodfood-basket-network: diff --git a/services/basket/k8s/configmap.yml b/services/basket/k8s/configmap.yml new file mode 100644 index 00000000..0416dc27 --- /dev/null +++ b/services/basket/k8s/configmap.yml @@ -0,0 +1,8 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: goodfood-basket-configmap + labels: + app: goodfood-basket +data: + port: "50008" \ No newline at end of file diff --git a/services/basket/k8s/deployment.yml b/services/basket/k8s/deployment.yml new file mode 100644 index 00000000..db5f16d4 --- /dev/null +++ b/services/basket/k8s/deployment.yml @@ -0,0 +1,31 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: goodfood-basket + labels: + app: goodfood-basket +spec: + selector: + matchLabels: + app: goodfood-basket + template: + metadata: + labels: + app: goodfood-basket + spec: + containers: + - name: goodfood-basket + image: floriaaan/goodfood-basket:1.0.0 + imagePullPolicy: Always + resources: + limits: + memory: "128Mi" + cpu: "200m" + env: + - name: PORT + valueFrom: + configMapKeyRef: + name: goodfood-basket-configmap + key: port + ports: + - containerPort: 50008 diff --git a/services/basket/k8s/hpa.yml b/services/basket/k8s/hpa.yml new file mode 100644 index 00000000..7824b170 --- /dev/null +++ b/services/basket/k8s/hpa.yml @@ -0,0 +1,18 @@ +apiVersion: autoscaling/v2 +kind: HorizontalPodAutoscaler +metadata: + name: goodfood-basket-hpa +spec: + scaleTargetRef: + apiVersion: apps/v1 + kind: Deployment + name: goodfood-basket + minReplicas: 1 + maxReplicas: 3 + metrics: + - type: Resource + resource: + name: cpu + target: + type: Utilization + averageUtilization: 50 diff --git a/services/basket/k8s/ingress.yml b/services/basket/k8s/ingress.yml new file mode 100644 index 00000000..6a28f270 --- /dev/null +++ b/services/basket/k8s/ingress.yml @@ -0,0 +1,17 @@ +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + name: goodfood-basket +spec: + ingressClassName: nginx + rules: + - host: basket.localdev.me + http: + paths: + - pathType: Prefix + backend: + service: + name: goodfood-basket + port: + number: 50008 + path: / \ No newline at end of file diff --git a/services/basket/k8s/service.yml b/services/basket/k8s/service.yml new file mode 100644 index 00000000..edbe8b5b --- /dev/null +++ b/services/basket/k8s/service.yml @@ -0,0 +1,13 @@ +apiVersion: v1 +kind: Service +metadata: + name: goodfood-basket +spec: + selector: + app: goodfood-basket + ports: + - name: "grpc" + port: 50002 + targetPort: 50002 +status: + loadBalancer: {} diff --git a/services/basket/package-lock.json b/services/basket/package-lock.json new file mode 100644 index 00000000..b21036f6 --- /dev/null +++ b/services/basket/package-lock.json @@ -0,0 +1,4070 @@ +{ + "name": "@goodfood/basket", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "@goodfood/basket", + "dependencies": { + "@grpc/grpc-js": "^1.8.13", + "@grpc/proto-loader": "0.7.6", + "@prisma/client": "4.16.2", + "amqplib": "^0.10.3", + "dotenv": "^16.0.3", + "ioredis": "5.3.2", + "prisma-redis-middleware": "4.8.0", + "protobufjs": "7.2.2" + }, + "bin": { + "basket": "dist/index.js" + }, + "devDependencies": { + "@types/amqplib": "^0.10.1", + "@types/node": "18.15.9", + "esbuild": "^0.17.14", + "nodemon": "^2.0.22", + "pkg": "^5.8.1", + "prisma": "4.16.2", + "ts-node": "10.9.1", + "tsconfig-paths": "^4.1.2", + "typescript": "5.0.2", + "vite-tsconfig-paths": "^4.0.7", + "vitest": "^0.29.8" + } + }, + "node_modules/@acuminous/bitsyntax": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@acuminous/bitsyntax/-/bitsyntax-0.1.2.tgz", + "integrity": "sha512-29lUK80d1muEQqiUsSo+3A0yP6CdspgC95EnKBMi22Xlwt79i/En4Vr67+cXhU+cZjbti3TgGGC5wy1stIywVQ==", + "dependencies": { + "buffer-more-ints": "~1.0.0", + "debug": "^4.3.4", + "safe-buffer": "~5.1.2" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/@babel/generator": { + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.2.tgz", + "integrity": "sha512-W1lG5vUwFvfMd8HVXqdfbuG7RuaSrTCCD8cl8fP8wOivdbtbIg2Db3IWUcgvfxKbbn6ZBGYRW/Zk1MIwK49mgw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.18.2", + "@jridgewell/gen-mapping": "^0.3.0", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", + "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz", + "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.18.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.4.tgz", + "integrity": "sha512-FDge0dFazETFcxGw/EXzOkN8uJp0PC7Qbm+Pe9T+av2zlBpOgunFHkQPPn+eRuClU73JF+98D531UgayY89tow==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/types": { + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.19.0.tgz", + "integrity": "sha512-YuGopBq3ke25BVSiS6fgF49Ul9gH1x70Bcr6bqRLjWCkcX8Hre1/5+z+IiWOIerRMSSEfGZVB9z9kyq7wVs9YA==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.18.10", + "@babel/helper-validator-identifier": "^7.18.6", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.19.tgz", + "integrity": "sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.19.tgz", + "integrity": "sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.19.tgz", + "integrity": "sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.19.tgz", + "integrity": "sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.19.tgz", + "integrity": "sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.19.tgz", + "integrity": "sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.19.tgz", + "integrity": "sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.19.tgz", + "integrity": "sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.19.tgz", + "integrity": "sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.19.tgz", + "integrity": "sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.19.tgz", + "integrity": "sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.19.tgz", + "integrity": "sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.19.tgz", + "integrity": "sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.19.tgz", + "integrity": "sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.19.tgz", + "integrity": "sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.19.tgz", + "integrity": "sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.19.tgz", + "integrity": "sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.19.tgz", + "integrity": "sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.19.tgz", + "integrity": "sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.19.tgz", + "integrity": "sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.19.tgz", + "integrity": "sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.19.tgz", + "integrity": "sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@grpc/grpc-js": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.9.0.tgz", + "integrity": "sha512-H8+iZh+kCE6VR/Krj6W28Y/ZlxoZ1fOzsNt77nrdE3knkbSelW1Uus192xOFCxHyeszLj8i4APQkSIXjAoOxXg==", + "dependencies": { + "@grpc/proto-loader": "^0.7.0", + "@types/node": ">=12.12.47" + }, + "engines": { + "node": "^8.13.0 || >=10.10.0" + } + }, + "node_modules/@grpc/proto-loader": { + "version": "0.7.6", + "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.6.tgz", + "integrity": "sha512-QyAXR8Hyh7uMDmveWxDSUcJr9NAWaZ2I6IXgAYvQmfflwouTM+rArE2eEaCtLlRqO81j7pRLCt81IefUei6Zbw==", + "dependencies": { + "@types/long": "^4.0.1", + "lodash.camelcase": "^4.3.0", + "long": "^4.0.0", + "protobufjs": "^7.0.0", + "yargs": "^16.2.0" + }, + "bin": { + "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@ioredis/commands": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ioredis/commands/-/commands-1.2.0.tgz", + "integrity": "sha512-Sx1pU8EM64o2BrqNpEO1CNLtKQwyhuXuqyfH7oGKCk+1a33d2r5saW8zNwm3j6BTExtjrv2BxTgzzkMwts6vGg==" + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.19", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz", + "integrity": "sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@prisma/client": { + "version": "4.16.2", + "resolved": "https://registry.npmjs.org/@prisma/client/-/client-4.16.2.tgz", + "integrity": "sha512-qCoEyxv1ZrQ4bKy39GnylE8Zq31IRmm8bNhNbZx7bF2cU5aiCCnSa93J2imF88MBjn7J9eUQneNxUQVJdl/rPQ==", + "hasInstallScript": true, + "dependencies": { + "@prisma/engines-version": "4.16.1-1.4bc8b6e1b66cb932731fb1bdbbc550d1e010de81" + }, + "engines": { + "node": ">=14.17" + }, + "peerDependencies": { + "prisma": "*" + }, + "peerDependenciesMeta": { + "prisma": { + "optional": true + } + } + }, + "node_modules/@prisma/engines": { + "version": "4.16.2", + "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-4.16.2.tgz", + "integrity": "sha512-vx1nxVvN4QeT/cepQce68deh/Turxy5Mr+4L4zClFuK1GlxN3+ivxfuv+ej/gvidWn1cE1uAhW7ALLNlYbRUAw==", + "devOptional": true, + "hasInstallScript": true + }, + "node_modules/@prisma/engines-version": { + "version": "4.16.1-1.4bc8b6e1b66cb932731fb1bdbbc550d1e010de81", + "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-4.16.1-1.4bc8b6e1b66cb932731fb1bdbbc550d1e010de81.tgz", + "integrity": "sha512-q617EUWfRIDTriWADZ4YiWRZXCa/WuhNgLTVd+HqWLffjMSPzyM5uOWoauX91wvQClSKZU4pzI4JJLQ9Kl62Qg==" + }, + "node_modules/@protobufjs/aspromise": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==" + }, + "node_modules/@protobufjs/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" + }, + "node_modules/@protobufjs/codegen": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", + "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" + }, + "node_modules/@protobufjs/eventemitter": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", + "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==" + }, + "node_modules/@protobufjs/fetch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", + "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", + "dependencies": { + "@protobufjs/aspromise": "^1.1.1", + "@protobufjs/inquire": "^1.1.0" + } + }, + "node_modules/@protobufjs/float": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", + "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==" + }, + "node_modules/@protobufjs/inquire": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", + "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==" + }, + "node_modules/@protobufjs/path": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==" + }, + "node_modules/@protobufjs/pool": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==" + }, + "node_modules/@protobufjs/utf8": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", + "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==" + }, + "node_modules/@tsconfig/node10": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", + "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", + "dev": true + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", + "dev": true + }, + "node_modules/@types/amqplib": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/@types/amqplib/-/amqplib-0.10.1.tgz", + "integrity": "sha512-j6ANKT79ncUDnAs/+9r9eDujxbeJoTjoVu33gHHcaPfmLQaMhvfbH2GqSe8KUM444epAp1Vl3peVOQfZk3UIqA==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/chai": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.5.tgz", + "integrity": "sha512-mEo1sAde+UCE6b2hxn332f1g1E8WfYRu6p5SvTKr2ZKC1f7gFJXk4h5PyGP9Dt6gCaG8y8XhwnXWC6Iy2cmBng==", + "dev": true + }, + "node_modules/@types/chai-subset": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@types/chai-subset/-/chai-subset-1.3.3.tgz", + "integrity": "sha512-frBecisrNGz+F4T6bcc+NLeolfiojh5FxW2klu669+8BARtyQv2C/GkNW6FUodVe4BroGMP/wER/YDGc7rEllw==", + "dev": true, + "dependencies": { + "@types/chai": "*" + } + }, + "node_modules/@types/long": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz", + "integrity": "sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==" + }, + "node_modules/@types/node": { + "version": "18.15.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.9.tgz", + "integrity": "sha512-dUxhiNzBLr6IqlZXz6e/rN2YQXlFgOei/Dxy+e3cyXTJ4txSUbGT2/fmnD6zd/75jDMeW5bDee+YXxlFKHoV0A==" + }, + "node_modules/@vitest/expect": { + "version": "0.29.8", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-0.29.8.tgz", + "integrity": "sha512-xlcVXn5I5oTq6NiZSY3ykyWixBxr5mG8HYtjvpgg6KaqHm0mvhX18xuwl5YGxIRNt/A5jidd7CWcNHrSvgaQqQ==", + "dev": true, + "dependencies": { + "@vitest/spy": "0.29.8", + "@vitest/utils": "0.29.8", + "chai": "^4.3.7" + } + }, + "node_modules/@vitest/runner": { + "version": "0.29.8", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-0.29.8.tgz", + "integrity": "sha512-FzdhnRDwEr/A3Oo1jtIk/B952BBvP32n1ObMEb23oEJNO+qO5cBet6M2XWIDQmA7BDKGKvmhUf2naXyp/2JEwQ==", + "dev": true, + "dependencies": { + "@vitest/utils": "0.29.8", + "p-limit": "^4.0.0", + "pathe": "^1.1.0" + } + }, + "node_modules/@vitest/spy": { + "version": "0.29.8", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-0.29.8.tgz", + "integrity": "sha512-VdjBe9w34vOMl5I5mYEzNX8inTxrZ+tYUVk9jxaZJmHFwmDFC/GV3KBFTA/JKswr3XHvZL+FE/yq5EVhb6pSAw==", + "dev": true, + "dependencies": { + "tinyspy": "^1.0.2" + } + }, + "node_modules/@vitest/utils": { + "version": "0.29.8", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-0.29.8.tgz", + "integrity": "sha512-qGzuf3vrTbnoY+RjjVVIBYfuWMjn3UMUqyQtdGNZ6ZIIyte7B37exj6LaVkrZiUTvzSadVvO/tJm8AEgbGCBPg==", + "dev": true, + "dependencies": { + "cli-truncate": "^3.1.0", + "diff": "^5.1.0", + "loupe": "^2.3.6", + "pretty-format": "^27.5.1" + } + }, + "node_modules/@vitest/utils/node_modules/diff": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.1.0.tgz", + "integrity": "sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true + }, + "node_modules/acorn": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/amqplib": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/amqplib/-/amqplib-0.10.3.tgz", + "integrity": "sha512-UHmuSa7n8vVW/a5HGh2nFPqAEr8+cD4dEZ6u9GjP91nHfr1a54RyAKyra7Sb5NH7NBKOUlyQSMXIp0qAixKexw==", + "dependencies": { + "@acuminous/bitsyntax": "^0.1.2", + "buffer-more-ints": "~1.0.0", + "readable-stream": "1.x >=1.1.9", + "url-parse": "~1.5.10" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/async-cache-dedupe": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/async-cache-dedupe/-/async-cache-dedupe-1.12.0.tgz", + "integrity": "sha512-LKumaBNhzvZrbrRi3DtIf0ETgjqcGOa/M2U+0DpTp8f+RzIiWubiQmBjuYUaihxetR3cWWC6hQj/uDVBuYajRA==", + "dependencies": { + "mnemonist": "^0.39.2", + "safe-stable-stringify": "^2.3.1" + } + }, + "node_modules/at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dev": true, + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/bl/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/bl/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/bl/node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/buffer-more-ints": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-more-ints/-/buffer-more-ints-1.0.0.tgz", + "integrity": "sha512-EMetuGFz5SLsT0QTnXzINh4Ksr+oo4i+UGTXEshiGCQWnsgSs7ZhJ8fzlwQ+OzEMs0MpDAMr1hxnblp5a4vcHg==" + }, + "node_modules/cac": { + "version": "6.7.14", + "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", + "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/chai": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.7.tgz", + "integrity": "sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==", + "dev": true, + "dependencies": { + "assertion-error": "^1.1.0", + "check-error": "^1.0.2", + "deep-eql": "^4.1.2", + "get-func-name": "^2.0.0", + "loupe": "^2.3.1", + "pathval": "^1.1.1", + "type-detect": "^4.0.5" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chalk/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/chalk/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/check-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", + "integrity": "sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "dev": true + }, + "node_modules/cli-truncate": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-3.1.0.tgz", + "integrity": "sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==", + "dev": true, + "dependencies": { + "slice-ansi": "^5.0.0", + "string-width": "^5.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/cliui/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/cliui/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cluster-key-slot": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/cluster-key-slot/-/cluster-key-slot-1.1.2.tgz", + "integrity": "sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "dev": true, + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/deep-eql": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz", + "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==", + "dev": true, + "dependencies": { + "type-detect": "^4.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "dev": true, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/denque": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz", + "integrity": "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/detect-libc": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.2.tgz", + "integrity": "sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dotenv": { + "version": "16.3.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.3.1.tgz", + "integrity": "sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/motdotla/dotenv?sponsor=1" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/esbuild": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.19.tgz", + "integrity": "sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.17.19", + "@esbuild/android-arm64": "0.17.19", + "@esbuild/android-x64": "0.17.19", + "@esbuild/darwin-arm64": "0.17.19", + "@esbuild/darwin-x64": "0.17.19", + "@esbuild/freebsd-arm64": "0.17.19", + "@esbuild/freebsd-x64": "0.17.19", + "@esbuild/linux-arm": "0.17.19", + "@esbuild/linux-arm64": "0.17.19", + "@esbuild/linux-ia32": "0.17.19", + "@esbuild/linux-loong64": "0.17.19", + "@esbuild/linux-mips64el": "0.17.19", + "@esbuild/linux-ppc64": "0.17.19", + "@esbuild/linux-riscv64": "0.17.19", + "@esbuild/linux-s390x": "0.17.19", + "@esbuild/linux-x64": "0.17.19", + "@esbuild/netbsd-x64": "0.17.19", + "@esbuild/openbsd-x64": "0.17.19", + "@esbuild/sunos-x64": "0.17.19", + "@esbuild/win32-arm64": "0.17.19", + "@esbuild/win32-ia32": "0.17.19", + "@esbuild/win32-x64": "0.17.19" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "engines": { + "node": ">=6" + } + }, + "node_modules/expand-template": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", + "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/fast-glob": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", + "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + } + }, + "node_modules/from2/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "node_modules/from2/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/from2/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "dev": true + }, + "node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-func-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", + "integrity": "sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/github-from-package": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", + "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==", + "dev": true + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globrex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz", + "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==", + "dev": true + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dev": true, + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/ignore": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/ignore-by-default": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", + "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==", + "dev": true + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true + }, + "node_modules/into-stream": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/into-stream/-/into-stream-6.0.0.tgz", + "integrity": "sha512-XHbaOAvP+uFKUFsOgoNPRjLkwB+I22JFPFe5OjTkQ0nwgj6+pSjb4NmB6VMxaPshLiOf+zcpOCBQuLwC1KHhZA==", + "dev": true, + "dependencies": { + "from2": "^2.3.0", + "p-is-promise": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ioredis": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ioredis/-/ioredis-5.3.2.tgz", + "integrity": "sha512-1DKMMzlIHM02eBBVOFQ1+AolGjs6+xEcM4PDL7NqOS6szq7H9jSaEkIUH6/a5Hl241LzW6JLSiAbNvTQjUupUA==", + "dependencies": { + "@ioredis/commands": "^1.1.1", + "cluster-key-slot": "^1.1.0", + "debug": "^4.3.4", + "denque": "^2.1.0", + "lodash.defaults": "^4.2.0", + "lodash.isarguments": "^3.1.0", + "redis-errors": "^1.2.0", + "redis-parser": "^3.0.0", + "standard-as-callback": "^2.1.0" + }, + "engines": { + "node": ">=12.22.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/ioredis" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz", + "integrity": "sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", + "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonc-parser": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", + "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", + "dev": true + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/local-pkg": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.4.3.tgz", + "integrity": "sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==" + }, + "node_modules/lodash.defaults": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", + "integrity": "sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==" + }, + "node_modules/lodash.isarguments": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", + "integrity": "sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==" + }, + "node_modules/long": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", + "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" + }, + "node_modules/loupe": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.6.tgz", + "integrity": "sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==", + "dev": true, + "dependencies": { + "get-func-name": "^2.0.0" + } + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/mkdirp-classic": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", + "dev": true + }, + "node_modules/mlly": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.4.0.tgz", + "integrity": "sha512-ua8PAThnTwpprIaU47EPeZ/bPUVp2QYBbWMphUQpVdBI3Lgqzm5KZQ45Agm3YJedHXaIHl6pBGabaLSUPPSptg==", + "dev": true, + "dependencies": { + "acorn": "^8.9.0", + "pathe": "^1.1.1", + "pkg-types": "^1.0.3", + "ufo": "^1.1.2" + } + }, + "node_modules/mnemonist": { + "version": "0.39.5", + "resolved": "https://registry.npmjs.org/mnemonist/-/mnemonist-0.39.5.tgz", + "integrity": "sha512-FPUtkhtJ0efmEFGpU14x7jGbTB+s18LrzRL2KgoWz9YvcY3cPomz8tih01GbHwnGk/OmkOKfqd/RAQoc8Lm7DQ==", + "dependencies": { + "obliterator": "^2.0.1" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/multistream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/multistream/-/multistream-4.1.0.tgz", + "integrity": "sha512-J1XDiAmmNpRCBfIWJv+n0ymC4ABcf/Pl+5YvC5B/D2f/2+8PtHvCNxMPKiQcZyi922Hq69J2YOpb1pTywfifyw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "once": "^1.4.0", + "readable-stream": "^3.6.0" + } + }, + "node_modules/multistream/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/multistream/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/multistream/node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/nanoid": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", + "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/napi-build-utils": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", + "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==", + "dev": true + }, + "node_modules/node-abi": { + "version": "3.45.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.45.0.tgz", + "integrity": "sha512-iwXuFrMAcFVi/ZoZiqq8BzAdsLw9kxDfTC0HMyjXfSL/6CSDAGD5UmR7azrAgWV1zKYq7dUUMj4owusBWKLsiQ==", + "dev": true, + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/node-abi/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/node-fetch": { + "version": "2.6.12", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.12.tgz", + "integrity": "sha512-C/fGU2E8ToujUivIO0H+tpQ6HWo4eEmchoPIoXtxCrVghxdKq+QOHqEZW7tuP3KlV3bC8FRMO5nMCC7Zm1VP6g==", + "dev": true, + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/nodemon": { + "version": "2.0.22", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.22.tgz", + "integrity": "sha512-B8YqaKMmyuCO7BowF1Z1/mkPqLk6cs/l63Ojtd6otKjMx47Dq1utxfRxcavH1I7VSaL8n5BUaoutadnsX3AAVQ==", + "dev": true, + "dependencies": { + "chokidar": "^3.5.2", + "debug": "^3.2.7", + "ignore-by-default": "^1.0.1", + "minimatch": "^3.1.2", + "pstree.remy": "^1.1.8", + "semver": "^5.7.1", + "simple-update-notifier": "^1.0.7", + "supports-color": "^5.5.0", + "touch": "^3.1.0", + "undefsafe": "^2.0.5" + }, + "bin": { + "nodemon": "bin/nodemon.js" + }, + "engines": { + "node": ">=8.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/nodemon" + } + }, + "node_modules/nodemon/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/nopt": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", + "integrity": "sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==", + "dev": true, + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "*" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/obliterator": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/obliterator/-/obliterator-2.0.4.tgz", + "integrity": "sha512-lgHwxlxV1qIg1Eap7LgIeoBWIMFibOjbrYPIPJZcI1mmGAI2m3lNYpK12Y+GBdPQ0U1hRwSord7GIaawz962qQ==" + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/p-is-promise": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-3.0.0.tgz", + "integrity": "sha512-Wo8VsW4IRQSKVXsJCn7TomUaVtyfjVDn3nUP7kE967BQk0CwFpdbZs0X0uk5sW9mkBa9eNM7hCMaG93WUAwxYQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-limit": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", + "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^1.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/pathe": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.1.tgz", + "integrity": "sha512-d+RQGp0MAYTIaDBIMmOfMwz3E+LOZnxx1HZd5R18mmCZY0QBlK0LDZfPc8FW8Ed2DlvsuE6PRjroDY+wg4+j/Q==", + "dev": true + }, + "node_modules/pathval": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", + "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pkg": { + "version": "5.8.1", + "resolved": "https://registry.npmjs.org/pkg/-/pkg-5.8.1.tgz", + "integrity": "sha512-CjBWtFStCfIiT4Bde9QpJy0KeH19jCfwZRJqHFDFXfhUklCx8JoFmMj3wgnEYIwGmZVNkhsStPHEOnrtrQhEXA==", + "dev": true, + "dependencies": { + "@babel/generator": "7.18.2", + "@babel/parser": "7.18.4", + "@babel/types": "7.19.0", + "chalk": "^4.1.2", + "fs-extra": "^9.1.0", + "globby": "^11.1.0", + "into-stream": "^6.0.0", + "is-core-module": "2.9.0", + "minimist": "^1.2.6", + "multistream": "^4.1.0", + "pkg-fetch": "3.4.2", + "prebuild-install": "7.1.1", + "resolve": "^1.22.0", + "stream-meter": "^1.0.4" + }, + "bin": { + "pkg": "lib-es5/bin.js" + }, + "peerDependencies": { + "node-notifier": ">=9.0.1" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/pkg-fetch": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/pkg-fetch/-/pkg-fetch-3.4.2.tgz", + "integrity": "sha512-0+uijmzYcnhC0hStDjm/cl2VYdrmVVBpe7Q8k9YBojxmR5tG8mvR9/nooQq3QSXiQqORDVOTY3XqMEqJVIzkHA==", + "dev": true, + "dependencies": { + "chalk": "^4.1.2", + "fs-extra": "^9.1.0", + "https-proxy-agent": "^5.0.0", + "node-fetch": "^2.6.6", + "progress": "^2.0.3", + "semver": "^7.3.5", + "tar-fs": "^2.1.1", + "yargs": "^16.2.0" + }, + "bin": { + "pkg-fetch": "lib-es5/bin.js" + } + }, + "node_modules/pkg-fetch/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/pkg-types": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.0.3.tgz", + "integrity": "sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==", + "dev": true, + "dependencies": { + "jsonc-parser": "^3.2.0", + "mlly": "^1.2.0", + "pathe": "^1.1.0" + } + }, + "node_modules/postcss": { + "version": "8.4.27", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.27.tgz", + "integrity": "sha512-gY/ACJtJPSmUFPDCHtX78+01fHa64FaU4zaaWfuh1MhGJISufJAH4cun6k/8fwsHYeK4UQmENQK+tRLCFJE8JQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/prebuild-install": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.1.tgz", + "integrity": "sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==", + "dev": true, + "dependencies": { + "detect-libc": "^2.0.0", + "expand-template": "^2.0.3", + "github-from-package": "0.0.0", + "minimist": "^1.2.3", + "mkdirp-classic": "^0.5.3", + "napi-build-utils": "^1.0.1", + "node-abi": "^3.3.0", + "pump": "^3.0.0", + "rc": "^1.2.7", + "simple-get": "^4.0.0", + "tar-fs": "^2.0.0", + "tunnel-agent": "^0.6.0" + }, + "bin": { + "prebuild-install": "bin.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/pretty-format": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", + "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/prisma": { + "version": "4.16.2", + "resolved": "https://registry.npmjs.org/prisma/-/prisma-4.16.2.tgz", + "integrity": "sha512-SYCsBvDf0/7XSJyf2cHTLjLeTLVXYfqp7pG5eEVafFLeT0u/hLFz/9W196nDRGUOo1JfPatAEb+uEnTQImQC1g==", + "devOptional": true, + "hasInstallScript": true, + "dependencies": { + "@prisma/engines": "4.16.2" + }, + "bin": { + "prisma": "build/index.js", + "prisma2": "build/index.js" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/prisma-redis-middleware": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/prisma-redis-middleware/-/prisma-redis-middleware-4.8.0.tgz", + "integrity": "sha512-d1B7TVLiR8aSiOY2GPKKDb5EWGTK+EmlIkztAZCPWxs4/IHGfIAZiDoLklp6CcK+5ckjcaJq8aWE5AjRJ3+Rpg==", + "dependencies": { + "async-cache-dedupe": "1.12.0", + "ioredis": "5.3.2" + }, + "engines": { + "node": "^16.x || ^18.x", + "npm": "^7.x || ^8.x || ^9.x" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/protobufjs": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.2.2.tgz", + "integrity": "sha512-++PrQIjrom+bFDPpfmqXfAGSQs40116JRrqqyf53dymUMvvb5d/LMRyicRoF1AUKoXVS1/IgJXlEgcpr4gTF3Q==", + "hasInstallScript": true, + "dependencies": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/node": ">=13.7.0", + "long": "^5.0.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/protobufjs/node_modules/long": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", + "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==" + }, + "node_modules/pstree.remy": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", + "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", + "dev": true + }, + "node_modules/pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==" + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dev": true, + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, + "node_modules/react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", + "dev": true + }, + "node_modules/readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/redis-errors": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/redis-errors/-/redis-errors-1.2.0.tgz", + "integrity": "sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w==", + "engines": { + "node": ">=4" + } + }, + "node_modules/redis-parser": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redis-parser/-/redis-parser-3.0.0.tgz", + "integrity": "sha512-DJnGAeenTdpMEH6uAJRK/uiyEIH9WVsUmoLwzudwGJUwZPp80PDBWPHXSAGNPwNvIXAbe7MSUB1zQFugFml66A==", + "dependencies": { + "redis-errors": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==" + }, + "node_modules/resolve": { + "version": "1.22.4", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.4.tgz", + "integrity": "sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==", + "dev": true, + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve/node_modules/is-core-module": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", + "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rollup": { + "version": "3.28.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.28.0.tgz", + "integrity": "sha512-d7zhvo1OUY2SXSM6pfNjgD5+d0Nz87CUp4mt8l/GgVP3oBsPwzNvSzyu1me6BSG9JIgWNTVcafIXBIyM8yQ3yw==", + "dev": true, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=14.18.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/safe-stable-stringify": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz", + "integrity": "sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==", + "engines": { + "node": ">=10" + } + }, + "node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/siginfo": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", + "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", + "dev": true + }, + "node_modules/simple-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/simple-get": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", + "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "decompress-response": "^6.0.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } + }, + "node_modules/simple-update-notifier": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-1.1.0.tgz", + "integrity": "sha512-VpsrsJSUcJEseSbMHkrsrAVSdvVS5I96Qo1QAQ4FxQ9wXFcB+pjj7FB7/us9+GcgfW4ziHtYMc1J0PLczb55mg==", + "dev": true, + "dependencies": { + "semver": "~7.0.0" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/simple-update-notifier/node_modules/semver": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", + "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/slice-ansi": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", + "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.0.0", + "is-fullwidth-code-point": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/slice-ansi/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stackback": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", + "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", + "dev": true + }, + "node_modules/standard-as-callback": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/standard-as-callback/-/standard-as-callback-2.1.0.tgz", + "integrity": "sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A==" + }, + "node_modules/std-env": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.3.3.tgz", + "integrity": "sha512-Rz6yejtVyWnVjC1RFvNmYL10kgjC49EOghxWn0RFqlCHGFpQx+Xe7yW3I4ceK1SGrWIGMjD5Kbue8W/udkbMJg==", + "dev": true + }, + "node_modules/stream-meter": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/stream-meter/-/stream-meter-1.0.4.tgz", + "integrity": "sha512-4sOEtrbgFotXwnEuzzsQBYEV1elAeFSO8rSGeTwabuX1RRn/kEq9JVH7I0MRBhKVRR0sJkr0M0QCH7yOLf9fhQ==", + "dev": true, + "dependencies": { + "readable-stream": "^2.1.4" + } + }, + "node_modules/stream-meter/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "node_modules/stream-meter/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/stream-meter/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==" + }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/strip-ansi/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-literal": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-1.3.0.tgz", + "integrity": "sha512-PugKzOsyXpArk0yWmUwqOZecSO0GH0bPoctLcqNDH9J04pVW3lflYE0ujElBGTloevcxF5MofAOZ7C5l2b+wLg==", + "dev": true, + "dependencies": { + "acorn": "^8.10.0" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tar-fs": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", + "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", + "dev": true, + "dependencies": { + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.1.4" + } + }, + "node_modules/tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "dev": true, + "dependencies": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tar-stream/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/tar-stream/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/tar-stream/node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/tinybench": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.5.0.tgz", + "integrity": "sha512-kRwSG8Zx4tjF9ZiyH4bhaebu+EDz1BOx9hOigYHlUW4xxI/wKIUQUqo018UlU4ar6ATPBsaMrdbKZ+tmPdohFA==", + "dev": true + }, + "node_modules/tinypool": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-0.4.0.tgz", + "integrity": "sha512-2ksntHOKf893wSAH4z/+JbPpi92esw8Gn9N2deXX+B0EO92hexAVI9GIZZPx7P5aYo5KULfeOSt3kMOmSOy6uA==", + "dev": true, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tinyspy": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-1.1.1.tgz", + "integrity": "sha512-UVq5AXt/gQlti7oxoIg5oi/9r0WpF7DGEVwXgqWSMmyN16+e3tl5lIvTaOpJ3TAtu5xFzWccFRM4R5NaWHF+4g==", + "dev": true, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/touch": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", + "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", + "dev": true, + "dependencies": { + "nopt": "~1.0.10" + }, + "bin": { + "nodetouch": "bin/nodetouch.js" + } + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "dev": true + }, + "node_modules/ts-node": { + "version": "10.9.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", + "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", + "dev": true, + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "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 + } + } + }, + "node_modules/tsconfck": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/tsconfck/-/tsconfck-2.1.2.tgz", + "integrity": "sha512-ghqN1b0puy3MhhviwO2kGF8SeMDNhEbnKxjK7h6+fvY9JAxqvXi8y5NAHSQv687OVboS2uZIByzGd45/YxrRHg==", + "dev": true, + "bin": { + "tsconfck": "bin/tsconfck.js" + }, + "engines": { + "node": "^14.13.1 || ^16 || >=18" + }, + "peerDependencies": { + "typescript": "^4.3.5 || ^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/tsconfig-paths": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", + "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==", + "dev": true, + "dependencies": { + "json5": "^2.2.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "dev": true, + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/typescript": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.2.tgz", + "integrity": "sha512-wVORMBGO/FAs/++blGNeAVdbNKtIh1rbBL2EyQ1+J9lClJ93KiiKe8PmFIVdXhHcyv44SL9oglmfeSsndo0jRw==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=12.20" + } + }, + "node_modules/ufo": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.2.0.tgz", + "integrity": "sha512-RsPyTbqORDNDxqAdQPQBpgqhWle1VcTSou/FraClYlHf6TZnQcGslpLcAphNR+sQW4q5lLWLbOsRlh9j24baQg==", + "dev": true + }, + "node_modules/undefsafe": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", + "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", + "dev": true + }, + "node_modules/universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/url-parse": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true + }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true + }, + "node_modules/vite": { + "version": "4.4.9", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.4.9.tgz", + "integrity": "sha512-2mbUn2LlUmNASWwSCNSJ/EG2HuSRTnVNaydp6vMCm5VIqJsjMfbIWtbH2kDuwUVW5mMUKKZvGPX/rqeqVvv1XA==", + "dev": true, + "dependencies": { + "esbuild": "^0.18.10", + "postcss": "^8.4.27", + "rollup": "^3.27.1" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + }, + "peerDependencies": { + "@types/node": ">= 14", + "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 + } + } + }, + "node_modules/vite-node": { + "version": "0.29.8", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-0.29.8.tgz", + "integrity": "sha512-b6OtCXfk65L6SElVM20q5G546yu10/kNrhg08afEoWlFRJXFq9/6glsvSVY+aI6YeC1tu2TtAqI2jHEQmOmsFw==", + "dev": true, + "dependencies": { + "cac": "^6.7.14", + "debug": "^4.3.4", + "mlly": "^1.1.0", + "pathe": "^1.1.0", + "picocolors": "^1.0.0", + "vite": "^3.0.0 || ^4.0.0" + }, + "bin": { + "vite-node": "vite-node.mjs" + }, + "engines": { + "node": ">=v14.16.0" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/vite-tsconfig-paths": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/vite-tsconfig-paths/-/vite-tsconfig-paths-4.2.0.tgz", + "integrity": "sha512-jGpus0eUy5qbbMVGiTxCL1iB9ZGN6Bd37VGLJU39kTDD6ZfULTTb1bcc5IeTWqWJKiWV5YihCaibeASPiGi8kw==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "globrex": "^0.1.2", + "tsconfck": "^2.1.0" + }, + "peerDependencies": { + "vite": "*" + }, + "peerDependenciesMeta": { + "vite": { + "optional": true + } + } + }, + "node_modules/vite/node_modules/@esbuild/android-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", + "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/android-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz", + "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/android-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz", + "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/darwin-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz", + "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/darwin-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz", + "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/freebsd-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz", + "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/freebsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz", + "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz", + "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz", + "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz", + "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-loong64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", + "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-mips64el": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz", + "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-ppc64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz", + "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-riscv64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz", + "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-s390x": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz", + "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz", + "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/netbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz", + "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/openbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz", + "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/sunos-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz", + "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/win32-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", + "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/win32-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz", + "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/win32-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", + "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/esbuild": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", + "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.18.20", + "@esbuild/android-arm64": "0.18.20", + "@esbuild/android-x64": "0.18.20", + "@esbuild/darwin-arm64": "0.18.20", + "@esbuild/darwin-x64": "0.18.20", + "@esbuild/freebsd-arm64": "0.18.20", + "@esbuild/freebsd-x64": "0.18.20", + "@esbuild/linux-arm": "0.18.20", + "@esbuild/linux-arm64": "0.18.20", + "@esbuild/linux-ia32": "0.18.20", + "@esbuild/linux-loong64": "0.18.20", + "@esbuild/linux-mips64el": "0.18.20", + "@esbuild/linux-ppc64": "0.18.20", + "@esbuild/linux-riscv64": "0.18.20", + "@esbuild/linux-s390x": "0.18.20", + "@esbuild/linux-x64": "0.18.20", + "@esbuild/netbsd-x64": "0.18.20", + "@esbuild/openbsd-x64": "0.18.20", + "@esbuild/sunos-x64": "0.18.20", + "@esbuild/win32-arm64": "0.18.20", + "@esbuild/win32-ia32": "0.18.20", + "@esbuild/win32-x64": "0.18.20" + } + }, + "node_modules/vitest": { + "version": "0.29.8", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-0.29.8.tgz", + "integrity": "sha512-JIAVi2GK5cvA6awGpH0HvH/gEG9PZ0a/WoxdiV3PmqK+3CjQMf8c+J/Vhv4mdZ2nRyXFw66sAg6qz7VNkaHfDQ==", + "dev": true, + "dependencies": { + "@types/chai": "^4.3.4", + "@types/chai-subset": "^1.3.3", + "@types/node": "*", + "@vitest/expect": "0.29.8", + "@vitest/runner": "0.29.8", + "@vitest/spy": "0.29.8", + "@vitest/utils": "0.29.8", + "acorn": "^8.8.1", + "acorn-walk": "^8.2.0", + "cac": "^6.7.14", + "chai": "^4.3.7", + "debug": "^4.3.4", + "local-pkg": "^0.4.2", + "pathe": "^1.1.0", + "picocolors": "^1.0.0", + "source-map": "^0.6.1", + "std-env": "^3.3.1", + "strip-literal": "^1.0.0", + "tinybench": "^2.3.1", + "tinypool": "^0.4.0", + "tinyspy": "^1.0.2", + "vite": "^3.0.0 || ^4.0.0", + "vite-node": "0.29.8", + "why-is-node-running": "^2.2.2" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": ">=v14.16.0" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@vitest/browser": "*", + "@vitest/ui": "*", + "happy-dom": "*", + "jsdom": "*", + "playwright": "*", + "safaridriver": "*", + "webdriverio": "*" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@vitest/browser": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + }, + "playwright": { + "optional": true + }, + "safaridriver": { + "optional": true + }, + "webdriverio": { + "optional": true + } + } + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "dev": true + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dev": true, + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/why-is-node-running": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.2.2.tgz", + "integrity": "sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==", + "dev": true, + "dependencies": { + "siginfo": "^2.0.0", + "stackback": "0.0.2" + }, + "bin": { + "why-is-node-running": "cli.js" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/wrap-ansi/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/yargs/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/yocto-queue": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", + "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", + "dev": true, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/services/basket/package.json b/services/basket/package.json new file mode 100644 index 00000000..9963d558 --- /dev/null +++ b/services/basket/package.json @@ -0,0 +1,51 @@ +{ + "name": "@goodfood/basket", + "bin": "dist/index.js", + "scripts": { + "start": "node dist/index.js", + "dev": "nodemon --watch 'src/**/*.ts' --exec 'ts-node' src/server.ts", + "build": "esbuild src/server.ts --bundle --platform=node --target=node18 --outfile=dist/index.js", + "test": "echo 'tests are disabled' # vitest", + "coverage": "vitest --coverage", + "pkg": "pkg ." + }, + "dependencies": { + "@grpc/grpc-js": "^1.8.13", + "@grpc/proto-loader": "0.7.6", + "@prisma/client": "4.16.2", + "amqplib": "^0.10.3", + "dotenv": "^16.0.3", + "ioredis": "5.3.2", + "prisma-redis-middleware": "4.8.0", + "protobufjs": "7.2.2" + }, + "devDependencies": { + "@types/amqplib": "^0.10.1", + "@types/node": "18.15.9", + "esbuild": "^0.17.14", + "nodemon": "^2.0.22", + "pkg": "^5.8.1", + "prisma": "4.16.2", + "ts-node": "10.9.1", + "tsconfig-paths": "^4.1.2", + "typescript": "5.0.2", + "vite-tsconfig-paths": "^4.0.7", + "vitest": "^0.29.8" + }, + "prisma": { + "seed": "ts-node prisma/seed.ts" + }, + "pkg": { + "scripts": "./src/dist/index.js", + "assets": [ + "./prisma/**/*", + "../proto/**/*" + ], + "targets": [ + "node18-macos-arm64", + "node18-linux-x64", + "node18-linux-arm64" + ], + "outputPath": "bin/" + } +} diff --git a/services/basket/pnpm-lock.yaml b/services/basket/pnpm-lock.yaml new file mode 100644 index 00000000..3afeb09a --- /dev/null +++ b/services/basket/pnpm-lock.yaml @@ -0,0 +1,2122 @@ +lockfileVersion: '6.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +dependencies: + '@grpc/grpc-js': + specifier: ^1.8.13 + version: 1.8.13 + '@grpc/proto-loader': + specifier: 0.7.6 + version: 0.7.6 + '@prisma/client': + specifier: 4.16.2 + version: 4.16.2(prisma@4.16.2) + amqplib: + specifier: ^0.10.3 + version: 0.10.3 + dotenv: + specifier: ^16.0.3 + version: 16.0.3 + ioredis: + specifier: 5.3.2 + version: 5.3.2 + prisma-redis-middleware: + specifier: 4.8.0 + version: 4.8.0 + protobufjs: + specifier: 7.2.2 + version: 7.2.2 + +devDependencies: + '@types/amqplib': + specifier: ^0.10.1 + version: 0.10.1 + '@types/node': + specifier: 18.15.9 + version: 18.15.9 + esbuild: + specifier: ^0.17.14 + version: 0.17.14 + nodemon: + specifier: ^2.0.22 + version: 2.0.22 + pkg: + specifier: ^5.8.1 + version: 5.8.1 + prisma: + specifier: 4.16.2 + version: 4.16.2 + ts-node: + specifier: 10.9.1 + version: 10.9.1(@types/node@18.15.9)(typescript@5.0.2) + tsconfig-paths: + specifier: ^4.1.2 + version: 4.1.2 + typescript: + specifier: 5.0.2 + version: 5.0.2 + vite-tsconfig-paths: + specifier: ^4.0.7 + version: 4.0.7(typescript@5.0.2) + vitest: + specifier: ^0.29.8 + version: 0.29.8 + +packages: + + /@acuminous/bitsyntax@0.1.2: + resolution: {integrity: sha512-29lUK80d1muEQqiUsSo+3A0yP6CdspgC95EnKBMi22Xlwt79i/En4Vr67+cXhU+cZjbti3TgGGC5wy1stIywVQ==} + engines: {node: '>=0.8'} + dependencies: + buffer-more-ints: 1.0.0 + debug: 4.3.4 + safe-buffer: 5.1.2 + transitivePeerDependencies: + - supports-color + dev: false + + /@babel/generator@7.18.2: + resolution: {integrity: sha512-W1lG5vUwFvfMd8HVXqdfbuG7RuaSrTCCD8cl8fP8wOivdbtbIg2Db3IWUcgvfxKbbn6ZBGYRW/Zk1MIwK49mgw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.19.0 + '@jridgewell/gen-mapping': 0.3.2 + jsesc: 2.5.2 + dev: true + + /@babel/helper-string-parser@7.19.4: + resolution: {integrity: sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helper-validator-identifier@7.19.1: + resolution: {integrity: sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/parser@7.18.4: + resolution: {integrity: sha512-FDge0dFazETFcxGw/EXzOkN8uJp0PC7Qbm+Pe9T+av2zlBpOgunFHkQPPn+eRuClU73JF+98D531UgayY89tow==} + engines: {node: '>=6.0.0'} + hasBin: true + dependencies: + '@babel/types': 7.19.0 + dev: true + + /@babel/types@7.19.0: + resolution: {integrity: sha512-YuGopBq3ke25BVSiS6fgF49Ul9gH1x70Bcr6bqRLjWCkcX8Hre1/5+z+IiWOIerRMSSEfGZVB9z9kyq7wVs9YA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-string-parser': 7.19.4 + '@babel/helper-validator-identifier': 7.19.1 + to-fast-properties: 2.0.0 + 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 + + /@esbuild/android-arm64@0.17.14: + resolution: {integrity: sha512-eLOpPO1RvtsP71afiFTvS7tVFShJBCT0txiv/xjFBo5a7R7Gjw7X0IgIaFoLKhqXYAXhahoXm7qAmRXhY4guJg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-arm@0.17.14: + resolution: {integrity: sha512-0CnlwnjDU8cks0yJLXfkaU/uoLyRf9VZJs4p1PskBr2AlAHeEsFEwJEo0of/Z3g+ilw5mpyDwThlxzNEIxOE4g==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-x64@0.17.14: + resolution: {integrity: sha512-nrfQYWBfLGfSGLvRVlt6xi63B5IbfHm3tZCdu/82zuFPQ7zez4XjmRtF/wIRYbJQ/DsZrxJdEvYFE67avYXyng==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-arm64@0.17.14: + resolution: {integrity: sha512-eoSjEuDsU1ROwgBH/c+fZzuSyJUVXQTOIN9xuLs9dE/9HbV/A5IqdXHU1p2OfIMwBwOYJ9SFVGGldxeRCUJFyw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-x64@0.17.14: + resolution: {integrity: sha512-zN0U8RWfrDttdFNkHqFYZtOH8hdi22z0pFm0aIJPsNC4QQZv7je8DWCX5iA4Zx6tRhS0CCc0XC2m7wKsbWEo5g==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-arm64@0.17.14: + resolution: {integrity: sha512-z0VcD4ibeZWVQCW1O7szaLxGsx54gcCnajEJMdYoYjLiq4g1jrP2lMq6pk71dbS5+7op/L2Aod+erw+EUr28/A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-x64@0.17.14: + resolution: {integrity: sha512-hd9mPcxfTgJlolrPlcXkQk9BMwNBvNBsVaUe5eNUqXut6weDQH8whcNaKNF2RO8NbpT6GY8rHOK2A9y++s+ehw==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm64@0.17.14: + resolution: {integrity: sha512-FhAMNYOq3Iblcj9i+K0l1Fp/MHt+zBeRu/Qkf0LtrcFu3T45jcwB6A1iMsemQ42vR3GBhjNZJZTaCe3VFPbn9g==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm@0.17.14: + resolution: {integrity: sha512-BNTl+wSJ1omsH8s3TkQmIIIQHwvwJrU9u1ggb9XU2KTVM4TmthRIVyxSp2qxROJHhZuW/r8fht46/QE8hU8Qvg==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ia32@0.17.14: + resolution: {integrity: sha512-91OK/lQ5y2v7AsmnFT+0EyxdPTNhov3y2CWMdizyMfxSxRqHazXdzgBKtlmkU2KYIc+9ZK3Vwp2KyXogEATYxQ==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-loong64@0.17.14: + resolution: {integrity: sha512-vp15H+5NR6hubNgMluqqKza85HcGJgq7t6rMH7O3Y6ApiOWPkvW2AJfNojUQimfTp6OUrACUXfR4hmpcENXoMQ==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-mips64el@0.17.14: + resolution: {integrity: sha512-90TOdFV7N+fgi6c2+GO9ochEkmm9kBAKnuD5e08GQMgMINOdOFHuYLPQ91RYVrnWwQ5683sJKuLi9l4SsbJ7Hg==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ppc64@0.17.14: + resolution: {integrity: sha512-NnBGeoqKkTugpBOBZZoktQQ1Yqb7aHKmHxsw43NddPB2YWLAlpb7THZIzsRsTr0Xw3nqiPxbA1H31ZMOG+VVPQ==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-riscv64@0.17.14: + resolution: {integrity: sha512-0qdlKScLXA8MGVy21JUKvMzCYWovctuP8KKqhtE5A6IVPq4onxXhSuhwDd2g5sRCzNDlDjitc5sX31BzDoL5Fw==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-s390x@0.17.14: + resolution: {integrity: sha512-Hdm2Jo1yaaOro4v3+6/zJk6ygCqIZuSDJHdHaf8nVH/tfOuoEX5Riv03Ka15LmQBYJObUTNS1UdyoMk0WUn9Ww==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-x64@0.17.14: + resolution: {integrity: sha512-8KHF17OstlK4DuzeF/KmSgzrTWQrkWj5boluiiq7kvJCiQVzUrmSkaBvcLB2UgHpKENO2i6BthPkmUhNDaJsVw==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/netbsd-x64@0.17.14: + resolution: {integrity: sha512-nVwpqvb3yyXztxIT2+VsxJhB5GCgzPdk1n0HHSnchRAcxqKO6ghXwHhJnr0j/B+5FSyEqSxF4q03rbA2fKXtUQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/openbsd-x64@0.17.14: + resolution: {integrity: sha512-1RZ7uQQ9zcy/GSAJL1xPdN7NDdOOtNEGiJalg/MOzeakZeTrgH/DoCkbq7TaPDiPhWqnDF+4bnydxRqQD7il6g==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/sunos-x64@0.17.14: + resolution: {integrity: sha512-nqMjDsFwv7vp7msrwWRysnM38Sd44PKmW8EzV01YzDBTcTWUpczQg6mGao9VLicXSgW/iookNK6AxeogNVNDZA==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-arm64@0.17.14: + resolution: {integrity: sha512-xrD0mccTKRBBIotrITV7WVQAwNJ5+1va6L0H9zN92v2yEdjfAN7864cUaZwJS7JPEs53bDTzKFbfqVlG2HhyKQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-ia32@0.17.14: + resolution: {integrity: sha512-nXpkz9bbJrLLyUTYtRotSS3t5b+FOuljg8LgLdINWFs3FfqZMtbnBCZFUmBzQPyxqU87F8Av+3Nco/M3hEcu1w==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-x64@0.17.14: + resolution: {integrity: sha512-gPQmsi2DKTaEgG14hc3CHXHp62k8g6qr0Pas+I4lUxRMugGSATh/Bi8Dgusoz9IQ0IfdrvLpco6kujEIBoaogA==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@grpc/grpc-js@1.8.13: + resolution: {integrity: sha512-iY3jsdfbc0ARoCLFvbvUB8optgyb0r1XLPb142u+QtgBcKJYkCIFt3Fd/881KqjLYWjsBJF57N3b8Eop9NDfUA==} + engines: {node: ^8.13.0 || >=10.10.0} + dependencies: + '@grpc/proto-loader': 0.7.6 + '@types/node': 18.15.9 + dev: false + + /@grpc/proto-loader@0.7.6: + resolution: {integrity: sha512-QyAXR8Hyh7uMDmveWxDSUcJr9NAWaZ2I6IXgAYvQmfflwouTM+rArE2eEaCtLlRqO81j7pRLCt81IefUei6Zbw==} + engines: {node: '>=6'} + hasBin: true + dependencies: + '@types/long': 4.0.2 + lodash.camelcase: 4.3.0 + long: 4.0.0 + protobufjs: 7.2.2 + yargs: 16.2.0 + dev: false + + /@ioredis/commands@1.2.0: + resolution: {integrity: sha512-Sx1pU8EM64o2BrqNpEO1CNLtKQwyhuXuqyfH7oGKCk+1a33d2r5saW8zNwm3j6BTExtjrv2BxTgzzkMwts6vGg==} + dev: false + + /@jridgewell/gen-mapping@0.3.2: + resolution: {integrity: sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/set-array': 1.1.2 + '@jridgewell/sourcemap-codec': 1.4.14 + '@jridgewell/trace-mapping': 0.3.9 + dev: true + + /@jridgewell/resolve-uri@3.1.0: + resolution: {integrity: sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==} + 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.14: + resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==} + dev: true + + /@jridgewell/trace-mapping@0.3.9: + resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} + dependencies: + '@jridgewell/resolve-uri': 3.1.0 + '@jridgewell/sourcemap-codec': 1.4.14 + dev: true + + /@nodelib/fs.scandir@2.1.5: + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + dev: true + + /@nodelib/fs.stat@2.0.5: + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + dev: true + + /@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: true + + /@prisma/client@4.16.2(prisma@4.16.2): + resolution: {integrity: sha512-qCoEyxv1ZrQ4bKy39GnylE8Zq31IRmm8bNhNbZx7bF2cU5aiCCnSa93J2imF88MBjn7J9eUQneNxUQVJdl/rPQ==} + engines: {node: '>=14.17'} + requiresBuild: true + peerDependencies: + prisma: '*' + peerDependenciesMeta: + prisma: + optional: true + dependencies: + '@prisma/engines-version': 4.16.1-1.4bc8b6e1b66cb932731fb1bdbbc550d1e010de81 + prisma: 4.16.2 + dev: false + + /@prisma/engines-version@4.16.1-1.4bc8b6e1b66cb932731fb1bdbbc550d1e010de81: + resolution: {integrity: sha512-q617EUWfRIDTriWADZ4YiWRZXCa/WuhNgLTVd+HqWLffjMSPzyM5uOWoauX91wvQClSKZU4pzI4JJLQ9Kl62Qg==} + dev: false + + /@prisma/engines@4.16.2: + resolution: {integrity: sha512-vx1nxVvN4QeT/cepQce68deh/Turxy5Mr+4L4zClFuK1GlxN3+ivxfuv+ej/gvidWn1cE1uAhW7ALLNlYbRUAw==} + requiresBuild: true + + /@protobufjs/aspromise@1.1.2: + resolution: {integrity: sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==} + dev: false + + /@protobufjs/base64@1.1.2: + resolution: {integrity: sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==} + dev: false + + /@protobufjs/codegen@2.0.4: + resolution: {integrity: sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==} + dev: false + + /@protobufjs/eventemitter@1.1.0: + resolution: {integrity: sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==} + dev: false + + /@protobufjs/fetch@1.1.0: + resolution: {integrity: sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==} + dependencies: + '@protobufjs/aspromise': 1.1.2 + '@protobufjs/inquire': 1.1.0 + dev: false + + /@protobufjs/float@1.0.2: + resolution: {integrity: sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==} + dev: false + + /@protobufjs/inquire@1.1.0: + resolution: {integrity: sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==} + dev: false + + /@protobufjs/path@1.1.2: + resolution: {integrity: sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==} + dev: false + + /@protobufjs/pool@1.1.0: + resolution: {integrity: sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==} + dev: false + + /@protobufjs/utf8@1.1.0: + resolution: {integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==} + 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.3: + resolution: {integrity: sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==} + dev: true + + /@types/amqplib@0.10.1: + resolution: {integrity: sha512-j6ANKT79ncUDnAs/+9r9eDujxbeJoTjoVu33gHHcaPfmLQaMhvfbH2GqSe8KUM444epAp1Vl3peVOQfZk3UIqA==} + dependencies: + '@types/node': 18.15.9 + dev: true + + /@types/chai-subset@1.3.3: + resolution: {integrity: sha512-frBecisrNGz+F4T6bcc+NLeolfiojh5FxW2klu669+8BARtyQv2C/GkNW6FUodVe4BroGMP/wER/YDGc7rEllw==} + dependencies: + '@types/chai': 4.3.4 + dev: true + + /@types/chai@4.3.4: + resolution: {integrity: sha512-KnRanxnpfpjUTqTCXslZSEdLfXExwgNxYPdiO2WGUj8+HDjFi8R3k5RVKPeSCzLjCcshCAtVO2QBbVuAV4kTnw==} + dev: true + + /@types/long@4.0.2: + resolution: {integrity: sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==} + dev: false + + /@types/node@18.15.9: + resolution: {integrity: sha512-dUxhiNzBLr6IqlZXz6e/rN2YQXlFgOei/Dxy+e3cyXTJ4txSUbGT2/fmnD6zd/75jDMeW5bDee+YXxlFKHoV0A==} + + /@vitest/expect@0.29.8: + resolution: {integrity: sha512-xlcVXn5I5oTq6NiZSY3ykyWixBxr5mG8HYtjvpgg6KaqHm0mvhX18xuwl5YGxIRNt/A5jidd7CWcNHrSvgaQqQ==} + dependencies: + '@vitest/spy': 0.29.8 + '@vitest/utils': 0.29.8 + chai: 4.3.7 + dev: true + + /@vitest/runner@0.29.8: + resolution: {integrity: sha512-FzdhnRDwEr/A3Oo1jtIk/B952BBvP32n1ObMEb23oEJNO+qO5cBet6M2XWIDQmA7BDKGKvmhUf2naXyp/2JEwQ==} + dependencies: + '@vitest/utils': 0.29.8 + p-limit: 4.0.0 + pathe: 1.1.0 + dev: true + + /@vitest/spy@0.29.8: + resolution: {integrity: sha512-VdjBe9w34vOMl5I5mYEzNX8inTxrZ+tYUVk9jxaZJmHFwmDFC/GV3KBFTA/JKswr3XHvZL+FE/yq5EVhb6pSAw==} + dependencies: + tinyspy: 1.1.1 + dev: true + + /@vitest/utils@0.29.8: + resolution: {integrity: sha512-qGzuf3vrTbnoY+RjjVVIBYfuWMjn3UMUqyQtdGNZ6ZIIyte7B37exj6LaVkrZiUTvzSadVvO/tJm8AEgbGCBPg==} + dependencies: + cli-truncate: 3.1.0 + diff: 5.1.0 + loupe: 2.3.6 + pretty-format: 27.5.1 + dev: true + + /abbrev@1.1.1: + resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} + dev: true + + /acorn-walk@8.2.0: + resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} + engines: {node: '>=0.4.0'} + dev: true + + /acorn@8.8.2: + resolution: {integrity: sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==} + engines: {node: '>=0.4.0'} + hasBin: true + dev: true + + /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 + dev: true + + /amqplib@0.10.3: + resolution: {integrity: sha512-UHmuSa7n8vVW/a5HGh2nFPqAEr8+cD4dEZ6u9GjP91nHfr1a54RyAKyra7Sb5NH7NBKOUlyQSMXIp0qAixKexw==} + engines: {node: '>=10'} + dependencies: + '@acuminous/bitsyntax': 0.1.2 + buffer-more-ints: 1.0.0 + readable-stream: 1.1.14 + url-parse: 1.5.10 + transitivePeerDependencies: + - supports-color + dev: false + + /ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + /ansi-regex@6.0.1: + resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} + engines: {node: '>=12'} + dev: true + + /ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + dependencies: + color-convert: 2.0.1 + + /ansi-styles@5.2.0: + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} + engines: {node: '>=10'} + dev: true + + /ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + dev: true + + /anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + dev: true + + /arg@4.1.3: + resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} + dev: true + + /array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + dev: true + + /assertion-error@1.1.0: + resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} + dev: true + + /async-cache-dedupe@1.12.0: + resolution: {integrity: sha512-LKumaBNhzvZrbrRi3DtIf0ETgjqcGOa/M2U+0DpTp8f+RzIiWubiQmBjuYUaihxetR3cWWC6hQj/uDVBuYajRA==} + dependencies: + mnemonist: 0.39.5 + safe-stable-stringify: 2.4.3 + dev: false + + /at-least-node@1.0.0: + resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} + engines: {node: '>= 4.0.0'} + dev: true + + /balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + dev: true + + /base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + dev: true + + /binary-extensions@2.2.0: + resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} + engines: {node: '>=8'} + dev: true + + /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: true + + /brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + dev: true + + /braces@3.0.2: + resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + engines: {node: '>=8'} + dependencies: + fill-range: 7.0.1 + dev: true + + /buffer-more-ints@1.0.0: + resolution: {integrity: sha512-EMetuGFz5SLsT0QTnXzINh4Ksr+oo4i+UGTXEshiGCQWnsgSs7ZhJ8fzlwQ+OzEMs0MpDAMr1hxnblp5a4vcHg==} + dev: false + + /buffer@5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + dev: true + + /cac@6.7.14: + resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} + engines: {node: '>=8'} + dev: true + + /chai@4.3.7: + resolution: {integrity: sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==} + engines: {node: '>=4'} + dependencies: + assertion-error: 1.1.0 + check-error: 1.0.2 + deep-eql: 4.1.3 + get-func-name: 2.0.0 + loupe: 2.3.6 + pathval: 1.1.1 + type-detect: 4.0.8 + dev: true + + /chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + dev: true + + /check-error@1.0.2: + resolution: {integrity: sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==} + dev: true + + /chokidar@3.5.3: + resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} + engines: {node: '>= 8.10.0'} + dependencies: + anymatch: 3.1.3 + braces: 3.0.2 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.2 + dev: true + + /chownr@1.1.4: + resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} + dev: true + + /cli-truncate@3.1.0: + resolution: {integrity: sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + slice-ansi: 5.0.0 + string-width: 5.1.2 + dev: true + + /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 + + /cluster-key-slot@1.1.2: + resolution: {integrity: sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==} + engines: {node: '>=0.10.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 + + /color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + /concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + dev: true + + /core-util-is@1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + + /create-require@1.1.1: + resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} + dev: true + + /debug@3.2.7(supports-color@5.5.0): + resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.3 + supports-color: 5.5.0 + dev: true + + /debug@4.3.4: + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.2 + + /decompress-response@6.0.0: + resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} + engines: {node: '>=10'} + dependencies: + mimic-response: 3.1.0 + dev: true + + /deep-eql@4.1.3: + resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==} + engines: {node: '>=6'} + dependencies: + type-detect: 4.0.8 + dev: true + + /deep-extend@0.6.0: + resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} + engines: {node: '>=4.0.0'} + dev: true + + /denque@2.1.0: + resolution: {integrity: sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==} + engines: {node: '>=0.10'} + dev: false + + /detect-libc@2.0.1: + resolution: {integrity: sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==} + engines: {node: '>=8'} + dev: true + + /diff@4.0.2: + resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} + engines: {node: '>=0.3.1'} + dev: true + + /diff@5.1.0: + resolution: {integrity: sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==} + 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 + dev: true + + /dotenv@16.0.3: + resolution: {integrity: sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==} + engines: {node: '>=12'} + dev: false + + /eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + dev: true + + /emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + /emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + dev: true + + /end-of-stream@1.4.4: + resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + dependencies: + once: 1.4.0 + dev: true + + /esbuild@0.17.14: + resolution: {integrity: sha512-vOO5XhmVj/1XQR9NQ1UPq6qvMYL7QFJU57J5fKBKBKxp17uDt5PgxFDb4A2nEiXhr1qQs4x0F5+66hVVw4ruNw==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/android-arm': 0.17.14 + '@esbuild/android-arm64': 0.17.14 + '@esbuild/android-x64': 0.17.14 + '@esbuild/darwin-arm64': 0.17.14 + '@esbuild/darwin-x64': 0.17.14 + '@esbuild/freebsd-arm64': 0.17.14 + '@esbuild/freebsd-x64': 0.17.14 + '@esbuild/linux-arm': 0.17.14 + '@esbuild/linux-arm64': 0.17.14 + '@esbuild/linux-ia32': 0.17.14 + '@esbuild/linux-loong64': 0.17.14 + '@esbuild/linux-mips64el': 0.17.14 + '@esbuild/linux-ppc64': 0.17.14 + '@esbuild/linux-riscv64': 0.17.14 + '@esbuild/linux-s390x': 0.17.14 + '@esbuild/linux-x64': 0.17.14 + '@esbuild/netbsd-x64': 0.17.14 + '@esbuild/openbsd-x64': 0.17.14 + '@esbuild/sunos-x64': 0.17.14 + '@esbuild/win32-arm64': 0.17.14 + '@esbuild/win32-ia32': 0.17.14 + '@esbuild/win32-x64': 0.17.14 + dev: true + + /escalade@3.1.1: + resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} + engines: {node: '>=6'} + + /expand-template@2.0.3: + resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} + engines: {node: '>=6'} + dev: true + + /fast-glob@3.2.12: + resolution: {integrity: sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==} + 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: true + + /fastq@1.15.0: + resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} + dependencies: + reusify: 1.0.4 + dev: true + + /fill-range@7.0.1: + resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} + engines: {node: '>=8'} + dependencies: + to-regex-range: 5.0.1 + dev: true + + /from2@2.3.0: + resolution: {integrity: sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==} + dependencies: + inherits: 2.0.4 + readable-stream: 2.3.8 + dev: true + + /fs-constants@1.0.0: + resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} + dev: true + + /fs-extra@9.1.0: + resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==} + engines: {node: '>=10'} + dependencies: + at-least-node: 1.0.0 + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.0 + dev: true + + /fsevents@2.3.2: + resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /function-bind@1.1.1: + resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} + dev: true + + /get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + + /get-func-name@2.0.0: + resolution: {integrity: sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==} + dev: true + + /github-from-package@0.0.0: + resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==} + dev: true + + /glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + dependencies: + is-glob: 4.0.3 + 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.2.12 + ignore: 5.2.4 + merge2: 1.4.1 + slash: 3.0.0 + dev: true + + /globrex@0.1.2: + resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} + dev: true + + /graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + dev: true + + /has-flag@3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + dev: true + + /has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + dev: true + + /has@1.0.3: + resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} + engines: {node: '>= 0.4.0'} + dependencies: + function-bind: 1.1.1 + dev: true + + /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 + dev: true + + /ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + dev: true + + /ignore-by-default@1.0.1: + resolution: {integrity: sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==} + dev: true + + /ignore@5.2.4: + resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} + engines: {node: '>= 4'} + dev: true + + /inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + /ini@1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + dev: true + + /into-stream@6.0.0: + resolution: {integrity: sha512-XHbaOAvP+uFKUFsOgoNPRjLkwB+I22JFPFe5OjTkQ0nwgj6+pSjb4NmB6VMxaPshLiOf+zcpOCBQuLwC1KHhZA==} + engines: {node: '>=10'} + dependencies: + from2: 2.3.0 + p-is-promise: 3.0.0 + dev: true + + /ioredis@5.3.2: + resolution: {integrity: sha512-1DKMMzlIHM02eBBVOFQ1+AolGjs6+xEcM4PDL7NqOS6szq7H9jSaEkIUH6/a5Hl241LzW6JLSiAbNvTQjUupUA==} + engines: {node: '>=12.22.0'} + dependencies: + '@ioredis/commands': 1.2.0 + cluster-key-slot: 1.1.2 + debug: 4.3.4 + denque: 2.1.0 + lodash.defaults: 4.2.0 + lodash.isarguments: 3.1.0 + redis-errors: 1.2.0 + redis-parser: 3.0.0 + standard-as-callback: 2.1.0 + transitivePeerDependencies: + - supports-color + dev: false + + /is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + dependencies: + binary-extensions: 2.2.0 + dev: true + + /is-core-module@2.9.0: + resolution: {integrity: sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==} + dependencies: + has: 1.0.3 + dev: true + + /is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + dev: true + + /is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + /is-fullwidth-code-point@4.0.0: + resolution: {integrity: sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==} + engines: {node: '>=12'} + dev: true + + /is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + dependencies: + is-extglob: 2.1.1 + dev: true + + /is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + dev: true + + /isarray@0.0.1: + resolution: {integrity: sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==} + dev: false + + /isarray@1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + dev: true + + /jsesc@2.5.2: + resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} + engines: {node: '>=4'} + hasBin: true + dev: true + + /json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + dev: true + + /jsonc-parser@3.2.0: + resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} + dev: true + + /jsonfile@6.1.0: + resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + dependencies: + universalify: 2.0.0 + optionalDependencies: + graceful-fs: 4.2.11 + dev: true + + /local-pkg@0.4.3: + resolution: {integrity: sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==} + engines: {node: '>=14'} + dev: true + + /lodash.camelcase@4.3.0: + resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} + dev: false + + /lodash.defaults@4.2.0: + resolution: {integrity: sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==} + dev: false + + /lodash.isarguments@3.1.0: + resolution: {integrity: sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==} + dev: false + + /long@4.0.0: + resolution: {integrity: sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==} + dev: false + + /long@5.2.1: + resolution: {integrity: sha512-GKSNGeNAtw8IryjjkhZxuKB3JzlcLTwjtiQCHKvqQet81I93kXslhDQruGI/QsddO83mcDToBVy7GqGS/zYf/A==} + dev: false + + /loupe@2.3.6: + resolution: {integrity: sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==} + dependencies: + get-func-name: 2.0.0 + dev: true + + /lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + dependencies: + yallist: 4.0.0 + dev: true + + /make-error@1.3.6: + resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + dev: true + + /merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + dev: true + + /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: true + + /mimic-response@3.1.0: + resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} + engines: {node: '>=10'} + dev: true + + /minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + dependencies: + brace-expansion: 1.1.11 + dev: true + + /minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + dev: true + + /mkdirp-classic@0.5.3: + resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} + dev: true + + /mlly@1.2.0: + resolution: {integrity: sha512-+c7A3CV0KGdKcylsI6khWyts/CYrGTrRVo4R/I7u/cUsy0Conxa6LUhiEzVKIw14lc2L5aiO4+SeVe4TeGRKww==} + dependencies: + acorn: 8.8.2 + pathe: 1.1.0 + pkg-types: 1.0.2 + ufo: 1.1.1 + dev: true + + /mnemonist@0.39.5: + resolution: {integrity: sha512-FPUtkhtJ0efmEFGpU14x7jGbTB+s18LrzRL2KgoWz9YvcY3cPomz8tih01GbHwnGk/OmkOKfqd/RAQoc8Lm7DQ==} + dependencies: + obliterator: 2.0.4 + dev: false + + /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: true + + /multistream@4.1.0: + resolution: {integrity: sha512-J1XDiAmmNpRCBfIWJv+n0ymC4ABcf/Pl+5YvC5B/D2f/2+8PtHvCNxMPKiQcZyi922Hq69J2YOpb1pTywfifyw==} + dependencies: + once: 1.4.0 + readable-stream: 3.6.2 + dev: true + + /nanoid@3.3.6: + resolution: {integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + dev: true + + /napi-build-utils@1.0.2: + resolution: {integrity: sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==} + dev: true + + /node-abi@3.33.0: + resolution: {integrity: sha512-7GGVawqyHF4pfd0YFybhv/eM9JwTtPqx0mAanQ146O3FlSh3pA24zf9IRQTOsfTSqXTNzPSP5iagAJ94jjuVog==} + engines: {node: '>=10'} + dependencies: + semver: 7.3.8 + dev: true + + /node-fetch@2.6.9: + resolution: {integrity: sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + dependencies: + whatwg-url: 5.0.0 + dev: true + + /nodemon@2.0.22: + resolution: {integrity: sha512-B8YqaKMmyuCO7BowF1Z1/mkPqLk6cs/l63Ojtd6otKjMx47Dq1utxfRxcavH1I7VSaL8n5BUaoutadnsX3AAVQ==} + engines: {node: '>=8.10.0'} + hasBin: true + dependencies: + chokidar: 3.5.3 + debug: 3.2.7(supports-color@5.5.0) + ignore-by-default: 1.0.1 + minimatch: 3.1.2 + pstree.remy: 1.1.8 + semver: 5.7.1 + simple-update-notifier: 1.1.0 + supports-color: 5.5.0 + touch: 3.1.0 + undefsafe: 2.0.5 + dev: true + + /nopt@1.0.10: + resolution: {integrity: sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==} + hasBin: true + dependencies: + abbrev: 1.1.1 + dev: true + + /normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + dev: true + + /obliterator@2.0.4: + resolution: {integrity: sha512-lgHwxlxV1qIg1Eap7LgIeoBWIMFibOjbrYPIPJZcI1mmGAI2m3lNYpK12Y+GBdPQ0U1hRwSord7GIaawz962qQ==} + dev: false + + /once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + dependencies: + wrappy: 1.0.2 + dev: true + + /p-is-promise@3.0.0: + resolution: {integrity: sha512-Wo8VsW4IRQSKVXsJCn7TomUaVtyfjVDn3nUP7kE967BQk0CwFpdbZs0X0uk5sW9mkBa9eNM7hCMaG93WUAwxYQ==} + engines: {node: '>=8'} + dev: true + + /p-limit@4.0.0: + resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + yocto-queue: 1.0.0 + dev: true + + /path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + dev: true + + /path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + dev: true + + /pathe@1.1.0: + resolution: {integrity: sha512-ODbEPR0KKHqECXW1GoxdDb+AZvULmXjVPy4rt+pGo2+TnjJTIPJQSVS6N63n8T2Ip+syHhbn52OewKicV0373w==} + dev: true + + /pathval@1.1.1: + resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} + dev: true + + /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'} + dev: true + + /pkg-fetch@3.4.2: + resolution: {integrity: sha512-0+uijmzYcnhC0hStDjm/cl2VYdrmVVBpe7Q8k9YBojxmR5tG8mvR9/nooQq3QSXiQqORDVOTY3XqMEqJVIzkHA==} + hasBin: true + dependencies: + chalk: 4.1.2 + fs-extra: 9.1.0 + https-proxy-agent: 5.0.1 + node-fetch: 2.6.9 + progress: 2.0.3 + semver: 7.3.8 + tar-fs: 2.1.1 + yargs: 16.2.0 + transitivePeerDependencies: + - encoding + - supports-color + dev: true + + /pkg-types@1.0.2: + resolution: {integrity: sha512-hM58GKXOcj8WTqUXnsQyJYXdeAPbythQgEF3nTcEo+nkD49chjQ9IKm/QJy9xf6JakXptz86h7ecP2024rrLaQ==} + dependencies: + jsonc-parser: 3.2.0 + mlly: 1.2.0 + pathe: 1.1.0 + dev: true + + /pkg@5.8.1: + resolution: {integrity: sha512-CjBWtFStCfIiT4Bde9QpJy0KeH19jCfwZRJqHFDFXfhUklCx8JoFmMj3wgnEYIwGmZVNkhsStPHEOnrtrQhEXA==} + hasBin: true + peerDependencies: + node-notifier: '>=9.0.1' + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@babel/generator': 7.18.2 + '@babel/parser': 7.18.4 + '@babel/types': 7.19.0 + chalk: 4.1.2 + fs-extra: 9.1.0 + globby: 11.1.0 + into-stream: 6.0.0 + is-core-module: 2.9.0 + minimist: 1.2.8 + multistream: 4.1.0 + pkg-fetch: 3.4.2 + prebuild-install: 7.1.1 + resolve: 1.22.1 + stream-meter: 1.0.4 + transitivePeerDependencies: + - encoding + - supports-color + dev: true + + /postcss@8.4.21: + resolution: {integrity: sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==} + engines: {node: ^10 || ^12 || >=14} + dependencies: + nanoid: 3.3.6 + picocolors: 1.0.0 + source-map-js: 1.0.2 + dev: true + + /prebuild-install@7.1.1: + resolution: {integrity: sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==} + engines: {node: '>=10'} + hasBin: true + dependencies: + detect-libc: 2.0.1 + expand-template: 2.0.3 + github-from-package: 0.0.0 + minimist: 1.2.8 + mkdirp-classic: 0.5.3 + napi-build-utils: 1.0.2 + node-abi: 3.33.0 + pump: 3.0.0 + rc: 1.2.8 + simple-get: 4.0.1 + tar-fs: 2.1.1 + tunnel-agent: 0.6.0 + dev: true + + /pretty-format@27.5.1: + resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + ansi-regex: 5.0.1 + ansi-styles: 5.2.0 + react-is: 17.0.2 + dev: true + + /prisma-redis-middleware@4.8.0: + resolution: {integrity: sha512-d1B7TVLiR8aSiOY2GPKKDb5EWGTK+EmlIkztAZCPWxs4/IHGfIAZiDoLklp6CcK+5ckjcaJq8aWE5AjRJ3+Rpg==} + engines: {node: ^16.x || ^18.x, npm: ^7.x || ^8.x || ^9.x} + dependencies: + async-cache-dedupe: 1.12.0 + ioredis: 5.3.2 + transitivePeerDependencies: + - supports-color + dev: false + + /prisma@4.16.2: + resolution: {integrity: sha512-SYCsBvDf0/7XSJyf2cHTLjLeTLVXYfqp7pG5eEVafFLeT0u/hLFz/9W196nDRGUOo1JfPatAEb+uEnTQImQC1g==} + engines: {node: '>=14.17'} + hasBin: true + requiresBuild: true + dependencies: + '@prisma/engines': 4.16.2 + + /process-nextick-args@2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + dev: true + + /progress@2.0.3: + resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} + engines: {node: '>=0.4.0'} + dev: true + + /protobufjs@7.2.2: + resolution: {integrity: sha512-++PrQIjrom+bFDPpfmqXfAGSQs40116JRrqqyf53dymUMvvb5d/LMRyicRoF1AUKoXVS1/IgJXlEgcpr4gTF3Q==} + engines: {node: '>=12.0.0'} + requiresBuild: true + dependencies: + '@protobufjs/aspromise': 1.1.2 + '@protobufjs/base64': 1.1.2 + '@protobufjs/codegen': 2.0.4 + '@protobufjs/eventemitter': 1.1.0 + '@protobufjs/fetch': 1.1.0 + '@protobufjs/float': 1.0.2 + '@protobufjs/inquire': 1.1.0 + '@protobufjs/path': 1.1.2 + '@protobufjs/pool': 1.1.0 + '@protobufjs/utf8': 1.1.0 + '@types/node': 18.15.9 + long: 5.2.1 + dev: false + + /pstree.remy@1.1.8: + resolution: {integrity: sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==} + dev: true + + /pump@3.0.0: + resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} + dependencies: + end-of-stream: 1.4.4 + once: 1.4.0 + dev: true + + /querystringify@2.2.0: + resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} + dev: false + + /queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + dev: true + + /rc@1.2.8: + resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} + hasBin: true + dependencies: + deep-extend: 0.6.0 + ini: 1.3.8 + minimist: 1.2.8 + strip-json-comments: 2.0.1 + dev: true + + /react-is@17.0.2: + resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} + dev: true + + /readable-stream@1.1.14: + resolution: {integrity: sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==} + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 0.0.1 + string_decoder: 0.10.31 + dev: false + + /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: true + + /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: true + + /readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + dependencies: + picomatch: 2.3.1 + dev: true + + /redis-errors@1.2.0: + resolution: {integrity: sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w==} + engines: {node: '>=4'} + dev: false + + /redis-parser@3.0.0: + resolution: {integrity: sha512-DJnGAeenTdpMEH6uAJRK/uiyEIH9WVsUmoLwzudwGJUwZPp80PDBWPHXSAGNPwNvIXAbe7MSUB1zQFugFml66A==} + engines: {node: '>=4'} + dependencies: + redis-errors: 1.2.0 + dev: false + + /require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + + /requires-port@1.0.0: + resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} + dev: false + + /resolve@1.22.1: + resolution: {integrity: sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==} + hasBin: true + dependencies: + is-core-module: 2.9.0 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + dev: true + + /reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + dev: true + + /rollup@3.20.2: + resolution: {integrity: sha512-3zwkBQl7Ai7MFYQE0y1MeQ15+9jsi7XxfrqwTb/9EK8D9C9+//EBR4M+CuA1KODRaNbFez/lWxA5vhEGZp4MUg==} + engines: {node: '>=14.18.0', npm: '>=8.0.0'} + hasBin: true + optionalDependencies: + fsevents: 2.3.2 + dev: true + + /run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + dependencies: + queue-microtask: 1.2.3 + dev: true + + /safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + + /safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + dev: true + + /safe-stable-stringify@2.4.3: + resolution: {integrity: sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==} + engines: {node: '>=10'} + dev: false + + /semver@5.7.1: + resolution: {integrity: sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==} + hasBin: true + dev: true + + /semver@7.0.0: + resolution: {integrity: sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==} + hasBin: true + dev: true + + /semver@7.3.8: + resolution: {integrity: sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==} + engines: {node: '>=10'} + hasBin: true + dependencies: + lru-cache: 6.0.0 + dev: true + + /siginfo@2.0.0: + resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} + dev: true + + /simple-concat@1.0.1: + resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} + dev: true + + /simple-get@4.0.1: + resolution: {integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==} + dependencies: + decompress-response: 6.0.0 + once: 1.4.0 + simple-concat: 1.0.1 + dev: true + + /simple-update-notifier@1.1.0: + resolution: {integrity: sha512-VpsrsJSUcJEseSbMHkrsrAVSdvVS5I96Qo1QAQ4FxQ9wXFcB+pjj7FB7/us9+GcgfW4ziHtYMc1J0PLczb55mg==} + engines: {node: '>=8.10.0'} + dependencies: + semver: 7.0.0 + dev: true + + /slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + dev: true + + /slice-ansi@5.0.0: + resolution: {integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==} + engines: {node: '>=12'} + dependencies: + ansi-styles: 6.2.1 + is-fullwidth-code-point: 4.0.0 + dev: true + + /source-map-js@1.0.2: + resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} + engines: {node: '>=0.10.0'} + dev: true + + /source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + dev: true + + /stackback@0.0.2: + resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + dev: true + + /standard-as-callback@2.1.0: + resolution: {integrity: sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A==} + dev: false + + /std-env@3.3.2: + resolution: {integrity: sha512-uUZI65yrV2Qva5gqE0+A7uVAvO40iPo6jGhs7s8keRfHCmtg+uB2X6EiLGCI9IgL1J17xGhvoOqSz79lzICPTA==} + dev: true + + /stream-meter@1.0.4: + resolution: {integrity: sha512-4sOEtrbgFotXwnEuzzsQBYEV1elAeFSO8rSGeTwabuX1RRn/kEq9JVH7I0MRBhKVRR0sJkr0M0QCH7yOLf9fhQ==} + dependencies: + readable-stream: 2.3.8 + 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.0.1 + dev: true + + /string_decoder@0.10.31: + resolution: {integrity: sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==} + dev: false + + /string_decoder@1.1.1: + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + dependencies: + safe-buffer: 5.1.2 + dev: true + + /string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + dependencies: + safe-buffer: 5.2.1 + dev: true + + /strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + dependencies: + ansi-regex: 5.0.1 + + /strip-ansi@7.0.1: + resolution: {integrity: sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==} + engines: {node: '>=12'} + dependencies: + ansi-regex: 6.0.1 + dev: true + + /strip-bom@3.0.0: + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} + dev: true + + /strip-json-comments@2.0.1: + resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} + engines: {node: '>=0.10.0'} + dev: true + + /strip-literal@1.0.1: + resolution: {integrity: sha512-QZTsipNpa2Ppr6v1AmJHESqJ3Uz247MUS0OjrnnZjFAvEoWqxuyFuXn2xLgMtRnijJShAa1HL0gtJyUs7u7n3Q==} + dependencies: + acorn: 8.8.2 + dev: true + + /supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + dependencies: + has-flag: 3.0.0 + dev: true + + /supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + dependencies: + has-flag: 4.0.0 + dev: true + + /supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + dev: true + + /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: true + + /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: true + + /tinybench@2.4.0: + resolution: {integrity: sha512-iyziEiyFxX4kyxSp+MtY1oCH/lvjH3PxFN8PGCDeqcZWAJ/i+9y+nL85w99PxVzrIvew/GSkSbDYtiGVa85Afg==} + dev: true + + /tinypool@0.4.0: + resolution: {integrity: sha512-2ksntHOKf893wSAH4z/+JbPpi92esw8Gn9N2deXX+B0EO92hexAVI9GIZZPx7P5aYo5KULfeOSt3kMOmSOy6uA==} + engines: {node: '>=14.0.0'} + dev: true + + /tinyspy@1.1.1: + resolution: {integrity: sha512-UVq5AXt/gQlti7oxoIg5oi/9r0WpF7DGEVwXgqWSMmyN16+e3tl5lIvTaOpJ3TAtu5xFzWccFRM4R5NaWHF+4g==} + engines: {node: '>=14.0.0'} + 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 + dev: true + + /touch@3.1.0: + resolution: {integrity: sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==} + hasBin: true + dependencies: + nopt: 1.0.10 + dev: true + + /tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + dev: true + + /ts-node@10.9.1(@types/node@18.15.9)(typescript@5.0.2): + 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.3 + '@types/node': 18.15.9 + acorn: 8.8.2 + 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.0.2 + v8-compile-cache-lib: 3.0.1 + yn: 3.1.1 + dev: true + + /tsconfck@2.1.1(typescript@5.0.2): + resolution: {integrity: sha512-ZPCkJBKASZBmBUNqGHmRhdhM8pJYDdOXp4nRgj/O0JwUwsMq50lCDRQP/M5GBNAA0elPrq4gAeu4dkaVCuKWww==} + engines: {node: ^14.13.1 || ^16 || >=18} + hasBin: true + peerDependencies: + typescript: ^4.3.5 || ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + dependencies: + typescript: 5.0.2 + dev: true + + /tsconfig-paths@4.1.2: + resolution: {integrity: sha512-uhxiMgnXQp1IR622dUXI+9Ehnws7i/y6xvpZB9IbUVOPy0muvdvgXeZOn88UcGPiT98Vp3rJPTa8bFoalZ3Qhw==} + engines: {node: '>=6'} + dependencies: + json5: 2.2.3 + minimist: 1.2.8 + strip-bom: 3.0.0 + dev: true + + /tunnel-agent@0.6.0: + resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} + dependencies: + safe-buffer: 5.2.1 + dev: true + + /type-detect@4.0.8: + resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} + engines: {node: '>=4'} + dev: true + + /typescript@5.0.2: + resolution: {integrity: sha512-wVORMBGO/FAs/++blGNeAVdbNKtIh1rbBL2EyQ1+J9lClJ93KiiKe8PmFIVdXhHcyv44SL9oglmfeSsndo0jRw==} + engines: {node: '>=12.20'} + hasBin: true + dev: true + + /ufo@1.1.1: + resolution: {integrity: sha512-MvlCc4GHrmZdAllBc0iUDowff36Q9Ndw/UzqmEKyrfSzokTd9ZCy1i+IIk5hrYKkjoYVQyNbrw7/F8XJ2rEwTg==} + dev: true + + /undefsafe@2.0.5: + resolution: {integrity: sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==} + dev: true + + /universalify@2.0.0: + resolution: {integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==} + engines: {node: '>= 10.0.0'} + dev: true + + /url-parse@1.5.10: + resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} + dependencies: + querystringify: 2.2.0 + requires-port: 1.0.0 + dev: false + + /util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + dev: true + + /v8-compile-cache-lib@3.0.1: + resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} + dev: true + + /vite-node@0.29.8(@types/node@18.15.9): + resolution: {integrity: sha512-b6OtCXfk65L6SElVM20q5G546yu10/kNrhg08afEoWlFRJXFq9/6glsvSVY+aI6YeC1tu2TtAqI2jHEQmOmsFw==} + engines: {node: '>=v14.16.0'} + hasBin: true + dependencies: + cac: 6.7.14 + debug: 4.3.4 + mlly: 1.2.0 + pathe: 1.1.0 + picocolors: 1.0.0 + vite: 4.2.1(@types/node@18.15.9) + transitivePeerDependencies: + - '@types/node' + - less + - sass + - stylus + - sugarss + - supports-color + - terser + dev: true + + /vite-tsconfig-paths@4.0.7(typescript@5.0.2): + resolution: {integrity: sha512-MwIYaby6kcbQGZqMH+gAK6h0UYQGOkjsuAgw4q6bP/5vWkn8VKvnmLuCQHA2+IzHAJHnE8OFTO4lnJLFMf9+7Q==} + peerDependencies: + vite: '*' + peerDependenciesMeta: + vite: + optional: true + dependencies: + debug: 4.3.4 + globrex: 0.1.2 + tsconfck: 2.1.1(typescript@5.0.2) + transitivePeerDependencies: + - supports-color + - typescript + dev: true + + /vite@4.2.1(@types/node@18.15.9): + resolution: {integrity: sha512-7MKhqdy0ISo4wnvwtqZkjke6XN4taqQ2TBaTccLIpOKv7Vp2h4Y+NpmWCnGDeSvvn45KxvWgGyb0MkHvY1vgbg==} + engines: {node: ^14.18.0 || >=16.0.0} + hasBin: true + peerDependencies: + '@types/node': '>= 14' + less: '*' + sass: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + dependencies: + '@types/node': 18.15.9 + esbuild: 0.17.14 + postcss: 8.4.21 + resolve: 1.22.1 + rollup: 3.20.2 + optionalDependencies: + fsevents: 2.3.2 + dev: true + + /vitest@0.29.8: + resolution: {integrity: sha512-JIAVi2GK5cvA6awGpH0HvH/gEG9PZ0a/WoxdiV3PmqK+3CjQMf8c+J/Vhv4mdZ2nRyXFw66sAg6qz7VNkaHfDQ==} + engines: {node: '>=v14.16.0'} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@vitest/browser': '*' + '@vitest/ui': '*' + happy-dom: '*' + jsdom: '*' + playwright: '*' + safaridriver: '*' + webdriverio: '*' + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@vitest/browser': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true + playwright: + optional: true + safaridriver: + optional: true + webdriverio: + optional: true + dependencies: + '@types/chai': 4.3.4 + '@types/chai-subset': 1.3.3 + '@types/node': 18.15.9 + '@vitest/expect': 0.29.8 + '@vitest/runner': 0.29.8 + '@vitest/spy': 0.29.8 + '@vitest/utils': 0.29.8 + acorn: 8.8.2 + acorn-walk: 8.2.0 + cac: 6.7.14 + chai: 4.3.7 + debug: 4.3.4 + local-pkg: 0.4.3 + pathe: 1.1.0 + picocolors: 1.0.0 + source-map: 0.6.1 + std-env: 3.3.2 + strip-literal: 1.0.1 + tinybench: 2.4.0 + tinypool: 0.4.0 + tinyspy: 1.1.1 + vite: 4.2.1(@types/node@18.15.9) + vite-node: 0.29.8(@types/node@18.15.9) + why-is-node-running: 2.2.2 + transitivePeerDependencies: + - less + - sass + - stylus + - sugarss + - supports-color + - terser + dev: true + + /webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + dev: true + + /whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + 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'} + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + /wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + dev: true + + /y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + + /yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + dev: true + + /yargs-parser@20.2.9: + resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} + engines: {node: '>=10'} + + /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 + + /yn@3.1.1: + resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} + engines: {node: '>=6'} + dev: true + + /yocto-queue@1.0.0: + resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} + engines: {node: '>=12.20'} + dev: true diff --git a/services/basket/tsconfig.json b/services/basket/tsconfig.json new file mode 100755 index 00000000..867d418d --- /dev/null +++ b/services/basket/tsconfig.json @@ -0,0 +1,18 @@ +{ + "compilerOptions": { + "sourceMap": true, + "outDir": "dist", + "strict": true, + "lib": ["esnext"], + "esModuleInterop": true, + "baseUrl": ".", + "paths": { + "@basket/*": ["src/*"] + } + }, + "include": ["src/**/*.ts"], + "exclude": ["node_modules"], + "ts-node": { + "require": ["tsconfig-paths/register"] + } +} diff --git a/services/basket/vitest.config.ts b/services/basket/vitest.config.ts new file mode 100644 index 00000000..08cfe3bf --- /dev/null +++ b/services/basket/vitest.config.ts @@ -0,0 +1,7 @@ +import { defineConfig } from "vitest/config"; +import tsconfigPaths from "vite-tsconfig-paths"; + +export default defineConfig({ + plugins: [tsconfigPaths()], + base: "/src/tests", +}); From 795f69c8564f4e3e451b1c60866a3685e8e2cffe Mon Sep 17 00:00:00 2001 From: anatole Date: Mon, 14 Aug 2023 01:39:03 +0200 Subject: [PATCH 358/883] feat(service): create the basket proto --- services/proto/basket.proto | 46 +++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 services/proto/basket.proto diff --git a/services/proto/basket.proto b/services/proto/basket.proto new file mode 100644 index 00000000..bd848f41 --- /dev/null +++ b/services/proto/basket.proto @@ -0,0 +1,46 @@ +syntax = "proto3"; + +package com.goodfood.basket; + +// The Basket service definition. +service BasketService { + // Sends a greeting + rpc GetBasket (UserId) returns (Basket); + rpc AddProduct (AddProductRequest) returns (Basket); + rpc DeleteProduct (DeleteProductRequest) returns (Basket); + rpc Reset (UserId) returns (Basket); + rpc SetRestaurant (RestaurantId) returns (Basket); +} + +message UserId { + uint64 id = 1; +} + +message RestaurantId { + uint64 id = 1; +} + +message Basket { + string message = 1; +} +message AddProductRequest { + uint64 user_id = 1; + Product product = 2; +} + +message DeleteProductRequest { + uint64 user_id = 1; + string product_id = 2; +} +message Product { + string id = 1; + string name = 2; + string image = 3; + string comment = 4; + int32 price = 5; + string preparation = 6; + string weight = 7; + string kilocalories = 8; + int32 nutriscore = 9; + int32 restaurant_id = 10; +} \ No newline at end of file From 6841a9d04a5df942075c1ac85f90b3bd5feb5fe5 Mon Sep 17 00:00:00 2001 From: anatole Date: Mon, 14 Aug 2023 01:42:20 +0200 Subject: [PATCH 359/883] feat(basket): add proto folder link --- services/basket/proto | 1 + 1 file changed, 1 insertion(+) create mode 120000 services/basket/proto diff --git a/services/basket/proto b/services/basket/proto new file mode 120000 index 00000000..4d1e2d8b --- /dev/null +++ b/services/basket/proto @@ -0,0 +1 @@ +../proto/ \ No newline at end of file From bae9fad1e7e954f430da30325bcaeff01a358bac Mon Sep 17 00:00:00 2001 From: anatole Date: Mon, 14 Aug 2023 16:34:13 +0200 Subject: [PATCH 360/883] feat(proto): update the basket proto --- services/proto/basket.proto | 27 ++++++--------------------- 1 file changed, 6 insertions(+), 21 deletions(-) diff --git a/services/proto/basket.proto b/services/proto/basket.proto index bd848f41..3ac753f8 100644 --- a/services/proto/basket.proto +++ b/services/proto/basket.proto @@ -4,10 +4,9 @@ package com.goodfood.basket; // The Basket service definition. service BasketService { - // Sends a greeting rpc GetBasket (UserId) returns (Basket); - rpc AddProduct (AddProductRequest) returns (Basket); - rpc DeleteProduct (DeleteProductRequest) returns (Basket); + rpc AddProduct (ProductRequest) returns (Basket); + rpc DeleteProduct (ProductRequest) returns (Basket); rpc Reset (UserId) returns (Basket); rpc SetRestaurant (RestaurantId) returns (Basket); } @@ -17,30 +16,16 @@ message UserId { } message RestaurantId { - uint64 id = 1; + string id = 1; } message Basket { - string message = 1; -} -message AddProductRequest { uint64 user_id = 1; - Product product = 2; + repeated string products_id = 2; + string restaurant_id = 3; } -message DeleteProductRequest { +message ProductRequest { uint64 user_id = 1; string product_id = 2; } -message Product { - string id = 1; - string name = 2; - string image = 3; - string comment = 4; - int32 price = 5; - string preparation = 6; - string weight = 7; - string kilocalories = 8; - int32 nutriscore = 9; - int32 restaurant_id = 10; -} \ No newline at end of file From 2ce7f7faebf1f39e1db4834e705a501ec0e5406f Mon Sep 17 00:00:00 2001 From: anatole Date: Mon, 14 Aug 2023 21:14:14 +0200 Subject: [PATCH 361/883] feat(basket): create the add product and get basket methods --- services/basket/package-lock.json | 92 +++++++++++- services/basket/package.json | 9 +- services/basket/src/handlers/basket/add.ts | 34 +++++ services/basket/src/handlers/basket/get.ts | 30 ++++ services/basket/src/handlers/basket/index.ts | 13 ++ services/basket/src/lib/amqp.ts | 32 +++++ services/basket/src/lib/log.ts | 74 ++++++++++ services/basket/src/lib/proxy.ts | 132 ++++++++++++++++++ services/basket/src/lib/redis.ts | 13 ++ services/basket/src/middleware/log.ts | 42 ++++++ .../basket/src/resources/grpc-credentials.ts | 5 + .../src/resources/protoloader-options.ts | 7 + services/basket/src/server.ts | 39 ++++++ services/basket/src/types/basket.ts | 19 +++ services/basket/src/types/index.d.ts | 3 + services/basket/src/types/redisBasket.ts | 4 + services/proto/basket.proto | 5 +- 17 files changed, 541 insertions(+), 12 deletions(-) create mode 100644 services/basket/src/handlers/basket/add.ts create mode 100644 services/basket/src/handlers/basket/get.ts create mode 100644 services/basket/src/handlers/basket/index.ts create mode 100644 services/basket/src/lib/amqp.ts create mode 100644 services/basket/src/lib/log.ts create mode 100644 services/basket/src/lib/proxy.ts create mode 100644 services/basket/src/lib/redis.ts create mode 100644 services/basket/src/middleware/log.ts create mode 100644 services/basket/src/resources/grpc-credentials.ts create mode 100644 services/basket/src/resources/protoloader-options.ts create mode 100644 services/basket/src/server.ts create mode 100644 services/basket/src/types/basket.ts create mode 100644 services/basket/src/types/index.d.ts create mode 100644 services/basket/src/types/redisBasket.ts diff --git a/services/basket/package-lock.json b/services/basket/package-lock.json index b21036f6..92e624ce 100644 --- a/services/basket/package-lock.json +++ b/services/basket/package-lock.json @@ -11,9 +11,9 @@ "@prisma/client": "4.16.2", "amqplib": "^0.10.3", "dotenv": "^16.0.3", - "ioredis": "5.3.2", "prisma-redis-middleware": "4.8.0", - "protobufjs": "7.2.2" + "protobufjs": "7.2.2", + "redis": "^4.6.7" }, "bin": { "basket": "dist/index.js" @@ -21,6 +21,7 @@ "devDependencies": { "@types/amqplib": "^0.10.1", "@types/node": "18.15.9", + "@types/redis": "^4.0.11", "esbuild": "^0.17.14", "nodemon": "^2.0.22", "pkg": "^5.8.1", @@ -681,6 +682,59 @@ "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==" }, + "node_modules/@redis/bloom": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@redis/bloom/-/bloom-1.2.0.tgz", + "integrity": "sha512-HG2DFjYKbpNmVXsa0keLHp/3leGJz1mjh09f2RLGGLQZzSHpkmZWuwJbAvo3QcRY8p80m5+ZdXZdYOSBLlp7Cg==", + "peerDependencies": { + "@redis/client": "^1.0.0" + } + }, + "node_modules/@redis/client": { + "version": "1.5.8", + "resolved": "https://registry.npmjs.org/@redis/client/-/client-1.5.8.tgz", + "integrity": "sha512-xzElwHIO6rBAqzPeVnCzgvrnBEcFL1P0w8P65VNLRkdVW8rOE58f52hdj0BDgmsdOm4f1EoXPZtH4Fh7M/qUpw==", + "dependencies": { + "cluster-key-slot": "1.1.2", + "generic-pool": "3.9.0", + "yallist": "4.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@redis/graph": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@redis/graph/-/graph-1.1.0.tgz", + "integrity": "sha512-16yZWngxyXPd+MJxeSr0dqh2AIOi8j9yXKcKCwVaKDbH3HTuETpDVPcLujhFYVPtYrngSco31BUcSa9TH31Gqg==", + "peerDependencies": { + "@redis/client": "^1.0.0" + } + }, + "node_modules/@redis/json": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@redis/json/-/json-1.0.4.tgz", + "integrity": "sha512-LUZE2Gdrhg0Rx7AN+cZkb1e6HjoSKaeeW8rYnt89Tly13GBI5eP4CwDVr+MY8BAYfCg4/N15OUrtLoona9uSgw==", + "peerDependencies": { + "@redis/client": "^1.0.0" + } + }, + "node_modules/@redis/search": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@redis/search/-/search-1.1.3.tgz", + "integrity": "sha512-4Dg1JjvCevdiCBTZqjhKkGoC5/BcB7k9j99kdMnaXFXg8x4eyOIVg9487CMv7/BUVkFLZCaIh8ead9mU15DNng==", + "peerDependencies": { + "@redis/client": "^1.0.0" + } + }, + "node_modules/@redis/time-series": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@redis/time-series/-/time-series-1.0.4.tgz", + "integrity": "sha512-ThUIgo2U/g7cCuZavucQTQzA9g9JbDDY2f64u3AbAoz/8vE2lt2U37LamDUVChhaDA3IRT9R6VvJwqnUfTJzng==", + "peerDependencies": { + "@redis/client": "^1.0.0" + } + }, "node_modules/@tsconfig/node10": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", @@ -739,6 +793,16 @@ "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.9.tgz", "integrity": "sha512-dUxhiNzBLr6IqlZXz6e/rN2YQXlFgOei/Dxy+e3cyXTJ4txSUbGT2/fmnD6zd/75jDMeW5bDee+YXxlFKHoV0A==" }, + "node_modules/@types/redis": { + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/@types/redis/-/redis-4.0.11.tgz", + "integrity": "sha512-bI+gth8La8Wg/QCR1+V1fhrL9+LZUSWfcqpOj2Kc80ZQ4ffbdL173vQd5wovmoV9i071FU9oP2g6etLuEwb6Rg==", + "deprecated": "This is a stub types definition. redis provides its own type definitions, so you do not need this installed.", + "dev": true, + "dependencies": { + "redis": "*" + } + }, "node_modules/@vitest/expect": { "version": "0.29.8", "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-0.29.8.tgz", @@ -1565,6 +1629,14 @@ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", "dev": true }, + "node_modules/generic-pool": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/generic-pool/-/generic-pool-3.9.0.tgz", + "integrity": "sha512-hymDOu5B53XvN4QT9dBmZxPX4CWhBPPLguTZ9MMFeFa/Kg0xWVfylOVNlJji/E7yTZWFd/q9GO5TxDLq156D7g==", + "engines": { + "node": ">= 4" + } + }, "node_modules/get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", @@ -2610,6 +2682,19 @@ "node": ">=8.10.0" } }, + "node_modules/redis": { + "version": "4.6.7", + "resolved": "https://registry.npmjs.org/redis/-/redis-4.6.7.tgz", + "integrity": "sha512-KrkuNJNpCwRm5vFJh0tteMxW8SaUzkm5fBH7eL5hd/D0fAkzvapxbfGPP/r+4JAXdQuX7nebsBkBqA2RHB7Usw==", + "dependencies": { + "@redis/bloom": "1.2.0", + "@redis/client": "1.5.8", + "@redis/graph": "1.1.0", + "@redis/json": "1.0.4", + "@redis/search": "1.1.3", + "@redis/time-series": "1.0.4" + } + }, "node_modules/redis-errors": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/redis-errors/-/redis-errors-1.2.0.tgz", @@ -3980,8 +4065,7 @@ "node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, "node_modules/yargs": { "version": "16.2.0", diff --git a/services/basket/package.json b/services/basket/package.json index 9963d558..b8f5224a 100644 --- a/services/basket/package.json +++ b/services/basket/package.json @@ -15,13 +15,14 @@ "@prisma/client": "4.16.2", "amqplib": "^0.10.3", "dotenv": "^16.0.3", - "ioredis": "5.3.2", "prisma-redis-middleware": "4.8.0", - "protobufjs": "7.2.2" + "protobufjs": "7.2.2", + "redis": "^4.6.7" }, "devDependencies": { "@types/amqplib": "^0.10.1", "@types/node": "18.15.9", + "@types/redis": "^4.0.11", "esbuild": "^0.17.14", "nodemon": "^2.0.22", "pkg": "^5.8.1", @@ -32,13 +33,9 @@ "vite-tsconfig-paths": "^4.0.7", "vitest": "^0.29.8" }, - "prisma": { - "seed": "ts-node prisma/seed.ts" - }, "pkg": { "scripts": "./src/dist/index.js", "assets": [ - "./prisma/**/*", "../proto/**/*" ], "targets": [ diff --git a/services/basket/src/handlers/basket/add.ts b/services/basket/src/handlers/basket/add.ts new file mode 100644 index 00000000..3314d61c --- /dev/null +++ b/services/basket/src/handlers/basket/add.ts @@ -0,0 +1,34 @@ +import {log} from "@basket/lib/log"; +import {Data} from "@basket/types"; +import {ProductRequest} from "@basket/types/basket"; + +import client from "@basket/lib/redis"; +import {RedisBasket} from "@basket/types/redisBasket"; + +export const AddProduct = async ( + {request}: Data, + callback: (err: any, response: any) => void +) => { + try { + const {product_id, user_id, restaurant_id} = request; + const basket = await client.get(`user:${user_id}`); + + if (!basket) { + await client.set(`user:${user_id}`, JSON.stringify({products_ids: [product_id], restaurant_id})); + callback(null, {product_id, user_id}); + return; + } + + const storedBasket: RedisBasket = JSON.parse(basket); + const newBasket = { + products_ids: [...storedBasket.products_ids, product_id], + restaurant_id: storedBasket.restaurant_id + }; + await client.set(`user:${user_id}`, JSON.stringify(newBasket)); + + callback(null, {user_id, newBasket}); + } catch (error) { + log.error(error); + callback(error, null); + } +}; diff --git a/services/basket/src/handlers/basket/get.ts b/services/basket/src/handlers/basket/get.ts new file mode 100644 index 00000000..cd1407ad --- /dev/null +++ b/services/basket/src/handlers/basket/get.ts @@ -0,0 +1,30 @@ +import {UserId} from "@basket/types/basket"; +import {Data} from "@basket/types"; +import {log} from "@basket/lib/log"; +import client from "@basket/lib/redis"; +import {RedisBasket} from "@basket/types/redisBasket"; + +export const GetBasket = async ( + data: Data, + callback: (err: any, response: any) => void +) => { + try { + const {request} = data; + const {id} = request; + const basket = await client.get(`user:${id}`); + if (!basket) { + callback(null, {}); + } else { + log.debug(basket) + const {products_ids, restaurant_id}: RedisBasket = JSON.parse(basket); + callback(null, { + user_id: id, + products_ids, + restaurant_id + }); + } + } catch (error) { + log.error(error); + callback(error, null); + } +}; diff --git a/services/basket/src/handlers/basket/index.ts b/services/basket/src/handlers/basket/index.ts new file mode 100644 index 00000000..6c2efc7a --- /dev/null +++ b/services/basket/src/handlers/basket/index.ts @@ -0,0 +1,13 @@ +import {AddProduct} from "@basket/handlers/basket/add"; +import {GetBasket} from "@basket/handlers/basket/get"; +import {DeleteProduct} from "@basket/handlers/basket/delete"; +import {UpdateRestaurant} from "@basket/handlers/basket/updateRestaurant"; +import {Reset} from "@basket/handlers/basket/reset"; + +export default { + AddProduct, + DeleteProduct, + GetBasket, + UpdateRestaurant, + Reset, +}; diff --git a/services/basket/src/lib/amqp.ts b/services/basket/src/lib/amqp.ts new file mode 100644 index 00000000..019abc0f --- /dev/null +++ b/services/basket/src/lib/amqp.ts @@ -0,0 +1,32 @@ +import amqp from "amqplib"; +import { msg } from "@basket/middleware/log"; +import { log } from "@basket/lib/log"; + +const DEFAULT_QUEUE = "log"; + +async function connectQueue(queue = DEFAULT_QUEUE) { + try { + const connection = await amqp.connect(process.env.AMQP_URL || ""); + const channel = await connection.createChannel(); + await channel.assertExchange(queue, "fanout", { durable: true }); + return channel; + } catch (error) { + return error as Error; + } +} + +const toLog = (message: any) => { + const { request, path } = message; + return { event_message: path, metadata: { request } }; +}; + +export const publish = async (message: any, queue = DEFAULT_QUEUE) => { + const channel = await connectQueue(queue); + if (channel instanceof Error) + return console.log("Error to connect to queue: ", channel); + channel.sendToQueue(queue, Buffer.from(JSON.stringify(toLog(message)))); + log.debug( + msg("AMQP", `${queue} (queue)`, new Date(), new Date()), + JSON.stringify(message) + ); +}; diff --git a/services/basket/src/lib/log.ts b/services/basket/src/lib/log.ts new file mode 100644 index 00000000..2404af54 --- /dev/null +++ b/services/basket/src/lib/log.ts @@ -0,0 +1,74 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ +/* eslint-disable no-console */ + +function getStackTrace() { + let stack; + + try { + throw new Error(""); + } catch (error) { + stack = (error as Error).stack || ""; + } + + stack = stack.split("\n").map((line) => line.trim()); + return stack.splice(stack[0] === "Error" ? 2 : 1); +} + +const getInitiator = () => { + // _getInitiatorLine, _ObjectInfoLine, caller + const [, , caller] = getStackTrace(); + const file = caller.split("/").at(-1) || ""; + return file.replace(")", ""); +}; + +const warn = (...args: any[]) => { + console.group( + `\x1b[33m${new Date().toISOString()} - WARN - ${getInitiator()}\x1b[0m` + ); + console.warn(...args); + console.groupEnd(); +}; +const error = (...args: any[]) => { + console.group( + `\x1b[31m${new Date().toISOString()} - ERROR - ${getInitiator()}\x1b[0m` + ); + console.error(...args); + console.groupEnd(); +}; +const info = (...args: any[]) => { + console.group( + `\x1b[34m${new Date().toISOString()} - INFO - ${getInitiator()}\x1b[0m` + ); + console.log(...args); + console.groupEnd(); +}; +const debug = (...args: any[]) => { + console.log(...args); +}; + +/** + * @description a simple interface logger for logging to the console and into a log drain in the future + * @example + * log.warn('this is a warning'); + * log.error('this is an error'); + * log.info('this is an info'); + * @exports log + */ +export const log = { + warn, + error, + info, + debug, +}; + +export const utils = { + bold: (text: string) => `\x1b[1m${text}\x1b[0m`, + red: (text: string) => `\x1b[31m${text}\x1b[0m`, + green: (text: string) => `\x1b[32m${text}\x1b[0m`, + yellow: (text: string) => `\x1b[33m${text}\x1b[0m`, + blue: (text: string) => `\x1b[34m${text}\x1b[0m`, + magenta: (text: string) => `\x1b[35m${text}\x1b[0m`, + cyan: (text: string) => `\x1b[36m${text}\x1b[0m`, + white: (text: string) => `\x1b[37m${text}\x1b[0m`, + gray: (text: string) => `\x1b[90m${text}\x1b[0m`, +}; diff --git a/services/basket/src/lib/proxy.ts b/services/basket/src/lib/proxy.ts new file mode 100644 index 00000000..b05d24a6 --- /dev/null +++ b/services/basket/src/lib/proxy.ts @@ -0,0 +1,132 @@ +import { Server, status } from "@grpc/grpc-js"; + +const getType = (method: { + requestStream: boolean; + responseStream: boolean; +}) => { + if (method.requestStream === false && method.responseStream === false) { + return "unary"; + } + return "unknown"; +}; + + +const lookupServiceMetadata = (service: { [x: string]: any }) => { + const serviceKeys = Object.keys(service); + const intersectingMethods = serviceKeys.reduce((acc, k) => { + const method = service[k]; + if (!method) { + throw new Error(`cannot find method ${k} on service`); + } + const components = method.path.split("/"); + acc[k] = { + name: components[1], + method: components[2], + type: getType(method), + path: method.path, + responseType: method.responseType, + requestType: method.requestType, + }; + return acc; + }, {} as any); + + return (key: string) => intersectingMethods[key]; +}; + +export const handler = { + get( + target: { + [x: string]: any; + intercept: () => any; + addService: (arg0: any, arg1: {}) => any; + }, + propKey: string + ) { + if (propKey !== "addService") { + return target[propKey]; + } + return (service: any, implementation: { [x: string]: any }) => { + const newImplementation = {} as any; + const lookup = lookupServiceMetadata(service); + for (const k in implementation) { + const name = k; + const fn = implementation[k]; + newImplementation[name] = (call: any, callback: any) => { + const ctx = { + call, + name, + service: lookup(name), + status: { + code: status.UNKNOWN, + details: "", + }, + }; + const newCallback = (callback: (arg0: any) => void) => { + return (...args: any[]) => { + ctx.status = { + code: status.OK, + details: "", + }; + const err = args[0]; + if (err) { + ctx.status = { + code: status.UNKNOWN, + details: err, + }; + } + // @ts-ignore + callback(...args); + }; + }; + + const interceptors = target.intercept(); + const first = interceptors.next(); + if (!first.value) { + // if we don't have any interceptors + return new Promise((resolve) => { + return resolve(fn(call, newCallback(callback))); + }); + } + first.value(ctx, function next() { + return new Promise((resolve) => { + const i = interceptors.next(); + if (i.done) { + return resolve(fn(call, newCallback(callback))); + } + return resolve(i.value(ctx, next)); + }); + }); + }; + } + return target.addService(service, newImplementation); + }; + }, +}; + +export const createServerProxy = ( + server: Server +): Server & { + intercept: Generator; + interceptors: any[]; + use: (fn: any) => void; +} => { + // @ts-ignore + server.interceptors = []; + // @ts-ignore + server.use = (fn: any) => { + // @ts-ignore + server.interceptors.push(fn); + }; + // @ts-ignore + server.intercept = function* intercept() { + let i = 0; + // @ts-ignore + while (i < server.interceptors.length) { + // @ts-ignore + yield server.interceptors[i]; + i++; + } + }; + // @ts-ignore + return new Proxy(server, handler); +}; \ No newline at end of file diff --git a/services/basket/src/lib/redis.ts b/services/basket/src/lib/redis.ts new file mode 100644 index 00000000..730867c1 --- /dev/null +++ b/services/basket/src/lib/redis.ts @@ -0,0 +1,13 @@ +import {createClient} from "redis"; + +const client = createClient(); + +client.on('error', (err: any) => { + console.log('could not establish a connection with redis. ' + err); +}); +client.on('connect', (err: any) => { + console.log('connected to redis successfully'); +}); + +client.connect(); +export default client; \ No newline at end of file diff --git a/services/basket/src/middleware/log.ts b/services/basket/src/middleware/log.ts new file mode 100644 index 00000000..447af2b7 --- /dev/null +++ b/services/basket/src/middleware/log.ts @@ -0,0 +1,42 @@ +import { publish } from "@basket/lib/amqp"; +import { utils } from "@basket/lib/log"; +import { log } from "@basket/lib/log"; + +type Context = { + call: { + request: Map; + }; + service: { + path: string; + }; +}; + +const parseContext = (ctx: Context) => { + const { + call: { request }, + service: { path }, + } = ctx; + return { request, path }; +}; + +export const msg = ( + type: "GRPC" | "AMQP", + path: string | undefined, + requestAt: Date, + responseAt: Date +) => + `${utils.magenta(requestAt.toISOString())} | ${utils[ + type === "GRPC" ? "cyan" : "red" + ](type)}${path ? ` | ${utils.yellow(path)}` : ""} | ${utils.green( + responseAt.getTime() - requestAt.getTime() + "ms" + )} |`; + +export const logGRPC = async (ctx: Context, next: () => Promise) => { + const requestAt = new Date(); + await next(); + const responseAt = new Date(); + let { request, path } = parseContext(ctx); + path = path?.split(".").at(-1) || ""; + publish({ request, path }, "log"); + log.debug(msg("GRPC", path, requestAt, responseAt), JSON.stringify(request)); +}; diff --git a/services/basket/src/resources/grpc-credentials.ts b/services/basket/src/resources/grpc-credentials.ts new file mode 100644 index 00000000..75a2b5d5 --- /dev/null +++ b/services/basket/src/resources/grpc-credentials.ts @@ -0,0 +1,5 @@ +import { credentials, ServerCredentials } from "@grpc/grpc-js"; + +export const insecure = credentials.createInsecure(); + +export const serverInsecure = ServerCredentials.createInsecure(); diff --git a/services/basket/src/resources/protoloader-options.ts b/services/basket/src/resources/protoloader-options.ts new file mode 100644 index 00000000..5022d96d --- /dev/null +++ b/services/basket/src/resources/protoloader-options.ts @@ -0,0 +1,7 @@ +export const options = { + keepCase: true, + longs: String, + enums: String, + defaults: true, + oneofs: true, +}; diff --git a/services/basket/src/server.ts b/services/basket/src/server.ts new file mode 100644 index 00000000..7272b2f1 --- /dev/null +++ b/services/basket/src/server.ts @@ -0,0 +1,39 @@ +import "dotenv/config"; +import {resolve as resolvePath} from "path"; + +import {loadSync} from "@grpc/proto-loader"; +import {loadPackageDefinition, Server} from "@grpc/grpc-js"; + +import {log, utils} from "@basket/lib/log"; +import {options} from "@basket/resources/protoloader-options"; +import {serverInsecure} from "@basket/resources/grpc-credentials"; + +import basketHandlers from "@basket/handlers/basket"; +import {createServerProxy} from "@basket/lib/proxy"; +import {logGRPC} from "@basket/middleware/log"; + +const PORT = process.env.PORT || 50002; +const ADDRESS = `0.0.0.0:${PORT}`; +const PROTO_PATH = resolvePath(__dirname + "/../../proto/basket.proto"); + +const packageDefinition = loadSync(PROTO_PATH, options); +const grpc = loadPackageDefinition(packageDefinition) as any; +const { + BasketService: {service: ds}, +} = grpc.com.goodfood.basket; + +const server = createServerProxy(new Server()); +server.addService(ds, basketHandlers); +server.use(logGRPC); + +server.bindAsync(ADDRESS, serverInsecure, () => { + server.start(); + const message = `---- ${utils.green("good")}${utils.yellow( + "food" + )} Basket Service ----\nstarted on: ${utils.bold(ADDRESS)} ${utils.green( + "✓" + )}\n`; + log.debug(message); +}); + +export default server; diff --git a/services/basket/src/types/basket.ts b/services/basket/src/types/basket.ts new file mode 100644 index 00000000..1b236774 --- /dev/null +++ b/services/basket/src/types/basket.ts @@ -0,0 +1,19 @@ +export type ProductRequest = { + user_id: number; + product_id: string; + restaurant_id: string; +}; + +export type UserId = { + id: number; +}; + +export type Basket = { + user_id: string; + products_ids: string[]; + restaurant_id: string; +}; + +export type RestaurantId = { + id: string; +}; diff --git a/services/basket/src/types/index.d.ts b/services/basket/src/types/index.d.ts new file mode 100644 index 00000000..edf2bebf --- /dev/null +++ b/services/basket/src/types/index.d.ts @@ -0,0 +1,3 @@ +export type Data = { + request: T; +}; diff --git a/services/basket/src/types/redisBasket.ts b/services/basket/src/types/redisBasket.ts new file mode 100644 index 00000000..3e8a5a0f --- /dev/null +++ b/services/basket/src/types/redisBasket.ts @@ -0,0 +1,4 @@ +export type RedisBasket = { + products_ids: string[]; + restaurant_id: string; +}; \ No newline at end of file diff --git a/services/proto/basket.proto b/services/proto/basket.proto index 3ac753f8..2e8c578c 100644 --- a/services/proto/basket.proto +++ b/services/proto/basket.proto @@ -8,7 +8,7 @@ service BasketService { rpc AddProduct (ProductRequest) returns (Basket); rpc DeleteProduct (ProductRequest) returns (Basket); rpc Reset (UserId) returns (Basket); - rpc SetRestaurant (RestaurantId) returns (Basket); + rpc UpdateRestaurant (RestaurantId) returns (Basket); } message UserId { @@ -21,11 +21,12 @@ message RestaurantId { message Basket { uint64 user_id = 1; - repeated string products_id = 2; + repeated string products_ids = 2; string restaurant_id = 3; } message ProductRequest { uint64 user_id = 1; string product_id = 2; + string restaurant_id = 3; } From 52afb353614077a4262087edf81d57b95d7553d6 Mon Sep 17 00:00:00 2001 From: anatole Date: Mon, 14 Aug 2023 21:20:37 +0200 Subject: [PATCH 362/883] feat(basket): create the delete product method --- services/basket/src/handlers/basket/add.ts | 2 +- services/basket/src/handlers/basket/delete.ts | 33 +++++++++++++++++++ 2 files changed, 34 insertions(+), 1 deletion(-) create mode 100644 services/basket/src/handlers/basket/delete.ts diff --git a/services/basket/src/handlers/basket/add.ts b/services/basket/src/handlers/basket/add.ts index 3314d61c..6358ee09 100644 --- a/services/basket/src/handlers/basket/add.ts +++ b/services/basket/src/handlers/basket/add.ts @@ -26,7 +26,7 @@ export const AddProduct = async ( }; await client.set(`user:${user_id}`, JSON.stringify(newBasket)); - callback(null, {user_id, newBasket}); + callback(null, {user_id, ...newBasket}); } catch (error) { log.error(error); callback(error, null); diff --git a/services/basket/src/handlers/basket/delete.ts b/services/basket/src/handlers/basket/delete.ts new file mode 100644 index 00000000..8dc8cdc5 --- /dev/null +++ b/services/basket/src/handlers/basket/delete.ts @@ -0,0 +1,33 @@ +import {log} from "@basket/lib/log"; +import {Data} from "@basket/types"; +import {ProductRequest} from "@basket/types/basket"; +import client from "@basket/lib/redis"; +import {RedisBasket} from "@basket/types/redisBasket"; + +export const DeleteProduct = async ( + data: Data, + callback: (err: any, response: any) => void +) => { + try { + const {request} = data; + const {product_id, user_id} = request; + + const basket = await client.get(`user:${user_id}`); + if (!basket) { + callback(null, "Basket not found"); + return; + } + + const storedBasket: RedisBasket = JSON.parse(basket); + const newBasket = { + products_ids: storedBasket.products_ids.filter(productId => productId !== product_id), + restaurant_id: storedBasket.restaurant_id + }; + log.info(basket); + await client.set(`user:${user_id}`, JSON.stringify(newBasket)); + callback(null, {user_id, ...newBasket}); + } catch (error) { + log.error(error); + callback(error, null); + } +}; From 8050b7698e0252d8b9022f36ded48e4a838a3399 Mon Sep 17 00:00:00 2001 From: anatole Date: Mon, 14 Aug 2023 21:23:18 +0200 Subject: [PATCH 363/883] feat(basket): create the reset basket method --- services/basket/src/handlers/basket/reset.ts | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 services/basket/src/handlers/basket/reset.ts diff --git a/services/basket/src/handlers/basket/reset.ts b/services/basket/src/handlers/basket/reset.ts new file mode 100644 index 00000000..47ffe33c --- /dev/null +++ b/services/basket/src/handlers/basket/reset.ts @@ -0,0 +1,18 @@ +import {log} from "@basket/lib/log"; +import {Data} from "@basket/types"; +import {UserId} from "@basket/types/basket"; +import client from "@basket/lib/redis"; + +export const Reset = async ( + {request}: Data, + callback: (err: any, response: any) => void +) => { + try { + const {id} = request; + await client.del(`user:${id}`); + callback(null, {}); + } catch (error) { + log.error(error); + callback(error, null); + } +}; From 79c4df921258424a44a102ea2b029c5dcae14273 Mon Sep 17 00:00:00 2001 From: anatole Date: Mon, 14 Aug 2023 21:24:05 +0200 Subject: [PATCH 364/883] feat(basket): remove useless variable --- services/basket/src/handlers/basket/delete.ts | 3 +-- services/basket/src/handlers/basket/get.ts | 4 +--- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/services/basket/src/handlers/basket/delete.ts b/services/basket/src/handlers/basket/delete.ts index 8dc8cdc5..d9beb207 100644 --- a/services/basket/src/handlers/basket/delete.ts +++ b/services/basket/src/handlers/basket/delete.ts @@ -5,11 +5,10 @@ import client from "@basket/lib/redis"; import {RedisBasket} from "@basket/types/redisBasket"; export const DeleteProduct = async ( - data: Data, + {request}: Data, callback: (err: any, response: any) => void ) => { try { - const {request} = data; const {product_id, user_id} = request; const basket = await client.get(`user:${user_id}`); diff --git a/services/basket/src/handlers/basket/get.ts b/services/basket/src/handlers/basket/get.ts index cd1407ad..6034088c 100644 --- a/services/basket/src/handlers/basket/get.ts +++ b/services/basket/src/handlers/basket/get.ts @@ -5,17 +5,15 @@ import client from "@basket/lib/redis"; import {RedisBasket} from "@basket/types/redisBasket"; export const GetBasket = async ( - data: Data, + {request}: Data, callback: (err: any, response: any) => void ) => { try { - const {request} = data; const {id} = request; const basket = await client.get(`user:${id}`); if (!basket) { callback(null, {}); } else { - log.debug(basket) const {products_ids, restaurant_id}: RedisBasket = JSON.parse(basket); callback(null, { user_id: id, From 4647053bc9759eda34cc56b95213d6eba8ac3bf8 Mon Sep 17 00:00:00 2001 From: anatole Date: Mon, 14 Aug 2023 21:56:38 +0200 Subject: [PATCH 365/883] feat(basket): add updateRestaurant method and throw Invalid request if necessary --- services/basket/src/handlers/basket/add.ts | 3 ++ services/basket/src/handlers/basket/delete.ts | 4 ++- services/basket/src/handlers/basket/get.ts | 3 ++ services/basket/src/handlers/basket/reset.ts | 4 +++ .../src/handlers/basket/updateRestaurant.ts | 36 +++++++++++++++++++ services/basket/src/lib/redis.ts | 2 +- services/basket/src/types/basket.ts | 7 ++-- services/proto/basket.proto | 7 ++-- 8 files changed, 58 insertions(+), 8 deletions(-) create mode 100644 services/basket/src/handlers/basket/updateRestaurant.ts diff --git a/services/basket/src/handlers/basket/add.ts b/services/basket/src/handlers/basket/add.ts index 6358ee09..5d8622f1 100644 --- a/services/basket/src/handlers/basket/add.ts +++ b/services/basket/src/handlers/basket/add.ts @@ -11,6 +11,9 @@ export const AddProduct = async ( ) => { try { const {product_id, user_id, restaurant_id} = request; + if (!product_id || !restaurant_id || !user_id) { + throw new Error("Invalid request"); + } const basket = await client.get(`user:${user_id}`); if (!basket) { diff --git a/services/basket/src/handlers/basket/delete.ts b/services/basket/src/handlers/basket/delete.ts index d9beb207..f22206f0 100644 --- a/services/basket/src/handlers/basket/delete.ts +++ b/services/basket/src/handlers/basket/delete.ts @@ -10,7 +10,9 @@ export const DeleteProduct = async ( ) => { try { const {product_id, user_id} = request; - + if (!product_id || !user_id) { + throw new Error("Invalid request"); + } const basket = await client.get(`user:${user_id}`); if (!basket) { callback(null, "Basket not found"); diff --git a/services/basket/src/handlers/basket/get.ts b/services/basket/src/handlers/basket/get.ts index 6034088c..9920049f 100644 --- a/services/basket/src/handlers/basket/get.ts +++ b/services/basket/src/handlers/basket/get.ts @@ -10,6 +10,9 @@ export const GetBasket = async ( ) => { try { const {id} = request; + if (!id) { + throw new Error("Invalid request"); + } const basket = await client.get(`user:${id}`); if (!basket) { callback(null, {}); diff --git a/services/basket/src/handlers/basket/reset.ts b/services/basket/src/handlers/basket/reset.ts index 47ffe33c..b27569eb 100644 --- a/services/basket/src/handlers/basket/reset.ts +++ b/services/basket/src/handlers/basket/reset.ts @@ -9,6 +9,10 @@ export const Reset = async ( ) => { try { const {id} = request; + if (!id) { + throw new Error("Invalid request"); + } + await client.del(`user:${id}`); callback(null, {}); } catch (error) { diff --git a/services/basket/src/handlers/basket/updateRestaurant.ts b/services/basket/src/handlers/basket/updateRestaurant.ts new file mode 100644 index 00000000..775d6dc4 --- /dev/null +++ b/services/basket/src/handlers/basket/updateRestaurant.ts @@ -0,0 +1,36 @@ +import {log} from "@basket/lib/log"; +import {Data} from "@basket/types"; +import {RestaurantRequest} from "@basket/types/basket"; +import client from "@basket/lib/redis"; +import {RedisBasket} from "@basket/types/redisBasket"; + +export const UpdateRestaurant = async ( + {request}: Data, + callback: (err: any, response: any) => void +) => { + try { + const {restaurant_id, user_id} = request; + if (!restaurant_id || !user_id) { + throw new Error("Invalid request"); + } + + const basket = await client.get(`user:${user_id}`); + + if (!basket) { + callback(null, {}); + return; + } + + const storedBasket: RedisBasket = JSON.parse(basket); + const newBasket = { + products_ids: storedBasket.products_ids, + restaurant_id + }; + await client.set(`user:${user_id}`, JSON.stringify(newBasket)); + + callback(null, {user_id, ...newBasket}); + } catch (error) { + log.error(error); + callback(error, null); + } +}; diff --git a/services/basket/src/lib/redis.ts b/services/basket/src/lib/redis.ts index 730867c1..dd6f1206 100644 --- a/services/basket/src/lib/redis.ts +++ b/services/basket/src/lib/redis.ts @@ -5,7 +5,7 @@ const client = createClient(); client.on('error', (err: any) => { console.log('could not establish a connection with redis. ' + err); }); -client.on('connect', (err: any) => { +client.on('connect', () => { console.log('connected to redis successfully'); }); diff --git a/services/basket/src/types/basket.ts b/services/basket/src/types/basket.ts index 1b236774..f82c4f34 100644 --- a/services/basket/src/types/basket.ts +++ b/services/basket/src/types/basket.ts @@ -9,11 +9,12 @@ export type UserId = { }; export type Basket = { - user_id: string; + user_id: number; products_ids: string[]; restaurant_id: string; }; -export type RestaurantId = { - id: string; +export type RestaurantRequest = { + user_id: number; + restaurant_id: string; }; diff --git a/services/proto/basket.proto b/services/proto/basket.proto index 2e8c578c..044a8b4a 100644 --- a/services/proto/basket.proto +++ b/services/proto/basket.proto @@ -8,15 +8,16 @@ service BasketService { rpc AddProduct (ProductRequest) returns (Basket); rpc DeleteProduct (ProductRequest) returns (Basket); rpc Reset (UserId) returns (Basket); - rpc UpdateRestaurant (RestaurantId) returns (Basket); + rpc UpdateRestaurant (RestaurantRequest) returns (Basket); } message UserId { uint64 id = 1; } -message RestaurantId { - string id = 1; +message RestaurantRequest { + uint64 user_id = 1; + string restaurant_id = 2; } message Basket { From b52d384ee33cf40bc27340f780013d3121e0ed22 Mon Sep 17 00:00:00 2001 From: anatole Date: Mon, 14 Aug 2023 22:00:47 +0200 Subject: [PATCH 366/883] feat(basket): clean --- services/basket/README.md | 2 +- services/basket/package.json | 3 --- services/basket/src/handlers/basket/delete.ts | 1 - services/basket/src/handlers/basket/get.ts | 5 ++--- 4 files changed, 3 insertions(+), 8 deletions(-) diff --git a/services/basket/README.md b/services/basket/README.md index f998b26e..8f792c64 100644 --- a/services/basket/README.md +++ b/services/basket/README.md @@ -17,7 +17,7 @@ - `AddProduct`: Adds a product to a basket. - `DeleteProduct`: Deletes a product from a basket. - `Reset`: Resets a basket. - - `SetRestaurant`: Sets a restaurant to a basket. + - `UpdateRestaurant`: Sets a restaurant to a basket. ## Requirements diff --git a/services/basket/package.json b/services/basket/package.json index b8f5224a..0d8931a7 100644 --- a/services/basket/package.json +++ b/services/basket/package.json @@ -12,10 +12,8 @@ "dependencies": { "@grpc/grpc-js": "^1.8.13", "@grpc/proto-loader": "0.7.6", - "@prisma/client": "4.16.2", "amqplib": "^0.10.3", "dotenv": "^16.0.3", - "prisma-redis-middleware": "4.8.0", "protobufjs": "7.2.2", "redis": "^4.6.7" }, @@ -26,7 +24,6 @@ "esbuild": "^0.17.14", "nodemon": "^2.0.22", "pkg": "^5.8.1", - "prisma": "4.16.2", "ts-node": "10.9.1", "tsconfig-paths": "^4.1.2", "typescript": "5.0.2", diff --git a/services/basket/src/handlers/basket/delete.ts b/services/basket/src/handlers/basket/delete.ts index f22206f0..8dbc7f60 100644 --- a/services/basket/src/handlers/basket/delete.ts +++ b/services/basket/src/handlers/basket/delete.ts @@ -24,7 +24,6 @@ export const DeleteProduct = async ( products_ids: storedBasket.products_ids.filter(productId => productId !== product_id), restaurant_id: storedBasket.restaurant_id }; - log.info(basket); await client.set(`user:${user_id}`, JSON.stringify(newBasket)); callback(null, {user_id, ...newBasket}); } catch (error) { diff --git a/services/basket/src/handlers/basket/get.ts b/services/basket/src/handlers/basket/get.ts index 9920049f..dc5f03e5 100644 --- a/services/basket/src/handlers/basket/get.ts +++ b/services/basket/src/handlers/basket/get.ts @@ -17,11 +17,10 @@ export const GetBasket = async ( if (!basket) { callback(null, {}); } else { - const {products_ids, restaurant_id}: RedisBasket = JSON.parse(basket); + const storedBasket: RedisBasket = JSON.parse(basket); callback(null, { user_id: id, - products_ids, - restaurant_id + ...storedBasket }); } } catch (error) { From f1c3b919b93b9d26cd716851a142c57f9c6f2d3c Mon Sep 17 00:00:00 2001 From: anatole Date: Tue, 15 Aug 2023 13:35:19 +0200 Subject: [PATCH 367/883] feat(global): update the readme --- README.md | 33 +++++++++++++++++++-------------- 1 file changed, 19 insertions(+), 14 deletions(-) diff --git a/README.md b/README.md index cd7a2b73..b21c638f 100644 --- a/README.md +++ b/README.md @@ -1,29 +1,34 @@ # GoodFood 2.0 -GoodFood 2.0 is a food ordering application for Good Food, a company specializing in food services in France, Belgium, and Luxembourg. +GoodFood 2.0 is a food ordering application for Good Food, a company specializing in food services in France, Belgium, +and Luxembourg. ## Origin / Context -Good Food was formed from the merger of four food companies. The company offers various food services, including conventional dining, takeout, and delivery with phone orders. Ordering is also available through a web or mobile application. +Good Food was formed from the merger of four food companies. The company offers various food services, including +conventional dining, takeout, and delivery with phone orders. Ordering is also available through a web or mobile +application. -The GoodFood 2.0 project was initiated to update the existing ordering application, which had become outdated and was unable to handle more users. The objective is to create a modern, user-friendly, and modular new version that can handle a high volume of concurrent users, up to several thousand. +The GoodFood 2.0 project was initiated to update the existing ordering application, which had become outdated and was +unable to handle more users. The objective is to create a modern, user-friendly, and modular new version that can handle +a high volume of concurrent users, up to several thousand. ## Microservices ports | Service | Port | Language | Database | Status | Assignee | -| ----------- | ----- | ----------- | ---------- | ------ | --------------- | -| Gateway | 50000 | Go | ❌ | ❌ | @Anatole-Godard | -| User (auth) | 50001 | Go | PostgreSQL | ❌ | @Anatole-Godard | -| Basket | 50002 | NodeJS (ts) | Redis | ❌ | @Anatole-Godard | -| Payment | 50003 | NodeJS (ts) | PostgreSQL | ✅ | @floriaaan | -| Product | 50004 | NodeJS (ts) | PostgreSQL | ❌ | @PierreLbg | -| Restaurant | 50005 | NodeJS (ts) | PostgreSQL | ❌ | @PierreLbg | -| Promotion | 50006 | NodeJS (ts) | PostgreSQL | ❌ | @PierreLbg | -| Order | 50007 | NodeJS (ts) | PostgreSQL | ✅ | @floriaaan | -| Delivery | 50008 | NodeJS (ts) | PostgreSQL | ✅ | @floriaaan | +|-------------|-------|-------------|------------|--------|-----------------| +| Gateway | 50000 | Go | ❌ | ❌ | @Anatole-Godard | +| User (auth) | 50001 | Go | PostgreSQL | ⚠️ | @Anatole-Godard | +| Basket | 50002 | NodeJS (ts) | Redis | ⚠️ | @Anatole-Godard | +| Payment | 50003 | NodeJS (ts) | PostgreSQL | ✅ | @floriaaan | +| Product | 50004 | NodeJS (ts) | PostgreSQL | ❌ | @PierreLbg | +| Restaurant | 50005 | NodeJS (ts) | PostgreSQL | ❌ | @PierreLbg | +| Promotion | 50006 | NodeJS (ts) | PostgreSQL | ❌ | @PierreLbg | +| Order | 50007 | NodeJS (ts) | PostgreSQL | ✅ | @floriaaan | +| Delivery | 50008 | NodeJS (ts) | PostgreSQL | ✅ | @floriaaan | | Stock | 50009 | NodeJS (ts) | PostgreSQL | ⚠️ | @floriaaan | | Reporting | 50020 | C# (dotnet) | PostgreSQL | ⚠️ | @floriaaan | -| Log | 50021 | Go | PostgreSQL | ✅ | @floriaaan | +| Log | 50021 | Go | PostgreSQL | ✅ | @floriaaan | | (...) | (...) | (...) | (...) | (...) | ## File Hierarchy From df2ad4f9e818227fab1e1af4568eabcd1474dbd8 Mon Sep 17 00:00:00 2001 From: anatole Date: Tue, 15 Aug 2023 14:28:13 +0200 Subject: [PATCH 368/883] feat(gateway): add the basket controller --- services/gateway/.env.example | 2 +- .../controller/basket/basket.controller.ts | 67 +++++++++++++++++++ .../src/services/clients/basket.client.ts | 8 +++ 3 files changed, 76 insertions(+), 1 deletion(-) create mode 100644 services/gateway/src/controller/basket/basket.controller.ts create mode 100644 services/gateway/src/services/clients/basket.client.ts diff --git a/services/gateway/.env.example b/services/gateway/.env.example index 0389f414..294a02cf 100644 --- a/services/gateway/.env.example +++ b/services/gateway/.env.example @@ -1,6 +1,6 @@ GATEWAY_PORT=50000 GATEWAY_USER_URL=user-service:50001 -GATEWAY_BASKET_URL=50002 +GATEWAY_BASKET_URL=basket-service:50002 GATEWAY_PAYMENT_URL=50003 GATEWAY_PRODUCT_URL=product-service:50004 GATEWAY_RESTAURANT_URL=50005 diff --git a/services/gateway/src/controller/basket/basket.controller.ts b/services/gateway/src/controller/basket/basket.controller.ts new file mode 100644 index 00000000..32b84506 --- /dev/null +++ b/services/gateway/src/controller/basket/basket.controller.ts @@ -0,0 +1,67 @@ +import {Request, Response, Router} from "express"; +import {ProductRequest, RestaurantRequest, UserId} from "@gateway/proto/basket_pb"; +import {basketServiceClient} from "@gateway/services/clients/basket.client"; + +export const basketRoutes = Router(); + +basketRoutes.get('/api/basket/:userId', (req: Request, res: Response) => { + const {userId} = req.params; + + basketServiceClient.getBasket(new UserId().setId(Number(userId)), (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } + }); +}); + +basketRoutes.post('/api/basket', (req: Request, res: Response) => { + const {userId, productId, restaurantId} = req.body; + const basketRequest = new ProductRequest().setUserId(userId).setProductId(productId).setRestaurantId(restaurantId); + basketServiceClient.addProduct(basketRequest, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } + } + ); +}); + +basketRoutes.delete('/api/basket', (req: Request, res: Response) => { + const {userId, productId, restaurantId} = req.body; + const basketRequest = new ProductRequest().setUserId(userId).setProductId(productId).setRestaurantId(restaurantId); + basketServiceClient.deleteProduct(basketRequest, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } + } + ); +}); + +basketRoutes.put('/api/basket/restaurant', (req: Request, res: Response) => { + const {restaurantId, userId} = req.body; + basketServiceClient.updateRestaurant(new RestaurantRequest().setRestaurantId(restaurantId).setUserId(userId), (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } + } + ); +}); + +basketRoutes.post('/api/basket/reset', (req: Request, res: Response) => { + const {userId} = req.body; + basketServiceClient.reset(new UserId().setId(userId), (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } + } + ); +}); diff --git a/services/gateway/src/services/clients/basket.client.ts b/services/gateway/src/services/clients/basket.client.ts new file mode 100644 index 00000000..073dbc11 --- /dev/null +++ b/services/gateway/src/services/clients/basket.client.ts @@ -0,0 +1,8 @@ +import services from '../../proto/basket_grpc_pb'; +import * as grpc from '@grpc/grpc-js'; + +const url = process.env.GATEWAY_BASKET_URL || "localhost:50002"; + +export const basketServiceClient = new services.BasketServiceClient( + url, + grpc.credentials.createInsecure()); \ No newline at end of file From 679b9a53c06d95672d59402cb73e0fe7699c86c6 Mon Sep 17 00:00:00 2001 From: anatole Date: Tue, 15 Aug 2023 14:28:57 +0200 Subject: [PATCH 369/883] feat(gateway): add a logger --- services/gateway/src/lib/log/log.ts | 74 +++++++++++++++++++++++++++++ services/gateway/src/server.ts | 18 +++++-- 2 files changed, 88 insertions(+), 4 deletions(-) create mode 100644 services/gateway/src/lib/log/log.ts diff --git a/services/gateway/src/lib/log/log.ts b/services/gateway/src/lib/log/log.ts new file mode 100644 index 00000000..3dc6f37a --- /dev/null +++ b/services/gateway/src/lib/log/log.ts @@ -0,0 +1,74 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ +/* eslint-disable no-console */ + +function getStackTrace() { + let stack; + + try { + throw new Error(""); + } catch (error) { + stack = (error as Error).stack || ""; + } + + stack = stack.split("\n").map((line) => line.trim()); + return stack.splice(stack[0] === "Error" ? 2 : 1); +} + +const getInitiator = () => { + // _getInitiatorLine, _ObjectInfoLine, caller + const [, , caller] = getStackTrace(); + const file = caller.split("/").at(-1) || ""; + return file.replace(")", ""); +}; + +const warn = (...args: any[]) => { + console.group( + `\x1b[33m${new Date().toISOString()} - WARN - ${getInitiator()}\x1b[0m` + ); + console.warn(...args); + console.groupEnd(); +}; +const error = (...args: any[]) => { + console.group( + `\x1b[31m${new Date().toISOString()} - ERROR - ${getInitiator()}\x1b[0m` + ); + console.error(...args); + console.groupEnd(); +}; +const info = (...args: any[]) => { + console.group( + `\x1b[34m${new Date().toISOString()} - INFO - ${getInitiator()}\x1b[0m` + ); + console.log(...args); + console.groupEnd(); +}; +const debug = (...args: any[]) => { + console.log(...args); +}; + +/** + * @description a simple interface logger for logging to the console and into a log drain in the future + * @example + * log.warn('this is a warning'); + * log.error('this is an error'); + * log.info('this is an info'); + * @exports log + */ +export const log = { + warn, + error, + info, + debug, +}; + +export const utils = { + bold: (text: string) => `\x1b[1m${text}\x1b[0m`, + red: (text: string) => `\x1b[31m${text}\x1b[0m`, + green: (text: string) => `\x1b[32m${text}\x1b[0m`, + yellow: (text: string) => `\x1b[33m${text}\x1b[0m`, + blue: (text: string) => `\x1b[34m${text}\x1b[0m`, + magenta: (text: string) => `\x1b[35m${text}\x1b[0m`, + cyan: (text: string) => `\x1b[36m${text}\x1b[0m`, + white: (text: string) => `\x1b[37m${text}\x1b[0m`, + gray: (text: string) => `\x1b[90m${text}\x1b[0m`, +}; diff --git a/services/gateway/src/server.ts b/services/gateway/src/server.ts index 8a289c5e..8e7fbb0c 100644 --- a/services/gateway/src/server.ts +++ b/services/gateway/src/server.ts @@ -5,11 +5,13 @@ import {categoryRoutes} from "@gateway/controller/product/category.controller"; import {allergenRoutes} from "@gateway/controller/product/allergen.controller"; import {deliveryRoutes} from "@gateway/controller/delivery/delivery.controller"; import {deliveryPersonRoutes} from "@gateway/controller/delivery/deliveryPerson.controller"; -import {promotionsRoutes} from "@gateway/controller/promotions/promotions.controller"; +import {promotionRoutes} from "@gateway/controller/promotion/promotion.controller"; import {stockPersonRoutes} from "@gateway/controller/stock/stockPerson.controller"; import {stockRoutes} from "@gateway/controller/stock/stock.controller"; import {logRoutes} from "@gateway/controller/log/log.controller"; import {metricRoutes} from "@gateway/controller/metric/metric.controller"; +import {basketRoutes} from "@gateway/controller/basket/basket.controller"; +import {log, utils} from "@gateway/lib/log/log"; const express = require('express'); const bodyParser = require('body-parser'); @@ -22,6 +24,9 @@ const PORT = process.env.GATEWAY_PORT || 50000; app.use('/', userRoutes // #swagger.tags = ['User'] ); +app.use('/', basketRoutes +// #swagger.tags = ['Basket'] +); app.use('/', orderRoutes // #swagger.tags = ['Order'] ); @@ -46,8 +51,8 @@ app.use('/', logRoutes app.use('/', metricRoutes // #swagger.tags = ['Metric'] ); -app.use('/', promotionsRoutes -// #swagger.tags = ['Promotions'] +app.use('/', promotionRoutes +// #swagger.tags = ['Promotion'] ); app.use('/', stockRoutes // #swagger.tags = ['Stock'] @@ -57,5 +62,10 @@ app.use('/', stockPersonRoutes ); app.listen(PORT, () => { - console.log(`API Gateway is running on port ${PORT}`); + const message = `---- ${utils.green("good")}${utils.yellow( + "food" + )} Gateway ----\nstarted on: ${utils.bold(`0.0.0.0:${PORT}`)} ${utils.green( + "✓" + )}\n`; + log.debug(message); }); \ No newline at end of file From 1cebdda414349501185f3a4725c4893871ab4a87 Mon Sep 17 00:00:00 2001 From: anatole Date: Tue, 15 Aug 2023 14:29:12 +0200 Subject: [PATCH 370/883] feat(gateway): move the swagger lib --- services/gateway/package.json | 2 +- .../src/lib/swagger/swagger-output.json | 2257 +++++++++++++++++ .../{utils => lib/swagger}/swagger.utils.js | 2 +- 3 files changed, 2259 insertions(+), 2 deletions(-) create mode 100644 services/gateway/src/lib/swagger/swagger-output.json rename services/gateway/src/{utils => lib/swagger}/swagger.utils.js (92%) diff --git a/services/gateway/package.json b/services/gateway/package.json index d9605784..541b8419 100644 --- a/services/gateway/package.json +++ b/services/gateway/package.json @@ -9,7 +9,7 @@ "test": "vitest", "coverage": "vitest --coverage", "generate:proto": "sh proto/build-protos.sh", - "swagger": "node src/utils/swagger.utils.js", + "swagger": "node src/lib/swagger/swagger.utils.js", "pkg": "pkg ." }, "dependencies": { diff --git a/services/gateway/src/lib/swagger/swagger-output.json b/services/gateway/src/lib/swagger/swagger-output.json new file mode 100644 index 00000000..52ea1718 --- /dev/null +++ b/services/gateway/src/lib/swagger/swagger-output.json @@ -0,0 +1,2257 @@ +{ + "swagger": "2.0", + "info": { + "title": "The Gateway API", + "description": "The Gateway API for the Microservices", + "version": "1.0.0" + }, + "host": "localhost:50000", + "basePath": "/", + "schemes": [ + "http" + ], + "paths": { + "/api/user/{id}": { + "get": { + "tags": [ + "User" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + }, + "put": { + "tags": [ + "User" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "authorization", + "in": "header", + "type": "string" + }, + { + "name": "body", + "in": "body", + "schema": { + "type": "object", + "properties": { + "firstName": { + "example": "any" + }, + "lastName": { + "example": "any" + }, + "email": { + "example": "any" + }, + "phone": { + "example": "any" + }, + "address": { + "example": "any" + }, + "role": { + "example": "any" + } + } + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + }, + "delete": { + "tags": [ + "User" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "authorization", + "in": "header", + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/user": { + "get": { + "tags": [ + "User" + ], + "description": "", + "responses": { + "200": { + "description": "OK" + } + } + }, + "post": { + "tags": [ + "User" + ], + "description": "", + "parameters": [ + { + "name": "body", + "in": "body", + "schema": { + "type": "object", + "properties": { + "firstName": { + "example": "any" + }, + "lastName": { + "example": "any" + }, + "email": { + "example": "any" + }, + "password": { + "example": "any" + }, + "phone": { + "example": "any" + }, + "address": { + "example": "any" + }, + "role": { + "example": "any" + } + } + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/user/login": { + "post": { + "tags": [ + "User" + ], + "description": "", + "parameters": [ + { + "name": "body", + "in": "body", + "schema": { + "type": "object", + "properties": { + "email": { + "example": "any" + }, + "password": { + "example": "any" + } + } + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/user/validate": { + "post": { + "tags": [ + "User" + ], + "description": "", + "parameters": [ + { + "name": "authorization", + "in": "header", + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/user/{id}/password": { + "put": { + "tags": [ + "User" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "authorization", + "in": "header", + "type": "string" + }, + { + "name": "body", + "in": "body", + "schema": { + "type": "object", + "properties": { + "oldpassword": { + "example": "any" + }, + "password": { + "example": "any" + } + } + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/user/{id}/role": { + "put": { + "tags": [ + "User" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "authorization", + "in": "header", + "type": "string" + }, + { + "name": "body", + "in": "body", + "schema": { + "type": "object", + "properties": { + "role": { + "example": "any" + } + } + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/basket/{userId}": { + "get": { + "tags": [ + "Basket" + ], + "description": "", + "parameters": [ + { + "name": "userId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/basket": { + "post": { + "tags": [ + "Basket" + ], + "description": "", + "parameters": [ + { + "name": "body", + "in": "body", + "schema": { + "type": "object", + "properties": { + "userId": { + "example": "any" + }, + "productId": { + "example": "any" + }, + "restaurantId": { + "example": "any" + } + } + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + }, + "delete": { + "tags": [ + "Basket" + ], + "description": "", + "parameters": [ + { + "name": "body", + "in": "body", + "schema": { + "type": "object", + "properties": { + "userId": { + "example": "any" + }, + "productId": { + "example": "any" + }, + "restaurantId": { + "example": "any" + } + } + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/basket/restaurant": { + "put": { + "tags": [ + "Basket" + ], + "description": "", + "parameters": [ + { + "name": "body", + "in": "body", + "schema": { + "type": "object", + "properties": { + "restaurantId": { + "example": "any" + }, + "userId": { + "example": "any" + } + } + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/basket/reset": { + "post": { + "tags": [ + "Basket" + ], + "description": "", + "parameters": [ + { + "name": "body", + "in": "body", + "schema": { + "type": "object", + "properties": { + "userId": { + "example": "any" + } + } + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/order/{id}": { + "get": { + "tags": [ + "Order" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/order": { + "post": { + "tags": [ + "Order" + ], + "description": "", + "parameters": [ + { + "name": "body", + "in": "body", + "schema": { + "type": "object", + "properties": { + "paymentId": { + "example": "any" + }, + "deliveryId": { + "example": "any" + }, + "deliveryType": { + "example": "any" + }, + "basketSnapshot": { + "example": "any" + }, + "restaurantId": { + "example": "any" + } + } + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/order/by-user/{userId}": { + "get": { + "tags": [ + "Order" + ], + "description": "", + "parameters": [ + { + "name": "userId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/order/by-status": { + "post": { + "tags": [ + "Order" + ], + "description": "", + "parameters": [ + { + "name": "body", + "in": "body", + "schema": { + "type": "object", + "properties": { + "status": { + "example": "any" + } + } + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/order/by-delivery/{deliveryId}": { + "get": { + "tags": [ + "Order" + ], + "description": "", + "parameters": [ + { + "name": "deliveryId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/order/by-payment/{paymentId}": { + "get": { + "tags": [ + "Order" + ], + "description": "", + "parameters": [ + { + "name": "paymentId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/order/{orderId}": { + "put": { + "tags": [ + "Order" + ], + "description": "", + "parameters": [ + { + "name": "orderId", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "body", + "in": "body", + "schema": { + "type": "object", + "properties": { + "status": { + "example": "any" + }, + "deliveryId": { + "example": "any" + }, + "paymentId": { + "example": "any" + }, + "restaurantId": { + "example": "any" + } + } + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + }, + "delete": { + "tags": [ + "Order" + ], + "description": "", + "parameters": [ + { + "name": "orderId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/category": { + "get": { + "tags": [ + "Category" + ], + "description": "", + "responses": { + "200": { + "description": "OK" + } + } + }, + "post": { + "tags": [ + "Category" + ], + "description": "", + "parameters": [ + { + "name": "body", + "in": "body", + "schema": { + "type": "object", + "properties": { + "label": { + "example": "any" + }, + "icon": { + "example": "any" + }, + "hexaColor": { + "example": "any" + } + } + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/category/{id}": { + "get": { + "tags": [ + "Category" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + }, + "put": { + "tags": [ + "Category" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "body", + "in": "body", + "schema": { + "type": "object", + "properties": { + "label": { + "example": "any" + }, + "icon": { + "example": "any" + }, + "hexaColor": { + "example": "any" + } + } + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + }, + "delete": { + "tags": [ + "Category" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/allergen": { + "get": { + "tags": [ + "Allergen" + ], + "description": "", + "responses": { + "200": { + "description": "OK" + } + } + }, + "post": { + "tags": [ + "Allergen" + ], + "description": "", + "parameters": [ + { + "name": "body", + "in": "body", + "schema": { + "type": "object", + "properties": { + "label": { + "example": "any" + } + } + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/allergen/{id}": { + "get": { + "tags": [ + "Allergen" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + }, + "put": { + "tags": [ + "Allergen" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "body", + "in": "body", + "schema": { + "type": "object", + "properties": { + "label": { + "example": "any" + } + } + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + }, + "delete": { + "tags": [ + "Allergen" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/product/by-restaurant/{id}": { + "get": { + "tags": [ + "Product" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/product/{id}": { + "get": { + "tags": [ + "Product" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + }, + "delete": { + "tags": [ + "Product" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + }, + "put": { + "tags": [ + "Product" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "body", + "in": "body", + "schema": { + "type": "object", + "properties": { + "restaurantId": { + "example": "any" + }, + "type": { + "example": "any" + }, + "name": { + "example": "any" + }, + "image": { + "example": "any" + }, + "comment": { + "example": "any" + }, + "price": { + "example": "any" + }, + "preparation": { + "example": "any" + }, + "weight": { + "example": "any" + }, + "kilocalories": { + "example": "any" + }, + "nutriscore": { + "example": "any" + }, + "categories": { + "example": "any" + }, + "allergens": { + "example": "any" + } + } + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/product/type": { + "get": { + "tags": [ + "Product" + ], + "description": "", + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/product": { + "post": { + "tags": [ + "Product" + ], + "description": "", + "parameters": [ + { + "name": "body", + "in": "body", + "schema": { + "type": "object", + "properties": { + "restaurantId": { + "example": "any" + }, + "type": { + "example": "any" + }, + "name": { + "example": "any" + }, + "image": { + "example": "any" + }, + "comment": { + "example": "any" + }, + "price": { + "example": "any" + }, + "preparation": { + "example": "any" + }, + "weight": { + "example": "any" + }, + "kilocalories": { + "example": "any" + }, + "nutriscore": { + "example": "any" + }, + "categories": { + "example": "any" + }, + "allergens": { + "example": "any" + } + } + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/product/image": { + "post": { + "tags": [ + "Product" + ], + "description": "", + "parameters": [ + { + "name": "body", + "in": "body", + "schema": { + "type": "object", + "properties": { + "input_file": { + "example": "any" + } + } + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/delivery/{id}": { + "get": { + "tags": [ + "Delivery" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + }, + "put": { + "tags": [ + "Delivery" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "body", + "in": "body", + "schema": { + "type": "object", + "properties": { + "eta": { + "example": "any" + }, + "address": { + "example": "any" + }, + "status": { + "example": "any" + }, + "deliveryPersonId": { + "example": "any" + }, + "userId": { + "example": "any" + }, + "restaurantId": { + "example": "any" + } + } + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + }, + "delete": { + "tags": [ + "Delivery" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/delivery/by-restaurant/{id}": { + "get": { + "tags": [ + "Delivery" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/delivery/by-user/{id}": { + "get": { + "tags": [ + "Delivery" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/delivery": { + "post": { + "tags": [ + "Delivery" + ], + "description": "", + "parameters": [ + { + "name": "body", + "in": "body", + "schema": { + "type": "object", + "properties": { + "eta": { + "example": "any" + }, + "address": { + "example": "any" + }, + "status": { + "example": "any" + }, + "deliveryPersonId": { + "example": "any" + }, + "userId": { + "example": "any" + }, + "restaurantId": { + "example": "any" + } + } + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/delivery-person/{id}": { + "get": { + "tags": [ + "DeliveryPerson" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + }, + "put": { + "tags": [ + "DeliveryPerson" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "body", + "in": "body", + "schema": { + "type": "object", + "properties": { + "firstName": { + "example": "any" + }, + "lastName": { + "example": "any" + }, + "phone": { + "example": "any" + }, + "locationList": { + "example": "any" + } + } + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + }, + "delete": { + "tags": [ + "DeliveryPerson" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/delivery-person": { + "get": { + "tags": [ + "DeliveryPerson" + ], + "description": "", + "responses": { + "200": { + "description": "OK" + } + } + }, + "post": { + "tags": [ + "DeliveryPerson" + ], + "description": "", + "parameters": [ + { + "name": "body", + "in": "body", + "schema": { + "type": "object", + "properties": { + "firstName": { + "example": "any" + }, + "lastName": { + "example": "any" + }, + "phone": { + "example": "any" + }, + "locationList": { + "example": "any" + } + } + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/log": { + "get": { + "tags": [ + "Log" + ], + "description": "", + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/log/{id}": { + "get": { + "tags": [ + "Log" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/metric/{key}": { + "get": { + "tags": [ + "Metric" + ], + "description": "", + "parameters": [ + { + "name": "key", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/metric": { + "post": { + "tags": [ + "Metric" + ], + "description": "", + "parameters": [ + { + "name": "body", + "in": "body", + "schema": { + "type": "object", + "properties": { + "restaurantId": { + "example": "any" + }, + "code": { + "example": "any" + }, + "value": { + "example": "any" + }, + "key": { + "example": "any" + } + } + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/promotion/{code}": { + "get": { + "tags": [ + "Promotion" + ], + "description": "", + "parameters": [ + { + "name": "code", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/promotion": { + "get": { + "tags": [ + "Promotion" + ], + "description": "", + "responses": { + "200": { + "description": "OK" + } + } + }, + "post": { + "tags": [ + "Promotion" + ], + "description": "", + "parameters": [ + { + "name": "body", + "in": "body", + "schema": { + "type": "object", + "properties": { + "code": { + "example": "any" + }, + "reduction": { + "example": "any" + }, + "method": { + "example": "any" + }, + "restaurantId": { + "example": "any" + } + } + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/promotion/by-restaurant/{restaurantId}": { + "get": { + "tags": [ + "Promotion" + ], + "description": "", + "parameters": [ + { + "name": "restaurantId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/promotion/{id}": { + "put": { + "tags": [ + "Promotion" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "body", + "in": "body", + "schema": { + "type": "object", + "properties": { + "code": { + "example": "any" + }, + "reduction": { + "example": "any" + }, + "method": { + "example": "any" + }, + "restaurantId": { + "example": "any" + } + } + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + }, + "delete": { + "tags": [ + "Promotion" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/stock/supplier/{id}": { + "get": { + "tags": [ + "Stock" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + }, + "put": { + "tags": [ + "Stock" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "body", + "in": "body", + "schema": { + "type": "object", + "properties": { + "name": { + "example": "any" + }, + "contact": { + "example": "any" + } + } + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + }, + "delete": { + "tags": [ + "Stock" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/stock/supplier": { + "get": { + "tags": [ + "Stock" + ], + "description": "", + "responses": { + "200": { + "description": "OK" + } + } + }, + "post": { + "tags": [ + "Stock" + ], + "description": "", + "parameters": [ + { + "name": "body", + "in": "body", + "schema": { + "type": "object", + "properties": { + "name": { + "example": "any" + }, + "contact": { + "example": "any" + } + } + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/stock/ingredient/{id}": { + "get": { + "tags": [ + "Stock" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + }, + "put": { + "tags": [ + "Stock" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "body", + "in": "body", + "schema": { + "type": "object", + "properties": { + "name": { + "example": "any" + }, + "desciption": { + "example": "any" + } + } + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + }, + "delete": { + "tags": [ + "Stock" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/stock/ingredient": { + "get": { + "tags": [ + "Stock" + ], + "description": "", + "responses": { + "200": { + "description": "OK" + } + } + }, + "post": { + "tags": [ + "Stock" + ], + "description": "", + "parameters": [ + { + "name": "body", + "in": "body", + "schema": { + "type": "object", + "properties": { + "name": { + "example": "any" + }, + "desciption": { + "example": "any" + } + } + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/stock/ingredient/restaurant/{id}": { + "get": { + "tags": [ + "Stock" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + }, + "put": { + "tags": [ + "Stock" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "body", + "in": "body", + "schema": { + "type": "object", + "properties": { + "alertThreshold": { + "example": "any" + }, + "quantity": { + "example": "any" + }, + "productList": { + "example": "any" + }, + "unitPrice": { + "example": "any" + }, + "pricePerKilo": { + "example": "any" + }, + "restaurantId": { + "example": "any" + }, + "ingredientId": { + "example": "any" + } + } + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + }, + "delete": { + "tags": [ + "Stock" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/stock/ingredient/restaurant/by-restaurant/{id}": { + "get": { + "tags": [ + "Stock" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/stock/ingredient/restaurant/by-product/{id}": { + "get": { + "tags": [ + "Stock" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/stock/ingredient/restaurant": { + "post": { + "tags": [ + "Stock" + ], + "description": "", + "parameters": [ + { + "name": "body", + "in": "body", + "schema": { + "type": "object", + "properties": { + "alertThreshold": { + "example": "any" + }, + "quantity": { + "example": "any" + }, + "productList": { + "example": "any" + }, + "unitPrice": { + "example": "any" + }, + "pricePerKilo": { + "example": "any" + }, + "restaurantId": { + "example": "any" + }, + "ingredientId": { + "example": "any" + } + } + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/stock/supply/order/{id}": { + "get": { + "tags": [ + "Stock" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + }, + "put": { + "tags": [ + "Stock" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "body", + "in": "body", + "schema": { + "type": "object", + "properties": { + "quantity": { + "example": "any" + }, + "ingredientRestaurantId": { + "example": "any" + }, + "supplierId": { + "example": "any" + } + } + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + }, + "delete": { + "tags": [ + "Stock" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/stock/supply/order/by-restaurant/{id}": { + "get": { + "tags": [ + "Stock" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/stock/supply/order/by-supplier/{id}": { + "get": { + "tags": [ + "Stock" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/stock/supply/order/by-ingredient-restaurant/{id}": { + "get": { + "tags": [ + "Stock" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/stock/supply/order": { + "post": { + "tags": [ + "Stock" + ], + "description": "", + "parameters": [ + { + "name": "body", + "in": "body", + "schema": { + "type": "object", + "properties": { + "quantity": { + "example": "any" + }, + "ingredientRestaurantId": { + "example": "any" + }, + "supplierId": { + "example": "any" + } + } + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/stock/outcomes/by-restaurant/{id}": { + "post": { + "tags": [ + "StockPerson" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "body", + "in": "body", + "schema": { + "type": "object", + "properties": { + "date": { + "example": "any" + }, + "interval": { + "example": "any" + } + } + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + } + } +} \ No newline at end of file diff --git a/services/gateway/src/utils/swagger.utils.js b/services/gateway/src/lib/swagger/swagger.utils.js similarity index 92% rename from services/gateway/src/utils/swagger.utils.js rename to services/gateway/src/lib/swagger/swagger.utils.js index 22323e2c..f1f701c7 100644 --- a/services/gateway/src/utils/swagger.utils.js +++ b/services/gateway/src/lib/swagger/swagger.utils.js @@ -9,7 +9,7 @@ const doc = { }; const outputFile = './swagger-output.json'; -const routes = ['../server.ts',]; +const routes = ['../../server.ts',]; /* NOTE: If you are using the express Router, you must pass in the 'routes' only the root file where the route starts, such as index.js, app.js, routes.js, etc ... */ From f1a62a1ec276720756f6543bcf765c07d4f6bd20 Mon Sep 17 00:00:00 2001 From: Anatole-Godard <48732483+Anatole-Godard@users.noreply.github.com> Date: Tue, 15 Aug 2023 17:45:53 +0200 Subject: [PATCH 371/883] Update services/basket/k8s/configmap.yml Co-authored-by: Florian Leroux <10078837+floriaaan@users.noreply.github.com> --- services/basket/k8s/configmap.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/basket/k8s/configmap.yml b/services/basket/k8s/configmap.yml index 0416dc27..b25a71ac 100644 --- a/services/basket/k8s/configmap.yml +++ b/services/basket/k8s/configmap.yml @@ -5,4 +5,4 @@ metadata: labels: app: goodfood-basket data: - port: "50008" \ No newline at end of file + port: "50002" \ No newline at end of file From cded2469d5f7001789b805d88d496d6de788d366 Mon Sep 17 00:00:00 2001 From: Anatole-Godard <48732483+Anatole-Godard@users.noreply.github.com> Date: Tue, 15 Aug 2023 17:45:59 +0200 Subject: [PATCH 372/883] Update services/basket/k8s/deployment.yml Co-authored-by: Florian Leroux <10078837+floriaaan@users.noreply.github.com> --- services/basket/k8s/deployment.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/basket/k8s/deployment.yml b/services/basket/k8s/deployment.yml index db5f16d4..f2516d51 100644 --- a/services/basket/k8s/deployment.yml +++ b/services/basket/k8s/deployment.yml @@ -28,4 +28,4 @@ spec: name: goodfood-basket-configmap key: port ports: - - containerPort: 50008 + - containerPort: 50002 From 80e4ff02bd3263c34a1b9ecab7d7d03f94fc8b81 Mon Sep 17 00:00:00 2001 From: Anatole-Godard <48732483+Anatole-Godard@users.noreply.github.com> Date: Tue, 15 Aug 2023 17:46:06 +0200 Subject: [PATCH 373/883] Update services/basket/k8s/ingress.yml Co-authored-by: Florian Leroux <10078837+floriaaan@users.noreply.github.com> --- services/basket/k8s/ingress.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/basket/k8s/ingress.yml b/services/basket/k8s/ingress.yml index 6a28f270..2441f673 100644 --- a/services/basket/k8s/ingress.yml +++ b/services/basket/k8s/ingress.yml @@ -13,5 +13,5 @@ spec: service: name: goodfood-basket port: - number: 50008 + number: 50002 path: / \ No newline at end of file From e06f0709d5a1bb85492bbfcac7e12a6187b6cfd8 Mon Sep 17 00:00:00 2001 From: Anatole-Godard <48732483+Anatole-Godard@users.noreply.github.com> Date: Tue, 15 Aug 2023 17:46:12 +0200 Subject: [PATCH 374/883] Update services/basket/src/server.ts Co-authored-by: Florian Leroux <10078837+floriaaan@users.noreply.github.com> --- services/basket/src/server.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/basket/src/server.ts b/services/basket/src/server.ts index 7272b2f1..cb5919c9 100644 --- a/services/basket/src/server.ts +++ b/services/basket/src/server.ts @@ -19,7 +19,7 @@ const PROTO_PATH = resolvePath(__dirname + "/../../proto/basket.proto"); const packageDefinition = loadSync(PROTO_PATH, options); const grpc = loadPackageDefinition(packageDefinition) as any; const { - BasketService: {service: ds}, + BasketService: {service: bs}, } = grpc.com.goodfood.basket; const server = createServerProxy(new Server()); From 369f2ee900c7bc32061961981e6eae78aea5d0b8 Mon Sep 17 00:00:00 2001 From: Anatole-Godard <48732483+Anatole-Godard@users.noreply.github.com> Date: Tue, 15 Aug 2023 17:46:18 +0200 Subject: [PATCH 375/883] Update services/basket/src/server.ts Co-authored-by: Florian Leroux <10078837+floriaaan@users.noreply.github.com> --- services/basket/src/server.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/basket/src/server.ts b/services/basket/src/server.ts index cb5919c9..49524b83 100644 --- a/services/basket/src/server.ts +++ b/services/basket/src/server.ts @@ -23,7 +23,7 @@ const { } = grpc.com.goodfood.basket; const server = createServerProxy(new Server()); -server.addService(ds, basketHandlers); +server.addService(bs, basketHandlers); server.use(logGRPC); server.bindAsync(ADDRESS, serverInsecure, () => { From 270430d160dcea0451f1b769a3faae0b80fc9f49 Mon Sep 17 00:00:00 2001 From: anatole Date: Tue, 15 Aug 2023 17:55:20 +0200 Subject: [PATCH 376/883] feat(global): create docker compose with delivery and the gateway --- services/delivery/.env.example | 4 +++- services/docker-compose.yml | 4 +++- services/gateway/README.md | 3 ++- services/gateway/package.json | 2 +- .../controller/delivery/delivery.controller.ts | 16 ++++++++++++---- .../delivery/deliveryPerson.controller.ts | 2 +- 6 files changed, 22 insertions(+), 9 deletions(-) diff --git a/services/delivery/.env.example b/services/delivery/.env.example index e7b2b4e7..1982e30b 100644 --- a/services/delivery/.env.example +++ b/services/delivery/.env.example @@ -1,2 +1,4 @@ DATABASE_URL=postgres://postgres:password@localhost:5432/postgres -PORT=50008 \ No newline at end of file +PORT=50008 +# with docker add : +# REDIS_HOST: delivery-redis \ No newline at end of file diff --git a/services/docker-compose.yml b/services/docker-compose.yml index d33b434f..d6ed1da8 100644 --- a/services/docker-compose.yml +++ b/services/docker-compose.yml @@ -48,9 +48,11 @@ services: context: . dockerfile: ./delivery/Dockerfile env_file: - - ./delivery/.env + - delivery/.env.docker ports: - "50008:50008" + networks: + - goodfood-network volumes: goodfood-delivery-volume: diff --git a/services/gateway/README.md b/services/gateway/README.md index 9aeb77bc..16b83558 100644 --- a/services/gateway/README.md +++ b/services/gateway/README.md @@ -36,7 +36,8 @@ You can use the following tools to help you with the setup: 3. Run `npm install` to install the necessary dependencies. 4. Create a `.env` file at the root of the project directory and add the environment variables values ( see `.env.example`). -5. Run `sh proto/build-protos.sh` to generate js file to create the clients. Then replace all "grpc" package iteration by "@grpc/grpc-js" +5. Run `sh proto/build-protos.sh` to generate js file to create the clients. +5.1. Then replace all "grpc" package iteration by "@grpc/grpc-js" 6. Run `npm run start` to start the microservice. You can now access the microservice at `http://localhost:50000`. diff --git a/services/gateway/package.json b/services/gateway/package.json index 541b8419..3701cf5e 100644 --- a/services/gateway/package.json +++ b/services/gateway/package.json @@ -5,7 +5,7 @@ "scripts": { "start": "node dist/index.js", "dev": "nodemon --watch 'src/**/*.ts' --exec 'ts-node' src/server.ts", - "build": "esbuild src/server.ts --bundle --platform=node --target=node18 --outfile=dist/index.js", + "build": "esbuild src/server.ts --bundle --platform=node --target=node18 --outfile=dist/index.js --minify", "test": "vitest", "coverage": "vitest --coverage", "generate:proto": "sh proto/build-protos.sh", diff --git a/services/gateway/src/controller/delivery/delivery.controller.ts b/services/gateway/src/controller/delivery/delivery.controller.ts index 8be781d9..233ea460 100644 --- a/services/gateway/src/controller/delivery/delivery.controller.ts +++ b/services/gateway/src/controller/delivery/delivery.controller.ts @@ -1,6 +1,6 @@ import {Request, Response, Router} from "express"; import {deliveryServiceClient} from "@gateway/services/clients/delivery.client"; -import {Delivery, DeliveryCreateInput, DeliveryId, RestaurantId, UserId} from "@gateway/proto/delivery_pb"; +import {Delivery, DeliveryCreateInput, DeliveryId, RestaurantId, Status, UserId} from "@gateway/proto/delivery_pb"; export const deliveryRoutes = Router(); @@ -43,19 +43,27 @@ deliveryRoutes.get('/api/delivery/by-user/:id', (req: Request, res: Response) => }); deliveryRoutes.post('/api/delivery', (req: Request, res: Response) => { - const {eta, address, status, deliveryPersonId, userId, restaurantId} = req.body; + const {eta, address, status, deliveryPersonId, userId, restaurantId}: { + eta: string, + address: string, + status: Status, + deliveryPersonId: string, + userId: string, + restaurantId: string + } = req.body; const deliveryCreateInput = new DeliveryCreateInput().setEta(eta) .setAddress(address) .setStatus(status) .setDeliveryPersonId(deliveryPersonId) .setUserId(userId) .setRestaurantId(restaurantId); - + console.log(deliveryCreateInput.toObject()); deliveryServiceClient.createDelivery(deliveryCreateInput, (error, response) => { + console.log(error, response) if (error) { res.json({error: error.message}); } else { - res.json(response.toObject()); + res.json(response); } }); }); diff --git a/services/gateway/src/controller/delivery/deliveryPerson.controller.ts b/services/gateway/src/controller/delivery/deliveryPerson.controller.ts index 6daf58ae..033ba35e 100644 --- a/services/gateway/src/controller/delivery/deliveryPerson.controller.ts +++ b/services/gateway/src/controller/delivery/deliveryPerson.controller.ts @@ -27,7 +27,7 @@ deliveryPersonRoutes.get('/api/delivery-person', (req, res) => { }); }); -deliveryPersonRoutes.post('/api/delivery-person', (req, res) => { +deliveryPersonRoutes.get('/api/delivery-person', (req, res) => { const {lat, lng} = req.body; const location = new Location() .setLatitude(lat) From 4b44e7a63ac76a96f8974b187608c4f05c3c1309 Mon Sep 17 00:00:00 2001 From: anatole Date: Tue, 15 Aug 2023 18:47:26 +0200 Subject: [PATCH 377/883] fix(order): rename path --- services/order/tsconfig.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/order/tsconfig.json b/services/order/tsconfig.json index e59b3816..f7f47ecc 100644 --- a/services/order/tsconfig.json +++ b/services/order/tsconfig.json @@ -7,7 +7,7 @@ "esModuleInterop": true, "baseUrl": ".", "paths": { - "@gateway/*": ["src/*"] + "@order/*": ["src/*"] } }, "include": ["src/**/*.ts"], From 4953ecb1d4d7057d24cbc9e0793f654f2e3a6232 Mon Sep 17 00:00:00 2001 From: anatole Date: Tue, 15 Aug 2023 19:11:35 +0200 Subject: [PATCH 378/883] feat(global): add order service to the docker compose --- services/docker-compose.yml | 34 +++++++++++++++++++++++++++++++--- 1 file changed, 31 insertions(+), 3 deletions(-) diff --git a/services/docker-compose.yml b/services/docker-compose.yml index d6ed1da8..0d0b6a55 100644 --- a/services/docker-compose.yml +++ b/services/docker-compose.yml @@ -18,7 +18,7 @@ services: delivery-redis: image: redis:latest ports: - - "6379:6379" + - "6379" volumes: - goodfood-delivery-volume:/data networks: @@ -31,7 +31,7 @@ services: delivery-postgres: image: postgres:latest ports: - - "5432:5432" + - "5432" volumes: - goodfood-delivery-volume:/var/lib/postgresql/data networks: @@ -50,12 +50,40 @@ services: env_file: - delivery/.env.docker ports: - - "50008:50008" + - "50008" networks: - goodfood-network + # Order service + order-sercice: + image: goodfood-order:1.0.0 + build: + context: . + dockerfile: ./order/Dockerfile + env_file: + - order/.env.docker + ports: + - "50007" + networks: + - goodfood-network + + order-postgres: + image: postgres:latest + ports: + - "5432" + volumes: + - goodfood-order-volume:/var/lib/postgresql/data + networks: + - goodfood-network + environment: + POSTGRES_USER: postgres + POSTGRES_PASSWORD: password + POSTGRES_DB: postgres + PGDATA: /var/lib/postgresql/data/pgdata + volumes: goodfood-delivery-volume: + goodfood-order-volume: networks: goodfood-network: \ No newline at end of file From 2108e45ad832ef3818b0de968e0f8a203c00efa9 Mon Sep 17 00:00:00 2001 From: anatole Date: Tue, 15 Aug 2023 19:54:41 +0200 Subject: [PATCH 379/883] feat(gateway): in case of error return a 500 status --- .../controller/basket/basket.controller.ts | 13 +++++++--- .../delivery/delivery.controller.ts | 11 ++++++-- .../delivery/deliveryPerson.controller.ts | 6 +++++ .../src/controller/log/log.controller.ts | 2 ++ .../controller/metric/metric.controller.ts | 2 ++ .../src/controller/order/order.controller.ts | 8 ++++++ .../controller/product/allergen.controller.ts | 5 ++++ .../controller/product/category.controller.ts | 5 ++++ .../controller/product/product.controller.ts | 7 +++++ .../promotion/promotion.controller.ts | 6 +++++ .../src/controller/stock/stock.controller.ts | 26 +++++++++++++++++++ .../stock/stockPerson.controller.ts | 1 + .../src/controller/user/user.controller.ts | 8 ++++++ 13 files changed, 94 insertions(+), 6 deletions(-) diff --git a/services/gateway/src/controller/basket/basket.controller.ts b/services/gateway/src/controller/basket/basket.controller.ts index 32b84506..dd953884 100644 --- a/services/gateway/src/controller/basket/basket.controller.ts +++ b/services/gateway/src/controller/basket/basket.controller.ts @@ -9,6 +9,7 @@ basketRoutes.get('/api/basket/:userId', (req: Request, res: Response) => { basketServiceClient.getBasket(new UserId().setId(Number(userId)), (error, response) => { if (error) { + res.status(500) res.json({error: error.message}); } else { res.json(response.toObject()); @@ -21,7 +22,8 @@ basketRoutes.post('/api/basket', (req: Request, res: Response) => { const basketRequest = new ProductRequest().setUserId(userId).setProductId(productId).setRestaurantId(restaurantId); basketServiceClient.addProduct(basketRequest, (error, response) => { if (error) { - res.json({error: error.message}); + res.status(500) + res.json({error: error.message}); } else { res.json(response.toObject()); } @@ -34,7 +36,8 @@ basketRoutes.delete('/api/basket', (req: Request, res: Response) => { const basketRequest = new ProductRequest().setUserId(userId).setProductId(productId).setRestaurantId(restaurantId); basketServiceClient.deleteProduct(basketRequest, (error, response) => { if (error) { - res.json({error: error.message}); + res.status(500) + res.json({error: error.message}); } else { res.json(response.toObject()); } @@ -46,7 +49,8 @@ basketRoutes.put('/api/basket/restaurant', (req: Request, res: Response) => { const {restaurantId, userId} = req.body; basketServiceClient.updateRestaurant(new RestaurantRequest().setRestaurantId(restaurantId).setUserId(userId), (error, response) => { if (error) { - res.json({error: error.message}); + res.status(500) + res.json({error: error.message}); } else { res.json(response.toObject()); } @@ -58,7 +62,8 @@ basketRoutes.post('/api/basket/reset', (req: Request, res: Response) => { const {userId} = req.body; basketServiceClient.reset(new UserId().setId(userId), (error, response) => { if (error) { - res.json({error: error.message}); + res.status(500) + res.json({error: error.message}); } else { res.json(response.toObject()); } diff --git a/services/gateway/src/controller/delivery/delivery.controller.ts b/services/gateway/src/controller/delivery/delivery.controller.ts index 233ea460..33844bf5 100644 --- a/services/gateway/src/controller/delivery/delivery.controller.ts +++ b/services/gateway/src/controller/delivery/delivery.controller.ts @@ -9,6 +9,8 @@ deliveryRoutes.get('/api/delivery/:id', (req: Request, res: Response) => { deliveryServiceClient.getDelivery(new DeliveryId().setId(id), (error, response) => { if (error) { + res.status(500) + res.status(500) res.json({error: error.message}); } else { res.json(response.toObject()); @@ -22,6 +24,7 @@ deliveryRoutes.get('/api/delivery/by-restaurant/:id', (req: Request, res: Respon deliveryServiceClient.listDeliveriesByRestaurant(restaurantId, (error, response) => { if (error) { + res.status(500) res.json({error: error.message}); } else { res.json(response.toObject()); @@ -35,6 +38,7 @@ deliveryRoutes.get('/api/delivery/by-user/:id', (req: Request, res: Response) => deliveryServiceClient.listDeliveriesByUser(userId, (error, response) => { if (error) { + res.status(500) res.json({error: error.message}); } else { res.json(response.toObject()); @@ -57,13 +61,14 @@ deliveryRoutes.post('/api/delivery', (req: Request, res: Response) => { .setDeliveryPersonId(deliveryPersonId) .setUserId(userId) .setRestaurantId(restaurantId); - console.log(deliveryCreateInput.toObject()); + deliveryServiceClient.createDelivery(deliveryCreateInput, (error, response) => { console.log(error, response) if (error) { + res.status(500) res.json({error: error.message}); } else { - res.json(response); + res.json(response.toObject()); } }); }); @@ -80,6 +85,7 @@ deliveryRoutes.put('/api/delivery/:id', (req: Request, res: Response) => { deliveryServiceClient.updateDelivery(delivery, (error, response) => { if (error) { + res.status(500) res.json({error: error.message}); } else { res.json(response.toObject()); @@ -92,6 +98,7 @@ deliveryRoutes.delete('/api/delivery/:id', (req: Request, res: Response) => { deliveryServiceClient.deleteDelivery(new DeliveryId().setId(id), (error, response) => { if (error) { + res.status(500) res.json({error: error.message}); } else { res.json(response.toObject()); diff --git a/services/gateway/src/controller/delivery/deliveryPerson.controller.ts b/services/gateway/src/controller/delivery/deliveryPerson.controller.ts index 033ba35e..ab75c283 100644 --- a/services/gateway/src/controller/delivery/deliveryPerson.controller.ts +++ b/services/gateway/src/controller/delivery/deliveryPerson.controller.ts @@ -10,6 +10,7 @@ deliveryPersonRoutes.get('/api/delivery-person/:id', (req, res) => { deliveryPersonServiceClient.getDeliveryPerson(new DeliveryPersonId().setId(id), (error, response) => { if (error) { + res.status(500) res.json({error: error.message}); } else { res.json(response.toObject()); @@ -20,6 +21,7 @@ deliveryPersonRoutes.get('/api/delivery-person/:id', (req, res) => { deliveryPersonRoutes.get('/api/delivery-person', (req, res) => { deliveryPersonServiceClient.listDeliveryPersons(new Empty(), (error, response) => { if (error) { + res.status(500) res.json({error: error.message}); } else { res.json(response.toObject()); @@ -34,6 +36,7 @@ deliveryPersonRoutes.get('/api/delivery-person', (req, res) => { .setLongitude(lng); deliveryPersonServiceClient.listNearDeliveryPersons(location, (error, response) => { if (error) { + res.status(500) res.json({error: error.message}); } else { res.json(response.toObject()); @@ -50,6 +53,7 @@ deliveryPersonRoutes.post('/api/delivery-person', (req, res) => { .setLocationList(locationList); deliveryPersonServiceClient.createDeliveryPerson(deliveryPerson, (error, response) => { if (error) { + res.status(500) res.json({error: error.message}); } else { res.json(response.toObject()); @@ -68,6 +72,7 @@ deliveryPersonRoutes.put('/api/delivery-person/:id', (req, res) => { deliveryPersonServiceClient.updateDeliveryPerson(deliveryPerson, (error, response) => { if (error) { + res.status(500) res.json({error: error.message}); } else { res.json(response.toObject()); @@ -80,6 +85,7 @@ deliveryPersonRoutes.delete('/api/delivery-person/:id', (req, res) => { deliveryPersonServiceClient.deleteDeliveryPerson(new DeliveryPersonId().setId(id), (error, response) => { if (error) { + res.status(500) res.json({error: error.message}); } else { res.json(response.toObject()); diff --git a/services/gateway/src/controller/log/log.controller.ts b/services/gateway/src/controller/log/log.controller.ts index 46df363f..f42e5eaa 100644 --- a/services/gateway/src/controller/log/log.controller.ts +++ b/services/gateway/src/controller/log/log.controller.ts @@ -9,6 +9,7 @@ logRoutes.get('/api/log', (req: express.Request, res: express.Response) => { logServiceClient.listLog(new Empty(), (error, response) => { if (error) { + res.status(500) res.json({error: error.message}); } else { res.json(response.toObject()); @@ -21,6 +22,7 @@ logRoutes.get('/api/log/:id', (req: express.Request, res: express.Response) => { logServiceClient.getLog(new GetLogRequest().setId(Number(id)), (error, response) => { if (error) { + res.status(500) res.json({error: error.message}); } else { res.json(response.toObject()); diff --git a/services/gateway/src/controller/metric/metric.controller.ts b/services/gateway/src/controller/metric/metric.controller.ts index c983b96d..8225dd0d 100644 --- a/services/gateway/src/controller/metric/metric.controller.ts +++ b/services/gateway/src/controller/metric/metric.controller.ts @@ -9,6 +9,7 @@ metricRoutes.get('/api/metric/:key', (req, res) => { const metricInput = new GetMetricRequest().setKey(key); metricService.getMetric(metricInput, (error, response) => { if (error) { + res.status(500) res.json({error: error.message}); } else { res.json(response.toObject()); @@ -23,6 +24,7 @@ metricRoutes.post('/api/metric', (req, res) => { metricService.pushMetric(newMetric, (error, response) => { if (error) { + res.status(500) res.json({error: error.message}); } else { res.json(response.toObject()); diff --git a/services/gateway/src/controller/order/order.controller.ts b/services/gateway/src/controller/order/order.controller.ts index 3a822e6b..e8675eac 100644 --- a/services/gateway/src/controller/order/order.controller.ts +++ b/services/gateway/src/controller/order/order.controller.ts @@ -23,6 +23,7 @@ orderRoutes.get('/api/order/:id', (req: Request, res: Response) => { orderService.getOrder(orderId, (error, response) => { if (error) { + res.status(500) res.json({error: error.message}); } else { res.json(response.toObject()); @@ -60,6 +61,7 @@ orderRoutes.post('/api/order', (req: Request, res: Response) => { orderService.createOrder(orderInput, (error, response) => { if (error) { + res.status(500) res.json({error: error.message}); } else { res.json(response.toObject()); @@ -72,6 +74,7 @@ orderRoutes.get('/api/order/by-user/:userId', (req: Request, res: Response) => { const orderInput = new GetOrdersByUserRequest().setId(userId); orderService.getOrdersByUser(orderInput, (error, response) => { if (error) { + res.status(500) res.json({error: error.message}); } else { res.json(response.toObject()); @@ -84,6 +87,7 @@ orderRoutes.post('/api/order/by-status', (req: Request, res: Response) => { orderService.getOrdersByStatus(orderInput, (error, response) => { if (error) { + res.status(500) res.json({error: error.message}); } else { res.json(response.toObject()); @@ -96,6 +100,7 @@ orderRoutes.get('/api/order/by-delivery/:deliveryId', (req: Request, res: Respon const orderInput = new GetOrderByDeliveryRequest().setId(deliveryId); orderService.getOrderByDelivery(orderInput, (error, response) => { if (error) { + res.status(500) res.json({error: error.message}); } else { res.json(response.toObject()); @@ -108,6 +113,7 @@ orderRoutes.get('/api/order/by-payment/:paymentId', (req: Request, res: Response const orderInput = new GetOrderByPaymentRequest().setId(paymentId); orderService.getOrderByPayment(orderInput, (error, response) => { if (error) { + res.status(500) res.json({error: error.message}); } else { res.json(response.toObject()); @@ -125,6 +131,7 @@ orderRoutes.put('/api/order/:orderId', (req: Request, res: Response) => { .setRestaurantId(req.body.restaurantId); orderService.updateOrder(orderInput, (error, response) => { if (error) { + res.status(500) res.json({error: error.message}); } else { res.json(response.toObject()); @@ -137,6 +144,7 @@ orderRoutes.delete('/api/order/:orderId', (req: Request, res: Response) => { const orderInput = new DeleteOrderRequest().setId(orderId); orderService.deleteOrder(orderInput, (error, response) => { if (error) { + res.status(500) res.json({error: error.message}); } else { res.json(response.toObject()); diff --git a/services/gateway/src/controller/product/allergen.controller.ts b/services/gateway/src/controller/product/allergen.controller.ts index 55d7770d..575ae028 100644 --- a/services/gateway/src/controller/product/allergen.controller.ts +++ b/services/gateway/src/controller/product/allergen.controller.ts @@ -8,6 +8,7 @@ export const allergenRoutes = Router(); allergenRoutes.get('/api/allergen', (req: Request, res: Response) => { allergenServiceClient.getAllergenList(new Empty(), (error, response) => { if (error) { + res.status(500) res.json({error: error.message}); } else { res.json(response.toObject()); @@ -21,6 +22,7 @@ allergenRoutes.get('/api/allergen/:id', (req: Request, res: Response) => { allergenServiceClient.readAllergen(allergenId, (error, response) => { if (error) { + res.status(500) res.json({error: error.message}); } else { res.json(response.toObject()); @@ -33,6 +35,7 @@ allergenRoutes.post('/api/allergen', (req: Request, res: Response) => { const allergen = new Allergen().setLibelle(label); allergenServiceClient.createAllergen(allergen, (error, response) => { if (error) { + res.status(500) res.json({error: error.message}); } else { res.json(response.toObject()); @@ -46,6 +49,7 @@ allergenRoutes.put('/api/allergen/:id', (req: Request, res: Response) => { const allergen = new Allergen().setId(id).setLibelle(label); allergenServiceClient.updateAllergen(allergen, (error, response) => { if (error) { + res.status(500) res.json({error: error.message}); } else { res.json(response.toObject()); @@ -57,6 +61,7 @@ allergenRoutes.delete('/api/allergen/:id', (req: Request, res: Response) => { const {id} = req.params; allergenServiceClient.deleteAllergen(new AllergenId().setId(id), (error, response) => { if (error) { + res.status(500) res.json({error: error.message}); } else { res.json(response.toObject()); diff --git a/services/gateway/src/controller/product/category.controller.ts b/services/gateway/src/controller/product/category.controller.ts index dd9f9124..041b5b3c 100644 --- a/services/gateway/src/controller/product/category.controller.ts +++ b/services/gateway/src/controller/product/category.controller.ts @@ -8,6 +8,7 @@ export const categoryRoutes = Router(); categoryRoutes.get('/api/category', (req: Request, res: Response) => { categoryServiceClient.getCategoryList(new Empty(), (error, response) => { if (error) { + res.status(500) res.json({error: error.message}); } else { res.json(response.toObject()); @@ -21,6 +22,7 @@ categoryRoutes.get('/api/category/:id', (req: Request, res: Response) => { categoryServiceClient.readCategory(categoryId, (error, response) => { if (error) { + res.status(500) res.json({error: error.message}); } else { res.json(response.toObject()); @@ -33,6 +35,7 @@ categoryRoutes.post('/api/category', (req: Request, res: Response) => { const category = new Category().setLibelle(label).setIcon(icon).setHexaColor(hexaColor) categoryServiceClient.createCategory(category, (error, response) => { if (error) { + res.status(500) res.json({error: error.message}); } else { res.json(response.toObject()); @@ -46,6 +49,7 @@ categoryRoutes.put('/api/category/:id', (req: Request, res: Response) => { const category = new Category().setId(id).setLibelle(label).setIcon(icon).setHexaColor(hexaColor) categoryServiceClient.updateCategory(category, (error, response) => { if (error) { + res.status(500) res.json({error: error.message}); } else { res.json(response.toObject()); @@ -57,6 +61,7 @@ categoryRoutes.delete('/api/category/:id', (req: Request, res: Response) => { const {id} = req.params; categoryServiceClient.deleteCategory(new CategoryId().setId(id), (error, response) => { if (error) { + res.status(500) res.json({error: error.message}); } else { res.json(response.toObject()); diff --git a/services/gateway/src/controller/product/product.controller.ts b/services/gateway/src/controller/product/product.controller.ts index 4e91d2e8..378cc910 100644 --- a/services/gateway/src/controller/product/product.controller.ts +++ b/services/gateway/src/controller/product/product.controller.ts @@ -12,6 +12,7 @@ productRoutes.get('/api/product/by-restaurant/:id', (req: Request, res: Response productServiceClient.getProductList(restaurantId, (error, response) => { if (error) { + res.status(500) res.json({error: error.message}); } else { res.json(response.toObject()); @@ -25,6 +26,7 @@ productRoutes.get('/api/product/:id', (req: Request, res: Response) => { productServiceClient.readProduct(productId, (error, response) => { if (error) { + res.status(500) res.json({error: error.message}); } else { res.json(response.toObject()); @@ -35,6 +37,7 @@ productRoutes.get('/api/product/:id', (req: Request, res: Response) => { productRoutes.get('/api/product/type', (req: Request, res: Response) => { productServiceClient.getProductTypeList(new Empty(), (error, response) => { if (error) { + res.status(500) res.json({error: error.message}); } else { res.json(response.toObject()); @@ -47,6 +50,7 @@ productRoutes.delete('/api/product/:id', (req: Request, res: Response) => { const productId = new ProductId().setId(id) productServiceClient.deleteProduct(productId, (error, response) => { if (error) { + res.status(500) res.json({error: error.message}); } else { res.json(response.toObject()); @@ -90,6 +94,7 @@ productRoutes.post('/api/product', (req: Request, res: Response) => { productServiceClient.createProduct(productId, (error, response) => { if (error) { + res.status(500) res.json({error: error.message}); } else { res.json(response.toObject()); @@ -134,6 +139,7 @@ productRoutes.put('/api/product/:id', (req: Request, res: Response) => { productServiceClient.createProduct(productId, (error, response) => { if (error) { + res.status(500) res.json({error: error.message}); } else { res.json(response.toObject()); @@ -149,6 +155,7 @@ productRoutes.post('/api/product/image', (req: Request, res: Response) => { const file = new File().setName(input_file).setData(base64File); productServiceClient.uploadImage(file, (error, response) => { if (error) { + res.status(500) res.json({error: error.message}); } else { res.json(response.toObject()); diff --git a/services/gateway/src/controller/promotion/promotion.controller.ts b/services/gateway/src/controller/promotion/promotion.controller.ts index 5787c9f9..6330056f 100644 --- a/services/gateway/src/controller/promotion/promotion.controller.ts +++ b/services/gateway/src/controller/promotion/promotion.controller.ts @@ -9,6 +9,7 @@ promotionRoutes.get('/api/promotion/:code', (req, res) => { const {code} = req.params; promotionServiceClient.getPromotion(new PromotionCode().setCode(code), (error, response) => { if (error) { + res.status(500) res.json({error: error.message}); } else { res.json(response.toObject()); @@ -19,6 +20,7 @@ promotionRoutes.get('/api/promotion/:code', (req, res) => { promotionRoutes.get('/api/promotion', (req, res) => { promotionServiceClient.getPromotions(new Empty(), (error, response) => { if (error) { + res.status(500) res.json({error: error.message}); } else { res.json(response.toObject()); @@ -30,6 +32,7 @@ promotionRoutes.get('/api/promotion/by-restaurant/:restaurantId', (req, res) => const {restaurantId} = req.params; promotionServiceClient.getPromotionsByRestaurant(new RestaurantId().setId(restaurantId), (error, response) => { if (error) { + res.status(500) res.json({error: error.message}); } else { res.json(response.toObject()); @@ -45,6 +48,7 @@ promotionRoutes.post('/api/promotion', (req, res) => { .setRestaurantId(restaurantId); promotionServiceClient.createPromotion(promotionCreateInput, (error, response) => { if (error) { + res.status(500) res.json({error: error.message}); } else { res.json(response.toObject()); @@ -62,6 +66,7 @@ promotionRoutes.put('/api/promotion/:id', (req, res) => { promotionServiceClient.createPromotion(promotionUpdateInput, (error, response) => { if (error) { + res.status(500) res.json({error: error.message}); } else { res.json(response.toObject()); @@ -74,6 +79,7 @@ promotionRoutes.delete('/api/promotion/:id', (req, res) => { promotionServiceClient.deletePromotion(new PromotionId().setId(id), (error, response) => { if (error) { + res.status(500) res.json({error: error.message}); } else { res.json(response.toObject()); diff --git a/services/gateway/src/controller/stock/stock.controller.ts b/services/gateway/src/controller/stock/stock.controller.ts index 677d9aca..4525df45 100644 --- a/services/gateway/src/controller/stock/stock.controller.ts +++ b/services/gateway/src/controller/stock/stock.controller.ts @@ -37,6 +37,7 @@ stockRoutes.get('/api/stock/supplier/:id', (req: Request, res: Response) => { stockServiceClient.getSupplier(supplierRequest, (error, response) => { if (error) { + res.status(500) res.json({error: error.message}); } else { res.json(response.toObject()); @@ -48,6 +49,7 @@ stockRoutes.get('/api/stock/supplier', (req: Request, res: Response) => { stockServiceClient.getSuppliers(new Empty(), (error, response) => { if (error) { + res.status(500) res.json({error: error.message}); } else { res.json(response.toObject()); @@ -61,6 +63,7 @@ stockRoutes.get('/api/stock/ingredient/:id', (req: Request, res: Response) => { stockServiceClient.getIngredient(ingredientRequest, (error, response) => { if (error) { + res.status(500) res.json({error: error.message}); } else { res.json(response.toObject()); @@ -72,6 +75,7 @@ stockRoutes.get('/api/stock/ingredient', (req: Request, res: Response) => { stockServiceClient.getIngredients(new Empty(), (error, response) => { if (error) { + res.status(500) res.json({error: error.message}); } else { res.json(response.toObject()); @@ -85,6 +89,7 @@ stockRoutes.post('/api/stock/ingredient', (req: Request, res: Response) => { stockServiceClient.createIngredient(ingredientRequest, (error, response) => { if (error) { + res.status(500) res.json({error: error.message}); } else { res.json(response.toObject()); @@ -99,6 +104,7 @@ stockRoutes.put('/api/stock/ingredient/:id', (req: Request, res: Response) => { stockServiceClient.updateIngredient(ingredientRequest, (error, response) => { if (error) { + res.status(500) res.json({error: error.message}); } else { res.json(response.toObject()); @@ -112,6 +118,7 @@ stockRoutes.delete('/api/stock/ingredient/:id', (req: Request, res: Response) => stockServiceClient.deleteIngredient(ingredientRequest, (error, response) => { if (error) { + res.status(500) res.json({error: error.message}); } else { res.json(response.toObject()); @@ -125,6 +132,7 @@ stockRoutes.delete('/api/stock/ingredient/:id', (req: Request, res: Response) => stockServiceClient.deleteIngredient(ingredientRequest, (error, response) => { if (error) { + res.status(500) res.json({error: error.message}); } else { res.json(response.toObject()); @@ -142,6 +150,7 @@ stockRoutes.get('/api/stock/ingredient/restaurant/:id', (req: Request, res: Resp stockServiceClient.getIngredientRestaurant(ingredientRestaurantRequest, (error, response) => { if (error) { + res.status(500) res.json({error: error.message}); } else { res.json(response.toObject()); @@ -155,6 +164,7 @@ stockRoutes.get('/api/stock/ingredient/restaurant/by-restaurant/:id', (req: Requ stockServiceClient.getIngredientRestaurantsByRestaurant(ingredientRestaurantsByRestaurantRequest, (error, response) => { if (error) { + res.status(500) res.json({error: error.message}); } else { res.json(response.toObject()); @@ -168,6 +178,7 @@ stockRoutes.get('/api/stock/ingredient/restaurant/by-product/:id', (req: Request stockServiceClient.getIngredientRestaurantsByProduct(ingredientRestaurantsByProductRequest, (error, response) => { if (error) { + res.status(500) res.json({error: error.message}); } else { res.json(response.toObject()); @@ -188,6 +199,7 @@ stockRoutes.post('/api/stock/ingredient/restaurant', (req: Request, res: Respons stockServiceClient.createIngredientRestaurant(ingredientRestaurant, (error, response) => { if (error) { + res.status(500) res.json({error: error.message}); } else { res.json(response.toObject()); @@ -209,6 +221,7 @@ stockRoutes.put('/api/stock/ingredient/restaurant/:id', (req: Request, res: Resp stockServiceClient.updateIngredientRestaurant(ingredientRestaurant, (error, response) => { if (error) { + res.status(500) res.json({error: error.message}); } else { res.json(response.toObject()); @@ -221,6 +234,7 @@ stockRoutes.delete('/api/stock/ingredient/restaurant/:id', (req: Request, res: R stockServiceClient.deleteIngredientRestaurant(new DeleteIngredientRestaurantRequest().setId(Number(id)), (error, response) => { if (error) { + res.status(500) res.json({error: error.message}); } else { res.json(response.toObject()); @@ -237,6 +251,7 @@ stockRoutes.get('/api/stock/supplier/:id', (req: Request, res: Response) => { stockServiceClient.getSupplier(new GetSupplierRequest().setId(Number(id)), (error, response) => { if (error) { + res.status(500) res.json({error: error.message}); } else { res.json(response.toObject()); @@ -247,6 +262,7 @@ stockRoutes.get('/api/stock/supplier/:id', (req: Request, res: Response) => { stockRoutes.get('/api/stock/supplier', (req: Request, res: Response) => { stockServiceClient.getSuppliers(new Empty(), (error, response) => { if (error) { + res.status(500) res.json({error: error.message}); } else { res.json(response.toObject()); @@ -260,6 +276,7 @@ stockRoutes.post('/api/stock/supplier', (req: Request, res: Response) => { stockServiceClient.createSupplier(supplierRequest, (error, response) => { if (error) { + res.status(500) res.json({error: error.message}); } else { res.json(response.toObject()); @@ -274,6 +291,7 @@ stockRoutes.put('/api/stock/supplier/:id', (req: Request, res: Response) => { stockServiceClient.updateSupplier(supplierRequest, (error, response) => { if (error) { + res.status(500) res.json({error: error.message}); } else { res.json(response.toObject()); @@ -286,6 +304,7 @@ stockRoutes.delete('/api/stock/supplier/:id', (req: Request, res: Response) => { stockServiceClient.deleteSupplier(new DeleteSupplierRequest().setId(Number(id)), (error, response) => { if (error) { + res.status(500) res.json({error: error.message}); } else { res.json(response.toObject()); @@ -302,6 +321,7 @@ stockRoutes.get('/api/stock/supply/order/:id', (req: Request, res: Response) => stockServiceClient.getSupplyOrder(new GetSupplyOrderRequest().setId(Number(id)), (error, response) => { if (error) { + res.status(500) res.json({error: error.message}); } else { res.json(response.toObject()); @@ -313,6 +333,7 @@ stockRoutes.get('/api/stock/supply/order/by-restaurant/:id', (req: Request, res: const {id} = req.params; stockServiceClient.getSupplyOrdersByRestaurant(new GetSupplyOrdersByRestaurantRequest().setRestaurantId(id), (error, response) => { if (error) { + res.status(500) res.json({error: error.message}); } else { res.json(response.toObject()); @@ -324,6 +345,7 @@ stockRoutes.get('/api/stock/supply/order/by-supplier/:id', (req: Request, res: R const {id} = req.params; stockServiceClient.getSupplyOrdersBySupplier(new GetSupplyOrdersBySupplierRequest().setSupplierId(Number(id)), (error, response) => { if (error) { + res.status(500) res.json({error: error.message}); } else { res.json(response.toObject()); @@ -335,6 +357,7 @@ stockRoutes.get('/api/stock/supply/order/by-ingredient-restaurant/:id', (req: Re const {id} = req.params; stockServiceClient.getSupplyOrdersByIngredientRestaurant(new GetSupplyOrdersByIngredientRestaurantRequest().setIngredientRestaurantId(Number(id)), (error, response) => { if (error) { + res.status(500) res.json({error: error.message}); } else { res.json(response.toObject()); @@ -350,6 +373,7 @@ stockRoutes.post('/api/stock/supply/order', (req: Request, res: Response) => { stockServiceClient.createSupplyOrder(supplyOrderRequest, (error, response) => { if (error) { + res.status(500) res.json({error: error.message}); } else { res.json(response.toObject()); @@ -366,6 +390,7 @@ stockRoutes.put('/api/stock/supply/order/:id', (req: Request, res: Response) => stockServiceClient.updateSupplyOrder(supplyOrderRequest, (error, response) => { if (error) { + res.status(500) res.json({error: error.message}); } else { res.json(response.toObject()); @@ -377,6 +402,7 @@ stockRoutes.delete('/api/stock/supply/order/:id', (req: Request, res: Response) const {id} = req.params; stockServiceClient.deleteSupplyOrder(new DeleteSupplyOrderRequest().setId(Number(id)), (error, response) => { if (error) { + res.status(500) res.json({error: error.message}); } else { res.json(response.toObject()); diff --git a/services/gateway/src/controller/stock/stockPerson.controller.ts b/services/gateway/src/controller/stock/stockPerson.controller.ts index 48496f95..5d3b8504 100644 --- a/services/gateway/src/controller/stock/stockPerson.controller.ts +++ b/services/gateway/src/controller/stock/stockPerson.controller.ts @@ -11,6 +11,7 @@ stockPersonRoutes.post('/api/stock/outcomes/by-restaurant/:id', (req: Request, r stockPersonServiceClient.getOutcomesByRestaurant(outcomesByRestaurantRequest, (error, response) => { if (error) { + res.status(500) res.json({error: error.message}); } else { res.json(response.toObject()); diff --git a/services/gateway/src/controller/user/user.controller.ts b/services/gateway/src/controller/user/user.controller.ts index c4467600..7605bdcd 100644 --- a/services/gateway/src/controller/user/user.controller.ts +++ b/services/gateway/src/controller/user/user.controller.ts @@ -26,6 +26,7 @@ userRoutes.get('/api/user/:id', (req: Request, res: Response) => { userRoutes.get('/api/user', (req: Request, res: Response) => { userServiceClient.listUser(new Empty(), (error, response) => { if (error) { + res.status(500) res.json({error: error.message}); } else { res.json(response.toObject()); @@ -51,6 +52,7 @@ userRoutes.post('/api/user', (req: Request, res: Response) => { userServiceClient.register(userInput, (error, response) => { if (error) { + res.status(500) res.json({error: error.message}); } else { res.json(response.toObject()); @@ -84,6 +86,7 @@ userRoutes.put('/api/user/:id', (req: Request, res: Response) => { userServiceClient.updateUser(userInput, (error, response) => { if (error) { + res.status(500) res.json({error: error.message}); } else { res.json(response.toObject()); @@ -101,6 +104,7 @@ userRoutes.delete('/api/user/:id', (req: Request, res: Response) => { userServiceClient.deleteUser(new DeleteInput().setUserid(Number(id)).setToken(authorization), (error, response) => { if (error) { + res.status(500) res.json({error: error.message}); } else { res.json(response.toObject()); @@ -114,6 +118,7 @@ userRoutes.post('/api/user/login', (req: Request, res: Response) => { userServiceClient.logIn(inInput, (error, response) => { if (error) { + res.status(500) res.json({error: error.message}); } else { res.json(response.toObject()); @@ -131,6 +136,7 @@ userRoutes.post('/api/user/validate', (req: Request, res: Response) => { userServiceClient.validate(validate, (error, response) => { if (error) { + res.status(500) res.json({error: error.message}); } else { res.json(response.toObject()); @@ -158,6 +164,7 @@ userRoutes.put('/api/user/:id/password', (req: Request, res: Response) => { userServiceClient.changePassword(updatePasswordInput, (error, response) => { if (error) { + res.status(500) res.json({error: error.message}); } else { res.json(response.toObject()); @@ -184,6 +191,7 @@ userRoutes.put('/api/user/:id/role', (req: Request, res: Response) => { } userServiceClient.changeRole(updatePasswordInput, (error, response) => { if (error) { + res.status(500) res.json({error: error.message}); } else { res.json(response.toObject()); From 193a7295303b4687b78c501bd170d67bd8dae51f Mon Sep 17 00:00:00 2001 From: anatole Date: Tue, 15 Aug 2023 20:03:37 +0200 Subject: [PATCH 380/883] feat(global): add product service to the docker compose --- services/docker-compose.yml | 55 ++++++++++++++----- services/product/.env.example | 8 +-- services/product/.gitignore | 7 ++- .../product/src/handler/Category/create.ts | 2 +- services/product/src/server.ts | 14 ++--- 5 files changed, 59 insertions(+), 27 deletions(-) diff --git a/services/docker-compose.yml b/services/docker-compose.yml index 0d0b6a55..79ed53ae 100644 --- a/services/docker-compose.yml +++ b/services/docker-compose.yml @@ -14,7 +14,20 @@ services: networks: - goodfood-network - # delivery-service: + # Delivery service + + delivery-service: + image: goodfood-delivery:1.0.0 + build: + context: . + dockerfile: ./delivery/Dockerfile + env_file: + - delivery/.env.docker + ports: + - "50008" + networks: + - goodfood-network + delivery-redis: image: redis:latest ports: @@ -42,18 +55,6 @@ services: POSTGRES_DB: postgres PGDATA: /var/lib/postgresql/data/pgdata - delivery-service: - image: goodfood-delivery:1.0.0 - build: - context: . - dockerfile: ./delivery/Dockerfile - env_file: - - delivery/.env.docker - ports: - - "50008" - networks: - - goodfood-network - # Order service order-sercice: image: goodfood-order:1.0.0 @@ -81,9 +82,37 @@ services: POSTGRES_DB: postgres PGDATA: /var/lib/postgresql/data/pgdata + # Product service + product-service: + image: goodfood-product:1.0.0 + build: + context: . + dockerfile: ./product/Dockerfile + env_file: + - product/.env.docker + ports: + - "50004" + networks: + - goodfood-network + + product-postgres: + image: postgres:latest + ports: + - "5432" + volumes: + - goodfood-product-volume:/var/lib/postgresql/data + networks: + - goodfood-network + environment: + POSTGRES_USER: postgres + POSTGRES_PASSWORD: password + POSTGRES_DB: postgres + PGDATA: /var/lib/postgresql/data/pgdata + volumes: goodfood-delivery-volume: goodfood-order-volume: + goodfood-product-volume: networks: goodfood-network: \ No newline at end of file diff --git a/services/product/.env.example b/services/product/.env.example index aa4adfe8..296f701e 100644 --- a/services/product/.env.example +++ b/services/product/.env.example @@ -1,4 +1,4 @@ -DATABASE_URL="postgresql://postgres:postgres@127.0.0.1:5432/postgres" -PORT = 50004 -AZURE_STORAGE_SAS_TOKEN = "example" -AZURE_STORAGE_RESOURCE_NAME = "exemple" \ No newline at end of file +DATABASE_URL=postgres://postgres:password@postgres:5432/postgres +PORT=50004 +AZURE_STORAGE_SAS_TOKEN=example +AZURE_STORAGE_RESOURCE_NAME=exemple \ No newline at end of file diff --git a/services/product/.gitignore b/services/product/.gitignore index 660757fd..bee3adb2 100644 --- a/services/product/.gitignore +++ b/services/product/.gitignore @@ -172,4 +172,9 @@ override.tf.json # Ignore CLI configuration files .terraformrc -terraform.rc \ No newline at end of file +terraform.rc + +dist/ +bin/ +*.env* +!*.env.example diff --git a/services/product/src/handler/Category/create.ts b/services/product/src/handler/Category/create.ts index 54864366..158c57b7 100644 --- a/services/product/src/handler/Category/create.ts +++ b/services/product/src/handler/Category/create.ts @@ -15,7 +15,7 @@ export const CreateCategory = async ( !icon && icon.trim().length <= 0 && !hexa_color && hexa_color.trim().length <= 0 ) - throw(Error("Aucun des valeurs de la catégorie ne peuvent être null") as ServerErrorResponse) + throw(Error("Aucune des valeurs de la catégorie ne peuvent être null") as ServerErrorResponse) var categorieInDb = await prisma.category.findMany({ where: { diff --git a/services/product/src/server.ts b/services/product/src/server.ts index 9ec56dbf..01452020 100644 --- a/services/product/src/server.ts +++ b/services/product/src/server.ts @@ -1,13 +1,11 @@ -import { resolve as resolvePath } from "path"; +import {loadSync} from "@grpc/proto-loader"; +import {loadPackageDefinition, Server, ServerCredentials} from "@grpc/grpc-js"; -import { loadSync } from "@grpc/proto-loader"; -import { ServerCredentials, loadPackageDefinition, Server } from "@grpc/grpc-js"; +import {log, utils} from "./lib/log"; -import { log, utils } from "./lib/log"; +import {logGRPC} from "@product/middleware/log"; -import { logGRPC } from "@product/middleware/log"; - -import { createServerProxy } from "@product/lib/proxy"; +import {createServerProxy} from "@product/lib/proxy"; import AllergenHandler from "@product/handler/Allergen/index"; import CategoryHandler from "@product/handler/Category/index"; @@ -24,7 +22,7 @@ const options = { const serverInsecure = ServerCredentials.createInsecure(); const PORT = process.env.PORT || 50004; -const ADDRESS = `localhost:${PORT}`; +const ADDRESS = `0.0.0.0:${PORT}`; const PROTO_PATH = "../proto/product.proto"; const packageDefinition = loadSync(PROTO_PATH, options); From a8463da62422e064d055f81c5b35d6604933db00 Mon Sep 17 00:00:00 2001 From: anatole Date: Tue, 15 Aug 2023 20:20:10 +0200 Subject: [PATCH 381/883] feat(global): add promotion service to the docker compose --- services/docker-compose.yml | 28 +++++++ .../controller/basket/basket.controller.ts | 15 ++-- .../delivery/delivery.controller.ts | 19 ++--- .../delivery/deliveryPerson.controller.ts | 18 ++--- .../src/controller/log/log.controller.ts | 6 +- .../controller/metric/metric.controller.ts | 6 +- .../src/controller/order/order.controller.ts | 24 ++---- .../controller/product/allergen.controller.ts | 15 ++-- .../controller/product/category.controller.ts | 15 ++-- .../controller/product/product.controller.ts | 21 ++--- .../promotion/promotion.controller.ts | 18 ++--- .../src/controller/stock/stock.controller.ts | 78 +++++++------------ .../stock/stockPerson.controller.ts | 3 +- .../src/controller/user/user.controller.ts | 24 ++---- services/promotions/.env.example | 2 +- 15 files changed, 116 insertions(+), 176 deletions(-) diff --git a/services/docker-compose.yml b/services/docker-compose.yml index 79ed53ae..a672240a 100644 --- a/services/docker-compose.yml +++ b/services/docker-compose.yml @@ -109,10 +109,38 @@ services: POSTGRES_DB: postgres PGDATA: /var/lib/postgresql/data/pgdata + # Promotion service + promotion-service: + image: goodfood-promotion:1.0.0 + build: + context: . + dockerfile: ./promotions/Dockerfile + env_file: + - promotions/.env.docker + ports: + - "50006" + networks: + - goodfood-network + + promotion-postgres: + image: postgres:latest + ports: + - "5432" + volumes: + - goodfood-promotion-volume:/var/lib/postgresql/data + networks: + - goodfood-network + environment: + POSTGRES_USER: postgres + POSTGRES_PASSWORD: password + POSTGRES_DB: postgres + PGDATA: /var/lib/postgresql/data/pgdata + volumes: goodfood-delivery-volume: goodfood-order-volume: goodfood-product-volume: + goodfood-promotion-volume: networks: goodfood-network: \ No newline at end of file diff --git a/services/gateway/src/controller/basket/basket.controller.ts b/services/gateway/src/controller/basket/basket.controller.ts index dd953884..abdcb2e3 100644 --- a/services/gateway/src/controller/basket/basket.controller.ts +++ b/services/gateway/src/controller/basket/basket.controller.ts @@ -9,8 +9,7 @@ basketRoutes.get('/api/basket/:userId', (req: Request, res: Response) => { basketServiceClient.getBasket(new UserId().setId(Number(userId)), (error, response) => { if (error) { - res.status(500) - res.json({error: error.message}); + res.status(500).send({error: error.message}); } else { res.json(response.toObject()); } @@ -22,8 +21,7 @@ basketRoutes.post('/api/basket', (req: Request, res: Response) => { const basketRequest = new ProductRequest().setUserId(userId).setProductId(productId).setRestaurantId(restaurantId); basketServiceClient.addProduct(basketRequest, (error, response) => { if (error) { - res.status(500) - res.json({error: error.message}); + res.status(500).send({error: error.message}); } else { res.json(response.toObject()); } @@ -36,8 +34,7 @@ basketRoutes.delete('/api/basket', (req: Request, res: Response) => { const basketRequest = new ProductRequest().setUserId(userId).setProductId(productId).setRestaurantId(restaurantId); basketServiceClient.deleteProduct(basketRequest, (error, response) => { if (error) { - res.status(500) - res.json({error: error.message}); + res.status(500).send({error: error.message}); } else { res.json(response.toObject()); } @@ -49,8 +46,7 @@ basketRoutes.put('/api/basket/restaurant', (req: Request, res: Response) => { const {restaurantId, userId} = req.body; basketServiceClient.updateRestaurant(new RestaurantRequest().setRestaurantId(restaurantId).setUserId(userId), (error, response) => { if (error) { - res.status(500) - res.json({error: error.message}); + res.status(500).send({error: error.message}); } else { res.json(response.toObject()); } @@ -62,8 +58,7 @@ basketRoutes.post('/api/basket/reset', (req: Request, res: Response) => { const {userId} = req.body; basketServiceClient.reset(new UserId().setId(userId), (error, response) => { if (error) { - res.status(500) - res.json({error: error.message}); + res.status(500).send({error: error.message}); } else { res.json(response.toObject()); } diff --git a/services/gateway/src/controller/delivery/delivery.controller.ts b/services/gateway/src/controller/delivery/delivery.controller.ts index 33844bf5..120857c4 100644 --- a/services/gateway/src/controller/delivery/delivery.controller.ts +++ b/services/gateway/src/controller/delivery/delivery.controller.ts @@ -9,9 +9,7 @@ deliveryRoutes.get('/api/delivery/:id', (req: Request, res: Response) => { deliveryServiceClient.getDelivery(new DeliveryId().setId(id), (error, response) => { if (error) { - res.status(500) - res.status(500) - res.json({error: error.message}); + res.status(500).send({error: error.message}); } else { res.json(response.toObject()); } @@ -24,8 +22,7 @@ deliveryRoutes.get('/api/delivery/by-restaurant/:id', (req: Request, res: Respon deliveryServiceClient.listDeliveriesByRestaurant(restaurantId, (error, response) => { if (error) { - res.status(500) - res.json({error: error.message}); + res.status(500).send({error: error.message}); } else { res.json(response.toObject()); } @@ -38,8 +35,7 @@ deliveryRoutes.get('/api/delivery/by-user/:id', (req: Request, res: Response) => deliveryServiceClient.listDeliveriesByUser(userId, (error, response) => { if (error) { - res.status(500) - res.json({error: error.message}); + res.status(500).send({error: error.message}); } else { res.json(response.toObject()); } @@ -65,8 +61,7 @@ deliveryRoutes.post('/api/delivery', (req: Request, res: Response) => { deliveryServiceClient.createDelivery(deliveryCreateInput, (error, response) => { console.log(error, response) if (error) { - res.status(500) - res.json({error: error.message}); + res.status(500).send({error: error.message}); } else { res.json(response.toObject()); } @@ -85,8 +80,7 @@ deliveryRoutes.put('/api/delivery/:id', (req: Request, res: Response) => { deliveryServiceClient.updateDelivery(delivery, (error, response) => { if (error) { - res.status(500) - res.json({error: error.message}); + res.status(500).send({error: error.message}); } else { res.json(response.toObject()); } @@ -98,8 +92,7 @@ deliveryRoutes.delete('/api/delivery/:id', (req: Request, res: Response) => { deliveryServiceClient.deleteDelivery(new DeliveryId().setId(id), (error, response) => { if (error) { - res.status(500) - res.json({error: error.message}); + res.status(500).send({error: error.message}); } else { res.json(response.toObject()); } diff --git a/services/gateway/src/controller/delivery/deliveryPerson.controller.ts b/services/gateway/src/controller/delivery/deliveryPerson.controller.ts index ab75c283..0df72e62 100644 --- a/services/gateway/src/controller/delivery/deliveryPerson.controller.ts +++ b/services/gateway/src/controller/delivery/deliveryPerson.controller.ts @@ -10,8 +10,7 @@ deliveryPersonRoutes.get('/api/delivery-person/:id', (req, res) => { deliveryPersonServiceClient.getDeliveryPerson(new DeliveryPersonId().setId(id), (error, response) => { if (error) { - res.status(500) - res.json({error: error.message}); + res.status(500).send({error: error.message}); } else { res.json(response.toObject()); } @@ -21,8 +20,7 @@ deliveryPersonRoutes.get('/api/delivery-person/:id', (req, res) => { deliveryPersonRoutes.get('/api/delivery-person', (req, res) => { deliveryPersonServiceClient.listDeliveryPersons(new Empty(), (error, response) => { if (error) { - res.status(500) - res.json({error: error.message}); + res.status(500).send({error: error.message}); } else { res.json(response.toObject()); } @@ -36,8 +34,7 @@ deliveryPersonRoutes.get('/api/delivery-person', (req, res) => { .setLongitude(lng); deliveryPersonServiceClient.listNearDeliveryPersons(location, (error, response) => { if (error) { - res.status(500) - res.json({error: error.message}); + res.status(500).send({error: error.message}); } else { res.json(response.toObject()); } @@ -53,8 +50,7 @@ deliveryPersonRoutes.post('/api/delivery-person', (req, res) => { .setLocationList(locationList); deliveryPersonServiceClient.createDeliveryPerson(deliveryPerson, (error, response) => { if (error) { - res.status(500) - res.json({error: error.message}); + res.status(500).send({error: error.message}); } else { res.json(response.toObject()); } @@ -72,8 +68,7 @@ deliveryPersonRoutes.put('/api/delivery-person/:id', (req, res) => { deliveryPersonServiceClient.updateDeliveryPerson(deliveryPerson, (error, response) => { if (error) { - res.status(500) - res.json({error: error.message}); + res.status(500).send({error: error.message}); } else { res.json(response.toObject()); } @@ -85,8 +80,7 @@ deliveryPersonRoutes.delete('/api/delivery-person/:id', (req, res) => { deliveryPersonServiceClient.deleteDeliveryPerson(new DeliveryPersonId().setId(id), (error, response) => { if (error) { - res.status(500) - res.json({error: error.message}); + res.status(500).send({error: error.message}); } else { res.json(response.toObject()); } diff --git a/services/gateway/src/controller/log/log.controller.ts b/services/gateway/src/controller/log/log.controller.ts index f42e5eaa..2dd59a70 100644 --- a/services/gateway/src/controller/log/log.controller.ts +++ b/services/gateway/src/controller/log/log.controller.ts @@ -9,8 +9,7 @@ logRoutes.get('/api/log', (req: express.Request, res: express.Response) => { logServiceClient.listLog(new Empty(), (error, response) => { if (error) { - res.status(500) - res.json({error: error.message}); + res.status(500).send({error: error.message}); } else { res.json(response.toObject()); } @@ -22,8 +21,7 @@ logRoutes.get('/api/log/:id', (req: express.Request, res: express.Response) => { logServiceClient.getLog(new GetLogRequest().setId(Number(id)), (error, response) => { if (error) { - res.status(500) - res.json({error: error.message}); + res.status(500).send({error: error.message}); } else { res.json(response.toObject()); } diff --git a/services/gateway/src/controller/metric/metric.controller.ts b/services/gateway/src/controller/metric/metric.controller.ts index 8225dd0d..186f9482 100644 --- a/services/gateway/src/controller/metric/metric.controller.ts +++ b/services/gateway/src/controller/metric/metric.controller.ts @@ -9,8 +9,7 @@ metricRoutes.get('/api/metric/:key', (req, res) => { const metricInput = new GetMetricRequest().setKey(key); metricService.getMetric(metricInput, (error, response) => { if (error) { - res.status(500) - res.json({error: error.message}); + res.status(500).send({error: error.message}); } else { res.json(response.toObject()); } @@ -24,8 +23,7 @@ metricRoutes.post('/api/metric', (req, res) => { metricService.pushMetric(newMetric, (error, response) => { if (error) { - res.status(500) - res.json({error: error.message}); + res.status(500).send({error: error.message}); } else { res.json(response.toObject()); } diff --git a/services/gateway/src/controller/order/order.controller.ts b/services/gateway/src/controller/order/order.controller.ts index e8675eac..992f587f 100644 --- a/services/gateway/src/controller/order/order.controller.ts +++ b/services/gateway/src/controller/order/order.controller.ts @@ -23,8 +23,7 @@ orderRoutes.get('/api/order/:id', (req: Request, res: Response) => { orderService.getOrder(orderId, (error, response) => { if (error) { - res.status(500) - res.json({error: error.message}); + res.status(500).send({error: error.message}); } else { res.json(response.toObject()); } @@ -61,8 +60,7 @@ orderRoutes.post('/api/order', (req: Request, res: Response) => { orderService.createOrder(orderInput, (error, response) => { if (error) { - res.status(500) - res.json({error: error.message}); + res.status(500).send({error: error.message}); } else { res.json(response.toObject()); } @@ -74,8 +72,7 @@ orderRoutes.get('/api/order/by-user/:userId', (req: Request, res: Response) => { const orderInput = new GetOrdersByUserRequest().setId(userId); orderService.getOrdersByUser(orderInput, (error, response) => { if (error) { - res.status(500) - res.json({error: error.message}); + res.status(500).send({error: error.message}); } else { res.json(response.toObject()); } @@ -87,8 +84,7 @@ orderRoutes.post('/api/order/by-status', (req: Request, res: Response) => { orderService.getOrdersByStatus(orderInput, (error, response) => { if (error) { - res.status(500) - res.json({error: error.message}); + res.status(500).send({error: error.message}); } else { res.json(response.toObject()); } @@ -100,8 +96,7 @@ orderRoutes.get('/api/order/by-delivery/:deliveryId', (req: Request, res: Respon const orderInput = new GetOrderByDeliveryRequest().setId(deliveryId); orderService.getOrderByDelivery(orderInput, (error, response) => { if (error) { - res.status(500) - res.json({error: error.message}); + res.status(500).send({error: error.message}); } else { res.json(response.toObject()); } @@ -113,8 +108,7 @@ orderRoutes.get('/api/order/by-payment/:paymentId', (req: Request, res: Response const orderInput = new GetOrderByPaymentRequest().setId(paymentId); orderService.getOrderByPayment(orderInput, (error, response) => { if (error) { - res.status(500) - res.json({error: error.message}); + res.status(500).send({error: error.message}); } else { res.json(response.toObject()); } @@ -131,8 +125,7 @@ orderRoutes.put('/api/order/:orderId', (req: Request, res: Response) => { .setRestaurantId(req.body.restaurantId); orderService.updateOrder(orderInput, (error, response) => { if (error) { - res.status(500) - res.json({error: error.message}); + res.status(500).send({error: error.message}); } else { res.json(response.toObject()); } @@ -144,8 +137,7 @@ orderRoutes.delete('/api/order/:orderId', (req: Request, res: Response) => { const orderInput = new DeleteOrderRequest().setId(orderId); orderService.deleteOrder(orderInput, (error, response) => { if (error) { - res.status(500) - res.json({error: error.message}); + res.status(500).send({error: error.message}); } else { res.json(response.toObject()); } diff --git a/services/gateway/src/controller/product/allergen.controller.ts b/services/gateway/src/controller/product/allergen.controller.ts index 575ae028..6a892df9 100644 --- a/services/gateway/src/controller/product/allergen.controller.ts +++ b/services/gateway/src/controller/product/allergen.controller.ts @@ -8,8 +8,7 @@ export const allergenRoutes = Router(); allergenRoutes.get('/api/allergen', (req: Request, res: Response) => { allergenServiceClient.getAllergenList(new Empty(), (error, response) => { if (error) { - res.status(500) - res.json({error: error.message}); + res.status(500).send({error: error.message}); } else { res.json(response.toObject()); } @@ -22,8 +21,7 @@ allergenRoutes.get('/api/allergen/:id', (req: Request, res: Response) => { allergenServiceClient.readAllergen(allergenId, (error, response) => { if (error) { - res.status(500) - res.json({error: error.message}); + res.status(500).send({error: error.message}); } else { res.json(response.toObject()); } @@ -35,8 +33,7 @@ allergenRoutes.post('/api/allergen', (req: Request, res: Response) => { const allergen = new Allergen().setLibelle(label); allergenServiceClient.createAllergen(allergen, (error, response) => { if (error) { - res.status(500) - res.json({error: error.message}); + res.status(500).send({error: error.message}); } else { res.json(response.toObject()); } @@ -49,8 +46,7 @@ allergenRoutes.put('/api/allergen/:id', (req: Request, res: Response) => { const allergen = new Allergen().setId(id).setLibelle(label); allergenServiceClient.updateAllergen(allergen, (error, response) => { if (error) { - res.status(500) - res.json({error: error.message}); + res.status(500).send({error: error.message}); } else { res.json(response.toObject()); } @@ -61,8 +57,7 @@ allergenRoutes.delete('/api/allergen/:id', (req: Request, res: Response) => { const {id} = req.params; allergenServiceClient.deleteAllergen(new AllergenId().setId(id), (error, response) => { if (error) { - res.status(500) - res.json({error: error.message}); + res.status(500).send({error: error.message}); } else { res.json(response.toObject()); } diff --git a/services/gateway/src/controller/product/category.controller.ts b/services/gateway/src/controller/product/category.controller.ts index 041b5b3c..2838aa8b 100644 --- a/services/gateway/src/controller/product/category.controller.ts +++ b/services/gateway/src/controller/product/category.controller.ts @@ -8,8 +8,7 @@ export const categoryRoutes = Router(); categoryRoutes.get('/api/category', (req: Request, res: Response) => { categoryServiceClient.getCategoryList(new Empty(), (error, response) => { if (error) { - res.status(500) - res.json({error: error.message}); + res.status(500).send({error: error.message}); } else { res.json(response.toObject()); } @@ -22,8 +21,7 @@ categoryRoutes.get('/api/category/:id', (req: Request, res: Response) => { categoryServiceClient.readCategory(categoryId, (error, response) => { if (error) { - res.status(500) - res.json({error: error.message}); + res.status(500).send({error: error.message}); } else { res.json(response.toObject()); } @@ -35,8 +33,7 @@ categoryRoutes.post('/api/category', (req: Request, res: Response) => { const category = new Category().setLibelle(label).setIcon(icon).setHexaColor(hexaColor) categoryServiceClient.createCategory(category, (error, response) => { if (error) { - res.status(500) - res.json({error: error.message}); + res.status(500).send({error: error.message}); } else { res.json(response.toObject()); } @@ -49,8 +46,7 @@ categoryRoutes.put('/api/category/:id', (req: Request, res: Response) => { const category = new Category().setId(id).setLibelle(label).setIcon(icon).setHexaColor(hexaColor) categoryServiceClient.updateCategory(category, (error, response) => { if (error) { - res.status(500) - res.json({error: error.message}); + res.status(500).send({error: error.message}); } else { res.json(response.toObject()); } @@ -61,8 +57,7 @@ categoryRoutes.delete('/api/category/:id', (req: Request, res: Response) => { const {id} = req.params; categoryServiceClient.deleteCategory(new CategoryId().setId(id), (error, response) => { if (error) { - res.status(500) - res.json({error: error.message}); + res.status(500).send({error: error.message}); } else { res.json(response.toObject()); } diff --git a/services/gateway/src/controller/product/product.controller.ts b/services/gateway/src/controller/product/product.controller.ts index 378cc910..f5098c65 100644 --- a/services/gateway/src/controller/product/product.controller.ts +++ b/services/gateway/src/controller/product/product.controller.ts @@ -12,8 +12,7 @@ productRoutes.get('/api/product/by-restaurant/:id', (req: Request, res: Response productServiceClient.getProductList(restaurantId, (error, response) => { if (error) { - res.status(500) - res.json({error: error.message}); + res.status(500).send({error: error.message}); } else { res.json(response.toObject()); } @@ -26,8 +25,7 @@ productRoutes.get('/api/product/:id', (req: Request, res: Response) => { productServiceClient.readProduct(productId, (error, response) => { if (error) { - res.status(500) - res.json({error: error.message}); + res.status(500).send({error: error.message}); } else { res.json(response.toObject()); } @@ -37,8 +35,7 @@ productRoutes.get('/api/product/:id', (req: Request, res: Response) => { productRoutes.get('/api/product/type', (req: Request, res: Response) => { productServiceClient.getProductTypeList(new Empty(), (error, response) => { if (error) { - res.status(500) - res.json({error: error.message}); + res.status(500).send({error: error.message}); } else { res.json(response.toObject()); } @@ -50,8 +47,7 @@ productRoutes.delete('/api/product/:id', (req: Request, res: Response) => { const productId = new ProductId().setId(id) productServiceClient.deleteProduct(productId, (error, response) => { if (error) { - res.status(500) - res.json({error: error.message}); + res.status(500).send({error: error.message}); } else { res.json(response.toObject()); } @@ -94,8 +90,7 @@ productRoutes.post('/api/product', (req: Request, res: Response) => { productServiceClient.createProduct(productId, (error, response) => { if (error) { - res.status(500) - res.json({error: error.message}); + res.status(500).send({error: error.message}); } else { res.json(response.toObject()); } @@ -139,8 +134,7 @@ productRoutes.put('/api/product/:id', (req: Request, res: Response) => { productServiceClient.createProduct(productId, (error, response) => { if (error) { - res.status(500) - res.json({error: error.message}); + res.status(500).send({error: error.message}); } else { res.json(response.toObject()); } @@ -155,8 +149,7 @@ productRoutes.post('/api/product/image', (req: Request, res: Response) => { const file = new File().setName(input_file).setData(base64File); productServiceClient.uploadImage(file, (error, response) => { if (error) { - res.status(500) - res.json({error: error.message}); + res.status(500).send({error: error.message}); } else { res.json(response.toObject()); } diff --git a/services/gateway/src/controller/promotion/promotion.controller.ts b/services/gateway/src/controller/promotion/promotion.controller.ts index 6330056f..4b8b9d62 100644 --- a/services/gateway/src/controller/promotion/promotion.controller.ts +++ b/services/gateway/src/controller/promotion/promotion.controller.ts @@ -9,8 +9,7 @@ promotionRoutes.get('/api/promotion/:code', (req, res) => { const {code} = req.params; promotionServiceClient.getPromotion(new PromotionCode().setCode(code), (error, response) => { if (error) { - res.status(500) - res.json({error: error.message}); + res.status(500).send({error: error.message}); } else { res.json(response.toObject()); } @@ -20,8 +19,7 @@ promotionRoutes.get('/api/promotion/:code', (req, res) => { promotionRoutes.get('/api/promotion', (req, res) => { promotionServiceClient.getPromotions(new Empty(), (error, response) => { if (error) { - res.status(500) - res.json({error: error.message}); + res.status(500).send({error: error.message}); } else { res.json(response.toObject()); } @@ -32,8 +30,7 @@ promotionRoutes.get('/api/promotion/by-restaurant/:restaurantId', (req, res) => const {restaurantId} = req.params; promotionServiceClient.getPromotionsByRestaurant(new RestaurantId().setId(restaurantId), (error, response) => { if (error) { - res.status(500) - res.json({error: error.message}); + res.status(500).send({error: error.message}); } else { res.json(response.toObject()); } @@ -48,8 +45,7 @@ promotionRoutes.post('/api/promotion', (req, res) => { .setRestaurantId(restaurantId); promotionServiceClient.createPromotion(promotionCreateInput, (error, response) => { if (error) { - res.status(500) - res.json({error: error.message}); + res.status(500).send({error: error.message}); } else { res.json(response.toObject()); } @@ -66,8 +62,7 @@ promotionRoutes.put('/api/promotion/:id', (req, res) => { promotionServiceClient.createPromotion(promotionUpdateInput, (error, response) => { if (error) { - res.status(500) - res.json({error: error.message}); + res.status(500).send({error: error.message}); } else { res.json(response.toObject()); } @@ -79,8 +74,7 @@ promotionRoutes.delete('/api/promotion/:id', (req, res) => { promotionServiceClient.deletePromotion(new PromotionId().setId(id), (error, response) => { if (error) { - res.status(500) - res.json({error: error.message}); + res.status(500).send({error: error.message}); } else { res.json(response.toObject()); } diff --git a/services/gateway/src/controller/stock/stock.controller.ts b/services/gateway/src/controller/stock/stock.controller.ts index 4525df45..f9a63d4e 100644 --- a/services/gateway/src/controller/stock/stock.controller.ts +++ b/services/gateway/src/controller/stock/stock.controller.ts @@ -37,8 +37,7 @@ stockRoutes.get('/api/stock/supplier/:id', (req: Request, res: Response) => { stockServiceClient.getSupplier(supplierRequest, (error, response) => { if (error) { - res.status(500) - res.json({error: error.message}); + res.status(500).send({error: error.message}); } else { res.json(response.toObject()); } @@ -49,8 +48,7 @@ stockRoutes.get('/api/stock/supplier', (req: Request, res: Response) => { stockServiceClient.getSuppliers(new Empty(), (error, response) => { if (error) { - res.status(500) - res.json({error: error.message}); + res.status(500).send({error: error.message}); } else { res.json(response.toObject()); } @@ -63,8 +61,7 @@ stockRoutes.get('/api/stock/ingredient/:id', (req: Request, res: Response) => { stockServiceClient.getIngredient(ingredientRequest, (error, response) => { if (error) { - res.status(500) - res.json({error: error.message}); + res.status(500).send({error: error.message}); } else { res.json(response.toObject()); } @@ -75,8 +72,7 @@ stockRoutes.get('/api/stock/ingredient', (req: Request, res: Response) => { stockServiceClient.getIngredients(new Empty(), (error, response) => { if (error) { - res.status(500) - res.json({error: error.message}); + res.status(500).send({error: error.message}); } else { res.json(response.toObject()); } @@ -89,8 +85,7 @@ stockRoutes.post('/api/stock/ingredient', (req: Request, res: Response) => { stockServiceClient.createIngredient(ingredientRequest, (error, response) => { if (error) { - res.status(500) - res.json({error: error.message}); + res.status(500).send({error: error.message}); } else { res.json(response.toObject()); } @@ -104,8 +99,7 @@ stockRoutes.put('/api/stock/ingredient/:id', (req: Request, res: Response) => { stockServiceClient.updateIngredient(ingredientRequest, (error, response) => { if (error) { - res.status(500) - res.json({error: error.message}); + res.status(500).send({error: error.message}); } else { res.json(response.toObject()); } @@ -118,8 +112,7 @@ stockRoutes.delete('/api/stock/ingredient/:id', (req: Request, res: Response) => stockServiceClient.deleteIngredient(ingredientRequest, (error, response) => { if (error) { - res.status(500) - res.json({error: error.message}); + res.status(500).send({error: error.message}); } else { res.json(response.toObject()); } @@ -132,8 +125,7 @@ stockRoutes.delete('/api/stock/ingredient/:id', (req: Request, res: Response) => stockServiceClient.deleteIngredient(ingredientRequest, (error, response) => { if (error) { - res.status(500) - res.json({error: error.message}); + res.status(500).send({error: error.message}); } else { res.json(response.toObject()); } @@ -150,8 +142,7 @@ stockRoutes.get('/api/stock/ingredient/restaurant/:id', (req: Request, res: Resp stockServiceClient.getIngredientRestaurant(ingredientRestaurantRequest, (error, response) => { if (error) { - res.status(500) - res.json({error: error.message}); + res.status(500).send({error: error.message}); } else { res.json(response.toObject()); } @@ -164,8 +155,7 @@ stockRoutes.get('/api/stock/ingredient/restaurant/by-restaurant/:id', (req: Requ stockServiceClient.getIngredientRestaurantsByRestaurant(ingredientRestaurantsByRestaurantRequest, (error, response) => { if (error) { - res.status(500) - res.json({error: error.message}); + res.status(500).send({error: error.message}); } else { res.json(response.toObject()); } @@ -178,8 +168,7 @@ stockRoutes.get('/api/stock/ingredient/restaurant/by-product/:id', (req: Request stockServiceClient.getIngredientRestaurantsByProduct(ingredientRestaurantsByProductRequest, (error, response) => { if (error) { - res.status(500) - res.json({error: error.message}); + res.status(500).send({error: error.message}); } else { res.json(response.toObject()); } @@ -199,8 +188,7 @@ stockRoutes.post('/api/stock/ingredient/restaurant', (req: Request, res: Respons stockServiceClient.createIngredientRestaurant(ingredientRestaurant, (error, response) => { if (error) { - res.status(500) - res.json({error: error.message}); + res.status(500).send({error: error.message}); } else { res.json(response.toObject()); } @@ -221,8 +209,7 @@ stockRoutes.put('/api/stock/ingredient/restaurant/:id', (req: Request, res: Resp stockServiceClient.updateIngredientRestaurant(ingredientRestaurant, (error, response) => { if (error) { - res.status(500) - res.json({error: error.message}); + res.status(500).send({error: error.message}); } else { res.json(response.toObject()); } @@ -234,8 +221,7 @@ stockRoutes.delete('/api/stock/ingredient/restaurant/:id', (req: Request, res: R stockServiceClient.deleteIngredientRestaurant(new DeleteIngredientRestaurantRequest().setId(Number(id)), (error, response) => { if (error) { - res.status(500) - res.json({error: error.message}); + res.status(500).send({error: error.message}); } else { res.json(response.toObject()); } @@ -251,8 +237,7 @@ stockRoutes.get('/api/stock/supplier/:id', (req: Request, res: Response) => { stockServiceClient.getSupplier(new GetSupplierRequest().setId(Number(id)), (error, response) => { if (error) { - res.status(500) - res.json({error: error.message}); + res.status(500).send({error: error.message}); } else { res.json(response.toObject()); } @@ -262,8 +247,7 @@ stockRoutes.get('/api/stock/supplier/:id', (req: Request, res: Response) => { stockRoutes.get('/api/stock/supplier', (req: Request, res: Response) => { stockServiceClient.getSuppliers(new Empty(), (error, response) => { if (error) { - res.status(500) - res.json({error: error.message}); + res.status(500).send({error: error.message}); } else { res.json(response.toObject()); } @@ -276,8 +260,7 @@ stockRoutes.post('/api/stock/supplier', (req: Request, res: Response) => { stockServiceClient.createSupplier(supplierRequest, (error, response) => { if (error) { - res.status(500) - res.json({error: error.message}); + res.status(500).send({error: error.message}); } else { res.json(response.toObject()); } @@ -291,8 +274,7 @@ stockRoutes.put('/api/stock/supplier/:id', (req: Request, res: Response) => { stockServiceClient.updateSupplier(supplierRequest, (error, response) => { if (error) { - res.status(500) - res.json({error: error.message}); + res.status(500).send({error: error.message}); } else { res.json(response.toObject()); } @@ -304,8 +286,7 @@ stockRoutes.delete('/api/stock/supplier/:id', (req: Request, res: Response) => { stockServiceClient.deleteSupplier(new DeleteSupplierRequest().setId(Number(id)), (error, response) => { if (error) { - res.status(500) - res.json({error: error.message}); + res.status(500).send({error: error.message}); } else { res.json(response.toObject()); } @@ -321,8 +302,7 @@ stockRoutes.get('/api/stock/supply/order/:id', (req: Request, res: Response) => stockServiceClient.getSupplyOrder(new GetSupplyOrderRequest().setId(Number(id)), (error, response) => { if (error) { - res.status(500) - res.json({error: error.message}); + res.status(500).send({error: error.message}); } else { res.json(response.toObject()); } @@ -333,8 +313,7 @@ stockRoutes.get('/api/stock/supply/order/by-restaurant/:id', (req: Request, res: const {id} = req.params; stockServiceClient.getSupplyOrdersByRestaurant(new GetSupplyOrdersByRestaurantRequest().setRestaurantId(id), (error, response) => { if (error) { - res.status(500) - res.json({error: error.message}); + res.status(500).send({error: error.message}); } else { res.json(response.toObject()); } @@ -345,8 +324,7 @@ stockRoutes.get('/api/stock/supply/order/by-supplier/:id', (req: Request, res: R const {id} = req.params; stockServiceClient.getSupplyOrdersBySupplier(new GetSupplyOrdersBySupplierRequest().setSupplierId(Number(id)), (error, response) => { if (error) { - res.status(500) - res.json({error: error.message}); + res.status(500).send({error: error.message}); } else { res.json(response.toObject()); } @@ -357,8 +335,7 @@ stockRoutes.get('/api/stock/supply/order/by-ingredient-restaurant/:id', (req: Re const {id} = req.params; stockServiceClient.getSupplyOrdersByIngredientRestaurant(new GetSupplyOrdersByIngredientRestaurantRequest().setIngredientRestaurantId(Number(id)), (error, response) => { if (error) { - res.status(500) - res.json({error: error.message}); + res.status(500).send({error: error.message}); } else { res.json(response.toObject()); } @@ -373,8 +350,7 @@ stockRoutes.post('/api/stock/supply/order', (req: Request, res: Response) => { stockServiceClient.createSupplyOrder(supplyOrderRequest, (error, response) => { if (error) { - res.status(500) - res.json({error: error.message}); + res.status(500).send({error: error.message}); } else { res.json(response.toObject()); } @@ -390,8 +366,7 @@ stockRoutes.put('/api/stock/supply/order/:id', (req: Request, res: Response) => stockServiceClient.updateSupplyOrder(supplyOrderRequest, (error, response) => { if (error) { - res.status(500) - res.json({error: error.message}); + res.status(500).send({error: error.message}); } else { res.json(response.toObject()); } @@ -402,8 +377,7 @@ stockRoutes.delete('/api/stock/supply/order/:id', (req: Request, res: Response) const {id} = req.params; stockServiceClient.deleteSupplyOrder(new DeleteSupplyOrderRequest().setId(Number(id)), (error, response) => { if (error) { - res.status(500) - res.json({error: error.message}); + res.status(500).send({error: error.message}); } else { res.json(response.toObject()); } diff --git a/services/gateway/src/controller/stock/stockPerson.controller.ts b/services/gateway/src/controller/stock/stockPerson.controller.ts index 5d3b8504..cc8c9bf8 100644 --- a/services/gateway/src/controller/stock/stockPerson.controller.ts +++ b/services/gateway/src/controller/stock/stockPerson.controller.ts @@ -11,8 +11,7 @@ stockPersonRoutes.post('/api/stock/outcomes/by-restaurant/:id', (req: Request, r stockPersonServiceClient.getOutcomesByRestaurant(outcomesByRestaurantRequest, (error, response) => { if (error) { - res.status(500) - res.json({error: error.message}); + res.status(500).send({error: error.message}); } else { res.json(response.toObject()); } diff --git a/services/gateway/src/controller/user/user.controller.ts b/services/gateway/src/controller/user/user.controller.ts index 7605bdcd..eb5c8e5f 100644 --- a/services/gateway/src/controller/user/user.controller.ts +++ b/services/gateway/src/controller/user/user.controller.ts @@ -26,8 +26,7 @@ userRoutes.get('/api/user/:id', (req: Request, res: Response) => { userRoutes.get('/api/user', (req: Request, res: Response) => { userServiceClient.listUser(new Empty(), (error, response) => { if (error) { - res.status(500) - res.json({error: error.message}); + res.status(500).send({error: error.message}); } else { res.json(response.toObject()); } @@ -52,8 +51,7 @@ userRoutes.post('/api/user', (req: Request, res: Response) => { userServiceClient.register(userInput, (error, response) => { if (error) { - res.status(500) - res.json({error: error.message}); + res.status(500).send({error: error.message}); } else { res.json(response.toObject()); } @@ -86,8 +84,7 @@ userRoutes.put('/api/user/:id', (req: Request, res: Response) => { userServiceClient.updateUser(userInput, (error, response) => { if (error) { - res.status(500) - res.json({error: error.message}); + res.status(500).send({error: error.message}); } else { res.json(response.toObject()); } @@ -104,8 +101,7 @@ userRoutes.delete('/api/user/:id', (req: Request, res: Response) => { userServiceClient.deleteUser(new DeleteInput().setUserid(Number(id)).setToken(authorization), (error, response) => { if (error) { - res.status(500) - res.json({error: error.message}); + res.status(500).send({error: error.message}); } else { res.json(response.toObject()); } @@ -118,8 +114,7 @@ userRoutes.post('/api/user/login', (req: Request, res: Response) => { userServiceClient.logIn(inInput, (error, response) => { if (error) { - res.status(500) - res.json({error: error.message}); + res.status(500).send({error: error.message}); } else { res.json(response.toObject()); } @@ -136,8 +131,7 @@ userRoutes.post('/api/user/validate', (req: Request, res: Response) => { userServiceClient.validate(validate, (error, response) => { if (error) { - res.status(500) - res.json({error: error.message}); + res.status(500).send({error: error.message}); } else { res.json(response.toObject()); } @@ -164,8 +158,7 @@ userRoutes.put('/api/user/:id/password', (req: Request, res: Response) => { userServiceClient.changePassword(updatePasswordInput, (error, response) => { if (error) { - res.status(500) - res.json({error: error.message}); + res.status(500).send({error: error.message}); } else { res.json(response.toObject()); } @@ -191,8 +184,7 @@ userRoutes.put('/api/user/:id/role', (req: Request, res: Response) => { } userServiceClient.changeRole(updatePasswordInput, (error, response) => { if (error) { - res.status(500) - res.json({error: error.message}); + res.status(500).send({error: error.message}); } else { res.json(response.toObject()); } diff --git a/services/promotions/.env.example b/services/promotions/.env.example index b1adbc98..e1787832 100644 --- a/services/promotions/.env.example +++ b/services/promotions/.env.example @@ -1,4 +1,4 @@ -DATABASE_URL=postgresql://postgres:postgres@localhost:5432/promotions +DATABASE_URL=postgres://postgres:password@localhost:5432/promotions AMQP_URL=amqp://guest:guest@localhost PORT=50006 \ No newline at end of file From 9b61d1fbcb5b6338f3a5678827011a2e5c07bd74 Mon Sep 17 00:00:00 2001 From: anatole Date: Tue, 15 Aug 2023 20:34:33 +0200 Subject: [PATCH 382/883] feat(global): add stock service to the docker compose --- services/docker-compose.yml | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/services/docker-compose.yml b/services/docker-compose.yml index a672240a..364a6aea 100644 --- a/services/docker-compose.yml +++ b/services/docker-compose.yml @@ -136,11 +136,39 @@ services: POSTGRES_DB: postgres PGDATA: /var/lib/postgresql/data/pgdata + # Stock service + stock-service: + image: goodfood-stock:1.0.0 + build: + context: . + dockerfile: ./stock/Dockerfile + env_file: + - stock/.env.docker + ports: + - "50009" + networks: + - goodfood-network + + stock-postgres: + image: postgres:latest + ports: + - "5432" + volumes: + - goodfood-stock-volume:/var/lib/postgresql/data + networks: + - goodfood-network + environment: + POSTGRES_USER: postgres + POSTGRES_PASSWORD: password + POSTGRES_DB: postgres + PGDATA: /var/lib/postgresql/data/pgdata + volumes: goodfood-delivery-volume: goodfood-order-volume: goodfood-product-volume: goodfood-promotion-volume: + goodfood-stock-volume: networks: goodfood-network: \ No newline at end of file From 0fa7e0b7ed1f47daacccccdd3ac44a29ea9bd474 Mon Sep 17 00:00:00 2001 From: Pierre Lebigre Date: Sat, 19 Aug 2023 15:15:46 +0200 Subject: [PATCH 383/883] init prisma --- README.md | 31 +++++++++---------- services/notification/.gitignore | 3 ++ services/notification/package.json | 6 ++++ services/notification/pnpm-lock.yaml | 35 ++++++++++++++++++++++ services/notification/prisma/schema.prisma | 18 +++++++++++ services/notification/tsconfig.json | 18 +++++++++++ 6 files changed, 96 insertions(+), 15 deletions(-) create mode 100644 services/notification/.gitignore create mode 100644 services/notification/package.json create mode 100644 services/notification/pnpm-lock.yaml create mode 100644 services/notification/prisma/schema.prisma create mode 100644 services/notification/tsconfig.json diff --git a/README.md b/README.md index a405370d..0f588294 100644 --- a/README.md +++ b/README.md @@ -10,21 +10,22 @@ The GoodFood 2.0 project was initiated to update the existing ordering applicati ## Microservices ports -| Service | Port | Language | Database | Status | Assignee | -| ----------- | ----- | ----------- | ---------- | ------ | --------------- | -| Gateway | 50000 | Go | ❌ | ❌ | @Anatole-Godard | -| User (auth) | 50001 | Go | PostgreSQL | ❌ | @Anatole-Godard | -| Basket | 50002 | NodeJS (ts) | Redis | ❌ | @Anatole-Godard | -| Payment | 50003 | NodeJS (ts) | PostgreSQL | ❌ | @Anatole-Godard | -| Product | 50004 | NodeJS (ts) | PostgreSQL | ❌ | @PierreLbg | -| Restaurant | 50005 | NodeJS (ts) | PostgreSQL | ❌ | @PierreLbg | -| Promotion | 50006 | NodeJS (ts) | PostgreSQL | ❌ | @PierreLbg | -| Order | 50007 | NodeJS (ts) | PostgreSQL | ✅ | @floriaaan | -| Delivery | 50008 | NodeJS (ts) | PostgreSQL | ⚠️ | @floriaaan | -| Stock | 50009 | NodeJS (ts) | PostgreSQL | ❌ | @floriaaan | -| Reporting | 50020 | C# (dotnet) | PostgreSQL | ❌ | @floriaaan | -| Log | 50021 | Go | PostgreSQL | ✅ | @floriaaan | -| (...) | (...) | (...) | (...) | (...) | +| Service | Port | Language | Database | Status | Assignee | +| ------------ | ----- | ----------- | ---------- | ------ | --------------- | +| Gateway | 50000 | Go | ❌ | ❌ | @Anatole-Godard | +| User (auth) | 50001 | Go | PostgreSQL | ❌ | @Anatole-Godard | +| Basket | 50002 | NodeJS (ts) | Redis | ❌ | @Anatole-Godard | +| Payment | 50003 | NodeJS (ts) | PostgreSQL | ❌ | @Anatole-Godard | +| Product | 50004 | NodeJS (ts) | PostgreSQL | ❌ | @PierreLbg | +| Restaurant | 50005 | NodeJS (ts) | PostgreSQL | ❌ | @PierreLbg | +| Promotion | 50006 | NodeJS (ts) | PostgreSQL | ❌ | @PierreLbg | +| Order | 50007 | NodeJS (ts) | PostgreSQL | ✅ | @floriaaan | +| Delivery | 50008 | NodeJS (ts) | PostgreSQL | ⚠️ | @floriaaan | +| Stock | 50009 | NodeJS (ts) | PostgreSQL | ❌ | @floriaaan | +| Reporting | 50020 | C# (dotnet) | PostgreSQL | ❌ | @floriaaan | +| Log | 50021 | Go | PostgreSQL | ✅ | @floriaaan | +| Notification | 50022 | NodeJS (ts) | PostgreSQL | ❌ | @PierreLbg | +| (...) | (...) | (...) | (...) | (...) | ## File Hierarchy diff --git a/services/notification/.gitignore b/services/notification/.gitignore new file mode 100644 index 00000000..11ddd8db --- /dev/null +++ b/services/notification/.gitignore @@ -0,0 +1,3 @@ +node_modules +# Keep environment variables out of version control +.env diff --git a/services/notification/package.json b/services/notification/package.json new file mode 100644 index 00000000..1b2ecb3b --- /dev/null +++ b/services/notification/package.json @@ -0,0 +1,6 @@ +{ + "devDependencies": { + "prisma": "^5.1.0", + "typescript": "^5.1.6" + } +} diff --git a/services/notification/pnpm-lock.yaml b/services/notification/pnpm-lock.yaml new file mode 100644 index 00000000..1fad5c3f --- /dev/null +++ b/services/notification/pnpm-lock.yaml @@ -0,0 +1,35 @@ +lockfileVersion: '6.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +devDependencies: + prisma: + specifier: ^5.1.0 + version: 5.1.0 + typescript: + specifier: ^5.1.6 + version: 5.1.6 + +packages: + + /@prisma/engines@5.1.0: + resolution: {integrity: sha512-HqaFsnPmZOdMWkPq6tT2eTVTQyaAXEDdKszcZ4yc7DGMBIYRP6j/zAJTtZUG9SsMV8FaucdL5vRyxY/p5Ni28g==} + requiresBuild: true + dev: true + + /prisma@5.1.0: + resolution: {integrity: sha512-wkXvh+6wxk03G8qwpZMOed4Y3j+EQ+bMTlvbDZHeal6k1E8QuGKzRO7DRXlE1NV0WNgOAas8kwZqcLETQ2+BiQ==} + engines: {node: '>=16.13'} + hasBin: true + requiresBuild: true + dependencies: + '@prisma/engines': 5.1.0 + dev: true + + /typescript@5.1.6: + resolution: {integrity: sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==} + engines: {node: '>=14.17'} + hasBin: true + dev: true diff --git a/services/notification/prisma/schema.prisma b/services/notification/prisma/schema.prisma new file mode 100644 index 00000000..5d9df6ce --- /dev/null +++ b/services/notification/prisma/schema.prisma @@ -0,0 +1,18 @@ +// This is your Prisma schema file, +// learn more about it in the docs: https://pris.ly/d/prisma-schema + +generator client { + provider = "prisma-client-js" +} + +datasource db { + provider = "postgresql" + url = env("DATABASE_URL") +} + +model Notification { + id String @id @default(cuid()) + title String + message String + message_type String +} \ No newline at end of file diff --git a/services/notification/tsconfig.json b/services/notification/tsconfig.json new file mode 100644 index 00000000..4eb46577 --- /dev/null +++ b/services/notification/tsconfig.json @@ -0,0 +1,18 @@ +{ + "compilerOptions": { + "sourceMap": true, + "outDir": "dist", + "strict": true, + "lib": ["esnext"], + "esModuleInterop": true, + "baseUrl": ".", + "paths": { + "@promotions/*": ["src/*"] + } + }, + "include": ["src/**/*.ts"], + "exclude": ["node_modules"], + "ts-node": { + "require": ["tsconfig-paths/register"] + } +} From d11c61e2fba49e8dabd8f305282f25990422a783 Mon Sep 17 00:00:00 2001 From: Florian LEROUX Date: Sat, 19 Aug 2023 17:04:36 +0200 Subject: [PATCH 384/883] init: add restaurant service --- .github/workflows/restaurant.yml | 69 ++ README.md | 18 +- services/proto/restaurant.proto | 53 + services/restaurant/.dockerignore | 2 + services/restaurant/.env.example | 4 + services/restaurant/.gitignore | 5 + services/restaurant/Dockerfile | 38 + services/restaurant/README.md | 77 ++ services/restaurant/k8s/configmap.yml | 8 + services/restaurant/k8s/deployment.yml | 31 + services/restaurant/k8s/hpa.yml | 18 + services/restaurant/k8s/ingress.yml | 17 + services/restaurant/k8s/service.yml | 13 + services/restaurant/package.json | 29 + services/restaurant/pnpm-lock.yaml | 992 ++++++++++++++++++ .../20230819142125_init/migration.sql | 14 + .../migration.sql | 12 + .../prisma/migrations/migration_lock.toml | 3 + services/restaurant/prisma/schema.prisma | 23 + services/restaurant/proto | 1 + services/restaurant/src/handler/create.ts | 33 + services/restaurant/src/handler/delete.ts | 20 + services/restaurant/src/handler/get.ts | 22 + services/restaurant/src/handler/index.ts | 15 + services/restaurant/src/handler/list-all.ts | 19 + .../src/handler/list-by-location.ts | 30 + services/restaurant/src/handler/update.ts | 31 + services/restaurant/src/lib/amqp.ts | 32 + services/restaurant/src/lib/log.ts | 74 ++ services/restaurant/src/lib/prisma.ts | 29 + services/restaurant/src/lib/proxy.ts | 132 +++ services/restaurant/src/middleware/log.ts | 42 + .../src/resources/grpc-credentials.ts | 5 + .../src/resources/protoloader-options.ts | 7 + services/restaurant/src/server.ts | 39 + services/restaurant/src/types/index.d.ts | 3 + services/restaurant/src/types/restaurant.d.ts | 32 + services/restaurant/terraform/data.tf | 13 + .../terraform/env/dev-backend.tfvars.example | 4 + .../terraform/env/dev.tfvars.example | 1 + services/restaurant/terraform/main.tf | 74 ++ services/restaurant/terraform/outputs.tf | 6 + services/restaurant/terraform/variables.tf | 16 + services/restaurant/tsconfig.json | 18 + 44 files changed, 2115 insertions(+), 9 deletions(-) create mode 100644 .github/workflows/restaurant.yml create mode 100644 services/proto/restaurant.proto create mode 100644 services/restaurant/.dockerignore create mode 100644 services/restaurant/.env.example create mode 100644 services/restaurant/.gitignore create mode 100644 services/restaurant/Dockerfile create mode 100644 services/restaurant/README.md create mode 100644 services/restaurant/k8s/configmap.yml create mode 100644 services/restaurant/k8s/deployment.yml create mode 100644 services/restaurant/k8s/hpa.yml create mode 100644 services/restaurant/k8s/ingress.yml create mode 100644 services/restaurant/k8s/service.yml create mode 100644 services/restaurant/package.json create mode 100644 services/restaurant/pnpm-lock.yaml create mode 100644 services/restaurant/prisma/migrations/20230819142125_init/migration.sql create mode 100644 services/restaurant/prisma/migrations/20230819145035_fix_restaurant_id_type/migration.sql create mode 100644 services/restaurant/prisma/migrations/migration_lock.toml create mode 100644 services/restaurant/prisma/schema.prisma create mode 120000 services/restaurant/proto create mode 100644 services/restaurant/src/handler/create.ts create mode 100644 services/restaurant/src/handler/delete.ts create mode 100644 services/restaurant/src/handler/get.ts create mode 100644 services/restaurant/src/handler/index.ts create mode 100644 services/restaurant/src/handler/list-all.ts create mode 100644 services/restaurant/src/handler/list-by-location.ts create mode 100644 services/restaurant/src/handler/update.ts create mode 100644 services/restaurant/src/lib/amqp.ts create mode 100644 services/restaurant/src/lib/log.ts create mode 100644 services/restaurant/src/lib/prisma.ts create mode 100644 services/restaurant/src/lib/proxy.ts create mode 100644 services/restaurant/src/middleware/log.ts create mode 100644 services/restaurant/src/resources/grpc-credentials.ts create mode 100644 services/restaurant/src/resources/protoloader-options.ts create mode 100644 services/restaurant/src/server.ts create mode 100644 services/restaurant/src/types/index.d.ts create mode 100644 services/restaurant/src/types/restaurant.d.ts create mode 100644 services/restaurant/terraform/data.tf create mode 100644 services/restaurant/terraform/env/dev-backend.tfvars.example create mode 100644 services/restaurant/terraform/env/dev.tfvars.example create mode 100644 services/restaurant/terraform/main.tf create mode 100644 services/restaurant/terraform/outputs.tf create mode 100644 services/restaurant/terraform/variables.tf create mode 100644 services/restaurant/tsconfig.json diff --git a/.github/workflows/restaurant.yml b/.github/workflows/restaurant.yml new file mode 100644 index 00000000..5bdb83ef --- /dev/null +++ b/.github/workflows/restaurant.yml @@ -0,0 +1,69 @@ +name: Restaurant Microservice CI/CD + +on: + push: + branches: [ restaurant ] + pull_request: + branches: [ dev, main ] + +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@master + - uses: pnpm/action-setup@v2 + with: + version: latest + - uses: actions/setup-node@v3 + with: + node-version: "18.x" + cache: "pnpm" + cache-dependency-path: services/restaurant/pnpm-lock.yaml + - name: Install dependencies + run: | + cd ./services/restaurant + pnpm install --frozen-lockfile + - name: Build + run: | + cd ./services/restaurant + pnpm build + + test: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@master + - uses: pnpm/action-setup@v2 + with: + version: latest + - uses: actions/setup-node@v3 + with: + node-version: "18.x" + cache: "pnpm" + cache-dependency-path: services/restaurant/pnpm-lock.yaml + - name: Install dependencies + run: | + cd ./services/restaurant + pnpm install --frozen-lockfile + - name: Execute tests + run: | + cd ./services/restaurant + pnpm test + + publish: + runs-on: ubuntu-latest + needs: [ build, test ] + steps: + - name: Checkout code + uses: actions/checkout@master + - name: Login to Docker Hub + uses: docker/login-action@v2 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + - name: Build and push + uses: docker/build-push-action@v4 + with: + context: ./services/ + file: ./services/restaurant/Dockerfile + push: true + tags: floriaaan/goodfood-restaurant:latest \ No newline at end of file diff --git a/README.md b/README.md index b21c638f..66e93439 100644 --- a/README.md +++ b/README.md @@ -16,19 +16,19 @@ a high volume of concurrent users, up to several thousand. ## Microservices ports | Service | Port | Language | Database | Status | Assignee | -|-------------|-------|-------------|------------|--------|-----------------| -| Gateway | 50000 | Go | ❌ | ❌ | @Anatole-Godard | +| ----------- | ----- | ----------- | ---------- | ------ | --------------- | +| Gateway | 50000 | Go | ❌ | ❌ | @Anatole-Godard | | User (auth) | 50001 | Go | PostgreSQL | ⚠️ | @Anatole-Godard | | Basket | 50002 | NodeJS (ts) | Redis | ⚠️ | @Anatole-Godard | -| Payment | 50003 | NodeJS (ts) | PostgreSQL | ✅ | @floriaaan | -| Product | 50004 | NodeJS (ts) | PostgreSQL | ❌ | @PierreLbg | -| Restaurant | 50005 | NodeJS (ts) | PostgreSQL | ❌ | @PierreLbg | -| Promotion | 50006 | NodeJS (ts) | PostgreSQL | ❌ | @PierreLbg | -| Order | 50007 | NodeJS (ts) | PostgreSQL | ✅ | @floriaaan | -| Delivery | 50008 | NodeJS (ts) | PostgreSQL | ✅ | @floriaaan | +| Payment | 50003 | NodeJS (ts) | PostgreSQL | ✅ | @floriaaan | +| Product | 50004 | NodeJS (ts) | PostgreSQL | ❌ | @PierreLbg | +| Restaurant | 50005 | NodeJS (ts) | PostgreSQL | ❌ | @floriaaan | +| Promotion | 50006 | NodeJS (ts) | PostgreSQL | ❌ | @PierreLbg | +| Order | 50007 | NodeJS (ts) | PostgreSQL | ✅ | @floriaaan | +| Delivery | 50008 | NodeJS (ts) | PostgreSQL | ✅ | @floriaaan | | Stock | 50009 | NodeJS (ts) | PostgreSQL | ⚠️ | @floriaaan | | Reporting | 50020 | C# (dotnet) | PostgreSQL | ⚠️ | @floriaaan | -| Log | 50021 | Go | PostgreSQL | ✅ | @floriaaan | +| Log | 50021 | Go | PostgreSQL | ✅ | @floriaaan | | (...) | (...) | (...) | (...) | (...) | ## File Hierarchy diff --git a/services/proto/restaurant.proto b/services/proto/restaurant.proto new file mode 100644 index 00000000..ecf87eec --- /dev/null +++ b/services/proto/restaurant.proto @@ -0,0 +1,53 @@ +syntax = "proto3"; +import "google/protobuf/empty.proto"; + +package com.goodfood.restaurant; + +message Restaurant { + string id = 1; + + string name = 2; + optional string description = 3; + + repeated float location = 4; + optional string address = 5; + + repeated string openingHours = 6; + optional string phone = 7; + + string createdAt = 8; + string updatedAt = 9; +} + +message RestaurantCreateInput{ + string name = 1; + optional string description = 2; + + repeated float location = 3; + optional string address = 4; + + repeated string openingHours = 5; + optional string phone = 6; +} + +message RestaurantList { + repeated Restaurant restaurants = 1; +} + +message ByLocationInput { + repeated float location = 1; +} + +message RestaurantId { + string id = 1; +} + + +service RestaurantService { + rpc CreateRestaurant (RestaurantCreateInput) returns (Restaurant) {} + rpc GetRestaurant (RestaurantId) returns (Restaurant) {} + rpc UpdateRestaurant (Restaurant) returns (Restaurant) {} + rpc DeleteRestaurant (RestaurantId) returns (google.protobuf.Empty) {} + rpc GetRestaurants (google.protobuf.Empty) returns (RestaurantList) {} + rpc GetRestaurantsByLocation (ByLocationInput) returns (RestaurantList) {} +} diff --git a/services/restaurant/.dockerignore b/services/restaurant/.dockerignore new file mode 100644 index 00000000..b7dab5e9 --- /dev/null +++ b/services/restaurant/.dockerignore @@ -0,0 +1,2 @@ +node_modules +build \ No newline at end of file diff --git a/services/restaurant/.env.example b/services/restaurant/.env.example new file mode 100644 index 00000000..ff61e645 --- /dev/null +++ b/services/restaurant/.env.example @@ -0,0 +1,4 @@ +DATABASE_URL=postgresql://postgres:postgres@localhost:5432/postgres +AMQP_URL=amqp://guest:guest@localhost + +PORT=50005 \ No newline at end of file diff --git a/services/restaurant/.gitignore b/services/restaurant/.gitignore new file mode 100644 index 00000000..bab9187d --- /dev/null +++ b/services/restaurant/.gitignore @@ -0,0 +1,5 @@ +node_modules/ +dist/ +bin/ +*.env* +!*.env.example \ No newline at end of file diff --git a/services/restaurant/Dockerfile b/services/restaurant/Dockerfile new file mode 100644 index 00000000..c8ec816f --- /dev/null +++ b/services/restaurant/Dockerfile @@ -0,0 +1,38 @@ +FROM node:18-alpine3.17 as builder + +# Set working directory +WORKDIR /app + +# Copy the application code +COPY ./restaurant/ . + +# Install dependencies +RUN npm install + +# Copy the proto files +COPY ./proto ./proto/ + +# Generate Prisma client +RUN npx prisma generate + +# Build the application +RUN npm run build + + +# Create a new image with the application +FROM node:18-alpine3.17 as runner + +# Set working directory +WORKDIR /app + +# Copy the application package +COPY --from=builder /app/dist . +COPY --from=builder /app/prisma/ . +COPY --from=builder /app/proto/ /proto/ +COPY --from=builder /app/node_modules/.prisma /.prisma + +# Expose the gRPC port +EXPOSE 50005 + +# Start the server +CMD [ "node", "index.js"] diff --git a/services/restaurant/README.md b/services/restaurant/README.md new file mode 100644 index 00000000..e94e1bc8 --- /dev/null +++ b/services/restaurant/README.md @@ -0,0 +1,77 @@ +# Restaurant Microservice + +| Informations | +| ------------------------------------------------------------------ | +| **Port:** 50005 | +| **Developer:** @floriaaan | +| **Status:** In progress | +| **Last update:** 2023-08-19 | +| **Language:** NodeJS | +| **Dependencies:** TypeScript, Prisma, gRPC, Postgres | +| **Models:** (see [`prisma/schema.prisma`](./prisma/schema.prisma)) | + +## gRPC Methods + +TBW + +## Requirements + +To run this microservice, you will need to have the following installed on your system: + +- NodeJS (v18.12.0 or higher) (dev. with v18.12.0) +- Postgres (v15.2 or higher) (dev. with docker image `postgres:15.2`) + +You can use the following tools to help you with the setup: + +- You can use nvm to set your Node version using: + - `nvm use`. +- You can use docker to run your Postgres database using: + - `docker run --name postgres -p 5432:5432 -e POSTGRES_PASSWORD=password -d postgres` + +## Getting started + +### 1. Clone the repository and install dependencies + +1. Clone the `goodfood` repository to your local machine. +2. Navigate to the service directory (`services/promotions`) in your terminal. +3. Run `npm install` to install the necessary dependencies. +4. Create a `.env` file at the root of the project directory and add the environment variables values ( + see `.env.example`). +5. Run `npm run start` to start the microservice. + +You can now access the microservice at `http://localhost:50006`. + +NB: If you want to run the microservice in development mode, you can run `npm run dev` instead. + +### 2. Create and seed the database + +Run the following command to create your Postgres database structure. This also creates the models tables that are +defined in [`prisma/schema.prisma`](./prisma/schema.prisma): + +``` +npx prisma migrate dev --name init +``` + +When `npx prisma migrate dev` is executed against a newly created database, seeding is also triggered. The seed file +in [`prisma/seed.ts`](./prisma/seed.ts) will be executed and your database will be populated with the sample data. + +## Build and Run with Docker + +### Build + +To build the image you need to be in the **parent folder** of the service you want to build. Then run the following +command: + +``` +docker build -t goodfood-restaurant:1.0.0 -f ./restaurant/Dockerfile . +docker tag goodfood-restaurant:1.0.0 pierrelbg/goodfood-restaurant:1.0.0 +docker push floriaaan/goodfood-restaurant:1.0.0 +``` + +### Run + +Create the .env base on the .env.example. Then run the following command: + +``` +docker run --env-file=.env goodfood-restaurant:1.0.0 +``` diff --git a/services/restaurant/k8s/configmap.yml b/services/restaurant/k8s/configmap.yml new file mode 100644 index 00000000..920cfdea --- /dev/null +++ b/services/restaurant/k8s/configmap.yml @@ -0,0 +1,8 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: goodfood-restaurant-configmap + labels: + app: goodfood-restaurant +data: + port: "50005" \ No newline at end of file diff --git a/services/restaurant/k8s/deployment.yml b/services/restaurant/k8s/deployment.yml new file mode 100644 index 00000000..435d0787 --- /dev/null +++ b/services/restaurant/k8s/deployment.yml @@ -0,0 +1,31 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: goodfood-restaurant + labels: + app: goodfood-restaurant +spec: + selector: + matchLabels: + app: goodfood-restaurant + template: + metadata: + labels: + app: goodfood-restaurant + spec: + containers: + - name: goodfood-restaurant + image: floriaaan/goodfood-restaurant:1.0.0 + imagePullPolicy: Always + resources: + limits: + memory: "128Mi" + cpu: "200m" + env: + - name: PORT + valueFrom: + configMapKeyRef: + name: goodfood-restaurant-configmap + key: port + ports: + - containerPort: 50005 diff --git a/services/restaurant/k8s/hpa.yml b/services/restaurant/k8s/hpa.yml new file mode 100644 index 00000000..146ad52d --- /dev/null +++ b/services/restaurant/k8s/hpa.yml @@ -0,0 +1,18 @@ +apiVersion: autoscaling/v2 +kind: HorizontalPodAutoscaler +metadata: + name: goodfood-restaurant-hpa +spec: + scaleTargetRef: + apiVersion: apps/v1 + kind: Deployment + name: goodfood-restaurant + minReplicas: 1 + maxReplicas: 3 + metrics: + - type: Resource + resource: + name: cpu + target: + type: Utilization + averageUtilization: 50 diff --git a/services/restaurant/k8s/ingress.yml b/services/restaurant/k8s/ingress.yml new file mode 100644 index 00000000..02b3d456 --- /dev/null +++ b/services/restaurant/k8s/ingress.yml @@ -0,0 +1,17 @@ +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + name: goodfood-restaurant +spec: + ingressClassName: nginx + rules: + - host: restaurant.localdev.me + http: + paths: + - pathType: Prefix + backend: + service: + name: goodfood-restaurant + port: + number: 50005 + path: / \ No newline at end of file diff --git a/services/restaurant/k8s/service.yml b/services/restaurant/k8s/service.yml new file mode 100644 index 00000000..c617883d --- /dev/null +++ b/services/restaurant/k8s/service.yml @@ -0,0 +1,13 @@ +apiVersion: v1 +kind: Service +metadata: + name: goodfood-delivery +spec: + selector: + app: goodfood-delivery + ports: + - name: "grpc" + port: 50005 + targetPort: 50005 +status: + loadBalancer: {} diff --git a/services/restaurant/package.json b/services/restaurant/package.json new file mode 100644 index 00000000..810d99a5 --- /dev/null +++ b/services/restaurant/package.json @@ -0,0 +1,29 @@ +{ + "name": "@goodfood/restaurant", + "bin": "dist/index.js", + "scripts": { + "start": "node dist/index.js", + "dev": "nodemon --watch 'src/**/*.ts' --exec 'ts-node' src/server.ts", + "build": "esbuild src/server.ts --bundle --platform=node --target=node18 --outfile=dist/index.js", + "test": "echo 'tests are disabled'", + "prisma:generate": "prisma generate", + "postinstall": "npm run prisma:generate" + }, + "devDependencies": { + "@types/amqplib": "^0.10.1", + "prisma": "^5.1.1", + "typescript": "^5.1.6" + }, + "dependencies": { + "@grpc/grpc-js": "^1.8.18", + "@grpc/proto-loader": "^0.7.8", + "@prisma/client": "5.1.1", + "amqplib": "^0.10.3", + "dotenv": "^16.3.1", + "esbuild": "^0.18.15", + "nodemon": "^3.0.1", + "path": "^0.12.7", + "ts-node": "^10.9.1", + "tsconfig-paths": "^4.2.0" + } +} diff --git a/services/restaurant/pnpm-lock.yaml b/services/restaurant/pnpm-lock.yaml new file mode 100644 index 00000000..82053c45 --- /dev/null +++ b/services/restaurant/pnpm-lock.yaml @@ -0,0 +1,992 @@ +lockfileVersion: '6.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +dependencies: + '@grpc/grpc-js': + specifier: ^1.8.18 + version: 1.8.18 + '@grpc/proto-loader': + specifier: ^0.7.8 + version: 0.7.8 + '@prisma/client': + specifier: 5.1.1 + version: 5.1.1(prisma@5.1.1) + amqplib: + specifier: ^0.10.3 + version: 0.10.3 + dotenv: + specifier: ^16.3.1 + version: 16.3.1 + esbuild: + specifier: ^0.18.15 + version: 0.18.15 + nodemon: + specifier: ^3.0.1 + version: 3.0.1 + path: + specifier: ^0.12.7 + version: 0.12.7 + ts-node: + specifier: ^10.9.1 + version: 10.9.1(@types/node@20.4.2)(typescript@5.1.6) + tsconfig-paths: + specifier: ^4.2.0 + version: 4.2.0 + +devDependencies: + '@types/amqplib': + specifier: ^0.10.1 + version: 0.10.1 + prisma: + specifier: ^5.1.1 + version: 5.1.1 + typescript: + specifier: ^5.1.6 + version: 5.1.6 + +packages: + + /@acuminous/bitsyntax@0.1.2: + resolution: {integrity: sha512-29lUK80d1muEQqiUsSo+3A0yP6CdspgC95EnKBMi22Xlwt79i/En4Vr67+cXhU+cZjbti3TgGGC5wy1stIywVQ==} + engines: {node: '>=0.8'} + dependencies: + buffer-more-ints: 1.0.0 + debug: 4.3.4 + safe-buffer: 5.1.2 + transitivePeerDependencies: + - supports-color + dev: false + + /@cspotcode/source-map-support@0.8.1: + resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} + engines: {node: '>=12'} + dependencies: + '@jridgewell/trace-mapping': 0.3.9 + dev: false + + /@esbuild/android-arm64@0.18.15: + resolution: {integrity: sha512-NI/gnWcMl2kXt1HJKOn2H69SYn4YNheKo6NZt1hyfKWdMbaGadxjZIkcj4Gjk/WPxnbFXs9/3HjGHaknCqjrww==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: false + optional: true + + /@esbuild/android-arm@0.18.15: + resolution: {integrity: sha512-wlkQBWb79/jeEEoRmrxt/yhn5T1lU236OCNpnfRzaCJHZ/5gf82uYx1qmADTBWE0AR/v7FiozE1auk2riyQd3w==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + requiresBuild: true + dev: false + optional: true + + /@esbuild/android-x64@0.18.15: + resolution: {integrity: sha512-FM9NQamSaEm/IZIhegF76aiLnng1kEsZl2eve/emxDeReVfRuRNmvT28l6hoFD9TsCxpK+i4v8LPpEj74T7yjA==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + requiresBuild: true + dev: false + optional: true + + /@esbuild/darwin-arm64@0.18.15: + resolution: {integrity: sha512-XmrFwEOYauKte9QjS6hz60FpOCnw4zaPAb7XV7O4lx1r39XjJhTN7ZpXqJh4sN6q60zbP6QwAVVA8N/wUyBH/w==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@esbuild/darwin-x64@0.18.15: + resolution: {integrity: sha512-bMqBmpw1e//7Fh5GLetSZaeo9zSC4/CMtrVFdj+bqKPGJuKyfNJ5Nf2m3LknKZTS+Q4oyPiON+v3eaJ59sLB5A==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@esbuild/freebsd-arm64@0.18.15: + resolution: {integrity: sha512-LoTK5N3bOmNI9zVLCeTgnk5Rk0WdUTrr9dyDAQGVMrNTh9EAPuNwSTCgaKOKiDpverOa0htPcO9NwslSE5xuLA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: false + optional: true + + /@esbuild/freebsd-x64@0.18.15: + resolution: {integrity: sha512-62jX5n30VzgrjAjOk5orYeHFq6sqjvsIj1QesXvn5OZtdt5Gdj0vUNJy9NIpjfdNdqr76jjtzBJKf+h2uzYuTQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-arm64@0.18.15: + resolution: {integrity: sha512-BWncQeuWDgYv0jTNzJjaNgleduV4tMbQjmk/zpPh/lUdMcNEAxy+jvneDJ6RJkrqloG7tB9S9rCrtfk/kuplsQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-arm@0.18.15: + resolution: {integrity: sha512-dT4URUv6ir45ZkBqhwZwyFV6cH61k8MttIwhThp2BGiVtagYvCToF+Bggyx2VI57RG4Fbt21f9TmXaYx0DeUJg==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-ia32@0.18.15: + resolution: {integrity: sha512-JPXORvgHRHITqfms1dWT/GbEY89u848dC08o0yK3fNskhp0t2TuNUnsrrSgOdH28ceb1hJuwyr8R/1RnyPwocw==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-loong64@0.18.15: + resolution: {integrity: sha512-kArPI0DopjJCEplsVj/H+2Qgzz7vdFSacHNsgoAKpPS6W/Ndh8Oe24HRDQ5QCu4jHgN6XOtfFfLpRx3TXv/mEg==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-mips64el@0.18.15: + resolution: {integrity: sha512-b/tmngUfO02E00c1XnNTw/0DmloKjb6XQeqxaYuzGwHe0fHVgx5/D6CWi+XH1DvkszjBUkK9BX7n1ARTOst59w==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-ppc64@0.18.15: + resolution: {integrity: sha512-KXPY69MWw79QJkyvUYb2ex/OgnN/8N/Aw5UDPlgoRtoEfcBqfeLodPr42UojV3NdkoO4u10NXQdamWm1YEzSKw==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-riscv64@0.18.15: + resolution: {integrity: sha512-komK3NEAeeGRnvFEjX1SfVg6EmkfIi5aKzevdvJqMydYr9N+pRQK0PGJXk+bhoPZwOUgLO4l99FZmLGk/L1jWg==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-s390x@0.18.15: + resolution: {integrity: sha512-632T5Ts6gQ2WiMLWRRyeflPAm44u2E/s/TJvn+BP6M5mnHSk93cieaypj3VSMYO2ePTCRqAFXtuYi1yv8uZJNA==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-x64@0.18.15: + resolution: {integrity: sha512-MsHtX0NgvRHsoOtYkuxyk4Vkmvk3PLRWfA4okK7c+6dT0Fu4SUqXAr9y4Q3d8vUf1VWWb6YutpL4XNe400iQ1g==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/netbsd-x64@0.18.15: + resolution: {integrity: sha512-djST6s+jQiwxMIVQ5rlt24JFIAr4uwUnzceuFL7BQT4CbrRtqBPueS4GjXSiIpmwVri1Icj/9pFRJ7/aScvT+A==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: false + optional: true + + /@esbuild/openbsd-x64@0.18.15: + resolution: {integrity: sha512-naeRhUIvhsgeounjkF5mvrNAVMGAm6EJWiabskeE5yOeBbLp7T89tAEw0j5Jm/CZAwyLe3c67zyCWH6fsBLCpw==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: false + optional: true + + /@esbuild/sunos-x64@0.18.15: + resolution: {integrity: sha512-qkT2+WxyKbNIKV1AEhI8QiSIgTHMcRctzSaa/I3kVgMS5dl3fOeoqkb7pW76KwxHoriImhx7Mg3TwN/auMDsyQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: false + optional: true + + /@esbuild/win32-arm64@0.18.15: + resolution: {integrity: sha512-HC4/feP+pB2Vb+cMPUjAnFyERs+HJN7E6KaeBlFdBv799MhD+aPJlfi/yk36SED58J9TPwI8MAcVpJgej4ud0A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@esbuild/win32-ia32@0.18.15: + resolution: {integrity: sha512-ovjwoRXI+gf52EVF60u9sSDj7myPixPxqzD5CmkEUmvs+W9Xd0iqISVBQn8xcx4ciIaIVlWCuTbYDOXOnOL44Q==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@esbuild/win32-x64@0.18.15: + resolution: {integrity: sha512-imUxH9a3WJARyAvrG7srLyiK73XdX83NXQkjKvQ+7vPh3ZxoLrzvPkQKKw2DwZ+RV2ZB6vBfNHP8XScAmQC3aA==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@grpc/grpc-js@1.8.18: + resolution: {integrity: sha512-2uWPtxhsXmVgd8WzDhfamSjHpZDXfMjMDciY6VRTq4Sn7rFzazyf0LLDa0oav+61UHIoEZb4KKaAV6S7NuJFbQ==} + engines: {node: ^8.13.0 || >=10.10.0} + dependencies: + '@grpc/proto-loader': 0.7.8 + '@types/node': 20.4.2 + dev: false + + /@grpc/proto-loader@0.7.8: + resolution: {integrity: sha512-GU12e2c8dmdXb7XUlOgYWZ2o2i+z9/VeACkxTA/zzAe2IjclC5PnVL0lpgjhrqfpDYHzM8B1TF6pqWegMYAzlA==} + engines: {node: '>=6'} + hasBin: true + dependencies: + '@types/long': 4.0.2 + lodash.camelcase: 4.3.0 + long: 4.0.0 + protobufjs: 7.2.4 + yargs: 17.7.2 + dev: false + + /@jridgewell/resolve-uri@3.1.1: + resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} + engines: {node: '>=6.0.0'} + dev: false + + /@jridgewell/sourcemap-codec@1.4.15: + resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + dev: false + + /@jridgewell/trace-mapping@0.3.9: + resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} + dependencies: + '@jridgewell/resolve-uri': 3.1.1 + '@jridgewell/sourcemap-codec': 1.4.15 + dev: false + + /@prisma/client@5.1.1(prisma@5.1.1): + resolution: {integrity: sha512-fxcCeK5pMQGcgCqCrWsi+I2rpIbk0rAhdrN+ke7f34tIrgPwA68ensrpin+9+fZvuV2OtzHmuipwduSY6HswdA==} + engines: {node: '>=16.13'} + requiresBuild: true + peerDependencies: + prisma: '*' + peerDependenciesMeta: + prisma: + optional: true + dependencies: + '@prisma/engines-version': 5.1.1-1.6a3747c37ff169c90047725a05a6ef02e32ac97e + prisma: 5.1.1 + dev: false + + /@prisma/engines-version@5.1.1-1.6a3747c37ff169c90047725a05a6ef02e32ac97e: + resolution: {integrity: sha512-owZqbY/wucbr65bXJ/ljrHPgQU5xXTSkmcE/JcbqE1kusuAXV/TLN3/exmz21SZ5rJ7WDkyk70J2G/n68iogbQ==} + dev: false + + /@prisma/engines@5.1.1: + resolution: {integrity: sha512-NV/4nVNWFZSJCCIA3HIFJbbDKO/NARc9ej0tX5S9k2EVbkrFJC4Xt9b0u4rNZWL4V+F5LAjvta8vzEUw0rw+HA==} + requiresBuild: true + + /@protobufjs/aspromise@1.1.2: + resolution: {integrity: sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==} + dev: false + + /@protobufjs/base64@1.1.2: + resolution: {integrity: sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==} + dev: false + + /@protobufjs/codegen@2.0.4: + resolution: {integrity: sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==} + dev: false + + /@protobufjs/eventemitter@1.1.0: + resolution: {integrity: sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==} + dev: false + + /@protobufjs/fetch@1.1.0: + resolution: {integrity: sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==} + dependencies: + '@protobufjs/aspromise': 1.1.2 + '@protobufjs/inquire': 1.1.0 + dev: false + + /@protobufjs/float@1.0.2: + resolution: {integrity: sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==} + dev: false + + /@protobufjs/inquire@1.1.0: + resolution: {integrity: sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==} + dev: false + + /@protobufjs/path@1.1.2: + resolution: {integrity: sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==} + dev: false + + /@protobufjs/pool@1.1.0: + resolution: {integrity: sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==} + dev: false + + /@protobufjs/utf8@1.1.0: + resolution: {integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==} + dev: false + + /@tsconfig/node10@1.0.9: + resolution: {integrity: sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==} + dev: false + + /@tsconfig/node12@1.0.11: + resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} + dev: false + + /@tsconfig/node14@1.0.3: + resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} + dev: false + + /@tsconfig/node16@1.0.4: + resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} + dev: false + + /@types/amqplib@0.10.1: + resolution: {integrity: sha512-j6ANKT79ncUDnAs/+9r9eDujxbeJoTjoVu33gHHcaPfmLQaMhvfbH2GqSe8KUM444epAp1Vl3peVOQfZk3UIqA==} + dependencies: + '@types/node': 20.4.2 + dev: true + + /@types/long@4.0.2: + resolution: {integrity: sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==} + dev: false + + /@types/node@20.4.2: + resolution: {integrity: sha512-Dd0BYtWgnWJKwO1jkmTrzofjK2QXXcai0dmtzvIBhcA+RsG5h8R3xlyta0kGOZRNfL9GuRtb1knmPEhQrePCEw==} + + /abbrev@1.1.1: + resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} + dev: false + + /acorn-walk@8.2.0: + resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} + engines: {node: '>=0.4.0'} + dev: false + + /acorn@8.10.0: + resolution: {integrity: sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==} + engines: {node: '>=0.4.0'} + hasBin: true + dev: false + + /amqplib@0.10.3: + resolution: {integrity: sha512-UHmuSa7n8vVW/a5HGh2nFPqAEr8+cD4dEZ6u9GjP91nHfr1a54RyAKyra7Sb5NH7NBKOUlyQSMXIp0qAixKexw==} + engines: {node: '>=10'} + dependencies: + '@acuminous/bitsyntax': 0.1.2 + buffer-more-ints: 1.0.0 + readable-stream: 1.1.14 + url-parse: 1.5.10 + transitivePeerDependencies: + - supports-color + dev: false + + /ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + dev: false + + /ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + dependencies: + color-convert: 2.0.1 + dev: false + + /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: false + + /arg@4.1.3: + resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} + dev: false + + /balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + dev: false + + /binary-extensions@2.2.0: + resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} + engines: {node: '>=8'} + 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 + + /buffer-more-ints@1.0.0: + resolution: {integrity: sha512-EMetuGFz5SLsT0QTnXzINh4Ksr+oo4i+UGTXEshiGCQWnsgSs7ZhJ8fzlwQ+OzEMs0MpDAMr1hxnblp5a4vcHg==} + dev: false + + /chokidar@3.5.3: + resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} + engines: {node: '>= 8.10.0'} + dependencies: + anymatch: 3.1.3 + braces: 3.0.2 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.2 + 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 + 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 + + /core-util-is@1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + dev: false + + /create-require@1.1.1: + resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} + dev: false + + /debug@3.2.7(supports-color@5.5.0): + resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.3 + supports-color: 5.5.0 + 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 + dev: false + + /diff@4.0.2: + resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} + engines: {node: '>=0.3.1'} + dev: false + + /dotenv@16.3.1: + resolution: {integrity: sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==} + engines: {node: '>=12'} + dev: false + + /emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + dev: false + + /esbuild@0.18.15: + resolution: {integrity: sha512-3WOOLhrvuTGPRzQPU6waSDWrDTnQriia72McWcn6UCi43GhCHrXH4S59hKMeez+IITmdUuUyvbU9JIp+t3xlPQ==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/android-arm': 0.18.15 + '@esbuild/android-arm64': 0.18.15 + '@esbuild/android-x64': 0.18.15 + '@esbuild/darwin-arm64': 0.18.15 + '@esbuild/darwin-x64': 0.18.15 + '@esbuild/freebsd-arm64': 0.18.15 + '@esbuild/freebsd-x64': 0.18.15 + '@esbuild/linux-arm': 0.18.15 + '@esbuild/linux-arm64': 0.18.15 + '@esbuild/linux-ia32': 0.18.15 + '@esbuild/linux-loong64': 0.18.15 + '@esbuild/linux-mips64el': 0.18.15 + '@esbuild/linux-ppc64': 0.18.15 + '@esbuild/linux-riscv64': 0.18.15 + '@esbuild/linux-s390x': 0.18.15 + '@esbuild/linux-x64': 0.18.15 + '@esbuild/netbsd-x64': 0.18.15 + '@esbuild/openbsd-x64': 0.18.15 + '@esbuild/sunos-x64': 0.18.15 + '@esbuild/win32-arm64': 0.18.15 + '@esbuild/win32-ia32': 0.18.15 + '@esbuild/win32-x64': 0.18.15 + dev: false + + /escalade@3.1.1: + resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} + engines: {node: '>=6'} + 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 + + /fsevents@2.3.2: + resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + dev: false + + /glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + dependencies: + is-glob: 4.0.3 + dev: false + + /has-flag@3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + dev: false + + /ignore-by-default@1.0.1: + resolution: {integrity: sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==} + dev: false + + /inherits@2.0.3: + resolution: {integrity: sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==} + dev: false + + /is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + dependencies: + binary-extensions: 2.2.0 + dev: false + + /is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + dev: false + + /is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + 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-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + dev: false + + /isarray@0.0.1: + resolution: {integrity: sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==} + dev: false + + /json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + dev: false + + /lodash.camelcase@4.3.0: + resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} + dev: false + + /long@4.0.0: + resolution: {integrity: sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==} + dev: false + + /long@5.2.3: + resolution: {integrity: sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==} + dev: false + + /lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + dependencies: + yallist: 4.0.0 + dev: false + + /make-error@1.3.6: + resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + dev: false + + /minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + dependencies: + brace-expansion: 1.1.11 + dev: false + + /minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + dev: false + + /ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + dev: false + + /ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + dev: false + + /nodemon@3.0.1: + resolution: {integrity: sha512-g9AZ7HmkhQkqXkRc20w+ZfQ73cHLbE8hnPbtaFbFtCumZsjyMhKk9LajQ07U5Ux28lvFjZ5X7HvWR1xzU8jHVw==} + engines: {node: '>=10'} + hasBin: true + dependencies: + chokidar: 3.5.3 + debug: 3.2.7(supports-color@5.5.0) + ignore-by-default: 1.0.1 + minimatch: 3.1.2 + pstree.remy: 1.1.8 + semver: 7.5.4 + simple-update-notifier: 2.0.0 + supports-color: 5.5.0 + touch: 3.1.0 + undefsafe: 2.0.5 + dev: false + + /nopt@1.0.10: + resolution: {integrity: sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==} + hasBin: true + dependencies: + abbrev: 1.1.1 + dev: false + + /normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + dev: false + + /path@0.12.7: + resolution: {integrity: sha512-aXXC6s+1w7otVF9UletFkFcDsJeO7lSZBPUQhtb5O0xJe8LtYhj/GxldoL09bBj9+ZmE2hNoHqQSFMN5fikh4Q==} + dependencies: + process: 0.11.10 + util: 0.10.4 + dev: false + + /picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + dev: false + + /prisma@5.1.1: + resolution: {integrity: sha512-WJFG/U7sMmcc6TjJTTifTfpI6Wjoh55xl4AzopVwAdyK68L9/ogNo8QQ2cxuUjJf/Wa82z/uhyh3wMzvRIBphg==} + engines: {node: '>=16.13'} + hasBin: true + requiresBuild: true + dependencies: + '@prisma/engines': 5.1.1 + + /process@0.11.10: + resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} + engines: {node: '>= 0.6.0'} + dev: false + + /protobufjs@7.2.4: + resolution: {integrity: sha512-AT+RJgD2sH8phPmCf7OUZR8xGdcJRga4+1cOaXJ64hvcSkVhNcRHOwIxUatPH15+nj59WAGTDv3LSGZPEQbJaQ==} + engines: {node: '>=12.0.0'} + requiresBuild: true + dependencies: + '@protobufjs/aspromise': 1.1.2 + '@protobufjs/base64': 1.1.2 + '@protobufjs/codegen': 2.0.4 + '@protobufjs/eventemitter': 1.1.0 + '@protobufjs/fetch': 1.1.0 + '@protobufjs/float': 1.0.2 + '@protobufjs/inquire': 1.1.0 + '@protobufjs/path': 1.1.2 + '@protobufjs/pool': 1.1.0 + '@protobufjs/utf8': 1.1.0 + '@types/node': 20.4.2 + long: 5.2.3 + dev: false + + /pstree.remy@1.1.8: + resolution: {integrity: sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==} + dev: false + + /querystringify@2.2.0: + resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} + dev: false + + /readable-stream@1.1.14: + resolution: {integrity: sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==} + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.3 + isarray: 0.0.1 + string_decoder: 0.10.31 + dev: false + + /readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + dependencies: + picomatch: 2.3.1 + dev: false + + /require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + dev: false + + /requires-port@1.0.0: + resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} + dev: false + + /safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + dev: false + + /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 + dev: false + + /simple-update-notifier@2.0.0: + resolution: {integrity: sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==} + engines: {node: '>=10'} + dependencies: + semver: 7.5.4 + dev: false + + /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 + dev: false + + /string_decoder@0.10.31: + resolution: {integrity: sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==} + dev: false + + /strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + dependencies: + ansi-regex: 5.0.1 + dev: false + + /strip-bom@3.0.0: + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} + dev: false + + /supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + dependencies: + has-flag: 3.0.0 + 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 + + /touch@3.1.0: + resolution: {integrity: sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==} + hasBin: true + dependencies: + nopt: 1.0.10 + dev: false + + /ts-node@10.9.1(@types/node@20.4.2)(typescript@5.1.6): + 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': 20.4.2 + 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.1.6 + v8-compile-cache-lib: 3.0.1 + yn: 3.1.1 + dev: false + + /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: false + + /typescript@5.1.6: + resolution: {integrity: sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==} + engines: {node: '>=14.17'} + hasBin: true + + /undefsafe@2.0.5: + resolution: {integrity: sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==} + dev: false + + /url-parse@1.5.10: + resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} + dependencies: + querystringify: 2.2.0 + requires-port: 1.0.0 + dev: false + + /util@0.10.4: + resolution: {integrity: sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==} + dependencies: + inherits: 2.0.3 + dev: false + + /v8-compile-cache-lib@3.0.1: + resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} + dev: false + + /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 + dev: false + + /y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + dev: false + + /yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + dev: false + + /yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + 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 + dev: false + + /yn@3.1.1: + resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} + engines: {node: '>=6'} + dev: false diff --git a/services/restaurant/prisma/migrations/20230819142125_init/migration.sql b/services/restaurant/prisma/migrations/20230819142125_init/migration.sql new file mode 100644 index 00000000..bc0cfc5a --- /dev/null +++ b/services/restaurant/prisma/migrations/20230819142125_init/migration.sql @@ -0,0 +1,14 @@ +-- CreateTable +CREATE TABLE "Restaurant" ( + "id" SERIAL NOT NULL, + "name" TEXT NOT NULL, + "description" TEXT, + "location" DOUBLE PRECISION[], + "address" TEXT, + "openingHours" TEXT[], + "phone" TEXT, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "Restaurant_pkey" PRIMARY KEY ("id") +); diff --git a/services/restaurant/prisma/migrations/20230819145035_fix_restaurant_id_type/migration.sql b/services/restaurant/prisma/migrations/20230819145035_fix_restaurant_id_type/migration.sql new file mode 100644 index 00000000..939b88b8 --- /dev/null +++ b/services/restaurant/prisma/migrations/20230819145035_fix_restaurant_id_type/migration.sql @@ -0,0 +1,12 @@ +/* + Warnings: + + - The primary key for the `Restaurant` table will be changed. If it partially fails, the table could be left without primary key constraint. + +*/ +-- AlterTable +ALTER TABLE "Restaurant" DROP CONSTRAINT "Restaurant_pkey", +ALTER COLUMN "id" DROP DEFAULT, +ALTER COLUMN "id" SET DATA TYPE TEXT, +ADD CONSTRAINT "Restaurant_pkey" PRIMARY KEY ("id"); +DROP SEQUENCE "Restaurant_id_seq"; diff --git a/services/restaurant/prisma/migrations/migration_lock.toml b/services/restaurant/prisma/migrations/migration_lock.toml new file mode 100644 index 00000000..fbffa92c --- /dev/null +++ b/services/restaurant/prisma/migrations/migration_lock.toml @@ -0,0 +1,3 @@ +# Please do not edit this file manually +# It should be added in your version-control system (i.e. Git) +provider = "postgresql" \ No newline at end of file diff --git a/services/restaurant/prisma/schema.prisma b/services/restaurant/prisma/schema.prisma new file mode 100644 index 00000000..538832e8 --- /dev/null +++ b/services/restaurant/prisma/schema.prisma @@ -0,0 +1,23 @@ +generator client { + provider = "prisma-client-js" +} + +datasource db { + provider = "postgresql" + url = env("DATABASE_URL") +} + +model Restaurant { + id String @id @default(cuid()) + name String + description String? + + location Float[] + address String? + + openingHours String[] + + phone String? + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt +} diff --git a/services/restaurant/proto b/services/restaurant/proto new file mode 120000 index 00000000..5c8d3525 --- /dev/null +++ b/services/restaurant/proto @@ -0,0 +1 @@ +../proto \ No newline at end of file diff --git a/services/restaurant/src/handler/create.ts b/services/restaurant/src/handler/create.ts new file mode 100644 index 00000000..c1f52d85 --- /dev/null +++ b/services/restaurant/src/handler/create.ts @@ -0,0 +1,33 @@ +import { + RestaurantCreateInput, + Restaurant, +} from "@restaurant/types/restaurant"; +import { log } from "@restaurant/lib/log"; +import { Data } from "@restaurant/types"; +import prisma from "@restaurant/lib/prisma"; + +export const CreateRestaurant = async ( + { request }: Data, + callback: (err: any, response: Restaurant | null) => void +) => { + try { + const { location, name, openingHours, address, description, phone } = + request; + + const restaurant = (await prisma.restaurant.create({ + data: { + location, + name, + openingHours, + address, + description, + phone, + }, + })) as unknown as Restaurant; + + callback(null, restaurant); + } catch (error) { + log.error(error); + callback(error, null); + } +}; diff --git a/services/restaurant/src/handler/delete.ts b/services/restaurant/src/handler/delete.ts new file mode 100644 index 00000000..69d356ac --- /dev/null +++ b/services/restaurant/src/handler/delete.ts @@ -0,0 +1,20 @@ +import { RestaurantId } from "@restaurant/types/restaurant"; +import { log } from "@restaurant/lib/log"; +import { Data } from "@restaurant/types"; +import prisma from "@restaurant/lib/prisma"; + +export const DeleteRestaurant = async ( + { request }: Data, + callback: (err: any, response: null) => void +) => { + try { + const { id } = request; + + await prisma.restaurant.delete({ where: { id } }); + + callback(null, null); + } catch (error) { + log.error(error); + callback(error, null); + } +}; diff --git a/services/restaurant/src/handler/get.ts b/services/restaurant/src/handler/get.ts new file mode 100644 index 00000000..97b4f773 --- /dev/null +++ b/services/restaurant/src/handler/get.ts @@ -0,0 +1,22 @@ +import { Restaurant, RestaurantId } from "@restaurant/types/restaurant"; +import { log } from "@restaurant/lib/log"; +import { Data } from "@restaurant/types"; +import prisma from "@restaurant/lib/prisma"; + +export const GetRestaurant = async ( + { request }: Data, + callback: (err: any, response: Restaurant | null) => void +) => { + try { + const { id } = request; + + const restaurant = (await prisma.restaurant.findFirstOrThrow({ + where: { id }, + })) as unknown as Restaurant; + + callback(null, restaurant); + } catch (error) { + log.error(error); + callback(error, null); + } +}; diff --git a/services/restaurant/src/handler/index.ts b/services/restaurant/src/handler/index.ts new file mode 100644 index 00000000..691eab75 --- /dev/null +++ b/services/restaurant/src/handler/index.ts @@ -0,0 +1,15 @@ +import { CreateRestaurant } from "@restaurant/handler/create"; +import { GetRestaurant} from "@restaurant/handler/get"; +import { UpdateRestaurant } from "@restaurant/handler/update"; +import { DeleteRestaurant } from "@restaurant/handler/delete"; +import { GetRestaurants } from "@restaurant/handler/list-all"; +import { GetRestaurantsByLocation } from "@restaurant/handler/list-by-location"; + +export default { + CreateRestaurant, + GetRestaurant, + UpdateRestaurant, + DeleteRestaurant, + GetRestaurants, + GetRestaurantsByLocation, +}; diff --git a/services/restaurant/src/handler/list-all.ts b/services/restaurant/src/handler/list-all.ts new file mode 100644 index 00000000..00c4ee8f --- /dev/null +++ b/services/restaurant/src/handler/list-all.ts @@ -0,0 +1,19 @@ +import { log } from "@restaurant/lib/log"; +import { Data } from "@restaurant/types"; +import prisma from "@restaurant/lib/prisma"; +import { Restaurant, RestaurantList } from "@restaurant/types/restaurant"; + +export const GetRestaurants = async ( + {}: Data, + callback: (err: any, response: RestaurantList | null) => void +) => { + try { + const restaurants = + (await prisma.restaurant.findMany()) as unknown as Restaurant[]; + + callback(null, { restaurants }); + } catch (error) { + log.error(error); + callback(error, null); + } +}; diff --git a/services/restaurant/src/handler/list-by-location.ts b/services/restaurant/src/handler/list-by-location.ts new file mode 100644 index 00000000..d93c9908 --- /dev/null +++ b/services/restaurant/src/handler/list-by-location.ts @@ -0,0 +1,30 @@ +import { log } from "@restaurant/lib/log"; +import { Data } from "@restaurant/types"; +import prisma from "@restaurant/lib/prisma"; +import { + ByLocationInput, + Restaurant, + RestaurantList, +} from "@restaurant/types/restaurant"; + +export const GetRestaurantsByLocation = async ( + { request }: Data, + callback: (err: any, response: RestaurantList | null) => void +) => { + try { + const { location } = request; + + const restaurants = (await prisma.restaurant.findMany({ + where: { + location: { + equals: location, + }, + }, + })) as unknown as Restaurant[]; + + callback(null, { restaurants }); + } catch (error) { + log.error(error); + callback(error, null); + } +}; diff --git a/services/restaurant/src/handler/update.ts b/services/restaurant/src/handler/update.ts new file mode 100644 index 00000000..8327c15b --- /dev/null +++ b/services/restaurant/src/handler/update.ts @@ -0,0 +1,31 @@ +import { log } from "@restaurant/lib/log"; +import { Data } from "@restaurant/types"; +import prisma from "@restaurant/lib/prisma"; +import { Restaurant } from "@restaurant/types/restaurant"; + +export const UpdateRestaurant = async ( + { request }: Data, + callback: (err: any, response: Restaurant | null) => void +) => { + try { + const { id, location, name, openingHours, address, description, phone } = + request; + + const restaurant = (await prisma.restaurant.update({ + where: { id }, + data: { + location, + name, + openingHours, + address, + description, + phone, + }, + })) as unknown as Restaurant; + + callback(null, restaurant); + } catch (error) { + log.error(error); + callback(error, null); + } +}; diff --git a/services/restaurant/src/lib/amqp.ts b/services/restaurant/src/lib/amqp.ts new file mode 100644 index 00000000..98872689 --- /dev/null +++ b/services/restaurant/src/lib/amqp.ts @@ -0,0 +1,32 @@ +import amqp from "amqplib"; +import { msg } from "@restaurant/middleware/log"; +import { log } from "@restaurant/lib/log"; + +const DEFAULT_QUEUE = "log"; + +async function connectQueue(queue = DEFAULT_QUEUE) { + try { + const connection = await amqp.connect(process.env.AMQP_URL || ""); + const channel = await connection.createChannel(); + await channel.assertExchange(queue, "fanout", { durable: true }); + return channel; + } catch (error) { + return error as Error; + } +} + +const toLog = (message: any) => { + const { request, path } = message; + return { event_message: path, metadata: { request } }; +}; + +export const publish = async (message: any, queue = DEFAULT_QUEUE) => { + const channel = await connectQueue(queue); + if (channel instanceof Error) + return console.log("Error to connect to queue: ", channel); + channel.sendToQueue(queue, Buffer.from(JSON.stringify(toLog(message)))); + log.debug( + msg("AMQP", `${queue} (queue)`, new Date(), new Date()), + JSON.stringify(message) + ); +}; diff --git a/services/restaurant/src/lib/log.ts b/services/restaurant/src/lib/log.ts new file mode 100644 index 00000000..2404af54 --- /dev/null +++ b/services/restaurant/src/lib/log.ts @@ -0,0 +1,74 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ +/* eslint-disable no-console */ + +function getStackTrace() { + let stack; + + try { + throw new Error(""); + } catch (error) { + stack = (error as Error).stack || ""; + } + + stack = stack.split("\n").map((line) => line.trim()); + return stack.splice(stack[0] === "Error" ? 2 : 1); +} + +const getInitiator = () => { + // _getInitiatorLine, _ObjectInfoLine, caller + const [, , caller] = getStackTrace(); + const file = caller.split("/").at(-1) || ""; + return file.replace(")", ""); +}; + +const warn = (...args: any[]) => { + console.group( + `\x1b[33m${new Date().toISOString()} - WARN - ${getInitiator()}\x1b[0m` + ); + console.warn(...args); + console.groupEnd(); +}; +const error = (...args: any[]) => { + console.group( + `\x1b[31m${new Date().toISOString()} - ERROR - ${getInitiator()}\x1b[0m` + ); + console.error(...args); + console.groupEnd(); +}; +const info = (...args: any[]) => { + console.group( + `\x1b[34m${new Date().toISOString()} - INFO - ${getInitiator()}\x1b[0m` + ); + console.log(...args); + console.groupEnd(); +}; +const debug = (...args: any[]) => { + console.log(...args); +}; + +/** + * @description a simple interface logger for logging to the console and into a log drain in the future + * @example + * log.warn('this is a warning'); + * log.error('this is an error'); + * log.info('this is an info'); + * @exports log + */ +export const log = { + warn, + error, + info, + debug, +}; + +export const utils = { + bold: (text: string) => `\x1b[1m${text}\x1b[0m`, + red: (text: string) => `\x1b[31m${text}\x1b[0m`, + green: (text: string) => `\x1b[32m${text}\x1b[0m`, + yellow: (text: string) => `\x1b[33m${text}\x1b[0m`, + blue: (text: string) => `\x1b[34m${text}\x1b[0m`, + magenta: (text: string) => `\x1b[35m${text}\x1b[0m`, + cyan: (text: string) => `\x1b[36m${text}\x1b[0m`, + white: (text: string) => `\x1b[37m${text}\x1b[0m`, + gray: (text: string) => `\x1b[90m${text}\x1b[0m`, +}; diff --git a/services/restaurant/src/lib/prisma.ts b/services/restaurant/src/lib/prisma.ts new file mode 100644 index 00000000..4d495ef0 --- /dev/null +++ b/services/restaurant/src/lib/prisma.ts @@ -0,0 +1,29 @@ +import { Prisma, PrismaClient } from "@prisma/client"; + +let prisma: PrismaClient; +type GlobalWithPrisma = typeof globalThis & { + prisma: PrismaClient; +}; + +const OPTIONS: Prisma.PrismaClientOptions = { + log: + process.env.NEXT_PUBLIC_APP_ENV !== "production" + ? ["info", "warn"] + : undefined, +}; + +if (process.env.NODE_ENV === "production") { + prisma = new PrismaClient(OPTIONS); +} else { + // Ensure the prisma instance is re-used during hot-reloading + // Otherwise, a new client will be created on every reload + if (!("prisma" in global)) { + (global as GlobalWithPrisma).prisma = new PrismaClient(OPTIONS); + } + + prisma = (global as GlobalWithPrisma).prisma; +} + +export default prisma; + +export { prisma }; diff --git a/services/restaurant/src/lib/proxy.ts b/services/restaurant/src/lib/proxy.ts new file mode 100644 index 00000000..b05d24a6 --- /dev/null +++ b/services/restaurant/src/lib/proxy.ts @@ -0,0 +1,132 @@ +import { Server, status } from "@grpc/grpc-js"; + +const getType = (method: { + requestStream: boolean; + responseStream: boolean; +}) => { + if (method.requestStream === false && method.responseStream === false) { + return "unary"; + } + return "unknown"; +}; + + +const lookupServiceMetadata = (service: { [x: string]: any }) => { + const serviceKeys = Object.keys(service); + const intersectingMethods = serviceKeys.reduce((acc, k) => { + const method = service[k]; + if (!method) { + throw new Error(`cannot find method ${k} on service`); + } + const components = method.path.split("/"); + acc[k] = { + name: components[1], + method: components[2], + type: getType(method), + path: method.path, + responseType: method.responseType, + requestType: method.requestType, + }; + return acc; + }, {} as any); + + return (key: string) => intersectingMethods[key]; +}; + +export const handler = { + get( + target: { + [x: string]: any; + intercept: () => any; + addService: (arg0: any, arg1: {}) => any; + }, + propKey: string + ) { + if (propKey !== "addService") { + return target[propKey]; + } + return (service: any, implementation: { [x: string]: any }) => { + const newImplementation = {} as any; + const lookup = lookupServiceMetadata(service); + for (const k in implementation) { + const name = k; + const fn = implementation[k]; + newImplementation[name] = (call: any, callback: any) => { + const ctx = { + call, + name, + service: lookup(name), + status: { + code: status.UNKNOWN, + details: "", + }, + }; + const newCallback = (callback: (arg0: any) => void) => { + return (...args: any[]) => { + ctx.status = { + code: status.OK, + details: "", + }; + const err = args[0]; + if (err) { + ctx.status = { + code: status.UNKNOWN, + details: err, + }; + } + // @ts-ignore + callback(...args); + }; + }; + + const interceptors = target.intercept(); + const first = interceptors.next(); + if (!first.value) { + // if we don't have any interceptors + return new Promise((resolve) => { + return resolve(fn(call, newCallback(callback))); + }); + } + first.value(ctx, function next() { + return new Promise((resolve) => { + const i = interceptors.next(); + if (i.done) { + return resolve(fn(call, newCallback(callback))); + } + return resolve(i.value(ctx, next)); + }); + }); + }; + } + return target.addService(service, newImplementation); + }; + }, +}; + +export const createServerProxy = ( + server: Server +): Server & { + intercept: Generator; + interceptors: any[]; + use: (fn: any) => void; +} => { + // @ts-ignore + server.interceptors = []; + // @ts-ignore + server.use = (fn: any) => { + // @ts-ignore + server.interceptors.push(fn); + }; + // @ts-ignore + server.intercept = function* intercept() { + let i = 0; + // @ts-ignore + while (i < server.interceptors.length) { + // @ts-ignore + yield server.interceptors[i]; + i++; + } + }; + // @ts-ignore + return new Proxy(server, handler); +}; \ No newline at end of file diff --git a/services/restaurant/src/middleware/log.ts b/services/restaurant/src/middleware/log.ts new file mode 100644 index 00000000..7235e574 --- /dev/null +++ b/services/restaurant/src/middleware/log.ts @@ -0,0 +1,42 @@ +import { publish } from "@restaurant/lib/amqp"; +import { utils } from "@restaurant/lib/log"; +import { log } from "@restaurant/lib/log"; + +type Context = { + call: { + request: Map; + }; + service: { + path: string; + }; +}; + +const parseContext = (ctx: Context) => { + const { + call: { request }, + service: { path }, + } = ctx; + return { request, path }; +}; + +export const msg = ( + type: "GRPC" | "AMQP", + path: string | undefined, + requestAt: Date, + responseAt: Date +) => + `${utils.magenta(requestAt.toISOString())} | ${utils[ + type === "GRPC" ? "cyan" : "red" + ](type)}${path ? ` | ${utils.yellow(path)}` : ""} | ${utils.green( + responseAt.getTime() - requestAt.getTime() + "ms" + )} |`; + +export const logGRPC = async (ctx: Context, next: () => Promise) => { + const requestAt = new Date(); + await next(); + const responseAt = new Date(); + let { request, path } = parseContext(ctx); + path = path?.split(".").at(-1) || ""; + publish({ request, path }, "log"); + log.debug(msg("GRPC", path, requestAt, responseAt), JSON.stringify(request)); +}; diff --git a/services/restaurant/src/resources/grpc-credentials.ts b/services/restaurant/src/resources/grpc-credentials.ts new file mode 100644 index 00000000..75a2b5d5 --- /dev/null +++ b/services/restaurant/src/resources/grpc-credentials.ts @@ -0,0 +1,5 @@ +import { credentials, ServerCredentials } from "@grpc/grpc-js"; + +export const insecure = credentials.createInsecure(); + +export const serverInsecure = ServerCredentials.createInsecure(); diff --git a/services/restaurant/src/resources/protoloader-options.ts b/services/restaurant/src/resources/protoloader-options.ts new file mode 100644 index 00000000..5022d96d --- /dev/null +++ b/services/restaurant/src/resources/protoloader-options.ts @@ -0,0 +1,7 @@ +export const options = { + keepCase: true, + longs: String, + enums: String, + defaults: true, + oneofs: true, +}; diff --git a/services/restaurant/src/server.ts b/services/restaurant/src/server.ts new file mode 100644 index 00000000..76257c6d --- /dev/null +++ b/services/restaurant/src/server.ts @@ -0,0 +1,39 @@ +import "dotenv/config"; +import { resolve as resolvePath } from "path"; + +import { loadSync } from "@grpc/proto-loader"; +import { loadPackageDefinition, Server } from "@grpc/grpc-js"; + +import { log, utils } from "@restaurant/lib/log"; +import { options } from "@restaurant/resources/protoloader-options"; +import { serverInsecure } from "@restaurant/resources/grpc-credentials"; + +import promotionHandler from "@restaurant/handler"; +import { createServerProxy } from "@restaurant/lib/proxy"; +import { logGRPC } from "@restaurant/middleware/log"; + +const PORT = process.env.PORT || 50005; +const ADDRESS = `0.0.0.0:${PORT}`; +const PROTO_PATH = resolvePath(__dirname + "/../../proto/restaurant.proto"); + +const packageDefinition = loadSync(PROTO_PATH, options); +const grpc = loadPackageDefinition(packageDefinition) as any; +const { + RestaurantService: { service: rs }, +} = grpc.com.goodfood.restaurant; + +const server = createServerProxy(new Server()); +server.addService(rs, promotionHandler); +server.use(logGRPC); + +server.bindAsync(ADDRESS, serverInsecure, () => { + server.start(); + const message = `---- ${utils.green("good")}${utils.yellow( + "food" + )} Restaurant Service ----\nstarted on: ${utils.bold(ADDRESS)} ${utils.green( + "✓" + )}\n`; + log.debug(message); +}); + +export default server; diff --git a/services/restaurant/src/types/index.d.ts b/services/restaurant/src/types/index.d.ts new file mode 100644 index 00000000..edf2bebf --- /dev/null +++ b/services/restaurant/src/types/index.d.ts @@ -0,0 +1,3 @@ +export type Data = { + request: T; +}; diff --git a/services/restaurant/src/types/restaurant.d.ts b/services/restaurant/src/types/restaurant.d.ts new file mode 100644 index 00000000..8c073d1a --- /dev/null +++ b/services/restaurant/src/types/restaurant.d.ts @@ -0,0 +1,32 @@ +export type Restaurant = { + id: string; + + name: string; + description?: string; + + location: [number, number]; + address?: string; + + openingHours: string[]; + phone?: string; + + createdAt: Date | string; + updatedAt: Date | string; +}; + +export type RestaurantCreateInput = Omit< + Restaurant, + "id" | "createdAt" | "updatedAt" +>; + +export type RestaurantId = { + id: Restaurant["id"]; +}; + +export type ByLocationInput = { + location: Restaurant["location"]; +}; + +export type RestaurantList = { + restaurants: Restaurant[]; +}; diff --git a/services/restaurant/terraform/data.tf b/services/restaurant/terraform/data.tf new file mode 100644 index 00000000..a04c4446 --- /dev/null +++ b/services/restaurant/terraform/data.tf @@ -0,0 +1,13 @@ +data "azurerm_resource_group" "rg-goodfood" { + name = "rg-${var.project_name}${var.environnment_suffix}" +} + +data "azurerm_key_vault_secret" "restaurant-db-login" { + name = "restaurant-db-login" + key_vault_id = azurerm_key_vault.kv-goodfood-restaurant.id +} +data "azurerm_key_vault_secret" "restaurant-db-password" { + name = "restaurant-db-password" + key_vault_id = azurerm_key_vault.kv-goodfood-restaurant.id +} +data "azurerm_client_config" "current" {} diff --git a/services/restaurant/terraform/env/dev-backend.tfvars.example b/services/restaurant/terraform/env/dev-backend.tfvars.example new file mode 100644 index 00000000..9c6c8826 --- /dev/null +++ b/services/restaurant/terraform/env/dev-backend.tfvars.example @@ -0,0 +1,4 @@ +resource_group_name = "rg-goodfood-dev" +storage_account_name = "sa-goodfood-states" +container_name = "tfstate" +key = "restaurant-dev.tfstate" diff --git a/services/restaurant/terraform/env/dev.tfvars.example b/services/restaurant/terraform/env/dev.tfvars.example new file mode 100644 index 00000000..4ac1f44d --- /dev/null +++ b/services/restaurant/terraform/env/dev.tfvars.example @@ -0,0 +1 @@ +environnment_suffix = "-dev" diff --git a/services/restaurant/terraform/main.tf b/services/restaurant/terraform/main.tf new file mode 100644 index 00000000..d7c5d5e7 --- /dev/null +++ b/services/restaurant/terraform/main.tf @@ -0,0 +1,74 @@ +terraform { + required_providers { + azurerm = { + source = "hashicorp/azurerm" + version = "3.48.0" + } + } + backend "azurerm" {} +} + +provider "azurerm" { + features { + key_vault { + purge_soft_deleted_secrets_on_destroy = true + recover_soft_deleted_secrets = true + } + } +} + +resource "azurerm_key_vault" "kv-goodfood-restaurant" { + name = "kv-goodfood-restaurant" + location = data.azurerm_resource_group.rg-goodfood.location + resource_group_name = data.azurerm_resource_group.rg-goodfood.name + tenant_id = data.azurerm_client_config.current.tenant_id + sku_name = "standard" + soft_delete_retention_days = 7 + + access_policy { + tenant_id = data.azurerm_client_config.current.tenant_id + object_id = data.azurerm_client_config.current.object_id + + key_permissions = [ + "Create", + "Get", + ] + + secret_permissions = [ + "Set", + "Get", + "Delete", + "Purge", + "Recover" + ] + } +} + +resource "azurerm_postgresql_server" "pg-goodfood-restaurant" { + name = "pg-goodfood-restaurant${var.environnment_suffix}" + location = data.azurerm_resource_group.rg-goodfood.location + resource_group_name = data.azurerm_resource_group.rg-goodfood.name + + sku_name = "B_Gen5_2" + + storage_mb = 5120 + backup_retention_days = 7 + geo_redundant_backup_enabled = false + auto_grow_enabled = true + + administrator_login = data.azurerm_key_vault_secret.restaurant-db-login.value + administrator_login_password = data.azurerm_key_vault_secret.restaurant-db-password.value + version = "11" + + ssl_enforcement_enabled = false + ssl_minimal_tls_version_enforced = "TLSEnforcementDisabled" // TODO: change to TLS1_2 + +} + +resource "azurerm_postgresql_firewall_rule" "pgfw-goodfood-restaurant" { + name = "allow-azure-resources" + resource_group_name = data.azurerm_resource_group.rg-goodfood.name + server_name = azurerm_postgresql_server.pg-goodfood-restaurant.name + start_ip_address = "0.0.0.0" + end_ip_address = "0.0.0.0" +} diff --git a/services/restaurant/terraform/outputs.tf b/services/restaurant/terraform/outputs.tf new file mode 100644 index 00000000..a2d60616 --- /dev/null +++ b/services/restaurant/terraform/outputs.tf @@ -0,0 +1,6 @@ +output "main-rg-name" { + value = data.azurerm_resource_group.rg-goodfood.name +} +output "main-rg-id" { + value = data.azurerm_resource_group.rg-goodfood.id +} \ No newline at end of file diff --git a/services/restaurant/terraform/variables.tf b/services/restaurant/terraform/variables.tf new file mode 100644 index 00000000..65fd7547 --- /dev/null +++ b/services/restaurant/terraform/variables.tf @@ -0,0 +1,16 @@ +variable "environnment_suffix" { + type = string + description = "The suffix to append to the environment name" +} + +variable "location" { + type = string + description = "The location/region where all resources in this environment should be created" + default = "West Europe" +} + +variable "project_name" { + type = string + description = "The name of the project" + default = "goodfood" +} \ No newline at end of file diff --git a/services/restaurant/tsconfig.json b/services/restaurant/tsconfig.json new file mode 100644 index 00000000..99c07b41 --- /dev/null +++ b/services/restaurant/tsconfig.json @@ -0,0 +1,18 @@ +{ + "compilerOptions": { + "sourceMap": true, + "outDir": "dist", + "strict": true, + "lib": ["esnext"], + "esModuleInterop": true, + "baseUrl": ".", + "paths": { + "@restaurant/*": ["src/*"] + } + }, + "include": ["src/**/*.ts"], + "exclude": ["node_modules"], + "ts-node": { + "require": ["tsconfig-paths/register"] + } +} From f93f69a075baf4f5d0f09b20ef4f1b02d058b05a Mon Sep 17 00:00:00 2001 From: anatole Date: Sat, 19 Aug 2023 17:27:11 +0200 Subject: [PATCH 385/883] feat(global): add env.docker --- README.md | 30 +++++++++++++------------- services/basket/.env.docker | 2 ++ services/basket/src/lib/redis.ts | 2 +- services/delivery/.env.docker | 3 +++ services/delivery/.gitignore | 1 + services/docker-compose.yml | 37 ++++++++++++++++++++++++++++++-- services/gateway/.gitignore | 1 + services/log/.env.docker | 3 +++ services/order/.env.docker | 3 +++ services/order/.gitignore | 1 + services/product/.env.docker | 4 ++++ services/product/.gitignore | 1 + services/promotions/.env.docker | 4 ++++ services/promotions/.gitignore | 3 ++- services/stock/.env.docker | 4 ++++ services/stock/.gitignore | 1 + 16 files changed, 81 insertions(+), 19 deletions(-) create mode 100644 services/basket/.env.docker create mode 100644 services/delivery/.env.docker create mode 100644 services/log/.env.docker create mode 100644 services/order/.env.docker create mode 100644 services/product/.env.docker create mode 100644 services/promotions/.env.docker create mode 100644 services/stock/.env.docker diff --git a/README.md b/README.md index b21c638f..85596aae 100644 --- a/README.md +++ b/README.md @@ -15,21 +15,21 @@ a high volume of concurrent users, up to several thousand. ## Microservices ports -| Service | Port | Language | Database | Status | Assignee | -|-------------|-------|-------------|------------|--------|-----------------| -| Gateway | 50000 | Go | ❌ | ❌ | @Anatole-Godard | -| User (auth) | 50001 | Go | PostgreSQL | ⚠️ | @Anatole-Godard | -| Basket | 50002 | NodeJS (ts) | Redis | ⚠️ | @Anatole-Godard | -| Payment | 50003 | NodeJS (ts) | PostgreSQL | ✅ | @floriaaan | -| Product | 50004 | NodeJS (ts) | PostgreSQL | ❌ | @PierreLbg | -| Restaurant | 50005 | NodeJS (ts) | PostgreSQL | ❌ | @PierreLbg | -| Promotion | 50006 | NodeJS (ts) | PostgreSQL | ❌ | @PierreLbg | -| Order | 50007 | NodeJS (ts) | PostgreSQL | ✅ | @floriaaan | -| Delivery | 50008 | NodeJS (ts) | PostgreSQL | ✅ | @floriaaan | -| Stock | 50009 | NodeJS (ts) | PostgreSQL | ⚠️ | @floriaaan | -| Reporting | 50020 | C# (dotnet) | PostgreSQL | ⚠️ | @floriaaan | -| Log | 50021 | Go | PostgreSQL | ✅ | @floriaaan | -| (...) | (...) | (...) | (...) | (...) | +| Service | Port | Language | Database | Status | Assignee | +|-------------|-------|-------------|------------|------------|-----------------| +| Gateway | 50000 | Go | ❌ | ❌ (Infra) | @Anatole-Godard | +| User (auth) | 50001 | Go | PostgreSQL | ⚠️ (Infra) | @Anatole-Godard | +| Basket | 50002 | NodeJS (ts) | Redis | ⚠️ (Infra) | @Anatole-Godard | +| Payment | 50003 | NodeJS (ts) | PostgreSQL | ✅ | @floriaaan | +| Product | 50004 | NodeJS (ts) | PostgreSQL | ❌ | @PierreLbg | +| Restaurant | 50005 | NodeJS (ts) | PostgreSQL | ❌ | @PierreLbg | +| Promotion | 50006 | NodeJS (ts) | PostgreSQL | ❌ | @PierreLbg | +| Order | 50007 | NodeJS (ts) | PostgreSQL | ✅ | @floriaaan | +| Delivery | 50008 | NodeJS (ts) | PostgreSQL | ✅ | @floriaaan | +| Stock | 50009 | NodeJS (ts) | PostgreSQL | ⚠️ | @floriaaan | +| Reporting | 50020 | C# (dotnet) | PostgreSQL | ⚠️ | @floriaaan | +| Log | 50021 | Go | PostgreSQL | ✅ | @floriaaan | +| (...) | (...) | (...) | (...) | (...) | ## File Hierarchy diff --git a/services/basket/.env.docker b/services/basket/.env.docker new file mode 100644 index 00000000..82c59d77 --- /dev/null +++ b/services/basket/.env.docker @@ -0,0 +1,2 @@ +REDIS_URL=redis://basket-redis:6379 +PORT=50002 \ No newline at end of file diff --git a/services/basket/src/lib/redis.ts b/services/basket/src/lib/redis.ts index dd6f1206..62e32b53 100644 --- a/services/basket/src/lib/redis.ts +++ b/services/basket/src/lib/redis.ts @@ -1,6 +1,6 @@ import {createClient} from "redis"; -const client = createClient(); +const client = createClient({url: process.env.REDIS_URL}); client.on('error', (err: any) => { console.log('could not establish a connection with redis. ' + err); diff --git a/services/delivery/.env.docker b/services/delivery/.env.docker new file mode 100644 index 00000000..db4361a8 --- /dev/null +++ b/services/delivery/.env.docker @@ -0,0 +1,3 @@ +DATABASE_URL=postgres://postgres:password@delivery-postgres:5432/postgres +PORT=50008 +REDIS_HOST: delivery-redis \ No newline at end of file diff --git a/services/delivery/.gitignore b/services/delivery/.gitignore index 31e50325..868e8430 100644 --- a/services/delivery/.gitignore +++ b/services/delivery/.gitignore @@ -3,4 +3,5 @@ dist/ bin/ *.env* !*.env.example +!*.env.docker diff --git a/services/docker-compose.yml b/services/docker-compose.yml index 364a6aea..71c4f35b 100644 --- a/services/docker-compose.yml +++ b/services/docker-compose.yml @@ -1,12 +1,13 @@ version: "3" services: - # gateway: + + # Gateway : + gateway: image: goodfood-gateway:1.0.0 build: context: . dockerfile: ./gateway/Dockerfile - env_file: - ./gateway/.env ports: @@ -14,6 +15,33 @@ services: networks: - goodfood-network + # Basket service + + basket-service: + image: goodfood-basket:1.0.0 + build: + context: . + dockerfile: ./basket/Dockerfile + env_file: + - basket/.env.docker + ports: + - "50002" + networks: + - goodfood-network + + basket-redis: + image: redis:latest + ports: + - "6379" + volumes: + - goodfood-basket-volume:/data + networks: + - goodfood-network + command: redis-server --appendonly yes + environment: + REDIS_USERNAME: redis + REDIS_PASSWORD: password + # Delivery service delivery-service: @@ -83,6 +111,7 @@ services: PGDATA: /var/lib/postgresql/data/pgdata # Product service + product-service: image: goodfood-product:1.0.0 build: @@ -110,6 +139,7 @@ services: PGDATA: /var/lib/postgresql/data/pgdata # Promotion service + promotion-service: image: goodfood-promotion:1.0.0 build: @@ -137,6 +167,7 @@ services: PGDATA: /var/lib/postgresql/data/pgdata # Stock service + stock-service: image: goodfood-stock:1.0.0 build: @@ -164,6 +195,8 @@ services: PGDATA: /var/lib/postgresql/data/pgdata volumes: +volumes: + goodfood-basket-volume: goodfood-delivery-volume: goodfood-order-volume: goodfood-product-volume: diff --git a/services/gateway/.gitignore b/services/gateway/.gitignore index 583204b4..82abeb3b 100644 --- a/services/gateway/.gitignore +++ b/services/gateway/.gitignore @@ -3,3 +3,4 @@ dist/ bin/ *.env* !*.env.example +!*.env.docker diff --git a/services/log/.env.docker b/services/log/.env.docker new file mode 100644 index 00000000..c42a8786 --- /dev/null +++ b/services/log/.env.docker @@ -0,0 +1,3 @@ +DATABASE_URL=postgres://postgres:password@log-postgres:5432/postgres +PORT=50021 +AMQP_URL=amqp://guest:guest@log-rabbitmq:5672 \ No newline at end of file diff --git a/services/order/.env.docker b/services/order/.env.docker new file mode 100644 index 00000000..29a1c0fb --- /dev/null +++ b/services/order/.env.docker @@ -0,0 +1,3 @@ +DATABASE_URL=postgres://postgres:password@order-postgres:5432/postgres +AMQP_URL=amqp://guest:guest@log-service:50021 +PORT=50007 \ No newline at end of file diff --git a/services/order/.gitignore b/services/order/.gitignore index 583204b4..82abeb3b 100644 --- a/services/order/.gitignore +++ b/services/order/.gitignore @@ -3,3 +3,4 @@ dist/ bin/ *.env* !*.env.example +!*.env.docker diff --git a/services/product/.env.docker b/services/product/.env.docker new file mode 100644 index 00000000..3e8bc019 --- /dev/null +++ b/services/product/.env.docker @@ -0,0 +1,4 @@ +DATABASE_URL=postgres://postgres:password@product-postgres:5432/postgres +PORT=50004 +AZURE_STORAGE_SAS_TOKEN=example +AZURE_STORAGE_RESOURCE_NAME=exemple \ No newline at end of file diff --git a/services/product/.gitignore b/services/product/.gitignore index bee3adb2..ca835776 100644 --- a/services/product/.gitignore +++ b/services/product/.gitignore @@ -178,3 +178,4 @@ dist/ bin/ *.env* !*.env.example +!*.env.docker diff --git a/services/promotions/.env.docker b/services/promotions/.env.docker new file mode 100644 index 00000000..114b6446 --- /dev/null +++ b/services/promotions/.env.docker @@ -0,0 +1,4 @@ +DATABASE_URL=postgres://postgres:password@promotion-postgres:5432/promotions +AMQP_URL=amqp://guest:guest@log-service:50021 + +PORT=50006 \ No newline at end of file diff --git a/services/promotions/.gitignore b/services/promotions/.gitignore index bab9187d..7de297b6 100644 --- a/services/promotions/.gitignore +++ b/services/promotions/.gitignore @@ -2,4 +2,5 @@ node_modules/ dist/ bin/ *.env* -!*.env.example \ No newline at end of file +!*.env.example +!*.env.docker \ No newline at end of file diff --git a/services/stock/.env.docker b/services/stock/.env.docker new file mode 100644 index 00000000..3798f17f --- /dev/null +++ b/services/stock/.env.docker @@ -0,0 +1,4 @@ +DATABASE_URL=postgres://postgres:password@stock-postgres:5432/postgres +AMQP_URL=amqp://guest:guest@log-service:50021 + +PORT=50009 \ No newline at end of file diff --git a/services/stock/.gitignore b/services/stock/.gitignore index 583204b4..82abeb3b 100644 --- a/services/stock/.gitignore +++ b/services/stock/.gitignore @@ -3,3 +3,4 @@ dist/ bin/ *.env* !*.env.example +!*.env.docker From 78a0a16a3eef76007f308e996c8c0afb68cf023e Mon Sep 17 00:00:00 2001 From: Florian LEROUX Date: Sat, 19 Aug 2023 17:31:57 +0200 Subject: [PATCH 386/883] feat(location): implement list by location --- services/restaurant/package.json | 1 + services/restaurant/pnpm-lock.yaml | 7 +++++ .../src/handler/list-by-location.ts | 29 ++++++++++++++----- 3 files changed, 30 insertions(+), 7 deletions(-) diff --git a/services/restaurant/package.json b/services/restaurant/package.json index 810d99a5..6189e4a1 100644 --- a/services/restaurant/package.json +++ b/services/restaurant/package.json @@ -21,6 +21,7 @@ "amqplib": "^0.10.3", "dotenv": "^16.3.1", "esbuild": "^0.18.15", + "geolib": "^3.3.4", "nodemon": "^3.0.1", "path": "^0.12.7", "ts-node": "^10.9.1", diff --git a/services/restaurant/pnpm-lock.yaml b/services/restaurant/pnpm-lock.yaml index 82053c45..0aef035e 100644 --- a/services/restaurant/pnpm-lock.yaml +++ b/services/restaurant/pnpm-lock.yaml @@ -23,6 +23,9 @@ dependencies: esbuild: specifier: ^0.18.15 version: 0.18.15 + geolib: + specifier: ^3.3.4 + version: 3.3.4 nodemon: specifier: ^3.0.1 version: 3.0.1 @@ -608,6 +611,10 @@ packages: dev: false optional: true + /geolib@3.3.4: + resolution: {integrity: sha512-EicrlLLL3S42gE9/wde+11uiaYAaeSVDwCUIv2uMIoRBfNJCn8EsSI+6nS3r4TCKDO6+RQNM9ayLq2at+oZQWQ==} + dev: false + /get-caller-file@2.0.5: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} diff --git a/services/restaurant/src/handler/list-by-location.ts b/services/restaurant/src/handler/list-by-location.ts index d93c9908..be687f4b 100644 --- a/services/restaurant/src/handler/list-by-location.ts +++ b/services/restaurant/src/handler/list-by-location.ts @@ -6,6 +6,23 @@ import { Restaurant, RestaurantList, } from "@restaurant/types/restaurant"; +import geolib from "geolib"; + +interface RestaurantWithDistance extends Restaurant { + distance: number; +} + +export const sortRestaurantsByDistance = ( + restaurants: Restaurant[], + location: [number, number] +): RestaurantWithDistance[] => { + return restaurants + .map((restaurant) => ({ + ...restaurant, + distance: geolib.getDistance(location, restaurant.location), + })) + .sort((a, b) => a.distance - b.distance); +}; export const GetRestaurantsByLocation = async ( { request }: Data, @@ -14,13 +31,11 @@ export const GetRestaurantsByLocation = async ( try { const { location } = request; - const restaurants = (await prisma.restaurant.findMany({ - where: { - location: { - equals: location, - }, - }, - })) as unknown as Restaurant[]; + const all = (await prisma.restaurant.findMany()) as unknown as Restaurant[]; + + const restaurants = sortRestaurantsByDistance(all, location) + .map(({ distance, ...restaurant }) => restaurant as Restaurant) + .filter((_, i) => i < 10); callback(null, { restaurants }); } catch (error) { From 37f9d231e6d7e1795d3931f46e621598f2703087 Mon Sep 17 00:00:00 2001 From: anatole Date: Sat, 19 Aug 2023 17:40:37 +0200 Subject: [PATCH 387/883] feat(basket): update gitignore --- services/basket/.gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/services/basket/.gitignore b/services/basket/.gitignore index 31e50325..868e8430 100644 --- a/services/basket/.gitignore +++ b/services/basket/.gitignore @@ -3,4 +3,5 @@ dist/ bin/ *.env* !*.env.example +!*.env.docker From 9791e6f279c73ed0c3a4e63440dad0156585df79 Mon Sep 17 00:00:00 2001 From: anatole Date: Sat, 19 Aug 2023 18:02:17 +0200 Subject: [PATCH 388/883] feat(global): add log service to the docker compose --- services/basket/.env.docker | 3 ++- services/basket/.env.example | 3 ++- services/delivery/.env.docker | 1 + services/delivery/.env.example | 1 + services/docker-compose.yml | 42 +++++++++++++++++++++++++++++++- services/order/.env.docker | 2 +- services/order/.env.example | 2 +- services/payment/.env.example | 2 +- services/product/.env.docker | 1 + services/product/.env.example | 1 + services/promotions/.env.docker | 2 +- services/promotions/.env.example | 2 +- services/stock/.env.docker | 2 +- services/stock/.env.example | 2 +- 14 files changed, 56 insertions(+), 10 deletions(-) diff --git a/services/basket/.env.docker b/services/basket/.env.docker index 82c59d77..c0e31609 100644 --- a/services/basket/.env.docker +++ b/services/basket/.env.docker @@ -1,2 +1,3 @@ REDIS_URL=redis://basket-redis:6379 -PORT=50002 \ No newline at end of file +PORT=50002 +AMQP_URL=amqp://guest:guest@log-rabbitmq \ No newline at end of file diff --git a/services/basket/.env.example b/services/basket/.env.example index 9fcb03c6..97d7165f 100644 --- a/services/basket/.env.example +++ b/services/basket/.env.example @@ -1,2 +1,3 @@ REDIS_URL=redis://localhost:6379/0 -PORT=50002 \ No newline at end of file +PORT=50002 +AMQP_URL=amqp://guest:guest@log-rabbitmq \ No newline at end of file diff --git a/services/delivery/.env.docker b/services/delivery/.env.docker index db4361a8..9d480629 100644 --- a/services/delivery/.env.docker +++ b/services/delivery/.env.docker @@ -1,3 +1,4 @@ DATABASE_URL=postgres://postgres:password@delivery-postgres:5432/postgres PORT=50008 +AMQP_URL=amqp://guest:guest@log-rabbitmq REDIS_HOST: delivery-redis \ No newline at end of file diff --git a/services/delivery/.env.example b/services/delivery/.env.example index 1982e30b..1564809d 100644 --- a/services/delivery/.env.example +++ b/services/delivery/.env.example @@ -1,4 +1,5 @@ DATABASE_URL=postgres://postgres:password@localhost:5432/postgres PORT=50008 +AMQP_URL=amqp://guest:guest@log-rabbitmq # with docker add : # REDIS_HOST: delivery-redis \ No newline at end of file diff --git a/services/docker-compose.yml b/services/docker-compose.yml index 71c4f35b..04330d2a 100644 --- a/services/docker-compose.yml +++ b/services/docker-compose.yml @@ -194,7 +194,46 @@ services: POSTGRES_DB: postgres PGDATA: /var/lib/postgresql/data/pgdata -volumes: + # Log service + + log-service: + depends_on: + - log-postgres + - log-rabbitmq + restart: + always + image: floriaaan/goodfood-log:latest + build: + context: . + dockerfile: ./log/Dockerfile + env_file: + - ./log/.env.docker + ports: + - "50021" + networks: + - goodfood-network + + log-rabbitmq: + restart: always + image: rabbitmq:3-management + ports: + - "5672" + - "15672" + networks: + - goodfood-network + + log-postgres: + image: postgres:15.2 + environment: + - POSTGRES_USER=postgres + - POSTGRES_PASSWORD=password + ports: + - "5432" + volumes: + - goodfood-log-volume:/var/lib/postgresql/data + networks: + - goodfood-network + volumes: goodfood-basket-volume: goodfood-delivery-volume: @@ -202,6 +241,7 @@ volumes: goodfood-product-volume: goodfood-promotion-volume: goodfood-stock-volume: + goodfood-log-volume: networks: goodfood-network: \ No newline at end of file diff --git a/services/order/.env.docker b/services/order/.env.docker index 29a1c0fb..6c59b038 100644 --- a/services/order/.env.docker +++ b/services/order/.env.docker @@ -1,3 +1,3 @@ DATABASE_URL=postgres://postgres:password@order-postgres:5432/postgres -AMQP_URL=amqp://guest:guest@log-service:50021 +AMQP_URL=amqp://guest:guest@log-rabbitmq PORT=50007 \ No newline at end of file diff --git a/services/order/.env.example b/services/order/.env.example index 2e790ca5..5a5e841f 100644 --- a/services/order/.env.example +++ b/services/order/.env.example @@ -1,4 +1,4 @@ DATABASE_URL=postgres://postgres:password@localhost:5432/postgres -AMQP_URL=amqp://guest:guest@localhost +AMQP_URL=amqp://guest:guest@log-rabbitmq PORT=50007 \ No newline at end of file diff --git a/services/payment/.env.example b/services/payment/.env.example index 7e687d7e..9951b5de 100644 --- a/services/payment/.env.example +++ b/services/payment/.env.example @@ -1,5 +1,5 @@ DATABASE_URL=postgres://postgres:password@localhost:5432/postgres -AMQP_URL=amqp://guest:guest@localhost +AMQP_URL=amqp://guest:guest@log-rabbitmq PORT=50003 diff --git a/services/product/.env.docker b/services/product/.env.docker index 3e8bc019..6dd3b8a4 100644 --- a/services/product/.env.docker +++ b/services/product/.env.docker @@ -1,4 +1,5 @@ DATABASE_URL=postgres://postgres:password@product-postgres:5432/postgres PORT=50004 +AMQP_URL=amqp://guest:guest@log-rabbitmq AZURE_STORAGE_SAS_TOKEN=example AZURE_STORAGE_RESOURCE_NAME=exemple \ No newline at end of file diff --git a/services/product/.env.example b/services/product/.env.example index 296f701e..0b930c52 100644 --- a/services/product/.env.example +++ b/services/product/.env.example @@ -1,4 +1,5 @@ DATABASE_URL=postgres://postgres:password@postgres:5432/postgres PORT=50004 +AMQP_URL=amqp://guest:guest@log-rabbitmq AZURE_STORAGE_SAS_TOKEN=example AZURE_STORAGE_RESOURCE_NAME=exemple \ No newline at end of file diff --git a/services/promotions/.env.docker b/services/promotions/.env.docker index 114b6446..ba4b2670 100644 --- a/services/promotions/.env.docker +++ b/services/promotions/.env.docker @@ -1,4 +1,4 @@ DATABASE_URL=postgres://postgres:password@promotion-postgres:5432/promotions -AMQP_URL=amqp://guest:guest@log-service:50021 +AMQP_URL=amqp://guest:guest@log-rabbitmq PORT=50006 \ No newline at end of file diff --git a/services/promotions/.env.example b/services/promotions/.env.example index e1787832..b4ee39bc 100644 --- a/services/promotions/.env.example +++ b/services/promotions/.env.example @@ -1,4 +1,4 @@ DATABASE_URL=postgres://postgres:password@localhost:5432/promotions -AMQP_URL=amqp://guest:guest@localhost +AMQP_URL=amqp://guest:guest@log-rabbitmq PORT=50006 \ No newline at end of file diff --git a/services/stock/.env.docker b/services/stock/.env.docker index 3798f17f..fc521070 100644 --- a/services/stock/.env.docker +++ b/services/stock/.env.docker @@ -1,4 +1,4 @@ DATABASE_URL=postgres://postgres:password@stock-postgres:5432/postgres -AMQP_URL=amqp://guest:guest@log-service:50021 +AMQP_URL=amqp://guest:guest@log-rabbitmq PORT=50009 \ No newline at end of file diff --git a/services/stock/.env.example b/services/stock/.env.example index 93d928e4..dbda1a0e 100644 --- a/services/stock/.env.example +++ b/services/stock/.env.example @@ -1,4 +1,4 @@ DATABASE_URL=postgres://postgres:password@localhost:5432/postgres -AMQP_URL=amqp://guest:guest@localhost +AMQP_URL=amqp://guest:guest@log-rabbitmq PORT=50009 \ No newline at end of file From 433968bf552bca7b065df2cd204ac32aefe7f875 Mon Sep 17 00:00:00 2001 From: Pierre Lebigre Date: Sat, 19 Aug 2023 19:46:23 +0200 Subject: [PATCH 389/883] Livraison final --- services/notification/.env.example | 6 + services/notification/package.json | 24 + services/notification/pnpm-lock.yaml | 1044 ++++++++++++++++- .../20230819164921_init/migration.sql | 12 + .../prisma/migrations/migration_lock.toml | 3 + services/notification/prisma/schema.prisma | 9 +- services/notification/src/handler/create.ts | 27 + services/notification/src/handler/delete.ts | 20 + services/notification/src/handler/get.ts | 20 + services/notification/src/handler/index.ts | 13 + .../notification/src/handler/listByType.ts | 24 + services/notification/src/handler/update.ts | 28 + services/notification/src/lib/amqp.ts | 85 ++ services/notification/src/lib/log.ts | 74 ++ services/notification/src/lib/plunk.ts | 6 + services/notification/src/lib/prisma.ts | 29 + services/notification/src/lib/proxy.ts | 132 +++ services/notification/src/middleware/log.ts | 42 + .../src/resources/grpc-credentials.ts | 5 + .../src/resources/protoloader-options.ts | 7 + services/notification/src/server.ts | 41 + services/notification/src/types/index.d.ts | 3 + .../notification/src/types/notification.d.ts | 30 + services/notification/tsconfig.json | 2 +- services/proto/notification.proto | 44 + 25 files changed, 1724 insertions(+), 6 deletions(-) create mode 100644 services/notification/.env.example create mode 100644 services/notification/prisma/migrations/20230819164921_init/migration.sql create mode 100644 services/notification/prisma/migrations/migration_lock.toml create mode 100644 services/notification/src/handler/create.ts create mode 100644 services/notification/src/handler/delete.ts create mode 100644 services/notification/src/handler/get.ts create mode 100644 services/notification/src/handler/index.ts create mode 100644 services/notification/src/handler/listByType.ts create mode 100644 services/notification/src/handler/update.ts create mode 100644 services/notification/src/lib/amqp.ts create mode 100644 services/notification/src/lib/log.ts create mode 100644 services/notification/src/lib/plunk.ts create mode 100644 services/notification/src/lib/prisma.ts create mode 100644 services/notification/src/lib/proxy.ts create mode 100644 services/notification/src/middleware/log.ts create mode 100644 services/notification/src/resources/grpc-credentials.ts create mode 100644 services/notification/src/resources/protoloader-options.ts create mode 100644 services/notification/src/server.ts create mode 100644 services/notification/src/types/index.d.ts create mode 100644 services/notification/src/types/notification.d.ts create mode 100644 services/proto/notification.proto diff --git a/services/notification/.env.example b/services/notification/.env.example new file mode 100644 index 00000000..c8470406 --- /dev/null +++ b/services/notification/.env.example @@ -0,0 +1,6 @@ +DATABASE_URL=postgresql://postgres:postgres@localhost:5432/notifications +AMQP_URL=amqp://guest:guest@localhost +PLUNK_PUBLIC_KEY="exemple" +PLUNk_PROJECT_NAME=goodfood + +PORT=50022 \ No newline at end of file diff --git a/services/notification/package.json b/services/notification/package.json index 1b2ecb3b..f2ab816f 100644 --- a/services/notification/package.json +++ b/services/notification/package.json @@ -1,6 +1,30 @@ { + "name": "@goodfood/notification", + "bin": "dist/index.js", + "scripts": { + "start": "node dist/index.js", + "dev": "nodemon --watch 'src/**/*.ts' --exec 'ts-node' src/server.ts", + "build": "esbuild src/server.ts --bundle --platform=node --target=node18 --outfile=dist/index.js", + "test": "echo 'tests are disabled'", + "prisma:generate": "prisma generate", + "postinstall": "npm run prisma:generate" + }, "devDependencies": { "prisma": "^5.1.0", "typescript": "^5.1.6" + }, + "dependencies": { + "@grpc/grpc-js": "^1.9.0", + "@grpc/proto-loader": "^0.7.8", + "@plunk/node": "^2.0.0", + "@prisma/client": "5.1.0", + "@types/amqplib": "^0.10.1", + "amqplib": "^0.10.3", + "dotenv": "^16.3.1", + "esbuild": "^0.19.2", + "nodemon": "^3.0.1", + "path": "^0.12.7", + "ts-node": "^10.9.1", + "tsconfig-paths": "^4.2.0" } } diff --git a/services/notification/pnpm-lock.yaml b/services/notification/pnpm-lock.yaml index 1fad5c3f..5c090eb9 100644 --- a/services/notification/pnpm-lock.yaml +++ b/services/notification/pnpm-lock.yaml @@ -4,6 +4,47 @@ settings: autoInstallPeers: true excludeLinksFromLockfile: false +dependencies: + '@grpc/grpc-js': + specifier: ^1.9.0 + version: 1.9.0 + '@grpc/proto-loader': + specifier: ^0.7.8 + version: 0.7.8 + '@plunk/node': + specifier: ^2.0.0 + version: 2.0.0 + '@prisma/client': + specifier: 5.1.0 + version: 5.1.0(prisma@5.1.0) + '@types/amqplib': + specifier: ^0.10.1 + version: 0.10.1 + amqplib: + specifier: ^0.10.3 + version: 0.10.3 + dotenv: + specifier: ^16.3.1 + version: 16.3.1 + esbuild: + specifier: ^0.19.2 + version: 0.19.2 + node-fetch: + specifier: ^3.3.2 + version: 3.3.2 + nodemon: + specifier: ^3.0.1 + version: 3.0.1 + path: + specifier: ^0.12.7 + version: 0.12.7 + ts-node: + specifier: ^10.9.1 + version: 10.9.1(@types/node@20.5.1)(typescript@5.1.6) + tsconfig-paths: + specifier: ^4.2.0 + version: 4.2.0 + devDependencies: prisma: specifier: ^5.1.0 @@ -14,10 +55,764 @@ devDependencies: packages: + /@acuminous/bitsyntax@0.1.2: + resolution: {integrity: sha512-29lUK80d1muEQqiUsSo+3A0yP6CdspgC95EnKBMi22Xlwt79i/En4Vr67+cXhU+cZjbti3TgGGC5wy1stIywVQ==} + engines: {node: '>=0.8'} + dependencies: + buffer-more-ints: 1.0.0 + debug: 4.3.4 + safe-buffer: 5.1.2 + transitivePeerDependencies: + - supports-color + dev: false + + /@cspotcode/source-map-support@0.8.1: + resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} + engines: {node: '>=12'} + dependencies: + '@jridgewell/trace-mapping': 0.3.9 + dev: false + + /@esbuild/android-arm64@0.19.2: + resolution: {integrity: sha512-lsB65vAbe90I/Qe10OjkmrdxSX4UJDjosDgb8sZUKcg3oefEuW2OT2Vozz8ef7wrJbMcmhvCC+hciF8jY/uAkw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: false + optional: true + + /@esbuild/android-arm@0.19.2: + resolution: {integrity: sha512-tM8yLeYVe7pRyAu9VMi/Q7aunpLwD139EY1S99xbQkT4/q2qa6eA4ige/WJQYdJ8GBL1K33pPFhPfPdJ/WzT8Q==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + requiresBuild: true + dev: false + optional: true + + /@esbuild/android-x64@0.19.2: + resolution: {integrity: sha512-qK/TpmHt2M/Hg82WXHRc/W/2SGo/l1thtDHZWqFq7oi24AjZ4O/CpPSu6ZuYKFkEgmZlFoa7CooAyYmuvnaG8w==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + requiresBuild: true + dev: false + optional: true + + /@esbuild/darwin-arm64@0.19.2: + resolution: {integrity: sha512-Ora8JokrvrzEPEpZO18ZYXkH4asCdc1DLdcVy8TGf5eWtPO1Ie4WroEJzwI52ZGtpODy3+m0a2yEX9l+KUn0tA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@esbuild/darwin-x64@0.19.2: + resolution: {integrity: sha512-tP+B5UuIbbFMj2hQaUr6EALlHOIOmlLM2FK7jeFBobPy2ERdohI4Ka6ZFjZ1ZYsrHE/hZimGuU90jusRE0pwDw==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@esbuild/freebsd-arm64@0.19.2: + resolution: {integrity: sha512-YbPY2kc0acfzL1VPVK6EnAlig4f+l8xmq36OZkU0jzBVHcOTyQDhnKQaLzZudNJQyymd9OqQezeaBgkTGdTGeQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: false + optional: true + + /@esbuild/freebsd-x64@0.19.2: + resolution: {integrity: sha512-nSO5uZT2clM6hosjWHAsS15hLrwCvIWx+b2e3lZ3MwbYSaXwvfO528OF+dLjas1g3bZonciivI8qKR/Hm7IWGw==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-arm64@0.19.2: + resolution: {integrity: sha512-ig2P7GeG//zWlU0AggA3pV1h5gdix0MA3wgB+NsnBXViwiGgY77fuN9Wr5uoCrs2YzaYfogXgsWZbm+HGr09xg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-arm@0.19.2: + resolution: {integrity: sha512-Odalh8hICg7SOD7XCj0YLpYCEc+6mkoq63UnExDCiRA2wXEmGlK5JVrW50vZR9Qz4qkvqnHcpH+OFEggO3PgTg==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-ia32@0.19.2: + resolution: {integrity: sha512-mLfp0ziRPOLSTek0Gd9T5B8AtzKAkoZE70fneiiyPlSnUKKI4lp+mGEnQXcQEHLJAcIYDPSyBvsUbKUG2ri/XQ==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-loong64@0.19.2: + resolution: {integrity: sha512-hn28+JNDTxxCpnYjdDYVMNTR3SKavyLlCHHkufHV91fkewpIyQchS1d8wSbmXhs1fiYDpNww8KTFlJ1dHsxeSw==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-mips64el@0.19.2: + resolution: {integrity: sha512-KbXaC0Sejt7vD2fEgPoIKb6nxkfYW9OmFUK9XQE4//PvGIxNIfPk1NmlHmMg6f25x57rpmEFrn1OotASYIAaTg==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-ppc64@0.19.2: + resolution: {integrity: sha512-dJ0kE8KTqbiHtA3Fc/zn7lCd7pqVr4JcT0JqOnbj4LLzYnp+7h8Qi4yjfq42ZlHfhOCM42rBh0EwHYLL6LEzcw==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-riscv64@0.19.2: + resolution: {integrity: sha512-7Z/jKNFufZ/bbu4INqqCN6DDlrmOTmdw6D0gH+6Y7auok2r02Ur661qPuXidPOJ+FSgbEeQnnAGgsVynfLuOEw==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-s390x@0.19.2: + resolution: {integrity: sha512-U+RinR6aXXABFCcAY4gSlv4CL1oOVvSSCdseQmGO66H+XyuQGZIUdhG56SZaDJQcLmrSfRmx5XZOWyCJPRqS7g==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-x64@0.19.2: + resolution: {integrity: sha512-oxzHTEv6VPm3XXNaHPyUTTte+3wGv7qVQtqaZCrgstI16gCuhNOtBXLEBkBREP57YTd68P0VgDgG73jSD8bwXQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/netbsd-x64@0.19.2: + resolution: {integrity: sha512-WNa5zZk1XpTTwMDompZmvQLHszDDDN7lYjEHCUmAGB83Bgs20EMs7ICD+oKeT6xt4phV4NDdSi/8OfjPbSbZfQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: false + optional: true + + /@esbuild/openbsd-x64@0.19.2: + resolution: {integrity: sha512-S6kI1aT3S++Dedb7vxIuUOb3oAxqxk2Rh5rOXOTYnzN8JzW1VzBd+IqPiSpgitu45042SYD3HCoEyhLKQcDFDw==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: false + optional: true + + /@esbuild/sunos-x64@0.19.2: + resolution: {integrity: sha512-VXSSMsmb+Z8LbsQGcBMiM+fYObDNRm8p7tkUDMPG/g4fhFX5DEFmjxIEa3N8Zr96SjsJ1woAhF0DUnS3MF3ARw==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: false + optional: true + + /@esbuild/win32-arm64@0.19.2: + resolution: {integrity: sha512-5NayUlSAyb5PQYFAU9x3bHdsqB88RC3aM9lKDAz4X1mo/EchMIT1Q+pSeBXNgkfNmRecLXA0O8xP+x8V+g/LKg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@esbuild/win32-ia32@0.19.2: + resolution: {integrity: sha512-47gL/ek1v36iN0wL9L4Q2MFdujR0poLZMJwhO2/N3gA89jgHp4MR8DKCmwYtGNksbfJb9JoTtbkoe6sDhg2QTA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@esbuild/win32-x64@0.19.2: + resolution: {integrity: sha512-tcuhV7ncXBqbt/Ybf0IyrMcwVOAPDckMK9rXNHtF17UTK18OKLpg08glminN06pt2WCoALhXdLfSPbVvK/6fxw==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@grpc/grpc-js@1.9.0: + resolution: {integrity: sha512-H8+iZh+kCE6VR/Krj6W28Y/ZlxoZ1fOzsNt77nrdE3knkbSelW1Uus192xOFCxHyeszLj8i4APQkSIXjAoOxXg==} + engines: {node: ^8.13.0 || >=10.10.0} + dependencies: + '@grpc/proto-loader': 0.7.8 + '@types/node': 20.5.1 + dev: false + + /@grpc/proto-loader@0.7.8: + resolution: {integrity: sha512-GU12e2c8dmdXb7XUlOgYWZ2o2i+z9/VeACkxTA/zzAe2IjclC5PnVL0lpgjhrqfpDYHzM8B1TF6pqWegMYAzlA==} + engines: {node: '>=6'} + hasBin: true + dependencies: + '@types/long': 4.0.2 + lodash.camelcase: 4.3.0 + long: 4.0.0 + protobufjs: 7.2.4 + yargs: 17.7.2 + dev: false + + /@jridgewell/resolve-uri@3.1.1: + resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} + engines: {node: '>=6.0.0'} + dev: false + + /@jridgewell/sourcemap-codec@1.4.15: + resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + dev: false + + /@jridgewell/trace-mapping@0.3.9: + resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} + dependencies: + '@jridgewell/resolve-uri': 3.1.1 + '@jridgewell/sourcemap-codec': 1.4.15 + dev: false + + /@plunk/node@2.0.0: + resolution: {integrity: sha512-53lgots3fWGAo1QdS18BdEpJl7A29O1F9rYVn/7DfJ07SpJ1ZlzUeeWGVrWGL7PRRZb4a9Tw7Tt8Wnw0Xorhjg==} + dependencies: + native-fetch: 4.0.2(undici@5.23.0) + tslib: 2.6.2 + undici: 5.23.0 + dev: false + + /@prisma/client@5.1.0(prisma@5.1.0): + resolution: {integrity: sha512-aIxuXlH3p3Vy91buodQhYgAD9m0yuxJzpXMhc1ejQ/WN3pNNWzBA0iDcBObLq8DMdszcXmoLAk3hiRq/ZwBsOw==} + engines: {node: '>=16.13'} + requiresBuild: true + peerDependencies: + prisma: '*' + peerDependenciesMeta: + prisma: + optional: true + dependencies: + '@prisma/engines-version': 5.1.0-28.a9b7003df90aa623086e4d6f4e43c72468e6339b + prisma: 5.1.0 + dev: false + + /@prisma/engines-version@5.1.0-28.a9b7003df90aa623086e4d6f4e43c72468e6339b: + resolution: {integrity: sha512-jTwE2oy1yjICmTfnCR0ASIpuMZXZ18sUzQXB7V0RMbrM9OlcmbUwXPuYhnxXuWN8XwRmujeIhsXs/Zeh+fjPOQ==} + dev: false + /@prisma/engines@5.1.0: resolution: {integrity: sha512-HqaFsnPmZOdMWkPq6tT2eTVTQyaAXEDdKszcZ4yc7DGMBIYRP6j/zAJTtZUG9SsMV8FaucdL5vRyxY/p5Ni28g==} requiresBuild: true - dev: true + + /@protobufjs/aspromise@1.1.2: + resolution: {integrity: sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==} + dev: false + + /@protobufjs/base64@1.1.2: + resolution: {integrity: sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==} + dev: false + + /@protobufjs/codegen@2.0.4: + resolution: {integrity: sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==} + dev: false + + /@protobufjs/eventemitter@1.1.0: + resolution: {integrity: sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==} + dev: false + + /@protobufjs/fetch@1.1.0: + resolution: {integrity: sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==} + dependencies: + '@protobufjs/aspromise': 1.1.2 + '@protobufjs/inquire': 1.1.0 + dev: false + + /@protobufjs/float@1.0.2: + resolution: {integrity: sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==} + dev: false + + /@protobufjs/inquire@1.1.0: + resolution: {integrity: sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==} + dev: false + + /@protobufjs/path@1.1.2: + resolution: {integrity: sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==} + dev: false + + /@protobufjs/pool@1.1.0: + resolution: {integrity: sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==} + dev: false + + /@protobufjs/utf8@1.1.0: + resolution: {integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==} + dev: false + + /@tsconfig/node10@1.0.9: + resolution: {integrity: sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==} + dev: false + + /@tsconfig/node12@1.0.11: + resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} + dev: false + + /@tsconfig/node14@1.0.3: + resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} + dev: false + + /@tsconfig/node16@1.0.4: + resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} + dev: false + + /@types/amqplib@0.10.1: + resolution: {integrity: sha512-j6ANKT79ncUDnAs/+9r9eDujxbeJoTjoVu33gHHcaPfmLQaMhvfbH2GqSe8KUM444epAp1Vl3peVOQfZk3UIqA==} + dependencies: + '@types/node': 20.5.1 + dev: false + + /@types/long@4.0.2: + resolution: {integrity: sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==} + dev: false + + /@types/node@20.5.1: + resolution: {integrity: sha512-4tT2UrL5LBqDwoed9wZ6N3umC4Yhz3W3FloMmiiG4JwmUJWpie0c7lcnUNd4gtMKuDEO4wRVS8B6Xa0uMRsMKg==} + dev: false + + /abbrev@1.1.1: + resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} + dev: false + + /acorn-walk@8.2.0: + resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} + engines: {node: '>=0.4.0'} + dev: false + + /acorn@8.10.0: + resolution: {integrity: sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==} + engines: {node: '>=0.4.0'} + hasBin: true + dev: false + + /amqplib@0.10.3: + resolution: {integrity: sha512-UHmuSa7n8vVW/a5HGh2nFPqAEr8+cD4dEZ6u9GjP91nHfr1a54RyAKyra7Sb5NH7NBKOUlyQSMXIp0qAixKexw==} + engines: {node: '>=10'} + dependencies: + '@acuminous/bitsyntax': 0.1.2 + buffer-more-ints: 1.0.0 + readable-stream: 1.1.14 + url-parse: 1.5.10 + transitivePeerDependencies: + - supports-color + dev: false + + /ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + dev: false + + /ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + dependencies: + color-convert: 2.0.1 + dev: false + + /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: false + + /arg@4.1.3: + resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} + dev: false + + /balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + dev: false + + /binary-extensions@2.2.0: + resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} + engines: {node: '>=8'} + 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 + + /buffer-more-ints@1.0.0: + resolution: {integrity: sha512-EMetuGFz5SLsT0QTnXzINh4Ksr+oo4i+UGTXEshiGCQWnsgSs7ZhJ8fzlwQ+OzEMs0MpDAMr1hxnblp5a4vcHg==} + dev: false + + /busboy@1.6.0: + resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} + engines: {node: '>=10.16.0'} + dependencies: + streamsearch: 1.1.0 + dev: false + + /chokidar@3.5.3: + resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} + engines: {node: '>= 8.10.0'} + dependencies: + anymatch: 3.1.3 + braces: 3.0.2 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.2 + 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 + 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 + + /core-util-is@1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + dev: false + + /create-require@1.1.1: + resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} + dev: false + + /data-uri-to-buffer@4.0.1: + resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} + engines: {node: '>= 12'} + dev: false + + /debug@3.2.7(supports-color@5.5.0): + resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.2 + supports-color: 5.5.0 + 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 + dev: false + + /diff@4.0.2: + resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} + engines: {node: '>=0.3.1'} + dev: false + + /dotenv@16.3.1: + resolution: {integrity: sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==} + engines: {node: '>=12'} + dev: false + + /emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + dev: false + + /esbuild@0.19.2: + resolution: {integrity: sha512-G6hPax8UbFakEj3hWO0Vs52LQ8k3lnBhxZWomUJDxfz3rZTLqF5k/FCzuNdLx2RbpBiQQF9H9onlDDH1lZsnjg==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/android-arm': 0.19.2 + '@esbuild/android-arm64': 0.19.2 + '@esbuild/android-x64': 0.19.2 + '@esbuild/darwin-arm64': 0.19.2 + '@esbuild/darwin-x64': 0.19.2 + '@esbuild/freebsd-arm64': 0.19.2 + '@esbuild/freebsd-x64': 0.19.2 + '@esbuild/linux-arm': 0.19.2 + '@esbuild/linux-arm64': 0.19.2 + '@esbuild/linux-ia32': 0.19.2 + '@esbuild/linux-loong64': 0.19.2 + '@esbuild/linux-mips64el': 0.19.2 + '@esbuild/linux-ppc64': 0.19.2 + '@esbuild/linux-riscv64': 0.19.2 + '@esbuild/linux-s390x': 0.19.2 + '@esbuild/linux-x64': 0.19.2 + '@esbuild/netbsd-x64': 0.19.2 + '@esbuild/openbsd-x64': 0.19.2 + '@esbuild/sunos-x64': 0.19.2 + '@esbuild/win32-arm64': 0.19.2 + '@esbuild/win32-ia32': 0.19.2 + '@esbuild/win32-x64': 0.19.2 + dev: false + + /escalade@3.1.1: + resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} + engines: {node: '>=6'} + dev: false + + /fetch-blob@3.2.0: + resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==} + engines: {node: ^12.20 || >= 14.13} + dependencies: + node-domexception: 1.0.0 + web-streams-polyfill: 3.2.1 + 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 + + /formdata-polyfill@4.0.10: + resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==} + engines: {node: '>=12.20.0'} + dependencies: + fetch-blob: 3.2.0 + dev: false + + /fsevents@2.3.2: + resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + dev: false + + /glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + dependencies: + is-glob: 4.0.3 + dev: false + + /has-flag@3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + dev: false + + /ignore-by-default@1.0.1: + resolution: {integrity: sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==} + dev: false + + /inherits@2.0.3: + resolution: {integrity: sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==} + dev: false + + /is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + dependencies: + binary-extensions: 2.2.0 + dev: false + + /is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + dev: false + + /is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + 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-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + dev: false + + /isarray@0.0.1: + resolution: {integrity: sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==} + dev: false + + /json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + dev: false + + /lodash.camelcase@4.3.0: + resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} + dev: false + + /long@4.0.0: + resolution: {integrity: sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==} + dev: false + + /long@5.2.3: + resolution: {integrity: sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==} + dev: false + + /lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + dependencies: + yallist: 4.0.0 + dev: false + + /make-error@1.3.6: + resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + dev: false + + /minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + dependencies: + brace-expansion: 1.1.11 + dev: false + + /minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + dev: false + + /ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + dev: false + + /native-fetch@4.0.2(undici@5.23.0): + resolution: {integrity: sha512-4QcVlKFtv2EYVS5MBgsGX5+NWKtbDbIECdUXDBGDMAZXq3Jkv9zf+y8iS7Ub8fEdga3GpYeazp9gauNqXHJOCg==} + peerDependencies: + undici: '*' + dependencies: + undici: 5.23.0 + dev: false + + /node-domexception@1.0.0: + resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} + engines: {node: '>=10.5.0'} + dev: false + + /node-fetch@3.3.2: + resolution: {integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + data-uri-to-buffer: 4.0.1 + fetch-blob: 3.2.0 + formdata-polyfill: 4.0.10 + dev: false + + /nodemon@3.0.1: + resolution: {integrity: sha512-g9AZ7HmkhQkqXkRc20w+ZfQ73cHLbE8hnPbtaFbFtCumZsjyMhKk9LajQ07U5Ux28lvFjZ5X7HvWR1xzU8jHVw==} + engines: {node: '>=10'} + hasBin: true + dependencies: + chokidar: 3.5.3 + debug: 3.2.7(supports-color@5.5.0) + ignore-by-default: 1.0.1 + minimatch: 3.1.2 + pstree.remy: 1.1.8 + semver: 7.5.4 + simple-update-notifier: 2.0.0 + supports-color: 5.5.0 + touch: 3.1.0 + undefsafe: 2.0.5 + dev: false + + /nopt@1.0.10: + resolution: {integrity: sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==} + hasBin: true + dependencies: + abbrev: 1.1.1 + dev: false + + /normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + dev: false + + /path@0.12.7: + resolution: {integrity: sha512-aXXC6s+1w7otVF9UletFkFcDsJeO7lSZBPUQhtb5O0xJe8LtYhj/GxldoL09bBj9+ZmE2hNoHqQSFMN5fikh4Q==} + dependencies: + process: 0.11.10 + util: 0.10.4 + dev: false + + /picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + dev: false /prisma@5.1.0: resolution: {integrity: sha512-wkXvh+6wxk03G8qwpZMOed4Y3j+EQ+bMTlvbDZHeal6k1E8QuGKzRO7DRXlE1NV0WNgOAas8kwZqcLETQ2+BiQ==} @@ -26,10 +821,253 @@ packages: requiresBuild: true dependencies: '@prisma/engines': 5.1.0 - dev: true + + /process@0.11.10: + resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} + engines: {node: '>= 0.6.0'} + dev: false + + /protobufjs@7.2.4: + resolution: {integrity: sha512-AT+RJgD2sH8phPmCf7OUZR8xGdcJRga4+1cOaXJ64hvcSkVhNcRHOwIxUatPH15+nj59WAGTDv3LSGZPEQbJaQ==} + engines: {node: '>=12.0.0'} + requiresBuild: true + dependencies: + '@protobufjs/aspromise': 1.1.2 + '@protobufjs/base64': 1.1.2 + '@protobufjs/codegen': 2.0.4 + '@protobufjs/eventemitter': 1.1.0 + '@protobufjs/fetch': 1.1.0 + '@protobufjs/float': 1.0.2 + '@protobufjs/inquire': 1.1.0 + '@protobufjs/path': 1.1.2 + '@protobufjs/pool': 1.1.0 + '@protobufjs/utf8': 1.1.0 + '@types/node': 20.5.1 + long: 5.2.3 + dev: false + + /pstree.remy@1.1.8: + resolution: {integrity: sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==} + dev: false + + /querystringify@2.2.0: + resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} + dev: false + + /readable-stream@1.1.14: + resolution: {integrity: sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==} + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.3 + isarray: 0.0.1 + string_decoder: 0.10.31 + dev: false + + /readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + dependencies: + picomatch: 2.3.1 + dev: false + + /require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + dev: false + + /requires-port@1.0.0: + resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} + dev: false + + /safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + dev: false + + /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 + dev: false + + /simple-update-notifier@2.0.0: + resolution: {integrity: sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==} + engines: {node: '>=10'} + dependencies: + semver: 7.5.4 + dev: false + + /streamsearch@1.1.0: + resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} + engines: {node: '>=10.0.0'} + dev: false + + /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 + dev: false + + /string_decoder@0.10.31: + resolution: {integrity: sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==} + dev: false + + /strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + dependencies: + ansi-regex: 5.0.1 + dev: false + + /strip-bom@3.0.0: + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} + dev: false + + /supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + dependencies: + has-flag: 3.0.0 + 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 + + /touch@3.1.0: + resolution: {integrity: sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==} + hasBin: true + dependencies: + nopt: 1.0.10 + dev: false + + /ts-node@10.9.1(@types/node@20.5.1)(typescript@5.1.6): + 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': 20.5.1 + 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.1.6 + v8-compile-cache-lib: 3.0.1 + yn: 3.1.1 + dev: false + + /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: false + + /tslib@2.6.2: + resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} + dev: false /typescript@5.1.6: resolution: {integrity: sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==} engines: {node: '>=14.17'} hasBin: true - dev: true + + /undefsafe@2.0.5: + resolution: {integrity: sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==} + dev: false + + /undici@5.23.0: + resolution: {integrity: sha512-1D7w+fvRsqlQ9GscLBwcAJinqcZGHUKjbOmXdlE/v8BvEGXjeWAax+341q44EuTcHXXnfyKNbKRq4Lg7OzhMmg==} + engines: {node: '>=14.0'} + dependencies: + busboy: 1.6.0 + dev: false + + /url-parse@1.5.10: + resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} + dependencies: + querystringify: 2.2.0 + requires-port: 1.0.0 + dev: false + + /util@0.10.4: + resolution: {integrity: sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==} + dependencies: + inherits: 2.0.3 + dev: false + + /v8-compile-cache-lib@3.0.1: + resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} + dev: false + + /web-streams-polyfill@3.2.1: + resolution: {integrity: sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==} + engines: {node: '>= 8'} + dev: false + + /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 + dev: false + + /y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + dev: false + + /yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + dev: false + + /yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + 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 + dev: false + + /yn@3.1.1: + resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} + engines: {node: '>=6'} + dev: false diff --git a/services/notification/prisma/migrations/20230819164921_init/migration.sql b/services/notification/prisma/migrations/20230819164921_init/migration.sql new file mode 100644 index 00000000..2c63ed12 --- /dev/null +++ b/services/notification/prisma/migrations/20230819164921_init/migration.sql @@ -0,0 +1,12 @@ +-- CreateEnum +CREATE TYPE "MessageType" AS ENUM ('USER_REQUEST', 'OUTPUT'); + +-- CreateTable +CREATE TABLE "Notification" ( + "id" TEXT NOT NULL, + "title" TEXT NOT NULL, + "message" TEXT NOT NULL, + "message_type" "MessageType" NOT NULL, + + CONSTRAINT "Notification_pkey" PRIMARY KEY ("id") +); diff --git a/services/notification/prisma/migrations/migration_lock.toml b/services/notification/prisma/migrations/migration_lock.toml new file mode 100644 index 00000000..fbffa92c --- /dev/null +++ b/services/notification/prisma/migrations/migration_lock.toml @@ -0,0 +1,3 @@ +# Please do not edit this file manually +# It should be added in your version-control system (i.e. Git) +provider = "postgresql" \ No newline at end of file diff --git a/services/notification/prisma/schema.prisma b/services/notification/prisma/schema.prisma index 5d9df6ce..c6a0806b 100644 --- a/services/notification/prisma/schema.prisma +++ b/services/notification/prisma/schema.prisma @@ -14,5 +14,10 @@ model Notification { id String @id @default(cuid()) title String message String - message_type String -} \ No newline at end of file + message_type MessageType +} + +enum MessageType { + USER_REQUEST + OUTPUT +} diff --git a/services/notification/src/handler/create.ts b/services/notification/src/handler/create.ts new file mode 100644 index 00000000..75c088c6 --- /dev/null +++ b/services/notification/src/handler/create.ts @@ -0,0 +1,27 @@ +import { NotificationCreateInput, Notification } from "@notifications/types/notification"; +import { log } from "@notifications/lib/log"; +import { Data } from "@notifications/types"; +import prisma from "@notifications/lib/prisma"; +import { MessageType } from "@prisma/client"; + +export const CreateNotification = async ( + { request }: Data, + callback: (err: any, response: Notification | null) => void +) => { + try { + const { message, message_type, title } = request; + + const notifications = await prisma.notification.create({ + data: { + title, + message, + message_type: message_type as unknown as MessageType + }, + }) as unknown as Notification; + + callback(null, notifications); + } catch (error) { + log.error(error); + callback(error, null); + } +}; \ No newline at end of file diff --git a/services/notification/src/handler/delete.ts b/services/notification/src/handler/delete.ts new file mode 100644 index 00000000..123ad128 --- /dev/null +++ b/services/notification/src/handler/delete.ts @@ -0,0 +1,20 @@ +import { NotificationId } from "@notifications/types/notification"; +import { log } from "@notifications/lib/log"; +import { Data } from "@notifications/types"; +import prisma from "@notifications/lib/prisma"; + +export const DeleteNotification = async ( + { request }: Data, + callback: (err: any, response: null) => void +) => { + try { + const { id } = request; + + await prisma.notification.delete({ where : { id } }); + + callback(null, null); + } catch (error) { + log.error(error); + callback(error, null); + } +}; \ No newline at end of file diff --git a/services/notification/src/handler/get.ts b/services/notification/src/handler/get.ts new file mode 100644 index 00000000..7b9ed42f --- /dev/null +++ b/services/notification/src/handler/get.ts @@ -0,0 +1,20 @@ +import { NotificationId, Notification } from "@notifications/types/notification"; +import { log } from "@notifications/lib/log"; +import { Data } from "@notifications/types"; +import prisma from "@notifications/lib/prisma"; + +export const GetNotification = async ( + { request }: Data, + callback: (err: any, response: Notification | null) => void +) => { + try { + const { id } = request; + + const notification = await prisma.notification.findFirstOrThrow({ where: { id } }) as unknown as Notification; + + callback(null, notification); + } catch (error) { + log.error(error); + callback(error, null); + } +}; \ No newline at end of file diff --git a/services/notification/src/handler/index.ts b/services/notification/src/handler/index.ts new file mode 100644 index 00000000..7c4672a8 --- /dev/null +++ b/services/notification/src/handler/index.ts @@ -0,0 +1,13 @@ +import { CreateNotification } from "@notifications/handler/create"; +import { GetNotification } from "@notifications/handler/get"; +import { UpdateNotification } from "@notifications/handler/update"; +import { DeleteNotification } from "@notifications/handler/delete"; +import { GetNotifications } from "@notifications/handler/listByType"; + +export default { + CreateNotification, + GetNotification, + UpdateNotification, + DeleteNotification, + GetNotifications, +}; diff --git a/services/notification/src/handler/listByType.ts b/services/notification/src/handler/listByType.ts new file mode 100644 index 00000000..d8e7cf03 --- /dev/null +++ b/services/notification/src/handler/listByType.ts @@ -0,0 +1,24 @@ +import { MessageType, MessageTypeInput, NotificationList } from "@notifications/types/notification"; +import { log } from "@notifications/lib/log"; +import { Data } from "@notifications/types"; +import prisma from "@notifications/lib/prisma"; + +export const GetNotifications = async ( + { request }: Data, + callback: (err: any, response: NotificationList | null) => void +) => { + try { + const { message_type } = request; + + log.debug(message_type); + + const notifications = { + notifications: await prisma.notification.findMany({ where: { message_type: message_type as MessageType } }) + } as unknown as NotificationList; + + callback(null, notifications); + } catch (error) { + log.error(error); + callback(error, null); + } +}; \ No newline at end of file diff --git a/services/notification/src/handler/update.ts b/services/notification/src/handler/update.ts new file mode 100644 index 00000000..eaff4212 --- /dev/null +++ b/services/notification/src/handler/update.ts @@ -0,0 +1,28 @@ +import { Notification } from "@notifications/types/notification"; +import { log } from "@notifications/lib/log"; +import { Data } from "@notifications/types"; +import prisma from "@notifications/lib/prisma"; +import { MessageType } from "@prisma/client"; + +export const UpdateNotification = async ( + { request }: Data, + callback: (err: any, response: Notification | null) => void +) => { + try { + const { id, title, message, message_type } = request; + + const notification = await prisma.notification.update({ + where: { id }, + data: { + title, + message, + message_type: message_type as unknown as MessageType + }, + }) as unknown as Notification; + + callback(null, notification); + } catch (error) { + log.error(error); + callback(error, null); + } +}; \ No newline at end of file diff --git a/services/notification/src/lib/amqp.ts b/services/notification/src/lib/amqp.ts new file mode 100644 index 00000000..d3f3ea7c --- /dev/null +++ b/services/notification/src/lib/amqp.ts @@ -0,0 +1,85 @@ +import amqp from "amqplib"; +import plunk from "@notifications/lib/plunk"; +import { msg } from "@notifications/middleware/log"; +import { log } from "@notifications/lib/log"; +import { CreateNotification } from "@notifications/handler/create"; +import { NotificationCreateInput, MessageType } from "@notifications/types/notification"; +import { Data } from "@notifications/types"; + +const DEFAULT_QUEUE = "log"; +const DEFAULT_SUB_QUEUE = "notification"; + +async function connectQueue(queue = DEFAULT_QUEUE) { + try { + const connection = await amqp.connect(process.env.AMQP_URL || ""); + const channel = await connection.createChannel(); + await channel.assertExchange(queue, "fanout", { durable: true }); + return channel; + } catch (error) { + return error as Error; + } +} + +const toLog = (message: any) => { + const { request, path } = message; + return { event_message: path, metadata: { request } }; +}; + +export const publish = async (message: any, queue = DEFAULT_QUEUE) => { + const channel = await connectQueue(queue); + if (channel instanceof Error) + return console.log("Error to connect to queue: ", channel); + channel.sendToQueue(queue, Buffer.from(JSON.stringify(toLog(message)))); + log.debug( + msg("AMQP", `${queue} (queue)`, new Date(), new Date()), + JSON.stringify(message) + ); +}; + +const toNotification = (message: any) => { + const { email, title, messageTexte } = JSON.parse(message.content.toString()); + return { email: email, title: title, messageTexte: messageTexte, messageType: MessageType.OUTPUT }; +} + +export const subscribe = async (queue = DEFAULT_SUB_QUEUE) => { + log.debug("Subscribe") + const channel = await connectQueue(queue); + if (channel instanceof Error) + return console.log("Error to connect to queue: ", channel); + channel.consume( + queue, + async function(message) { + const { email, title, messageTexte, messageType } = toNotification(message); + const notification = { + request: + { + title: title, + message: messageTexte, + message_type: messageType as unknown as MessageType + } + } as Data + + CreateNotification(notification, () => {}); + + const { success } = await plunk.emails.send({ + to: email, + body: messageTexte, + subject: title + }); + + if(success) + log.debug( + msg("AMQP", `${queue} (queue)`, new Date(), new Date()), + "Email send" + ); + else + log.debug( + msg("AMQP", `${queue} (queue)`, new Date(), new Date()), + "Email send" + ); + }, + { + noAck: true + } + ) +} diff --git a/services/notification/src/lib/log.ts b/services/notification/src/lib/log.ts new file mode 100644 index 00000000..2404af54 --- /dev/null +++ b/services/notification/src/lib/log.ts @@ -0,0 +1,74 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ +/* eslint-disable no-console */ + +function getStackTrace() { + let stack; + + try { + throw new Error(""); + } catch (error) { + stack = (error as Error).stack || ""; + } + + stack = stack.split("\n").map((line) => line.trim()); + return stack.splice(stack[0] === "Error" ? 2 : 1); +} + +const getInitiator = () => { + // _getInitiatorLine, _ObjectInfoLine, caller + const [, , caller] = getStackTrace(); + const file = caller.split("/").at(-1) || ""; + return file.replace(")", ""); +}; + +const warn = (...args: any[]) => { + console.group( + `\x1b[33m${new Date().toISOString()} - WARN - ${getInitiator()}\x1b[0m` + ); + console.warn(...args); + console.groupEnd(); +}; +const error = (...args: any[]) => { + console.group( + `\x1b[31m${new Date().toISOString()} - ERROR - ${getInitiator()}\x1b[0m` + ); + console.error(...args); + console.groupEnd(); +}; +const info = (...args: any[]) => { + console.group( + `\x1b[34m${new Date().toISOString()} - INFO - ${getInitiator()}\x1b[0m` + ); + console.log(...args); + console.groupEnd(); +}; +const debug = (...args: any[]) => { + console.log(...args); +}; + +/** + * @description a simple interface logger for logging to the console and into a log drain in the future + * @example + * log.warn('this is a warning'); + * log.error('this is an error'); + * log.info('this is an info'); + * @exports log + */ +export const log = { + warn, + error, + info, + debug, +}; + +export const utils = { + bold: (text: string) => `\x1b[1m${text}\x1b[0m`, + red: (text: string) => `\x1b[31m${text}\x1b[0m`, + green: (text: string) => `\x1b[32m${text}\x1b[0m`, + yellow: (text: string) => `\x1b[33m${text}\x1b[0m`, + blue: (text: string) => `\x1b[34m${text}\x1b[0m`, + magenta: (text: string) => `\x1b[35m${text}\x1b[0m`, + cyan: (text: string) => `\x1b[36m${text}\x1b[0m`, + white: (text: string) => `\x1b[37m${text}\x1b[0m`, + gray: (text: string) => `\x1b[90m${text}\x1b[0m`, +}; diff --git a/services/notification/src/lib/plunk.ts b/services/notification/src/lib/plunk.ts new file mode 100644 index 00000000..85ff1929 --- /dev/null +++ b/services/notification/src/lib/plunk.ts @@ -0,0 +1,6 @@ +import Plunk from "@plunk/node"; +const plunkKey = process.env.PLUNK_PUBLIC_KEY; +if (!plunkKey) throw new Error("Plunk API key not found"); + +const plunk = new Plunk(plunkKey); +export default plunk; \ No newline at end of file diff --git a/services/notification/src/lib/prisma.ts b/services/notification/src/lib/prisma.ts new file mode 100644 index 00000000..4d495ef0 --- /dev/null +++ b/services/notification/src/lib/prisma.ts @@ -0,0 +1,29 @@ +import { Prisma, PrismaClient } from "@prisma/client"; + +let prisma: PrismaClient; +type GlobalWithPrisma = typeof globalThis & { + prisma: PrismaClient; +}; + +const OPTIONS: Prisma.PrismaClientOptions = { + log: + process.env.NEXT_PUBLIC_APP_ENV !== "production" + ? ["info", "warn"] + : undefined, +}; + +if (process.env.NODE_ENV === "production") { + prisma = new PrismaClient(OPTIONS); +} else { + // Ensure the prisma instance is re-used during hot-reloading + // Otherwise, a new client will be created on every reload + if (!("prisma" in global)) { + (global as GlobalWithPrisma).prisma = new PrismaClient(OPTIONS); + } + + prisma = (global as GlobalWithPrisma).prisma; +} + +export default prisma; + +export { prisma }; diff --git a/services/notification/src/lib/proxy.ts b/services/notification/src/lib/proxy.ts new file mode 100644 index 00000000..b05d24a6 --- /dev/null +++ b/services/notification/src/lib/proxy.ts @@ -0,0 +1,132 @@ +import { Server, status } from "@grpc/grpc-js"; + +const getType = (method: { + requestStream: boolean; + responseStream: boolean; +}) => { + if (method.requestStream === false && method.responseStream === false) { + return "unary"; + } + return "unknown"; +}; + + +const lookupServiceMetadata = (service: { [x: string]: any }) => { + const serviceKeys = Object.keys(service); + const intersectingMethods = serviceKeys.reduce((acc, k) => { + const method = service[k]; + if (!method) { + throw new Error(`cannot find method ${k} on service`); + } + const components = method.path.split("/"); + acc[k] = { + name: components[1], + method: components[2], + type: getType(method), + path: method.path, + responseType: method.responseType, + requestType: method.requestType, + }; + return acc; + }, {} as any); + + return (key: string) => intersectingMethods[key]; +}; + +export const handler = { + get( + target: { + [x: string]: any; + intercept: () => any; + addService: (arg0: any, arg1: {}) => any; + }, + propKey: string + ) { + if (propKey !== "addService") { + return target[propKey]; + } + return (service: any, implementation: { [x: string]: any }) => { + const newImplementation = {} as any; + const lookup = lookupServiceMetadata(service); + for (const k in implementation) { + const name = k; + const fn = implementation[k]; + newImplementation[name] = (call: any, callback: any) => { + const ctx = { + call, + name, + service: lookup(name), + status: { + code: status.UNKNOWN, + details: "", + }, + }; + const newCallback = (callback: (arg0: any) => void) => { + return (...args: any[]) => { + ctx.status = { + code: status.OK, + details: "", + }; + const err = args[0]; + if (err) { + ctx.status = { + code: status.UNKNOWN, + details: err, + }; + } + // @ts-ignore + callback(...args); + }; + }; + + const interceptors = target.intercept(); + const first = interceptors.next(); + if (!first.value) { + // if we don't have any interceptors + return new Promise((resolve) => { + return resolve(fn(call, newCallback(callback))); + }); + } + first.value(ctx, function next() { + return new Promise((resolve) => { + const i = interceptors.next(); + if (i.done) { + return resolve(fn(call, newCallback(callback))); + } + return resolve(i.value(ctx, next)); + }); + }); + }; + } + return target.addService(service, newImplementation); + }; + }, +}; + +export const createServerProxy = ( + server: Server +): Server & { + intercept: Generator; + interceptors: any[]; + use: (fn: any) => void; +} => { + // @ts-ignore + server.interceptors = []; + // @ts-ignore + server.use = (fn: any) => { + // @ts-ignore + server.interceptors.push(fn); + }; + // @ts-ignore + server.intercept = function* intercept() { + let i = 0; + // @ts-ignore + while (i < server.interceptors.length) { + // @ts-ignore + yield server.interceptors[i]; + i++; + } + }; + // @ts-ignore + return new Proxy(server, handler); +}; \ No newline at end of file diff --git a/services/notification/src/middleware/log.ts b/services/notification/src/middleware/log.ts new file mode 100644 index 00000000..be264f6b --- /dev/null +++ b/services/notification/src/middleware/log.ts @@ -0,0 +1,42 @@ +import { publish } from "@notifications/lib/amqp"; +import { utils } from "@notifications/lib/log"; +import { log } from "@notifications/lib/log"; + +type Context = { + call: { + request: Map; + }; + service: { + path: string; + }; +}; + +const parseContext = (ctx: Context) => { + const { + call: { request }, + service: { path }, + } = ctx; + return { request, path }; +}; + +export const msg = ( + type: "GRPC" | "AMQP", + path: string | undefined, + requestAt: Date, + responseAt: Date +) => + `${utils.magenta(requestAt.toISOString())} | ${utils[ + type === "GRPC" ? "cyan" : "red" + ](type)}${path ? ` | ${utils.yellow(path)}` : ""} | ${utils.green( + responseAt.getTime() - requestAt.getTime() + "ms" + )} |`; + +export const logGRPC = async (ctx: Context, next: () => Promise) => { + const requestAt = new Date(); + await next(); + const responseAt = new Date(); + let { request, path } = parseContext(ctx); + path = path?.split(".").at(-1) || ""; + publish({ request, path }, "log"); + log.debug(msg("GRPC", path, requestAt, responseAt), JSON.stringify(request)); +}; diff --git a/services/notification/src/resources/grpc-credentials.ts b/services/notification/src/resources/grpc-credentials.ts new file mode 100644 index 00000000..75a2b5d5 --- /dev/null +++ b/services/notification/src/resources/grpc-credentials.ts @@ -0,0 +1,5 @@ +import { credentials, ServerCredentials } from "@grpc/grpc-js"; + +export const insecure = credentials.createInsecure(); + +export const serverInsecure = ServerCredentials.createInsecure(); diff --git a/services/notification/src/resources/protoloader-options.ts b/services/notification/src/resources/protoloader-options.ts new file mode 100644 index 00000000..5022d96d --- /dev/null +++ b/services/notification/src/resources/protoloader-options.ts @@ -0,0 +1,7 @@ +export const options = { + keepCase: true, + longs: String, + enums: String, + defaults: true, + oneofs: true, +}; diff --git a/services/notification/src/server.ts b/services/notification/src/server.ts new file mode 100644 index 00000000..71c9e75a --- /dev/null +++ b/services/notification/src/server.ts @@ -0,0 +1,41 @@ +import "dotenv/config"; +import { resolve as resolvePath } from "path"; + +import { loadSync } from "@grpc/proto-loader"; +import { loadPackageDefinition, Server } from "@grpc/grpc-js"; + +import { log, utils } from "@notifications/lib/log"; +import { options } from "@notifications/resources/protoloader-options"; +import { serverInsecure } from "@notifications/resources/grpc-credentials"; + +import notificationHandler from "@notifications/handler"; +import { createServerProxy } from "@notifications/lib/proxy"; +import { logGRPC } from "@notifications/middleware/log"; +import { subscribe } from "@notifications/lib/amqp"; + +const PORT = process.env.PORT || 50022; +const ADDRESS = `0.0.0.0:${PORT}`; +const PROTO_PATH = resolvePath(__dirname + "/../../proto/notification.proto"); + +const packageDefinition = loadSync(PROTO_PATH, options); +const grpc = loadPackageDefinition(packageDefinition) as any; +const { + NotificationService: { service: ns }, +} = grpc.com.goodfood.notification; +subscribe(); + +const server = createServerProxy(new Server()); +server.addService(ns, notificationHandler); +server.use(logGRPC); + +server.bindAsync(ADDRESS, serverInsecure, () => { + server.start(); + const message = `---- ${utils.green("good")}${utils.yellow( + "food" + )} Notification Service ----\nstarted on: ${utils.bold(ADDRESS)} ${utils.green( + "✓" + )}\n`; + log.debug(message); +}); + +export default server; diff --git a/services/notification/src/types/index.d.ts b/services/notification/src/types/index.d.ts new file mode 100644 index 00000000..edf2bebf --- /dev/null +++ b/services/notification/src/types/index.d.ts @@ -0,0 +1,3 @@ +export type Data = { + request: T; +}; diff --git a/services/notification/src/types/notification.d.ts b/services/notification/src/types/notification.d.ts new file mode 100644 index 00000000..d413aff0 --- /dev/null +++ b/services/notification/src/types/notification.d.ts @@ -0,0 +1,30 @@ +export type Notification = { + id: string; + + title: string; + message: string; + message_type: MessageType; +} + +export type NotificationCreateInput = { + title: string; + message: string; + message_type: MessageType; +} + +export type NotificationId = { + id: string; +} + +export type NotificationList = { + notifications: Notification[]; +} + +export type MessageTypeInput = { + message_type: string; +} + +export const enum MessageType { + USER_REQUEST = "USER_REQUEST", + OUTPUT = "OUTPUT" +} diff --git a/services/notification/tsconfig.json b/services/notification/tsconfig.json index 4eb46577..bf927d60 100644 --- a/services/notification/tsconfig.json +++ b/services/notification/tsconfig.json @@ -7,7 +7,7 @@ "esModuleInterop": true, "baseUrl": ".", "paths": { - "@promotions/*": ["src/*"] + "@notifications/*": ["src/*"] } }, "include": ["src/**/*.ts"], diff --git a/services/proto/notification.proto b/services/proto/notification.proto new file mode 100644 index 00000000..2406bea9 --- /dev/null +++ b/services/proto/notification.proto @@ -0,0 +1,44 @@ +syntax = "proto3"; +import "google/protobuf/empty.proto"; + +package com.goodfood.notification; + +enum MessageType { + USER_REQUEST = 1; + OUTPUT = 2; +} + +message MessageTypeInput { + MessageType message_type = 1; +} + +message Notification { + string id = 1; + + string title = 2; + string message = 3; + + MessageType message_type = 4; +} + +message NotificationCreateInput { + string title = 2; + string message = 3; + MessageType message_type = 4; +} + +message NotificationId { + string id = 1; +} + +message NotificationList { + repeated Notification notifications = 1; +} + +service NotificationService { + rpc CreateNotification (NotificationCreateInput) returns (Notification) {} + rpc GetNotification (NotificationId) returns (Notification) {} + rpc UpdateNotification (Notification) returns (Notification) {} + rpc DeleteNotification (NotificationId) returns (google.protobuf.Empty) {} + rpc GetNotifications (MessageTypeInput) returns (NotificationList) {} +} From 085b3425564c7f4b904ea763be549bb5d5d194e8 Mon Sep 17 00:00:00 2001 From: anatole Date: Sat, 15 Jul 2023 01:12:01 +0200 Subject: [PATCH 390/883] feat(gateway): create the base of the gateway --- services/gateway/.env.example | 1 + services/gateway/.gitignore | 5 + services/gateway/.gitinclude | 0 services/gateway/.nvmrc | 1 + services/gateway/Dockerfile | 38 + services/gateway/README.md | 49 + services/gateway/package-lock.json | 8513 ++++++++++++++++++++++++++++ services/gateway/package.json | 54 + services/gateway/proto | 1 + services/gateway/src/index.ts | 17 + services/gateway/tsconfig.json | 18 + services/gateway/vitest.config.ts | 10 + 12 files changed, 8707 insertions(+) create mode 100644 services/gateway/.env.example create mode 100644 services/gateway/.gitignore delete mode 100644 services/gateway/.gitinclude create mode 100644 services/gateway/.nvmrc create mode 100644 services/gateway/Dockerfile create mode 100644 services/gateway/README.md create mode 100644 services/gateway/package-lock.json create mode 100644 services/gateway/package.json create mode 120000 services/gateway/proto create mode 100644 services/gateway/src/index.ts create mode 100644 services/gateway/tsconfig.json create mode 100644 services/gateway/vitest.config.ts diff --git a/services/gateway/.env.example b/services/gateway/.env.example new file mode 100644 index 00000000..125a90fe --- /dev/null +++ b/services/gateway/.env.example @@ -0,0 +1 @@ +PORT=50000 \ No newline at end of file diff --git a/services/gateway/.gitignore b/services/gateway/.gitignore new file mode 100644 index 00000000..583204b4 --- /dev/null +++ b/services/gateway/.gitignore @@ -0,0 +1,5 @@ +node_modules/ +dist/ +bin/ +*.env* +!*.env.example diff --git a/services/gateway/.gitinclude b/services/gateway/.gitinclude deleted file mode 100644 index e69de29b..00000000 diff --git a/services/gateway/.nvmrc b/services/gateway/.nvmrc new file mode 100644 index 00000000..9dfef472 --- /dev/null +++ b/services/gateway/.nvmrc @@ -0,0 +1 @@ +v18.12.0 diff --git a/services/gateway/Dockerfile b/services/gateway/Dockerfile new file mode 100644 index 00000000..6e37d753 --- /dev/null +++ b/services/gateway/Dockerfile @@ -0,0 +1,38 @@ +FROM node:18-alpine3.17 as builder + +# Set working directory +WORKDIR /app + +# Copy the application code +COPY ./order/ . + +# Install dependencies +RUN npm install + +# Copy the proto files +COPY ./proto ./proto/ + +# Generate Prisma client +RUN npx prisma generate + +# Build the application +RUN npm run build + + +# Create a new image with the application +FROM node:18-alpine3.17 as runner + +# Set working directory +WORKDIR /app + +# Copy the application package +COPY --from=builder /app/dist . +COPY --from=builder /app/prisma/ . +COPY --from=builder /app/proto/ /proto/ +COPY --from=builder /app/node_modules/.prisma /.prisma + +# Expose the gRPC port +EXPOSE 50007 + +# Start the server +CMD [ "node", "index.js"] diff --git a/services/gateway/README.md b/services/gateway/README.md new file mode 100644 index 00000000..d39465e4 --- /dev/null +++ b/services/gateway/README.md @@ -0,0 +1,49 @@ +# Gateway Microservice + +| Informations | +|------------------------------------| +| **Port:** 50000 | +| **Developer:** @Anatole-Godard | +| **Status:** In progress | +| **Last update:** 2023-07-15 | +| **Language:** NodeJS | +| **Dependencies:** TypeScript, gRPC | +| **Models:** | + +## Http Routes + +The gateway provides the following routes: + +[//]: # (TODO: Add routes) + +## Requirements + +To run this microservice, you will need to have the following installed on your system: + +- NodeJS (v18.12.0 or higher) (dev. with v18.12.0) + +You can use the following tools to help you with the setup: + +- You can use nvm to set your Node version using: + - `nvm use`. + +## Getting started + +### 1. Clone the repository and install dependencies + +1. Clone the `goodfood` repository to your local machine. +2. Navigate to the service directory (`services/gateway`) in your terminal. +3. Run `npm install` to install the necessary dependencies. +4. Create a `.env` file at the root of the project directory and add the environment variables values ( + see `.env.example`). +5. Run `npm run start` to start the microservice. + +You can now access the microservice at `http://localhost:50000`. + +NB: If you want to run the microservice in development mode, you can run `npm run dev` instead. + +## Testing + +### Requests examples + +[//]: # (TODO: Add requests examples) \ No newline at end of file diff --git a/services/gateway/package-lock.json b/services/gateway/package-lock.json new file mode 100644 index 00000000..54f22426 --- /dev/null +++ b/services/gateway/package-lock.json @@ -0,0 +1,8513 @@ +{ + "name": "@goodfood/gateway", + "version": "1.0.0", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "@goodfood/gateway", + "version": "1.0.0", + "license": "ISC", + "dependencies": { + "@grpc/grpc-js": "1.8.14", + "@grpc/proto-loader": "0.7.6", + "@types/express": "^4.17.17", + "axios": "^1.4.0", + "body-parser": "^1.20.2", + "dotenv": "^16.0.3", + "express": "^4.18.2", + "grpc-server-reflection": "^0.1.5", + "protobufjs": "^7.2.4" + }, + "bin": { + "gateway": "dist/index.js" + }, + "devDependencies": { + "@types/amqplib": "^0.10.1", + "@types/node": "^18.15.9", + "@vitest/coverage-c8": "^0.33.0", + "esbuild": "^0.17.18", + "grpc-tools": "^1.12.4", + "nodemon": "^3.0.1", + "pkg": "^5.8.1", + "ts-node": "10.9.1", + "tsconfig-paths": "^4.2.0", + "typescript": "5.0.2", + "vite-tsconfig-paths": "^4.2.0", + "vitest": "^0.33.0", + "vitest-mock-extended": "^1.1.4" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", + "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/generator": { + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.2.tgz", + "integrity": "sha512-W1lG5vUwFvfMd8HVXqdfbuG7RuaSrTCCD8cl8fP8wOivdbtbIg2Db3IWUcgvfxKbbn6ZBGYRW/Zk1MIwK49mgw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.18.2", + "@jridgewell/gen-mapping": "^0.3.0", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", + "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz", + "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.18.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.4.tgz", + "integrity": "sha512-FDge0dFazETFcxGw/EXzOkN8uJp0PC7Qbm+Pe9T+av2zlBpOgunFHkQPPn+eRuClU73JF+98D531UgayY89tow==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/types": { + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.19.0.tgz", + "integrity": "sha512-YuGopBq3ke25BVSiS6fgF49Ul9gH1x70Bcr6bqRLjWCkcX8Hre1/5+z+IiWOIerRMSSEfGZVB9z9kyq7wVs9YA==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.18.10", + "@babel/helper-validator-identifier": "^7.18.6", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true + }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.19.tgz", + "integrity": "sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.19.tgz", + "integrity": "sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.19.tgz", + "integrity": "sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.19.tgz", + "integrity": "sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.19.tgz", + "integrity": "sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.19.tgz", + "integrity": "sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.19.tgz", + "integrity": "sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.19.tgz", + "integrity": "sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.19.tgz", + "integrity": "sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.19.tgz", + "integrity": "sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.19.tgz", + "integrity": "sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.19.tgz", + "integrity": "sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.19.tgz", + "integrity": "sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.19.tgz", + "integrity": "sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.19.tgz", + "integrity": "sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.19.tgz", + "integrity": "sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.19.tgz", + "integrity": "sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.19.tgz", + "integrity": "sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.19.tgz", + "integrity": "sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.19.tgz", + "integrity": "sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.19.tgz", + "integrity": "sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.19.tgz", + "integrity": "sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@grpc/grpc-js": { + "version": "1.8.14", + "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.8.14.tgz", + "integrity": "sha512-w84maJ6CKl5aApCMzFll0hxtFNT6or9WwMslobKaqWUEf1K+zhlL43bSQhFreyYWIWR+Z0xnVFC1KtLm4ZpM/A==", + "dependencies": { + "@grpc/proto-loader": "^0.7.0", + "@types/node": ">=12.12.47" + }, + "engines": { + "node": "^8.13.0 || >=10.10.0" + } + }, + "node_modules/@grpc/proto-loader": { + "version": "0.7.6", + "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.6.tgz", + "integrity": "sha512-QyAXR8Hyh7uMDmveWxDSUcJr9NAWaZ2I6IXgAYvQmfflwouTM+rArE2eEaCtLlRqO81j7pRLCt81IefUei6Zbw==", + "dependencies": { + "@types/long": "^4.0.1", + "lodash.camelcase": "^4.3.0", + "long": "^4.0.0", + "protobufjs": "^7.0.0", + "yargs": "^16.2.0" + }, + "bin": { + "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/schemas": { + "version": "29.6.0", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.0.tgz", + "integrity": "sha512-rxLjXyJBTL4LQeJW3aKo0M/+GkCOXsO+8i9Iu7eDb6KwtP65ayoDsitrdPBtujxQ88k4wI2FNYfa6TOGwSn6cQ==", + "dev": true, + "dependencies": { + "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.18", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", + "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" + } + }, + "node_modules/@jridgewell/trace-mapping/node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "dev": true + }, + "node_modules/@mapbox/node-pre-gyp": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.11.tgz", + "integrity": "sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==", + "dev": true, + "dependencies": { + "detect-libc": "^2.0.0", + "https-proxy-agent": "^5.0.0", + "make-dir": "^3.1.0", + "node-fetch": "^2.6.7", + "nopt": "^5.0.0", + "npmlog": "^5.0.1", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.11" + }, + "bin": { + "node-pre-gyp": "bin/node-pre-gyp" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@protobufjs/aspromise": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==" + }, + "node_modules/@protobufjs/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" + }, + "node_modules/@protobufjs/codegen": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", + "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" + }, + "node_modules/@protobufjs/eventemitter": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", + "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==" + }, + "node_modules/@protobufjs/fetch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", + "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", + "dependencies": { + "@protobufjs/aspromise": "^1.1.1", + "@protobufjs/inquire": "^1.1.0" + } + }, + "node_modules/@protobufjs/float": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", + "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==" + }, + "node_modules/@protobufjs/inquire": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", + "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==" + }, + "node_modules/@protobufjs/path": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==" + }, + "node_modules/@protobufjs/pool": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==" + }, + "node_modules/@protobufjs/utf8": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", + "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==" + }, + "node_modules/@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "dev": true + }, + "node_modules/@tsconfig/node10": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", + "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", + "dev": true + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", + "dev": true + }, + "node_modules/@types/amqplib": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/@types/amqplib/-/amqplib-0.10.1.tgz", + "integrity": "sha512-j6ANKT79ncUDnAs/+9r9eDujxbeJoTjoVu33gHHcaPfmLQaMhvfbH2GqSe8KUM444epAp1Vl3peVOQfZk3UIqA==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/body-parser": { + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", + "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/chai": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.5.tgz", + "integrity": "sha512-mEo1sAde+UCE6b2hxn332f1g1E8WfYRu6p5SvTKr2ZKC1f7gFJXk4h5PyGP9Dt6gCaG8y8XhwnXWC6Iy2cmBng==", + "dev": true + }, + "node_modules/@types/chai-subset": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@types/chai-subset/-/chai-subset-1.3.3.tgz", + "integrity": "sha512-frBecisrNGz+F4T6bcc+NLeolfiojh5FxW2klu669+8BARtyQv2C/GkNW6FUodVe4BroGMP/wER/YDGc7rEllw==", + "dev": true, + "dependencies": { + "@types/chai": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.35", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", + "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/express": { + "version": "4.17.17", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.17.tgz", + "integrity": "sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==", + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "4.17.35", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.35.tgz", + "integrity": "sha512-wALWQwrgiB2AWTT91CB62b6Yt0sNHpznUXeZEcnPU3DRdlDIz74x8Qg1UUYKSVFi+va5vKOLYRBI1bRKiLLKIg==", + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/http-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-/K3ds8TRAfBvi5vfjuz8y6+GiAYBZ0x4tXv1Av6CWBWn0IlADc+ZX9pMq7oU0fNQPnBwIZl3rmeLp6SBApbxSQ==" + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", + "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", + "dev": true + }, + "node_modules/@types/long": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz", + "integrity": "sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==" + }, + "node_modules/@types/mime": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", + "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==" + }, + "node_modules/@types/node": { + "version": "18.15.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.9.tgz", + "integrity": "sha512-dUxhiNzBLr6IqlZXz6e/rN2YQXlFgOei/Dxy+e3cyXTJ4txSUbGT2/fmnD6zd/75jDMeW5bDee+YXxlFKHoV0A==" + }, + "node_modules/@types/qs": { + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==" + }, + "node_modules/@types/range-parser": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", + "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==" + }, + "node_modules/@types/send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.1.tgz", + "integrity": "sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q==", + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.2.tgz", + "integrity": "sha512-J2LqtvFYCzaj8pVYKw8klQXrLLk7TBZmQ4ShlcdkELFKGwGMfevMLneMMRkMgZxotOD9wg497LpC7O8PcvAmfw==", + "dependencies": { + "@types/http-errors": "*", + "@types/mime": "*", + "@types/node": "*" + } + }, + "node_modules/@vitest/coverage-c8": { + "version": "0.33.0", + "resolved": "https://registry.npmjs.org/@vitest/coverage-c8/-/coverage-c8-0.33.0.tgz", + "integrity": "sha512-DaF1zJz4dcOZS4k/neiQJokmOWqsGXwhthfmUdPGorXIQHjdPvV6JQSYhQDI41MyI8c+IieQUdIDs5XAMHtDDw==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.2.1", + "c8": "^7.14.0", + "magic-string": "^0.30.1", + "picocolors": "^1.0.0", + "std-env": "^3.3.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "vitest": ">=0.30.0 <1" + } + }, + "node_modules/@vitest/expect": { + "version": "0.33.0", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-0.33.0.tgz", + "integrity": "sha512-sVNf+Gla3mhTCxNJx+wJLDPp/WcstOe0Ksqz4Vec51MmgMth/ia0MGFEkIZmVGeTL5HtjYR4Wl/ZxBxBXZJTzQ==", + "dev": true, + "dependencies": { + "@vitest/spy": "0.33.0", + "@vitest/utils": "0.33.0", + "chai": "^4.3.7" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/runner": { + "version": "0.33.0", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-0.33.0.tgz", + "integrity": "sha512-UPfACnmCB6HKRHTlcgCoBh6ppl6fDn+J/xR8dTufWiKt/74Y9bHci5CKB8tESSV82zKYtkBJo9whU3mNvfaisg==", + "dev": true, + "dependencies": { + "@vitest/utils": "0.33.0", + "p-limit": "^4.0.0", + "pathe": "^1.1.1" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/runner/node_modules/p-limit": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", + "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^1.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@vitest/runner/node_modules/yocto-queue": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", + "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", + "dev": true, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@vitest/snapshot": { + "version": "0.33.0", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-0.33.0.tgz", + "integrity": "sha512-tJjrl//qAHbyHajpFvr8Wsk8DIOODEebTu7pgBrP07iOepR5jYkLFiqLq2Ltxv+r0uptUb4izv1J8XBOwKkVYA==", + "dev": true, + "dependencies": { + "magic-string": "^0.30.1", + "pathe": "^1.1.1", + "pretty-format": "^29.5.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/spy": { + "version": "0.33.0", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-0.33.0.tgz", + "integrity": "sha512-Kv+yZ4hnH1WdiAkPUQTpRxW8kGtH8VRTnus7ZTGovFYM1ZezJpvGtb9nPIjPnptHbsyIAxYZsEpVPYgtpjGnrg==", + "dev": true, + "dependencies": { + "tinyspy": "^2.1.1" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/utils": { + "version": "0.33.0", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-0.33.0.tgz", + "integrity": "sha512-pF1w22ic965sv+EN6uoePkAOTkAPWM03Ri/jXNyMIKBb/XHLDPfhLvf/Fa9g0YECevAIz56oVYXhodLvLQ/awA==", + "dev": true, + "dependencies": { + "diff-sequences": "^29.4.3", + "loupe": "^2.3.6", + "pretty-format": "^29.5.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/aproba": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", + "dev": true + }, + "node_modules/are-we-there-yet": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", + "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", + "dev": true, + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "node_modules/at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/axios": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.4.0.tgz", + "integrity": "sha512-S4XCWMEmzvo64T9GfvQDOXgYRDJ/wsSZc7Jvdgx5u1sd0JwsuPLqb3SYmusag+edF6ziyMensPVqLTSc1PiSEA==", + "dependencies": { + "follow-redirects": "^1.15.0", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dev": true, + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/body-parser": { + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", + "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/c8": { + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/c8/-/c8-7.14.0.tgz", + "integrity": "sha512-i04rtkkcNcCf7zsQcSv/T9EbUn4RXQ6mropeMcjFOsQXQ0iGLAr/xT6TImQg4+U9hmNpN9XdvPkjUL1IzbgxJw==", + "dev": true, + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@istanbuljs/schema": "^0.1.3", + "find-up": "^5.0.0", + "foreground-child": "^2.0.0", + "istanbul-lib-coverage": "^3.2.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-reports": "^3.1.4", + "rimraf": "^3.0.2", + "test-exclude": "^6.0.0", + "v8-to-istanbul": "^9.0.0", + "yargs": "^16.2.0", + "yargs-parser": "^20.2.9" + }, + "bin": { + "c8": "bin/c8.js" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/cac": { + "version": "6.7.14", + "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", + "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/chai": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.7.tgz", + "integrity": "sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==", + "dev": true, + "dependencies": { + "assertion-error": "^1.1.0", + "check-error": "^1.0.2", + "deep-eql": "^4.1.2", + "get-func-name": "^2.0.0", + "loupe": "^2.3.1", + "pathval": "^1.1.1", + "type-detect": "^4.0.5" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/check-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", + "integrity": "sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "dev": true, + "bin": { + "color-support": "bin.js" + } + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", + "dev": true + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true + }, + "node_modules/cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "dev": true + }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "dev": true, + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/deep-eql": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz", + "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==", + "dev": true, + "dependencies": { + "type-detect": "^4.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "dev": true, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", + "dev": true + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detect-libc": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz", + "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/diff-sequences": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.4.3.tgz", + "integrity": "sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dotenv": { + "version": "16.3.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.3.1.tgz", + "integrity": "sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/motdotla/dotenv?sponsor=1" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/esbuild": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.19.tgz", + "integrity": "sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.17.19", + "@esbuild/android-arm64": "0.17.19", + "@esbuild/android-x64": "0.17.19", + "@esbuild/darwin-arm64": "0.17.19", + "@esbuild/darwin-x64": "0.17.19", + "@esbuild/freebsd-arm64": "0.17.19", + "@esbuild/freebsd-x64": "0.17.19", + "@esbuild/linux-arm": "0.17.19", + "@esbuild/linux-arm64": "0.17.19", + "@esbuild/linux-ia32": "0.17.19", + "@esbuild/linux-loong64": "0.17.19", + "@esbuild/linux-mips64el": "0.17.19", + "@esbuild/linux-ppc64": "0.17.19", + "@esbuild/linux-riscv64": "0.17.19", + "@esbuild/linux-s390x": "0.17.19", + "@esbuild/linux-x64": "0.17.19", + "@esbuild/netbsd-x64": "0.17.19", + "@esbuild/openbsd-x64": "0.17.19", + "@esbuild/sunos-x64": "0.17.19", + "@esbuild/win32-arm64": "0.17.19", + "@esbuild/win32-ia32": "0.17.19", + "@esbuild/win32-x64": "0.17.19" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/expand-template": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", + "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/express": { + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.1", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.5.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/express/node_modules/body-parser": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/express/node_modules/raw-body": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/fast-glob": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.0.tgz", + "integrity": "sha512-ChDuvbOypPuNjO8yIDf36x7BlZX1smcUMTTcyoIjycexOxd6DFsKsg21qVBzEmr3G7fUKIRy2/psii+CIUt7FA==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/follow-redirects": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/foreground-child": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", + "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + } + }, + "node_modules/from2/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/from2/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/from2/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "dev": true + }, + "node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/fs-minipass/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "node_modules/gauge": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", + "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", + "dev": true, + "dependencies": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.2", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.1", + "object-assign": "^4.1.1", + "signal-exit": "^3.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-func-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", + "integrity": "sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/github-from-package": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", + "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==", + "dev": true + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globrex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz", + "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==", + "dev": true + }, + "node_modules/google-protobuf": { + "version": "3.21.2", + "resolved": "https://registry.npmjs.org/google-protobuf/-/google-protobuf-3.21.2.tgz", + "integrity": "sha512-3MSOYFO5U9mPGikIYCzK0SaThypfGgS6bHqrUGXG3DPHCrb+txNqeEcns1W0lkGfk0rCyNXm7xB9rMxnCiZOoA==" + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true + }, + "node_modules/grpc-server-reflection": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/grpc-server-reflection/-/grpc-server-reflection-0.1.5.tgz", + "integrity": "sha512-i69RYu6v65enzknNAPUgerFuVQfo+L3n9g4c1A/Sv5jUHMpxMIjSbBA+YWls9Sr4Flac4oohp4Gx8f389CaHuw==", + "dependencies": { + "google-protobuf": "^3.19.1" + } + }, + "node_modules/grpc-tools": { + "version": "1.12.4", + "resolved": "https://registry.npmjs.org/grpc-tools/-/grpc-tools-1.12.4.tgz", + "integrity": "sha512-5+mLAJJma3BjnW/KQp6JBjUMgvu7Mu3dBvBPd1dcbNIb+qiR0817zDpgPjS7gRb+l/8EVNIa3cB02xI9JLToKg==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "@mapbox/node-pre-gyp": "^1.0.5" + }, + "bin": { + "grpc_tools_node_protoc": "bin/protoc.js", + "grpc_tools_node_protoc_plugin": "bin/protoc_plugin.js" + } + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", + "dev": true + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dev": true, + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/ignore": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/ignore-by-default": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", + "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==", + "dev": true + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true + }, + "node_modules/into-stream": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/into-stream/-/into-stream-6.0.0.tgz", + "integrity": "sha512-XHbaOAvP+uFKUFsOgoNPRjLkwB+I22JFPFe5OjTkQ0nwgj6+pSjb4NmB6VMxaPshLiOf+zcpOCBQuLwC1KHhZA==", + "dev": true, + "dependencies": { + "from2": "^2.3.0", + "p-is-promise": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz", + "integrity": "sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", + "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "dev": true, + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-reports": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", + "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", + "dev": true, + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonc-parser": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", + "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", + "dev": true + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/local-pkg": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.4.3.tgz", + "integrity": "sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==" + }, + "node_modules/long": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", + "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" + }, + "node_modules/loupe": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.6.tgz", + "integrity": "sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==", + "dev": true, + "dependencies": { + "get-func-name": "^2.0.0" + } + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/magic-string": { + "version": "0.30.1", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.1.tgz", + "integrity": "sha512-mbVKXPmS0z0G4XqFDCTllmDQ6coZzn94aMlb0o/A4HEHJCKcanlDZwYJgwnkmgD3jyWhUgj9VsPrfd972yPffA==", + "dev": true, + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.15" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minizlib/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mkdirp-classic": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", + "dev": true + }, + "node_modules/mlly": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.4.0.tgz", + "integrity": "sha512-ua8PAThnTwpprIaU47EPeZ/bPUVp2QYBbWMphUQpVdBI3Lgqzm5KZQ45Agm3YJedHXaIHl6pBGabaLSUPPSptg==", + "dev": true, + "dependencies": { + "acorn": "^8.9.0", + "pathe": "^1.1.1", + "pkg-types": "^1.0.3", + "ufo": "^1.1.2" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/multistream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/multistream/-/multistream-4.1.0.tgz", + "integrity": "sha512-J1XDiAmmNpRCBfIWJv+n0ymC4ABcf/Pl+5YvC5B/D2f/2+8PtHvCNxMPKiQcZyi922Hq69J2YOpb1pTywfifyw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "once": "^1.4.0", + "readable-stream": "^3.6.0" + } + }, + "node_modules/nanoid": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", + "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/napi-build-utils": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", + "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==", + "dev": true + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/node-abi": { + "version": "3.45.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.45.0.tgz", + "integrity": "sha512-iwXuFrMAcFVi/ZoZiqq8BzAdsLw9kxDfTC0HMyjXfSL/6CSDAGD5UmR7azrAgWV1zKYq7dUUMj4owusBWKLsiQ==", + "dev": true, + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/node-fetch": { + "version": "2.6.12", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.12.tgz", + "integrity": "sha512-C/fGU2E8ToujUivIO0H+tpQ6HWo4eEmchoPIoXtxCrVghxdKq+QOHqEZW7tuP3KlV3bC8FRMO5nMCC7Zm1VP6g==", + "dev": true, + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/nodemon": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.0.1.tgz", + "integrity": "sha512-g9AZ7HmkhQkqXkRc20w+ZfQ73cHLbE8hnPbtaFbFtCumZsjyMhKk9LajQ07U5Ux28lvFjZ5X7HvWR1xzU8jHVw==", + "dev": true, + "dependencies": { + "chokidar": "^3.5.2", + "debug": "^3.2.7", + "ignore-by-default": "^1.0.1", + "minimatch": "^3.1.2", + "pstree.remy": "^1.1.8", + "semver": "^7.5.3", + "simple-update-notifier": "^2.0.0", + "supports-color": "^5.5.0", + "touch": "^3.1.0", + "undefsafe": "^2.0.5" + }, + "bin": { + "nodemon": "bin/nodemon.js" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/nodemon" + } + }, + "node_modules/nodemon/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/nodemon/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/nodemon/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "dev": true, + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npmlog": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", + "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", + "dev": true, + "dependencies": { + "are-we-there-yet": "^2.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^3.0.0", + "set-blocking": "^2.0.0" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/p-is-promise": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-3.0.0.tgz", + "integrity": "sha512-Wo8VsW4IRQSKVXsJCn7TomUaVtyfjVDn3nUP7kE967BQk0CwFpdbZs0X0uk5sW9mkBa9eNM7hCMaG93WUAwxYQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/pathe": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.1.tgz", + "integrity": "sha512-d+RQGp0MAYTIaDBIMmOfMwz3E+LOZnxx1HZd5R18mmCZY0QBlK0LDZfPc8FW8Ed2DlvsuE6PRjroDY+wg4+j/Q==", + "dev": true + }, + "node_modules/pathval": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", + "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pkg": { + "version": "5.8.1", + "resolved": "https://registry.npmjs.org/pkg/-/pkg-5.8.1.tgz", + "integrity": "sha512-CjBWtFStCfIiT4Bde9QpJy0KeH19jCfwZRJqHFDFXfhUklCx8JoFmMj3wgnEYIwGmZVNkhsStPHEOnrtrQhEXA==", + "dev": true, + "dependencies": { + "@babel/generator": "7.18.2", + "@babel/parser": "7.18.4", + "@babel/types": "7.19.0", + "chalk": "^4.1.2", + "fs-extra": "^9.1.0", + "globby": "^11.1.0", + "into-stream": "^6.0.0", + "is-core-module": "2.9.0", + "minimist": "^1.2.6", + "multistream": "^4.1.0", + "pkg-fetch": "3.4.2", + "prebuild-install": "7.1.1", + "resolve": "^1.22.0", + "stream-meter": "^1.0.4" + }, + "bin": { + "pkg": "lib-es5/bin.js" + }, + "peerDependencies": { + "node-notifier": ">=9.0.1" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/pkg-fetch": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/pkg-fetch/-/pkg-fetch-3.4.2.tgz", + "integrity": "sha512-0+uijmzYcnhC0hStDjm/cl2VYdrmVVBpe7Q8k9YBojxmR5tG8mvR9/nooQq3QSXiQqORDVOTY3XqMEqJVIzkHA==", + "dev": true, + "dependencies": { + "chalk": "^4.1.2", + "fs-extra": "^9.1.0", + "https-proxy-agent": "^5.0.0", + "node-fetch": "^2.6.6", + "progress": "^2.0.3", + "semver": "^7.3.5", + "tar-fs": "^2.1.1", + "yargs": "^16.2.0" + }, + "bin": { + "pkg-fetch": "lib-es5/bin.js" + } + }, + "node_modules/pkg-types": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.0.3.tgz", + "integrity": "sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==", + "dev": true, + "dependencies": { + "jsonc-parser": "^3.2.0", + "mlly": "^1.2.0", + "pathe": "^1.1.0" + } + }, + "node_modules/postcss": { + "version": "8.4.26", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.26.tgz", + "integrity": "sha512-jrXHFF8iTloAenySjM/ob3gSj7pCu0Ji49hnjqzsgSRa50hkWCKD0HQ+gMNJkW38jBI68MpAAg7ZWwHwX8NMMw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/prebuild-install": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.1.tgz", + "integrity": "sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==", + "dev": true, + "dependencies": { + "detect-libc": "^2.0.0", + "expand-template": "^2.0.3", + "github-from-package": "0.0.0", + "minimist": "^1.2.3", + "mkdirp-classic": "^0.5.3", + "napi-build-utils": "^1.0.1", + "node-abi": "^3.3.0", + "pump": "^3.0.0", + "rc": "^1.2.7", + "simple-get": "^4.0.0", + "tar-fs": "^2.0.0", + "tunnel-agent": "^0.6.0" + }, + "bin": { + "prebuild-install": "bin.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/pretty-format": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.1.tgz", + "integrity": "sha512-7jRj+yXO0W7e4/tSJKoR7HRIHLPPjtNaUGG2xxKQnGvPNRkgWcQ0AZX6P4KBRJN4FcTBWb3sa7DVUJmocYuoog==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.6.0", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/protobufjs": { + "version": "7.2.4", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.2.4.tgz", + "integrity": "sha512-AT+RJgD2sH8phPmCf7OUZR8xGdcJRga4+1cOaXJ64hvcSkVhNcRHOwIxUatPH15+nj59WAGTDv3LSGZPEQbJaQ==", + "hasInstallScript": true, + "dependencies": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/node": ">=13.7.0", + "long": "^5.0.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/protobufjs/node_modules/long": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", + "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==" + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, + "node_modules/pstree.remy": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", + "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", + "dev": true + }, + "node_modules/pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dev": true, + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, + "node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", + "dev": true + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.2", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", + "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", + "dev": true, + "dependencies": { + "is-core-module": "^2.11.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve/node_modules/is-core-module": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz", + "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rollup": { + "version": "3.26.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.26.2.tgz", + "integrity": "sha512-6umBIGVz93er97pMgQO08LuH3m6PUb3jlDUUGFsNJB6VgTCUaDFpupf5JfU30529m/UKOgmiX+uY6Sx8cOYpLA==", + "dev": true, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=14.18.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "dev": true + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/siginfo": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", + "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", + "dev": true + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "node_modules/simple-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/simple-get": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", + "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "decompress-response": "^6.0.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } + }, + "node_modules/simple-update-notifier": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", + "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==", + "dev": true, + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stackback": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", + "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", + "dev": true + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/std-env": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.3.3.tgz", + "integrity": "sha512-Rz6yejtVyWnVjC1RFvNmYL10kgjC49EOghxWn0RFqlCHGFpQx+Xe7yW3I4ceK1SGrWIGMjD5Kbue8W/udkbMJg==", + "dev": true + }, + "node_modules/stream-meter": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/stream-meter/-/stream-meter-1.0.4.tgz", + "integrity": "sha512-4sOEtrbgFotXwnEuzzsQBYEV1elAeFSO8rSGeTwabuX1RRn/kEq9JVH7I0MRBhKVRR0sJkr0M0QCH7yOLf9fhQ==", + "dev": true, + "dependencies": { + "readable-stream": "^2.1.4" + } + }, + "node_modules/stream-meter/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/stream-meter/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/stream-meter/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-literal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-1.0.1.tgz", + "integrity": "sha512-QZTsipNpa2Ppr6v1AmJHESqJ3Uz247MUS0OjrnnZjFAvEoWqxuyFuXn2xLgMtRnijJShAa1HL0gtJyUs7u7n3Q==", + "dev": true, + "dependencies": { + "acorn": "^8.8.2" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tar": { + "version": "6.1.15", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.15.tgz", + "integrity": "sha512-/zKt9UyngnxIT/EAGYuxaMYgOIJiP81ab9ZfkILq4oNLPFX50qyYmu7jRj9qeXoxmJHjGlbH0+cm2uy1WCs10A==", + "dev": true, + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/tar-fs": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", + "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", + "dev": true, + "dependencies": { + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.1.4" + } + }, + "node_modules/tar-fs/node_modules/chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "dev": true + }, + "node_modules/tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "dev": true, + "dependencies": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tinybench": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.5.0.tgz", + "integrity": "sha512-kRwSG8Zx4tjF9ZiyH4bhaebu+EDz1BOx9hOigYHlUW4xxI/wKIUQUqo018UlU4ar6ATPBsaMrdbKZ+tmPdohFA==", + "dev": true + }, + "node_modules/tinypool": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-0.6.0.tgz", + "integrity": "sha512-FdswUUo5SxRizcBc6b1GSuLpLjisa8N8qMyYoP3rl+bym+QauhtJP5bvZY1ytt8krKGmMLYIRl36HBZfeAoqhQ==", + "dev": true, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tinyspy": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-2.1.1.tgz", + "integrity": "sha512-XPJL2uSzcOyBMky6OFrusqWlzfFrXtE0hPuMgW8A2HmaqrPo4ZQHRN/V0QXN3FSjKxpsbRrFc5LI7KOwBsT1/w==", + "dev": true, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/touch": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", + "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", + "dev": true, + "dependencies": { + "nopt": "~1.0.10" + }, + "bin": { + "nodetouch": "bin/nodetouch.js" + } + }, + "node_modules/touch/node_modules/nopt": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", + "integrity": "sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==", + "dev": true, + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "*" + } + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "dev": true + }, + "node_modules/ts-essentials": { + "version": "9.3.2", + "resolved": "https://registry.npmjs.org/ts-essentials/-/ts-essentials-9.3.2.tgz", + "integrity": "sha512-JxKJzuWqH1MmH4ZFHtJzGEhkfN3QvVR3C3w+4BIoWeoY68UVVoA2Np/Bca9z0IPSErVCWhv439aT0We4Dks8kQ==", + "dev": true, + "peerDependencies": { + "typescript": ">=4.1.0" + } + }, + "node_modules/ts-node": { + "version": "10.9.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", + "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", + "dev": true, + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "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 + } + } + }, + "node_modules/tsconfck": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/tsconfck/-/tsconfck-2.1.1.tgz", + "integrity": "sha512-ZPCkJBKASZBmBUNqGHmRhdhM8pJYDdOXp4nRgj/O0JwUwsMq50lCDRQP/M5GBNAA0elPrq4gAeu4dkaVCuKWww==", + "dev": true, + "bin": { + "tsconfck": "bin/tsconfck.js" + }, + "engines": { + "node": "^14.13.1 || ^16 || >=18" + }, + "peerDependencies": { + "typescript": "^4.3.5 || ^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/tsconfig-paths": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", + "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==", + "dev": true, + "dependencies": { + "json5": "^2.2.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "dev": true, + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typescript": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.2.tgz", + "integrity": "sha512-wVORMBGO/FAs/++blGNeAVdbNKtIh1rbBL2EyQ1+J9lClJ93KiiKe8PmFIVdXhHcyv44SL9oglmfeSsndo0jRw==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=12.20" + } + }, + "node_modules/ufo": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.1.2.tgz", + "integrity": "sha512-TrY6DsjTQQgyS3E3dBaOXf0TpPD8u9FVrVYmKVegJuFw51n/YB9XPt+U6ydzFG5ZIN7+DIjPbNmXoBj9esYhgQ==", + "dev": true + }, + "node_modules/undefsafe": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", + "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", + "dev": true + }, + "node_modules/universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true + }, + "node_modules/v8-to-istanbul": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.1.0.tgz", + "integrity": "sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.12", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^1.6.0" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/vite": { + "version": "4.4.4", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.4.4.tgz", + "integrity": "sha512-4mvsTxjkveWrKDJI70QmelfVqTm+ihFAb6+xf4sjEU2TmUCTlVX87tmg/QooPEMQb/lM9qGHT99ebqPziEd3wg==", + "dev": true, + "dependencies": { + "esbuild": "^0.18.10", + "postcss": "^8.4.25", + "rollup": "^3.25.2" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + }, + "peerDependencies": { + "@types/node": ">= 14", + "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 + } + } + }, + "node_modules/vite-node": { + "version": "0.33.0", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-0.33.0.tgz", + "integrity": "sha512-19FpHYbwWWxDr73ruNahC+vtEdza52kA90Qb3La98yZ0xULqV8A5JLNPUff0f5zID4984tW7l3DH2przTJUZSw==", + "dev": true, + "dependencies": { + "cac": "^6.7.14", + "debug": "^4.3.4", + "mlly": "^1.4.0", + "pathe": "^1.1.1", + "picocolors": "^1.0.0", + "vite": "^3.0.0 || ^4.0.0" + }, + "bin": { + "vite-node": "vite-node.mjs" + }, + "engines": { + "node": ">=v14.18.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/vite-tsconfig-paths": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/vite-tsconfig-paths/-/vite-tsconfig-paths-4.2.0.tgz", + "integrity": "sha512-jGpus0eUy5qbbMVGiTxCL1iB9ZGN6Bd37VGLJU39kTDD6ZfULTTb1bcc5IeTWqWJKiWV5YihCaibeASPiGi8kw==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "globrex": "^0.1.2", + "tsconfck": "^2.1.0" + }, + "peerDependencies": { + "vite": "*" + }, + "peerDependenciesMeta": { + "vite": { + "optional": true + } + } + }, + "node_modules/vite/node_modules/@esbuild/android-arm": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.12.tgz", + "integrity": "sha512-LIxaNIQfkFZbTLb4+cX7dozHlAbAshhFE5PKdro0l+FnCpx1GDJaQ2WMcqm+ToXKMt8p8Uojk/MFRuGyz3V5Sw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/android-arm64": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.12.tgz", + "integrity": "sha512-BMAlczRqC/LUt2P97E4apTBbkvS9JTJnp2DKFbCwpZ8vBvXVbNdqmvzW/OsdtI/+mGr+apkkpqGM8WecLkPgrA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/android-x64": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.12.tgz", + "integrity": "sha512-zU5MyluNsykf5cOJ0LZZZjgAHbhPJ1cWfdH1ZXVMXxVMhEV0VZiZXQdwBBVvmvbF28EizeK7obG9fs+fpmS0eQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/darwin-arm64": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.12.tgz", + "integrity": "sha512-zUZMep7YONnp6954QOOwEBwFX9svlKd3ov6PkxKd53LGTHsp/gy7vHaPGhhjBmEpqXEXShi6dddjIkmd+NgMsA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/darwin-x64": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.12.tgz", + "integrity": "sha512-ohqLPc7i67yunArPj1+/FeeJ7AgwAjHqKZ512ADk3WsE3FHU9l+m5aa7NdxXr0HmN1bjDlUslBjWNbFlD9y12Q==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/freebsd-arm64": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.12.tgz", + "integrity": "sha512-GIIHtQXqgeOOqdG16a/A9N28GpkvjJnjYMhOnXVbn3EDJcoItdR58v/pGN31CHjyXDc8uCcRnFWmqaJt24AYJg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/freebsd-x64": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.12.tgz", + "integrity": "sha512-zK0b9a1/0wZY+6FdOS3BpZcPc1kcx2G5yxxfEJtEUzVxI6n/FrC2Phsxj/YblPuBchhBZ/1wwn7AyEBUyNSa6g==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-arm": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.12.tgz", + "integrity": "sha512-y75OijvrBE/1XRrXq1jtrJfG26eHeMoqLJ2dwQNwviwTuTtHGCojsDO6BJNF8gU+3jTn1KzJEMETytwsFSvc+Q==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-arm64": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.12.tgz", + "integrity": "sha512-JKgG8Q/LL/9sw/iHHxQyVMoQYu3rU3+a5Z87DxC+wAu3engz+EmctIrV+FGOgI6gWG1z1+5nDDbXiRMGQZXqiw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-ia32": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.12.tgz", + "integrity": "sha512-yoRIAqc0B4lDIAAEFEIu9ttTRFV84iuAl0KNCN6MhKLxNPfzwCBvEMgwco2f71GxmpBcTtn7KdErueZaM2rEvw==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-loong64": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.12.tgz", + "integrity": "sha512-qYgt3dHPVvf/MgbIBpJ4Sup/yb9DAopZ3a2JgMpNKIHUpOdnJ2eHBo/aQdnd8dJ21X/+sS58wxHtA9lEazYtXQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-mips64el": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.12.tgz", + "integrity": "sha512-wHphlMLK4ufNOONqukELfVIbnGQJrHJ/mxZMMrP2jYrPgCRZhOtf0kC4yAXBwnfmULimV1qt5UJJOw4Kh13Yfg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-ppc64": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.12.tgz", + "integrity": "sha512-TeN//1Ft20ZZW41+zDSdOI/Os1bEq5dbvBvYkberB7PHABbRcsteeoNVZFlI0YLpGdlBqohEpjrn06kv8heCJg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-riscv64": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.12.tgz", + "integrity": "sha512-AgUebVS4DoAblBgiB2ACQ/8l4eGE5aWBb8ZXtkXHiET9mbj7GuWt3OnsIW/zX+XHJt2RYJZctbQ2S/mDjbp0UA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-s390x": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.12.tgz", + "integrity": "sha512-dJ3Rb3Ei2u/ysSXd6pzleGtfDdc2MuzKt8qc6ls8vreP1G3B7HInX3i7gXS4BGeVd24pp0yqyS7bJ5NHaI9ing==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-x64": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.12.tgz", + "integrity": "sha512-OrNJMGQbPaVyHHcDF8ybNSwu7TDOfX8NGpXCbetwOSP6txOJiWlgQnRymfC9ocR1S0Y5PW0Wb1mV6pUddqmvmQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/netbsd-x64": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.12.tgz", + "integrity": "sha512-55FzVCAiwE9FK8wWeCRuvjazNRJ1QqLCYGZVB6E8RuQuTeStSwotpSW4xoRGwp3a1wUsaVCdYcj5LGCASVJmMg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/openbsd-x64": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.12.tgz", + "integrity": "sha512-qnluf8rfb6Y5Lw2tirfK2quZOBbVqmwxut7GPCIJsM8lc4AEUj9L8y0YPdLaPK0TECt4IdyBdBD/KRFKorlK3g==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/sunos-x64": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.12.tgz", + "integrity": "sha512-+RkKpVQR7bICjTOPUpkTBTaJ4TFqQBX5Ywyd/HSdDkQGn65VPkTsR/pL4AMvuMWy+wnXgIl4EY6q4mVpJal8Kg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/win32-arm64": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.12.tgz", + "integrity": "sha512-GNHuciv0mFM7ouzsU0+AwY+7eV4Mgo5WnbhfDCQGtpvOtD1vbOiRjPYG6dhmMoFyBjj+pNqQu2X+7DKn0KQ/Gw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/win32-ia32": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.12.tgz", + "integrity": "sha512-kR8cezhYipbbypGkaqCTWIeu4zID17gamC8YTPXYtcN3E5BhhtTnwKBn9I0PJur/T6UVwIEGYzkffNL0lFvxEw==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/win32-x64": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.12.tgz", + "integrity": "sha512-O0UYQVkvfM/jO8a4OwoV0mAKSJw+mjWTAd1MJd/1FCX6uiMdLmMRPK/w6e9OQ0ob2WGxzIm9va/KG0Ja4zIOgg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/esbuild": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.12.tgz", + "integrity": "sha512-XuOVLDdtsDslXStStduT41op21Ytmf4/BDS46aa3xPJ7X5h2eMWBF1oAe3QjUH3bDksocNXgzGUZ7XHIBya6Tg==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.18.12", + "@esbuild/android-arm64": "0.18.12", + "@esbuild/android-x64": "0.18.12", + "@esbuild/darwin-arm64": "0.18.12", + "@esbuild/darwin-x64": "0.18.12", + "@esbuild/freebsd-arm64": "0.18.12", + "@esbuild/freebsd-x64": "0.18.12", + "@esbuild/linux-arm": "0.18.12", + "@esbuild/linux-arm64": "0.18.12", + "@esbuild/linux-ia32": "0.18.12", + "@esbuild/linux-loong64": "0.18.12", + "@esbuild/linux-mips64el": "0.18.12", + "@esbuild/linux-ppc64": "0.18.12", + "@esbuild/linux-riscv64": "0.18.12", + "@esbuild/linux-s390x": "0.18.12", + "@esbuild/linux-x64": "0.18.12", + "@esbuild/netbsd-x64": "0.18.12", + "@esbuild/openbsd-x64": "0.18.12", + "@esbuild/sunos-x64": "0.18.12", + "@esbuild/win32-arm64": "0.18.12", + "@esbuild/win32-ia32": "0.18.12", + "@esbuild/win32-x64": "0.18.12" + } + }, + "node_modules/vitest": { + "version": "0.33.0", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-0.33.0.tgz", + "integrity": "sha512-1CxaugJ50xskkQ0e969R/hW47za4YXDUfWJDxip1hwbnhUjYolpfUn2AMOulqG/Dtd9WYAtkHmM/m3yKVrEejQ==", + "dev": true, + "dependencies": { + "@types/chai": "^4.3.5", + "@types/chai-subset": "^1.3.3", + "@types/node": "*", + "@vitest/expect": "0.33.0", + "@vitest/runner": "0.33.0", + "@vitest/snapshot": "0.33.0", + "@vitest/spy": "0.33.0", + "@vitest/utils": "0.33.0", + "acorn": "^8.9.0", + "acorn-walk": "^8.2.0", + "cac": "^6.7.14", + "chai": "^4.3.7", + "debug": "^4.3.4", + "local-pkg": "^0.4.3", + "magic-string": "^0.30.1", + "pathe": "^1.1.1", + "picocolors": "^1.0.0", + "std-env": "^3.3.3", + "strip-literal": "^1.0.1", + "tinybench": "^2.5.0", + "tinypool": "^0.6.0", + "vite": "^3.0.0 || ^4.0.0", + "vite-node": "0.33.0", + "why-is-node-running": "^2.2.2" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": ">=v14.18.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@vitest/browser": "*", + "@vitest/ui": "*", + "happy-dom": "*", + "jsdom": "*", + "playwright": "*", + "safaridriver": "*", + "webdriverio": "*" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@vitest/browser": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + }, + "playwright": { + "optional": true + }, + "safaridriver": { + "optional": true + }, + "webdriverio": { + "optional": true + } + } + }, + "node_modules/vitest-mock-extended": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/vitest-mock-extended/-/vitest-mock-extended-1.1.4.tgz", + "integrity": "sha512-MKPdepFjk0CE7Ocb5txntHK/sloHO9s0Kk9dr630uL03shRSHMkZtSs5CBPsbJ8K/CvYLv0GHUmMt2zWks2eXg==", + "dev": true, + "dependencies": { + "ts-essentials": "^9.3.2" + }, + "peerDependencies": { + "typescript": "3.x || 4.x || 5.x", + "vitest": ">=0.31.1" + } + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "dev": true + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dev": true, + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/why-is-node-running": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.2.2.tgz", + "integrity": "sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==", + "dev": true, + "dependencies": { + "siginfo": "^2.0.0", + "stackback": "0.0.2" + }, + "bin": { + "why-is-node-running": "cli.js" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wide-align": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", + "dev": true, + "dependencies": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "engines": { + "node": ">=10" + } + }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + }, + "dependencies": { + "@ampproject/remapping": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", + "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", + "dev": true, + "requires": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "@babel/generator": { + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.2.tgz", + "integrity": "sha512-W1lG5vUwFvfMd8HVXqdfbuG7RuaSrTCCD8cl8fP8wOivdbtbIg2Db3IWUcgvfxKbbn6ZBGYRW/Zk1MIwK49mgw==", + "dev": true, + "requires": { + "@babel/types": "^7.18.2", + "@jridgewell/gen-mapping": "^0.3.0", + "jsesc": "^2.5.1" + } + }, + "@babel/helper-string-parser": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", + "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", + "dev": true + }, + "@babel/helper-validator-identifier": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz", + "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==", + "dev": true + }, + "@babel/parser": { + "version": "7.18.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.4.tgz", + "integrity": "sha512-FDge0dFazETFcxGw/EXzOkN8uJp0PC7Qbm+Pe9T+av2zlBpOgunFHkQPPn+eRuClU73JF+98D531UgayY89tow==", + "dev": true + }, + "@babel/types": { + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.19.0.tgz", + "integrity": "sha512-YuGopBq3ke25BVSiS6fgF49Ul9gH1x70Bcr6bqRLjWCkcX8Hre1/5+z+IiWOIerRMSSEfGZVB9z9kyq7wVs9YA==", + "dev": true, + "requires": { + "@babel/helper-string-parser": "^7.18.10", + "@babel/helper-validator-identifier": "^7.18.6", + "to-fast-properties": "^2.0.0" + } + }, + "@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true + }, + "@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "requires": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "dependencies": { + "@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "requires": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + } + } + }, + "@esbuild/android-arm": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.19.tgz", + "integrity": "sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==", + "dev": true, + "optional": true + }, + "@esbuild/android-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.19.tgz", + "integrity": "sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==", + "dev": true, + "optional": true + }, + "@esbuild/android-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.19.tgz", + "integrity": "sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==", + "dev": true, + "optional": true + }, + "@esbuild/darwin-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.19.tgz", + "integrity": "sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==", + "dev": true, + "optional": true + }, + "@esbuild/darwin-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.19.tgz", + "integrity": "sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==", + "dev": true, + "optional": true + }, + "@esbuild/freebsd-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.19.tgz", + "integrity": "sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==", + "dev": true, + "optional": true + }, + "@esbuild/freebsd-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.19.tgz", + "integrity": "sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==", + "dev": true, + "optional": true + }, + "@esbuild/linux-arm": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.19.tgz", + "integrity": "sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==", + "dev": true, + "optional": true + }, + "@esbuild/linux-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.19.tgz", + "integrity": "sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==", + "dev": true, + "optional": true + }, + "@esbuild/linux-ia32": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.19.tgz", + "integrity": "sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==", + "dev": true, + "optional": true + }, + "@esbuild/linux-loong64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.19.tgz", + "integrity": "sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==", + "dev": true, + "optional": true + }, + "@esbuild/linux-mips64el": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.19.tgz", + "integrity": "sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==", + "dev": true, + "optional": true + }, + "@esbuild/linux-ppc64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.19.tgz", + "integrity": "sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==", + "dev": true, + "optional": true + }, + "@esbuild/linux-riscv64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.19.tgz", + "integrity": "sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==", + "dev": true, + "optional": true + }, + "@esbuild/linux-s390x": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.19.tgz", + "integrity": "sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==", + "dev": true, + "optional": true + }, + "@esbuild/linux-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.19.tgz", + "integrity": "sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==", + "dev": true, + "optional": true + }, + "@esbuild/netbsd-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.19.tgz", + "integrity": "sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==", + "dev": true, + "optional": true + }, + "@esbuild/openbsd-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.19.tgz", + "integrity": "sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==", + "dev": true, + "optional": true + }, + "@esbuild/sunos-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.19.tgz", + "integrity": "sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==", + "dev": true, + "optional": true + }, + "@esbuild/win32-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.19.tgz", + "integrity": "sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==", + "dev": true, + "optional": true + }, + "@esbuild/win32-ia32": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.19.tgz", + "integrity": "sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==", + "dev": true, + "optional": true + }, + "@esbuild/win32-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.19.tgz", + "integrity": "sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==", + "dev": true, + "optional": true + }, + "@grpc/grpc-js": { + "version": "1.8.14", + "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.8.14.tgz", + "integrity": "sha512-w84maJ6CKl5aApCMzFll0hxtFNT6or9WwMslobKaqWUEf1K+zhlL43bSQhFreyYWIWR+Z0xnVFC1KtLm4ZpM/A==", + "requires": { + "@grpc/proto-loader": "^0.7.0", + "@types/node": ">=12.12.47" + } + }, + "@grpc/proto-loader": { + "version": "0.7.6", + "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.6.tgz", + "integrity": "sha512-QyAXR8Hyh7uMDmveWxDSUcJr9NAWaZ2I6IXgAYvQmfflwouTM+rArE2eEaCtLlRqO81j7pRLCt81IefUei6Zbw==", + "requires": { + "@types/long": "^4.0.1", + "lodash.camelcase": "^4.3.0", + "long": "^4.0.0", + "protobufjs": "^7.0.0", + "yargs": "^16.2.0" + } + }, + "@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true + }, + "@jest/schemas": { + "version": "29.6.0", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.0.tgz", + "integrity": "sha512-rxLjXyJBTL4LQeJW3aKo0M/+GkCOXsO+8i9Iu7eDb6KwtP65ayoDsitrdPBtujxQ88k4wI2FNYfa6TOGwSn6cQ==", + "dev": true, + "requires": { + "@sinclair/typebox": "^0.27.8" + } + }, + "@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dev": true, + "requires": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "dev": true + }, + "@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true + }, + "@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true + }, + "@jridgewell/trace-mapping": { + "version": "0.3.18", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", + "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", + "dev": true, + "requires": { + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" + }, + "dependencies": { + "@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "dev": true + } + } + }, + "@mapbox/node-pre-gyp": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.11.tgz", + "integrity": "sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==", + "dev": true, + "requires": { + "detect-libc": "^2.0.0", + "https-proxy-agent": "^5.0.0", + "make-dir": "^3.1.0", + "node-fetch": "^2.6.7", + "nopt": "^5.0.0", + "npmlog": "^5.0.1", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.11" + } + }, + "@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + } + }, + "@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true + }, + "@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "requires": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + } + }, + "@protobufjs/aspromise": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==" + }, + "@protobufjs/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" + }, + "@protobufjs/codegen": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", + "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" + }, + "@protobufjs/eventemitter": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", + "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==" + }, + "@protobufjs/fetch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", + "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", + "requires": { + "@protobufjs/aspromise": "^1.1.1", + "@protobufjs/inquire": "^1.1.0" + } + }, + "@protobufjs/float": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", + "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==" + }, + "@protobufjs/inquire": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", + "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==" + }, + "@protobufjs/path": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==" + }, + "@protobufjs/pool": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==" + }, + "@protobufjs/utf8": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", + "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==" + }, + "@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "dev": true + }, + "@tsconfig/node10": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", + "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", + "dev": true + }, + "@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true + }, + "@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true + }, + "@tsconfig/node16": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", + "dev": true + }, + "@types/amqplib": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/@types/amqplib/-/amqplib-0.10.1.tgz", + "integrity": "sha512-j6ANKT79ncUDnAs/+9r9eDujxbeJoTjoVu33gHHcaPfmLQaMhvfbH2GqSe8KUM444epAp1Vl3peVOQfZk3UIqA==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/body-parser": { + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", + "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", + "requires": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "@types/chai": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.5.tgz", + "integrity": "sha512-mEo1sAde+UCE6b2hxn332f1g1E8WfYRu6p5SvTKr2ZKC1f7gFJXk4h5PyGP9Dt6gCaG8y8XhwnXWC6Iy2cmBng==", + "dev": true + }, + "@types/chai-subset": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@types/chai-subset/-/chai-subset-1.3.3.tgz", + "integrity": "sha512-frBecisrNGz+F4T6bcc+NLeolfiojh5FxW2klu669+8BARtyQv2C/GkNW6FUodVe4BroGMP/wER/YDGc7rEllw==", + "dev": true, + "requires": { + "@types/chai": "*" + } + }, + "@types/connect": { + "version": "3.4.35", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", + "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", + "requires": { + "@types/node": "*" + } + }, + "@types/express": { + "version": "4.17.17", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.17.tgz", + "integrity": "sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==", + "requires": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "@types/express-serve-static-core": { + "version": "4.17.35", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.35.tgz", + "integrity": "sha512-wALWQwrgiB2AWTT91CB62b6Yt0sNHpznUXeZEcnPU3DRdlDIz74x8Qg1UUYKSVFi+va5vKOLYRBI1bRKiLLKIg==", + "requires": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "@types/http-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-/K3ds8TRAfBvi5vfjuz8y6+GiAYBZ0x4tXv1Av6CWBWn0IlADc+ZX9pMq7oU0fNQPnBwIZl3rmeLp6SBApbxSQ==" + }, + "@types/istanbul-lib-coverage": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", + "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", + "dev": true + }, + "@types/long": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz", + "integrity": "sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==" + }, + "@types/mime": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", + "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==" + }, + "@types/node": { + "version": "18.15.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.9.tgz", + "integrity": "sha512-dUxhiNzBLr6IqlZXz6e/rN2YQXlFgOei/Dxy+e3cyXTJ4txSUbGT2/fmnD6zd/75jDMeW5bDee+YXxlFKHoV0A==" + }, + "@types/qs": { + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==" + }, + "@types/range-parser": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", + "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==" + }, + "@types/send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.1.tgz", + "integrity": "sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q==", + "requires": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "@types/serve-static": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.2.tgz", + "integrity": "sha512-J2LqtvFYCzaj8pVYKw8klQXrLLk7TBZmQ4ShlcdkELFKGwGMfevMLneMMRkMgZxotOD9wg497LpC7O8PcvAmfw==", + "requires": { + "@types/http-errors": "*", + "@types/mime": "*", + "@types/node": "*" + } + }, + "@vitest/coverage-c8": { + "version": "0.33.0", + "resolved": "https://registry.npmjs.org/@vitest/coverage-c8/-/coverage-c8-0.33.0.tgz", + "integrity": "sha512-DaF1zJz4dcOZS4k/neiQJokmOWqsGXwhthfmUdPGorXIQHjdPvV6JQSYhQDI41MyI8c+IieQUdIDs5XAMHtDDw==", + "dev": true, + "requires": { + "@ampproject/remapping": "^2.2.1", + "c8": "^7.14.0", + "magic-string": "^0.30.1", + "picocolors": "^1.0.0", + "std-env": "^3.3.3" + } + }, + "@vitest/expect": { + "version": "0.33.0", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-0.33.0.tgz", + "integrity": "sha512-sVNf+Gla3mhTCxNJx+wJLDPp/WcstOe0Ksqz4Vec51MmgMth/ia0MGFEkIZmVGeTL5HtjYR4Wl/ZxBxBXZJTzQ==", + "dev": true, + "requires": { + "@vitest/spy": "0.33.0", + "@vitest/utils": "0.33.0", + "chai": "^4.3.7" + } + }, + "@vitest/runner": { + "version": "0.33.0", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-0.33.0.tgz", + "integrity": "sha512-UPfACnmCB6HKRHTlcgCoBh6ppl6fDn+J/xR8dTufWiKt/74Y9bHci5CKB8tESSV82zKYtkBJo9whU3mNvfaisg==", + "dev": true, + "requires": { + "@vitest/utils": "0.33.0", + "p-limit": "^4.0.0", + "pathe": "^1.1.1" + }, + "dependencies": { + "p-limit": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", + "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", + "dev": true, + "requires": { + "yocto-queue": "^1.0.0" + } + }, + "yocto-queue": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", + "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", + "dev": true + } + } + }, + "@vitest/snapshot": { + "version": "0.33.0", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-0.33.0.tgz", + "integrity": "sha512-tJjrl//qAHbyHajpFvr8Wsk8DIOODEebTu7pgBrP07iOepR5jYkLFiqLq2Ltxv+r0uptUb4izv1J8XBOwKkVYA==", + "dev": true, + "requires": { + "magic-string": "^0.30.1", + "pathe": "^1.1.1", + "pretty-format": "^29.5.0" + } + }, + "@vitest/spy": { + "version": "0.33.0", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-0.33.0.tgz", + "integrity": "sha512-Kv+yZ4hnH1WdiAkPUQTpRxW8kGtH8VRTnus7ZTGovFYM1ZezJpvGtb9nPIjPnptHbsyIAxYZsEpVPYgtpjGnrg==", + "dev": true, + "requires": { + "tinyspy": "^2.1.1" + } + }, + "@vitest/utils": { + "version": "0.33.0", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-0.33.0.tgz", + "integrity": "sha512-pF1w22ic965sv+EN6uoePkAOTkAPWM03Ri/jXNyMIKBb/XHLDPfhLvf/Fa9g0YECevAIz56oVYXhodLvLQ/awA==", + "dev": true, + "requires": { + "diff-sequences": "^29.4.3", + "loupe": "^2.3.6", + "pretty-format": "^29.5.0" + } + }, + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true + }, + "accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "requires": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + } + }, + "acorn": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", + "dev": true + }, + "acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "dev": true + }, + "agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "requires": { + "debug": "4" + } + }, + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "aproba": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", + "dev": true + }, + "are-we-there-yet": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", + "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", + "dev": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + } + }, + "arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true + }, + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" + }, + "array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true + }, + "assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", + "dev": true + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "dev": true + }, + "axios": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.4.0.tgz", + "integrity": "sha512-S4XCWMEmzvo64T9GfvQDOXgYRDJ/wsSZc7Jvdgx5u1sd0JwsuPLqb3SYmusag+edF6ziyMensPVqLTSc1PiSEA==", + "requires": { + "follow-redirects": "^1.15.0", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true + }, + "binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true + }, + "bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dev": true, + "requires": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "body-parser": { + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", + "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", + "requires": { + "bytes": "3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + } + } + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" + }, + "c8": { + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/c8/-/c8-7.14.0.tgz", + "integrity": "sha512-i04rtkkcNcCf7zsQcSv/T9EbUn4RXQ6mropeMcjFOsQXQ0iGLAr/xT6TImQg4+U9hmNpN9XdvPkjUL1IzbgxJw==", + "dev": true, + "requires": { + "@bcoe/v8-coverage": "^0.2.3", + "@istanbuljs/schema": "^0.1.3", + "find-up": "^5.0.0", + "foreground-child": "^2.0.0", + "istanbul-lib-coverage": "^3.2.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-reports": "^3.1.4", + "rimraf": "^3.0.2", + "test-exclude": "^6.0.0", + "v8-to-istanbul": "^9.0.0", + "yargs": "^16.2.0", + "yargs-parser": "^20.2.9" + } + }, + "cac": { + "version": "6.7.14", + "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", + "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", + "dev": true + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "chai": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.7.tgz", + "integrity": "sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==", + "dev": true, + "requires": { + "assertion-error": "^1.1.0", + "check-error": "^1.0.2", + "deep-eql": "^4.1.2", + "get-func-name": "^2.0.0", + "loupe": "^2.3.1", + "pathval": "^1.1.1", + "type-detect": "^4.0.5" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "check-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", + "integrity": "sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==", + "dev": true + }, + "chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "requires": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "fsevents": "~2.3.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + } + }, + "chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "dev": true + }, + "cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "dev": true + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", + "dev": true + }, + "content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "requires": { + "safe-buffer": "5.2.1" + } + }, + "content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==" + }, + "convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true + }, + "cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==" + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" + }, + "core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "dev": true + }, + "create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "dev": true, + "requires": { + "mimic-response": "^3.1.0" + } + }, + "deep-eql": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz", + "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==", + "dev": true, + "requires": { + "type-detect": "^4.0.0" + } + }, + "deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "dev": true + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" + }, + "delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", + "dev": true + }, + "depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" + }, + "destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==" + }, + "detect-libc": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz", + "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==", + "dev": true + }, + "diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true + }, + "diff-sequences": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.4.3.tgz", + "integrity": "sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA==", + "dev": true + }, + "dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "requires": { + "path-type": "^4.0.0" + } + }, + "dotenv": { + "version": "16.3.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.3.1.tgz", + "integrity": "sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==" + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==" + }, + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "requires": { + "once": "^1.4.0" + } + }, + "esbuild": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.19.tgz", + "integrity": "sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==", + "dev": true, + "requires": { + "@esbuild/android-arm": "0.17.19", + "@esbuild/android-arm64": "0.17.19", + "@esbuild/android-x64": "0.17.19", + "@esbuild/darwin-arm64": "0.17.19", + "@esbuild/darwin-x64": "0.17.19", + "@esbuild/freebsd-arm64": "0.17.19", + "@esbuild/freebsd-x64": "0.17.19", + "@esbuild/linux-arm": "0.17.19", + "@esbuild/linux-arm64": "0.17.19", + "@esbuild/linux-ia32": "0.17.19", + "@esbuild/linux-loong64": "0.17.19", + "@esbuild/linux-mips64el": "0.17.19", + "@esbuild/linux-ppc64": "0.17.19", + "@esbuild/linux-riscv64": "0.17.19", + "@esbuild/linux-s390x": "0.17.19", + "@esbuild/linux-x64": "0.17.19", + "@esbuild/netbsd-x64": "0.17.19", + "@esbuild/openbsd-x64": "0.17.19", + "@esbuild/sunos-x64": "0.17.19", + "@esbuild/win32-arm64": "0.17.19", + "@esbuild/win32-ia32": "0.17.19", + "@esbuild/win32-x64": "0.17.19" + } + }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==" + }, + "expand-template": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", + "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", + "dev": true + }, + "express": { + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "requires": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.1", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.5.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "dependencies": { + "body-parser": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "requires": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + } + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "raw-body": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "requires": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + } + } + } + }, + "fast-glob": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.0.tgz", + "integrity": "sha512-ChDuvbOypPuNjO8yIDf36x7BlZX1smcUMTTcyoIjycexOxd6DFsKsg21qVBzEmr3G7fUKIRy2/psii+CIUt7FA==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + } + }, + "fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "dev": true, + "requires": { + "reusify": "^1.0.4" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + } + } + }, + "find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "requires": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + } + }, + "follow-redirects": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==" + }, + "foreground-child": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", + "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.0", + "signal-exit": "^3.0.2" + } + }, + "form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + }, + "forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==" + }, + "from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "dev": true + }, + "fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "requires": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dev": true, + "requires": { + "minipass": "^3.0.0" + }, + "dependencies": { + "minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + } + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "optional": true + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "gauge": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", + "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", + "dev": true, + "requires": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.2", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.1", + "object-assign": "^4.1.1", + "signal-exit": "^3.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.2" + } + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" + }, + "get-func-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", + "integrity": "sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==", + "dev": true + }, + "get-intrinsic": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" + } + }, + "github-from-package": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", + "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==", + "dev": true + }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "requires": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + } + }, + "globrex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz", + "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==", + "dev": true + }, + "google-protobuf": { + "version": "3.21.2", + "resolved": "https://registry.npmjs.org/google-protobuf/-/google-protobuf-3.21.2.tgz", + "integrity": "sha512-3MSOYFO5U9mPGikIYCzK0SaThypfGgS6bHqrUGXG3DPHCrb+txNqeEcns1W0lkGfk0rCyNXm7xB9rMxnCiZOoA==" + }, + "graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true + }, + "grpc-server-reflection": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/grpc-server-reflection/-/grpc-server-reflection-0.1.5.tgz", + "integrity": "sha512-i69RYu6v65enzknNAPUgerFuVQfo+L3n9g4c1A/Sv5jUHMpxMIjSbBA+YWls9Sr4Flac4oohp4Gx8f389CaHuw==", + "requires": { + "google-protobuf": "^3.19.1" + } + }, + "grpc-tools": { + "version": "1.12.4", + "resolved": "https://registry.npmjs.org/grpc-tools/-/grpc-tools-1.12.4.tgz", + "integrity": "sha512-5+mLAJJma3BjnW/KQp6JBjUMgvu7Mu3dBvBPd1dcbNIb+qiR0817zDpgPjS7gRb+l/8EVNIa3cB02xI9JLToKg==", + "dev": true, + "requires": { + "@mapbox/node-pre-gyp": "^1.0.5" + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==" + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" + }, + "has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", + "dev": true + }, + "html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, + "http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "requires": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + } + }, + "https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dev": true, + "requires": { + "agent-base": "6", + "debug": "4" + } + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true + }, + "ignore": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "dev": true + }, + "ignore-by-default": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", + "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true + }, + "into-stream": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/into-stream/-/into-stream-6.0.0.tgz", + "integrity": "sha512-XHbaOAvP+uFKUFsOgoNPRjLkwB+I22JFPFe5OjTkQ0nwgj6+pSjb4NmB6VMxaPshLiOf+zcpOCBQuLwC1KHhZA==", + "dev": true, + "requires": { + "from2": "^2.3.0", + "p-is-promise": "^3.0.0" + } + }, + "ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-core-module": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz", + "integrity": "sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" + }, + "is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "istanbul-lib-coverage": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", + "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", + "dev": true + }, + "istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "dev": true, + "requires": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" + } + }, + "istanbul-reports": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", + "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", + "dev": true, + "requires": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + } + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true + }, + "json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true + }, + "jsonc-parser": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", + "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", + "dev": true + }, + "jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" + } + }, + "local-pkg": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.4.3.tgz", + "integrity": "sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==", + "dev": true + }, + "locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "requires": { + "p-locate": "^5.0.0" + } + }, + "lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==" + }, + "long": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", + "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" + }, + "loupe": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.6.tgz", + "integrity": "sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==", + "dev": true, + "requires": { + "get-func-name": "^2.0.0" + } + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "magic-string": { + "version": "0.30.1", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.1.tgz", + "integrity": "sha512-mbVKXPmS0z0G4XqFDCTllmDQ6coZzn94aMlb0o/A4HEHJCKcanlDZwYJgwnkmgD3jyWhUgj9VsPrfd972yPffA==", + "dev": true, + "requires": { + "@jridgewell/sourcemap-codec": "^1.4.15" + } + }, + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "requires": { + "semver": "^6.0.0" + }, + "dependencies": { + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true + } + } + }, + "make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==" + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" + }, + "merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==" + }, + "micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "requires": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + } + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" + }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "requires": { + "mime-db": "1.52.0" + } + }, + "mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "dev": true + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true + }, + "minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "dev": true + }, + "minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dev": true, + "requires": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "dependencies": { + "minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + } + } + }, + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true + }, + "mkdirp-classic": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", + "dev": true + }, + "mlly": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.4.0.tgz", + "integrity": "sha512-ua8PAThnTwpprIaU47EPeZ/bPUVp2QYBbWMphUQpVdBI3Lgqzm5KZQ45Agm3YJedHXaIHl6pBGabaLSUPPSptg==", + "dev": true, + "requires": { + "acorn": "^8.9.0", + "pathe": "^1.1.1", + "pkg-types": "^1.0.3", + "ufo": "^1.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "multistream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/multistream/-/multistream-4.1.0.tgz", + "integrity": "sha512-J1XDiAmmNpRCBfIWJv+n0ymC4ABcf/Pl+5YvC5B/D2f/2+8PtHvCNxMPKiQcZyi922Hq69J2YOpb1pTywfifyw==", + "dev": true, + "requires": { + "once": "^1.4.0", + "readable-stream": "^3.6.0" + } + }, + "nanoid": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", + "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "dev": true + }, + "napi-build-utils": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", + "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==", + "dev": true + }, + "negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==" + }, + "node-abi": { + "version": "3.45.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.45.0.tgz", + "integrity": "sha512-iwXuFrMAcFVi/ZoZiqq8BzAdsLw9kxDfTC0HMyjXfSL/6CSDAGD5UmR7azrAgWV1zKYq7dUUMj4owusBWKLsiQ==", + "dev": true, + "requires": { + "semver": "^7.3.5" + } + }, + "node-fetch": { + "version": "2.6.12", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.12.tgz", + "integrity": "sha512-C/fGU2E8ToujUivIO0H+tpQ6HWo4eEmchoPIoXtxCrVghxdKq+QOHqEZW7tuP3KlV3bC8FRMO5nMCC7Zm1VP6g==", + "dev": true, + "requires": { + "whatwg-url": "^5.0.0" + } + }, + "nodemon": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.0.1.tgz", + "integrity": "sha512-g9AZ7HmkhQkqXkRc20w+ZfQ73cHLbE8hnPbtaFbFtCumZsjyMhKk9LajQ07U5Ux28lvFjZ5X7HvWR1xzU8jHVw==", + "dev": true, + "requires": { + "chokidar": "^3.5.2", + "debug": "^3.2.7", + "ignore-by-default": "^1.0.1", + "minimatch": "^3.1.2", + "pstree.remy": "^1.1.8", + "semver": "^7.5.3", + "simple-update-notifier": "^2.0.0", + "supports-color": "^5.5.0", + "touch": "^3.1.0", + "undefsafe": "^2.0.5" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "dev": true, + "requires": { + "abbrev": "1" + } + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, + "npmlog": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", + "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", + "dev": true, + "requires": { + "are-we-there-yet": "^2.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^3.0.0", + "set-blocking": "^2.0.0" + } + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true + }, + "object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==" + }, + "on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "requires": { + "ee-first": "1.1.1" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "p-is-promise": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-3.0.0.tgz", + "integrity": "sha512-Wo8VsW4IRQSKVXsJCn7TomUaVtyfjVDn3nUP7kE967BQk0CwFpdbZs0X0uk5sW9mkBa9eNM7hCMaG93WUAwxYQ==", + "dev": true + }, + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "requires": { + "yocto-queue": "^0.1.0" + } + }, + "p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "requires": { + "p-limit": "^3.0.2" + } + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" + }, + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true + }, + "pathe": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.1.tgz", + "integrity": "sha512-d+RQGp0MAYTIaDBIMmOfMwz3E+LOZnxx1HZd5R18mmCZY0QBlK0LDZfPc8FW8Ed2DlvsuE6PRjroDY+wg4+j/Q==", + "dev": true + }, + "pathval": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", + "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", + "dev": true + }, + "picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true + }, + "pkg": { + "version": "5.8.1", + "resolved": "https://registry.npmjs.org/pkg/-/pkg-5.8.1.tgz", + "integrity": "sha512-CjBWtFStCfIiT4Bde9QpJy0KeH19jCfwZRJqHFDFXfhUklCx8JoFmMj3wgnEYIwGmZVNkhsStPHEOnrtrQhEXA==", + "dev": true, + "requires": { + "@babel/generator": "7.18.2", + "@babel/parser": "7.18.4", + "@babel/types": "7.19.0", + "chalk": "^4.1.2", + "fs-extra": "^9.1.0", + "globby": "^11.1.0", + "into-stream": "^6.0.0", + "is-core-module": "2.9.0", + "minimist": "^1.2.6", + "multistream": "^4.1.0", + "pkg-fetch": "3.4.2", + "prebuild-install": "7.1.1", + "resolve": "^1.22.0", + "stream-meter": "^1.0.4" + } + }, + "pkg-fetch": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/pkg-fetch/-/pkg-fetch-3.4.2.tgz", + "integrity": "sha512-0+uijmzYcnhC0hStDjm/cl2VYdrmVVBpe7Q8k9YBojxmR5tG8mvR9/nooQq3QSXiQqORDVOTY3XqMEqJVIzkHA==", + "dev": true, + "requires": { + "chalk": "^4.1.2", + "fs-extra": "^9.1.0", + "https-proxy-agent": "^5.0.0", + "node-fetch": "^2.6.6", + "progress": "^2.0.3", + "semver": "^7.3.5", + "tar-fs": "^2.1.1", + "yargs": "^16.2.0" + } + }, + "pkg-types": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.0.3.tgz", + "integrity": "sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==", + "dev": true, + "requires": { + "jsonc-parser": "^3.2.0", + "mlly": "^1.2.0", + "pathe": "^1.1.0" + } + }, + "postcss": { + "version": "8.4.26", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.26.tgz", + "integrity": "sha512-jrXHFF8iTloAenySjM/ob3gSj7pCu0Ji49hnjqzsgSRa50hkWCKD0HQ+gMNJkW38jBI68MpAAg7ZWwHwX8NMMw==", + "dev": true, + "requires": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + } + }, + "prebuild-install": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.1.tgz", + "integrity": "sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==", + "dev": true, + "requires": { + "detect-libc": "^2.0.0", + "expand-template": "^2.0.3", + "github-from-package": "0.0.0", + "minimist": "^1.2.3", + "mkdirp-classic": "^0.5.3", + "napi-build-utils": "^1.0.1", + "node-abi": "^3.3.0", + "pump": "^3.0.0", + "rc": "^1.2.7", + "simple-get": "^4.0.0", + "tar-fs": "^2.0.0", + "tunnel-agent": "^0.6.0" + } + }, + "pretty-format": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.1.tgz", + "integrity": "sha512-7jRj+yXO0W7e4/tSJKoR7HRIHLPPjtNaUGG2xxKQnGvPNRkgWcQ0AZX6P4KBRJN4FcTBWb3sa7DVUJmocYuoog==", + "dev": true, + "requires": { + "@jest/schemas": "^29.6.0", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true + } + } + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true + }, + "protobufjs": { + "version": "7.2.4", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.2.4.tgz", + "integrity": "sha512-AT+RJgD2sH8phPmCf7OUZR8xGdcJRga4+1cOaXJ64hvcSkVhNcRHOwIxUatPH15+nj59WAGTDv3LSGZPEQbJaQ==", + "requires": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/node": ">=13.7.0", + "long": "^5.0.0" + }, + "dependencies": { + "long": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", + "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==" + } + } + }, + "proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "requires": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + } + }, + "proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, + "pstree.remy": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", + "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", + "dev": true + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "requires": { + "side-channel": "^1.0.4" + } + }, + "queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true + }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" + }, + "raw-body": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "requires": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + } + }, + "rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dev": true, + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + } + }, + "react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", + "dev": true + }, + "readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "requires": { + "picomatch": "^2.2.1" + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==" + }, + "resolve": { + "version": "1.22.2", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", + "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", + "dev": true, + "requires": { + "is-core-module": "^2.11.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "dependencies": { + "is-core-module": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz", + "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + } + } + }, + "reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "rollup": { + "version": "3.26.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.26.2.tgz", + "integrity": "sha512-6umBIGVz93er97pMgQO08LuH3m6PUb3jlDUUGFsNJB6VgTCUaDFpupf5JfU30529m/UKOgmiX+uY6Sx8cOYpLA==", + "dev": true, + "requires": { + "fsevents": "~2.3.2" + } + }, + "run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "requires": { + "queue-microtask": "^1.2.2" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "requires": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + }, + "dependencies": { + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + } + } + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + } + } + }, + "serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + } + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "dev": true + }, + "setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, + "siginfo": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", + "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", + "dev": true + }, + "signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "simple-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", + "dev": true + }, + "simple-get": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", + "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", + "dev": true, + "requires": { + "decompress-response": "^6.0.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } + }, + "simple-update-notifier": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", + "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==", + "dev": true, + "requires": { + "semver": "^7.5.3" + } + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true + }, + "source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "dev": true + }, + "stackback": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", + "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", + "dev": true + }, + "statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" + }, + "std-env": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.3.3.tgz", + "integrity": "sha512-Rz6yejtVyWnVjC1RFvNmYL10kgjC49EOghxWn0RFqlCHGFpQx+Xe7yW3I4ceK1SGrWIGMjD5Kbue8W/udkbMJg==", + "dev": true + }, + "stream-meter": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/stream-meter/-/stream-meter-1.0.4.tgz", + "integrity": "sha512-4sOEtrbgFotXwnEuzzsQBYEV1elAeFSO8rSGeTwabuX1RRn/kEq9JVH7I0MRBhKVRR0sJkr0M0QCH7yOLf9fhQ==", + "dev": true, + "requires": { + "readable-stream": "^2.1.4" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "requires": { + "safe-buffer": "~5.2.0" + } + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true + }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "dev": true + }, + "strip-literal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-1.0.1.tgz", + "integrity": "sha512-QZTsipNpa2Ppr6v1AmJHESqJ3Uz247MUS0OjrnnZjFAvEoWqxuyFuXn2xLgMtRnijJShAa1HL0gtJyUs7u7n3Q==", + "dev": true, + "requires": { + "acorn": "^8.8.2" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true + }, + "tar": { + "version": "6.1.15", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.15.tgz", + "integrity": "sha512-/zKt9UyngnxIT/EAGYuxaMYgOIJiP81ab9ZfkILq4oNLPFX50qyYmu7jRj9qeXoxmJHjGlbH0+cm2uy1WCs10A==", + "dev": true, + "requires": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + } + }, + "tar-fs": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", + "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", + "dev": true, + "requires": { + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.1.4" + }, + "dependencies": { + "chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "dev": true + } + } + }, + "tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "dev": true, + "requires": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + } + }, + "test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "requires": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + } + }, + "tinybench": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.5.0.tgz", + "integrity": "sha512-kRwSG8Zx4tjF9ZiyH4bhaebu+EDz1BOx9hOigYHlUW4xxI/wKIUQUqo018UlU4ar6ATPBsaMrdbKZ+tmPdohFA==", + "dev": true + }, + "tinypool": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-0.6.0.tgz", + "integrity": "sha512-FdswUUo5SxRizcBc6b1GSuLpLjisa8N8qMyYoP3rl+bym+QauhtJP5bvZY1ytt8krKGmMLYIRl36HBZfeAoqhQ==", + "dev": true + }, + "tinyspy": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-2.1.1.tgz", + "integrity": "sha512-XPJL2uSzcOyBMky6OFrusqWlzfFrXtE0hPuMgW8A2HmaqrPo4ZQHRN/V0QXN3FSjKxpsbRrFc5LI7KOwBsT1/w==", + "dev": true + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "dev": true + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + }, + "toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" + }, + "touch": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", + "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", + "dev": true, + "requires": { + "nopt": "~1.0.10" + }, + "dependencies": { + "nopt": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", + "integrity": "sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==", + "dev": true, + "requires": { + "abbrev": "1" + } + } + } + }, + "tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "dev": true + }, + "ts-essentials": { + "version": "9.3.2", + "resolved": "https://registry.npmjs.org/ts-essentials/-/ts-essentials-9.3.2.tgz", + "integrity": "sha512-JxKJzuWqH1MmH4ZFHtJzGEhkfN3QvVR3C3w+4BIoWeoY68UVVoA2Np/Bca9z0IPSErVCWhv439aT0We4Dks8kQ==", + "dev": true, + "requires": {} + }, + "ts-node": { + "version": "10.9.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", + "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", + "dev": true, + "requires": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + } + }, + "tsconfck": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/tsconfck/-/tsconfck-2.1.1.tgz", + "integrity": "sha512-ZPCkJBKASZBmBUNqGHmRhdhM8pJYDdOXp4nRgj/O0JwUwsMq50lCDRQP/M5GBNAA0elPrq4gAeu4dkaVCuKWww==", + "dev": true, + "requires": {} + }, + "tsconfig-paths": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", + "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==", + "dev": true, + "requires": { + "json5": "^2.2.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "dev": true, + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true + }, + "type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } + }, + "typescript": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.2.tgz", + "integrity": "sha512-wVORMBGO/FAs/++blGNeAVdbNKtIh1rbBL2EyQ1+J9lClJ93KiiKe8PmFIVdXhHcyv44SL9oglmfeSsndo0jRw==", + "dev": true + }, + "ufo": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.1.2.tgz", + "integrity": "sha512-TrY6DsjTQQgyS3E3dBaOXf0TpPD8u9FVrVYmKVegJuFw51n/YB9XPt+U6ydzFG5ZIN7+DIjPbNmXoBj9esYhgQ==", + "dev": true + }, + "undefsafe": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", + "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", + "dev": true + }, + "universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==" + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==" + }, + "v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true + }, + "v8-to-istanbul": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.1.0.tgz", + "integrity": "sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA==", + "dev": true, + "requires": { + "@jridgewell/trace-mapping": "^0.3.12", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^1.6.0" + } + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==" + }, + "vite": { + "version": "4.4.4", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.4.4.tgz", + "integrity": "sha512-4mvsTxjkveWrKDJI70QmelfVqTm+ihFAb6+xf4sjEU2TmUCTlVX87tmg/QooPEMQb/lM9qGHT99ebqPziEd3wg==", + "dev": true, + "requires": { + "esbuild": "^0.18.10", + "fsevents": "~2.3.2", + "postcss": "^8.4.25", + "rollup": "^3.25.2" + }, + "dependencies": { + "@esbuild/android-arm": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.12.tgz", + "integrity": "sha512-LIxaNIQfkFZbTLb4+cX7dozHlAbAshhFE5PKdro0l+FnCpx1GDJaQ2WMcqm+ToXKMt8p8Uojk/MFRuGyz3V5Sw==", + "dev": true, + "optional": true + }, + "@esbuild/android-arm64": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.12.tgz", + "integrity": "sha512-BMAlczRqC/LUt2P97E4apTBbkvS9JTJnp2DKFbCwpZ8vBvXVbNdqmvzW/OsdtI/+mGr+apkkpqGM8WecLkPgrA==", + "dev": true, + "optional": true + }, + "@esbuild/android-x64": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.12.tgz", + "integrity": "sha512-zU5MyluNsykf5cOJ0LZZZjgAHbhPJ1cWfdH1ZXVMXxVMhEV0VZiZXQdwBBVvmvbF28EizeK7obG9fs+fpmS0eQ==", + "dev": true, + "optional": true + }, + "@esbuild/darwin-arm64": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.12.tgz", + "integrity": "sha512-zUZMep7YONnp6954QOOwEBwFX9svlKd3ov6PkxKd53LGTHsp/gy7vHaPGhhjBmEpqXEXShi6dddjIkmd+NgMsA==", + "dev": true, + "optional": true + }, + "@esbuild/darwin-x64": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.12.tgz", + "integrity": "sha512-ohqLPc7i67yunArPj1+/FeeJ7AgwAjHqKZ512ADk3WsE3FHU9l+m5aa7NdxXr0HmN1bjDlUslBjWNbFlD9y12Q==", + "dev": true, + "optional": true + }, + "@esbuild/freebsd-arm64": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.12.tgz", + "integrity": "sha512-GIIHtQXqgeOOqdG16a/A9N28GpkvjJnjYMhOnXVbn3EDJcoItdR58v/pGN31CHjyXDc8uCcRnFWmqaJt24AYJg==", + "dev": true, + "optional": true + }, + "@esbuild/freebsd-x64": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.12.tgz", + "integrity": "sha512-zK0b9a1/0wZY+6FdOS3BpZcPc1kcx2G5yxxfEJtEUzVxI6n/FrC2Phsxj/YblPuBchhBZ/1wwn7AyEBUyNSa6g==", + "dev": true, + "optional": true + }, + "@esbuild/linux-arm": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.12.tgz", + "integrity": "sha512-y75OijvrBE/1XRrXq1jtrJfG26eHeMoqLJ2dwQNwviwTuTtHGCojsDO6BJNF8gU+3jTn1KzJEMETytwsFSvc+Q==", + "dev": true, + "optional": true + }, + "@esbuild/linux-arm64": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.12.tgz", + "integrity": "sha512-JKgG8Q/LL/9sw/iHHxQyVMoQYu3rU3+a5Z87DxC+wAu3engz+EmctIrV+FGOgI6gWG1z1+5nDDbXiRMGQZXqiw==", + "dev": true, + "optional": true + }, + "@esbuild/linux-ia32": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.12.tgz", + "integrity": "sha512-yoRIAqc0B4lDIAAEFEIu9ttTRFV84iuAl0KNCN6MhKLxNPfzwCBvEMgwco2f71GxmpBcTtn7KdErueZaM2rEvw==", + "dev": true, + "optional": true + }, + "@esbuild/linux-loong64": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.12.tgz", + "integrity": "sha512-qYgt3dHPVvf/MgbIBpJ4Sup/yb9DAopZ3a2JgMpNKIHUpOdnJ2eHBo/aQdnd8dJ21X/+sS58wxHtA9lEazYtXQ==", + "dev": true, + "optional": true + }, + "@esbuild/linux-mips64el": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.12.tgz", + "integrity": "sha512-wHphlMLK4ufNOONqukELfVIbnGQJrHJ/mxZMMrP2jYrPgCRZhOtf0kC4yAXBwnfmULimV1qt5UJJOw4Kh13Yfg==", + "dev": true, + "optional": true + }, + "@esbuild/linux-ppc64": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.12.tgz", + "integrity": "sha512-TeN//1Ft20ZZW41+zDSdOI/Os1bEq5dbvBvYkberB7PHABbRcsteeoNVZFlI0YLpGdlBqohEpjrn06kv8heCJg==", + "dev": true, + "optional": true + }, + "@esbuild/linux-riscv64": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.12.tgz", + "integrity": "sha512-AgUebVS4DoAblBgiB2ACQ/8l4eGE5aWBb8ZXtkXHiET9mbj7GuWt3OnsIW/zX+XHJt2RYJZctbQ2S/mDjbp0UA==", + "dev": true, + "optional": true + }, + "@esbuild/linux-s390x": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.12.tgz", + "integrity": "sha512-dJ3Rb3Ei2u/ysSXd6pzleGtfDdc2MuzKt8qc6ls8vreP1G3B7HInX3i7gXS4BGeVd24pp0yqyS7bJ5NHaI9ing==", + "dev": true, + "optional": true + }, + "@esbuild/linux-x64": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.12.tgz", + "integrity": "sha512-OrNJMGQbPaVyHHcDF8ybNSwu7TDOfX8NGpXCbetwOSP6txOJiWlgQnRymfC9ocR1S0Y5PW0Wb1mV6pUddqmvmQ==", + "dev": true, + "optional": true + }, + "@esbuild/netbsd-x64": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.12.tgz", + "integrity": "sha512-55FzVCAiwE9FK8wWeCRuvjazNRJ1QqLCYGZVB6E8RuQuTeStSwotpSW4xoRGwp3a1wUsaVCdYcj5LGCASVJmMg==", + "dev": true, + "optional": true + }, + "@esbuild/openbsd-x64": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.12.tgz", + "integrity": "sha512-qnluf8rfb6Y5Lw2tirfK2quZOBbVqmwxut7GPCIJsM8lc4AEUj9L8y0YPdLaPK0TECt4IdyBdBD/KRFKorlK3g==", + "dev": true, + "optional": true + }, + "@esbuild/sunos-x64": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.12.tgz", + "integrity": "sha512-+RkKpVQR7bICjTOPUpkTBTaJ4TFqQBX5Ywyd/HSdDkQGn65VPkTsR/pL4AMvuMWy+wnXgIl4EY6q4mVpJal8Kg==", + "dev": true, + "optional": true + }, + "@esbuild/win32-arm64": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.12.tgz", + "integrity": "sha512-GNHuciv0mFM7ouzsU0+AwY+7eV4Mgo5WnbhfDCQGtpvOtD1vbOiRjPYG6dhmMoFyBjj+pNqQu2X+7DKn0KQ/Gw==", + "dev": true, + "optional": true + }, + "@esbuild/win32-ia32": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.12.tgz", + "integrity": "sha512-kR8cezhYipbbypGkaqCTWIeu4zID17gamC8YTPXYtcN3E5BhhtTnwKBn9I0PJur/T6UVwIEGYzkffNL0lFvxEw==", + "dev": true, + "optional": true + }, + "@esbuild/win32-x64": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.12.tgz", + "integrity": "sha512-O0UYQVkvfM/jO8a4OwoV0mAKSJw+mjWTAd1MJd/1FCX6uiMdLmMRPK/w6e9OQ0ob2WGxzIm9va/KG0Ja4zIOgg==", + "dev": true, + "optional": true + }, + "esbuild": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.12.tgz", + "integrity": "sha512-XuOVLDdtsDslXStStduT41op21Ytmf4/BDS46aa3xPJ7X5h2eMWBF1oAe3QjUH3bDksocNXgzGUZ7XHIBya6Tg==", + "dev": true, + "requires": { + "@esbuild/android-arm": "0.18.12", + "@esbuild/android-arm64": "0.18.12", + "@esbuild/android-x64": "0.18.12", + "@esbuild/darwin-arm64": "0.18.12", + "@esbuild/darwin-x64": "0.18.12", + "@esbuild/freebsd-arm64": "0.18.12", + "@esbuild/freebsd-x64": "0.18.12", + "@esbuild/linux-arm": "0.18.12", + "@esbuild/linux-arm64": "0.18.12", + "@esbuild/linux-ia32": "0.18.12", + "@esbuild/linux-loong64": "0.18.12", + "@esbuild/linux-mips64el": "0.18.12", + "@esbuild/linux-ppc64": "0.18.12", + "@esbuild/linux-riscv64": "0.18.12", + "@esbuild/linux-s390x": "0.18.12", + "@esbuild/linux-x64": "0.18.12", + "@esbuild/netbsd-x64": "0.18.12", + "@esbuild/openbsd-x64": "0.18.12", + "@esbuild/sunos-x64": "0.18.12", + "@esbuild/win32-arm64": "0.18.12", + "@esbuild/win32-ia32": "0.18.12", + "@esbuild/win32-x64": "0.18.12" + } + } + } + }, + "vite-node": { + "version": "0.33.0", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-0.33.0.tgz", + "integrity": "sha512-19FpHYbwWWxDr73ruNahC+vtEdza52kA90Qb3La98yZ0xULqV8A5JLNPUff0f5zID4984tW7l3DH2przTJUZSw==", + "dev": true, + "requires": { + "cac": "^6.7.14", + "debug": "^4.3.4", + "mlly": "^1.4.0", + "pathe": "^1.1.1", + "picocolors": "^1.0.0", + "vite": "^3.0.0 || ^4.0.0" + } + }, + "vite-tsconfig-paths": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/vite-tsconfig-paths/-/vite-tsconfig-paths-4.2.0.tgz", + "integrity": "sha512-jGpus0eUy5qbbMVGiTxCL1iB9ZGN6Bd37VGLJU39kTDD6ZfULTTb1bcc5IeTWqWJKiWV5YihCaibeASPiGi8kw==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "globrex": "^0.1.2", + "tsconfck": "^2.1.0" + } + }, + "vitest": { + "version": "0.33.0", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-0.33.0.tgz", + "integrity": "sha512-1CxaugJ50xskkQ0e969R/hW47za4YXDUfWJDxip1hwbnhUjYolpfUn2AMOulqG/Dtd9WYAtkHmM/m3yKVrEejQ==", + "dev": true, + "requires": { + "@types/chai": "^4.3.5", + "@types/chai-subset": "^1.3.3", + "@types/node": "*", + "@vitest/expect": "0.33.0", + "@vitest/runner": "0.33.0", + "@vitest/snapshot": "0.33.0", + "@vitest/spy": "0.33.0", + "@vitest/utils": "0.33.0", + "acorn": "^8.9.0", + "acorn-walk": "^8.2.0", + "cac": "^6.7.14", + "chai": "^4.3.7", + "debug": "^4.3.4", + "local-pkg": "^0.4.3", + "magic-string": "^0.30.1", + "pathe": "^1.1.1", + "picocolors": "^1.0.0", + "std-env": "^3.3.3", + "strip-literal": "^1.0.1", + "tinybench": "^2.5.0", + "tinypool": "^0.6.0", + "vite": "^3.0.0 || ^4.0.0", + "vite-node": "0.33.0", + "why-is-node-running": "^2.2.2" + } + }, + "vitest-mock-extended": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/vitest-mock-extended/-/vitest-mock-extended-1.1.4.tgz", + "integrity": "sha512-MKPdepFjk0CE7Ocb5txntHK/sloHO9s0Kk9dr630uL03shRSHMkZtSs5CBPsbJ8K/CvYLv0GHUmMt2zWks2eXg==", + "dev": true, + "requires": { + "ts-essentials": "^9.3.2" + } + }, + "webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "dev": true + }, + "whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dev": true, + "requires": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "why-is-node-running": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.2.2.tgz", + "integrity": "sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==", + "dev": true, + "requires": { + "siginfo": "^2.0.0", + "stackback": "0.0.2" + } + }, + "wide-align": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", + "dev": true, + "requires": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, + "wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==" + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "requires": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + } + }, + "yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==" + }, + "yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true + }, + "yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true + } + } +} diff --git a/services/gateway/package.json b/services/gateway/package.json new file mode 100644 index 00000000..8cec896d --- /dev/null +++ b/services/gateway/package.json @@ -0,0 +1,54 @@ +{ + "name": "@goodfood/gateway", + "bin": "dist/index.js", + "version": "1.0.0", + "scripts": { + "start": "node dist/index.js", + "dev": "nodemon --watch 'src/**/*.ts' --exec 'ts-node' src/server.ts", + "build": "esbuild src/server.ts --bundle --platform=node --target=node18 --outfile=dist/index.js", + "test": "vitest", + "coverage": "vitest --coverage", + "pkg": "pkg ." + }, + "dependencies": { + "@grpc/grpc-js": "1.8.14", + "@grpc/proto-loader": "0.7.6", + "@types/express": "^4.17.17", + "axios": "^1.4.0", + "body-parser": "^1.20.2", + "dotenv": "^16.0.3", + "express": "^4.18.2", + "grpc-server-reflection": "^0.1.5", + "protobufjs": "^7.2.4" + }, + "devDependencies": { + "@types/amqplib": "^0.10.1", + "@types/node": "^18.15.9", + "@vitest/coverage-c8": "^0.33.0", + "esbuild": "^0.17.18", + "grpc-tools": "^1.12.4", + "nodemon": "^3.0.1", + "pkg": "^5.8.1", + "ts-node": "10.9.1", + "tsconfig-paths": "^4.2.0", + "typescript": "5.0.2", + "vite-tsconfig-paths": "^4.2.0", + "vitest": "^0.33.0", + "vitest-mock-extended": "^1.1.4" + }, + "pkg": { + "scripts": "./src/dist/index.js", + "assets": [ + "../proto/**/*" + ], + "targets": [ + "node18-macos-arm64", + "node18-linux-x64", + "node18-linux-arm64" + ], + "outputPath": "bin/" + }, + "keywords": [], + "author": "", + "license": "ISC" +} diff --git a/services/gateway/proto b/services/gateway/proto new file mode 120000 index 00000000..4d1e2d8b --- /dev/null +++ b/services/gateway/proto @@ -0,0 +1 @@ +../proto/ \ No newline at end of file diff --git a/services/gateway/src/index.ts b/services/gateway/src/index.ts new file mode 100644 index 00000000..4bb2a14d --- /dev/null +++ b/services/gateway/src/index.ts @@ -0,0 +1,17 @@ +import {Request, Response} from "express"; + +const express = require('express'); +const bodyParser = require('body-parser'); + +const app = express(); +app.use(bodyParser.json()); + +const PORT = process.env.PORT || 50000; + +app.get('/', (req: Request, res: Response) => { + res.send('Node.js API Gateway is up and running!'); +}); + +app.listen(PORT, () => { + console.log(`API Gateway is running on port ${PORT}`); +}); \ No newline at end of file diff --git a/services/gateway/tsconfig.json b/services/gateway/tsconfig.json new file mode 100644 index 00000000..f7f47ecc --- /dev/null +++ b/services/gateway/tsconfig.json @@ -0,0 +1,18 @@ +{ + "compilerOptions": { + "sourceMap": true, + "outDir": "dist", + "strict": true, + "lib": ["esnext"], + "esModuleInterop": true, + "baseUrl": ".", + "paths": { + "@order/*": ["src/*"] + } + }, + "include": ["src/**/*.ts"], + "exclude": ["node_modules"], + "ts-node": { + "require": ["tsconfig-paths/register"] + } +} diff --git a/services/gateway/vitest.config.ts b/services/gateway/vitest.config.ts new file mode 100644 index 00000000..773de309 --- /dev/null +++ b/services/gateway/vitest.config.ts @@ -0,0 +1,10 @@ +import { defineConfig } from "vitest/config"; +import tsconfigPaths from "vite-tsconfig-paths"; + +export default defineConfig({ + plugins: [tsconfigPaths()], + base: "/src/tests", + // test: { + // setupFiles: ["./src/tests/setup.ts"], + // }, +}); From 486d00aac372fc791f768b707965587c000ebda2 Mon Sep 17 00:00:00 2001 From: anatole Date: Wed, 19 Jul 2023 00:39:57 +0200 Subject: [PATCH 391/883] feat(user controller): create userController and user grpc client service --- services/gateway/package-lock.json | 8513 ----------------- services/gateway/package.json | 9 +- .../src/controller/user/userController.ts | 31 + services/gateway/src/{index.ts => server.ts} | 3 + services/gateway/src/services/user_service.ts | 6 + services/gateway/src/utils/swagger.utils.js | 17 + services/proto/build-protos.sh | 23 + 7 files changed, 85 insertions(+), 8517 deletions(-) delete mode 100644 services/gateway/package-lock.json create mode 100644 services/gateway/src/controller/user/userController.ts rename services/gateway/src/{index.ts => server.ts} (81%) create mode 100644 services/gateway/src/services/user_service.ts create mode 100644 services/gateway/src/utils/swagger.utils.js create mode 100644 services/proto/build-protos.sh diff --git a/services/gateway/package-lock.json b/services/gateway/package-lock.json deleted file mode 100644 index 54f22426..00000000 --- a/services/gateway/package-lock.json +++ /dev/null @@ -1,8513 +0,0 @@ -{ - "name": "@goodfood/gateway", - "version": "1.0.0", - "lockfileVersion": 2, - "requires": true, - "packages": { - "": { - "name": "@goodfood/gateway", - "version": "1.0.0", - "license": "ISC", - "dependencies": { - "@grpc/grpc-js": "1.8.14", - "@grpc/proto-loader": "0.7.6", - "@types/express": "^4.17.17", - "axios": "^1.4.0", - "body-parser": "^1.20.2", - "dotenv": "^16.0.3", - "express": "^4.18.2", - "grpc-server-reflection": "^0.1.5", - "protobufjs": "^7.2.4" - }, - "bin": { - "gateway": "dist/index.js" - }, - "devDependencies": { - "@types/amqplib": "^0.10.1", - "@types/node": "^18.15.9", - "@vitest/coverage-c8": "^0.33.0", - "esbuild": "^0.17.18", - "grpc-tools": "^1.12.4", - "nodemon": "^3.0.1", - "pkg": "^5.8.1", - "ts-node": "10.9.1", - "tsconfig-paths": "^4.2.0", - "typescript": "5.0.2", - "vite-tsconfig-paths": "^4.2.0", - "vitest": "^0.33.0", - "vitest-mock-extended": "^1.1.4" - } - }, - "node_modules/@ampproject/remapping": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", - "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", - "dev": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/generator": { - "version": "7.18.2", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.2.tgz", - "integrity": "sha512-W1lG5vUwFvfMd8HVXqdfbuG7RuaSrTCCD8cl8fP8wOivdbtbIg2Db3IWUcgvfxKbbn6ZBGYRW/Zk1MIwK49mgw==", - "dev": true, - "dependencies": { - "@babel/types": "^7.18.2", - "@jridgewell/gen-mapping": "^0.3.0", - "jsesc": "^2.5.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", - "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz", - "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.18.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.4.tgz", - "integrity": "sha512-FDge0dFazETFcxGw/EXzOkN8uJp0PC7Qbm+Pe9T+av2zlBpOgunFHkQPPn+eRuClU73JF+98D531UgayY89tow==", - "dev": true, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/types": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.19.0.tgz", - "integrity": "sha512-YuGopBq3ke25BVSiS6fgF49Ul9gH1x70Bcr6bqRLjWCkcX8Hre1/5+z+IiWOIerRMSSEfGZVB9z9kyq7wVs9YA==", - "dev": true, - "dependencies": { - "@babel/helper-string-parser": "^7.18.10", - "@babel/helper-validator-identifier": "^7.18.6", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@bcoe/v8-coverage": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", - "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", - "dev": true - }, - "node_modules/@cspotcode/source-map-support": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", - "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", - "dev": true, - "dependencies": { - "@jridgewell/trace-mapping": "0.3.9" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", - "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", - "dev": true, - "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.19.tgz", - "integrity": "sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.19.tgz", - "integrity": "sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.19.tgz", - "integrity": "sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.19.tgz", - "integrity": "sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.19.tgz", - "integrity": "sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.19.tgz", - "integrity": "sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.19.tgz", - "integrity": "sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.19.tgz", - "integrity": "sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.19.tgz", - "integrity": "sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.19.tgz", - "integrity": "sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.19.tgz", - "integrity": "sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==", - "cpu": [ - "loong64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.19.tgz", - "integrity": "sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==", - "cpu": [ - "mips64el" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.19.tgz", - "integrity": "sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.19.tgz", - "integrity": "sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.19.tgz", - "integrity": "sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.19.tgz", - "integrity": "sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.19.tgz", - "integrity": "sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.19.tgz", - "integrity": "sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.19.tgz", - "integrity": "sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.19.tgz", - "integrity": "sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.19.tgz", - "integrity": "sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.19.tgz", - "integrity": "sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@grpc/grpc-js": { - "version": "1.8.14", - "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.8.14.tgz", - "integrity": "sha512-w84maJ6CKl5aApCMzFll0hxtFNT6or9WwMslobKaqWUEf1K+zhlL43bSQhFreyYWIWR+Z0xnVFC1KtLm4ZpM/A==", - "dependencies": { - "@grpc/proto-loader": "^0.7.0", - "@types/node": ">=12.12.47" - }, - "engines": { - "node": "^8.13.0 || >=10.10.0" - } - }, - "node_modules/@grpc/proto-loader": { - "version": "0.7.6", - "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.6.tgz", - "integrity": "sha512-QyAXR8Hyh7uMDmveWxDSUcJr9NAWaZ2I6IXgAYvQmfflwouTM+rArE2eEaCtLlRqO81j7pRLCt81IefUei6Zbw==", - "dependencies": { - "@types/long": "^4.0.1", - "lodash.camelcase": "^4.3.0", - "long": "^4.0.0", - "protobufjs": "^7.0.0", - "yargs": "^16.2.0" - }, - "bin": { - "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/schemas": { - "version": "29.6.0", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.0.tgz", - "integrity": "sha512-rxLjXyJBTL4LQeJW3aKo0M/+GkCOXsO+8i9Iu7eDb6KwtP65ayoDsitrdPBtujxQ88k4wI2FNYfa6TOGwSn6cQ==", - "dev": true, - "dependencies": { - "@sinclair/typebox": "^0.27.8" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", - "dev": true, - "dependencies": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", - "dev": true - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.18", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", - "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", - "dev": true, - "dependencies": { - "@jridgewell/resolve-uri": "3.1.0", - "@jridgewell/sourcemap-codec": "1.4.14" - } - }, - "node_modules/@jridgewell/trace-mapping/node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", - "dev": true - }, - "node_modules/@mapbox/node-pre-gyp": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.11.tgz", - "integrity": "sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==", - "dev": true, - "dependencies": { - "detect-libc": "^2.0.0", - "https-proxy-agent": "^5.0.0", - "make-dir": "^3.1.0", - "node-fetch": "^2.6.7", - "nopt": "^5.0.0", - "npmlog": "^5.0.1", - "rimraf": "^3.0.2", - "semver": "^7.3.5", - "tar": "^6.1.11" - }, - "bin": { - "node-pre-gyp": "bin/node-pre-gyp" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@protobufjs/aspromise": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", - "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==" - }, - "node_modules/@protobufjs/base64": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", - "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" - }, - "node_modules/@protobufjs/codegen": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", - "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" - }, - "node_modules/@protobufjs/eventemitter": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", - "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==" - }, - "node_modules/@protobufjs/fetch": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", - "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", - "dependencies": { - "@protobufjs/aspromise": "^1.1.1", - "@protobufjs/inquire": "^1.1.0" - } - }, - "node_modules/@protobufjs/float": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", - "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==" - }, - "node_modules/@protobufjs/inquire": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", - "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==" - }, - "node_modules/@protobufjs/path": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", - "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==" - }, - "node_modules/@protobufjs/pool": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", - "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==" - }, - "node_modules/@protobufjs/utf8": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", - "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==" - }, - "node_modules/@sinclair/typebox": { - "version": "0.27.8", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", - "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", - "dev": true - }, - "node_modules/@tsconfig/node10": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", - "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", - "dev": true - }, - "node_modules/@tsconfig/node12": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", - "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", - "dev": true - }, - "node_modules/@tsconfig/node14": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", - "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", - "dev": true - }, - "node_modules/@tsconfig/node16": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", - "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", - "dev": true - }, - "node_modules/@types/amqplib": { - "version": "0.10.1", - "resolved": "https://registry.npmjs.org/@types/amqplib/-/amqplib-0.10.1.tgz", - "integrity": "sha512-j6ANKT79ncUDnAs/+9r9eDujxbeJoTjoVu33gHHcaPfmLQaMhvfbH2GqSe8KUM444epAp1Vl3peVOQfZk3UIqA==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/body-parser": { - "version": "1.19.2", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", - "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", - "dependencies": { - "@types/connect": "*", - "@types/node": "*" - } - }, - "node_modules/@types/chai": { - "version": "4.3.5", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.5.tgz", - "integrity": "sha512-mEo1sAde+UCE6b2hxn332f1g1E8WfYRu6p5SvTKr2ZKC1f7gFJXk4h5PyGP9Dt6gCaG8y8XhwnXWC6Iy2cmBng==", - "dev": true - }, - "node_modules/@types/chai-subset": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/@types/chai-subset/-/chai-subset-1.3.3.tgz", - "integrity": "sha512-frBecisrNGz+F4T6bcc+NLeolfiojh5FxW2klu669+8BARtyQv2C/GkNW6FUodVe4BroGMP/wER/YDGc7rEllw==", - "dev": true, - "dependencies": { - "@types/chai": "*" - } - }, - "node_modules/@types/connect": { - "version": "3.4.35", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", - "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/express": { - "version": "4.17.17", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.17.tgz", - "integrity": "sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==", - "dependencies": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "^4.17.33", - "@types/qs": "*", - "@types/serve-static": "*" - } - }, - "node_modules/@types/express-serve-static-core": { - "version": "4.17.35", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.35.tgz", - "integrity": "sha512-wALWQwrgiB2AWTT91CB62b6Yt0sNHpznUXeZEcnPU3DRdlDIz74x8Qg1UUYKSVFi+va5vKOLYRBI1bRKiLLKIg==", - "dependencies": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*", - "@types/send": "*" - } - }, - "node_modules/@types/http-errors": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.1.tgz", - "integrity": "sha512-/K3ds8TRAfBvi5vfjuz8y6+GiAYBZ0x4tXv1Av6CWBWn0IlADc+ZX9pMq7oU0fNQPnBwIZl3rmeLp6SBApbxSQ==" - }, - "node_modules/@types/istanbul-lib-coverage": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", - "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", - "dev": true - }, - "node_modules/@types/long": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz", - "integrity": "sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==" - }, - "node_modules/@types/mime": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", - "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==" - }, - "node_modules/@types/node": { - "version": "18.15.9", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.9.tgz", - "integrity": "sha512-dUxhiNzBLr6IqlZXz6e/rN2YQXlFgOei/Dxy+e3cyXTJ4txSUbGT2/fmnD6zd/75jDMeW5bDee+YXxlFKHoV0A==" - }, - "node_modules/@types/qs": { - "version": "6.9.7", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", - "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==" - }, - "node_modules/@types/range-parser": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", - "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==" - }, - "node_modules/@types/send": { - "version": "0.17.1", - "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.1.tgz", - "integrity": "sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q==", - "dependencies": { - "@types/mime": "^1", - "@types/node": "*" - } - }, - "node_modules/@types/serve-static": { - "version": "1.15.2", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.2.tgz", - "integrity": "sha512-J2LqtvFYCzaj8pVYKw8klQXrLLk7TBZmQ4ShlcdkELFKGwGMfevMLneMMRkMgZxotOD9wg497LpC7O8PcvAmfw==", - "dependencies": { - "@types/http-errors": "*", - "@types/mime": "*", - "@types/node": "*" - } - }, - "node_modules/@vitest/coverage-c8": { - "version": "0.33.0", - "resolved": "https://registry.npmjs.org/@vitest/coverage-c8/-/coverage-c8-0.33.0.tgz", - "integrity": "sha512-DaF1zJz4dcOZS4k/neiQJokmOWqsGXwhthfmUdPGorXIQHjdPvV6JQSYhQDI41MyI8c+IieQUdIDs5XAMHtDDw==", - "dev": true, - "dependencies": { - "@ampproject/remapping": "^2.2.1", - "c8": "^7.14.0", - "magic-string": "^0.30.1", - "picocolors": "^1.0.0", - "std-env": "^3.3.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "vitest": ">=0.30.0 <1" - } - }, - "node_modules/@vitest/expect": { - "version": "0.33.0", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-0.33.0.tgz", - "integrity": "sha512-sVNf+Gla3mhTCxNJx+wJLDPp/WcstOe0Ksqz4Vec51MmgMth/ia0MGFEkIZmVGeTL5HtjYR4Wl/ZxBxBXZJTzQ==", - "dev": true, - "dependencies": { - "@vitest/spy": "0.33.0", - "@vitest/utils": "0.33.0", - "chai": "^4.3.7" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/runner": { - "version": "0.33.0", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-0.33.0.tgz", - "integrity": "sha512-UPfACnmCB6HKRHTlcgCoBh6ppl6fDn+J/xR8dTufWiKt/74Y9bHci5CKB8tESSV82zKYtkBJo9whU3mNvfaisg==", - "dev": true, - "dependencies": { - "@vitest/utils": "0.33.0", - "p-limit": "^4.0.0", - "pathe": "^1.1.1" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/runner/node_modules/p-limit": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", - "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", - "dev": true, - "dependencies": { - "yocto-queue": "^1.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@vitest/runner/node_modules/yocto-queue": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", - "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", - "dev": true, - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@vitest/snapshot": { - "version": "0.33.0", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-0.33.0.tgz", - "integrity": "sha512-tJjrl//qAHbyHajpFvr8Wsk8DIOODEebTu7pgBrP07iOepR5jYkLFiqLq2Ltxv+r0uptUb4izv1J8XBOwKkVYA==", - "dev": true, - "dependencies": { - "magic-string": "^0.30.1", - "pathe": "^1.1.1", - "pretty-format": "^29.5.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/spy": { - "version": "0.33.0", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-0.33.0.tgz", - "integrity": "sha512-Kv+yZ4hnH1WdiAkPUQTpRxW8kGtH8VRTnus7ZTGovFYM1ZezJpvGtb9nPIjPnptHbsyIAxYZsEpVPYgtpjGnrg==", - "dev": true, - "dependencies": { - "tinyspy": "^2.1.1" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/utils": { - "version": "0.33.0", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-0.33.0.tgz", - "integrity": "sha512-pF1w22ic965sv+EN6uoePkAOTkAPWM03Ri/jXNyMIKBb/XHLDPfhLvf/Fa9g0YECevAIz56oVYXhodLvLQ/awA==", - "dev": true, - "dependencies": { - "diff-sequences": "^29.4.3", - "loupe": "^2.3.6", - "pretty-format": "^29.5.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "dev": true - }, - "node_modules/accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/acorn": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", - "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-walk": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", - "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dev": true, - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/aproba": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", - "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", - "dev": true - }, - "node_modules/are-we-there-yet": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", - "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", - "dev": true, - "dependencies": { - "delegates": "^1.0.0", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true - }, - "node_modules/array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" - }, - "node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/assertion-error": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", - "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" - }, - "node_modules/at-least-node": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", - "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", - "dev": true, - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/axios": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.4.0.tgz", - "integrity": "sha512-S4XCWMEmzvo64T9GfvQDOXgYRDJ/wsSZc7Jvdgx5u1sd0JwsuPLqb3SYmusag+edF6ziyMensPVqLTSc1PiSEA==", - "dependencies": { - "follow-redirects": "^1.15.0", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "dev": true, - "dependencies": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, - "node_modules/body-parser": { - "version": "1.20.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", - "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", - "dependencies": { - "bytes": "3.1.2", - "content-type": "~1.0.5", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.11.0", - "raw-body": "2.5.2", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/body-parser/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/body-parser/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/c8": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/c8/-/c8-7.14.0.tgz", - "integrity": "sha512-i04rtkkcNcCf7zsQcSv/T9EbUn4RXQ6mropeMcjFOsQXQ0iGLAr/xT6TImQg4+U9hmNpN9XdvPkjUL1IzbgxJw==", - "dev": true, - "dependencies": { - "@bcoe/v8-coverage": "^0.2.3", - "@istanbuljs/schema": "^0.1.3", - "find-up": "^5.0.0", - "foreground-child": "^2.0.0", - "istanbul-lib-coverage": "^3.2.0", - "istanbul-lib-report": "^3.0.0", - "istanbul-reports": "^3.1.4", - "rimraf": "^3.0.2", - "test-exclude": "^6.0.0", - "v8-to-istanbul": "^9.0.0", - "yargs": "^16.2.0", - "yargs-parser": "^20.2.9" - }, - "bin": { - "c8": "bin/c8.js" - }, - "engines": { - "node": ">=10.12.0" - } - }, - "node_modules/cac": { - "version": "6.7.14", - "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", - "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/chai": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.7.tgz", - "integrity": "sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==", - "dev": true, - "dependencies": { - "assertion-error": "^1.1.0", - "check-error": "^1.0.2", - "deep-eql": "^4.1.2", - "get-func-name": "^2.0.0", - "loupe": "^2.3.1", - "pathval": "^1.1.1", - "type-detect": "^4.0.5" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/check-error": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", - "integrity": "sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/color-support": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", - "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", - "dev": true, - "bin": { - "color-support": "bin.js" - } - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true - }, - "node_modules/console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", - "dev": true - }, - "node_modules/content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", - "dependencies": { - "safe-buffer": "5.2.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", - "dev": true - }, - "node_modules/cookie": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", - "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" - }, - "node_modules/core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "dev": true - }, - "node_modules/create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "dev": true - }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decompress-response": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", - "dev": true, - "dependencies": { - "mimic-response": "^3.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/deep-eql": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz", - "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==", - "dev": true, - "dependencies": { - "type-detect": "^4.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "dev": true, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", - "dev": true - }, - "node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/detect-libc": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz", - "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true, - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/diff-sequences": { - "version": "29.4.3", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.4.3.tgz", - "integrity": "sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA==", - "dev": true, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/dotenv": { - "version": "16.3.1", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.3.1.tgz", - "integrity": "sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/motdotla/dotenv?sponsor=1" - } - }, - "node_modules/ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" - }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dev": true, - "dependencies": { - "once": "^1.4.0" - } - }, - "node_modules/esbuild": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.19.tgz", - "integrity": "sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==", - "dev": true, - "hasInstallScript": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/android-arm": "0.17.19", - "@esbuild/android-arm64": "0.17.19", - "@esbuild/android-x64": "0.17.19", - "@esbuild/darwin-arm64": "0.17.19", - "@esbuild/darwin-x64": "0.17.19", - "@esbuild/freebsd-arm64": "0.17.19", - "@esbuild/freebsd-x64": "0.17.19", - "@esbuild/linux-arm": "0.17.19", - "@esbuild/linux-arm64": "0.17.19", - "@esbuild/linux-ia32": "0.17.19", - "@esbuild/linux-loong64": "0.17.19", - "@esbuild/linux-mips64el": "0.17.19", - "@esbuild/linux-ppc64": "0.17.19", - "@esbuild/linux-riscv64": "0.17.19", - "@esbuild/linux-s390x": "0.17.19", - "@esbuild/linux-x64": "0.17.19", - "@esbuild/netbsd-x64": "0.17.19", - "@esbuild/openbsd-x64": "0.17.19", - "@esbuild/sunos-x64": "0.17.19", - "@esbuild/win32-arm64": "0.17.19", - "@esbuild/win32-ia32": "0.17.19", - "@esbuild/win32-x64": "0.17.19" - } - }, - "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" - }, - "node_modules/etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/expand-template": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", - "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/express": { - "version": "4.18.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", - "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", - "dependencies": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.1", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.5.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.2.0", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.7", - "qs": "6.11.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.18.0", - "serve-static": "1.15.0", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/express/node_modules/body-parser": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", - "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", - "dependencies": { - "bytes": "3.1.2", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.11.0", - "raw-body": "2.5.1", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/express/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/express/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/express/node_modules/raw-body": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", - "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", - "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/fast-glob": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.0.tgz", - "integrity": "sha512-ChDuvbOypPuNjO8yIDf36x7BlZX1smcUMTTcyoIjycexOxd6DFsKsg21qVBzEmr3G7fUKIRy2/psii+CIUt7FA==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fastq": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", - "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", - "dev": true, - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/finalhandler": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/finalhandler/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/finalhandler/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/follow-redirects": { - "version": "1.15.2", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", - "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "node_modules/foreground-child": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", - "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/from2": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", - "integrity": "sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==", - "dev": true, - "dependencies": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.0" - } - }, - "node_modules/from2/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dev": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/from2/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "node_modules/from2/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/fs-constants": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", - "dev": true - }, - "node_modules/fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "dev": true, - "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "dev": true, - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/fs-minipass/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true - }, - "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" - }, - "node_modules/gauge": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", - "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", - "dev": true, - "dependencies": { - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.2", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.1", - "object-assign": "^4.1.1", - "signal-exit": "^3.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wide-align": "^1.1.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-func-name": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", - "integrity": "sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/get-intrinsic": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", - "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", - "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/github-from-package": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", - "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==", - "dev": true - }, - "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/globrex": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz", - "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==", - "dev": true - }, - "node_modules/google-protobuf": { - "version": "3.21.2", - "resolved": "https://registry.npmjs.org/google-protobuf/-/google-protobuf-3.21.2.tgz", - "integrity": "sha512-3MSOYFO5U9mPGikIYCzK0SaThypfGgS6bHqrUGXG3DPHCrb+txNqeEcns1W0lkGfk0rCyNXm7xB9rMxnCiZOoA==" - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true - }, - "node_modules/grpc-server-reflection": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/grpc-server-reflection/-/grpc-server-reflection-0.1.5.tgz", - "integrity": "sha512-i69RYu6v65enzknNAPUgerFuVQfo+L3n9g4c1A/Sv5jUHMpxMIjSbBA+YWls9Sr4Flac4oohp4Gx8f389CaHuw==", - "dependencies": { - "google-protobuf": "^3.19.1" - } - }, - "node_modules/grpc-tools": { - "version": "1.12.4", - "resolved": "https://registry.npmjs.org/grpc-tools/-/grpc-tools-1.12.4.tgz", - "integrity": "sha512-5+mLAJJma3BjnW/KQp6JBjUMgvu7Mu3dBvBPd1dcbNIb+qiR0817zDpgPjS7gRb+l/8EVNIa3cB02xI9JLToKg==", - "dev": true, - "hasInstallScript": true, - "dependencies": { - "@mapbox/node-pre-gyp": "^1.0.5" - }, - "bin": { - "grpc_tools_node_protoc": "bin/protoc.js", - "grpc_tools_node_protoc_plugin": "bin/protoc_plugin.js" - } - }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/has-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", - "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", - "dev": true - }, - "node_modules/html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true - }, - "node_modules/http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "dev": true, - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/ignore": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", - "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/ignore-by-default": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", - "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==", - "dev": true - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dev": true, - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true - }, - "node_modules/into-stream": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/into-stream/-/into-stream-6.0.0.tgz", - "integrity": "sha512-XHbaOAvP+uFKUFsOgoNPRjLkwB+I22JFPFe5OjTkQ0nwgj6+pSjb4NmB6VMxaPshLiOf+zcpOCBQuLwC1KHhZA==", - "dev": true, - "dependencies": { - "from2": "^2.3.0", - "p-is-promise": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-core-module": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz", - "integrity": "sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==", - "dev": true, - "dependencies": { - "has": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "node_modules/istanbul-lib-coverage": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", - "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", - "dev": true, - "dependencies": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^3.0.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-reports": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", - "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", - "dev": true, - "dependencies": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true, - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true, - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/jsonc-parser": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", - "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", - "dev": true - }, - "node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/local-pkg": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.4.3.tgz", - "integrity": "sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==", - "dev": true, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lodash.camelcase": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", - "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==" - }, - "node_modules/long": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", - "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" - }, - "node_modules/loupe": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.6.tgz", - "integrity": "sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==", - "dev": true, - "dependencies": { - "get-func-name": "^2.0.0" - } - }, - "node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/magic-string": { - "version": "0.30.1", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.1.tgz", - "integrity": "sha512-mbVKXPmS0z0G4XqFDCTllmDQ6coZzn94aMlb0o/A4HEHJCKcanlDZwYJgwnkmgD3jyWhUgj9VsPrfd972yPffA==", - "dev": true, - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.4.15" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, - "dependencies": { - "semver": "^6.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/make-dir/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true - }, - "node_modules/media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mimic-response": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/minipass": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/minizlib": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", - "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", - "dev": true, - "dependencies": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/minizlib/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true, - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/mkdirp-classic": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", - "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", - "dev": true - }, - "node_modules/mlly": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.4.0.tgz", - "integrity": "sha512-ua8PAThnTwpprIaU47EPeZ/bPUVp2QYBbWMphUQpVdBI3Lgqzm5KZQ45Agm3YJedHXaIHl6pBGabaLSUPPSptg==", - "dev": true, - "dependencies": { - "acorn": "^8.9.0", - "pathe": "^1.1.1", - "pkg-types": "^1.0.3", - "ufo": "^1.1.2" - } - }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "node_modules/multistream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/multistream/-/multistream-4.1.0.tgz", - "integrity": "sha512-J1XDiAmmNpRCBfIWJv+n0ymC4ABcf/Pl+5YvC5B/D2f/2+8PtHvCNxMPKiQcZyi922Hq69J2YOpb1pTywfifyw==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "once": "^1.4.0", - "readable-stream": "^3.6.0" - } - }, - "node_modules/nanoid": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", - "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/napi-build-utils": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", - "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==", - "dev": true - }, - "node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/node-abi": { - "version": "3.45.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.45.0.tgz", - "integrity": "sha512-iwXuFrMAcFVi/ZoZiqq8BzAdsLw9kxDfTC0HMyjXfSL/6CSDAGD5UmR7azrAgWV1zKYq7dUUMj4owusBWKLsiQ==", - "dev": true, - "dependencies": { - "semver": "^7.3.5" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/node-fetch": { - "version": "2.6.12", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.12.tgz", - "integrity": "sha512-C/fGU2E8ToujUivIO0H+tpQ6HWo4eEmchoPIoXtxCrVghxdKq+QOHqEZW7tuP3KlV3bC8FRMO5nMCC7Zm1VP6g==", - "dev": true, - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/nodemon": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.0.1.tgz", - "integrity": "sha512-g9AZ7HmkhQkqXkRc20w+ZfQ73cHLbE8hnPbtaFbFtCumZsjyMhKk9LajQ07U5Ux28lvFjZ5X7HvWR1xzU8jHVw==", - "dev": true, - "dependencies": { - "chokidar": "^3.5.2", - "debug": "^3.2.7", - "ignore-by-default": "^1.0.1", - "minimatch": "^3.1.2", - "pstree.remy": "^1.1.8", - "semver": "^7.5.3", - "simple-update-notifier": "^2.0.0", - "supports-color": "^5.5.0", - "touch": "^3.1.0", - "undefsafe": "^2.0.5" - }, - "bin": { - "nodemon": "bin/nodemon.js" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/nodemon" - } - }, - "node_modules/nodemon/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/nodemon/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/nodemon/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/nopt": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", - "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", - "dev": true, - "dependencies": { - "abbrev": "1" - }, - "bin": { - "nopt": "bin/nopt.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npmlog": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", - "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", - "dev": true, - "dependencies": { - "are-we-there-yet": "^2.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^3.0.0", - "set-blocking": "^2.0.0" - } - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-inspect": { - "version": "1.12.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", - "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/p-is-promise": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-3.0.0.tgz", - "integrity": "sha512-Wo8VsW4IRQSKVXsJCn7TomUaVtyfjVDn3nUP7kE967BQk0CwFpdbZs0X0uk5sW9mkBa9eNM7hCMaG93WUAwxYQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "node_modules/path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" - }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/pathe": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.1.tgz", - "integrity": "sha512-d+RQGp0MAYTIaDBIMmOfMwz3E+LOZnxx1HZd5R18mmCZY0QBlK0LDZfPc8FW8Ed2DlvsuE6PRjroDY+wg4+j/Q==", - "dev": true - }, - "node_modules/pathval": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", - "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pkg": { - "version": "5.8.1", - "resolved": "https://registry.npmjs.org/pkg/-/pkg-5.8.1.tgz", - "integrity": "sha512-CjBWtFStCfIiT4Bde9QpJy0KeH19jCfwZRJqHFDFXfhUklCx8JoFmMj3wgnEYIwGmZVNkhsStPHEOnrtrQhEXA==", - "dev": true, - "dependencies": { - "@babel/generator": "7.18.2", - "@babel/parser": "7.18.4", - "@babel/types": "7.19.0", - "chalk": "^4.1.2", - "fs-extra": "^9.1.0", - "globby": "^11.1.0", - "into-stream": "^6.0.0", - "is-core-module": "2.9.0", - "minimist": "^1.2.6", - "multistream": "^4.1.0", - "pkg-fetch": "3.4.2", - "prebuild-install": "7.1.1", - "resolve": "^1.22.0", - "stream-meter": "^1.0.4" - }, - "bin": { - "pkg": "lib-es5/bin.js" - }, - "peerDependencies": { - "node-notifier": ">=9.0.1" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/pkg-fetch": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/pkg-fetch/-/pkg-fetch-3.4.2.tgz", - "integrity": "sha512-0+uijmzYcnhC0hStDjm/cl2VYdrmVVBpe7Q8k9YBojxmR5tG8mvR9/nooQq3QSXiQqORDVOTY3XqMEqJVIzkHA==", - "dev": true, - "dependencies": { - "chalk": "^4.1.2", - "fs-extra": "^9.1.0", - "https-proxy-agent": "^5.0.0", - "node-fetch": "^2.6.6", - "progress": "^2.0.3", - "semver": "^7.3.5", - "tar-fs": "^2.1.1", - "yargs": "^16.2.0" - }, - "bin": { - "pkg-fetch": "lib-es5/bin.js" - } - }, - "node_modules/pkg-types": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.0.3.tgz", - "integrity": "sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==", - "dev": true, - "dependencies": { - "jsonc-parser": "^3.2.0", - "mlly": "^1.2.0", - "pathe": "^1.1.0" - } - }, - "node_modules/postcss": { - "version": "8.4.26", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.26.tgz", - "integrity": "sha512-jrXHFF8iTloAenySjM/ob3gSj7pCu0Ji49hnjqzsgSRa50hkWCKD0HQ+gMNJkW38jBI68MpAAg7ZWwHwX8NMMw==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "nanoid": "^3.3.6", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/prebuild-install": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.1.tgz", - "integrity": "sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==", - "dev": true, - "dependencies": { - "detect-libc": "^2.0.0", - "expand-template": "^2.0.3", - "github-from-package": "0.0.0", - "minimist": "^1.2.3", - "mkdirp-classic": "^0.5.3", - "napi-build-utils": "^1.0.1", - "node-abi": "^3.3.0", - "pump": "^3.0.0", - "rc": "^1.2.7", - "simple-get": "^4.0.0", - "tar-fs": "^2.0.0", - "tunnel-agent": "^0.6.0" - }, - "bin": { - "prebuild-install": "bin.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/pretty-format": { - "version": "29.6.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.1.tgz", - "integrity": "sha512-7jRj+yXO0W7e4/tSJKoR7HRIHLPPjtNaUGG2xxKQnGvPNRkgWcQ0AZX6P4KBRJN4FcTBWb3sa7DVUJmocYuoog==", - "dev": true, - "dependencies": { - "@jest/schemas": "^29.6.0", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/pretty-format/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true - }, - "node_modules/progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/protobufjs": { - "version": "7.2.4", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.2.4.tgz", - "integrity": "sha512-AT+RJgD2sH8phPmCf7OUZR8xGdcJRga4+1cOaXJ64hvcSkVhNcRHOwIxUatPH15+nj59WAGTDv3LSGZPEQbJaQ==", - "hasInstallScript": true, - "dependencies": { - "@protobufjs/aspromise": "^1.1.2", - "@protobufjs/base64": "^1.1.2", - "@protobufjs/codegen": "^2.0.4", - "@protobufjs/eventemitter": "^1.1.0", - "@protobufjs/fetch": "^1.1.0", - "@protobufjs/float": "^1.0.2", - "@protobufjs/inquire": "^1.1.0", - "@protobufjs/path": "^1.1.2", - "@protobufjs/pool": "^1.1.0", - "@protobufjs/utf8": "^1.1.0", - "@types/node": ">=13.7.0", - "long": "^5.0.0" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/protobufjs/node_modules/long": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", - "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==" - }, - "node_modules/proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "dependencies": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" - }, - "node_modules/pstree.remy": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", - "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", - "dev": true - }, - "node_modules/pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "node_modules/qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", - "dependencies": { - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/raw-body": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", - "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", - "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "dev": true, - "dependencies": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "bin": { - "rc": "cli.js" - } - }, - "node_modules/react-is": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", - "dev": true - }, - "node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/resolve": { - "version": "1.22.2", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", - "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", - "dev": true, - "dependencies": { - "is-core-module": "^2.11.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve/node_modules/is-core-module": { - "version": "2.12.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz", - "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==", - "dev": true, - "dependencies": { - "has": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true, - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rollup": { - "version": "3.26.2", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.26.2.tgz", - "integrity": "sha512-6umBIGVz93er97pMgQO08LuH3m6PUb3jlDUUGFsNJB6VgTCUaDFpupf5JfU30529m/UKOgmiX+uY6Sx8cOYpLA==", - "dev": true, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=14.18.0", - "npm": ">=8.0.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/send": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", - "dependencies": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.0.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/send/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/send/node_modules/debug/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/send/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - }, - "node_modules/serve-static": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", - "dependencies": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.18.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", - "dev": true - }, - "node_modules/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/siginfo": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", - "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", - "dev": true - }, - "node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, - "node_modules/simple-concat": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", - "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/simple-get": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", - "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "decompress-response": "^6.0.0", - "once": "^1.3.1", - "simple-concat": "^1.0.0" - } - }, - "node_modules/simple-update-notifier": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", - "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==", - "dev": true, - "dependencies": { - "semver": "^7.5.3" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/stackback": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", - "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", - "dev": true - }, - "node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/std-env": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.3.3.tgz", - "integrity": "sha512-Rz6yejtVyWnVjC1RFvNmYL10kgjC49EOghxWn0RFqlCHGFpQx+Xe7yW3I4ceK1SGrWIGMjD5Kbue8W/udkbMJg==", - "dev": true - }, - "node_modules/stream-meter": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/stream-meter/-/stream-meter-1.0.4.tgz", - "integrity": "sha512-4sOEtrbgFotXwnEuzzsQBYEV1elAeFSO8rSGeTwabuX1RRn/kEq9JVH7I0MRBhKVRR0sJkr0M0QCH7yOLf9fhQ==", - "dev": true, - "dependencies": { - "readable-stream": "^2.1.4" - } - }, - "node_modules/stream-meter/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dev": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/stream-meter/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "node_modules/stream-meter/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/strip-literal": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-1.0.1.tgz", - "integrity": "sha512-QZTsipNpa2Ppr6v1AmJHESqJ3Uz247MUS0OjrnnZjFAvEoWqxuyFuXn2xLgMtRnijJShAa1HL0gtJyUs7u7n3Q==", - "dev": true, - "dependencies": { - "acorn": "^8.8.2" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/tar": { - "version": "6.1.15", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.15.tgz", - "integrity": "sha512-/zKt9UyngnxIT/EAGYuxaMYgOIJiP81ab9ZfkILq4oNLPFX50qyYmu7jRj9qeXoxmJHjGlbH0+cm2uy1WCs10A==", - "dev": true, - "dependencies": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^5.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/tar-fs": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", - "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", - "dev": true, - "dependencies": { - "chownr": "^1.1.1", - "mkdirp-classic": "^0.5.2", - "pump": "^3.0.0", - "tar-stream": "^2.1.4" - } - }, - "node_modules/tar-fs/node_modules/chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", - "dev": true - }, - "node_modules/tar-stream": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", - "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", - "dev": true, - "dependencies": { - "bl": "^4.0.3", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", - "dev": true, - "dependencies": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/tinybench": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.5.0.tgz", - "integrity": "sha512-kRwSG8Zx4tjF9ZiyH4bhaebu+EDz1BOx9hOigYHlUW4xxI/wKIUQUqo018UlU4ar6ATPBsaMrdbKZ+tmPdohFA==", - "dev": true - }, - "node_modules/tinypool": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-0.6.0.tgz", - "integrity": "sha512-FdswUUo5SxRizcBc6b1GSuLpLjisa8N8qMyYoP3rl+bym+QauhtJP5bvZY1ytt8krKGmMLYIRl36HBZfeAoqhQ==", - "dev": true, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/tinyspy": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-2.1.1.tgz", - "integrity": "sha512-XPJL2uSzcOyBMky6OFrusqWlzfFrXtE0hPuMgW8A2HmaqrPo4ZQHRN/V0QXN3FSjKxpsbRrFc5LI7KOwBsT1/w==", - "dev": true, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/touch": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", - "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", - "dev": true, - "dependencies": { - "nopt": "~1.0.10" - }, - "bin": { - "nodetouch": "bin/nodetouch.js" - } - }, - "node_modules/touch/node_modules/nopt": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", - "integrity": "sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==", - "dev": true, - "dependencies": { - "abbrev": "1" - }, - "bin": { - "nopt": "bin/nopt.js" - }, - "engines": { - "node": "*" - } - }, - "node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "dev": true - }, - "node_modules/ts-essentials": { - "version": "9.3.2", - "resolved": "https://registry.npmjs.org/ts-essentials/-/ts-essentials-9.3.2.tgz", - "integrity": "sha512-JxKJzuWqH1MmH4ZFHtJzGEhkfN3QvVR3C3w+4BIoWeoY68UVVoA2Np/Bca9z0IPSErVCWhv439aT0We4Dks8kQ==", - "dev": true, - "peerDependencies": { - "typescript": ">=4.1.0" - } - }, - "node_modules/ts-node": { - "version": "10.9.1", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", - "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", - "dev": true, - "dependencies": { - "@cspotcode/source-map-support": "^0.8.0", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "v8-compile-cache-lib": "^3.0.1", - "yn": "3.1.1" - }, - "bin": { - "ts-node": "dist/bin.js", - "ts-node-cwd": "dist/bin-cwd.js", - "ts-node-esm": "dist/bin-esm.js", - "ts-node-script": "dist/bin-script.js", - "ts-node-transpile-only": "dist/bin-transpile.js", - "ts-script": "dist/bin-script-deprecated.js" - }, - "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 - } - } - }, - "node_modules/tsconfck": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/tsconfck/-/tsconfck-2.1.1.tgz", - "integrity": "sha512-ZPCkJBKASZBmBUNqGHmRhdhM8pJYDdOXp4nRgj/O0JwUwsMq50lCDRQP/M5GBNAA0elPrq4gAeu4dkaVCuKWww==", - "dev": true, - "bin": { - "tsconfck": "bin/tsconfck.js" - }, - "engines": { - "node": "^14.13.1 || ^16 || >=18" - }, - "peerDependencies": { - "typescript": "^4.3.5 || ^5.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/tsconfig-paths": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", - "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==", - "dev": true, - "dependencies": { - "json5": "^2.2.2", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", - "dev": true, - "dependencies": { - "safe-buffer": "^5.0.1" - }, - "engines": { - "node": "*" - } - }, - "node_modules/type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/typescript": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.2.tgz", - "integrity": "sha512-wVORMBGO/FAs/++blGNeAVdbNKtIh1rbBL2EyQ1+J9lClJ93KiiKe8PmFIVdXhHcyv44SL9oglmfeSsndo0jRw==", - "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=12.20" - } - }, - "node_modules/ufo": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.1.2.tgz", - "integrity": "sha512-TrY6DsjTQQgyS3E3dBaOXf0TpPD8u9FVrVYmKVegJuFw51n/YB9XPt+U6ydzFG5ZIN7+DIjPbNmXoBj9esYhgQ==", - "dev": true - }, - "node_modules/undefsafe": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", - "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", - "dev": true - }, - "node_modules/universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true - }, - "node_modules/utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/v8-compile-cache-lib": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", - "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", - "dev": true - }, - "node_modules/v8-to-istanbul": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.1.0.tgz", - "integrity": "sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA==", - "dev": true, - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.12", - "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^1.6.0" - }, - "engines": { - "node": ">=10.12.0" - } - }, - "node_modules/vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/vite": { - "version": "4.4.4", - "resolved": "https://registry.npmjs.org/vite/-/vite-4.4.4.tgz", - "integrity": "sha512-4mvsTxjkveWrKDJI70QmelfVqTm+ihFAb6+xf4sjEU2TmUCTlVX87tmg/QooPEMQb/lM9qGHT99ebqPziEd3wg==", - "dev": true, - "dependencies": { - "esbuild": "^0.18.10", - "postcss": "^8.4.25", - "rollup": "^3.25.2" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - }, - "peerDependencies": { - "@types/node": ">= 14", - "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 - } - } - }, - "node_modules/vite-node": { - "version": "0.33.0", - "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-0.33.0.tgz", - "integrity": "sha512-19FpHYbwWWxDr73ruNahC+vtEdza52kA90Qb3La98yZ0xULqV8A5JLNPUff0f5zID4984tW7l3DH2przTJUZSw==", - "dev": true, - "dependencies": { - "cac": "^6.7.14", - "debug": "^4.3.4", - "mlly": "^1.4.0", - "pathe": "^1.1.1", - "picocolors": "^1.0.0", - "vite": "^3.0.0 || ^4.0.0" - }, - "bin": { - "vite-node": "vite-node.mjs" - }, - "engines": { - "node": ">=v14.18.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/vite-tsconfig-paths": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/vite-tsconfig-paths/-/vite-tsconfig-paths-4.2.0.tgz", - "integrity": "sha512-jGpus0eUy5qbbMVGiTxCL1iB9ZGN6Bd37VGLJU39kTDD6ZfULTTb1bcc5IeTWqWJKiWV5YihCaibeASPiGi8kw==", - "dev": true, - "dependencies": { - "debug": "^4.1.1", - "globrex": "^0.1.2", - "tsconfck": "^2.1.0" - }, - "peerDependencies": { - "vite": "*" - }, - "peerDependenciesMeta": { - "vite": { - "optional": true - } - } - }, - "node_modules/vite/node_modules/@esbuild/android-arm": { - "version": "0.18.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.12.tgz", - "integrity": "sha512-LIxaNIQfkFZbTLb4+cX7dozHlAbAshhFE5PKdro0l+FnCpx1GDJaQ2WMcqm+ToXKMt8p8Uojk/MFRuGyz3V5Sw==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/android-arm64": { - "version": "0.18.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.12.tgz", - "integrity": "sha512-BMAlczRqC/LUt2P97E4apTBbkvS9JTJnp2DKFbCwpZ8vBvXVbNdqmvzW/OsdtI/+mGr+apkkpqGM8WecLkPgrA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/android-x64": { - "version": "0.18.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.12.tgz", - "integrity": "sha512-zU5MyluNsykf5cOJ0LZZZjgAHbhPJ1cWfdH1ZXVMXxVMhEV0VZiZXQdwBBVvmvbF28EizeK7obG9fs+fpmS0eQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/darwin-arm64": { - "version": "0.18.12", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.12.tgz", - "integrity": "sha512-zUZMep7YONnp6954QOOwEBwFX9svlKd3ov6PkxKd53LGTHsp/gy7vHaPGhhjBmEpqXEXShi6dddjIkmd+NgMsA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/darwin-x64": { - "version": "0.18.12", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.12.tgz", - "integrity": "sha512-ohqLPc7i67yunArPj1+/FeeJ7AgwAjHqKZ512ADk3WsE3FHU9l+m5aa7NdxXr0HmN1bjDlUslBjWNbFlD9y12Q==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/freebsd-arm64": { - "version": "0.18.12", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.12.tgz", - "integrity": "sha512-GIIHtQXqgeOOqdG16a/A9N28GpkvjJnjYMhOnXVbn3EDJcoItdR58v/pGN31CHjyXDc8uCcRnFWmqaJt24AYJg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/freebsd-x64": { - "version": "0.18.12", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.12.tgz", - "integrity": "sha512-zK0b9a1/0wZY+6FdOS3BpZcPc1kcx2G5yxxfEJtEUzVxI6n/FrC2Phsxj/YblPuBchhBZ/1wwn7AyEBUyNSa6g==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-arm": { - "version": "0.18.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.12.tgz", - "integrity": "sha512-y75OijvrBE/1XRrXq1jtrJfG26eHeMoqLJ2dwQNwviwTuTtHGCojsDO6BJNF8gU+3jTn1KzJEMETytwsFSvc+Q==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-arm64": { - "version": "0.18.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.12.tgz", - "integrity": "sha512-JKgG8Q/LL/9sw/iHHxQyVMoQYu3rU3+a5Z87DxC+wAu3engz+EmctIrV+FGOgI6gWG1z1+5nDDbXiRMGQZXqiw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-ia32": { - "version": "0.18.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.12.tgz", - "integrity": "sha512-yoRIAqc0B4lDIAAEFEIu9ttTRFV84iuAl0KNCN6MhKLxNPfzwCBvEMgwco2f71GxmpBcTtn7KdErueZaM2rEvw==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-loong64": { - "version": "0.18.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.12.tgz", - "integrity": "sha512-qYgt3dHPVvf/MgbIBpJ4Sup/yb9DAopZ3a2JgMpNKIHUpOdnJ2eHBo/aQdnd8dJ21X/+sS58wxHtA9lEazYtXQ==", - "cpu": [ - "loong64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-mips64el": { - "version": "0.18.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.12.tgz", - "integrity": "sha512-wHphlMLK4ufNOONqukELfVIbnGQJrHJ/mxZMMrP2jYrPgCRZhOtf0kC4yAXBwnfmULimV1qt5UJJOw4Kh13Yfg==", - "cpu": [ - "mips64el" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-ppc64": { - "version": "0.18.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.12.tgz", - "integrity": "sha512-TeN//1Ft20ZZW41+zDSdOI/Os1bEq5dbvBvYkberB7PHABbRcsteeoNVZFlI0YLpGdlBqohEpjrn06kv8heCJg==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-riscv64": { - "version": "0.18.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.12.tgz", - "integrity": "sha512-AgUebVS4DoAblBgiB2ACQ/8l4eGE5aWBb8ZXtkXHiET9mbj7GuWt3OnsIW/zX+XHJt2RYJZctbQ2S/mDjbp0UA==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-s390x": { - "version": "0.18.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.12.tgz", - "integrity": "sha512-dJ3Rb3Ei2u/ysSXd6pzleGtfDdc2MuzKt8qc6ls8vreP1G3B7HInX3i7gXS4BGeVd24pp0yqyS7bJ5NHaI9ing==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-x64": { - "version": "0.18.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.12.tgz", - "integrity": "sha512-OrNJMGQbPaVyHHcDF8ybNSwu7TDOfX8NGpXCbetwOSP6txOJiWlgQnRymfC9ocR1S0Y5PW0Wb1mV6pUddqmvmQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/netbsd-x64": { - "version": "0.18.12", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.12.tgz", - "integrity": "sha512-55FzVCAiwE9FK8wWeCRuvjazNRJ1QqLCYGZVB6E8RuQuTeStSwotpSW4xoRGwp3a1wUsaVCdYcj5LGCASVJmMg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/openbsd-x64": { - "version": "0.18.12", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.12.tgz", - "integrity": "sha512-qnluf8rfb6Y5Lw2tirfK2quZOBbVqmwxut7GPCIJsM8lc4AEUj9L8y0YPdLaPK0TECt4IdyBdBD/KRFKorlK3g==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/sunos-x64": { - "version": "0.18.12", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.12.tgz", - "integrity": "sha512-+RkKpVQR7bICjTOPUpkTBTaJ4TFqQBX5Ywyd/HSdDkQGn65VPkTsR/pL4AMvuMWy+wnXgIl4EY6q4mVpJal8Kg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/win32-arm64": { - "version": "0.18.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.12.tgz", - "integrity": "sha512-GNHuciv0mFM7ouzsU0+AwY+7eV4Mgo5WnbhfDCQGtpvOtD1vbOiRjPYG6dhmMoFyBjj+pNqQu2X+7DKn0KQ/Gw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/win32-ia32": { - "version": "0.18.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.12.tgz", - "integrity": "sha512-kR8cezhYipbbypGkaqCTWIeu4zID17gamC8YTPXYtcN3E5BhhtTnwKBn9I0PJur/T6UVwIEGYzkffNL0lFvxEw==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/win32-x64": { - "version": "0.18.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.12.tgz", - "integrity": "sha512-O0UYQVkvfM/jO8a4OwoV0mAKSJw+mjWTAd1MJd/1FCX6uiMdLmMRPK/w6e9OQ0ob2WGxzIm9va/KG0Ja4zIOgg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/esbuild": { - "version": "0.18.12", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.12.tgz", - "integrity": "sha512-XuOVLDdtsDslXStStduT41op21Ytmf4/BDS46aa3xPJ7X5h2eMWBF1oAe3QjUH3bDksocNXgzGUZ7XHIBya6Tg==", - "dev": true, - "hasInstallScript": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/android-arm": "0.18.12", - "@esbuild/android-arm64": "0.18.12", - "@esbuild/android-x64": "0.18.12", - "@esbuild/darwin-arm64": "0.18.12", - "@esbuild/darwin-x64": "0.18.12", - "@esbuild/freebsd-arm64": "0.18.12", - "@esbuild/freebsd-x64": "0.18.12", - "@esbuild/linux-arm": "0.18.12", - "@esbuild/linux-arm64": "0.18.12", - "@esbuild/linux-ia32": "0.18.12", - "@esbuild/linux-loong64": "0.18.12", - "@esbuild/linux-mips64el": "0.18.12", - "@esbuild/linux-ppc64": "0.18.12", - "@esbuild/linux-riscv64": "0.18.12", - "@esbuild/linux-s390x": "0.18.12", - "@esbuild/linux-x64": "0.18.12", - "@esbuild/netbsd-x64": "0.18.12", - "@esbuild/openbsd-x64": "0.18.12", - "@esbuild/sunos-x64": "0.18.12", - "@esbuild/win32-arm64": "0.18.12", - "@esbuild/win32-ia32": "0.18.12", - "@esbuild/win32-x64": "0.18.12" - } - }, - "node_modules/vitest": { - "version": "0.33.0", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-0.33.0.tgz", - "integrity": "sha512-1CxaugJ50xskkQ0e969R/hW47za4YXDUfWJDxip1hwbnhUjYolpfUn2AMOulqG/Dtd9WYAtkHmM/m3yKVrEejQ==", - "dev": true, - "dependencies": { - "@types/chai": "^4.3.5", - "@types/chai-subset": "^1.3.3", - "@types/node": "*", - "@vitest/expect": "0.33.0", - "@vitest/runner": "0.33.0", - "@vitest/snapshot": "0.33.0", - "@vitest/spy": "0.33.0", - "@vitest/utils": "0.33.0", - "acorn": "^8.9.0", - "acorn-walk": "^8.2.0", - "cac": "^6.7.14", - "chai": "^4.3.7", - "debug": "^4.3.4", - "local-pkg": "^0.4.3", - "magic-string": "^0.30.1", - "pathe": "^1.1.1", - "picocolors": "^1.0.0", - "std-env": "^3.3.3", - "strip-literal": "^1.0.1", - "tinybench": "^2.5.0", - "tinypool": "^0.6.0", - "vite": "^3.0.0 || ^4.0.0", - "vite-node": "0.33.0", - "why-is-node-running": "^2.2.2" - }, - "bin": { - "vitest": "vitest.mjs" - }, - "engines": { - "node": ">=v14.18.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "@edge-runtime/vm": "*", - "@vitest/browser": "*", - "@vitest/ui": "*", - "happy-dom": "*", - "jsdom": "*", - "playwright": "*", - "safaridriver": "*", - "webdriverio": "*" - }, - "peerDependenciesMeta": { - "@edge-runtime/vm": { - "optional": true - }, - "@vitest/browser": { - "optional": true - }, - "@vitest/ui": { - "optional": true - }, - "happy-dom": { - "optional": true - }, - "jsdom": { - "optional": true - }, - "playwright": { - "optional": true - }, - "safaridriver": { - "optional": true - }, - "webdriverio": { - "optional": true - } - } - }, - "node_modules/vitest-mock-extended": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/vitest-mock-extended/-/vitest-mock-extended-1.1.4.tgz", - "integrity": "sha512-MKPdepFjk0CE7Ocb5txntHK/sloHO9s0Kk9dr630uL03shRSHMkZtSs5CBPsbJ8K/CvYLv0GHUmMt2zWks2eXg==", - "dev": true, - "dependencies": { - "ts-essentials": "^9.3.2" - }, - "peerDependencies": { - "typescript": "3.x || 4.x || 5.x", - "vitest": ">=0.31.1" - } - }, - "node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "dev": true - }, - "node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dev": true, - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/why-is-node-running": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.2.2.tgz", - "integrity": "sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==", - "dev": true, - "dependencies": { - "siginfo": "^2.0.0", - "stackback": "0.0.2" - }, - "bin": { - "why-is-node-running": "cli.js" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wide-align": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", - "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", - "dev": true, - "dependencies": { - "string-width": "^1.0.2 || 2 || 3 || 4" - } - }, - "node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true - }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "engines": { - "node": ">=10" - } - }, - "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "engines": { - "node": ">=10" - } - }, - "node_modules/yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - } - }, - "dependencies": { - "@ampproject/remapping": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", - "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", - "dev": true, - "requires": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" - } - }, - "@babel/generator": { - "version": "7.18.2", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.2.tgz", - "integrity": "sha512-W1lG5vUwFvfMd8HVXqdfbuG7RuaSrTCCD8cl8fP8wOivdbtbIg2Db3IWUcgvfxKbbn6ZBGYRW/Zk1MIwK49mgw==", - "dev": true, - "requires": { - "@babel/types": "^7.18.2", - "@jridgewell/gen-mapping": "^0.3.0", - "jsesc": "^2.5.1" - } - }, - "@babel/helper-string-parser": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", - "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", - "dev": true - }, - "@babel/helper-validator-identifier": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz", - "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==", - "dev": true - }, - "@babel/parser": { - "version": "7.18.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.4.tgz", - "integrity": "sha512-FDge0dFazETFcxGw/EXzOkN8uJp0PC7Qbm+Pe9T+av2zlBpOgunFHkQPPn+eRuClU73JF+98D531UgayY89tow==", - "dev": true - }, - "@babel/types": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.19.0.tgz", - "integrity": "sha512-YuGopBq3ke25BVSiS6fgF49Ul9gH1x70Bcr6bqRLjWCkcX8Hre1/5+z+IiWOIerRMSSEfGZVB9z9kyq7wVs9YA==", - "dev": true, - "requires": { - "@babel/helper-string-parser": "^7.18.10", - "@babel/helper-validator-identifier": "^7.18.6", - "to-fast-properties": "^2.0.0" - } - }, - "@bcoe/v8-coverage": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", - "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", - "dev": true - }, - "@cspotcode/source-map-support": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", - "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", - "dev": true, - "requires": { - "@jridgewell/trace-mapping": "0.3.9" - }, - "dependencies": { - "@jridgewell/trace-mapping": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", - "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", - "dev": true, - "requires": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - } - } - }, - "@esbuild/android-arm": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.19.tgz", - "integrity": "sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==", - "dev": true, - "optional": true - }, - "@esbuild/android-arm64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.19.tgz", - "integrity": "sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==", - "dev": true, - "optional": true - }, - "@esbuild/android-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.19.tgz", - "integrity": "sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==", - "dev": true, - "optional": true - }, - "@esbuild/darwin-arm64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.19.tgz", - "integrity": "sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==", - "dev": true, - "optional": true - }, - "@esbuild/darwin-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.19.tgz", - "integrity": "sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==", - "dev": true, - "optional": true - }, - "@esbuild/freebsd-arm64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.19.tgz", - "integrity": "sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==", - "dev": true, - "optional": true - }, - "@esbuild/freebsd-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.19.tgz", - "integrity": "sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==", - "dev": true, - "optional": true - }, - "@esbuild/linux-arm": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.19.tgz", - "integrity": "sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==", - "dev": true, - "optional": true - }, - "@esbuild/linux-arm64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.19.tgz", - "integrity": "sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==", - "dev": true, - "optional": true - }, - "@esbuild/linux-ia32": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.19.tgz", - "integrity": "sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==", - "dev": true, - "optional": true - }, - "@esbuild/linux-loong64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.19.tgz", - "integrity": "sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==", - "dev": true, - "optional": true - }, - "@esbuild/linux-mips64el": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.19.tgz", - "integrity": "sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==", - "dev": true, - "optional": true - }, - "@esbuild/linux-ppc64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.19.tgz", - "integrity": "sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==", - "dev": true, - "optional": true - }, - "@esbuild/linux-riscv64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.19.tgz", - "integrity": "sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==", - "dev": true, - "optional": true - }, - "@esbuild/linux-s390x": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.19.tgz", - "integrity": "sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==", - "dev": true, - "optional": true - }, - "@esbuild/linux-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.19.tgz", - "integrity": "sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==", - "dev": true, - "optional": true - }, - "@esbuild/netbsd-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.19.tgz", - "integrity": "sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==", - "dev": true, - "optional": true - }, - "@esbuild/openbsd-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.19.tgz", - "integrity": "sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==", - "dev": true, - "optional": true - }, - "@esbuild/sunos-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.19.tgz", - "integrity": "sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==", - "dev": true, - "optional": true - }, - "@esbuild/win32-arm64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.19.tgz", - "integrity": "sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==", - "dev": true, - "optional": true - }, - "@esbuild/win32-ia32": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.19.tgz", - "integrity": "sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==", - "dev": true, - "optional": true - }, - "@esbuild/win32-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.19.tgz", - "integrity": "sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==", - "dev": true, - "optional": true - }, - "@grpc/grpc-js": { - "version": "1.8.14", - "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.8.14.tgz", - "integrity": "sha512-w84maJ6CKl5aApCMzFll0hxtFNT6or9WwMslobKaqWUEf1K+zhlL43bSQhFreyYWIWR+Z0xnVFC1KtLm4ZpM/A==", - "requires": { - "@grpc/proto-loader": "^0.7.0", - "@types/node": ">=12.12.47" - } - }, - "@grpc/proto-loader": { - "version": "0.7.6", - "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.6.tgz", - "integrity": "sha512-QyAXR8Hyh7uMDmveWxDSUcJr9NAWaZ2I6IXgAYvQmfflwouTM+rArE2eEaCtLlRqO81j7pRLCt81IefUei6Zbw==", - "requires": { - "@types/long": "^4.0.1", - "lodash.camelcase": "^4.3.0", - "long": "^4.0.0", - "protobufjs": "^7.0.0", - "yargs": "^16.2.0" - } - }, - "@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "dev": true - }, - "@jest/schemas": { - "version": "29.6.0", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.0.tgz", - "integrity": "sha512-rxLjXyJBTL4LQeJW3aKo0M/+GkCOXsO+8i9Iu7eDb6KwtP65ayoDsitrdPBtujxQ88k4wI2FNYfa6TOGwSn6cQ==", - "dev": true, - "requires": { - "@sinclair/typebox": "^0.27.8" - } - }, - "@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", - "dev": true, - "requires": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - } - }, - "@jridgewell/resolve-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", - "dev": true - }, - "@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", - "dev": true - }, - "@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", - "dev": true - }, - "@jridgewell/trace-mapping": { - "version": "0.3.18", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", - "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", - "dev": true, - "requires": { - "@jridgewell/resolve-uri": "3.1.0", - "@jridgewell/sourcemap-codec": "1.4.14" - }, - "dependencies": { - "@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", - "dev": true - } - } - }, - "@mapbox/node-pre-gyp": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.11.tgz", - "integrity": "sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==", - "dev": true, - "requires": { - "detect-libc": "^2.0.0", - "https-proxy-agent": "^5.0.0", - "make-dir": "^3.1.0", - "node-fetch": "^2.6.7", - "nopt": "^5.0.0", - "npmlog": "^5.0.1", - "rimraf": "^3.0.2", - "semver": "^7.3.5", - "tar": "^6.1.11" - } - }, - "@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - } - }, - "@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true - }, - "@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "requires": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - } - }, - "@protobufjs/aspromise": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", - "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==" - }, - "@protobufjs/base64": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", - "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" - }, - "@protobufjs/codegen": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", - "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" - }, - "@protobufjs/eventemitter": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", - "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==" - }, - "@protobufjs/fetch": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", - "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", - "requires": { - "@protobufjs/aspromise": "^1.1.1", - "@protobufjs/inquire": "^1.1.0" - } - }, - "@protobufjs/float": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", - "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==" - }, - "@protobufjs/inquire": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", - "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==" - }, - "@protobufjs/path": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", - "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==" - }, - "@protobufjs/pool": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", - "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==" - }, - "@protobufjs/utf8": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", - "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==" - }, - "@sinclair/typebox": { - "version": "0.27.8", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", - "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", - "dev": true - }, - "@tsconfig/node10": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", - "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", - "dev": true - }, - "@tsconfig/node12": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", - "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", - "dev": true - }, - "@tsconfig/node14": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", - "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", - "dev": true - }, - "@tsconfig/node16": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", - "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", - "dev": true - }, - "@types/amqplib": { - "version": "0.10.1", - "resolved": "https://registry.npmjs.org/@types/amqplib/-/amqplib-0.10.1.tgz", - "integrity": "sha512-j6ANKT79ncUDnAs/+9r9eDujxbeJoTjoVu33gHHcaPfmLQaMhvfbH2GqSe8KUM444epAp1Vl3peVOQfZk3UIqA==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/body-parser": { - "version": "1.19.2", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", - "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", - "requires": { - "@types/connect": "*", - "@types/node": "*" - } - }, - "@types/chai": { - "version": "4.3.5", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.5.tgz", - "integrity": "sha512-mEo1sAde+UCE6b2hxn332f1g1E8WfYRu6p5SvTKr2ZKC1f7gFJXk4h5PyGP9Dt6gCaG8y8XhwnXWC6Iy2cmBng==", - "dev": true - }, - "@types/chai-subset": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/@types/chai-subset/-/chai-subset-1.3.3.tgz", - "integrity": "sha512-frBecisrNGz+F4T6bcc+NLeolfiojh5FxW2klu669+8BARtyQv2C/GkNW6FUodVe4BroGMP/wER/YDGc7rEllw==", - "dev": true, - "requires": { - "@types/chai": "*" - } - }, - "@types/connect": { - "version": "3.4.35", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", - "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", - "requires": { - "@types/node": "*" - } - }, - "@types/express": { - "version": "4.17.17", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.17.tgz", - "integrity": "sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==", - "requires": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "^4.17.33", - "@types/qs": "*", - "@types/serve-static": "*" - } - }, - "@types/express-serve-static-core": { - "version": "4.17.35", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.35.tgz", - "integrity": "sha512-wALWQwrgiB2AWTT91CB62b6Yt0sNHpznUXeZEcnPU3DRdlDIz74x8Qg1UUYKSVFi+va5vKOLYRBI1bRKiLLKIg==", - "requires": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*", - "@types/send": "*" - } - }, - "@types/http-errors": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.1.tgz", - "integrity": "sha512-/K3ds8TRAfBvi5vfjuz8y6+GiAYBZ0x4tXv1Av6CWBWn0IlADc+ZX9pMq7oU0fNQPnBwIZl3rmeLp6SBApbxSQ==" - }, - "@types/istanbul-lib-coverage": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", - "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", - "dev": true - }, - "@types/long": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz", - "integrity": "sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==" - }, - "@types/mime": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", - "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==" - }, - "@types/node": { - "version": "18.15.9", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.9.tgz", - "integrity": "sha512-dUxhiNzBLr6IqlZXz6e/rN2YQXlFgOei/Dxy+e3cyXTJ4txSUbGT2/fmnD6zd/75jDMeW5bDee+YXxlFKHoV0A==" - }, - "@types/qs": { - "version": "6.9.7", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", - "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==" - }, - "@types/range-parser": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", - "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==" - }, - "@types/send": { - "version": "0.17.1", - "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.1.tgz", - "integrity": "sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q==", - "requires": { - "@types/mime": "^1", - "@types/node": "*" - } - }, - "@types/serve-static": { - "version": "1.15.2", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.2.tgz", - "integrity": "sha512-J2LqtvFYCzaj8pVYKw8klQXrLLk7TBZmQ4ShlcdkELFKGwGMfevMLneMMRkMgZxotOD9wg497LpC7O8PcvAmfw==", - "requires": { - "@types/http-errors": "*", - "@types/mime": "*", - "@types/node": "*" - } - }, - "@vitest/coverage-c8": { - "version": "0.33.0", - "resolved": "https://registry.npmjs.org/@vitest/coverage-c8/-/coverage-c8-0.33.0.tgz", - "integrity": "sha512-DaF1zJz4dcOZS4k/neiQJokmOWqsGXwhthfmUdPGorXIQHjdPvV6JQSYhQDI41MyI8c+IieQUdIDs5XAMHtDDw==", - "dev": true, - "requires": { - "@ampproject/remapping": "^2.2.1", - "c8": "^7.14.0", - "magic-string": "^0.30.1", - "picocolors": "^1.0.0", - "std-env": "^3.3.3" - } - }, - "@vitest/expect": { - "version": "0.33.0", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-0.33.0.tgz", - "integrity": "sha512-sVNf+Gla3mhTCxNJx+wJLDPp/WcstOe0Ksqz4Vec51MmgMth/ia0MGFEkIZmVGeTL5HtjYR4Wl/ZxBxBXZJTzQ==", - "dev": true, - "requires": { - "@vitest/spy": "0.33.0", - "@vitest/utils": "0.33.0", - "chai": "^4.3.7" - } - }, - "@vitest/runner": { - "version": "0.33.0", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-0.33.0.tgz", - "integrity": "sha512-UPfACnmCB6HKRHTlcgCoBh6ppl6fDn+J/xR8dTufWiKt/74Y9bHci5CKB8tESSV82zKYtkBJo9whU3mNvfaisg==", - "dev": true, - "requires": { - "@vitest/utils": "0.33.0", - "p-limit": "^4.0.0", - "pathe": "^1.1.1" - }, - "dependencies": { - "p-limit": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", - "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", - "dev": true, - "requires": { - "yocto-queue": "^1.0.0" - } - }, - "yocto-queue": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", - "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", - "dev": true - } - } - }, - "@vitest/snapshot": { - "version": "0.33.0", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-0.33.0.tgz", - "integrity": "sha512-tJjrl//qAHbyHajpFvr8Wsk8DIOODEebTu7pgBrP07iOepR5jYkLFiqLq2Ltxv+r0uptUb4izv1J8XBOwKkVYA==", - "dev": true, - "requires": { - "magic-string": "^0.30.1", - "pathe": "^1.1.1", - "pretty-format": "^29.5.0" - } - }, - "@vitest/spy": { - "version": "0.33.0", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-0.33.0.tgz", - "integrity": "sha512-Kv+yZ4hnH1WdiAkPUQTpRxW8kGtH8VRTnus7ZTGovFYM1ZezJpvGtb9nPIjPnptHbsyIAxYZsEpVPYgtpjGnrg==", - "dev": true, - "requires": { - "tinyspy": "^2.1.1" - } - }, - "@vitest/utils": { - "version": "0.33.0", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-0.33.0.tgz", - "integrity": "sha512-pF1w22ic965sv+EN6uoePkAOTkAPWM03Ri/jXNyMIKBb/XHLDPfhLvf/Fa9g0YECevAIz56oVYXhodLvLQ/awA==", - "dev": true, - "requires": { - "diff-sequences": "^29.4.3", - "loupe": "^2.3.6", - "pretty-format": "^29.5.0" - } - }, - "abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "dev": true - }, - "accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "requires": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - } - }, - "acorn": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", - "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", - "dev": true - }, - "acorn-walk": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", - "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", - "dev": true - }, - "agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dev": true, - "requires": { - "debug": "4" - } - }, - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "aproba": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", - "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", - "dev": true - }, - "are-we-there-yet": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", - "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", - "dev": true, - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^3.6.0" - } - }, - "arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true - }, - "array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" - }, - "array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true - }, - "assertion-error": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", - "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", - "dev": true - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" - }, - "at-least-node": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", - "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", - "dev": true - }, - "axios": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.4.0.tgz", - "integrity": "sha512-S4XCWMEmzvo64T9GfvQDOXgYRDJ/wsSZc7Jvdgx5u1sd0JwsuPLqb3SYmusag+edF6ziyMensPVqLTSc1PiSEA==", - "requires": { - "follow-redirects": "^1.15.0", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" - } - }, - "balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "dev": true - }, - "binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true - }, - "bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "dev": true, - "requires": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, - "body-parser": { - "version": "1.20.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", - "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", - "requires": { - "bytes": "3.1.2", - "content-type": "~1.0.5", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.11.0", - "raw-body": "2.5.2", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - } - } - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "dev": true, - "requires": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" - }, - "c8": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/c8/-/c8-7.14.0.tgz", - "integrity": "sha512-i04rtkkcNcCf7zsQcSv/T9EbUn4RXQ6mropeMcjFOsQXQ0iGLAr/xT6TImQg4+U9hmNpN9XdvPkjUL1IzbgxJw==", - "dev": true, - "requires": { - "@bcoe/v8-coverage": "^0.2.3", - "@istanbuljs/schema": "^0.1.3", - "find-up": "^5.0.0", - "foreground-child": "^2.0.0", - "istanbul-lib-coverage": "^3.2.0", - "istanbul-lib-report": "^3.0.0", - "istanbul-reports": "^3.1.4", - "rimraf": "^3.0.2", - "test-exclude": "^6.0.0", - "v8-to-istanbul": "^9.0.0", - "yargs": "^16.2.0", - "yargs-parser": "^20.2.9" - } - }, - "cac": { - "version": "6.7.14", - "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", - "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", - "dev": true - }, - "call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "requires": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - } - }, - "chai": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.7.tgz", - "integrity": "sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==", - "dev": true, - "requires": { - "assertion-error": "^1.1.0", - "check-error": "^1.0.2", - "deep-eql": "^4.1.2", - "get-func-name": "^2.0.0", - "loupe": "^2.3.1", - "pathval": "^1.1.1", - "type-detect": "^4.0.5" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "check-error": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", - "integrity": "sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==", - "dev": true - }, - "chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "dev": true, - "requires": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "fsevents": "~2.3.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - } - }, - "chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", - "dev": true - }, - "cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "color-support": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", - "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", - "dev": true - }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true - }, - "console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", - "dev": true - }, - "content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", - "requires": { - "safe-buffer": "5.2.1" - } - }, - "content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==" - }, - "convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", - "dev": true - }, - "cookie": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", - "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==" - }, - "cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" - }, - "core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "dev": true - }, - "create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "dev": true - }, - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "decompress-response": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", - "dev": true, - "requires": { - "mimic-response": "^3.1.0" - } - }, - "deep-eql": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz", - "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==", - "dev": true, - "requires": { - "type-detect": "^4.0.0" - } - }, - "deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "dev": true - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" - }, - "delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", - "dev": true - }, - "depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" - }, - "destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==" - }, - "detect-libc": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz", - "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==", - "dev": true - }, - "diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true - }, - "diff-sequences": { - "version": "29.4.3", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.4.3.tgz", - "integrity": "sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA==", - "dev": true - }, - "dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "requires": { - "path-type": "^4.0.0" - } - }, - "dotenv": { - "version": "16.3.1", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.3.1.tgz", - "integrity": "sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==" - }, - "ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==" - }, - "end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dev": true, - "requires": { - "once": "^1.4.0" - } - }, - "esbuild": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.19.tgz", - "integrity": "sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==", - "dev": true, - "requires": { - "@esbuild/android-arm": "0.17.19", - "@esbuild/android-arm64": "0.17.19", - "@esbuild/android-x64": "0.17.19", - "@esbuild/darwin-arm64": "0.17.19", - "@esbuild/darwin-x64": "0.17.19", - "@esbuild/freebsd-arm64": "0.17.19", - "@esbuild/freebsd-x64": "0.17.19", - "@esbuild/linux-arm": "0.17.19", - "@esbuild/linux-arm64": "0.17.19", - "@esbuild/linux-ia32": "0.17.19", - "@esbuild/linux-loong64": "0.17.19", - "@esbuild/linux-mips64el": "0.17.19", - "@esbuild/linux-ppc64": "0.17.19", - "@esbuild/linux-riscv64": "0.17.19", - "@esbuild/linux-s390x": "0.17.19", - "@esbuild/linux-x64": "0.17.19", - "@esbuild/netbsd-x64": "0.17.19", - "@esbuild/openbsd-x64": "0.17.19", - "@esbuild/sunos-x64": "0.17.19", - "@esbuild/win32-arm64": "0.17.19", - "@esbuild/win32-ia32": "0.17.19", - "@esbuild/win32-x64": "0.17.19" - } - }, - "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" - }, - "escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" - }, - "etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==" - }, - "expand-template": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", - "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", - "dev": true - }, - "express": { - "version": "4.18.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", - "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", - "requires": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.1", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.5.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.2.0", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.7", - "qs": "6.11.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.18.0", - "serve-static": "1.15.0", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "dependencies": { - "body-parser": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", - "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", - "requires": { - "bytes": "3.1.2", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.11.0", - "raw-body": "2.5.1", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - } - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "raw-body": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", - "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", - "requires": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - } - } - } - }, - "fast-glob": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.0.tgz", - "integrity": "sha512-ChDuvbOypPuNjO8yIDf36x7BlZX1smcUMTTcyoIjycexOxd6DFsKsg21qVBzEmr3G7fUKIRy2/psii+CIUt7FA==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - } - }, - "fastq": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", - "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", - "dev": true, - "requires": { - "reusify": "^1.0.4" - } - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "finalhandler": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", - "requires": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - } - } - }, - "find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "requires": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - } - }, - "follow-redirects": { - "version": "1.15.2", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", - "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==" - }, - "foreground-child": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", - "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", - "dev": true, - "requires": { - "cross-spawn": "^7.0.0", - "signal-exit": "^3.0.2" - } - }, - "form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - } - }, - "forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" - }, - "fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==" - }, - "from2": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", - "integrity": "sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.0" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "fs-constants": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", - "dev": true - }, - "fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "dev": true, - "requires": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - } - }, - "fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "dev": true, - "requires": { - "minipass": "^3.0.0" - }, - "dependencies": { - "minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - } - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true - }, - "fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "optional": true - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" - }, - "gauge": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", - "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", - "dev": true, - "requires": { - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.2", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.1", - "object-assign": "^4.1.1", - "signal-exit": "^3.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wide-align": "^1.1.2" - } - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" - }, - "get-func-name": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", - "integrity": "sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==", - "dev": true - }, - "get-intrinsic": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", - "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", - "requires": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3" - } - }, - "github-from-package": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", - "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==", - "dev": true - }, - "glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "requires": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - } - }, - "globrex": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz", - "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==", - "dev": true - }, - "google-protobuf": { - "version": "3.21.2", - "resolved": "https://registry.npmjs.org/google-protobuf/-/google-protobuf-3.21.2.tgz", - "integrity": "sha512-3MSOYFO5U9mPGikIYCzK0SaThypfGgS6bHqrUGXG3DPHCrb+txNqeEcns1W0lkGfk0rCyNXm7xB9rMxnCiZOoA==" - }, - "graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true - }, - "grpc-server-reflection": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/grpc-server-reflection/-/grpc-server-reflection-0.1.5.tgz", - "integrity": "sha512-i69RYu6v65enzknNAPUgerFuVQfo+L3n9g4c1A/Sv5jUHMpxMIjSbBA+YWls9Sr4Flac4oohp4Gx8f389CaHuw==", - "requires": { - "google-protobuf": "^3.19.1" - } - }, - "grpc-tools": { - "version": "1.12.4", - "resolved": "https://registry.npmjs.org/grpc-tools/-/grpc-tools-1.12.4.tgz", - "integrity": "sha512-5+mLAJJma3BjnW/KQp6JBjUMgvu7Mu3dBvBPd1dcbNIb+qiR0817zDpgPjS7gRb+l/8EVNIa3cB02xI9JLToKg==", - "dev": true, - "requires": { - "@mapbox/node-pre-gyp": "^1.0.5" - } - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "has-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", - "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==" - }, - "has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" - }, - "has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", - "dev": true - }, - "html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true - }, - "http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "requires": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - } - }, - "https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "dev": true, - "requires": { - "agent-base": "6", - "debug": "4" - } - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "dev": true - }, - "ignore": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", - "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", - "dev": true - }, - "ignore-by-default": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", - "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true - }, - "into-stream": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/into-stream/-/into-stream-6.0.0.tgz", - "integrity": "sha512-XHbaOAvP+uFKUFsOgoNPRjLkwB+I22JFPFe5OjTkQ0nwgj6+pSjb4NmB6VMxaPshLiOf+zcpOCBQuLwC1KHhZA==", - "dev": true, - "requires": { - "from2": "^2.3.0", - "p-is-promise": "^3.0.0" - } - }, - "ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" - }, - "is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "requires": { - "binary-extensions": "^2.0.0" - } - }, - "is-core-module": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz", - "integrity": "sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==", - "dev": true, - "requires": { - "has": "^1.0.3" - } - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" - }, - "is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "istanbul-lib-coverage": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", - "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", - "dev": true - }, - "istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", - "dev": true, - "requires": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^3.0.0", - "supports-color": "^7.1.0" - } - }, - "istanbul-reports": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", - "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", - "dev": true, - "requires": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - } - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true - }, - "json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true - }, - "jsonc-parser": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", - "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", - "dev": true - }, - "jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^2.0.0" - } - }, - "local-pkg": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.4.3.tgz", - "integrity": "sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==", - "dev": true - }, - "locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "requires": { - "p-locate": "^5.0.0" - } - }, - "lodash.camelcase": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", - "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==" - }, - "long": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", - "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" - }, - "loupe": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.6.tgz", - "integrity": "sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==", - "dev": true, - "requires": { - "get-func-name": "^2.0.0" - } - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "magic-string": { - "version": "0.30.1", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.1.tgz", - "integrity": "sha512-mbVKXPmS0z0G4XqFDCTllmDQ6coZzn94aMlb0o/A4HEHJCKcanlDZwYJgwnkmgD3jyWhUgj9VsPrfd972yPffA==", - "dev": true, - "requires": { - "@jridgewell/sourcemap-codec": "^1.4.15" - } - }, - "make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, - "requires": { - "semver": "^6.0.0" - }, - "dependencies": { - "semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true - } - } - }, - "make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true - }, - "media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==" - }, - "merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" - }, - "merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true - }, - "methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==" - }, - "micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "requires": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - } - }, - "mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" - }, - "mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" - }, - "mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "requires": { - "mime-db": "1.52.0" - } - }, - "mimic-response": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", - "dev": true - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "dev": true - }, - "minipass": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", - "dev": true - }, - "minizlib": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", - "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", - "dev": true, - "requires": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - }, - "dependencies": { - "minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - } - } - }, - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true - }, - "mkdirp-classic": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", - "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", - "dev": true - }, - "mlly": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.4.0.tgz", - "integrity": "sha512-ua8PAThnTwpprIaU47EPeZ/bPUVp2QYBbWMphUQpVdBI3Lgqzm5KZQ45Agm3YJedHXaIHl6pBGabaLSUPPSptg==", - "dev": true, - "requires": { - "acorn": "^8.9.0", - "pathe": "^1.1.1", - "pkg-types": "^1.0.3", - "ufo": "^1.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "multistream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/multistream/-/multistream-4.1.0.tgz", - "integrity": "sha512-J1XDiAmmNpRCBfIWJv+n0ymC4ABcf/Pl+5YvC5B/D2f/2+8PtHvCNxMPKiQcZyi922Hq69J2YOpb1pTywfifyw==", - "dev": true, - "requires": { - "once": "^1.4.0", - "readable-stream": "^3.6.0" - } - }, - "nanoid": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", - "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", - "dev": true - }, - "napi-build-utils": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", - "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==", - "dev": true - }, - "negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==" - }, - "node-abi": { - "version": "3.45.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.45.0.tgz", - "integrity": "sha512-iwXuFrMAcFVi/ZoZiqq8BzAdsLw9kxDfTC0HMyjXfSL/6CSDAGD5UmR7azrAgWV1zKYq7dUUMj4owusBWKLsiQ==", - "dev": true, - "requires": { - "semver": "^7.3.5" - } - }, - "node-fetch": { - "version": "2.6.12", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.12.tgz", - "integrity": "sha512-C/fGU2E8ToujUivIO0H+tpQ6HWo4eEmchoPIoXtxCrVghxdKq+QOHqEZW7tuP3KlV3bC8FRMO5nMCC7Zm1VP6g==", - "dev": true, - "requires": { - "whatwg-url": "^5.0.0" - } - }, - "nodemon": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.0.1.tgz", - "integrity": "sha512-g9AZ7HmkhQkqXkRc20w+ZfQ73cHLbE8hnPbtaFbFtCumZsjyMhKk9LajQ07U5Ux28lvFjZ5X7HvWR1xzU8jHVw==", - "dev": true, - "requires": { - "chokidar": "^3.5.2", - "debug": "^3.2.7", - "ignore-by-default": "^1.0.1", - "minimatch": "^3.1.2", - "pstree.remy": "^1.1.8", - "semver": "^7.5.3", - "simple-update-notifier": "^2.0.0", - "supports-color": "^5.5.0", - "touch": "^3.1.0", - "undefsafe": "^2.0.5" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "nopt": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", - "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", - "dev": true, - "requires": { - "abbrev": "1" - } - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true - }, - "npmlog": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", - "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", - "dev": true, - "requires": { - "are-we-there-yet": "^2.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^3.0.0", - "set-blocking": "^2.0.0" - } - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "dev": true - }, - "object-inspect": { - "version": "1.12.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", - "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==" - }, - "on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "requires": { - "ee-first": "1.1.1" - } - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, - "requires": { - "wrappy": "1" - } - }, - "p-is-promise": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-3.0.0.tgz", - "integrity": "sha512-Wo8VsW4IRQSKVXsJCn7TomUaVtyfjVDn3nUP7kE967BQk0CwFpdbZs0X0uk5sW9mkBa9eNM7hCMaG93WUAwxYQ==", - "dev": true - }, - "p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "requires": { - "yocto-queue": "^0.1.0" - } - }, - "p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "requires": { - "p-limit": "^3.0.2" - } - }, - "parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true - }, - "path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" - }, - "path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true - }, - "pathe": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.1.tgz", - "integrity": "sha512-d+RQGp0MAYTIaDBIMmOfMwz3E+LOZnxx1HZd5R18mmCZY0QBlK0LDZfPc8FW8Ed2DlvsuE6PRjroDY+wg4+j/Q==", - "dev": true - }, - "pathval": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", - "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", - "dev": true - }, - "picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true - }, - "picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true - }, - "pkg": { - "version": "5.8.1", - "resolved": "https://registry.npmjs.org/pkg/-/pkg-5.8.1.tgz", - "integrity": "sha512-CjBWtFStCfIiT4Bde9QpJy0KeH19jCfwZRJqHFDFXfhUklCx8JoFmMj3wgnEYIwGmZVNkhsStPHEOnrtrQhEXA==", - "dev": true, - "requires": { - "@babel/generator": "7.18.2", - "@babel/parser": "7.18.4", - "@babel/types": "7.19.0", - "chalk": "^4.1.2", - "fs-extra": "^9.1.0", - "globby": "^11.1.0", - "into-stream": "^6.0.0", - "is-core-module": "2.9.0", - "minimist": "^1.2.6", - "multistream": "^4.1.0", - "pkg-fetch": "3.4.2", - "prebuild-install": "7.1.1", - "resolve": "^1.22.0", - "stream-meter": "^1.0.4" - } - }, - "pkg-fetch": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/pkg-fetch/-/pkg-fetch-3.4.2.tgz", - "integrity": "sha512-0+uijmzYcnhC0hStDjm/cl2VYdrmVVBpe7Q8k9YBojxmR5tG8mvR9/nooQq3QSXiQqORDVOTY3XqMEqJVIzkHA==", - "dev": true, - "requires": { - "chalk": "^4.1.2", - "fs-extra": "^9.1.0", - "https-proxy-agent": "^5.0.0", - "node-fetch": "^2.6.6", - "progress": "^2.0.3", - "semver": "^7.3.5", - "tar-fs": "^2.1.1", - "yargs": "^16.2.0" - } - }, - "pkg-types": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.0.3.tgz", - "integrity": "sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==", - "dev": true, - "requires": { - "jsonc-parser": "^3.2.0", - "mlly": "^1.2.0", - "pathe": "^1.1.0" - } - }, - "postcss": { - "version": "8.4.26", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.26.tgz", - "integrity": "sha512-jrXHFF8iTloAenySjM/ob3gSj7pCu0Ji49hnjqzsgSRa50hkWCKD0HQ+gMNJkW38jBI68MpAAg7ZWwHwX8NMMw==", - "dev": true, - "requires": { - "nanoid": "^3.3.6", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - } - }, - "prebuild-install": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.1.tgz", - "integrity": "sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==", - "dev": true, - "requires": { - "detect-libc": "^2.0.0", - "expand-template": "^2.0.3", - "github-from-package": "0.0.0", - "minimist": "^1.2.3", - "mkdirp-classic": "^0.5.3", - "napi-build-utils": "^1.0.1", - "node-abi": "^3.3.0", - "pump": "^3.0.0", - "rc": "^1.2.7", - "simple-get": "^4.0.0", - "tar-fs": "^2.0.0", - "tunnel-agent": "^0.6.0" - } - }, - "pretty-format": { - "version": "29.6.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.1.tgz", - "integrity": "sha512-7jRj+yXO0W7e4/tSJKoR7HRIHLPPjtNaUGG2xxKQnGvPNRkgWcQ0AZX6P4KBRJN4FcTBWb3sa7DVUJmocYuoog==", - "dev": true, - "requires": { - "@jest/schemas": "^29.6.0", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true - } - } - }, - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true - }, - "progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true - }, - "protobufjs": { - "version": "7.2.4", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.2.4.tgz", - "integrity": "sha512-AT+RJgD2sH8phPmCf7OUZR8xGdcJRga4+1cOaXJ64hvcSkVhNcRHOwIxUatPH15+nj59WAGTDv3LSGZPEQbJaQ==", - "requires": { - "@protobufjs/aspromise": "^1.1.2", - "@protobufjs/base64": "^1.1.2", - "@protobufjs/codegen": "^2.0.4", - "@protobufjs/eventemitter": "^1.1.0", - "@protobufjs/fetch": "^1.1.0", - "@protobufjs/float": "^1.0.2", - "@protobufjs/inquire": "^1.1.0", - "@protobufjs/path": "^1.1.2", - "@protobufjs/pool": "^1.1.0", - "@protobufjs/utf8": "^1.1.0", - "@types/node": ">=13.7.0", - "long": "^5.0.0" - }, - "dependencies": { - "long": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", - "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==" - } - } - }, - "proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "requires": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - } - }, - "proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" - }, - "pstree.remy": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", - "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", - "dev": true - }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", - "requires": { - "side-channel": "^1.0.4" - } - }, - "queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true - }, - "range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" - }, - "raw-body": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", - "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", - "requires": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - } - }, - "rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "dev": true, - "requires": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - } - }, - "react-is": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", - "dev": true - }, - "readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "requires": { - "picomatch": "^2.2.1" - } - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==" - }, - "resolve": { - "version": "1.22.2", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", - "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", - "dev": true, - "requires": { - "is-core-module": "^2.11.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "dependencies": { - "is-core-module": { - "version": "2.12.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz", - "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==", - "dev": true, - "requires": { - "has": "^1.0.3" - } - } - } - }, - "reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "rollup": { - "version": "3.26.2", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.26.2.tgz", - "integrity": "sha512-6umBIGVz93er97pMgQO08LuH3m6PUb3jlDUUGFsNJB6VgTCUaDFpupf5JfU30529m/UKOgmiX+uY6Sx8cOYpLA==", - "dev": true, - "requires": { - "fsevents": "~2.3.2" - } - }, - "run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "requires": { - "queue-microtask": "^1.2.2" - } - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "send": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", - "requires": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.0.1" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - }, - "dependencies": { - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - } - } - }, - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - } - } - }, - "serve-static": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", - "requires": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.18.0" - } - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", - "dev": true - }, - "setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true - }, - "side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "requires": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - } - }, - "siginfo": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", - "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", - "dev": true - }, - "signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, - "simple-concat": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", - "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", - "dev": true - }, - "simple-get": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", - "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", - "dev": true, - "requires": { - "decompress-response": "^6.0.0", - "once": "^1.3.1", - "simple-concat": "^1.0.0" - } - }, - "simple-update-notifier": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", - "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==", - "dev": true, - "requires": { - "semver": "^7.5.3" - } - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - }, - "source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", - "dev": true - }, - "stackback": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", - "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", - "dev": true - }, - "statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" - }, - "std-env": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.3.3.tgz", - "integrity": "sha512-Rz6yejtVyWnVjC1RFvNmYL10kgjC49EOghxWn0RFqlCHGFpQx+Xe7yW3I4ceK1SGrWIGMjD5Kbue8W/udkbMJg==", - "dev": true - }, - "stream-meter": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/stream-meter/-/stream-meter-1.0.4.tgz", - "integrity": "sha512-4sOEtrbgFotXwnEuzzsQBYEV1elAeFSO8rSGeTwabuX1RRn/kEq9JVH7I0MRBhKVRR0sJkr0M0QCH7yOLf9fhQ==", - "dev": true, - "requires": { - "readable-stream": "^2.1.4" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dev": true, - "requires": { - "safe-buffer": "~5.2.0" - } - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true - }, - "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", - "dev": true - }, - "strip-literal": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-1.0.1.tgz", - "integrity": "sha512-QZTsipNpa2Ppr6v1AmJHESqJ3Uz247MUS0OjrnnZjFAvEoWqxuyFuXn2xLgMtRnijJShAa1HL0gtJyUs7u7n3Q==", - "dev": true, - "requires": { - "acorn": "^8.8.2" - } - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - }, - "supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true - }, - "tar": { - "version": "6.1.15", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.15.tgz", - "integrity": "sha512-/zKt9UyngnxIT/EAGYuxaMYgOIJiP81ab9ZfkILq4oNLPFX50qyYmu7jRj9qeXoxmJHjGlbH0+cm2uy1WCs10A==", - "dev": true, - "requires": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^5.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - } - }, - "tar-fs": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", - "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", - "dev": true, - "requires": { - "chownr": "^1.1.1", - "mkdirp-classic": "^0.5.2", - "pump": "^3.0.0", - "tar-stream": "^2.1.4" - }, - "dependencies": { - "chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", - "dev": true - } - } - }, - "tar-stream": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", - "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", - "dev": true, - "requires": { - "bl": "^4.0.3", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" - } - }, - "test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", - "dev": true, - "requires": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - } - }, - "tinybench": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.5.0.tgz", - "integrity": "sha512-kRwSG8Zx4tjF9ZiyH4bhaebu+EDz1BOx9hOigYHlUW4xxI/wKIUQUqo018UlU4ar6ATPBsaMrdbKZ+tmPdohFA==", - "dev": true - }, - "tinypool": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-0.6.0.tgz", - "integrity": "sha512-FdswUUo5SxRizcBc6b1GSuLpLjisa8N8qMyYoP3rl+bym+QauhtJP5bvZY1ytt8krKGmMLYIRl36HBZfeAoqhQ==", - "dev": true - }, - "tinyspy": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-2.1.1.tgz", - "integrity": "sha512-XPJL2uSzcOyBMky6OFrusqWlzfFrXtE0hPuMgW8A2HmaqrPo4ZQHRN/V0QXN3FSjKxpsbRrFc5LI7KOwBsT1/w==", - "dev": true - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "dev": true - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - }, - "toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" - }, - "touch": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", - "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", - "dev": true, - "requires": { - "nopt": "~1.0.10" - }, - "dependencies": { - "nopt": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", - "integrity": "sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==", - "dev": true, - "requires": { - "abbrev": "1" - } - } - } - }, - "tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "dev": true - }, - "ts-essentials": { - "version": "9.3.2", - "resolved": "https://registry.npmjs.org/ts-essentials/-/ts-essentials-9.3.2.tgz", - "integrity": "sha512-JxKJzuWqH1MmH4ZFHtJzGEhkfN3QvVR3C3w+4BIoWeoY68UVVoA2Np/Bca9z0IPSErVCWhv439aT0We4Dks8kQ==", - "dev": true, - "requires": {} - }, - "ts-node": { - "version": "10.9.1", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", - "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", - "dev": true, - "requires": { - "@cspotcode/source-map-support": "^0.8.0", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "v8-compile-cache-lib": "^3.0.1", - "yn": "3.1.1" - } - }, - "tsconfck": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/tsconfck/-/tsconfck-2.1.1.tgz", - "integrity": "sha512-ZPCkJBKASZBmBUNqGHmRhdhM8pJYDdOXp4nRgj/O0JwUwsMq50lCDRQP/M5GBNAA0elPrq4gAeu4dkaVCuKWww==", - "dev": true, - "requires": {} - }, - "tsconfig-paths": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", - "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==", - "dev": true, - "requires": { - "json5": "^2.2.2", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" - } - }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", - "dev": true, - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true - }, - "type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "requires": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - } - }, - "typescript": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.2.tgz", - "integrity": "sha512-wVORMBGO/FAs/++blGNeAVdbNKtIh1rbBL2EyQ1+J9lClJ93KiiKe8PmFIVdXhHcyv44SL9oglmfeSsndo0jRw==", - "dev": true - }, - "ufo": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.1.2.tgz", - "integrity": "sha512-TrY6DsjTQQgyS3E3dBaOXf0TpPD8u9FVrVYmKVegJuFw51n/YB9XPt+U6ydzFG5ZIN7+DIjPbNmXoBj9esYhgQ==", - "dev": true - }, - "undefsafe": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", - "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", - "dev": true - }, - "universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true - }, - "unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==" - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true - }, - "utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==" - }, - "v8-compile-cache-lib": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", - "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", - "dev": true - }, - "v8-to-istanbul": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.1.0.tgz", - "integrity": "sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA==", - "dev": true, - "requires": { - "@jridgewell/trace-mapping": "^0.3.12", - "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^1.6.0" - } - }, - "vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==" - }, - "vite": { - "version": "4.4.4", - "resolved": "https://registry.npmjs.org/vite/-/vite-4.4.4.tgz", - "integrity": "sha512-4mvsTxjkveWrKDJI70QmelfVqTm+ihFAb6+xf4sjEU2TmUCTlVX87tmg/QooPEMQb/lM9qGHT99ebqPziEd3wg==", - "dev": true, - "requires": { - "esbuild": "^0.18.10", - "fsevents": "~2.3.2", - "postcss": "^8.4.25", - "rollup": "^3.25.2" - }, - "dependencies": { - "@esbuild/android-arm": { - "version": "0.18.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.12.tgz", - "integrity": "sha512-LIxaNIQfkFZbTLb4+cX7dozHlAbAshhFE5PKdro0l+FnCpx1GDJaQ2WMcqm+ToXKMt8p8Uojk/MFRuGyz3V5Sw==", - "dev": true, - "optional": true - }, - "@esbuild/android-arm64": { - "version": "0.18.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.12.tgz", - "integrity": "sha512-BMAlczRqC/LUt2P97E4apTBbkvS9JTJnp2DKFbCwpZ8vBvXVbNdqmvzW/OsdtI/+mGr+apkkpqGM8WecLkPgrA==", - "dev": true, - "optional": true - }, - "@esbuild/android-x64": { - "version": "0.18.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.12.tgz", - "integrity": "sha512-zU5MyluNsykf5cOJ0LZZZjgAHbhPJ1cWfdH1ZXVMXxVMhEV0VZiZXQdwBBVvmvbF28EizeK7obG9fs+fpmS0eQ==", - "dev": true, - "optional": true - }, - "@esbuild/darwin-arm64": { - "version": "0.18.12", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.12.tgz", - "integrity": "sha512-zUZMep7YONnp6954QOOwEBwFX9svlKd3ov6PkxKd53LGTHsp/gy7vHaPGhhjBmEpqXEXShi6dddjIkmd+NgMsA==", - "dev": true, - "optional": true - }, - "@esbuild/darwin-x64": { - "version": "0.18.12", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.12.tgz", - "integrity": "sha512-ohqLPc7i67yunArPj1+/FeeJ7AgwAjHqKZ512ADk3WsE3FHU9l+m5aa7NdxXr0HmN1bjDlUslBjWNbFlD9y12Q==", - "dev": true, - "optional": true - }, - "@esbuild/freebsd-arm64": { - "version": "0.18.12", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.12.tgz", - "integrity": "sha512-GIIHtQXqgeOOqdG16a/A9N28GpkvjJnjYMhOnXVbn3EDJcoItdR58v/pGN31CHjyXDc8uCcRnFWmqaJt24AYJg==", - "dev": true, - "optional": true - }, - "@esbuild/freebsd-x64": { - "version": "0.18.12", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.12.tgz", - "integrity": "sha512-zK0b9a1/0wZY+6FdOS3BpZcPc1kcx2G5yxxfEJtEUzVxI6n/FrC2Phsxj/YblPuBchhBZ/1wwn7AyEBUyNSa6g==", - "dev": true, - "optional": true - }, - "@esbuild/linux-arm": { - "version": "0.18.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.12.tgz", - "integrity": "sha512-y75OijvrBE/1XRrXq1jtrJfG26eHeMoqLJ2dwQNwviwTuTtHGCojsDO6BJNF8gU+3jTn1KzJEMETytwsFSvc+Q==", - "dev": true, - "optional": true - }, - "@esbuild/linux-arm64": { - "version": "0.18.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.12.tgz", - "integrity": "sha512-JKgG8Q/LL/9sw/iHHxQyVMoQYu3rU3+a5Z87DxC+wAu3engz+EmctIrV+FGOgI6gWG1z1+5nDDbXiRMGQZXqiw==", - "dev": true, - "optional": true - }, - "@esbuild/linux-ia32": { - "version": "0.18.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.12.tgz", - "integrity": "sha512-yoRIAqc0B4lDIAAEFEIu9ttTRFV84iuAl0KNCN6MhKLxNPfzwCBvEMgwco2f71GxmpBcTtn7KdErueZaM2rEvw==", - "dev": true, - "optional": true - }, - "@esbuild/linux-loong64": { - "version": "0.18.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.12.tgz", - "integrity": "sha512-qYgt3dHPVvf/MgbIBpJ4Sup/yb9DAopZ3a2JgMpNKIHUpOdnJ2eHBo/aQdnd8dJ21X/+sS58wxHtA9lEazYtXQ==", - "dev": true, - "optional": true - }, - "@esbuild/linux-mips64el": { - "version": "0.18.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.12.tgz", - "integrity": "sha512-wHphlMLK4ufNOONqukELfVIbnGQJrHJ/mxZMMrP2jYrPgCRZhOtf0kC4yAXBwnfmULimV1qt5UJJOw4Kh13Yfg==", - "dev": true, - "optional": true - }, - "@esbuild/linux-ppc64": { - "version": "0.18.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.12.tgz", - "integrity": "sha512-TeN//1Ft20ZZW41+zDSdOI/Os1bEq5dbvBvYkberB7PHABbRcsteeoNVZFlI0YLpGdlBqohEpjrn06kv8heCJg==", - "dev": true, - "optional": true - }, - "@esbuild/linux-riscv64": { - "version": "0.18.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.12.tgz", - "integrity": "sha512-AgUebVS4DoAblBgiB2ACQ/8l4eGE5aWBb8ZXtkXHiET9mbj7GuWt3OnsIW/zX+XHJt2RYJZctbQ2S/mDjbp0UA==", - "dev": true, - "optional": true - }, - "@esbuild/linux-s390x": { - "version": "0.18.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.12.tgz", - "integrity": "sha512-dJ3Rb3Ei2u/ysSXd6pzleGtfDdc2MuzKt8qc6ls8vreP1G3B7HInX3i7gXS4BGeVd24pp0yqyS7bJ5NHaI9ing==", - "dev": true, - "optional": true - }, - "@esbuild/linux-x64": { - "version": "0.18.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.12.tgz", - "integrity": "sha512-OrNJMGQbPaVyHHcDF8ybNSwu7TDOfX8NGpXCbetwOSP6txOJiWlgQnRymfC9ocR1S0Y5PW0Wb1mV6pUddqmvmQ==", - "dev": true, - "optional": true - }, - "@esbuild/netbsd-x64": { - "version": "0.18.12", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.12.tgz", - "integrity": "sha512-55FzVCAiwE9FK8wWeCRuvjazNRJ1QqLCYGZVB6E8RuQuTeStSwotpSW4xoRGwp3a1wUsaVCdYcj5LGCASVJmMg==", - "dev": true, - "optional": true - }, - "@esbuild/openbsd-x64": { - "version": "0.18.12", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.12.tgz", - "integrity": "sha512-qnluf8rfb6Y5Lw2tirfK2quZOBbVqmwxut7GPCIJsM8lc4AEUj9L8y0YPdLaPK0TECt4IdyBdBD/KRFKorlK3g==", - "dev": true, - "optional": true - }, - "@esbuild/sunos-x64": { - "version": "0.18.12", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.12.tgz", - "integrity": "sha512-+RkKpVQR7bICjTOPUpkTBTaJ4TFqQBX5Ywyd/HSdDkQGn65VPkTsR/pL4AMvuMWy+wnXgIl4EY6q4mVpJal8Kg==", - "dev": true, - "optional": true - }, - "@esbuild/win32-arm64": { - "version": "0.18.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.12.tgz", - "integrity": "sha512-GNHuciv0mFM7ouzsU0+AwY+7eV4Mgo5WnbhfDCQGtpvOtD1vbOiRjPYG6dhmMoFyBjj+pNqQu2X+7DKn0KQ/Gw==", - "dev": true, - "optional": true - }, - "@esbuild/win32-ia32": { - "version": "0.18.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.12.tgz", - "integrity": "sha512-kR8cezhYipbbypGkaqCTWIeu4zID17gamC8YTPXYtcN3E5BhhtTnwKBn9I0PJur/T6UVwIEGYzkffNL0lFvxEw==", - "dev": true, - "optional": true - }, - "@esbuild/win32-x64": { - "version": "0.18.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.12.tgz", - "integrity": "sha512-O0UYQVkvfM/jO8a4OwoV0mAKSJw+mjWTAd1MJd/1FCX6uiMdLmMRPK/w6e9OQ0ob2WGxzIm9va/KG0Ja4zIOgg==", - "dev": true, - "optional": true - }, - "esbuild": { - "version": "0.18.12", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.12.tgz", - "integrity": "sha512-XuOVLDdtsDslXStStduT41op21Ytmf4/BDS46aa3xPJ7X5h2eMWBF1oAe3QjUH3bDksocNXgzGUZ7XHIBya6Tg==", - "dev": true, - "requires": { - "@esbuild/android-arm": "0.18.12", - "@esbuild/android-arm64": "0.18.12", - "@esbuild/android-x64": "0.18.12", - "@esbuild/darwin-arm64": "0.18.12", - "@esbuild/darwin-x64": "0.18.12", - "@esbuild/freebsd-arm64": "0.18.12", - "@esbuild/freebsd-x64": "0.18.12", - "@esbuild/linux-arm": "0.18.12", - "@esbuild/linux-arm64": "0.18.12", - "@esbuild/linux-ia32": "0.18.12", - "@esbuild/linux-loong64": "0.18.12", - "@esbuild/linux-mips64el": "0.18.12", - "@esbuild/linux-ppc64": "0.18.12", - "@esbuild/linux-riscv64": "0.18.12", - "@esbuild/linux-s390x": "0.18.12", - "@esbuild/linux-x64": "0.18.12", - "@esbuild/netbsd-x64": "0.18.12", - "@esbuild/openbsd-x64": "0.18.12", - "@esbuild/sunos-x64": "0.18.12", - "@esbuild/win32-arm64": "0.18.12", - "@esbuild/win32-ia32": "0.18.12", - "@esbuild/win32-x64": "0.18.12" - } - } - } - }, - "vite-node": { - "version": "0.33.0", - "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-0.33.0.tgz", - "integrity": "sha512-19FpHYbwWWxDr73ruNahC+vtEdza52kA90Qb3La98yZ0xULqV8A5JLNPUff0f5zID4984tW7l3DH2przTJUZSw==", - "dev": true, - "requires": { - "cac": "^6.7.14", - "debug": "^4.3.4", - "mlly": "^1.4.0", - "pathe": "^1.1.1", - "picocolors": "^1.0.0", - "vite": "^3.0.0 || ^4.0.0" - } - }, - "vite-tsconfig-paths": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/vite-tsconfig-paths/-/vite-tsconfig-paths-4.2.0.tgz", - "integrity": "sha512-jGpus0eUy5qbbMVGiTxCL1iB9ZGN6Bd37VGLJU39kTDD6ZfULTTb1bcc5IeTWqWJKiWV5YihCaibeASPiGi8kw==", - "dev": true, - "requires": { - "debug": "^4.1.1", - "globrex": "^0.1.2", - "tsconfck": "^2.1.0" - } - }, - "vitest": { - "version": "0.33.0", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-0.33.0.tgz", - "integrity": "sha512-1CxaugJ50xskkQ0e969R/hW47za4YXDUfWJDxip1hwbnhUjYolpfUn2AMOulqG/Dtd9WYAtkHmM/m3yKVrEejQ==", - "dev": true, - "requires": { - "@types/chai": "^4.3.5", - "@types/chai-subset": "^1.3.3", - "@types/node": "*", - "@vitest/expect": "0.33.0", - "@vitest/runner": "0.33.0", - "@vitest/snapshot": "0.33.0", - "@vitest/spy": "0.33.0", - "@vitest/utils": "0.33.0", - "acorn": "^8.9.0", - "acorn-walk": "^8.2.0", - "cac": "^6.7.14", - "chai": "^4.3.7", - "debug": "^4.3.4", - "local-pkg": "^0.4.3", - "magic-string": "^0.30.1", - "pathe": "^1.1.1", - "picocolors": "^1.0.0", - "std-env": "^3.3.3", - "strip-literal": "^1.0.1", - "tinybench": "^2.5.0", - "tinypool": "^0.6.0", - "vite": "^3.0.0 || ^4.0.0", - "vite-node": "0.33.0", - "why-is-node-running": "^2.2.2" - } - }, - "vitest-mock-extended": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/vitest-mock-extended/-/vitest-mock-extended-1.1.4.tgz", - "integrity": "sha512-MKPdepFjk0CE7Ocb5txntHK/sloHO9s0Kk9dr630uL03shRSHMkZtSs5CBPsbJ8K/CvYLv0GHUmMt2zWks2eXg==", - "dev": true, - "requires": { - "ts-essentials": "^9.3.2" - } - }, - "webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "dev": true - }, - "whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dev": true, - "requires": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "why-is-node-running": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.2.2.tgz", - "integrity": "sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==", - "dev": true, - "requires": { - "siginfo": "^2.0.0", - "stackback": "0.0.2" - } - }, - "wide-align": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", - "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", - "dev": true, - "requires": { - "string-width": "^1.0.2 || 2 || 3 || 4" - } - }, - "wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true - }, - "y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==" - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "requires": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - } - }, - "yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==" - }, - "yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true - }, - "yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true - } - } -} diff --git a/services/gateway/package.json b/services/gateway/package.json index 8cec896d..7c7763b7 100644 --- a/services/gateway/package.json +++ b/services/gateway/package.json @@ -8,21 +8,22 @@ "build": "esbuild src/server.ts --bundle --platform=node --target=node18 --outfile=dist/index.js", "test": "vitest", "coverage": "vitest --coverage", + "swagger": "node src/utils/swagger.utils.js", "pkg": "pkg ." }, "dependencies": { - "@grpc/grpc-js": "1.8.14", - "@grpc/proto-loader": "0.7.6", "@types/express": "^4.17.17", "axios": "^1.4.0", "body-parser": "^1.20.2", "dotenv": "^16.0.3", "express": "^4.18.2", - "grpc-server-reflection": "^0.1.5", - "protobufjs": "^7.2.4" + "google-protobuf": "^3.21.2", + "grpc": "^1.24.11", + "swagger-autogen": "^2.23.5" }, "devDependencies": { "@types/amqplib": "^0.10.1", + "@types/google-protobuf": "^3.15.6", "@types/node": "^18.15.9", "@vitest/coverage-c8": "^0.33.0", "esbuild": "^0.17.18", diff --git a/services/gateway/src/controller/user/userController.ts b/services/gateway/src/controller/user/userController.ts new file mode 100644 index 00000000..df9de11d --- /dev/null +++ b/services/gateway/src/controller/user/userController.ts @@ -0,0 +1,31 @@ +import express, {Request, Response} from 'express'; +import userService from '../../services/user_service'; +import {UserId} from "@order/proto/user_pb"; +import {Empty} from "google-protobuf/google/protobuf/empty_pb"; + + +export const userController = (app: express.Application) => { + app.get('/api/user/:id', (req: Request, res: Response) => { + const {id} = req.params; + const userId = new UserId(); + userId.setId(Number(id)); + + userService.getUser(userId, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } + }); + }); + + app.get('/api/user', (req: Request, res: Response) => { + userService.listUser(new Empty(), (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } + }); + }); +} \ No newline at end of file diff --git a/services/gateway/src/index.ts b/services/gateway/src/server.ts similarity index 81% rename from services/gateway/src/index.ts rename to services/gateway/src/server.ts index 4bb2a14d..8c751ad9 100644 --- a/services/gateway/src/index.ts +++ b/services/gateway/src/server.ts @@ -1,4 +1,5 @@ import {Request, Response} from "express"; +import {userController} from "@order/controller/user/userController"; const express = require('express'); const bodyParser = require('body-parser'); @@ -12,6 +13,8 @@ app.get('/', (req: Request, res: Response) => { res.send('Node.js API Gateway is up and running!'); }); +userController(app); + app.listen(PORT, () => { console.log(`API Gateway is running on port ${PORT}`); }); \ No newline at end of file diff --git a/services/gateway/src/services/user_service.ts b/services/gateway/src/services/user_service.ts new file mode 100644 index 00000000..25693673 --- /dev/null +++ b/services/gateway/src/services/user_service.ts @@ -0,0 +1,6 @@ +import services from '../proto/user_grpc_pb'; +import * as grpc from "grpc"; + +export default new services.UserServiceClient( + 'http://localhost:50001', + grpc.credentials.createInsecure()); \ No newline at end of file diff --git a/services/gateway/src/utils/swagger.utils.js b/services/gateway/src/utils/swagger.utils.js new file mode 100644 index 00000000..00b6a82d --- /dev/null +++ b/services/gateway/src/utils/swagger.utils.js @@ -0,0 +1,17 @@ +const swaggerAutogen = require('swagger-autogen')();userController + +const doc = { + info: { + title: 'My API', + description: 'Description' + }, + host: 'localhost:3000' +}; + +const outputFile = './swagger-output.json'; +const routes = ['../controller/user/userController.ts']; + +/* NOTE: If you are using the express Router, you must pass in the 'routes' only the +root file where the route starts, such as index.js, app.js, routes.js, etc ... */ + +swaggerAutogen(outputFile, routes, doc); \ No newline at end of file diff --git a/services/proto/build-protos.sh b/services/proto/build-protos.sh new file mode 100644 index 00000000..3334dd19 --- /dev/null +++ b/services/proto/build-protos.sh @@ -0,0 +1,23 @@ +#!/bin/bash + +BASEDIR=$(dirname "$0") +cd ${BASEDIR}/../ + +PROTO_DEST=./src/proto + +mkdir -p ${PROTO_DEST} + +# JavaScript code generation +yarn run grpc_tools_node_protoc \ + --js_out=import_style=commonjs,binary:${PROTO_DEST} \ + --grpc_out=${PROTO_DEST} \ + --plugin=protoc-gen-grpc=./node_modules/.bin/grpc_tools_node_protoc_plugin \ + -I ./proto \ + proto/*.proto + +# TypeScript code generation +yarn run grpc_tools_node_protoc \ + --plugin=protoc-gen-ts=./node_modules/.bin/protoc-gen-ts \ + --ts_out=${PROTO_DEST} \ + -I ./proto \ + proto/*.proto \ No newline at end of file From f6921a9b2f6ecf5e4a15526e9711e61c921c41f4 Mon Sep 17 00:00:00 2001 From: anatole Date: Wed, 19 Jul 2023 00:40:40 +0200 Subject: [PATCH 392/883] feat(app): add package-lock.json --- services/gateway/package-lock.json | 7718 ++++++++++++++++++++++++++++ 1 file changed, 7718 insertions(+) create mode 100644 services/gateway/package-lock.json diff --git a/services/gateway/package-lock.json b/services/gateway/package-lock.json new file mode 100644 index 00000000..ba01f642 --- /dev/null +++ b/services/gateway/package-lock.json @@ -0,0 +1,7718 @@ +{ + "name": "@goodfood/gateway", + "version": "1.0.0", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "@goodfood/gateway", + "version": "1.0.0", + "license": "ISC", + "dependencies": { + "@types/express": "^4.17.17", + "axios": "^1.4.0", + "body-parser": "^1.20.2", + "dotenv": "^16.0.3", + "express": "^4.18.2", + "google-protobuf": "^3.21.2", + "grpc": "^1.24.11", + "swagger-autogen": "^2.23.5" + }, + "bin": { + "gateway": "dist/index.js" + }, + "devDependencies": { + "@types/amqplib": "^0.10.1", + "@types/google-protobuf": "^3.15.6", + "@types/node": "^18.15.9", + "@vitest/coverage-c8": "^0.33.0", + "esbuild": "^0.17.18", + "grpc-tools": "^1.12.4", + "nodemon": "^3.0.1", + "pkg": "^5.8.1", + "ts-node": "10.9.1", + "tsconfig-paths": "^4.2.0", + "typescript": "5.0.2", + "vite-tsconfig-paths": "^4.2.0", + "vitest": "^0.33.0", + "vitest-mock-extended": "^1.1.4" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", + "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/generator": { + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.2.tgz", + "integrity": "sha512-W1lG5vUwFvfMd8HVXqdfbuG7RuaSrTCCD8cl8fP8wOivdbtbIg2Db3IWUcgvfxKbbn6ZBGYRW/Zk1MIwK49mgw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.18.2", + "@jridgewell/gen-mapping": "^0.3.0", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", + "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz", + "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.18.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.4.tgz", + "integrity": "sha512-FDge0dFazETFcxGw/EXzOkN8uJp0PC7Qbm+Pe9T+av2zlBpOgunFHkQPPn+eRuClU73JF+98D531UgayY89tow==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/types": { + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.19.0.tgz", + "integrity": "sha512-YuGopBq3ke25BVSiS6fgF49Ul9gH1x70Bcr6bqRLjWCkcX8Hre1/5+z+IiWOIerRMSSEfGZVB9z9kyq7wVs9YA==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.18.10", + "@babel/helper-validator-identifier": "^7.18.6", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true + }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.19.tgz", + "integrity": "sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/schemas": { + "version": "29.6.0", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.0.tgz", + "integrity": "sha512-rxLjXyJBTL4LQeJW3aKo0M/+GkCOXsO+8i9Iu7eDb6KwtP65ayoDsitrdPBtujxQ88k4wI2FNYfa6TOGwSn6cQ==", + "dev": true, + "dependencies": { + "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.18", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", + "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" + } + }, + "node_modules/@jridgewell/trace-mapping/node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "dev": true + }, + "node_modules/@mapbox/node-pre-gyp": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.11.tgz", + "integrity": "sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==", + "dependencies": { + "detect-libc": "^2.0.0", + "https-proxy-agent": "^5.0.0", + "make-dir": "^3.1.0", + "node-fetch": "^2.6.7", + "nopt": "^5.0.0", + "npmlog": "^5.0.1", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.11" + }, + "bin": { + "node-pre-gyp": "bin/node-pre-gyp" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "dev": true + }, + "node_modules/@tsconfig/node10": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", + "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", + "dev": true + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", + "dev": true + }, + "node_modules/@types/amqplib": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/@types/amqplib/-/amqplib-0.10.1.tgz", + "integrity": "sha512-j6ANKT79ncUDnAs/+9r9eDujxbeJoTjoVu33gHHcaPfmLQaMhvfbH2GqSe8KUM444epAp1Vl3peVOQfZk3UIqA==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/body-parser": { + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", + "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/bytebuffer": { + "version": "5.0.44", + "resolved": "https://registry.npmjs.org/@types/bytebuffer/-/bytebuffer-5.0.44.tgz", + "integrity": "sha512-k1qonHga/SfQT02NF633i+7tIfKd+cfC/8pjnedcfuXJNMWooss/FkCgRMSnLf2WorLjbuH4bfgAZEbtyHBDoQ==", + "dependencies": { + "@types/long": "^3.0.0", + "@types/node": "*" + } + }, + "node_modules/@types/bytebuffer/node_modules/@types/long": { + "version": "3.0.32", + "resolved": "https://registry.npmjs.org/@types/long/-/long-3.0.32.tgz", + "integrity": "sha512-ZXyOOm83p7X8p3s0IYM3VeueNmHpkk/yMlP8CLeOnEcu6hIwPH7YjZBvhQkR0ZFS2DqZAxKtJ/M5fcuv3OU5BA==" + }, + "node_modules/@types/chai": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.5.tgz", + "integrity": "sha512-mEo1sAde+UCE6b2hxn332f1g1E8WfYRu6p5SvTKr2ZKC1f7gFJXk4h5PyGP9Dt6gCaG8y8XhwnXWC6Iy2cmBng==", + "dev": true + }, + "node_modules/@types/chai-subset": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@types/chai-subset/-/chai-subset-1.3.3.tgz", + "integrity": "sha512-frBecisrNGz+F4T6bcc+NLeolfiojh5FxW2klu669+8BARtyQv2C/GkNW6FUodVe4BroGMP/wER/YDGc7rEllw==", + "dev": true, + "dependencies": { + "@types/chai": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.35", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", + "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/express": { + "version": "4.17.17", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.17.tgz", + "integrity": "sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==", + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "4.17.35", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.35.tgz", + "integrity": "sha512-wALWQwrgiB2AWTT91CB62b6Yt0sNHpznUXeZEcnPU3DRdlDIz74x8Qg1UUYKSVFi+va5vKOLYRBI1bRKiLLKIg==", + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/google-protobuf": { + "version": "3.15.6", + "resolved": "https://registry.npmjs.org/@types/google-protobuf/-/google-protobuf-3.15.6.tgz", + "integrity": "sha512-pYVNNJ+winC4aek+lZp93sIKxnXt5qMkuKmaqS3WGuTq0Bw1ZDYNBgzG5kkdtwcv+GmYJGo3yEg6z2cKKAiEdw==", + "dev": true + }, + "node_modules/@types/http-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-/K3ds8TRAfBvi5vfjuz8y6+GiAYBZ0x4tXv1Av6CWBWn0IlADc+ZX9pMq7oU0fNQPnBwIZl3rmeLp6SBApbxSQ==" + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", + "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", + "dev": true + }, + "node_modules/@types/mime": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", + "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==" + }, + "node_modules/@types/node": { + "version": "18.15.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.9.tgz", + "integrity": "sha512-dUxhiNzBLr6IqlZXz6e/rN2YQXlFgOei/Dxy+e3cyXTJ4txSUbGT2/fmnD6zd/75jDMeW5bDee+YXxlFKHoV0A==" + }, + "node_modules/@types/qs": { + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==" + }, + "node_modules/@types/range-parser": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", + "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==" + }, + "node_modules/@types/send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.1.tgz", + "integrity": "sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q==", + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.2.tgz", + "integrity": "sha512-J2LqtvFYCzaj8pVYKw8klQXrLLk7TBZmQ4ShlcdkELFKGwGMfevMLneMMRkMgZxotOD9wg497LpC7O8PcvAmfw==", + "dependencies": { + "@types/http-errors": "*", + "@types/mime": "*", + "@types/node": "*" + } + }, + "node_modules/@vitest/coverage-c8": { + "version": "0.33.0", + "resolved": "https://registry.npmjs.org/@vitest/coverage-c8/-/coverage-c8-0.33.0.tgz", + "integrity": "sha512-DaF1zJz4dcOZS4k/neiQJokmOWqsGXwhthfmUdPGorXIQHjdPvV6JQSYhQDI41MyI8c+IieQUdIDs5XAMHtDDw==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.2.1", + "c8": "^7.14.0", + "magic-string": "^0.30.1", + "picocolors": "^1.0.0", + "std-env": "^3.3.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "vitest": ">=0.30.0 <1" + } + }, + "node_modules/@vitest/expect": { + "version": "0.33.0", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-0.33.0.tgz", + "integrity": "sha512-sVNf+Gla3mhTCxNJx+wJLDPp/WcstOe0Ksqz4Vec51MmgMth/ia0MGFEkIZmVGeTL5HtjYR4Wl/ZxBxBXZJTzQ==", + "dev": true, + "dependencies": { + "@vitest/spy": "0.33.0", + "@vitest/utils": "0.33.0", + "chai": "^4.3.7" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/runner": { + "version": "0.33.0", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-0.33.0.tgz", + "integrity": "sha512-UPfACnmCB6HKRHTlcgCoBh6ppl6fDn+J/xR8dTufWiKt/74Y9bHci5CKB8tESSV82zKYtkBJo9whU3mNvfaisg==", + "dev": true, + "dependencies": { + "@vitest/utils": "0.33.0", + "p-limit": "^4.0.0", + "pathe": "^1.1.1" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/runner/node_modules/p-limit": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", + "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^1.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@vitest/runner/node_modules/yocto-queue": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", + "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", + "dev": true, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@vitest/snapshot": { + "version": "0.33.0", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-0.33.0.tgz", + "integrity": "sha512-tJjrl//qAHbyHajpFvr8Wsk8DIOODEebTu7pgBrP07iOepR5jYkLFiqLq2Ltxv+r0uptUb4izv1J8XBOwKkVYA==", + "dev": true, + "dependencies": { + "magic-string": "^0.30.1", + "pathe": "^1.1.1", + "pretty-format": "^29.5.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/spy": { + "version": "0.33.0", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-0.33.0.tgz", + "integrity": "sha512-Kv+yZ4hnH1WdiAkPUQTpRxW8kGtH8VRTnus7ZTGovFYM1ZezJpvGtb9nPIjPnptHbsyIAxYZsEpVPYgtpjGnrg==", + "dev": true, + "dependencies": { + "tinyspy": "^2.1.1" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/utils": { + "version": "0.33.0", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-0.33.0.tgz", + "integrity": "sha512-pF1w22ic965sv+EN6uoePkAOTkAPWM03Ri/jXNyMIKBb/XHLDPfhLvf/Fa9g0YECevAIz56oVYXhodLvLQ/awA==", + "dev": true, + "dependencies": { + "diff-sequences": "^29.4.3", + "loupe": "^2.3.6", + "pretty-format": "^29.5.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/aproba": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==" + }, + "node_modules/are-we-there-yet": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", + "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ascli": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ascli/-/ascli-1.0.1.tgz", + "integrity": "sha512-JGQaNxpaCJz9Bd1JvVaFIHuWn9S+l3xhN17R0V/vmUDiGE0QngNMXhjlqpwqV+91plWz9Fg+Lt28Lj7p5vjs8A==", + "dependencies": { + "colour": "~0.7.1", + "optjs": "~3.2.2" + } + }, + "node_modules/assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "node_modules/at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/axios": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.4.0.tgz", + "integrity": "sha512-S4XCWMEmzvo64T9GfvQDOXgYRDJ/wsSZc7Jvdgx5u1sd0JwsuPLqb3SYmusag+edF6ziyMensPVqLTSc1PiSEA==", + "dependencies": { + "follow-redirects": "^1.15.0", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dev": true, + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/body-parser": { + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", + "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/bytebuffer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/bytebuffer/-/bytebuffer-5.0.1.tgz", + "integrity": "sha512-IuzSdmADppkZ6DlpycMkm8l9zeEq16fWtLvunEwFiYciR/BHo4E8/xs5piFquG+Za8OWmMqHF8zuRviz2LHvRQ==", + "dependencies": { + "long": "~3" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/bytebuffer/node_modules/long": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/long/-/long-3.2.0.tgz", + "integrity": "sha512-ZYvPPOMqUwPoDsbJaR10iQJYnMuZhRTvHYl62ErLIEX7RgFlziSBUUvrt3OVfc47QlHHpzPZYP17g3Fv7oeJkg==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/c8": { + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/c8/-/c8-7.14.0.tgz", + "integrity": "sha512-i04rtkkcNcCf7zsQcSv/T9EbUn4RXQ6mropeMcjFOsQXQ0iGLAr/xT6TImQg4+U9hmNpN9XdvPkjUL1IzbgxJw==", + "dev": true, + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@istanbuljs/schema": "^0.1.3", + "find-up": "^5.0.0", + "foreground-child": "^2.0.0", + "istanbul-lib-coverage": "^3.2.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-reports": "^3.1.4", + "rimraf": "^3.0.2", + "test-exclude": "^6.0.0", + "v8-to-istanbul": "^9.0.0", + "yargs": "^16.2.0", + "yargs-parser": "^20.2.9" + }, + "bin": { + "c8": "bin/c8.js" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/cac": { + "version": "6.7.14", + "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", + "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha512-DLIsRzJVBQu72meAKPkWQOLcujdXT32hwdfnkI1frSiSRMK1MofjKHf+MEx0SB6fjEFXL8fBDv1dKymBlOp4Qw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/chai": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.7.tgz", + "integrity": "sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==", + "dev": true, + "dependencies": { + "assertion-error": "^1.1.0", + "check-error": "^1.0.2", + "deep-eql": "^4.1.2", + "get-func-name": "^2.0.0", + "loupe": "^2.3.1", + "pathval": "^1.1.1", + "type-detect": "^4.0.5" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/check-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", + "integrity": "sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "engines": { + "node": ">=10" + } + }, + "node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "bin": { + "color-support": "bin.js" + } + }, + "node_modules/colour": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/colour/-/colour-0.7.1.tgz", + "integrity": "sha512-Rel466v0EnmKPcsxHo91L4kgPs/6XF7Pu2LJNszq9lXYwi5CFWEeIiRaTX5ym7PPMdj4udDHkLSVC1//JVkZQg==", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "node_modules/console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==" + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true + }, + "node_modules/cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "dev": true + }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "dev": true, + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/deep-eql": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz", + "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==", + "dev": true, + "dependencies": { + "type-detect": "^4.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "dev": true, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==" + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detect-libc": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz", + "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/diff-sequences": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.4.3.tgz", + "integrity": "sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dotenv": { + "version": "16.3.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.3.1.tgz", + "integrity": "sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/motdotla/dotenv?sponsor=1" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/esbuild": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.19.tgz", + "integrity": "sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.17.19", + "@esbuild/android-arm64": "0.17.19", + "@esbuild/android-x64": "0.17.19", + "@esbuild/darwin-arm64": "0.17.19", + "@esbuild/darwin-x64": "0.17.19", + "@esbuild/freebsd-arm64": "0.17.19", + "@esbuild/freebsd-x64": "0.17.19", + "@esbuild/linux-arm": "0.17.19", + "@esbuild/linux-arm64": "0.17.19", + "@esbuild/linux-ia32": "0.17.19", + "@esbuild/linux-loong64": "0.17.19", + "@esbuild/linux-mips64el": "0.17.19", + "@esbuild/linux-ppc64": "0.17.19", + "@esbuild/linux-riscv64": "0.17.19", + "@esbuild/linux-s390x": "0.17.19", + "@esbuild/linux-x64": "0.17.19", + "@esbuild/netbsd-x64": "0.17.19", + "@esbuild/openbsd-x64": "0.17.19", + "@esbuild/sunos-x64": "0.17.19", + "@esbuild/win32-arm64": "0.17.19", + "@esbuild/win32-ia32": "0.17.19", + "@esbuild/win32-x64": "0.17.19" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/expand-template": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", + "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/express": { + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.1", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.5.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/express/node_modules/body-parser": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/express/node_modules/raw-body": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/fast-glob": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.0.tgz", + "integrity": "sha512-ChDuvbOypPuNjO8yIDf36x7BlZX1smcUMTTcyoIjycexOxd6DFsKsg21qVBzEmr3G7fUKIRy2/psii+CIUt7FA==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/follow-redirects": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/foreground-child": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", + "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + } + }, + "node_modules/from2/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/from2/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/from2/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "dev": true + }, + "node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/fs-minipass/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "node_modules/gauge": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", + "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", + "dependencies": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.2", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.1", + "object-assign": "^4.1.1", + "signal-exit": "^3.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-func-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", + "integrity": "sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/github-from-package": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", + "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==", + "dev": true + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globrex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz", + "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==", + "dev": true + }, + "node_modules/google-protobuf": { + "version": "3.21.2", + "resolved": "https://registry.npmjs.org/google-protobuf/-/google-protobuf-3.21.2.tgz", + "integrity": "sha512-3MSOYFO5U9mPGikIYCzK0SaThypfGgS6bHqrUGXG3DPHCrb+txNqeEcns1W0lkGfk0rCyNXm7xB9rMxnCiZOoA==" + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true + }, + "node_modules/grpc": { + "version": "1.24.11", + "resolved": "https://registry.npmjs.org/grpc/-/grpc-1.24.11.tgz", + "integrity": "sha512-8/AQdFCzCeCDWW3SoaMNp6ccbRvTQEH1O1u1uFtt29eWsg5gSZCJ3m6fbkduEIh3smY7WAPP+LgVJ5n3nZRxcA==", + "deprecated": "This library will not receive further updates other than security fixes. We recommend using @grpc/grpc-js instead.", + "hasInstallScript": true, + "dependencies": { + "@mapbox/node-pre-gyp": "^1.0.4", + "@types/bytebuffer": "^5.0.40", + "lodash.camelcase": "^4.3.0", + "lodash.clone": "^4.5.0", + "nan": "^2.13.2", + "protobufjs": "^5.0.3" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/grpc-tools": { + "version": "1.12.4", + "resolved": "https://registry.npmjs.org/grpc-tools/-/grpc-tools-1.12.4.tgz", + "integrity": "sha512-5+mLAJJma3BjnW/KQp6JBjUMgvu7Mu3dBvBPd1dcbNIb+qiR0817zDpgPjS7gRb+l/8EVNIa3cB02xI9JLToKg==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "@mapbox/node-pre-gyp": "^1.0.5" + }, + "bin": { + "grpc_tools_node_protoc": "bin/protoc.js", + "grpc_tools_node_protoc_plugin": "bin/protoc_plugin.js" + } + }, + "node_modules/grpc/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/grpc/node_modules/cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha512-0yayqDxWQbqk3ojkYqUKqaAQ6AfNKeKWRNA8kR0WXzAsdHpP4BIaOmMAG87JGuO6qcobyW4GjxHd9PmhEd+T9w==", + "dependencies": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" + } + }, + "node_modules/grpc/node_modules/is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==", + "dependencies": { + "number-is-nan": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/grpc/node_modules/protobufjs": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-5.0.3.tgz", + "integrity": "sha512-55Kcx1MhPZX0zTbVosMQEO5R6/rikNXd9b6RQK4KSPcrSIIwoXTtebIczUrXlwaSrbz4x8XUVThGPob1n8I4QA==", + "dependencies": { + "ascli": "~1", + "bytebuffer": "~5", + "glob": "^7.0.5", + "yargs": "^3.10.0" + }, + "bin": { + "pbjs": "bin/pbjs" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/grpc/node_modules/string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==", + "dependencies": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/grpc/node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/grpc/node_modules/wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha512-vAaEaDM946gbNpH5pLVNR+vX2ht6n0Bt3GXwVB1AuAqZosOvHNF3P7wDnh8KLkSqgUh0uh77le7Owgoz+Z9XBw==", + "dependencies": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/grpc/node_modules/y18n": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.2.tgz", + "integrity": "sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==" + }, + "node_modules/grpc/node_modules/yargs": { + "version": "3.32.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.32.0.tgz", + "integrity": "sha512-ONJZiimStfZzhKamYvR/xvmgW3uEkAUFSP91y2caTEPhzF6uP2JfPiVZcq66b/YR0C3uitxSV7+T1x8p5bkmMg==", + "dependencies": { + "camelcase": "^2.0.1", + "cliui": "^3.0.3", + "decamelize": "^1.1.1", + "os-locale": "^1.4.0", + "string-width": "^1.0.1", + "window-size": "^0.1.4", + "y18n": "^3.2.0" + } + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==" + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/ignore": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/ignore-by-default": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", + "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==", + "dev": true + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true + }, + "node_modules/into-stream": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/into-stream/-/into-stream-6.0.0.tgz", + "integrity": "sha512-XHbaOAvP+uFKUFsOgoNPRjLkwB+I22JFPFe5OjTkQ0nwgj6+pSjb4NmB6VMxaPshLiOf+zcpOCBQuLwC1KHhZA==", + "dev": true, + "dependencies": { + "from2": "^2.3.0", + "p-is-promise": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/invert-kv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha512-xgs2NH9AE66ucSq4cNG1nhSFghr5l6tdL15Pk+jl46bmmBapgoaY/AacXyaDznAqmGL99TiLSQgO/XazFSKYeQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz", + "integrity": "sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", + "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "dev": true, + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-reports": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", + "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", + "dev": true, + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonc-parser": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", + "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", + "dev": true + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/lcid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha512-YiGkH6EnGrDGqLMITnGjXtGmNtjoXw9SVUzcaos8RBi7Ps0VBylkq+vOcY9QE5poLasPCR849ucFUkl0UzUyOw==", + "dependencies": { + "invert-kv": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/local-pkg": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.4.3.tgz", + "integrity": "sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==" + }, + "node_modules/lodash.clone": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clone/-/lodash.clone-4.5.0.tgz", + "integrity": "sha512-GhrVeweiTD6uTmmn5hV/lzgCQhccwReIVRLHp7LT4SopOjqEZ5BbX8b5WWEtAKasjmy8hR7ZPwsYlxRCku5odg==" + }, + "node_modules/loupe": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.6.tgz", + "integrity": "sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==", + "dev": true, + "dependencies": { + "get-func-name": "^2.0.0" + } + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/magic-string": { + "version": "0.30.1", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.1.tgz", + "integrity": "sha512-mbVKXPmS0z0G4XqFDCTllmDQ6coZzn94aMlb0o/A4HEHJCKcanlDZwYJgwnkmgD3jyWhUgj9VsPrfd972yPffA==", + "dev": true, + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.15" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minizlib/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mkdirp-classic": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", + "dev": true + }, + "node_modules/mlly": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.4.0.tgz", + "integrity": "sha512-ua8PAThnTwpprIaU47EPeZ/bPUVp2QYBbWMphUQpVdBI3Lgqzm5KZQ45Agm3YJedHXaIHl6pBGabaLSUPPSptg==", + "dev": true, + "dependencies": { + "acorn": "^8.9.0", + "pathe": "^1.1.1", + "pkg-types": "^1.0.3", + "ufo": "^1.1.2" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/multistream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/multistream/-/multistream-4.1.0.tgz", + "integrity": "sha512-J1XDiAmmNpRCBfIWJv+n0ymC4ABcf/Pl+5YvC5B/D2f/2+8PtHvCNxMPKiQcZyi922Hq69J2YOpb1pTywfifyw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "once": "^1.4.0", + "readable-stream": "^3.6.0" + } + }, + "node_modules/nan": { + "version": "2.17.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.17.0.tgz", + "integrity": "sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ==" + }, + "node_modules/nanoid": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", + "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/napi-build-utils": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", + "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==", + "dev": true + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/node-abi": { + "version": "3.45.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.45.0.tgz", + "integrity": "sha512-iwXuFrMAcFVi/ZoZiqq8BzAdsLw9kxDfTC0HMyjXfSL/6CSDAGD5UmR7azrAgWV1zKYq7dUUMj4owusBWKLsiQ==", + "dev": true, + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/node-fetch": { + "version": "2.6.12", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.12.tgz", + "integrity": "sha512-C/fGU2E8ToujUivIO0H+tpQ6HWo4eEmchoPIoXtxCrVghxdKq+QOHqEZW7tuP3KlV3bC8FRMO5nMCC7Zm1VP6g==", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/nodemon": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.0.1.tgz", + "integrity": "sha512-g9AZ7HmkhQkqXkRc20w+ZfQ73cHLbE8hnPbtaFbFtCumZsjyMhKk9LajQ07U5Ux28lvFjZ5X7HvWR1xzU8jHVw==", + "dev": true, + "dependencies": { + "chokidar": "^3.5.2", + "debug": "^3.2.7", + "ignore-by-default": "^1.0.1", + "minimatch": "^3.1.2", + "pstree.remy": "^1.1.8", + "semver": "^7.5.3", + "simple-update-notifier": "^2.0.0", + "supports-color": "^5.5.0", + "touch": "^3.1.0", + "undefsafe": "^2.0.5" + }, + "bin": { + "nodemon": "bin/nodemon.js" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/nodemon" + } + }, + "node_modules/nodemon/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/nodemon/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/nodemon/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npmlog": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", + "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", + "dependencies": { + "are-we-there-yet": "^2.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^3.0.0", + "set-blocking": "^2.0.0" + } + }, + "node_modules/number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/optjs": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/optjs/-/optjs-3.2.2.tgz", + "integrity": "sha512-f8lTJm4LKirX+45xsFhuRNjA4f46QVLQKfGoNH7e2AEWS+24eM4XNH4pQ8Tw2LISCIvbST/wNcLdtgvgcqVaxA==" + }, + "node_modules/os-locale": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "integrity": "sha512-PRT7ZORmwu2MEFt4/fv3Q+mEfN4zetKxufQrkShY2oGvUms9r8otu5HfdyIFHkYXjO7laNsoVGmM2MANfuTA8g==", + "dependencies": { + "lcid": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/p-is-promise": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-3.0.0.tgz", + "integrity": "sha512-Wo8VsW4IRQSKVXsJCn7TomUaVtyfjVDn3nUP7kE967BQk0CwFpdbZs0X0uk5sW9mkBa9eNM7hCMaG93WUAwxYQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/pathe": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.1.tgz", + "integrity": "sha512-d+RQGp0MAYTIaDBIMmOfMwz3E+LOZnxx1HZd5R18mmCZY0QBlK0LDZfPc8FW8Ed2DlvsuE6PRjroDY+wg4+j/Q==", + "dev": true + }, + "node_modules/pathval": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", + "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pkg": { + "version": "5.8.1", + "resolved": "https://registry.npmjs.org/pkg/-/pkg-5.8.1.tgz", + "integrity": "sha512-CjBWtFStCfIiT4Bde9QpJy0KeH19jCfwZRJqHFDFXfhUklCx8JoFmMj3wgnEYIwGmZVNkhsStPHEOnrtrQhEXA==", + "dev": true, + "dependencies": { + "@babel/generator": "7.18.2", + "@babel/parser": "7.18.4", + "@babel/types": "7.19.0", + "chalk": "^4.1.2", + "fs-extra": "^9.1.0", + "globby": "^11.1.0", + "into-stream": "^6.0.0", + "is-core-module": "2.9.0", + "minimist": "^1.2.6", + "multistream": "^4.1.0", + "pkg-fetch": "3.4.2", + "prebuild-install": "7.1.1", + "resolve": "^1.22.0", + "stream-meter": "^1.0.4" + }, + "bin": { + "pkg": "lib-es5/bin.js" + }, + "peerDependencies": { + "node-notifier": ">=9.0.1" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/pkg-fetch": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/pkg-fetch/-/pkg-fetch-3.4.2.tgz", + "integrity": "sha512-0+uijmzYcnhC0hStDjm/cl2VYdrmVVBpe7Q8k9YBojxmR5tG8mvR9/nooQq3QSXiQqORDVOTY3XqMEqJVIzkHA==", + "dev": true, + "dependencies": { + "chalk": "^4.1.2", + "fs-extra": "^9.1.0", + "https-proxy-agent": "^5.0.0", + "node-fetch": "^2.6.6", + "progress": "^2.0.3", + "semver": "^7.3.5", + "tar-fs": "^2.1.1", + "yargs": "^16.2.0" + }, + "bin": { + "pkg-fetch": "lib-es5/bin.js" + } + }, + "node_modules/pkg-types": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.0.3.tgz", + "integrity": "sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==", + "dev": true, + "dependencies": { + "jsonc-parser": "^3.2.0", + "mlly": "^1.2.0", + "pathe": "^1.1.0" + } + }, + "node_modules/postcss": { + "version": "8.4.26", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.26.tgz", + "integrity": "sha512-jrXHFF8iTloAenySjM/ob3gSj7pCu0Ji49hnjqzsgSRa50hkWCKD0HQ+gMNJkW38jBI68MpAAg7ZWwHwX8NMMw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/prebuild-install": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.1.tgz", + "integrity": "sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==", + "dev": true, + "dependencies": { + "detect-libc": "^2.0.0", + "expand-template": "^2.0.3", + "github-from-package": "0.0.0", + "minimist": "^1.2.3", + "mkdirp-classic": "^0.5.3", + "napi-build-utils": "^1.0.1", + "node-abi": "^3.3.0", + "pump": "^3.0.0", + "rc": "^1.2.7", + "simple-get": "^4.0.0", + "tar-fs": "^2.0.0", + "tunnel-agent": "^0.6.0" + }, + "bin": { + "prebuild-install": "bin.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/pretty-format": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.1.tgz", + "integrity": "sha512-7jRj+yXO0W7e4/tSJKoR7HRIHLPPjtNaUGG2xxKQnGvPNRkgWcQ0AZX6P4KBRJN4FcTBWb3sa7DVUJmocYuoog==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.6.0", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, + "node_modules/pstree.remy": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", + "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", + "dev": true + }, + "node_modules/pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dev": true, + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, + "node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", + "dev": true + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.2", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", + "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", + "dev": true, + "dependencies": { + "is-core-module": "^2.11.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve/node_modules/is-core-module": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz", + "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rollup": { + "version": "3.26.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.26.2.tgz", + "integrity": "sha512-6umBIGVz93er97pMgQO08LuH3m6PUb3jlDUUGFsNJB6VgTCUaDFpupf5JfU30529m/UKOgmiX+uY6Sx8cOYpLA==", + "dev": true, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=14.18.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/siginfo": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", + "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", + "dev": true + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + }, + "node_modules/simple-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/simple-get": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", + "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "decompress-response": "^6.0.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } + }, + "node_modules/simple-update-notifier": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", + "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==", + "dev": true, + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stackback": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", + "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", + "dev": true + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/std-env": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.3.3.tgz", + "integrity": "sha512-Rz6yejtVyWnVjC1RFvNmYL10kgjC49EOghxWn0RFqlCHGFpQx+Xe7yW3I4ceK1SGrWIGMjD5Kbue8W/udkbMJg==", + "dev": true + }, + "node_modules/stream-meter": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/stream-meter/-/stream-meter-1.0.4.tgz", + "integrity": "sha512-4sOEtrbgFotXwnEuzzsQBYEV1elAeFSO8rSGeTwabuX1RRn/kEq9JVH7I0MRBhKVRR0sJkr0M0QCH7yOLf9fhQ==", + "dev": true, + "dependencies": { + "readable-stream": "^2.1.4" + } + }, + "node_modules/stream-meter/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/stream-meter/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/stream-meter/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-literal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-1.0.1.tgz", + "integrity": "sha512-QZTsipNpa2Ppr6v1AmJHESqJ3Uz247MUS0OjrnnZjFAvEoWqxuyFuXn2xLgMtRnijJShAa1HL0gtJyUs7u7n3Q==", + "dev": true, + "dependencies": { + "acorn": "^8.8.2" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/swagger-autogen": { + "version": "2.23.5", + "resolved": "https://registry.npmjs.org/swagger-autogen/-/swagger-autogen-2.23.5.tgz", + "integrity": "sha512-4Tl2+XhZMyHoBYkABnScHtQE0lKPKUD3NBt09mClrI6UKOUYljKlYw1xiFVwsHCTGR2hAXmhT4PpgjruCtt1ZA==", + "dependencies": { + "acorn": "^7.4.1", + "deepmerge": "^4.2.2", + "glob": "^7.1.7", + "json5": "^2.2.3" + } + }, + "node_modules/swagger-autogen/node_modules/acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/tar": { + "version": "6.1.15", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.15.tgz", + "integrity": "sha512-/zKt9UyngnxIT/EAGYuxaMYgOIJiP81ab9ZfkILq4oNLPFX50qyYmu7jRj9qeXoxmJHjGlbH0+cm2uy1WCs10A==", + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/tar-fs": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", + "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", + "dev": true, + "dependencies": { + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.1.4" + } + }, + "node_modules/tar-fs/node_modules/chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "dev": true + }, + "node_modules/tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "dev": true, + "dependencies": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tinybench": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.5.0.tgz", + "integrity": "sha512-kRwSG8Zx4tjF9ZiyH4bhaebu+EDz1BOx9hOigYHlUW4xxI/wKIUQUqo018UlU4ar6ATPBsaMrdbKZ+tmPdohFA==", + "dev": true + }, + "node_modules/tinypool": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-0.6.0.tgz", + "integrity": "sha512-FdswUUo5SxRizcBc6b1GSuLpLjisa8N8qMyYoP3rl+bym+QauhtJP5bvZY1ytt8krKGmMLYIRl36HBZfeAoqhQ==", + "dev": true, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tinyspy": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-2.1.1.tgz", + "integrity": "sha512-XPJL2uSzcOyBMky6OFrusqWlzfFrXtE0hPuMgW8A2HmaqrPo4ZQHRN/V0QXN3FSjKxpsbRrFc5LI7KOwBsT1/w==", + "dev": true, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/touch": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", + "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", + "dev": true, + "dependencies": { + "nopt": "~1.0.10" + }, + "bin": { + "nodetouch": "bin/nodetouch.js" + } + }, + "node_modules/touch/node_modules/nopt": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", + "integrity": "sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==", + "dev": true, + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "*" + } + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, + "node_modules/ts-essentials": { + "version": "9.3.2", + "resolved": "https://registry.npmjs.org/ts-essentials/-/ts-essentials-9.3.2.tgz", + "integrity": "sha512-JxKJzuWqH1MmH4ZFHtJzGEhkfN3QvVR3C3w+4BIoWeoY68UVVoA2Np/Bca9z0IPSErVCWhv439aT0We4Dks8kQ==", + "dev": true, + "peerDependencies": { + "typescript": ">=4.1.0" + } + }, + "node_modules/ts-node": { + "version": "10.9.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", + "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", + "dev": true, + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "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 + } + } + }, + "node_modules/tsconfck": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/tsconfck/-/tsconfck-2.1.1.tgz", + "integrity": "sha512-ZPCkJBKASZBmBUNqGHmRhdhM8pJYDdOXp4nRgj/O0JwUwsMq50lCDRQP/M5GBNAA0elPrq4gAeu4dkaVCuKWww==", + "dev": true, + "bin": { + "tsconfck": "bin/tsconfck.js" + }, + "engines": { + "node": "^14.13.1 || ^16 || >=18" + }, + "peerDependencies": { + "typescript": "^4.3.5 || ^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/tsconfig-paths": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", + "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==", + "dev": true, + "dependencies": { + "json5": "^2.2.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "dev": true, + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typescript": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.2.tgz", + "integrity": "sha512-wVORMBGO/FAs/++blGNeAVdbNKtIh1rbBL2EyQ1+J9lClJ93KiiKe8PmFIVdXhHcyv44SL9oglmfeSsndo0jRw==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=12.20" + } + }, + "node_modules/ufo": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.1.2.tgz", + "integrity": "sha512-TrY6DsjTQQgyS3E3dBaOXf0TpPD8u9FVrVYmKVegJuFw51n/YB9XPt+U6ydzFG5ZIN7+DIjPbNmXoBj9esYhgQ==", + "dev": true + }, + "node_modules/undefsafe": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", + "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", + "dev": true + }, + "node_modules/universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true + }, + "node_modules/v8-to-istanbul": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.1.0.tgz", + "integrity": "sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.12", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^1.6.0" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/vite": { + "version": "4.4.4", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.4.4.tgz", + "integrity": "sha512-4mvsTxjkveWrKDJI70QmelfVqTm+ihFAb6+xf4sjEU2TmUCTlVX87tmg/QooPEMQb/lM9qGHT99ebqPziEd3wg==", + "dev": true, + "dependencies": { + "esbuild": "^0.18.10", + "postcss": "^8.4.25", + "rollup": "^3.25.2" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + }, + "peerDependencies": { + "@types/node": ">= 14", + "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 + } + } + }, + "node_modules/vite-node": { + "version": "0.33.0", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-0.33.0.tgz", + "integrity": "sha512-19FpHYbwWWxDr73ruNahC+vtEdza52kA90Qb3La98yZ0xULqV8A5JLNPUff0f5zID4984tW7l3DH2przTJUZSw==", + "dev": true, + "dependencies": { + "cac": "^6.7.14", + "debug": "^4.3.4", + "mlly": "^1.4.0", + "pathe": "^1.1.1", + "picocolors": "^1.0.0", + "vite": "^3.0.0 || ^4.0.0" + }, + "bin": { + "vite-node": "vite-node.mjs" + }, + "engines": { + "node": ">=v14.18.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/vite-tsconfig-paths": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/vite-tsconfig-paths/-/vite-tsconfig-paths-4.2.0.tgz", + "integrity": "sha512-jGpus0eUy5qbbMVGiTxCL1iB9ZGN6Bd37VGLJU39kTDD6ZfULTTb1bcc5IeTWqWJKiWV5YihCaibeASPiGi8kw==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "globrex": "^0.1.2", + "tsconfck": "^2.1.0" + }, + "peerDependencies": { + "vite": "*" + }, + "peerDependenciesMeta": { + "vite": { + "optional": true + } + } + }, + "node_modules/vite/node_modules/@esbuild/linux-x64": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.12.tgz", + "integrity": "sha512-OrNJMGQbPaVyHHcDF8ybNSwu7TDOfX8NGpXCbetwOSP6txOJiWlgQnRymfC9ocR1S0Y5PW0Wb1mV6pUddqmvmQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/esbuild": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.12.tgz", + "integrity": "sha512-XuOVLDdtsDslXStStduT41op21Ytmf4/BDS46aa3xPJ7X5h2eMWBF1oAe3QjUH3bDksocNXgzGUZ7XHIBya6Tg==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.18.12", + "@esbuild/android-arm64": "0.18.12", + "@esbuild/android-x64": "0.18.12", + "@esbuild/darwin-arm64": "0.18.12", + "@esbuild/darwin-x64": "0.18.12", + "@esbuild/freebsd-arm64": "0.18.12", + "@esbuild/freebsd-x64": "0.18.12", + "@esbuild/linux-arm": "0.18.12", + "@esbuild/linux-arm64": "0.18.12", + "@esbuild/linux-ia32": "0.18.12", + "@esbuild/linux-loong64": "0.18.12", + "@esbuild/linux-mips64el": "0.18.12", + "@esbuild/linux-ppc64": "0.18.12", + "@esbuild/linux-riscv64": "0.18.12", + "@esbuild/linux-s390x": "0.18.12", + "@esbuild/linux-x64": "0.18.12", + "@esbuild/netbsd-x64": "0.18.12", + "@esbuild/openbsd-x64": "0.18.12", + "@esbuild/sunos-x64": "0.18.12", + "@esbuild/win32-arm64": "0.18.12", + "@esbuild/win32-ia32": "0.18.12", + "@esbuild/win32-x64": "0.18.12" + } + }, + "node_modules/vitest": { + "version": "0.33.0", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-0.33.0.tgz", + "integrity": "sha512-1CxaugJ50xskkQ0e969R/hW47za4YXDUfWJDxip1hwbnhUjYolpfUn2AMOulqG/Dtd9WYAtkHmM/m3yKVrEejQ==", + "dev": true, + "dependencies": { + "@types/chai": "^4.3.5", + "@types/chai-subset": "^1.3.3", + "@types/node": "*", + "@vitest/expect": "0.33.0", + "@vitest/runner": "0.33.0", + "@vitest/snapshot": "0.33.0", + "@vitest/spy": "0.33.0", + "@vitest/utils": "0.33.0", + "acorn": "^8.9.0", + "acorn-walk": "^8.2.0", + "cac": "^6.7.14", + "chai": "^4.3.7", + "debug": "^4.3.4", + "local-pkg": "^0.4.3", + "magic-string": "^0.30.1", + "pathe": "^1.1.1", + "picocolors": "^1.0.0", + "std-env": "^3.3.3", + "strip-literal": "^1.0.1", + "tinybench": "^2.5.0", + "tinypool": "^0.6.0", + "vite": "^3.0.0 || ^4.0.0", + "vite-node": "0.33.0", + "why-is-node-running": "^2.2.2" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": ">=v14.18.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@vitest/browser": "*", + "@vitest/ui": "*", + "happy-dom": "*", + "jsdom": "*", + "playwright": "*", + "safaridriver": "*", + "webdriverio": "*" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@vitest/browser": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + }, + "playwright": { + "optional": true + }, + "safaridriver": { + "optional": true + }, + "webdriverio": { + "optional": true + } + } + }, + "node_modules/vitest-mock-extended": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/vitest-mock-extended/-/vitest-mock-extended-1.1.4.tgz", + "integrity": "sha512-MKPdepFjk0CE7Ocb5txntHK/sloHO9s0Kk9dr630uL03shRSHMkZtSs5CBPsbJ8K/CvYLv0GHUmMt2zWks2eXg==", + "dev": true, + "dependencies": { + "ts-essentials": "^9.3.2" + }, + "peerDependencies": { + "typescript": "3.x || 4.x || 5.x", + "vitest": ">=0.31.1" + } + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/why-is-node-running": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.2.2.tgz", + "integrity": "sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==", + "dev": true, + "dependencies": { + "siginfo": "^2.0.0", + "stackback": "0.0.2" + }, + "bin": { + "why-is-node-running": "cli.js" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wide-align": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", + "dependencies": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, + "node_modules/window-size": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.4.tgz", + "integrity": "sha512-2thx4pB0cV3h+Bw7QmMXcEbdmOzv9t0HFplJH/Lz6yu60hXYy5RT8rUu+wlIreVxWsGN20mo+MHeCSfUpQBwPw==", + "bin": { + "window-size": "cli.js" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + }, + "dependencies": { + "@ampproject/remapping": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", + "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", + "dev": true, + "requires": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "@babel/generator": { + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.2.tgz", + "integrity": "sha512-W1lG5vUwFvfMd8HVXqdfbuG7RuaSrTCCD8cl8fP8wOivdbtbIg2Db3IWUcgvfxKbbn6ZBGYRW/Zk1MIwK49mgw==", + "dev": true, + "requires": { + "@babel/types": "^7.18.2", + "@jridgewell/gen-mapping": "^0.3.0", + "jsesc": "^2.5.1" + } + }, + "@babel/helper-string-parser": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", + "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", + "dev": true + }, + "@babel/helper-validator-identifier": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz", + "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==", + "dev": true + }, + "@babel/parser": { + "version": "7.18.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.4.tgz", + "integrity": "sha512-FDge0dFazETFcxGw/EXzOkN8uJp0PC7Qbm+Pe9T+av2zlBpOgunFHkQPPn+eRuClU73JF+98D531UgayY89tow==", + "dev": true + }, + "@babel/types": { + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.19.0.tgz", + "integrity": "sha512-YuGopBq3ke25BVSiS6fgF49Ul9gH1x70Bcr6bqRLjWCkcX8Hre1/5+z+IiWOIerRMSSEfGZVB9z9kyq7wVs9YA==", + "dev": true, + "requires": { + "@babel/helper-string-parser": "^7.18.10", + "@babel/helper-validator-identifier": "^7.18.6", + "to-fast-properties": "^2.0.0" + } + }, + "@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true + }, + "@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "requires": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "dependencies": { + "@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "requires": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + } + } + }, + "@esbuild/linux-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.19.tgz", + "integrity": "sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==", + "dev": true, + "optional": true + }, + "@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true + }, + "@jest/schemas": { + "version": "29.6.0", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.0.tgz", + "integrity": "sha512-rxLjXyJBTL4LQeJW3aKo0M/+GkCOXsO+8i9Iu7eDb6KwtP65ayoDsitrdPBtujxQ88k4wI2FNYfa6TOGwSn6cQ==", + "dev": true, + "requires": { + "@sinclair/typebox": "^0.27.8" + } + }, + "@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dev": true, + "requires": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "dev": true + }, + "@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true + }, + "@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true + }, + "@jridgewell/trace-mapping": { + "version": "0.3.18", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", + "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", + "dev": true, + "requires": { + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" + }, + "dependencies": { + "@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "dev": true + } + } + }, + "@mapbox/node-pre-gyp": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.11.tgz", + "integrity": "sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==", + "requires": { + "detect-libc": "^2.0.0", + "https-proxy-agent": "^5.0.0", + "make-dir": "^3.1.0", + "node-fetch": "^2.6.7", + "nopt": "^5.0.0", + "npmlog": "^5.0.1", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.11" + } + }, + "@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + } + }, + "@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true + }, + "@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "requires": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + } + }, + "@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "dev": true + }, + "@tsconfig/node10": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", + "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", + "dev": true + }, + "@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true + }, + "@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true + }, + "@tsconfig/node16": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", + "dev": true + }, + "@types/amqplib": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/@types/amqplib/-/amqplib-0.10.1.tgz", + "integrity": "sha512-j6ANKT79ncUDnAs/+9r9eDujxbeJoTjoVu33gHHcaPfmLQaMhvfbH2GqSe8KUM444epAp1Vl3peVOQfZk3UIqA==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/body-parser": { + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", + "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", + "requires": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "@types/bytebuffer": { + "version": "5.0.44", + "resolved": "https://registry.npmjs.org/@types/bytebuffer/-/bytebuffer-5.0.44.tgz", + "integrity": "sha512-k1qonHga/SfQT02NF633i+7tIfKd+cfC/8pjnedcfuXJNMWooss/FkCgRMSnLf2WorLjbuH4bfgAZEbtyHBDoQ==", + "requires": { + "@types/long": "^3.0.0", + "@types/node": "*" + }, + "dependencies": { + "@types/long": { + "version": "3.0.32", + "resolved": "https://registry.npmjs.org/@types/long/-/long-3.0.32.tgz", + "integrity": "sha512-ZXyOOm83p7X8p3s0IYM3VeueNmHpkk/yMlP8CLeOnEcu6hIwPH7YjZBvhQkR0ZFS2DqZAxKtJ/M5fcuv3OU5BA==" + } + } + }, + "@types/chai": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.5.tgz", + "integrity": "sha512-mEo1sAde+UCE6b2hxn332f1g1E8WfYRu6p5SvTKr2ZKC1f7gFJXk4h5PyGP9Dt6gCaG8y8XhwnXWC6Iy2cmBng==", + "dev": true + }, + "@types/chai-subset": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@types/chai-subset/-/chai-subset-1.3.3.tgz", + "integrity": "sha512-frBecisrNGz+F4T6bcc+NLeolfiojh5FxW2klu669+8BARtyQv2C/GkNW6FUodVe4BroGMP/wER/YDGc7rEllw==", + "dev": true, + "requires": { + "@types/chai": "*" + } + }, + "@types/connect": { + "version": "3.4.35", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", + "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", + "requires": { + "@types/node": "*" + } + }, + "@types/express": { + "version": "4.17.17", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.17.tgz", + "integrity": "sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==", + "requires": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "@types/express-serve-static-core": { + "version": "4.17.35", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.35.tgz", + "integrity": "sha512-wALWQwrgiB2AWTT91CB62b6Yt0sNHpznUXeZEcnPU3DRdlDIz74x8Qg1UUYKSVFi+va5vKOLYRBI1bRKiLLKIg==", + "requires": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "@types/google-protobuf": { + "version": "3.15.6", + "resolved": "https://registry.npmjs.org/@types/google-protobuf/-/google-protobuf-3.15.6.tgz", + "integrity": "sha512-pYVNNJ+winC4aek+lZp93sIKxnXt5qMkuKmaqS3WGuTq0Bw1ZDYNBgzG5kkdtwcv+GmYJGo3yEg6z2cKKAiEdw==", + "dev": true + }, + "@types/http-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-/K3ds8TRAfBvi5vfjuz8y6+GiAYBZ0x4tXv1Av6CWBWn0IlADc+ZX9pMq7oU0fNQPnBwIZl3rmeLp6SBApbxSQ==" + }, + "@types/istanbul-lib-coverage": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", + "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", + "dev": true + }, + "@types/mime": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", + "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==" + }, + "@types/node": { + "version": "18.15.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.9.tgz", + "integrity": "sha512-dUxhiNzBLr6IqlZXz6e/rN2YQXlFgOei/Dxy+e3cyXTJ4txSUbGT2/fmnD6zd/75jDMeW5bDee+YXxlFKHoV0A==" + }, + "@types/qs": { + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==" + }, + "@types/range-parser": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", + "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==" + }, + "@types/send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.1.tgz", + "integrity": "sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q==", + "requires": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "@types/serve-static": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.2.tgz", + "integrity": "sha512-J2LqtvFYCzaj8pVYKw8klQXrLLk7TBZmQ4ShlcdkELFKGwGMfevMLneMMRkMgZxotOD9wg497LpC7O8PcvAmfw==", + "requires": { + "@types/http-errors": "*", + "@types/mime": "*", + "@types/node": "*" + } + }, + "@vitest/coverage-c8": { + "version": "0.33.0", + "resolved": "https://registry.npmjs.org/@vitest/coverage-c8/-/coverage-c8-0.33.0.tgz", + "integrity": "sha512-DaF1zJz4dcOZS4k/neiQJokmOWqsGXwhthfmUdPGorXIQHjdPvV6JQSYhQDI41MyI8c+IieQUdIDs5XAMHtDDw==", + "dev": true, + "requires": { + "@ampproject/remapping": "^2.2.1", + "c8": "^7.14.0", + "magic-string": "^0.30.1", + "picocolors": "^1.0.0", + "std-env": "^3.3.3" + } + }, + "@vitest/expect": { + "version": "0.33.0", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-0.33.0.tgz", + "integrity": "sha512-sVNf+Gla3mhTCxNJx+wJLDPp/WcstOe0Ksqz4Vec51MmgMth/ia0MGFEkIZmVGeTL5HtjYR4Wl/ZxBxBXZJTzQ==", + "dev": true, + "requires": { + "@vitest/spy": "0.33.0", + "@vitest/utils": "0.33.0", + "chai": "^4.3.7" + } + }, + "@vitest/runner": { + "version": "0.33.0", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-0.33.0.tgz", + "integrity": "sha512-UPfACnmCB6HKRHTlcgCoBh6ppl6fDn+J/xR8dTufWiKt/74Y9bHci5CKB8tESSV82zKYtkBJo9whU3mNvfaisg==", + "dev": true, + "requires": { + "@vitest/utils": "0.33.0", + "p-limit": "^4.0.0", + "pathe": "^1.1.1" + }, + "dependencies": { + "p-limit": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", + "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", + "dev": true, + "requires": { + "yocto-queue": "^1.0.0" + } + }, + "yocto-queue": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", + "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", + "dev": true + } + } + }, + "@vitest/snapshot": { + "version": "0.33.0", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-0.33.0.tgz", + "integrity": "sha512-tJjrl//qAHbyHajpFvr8Wsk8DIOODEebTu7pgBrP07iOepR5jYkLFiqLq2Ltxv+r0uptUb4izv1J8XBOwKkVYA==", + "dev": true, + "requires": { + "magic-string": "^0.30.1", + "pathe": "^1.1.1", + "pretty-format": "^29.5.0" + } + }, + "@vitest/spy": { + "version": "0.33.0", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-0.33.0.tgz", + "integrity": "sha512-Kv+yZ4hnH1WdiAkPUQTpRxW8kGtH8VRTnus7ZTGovFYM1ZezJpvGtb9nPIjPnptHbsyIAxYZsEpVPYgtpjGnrg==", + "dev": true, + "requires": { + "tinyspy": "^2.1.1" + } + }, + "@vitest/utils": { + "version": "0.33.0", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-0.33.0.tgz", + "integrity": "sha512-pF1w22ic965sv+EN6uoePkAOTkAPWM03Ri/jXNyMIKBb/XHLDPfhLvf/Fa9g0YECevAIz56oVYXhodLvLQ/awA==", + "dev": true, + "requires": { + "diff-sequences": "^29.4.3", + "loupe": "^2.3.6", + "pretty-format": "^29.5.0" + } + }, + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" + }, + "accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "requires": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + } + }, + "acorn": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", + "dev": true + }, + "acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "dev": true + }, + "agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "requires": { + "debug": "4" + } + }, + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "aproba": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==" + }, + "are-we-there-yet": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", + "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + } + }, + "arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true + }, + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" + }, + "array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true + }, + "ascli": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ascli/-/ascli-1.0.1.tgz", + "integrity": "sha512-JGQaNxpaCJz9Bd1JvVaFIHuWn9S+l3xhN17R0V/vmUDiGE0QngNMXhjlqpwqV+91plWz9Fg+Lt28Lj7p5vjs8A==", + "requires": { + "colour": "~0.7.1", + "optjs": "~3.2.2" + } + }, + "assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", + "dev": true + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "dev": true + }, + "axios": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.4.0.tgz", + "integrity": "sha512-S4XCWMEmzvo64T9GfvQDOXgYRDJ/wsSZc7Jvdgx5u1sd0JwsuPLqb3SYmusag+edF6ziyMensPVqLTSc1PiSEA==", + "requires": { + "follow-redirects": "^1.15.0", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true + }, + "binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true + }, + "bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dev": true, + "requires": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "body-parser": { + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", + "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", + "requires": { + "bytes": "3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + } + } + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "bytebuffer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/bytebuffer/-/bytebuffer-5.0.1.tgz", + "integrity": "sha512-IuzSdmADppkZ6DlpycMkm8l9zeEq16fWtLvunEwFiYciR/BHo4E8/xs5piFquG+Za8OWmMqHF8zuRviz2LHvRQ==", + "requires": { + "long": "~3" + }, + "dependencies": { + "long": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/long/-/long-3.2.0.tgz", + "integrity": "sha512-ZYvPPOMqUwPoDsbJaR10iQJYnMuZhRTvHYl62ErLIEX7RgFlziSBUUvrt3OVfc47QlHHpzPZYP17g3Fv7oeJkg==" + } + } + }, + "bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" + }, + "c8": { + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/c8/-/c8-7.14.0.tgz", + "integrity": "sha512-i04rtkkcNcCf7zsQcSv/T9EbUn4RXQ6mropeMcjFOsQXQ0iGLAr/xT6TImQg4+U9hmNpN9XdvPkjUL1IzbgxJw==", + "dev": true, + "requires": { + "@bcoe/v8-coverage": "^0.2.3", + "@istanbuljs/schema": "^0.1.3", + "find-up": "^5.0.0", + "foreground-child": "^2.0.0", + "istanbul-lib-coverage": "^3.2.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-reports": "^3.1.4", + "rimraf": "^3.0.2", + "test-exclude": "^6.0.0", + "v8-to-istanbul": "^9.0.0", + "yargs": "^16.2.0", + "yargs-parser": "^20.2.9" + } + }, + "cac": { + "version": "6.7.14", + "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", + "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", + "dev": true + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha512-DLIsRzJVBQu72meAKPkWQOLcujdXT32hwdfnkI1frSiSRMK1MofjKHf+MEx0SB6fjEFXL8fBDv1dKymBlOp4Qw==" + }, + "chai": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.7.tgz", + "integrity": "sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==", + "dev": true, + "requires": { + "assertion-error": "^1.1.0", + "check-error": "^1.0.2", + "deep-eql": "^4.1.2", + "get-func-name": "^2.0.0", + "loupe": "^2.3.1", + "pathval": "^1.1.1", + "type-detect": "^4.0.5" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "check-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", + "integrity": "sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==", + "dev": true + }, + "chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "requires": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "fsevents": "~2.3.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + } + }, + "chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==" + }, + "cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==" + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==" + }, + "colour": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/colour/-/colour-0.7.1.tgz", + "integrity": "sha512-Rel466v0EnmKPcsxHo91L4kgPs/6XF7Pu2LJNszq9lXYwi5CFWEeIiRaTX5ym7PPMdj4udDHkLSVC1//JVkZQg==" + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==" + }, + "content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "requires": { + "safe-buffer": "5.2.1" + } + }, + "content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==" + }, + "convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true + }, + "cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==" + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" + }, + "core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "dev": true + }, + "create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "requires": { + "ms": "2.1.2" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==" + }, + "decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "dev": true, + "requires": { + "mimic-response": "^3.1.0" + } + }, + "deep-eql": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz", + "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==", + "dev": true, + "requires": { + "type-detect": "^4.0.0" + } + }, + "deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "dev": true + }, + "deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==" + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" + }, + "delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==" + }, + "depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" + }, + "destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==" + }, + "detect-libc": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz", + "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==" + }, + "diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true + }, + "diff-sequences": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.4.3.tgz", + "integrity": "sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA==", + "dev": true + }, + "dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "requires": { + "path-type": "^4.0.0" + } + }, + "dotenv": { + "version": "16.3.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.3.1.tgz", + "integrity": "sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==" + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==" + }, + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "requires": { + "once": "^1.4.0" + } + }, + "esbuild": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.19.tgz", + "integrity": "sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==", + "dev": true, + "requires": { + "@esbuild/android-arm": "0.17.19", + "@esbuild/android-arm64": "0.17.19", + "@esbuild/android-x64": "0.17.19", + "@esbuild/darwin-arm64": "0.17.19", + "@esbuild/darwin-x64": "0.17.19", + "@esbuild/freebsd-arm64": "0.17.19", + "@esbuild/freebsd-x64": "0.17.19", + "@esbuild/linux-arm": "0.17.19", + "@esbuild/linux-arm64": "0.17.19", + "@esbuild/linux-ia32": "0.17.19", + "@esbuild/linux-loong64": "0.17.19", + "@esbuild/linux-mips64el": "0.17.19", + "@esbuild/linux-ppc64": "0.17.19", + "@esbuild/linux-riscv64": "0.17.19", + "@esbuild/linux-s390x": "0.17.19", + "@esbuild/linux-x64": "0.17.19", + "@esbuild/netbsd-x64": "0.17.19", + "@esbuild/openbsd-x64": "0.17.19", + "@esbuild/sunos-x64": "0.17.19", + "@esbuild/win32-arm64": "0.17.19", + "@esbuild/win32-ia32": "0.17.19", + "@esbuild/win32-x64": "0.17.19" + } + }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==" + }, + "expand-template": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", + "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", + "dev": true + }, + "express": { + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "requires": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.1", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.5.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "dependencies": { + "body-parser": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "requires": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + } + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "raw-body": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "requires": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + } + } + } + }, + "fast-glob": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.0.tgz", + "integrity": "sha512-ChDuvbOypPuNjO8yIDf36x7BlZX1smcUMTTcyoIjycexOxd6DFsKsg21qVBzEmr3G7fUKIRy2/psii+CIUt7FA==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + } + }, + "fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "dev": true, + "requires": { + "reusify": "^1.0.4" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + } + } + }, + "find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "requires": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + } + }, + "follow-redirects": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==" + }, + "foreground-child": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", + "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.0", + "signal-exit": "^3.0.2" + } + }, + "form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + }, + "forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==" + }, + "from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "dev": true + }, + "fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "requires": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "requires": { + "minipass": "^3.0.0" + }, + "dependencies": { + "minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "requires": { + "yallist": "^4.0.0" + } + } + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "gauge": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", + "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", + "requires": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.2", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.1", + "object-assign": "^4.1.1", + "signal-exit": "^3.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.2" + } + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true + }, + "get-func-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", + "integrity": "sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==", + "dev": true + }, + "get-intrinsic": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" + } + }, + "github-from-package": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", + "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==", + "dev": true + }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "requires": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + } + }, + "globrex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz", + "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==", + "dev": true + }, + "google-protobuf": { + "version": "3.21.2", + "resolved": "https://registry.npmjs.org/google-protobuf/-/google-protobuf-3.21.2.tgz", + "integrity": "sha512-3MSOYFO5U9mPGikIYCzK0SaThypfGgS6bHqrUGXG3DPHCrb+txNqeEcns1W0lkGfk0rCyNXm7xB9rMxnCiZOoA==" + }, + "graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true + }, + "grpc": { + "version": "1.24.11", + "resolved": "https://registry.npmjs.org/grpc/-/grpc-1.24.11.tgz", + "integrity": "sha512-8/AQdFCzCeCDWW3SoaMNp6ccbRvTQEH1O1u1uFtt29eWsg5gSZCJ3m6fbkduEIh3smY7WAPP+LgVJ5n3nZRxcA==", + "requires": { + "@mapbox/node-pre-gyp": "^1.0.4", + "@types/bytebuffer": "^5.0.40", + "lodash.camelcase": "^4.3.0", + "lodash.clone": "^4.5.0", + "nan": "^2.13.2", + "protobufjs": "^5.0.3" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==" + }, + "cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha512-0yayqDxWQbqk3ojkYqUKqaAQ6AfNKeKWRNA8kR0WXzAsdHpP4BIaOmMAG87JGuO6qcobyW4GjxHd9PmhEd+T9w==", + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" + } + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==", + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "protobufjs": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-5.0.3.tgz", + "integrity": "sha512-55Kcx1MhPZX0zTbVosMQEO5R6/rikNXd9b6RQK4KSPcrSIIwoXTtebIczUrXlwaSrbz4x8XUVThGPob1n8I4QA==", + "requires": { + "ascli": "~1", + "bytebuffer": "~5", + "glob": "^7.0.5", + "yargs": "^3.10.0" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==", + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha512-vAaEaDM946gbNpH5pLVNR+vX2ht6n0Bt3GXwVB1AuAqZosOvHNF3P7wDnh8KLkSqgUh0uh77le7Owgoz+Z9XBw==", + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + } + }, + "y18n": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.2.tgz", + "integrity": "sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==" + }, + "yargs": { + "version": "3.32.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.32.0.tgz", + "integrity": "sha512-ONJZiimStfZzhKamYvR/xvmgW3uEkAUFSP91y2caTEPhzF6uP2JfPiVZcq66b/YR0C3uitxSV7+T1x8p5bkmMg==", + "requires": { + "camelcase": "^2.0.1", + "cliui": "^3.0.3", + "decamelize": "^1.1.1", + "os-locale": "^1.4.0", + "string-width": "^1.0.1", + "window-size": "^0.1.4", + "y18n": "^3.2.0" + } + } + } + }, + "grpc-tools": { + "version": "1.12.4", + "resolved": "https://registry.npmjs.org/grpc-tools/-/grpc-tools-1.12.4.tgz", + "integrity": "sha512-5+mLAJJma3BjnW/KQp6JBjUMgvu7Mu3dBvBPd1dcbNIb+qiR0817zDpgPjS7gRb+l/8EVNIa3cB02xI9JLToKg==", + "dev": true, + "requires": { + "@mapbox/node-pre-gyp": "^1.0.5" + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==" + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" + }, + "has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==" + }, + "html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, + "http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "requires": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + } + }, + "https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "requires": { + "agent-base": "6", + "debug": "4" + } + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true + }, + "ignore": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "dev": true + }, + "ignore-by-default": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", + "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true + }, + "into-stream": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/into-stream/-/into-stream-6.0.0.tgz", + "integrity": "sha512-XHbaOAvP+uFKUFsOgoNPRjLkwB+I22JFPFe5OjTkQ0nwgj6+pSjb4NmB6VMxaPshLiOf+zcpOCBQuLwC1KHhZA==", + "dev": true, + "requires": { + "from2": "^2.3.0", + "p-is-promise": "^3.0.0" + } + }, + "invert-kv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha512-xgs2NH9AE66ucSq4cNG1nhSFghr5l6tdL15Pk+jl46bmmBapgoaY/AacXyaDznAqmGL99TiLSQgO/XazFSKYeQ==" + }, + "ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-core-module": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz", + "integrity": "sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" + }, + "is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "istanbul-lib-coverage": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", + "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", + "dev": true + }, + "istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "dev": true, + "requires": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" + } + }, + "istanbul-reports": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", + "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", + "dev": true, + "requires": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + } + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true + }, + "json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==" + }, + "jsonc-parser": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", + "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", + "dev": true + }, + "jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" + } + }, + "lcid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha512-YiGkH6EnGrDGqLMITnGjXtGmNtjoXw9SVUzcaos8RBi7Ps0VBylkq+vOcY9QE5poLasPCR849ucFUkl0UzUyOw==", + "requires": { + "invert-kv": "^1.0.0" + } + }, + "local-pkg": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.4.3.tgz", + "integrity": "sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==", + "dev": true + }, + "locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "requires": { + "p-locate": "^5.0.0" + } + }, + "lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==" + }, + "lodash.clone": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clone/-/lodash.clone-4.5.0.tgz", + "integrity": "sha512-GhrVeweiTD6uTmmn5hV/lzgCQhccwReIVRLHp7LT4SopOjqEZ5BbX8b5WWEtAKasjmy8hR7ZPwsYlxRCku5odg==" + }, + "loupe": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.6.tgz", + "integrity": "sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==", + "dev": true, + "requires": { + "get-func-name": "^2.0.0" + } + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "requires": { + "yallist": "^4.0.0" + } + }, + "magic-string": { + "version": "0.30.1", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.1.tgz", + "integrity": "sha512-mbVKXPmS0z0G4XqFDCTllmDQ6coZzn94aMlb0o/A4HEHJCKcanlDZwYJgwnkmgD3jyWhUgj9VsPrfd972yPffA==", + "dev": true, + "requires": { + "@jridgewell/sourcemap-codec": "^1.4.15" + } + }, + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "requires": { + "semver": "^6.0.0" + }, + "dependencies": { + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" + } + } + }, + "make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==" + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" + }, + "merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==" + }, + "micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "requires": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + } + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" + }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "requires": { + "mime-db": "1.52.0" + } + }, + "mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "dev": true + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true + }, + "minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==" + }, + "minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "requires": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "dependencies": { + "minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "requires": { + "yallist": "^4.0.0" + } + } + } + }, + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" + }, + "mkdirp-classic": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", + "dev": true + }, + "mlly": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.4.0.tgz", + "integrity": "sha512-ua8PAThnTwpprIaU47EPeZ/bPUVp2QYBbWMphUQpVdBI3Lgqzm5KZQ45Agm3YJedHXaIHl6pBGabaLSUPPSptg==", + "dev": true, + "requires": { + "acorn": "^8.9.0", + "pathe": "^1.1.1", + "pkg-types": "^1.0.3", + "ufo": "^1.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "multistream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/multistream/-/multistream-4.1.0.tgz", + "integrity": "sha512-J1XDiAmmNpRCBfIWJv+n0ymC4ABcf/Pl+5YvC5B/D2f/2+8PtHvCNxMPKiQcZyi922Hq69J2YOpb1pTywfifyw==", + "dev": true, + "requires": { + "once": "^1.4.0", + "readable-stream": "^3.6.0" + } + }, + "nan": { + "version": "2.17.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.17.0.tgz", + "integrity": "sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ==" + }, + "nanoid": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", + "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "dev": true + }, + "napi-build-utils": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", + "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==", + "dev": true + }, + "negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==" + }, + "node-abi": { + "version": "3.45.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.45.0.tgz", + "integrity": "sha512-iwXuFrMAcFVi/ZoZiqq8BzAdsLw9kxDfTC0HMyjXfSL/6CSDAGD5UmR7azrAgWV1zKYq7dUUMj4owusBWKLsiQ==", + "dev": true, + "requires": { + "semver": "^7.3.5" + } + }, + "node-fetch": { + "version": "2.6.12", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.12.tgz", + "integrity": "sha512-C/fGU2E8ToujUivIO0H+tpQ6HWo4eEmchoPIoXtxCrVghxdKq+QOHqEZW7tuP3KlV3bC8FRMO5nMCC7Zm1VP6g==", + "requires": { + "whatwg-url": "^5.0.0" + } + }, + "nodemon": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.0.1.tgz", + "integrity": "sha512-g9AZ7HmkhQkqXkRc20w+ZfQ73cHLbE8hnPbtaFbFtCumZsjyMhKk9LajQ07U5Ux28lvFjZ5X7HvWR1xzU8jHVw==", + "dev": true, + "requires": { + "chokidar": "^3.5.2", + "debug": "^3.2.7", + "ignore-by-default": "^1.0.1", + "minimatch": "^3.1.2", + "pstree.remy": "^1.1.8", + "semver": "^7.5.3", + "simple-update-notifier": "^2.0.0", + "supports-color": "^5.5.0", + "touch": "^3.1.0", + "undefsafe": "^2.0.5" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "requires": { + "abbrev": "1" + } + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, + "npmlog": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", + "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", + "requires": { + "are-we-there-yet": "^2.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^3.0.0", + "set-blocking": "^2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==" + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==" + }, + "object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==" + }, + "on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "requires": { + "ee-first": "1.1.1" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "requires": { + "wrappy": "1" + } + }, + "optjs": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/optjs/-/optjs-3.2.2.tgz", + "integrity": "sha512-f8lTJm4LKirX+45xsFhuRNjA4f46QVLQKfGoNH7e2AEWS+24eM4XNH4pQ8Tw2LISCIvbST/wNcLdtgvgcqVaxA==" + }, + "os-locale": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "integrity": "sha512-PRT7ZORmwu2MEFt4/fv3Q+mEfN4zetKxufQrkShY2oGvUms9r8otu5HfdyIFHkYXjO7laNsoVGmM2MANfuTA8g==", + "requires": { + "lcid": "^1.0.0" + } + }, + "p-is-promise": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-3.0.0.tgz", + "integrity": "sha512-Wo8VsW4IRQSKVXsJCn7TomUaVtyfjVDn3nUP7kE967BQk0CwFpdbZs0X0uk5sW9mkBa9eNM7hCMaG93WUAwxYQ==", + "dev": true + }, + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "requires": { + "yocto-queue": "^0.1.0" + } + }, + "p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "requires": { + "p-limit": "^3.0.2" + } + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" + }, + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true + }, + "pathe": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.1.tgz", + "integrity": "sha512-d+RQGp0MAYTIaDBIMmOfMwz3E+LOZnxx1HZd5R18mmCZY0QBlK0LDZfPc8FW8Ed2DlvsuE6PRjroDY+wg4+j/Q==", + "dev": true + }, + "pathval": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", + "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", + "dev": true + }, + "picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true + }, + "pkg": { + "version": "5.8.1", + "resolved": "https://registry.npmjs.org/pkg/-/pkg-5.8.1.tgz", + "integrity": "sha512-CjBWtFStCfIiT4Bde9QpJy0KeH19jCfwZRJqHFDFXfhUklCx8JoFmMj3wgnEYIwGmZVNkhsStPHEOnrtrQhEXA==", + "dev": true, + "requires": { + "@babel/generator": "7.18.2", + "@babel/parser": "7.18.4", + "@babel/types": "7.19.0", + "chalk": "^4.1.2", + "fs-extra": "^9.1.0", + "globby": "^11.1.0", + "into-stream": "^6.0.0", + "is-core-module": "2.9.0", + "minimist": "^1.2.6", + "multistream": "^4.1.0", + "pkg-fetch": "3.4.2", + "prebuild-install": "7.1.1", + "resolve": "^1.22.0", + "stream-meter": "^1.0.4" + } + }, + "pkg-fetch": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/pkg-fetch/-/pkg-fetch-3.4.2.tgz", + "integrity": "sha512-0+uijmzYcnhC0hStDjm/cl2VYdrmVVBpe7Q8k9YBojxmR5tG8mvR9/nooQq3QSXiQqORDVOTY3XqMEqJVIzkHA==", + "dev": true, + "requires": { + "chalk": "^4.1.2", + "fs-extra": "^9.1.0", + "https-proxy-agent": "^5.0.0", + "node-fetch": "^2.6.6", + "progress": "^2.0.3", + "semver": "^7.3.5", + "tar-fs": "^2.1.1", + "yargs": "^16.2.0" + } + }, + "pkg-types": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.0.3.tgz", + "integrity": "sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==", + "dev": true, + "requires": { + "jsonc-parser": "^3.2.0", + "mlly": "^1.2.0", + "pathe": "^1.1.0" + } + }, + "postcss": { + "version": "8.4.26", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.26.tgz", + "integrity": "sha512-jrXHFF8iTloAenySjM/ob3gSj7pCu0Ji49hnjqzsgSRa50hkWCKD0HQ+gMNJkW38jBI68MpAAg7ZWwHwX8NMMw==", + "dev": true, + "requires": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + } + }, + "prebuild-install": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.1.tgz", + "integrity": "sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==", + "dev": true, + "requires": { + "detect-libc": "^2.0.0", + "expand-template": "^2.0.3", + "github-from-package": "0.0.0", + "minimist": "^1.2.3", + "mkdirp-classic": "^0.5.3", + "napi-build-utils": "^1.0.1", + "node-abi": "^3.3.0", + "pump": "^3.0.0", + "rc": "^1.2.7", + "simple-get": "^4.0.0", + "tar-fs": "^2.0.0", + "tunnel-agent": "^0.6.0" + } + }, + "pretty-format": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.1.tgz", + "integrity": "sha512-7jRj+yXO0W7e4/tSJKoR7HRIHLPPjtNaUGG2xxKQnGvPNRkgWcQ0AZX6P4KBRJN4FcTBWb3sa7DVUJmocYuoog==", + "dev": true, + "requires": { + "@jest/schemas": "^29.6.0", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true + } + } + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true + }, + "proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "requires": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + } + }, + "proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, + "pstree.remy": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", + "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", + "dev": true + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "requires": { + "side-channel": "^1.0.4" + } + }, + "queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true + }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" + }, + "raw-body": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "requires": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + } + }, + "rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dev": true, + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + } + }, + "react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", + "dev": true + }, + "readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "requires": { + "picomatch": "^2.2.1" + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true + }, + "resolve": { + "version": "1.22.2", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", + "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", + "dev": true, + "requires": { + "is-core-module": "^2.11.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "dependencies": { + "is-core-module": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz", + "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + } + } + }, + "reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "requires": { + "glob": "^7.1.3" + } + }, + "rollup": { + "version": "3.26.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.26.2.tgz", + "integrity": "sha512-6umBIGVz93er97pMgQO08LuH3m6PUb3jlDUUGFsNJB6VgTCUaDFpupf5JfU30529m/UKOgmiX+uY6Sx8cOYpLA==", + "dev": true, + "requires": { + "fsevents": "~2.3.2" + } + }, + "run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "requires": { + "queue-microtask": "^1.2.2" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "requires": { + "lru-cache": "^6.0.0" + } + }, + "send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "requires": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + }, + "dependencies": { + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + } + } + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + } + } + }, + "serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + } + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" + }, + "setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, + "siginfo": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", + "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", + "dev": true + }, + "signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + }, + "simple-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", + "dev": true + }, + "simple-get": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", + "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", + "dev": true, + "requires": { + "decompress-response": "^6.0.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } + }, + "simple-update-notifier": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", + "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==", + "dev": true, + "requires": { + "semver": "^7.5.3" + } + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true + }, + "source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "dev": true + }, + "stackback": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", + "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", + "dev": true + }, + "statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" + }, + "std-env": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.3.3.tgz", + "integrity": "sha512-Rz6yejtVyWnVjC1RFvNmYL10kgjC49EOghxWn0RFqlCHGFpQx+Xe7yW3I4ceK1SGrWIGMjD5Kbue8W/udkbMJg==", + "dev": true + }, + "stream-meter": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/stream-meter/-/stream-meter-1.0.4.tgz", + "integrity": "sha512-4sOEtrbgFotXwnEuzzsQBYEV1elAeFSO8rSGeTwabuX1RRn/kEq9JVH7I0MRBhKVRR0sJkr0M0QCH7yOLf9fhQ==", + "dev": true, + "requires": { + "readable-stream": "^2.1.4" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "requires": { + "safe-buffer": "~5.2.0" + } + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true + }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "dev": true + }, + "strip-literal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-1.0.1.tgz", + "integrity": "sha512-QZTsipNpa2Ppr6v1AmJHESqJ3Uz247MUS0OjrnnZjFAvEoWqxuyFuXn2xLgMtRnijJShAa1HL0gtJyUs7u7n3Q==", + "dev": true, + "requires": { + "acorn": "^8.8.2" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true + }, + "swagger-autogen": { + "version": "2.23.5", + "resolved": "https://registry.npmjs.org/swagger-autogen/-/swagger-autogen-2.23.5.tgz", + "integrity": "sha512-4Tl2+XhZMyHoBYkABnScHtQE0lKPKUD3NBt09mClrI6UKOUYljKlYw1xiFVwsHCTGR2hAXmhT4PpgjruCtt1ZA==", + "requires": { + "acorn": "^7.4.1", + "deepmerge": "^4.2.2", + "glob": "^7.1.7", + "json5": "^2.2.3" + }, + "dependencies": { + "acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==" + } + } + }, + "tar": { + "version": "6.1.15", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.15.tgz", + "integrity": "sha512-/zKt9UyngnxIT/EAGYuxaMYgOIJiP81ab9ZfkILq4oNLPFX50qyYmu7jRj9qeXoxmJHjGlbH0+cm2uy1WCs10A==", + "requires": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + } + }, + "tar-fs": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", + "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", + "dev": true, + "requires": { + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.1.4" + }, + "dependencies": { + "chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "dev": true + } + } + }, + "tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "dev": true, + "requires": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + } + }, + "test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "requires": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + } + }, + "tinybench": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.5.0.tgz", + "integrity": "sha512-kRwSG8Zx4tjF9ZiyH4bhaebu+EDz1BOx9hOigYHlUW4xxI/wKIUQUqo018UlU4ar6ATPBsaMrdbKZ+tmPdohFA==", + "dev": true + }, + "tinypool": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-0.6.0.tgz", + "integrity": "sha512-FdswUUo5SxRizcBc6b1GSuLpLjisa8N8qMyYoP3rl+bym+QauhtJP5bvZY1ytt8krKGmMLYIRl36HBZfeAoqhQ==", + "dev": true + }, + "tinyspy": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-2.1.1.tgz", + "integrity": "sha512-XPJL2uSzcOyBMky6OFrusqWlzfFrXtE0hPuMgW8A2HmaqrPo4ZQHRN/V0QXN3FSjKxpsbRrFc5LI7KOwBsT1/w==", + "dev": true + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "dev": true + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + }, + "toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" + }, + "touch": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", + "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", + "dev": true, + "requires": { + "nopt": "~1.0.10" + }, + "dependencies": { + "nopt": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", + "integrity": "sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==", + "dev": true, + "requires": { + "abbrev": "1" + } + } + } + }, + "tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, + "ts-essentials": { + "version": "9.3.2", + "resolved": "https://registry.npmjs.org/ts-essentials/-/ts-essentials-9.3.2.tgz", + "integrity": "sha512-JxKJzuWqH1MmH4ZFHtJzGEhkfN3QvVR3C3w+4BIoWeoY68UVVoA2Np/Bca9z0IPSErVCWhv439aT0We4Dks8kQ==", + "dev": true, + "requires": {} + }, + "ts-node": { + "version": "10.9.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", + "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", + "dev": true, + "requires": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + } + }, + "tsconfck": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/tsconfck/-/tsconfck-2.1.1.tgz", + "integrity": "sha512-ZPCkJBKASZBmBUNqGHmRhdhM8pJYDdOXp4nRgj/O0JwUwsMq50lCDRQP/M5GBNAA0elPrq4gAeu4dkaVCuKWww==", + "dev": true, + "requires": {} + }, + "tsconfig-paths": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", + "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==", + "dev": true, + "requires": { + "json5": "^2.2.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "dev": true, + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true + }, + "type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } + }, + "typescript": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.2.tgz", + "integrity": "sha512-wVORMBGO/FAs/++blGNeAVdbNKtIh1rbBL2EyQ1+J9lClJ93KiiKe8PmFIVdXhHcyv44SL9oglmfeSsndo0jRw==", + "dev": true + }, + "ufo": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.1.2.tgz", + "integrity": "sha512-TrY6DsjTQQgyS3E3dBaOXf0TpPD8u9FVrVYmKVegJuFw51n/YB9XPt+U6ydzFG5ZIN7+DIjPbNmXoBj9esYhgQ==", + "dev": true + }, + "undefsafe": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", + "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", + "dev": true + }, + "universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==" + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==" + }, + "v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true + }, + "v8-to-istanbul": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.1.0.tgz", + "integrity": "sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA==", + "dev": true, + "requires": { + "@jridgewell/trace-mapping": "^0.3.12", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^1.6.0" + } + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==" + }, + "vite": { + "version": "4.4.4", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.4.4.tgz", + "integrity": "sha512-4mvsTxjkveWrKDJI70QmelfVqTm+ihFAb6+xf4sjEU2TmUCTlVX87tmg/QooPEMQb/lM9qGHT99ebqPziEd3wg==", + "dev": true, + "requires": { + "esbuild": "^0.18.10", + "fsevents": "~2.3.2", + "postcss": "^8.4.25", + "rollup": "^3.25.2" + }, + "dependencies": { + "@esbuild/linux-x64": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.12.tgz", + "integrity": "sha512-OrNJMGQbPaVyHHcDF8ybNSwu7TDOfX8NGpXCbetwOSP6txOJiWlgQnRymfC9ocR1S0Y5PW0Wb1mV6pUddqmvmQ==", + "dev": true, + "optional": true + }, + "esbuild": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.12.tgz", + "integrity": "sha512-XuOVLDdtsDslXStStduT41op21Ytmf4/BDS46aa3xPJ7X5h2eMWBF1oAe3QjUH3bDksocNXgzGUZ7XHIBya6Tg==", + "dev": true, + "requires": { + "@esbuild/android-arm": "0.18.12", + "@esbuild/android-arm64": "0.18.12", + "@esbuild/android-x64": "0.18.12", + "@esbuild/darwin-arm64": "0.18.12", + "@esbuild/darwin-x64": "0.18.12", + "@esbuild/freebsd-arm64": "0.18.12", + "@esbuild/freebsd-x64": "0.18.12", + "@esbuild/linux-arm": "0.18.12", + "@esbuild/linux-arm64": "0.18.12", + "@esbuild/linux-ia32": "0.18.12", + "@esbuild/linux-loong64": "0.18.12", + "@esbuild/linux-mips64el": "0.18.12", + "@esbuild/linux-ppc64": "0.18.12", + "@esbuild/linux-riscv64": "0.18.12", + "@esbuild/linux-s390x": "0.18.12", + "@esbuild/linux-x64": "0.18.12", + "@esbuild/netbsd-x64": "0.18.12", + "@esbuild/openbsd-x64": "0.18.12", + "@esbuild/sunos-x64": "0.18.12", + "@esbuild/win32-arm64": "0.18.12", + "@esbuild/win32-ia32": "0.18.12", + "@esbuild/win32-x64": "0.18.12" + } + } + } + }, + "vite-node": { + "version": "0.33.0", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-0.33.0.tgz", + "integrity": "sha512-19FpHYbwWWxDr73ruNahC+vtEdza52kA90Qb3La98yZ0xULqV8A5JLNPUff0f5zID4984tW7l3DH2przTJUZSw==", + "dev": true, + "requires": { + "cac": "^6.7.14", + "debug": "^4.3.4", + "mlly": "^1.4.0", + "pathe": "^1.1.1", + "picocolors": "^1.0.0", + "vite": "^3.0.0 || ^4.0.0" + } + }, + "vite-tsconfig-paths": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/vite-tsconfig-paths/-/vite-tsconfig-paths-4.2.0.tgz", + "integrity": "sha512-jGpus0eUy5qbbMVGiTxCL1iB9ZGN6Bd37VGLJU39kTDD6ZfULTTb1bcc5IeTWqWJKiWV5YihCaibeASPiGi8kw==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "globrex": "^0.1.2", + "tsconfck": "^2.1.0" + } + }, + "vitest": { + "version": "0.33.0", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-0.33.0.tgz", + "integrity": "sha512-1CxaugJ50xskkQ0e969R/hW47za4YXDUfWJDxip1hwbnhUjYolpfUn2AMOulqG/Dtd9WYAtkHmM/m3yKVrEejQ==", + "dev": true, + "requires": { + "@types/chai": "^4.3.5", + "@types/chai-subset": "^1.3.3", + "@types/node": "*", + "@vitest/expect": "0.33.0", + "@vitest/runner": "0.33.0", + "@vitest/snapshot": "0.33.0", + "@vitest/spy": "0.33.0", + "@vitest/utils": "0.33.0", + "acorn": "^8.9.0", + "acorn-walk": "^8.2.0", + "cac": "^6.7.14", + "chai": "^4.3.7", + "debug": "^4.3.4", + "local-pkg": "^0.4.3", + "magic-string": "^0.30.1", + "pathe": "^1.1.1", + "picocolors": "^1.0.0", + "std-env": "^3.3.3", + "strip-literal": "^1.0.1", + "tinybench": "^2.5.0", + "tinypool": "^0.6.0", + "vite": "^3.0.0 || ^4.0.0", + "vite-node": "0.33.0", + "why-is-node-running": "^2.2.2" + } + }, + "vitest-mock-extended": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/vitest-mock-extended/-/vitest-mock-extended-1.1.4.tgz", + "integrity": "sha512-MKPdepFjk0CE7Ocb5txntHK/sloHO9s0Kk9dr630uL03shRSHMkZtSs5CBPsbJ8K/CvYLv0GHUmMt2zWks2eXg==", + "dev": true, + "requires": { + "ts-essentials": "^9.3.2" + } + }, + "webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, + "whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "requires": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "why-is-node-running": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.2.2.tgz", + "integrity": "sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==", + "dev": true, + "requires": { + "siginfo": "^2.0.0", + "stackback": "0.0.2" + } + }, + "wide-align": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", + "requires": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, + "window-size": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.4.tgz", + "integrity": "sha512-2thx4pB0cV3h+Bw7QmMXcEbdmOzv9t0HFplJH/Lz6yu60hXYy5RT8rUu+wlIreVxWsGN20mo+MHeCSfUpQBwPw==" + }, + "wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "requires": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + } + }, + "yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true + }, + "yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true + }, + "yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true + } + } +} From 4d227a7cec890722b02f323e37adeac5ba8a265d Mon Sep 17 00:00:00 2001 From: anatole Date: Wed, 19 Jul 2023 00:42:48 +0200 Subject: [PATCH 393/883] feat(README): update Getting started --- services/gateway/README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/services/gateway/README.md b/services/gateway/README.md index d39465e4..e8a4dbf7 100644 --- a/services/gateway/README.md +++ b/services/gateway/README.md @@ -36,7 +36,8 @@ You can use the following tools to help you with the setup: 3. Run `npm install` to install the necessary dependencies. 4. Create a `.env` file at the root of the project directory and add the environment variables values ( see `.env.example`). -5. Run `npm run start` to start the microservice. +5. Run `cd proto && sh ./build-protos.sh ./proto/user.proto ./src/proto && cd ..` to generate js file to create the clients. +6. Run `npm run start` to start the microservice. You can now access the microservice at `http://localhost:50000`. From 31f84c1a3718b57b6bca9fff17d274b80f2d2cb0 Mon Sep 17 00:00:00 2001 From: anatole Date: Tue, 25 Jul 2023 00:48:59 +0200 Subject: [PATCH 394/883] feat(user): create the user controller --- .../src/controller/user/userController.ts | 179 +++++++++++++++++- .../src/services/clients/user_client.ts | 6 + services/gateway/src/services/user_service.ts | 20 +- 3 files changed, 192 insertions(+), 13 deletions(-) create mode 100644 services/gateway/src/services/clients/user_client.ts diff --git a/services/gateway/src/controller/user/userController.ts b/services/gateway/src/controller/user/userController.ts index df9de11d..c3f89dc8 100644 --- a/services/gateway/src/controller/user/userController.ts +++ b/services/gateway/src/controller/user/userController.ts @@ -1,16 +1,30 @@ import express, {Request, Response} from 'express'; -import userService from '../../services/user_service'; -import {UserId} from "@order/proto/user_pb"; +import userServiceClient from '../../services/clients/user_client'; +import { + changePasswordInput, + changeRoleInput, + DeleteInput, + logInInput, + UpdateUserInput, + User, + UserCreateInput, + validateInput +} from "@order/proto/user_pb"; import {Empty} from "google-protobuf/google/protobuf/empty_pb"; - +import {getUser} from "@order/services/user_service"; export const userController = (app: express.Application) => { app.get('/api/user/:id', (req: Request, res: Response) => { const {id} = req.params; - const userId = new UserId(); - userId.setId(Number(id)); + try { + res.json(getUser(Number(id))); + } catch (e: any) { + res.json({error: e.message}); + } + }); - userService.getUser(userId, (error, response) => { + app.get('/api/user', (req: Request, res: Response) => { + userServiceClient.listUser(new Empty(), (error, response) => { if (error) { res.json({error: error.message}); } else { @@ -19,8 +33,23 @@ export const userController = (app: express.Application) => { }); }); - app.get('/api/user', (req: Request, res: Response) => { - userService.listUser(new Empty(), (error, response) => { + app.post('/api/user', (req: Request, res: Response) => { + const body = req.body; + let userInput = new UserCreateInput(); + try { + userInput.setFirstName(body.firstName) + .setLastName(body.lastName) + .setEmail(body.email) + .setPassword(body.password) + .setPhone(body.phone) + .setMainaddress(body.address) + .setRole(body.role); + + } catch (e: any) { + res.json({error: e.message}); + } + + userServiceClient.register(userInput, (error, response) => { if (error) { res.json({error: error.message}); } else { @@ -28,4 +57,138 @@ export const userController = (app: express.Application) => { } }); }); + + app.put('/api/user/:id', (req: Request, res: Response) => { + const {authorization} = req.headers; + if (!authorization) { + res.json({error: 'Not authorized'}); + return; + } + + const body = req.body; + const userInput = new UpdateUserInput() + try { + const user = new User().setId(Number(req.params.id)) + .setFirstName(body.firstName) + .setLastName(body.lastName) + .setEmail(body.email) + .setPhone(body.phone) + .setMainaddress(body.address) + .setRole(body.role); + + userInput.setUser(user).setToken(authorization); + + } catch (e: any) { + res.json({error: e.message}); + } + + userServiceClient.updateUser(userInput, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } + }); + }); + + app.delete('/api/user/:id', (req: Request, res: Response) => { + const {id} = req.params; + const {authorization} = req.headers; + if (!authorization) { + res.json({error: 'Not authorized'}); + return; + } + + userServiceClient.deleteUser(new DeleteInput().setUserid(Number(id)).setToken(authorization), (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } + }); + }); + + app.post('/api/user/login', (req: Request, res: Response) => { + const body = req.body; + const inInput = new logInInput().setEmail(body.email).setPassword(body.password); + + userServiceClient.logIn(inInput, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } + }); + }); + + app.post('/api/user/validate', (req: Request, res: Response) => { + const {authorization} = req.headers; + if (!authorization) { + res.json({error: 'Not authorized'}); + return; + } + const validate = new validateInput().setToken(authorization); + + userServiceClient.validate(validate, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } + }); + }); + + app.put('/api/user/:id/password', (req: Request, res: Response) => { + const {authorization} = req.headers; + if (!authorization) { + res.json({error: 'Not authorized'}); + return; + } + + const body = req.body; + const updatePasswordInput = new changePasswordInput(); + try { + updatePasswordInput + .setToken(authorization) + .setOldpassword(body.oldpassword) + .setNewpassword(body.password); + } catch (e: any) { + res.json({error: e.message}); + } + + userServiceClient.changePassword(updatePasswordInput, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } + }); + }); + + app.put('/api/user/:id/role', (req: Request, res: Response) => { + const {authorization} = req.headers; + if (!authorization) { + res.json({error: 'Not authorized'}); + return; + } + const body = req.body; + const id = req.params.id; + const updatePasswordInput = new changeRoleInput(); + try { + updatePasswordInput + .setToken(authorization) + .setUserid(Number(id)) + .setRolecode(body.role); + } catch (e: any) { + res.json({error: e.message}); + } + userServiceClient.changeRole(updatePasswordInput, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } + }); + + }); } \ No newline at end of file diff --git a/services/gateway/src/services/clients/user_client.ts b/services/gateway/src/services/clients/user_client.ts new file mode 100644 index 00000000..0f8db947 --- /dev/null +++ b/services/gateway/src/services/clients/user_client.ts @@ -0,0 +1,6 @@ +import services from '../../proto/user_grpc_pb'; +import * as grpc from "grpc"; + +export default new services.UserServiceClient( + 'http://localhost:50001', + grpc.credentials.createInsecure()); \ No newline at end of file diff --git a/services/gateway/src/services/user_service.ts b/services/gateway/src/services/user_service.ts index 25693673..667bb9cc 100644 --- a/services/gateway/src/services/user_service.ts +++ b/services/gateway/src/services/user_service.ts @@ -1,6 +1,16 @@ -import services from '../proto/user_grpc_pb'; -import * as grpc from "grpc"; +import {User, UserId} from "@order/proto/user_pb"; +import userServiceClient from "@order/services/clients/user_client"; -export default new services.UserServiceClient( - 'http://localhost:50001', - grpc.credentials.createInsecure()); \ No newline at end of file +export const getUser = (id: number): User | undefined => { + const userId = new UserId(); + userId.setId(Number(id)); + let user: User | undefined = undefined; + userServiceClient.getUser(userId, (error, response) => { + if (error) { + throw Error(error.message); + } else { + user = response.getUser() + } + }); + return user; +} \ No newline at end of file From ebaf05dda2a53c1d944dcaccec25505efec78def Mon Sep 17 00:00:00 2001 From: anatole Date: Tue, 25 Jul 2023 00:49:21 +0200 Subject: [PATCH 395/883] feat(order): create the order controller --- .../src/controller/order/orderController.ts | 145 ++++++++++++++++++ services/gateway/src/server.ts | 2 + .../src/services/clients/order_client.ts | 7 + 3 files changed, 154 insertions(+) create mode 100644 services/gateway/src/controller/order/orderController.ts create mode 100644 services/gateway/src/services/clients/order_client.ts diff --git a/services/gateway/src/controller/order/orderController.ts b/services/gateway/src/controller/order/orderController.ts new file mode 100644 index 00000000..6d9e4ca4 --- /dev/null +++ b/services/gateway/src/controller/order/orderController.ts @@ -0,0 +1,145 @@ +import orderService from '../../services/clients/order_client'; +import express, {Request, Response} from "express"; +import { + CreateOrderRequest, + DeleteOrderRequest, + GetOrderByDeliveryRequest, + GetOrderByPaymentRequest, + GetOrderRequest, + GetOrdersByStatusRequest, + GetOrdersByUserRequest, + UpdateOrderRequest, + UserMinimum +} from "@order/proto/order_pb"; +import {getUser} from "@order/services/user_service"; +import {User} from "@order/proto/user_pb"; + +export const orderController = (app: express.Application) => { + app.get('/api/order/:id', (req: Request, res: Response) => { + const {id} = req.params; + const orderId = new GetOrderRequest(); + orderId.setId(id); + + orderService.getOrder(orderId, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } + }); + }); + + app.post('/api/order', (req: Request, res: Response) => { + const body = req.body; + let user: User | undefined = undefined; + try { + user = getUser(Number(req.body.userId)); + } catch (e: any) { + res.json({error: e.message}); + } + + if (!user) { + res.json({error: "User not found"}); + return; + } + + const miniUser = new UserMinimum().setId(String(user.getId())) + .setEmail(user.getEmail()) + .setFirstName(user.getFirstName()) + .setLastName(user.getLastName()) + .setPhone(user.getPhone()); + + let orderInput = new CreateOrderRequest() + .setUser(miniUser) + .setPaymentId(body.paymentId) + .setDeliveryId(body.deliveryId) + .setDeliveryType(body.deliveryType) + .setBasketSnapshot(body.basketSnapshot) + .setRestaurantId(body.restaurantId); + + orderService.createOrder(orderInput, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } + }); + }); + + app.get('/api/order/by-user/:userId', (req: Request, res: Response) => { + const {userId} = req.params; + const orderInput = new GetOrdersByUserRequest().setId(userId); + orderService.getOrdersByUser(orderInput, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } + }); + }); + + app.post('/api/order/by-status', (req: Request, res: Response) => { + const orderInput = new GetOrdersByStatusRequest().setStatus(req.body.status); + + orderService.getOrdersByStatus(orderInput, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } + }); + }); + + app.get('/api/order/by-delivery/:deliveryId', (req: Request, res: Response) => { + const {deliveryId} = req.params; + const orderInput = new GetOrderByDeliveryRequest().setId(deliveryId); + orderService.getOrderByDelivery(orderInput, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } + }); + }); + + app.get('/api/order/by-payment/:paymentId', (req: Request, res: Response) => { + const {paymentId} = req.params; + const orderInput = new GetOrderByPaymentRequest().setId(paymentId); + orderService.getOrderByPayment(orderInput, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } + }); + }); + + app.put('/api/order/:orderId', (req: Request, res: Response) => { + const {orderId} = req.params; + const orderInput = new UpdateOrderRequest() + .setId(orderId) + .setStatus(req.body.status) + .setDeliveryId(req.body.deliveryId) + .setPaymentId(req.body.paymentId) + .setRestaurantId(req.body.restaurantId); + orderService.updateOrder(orderInput, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } + }); + }); + + app.delete('/api/order/:orderId', (req: Request, res: Response) => { + const {orderId} = req.params; + const orderInput = new DeleteOrderRequest().setId(orderId); + orderService.deleteOrder(orderInput, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } + }); + }); +} \ No newline at end of file diff --git a/services/gateway/src/server.ts b/services/gateway/src/server.ts index 8c751ad9..748358d8 100644 --- a/services/gateway/src/server.ts +++ b/services/gateway/src/server.ts @@ -1,5 +1,6 @@ import {Request, Response} from "express"; import {userController} from "@order/controller/user/userController"; +import {orderController} from "@order/controller/order/orderController"; const express = require('express'); const bodyParser = require('body-parser'); @@ -14,6 +15,7 @@ app.get('/', (req: Request, res: Response) => { }); userController(app); +orderController(app); app.listen(PORT, () => { console.log(`API Gateway is running on port ${PORT}`); diff --git a/services/gateway/src/services/clients/order_client.ts b/services/gateway/src/services/clients/order_client.ts new file mode 100644 index 00000000..fc3efbd3 --- /dev/null +++ b/services/gateway/src/services/clients/order_client.ts @@ -0,0 +1,7 @@ +import services from '../../proto/order_grpc_pb'; +import * as grpc from "grpc"; + +// TODO: add order env +export default new services.OrderServiceClient( + 'http://localhost:50007', + grpc.credentials.createInsecure()); \ No newline at end of file From 37cf07cb968e3c0dfa0b6e3a220636281eed1784 Mon Sep 17 00:00:00 2001 From: anatole Date: Wed, 2 Aug 2023 11:07:15 +0200 Subject: [PATCH 396/883] feat(gateway config): add dependency --- services/gateway/package-lock.json | 210 +++++++++++++++++++++++++---- services/gateway/package.json | 1 + services/gateway/tsconfig.json | 2 +- 3 files changed, 185 insertions(+), 28 deletions(-) diff --git a/services/gateway/package-lock.json b/services/gateway/package-lock.json index ba01f642..cdcd3cf2 100644 --- a/services/gateway/package-lock.json +++ b/services/gateway/package-lock.json @@ -27,6 +27,7 @@ "@types/node": "^18.15.9", "@vitest/coverage-c8": "^0.33.0", "esbuild": "^0.17.18", + "grpc_tools_node_protoc_ts": "^5.3.3", "grpc-tools": "^1.12.4", "nodemon": "^3.0.1", "pkg": "^5.8.1", @@ -1860,6 +1861,25 @@ "node": ">=4" } }, + "node_modules/grpc_tools_node_protoc_ts": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/grpc_tools_node_protoc_ts/-/grpc_tools_node_protoc_ts-5.3.3.tgz", + "integrity": "sha512-M/YrklvVXMtuuj9kb42PxeouZhs7Ul+R4e/31XwrankUcKL8cQQP50Q9q+KEHGyHQaPt6VtKKsxMgLaKbCxeww==", + "dev": true, + "dependencies": { + "google-protobuf": "3.15.8", + "handlebars": "4.7.7" + }, + "bin": { + "protoc-gen-ts": "bin/protoc-gen-ts" + } + }, + "node_modules/grpc_tools_node_protoc_ts/node_modules/google-protobuf": { + "version": "3.15.8", + "resolved": "https://registry.npmjs.org/google-protobuf/-/google-protobuf-3.15.8.tgz", + "integrity": "sha512-2jtfdqTaSxk0cuBJBtTTWsot4WtR9RVr2rXg7x7OoqiuOKopPrwXpM1G4dXIkLcUNRh3RKzz76C8IOkksZSeOw==", + "dev": true + }, "node_modules/grpc-tools": { "version": "1.12.4", "resolved": "https://registry.npmjs.org/grpc-tools/-/grpc-tools-1.12.4.tgz", @@ -1975,6 +1995,27 @@ "y18n": "^3.2.0" } }, + "node_modules/handlebars": { + "version": "4.7.7", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz", + "integrity": "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==", + "dev": true, + "dependencies": { + "minimist": "^1.2.5", + "neo-async": "^2.6.0", + "source-map": "^0.6.1", + "wordwrap": "^1.0.0" + }, + "bin": { + "handlebars": "bin/handlebars" + }, + "engines": { + "node": ">=0.4.7" + }, + "optionalDependencies": { + "uglify-js": "^3.1.4" + } + }, "node_modules/has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", @@ -2643,6 +2684,12 @@ "node": ">= 0.6" } }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true + }, "node_modules/node-abi": { "version": "3.45.0", "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.45.0.tgz", @@ -3559,6 +3606,15 @@ "node": ">=8" } }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/source-map-js": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", @@ -3936,26 +3992,6 @@ } } }, - "node_modules/tsconfck": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/tsconfck/-/tsconfck-2.1.1.tgz", - "integrity": "sha512-ZPCkJBKASZBmBUNqGHmRhdhM8pJYDdOXp4nRgj/O0JwUwsMq50lCDRQP/M5GBNAA0elPrq4gAeu4dkaVCuKWww==", - "dev": true, - "bin": { - "tsconfck": "bin/tsconfck.js" - }, - "engines": { - "node": "^14.13.1 || ^16 || >=18" - }, - "peerDependencies": { - "typescript": "^4.3.5 || ^5.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, "node_modules/tsconfig-paths": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", @@ -4022,6 +4058,19 @@ "integrity": "sha512-TrY6DsjTQQgyS3E3dBaOXf0TpPD8u9FVrVYmKVegJuFw51n/YB9XPt+U6ydzFG5ZIN7+DIjPbNmXoBj9esYhgQ==", "dev": true }, + "node_modules/uglify-js": { + "version": "3.17.4", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz", + "integrity": "sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==", + "dev": true, + "optional": true, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + } + }, "node_modules/undefsafe": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", @@ -4183,6 +4232,41 @@ } } }, + "node_modules/vite-tsconfig-paths/node_modules/tsconfck": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/tsconfck/-/tsconfck-2.1.2.tgz", + "integrity": "sha512-ghqN1b0puy3MhhviwO2kGF8SeMDNhEbnKxjK7h6+fvY9JAxqvXi8y5NAHSQv687OVboS2uZIByzGd45/YxrRHg==", + "dev": true, + "bin": { + "tsconfck": "bin/tsconfck.js" + }, + "engines": { + "node": "^14.13.1 || ^16 || >=18" + }, + "peerDependencies": { + "typescript": "^4.3.5 || ^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/vite-tsconfig-paths/node_modules/typescript": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz", + "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==", + "dev": true, + "optional": true, + "peer": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, "node_modules/vite/node_modules/@esbuild/linux-x64": { "version": "0.18.12", "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.12.tgz", @@ -4390,6 +4474,12 @@ "node": ">= 0.10.0" } }, + "node_modules/wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", + "dev": true + }, "node_modules/wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", @@ -5988,6 +6078,24 @@ } } }, + "grpc_tools_node_protoc_ts": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/grpc_tools_node_protoc_ts/-/grpc_tools_node_protoc_ts-5.3.3.tgz", + "integrity": "sha512-M/YrklvVXMtuuj9kb42PxeouZhs7Ul+R4e/31XwrankUcKL8cQQP50Q9q+KEHGyHQaPt6VtKKsxMgLaKbCxeww==", + "dev": true, + "requires": { + "google-protobuf": "3.15.8", + "handlebars": "4.7.7" + }, + "dependencies": { + "google-protobuf": { + "version": "3.15.8", + "resolved": "https://registry.npmjs.org/google-protobuf/-/google-protobuf-3.15.8.tgz", + "integrity": "sha512-2jtfdqTaSxk0cuBJBtTTWsot4WtR9RVr2rXg7x7OoqiuOKopPrwXpM1G4dXIkLcUNRh3RKzz76C8IOkksZSeOw==", + "dev": true + } + } + }, "grpc-tools": { "version": "1.12.4", "resolved": "https://registry.npmjs.org/grpc-tools/-/grpc-tools-1.12.4.tgz", @@ -5997,6 +6105,19 @@ "@mapbox/node-pre-gyp": "^1.0.5" } }, + "handlebars": { + "version": "4.7.7", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz", + "integrity": "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==", + "dev": true, + "requires": { + "minimist": "^1.2.5", + "neo-async": "^2.6.0", + "source-map": "^0.6.1", + "uglify-js": "^3.1.4", + "wordwrap": "^1.0.0" + } + }, "has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", @@ -6462,6 +6583,12 @@ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==" }, + "neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true + }, "node-abi": { "version": "3.45.0", "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.45.0.tgz", @@ -7096,6 +7223,12 @@ "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, "source-map-js": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", @@ -7388,13 +7521,6 @@ "yn": "3.1.1" } }, - "tsconfck": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/tsconfck/-/tsconfck-2.1.1.tgz", - "integrity": "sha512-ZPCkJBKASZBmBUNqGHmRhdhM8pJYDdOXp4nRgj/O0JwUwsMq50lCDRQP/M5GBNAA0elPrq4gAeu4dkaVCuKWww==", - "dev": true, - "requires": {} - }, "tsconfig-paths": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", @@ -7442,6 +7568,13 @@ "integrity": "sha512-TrY6DsjTQQgyS3E3dBaOXf0TpPD8u9FVrVYmKVegJuFw51n/YB9XPt+U6ydzFG5ZIN7+DIjPbNmXoBj9esYhgQ==", "dev": true }, + "uglify-js": { + "version": "3.17.4", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz", + "integrity": "sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==", + "dev": true, + "optional": true + }, "undefsafe": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", @@ -7565,6 +7698,23 @@ "debug": "^4.1.1", "globrex": "^0.1.2", "tsconfck": "^2.1.0" + }, + "dependencies": { + "tsconfck": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/tsconfck/-/tsconfck-2.1.2.tgz", + "integrity": "sha512-ghqN1b0puy3MhhviwO2kGF8SeMDNhEbnKxjK7h6+fvY9JAxqvXi8y5NAHSQv687OVboS2uZIByzGd45/YxrRHg==", + "dev": true, + "requires": {} + }, + "typescript": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz", + "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==", + "dev": true, + "optional": true, + "peer": true + } } }, "vitest": { @@ -7654,6 +7804,12 @@ "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.4.tgz", "integrity": "sha512-2thx4pB0cV3h+Bw7QmMXcEbdmOzv9t0HFplJH/Lz6yu60hXYy5RT8rUu+wlIreVxWsGN20mo+MHeCSfUpQBwPw==" }, + "wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", + "dev": true + }, "wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", diff --git a/services/gateway/package.json b/services/gateway/package.json index 7c7763b7..f4920a50 100644 --- a/services/gateway/package.json +++ b/services/gateway/package.json @@ -27,6 +27,7 @@ "@types/node": "^18.15.9", "@vitest/coverage-c8": "^0.33.0", "esbuild": "^0.17.18", + "grpc_tools_node_protoc_ts": "^5.3.3", "grpc-tools": "^1.12.4", "nodemon": "^3.0.1", "pkg": "^5.8.1", diff --git a/services/gateway/tsconfig.json b/services/gateway/tsconfig.json index f7f47ecc..e59b3816 100644 --- a/services/gateway/tsconfig.json +++ b/services/gateway/tsconfig.json @@ -7,7 +7,7 @@ "esModuleInterop": true, "baseUrl": ".", "paths": { - "@order/*": ["src/*"] + "@gateway/*": ["src/*"] } }, "include": ["src/**/*.ts"], From 63ed75f6de66d55fb2ace64a1ef7650a33dc76b1 Mon Sep 17 00:00:00 2001 From: anatole Date: Wed, 2 Aug 2023 13:13:02 +0200 Subject: [PATCH 397/883] feat(gateway config): rename path --- services/order/tsconfig.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/order/tsconfig.json b/services/order/tsconfig.json index f7f47ecc..e59b3816 100644 --- a/services/order/tsconfig.json +++ b/services/order/tsconfig.json @@ -7,7 +7,7 @@ "esModuleInterop": true, "baseUrl": ".", "paths": { - "@order/*": ["src/*"] + "@gateway/*": ["src/*"] } }, "include": ["src/**/*.ts"], From 931f8e873abc965d97753060eb5c12fb2319ed90 Mon Sep 17 00:00:00 2001 From: anatole Date: Wed, 2 Aug 2023 13:13:54 +0200 Subject: [PATCH 398/883] feat(gateway): rename packages --- .../gateway/src/controller/order/orderController.ts | 8 ++++---- services/gateway/src/controller/user/userController.ts | 6 +++--- .../clients/{order_client.ts => order.client.ts} | 0 services/gateway/src/services/clients/user.client.ts | 10 ++++++++++ services/gateway/src/services/clients/user_client.ts | 6 ------ .../src/services/{user_service.ts => user.service.ts} | 4 ++-- 6 files changed, 19 insertions(+), 15 deletions(-) rename services/gateway/src/services/clients/{order_client.ts => order.client.ts} (100%) create mode 100644 services/gateway/src/services/clients/user.client.ts delete mode 100644 services/gateway/src/services/clients/user_client.ts rename services/gateway/src/services/{user_service.ts => user.service.ts} (75%) diff --git a/services/gateway/src/controller/order/orderController.ts b/services/gateway/src/controller/order/orderController.ts index 6d9e4ca4..1ca0d4c2 100644 --- a/services/gateway/src/controller/order/orderController.ts +++ b/services/gateway/src/controller/order/orderController.ts @@ -1,4 +1,4 @@ -import orderService from '../../services/clients/order_client'; +import orderService from '../../services/clients/order.client'; import express, {Request, Response} from "express"; import { CreateOrderRequest, @@ -10,9 +10,9 @@ import { GetOrdersByUserRequest, UpdateOrderRequest, UserMinimum -} from "@order/proto/order_pb"; -import {getUser} from "@order/services/user_service"; -import {User} from "@order/proto/user_pb"; +} from "@gateway/proto/order_pb"; +import {getUser} from "@gateway/services/user.service"; +import {User} from "@gateway/proto/user_pb"; export const orderController = (app: express.Application) => { app.get('/api/order/:id', (req: Request, res: Response) => { diff --git a/services/gateway/src/controller/user/userController.ts b/services/gateway/src/controller/user/userController.ts index c3f89dc8..5d27c879 100644 --- a/services/gateway/src/controller/user/userController.ts +++ b/services/gateway/src/controller/user/userController.ts @@ -1,5 +1,5 @@ import express, {Request, Response} from 'express'; -import userServiceClient from '../../services/clients/user_client'; +import {userServiceClient} from '../../services/clients/user.client'; import { changePasswordInput, changeRoleInput, @@ -9,9 +9,9 @@ import { User, UserCreateInput, validateInput -} from "@order/proto/user_pb"; +} from "@gateway/proto/user_pb"; import {Empty} from "google-protobuf/google/protobuf/empty_pb"; -import {getUser} from "@order/services/user_service"; +import {getUser} from "@gateway/services/user.service"; export const userController = (app: express.Application) => { app.get('/api/user/:id', (req: Request, res: Response) => { diff --git a/services/gateway/src/services/clients/order_client.ts b/services/gateway/src/services/clients/order.client.ts similarity index 100% rename from services/gateway/src/services/clients/order_client.ts rename to services/gateway/src/services/clients/order.client.ts diff --git a/services/gateway/src/services/clients/user.client.ts b/services/gateway/src/services/clients/user.client.ts new file mode 100644 index 00000000..6b53adba --- /dev/null +++ b/services/gateway/src/services/clients/user.client.ts @@ -0,0 +1,10 @@ +import services from '../../proto/user_grpc_pb'; +import * as grpc from "grpc"; + +export const userServiceClient = new services.UserServiceClient( + 'http://localhost:50001', + grpc.credentials.createInsecure()); + +export const mainAddressServiceClient = new services.MainAddressServiceClient( + 'http://localhost:50001', + grpc.credentials.createInsecure()); \ No newline at end of file diff --git a/services/gateway/src/services/clients/user_client.ts b/services/gateway/src/services/clients/user_client.ts deleted file mode 100644 index 0f8db947..00000000 --- a/services/gateway/src/services/clients/user_client.ts +++ /dev/null @@ -1,6 +0,0 @@ -import services from '../../proto/user_grpc_pb'; -import * as grpc from "grpc"; - -export default new services.UserServiceClient( - 'http://localhost:50001', - grpc.credentials.createInsecure()); \ No newline at end of file diff --git a/services/gateway/src/services/user_service.ts b/services/gateway/src/services/user.service.ts similarity index 75% rename from services/gateway/src/services/user_service.ts rename to services/gateway/src/services/user.service.ts index 667bb9cc..06328da1 100644 --- a/services/gateway/src/services/user_service.ts +++ b/services/gateway/src/services/user.service.ts @@ -1,5 +1,5 @@ -import {User, UserId} from "@order/proto/user_pb"; -import userServiceClient from "@order/services/clients/user_client"; +import {User, UserId} from "@gateway/proto/user_pb"; +import {userServiceClient} from "@gateway/services/clients/user.client"; export const getUser = (id: number): User | undefined => { const userId = new UserId(); From cce4d5862cfac76bea3668d24ecb96c69f16a4fa Mon Sep 17 00:00:00 2001 From: anatole Date: Wed, 2 Aug 2023 13:14:15 +0200 Subject: [PATCH 399/883] feat(gateway): add product controller --- .../controller/product/allergenController.ts | 65 +++++++++ .../controller/product/categoryController.ts | 65 +++++++++ .../controller/product/productController.ts | 131 ++++++++++++++++++ .../src/services/clients/product.client.ts | 15 ++ 4 files changed, 276 insertions(+) create mode 100644 services/gateway/src/controller/product/allergenController.ts create mode 100644 services/gateway/src/controller/product/categoryController.ts create mode 100644 services/gateway/src/controller/product/productController.ts create mode 100644 services/gateway/src/services/clients/product.client.ts diff --git a/services/gateway/src/controller/product/allergenController.ts b/services/gateway/src/controller/product/allergenController.ts new file mode 100644 index 00000000..7511087d --- /dev/null +++ b/services/gateway/src/controller/product/allergenController.ts @@ -0,0 +1,65 @@ +import express, {Request, Response} from 'express'; +import {allergenServiceClient} from '../../services/clients/product.client'; +import {Empty} from "google-protobuf/google/protobuf/empty_pb"; +import {Allergen, AllergenId} from "@gateway/proto/product_pb"; + +export const allergenController = (app: express.Application) => { + app.get('/api/allergen', (req: Request, res: Response) => { + allergenServiceClient.getAllergenList(new Empty(), (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } + }); + }); + + app.get('/api/allergen/:id', (req: Request, res: Response) => { + const {id} = req.params; + const allergenId = new AllergenId().setId(id) + + allergenServiceClient.readAllergen(allergenId, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } + }); + }); + + app.post('/api/allergen', (req: Request, res: Response) => { + const {label} = req.body; + const allergen = new Allergen().setLibelle(label); + allergenServiceClient.createAllergen(allergen, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } + }); + }); + + app.put('/api/allergen/:id', (req: Request, res: Response) => { + const {id} = req.params; + const {label, icon, hexaColor} = req.body; + const allergen = new Allergen().setId(id).setLibelle(label); + allergenServiceClient.updateAllergen(allergen, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } + }); + }); + + app.delete('/api/allergen/:id', (req: Request, res: Response) => { + const {id} = req.params; + allergenServiceClient.deleteAllergen(new AllergenId().setId(id), (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } + }); + }); +} \ No newline at end of file diff --git a/services/gateway/src/controller/product/categoryController.ts b/services/gateway/src/controller/product/categoryController.ts new file mode 100644 index 00000000..d7a0271c --- /dev/null +++ b/services/gateway/src/controller/product/categoryController.ts @@ -0,0 +1,65 @@ +import express, {Request, Response} from 'express'; +import {categoryServiceClient} from '../../services/clients/product.client'; +import {Empty} from "google-protobuf/google/protobuf/empty_pb"; +import {Category, CategoryId} from "@gateway/proto/product_pb"; + +export const categoryController = (app: express.Application) => { + app.get('/api/category', (req: Request, res: Response) => { + categoryServiceClient.getCategoryList(new Empty(), (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } + }); + }); + + app.get('/api/category/:id', (req: Request, res: Response) => { + const {id} = req.params; + const categoryId = new CategoryId().setId(id) + + categoryServiceClient.readCategory(categoryId, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } + }); + }); + + app.post('/api/category', (req: Request, res: Response) => { + const {label, icon, hexaColor} = req.body; + const category = new Category().setLibelle(label).setIcon(icon).setHexaColor(hexaColor) + categoryServiceClient.createCategory(category, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } + }); + }); + + app.put('/api/category/:id', (req: Request, res: Response) => { + const {id} = req.params; + const {label, icon, hexaColor} = req.body; + const category = new Category().setId(id).setLibelle(label).setIcon(icon).setHexaColor(hexaColor) + categoryServiceClient.updateCategory(category, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } + }); + }); + + app.delete('/api/category/:id', (req: Request, res: Response) => { + const {id} = req.params; + categoryServiceClient.deleteCategory(new CategoryId().setId(id), (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } + }); + }); +} \ No newline at end of file diff --git a/services/gateway/src/controller/product/productController.ts b/services/gateway/src/controller/product/productController.ts new file mode 100644 index 00000000..818a1057 --- /dev/null +++ b/services/gateway/src/controller/product/productController.ts @@ -0,0 +1,131 @@ +import express, {Request, Response} from 'express'; +import {productServiceClient} from '../../services/clients/product.client'; +import {Allergen, Category, File, Product, ProductId, RestaurantId} from '../../proto/product_pb'; +import {Empty} from "google-protobuf/google/protobuf/empty_pb"; +import * as fs from "fs"; + +export const productController = (app: express.Application) => { + app.get('/api/product/by-restaurant/:id', (req: Request, res: Response) => { + const {id} = req.params; + const restaurantId = new RestaurantId().setId(id) + + productServiceClient.getProductList(restaurantId, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } + }); + }); + + app.get('/api/product/:id', (req: Request, res: Response) => { + const {id} = req.params; + const productId = new ProductId().setId(id) + + productServiceClient.readProduct(productId, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } + }); + }); + + app.get('/api/product/type', (req: Request, res: Response) => { + productServiceClient.getProductTypeList(new Empty(), (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } + }); + }); + + app.delete('/api/product/:id', (req: Request, res: Response) => { + const {id} = req.params; + const productId = new ProductId().setId(id) + productServiceClient.deleteProduct(productId, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } + }); + }); + + app.post('/api/product', (req: Request, res: Response) => { + const {restaurantId, type, name, image, comment, price, preparation, weight, kilocalories, nutriscore, categories, allergens} = req.body; + + const allergensList = allergens.map((allergen: any) => new Allergen().setLibelle(allergen.label)); + const categoryList = categories.map((category: any) => new Category() + .setLibelle(category.label) + .setHexaColor(category.hexaColor) + .setIcon(category.icon)); + + const productId = new Product().setRestaurantId(Number(restaurantId)).setType(type) + .setName(name) + .setImage(image) + .setComment(comment) + .setPrice(price) + .setPreparation(preparation) + .setWeight(weight) + .setKilocalories(kilocalories) + .setNutriscore(nutriscore) + .setCategoriesList(categoryList) + .setAllergensList(allergensList); + + productServiceClient.createProduct(productId, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } + }); + }); + + app.put('/api/product/:id', (req: Request, res: Response) => { + const {id} = req.params + const {restaurantId, type, name, image, comment, price, preparation, weight, kilocalories, nutriscore, categories, allergens} = req.body; + + const allergensList = allergens.map((allergen: any) => new Allergen().setLibelle(allergen.label)); + const categoryList = categories.map((category: any) => new Category() + .setLibelle(category.label) + .setHexaColor(category.hexaColor) + .setIcon(category.icon)); + + const productId = new Product().setId(id).setRestaurantId(Number(restaurantId)).setType(type) + .setName(name) + .setImage(image) + .setComment(comment) + .setPrice(price) + .setPreparation(preparation) + .setWeight(weight) + .setKilocalories(kilocalories) + .setNutriscore(nutriscore) + .setCategoriesList(categoryList) + .setAllergensList(allergensList); + + productServiceClient.createProduct(productId, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } + }); + }); + + app.post('/api/product/image', (req: Request, res: Response) => { + const {input_file} = req.body; + var bitmap = fs.readFileSync(input_file); + var base64File = new Buffer(bitmap).toString('base64'); + + const file = new File().setName(input_file).setData(base64File); + productServiceClient.uploadImage(file, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } + }); + }); +} \ No newline at end of file diff --git a/services/gateway/src/services/clients/product.client.ts b/services/gateway/src/services/clients/product.client.ts new file mode 100644 index 00000000..7eb30f74 --- /dev/null +++ b/services/gateway/src/services/clients/product.client.ts @@ -0,0 +1,15 @@ +import * as grpc from "grpc"; +import {AllergenServiceClient, CategoryServiceClient, ProductServiceClient} from "@gateway/proto/product_grpc_pb"; + +// TODO: add order env +export const categoryServiceClient = new CategoryServiceClient( + 'http://localhost:50007', + grpc.credentials.createInsecure()); + +export const allergenServiceClient = new AllergenServiceClient( + 'http://localhost:50007', + grpc.credentials.createInsecure()); + +export const productServiceClient = new ProductServiceClient( + 'http://localhost:50007', + grpc.credentials.createInsecure()); \ No newline at end of file From 9b950320392c354a08fb7a8ba0f35943f7758c3f Mon Sep 17 00:00:00 2001 From: anatole Date: Wed, 2 Aug 2023 13:14:25 +0200 Subject: [PATCH 400/883] feat(gateway): add metric controller --- .../src/controller/metric/metricController.ts | 32 +++++++++++++++++++ .../src/services/clients/metric.client.ts | 7 ++++ 2 files changed, 39 insertions(+) create mode 100644 services/gateway/src/controller/metric/metricController.ts create mode 100644 services/gateway/src/services/clients/metric.client.ts diff --git a/services/gateway/src/controller/metric/metricController.ts b/services/gateway/src/controller/metric/metricController.ts new file mode 100644 index 00000000..339d4955 --- /dev/null +++ b/services/gateway/src/controller/metric/metricController.ts @@ -0,0 +1,32 @@ +import metricService from '../../services/clients/metric.client'; +import express from "express"; +import {GetMetricRequest, Metric} from "@gateway/proto/metric_pb"; + +export const metricController = (app: express.Application) => { + app.get('/api/metric/:key', (req, res) => { + const {key} = req.params; + const metricInput = new GetMetricRequest().setKey(key); + metricService.getMetric(metricInput, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } + }); + }); + + + app.post('/api/metric', (req, res) => { + const {restaurantId, code, value, key} = req.body + const newMetric = new Metric().setKey(key).setRestaurantId(restaurantId).setCode(code).setValue(value) + + metricService.pushMetric(newMetric, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } + }); + }); +} + diff --git a/services/gateway/src/services/clients/metric.client.ts b/services/gateway/src/services/clients/metric.client.ts new file mode 100644 index 00000000..8a9232e5 --- /dev/null +++ b/services/gateway/src/services/clients/metric.client.ts @@ -0,0 +1,7 @@ +import services from '../../proto/metric_grpc_pb'; +import * as grpc from "grpc"; + +// TODO: add metric env +export default new services.ReportingServiceClient( + 'http://localhost:50007', + grpc.credentials.createInsecure()); \ No newline at end of file From 0e462023ef6b28803eff1700f193f16fd2e722a5 Mon Sep 17 00:00:00 2001 From: anatole Date: Wed, 2 Aug 2023 13:14:41 +0200 Subject: [PATCH 401/883] feat(gateway): add log controller --- .../src/controller/log/logController.ts | 29 +++++++++++++++++++ .../src/services/clients/log.client.ts | 7 +++++ 2 files changed, 36 insertions(+) create mode 100644 services/gateway/src/controller/log/logController.ts create mode 100644 services/gateway/src/services/clients/log.client.ts diff --git a/services/gateway/src/controller/log/logController.ts b/services/gateway/src/controller/log/logController.ts new file mode 100644 index 00000000..c9faf8d2 --- /dev/null +++ b/services/gateway/src/controller/log/logController.ts @@ -0,0 +1,29 @@ +import express from "express"; +import {logServiceClient} from "@gateway/services/clients/log.client"; +import {Empty} from "google-protobuf/google/protobuf/empty_pb"; +import {GetLogRequest} from "@gateway/proto/log_pb"; + +const logController = (app: express.Application) => { + app.get('/api/log', (req: express.Request, res: express.Response) => { + + logServiceClient.listLog(new Empty(), (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } + }); + }); + + app.get('/api/log/:id', (req: express.Request, res: express.Response) => { + const {id} = req.params + + logServiceClient.getLog(new GetLogRequest().setId(Number(id)), (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } + }); + }); +}; \ No newline at end of file diff --git a/services/gateway/src/services/clients/log.client.ts b/services/gateway/src/services/clients/log.client.ts new file mode 100644 index 00000000..5abe375e --- /dev/null +++ b/services/gateway/src/services/clients/log.client.ts @@ -0,0 +1,7 @@ +import services from '../../proto/log_grpc_pb'; +import * as grpc from "grpc"; + +// TODO: add log env +export const logServiceClient = new services.LogServiceClient( + 'http://localhost:50007', + grpc.credentials.createInsecure()); \ No newline at end of file From b4c2c2d60f67968947d89a10d69a2b0dddfc3c5e Mon Sep 17 00:00:00 2001 From: anatole Date: Wed, 2 Aug 2023 13:15:05 +0200 Subject: [PATCH 402/883] feat(gateway): add new controller to the server.ts --- services/gateway/src/server.ts | 10 ++++++++-- services/gateway/src/utils/swagger.utils.js | 16 +++++++++------- 2 files changed, 17 insertions(+), 9 deletions(-) diff --git a/services/gateway/src/server.ts b/services/gateway/src/server.ts index 748358d8..1cb51b64 100644 --- a/services/gateway/src/server.ts +++ b/services/gateway/src/server.ts @@ -1,6 +1,9 @@ import {Request, Response} from "express"; -import {userController} from "@order/controller/user/userController"; -import {orderController} from "@order/controller/order/orderController"; +import {userController} from "@gateway/controller/user/userController"; +import {orderController} from "@gateway/controller/order/orderController"; +import {productController} from "@gateway/controller/product/productController"; +import {categoryController} from "@gateway/controller/product/categoryController"; +import {allergenController} from "@gateway/controller/product/allergenController"; const express = require('express'); const bodyParser = require('body-parser'); @@ -16,6 +19,9 @@ app.get('/', (req: Request, res: Response) => { userController(app); orderController(app); +categoryController(app); +allergenController(app); +productController(app); app.listen(PORT, () => { console.log(`API Gateway is running on port ${PORT}`); diff --git a/services/gateway/src/utils/swagger.utils.js b/services/gateway/src/utils/swagger.utils.js index 00b6a82d..b02415e2 100644 --- a/services/gateway/src/utils/swagger.utils.js +++ b/services/gateway/src/utils/swagger.utils.js @@ -1,15 +1,17 @@ -const swaggerAutogen = require('swagger-autogen')();userController +const swaggerAutogen = require('swagger-autogen')(); const doc = { - info: { - title: 'My API', - description: 'Description' - }, - host: 'localhost:3000' + info: { + title: 'My API', + description: 'Description' + }, + host: 'localhost:3000' }; const outputFile = './swagger-output.json'; -const routes = ['../controller/user/userController.ts']; +const routes = ['../controller/user/userController.ts', + '../controller/order/orderController.ts', + '../controller/product/productController.ts',]; /* NOTE: If you are using the express Router, you must pass in the 'routes' only the root file where the route starts, such as index.js, app.js, routes.js, etc ... */ From 09dd867caff39075622d6876a4eab8ae63606c0c Mon Sep 17 00:00:00 2001 From: anatole Date: Thu, 3 Aug 2023 17:12:24 +0200 Subject: [PATCH 403/883] feat(gateway): create the deliveryPersonController --- .../controller/delivery/deliveryController.ts | 92 +++++++++++++++++++ .../delivery/deliveryPersonController.ts | 88 ++++++++++++++++++ services/gateway/src/server.ts | 4 + .../src/services/clients/delivery.client.ts | 11 +++ 4 files changed, 195 insertions(+) create mode 100644 services/gateway/src/controller/delivery/deliveryController.ts create mode 100644 services/gateway/src/controller/delivery/deliveryPersonController.ts create mode 100644 services/gateway/src/services/clients/delivery.client.ts diff --git a/services/gateway/src/controller/delivery/deliveryController.ts b/services/gateway/src/controller/delivery/deliveryController.ts new file mode 100644 index 00000000..e5d90308 --- /dev/null +++ b/services/gateway/src/controller/delivery/deliveryController.ts @@ -0,0 +1,92 @@ +import {Application, Request, Response} from "express"; +import {deliveryServiceClient} from "@gateway/services/clients/delivery.client"; +import {Delivery, DeliveryCreateInput, DeliveryId, RestaurantId, UserId} from "@gateway/proto/delivery_pb"; + +export const deliveryController = (app: Application) => { + app.get('/api/delivery/:id', (req: Request, res: Response) => { + const {id} = req.params; + + deliveryServiceClient.getDelivery(new DeliveryId().setId(id), (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } + }); + }); + + app.get('/api/delivery/by-restaurant/:id', (req: Request, res: Response) => { + const {id} = req.params; + const restaurantId = new RestaurantId().setId(id); + + deliveryServiceClient.listDeliveriesByRestaurant(restaurantId, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } + }); + }); + + app.get('/api/delivery/by-user/:id', (req: Request, res: Response) => { + const {id} = req.params; + const userId = new UserId().setId(id); + + deliveryServiceClient.listDeliveriesByUser(userId, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } + }); + }); + + app.post('/api/delivery', (req: Request, res: Response) => { + const {eta, address, status, deliveryPersonId, userId, restaurantId} = req.body; + const deliveryCreateInput = new DeliveryCreateInput().setEta(eta) + .setAddress(address) + .setStatus(status) + .setDeliveryPersonId(deliveryPersonId) + .setUserId(userId) + .setRestaurantId(restaurantId); + + deliveryServiceClient.createDelivery(deliveryCreateInput, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } + }); + }); + + app.put('/api/delivery/:id', (req: Request, res: Response) => { + const {id} = req.params; + const {eta, address, status, deliveryPersonId, userId, restaurantId} = req.body; + const delivery = new Delivery().setId(id).setEta(eta) + .setAddress(address) + .setStatus(status) + .setDeliveryPersonId(deliveryPersonId) + .setUserId(userId) + .setRestaurantId(restaurantId); + + deliveryServiceClient.updateDelivery(delivery, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } + }); + }); + + app.delete('/api/delivery/:id', (req: Request, res: Response) => { + const {id} = req.params; + + deliveryServiceClient.deleteDelivery(new DeliveryId().setId(id), (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } + }); + }); +} \ No newline at end of file diff --git a/services/gateway/src/controller/delivery/deliveryPersonController.ts b/services/gateway/src/controller/delivery/deliveryPersonController.ts new file mode 100644 index 00000000..8ab0c64f --- /dev/null +++ b/services/gateway/src/controller/delivery/deliveryPersonController.ts @@ -0,0 +1,88 @@ +import {Application} from "express"; +import {deliveryPersonServiceClient} from "@gateway/services/clients/delivery.client"; +import {DeliveryPerson, DeliveryPersonCreateInput, DeliveryPersonId, Location} from "@gateway/proto/delivery_pb"; +import {Empty} from "google-protobuf/google/protobuf/empty_pb"; + +export const deliveryPersonController = (app: Application) => { + app.get('/api/delivery-person/:id', (req, res) => { + const {id} = req.params; + + deliveryPersonServiceClient.getDeliveryPerson(new DeliveryPersonId().setId(id), (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } + }); + }); + + app.get('/api/delivery-person', (req, res) => { + deliveryPersonServiceClient.listDeliveryPersons(new Empty(), (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } + }); + }); + + app.post('/api/delivery-person', (req, res) => { + const {lat, lng} = req.body; + const location = new Location() + .setLatitude(lat) + .setLongitude(lng); + deliveryPersonServiceClient.listNearDeliveryPersons(location, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } + }); + }); + + app.post('/api/delivery-person', (req, res) => { + const {firstName, lastName, phone, locationList} = req.body; + const deliveryPerson = new DeliveryPersonCreateInput() + .setFirstName(firstName) + .setLastName(lastName) + .setPhone(phone) + .setLocationList(locationList); + deliveryPersonServiceClient.createDeliveryPerson(deliveryPerson, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } + }); + }); + + app.put('/api/delivery-person/:id', (req, res) => { + const {id} = req.params; + const {firstName, lastName, phone, locationList} = req.body; + const deliveryPerson = new DeliveryPerson().setId(id) + .setFirstName(firstName) + .setLastName(lastName) + .setPhone(phone) + .setLocationList(locationList); + + deliveryPersonServiceClient.updateDeliveryPerson(deliveryPerson, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } + }); + }); + + app.delete('/api/delivery-person/:id', (req, res) => { + const {id} = req.params; + + deliveryPersonServiceClient.deleteDeliveryPerson(new DeliveryPersonId().setId(id), (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } + }); + }); +} \ No newline at end of file diff --git a/services/gateway/src/server.ts b/services/gateway/src/server.ts index 1cb51b64..b3e2d635 100644 --- a/services/gateway/src/server.ts +++ b/services/gateway/src/server.ts @@ -4,6 +4,8 @@ import {orderController} from "@gateway/controller/order/orderController"; import {productController} from "@gateway/controller/product/productController"; import {categoryController} from "@gateway/controller/product/categoryController"; import {allergenController} from "@gateway/controller/product/allergenController"; +import {deliveryController} from "@gateway/controller/delivery/deliveryController"; +import {deliveryPersonController} from "@gateway/controller/delivery/deliveryPersonController"; const express = require('express'); const bodyParser = require('body-parser'); @@ -22,6 +24,8 @@ orderController(app); categoryController(app); allergenController(app); productController(app); +deliveryController(app); +deliveryPersonController(app); app.listen(PORT, () => { console.log(`API Gateway is running on port ${PORT}`); diff --git a/services/gateway/src/services/clients/delivery.client.ts b/services/gateway/src/services/clients/delivery.client.ts new file mode 100644 index 00000000..6ec48147 --- /dev/null +++ b/services/gateway/src/services/clients/delivery.client.ts @@ -0,0 +1,11 @@ +import services from '../../proto/delivery_grpc_pb'; +import * as grpc from "grpc"; + +// TODO: add delivery env +export const deliveryServiceClient = new services.DeliveryServiceClient( + 'http://localhost:50007', + grpc.credentials.createInsecure()); + +export const deliveryPersonServiceClient = new services.DeliveryPersonServiceClient( + 'http://localhost:50007', + grpc.credentials.createInsecure()); \ No newline at end of file From fbaeda6fa1ae52d6de9054252c440fc33677d73f Mon Sep 17 00:00:00 2001 From: anatole Date: Thu, 3 Aug 2023 17:33:42 +0200 Subject: [PATCH 404/883] feat(gateway): rename controller files --- ...eliveryController.ts => delivery.controller.ts} | 0 ...nController.ts => deliveryPerson.controller.ts} | 0 .../log/{logController.ts => log.controller.ts} | 0 .../{metricController.ts => metric.controller.ts} | 0 .../{orderController.ts => order.controller.ts} | 0 ...llergenController.ts => allergen.controller.ts} | 0 ...ategoryController.ts => category.controller.ts} | 0 ...{productController.ts => product.controller.ts} | 0 .../user/{userController.ts => user.controller.ts} | 0 services/gateway/src/server.ts | 14 +++++++------- 10 files changed, 7 insertions(+), 7 deletions(-) rename services/gateway/src/controller/delivery/{deliveryController.ts => delivery.controller.ts} (100%) rename services/gateway/src/controller/delivery/{deliveryPersonController.ts => deliveryPerson.controller.ts} (100%) rename services/gateway/src/controller/log/{logController.ts => log.controller.ts} (100%) rename services/gateway/src/controller/metric/{metricController.ts => metric.controller.ts} (100%) rename services/gateway/src/controller/order/{orderController.ts => order.controller.ts} (100%) rename services/gateway/src/controller/product/{allergenController.ts => allergen.controller.ts} (100%) rename services/gateway/src/controller/product/{categoryController.ts => category.controller.ts} (100%) rename services/gateway/src/controller/product/{productController.ts => product.controller.ts} (100%) rename services/gateway/src/controller/user/{userController.ts => user.controller.ts} (100%) diff --git a/services/gateway/src/controller/delivery/deliveryController.ts b/services/gateway/src/controller/delivery/delivery.controller.ts similarity index 100% rename from services/gateway/src/controller/delivery/deliveryController.ts rename to services/gateway/src/controller/delivery/delivery.controller.ts diff --git a/services/gateway/src/controller/delivery/deliveryPersonController.ts b/services/gateway/src/controller/delivery/deliveryPerson.controller.ts similarity index 100% rename from services/gateway/src/controller/delivery/deliveryPersonController.ts rename to services/gateway/src/controller/delivery/deliveryPerson.controller.ts diff --git a/services/gateway/src/controller/log/logController.ts b/services/gateway/src/controller/log/log.controller.ts similarity index 100% rename from services/gateway/src/controller/log/logController.ts rename to services/gateway/src/controller/log/log.controller.ts diff --git a/services/gateway/src/controller/metric/metricController.ts b/services/gateway/src/controller/metric/metric.controller.ts similarity index 100% rename from services/gateway/src/controller/metric/metricController.ts rename to services/gateway/src/controller/metric/metric.controller.ts diff --git a/services/gateway/src/controller/order/orderController.ts b/services/gateway/src/controller/order/order.controller.ts similarity index 100% rename from services/gateway/src/controller/order/orderController.ts rename to services/gateway/src/controller/order/order.controller.ts diff --git a/services/gateway/src/controller/product/allergenController.ts b/services/gateway/src/controller/product/allergen.controller.ts similarity index 100% rename from services/gateway/src/controller/product/allergenController.ts rename to services/gateway/src/controller/product/allergen.controller.ts diff --git a/services/gateway/src/controller/product/categoryController.ts b/services/gateway/src/controller/product/category.controller.ts similarity index 100% rename from services/gateway/src/controller/product/categoryController.ts rename to services/gateway/src/controller/product/category.controller.ts diff --git a/services/gateway/src/controller/product/productController.ts b/services/gateway/src/controller/product/product.controller.ts similarity index 100% rename from services/gateway/src/controller/product/productController.ts rename to services/gateway/src/controller/product/product.controller.ts diff --git a/services/gateway/src/controller/user/userController.ts b/services/gateway/src/controller/user/user.controller.ts similarity index 100% rename from services/gateway/src/controller/user/userController.ts rename to services/gateway/src/controller/user/user.controller.ts diff --git a/services/gateway/src/server.ts b/services/gateway/src/server.ts index b3e2d635..534739d1 100644 --- a/services/gateway/src/server.ts +++ b/services/gateway/src/server.ts @@ -1,11 +1,11 @@ import {Request, Response} from "express"; -import {userController} from "@gateway/controller/user/userController"; -import {orderController} from "@gateway/controller/order/orderController"; -import {productController} from "@gateway/controller/product/productController"; -import {categoryController} from "@gateway/controller/product/categoryController"; -import {allergenController} from "@gateway/controller/product/allergenController"; -import {deliveryController} from "@gateway/controller/delivery/deliveryController"; -import {deliveryPersonController} from "@gateway/controller/delivery/deliveryPersonController"; +import {userController} from "@gateway/controller/user/user.controller"; +import {orderController} from "@gateway/controller/order/order.controller"; +import {productController} from "@gateway/controller/product/product.controller"; +import {categoryController} from "@gateway/controller/product/category.controller"; +import {allergenController} from "@gateway/controller/product/allergen.controller"; +import {deliveryController} from "@gateway/controller/delivery/delivery.controller"; +import {deliveryPersonController} from "@gateway/controller/delivery/deliveryPerson.controller"; const express = require('express'); const bodyParser = require('body-parser'); From 4f4570edb519f98b6925978ecaf3b5a51cff3aa1 Mon Sep 17 00:00:00 2001 From: anatole Date: Thu, 3 Aug 2023 18:07:19 +0200 Subject: [PATCH 405/883] feat(gateway): create the promotions controller --- .../promotions/promotions.controller.ts | 82 +++++++++++++++++++ services/gateway/src/server.ts | 2 + .../src/services/clients/promotions.client.ts | 7 ++ 3 files changed, 91 insertions(+) create mode 100644 services/gateway/src/controller/promotions/promotions.controller.ts create mode 100644 services/gateway/src/services/clients/promotions.client.ts diff --git a/services/gateway/src/controller/promotions/promotions.controller.ts b/services/gateway/src/controller/promotions/promotions.controller.ts new file mode 100644 index 00000000..e763d90b --- /dev/null +++ b/services/gateway/src/controller/promotions/promotions.controller.ts @@ -0,0 +1,82 @@ +import {Application} from "express"; +import {promotionsServiceClient} from "@gateway/services/clients/promotions.client"; +import {Empty} from "google-protobuf/google/protobuf/empty_pb"; +import {Promotion, PromotionCode, PromotionCreateInput, PromotionId, RestaurantId} from "@gateway/proto/promotions_pb"; + +export const promotionsController = (app: Application) => { + app.get('/api/promotions/:code', (req, res) => { + const {code} = req.params; + promotionsServiceClient.getPromotion(new PromotionCode().setCode(code), (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } + }); + }); + + app.get('/api/promotions', (req, res) => { + promotionsServiceClient.getPromotions(new Empty(), (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } + }); + }); + + app.get('/api/promotions/by-restaurant/:restaurantId', (req, res) => { + const {restaurantId} = req.params; + promotionsServiceClient.getPromotionsByRestaurant(new RestaurantId().setId(restaurantId), (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } + }); + }); + + app.post('/api/promotions', (req, res) => { + const {code, reduction, method, restaurantId} = req.body; + const promotionCreateInput = new PromotionCreateInput().setCode(code) + .setReduction(reduction) + .setMethod(method) + .setRestaurantId(restaurantId); + promotionsServiceClient.createPromotion(promotionCreateInput, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } + }); + }); + + app.put('/api/promotions/:id', (req, res) => { + const {id} = req.params; + const {code, reduction, method, restaurantId} = req.body; + const promotionUpdateInput = new Promotion().setId(id).setCode(code) + .setReduction(reduction) + .setMethod(method) + .setRestaurantId(restaurantId); + + promotionsServiceClient.createPromotion(promotionUpdateInput, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } + }); + }); + + app.delete('/api/promotions/:id', (req, res) => { + const {id} = req.params; + + promotionsServiceClient.deletePromotion(new PromotionId().setId(id), (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } + }); + }); +}; \ No newline at end of file diff --git a/services/gateway/src/server.ts b/services/gateway/src/server.ts index 534739d1..43acc000 100644 --- a/services/gateway/src/server.ts +++ b/services/gateway/src/server.ts @@ -6,6 +6,7 @@ import {categoryController} from "@gateway/controller/product/category.controlle import {allergenController} from "@gateway/controller/product/allergen.controller"; import {deliveryController} from "@gateway/controller/delivery/delivery.controller"; import {deliveryPersonController} from "@gateway/controller/delivery/deliveryPerson.controller"; +import {promotionsController} from "@gateway/controller/promotions/promotions.controller"; const express = require('express'); const bodyParser = require('body-parser'); @@ -26,6 +27,7 @@ allergenController(app); productController(app); deliveryController(app); deliveryPersonController(app); +promotionsController(app); app.listen(PORT, () => { console.log(`API Gateway is running on port ${PORT}`); diff --git a/services/gateway/src/services/clients/promotions.client.ts b/services/gateway/src/services/clients/promotions.client.ts new file mode 100644 index 00000000..063781eb --- /dev/null +++ b/services/gateway/src/services/clients/promotions.client.ts @@ -0,0 +1,7 @@ +import services from '../../proto/promotions_grpc_pb'; +import * as grpc from "grpc"; + +// TODO: add promotions env +export const promotionsServiceClient = new services.PromotionServiceClient( + 'http://localhost:50007', + grpc.credentials.createInsecure()); \ No newline at end of file From f3e95b87a2a3eb775e565374fd8ff8af53cb917e Mon Sep 17 00:00:00 2001 From: anatole Date: Fri, 11 Aug 2023 15:59:00 +0200 Subject: [PATCH 406/883] feat(gateway): create the stocks controllers --- .../src/controller/stock/stock.controller.ts | 386 ++++++++++++++++++ .../stock/stockPerson.controller.ts | 20 + .../src/services/clients/stock.client.ts | 11 + 3 files changed, 417 insertions(+) create mode 100644 services/gateway/src/controller/stock/stock.controller.ts create mode 100644 services/gateway/src/controller/stock/stockPerson.controller.ts create mode 100644 services/gateway/src/services/clients/stock.client.ts diff --git a/services/gateway/src/controller/stock/stock.controller.ts b/services/gateway/src/controller/stock/stock.controller.ts new file mode 100644 index 00000000..2743f2ca --- /dev/null +++ b/services/gateway/src/controller/stock/stock.controller.ts @@ -0,0 +1,386 @@ +import express, {Request, Response} from 'express'; +import {stockServiceClient} from '../../services/clients/stock.client'; +import { + CreateIngredientRequest, + CreateIngredientRestaurantRequest, + CreateSupplierRequest, + CreateSupplyOrderRequest, + DeleteIngredientRequest, + DeleteIngredientRestaurantRequest, + DeleteSupplierRequest, + DeleteSupplyOrderRequest, + GetIngredientRequest, + GetIngredientRestaurantRequest, + GetIngredientRestaurantsByProductRequest, + GetIngredientRestaurantsByRestaurantRequest, + GetSupplierRequest, + GetSupplyOrderRequest, + GetSupplyOrdersByIngredientRestaurantRequest, + GetSupplyOrdersByRestaurantRequest, + GetSupplyOrdersBySupplierRequest, + UpdateIngredientRequest, + UpdateIngredientRestaurantRequest, + UpdateSupplierRequest, + UpdateSupplyOrderRequest +} from "@gateway/proto/stock_pb"; +import {Empty} from "google-protobuf/google/protobuf/empty_pb"; + + +export const stockController = (app: express.Application) => { + /** + * Ingredient Routes + */ + + app.get('/api/stock/supplier/:id', (req: Request, res: Response) => { + const {id} = req.params; + const supplierRequest = new GetSupplierRequest().setId(Number(id)); + + stockServiceClient.getSupplier(supplierRequest, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } + }); + }); + + app.get('/api/stock/supplier', (req: Request, res: Response) => { + + stockServiceClient.getSuppliers(new Empty(), (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } + }); + }); + + app.get('/api/stock/ingredient/:id', (req: Request, res: Response) => { + const {id} = req.params; + const ingredientRequest = new GetIngredientRequest().setId(Number(id)); + + stockServiceClient.getIngredient(ingredientRequest, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } + }); + }); + + app.get('/api/stock/ingredient', (req: Request, res: Response) => { + + stockServiceClient.getIngredients(new Empty(), (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } + }); + }); + + app.post('/api/stock/ingredient', (req: Request, res: Response) => { + const {name, desciption} = req.body + const ingredientRequest = new CreateIngredientRequest().setName(name).setDescription(desciption) + + stockServiceClient.createIngredient(ingredientRequest, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } + }); + }); + + app.put('/api/stock/ingredient/:id', (req: Request, res: Response) => { + const {id} = req.params + const {name, desciption} = req.body + const ingredientRequest = new UpdateIngredientRequest().setId(Number(id)).setName(name).setDescription(desciption) + + stockServiceClient.updateIngredient(ingredientRequest, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } + }); + }); + + app.delete('/api/stock/ingredient/:id', (req: Request, res: Response) => { + const {id} = req.params + const ingredientRequest = new DeleteIngredientRequest().setId(Number(id)); + + stockServiceClient.deleteIngredient(ingredientRequest, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } + }); + }); + + app.delete('/api/stock/ingredient/:id', (req: Request, res: Response) => { + const {id} = req.params + const ingredientRequest = new DeleteIngredientRequest().setId(Number(id)); + + stockServiceClient.deleteIngredient(ingredientRequest, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } + }); + }); + + /** + * Ingredient Restaurant Routes + */ + + app.get('/api/stock/ingredient/restaurant/:id', (req: Request, res: Response) => { + const {id} = req.params; + const ingredientRestaurantRequest = new GetIngredientRestaurantRequest().setId(Number(id)); + + stockServiceClient.getIngredientRestaurant(ingredientRestaurantRequest, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } + }); + }); + + app.get('/api/stock/ingredient/restaurant/by-restaurant/:id', (req: Request, res: Response) => { + const {id} = req.params; + const ingredientRestaurantsByRestaurantRequest = new GetIngredientRestaurantsByRestaurantRequest().setRestaurantId(id); + + stockServiceClient.getIngredientRestaurantsByRestaurant(ingredientRestaurantsByRestaurantRequest, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } + }); + }); + + app.get('/api/stock/ingredient/restaurant/by-product/:id', (req: Request, res: Response) => { + const {id} = req.params; + const ingredientRestaurantsByProductRequest = new GetIngredientRestaurantsByProductRequest().setProductId(id); + + stockServiceClient.getIngredientRestaurantsByProduct(ingredientRestaurantsByProductRequest, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } + }); + }); + + app.post('/api/stock/ingredient/restaurant', (req: Request, res: Response) => { + const {alertThreshold, quantity, productList, unitPrice, pricePerKilo, restaurantId, ingredientId} = req.body; + const ingredientRestaurant = new CreateIngredientRestaurantRequest().setAlertThreshold(alertThreshold) + .setQuantity(quantity) + .setInProductListList(productList) + .setUnitPrice(unitPrice) + .setPricePerKilo(pricePerKilo) + .setRestaurantId(restaurantId) + .setIngredientId(ingredientId) + + + stockServiceClient.createIngredientRestaurant(ingredientRestaurant, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } + }); + }); + + app.put('/api/stock/ingredient/restaurant/:id', (req: Request, res: Response) => { + const {id} = req.params; + const {alertThreshold, quantity, productList, unitPrice, pricePerKilo, restaurantId, ingredientId} = req.body; + const ingredientRestaurant = new UpdateIngredientRestaurantRequest().setId(Number(id)).setAlertThreshold(alertThreshold) + .setQuantity(quantity) + .setInProductListList(productList) + .setUnitPrice(unitPrice) + .setPricePerKilo(pricePerKilo) + .setRestaurantId(restaurantId) + .setIngredientId(ingredientId) + + + stockServiceClient.updateIngredientRestaurant(ingredientRestaurant, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } + }); + }); + + app.delete('/api/stock/ingredient/restaurant/:id', (req: Request, res: Response) => { + const {id} = req.params; + + stockServiceClient.deleteIngredientRestaurant(new DeleteIngredientRestaurantRequest().setId(Number(id)), (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } + }); + }); + + /** + * Supplier Routes + */ + + app.get('/api/stock/supplier/:id', (req: Request, res: Response) => { + const {id} = req.params; + + stockServiceClient.getSupplier(new GetSupplierRequest().setId(Number(id)), (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } + }); + }); + + app.get('/api/stock/supplier', (req: Request, res: Response) => { + stockServiceClient.getSuppliers(new Empty(), (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } + }); + }); + + app.post('/api/stock/supplier', (req: Request, res: Response) => { + const {name, contact} = req.body; + const supplierRequest = new CreateSupplierRequest().setName(name).setContact(contact) + + stockServiceClient.createSupplier(supplierRequest, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } + }); + }); + + app.put('/api/stock/supplier/:id', (req: Request, res: Response) => { + const {id} = req.params; + const {name, contact} = req.body; + const supplierRequest = new UpdateSupplierRequest().setId(Number(id)).setName(name).setContact(contact) + + stockServiceClient.updateSupplier(supplierRequest, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } + }); + }); + + app.delete('/api/stock/supplier/:id', (req: Request, res: Response) => { + const {id} = req.params; + + stockServiceClient.deleteSupplier(new DeleteSupplierRequest().setId(Number(id)), (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } + }); + }); + + /** + * Supply Order Routes + */ + + app.get('/api/stock/supply/order/:id', (req: Request, res: Response) => { + const {id} = req.params; + + stockServiceClient.getSupplyOrder(new GetSupplyOrderRequest().setId(Number(id)), (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } + }); + }); + + app.get('/api/stock/supply/order/by-restaurant/:id', (req: Request, res: Response) => { + const {id} = req.params; + stockServiceClient.getSupplyOrdersByRestaurant(new GetSupplyOrdersByRestaurantRequest().setRestaurantId(id), (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } + }); + }); + + app.get('/api/stock/supply/order/by-supplier/:id', (req: Request, res: Response) => { + const {id} = req.params; + stockServiceClient.getSupplyOrdersBySupplier(new GetSupplyOrdersBySupplierRequest().setSupplierId(Number(id)), (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } + }); + }); + + app.get('/api/stock/supply/order/by-ingredient-restaurant/:id', (req: Request, res: Response) => { + const {id} = req.params; + stockServiceClient.getSupplyOrdersByIngredientRestaurant(new GetSupplyOrdersByIngredientRestaurantRequest().setIngredientRestaurantId(Number(id)), (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } + }); + }); + + app.post('/api/stock/supply/order', (req: Request, res: Response) => { + const {quantity, ingredientRestaurantId, supplierId} = req.body; + const supplyOrderRequest = new CreateSupplyOrderRequest().setQuantity(quantity) + .setIngredientRestaurantId(ingredientRestaurantId) + .setSupplierId(supplierId); + + stockServiceClient.createSupplyOrder(supplyOrderRequest, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } + }); + }); + + app.put('/api/stock/supply/order/:id', (req: Request, res: Response) => { + const {id} = req.params; + const {quantity, ingredientRestaurantId, supplierId} = req.body; + const supplyOrderRequest = new UpdateSupplyOrderRequest().setId(Number(id)).setQuantity(quantity) + .setIngredientRestaurantId(ingredientRestaurantId) + .setSupplierId(supplierId); + + stockServiceClient.updateSupplyOrder(supplyOrderRequest, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } + }); + }); + + app.delete('/api/stock/supply/order/:id', (req: Request, res: Response) => { + const {id} = req.params; + stockServiceClient.deleteSupplyOrder(new DeleteSupplyOrderRequest().setId(Number(id)), (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } + }); + }); +} \ No newline at end of file diff --git a/services/gateway/src/controller/stock/stockPerson.controller.ts b/services/gateway/src/controller/stock/stockPerson.controller.ts new file mode 100644 index 00000000..56d3f931 --- /dev/null +++ b/services/gateway/src/controller/stock/stockPerson.controller.ts @@ -0,0 +1,20 @@ +import {stockPersonServiceClient} from "@gateway/services/clients/stock.client"; +import {Application, Request, Response} from "express"; +import {GetOutcomesByRestaurantRequest} from "@gateway/proto/stock_pb"; + + +export const stockPersonController = (app: Application) => { + app.post('/api/stock/outcomes/by-restaurant/:id', (req: Request, res: Response) => { + const {id} = req.params; + const {date, interval} = req.body; + const outcomesByRestaurantRequest = new GetOutcomesByRestaurantRequest().setRestaurantId(id).setDate(date).setInterval(interval); + + stockPersonServiceClient.getOutcomesByRestaurant(outcomesByRestaurantRequest, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } + }); + }); +} \ No newline at end of file diff --git a/services/gateway/src/services/clients/stock.client.ts b/services/gateway/src/services/clients/stock.client.ts new file mode 100644 index 00000000..6e59e8b6 --- /dev/null +++ b/services/gateway/src/services/clients/stock.client.ts @@ -0,0 +1,11 @@ +import services from '../../proto/stock_grpc_pb'; +import * as grpc from "grpc"; + +// TODO: add stock env +export const stockServiceClient = new services.StockServiceClient( + 'http://localhost:50007', + grpc.credentials.createInsecure()); + +export const stockPersonServiceClient = new services.StockReportingServiceClient( + 'http://localhost:50007', + grpc.credentials.createInsecure()); \ No newline at end of file From 3e9571e792e4469f44c455ca78f5bd88a5717486 Mon Sep 17 00:00:00 2001 From: anatole Date: Fri, 11 Aug 2023 16:17:09 +0200 Subject: [PATCH 407/883] feat(gateway): replace controller methods by the express router --- .../delivery/delivery.controller.ts | 144 ++-- .../delivery/deliveryPerson.controller.ts | 140 ++-- .../src/controller/log/log.controller.ts | 40 +- .../controller/metric/metric.controller.ts | 46 +- .../src/controller/order/order.controller.ts | 218 +++--- .../controller/product/allergen.controller.ts | 102 +-- .../controller/product/category.controller.ts | 102 +-- .../controller/product/product.controller.ts | 264 ++++---- .../promotions/promotions.controller.ts | 130 ++-- .../src/controller/stock/stock.controller.ts | 633 +++++++++--------- .../stock/stockPerson.controller.ts | 27 +- .../src/controller/user/user.controller.ts | 325 +++++---- services/gateway/src/server.ts | 45 +- services/gateway/src/utils/swagger.utils.js | 10 +- 14 files changed, 1125 insertions(+), 1101 deletions(-) diff --git a/services/gateway/src/controller/delivery/delivery.controller.ts b/services/gateway/src/controller/delivery/delivery.controller.ts index e5d90308..8be781d9 100644 --- a/services/gateway/src/controller/delivery/delivery.controller.ts +++ b/services/gateway/src/controller/delivery/delivery.controller.ts @@ -1,92 +1,92 @@ -import {Application, Request, Response} from "express"; +import {Request, Response, Router} from "express"; import {deliveryServiceClient} from "@gateway/services/clients/delivery.client"; import {Delivery, DeliveryCreateInput, DeliveryId, RestaurantId, UserId} from "@gateway/proto/delivery_pb"; -export const deliveryController = (app: Application) => { - app.get('/api/delivery/:id', (req: Request, res: Response) => { - const {id} = req.params; +export const deliveryRoutes = Router(); - deliveryServiceClient.getDelivery(new DeliveryId().setId(id), (error, response) => { - if (error) { - res.json({error: error.message}); - } else { - res.json(response.toObject()); - } - }); +deliveryRoutes.get('/api/delivery/:id', (req: Request, res: Response) => { + const {id} = req.params; + + deliveryServiceClient.getDelivery(new DeliveryId().setId(id), (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } }); +}); - app.get('/api/delivery/by-restaurant/:id', (req: Request, res: Response) => { - const {id} = req.params; - const restaurantId = new RestaurantId().setId(id); +deliveryRoutes.get('/api/delivery/by-restaurant/:id', (req: Request, res: Response) => { + const {id} = req.params; + const restaurantId = new RestaurantId().setId(id); - deliveryServiceClient.listDeliveriesByRestaurant(restaurantId, (error, response) => { - if (error) { - res.json({error: error.message}); - } else { - res.json(response.toObject()); - } - }); + deliveryServiceClient.listDeliveriesByRestaurant(restaurantId, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } }); +}); - app.get('/api/delivery/by-user/:id', (req: Request, res: Response) => { - const {id} = req.params; - const userId = new UserId().setId(id); +deliveryRoutes.get('/api/delivery/by-user/:id', (req: Request, res: Response) => { + const {id} = req.params; + const userId = new UserId().setId(id); - deliveryServiceClient.listDeliveriesByUser(userId, (error, response) => { - if (error) { - res.json({error: error.message}); - } else { - res.json(response.toObject()); - } - }); + deliveryServiceClient.listDeliveriesByUser(userId, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } }); +}); - app.post('/api/delivery', (req: Request, res: Response) => { - const {eta, address, status, deliveryPersonId, userId, restaurantId} = req.body; - const deliveryCreateInput = new DeliveryCreateInput().setEta(eta) - .setAddress(address) - .setStatus(status) - .setDeliveryPersonId(deliveryPersonId) - .setUserId(userId) - .setRestaurantId(restaurantId); +deliveryRoutes.post('/api/delivery', (req: Request, res: Response) => { + const {eta, address, status, deliveryPersonId, userId, restaurantId} = req.body; + const deliveryCreateInput = new DeliveryCreateInput().setEta(eta) + .setAddress(address) + .setStatus(status) + .setDeliveryPersonId(deliveryPersonId) + .setUserId(userId) + .setRestaurantId(restaurantId); - deliveryServiceClient.createDelivery(deliveryCreateInput, (error, response) => { - if (error) { - res.json({error: error.message}); - } else { - res.json(response.toObject()); - } - }); + deliveryServiceClient.createDelivery(deliveryCreateInput, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } }); +}); - app.put('/api/delivery/:id', (req: Request, res: Response) => { - const {id} = req.params; - const {eta, address, status, deliveryPersonId, userId, restaurantId} = req.body; - const delivery = new Delivery().setId(id).setEta(eta) - .setAddress(address) - .setStatus(status) - .setDeliveryPersonId(deliveryPersonId) - .setUserId(userId) - .setRestaurantId(restaurantId); +deliveryRoutes.put('/api/delivery/:id', (req: Request, res: Response) => { + const {id} = req.params; + const {eta, address, status, deliveryPersonId, userId, restaurantId} = req.body; + const delivery = new Delivery().setId(id).setEta(eta) + .setAddress(address) + .setStatus(status) + .setDeliveryPersonId(deliveryPersonId) + .setUserId(userId) + .setRestaurantId(restaurantId); - deliveryServiceClient.updateDelivery(delivery, (error, response) => { - if (error) { - res.json({error: error.message}); - } else { - res.json(response.toObject()); - } - }); + deliveryServiceClient.updateDelivery(delivery, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } }); +}); - app.delete('/api/delivery/:id', (req: Request, res: Response) => { - const {id} = req.params; +deliveryRoutes.delete('/api/delivery/:id', (req: Request, res: Response) => { + const {id} = req.params; - deliveryServiceClient.deleteDelivery(new DeliveryId().setId(id), (error, response) => { - if (error) { - res.json({error: error.message}); - } else { - res.json(response.toObject()); - } - }); + deliveryServiceClient.deleteDelivery(new DeliveryId().setId(id), (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } }); -} \ No newline at end of file +}); \ No newline at end of file diff --git a/services/gateway/src/controller/delivery/deliveryPerson.controller.ts b/services/gateway/src/controller/delivery/deliveryPerson.controller.ts index 8ab0c64f..6daf58ae 100644 --- a/services/gateway/src/controller/delivery/deliveryPerson.controller.ts +++ b/services/gateway/src/controller/delivery/deliveryPerson.controller.ts @@ -1,88 +1,88 @@ -import {Application} from "express"; +import {Router} from "express"; import {deliveryPersonServiceClient} from "@gateway/services/clients/delivery.client"; import {DeliveryPerson, DeliveryPersonCreateInput, DeliveryPersonId, Location} from "@gateway/proto/delivery_pb"; import {Empty} from "google-protobuf/google/protobuf/empty_pb"; -export const deliveryPersonController = (app: Application) => { - app.get('/api/delivery-person/:id', (req, res) => { - const {id} = req.params; +export const deliveryPersonRoutes = Router(); - deliveryPersonServiceClient.getDeliveryPerson(new DeliveryPersonId().setId(id), (error, response) => { - if (error) { - res.json({error: error.message}); - } else { - res.json(response.toObject()); - } - }); +deliveryPersonRoutes.get('/api/delivery-person/:id', (req, res) => { + const {id} = req.params; + + deliveryPersonServiceClient.getDeliveryPerson(new DeliveryPersonId().setId(id), (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } }); +}); - app.get('/api/delivery-person', (req, res) => { - deliveryPersonServiceClient.listDeliveryPersons(new Empty(), (error, response) => { - if (error) { - res.json({error: error.message}); - } else { - res.json(response.toObject()); - } - }); +deliveryPersonRoutes.get('/api/delivery-person', (req, res) => { + deliveryPersonServiceClient.listDeliveryPersons(new Empty(), (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } }); +}); - app.post('/api/delivery-person', (req, res) => { - const {lat, lng} = req.body; - const location = new Location() - .setLatitude(lat) - .setLongitude(lng); - deliveryPersonServiceClient.listNearDeliveryPersons(location, (error, response) => { - if (error) { - res.json({error: error.message}); - } else { - res.json(response.toObject()); - } - }); +deliveryPersonRoutes.post('/api/delivery-person', (req, res) => { + const {lat, lng} = req.body; + const location = new Location() + .setLatitude(lat) + .setLongitude(lng); + deliveryPersonServiceClient.listNearDeliveryPersons(location, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } }); +}); - app.post('/api/delivery-person', (req, res) => { - const {firstName, lastName, phone, locationList} = req.body; - const deliveryPerson = new DeliveryPersonCreateInput() - .setFirstName(firstName) - .setLastName(lastName) - .setPhone(phone) - .setLocationList(locationList); - deliveryPersonServiceClient.createDeliveryPerson(deliveryPerson, (error, response) => { - if (error) { - res.json({error: error.message}); - } else { - res.json(response.toObject()); - } - }); +deliveryPersonRoutes.post('/api/delivery-person', (req, res) => { + const {firstName, lastName, phone, locationList} = req.body; + const deliveryPerson = new DeliveryPersonCreateInput() + .setFirstName(firstName) + .setLastName(lastName) + .setPhone(phone) + .setLocationList(locationList); + deliveryPersonServiceClient.createDeliveryPerson(deliveryPerson, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } }); +}); - app.put('/api/delivery-person/:id', (req, res) => { - const {id} = req.params; - const {firstName, lastName, phone, locationList} = req.body; - const deliveryPerson = new DeliveryPerson().setId(id) - .setFirstName(firstName) - .setLastName(lastName) - .setPhone(phone) - .setLocationList(locationList); +deliveryPersonRoutes.put('/api/delivery-person/:id', (req, res) => { + const {id} = req.params; + const {firstName, lastName, phone, locationList} = req.body; + const deliveryPerson = new DeliveryPerson().setId(id) + .setFirstName(firstName) + .setLastName(lastName) + .setPhone(phone) + .setLocationList(locationList); - deliveryPersonServiceClient.updateDeliveryPerson(deliveryPerson, (error, response) => { - if (error) { - res.json({error: error.message}); - } else { - res.json(response.toObject()); - } - }); + deliveryPersonServiceClient.updateDeliveryPerson(deliveryPerson, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } }); +}); - app.delete('/api/delivery-person/:id', (req, res) => { - const {id} = req.params; +deliveryPersonRoutes.delete('/api/delivery-person/:id', (req, res) => { + const {id} = req.params; - deliveryPersonServiceClient.deleteDeliveryPerson(new DeliveryPersonId().setId(id), (error, response) => { - if (error) { - res.json({error: error.message}); - } else { - res.json(response.toObject()); - } - }); + deliveryPersonServiceClient.deleteDeliveryPerson(new DeliveryPersonId().setId(id), (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } }); -} \ No newline at end of file +}); \ No newline at end of file diff --git a/services/gateway/src/controller/log/log.controller.ts b/services/gateway/src/controller/log/log.controller.ts index c9faf8d2..46df363f 100644 --- a/services/gateway/src/controller/log/log.controller.ts +++ b/services/gateway/src/controller/log/log.controller.ts @@ -1,29 +1,29 @@ -import express from "express"; +import express, {Router} from "express"; import {logServiceClient} from "@gateway/services/clients/log.client"; import {Empty} from "google-protobuf/google/protobuf/empty_pb"; import {GetLogRequest} from "@gateway/proto/log_pb"; -const logController = (app: express.Application) => { - app.get('/api/log', (req: express.Request, res: express.Response) => { +export const logRoutes = Router(); - logServiceClient.listLog(new Empty(), (error, response) => { - if (error) { - res.json({error: error.message}); - } else { - res.json(response.toObject()); - } - }); +logRoutes.get('/api/log', (req: express.Request, res: express.Response) => { + + logServiceClient.listLog(new Empty(), (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } }); +}); - app.get('/api/log/:id', (req: express.Request, res: express.Response) => { - const {id} = req.params +logRoutes.get('/api/log/:id', (req: express.Request, res: express.Response) => { + const {id} = req.params - logServiceClient.getLog(new GetLogRequest().setId(Number(id)), (error, response) => { - if (error) { - res.json({error: error.message}); - } else { - res.json(response.toObject()); - } - }); + logServiceClient.getLog(new GetLogRequest().setId(Number(id)), (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } }); -}; \ No newline at end of file +}); \ No newline at end of file diff --git a/services/gateway/src/controller/metric/metric.controller.ts b/services/gateway/src/controller/metric/metric.controller.ts index 339d4955..c983b96d 100644 --- a/services/gateway/src/controller/metric/metric.controller.ts +++ b/services/gateway/src/controller/metric/metric.controller.ts @@ -1,32 +1,32 @@ import metricService from '../../services/clients/metric.client'; -import express from "express"; +import {Router} from "express"; import {GetMetricRequest, Metric} from "@gateway/proto/metric_pb"; -export const metricController = (app: express.Application) => { - app.get('/api/metric/:key', (req, res) => { - const {key} = req.params; - const metricInput = new GetMetricRequest().setKey(key); - metricService.getMetric(metricInput, (error, response) => { - if (error) { - res.json({error: error.message}); - } else { - res.json(response.toObject()); - } - }); +export const metricRoutes = Router(); + +metricRoutes.get('/api/metric/:key', (req, res) => { + const {key} = req.params; + const metricInput = new GetMetricRequest().setKey(key); + metricService.getMetric(metricInput, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } }); +}); - app.post('/api/metric', (req, res) => { - const {restaurantId, code, value, key} = req.body - const newMetric = new Metric().setKey(key).setRestaurantId(restaurantId).setCode(code).setValue(value) +metricRoutes.post('/api/metric', (req, res) => { + const {restaurantId, code, value, key} = req.body + const newMetric = new Metric().setKey(key).setRestaurantId(restaurantId).setCode(code).setValue(value) - metricService.pushMetric(newMetric, (error, response) => { - if (error) { - res.json({error: error.message}); - } else { - res.json(response.toObject()); - } - }); + metricService.pushMetric(newMetric, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } }); -} +}); diff --git a/services/gateway/src/controller/order/order.controller.ts b/services/gateway/src/controller/order/order.controller.ts index 1ca0d4c2..3a822e6b 100644 --- a/services/gateway/src/controller/order/order.controller.ts +++ b/services/gateway/src/controller/order/order.controller.ts @@ -1,5 +1,5 @@ import orderService from '../../services/clients/order.client'; -import express, {Request, Response} from "express"; +import {Request, Response, Router} from "express"; import { CreateOrderRequest, DeleteOrderRequest, @@ -14,132 +14,132 @@ import { import {getUser} from "@gateway/services/user.service"; import {User} from "@gateway/proto/user_pb"; -export const orderController = (app: express.Application) => { - app.get('/api/order/:id', (req: Request, res: Response) => { - const {id} = req.params; - const orderId = new GetOrderRequest(); - orderId.setId(id); +export const orderRoutes = Router(); - orderService.getOrder(orderId, (error, response) => { - if (error) { - res.json({error: error.message}); - } else { - res.json(response.toObject()); - } - }); - }); +orderRoutes.get('/api/order/:id', (req: Request, res: Response) => { + const {id} = req.params; + const orderId = new GetOrderRequest(); + orderId.setId(id); - app.post('/api/order', (req: Request, res: Response) => { - const body = req.body; - let user: User | undefined = undefined; - try { - user = getUser(Number(req.body.userId)); - } catch (e: any) { - res.json({error: e.message}); + orderService.getOrder(orderId, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); } + }); +}); - if (!user) { - res.json({error: "User not found"}); - return; - } +orderRoutes.post('/api/order', (req: Request, res: Response) => { + const body = req.body; + let user: User | undefined = undefined; + try { + user = getUser(Number(req.body.userId)); + } catch (e: any) { + res.json({error: e.message}); + } - const miniUser = new UserMinimum().setId(String(user.getId())) - .setEmail(user.getEmail()) - .setFirstName(user.getFirstName()) - .setLastName(user.getLastName()) - .setPhone(user.getPhone()); + if (!user) { + res.json({error: "User not found"}); + return; + } - let orderInput = new CreateOrderRequest() - .setUser(miniUser) - .setPaymentId(body.paymentId) - .setDeliveryId(body.deliveryId) - .setDeliveryType(body.deliveryType) - .setBasketSnapshot(body.basketSnapshot) - .setRestaurantId(body.restaurantId); + const miniUser = new UserMinimum().setId(String(user.getId())) + .setEmail(user.getEmail()) + .setFirstName(user.getFirstName()) + .setLastName(user.getLastName()) + .setPhone(user.getPhone()); - orderService.createOrder(orderInput, (error, response) => { - if (error) { - res.json({error: error.message}); - } else { - res.json(response.toObject()); - } - }); + let orderInput = new CreateOrderRequest() + .setUser(miniUser) + .setPaymentId(body.paymentId) + .setDeliveryId(body.deliveryId) + .setDeliveryType(body.deliveryType) + .setBasketSnapshot(body.basketSnapshot) + .setRestaurantId(body.restaurantId); + + orderService.createOrder(orderInput, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } }); +}); - app.get('/api/order/by-user/:userId', (req: Request, res: Response) => { - const {userId} = req.params; - const orderInput = new GetOrdersByUserRequest().setId(userId); - orderService.getOrdersByUser(orderInput, (error, response) => { - if (error) { - res.json({error: error.message}); - } else { - res.json(response.toObject()); - } - }); +orderRoutes.get('/api/order/by-user/:userId', (req: Request, res: Response) => { + const {userId} = req.params; + const orderInput = new GetOrdersByUserRequest().setId(userId); + orderService.getOrdersByUser(orderInput, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } }); +}); - app.post('/api/order/by-status', (req: Request, res: Response) => { - const orderInput = new GetOrdersByStatusRequest().setStatus(req.body.status); +orderRoutes.post('/api/order/by-status', (req: Request, res: Response) => { + const orderInput = new GetOrdersByStatusRequest().setStatus(req.body.status); - orderService.getOrdersByStatus(orderInput, (error, response) => { - if (error) { - res.json({error: error.message}); - } else { - res.json(response.toObject()); - } - }); + orderService.getOrdersByStatus(orderInput, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } }); +}); - app.get('/api/order/by-delivery/:deliveryId', (req: Request, res: Response) => { - const {deliveryId} = req.params; - const orderInput = new GetOrderByDeliveryRequest().setId(deliveryId); - orderService.getOrderByDelivery(orderInput, (error, response) => { - if (error) { - res.json({error: error.message}); - } else { - res.json(response.toObject()); - } - }); +orderRoutes.get('/api/order/by-delivery/:deliveryId', (req: Request, res: Response) => { + const {deliveryId} = req.params; + const orderInput = new GetOrderByDeliveryRequest().setId(deliveryId); + orderService.getOrderByDelivery(orderInput, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } }); +}); - app.get('/api/order/by-payment/:paymentId', (req: Request, res: Response) => { - const {paymentId} = req.params; - const orderInput = new GetOrderByPaymentRequest().setId(paymentId); - orderService.getOrderByPayment(orderInput, (error, response) => { - if (error) { - res.json({error: error.message}); - } else { - res.json(response.toObject()); - } - }); +orderRoutes.get('/api/order/by-payment/:paymentId', (req: Request, res: Response) => { + const {paymentId} = req.params; + const orderInput = new GetOrderByPaymentRequest().setId(paymentId); + orderService.getOrderByPayment(orderInput, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } }); +}); - app.put('/api/order/:orderId', (req: Request, res: Response) => { - const {orderId} = req.params; - const orderInput = new UpdateOrderRequest() - .setId(orderId) - .setStatus(req.body.status) - .setDeliveryId(req.body.deliveryId) - .setPaymentId(req.body.paymentId) - .setRestaurantId(req.body.restaurantId); - orderService.updateOrder(orderInput, (error, response) => { - if (error) { - res.json({error: error.message}); - } else { - res.json(response.toObject()); - } - }); +orderRoutes.put('/api/order/:orderId', (req: Request, res: Response) => { + const {orderId} = req.params; + const orderInput = new UpdateOrderRequest() + .setId(orderId) + .setStatus(req.body.status) + .setDeliveryId(req.body.deliveryId) + .setPaymentId(req.body.paymentId) + .setRestaurantId(req.body.restaurantId); + orderService.updateOrder(orderInput, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } }); +}); - app.delete('/api/order/:orderId', (req: Request, res: Response) => { - const {orderId} = req.params; - const orderInput = new DeleteOrderRequest().setId(orderId); - orderService.deleteOrder(orderInput, (error, response) => { - if (error) { - res.json({error: error.message}); - } else { - res.json(response.toObject()); - } - }); +orderRoutes.delete('/api/order/:orderId', (req: Request, res: Response) => { + const {orderId} = req.params; + const orderInput = new DeleteOrderRequest().setId(orderId); + orderService.deleteOrder(orderInput, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } }); -} \ No newline at end of file +}); \ No newline at end of file diff --git a/services/gateway/src/controller/product/allergen.controller.ts b/services/gateway/src/controller/product/allergen.controller.ts index 7511087d..55d7770d 100644 --- a/services/gateway/src/controller/product/allergen.controller.ts +++ b/services/gateway/src/controller/product/allergen.controller.ts @@ -1,65 +1,65 @@ -import express, {Request, Response} from 'express'; +import {Request, Response, Router} from 'express'; import {allergenServiceClient} from '../../services/clients/product.client'; import {Empty} from "google-protobuf/google/protobuf/empty_pb"; import {Allergen, AllergenId} from "@gateway/proto/product_pb"; -export const allergenController = (app: express.Application) => { - app.get('/api/allergen', (req: Request, res: Response) => { - allergenServiceClient.getAllergenList(new Empty(), (error, response) => { - if (error) { - res.json({error: error.message}); - } else { - res.json(response.toObject()); - } - }); +export const allergenRoutes = Router(); + +allergenRoutes.get('/api/allergen', (req: Request, res: Response) => { + allergenServiceClient.getAllergenList(new Empty(), (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } }); +}); - app.get('/api/allergen/:id', (req: Request, res: Response) => { - const {id} = req.params; - const allergenId = new AllergenId().setId(id) +allergenRoutes.get('/api/allergen/:id', (req: Request, res: Response) => { + const {id} = req.params; + const allergenId = new AllergenId().setId(id) - allergenServiceClient.readAllergen(allergenId, (error, response) => { - if (error) { - res.json({error: error.message}); - } else { - res.json(response.toObject()); - } - }); + allergenServiceClient.readAllergen(allergenId, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } }); +}); - app.post('/api/allergen', (req: Request, res: Response) => { - const {label} = req.body; - const allergen = new Allergen().setLibelle(label); - allergenServiceClient.createAllergen(allergen, (error, response) => { - if (error) { - res.json({error: error.message}); - } else { - res.json(response.toObject()); - } - }); +allergenRoutes.post('/api/allergen', (req: Request, res: Response) => { + const {label} = req.body; + const allergen = new Allergen().setLibelle(label); + allergenServiceClient.createAllergen(allergen, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } }); +}); - app.put('/api/allergen/:id', (req: Request, res: Response) => { - const {id} = req.params; - const {label, icon, hexaColor} = req.body; - const allergen = new Allergen().setId(id).setLibelle(label); - allergenServiceClient.updateAllergen(allergen, (error, response) => { - if (error) { - res.json({error: error.message}); - } else { - res.json(response.toObject()); - } - }); +allergenRoutes.put('/api/allergen/:id', (req: Request, res: Response) => { + const {id} = req.params; + const {label} = req.body; + const allergen = new Allergen().setId(id).setLibelle(label); + allergenServiceClient.updateAllergen(allergen, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } }); +}); - app.delete('/api/allergen/:id', (req: Request, res: Response) => { - const {id} = req.params; - allergenServiceClient.deleteAllergen(new AllergenId().setId(id), (error, response) => { - if (error) { - res.json({error: error.message}); - } else { - res.json(response.toObject()); - } - }); +allergenRoutes.delete('/api/allergen/:id', (req: Request, res: Response) => { + const {id} = req.params; + allergenServiceClient.deleteAllergen(new AllergenId().setId(id), (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } }); -} \ No newline at end of file +}); \ No newline at end of file diff --git a/services/gateway/src/controller/product/category.controller.ts b/services/gateway/src/controller/product/category.controller.ts index d7a0271c..dd9f9124 100644 --- a/services/gateway/src/controller/product/category.controller.ts +++ b/services/gateway/src/controller/product/category.controller.ts @@ -1,65 +1,65 @@ -import express, {Request, Response} from 'express'; +import {Request, Response, Router} from 'express'; import {categoryServiceClient} from '../../services/clients/product.client'; import {Empty} from "google-protobuf/google/protobuf/empty_pb"; import {Category, CategoryId} from "@gateway/proto/product_pb"; -export const categoryController = (app: express.Application) => { - app.get('/api/category', (req: Request, res: Response) => { - categoryServiceClient.getCategoryList(new Empty(), (error, response) => { - if (error) { - res.json({error: error.message}); - } else { - res.json(response.toObject()); - } - }); +export const categoryRoutes = Router(); + +categoryRoutes.get('/api/category', (req: Request, res: Response) => { + categoryServiceClient.getCategoryList(new Empty(), (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } }); +}); - app.get('/api/category/:id', (req: Request, res: Response) => { - const {id} = req.params; - const categoryId = new CategoryId().setId(id) +categoryRoutes.get('/api/category/:id', (req: Request, res: Response) => { + const {id} = req.params; + const categoryId = new CategoryId().setId(id) - categoryServiceClient.readCategory(categoryId, (error, response) => { - if (error) { - res.json({error: error.message}); - } else { - res.json(response.toObject()); - } - }); + categoryServiceClient.readCategory(categoryId, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } }); +}); - app.post('/api/category', (req: Request, res: Response) => { - const {label, icon, hexaColor} = req.body; - const category = new Category().setLibelle(label).setIcon(icon).setHexaColor(hexaColor) - categoryServiceClient.createCategory(category, (error, response) => { - if (error) { - res.json({error: error.message}); - } else { - res.json(response.toObject()); - } - }); +categoryRoutes.post('/api/category', (req: Request, res: Response) => { + const {label, icon, hexaColor} = req.body; + const category = new Category().setLibelle(label).setIcon(icon).setHexaColor(hexaColor) + categoryServiceClient.createCategory(category, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } }); +}); - app.put('/api/category/:id', (req: Request, res: Response) => { - const {id} = req.params; - const {label, icon, hexaColor} = req.body; - const category = new Category().setId(id).setLibelle(label).setIcon(icon).setHexaColor(hexaColor) - categoryServiceClient.updateCategory(category, (error, response) => { - if (error) { - res.json({error: error.message}); - } else { - res.json(response.toObject()); - } - }); +categoryRoutes.put('/api/category/:id', (req: Request, res: Response) => { + const {id} = req.params; + const {label, icon, hexaColor} = req.body; + const category = new Category().setId(id).setLibelle(label).setIcon(icon).setHexaColor(hexaColor) + categoryServiceClient.updateCategory(category, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } }); +}); - app.delete('/api/category/:id', (req: Request, res: Response) => { - const {id} = req.params; - categoryServiceClient.deleteCategory(new CategoryId().setId(id), (error, response) => { - if (error) { - res.json({error: error.message}); - } else { - res.json(response.toObject()); - } - }); +categoryRoutes.delete('/api/category/:id', (req: Request, res: Response) => { + const {id} = req.params; + categoryServiceClient.deleteCategory(new CategoryId().setId(id), (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } }); -} \ No newline at end of file +}); \ No newline at end of file diff --git a/services/gateway/src/controller/product/product.controller.ts b/services/gateway/src/controller/product/product.controller.ts index 818a1057..4e91d2e8 100644 --- a/services/gateway/src/controller/product/product.controller.ts +++ b/services/gateway/src/controller/product/product.controller.ts @@ -1,131 +1,157 @@ -import express, {Request, Response} from 'express'; +import {Request, Response, Router} from 'express'; import {productServiceClient} from '../../services/clients/product.client'; import {Allergen, Category, File, Product, ProductId, RestaurantId} from '../../proto/product_pb'; import {Empty} from "google-protobuf/google/protobuf/empty_pb"; import * as fs from "fs"; -export const productController = (app: express.Application) => { - app.get('/api/product/by-restaurant/:id', (req: Request, res: Response) => { - const {id} = req.params; - const restaurantId = new RestaurantId().setId(id) - - productServiceClient.getProductList(restaurantId, (error, response) => { - if (error) { - res.json({error: error.message}); - } else { - res.json(response.toObject()); - } - }); - }); +export const productRoutes = Router(); - app.get('/api/product/:id', (req: Request, res: Response) => { - const {id} = req.params; - const productId = new ProductId().setId(id) - - productServiceClient.readProduct(productId, (error, response) => { - if (error) { - res.json({error: error.message}); - } else { - res.json(response.toObject()); - } - }); - }); +productRoutes.get('/api/product/by-restaurant/:id', (req: Request, res: Response) => { + const {id} = req.params; + const restaurantId = new RestaurantId().setId(id) - app.get('/api/product/type', (req: Request, res: Response) => { - productServiceClient.getProductTypeList(new Empty(), (error, response) => { - if (error) { - res.json({error: error.message}); - } else { - res.json(response.toObject()); - } - }); + productServiceClient.getProductList(restaurantId, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } }); - - app.delete('/api/product/:id', (req: Request, res: Response) => { - const {id} = req.params; - const productId = new ProductId().setId(id) - productServiceClient.deleteProduct(productId, (error, response) => { - if (error) { - res.json({error: error.message}); - } else { - res.json(response.toObject()); - } - }); +}); + +productRoutes.get('/api/product/:id', (req: Request, res: Response) => { + const {id} = req.params; + const productId = new ProductId().setId(id) + + productServiceClient.readProduct(productId, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } }); - - app.post('/api/product', (req: Request, res: Response) => { - const {restaurantId, type, name, image, comment, price, preparation, weight, kilocalories, nutriscore, categories, allergens} = req.body; - - const allergensList = allergens.map((allergen: any) => new Allergen().setLibelle(allergen.label)); - const categoryList = categories.map((category: any) => new Category() - .setLibelle(category.label) - .setHexaColor(category.hexaColor) - .setIcon(category.icon)); - - const productId = new Product().setRestaurantId(Number(restaurantId)).setType(type) - .setName(name) - .setImage(image) - .setComment(comment) - .setPrice(price) - .setPreparation(preparation) - .setWeight(weight) - .setKilocalories(kilocalories) - .setNutriscore(nutriscore) - .setCategoriesList(categoryList) - .setAllergensList(allergensList); - - productServiceClient.createProduct(productId, (error, response) => { - if (error) { - res.json({error: error.message}); - } else { - res.json(response.toObject()); - } - }); +}); + +productRoutes.get('/api/product/type', (req: Request, res: Response) => { + productServiceClient.getProductTypeList(new Empty(), (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } }); - - app.put('/api/product/:id', (req: Request, res: Response) => { - const {id} = req.params - const {restaurantId, type, name, image, comment, price, preparation, weight, kilocalories, nutriscore, categories, allergens} = req.body; - - const allergensList = allergens.map((allergen: any) => new Allergen().setLibelle(allergen.label)); - const categoryList = categories.map((category: any) => new Category() - .setLibelle(category.label) - .setHexaColor(category.hexaColor) - .setIcon(category.icon)); - - const productId = new Product().setId(id).setRestaurantId(Number(restaurantId)).setType(type) - .setName(name) - .setImage(image) - .setComment(comment) - .setPrice(price) - .setPreparation(preparation) - .setWeight(weight) - .setKilocalories(kilocalories) - .setNutriscore(nutriscore) - .setCategoriesList(categoryList) - .setAllergensList(allergensList); - - productServiceClient.createProduct(productId, (error, response) => { - if (error) { - res.json({error: error.message}); - } else { - res.json(response.toObject()); - } - }); +}); + +productRoutes.delete('/api/product/:id', (req: Request, res: Response) => { + const {id} = req.params; + const productId = new ProductId().setId(id) + productServiceClient.deleteProduct(productId, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } }); - - app.post('/api/product/image', (req: Request, res: Response) => { - const {input_file} = req.body; - var bitmap = fs.readFileSync(input_file); - var base64File = new Buffer(bitmap).toString('base64'); - - const file = new File().setName(input_file).setData(base64File); - productServiceClient.uploadImage(file, (error, response) => { - if (error) { - res.json({error: error.message}); - } else { - res.json(response.toObject()); - } - }); +}); + +productRoutes.post('/api/product', (req: Request, res: Response) => { + const { + restaurantId, + type, + name, + image, + comment, + price, + preparation, + weight, + kilocalories, + nutriscore, + categories, + allergens + } = req.body; + + const allergensList = allergens.map((allergen: any) => new Allergen().setLibelle(allergen.label)); + const categoryList = categories.map((category: any) => new Category() + .setLibelle(category.label) + .setHexaColor(category.hexaColor) + .setIcon(category.icon)); + + const productId = new Product().setRestaurantId(Number(restaurantId)).setType(type) + .setName(name) + .setImage(image) + .setComment(comment) + .setPrice(price) + .setPreparation(preparation) + .setWeight(weight) + .setKilocalories(kilocalories) + .setNutriscore(nutriscore) + .setCategoriesList(categoryList) + .setAllergensList(allergensList); + + productServiceClient.createProduct(productId, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } + }); +}); + +productRoutes.put('/api/product/:id', (req: Request, res: Response) => { + const {id} = req.params + const { + restaurantId, + type, + name, + image, + comment, + price, + preparation, + weight, + kilocalories, + nutriscore, + categories, + allergens + } = req.body; + + const allergensList = allergens.map((allergen: any) => new Allergen().setLibelle(allergen.label)); + const categoryList = categories.map((category: any) => new Category() + .setLibelle(category.label) + .setHexaColor(category.hexaColor) + .setIcon(category.icon)); + + const productId = new Product().setId(id).setRestaurantId(Number(restaurantId)).setType(type) + .setName(name) + .setImage(image) + .setComment(comment) + .setPrice(price) + .setPreparation(preparation) + .setWeight(weight) + .setKilocalories(kilocalories) + .setNutriscore(nutriscore) + .setCategoriesList(categoryList) + .setAllergensList(allergensList); + + productServiceClient.createProduct(productId, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } + }); +}); + +productRoutes.post('/api/product/image', (req: Request, res: Response) => { + const {input_file} = req.body; + var bitmap = fs.readFileSync(input_file); + var base64File = new Buffer(bitmap).toString('base64'); + + const file = new File().setName(input_file).setData(base64File); + productServiceClient.uploadImage(file, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } }); -} \ No newline at end of file +}); \ No newline at end of file diff --git a/services/gateway/src/controller/promotions/promotions.controller.ts b/services/gateway/src/controller/promotions/promotions.controller.ts index e763d90b..66ac92e6 100644 --- a/services/gateway/src/controller/promotions/promotions.controller.ts +++ b/services/gateway/src/controller/promotions/promotions.controller.ts @@ -1,82 +1,82 @@ -import {Application} from "express"; +import {Router} from "express"; import {promotionsServiceClient} from "@gateway/services/clients/promotions.client"; import {Empty} from "google-protobuf/google/protobuf/empty_pb"; import {Promotion, PromotionCode, PromotionCreateInput, PromotionId, RestaurantId} from "@gateway/proto/promotions_pb"; -export const promotionsController = (app: Application) => { - app.get('/api/promotions/:code', (req, res) => { - const {code} = req.params; - promotionsServiceClient.getPromotion(new PromotionCode().setCode(code), (error, response) => { - if (error) { - res.json({error: error.message}); - } else { - res.json(response.toObject()); - } - }); +export const promotionsRoutes = Router(); + +promotionsRoutes.get('/api/promotions/:code', (req, res) => { + const {code} = req.params; + promotionsServiceClient.getPromotion(new PromotionCode().setCode(code), (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } }); +}); - app.get('/api/promotions', (req, res) => { - promotionsServiceClient.getPromotions(new Empty(), (error, response) => { - if (error) { - res.json({error: error.message}); - } else { - res.json(response.toObject()); - } - }); +promotionsRoutes.get('/api/promotions', (req, res) => { + promotionsServiceClient.getPromotions(new Empty(), (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } }); +}); - app.get('/api/promotions/by-restaurant/:restaurantId', (req, res) => { - const {restaurantId} = req.params; - promotionsServiceClient.getPromotionsByRestaurant(new RestaurantId().setId(restaurantId), (error, response) => { - if (error) { - res.json({error: error.message}); - } else { - res.json(response.toObject()); - } - }); +promotionsRoutes.get('/api/promotions/by-restaurant/:restaurantId', (req, res) => { + const {restaurantId} = req.params; + promotionsServiceClient.getPromotionsByRestaurant(new RestaurantId().setId(restaurantId), (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } }); +}); - app.post('/api/promotions', (req, res) => { - const {code, reduction, method, restaurantId} = req.body; - const promotionCreateInput = new PromotionCreateInput().setCode(code) - .setReduction(reduction) - .setMethod(method) - .setRestaurantId(restaurantId); - promotionsServiceClient.createPromotion(promotionCreateInput, (error, response) => { - if (error) { - res.json({error: error.message}); - } else { - res.json(response.toObject()); - } - }); +promotionsRoutes.post('/api/promotions', (req, res) => { + const {code, reduction, method, restaurantId} = req.body; + const promotionCreateInput = new PromotionCreateInput().setCode(code) + .setReduction(reduction) + .setMethod(method) + .setRestaurantId(restaurantId); + promotionsServiceClient.createPromotion(promotionCreateInput, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } }); +}); - app.put('/api/promotions/:id', (req, res) => { - const {id} = req.params; - const {code, reduction, method, restaurantId} = req.body; - const promotionUpdateInput = new Promotion().setId(id).setCode(code) - .setReduction(reduction) - .setMethod(method) - .setRestaurantId(restaurantId); +promotionsRoutes.put('/api/promotions/:id', (req, res) => { + const {id} = req.params; + const {code, reduction, method, restaurantId} = req.body; + const promotionUpdateInput = new Promotion().setId(id).setCode(code) + .setReduction(reduction) + .setMethod(method) + .setRestaurantId(restaurantId); - promotionsServiceClient.createPromotion(promotionUpdateInput, (error, response) => { - if (error) { - res.json({error: error.message}); - } else { - res.json(response.toObject()); - } - }); + promotionsServiceClient.createPromotion(promotionUpdateInput, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } }); +}); - app.delete('/api/promotions/:id', (req, res) => { - const {id} = req.params; +promotionsRoutes.delete('/api/promotions/:id', (req, res) => { + const {id} = req.params; - promotionsServiceClient.deletePromotion(new PromotionId().setId(id), (error, response) => { - if (error) { - res.json({error: error.message}); - } else { - res.json(response.toObject()); - } - }); + promotionsServiceClient.deletePromotion(new PromotionId().setId(id), (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } }); -}; \ No newline at end of file +}); \ No newline at end of file diff --git a/services/gateway/src/controller/stock/stock.controller.ts b/services/gateway/src/controller/stock/stock.controller.ts index 2743f2ca..677d9aca 100644 --- a/services/gateway/src/controller/stock/stock.controller.ts +++ b/services/gateway/src/controller/stock/stock.controller.ts @@ -1,4 +1,4 @@ -import express, {Request, Response} from 'express'; +import {Request, Response, Router} from 'express'; import {stockServiceClient} from '../../services/clients/stock.client'; import { CreateIngredientRequest, @@ -26,361 +26,360 @@ import { import {Empty} from "google-protobuf/google/protobuf/empty_pb"; -export const stockController = (app: express.Application) => { - /** - * Ingredient Routes - */ +export const stockRoutes = Router(); +/** + * Ingredient Routes + */ - app.get('/api/stock/supplier/:id', (req: Request, res: Response) => { - const {id} = req.params; - const supplierRequest = new GetSupplierRequest().setId(Number(id)); +stockRoutes.get('/api/stock/supplier/:id', (req: Request, res: Response) => { + const {id} = req.params; + const supplierRequest = new GetSupplierRequest().setId(Number(id)); - stockServiceClient.getSupplier(supplierRequest, (error, response) => { - if (error) { - res.json({error: error.message}); - } else { - res.json(response.toObject()); - } - }); + stockServiceClient.getSupplier(supplierRequest, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } }); +}); - app.get('/api/stock/supplier', (req: Request, res: Response) => { +stockRoutes.get('/api/stock/supplier', (req: Request, res: Response) => { - stockServiceClient.getSuppliers(new Empty(), (error, response) => { - if (error) { - res.json({error: error.message}); - } else { - res.json(response.toObject()); - } - }); + stockServiceClient.getSuppliers(new Empty(), (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } }); - - app.get('/api/stock/ingredient/:id', (req: Request, res: Response) => { - const {id} = req.params; - const ingredientRequest = new GetIngredientRequest().setId(Number(id)); - - stockServiceClient.getIngredient(ingredientRequest, (error, response) => { - if (error) { - res.json({error: error.message}); - } else { - res.json(response.toObject()); - } - }); +}); + +stockRoutes.get('/api/stock/ingredient/:id', (req: Request, res: Response) => { + const {id} = req.params; + const ingredientRequest = new GetIngredientRequest().setId(Number(id)); + + stockServiceClient.getIngredient(ingredientRequest, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } }); +}); - app.get('/api/stock/ingredient', (req: Request, res: Response) => { +stockRoutes.get('/api/stock/ingredient', (req: Request, res: Response) => { - stockServiceClient.getIngredients(new Empty(), (error, response) => { - if (error) { - res.json({error: error.message}); - } else { - res.json(response.toObject()); - } - }); + stockServiceClient.getIngredients(new Empty(), (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } }); - - app.post('/api/stock/ingredient', (req: Request, res: Response) => { - const {name, desciption} = req.body - const ingredientRequest = new CreateIngredientRequest().setName(name).setDescription(desciption) - - stockServiceClient.createIngredient(ingredientRequest, (error, response) => { - if (error) { - res.json({error: error.message}); - } else { - res.json(response.toObject()); - } - }); +}); + +stockRoutes.post('/api/stock/ingredient', (req: Request, res: Response) => { + const {name, desciption} = req.body + const ingredientRequest = new CreateIngredientRequest().setName(name).setDescription(desciption) + + stockServiceClient.createIngredient(ingredientRequest, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } }); - - app.put('/api/stock/ingredient/:id', (req: Request, res: Response) => { - const {id} = req.params - const {name, desciption} = req.body - const ingredientRequest = new UpdateIngredientRequest().setId(Number(id)).setName(name).setDescription(desciption) - - stockServiceClient.updateIngredient(ingredientRequest, (error, response) => { - if (error) { - res.json({error: error.message}); - } else { - res.json(response.toObject()); - } - }); +}); + +stockRoutes.put('/api/stock/ingredient/:id', (req: Request, res: Response) => { + const {id} = req.params + const {name, desciption} = req.body + const ingredientRequest = new UpdateIngredientRequest().setId(Number(id)).setName(name).setDescription(desciption) + + stockServiceClient.updateIngredient(ingredientRequest, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } }); - - app.delete('/api/stock/ingredient/:id', (req: Request, res: Response) => { - const {id} = req.params - const ingredientRequest = new DeleteIngredientRequest().setId(Number(id)); - - stockServiceClient.deleteIngredient(ingredientRequest, (error, response) => { - if (error) { - res.json({error: error.message}); - } else { - res.json(response.toObject()); - } - }); +}); + +stockRoutes.delete('/api/stock/ingredient/:id', (req: Request, res: Response) => { + const {id} = req.params + const ingredientRequest = new DeleteIngredientRequest().setId(Number(id)); + + stockServiceClient.deleteIngredient(ingredientRequest, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } }); - - app.delete('/api/stock/ingredient/:id', (req: Request, res: Response) => { - const {id} = req.params - const ingredientRequest = new DeleteIngredientRequest().setId(Number(id)); - - stockServiceClient.deleteIngredient(ingredientRequest, (error, response) => { - if (error) { - res.json({error: error.message}); - } else { - res.json(response.toObject()); - } - }); +}); + +stockRoutes.delete('/api/stock/ingredient/:id', (req: Request, res: Response) => { + const {id} = req.params + const ingredientRequest = new DeleteIngredientRequest().setId(Number(id)); + + stockServiceClient.deleteIngredient(ingredientRequest, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } }); - - /** - * Ingredient Restaurant Routes - */ - - app.get('/api/stock/ingredient/restaurant/:id', (req: Request, res: Response) => { - const {id} = req.params; - const ingredientRestaurantRequest = new GetIngredientRestaurantRequest().setId(Number(id)); - - stockServiceClient.getIngredientRestaurant(ingredientRestaurantRequest, (error, response) => { - if (error) { - res.json({error: error.message}); - } else { - res.json(response.toObject()); - } - }); +}); + +/** + * Ingredient Restaurant Routes + */ + +stockRoutes.get('/api/stock/ingredient/restaurant/:id', (req: Request, res: Response) => { + const {id} = req.params; + const ingredientRestaurantRequest = new GetIngredientRestaurantRequest().setId(Number(id)); + + stockServiceClient.getIngredientRestaurant(ingredientRestaurantRequest, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } }); - - app.get('/api/stock/ingredient/restaurant/by-restaurant/:id', (req: Request, res: Response) => { - const {id} = req.params; - const ingredientRestaurantsByRestaurantRequest = new GetIngredientRestaurantsByRestaurantRequest().setRestaurantId(id); - - stockServiceClient.getIngredientRestaurantsByRestaurant(ingredientRestaurantsByRestaurantRequest, (error, response) => { - if (error) { - res.json({error: error.message}); - } else { - res.json(response.toObject()); - } - }); +}); + +stockRoutes.get('/api/stock/ingredient/restaurant/by-restaurant/:id', (req: Request, res: Response) => { + const {id} = req.params; + const ingredientRestaurantsByRestaurantRequest = new GetIngredientRestaurantsByRestaurantRequest().setRestaurantId(id); + + stockServiceClient.getIngredientRestaurantsByRestaurant(ingredientRestaurantsByRestaurantRequest, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } }); - - app.get('/api/stock/ingredient/restaurant/by-product/:id', (req: Request, res: Response) => { - const {id} = req.params; - const ingredientRestaurantsByProductRequest = new GetIngredientRestaurantsByProductRequest().setProductId(id); - - stockServiceClient.getIngredientRestaurantsByProduct(ingredientRestaurantsByProductRequest, (error, response) => { - if (error) { - res.json({error: error.message}); - } else { - res.json(response.toObject()); - } - }); +}); + +stockRoutes.get('/api/stock/ingredient/restaurant/by-product/:id', (req: Request, res: Response) => { + const {id} = req.params; + const ingredientRestaurantsByProductRequest = new GetIngredientRestaurantsByProductRequest().setProductId(id); + + stockServiceClient.getIngredientRestaurantsByProduct(ingredientRestaurantsByProductRequest, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } }); - - app.post('/api/stock/ingredient/restaurant', (req: Request, res: Response) => { - const {alertThreshold, quantity, productList, unitPrice, pricePerKilo, restaurantId, ingredientId} = req.body; - const ingredientRestaurant = new CreateIngredientRestaurantRequest().setAlertThreshold(alertThreshold) - .setQuantity(quantity) - .setInProductListList(productList) - .setUnitPrice(unitPrice) - .setPricePerKilo(pricePerKilo) - .setRestaurantId(restaurantId) - .setIngredientId(ingredientId) - - - stockServiceClient.createIngredientRestaurant(ingredientRestaurant, (error, response) => { - if (error) { - res.json({error: error.message}); - } else { - res.json(response.toObject()); - } - }); +}); + +stockRoutes.post('/api/stock/ingredient/restaurant', (req: Request, res: Response) => { + const {alertThreshold, quantity, productList, unitPrice, pricePerKilo, restaurantId, ingredientId} = req.body; + const ingredientRestaurant = new CreateIngredientRestaurantRequest().setAlertThreshold(alertThreshold) + .setQuantity(quantity) + .setInProductListList(productList) + .setUnitPrice(unitPrice) + .setPricePerKilo(pricePerKilo) + .setRestaurantId(restaurantId) + .setIngredientId(ingredientId) + + + stockServiceClient.createIngredientRestaurant(ingredientRestaurant, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } }); - - app.put('/api/stock/ingredient/restaurant/:id', (req: Request, res: Response) => { - const {id} = req.params; - const {alertThreshold, quantity, productList, unitPrice, pricePerKilo, restaurantId, ingredientId} = req.body; - const ingredientRestaurant = new UpdateIngredientRestaurantRequest().setId(Number(id)).setAlertThreshold(alertThreshold) - .setQuantity(quantity) - .setInProductListList(productList) - .setUnitPrice(unitPrice) - .setPricePerKilo(pricePerKilo) - .setRestaurantId(restaurantId) - .setIngredientId(ingredientId) - - - stockServiceClient.updateIngredientRestaurant(ingredientRestaurant, (error, response) => { - if (error) { - res.json({error: error.message}); - } else { - res.json(response.toObject()); - } - }); +}); + +stockRoutes.put('/api/stock/ingredient/restaurant/:id', (req: Request, res: Response) => { + const {id} = req.params; + const {alertThreshold, quantity, productList, unitPrice, pricePerKilo, restaurantId, ingredientId} = req.body; + const ingredientRestaurant = new UpdateIngredientRestaurantRequest().setId(Number(id)).setAlertThreshold(alertThreshold) + .setQuantity(quantity) + .setInProductListList(productList) + .setUnitPrice(unitPrice) + .setPricePerKilo(pricePerKilo) + .setRestaurantId(restaurantId) + .setIngredientId(ingredientId) + + + stockServiceClient.updateIngredientRestaurant(ingredientRestaurant, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } }); +}); - app.delete('/api/stock/ingredient/restaurant/:id', (req: Request, res: Response) => { - const {id} = req.params; +stockRoutes.delete('/api/stock/ingredient/restaurant/:id', (req: Request, res: Response) => { + const {id} = req.params; - stockServiceClient.deleteIngredientRestaurant(new DeleteIngredientRestaurantRequest().setId(Number(id)), (error, response) => { - if (error) { - res.json({error: error.message}); - } else { - res.json(response.toObject()); - } - }); + stockServiceClient.deleteIngredientRestaurant(new DeleteIngredientRestaurantRequest().setId(Number(id)), (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } }); +}); - /** - * Supplier Routes - */ +/** + * Supplier Routes + */ - app.get('/api/stock/supplier/:id', (req: Request, res: Response) => { - const {id} = req.params; +stockRoutes.get('/api/stock/supplier/:id', (req: Request, res: Response) => { + const {id} = req.params; - stockServiceClient.getSupplier(new GetSupplierRequest().setId(Number(id)), (error, response) => { - if (error) { - res.json({error: error.message}); - } else { - res.json(response.toObject()); - } - }); + stockServiceClient.getSupplier(new GetSupplierRequest().setId(Number(id)), (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } }); - - app.get('/api/stock/supplier', (req: Request, res: Response) => { - stockServiceClient.getSuppliers(new Empty(), (error, response) => { - if (error) { - res.json({error: error.message}); - } else { - res.json(response.toObject()); - } - }); +}); + +stockRoutes.get('/api/stock/supplier', (req: Request, res: Response) => { + stockServiceClient.getSuppliers(new Empty(), (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } }); - - app.post('/api/stock/supplier', (req: Request, res: Response) => { - const {name, contact} = req.body; - const supplierRequest = new CreateSupplierRequest().setName(name).setContact(contact) - - stockServiceClient.createSupplier(supplierRequest, (error, response) => { - if (error) { - res.json({error: error.message}); - } else { - res.json(response.toObject()); - } - }); +}); + +stockRoutes.post('/api/stock/supplier', (req: Request, res: Response) => { + const {name, contact} = req.body; + const supplierRequest = new CreateSupplierRequest().setName(name).setContact(contact) + + stockServiceClient.createSupplier(supplierRequest, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } }); - - app.put('/api/stock/supplier/:id', (req: Request, res: Response) => { - const {id} = req.params; - const {name, contact} = req.body; - const supplierRequest = new UpdateSupplierRequest().setId(Number(id)).setName(name).setContact(contact) - - stockServiceClient.updateSupplier(supplierRequest, (error, response) => { - if (error) { - res.json({error: error.message}); - } else { - res.json(response.toObject()); - } - }); +}); + +stockRoutes.put('/api/stock/supplier/:id', (req: Request, res: Response) => { + const {id} = req.params; + const {name, contact} = req.body; + const supplierRequest = new UpdateSupplierRequest().setId(Number(id)).setName(name).setContact(contact) + + stockServiceClient.updateSupplier(supplierRequest, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } }); +}); - app.delete('/api/stock/supplier/:id', (req: Request, res: Response) => { - const {id} = req.params; +stockRoutes.delete('/api/stock/supplier/:id', (req: Request, res: Response) => { + const {id} = req.params; - stockServiceClient.deleteSupplier(new DeleteSupplierRequest().setId(Number(id)), (error, response) => { - if (error) { - res.json({error: error.message}); - } else { - res.json(response.toObject()); - } - }); + stockServiceClient.deleteSupplier(new DeleteSupplierRequest().setId(Number(id)), (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } }); +}); - /** - * Supply Order Routes - */ +/** + * Supply Order Routes + */ - app.get('/api/stock/supply/order/:id', (req: Request, res: Response) => { - const {id} = req.params; +stockRoutes.get('/api/stock/supply/order/:id', (req: Request, res: Response) => { + const {id} = req.params; - stockServiceClient.getSupplyOrder(new GetSupplyOrderRequest().setId(Number(id)), (error, response) => { - if (error) { - res.json({error: error.message}); - } else { - res.json(response.toObject()); - } - }); + stockServiceClient.getSupplyOrder(new GetSupplyOrderRequest().setId(Number(id)), (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } }); - - app.get('/api/stock/supply/order/by-restaurant/:id', (req: Request, res: Response) => { - const {id} = req.params; - stockServiceClient.getSupplyOrdersByRestaurant(new GetSupplyOrdersByRestaurantRequest().setRestaurantId(id), (error, response) => { - if (error) { - res.json({error: error.message}); - } else { - res.json(response.toObject()); - } - }); +}); + +stockRoutes.get('/api/stock/supply/order/by-restaurant/:id', (req: Request, res: Response) => { + const {id} = req.params; + stockServiceClient.getSupplyOrdersByRestaurant(new GetSupplyOrdersByRestaurantRequest().setRestaurantId(id), (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } }); - - app.get('/api/stock/supply/order/by-supplier/:id', (req: Request, res: Response) => { - const {id} = req.params; - stockServiceClient.getSupplyOrdersBySupplier(new GetSupplyOrdersBySupplierRequest().setSupplierId(Number(id)), (error, response) => { - if (error) { - res.json({error: error.message}); - } else { - res.json(response.toObject()); - } - }); +}); + +stockRoutes.get('/api/stock/supply/order/by-supplier/:id', (req: Request, res: Response) => { + const {id} = req.params; + stockServiceClient.getSupplyOrdersBySupplier(new GetSupplyOrdersBySupplierRequest().setSupplierId(Number(id)), (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } }); - - app.get('/api/stock/supply/order/by-ingredient-restaurant/:id', (req: Request, res: Response) => { - const {id} = req.params; - stockServiceClient.getSupplyOrdersByIngredientRestaurant(new GetSupplyOrdersByIngredientRestaurantRequest().setIngredientRestaurantId(Number(id)), (error, response) => { - if (error) { - res.json({error: error.message}); - } else { - res.json(response.toObject()); - } - }); +}); + +stockRoutes.get('/api/stock/supply/order/by-ingredient-restaurant/:id', (req: Request, res: Response) => { + const {id} = req.params; + stockServiceClient.getSupplyOrdersByIngredientRestaurant(new GetSupplyOrdersByIngredientRestaurantRequest().setIngredientRestaurantId(Number(id)), (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } }); - - app.post('/api/stock/supply/order', (req: Request, res: Response) => { - const {quantity, ingredientRestaurantId, supplierId} = req.body; - const supplyOrderRequest = new CreateSupplyOrderRequest().setQuantity(quantity) - .setIngredientRestaurantId(ingredientRestaurantId) - .setSupplierId(supplierId); - - stockServiceClient.createSupplyOrder(supplyOrderRequest, (error, response) => { - if (error) { - res.json({error: error.message}); - } else { - res.json(response.toObject()); - } - }); +}); + +stockRoutes.post('/api/stock/supply/order', (req: Request, res: Response) => { + const {quantity, ingredientRestaurantId, supplierId} = req.body; + const supplyOrderRequest = new CreateSupplyOrderRequest().setQuantity(quantity) + .setIngredientRestaurantId(ingredientRestaurantId) + .setSupplierId(supplierId); + + stockServiceClient.createSupplyOrder(supplyOrderRequest, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } }); - - app.put('/api/stock/supply/order/:id', (req: Request, res: Response) => { - const {id} = req.params; - const {quantity, ingredientRestaurantId, supplierId} = req.body; - const supplyOrderRequest = new UpdateSupplyOrderRequest().setId(Number(id)).setQuantity(quantity) - .setIngredientRestaurantId(ingredientRestaurantId) - .setSupplierId(supplierId); - - stockServiceClient.updateSupplyOrder(supplyOrderRequest, (error, response) => { - if (error) { - res.json({error: error.message}); - } else { - res.json(response.toObject()); - } - }); +}); + +stockRoutes.put('/api/stock/supply/order/:id', (req: Request, res: Response) => { + const {id} = req.params; + const {quantity, ingredientRestaurantId, supplierId} = req.body; + const supplyOrderRequest = new UpdateSupplyOrderRequest().setId(Number(id)).setQuantity(quantity) + .setIngredientRestaurantId(ingredientRestaurantId) + .setSupplierId(supplierId); + + stockServiceClient.updateSupplyOrder(supplyOrderRequest, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } }); - - app.delete('/api/stock/supply/order/:id', (req: Request, res: Response) => { - const {id} = req.params; - stockServiceClient.deleteSupplyOrder(new DeleteSupplyOrderRequest().setId(Number(id)), (error, response) => { - if (error) { - res.json({error: error.message}); - } else { - res.json(response.toObject()); - } - }); +}); + +stockRoutes.delete('/api/stock/supply/order/:id', (req: Request, res: Response) => { + const {id} = req.params; + stockServiceClient.deleteSupplyOrder(new DeleteSupplyOrderRequest().setId(Number(id)), (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } }); -} \ No newline at end of file +}); \ No newline at end of file diff --git a/services/gateway/src/controller/stock/stockPerson.controller.ts b/services/gateway/src/controller/stock/stockPerson.controller.ts index 56d3f931..48496f95 100644 --- a/services/gateway/src/controller/stock/stockPerson.controller.ts +++ b/services/gateway/src/controller/stock/stockPerson.controller.ts @@ -1,20 +1,19 @@ import {stockPersonServiceClient} from "@gateway/services/clients/stock.client"; -import {Application, Request, Response} from "express"; +import {Request, Response, Router} from "express"; import {GetOutcomesByRestaurantRequest} from "@gateway/proto/stock_pb"; +export const stockPersonRoutes = Router(); -export const stockPersonController = (app: Application) => { - app.post('/api/stock/outcomes/by-restaurant/:id', (req: Request, res: Response) => { - const {id} = req.params; - const {date, interval} = req.body; - const outcomesByRestaurantRequest = new GetOutcomesByRestaurantRequest().setRestaurantId(id).setDate(date).setInterval(interval); +stockPersonRoutes.post('/api/stock/outcomes/by-restaurant/:id', (req: Request, res: Response) => { + const {id} = req.params; + const {date, interval} = req.body; + const outcomesByRestaurantRequest = new GetOutcomesByRestaurantRequest().setRestaurantId(id).setDate(date).setInterval(interval); - stockPersonServiceClient.getOutcomesByRestaurant(outcomesByRestaurantRequest, (error, response) => { - if (error) { - res.json({error: error.message}); - } else { - res.json(response.toObject()); - } - }); + stockPersonServiceClient.getOutcomesByRestaurant(outcomesByRestaurantRequest, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } }); -} \ No newline at end of file +}); \ No newline at end of file diff --git a/services/gateway/src/controller/user/user.controller.ts b/services/gateway/src/controller/user/user.controller.ts index 5d27c879..c4467600 100644 --- a/services/gateway/src/controller/user/user.controller.ts +++ b/services/gateway/src/controller/user/user.controller.ts @@ -1,4 +1,4 @@ -import express, {Request, Response} from 'express'; +import {Request, Response, Router} from 'express'; import {userServiceClient} from '../../services/clients/user.client'; import { changePasswordInput, @@ -13,182 +13,181 @@ import { import {Empty} from "google-protobuf/google/protobuf/empty_pb"; import {getUser} from "@gateway/services/user.service"; -export const userController = (app: express.Application) => { - app.get('/api/user/:id', (req: Request, res: Response) => { - const {id} = req.params; - try { - res.json(getUser(Number(id))); - } catch (e: any) { - res.json({error: e.message}); +export const userRoutes = Router(); +userRoutes.get('/api/user/:id', (req: Request, res: Response) => { + const {id} = req.params; + try { + res.json(getUser(Number(id))); + } catch (e: any) { + res.json({error: e.message}); + } +}); + +userRoutes.get('/api/user', (req: Request, res: Response) => { + userServiceClient.listUser(new Empty(), (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); } }); - - app.get('/api/user', (req: Request, res: Response) => { - userServiceClient.listUser(new Empty(), (error, response) => { - if (error) { - res.json({error: error.message}); - } else { - res.json(response.toObject()); - } - }); - }); - - app.post('/api/user', (req: Request, res: Response) => { - const body = req.body; - let userInput = new UserCreateInput(); - try { - userInput.setFirstName(body.firstName) - .setLastName(body.lastName) - .setEmail(body.email) - .setPassword(body.password) - .setPhone(body.phone) - .setMainaddress(body.address) - .setRole(body.role); - - } catch (e: any) { - res.json({error: e.message}); +}); + +userRoutes.post('/api/user', (req: Request, res: Response) => { + const body = req.body; + let userInput = new UserCreateInput(); + try { + userInput.setFirstName(body.firstName) + .setLastName(body.lastName) + .setEmail(body.email) + .setPassword(body.password) + .setPhone(body.phone) + .setMainaddress(body.address) + .setRole(body.role); + + } catch (e: any) { + res.json({error: e.message}); + } + + userServiceClient.register(userInput, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); } - - userServiceClient.register(userInput, (error, response) => { - if (error) { - res.json({error: error.message}); - } else { - res.json(response.toObject()); - } - }); }); - - app.put('/api/user/:id', (req: Request, res: Response) => { - const {authorization} = req.headers; - if (!authorization) { - res.json({error: 'Not authorized'}); - return; +}); + +userRoutes.put('/api/user/:id', (req: Request, res: Response) => { + const {authorization} = req.headers; + if (!authorization) { + res.json({error: 'Not authorized'}); + return; + } + + const body = req.body; + const userInput = new UpdateUserInput() + try { + const user = new User().setId(Number(req.params.id)) + .setFirstName(body.firstName) + .setLastName(body.lastName) + .setEmail(body.email) + .setPhone(body.phone) + .setMainaddress(body.address) + .setRole(body.role); + + userInput.setUser(user).setToken(authorization); + + } catch (e: any) { + res.json({error: e.message}); + } + + userServiceClient.updateUser(userInput, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); } - - const body = req.body; - const userInput = new UpdateUserInput() - try { - const user = new User().setId(Number(req.params.id)) - .setFirstName(body.firstName) - .setLastName(body.lastName) - .setEmail(body.email) - .setPhone(body.phone) - .setMainaddress(body.address) - .setRole(body.role); - - userInput.setUser(user).setToken(authorization); - - } catch (e: any) { - res.json({error: e.message}); - } - - userServiceClient.updateUser(userInput, (error, response) => { - if (error) { - res.json({error: error.message}); - } else { - res.json(response.toObject()); - } - }); }); - - app.delete('/api/user/:id', (req: Request, res: Response) => { - const {id} = req.params; - const {authorization} = req.headers; - if (!authorization) { - res.json({error: 'Not authorized'}); - return; +}); + +userRoutes.delete('/api/user/:id', (req: Request, res: Response) => { + const {id} = req.params; + const {authorization} = req.headers; + if (!authorization) { + res.json({error: 'Not authorized'}); + return; + } + + userServiceClient.deleteUser(new DeleteInput().setUserid(Number(id)).setToken(authorization), (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); } - - userServiceClient.deleteUser(new DeleteInput().setUserid(Number(id)).setToken(authorization), (error, response) => { - if (error) { - res.json({error: error.message}); - } else { - res.json(response.toObject()); - } - }); }); +}); - app.post('/api/user/login', (req: Request, res: Response) => { - const body = req.body; - const inInput = new logInInput().setEmail(body.email).setPassword(body.password); - - userServiceClient.logIn(inInput, (error, response) => { - if (error) { - res.json({error: error.message}); - } else { - res.json(response.toObject()); - } - }); - }); +userRoutes.post('/api/user/login', (req: Request, res: Response) => { + const body = req.body; + const inInput = new logInInput().setEmail(body.email).setPassword(body.password); - app.post('/api/user/validate', (req: Request, res: Response) => { - const {authorization} = req.headers; - if (!authorization) { - res.json({error: 'Not authorized'}); - return; + userServiceClient.logIn(inInput, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); } - const validate = new validateInput().setToken(authorization); - - userServiceClient.validate(validate, (error, response) => { - if (error) { - res.json({error: error.message}); - } else { - res.json(response.toObject()); - } - }); }); - - app.put('/api/user/:id/password', (req: Request, res: Response) => { - const {authorization} = req.headers; - if (!authorization) { - res.json({error: 'Not authorized'}); - return; +}); + +userRoutes.post('/api/user/validate', (req: Request, res: Response) => { + const {authorization} = req.headers; + if (!authorization) { + res.json({error: 'Not authorized'}); + return; + } + const validate = new validateInput().setToken(authorization); + + userServiceClient.validate(validate, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); } - - const body = req.body; - const updatePasswordInput = new changePasswordInput(); - try { - updatePasswordInput - .setToken(authorization) - .setOldpassword(body.oldpassword) - .setNewpassword(body.password); - } catch (e: any) { - res.json({error: e.message}); - } - - userServiceClient.changePassword(updatePasswordInput, (error, response) => { - if (error) { - res.json({error: error.message}); - } else { - res.json(response.toObject()); - } - }); }); - - app.put('/api/user/:id/role', (req: Request, res: Response) => { - const {authorization} = req.headers; - if (!authorization) { - res.json({error: 'Not authorized'}); - return; +}); + +userRoutes.put('/api/user/:id/password', (req: Request, res: Response) => { + const {authorization} = req.headers; + if (!authorization) { + res.json({error: 'Not authorized'}); + return; + } + + const body = req.body; + const updatePasswordInput = new changePasswordInput(); + try { + updatePasswordInput + .setToken(authorization) + .setOldpassword(body.oldpassword) + .setNewpassword(body.password); + } catch (e: any) { + res.json({error: e.message}); + } + + userServiceClient.changePassword(updatePasswordInput, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); } - const body = req.body; - const id = req.params.id; - const updatePasswordInput = new changeRoleInput(); - try { - updatePasswordInput - .setToken(authorization) - .setUserid(Number(id)) - .setRolecode(body.role); - } catch (e: any) { - res.json({error: e.message}); + }); +}); + +userRoutes.put('/api/user/:id/role', (req: Request, res: Response) => { + const {authorization} = req.headers; + if (!authorization) { + res.json({error: 'Not authorized'}); + return; + } + const body = req.body; + const id = req.params.id; + const updatePasswordInput = new changeRoleInput(); + try { + updatePasswordInput + .setToken(authorization) + .setUserid(Number(id)) + .setRolecode(body.role); + } catch (e: any) { + res.json({error: e.message}); + } + userServiceClient.changeRole(updatePasswordInput, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); } - userServiceClient.changeRole(updatePasswordInput, (error, response) => { - if (error) { - res.json({error: error.message}); - } else { - res.json(response.toObject()); - } - }); - }); -} \ No newline at end of file + +}); \ No newline at end of file diff --git a/services/gateway/src/server.ts b/services/gateway/src/server.ts index 43acc000..3929226e 100644 --- a/services/gateway/src/server.ts +++ b/services/gateway/src/server.ts @@ -1,12 +1,15 @@ -import {Request, Response} from "express"; -import {userController} from "@gateway/controller/user/user.controller"; -import {orderController} from "@gateway/controller/order/order.controller"; -import {productController} from "@gateway/controller/product/product.controller"; -import {categoryController} from "@gateway/controller/product/category.controller"; -import {allergenController} from "@gateway/controller/product/allergen.controller"; -import {deliveryController} from "@gateway/controller/delivery/delivery.controller"; -import {deliveryPersonController} from "@gateway/controller/delivery/deliveryPerson.controller"; -import {promotionsController} from "@gateway/controller/promotions/promotions.controller"; +import {userRoutes} from "@gateway/controller/user/user.controller"; +import {orderRoutes} from "@gateway/controller/order/order.controller"; +import {productRoutes} from "@gateway/controller/product/product.controller"; +import {categoryRoutes} from "@gateway/controller/product/category.controller"; +import {allergenRoutes} from "@gateway/controller/product/allergen.controller"; +import {deliveryRoutes} from "@gateway/controller/delivery/delivery.controller"; +import {deliveryPersonRoutes} from "@gateway/controller/delivery/deliveryPerson.controller"; +import {promotionsRoutes} from "@gateway/controller/promotions/promotions.controller"; +import {stockPersonRoutes} from "@gateway/controller/stock/stockPerson.controller"; +import {stockRoutes} from "@gateway/controller/stock/stock.controller"; +import {logRoutes} from "@gateway/controller/log/log.controller"; +import {metricRoutes} from "@gateway/controller/metric/metric.controller"; const express = require('express'); const bodyParser = require('body-parser'); @@ -16,18 +19,18 @@ app.use(bodyParser.json()); const PORT = process.env.PORT || 50000; -app.get('/', (req: Request, res: Response) => { - res.send('Node.js API Gateway is up and running!'); -}); - -userController(app); -orderController(app); -categoryController(app); -allergenController(app); -productController(app); -deliveryController(app); -deliveryPersonController(app); -promotionsController(app); +app.use('/', userRoutes); +app.use('/', orderRoutes); +app.use('/', categoryRoutes); +app.use('/', allergenRoutes); +app.use('/', productRoutes); +app.use('/', deliveryRoutes); +app.use('/', deliveryPersonRoutes); +app.use('/', logRoutes); +app.use('/', metricRoutes); +app.use('/', promotionsRoutes); +app.use('/', stockRoutes); +app.use('/', stockPersonRoutes); app.listen(PORT, () => { console.log(`API Gateway is running on port ${PORT}`); diff --git a/services/gateway/src/utils/swagger.utils.js b/services/gateway/src/utils/swagger.utils.js index b02415e2..a882635b 100644 --- a/services/gateway/src/utils/swagger.utils.js +++ b/services/gateway/src/utils/swagger.utils.js @@ -2,16 +2,14 @@ const swaggerAutogen = require('swagger-autogen')(); const doc = { info: { - title: 'My API', - description: 'Description' + title: 'The Gateway API', + description: 'The Gateway API for the Microservices', }, - host: 'localhost:3000' + host: `localhost:${process.env.PORT || 50000}` }; const outputFile = './swagger-output.json'; -const routes = ['../controller/user/userController.ts', - '../controller/order/orderController.ts', - '../controller/product/productController.ts',]; +const routes = ['../server.ts',]; /* NOTE: If you are using the express Router, you must pass in the 'routes' only the root file where the route starts, such as index.js, app.js, routes.js, etc ... */ From 22616f6a3891ccb2efa9ef2ed6dcf5373b696ae1 Mon Sep 17 00:00:00 2001 From: anatole Date: Sat, 12 Aug 2023 19:07:50 +0200 Subject: [PATCH 408/883] feat(gateway): add tags for the swagger --- services/gateway/src/server.ts | 48 +++++++++++++++++++++++++--------- 1 file changed, 36 insertions(+), 12 deletions(-) diff --git a/services/gateway/src/server.ts b/services/gateway/src/server.ts index 3929226e..8bb20b12 100644 --- a/services/gateway/src/server.ts +++ b/services/gateway/src/server.ts @@ -19,18 +19,42 @@ app.use(bodyParser.json()); const PORT = process.env.PORT || 50000; -app.use('/', userRoutes); -app.use('/', orderRoutes); -app.use('/', categoryRoutes); -app.use('/', allergenRoutes); -app.use('/', productRoutes); -app.use('/', deliveryRoutes); -app.use('/', deliveryPersonRoutes); -app.use('/', logRoutes); -app.use('/', metricRoutes); -app.use('/', promotionsRoutes); -app.use('/', stockRoutes); -app.use('/', stockPersonRoutes); +app.use('/', userRoutes +// #swagger.tags = ['User'] +); +app.use('/', orderRoutes +// #swagger.tags = ['Order'] +); +app.use('/', categoryRoutes +// #swagger.tags = ['Category'] +); +app.use('/', allergenRoutes +// #swagger.tags = ['Allergen'] +); +app.use('/', productRoutes +// #swagger.tags = ['Product'] +); +app.use('/', deliveryRoutes +// #swagger.tags = ['Delivery'] +); +app.use('/', deliveryPersonRoutes +// #swagger.tags = ['DeliveryPerson'] +); +app.use('/', logRoutes +// #swagger.tags = ['Log'] +); +app.use('/', metricRoutes +// #swagger.tags = ['Metric'] +); +app.use('/', promotionsRoutes +// #swagger.tags = ['Promotions'] +); +app.use('/', stockRoutes +// #swagger.tags = ['Stock'] +); +app.use('/', stockPersonRoutes +// #swagger.tags = ['StockPerson'] +); app.listen(PORT, () => { console.log(`API Gateway is running on port ${PORT}`); From 13140ba8615797858cf2482430d0a409bf6a56da Mon Sep 17 00:00:00 2001 From: anatole Date: Sat, 12 Aug 2023 19:09:02 +0200 Subject: [PATCH 409/883] feat(gateway): add tags for the swagger --- services/gateway/README.md | 2 +- services/gateway/package-lock.json | 930 ++++++++---------- services/gateway/package.json | 3 +- .../src/services/clients/delivery.client.ts | 2 +- .../src/services/clients/log.client.ts | 2 +- .../src/services/clients/metric.client.ts | 2 +- .../src/services/clients/order.client.ts | 2 +- .../src/services/clients/product.client.ts | 2 +- .../src/services/clients/promotions.client.ts | 2 +- .../src/services/clients/stock.client.ts | 2 +- .../src/services/clients/user.client.ts | 2 +- 11 files changed, 431 insertions(+), 520 deletions(-) diff --git a/services/gateway/README.md b/services/gateway/README.md index e8a4dbf7..9aeb77bc 100644 --- a/services/gateway/README.md +++ b/services/gateway/README.md @@ -36,7 +36,7 @@ You can use the following tools to help you with the setup: 3. Run `npm install` to install the necessary dependencies. 4. Create a `.env` file at the root of the project directory and add the environment variables values ( see `.env.example`). -5. Run `cd proto && sh ./build-protos.sh ./proto/user.proto ./src/proto && cd ..` to generate js file to create the clients. +5. Run `sh proto/build-protos.sh` to generate js file to create the clients. Then replace all "grpc" package iteration by "@grpc/grpc-js" 6. Run `npm run start` to start the microservice. You can now access the microservice at `http://localhost:50000`. diff --git a/services/gateway/package-lock.json b/services/gateway/package-lock.json index cdcd3cf2..9f8565a9 100644 --- a/services/gateway/package-lock.json +++ b/services/gateway/package-lock.json @@ -9,13 +9,13 @@ "version": "1.0.0", "license": "ISC", "dependencies": { + "@grpc/grpc-js": "^1.9.0", "@types/express": "^4.17.17", "axios": "^1.4.0", "body-parser": "^1.20.2", "dotenv": "^16.0.3", "express": "^4.18.2", "google-protobuf": "^3.21.2", - "grpc": "^1.24.11", "swagger-autogen": "^2.23.5" }, "bin": { @@ -154,6 +154,74 @@ "node": ">=12" } }, + "node_modules/@grpc/grpc-js": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.9.0.tgz", + "integrity": "sha512-H8+iZh+kCE6VR/Krj6W28Y/ZlxoZ1fOzsNt77nrdE3knkbSelW1Uus192xOFCxHyeszLj8i4APQkSIXjAoOxXg==", + "dependencies": { + "@grpc/proto-loader": "^0.7.0", + "@types/node": ">=12.12.47" + }, + "engines": { + "node": "^8.13.0 || >=10.10.0" + } + }, + "node_modules/@grpc/proto-loader": { + "version": "0.7.8", + "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.8.tgz", + "integrity": "sha512-GU12e2c8dmdXb7XUlOgYWZ2o2i+z9/VeACkxTA/zzAe2IjclC5PnVL0lpgjhrqfpDYHzM8B1TF6pqWegMYAzlA==", + "dependencies": { + "@types/long": "^4.0.1", + "lodash.camelcase": "^4.3.0", + "long": "^4.0.0", + "protobufjs": "^7.2.4", + "yargs": "^17.7.2" + }, + "bin": { + "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@grpc/proto-loader/node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@grpc/proto-loader/node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "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.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@grpc/proto-loader/node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "engines": { + "node": ">=12" + } + }, "node_modules/@istanbuljs/schema": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", @@ -233,6 +301,7 @@ "version": "1.0.11", "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.11.tgz", "integrity": "sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==", + "dev": true, "dependencies": { "detect-libc": "^2.0.0", "https-proxy-agent": "^5.0.0", @@ -283,6 +352,60 @@ "node": ">= 8" } }, + "node_modules/@protobufjs/aspromise": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==" + }, + "node_modules/@protobufjs/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" + }, + "node_modules/@protobufjs/codegen": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", + "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" + }, + "node_modules/@protobufjs/eventemitter": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", + "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==" + }, + "node_modules/@protobufjs/fetch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", + "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", + "dependencies": { + "@protobufjs/aspromise": "^1.1.1", + "@protobufjs/inquire": "^1.1.0" + } + }, + "node_modules/@protobufjs/float": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", + "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==" + }, + "node_modules/@protobufjs/inquire": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", + "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==" + }, + "node_modules/@protobufjs/path": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==" + }, + "node_modules/@protobufjs/pool": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==" + }, + "node_modules/@protobufjs/utf8": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", + "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==" + }, "node_modules/@sinclair/typebox": { "version": "0.27.8", "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", @@ -331,20 +454,6 @@ "@types/node": "*" } }, - "node_modules/@types/bytebuffer": { - "version": "5.0.44", - "resolved": "https://registry.npmjs.org/@types/bytebuffer/-/bytebuffer-5.0.44.tgz", - "integrity": "sha512-k1qonHga/SfQT02NF633i+7tIfKd+cfC/8pjnedcfuXJNMWooss/FkCgRMSnLf2WorLjbuH4bfgAZEbtyHBDoQ==", - "dependencies": { - "@types/long": "^3.0.0", - "@types/node": "*" - } - }, - "node_modules/@types/bytebuffer/node_modules/@types/long": { - "version": "3.0.32", - "resolved": "https://registry.npmjs.org/@types/long/-/long-3.0.32.tgz", - "integrity": "sha512-ZXyOOm83p7X8p3s0IYM3VeueNmHpkk/yMlP8CLeOnEcu6hIwPH7YjZBvhQkR0ZFS2DqZAxKtJ/M5fcuv3OU5BA==" - }, "node_modules/@types/chai": { "version": "4.3.5", "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.5.tgz", @@ -407,6 +516,11 @@ "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", "dev": true }, + "node_modules/@types/long": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz", + "integrity": "sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==" + }, "node_modules/@types/mime": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", @@ -563,7 +677,8 @@ "node_modules/abbrev": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true }, "node_modules/accepts": { "version": "1.3.8", @@ -602,6 +717,7 @@ "version": "6.0.2", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, "dependencies": { "debug": "4" }, @@ -621,7 +737,6 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -648,12 +763,14 @@ "node_modules/aproba": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", - "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==" + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", + "dev": true }, "node_modules/are-we-there-yet": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", + "dev": true, "dependencies": { "delegates": "^1.0.0", "readable-stream": "^3.6.0" @@ -682,15 +799,6 @@ "node": ">=8" } }, - "node_modules/ascli": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ascli/-/ascli-1.0.1.tgz", - "integrity": "sha512-JGQaNxpaCJz9Bd1JvVaFIHuWn9S+l3xhN17R0V/vmUDiGE0QngNMXhjlqpwqV+91plWz9Fg+Lt28Lj7p5vjs8A==", - "dependencies": { - "colour": "~0.7.1", - "optjs": "~3.2.2" - } - }, "node_modules/assertion-error": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", @@ -850,25 +958,6 @@ "ieee754": "^1.1.13" } }, - "node_modules/bytebuffer": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/bytebuffer/-/bytebuffer-5.0.1.tgz", - "integrity": "sha512-IuzSdmADppkZ6DlpycMkm8l9zeEq16fWtLvunEwFiYciR/BHo4E8/xs5piFquG+Za8OWmMqHF8zuRviz2LHvRQ==", - "dependencies": { - "long": "~3" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/bytebuffer/node_modules/long": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/long/-/long-3.2.0.tgz", - "integrity": "sha512-ZYvPPOMqUwPoDsbJaR10iQJYnMuZhRTvHYl62ErLIEX7RgFlziSBUUvrt3OVfc47QlHHpzPZYP17g3Fv7oeJkg==", - "engines": { - "node": ">=0.6" - } - }, "node_modules/bytes": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", @@ -924,14 +1013,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/camelcase": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", - "integrity": "sha512-DLIsRzJVBQu72meAKPkWQOLcujdXT32hwdfnkI1frSiSRMK1MofjKHf+MEx0SB6fjEFXL8fBDv1dKymBlOp4Qw==", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/chai": { "version": "4.3.7", "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.7.tgz", @@ -1006,6 +1087,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "dev": true, "engines": { "node": ">=10" } @@ -1021,19 +1103,10 @@ "wrap-ansi": "^7.0.0" } }, - "node_modules/code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, "dependencies": { "color-name": "~1.1.4" }, @@ -1044,25 +1117,17 @@ "node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "node_modules/color-support": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "dev": true, "bin": { "color-support": "bin.js" } }, - "node_modules/colour": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/colour/-/colour-0.7.1.tgz", - "integrity": "sha512-Rel466v0EnmKPcsxHo91L4kgPs/6XF7Pu2LJNszq9lXYwi5CFWEeIiRaTX5ym7PPMdj4udDHkLSVC1//JVkZQg==", - "engines": { - "node": ">=0.8" - } - }, "node_modules/combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", @@ -1082,7 +1147,8 @@ "node_modules/console-control-strings": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==" + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", + "dev": true }, "node_modules/content-disposition": { "version": "0.5.4", @@ -1152,6 +1218,7 @@ "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, "dependencies": { "ms": "2.1.2" }, @@ -1164,14 +1231,6 @@ } } }, - "node_modules/decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/decompress-response": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", @@ -1227,7 +1286,8 @@ "node_modules/delegates": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==" + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", + "dev": true }, "node_modules/depd": { "version": "2.0.0", @@ -1250,6 +1310,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz", "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==", + "dev": true, "engines": { "node": ">=8" } @@ -1363,7 +1424,6 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true, "engines": { "node": ">=6" } @@ -1690,6 +1750,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dev": true, "dependencies": { "minipass": "^3.0.0" }, @@ -1701,6 +1762,7 @@ "version": "3.3.6", "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, "dependencies": { "yallist": "^4.0.0" }, @@ -1722,6 +1784,7 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", + "dev": true, "dependencies": { "aproba": "^1.0.3 || ^2.0.0", "color-support": "^1.1.2", @@ -1741,7 +1804,6 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true, "engines": { "node": "6.* || 8.* || >= 10.*" } @@ -1843,24 +1905,6 @@ "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", "dev": true }, - "node_modules/grpc": { - "version": "1.24.11", - "resolved": "https://registry.npmjs.org/grpc/-/grpc-1.24.11.tgz", - "integrity": "sha512-8/AQdFCzCeCDWW3SoaMNp6ccbRvTQEH1O1u1uFtt29eWsg5gSZCJ3m6fbkduEIh3smY7WAPP+LgVJ5n3nZRxcA==", - "deprecated": "This library will not receive further updates other than security fixes. We recommend using @grpc/grpc-js instead.", - "hasInstallScript": true, - "dependencies": { - "@mapbox/node-pre-gyp": "^1.0.4", - "@types/bytebuffer": "^5.0.40", - "lodash.camelcase": "^4.3.0", - "lodash.clone": "^4.5.0", - "nan": "^2.13.2", - "protobufjs": "^5.0.3" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/grpc_tools_node_protoc_ts": { "version": "5.3.3", "resolved": "https://registry.npmjs.org/grpc_tools_node_protoc_ts/-/grpc_tools_node_protoc_ts-5.3.3.tgz", @@ -1894,107 +1938,6 @@ "grpc_tools_node_protoc_plugin": "bin/protoc_plugin.js" } }, - "node_modules/grpc/node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grpc/node_modules/cliui": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", - "integrity": "sha512-0yayqDxWQbqk3ojkYqUKqaAQ6AfNKeKWRNA8kR0WXzAsdHpP4BIaOmMAG87JGuO6qcobyW4GjxHd9PmhEd+T9w==", - "dependencies": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wrap-ansi": "^2.0.0" - } - }, - "node_modules/grpc/node_modules/is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==", - "dependencies": { - "number-is-nan": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grpc/node_modules/protobufjs": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-5.0.3.tgz", - "integrity": "sha512-55Kcx1MhPZX0zTbVosMQEO5R6/rikNXd9b6RQK4KSPcrSIIwoXTtebIczUrXlwaSrbz4x8XUVThGPob1n8I4QA==", - "dependencies": { - "ascli": "~1", - "bytebuffer": "~5", - "glob": "^7.0.5", - "yargs": "^3.10.0" - }, - "bin": { - "pbjs": "bin/pbjs" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/grpc/node_modules/string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==", - "dependencies": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grpc/node_modules/strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", - "dependencies": { - "ansi-regex": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grpc/node_modules/wrap-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha512-vAaEaDM946gbNpH5pLVNR+vX2ht6n0Bt3GXwVB1AuAqZosOvHNF3P7wDnh8KLkSqgUh0uh77le7Owgoz+Z9XBw==", - "dependencies": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grpc/node_modules/y18n": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.2.tgz", - "integrity": "sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==" - }, - "node_modules/grpc/node_modules/yargs": { - "version": "3.32.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.32.0.tgz", - "integrity": "sha512-ONJZiimStfZzhKamYvR/xvmgW3uEkAUFSP91y2caTEPhzF6uP2JfPiVZcq66b/YR0C3uitxSV7+T1x8p5bkmMg==", - "dependencies": { - "camelcase": "^2.0.1", - "cliui": "^3.0.3", - "decamelize": "^1.1.1", - "os-locale": "^1.4.0", - "string-width": "^1.0.1", - "window-size": "^0.1.4", - "y18n": "^3.2.0" - } - }, "node_modules/handlebars": { "version": "4.7.7", "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz", @@ -2061,7 +2004,8 @@ "node_modules/has-unicode": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==" + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", + "dev": true }, "node_modules/html-escaper": { "version": "2.0.2", @@ -2088,6 +2032,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dev": true, "dependencies": { "agent-base": "6", "debug": "4" @@ -2178,14 +2123,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/invert-kv": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", - "integrity": "sha512-xgs2NH9AE66ucSq4cNG1nhSFghr5l6tdL15Pk+jl46bmmBapgoaY/AacXyaDznAqmGL99TiLSQgO/XazFSKYeQ==", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/ipaddr.js": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", @@ -2345,17 +2282,6 @@ "graceful-fs": "^4.1.6" } }, - "node_modules/lcid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", - "integrity": "sha512-YiGkH6EnGrDGqLMITnGjXtGmNtjoXw9SVUzcaos8RBi7Ps0VBylkq+vOcY9QE5poLasPCR849ucFUkl0UzUyOw==", - "dependencies": { - "invert-kv": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/local-pkg": { "version": "0.4.3", "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.4.3.tgz", @@ -2388,10 +2314,10 @@ "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==" }, - "node_modules/lodash.clone": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.clone/-/lodash.clone-4.5.0.tgz", - "integrity": "sha512-GhrVeweiTD6uTmmn5hV/lzgCQhccwReIVRLHp7LT4SopOjqEZ5BbX8b5WWEtAKasjmy8hR7ZPwsYlxRCku5odg==" + "node_modules/long": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", + "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" }, "node_modules/loupe": { "version": "2.3.6", @@ -2406,6 +2332,7 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, "dependencies": { "yallist": "^4.0.0" }, @@ -2429,6 +2356,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, "dependencies": { "semver": "^6.0.0" }, @@ -2443,6 +2371,7 @@ "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, "bin": { "semver": "bin/semver.js" } @@ -2562,6 +2491,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "dev": true, "engines": { "node": ">=8" } @@ -2570,6 +2500,7 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dev": true, "dependencies": { "minipass": "^3.0.0", "yallist": "^4.0.0" @@ -2582,6 +2513,7 @@ "version": "3.3.6", "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, "dependencies": { "yallist": "^4.0.0" }, @@ -2593,6 +2525,7 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, "bin": { "mkdirp": "bin/cmd.js" }, @@ -2621,7 +2554,8 @@ "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true }, "node_modules/multistream": { "version": "4.1.0", @@ -2647,11 +2581,6 @@ "readable-stream": "^3.6.0" } }, - "node_modules/nan": { - "version": "2.17.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.17.0.tgz", - "integrity": "sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ==" - }, "node_modules/nanoid": { "version": "3.3.6", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", @@ -2706,6 +2635,7 @@ "version": "2.6.12", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.12.tgz", "integrity": "sha512-C/fGU2E8ToujUivIO0H+tpQ6HWo4eEmchoPIoXtxCrVghxdKq+QOHqEZW7tuP3KlV3bC8FRMO5nMCC7Zm1VP6g==", + "dev": true, "dependencies": { "whatwg-url": "^5.0.0" }, @@ -2783,6 +2713,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "dev": true, "dependencies": { "abbrev": "1" }, @@ -2806,6 +2737,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", + "dev": true, "dependencies": { "are-we-there-yet": "^2.0.0", "console-control-strings": "^1.1.0", @@ -2813,18 +2745,11 @@ "set-blocking": "^2.0.0" } }, - "node_modules/number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -2856,22 +2781,6 @@ "wrappy": "1" } }, - "node_modules/optjs": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/optjs/-/optjs-3.2.2.tgz", - "integrity": "sha512-f8lTJm4LKirX+45xsFhuRNjA4f46QVLQKfGoNH7e2AEWS+24eM4XNH4pQ8Tw2LISCIvbST/wNcLdtgvgcqVaxA==" - }, - "node_modules/os-locale": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", - "integrity": "sha512-PRT7ZORmwu2MEFt4/fv3Q+mEfN4zetKxufQrkShY2oGvUms9r8otu5HfdyIFHkYXjO7laNsoVGmM2MANfuTA8g==", - "dependencies": { - "lcid": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/p-is-promise": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-3.0.0.tgz", @@ -3156,6 +3065,34 @@ "node": ">=0.4.0" } }, + "node_modules/protobufjs": { + "version": "7.2.4", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.2.4.tgz", + "integrity": "sha512-AT+RJgD2sH8phPmCf7OUZR8xGdcJRga4+1cOaXJ64hvcSkVhNcRHOwIxUatPH15+nj59WAGTDv3LSGZPEQbJaQ==", + "hasInstallScript": true, + "dependencies": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/node": ">=13.7.0", + "long": "^5.0.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/protobufjs/node_modules/long": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", + "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==" + }, "node_modules/proxy-addr": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", @@ -3270,6 +3207,7 @@ "version": "3.6.2", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -3295,7 +3233,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -3343,6 +3280,7 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, "dependencies": { "glob": "^7.1.3" }, @@ -3420,6 +3358,7 @@ "version": "7.5.4", "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, "dependencies": { "lru-cache": "^6.0.0" }, @@ -3488,7 +3427,8 @@ "node_modules/set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "dev": true }, "node_modules/setprototypeof": { "version": "1.2.0", @@ -3538,7 +3478,8 @@ "node_modules/signal-exit": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true }, "node_modules/simple-concat": { "version": "1.0.1", @@ -3687,6 +3628,7 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, "dependencies": { "safe-buffer": "~5.2.0" } @@ -3795,6 +3737,7 @@ "version": "6.1.15", "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.15.tgz", "integrity": "sha512-/zKt9UyngnxIT/EAGYuxaMYgOIJiP81ab9ZfkILq4oNLPFX50qyYmu7jRj9qeXoxmJHjGlbH0+cm2uy1WCs10A==", + "dev": true, "dependencies": { "chownr": "^2.0.0", "fs-minipass": "^2.0.0", @@ -3938,7 +3881,8 @@ "node_modules/tr46": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "dev": true }, "node_modules/ts-essentials": { "version": "9.3.2", @@ -4097,7 +4041,8 @@ "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true }, "node_modules/utils-merge": { "version": "1.0.1", @@ -4413,12 +4358,14 @@ "node_modules/webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "dev": true }, "node_modules/whatwg-url": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dev": true, "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" @@ -4459,21 +4406,11 @@ "version": "1.1.5", "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", + "dev": true, "dependencies": { "string-width": "^1.0.2 || 2 || 3 || 4" } }, - "node_modules/window-size": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.4.tgz", - "integrity": "sha512-2thx4pB0cV3h+Bw7QmMXcEbdmOzv9t0HFplJH/Lz6yu60hXYy5RT8rUu+wlIreVxWsGN20mo+MHeCSfUpQBwPw==", - "bin": { - "window-size": "cli.js" - }, - "engines": { - "node": ">= 0.10.0" - } - }, "node_modules/wordwrap": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", @@ -4484,7 +4421,6 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -4506,7 +4442,6 @@ "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true, "engines": { "node": ">=10" } @@ -4514,7 +4449,8 @@ "node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true }, "node_modules/yargs": { "version": "16.2.0", @@ -4650,6 +4586,58 @@ "dev": true, "optional": true }, + "@grpc/grpc-js": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.9.0.tgz", + "integrity": "sha512-H8+iZh+kCE6VR/Krj6W28Y/ZlxoZ1fOzsNt77nrdE3knkbSelW1Uus192xOFCxHyeszLj8i4APQkSIXjAoOxXg==", + "requires": { + "@grpc/proto-loader": "^0.7.0", + "@types/node": ">=12.12.47" + } + }, + "@grpc/proto-loader": { + "version": "0.7.8", + "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.8.tgz", + "integrity": "sha512-GU12e2c8dmdXb7XUlOgYWZ2o2i+z9/VeACkxTA/zzAe2IjclC5PnVL0lpgjhrqfpDYHzM8B1TF6pqWegMYAzlA==", + "requires": { + "@types/long": "^4.0.1", + "lodash.camelcase": "^4.3.0", + "long": "^4.0.0", + "protobufjs": "^7.2.4", + "yargs": "^17.7.2" + }, + "dependencies": { + "cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + } + }, + "yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "requires": { + "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.5", + "yargs-parser": "^21.1.1" + } + }, + "yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==" + } + } + }, "@istanbuljs/schema": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", @@ -4716,6 +4704,7 @@ "version": "1.0.11", "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.11.tgz", "integrity": "sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==", + "dev": true, "requires": { "detect-libc": "^2.0.0", "https-proxy-agent": "^5.0.0", @@ -4754,6 +4743,60 @@ "fastq": "^1.6.0" } }, + "@protobufjs/aspromise": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==" + }, + "@protobufjs/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" + }, + "@protobufjs/codegen": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", + "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" + }, + "@protobufjs/eventemitter": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", + "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==" + }, + "@protobufjs/fetch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", + "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", + "requires": { + "@protobufjs/aspromise": "^1.1.1", + "@protobufjs/inquire": "^1.1.0" + } + }, + "@protobufjs/float": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", + "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==" + }, + "@protobufjs/inquire": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", + "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==" + }, + "@protobufjs/path": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==" + }, + "@protobufjs/pool": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==" + }, + "@protobufjs/utf8": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", + "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==" + }, "@sinclair/typebox": { "version": "0.27.8", "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", @@ -4802,22 +4845,6 @@ "@types/node": "*" } }, - "@types/bytebuffer": { - "version": "5.0.44", - "resolved": "https://registry.npmjs.org/@types/bytebuffer/-/bytebuffer-5.0.44.tgz", - "integrity": "sha512-k1qonHga/SfQT02NF633i+7tIfKd+cfC/8pjnedcfuXJNMWooss/FkCgRMSnLf2WorLjbuH4bfgAZEbtyHBDoQ==", - "requires": { - "@types/long": "^3.0.0", - "@types/node": "*" - }, - "dependencies": { - "@types/long": { - "version": "3.0.32", - "resolved": "https://registry.npmjs.org/@types/long/-/long-3.0.32.tgz", - "integrity": "sha512-ZXyOOm83p7X8p3s0IYM3VeueNmHpkk/yMlP8CLeOnEcu6hIwPH7YjZBvhQkR0ZFS2DqZAxKtJ/M5fcuv3OU5BA==" - } - } - }, "@types/chai": { "version": "4.3.5", "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.5.tgz", @@ -4880,6 +4907,11 @@ "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", "dev": true }, + "@types/long": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz", + "integrity": "sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==" + }, "@types/mime": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", @@ -5005,7 +5037,8 @@ "abbrev": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true }, "accepts": { "version": "1.3.8", @@ -5032,6 +5065,7 @@ "version": "6.0.2", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, "requires": { "debug": "4" } @@ -5045,7 +5079,6 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, "requires": { "color-convert": "^2.0.1" } @@ -5063,12 +5096,14 @@ "aproba": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", - "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==" + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", + "dev": true }, "are-we-there-yet": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", + "dev": true, "requires": { "delegates": "^1.0.0", "readable-stream": "^3.6.0" @@ -5091,15 +5126,6 @@ "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", "dev": true }, - "ascli": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ascli/-/ascli-1.0.1.tgz", - "integrity": "sha512-JGQaNxpaCJz9Bd1JvVaFIHuWn9S+l3xhN17R0V/vmUDiGE0QngNMXhjlqpwqV+91plWz9Fg+Lt28Lj7p5vjs8A==", - "requires": { - "colour": "~0.7.1", - "optjs": "~3.2.2" - } - }, "assertion-error": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", @@ -5217,21 +5243,6 @@ "ieee754": "^1.1.13" } }, - "bytebuffer": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/bytebuffer/-/bytebuffer-5.0.1.tgz", - "integrity": "sha512-IuzSdmADppkZ6DlpycMkm8l9zeEq16fWtLvunEwFiYciR/BHo4E8/xs5piFquG+Za8OWmMqHF8zuRviz2LHvRQ==", - "requires": { - "long": "~3" - }, - "dependencies": { - "long": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/long/-/long-3.2.0.tgz", - "integrity": "sha512-ZYvPPOMqUwPoDsbJaR10iQJYnMuZhRTvHYl62ErLIEX7RgFlziSBUUvrt3OVfc47QlHHpzPZYP17g3Fv7oeJkg==" - } - } - }, "bytes": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", @@ -5272,11 +5283,6 @@ "get-intrinsic": "^1.0.2" } }, - "camelcase": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", - "integrity": "sha512-DLIsRzJVBQu72meAKPkWQOLcujdXT32hwdfnkI1frSiSRMK1MofjKHf+MEx0SB6fjEFXL8fBDv1dKymBlOp4Qw==" - }, "chai": { "version": "4.3.7", "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.7.tgz", @@ -5327,7 +5333,8 @@ "chownr": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==" + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "dev": true }, "cliui": { "version": "7.0.4", @@ -5340,16 +5347,10 @@ "wrap-ansi": "^7.0.0" } }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==" - }, "color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, "requires": { "color-name": "~1.1.4" } @@ -5357,18 +5358,13 @@ "color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "color-support": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", - "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==" - }, - "colour": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/colour/-/colour-0.7.1.tgz", - "integrity": "sha512-Rel466v0EnmKPcsxHo91L4kgPs/6XF7Pu2LJNszq9lXYwi5CFWEeIiRaTX5ym7PPMdj4udDHkLSVC1//JVkZQg==" + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "dev": true }, "combined-stream": { "version": "1.0.8", @@ -5386,7 +5382,8 @@ "console-control-strings": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==" + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", + "dev": true }, "content-disposition": { "version": "0.5.4", @@ -5444,15 +5441,11 @@ "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, "requires": { "ms": "2.1.2" } }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==" - }, "decompress-response": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", @@ -5490,7 +5483,8 @@ "delegates": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==" + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", + "dev": true }, "depd": { "version": "2.0.0", @@ -5505,7 +5499,8 @@ "detect-libc": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz", - "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==" + "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==", + "dev": true }, "diff": { "version": "4.0.2", @@ -5590,8 +5585,7 @@ "escalade": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" }, "escape-html": { "version": "1.0.3", @@ -5861,6 +5855,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dev": true, "requires": { "minipass": "^3.0.0" }, @@ -5869,6 +5864,7 @@ "version": "3.3.6", "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, "requires": { "yallist": "^4.0.0" } @@ -5889,6 +5885,7 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", + "dev": true, "requires": { "aproba": "^1.0.3 || ^2.0.0", "color-support": "^1.1.2", @@ -5904,8 +5901,7 @@ "get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" }, "get-func-name": { "version": "2.0.0", @@ -5983,101 +5979,6 @@ "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", "dev": true }, - "grpc": { - "version": "1.24.11", - "resolved": "https://registry.npmjs.org/grpc/-/grpc-1.24.11.tgz", - "integrity": "sha512-8/AQdFCzCeCDWW3SoaMNp6ccbRvTQEH1O1u1uFtt29eWsg5gSZCJ3m6fbkduEIh3smY7WAPP+LgVJ5n3nZRxcA==", - "requires": { - "@mapbox/node-pre-gyp": "^1.0.4", - "@types/bytebuffer": "^5.0.40", - "lodash.camelcase": "^4.3.0", - "lodash.clone": "^4.5.0", - "nan": "^2.13.2", - "protobufjs": "^5.0.3" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==" - }, - "cliui": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", - "integrity": "sha512-0yayqDxWQbqk3ojkYqUKqaAQ6AfNKeKWRNA8kR0WXzAsdHpP4BIaOmMAG87JGuO6qcobyW4GjxHd9PmhEd+T9w==", - "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wrap-ansi": "^2.0.0" - } - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==", - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "protobufjs": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-5.0.3.tgz", - "integrity": "sha512-55Kcx1MhPZX0zTbVosMQEO5R6/rikNXd9b6RQK4KSPcrSIIwoXTtebIczUrXlwaSrbz4x8XUVThGPob1n8I4QA==", - "requires": { - "ascli": "~1", - "bytebuffer": "~5", - "glob": "^7.0.5", - "yargs": "^3.10.0" - } - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==", - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "wrap-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha512-vAaEaDM946gbNpH5pLVNR+vX2ht6n0Bt3GXwVB1AuAqZosOvHNF3P7wDnh8KLkSqgUh0uh77le7Owgoz+Z9XBw==", - "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1" - } - }, - "y18n": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.2.tgz", - "integrity": "sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==" - }, - "yargs": { - "version": "3.32.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.32.0.tgz", - "integrity": "sha512-ONJZiimStfZzhKamYvR/xvmgW3uEkAUFSP91y2caTEPhzF6uP2JfPiVZcq66b/YR0C3uitxSV7+T1x8p5bkmMg==", - "requires": { - "camelcase": "^2.0.1", - "cliui": "^3.0.3", - "decamelize": "^1.1.1", - "os-locale": "^1.4.0", - "string-width": "^1.0.1", - "window-size": "^0.1.4", - "y18n": "^3.2.0" - } - } - } - }, "grpc_tools_node_protoc_ts": { "version": "5.3.3", "resolved": "https://registry.npmjs.org/grpc_tools_node_protoc_ts/-/grpc_tools_node_protoc_ts-5.3.3.tgz", @@ -6145,7 +6046,8 @@ "has-unicode": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==" + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", + "dev": true }, "html-escaper": { "version": "2.0.2", @@ -6169,6 +6071,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dev": true, "requires": { "agent-base": "6", "debug": "4" @@ -6230,11 +6133,6 @@ "p-is-promise": "^3.0.0" } }, - "invert-kv": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", - "integrity": "sha512-xgs2NH9AE66ucSq4cNG1nhSFghr5l6tdL15Pk+jl46bmmBapgoaY/AacXyaDznAqmGL99TiLSQgO/XazFSKYeQ==" - }, "ipaddr.js": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", @@ -6350,14 +6248,6 @@ "universalify": "^2.0.0" } }, - "lcid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", - "integrity": "sha512-YiGkH6EnGrDGqLMITnGjXtGmNtjoXw9SVUzcaos8RBi7Ps0VBylkq+vOcY9QE5poLasPCR849ucFUkl0UzUyOw==", - "requires": { - "invert-kv": "^1.0.0" - } - }, "local-pkg": { "version": "0.4.3", "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.4.3.tgz", @@ -6378,10 +6268,10 @@ "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==" }, - "lodash.clone": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.clone/-/lodash.clone-4.5.0.tgz", - "integrity": "sha512-GhrVeweiTD6uTmmn5hV/lzgCQhccwReIVRLHp7LT4SopOjqEZ5BbX8b5WWEtAKasjmy8hR7ZPwsYlxRCku5odg==" + "long": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", + "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" }, "loupe": { "version": "2.3.6", @@ -6396,6 +6286,7 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, "requires": { "yallist": "^4.0.0" } @@ -6413,6 +6304,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, "requires": { "semver": "^6.0.0" }, @@ -6420,7 +6312,8 @@ "semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true } } }, @@ -6502,12 +6395,14 @@ "minipass": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==" + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "dev": true }, "minizlib": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dev": true, "requires": { "minipass": "^3.0.0", "yallist": "^4.0.0" @@ -6517,6 +6412,7 @@ "version": "3.3.6", "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, "requires": { "yallist": "^4.0.0" } @@ -6526,7 +6422,8 @@ "mkdirp": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true }, "mkdirp-classic": { "version": "0.5.3", @@ -6549,7 +6446,8 @@ "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true }, "multistream": { "version": "4.1.0", @@ -6561,11 +6459,6 @@ "readable-stream": "^3.6.0" } }, - "nan": { - "version": "2.17.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.17.0.tgz", - "integrity": "sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ==" - }, "nanoid": { "version": "3.3.6", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", @@ -6602,6 +6495,7 @@ "version": "2.6.12", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.12.tgz", "integrity": "sha512-C/fGU2E8ToujUivIO0H+tpQ6HWo4eEmchoPIoXtxCrVghxdKq+QOHqEZW7tuP3KlV3bC8FRMO5nMCC7Zm1VP6g==", + "dev": true, "requires": { "whatwg-url": "^5.0.0" } @@ -6654,6 +6548,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "dev": true, "requires": { "abbrev": "1" } @@ -6668,6 +6563,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", + "dev": true, "requires": { "are-we-there-yet": "^2.0.0", "console-control-strings": "^1.1.0", @@ -6675,15 +6571,11 @@ "set-blocking": "^2.0.0" } }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==" - }, "object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==" + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true }, "object-inspect": { "version": "1.12.3", @@ -6706,19 +6598,6 @@ "wrappy": "1" } }, - "optjs": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/optjs/-/optjs-3.2.2.tgz", - "integrity": "sha512-f8lTJm4LKirX+45xsFhuRNjA4f46QVLQKfGoNH7e2AEWS+24eM4XNH4pQ8Tw2LISCIvbST/wNcLdtgvgcqVaxA==" - }, - "os-locale": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", - "integrity": "sha512-PRT7ZORmwu2MEFt4/fv3Q+mEfN4zetKxufQrkShY2oGvUms9r8otu5HfdyIFHkYXjO7laNsoVGmM2MANfuTA8g==", - "requires": { - "lcid": "^1.0.0" - } - }, "p-is-promise": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-3.0.0.tgz", @@ -6917,6 +6796,32 @@ "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", "dev": true }, + "protobufjs": { + "version": "7.2.4", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.2.4.tgz", + "integrity": "sha512-AT+RJgD2sH8phPmCf7OUZR8xGdcJRga4+1cOaXJ64hvcSkVhNcRHOwIxUatPH15+nj59WAGTDv3LSGZPEQbJaQ==", + "requires": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/node": ">=13.7.0", + "long": "^5.0.0" + }, + "dependencies": { + "long": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", + "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==" + } + } + }, "proxy-addr": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", @@ -6999,6 +6904,7 @@ "version": "3.6.2", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, "requires": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -7017,8 +6923,7 @@ "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "dev": true + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==" }, "resolve": { "version": "1.22.2", @@ -7052,6 +6957,7 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, "requires": { "glob": "^7.1.3" } @@ -7088,6 +6994,7 @@ "version": "7.5.4", "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, "requires": { "lru-cache": "^6.0.0" } @@ -7148,7 +7055,8 @@ "set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "dev": true }, "setprototypeof": { "version": "1.2.0", @@ -7189,7 +7097,8 @@ "signal-exit": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true }, "simple-concat": { "version": "1.0.1", @@ -7297,6 +7206,7 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, "requires": { "safe-buffer": "~5.2.0" } @@ -7377,6 +7287,7 @@ "version": "6.1.15", "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.15.tgz", "integrity": "sha512-/zKt9UyngnxIT/EAGYuxaMYgOIJiP81ab9ZfkILq4oNLPFX50qyYmu7jRj9qeXoxmJHjGlbH0+cm2uy1WCs10A==", + "dev": true, "requires": { "chownr": "^2.0.0", "fs-minipass": "^2.0.0", @@ -7491,7 +7402,8 @@ "tr46": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "dev": true }, "ts-essentials": { "version": "9.3.2", @@ -7595,7 +7507,8 @@ "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true }, "utils-merge": { "version": "1.0.1", @@ -7761,12 +7674,14 @@ "webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "dev": true }, "whatwg-url": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dev": true, "requires": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" @@ -7795,15 +7710,11 @@ "version": "1.1.5", "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", + "dev": true, "requires": { "string-width": "^1.0.2 || 2 || 3 || 4" } }, - "window-size": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.4.tgz", - "integrity": "sha512-2thx4pB0cV3h+Bw7QmMXcEbdmOzv9t0HFplJH/Lz6yu60hXYy5RT8rUu+wlIreVxWsGN20mo+MHeCSfUpQBwPw==" - }, "wordwrap": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", @@ -7814,7 +7725,6 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, "requires": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -7829,13 +7739,13 @@ "y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==" }, "yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true }, "yargs": { "version": "16.2.0", diff --git a/services/gateway/package.json b/services/gateway/package.json index f4920a50..d9605784 100644 --- a/services/gateway/package.json +++ b/services/gateway/package.json @@ -8,17 +8,18 @@ "build": "esbuild src/server.ts --bundle --platform=node --target=node18 --outfile=dist/index.js", "test": "vitest", "coverage": "vitest --coverage", + "generate:proto": "sh proto/build-protos.sh", "swagger": "node src/utils/swagger.utils.js", "pkg": "pkg ." }, "dependencies": { + "@grpc/grpc-js": "^1.9.0", "@types/express": "^4.17.17", "axios": "^1.4.0", "body-parser": "^1.20.2", "dotenv": "^16.0.3", "express": "^4.18.2", "google-protobuf": "^3.21.2", - "grpc": "^1.24.11", "swagger-autogen": "^2.23.5" }, "devDependencies": { diff --git a/services/gateway/src/services/clients/delivery.client.ts b/services/gateway/src/services/clients/delivery.client.ts index 6ec48147..9c57b5dc 100644 --- a/services/gateway/src/services/clients/delivery.client.ts +++ b/services/gateway/src/services/clients/delivery.client.ts @@ -1,5 +1,5 @@ import services from '../../proto/delivery_grpc_pb'; -import * as grpc from "grpc"; +import * as grpc from '@grpc/grpc-js'; // TODO: add delivery env export const deliveryServiceClient = new services.DeliveryServiceClient( diff --git a/services/gateway/src/services/clients/log.client.ts b/services/gateway/src/services/clients/log.client.ts index 5abe375e..25f114c0 100644 --- a/services/gateway/src/services/clients/log.client.ts +++ b/services/gateway/src/services/clients/log.client.ts @@ -1,5 +1,5 @@ import services from '../../proto/log_grpc_pb'; -import * as grpc from "grpc"; +import * as grpc from '@grpc/grpc-js'; // TODO: add log env export const logServiceClient = new services.LogServiceClient( diff --git a/services/gateway/src/services/clients/metric.client.ts b/services/gateway/src/services/clients/metric.client.ts index 8a9232e5..dbe86d30 100644 --- a/services/gateway/src/services/clients/metric.client.ts +++ b/services/gateway/src/services/clients/metric.client.ts @@ -1,5 +1,5 @@ import services from '../../proto/metric_grpc_pb'; -import * as grpc from "grpc"; +import * as grpc from '@grpc/grpc-js'; // TODO: add metric env export default new services.ReportingServiceClient( diff --git a/services/gateway/src/services/clients/order.client.ts b/services/gateway/src/services/clients/order.client.ts index fc3efbd3..36363532 100644 --- a/services/gateway/src/services/clients/order.client.ts +++ b/services/gateway/src/services/clients/order.client.ts @@ -1,5 +1,5 @@ import services from '../../proto/order_grpc_pb'; -import * as grpc from "grpc"; +import * as grpc from '@grpc/grpc-js'; // TODO: add order env export default new services.OrderServiceClient( diff --git a/services/gateway/src/services/clients/product.client.ts b/services/gateway/src/services/clients/product.client.ts index 7eb30f74..4ec9837b 100644 --- a/services/gateway/src/services/clients/product.client.ts +++ b/services/gateway/src/services/clients/product.client.ts @@ -1,4 +1,4 @@ -import * as grpc from "grpc"; +import * as grpc from '@grpc/grpc-js'; import {AllergenServiceClient, CategoryServiceClient, ProductServiceClient} from "@gateway/proto/product_grpc_pb"; // TODO: add order env diff --git a/services/gateway/src/services/clients/promotions.client.ts b/services/gateway/src/services/clients/promotions.client.ts index 063781eb..c0a00fc7 100644 --- a/services/gateway/src/services/clients/promotions.client.ts +++ b/services/gateway/src/services/clients/promotions.client.ts @@ -1,5 +1,5 @@ import services from '../../proto/promotions_grpc_pb'; -import * as grpc from "grpc"; +import * as grpc from '@grpc/grpc-js'; // TODO: add promotions env export const promotionsServiceClient = new services.PromotionServiceClient( diff --git a/services/gateway/src/services/clients/stock.client.ts b/services/gateway/src/services/clients/stock.client.ts index 6e59e8b6..5c4a3aec 100644 --- a/services/gateway/src/services/clients/stock.client.ts +++ b/services/gateway/src/services/clients/stock.client.ts @@ -1,5 +1,5 @@ import services from '../../proto/stock_grpc_pb'; -import * as grpc from "grpc"; +import * as grpc from '@grpc/grpc-js'; // TODO: add stock env export const stockServiceClient = new services.StockServiceClient( diff --git a/services/gateway/src/services/clients/user.client.ts b/services/gateway/src/services/clients/user.client.ts index 6b53adba..be1aa52d 100644 --- a/services/gateway/src/services/clients/user.client.ts +++ b/services/gateway/src/services/clients/user.client.ts @@ -1,5 +1,5 @@ import services from '../../proto/user_grpc_pb'; -import * as grpc from "grpc"; +import * as grpc from '@grpc/grpc-js'; export const userServiceClient = new services.UserServiceClient( 'http://localhost:50001', From 18f14108ff51798dcb949b5677790cf677b562cf Mon Sep 17 00:00:00 2001 From: anatole Date: Mon, 14 Aug 2023 00:41:33 +0200 Subject: [PATCH 410/883] feat(gateway): add services port in the dot env and create dockerfile --- services/gateway/.env.example | 13 ++++++++- services/gateway/Dockerfile | 9 ++---- .../promotion.controller.ts} | 28 +++++++++---------- services/gateway/src/server.ts | 2 +- .../src/services/clients/delivery.client.ts | 7 +++-- .../src/services/clients/log.client.ts | 5 ++-- .../src/services/clients/metric.client.ts | 5 ++-- .../src/services/clients/order.client.ts | 5 ++-- .../src/services/clients/product.client.ts | 9 +++--- .../src/services/clients/promotion.client.ts | 8 ++++++ .../src/services/clients/promotions.client.ts | 7 ----- .../src/services/clients/stock.client.ts | 7 +++-- .../src/services/clients/user.client.ts | 6 ++-- services/gateway/src/utils/swagger.utils.js | 2 +- services/proto/build-protos.sh | 2 +- 15 files changed, 65 insertions(+), 50 deletions(-) rename services/gateway/src/controller/{promotions/promotions.controller.ts => promotion/promotion.controller.ts} (61%) create mode 100644 services/gateway/src/services/clients/promotion.client.ts delete mode 100644 services/gateway/src/services/clients/promotions.client.ts diff --git a/services/gateway/.env.example b/services/gateway/.env.example index 125a90fe..0389f414 100644 --- a/services/gateway/.env.example +++ b/services/gateway/.env.example @@ -1 +1,12 @@ -PORT=50000 \ No newline at end of file +GATEWAY_PORT=50000 +GATEWAY_USER_URL=user-service:50001 +GATEWAY_BASKET_URL=50002 +GATEWAY_PAYMENT_URL=50003 +GATEWAY_PRODUCT_URL=product-service:50004 +GATEWAY_RESTAURANT_URL=50005 +GATEWAY_PROMOTION_URL=promotion-service:50006 +GATEWAY_ORDER_URL=order-service:50007 +GATEWAY_DELIVERY_URL=delivery-service:50008 +GATEWAY_STOCK_URL=stock-service:50009 +GATEWAY_REPORTING_URL=reporting-service:50020 +GATEWAY_LOG_URL=log-service:50021 diff --git a/services/gateway/Dockerfile b/services/gateway/Dockerfile index 6e37d753..49291bc7 100644 --- a/services/gateway/Dockerfile +++ b/services/gateway/Dockerfile @@ -4,7 +4,7 @@ FROM node:18-alpine3.17 as builder WORKDIR /app # Copy the application code -COPY ./order/ . +COPY ./gateway/ . # Install dependencies RUN npm install @@ -12,9 +12,6 @@ RUN npm install # Copy the proto files COPY ./proto ./proto/ -# Generate Prisma client -RUN npx prisma generate - # Build the application RUN npm run build @@ -27,12 +24,10 @@ WORKDIR /app # Copy the application package COPY --from=builder /app/dist . -COPY --from=builder /app/prisma/ . COPY --from=builder /app/proto/ /proto/ -COPY --from=builder /app/node_modules/.prisma /.prisma # Expose the gRPC port -EXPOSE 50007 +EXPOSE 50000 # Start the server CMD [ "node", "index.js"] diff --git a/services/gateway/src/controller/promotions/promotions.controller.ts b/services/gateway/src/controller/promotion/promotion.controller.ts similarity index 61% rename from services/gateway/src/controller/promotions/promotions.controller.ts rename to services/gateway/src/controller/promotion/promotion.controller.ts index 66ac92e6..5787c9f9 100644 --- a/services/gateway/src/controller/promotions/promotions.controller.ts +++ b/services/gateway/src/controller/promotion/promotion.controller.ts @@ -1,13 +1,13 @@ import {Router} from "express"; -import {promotionsServiceClient} from "@gateway/services/clients/promotions.client"; +import {promotionServiceClient} from "@gateway/services/clients/promotion.client"; import {Empty} from "google-protobuf/google/protobuf/empty_pb"; import {Promotion, PromotionCode, PromotionCreateInput, PromotionId, RestaurantId} from "@gateway/proto/promotions_pb"; -export const promotionsRoutes = Router(); +export const promotionRoutes = Router(); -promotionsRoutes.get('/api/promotions/:code', (req, res) => { +promotionRoutes.get('/api/promotion/:code', (req, res) => { const {code} = req.params; - promotionsServiceClient.getPromotion(new PromotionCode().setCode(code), (error, response) => { + promotionServiceClient.getPromotion(new PromotionCode().setCode(code), (error, response) => { if (error) { res.json({error: error.message}); } else { @@ -16,8 +16,8 @@ promotionsRoutes.get('/api/promotions/:code', (req, res) => { }); }); -promotionsRoutes.get('/api/promotions', (req, res) => { - promotionsServiceClient.getPromotions(new Empty(), (error, response) => { +promotionRoutes.get('/api/promotion', (req, res) => { + promotionServiceClient.getPromotions(new Empty(), (error, response) => { if (error) { res.json({error: error.message}); } else { @@ -26,9 +26,9 @@ promotionsRoutes.get('/api/promotions', (req, res) => { }); }); -promotionsRoutes.get('/api/promotions/by-restaurant/:restaurantId', (req, res) => { +promotionRoutes.get('/api/promotion/by-restaurant/:restaurantId', (req, res) => { const {restaurantId} = req.params; - promotionsServiceClient.getPromotionsByRestaurant(new RestaurantId().setId(restaurantId), (error, response) => { + promotionServiceClient.getPromotionsByRestaurant(new RestaurantId().setId(restaurantId), (error, response) => { if (error) { res.json({error: error.message}); } else { @@ -37,13 +37,13 @@ promotionsRoutes.get('/api/promotions/by-restaurant/:restaurantId', (req, res) = }); }); -promotionsRoutes.post('/api/promotions', (req, res) => { +promotionRoutes.post('/api/promotion', (req, res) => { const {code, reduction, method, restaurantId} = req.body; const promotionCreateInput = new PromotionCreateInput().setCode(code) .setReduction(reduction) .setMethod(method) .setRestaurantId(restaurantId); - promotionsServiceClient.createPromotion(promotionCreateInput, (error, response) => { + promotionServiceClient.createPromotion(promotionCreateInput, (error, response) => { if (error) { res.json({error: error.message}); } else { @@ -52,7 +52,7 @@ promotionsRoutes.post('/api/promotions', (req, res) => { }); }); -promotionsRoutes.put('/api/promotions/:id', (req, res) => { +promotionRoutes.put('/api/promotion/:id', (req, res) => { const {id} = req.params; const {code, reduction, method, restaurantId} = req.body; const promotionUpdateInput = new Promotion().setId(id).setCode(code) @@ -60,7 +60,7 @@ promotionsRoutes.put('/api/promotions/:id', (req, res) => { .setMethod(method) .setRestaurantId(restaurantId); - promotionsServiceClient.createPromotion(promotionUpdateInput, (error, response) => { + promotionServiceClient.createPromotion(promotionUpdateInput, (error, response) => { if (error) { res.json({error: error.message}); } else { @@ -69,10 +69,10 @@ promotionsRoutes.put('/api/promotions/:id', (req, res) => { }); }); -promotionsRoutes.delete('/api/promotions/:id', (req, res) => { +promotionRoutes.delete('/api/promotion/:id', (req, res) => { const {id} = req.params; - promotionsServiceClient.deletePromotion(new PromotionId().setId(id), (error, response) => { + promotionServiceClient.deletePromotion(new PromotionId().setId(id), (error, response) => { if (error) { res.json({error: error.message}); } else { diff --git a/services/gateway/src/server.ts b/services/gateway/src/server.ts index 8bb20b12..8a289c5e 100644 --- a/services/gateway/src/server.ts +++ b/services/gateway/src/server.ts @@ -17,7 +17,7 @@ const bodyParser = require('body-parser'); const app = express(); app.use(bodyParser.json()); -const PORT = process.env.PORT || 50000; +const PORT = process.env.GATEWAY_PORT || 50000; app.use('/', userRoutes // #swagger.tags = ['User'] diff --git a/services/gateway/src/services/clients/delivery.client.ts b/services/gateway/src/services/clients/delivery.client.ts index 9c57b5dc..a7cb34ca 100644 --- a/services/gateway/src/services/clients/delivery.client.ts +++ b/services/gateway/src/services/clients/delivery.client.ts @@ -1,11 +1,12 @@ import services from '../../proto/delivery_grpc_pb'; import * as grpc from '@grpc/grpc-js'; -// TODO: add delivery env +const url = process.env.GATEWAY_DELIVERY_URL || "localhost:50008"; + export const deliveryServiceClient = new services.DeliveryServiceClient( - 'http://localhost:50007', + url, grpc.credentials.createInsecure()); export const deliveryPersonServiceClient = new services.DeliveryPersonServiceClient( - 'http://localhost:50007', + url, grpc.credentials.createInsecure()); \ No newline at end of file diff --git a/services/gateway/src/services/clients/log.client.ts b/services/gateway/src/services/clients/log.client.ts index 25f114c0..bcc4e818 100644 --- a/services/gateway/src/services/clients/log.client.ts +++ b/services/gateway/src/services/clients/log.client.ts @@ -1,7 +1,8 @@ import services from '../../proto/log_grpc_pb'; import * as grpc from '@grpc/grpc-js'; -// TODO: add log env +const url = process.env.GATEWAY_LOG_URL || "localhost:50021"; + export const logServiceClient = new services.LogServiceClient( - 'http://localhost:50007', + url, grpc.credentials.createInsecure()); \ No newline at end of file diff --git a/services/gateway/src/services/clients/metric.client.ts b/services/gateway/src/services/clients/metric.client.ts index dbe86d30..0d9a2a7b 100644 --- a/services/gateway/src/services/clients/metric.client.ts +++ b/services/gateway/src/services/clients/metric.client.ts @@ -1,7 +1,8 @@ import services from '../../proto/metric_grpc_pb'; import * as grpc from '@grpc/grpc-js'; -// TODO: add metric env +const url = process.env.GATEWAY_REPORTING_URL || "localhost:50020"; + export default new services.ReportingServiceClient( - 'http://localhost:50007', + url, grpc.credentials.createInsecure()); \ No newline at end of file diff --git a/services/gateway/src/services/clients/order.client.ts b/services/gateway/src/services/clients/order.client.ts index 36363532..22d034ca 100644 --- a/services/gateway/src/services/clients/order.client.ts +++ b/services/gateway/src/services/clients/order.client.ts @@ -1,7 +1,8 @@ import services from '../../proto/order_grpc_pb'; import * as grpc from '@grpc/grpc-js'; -// TODO: add order env +const url = process.env.GATEWAY_ORDER_URL || "localhost:50007"; + export default new services.OrderServiceClient( - 'http://localhost:50007', + url, grpc.credentials.createInsecure()); \ No newline at end of file diff --git a/services/gateway/src/services/clients/product.client.ts b/services/gateway/src/services/clients/product.client.ts index 4ec9837b..b19c3b97 100644 --- a/services/gateway/src/services/clients/product.client.ts +++ b/services/gateway/src/services/clients/product.client.ts @@ -1,15 +1,16 @@ import * as grpc from '@grpc/grpc-js'; import {AllergenServiceClient, CategoryServiceClient, ProductServiceClient} from "@gateway/proto/product_grpc_pb"; -// TODO: add order env +const url = process.env.GATEWAY_PRODUCT_URL || "localhost:50004"; + export const categoryServiceClient = new CategoryServiceClient( - 'http://localhost:50007', + url, grpc.credentials.createInsecure()); export const allergenServiceClient = new AllergenServiceClient( - 'http://localhost:50007', + url, grpc.credentials.createInsecure()); export const productServiceClient = new ProductServiceClient( - 'http://localhost:50007', + url, grpc.credentials.createInsecure()); \ No newline at end of file diff --git a/services/gateway/src/services/clients/promotion.client.ts b/services/gateway/src/services/clients/promotion.client.ts new file mode 100644 index 00000000..38326c3a --- /dev/null +++ b/services/gateway/src/services/clients/promotion.client.ts @@ -0,0 +1,8 @@ +import services from '../../proto/promotions_grpc_pb'; +import * as grpc from '@grpc/grpc-js'; + +const url = process.env.GATEWAY_PROMOTION_URL || "localhost:50006"; + +export const promotionServiceClient = new services.PromotionServiceClient( + url, + grpc.credentials.createInsecure()); \ No newline at end of file diff --git a/services/gateway/src/services/clients/promotions.client.ts b/services/gateway/src/services/clients/promotions.client.ts deleted file mode 100644 index c0a00fc7..00000000 --- a/services/gateway/src/services/clients/promotions.client.ts +++ /dev/null @@ -1,7 +0,0 @@ -import services from '../../proto/promotions_grpc_pb'; -import * as grpc from '@grpc/grpc-js'; - -// TODO: add promotions env -export const promotionsServiceClient = new services.PromotionServiceClient( - 'http://localhost:50007', - grpc.credentials.createInsecure()); \ No newline at end of file diff --git a/services/gateway/src/services/clients/stock.client.ts b/services/gateway/src/services/clients/stock.client.ts index 5c4a3aec..f06291cb 100644 --- a/services/gateway/src/services/clients/stock.client.ts +++ b/services/gateway/src/services/clients/stock.client.ts @@ -1,11 +1,12 @@ import services from '../../proto/stock_grpc_pb'; import * as grpc from '@grpc/grpc-js'; -// TODO: add stock env +const url = process.env.GATEWAY_STOCK_URL || "localhost:50009"; + export const stockServiceClient = new services.StockServiceClient( - 'http://localhost:50007', + url, grpc.credentials.createInsecure()); export const stockPersonServiceClient = new services.StockReportingServiceClient( - 'http://localhost:50007', + url, grpc.credentials.createInsecure()); \ No newline at end of file diff --git a/services/gateway/src/services/clients/user.client.ts b/services/gateway/src/services/clients/user.client.ts index be1aa52d..2828d883 100644 --- a/services/gateway/src/services/clients/user.client.ts +++ b/services/gateway/src/services/clients/user.client.ts @@ -1,10 +1,12 @@ import services from '../../proto/user_grpc_pb'; import * as grpc from '@grpc/grpc-js'; +const url = process.env.GATEWAY_USER_URL || "localhost:50001"; + export const userServiceClient = new services.UserServiceClient( - 'http://localhost:50001', + url, grpc.credentials.createInsecure()); export const mainAddressServiceClient = new services.MainAddressServiceClient( - 'http://localhost:50001', + url, grpc.credentials.createInsecure()); \ No newline at end of file diff --git a/services/gateway/src/utils/swagger.utils.js b/services/gateway/src/utils/swagger.utils.js index a882635b..22323e2c 100644 --- a/services/gateway/src/utils/swagger.utils.js +++ b/services/gateway/src/utils/swagger.utils.js @@ -5,7 +5,7 @@ const doc = { title: 'The Gateway API', description: 'The Gateway API for the Microservices', }, - host: `localhost:${process.env.PORT || 50000}` + host: `localhost:${process.env.GATEWAY_PORT || 50000}` }; const outputFile = './swagger-output.json'; diff --git a/services/proto/build-protos.sh b/services/proto/build-protos.sh index 3334dd19..b2c08606 100644 --- a/services/proto/build-protos.sh +++ b/services/proto/build-protos.sh @@ -20,4 +20,4 @@ yarn run grpc_tools_node_protoc \ --plugin=protoc-gen-ts=./node_modules/.bin/protoc-gen-ts \ --ts_out=${PROTO_DEST} \ -I ./proto \ - proto/*.proto \ No newline at end of file + proto/*.proto From e52b85cf9377138c0c2371b2200e00115211ed5a Mon Sep 17 00:00:00 2001 From: anatole Date: Mon, 14 Aug 2023 01:05:46 +0200 Subject: [PATCH 411/883] feat(gateway): add docker compose to start all services --- services/docker-compose.yml | 59 +++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 services/docker-compose.yml diff --git a/services/docker-compose.yml b/services/docker-compose.yml new file mode 100644 index 00000000..d33b434f --- /dev/null +++ b/services/docker-compose.yml @@ -0,0 +1,59 @@ +version: "3" +services: + # gateway: + gateway: + image: goodfood-gateway:1.0.0 + build: + context: . + dockerfile: ./gateway/Dockerfile + + env_file: + - ./gateway/.env + ports: + - "50000:50000" + networks: + - goodfood-network + + # delivery-service: + delivery-redis: + image: redis:latest + ports: + - "6379:6379" + volumes: + - goodfood-delivery-volume:/data + networks: + - goodfood-network + command: redis-server --appendonly yes + environment: + REDIS_USERNAME: redis + REDIS_PASSWORD: password + + delivery-postgres: + image: postgres:latest + ports: + - "5432:5432" + volumes: + - goodfood-delivery-volume:/var/lib/postgresql/data + networks: + - goodfood-network + environment: + POSTGRES_USER: postgres + POSTGRES_PASSWORD: password + POSTGRES_DB: postgres + PGDATA: /var/lib/postgresql/data/pgdata + + delivery-service: + image: goodfood-delivery:1.0.0 + build: + context: . + dockerfile: ./delivery/Dockerfile + env_file: + - ./delivery/.env + ports: + - "50008:50008" + +volumes: + goodfood-delivery-volume: + +networks: + goodfood-network: \ No newline at end of file From f8a69c66dcfe2422f5e4a4bc2d3ccc1a7f83010d Mon Sep 17 00:00:00 2001 From: anatole Date: Tue, 15 Aug 2023 14:28:13 +0200 Subject: [PATCH 412/883] feat(gateway): add the basket controller --- services/gateway/.env.example | 2 +- .../controller/basket/basket.controller.ts | 67 +++++++++++++++++++ .../src/services/clients/basket.client.ts | 8 +++ 3 files changed, 76 insertions(+), 1 deletion(-) create mode 100644 services/gateway/src/controller/basket/basket.controller.ts create mode 100644 services/gateway/src/services/clients/basket.client.ts diff --git a/services/gateway/.env.example b/services/gateway/.env.example index 0389f414..294a02cf 100644 --- a/services/gateway/.env.example +++ b/services/gateway/.env.example @@ -1,6 +1,6 @@ GATEWAY_PORT=50000 GATEWAY_USER_URL=user-service:50001 -GATEWAY_BASKET_URL=50002 +GATEWAY_BASKET_URL=basket-service:50002 GATEWAY_PAYMENT_URL=50003 GATEWAY_PRODUCT_URL=product-service:50004 GATEWAY_RESTAURANT_URL=50005 diff --git a/services/gateway/src/controller/basket/basket.controller.ts b/services/gateway/src/controller/basket/basket.controller.ts new file mode 100644 index 00000000..32b84506 --- /dev/null +++ b/services/gateway/src/controller/basket/basket.controller.ts @@ -0,0 +1,67 @@ +import {Request, Response, Router} from "express"; +import {ProductRequest, RestaurantRequest, UserId} from "@gateway/proto/basket_pb"; +import {basketServiceClient} from "@gateway/services/clients/basket.client"; + +export const basketRoutes = Router(); + +basketRoutes.get('/api/basket/:userId', (req: Request, res: Response) => { + const {userId} = req.params; + + basketServiceClient.getBasket(new UserId().setId(Number(userId)), (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } + }); +}); + +basketRoutes.post('/api/basket', (req: Request, res: Response) => { + const {userId, productId, restaurantId} = req.body; + const basketRequest = new ProductRequest().setUserId(userId).setProductId(productId).setRestaurantId(restaurantId); + basketServiceClient.addProduct(basketRequest, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } + } + ); +}); + +basketRoutes.delete('/api/basket', (req: Request, res: Response) => { + const {userId, productId, restaurantId} = req.body; + const basketRequest = new ProductRequest().setUserId(userId).setProductId(productId).setRestaurantId(restaurantId); + basketServiceClient.deleteProduct(basketRequest, (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } + } + ); +}); + +basketRoutes.put('/api/basket/restaurant', (req: Request, res: Response) => { + const {restaurantId, userId} = req.body; + basketServiceClient.updateRestaurant(new RestaurantRequest().setRestaurantId(restaurantId).setUserId(userId), (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } + } + ); +}); + +basketRoutes.post('/api/basket/reset', (req: Request, res: Response) => { + const {userId} = req.body; + basketServiceClient.reset(new UserId().setId(userId), (error, response) => { + if (error) { + res.json({error: error.message}); + } else { + res.json(response.toObject()); + } + } + ); +}); diff --git a/services/gateway/src/services/clients/basket.client.ts b/services/gateway/src/services/clients/basket.client.ts new file mode 100644 index 00000000..073dbc11 --- /dev/null +++ b/services/gateway/src/services/clients/basket.client.ts @@ -0,0 +1,8 @@ +import services from '../../proto/basket_grpc_pb'; +import * as grpc from '@grpc/grpc-js'; + +const url = process.env.GATEWAY_BASKET_URL || "localhost:50002"; + +export const basketServiceClient = new services.BasketServiceClient( + url, + grpc.credentials.createInsecure()); \ No newline at end of file From 25477c5844bc06d311068131772d2f0dcedc5e06 Mon Sep 17 00:00:00 2001 From: anatole Date: Tue, 15 Aug 2023 14:28:57 +0200 Subject: [PATCH 413/883] feat(gateway): add a logger --- services/gateway/src/lib/log/log.ts | 74 +++++++++++++++++++++++++++++ services/gateway/src/server.ts | 18 +++++-- 2 files changed, 88 insertions(+), 4 deletions(-) create mode 100644 services/gateway/src/lib/log/log.ts diff --git a/services/gateway/src/lib/log/log.ts b/services/gateway/src/lib/log/log.ts new file mode 100644 index 00000000..3dc6f37a --- /dev/null +++ b/services/gateway/src/lib/log/log.ts @@ -0,0 +1,74 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ +/* eslint-disable no-console */ + +function getStackTrace() { + let stack; + + try { + throw new Error(""); + } catch (error) { + stack = (error as Error).stack || ""; + } + + stack = stack.split("\n").map((line) => line.trim()); + return stack.splice(stack[0] === "Error" ? 2 : 1); +} + +const getInitiator = () => { + // _getInitiatorLine, _ObjectInfoLine, caller + const [, , caller] = getStackTrace(); + const file = caller.split("/").at(-1) || ""; + return file.replace(")", ""); +}; + +const warn = (...args: any[]) => { + console.group( + `\x1b[33m${new Date().toISOString()} - WARN - ${getInitiator()}\x1b[0m` + ); + console.warn(...args); + console.groupEnd(); +}; +const error = (...args: any[]) => { + console.group( + `\x1b[31m${new Date().toISOString()} - ERROR - ${getInitiator()}\x1b[0m` + ); + console.error(...args); + console.groupEnd(); +}; +const info = (...args: any[]) => { + console.group( + `\x1b[34m${new Date().toISOString()} - INFO - ${getInitiator()}\x1b[0m` + ); + console.log(...args); + console.groupEnd(); +}; +const debug = (...args: any[]) => { + console.log(...args); +}; + +/** + * @description a simple interface logger for logging to the console and into a log drain in the future + * @example + * log.warn('this is a warning'); + * log.error('this is an error'); + * log.info('this is an info'); + * @exports log + */ +export const log = { + warn, + error, + info, + debug, +}; + +export const utils = { + bold: (text: string) => `\x1b[1m${text}\x1b[0m`, + red: (text: string) => `\x1b[31m${text}\x1b[0m`, + green: (text: string) => `\x1b[32m${text}\x1b[0m`, + yellow: (text: string) => `\x1b[33m${text}\x1b[0m`, + blue: (text: string) => `\x1b[34m${text}\x1b[0m`, + magenta: (text: string) => `\x1b[35m${text}\x1b[0m`, + cyan: (text: string) => `\x1b[36m${text}\x1b[0m`, + white: (text: string) => `\x1b[37m${text}\x1b[0m`, + gray: (text: string) => `\x1b[90m${text}\x1b[0m`, +}; diff --git a/services/gateway/src/server.ts b/services/gateway/src/server.ts index 8a289c5e..8e7fbb0c 100644 --- a/services/gateway/src/server.ts +++ b/services/gateway/src/server.ts @@ -5,11 +5,13 @@ import {categoryRoutes} from "@gateway/controller/product/category.controller"; import {allergenRoutes} from "@gateway/controller/product/allergen.controller"; import {deliveryRoutes} from "@gateway/controller/delivery/delivery.controller"; import {deliveryPersonRoutes} from "@gateway/controller/delivery/deliveryPerson.controller"; -import {promotionsRoutes} from "@gateway/controller/promotions/promotions.controller"; +import {promotionRoutes} from "@gateway/controller/promotion/promotion.controller"; import {stockPersonRoutes} from "@gateway/controller/stock/stockPerson.controller"; import {stockRoutes} from "@gateway/controller/stock/stock.controller"; import {logRoutes} from "@gateway/controller/log/log.controller"; import {metricRoutes} from "@gateway/controller/metric/metric.controller"; +import {basketRoutes} from "@gateway/controller/basket/basket.controller"; +import {log, utils} from "@gateway/lib/log/log"; const express = require('express'); const bodyParser = require('body-parser'); @@ -22,6 +24,9 @@ const PORT = process.env.GATEWAY_PORT || 50000; app.use('/', userRoutes // #swagger.tags = ['User'] ); +app.use('/', basketRoutes +// #swagger.tags = ['Basket'] +); app.use('/', orderRoutes // #swagger.tags = ['Order'] ); @@ -46,8 +51,8 @@ app.use('/', logRoutes app.use('/', metricRoutes // #swagger.tags = ['Metric'] ); -app.use('/', promotionsRoutes -// #swagger.tags = ['Promotions'] +app.use('/', promotionRoutes +// #swagger.tags = ['Promotion'] ); app.use('/', stockRoutes // #swagger.tags = ['Stock'] @@ -57,5 +62,10 @@ app.use('/', stockPersonRoutes ); app.listen(PORT, () => { - console.log(`API Gateway is running on port ${PORT}`); + const message = `---- ${utils.green("good")}${utils.yellow( + "food" + )} Gateway ----\nstarted on: ${utils.bold(`0.0.0.0:${PORT}`)} ${utils.green( + "✓" + )}\n`; + log.debug(message); }); \ No newline at end of file From 923eb97680fbacf3c07be525a9f5f82479e6d6c7 Mon Sep 17 00:00:00 2001 From: anatole Date: Tue, 15 Aug 2023 14:29:12 +0200 Subject: [PATCH 414/883] feat(gateway): move the swagger lib --- services/gateway/package.json | 2 +- .../src/lib/swagger/swagger-output.json | 2257 +++++++++++++++++ .../{utils => lib/swagger}/swagger.utils.js | 2 +- 3 files changed, 2259 insertions(+), 2 deletions(-) create mode 100644 services/gateway/src/lib/swagger/swagger-output.json rename services/gateway/src/{utils => lib/swagger}/swagger.utils.js (92%) diff --git a/services/gateway/package.json b/services/gateway/package.json index d9605784..541b8419 100644 --- a/services/gateway/package.json +++ b/services/gateway/package.json @@ -9,7 +9,7 @@ "test": "vitest", "coverage": "vitest --coverage", "generate:proto": "sh proto/build-protos.sh", - "swagger": "node src/utils/swagger.utils.js", + "swagger": "node src/lib/swagger/swagger.utils.js", "pkg": "pkg ." }, "dependencies": { diff --git a/services/gateway/src/lib/swagger/swagger-output.json b/services/gateway/src/lib/swagger/swagger-output.json new file mode 100644 index 00000000..52ea1718 --- /dev/null +++ b/services/gateway/src/lib/swagger/swagger-output.json @@ -0,0 +1,2257 @@ +{ + "swagger": "2.0", + "info": { + "title": "The Gateway API", + "description": "The Gateway API for the Microservices", + "version": "1.0.0" + }, + "host": "localhost:50000", + "basePath": "/", + "schemes": [ + "http" + ], + "paths": { + "/api/user/{id}": { + "get": { + "tags": [ + "User" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + }, + "put": { + "tags": [ + "User" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "authorization", + "in": "header", + "type": "string" + }, + { + "name": "body", + "in": "body", + "schema": { + "type": "object", + "properties": { + "firstName": { + "example": "any" + }, + "lastName": { + "example": "any" + }, + "email": { + "example": "any" + }, + "phone": { + "example": "any" + }, + "address": { + "example": "any" + }, + "role": { + "example": "any" + } + } + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + }, + "delete": { + "tags": [ + "User" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "authorization", + "in": "header", + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/user": { + "get": { + "tags": [ + "User" + ], + "description": "", + "responses": { + "200": { + "description": "OK" + } + } + }, + "post": { + "tags": [ + "User" + ], + "description": "", + "parameters": [ + { + "name": "body", + "in": "body", + "schema": { + "type": "object", + "properties": { + "firstName": { + "example": "any" + }, + "lastName": { + "example": "any" + }, + "email": { + "example": "any" + }, + "password": { + "example": "any" + }, + "phone": { + "example": "any" + }, + "address": { + "example": "any" + }, + "role": { + "example": "any" + } + } + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/user/login": { + "post": { + "tags": [ + "User" + ], + "description": "", + "parameters": [ + { + "name": "body", + "in": "body", + "schema": { + "type": "object", + "properties": { + "email": { + "example": "any" + }, + "password": { + "example": "any" + } + } + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/user/validate": { + "post": { + "tags": [ + "User" + ], + "description": "", + "parameters": [ + { + "name": "authorization", + "in": "header", + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/user/{id}/password": { + "put": { + "tags": [ + "User" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "authorization", + "in": "header", + "type": "string" + }, + { + "name": "body", + "in": "body", + "schema": { + "type": "object", + "properties": { + "oldpassword": { + "example": "any" + }, + "password": { + "example": "any" + } + } + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/user/{id}/role": { + "put": { + "tags": [ + "User" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "authorization", + "in": "header", + "type": "string" + }, + { + "name": "body", + "in": "body", + "schema": { + "type": "object", + "properties": { + "role": { + "example": "any" + } + } + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/basket/{userId}": { + "get": { + "tags": [ + "Basket" + ], + "description": "", + "parameters": [ + { + "name": "userId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/basket": { + "post": { + "tags": [ + "Basket" + ], + "description": "", + "parameters": [ + { + "name": "body", + "in": "body", + "schema": { + "type": "object", + "properties": { + "userId": { + "example": "any" + }, + "productId": { + "example": "any" + }, + "restaurantId": { + "example": "any" + } + } + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + }, + "delete": { + "tags": [ + "Basket" + ], + "description": "", + "parameters": [ + { + "name": "body", + "in": "body", + "schema": { + "type": "object", + "properties": { + "userId": { + "example": "any" + }, + "productId": { + "example": "any" + }, + "restaurantId": { + "example": "any" + } + } + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/basket/restaurant": { + "put": { + "tags": [ + "Basket" + ], + "description": "", + "parameters": [ + { + "name": "body", + "in": "body", + "schema": { + "type": "object", + "properties": { + "restaurantId": { + "example": "any" + }, + "userId": { + "example": "any" + } + } + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/basket/reset": { + "post": { + "tags": [ + "Basket" + ], + "description": "", + "parameters": [ + { + "name": "body", + "in": "body", + "schema": { + "type": "object", + "properties": { + "userId": { + "example": "any" + } + } + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/order/{id}": { + "get": { + "tags": [ + "Order" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/order": { + "post": { + "tags": [ + "Order" + ], + "description": "", + "parameters": [ + { + "name": "body", + "in": "body", + "schema": { + "type": "object", + "properties": { + "paymentId": { + "example": "any" + }, + "deliveryId": { + "example": "any" + }, + "deliveryType": { + "example": "any" + }, + "basketSnapshot": { + "example": "any" + }, + "restaurantId": { + "example": "any" + } + } + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/order/by-user/{userId}": { + "get": { + "tags": [ + "Order" + ], + "description": "", + "parameters": [ + { + "name": "userId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/order/by-status": { + "post": { + "tags": [ + "Order" + ], + "description": "", + "parameters": [ + { + "name": "body", + "in": "body", + "schema": { + "type": "object", + "properties": { + "status": { + "example": "any" + } + } + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/order/by-delivery/{deliveryId}": { + "get": { + "tags": [ + "Order" + ], + "description": "", + "parameters": [ + { + "name": "deliveryId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/order/by-payment/{paymentId}": { + "get": { + "tags": [ + "Order" + ], + "description": "", + "parameters": [ + { + "name": "paymentId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/order/{orderId}": { + "put": { + "tags": [ + "Order" + ], + "description": "", + "parameters": [ + { + "name": "orderId", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "body", + "in": "body", + "schema": { + "type": "object", + "properties": { + "status": { + "example": "any" + }, + "deliveryId": { + "example": "any" + }, + "paymentId": { + "example": "any" + }, + "restaurantId": { + "example": "any" + } + } + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + }, + "delete": { + "tags": [ + "Order" + ], + "description": "", + "parameters": [ + { + "name": "orderId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/category": { + "get": { + "tags": [ + "Category" + ], + "description": "", + "responses": { + "200": { + "description": "OK" + } + } + }, + "post": { + "tags": [ + "Category" + ], + "description": "", + "parameters": [ + { + "name": "body", + "in": "body", + "schema": { + "type": "object", + "properties": { + "label": { + "example": "any" + }, + "icon": { + "example": "any" + }, + "hexaColor": { + "example": "any" + } + } + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/category/{id}": { + "get": { + "tags": [ + "Category" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + }, + "put": { + "tags": [ + "Category" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "body", + "in": "body", + "schema": { + "type": "object", + "properties": { + "label": { + "example": "any" + }, + "icon": { + "example": "any" + }, + "hexaColor": { + "example": "any" + } + } + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + }, + "delete": { + "tags": [ + "Category" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/allergen": { + "get": { + "tags": [ + "Allergen" + ], + "description": "", + "responses": { + "200": { + "description": "OK" + } + } + }, + "post": { + "tags": [ + "Allergen" + ], + "description": "", + "parameters": [ + { + "name": "body", + "in": "body", + "schema": { + "type": "object", + "properties": { + "label": { + "example": "any" + } + } + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/allergen/{id}": { + "get": { + "tags": [ + "Allergen" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + }, + "put": { + "tags": [ + "Allergen" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "body", + "in": "body", + "schema": { + "type": "object", + "properties": { + "label": { + "example": "any" + } + } + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + }, + "delete": { + "tags": [ + "Allergen" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/product/by-restaurant/{id}": { + "get": { + "tags": [ + "Product" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/product/{id}": { + "get": { + "tags": [ + "Product" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + }, + "delete": { + "tags": [ + "Product" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + }, + "put": { + "tags": [ + "Product" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "body", + "in": "body", + "schema": { + "type": "object", + "properties": { + "restaurantId": { + "example": "any" + }, + "type": { + "example": "any" + }, + "name": { + "example": "any" + }, + "image": { + "example": "any" + }, + "comment": { + "example": "any" + }, + "price": { + "example": "any" + }, + "preparation": { + "example": "any" + }, + "weight": { + "example": "any" + }, + "kilocalories": { + "example": "any" + }, + "nutriscore": { + "example": "any" + }, + "categories": { + "example": "any" + }, + "allergens": { + "example": "any" + } + } + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/product/type": { + "get": { + "tags": [ + "Product" + ], + "description": "", + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/product": { + "post": { + "tags": [ + "Product" + ], + "description": "", + "parameters": [ + { + "name": "body", + "in": "body", + "schema": { + "type": "object", + "properties": { + "restaurantId": { + "example": "any" + }, + "type": { + "example": "any" + }, + "name": { + "example": "any" + }, + "image": { + "example": "any" + }, + "comment": { + "example": "any" + }, + "price": { + "example": "any" + }, + "preparation": { + "example": "any" + }, + "weight": { + "example": "any" + }, + "kilocalories": { + "example": "any" + }, + "nutriscore": { + "example": "any" + }, + "categories": { + "example": "any" + }, + "allergens": { + "example": "any" + } + } + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/product/image": { + "post": { + "tags": [ + "Product" + ], + "description": "", + "parameters": [ + { + "name": "body", + "in": "body", + "schema": { + "type": "object", + "properties": { + "input_file": { + "example": "any" + } + } + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/delivery/{id}": { + "get": { + "tags": [ + "Delivery" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + }, + "put": { + "tags": [ + "Delivery" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "body", + "in": "body", + "schema": { + "type": "object", + "properties": { + "eta": { + "example": "any" + }, + "address": { + "example": "any" + }, + "status": { + "example": "any" + }, + "deliveryPersonId": { + "example": "any" + }, + "userId": { + "example": "any" + }, + "restaurantId": { + "example": "any" + } + } + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + }, + "delete": { + "tags": [ + "Delivery" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/delivery/by-restaurant/{id}": { + "get": { + "tags": [ + "Delivery" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/delivery/by-user/{id}": { + "get": { + "tags": [ + "Delivery" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/delivery": { + "post": { + "tags": [ + "Delivery" + ], + "description": "", + "parameters": [ + { + "name": "body", + "in": "body", + "schema": { + "type": "object", + "properties": { + "eta": { + "example": "any" + }, + "address": { + "example": "any" + }, + "status": { + "example": "any" + }, + "deliveryPersonId": { + "example": "any" + }, + "userId": { + "example": "any" + }, + "restaurantId": { + "example": "any" + } + } + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/delivery-person/{id}": { + "get": { + "tags": [ + "DeliveryPerson" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + }, + "put": { + "tags": [ + "DeliveryPerson" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "body", + "in": "body", + "schema": { + "type": "object", + "properties": { + "firstName": { + "example": "any" + }, + "lastName": { + "example": "any" + }, + "phone": { + "example": "any" + }, + "locationList": { + "example": "any" + } + } + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + }, + "delete": { + "tags": [ + "DeliveryPerson" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/delivery-person": { + "get": { + "tags": [ + "DeliveryPerson" + ], + "description": "", + "responses": { + "200": { + "description": "OK" + } + } + }, + "post": { + "tags": [ + "DeliveryPerson" + ], + "description": "", + "parameters": [ + { + "name": "body", + "in": "body", + "schema": { + "type": "object", + "properties": { + "firstName": { + "example": "any" + }, + "lastName": { + "example": "any" + }, + "phone": { + "example": "any" + }, + "locationList": { + "example": "any" + } + } + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/log": { + "get": { + "tags": [ + "Log" + ], + "description": "", + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/log/{id}": { + "get": { + "tags": [ + "Log" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/metric/{key}": { + "get": { + "tags": [ + "Metric" + ], + "description": "", + "parameters": [ + { + "name": "key", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/metric": { + "post": { + "tags": [ + "Metric" + ], + "description": "", + "parameters": [ + { + "name": "body", + "in": "body", + "schema": { + "type": "object", + "properties": { + "restaurantId": { + "example": "any" + }, + "code": { + "example": "any" + }, + "value": { + "example": "any" + }, + "key": { + "example": "any" + } + } + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/promotion/{code}": { + "get": { + "tags": [ + "Promotion" + ], + "description": "", + "parameters": [ + { + "name": "code", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/promotion": { + "get": { + "tags": [ + "Promotion" + ], + "description": "", + "responses": { + "200": { + "description": "OK" + } + } + }, + "post": { + "tags": [ + "Promotion" + ], + "description": "", + "parameters": [ + { + "name": "body", + "in": "body", + "schema": { + "type": "object", + "properties": { + "code": { + "example": "any" + }, + "reduction": { + "example": "any" + }, + "method": { + "example": "any" + }, + "restaurantId": { + "example": "any" + } + } + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/promotion/by-restaurant/{restaurantId}": { + "get": { + "tags": [ + "Promotion" + ], + "description": "", + "parameters": [ + { + "name": "restaurantId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/promotion/{id}": { + "put": { + "tags": [ + "Promotion" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "body", + "in": "body", + "schema": { + "type": "object", + "properties": { + "code": { + "example": "any" + }, + "reduction": { + "example": "any" + }, + "method": { + "example": "any" + }, + "restaurantId": { + "example": "any" + } + } + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + }, + "delete": { + "tags": [ + "Promotion" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/stock/supplier/{id}": { + "get": { + "tags": [ + "Stock" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + }, + "put": { + "tags": [ + "Stock" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "body", + "in": "body", + "schema": { + "type": "object", + "properties": { + "name": { + "example": "any" + }, + "contact": { + "example": "any" + } + } + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + }, + "delete": { + "tags": [ + "Stock" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/stock/supplier": { + "get": { + "tags": [ + "Stock" + ], + "description": "", + "responses": { + "200": { + "description": "OK" + } + } + }, + "post": { + "tags": [ + "Stock" + ], + "description": "", + "parameters": [ + { + "name": "body", + "in": "body", + "schema": { + "type": "object", + "properties": { + "name": { + "example": "any" + }, + "contact": { + "example": "any" + } + } + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/stock/ingredient/{id}": { + "get": { + "tags": [ + "Stock" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + }, + "put": { + "tags": [ + "Stock" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "body", + "in": "body", + "schema": { + "type": "object", + "properties": { + "name": { + "example": "any" + }, + "desciption": { + "example": "any" + } + } + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + }, + "delete": { + "tags": [ + "Stock" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/stock/ingredient": { + "get": { + "tags": [ + "Stock" + ], + "description": "", + "responses": { + "200": { + "description": "OK" + } + } + }, + "post": { + "tags": [ + "Stock" + ], + "description": "", + "parameters": [ + { + "name": "body", + "in": "body", + "schema": { + "type": "object", + "properties": { + "name": { + "example": "any" + }, + "desciption": { + "example": "any" + } + } + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/stock/ingredient/restaurant/{id}": { + "get": { + "tags": [ + "Stock" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + }, + "put": { + "tags": [ + "Stock" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "body", + "in": "body", + "schema": { + "type": "object", + "properties": { + "alertThreshold": { + "example": "any" + }, + "quantity": { + "example": "any" + }, + "productList": { + "example": "any" + }, + "unitPrice": { + "example": "any" + }, + "pricePerKilo": { + "example": "any" + }, + "restaurantId": { + "example": "any" + }, + "ingredientId": { + "example": "any" + } + } + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + }, + "delete": { + "tags": [ + "Stock" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/stock/ingredient/restaurant/by-restaurant/{id}": { + "get": { + "tags": [ + "Stock" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/stock/ingredient/restaurant/by-product/{id}": { + "get": { + "tags": [ + "Stock" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/stock/ingredient/restaurant": { + "post": { + "tags": [ + "Stock" + ], + "description": "", + "parameters": [ + { + "name": "body", + "in": "body", + "schema": { + "type": "object", + "properties": { + "alertThreshold": { + "example": "any" + }, + "quantity": { + "example": "any" + }, + "productList": { + "example": "any" + }, + "unitPrice": { + "example": "any" + }, + "pricePerKilo": { + "example": "any" + }, + "restaurantId": { + "example": "any" + }, + "ingredientId": { + "example": "any" + } + } + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/stock/supply/order/{id}": { + "get": { + "tags": [ + "Stock" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + }, + "put": { + "tags": [ + "Stock" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "body", + "in": "body", + "schema": { + "type": "object", + "properties": { + "quantity": { + "example": "any" + }, + "ingredientRestaurantId": { + "example": "any" + }, + "supplierId": { + "example": "any" + } + } + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + }, + "delete": { + "tags": [ + "Stock" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/stock/supply/order/by-restaurant/{id}": { + "get": { + "tags": [ + "Stock" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/stock/supply/order/by-supplier/{id}": { + "get": { + "tags": [ + "Stock" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/stock/supply/order/by-ingredient-restaurant/{id}": { + "get": { + "tags": [ + "Stock" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/stock/supply/order": { + "post": { + "tags": [ + "Stock" + ], + "description": "", + "parameters": [ + { + "name": "body", + "in": "body", + "schema": { + "type": "object", + "properties": { + "quantity": { + "example": "any" + }, + "ingredientRestaurantId": { + "example": "any" + }, + "supplierId": { + "example": "any" + } + } + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/api/stock/outcomes/by-restaurant/{id}": { + "post": { + "tags": [ + "StockPerson" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "body", + "in": "body", + "schema": { + "type": "object", + "properties": { + "date": { + "example": "any" + }, + "interval": { + "example": "any" + } + } + } + } + ], + "responses": { + "200": { + "description": "OK" + } + } + } + } + } +} \ No newline at end of file diff --git a/services/gateway/src/utils/swagger.utils.js b/services/gateway/src/lib/swagger/swagger.utils.js similarity index 92% rename from services/gateway/src/utils/swagger.utils.js rename to services/gateway/src/lib/swagger/swagger.utils.js index 22323e2c..f1f701c7 100644 --- a/services/gateway/src/utils/swagger.utils.js +++ b/services/gateway/src/lib/swagger/swagger.utils.js @@ -9,7 +9,7 @@ const doc = { }; const outputFile = './swagger-output.json'; -const routes = ['../server.ts',]; +const routes = ['../../server.ts',]; /* NOTE: If you are using the express Router, you must pass in the 'routes' only the root file where the route starts, such as index.js, app.js, routes.js, etc ... */ From 605a7dc7586cbfba552545b8cf3217bc491554cc Mon Sep 17 00:00:00 2001 From: anatole Date: Tue, 15 Aug 2023 17:55:20 +0200 Subject: [PATCH 415/883] feat(global): create docker compose with delivery and the gateway --- services/delivery/.env.example | 4 +++- services/docker-compose.yml | 4 +++- services/gateway/README.md | 3 ++- services/gateway/package.json | 2 +- .../controller/delivery/delivery.controller.ts | 16 ++++++++++++---- .../delivery/deliveryPerson.controller.ts | 2 +- 6 files changed, 22 insertions(+), 9 deletions(-) diff --git a/services/delivery/.env.example b/services/delivery/.env.example index e7b2b4e7..1982e30b 100644 --- a/services/delivery/.env.example +++ b/services/delivery/.env.example @@ -1,2 +1,4 @@ DATABASE_URL=postgres://postgres:password@localhost:5432/postgres -PORT=50008 \ No newline at end of file +PORT=50008 +# with docker add : +# REDIS_HOST: delivery-redis \ No newline at end of file diff --git a/services/docker-compose.yml b/services/docker-compose.yml index d33b434f..d6ed1da8 100644 --- a/services/docker-compose.yml +++ b/services/docker-compose.yml @@ -48,9 +48,11 @@ services: context: . dockerfile: ./delivery/Dockerfile env_file: - - ./delivery/.env + - delivery/.env.docker ports: - "50008:50008" + networks: + - goodfood-network volumes: goodfood-delivery-volume: diff --git a/services/gateway/README.md b/services/gateway/README.md index 9aeb77bc..16b83558 100644 --- a/services/gateway/README.md +++ b/services/gateway/README.md @@ -36,7 +36,8 @@ You can use the following tools to help you with the setup: 3. Run `npm install` to install the necessary dependencies. 4. Create a `.env` file at the root of the project directory and add the environment variables values ( see `.env.example`). -5. Run `sh proto/build-protos.sh` to generate js file to create the clients. Then replace all "grpc" package iteration by "@grpc/grpc-js" +5. Run `sh proto/build-protos.sh` to generate js file to create the clients. +5.1. Then replace all "grpc" package iteration by "@grpc/grpc-js" 6. Run `npm run start` to start the microservice. You can now access the microservice at `http://localhost:50000`. diff --git a/services/gateway/package.json b/services/gateway/package.json index 541b8419..3701cf5e 100644 --- a/services/gateway/package.json +++ b/services/gateway/package.json @@ -5,7 +5,7 @@ "scripts": { "start": "node dist/index.js", "dev": "nodemon --watch 'src/**/*.ts' --exec 'ts-node' src/server.ts", - "build": "esbuild src/server.ts --bundle --platform=node --target=node18 --outfile=dist/index.js", + "build": "esbuild src/server.ts --bundle --platform=node --target=node18 --outfile=dist/index.js --minify", "test": "vitest", "coverage": "vitest --coverage", "generate:proto": "sh proto/build-protos.sh", diff --git a/services/gateway/src/controller/delivery/delivery.controller.ts b/services/gateway/src/controller/delivery/delivery.controller.ts index 8be781d9..233ea460 100644 --- a/services/gateway/src/controller/delivery/delivery.controller.ts +++ b/services/gateway/src/controller/delivery/delivery.controller.ts @@ -1,6 +1,6 @@ import {Request, Response, Router} from "express"; import {deliveryServiceClient} from "@gateway/services/clients/delivery.client"; -import {Delivery, DeliveryCreateInput, DeliveryId, RestaurantId, UserId} from "@gateway/proto/delivery_pb"; +import {Delivery, DeliveryCreateInput, DeliveryId, RestaurantId, Status, UserId} from "@gateway/proto/delivery_pb"; export const deliveryRoutes = Router(); @@ -43,19 +43,27 @@ deliveryRoutes.get('/api/delivery/by-user/:id', (req: Request, res: Response) => }); deliveryRoutes.post('/api/delivery', (req: Request, res: Response) => { - const {eta, address, status, deliveryPersonId, userId, restaurantId} = req.body; + const {eta, address, status, deliveryPersonId, userId, restaurantId}: { + eta: string, + address: string, + status: Status, + deliveryPersonId: string, + userId: string, + restaurantId: string + } = req.body; const deliveryCreateInput = new DeliveryCreateInput().setEta(eta) .setAddress(address) .setStatus(status) .setDeliveryPersonId(deliveryPersonId) .setUserId(userId) .setRestaurantId(restaurantId); - + console.log(deliveryCreateInput.toObject()); deliveryServiceClient.createDelivery(deliveryCreateInput, (error, response) => { + console.log(error, response) if (error) { res.json({error: error.message}); } else { - res.json(response.toObject()); + res.json(response); } }); }); diff --git a/services/gateway/src/controller/delivery/deliveryPerson.controller.ts b/services/gateway/src/controller/delivery/deliveryPerson.controller.ts index 6daf58ae..033ba35e 100644 --- a/services/gateway/src/controller/delivery/deliveryPerson.controller.ts +++ b/services/gateway/src/controller/delivery/deliveryPerson.controller.ts @@ -27,7 +27,7 @@ deliveryPersonRoutes.get('/api/delivery-person', (req, res) => { }); }); -deliveryPersonRoutes.post('/api/delivery-person', (req, res) => { +deliveryPersonRoutes.get('/api/delivery-person', (req, res) => { const {lat, lng} = req.body; const location = new Location() .setLatitude(lat) From 5e0cfec56d746dd89b8c633b38e3561cb2efbfb6 Mon Sep 17 00:00:00 2001 From: anatole Date: Tue, 15 Aug 2023 18:47:26 +0200 Subject: [PATCH 416/883] fix(order): rename path --- services/order/tsconfig.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/order/tsconfig.json b/services/order/tsconfig.json index e59b3816..f7f47ecc 100644 --- a/services/order/tsconfig.json +++ b/services/order/tsconfig.json @@ -7,7 +7,7 @@ "esModuleInterop": true, "baseUrl": ".", "paths": { - "@gateway/*": ["src/*"] + "@order/*": ["src/*"] } }, "include": ["src/**/*.ts"], From f85a68456299ac34aa351284a45dcbbb2668b1a9 Mon Sep 17 00:00:00 2001 From: anatole Date: Tue, 15 Aug 2023 19:11:35 +0200 Subject: [PATCH 417/883] feat(global): add order service to the docker compose --- services/docker-compose.yml | 34 +++++++++++++++++++++++++++++++--- 1 file changed, 31 insertions(+), 3 deletions(-) diff --git a/services/docker-compose.yml b/services/docker-compose.yml index d6ed1da8..0d0b6a55 100644 --- a/services/docker-compose.yml +++ b/services/docker-compose.yml @@ -18,7 +18,7 @@ services: delivery-redis: image: redis:latest ports: - - "6379:6379" + - "6379" volumes: - goodfood-delivery-volume:/data networks: @@ -31,7 +31,7 @@ services: delivery-postgres: image: postgres:latest ports: - - "5432:5432" + - "5432" volumes: - goodfood-delivery-volume:/var/lib/postgresql/data networks: @@ -50,12 +50,40 @@ services: env_file: - delivery/.env.docker ports: - - "50008:50008" + - "50008" networks: - goodfood-network + # Order service + order-sercice: + image: goodfood-order:1.0.0 + build: + context: . + dockerfile: ./order/Dockerfile + env_file: + - order/.env.docker + ports: + - "50007" + networks: + - goodfood-network + + order-postgres: + image: postgres:latest + ports: + - "5432" + volumes: + - goodfood-order-volume:/var/lib/postgresql/data + networks: + - goodfood-network + environment: + POSTGRES_USER: postgres + POSTGRES_PASSWORD: password + POSTGRES_DB: postgres + PGDATA: /var/lib/postgresql/data/pgdata + volumes: goodfood-delivery-volume: + goodfood-order-volume: networks: goodfood-network: \ No newline at end of file From ee0e6620c1d62191f3d466a41b217770a479f96a Mon Sep 17 00:00:00 2001 From: anatole Date: Tue, 15 Aug 2023 19:54:41 +0200 Subject: [PATCH 418/883] feat(gateway): in case of error return a 500 status --- .../controller/basket/basket.controller.ts | 13 +++++++--- .../delivery/delivery.controller.ts | 11 ++++++-- .../delivery/deliveryPerson.controller.ts | 6 +++++ .../src/controller/log/log.controller.ts | 2 ++ .../controller/metric/metric.controller.ts | 2 ++ .../src/controller/order/order.controller.ts | 8 ++++++ .../controller/product/allergen.controller.ts | 5 ++++ .../controller/product/category.controller.ts | 5 ++++ .../controller/product/product.controller.ts | 7 +++++ .../promotion/promotion.controller.ts | 6 +++++ .../src/controller/stock/stock.controller.ts | 26 +++++++++++++++++++ .../stock/stockPerson.controller.ts | 1 + .../src/controller/user/user.controller.ts | 8 ++++++ 13 files changed, 94 insertions(+), 6 deletions(-) diff --git a/services/gateway/src/controller/basket/basket.controller.ts b/services/gateway/src/controller/basket/basket.controller.ts index 32b84506..dd953884 100644 --- a/services/gateway/src/controller/basket/basket.controller.ts +++ b/services/gateway/src/controller/basket/basket.controller.ts @@ -9,6 +9,7 @@ basketRoutes.get('/api/basket/:userId', (req: Request, res: Response) => { basketServiceClient.getBasket(new UserId().setId(Number(userId)), (error, response) => { if (error) { + res.status(500) res.json({error: error.message}); } else { res.json(response.toObject()); @@ -21,7 +22,8 @@ basketRoutes.post('/api/basket', (req: Request, res: Response) => { const basketRequest = new ProductRequest().setUserId(userId).setProductId(productId).setRestaurantId(restaurantId); basketServiceClient.addProduct(basketRequest, (error, response) => { if (error) { - res.json({error: error.message}); + res.status(500) + res.json({error: error.message}); } else { res.json(response.toObject()); } @@ -34,7 +36,8 @@ basketRoutes.delete('/api/basket', (req: Request, res: Response) => { const basketRequest = new ProductRequest().setUserId(userId).setProductId(productId).setRestaurantId(restaurantId); basketServiceClient.deleteProduct(basketRequest, (error, response) => { if (error) { - res.json({error: error.message}); + res.status(500) + res.json({error: error.message}); } else { res.json(response.toObject()); } @@ -46,7 +49,8 @@ basketRoutes.put('/api/basket/restaurant', (req: Request, res: Response) => { const {restaurantId, userId} = req.body; basketServiceClient.updateRestaurant(new RestaurantRequest().setRestaurantId(restaurantId).setUserId(userId), (error, response) => { if (error) { - res.json({error: error.message}); + res.status(500) + res.json({error: error.message}); } else { res.json(response.toObject()); } @@ -58,7 +62,8 @@ basketRoutes.post('/api/basket/reset', (req: Request, res: Response) => { const {userId} = req.body; basketServiceClient.reset(new UserId().setId(userId), (error, response) => { if (error) { - res.json({error: error.message}); + res.status(500) + res.json({error: error.message}); } else { res.json(response.toObject()); } diff --git a/services/gateway/src/controller/delivery/delivery.controller.ts b/services/gateway/src/controller/delivery/delivery.controller.ts index 233ea460..33844bf5 100644 --- a/services/gateway/src/controller/delivery/delivery.controller.ts +++ b/services/gateway/src/controller/delivery/delivery.controller.ts @@ -9,6 +9,8 @@ deliveryRoutes.get('/api/delivery/:id', (req: Request, res: Response) => { deliveryServiceClient.getDelivery(new DeliveryId().setId(id), (error, response) => { if (error) { + res.status(500) + res.status(500) res.json({error: error.message}); } else { res.json(response.toObject()); @@ -22,6 +24,7 @@ deliveryRoutes.get('/api/delivery/by-restaurant/:id', (req: Request, res: Respon deliveryServiceClient.listDeliveriesByRestaurant(restaurantId, (error, response) => { if (error) { + res.status(500) res.json({error: error.message}); } else { res.json(response.toObject()); @@ -35,6 +38,7 @@ deliveryRoutes.get('/api/delivery/by-user/:id', (req: Request, res: Response) => deliveryServiceClient.listDeliveriesByUser(userId, (error, response) => { if (error) { + res.status(500) res.json({error: error.message}); } else { res.json(response.toObject()); @@ -57,13 +61,14 @@ deliveryRoutes.post('/api/delivery', (req: Request, res: Response) => { .setDeliveryPersonId(deliveryPersonId) .setUserId(userId) .setRestaurantId(restaurantId); - console.log(deliveryCreateInput.toObject()); + deliveryServiceClient.createDelivery(deliveryCreateInput, (error, response) => { console.log(error, response) if (error) { + res.status(500) res.json({error: error.message}); } else { - res.json(response); + res.json(response.toObject()); } }); }); @@ -80,6 +85,7 @@ deliveryRoutes.put('/api/delivery/:id', (req: Request, res: Response) => { deliveryServiceClient.updateDelivery(delivery, (error, response) => { if (error) { + res.status(500) res.json({error: error.message}); } else { res.json(response.toObject()); @@ -92,6 +98,7 @@ deliveryRoutes.delete('/api/delivery/:id', (req: Request, res: Response) => { deliveryServiceClient.deleteDelivery(new DeliveryId().setId(id), (error, response) => { if (error) { + res.status(500) res.json({error: error.message}); } else { res.json(response.toObject()); diff --git a/services/gateway/src/controller/delivery/deliveryPerson.controller.ts b/services/gateway/src/controller/delivery/deliveryPerson.controller.ts index 033ba35e..ab75c283 100644 --- a/services/gateway/src/controller/delivery/deliveryPerson.controller.ts +++ b/services/gateway/src/controller/delivery/deliveryPerson.controller.ts @@ -10,6 +10,7 @@ deliveryPersonRoutes.get('/api/delivery-person/:id', (req, res) => { deliveryPersonServiceClient.getDeliveryPerson(new DeliveryPersonId().setId(id), (error, response) => { if (error) { + res.status(500) res.json({error: error.message}); } else { res.json(response.toObject()); @@ -20,6 +21,7 @@ deliveryPersonRoutes.get('/api/delivery-person/:id', (req, res) => { deliveryPersonRoutes.get('/api/delivery-person', (req, res) => { deliveryPersonServiceClient.listDeliveryPersons(new Empty(), (error, response) => { if (error) { + res.status(500) res.json({error: error.message}); } else { res.json(response.toObject()); @@ -34,6 +36,7 @@ deliveryPersonRoutes.get('/api/delivery-person', (req, res) => { .setLongitude(lng); deliveryPersonServiceClient.listNearDeliveryPersons(location, (error, response) => { if (error) { + res.status(500) res.json({error: error.message}); } else { res.json(response.toObject()); @@ -50,6 +53,7 @@ deliveryPersonRoutes.post('/api/delivery-person', (req, res) => { .setLocationList(locationList); deliveryPersonServiceClient.createDeliveryPerson(deliveryPerson, (error, response) => { if (error) { + res.status(500) res.json({error: error.message}); } else { res.json(response.toObject()); @@ -68,6 +72,7 @@ deliveryPersonRoutes.put('/api/delivery-person/:id', (req, res) => { deliveryPersonServiceClient.updateDeliveryPerson(deliveryPerson, (error, response) => { if (error) { + res.status(500) res.json({error: error.message}); } else { res.json(response.toObject()); @@ -80,6 +85,7 @@ deliveryPersonRoutes.delete('/api/delivery-person/:id', (req, res) => { deliveryPersonServiceClient.deleteDeliveryPerson(new DeliveryPersonId().setId(id), (error, response) => { if (error) { + res.status(500) res.json({error: error.message}); } else { res.json(response.toObject()); diff --git a/services/gateway/src/controller/log/log.controller.ts b/services/gateway/src/controller/log/log.controller.ts index 46df363f..f42e5eaa 100644 --- a/services/gateway/src/controller/log/log.controller.ts +++ b/services/gateway/src/controller/log/log.controller.ts @@ -9,6 +9,7 @@ logRoutes.get('/api/log', (req: express.Request, res: express.Response) => { logServiceClient.listLog(new Empty(), (error, response) => { if (error) { + res.status(500) res.json({error: error.message}); } else { res.json(response.toObject()); @@ -21,6 +22,7 @@ logRoutes.get('/api/log/:id', (req: express.Request, res: express.Response) => { logServiceClient.getLog(new GetLogRequest().setId(Number(id)), (error, response) => { if (error) { + res.status(500) res.json({error: error.message}); } else { res.json(response.toObject()); diff --git a/services/gateway/src/controller/metric/metric.controller.ts b/services/gateway/src/controller/metric/metric.controller.ts index c983b96d..8225dd0d 100644 --- a/services/gateway/src/controller/metric/metric.controller.ts +++ b/services/gateway/src/controller/metric/metric.controller.ts @@ -9,6 +9,7 @@ metricRoutes.get('/api/metric/:key', (req, res) => { const metricInput = new GetMetricRequest().setKey(key); metricService.getMetric(metricInput, (error, response) => { if (error) { + res.status(500) res.json({error: error.message}); } else { res.json(response.toObject()); @@ -23,6 +24,7 @@ metricRoutes.post('/api/metric', (req, res) => { metricService.pushMetric(newMetric, (error, response) => { if (error) { + res.status(500) res.json({error: error.message}); } else { res.json(response.toObject()); diff --git a/services/gateway/src/controller/order/order.controller.ts b/services/gateway/src/controller/order/order.controller.ts index 3a822e6b..e8675eac 100644 --- a/services/gateway/src/controller/order/order.controller.ts +++ b/services/gateway/src/controller/order/order.controller.ts @@ -23,6 +23,7 @@ orderRoutes.get('/api/order/:id', (req: Request, res: Response) => { orderService.getOrder(orderId, (error, response) => { if (error) { + res.status(500) res.json({error: error.message}); } else { res.json(response.toObject()); @@ -60,6 +61,7 @@ orderRoutes.post('/api/order', (req: Request, res: Response) => { orderService.createOrder(orderInput, (error, response) => { if (error) { + res.status(500) res.json({error: error.message}); } else { res.json(response.toObject()); @@ -72,6 +74,7 @@ orderRoutes.get('/api/order/by-user/:userId', (req: Request, res: Response) => { const orderInput = new GetOrdersByUserRequest().setId(userId); orderService.getOrdersByUser(orderInput, (error, response) => { if (error) { + res.status(500) res.json({error: error.message}); } else { res.json(response.toObject()); @@ -84,6 +87,7 @@ orderRoutes.post('/api/order/by-status', (req: Request, res: Response) => { orderService.getOrdersByStatus(orderInput, (error, response) => { if (error) { + res.status(500) res.json({error: error.message}); } else { res.json(response.toObject()); @@ -96,6 +100,7 @@ orderRoutes.get('/api/order/by-delivery/:deliveryId', (req: Request, res: Respon const orderInput = new GetOrderByDeliveryRequest().setId(deliveryId); orderService.getOrderByDelivery(orderInput, (error, response) => { if (error) { + res.status(500) res.json({error: error.message}); } else { res.json(response.toObject()); @@ -108,6 +113,7 @@ orderRoutes.get('/api/order/by-payment/:paymentId', (req: Request, res: Response const orderInput = new GetOrderByPaymentRequest().setId(paymentId); orderService.getOrderByPayment(orderInput, (error, response) => { if (error) { + res.status(500) res.json({error: error.message}); } else { res.json(response.toObject()); @@ -125,6 +131,7 @@ orderRoutes.put('/api/order/:orderId', (req: Request, res: Response) => { .setRestaurantId(req.body.restaurantId); orderService.updateOrder(orderInput, (error, response) => { if (error) { + res.status(500) res.json({error: error.message}); } else { res.json(response.toObject()); @@ -137,6 +144,7 @@ orderRoutes.delete('/api/order/:orderId', (req: Request, res: Response) => { const orderInput = new DeleteOrderRequest().setId(orderId); orderService.deleteOrder(orderInput, (error, response) => { if (error) { + res.status(500) res.json({error: error.message}); } else { res.json(response.toObject()); diff --git a/services/gateway/src/controller/product/allergen.controller.ts b/services/gateway/src/controller/product/allergen.controller.ts index 55d7770d..575ae028 100644 --- a/services/gateway/src/controller/product/allergen.controller.ts +++ b/services/gateway/src/controller/product/allergen.controller.ts @@ -8,6 +8,7 @@ export const allergenRoutes = Router(); allergenRoutes.get('/api/allergen', (req: Request, res: Response) => { allergenServiceClient.getAllergenList(new Empty(), (error, response) => { if (error) { + res.status(500) res.json({error: error.message}); } else { res.json(response.toObject()); @@ -21,6 +22,7 @@ allergenRoutes.get('/api/allergen/:id', (req: Request, res: Response) => { allergenServiceClient.readAllergen(allergenId, (error, response) => { if (error) { + res.status(500) res.json({error: error.message}); } else { res.json(response.toObject()); @@ -33,6 +35,7 @@ allergenRoutes.post('/api/allergen', (req: Request, res: Response) => { const allergen = new Allergen().setLibelle(label); allergenServiceClient.createAllergen(allergen, (error, response) => { if (error) { + res.status(500) res.json({error: error.message}); } else { res.json(response.toObject()); @@ -46,6 +49,7 @@ allergenRoutes.put('/api/allergen/:id', (req: Request, res: Response) => { const allergen = new Allergen().setId(id).setLibelle(label); allergenServiceClient.updateAllergen(allergen, (error, response) => { if (error) { + res.status(500) res.json({error: error.message}); } else { res.json(response.toObject()); @@ -57,6 +61,7 @@ allergenRoutes.delete('/api/allergen/:id', (req: Request, res: Response) => { const {id} = req.params; allergenServiceClient.deleteAllergen(new AllergenId().setId(id), (error, response) => { if (error) { + res.status(500) res.json({error: error.message}); } else { res.json(response.toObject()); diff --git a/services/gateway/src/controller/product/category.controller.ts b/services/gateway/src/controller/product/category.controller.ts index dd9f9124..041b5b3c 100644 --- a/services/gateway/src/controller/product/category.controller.ts +++ b/services/gateway/src/controller/product/category.controller.ts @@ -8,6 +8,7 @@ export const categoryRoutes = Router(); categoryRoutes.get('/api/category', (req: Request, res: Response) => { categoryServiceClient.getCategoryList(new Empty(), (error, response) => { if (error) { + res.status(500) res.json({error: error.message}); } else { res.json(response.toObject()); @@ -21,6 +22,7 @@ categoryRoutes.get('/api/category/:id', (req: Request, res: Response) => { categoryServiceClient.readCategory(categoryId, (error, response) => { if (error) { + res.status(500) res.json({error: error.message}); } else { res.json(response.toObject()); @@ -33,6 +35,7 @@ categoryRoutes.post('/api/category', (req: Request, res: Response) => { const category = new Category().setLibelle(label).setIcon(icon).setHexaColor(hexaColor) categoryServiceClient.createCategory(category, (error, response) => { if (error) { + res.status(500) res.json({error: error.message}); } else { res.json(response.toObject()); @@ -46,6 +49,7 @@ categoryRoutes.put('/api/category/:id', (req: Request, res: Response) => { const category = new Category().setId(id).setLibelle(label).setIcon(icon).setHexaColor(hexaColor) categoryServiceClient.updateCategory(category, (error, response) => { if (error) { + res.status(500) res.json({error: error.message}); } else { res.json(response.toObject()); @@ -57,6 +61,7 @@ categoryRoutes.delete('/api/category/:id', (req: Request, res: Response) => { const {id} = req.params; categoryServiceClient.deleteCategory(new CategoryId().setId(id), (error, response) => { if (error) { + res.status(500) res.json({error: error.message}); } else { res.json(response.toObject()); diff --git a/services/gateway/src/controller/product/product.controller.ts b/services/gateway/src/controller/product/product.controller.ts index 4e91d2e8..378cc910 100644 --- a/services/gateway/src/controller/product/product.controller.ts +++ b/services/gateway/src/controller/product/product.controller.ts @@ -12,6 +12,7 @@ productRoutes.get('/api/product/by-restaurant/:id', (req: Request, res: Response productServiceClient.getProductList(restaurantId, (error, response) => { if (error) { + res.status(500) res.json({error: error.message}); } else { res.json(response.toObject()); @@ -25,6 +26,7 @@ productRoutes.get('/api/product/:id', (req: Request, res: Response) => { productServiceClient.readProduct(productId, (error, response) => { if (error) { + res.status(500) res.json({error: error.message}); } else { res.json(response.toObject()); @@ -35,6 +37,7 @@ productRoutes.get('/api/product/:id', (req: Request, res: Response) => { productRoutes.get('/api/product/type', (req: Request, res: Response) => { productServiceClient.getProductTypeList(new Empty(), (error, response) => { if (error) { + res.status(500) res.json({error: error.message}); } else { res.json(response.toObject()); @@ -47,6 +50,7 @@ productRoutes.delete('/api/product/:id', (req: Request, res: Response) => { const productId = new ProductId().setId(id) productServiceClient.deleteProduct(productId, (error, response) => { if (error) { + res.status(500) res.json({error: error.message}); } else { res.json(response.toObject()); @@ -90,6 +94,7 @@ productRoutes.post('/api/product', (req: Request, res: Response) => { productServiceClient.createProduct(productId, (error, response) => { if (error) { + res.status(500) res.json({error: error.message}); } else { res.json(response.toObject()); @@ -134,6 +139,7 @@ productRoutes.put('/api/product/:id', (req: Request, res: Response) => { productServiceClient.createProduct(productId, (error, response) => { if (error) { + res.status(500) res.json({error: error.message}); } else { res.json(response.toObject()); @@ -149,6 +155,7 @@ productRoutes.post('/api/product/image', (req: Request, res: Response) => { const file = new File().setName(input_file).setData(base64File); productServiceClient.uploadImage(file, (error, response) => { if (error) { + res.status(500) res.json({error: error.message}); } else { res.json(response.toObject()); diff --git a/services/gateway/src/controller/promotion/promotion.controller.ts b/services/gateway/src/controller/promotion/promotion.controller.ts index 5787c9f9..6330056f 100644 --- a/services/gateway/src/controller/promotion/promotion.controller.ts +++ b/services/gateway/src/controller/promotion/promotion.controller.ts @@ -9,6 +9,7 @@ promotionRoutes.get('/api/promotion/:code', (req, res) => { const {code} = req.params; promotionServiceClient.getPromotion(new PromotionCode().setCode(code), (error, response) => { if (error) { + res.status(500) res.json({error: error.message}); } else { res.json(response.toObject()); @@ -19,6 +20,7 @@ promotionRoutes.get('/api/promotion/:code', (req, res) => { promotionRoutes.get('/api/promotion', (req, res) => { promotionServiceClient.getPromotions(new Empty(), (error, response) => { if (error) { + res.status(500) res.json({error: error.message}); } else { res.json(response.toObject()); @@ -30,6 +32,7 @@ promotionRoutes.get('/api/promotion/by-restaurant/:restaurantId', (req, res) => const {restaurantId} = req.params; promotionServiceClient.getPromotionsByRestaurant(new RestaurantId().setId(restaurantId), (error, response) => { if (error) { + res.status(500) res.json({error: error.message}); } else { res.json(response.toObject()); @@ -45,6 +48,7 @@ promotionRoutes.post('/api/promotion', (req, res) => { .setRestaurantId(restaurantId); promotionServiceClient.createPromotion(promotionCreateInput, (error, response) => { if (error) { + res.status(500) res.json({error: error.message}); } else { res.json(response.toObject()); @@ -62,6 +66,7 @@ promotionRoutes.put('/api/promotion/:id', (req, res) => { promotionServiceClient.createPromotion(promotionUpdateInput, (error, response) => { if (error) { + res.status(500) res.json({error: error.message}); } else { res.json(response.toObject()); @@ -74,6 +79,7 @@ promotionRoutes.delete('/api/promotion/:id', (req, res) => { promotionServiceClient.deletePromotion(new PromotionId().setId(id), (error, response) => { if (error) { + res.status(500) res.json({error: error.message}); } else { res.json(response.toObject()); diff --git a/services/gateway/src/controller/stock/stock.controller.ts b/services/gateway/src/controller/stock/stock.controller.ts index 677d9aca..4525df45 100644 --- a/services/gateway/src/controller/stock/stock.controller.ts +++ b/services/gateway/src/controller/stock/stock.controller.ts @@ -37,6 +37,7 @@ stockRoutes.get('/api/stock/supplier/:id', (req: Request, res: Response) => { stockServiceClient.getSupplier(supplierRequest, (error, response) => { if (error) { + res.status(500) res.json({error: error.message}); } else { res.json(response.toObject()); @@ -48,6 +49,7 @@ stockRoutes.get('/api/stock/supplier', (req: Request, res: Response) => { stockServiceClient.getSuppliers(new Empty(), (error, response) => { if (error) { + res.status(500) res.json({error: error.message}); } else { res.json(response.toObject()); @@ -61,6 +63,7 @@ stockRoutes.get('/api/stock/ingredient/:id', (req: Request, res: Response) => { stockServiceClient.getIngredient(ingredientRequest, (error, response) => { if (error) { + res.status(500) res.json({error: error.message}); } else { res.json(response.toObject()); @@ -72,6 +75,7 @@ stockRoutes.get('/api/stock/ingredient', (req: Request, res: Response) => { stockServiceClient.getIngredients(new Empty(), (error, response) => { if (error) { + res.status(500) res.json({error: error.message}); } else { res.json(response.toObject()); @@ -85,6 +89,7 @@ stockRoutes.post('/api/stock/ingredient', (req: Request, res: Response) => { stockServiceClient.createIngredient(ingredientRequest, (error, response) => { if (error) { + res.status(500) res.json({error: error.message}); } else { res.json(response.toObject()); @@ -99,6 +104,7 @@ stockRoutes.put('/api/stock/ingredient/:id', (req: Request, res: Response) => { stockServiceClient.updateIngredient(ingredientRequest, (error, response) => { if (error) { + res.status(500) res.json({error: error.message}); } else { res.json(response.toObject()); @@ -112,6 +118,7 @@ stockRoutes.delete('/api/stock/ingredient/:id', (req: Request, res: Response) => stockServiceClient.deleteIngredient(ingredientRequest, (error, response) => { if (error) { + res.status(500) res.json({error: error.message}); } else { res.json(response.toObject()); @@ -125,6 +132,7 @@ stockRoutes.delete('/api/stock/ingredient/:id', (req: Request, res: Response) => stockServiceClient.deleteIngredient(ingredientRequest, (error, response) => { if (error) { + res.status(500) res.json({error: error.message}); } else { res.json(response.toObject()); @@ -142,6 +150,7 @@ stockRoutes.get('/api/stock/ingredient/restaurant/:id', (req: Request, res: Resp stockServiceClient.getIngredientRestaurant(ingredientRestaurantRequest, (error, response) => { if (error) { + res.status(500) res.json({error: error.message}); } else { res.json(response.toObject()); @@ -155,6 +164,7 @@ stockRoutes.get('/api/stock/ingredient/restaurant/by-restaurant/:id', (req: Requ stockServiceClient.getIngredientRestaurantsByRestaurant(ingredientRestaurantsByRestaurantRequest, (error, response) => { if (error) { + res.status(500) res.json({error: error.message}); } else { res.json(response.toObject()); @@ -168,6 +178,7 @@ stockRoutes.get('/api/stock/ingredient/restaurant/by-product/:id', (req: Request stockServiceClient.getIngredientRestaurantsByProduct(ingredientRestaurantsByProductRequest, (error, response) => { if (error) { + res.status(500) res.json({error: error.message}); } else { res.json(response.toObject()); @@ -188,6 +199,7 @@ stockRoutes.post('/api/stock/ingredient/restaurant', (req: Request, res: Respons stockServiceClient.createIngredientRestaurant(ingredientRestaurant, (error, response) => { if (error) { + res.status(500) res.json({error: error.message}); } else { res.json(response.toObject()); @@ -209,6 +221,7 @@ stockRoutes.put('/api/stock/ingredient/restaurant/:id', (req: Request, res: Resp stockServiceClient.updateIngredientRestaurant(ingredientRestaurant, (error, response) => { if (error) { + res.status(500) res.json({error: error.message}); } else { res.json(response.toObject()); @@ -221,6 +234,7 @@ stockRoutes.delete('/api/stock/ingredient/restaurant/:id', (req: Request, res: R stockServiceClient.deleteIngredientRestaurant(new DeleteIngredientRestaurantRequest().setId(Number(id)), (error, response) => { if (error) { + res.status(500) res.json({error: error.message}); } else { res.json(response.toObject()); @@ -237,6 +251,7 @@ stockRoutes.get('/api/stock/supplier/:id', (req: Request, res: Response) => { stockServiceClient.getSupplier(new GetSupplierRequest().setId(Number(id)), (error, response) => { if (error) { + res.status(500) res.json({error: error.message}); } else { res.json(response.toObject()); @@ -247,6 +262,7 @@ stockRoutes.get('/api/stock/supplier/:id', (req: Request, res: Response) => { stockRoutes.get('/api/stock/supplier', (req: Request, res: Response) => { stockServiceClient.getSuppliers(new Empty(), (error, response) => { if (error) { + res.status(500) res.json({error: error.message}); } else { res.json(response.toObject()); @@ -260,6 +276,7 @@ stockRoutes.post('/api/stock/supplier', (req: Request, res: Response) => { stockServiceClient.createSupplier(supplierRequest, (error, response) => { if (error) { + res.status(500) res.json({error: error.message}); } else { res.json(response.toObject()); @@ -274,6 +291,7 @@ stockRoutes.put('/api/stock/supplier/:id', (req: Request, res: Response) => { stockServiceClient.updateSupplier(supplierRequest, (error, response) => { if (error) { + res.status(500) res.json({error: error.message}); } else { res.json(response.toObject()); @@ -286,6 +304,7 @@ stockRoutes.delete('/api/stock/supplier/:id', (req: Request, res: Response) => { stockServiceClient.deleteSupplier(new DeleteSupplierRequest().setId(Number(id)), (error, response) => { if (error) { + res.status(500) res.json({error: error.message}); } else { res.json(response.toObject()); @@ -302,6 +321,7 @@ stockRoutes.get('/api/stock/supply/order/:id', (req: Request, res: Response) => stockServiceClient.getSupplyOrder(new GetSupplyOrderRequest().setId(Number(id)), (error, response) => { if (error) { + res.status(500) res.json({error: error.message}); } else { res.json(response.toObject()); @@ -313,6 +333,7 @@ stockRoutes.get('/api/stock/supply/order/by-restaurant/:id', (req: Request, res: const {id} = req.params; stockServiceClient.getSupplyOrdersByRestaurant(new GetSupplyOrdersByRestaurantRequest().setRestaurantId(id), (error, response) => { if (error) { + res.status(500) res.json({error: error.message}); } else { res.json(response.toObject()); @@ -324,6 +345,7 @@ stockRoutes.get('/api/stock/supply/order/by-supplier/:id', (req: Request, res: R const {id} = req.params; stockServiceClient.getSupplyOrdersBySupplier(new GetSupplyOrdersBySupplierRequest().setSupplierId(Number(id)), (error, response) => { if (error) { + res.status(500) res.json({error: error.message}); } else { res.json(response.toObject()); @@ -335,6 +357,7 @@ stockRoutes.get('/api/stock/supply/order/by-ingredient-restaurant/:id', (req: Re const {id} = req.params; stockServiceClient.getSupplyOrdersByIngredientRestaurant(new GetSupplyOrdersByIngredientRestaurantRequest().setIngredientRestaurantId(Number(id)), (error, response) => { if (error) { + res.status(500) res.json({error: error.message}); } else { res.json(response.toObject()); @@ -350,6 +373,7 @@ stockRoutes.post('/api/stock/supply/order', (req: Request, res: Response) => { stockServiceClient.createSupplyOrder(supplyOrderRequest, (error, response) => { if (error) { + res.status(500) res.json({error: error.message}); } else { res.json(response.toObject()); @@ -366,6 +390,7 @@ stockRoutes.put('/api/stock/supply/order/:id', (req: Request, res: Response) => stockServiceClient.updateSupplyOrder(supplyOrderRequest, (error, response) => { if (error) { + res.status(500) res.json({error: error.message}); } else { res.json(response.toObject()); @@ -377,6 +402,7 @@ stockRoutes.delete('/api/stock/supply/order/:id', (req: Request, res: Response) const {id} = req.params; stockServiceClient.deleteSupplyOrder(new DeleteSupplyOrderRequest().setId(Number(id)), (error, response) => { if (error) { + res.status(500) res.json({error: error.message}); } else { res.json(response.toObject()); diff --git a/services/gateway/src/controller/stock/stockPerson.controller.ts b/services/gateway/src/controller/stock/stockPerson.controller.ts index 48496f95..5d3b8504 100644 --- a/services/gateway/src/controller/stock/stockPerson.controller.ts +++ b/services/gateway/src/controller/stock/stockPerson.controller.ts @@ -11,6 +11,7 @@ stockPersonRoutes.post('/api/stock/outcomes/by-restaurant/:id', (req: Request, r stockPersonServiceClient.getOutcomesByRestaurant(outcomesByRestaurantRequest, (error, response) => { if (error) { + res.status(500) res.json({error: error.message}); } else { res.json(response.toObject()); diff --git a/services/gateway/src/controller/user/user.controller.ts b/services/gateway/src/controller/user/user.controller.ts index c4467600..7605bdcd 100644 --- a/services/gateway/src/controller/user/user.controller.ts +++ b/services/gateway/src/controller/user/user.controller.ts @@ -26,6 +26,7 @@ userRoutes.get('/api/user/:id', (req: Request, res: Response) => { userRoutes.get('/api/user', (req: Request, res: Response) => { userServiceClient.listUser(new Empty(), (error, response) => { if (error) { + res.status(500) res.json({error: error.message}); } else { res.json(response.toObject()); @@ -51,6 +52,7 @@ userRoutes.post('/api/user', (req: Request, res: Response) => { userServiceClient.register(userInput, (error, response) => { if (error) { + res.status(500) res.json({error: error.message}); } else { res.json(response.toObject()); @@ -84,6 +86,7 @@ userRoutes.put('/api/user/:id', (req: Request, res: Response) => { userServiceClient.updateUser(userInput, (error, response) => { if (error) { + res.status(500) res.json({error: error.message}); } else { res.json(response.toObject()); @@ -101,6 +104,7 @@ userRoutes.delete('/api/user/:id', (req: Request, res: Response) => { userServiceClient.deleteUser(new DeleteInput().setUserid(Number(id)).setToken(authorization), (error, response) => { if (error) { + res.status(500) res.json({error: error.message}); } else { res.json(response.toObject()); @@ -114,6 +118,7 @@ userRoutes.post('/api/user/login', (req: Request, res: Response) => { userServiceClient.logIn(inInput, (error, response) => { if (error) { + res.status(500) res.json({error: error.message}); } else { res.json(response.toObject()); @@ -131,6 +136,7 @@ userRoutes.post('/api/user/validate', (req: Request, res: Response) => { userServiceClient.validate(validate, (error, response) => { if (error) { + res.status(500) res.json({error: error.message}); } else { res.json(response.toObject()); @@ -158,6 +164,7 @@ userRoutes.put('/api/user/:id/password', (req: Request, res: Response) => { userServiceClient.changePassword(updatePasswordInput, (error, response) => { if (error) { + res.status(500) res.json({error: error.message}); } else { res.json(response.toObject()); @@ -184,6 +191,7 @@ userRoutes.put('/api/user/:id/role', (req: Request, res: Response) => { } userServiceClient.changeRole(updatePasswordInput, (error, response) => { if (error) { + res.status(500) res.json({error: error.message}); } else { res.json(response.toObject()); From 2f83043dd7a38fac1f17579c9b1f75e3bd10477a Mon Sep 17 00:00:00 2001 From: anatole Date: Tue, 15 Aug 2023 20:03:37 +0200 Subject: [PATCH 419/883] feat(global): add product service to the docker compose --- services/docker-compose.yml | 55 ++++++++++++++----- services/product/.env.example | 8 +-- services/product/.gitignore | 7 ++- .../product/src/handler/Category/create.ts | 2 +- services/product/src/server.ts | 14 ++--- 5 files changed, 59 insertions(+), 27 deletions(-) diff --git a/services/docker-compose.yml b/services/docker-compose.yml index 0d0b6a55..79ed53ae 100644 --- a/services/docker-compose.yml +++ b/services/docker-compose.yml @@ -14,7 +14,20 @@ services: networks: - goodfood-network - # delivery-service: + # Delivery service + + delivery-service: + image: goodfood-delivery:1.0.0 + build: + context: . + dockerfile: ./delivery/Dockerfile + env_file: + - delivery/.env.docker + ports: + - "50008" + networks: + - goodfood-network + delivery-redis: image: redis:latest ports: @@ -42,18 +55,6 @@ services: POSTGRES_DB: postgres PGDATA: /var/lib/postgresql/data/pgdata - delivery-service: - image: goodfood-delivery:1.0.0 - build: - context: . - dockerfile: ./delivery/Dockerfile - env_file: - - delivery/.env.docker - ports: - - "50008" - networks: - - goodfood-network - # Order service order-sercice: image: goodfood-order:1.0.0 @@ -81,9 +82,37 @@ services: POSTGRES_DB: postgres PGDATA: /var/lib/postgresql/data/pgdata + # Product service + product-service: + image: goodfood-product:1.0.0 + build: + context: . + dockerfile: ./product/Dockerfile + env_file: + - product/.env.docker + ports: + - "50004" + networks: + - goodfood-network + + product-postgres: + image: postgres:latest + ports: + - "5432" + volumes: + - goodfood-product-volume:/var/lib/postgresql/data + networks: + - goodfood-network + environment: + POSTGRES_USER: postgres + POSTGRES_PASSWORD: password + POSTGRES_DB: postgres + PGDATA: /var/lib/postgresql/data/pgdata + volumes: goodfood-delivery-volume: goodfood-order-volume: + goodfood-product-volume: networks: goodfood-network: \ No newline at end of file diff --git a/services/product/.env.example b/services/product/.env.example index aa4adfe8..296f701e 100644 --- a/services/product/.env.example +++ b/services/product/.env.example @@ -1,4 +1,4 @@ -DATABASE_URL="postgresql://postgres:postgres@127.0.0.1:5432/postgres" -PORT = 50004 -AZURE_STORAGE_SAS_TOKEN = "example" -AZURE_STORAGE_RESOURCE_NAME = "exemple" \ No newline at end of file +DATABASE_URL=postgres://postgres:password@postgres:5432/postgres +PORT=50004 +AZURE_STORAGE_SAS_TOKEN=example +AZURE_STORAGE_RESOURCE_NAME=exemple \ No newline at end of file diff --git a/services/product/.gitignore b/services/product/.gitignore index 660757fd..bee3adb2 100644 --- a/services/product/.gitignore +++ b/services/product/.gitignore @@ -172,4 +172,9 @@ override.tf.json # Ignore CLI configuration files .terraformrc -terraform.rc \ No newline at end of file +terraform.rc + +dist/ +bin/ +*.env* +!*.env.example diff --git a/services/product/src/handler/Category/create.ts b/services/product/src/handler/Category/create.ts index 54864366..158c57b7 100644 --- a/services/product/src/handler/Category/create.ts +++ b/services/product/src/handler/Category/create.ts @@ -15,7 +15,7 @@ export const CreateCategory = async ( !icon && icon.trim().length <= 0 && !hexa_color && hexa_color.trim().length <= 0 ) - throw(Error("Aucun des valeurs de la catégorie ne peuvent être null") as ServerErrorResponse) + throw(Error("Aucune des valeurs de la catégorie ne peuvent être null") as ServerErrorResponse) var categorieInDb = await prisma.category.findMany({ where: { diff --git a/services/product/src/server.ts b/services/product/src/server.ts index 9ec56dbf..01452020 100644 --- a/services/product/src/server.ts +++ b/services/product/src/server.ts @@ -1,13 +1,11 @@ -import { resolve as resolvePath } from "path"; +import {loadSync} from "@grpc/proto-loader"; +import {loadPackageDefinition, Server, ServerCredentials} from "@grpc/grpc-js"; -import { loadSync } from "@grpc/proto-loader"; -import { ServerCredentials, loadPackageDefinition, Server } from "@grpc/grpc-js"; +import {log, utils} from "./lib/log"; -import { log, utils } from "./lib/log"; +import {logGRPC} from "@product/middleware/log"; -import { logGRPC } from "@product/middleware/log"; - -import { createServerProxy } from "@product/lib/proxy"; +import {createServerProxy} from "@product/lib/proxy"; import AllergenHandler from "@product/handler/Allergen/index"; import CategoryHandler from "@product/handler/Category/index"; @@ -24,7 +22,7 @@ const options = { const serverInsecure = ServerCredentials.createInsecure(); const PORT = process.env.PORT || 50004; -const ADDRESS = `localhost:${PORT}`; +const ADDRESS = `0.0.0.0:${PORT}`; const PROTO_PATH = "../proto/product.proto"; const packageDefinition = loadSync(PROTO_PATH, options); From 6855aedbc7113cabed480701f84e74689b842a87 Mon Sep 17 00:00:00 2001 From: anatole Date: Tue, 15 Aug 2023 20:20:10 +0200 Subject: [PATCH 420/883] feat(global): add promotion service to the docker compose --- services/docker-compose.yml | 28 +++++++ .../controller/basket/basket.controller.ts | 15 ++-- .../delivery/delivery.controller.ts | 19 ++--- .../delivery/deliveryPerson.controller.ts | 18 ++--- .../src/controller/log/log.controller.ts | 6 +- .../controller/metric/metric.controller.ts | 6 +- .../src/controller/order/order.controller.ts | 24 ++---- .../controller/product/allergen.controller.ts | 15 ++-- .../controller/product/category.controller.ts | 15 ++-- .../controller/product/product.controller.ts | 21 ++--- .../promotion/promotion.controller.ts | 18 ++--- .../src/controller/stock/stock.controller.ts | 78 +++++++------------ .../stock/stockPerson.controller.ts | 3 +- .../src/controller/user/user.controller.ts | 24 ++---- services/promotions/.env.example | 2 +- 15 files changed, 116 insertions(+), 176 deletions(-) diff --git a/services/docker-compose.yml b/services/docker-compose.yml index 79ed53ae..a672240a 100644 --- a/services/docker-compose.yml +++ b/services/docker-compose.yml @@ -109,10 +109,38 @@ services: POSTGRES_DB: postgres PGDATA: /var/lib/postgresql/data/pgdata + # Promotion service + promotion-service: + image: goodfood-promotion:1.0.0 + build: + context: . + dockerfile: ./promotions/Dockerfile + env_file: + - promotions/.env.docker + ports: + - "50006" + networks: + - goodfood-network + + promotion-postgres: + image: postgres:latest + ports: + - "5432" + volumes: + - goodfood-promotion-volume:/var/lib/postgresql/data + networks: + - goodfood-network + environment: + POSTGRES_USER: postgres + POSTGRES_PASSWORD: password + POSTGRES_DB: postgres + PGDATA: /var/lib/postgresql/data/pgdata + volumes: goodfood-delivery-volume: goodfood-order-volume: goodfood-product-volume: + goodfood-promotion-volume: networks: goodfood-network: \ No newline at end of file diff --git a/services/gateway/src/controller/basket/basket.controller.ts b/services/gateway/src/controller/basket/basket.controller.ts index dd953884..abdcb2e3 100644 --- a/services/gateway/src/controller/basket/basket.controller.ts +++ b/services/gateway/src/controller/basket/basket.controller.ts @@ -9,8 +9,7 @@ basketRoutes.get('/api/basket/:userId', (req: Request, res: Response) => { basketServiceClient.getBasket(new UserId().setId(Number(userId)), (error, response) => { if (error) { - res.status(500) - res.json({error: error.message}); + res.status(500).send({error: error.message}); } else { res.json(response.toObject()); } @@ -22,8 +21,7 @@ basketRoutes.post('/api/basket', (req: Request, res: Response) => { const basketRequest = new ProductRequest().setUserId(userId).setProductId(productId).setRestaurantId(restaurantId); basketServiceClient.addProduct(basketRequest, (error, response) => { if (error) { - res.status(500) - res.json({error: error.message}); + res.status(500).send({error: error.message}); } else { res.json(response.toObject()); } @@ -36,8 +34,7 @@ basketRoutes.delete('/api/basket', (req: Request, res: Response) => { const basketRequest = new ProductRequest().setUserId(userId).setProductId(productId).setRestaurantId(restaurantId); basketServiceClient.deleteProduct(basketRequest, (error, response) => { if (error) { - res.status(500) - res.json({error: error.message}); + res.status(500).send({error: error.message}); } else { res.json(response.toObject()); } @@ -49,8 +46,7 @@ basketRoutes.put('/api/basket/restaurant', (req: Request, res: Response) => { const {restaurantId, userId} = req.body; basketServiceClient.updateRestaurant(new RestaurantRequest().setRestaurantId(restaurantId).setUserId(userId), (error, response) => { if (error) { - res.status(500) - res.json({error: error.message}); + res.status(500).send({error: error.message}); } else { res.json(response.toObject()); } @@ -62,8 +58,7 @@ basketRoutes.post('/api/basket/reset', (req: Request, res: Response) => { const {userId} = req.body; basketServiceClient.reset(new UserId().setId(userId), (error, response) => { if (error) { - res.status(500) - res.json({error: error.message}); + res.status(500).send({error: error.message}); } else { res.json(response.toObject()); } diff --git a/services/gateway/src/controller/delivery/delivery.controller.ts b/services/gateway/src/controller/delivery/delivery.controller.ts index 33844bf5..120857c4 100644 --- a/services/gateway/src/controller/delivery/delivery.controller.ts +++ b/services/gateway/src/controller/delivery/delivery.controller.ts @@ -9,9 +9,7 @@ deliveryRoutes.get('/api/delivery/:id', (req: Request, res: Response) => { deliveryServiceClient.getDelivery(new DeliveryId().setId(id), (error, response) => { if (error) { - res.status(500) - res.status(500) - res.json({error: error.message}); + res.status(500).send({error: error.message}); } else { res.json(response.toObject()); } @@ -24,8 +22,7 @@ deliveryRoutes.get('/api/delivery/by-restaurant/:id', (req: Request, res: Respon deliveryServiceClient.listDeliveriesByRestaurant(restaurantId, (error, response) => { if (error) { - res.status(500) - res.json({error: error.message}); + res.status(500).send({error: error.message}); } else { res.json(response.toObject()); } @@ -38,8 +35,7 @@ deliveryRoutes.get('/api/delivery/by-user/:id', (req: Request, res: Response) => deliveryServiceClient.listDeliveriesByUser(userId, (error, response) => { if (error) { - res.status(500) - res.json({error: error.message}); + res.status(500).send({error: error.message}); } else { res.json(response.toObject()); } @@ -65,8 +61,7 @@ deliveryRoutes.post('/api/delivery', (req: Request, res: Response) => { deliveryServiceClient.createDelivery(deliveryCreateInput, (error, response) => { console.log(error, response) if (error) { - res.status(500) - res.json({error: error.message}); + res.status(500).send({error: error.message}); } else { res.json(response.toObject()); } @@ -85,8 +80,7 @@ deliveryRoutes.put('/api/delivery/:id', (req: Request, res: Response) => { deliveryServiceClient.updateDelivery(delivery, (error, response) => { if (error) { - res.status(500) - res.json({error: error.message}); + res.status(500).send({error: error.message}); } else { res.json(response.toObject()); } @@ -98,8 +92,7 @@ deliveryRoutes.delete('/api/delivery/:id', (req: Request, res: Response) => { deliveryServiceClient.deleteDelivery(new DeliveryId().setId(id), (error, response) => { if (error) { - res.status(500) - res.json({error: error.message}); + res.status(500).send({error: error.message}); } else { res.json(response.toObject()); } diff --git a/services/gateway/src/controller/delivery/deliveryPerson.controller.ts b/services/gateway/src/controller/delivery/deliveryPerson.controller.ts index ab75c283..0df72e62 100644 --- a/services/gateway/src/controller/delivery/deliveryPerson.controller.ts +++ b/services/gateway/src/controller/delivery/deliveryPerson.controller.ts @@ -10,8 +10,7 @@ deliveryPersonRoutes.get('/api/delivery-person/:id', (req, res) => { deliveryPersonServiceClient.getDeliveryPerson(new DeliveryPersonId().setId(id), (error, response) => { if (error) { - res.status(500) - res.json({error: error.message}); + res.status(500).send({error: error.message}); } else { res.json(response.toObject()); } @@ -21,8 +20,7 @@ deliveryPersonRoutes.get('/api/delivery-person/:id', (req, res) => { deliveryPersonRoutes.get('/api/delivery-person', (req, res) => { deliveryPersonServiceClient.listDeliveryPersons(new Empty(), (error, response) => { if (error) { - res.status(500) - res.json({error: error.message}); + res.status(500).send({error: error.message}); } else { res.json(response.toObject()); } @@ -36,8 +34,7 @@ deliveryPersonRoutes.get('/api/delivery-person', (req, res) => { .setLongitude(lng); deliveryPersonServiceClient.listNearDeliveryPersons(location, (error, response) => { if (error) { - res.status(500) - res.json({error: error.message}); + res.status(500).send({error: error.message}); } else { res.json(response.toObject()); } @@ -53,8 +50,7 @@ deliveryPersonRoutes.post('/api/delivery-person', (req, res) => { .setLocationList(locationList); deliveryPersonServiceClient.createDeliveryPerson(deliveryPerson, (error, response) => { if (error) { - res.status(500) - res.json({error: error.message}); + res.status(500).send({error: error.message}); } else { res.json(response.toObject()); } @@ -72,8 +68,7 @@ deliveryPersonRoutes.put('/api/delivery-person/:id', (req, res) => { deliveryPersonServiceClient.updateDeliveryPerson(deliveryPerson, (error, response) => { if (error) { - res.status(500) - res.json({error: error.message}); + res.status(500).send({error: error.message}); } else { res.json(response.toObject()); } @@ -85,8 +80,7 @@ deliveryPersonRoutes.delete('/api/delivery-person/:id', (req, res) => { deliveryPersonServiceClient.deleteDeliveryPerson(new DeliveryPersonId().setId(id), (error, response) => { if (error) { - res.status(500) - res.json({error: error.message}); + res.status(500).send({error: error.message}); } else { res.json(response.toObject()); } diff --git a/services/gateway/src/controller/log/log.controller.ts b/services/gateway/src/controller/log/log.controller.ts index f42e5eaa..2dd59a70 100644 --- a/services/gateway/src/controller/log/log.controller.ts +++ b/services/gateway/src/controller/log/log.controller.ts @@ -9,8 +9,7 @@ logRoutes.get('/api/log', (req: express.Request, res: express.Response) => { logServiceClient.listLog(new Empty(), (error, response) => { if (error) { - res.status(500) - res.json({error: error.message}); + res.status(500).send({error: error.message}); } else { res.json(response.toObject()); } @@ -22,8 +21,7 @@ logRoutes.get('/api/log/:id', (req: express.Request, res: express.Response) => { logServiceClient.getLog(new GetLogRequest().setId(Number(id)), (error, response) => { if (error) { - res.status(500) - res.json({error: error.message}); + res.status(500).send({error: error.message}); } else { res.json(response.toObject()); } diff --git a/services/gateway/src/controller/metric/metric.controller.ts b/services/gateway/src/controller/metric/metric.controller.ts index 8225dd0d..186f9482 100644 --- a/services/gateway/src/controller/metric/metric.controller.ts +++ b/services/gateway/src/controller/metric/metric.controller.ts @@ -9,8 +9,7 @@ metricRoutes.get('/api/metric/:key', (req, res) => { const metricInput = new GetMetricRequest().setKey(key); metricService.getMetric(metricInput, (error, response) => { if (error) { - res.status(500) - res.json({error: error.message}); + res.status(500).send({error: error.message}); } else { res.json(response.toObject()); } @@ -24,8 +23,7 @@ metricRoutes.post('/api/metric', (req, res) => { metricService.pushMetric(newMetric, (error, response) => { if (error) { - res.status(500) - res.json({error: error.message}); + res.status(500).send({error: error.message}); } else { res.json(response.toObject()); } diff --git a/services/gateway/src/controller/order/order.controller.ts b/services/gateway/src/controller/order/order.controller.ts index e8675eac..992f587f 100644 --- a/services/gateway/src/controller/order/order.controller.ts +++ b/services/gateway/src/controller/order/order.controller.ts @@ -23,8 +23,7 @@ orderRoutes.get('/api/order/:id', (req: Request, res: Response) => { orderService.getOrder(orderId, (error, response) => { if (error) { - res.status(500) - res.json({error: error.message}); + res.status(500).send({error: error.message}); } else { res.json(response.toObject()); } @@ -61,8 +60,7 @@ orderRoutes.post('/api/order', (req: Request, res: Response) => { orderService.createOrder(orderInput, (error, response) => { if (error) { - res.status(500) - res.json({error: error.message}); + res.status(500).send({error: error.message}); } else { res.json(response.toObject()); } @@ -74,8 +72,7 @@ orderRoutes.get('/api/order/by-user/:userId', (req: Request, res: Response) => { const orderInput = new GetOrdersByUserRequest().setId(userId); orderService.getOrdersByUser(orderInput, (error, response) => { if (error) { - res.status(500) - res.json({error: error.message}); + res.status(500).send({error: error.message}); } else { res.json(response.toObject()); } @@ -87,8 +84,7 @@ orderRoutes.post('/api/order/by-status', (req: Request, res: Response) => { orderService.getOrdersByStatus(orderInput, (error, response) => { if (error) { - res.status(500) - res.json({error: error.message}); + res.status(500).send({error: error.message}); } else { res.json(response.toObject()); } @@ -100,8 +96,7 @@ orderRoutes.get('/api/order/by-delivery/:deliveryId', (req: Request, res: Respon const orderInput = new GetOrderByDeliveryRequest().setId(deliveryId); orderService.getOrderByDelivery(orderInput, (error, response) => { if (error) { - res.status(500) - res.json({error: error.message}); + res.status(500).send({error: error.message}); } else { res.json(response.toObject()); } @@ -113,8 +108,7 @@ orderRoutes.get('/api/order/by-payment/:paymentId', (req: Request, res: Response const orderInput = new GetOrderByPaymentRequest().setId(paymentId); orderService.getOrderByPayment(orderInput, (error, response) => { if (error) { - res.status(500) - res.json({error: error.message}); + res.status(500).send({error: error.message}); } else { res.json(response.toObject()); } @@ -131,8 +125,7 @@ orderRoutes.put('/api/order/:orderId', (req: Request, res: Response) => { .setRestaurantId(req.body.restaurantId); orderService.updateOrder(orderInput, (error, response) => { if (error) { - res.status(500) - res.json({error: error.message}); + res.status(500).send({error: error.message}); } else { res.json(response.toObject()); } @@ -144,8 +137,7 @@ orderRoutes.delete('/api/order/:orderId', (req: Request, res: Response) => { const orderInput = new DeleteOrderRequest().setId(orderId); orderService.deleteOrder(orderInput, (error, response) => { if (error) { - res.status(500) - res.json({error: error.message}); + res.status(500).send({error: error.message}); } else { res.json(response.toObject()); } diff --git a/services/gateway/src/controller/product/allergen.controller.ts b/services/gateway/src/controller/product/allergen.controller.ts index 575ae028..6a892df9 100644 --- a/services/gateway/src/controller/product/allergen.controller.ts +++ b/services/gateway/src/controller/product/allergen.controller.ts @@ -8,8 +8,7 @@ export const allergenRoutes = Router(); allergenRoutes.get('/api/allergen', (req: Request, res: Response) => { allergenServiceClient.getAllergenList(new Empty(), (error, response) => { if (error) { - res.status(500) - res.json({error: error.message}); + res.status(500).send({error: error.message}); } else { res.json(response.toObject()); } @@ -22,8 +21,7 @@ allergenRoutes.get('/api/allergen/:id', (req: Request, res: Response) => { allergenServiceClient.readAllergen(allergenId, (error, response) => { if (error) { - res.status(500) - res.json({error: error.message}); + res.status(500).send({error: error.message}); } else { res.json(response.toObject()); } @@ -35,8 +33,7 @@ allergenRoutes.post('/api/allergen', (req: Request, res: Response) => { const allergen = new Allergen().setLibelle(label); allergenServiceClient.createAllergen(allergen, (error, response) => { if (error) { - res.status(500) - res.json({error: error.message}); + res.status(500).send({error: error.message}); } else { res.json(response.toObject()); } @@ -49,8 +46,7 @@ allergenRoutes.put('/api/allergen/:id', (req: Request, res: Response) => { const allergen = new Allergen().setId(id).setLibelle(label); allergenServiceClient.updateAllergen(allergen, (error, response) => { if (error) { - res.status(500) - res.json({error: error.message}); + res.status(500).send({error: error.message}); } else { res.json(response.toObject()); } @@ -61,8 +57,7 @@ allergenRoutes.delete('/api/allergen/:id', (req: Request, res: Response) => { const {id} = req.params; allergenServiceClient.deleteAllergen(new AllergenId().setId(id), (error, response) => { if (error) { - res.status(500) - res.json({error: error.message}); + res.status(500).send({error: error.message}); } else { res.json(response.toObject()); } diff --git a/services/gateway/src/controller/product/category.controller.ts b/services/gateway/src/controller/product/category.controller.ts index 041b5b3c..2838aa8b 100644 --- a/services/gateway/src/controller/product/category.controller.ts +++ b/services/gateway/src/controller/product/category.controller.ts @@ -8,8 +8,7 @@ export const categoryRoutes = Router(); categoryRoutes.get('/api/category', (req: Request, res: Response) => { categoryServiceClient.getCategoryList(new Empty(), (error, response) => { if (error) { - res.status(500) - res.json({error: error.message}); + res.status(500).send({error: error.message}); } else { res.json(response.toObject()); } @@ -22,8 +21,7 @@ categoryRoutes.get('/api/category/:id', (req: Request, res: Response) => { categoryServiceClient.readCategory(categoryId, (error, response) => { if (error) { - res.status(500) - res.json({error: error.message}); + res.status(500).send({error: error.message}); } else { res.json(response.toObject()); } @@ -35,8 +33,7 @@ categoryRoutes.post('/api/category', (req: Request, res: Response) => { const category = new Category().setLibelle(label).setIcon(icon).setHexaColor(hexaColor) categoryServiceClient.createCategory(category, (error, response) => { if (error) { - res.status(500) - res.json({error: error.message}); + res.status(500).send({error: error.message}); } else { res.json(response.toObject()); } @@ -49,8 +46,7 @@ categoryRoutes.put('/api/category/:id', (req: Request, res: Response) => { const category = new Category().setId(id).setLibelle(label).setIcon(icon).setHexaColor(hexaColor) categoryServiceClient.updateCategory(category, (error, response) => { if (error) { - res.status(500) - res.json({error: error.message}); + res.status(500).send({error: error.message}); } else { res.json(response.toObject()); } @@ -61,8 +57,7 @@ categoryRoutes.delete('/api/category/:id', (req: Request, res: Response) => { const {id} = req.params; categoryServiceClient.deleteCategory(new CategoryId().setId(id), (error, response) => { if (error) { - res.status(500) - res.json({error: error.message}); + res.status(500).send({error: error.message}); } else { res.json(response.toObject()); } diff --git a/services/gateway/src/controller/product/product.controller.ts b/services/gateway/src/controller/product/product.controller.ts index 378cc910..f5098c65 100644 --- a/services/gateway/src/controller/product/product.controller.ts +++ b/services/gateway/src/controller/product/product.controller.ts @@ -12,8 +12,7 @@ productRoutes.get('/api/product/by-restaurant/:id', (req: Request, res: Response productServiceClient.getProductList(restaurantId, (error, response) => { if (error) { - res.status(500) - res.json({error: error.message}); + res.status(500).send({error: error.message}); } else { res.json(response.toObject()); } @@ -26,8 +25,7 @@ productRoutes.get('/api/product/:id', (req: Request, res: Response) => { productServiceClient.readProduct(productId, (error, response) => { if (error) { - res.status(500) - res.json({error: error.message}); + res.status(500).send({error: error.message}); } else { res.json(response.toObject()); } @@ -37,8 +35,7 @@ productRoutes.get('/api/product/:id', (req: Request, res: Response) => { productRoutes.get('/api/product/type', (req: Request, res: Response) => { productServiceClient.getProductTypeList(new Empty(), (error, response) => { if (error) { - res.status(500) - res.json({error: error.message}); + res.status(500).send({error: error.message}); } else { res.json(response.toObject()); } @@ -50,8 +47,7 @@ productRoutes.delete('/api/product/:id', (req: Request, res: Response) => { const productId = new ProductId().setId(id) productServiceClient.deleteProduct(productId, (error, response) => { if (error) { - res.status(500) - res.json({error: error.message}); + res.status(500).send({error: error.message}); } else { res.json(response.toObject()); } @@ -94,8 +90,7 @@ productRoutes.post('/api/product', (req: Request, res: Response) => { productServiceClient.createProduct(productId, (error, response) => { if (error) { - res.status(500) - res.json({error: error.message}); + res.status(500).send({error: error.message}); } else { res.json(response.toObject()); } @@ -139,8 +134,7 @@ productRoutes.put('/api/product/:id', (req: Request, res: Response) => { productServiceClient.createProduct(productId, (error, response) => { if (error) { - res.status(500) - res.json({error: error.message}); + res.status(500).send({error: error.message}); } else { res.json(response.toObject()); } @@ -155,8 +149,7 @@ productRoutes.post('/api/product/image', (req: Request, res: Response) => { const file = new File().setName(input_file).setData(base64File); productServiceClient.uploadImage(file, (error, response) => { if (error) { - res.status(500) - res.json({error: error.message}); + res.status(500).send({error: error.message}); } else { res.json(response.toObject()); } diff --git a/services/gateway/src/controller/promotion/promotion.controller.ts b/services/gateway/src/controller/promotion/promotion.controller.ts index 6330056f..4b8b9d62 100644 --- a/services/gateway/src/controller/promotion/promotion.controller.ts +++ b/services/gateway/src/controller/promotion/promotion.controller.ts @@ -9,8 +9,7 @@ promotionRoutes.get('/api/promotion/:code', (req, res) => { const {code} = req.params; promotionServiceClient.getPromotion(new PromotionCode().setCode(code), (error, response) => { if (error) { - res.status(500) - res.json({error: error.message}); + res.status(500).send({error: error.message}); } else { res.json(response.toObject()); } @@ -20,8 +19,7 @@ promotionRoutes.get('/api/promotion/:code', (req, res) => { promotionRoutes.get('/api/promotion', (req, res) => { promotionServiceClient.getPromotions(new Empty(), (error, response) => { if (error) { - res.status(500) - res.json({error: error.message}); + res.status(500).send({error: error.message}); } else { res.json(response.toObject()); } @@ -32,8 +30,7 @@ promotionRoutes.get('/api/promotion/by-restaurant/:restaurantId', (req, res) => const {restaurantId} = req.params; promotionServiceClient.getPromotionsByRestaurant(new RestaurantId().setId(restaurantId), (error, response) => { if (error) { - res.status(500) - res.json({error: error.message}); + res.status(500).send({error: error.message}); } else { res.json(response.toObject()); } @@ -48,8 +45,7 @@ promotionRoutes.post('/api/promotion', (req, res) => { .setRestaurantId(restaurantId); promotionServiceClient.createPromotion(promotionCreateInput, (error, response) => { if (error) { - res.status(500) - res.json({error: error.message}); + res.status(500).send({error: error.message}); } else { res.json(response.toObject()); } @@ -66,8 +62,7 @@ promotionRoutes.put('/api/promotion/:id', (req, res) => { promotionServiceClient.createPromotion(promotionUpdateInput, (error, response) => { if (error) { - res.status(500) - res.json({error: error.message}); + res.status(500).send({error: error.message}); } else { res.json(response.toObject()); } @@ -79,8 +74,7 @@ promotionRoutes.delete('/api/promotion/:id', (req, res) => { promotionServiceClient.deletePromotion(new PromotionId().setId(id), (error, response) => { if (error) { - res.status(500) - res.json({error: error.message}); + res.status(500).send({error: error.message}); } else { res.json(response.toObject()); } diff --git a/services/gateway/src/controller/stock/stock.controller.ts b/services/gateway/src/controller/stock/stock.controller.ts index 4525df45..f9a63d4e 100644 --- a/services/gateway/src/controller/stock/stock.controller.ts +++ b/services/gateway/src/controller/stock/stock.controller.ts @@ -37,8 +37,7 @@ stockRoutes.get('/api/stock/supplier/:id', (req: Request, res: Response) => { stockServiceClient.getSupplier(supplierRequest, (error, response) => { if (error) { - res.status(500) - res.json({error: error.message}); + res.status(500).send({error: error.message}); } else { res.json(response.toObject()); } @@ -49,8 +48,7 @@ stockRoutes.get('/api/stock/supplier', (req: Request, res: Response) => { stockServiceClient.getSuppliers(new Empty(), (error, response) => { if (error) { - res.status(500) - res.json({error: error.message}); + res.status(500).send({error: error.message}); } else { res.json(response.toObject()); } @@ -63,8 +61,7 @@ stockRoutes.get('/api/stock/ingredient/:id', (req: Request, res: Response) => { stockServiceClient.getIngredient(ingredientRequest, (error, response) => { if (error) { - res.status(500) - res.json({error: error.message}); + res.status(500).send({error: error.message}); } else { res.json(response.toObject()); } @@ -75,8 +72,7 @@ stockRoutes.get('/api/stock/ingredient', (req: Request, res: Response) => { stockServiceClient.getIngredients(new Empty(), (error, response) => { if (error) { - res.status(500) - res.json({error: error.message}); + res.status(500).send({error: error.message}); } else { res.json(response.toObject()); } @@ -89,8 +85,7 @@ stockRoutes.post('/api/stock/ingredient', (req: Request, res: Response) => { stockServiceClient.createIngredient(ingredientRequest, (error, response) => { if (error) { - res.status(500) - res.json({error: error.message}); + res.status(500).send({error: error.message}); } else { res.json(response.toObject()); } @@ -104,8 +99,7 @@ stockRoutes.put('/api/stock/ingredient/:id', (req: Request, res: Response) => { stockServiceClient.updateIngredient(ingredientRequest, (error, response) => { if (error) { - res.status(500) - res.json({error: error.message}); + res.status(500).send({error: error.message}); } else { res.json(response.toObject()); } @@ -118,8 +112,7 @@ stockRoutes.delete('/api/stock/ingredient/:id', (req: Request, res: Response) => stockServiceClient.deleteIngredient(ingredientRequest, (error, response) => { if (error) { - res.status(500) - res.json({error: error.message}); + res.status(500).send({error: error.message}); } else { res.json(response.toObject()); } @@ -132,8 +125,7 @@ stockRoutes.delete('/api/stock/ingredient/:id', (req: Request, res: Response) => stockServiceClient.deleteIngredient(ingredientRequest, (error, response) => { if (error) { - res.status(500) - res.json({error: error.message}); + res.status(500).send({error: error.message}); } else { res.json(response.toObject()); } @@ -150,8 +142,7 @@ stockRoutes.get('/api/stock/ingredient/restaurant/:id', (req: Request, res: Resp stockServiceClient.getIngredientRestaurant(ingredientRestaurantRequest, (error, response) => { if (error) { - res.status(500) - res.json({error: error.message}); + res.status(500).send({error: error.message}); } else { res.json(response.toObject()); } @@ -164,8 +155,7 @@ stockRoutes.get('/api/stock/ingredient/restaurant/by-restaurant/:id', (req: Requ stockServiceClient.getIngredientRestaurantsByRestaurant(ingredientRestaurantsByRestaurantRequest, (error, response) => { if (error) { - res.status(500) - res.json({error: error.message}); + res.status(500).send({error: error.message}); } else { res.json(response.toObject()); } @@ -178,8 +168,7 @@ stockRoutes.get('/api/stock/ingredient/restaurant/by-product/:id', (req: Request stockServiceClient.getIngredientRestaurantsByProduct(ingredientRestaurantsByProductRequest, (error, response) => { if (error) { - res.status(500) - res.json({error: error.message}); + res.status(500).send({error: error.message}); } else { res.json(response.toObject()); } @@ -199,8 +188,7 @@ stockRoutes.post('/api/stock/ingredient/restaurant', (req: Request, res: Respons stockServiceClient.createIngredientRestaurant(ingredientRestaurant, (error, response) => { if (error) { - res.status(500) - res.json({error: error.message}); + res.status(500).send({error: error.message}); } else { res.json(response.toObject()); } @@ -221,8 +209,7 @@ stockRoutes.put('/api/stock/ingredient/restaurant/:id', (req: Request, res: Resp stockServiceClient.updateIngredientRestaurant(ingredientRestaurant, (error, response) => { if (error) { - res.status(500) - res.json({error: error.message}); + res.status(500).send({error: error.message}); } else { res.json(response.toObject()); } @@ -234,8 +221,7 @@ stockRoutes.delete('/api/stock/ingredient/restaurant/:id', (req: Request, res: R stockServiceClient.deleteIngredientRestaurant(new DeleteIngredientRestaurantRequest().setId(Number(id)), (error, response) => { if (error) { - res.status(500) - res.json({error: error.message}); + res.status(500).send({error: error.message}); } else { res.json(response.toObject()); } @@ -251,8 +237,7 @@ stockRoutes.get('/api/stock/supplier/:id', (req: Request, res: Response) => { stockServiceClient.getSupplier(new GetSupplierRequest().setId(Number(id)), (error, response) => { if (error) { - res.status(500) - res.json({error: error.message}); + res.status(500).send({error: error.message}); } else { res.json(response.toObject()); } @@ -262,8 +247,7 @@ stockRoutes.get('/api/stock/supplier/:id', (req: Request, res: Response) => { stockRoutes.get('/api/stock/supplier', (req: Request, res: Response) => { stockServiceClient.getSuppliers(new Empty(), (error, response) => { if (error) { - res.status(500) - res.json({error: error.message}); + res.status(500).send({error: error.message}); } else { res.json(response.toObject()); } @@ -276,8 +260,7 @@ stockRoutes.post('/api/stock/supplier', (req: Request, res: Response) => { stockServiceClient.createSupplier(supplierRequest, (error, response) => { if (error) { - res.status(500) - res.json({error: error.message}); + res.status(500).send({error: error.message}); } else { res.json(response.toObject()); } @@ -291,8 +274,7 @@ stockRoutes.put('/api/stock/supplier/:id', (req: Request, res: Response) => { stockServiceClient.updateSupplier(supplierRequest, (error, response) => { if (error) { - res.status(500) - res.json({error: error.message}); + res.status(500).send({error: error.message}); } else { res.json(response.toObject()); } @@ -304,8 +286,7 @@ stockRoutes.delete('/api/stock/supplier/:id', (req: Request, res: Response) => { stockServiceClient.deleteSupplier(new DeleteSupplierRequest().setId(Number(id)), (error, response) => { if (error) { - res.status(500) - res.json({error: error.message}); + res.status(500).send({error: error.message}); } else { res.json(response.toObject()); } @@ -321,8 +302,7 @@ stockRoutes.get('/api/stock/supply/order/:id', (req: Request, res: Response) => stockServiceClient.getSupplyOrder(new GetSupplyOrderRequest().setId(Number(id)), (error, response) => { if (error) { - res.status(500) - res.json({error: error.message}); + res.status(500).send({error: error.message}); } else { res.json(response.toObject()); } @@ -333,8 +313,7 @@ stockRoutes.get('/api/stock/supply/order/by-restaurant/:id', (req: Request, res: const {id} = req.params; stockServiceClient.getSupplyOrdersByRestaurant(new GetSupplyOrdersByRestaurantRequest().setRestaurantId(id), (error, response) => { if (error) { - res.status(500) - res.json({error: error.message}); + res.status(500).send({error: error.message}); } else { res.json(response.toObject()); } @@ -345,8 +324,7 @@ stockRoutes.get('/api/stock/supply/order/by-supplier/:id', (req: Request, res: R const {id} = req.params; stockServiceClient.getSupplyOrdersBySupplier(new GetSupplyOrdersBySupplierRequest().setSupplierId(Number(id)), (error, response) => { if (error) { - res.status(500) - res.json({error: error.message}); + res.status(500).send({error: error.message}); } else { res.json(response.toObject()); } @@ -357,8 +335,7 @@ stockRoutes.get('/api/stock/supply/order/by-ingredient-restaurant/:id', (req: Re const {id} = req.params; stockServiceClient.getSupplyOrdersByIngredientRestaurant(new GetSupplyOrdersByIngredientRestaurantRequest().setIngredientRestaurantId(Number(id)), (error, response) => { if (error) { - res.status(500) - res.json({error: error.message}); + res.status(500).send({error: error.message}); } else { res.json(response.toObject()); } @@ -373,8 +350,7 @@ stockRoutes.post('/api/stock/supply/order', (req: Request, res: Response) => { stockServiceClient.createSupplyOrder(supplyOrderRequest, (error, response) => { if (error) { - res.status(500) - res.json({error: error.message}); + res.status(500).send({error: error.message}); } else { res.json(response.toObject()); } @@ -390,8 +366,7 @@ stockRoutes.put('/api/stock/supply/order/:id', (req: Request, res: Response) => stockServiceClient.updateSupplyOrder(supplyOrderRequest, (error, response) => { if (error) { - res.status(500) - res.json({error: error.message}); + res.status(500).send({error: error.message}); } else { res.json(response.toObject()); } @@ -402,8 +377,7 @@ stockRoutes.delete('/api/stock/supply/order/:id', (req: Request, res: Response) const {id} = req.params; stockServiceClient.deleteSupplyOrder(new DeleteSupplyOrderRequest().setId(Number(id)), (error, response) => { if (error) { - res.status(500) - res.json({error: error.message}); + res.status(500).send({error: error.message}); } else { res.json(response.toObject()); } diff --git a/services/gateway/src/controller/stock/stockPerson.controller.ts b/services/gateway/src/controller/stock/stockPerson.controller.ts index 5d3b8504..cc8c9bf8 100644 --- a/services/gateway/src/controller/stock/stockPerson.controller.ts +++ b/services/gateway/src/controller/stock/stockPerson.controller.ts @@ -11,8 +11,7 @@ stockPersonRoutes.post('/api/stock/outcomes/by-restaurant/:id', (req: Request, r stockPersonServiceClient.getOutcomesByRestaurant(outcomesByRestaurantRequest, (error, response) => { if (error) { - res.status(500) - res.json({error: error.message}); + res.status(500).send({error: error.message}); } else { res.json(response.toObject()); } diff --git a/services/gateway/src/controller/user/user.controller.ts b/services/gateway/src/controller/user/user.controller.ts index 7605bdcd..eb5c8e5f 100644 --- a/services/gateway/src/controller/user/user.controller.ts +++ b/services/gateway/src/controller/user/user.controller.ts @@ -26,8 +26,7 @@ userRoutes.get('/api/user/:id', (req: Request, res: Response) => { userRoutes.get('/api/user', (req: Request, res: Response) => { userServiceClient.listUser(new Empty(), (error, response) => { if (error) { - res.status(500) - res.json({error: error.message}); + res.status(500).send({error: error.message}); } else { res.json(response.toObject()); } @@ -52,8 +51,7 @@ userRoutes.post('/api/user', (req: Request, res: Response) => { userServiceClient.register(userInput, (error, response) => { if (error) { - res.status(500) - res.json({error: error.message}); + res.status(500).send({error: error.message}); } else { res.json(response.toObject()); } @@ -86,8 +84,7 @@ userRoutes.put('/api/user/:id', (req: Request, res: Response) => { userServiceClient.updateUser(userInput, (error, response) => { if (error) { - res.status(500) - res.json({error: error.message}); + res.status(500).send({error: error.message}); } else { res.json(response.toObject()); } @@ -104,8 +101,7 @@ userRoutes.delete('/api/user/:id', (req: Request, res: Response) => { userServiceClient.deleteUser(new DeleteInput().setUserid(Number(id)).setToken(authorization), (error, response) => { if (error) { - res.status(500) - res.json({error: error.message}); + res.status(500).send({error: error.message}); } else { res.json(response.toObject()); } @@ -118,8 +114,7 @@ userRoutes.post('/api/user/login', (req: Request, res: Response) => { userServiceClient.logIn(inInput, (error, response) => { if (error) { - res.status(500) - res.json({error: error.message}); + res.status(500).send({error: error.message}); } else { res.json(response.toObject()); } @@ -136,8 +131,7 @@ userRoutes.post('/api/user/validate', (req: Request, res: Response) => { userServiceClient.validate(validate, (error, response) => { if (error) { - res.status(500) - res.json({error: error.message}); + res.status(500).send({error: error.message}); } else { res.json(response.toObject()); } @@ -164,8 +158,7 @@ userRoutes.put('/api/user/:id/password', (req: Request, res: Response) => { userServiceClient.changePassword(updatePasswordInput, (error, response) => { if (error) { - res.status(500) - res.json({error: error.message}); + res.status(500).send({error: error.message}); } else { res.json(response.toObject()); } @@ -191,8 +184,7 @@ userRoutes.put('/api/user/:id/role', (req: Request, res: Response) => { } userServiceClient.changeRole(updatePasswordInput, (error, response) => { if (error) { - res.status(500) - res.json({error: error.message}); + res.status(500).send({error: error.message}); } else { res.json(response.toObject()); } diff --git a/services/promotions/.env.example b/services/promotions/.env.example index b1adbc98..e1787832 100644 --- a/services/promotions/.env.example +++ b/services/promotions/.env.example @@ -1,4 +1,4 @@ -DATABASE_URL=postgresql://postgres:postgres@localhost:5432/promotions +DATABASE_URL=postgres://postgres:password@localhost:5432/promotions AMQP_URL=amqp://guest:guest@localhost PORT=50006 \ No newline at end of file From b35472a2f00596976f5622919c3ad6b5531fc60a Mon Sep 17 00:00:00 2001 From: anatole Date: Tue, 15 Aug 2023 20:34:33 +0200 Subject: [PATCH 421/883] feat(global): add stock service to the docker compose --- services/docker-compose.yml | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/services/docker-compose.yml b/services/docker-compose.yml index a672240a..364a6aea 100644 --- a/services/docker-compose.yml +++ b/services/docker-compose.yml @@ -136,11 +136,39 @@ services: POSTGRES_DB: postgres PGDATA: /var/lib/postgresql/data/pgdata + # Stock service + stock-service: + image: goodfood-stock:1.0.0 + build: + context: . + dockerfile: ./stock/Dockerfile + env_file: + - stock/.env.docker + ports: + - "50009" + networks: + - goodfood-network + + stock-postgres: + image: postgres:latest + ports: + - "5432" + volumes: + - goodfood-stock-volume:/var/lib/postgresql/data + networks: + - goodfood-network + environment: + POSTGRES_USER: postgres + POSTGRES_PASSWORD: password + POSTGRES_DB: postgres + PGDATA: /var/lib/postgresql/data/pgdata + volumes: goodfood-delivery-volume: goodfood-order-volume: goodfood-product-volume: goodfood-promotion-volume: + goodfood-stock-volume: networks: goodfood-network: \ No newline at end of file From 1ab21f80c4873b49d8ac4f645c31de4a0a0cce4a Mon Sep 17 00:00:00 2001 From: anatole Date: Sat, 19 Aug 2023 17:27:11 +0200 Subject: [PATCH 422/883] feat(global): add env.docker --- services/basket/.env.docker | 2 ++ services/basket/src/lib/redis.ts | 2 +- services/delivery/.env.docker | 3 +++ services/delivery/.gitignore | 1 + services/docker-compose.yml | 37 ++++++++++++++++++++++++++++++-- services/gateway/.gitignore | 1 + services/log/.env.docker | 3 +++ services/order/.env.docker | 3 +++ services/order/.gitignore | 1 + services/product/.env.docker | 4 ++++ services/product/.gitignore | 1 + services/promotions/.env.docker | 4 ++++ services/promotions/.gitignore | 3 ++- services/stock/.env.docker | 4 ++++ services/stock/.gitignore | 1 + 15 files changed, 66 insertions(+), 4 deletions(-) create mode 100644 services/basket/.env.docker create mode 100644 services/delivery/.env.docker create mode 100644 services/log/.env.docker create mode 100644 services/order/.env.docker create mode 100644 services/product/.env.docker create mode 100644 services/promotions/.env.docker create mode 100644 services/stock/.env.docker diff --git a/services/basket/.env.docker b/services/basket/.env.docker new file mode 100644 index 00000000..82c59d77 --- /dev/null +++ b/services/basket/.env.docker @@ -0,0 +1,2 @@ +REDIS_URL=redis://basket-redis:6379 +PORT=50002 \ No newline at end of file diff --git a/services/basket/src/lib/redis.ts b/services/basket/src/lib/redis.ts index dd6f1206..62e32b53 100644 --- a/services/basket/src/lib/redis.ts +++ b/services/basket/src/lib/redis.ts @@ -1,6 +1,6 @@ import {createClient} from "redis"; -const client = createClient(); +const client = createClient({url: process.env.REDIS_URL}); client.on('error', (err: any) => { console.log('could not establish a connection with redis. ' + err); diff --git a/services/delivery/.env.docker b/services/delivery/.env.docker new file mode 100644 index 00000000..db4361a8 --- /dev/null +++ b/services/delivery/.env.docker @@ -0,0 +1,3 @@ +DATABASE_URL=postgres://postgres:password@delivery-postgres:5432/postgres +PORT=50008 +REDIS_HOST: delivery-redis \ No newline at end of file diff --git a/services/delivery/.gitignore b/services/delivery/.gitignore index 31e50325..868e8430 100644 --- a/services/delivery/.gitignore +++ b/services/delivery/.gitignore @@ -3,4 +3,5 @@ dist/ bin/ *.env* !*.env.example +!*.env.docker diff --git a/services/docker-compose.yml b/services/docker-compose.yml index 364a6aea..71c4f35b 100644 --- a/services/docker-compose.yml +++ b/services/docker-compose.yml @@ -1,12 +1,13 @@ version: "3" services: - # gateway: + + # Gateway : + gateway: image: goodfood-gateway:1.0.0 build: context: . dockerfile: ./gateway/Dockerfile - env_file: - ./gateway/.env ports: @@ -14,6 +15,33 @@ services: networks: - goodfood-network + # Basket service + + basket-service: + image: goodfood-basket:1.0.0 + build: + context: . + dockerfile: ./basket/Dockerfile + env_file: + - basket/.env.docker + ports: + - "50002" + networks: + - goodfood-network + + basket-redis: + image: redis:latest + ports: + - "6379" + volumes: + - goodfood-basket-volume:/data + networks: + - goodfood-network + command: redis-server --appendonly yes + environment: + REDIS_USERNAME: redis + REDIS_PASSWORD: password + # Delivery service delivery-service: @@ -83,6 +111,7 @@ services: PGDATA: /var/lib/postgresql/data/pgdata # Product service + product-service: image: goodfood-product:1.0.0 build: @@ -110,6 +139,7 @@ services: PGDATA: /var/lib/postgresql/data/pgdata # Promotion service + promotion-service: image: goodfood-promotion:1.0.0 build: @@ -137,6 +167,7 @@ services: PGDATA: /var/lib/postgresql/data/pgdata # Stock service + stock-service: image: goodfood-stock:1.0.0 build: @@ -164,6 +195,8 @@ services: PGDATA: /var/lib/postgresql/data/pgdata volumes: +volumes: + goodfood-basket-volume: goodfood-delivery-volume: goodfood-order-volume: goodfood-product-volume: diff --git a/services/gateway/.gitignore b/services/gateway/.gitignore index 583204b4..82abeb3b 100644 --- a/services/gateway/.gitignore +++ b/services/gateway/.gitignore @@ -3,3 +3,4 @@ dist/ bin/ *.env* !*.env.example +!*.env.docker diff --git a/services/log/.env.docker b/services/log/.env.docker new file mode 100644 index 00000000..c42a8786 --- /dev/null +++ b/services/log/.env.docker @@ -0,0 +1,3 @@ +DATABASE_URL=postgres://postgres:password@log-postgres:5432/postgres +PORT=50021 +AMQP_URL=amqp://guest:guest@log-rabbitmq:5672 \ No newline at end of file diff --git a/services/order/.env.docker b/services/order/.env.docker new file mode 100644 index 00000000..29a1c0fb --- /dev/null +++ b/services/order/.env.docker @@ -0,0 +1,3 @@ +DATABASE_URL=postgres://postgres:password@order-postgres:5432/postgres +AMQP_URL=amqp://guest:guest@log-service:50021 +PORT=50007 \ No newline at end of file diff --git a/services/order/.gitignore b/services/order/.gitignore index 583204b4..82abeb3b 100644 --- a/services/order/.gitignore +++ b/services/order/.gitignore @@ -3,3 +3,4 @@ dist/ bin/ *.env* !*.env.example +!*.env.docker diff --git a/services/product/.env.docker b/services/product/.env.docker new file mode 100644 index 00000000..3e8bc019 --- /dev/null +++ b/services/product/.env.docker @@ -0,0 +1,4 @@ +DATABASE_URL=postgres://postgres:password@product-postgres:5432/postgres +PORT=50004 +AZURE_STORAGE_SAS_TOKEN=example +AZURE_STORAGE_RESOURCE_NAME=exemple \ No newline at end of file diff --git a/services/product/.gitignore b/services/product/.gitignore index bee3adb2..ca835776 100644 --- a/services/product/.gitignore +++ b/services/product/.gitignore @@ -178,3 +178,4 @@ dist/ bin/ *.env* !*.env.example +!*.env.docker diff --git a/services/promotions/.env.docker b/services/promotions/.env.docker new file mode 100644 index 00000000..114b6446 --- /dev/null +++ b/services/promotions/.env.docker @@ -0,0 +1,4 @@ +DATABASE_URL=postgres://postgres:password@promotion-postgres:5432/promotions +AMQP_URL=amqp://guest:guest@log-service:50021 + +PORT=50006 \ No newline at end of file diff --git a/services/promotions/.gitignore b/services/promotions/.gitignore index bab9187d..7de297b6 100644 --- a/services/promotions/.gitignore +++ b/services/promotions/.gitignore @@ -2,4 +2,5 @@ node_modules/ dist/ bin/ *.env* -!*.env.example \ No newline at end of file +!*.env.example +!*.env.docker \ No newline at end of file diff --git a/services/stock/.env.docker b/services/stock/.env.docker new file mode 100644 index 00000000..3798f17f --- /dev/null +++ b/services/stock/.env.docker @@ -0,0 +1,4 @@ +DATABASE_URL=postgres://postgres:password@stock-postgres:5432/postgres +AMQP_URL=amqp://guest:guest@log-service:50021 + +PORT=50009 \ No newline at end of file diff --git a/services/stock/.gitignore b/services/stock/.gitignore index 583204b4..82abeb3b 100644 --- a/services/stock/.gitignore +++ b/services/stock/.gitignore @@ -3,3 +3,4 @@ dist/ bin/ *.env* !*.env.example +!*.env.docker From 9d89344f68cf672d1fd3a14c3ae3ef5610a60886 Mon Sep 17 00:00:00 2001 From: anatole Date: Sat, 19 Aug 2023 17:40:37 +0200 Subject: [PATCH 423/883] feat(basket): update gitignore --- services/basket/.gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/services/basket/.gitignore b/services/basket/.gitignore index 31e50325..868e8430 100644 --- a/services/basket/.gitignore +++ b/services/basket/.gitignore @@ -3,4 +3,5 @@ dist/ bin/ *.env* !*.env.example +!*.env.docker From e65c2e11b819dab24ffa4b55934092a44d54082e Mon Sep 17 00:00:00 2001 From: anatole Date: Sat, 19 Aug 2023 18:02:17 +0200 Subject: [PATCH 424/883] feat(global): add log service to the docker compose --- services/basket/.env.docker | 3 ++- services/basket/.env.example | 3 ++- services/delivery/.env.docker | 1 + services/delivery/.env.example | 1 + services/docker-compose.yml | 42 +++++++++++++++++++++++++++++++- services/order/.env.docker | 2 +- services/order/.env.example | 2 +- services/payment/.env.example | 2 +- services/product/.env.docker | 1 + services/product/.env.example | 1 + services/promotions/.env.docker | 2 +- services/promotions/.env.example | 2 +- services/stock/.env.docker | 2 +- services/stock/.env.example | 2 +- 14 files changed, 56 insertions(+), 10 deletions(-) diff --git a/services/basket/.env.docker b/services/basket/.env.docker index 82c59d77..c0e31609 100644 --- a/services/basket/.env.docker +++ b/services/basket/.env.docker @@ -1,2 +1,3 @@ REDIS_URL=redis://basket-redis:6379 -PORT=50002 \ No newline at end of file +PORT=50002 +AMQP_URL=amqp://guest:guest@log-rabbitmq \ No newline at end of file diff --git a/services/basket/.env.example b/services/basket/.env.example index 9fcb03c6..97d7165f 100644 --- a/services/basket/.env.example +++ b/services/basket/.env.example @@ -1,2 +1,3 @@ REDIS_URL=redis://localhost:6379/0 -PORT=50002 \ No newline at end of file +PORT=50002 +AMQP_URL=amqp://guest:guest@log-rabbitmq \ No newline at end of file diff --git a/services/delivery/.env.docker b/services/delivery/.env.docker index db4361a8..9d480629 100644 --- a/services/delivery/.env.docker +++ b/services/delivery/.env.docker @@ -1,3 +1,4 @@ DATABASE_URL=postgres://postgres:password@delivery-postgres:5432/postgres PORT=50008 +AMQP_URL=amqp://guest:guest@log-rabbitmq REDIS_HOST: delivery-redis \ No newline at end of file diff --git a/services/delivery/.env.example b/services/delivery/.env.example index 1982e30b..1564809d 100644 --- a/services/delivery/.env.example +++ b/services/delivery/.env.example @@ -1,4 +1,5 @@ DATABASE_URL=postgres://postgres:password@localhost:5432/postgres PORT=50008 +AMQP_URL=amqp://guest:guest@log-rabbitmq # with docker add : # REDIS_HOST: delivery-redis \ No newline at end of file diff --git a/services/docker-compose.yml b/services/docker-compose.yml index 71c4f35b..04330d2a 100644 --- a/services/docker-compose.yml +++ b/services/docker-compose.yml @@ -194,7 +194,46 @@ services: POSTGRES_DB: postgres PGDATA: /var/lib/postgresql/data/pgdata -volumes: + # Log service + + log-service: + depends_on: + - log-postgres + - log-rabbitmq + restart: + always + image: floriaaan/goodfood-log:latest + build: + context: . + dockerfile: ./log/Dockerfile + env_file: + - ./log/.env.docker + ports: + - "50021" + networks: + - goodfood-network + + log-rabbitmq: + restart: always + image: rabbitmq:3-management + ports: + - "5672" + - "15672" + networks: + - goodfood-network + + log-postgres: + image: postgres:15.2 + environment: + - POSTGRES_USER=postgres + - POSTGRES_PASSWORD=password + ports: + - "5432" + volumes: + - goodfood-log-volume:/var/lib/postgresql/data + networks: + - goodfood-network + volumes: goodfood-basket-volume: goodfood-delivery-volume: @@ -202,6 +241,7 @@ volumes: goodfood-product-volume: goodfood-promotion-volume: goodfood-stock-volume: + goodfood-log-volume: networks: goodfood-network: \ No newline at end of file diff --git a/services/order/.env.docker b/services/order/.env.docker index 29a1c0fb..6c59b038 100644 --- a/services/order/.env.docker +++ b/services/order/.env.docker @@ -1,3 +1,3 @@ DATABASE_URL=postgres://postgres:password@order-postgres:5432/postgres -AMQP_URL=amqp://guest:guest@log-service:50021 +AMQP_URL=amqp://guest:guest@log-rabbitmq PORT=50007 \ No newline at end of file diff --git a/services/order/.env.example b/services/order/.env.example index 2e790ca5..5a5e841f 100644 --- a/services/order/.env.example +++ b/services/order/.env.example @@ -1,4 +1,4 @@ DATABASE_URL=postgres://postgres:password@localhost:5432/postgres -AMQP_URL=amqp://guest:guest@localhost +AMQP_URL=amqp://guest:guest@log-rabbitmq PORT=50007 \ No newline at end of file diff --git a/services/payment/.env.example b/services/payment/.env.example index 7e687d7e..9951b5de 100644 --- a/services/payment/.env.example +++ b/services/payment/.env.example @@ -1,5 +1,5 @@ DATABASE_URL=postgres://postgres:password@localhost:5432/postgres -AMQP_URL=amqp://guest:guest@localhost +AMQP_URL=amqp://guest:guest@log-rabbitmq PORT=50003 diff --git a/services/product/.env.docker b/services/product/.env.docker index 3e8bc019..6dd3b8a4 100644 --- a/services/product/.env.docker +++ b/services/product/.env.docker @@ -1,4 +1,5 @@ DATABASE_URL=postgres://postgres:password@product-postgres:5432/postgres PORT=50004 +AMQP_URL=amqp://guest:guest@log-rabbitmq AZURE_STORAGE_SAS_TOKEN=example AZURE_STORAGE_RESOURCE_NAME=exemple \ No newline at end of file diff --git a/services/product/.env.example b/services/product/.env.example index 296f701e..0b930c52 100644 --- a/services/product/.env.example +++ b/services/product/.env.example @@ -1,4 +1,5 @@ DATABASE_URL=postgres://postgres:password@postgres:5432/postgres PORT=50004 +AMQP_URL=amqp://guest:guest@log-rabbitmq AZURE_STORAGE_SAS_TOKEN=example AZURE_STORAGE_RESOURCE_NAME=exemple \ No newline at end of file diff --git a/services/promotions/.env.docker b/services/promotions/.env.docker index 114b6446..ba4b2670 100644 --- a/services/promotions/.env.docker +++ b/services/promotions/.env.docker @@ -1,4 +1,4 @@ DATABASE_URL=postgres://postgres:password@promotion-postgres:5432/promotions -AMQP_URL=amqp://guest:guest@log-service:50021 +AMQP_URL=amqp://guest:guest@log-rabbitmq PORT=50006 \ No newline at end of file diff --git a/services/promotions/.env.example b/services/promotions/.env.example index e1787832..b4ee39bc 100644 --- a/services/promotions/.env.example +++ b/services/promotions/.env.example @@ -1,4 +1,4 @@ DATABASE_URL=postgres://postgres:password@localhost:5432/promotions -AMQP_URL=amqp://guest:guest@localhost +AMQP_URL=amqp://guest:guest@log-rabbitmq PORT=50006 \ No newline at end of file diff --git a/services/stock/.env.docker b/services/stock/.env.docker index 3798f17f..fc521070 100644 --- a/services/stock/.env.docker +++ b/services/stock/.env.docker @@ -1,4 +1,4 @@ DATABASE_URL=postgres://postgres:password@stock-postgres:5432/postgres -AMQP_URL=amqp://guest:guest@log-service:50021 +AMQP_URL=amqp://guest:guest@log-rabbitmq PORT=50009 \ No newline at end of file diff --git a/services/stock/.env.example b/services/stock/.env.example index 93d928e4..dbda1a0e 100644 --- a/services/stock/.env.example +++ b/services/stock/.env.example @@ -1,4 +1,4 @@ DATABASE_URL=postgres://postgres:password@localhost:5432/postgres -AMQP_URL=amqp://guest:guest@localhost +AMQP_URL=amqp://guest:guest@log-rabbitmq PORT=50009 \ No newline at end of file From 2f3790c97a2afd2e14c7d559285792edb8dd55f3 Mon Sep 17 00:00:00 2001 From: anatole Date: Sat, 19 Aug 2023 23:48:49 +0200 Subject: [PATCH 425/883] feat(global): add user service to the docker compose --- services/docker-compose.yml | 36 ++- .../controller/user/mainAddress.controller.ts | 34 +++ .../src/controller/user/user.controller.ts | 37 +-- .../src/lib/swagger/swagger-output.json | 280 +++++++++++++++++- services/user/.env.dist | 4 +- services/user/.env.docker | 6 + services/user/main.go | 2 +- services/user/pkg/services/auth.go | 3 +- 8 files changed, 375 insertions(+), 27 deletions(-) create mode 100644 services/gateway/src/controller/user/mainAddress.controller.ts create mode 100644 services/user/.env.docker diff --git a/services/docker-compose.yml b/services/docker-compose.yml index 04330d2a..85162d71 100644 --- a/services/docker-compose.yml +++ b/services/docker-compose.yml @@ -15,6 +15,38 @@ services: networks: - goodfood-network + # User service + + user-service: + image: goodfood-user:1.0.0 + build: + context: . + dockerfile: ./user/Dockerfile + depends_on: + - user-postgres + restart: always + env_file: + - user/dev.env + ports: + - "50007" + networks: + - goodfood-network + + user-postgres: + image: postgres:latest + ports: + - "5432" + volumes: + - goodfood-user-volume:/var/lib/postgresql/data + networks: + - goodfood-network + environment: + POSTGRES_USER: postgres + POSTGRES_PASSWORD: password + POSTGRES_DB: postgres + PGDATA: /var/lib/postgresql/data/pgdata + + # Basket service basket-service: @@ -84,7 +116,8 @@ services: PGDATA: /var/lib/postgresql/data/pgdata # Order service - order-sercice: + + order-service: image: goodfood-order:1.0.0 build: context: . @@ -235,6 +268,7 @@ services: - goodfood-network volumes: + goodfood-user-volume: goodfood-basket-volume: goodfood-delivery-volume: goodfood-order-volume: diff --git a/services/gateway/src/controller/user/mainAddress.controller.ts b/services/gateway/src/controller/user/mainAddress.controller.ts new file mode 100644 index 00000000..717d297e --- /dev/null +++ b/services/gateway/src/controller/user/mainAddress.controller.ts @@ -0,0 +1,34 @@ +import {Request, Response, Router} from 'express'; +import {mainAddressServiceClient} from "@gateway/services/clients/user.client"; +import {MainAddress, MainAddressId, MainAddressUpdateInput} from "@gateway/proto/user_pb"; + +export const userRoutes = Router(); + +userRoutes.get('/api/user/main-address/:id', async (req: Request, res: Response) => { + const {id} = req.params; + mainAddressServiceClient.getMainAddress(new MainAddressId().setId(Number(id)), (err, response) => { + if (err) { + return res.status(500).json({message: err.message}); + } + return res.json(response.toObject()); + }); +}); + +userRoutes.put('/api/user/main-address/:id', async (req: Request, res: Response) => { + const {authorization} = req.headers; + if (!authorization) { + res.json({error: 'Not authorized'}); + return; + } + + const {country, zipCode, street, lat, lng} = req.body; + const address = new MainAddress().setCountry(country).setZipcode(zipCode).setStreet(street).setLat(lat).setLng(lng) + + const mainAddressUpdateInput = new MainAddressUpdateInput().setToken(authorization).setMainaddress(address) + mainAddressServiceClient.updateMainAddress(mainAddressUpdateInput, (err, response) => { + if (err) { + return res.status(500).json({message: err.message}); + } + return res.json(response.toObject()); + }); +}); \ No newline at end of file diff --git a/services/gateway/src/controller/user/user.controller.ts b/services/gateway/src/controller/user/user.controller.ts index eb5c8e5f..ae9e4496 100644 --- a/services/gateway/src/controller/user/user.controller.ts +++ b/services/gateway/src/controller/user/user.controller.ts @@ -5,6 +5,8 @@ import { changeRoleInput, DeleteInput, logInInput, + MainAddress, + RoleInput, UpdateUserInput, User, UserCreateInput, @@ -34,16 +36,16 @@ userRoutes.get('/api/user', (req: Request, res: Response) => { }); userRoutes.post('/api/user', (req: Request, res: Response) => { - const body = req.body; - let userInput = new UserCreateInput(); + const {firstName, lastName, email, phone, country, zipCode, street, lat, lng, roleCode} = req.body; + const userInput = new UserCreateInput(); try { - userInput.setFirstName(body.firstName) - .setLastName(body.lastName) - .setEmail(body.email) - .setPassword(body.password) - .setPhone(body.phone) - .setMainaddress(body.address) - .setRole(body.role); + const address = new MainAddress().setCountry(country).setZipcode(zipCode).setStreet(street).setLat(lat).setLng(lng) + userInput.setFirstName(firstName) + .setLastName(lastName) + .setEmail(email) + .setPhone(phone) + .setMainaddress(address) + .setRole(new RoleInput().setCode(roleCode)); } catch (e: any) { res.json({error: e.message}); @@ -64,17 +66,18 @@ userRoutes.put('/api/user/:id', (req: Request, res: Response) => { res.json({error: 'Not authorized'}); return; } - - const body = req.body; + const {firstName, lastName, email, phone, country, zipCode, street, lat, lng, role} = req.body; const userInput = new UpdateUserInput() + try { + const address = new MainAddress().setCountry(country).setZipcode(zipCode).setStreet(street).setLat(lat).setLng(lng) const user = new User().setId(Number(req.params.id)) - .setFirstName(body.firstName) - .setLastName(body.lastName) - .setEmail(body.email) - .setPhone(body.phone) - .setMainaddress(body.address) - .setRole(body.role); + .setFirstName(firstName) + .setLastName(lastName) + .setEmail(email) + .setPhone(phone) + .setMainaddress(address) + .setRole(role); userInput.setUser(user).setToken(authorization); diff --git a/services/gateway/src/lib/swagger/swagger-output.json b/services/gateway/src/lib/swagger/swagger-output.json index 52ea1718..cb06b981 100644 --- a/services/gateway/src/lib/swagger/swagger-output.json +++ b/services/gateway/src/lib/swagger/swagger-output.json @@ -66,7 +66,19 @@ "phone": { "example": "any" }, - "address": { + "country": { + "example": "any" + }, + "zipCode": { + "example": "any" + }, + "street": { + "example": "any" + }, + "lat": { + "example": "any" + }, + "lng": { "example": "any" }, "role": { @@ -79,6 +91,9 @@ "responses": { "200": { "description": "OK" + }, + "500": { + "description": "Internal Server Error" } } }, @@ -103,6 +118,9 @@ "responses": { "200": { "description": "OK" + }, + "500": { + "description": "Internal Server Error" } } } @@ -116,6 +134,9 @@ "responses": { "200": { "description": "OK" + }, + "500": { + "description": "Internal Server Error" } } }, @@ -140,16 +161,25 @@ "email": { "example": "any" }, - "password": { + "phone": { "example": "any" }, - "phone": { + "country": { "example": "any" }, - "address": { + "zipCode": { "example": "any" }, - "role": { + "street": { + "example": "any" + }, + "lat": { + "example": "any" + }, + "lng": { + "example": "any" + }, + "roleCode": { "example": "any" } } @@ -159,6 +189,9 @@ "responses": { "200": { "description": "OK" + }, + "500": { + "description": "Internal Server Error" } } } @@ -189,6 +222,9 @@ "responses": { "200": { "description": "OK" + }, + "500": { + "description": "Internal Server Error" } } } @@ -209,6 +245,9 @@ "responses": { "200": { "description": "OK" + }, + "500": { + "description": "Internal Server Error" } } } @@ -250,6 +289,9 @@ "responses": { "200": { "description": "OK" + }, + "500": { + "description": "Internal Server Error" } } } @@ -288,6 +330,9 @@ "responses": { "200": { "description": "OK" + }, + "500": { + "description": "Internal Server Error" } } } @@ -309,6 +354,9 @@ "responses": { "200": { "description": "OK" + }, + "500": { + "description": "Internal Server Error" } } } @@ -342,6 +390,9 @@ "responses": { "200": { "description": "OK" + }, + "500": { + "description": "Internal Server Error" } } }, @@ -373,6 +424,9 @@ "responses": { "200": { "description": "OK" + }, + "500": { + "description": "Internal Server Error" } } } @@ -403,6 +457,9 @@ "responses": { "200": { "description": "OK" + }, + "500": { + "description": "Internal Server Error" } } } @@ -430,6 +487,9 @@ "responses": { "200": { "description": "OK" + }, + "500": { + "description": "Internal Server Error" } } } @@ -451,6 +511,9 @@ "responses": { "200": { "description": "OK" + }, + "500": { + "description": "Internal Server Error" } } } @@ -490,6 +553,9 @@ "responses": { "200": { "description": "OK" + }, + "500": { + "description": "Internal Server Error" } } } @@ -511,6 +577,9 @@ "responses": { "200": { "description": "OK" + }, + "500": { + "description": "Internal Server Error" } } } @@ -538,6 +607,9 @@ "responses": { "200": { "description": "OK" + }, + "500": { + "description": "Internal Server Error" } } } @@ -559,6 +631,9 @@ "responses": { "200": { "description": "OK" + }, + "500": { + "description": "Internal Server Error" } } } @@ -580,6 +655,9 @@ "responses": { "200": { "description": "OK" + }, + "500": { + "description": "Internal Server Error" } } } @@ -622,6 +700,9 @@ "responses": { "200": { "description": "OK" + }, + "500": { + "description": "Internal Server Error" } } }, @@ -641,6 +722,9 @@ "responses": { "200": { "description": "OK" + }, + "500": { + "description": "Internal Server Error" } } } @@ -654,6 +738,9 @@ "responses": { "200": { "description": "OK" + }, + "500": { + "description": "Internal Server Error" } } }, @@ -685,6 +772,9 @@ "responses": { "200": { "description": "OK" + }, + "500": { + "description": "Internal Server Error" } } } @@ -706,6 +796,9 @@ "responses": { "200": { "description": "OK" + }, + "500": { + "description": "Internal Server Error" } } }, @@ -743,6 +836,9 @@ "responses": { "200": { "description": "OK" + }, + "500": { + "description": "Internal Server Error" } } }, @@ -762,6 +858,9 @@ "responses": { "200": { "description": "OK" + }, + "500": { + "description": "Internal Server Error" } } } @@ -775,6 +874,9 @@ "responses": { "200": { "description": "OK" + }, + "500": { + "description": "Internal Server Error" } } }, @@ -800,6 +902,9 @@ "responses": { "200": { "description": "OK" + }, + "500": { + "description": "Internal Server Error" } } } @@ -821,6 +926,9 @@ "responses": { "200": { "description": "OK" + }, + "500": { + "description": "Internal Server Error" } } }, @@ -852,6 +960,9 @@ "responses": { "200": { "description": "OK" + }, + "500": { + "description": "Internal Server Error" } } }, @@ -871,6 +982,9 @@ "responses": { "200": { "description": "OK" + }, + "500": { + "description": "Internal Server Error" } } } @@ -892,6 +1006,9 @@ "responses": { "200": { "description": "OK" + }, + "500": { + "description": "Internal Server Error" } } } @@ -913,6 +1030,9 @@ "responses": { "200": { "description": "OK" + }, + "500": { + "description": "Internal Server Error" } } }, @@ -932,6 +1052,9 @@ "responses": { "200": { "description": "OK" + }, + "500": { + "description": "Internal Server Error" } } }, @@ -996,6 +1119,9 @@ "responses": { "200": { "description": "OK" + }, + "500": { + "description": "Internal Server Error" } } } @@ -1009,6 +1135,9 @@ "responses": { "200": { "description": "OK" + }, + "500": { + "description": "Internal Server Error" } } } @@ -1069,6 +1198,9 @@ "responses": { "200": { "description": "OK" + }, + "500": { + "description": "Internal Server Error" } } } @@ -1096,6 +1228,9 @@ "responses": { "200": { "description": "OK" + }, + "500": { + "description": "Internal Server Error" } } } @@ -1117,6 +1252,9 @@ "responses": { "200": { "description": "OK" + }, + "500": { + "description": "Internal Server Error" } } }, @@ -1163,6 +1301,9 @@ "responses": { "200": { "description": "OK" + }, + "500": { + "description": "Internal Server Error" } } }, @@ -1182,6 +1323,9 @@ "responses": { "200": { "description": "OK" + }, + "500": { + "description": "Internal Server Error" } } } @@ -1203,6 +1347,9 @@ "responses": { "200": { "description": "OK" + }, + "500": { + "description": "Internal Server Error" } } } @@ -1224,6 +1371,9 @@ "responses": { "200": { "description": "OK" + }, + "500": { + "description": "Internal Server Error" } } } @@ -1266,6 +1416,9 @@ "responses": { "200": { "description": "OK" + }, + "500": { + "description": "Internal Server Error" } } } @@ -1287,6 +1440,9 @@ "responses": { "200": { "description": "OK" + }, + "500": { + "description": "Internal Server Error" } } }, @@ -1327,6 +1483,9 @@ "responses": { "200": { "description": "OK" + }, + "500": { + "description": "Internal Server Error" } } }, @@ -1346,6 +1505,9 @@ "responses": { "200": { "description": "OK" + }, + "500": { + "description": "Internal Server Error" } } } @@ -1359,6 +1521,9 @@ "responses": { "200": { "description": "OK" + }, + "500": { + "description": "Internal Server Error" } } }, @@ -1393,6 +1558,9 @@ "responses": { "200": { "description": "OK" + }, + "500": { + "description": "Internal Server Error" } } } @@ -1406,6 +1574,9 @@ "responses": { "200": { "description": "OK" + }, + "500": { + "description": "Internal Server Error" } } } @@ -1427,6 +1598,9 @@ "responses": { "200": { "description": "OK" + }, + "500": { + "description": "Internal Server Error" } } } @@ -1448,6 +1622,9 @@ "responses": { "200": { "description": "OK" + }, + "500": { + "description": "Internal Server Error" } } } @@ -1484,6 +1661,9 @@ "responses": { "200": { "description": "OK" + }, + "500": { + "description": "Internal Server Error" } } } @@ -1505,6 +1685,9 @@ "responses": { "200": { "description": "OK" + }, + "500": { + "description": "Internal Server Error" } } } @@ -1518,6 +1701,9 @@ "responses": { "200": { "description": "OK" + }, + "500": { + "description": "Internal Server Error" } } }, @@ -1552,6 +1738,9 @@ "responses": { "200": { "description": "OK" + }, + "500": { + "description": "Internal Server Error" } } } @@ -1573,6 +1762,9 @@ "responses": { "200": { "description": "OK" + }, + "500": { + "description": "Internal Server Error" } } } @@ -1615,6 +1807,9 @@ "responses": { "200": { "description": "OK" + }, + "500": { + "description": "Internal Server Error" } } }, @@ -1634,6 +1829,9 @@ "responses": { "200": { "description": "OK" + }, + "500": { + "description": "Internal Server Error" } } } @@ -1655,6 +1853,9 @@ "responses": { "200": { "description": "OK" + }, + "500": { + "description": "Internal Server Error" } } }, @@ -1689,6 +1890,9 @@ "responses": { "200": { "description": "OK" + }, + "500": { + "description": "Internal Server Error" } } }, @@ -1708,6 +1912,9 @@ "responses": { "200": { "description": "OK" + }, + "500": { + "description": "Internal Server Error" } } } @@ -1721,6 +1928,9 @@ "responses": { "200": { "description": "OK" + }, + "500": { + "description": "Internal Server Error" } } }, @@ -1749,6 +1959,9 @@ "responses": { "200": { "description": "OK" + }, + "500": { + "description": "Internal Server Error" } } } @@ -1770,6 +1983,9 @@ "responses": { "200": { "description": "OK" + }, + "500": { + "description": "Internal Server Error" } } }, @@ -1804,6 +2020,9 @@ "responses": { "200": { "description": "OK" + }, + "500": { + "description": "Internal Server Error" } } }, @@ -1823,6 +2042,9 @@ "responses": { "200": { "description": "OK" + }, + "500": { + "description": "Internal Server Error" } } } @@ -1836,6 +2058,9 @@ "responses": { "200": { "description": "OK" + }, + "500": { + "description": "Internal Server Error" } } }, @@ -1864,6 +2089,9 @@ "responses": { "200": { "description": "OK" + }, + "500": { + "description": "Internal Server Error" } } } @@ -1885,6 +2113,9 @@ "responses": { "200": { "description": "OK" + }, + "500": { + "description": "Internal Server Error" } } }, @@ -1934,6 +2165,9 @@ "responses": { "200": { "description": "OK" + }, + "500": { + "description": "Internal Server Error" } } }, @@ -1953,6 +2187,9 @@ "responses": { "200": { "description": "OK" + }, + "500": { + "description": "Internal Server Error" } } } @@ -1974,6 +2211,9 @@ "responses": { "200": { "description": "OK" + }, + "500": { + "description": "Internal Server Error" } } } @@ -1995,6 +2235,9 @@ "responses": { "200": { "description": "OK" + }, + "500": { + "description": "Internal Server Error" } } } @@ -2040,6 +2283,9 @@ "responses": { "200": { "description": "OK" + }, + "500": { + "description": "Internal Server Error" } } } @@ -2061,6 +2307,9 @@ "responses": { "200": { "description": "OK" + }, + "500": { + "description": "Internal Server Error" } } }, @@ -2098,6 +2347,9 @@ "responses": { "200": { "description": "OK" + }, + "500": { + "description": "Internal Server Error" } } }, @@ -2117,6 +2369,9 @@ "responses": { "200": { "description": "OK" + }, + "500": { + "description": "Internal Server Error" } } } @@ -2138,6 +2393,9 @@ "responses": { "200": { "description": "OK" + }, + "500": { + "description": "Internal Server Error" } } } @@ -2159,6 +2417,9 @@ "responses": { "200": { "description": "OK" + }, + "500": { + "description": "Internal Server Error" } } } @@ -2180,6 +2441,9 @@ "responses": { "200": { "description": "OK" + }, + "500": { + "description": "Internal Server Error" } } } @@ -2213,6 +2477,9 @@ "responses": { "200": { "description": "OK" + }, + "500": { + "description": "Internal Server Error" } } } @@ -2249,6 +2516,9 @@ "responses": { "200": { "description": "OK" + }, + "500": { + "description": "Internal Server Error" } } } diff --git a/services/user/.env.dist b/services/user/.env.dist index d7b77644..2bf3e953 100644 --- a/services/user/.env.dist +++ b/services/user/.env.dist @@ -1,6 +1,6 @@ -PORT=:50051 +PORT=50001 DB_URL=postgres://:@:/ JWT_SECRET_KEY=example DEFAULT_USER_EMAIL=example DEFAULT_USER_PASSWORD=example -LOG_FILE_PATH=./logs/app.log +LOG_FILE_PATH=./logs/app.log \ No newline at end of file diff --git a/services/user/.env.docker b/services/user/.env.docker new file mode 100644 index 00000000..aa4be548 --- /dev/null +++ b/services/user/.env.docker @@ -0,0 +1,6 @@ +PORT=50001 +DB_URL=postgres://:@:/ +JWT_SECRET_KEY=example +DEFAULT_USER_EMAIL=example +DEFAULT_USER_PASSWORD=example +LOG_FILE_PATH=./logs/app.log diff --git a/services/user/main.go b/services/user/main.go index 27d553df..2305225d 100644 --- a/services/user/main.go +++ b/services/user/main.go @@ -19,7 +19,7 @@ func main() { c, err := config.LoadConfig() - url := "localhost:" + c.Port + url := "0.0.0.0:" + c.Port if err != nil { logger.Fatal("Failed at config", err) diff --git a/services/user/pkg/services/auth.go b/services/user/pkg/services/auth.go index f520ee71..e4c9b793 100644 --- a/services/user/pkg/services/auth.go +++ b/services/user/pkg/services/auth.go @@ -8,6 +8,7 @@ import ( "goodfood-user/pkg/models" "goodfood-user/pkg/utils" pb "goodfood-user/proto" + "gorm.io/gorm" "time" ) @@ -22,7 +23,7 @@ func (s *Server) Register(_ context.Context, req *pb.UserCreateInput) (*pb.UserO result := s.H.DB.Where(&models.User{Email: req.Email}).First(&models.User{}) - if result.RowsAffected > 0 { + if !errors.Is(result.Error, gorm.ErrRecordNotFound) { return &pb.UserOutput{ Error: "User already exists", }, nil From fd42abb32036dd60b00a7296ce9a0d94734972ef Mon Sep 17 00:00:00 2001 From: Pierre Lebigre Date: Sun, 20 Aug 2023 11:32:25 +0200 Subject: [PATCH 426/883] Final version --- .github/workflows/notifications.yml | 69 + services/notification/.dockerignore | 2 + services/notification/Dockerfile | 38 + services/notification/README.md | 83 + services/notification/dist/index.js | 54652 ++++++++++++++++ services/notification/package-lock.json | 1492 + services/notification/package.json | 2 +- services/notification/pnpm-lock.yaml | 1073 - services/notification/src/lib/amqp.ts | 7 +- .../{notification.d.ts => notification.ts} | 10 +- 10 files changed, 56345 insertions(+), 1083 deletions(-) create mode 100644 .github/workflows/notifications.yml create mode 100644 services/notification/.dockerignore create mode 100644 services/notification/Dockerfile create mode 100644 services/notification/README.md create mode 100644 services/notification/dist/index.js create mode 100644 services/notification/package-lock.json delete mode 100644 services/notification/pnpm-lock.yaml rename services/notification/src/types/{notification.d.ts => notification.ts} (64%) diff --git a/.github/workflows/notifications.yml b/.github/workflows/notifications.yml new file mode 100644 index 00000000..0596cd95 --- /dev/null +++ b/.github/workflows/notifications.yml @@ -0,0 +1,69 @@ +name: Notification Microservice CI/CD + +on: + push: + branches: [ notification ] + pull_request: + branches: [ dev, main ] + +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@master + - uses: pnpm/action-setup@v2 + with: + version: latest + - uses: actions/setup-node@v3 + with: + node-version: "18.x" + cache: "pnpm" + cache-dependency-path: services/notification/pnpm-lock.yaml + - name: Install dependencies + run: | + cd ./services/notification + pnpm install --frozen-lockfile + - name: Build + run: | + cd ./services/notification + pnpm build + + test: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@master + - uses: pnpm/action-setup@v2 + with: + version: latest + - uses: actions/setup-node@v3 + with: + node-version: "18.x" + cache: "pnpm" + cache-dependency-path: services/notification/pnpm-lock.yaml + - name: Install dependencies + run: | + cd ./services/notification + pnpm install --frozen-lockfile + - name: Execute tests + run: | + cd ./services/notification + pnpm test + + publish: + runs-on: ubuntu-latest + needs: [ build, test ] + steps: + - name: Checkout code + uses: actions/checkout@master + - name: Login to Docker Hub + uses: docker/login-action@v2 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + - name: Build and push + uses: docker/build-push-action@v4 + with: + context: ./services/ + file: ./services/notification/Dockerfile + push: true + tags: pierrelbg/goodfood-notification:latest \ No newline at end of file diff --git a/services/notification/.dockerignore b/services/notification/.dockerignore new file mode 100644 index 00000000..b7dab5e9 --- /dev/null +++ b/services/notification/.dockerignore @@ -0,0 +1,2 @@ +node_modules +build \ No newline at end of file diff --git a/services/notification/Dockerfile b/services/notification/Dockerfile new file mode 100644 index 00000000..4eaf1348 --- /dev/null +++ b/services/notification/Dockerfile @@ -0,0 +1,38 @@ +FROM node:18-alpine3.17 as builder + +# Set working directory +WORKDIR /app + +# Copy the application code +COPY ./notification/ . + +# Install dependencies +RUN npm install + +# Copy the proto files +COPY ./proto ./proto/ + +# Generate Prisma client +RUN npx prisma generate + +# Build the application +RUN npm run build + + +# Create a new image with the application +FROM node:18-alpine3.17 as runner + +# Set working directory +WORKDIR /app + +# Copy the application package +COPY --from=builder /app/dist . +COPY --from=builder /app/prisma/ . +COPY --from=builder /app/proto/ /proto/ +COPY --from=builder /app/node_modules/.prisma /.prisma + +# Expose the gRPC port +EXPOSE 50006 + +# Start the server +CMD [ "node", "index.js"] diff --git a/services/notification/README.md b/services/notification/README.md new file mode 100644 index 00000000..2394966c --- /dev/null +++ b/services/notification/README.md @@ -0,0 +1,83 @@ +# Notification Microservice + +| Informations | +|--------------------------------------------------------------------| +| **Port:** 50022 | +| **Developer:** @PierreLgb | +| **Status:** In progress | +| **Last update:** 2023-07-20 | +| **Language:** NodeJS | +| **Dependencies:** TypeScript, Prisma, gRPC, Postgres | +| **Models:** (see [`prisma/schema.prisma`](./prisma/schema.prisma)) | + +## gRPC Methods + +- Notifications model: + + - `CreateNotification`: Creates a new notification in the system. + - `GetNotification`: Retrieves a notification by its ID. + - `UpdateNotification`: Updates an existing notification. + - `DeleteNotification`: Deletes a notification by its ID. + - `GetNotifications`: Retrieves notifications for a given message type. + +## Requirements + +To run this microservice, you will need to have the following installed on your system: + +- NodeJS (v18.12.0 or higher) (dev. with v18.12.0) +- Postgres (v15.2 or higher) (dev. with docker image `postgres:15.2`) + +You can use the following tools to help you with the setup: + +- You can use nvm to set your Node version using: + - `nvm use`. +- You can use docker to run your Postgres database using: + - `docker run --name postgres -p 5432:5432 -e POSTGRES_PASSWORD=password -d postgres` + +## Getting started + +### 1. Clone the repository and install dependencies + +1. Clone the `goodfood` repository to your local machine. +2. Navigate to the service directory (`services/notification`) in your terminal. +3. Run `npm install` to install the necessary dependencies. +4. Create a `.env` file at the root of the project directory and add the environment variables values ( + see `.env.example`). +5. Run `npm run start` to start the microservice. + +You can now access the microservice at `http://localhost:50022`. + +NB: If you want to run the microservice in development mode, you can run `npm run dev` instead. + +### 2. Create and seed the database + +Run the following command to create your Postgres database structure. This also creates the models tables that are +defined in [`prisma/schema.prisma`](./prisma/schema.prisma): + +``` +npx prisma migrate dev --name init +``` + +When `npx prisma migrate dev` is executed against a newly created database, seeding is also triggered. The seed file +in [`prisma/seed.ts`](./prisma/seed.ts) will be executed and your database will be populated with the sample data. + +## Build and Run with Docker + +### Build + +To build the image you need to be in the **parent folder** of the service you want to build. Then run the following +command: + +``` +docker build -t goodfood-notification:1.0.0 -f ./notification/Dockerfile . +docker tag goodfood-notification:1.0.0 pierrelbg/goodfood-notification:1.0.0 +docker push pierrelbg/goodfood-notification:1.0.0 +``` + +### Run + +Create the .env base on the .env.example. Then run the following command: + +``` +docker run --env-file=.env goodfood-notification:1.0.0 +``` diff --git a/services/notification/dist/index.js b/services/notification/dist/index.js new file mode 100644 index 00000000..e882dda7 --- /dev/null +++ b/services/notification/dist/index.js @@ -0,0 +1,54652 @@ +"use strict"; +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __esm = (fn, res) => function __init() { + return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res; +}; +var __commonJS = (cb, mod2) => function __require() { + return mod2 || (0, cb[__getOwnPropNames(cb)[0]])((mod2 = { exports: {} }).exports, mod2), mod2.exports; +}; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to2, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to2, key) && key !== except) + __defProp(to2, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to2; +}; +var __toESM = (mod2, isNodeMode, target) => (target = mod2 != null ? __create(__getProtoOf(mod2)) : {}, __copyProps( + // If the importer is in node compatibility mode or this is not an ESM + // file that has been converted to a CommonJS file using a Babel- + // compatible transform (i.e. "__esModule" has not been set), then set + // "default" to the CommonJS "module.exports" for node compatibility. + isNodeMode || !mod2 || !mod2.__esModule ? __defProp(target, "default", { value: mod2, enumerable: true }) : target, + mod2 +)); +var __toCommonJS = (mod2) => __copyProps(__defProp({}, "__esModule", { value: true }), mod2); + +// node_modules/dotenv/package.json +var require_package = __commonJS({ + "node_modules/dotenv/package.json"(exports2, module2) { + module2.exports = { + name: "dotenv", + version: "16.3.1", + description: "Loads environment variables from .env file", + main: "lib/main.js", + types: "lib/main.d.ts", + exports: { + ".": { + types: "./lib/main.d.ts", + require: "./lib/main.js", + default: "./lib/main.js" + }, + "./config": "./config.js", + "./config.js": "./config.js", + "./lib/env-options": "./lib/env-options.js", + "./lib/env-options.js": "./lib/env-options.js", + "./lib/cli-options": "./lib/cli-options.js", + "./lib/cli-options.js": "./lib/cli-options.js", + "./package.json": "./package.json" + }, + scripts: { + "dts-check": "tsc --project tests/types/tsconfig.json", + lint: "standard", + "lint-readme": "standard-markdown", + pretest: "npm run lint && npm run dts-check", + test: "tap tests/*.js --100 -Rspec", + prerelease: "npm test", + release: "standard-version" + }, + repository: { + type: "git", + url: "git://github.com/motdotla/dotenv.git" + }, + funding: "https://github.com/motdotla/dotenv?sponsor=1", + keywords: [ + "dotenv", + "env", + ".env", + "environment", + "variables", + "config", + "settings" + ], + readmeFilename: "README.md", + license: "BSD-2-Clause", + devDependencies: { + "@definitelytyped/dtslint": "^0.0.133", + "@types/node": "^18.11.3", + decache: "^4.6.1", + sinon: "^14.0.1", + standard: "^17.0.0", + "standard-markdown": "^7.1.0", + "standard-version": "^9.5.0", + tap: "^16.3.0", + tar: "^6.1.11", + typescript: "^4.8.4" + }, + engines: { + node: ">=12" + }, + browser: { + fs: false + } + }; + } +}); + +// node_modules/dotenv/lib/main.js +var require_main = __commonJS({ + "node_modules/dotenv/lib/main.js"(exports2, module2) { + var fs2 = require("fs"); + var path = require("path"); + var os2 = require("os"); + var crypto2 = require("crypto"); + var packageJson = require_package(); + var version = packageJson.version; + var LINE = /(?:^|^)\s*(?:export\s+)?([\w.-]+)(?:\s*=\s*?|:\s+?)(\s*'(?:\\'|[^'])*'|\s*"(?:\\"|[^"])*"|\s*`(?:\\`|[^`])*`|[^#\r\n]+)?\s*(?:#.*)?(?:$|$)/mg; + function parse(src) { + const obj = {}; + let lines = src.toString(); + lines = lines.replace(/\r\n?/mg, "\n"); + let match; + while ((match = LINE.exec(lines)) != null) { + const key = match[1]; + let value = match[2] || ""; + value = value.trim(); + const maybeQuote = value[0]; + value = value.replace(/^(['"`])([\s\S]*)\1$/mg, "$2"); + if (maybeQuote === '"') { + value = value.replace(/\\n/g, "\n"); + value = value.replace(/\\r/g, "\r"); + } + obj[key] = value; + } + return obj; + } + function _parseVault(options2) { + const vaultPath = _vaultPath(options2); + const result = DotenvModule.configDotenv({ path: vaultPath }); + if (!result.parsed) { + throw new Error(`MISSING_DATA: Cannot parse ${vaultPath} for an unknown reason`); + } + const keys = _dotenvKey(options2).split(","); + const length = keys.length; + let decrypted; + for (let i = 0; i < length; i++) { + try { + const key = keys[i].trim(); + const attrs = _instructions(result, key); + decrypted = DotenvModule.decrypt(attrs.ciphertext, attrs.key); + break; + } catch (error2) { + if (i + 1 >= length) { + throw error2; + } + } + } + return DotenvModule.parse(decrypted); + } + function _log(message) { + console.log(`[dotenv@${version}][INFO] ${message}`); + } + function _warn(message) { + console.log(`[dotenv@${version}][WARN] ${message}`); + } + function _debug(message) { + console.log(`[dotenv@${version}][DEBUG] ${message}`); + } + function _dotenvKey(options2) { + if (options2 && options2.DOTENV_KEY && options2.DOTENV_KEY.length > 0) { + return options2.DOTENV_KEY; + } + if (process.env.DOTENV_KEY && process.env.DOTENV_KEY.length > 0) { + return process.env.DOTENV_KEY; + } + return ""; + } + function _instructions(result, dotenvKey) { + let uri; + try { + uri = new URL(dotenvKey); + } catch (error2) { + if (error2.code === "ERR_INVALID_URL") { + throw new Error("INVALID_DOTENV_KEY: Wrong format. Must be in valid uri format like dotenv://:key_1234@dotenv.org/vault/.env.vault?environment=development"); + } + throw error2; + } + const key = uri.password; + if (!key) { + throw new Error("INVALID_DOTENV_KEY: Missing key part"); + } + const environment = uri.searchParams.get("environment"); + if (!environment) { + throw new Error("INVALID_DOTENV_KEY: Missing environment part"); + } + const environmentKey = `DOTENV_VAULT_${environment.toUpperCase()}`; + const ciphertext = result.parsed[environmentKey]; + if (!ciphertext) { + throw new Error(`NOT_FOUND_DOTENV_ENVIRONMENT: Cannot locate environment ${environmentKey} in your .env.vault file.`); + } + return { ciphertext, key }; + } + function _vaultPath(options2) { + let dotenvPath = path.resolve(process.cwd(), ".env"); + if (options2 && options2.path && options2.path.length > 0) { + dotenvPath = options2.path; + } + return dotenvPath.endsWith(".vault") ? dotenvPath : `${dotenvPath}.vault`; + } + function _resolveHome(envPath) { + return envPath[0] === "~" ? path.join(os2.homedir(), envPath.slice(1)) : envPath; + } + function _configVault(options2) { + _log("Loading env from encrypted .env.vault"); + const parsed = DotenvModule._parseVault(options2); + let processEnv = process.env; + if (options2 && options2.processEnv != null) { + processEnv = options2.processEnv; + } + DotenvModule.populate(processEnv, parsed, options2); + return { parsed }; + } + function configDotenv(options2) { + let dotenvPath = path.resolve(process.cwd(), ".env"); + let encoding = "utf8"; + const debug2 = Boolean(options2 && options2.debug); + if (options2) { + if (options2.path != null) { + dotenvPath = _resolveHome(options2.path); + } + if (options2.encoding != null) { + encoding = options2.encoding; + } + } + try { + const parsed = DotenvModule.parse(fs2.readFileSync(dotenvPath, { encoding })); + let processEnv = process.env; + if (options2 && options2.processEnv != null) { + processEnv = options2.processEnv; + } + DotenvModule.populate(processEnv, parsed, options2); + return { parsed }; + } catch (e) { + if (debug2) { + _debug(`Failed to load ${dotenvPath} ${e.message}`); + } + return { error: e }; + } + } + function config2(options2) { + const vaultPath = _vaultPath(options2); + if (_dotenvKey(options2).length === 0) { + return DotenvModule.configDotenv(options2); + } + if (!fs2.existsSync(vaultPath)) { + _warn(`You set DOTENV_KEY but you are missing a .env.vault file at ${vaultPath}. Did you forget to build it?`); + return DotenvModule.configDotenv(options2); + } + return DotenvModule._configVault(options2); + } + function decrypt(encrypted, keyStr) { + const key = Buffer.from(keyStr.slice(-64), "hex"); + let ciphertext = Buffer.from(encrypted, "base64"); + const nonce = ciphertext.slice(0, 12); + const authTag = ciphertext.slice(-16); + ciphertext = ciphertext.slice(12, -16); + try { + const aesgcm = crypto2.createDecipheriv("aes-256-gcm", key, nonce); + aesgcm.setAuthTag(authTag); + return `${aesgcm.update(ciphertext)}${aesgcm.final()}`; + } catch (error2) { + const isRange = error2 instanceof RangeError; + const invalidKeyLength = error2.message === "Invalid key length"; + const decryptionFailed = error2.message === "Unsupported state or unable to authenticate data"; + if (isRange || invalidKeyLength) { + const msg2 = "INVALID_DOTENV_KEY: It must be 64 characters long (or more)"; + throw new Error(msg2); + } else if (decryptionFailed) { + const msg2 = "DECRYPTION_FAILED: Please check your DOTENV_KEY"; + throw new Error(msg2); + } else { + console.error("Error: ", error2.code); + console.error("Error: ", error2.message); + throw error2; + } + } + } + function populate(processEnv, parsed, options2 = {}) { + const debug2 = Boolean(options2 && options2.debug); + const override = Boolean(options2 && options2.override); + if (typeof parsed !== "object") { + throw new Error("OBJECT_REQUIRED: Please check the processEnv argument being passed to populate"); + } + for (const key of Object.keys(parsed)) { + if (Object.prototype.hasOwnProperty.call(processEnv, key)) { + if (override === true) { + processEnv[key] = parsed[key]; + } + if (debug2) { + if (override === true) { + _debug(`"${key}" is already defined and WAS overwritten`); + } else { + _debug(`"${key}" is already defined and was NOT overwritten`); + } + } + } else { + processEnv[key] = parsed[key]; + } + } + } + var DotenvModule = { + configDotenv, + _configVault, + _parseVault, + config: config2, + decrypt, + parse, + populate + }; + module2.exports.configDotenv = DotenvModule.configDotenv; + module2.exports._configVault = DotenvModule._configVault; + module2.exports._parseVault = DotenvModule._parseVault; + module2.exports.config = DotenvModule.config; + module2.exports.decrypt = DotenvModule.decrypt; + module2.exports.parse = DotenvModule.parse; + module2.exports.populate = DotenvModule.populate; + module2.exports = DotenvModule; + } +}); + +// node_modules/dotenv/lib/env-options.js +var require_env_options = __commonJS({ + "node_modules/dotenv/lib/env-options.js"(exports2, module2) { + var options2 = {}; + if (process.env.DOTENV_CONFIG_ENCODING != null) { + options2.encoding = process.env.DOTENV_CONFIG_ENCODING; + } + if (process.env.DOTENV_CONFIG_PATH != null) { + options2.path = process.env.DOTENV_CONFIG_PATH; + } + if (process.env.DOTENV_CONFIG_DEBUG != null) { + options2.debug = process.env.DOTENV_CONFIG_DEBUG; + } + if (process.env.DOTENV_CONFIG_OVERRIDE != null) { + options2.override = process.env.DOTENV_CONFIG_OVERRIDE; + } + if (process.env.DOTENV_CONFIG_DOTENV_KEY != null) { + options2.DOTENV_KEY = process.env.DOTENV_CONFIG_DOTENV_KEY; + } + module2.exports = options2; + } +}); + +// node_modules/dotenv/lib/cli-options.js +var require_cli_options = __commonJS({ + "node_modules/dotenv/lib/cli-options.js"(exports2, module2) { + var re2 = /^dotenv_config_(encoding|path|debug|override|DOTENV_KEY)=(.+)$/; + module2.exports = function optionMatcher(args) { + return args.reduce(function(acc, cur) { + const matches = cur.match(re2); + if (matches) { + acc[matches[1]] = matches[2]; + } + return acc; + }, {}); + }; + } +}); + +// node_modules/lodash.camelcase/index.js +var require_lodash = __commonJS({ + "node_modules/lodash.camelcase/index.js"(exports2, module2) { + var INFINITY = 1 / 0; + var symbolTag = "[object Symbol]"; + var reAsciiWord = /[^\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]+/g; + var reLatin = /[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g; + var rsAstralRange = "\\ud800-\\udfff"; + var rsComboMarksRange = "\\u0300-\\u036f\\ufe20-\\ufe23"; + var rsComboSymbolsRange = "\\u20d0-\\u20f0"; + var rsDingbatRange = "\\u2700-\\u27bf"; + var rsLowerRange = "a-z\\xdf-\\xf6\\xf8-\\xff"; + var rsMathOpRange = "\\xac\\xb1\\xd7\\xf7"; + var rsNonCharRange = "\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf"; + var rsPunctuationRange = "\\u2000-\\u206f"; + var rsSpaceRange = " \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000"; + var rsUpperRange = "A-Z\\xc0-\\xd6\\xd8-\\xde"; + var rsVarRange = "\\ufe0e\\ufe0f"; + var rsBreakRange = rsMathOpRange + rsNonCharRange + rsPunctuationRange + rsSpaceRange; + var rsApos = "['\u2019]"; + var rsAstral = "[" + rsAstralRange + "]"; + var rsBreak = "[" + rsBreakRange + "]"; + var rsCombo = "[" + rsComboMarksRange + rsComboSymbolsRange + "]"; + var rsDigits = "\\d+"; + var rsDingbat = "[" + rsDingbatRange + "]"; + var rsLower = "[" + rsLowerRange + "]"; + var rsMisc = "[^" + rsAstralRange + rsBreakRange + rsDigits + rsDingbatRange + rsLowerRange + rsUpperRange + "]"; + var rsFitz = "\\ud83c[\\udffb-\\udfff]"; + var rsModifier = "(?:" + rsCombo + "|" + rsFitz + ")"; + var rsNonAstral = "[^" + rsAstralRange + "]"; + var rsRegional = "(?:\\ud83c[\\udde6-\\uddff]){2}"; + var rsSurrPair = "[\\ud800-\\udbff][\\udc00-\\udfff]"; + var rsUpper = "[" + rsUpperRange + "]"; + var rsZWJ = "\\u200d"; + var rsLowerMisc = "(?:" + rsLower + "|" + rsMisc + ")"; + var rsUpperMisc = "(?:" + rsUpper + "|" + rsMisc + ")"; + var rsOptLowerContr = "(?:" + rsApos + "(?:d|ll|m|re|s|t|ve))?"; + var rsOptUpperContr = "(?:" + rsApos + "(?:D|LL|M|RE|S|T|VE))?"; + var reOptMod = rsModifier + "?"; + var rsOptVar = "[" + rsVarRange + "]?"; + var rsOptJoin = "(?:" + rsZWJ + "(?:" + [rsNonAstral, rsRegional, rsSurrPair].join("|") + ")" + rsOptVar + reOptMod + ")*"; + var rsSeq = rsOptVar + reOptMod + rsOptJoin; + var rsEmoji = "(?:" + [rsDingbat, rsRegional, rsSurrPair].join("|") + ")" + rsSeq; + var rsSymbol = "(?:" + [rsNonAstral + rsCombo + "?", rsCombo, rsRegional, rsSurrPair, rsAstral].join("|") + ")"; + var reApos = RegExp(rsApos, "g"); + var reComboMark = RegExp(rsCombo, "g"); + var reUnicode = RegExp(rsFitz + "(?=" + rsFitz + ")|" + rsSymbol + rsSeq, "g"); + var reUnicodeWord = RegExp([ + rsUpper + "?" + rsLower + "+" + rsOptLowerContr + "(?=" + [rsBreak, rsUpper, "$"].join("|") + ")", + rsUpperMisc + "+" + rsOptUpperContr + "(?=" + [rsBreak, rsUpper + rsLowerMisc, "$"].join("|") + ")", + rsUpper + "?" + rsLowerMisc + "+" + rsOptLowerContr, + rsUpper + "+" + rsOptUpperContr, + rsDigits, + rsEmoji + ].join("|"), "g"); + var reHasUnicode = RegExp("[" + rsZWJ + rsAstralRange + rsComboMarksRange + rsComboSymbolsRange + rsVarRange + "]"); + var reHasUnicodeWord = /[a-z][A-Z]|[A-Z]{2,}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/; + var deburredLetters = { + // Latin-1 Supplement block. + "\xC0": "A", + "\xC1": "A", + "\xC2": "A", + "\xC3": "A", + "\xC4": "A", + "\xC5": "A", + "\xE0": "a", + "\xE1": "a", + "\xE2": "a", + "\xE3": "a", + "\xE4": "a", + "\xE5": "a", + "\xC7": "C", + "\xE7": "c", + "\xD0": "D", + "\xF0": "d", + "\xC8": "E", + "\xC9": "E", + "\xCA": "E", + "\xCB": "E", + "\xE8": "e", + "\xE9": "e", + "\xEA": "e", + "\xEB": "e", + "\xCC": "I", + "\xCD": "I", + "\xCE": "I", + "\xCF": "I", + "\xEC": "i", + "\xED": "i", + "\xEE": "i", + "\xEF": "i", + "\xD1": "N", + "\xF1": "n", + "\xD2": "O", + "\xD3": "O", + "\xD4": "O", + "\xD5": "O", + "\xD6": "O", + "\xD8": "O", + "\xF2": "o", + "\xF3": "o", + "\xF4": "o", + "\xF5": "o", + "\xF6": "o", + "\xF8": "o", + "\xD9": "U", + "\xDA": "U", + "\xDB": "U", + "\xDC": "U", + "\xF9": "u", + "\xFA": "u", + "\xFB": "u", + "\xFC": "u", + "\xDD": "Y", + "\xFD": "y", + "\xFF": "y", + "\xC6": "Ae", + "\xE6": "ae", + "\xDE": "Th", + "\xFE": "th", + "\xDF": "ss", + // Latin Extended-A block. + "\u0100": "A", + "\u0102": "A", + "\u0104": "A", + "\u0101": "a", + "\u0103": "a", + "\u0105": "a", + "\u0106": "C", + "\u0108": "C", + "\u010A": "C", + "\u010C": "C", + "\u0107": "c", + "\u0109": "c", + "\u010B": "c", + "\u010D": "c", + "\u010E": "D", + "\u0110": "D", + "\u010F": "d", + "\u0111": "d", + "\u0112": "E", + "\u0114": "E", + "\u0116": "E", + "\u0118": "E", + "\u011A": "E", + "\u0113": "e", + "\u0115": "e", + "\u0117": "e", + "\u0119": "e", + "\u011B": "e", + "\u011C": "G", + "\u011E": "G", + "\u0120": "G", + "\u0122": "G", + "\u011D": "g", + "\u011F": "g", + "\u0121": "g", + "\u0123": "g", + "\u0124": "H", + "\u0126": "H", + "\u0125": "h", + "\u0127": "h", + "\u0128": "I", + "\u012A": "I", + "\u012C": "I", + "\u012E": "I", + "\u0130": "I", + "\u0129": "i", + "\u012B": "i", + "\u012D": "i", + "\u012F": "i", + "\u0131": "i", + "\u0134": "J", + "\u0135": "j", + "\u0136": "K", + "\u0137": "k", + "\u0138": "k", + "\u0139": "L", + "\u013B": "L", + "\u013D": "L", + "\u013F": "L", + "\u0141": "L", + "\u013A": "l", + "\u013C": "l", + "\u013E": "l", + "\u0140": "l", + "\u0142": "l", + "\u0143": "N", + "\u0145": "N", + "\u0147": "N", + "\u014A": "N", + "\u0144": "n", + "\u0146": "n", + "\u0148": "n", + "\u014B": "n", + "\u014C": "O", + "\u014E": "O", + "\u0150": "O", + "\u014D": "o", + "\u014F": "o", + "\u0151": "o", + "\u0154": "R", + "\u0156": "R", + "\u0158": "R", + "\u0155": "r", + "\u0157": "r", + "\u0159": "r", + "\u015A": "S", + "\u015C": "S", + "\u015E": "S", + "\u0160": "S", + "\u015B": "s", + "\u015D": "s", + "\u015F": "s", + "\u0161": "s", + "\u0162": "T", + "\u0164": "T", + "\u0166": "T", + "\u0163": "t", + "\u0165": "t", + "\u0167": "t", + "\u0168": "U", + "\u016A": "U", + "\u016C": "U", + "\u016E": "U", + "\u0170": "U", + "\u0172": "U", + "\u0169": "u", + "\u016B": "u", + "\u016D": "u", + "\u016F": "u", + "\u0171": "u", + "\u0173": "u", + "\u0174": "W", + "\u0175": "w", + "\u0176": "Y", + "\u0177": "y", + "\u0178": "Y", + "\u0179": "Z", + "\u017B": "Z", + "\u017D": "Z", + "\u017A": "z", + "\u017C": "z", + "\u017E": "z", + "\u0132": "IJ", + "\u0133": "ij", + "\u0152": "Oe", + "\u0153": "oe", + "\u0149": "'n", + "\u017F": "ss" + }; + var freeGlobal = typeof global == "object" && global && global.Object === Object && global; + var freeSelf = typeof self == "object" && self && self.Object === Object && self; + var root = freeGlobal || freeSelf || Function("return this")(); + function arrayReduce(array, iteratee, accumulator, initAccum) { + var index = -1, length = array ? array.length : 0; + if (initAccum && length) { + accumulator = array[++index]; + } + while (++index < length) { + accumulator = iteratee(accumulator, array[index], index, array); + } + return accumulator; + } + function asciiToArray(string) { + return string.split(""); + } + function asciiWords(string) { + return string.match(reAsciiWord) || []; + } + function basePropertyOf(object) { + return function(key) { + return object == null ? void 0 : object[key]; + }; + } + var deburrLetter = basePropertyOf(deburredLetters); + function hasUnicode(string) { + return reHasUnicode.test(string); + } + function hasUnicodeWord(string) { + return reHasUnicodeWord.test(string); + } + function stringToArray(string) { + return hasUnicode(string) ? unicodeToArray(string) : asciiToArray(string); + } + function unicodeToArray(string) { + return string.match(reUnicode) || []; + } + function unicodeWords(string) { + return string.match(reUnicodeWord) || []; + } + var objectProto = Object.prototype; + var objectToString = objectProto.toString; + var Symbol2 = root.Symbol; + var symbolProto = Symbol2 ? Symbol2.prototype : void 0; + var symbolToString = symbolProto ? symbolProto.toString : void 0; + function baseSlice(array, start, end) { + var index = -1, length = array.length; + if (start < 0) { + start = -start > length ? 0 : length + start; + } + end = end > length ? length : end; + if (end < 0) { + end += length; + } + length = start > end ? 0 : end - start >>> 0; + start >>>= 0; + var result = Array(length); + while (++index < length) { + result[index] = array[index + start]; + } + return result; + } + function baseToString(value) { + if (typeof value == "string") { + return value; + } + if (isSymbol(value)) { + return symbolToString ? symbolToString.call(value) : ""; + } + var result = value + ""; + return result == "0" && 1 / value == -INFINITY ? "-0" : result; + } + function castSlice(array, start, end) { + var length = array.length; + end = end === void 0 ? length : end; + return !start && end >= length ? array : baseSlice(array, start, end); + } + function createCaseFirst(methodName) { + return function(string) { + string = toString(string); + var strSymbols = hasUnicode(string) ? stringToArray(string) : void 0; + var chr = strSymbols ? strSymbols[0] : string.charAt(0); + var trailing = strSymbols ? castSlice(strSymbols, 1).join("") : string.slice(1); + return chr[methodName]() + trailing; + }; + } + function createCompounder(callback) { + return function(string) { + return arrayReduce(words(deburr(string).replace(reApos, "")), callback, ""); + }; + } + function isObjectLike(value) { + return !!value && typeof value == "object"; + } + function isSymbol(value) { + return typeof value == "symbol" || isObjectLike(value) && objectToString.call(value) == symbolTag; + } + function toString(value) { + return value == null ? "" : baseToString(value); + } + var camelCase = createCompounder(function(result, word, index) { + word = word.toLowerCase(); + return result + (index ? capitalize(word) : word); + }); + function capitalize(string) { + return upperFirst(toString(string).toLowerCase()); + } + function deburr(string) { + string = toString(string); + return string && string.replace(reLatin, deburrLetter).replace(reComboMark, ""); + } + var upperFirst = createCaseFirst("toUpperCase"); + function words(string, pattern, guard) { + string = toString(string); + pattern = guard ? void 0 : pattern; + if (pattern === void 0) { + return hasUnicodeWord(string) ? unicodeWords(string) : asciiWords(string); + } + return string.match(pattern) || []; + } + module2.exports = camelCase; + } +}); + +// node_modules/@protobufjs/aspromise/index.js +var require_aspromise = __commonJS({ + "node_modules/@protobufjs/aspromise/index.js"(exports2, module2) { + "use strict"; + module2.exports = asPromise; + function asPromise(fn, ctx) { + var params = new Array(arguments.length - 1), offset = 0, index = 2, pending = true; + while (index < arguments.length) + params[offset++] = arguments[index++]; + return new Promise(function executor(resolve, reject) { + params[offset] = function callback(err) { + if (pending) { + pending = false; + if (err) + reject(err); + else { + var params2 = new Array(arguments.length - 1), offset2 = 0; + while (offset2 < params2.length) + params2[offset2++] = arguments[offset2]; + resolve.apply(null, params2); + } + } + }; + try { + fn.apply(ctx || null, params); + } catch (err) { + if (pending) { + pending = false; + reject(err); + } + } + }); + } + } +}); + +// node_modules/@protobufjs/base64/index.js +var require_base64 = __commonJS({ + "node_modules/@protobufjs/base64/index.js"(exports2) { + "use strict"; + var base64 = exports2; + base64.length = function length(string) { + var p = string.length; + if (!p) + return 0; + var n = 0; + while (--p % 4 > 1 && string.charAt(p) === "=") + ++n; + return Math.ceil(string.length * 3) / 4 - n; + }; + var b64 = new Array(64); + var s64 = new Array(123); + for (i = 0; i < 64; ) + s64[b64[i] = i < 26 ? i + 65 : i < 52 ? i + 71 : i < 62 ? i - 4 : i - 59 | 43] = i++; + var i; + base64.encode = function encode(buffer, start, end) { + var parts = null, chunk = []; + var i2 = 0, j2 = 0, t; + while (start < end) { + var b = buffer[start++]; + switch (j2) { + case 0: + chunk[i2++] = b64[b >> 2]; + t = (b & 3) << 4; + j2 = 1; + break; + case 1: + chunk[i2++] = b64[t | b >> 4]; + t = (b & 15) << 2; + j2 = 2; + break; + case 2: + chunk[i2++] = b64[t | b >> 6]; + chunk[i2++] = b64[b & 63]; + j2 = 0; + break; + } + if (i2 > 8191) { + (parts || (parts = [])).push(String.fromCharCode.apply(String, chunk)); + i2 = 0; + } + } + if (j2) { + chunk[i2++] = b64[t]; + chunk[i2++] = 61; + if (j2 === 1) + chunk[i2++] = 61; + } + if (parts) { + if (i2) + parts.push(String.fromCharCode.apply(String, chunk.slice(0, i2))); + return parts.join(""); + } + return String.fromCharCode.apply(String, chunk.slice(0, i2)); + }; + var invalidEncoding = "invalid encoding"; + base64.decode = function decode(string, buffer, offset) { + var start = offset; + var j2 = 0, t; + for (var i2 = 0; i2 < string.length; ) { + var c = string.charCodeAt(i2++); + if (c === 61 && j2 > 1) + break; + if ((c = s64[c]) === void 0) + throw Error(invalidEncoding); + switch (j2) { + case 0: + t = c; + j2 = 1; + break; + case 1: + buffer[offset++] = t << 2 | (c & 48) >> 4; + t = c; + j2 = 2; + break; + case 2: + buffer[offset++] = (t & 15) << 4 | (c & 60) >> 2; + t = c; + j2 = 3; + break; + case 3: + buffer[offset++] = (t & 3) << 6 | c; + j2 = 0; + break; + } + } + if (j2 === 1) + throw Error(invalidEncoding); + return offset - start; + }; + base64.test = function test(string) { + return /^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/.test(string); + }; + } +}); + +// node_modules/@protobufjs/eventemitter/index.js +var require_eventemitter = __commonJS({ + "node_modules/@protobufjs/eventemitter/index.js"(exports2, module2) { + "use strict"; + module2.exports = EventEmitter; + function EventEmitter() { + this._listeners = {}; + } + EventEmitter.prototype.on = function on2(evt, fn, ctx) { + (this._listeners[evt] || (this._listeners[evt] = [])).push({ + fn, + ctx: ctx || this + }); + return this; + }; + EventEmitter.prototype.off = function off(evt, fn) { + if (evt === void 0) + this._listeners = {}; + else { + if (fn === void 0) + this._listeners[evt] = []; + else { + var listeners = this._listeners[evt]; + for (var i = 0; i < listeners.length; ) + if (listeners[i].fn === fn) + listeners.splice(i, 1); + else + ++i; + } + } + return this; + }; + EventEmitter.prototype.emit = function emit(evt) { + var listeners = this._listeners[evt]; + if (listeners) { + var args = [], i = 1; + for (; i < arguments.length; ) + args.push(arguments[i++]); + for (i = 0; i < listeners.length; ) + listeners[i].fn.apply(listeners[i++].ctx, args); + } + return this; + }; + } +}); + +// node_modules/@protobufjs/float/index.js +var require_float = __commonJS({ + "node_modules/@protobufjs/float/index.js"(exports2, module2) { + "use strict"; + module2.exports = factory(factory); + function factory(exports3) { + if (typeof Float32Array !== "undefined") + (function() { + var f32 = new Float32Array([-0]), f8b = new Uint8Array(f32.buffer), le = f8b[3] === 128; + function writeFloat_f32_cpy(val, buf, pos) { + f32[0] = val; + buf[pos] = f8b[0]; + buf[pos + 1] = f8b[1]; + buf[pos + 2] = f8b[2]; + buf[pos + 3] = f8b[3]; + } + function writeFloat_f32_rev(val, buf, pos) { + f32[0] = val; + buf[pos] = f8b[3]; + buf[pos + 1] = f8b[2]; + buf[pos + 2] = f8b[1]; + buf[pos + 3] = f8b[0]; + } + exports3.writeFloatLE = le ? writeFloat_f32_cpy : writeFloat_f32_rev; + exports3.writeFloatBE = le ? writeFloat_f32_rev : writeFloat_f32_cpy; + function readFloat_f32_cpy(buf, pos) { + f8b[0] = buf[pos]; + f8b[1] = buf[pos + 1]; + f8b[2] = buf[pos + 2]; + f8b[3] = buf[pos + 3]; + return f32[0]; + } + function readFloat_f32_rev(buf, pos) { + f8b[3] = buf[pos]; + f8b[2] = buf[pos + 1]; + f8b[1] = buf[pos + 2]; + f8b[0] = buf[pos + 3]; + return f32[0]; + } + exports3.readFloatLE = le ? readFloat_f32_cpy : readFloat_f32_rev; + exports3.readFloatBE = le ? readFloat_f32_rev : readFloat_f32_cpy; + })(); + else + (function() { + function writeFloat_ieee754(writeUint, val, buf, pos) { + var sign = val < 0 ? 1 : 0; + if (sign) + val = -val; + if (val === 0) + writeUint(1 / val > 0 ? ( + /* positive */ + 0 + ) : ( + /* negative 0 */ + 2147483648 + ), buf, pos); + else if (isNaN(val)) + writeUint(2143289344, buf, pos); + else if (val > 34028234663852886e22) + writeUint((sign << 31 | 2139095040) >>> 0, buf, pos); + else if (val < 11754943508222875e-54) + writeUint((sign << 31 | Math.round(val / 1401298464324817e-60)) >>> 0, buf, pos); + else { + var exponent = Math.floor(Math.log(val) / Math.LN2), mantissa = Math.round(val * Math.pow(2, -exponent) * 8388608) & 8388607; + writeUint((sign << 31 | exponent + 127 << 23 | mantissa) >>> 0, buf, pos); + } + } + exports3.writeFloatLE = writeFloat_ieee754.bind(null, writeUintLE); + exports3.writeFloatBE = writeFloat_ieee754.bind(null, writeUintBE); + function readFloat_ieee754(readUint, buf, pos) { + var uint = readUint(buf, pos), sign = (uint >> 31) * 2 + 1, exponent = uint >>> 23 & 255, mantissa = uint & 8388607; + return exponent === 255 ? mantissa ? NaN : sign * Infinity : exponent === 0 ? sign * 1401298464324817e-60 * mantissa : sign * Math.pow(2, exponent - 150) * (mantissa + 8388608); + } + exports3.readFloatLE = readFloat_ieee754.bind(null, readUintLE); + exports3.readFloatBE = readFloat_ieee754.bind(null, readUintBE); + })(); + if (typeof Float64Array !== "undefined") + (function() { + var f64 = new Float64Array([-0]), f8b = new Uint8Array(f64.buffer), le = f8b[7] === 128; + function writeDouble_f64_cpy(val, buf, pos) { + f64[0] = val; + buf[pos] = f8b[0]; + buf[pos + 1] = f8b[1]; + buf[pos + 2] = f8b[2]; + buf[pos + 3] = f8b[3]; + buf[pos + 4] = f8b[4]; + buf[pos + 5] = f8b[5]; + buf[pos + 6] = f8b[6]; + buf[pos + 7] = f8b[7]; + } + function writeDouble_f64_rev(val, buf, pos) { + f64[0] = val; + buf[pos] = f8b[7]; + buf[pos + 1] = f8b[6]; + buf[pos + 2] = f8b[5]; + buf[pos + 3] = f8b[4]; + buf[pos + 4] = f8b[3]; + buf[pos + 5] = f8b[2]; + buf[pos + 6] = f8b[1]; + buf[pos + 7] = f8b[0]; + } + exports3.writeDoubleLE = le ? writeDouble_f64_cpy : writeDouble_f64_rev; + exports3.writeDoubleBE = le ? writeDouble_f64_rev : writeDouble_f64_cpy; + function readDouble_f64_cpy(buf, pos) { + f8b[0] = buf[pos]; + f8b[1] = buf[pos + 1]; + f8b[2] = buf[pos + 2]; + f8b[3] = buf[pos + 3]; + f8b[4] = buf[pos + 4]; + f8b[5] = buf[pos + 5]; + f8b[6] = buf[pos + 6]; + f8b[7] = buf[pos + 7]; + return f64[0]; + } + function readDouble_f64_rev(buf, pos) { + f8b[7] = buf[pos]; + f8b[6] = buf[pos + 1]; + f8b[5] = buf[pos + 2]; + f8b[4] = buf[pos + 3]; + f8b[3] = buf[pos + 4]; + f8b[2] = buf[pos + 5]; + f8b[1] = buf[pos + 6]; + f8b[0] = buf[pos + 7]; + return f64[0]; + } + exports3.readDoubleLE = le ? readDouble_f64_cpy : readDouble_f64_rev; + exports3.readDoubleBE = le ? readDouble_f64_rev : readDouble_f64_cpy; + })(); + else + (function() { + function writeDouble_ieee754(writeUint, off0, off1, val, buf, pos) { + var sign = val < 0 ? 1 : 0; + if (sign) + val = -val; + if (val === 0) { + writeUint(0, buf, pos + off0); + writeUint(1 / val > 0 ? ( + /* positive */ + 0 + ) : ( + /* negative 0 */ + 2147483648 + ), buf, pos + off1); + } else if (isNaN(val)) { + writeUint(0, buf, pos + off0); + writeUint(2146959360, buf, pos + off1); + } else if (val > 17976931348623157e292) { + writeUint(0, buf, pos + off0); + writeUint((sign << 31 | 2146435072) >>> 0, buf, pos + off1); + } else { + var mantissa; + if (val < 22250738585072014e-324) { + mantissa = val / 5e-324; + writeUint(mantissa >>> 0, buf, pos + off0); + writeUint((sign << 31 | mantissa / 4294967296) >>> 0, buf, pos + off1); + } else { + var exponent = Math.floor(Math.log(val) / Math.LN2); + if (exponent === 1024) + exponent = 1023; + mantissa = val * Math.pow(2, -exponent); + writeUint(mantissa * 4503599627370496 >>> 0, buf, pos + off0); + writeUint((sign << 31 | exponent + 1023 << 20 | mantissa * 1048576 & 1048575) >>> 0, buf, pos + off1); + } + } + } + exports3.writeDoubleLE = writeDouble_ieee754.bind(null, writeUintLE, 0, 4); + exports3.writeDoubleBE = writeDouble_ieee754.bind(null, writeUintBE, 4, 0); + function readDouble_ieee754(readUint, off0, off1, buf, pos) { + var lo2 = readUint(buf, pos + off0), hi2 = readUint(buf, pos + off1); + var sign = (hi2 >> 31) * 2 + 1, exponent = hi2 >>> 20 & 2047, mantissa = 4294967296 * (hi2 & 1048575) + lo2; + return exponent === 2047 ? mantissa ? NaN : sign * Infinity : exponent === 0 ? sign * 5e-324 * mantissa : sign * Math.pow(2, exponent - 1075) * (mantissa + 4503599627370496); + } + exports3.readDoubleLE = readDouble_ieee754.bind(null, readUintLE, 0, 4); + exports3.readDoubleBE = readDouble_ieee754.bind(null, readUintBE, 4, 0); + })(); + return exports3; + } + function writeUintLE(val, buf, pos) { + buf[pos] = val & 255; + buf[pos + 1] = val >>> 8 & 255; + buf[pos + 2] = val >>> 16 & 255; + buf[pos + 3] = val >>> 24; + } + function writeUintBE(val, buf, pos) { + buf[pos] = val >>> 24; + buf[pos + 1] = val >>> 16 & 255; + buf[pos + 2] = val >>> 8 & 255; + buf[pos + 3] = val & 255; + } + function readUintLE(buf, pos) { + return (buf[pos] | buf[pos + 1] << 8 | buf[pos + 2] << 16 | buf[pos + 3] << 24) >>> 0; + } + function readUintBE(buf, pos) { + return (buf[pos] << 24 | buf[pos + 1] << 16 | buf[pos + 2] << 8 | buf[pos + 3]) >>> 0; + } + } +}); + +// node_modules/@protobufjs/inquire/index.js +var require_inquire = __commonJS({ + "node_modules/@protobufjs/inquire/index.js"(exports, module) { + "use strict"; + module.exports = inquire; + function inquire(moduleName) { + try { + var mod = eval("quire".replace(/^/, "re"))(moduleName); + if (mod && (mod.length || Object.keys(mod).length)) + return mod; + } catch (e) { + } + return null; + } + } +}); + +// node_modules/@protobufjs/utf8/index.js +var require_utf8 = __commonJS({ + "node_modules/@protobufjs/utf8/index.js"(exports2) { + "use strict"; + var utf8 = exports2; + utf8.length = function utf8_length(string) { + var len = 0, c = 0; + for (var i = 0; i < string.length; ++i) { + c = string.charCodeAt(i); + if (c < 128) + len += 1; + else if (c < 2048) + len += 2; + else if ((c & 64512) === 55296 && (string.charCodeAt(i + 1) & 64512) === 56320) { + ++i; + len += 4; + } else + len += 3; + } + return len; + }; + utf8.read = function utf8_read(buffer, start, end) { + var len = end - start; + if (len < 1) + return ""; + var parts = null, chunk = [], i = 0, t; + while (start < end) { + t = buffer[start++]; + if (t < 128) + chunk[i++] = t; + else if (t > 191 && t < 224) + chunk[i++] = (t & 31) << 6 | buffer[start++] & 63; + else if (t > 239 && t < 365) { + t = ((t & 7) << 18 | (buffer[start++] & 63) << 12 | (buffer[start++] & 63) << 6 | buffer[start++] & 63) - 65536; + chunk[i++] = 55296 + (t >> 10); + chunk[i++] = 56320 + (t & 1023); + } else + chunk[i++] = (t & 15) << 12 | (buffer[start++] & 63) << 6 | buffer[start++] & 63; + if (i > 8191) { + (parts || (parts = [])).push(String.fromCharCode.apply(String, chunk)); + i = 0; + } + } + if (parts) { + if (i) + parts.push(String.fromCharCode.apply(String, chunk.slice(0, i))); + return parts.join(""); + } + return String.fromCharCode.apply(String, chunk.slice(0, i)); + }; + utf8.write = function utf8_write(string, buffer, offset) { + var start = offset, c1, c2; + for (var i = 0; i < string.length; ++i) { + c1 = string.charCodeAt(i); + if (c1 < 128) { + buffer[offset++] = c1; + } else if (c1 < 2048) { + buffer[offset++] = c1 >> 6 | 192; + buffer[offset++] = c1 & 63 | 128; + } else if ((c1 & 64512) === 55296 && ((c2 = string.charCodeAt(i + 1)) & 64512) === 56320) { + c1 = 65536 + ((c1 & 1023) << 10) + (c2 & 1023); + ++i; + buffer[offset++] = c1 >> 18 | 240; + buffer[offset++] = c1 >> 12 & 63 | 128; + buffer[offset++] = c1 >> 6 & 63 | 128; + buffer[offset++] = c1 & 63 | 128; + } else { + buffer[offset++] = c1 >> 12 | 224; + buffer[offset++] = c1 >> 6 & 63 | 128; + buffer[offset++] = c1 & 63 | 128; + } + } + return offset - start; + }; + } +}); + +// node_modules/@protobufjs/pool/index.js +var require_pool = __commonJS({ + "node_modules/@protobufjs/pool/index.js"(exports2, module2) { + "use strict"; + module2.exports = pool; + function pool(alloc, slice, size) { + var SIZE = size || 8192; + var MAX = SIZE >>> 1; + var slab = null; + var offset = SIZE; + return function pool_alloc(size2) { + if (size2 < 1 || size2 > MAX) + return alloc(size2); + if (offset + size2 > SIZE) { + slab = alloc(SIZE); + offset = 0; + } + var buf = slice.call(slab, offset, offset += size2); + if (offset & 7) + offset = (offset | 7) + 1; + return buf; + }; + } + } +}); + +// node_modules/protobufjs/src/util/longbits.js +var require_longbits = __commonJS({ + "node_modules/protobufjs/src/util/longbits.js"(exports2, module2) { + "use strict"; + module2.exports = LongBits; + var util = require_minimal(); + function LongBits(lo2, hi2) { + this.lo = lo2 >>> 0; + this.hi = hi2 >>> 0; + } + var zero = LongBits.zero = new LongBits(0, 0); + zero.toNumber = function() { + return 0; + }; + zero.zzEncode = zero.zzDecode = function() { + return this; + }; + zero.length = function() { + return 1; + }; + var zeroHash = LongBits.zeroHash = "\0\0\0\0\0\0\0\0"; + LongBits.fromNumber = function fromNumber(value) { + if (value === 0) + return zero; + var sign = value < 0; + if (sign) + value = -value; + var lo2 = value >>> 0, hi2 = (value - lo2) / 4294967296 >>> 0; + if (sign) { + hi2 = ~hi2 >>> 0; + lo2 = ~lo2 >>> 0; + if (++lo2 > 4294967295) { + lo2 = 0; + if (++hi2 > 4294967295) + hi2 = 0; + } + } + return new LongBits(lo2, hi2); + }; + LongBits.from = function from(value) { + if (typeof value === "number") + return LongBits.fromNumber(value); + if (util.isString(value)) { + if (util.Long) + value = util.Long.fromString(value); + else + return LongBits.fromNumber(parseInt(value, 10)); + } + return value.low || value.high ? new LongBits(value.low >>> 0, value.high >>> 0) : zero; + }; + LongBits.prototype.toNumber = function toNumber(unsigned) { + if (!unsigned && this.hi >>> 31) { + var lo2 = ~this.lo + 1 >>> 0, hi2 = ~this.hi >>> 0; + if (!lo2) + hi2 = hi2 + 1 >>> 0; + return -(lo2 + hi2 * 4294967296); + } + return this.lo + this.hi * 4294967296; + }; + LongBits.prototype.toLong = function toLong(unsigned) { + return util.Long ? new util.Long(this.lo | 0, this.hi | 0, Boolean(unsigned)) : { low: this.lo | 0, high: this.hi | 0, unsigned: Boolean(unsigned) }; + }; + var charCodeAt = String.prototype.charCodeAt; + LongBits.fromHash = function fromHash(hash) { + if (hash === zeroHash) + return zero; + return new LongBits( + (charCodeAt.call(hash, 0) | charCodeAt.call(hash, 1) << 8 | charCodeAt.call(hash, 2) << 16 | charCodeAt.call(hash, 3) << 24) >>> 0, + (charCodeAt.call(hash, 4) | charCodeAt.call(hash, 5) << 8 | charCodeAt.call(hash, 6) << 16 | charCodeAt.call(hash, 7) << 24) >>> 0 + ); + }; + LongBits.prototype.toHash = function toHash() { + return String.fromCharCode( + this.lo & 255, + this.lo >>> 8 & 255, + this.lo >>> 16 & 255, + this.lo >>> 24, + this.hi & 255, + this.hi >>> 8 & 255, + this.hi >>> 16 & 255, + this.hi >>> 24 + ); + }; + LongBits.prototype.zzEncode = function zzEncode() { + var mask = this.hi >> 31; + this.hi = ((this.hi << 1 | this.lo >>> 31) ^ mask) >>> 0; + this.lo = (this.lo << 1 ^ mask) >>> 0; + return this; + }; + LongBits.prototype.zzDecode = function zzDecode() { + var mask = -(this.lo & 1); + this.lo = ((this.lo >>> 1 | this.hi << 31) ^ mask) >>> 0; + this.hi = (this.hi >>> 1 ^ mask) >>> 0; + return this; + }; + LongBits.prototype.length = function length() { + var part0 = this.lo, part1 = (this.lo >>> 28 | this.hi << 4) >>> 0, part2 = this.hi >>> 24; + return part2 === 0 ? part1 === 0 ? part0 < 16384 ? part0 < 128 ? 1 : 2 : part0 < 2097152 ? 3 : 4 : part1 < 16384 ? part1 < 128 ? 5 : 6 : part1 < 2097152 ? 7 : 8 : part2 < 128 ? 9 : 10; + }; + } +}); + +// node_modules/protobufjs/src/util/minimal.js +var require_minimal = __commonJS({ + "node_modules/protobufjs/src/util/minimal.js"(exports2) { + "use strict"; + var util = exports2; + util.asPromise = require_aspromise(); + util.base64 = require_base64(); + util.EventEmitter = require_eventemitter(); + util.float = require_float(); + util.inquire = require_inquire(); + util.utf8 = require_utf8(); + util.pool = require_pool(); + util.LongBits = require_longbits(); + util.isNode = Boolean(typeof global !== "undefined" && global && global.process && global.process.versions && global.process.versions.node); + util.global = util.isNode && global || typeof window !== "undefined" && window || typeof self !== "undefined" && self || exports2; + util.emptyArray = Object.freeze ? Object.freeze([]) : ( + /* istanbul ignore next */ + [] + ); + util.emptyObject = Object.freeze ? Object.freeze({}) : ( + /* istanbul ignore next */ + {} + ); + util.isInteger = Number.isInteger || /* istanbul ignore next */ + function isInteger(value) { + return typeof value === "number" && isFinite(value) && Math.floor(value) === value; + }; + util.isString = function isString(value) { + return typeof value === "string" || value instanceof String; + }; + util.isObject = function isObject(value) { + return value && typeof value === "object"; + }; + util.isset = /** + * Checks if a property on a message is considered to be present. + * @param {Object} obj Plain object or message instance + * @param {string} prop Property name + * @returns {boolean} `true` if considered to be present, otherwise `false` + */ + util.isSet = function isSet(obj, prop) { + var value = obj[prop]; + if (value != null && obj.hasOwnProperty(prop)) + return typeof value !== "object" || (Array.isArray(value) ? value.length : Object.keys(value).length) > 0; + return false; + }; + util.Buffer = function() { + try { + var Buffer2 = util.inquire("buffer").Buffer; + return Buffer2.prototype.utf8Write ? Buffer2 : ( + /* istanbul ignore next */ + null + ); + } catch (e) { + return null; + } + }(); + util._Buffer_from = null; + util._Buffer_allocUnsafe = null; + util.newBuffer = function newBuffer(sizeOrArray) { + return typeof sizeOrArray === "number" ? util.Buffer ? util._Buffer_allocUnsafe(sizeOrArray) : new util.Array(sizeOrArray) : util.Buffer ? util._Buffer_from(sizeOrArray) : typeof Uint8Array === "undefined" ? sizeOrArray : new Uint8Array(sizeOrArray); + }; + util.Array = typeof Uint8Array !== "undefined" ? Uint8Array : Array; + util.Long = /* istanbul ignore next */ + util.global.dcodeIO && /* istanbul ignore next */ + util.global.dcodeIO.Long || /* istanbul ignore next */ + util.global.Long || util.inquire("long"); + util.key2Re = /^true|false|0|1$/; + util.key32Re = /^-?(?:0|[1-9][0-9]*)$/; + util.key64Re = /^(?:[\\x00-\\xff]{8}|-?(?:0|[1-9][0-9]*))$/; + util.longToHash = function longToHash(value) { + return value ? util.LongBits.from(value).toHash() : util.LongBits.zeroHash; + }; + util.longFromHash = function longFromHash(hash, unsigned) { + var bits = util.LongBits.fromHash(hash); + if (util.Long) + return util.Long.fromBits(bits.lo, bits.hi, unsigned); + return bits.toNumber(Boolean(unsigned)); + }; + function merge(dst, src, ifNotSet) { + for (var keys = Object.keys(src), i = 0; i < keys.length; ++i) + if (dst[keys[i]] === void 0 || !ifNotSet) + dst[keys[i]] = src[keys[i]]; + return dst; + } + util.merge = merge; + util.lcFirst = function lcFirst(str) { + return str.charAt(0).toLowerCase() + str.substring(1); + }; + function newError(name) { + function CustomError(message, properties) { + if (!(this instanceof CustomError)) + return new CustomError(message, properties); + Object.defineProperty(this, "message", { get: function() { + return message; + } }); + if (Error.captureStackTrace) + Error.captureStackTrace(this, CustomError); + else + Object.defineProperty(this, "stack", { value: new Error().stack || "" }); + if (properties) + merge(this, properties); + } + CustomError.prototype = Object.create(Error.prototype, { + constructor: { + value: CustomError, + writable: true, + enumerable: false, + configurable: true + }, + name: { + get: function get() { + return name; + }, + set: void 0, + enumerable: false, + // configurable: false would accurately preserve the behavior of + // the original, but I'm guessing that was not intentional. + // For an actual error subclass, this property would + // be configurable. + configurable: true + }, + toString: { + value: function value() { + return this.name + ": " + this.message; + }, + writable: true, + enumerable: false, + configurable: true + } + }); + return CustomError; + } + util.newError = newError; + util.ProtocolError = newError("ProtocolError"); + util.oneOfGetter = function getOneOf(fieldNames) { + var fieldMap = {}; + for (var i = 0; i < fieldNames.length; ++i) + fieldMap[fieldNames[i]] = 1; + return function() { + for (var keys = Object.keys(this), i2 = keys.length - 1; i2 > -1; --i2) + if (fieldMap[keys[i2]] === 1 && this[keys[i2]] !== void 0 && this[keys[i2]] !== null) + return keys[i2]; + }; + }; + util.oneOfSetter = function setOneOf(fieldNames) { + return function(name) { + for (var i = 0; i < fieldNames.length; ++i) + if (fieldNames[i] !== name) + delete this[fieldNames[i]]; + }; + }; + util.toJSONOptions = { + longs: String, + enums: String, + bytes: String, + json: true + }; + util._configure = function() { + var Buffer2 = util.Buffer; + if (!Buffer2) { + util._Buffer_from = util._Buffer_allocUnsafe = null; + return; + } + util._Buffer_from = Buffer2.from !== Uint8Array.from && Buffer2.from || /* istanbul ignore next */ + function Buffer_from(value, encoding) { + return new Buffer2(value, encoding); + }; + util._Buffer_allocUnsafe = Buffer2.allocUnsafe || /* istanbul ignore next */ + function Buffer_allocUnsafe(size) { + return new Buffer2(size); + }; + }; + } +}); + +// node_modules/protobufjs/src/writer.js +var require_writer = __commonJS({ + "node_modules/protobufjs/src/writer.js"(exports2, module2) { + "use strict"; + module2.exports = Writer; + var util = require_minimal(); + var BufferWriter; + var LongBits = util.LongBits; + var base64 = util.base64; + var utf8 = util.utf8; + function Op2(fn, len, val) { + this.fn = fn; + this.len = len; + this.next = void 0; + this.val = val; + } + function noop() { + } + function State(writer) { + this.head = writer.head; + this.tail = writer.tail; + this.len = writer.len; + this.next = writer.states; + } + function Writer() { + this.len = 0; + this.head = new Op2(noop, 0, 0); + this.tail = this.head; + this.states = null; + } + var create = function create2() { + return util.Buffer ? function create_buffer_setup() { + return (Writer.create = function create_buffer() { + return new BufferWriter(); + })(); + } : function create_array() { + return new Writer(); + }; + }; + Writer.create = create(); + Writer.alloc = function alloc(size) { + return new util.Array(size); + }; + if (util.Array !== Array) + Writer.alloc = util.pool(Writer.alloc, util.Array.prototype.subarray); + Writer.prototype._push = function push(fn, len, val) { + this.tail = this.tail.next = new Op2(fn, len, val); + this.len += len; + return this; + }; + function writeByte(val, buf, pos) { + buf[pos] = val & 255; + } + function writeVarint32(val, buf, pos) { + while (val > 127) { + buf[pos++] = val & 127 | 128; + val >>>= 7; + } + buf[pos] = val; + } + function VarintOp(len, val) { + this.len = len; + this.next = void 0; + this.val = val; + } + VarintOp.prototype = Object.create(Op2.prototype); + VarintOp.prototype.fn = writeVarint32; + Writer.prototype.uint32 = function write_uint32(value) { + this.len += (this.tail = this.tail.next = new VarintOp( + (value = value >>> 0) < 128 ? 1 : value < 16384 ? 2 : value < 2097152 ? 3 : value < 268435456 ? 4 : 5, + value + )).len; + return this; + }; + Writer.prototype.int32 = function write_int32(value) { + return value < 0 ? this._push(writeVarint64, 10, LongBits.fromNumber(value)) : this.uint32(value); + }; + Writer.prototype.sint32 = function write_sint32(value) { + return this.uint32((value << 1 ^ value >> 31) >>> 0); + }; + function writeVarint64(val, buf, pos) { + while (val.hi) { + buf[pos++] = val.lo & 127 | 128; + val.lo = (val.lo >>> 7 | val.hi << 25) >>> 0; + val.hi >>>= 7; + } + while (val.lo > 127) { + buf[pos++] = val.lo & 127 | 128; + val.lo = val.lo >>> 7; + } + buf[pos++] = val.lo; + } + Writer.prototype.uint64 = function write_uint64(value) { + var bits = LongBits.from(value); + return this._push(writeVarint64, bits.length(), bits); + }; + Writer.prototype.int64 = Writer.prototype.uint64; + Writer.prototype.sint64 = function write_sint64(value) { + var bits = LongBits.from(value).zzEncode(); + return this._push(writeVarint64, bits.length(), bits); + }; + Writer.prototype.bool = function write_bool(value) { + return this._push(writeByte, 1, value ? 1 : 0); + }; + function writeFixed32(val, buf, pos) { + buf[pos] = val & 255; + buf[pos + 1] = val >>> 8 & 255; + buf[pos + 2] = val >>> 16 & 255; + buf[pos + 3] = val >>> 24; + } + Writer.prototype.fixed32 = function write_fixed32(value) { + return this._push(writeFixed32, 4, value >>> 0); + }; + Writer.prototype.sfixed32 = Writer.prototype.fixed32; + Writer.prototype.fixed64 = function write_fixed64(value) { + var bits = LongBits.from(value); + return this._push(writeFixed32, 4, bits.lo)._push(writeFixed32, 4, bits.hi); + }; + Writer.prototype.sfixed64 = Writer.prototype.fixed64; + Writer.prototype.float = function write_float(value) { + return this._push(util.float.writeFloatLE, 4, value); + }; + Writer.prototype.double = function write_double(value) { + return this._push(util.float.writeDoubleLE, 8, value); + }; + var writeBytes = util.Array.prototype.set ? function writeBytes_set(val, buf, pos) { + buf.set(val, pos); + } : function writeBytes_for(val, buf, pos) { + for (var i = 0; i < val.length; ++i) + buf[pos + i] = val[i]; + }; + Writer.prototype.bytes = function write_bytes(value) { + var len = value.length >>> 0; + if (!len) + return this._push(writeByte, 1, 0); + if (util.isString(value)) { + var buf = Writer.alloc(len = base64.length(value)); + base64.decode(value, buf, 0); + value = buf; + } + return this.uint32(len)._push(writeBytes, len, value); + }; + Writer.prototype.string = function write_string(value) { + var len = utf8.length(value); + return len ? this.uint32(len)._push(utf8.write, len, value) : this._push(writeByte, 1, 0); + }; + Writer.prototype.fork = function fork() { + this.states = new State(this); + this.head = this.tail = new Op2(noop, 0, 0); + this.len = 0; + return this; + }; + Writer.prototype.reset = function reset() { + if (this.states) { + this.head = this.states.head; + this.tail = this.states.tail; + this.len = this.states.len; + this.states = this.states.next; + } else { + this.head = this.tail = new Op2(noop, 0, 0); + this.len = 0; + } + return this; + }; + Writer.prototype.ldelim = function ldelim() { + var head = this.head, tail = this.tail, len = this.len; + this.reset().uint32(len); + if (len) { + this.tail.next = head.next; + this.tail = tail; + this.len += len; + } + return this; + }; + Writer.prototype.finish = function finish() { + var head = this.head.next, buf = this.constructor.alloc(this.len), pos = 0; + while (head) { + head.fn(head.val, buf, pos); + pos += head.len; + head = head.next; + } + return buf; + }; + Writer._configure = function(BufferWriter_) { + BufferWriter = BufferWriter_; + Writer.create = create(); + BufferWriter._configure(); + }; + } +}); + +// node_modules/protobufjs/src/writer_buffer.js +var require_writer_buffer = __commonJS({ + "node_modules/protobufjs/src/writer_buffer.js"(exports2, module2) { + "use strict"; + module2.exports = BufferWriter; + var Writer = require_writer(); + (BufferWriter.prototype = Object.create(Writer.prototype)).constructor = BufferWriter; + var util = require_minimal(); + function BufferWriter() { + Writer.call(this); + } + BufferWriter._configure = function() { + BufferWriter.alloc = util._Buffer_allocUnsafe; + BufferWriter.writeBytesBuffer = util.Buffer && util.Buffer.prototype instanceof Uint8Array && util.Buffer.prototype.set.name === "set" ? function writeBytesBuffer_set(val, buf, pos) { + buf.set(val, pos); + } : function writeBytesBuffer_copy(val, buf, pos) { + if (val.copy) + val.copy(buf, pos, 0, val.length); + else + for (var i = 0; i < val.length; ) + buf[pos++] = val[i++]; + }; + }; + BufferWriter.prototype.bytes = function write_bytes_buffer(value) { + if (util.isString(value)) + value = util._Buffer_from(value, "base64"); + var len = value.length >>> 0; + this.uint32(len); + if (len) + this._push(BufferWriter.writeBytesBuffer, len, value); + return this; + }; + function writeStringBuffer(val, buf, pos) { + if (val.length < 40) + util.utf8.write(val, buf, pos); + else if (buf.utf8Write) + buf.utf8Write(val, pos); + else + buf.write(val, pos); + } + BufferWriter.prototype.string = function write_string_buffer(value) { + var len = util.Buffer.byteLength(value); + this.uint32(len); + if (len) + this._push(writeStringBuffer, len, value); + return this; + }; + BufferWriter._configure(); + } +}); + +// node_modules/protobufjs/src/reader.js +var require_reader = __commonJS({ + "node_modules/protobufjs/src/reader.js"(exports2, module2) { + "use strict"; + module2.exports = Reader; + var util = require_minimal(); + var BufferReader; + var LongBits = util.LongBits; + var utf8 = util.utf8; + function indexOutOfRange(reader, writeLength) { + return RangeError("index out of range: " + reader.pos + " + " + (writeLength || 1) + " > " + reader.len); + } + function Reader(buffer) { + this.buf = buffer; + this.pos = 0; + this.len = buffer.length; + } + var create_array = typeof Uint8Array !== "undefined" ? function create_typed_array(buffer) { + if (buffer instanceof Uint8Array || Array.isArray(buffer)) + return new Reader(buffer); + throw Error("illegal buffer"); + } : function create_array2(buffer) { + if (Array.isArray(buffer)) + return new Reader(buffer); + throw Error("illegal buffer"); + }; + var create = function create2() { + return util.Buffer ? function create_buffer_setup(buffer) { + return (Reader.create = function create_buffer(buffer2) { + return util.Buffer.isBuffer(buffer2) ? new BufferReader(buffer2) : create_array(buffer2); + })(buffer); + } : create_array; + }; + Reader.create = create(); + Reader.prototype._slice = util.Array.prototype.subarray || /* istanbul ignore next */ + util.Array.prototype.slice; + Reader.prototype.uint32 = function read_uint32_setup() { + var value = 4294967295; + return function read_uint32() { + value = (this.buf[this.pos] & 127) >>> 0; + if (this.buf[this.pos++] < 128) + return value; + value = (value | (this.buf[this.pos] & 127) << 7) >>> 0; + if (this.buf[this.pos++] < 128) + return value; + value = (value | (this.buf[this.pos] & 127) << 14) >>> 0; + if (this.buf[this.pos++] < 128) + return value; + value = (value | (this.buf[this.pos] & 127) << 21) >>> 0; + if (this.buf[this.pos++] < 128) + return value; + value = (value | (this.buf[this.pos] & 15) << 28) >>> 0; + if (this.buf[this.pos++] < 128) + return value; + if ((this.pos += 5) > this.len) { + this.pos = this.len; + throw indexOutOfRange(this, 10); + } + return value; + }; + }(); + Reader.prototype.int32 = function read_int32() { + return this.uint32() | 0; + }; + Reader.prototype.sint32 = function read_sint32() { + var value = this.uint32(); + return value >>> 1 ^ -(value & 1) | 0; + }; + function readLongVarint() { + var bits = new LongBits(0, 0); + var i = 0; + if (this.len - this.pos > 4) { + for (; i < 4; ++i) { + bits.lo = (bits.lo | (this.buf[this.pos] & 127) << i * 7) >>> 0; + if (this.buf[this.pos++] < 128) + return bits; + } + bits.lo = (bits.lo | (this.buf[this.pos] & 127) << 28) >>> 0; + bits.hi = (bits.hi | (this.buf[this.pos] & 127) >> 4) >>> 0; + if (this.buf[this.pos++] < 128) + return bits; + i = 0; + } else { + for (; i < 3; ++i) { + if (this.pos >= this.len) + throw indexOutOfRange(this); + bits.lo = (bits.lo | (this.buf[this.pos] & 127) << i * 7) >>> 0; + if (this.buf[this.pos++] < 128) + return bits; + } + bits.lo = (bits.lo | (this.buf[this.pos++] & 127) << i * 7) >>> 0; + return bits; + } + if (this.len - this.pos > 4) { + for (; i < 5; ++i) { + bits.hi = (bits.hi | (this.buf[this.pos] & 127) << i * 7 + 3) >>> 0; + if (this.buf[this.pos++] < 128) + return bits; + } + } else { + for (; i < 5; ++i) { + if (this.pos >= this.len) + throw indexOutOfRange(this); + bits.hi = (bits.hi | (this.buf[this.pos] & 127) << i * 7 + 3) >>> 0; + if (this.buf[this.pos++] < 128) + return bits; + } + } + throw Error("invalid varint encoding"); + } + Reader.prototype.bool = function read_bool() { + return this.uint32() !== 0; + }; + function readFixed32_end(buf, end) { + return (buf[end - 4] | buf[end - 3] << 8 | buf[end - 2] << 16 | buf[end - 1] << 24) >>> 0; + } + Reader.prototype.fixed32 = function read_fixed32() { + if (this.pos + 4 > this.len) + throw indexOutOfRange(this, 4); + return readFixed32_end(this.buf, this.pos += 4); + }; + Reader.prototype.sfixed32 = function read_sfixed32() { + if (this.pos + 4 > this.len) + throw indexOutOfRange(this, 4); + return readFixed32_end(this.buf, this.pos += 4) | 0; + }; + function readFixed64() { + if (this.pos + 8 > this.len) + throw indexOutOfRange(this, 8); + return new LongBits(readFixed32_end(this.buf, this.pos += 4), readFixed32_end(this.buf, this.pos += 4)); + } + Reader.prototype.float = function read_float() { + if (this.pos + 4 > this.len) + throw indexOutOfRange(this, 4); + var value = util.float.readFloatLE(this.buf, this.pos); + this.pos += 4; + return value; + }; + Reader.prototype.double = function read_double() { + if (this.pos + 8 > this.len) + throw indexOutOfRange(this, 4); + var value = util.float.readDoubleLE(this.buf, this.pos); + this.pos += 8; + return value; + }; + Reader.prototype.bytes = function read_bytes() { + var length = this.uint32(), start = this.pos, end = this.pos + length; + if (end > this.len) + throw indexOutOfRange(this, length); + this.pos += length; + if (Array.isArray(this.buf)) + return this.buf.slice(start, end); + return start === end ? new this.buf.constructor(0) : this._slice.call(this.buf, start, end); + }; + Reader.prototype.string = function read_string() { + var bytes = this.bytes(); + return utf8.read(bytes, 0, bytes.length); + }; + Reader.prototype.skip = function skip(length) { + if (typeof length === "number") { + if (this.pos + length > this.len) + throw indexOutOfRange(this, length); + this.pos += length; + } else { + do { + if (this.pos >= this.len) + throw indexOutOfRange(this); + } while (this.buf[this.pos++] & 128); + } + return this; + }; + Reader.prototype.skipType = function(wireType) { + switch (wireType) { + case 0: + this.skip(); + break; + case 1: + this.skip(8); + break; + case 2: + this.skip(this.uint32()); + break; + case 3: + while ((wireType = this.uint32() & 7) !== 4) { + this.skipType(wireType); + } + break; + case 5: + this.skip(4); + break; + default: + throw Error("invalid wire type " + wireType + " at offset " + this.pos); + } + return this; + }; + Reader._configure = function(BufferReader_) { + BufferReader = BufferReader_; + Reader.create = create(); + BufferReader._configure(); + var fn = util.Long ? "toLong" : ( + /* istanbul ignore next */ + "toNumber" + ); + util.merge(Reader.prototype, { + int64: function read_int64() { + return readLongVarint.call(this)[fn](false); + }, + uint64: function read_uint64() { + return readLongVarint.call(this)[fn](true); + }, + sint64: function read_sint64() { + return readLongVarint.call(this).zzDecode()[fn](false); + }, + fixed64: function read_fixed64() { + return readFixed64.call(this)[fn](true); + }, + sfixed64: function read_sfixed64() { + return readFixed64.call(this)[fn](false); + } + }); + }; + } +}); + +// node_modules/protobufjs/src/reader_buffer.js +var require_reader_buffer = __commonJS({ + "node_modules/protobufjs/src/reader_buffer.js"(exports2, module2) { + "use strict"; + module2.exports = BufferReader; + var Reader = require_reader(); + (BufferReader.prototype = Object.create(Reader.prototype)).constructor = BufferReader; + var util = require_minimal(); + function BufferReader(buffer) { + Reader.call(this, buffer); + } + BufferReader._configure = function() { + if (util.Buffer) + BufferReader.prototype._slice = util.Buffer.prototype.slice; + }; + BufferReader.prototype.string = function read_string_buffer() { + var len = this.uint32(); + return this.buf.utf8Slice ? this.buf.utf8Slice(this.pos, this.pos = Math.min(this.pos + len, this.len)) : this.buf.toString("utf-8", this.pos, this.pos = Math.min(this.pos + len, this.len)); + }; + BufferReader._configure(); + } +}); + +// node_modules/protobufjs/src/rpc/service.js +var require_service = __commonJS({ + "node_modules/protobufjs/src/rpc/service.js"(exports2, module2) { + "use strict"; + module2.exports = Service; + var util = require_minimal(); + (Service.prototype = Object.create(util.EventEmitter.prototype)).constructor = Service; + function Service(rpcImpl, requestDelimited, responseDelimited) { + if (typeof rpcImpl !== "function") + throw TypeError("rpcImpl must be a function"); + util.EventEmitter.call(this); + this.rpcImpl = rpcImpl; + this.requestDelimited = Boolean(requestDelimited); + this.responseDelimited = Boolean(responseDelimited); + } + Service.prototype.rpcCall = function rpcCall(method, requestCtor, responseCtor, request, callback) { + if (!request) + throw TypeError("request must be specified"); + var self2 = this; + if (!callback) + return util.asPromise(rpcCall, self2, method, requestCtor, responseCtor, request); + if (!self2.rpcImpl) { + setTimeout(function() { + callback(Error("already ended")); + }, 0); + return void 0; + } + try { + return self2.rpcImpl( + method, + requestCtor[self2.requestDelimited ? "encodeDelimited" : "encode"](request).finish(), + function rpcCallback(err, response) { + if (err) { + self2.emit("error", err, method); + return callback(err); + } + if (response === null) { + self2.end( + /* endedByRPC */ + true + ); + return void 0; + } + if (!(response instanceof responseCtor)) { + try { + response = responseCtor[self2.responseDelimited ? "decodeDelimited" : "decode"](response); + } catch (err2) { + self2.emit("error", err2, method); + return callback(err2); + } + } + self2.emit("data", response, method); + return callback(null, response); + } + ); + } catch (err) { + self2.emit("error", err, method); + setTimeout(function() { + callback(err); + }, 0); + return void 0; + } + }; + Service.prototype.end = function end(endedByRPC) { + if (this.rpcImpl) { + if (!endedByRPC) + this.rpcImpl(null, null, null); + this.rpcImpl = null; + this.emit("end").off(); + } + return this; + }; + } +}); + +// node_modules/protobufjs/src/rpc.js +var require_rpc = __commonJS({ + "node_modules/protobufjs/src/rpc.js"(exports2) { + "use strict"; + var rpc = exports2; + rpc.Service = require_service(); + } +}); + +// node_modules/protobufjs/src/roots.js +var require_roots = __commonJS({ + "node_modules/protobufjs/src/roots.js"(exports2, module2) { + "use strict"; + module2.exports = {}; + } +}); + +// node_modules/protobufjs/src/index-minimal.js +var require_index_minimal = __commonJS({ + "node_modules/protobufjs/src/index-minimal.js"(exports2) { + "use strict"; + var protobuf = exports2; + protobuf.build = "minimal"; + protobuf.Writer = require_writer(); + protobuf.BufferWriter = require_writer_buffer(); + protobuf.Reader = require_reader(); + protobuf.BufferReader = require_reader_buffer(); + protobuf.util = require_minimal(); + protobuf.rpc = require_rpc(); + protobuf.roots = require_roots(); + protobuf.configure = configure; + function configure() { + protobuf.util._configure(); + protobuf.Writer._configure(protobuf.BufferWriter); + protobuf.Reader._configure(protobuf.BufferReader); + } + configure(); + } +}); + +// node_modules/@protobufjs/codegen/index.js +var require_codegen = __commonJS({ + "node_modules/@protobufjs/codegen/index.js"(exports2, module2) { + "use strict"; + module2.exports = codegen; + function codegen(functionParams, functionName) { + if (typeof functionParams === "string") { + functionName = functionParams; + functionParams = void 0; + } + var body = []; + function Codegen(formatStringOrScope) { + if (typeof formatStringOrScope !== "string") { + var source = toString(); + if (codegen.verbose) + console.log("codegen: " + source); + source = "return " + source; + if (formatStringOrScope) { + var scopeKeys = Object.keys(formatStringOrScope), scopeParams = new Array(scopeKeys.length + 1), scopeValues = new Array(scopeKeys.length), scopeOffset = 0; + while (scopeOffset < scopeKeys.length) { + scopeParams[scopeOffset] = scopeKeys[scopeOffset]; + scopeValues[scopeOffset] = formatStringOrScope[scopeKeys[scopeOffset++]]; + } + scopeParams[scopeOffset] = source; + return Function.apply(null, scopeParams).apply(null, scopeValues); + } + return Function(source)(); + } + var formatParams = new Array(arguments.length - 1), formatOffset = 0; + while (formatOffset < formatParams.length) + formatParams[formatOffset] = arguments[++formatOffset]; + formatOffset = 0; + formatStringOrScope = formatStringOrScope.replace(/%([%dfijs])/g, function replace($0, $1) { + var value = formatParams[formatOffset++]; + switch ($1) { + case "d": + case "f": + return String(Number(value)); + case "i": + return String(Math.floor(value)); + case "j": + return JSON.stringify(value); + case "s": + return String(value); + } + return "%"; + }); + if (formatOffset !== formatParams.length) + throw Error("parameter count mismatch"); + body.push(formatStringOrScope); + return Codegen; + } + function toString(functionNameOverride) { + return "function " + (functionNameOverride || functionName || "") + "(" + (functionParams && functionParams.join(",") || "") + "){\n " + body.join("\n ") + "\n}"; + } + Codegen.toString = toString; + return Codegen; + } + codegen.verbose = false; + } +}); + +// node_modules/@protobufjs/fetch/index.js +var require_fetch = __commonJS({ + "node_modules/@protobufjs/fetch/index.js"(exports2, module2) { + "use strict"; + module2.exports = fetch; + var asPromise = require_aspromise(); + var inquire2 = require_inquire(); + var fs2 = inquire2("fs"); + function fetch(filename, options2, callback) { + if (typeof options2 === "function") { + callback = options2; + options2 = {}; + } else if (!options2) + options2 = {}; + if (!callback) + return asPromise(fetch, this, filename, options2); + if (!options2.xhr && fs2 && fs2.readFile) + return fs2.readFile(filename, function fetchReadFileCallback(err, contents) { + return err && typeof XMLHttpRequest !== "undefined" ? fetch.xhr(filename, options2, callback) : err ? callback(err) : callback(null, options2.binary ? contents : contents.toString("utf8")); + }); + return fetch.xhr(filename, options2, callback); + } + fetch.xhr = function fetch_xhr(filename, options2, callback) { + var xhr = new XMLHttpRequest(); + xhr.onreadystatechange = function fetchOnReadyStateChange() { + if (xhr.readyState !== 4) + return void 0; + if (xhr.status !== 0 && xhr.status !== 200) + return callback(Error("status " + xhr.status)); + if (options2.binary) { + var buffer = xhr.response; + if (!buffer) { + buffer = []; + for (var i = 0; i < xhr.responseText.length; ++i) + buffer.push(xhr.responseText.charCodeAt(i) & 255); + } + return callback(null, typeof Uint8Array !== "undefined" ? new Uint8Array(buffer) : buffer); + } + return callback(null, xhr.responseText); + }; + if (options2.binary) { + if ("overrideMimeType" in xhr) + xhr.overrideMimeType("text/plain; charset=x-user-defined"); + xhr.responseType = "arraybuffer"; + } + xhr.open("GET", filename); + xhr.send(); + }; + } +}); + +// node_modules/@protobufjs/path/index.js +var require_path = __commonJS({ + "node_modules/@protobufjs/path/index.js"(exports2) { + "use strict"; + var path = exports2; + var isAbsolute = ( + /** + * Tests if the specified path is absolute. + * @param {string} path Path to test + * @returns {boolean} `true` if path is absolute + */ + path.isAbsolute = function isAbsolute2(path2) { + return /^(?:\/|\w+:)/.test(path2); + } + ); + var normalize = ( + /** + * Normalizes the specified path. + * @param {string} path Path to normalize + * @returns {string} Normalized path + */ + path.normalize = function normalize2(path2) { + path2 = path2.replace(/\\/g, "/").replace(/\/{2,}/g, "/"); + var parts = path2.split("/"), absolute = isAbsolute(path2), prefix = ""; + if (absolute) + prefix = parts.shift() + "/"; + for (var i = 0; i < parts.length; ) { + if (parts[i] === "..") { + if (i > 0 && parts[i - 1] !== "..") + parts.splice(--i, 2); + else if (absolute) + parts.splice(i, 1); + else + ++i; + } else if (parts[i] === ".") + parts.splice(i, 1); + else + ++i; + } + return prefix + parts.join("/"); + } + ); + path.resolve = function resolve(originPath, includePath, alreadyNormalized) { + if (!alreadyNormalized) + includePath = normalize(includePath); + if (isAbsolute(includePath)) + return includePath; + if (!alreadyNormalized) + originPath = normalize(originPath); + return (originPath = originPath.replace(/(?:\/|^)[^/]+$/, "")).length ? normalize(originPath + "/" + includePath) : includePath; + }; + } +}); + +// node_modules/protobufjs/src/types.js +var require_types = __commonJS({ + "node_modules/protobufjs/src/types.js"(exports2) { + "use strict"; + var types = exports2; + var util = require_util(); + var s = [ + "double", + // 0 + "float", + // 1 + "int32", + // 2 + "uint32", + // 3 + "sint32", + // 4 + "fixed32", + // 5 + "sfixed32", + // 6 + "int64", + // 7 + "uint64", + // 8 + "sint64", + // 9 + "fixed64", + // 10 + "sfixed64", + // 11 + "bool", + // 12 + "string", + // 13 + "bytes" + // 14 + ]; + function bake(values, offset) { + var i = 0, o = {}; + offset |= 0; + while (i < values.length) + o[s[i + offset]] = values[i++]; + return o; + } + types.basic = bake([ + /* double */ + 1, + /* float */ + 5, + /* int32 */ + 0, + /* uint32 */ + 0, + /* sint32 */ + 0, + /* fixed32 */ + 5, + /* sfixed32 */ + 5, + /* int64 */ + 0, + /* uint64 */ + 0, + /* sint64 */ + 0, + /* fixed64 */ + 1, + /* sfixed64 */ + 1, + /* bool */ + 0, + /* string */ + 2, + /* bytes */ + 2 + ]); + types.defaults = bake([ + /* double */ + 0, + /* float */ + 0, + /* int32 */ + 0, + /* uint32 */ + 0, + /* sint32 */ + 0, + /* fixed32 */ + 0, + /* sfixed32 */ + 0, + /* int64 */ + 0, + /* uint64 */ + 0, + /* sint64 */ + 0, + /* fixed64 */ + 0, + /* sfixed64 */ + 0, + /* bool */ + false, + /* string */ + "", + /* bytes */ + util.emptyArray, + /* message */ + null + ]); + types.long = bake([ + /* int64 */ + 0, + /* uint64 */ + 0, + /* sint64 */ + 0, + /* fixed64 */ + 1, + /* sfixed64 */ + 1 + ], 7); + types.mapKey = bake([ + /* int32 */ + 0, + /* uint32 */ + 0, + /* sint32 */ + 0, + /* fixed32 */ + 5, + /* sfixed32 */ + 5, + /* int64 */ + 0, + /* uint64 */ + 0, + /* sint64 */ + 0, + /* fixed64 */ + 1, + /* sfixed64 */ + 1, + /* bool */ + 0, + /* string */ + 2 + ], 2); + types.packed = bake([ + /* double */ + 1, + /* float */ + 5, + /* int32 */ + 0, + /* uint32 */ + 0, + /* sint32 */ + 0, + /* fixed32 */ + 5, + /* sfixed32 */ + 5, + /* int64 */ + 0, + /* uint64 */ + 0, + /* sint64 */ + 0, + /* fixed64 */ + 1, + /* sfixed64 */ + 1, + /* bool */ + 0 + ]); + } +}); + +// node_modules/protobufjs/src/field.js +var require_field = __commonJS({ + "node_modules/protobufjs/src/field.js"(exports2, module2) { + "use strict"; + module2.exports = Field; + var ReflectionObject = require_object(); + ((Field.prototype = Object.create(ReflectionObject.prototype)).constructor = Field).className = "Field"; + var Enum = require_enum(); + var types = require_types(); + var util = require_util(); + var Type; + var ruleRe = /^required|optional|repeated$/; + Field.fromJSON = function fromJSON(name, json) { + return new Field(name, json.id, json.type, json.rule, json.extend, json.options, json.comment); + }; + function Field(name, id, type, rule, extend, options2, comment) { + if (util.isObject(rule)) { + comment = extend; + options2 = rule; + rule = extend = void 0; + } else if (util.isObject(extend)) { + comment = options2; + options2 = extend; + extend = void 0; + } + ReflectionObject.call(this, name, options2); + if (!util.isInteger(id) || id < 0) + throw TypeError("id must be a non-negative integer"); + if (!util.isString(type)) + throw TypeError("type must be a string"); + if (rule !== void 0 && !ruleRe.test(rule = rule.toString().toLowerCase())) + throw TypeError("rule must be a string rule"); + if (extend !== void 0 && !util.isString(extend)) + throw TypeError("extend must be a string"); + if (rule === "proto3_optional") { + rule = "optional"; + } + this.rule = rule && rule !== "optional" ? rule : void 0; + this.type = type; + this.id = id; + this.extend = extend || void 0; + this.required = rule === "required"; + this.optional = !this.required; + this.repeated = rule === "repeated"; + this.map = false; + this.message = null; + this.partOf = null; + this.typeDefault = null; + this.defaultValue = null; + this.long = util.Long ? types.long[type] !== void 0 : ( + /* istanbul ignore next */ + false + ); + this.bytes = type === "bytes"; + this.resolvedType = null; + this.extensionField = null; + this.declaringField = null; + this._packed = null; + this.comment = comment; + } + Object.defineProperty(Field.prototype, "packed", { + get: function() { + if (this._packed === null) + this._packed = this.getOption("packed") !== false; + return this._packed; + } + }); + Field.prototype.setOption = function setOption(name, value, ifNotSet) { + if (name === "packed") + this._packed = null; + return ReflectionObject.prototype.setOption.call(this, name, value, ifNotSet); + }; + Field.prototype.toJSON = function toJSON(toJSONOptions) { + var keepComments = toJSONOptions ? Boolean(toJSONOptions.keepComments) : false; + return util.toObject([ + "rule", + this.rule !== "optional" && this.rule || void 0, + "type", + this.type, + "id", + this.id, + "extend", + this.extend, + "options", + this.options, + "comment", + keepComments ? this.comment : void 0 + ]); + }; + Field.prototype.resolve = function resolve() { + if (this.resolved) + return this; + if ((this.typeDefault = types.defaults[this.type]) === void 0) { + this.resolvedType = (this.declaringField ? this.declaringField.parent : this.parent).lookupTypeOrEnum(this.type); + if (this.resolvedType instanceof Type) + this.typeDefault = null; + else + this.typeDefault = this.resolvedType.values[Object.keys(this.resolvedType.values)[0]]; + } else if (this.options && this.options.proto3_optional) { + this.typeDefault = null; + } + if (this.options && this.options["default"] != null) { + this.typeDefault = this.options["default"]; + if (this.resolvedType instanceof Enum && typeof this.typeDefault === "string") + this.typeDefault = this.resolvedType.values[this.typeDefault]; + } + if (this.options) { + if (this.options.packed === true || this.options.packed !== void 0 && this.resolvedType && !(this.resolvedType instanceof Enum)) + delete this.options.packed; + if (!Object.keys(this.options).length) + this.options = void 0; + } + if (this.long) { + this.typeDefault = util.Long.fromNumber(this.typeDefault, this.type.charAt(0) === "u"); + if (Object.freeze) + Object.freeze(this.typeDefault); + } else if (this.bytes && typeof this.typeDefault === "string") { + var buf; + if (util.base64.test(this.typeDefault)) + util.base64.decode(this.typeDefault, buf = util.newBuffer(util.base64.length(this.typeDefault)), 0); + else + util.utf8.write(this.typeDefault, buf = util.newBuffer(util.utf8.length(this.typeDefault)), 0); + this.typeDefault = buf; + } + if (this.map) + this.defaultValue = util.emptyObject; + else if (this.repeated) + this.defaultValue = util.emptyArray; + else + this.defaultValue = this.typeDefault; + if (this.parent instanceof Type) + this.parent.ctor.prototype[this.name] = this.defaultValue; + return ReflectionObject.prototype.resolve.call(this); + }; + Field.d = function decorateField(fieldId, fieldType, fieldRule, defaultValue) { + if (typeof fieldType === "function") + fieldType = util.decorateType(fieldType).name; + else if (fieldType && typeof fieldType === "object") + fieldType = util.decorateEnum(fieldType).name; + return function fieldDecorator(prototype, fieldName) { + util.decorateType(prototype.constructor).add(new Field(fieldName, fieldId, fieldType, fieldRule, { "default": defaultValue })); + }; + }; + Field._configure = function configure(Type_) { + Type = Type_; + }; + } +}); + +// node_modules/protobufjs/src/oneof.js +var require_oneof = __commonJS({ + "node_modules/protobufjs/src/oneof.js"(exports2, module2) { + "use strict"; + module2.exports = OneOf; + var ReflectionObject = require_object(); + ((OneOf.prototype = Object.create(ReflectionObject.prototype)).constructor = OneOf).className = "OneOf"; + var Field = require_field(); + var util = require_util(); + function OneOf(name, fieldNames, options2, comment) { + if (!Array.isArray(fieldNames)) { + options2 = fieldNames; + fieldNames = void 0; + } + ReflectionObject.call(this, name, options2); + if (!(fieldNames === void 0 || Array.isArray(fieldNames))) + throw TypeError("fieldNames must be an Array"); + this.oneof = fieldNames || []; + this.fieldsArray = []; + this.comment = comment; + } + OneOf.fromJSON = function fromJSON(name, json) { + return new OneOf(name, json.oneof, json.options, json.comment); + }; + OneOf.prototype.toJSON = function toJSON(toJSONOptions) { + var keepComments = toJSONOptions ? Boolean(toJSONOptions.keepComments) : false; + return util.toObject([ + "options", + this.options, + "oneof", + this.oneof, + "comment", + keepComments ? this.comment : void 0 + ]); + }; + function addFieldsToParent(oneof) { + if (oneof.parent) { + for (var i = 0; i < oneof.fieldsArray.length; ++i) + if (!oneof.fieldsArray[i].parent) + oneof.parent.add(oneof.fieldsArray[i]); + } + } + OneOf.prototype.add = function add(field) { + if (!(field instanceof Field)) + throw TypeError("field must be a Field"); + if (field.parent && field.parent !== this.parent) + field.parent.remove(field); + this.oneof.push(field.name); + this.fieldsArray.push(field); + field.partOf = this; + addFieldsToParent(this); + return this; + }; + OneOf.prototype.remove = function remove(field) { + if (!(field instanceof Field)) + throw TypeError("field must be a Field"); + var index = this.fieldsArray.indexOf(field); + if (index < 0) + throw Error(field + " is not a member of " + this); + this.fieldsArray.splice(index, 1); + index = this.oneof.indexOf(field.name); + if (index > -1) + this.oneof.splice(index, 1); + field.partOf = null; + return this; + }; + OneOf.prototype.onAdd = function onAdd(parent) { + ReflectionObject.prototype.onAdd.call(this, parent); + var self2 = this; + for (var i = 0; i < this.oneof.length; ++i) { + var field = parent.get(this.oneof[i]); + if (field && !field.partOf) { + field.partOf = self2; + self2.fieldsArray.push(field); + } + } + addFieldsToParent(this); + }; + OneOf.prototype.onRemove = function onRemove(parent) { + for (var i = 0, field; i < this.fieldsArray.length; ++i) + if ((field = this.fieldsArray[i]).parent) + field.parent.remove(field); + ReflectionObject.prototype.onRemove.call(this, parent); + }; + OneOf.d = function decorateOneOf() { + var fieldNames = new Array(arguments.length), index = 0; + while (index < arguments.length) + fieldNames[index] = arguments[index++]; + return function oneOfDecorator(prototype, oneofName) { + util.decorateType(prototype.constructor).add(new OneOf(oneofName, fieldNames)); + Object.defineProperty(prototype, oneofName, { + get: util.oneOfGetter(fieldNames), + set: util.oneOfSetter(fieldNames) + }); + }; + }; + } +}); + +// node_modules/protobufjs/src/namespace.js +var require_namespace = __commonJS({ + "node_modules/protobufjs/src/namespace.js"(exports2, module2) { + "use strict"; + module2.exports = Namespace; + var ReflectionObject = require_object(); + ((Namespace.prototype = Object.create(ReflectionObject.prototype)).constructor = Namespace).className = "Namespace"; + var Field = require_field(); + var util = require_util(); + var OneOf = require_oneof(); + var Type; + var Service; + var Enum; + Namespace.fromJSON = function fromJSON(name, json) { + return new Namespace(name, json.options).addJSON(json.nested); + }; + function arrayToJSON(array, toJSONOptions) { + if (!(array && array.length)) + return void 0; + var obj = {}; + for (var i = 0; i < array.length; ++i) + obj[array[i].name] = array[i].toJSON(toJSONOptions); + return obj; + } + Namespace.arrayToJSON = arrayToJSON; + Namespace.isReservedId = function isReservedId(reserved, id) { + if (reserved) { + for (var i = 0; i < reserved.length; ++i) + if (typeof reserved[i] !== "string" && reserved[i][0] <= id && reserved[i][1] > id) + return true; + } + return false; + }; + Namespace.isReservedName = function isReservedName(reserved, name) { + if (reserved) { + for (var i = 0; i < reserved.length; ++i) + if (reserved[i] === name) + return true; + } + return false; + }; + function Namespace(name, options2) { + ReflectionObject.call(this, name, options2); + this.nested = void 0; + this._nestedArray = null; + } + function clearCache(namespace) { + namespace._nestedArray = null; + return namespace; + } + Object.defineProperty(Namespace.prototype, "nestedArray", { + get: function() { + return this._nestedArray || (this._nestedArray = util.toArray(this.nested)); + } + }); + Namespace.prototype.toJSON = function toJSON(toJSONOptions) { + return util.toObject([ + "options", + this.options, + "nested", + arrayToJSON(this.nestedArray, toJSONOptions) + ]); + }; + Namespace.prototype.addJSON = function addJSON(nestedJson) { + var ns3 = this; + if (nestedJson) { + for (var names = Object.keys(nestedJson), i = 0, nested; i < names.length; ++i) { + nested = nestedJson[names[i]]; + ns3.add( + // most to least likely + (nested.fields !== void 0 ? Type.fromJSON : nested.values !== void 0 ? Enum.fromJSON : nested.methods !== void 0 ? Service.fromJSON : nested.id !== void 0 ? Field.fromJSON : Namespace.fromJSON)(names[i], nested) + ); + } + } + return this; + }; + Namespace.prototype.get = function get(name) { + return this.nested && this.nested[name] || null; + }; + Namespace.prototype.getEnum = function getEnum(name) { + if (this.nested && this.nested[name] instanceof Enum) + return this.nested[name].values; + throw Error("no such enum: " + name); + }; + Namespace.prototype.add = function add(object) { + if (!(object instanceof Field && object.extend !== void 0 || object instanceof Type || object instanceof OneOf || object instanceof Enum || object instanceof Service || object instanceof Namespace)) + throw TypeError("object must be a valid nested object"); + if (!this.nested) + this.nested = {}; + else { + var prev = this.get(object.name); + if (prev) { + if (prev instanceof Namespace && object instanceof Namespace && !(prev instanceof Type || prev instanceof Service)) { + var nested = prev.nestedArray; + for (var i = 0; i < nested.length; ++i) + object.add(nested[i]); + this.remove(prev); + if (!this.nested) + this.nested = {}; + object.setOptions(prev.options, true); + } else + throw Error("duplicate name '" + object.name + "' in " + this); + } + } + this.nested[object.name] = object; + object.onAdd(this); + return clearCache(this); + }; + Namespace.prototype.remove = function remove(object) { + if (!(object instanceof ReflectionObject)) + throw TypeError("object must be a ReflectionObject"); + if (object.parent !== this) + throw Error(object + " is not a member of " + this); + delete this.nested[object.name]; + if (!Object.keys(this.nested).length) + this.nested = void 0; + object.onRemove(this); + return clearCache(this); + }; + Namespace.prototype.define = function define(path, json) { + if (util.isString(path)) + path = path.split("."); + else if (!Array.isArray(path)) + throw TypeError("illegal path"); + if (path && path.length && path[0] === "") + throw Error("path must be relative"); + var ptr = this; + while (path.length > 0) { + var part = path.shift(); + if (ptr.nested && ptr.nested[part]) { + ptr = ptr.nested[part]; + if (!(ptr instanceof Namespace)) + throw Error("path conflicts with non-namespace objects"); + } else + ptr.add(ptr = new Namespace(part)); + } + if (json) + ptr.addJSON(json); + return ptr; + }; + Namespace.prototype.resolveAll = function resolveAll() { + var nested = this.nestedArray, i = 0; + while (i < nested.length) + if (nested[i] instanceof Namespace) + nested[i++].resolveAll(); + else + nested[i++].resolve(); + return this.resolve(); + }; + Namespace.prototype.lookup = function lookup(path, filterTypes, parentAlreadyChecked) { + if (typeof filterTypes === "boolean") { + parentAlreadyChecked = filterTypes; + filterTypes = void 0; + } else if (filterTypes && !Array.isArray(filterTypes)) + filterTypes = [filterTypes]; + if (util.isString(path) && path.length) { + if (path === ".") + return this.root; + path = path.split("."); + } else if (!path.length) + return this; + if (path[0] === "") + return this.root.lookup(path.slice(1), filterTypes); + var found = this.get(path[0]); + if (found) { + if (path.length === 1) { + if (!filterTypes || filterTypes.indexOf(found.constructor) > -1) + return found; + } else if (found instanceof Namespace && (found = found.lookup(path.slice(1), filterTypes, true))) + return found; + } else + for (var i = 0; i < this.nestedArray.length; ++i) + if (this._nestedArray[i] instanceof Namespace && (found = this._nestedArray[i].lookup(path, filterTypes, true))) + return found; + if (this.parent === null || parentAlreadyChecked) + return null; + return this.parent.lookup(path, filterTypes); + }; + Namespace.prototype.lookupType = function lookupType(path) { + var found = this.lookup(path, [Type]); + if (!found) + throw Error("no such type: " + path); + return found; + }; + Namespace.prototype.lookupEnum = function lookupEnum(path) { + var found = this.lookup(path, [Enum]); + if (!found) + throw Error("no such Enum '" + path + "' in " + this); + return found; + }; + Namespace.prototype.lookupTypeOrEnum = function lookupTypeOrEnum(path) { + var found = this.lookup(path, [Type, Enum]); + if (!found) + throw Error("no such Type or Enum '" + path + "' in " + this); + return found; + }; + Namespace.prototype.lookupService = function lookupService(path) { + var found = this.lookup(path, [Service]); + if (!found) + throw Error("no such Service '" + path + "' in " + this); + return found; + }; + Namespace._configure = function(Type_, Service_, Enum_) { + Type = Type_; + Service = Service_; + Enum = Enum_; + }; + } +}); + +// node_modules/protobufjs/src/mapfield.js +var require_mapfield = __commonJS({ + "node_modules/protobufjs/src/mapfield.js"(exports2, module2) { + "use strict"; + module2.exports = MapField; + var Field = require_field(); + ((MapField.prototype = Object.create(Field.prototype)).constructor = MapField).className = "MapField"; + var types = require_types(); + var util = require_util(); + function MapField(name, id, keyType, type, options2, comment) { + Field.call(this, name, id, type, void 0, void 0, options2, comment); + if (!util.isString(keyType)) + throw TypeError("keyType must be a string"); + this.keyType = keyType; + this.resolvedKeyType = null; + this.map = true; + } + MapField.fromJSON = function fromJSON(name, json) { + return new MapField(name, json.id, json.keyType, json.type, json.options, json.comment); + }; + MapField.prototype.toJSON = function toJSON(toJSONOptions) { + var keepComments = toJSONOptions ? Boolean(toJSONOptions.keepComments) : false; + return util.toObject([ + "keyType", + this.keyType, + "type", + this.type, + "id", + this.id, + "extend", + this.extend, + "options", + this.options, + "comment", + keepComments ? this.comment : void 0 + ]); + }; + MapField.prototype.resolve = function resolve() { + if (this.resolved) + return this; + if (types.mapKey[this.keyType] === void 0) + throw Error("invalid key type: " + this.keyType); + return Field.prototype.resolve.call(this); + }; + MapField.d = function decorateMapField(fieldId, fieldKeyType, fieldValueType) { + if (typeof fieldValueType === "function") + fieldValueType = util.decorateType(fieldValueType).name; + else if (fieldValueType && typeof fieldValueType === "object") + fieldValueType = util.decorateEnum(fieldValueType).name; + return function mapFieldDecorator(prototype, fieldName) { + util.decorateType(prototype.constructor).add(new MapField(fieldName, fieldId, fieldKeyType, fieldValueType)); + }; + }; + } +}); + +// node_modules/protobufjs/src/method.js +var require_method = __commonJS({ + "node_modules/protobufjs/src/method.js"(exports2, module2) { + "use strict"; + module2.exports = Method; + var ReflectionObject = require_object(); + ((Method.prototype = Object.create(ReflectionObject.prototype)).constructor = Method).className = "Method"; + var util = require_util(); + function Method(name, type, requestType, responseType, requestStream, responseStream, options2, comment, parsedOptions) { + if (util.isObject(requestStream)) { + options2 = requestStream; + requestStream = responseStream = void 0; + } else if (util.isObject(responseStream)) { + options2 = responseStream; + responseStream = void 0; + } + if (!(type === void 0 || util.isString(type))) + throw TypeError("type must be a string"); + if (!util.isString(requestType)) + throw TypeError("requestType must be a string"); + if (!util.isString(responseType)) + throw TypeError("responseType must be a string"); + ReflectionObject.call(this, name, options2); + this.type = type || "rpc"; + this.requestType = requestType; + this.requestStream = requestStream ? true : void 0; + this.responseType = responseType; + this.responseStream = responseStream ? true : void 0; + this.resolvedRequestType = null; + this.resolvedResponseType = null; + this.comment = comment; + this.parsedOptions = parsedOptions; + } + Method.fromJSON = function fromJSON(name, json) { + return new Method(name, json.type, json.requestType, json.responseType, json.requestStream, json.responseStream, json.options, json.comment, json.parsedOptions); + }; + Method.prototype.toJSON = function toJSON(toJSONOptions) { + var keepComments = toJSONOptions ? Boolean(toJSONOptions.keepComments) : false; + return util.toObject([ + "type", + this.type !== "rpc" && /* istanbul ignore next */ + this.type || void 0, + "requestType", + this.requestType, + "requestStream", + this.requestStream, + "responseType", + this.responseType, + "responseStream", + this.responseStream, + "options", + this.options, + "comment", + keepComments ? this.comment : void 0, + "parsedOptions", + this.parsedOptions + ]); + }; + Method.prototype.resolve = function resolve() { + if (this.resolved) + return this; + this.resolvedRequestType = this.parent.lookupType(this.requestType); + this.resolvedResponseType = this.parent.lookupType(this.responseType); + return ReflectionObject.prototype.resolve.call(this); + }; + } +}); + +// node_modules/protobufjs/src/service.js +var require_service2 = __commonJS({ + "node_modules/protobufjs/src/service.js"(exports2, module2) { + "use strict"; + module2.exports = Service; + var Namespace = require_namespace(); + ((Service.prototype = Object.create(Namespace.prototype)).constructor = Service).className = "Service"; + var Method = require_method(); + var util = require_util(); + var rpc = require_rpc(); + function Service(name, options2) { + Namespace.call(this, name, options2); + this.methods = {}; + this._methodsArray = null; + } + Service.fromJSON = function fromJSON(name, json) { + var service = new Service(name, json.options); + if (json.methods) + for (var names = Object.keys(json.methods), i = 0; i < names.length; ++i) + service.add(Method.fromJSON(names[i], json.methods[names[i]])); + if (json.nested) + service.addJSON(json.nested); + service.comment = json.comment; + return service; + }; + Service.prototype.toJSON = function toJSON(toJSONOptions) { + var inherited = Namespace.prototype.toJSON.call(this, toJSONOptions); + var keepComments = toJSONOptions ? Boolean(toJSONOptions.keepComments) : false; + return util.toObject([ + "options", + inherited && inherited.options || void 0, + "methods", + Namespace.arrayToJSON(this.methodsArray, toJSONOptions) || /* istanbul ignore next */ + {}, + "nested", + inherited && inherited.nested || void 0, + "comment", + keepComments ? this.comment : void 0 + ]); + }; + Object.defineProperty(Service.prototype, "methodsArray", { + get: function() { + return this._methodsArray || (this._methodsArray = util.toArray(this.methods)); + } + }); + function clearCache(service) { + service._methodsArray = null; + return service; + } + Service.prototype.get = function get(name) { + return this.methods[name] || Namespace.prototype.get.call(this, name); + }; + Service.prototype.resolveAll = function resolveAll() { + var methods = this.methodsArray; + for (var i = 0; i < methods.length; ++i) + methods[i].resolve(); + return Namespace.prototype.resolve.call(this); + }; + Service.prototype.add = function add(object) { + if (this.get(object.name)) + throw Error("duplicate name '" + object.name + "' in " + this); + if (object instanceof Method) { + this.methods[object.name] = object; + object.parent = this; + return clearCache(this); + } + return Namespace.prototype.add.call(this, object); + }; + Service.prototype.remove = function remove(object) { + if (object instanceof Method) { + if (this.methods[object.name] !== object) + throw Error(object + " is not a member of " + this); + delete this.methods[object.name]; + object.parent = null; + return clearCache(this); + } + return Namespace.prototype.remove.call(this, object); + }; + Service.prototype.create = function create(rpcImpl, requestDelimited, responseDelimited) { + var rpcService = new rpc.Service(rpcImpl, requestDelimited, responseDelimited); + for (var i = 0, method; i < /* initializes */ + this.methodsArray.length; ++i) { + var methodName = util.lcFirst((method = this._methodsArray[i]).resolve().name).replace(/[^$\w_]/g, ""); + rpcService[methodName] = util.codegen(["r", "c"], util.isReserved(methodName) ? methodName + "_" : methodName)("return this.rpcCall(m,q,s,r,c)")({ + m: method, + q: method.resolvedRequestType.ctor, + s: method.resolvedResponseType.ctor + }); + } + return rpcService; + }; + } +}); + +// node_modules/protobufjs/src/message.js +var require_message = __commonJS({ + "node_modules/protobufjs/src/message.js"(exports2, module2) { + "use strict"; + module2.exports = Message; + var util = require_minimal(); + function Message(properties) { + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + this[keys[i]] = properties[keys[i]]; + } + Message.create = function create(properties) { + return this.$type.create(properties); + }; + Message.encode = function encode(message, writer) { + return this.$type.encode(message, writer); + }; + Message.encodeDelimited = function encodeDelimited(message, writer) { + return this.$type.encodeDelimited(message, writer); + }; + Message.decode = function decode(reader) { + return this.$type.decode(reader); + }; + Message.decodeDelimited = function decodeDelimited(reader) { + return this.$type.decodeDelimited(reader); + }; + Message.verify = function verify(message) { + return this.$type.verify(message); + }; + Message.fromObject = function fromObject(object) { + return this.$type.fromObject(object); + }; + Message.toObject = function toObject(message, options2) { + return this.$type.toObject(message, options2); + }; + Message.prototype.toJSON = function toJSON() { + return this.$type.toObject(this, util.toJSONOptions); + }; + } +}); + +// node_modules/protobufjs/src/decoder.js +var require_decoder = __commonJS({ + "node_modules/protobufjs/src/decoder.js"(exports2, module2) { + "use strict"; + module2.exports = decoder; + var Enum = require_enum(); + var types = require_types(); + var util = require_util(); + function missing(field) { + return "missing required '" + field.name + "'"; + } + function decoder(mtype) { + var gen = util.codegen(["r", "l"], mtype.name + "$decode")("if(!(r instanceof Reader))")("r=Reader.create(r)")("var c=l===undefined?r.len:r.pos+l,m=new this.ctor" + (mtype.fieldsArray.filter(function(field2) { + return field2.map; + }).length ? ",k,value" : ""))("while(r.pos>>3){"); + var i = 0; + for (; i < /* initializes */ + mtype.fieldsArray.length; ++i) { + var field = mtype._fieldsArray[i].resolve(), type = field.resolvedType instanceof Enum ? "int32" : field.type, ref = "m" + util.safeProp(field.name); + gen("case %i: {", field.id); + if (field.map) { + gen("if(%s===util.emptyObject)", ref)("%s={}", ref)("var c2 = r.uint32()+r.pos"); + if (types.defaults[field.keyType] !== void 0) + gen("k=%j", types.defaults[field.keyType]); + else + gen("k=null"); + if (types.defaults[type] !== void 0) + gen("value=%j", types.defaults[type]); + else + gen("value=null"); + gen("while(r.pos>>3){")("case 1: k=r.%s(); break", field.keyType)("case 2:"); + if (types.basic[type] === void 0) + gen("value=types[%i].decode(r,r.uint32())", i); + else + gen("value=r.%s()", type); + gen("break")("default:")("r.skipType(tag2&7)")("break")("}")("}"); + if (types.long[field.keyType] !== void 0) + gen('%s[typeof k==="object"?util.longToHash(k):k]=value', ref); + else + gen("%s[k]=value", ref); + } else if (field.repeated) { + gen("if(!(%s&&%s.length))", ref, ref)("%s=[]", ref); + if (types.packed[type] !== void 0) + gen("if((t&7)===2){")("var c2=r.uint32()+r.pos")("while(r.pos>>0", prop, prop); + break; + case "int32": + case "sint32": + case "sfixed32": + gen("m%s=d%s|0", prop, prop); + break; + case "uint64": + isUnsigned = true; + case "int64": + case "sint64": + case "fixed64": + case "sfixed64": + gen("if(util.Long)")("(m%s=util.Long.fromValue(d%s)).unsigned=%j", prop, prop, isUnsigned)('else if(typeof d%s==="string")', prop)("m%s=parseInt(d%s,10)", prop, prop)('else if(typeof d%s==="number")', prop)("m%s=d%s", prop, prop)('else if(typeof d%s==="object")', prop)("m%s=new util.LongBits(d%s.low>>>0,d%s.high>>>0).toNumber(%s)", prop, prop, prop, isUnsigned ? "true" : ""); + break; + case "bytes": + gen('if(typeof d%s==="string")', prop)("util.base64.decode(d%s,m%s=util.newBuffer(util.base64.length(d%s)),0)", prop, prop, prop)("else if(d%s.length >= 0)", prop)("m%s=d%s", prop, prop); + break; + case "string": + gen("m%s=String(d%s)", prop, prop); + break; + case "bool": + gen("m%s=Boolean(d%s)", prop, prop); + break; + } + } + return gen; + } + converter.fromObject = function fromObject(mtype) { + var fields = mtype.fieldsArray; + var gen = util.codegen(["d"], mtype.name + "$fromObject")("if(d instanceof this.ctor)")("return d"); + if (!fields.length) + return gen("return new this.ctor"); + gen("var m=new this.ctor"); + for (var i = 0; i < fields.length; ++i) { + var field = fields[i].resolve(), prop = util.safeProp(field.name); + if (field.map) { + gen("if(d%s){", prop)('if(typeof d%s!=="object")', prop)("throw TypeError(%j)", field.fullName + ": object expected")("m%s={}", prop)("for(var ks=Object.keys(d%s),i=0;i>>0,m%s.high>>>0).toNumber(%s):m%s", prop, prop, prop, prop, isUnsigned ? "true" : "", prop); + break; + case "bytes": + gen("d%s=o.bytes===String?util.base64.encode(m%s,0,m%s.length):o.bytes===Array?Array.prototype.slice.call(m%s):m%s", prop, prop, prop, prop, prop); + break; + default: + gen("d%s=m%s", prop, prop); + break; + } + } + return gen; + } + converter.toObject = function toObject(mtype) { + var fields = mtype.fieldsArray.slice().sort(util.compareFieldsById); + if (!fields.length) + return util.codegen()("return {}"); + var gen = util.codegen(["m", "o"], mtype.name + "$toObject")("if(!o)")("o={}")("var d={}"); + var repeatedFields = [], mapFields = [], normalFields = [], i = 0; + for (; i < fields.length; ++i) + if (!fields[i].partOf) + (fields[i].resolve().repeated ? repeatedFields : fields[i].map ? mapFields : normalFields).push(fields[i]); + if (repeatedFields.length) { + gen("if(o.arrays||o.defaults){"); + for (i = 0; i < repeatedFields.length; ++i) + gen("d%s=[]", util.safeProp(repeatedFields[i].name)); + gen("}"); + } + if (mapFields.length) { + gen("if(o.objects||o.defaults){"); + for (i = 0; i < mapFields.length; ++i) + gen("d%s={}", util.safeProp(mapFields[i].name)); + gen("}"); + } + if (normalFields.length) { + gen("if(o.defaults){"); + for (i = 0; i < normalFields.length; ++i) { + var field = normalFields[i], prop = util.safeProp(field.name); + if (field.resolvedType instanceof Enum) + gen("d%s=o.enums===String?%j:%j", prop, field.resolvedType.valuesById[field.typeDefault], field.typeDefault); + else if (field.long) + gen("if(util.Long){")("var n=new util.Long(%i,%i,%j)", field.typeDefault.low, field.typeDefault.high, field.typeDefault.unsigned)("d%s=o.longs===String?n.toString():o.longs===Number?n.toNumber():n", prop)("}else")("d%s=o.longs===String?%j:%i", prop, field.typeDefault.toString(), field.typeDefault.toNumber()); + else if (field.bytes) { + var arrayDefault = "[" + Array.prototype.slice.call(field.typeDefault).join(",") + "]"; + gen("if(o.bytes===String)d%s=%j", prop, String.fromCharCode.apply(String, field.typeDefault))("else{")("d%s=%s", prop, arrayDefault)("if(o.bytes!==Array)d%s=util.newBuffer(d%s)", prop, prop)("}"); + } else + gen("d%s=%j", prop, field.typeDefault); + } + gen("}"); + } + var hasKs2 = false; + for (i = 0; i < fields.length; ++i) { + var field = fields[i], index = mtype._fieldsArray.indexOf(field), prop = util.safeProp(field.name); + if (field.map) { + if (!hasKs2) { + hasKs2 = true; + gen("var ks2"); + } + gen("if(m%s&&(ks2=Object.keys(m%s)).length){", prop, prop)("d%s={}", prop)("for(var j=0;j} + * @readonly + */ + fieldsById: { + get: function() { + if (this._fieldsById) + return this._fieldsById; + this._fieldsById = {}; + for (var names = Object.keys(this.fields), i = 0; i < names.length; ++i) { + var field = this.fields[names[i]], id = field.id; + if (this._fieldsById[id]) + throw Error("duplicate id " + id + " in " + this); + this._fieldsById[id] = field; + } + return this._fieldsById; + } + }, + /** + * Fields of this message as an array for iteration. + * @name Type#fieldsArray + * @type {Field[]} + * @readonly + */ + fieldsArray: { + get: function() { + return this._fieldsArray || (this._fieldsArray = util.toArray(this.fields)); + } + }, + /** + * Oneofs of this message as an array for iteration. + * @name Type#oneofsArray + * @type {OneOf[]} + * @readonly + */ + oneofsArray: { + get: function() { + return this._oneofsArray || (this._oneofsArray = util.toArray(this.oneofs)); + } + }, + /** + * The registered constructor, if any registered, otherwise a generic constructor. + * Assigning a function replaces the internal constructor. If the function does not extend {@link Message} yet, its prototype will be setup accordingly and static methods will be populated. If it already extends {@link Message}, it will just replace the internal constructor. + * @name Type#ctor + * @type {Constructor<{}>} + */ + ctor: { + get: function() { + return this._ctor || (this.ctor = Type.generateConstructor(this)()); + }, + set: function(ctor) { + var prototype = ctor.prototype; + if (!(prototype instanceof Message)) { + (ctor.prototype = new Message()).constructor = ctor; + util.merge(ctor.prototype, prototype); + } + ctor.$type = ctor.prototype.$type = this; + util.merge(ctor, Message, true); + this._ctor = ctor; + var i = 0; + for (; i < /* initializes */ + this.fieldsArray.length; ++i) + this._fieldsArray[i].resolve(); + var ctorProperties = {}; + for (i = 0; i < /* initializes */ + this.oneofsArray.length; ++i) + ctorProperties[this._oneofsArray[i].resolve().name] = { + get: util.oneOfGetter(this._oneofsArray[i].oneof), + set: util.oneOfSetter(this._oneofsArray[i].oneof) + }; + if (i) + Object.defineProperties(ctor.prototype, ctorProperties); + } + } + }); + Type.generateConstructor = function generateConstructor(mtype) { + var gen = util.codegen(["p"], mtype.name); + for (var i = 0, field; i < mtype.fieldsArray.length; ++i) + if ((field = mtype._fieldsArray[i]).map) + gen("this%s={}", util.safeProp(field.name)); + else if (field.repeated) + gen("this%s=[]", util.safeProp(field.name)); + return gen("if(p)for(var ks=Object.keys(p),i=0;i -1) { + var altname = filename2.substring(idx); + if (altname in common) + return altname; + } + return null; + } + function process2(filename2, source) { + try { + if (util.isString(source) && source.charAt(0) === "{") + source = JSON.parse(source); + if (!util.isString(source)) + self2.setOptions(source.options).addJSON(source.nested); + else { + parse.filename = filename2; + var parsed = parse(source, self2, options2), resolved2, i2 = 0; + if (parsed.imports) { + for (; i2 < parsed.imports.length; ++i2) + if (resolved2 = getBundledFileName(parsed.imports[i2]) || self2.resolvePath(filename2, parsed.imports[i2])) + fetch(resolved2); + } + if (parsed.weakImports) { + for (i2 = 0; i2 < parsed.weakImports.length; ++i2) + if (resolved2 = getBundledFileName(parsed.weakImports[i2]) || self2.resolvePath(filename2, parsed.weakImports[i2])) + fetch(resolved2, true); + } + } + } catch (err) { + finish(err); + } + if (!sync && !queued) + finish(null, self2); + } + function fetch(filename2, weak) { + filename2 = getBundledFileName(filename2) || filename2; + if (self2.files.indexOf(filename2) > -1) + return; + self2.files.push(filename2); + if (filename2 in common) { + if (sync) + process2(filename2, common[filename2]); + else { + ++queued; + setTimeout(function() { + --queued; + process2(filename2, common[filename2]); + }); + } + return; + } + if (sync) { + var source; + try { + source = util.fs.readFileSync(filename2).toString("utf8"); + } catch (err) { + if (!weak) + finish(err); + return; + } + process2(filename2, source); + } else { + ++queued; + self2.fetch(filename2, function(err, source2) { + --queued; + if (!callback) + return; + if (err) { + if (!weak) + finish(err); + else if (!queued) + finish(null, self2); + return; + } + process2(filename2, source2); + }); + } + } + var queued = 0; + if (util.isString(filename)) + filename = [filename]; + for (var i = 0, resolved; i < filename.length; ++i) + if (resolved = self2.resolvePath("", filename[i])) + fetch(resolved); + if (sync) + return self2; + if (!queued) + finish(null, self2); + return void 0; + }; + Root.prototype.loadSync = function loadSync2(filename, options2) { + if (!util.isNode) + throw Error("not supported"); + return this.load(filename, options2, SYNC); + }; + Root.prototype.resolveAll = function resolveAll() { + if (this.deferred.length) + throw Error("unresolvable extensions: " + this.deferred.map(function(field) { + return "'extend " + field.extend + "' in " + field.parent.fullName; + }).join(", ")); + return Namespace.prototype.resolveAll.call(this); + }; + var exposeRe = /^[A-Z]/; + function tryHandleExtension(root, field) { + var extendedType = field.parent.lookup(field.extend); + if (extendedType) { + var sisterField = new Field(field.fullName, field.id, field.type, field.rule, void 0, field.options); + if (extendedType.get(sisterField.name)) { + return true; + } + sisterField.declaringField = field; + field.extensionField = sisterField; + extendedType.add(sisterField); + return true; + } + return false; + } + Root.prototype._handleAdd = function _handleAdd(object) { + if (object instanceof Field) { + if ( + /* an extension field (implies not part of a oneof) */ + object.extend !== void 0 && /* not already handled */ + !object.extensionField + ) { + if (!tryHandleExtension(this, object)) + this.deferred.push(object); + } + } else if (object instanceof Enum) { + if (exposeRe.test(object.name)) + object.parent[object.name] = object.values; + } else if (!(object instanceof OneOf)) { + if (object instanceof Type) + for (var i = 0; i < this.deferred.length; ) + if (tryHandleExtension(this, this.deferred[i])) + this.deferred.splice(i, 1); + else + ++i; + for (var j2 = 0; j2 < /* initializes */ + object.nestedArray.length; ++j2) + this._handleAdd(object._nestedArray[j2]); + if (exposeRe.test(object.name)) + object.parent[object.name] = object; + } + }; + Root.prototype._handleRemove = function _handleRemove(object) { + if (object instanceof Field) { + if ( + /* an extension field */ + object.extend !== void 0 + ) { + if ( + /* already handled */ + object.extensionField + ) { + object.extensionField.parent.remove(object.extensionField); + object.extensionField = null; + } else { + var index = this.deferred.indexOf(object); + if (index > -1) + this.deferred.splice(index, 1); + } + } + } else if (object instanceof Enum) { + if (exposeRe.test(object.name)) + delete object.parent[object.name]; + } else if (object instanceof Namespace) { + for (var i = 0; i < /* initializes */ + object.nestedArray.length; ++i) + this._handleRemove(object._nestedArray[i]); + if (exposeRe.test(object.name)) + delete object.parent[object.name]; + } + }; + Root._configure = function(Type_, parse_, common_) { + Type = Type_; + parse = parse_; + common = common_; + }; + } +}); + +// node_modules/protobufjs/src/util.js +var require_util = __commonJS({ + "node_modules/protobufjs/src/util.js"(exports2, module2) { + "use strict"; + var util = module2.exports = require_minimal(); + var roots = require_roots(); + var Type; + var Enum; + util.codegen = require_codegen(); + util.fetch = require_fetch(); + util.path = require_path(); + util.fs = util.inquire("fs"); + util.toArray = function toArray(object) { + if (object) { + var keys = Object.keys(object), array = new Array(keys.length), index = 0; + while (index < keys.length) + array[index] = object[keys[index++]]; + return array; + } + return []; + }; + util.toObject = function toObject(array) { + var object = {}, index = 0; + while (index < array.length) { + var key = array[index++], val = array[index++]; + if (val !== void 0) + object[key] = val; + } + return object; + }; + var safePropBackslashRe = /\\/g; + var safePropQuoteRe = /"/g; + util.isReserved = function isReserved(name) { + return /^(?:do|if|in|for|let|new|try|var|case|else|enum|eval|false|null|this|true|void|with|break|catch|class|const|super|throw|while|yield|delete|export|import|public|return|static|switch|typeof|default|extends|finally|package|private|continue|debugger|function|arguments|interface|protected|implements|instanceof)$/.test(name); + }; + util.safeProp = function safeProp(prop) { + if (!/^[$\w_]+$/.test(prop) || util.isReserved(prop)) + return '["' + prop.replace(safePropBackslashRe, "\\\\").replace(safePropQuoteRe, '\\"') + '"]'; + return "." + prop; + }; + util.ucFirst = function ucFirst(str) { + return str.charAt(0).toUpperCase() + str.substring(1); + }; + var camelCaseRe = /_([a-z])/g; + util.camelCase = function camelCase(str) { + return str.substring(0, 1) + str.substring(1).replace(camelCaseRe, function($0, $1) { + return $1.toUpperCase(); + }); + }; + util.compareFieldsById = function compareFieldsById(a, b) { + return a.id - b.id; + }; + util.decorateType = function decorateType(ctor, typeName) { + if (ctor.$type) { + if (typeName && ctor.$type.name !== typeName) { + util.decorateRoot.remove(ctor.$type); + ctor.$type.name = typeName; + util.decorateRoot.add(ctor.$type); + } + return ctor.$type; + } + if (!Type) + Type = require_type(); + var type = new Type(typeName || ctor.name); + util.decorateRoot.add(type); + type.ctor = ctor; + Object.defineProperty(ctor, "$type", { value: type, enumerable: false }); + Object.defineProperty(ctor.prototype, "$type", { value: type, enumerable: false }); + return type; + }; + var decorateEnumIndex = 0; + util.decorateEnum = function decorateEnum(object) { + if (object.$type) + return object.$type; + if (!Enum) + Enum = require_enum(); + var enm = new Enum("Enum" + decorateEnumIndex++, object); + util.decorateRoot.add(enm); + Object.defineProperty(object, "$type", { value: enm, enumerable: false }); + return enm; + }; + util.setProperty = function setProperty(dst, path, value) { + function setProp(dst2, path2, value2) { + var part = path2.shift(); + if (part === "__proto__" || part === "prototype") { + return dst2; + } + if (path2.length > 0) { + dst2[part] = setProp(dst2[part] || {}, path2, value2); + } else { + var prevValue = dst2[part]; + if (prevValue) + value2 = [].concat(prevValue).concat(value2); + dst2[part] = value2; + } + return dst2; + } + if (typeof dst !== "object") + throw TypeError("dst must be an object"); + if (!path) + throw TypeError("path must be specified"); + path = path.split("."); + return setProp(dst, path, value); + }; + Object.defineProperty(util, "decorateRoot", { + get: function() { + return roots["decorated"] || (roots["decorated"] = new (require_root())()); + } + }); + } +}); + +// node_modules/protobufjs/src/object.js +var require_object = __commonJS({ + "node_modules/protobufjs/src/object.js"(exports2, module2) { + "use strict"; + module2.exports = ReflectionObject; + ReflectionObject.className = "ReflectionObject"; + var util = require_util(); + var Root; + function ReflectionObject(name, options2) { + if (!util.isString(name)) + throw TypeError("name must be a string"); + if (options2 && !util.isObject(options2)) + throw TypeError("options must be an object"); + this.options = options2; + this.parsedOptions = null; + this.name = name; + this.parent = null; + this.resolved = false; + this.comment = null; + this.filename = null; + } + Object.defineProperties(ReflectionObject.prototype, { + /** + * Reference to the root namespace. + * @name ReflectionObject#root + * @type {Root} + * @readonly + */ + root: { + get: function() { + var ptr = this; + while (ptr.parent !== null) + ptr = ptr.parent; + return ptr; + } + }, + /** + * Full name including leading dot. + * @name ReflectionObject#fullName + * @type {string} + * @readonly + */ + fullName: { + get: function() { + var path = [this.name], ptr = this.parent; + while (ptr) { + path.unshift(ptr.name); + ptr = ptr.parent; + } + return path.join("."); + } + } + }); + ReflectionObject.prototype.toJSON = /* istanbul ignore next */ + function toJSON() { + throw Error(); + }; + ReflectionObject.prototype.onAdd = function onAdd(parent) { + if (this.parent && this.parent !== parent) + this.parent.remove(this); + this.parent = parent; + this.resolved = false; + var root = parent.root; + if (root instanceof Root) + root._handleAdd(this); + }; + ReflectionObject.prototype.onRemove = function onRemove(parent) { + var root = parent.root; + if (root instanceof Root) + root._handleRemove(this); + this.parent = null; + this.resolved = false; + }; + ReflectionObject.prototype.resolve = function resolve() { + if (this.resolved) + return this; + if (this.root instanceof Root) + this.resolved = true; + return this; + }; + ReflectionObject.prototype.getOption = function getOption(name) { + if (this.options) + return this.options[name]; + return void 0; + }; + ReflectionObject.prototype.setOption = function setOption(name, value, ifNotSet) { + if (!ifNotSet || !this.options || this.options[name] === void 0) + (this.options || (this.options = {}))[name] = value; + return this; + }; + ReflectionObject.prototype.setParsedOption = function setParsedOption(name, value, propName) { + if (!this.parsedOptions) { + this.parsedOptions = []; + } + var parsedOptions = this.parsedOptions; + if (propName) { + var opt = parsedOptions.find(function(opt2) { + return Object.prototype.hasOwnProperty.call(opt2, name); + }); + if (opt) { + var newValue = opt[name]; + util.setProperty(newValue, propName, value); + } else { + opt = {}; + opt[name] = util.setProperty({}, propName, value); + parsedOptions.push(opt); + } + } else { + var newOpt = {}; + newOpt[name] = value; + parsedOptions.push(newOpt); + } + return this; + }; + ReflectionObject.prototype.setOptions = function setOptions(options2, ifNotSet) { + if (options2) + for (var keys = Object.keys(options2), i = 0; i < keys.length; ++i) + this.setOption(keys[i], options2[keys[i]], ifNotSet); + return this; + }; + ReflectionObject.prototype.toString = function toString() { + var className = this.constructor.className, fullName = this.fullName; + if (fullName.length) + return className + " " + fullName; + return className; + }; + ReflectionObject._configure = function(Root_) { + Root = Root_; + }; + } +}); + +// node_modules/protobufjs/src/enum.js +var require_enum = __commonJS({ + "node_modules/protobufjs/src/enum.js"(exports2, module2) { + "use strict"; + module2.exports = Enum; + var ReflectionObject = require_object(); + ((Enum.prototype = Object.create(ReflectionObject.prototype)).constructor = Enum).className = "Enum"; + var Namespace = require_namespace(); + var util = require_util(); + function Enum(name, values, options2, comment, comments, valuesOptions) { + ReflectionObject.call(this, name, options2); + if (values && typeof values !== "object") + throw TypeError("values must be an object"); + this.valuesById = {}; + this.values = Object.create(this.valuesById); + this.comment = comment; + this.comments = comments || {}; + this.valuesOptions = valuesOptions; + this.reserved = void 0; + if (values) { + for (var keys = Object.keys(values), i = 0; i < keys.length; ++i) + if (typeof values[keys[i]] === "number") + this.valuesById[this.values[keys[i]] = values[keys[i]]] = keys[i]; + } + } + Enum.fromJSON = function fromJSON(name, json) { + var enm = new Enum(name, json.values, json.options, json.comment, json.comments); + enm.reserved = json.reserved; + return enm; + }; + Enum.prototype.toJSON = function toJSON(toJSONOptions) { + var keepComments = toJSONOptions ? Boolean(toJSONOptions.keepComments) : false; + return util.toObject([ + "options", + this.options, + "valuesOptions", + this.valuesOptions, + "values", + this.values, + "reserved", + this.reserved && this.reserved.length ? this.reserved : void 0, + "comment", + keepComments ? this.comment : void 0, + "comments", + keepComments ? this.comments : void 0 + ]); + }; + Enum.prototype.add = function add(name, id, comment, options2) { + if (!util.isString(name)) + throw TypeError("name must be a string"); + if (!util.isInteger(id)) + throw TypeError("id must be an integer"); + if (this.values[name] !== void 0) + throw Error("duplicate name '" + name + "' in " + this); + if (this.isReservedId(id)) + throw Error("id " + id + " is reserved in " + this); + if (this.isReservedName(name)) + throw Error("name '" + name + "' is reserved in " + this); + if (this.valuesById[id] !== void 0) { + if (!(this.options && this.options.allow_alias)) + throw Error("duplicate id " + id + " in " + this); + this.values[name] = id; + } else + this.valuesById[this.values[name] = id] = name; + if (options2) { + if (this.valuesOptions === void 0) + this.valuesOptions = {}; + this.valuesOptions[name] = options2 || null; + } + this.comments[name] = comment || null; + return this; + }; + Enum.prototype.remove = function remove(name) { + if (!util.isString(name)) + throw TypeError("name must be a string"); + var val = this.values[name]; + if (val == null) + throw Error("name '" + name + "' does not exist in " + this); + delete this.valuesById[val]; + delete this.values[name]; + delete this.comments[name]; + if (this.valuesOptions) + delete this.valuesOptions[name]; + return this; + }; + Enum.prototype.isReservedId = function isReservedId(id) { + return Namespace.isReservedId(this.reserved, id); + }; + Enum.prototype.isReservedName = function isReservedName(name) { + return Namespace.isReservedName(this.reserved, name); + }; + } +}); + +// node_modules/protobufjs/src/encoder.js +var require_encoder = __commonJS({ + "node_modules/protobufjs/src/encoder.js"(exports2, module2) { + "use strict"; + module2.exports = encoder; + var Enum = require_enum(); + var types = require_types(); + var util = require_util(); + function genTypePartial(gen, field, fieldIndex, ref) { + return field.resolvedType.group ? gen("types[%i].encode(%s,w.uint32(%i)).uint32(%i)", fieldIndex, ref, (field.id << 3 | 3) >>> 0, (field.id << 3 | 4) >>> 0) : gen("types[%i].encode(%s,w.uint32(%i).fork()).ldelim()", fieldIndex, ref, (field.id << 3 | 2) >>> 0); + } + function encoder(mtype) { + var gen = util.codegen(["m", "w"], mtype.name + "$encode")("if(!w)")("w=Writer.create()"); + var i, ref; + var fields = ( + /* initializes */ + mtype.fieldsArray.slice().sort(util.compareFieldsById) + ); + for (var i = 0; i < fields.length; ++i) { + var field = fields[i].resolve(), index = mtype._fieldsArray.indexOf(field), type = field.resolvedType instanceof Enum ? "int32" : field.type, wireType = types.basic[type]; + ref = "m" + util.safeProp(field.name); + if (field.map) { + gen("if(%s!=null&&Object.hasOwnProperty.call(m,%j)){", ref, field.name)("for(var ks=Object.keys(%s),i=0;i>> 0, 8 | types.mapKey[field.keyType], field.keyType); + if (wireType === void 0) + gen("types[%i].encode(%s[ks[i]],w.uint32(18).fork()).ldelim().ldelim()", index, ref); + else + gen(".uint32(%i).%s(%s[ks[i]]).ldelim()", 16 | wireType, type, ref); + gen("}")("}"); + } else if (field.repeated) { + gen("if(%s!=null&&%s.length){", ref, ref); + if (field.packed && types.packed[type] !== void 0) { + gen("w.uint32(%i).fork()", (field.id << 3 | 2) >>> 0)("for(var i=0;i<%s.length;++i)", ref)("w.%s(%s[i])", type, ref)("w.ldelim()"); + } else { + gen("for(var i=0;i<%s.length;++i)", ref); + if (wireType === void 0) + genTypePartial(gen, field, index, ref + "[i]"); + else + gen("w.uint32(%i).%s(%s[i])", (field.id << 3 | wireType) >>> 0, type, ref); + } + gen("}"); + } else { + if (field.optional) + gen("if(%s!=null&&Object.hasOwnProperty.call(m,%j))", ref, field.name); + if (wireType === void 0) + genTypePartial(gen, field, index, ref); + else + gen("w.uint32(%i).%s(%s)", (field.id << 3 | wireType) >>> 0, type, ref); + } + } + return gen("return w"); + } + } +}); + +// node_modules/protobufjs/src/index-light.js +var require_index_light = __commonJS({ + "node_modules/protobufjs/src/index-light.js"(exports2, module2) { + "use strict"; + var protobuf = module2.exports = require_index_minimal(); + protobuf.build = "light"; + function load(filename, root, callback) { + if (typeof root === "function") { + callback = root; + root = new protobuf.Root(); + } else if (!root) + root = new protobuf.Root(); + return root.load(filename, callback); + } + protobuf.load = load; + function loadSync2(filename, root) { + if (!root) + root = new protobuf.Root(); + return root.loadSync(filename); + } + protobuf.loadSync = loadSync2; + protobuf.encoder = require_encoder(); + protobuf.decoder = require_decoder(); + protobuf.verifier = require_verifier(); + protobuf.converter = require_converter(); + protobuf.ReflectionObject = require_object(); + protobuf.Namespace = require_namespace(); + protobuf.Root = require_root(); + protobuf.Enum = require_enum(); + protobuf.Type = require_type(); + protobuf.Field = require_field(); + protobuf.OneOf = require_oneof(); + protobuf.MapField = require_mapfield(); + protobuf.Service = require_service2(); + protobuf.Method = require_method(); + protobuf.Message = require_message(); + protobuf.wrappers = require_wrappers(); + protobuf.types = require_types(); + protobuf.util = require_util(); + protobuf.ReflectionObject._configure(protobuf.Root); + protobuf.Namespace._configure(protobuf.Type, protobuf.Service, protobuf.Enum); + protobuf.Root._configure(protobuf.Type); + protobuf.Field._configure(protobuf.Type); + } +}); + +// node_modules/protobufjs/src/tokenize.js +var require_tokenize = __commonJS({ + "node_modules/protobufjs/src/tokenize.js"(exports2, module2) { + "use strict"; + module2.exports = tokenize; + var delimRe = /[\s{}=;:[\],'"()<>]/g; + var stringDoubleRe = /(?:"([^"\\]*(?:\\.[^"\\]*)*)")/g; + var stringSingleRe = /(?:'([^'\\]*(?:\\.[^'\\]*)*)')/g; + var setCommentRe = /^ *[*/]+ */; + var setCommentAltRe = /^\s*\*?\/*/; + var setCommentSplitRe = /\n/g; + var whitespaceRe = /\s/; + var unescapeRe = /\\(.?)/g; + var unescapeMap = { + "0": "\0", + "r": "\r", + "n": "\n", + "t": " " + }; + function unescape2(str) { + return str.replace(unescapeRe, function($0, $1) { + switch ($1) { + case "\\": + case "": + return $1; + default: + return unescapeMap[$1] || ""; + } + }); + } + tokenize.unescape = unescape2; + function tokenize(source, alternateCommentMode) { + source = source.toString(); + var offset = 0, length = source.length, line = 1, lastCommentLine = 0, comments = {}; + var stack = []; + var stringDelim = null; + function illegal(subject) { + return Error("illegal " + subject + " (line " + line + ")"); + } + function readString() { + var re2 = stringDelim === "'" ? stringSingleRe : stringDoubleRe; + re2.lastIndex = offset - 1; + var match = re2.exec(source); + if (!match) + throw illegal("string"); + offset = re2.lastIndex; + push(stringDelim); + stringDelim = null; + return unescape2(match[1]); + } + function charAt(pos) { + return source.charAt(pos); + } + function setComment(start, end, isLeading) { + var comment = { + type: source.charAt(start++), + lineEmpty: false, + leading: isLeading + }; + var lookback; + if (alternateCommentMode) { + lookback = 2; + } else { + lookback = 3; + } + var commentOffset = start - lookback, c; + do { + if (--commentOffset < 0 || (c = source.charAt(commentOffset)) === "\n") { + comment.lineEmpty = true; + break; + } + } while (c === " " || c === " "); + var lines = source.substring(start, end).split(setCommentSplitRe); + for (var i = 0; i < lines.length; ++i) + lines[i] = lines[i].replace(alternateCommentMode ? setCommentAltRe : setCommentRe, "").trim(); + comment.text = lines.join("\n").trim(); + comments[line] = comment; + lastCommentLine = line; + } + function isDoubleSlashCommentLine(startOffset) { + var endOffset = findEndOfLine(startOffset); + var lineText = source.substring(startOffset, endOffset); + var isComment = /^\s*\/{1,2}/.test(lineText); + return isComment; + } + function findEndOfLine(cursor) { + var endOffset = cursor; + while (endOffset < length && charAt(endOffset) !== "\n") { + endOffset++; + } + return endOffset; + } + function next() { + if (stack.length > 0) + return stack.shift(); + if (stringDelim) + return readString(); + var repeat, prev, curr, start, isDoc, isLeadingComment = offset === 0; + do { + if (offset === length) + return null; + repeat = false; + while (whitespaceRe.test(curr = charAt(offset))) { + if (curr === "\n") { + isLeadingComment = true; + ++line; + } + if (++offset === length) + return null; + } + if (charAt(offset) === "/") { + if (++offset === length) { + throw illegal("comment"); + } + if (charAt(offset) === "/") { + if (!alternateCommentMode) { + isDoc = charAt(start = offset + 1) === "/"; + while (charAt(++offset) !== "\n") { + if (offset === length) { + return null; + } + } + ++offset; + if (isDoc) { + setComment(start, offset - 1, isLeadingComment); + isLeadingComment = true; + } + ++line; + repeat = true; + } else { + start = offset; + isDoc = false; + if (isDoubleSlashCommentLine(offset)) { + isDoc = true; + do { + offset = findEndOfLine(offset); + if (offset === length) { + break; + } + offset++; + if (!isLeadingComment) { + break; + } + } while (isDoubleSlashCommentLine(offset)); + } else { + offset = Math.min(length, findEndOfLine(offset) + 1); + } + if (isDoc) { + setComment(start, offset, isLeadingComment); + isLeadingComment = true; + } + line++; + repeat = true; + } + } else if ((curr = charAt(offset)) === "*") { + start = offset + 1; + isDoc = alternateCommentMode || charAt(start) === "*"; + do { + if (curr === "\n") { + ++line; + } + if (++offset === length) { + throw illegal("comment"); + } + prev = curr; + curr = charAt(offset); + } while (prev !== "*" || curr !== "/"); + ++offset; + if (isDoc) { + setComment(start, offset - 2, isLeadingComment); + isLeadingComment = true; + } + repeat = true; + } else { + return "/"; + } + } + } while (repeat); + var end = offset; + delimRe.lastIndex = 0; + var delim = delimRe.test(charAt(end++)); + if (!delim) + while (end < length && !delimRe.test(charAt(end))) + ++end; + var token = source.substring(offset, offset = end); + if (token === '"' || token === "'") + stringDelim = token; + return token; + } + function push(token) { + stack.push(token); + } + function peek() { + if (!stack.length) { + var token = next(); + if (token === null) + return null; + push(token); + } + return stack[0]; + } + function skip(expected, optional) { + var actual = peek(), equals = actual === expected; + if (equals) { + next(); + return true; + } + if (!optional) + throw illegal("token '" + actual + "', '" + expected + "' expected"); + return false; + } + function cmnt(trailingLine) { + var ret = null; + var comment; + if (trailingLine === void 0) { + comment = comments[line - 1]; + delete comments[line - 1]; + if (comment && (alternateCommentMode || comment.type === "*" || comment.lineEmpty)) { + ret = comment.leading ? comment.text : null; + } + } else { + if (lastCommentLine < trailingLine) { + peek(); + } + comment = comments[trailingLine]; + delete comments[trailingLine]; + if (comment && !comment.lineEmpty && (alternateCommentMode || comment.type === "/")) { + ret = comment.leading ? null : comment.text; + } + } + return ret; + } + return Object.defineProperty({ + next, + peek, + push, + skip, + cmnt + }, "line", { + get: function() { + return line; + } + }); + } + } +}); + +// node_modules/protobufjs/src/parse.js +var require_parse = __commonJS({ + "node_modules/protobufjs/src/parse.js"(exports2, module2) { + "use strict"; + module2.exports = parse; + parse.filename = null; + parse.defaults = { keepCase: false }; + var tokenize = require_tokenize(); + var Root = require_root(); + var Type = require_type(); + var Field = require_field(); + var MapField = require_mapfield(); + var OneOf = require_oneof(); + var Enum = require_enum(); + var Service = require_service2(); + var Method = require_method(); + var types = require_types(); + var util = require_util(); + var base10Re = /^[1-9][0-9]*$/; + var base10NegRe = /^-?[1-9][0-9]*$/; + var base16Re = /^0[x][0-9a-fA-F]+$/; + var base16NegRe = /^-?0[x][0-9a-fA-F]+$/; + var base8Re = /^0[0-7]+$/; + var base8NegRe = /^-?0[0-7]+$/; + var numberRe = /^(?![eE])[0-9]*(?:\.[0-9]*)?(?:[eE][+-]?[0-9]+)?$/; + var nameRe = /^[a-zA-Z_][a-zA-Z_0-9]*$/; + var typeRefRe = /^(?:\.?[a-zA-Z_][a-zA-Z_0-9]*)(?:\.[a-zA-Z_][a-zA-Z_0-9]*)*$/; + var fqTypeRefRe = /^(?:\.[a-zA-Z_][a-zA-Z_0-9]*)+$/; + function parse(source, root, options2) { + if (!(root instanceof Root)) { + options2 = root; + root = new Root(); + } + if (!options2) + options2 = parse.defaults; + var preferTrailingComment = options2.preferTrailingComment || false; + var tn2 = tokenize(source, options2.alternateCommentMode || false), next = tn2.next, push = tn2.push, peek = tn2.peek, skip = tn2.skip, cmnt = tn2.cmnt; + var head = true, pkg, imports, weakImports, syntax, isProto3 = false; + var ptr = root; + var applyCase = options2.keepCase ? function(name) { + return name; + } : util.camelCase; + function illegal(token2, name, insideTryCatch) { + var filename = parse.filename; + if (!insideTryCatch) + parse.filename = null; + return Error("illegal " + (name || "token") + " '" + token2 + "' (" + (filename ? filename + ", " : "") + "line " + tn2.line + ")"); + } + function readString() { + var values = [], token2; + do { + if ((token2 = next()) !== '"' && token2 !== "'") + throw illegal(token2); + values.push(next()); + skip(token2); + token2 = peek(); + } while (token2 === '"' || token2 === "'"); + return values.join(""); + } + function readValue(acceptTypeRef) { + var token2 = next(); + switch (token2) { + case "'": + case '"': + push(token2); + return readString(); + case "true": + case "TRUE": + return true; + case "false": + case "FALSE": + return false; + } + try { + return parseNumber( + token2, + /* insideTryCatch */ + true + ); + } catch (e) { + if (acceptTypeRef && typeRefRe.test(token2)) + return token2; + throw illegal(token2, "value"); + } + } + function readRanges(target, acceptStrings) { + var token2, start; + do { + if (acceptStrings && ((token2 = peek()) === '"' || token2 === "'")) + target.push(readString()); + else + target.push([start = parseId(next()), skip("to", true) ? parseId(next()) : start]); + } while (skip(",", true)); + skip(";"); + } + function parseNumber(token2, insideTryCatch) { + var sign = 1; + if (token2.charAt(0) === "-") { + sign = -1; + token2 = token2.substring(1); + } + switch (token2) { + case "inf": + case "INF": + case "Inf": + return sign * Infinity; + case "nan": + case "NAN": + case "Nan": + case "NaN": + return NaN; + case "0": + return 0; + } + if (base10Re.test(token2)) + return sign * parseInt(token2, 10); + if (base16Re.test(token2)) + return sign * parseInt(token2, 16); + if (base8Re.test(token2)) + return sign * parseInt(token2, 8); + if (numberRe.test(token2)) + return sign * parseFloat(token2); + throw illegal(token2, "number", insideTryCatch); + } + function parseId(token2, acceptNegative) { + switch (token2) { + case "max": + case "MAX": + case "Max": + return 536870911; + case "0": + return 0; + } + if (!acceptNegative && token2.charAt(0) === "-") + throw illegal(token2, "id"); + if (base10NegRe.test(token2)) + return parseInt(token2, 10); + if (base16NegRe.test(token2)) + return parseInt(token2, 16); + if (base8NegRe.test(token2)) + return parseInt(token2, 8); + throw illegal(token2, "id"); + } + function parsePackage() { + if (pkg !== void 0) + throw illegal("package"); + pkg = next(); + if (!typeRefRe.test(pkg)) + throw illegal(pkg, "name"); + ptr = ptr.define(pkg); + skip(";"); + } + function parseImport() { + var token2 = peek(); + var whichImports; + switch (token2) { + case "weak": + whichImports = weakImports || (weakImports = []); + next(); + break; + case "public": + next(); + default: + whichImports = imports || (imports = []); + break; + } + token2 = readString(); + skip(";"); + whichImports.push(token2); + } + function parseSyntax() { + skip("="); + syntax = readString(); + isProto3 = syntax === "proto3"; + if (!isProto3 && syntax !== "proto2") + throw illegal(syntax, "syntax"); + skip(";"); + } + function parseCommon(parent, token2) { + switch (token2) { + case "option": + parseOption(parent, token2); + skip(";"); + return true; + case "message": + parseType(parent, token2); + return true; + case "enum": + parseEnum(parent, token2); + return true; + case "service": + parseService(parent, token2); + return true; + case "extend": + parseExtension(parent, token2); + return true; + } + return false; + } + function ifBlock(obj, fnIf, fnElse) { + var trailingLine = tn2.line; + if (obj) { + if (typeof obj.comment !== "string") { + obj.comment = cmnt(); + } + obj.filename = parse.filename; + } + if (skip("{", true)) { + var token2; + while ((token2 = next()) !== "}") + fnIf(token2); + skip(";", true); + } else { + if (fnElse) + fnElse(); + skip(";"); + if (obj && (typeof obj.comment !== "string" || preferTrailingComment)) + obj.comment = cmnt(trailingLine) || obj.comment; + } + } + function parseType(parent, token2) { + if (!nameRe.test(token2 = next())) + throw illegal(token2, "type name"); + var type = new Type(token2); + ifBlock(type, function parseType_block(token3) { + if (parseCommon(type, token3)) + return; + switch (token3) { + case "map": + parseMapField(type, token3); + break; + case "required": + case "repeated": + parseField(type, token3); + break; + case "optional": + if (isProto3) { + parseField(type, "proto3_optional"); + } else { + parseField(type, "optional"); + } + break; + case "oneof": + parseOneOf(type, token3); + break; + case "extensions": + readRanges(type.extensions || (type.extensions = [])); + break; + case "reserved": + readRanges(type.reserved || (type.reserved = []), true); + break; + default: + if (!isProto3 || !typeRefRe.test(token3)) + throw illegal(token3); + push(token3); + parseField(type, "optional"); + break; + } + }); + parent.add(type); + } + function parseField(parent, rule, extend) { + var type = next(); + if (type === "group") { + parseGroup(parent, rule); + return; + } + while (type.endsWith(".") || peek().startsWith(".")) { + type += next(); + } + if (!typeRefRe.test(type)) + throw illegal(type, "type"); + var name = next(); + if (!nameRe.test(name)) + throw illegal(name, "name"); + name = applyCase(name); + skip("="); + var field = new Field(name, parseId(next()), type, rule, extend); + ifBlock(field, function parseField_block(token2) { + if (token2 === "option") { + parseOption(field, token2); + skip(";"); + } else + throw illegal(token2); + }, function parseField_line() { + parseInlineOptions(field); + }); + if (rule === "proto3_optional") { + var oneof = new OneOf("_" + name); + field.setOption("proto3_optional", true); + oneof.add(field); + parent.add(oneof); + } else { + parent.add(field); + } + if (!isProto3 && field.repeated && (types.packed[type] !== void 0 || types.basic[type] === void 0)) + field.setOption( + "packed", + false, + /* ifNotSet */ + true + ); + } + function parseGroup(parent, rule) { + var name = next(); + if (!nameRe.test(name)) + throw illegal(name, "name"); + var fieldName = util.lcFirst(name); + if (name === fieldName) + name = util.ucFirst(name); + skip("="); + var id = parseId(next()); + var type = new Type(name); + type.group = true; + var field = new Field(fieldName, id, name, rule); + field.filename = parse.filename; + ifBlock(type, function parseGroup_block(token2) { + switch (token2) { + case "option": + parseOption(type, token2); + skip(";"); + break; + case "required": + case "repeated": + parseField(type, token2); + break; + case "optional": + if (isProto3) { + parseField(type, "proto3_optional"); + } else { + parseField(type, "optional"); + } + break; + case "message": + parseType(type, token2); + break; + case "enum": + parseEnum(type, token2); + break; + default: + throw illegal(token2); + } + }); + parent.add(type).add(field); + } + function parseMapField(parent) { + skip("<"); + var keyType = next(); + if (types.mapKey[keyType] === void 0) + throw illegal(keyType, "type"); + skip(","); + var valueType = next(); + if (!typeRefRe.test(valueType)) + throw illegal(valueType, "type"); + skip(">"); + var name = next(); + if (!nameRe.test(name)) + throw illegal(name, "name"); + skip("="); + var field = new MapField(applyCase(name), parseId(next()), keyType, valueType); + ifBlock(field, function parseMapField_block(token2) { + if (token2 === "option") { + parseOption(field, token2); + skip(";"); + } else + throw illegal(token2); + }, function parseMapField_line() { + parseInlineOptions(field); + }); + parent.add(field); + } + function parseOneOf(parent, token2) { + if (!nameRe.test(token2 = next())) + throw illegal(token2, "name"); + var oneof = new OneOf(applyCase(token2)); + ifBlock(oneof, function parseOneOf_block(token3) { + if (token3 === "option") { + parseOption(oneof, token3); + skip(";"); + } else { + push(token3); + parseField(oneof, "optional"); + } + }); + parent.add(oneof); + } + function parseEnum(parent, token2) { + if (!nameRe.test(token2 = next())) + throw illegal(token2, "name"); + var enm = new Enum(token2); + ifBlock(enm, function parseEnum_block(token3) { + switch (token3) { + case "option": + parseOption(enm, token3); + skip(";"); + break; + case "reserved": + readRanges(enm.reserved || (enm.reserved = []), true); + break; + default: + parseEnumValue(enm, token3); + } + }); + parent.add(enm); + } + function parseEnumValue(parent, token2) { + if (!nameRe.test(token2)) + throw illegal(token2, "name"); + skip("="); + var value = parseId(next(), true), dummy = { + options: void 0 + }; + dummy.setOption = function(name, value2) { + if (this.options === void 0) + this.options = {}; + this.options[name] = value2; + }; + ifBlock(dummy, function parseEnumValue_block(token3) { + if (token3 === "option") { + parseOption(dummy, token3); + skip(";"); + } else + throw illegal(token3); + }, function parseEnumValue_line() { + parseInlineOptions(dummy); + }); + parent.add(token2, value, dummy.comment, dummy.options); + } + function parseOption(parent, token2) { + var isCustom = skip("(", true); + if (!typeRefRe.test(token2 = next())) + throw illegal(token2, "name"); + var name = token2; + var option = name; + var propName; + if (isCustom) { + skip(")"); + name = "(" + name + ")"; + option = name; + token2 = peek(); + if (fqTypeRefRe.test(token2)) { + propName = token2.slice(1); + name += token2; + next(); + } + } + skip("="); + var optionValue = parseOptionValue(parent, name); + setParsedOption(parent, option, optionValue, propName); + } + function parseOptionValue(parent, name) { + if (skip("{", true)) { + var objectResult = {}; + while (!skip("}", true)) { + if (!nameRe.test(token = next())) { + throw illegal(token, "name"); + } + var value; + var propName = token; + skip(":", true); + if (peek() === "{") + value = parseOptionValue(parent, name + "." + token); + else if (peek() === "[") { + value = []; + var lastValue; + if (skip("[", true)) { + do { + lastValue = readValue(true); + value.push(lastValue); + } while (skip(",", true)); + skip("]"); + if (typeof lastValue !== "undefined") { + setOption(parent, name + "." + token, lastValue); + } + } + } else { + value = readValue(true); + setOption(parent, name + "." + token, value); + } + var prevValue = objectResult[propName]; + if (prevValue) + value = [].concat(prevValue).concat(value); + objectResult[propName] = value; + skip(",", true); + skip(";", true); + } + return objectResult; + } + var simpleValue = readValue(true); + setOption(parent, name, simpleValue); + return simpleValue; + } + function setOption(parent, name, value) { + if (parent.setOption) + parent.setOption(name, value); + } + function setParsedOption(parent, name, value, propName) { + if (parent.setParsedOption) + parent.setParsedOption(name, value, propName); + } + function parseInlineOptions(parent) { + if (skip("[", true)) { + do { + parseOption(parent, "option"); + } while (skip(",", true)); + skip("]"); + } + return parent; + } + function parseService(parent, token2) { + if (!nameRe.test(token2 = next())) + throw illegal(token2, "service name"); + var service = new Service(token2); + ifBlock(service, function parseService_block(token3) { + if (parseCommon(service, token3)) + return; + if (token3 === "rpc") + parseMethod(service, token3); + else + throw illegal(token3); + }); + parent.add(service); + } + function parseMethod(parent, token2) { + var commentText = cmnt(); + var type = token2; + if (!nameRe.test(token2 = next())) + throw illegal(token2, "name"); + var name = token2, requestType, requestStream, responseType, responseStream; + skip("("); + if (skip("stream", true)) + requestStream = true; + if (!typeRefRe.test(token2 = next())) + throw illegal(token2); + requestType = token2; + skip(")"); + skip("returns"); + skip("("); + if (skip("stream", true)) + responseStream = true; + if (!typeRefRe.test(token2 = next())) + throw illegal(token2); + responseType = token2; + skip(")"); + var method = new Method(name, type, requestType, responseType, requestStream, responseStream); + method.comment = commentText; + ifBlock(method, function parseMethod_block(token3) { + if (token3 === "option") { + parseOption(method, token3); + skip(";"); + } else + throw illegal(token3); + }); + parent.add(method); + } + function parseExtension(parent, token2) { + if (!typeRefRe.test(token2 = next())) + throw illegal(token2, "reference"); + var reference = token2; + ifBlock(null, function parseExtension_block(token3) { + switch (token3) { + case "required": + case "repeated": + parseField(parent, token3, reference); + break; + case "optional": + if (isProto3) { + parseField(parent, "proto3_optional", reference); + } else { + parseField(parent, "optional", reference); + } + break; + default: + if (!isProto3 || !typeRefRe.test(token3)) + throw illegal(token3); + push(token3); + parseField(parent, "optional", reference); + break; + } + }); + } + var token; + while ((token = next()) !== null) { + switch (token) { + case "package": + if (!head) + throw illegal(token); + parsePackage(); + break; + case "import": + if (!head) + throw illegal(token); + parseImport(); + break; + case "syntax": + if (!head) + throw illegal(token); + parseSyntax(); + break; + case "option": + parseOption(ptr, token); + skip(";"); + break; + default: + if (parseCommon(ptr, token)) { + head = false; + continue; + } + throw illegal(token); + } + } + parse.filename = null; + return { + "package": pkg, + "imports": imports, + weakImports, + syntax, + root + }; + } + } +}); + +// node_modules/protobufjs/src/common.js +var require_common = __commonJS({ + "node_modules/protobufjs/src/common.js"(exports2, module2) { + "use strict"; + module2.exports = common; + var commonRe = /\/|\./; + function common(name, json) { + if (!commonRe.test(name)) { + name = "google/protobuf/" + name + ".proto"; + json = { nested: { google: { nested: { protobuf: { nested: json } } } } }; + } + common[name] = json; + } + common("any", { + /** + * Properties of a google.protobuf.Any message. + * @interface IAny + * @type {Object} + * @property {string} [typeUrl] + * @property {Uint8Array} [bytes] + * @memberof common + */ + Any: { + fields: { + type_url: { + type: "string", + id: 1 + }, + value: { + type: "bytes", + id: 2 + } + } + } + }); + var timeType; + common("duration", { + /** + * Properties of a google.protobuf.Duration message. + * @interface IDuration + * @type {Object} + * @property {number|Long} [seconds] + * @property {number} [nanos] + * @memberof common + */ + Duration: timeType = { + fields: { + seconds: { + type: "int64", + id: 1 + }, + nanos: { + type: "int32", + id: 2 + } + } + } + }); + common("timestamp", { + /** + * Properties of a google.protobuf.Timestamp message. + * @interface ITimestamp + * @type {Object} + * @property {number|Long} [seconds] + * @property {number} [nanos] + * @memberof common + */ + Timestamp: timeType + }); + common("empty", { + /** + * Properties of a google.protobuf.Empty message. + * @interface IEmpty + * @memberof common + */ + Empty: { + fields: {} + } + }); + common("struct", { + /** + * Properties of a google.protobuf.Struct message. + * @interface IStruct + * @type {Object} + * @property {Object.} [fields] + * @memberof common + */ + Struct: { + fields: { + fields: { + keyType: "string", + type: "Value", + id: 1 + } + } + }, + /** + * Properties of a google.protobuf.Value message. + * @interface IValue + * @type {Object} + * @property {string} [kind] + * @property {0} [nullValue] + * @property {number} [numberValue] + * @property {string} [stringValue] + * @property {boolean} [boolValue] + * @property {IStruct} [structValue] + * @property {IListValue} [listValue] + * @memberof common + */ + Value: { + oneofs: { + kind: { + oneof: [ + "nullValue", + "numberValue", + "stringValue", + "boolValue", + "structValue", + "listValue" + ] + } + }, + fields: { + nullValue: { + type: "NullValue", + id: 1 + }, + numberValue: { + type: "double", + id: 2 + }, + stringValue: { + type: "string", + id: 3 + }, + boolValue: { + type: "bool", + id: 4 + }, + structValue: { + type: "Struct", + id: 5 + }, + listValue: { + type: "ListValue", + id: 6 + } + } + }, + NullValue: { + values: { + NULL_VALUE: 0 + } + }, + /** + * Properties of a google.protobuf.ListValue message. + * @interface IListValue + * @type {Object} + * @property {Array.} [values] + * @memberof common + */ + ListValue: { + fields: { + values: { + rule: "repeated", + type: "Value", + id: 1 + } + } + } + }); + common("wrappers", { + /** + * Properties of a google.protobuf.DoubleValue message. + * @interface IDoubleValue + * @type {Object} + * @property {number} [value] + * @memberof common + */ + DoubleValue: { + fields: { + value: { + type: "double", + id: 1 + } + } + }, + /** + * Properties of a google.protobuf.FloatValue message. + * @interface IFloatValue + * @type {Object} + * @property {number} [value] + * @memberof common + */ + FloatValue: { + fields: { + value: { + type: "float", + id: 1 + } + } + }, + /** + * Properties of a google.protobuf.Int64Value message. + * @interface IInt64Value + * @type {Object} + * @property {number|Long} [value] + * @memberof common + */ + Int64Value: { + fields: { + value: { + type: "int64", + id: 1 + } + } + }, + /** + * Properties of a google.protobuf.UInt64Value message. + * @interface IUInt64Value + * @type {Object} + * @property {number|Long} [value] + * @memberof common + */ + UInt64Value: { + fields: { + value: { + type: "uint64", + id: 1 + } + } + }, + /** + * Properties of a google.protobuf.Int32Value message. + * @interface IInt32Value + * @type {Object} + * @property {number} [value] + * @memberof common + */ + Int32Value: { + fields: { + value: { + type: "int32", + id: 1 + } + } + }, + /** + * Properties of a google.protobuf.UInt32Value message. + * @interface IUInt32Value + * @type {Object} + * @property {number} [value] + * @memberof common + */ + UInt32Value: { + fields: { + value: { + type: "uint32", + id: 1 + } + } + }, + /** + * Properties of a google.protobuf.BoolValue message. + * @interface IBoolValue + * @type {Object} + * @property {boolean} [value] + * @memberof common + */ + BoolValue: { + fields: { + value: { + type: "bool", + id: 1 + } + } + }, + /** + * Properties of a google.protobuf.StringValue message. + * @interface IStringValue + * @type {Object} + * @property {string} [value] + * @memberof common + */ + StringValue: { + fields: { + value: { + type: "string", + id: 1 + } + } + }, + /** + * Properties of a google.protobuf.BytesValue message. + * @interface IBytesValue + * @type {Object} + * @property {Uint8Array} [value] + * @memberof common + */ + BytesValue: { + fields: { + value: { + type: "bytes", + id: 1 + } + } + } + }); + common("field_mask", { + /** + * Properties of a google.protobuf.FieldMask message. + * @interface IDoubleValue + * @type {Object} + * @property {number} [value] + * @memberof common + */ + FieldMask: { + fields: { + paths: { + rule: "repeated", + type: "string", + id: 1 + } + } + } + }); + common.get = function get(file) { + return common[file] || null; + }; + } +}); + +// node_modules/protobufjs/src/index.js +var require_src = __commonJS({ + "node_modules/protobufjs/src/index.js"(exports2, module2) { + "use strict"; + var protobuf = module2.exports = require_index_light(); + protobuf.build = "full"; + protobuf.tokenize = require_tokenize(); + protobuf.parse = require_parse(); + protobuf.common = require_common(); + protobuf.Root._configure(protobuf.Type, protobuf.parse, protobuf.common); + } +}); + +// node_modules/protobufjs/index.js +var require_protobufjs = __commonJS({ + "node_modules/protobufjs/index.js"(exports2, module2) { + "use strict"; + module2.exports = require_src(); + } +}); + +// node_modules/protobufjs/google/protobuf/descriptor.json +var require_descriptor = __commonJS({ + "node_modules/protobufjs/google/protobuf/descriptor.json"(exports2, module2) { + module2.exports = { + nested: { + google: { + nested: { + protobuf: { + nested: { + FileDescriptorSet: { + fields: { + file: { + rule: "repeated", + type: "FileDescriptorProto", + id: 1 + } + } + }, + FileDescriptorProto: { + fields: { + name: { + type: "string", + id: 1 + }, + package: { + type: "string", + id: 2 + }, + dependency: { + rule: "repeated", + type: "string", + id: 3 + }, + publicDependency: { + rule: "repeated", + type: "int32", + id: 10, + options: { + packed: false + } + }, + weakDependency: { + rule: "repeated", + type: "int32", + id: 11, + options: { + packed: false + } + }, + messageType: { + rule: "repeated", + type: "DescriptorProto", + id: 4 + }, + enumType: { + rule: "repeated", + type: "EnumDescriptorProto", + id: 5 + }, + service: { + rule: "repeated", + type: "ServiceDescriptorProto", + id: 6 + }, + extension: { + rule: "repeated", + type: "FieldDescriptorProto", + id: 7 + }, + options: { + type: "FileOptions", + id: 8 + }, + sourceCodeInfo: { + type: "SourceCodeInfo", + id: 9 + }, + syntax: { + type: "string", + id: 12 + } + } + }, + DescriptorProto: { + fields: { + name: { + type: "string", + id: 1 + }, + field: { + rule: "repeated", + type: "FieldDescriptorProto", + id: 2 + }, + extension: { + rule: "repeated", + type: "FieldDescriptorProto", + id: 6 + }, + nestedType: { + rule: "repeated", + type: "DescriptorProto", + id: 3 + }, + enumType: { + rule: "repeated", + type: "EnumDescriptorProto", + id: 4 + }, + extensionRange: { + rule: "repeated", + type: "ExtensionRange", + id: 5 + }, + oneofDecl: { + rule: "repeated", + type: "OneofDescriptorProto", + id: 8 + }, + options: { + type: "MessageOptions", + id: 7 + }, + reservedRange: { + rule: "repeated", + type: "ReservedRange", + id: 9 + }, + reservedName: { + rule: "repeated", + type: "string", + id: 10 + } + }, + nested: { + ExtensionRange: { + fields: { + start: { + type: "int32", + id: 1 + }, + end: { + type: "int32", + id: 2 + } + } + }, + ReservedRange: { + fields: { + start: { + type: "int32", + id: 1 + }, + end: { + type: "int32", + id: 2 + } + } + } + } + }, + FieldDescriptorProto: { + fields: { + name: { + type: "string", + id: 1 + }, + number: { + type: "int32", + id: 3 + }, + label: { + type: "Label", + id: 4 + }, + type: { + type: "Type", + id: 5 + }, + typeName: { + type: "string", + id: 6 + }, + extendee: { + type: "string", + id: 2 + }, + defaultValue: { + type: "string", + id: 7 + }, + oneofIndex: { + type: "int32", + id: 9 + }, + jsonName: { + type: "string", + id: 10 + }, + options: { + type: "FieldOptions", + id: 8 + } + }, + nested: { + Type: { + values: { + TYPE_DOUBLE: 1, + TYPE_FLOAT: 2, + TYPE_INT64: 3, + TYPE_UINT64: 4, + TYPE_INT32: 5, + TYPE_FIXED64: 6, + TYPE_FIXED32: 7, + TYPE_BOOL: 8, + TYPE_STRING: 9, + TYPE_GROUP: 10, + TYPE_MESSAGE: 11, + TYPE_BYTES: 12, + TYPE_UINT32: 13, + TYPE_ENUM: 14, + TYPE_SFIXED32: 15, + TYPE_SFIXED64: 16, + TYPE_SINT32: 17, + TYPE_SINT64: 18 + } + }, + Label: { + values: { + LABEL_OPTIONAL: 1, + LABEL_REQUIRED: 2, + LABEL_REPEATED: 3 + } + } + } + }, + OneofDescriptorProto: { + fields: { + name: { + type: "string", + id: 1 + }, + options: { + type: "OneofOptions", + id: 2 + } + } + }, + EnumDescriptorProto: { + fields: { + name: { + type: "string", + id: 1 + }, + value: { + rule: "repeated", + type: "EnumValueDescriptorProto", + id: 2 + }, + options: { + type: "EnumOptions", + id: 3 + } + } + }, + EnumValueDescriptorProto: { + fields: { + name: { + type: "string", + id: 1 + }, + number: { + type: "int32", + id: 2 + }, + options: { + type: "EnumValueOptions", + id: 3 + } + } + }, + ServiceDescriptorProto: { + fields: { + name: { + type: "string", + id: 1 + }, + method: { + rule: "repeated", + type: "MethodDescriptorProto", + id: 2 + }, + options: { + type: "ServiceOptions", + id: 3 + } + } + }, + MethodDescriptorProto: { + fields: { + name: { + type: "string", + id: 1 + }, + inputType: { + type: "string", + id: 2 + }, + outputType: { + type: "string", + id: 3 + }, + options: { + type: "MethodOptions", + id: 4 + }, + clientStreaming: { + type: "bool", + id: 5 + }, + serverStreaming: { + type: "bool", + id: 6 + } + } + }, + FileOptions: { + fields: { + javaPackage: { + type: "string", + id: 1 + }, + javaOuterClassname: { + type: "string", + id: 8 + }, + javaMultipleFiles: { + type: "bool", + id: 10 + }, + javaGenerateEqualsAndHash: { + type: "bool", + id: 20, + options: { + deprecated: true + } + }, + javaStringCheckUtf8: { + type: "bool", + id: 27 + }, + optimizeFor: { + type: "OptimizeMode", + id: 9, + options: { + default: "SPEED" + } + }, + goPackage: { + type: "string", + id: 11 + }, + ccGenericServices: { + type: "bool", + id: 16 + }, + javaGenericServices: { + type: "bool", + id: 17 + }, + pyGenericServices: { + type: "bool", + id: 18 + }, + deprecated: { + type: "bool", + id: 23 + }, + ccEnableArenas: { + type: "bool", + id: 31 + }, + objcClassPrefix: { + type: "string", + id: 36 + }, + csharpNamespace: { + type: "string", + id: 37 + }, + uninterpretedOption: { + rule: "repeated", + type: "UninterpretedOption", + id: 999 + } + }, + extensions: [ + [ + 1e3, + 536870911 + ] + ], + reserved: [ + [ + 38, + 38 + ] + ], + nested: { + OptimizeMode: { + values: { + SPEED: 1, + CODE_SIZE: 2, + LITE_RUNTIME: 3 + } + } + } + }, + MessageOptions: { + fields: { + messageSetWireFormat: { + type: "bool", + id: 1 + }, + noStandardDescriptorAccessor: { + type: "bool", + id: 2 + }, + deprecated: { + type: "bool", + id: 3 + }, + mapEntry: { + type: "bool", + id: 7 + }, + uninterpretedOption: { + rule: "repeated", + type: "UninterpretedOption", + id: 999 + } + }, + extensions: [ + [ + 1e3, + 536870911 + ] + ], + reserved: [ + [ + 8, + 8 + ] + ] + }, + FieldOptions: { + fields: { + ctype: { + type: "CType", + id: 1, + options: { + default: "STRING" + } + }, + packed: { + type: "bool", + id: 2 + }, + jstype: { + type: "JSType", + id: 6, + options: { + default: "JS_NORMAL" + } + }, + lazy: { + type: "bool", + id: 5 + }, + deprecated: { + type: "bool", + id: 3 + }, + weak: { + type: "bool", + id: 10 + }, + uninterpretedOption: { + rule: "repeated", + type: "UninterpretedOption", + id: 999 + } + }, + extensions: [ + [ + 1e3, + 536870911 + ] + ], + reserved: [ + [ + 4, + 4 + ] + ], + nested: { + CType: { + values: { + STRING: 0, + CORD: 1, + STRING_PIECE: 2 + } + }, + JSType: { + values: { + JS_NORMAL: 0, + JS_STRING: 1, + JS_NUMBER: 2 + } + } + } + }, + OneofOptions: { + fields: { + uninterpretedOption: { + rule: "repeated", + type: "UninterpretedOption", + id: 999 + } + }, + extensions: [ + [ + 1e3, + 536870911 + ] + ] + }, + EnumOptions: { + fields: { + allowAlias: { + type: "bool", + id: 2 + }, + deprecated: { + type: "bool", + id: 3 + }, + uninterpretedOption: { + rule: "repeated", + type: "UninterpretedOption", + id: 999 + } + }, + extensions: [ + [ + 1e3, + 536870911 + ] + ] + }, + EnumValueOptions: { + fields: { + deprecated: { + type: "bool", + id: 1 + }, + uninterpretedOption: { + rule: "repeated", + type: "UninterpretedOption", + id: 999 + } + }, + extensions: [ + [ + 1e3, + 536870911 + ] + ] + }, + ServiceOptions: { + fields: { + deprecated: { + type: "bool", + id: 33 + }, + uninterpretedOption: { + rule: "repeated", + type: "UninterpretedOption", + id: 999 + } + }, + extensions: [ + [ + 1e3, + 536870911 + ] + ] + }, + MethodOptions: { + fields: { + deprecated: { + type: "bool", + id: 33 + }, + uninterpretedOption: { + rule: "repeated", + type: "UninterpretedOption", + id: 999 + } + }, + extensions: [ + [ + 1e3, + 536870911 + ] + ] + }, + UninterpretedOption: { + fields: { + name: { + rule: "repeated", + type: "NamePart", + id: 2 + }, + identifierValue: { + type: "string", + id: 3 + }, + positiveIntValue: { + type: "uint64", + id: 4 + }, + negativeIntValue: { + type: "int64", + id: 5 + }, + doubleValue: { + type: "double", + id: 6 + }, + stringValue: { + type: "bytes", + id: 7 + }, + aggregateValue: { + type: "string", + id: 8 + } + }, + nested: { + NamePart: { + fields: { + namePart: { + rule: "required", + type: "string", + id: 1 + }, + isExtension: { + rule: "required", + type: "bool", + id: 2 + } + } + } + } + }, + SourceCodeInfo: { + fields: { + location: { + rule: "repeated", + type: "Location", + id: 1 + } + }, + nested: { + Location: { + fields: { + path: { + rule: "repeated", + type: "int32", + id: 1 + }, + span: { + rule: "repeated", + type: "int32", + id: 2 + }, + leadingComments: { + type: "string", + id: 3 + }, + trailingComments: { + type: "string", + id: 4 + }, + leadingDetachedComments: { + rule: "repeated", + type: "string", + id: 6 + } + } + } + } + }, + GeneratedCodeInfo: { + fields: { + annotation: { + rule: "repeated", + type: "Annotation", + id: 1 + } + }, + nested: { + Annotation: { + fields: { + path: { + rule: "repeated", + type: "int32", + id: 1 + }, + sourceFile: { + type: "string", + id: 2 + }, + begin: { + type: "int32", + id: 3 + }, + end: { + type: "int32", + id: 4 + } + } + } + } + } + } + } + } + } + } + }; + } +}); + +// node_modules/protobufjs/ext/descriptor/index.js +var require_descriptor2 = __commonJS({ + "node_modules/protobufjs/ext/descriptor/index.js"(exports2, module2) { + "use strict"; + var $protobuf = require_protobufjs(); + module2.exports = exports2 = $protobuf.descriptor = $protobuf.Root.fromJSON(require_descriptor()).lookup(".google.protobuf"); + var Namespace = $protobuf.Namespace; + var Root = $protobuf.Root; + var Enum = $protobuf.Enum; + var Type = $protobuf.Type; + var Field = $protobuf.Field; + var MapField = $protobuf.MapField; + var OneOf = $protobuf.OneOf; + var Service = $protobuf.Service; + var Method = $protobuf.Method; + Root.fromDescriptor = function fromDescriptor(descriptor) { + if (typeof descriptor.length === "number") + descriptor = exports2.FileDescriptorSet.decode(descriptor); + var root = new Root(); + if (descriptor.file) { + var fileDescriptor, filePackage; + for (var j2 = 0, i; j2 < descriptor.file.length; ++j2) { + filePackage = root; + if ((fileDescriptor = descriptor.file[j2])["package"] && fileDescriptor["package"].length) + filePackage = root.define(fileDescriptor["package"]); + if (fileDescriptor.name && fileDescriptor.name.length) + root.files.push(filePackage.filename = fileDescriptor.name); + if (fileDescriptor.messageType) + for (i = 0; i < fileDescriptor.messageType.length; ++i) + filePackage.add(Type.fromDescriptor(fileDescriptor.messageType[i], fileDescriptor.syntax)); + if (fileDescriptor.enumType) + for (i = 0; i < fileDescriptor.enumType.length; ++i) + filePackage.add(Enum.fromDescriptor(fileDescriptor.enumType[i])); + if (fileDescriptor.extension) + for (i = 0; i < fileDescriptor.extension.length; ++i) + filePackage.add(Field.fromDescriptor(fileDescriptor.extension[i])); + if (fileDescriptor.service) + for (i = 0; i < fileDescriptor.service.length; ++i) + filePackage.add(Service.fromDescriptor(fileDescriptor.service[i])); + var opts = fromDescriptorOptions(fileDescriptor.options, exports2.FileOptions); + if (opts) { + var ks2 = Object.keys(opts); + for (i = 0; i < ks2.length; ++i) + filePackage.setOption(ks2[i], opts[ks2[i]]); + } + } + } + return root; + }; + Root.prototype.toDescriptor = function toDescriptor(syntax) { + var set = exports2.FileDescriptorSet.create(); + Root_toDescriptorRecursive(this, set.file, syntax); + return set; + }; + function Root_toDescriptorRecursive(ns3, files, syntax) { + var file = exports2.FileDescriptorProto.create({ name: ns3.filename || (ns3.fullName.substring(1).replace(/\./g, "_") || "root") + ".proto" }); + if (syntax) + file.syntax = syntax; + if (!(ns3 instanceof Root)) + file["package"] = ns3.fullName.substring(1); + for (var i = 0, nested; i < ns3.nestedArray.length; ++i) + if ((nested = ns3._nestedArray[i]) instanceof Type) + file.messageType.push(nested.toDescriptor(syntax)); + else if (nested instanceof Enum) + file.enumType.push(nested.toDescriptor()); + else if (nested instanceof Field) + file.extension.push(nested.toDescriptor(syntax)); + else if (nested instanceof Service) + file.service.push(nested.toDescriptor()); + else if (nested instanceof /* plain */ + Namespace) + Root_toDescriptorRecursive(nested, files, syntax); + file.options = toDescriptorOptions(ns3.options, exports2.FileOptions); + if (file.messageType.length + file.enumType.length + file.extension.length + file.service.length) + files.push(file); + } + var unnamedMessageIndex = 0; + Type.fromDescriptor = function fromDescriptor(descriptor, syntax) { + if (typeof descriptor.length === "number") + descriptor = exports2.DescriptorProto.decode(descriptor); + var type = new Type(descriptor.name.length ? descriptor.name : "Type" + unnamedMessageIndex++, fromDescriptorOptions(descriptor.options, exports2.MessageOptions)), i; + if (descriptor.oneofDecl) + for (i = 0; i < descriptor.oneofDecl.length; ++i) + type.add(OneOf.fromDescriptor(descriptor.oneofDecl[i])); + if (descriptor.field) + for (i = 0; i < descriptor.field.length; ++i) { + var field = Field.fromDescriptor(descriptor.field[i], syntax); + type.add(field); + if (descriptor.field[i].hasOwnProperty("oneofIndex")) + type.oneofsArray[descriptor.field[i].oneofIndex].add(field); + } + if (descriptor.extension) + for (i = 0; i < descriptor.extension.length; ++i) + type.add(Field.fromDescriptor(descriptor.extension[i], syntax)); + if (descriptor.nestedType) + for (i = 0; i < descriptor.nestedType.length; ++i) { + type.add(Type.fromDescriptor(descriptor.nestedType[i], syntax)); + if (descriptor.nestedType[i].options && descriptor.nestedType[i].options.mapEntry) + type.setOption("map_entry", true); + } + if (descriptor.enumType) + for (i = 0; i < descriptor.enumType.length; ++i) + type.add(Enum.fromDescriptor(descriptor.enumType[i])); + if (descriptor.extensionRange && descriptor.extensionRange.length) { + type.extensions = []; + for (i = 0; i < descriptor.extensionRange.length; ++i) + type.extensions.push([descriptor.extensionRange[i].start, descriptor.extensionRange[i].end]); + } + if (descriptor.reservedRange && descriptor.reservedRange.length || descriptor.reservedName && descriptor.reservedName.length) { + type.reserved = []; + if (descriptor.reservedRange) + for (i = 0; i < descriptor.reservedRange.length; ++i) + type.reserved.push([descriptor.reservedRange[i].start, descriptor.reservedRange[i].end]); + if (descriptor.reservedName) + for (i = 0; i < descriptor.reservedName.length; ++i) + type.reserved.push(descriptor.reservedName[i]); + } + return type; + }; + Type.prototype.toDescriptor = function toDescriptor(syntax) { + var descriptor = exports2.DescriptorProto.create({ name: this.name }), i; + for (i = 0; i < this.fieldsArray.length; ++i) { + var fieldDescriptor; + descriptor.field.push(fieldDescriptor = this._fieldsArray[i].toDescriptor(syntax)); + if (this._fieldsArray[i] instanceof MapField) { + var keyType = toDescriptorType(this._fieldsArray[i].keyType, this._fieldsArray[i].resolvedKeyType), valueType = toDescriptorType(this._fieldsArray[i].type, this._fieldsArray[i].resolvedType), valueTypeName = valueType === /* type */ + 11 || valueType === /* enum */ + 14 ? this._fieldsArray[i].resolvedType && shortname(this.parent, this._fieldsArray[i].resolvedType) || this._fieldsArray[i].type : void 0; + descriptor.nestedType.push(exports2.DescriptorProto.create({ + name: fieldDescriptor.typeName, + field: [ + exports2.FieldDescriptorProto.create({ name: "key", number: 1, label: 1, type: keyType }), + // can't reference a type or enum + exports2.FieldDescriptorProto.create({ name: "value", number: 2, label: 1, type: valueType, typeName: valueTypeName }) + ], + options: exports2.MessageOptions.create({ mapEntry: true }) + })); + } + } + for (i = 0; i < this.oneofsArray.length; ++i) + descriptor.oneofDecl.push(this._oneofsArray[i].toDescriptor()); + for (i = 0; i < this.nestedArray.length; ++i) { + if (this._nestedArray[i] instanceof Field) + descriptor.field.push(this._nestedArray[i].toDescriptor(syntax)); + else if (this._nestedArray[i] instanceof Type) + descriptor.nestedType.push(this._nestedArray[i].toDescriptor(syntax)); + else if (this._nestedArray[i] instanceof Enum) + descriptor.enumType.push(this._nestedArray[i].toDescriptor()); + } + if (this.extensions) + for (i = 0; i < this.extensions.length; ++i) + descriptor.extensionRange.push(exports2.DescriptorProto.ExtensionRange.create({ start: this.extensions[i][0], end: this.extensions[i][1] })); + if (this.reserved) + for (i = 0; i < this.reserved.length; ++i) + if (typeof this.reserved[i] === "string") + descriptor.reservedName.push(this.reserved[i]); + else + descriptor.reservedRange.push(exports2.DescriptorProto.ReservedRange.create({ start: this.reserved[i][0], end: this.reserved[i][1] })); + descriptor.options = toDescriptorOptions(this.options, exports2.MessageOptions); + return descriptor; + }; + var numberRe = /^(?![eE])[0-9]*(?:\.[0-9]*)?(?:[eE][+-]?[0-9]+)?$/; + Field.fromDescriptor = function fromDescriptor(descriptor, syntax) { + if (typeof descriptor.length === "number") + descriptor = exports2.DescriptorProto.decode(descriptor); + if (typeof descriptor.number !== "number") + throw Error("missing field id"); + var fieldType; + if (descriptor.typeName && descriptor.typeName.length) + fieldType = descriptor.typeName; + else + fieldType = fromDescriptorType(descriptor.type); + var fieldRule; + switch (descriptor.label) { + case 1: + fieldRule = void 0; + break; + case 2: + fieldRule = "required"; + break; + case 3: + fieldRule = "repeated"; + break; + default: + throw Error("illegal label: " + descriptor.label); + } + var extendee = descriptor.extendee; + if (descriptor.extendee !== void 0) { + extendee = extendee.length ? extendee : void 0; + } + var field = new Field( + descriptor.name.length ? descriptor.name : "field" + descriptor.number, + descriptor.number, + fieldType, + fieldRule, + extendee + ); + field.options = fromDescriptorOptions(descriptor.options, exports2.FieldOptions); + if (descriptor.defaultValue && descriptor.defaultValue.length) { + var defaultValue = descriptor.defaultValue; + switch (defaultValue) { + case "true": + case "TRUE": + defaultValue = true; + break; + case "false": + case "FALSE": + defaultValue = false; + break; + default: + var match = numberRe.exec(defaultValue); + if (match) + defaultValue = parseInt(defaultValue); + break; + } + field.setOption("default", defaultValue); + } + if (packableDescriptorType(descriptor.type)) { + if (syntax === "proto3") { + if (descriptor.options && !descriptor.options.packed) + field.setOption("packed", false); + } else if (!(descriptor.options && descriptor.options.packed)) + field.setOption("packed", false); + } + return field; + }; + Field.prototype.toDescriptor = function toDescriptor(syntax) { + var descriptor = exports2.FieldDescriptorProto.create({ name: this.name, number: this.id }); + if (this.map) { + descriptor.type = 11; + descriptor.typeName = $protobuf.util.ucFirst(this.name); + descriptor.label = 3; + } else { + switch (descriptor.type = toDescriptorType(this.type, this.resolve().resolvedType)) { + case 10: + case 11: + case 14: + descriptor.typeName = this.resolvedType ? shortname(this.parent, this.resolvedType) : this.type; + break; + } + switch (this.rule) { + case "repeated": + descriptor.label = 3; + break; + case "required": + descriptor.label = 2; + break; + default: + descriptor.label = 1; + break; + } + } + descriptor.extendee = this.extensionField ? this.extensionField.parent.fullName : this.extend; + if (this.partOf) { + if ((descriptor.oneofIndex = this.parent.oneofsArray.indexOf(this.partOf)) < 0) + throw Error("missing oneof"); + } + if (this.options) { + descriptor.options = toDescriptorOptions(this.options, exports2.FieldOptions); + if (this.options["default"] != null) + descriptor.defaultValue = String(this.options["default"]); + } + if (syntax === "proto3") { + if (!this.packed) + (descriptor.options || (descriptor.options = exports2.FieldOptions.create())).packed = false; + } else if (this.packed) + (descriptor.options || (descriptor.options = exports2.FieldOptions.create())).packed = true; + return descriptor; + }; + var unnamedEnumIndex = 0; + Enum.fromDescriptor = function fromDescriptor(descriptor) { + if (typeof descriptor.length === "number") + descriptor = exports2.EnumDescriptorProto.decode(descriptor); + var values = {}; + if (descriptor.value) + for (var i = 0; i < descriptor.value.length; ++i) { + var name = descriptor.value[i].name, value = descriptor.value[i].number || 0; + values[name && name.length ? name : "NAME" + value] = value; + } + return new Enum( + descriptor.name && descriptor.name.length ? descriptor.name : "Enum" + unnamedEnumIndex++, + values, + fromDescriptorOptions(descriptor.options, exports2.EnumOptions) + ); + }; + Enum.prototype.toDescriptor = function toDescriptor() { + var values = []; + for (var i = 0, ks2 = Object.keys(this.values); i < ks2.length; ++i) + values.push(exports2.EnumValueDescriptorProto.create({ name: ks2[i], number: this.values[ks2[i]] })); + return exports2.EnumDescriptorProto.create({ + name: this.name, + value: values, + options: toDescriptorOptions(this.options, exports2.EnumOptions) + }); + }; + var unnamedOneofIndex = 0; + OneOf.fromDescriptor = function fromDescriptor(descriptor) { + if (typeof descriptor.length === "number") + descriptor = exports2.OneofDescriptorProto.decode(descriptor); + return new OneOf( + // unnamedOneOfIndex is global, not per type, because we have no ref to a type here + descriptor.name && descriptor.name.length ? descriptor.name : "oneof" + unnamedOneofIndex++ + // fromDescriptorOptions(descriptor.options, exports.OneofOptions) - only uninterpreted_option + ); + }; + OneOf.prototype.toDescriptor = function toDescriptor() { + return exports2.OneofDescriptorProto.create({ + name: this.name + // options: toDescriptorOptions(this.options, exports.OneofOptions) - only uninterpreted_option + }); + }; + var unnamedServiceIndex = 0; + Service.fromDescriptor = function fromDescriptor(descriptor) { + if (typeof descriptor.length === "number") + descriptor = exports2.ServiceDescriptorProto.decode(descriptor); + var service = new Service(descriptor.name && descriptor.name.length ? descriptor.name : "Service" + unnamedServiceIndex++, fromDescriptorOptions(descriptor.options, exports2.ServiceOptions)); + if (descriptor.method) + for (var i = 0; i < descriptor.method.length; ++i) + service.add(Method.fromDescriptor(descriptor.method[i])); + return service; + }; + Service.prototype.toDescriptor = function toDescriptor() { + var methods = []; + for (var i = 0; i < this.methodsArray.length; ++i) + methods.push(this._methodsArray[i].toDescriptor()); + return exports2.ServiceDescriptorProto.create({ + name: this.name, + method: methods, + options: toDescriptorOptions(this.options, exports2.ServiceOptions) + }); + }; + var unnamedMethodIndex = 0; + Method.fromDescriptor = function fromDescriptor(descriptor) { + if (typeof descriptor.length === "number") + descriptor = exports2.MethodDescriptorProto.decode(descriptor); + return new Method( + // unnamedMethodIndex is global, not per service, because we have no ref to a service here + descriptor.name && descriptor.name.length ? descriptor.name : "Method" + unnamedMethodIndex++, + "rpc", + descriptor.inputType, + descriptor.outputType, + Boolean(descriptor.clientStreaming), + Boolean(descriptor.serverStreaming), + fromDescriptorOptions(descriptor.options, exports2.MethodOptions) + ); + }; + Method.prototype.toDescriptor = function toDescriptor() { + return exports2.MethodDescriptorProto.create({ + name: this.name, + inputType: this.resolvedRequestType ? this.resolvedRequestType.fullName : this.requestType, + outputType: this.resolvedResponseType ? this.resolvedResponseType.fullName : this.responseType, + clientStreaming: this.requestStream, + serverStreaming: this.responseStream, + options: toDescriptorOptions(this.options, exports2.MethodOptions) + }); + }; + function fromDescriptorType(type) { + switch (type) { + case 1: + return "double"; + case 2: + return "float"; + case 3: + return "int64"; + case 4: + return "uint64"; + case 5: + return "int32"; + case 6: + return "fixed64"; + case 7: + return "fixed32"; + case 8: + return "bool"; + case 9: + return "string"; + case 12: + return "bytes"; + case 13: + return "uint32"; + case 15: + return "sfixed32"; + case 16: + return "sfixed64"; + case 17: + return "sint32"; + case 18: + return "sint64"; + } + throw Error("illegal type: " + type); + } + function packableDescriptorType(type) { + switch (type) { + case 1: + case 2: + case 3: + case 4: + case 5: + case 6: + case 7: + case 8: + case 13: + case 14: + case 15: + case 16: + case 17: + case 18: + return true; + } + return false; + } + function toDescriptorType(type, resolvedType) { + switch (type) { + case "double": + return 1; + case "float": + return 2; + case "int64": + return 3; + case "uint64": + return 4; + case "int32": + return 5; + case "fixed64": + return 6; + case "fixed32": + return 7; + case "bool": + return 8; + case "string": + return 9; + case "bytes": + return 12; + case "uint32": + return 13; + case "sfixed32": + return 15; + case "sfixed64": + return 16; + case "sint32": + return 17; + case "sint64": + return 18; + } + if (resolvedType instanceof Enum) + return 14; + if (resolvedType instanceof Type) + return resolvedType.group ? 10 : 11; + throw Error("illegal type: " + type); + } + function fromDescriptorOptions(options2, type) { + if (!options2) + return void 0; + var out = []; + for (var i = 0, field, key, val; i < type.fieldsArray.length; ++i) + if ((key = (field = type._fieldsArray[i]).name) !== "uninterpretedOption") { + if (options2.hasOwnProperty(key)) { + val = options2[key]; + if (field.resolvedType instanceof Enum && typeof val === "number" && field.resolvedType.valuesById[val] !== void 0) + val = field.resolvedType.valuesById[val]; + out.push(underScore(key), val); + } + } + return out.length ? $protobuf.util.toObject(out) : void 0; + } + function toDescriptorOptions(options2, type) { + if (!options2) + return void 0; + var out = []; + for (var i = 0, ks2 = Object.keys(options2), key, val; i < ks2.length; ++i) { + val = options2[key = ks2[i]]; + if (key === "default") + continue; + var field = type.fields[key]; + if (!field && !(field = type.fields[key = $protobuf.util.camelCase(key)])) + continue; + out.push(key, val); + } + return out.length ? type.fromObject($protobuf.util.toObject(out)) : void 0; + } + function shortname(from, to2) { + var fromPath = from.fullName.split("."), toPath = to2.fullName.split("."), i = 0, j2 = 0, k2 = toPath.length - 1; + if (!(from instanceof Root) && to2 instanceof Namespace) + while (i < fromPath.length && j2 < k2 && fromPath[i] === toPath[j2]) { + var other = to2.lookup(fromPath[i++], true); + if (other !== null && other !== to2) + break; + ++j2; + } + else + for (; i < fromPath.length && j2 < k2 && fromPath[i] === toPath[j2]; ++i, ++j2) + ; + return toPath.slice(j2).join("."); + } + function underScore(str) { + return str.substring(0, 1) + str.substring(1).replace(/([A-Z])(?=[a-z]|$)/g, function($0, $1) { + return "_" + $1.toLowerCase(); + }); + } + } +}); + +// node_modules/protobufjs/google/protobuf/api.json +var require_api = __commonJS({ + "node_modules/protobufjs/google/protobuf/api.json"(exports2, module2) { + module2.exports = { + nested: { + google: { + nested: { + protobuf: { + nested: { + Api: { + fields: { + name: { + type: "string", + id: 1 + }, + methods: { + rule: "repeated", + type: "Method", + id: 2 + }, + options: { + rule: "repeated", + type: "Option", + id: 3 + }, + version: { + type: "string", + id: 4 + }, + sourceContext: { + type: "SourceContext", + id: 5 + }, + mixins: { + rule: "repeated", + type: "Mixin", + id: 6 + }, + syntax: { + type: "Syntax", + id: 7 + } + } + }, + Method: { + fields: { + name: { + type: "string", + id: 1 + }, + requestTypeUrl: { + type: "string", + id: 2 + }, + requestStreaming: { + type: "bool", + id: 3 + }, + responseTypeUrl: { + type: "string", + id: 4 + }, + responseStreaming: { + type: "bool", + id: 5 + }, + options: { + rule: "repeated", + type: "Option", + id: 6 + }, + syntax: { + type: "Syntax", + id: 7 + } + } + }, + Mixin: { + fields: { + name: { + type: "string", + id: 1 + }, + root: { + type: "string", + id: 2 + } + } + }, + SourceContext: { + fields: { + fileName: { + type: "string", + id: 1 + } + } + }, + Option: { + fields: { + name: { + type: "string", + id: 1 + }, + value: { + type: "Any", + id: 2 + } + } + }, + Syntax: { + values: { + SYNTAX_PROTO2: 0, + SYNTAX_PROTO3: 1 + } + } + } + } + } + } + } + }; + } +}); + +// node_modules/protobufjs/google/protobuf/source_context.json +var require_source_context = __commonJS({ + "node_modules/protobufjs/google/protobuf/source_context.json"(exports2, module2) { + module2.exports = { + nested: { + google: { + nested: { + protobuf: { + nested: { + SourceContext: { + fields: { + fileName: { + type: "string", + id: 1 + } + } + } + } + } + } + } + } + }; + } +}); + +// node_modules/protobufjs/google/protobuf/type.json +var require_type2 = __commonJS({ + "node_modules/protobufjs/google/protobuf/type.json"(exports2, module2) { + module2.exports = { + nested: { + google: { + nested: { + protobuf: { + nested: { + Type: { + fields: { + name: { + type: "string", + id: 1 + }, + fields: { + rule: "repeated", + type: "Field", + id: 2 + }, + oneofs: { + rule: "repeated", + type: "string", + id: 3 + }, + options: { + rule: "repeated", + type: "Option", + id: 4 + }, + sourceContext: { + type: "SourceContext", + id: 5 + }, + syntax: { + type: "Syntax", + id: 6 + } + } + }, + Field: { + fields: { + kind: { + type: "Kind", + id: 1 + }, + cardinality: { + type: "Cardinality", + id: 2 + }, + number: { + type: "int32", + id: 3 + }, + name: { + type: "string", + id: 4 + }, + typeUrl: { + type: "string", + id: 6 + }, + oneofIndex: { + type: "int32", + id: 7 + }, + packed: { + type: "bool", + id: 8 + }, + options: { + rule: "repeated", + type: "Option", + id: 9 + }, + jsonName: { + type: "string", + id: 10 + }, + defaultValue: { + type: "string", + id: 11 + } + }, + nested: { + Kind: { + values: { + TYPE_UNKNOWN: 0, + TYPE_DOUBLE: 1, + TYPE_FLOAT: 2, + TYPE_INT64: 3, + TYPE_UINT64: 4, + TYPE_INT32: 5, + TYPE_FIXED64: 6, + TYPE_FIXED32: 7, + TYPE_BOOL: 8, + TYPE_STRING: 9, + TYPE_GROUP: 10, + TYPE_MESSAGE: 11, + TYPE_BYTES: 12, + TYPE_UINT32: 13, + TYPE_ENUM: 14, + TYPE_SFIXED32: 15, + TYPE_SFIXED64: 16, + TYPE_SINT32: 17, + TYPE_SINT64: 18 + } + }, + Cardinality: { + values: { + CARDINALITY_UNKNOWN: 0, + CARDINALITY_OPTIONAL: 1, + CARDINALITY_REQUIRED: 2, + CARDINALITY_REPEATED: 3 + } + } + } + }, + Enum: { + fields: { + name: { + type: "string", + id: 1 + }, + enumvalue: { + rule: "repeated", + type: "EnumValue", + id: 2 + }, + options: { + rule: "repeated", + type: "Option", + id: 3 + }, + sourceContext: { + type: "SourceContext", + id: 4 + }, + syntax: { + type: "Syntax", + id: 5 + } + } + }, + EnumValue: { + fields: { + name: { + type: "string", + id: 1 + }, + number: { + type: "int32", + id: 2 + }, + options: { + rule: "repeated", + type: "Option", + id: 3 + } + } + }, + Option: { + fields: { + name: { + type: "string", + id: 1 + }, + value: { + type: "Any", + id: 2 + } + } + }, + Syntax: { + values: { + SYNTAX_PROTO2: 0, + SYNTAX_PROTO3: 1 + } + }, + Any: { + fields: { + type_url: { + type: "string", + id: 1 + }, + value: { + type: "bytes", + id: 2 + } + } + }, + SourceContext: { + fields: { + fileName: { + type: "string", + id: 1 + } + } + } + } + } + } + } + } + }; + } +}); + +// node_modules/@grpc/proto-loader/build/src/util.js +var require_util2 = __commonJS({ + "node_modules/@grpc/proto-loader/build/src/util.js"(exports2) { + "use strict"; + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.addCommonProtos = exports2.loadProtosWithOptionsSync = exports2.loadProtosWithOptions = void 0; + var fs2 = require("fs"); + var path = require("path"); + var Protobuf = require_protobufjs(); + function addIncludePathResolver(root, includePaths) { + const originalResolvePath = root.resolvePath; + root.resolvePath = (origin, target) => { + if (path.isAbsolute(target)) { + return target; + } + for (const directory of includePaths) { + const fullPath = path.join(directory, target); + try { + fs2.accessSync(fullPath, fs2.constants.R_OK); + return fullPath; + } catch (err) { + continue; + } + } + process.emitWarning(`${target} not found in any of the include paths ${includePaths}`); + return originalResolvePath(origin, target); + }; + } + async function loadProtosWithOptions(filename, options2) { + const root = new Protobuf.Root(); + options2 = options2 || {}; + if (!!options2.includeDirs) { + if (!Array.isArray(options2.includeDirs)) { + return Promise.reject(new Error("The includeDirs option must be an array")); + } + addIncludePathResolver(root, options2.includeDirs); + } + const loadedRoot = await root.load(filename, options2); + loadedRoot.resolveAll(); + return loadedRoot; + } + exports2.loadProtosWithOptions = loadProtosWithOptions; + function loadProtosWithOptionsSync(filename, options2) { + const root = new Protobuf.Root(); + options2 = options2 || {}; + if (!!options2.includeDirs) { + if (!Array.isArray(options2.includeDirs)) { + throw new Error("The includeDirs option must be an array"); + } + addIncludePathResolver(root, options2.includeDirs); + } + const loadedRoot = root.loadSync(filename, options2); + loadedRoot.resolveAll(); + return loadedRoot; + } + exports2.loadProtosWithOptionsSync = loadProtosWithOptionsSync; + function addCommonProtos() { + const apiDescriptor = require_api(); + const descriptorDescriptor = require_descriptor(); + const sourceContextDescriptor = require_source_context(); + const typeDescriptor = require_type2(); + Protobuf.common("api", apiDescriptor.nested.google.nested.protobuf.nested); + Protobuf.common("descriptor", descriptorDescriptor.nested.google.nested.protobuf.nested); + Protobuf.common("source_context", sourceContextDescriptor.nested.google.nested.protobuf.nested); + Protobuf.common("type", typeDescriptor.nested.google.nested.protobuf.nested); + } + exports2.addCommonProtos = addCommonProtos; + } +}); + +// node_modules/long/src/long.js +var require_long = __commonJS({ + "node_modules/long/src/long.js"(exports2, module2) { + module2.exports = Long; + var wasm = null; + try { + wasm = new WebAssembly.Instance(new WebAssembly.Module(new Uint8Array([ + 0, + 97, + 115, + 109, + 1, + 0, + 0, + 0, + 1, + 13, + 2, + 96, + 0, + 1, + 127, + 96, + 4, + 127, + 127, + 127, + 127, + 1, + 127, + 3, + 7, + 6, + 0, + 1, + 1, + 1, + 1, + 1, + 6, + 6, + 1, + 127, + 1, + 65, + 0, + 11, + 7, + 50, + 6, + 3, + 109, + 117, + 108, + 0, + 1, + 5, + 100, + 105, + 118, + 95, + 115, + 0, + 2, + 5, + 100, + 105, + 118, + 95, + 117, + 0, + 3, + 5, + 114, + 101, + 109, + 95, + 115, + 0, + 4, + 5, + 114, + 101, + 109, + 95, + 117, + 0, + 5, + 8, + 103, + 101, + 116, + 95, + 104, + 105, + 103, + 104, + 0, + 0, + 10, + 191, + 1, + 6, + 4, + 0, + 35, + 0, + 11, + 36, + 1, + 1, + 126, + 32, + 0, + 173, + 32, + 1, + 173, + 66, + 32, + 134, + 132, + 32, + 2, + 173, + 32, + 3, + 173, + 66, + 32, + 134, + 132, + 126, + 34, + 4, + 66, + 32, + 135, + 167, + 36, + 0, + 32, + 4, + 167, + 11, + 36, + 1, + 1, + 126, + 32, + 0, + 173, + 32, + 1, + 173, + 66, + 32, + 134, + 132, + 32, + 2, + 173, + 32, + 3, + 173, + 66, + 32, + 134, + 132, + 127, + 34, + 4, + 66, + 32, + 135, + 167, + 36, + 0, + 32, + 4, + 167, + 11, + 36, + 1, + 1, + 126, + 32, + 0, + 173, + 32, + 1, + 173, + 66, + 32, + 134, + 132, + 32, + 2, + 173, + 32, + 3, + 173, + 66, + 32, + 134, + 132, + 128, + 34, + 4, + 66, + 32, + 135, + 167, + 36, + 0, + 32, + 4, + 167, + 11, + 36, + 1, + 1, + 126, + 32, + 0, + 173, + 32, + 1, + 173, + 66, + 32, + 134, + 132, + 32, + 2, + 173, + 32, + 3, + 173, + 66, + 32, + 134, + 132, + 129, + 34, + 4, + 66, + 32, + 135, + 167, + 36, + 0, + 32, + 4, + 167, + 11, + 36, + 1, + 1, + 126, + 32, + 0, + 173, + 32, + 1, + 173, + 66, + 32, + 134, + 132, + 32, + 2, + 173, + 32, + 3, + 173, + 66, + 32, + 134, + 132, + 130, + 34, + 4, + 66, + 32, + 135, + 167, + 36, + 0, + 32, + 4, + 167, + 11 + ])), {}).exports; + } catch (e) { + } + function Long(low, high, unsigned) { + this.low = low | 0; + this.high = high | 0; + this.unsigned = !!unsigned; + } + Long.prototype.__isLong__; + Object.defineProperty(Long.prototype, "__isLong__", { value: true }); + function isLong(obj) { + return (obj && obj["__isLong__"]) === true; + } + Long.isLong = isLong; + var INT_CACHE = {}; + var UINT_CACHE = {}; + function fromInt(value, unsigned) { + var obj, cachedObj, cache; + if (unsigned) { + value >>>= 0; + if (cache = 0 <= value && value < 256) { + cachedObj = UINT_CACHE[value]; + if (cachedObj) + return cachedObj; + } + obj = fromBits(value, (value | 0) < 0 ? -1 : 0, true); + if (cache) + UINT_CACHE[value] = obj; + return obj; + } else { + value |= 0; + if (cache = -128 <= value && value < 128) { + cachedObj = INT_CACHE[value]; + if (cachedObj) + return cachedObj; + } + obj = fromBits(value, value < 0 ? -1 : 0, false); + if (cache) + INT_CACHE[value] = obj; + return obj; + } + } + Long.fromInt = fromInt; + function fromNumber(value, unsigned) { + if (isNaN(value)) + return unsigned ? UZERO : ZERO; + if (unsigned) { + if (value < 0) + return UZERO; + if (value >= TWO_PWR_64_DBL) + return MAX_UNSIGNED_VALUE; + } else { + if (value <= -TWO_PWR_63_DBL) + return MIN_VALUE; + if (value + 1 >= TWO_PWR_63_DBL) + return MAX_VALUE; + } + if (value < 0) + return fromNumber(-value, unsigned).neg(); + return fromBits(value % TWO_PWR_32_DBL | 0, value / TWO_PWR_32_DBL | 0, unsigned); + } + Long.fromNumber = fromNumber; + function fromBits(lowBits, highBits, unsigned) { + return new Long(lowBits, highBits, unsigned); + } + Long.fromBits = fromBits; + var pow_dbl = Math.pow; + function fromString(str, unsigned, radix) { + if (str.length === 0) + throw Error("empty string"); + if (str === "NaN" || str === "Infinity" || str === "+Infinity" || str === "-Infinity") + return ZERO; + if (typeof unsigned === "number") { + radix = unsigned, unsigned = false; + } else { + unsigned = !!unsigned; + } + radix = radix || 10; + if (radix < 2 || 36 < radix) + throw RangeError("radix"); + var p; + if ((p = str.indexOf("-")) > 0) + throw Error("interior hyphen"); + else if (p === 0) { + return fromString(str.substring(1), unsigned, radix).neg(); + } + var radixToPower = fromNumber(pow_dbl(radix, 8)); + var result = ZERO; + for (var i = 0; i < str.length; i += 8) { + var size = Math.min(8, str.length - i), value = parseInt(str.substring(i, i + size), radix); + if (size < 8) { + var power = fromNumber(pow_dbl(radix, size)); + result = result.mul(power).add(fromNumber(value)); + } else { + result = result.mul(radixToPower); + result = result.add(fromNumber(value)); + } + } + result.unsigned = unsigned; + return result; + } + Long.fromString = fromString; + function fromValue(val, unsigned) { + if (typeof val === "number") + return fromNumber(val, unsigned); + if (typeof val === "string") + return fromString(val, unsigned); + return fromBits(val.low, val.high, typeof unsigned === "boolean" ? unsigned : val.unsigned); + } + Long.fromValue = fromValue; + var TWO_PWR_16_DBL = 1 << 16; + var TWO_PWR_24_DBL = 1 << 24; + var TWO_PWR_32_DBL = TWO_PWR_16_DBL * TWO_PWR_16_DBL; + var TWO_PWR_64_DBL = TWO_PWR_32_DBL * TWO_PWR_32_DBL; + var TWO_PWR_63_DBL = TWO_PWR_64_DBL / 2; + var TWO_PWR_24 = fromInt(TWO_PWR_24_DBL); + var ZERO = fromInt(0); + Long.ZERO = ZERO; + var UZERO = fromInt(0, true); + Long.UZERO = UZERO; + var ONE = fromInt(1); + Long.ONE = ONE; + var UONE = fromInt(1, true); + Long.UONE = UONE; + var NEG_ONE = fromInt(-1); + Long.NEG_ONE = NEG_ONE; + var MAX_VALUE = fromBits(4294967295 | 0, 2147483647 | 0, false); + Long.MAX_VALUE = MAX_VALUE; + var MAX_UNSIGNED_VALUE = fromBits(4294967295 | 0, 4294967295 | 0, true); + Long.MAX_UNSIGNED_VALUE = MAX_UNSIGNED_VALUE; + var MIN_VALUE = fromBits(0, 2147483648 | 0, false); + Long.MIN_VALUE = MIN_VALUE; + var LongPrototype = Long.prototype; + LongPrototype.toInt = function toInt() { + return this.unsigned ? this.low >>> 0 : this.low; + }; + LongPrototype.toNumber = function toNumber() { + if (this.unsigned) + return (this.high >>> 0) * TWO_PWR_32_DBL + (this.low >>> 0); + return this.high * TWO_PWR_32_DBL + (this.low >>> 0); + }; + LongPrototype.toString = function toString(radix) { + radix = radix || 10; + if (radix < 2 || 36 < radix) + throw RangeError("radix"); + if (this.isZero()) + return "0"; + if (this.isNegative()) { + if (this.eq(MIN_VALUE)) { + var radixLong = fromNumber(radix), div = this.div(radixLong), rem1 = div.mul(radixLong).sub(this); + return div.toString(radix) + rem1.toInt().toString(radix); + } else + return "-" + this.neg().toString(radix); + } + var radixToPower = fromNumber(pow_dbl(radix, 6), this.unsigned), rem = this; + var result = ""; + while (true) { + var remDiv = rem.div(radixToPower), intval = rem.sub(remDiv.mul(radixToPower)).toInt() >>> 0, digits = intval.toString(radix); + rem = remDiv; + if (rem.isZero()) + return digits + result; + else { + while (digits.length < 6) + digits = "0" + digits; + result = "" + digits + result; + } + } + }; + LongPrototype.getHighBits = function getHighBits() { + return this.high; + }; + LongPrototype.getHighBitsUnsigned = function getHighBitsUnsigned() { + return this.high >>> 0; + }; + LongPrototype.getLowBits = function getLowBits() { + return this.low; + }; + LongPrototype.getLowBitsUnsigned = function getLowBitsUnsigned() { + return this.low >>> 0; + }; + LongPrototype.getNumBitsAbs = function getNumBitsAbs() { + if (this.isNegative()) + return this.eq(MIN_VALUE) ? 64 : this.neg().getNumBitsAbs(); + var val = this.high != 0 ? this.high : this.low; + for (var bit = 31; bit > 0; bit--) + if ((val & 1 << bit) != 0) + break; + return this.high != 0 ? bit + 33 : bit + 1; + }; + LongPrototype.isZero = function isZero() { + return this.high === 0 && this.low === 0; + }; + LongPrototype.eqz = LongPrototype.isZero; + LongPrototype.isNegative = function isNegative() { + return !this.unsigned && this.high < 0; + }; + LongPrototype.isPositive = function isPositive() { + return this.unsigned || this.high >= 0; + }; + LongPrototype.isOdd = function isOdd() { + return (this.low & 1) === 1; + }; + LongPrototype.isEven = function isEven() { + return (this.low & 1) === 0; + }; + LongPrototype.equals = function equals(other) { + if (!isLong(other)) + other = fromValue(other); + if (this.unsigned !== other.unsigned && this.high >>> 31 === 1 && other.high >>> 31 === 1) + return false; + return this.high === other.high && this.low === other.low; + }; + LongPrototype.eq = LongPrototype.equals; + LongPrototype.notEquals = function notEquals(other) { + return !this.eq( + /* validates */ + other + ); + }; + LongPrototype.neq = LongPrototype.notEquals; + LongPrototype.ne = LongPrototype.notEquals; + LongPrototype.lessThan = function lessThan(other) { + return this.comp( + /* validates */ + other + ) < 0; + }; + LongPrototype.lt = LongPrototype.lessThan; + LongPrototype.lessThanOrEqual = function lessThanOrEqual(other) { + return this.comp( + /* validates */ + other + ) <= 0; + }; + LongPrototype.lte = LongPrototype.lessThanOrEqual; + LongPrototype.le = LongPrototype.lessThanOrEqual; + LongPrototype.greaterThan = function greaterThan(other) { + return this.comp( + /* validates */ + other + ) > 0; + }; + LongPrototype.gt = LongPrototype.greaterThan; + LongPrototype.greaterThanOrEqual = function greaterThanOrEqual(other) { + return this.comp( + /* validates */ + other + ) >= 0; + }; + LongPrototype.gte = LongPrototype.greaterThanOrEqual; + LongPrototype.ge = LongPrototype.greaterThanOrEqual; + LongPrototype.compare = function compare(other) { + if (!isLong(other)) + other = fromValue(other); + if (this.eq(other)) + return 0; + var thisNeg = this.isNegative(), otherNeg = other.isNegative(); + if (thisNeg && !otherNeg) + return -1; + if (!thisNeg && otherNeg) + return 1; + if (!this.unsigned) + return this.sub(other).isNegative() ? -1 : 1; + return other.high >>> 0 > this.high >>> 0 || other.high === this.high && other.low >>> 0 > this.low >>> 0 ? -1 : 1; + }; + LongPrototype.comp = LongPrototype.compare; + LongPrototype.negate = function negate() { + if (!this.unsigned && this.eq(MIN_VALUE)) + return MIN_VALUE; + return this.not().add(ONE); + }; + LongPrototype.neg = LongPrototype.negate; + LongPrototype.add = function add(addend) { + if (!isLong(addend)) + addend = fromValue(addend); + var a48 = this.high >>> 16; + var a32 = this.high & 65535; + var a16 = this.low >>> 16; + var a00 = this.low & 65535; + var b48 = addend.high >>> 16; + var b32 = addend.high & 65535; + var b16 = addend.low >>> 16; + var b00 = addend.low & 65535; + var c48 = 0, c32 = 0, c16 = 0, c00 = 0; + c00 += a00 + b00; + c16 += c00 >>> 16; + c00 &= 65535; + c16 += a16 + b16; + c32 += c16 >>> 16; + c16 &= 65535; + c32 += a32 + b32; + c48 += c32 >>> 16; + c32 &= 65535; + c48 += a48 + b48; + c48 &= 65535; + return fromBits(c16 << 16 | c00, c48 << 16 | c32, this.unsigned); + }; + LongPrototype.subtract = function subtract(subtrahend) { + if (!isLong(subtrahend)) + subtrahend = fromValue(subtrahend); + return this.add(subtrahend.neg()); + }; + LongPrototype.sub = LongPrototype.subtract; + LongPrototype.multiply = function multiply(multiplier) { + if (this.isZero()) + return ZERO; + if (!isLong(multiplier)) + multiplier = fromValue(multiplier); + if (wasm) { + var low = wasm.mul( + this.low, + this.high, + multiplier.low, + multiplier.high + ); + return fromBits(low, wasm.get_high(), this.unsigned); + } + if (multiplier.isZero()) + return ZERO; + if (this.eq(MIN_VALUE)) + return multiplier.isOdd() ? MIN_VALUE : ZERO; + if (multiplier.eq(MIN_VALUE)) + return this.isOdd() ? MIN_VALUE : ZERO; + if (this.isNegative()) { + if (multiplier.isNegative()) + return this.neg().mul(multiplier.neg()); + else + return this.neg().mul(multiplier).neg(); + } else if (multiplier.isNegative()) + return this.mul(multiplier.neg()).neg(); + if (this.lt(TWO_PWR_24) && multiplier.lt(TWO_PWR_24)) + return fromNumber(this.toNumber() * multiplier.toNumber(), this.unsigned); + var a48 = this.high >>> 16; + var a32 = this.high & 65535; + var a16 = this.low >>> 16; + var a00 = this.low & 65535; + var b48 = multiplier.high >>> 16; + var b32 = multiplier.high & 65535; + var b16 = multiplier.low >>> 16; + var b00 = multiplier.low & 65535; + var c48 = 0, c32 = 0, c16 = 0, c00 = 0; + c00 += a00 * b00; + c16 += c00 >>> 16; + c00 &= 65535; + c16 += a16 * b00; + c32 += c16 >>> 16; + c16 &= 65535; + c16 += a00 * b16; + c32 += c16 >>> 16; + c16 &= 65535; + c32 += a32 * b00; + c48 += c32 >>> 16; + c32 &= 65535; + c32 += a16 * b16; + c48 += c32 >>> 16; + c32 &= 65535; + c32 += a00 * b32; + c48 += c32 >>> 16; + c32 &= 65535; + c48 += a48 * b00 + a32 * b16 + a16 * b32 + a00 * b48; + c48 &= 65535; + return fromBits(c16 << 16 | c00, c48 << 16 | c32, this.unsigned); + }; + LongPrototype.mul = LongPrototype.multiply; + LongPrototype.divide = function divide(divisor) { + if (!isLong(divisor)) + divisor = fromValue(divisor); + if (divisor.isZero()) + throw Error("division by zero"); + if (wasm) { + if (!this.unsigned && this.high === -2147483648 && divisor.low === -1 && divisor.high === -1) { + return this; + } + var low = (this.unsigned ? wasm.div_u : wasm.div_s)( + this.low, + this.high, + divisor.low, + divisor.high + ); + return fromBits(low, wasm.get_high(), this.unsigned); + } + if (this.isZero()) + return this.unsigned ? UZERO : ZERO; + var approx, rem, res; + if (!this.unsigned) { + if (this.eq(MIN_VALUE)) { + if (divisor.eq(ONE) || divisor.eq(NEG_ONE)) + return MIN_VALUE; + else if (divisor.eq(MIN_VALUE)) + return ONE; + else { + var halfThis = this.shr(1); + approx = halfThis.div(divisor).shl(1); + if (approx.eq(ZERO)) { + return divisor.isNegative() ? ONE : NEG_ONE; + } else { + rem = this.sub(divisor.mul(approx)); + res = approx.add(rem.div(divisor)); + return res; + } + } + } else if (divisor.eq(MIN_VALUE)) + return this.unsigned ? UZERO : ZERO; + if (this.isNegative()) { + if (divisor.isNegative()) + return this.neg().div(divisor.neg()); + return this.neg().div(divisor).neg(); + } else if (divisor.isNegative()) + return this.div(divisor.neg()).neg(); + res = ZERO; + } else { + if (!divisor.unsigned) + divisor = divisor.toUnsigned(); + if (divisor.gt(this)) + return UZERO; + if (divisor.gt(this.shru(1))) + return UONE; + res = UZERO; + } + rem = this; + while (rem.gte(divisor)) { + approx = Math.max(1, Math.floor(rem.toNumber() / divisor.toNumber())); + var log2 = Math.ceil(Math.log(approx) / Math.LN2), delta = log2 <= 48 ? 1 : pow_dbl(2, log2 - 48), approxRes = fromNumber(approx), approxRem = approxRes.mul(divisor); + while (approxRem.isNegative() || approxRem.gt(rem)) { + approx -= delta; + approxRes = fromNumber(approx, this.unsigned); + approxRem = approxRes.mul(divisor); + } + if (approxRes.isZero()) + approxRes = ONE; + res = res.add(approxRes); + rem = rem.sub(approxRem); + } + return res; + }; + LongPrototype.div = LongPrototype.divide; + LongPrototype.modulo = function modulo(divisor) { + if (!isLong(divisor)) + divisor = fromValue(divisor); + if (wasm) { + var low = (this.unsigned ? wasm.rem_u : wasm.rem_s)( + this.low, + this.high, + divisor.low, + divisor.high + ); + return fromBits(low, wasm.get_high(), this.unsigned); + } + return this.sub(this.div(divisor).mul(divisor)); + }; + LongPrototype.mod = LongPrototype.modulo; + LongPrototype.rem = LongPrototype.modulo; + LongPrototype.not = function not() { + return fromBits(~this.low, ~this.high, this.unsigned); + }; + LongPrototype.and = function and(other) { + if (!isLong(other)) + other = fromValue(other); + return fromBits(this.low & other.low, this.high & other.high, this.unsigned); + }; + LongPrototype.or = function or(other) { + if (!isLong(other)) + other = fromValue(other); + return fromBits(this.low | other.low, this.high | other.high, this.unsigned); + }; + LongPrototype.xor = function xor(other) { + if (!isLong(other)) + other = fromValue(other); + return fromBits(this.low ^ other.low, this.high ^ other.high, this.unsigned); + }; + LongPrototype.shiftLeft = function shiftLeft(numBits) { + if (isLong(numBits)) + numBits = numBits.toInt(); + if ((numBits &= 63) === 0) + return this; + else if (numBits < 32) + return fromBits(this.low << numBits, this.high << numBits | this.low >>> 32 - numBits, this.unsigned); + else + return fromBits(0, this.low << numBits - 32, this.unsigned); + }; + LongPrototype.shl = LongPrototype.shiftLeft; + LongPrototype.shiftRight = function shiftRight(numBits) { + if (isLong(numBits)) + numBits = numBits.toInt(); + if ((numBits &= 63) === 0) + return this; + else if (numBits < 32) + return fromBits(this.low >>> numBits | this.high << 32 - numBits, this.high >> numBits, this.unsigned); + else + return fromBits(this.high >> numBits - 32, this.high >= 0 ? 0 : -1, this.unsigned); + }; + LongPrototype.shr = LongPrototype.shiftRight; + LongPrototype.shiftRightUnsigned = function shiftRightUnsigned(numBits) { + if (isLong(numBits)) + numBits = numBits.toInt(); + numBits &= 63; + if (numBits === 0) + return this; + else { + var high = this.high; + if (numBits < 32) { + var low = this.low; + return fromBits(low >>> numBits | high << 32 - numBits, high >>> numBits, this.unsigned); + } else if (numBits === 32) + return fromBits(high, 0, this.unsigned); + else + return fromBits(high >>> numBits - 32, 0, this.unsigned); + } + }; + LongPrototype.shru = LongPrototype.shiftRightUnsigned; + LongPrototype.shr_u = LongPrototype.shiftRightUnsigned; + LongPrototype.toSigned = function toSigned() { + if (!this.unsigned) + return this; + return fromBits(this.low, this.high, false); + }; + LongPrototype.toUnsigned = function toUnsigned() { + if (this.unsigned) + return this; + return fromBits(this.low, this.high, true); + }; + LongPrototype.toBytes = function toBytes(le) { + return le ? this.toBytesLE() : this.toBytesBE(); + }; + LongPrototype.toBytesLE = function toBytesLE() { + var hi2 = this.high, lo2 = this.low; + return [ + lo2 & 255, + lo2 >>> 8 & 255, + lo2 >>> 16 & 255, + lo2 >>> 24, + hi2 & 255, + hi2 >>> 8 & 255, + hi2 >>> 16 & 255, + hi2 >>> 24 + ]; + }; + LongPrototype.toBytesBE = function toBytesBE() { + var hi2 = this.high, lo2 = this.low; + return [ + hi2 >>> 24, + hi2 >>> 16 & 255, + hi2 >>> 8 & 255, + hi2 & 255, + lo2 >>> 24, + lo2 >>> 16 & 255, + lo2 >>> 8 & 255, + lo2 & 255 + ]; + }; + Long.fromBytes = function fromBytes(bytes, unsigned, le) { + return le ? Long.fromBytesLE(bytes, unsigned) : Long.fromBytesBE(bytes, unsigned); + }; + Long.fromBytesLE = function fromBytesLE(bytes, unsigned) { + return new Long( + bytes[0] | bytes[1] << 8 | bytes[2] << 16 | bytes[3] << 24, + bytes[4] | bytes[5] << 8 | bytes[6] << 16 | bytes[7] << 24, + unsigned + ); + }; + Long.fromBytesBE = function fromBytesBE(bytes, unsigned) { + return new Long( + bytes[4] << 24 | bytes[5] << 16 | bytes[6] << 8 | bytes[7], + bytes[0] << 24 | bytes[1] << 16 | bytes[2] << 8 | bytes[3], + unsigned + ); + }; + } +}); + +// node_modules/@grpc/proto-loader/build/src/index.js +var require_src2 = __commonJS({ + "node_modules/@grpc/proto-loader/build/src/index.js"(exports2) { + "use strict"; + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.loadFileDescriptorSetFromObject = exports2.loadFileDescriptorSetFromBuffer = exports2.fromJSON = exports2.loadSync = exports2.load = exports2.isAnyExtension = exports2.Long = void 0; + var camelCase = require_lodash(); + var Protobuf = require_protobufjs(); + var descriptor = require_descriptor2(); + var util_1 = require_util2(); + var Long = require_long(); + exports2.Long = Long; + function isAnyExtension(obj) { + return "@type" in obj && typeof obj["@type"] === "string"; + } + exports2.isAnyExtension = isAnyExtension; + var descriptorOptions = { + longs: String, + enums: String, + bytes: String, + defaults: true, + oneofs: true, + json: true + }; + function joinName(baseName, name) { + if (baseName === "") { + return name; + } else { + return baseName + "." + name; + } + } + function isHandledReflectionObject(obj) { + return obj instanceof Protobuf.Service || obj instanceof Protobuf.Type || obj instanceof Protobuf.Enum; + } + function isNamespaceBase(obj) { + return obj instanceof Protobuf.Namespace || obj instanceof Protobuf.Root; + } + function getAllHandledReflectionObjects(obj, parentName) { + const objName = joinName(parentName, obj.name); + if (isHandledReflectionObject(obj)) { + return [[objName, obj]]; + } else { + if (isNamespaceBase(obj) && typeof obj.nested !== "undefined") { + return Object.keys(obj.nested).map((name) => { + return getAllHandledReflectionObjects(obj.nested[name], objName); + }).reduce((accumulator, currentValue) => accumulator.concat(currentValue), []); + } + } + return []; + } + function createDeserializer(cls, options2) { + return function deserialize(argBuf) { + return cls.toObject(cls.decode(argBuf), options2); + }; + } + function createSerializer(cls) { + return function serialize(arg) { + if (Array.isArray(arg)) { + throw new Error(`Failed to serialize message: expected object with ${cls.name} structure, got array instead`); + } + const message = cls.fromObject(arg); + return cls.encode(message).finish(); + }; + } + function createMethodDefinition(method, serviceName, options2, fileDescriptors) { + const requestType = method.resolvedRequestType; + const responseType = method.resolvedResponseType; + return { + path: "/" + serviceName + "/" + method.name, + requestStream: !!method.requestStream, + responseStream: !!method.responseStream, + requestSerialize: createSerializer(requestType), + requestDeserialize: createDeserializer(requestType, options2), + responseSerialize: createSerializer(responseType), + responseDeserialize: createDeserializer(responseType, options2), + // TODO(murgatroid99): Find a better way to handle this + originalName: camelCase(method.name), + requestType: createMessageDefinition(requestType, fileDescriptors), + responseType: createMessageDefinition(responseType, fileDescriptors) + }; + } + function createServiceDefinition(service, name, options2, fileDescriptors) { + const def = {}; + for (const method of service.methodsArray) { + def[method.name] = createMethodDefinition(method, name, options2, fileDescriptors); + } + return def; + } + function createMessageDefinition(message, fileDescriptors) { + const messageDescriptor = message.toDescriptor("proto3"); + return { + format: "Protocol Buffer 3 DescriptorProto", + type: messageDescriptor.$type.toObject(messageDescriptor, descriptorOptions), + fileDescriptorProtos: fileDescriptors + }; + } + function createEnumDefinition(enumType, fileDescriptors) { + const enumDescriptor = enumType.toDescriptor("proto3"); + return { + format: "Protocol Buffer 3 EnumDescriptorProto", + type: enumDescriptor.$type.toObject(enumDescriptor, descriptorOptions), + fileDescriptorProtos: fileDescriptors + }; + } + function createDefinition(obj, name, options2, fileDescriptors) { + if (obj instanceof Protobuf.Service) { + return createServiceDefinition(obj, name, options2, fileDescriptors); + } else if (obj instanceof Protobuf.Type) { + return createMessageDefinition(obj, fileDescriptors); + } else if (obj instanceof Protobuf.Enum) { + return createEnumDefinition(obj, fileDescriptors); + } else { + throw new Error("Type mismatch in reflection object handling"); + } + } + function createPackageDefinition(root, options2) { + const def = {}; + root.resolveAll(); + const descriptorList = root.toDescriptor("proto3").file; + const bufferList = descriptorList.map((value) => Buffer.from(descriptor.FileDescriptorProto.encode(value).finish())); + for (const [name, obj] of getAllHandledReflectionObjects(root, "")) { + def[name] = createDefinition(obj, name, options2, bufferList); + } + return def; + } + function createPackageDefinitionFromDescriptorSet(decodedDescriptorSet, options2) { + options2 = options2 || {}; + const root = Protobuf.Root.fromDescriptor(decodedDescriptorSet); + root.resolveAll(); + return createPackageDefinition(root, options2); + } + function load(filename, options2) { + return (0, util_1.loadProtosWithOptions)(filename, options2).then((loadedRoot) => { + return createPackageDefinition(loadedRoot, options2); + }); + } + exports2.load = load; + function loadSync2(filename, options2) { + const loadedRoot = (0, util_1.loadProtosWithOptionsSync)(filename, options2); + return createPackageDefinition(loadedRoot, options2); + } + exports2.loadSync = loadSync2; + function fromJSON(json, options2) { + options2 = options2 || {}; + const loadedRoot = Protobuf.Root.fromJSON(json); + loadedRoot.resolveAll(); + return createPackageDefinition(loadedRoot, options2); + } + exports2.fromJSON = fromJSON; + function loadFileDescriptorSetFromBuffer(descriptorSet, options2) { + const decodedDescriptorSet = descriptor.FileDescriptorSet.decode(descriptorSet); + return createPackageDefinitionFromDescriptorSet(decodedDescriptorSet, options2); + } + exports2.loadFileDescriptorSetFromBuffer = loadFileDescriptorSetFromBuffer; + function loadFileDescriptorSetFromObject(descriptorSet, options2) { + const decodedDescriptorSet = descriptor.FileDescriptorSet.fromObject(descriptorSet); + return createPackageDefinitionFromDescriptorSet(decodedDescriptorSet, options2); + } + exports2.loadFileDescriptorSetFromObject = loadFileDescriptorSetFromObject; + (0, util_1.addCommonProtos)(); + } +}); + +// node_modules/@grpc/grpc-js/build/src/constants.js +var require_constants = __commonJS({ + "node_modules/@grpc/grpc-js/build/src/constants.js"(exports2) { + "use strict"; + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.DEFAULT_MAX_RECEIVE_MESSAGE_LENGTH = exports2.DEFAULT_MAX_SEND_MESSAGE_LENGTH = exports2.Propagate = exports2.LogVerbosity = exports2.Status = void 0; + var Status; + (function(Status2) { + Status2[Status2["OK"] = 0] = "OK"; + Status2[Status2["CANCELLED"] = 1] = "CANCELLED"; + Status2[Status2["UNKNOWN"] = 2] = "UNKNOWN"; + Status2[Status2["INVALID_ARGUMENT"] = 3] = "INVALID_ARGUMENT"; + Status2[Status2["DEADLINE_EXCEEDED"] = 4] = "DEADLINE_EXCEEDED"; + Status2[Status2["NOT_FOUND"] = 5] = "NOT_FOUND"; + Status2[Status2["ALREADY_EXISTS"] = 6] = "ALREADY_EXISTS"; + Status2[Status2["PERMISSION_DENIED"] = 7] = "PERMISSION_DENIED"; + Status2[Status2["RESOURCE_EXHAUSTED"] = 8] = "RESOURCE_EXHAUSTED"; + Status2[Status2["FAILED_PRECONDITION"] = 9] = "FAILED_PRECONDITION"; + Status2[Status2["ABORTED"] = 10] = "ABORTED"; + Status2[Status2["OUT_OF_RANGE"] = 11] = "OUT_OF_RANGE"; + Status2[Status2["UNIMPLEMENTED"] = 12] = "UNIMPLEMENTED"; + Status2[Status2["INTERNAL"] = 13] = "INTERNAL"; + Status2[Status2["UNAVAILABLE"] = 14] = "UNAVAILABLE"; + Status2[Status2["DATA_LOSS"] = 15] = "DATA_LOSS"; + Status2[Status2["UNAUTHENTICATED"] = 16] = "UNAUTHENTICATED"; + })(Status || (exports2.Status = Status = {})); + var LogVerbosity; + (function(LogVerbosity2) { + LogVerbosity2[LogVerbosity2["DEBUG"] = 0] = "DEBUG"; + LogVerbosity2[LogVerbosity2["INFO"] = 1] = "INFO"; + LogVerbosity2[LogVerbosity2["ERROR"] = 2] = "ERROR"; + LogVerbosity2[LogVerbosity2["NONE"] = 3] = "NONE"; + })(LogVerbosity || (exports2.LogVerbosity = LogVerbosity = {})); + var Propagate; + (function(Propagate2) { + Propagate2[Propagate2["DEADLINE"] = 1] = "DEADLINE"; + Propagate2[Propagate2["CENSUS_STATS_CONTEXT"] = 2] = "CENSUS_STATS_CONTEXT"; + Propagate2[Propagate2["CENSUS_TRACING_CONTEXT"] = 4] = "CENSUS_TRACING_CONTEXT"; + Propagate2[Propagate2["CANCELLATION"] = 8] = "CANCELLATION"; + Propagate2[Propagate2["DEFAULTS"] = 65535] = "DEFAULTS"; + })(Propagate || (exports2.Propagate = Propagate = {})); + exports2.DEFAULT_MAX_SEND_MESSAGE_LENGTH = -1; + exports2.DEFAULT_MAX_RECEIVE_MESSAGE_LENGTH = 4 * 1024 * 1024; + } +}); + +// node_modules/@grpc/grpc-js/build/src/logging.js +var require_logging = __commonJS({ + "node_modules/@grpc/grpc-js/build/src/logging.js"(exports2) { + "use strict"; + var _a2; + var _b; + var _c2; + var _d; + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.isTracerEnabled = exports2.trace = exports2.log = exports2.setLoggerVerbosity = exports2.setLogger = exports2.getLogger = void 0; + var constants_1 = require_constants(); + var DEFAULT_LOGGER = { + error: (message, ...optionalParams) => { + console.error("E " + message, ...optionalParams); + }, + info: (message, ...optionalParams) => { + console.error("I " + message, ...optionalParams); + }, + debug: (message, ...optionalParams) => { + console.error("D " + message, ...optionalParams); + } + }; + var _logger = DEFAULT_LOGGER; + var _logVerbosity = constants_1.LogVerbosity.ERROR; + var verbosityString = (_b = (_a2 = process.env.GRPC_NODE_VERBOSITY) !== null && _a2 !== void 0 ? _a2 : process.env.GRPC_VERBOSITY) !== null && _b !== void 0 ? _b : ""; + switch (verbosityString.toUpperCase()) { + case "DEBUG": + _logVerbosity = constants_1.LogVerbosity.DEBUG; + break; + case "INFO": + _logVerbosity = constants_1.LogVerbosity.INFO; + break; + case "ERROR": + _logVerbosity = constants_1.LogVerbosity.ERROR; + break; + case "NONE": + _logVerbosity = constants_1.LogVerbosity.NONE; + break; + default: + } + var getLogger = () => { + return _logger; + }; + exports2.getLogger = getLogger; + var setLogger = (logger) => { + _logger = logger; + }; + exports2.setLogger = setLogger; + var setLoggerVerbosity = (verbosity) => { + _logVerbosity = verbosity; + }; + exports2.setLoggerVerbosity = setLoggerVerbosity; + var log2 = (severity, ...args) => { + let logFunction; + if (severity >= _logVerbosity) { + switch (severity) { + case constants_1.LogVerbosity.DEBUG: + logFunction = _logger.debug; + break; + case constants_1.LogVerbosity.INFO: + logFunction = _logger.info; + break; + case constants_1.LogVerbosity.ERROR: + logFunction = _logger.error; + break; + } + if (!logFunction) { + logFunction = _logger.error; + } + if (logFunction) { + logFunction.bind(_logger)(...args); + } + } + }; + exports2.log = log2; + var tracersString = (_d = (_c2 = process.env.GRPC_NODE_TRACE) !== null && _c2 !== void 0 ? _c2 : process.env.GRPC_TRACE) !== null && _d !== void 0 ? _d : ""; + var enabledTracers = /* @__PURE__ */ new Set(); + var disabledTracers = /* @__PURE__ */ new Set(); + for (const tracerName of tracersString.split(",")) { + if (tracerName.startsWith("-")) { + disabledTracers.add(tracerName.substring(1)); + } else { + enabledTracers.add(tracerName); + } + } + var allEnabled = enabledTracers.has("all"); + function trace(severity, tracer, text) { + if (isTracerEnabled(tracer)) { + (0, exports2.log)(severity, (/* @__PURE__ */ new Date()).toISOString() + " | " + tracer + " | " + text); + } + } + exports2.trace = trace; + function isTracerEnabled(tracer) { + return !disabledTracers.has(tracer) && (allEnabled || enabledTracers.has(tracer)); + } + exports2.isTracerEnabled = isTracerEnabled; + } +}); + +// node_modules/@grpc/grpc-js/build/src/error.js +var require_error = __commonJS({ + "node_modules/@grpc/grpc-js/build/src/error.js"(exports2) { + "use strict"; + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.getErrorCode = exports2.getErrorMessage = void 0; + function getErrorMessage(error2) { + if (error2 instanceof Error) { + return error2.message; + } else { + return String(error2); + } + } + exports2.getErrorMessage = getErrorMessage; + function getErrorCode(error2) { + if (typeof error2 === "object" && error2 !== null && "code" in error2 && typeof error2.code === "number") { + return error2.code; + } else { + return null; + } + } + exports2.getErrorCode = getErrorCode; + } +}); + +// node_modules/@grpc/grpc-js/build/src/metadata.js +var require_metadata = __commonJS({ + "node_modules/@grpc/grpc-js/build/src/metadata.js"(exports2) { + "use strict"; + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.Metadata = void 0; + var logging_1 = require_logging(); + var constants_1 = require_constants(); + var error_1 = require_error(); + var LEGAL_KEY_REGEX = /^[0-9a-z_.-]+$/; + var LEGAL_NON_BINARY_VALUE_REGEX = /^[ -~]*$/; + function isLegalKey(key) { + return LEGAL_KEY_REGEX.test(key); + } + function isLegalNonBinaryValue(value) { + return LEGAL_NON_BINARY_VALUE_REGEX.test(value); + } + function isBinaryKey(key) { + return key.endsWith("-bin"); + } + function isCustomMetadata(key) { + return !key.startsWith("grpc-"); + } + function normalizeKey(key) { + return key.toLowerCase(); + } + function validate(key, value) { + if (!isLegalKey(key)) { + throw new Error('Metadata key "' + key + '" contains illegal characters'); + } + if (value !== null && value !== void 0) { + if (isBinaryKey(key)) { + if (!Buffer.isBuffer(value)) { + throw new Error("keys that end with '-bin' must have Buffer values"); + } + } else { + if (Buffer.isBuffer(value)) { + throw new Error("keys that don't end with '-bin' must have String values"); + } + if (!isLegalNonBinaryValue(value)) { + throw new Error('Metadata string value "' + value + '" contains illegal characters'); + } + } + } + } + var Metadata = class _Metadata { + constructor(options2 = {}) { + this.internalRepr = /* @__PURE__ */ new Map(); + this.options = options2; + } + /** + * Sets the given value for the given key by replacing any other values + * associated with that key. Normalizes the key. + * @param key The key to whose value should be set. + * @param value The value to set. Must be a buffer if and only + * if the normalized key ends with '-bin'. + */ + set(key, value) { + key = normalizeKey(key); + validate(key, value); + this.internalRepr.set(key, [value]); + } + /** + * Adds the given value for the given key by appending to a list of previous + * values associated with that key. Normalizes the key. + * @param key The key for which a new value should be appended. + * @param value The value to add. Must be a buffer if and only + * if the normalized key ends with '-bin'. + */ + add(key, value) { + key = normalizeKey(key); + validate(key, value); + const existingValue = this.internalRepr.get(key); + if (existingValue === void 0) { + this.internalRepr.set(key, [value]); + } else { + existingValue.push(value); + } + } + /** + * Removes the given key and any associated values. Normalizes the key. + * @param key The key whose values should be removed. + */ + remove(key) { + key = normalizeKey(key); + this.internalRepr.delete(key); + } + /** + * Gets a list of all values associated with the key. Normalizes the key. + * @param key The key whose value should be retrieved. + * @return A list of values associated with the given key. + */ + get(key) { + key = normalizeKey(key); + return this.internalRepr.get(key) || []; + } + /** + * Gets a plain object mapping each key to the first value associated with it. + * This reflects the most common way that people will want to see metadata. + * @return A key/value mapping of the metadata. + */ + getMap() { + const result = {}; + for (const [key, values] of this.internalRepr) { + if (values.length > 0) { + const v = values[0]; + result[key] = Buffer.isBuffer(v) ? Buffer.from(v) : v; + } + } + return result; + } + /** + * Clones the metadata object. + * @return The newly cloned object. + */ + clone() { + const newMetadata = new _Metadata(this.options); + const newInternalRepr = newMetadata.internalRepr; + for (const [key, value] of this.internalRepr) { + const clonedValue = value.map((v) => { + if (Buffer.isBuffer(v)) { + return Buffer.from(v); + } else { + return v; + } + }); + newInternalRepr.set(key, clonedValue); + } + return newMetadata; + } + /** + * Merges all key-value pairs from a given Metadata object into this one. + * If both this object and the given object have values in the same key, + * values from the other Metadata object will be appended to this object's + * values. + * @param other A Metadata object. + */ + merge(other) { + for (const [key, values] of other.internalRepr) { + const mergedValue = (this.internalRepr.get(key) || []).concat(values); + this.internalRepr.set(key, mergedValue); + } + } + setOptions(options2) { + this.options = options2; + } + getOptions() { + return this.options; + } + /** + * Creates an OutgoingHttpHeaders object that can be used with the http2 API. + */ + toHttp2Headers() { + const result = {}; + for (const [key, values] of this.internalRepr) { + result[key] = values.map(bufToString); + } + return result; + } + /** + * This modifies the behavior of JSON.stringify to show an object + * representation of the metadata map. + */ + toJSON() { + const result = {}; + for (const [key, values] of this.internalRepr) { + result[key] = values; + } + return result; + } + /** + * Returns a new Metadata object based fields in a given IncomingHttpHeaders + * object. + * @param headers An IncomingHttpHeaders object. + */ + static fromHttp2Headers(headers) { + const result = new _Metadata(); + for (const key of Object.keys(headers)) { + if (key.charAt(0) === ":") { + continue; + } + const values = headers[key]; + try { + if (isBinaryKey(key)) { + if (Array.isArray(values)) { + values.forEach((value) => { + result.add(key, Buffer.from(value, "base64")); + }); + } else if (values !== void 0) { + if (isCustomMetadata(key)) { + values.split(",").forEach((v) => { + result.add(key, Buffer.from(v.trim(), "base64")); + }); + } else { + result.add(key, Buffer.from(values, "base64")); + } + } + } else { + if (Array.isArray(values)) { + values.forEach((value) => { + result.add(key, value); + }); + } else if (values !== void 0) { + result.add(key, values); + } + } + } catch (error2) { + const message = `Failed to add metadata entry ${key}: ${values}. ${(0, error_1.getErrorMessage)(error2)}. For more information see https://github.com/grpc/grpc-node/issues/1173`; + (0, logging_1.log)(constants_1.LogVerbosity.ERROR, message); + } + } + return result; + } + }; + exports2.Metadata = Metadata; + var bufToString = (val) => { + return Buffer.isBuffer(val) ? val.toString("base64") : val; + }; + } +}); + +// node_modules/@grpc/grpc-js/build/src/call-credentials.js +var require_call_credentials = __commonJS({ + "node_modules/@grpc/grpc-js/build/src/call-credentials.js"(exports2) { + "use strict"; + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.CallCredentials = void 0; + var metadata_1 = require_metadata(); + function isCurrentOauth2Client(client) { + return "getRequestHeaders" in client && typeof client.getRequestHeaders === "function"; + } + var CallCredentials = class _CallCredentials { + /** + * Creates a new CallCredentials object from a given function that generates + * Metadata objects. + * @param metadataGenerator A function that accepts a set of options, and + * generates a Metadata object based on these options, which is passed back + * to the caller via a supplied (err, metadata) callback. + */ + static createFromMetadataGenerator(metadataGenerator) { + return new SingleCallCredentials(metadataGenerator); + } + /** + * Create a gRPC credential from a Google credential object. + * @param googleCredentials The authentication client to use. + * @return The resulting CallCredentials object. + */ + static createFromGoogleCredential(googleCredentials) { + return _CallCredentials.createFromMetadataGenerator((options2, callback) => { + let getHeaders; + if (isCurrentOauth2Client(googleCredentials)) { + getHeaders = googleCredentials.getRequestHeaders(options2.service_url); + } else { + getHeaders = new Promise((resolve, reject) => { + googleCredentials.getRequestMetadata(options2.service_url, (err, headers) => { + if (err) { + reject(err); + return; + } + if (!headers) { + reject(new Error("Headers not set by metadata plugin")); + return; + } + resolve(headers); + }); + }); + } + getHeaders.then((headers) => { + const metadata = new metadata_1.Metadata(); + for (const key of Object.keys(headers)) { + metadata.add(key, headers[key]); + } + callback(null, metadata); + }, (err) => { + callback(err); + }); + }); + } + static createEmpty() { + return new EmptyCallCredentials(); + } + }; + exports2.CallCredentials = CallCredentials; + var ComposedCallCredentials = class _ComposedCallCredentials extends CallCredentials { + constructor(creds) { + super(); + this.creds = creds; + } + async generateMetadata(options2) { + const base = new metadata_1.Metadata(); + const generated = await Promise.all(this.creds.map((cred) => cred.generateMetadata(options2))); + for (const gen of generated) { + base.merge(gen); + } + return base; + } + compose(other) { + return new _ComposedCallCredentials(this.creds.concat([other])); + } + _equals(other) { + if (this === other) { + return true; + } + if (other instanceof _ComposedCallCredentials) { + return this.creds.every((value, index) => value._equals(other.creds[index])); + } else { + return false; + } + } + }; + var SingleCallCredentials = class _SingleCallCredentials extends CallCredentials { + constructor(metadataGenerator) { + super(); + this.metadataGenerator = metadataGenerator; + } + generateMetadata(options2) { + return new Promise((resolve, reject) => { + this.metadataGenerator(options2, (err, metadata) => { + if (metadata !== void 0) { + resolve(metadata); + } else { + reject(err); + } + }); + }); + } + compose(other) { + return new ComposedCallCredentials([this, other]); + } + _equals(other) { + if (this === other) { + return true; + } + if (other instanceof _SingleCallCredentials) { + return this.metadataGenerator === other.metadataGenerator; + } else { + return false; + } + } + }; + var EmptyCallCredentials = class _EmptyCallCredentials extends CallCredentials { + generateMetadata(options2) { + return Promise.resolve(new metadata_1.Metadata()); + } + compose(other) { + return other; + } + _equals(other) { + return other instanceof _EmptyCallCredentials; + } + }; + } +}); + +// node_modules/@grpc/grpc-js/build/src/tls-helpers.js +var require_tls_helpers = __commonJS({ + "node_modules/@grpc/grpc-js/build/src/tls-helpers.js"(exports2) { + "use strict"; + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.getDefaultRootsData = exports2.CIPHER_SUITES = void 0; + var fs2 = require("fs"); + exports2.CIPHER_SUITES = process.env.GRPC_SSL_CIPHER_SUITES; + var DEFAULT_ROOTS_FILE_PATH = process.env.GRPC_DEFAULT_SSL_ROOTS_FILE_PATH; + var defaultRootsData = null; + function getDefaultRootsData() { + if (DEFAULT_ROOTS_FILE_PATH) { + if (defaultRootsData === null) { + defaultRootsData = fs2.readFileSync(DEFAULT_ROOTS_FILE_PATH); + } + return defaultRootsData; + } + return null; + } + exports2.getDefaultRootsData = getDefaultRootsData; + } +}); + +// node_modules/@grpc/grpc-js/build/src/channel-credentials.js +var require_channel_credentials = __commonJS({ + "node_modules/@grpc/grpc-js/build/src/channel-credentials.js"(exports2) { + "use strict"; + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.ChannelCredentials = void 0; + var tls_1 = require("tls"); + var call_credentials_1 = require_call_credentials(); + var tls_helpers_1 = require_tls_helpers(); + function verifyIsBufferOrNull(obj, friendlyName) { + if (obj && !(obj instanceof Buffer)) { + throw new TypeError(`${friendlyName}, if provided, must be a Buffer.`); + } + } + var ChannelCredentials = class { + constructor(callCredentials) { + this.callCredentials = callCredentials || call_credentials_1.CallCredentials.createEmpty(); + } + /** + * Gets the set of per-call credentials associated with this instance. + */ + _getCallCredentials() { + return this.callCredentials; + } + /** + * Return a new ChannelCredentials instance with a given set of credentials. + * The resulting instance can be used to construct a Channel that communicates + * over TLS. + * @param rootCerts The root certificate data. + * @param privateKey The client certificate private key, if available. + * @param certChain The client certificate key chain, if available. + * @param verifyOptions Additional options to modify certificate verification + */ + static createSsl(rootCerts, privateKey, certChain, verifyOptions) { + var _a2; + verifyIsBufferOrNull(rootCerts, "Root certificate"); + verifyIsBufferOrNull(privateKey, "Private key"); + verifyIsBufferOrNull(certChain, "Certificate chain"); + if (privateKey && !certChain) { + throw new Error("Private key must be given with accompanying certificate chain"); + } + if (!privateKey && certChain) { + throw new Error("Certificate chain must be given with accompanying private key"); + } + const secureContext = (0, tls_1.createSecureContext)({ + ca: (_a2 = rootCerts !== null && rootCerts !== void 0 ? rootCerts : (0, tls_helpers_1.getDefaultRootsData)()) !== null && _a2 !== void 0 ? _a2 : void 0, + key: privateKey !== null && privateKey !== void 0 ? privateKey : void 0, + cert: certChain !== null && certChain !== void 0 ? certChain : void 0, + ciphers: tls_helpers_1.CIPHER_SUITES + }); + return new SecureChannelCredentialsImpl(secureContext, verifyOptions !== null && verifyOptions !== void 0 ? verifyOptions : {}); + } + /** + * Return a new ChannelCredentials instance with credentials created using + * the provided secureContext. The resulting instances can be used to + * construct a Channel that communicates over TLS. gRPC will not override + * anything in the provided secureContext, so the environment variables + * GRPC_SSL_CIPHER_SUITES and GRPC_DEFAULT_SSL_ROOTS_FILE_PATH will + * not be applied. + * @param secureContext The return value of tls.createSecureContext() + * @param verifyOptions Additional options to modify certificate verification + */ + static createFromSecureContext(secureContext, verifyOptions) { + return new SecureChannelCredentialsImpl(secureContext, verifyOptions !== null && verifyOptions !== void 0 ? verifyOptions : {}); + } + /** + * Return a new ChannelCredentials instance with no credentials. + */ + static createInsecure() { + return new InsecureChannelCredentialsImpl(); + } + }; + exports2.ChannelCredentials = ChannelCredentials; + var InsecureChannelCredentialsImpl = class _InsecureChannelCredentialsImpl extends ChannelCredentials { + constructor(callCredentials) { + super(callCredentials); + } + compose(callCredentials) { + throw new Error("Cannot compose insecure credentials"); + } + _getConnectionOptions() { + return null; + } + _isSecure() { + return false; + } + _equals(other) { + return other instanceof _InsecureChannelCredentialsImpl; + } + }; + var SecureChannelCredentialsImpl = class _SecureChannelCredentialsImpl extends ChannelCredentials { + constructor(secureContext, verifyOptions) { + super(); + this.secureContext = secureContext; + this.verifyOptions = verifyOptions; + this.connectionOptions = { + secureContext + }; + if (verifyOptions === null || verifyOptions === void 0 ? void 0 : verifyOptions.checkServerIdentity) { + this.connectionOptions.checkServerIdentity = verifyOptions.checkServerIdentity; + } + } + compose(callCredentials) { + const combinedCallCredentials = this.callCredentials.compose(callCredentials); + return new ComposedChannelCredentialsImpl(this, combinedCallCredentials); + } + _getConnectionOptions() { + return Object.assign({}, this.connectionOptions); + } + _isSecure() { + return true; + } + _equals(other) { + if (this === other) { + return true; + } + if (other instanceof _SecureChannelCredentialsImpl) { + return this.secureContext === other.secureContext && this.verifyOptions.checkServerIdentity === other.verifyOptions.checkServerIdentity; + } else { + return false; + } + } + }; + var ComposedChannelCredentialsImpl = class _ComposedChannelCredentialsImpl extends ChannelCredentials { + constructor(channelCredentials, callCreds) { + super(callCreds); + this.channelCredentials = channelCredentials; + } + compose(callCredentials) { + const combinedCallCredentials = this.callCredentials.compose(callCredentials); + return new _ComposedChannelCredentialsImpl(this.channelCredentials, combinedCallCredentials); + } + _getConnectionOptions() { + return this.channelCredentials._getConnectionOptions(); + } + _isSecure() { + return true; + } + _equals(other) { + if (this === other) { + return true; + } + if (other instanceof _ComposedChannelCredentialsImpl) { + return this.channelCredentials._equals(other.channelCredentials) && this.callCredentials._equals(other.callCredentials); + } else { + return false; + } + } + }; + } +}); + +// node_modules/@grpc/grpc-js/build/src/load-balancer.js +var require_load_balancer = __commonJS({ + "node_modules/@grpc/grpc-js/build/src/load-balancer.js"(exports2) { + "use strict"; + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.validateLoadBalancingConfig = exports2.getFirstUsableConfig = exports2.isLoadBalancerNameRegistered = exports2.createLoadBalancer = exports2.registerDefaultLoadBalancerType = exports2.registerLoadBalancerType = exports2.createChildChannelControlHelper = void 0; + function createChildChannelControlHelper(parent, overrides) { + var _a2, _b, _c2, _d, _e2, _f, _g, _h, _j, _k; + return { + createSubchannel: (_b = (_a2 = overrides.createSubchannel) === null || _a2 === void 0 ? void 0 : _a2.bind(overrides)) !== null && _b !== void 0 ? _b : parent.createSubchannel.bind(parent), + updateState: (_d = (_c2 = overrides.updateState) === null || _c2 === void 0 ? void 0 : _c2.bind(overrides)) !== null && _d !== void 0 ? _d : parent.updateState.bind(parent), + requestReresolution: (_f = (_e2 = overrides.requestReresolution) === null || _e2 === void 0 ? void 0 : _e2.bind(overrides)) !== null && _f !== void 0 ? _f : parent.requestReresolution.bind(parent), + addChannelzChild: (_h = (_g = overrides.addChannelzChild) === null || _g === void 0 ? void 0 : _g.bind(overrides)) !== null && _h !== void 0 ? _h : parent.addChannelzChild.bind(parent), + removeChannelzChild: (_k = (_j = overrides.removeChannelzChild) === null || _j === void 0 ? void 0 : _j.bind(overrides)) !== null && _k !== void 0 ? _k : parent.removeChannelzChild.bind(parent) + }; + } + exports2.createChildChannelControlHelper = createChildChannelControlHelper; + var registeredLoadBalancerTypes = {}; + var defaultLoadBalancerType = null; + function registerLoadBalancerType(typeName, loadBalancerType, loadBalancingConfigType) { + registeredLoadBalancerTypes[typeName] = { + LoadBalancer: loadBalancerType, + LoadBalancingConfig: loadBalancingConfigType + }; + } + exports2.registerLoadBalancerType = registerLoadBalancerType; + function registerDefaultLoadBalancerType(typeName) { + defaultLoadBalancerType = typeName; + } + exports2.registerDefaultLoadBalancerType = registerDefaultLoadBalancerType; + function createLoadBalancer(config2, channelControlHelper) { + const typeName = config2.getLoadBalancerName(); + if (typeName in registeredLoadBalancerTypes) { + return new registeredLoadBalancerTypes[typeName].LoadBalancer(channelControlHelper); + } else { + return null; + } + } + exports2.createLoadBalancer = createLoadBalancer; + function isLoadBalancerNameRegistered(typeName) { + return typeName in registeredLoadBalancerTypes; + } + exports2.isLoadBalancerNameRegistered = isLoadBalancerNameRegistered; + function getFirstUsableConfig(configs, fallbackTodefault = false) { + for (const config2 of configs) { + if (config2.getLoadBalancerName() in registeredLoadBalancerTypes) { + return config2; + } + } + if (fallbackTodefault) { + if (defaultLoadBalancerType) { + return new registeredLoadBalancerTypes[defaultLoadBalancerType].LoadBalancingConfig(); + } else { + return null; + } + } else { + return null; + } + } + exports2.getFirstUsableConfig = getFirstUsableConfig; + function validateLoadBalancingConfig(obj) { + if (!(obj !== null && typeof obj === "object")) { + throw new Error("Load balancing config must be an object"); + } + const keys = Object.keys(obj); + if (keys.length !== 1) { + throw new Error("Provided load balancing config has multiple conflicting entries"); + } + const typeName = keys[0]; + if (typeName in registeredLoadBalancerTypes) { + return registeredLoadBalancerTypes[typeName].LoadBalancingConfig.createFromJson(obj[typeName]); + } else { + throw new Error(`Unrecognized load balancing config name ${typeName}`); + } + } + exports2.validateLoadBalancingConfig = validateLoadBalancingConfig; + } +}); + +// node_modules/@grpc/grpc-js/build/src/service-config.js +var require_service_config = __commonJS({ + "node_modules/@grpc/grpc-js/build/src/service-config.js"(exports2) { + "use strict"; + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.extractAndSelectServiceConfig = exports2.validateServiceConfig = exports2.validateRetryThrottling = void 0; + var os2 = require("os"); + var constants_1 = require_constants(); + var load_balancer_1 = require_load_balancer(); + var DURATION_REGEX = /^\d+(\.\d{1,9})?s$/; + var CLIENT_LANGUAGE_STRING = "node"; + function validateName(obj) { + if (!("service" in obj) || typeof obj.service !== "string") { + throw new Error("Invalid method config name: invalid service"); + } + const result = { + service: obj.service + }; + if ("method" in obj) { + if (typeof obj.method === "string") { + result.method = obj.method; + } else { + throw new Error("Invalid method config name: invalid method"); + } + } + return result; + } + function validateRetryPolicy(obj) { + if (!("maxAttempts" in obj) || !Number.isInteger(obj.maxAttempts) || obj.maxAttempts < 2) { + throw new Error("Invalid method config retry policy: maxAttempts must be an integer at least 2"); + } + if (!("initialBackoff" in obj) || typeof obj.initialBackoff !== "string" || !DURATION_REGEX.test(obj.initialBackoff)) { + throw new Error("Invalid method config retry policy: initialBackoff must be a string consisting of a positive integer followed by s"); + } + if (!("maxBackoff" in obj) || typeof obj.maxBackoff !== "string" || !DURATION_REGEX.test(obj.maxBackoff)) { + throw new Error("Invalid method config retry policy: maxBackoff must be a string consisting of a positive integer followed by s"); + } + if (!("backoffMultiplier" in obj) || typeof obj.backoffMultiplier !== "number" || obj.backoffMultiplier <= 0) { + throw new Error("Invalid method config retry policy: backoffMultiplier must be a number greater than 0"); + } + if (!("retryableStatusCodes" in obj && Array.isArray(obj.retryableStatusCodes))) { + throw new Error("Invalid method config retry policy: retryableStatusCodes is required"); + } + if (obj.retryableStatusCodes.length === 0) { + throw new Error("Invalid method config retry policy: retryableStatusCodes must be non-empty"); + } + for (const value of obj.retryableStatusCodes) { + if (typeof value === "number") { + if (!Object.values(constants_1.Status).includes(value)) { + throw new Error("Invalid method config retry policy: retryableStatusCodes value not in status code range"); + } + } else if (typeof value === "string") { + if (!Object.values(constants_1.Status).includes(value.toUpperCase())) { + throw new Error("Invalid method config retry policy: retryableStatusCodes value not a status code name"); + } + } else { + throw new Error("Invalid method config retry policy: retryableStatusCodes value must be a string or number"); + } + } + return { + maxAttempts: obj.maxAttempts, + initialBackoff: obj.initialBackoff, + maxBackoff: obj.maxBackoff, + backoffMultiplier: obj.backoffMultiplier, + retryableStatusCodes: obj.retryableStatusCodes + }; + } + function validateHedgingPolicy(obj) { + if (!("maxAttempts" in obj) || !Number.isInteger(obj.maxAttempts) || obj.maxAttempts < 2) { + throw new Error("Invalid method config hedging policy: maxAttempts must be an integer at least 2"); + } + if ("hedgingDelay" in obj && (typeof obj.hedgingDelay !== "string" || !DURATION_REGEX.test(obj.hedgingDelay))) { + throw new Error("Invalid method config hedging policy: hedgingDelay must be a string consisting of a positive integer followed by s"); + } + if ("nonFatalStatusCodes" in obj && Array.isArray(obj.nonFatalStatusCodes)) { + for (const value of obj.nonFatalStatusCodes) { + if (typeof value === "number") { + if (!Object.values(constants_1.Status).includes(value)) { + throw new Error("Invlid method config hedging policy: nonFatalStatusCodes value not in status code range"); + } + } else if (typeof value === "string") { + if (!Object.values(constants_1.Status).includes(value.toUpperCase())) { + throw new Error("Invlid method config hedging policy: nonFatalStatusCodes value not a status code name"); + } + } else { + throw new Error("Invlid method config hedging policy: nonFatalStatusCodes value must be a string or number"); + } + } + } + const result = { + maxAttempts: obj.maxAttempts + }; + if (obj.hedgingDelay) { + result.hedgingDelay = obj.hedgingDelay; + } + if (obj.nonFatalStatusCodes) { + result.nonFatalStatusCodes = obj.nonFatalStatusCodes; + } + return result; + } + function validateMethodConfig(obj) { + var _a2; + const result = { + name: [] + }; + if (!("name" in obj) || !Array.isArray(obj.name)) { + throw new Error("Invalid method config: invalid name array"); + } + for (const name of obj.name) { + result.name.push(validateName(name)); + } + if ("waitForReady" in obj) { + if (typeof obj.waitForReady !== "boolean") { + throw new Error("Invalid method config: invalid waitForReady"); + } + result.waitForReady = obj.waitForReady; + } + if ("timeout" in obj) { + if (typeof obj.timeout === "object") { + if (!("seconds" in obj.timeout) || !(typeof obj.timeout.seconds === "number")) { + throw new Error("Invalid method config: invalid timeout.seconds"); + } + if (!("nanos" in obj.timeout) || !(typeof obj.timeout.nanos === "number")) { + throw new Error("Invalid method config: invalid timeout.nanos"); + } + result.timeout = obj.timeout; + } else if (typeof obj.timeout === "string" && DURATION_REGEX.test(obj.timeout)) { + const timeoutParts = obj.timeout.substring(0, obj.timeout.length - 1).split("."); + result.timeout = { + seconds: timeoutParts[0] | 0, + nanos: ((_a2 = timeoutParts[1]) !== null && _a2 !== void 0 ? _a2 : 0) | 0 + }; + } else { + throw new Error("Invalid method config: invalid timeout"); + } + } + if ("maxRequestBytes" in obj) { + if (typeof obj.maxRequestBytes !== "number") { + throw new Error("Invalid method config: invalid maxRequestBytes"); + } + result.maxRequestBytes = obj.maxRequestBytes; + } + if ("maxResponseBytes" in obj) { + if (typeof obj.maxResponseBytes !== "number") { + throw new Error("Invalid method config: invalid maxRequestBytes"); + } + result.maxResponseBytes = obj.maxResponseBytes; + } + if ("retryPolicy" in obj) { + if ("hedgingPolicy" in obj) { + throw new Error("Invalid method config: retryPolicy and hedgingPolicy cannot both be specified"); + } else { + result.retryPolicy = validateRetryPolicy(obj.retryPolicy); + } + } else if ("hedgingPolicy" in obj) { + result.hedgingPolicy = validateHedgingPolicy(obj.hedgingPolicy); + } + return result; + } + function validateRetryThrottling(obj) { + if (!("maxTokens" in obj) || typeof obj.maxTokens !== "number" || obj.maxTokens <= 0 || obj.maxTokens > 1e3) { + throw new Error("Invalid retryThrottling: maxTokens must be a number in (0, 1000]"); + } + if (!("tokenRatio" in obj) || typeof obj.tokenRatio !== "number" || obj.tokenRatio <= 0) { + throw new Error("Invalid retryThrottling: tokenRatio must be a number greater than 0"); + } + return { + maxTokens: +obj.maxTokens.toFixed(3), + tokenRatio: +obj.tokenRatio.toFixed(3) + }; + } + exports2.validateRetryThrottling = validateRetryThrottling; + function validateServiceConfig(obj) { + const result = { + loadBalancingConfig: [], + methodConfig: [] + }; + if ("loadBalancingPolicy" in obj) { + if (typeof obj.loadBalancingPolicy === "string") { + result.loadBalancingPolicy = obj.loadBalancingPolicy; + } else { + throw new Error("Invalid service config: invalid loadBalancingPolicy"); + } + } + if ("loadBalancingConfig" in obj) { + if (Array.isArray(obj.loadBalancingConfig)) { + for (const config2 of obj.loadBalancingConfig) { + result.loadBalancingConfig.push((0, load_balancer_1.validateLoadBalancingConfig)(config2)); + } + } else { + throw new Error("Invalid service config: invalid loadBalancingConfig"); + } + } + if ("methodConfig" in obj) { + if (Array.isArray(obj.methodConfig)) { + for (const methodConfig of obj.methodConfig) { + result.methodConfig.push(validateMethodConfig(methodConfig)); + } + } + } + if ("retryThrottling" in obj) { + result.retryThrottling = validateRetryThrottling(obj.retryThrottling); + } + const seenMethodNames = []; + for (const methodConfig of result.methodConfig) { + for (const name of methodConfig.name) { + for (const seenName of seenMethodNames) { + if (name.service === seenName.service && name.method === seenName.method) { + throw new Error(`Invalid service config: duplicate name ${name.service}/${name.method}`); + } + } + seenMethodNames.push(name); + } + } + return result; + } + exports2.validateServiceConfig = validateServiceConfig; + function validateCanaryConfig(obj) { + if (!("serviceConfig" in obj)) { + throw new Error("Invalid service config choice: missing service config"); + } + const result = { + serviceConfig: validateServiceConfig(obj.serviceConfig) + }; + if ("clientLanguage" in obj) { + if (Array.isArray(obj.clientLanguage)) { + result.clientLanguage = []; + for (const lang of obj.clientLanguage) { + if (typeof lang === "string") { + result.clientLanguage.push(lang); + } else { + throw new Error("Invalid service config choice: invalid clientLanguage"); + } + } + } else { + throw new Error("Invalid service config choice: invalid clientLanguage"); + } + } + if ("clientHostname" in obj) { + if (Array.isArray(obj.clientHostname)) { + result.clientHostname = []; + for (const lang of obj.clientHostname) { + if (typeof lang === "string") { + result.clientHostname.push(lang); + } else { + throw new Error("Invalid service config choice: invalid clientHostname"); + } + } + } else { + throw new Error("Invalid service config choice: invalid clientHostname"); + } + } + if ("percentage" in obj) { + if (typeof obj.percentage === "number" && 0 <= obj.percentage && obj.percentage <= 100) { + result.percentage = obj.percentage; + } else { + throw new Error("Invalid service config choice: invalid percentage"); + } + } + const allowedFields = [ + "clientLanguage", + "percentage", + "clientHostname", + "serviceConfig" + ]; + for (const field in obj) { + if (!allowedFields.includes(field)) { + throw new Error(`Invalid service config choice: unexpected field ${field}`); + } + } + return result; + } + function validateAndSelectCanaryConfig(obj, percentage) { + if (!Array.isArray(obj)) { + throw new Error("Invalid service config list"); + } + for (const config2 of obj) { + const validatedConfig = validateCanaryConfig(config2); + if (typeof validatedConfig.percentage === "number" && percentage > validatedConfig.percentage) { + continue; + } + if (Array.isArray(validatedConfig.clientHostname)) { + let hostnameMatched = false; + for (const hostname of validatedConfig.clientHostname) { + if (hostname === os2.hostname()) { + hostnameMatched = true; + } + } + if (!hostnameMatched) { + continue; + } + } + if (Array.isArray(validatedConfig.clientLanguage)) { + let languageMatched = false; + for (const language of validatedConfig.clientLanguage) { + if (language === CLIENT_LANGUAGE_STRING) { + languageMatched = true; + } + } + if (!languageMatched) { + continue; + } + } + return validatedConfig.serviceConfig; + } + throw new Error("No matching service config found"); + } + function extractAndSelectServiceConfig(txtRecord, percentage) { + for (const record of txtRecord) { + if (record.length > 0 && record[0].startsWith("grpc_config=")) { + const recordString = record.join("").substring("grpc_config=".length); + const recordJson = JSON.parse(recordString); + return validateAndSelectCanaryConfig(recordJson, percentage); + } + } + return null; + } + exports2.extractAndSelectServiceConfig = extractAndSelectServiceConfig; + } +}); + +// node_modules/@grpc/grpc-js/build/src/connectivity-state.js +var require_connectivity_state = __commonJS({ + "node_modules/@grpc/grpc-js/build/src/connectivity-state.js"(exports2) { + "use strict"; + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.ConnectivityState = void 0; + var ConnectivityState; + (function(ConnectivityState2) { + ConnectivityState2[ConnectivityState2["IDLE"] = 0] = "IDLE"; + ConnectivityState2[ConnectivityState2["CONNECTING"] = 1] = "CONNECTING"; + ConnectivityState2[ConnectivityState2["READY"] = 2] = "READY"; + ConnectivityState2[ConnectivityState2["TRANSIENT_FAILURE"] = 3] = "TRANSIENT_FAILURE"; + ConnectivityState2[ConnectivityState2["SHUTDOWN"] = 4] = "SHUTDOWN"; + })(ConnectivityState || (exports2.ConnectivityState = ConnectivityState = {})); + } +}); + +// node_modules/@grpc/grpc-js/build/src/uri-parser.js +var require_uri_parser = __commonJS({ + "node_modules/@grpc/grpc-js/build/src/uri-parser.js"(exports2) { + "use strict"; + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.uriToString = exports2.splitHostPort = exports2.parseUri = void 0; + var URI_REGEX = /^(?:([A-Za-z0-9+.-]+):)?(?:\/\/([^/]*)\/)?(.+)$/; + function parseUri(uriString) { + const parsedUri = URI_REGEX.exec(uriString); + if (parsedUri === null) { + return null; + } + return { + scheme: parsedUri[1], + authority: parsedUri[2], + path: parsedUri[3] + }; + } + exports2.parseUri = parseUri; + var NUMBER_REGEX = /^\d+$/; + function splitHostPort(path) { + if (path.startsWith("[")) { + const hostEnd = path.indexOf("]"); + if (hostEnd === -1) { + return null; + } + const host = path.substring(1, hostEnd); + if (host.indexOf(":") === -1) { + return null; + } + if (path.length > hostEnd + 1) { + if (path[hostEnd + 1] === ":") { + const portString = path.substring(hostEnd + 2); + if (NUMBER_REGEX.test(portString)) { + return { + host, + port: +portString + }; + } else { + return null; + } + } else { + return null; + } + } else { + return { + host + }; + } + } else { + const splitPath = path.split(":"); + if (splitPath.length === 2) { + if (NUMBER_REGEX.test(splitPath[1])) { + return { + host: splitPath[0], + port: +splitPath[1] + }; + } else { + return null; + } + } else { + return { + host: path + }; + } + } + } + exports2.splitHostPort = splitHostPort; + function uriToString(uri) { + let result = ""; + if (uri.scheme !== void 0) { + result += uri.scheme + ":"; + } + if (uri.authority !== void 0) { + result += "//" + uri.authority + "/"; + } + result += uri.path; + return result; + } + exports2.uriToString = uriToString; + } +}); + +// node_modules/@grpc/grpc-js/build/src/resolver.js +var require_resolver = __commonJS({ + "node_modules/@grpc/grpc-js/build/src/resolver.js"(exports2) { + "use strict"; + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.mapUriDefaultScheme = exports2.getDefaultAuthority = exports2.createResolver = exports2.registerDefaultScheme = exports2.registerResolver = void 0; + var uri_parser_1 = require_uri_parser(); + var registeredResolvers = {}; + var defaultScheme = null; + function registerResolver(scheme, resolverClass) { + registeredResolvers[scheme] = resolverClass; + } + exports2.registerResolver = registerResolver; + function registerDefaultScheme(scheme) { + defaultScheme = scheme; + } + exports2.registerDefaultScheme = registerDefaultScheme; + function createResolver(target, listener, options2) { + if (target.scheme !== void 0 && target.scheme in registeredResolvers) { + return new registeredResolvers[target.scheme](target, listener, options2); + } else { + throw new Error(`No resolver could be created for target ${(0, uri_parser_1.uriToString)(target)}`); + } + } + exports2.createResolver = createResolver; + function getDefaultAuthority(target) { + if (target.scheme !== void 0 && target.scheme in registeredResolvers) { + return registeredResolvers[target.scheme].getDefaultAuthority(target); + } else { + throw new Error(`Invalid target ${(0, uri_parser_1.uriToString)(target)}`); + } + } + exports2.getDefaultAuthority = getDefaultAuthority; + function mapUriDefaultScheme(target) { + if (target.scheme === void 0 || !(target.scheme in registeredResolvers)) { + if (defaultScheme !== null) { + return { + scheme: defaultScheme, + authority: void 0, + path: (0, uri_parser_1.uriToString)(target) + }; + } else { + return null; + } + } + return target; + } + exports2.mapUriDefaultScheme = mapUriDefaultScheme; + } +}); + +// node_modules/@grpc/grpc-js/build/src/picker.js +var require_picker = __commonJS({ + "node_modules/@grpc/grpc-js/build/src/picker.js"(exports2) { + "use strict"; + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.QueuePicker = exports2.UnavailablePicker = exports2.PickResultType = void 0; + var metadata_1 = require_metadata(); + var constants_1 = require_constants(); + var PickResultType; + (function(PickResultType2) { + PickResultType2[PickResultType2["COMPLETE"] = 0] = "COMPLETE"; + PickResultType2[PickResultType2["QUEUE"] = 1] = "QUEUE"; + PickResultType2[PickResultType2["TRANSIENT_FAILURE"] = 2] = "TRANSIENT_FAILURE"; + PickResultType2[PickResultType2["DROP"] = 3] = "DROP"; + })(PickResultType || (exports2.PickResultType = PickResultType = {})); + var UnavailablePicker = class { + constructor(status2) { + if (status2 !== void 0) { + this.status = status2; + } else { + this.status = { + code: constants_1.Status.UNAVAILABLE, + details: "No connection established", + metadata: new metadata_1.Metadata() + }; + } + } + pick(pickArgs) { + return { + pickResultType: PickResultType.TRANSIENT_FAILURE, + subchannel: null, + status: this.status, + onCallStarted: null, + onCallEnded: null + }; + } + }; + exports2.UnavailablePicker = UnavailablePicker; + var QueuePicker = class { + // Constructed with a load balancer. Calls exitIdle on it the first time pick is called + constructor(loadBalancer) { + this.loadBalancer = loadBalancer; + this.calledExitIdle = false; + } + pick(pickArgs) { + if (!this.calledExitIdle) { + process.nextTick(() => { + this.loadBalancer.exitIdle(); + }); + this.calledExitIdle = true; + } + return { + pickResultType: PickResultType.QUEUE, + subchannel: null, + status: null, + onCallStarted: null, + onCallEnded: null + }; + } + }; + exports2.QueuePicker = QueuePicker; + } +}); + +// node_modules/@grpc/grpc-js/build/src/backoff-timeout.js +var require_backoff_timeout = __commonJS({ + "node_modules/@grpc/grpc-js/build/src/backoff-timeout.js"(exports2) { + "use strict"; + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.BackoffTimeout = void 0; + var INITIAL_BACKOFF_MS = 1e3; + var BACKOFF_MULTIPLIER = 1.6; + var MAX_BACKOFF_MS = 12e4; + var BACKOFF_JITTER = 0.2; + function uniformRandom(min, max) { + return Math.random() * (max - min) + min; + } + var BackoffTimeout = class { + constructor(callback, options2) { + this.callback = callback; + this.initialDelay = INITIAL_BACKOFF_MS; + this.multiplier = BACKOFF_MULTIPLIER; + this.maxDelay = MAX_BACKOFF_MS; + this.jitter = BACKOFF_JITTER; + this.running = false; + this.hasRef = true; + this.startTime = /* @__PURE__ */ new Date(); + if (options2) { + if (options2.initialDelay) { + this.initialDelay = options2.initialDelay; + } + if (options2.multiplier) { + this.multiplier = options2.multiplier; + } + if (options2.jitter) { + this.jitter = options2.jitter; + } + if (options2.maxDelay) { + this.maxDelay = options2.maxDelay; + } + } + this.nextDelay = this.initialDelay; + this.timerId = setTimeout(() => { + }, 0); + clearTimeout(this.timerId); + } + runTimer(delay) { + var _a2, _b; + clearTimeout(this.timerId); + this.timerId = setTimeout(() => { + this.callback(); + this.running = false; + }, delay); + if (!this.hasRef) { + (_b = (_a2 = this.timerId).unref) === null || _b === void 0 ? void 0 : _b.call(_a2); + } + } + /** + * Call the callback after the current amount of delay time + */ + runOnce() { + this.running = true; + this.startTime = /* @__PURE__ */ new Date(); + this.runTimer(this.nextDelay); + const nextBackoff = Math.min(this.nextDelay * this.multiplier, this.maxDelay); + const jitterMagnitude = nextBackoff * this.jitter; + this.nextDelay = nextBackoff + uniformRandom(-jitterMagnitude, jitterMagnitude); + } + /** + * Stop the timer. The callback will not be called until `runOnce` is called + * again. + */ + stop() { + clearTimeout(this.timerId); + this.running = false; + } + /** + * Reset the delay time to its initial value. If the timer is still running, + * retroactively apply that reset to the current timer. + */ + reset() { + this.nextDelay = this.initialDelay; + if (this.running) { + const now = /* @__PURE__ */ new Date(); + const newEndTime = this.startTime; + newEndTime.setMilliseconds(newEndTime.getMilliseconds() + this.nextDelay); + clearTimeout(this.timerId); + if (now < newEndTime) { + this.runTimer(newEndTime.getTime() - now.getTime()); + } else { + this.running = false; + } + } + } + /** + * Check whether the timer is currently running. + */ + isRunning() { + return this.running; + } + /** + * Set that while the timer is running, it should keep the Node process + * running. + */ + ref() { + var _a2, _b; + this.hasRef = true; + (_b = (_a2 = this.timerId).ref) === null || _b === void 0 ? void 0 : _b.call(_a2); + } + /** + * Set that while the timer is running, it should not keep the Node process + * running. + */ + unref() { + var _a2, _b; + this.hasRef = false; + (_b = (_a2 = this.timerId).unref) === null || _b === void 0 ? void 0 : _b.call(_a2); + } + }; + exports2.BackoffTimeout = BackoffTimeout; + } +}); + +// node_modules/@grpc/grpc-js/build/src/load-balancer-child-handler.js +var require_load_balancer_child_handler = __commonJS({ + "node_modules/@grpc/grpc-js/build/src/load-balancer-child-handler.js"(exports2) { + "use strict"; + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.ChildLoadBalancerHandler = void 0; + var load_balancer_1 = require_load_balancer(); + var connectivity_state_1 = require_connectivity_state(); + var TYPE_NAME = "child_load_balancer_helper"; + var ChildLoadBalancerHandler = class { + constructor(channelControlHelper) { + this.channelControlHelper = channelControlHelper; + this.currentChild = null; + this.pendingChild = null; + this.latestConfig = null; + this.ChildPolicyHelper = class { + constructor(parent) { + this.parent = parent; + this.child = null; + } + createSubchannel(subchannelAddress, subchannelArgs) { + return this.parent.channelControlHelper.createSubchannel(subchannelAddress, subchannelArgs); + } + updateState(connectivityState, picker) { + var _a2; + if (this.calledByPendingChild()) { + if (connectivityState === connectivity_state_1.ConnectivityState.CONNECTING) { + return; + } + (_a2 = this.parent.currentChild) === null || _a2 === void 0 ? void 0 : _a2.destroy(); + this.parent.currentChild = this.parent.pendingChild; + this.parent.pendingChild = null; + } else if (!this.calledByCurrentChild()) { + return; + } + this.parent.channelControlHelper.updateState(connectivityState, picker); + } + requestReresolution() { + var _a2; + const latestChild = (_a2 = this.parent.pendingChild) !== null && _a2 !== void 0 ? _a2 : this.parent.currentChild; + if (this.child === latestChild) { + this.parent.channelControlHelper.requestReresolution(); + } + } + setChild(newChild) { + this.child = newChild; + } + addChannelzChild(child) { + this.parent.channelControlHelper.addChannelzChild(child); + } + removeChannelzChild(child) { + this.parent.channelControlHelper.removeChannelzChild(child); + } + calledByPendingChild() { + return this.child === this.parent.pendingChild; + } + calledByCurrentChild() { + return this.child === this.parent.currentChild; + } + }; + } + configUpdateRequiresNewPolicyInstance(oldConfig, newConfig) { + return oldConfig.getLoadBalancerName() !== newConfig.getLoadBalancerName(); + } + /** + * Prerequisites: lbConfig !== null and lbConfig.name is registered + * @param addressList + * @param lbConfig + * @param attributes + */ + updateAddressList(addressList, lbConfig, attributes) { + let childToUpdate; + if (this.currentChild === null || this.latestConfig === null || this.configUpdateRequiresNewPolicyInstance(this.latestConfig, lbConfig)) { + const newHelper = new this.ChildPolicyHelper(this); + const newChild = (0, load_balancer_1.createLoadBalancer)(lbConfig, newHelper); + newHelper.setChild(newChild); + if (this.currentChild === null) { + this.currentChild = newChild; + childToUpdate = this.currentChild; + } else { + if (this.pendingChild) { + this.pendingChild.destroy(); + } + this.pendingChild = newChild; + childToUpdate = this.pendingChild; + } + } else { + if (this.pendingChild === null) { + childToUpdate = this.currentChild; + } else { + childToUpdate = this.pendingChild; + } + } + this.latestConfig = lbConfig; + childToUpdate.updateAddressList(addressList, lbConfig, attributes); + } + exitIdle() { + if (this.currentChild) { + this.currentChild.exitIdle(); + if (this.pendingChild) { + this.pendingChild.exitIdle(); + } + } + } + resetBackoff() { + if (this.currentChild) { + this.currentChild.resetBackoff(); + if (this.pendingChild) { + this.pendingChild.resetBackoff(); + } + } + } + destroy() { + if (this.currentChild) { + this.currentChild.destroy(); + this.currentChild = null; + } + if (this.pendingChild) { + this.pendingChild.destroy(); + this.pendingChild = null; + } + } + getTypeName() { + return TYPE_NAME; + } + }; + exports2.ChildLoadBalancerHandler = ChildLoadBalancerHandler; + } +}); + +// node_modules/@grpc/grpc-js/build/src/resolving-load-balancer.js +var require_resolving_load_balancer = __commonJS({ + "node_modules/@grpc/grpc-js/build/src/resolving-load-balancer.js"(exports2) { + "use strict"; + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.ResolvingLoadBalancer = void 0; + var load_balancer_1 = require_load_balancer(); + var service_config_1 = require_service_config(); + var connectivity_state_1 = require_connectivity_state(); + var resolver_1 = require_resolver(); + var picker_1 = require_picker(); + var backoff_timeout_1 = require_backoff_timeout(); + var constants_1 = require_constants(); + var metadata_1 = require_metadata(); + var logging = require_logging(); + var constants_2 = require_constants(); + var uri_parser_1 = require_uri_parser(); + var load_balancer_child_handler_1 = require_load_balancer_child_handler(); + var TRACER_NAME = "resolving_load_balancer"; + function trace(text) { + logging.trace(constants_2.LogVerbosity.DEBUG, TRACER_NAME, text); + } + function getDefaultConfigSelector(serviceConfig) { + return function defaultConfigSelector(methodName, metadata) { + var _a2, _b; + const splitName = methodName.split("/").filter((x) => x.length > 0); + const service = (_a2 = splitName[0]) !== null && _a2 !== void 0 ? _a2 : ""; + const method = (_b = splitName[1]) !== null && _b !== void 0 ? _b : ""; + if (serviceConfig && serviceConfig.methodConfig) { + for (const methodConfig of serviceConfig.methodConfig) { + for (const name of methodConfig.name) { + if (name.service === service && (name.method === void 0 || name.method === method)) { + return { + methodConfig, + pickInformation: {}, + status: constants_1.Status.OK, + dynamicFilterFactories: [] + }; + } + } + } + } + return { + methodConfig: { name: [] }, + pickInformation: {}, + status: constants_1.Status.OK, + dynamicFilterFactories: [] + }; + }; + } + var ResolvingLoadBalancer = class { + /** + * Wrapper class that behaves like a `LoadBalancer` and also handles name + * resolution internally. + * @param target The address of the backend to connect to. + * @param channelControlHelper `ChannelControlHelper` instance provided by + * this load balancer's owner. + * @param defaultServiceConfig The default service configuration to be used + * if none is provided by the name resolver. A `null` value indicates + * that the default behavior should be the default unconfigured behavior. + * In practice, that means using the "pick first" load balancer + * implmentation + */ + constructor(target, channelControlHelper, channelOptions, onSuccessfulResolution, onFailedResolution) { + this.target = target; + this.channelControlHelper = channelControlHelper; + this.onSuccessfulResolution = onSuccessfulResolution; + this.onFailedResolution = onFailedResolution; + this.latestChildState = connectivity_state_1.ConnectivityState.IDLE; + this.latestChildPicker = new picker_1.QueuePicker(this); + this.currentState = connectivity_state_1.ConnectivityState.IDLE; + this.previousServiceConfig = null; + this.continueResolving = false; + if (channelOptions["grpc.service_config"]) { + this.defaultServiceConfig = (0, service_config_1.validateServiceConfig)(JSON.parse(channelOptions["grpc.service_config"])); + } else { + this.defaultServiceConfig = { + loadBalancingConfig: [], + methodConfig: [] + }; + } + this.updateState(connectivity_state_1.ConnectivityState.IDLE, new picker_1.QueuePicker(this)); + this.childLoadBalancer = new load_balancer_child_handler_1.ChildLoadBalancerHandler({ + createSubchannel: channelControlHelper.createSubchannel.bind(channelControlHelper), + requestReresolution: () => { + if (this.backoffTimeout.isRunning()) { + this.continueResolving = true; + } else { + this.updateResolution(); + } + }, + updateState: (newState, picker) => { + this.latestChildState = newState; + this.latestChildPicker = picker; + this.updateState(newState, picker); + }, + addChannelzChild: channelControlHelper.addChannelzChild.bind(channelControlHelper), + removeChannelzChild: channelControlHelper.removeChannelzChild.bind(channelControlHelper) + }); + this.innerResolver = (0, resolver_1.createResolver)(target, { + onSuccessfulResolution: (addressList, serviceConfig, serviceConfigError, configSelector, attributes) => { + var _a2; + let workingServiceConfig = null; + if (serviceConfig === null) { + if (serviceConfigError === null) { + this.previousServiceConfig = null; + workingServiceConfig = this.defaultServiceConfig; + } else { + if (this.previousServiceConfig === null) { + this.handleResolutionFailure(serviceConfigError); + } else { + workingServiceConfig = this.previousServiceConfig; + } + } + } else { + workingServiceConfig = serviceConfig; + this.previousServiceConfig = serviceConfig; + } + const workingConfigList = (_a2 = workingServiceConfig === null || workingServiceConfig === void 0 ? void 0 : workingServiceConfig.loadBalancingConfig) !== null && _a2 !== void 0 ? _a2 : []; + const loadBalancingConfig = (0, load_balancer_1.getFirstUsableConfig)(workingConfigList, true); + if (loadBalancingConfig === null) { + this.handleResolutionFailure({ + code: constants_1.Status.UNAVAILABLE, + details: "All load balancer options in service config are not compatible", + metadata: new metadata_1.Metadata() + }); + return; + } + this.childLoadBalancer.updateAddressList(addressList, loadBalancingConfig, attributes); + const finalServiceConfig = workingServiceConfig !== null && workingServiceConfig !== void 0 ? workingServiceConfig : this.defaultServiceConfig; + this.onSuccessfulResolution(finalServiceConfig, configSelector !== null && configSelector !== void 0 ? configSelector : getDefaultConfigSelector(finalServiceConfig)); + }, + onError: (error2) => { + this.handleResolutionFailure(error2); + } + }, channelOptions); + const backoffOptions = { + initialDelay: channelOptions["grpc.initial_reconnect_backoff_ms"], + maxDelay: channelOptions["grpc.max_reconnect_backoff_ms"] + }; + this.backoffTimeout = new backoff_timeout_1.BackoffTimeout(() => { + if (this.continueResolving) { + this.updateResolution(); + this.continueResolving = false; + } else { + this.updateState(this.latestChildState, this.latestChildPicker); + } + }, backoffOptions); + this.backoffTimeout.unref(); + } + updateResolution() { + this.innerResolver.updateResolution(); + if (this.currentState === connectivity_state_1.ConnectivityState.IDLE) { + this.updateState(connectivity_state_1.ConnectivityState.CONNECTING, new picker_1.QueuePicker(this)); + } + this.backoffTimeout.runOnce(); + } + updateState(connectivityState, picker) { + trace((0, uri_parser_1.uriToString)(this.target) + " " + connectivity_state_1.ConnectivityState[this.currentState] + " -> " + connectivity_state_1.ConnectivityState[connectivityState]); + if (connectivityState === connectivity_state_1.ConnectivityState.IDLE) { + picker = new picker_1.QueuePicker(this); + } + this.currentState = connectivityState; + this.channelControlHelper.updateState(connectivityState, picker); + } + handleResolutionFailure(error2) { + if (this.latestChildState === connectivity_state_1.ConnectivityState.IDLE) { + this.updateState(connectivity_state_1.ConnectivityState.TRANSIENT_FAILURE, new picker_1.UnavailablePicker(error2)); + this.onFailedResolution(error2); + } + } + exitIdle() { + if (this.currentState === connectivity_state_1.ConnectivityState.IDLE || this.currentState === connectivity_state_1.ConnectivityState.TRANSIENT_FAILURE) { + if (this.backoffTimeout.isRunning()) { + this.continueResolving = true; + } else { + this.updateResolution(); + } + } + this.childLoadBalancer.exitIdle(); + } + updateAddressList(addressList, lbConfig) { + throw new Error("updateAddressList not supported on ResolvingLoadBalancer"); + } + resetBackoff() { + this.backoffTimeout.reset(); + this.childLoadBalancer.resetBackoff(); + } + destroy() { + this.childLoadBalancer.destroy(); + this.innerResolver.destroy(); + this.backoffTimeout.reset(); + this.backoffTimeout.stop(); + this.latestChildState = connectivity_state_1.ConnectivityState.IDLE; + this.latestChildPicker = new picker_1.QueuePicker(this); + this.currentState = connectivity_state_1.ConnectivityState.IDLE; + this.previousServiceConfig = null; + this.continueResolving = false; + } + getTypeName() { + return "resolving_load_balancer"; + } + }; + exports2.ResolvingLoadBalancer = ResolvingLoadBalancer; + } +}); + +// node_modules/@grpc/grpc-js/build/src/channel-options.js +var require_channel_options = __commonJS({ + "node_modules/@grpc/grpc-js/build/src/channel-options.js"(exports2) { + "use strict"; + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.channelOptionsEqual = exports2.recognizedOptions = void 0; + exports2.recognizedOptions = { + "grpc.ssl_target_name_override": true, + "grpc.primary_user_agent": true, + "grpc.secondary_user_agent": true, + "grpc.default_authority": true, + "grpc.keepalive_time_ms": true, + "grpc.keepalive_timeout_ms": true, + "grpc.keepalive_permit_without_calls": true, + "grpc.service_config": true, + "grpc.max_concurrent_streams": true, + "grpc.initial_reconnect_backoff_ms": true, + "grpc.max_reconnect_backoff_ms": true, + "grpc.use_local_subchannel_pool": true, + "grpc.max_send_message_length": true, + "grpc.max_receive_message_length": true, + "grpc.enable_http_proxy": true, + "grpc.enable_channelz": true, + "grpc.dns_min_time_between_resolutions_ms": true, + "grpc.enable_retries": true, + "grpc.per_rpc_retry_buffer_size": true, + "grpc.retry_buffer_size": true, + "grpc.max_connection_age_ms": true, + "grpc.max_connection_age_grace_ms": true, + "grpc-node.max_session_memory": true, + "grpc.service_config_disable_resolution": true, + "grpc.client_idle_timeout_ms": true, + "grpc-node.tls_enable_trace": true + }; + function channelOptionsEqual(options1, options2) { + const keys1 = Object.keys(options1).sort(); + const keys2 = Object.keys(options2).sort(); + if (keys1.length !== keys2.length) { + return false; + } + for (let i = 0; i < keys1.length; i += 1) { + if (keys1[i] !== keys2[i]) { + return false; + } + if (options1[keys1[i]] !== options2[keys2[i]]) { + return false; + } + } + return true; + } + exports2.channelOptionsEqual = channelOptionsEqual; + } +}); + +// node_modules/@grpc/grpc-js/build/src/subchannel-address.js +var require_subchannel_address = __commonJS({ + "node_modules/@grpc/grpc-js/build/src/subchannel-address.js"(exports2) { + "use strict"; + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.stringToSubchannelAddress = exports2.subchannelAddressToString = exports2.subchannelAddressEqual = exports2.isTcpSubchannelAddress = void 0; + var net_1 = require("net"); + function isTcpSubchannelAddress(address) { + return "port" in address; + } + exports2.isTcpSubchannelAddress = isTcpSubchannelAddress; + function subchannelAddressEqual(address1, address2) { + if (!address1 && !address2) { + return true; + } + if (!address1 || !address2) { + return false; + } + if (isTcpSubchannelAddress(address1)) { + return isTcpSubchannelAddress(address2) && address1.host === address2.host && address1.port === address2.port; + } else { + return !isTcpSubchannelAddress(address2) && address1.path === address2.path; + } + } + exports2.subchannelAddressEqual = subchannelAddressEqual; + function subchannelAddressToString(address) { + if (isTcpSubchannelAddress(address)) { + return address.host + ":" + address.port; + } else { + return address.path; + } + } + exports2.subchannelAddressToString = subchannelAddressToString; + var DEFAULT_PORT = 443; + function stringToSubchannelAddress(addressString, port) { + if ((0, net_1.isIP)(addressString)) { + return { + host: addressString, + port: port !== null && port !== void 0 ? port : DEFAULT_PORT + }; + } else { + return { + path: addressString + }; + } + } + exports2.stringToSubchannelAddress = stringToSubchannelAddress; + } +}); + +// node_modules/@grpc/grpc-js/build/src/admin.js +var require_admin = __commonJS({ + "node_modules/@grpc/grpc-js/build/src/admin.js"(exports2) { + "use strict"; + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.addAdminServicesToServer = exports2.registerAdminService = void 0; + var registeredAdminServices = []; + function registerAdminService(getServiceDefinition, getHandlers) { + registeredAdminServices.push({ getServiceDefinition, getHandlers }); + } + exports2.registerAdminService = registerAdminService; + function addAdminServicesToServer(server2) { + for (const { getServiceDefinition, getHandlers } of registeredAdminServices) { + server2.addService(getServiceDefinition(), getHandlers()); + } + } + exports2.addAdminServicesToServer = addAdminServicesToServer; + } +}); + +// node_modules/@grpc/grpc-js/build/src/call.js +var require_call = __commonJS({ + "node_modules/@grpc/grpc-js/build/src/call.js"(exports2) { + "use strict"; + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.ClientDuplexStreamImpl = exports2.ClientWritableStreamImpl = exports2.ClientReadableStreamImpl = exports2.ClientUnaryCallImpl = exports2.callErrorFromStatus = void 0; + var events_1 = require("events"); + var stream_1 = require("stream"); + var constants_1 = require_constants(); + function callErrorFromStatus(status2, callerStack) { + const message = `${status2.code} ${constants_1.Status[status2.code]}: ${status2.details}`; + const error2 = new Error(message); + const stack = `${error2.stack} +for call at +${callerStack}`; + return Object.assign(new Error(message), status2, { stack }); + } + exports2.callErrorFromStatus = callErrorFromStatus; + var ClientUnaryCallImpl = class extends events_1.EventEmitter { + constructor() { + super(); + } + cancel() { + var _a2; + (_a2 = this.call) === null || _a2 === void 0 ? void 0 : _a2.cancelWithStatus(constants_1.Status.CANCELLED, "Cancelled on client"); + } + getPeer() { + var _a2, _b; + return (_b = (_a2 = this.call) === null || _a2 === void 0 ? void 0 : _a2.getPeer()) !== null && _b !== void 0 ? _b : "unknown"; + } + }; + exports2.ClientUnaryCallImpl = ClientUnaryCallImpl; + var ClientReadableStreamImpl = class extends stream_1.Readable { + constructor(deserialize) { + super({ objectMode: true }); + this.deserialize = deserialize; + } + cancel() { + var _a2; + (_a2 = this.call) === null || _a2 === void 0 ? void 0 : _a2.cancelWithStatus(constants_1.Status.CANCELLED, "Cancelled on client"); + } + getPeer() { + var _a2, _b; + return (_b = (_a2 = this.call) === null || _a2 === void 0 ? void 0 : _a2.getPeer()) !== null && _b !== void 0 ? _b : "unknown"; + } + _read(_size) { + var _a2; + (_a2 = this.call) === null || _a2 === void 0 ? void 0 : _a2.startRead(); + } + }; + exports2.ClientReadableStreamImpl = ClientReadableStreamImpl; + var ClientWritableStreamImpl = class extends stream_1.Writable { + constructor(serialize) { + super({ objectMode: true }); + this.serialize = serialize; + } + cancel() { + var _a2; + (_a2 = this.call) === null || _a2 === void 0 ? void 0 : _a2.cancelWithStatus(constants_1.Status.CANCELLED, "Cancelled on client"); + } + getPeer() { + var _a2, _b; + return (_b = (_a2 = this.call) === null || _a2 === void 0 ? void 0 : _a2.getPeer()) !== null && _b !== void 0 ? _b : "unknown"; + } + _write(chunk, encoding, cb) { + var _a2; + const context = { + callback: cb + }; + const flags = Number(encoding); + if (!Number.isNaN(flags)) { + context.flags = flags; + } + (_a2 = this.call) === null || _a2 === void 0 ? void 0 : _a2.sendMessageWithContext(context, chunk); + } + _final(cb) { + var _a2; + (_a2 = this.call) === null || _a2 === void 0 ? void 0 : _a2.halfClose(); + cb(); + } + }; + exports2.ClientWritableStreamImpl = ClientWritableStreamImpl; + var ClientDuplexStreamImpl = class extends stream_1.Duplex { + constructor(serialize, deserialize) { + super({ objectMode: true }); + this.serialize = serialize; + this.deserialize = deserialize; + } + cancel() { + var _a2; + (_a2 = this.call) === null || _a2 === void 0 ? void 0 : _a2.cancelWithStatus(constants_1.Status.CANCELLED, "Cancelled on client"); + } + getPeer() { + var _a2, _b; + return (_b = (_a2 = this.call) === null || _a2 === void 0 ? void 0 : _a2.getPeer()) !== null && _b !== void 0 ? _b : "unknown"; + } + _read(_size) { + var _a2; + (_a2 = this.call) === null || _a2 === void 0 ? void 0 : _a2.startRead(); + } + _write(chunk, encoding, cb) { + var _a2; + const context = { + callback: cb + }; + const flags = Number(encoding); + if (!Number.isNaN(flags)) { + context.flags = flags; + } + (_a2 = this.call) === null || _a2 === void 0 ? void 0 : _a2.sendMessageWithContext(context, chunk); + } + _final(cb) { + var _a2; + (_a2 = this.call) === null || _a2 === void 0 ? void 0 : _a2.halfClose(); + cb(); + } + }; + exports2.ClientDuplexStreamImpl = ClientDuplexStreamImpl; + } +}); + +// node_modules/@grpc/grpc-js/build/src/call-interface.js +var require_call_interface = __commonJS({ + "node_modules/@grpc/grpc-js/build/src/call-interface.js"(exports2) { + "use strict"; + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.InterceptingListenerImpl = exports2.isInterceptingListener = void 0; + function isInterceptingListener(listener) { + return listener.onReceiveMetadata !== void 0 && listener.onReceiveMetadata.length === 1; + } + exports2.isInterceptingListener = isInterceptingListener; + var InterceptingListenerImpl = class { + constructor(listener, nextListener) { + this.listener = listener; + this.nextListener = nextListener; + this.processingMetadata = false; + this.hasPendingMessage = false; + this.processingMessage = false; + this.pendingStatus = null; + } + processPendingMessage() { + if (this.hasPendingMessage) { + this.nextListener.onReceiveMessage(this.pendingMessage); + this.pendingMessage = null; + this.hasPendingMessage = false; + } + } + processPendingStatus() { + if (this.pendingStatus) { + this.nextListener.onReceiveStatus(this.pendingStatus); + } + } + onReceiveMetadata(metadata) { + this.processingMetadata = true; + this.listener.onReceiveMetadata(metadata, (metadata2) => { + this.processingMetadata = false; + this.nextListener.onReceiveMetadata(metadata2); + this.processPendingMessage(); + this.processPendingStatus(); + }); + } + // eslint-disable-next-line @typescript-eslint/no-explicit-any + onReceiveMessage(message) { + this.processingMessage = true; + this.listener.onReceiveMessage(message, (msg2) => { + this.processingMessage = false; + if (this.processingMetadata) { + this.pendingMessage = msg2; + this.hasPendingMessage = true; + } else { + this.nextListener.onReceiveMessage(msg2); + this.processPendingStatus(); + } + }); + } + onReceiveStatus(status2) { + this.listener.onReceiveStatus(status2, (processedStatus) => { + if (this.processingMetadata || this.processingMessage) { + this.pendingStatus = processedStatus; + } else { + this.nextListener.onReceiveStatus(processedStatus); + } + }); + } + }; + exports2.InterceptingListenerImpl = InterceptingListenerImpl; + } +}); + +// node_modules/@grpc/grpc-js/build/src/client-interceptors.js +var require_client_interceptors = __commonJS({ + "node_modules/@grpc/grpc-js/build/src/client-interceptors.js"(exports2) { + "use strict"; + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.getInterceptingCall = exports2.InterceptingCall = exports2.RequesterBuilder = exports2.ListenerBuilder = exports2.InterceptorConfigurationError = void 0; + var metadata_1 = require_metadata(); + var call_interface_1 = require_call_interface(); + var constants_1 = require_constants(); + var error_1 = require_error(); + var InterceptorConfigurationError = class _InterceptorConfigurationError extends Error { + constructor(message) { + super(message); + this.name = "InterceptorConfigurationError"; + Error.captureStackTrace(this, _InterceptorConfigurationError); + } + }; + exports2.InterceptorConfigurationError = InterceptorConfigurationError; + var ListenerBuilder = class { + constructor() { + this.metadata = void 0; + this.message = void 0; + this.status = void 0; + } + withOnReceiveMetadata(onReceiveMetadata) { + this.metadata = onReceiveMetadata; + return this; + } + withOnReceiveMessage(onReceiveMessage) { + this.message = onReceiveMessage; + return this; + } + withOnReceiveStatus(onReceiveStatus) { + this.status = onReceiveStatus; + return this; + } + build() { + return { + onReceiveMetadata: this.metadata, + onReceiveMessage: this.message, + onReceiveStatus: this.status + }; + } + }; + exports2.ListenerBuilder = ListenerBuilder; + var RequesterBuilder = class { + constructor() { + this.start = void 0; + this.message = void 0; + this.halfClose = void 0; + this.cancel = void 0; + } + withStart(start) { + this.start = start; + return this; + } + withSendMessage(sendMessage) { + this.message = sendMessage; + return this; + } + withHalfClose(halfClose) { + this.halfClose = halfClose; + return this; + } + withCancel(cancel) { + this.cancel = cancel; + return this; + } + build() { + return { + start: this.start, + sendMessage: this.message, + halfClose: this.halfClose, + cancel: this.cancel + }; + } + }; + exports2.RequesterBuilder = RequesterBuilder; + var defaultListener = { + onReceiveMetadata: (metadata, next) => { + next(metadata); + }, + onReceiveMessage: (message, next) => { + next(message); + }, + onReceiveStatus: (status2, next) => { + next(status2); + } + }; + var defaultRequester = { + start: (metadata, listener, next) => { + next(metadata, listener); + }, + sendMessage: (message, next) => { + next(message); + }, + halfClose: (next) => { + next(); + }, + cancel: (next) => { + next(); + } + }; + var InterceptingCall = class { + constructor(nextCall, requester) { + var _a2, _b, _c2, _d; + this.nextCall = nextCall; + this.processingMetadata = false; + this.pendingMessageContext = null; + this.processingMessage = false; + this.pendingHalfClose = false; + if (requester) { + this.requester = { + start: (_a2 = requester.start) !== null && _a2 !== void 0 ? _a2 : defaultRequester.start, + sendMessage: (_b = requester.sendMessage) !== null && _b !== void 0 ? _b : defaultRequester.sendMessage, + halfClose: (_c2 = requester.halfClose) !== null && _c2 !== void 0 ? _c2 : defaultRequester.halfClose, + cancel: (_d = requester.cancel) !== null && _d !== void 0 ? _d : defaultRequester.cancel + }; + } else { + this.requester = defaultRequester; + } + } + cancelWithStatus(status2, details) { + this.requester.cancel(() => { + this.nextCall.cancelWithStatus(status2, details); + }); + } + getPeer() { + return this.nextCall.getPeer(); + } + processPendingMessage() { + if (this.pendingMessageContext) { + this.nextCall.sendMessageWithContext(this.pendingMessageContext, this.pendingMessage); + this.pendingMessageContext = null; + this.pendingMessage = null; + } + } + processPendingHalfClose() { + if (this.pendingHalfClose) { + this.nextCall.halfClose(); + } + } + start(metadata, interceptingListener) { + var _a2, _b, _c2, _d, _e2, _f; + const fullInterceptingListener = { + onReceiveMetadata: (_b = (_a2 = interceptingListener === null || interceptingListener === void 0 ? void 0 : interceptingListener.onReceiveMetadata) === null || _a2 === void 0 ? void 0 : _a2.bind(interceptingListener)) !== null && _b !== void 0 ? _b : (metadata2) => { + }, + onReceiveMessage: (_d = (_c2 = interceptingListener === null || interceptingListener === void 0 ? void 0 : interceptingListener.onReceiveMessage) === null || _c2 === void 0 ? void 0 : _c2.bind(interceptingListener)) !== null && _d !== void 0 ? _d : (message) => { + }, + onReceiveStatus: (_f = (_e2 = interceptingListener === null || interceptingListener === void 0 ? void 0 : interceptingListener.onReceiveStatus) === null || _e2 === void 0 ? void 0 : _e2.bind(interceptingListener)) !== null && _f !== void 0 ? _f : (status2) => { + } + }; + this.processingMetadata = true; + this.requester.start(metadata, fullInterceptingListener, (md, listener) => { + var _a3, _b2, _c3; + this.processingMetadata = false; + let finalInterceptingListener; + if ((0, call_interface_1.isInterceptingListener)(listener)) { + finalInterceptingListener = listener; + } else { + const fullListener = { + onReceiveMetadata: (_a3 = listener.onReceiveMetadata) !== null && _a3 !== void 0 ? _a3 : defaultListener.onReceiveMetadata, + onReceiveMessage: (_b2 = listener.onReceiveMessage) !== null && _b2 !== void 0 ? _b2 : defaultListener.onReceiveMessage, + onReceiveStatus: (_c3 = listener.onReceiveStatus) !== null && _c3 !== void 0 ? _c3 : defaultListener.onReceiveStatus + }; + finalInterceptingListener = new call_interface_1.InterceptingListenerImpl(fullListener, fullInterceptingListener); + } + this.nextCall.start(md, finalInterceptingListener); + this.processPendingMessage(); + this.processPendingHalfClose(); + }); + } + // eslint-disable-next-line @typescript-eslint/no-explicit-any + sendMessageWithContext(context, message) { + this.processingMessage = true; + this.requester.sendMessage(message, (finalMessage) => { + this.processingMessage = false; + if (this.processingMetadata) { + this.pendingMessageContext = context; + this.pendingMessage = message; + } else { + this.nextCall.sendMessageWithContext(context, finalMessage); + this.processPendingHalfClose(); + } + }); + } + // eslint-disable-next-line @typescript-eslint/no-explicit-any + sendMessage(message) { + this.sendMessageWithContext({}, message); + } + startRead() { + this.nextCall.startRead(); + } + halfClose() { + this.requester.halfClose(() => { + if (this.processingMetadata || this.processingMessage) { + this.pendingHalfClose = true; + } else { + this.nextCall.halfClose(); + } + }); + } + }; + exports2.InterceptingCall = InterceptingCall; + function getCall(channel, path, options2) { + var _a2, _b; + const deadline = (_a2 = options2.deadline) !== null && _a2 !== void 0 ? _a2 : Infinity; + const host = options2.host; + const parent = (_b = options2.parent) !== null && _b !== void 0 ? _b : null; + const propagateFlags = options2.propagate_flags; + const credentials2 = options2.credentials; + const call = channel.createCall(path, deadline, host, parent, propagateFlags); + if (credentials2) { + call.setCredentials(credentials2); + } + return call; + } + var BaseInterceptingCall = class { + constructor(call, methodDefinition) { + this.call = call; + this.methodDefinition = methodDefinition; + } + cancelWithStatus(status2, details) { + this.call.cancelWithStatus(status2, details); + } + getPeer() { + return this.call.getPeer(); + } + // eslint-disable-next-line @typescript-eslint/no-explicit-any + sendMessageWithContext(context, message) { + let serialized; + try { + serialized = this.methodDefinition.requestSerialize(message); + } catch (e) { + this.call.cancelWithStatus(constants_1.Status.INTERNAL, `Request message serialization failure: ${(0, error_1.getErrorMessage)(e)}`); + return; + } + this.call.sendMessageWithContext(context, serialized); + } + // eslint-disable-next-line @typescript-eslint/no-explicit-any + sendMessage(message) { + this.sendMessageWithContext({}, message); + } + start(metadata, interceptingListener) { + let readError = null; + this.call.start(metadata, { + onReceiveMetadata: (metadata2) => { + var _a2; + (_a2 = interceptingListener === null || interceptingListener === void 0 ? void 0 : interceptingListener.onReceiveMetadata) === null || _a2 === void 0 ? void 0 : _a2.call(interceptingListener, metadata2); + }, + onReceiveMessage: (message) => { + var _a2; + let deserialized; + try { + deserialized = this.methodDefinition.responseDeserialize(message); + } catch (e) { + readError = { + code: constants_1.Status.INTERNAL, + details: `Response message parsing error: ${(0, error_1.getErrorMessage)(e)}`, + metadata: new metadata_1.Metadata() + }; + this.call.cancelWithStatus(readError.code, readError.details); + return; + } + (_a2 = interceptingListener === null || interceptingListener === void 0 ? void 0 : interceptingListener.onReceiveMessage) === null || _a2 === void 0 ? void 0 : _a2.call(interceptingListener, deserialized); + }, + onReceiveStatus: (status2) => { + var _a2, _b; + if (readError) { + (_a2 = interceptingListener === null || interceptingListener === void 0 ? void 0 : interceptingListener.onReceiveStatus) === null || _a2 === void 0 ? void 0 : _a2.call(interceptingListener, readError); + } else { + (_b = interceptingListener === null || interceptingListener === void 0 ? void 0 : interceptingListener.onReceiveStatus) === null || _b === void 0 ? void 0 : _b.call(interceptingListener, status2); + } + } + }); + } + startRead() { + this.call.startRead(); + } + halfClose() { + this.call.halfClose(); + } + }; + var BaseUnaryInterceptingCall = class extends BaseInterceptingCall { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + constructor(call, methodDefinition) { + super(call, methodDefinition); + } + start(metadata, listener) { + var _a2, _b; + let receivedMessage = false; + const wrapperListener = { + onReceiveMetadata: (_b = (_a2 = listener === null || listener === void 0 ? void 0 : listener.onReceiveMetadata) === null || _a2 === void 0 ? void 0 : _a2.bind(listener)) !== null && _b !== void 0 ? _b : (metadata2) => { + }, + // eslint-disable-next-line @typescript-eslint/no-explicit-any + onReceiveMessage: (message) => { + var _a3; + receivedMessage = true; + (_a3 = listener === null || listener === void 0 ? void 0 : listener.onReceiveMessage) === null || _a3 === void 0 ? void 0 : _a3.call(listener, message); + }, + onReceiveStatus: (status2) => { + var _a3, _b2; + if (!receivedMessage) { + (_a3 = listener === null || listener === void 0 ? void 0 : listener.onReceiveMessage) === null || _a3 === void 0 ? void 0 : _a3.call(listener, null); + } + (_b2 = listener === null || listener === void 0 ? void 0 : listener.onReceiveStatus) === null || _b2 === void 0 ? void 0 : _b2.call(listener, status2); + } + }; + super.start(metadata, wrapperListener); + this.call.startRead(); + } + }; + var BaseStreamingInterceptingCall = class extends BaseInterceptingCall { + }; + function getBottomInterceptingCall(channel, options2, methodDefinition) { + const call = getCall(channel, methodDefinition.path, options2); + if (methodDefinition.responseStream) { + return new BaseStreamingInterceptingCall(call, methodDefinition); + } else { + return new BaseUnaryInterceptingCall(call, methodDefinition); + } + } + function getInterceptingCall(interceptorArgs, methodDefinition, options2, channel) { + if (interceptorArgs.clientInterceptors.length > 0 && interceptorArgs.clientInterceptorProviders.length > 0) { + throw new InterceptorConfigurationError("Both interceptors and interceptor_providers were passed as options to the client constructor. Only one of these is allowed."); + } + if (interceptorArgs.callInterceptors.length > 0 && interceptorArgs.callInterceptorProviders.length > 0) { + throw new InterceptorConfigurationError("Both interceptors and interceptor_providers were passed as call options. Only one of these is allowed."); + } + let interceptors = []; + if (interceptorArgs.callInterceptors.length > 0 || interceptorArgs.callInterceptorProviders.length > 0) { + interceptors = [].concat(interceptorArgs.callInterceptors, interceptorArgs.callInterceptorProviders.map((provider) => provider(methodDefinition))).filter((interceptor) => interceptor); + } else { + interceptors = [].concat(interceptorArgs.clientInterceptors, interceptorArgs.clientInterceptorProviders.map((provider) => provider(methodDefinition))).filter((interceptor) => interceptor); + } + const interceptorOptions = Object.assign({}, options2, { + method_definition: methodDefinition + }); + const getCall2 = interceptors.reduceRight((nextCall, nextInterceptor) => { + return (currentOptions) => nextInterceptor(currentOptions, nextCall); + }, (finalOptions) => getBottomInterceptingCall(channel, finalOptions, methodDefinition)); + return getCall2(interceptorOptions); + } + exports2.getInterceptingCall = getInterceptingCall; + } +}); + +// node_modules/@grpc/grpc-js/build/src/client.js +var require_client = __commonJS({ + "node_modules/@grpc/grpc-js/build/src/client.js"(exports2) { + "use strict"; + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.Client = void 0; + var call_1 = require_call(); + var channel_1 = require_channel(); + var connectivity_state_1 = require_connectivity_state(); + var constants_1 = require_constants(); + var metadata_1 = require_metadata(); + var client_interceptors_1 = require_client_interceptors(); + var CHANNEL_SYMBOL = Symbol(); + var INTERCEPTOR_SYMBOL = Symbol(); + var INTERCEPTOR_PROVIDER_SYMBOL = Symbol(); + var CALL_INVOCATION_TRANSFORMER_SYMBOL = Symbol(); + function isFunction(arg) { + return typeof arg === "function"; + } + function getErrorStackString(error2) { + return error2.stack.split("\n").slice(1).join("\n"); + } + var Client = class { + constructor(address, credentials2, options2 = {}) { + var _a2, _b; + options2 = Object.assign({}, options2); + this[INTERCEPTOR_SYMBOL] = (_a2 = options2.interceptors) !== null && _a2 !== void 0 ? _a2 : []; + delete options2.interceptors; + this[INTERCEPTOR_PROVIDER_SYMBOL] = (_b = options2.interceptor_providers) !== null && _b !== void 0 ? _b : []; + delete options2.interceptor_providers; + if (this[INTERCEPTOR_SYMBOL].length > 0 && this[INTERCEPTOR_PROVIDER_SYMBOL].length > 0) { + throw new Error("Both interceptors and interceptor_providers were passed as options to the client constructor. Only one of these is allowed."); + } + this[CALL_INVOCATION_TRANSFORMER_SYMBOL] = options2.callInvocationTransformer; + delete options2.callInvocationTransformer; + if (options2.channelOverride) { + this[CHANNEL_SYMBOL] = options2.channelOverride; + } else if (options2.channelFactoryOverride) { + const channelFactoryOverride = options2.channelFactoryOverride; + delete options2.channelFactoryOverride; + this[CHANNEL_SYMBOL] = channelFactoryOverride(address, credentials2, options2); + } else { + this[CHANNEL_SYMBOL] = new channel_1.ChannelImplementation(address, credentials2, options2); + } + } + close() { + this[CHANNEL_SYMBOL].close(); + } + getChannel() { + return this[CHANNEL_SYMBOL]; + } + waitForReady(deadline, callback) { + const checkState = (err) => { + if (err) { + callback(new Error("Failed to connect before the deadline")); + return; + } + let newState; + try { + newState = this[CHANNEL_SYMBOL].getConnectivityState(true); + } catch (e) { + callback(new Error("The channel has been closed")); + return; + } + if (newState === connectivity_state_1.ConnectivityState.READY) { + callback(); + } else { + try { + this[CHANNEL_SYMBOL].watchConnectivityState(newState, deadline, checkState); + } catch (e) { + callback(new Error("The channel has been closed")); + } + } + }; + setImmediate(checkState); + } + checkOptionalUnaryResponseArguments(arg1, arg2, arg3) { + if (isFunction(arg1)) { + return { metadata: new metadata_1.Metadata(), options: {}, callback: arg1 }; + } else if (isFunction(arg2)) { + if (arg1 instanceof metadata_1.Metadata) { + return { metadata: arg1, options: {}, callback: arg2 }; + } else { + return { metadata: new metadata_1.Metadata(), options: arg1, callback: arg2 }; + } + } else { + if (!(arg1 instanceof metadata_1.Metadata && arg2 instanceof Object && isFunction(arg3))) { + throw new Error("Incorrect arguments passed"); + } + return { metadata: arg1, options: arg2, callback: arg3 }; + } + } + makeUnaryRequest(method, serialize, deserialize, argument, metadata, options2, callback) { + var _a2, _b; + const checkedArguments = this.checkOptionalUnaryResponseArguments(metadata, options2, callback); + const methodDefinition = { + path: method, + requestStream: false, + responseStream: false, + requestSerialize: serialize, + responseDeserialize: deserialize + }; + let callProperties = { + argument, + metadata: checkedArguments.metadata, + call: new call_1.ClientUnaryCallImpl(), + channel: this[CHANNEL_SYMBOL], + methodDefinition, + callOptions: checkedArguments.options, + callback: checkedArguments.callback + }; + if (this[CALL_INVOCATION_TRANSFORMER_SYMBOL]) { + callProperties = this[CALL_INVOCATION_TRANSFORMER_SYMBOL](callProperties); + } + const emitter = callProperties.call; + const interceptorArgs = { + clientInterceptors: this[INTERCEPTOR_SYMBOL], + clientInterceptorProviders: this[INTERCEPTOR_PROVIDER_SYMBOL], + callInterceptors: (_a2 = callProperties.callOptions.interceptors) !== null && _a2 !== void 0 ? _a2 : [], + callInterceptorProviders: (_b = callProperties.callOptions.interceptor_providers) !== null && _b !== void 0 ? _b : [] + }; + const call = (0, client_interceptors_1.getInterceptingCall)(interceptorArgs, callProperties.methodDefinition, callProperties.callOptions, callProperties.channel); + emitter.call = call; + let responseMessage = null; + let receivedStatus = false; + let callerStackError = new Error(); + call.start(callProperties.metadata, { + onReceiveMetadata: (metadata2) => { + emitter.emit("metadata", metadata2); + }, + // eslint-disable-next-line @typescript-eslint/no-explicit-any + onReceiveMessage(message) { + if (responseMessage !== null) { + call.cancelWithStatus(constants_1.Status.INTERNAL, "Too many responses received"); + } + responseMessage = message; + }, + onReceiveStatus(status2) { + if (receivedStatus) { + return; + } + receivedStatus = true; + if (status2.code === constants_1.Status.OK) { + if (responseMessage === null) { + const callerStack = getErrorStackString(callerStackError); + callProperties.callback((0, call_1.callErrorFromStatus)({ + code: constants_1.Status.INTERNAL, + details: "No message received", + metadata: status2.metadata + }, callerStack)); + } else { + callProperties.callback(null, responseMessage); + } + } else { + const callerStack = getErrorStackString(callerStackError); + callProperties.callback((0, call_1.callErrorFromStatus)(status2, callerStack)); + } + callerStackError = null; + emitter.emit("status", status2); + } + }); + call.sendMessage(argument); + call.halfClose(); + return emitter; + } + makeClientStreamRequest(method, serialize, deserialize, metadata, options2, callback) { + var _a2, _b; + const checkedArguments = this.checkOptionalUnaryResponseArguments(metadata, options2, callback); + const methodDefinition = { + path: method, + requestStream: true, + responseStream: false, + requestSerialize: serialize, + responseDeserialize: deserialize + }; + let callProperties = { + metadata: checkedArguments.metadata, + call: new call_1.ClientWritableStreamImpl(serialize), + channel: this[CHANNEL_SYMBOL], + methodDefinition, + callOptions: checkedArguments.options, + callback: checkedArguments.callback + }; + if (this[CALL_INVOCATION_TRANSFORMER_SYMBOL]) { + callProperties = this[CALL_INVOCATION_TRANSFORMER_SYMBOL](callProperties); + } + const emitter = callProperties.call; + const interceptorArgs = { + clientInterceptors: this[INTERCEPTOR_SYMBOL], + clientInterceptorProviders: this[INTERCEPTOR_PROVIDER_SYMBOL], + callInterceptors: (_a2 = callProperties.callOptions.interceptors) !== null && _a2 !== void 0 ? _a2 : [], + callInterceptorProviders: (_b = callProperties.callOptions.interceptor_providers) !== null && _b !== void 0 ? _b : [] + }; + const call = (0, client_interceptors_1.getInterceptingCall)(interceptorArgs, callProperties.methodDefinition, callProperties.callOptions, callProperties.channel); + emitter.call = call; + let responseMessage = null; + let receivedStatus = false; + let callerStackError = new Error(); + call.start(callProperties.metadata, { + onReceiveMetadata: (metadata2) => { + emitter.emit("metadata", metadata2); + }, + // eslint-disable-next-line @typescript-eslint/no-explicit-any + onReceiveMessage(message) { + if (responseMessage !== null) { + call.cancelWithStatus(constants_1.Status.INTERNAL, "Too many responses received"); + } + responseMessage = message; + }, + onReceiveStatus(status2) { + if (receivedStatus) { + return; + } + receivedStatus = true; + if (status2.code === constants_1.Status.OK) { + if (responseMessage === null) { + const callerStack = getErrorStackString(callerStackError); + callProperties.callback((0, call_1.callErrorFromStatus)({ + code: constants_1.Status.INTERNAL, + details: "No message received", + metadata: status2.metadata + }, callerStack)); + } else { + callProperties.callback(null, responseMessage); + } + } else { + const callerStack = getErrorStackString(callerStackError); + callProperties.callback((0, call_1.callErrorFromStatus)(status2, callerStack)); + } + callerStackError = null; + emitter.emit("status", status2); + } + }); + return emitter; + } + checkMetadataAndOptions(arg1, arg2) { + let metadata; + let options2; + if (arg1 instanceof metadata_1.Metadata) { + metadata = arg1; + if (arg2) { + options2 = arg2; + } else { + options2 = {}; + } + } else { + if (arg1) { + options2 = arg1; + } else { + options2 = {}; + } + metadata = new metadata_1.Metadata(); + } + return { metadata, options: options2 }; + } + makeServerStreamRequest(method, serialize, deserialize, argument, metadata, options2) { + var _a2, _b; + const checkedArguments = this.checkMetadataAndOptions(metadata, options2); + const methodDefinition = { + path: method, + requestStream: false, + responseStream: true, + requestSerialize: serialize, + responseDeserialize: deserialize + }; + let callProperties = { + argument, + metadata: checkedArguments.metadata, + call: new call_1.ClientReadableStreamImpl(deserialize), + channel: this[CHANNEL_SYMBOL], + methodDefinition, + callOptions: checkedArguments.options + }; + if (this[CALL_INVOCATION_TRANSFORMER_SYMBOL]) { + callProperties = this[CALL_INVOCATION_TRANSFORMER_SYMBOL](callProperties); + } + const stream = callProperties.call; + const interceptorArgs = { + clientInterceptors: this[INTERCEPTOR_SYMBOL], + clientInterceptorProviders: this[INTERCEPTOR_PROVIDER_SYMBOL], + callInterceptors: (_a2 = callProperties.callOptions.interceptors) !== null && _a2 !== void 0 ? _a2 : [], + callInterceptorProviders: (_b = callProperties.callOptions.interceptor_providers) !== null && _b !== void 0 ? _b : [] + }; + const call = (0, client_interceptors_1.getInterceptingCall)(interceptorArgs, callProperties.methodDefinition, callProperties.callOptions, callProperties.channel); + stream.call = call; + let receivedStatus = false; + let callerStackError = new Error(); + call.start(callProperties.metadata, { + onReceiveMetadata(metadata2) { + stream.emit("metadata", metadata2); + }, + // eslint-disable-next-line @typescript-eslint/no-explicit-any + onReceiveMessage(message) { + stream.push(message); + }, + onReceiveStatus(status2) { + if (receivedStatus) { + return; + } + receivedStatus = true; + stream.push(null); + if (status2.code !== constants_1.Status.OK) { + const callerStack = getErrorStackString(callerStackError); + stream.emit("error", (0, call_1.callErrorFromStatus)(status2, callerStack)); + } + callerStackError = null; + stream.emit("status", status2); + } + }); + call.sendMessage(argument); + call.halfClose(); + return stream; + } + makeBidiStreamRequest(method, serialize, deserialize, metadata, options2) { + var _a2, _b; + const checkedArguments = this.checkMetadataAndOptions(metadata, options2); + const methodDefinition = { + path: method, + requestStream: true, + responseStream: true, + requestSerialize: serialize, + responseDeserialize: deserialize + }; + let callProperties = { + metadata: checkedArguments.metadata, + call: new call_1.ClientDuplexStreamImpl(serialize, deserialize), + channel: this[CHANNEL_SYMBOL], + methodDefinition, + callOptions: checkedArguments.options + }; + if (this[CALL_INVOCATION_TRANSFORMER_SYMBOL]) { + callProperties = this[CALL_INVOCATION_TRANSFORMER_SYMBOL](callProperties); + } + const stream = callProperties.call; + const interceptorArgs = { + clientInterceptors: this[INTERCEPTOR_SYMBOL], + clientInterceptorProviders: this[INTERCEPTOR_PROVIDER_SYMBOL], + callInterceptors: (_a2 = callProperties.callOptions.interceptors) !== null && _a2 !== void 0 ? _a2 : [], + callInterceptorProviders: (_b = callProperties.callOptions.interceptor_providers) !== null && _b !== void 0 ? _b : [] + }; + const call = (0, client_interceptors_1.getInterceptingCall)(interceptorArgs, callProperties.methodDefinition, callProperties.callOptions, callProperties.channel); + stream.call = call; + let receivedStatus = false; + let callerStackError = new Error(); + call.start(callProperties.metadata, { + onReceiveMetadata(metadata2) { + stream.emit("metadata", metadata2); + }, + onReceiveMessage(message) { + stream.push(message); + }, + onReceiveStatus(status2) { + if (receivedStatus) { + return; + } + receivedStatus = true; + stream.push(null); + if (status2.code !== constants_1.Status.OK) { + const callerStack = getErrorStackString(callerStackError); + stream.emit("error", (0, call_1.callErrorFromStatus)(status2, callerStack)); + } + callerStackError = null; + stream.emit("status", status2); + } + }); + return stream; + } + }; + exports2.Client = Client; + } +}); + +// node_modules/@grpc/grpc-js/build/src/make-client.js +var require_make_client = __commonJS({ + "node_modules/@grpc/grpc-js/build/src/make-client.js"(exports2) { + "use strict"; + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.loadPackageDefinition = exports2.makeClientConstructor = void 0; + var client_1 = require_client(); + var requesterFuncs = { + unary: client_1.Client.prototype.makeUnaryRequest, + server_stream: client_1.Client.prototype.makeServerStreamRequest, + client_stream: client_1.Client.prototype.makeClientStreamRequest, + bidi: client_1.Client.prototype.makeBidiStreamRequest + }; + function isPrototypePolluted(key) { + return ["__proto__", "prototype", "constructor"].includes(key); + } + function makeClientConstructor(methods, serviceName, classOptions) { + if (!classOptions) { + classOptions = {}; + } + class ServiceClientImpl extends client_1.Client { + } + Object.keys(methods).forEach((name) => { + if (isPrototypePolluted(name)) { + return; + } + const attrs = methods[name]; + let methodType; + if (typeof name === "string" && name.charAt(0) === "$") { + throw new Error("Method names cannot start with $"); + } + if (attrs.requestStream) { + if (attrs.responseStream) { + methodType = "bidi"; + } else { + methodType = "client_stream"; + } + } else { + if (attrs.responseStream) { + methodType = "server_stream"; + } else { + methodType = "unary"; + } + } + const serialize = attrs.requestSerialize; + const deserialize = attrs.responseDeserialize; + const methodFunc = partial(requesterFuncs[methodType], attrs.path, serialize, deserialize); + ServiceClientImpl.prototype[name] = methodFunc; + Object.assign(ServiceClientImpl.prototype[name], attrs); + if (attrs.originalName && !isPrototypePolluted(attrs.originalName)) { + ServiceClientImpl.prototype[attrs.originalName] = ServiceClientImpl.prototype[name]; + } + }); + ServiceClientImpl.service = methods; + ServiceClientImpl.serviceName = serviceName; + return ServiceClientImpl; + } + exports2.makeClientConstructor = makeClientConstructor; + function partial(fn, path, serialize, deserialize) { + return function(...args) { + return fn.call(this, path, serialize, deserialize, ...args); + }; + } + function isProtobufTypeDefinition(obj) { + return "format" in obj; + } + function loadPackageDefinition2(packageDef) { + const result = {}; + for (const serviceFqn in packageDef) { + if (Object.prototype.hasOwnProperty.call(packageDef, serviceFqn)) { + const service = packageDef[serviceFqn]; + const nameComponents = serviceFqn.split("."); + if (nameComponents.some((comp) => isPrototypePolluted(comp))) { + continue; + } + const serviceName = nameComponents[nameComponents.length - 1]; + let current = result; + for (const packageName of nameComponents.slice(0, -1)) { + if (!current[packageName]) { + current[packageName] = {}; + } + current = current[packageName]; + } + if (isProtobufTypeDefinition(service)) { + current[serviceName] = service; + } else { + current[serviceName] = makeClientConstructor(service, serviceName, {}); + } + } + } + return result; + } + exports2.loadPackageDefinition = loadPackageDefinition2; + } +}); + +// node_modules/@grpc/grpc-js/build/src/channelz.js +var require_channelz = __commonJS({ + "node_modules/@grpc/grpc-js/build/src/channelz.js"(exports2) { + "use strict"; + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.setup = exports2.getChannelzServiceDefinition = exports2.getChannelzHandlers = exports2.unregisterChannelzRef = exports2.registerChannelzSocket = exports2.registerChannelzServer = exports2.registerChannelzSubchannel = exports2.registerChannelzChannel = exports2.ChannelzCallTracker = exports2.ChannelzChildrenTracker = exports2.ChannelzTrace = void 0; + var net_1 = require("net"); + var connectivity_state_1 = require_connectivity_state(); + var constants_1 = require_constants(); + var subchannel_address_1 = require_subchannel_address(); + var admin_1 = require_admin(); + var make_client_1 = require_make_client(); + function channelRefToMessage(ref) { + return { + channel_id: ref.id, + name: ref.name + }; + } + function subchannelRefToMessage(ref) { + return { + subchannel_id: ref.id, + name: ref.name + }; + } + function serverRefToMessage(ref) { + return { + server_id: ref.id + }; + } + function socketRefToMessage(ref) { + return { + socket_id: ref.id, + name: ref.name + }; + } + var TARGET_RETAINED_TRACES = 32; + var ChannelzTrace = class { + constructor() { + this.events = []; + this.eventsLogged = 0; + this.creationTimestamp = /* @__PURE__ */ new Date(); + } + addTrace(severity, description, child) { + const timestamp = /* @__PURE__ */ new Date(); + this.events.push({ + description, + severity, + timestamp, + childChannel: (child === null || child === void 0 ? void 0 : child.kind) === "channel" ? child : void 0, + childSubchannel: (child === null || child === void 0 ? void 0 : child.kind) === "subchannel" ? child : void 0 + }); + if (this.events.length >= TARGET_RETAINED_TRACES * 2) { + this.events = this.events.slice(TARGET_RETAINED_TRACES); + } + this.eventsLogged += 1; + } + getTraceMessage() { + return { + creation_timestamp: dateToProtoTimestamp(this.creationTimestamp), + num_events_logged: this.eventsLogged, + events: this.events.map((event) => { + return { + description: event.description, + severity: event.severity, + timestamp: dateToProtoTimestamp(event.timestamp), + channel_ref: event.childChannel ? channelRefToMessage(event.childChannel) : null, + subchannel_ref: event.childSubchannel ? subchannelRefToMessage(event.childSubchannel) : null + }; + }) + }; + } + }; + exports2.ChannelzTrace = ChannelzTrace; + var ChannelzChildrenTracker = class { + constructor() { + this.channelChildren = /* @__PURE__ */ new Map(); + this.subchannelChildren = /* @__PURE__ */ new Map(); + this.socketChildren = /* @__PURE__ */ new Map(); + } + refChild(child) { + var _a2, _b, _c2; + switch (child.kind) { + case "channel": { + const trackedChild = (_a2 = this.channelChildren.get(child.id)) !== null && _a2 !== void 0 ? _a2 : { + ref: child, + count: 0 + }; + trackedChild.count += 1; + this.channelChildren.set(child.id, trackedChild); + break; + } + case "subchannel": { + const trackedChild = (_b = this.subchannelChildren.get(child.id)) !== null && _b !== void 0 ? _b : { + ref: child, + count: 0 + }; + trackedChild.count += 1; + this.subchannelChildren.set(child.id, trackedChild); + break; + } + case "socket": { + const trackedChild = (_c2 = this.socketChildren.get(child.id)) !== null && _c2 !== void 0 ? _c2 : { + ref: child, + count: 0 + }; + trackedChild.count += 1; + this.socketChildren.set(child.id, trackedChild); + break; + } + } + } + unrefChild(child) { + switch (child.kind) { + case "channel": { + const trackedChild = this.channelChildren.get(child.id); + if (trackedChild !== void 0) { + trackedChild.count -= 1; + if (trackedChild.count === 0) { + this.channelChildren.delete(child.id); + } else { + this.channelChildren.set(child.id, trackedChild); + } + } + break; + } + case "subchannel": { + const trackedChild = this.subchannelChildren.get(child.id); + if (trackedChild !== void 0) { + trackedChild.count -= 1; + if (trackedChild.count === 0) { + this.subchannelChildren.delete(child.id); + } else { + this.subchannelChildren.set(child.id, trackedChild); + } + } + break; + } + case "socket": { + const trackedChild = this.socketChildren.get(child.id); + if (trackedChild !== void 0) { + trackedChild.count -= 1; + if (trackedChild.count === 0) { + this.socketChildren.delete(child.id); + } else { + this.socketChildren.set(child.id, trackedChild); + } + } + break; + } + } + } + getChildLists() { + const channels2 = []; + for (const { ref } of this.channelChildren.values()) { + channels2.push(ref); + } + const subchannels2 = []; + for (const { ref } of this.subchannelChildren.values()) { + subchannels2.push(ref); + } + const sockets2 = []; + for (const { ref } of this.socketChildren.values()) { + sockets2.push(ref); + } + return { channels: channels2, subchannels: subchannels2, sockets: sockets2 }; + } + }; + exports2.ChannelzChildrenTracker = ChannelzChildrenTracker; + var ChannelzCallTracker = class { + constructor() { + this.callsStarted = 0; + this.callsSucceeded = 0; + this.callsFailed = 0; + this.lastCallStartedTimestamp = null; + } + addCallStarted() { + this.callsStarted += 1; + this.lastCallStartedTimestamp = /* @__PURE__ */ new Date(); + } + addCallSucceeded() { + this.callsSucceeded += 1; + } + addCallFailed() { + this.callsFailed += 1; + } + }; + exports2.ChannelzCallTracker = ChannelzCallTracker; + var nextId = 1; + function getNextId() { + return nextId++; + } + var channels = []; + var subchannels = []; + var servers = []; + var sockets = []; + function registerChannelzChannel(name, getInfo, channelzEnabled) { + const id = getNextId(); + const ref = { id, name, kind: "channel" }; + if (channelzEnabled) { + channels[id] = { ref, getInfo }; + } + return ref; + } + exports2.registerChannelzChannel = registerChannelzChannel; + function registerChannelzSubchannel(name, getInfo, channelzEnabled) { + const id = getNextId(); + const ref = { id, name, kind: "subchannel" }; + if (channelzEnabled) { + subchannels[id] = { ref, getInfo }; + } + return ref; + } + exports2.registerChannelzSubchannel = registerChannelzSubchannel; + function registerChannelzServer(getInfo, channelzEnabled) { + const id = getNextId(); + const ref = { id, kind: "server" }; + if (channelzEnabled) { + servers[id] = { ref, getInfo }; + } + return ref; + } + exports2.registerChannelzServer = registerChannelzServer; + function registerChannelzSocket(name, getInfo, channelzEnabled) { + const id = getNextId(); + const ref = { id, name, kind: "socket" }; + if (channelzEnabled) { + sockets[id] = { ref, getInfo }; + } + return ref; + } + exports2.registerChannelzSocket = registerChannelzSocket; + function unregisterChannelzRef(ref) { + switch (ref.kind) { + case "channel": + delete channels[ref.id]; + return; + case "subchannel": + delete subchannels[ref.id]; + return; + case "server": + delete servers[ref.id]; + return; + case "socket": + delete sockets[ref.id]; + return; + } + } + exports2.unregisterChannelzRef = unregisterChannelzRef; + function parseIPv6Section(addressSection) { + const numberValue = Number.parseInt(addressSection, 16); + return [numberValue / 256 | 0, numberValue % 256]; + } + function parseIPv6Chunk(addressChunk) { + if (addressChunk === "") { + return []; + } + const bytePairs = addressChunk.split(":").map((section) => parseIPv6Section(section)); + const result = []; + return result.concat(...bytePairs); + } + function ipAddressStringToBuffer(ipAddress) { + if ((0, net_1.isIPv4)(ipAddress)) { + return Buffer.from(Uint8Array.from(ipAddress.split(".").map((segment) => Number.parseInt(segment)))); + } else if ((0, net_1.isIPv6)(ipAddress)) { + let leftSection; + let rightSection; + const doubleColonIndex = ipAddress.indexOf("::"); + if (doubleColonIndex === -1) { + leftSection = ipAddress; + rightSection = ""; + } else { + leftSection = ipAddress.substring(0, doubleColonIndex); + rightSection = ipAddress.substring(doubleColonIndex + 2); + } + const leftBuffer = Buffer.from(parseIPv6Chunk(leftSection)); + const rightBuffer = Buffer.from(parseIPv6Chunk(rightSection)); + const middleBuffer = Buffer.alloc(16 - leftBuffer.length - rightBuffer.length, 0); + return Buffer.concat([leftBuffer, middleBuffer, rightBuffer]); + } else { + return null; + } + } + function connectivityStateToMessage(state) { + switch (state) { + case connectivity_state_1.ConnectivityState.CONNECTING: + return { + state: "CONNECTING" + }; + case connectivity_state_1.ConnectivityState.IDLE: + return { + state: "IDLE" + }; + case connectivity_state_1.ConnectivityState.READY: + return { + state: "READY" + }; + case connectivity_state_1.ConnectivityState.SHUTDOWN: + return { + state: "SHUTDOWN" + }; + case connectivity_state_1.ConnectivityState.TRANSIENT_FAILURE: + return { + state: "TRANSIENT_FAILURE" + }; + default: + return { + state: "UNKNOWN" + }; + } + } + function dateToProtoTimestamp(date) { + if (!date) { + return null; + } + const millisSinceEpoch = date.getTime(); + return { + seconds: millisSinceEpoch / 1e3 | 0, + nanos: millisSinceEpoch % 1e3 * 1e6 + }; + } + function getChannelMessage(channelEntry) { + const resolvedInfo = channelEntry.getInfo(); + return { + ref: channelRefToMessage(channelEntry.ref), + data: { + target: resolvedInfo.target, + state: connectivityStateToMessage(resolvedInfo.state), + calls_started: resolvedInfo.callTracker.callsStarted, + calls_succeeded: resolvedInfo.callTracker.callsSucceeded, + calls_failed: resolvedInfo.callTracker.callsFailed, + last_call_started_timestamp: dateToProtoTimestamp(resolvedInfo.callTracker.lastCallStartedTimestamp), + trace: resolvedInfo.trace.getTraceMessage() + }, + channel_ref: resolvedInfo.children.channels.map((ref) => channelRefToMessage(ref)), + subchannel_ref: resolvedInfo.children.subchannels.map((ref) => subchannelRefToMessage(ref)) + }; + } + function GetChannel(call, callback) { + const channelId = Number.parseInt(call.request.channel_id); + const channelEntry = channels[channelId]; + if (channelEntry === void 0) { + callback({ + code: constants_1.Status.NOT_FOUND, + details: "No channel data found for id " + channelId + }); + return; + } + callback(null, { channel: getChannelMessage(channelEntry) }); + } + function GetTopChannels(call, callback) { + const maxResults = Number.parseInt(call.request.max_results); + const resultList = []; + let i = Number.parseInt(call.request.start_channel_id); + for (; i < channels.length; i++) { + const channelEntry = channels[i]; + if (channelEntry === void 0) { + continue; + } + resultList.push(getChannelMessage(channelEntry)); + if (resultList.length >= maxResults) { + break; + } + } + callback(null, { + channel: resultList, + end: i >= servers.length + }); + } + function getServerMessage(serverEntry) { + const resolvedInfo = serverEntry.getInfo(); + return { + ref: serverRefToMessage(serverEntry.ref), + data: { + calls_started: resolvedInfo.callTracker.callsStarted, + calls_succeeded: resolvedInfo.callTracker.callsSucceeded, + calls_failed: resolvedInfo.callTracker.callsFailed, + last_call_started_timestamp: dateToProtoTimestamp(resolvedInfo.callTracker.lastCallStartedTimestamp), + trace: resolvedInfo.trace.getTraceMessage() + }, + listen_socket: resolvedInfo.listenerChildren.sockets.map((ref) => socketRefToMessage(ref)) + }; + } + function GetServer(call, callback) { + const serverId = Number.parseInt(call.request.server_id); + const serverEntry = servers[serverId]; + if (serverEntry === void 0) { + callback({ + code: constants_1.Status.NOT_FOUND, + details: "No server data found for id " + serverId + }); + return; + } + callback(null, { server: getServerMessage(serverEntry) }); + } + function GetServers(call, callback) { + const maxResults = Number.parseInt(call.request.max_results); + const resultList = []; + let i = Number.parseInt(call.request.start_server_id); + for (; i < servers.length; i++) { + const serverEntry = servers[i]; + if (serverEntry === void 0) { + continue; + } + resultList.push(getServerMessage(serverEntry)); + if (resultList.length >= maxResults) { + break; + } + } + callback(null, { + server: resultList, + end: i >= servers.length + }); + } + function GetSubchannel(call, callback) { + const subchannelId = Number.parseInt(call.request.subchannel_id); + const subchannelEntry = subchannels[subchannelId]; + if (subchannelEntry === void 0) { + callback({ + code: constants_1.Status.NOT_FOUND, + details: "No subchannel data found for id " + subchannelId + }); + return; + } + const resolvedInfo = subchannelEntry.getInfo(); + const subchannelMessage = { + ref: subchannelRefToMessage(subchannelEntry.ref), + data: { + target: resolvedInfo.target, + state: connectivityStateToMessage(resolvedInfo.state), + calls_started: resolvedInfo.callTracker.callsStarted, + calls_succeeded: resolvedInfo.callTracker.callsSucceeded, + calls_failed: resolvedInfo.callTracker.callsFailed, + last_call_started_timestamp: dateToProtoTimestamp(resolvedInfo.callTracker.lastCallStartedTimestamp), + trace: resolvedInfo.trace.getTraceMessage() + }, + socket_ref: resolvedInfo.children.sockets.map((ref) => socketRefToMessage(ref)) + }; + callback(null, { subchannel: subchannelMessage }); + } + function subchannelAddressToAddressMessage(subchannelAddress) { + var _a2; + if ((0, subchannel_address_1.isTcpSubchannelAddress)(subchannelAddress)) { + return { + address: "tcpip_address", + tcpip_address: { + ip_address: (_a2 = ipAddressStringToBuffer(subchannelAddress.host)) !== null && _a2 !== void 0 ? _a2 : void 0, + port: subchannelAddress.port + } + }; + } else { + return { + address: "uds_address", + uds_address: { + filename: subchannelAddress.path + } + }; + } + } + function GetSocket(call, callback) { + var _a2, _b, _c2, _d, _e2; + const socketId = Number.parseInt(call.request.socket_id); + const socketEntry = sockets[socketId]; + if (socketEntry === void 0) { + callback({ + code: constants_1.Status.NOT_FOUND, + details: "No socket data found for id " + socketId + }); + return; + } + const resolvedInfo = socketEntry.getInfo(); + const securityMessage = resolvedInfo.security ? { + model: "tls", + tls: { + cipher_suite: resolvedInfo.security.cipherSuiteStandardName ? "standard_name" : "other_name", + standard_name: (_a2 = resolvedInfo.security.cipherSuiteStandardName) !== null && _a2 !== void 0 ? _a2 : void 0, + other_name: (_b = resolvedInfo.security.cipherSuiteOtherName) !== null && _b !== void 0 ? _b : void 0, + local_certificate: (_c2 = resolvedInfo.security.localCertificate) !== null && _c2 !== void 0 ? _c2 : void 0, + remote_certificate: (_d = resolvedInfo.security.remoteCertificate) !== null && _d !== void 0 ? _d : void 0 + } + } : null; + const socketMessage = { + ref: socketRefToMessage(socketEntry.ref), + local: resolvedInfo.localAddress ? subchannelAddressToAddressMessage(resolvedInfo.localAddress) : null, + remote: resolvedInfo.remoteAddress ? subchannelAddressToAddressMessage(resolvedInfo.remoteAddress) : null, + remote_name: (_e2 = resolvedInfo.remoteName) !== null && _e2 !== void 0 ? _e2 : void 0, + security: securityMessage, + data: { + keep_alives_sent: resolvedInfo.keepAlivesSent, + streams_started: resolvedInfo.streamsStarted, + streams_succeeded: resolvedInfo.streamsSucceeded, + streams_failed: resolvedInfo.streamsFailed, + last_local_stream_created_timestamp: dateToProtoTimestamp(resolvedInfo.lastLocalStreamCreatedTimestamp), + last_remote_stream_created_timestamp: dateToProtoTimestamp(resolvedInfo.lastRemoteStreamCreatedTimestamp), + messages_received: resolvedInfo.messagesReceived, + messages_sent: resolvedInfo.messagesSent, + last_message_received_timestamp: dateToProtoTimestamp(resolvedInfo.lastMessageReceivedTimestamp), + last_message_sent_timestamp: dateToProtoTimestamp(resolvedInfo.lastMessageSentTimestamp), + local_flow_control_window: resolvedInfo.localFlowControlWindow ? { value: resolvedInfo.localFlowControlWindow } : null, + remote_flow_control_window: resolvedInfo.remoteFlowControlWindow ? { value: resolvedInfo.remoteFlowControlWindow } : null + } + }; + callback(null, { socket: socketMessage }); + } + function GetServerSockets(call, callback) { + const serverId = Number.parseInt(call.request.server_id); + const serverEntry = servers[serverId]; + if (serverEntry === void 0) { + callback({ + code: constants_1.Status.NOT_FOUND, + details: "No server data found for id " + serverId + }); + return; + } + const startId = Number.parseInt(call.request.start_socket_id); + const maxResults = Number.parseInt(call.request.max_results); + const resolvedInfo = serverEntry.getInfo(); + const allSockets = resolvedInfo.sessionChildren.sockets.sort((ref1, ref2) => ref1.id - ref2.id); + const resultList = []; + let i = 0; + for (; i < allSockets.length; i++) { + if (allSockets[i].id >= startId) { + resultList.push(socketRefToMessage(allSockets[i])); + if (resultList.length >= maxResults) { + break; + } + } + } + callback(null, { + socket_ref: resultList, + end: i >= allSockets.length + }); + } + function getChannelzHandlers() { + return { + GetChannel, + GetTopChannels, + GetServer, + GetServers, + GetSubchannel, + GetSocket, + GetServerSockets + }; + } + exports2.getChannelzHandlers = getChannelzHandlers; + var loadedChannelzDefinition = null; + function getChannelzServiceDefinition() { + if (loadedChannelzDefinition) { + return loadedChannelzDefinition; + } + const loaderLoadSync = require_src2().loadSync; + const loadedProto = loaderLoadSync("channelz.proto", { + keepCase: true, + longs: String, + enums: String, + defaults: true, + oneofs: true, + includeDirs: [`${__dirname}/../../proto`] + }); + const channelzGrpcObject = (0, make_client_1.loadPackageDefinition)(loadedProto); + loadedChannelzDefinition = channelzGrpcObject.grpc.channelz.v1.Channelz.service; + return loadedChannelzDefinition; + } + exports2.getChannelzServiceDefinition = getChannelzServiceDefinition; + function setup() { + (0, admin_1.registerAdminService)(getChannelzServiceDefinition, getChannelzHandlers); + } + exports2.setup = setup; + } +}); + +// node_modules/@grpc/grpc-js/build/src/subchannel.js +var require_subchannel = __commonJS({ + "node_modules/@grpc/grpc-js/build/src/subchannel.js"(exports2) { + "use strict"; + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.Subchannel = void 0; + var connectivity_state_1 = require_connectivity_state(); + var backoff_timeout_1 = require_backoff_timeout(); + var logging = require_logging(); + var constants_1 = require_constants(); + var uri_parser_1 = require_uri_parser(); + var subchannel_address_1 = require_subchannel_address(); + var channelz_1 = require_channelz(); + var TRACER_NAME = "subchannel"; + var KEEPALIVE_MAX_TIME_MS = ~(1 << 31); + var Subchannel = class { + /** + * A class representing a connection to a single backend. + * @param channelTarget The target string for the channel as a whole + * @param subchannelAddress The address for the backend that this subchannel + * will connect to + * @param options The channel options, plus any specific subchannel options + * for this subchannel + * @param credentials The channel credentials used to establish this + * connection + */ + constructor(channelTarget, subchannelAddress, options2, credentials2, connector) { + var _a2; + this.channelTarget = channelTarget; + this.subchannelAddress = subchannelAddress; + this.options = options2; + this.credentials = credentials2; + this.connector = connector; + this.connectivityState = connectivity_state_1.ConnectivityState.IDLE; + this.transport = null; + this.continueConnecting = false; + this.stateListeners = /* @__PURE__ */ new Set(); + this.refcount = 0; + this.channelzEnabled = true; + this.callTracker = new channelz_1.ChannelzCallTracker(); + this.childrenTracker = new channelz_1.ChannelzChildrenTracker(); + this.streamTracker = new channelz_1.ChannelzCallTracker(); + const backoffOptions = { + initialDelay: options2["grpc.initial_reconnect_backoff_ms"], + maxDelay: options2["grpc.max_reconnect_backoff_ms"] + }; + this.backoffTimeout = new backoff_timeout_1.BackoffTimeout(() => { + this.handleBackoffTimer(); + }, backoffOptions); + this.subchannelAddressString = (0, subchannel_address_1.subchannelAddressToString)(subchannelAddress); + this.keepaliveTime = (_a2 = options2["grpc.keepalive_time_ms"]) !== null && _a2 !== void 0 ? _a2 : -1; + if (options2["grpc.enable_channelz"] === 0) { + this.channelzEnabled = false; + } + this.channelzTrace = new channelz_1.ChannelzTrace(); + this.channelzRef = (0, channelz_1.registerChannelzSubchannel)(this.subchannelAddressString, () => this.getChannelzInfo(), this.channelzEnabled); + if (this.channelzEnabled) { + this.channelzTrace.addTrace("CT_INFO", "Subchannel created"); + } + this.trace("Subchannel constructed with options " + JSON.stringify(options2, void 0, 2)); + } + getChannelzInfo() { + return { + state: this.connectivityState, + trace: this.channelzTrace, + callTracker: this.callTracker, + children: this.childrenTracker.getChildLists(), + target: this.subchannelAddressString + }; + } + trace(text) { + logging.trace(constants_1.LogVerbosity.DEBUG, TRACER_NAME, "(" + this.channelzRef.id + ") " + this.subchannelAddressString + " " + text); + } + refTrace(text) { + logging.trace(constants_1.LogVerbosity.DEBUG, "subchannel_refcount", "(" + this.channelzRef.id + ") " + this.subchannelAddressString + " " + text); + } + handleBackoffTimer() { + if (this.continueConnecting) { + this.transitionToState([connectivity_state_1.ConnectivityState.TRANSIENT_FAILURE], connectivity_state_1.ConnectivityState.CONNECTING); + } else { + this.transitionToState([connectivity_state_1.ConnectivityState.TRANSIENT_FAILURE], connectivity_state_1.ConnectivityState.IDLE); + } + } + /** + * Start a backoff timer with the current nextBackoff timeout + */ + startBackoff() { + this.backoffTimeout.runOnce(); + } + stopBackoff() { + this.backoffTimeout.stop(); + this.backoffTimeout.reset(); + } + startConnectingInternal() { + let options2 = this.options; + if (options2["grpc.keepalive_time_ms"]) { + const adjustedKeepaliveTime = Math.min(this.keepaliveTime, KEEPALIVE_MAX_TIME_MS); + options2 = Object.assign(Object.assign({}, options2), { "grpc.keepalive_time_ms": adjustedKeepaliveTime }); + } + this.connector.connect(this.subchannelAddress, this.credentials, options2).then((transport) => { + if (this.transitionToState([connectivity_state_1.ConnectivityState.CONNECTING], connectivity_state_1.ConnectivityState.READY)) { + this.transport = transport; + if (this.channelzEnabled) { + this.childrenTracker.refChild(transport.getChannelzRef()); + } + transport.addDisconnectListener((tooManyPings) => { + this.transitionToState([connectivity_state_1.ConnectivityState.READY], connectivity_state_1.ConnectivityState.IDLE); + if (tooManyPings && this.keepaliveTime > 0) { + this.keepaliveTime *= 2; + logging.log(constants_1.LogVerbosity.ERROR, `Connection to ${(0, uri_parser_1.uriToString)(this.channelTarget)} at ${this.subchannelAddressString} rejected by server because of excess pings. Increasing ping interval to ${this.keepaliveTime} ms`); + } + }); + } + }, (error2) => { + this.transitionToState([connectivity_state_1.ConnectivityState.CONNECTING], connectivity_state_1.ConnectivityState.TRANSIENT_FAILURE); + }); + } + /** + * Initiate a state transition from any element of oldStates to the new + * state. If the current connectivityState is not in oldStates, do nothing. + * @param oldStates The set of states to transition from + * @param newState The state to transition to + * @returns True if the state changed, false otherwise + */ + transitionToState(oldStates, newState) { + var _a2, _b; + if (oldStates.indexOf(this.connectivityState) === -1) { + return false; + } + this.trace(connectivity_state_1.ConnectivityState[this.connectivityState] + " -> " + connectivity_state_1.ConnectivityState[newState]); + if (this.channelzEnabled) { + this.channelzTrace.addTrace("CT_INFO", connectivity_state_1.ConnectivityState[this.connectivityState] + " -> " + connectivity_state_1.ConnectivityState[newState]); + } + const previousState = this.connectivityState; + this.connectivityState = newState; + switch (newState) { + case connectivity_state_1.ConnectivityState.READY: + this.stopBackoff(); + break; + case connectivity_state_1.ConnectivityState.CONNECTING: + this.startBackoff(); + this.startConnectingInternal(); + this.continueConnecting = false; + break; + case connectivity_state_1.ConnectivityState.TRANSIENT_FAILURE: + if (this.channelzEnabled && this.transport) { + this.childrenTracker.unrefChild(this.transport.getChannelzRef()); + } + (_a2 = this.transport) === null || _a2 === void 0 ? void 0 : _a2.shutdown(); + this.transport = null; + if (!this.backoffTimeout.isRunning()) { + process.nextTick(() => { + this.handleBackoffTimer(); + }); + } + break; + case connectivity_state_1.ConnectivityState.IDLE: + if (this.channelzEnabled && this.transport) { + this.childrenTracker.unrefChild(this.transport.getChannelzRef()); + } + (_b = this.transport) === null || _b === void 0 ? void 0 : _b.shutdown(); + this.transport = null; + break; + default: + throw new Error(`Invalid state: unknown ConnectivityState ${newState}`); + } + for (const listener of this.stateListeners) { + listener(this, previousState, newState, this.keepaliveTime); + } + return true; + } + ref() { + this.refTrace("refcount " + this.refcount + " -> " + (this.refcount + 1)); + this.refcount += 1; + } + unref() { + this.refTrace("refcount " + this.refcount + " -> " + (this.refcount - 1)); + this.refcount -= 1; + if (this.refcount === 0) { + if (this.channelzEnabled) { + this.channelzTrace.addTrace("CT_INFO", "Shutting down"); + } + if (this.channelzEnabled) { + (0, channelz_1.unregisterChannelzRef)(this.channelzRef); + } + process.nextTick(() => { + this.transitionToState([connectivity_state_1.ConnectivityState.CONNECTING, connectivity_state_1.ConnectivityState.READY], connectivity_state_1.ConnectivityState.IDLE); + }); + } + } + unrefIfOneRef() { + if (this.refcount === 1) { + this.unref(); + return true; + } + return false; + } + createCall(metadata, host, method, listener) { + if (!this.transport) { + throw new Error("Cannot create call, subchannel not READY"); + } + let statsTracker; + if (this.channelzEnabled) { + this.callTracker.addCallStarted(); + this.streamTracker.addCallStarted(); + statsTracker = { + onCallEnd: (status2) => { + if (status2.code === constants_1.Status.OK) { + this.callTracker.addCallSucceeded(); + } else { + this.callTracker.addCallFailed(); + } + } + }; + } else { + statsTracker = {}; + } + return this.transport.createCall(metadata, host, method, listener, statsTracker); + } + /** + * If the subchannel is currently IDLE, start connecting and switch to the + * CONNECTING state. If the subchannel is current in TRANSIENT_FAILURE, + * the next time it would transition to IDLE, start connecting again instead. + * Otherwise, do nothing. + */ + startConnecting() { + process.nextTick(() => { + if (!this.transitionToState([connectivity_state_1.ConnectivityState.IDLE], connectivity_state_1.ConnectivityState.CONNECTING)) { + if (this.connectivityState === connectivity_state_1.ConnectivityState.TRANSIENT_FAILURE) { + this.continueConnecting = true; + } + } + }); + } + /** + * Get the subchannel's current connectivity state. + */ + getConnectivityState() { + return this.connectivityState; + } + /** + * Add a listener function to be called whenever the subchannel's + * connectivity state changes. + * @param listener + */ + addConnectivityStateListener(listener) { + this.stateListeners.add(listener); + } + /** + * Remove a listener previously added with `addConnectivityStateListener` + * @param listener A reference to a function previously passed to + * `addConnectivityStateListener` + */ + removeConnectivityStateListener(listener) { + this.stateListeners.delete(listener); + } + /** + * Reset the backoff timeout, and immediately start connecting if in backoff. + */ + resetBackoff() { + process.nextTick(() => { + this.backoffTimeout.reset(); + this.transitionToState([connectivity_state_1.ConnectivityState.TRANSIENT_FAILURE], connectivity_state_1.ConnectivityState.CONNECTING); + }); + } + getAddress() { + return this.subchannelAddressString; + } + getChannelzRef() { + return this.channelzRef; + } + getRealSubchannel() { + return this; + } + realSubchannelEquals(other) { + return other.getRealSubchannel() === this; + } + throttleKeepalive(newKeepaliveTime) { + if (newKeepaliveTime > this.keepaliveTime) { + this.keepaliveTime = newKeepaliveTime; + } + } + }; + exports2.Subchannel = Subchannel; + } +}); + +// node_modules/@grpc/grpc-js/build/src/http_proxy.js +var require_http_proxy = __commonJS({ + "node_modules/@grpc/grpc-js/build/src/http_proxy.js"(exports2) { + "use strict"; + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.getProxiedConnection = exports2.mapProxyName = void 0; + var logging_1 = require_logging(); + var constants_1 = require_constants(); + var resolver_1 = require_resolver(); + var http = require("http"); + var tls = require("tls"); + var logging = require_logging(); + var subchannel_address_1 = require_subchannel_address(); + var uri_parser_1 = require_uri_parser(); + var url_1 = require("url"); + var TRACER_NAME = "proxy"; + function trace(text) { + logging.trace(constants_1.LogVerbosity.DEBUG, TRACER_NAME, text); + } + function getProxyInfo() { + let proxyEnv = ""; + let envVar = ""; + if (process.env.grpc_proxy) { + envVar = "grpc_proxy"; + proxyEnv = process.env.grpc_proxy; + } else if (process.env.https_proxy) { + envVar = "https_proxy"; + proxyEnv = process.env.https_proxy; + } else if (process.env.http_proxy) { + envVar = "http_proxy"; + proxyEnv = process.env.http_proxy; + } else { + return {}; + } + let proxyUrl; + try { + proxyUrl = new url_1.URL(proxyEnv); + } catch (e) { + (0, logging_1.log)(constants_1.LogVerbosity.ERROR, `cannot parse value of "${envVar}" env var`); + return {}; + } + if (proxyUrl.protocol !== "http:") { + (0, logging_1.log)(constants_1.LogVerbosity.ERROR, `"${proxyUrl.protocol}" scheme not supported in proxy URI`); + return {}; + } + let userCred = null; + if (proxyUrl.username) { + if (proxyUrl.password) { + (0, logging_1.log)(constants_1.LogVerbosity.INFO, "userinfo found in proxy URI"); + userCred = `${proxyUrl.username}:${proxyUrl.password}`; + } else { + userCred = proxyUrl.username; + } + } + const hostname = proxyUrl.hostname; + let port = proxyUrl.port; + if (port === "") { + port = "80"; + } + const result = { + address: `${hostname}:${port}` + }; + if (userCred) { + result.creds = userCred; + } + trace("Proxy server " + result.address + " set by environment variable " + envVar); + return result; + } + function getNoProxyHostList() { + let noProxyStr = process.env.no_grpc_proxy; + let envVar = "no_grpc_proxy"; + if (!noProxyStr) { + noProxyStr = process.env.no_proxy; + envVar = "no_proxy"; + } + if (noProxyStr) { + trace("No proxy server list set by environment variable " + envVar); + return noProxyStr.split(","); + } else { + return []; + } + } + function mapProxyName(target, options2) { + var _a2; + const noProxyResult = { + target, + extraOptions: {} + }; + if (((_a2 = options2["grpc.enable_http_proxy"]) !== null && _a2 !== void 0 ? _a2 : 1) === 0) { + return noProxyResult; + } + if (target.scheme === "unix") { + return noProxyResult; + } + const proxyInfo = getProxyInfo(); + if (!proxyInfo.address) { + return noProxyResult; + } + const hostPort = (0, uri_parser_1.splitHostPort)(target.path); + if (!hostPort) { + return noProxyResult; + } + const serverHost = hostPort.host; + for (const host of getNoProxyHostList()) { + if (host === serverHost) { + trace("Not using proxy for target in no_proxy list: " + (0, uri_parser_1.uriToString)(target)); + return noProxyResult; + } + } + const extraOptions = { + "grpc.http_connect_target": (0, uri_parser_1.uriToString)(target) + }; + if (proxyInfo.creds) { + extraOptions["grpc.http_connect_creds"] = proxyInfo.creds; + } + return { + target: { + scheme: "dns", + path: proxyInfo.address + }, + extraOptions + }; + } + exports2.mapProxyName = mapProxyName; + function getProxiedConnection(address, channelOptions, connectionOptions) { + if (!("grpc.http_connect_target" in channelOptions)) { + return Promise.resolve({}); + } + const realTarget = channelOptions["grpc.http_connect_target"]; + const parsedTarget = (0, uri_parser_1.parseUri)(realTarget); + if (parsedTarget === null) { + return Promise.resolve({}); + } + const options2 = { + method: "CONNECT", + path: parsedTarget.path + }; + const headers = { + Host: parsedTarget.path + }; + if ((0, subchannel_address_1.isTcpSubchannelAddress)(address)) { + options2.host = address.host; + options2.port = address.port; + } else { + options2.socketPath = address.path; + } + if ("grpc.http_connect_creds" in channelOptions) { + headers["Proxy-Authorization"] = "Basic " + Buffer.from(channelOptions["grpc.http_connect_creds"]).toString("base64"); + } + options2.headers = headers; + const proxyAddressString = (0, subchannel_address_1.subchannelAddressToString)(address); + trace("Using proxy " + proxyAddressString + " to connect to " + options2.path); + return new Promise((resolve, reject) => { + const request = http.request(options2); + request.once("connect", (res, socket, head) => { + var _a2; + request.removeAllListeners(); + socket.removeAllListeners(); + if (res.statusCode === 200) { + trace("Successfully connected to " + options2.path + " through proxy " + proxyAddressString); + if ("secureContext" in connectionOptions) { + const targetPath = (0, resolver_1.getDefaultAuthority)(parsedTarget); + const hostPort = (0, uri_parser_1.splitHostPort)(targetPath); + const remoteHost = (_a2 = hostPort === null || hostPort === void 0 ? void 0 : hostPort.host) !== null && _a2 !== void 0 ? _a2 : targetPath; + const cts = tls.connect(Object.assign({ host: remoteHost, servername: remoteHost, socket }, connectionOptions), () => { + trace("Successfully established a TLS connection to " + options2.path + " through proxy " + proxyAddressString); + resolve({ socket: cts, realTarget: parsedTarget }); + }); + cts.on("error", (error2) => { + trace("Failed to establish a TLS connection to " + options2.path + " through proxy " + proxyAddressString + " with error " + error2.message); + reject(); + }); + } else { + trace("Successfully established a plaintext connection to " + options2.path + " through proxy " + proxyAddressString); + resolve({ + socket, + realTarget: parsedTarget + }); + } + } else { + (0, logging_1.log)(constants_1.LogVerbosity.ERROR, "Failed to connect to " + options2.path + " through proxy " + proxyAddressString + " with status " + res.statusCode); + reject(); + } + }); + request.once("error", (err) => { + request.removeAllListeners(); + (0, logging_1.log)(constants_1.LogVerbosity.ERROR, "Failed to connect to proxy " + proxyAddressString + " with error " + err.message); + reject(); + }); + request.end(); + }); + } + exports2.getProxiedConnection = getProxiedConnection; + } +}); + +// node_modules/@grpc/grpc-js/build/src/stream-decoder.js +var require_stream_decoder = __commonJS({ + "node_modules/@grpc/grpc-js/build/src/stream-decoder.js"(exports2) { + "use strict"; + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.StreamDecoder = void 0; + var ReadState; + (function(ReadState2) { + ReadState2[ReadState2["NO_DATA"] = 0] = "NO_DATA"; + ReadState2[ReadState2["READING_SIZE"] = 1] = "READING_SIZE"; + ReadState2[ReadState2["READING_MESSAGE"] = 2] = "READING_MESSAGE"; + })(ReadState || (ReadState = {})); + var StreamDecoder = class { + constructor() { + this.readState = ReadState.NO_DATA; + this.readCompressFlag = Buffer.alloc(1); + this.readPartialSize = Buffer.alloc(4); + this.readSizeRemaining = 4; + this.readMessageSize = 0; + this.readPartialMessage = []; + this.readMessageRemaining = 0; + } + write(data) { + let readHead = 0; + let toRead; + const result = []; + while (readHead < data.length) { + switch (this.readState) { + case ReadState.NO_DATA: + this.readCompressFlag = data.slice(readHead, readHead + 1); + readHead += 1; + this.readState = ReadState.READING_SIZE; + this.readPartialSize.fill(0); + this.readSizeRemaining = 4; + this.readMessageSize = 0; + this.readMessageRemaining = 0; + this.readPartialMessage = []; + break; + case ReadState.READING_SIZE: + toRead = Math.min(data.length - readHead, this.readSizeRemaining); + data.copy(this.readPartialSize, 4 - this.readSizeRemaining, readHead, readHead + toRead); + this.readSizeRemaining -= toRead; + readHead += toRead; + if (this.readSizeRemaining === 0) { + this.readMessageSize = this.readPartialSize.readUInt32BE(0); + this.readMessageRemaining = this.readMessageSize; + if (this.readMessageRemaining > 0) { + this.readState = ReadState.READING_MESSAGE; + } else { + const message = Buffer.concat([this.readCompressFlag, this.readPartialSize], 5); + this.readState = ReadState.NO_DATA; + result.push(message); + } + } + break; + case ReadState.READING_MESSAGE: + toRead = Math.min(data.length - readHead, this.readMessageRemaining); + this.readPartialMessage.push(data.slice(readHead, readHead + toRead)); + this.readMessageRemaining -= toRead; + readHead += toRead; + if (this.readMessageRemaining === 0) { + const framedMessageBuffers = [ + this.readCompressFlag, + this.readPartialSize + ].concat(this.readPartialMessage); + const framedMessage = Buffer.concat(framedMessageBuffers, this.readMessageSize + 5); + this.readState = ReadState.NO_DATA; + result.push(framedMessage); + } + break; + default: + throw new Error("Unexpected read state"); + } + } + return result; + } + }; + exports2.StreamDecoder = StreamDecoder; + } +}); + +// node_modules/@grpc/grpc-js/build/src/subchannel-call.js +var require_subchannel_call = __commonJS({ + "node_modules/@grpc/grpc-js/build/src/subchannel-call.js"(exports2) { + "use strict"; + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.Http2SubchannelCall = void 0; + var http2 = require("http2"); + var os2 = require("os"); + var constants_1 = require_constants(); + var metadata_1 = require_metadata(); + var stream_decoder_1 = require_stream_decoder(); + var logging = require_logging(); + var constants_2 = require_constants(); + var TRACER_NAME = "subchannel_call"; + function getSystemErrorName(errno) { + for (const [name, num] of Object.entries(os2.constants.errno)) { + if (num === errno) { + return name; + } + } + return "Unknown system error " + errno; + } + var Http2SubchannelCall = class { + constructor(http2Stream, callEventTracker, listener, transport, callId) { + this.http2Stream = http2Stream; + this.callEventTracker = callEventTracker; + this.listener = listener; + this.transport = transport; + this.callId = callId; + this.decoder = new stream_decoder_1.StreamDecoder(); + this.isReadFilterPending = false; + this.isPushPending = false; + this.canPush = false; + this.readsClosed = false; + this.statusOutput = false; + this.unpushedReadMessages = []; + this.mappedStatusCode = constants_1.Status.UNKNOWN; + this.finalStatus = null; + this.internalError = null; + http2Stream.on("response", (headers, flags) => { + let headersString = ""; + for (const header of Object.keys(headers)) { + headersString += " " + header + ": " + headers[header] + "\n"; + } + this.trace("Received server headers:\n" + headersString); + switch (headers[":status"]) { + case 400: + this.mappedStatusCode = constants_1.Status.INTERNAL; + break; + case 401: + this.mappedStatusCode = constants_1.Status.UNAUTHENTICATED; + break; + case 403: + this.mappedStatusCode = constants_1.Status.PERMISSION_DENIED; + break; + case 404: + this.mappedStatusCode = constants_1.Status.UNIMPLEMENTED; + break; + case 429: + case 502: + case 503: + case 504: + this.mappedStatusCode = constants_1.Status.UNAVAILABLE; + break; + default: + this.mappedStatusCode = constants_1.Status.UNKNOWN; + } + if (flags & http2.constants.NGHTTP2_FLAG_END_STREAM) { + this.handleTrailers(headers); + } else { + let metadata; + try { + metadata = metadata_1.Metadata.fromHttp2Headers(headers); + } catch (error2) { + this.endCall({ + code: constants_1.Status.UNKNOWN, + details: error2.message, + metadata: new metadata_1.Metadata() + }); + return; + } + this.listener.onReceiveMetadata(metadata); + } + }); + http2Stream.on("trailers", (headers) => { + this.handleTrailers(headers); + }); + http2Stream.on("data", (data) => { + if (this.statusOutput) { + return; + } + this.trace("receive HTTP/2 data frame of length " + data.length); + const messages = this.decoder.write(data); + for (const message of messages) { + this.trace("parsed message of length " + message.length); + this.callEventTracker.addMessageReceived(); + this.tryPush(message); + } + }); + http2Stream.on("end", () => { + this.readsClosed = true; + this.maybeOutputStatus(); + }); + http2Stream.on("close", () => { + process.nextTick(() => { + var _a2; + this.trace("HTTP/2 stream closed with code " + http2Stream.rstCode); + if (((_a2 = this.finalStatus) === null || _a2 === void 0 ? void 0 : _a2.code) === constants_1.Status.OK) { + return; + } + let code; + let details = ""; + switch (http2Stream.rstCode) { + case http2.constants.NGHTTP2_NO_ERROR: + if (this.finalStatus !== null) { + return; + } + code = constants_1.Status.INTERNAL; + details = `Received RST_STREAM with code ${http2Stream.rstCode}`; + break; + case http2.constants.NGHTTP2_REFUSED_STREAM: + code = constants_1.Status.UNAVAILABLE; + details = "Stream refused by server"; + break; + case http2.constants.NGHTTP2_CANCEL: + code = constants_1.Status.CANCELLED; + details = "Call cancelled"; + break; + case http2.constants.NGHTTP2_ENHANCE_YOUR_CALM: + code = constants_1.Status.RESOURCE_EXHAUSTED; + details = "Bandwidth exhausted or memory limit exceeded"; + break; + case http2.constants.NGHTTP2_INADEQUATE_SECURITY: + code = constants_1.Status.PERMISSION_DENIED; + details = "Protocol not secure enough"; + break; + case http2.constants.NGHTTP2_INTERNAL_ERROR: + code = constants_1.Status.INTERNAL; + if (this.internalError === null) { + details = `Received RST_STREAM with code ${http2Stream.rstCode} (Internal server error)`; + } else { + if (this.internalError.code === "ECONNRESET" || this.internalError.code === "ETIMEDOUT") { + code = constants_1.Status.UNAVAILABLE; + details = this.internalError.message; + } else { + details = `Received RST_STREAM with code ${http2Stream.rstCode} triggered by internal client error: ${this.internalError.message}`; + } + } + break; + default: + code = constants_1.Status.INTERNAL; + details = `Received RST_STREAM with code ${http2Stream.rstCode}`; + } + this.endCall({ + code, + details, + metadata: new metadata_1.Metadata(), + rstCode: http2Stream.rstCode + }); + }); + }); + http2Stream.on("error", (err) => { + if (err.code !== "ERR_HTTP2_STREAM_ERROR") { + this.trace("Node error event: message=" + err.message + " code=" + err.code + " errno=" + getSystemErrorName(err.errno) + " syscall=" + err.syscall); + this.internalError = err; + } + this.callEventTracker.onStreamEnd(false); + }); + } + onDisconnect() { + this.endCall({ + code: constants_1.Status.UNAVAILABLE, + details: "Connection dropped", + metadata: new metadata_1.Metadata() + }); + } + outputStatus() { + if (!this.statusOutput) { + this.statusOutput = true; + this.trace("ended with status: code=" + this.finalStatus.code + ' details="' + this.finalStatus.details + '"'); + this.callEventTracker.onCallEnd(this.finalStatus); + process.nextTick(() => { + this.listener.onReceiveStatus(this.finalStatus); + }); + this.http2Stream.resume(); + } + } + trace(text) { + logging.trace(constants_2.LogVerbosity.DEBUG, TRACER_NAME, "[" + this.callId + "] " + text); + } + /** + * On first call, emits a 'status' event with the given StatusObject. + * Subsequent calls are no-ops. + * @param status The status of the call. + */ + endCall(status2) { + if (this.finalStatus === null || this.finalStatus.code === constants_1.Status.OK) { + this.finalStatus = status2; + this.maybeOutputStatus(); + } + this.destroyHttp2Stream(); + } + maybeOutputStatus() { + if (this.finalStatus !== null) { + if (this.finalStatus.code !== constants_1.Status.OK || this.readsClosed && this.unpushedReadMessages.length === 0 && !this.isReadFilterPending && !this.isPushPending) { + this.outputStatus(); + } + } + } + push(message) { + this.trace("pushing to reader message of length " + (message instanceof Buffer ? message.length : null)); + this.canPush = false; + this.isPushPending = true; + process.nextTick(() => { + this.isPushPending = false; + if (this.statusOutput) { + return; + } + this.listener.onReceiveMessage(message); + this.maybeOutputStatus(); + }); + } + tryPush(messageBytes) { + if (this.canPush) { + this.http2Stream.pause(); + this.push(messageBytes); + } else { + this.trace("unpushedReadMessages.push message of length " + messageBytes.length); + this.unpushedReadMessages.push(messageBytes); + } + } + handleTrailers(headers) { + this.callEventTracker.onStreamEnd(true); + let headersString = ""; + for (const header of Object.keys(headers)) { + headersString += " " + header + ": " + headers[header] + "\n"; + } + this.trace("Received server trailers:\n" + headersString); + let metadata; + try { + metadata = metadata_1.Metadata.fromHttp2Headers(headers); + } catch (e) { + metadata = new metadata_1.Metadata(); + } + const metadataMap = metadata.getMap(); + let code = this.mappedStatusCode; + if (code === constants_1.Status.UNKNOWN && typeof metadataMap["grpc-status"] === "string") { + const receivedStatus = Number(metadataMap["grpc-status"]); + if (receivedStatus in constants_1.Status) { + code = receivedStatus; + this.trace("received status code " + receivedStatus + " from server"); + } + metadata.remove("grpc-status"); + } + let details = ""; + if (typeof metadataMap["grpc-message"] === "string") { + try { + details = decodeURI(metadataMap["grpc-message"]); + } catch (e) { + details = metadataMap["grpc-message"]; + } + metadata.remove("grpc-message"); + this.trace('received status details string "' + details + '" from server'); + } + const status2 = { code, details, metadata }; + this.endCall(status2); + } + destroyHttp2Stream() { + var _a2; + if (!this.http2Stream.destroyed) { + let code; + if (((_a2 = this.finalStatus) === null || _a2 === void 0 ? void 0 : _a2.code) === constants_1.Status.OK) { + code = http2.constants.NGHTTP2_NO_ERROR; + } else { + code = http2.constants.NGHTTP2_CANCEL; + } + this.trace("close http2 stream with code " + code); + this.http2Stream.close(code); + } + } + cancelWithStatus(status2, details) { + this.trace("cancelWithStatus code: " + status2 + ' details: "' + details + '"'); + this.endCall({ code: status2, details, metadata: new metadata_1.Metadata() }); + } + getStatus() { + return this.finalStatus; + } + getPeer() { + return this.transport.getPeerName(); + } + getCallNumber() { + return this.callId; + } + startRead() { + if (this.finalStatus !== null && this.finalStatus.code !== constants_1.Status.OK) { + this.readsClosed = true; + this.maybeOutputStatus(); + return; + } + this.canPush = true; + if (this.unpushedReadMessages.length > 0) { + const nextMessage = this.unpushedReadMessages.shift(); + this.push(nextMessage); + return; + } + this.http2Stream.resume(); + } + sendMessageWithContext(context, message) { + this.trace("write() called with message of length " + message.length); + const cb = (error2) => { + var _a2; + let code = constants_1.Status.UNAVAILABLE; + if ((error2 === null || error2 === void 0 ? void 0 : error2.code) === "ERR_STREAM_WRITE_AFTER_END") { + code = constants_1.Status.INTERNAL; + } + if (error2) { + this.cancelWithStatus(code, `Write error: ${error2.message}`); + } + (_a2 = context.callback) === null || _a2 === void 0 ? void 0 : _a2.call(context); + }; + this.trace("sending data chunk of length " + message.length); + this.callEventTracker.addMessageSent(); + try { + this.http2Stream.write(message, cb); + } catch (error2) { + this.endCall({ + code: constants_1.Status.UNAVAILABLE, + details: `Write failed with error ${error2.message}`, + metadata: new metadata_1.Metadata() + }); + } + } + halfClose() { + this.trace("end() called"); + this.trace("calling end() on HTTP/2 stream"); + this.http2Stream.end(); + } + }; + exports2.Http2SubchannelCall = Http2SubchannelCall; + } +}); + +// node_modules/@grpc/grpc-js/build/src/call-number.js +var require_call_number = __commonJS({ + "node_modules/@grpc/grpc-js/build/src/call-number.js"(exports2) { + "use strict"; + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.getNextCallNumber = void 0; + var nextCallNumber = 0; + function getNextCallNumber() { + return nextCallNumber++; + } + exports2.getNextCallNumber = getNextCallNumber; + } +}); + +// node_modules/@grpc/grpc-js/package.json +var require_package2 = __commonJS({ + "node_modules/@grpc/grpc-js/package.json"(exports2, module2) { + module2.exports = { + name: "@grpc/grpc-js", + version: "1.9.0", + description: "gRPC Library for Node - pure JS implementation", + homepage: "https://grpc.io/", + repository: "https://github.com/grpc/grpc-node/tree/master/packages/grpc-js", + main: "build/src/index.js", + engines: { + node: "^8.13.0 || >=10.10.0" + }, + keywords: [], + author: { + name: "Google Inc." + }, + types: "build/src/index.d.ts", + license: "Apache-2.0", + devDependencies: { + "@types/gulp": "^4.0.6", + "@types/gulp-mocha": "0.0.32", + "@types/lodash": "^4.14.186", + "@types/mocha": "^5.2.6", + "@types/ncp": "^2.0.1", + "@types/pify": "^3.0.2", + "@types/semver": "^7.3.9", + "@typescript-eslint/eslint-plugin": "^5.59.11", + "@typescript-eslint/parser": "^5.59.11", + "@typescript-eslint/typescript-estree": "^5.59.11", + "clang-format": "^1.0.55", + eslint: "^8.42.0", + "eslint-config-prettier": "^8.8.0", + "eslint-plugin-node": "^11.1.0", + "eslint-plugin-prettier": "^4.2.1", + execa: "^2.0.3", + gulp: "^4.0.2", + "gulp-mocha": "^6.0.0", + lodash: "^4.17.4", + madge: "^5.0.1", + "mocha-jenkins-reporter": "^0.4.1", + ncp: "^2.0.0", + pify: "^4.0.1", + prettier: "^2.8.8", + rimraf: "^3.0.2", + semver: "^7.3.5", + "ts-node": "^10.9.1", + typescript: "^5.1.3" + }, + contributors: [ + { + name: "Google Inc." + } + ], + scripts: { + build: "npm run compile", + clean: "rimraf ./build", + compile: "tsc -p .", + format: 'clang-format -i -style="{Language: JavaScript, BasedOnStyle: Google, ColumnLimit: 80}" src/*.ts test/*.ts', + lint: "eslint src/*.ts test/*.ts", + prepare: "npm run generate-types && npm run compile", + test: "gulp test", + check: "npm run lint", + fix: "eslint --fix src/*.ts test/*.ts", + pretest: "npm run generate-types && npm run generate-test-types && npm run compile", + posttest: "npm run check && madge -c ./build/src", + "generate-types": "proto-loader-gen-types --keepCase --longs String --enums String --defaults --oneofs --includeComments --includeDirs proto/ --include-dirs test/fixtures/ -O src/generated/ --grpcLib ../index channelz.proto", + "generate-test-types": "proto-loader-gen-types --keepCase --longs String --enums String --defaults --oneofs --includeComments --include-dirs test/fixtures/ -O test/generated/ --grpcLib ../../src/index test_service.proto" + }, + dependencies: { + "@grpc/proto-loader": "^0.7.0", + "@types/node": ">=12.12.47" + }, + files: [ + "src/**/*.ts", + "build/src/**/*.{js,d.ts,js.map}", + "proto/*.proto", + "LICENSE", + "deps/envoy-api/envoy/api/v2/**/*.proto", + "deps/envoy-api/envoy/config/**/*.proto", + "deps/envoy-api/envoy/service/**/*.proto", + "deps/envoy-api/envoy/type/**/*.proto", + "deps/udpa/udpa/**/*.proto", + "deps/googleapis/google/api/*.proto", + "deps/googleapis/google/rpc/*.proto", + "deps/protoc-gen-validate/validate/**/*.proto" + ] + }; + } +}); + +// node_modules/@grpc/grpc-js/build/src/transport.js +var require_transport = __commonJS({ + "node_modules/@grpc/grpc-js/build/src/transport.js"(exports2) { + "use strict"; + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.Http2SubchannelConnector = void 0; + var http2 = require("http2"); + var tls_1 = require("tls"); + var channelz_1 = require_channelz(); + var constants_1 = require_constants(); + var http_proxy_1 = require_http_proxy(); + var logging = require_logging(); + var resolver_1 = require_resolver(); + var subchannel_address_1 = require_subchannel_address(); + var uri_parser_1 = require_uri_parser(); + var net = require("net"); + var subchannel_call_1 = require_subchannel_call(); + var call_number_1 = require_call_number(); + var TRACER_NAME = "transport"; + var FLOW_CONTROL_TRACER_NAME = "transport_flowctrl"; + var clientVersion = require_package2().version; + var { HTTP2_HEADER_AUTHORITY, HTTP2_HEADER_CONTENT_TYPE, HTTP2_HEADER_METHOD, HTTP2_HEADER_PATH, HTTP2_HEADER_TE, HTTP2_HEADER_USER_AGENT } = http2.constants; + var KEEPALIVE_TIMEOUT_MS = 2e4; + var tooManyPingsData = Buffer.from("too_many_pings", "ascii"); + var Http2Transport = class { + constructor(session, subchannelAddress, options2, remoteName) { + this.session = session; + this.remoteName = remoteName; + this.keepaliveTimeMs = -1; + this.keepaliveTimeoutMs = KEEPALIVE_TIMEOUT_MS; + this.keepaliveTimerId = null; + this.pendingSendKeepalivePing = false; + this.keepaliveTimeoutId = null; + this.keepaliveWithoutCalls = false; + this.activeCalls = /* @__PURE__ */ new Set(); + this.disconnectListeners = []; + this.disconnectHandled = false; + this.channelzEnabled = true; + this.streamTracker = new channelz_1.ChannelzCallTracker(); + this.keepalivesSent = 0; + this.messagesSent = 0; + this.messagesReceived = 0; + this.lastMessageSentTimestamp = null; + this.lastMessageReceivedTimestamp = null; + this.subchannelAddressString = (0, subchannel_address_1.subchannelAddressToString)(subchannelAddress); + if (options2["grpc.enable_channelz"] === 0) { + this.channelzEnabled = false; + } + this.channelzRef = (0, channelz_1.registerChannelzSocket)(this.subchannelAddressString, () => this.getChannelzInfo(), this.channelzEnabled); + this.userAgent = [ + options2["grpc.primary_user_agent"], + `grpc-node-js/${clientVersion}`, + options2["grpc.secondary_user_agent"] + ].filter((e) => e).join(" "); + if ("grpc.keepalive_time_ms" in options2) { + this.keepaliveTimeMs = options2["grpc.keepalive_time_ms"]; + } + if ("grpc.keepalive_timeout_ms" in options2) { + this.keepaliveTimeoutMs = options2["grpc.keepalive_timeout_ms"]; + } + if ("grpc.keepalive_permit_without_calls" in options2) { + this.keepaliveWithoutCalls = options2["grpc.keepalive_permit_without_calls"] === 1; + } else { + this.keepaliveWithoutCalls = false; + } + session.once("close", () => { + this.trace("session closed"); + this.stopKeepalivePings(); + this.handleDisconnect(); + }); + session.once("goaway", (errorCode, lastStreamID, opaqueData) => { + let tooManyPings = false; + if (errorCode === http2.constants.NGHTTP2_ENHANCE_YOUR_CALM && opaqueData.equals(tooManyPingsData)) { + tooManyPings = true; + } + this.trace("connection closed by GOAWAY with code " + errorCode); + this.reportDisconnectToOwner(tooManyPings); + }); + session.once("error", (error2) => { + this.trace("connection closed with error " + error2.message); + }); + if (logging.isTracerEnabled(TRACER_NAME)) { + session.on("remoteSettings", (settings) => { + this.trace("new settings received" + (this.session !== session ? " on the old connection" : "") + ": " + JSON.stringify(settings)); + }); + session.on("localSettings", (settings) => { + this.trace("local settings acknowledged by remote" + (this.session !== session ? " on the old connection" : "") + ": " + JSON.stringify(settings)); + }); + } + if (this.keepaliveWithoutCalls) { + this.maybeStartKeepalivePingTimer(); + } + } + getChannelzInfo() { + var _a2, _b, _c2; + const sessionSocket = this.session.socket; + const remoteAddress = sessionSocket.remoteAddress ? (0, subchannel_address_1.stringToSubchannelAddress)(sessionSocket.remoteAddress, sessionSocket.remotePort) : null; + const localAddress = sessionSocket.localAddress ? (0, subchannel_address_1.stringToSubchannelAddress)(sessionSocket.localAddress, sessionSocket.localPort) : null; + let tlsInfo; + if (this.session.encrypted) { + const tlsSocket = sessionSocket; + const cipherInfo = tlsSocket.getCipher(); + const certificate = tlsSocket.getCertificate(); + const peerCertificate = tlsSocket.getPeerCertificate(); + tlsInfo = { + cipherSuiteStandardName: (_a2 = cipherInfo.standardName) !== null && _a2 !== void 0 ? _a2 : null, + cipherSuiteOtherName: cipherInfo.standardName ? null : cipherInfo.name, + localCertificate: certificate && "raw" in certificate ? certificate.raw : null, + remoteCertificate: peerCertificate && "raw" in peerCertificate ? peerCertificate.raw : null + }; + } else { + tlsInfo = null; + } + const socketInfo = { + remoteAddress, + localAddress, + security: tlsInfo, + remoteName: this.remoteName, + streamsStarted: this.streamTracker.callsStarted, + streamsSucceeded: this.streamTracker.callsSucceeded, + streamsFailed: this.streamTracker.callsFailed, + messagesSent: this.messagesSent, + messagesReceived: this.messagesReceived, + keepAlivesSent: this.keepalivesSent, + lastLocalStreamCreatedTimestamp: this.streamTracker.lastCallStartedTimestamp, + lastRemoteStreamCreatedTimestamp: null, + lastMessageSentTimestamp: this.lastMessageSentTimestamp, + lastMessageReceivedTimestamp: this.lastMessageReceivedTimestamp, + localFlowControlWindow: (_b = this.session.state.localWindowSize) !== null && _b !== void 0 ? _b : null, + remoteFlowControlWindow: (_c2 = this.session.state.remoteWindowSize) !== null && _c2 !== void 0 ? _c2 : null + }; + return socketInfo; + } + trace(text) { + logging.trace(constants_1.LogVerbosity.DEBUG, TRACER_NAME, "(" + this.channelzRef.id + ") " + this.subchannelAddressString + " " + text); + } + keepaliveTrace(text) { + logging.trace(constants_1.LogVerbosity.DEBUG, "keepalive", "(" + this.channelzRef.id + ") " + this.subchannelAddressString + " " + text); + } + flowControlTrace(text) { + logging.trace(constants_1.LogVerbosity.DEBUG, FLOW_CONTROL_TRACER_NAME, "(" + this.channelzRef.id + ") " + this.subchannelAddressString + " " + text); + } + internalsTrace(text) { + logging.trace(constants_1.LogVerbosity.DEBUG, "transport_internals", "(" + this.channelzRef.id + ") " + this.subchannelAddressString + " " + text); + } + /** + * Indicate to the owner of this object that this transport should no longer + * be used. That happens if the connection drops, or if the server sends a + * GOAWAY. + * @param tooManyPings If true, this was triggered by a GOAWAY with data + * indicating that the session was closed becaues the client sent too many + * pings. + * @returns + */ + reportDisconnectToOwner(tooManyPings) { + if (this.disconnectHandled) { + return; + } + this.disconnectHandled = true; + this.disconnectListeners.forEach((listener) => listener(tooManyPings)); + } + /** + * Handle connection drops, but not GOAWAYs. + */ + handleDisconnect() { + this.reportDisconnectToOwner(false); + setImmediate(() => { + for (const call of this.activeCalls) { + call.onDisconnect(); + } + }); + } + addDisconnectListener(listener) { + this.disconnectListeners.push(listener); + } + clearKeepaliveTimer() { + if (!this.keepaliveTimerId) { + return; + } + clearTimeout(this.keepaliveTimerId); + this.keepaliveTimerId = null; + } + clearKeepaliveTimeout() { + if (!this.keepaliveTimeoutId) { + return; + } + clearTimeout(this.keepaliveTimeoutId); + this.keepaliveTimeoutId = null; + } + canSendPing() { + return this.keepaliveTimeMs > 0 && (this.keepaliveWithoutCalls || this.activeCalls.size > 0); + } + maybeSendPing() { + var _a2, _b; + this.clearKeepaliveTimer(); + if (!this.canSendPing()) { + this.pendingSendKeepalivePing = true; + return; + } + if (this.channelzEnabled) { + this.keepalivesSent += 1; + } + this.keepaliveTrace("Sending ping with timeout " + this.keepaliveTimeoutMs + "ms"); + if (!this.keepaliveTimeoutId) { + this.keepaliveTimeoutId = setTimeout(() => { + this.keepaliveTrace("Ping timeout passed without response"); + this.handleDisconnect(); + }, this.keepaliveTimeoutMs); + (_b = (_a2 = this.keepaliveTimeoutId).unref) === null || _b === void 0 ? void 0 : _b.call(_a2); + } + try { + this.session.ping((err, duration, payload) => { + this.keepaliveTrace("Received ping response"); + this.clearKeepaliveTimeout(); + this.maybeStartKeepalivePingTimer(); + }); + } catch (e) { + this.handleDisconnect(); + } + } + /** + * Starts the keepalive ping timer if appropriate. If the timer already ran + * out while there were no active requests, instead send a ping immediately. + * If the ping timer is already running or a ping is currently in flight, + * instead do nothing and wait for them to resolve. + */ + maybeStartKeepalivePingTimer() { + var _a2, _b; + if (!this.canSendPing()) { + return; + } + if (this.pendingSendKeepalivePing) { + this.pendingSendKeepalivePing = false; + this.maybeSendPing(); + } else if (!this.keepaliveTimerId && !this.keepaliveTimeoutId) { + this.keepaliveTrace("Starting keepalive timer for " + this.keepaliveTimeMs + "ms"); + this.keepaliveTimerId = (_b = (_a2 = setTimeout(() => { + this.maybeSendPing(); + }, this.keepaliveTimeMs)).unref) === null || _b === void 0 ? void 0 : _b.call(_a2); + } + } + stopKeepalivePings() { + if (this.keepaliveTimerId) { + clearTimeout(this.keepaliveTimerId); + this.keepaliveTimerId = null; + } + this.clearKeepaliveTimeout(); + } + removeActiveCall(call) { + this.activeCalls.delete(call); + if (this.activeCalls.size === 0) { + this.session.unref(); + } + } + addActiveCall(call) { + this.activeCalls.add(call); + if (this.activeCalls.size === 1) { + this.session.ref(); + if (!this.keepaliveWithoutCalls) { + this.maybeStartKeepalivePingTimer(); + } + } + } + createCall(metadata, host, method, listener, subchannelCallStatsTracker) { + const headers = metadata.toHttp2Headers(); + headers[HTTP2_HEADER_AUTHORITY] = host; + headers[HTTP2_HEADER_USER_AGENT] = this.userAgent; + headers[HTTP2_HEADER_CONTENT_TYPE] = "application/grpc"; + headers[HTTP2_HEADER_METHOD] = "POST"; + headers[HTTP2_HEADER_PATH] = method; + headers[HTTP2_HEADER_TE] = "trailers"; + let http2Stream; + try { + http2Stream = this.session.request(headers); + } catch (e) { + this.handleDisconnect(); + throw e; + } + this.flowControlTrace("local window size: " + this.session.state.localWindowSize + " remote window size: " + this.session.state.remoteWindowSize); + this.internalsTrace("session.closed=" + this.session.closed + " session.destroyed=" + this.session.destroyed + " session.socket.destroyed=" + this.session.socket.destroyed); + let eventTracker; + let call; + if (this.channelzEnabled) { + this.streamTracker.addCallStarted(); + eventTracker = { + addMessageSent: () => { + var _a2; + this.messagesSent += 1; + this.lastMessageSentTimestamp = /* @__PURE__ */ new Date(); + (_a2 = subchannelCallStatsTracker.addMessageSent) === null || _a2 === void 0 ? void 0 : _a2.call(subchannelCallStatsTracker); + }, + addMessageReceived: () => { + var _a2; + this.messagesReceived += 1; + this.lastMessageReceivedTimestamp = /* @__PURE__ */ new Date(); + (_a2 = subchannelCallStatsTracker.addMessageReceived) === null || _a2 === void 0 ? void 0 : _a2.call(subchannelCallStatsTracker); + }, + onCallEnd: (status2) => { + var _a2; + (_a2 = subchannelCallStatsTracker.onCallEnd) === null || _a2 === void 0 ? void 0 : _a2.call(subchannelCallStatsTracker, status2); + this.removeActiveCall(call); + }, + onStreamEnd: (success) => { + var _a2; + if (success) { + this.streamTracker.addCallSucceeded(); + } else { + this.streamTracker.addCallFailed(); + } + (_a2 = subchannelCallStatsTracker.onStreamEnd) === null || _a2 === void 0 ? void 0 : _a2.call(subchannelCallStatsTracker, success); + } + }; + } else { + eventTracker = { + addMessageSent: () => { + var _a2; + (_a2 = subchannelCallStatsTracker.addMessageSent) === null || _a2 === void 0 ? void 0 : _a2.call(subchannelCallStatsTracker); + }, + addMessageReceived: () => { + var _a2; + (_a2 = subchannelCallStatsTracker.addMessageReceived) === null || _a2 === void 0 ? void 0 : _a2.call(subchannelCallStatsTracker); + }, + onCallEnd: (status2) => { + var _a2; + (_a2 = subchannelCallStatsTracker.onCallEnd) === null || _a2 === void 0 ? void 0 : _a2.call(subchannelCallStatsTracker, status2); + this.removeActiveCall(call); + }, + onStreamEnd: (success) => { + var _a2; + (_a2 = subchannelCallStatsTracker.onStreamEnd) === null || _a2 === void 0 ? void 0 : _a2.call(subchannelCallStatsTracker, success); + } + }; + } + call = new subchannel_call_1.Http2SubchannelCall(http2Stream, eventTracker, listener, this, (0, call_number_1.getNextCallNumber)()); + this.addActiveCall(call); + return call; + } + getChannelzRef() { + return this.channelzRef; + } + getPeerName() { + return this.subchannelAddressString; + } + shutdown() { + this.session.close(); + (0, channelz_1.unregisterChannelzRef)(this.channelzRef); + } + }; + var Http2SubchannelConnector = class { + constructor(channelTarget) { + this.channelTarget = channelTarget; + this.session = null; + this.isShutdown = false; + } + trace(text) { + logging.trace(constants_1.LogVerbosity.DEBUG, TRACER_NAME, (0, uri_parser_1.uriToString)(this.channelTarget) + " " + text); + } + createSession(address, credentials2, options2, proxyConnectionResult) { + if (this.isShutdown) { + return Promise.reject(); + } + return new Promise((resolve, reject) => { + var _a2, _b, _c2; + let remoteName; + if (proxyConnectionResult.realTarget) { + remoteName = (0, uri_parser_1.uriToString)(proxyConnectionResult.realTarget); + this.trace("creating HTTP/2 session through proxy to " + (0, uri_parser_1.uriToString)(proxyConnectionResult.realTarget)); + } else { + remoteName = null; + this.trace("creating HTTP/2 session to " + (0, subchannel_address_1.subchannelAddressToString)(address)); + } + const targetAuthority = (0, resolver_1.getDefaultAuthority)((_a2 = proxyConnectionResult.realTarget) !== null && _a2 !== void 0 ? _a2 : this.channelTarget); + let connectionOptions = credentials2._getConnectionOptions() || {}; + connectionOptions.maxSendHeaderBlockLength = Number.MAX_SAFE_INTEGER; + if ("grpc-node.max_session_memory" in options2) { + connectionOptions.maxSessionMemory = options2["grpc-node.max_session_memory"]; + } else { + connectionOptions.maxSessionMemory = Number.MAX_SAFE_INTEGER; + } + let addressScheme = "http://"; + if ("secureContext" in connectionOptions) { + addressScheme = "https://"; + if (options2["grpc.ssl_target_name_override"]) { + const sslTargetNameOverride = options2["grpc.ssl_target_name_override"]; + connectionOptions.checkServerIdentity = (host, cert) => { + return (0, tls_1.checkServerIdentity)(sslTargetNameOverride, cert); + }; + connectionOptions.servername = sslTargetNameOverride; + } else { + const authorityHostname = (_c2 = (_b = (0, uri_parser_1.splitHostPort)(targetAuthority)) === null || _b === void 0 ? void 0 : _b.host) !== null && _c2 !== void 0 ? _c2 : "localhost"; + connectionOptions.servername = authorityHostname; + } + if (proxyConnectionResult.socket) { + connectionOptions.createConnection = (authority, option) => { + return proxyConnectionResult.socket; + }; + } + } else { + connectionOptions.createConnection = (authority, option) => { + if (proxyConnectionResult.socket) { + return proxyConnectionResult.socket; + } else { + return net.connect(address); + } + }; + } + connectionOptions = Object.assign(Object.assign(Object.assign({}, connectionOptions), address), { enableTrace: options2["grpc-node.tls_enable_trace"] === 1 }); + const session = http2.connect(addressScheme + targetAuthority, connectionOptions); + this.session = session; + session.unref(); + session.once("connect", () => { + session.removeAllListeners(); + resolve(new Http2Transport(session, address, options2, remoteName)); + this.session = null; + }); + session.once("close", () => { + this.session = null; + reject(); + }); + session.once("error", (error2) => { + this.trace("connection failed with error " + error2.message); + }); + }); + } + connect(address, credentials2, options2) { + var _a2, _b; + if (this.isShutdown) { + return Promise.reject(); + } + const connectionOptions = credentials2._getConnectionOptions() || {}; + if ("secureContext" in connectionOptions) { + connectionOptions.ALPNProtocols = ["h2"]; + if (options2["grpc.ssl_target_name_override"]) { + const sslTargetNameOverride = options2["grpc.ssl_target_name_override"]; + connectionOptions.checkServerIdentity = (host, cert) => { + return (0, tls_1.checkServerIdentity)(sslTargetNameOverride, cert); + }; + connectionOptions.servername = sslTargetNameOverride; + } else { + if ("grpc.http_connect_target" in options2) { + const targetPath = (0, resolver_1.getDefaultAuthority)((_a2 = (0, uri_parser_1.parseUri)(options2["grpc.http_connect_target"])) !== null && _a2 !== void 0 ? _a2 : { + path: "localhost" + }); + const hostPort = (0, uri_parser_1.splitHostPort)(targetPath); + connectionOptions.servername = (_b = hostPort === null || hostPort === void 0 ? void 0 : hostPort.host) !== null && _b !== void 0 ? _b : targetPath; + } + } + if (options2["grpc-node.tls_enable_trace"]) { + connectionOptions.enableTrace = true; + } + } + return (0, http_proxy_1.getProxiedConnection)(address, options2, connectionOptions).then((result) => this.createSession(address, credentials2, options2, result)); + } + shutdown() { + var _a2; + this.isShutdown = true; + (_a2 = this.session) === null || _a2 === void 0 ? void 0 : _a2.close(); + this.session = null; + } + }; + exports2.Http2SubchannelConnector = Http2SubchannelConnector; + } +}); + +// node_modules/@grpc/grpc-js/build/src/subchannel-pool.js +var require_subchannel_pool = __commonJS({ + "node_modules/@grpc/grpc-js/build/src/subchannel-pool.js"(exports2) { + "use strict"; + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.getSubchannelPool = exports2.SubchannelPool = void 0; + var channel_options_1 = require_channel_options(); + var subchannel_1 = require_subchannel(); + var subchannel_address_1 = require_subchannel_address(); + var uri_parser_1 = require_uri_parser(); + var transport_1 = require_transport(); + var REF_CHECK_INTERVAL = 1e4; + var SubchannelPool = class { + /** + * A pool of subchannels use for making connections. Subchannels with the + * exact same parameters will be reused. + */ + constructor() { + this.pool = /* @__PURE__ */ Object.create(null); + this.cleanupTimer = null; + } + /** + * Unrefs all unused subchannels and cancels the cleanup task if all + * subchannels have been unrefed. + */ + unrefUnusedSubchannels() { + let allSubchannelsUnrefed = true; + for (const channelTarget in this.pool) { + const subchannelObjArray = this.pool[channelTarget]; + const refedSubchannels = subchannelObjArray.filter((value) => !value.subchannel.unrefIfOneRef()); + if (refedSubchannels.length > 0) { + allSubchannelsUnrefed = false; + } + this.pool[channelTarget] = refedSubchannels; + } + if (allSubchannelsUnrefed && this.cleanupTimer !== null) { + clearInterval(this.cleanupTimer); + this.cleanupTimer = null; + } + } + /** + * Ensures that the cleanup task is spawned. + */ + ensureCleanupTask() { + var _a2, _b; + if (this.cleanupTimer === null) { + this.cleanupTimer = setInterval(() => { + this.unrefUnusedSubchannels(); + }, REF_CHECK_INTERVAL); + (_b = (_a2 = this.cleanupTimer).unref) === null || _b === void 0 ? void 0 : _b.call(_a2); + } + } + /** + * Get a subchannel if one already exists with exactly matching parameters. + * Otherwise, create and save a subchannel with those parameters. + * @param channelTarget + * @param subchannelTarget + * @param channelArguments + * @param channelCredentials + */ + getOrCreateSubchannel(channelTargetUri, subchannelTarget, channelArguments, channelCredentials) { + this.ensureCleanupTask(); + const channelTarget = (0, uri_parser_1.uriToString)(channelTargetUri); + if (channelTarget in this.pool) { + const subchannelObjArray = this.pool[channelTarget]; + for (const subchannelObj of subchannelObjArray) { + if ((0, subchannel_address_1.subchannelAddressEqual)(subchannelTarget, subchannelObj.subchannelAddress) && (0, channel_options_1.channelOptionsEqual)(channelArguments, subchannelObj.channelArguments) && channelCredentials._equals(subchannelObj.channelCredentials)) { + return subchannelObj.subchannel; + } + } + } + const subchannel = new subchannel_1.Subchannel(channelTargetUri, subchannelTarget, channelArguments, channelCredentials, new transport_1.Http2SubchannelConnector(channelTargetUri)); + if (!(channelTarget in this.pool)) { + this.pool[channelTarget] = []; + } + this.pool[channelTarget].push({ + subchannelAddress: subchannelTarget, + channelArguments, + channelCredentials, + subchannel + }); + subchannel.ref(); + return subchannel; + } + }; + exports2.SubchannelPool = SubchannelPool; + var globalSubchannelPool = new SubchannelPool(); + function getSubchannelPool(global2) { + if (global2) { + return globalSubchannelPool; + } else { + return new SubchannelPool(); + } + } + exports2.getSubchannelPool = getSubchannelPool; + } +}); + +// node_modules/@grpc/grpc-js/build/src/filter-stack.js +var require_filter_stack = __commonJS({ + "node_modules/@grpc/grpc-js/build/src/filter-stack.js"(exports2) { + "use strict"; + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.FilterStackFactory = exports2.FilterStack = void 0; + var FilterStack = class { + constructor(filters) { + this.filters = filters; + } + sendMetadata(metadata) { + let result = metadata; + for (let i = 0; i < this.filters.length; i++) { + result = this.filters[i].sendMetadata(result); + } + return result; + } + receiveMetadata(metadata) { + let result = metadata; + for (let i = this.filters.length - 1; i >= 0; i--) { + result = this.filters[i].receiveMetadata(result); + } + return result; + } + sendMessage(message) { + let result = message; + for (let i = 0; i < this.filters.length; i++) { + result = this.filters[i].sendMessage(result); + } + return result; + } + receiveMessage(message) { + let result = message; + for (let i = this.filters.length - 1; i >= 0; i--) { + result = this.filters[i].receiveMessage(result); + } + return result; + } + receiveTrailers(status2) { + let result = status2; + for (let i = this.filters.length - 1; i >= 0; i--) { + result = this.filters[i].receiveTrailers(result); + } + return result; + } + push(filters) { + this.filters.unshift(...filters); + } + getFilters() { + return this.filters; + } + }; + exports2.FilterStack = FilterStack; + var FilterStackFactory = class _FilterStackFactory { + constructor(factories) { + this.factories = factories; + } + push(filterFactories) { + this.factories.unshift(...filterFactories); + } + clone() { + return new _FilterStackFactory([...this.factories]); + } + createFilter() { + return new FilterStack(this.factories.map((factory) => factory.createFilter())); + } + }; + exports2.FilterStackFactory = FilterStackFactory; + } +}); + +// node_modules/@grpc/grpc-js/build/src/compression-algorithms.js +var require_compression_algorithms = __commonJS({ + "node_modules/@grpc/grpc-js/build/src/compression-algorithms.js"(exports2) { + "use strict"; + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.CompressionAlgorithms = void 0; + var CompressionAlgorithms; + (function(CompressionAlgorithms2) { + CompressionAlgorithms2[CompressionAlgorithms2["identity"] = 0] = "identity"; + CompressionAlgorithms2[CompressionAlgorithms2["deflate"] = 1] = "deflate"; + CompressionAlgorithms2[CompressionAlgorithms2["gzip"] = 2] = "gzip"; + })(CompressionAlgorithms || (exports2.CompressionAlgorithms = CompressionAlgorithms = {})); + } +}); + +// node_modules/@grpc/grpc-js/build/src/filter.js +var require_filter = __commonJS({ + "node_modules/@grpc/grpc-js/build/src/filter.js"(exports2) { + "use strict"; + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.BaseFilter = void 0; + var BaseFilter = class { + async sendMetadata(metadata) { + return metadata; + } + receiveMetadata(metadata) { + return metadata; + } + async sendMessage(message) { + return message; + } + async receiveMessage(message) { + return message; + } + receiveTrailers(status2) { + return status2; + } + }; + exports2.BaseFilter = BaseFilter; + } +}); + +// node_modules/@grpc/grpc-js/build/src/compression-filter.js +var require_compression_filter = __commonJS({ + "node_modules/@grpc/grpc-js/build/src/compression-filter.js"(exports2) { + "use strict"; + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.CompressionFilterFactory = exports2.CompressionFilter = void 0; + var zlib = require("zlib"); + var compression_algorithms_1 = require_compression_algorithms(); + var constants_1 = require_constants(); + var filter_1 = require_filter(); + var logging = require_logging(); + var isCompressionAlgorithmKey = (key) => { + return typeof key === "number" && typeof compression_algorithms_1.CompressionAlgorithms[key] === "string"; + }; + var CompressionHandler = class { + /** + * @param message Raw uncompressed message bytes + * @param compress Indicates whether the message should be compressed + * @return Framed message, compressed if applicable + */ + async writeMessage(message, compress) { + let messageBuffer = message; + if (compress) { + messageBuffer = await this.compressMessage(messageBuffer); + } + const output = Buffer.allocUnsafe(messageBuffer.length + 5); + output.writeUInt8(compress ? 1 : 0, 0); + output.writeUInt32BE(messageBuffer.length, 1); + messageBuffer.copy(output, 5); + return output; + } + /** + * @param data Framed message, possibly compressed + * @return Uncompressed message + */ + async readMessage(data) { + const compressed = data.readUInt8(0) === 1; + let messageBuffer = data.slice(5); + if (compressed) { + messageBuffer = await this.decompressMessage(messageBuffer); + } + return messageBuffer; + } + }; + var IdentityHandler = class extends CompressionHandler { + async compressMessage(message) { + return message; + } + async writeMessage(message, compress) { + const output = Buffer.allocUnsafe(message.length + 5); + output.writeUInt8(0, 0); + output.writeUInt32BE(message.length, 1); + message.copy(output, 5); + return output; + } + decompressMessage(message) { + return Promise.reject(new Error('Received compressed message but "grpc-encoding" header was identity')); + } + }; + var DeflateHandler = class extends CompressionHandler { + compressMessage(message) { + return new Promise((resolve, reject) => { + zlib.deflate(message, (err, output) => { + if (err) { + reject(err); + } else { + resolve(output); + } + }); + }); + } + decompressMessage(message) { + return new Promise((resolve, reject) => { + zlib.inflate(message, (err, output) => { + if (err) { + reject(err); + } else { + resolve(output); + } + }); + }); + } + }; + var GzipHandler = class extends CompressionHandler { + compressMessage(message) { + return new Promise((resolve, reject) => { + zlib.gzip(message, (err, output) => { + if (err) { + reject(err); + } else { + resolve(output); + } + }); + }); + } + decompressMessage(message) { + return new Promise((resolve, reject) => { + zlib.unzip(message, (err, output) => { + if (err) { + reject(err); + } else { + resolve(output); + } + }); + }); + } + }; + var UnknownHandler = class extends CompressionHandler { + constructor(compressionName) { + super(); + this.compressionName = compressionName; + } + compressMessage(message) { + return Promise.reject(new Error(`Received message compressed with unsupported compression method ${this.compressionName}`)); + } + decompressMessage(message) { + return Promise.reject(new Error(`Compression method not supported: ${this.compressionName}`)); + } + }; + function getCompressionHandler(compressionName) { + switch (compressionName) { + case "identity": + return new IdentityHandler(); + case "deflate": + return new DeflateHandler(); + case "gzip": + return new GzipHandler(); + default: + return new UnknownHandler(compressionName); + } + } + var CompressionFilter = class extends filter_1.BaseFilter { + constructor(channelOptions, sharedFilterConfig) { + var _a2; + super(); + this.sharedFilterConfig = sharedFilterConfig; + this.sendCompression = new IdentityHandler(); + this.receiveCompression = new IdentityHandler(); + this.currentCompressionAlgorithm = "identity"; + const compressionAlgorithmKey = channelOptions["grpc.default_compression_algorithm"]; + if (compressionAlgorithmKey !== void 0) { + if (isCompressionAlgorithmKey(compressionAlgorithmKey)) { + const clientSelectedEncoding = compression_algorithms_1.CompressionAlgorithms[compressionAlgorithmKey]; + const serverSupportedEncodings = (_a2 = sharedFilterConfig.serverSupportedEncodingHeader) === null || _a2 === void 0 ? void 0 : _a2.split(","); + if (!serverSupportedEncodings || serverSupportedEncodings.includes(clientSelectedEncoding)) { + this.currentCompressionAlgorithm = clientSelectedEncoding; + this.sendCompression = getCompressionHandler(this.currentCompressionAlgorithm); + } + } else { + logging.log(constants_1.LogVerbosity.ERROR, `Invalid value provided for grpc.default_compression_algorithm option: ${compressionAlgorithmKey}`); + } + } + } + async sendMetadata(metadata) { + const headers = await metadata; + headers.set("grpc-accept-encoding", "identity,deflate,gzip"); + headers.set("accept-encoding", "identity"); + if (this.currentCompressionAlgorithm === "identity") { + headers.remove("grpc-encoding"); + } else { + headers.set("grpc-encoding", this.currentCompressionAlgorithm); + } + return headers; + } + receiveMetadata(metadata) { + const receiveEncoding = metadata.get("grpc-encoding"); + if (receiveEncoding.length > 0) { + const encoding = receiveEncoding[0]; + if (typeof encoding === "string") { + this.receiveCompression = getCompressionHandler(encoding); + } + } + metadata.remove("grpc-encoding"); + const serverSupportedEncodingsHeader = metadata.get("grpc-accept-encoding")[0]; + if (serverSupportedEncodingsHeader) { + this.sharedFilterConfig.serverSupportedEncodingHeader = serverSupportedEncodingsHeader; + const serverSupportedEncodings = serverSupportedEncodingsHeader.split(","); + if (!serverSupportedEncodings.includes(this.currentCompressionAlgorithm)) { + this.sendCompression = new IdentityHandler(); + this.currentCompressionAlgorithm = "identity"; + } + } + metadata.remove("grpc-accept-encoding"); + return metadata; + } + async sendMessage(message) { + var _a2; + const resolvedMessage = await message; + let compress; + if (this.sendCompression instanceof IdentityHandler) { + compress = false; + } else { + compress = (((_a2 = resolvedMessage.flags) !== null && _a2 !== void 0 ? _a2 : 0) & 2) === 0; + } + return { + message: await this.sendCompression.writeMessage(resolvedMessage.message, compress), + flags: resolvedMessage.flags + }; + } + async receiveMessage(message) { + return this.receiveCompression.readMessage(await message); + } + }; + exports2.CompressionFilter = CompressionFilter; + var CompressionFilterFactory = class { + constructor(channel, options2) { + this.options = options2; + this.sharedFilterConfig = {}; + } + createFilter() { + return new CompressionFilter(this.options, this.sharedFilterConfig); + } + }; + exports2.CompressionFilterFactory = CompressionFilterFactory; + } +}); + +// node_modules/@grpc/grpc-js/build/src/max-message-size-filter.js +var require_max_message_size_filter = __commonJS({ + "node_modules/@grpc/grpc-js/build/src/max-message-size-filter.js"(exports2) { + "use strict"; + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.MaxMessageSizeFilterFactory = exports2.MaxMessageSizeFilter = void 0; + var filter_1 = require_filter(); + var constants_1 = require_constants(); + var metadata_1 = require_metadata(); + var MaxMessageSizeFilter = class extends filter_1.BaseFilter { + constructor(options2) { + super(); + this.maxSendMessageSize = constants_1.DEFAULT_MAX_SEND_MESSAGE_LENGTH; + this.maxReceiveMessageSize = constants_1.DEFAULT_MAX_RECEIVE_MESSAGE_LENGTH; + if ("grpc.max_send_message_length" in options2) { + this.maxSendMessageSize = options2["grpc.max_send_message_length"]; + } + if ("grpc.max_receive_message_length" in options2) { + this.maxReceiveMessageSize = options2["grpc.max_receive_message_length"]; + } + } + async sendMessage(message) { + if (this.maxSendMessageSize === -1) { + return message; + } else { + const concreteMessage = await message; + if (concreteMessage.message.length > this.maxSendMessageSize) { + throw { + code: constants_1.Status.RESOURCE_EXHAUSTED, + details: `Sent message larger than max (${concreteMessage.message.length} vs. ${this.maxSendMessageSize})`, + metadata: new metadata_1.Metadata() + }; + } else { + return concreteMessage; + } + } + } + async receiveMessage(message) { + if (this.maxReceiveMessageSize === -1) { + return message; + } else { + const concreteMessage = await message; + if (concreteMessage.length > this.maxReceiveMessageSize) { + throw { + code: constants_1.Status.RESOURCE_EXHAUSTED, + details: `Received message larger than max (${concreteMessage.length} vs. ${this.maxReceiveMessageSize})`, + metadata: new metadata_1.Metadata() + }; + } else { + return concreteMessage; + } + } + } + }; + exports2.MaxMessageSizeFilter = MaxMessageSizeFilter; + var MaxMessageSizeFilterFactory = class { + constructor(options2) { + this.options = options2; + } + createFilter() { + return new MaxMessageSizeFilter(this.options); + } + }; + exports2.MaxMessageSizeFilterFactory = MaxMessageSizeFilterFactory; + } +}); + +// node_modules/@grpc/grpc-js/build/src/deadline.js +var require_deadline = __commonJS({ + "node_modules/@grpc/grpc-js/build/src/deadline.js"(exports2) { + "use strict"; + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.deadlineToString = exports2.getRelativeTimeout = exports2.getDeadlineTimeoutString = exports2.minDeadline = void 0; + function minDeadline(...deadlineList) { + let minValue = Infinity; + for (const deadline of deadlineList) { + const deadlineMsecs = deadline instanceof Date ? deadline.getTime() : deadline; + if (deadlineMsecs < minValue) { + minValue = deadlineMsecs; + } + } + return minValue; + } + exports2.minDeadline = minDeadline; + var units = [ + ["m", 1], + ["S", 1e3], + ["M", 60 * 1e3], + ["H", 60 * 60 * 1e3] + ]; + function getDeadlineTimeoutString(deadline) { + const now = (/* @__PURE__ */ new Date()).getTime(); + if (deadline instanceof Date) { + deadline = deadline.getTime(); + } + const timeoutMs = Math.max(deadline - now, 0); + for (const [unit, factor] of units) { + const amount = timeoutMs / factor; + if (amount < 1e8) { + return String(Math.ceil(amount)) + unit; + } + } + throw new Error("Deadline is too far in the future"); + } + exports2.getDeadlineTimeoutString = getDeadlineTimeoutString; + var MAX_TIMEOUT_TIME = 2147483647; + function getRelativeTimeout(deadline) { + const deadlineMs = deadline instanceof Date ? deadline.getTime() : deadline; + const now = (/* @__PURE__ */ new Date()).getTime(); + const timeout = deadlineMs - now; + if (timeout < 0) { + return 0; + } else if (timeout > MAX_TIMEOUT_TIME) { + return Infinity; + } else { + return timeout; + } + } + exports2.getRelativeTimeout = getRelativeTimeout; + function deadlineToString(deadline) { + if (deadline instanceof Date) { + return deadline.toISOString(); + } else { + const dateDeadline = new Date(deadline); + if (Number.isNaN(dateDeadline.getTime())) { + return "" + deadline; + } else { + return dateDeadline.toISOString(); + } + } + } + exports2.deadlineToString = deadlineToString; + } +}); + +// node_modules/@grpc/grpc-js/build/src/control-plane-status.js +var require_control_plane_status = __commonJS({ + "node_modules/@grpc/grpc-js/build/src/control-plane-status.js"(exports2) { + "use strict"; + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.restrictControlPlaneStatusCode = void 0; + var constants_1 = require_constants(); + var INAPPROPRIATE_CONTROL_PLANE_CODES = [ + constants_1.Status.OK, + constants_1.Status.INVALID_ARGUMENT, + constants_1.Status.NOT_FOUND, + constants_1.Status.ALREADY_EXISTS, + constants_1.Status.FAILED_PRECONDITION, + constants_1.Status.ABORTED, + constants_1.Status.OUT_OF_RANGE, + constants_1.Status.DATA_LOSS + ]; + function restrictControlPlaneStatusCode(code, details) { + if (INAPPROPRIATE_CONTROL_PLANE_CODES.includes(code)) { + return { + code: constants_1.Status.INTERNAL, + details: `Invalid status from control plane: ${code} ${constants_1.Status[code]} ${details}` + }; + } else { + return { code, details }; + } + } + exports2.restrictControlPlaneStatusCode = restrictControlPlaneStatusCode; + } +}); + +// node_modules/@grpc/grpc-js/build/src/load-balancing-call.js +var require_load_balancing_call = __commonJS({ + "node_modules/@grpc/grpc-js/build/src/load-balancing-call.js"(exports2) { + "use strict"; + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.LoadBalancingCall = void 0; + var connectivity_state_1 = require_connectivity_state(); + var constants_1 = require_constants(); + var deadline_1 = require_deadline(); + var metadata_1 = require_metadata(); + var picker_1 = require_picker(); + var uri_parser_1 = require_uri_parser(); + var logging = require_logging(); + var control_plane_status_1 = require_control_plane_status(); + var http2 = require("http2"); + var TRACER_NAME = "load_balancing_call"; + var LoadBalancingCall = class { + constructor(channel, callConfig, methodName, host, credentials2, deadline, callNumber) { + var _a2, _b; + this.channel = channel; + this.callConfig = callConfig; + this.methodName = methodName; + this.host = host; + this.credentials = credentials2; + this.deadline = deadline; + this.callNumber = callNumber; + this.child = null; + this.readPending = false; + this.pendingMessage = null; + this.pendingHalfClose = false; + this.ended = false; + this.metadata = null; + this.listener = null; + this.onCallEnded = null; + const splitPath = this.methodName.split("/"); + let serviceName = ""; + if (splitPath.length >= 2) { + serviceName = splitPath[1]; + } + const hostname = (_b = (_a2 = (0, uri_parser_1.splitHostPort)(this.host)) === null || _a2 === void 0 ? void 0 : _a2.host) !== null && _b !== void 0 ? _b : "localhost"; + this.serviceUrl = `https://${hostname}/${serviceName}`; + } + trace(text) { + logging.trace(constants_1.LogVerbosity.DEBUG, TRACER_NAME, "[" + this.callNumber + "] " + text); + } + outputStatus(status2, progress) { + var _a2, _b; + if (!this.ended) { + this.ended = true; + this.trace("ended with status: code=" + status2.code + ' details="' + status2.details + '"'); + const finalStatus = Object.assign(Object.assign({}, status2), { progress }); + (_a2 = this.listener) === null || _a2 === void 0 ? void 0 : _a2.onReceiveStatus(finalStatus); + (_b = this.onCallEnded) === null || _b === void 0 ? void 0 : _b.call(this, finalStatus.code); + } + } + doPick() { + var _a2, _b; + if (this.ended) { + return; + } + if (!this.metadata) { + throw new Error("doPick called before start"); + } + this.trace("Pick called"); + const pickResult = this.channel.doPick(this.metadata, this.callConfig.pickInformation); + const subchannelString = pickResult.subchannel ? "(" + pickResult.subchannel.getChannelzRef().id + ") " + pickResult.subchannel.getAddress() : "" + pickResult.subchannel; + this.trace("Pick result: " + picker_1.PickResultType[pickResult.pickResultType] + " subchannel: " + subchannelString + " status: " + ((_a2 = pickResult.status) === null || _a2 === void 0 ? void 0 : _a2.code) + " " + ((_b = pickResult.status) === null || _b === void 0 ? void 0 : _b.details)); + switch (pickResult.pickResultType) { + case picker_1.PickResultType.COMPLETE: + this.credentials.generateMetadata({ service_url: this.serviceUrl }).then((credsMetadata) => { + var _a3, _b2, _c2; + const finalMetadata = this.metadata.clone(); + finalMetadata.merge(credsMetadata); + if (finalMetadata.get("authorization").length > 1) { + this.outputStatus({ + code: constants_1.Status.INTERNAL, + details: '"authorization" metadata cannot have multiple values', + metadata: new metadata_1.Metadata() + }, "PROCESSED"); + } + if (pickResult.subchannel.getConnectivityState() !== connectivity_state_1.ConnectivityState.READY) { + this.trace("Picked subchannel " + subchannelString + " has state " + connectivity_state_1.ConnectivityState[pickResult.subchannel.getConnectivityState()] + " after getting credentials metadata. Retrying pick"); + this.doPick(); + return; + } + if (this.deadline !== Infinity) { + finalMetadata.set("grpc-timeout", (0, deadline_1.getDeadlineTimeoutString)(this.deadline)); + } + try { + this.child = pickResult.subchannel.getRealSubchannel().createCall(finalMetadata, this.host, this.methodName, { + onReceiveMetadata: (metadata) => { + this.trace("Received metadata"); + this.listener.onReceiveMetadata(metadata); + }, + onReceiveMessage: (message) => { + this.trace("Received message"); + this.listener.onReceiveMessage(message); + }, + onReceiveStatus: (status2) => { + this.trace("Received status"); + if (status2.rstCode === http2.constants.NGHTTP2_REFUSED_STREAM) { + this.outputStatus(status2, "REFUSED"); + } else { + this.outputStatus(status2, "PROCESSED"); + } + } + }); + } catch (error2) { + this.trace("Failed to start call on picked subchannel " + subchannelString + " with error " + error2.message); + this.outputStatus({ + code: constants_1.Status.INTERNAL, + details: "Failed to start HTTP/2 stream with error " + error2.message, + metadata: new metadata_1.Metadata() + }, "NOT_STARTED"); + return; + } + (_b2 = (_a3 = this.callConfig).onCommitted) === null || _b2 === void 0 ? void 0 : _b2.call(_a3); + (_c2 = pickResult.onCallStarted) === null || _c2 === void 0 ? void 0 : _c2.call(pickResult); + this.onCallEnded = pickResult.onCallEnded; + this.trace("Created child call [" + this.child.getCallNumber() + "]"); + if (this.readPending) { + this.child.startRead(); + } + if (this.pendingMessage) { + this.child.sendMessageWithContext(this.pendingMessage.context, this.pendingMessage.message); + } + if (this.pendingHalfClose) { + this.child.halfClose(); + } + }, (error2) => { + const { code: code2, details: details2 } = (0, control_plane_status_1.restrictControlPlaneStatusCode)(typeof error2.code === "number" ? error2.code : constants_1.Status.UNKNOWN, `Getting metadata from plugin failed with error: ${error2.message}`); + this.outputStatus({ + code: code2, + details: details2, + metadata: new metadata_1.Metadata() + }, "PROCESSED"); + }); + break; + case picker_1.PickResultType.DROP: + const { code, details } = (0, control_plane_status_1.restrictControlPlaneStatusCode)(pickResult.status.code, pickResult.status.details); + setImmediate(() => { + this.outputStatus({ code, details, metadata: pickResult.status.metadata }, "DROP"); + }); + break; + case picker_1.PickResultType.TRANSIENT_FAILURE: + if (this.metadata.getOptions().waitForReady) { + this.channel.queueCallForPick(this); + } else { + const { code: code2, details: details2 } = (0, control_plane_status_1.restrictControlPlaneStatusCode)(pickResult.status.code, pickResult.status.details); + setImmediate(() => { + this.outputStatus({ code: code2, details: details2, metadata: pickResult.status.metadata }, "PROCESSED"); + }); + } + break; + case picker_1.PickResultType.QUEUE: + this.channel.queueCallForPick(this); + } + } + cancelWithStatus(status2, details) { + var _a2; + this.trace("cancelWithStatus code: " + status2 + ' details: "' + details + '"'); + (_a2 = this.child) === null || _a2 === void 0 ? void 0 : _a2.cancelWithStatus(status2, details); + this.outputStatus({ code: status2, details, metadata: new metadata_1.Metadata() }, "PROCESSED"); + } + getPeer() { + var _a2, _b; + return (_b = (_a2 = this.child) === null || _a2 === void 0 ? void 0 : _a2.getPeer()) !== null && _b !== void 0 ? _b : this.channel.getTarget(); + } + start(metadata, listener) { + this.trace("start called"); + this.listener = listener; + this.metadata = metadata; + this.doPick(); + } + sendMessageWithContext(context, message) { + this.trace("write() called with message of length " + message.length); + if (this.child) { + this.child.sendMessageWithContext(context, message); + } else { + this.pendingMessage = { context, message }; + } + } + startRead() { + this.trace("startRead called"); + if (this.child) { + this.child.startRead(); + } else { + this.readPending = true; + } + } + halfClose() { + this.trace("halfClose called"); + if (this.child) { + this.child.halfClose(); + } else { + this.pendingHalfClose = true; + } + } + setCredentials(credentials2) { + throw new Error("Method not implemented."); + } + getCallNumber() { + return this.callNumber; + } + }; + exports2.LoadBalancingCall = LoadBalancingCall; + } +}); + +// node_modules/@grpc/grpc-js/build/src/resolving-call.js +var require_resolving_call = __commonJS({ + "node_modules/@grpc/grpc-js/build/src/resolving-call.js"(exports2) { + "use strict"; + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.ResolvingCall = void 0; + var constants_1 = require_constants(); + var deadline_1 = require_deadline(); + var metadata_1 = require_metadata(); + var logging = require_logging(); + var control_plane_status_1 = require_control_plane_status(); + var TRACER_NAME = "resolving_call"; + var ResolvingCall = class { + constructor(channel, method, options2, filterStackFactory, credentials2, callNumber) { + this.channel = channel; + this.method = method; + this.filterStackFactory = filterStackFactory; + this.credentials = credentials2; + this.callNumber = callNumber; + this.child = null; + this.readPending = false; + this.pendingMessage = null; + this.pendingHalfClose = false; + this.ended = false; + this.readFilterPending = false; + this.writeFilterPending = false; + this.pendingChildStatus = null; + this.metadata = null; + this.listener = null; + this.statusWatchers = []; + this.deadlineTimer = setTimeout(() => { + }, 0); + this.filterStack = null; + this.deadline = options2.deadline; + this.host = options2.host; + if (options2.parentCall) { + if (options2.flags & constants_1.Propagate.CANCELLATION) { + options2.parentCall.on("cancelled", () => { + this.cancelWithStatus(constants_1.Status.CANCELLED, "Cancelled by parent call"); + }); + } + if (options2.flags & constants_1.Propagate.DEADLINE) { + this.trace("Propagating deadline from parent: " + options2.parentCall.getDeadline()); + this.deadline = (0, deadline_1.minDeadline)(this.deadline, options2.parentCall.getDeadline()); + } + } + this.trace("Created"); + this.runDeadlineTimer(); + } + trace(text) { + logging.trace(constants_1.LogVerbosity.DEBUG, TRACER_NAME, "[" + this.callNumber + "] " + text); + } + runDeadlineTimer() { + clearTimeout(this.deadlineTimer); + this.trace("Deadline: " + (0, deadline_1.deadlineToString)(this.deadline)); + const timeout = (0, deadline_1.getRelativeTimeout)(this.deadline); + if (timeout !== Infinity) { + this.trace("Deadline will be reached in " + timeout + "ms"); + const handleDeadline = () => { + this.cancelWithStatus(constants_1.Status.DEADLINE_EXCEEDED, "Deadline exceeded"); + }; + if (timeout <= 0) { + process.nextTick(handleDeadline); + } else { + this.deadlineTimer = setTimeout(handleDeadline, timeout); + } + } + } + outputStatus(status2) { + if (!this.ended) { + this.ended = true; + if (!this.filterStack) { + this.filterStack = this.filterStackFactory.createFilter(); + } + clearTimeout(this.deadlineTimer); + const filteredStatus = this.filterStack.receiveTrailers(status2); + this.trace("ended with status: code=" + filteredStatus.code + ' details="' + filteredStatus.details + '"'); + this.statusWatchers.forEach((watcher) => watcher(filteredStatus)); + process.nextTick(() => { + var _a2; + (_a2 = this.listener) === null || _a2 === void 0 ? void 0 : _a2.onReceiveStatus(filteredStatus); + }); + } + } + sendMessageOnChild(context, message) { + if (!this.child) { + throw new Error("sendMessageonChild called with child not populated"); + } + const child = this.child; + this.writeFilterPending = true; + this.filterStack.sendMessage(Promise.resolve({ message, flags: context.flags })).then((filteredMessage) => { + this.writeFilterPending = false; + child.sendMessageWithContext(context, filteredMessage.message); + if (this.pendingHalfClose) { + child.halfClose(); + } + }, (status2) => { + this.cancelWithStatus(status2.code, status2.details); + }); + } + getConfig() { + if (this.ended) { + return; + } + if (!this.metadata || !this.listener) { + throw new Error("getConfig called before start"); + } + const configResult = this.channel.getConfig(this.method, this.metadata); + if (configResult.type === "NONE") { + this.channel.queueCallForConfig(this); + return; + } else if (configResult.type === "ERROR") { + if (this.metadata.getOptions().waitForReady) { + this.channel.queueCallForConfig(this); + } else { + this.outputStatus(configResult.error); + } + return; + } + const config2 = configResult.config; + if (config2.status !== constants_1.Status.OK) { + const { code, details } = (0, control_plane_status_1.restrictControlPlaneStatusCode)(config2.status, "Failed to route call to method " + this.method); + this.outputStatus({ + code, + details, + metadata: new metadata_1.Metadata() + }); + return; + } + if (config2.methodConfig.timeout) { + const configDeadline = /* @__PURE__ */ new Date(); + configDeadline.setSeconds(configDeadline.getSeconds() + config2.methodConfig.timeout.seconds); + configDeadline.setMilliseconds(configDeadline.getMilliseconds() + config2.methodConfig.timeout.nanos / 1e6); + this.deadline = (0, deadline_1.minDeadline)(this.deadline, configDeadline); + this.runDeadlineTimer(); + } + this.filterStackFactory.push(config2.dynamicFilterFactories); + this.filterStack = this.filterStackFactory.createFilter(); + this.filterStack.sendMetadata(Promise.resolve(this.metadata)).then((filteredMetadata) => { + this.child = this.channel.createInnerCall(config2, this.method, this.host, this.credentials, this.deadline); + this.trace("Created child [" + this.child.getCallNumber() + "]"); + this.child.start(filteredMetadata, { + onReceiveMetadata: (metadata) => { + this.trace("Received metadata"); + this.listener.onReceiveMetadata(this.filterStack.receiveMetadata(metadata)); + }, + onReceiveMessage: (message) => { + this.trace("Received message"); + this.readFilterPending = true; + this.filterStack.receiveMessage(message).then((filteredMesssage) => { + this.trace("Finished filtering received message"); + this.readFilterPending = false; + this.listener.onReceiveMessage(filteredMesssage); + if (this.pendingChildStatus) { + this.outputStatus(this.pendingChildStatus); + } + }, (status2) => { + this.cancelWithStatus(status2.code, status2.details); + }); + }, + onReceiveStatus: (status2) => { + this.trace("Received status"); + if (this.readFilterPending) { + this.pendingChildStatus = status2; + } else { + this.outputStatus(status2); + } + } + }); + if (this.readPending) { + this.child.startRead(); + } + if (this.pendingMessage) { + this.sendMessageOnChild(this.pendingMessage.context, this.pendingMessage.message); + } else if (this.pendingHalfClose) { + this.child.halfClose(); + } + }, (status2) => { + this.outputStatus(status2); + }); + } + reportResolverError(status2) { + var _a2; + if ((_a2 = this.metadata) === null || _a2 === void 0 ? void 0 : _a2.getOptions().waitForReady) { + this.channel.queueCallForConfig(this); + } else { + this.outputStatus(status2); + } + } + cancelWithStatus(status2, details) { + var _a2; + this.trace("cancelWithStatus code: " + status2 + ' details: "' + details + '"'); + (_a2 = this.child) === null || _a2 === void 0 ? void 0 : _a2.cancelWithStatus(status2, details); + this.outputStatus({ + code: status2, + details, + metadata: new metadata_1.Metadata() + }); + } + getPeer() { + var _a2, _b; + return (_b = (_a2 = this.child) === null || _a2 === void 0 ? void 0 : _a2.getPeer()) !== null && _b !== void 0 ? _b : this.channel.getTarget(); + } + start(metadata, listener) { + this.trace("start called"); + this.metadata = metadata.clone(); + this.listener = listener; + this.getConfig(); + } + sendMessageWithContext(context, message) { + this.trace("write() called with message of length " + message.length); + if (this.child) { + this.sendMessageOnChild(context, message); + } else { + this.pendingMessage = { context, message }; + } + } + startRead() { + this.trace("startRead called"); + if (this.child) { + this.child.startRead(); + } else { + this.readPending = true; + } + } + halfClose() { + this.trace("halfClose called"); + if (this.child && !this.writeFilterPending) { + this.child.halfClose(); + } else { + this.pendingHalfClose = true; + } + } + setCredentials(credentials2) { + this.credentials = this.credentials.compose(credentials2); + } + addStatusWatcher(watcher) { + this.statusWatchers.push(watcher); + } + getCallNumber() { + return this.callNumber; + } + }; + exports2.ResolvingCall = ResolvingCall; + } +}); + +// node_modules/@grpc/grpc-js/build/src/retrying-call.js +var require_retrying_call = __commonJS({ + "node_modules/@grpc/grpc-js/build/src/retrying-call.js"(exports2) { + "use strict"; + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.RetryingCall = exports2.MessageBufferTracker = exports2.RetryThrottler = void 0; + var constants_1 = require_constants(); + var metadata_1 = require_metadata(); + var logging = require_logging(); + var TRACER_NAME = "retrying_call"; + var RetryThrottler = class { + constructor(maxTokens, tokenRatio, previousRetryThrottler) { + this.maxTokens = maxTokens; + this.tokenRatio = tokenRatio; + if (previousRetryThrottler) { + this.tokens = previousRetryThrottler.tokens * (maxTokens / previousRetryThrottler.maxTokens); + } else { + this.tokens = maxTokens; + } + } + addCallSucceeded() { + this.tokens = Math.max(this.tokens + this.tokenRatio, this.maxTokens); + } + addCallFailed() { + this.tokens = Math.min(this.tokens - 1, 0); + } + canRetryCall() { + return this.tokens > this.maxTokens / 2; + } + }; + exports2.RetryThrottler = RetryThrottler; + var MessageBufferTracker = class { + constructor(totalLimit, limitPerCall) { + this.totalLimit = totalLimit; + this.limitPerCall = limitPerCall; + this.totalAllocated = 0; + this.allocatedPerCall = /* @__PURE__ */ new Map(); + } + allocate(size, callId) { + var _a2; + const currentPerCall = (_a2 = this.allocatedPerCall.get(callId)) !== null && _a2 !== void 0 ? _a2 : 0; + if (this.limitPerCall - currentPerCall < size || this.totalLimit - this.totalAllocated < size) { + return false; + } + this.allocatedPerCall.set(callId, currentPerCall + size); + this.totalAllocated += size; + return true; + } + free(size, callId) { + var _a2; + if (this.totalAllocated < size) { + throw new Error(`Invalid buffer allocation state: call ${callId} freed ${size} > total allocated ${this.totalAllocated}`); + } + this.totalAllocated -= size; + const currentPerCall = (_a2 = this.allocatedPerCall.get(callId)) !== null && _a2 !== void 0 ? _a2 : 0; + if (currentPerCall < size) { + throw new Error(`Invalid buffer allocation state: call ${callId} freed ${size} > allocated for call ${currentPerCall}`); + } + this.allocatedPerCall.set(callId, currentPerCall - size); + } + freeAll(callId) { + var _a2; + const currentPerCall = (_a2 = this.allocatedPerCall.get(callId)) !== null && _a2 !== void 0 ? _a2 : 0; + if (this.totalAllocated < currentPerCall) { + throw new Error(`Invalid buffer allocation state: call ${callId} allocated ${currentPerCall} > total allocated ${this.totalAllocated}`); + } + this.totalAllocated -= currentPerCall; + this.allocatedPerCall.delete(callId); + } + }; + exports2.MessageBufferTracker = MessageBufferTracker; + var PREVIONS_RPC_ATTEMPTS_METADATA_KEY = "grpc-previous-rpc-attempts"; + var RetryingCall = class { + constructor(channel, callConfig, methodName, host, credentials2, deadline, callNumber, bufferTracker, retryThrottler) { + this.channel = channel; + this.callConfig = callConfig; + this.methodName = methodName; + this.host = host; + this.credentials = credentials2; + this.deadline = deadline; + this.callNumber = callNumber; + this.bufferTracker = bufferTracker; + this.retryThrottler = retryThrottler; + this.listener = null; + this.initialMetadata = null; + this.underlyingCalls = []; + this.writeBuffer = []; + this.writeBufferOffset = 0; + this.readStarted = false; + this.transparentRetryUsed = false; + this.attempts = 0; + this.hedgingTimer = null; + this.committedCallIndex = null; + this.initialRetryBackoffSec = 0; + this.nextRetryBackoffSec = 0; + if (callConfig.methodConfig.retryPolicy) { + this.state = "RETRY"; + const retryPolicy = callConfig.methodConfig.retryPolicy; + this.nextRetryBackoffSec = this.initialRetryBackoffSec = Number(retryPolicy.initialBackoff.substring(0, retryPolicy.initialBackoff.length - 1)); + } else if (callConfig.methodConfig.hedgingPolicy) { + this.state = "HEDGING"; + } else { + this.state = "TRANSPARENT_ONLY"; + } + } + getCallNumber() { + return this.callNumber; + } + trace(text) { + logging.trace(constants_1.LogVerbosity.DEBUG, TRACER_NAME, "[" + this.callNumber + "] " + text); + } + reportStatus(statusObject) { + this.trace("ended with status: code=" + statusObject.code + ' details="' + statusObject.details + '"'); + this.bufferTracker.freeAll(this.callNumber); + this.writeBufferOffset = this.writeBufferOffset + this.writeBuffer.length; + this.writeBuffer = []; + process.nextTick(() => { + var _a2; + (_a2 = this.listener) === null || _a2 === void 0 ? void 0 : _a2.onReceiveStatus({ + code: statusObject.code, + details: statusObject.details, + metadata: statusObject.metadata + }); + }); + } + cancelWithStatus(status2, details) { + this.trace("cancelWithStatus code: " + status2 + ' details: "' + details + '"'); + this.reportStatus({ code: status2, details, metadata: new metadata_1.Metadata() }); + for (const { call } of this.underlyingCalls) { + call.cancelWithStatus(status2, details); + } + } + getPeer() { + if (this.committedCallIndex !== null) { + return this.underlyingCalls[this.committedCallIndex].call.getPeer(); + } else { + return "unknown"; + } + } + getBufferEntry(messageIndex) { + var _a2; + return (_a2 = this.writeBuffer[messageIndex - this.writeBufferOffset]) !== null && _a2 !== void 0 ? _a2 : { + entryType: "FREED", + allocated: false + }; + } + getNextBufferIndex() { + return this.writeBufferOffset + this.writeBuffer.length; + } + clearSentMessages() { + if (this.state !== "COMMITTED") { + return; + } + const earliestNeededMessageIndex = this.underlyingCalls[this.committedCallIndex].nextMessageToSend; + for (let messageIndex = this.writeBufferOffset; messageIndex < earliestNeededMessageIndex; messageIndex++) { + const bufferEntry = this.getBufferEntry(messageIndex); + if (bufferEntry.allocated) { + this.bufferTracker.free(bufferEntry.message.message.length, this.callNumber); + } + } + this.writeBuffer = this.writeBuffer.slice(earliestNeededMessageIndex - this.writeBufferOffset); + this.writeBufferOffset = earliestNeededMessageIndex; + } + commitCall(index) { + if (this.state === "COMMITTED") { + return; + } + if (this.underlyingCalls[index].state === "COMPLETED") { + return; + } + this.trace("Committing call [" + this.underlyingCalls[index].call.getCallNumber() + "] at index " + index); + this.state = "COMMITTED"; + this.committedCallIndex = index; + for (let i = 0; i < this.underlyingCalls.length; i++) { + if (i === index) { + continue; + } + if (this.underlyingCalls[i].state === "COMPLETED") { + continue; + } + this.underlyingCalls[i].state = "COMPLETED"; + this.underlyingCalls[i].call.cancelWithStatus(constants_1.Status.CANCELLED, "Discarded in favor of other hedged attempt"); + } + this.clearSentMessages(); + } + commitCallWithMostMessages() { + if (this.state === "COMMITTED") { + return; + } + let mostMessages = -1; + let callWithMostMessages = -1; + for (const [index, childCall] of this.underlyingCalls.entries()) { + if (childCall.state === "ACTIVE" && childCall.nextMessageToSend > mostMessages) { + mostMessages = childCall.nextMessageToSend; + callWithMostMessages = index; + } + } + if (callWithMostMessages === -1) { + this.state = "TRANSPARENT_ONLY"; + } else { + this.commitCall(callWithMostMessages); + } + } + isStatusCodeInList(list, code) { + return list.some((value) => value === code || value.toString().toLowerCase() === constants_1.Status[code].toLowerCase()); + } + getNextRetryBackoffMs() { + var _a2; + const retryPolicy = (_a2 = this.callConfig) === null || _a2 === void 0 ? void 0 : _a2.methodConfig.retryPolicy; + if (!retryPolicy) { + return 0; + } + const nextBackoffMs = Math.random() * this.nextRetryBackoffSec * 1e3; + const maxBackoffSec = Number(retryPolicy.maxBackoff.substring(0, retryPolicy.maxBackoff.length - 1)); + this.nextRetryBackoffSec = Math.min(this.nextRetryBackoffSec * retryPolicy.backoffMultiplier, maxBackoffSec); + return nextBackoffMs; + } + maybeRetryCall(pushback, callback) { + if (this.state !== "RETRY") { + callback(false); + return; + } + const retryPolicy = this.callConfig.methodConfig.retryPolicy; + if (this.attempts >= Math.min(retryPolicy.maxAttempts, 5)) { + callback(false); + return; + } + let retryDelayMs; + if (pushback === null) { + retryDelayMs = this.getNextRetryBackoffMs(); + } else if (pushback < 0) { + this.state = "TRANSPARENT_ONLY"; + callback(false); + return; + } else { + retryDelayMs = pushback; + this.nextRetryBackoffSec = this.initialRetryBackoffSec; + } + setTimeout(() => { + var _a2, _b; + if (this.state !== "RETRY") { + callback(false); + return; + } + if ((_b = (_a2 = this.retryThrottler) === null || _a2 === void 0 ? void 0 : _a2.canRetryCall()) !== null && _b !== void 0 ? _b : true) { + callback(true); + this.attempts += 1; + this.startNewAttempt(); + } + }, retryDelayMs); + } + countActiveCalls() { + let count = 0; + for (const call of this.underlyingCalls) { + if ((call === null || call === void 0 ? void 0 : call.state) === "ACTIVE") { + count += 1; + } + } + return count; + } + handleProcessedStatus(status2, callIndex, pushback) { + var _a2, _b, _c2; + switch (this.state) { + case "COMMITTED": + case "TRANSPARENT_ONLY": + this.commitCall(callIndex); + this.reportStatus(status2); + break; + case "HEDGING": + if (this.isStatusCodeInList((_a2 = this.callConfig.methodConfig.hedgingPolicy.nonFatalStatusCodes) !== null && _a2 !== void 0 ? _a2 : [], status2.code)) { + (_b = this.retryThrottler) === null || _b === void 0 ? void 0 : _b.addCallFailed(); + let delayMs; + if (pushback === null) { + delayMs = 0; + } else if (pushback < 0) { + this.state = "TRANSPARENT_ONLY"; + this.commitCall(callIndex); + this.reportStatus(status2); + return; + } else { + delayMs = pushback; + } + setTimeout(() => { + this.maybeStartHedgingAttempt(); + if (this.countActiveCalls() === 0) { + this.commitCall(callIndex); + this.reportStatus(status2); + } + }, delayMs); + } else { + this.commitCall(callIndex); + this.reportStatus(status2); + } + break; + case "RETRY": + if (this.isStatusCodeInList(this.callConfig.methodConfig.retryPolicy.retryableStatusCodes, status2.code)) { + (_c2 = this.retryThrottler) === null || _c2 === void 0 ? void 0 : _c2.addCallFailed(); + this.maybeRetryCall(pushback, (retried) => { + if (!retried) { + this.commitCall(callIndex); + this.reportStatus(status2); + } + }); + } else { + this.commitCall(callIndex); + this.reportStatus(status2); + } + break; + } + } + getPushback(metadata) { + const mdValue = metadata.get("grpc-retry-pushback-ms"); + if (mdValue.length === 0) { + return null; + } + try { + return parseInt(mdValue[0]); + } catch (e) { + return -1; + } + } + handleChildStatus(status2, callIndex) { + var _a2; + if (this.underlyingCalls[callIndex].state === "COMPLETED") { + return; + } + this.trace("state=" + this.state + " handling status with progress " + status2.progress + " from child [" + this.underlyingCalls[callIndex].call.getCallNumber() + "] in state " + this.underlyingCalls[callIndex].state); + this.underlyingCalls[callIndex].state = "COMPLETED"; + if (status2.code === constants_1.Status.OK) { + (_a2 = this.retryThrottler) === null || _a2 === void 0 ? void 0 : _a2.addCallSucceeded(); + this.commitCall(callIndex); + this.reportStatus(status2); + return; + } + if (this.state === "COMMITTED") { + this.reportStatus(status2); + return; + } + const pushback = this.getPushback(status2.metadata); + switch (status2.progress) { + case "NOT_STARTED": + this.startNewAttempt(); + break; + case "REFUSED": + if (this.transparentRetryUsed) { + this.handleProcessedStatus(status2, callIndex, pushback); + } else { + this.transparentRetryUsed = true; + this.startNewAttempt(); + } + break; + case "DROP": + this.commitCall(callIndex); + this.reportStatus(status2); + break; + case "PROCESSED": + this.handleProcessedStatus(status2, callIndex, pushback); + break; + } + } + maybeStartHedgingAttempt() { + if (this.state !== "HEDGING") { + return; + } + if (!this.callConfig.methodConfig.hedgingPolicy) { + return; + } + const hedgingPolicy = this.callConfig.methodConfig.hedgingPolicy; + if (this.attempts >= Math.min(hedgingPolicy.maxAttempts, 5)) { + return; + } + this.attempts += 1; + this.startNewAttempt(); + this.maybeStartHedgingTimer(); + } + maybeStartHedgingTimer() { + var _a2, _b, _c2; + if (this.hedgingTimer) { + clearTimeout(this.hedgingTimer); + } + if (this.state !== "HEDGING") { + return; + } + if (!this.callConfig.methodConfig.hedgingPolicy) { + return; + } + const hedgingPolicy = this.callConfig.methodConfig.hedgingPolicy; + if (this.attempts >= Math.min(hedgingPolicy.maxAttempts, 5)) { + return; + } + const hedgingDelayString = (_a2 = hedgingPolicy.hedgingDelay) !== null && _a2 !== void 0 ? _a2 : "0s"; + const hedgingDelaySec = Number(hedgingDelayString.substring(0, hedgingDelayString.length - 1)); + this.hedgingTimer = setTimeout(() => { + this.maybeStartHedgingAttempt(); + }, hedgingDelaySec * 1e3); + (_c2 = (_b = this.hedgingTimer).unref) === null || _c2 === void 0 ? void 0 : _c2.call(_b); + } + startNewAttempt() { + const child = this.channel.createLoadBalancingCall(this.callConfig, this.methodName, this.host, this.credentials, this.deadline); + this.trace("Created child call [" + child.getCallNumber() + "] for attempt " + this.attempts); + const index = this.underlyingCalls.length; + this.underlyingCalls.push({ + state: "ACTIVE", + call: child, + nextMessageToSend: 0 + }); + const previousAttempts = this.attempts - 1; + const initialMetadata = this.initialMetadata.clone(); + if (previousAttempts > 0) { + initialMetadata.set(PREVIONS_RPC_ATTEMPTS_METADATA_KEY, `${previousAttempts}`); + } + let receivedMetadata = false; + child.start(initialMetadata, { + onReceiveMetadata: (metadata) => { + this.trace("Received metadata from child [" + child.getCallNumber() + "]"); + this.commitCall(index); + receivedMetadata = true; + if (previousAttempts > 0) { + metadata.set(PREVIONS_RPC_ATTEMPTS_METADATA_KEY, `${previousAttempts}`); + } + if (this.underlyingCalls[index].state === "ACTIVE") { + this.listener.onReceiveMetadata(metadata); + } + }, + onReceiveMessage: (message) => { + this.trace("Received message from child [" + child.getCallNumber() + "]"); + this.commitCall(index); + if (this.underlyingCalls[index].state === "ACTIVE") { + this.listener.onReceiveMessage(message); + } + }, + onReceiveStatus: (status2) => { + this.trace("Received status from child [" + child.getCallNumber() + "]"); + if (!receivedMetadata && previousAttempts > 0) { + status2.metadata.set(PREVIONS_RPC_ATTEMPTS_METADATA_KEY, `${previousAttempts}`); + } + this.handleChildStatus(status2, index); + } + }); + this.sendNextChildMessage(index); + if (this.readStarted) { + child.startRead(); + } + } + start(metadata, listener) { + this.trace("start called"); + this.listener = listener; + this.initialMetadata = metadata; + this.attempts += 1; + this.startNewAttempt(); + this.maybeStartHedgingTimer(); + } + handleChildWriteCompleted(childIndex) { + var _a2, _b; + const childCall = this.underlyingCalls[childIndex]; + const messageIndex = childCall.nextMessageToSend; + (_b = (_a2 = this.getBufferEntry(messageIndex)).callback) === null || _b === void 0 ? void 0 : _b.call(_a2); + this.clearSentMessages(); + childCall.nextMessageToSend += 1; + this.sendNextChildMessage(childIndex); + } + sendNextChildMessage(childIndex) { + const childCall = this.underlyingCalls[childIndex]; + if (childCall.state === "COMPLETED") { + return; + } + if (this.getBufferEntry(childCall.nextMessageToSend)) { + const bufferEntry = this.getBufferEntry(childCall.nextMessageToSend); + switch (bufferEntry.entryType) { + case "MESSAGE": + childCall.call.sendMessageWithContext({ + callback: (error2) => { + this.handleChildWriteCompleted(childIndex); + } + }, bufferEntry.message.message); + break; + case "HALF_CLOSE": + childCall.nextMessageToSend += 1; + childCall.call.halfClose(); + break; + case "FREED": + break; + } + } + } + sendMessageWithContext(context, message) { + var _a2; + this.trace("write() called with message of length " + message.length); + const writeObj = { + message, + flags: context.flags + }; + const messageIndex = this.getNextBufferIndex(); + const bufferEntry = { + entryType: "MESSAGE", + message: writeObj, + allocated: this.bufferTracker.allocate(message.length, this.callNumber) + }; + this.writeBuffer.push(bufferEntry); + if (bufferEntry.allocated) { + (_a2 = context.callback) === null || _a2 === void 0 ? void 0 : _a2.call(context); + for (const [callIndex, call] of this.underlyingCalls.entries()) { + if (call.state === "ACTIVE" && call.nextMessageToSend === messageIndex) { + call.call.sendMessageWithContext({ + callback: (error2) => { + this.handleChildWriteCompleted(callIndex); + } + }, message); + } + } + } else { + this.commitCallWithMostMessages(); + if (this.committedCallIndex === null) { + return; + } + const call = this.underlyingCalls[this.committedCallIndex]; + bufferEntry.callback = context.callback; + if (call.state === "ACTIVE" && call.nextMessageToSend === messageIndex) { + call.call.sendMessageWithContext({ + callback: (error2) => { + this.handleChildWriteCompleted(this.committedCallIndex); + } + }, message); + } + } + } + startRead() { + this.trace("startRead called"); + this.readStarted = true; + for (const underlyingCall of this.underlyingCalls) { + if ((underlyingCall === null || underlyingCall === void 0 ? void 0 : underlyingCall.state) === "ACTIVE") { + underlyingCall.call.startRead(); + } + } + } + halfClose() { + this.trace("halfClose called"); + const halfCloseIndex = this.getNextBufferIndex(); + this.writeBuffer.push({ + entryType: "HALF_CLOSE", + allocated: false + }); + for (const call of this.underlyingCalls) { + if ((call === null || call === void 0 ? void 0 : call.state) === "ACTIVE" && call.nextMessageToSend === halfCloseIndex) { + call.nextMessageToSend += 1; + call.call.halfClose(); + } + } + } + setCredentials(newCredentials) { + throw new Error("Method not implemented."); + } + getMethod() { + return this.methodName; + } + getHost() { + return this.host; + } + }; + exports2.RetryingCall = RetryingCall; + } +}); + +// node_modules/@grpc/grpc-js/build/src/subchannel-interface.js +var require_subchannel_interface = __commonJS({ + "node_modules/@grpc/grpc-js/build/src/subchannel-interface.js"(exports2) { + "use strict"; + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.BaseSubchannelWrapper = void 0; + var BaseSubchannelWrapper = class { + constructor(child) { + this.child = child; + } + getConnectivityState() { + return this.child.getConnectivityState(); + } + addConnectivityStateListener(listener) { + this.child.addConnectivityStateListener(listener); + } + removeConnectivityStateListener(listener) { + this.child.removeConnectivityStateListener(listener); + } + startConnecting() { + this.child.startConnecting(); + } + getAddress() { + return this.child.getAddress(); + } + throttleKeepalive(newKeepaliveTime) { + this.child.throttleKeepalive(newKeepaliveTime); + } + ref() { + this.child.ref(); + } + unref() { + this.child.unref(); + } + getChannelzRef() { + return this.child.getChannelzRef(); + } + getRealSubchannel() { + return this.child.getRealSubchannel(); + } + realSubchannelEquals(other) { + return this.getRealSubchannel() === other.getRealSubchannel(); + } + }; + exports2.BaseSubchannelWrapper = BaseSubchannelWrapper; + } +}); + +// node_modules/@grpc/grpc-js/build/src/internal-channel.js +var require_internal_channel = __commonJS({ + "node_modules/@grpc/grpc-js/build/src/internal-channel.js"(exports2) { + "use strict"; + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.InternalChannel = void 0; + var channel_credentials_1 = require_channel_credentials(); + var resolving_load_balancer_1 = require_resolving_load_balancer(); + var subchannel_pool_1 = require_subchannel_pool(); + var picker_1 = require_picker(); + var constants_1 = require_constants(); + var filter_stack_1 = require_filter_stack(); + var compression_filter_1 = require_compression_filter(); + var resolver_1 = require_resolver(); + var logging_1 = require_logging(); + var max_message_size_filter_1 = require_max_message_size_filter(); + var http_proxy_1 = require_http_proxy(); + var uri_parser_1 = require_uri_parser(); + var connectivity_state_1 = require_connectivity_state(); + var channelz_1 = require_channelz(); + var load_balancing_call_1 = require_load_balancing_call(); + var deadline_1 = require_deadline(); + var resolving_call_1 = require_resolving_call(); + var call_number_1 = require_call_number(); + var control_plane_status_1 = require_control_plane_status(); + var retrying_call_1 = require_retrying_call(); + var subchannel_interface_1 = require_subchannel_interface(); + var MAX_TIMEOUT_TIME = 2147483647; + var MIN_IDLE_TIMEOUT_MS = 1e3; + var DEFAULT_IDLE_TIMEOUT_MS = 30 * 60 * 1e3; + var RETRY_THROTTLER_MAP = /* @__PURE__ */ new Map(); + var DEFAULT_RETRY_BUFFER_SIZE_BYTES = 1 << 24; + var DEFAULT_PER_RPC_RETRY_BUFFER_SIZE_BYTES = 1 << 20; + var ChannelSubchannelWrapper = class extends subchannel_interface_1.BaseSubchannelWrapper { + constructor(childSubchannel, channel) { + super(childSubchannel); + this.channel = channel; + this.refCount = 0; + this.subchannelStateListener = (subchannel, previousState, newState, keepaliveTime) => { + channel.throttleKeepalive(keepaliveTime); + }; + childSubchannel.addConnectivityStateListener(this.subchannelStateListener); + } + ref() { + this.child.ref(); + this.refCount += 1; + } + unref() { + this.child.unref(); + this.refCount -= 1; + if (this.refCount <= 0) { + this.child.removeConnectivityStateListener(this.subchannelStateListener); + this.channel.removeWrappedSubchannel(this); + } + } + }; + var InternalChannel = class { + constructor(target, credentials2, options2) { + var _a2, _b, _c2, _d, _e2, _f, _g, _h; + this.credentials = credentials2; + this.options = options2; + this.connectivityState = connectivity_state_1.ConnectivityState.IDLE; + this.currentPicker = new picker_1.UnavailablePicker(); + this.configSelectionQueue = []; + this.pickQueue = []; + this.connectivityStateWatchers = []; + this.configSelector = null; + this.currentResolutionError = null; + this.wrappedSubchannels = /* @__PURE__ */ new Set(); + this.callCount = 0; + this.idleTimer = null; + this.channelzEnabled = true; + this.callTracker = new channelz_1.ChannelzCallTracker(); + this.childrenTracker = new channelz_1.ChannelzChildrenTracker(); + if (typeof target !== "string") { + throw new TypeError("Channel target must be a string"); + } + if (!(credentials2 instanceof channel_credentials_1.ChannelCredentials)) { + throw new TypeError("Channel credentials must be a ChannelCredentials object"); + } + if (options2) { + if (typeof options2 !== "object") { + throw new TypeError("Channel options must be an object"); + } + } + this.originalTarget = target; + const originalTargetUri = (0, uri_parser_1.parseUri)(target); + if (originalTargetUri === null) { + throw new Error(`Could not parse target name "${target}"`); + } + const defaultSchemeMapResult = (0, resolver_1.mapUriDefaultScheme)(originalTargetUri); + if (defaultSchemeMapResult === null) { + throw new Error(`Could not find a default scheme for target name "${target}"`); + } + this.callRefTimer = setInterval(() => { + }, MAX_TIMEOUT_TIME); + (_b = (_a2 = this.callRefTimer).unref) === null || _b === void 0 ? void 0 : _b.call(_a2); + if (this.options["grpc.enable_channelz"] === 0) { + this.channelzEnabled = false; + } + this.channelzTrace = new channelz_1.ChannelzTrace(); + this.channelzRef = (0, channelz_1.registerChannelzChannel)(target, () => this.getChannelzInfo(), this.channelzEnabled); + if (this.channelzEnabled) { + this.channelzTrace.addTrace("CT_INFO", "Channel created"); + } + if (this.options["grpc.default_authority"]) { + this.defaultAuthority = this.options["grpc.default_authority"]; + } else { + this.defaultAuthority = (0, resolver_1.getDefaultAuthority)(defaultSchemeMapResult); + } + const proxyMapResult = (0, http_proxy_1.mapProxyName)(defaultSchemeMapResult, options2); + this.target = proxyMapResult.target; + this.options = Object.assign({}, this.options, proxyMapResult.extraOptions); + this.subchannelPool = (0, subchannel_pool_1.getSubchannelPool)(((_c2 = options2["grpc.use_local_subchannel_pool"]) !== null && _c2 !== void 0 ? _c2 : 0) === 0); + this.retryBufferTracker = new retrying_call_1.MessageBufferTracker((_d = options2["grpc.retry_buffer_size"]) !== null && _d !== void 0 ? _d : DEFAULT_RETRY_BUFFER_SIZE_BYTES, (_e2 = options2["grpc.per_rpc_retry_buffer_size"]) !== null && _e2 !== void 0 ? _e2 : DEFAULT_PER_RPC_RETRY_BUFFER_SIZE_BYTES); + this.keepaliveTime = (_f = options2["grpc.keepalive_time_ms"]) !== null && _f !== void 0 ? _f : -1; + this.idleTimeoutMs = Math.max((_g = options2["grpc.client_idle_timeout_ms"]) !== null && _g !== void 0 ? _g : DEFAULT_IDLE_TIMEOUT_MS, MIN_IDLE_TIMEOUT_MS); + const channelControlHelper = { + createSubchannel: (subchannelAddress, subchannelArgs) => { + const subchannel = this.subchannelPool.getOrCreateSubchannel(this.target, subchannelAddress, Object.assign({}, this.options, subchannelArgs), this.credentials); + subchannel.throttleKeepalive(this.keepaliveTime); + if (this.channelzEnabled) { + this.channelzTrace.addTrace("CT_INFO", "Created subchannel or used existing subchannel", subchannel.getChannelzRef()); + } + const wrappedSubchannel = new ChannelSubchannelWrapper(subchannel, this); + this.wrappedSubchannels.add(wrappedSubchannel); + return wrappedSubchannel; + }, + updateState: (connectivityState, picker) => { + this.currentPicker = picker; + const queueCopy = this.pickQueue.slice(); + this.pickQueue = []; + this.callRefTimerUnref(); + for (const call of queueCopy) { + call.doPick(); + } + this.updateState(connectivityState); + }, + requestReresolution: () => { + throw new Error("Resolving load balancer should never call requestReresolution"); + }, + addChannelzChild: (child) => { + if (this.channelzEnabled) { + this.childrenTracker.refChild(child); + } + }, + removeChannelzChild: (child) => { + if (this.channelzEnabled) { + this.childrenTracker.unrefChild(child); + } + } + }; + this.resolvingLoadBalancer = new resolving_load_balancer_1.ResolvingLoadBalancer(this.target, channelControlHelper, options2, (serviceConfig, configSelector) => { + if (serviceConfig.retryThrottling) { + RETRY_THROTTLER_MAP.set(this.getTarget(), new retrying_call_1.RetryThrottler(serviceConfig.retryThrottling.maxTokens, serviceConfig.retryThrottling.tokenRatio, RETRY_THROTTLER_MAP.get(this.getTarget()))); + } else { + RETRY_THROTTLER_MAP.delete(this.getTarget()); + } + if (this.channelzEnabled) { + this.channelzTrace.addTrace("CT_INFO", "Address resolution succeeded"); + } + this.configSelector = configSelector; + this.currentResolutionError = null; + process.nextTick(() => { + const localQueue = this.configSelectionQueue; + this.configSelectionQueue = []; + this.callRefTimerUnref(); + for (const call of localQueue) { + call.getConfig(); + } + this.configSelectionQueue = []; + }); + }, (status2) => { + if (this.channelzEnabled) { + this.channelzTrace.addTrace("CT_WARNING", "Address resolution failed with code " + status2.code + ' and details "' + status2.details + '"'); + } + if (this.configSelectionQueue.length > 0) { + this.trace("Name resolution failed with calls queued for config selection"); + } + if (this.configSelector === null) { + this.currentResolutionError = Object.assign(Object.assign({}, (0, control_plane_status_1.restrictControlPlaneStatusCode)(status2.code, status2.details)), { metadata: status2.metadata }); + } + const localQueue = this.configSelectionQueue; + this.configSelectionQueue = []; + this.callRefTimerUnref(); + for (const call of localQueue) { + call.reportResolverError(status2); + } + }); + this.filterStackFactory = new filter_stack_1.FilterStackFactory([ + new max_message_size_filter_1.MaxMessageSizeFilterFactory(this.options), + new compression_filter_1.CompressionFilterFactory(this, this.options) + ]); + this.trace("Channel constructed with options " + JSON.stringify(options2, void 0, 2)); + const error2 = new Error(); + (0, logging_1.trace)(constants_1.LogVerbosity.DEBUG, "channel_stacktrace", "(" + this.channelzRef.id + ") Channel constructed \n" + ((_h = error2.stack) === null || _h === void 0 ? void 0 : _h.substring(error2.stack.indexOf("\n") + 1))); + } + getChannelzInfo() { + return { + target: this.originalTarget, + state: this.connectivityState, + trace: this.channelzTrace, + callTracker: this.callTracker, + children: this.childrenTracker.getChildLists() + }; + } + trace(text, verbosityOverride) { + (0, logging_1.trace)(verbosityOverride !== null && verbosityOverride !== void 0 ? verbosityOverride : constants_1.LogVerbosity.DEBUG, "channel", "(" + this.channelzRef.id + ") " + (0, uri_parser_1.uriToString)(this.target) + " " + text); + } + callRefTimerRef() { + var _a2, _b, _c2, _d; + if (!((_b = (_a2 = this.callRefTimer).hasRef) === null || _b === void 0 ? void 0 : _b.call(_a2))) { + this.trace("callRefTimer.ref | configSelectionQueue.length=" + this.configSelectionQueue.length + " pickQueue.length=" + this.pickQueue.length); + (_d = (_c2 = this.callRefTimer).ref) === null || _d === void 0 ? void 0 : _d.call(_c2); + } + } + callRefTimerUnref() { + var _a2, _b; + if (!this.callRefTimer.hasRef || this.callRefTimer.hasRef()) { + this.trace("callRefTimer.unref | configSelectionQueue.length=" + this.configSelectionQueue.length + " pickQueue.length=" + this.pickQueue.length); + (_b = (_a2 = this.callRefTimer).unref) === null || _b === void 0 ? void 0 : _b.call(_a2); + } + } + removeConnectivityStateWatcher(watcherObject) { + const watcherIndex = this.connectivityStateWatchers.findIndex((value) => value === watcherObject); + if (watcherIndex >= 0) { + this.connectivityStateWatchers.splice(watcherIndex, 1); + } + } + updateState(newState) { + (0, logging_1.trace)(constants_1.LogVerbosity.DEBUG, "connectivity_state", "(" + this.channelzRef.id + ") " + (0, uri_parser_1.uriToString)(this.target) + " " + connectivity_state_1.ConnectivityState[this.connectivityState] + " -> " + connectivity_state_1.ConnectivityState[newState]); + if (this.channelzEnabled) { + this.channelzTrace.addTrace("CT_INFO", connectivity_state_1.ConnectivityState[this.connectivityState] + " -> " + connectivity_state_1.ConnectivityState[newState]); + } + this.connectivityState = newState; + const watchersCopy = this.connectivityStateWatchers.slice(); + for (const watcherObject of watchersCopy) { + if (newState !== watcherObject.currentState) { + if (watcherObject.timer) { + clearTimeout(watcherObject.timer); + } + this.removeConnectivityStateWatcher(watcherObject); + watcherObject.callback(); + } + } + if (newState !== connectivity_state_1.ConnectivityState.TRANSIENT_FAILURE) { + this.currentResolutionError = null; + } + } + throttleKeepalive(newKeepaliveTime) { + if (newKeepaliveTime > this.keepaliveTime) { + this.keepaliveTime = newKeepaliveTime; + for (const wrappedSubchannel of this.wrappedSubchannels) { + wrappedSubchannel.throttleKeepalive(newKeepaliveTime); + } + } + } + removeWrappedSubchannel(wrappedSubchannel) { + this.wrappedSubchannels.delete(wrappedSubchannel); + } + doPick(metadata, extraPickInfo) { + return this.currentPicker.pick({ + metadata, + extraPickInfo + }); + } + queueCallForPick(call) { + this.pickQueue.push(call); + this.callRefTimerRef(); + } + getConfig(method, metadata) { + this.resolvingLoadBalancer.exitIdle(); + if (this.configSelector) { + return { + type: "SUCCESS", + config: this.configSelector(method, metadata) + }; + } else { + if (this.currentResolutionError) { + return { + type: "ERROR", + error: this.currentResolutionError + }; + } else { + return { + type: "NONE" + }; + } + } + } + queueCallForConfig(call) { + this.configSelectionQueue.push(call); + this.callRefTimerRef(); + } + enterIdle() { + this.resolvingLoadBalancer.destroy(); + this.updateState(connectivity_state_1.ConnectivityState.IDLE); + this.currentPicker = new picker_1.QueuePicker(this.resolvingLoadBalancer); + } + maybeStartIdleTimer() { + var _a2, _b; + if (this.callCount === 0) { + this.idleTimer = setTimeout(() => { + this.trace("Idle timer triggered after " + this.idleTimeoutMs + "ms of inactivity"); + this.enterIdle(); + }, this.idleTimeoutMs); + (_b = (_a2 = this.idleTimer).unref) === null || _b === void 0 ? void 0 : _b.call(_a2); + } + } + onCallStart() { + if (this.channelzEnabled) { + this.callTracker.addCallStarted(); + } + this.callCount += 1; + if (this.idleTimer) { + clearTimeout(this.idleTimer); + this.idleTimer = null; + } + } + onCallEnd(status2) { + if (this.channelzEnabled) { + if (status2.code === constants_1.Status.OK) { + this.callTracker.addCallSucceeded(); + } else { + this.callTracker.addCallFailed(); + } + } + this.callCount -= 1; + this.maybeStartIdleTimer(); + } + createLoadBalancingCall(callConfig, method, host, credentials2, deadline) { + const callNumber = (0, call_number_1.getNextCallNumber)(); + this.trace("createLoadBalancingCall [" + callNumber + '] method="' + method + '"'); + return new load_balancing_call_1.LoadBalancingCall(this, callConfig, method, host, credentials2, deadline, callNumber); + } + createRetryingCall(callConfig, method, host, credentials2, deadline) { + const callNumber = (0, call_number_1.getNextCallNumber)(); + this.trace("createRetryingCall [" + callNumber + '] method="' + method + '"'); + return new retrying_call_1.RetryingCall(this, callConfig, method, host, credentials2, deadline, callNumber, this.retryBufferTracker, RETRY_THROTTLER_MAP.get(this.getTarget())); + } + createInnerCall(callConfig, method, host, credentials2, deadline) { + if (this.options["grpc.enable_retries"] === 0) { + return this.createLoadBalancingCall(callConfig, method, host, credentials2, deadline); + } else { + return this.createRetryingCall(callConfig, method, host, credentials2, deadline); + } + } + createResolvingCall(method, deadline, host, parentCall, propagateFlags) { + const callNumber = (0, call_number_1.getNextCallNumber)(); + this.trace("createResolvingCall [" + callNumber + '] method="' + method + '", deadline=' + (0, deadline_1.deadlineToString)(deadline)); + const finalOptions = { + deadline, + flags: propagateFlags !== null && propagateFlags !== void 0 ? propagateFlags : constants_1.Propagate.DEFAULTS, + host: host !== null && host !== void 0 ? host : this.defaultAuthority, + parentCall + }; + const call = new resolving_call_1.ResolvingCall(this, method, finalOptions, this.filterStackFactory.clone(), this.credentials._getCallCredentials(), callNumber); + this.onCallStart(); + call.addStatusWatcher((status2) => { + this.onCallEnd(status2); + }); + return call; + } + close() { + this.resolvingLoadBalancer.destroy(); + this.updateState(connectivity_state_1.ConnectivityState.SHUTDOWN); + clearInterval(this.callRefTimer); + if (this.channelzEnabled) { + (0, channelz_1.unregisterChannelzRef)(this.channelzRef); + } + this.subchannelPool.unrefUnusedSubchannels(); + } + getTarget() { + return (0, uri_parser_1.uriToString)(this.target); + } + getConnectivityState(tryToConnect) { + const connectivityState = this.connectivityState; + if (tryToConnect) { + this.resolvingLoadBalancer.exitIdle(); + this.maybeStartIdleTimer(); + } + return connectivityState; + } + watchConnectivityState(currentState, deadline, callback) { + if (this.connectivityState === connectivity_state_1.ConnectivityState.SHUTDOWN) { + throw new Error("Channel has been shut down"); + } + let timer = null; + if (deadline !== Infinity) { + const deadlineDate = deadline instanceof Date ? deadline : new Date(deadline); + const now = /* @__PURE__ */ new Date(); + if (deadline === -Infinity || deadlineDate <= now) { + process.nextTick(callback, new Error("Deadline passed without connectivity state change")); + return; + } + timer = setTimeout(() => { + this.removeConnectivityStateWatcher(watcherObject); + callback(new Error("Deadline passed without connectivity state change")); + }, deadlineDate.getTime() - now.getTime()); + } + const watcherObject = { + currentState, + callback, + timer + }; + this.connectivityStateWatchers.push(watcherObject); + } + /** + * Get the channelz reference object for this channel. The returned value is + * garbage if channelz is disabled for this channel. + * @returns + */ + getChannelzRef() { + return this.channelzRef; + } + createCall(method, deadline, host, parentCall, propagateFlags) { + if (typeof method !== "string") { + throw new TypeError("Channel#createCall: method must be a string"); + } + if (!(typeof deadline === "number" || deadline instanceof Date)) { + throw new TypeError("Channel#createCall: deadline must be a number or Date"); + } + if (this.connectivityState === connectivity_state_1.ConnectivityState.SHUTDOWN) { + throw new Error("Channel has been shut down"); + } + return this.createResolvingCall(method, deadline, host, parentCall, propagateFlags); + } + }; + exports2.InternalChannel = InternalChannel; + } +}); + +// node_modules/@grpc/grpc-js/build/src/channel.js +var require_channel = __commonJS({ + "node_modules/@grpc/grpc-js/build/src/channel.js"(exports2) { + "use strict"; + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.ChannelImplementation = void 0; + var channel_credentials_1 = require_channel_credentials(); + var internal_channel_1 = require_internal_channel(); + var ChannelImplementation = class { + constructor(target, credentials2, options2) { + if (typeof target !== "string") { + throw new TypeError("Channel target must be a string"); + } + if (!(credentials2 instanceof channel_credentials_1.ChannelCredentials)) { + throw new TypeError("Channel credentials must be a ChannelCredentials object"); + } + if (options2) { + if (typeof options2 !== "object") { + throw new TypeError("Channel options must be an object"); + } + } + this.internalChannel = new internal_channel_1.InternalChannel(target, credentials2, options2); + } + close() { + this.internalChannel.close(); + } + getTarget() { + return this.internalChannel.getTarget(); + } + getConnectivityState(tryToConnect) { + return this.internalChannel.getConnectivityState(tryToConnect); + } + watchConnectivityState(currentState, deadline, callback) { + this.internalChannel.watchConnectivityState(currentState, deadline, callback); + } + /** + * Get the channelz reference object for this channel. The returned value is + * garbage if channelz is disabled for this channel. + * @returns + */ + getChannelzRef() { + return this.internalChannel.getChannelzRef(); + } + createCall(method, deadline, host, parentCall, propagateFlags) { + if (typeof method !== "string") { + throw new TypeError("Channel#createCall: method must be a string"); + } + if (!(typeof deadline === "number" || deadline instanceof Date)) { + throw new TypeError("Channel#createCall: deadline must be a number or Date"); + } + return this.internalChannel.createCall(method, deadline, host, parentCall, propagateFlags); + } + }; + exports2.ChannelImplementation = ChannelImplementation; + } +}); + +// node_modules/@grpc/grpc-js/build/src/server-call.js +var require_server_call = __commonJS({ + "node_modules/@grpc/grpc-js/build/src/server-call.js"(exports2) { + "use strict"; + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.Http2ServerCallStream = exports2.ServerDuplexStreamImpl = exports2.ServerWritableStreamImpl = exports2.ServerReadableStreamImpl = exports2.ServerUnaryCallImpl = void 0; + var events_1 = require("events"); + var http2 = require("http2"); + var stream_1 = require("stream"); + var zlib = require("zlib"); + var util_1 = require("util"); + var constants_1 = require_constants(); + var metadata_1 = require_metadata(); + var stream_decoder_1 = require_stream_decoder(); + var logging = require_logging(); + var error_1 = require_error(); + var TRACER_NAME = "server_call"; + var unzip = (0, util_1.promisify)(zlib.unzip); + var inflate = (0, util_1.promisify)(zlib.inflate); + function trace(text) { + logging.trace(constants_1.LogVerbosity.DEBUG, TRACER_NAME, text); + } + var GRPC_ACCEPT_ENCODING_HEADER = "grpc-accept-encoding"; + var GRPC_ENCODING_HEADER = "grpc-encoding"; + var GRPC_MESSAGE_HEADER = "grpc-message"; + var GRPC_STATUS_HEADER = "grpc-status"; + var GRPC_TIMEOUT_HEADER = "grpc-timeout"; + var DEADLINE_REGEX = /(\d{1,8})\s*([HMSmun])/; + var deadlineUnitsToMs = { + H: 36e5, + M: 6e4, + S: 1e3, + m: 1, + u: 1e-3, + n: 1e-6 + }; + var defaultCompressionHeaders = { + // TODO(cjihrig): Remove these encoding headers from the default response + // once compression is integrated. + [GRPC_ACCEPT_ENCODING_HEADER]: "identity,deflate,gzip", + [GRPC_ENCODING_HEADER]: "identity" + }; + var defaultResponseHeaders = { + [http2.constants.HTTP2_HEADER_STATUS]: http2.constants.HTTP_STATUS_OK, + [http2.constants.HTTP2_HEADER_CONTENT_TYPE]: "application/grpc+proto" + }; + var defaultResponseOptions = { + waitForTrailers: true + }; + var ServerUnaryCallImpl = class extends events_1.EventEmitter { + constructor(call, metadata, request) { + super(); + this.call = call; + this.metadata = metadata; + this.request = request; + this.cancelled = false; + this.call.setupSurfaceCall(this); + } + getPeer() { + return this.call.getPeer(); + } + sendMetadata(responseMetadata) { + this.call.sendMetadata(responseMetadata); + } + getDeadline() { + return this.call.getDeadline(); + } + getPath() { + return this.call.getPath(); + } + }; + exports2.ServerUnaryCallImpl = ServerUnaryCallImpl; + var ServerReadableStreamImpl = class extends stream_1.Readable { + constructor(call, metadata, deserialize, encoding) { + super({ objectMode: true }); + this.call = call; + this.metadata = metadata; + this.deserialize = deserialize; + this.cancelled = false; + this.call.setupSurfaceCall(this); + this.call.setupReadable(this, encoding); + } + _read(size) { + if (!this.call.consumeUnpushedMessages(this)) { + return; + } + this.call.resume(); + } + getPeer() { + return this.call.getPeer(); + } + sendMetadata(responseMetadata) { + this.call.sendMetadata(responseMetadata); + } + getDeadline() { + return this.call.getDeadline(); + } + getPath() { + return this.call.getPath(); + } + }; + exports2.ServerReadableStreamImpl = ServerReadableStreamImpl; + var ServerWritableStreamImpl = class extends stream_1.Writable { + constructor(call, metadata, serialize, request) { + super({ objectMode: true }); + this.call = call; + this.metadata = metadata; + this.serialize = serialize; + this.request = request; + this.cancelled = false; + this.trailingMetadata = new metadata_1.Metadata(); + this.call.setupSurfaceCall(this); + this.on("error", (err) => { + this.call.sendError(err); + this.end(); + }); + } + getPeer() { + return this.call.getPeer(); + } + sendMetadata(responseMetadata) { + this.call.sendMetadata(responseMetadata); + } + getDeadline() { + return this.call.getDeadline(); + } + getPath() { + return this.call.getPath(); + } + _write(chunk, encoding, callback) { + try { + const response = this.call.serializeMessage(chunk); + if (!this.call.write(response)) { + this.call.once("drain", callback); + return; + } + } catch (err) { + this.emit("error", { + details: (0, error_1.getErrorMessage)(err), + code: constants_1.Status.INTERNAL + }); + } + callback(); + } + _final(callback) { + this.call.sendStatus({ + code: constants_1.Status.OK, + details: "OK", + metadata: this.trailingMetadata + }); + callback(null); + } + // eslint-disable-next-line @typescript-eslint/no-explicit-any + end(metadata) { + if (metadata) { + this.trailingMetadata = metadata; + } + return super.end(); + } + }; + exports2.ServerWritableStreamImpl = ServerWritableStreamImpl; + var ServerDuplexStreamImpl = class extends stream_1.Duplex { + constructor(call, metadata, serialize, deserialize, encoding) { + super({ objectMode: true }); + this.call = call; + this.metadata = metadata; + this.serialize = serialize; + this.deserialize = deserialize; + this.cancelled = false; + this.trailingMetadata = new metadata_1.Metadata(); + this.call.setupSurfaceCall(this); + this.call.setupReadable(this, encoding); + this.on("error", (err) => { + this.call.sendError(err); + this.end(); + }); + } + getPeer() { + return this.call.getPeer(); + } + sendMetadata(responseMetadata) { + this.call.sendMetadata(responseMetadata); + } + getDeadline() { + return this.call.getDeadline(); + } + getPath() { + return this.call.getPath(); + } + // eslint-disable-next-line @typescript-eslint/no-explicit-any + end(metadata) { + if (metadata) { + this.trailingMetadata = metadata; + } + return super.end(); + } + }; + exports2.ServerDuplexStreamImpl = ServerDuplexStreamImpl; + ServerDuplexStreamImpl.prototype._read = ServerReadableStreamImpl.prototype._read; + ServerDuplexStreamImpl.prototype._write = ServerWritableStreamImpl.prototype._write; + ServerDuplexStreamImpl.prototype._final = ServerWritableStreamImpl.prototype._final; + var Http2ServerCallStream = class extends events_1.EventEmitter { + constructor(stream, handler2, options2) { + super(); + this.stream = stream; + this.handler = handler2; + this.cancelled = false; + this.deadlineTimer = null; + this.statusSent = false; + this.deadline = Infinity; + this.wantTrailers = false; + this.metadataSent = false; + this.canPush = false; + this.isPushPending = false; + this.bufferedMessages = []; + this.messagesToPush = []; + this.maxSendMessageSize = constants_1.DEFAULT_MAX_SEND_MESSAGE_LENGTH; + this.maxReceiveMessageSize = constants_1.DEFAULT_MAX_RECEIVE_MESSAGE_LENGTH; + this.stream.once("error", (err) => { + }); + this.stream.once("close", () => { + var _a2; + trace("Request to method " + ((_a2 = this.handler) === null || _a2 === void 0 ? void 0 : _a2.path) + " stream closed with rstCode " + this.stream.rstCode); + if (!this.statusSent) { + this.cancelled = true; + this.emit("cancelled", "cancelled"); + this.emit("streamEnd", false); + this.sendStatus({ + code: constants_1.Status.CANCELLED, + details: "Cancelled by client", + metadata: null + }); + if (this.deadlineTimer) + clearTimeout(this.deadlineTimer); + } + }); + this.stream.on("drain", () => { + this.emit("drain"); + }); + if ("grpc.max_send_message_length" in options2) { + this.maxSendMessageSize = options2["grpc.max_send_message_length"]; + } + if ("grpc.max_receive_message_length" in options2) { + this.maxReceiveMessageSize = options2["grpc.max_receive_message_length"]; + } + } + checkCancelled() { + if (this.stream.destroyed || this.stream.closed) { + this.cancelled = true; + } + return this.cancelled; + } + getDecompressedMessage(message, encoding) { + if (encoding === "deflate") { + return inflate(message.subarray(5)); + } else if (encoding === "gzip") { + return unzip(message.subarray(5)); + } else if (encoding === "identity") { + return message.subarray(5); + } + return Promise.reject({ + code: constants_1.Status.UNIMPLEMENTED, + details: `Received message compressed with unsupported encoding "${encoding}"` + }); + } + sendMetadata(customMetadata) { + if (this.checkCancelled()) { + return; + } + if (this.metadataSent) { + return; + } + this.metadataSent = true; + const custom = customMetadata ? customMetadata.toHttp2Headers() : null; + const headers = Object.assign(Object.assign(Object.assign({}, defaultResponseHeaders), defaultCompressionHeaders), custom); + this.stream.respond(headers, defaultResponseOptions); + } + receiveMetadata(headers) { + const metadata = metadata_1.Metadata.fromHttp2Headers(headers); + if (logging.isTracerEnabled(TRACER_NAME)) { + trace("Request to " + this.handler.path + " received headers " + JSON.stringify(metadata.toJSON())); + } + const timeoutHeader = metadata.get(GRPC_TIMEOUT_HEADER); + if (timeoutHeader.length > 0) { + const match = timeoutHeader[0].toString().match(DEADLINE_REGEX); + if (match === null) { + const err = new Error("Invalid deadline"); + err.code = constants_1.Status.OUT_OF_RANGE; + this.sendError(err); + return metadata; + } + const timeout = +match[1] * deadlineUnitsToMs[match[2]] | 0; + const now = /* @__PURE__ */ new Date(); + this.deadline = now.setMilliseconds(now.getMilliseconds() + timeout); + this.deadlineTimer = setTimeout(handleExpiredDeadline, timeout, this); + metadata.remove(GRPC_TIMEOUT_HEADER); + } + metadata.remove(http2.constants.HTTP2_HEADER_ACCEPT_ENCODING); + metadata.remove(http2.constants.HTTP2_HEADER_TE); + metadata.remove(http2.constants.HTTP2_HEADER_CONTENT_TYPE); + metadata.remove("grpc-accept-encoding"); + return metadata; + } + receiveUnaryMessage(encoding) { + return new Promise((resolve, reject) => { + const { stream } = this; + let receivedLength = 0; + const call = this; + const body = []; + const limit = this.maxReceiveMessageSize; + this.stream.on("data", onData); + this.stream.on("end", onEnd); + this.stream.on("error", onEnd); + function onData(chunk) { + receivedLength += chunk.byteLength; + if (limit !== -1 && receivedLength > limit) { + stream.removeListener("data", onData); + stream.removeListener("end", onEnd); + stream.removeListener("error", onEnd); + reject({ + code: constants_1.Status.RESOURCE_EXHAUSTED, + details: `Received message larger than max (${receivedLength} vs. ${limit})` + }); + return; + } + body.push(chunk); + } + function onEnd(err) { + stream.removeListener("data", onData); + stream.removeListener("end", onEnd); + stream.removeListener("error", onEnd); + if (err !== void 0) { + reject({ code: constants_1.Status.INTERNAL, details: err.message }); + return; + } + if (receivedLength === 0) { + reject({ + code: constants_1.Status.INTERNAL, + details: "received empty unary message" + }); + return; + } + call.emit("receiveMessage"); + const requestBytes = Buffer.concat(body, receivedLength); + const compressed = requestBytes.readUInt8(0) === 1; + const compressedMessageEncoding = compressed ? encoding : "identity"; + const decompressedMessage = call.getDecompressedMessage(requestBytes, compressedMessageEncoding); + if (Buffer.isBuffer(decompressedMessage)) { + resolve(call.deserializeMessageWithInternalError(decompressedMessage)); + return; + } + decompressedMessage.then((decompressed) => resolve(call.deserializeMessageWithInternalError(decompressed)), (err2) => reject(err2.code ? err2 : { + code: constants_1.Status.INTERNAL, + details: `Received "grpc-encoding" header "${encoding}" but ${encoding} decompression failed` + })); + } + }); + } + async deserializeMessageWithInternalError(buffer) { + try { + return this.deserializeMessage(buffer); + } catch (err) { + throw { + details: (0, error_1.getErrorMessage)(err), + code: constants_1.Status.INTERNAL + }; + } + } + serializeMessage(value) { + const messageBuffer = this.handler.serialize(value); + const byteLength = messageBuffer.byteLength; + const output = Buffer.allocUnsafe(byteLength + 5); + output.writeUInt8(0, 0); + output.writeUInt32BE(byteLength, 1); + messageBuffer.copy(output, 5); + return output; + } + deserializeMessage(bytes) { + return this.handler.deserialize(bytes); + } + async sendUnaryMessage(err, value, metadata, flags) { + if (this.checkCancelled()) { + return; + } + if (metadata === void 0) { + metadata = null; + } + if (err) { + if (!Object.prototype.hasOwnProperty.call(err, "metadata") && metadata) { + err.metadata = metadata; + } + this.sendError(err); + return; + } + try { + const response = this.serializeMessage(value); + this.write(response); + this.sendStatus({ code: constants_1.Status.OK, details: "OK", metadata }); + } catch (err2) { + this.sendError({ + details: (0, error_1.getErrorMessage)(err2), + code: constants_1.Status.INTERNAL + }); + } + } + sendStatus(statusObj) { + var _a2, _b; + this.emit("callEnd", statusObj.code); + this.emit("streamEnd", statusObj.code === constants_1.Status.OK); + if (this.checkCancelled()) { + return; + } + trace("Request to method " + ((_a2 = this.handler) === null || _a2 === void 0 ? void 0 : _a2.path) + " ended with status code: " + constants_1.Status[statusObj.code] + " details: " + statusObj.details); + if (this.deadlineTimer) + clearTimeout(this.deadlineTimer); + if (this.stream.headersSent) { + if (!this.wantTrailers) { + this.wantTrailers = true; + this.stream.once("wantTrailers", () => { + var _a3; + const trailersToSend = Object.assign({ [GRPC_STATUS_HEADER]: statusObj.code, [GRPC_MESSAGE_HEADER]: encodeURI(statusObj.details) }, (_a3 = statusObj.metadata) === null || _a3 === void 0 ? void 0 : _a3.toHttp2Headers()); + this.stream.sendTrailers(trailersToSend); + this.statusSent = true; + }); + this.stream.end(); + } + } else { + const trailersToSend = Object.assign(Object.assign({ [GRPC_STATUS_HEADER]: statusObj.code, [GRPC_MESSAGE_HEADER]: encodeURI(statusObj.details) }, defaultResponseHeaders), (_b = statusObj.metadata) === null || _b === void 0 ? void 0 : _b.toHttp2Headers()); + this.stream.respond(trailersToSend, { endStream: true }); + this.statusSent = true; + } + } + sendError(error2) { + const status2 = { + code: constants_1.Status.UNKNOWN, + details: "message" in error2 ? error2.message : "Unknown Error", + metadata: "metadata" in error2 && error2.metadata !== void 0 ? error2.metadata : null + }; + if ("code" in error2 && typeof error2.code === "number" && Number.isInteger(error2.code)) { + status2.code = error2.code; + if ("details" in error2 && typeof error2.details === "string") { + status2.details = error2.details; + } + } + this.sendStatus(status2); + } + write(chunk) { + if (this.checkCancelled()) { + return; + } + if (this.maxSendMessageSize !== -1 && chunk.length > this.maxSendMessageSize) { + this.sendError({ + code: constants_1.Status.RESOURCE_EXHAUSTED, + details: `Sent message larger than max (${chunk.length} vs. ${this.maxSendMessageSize})` + }); + return; + } + this.sendMetadata(); + this.emit("sendMessage"); + return this.stream.write(chunk); + } + resume() { + this.stream.resume(); + } + setupSurfaceCall(call) { + this.once("cancelled", (reason) => { + call.cancelled = true; + call.emit("cancelled", reason); + }); + this.once("callEnd", (status2) => call.emit("callEnd", status2)); + } + setupReadable(readable, encoding) { + const decoder = new stream_decoder_1.StreamDecoder(); + let readsDone = false; + let pendingMessageProcessing = false; + let pushedEnd = false; + const maybePushEnd = async () => { + if (!pushedEnd && readsDone && !pendingMessageProcessing) { + pushedEnd = true; + await this.pushOrBufferMessage(readable, null); + } + }; + this.stream.on("data", async (data) => { + const messages = decoder.write(data); + pendingMessageProcessing = true; + this.stream.pause(); + for (const message of messages) { + if (this.maxReceiveMessageSize !== -1 && message.length > this.maxReceiveMessageSize) { + this.sendError({ + code: constants_1.Status.RESOURCE_EXHAUSTED, + details: `Received message larger than max (${message.length} vs. ${this.maxReceiveMessageSize})` + }); + return; + } + this.emit("receiveMessage"); + const compressed = message.readUInt8(0) === 1; + const compressedMessageEncoding = compressed ? encoding : "identity"; + const decompressedMessage = await this.getDecompressedMessage(message, compressedMessageEncoding); + if (!decompressedMessage) + return; + await this.pushOrBufferMessage(readable, decompressedMessage); + } + pendingMessageProcessing = false; + this.stream.resume(); + await maybePushEnd(); + }); + this.stream.once("end", async () => { + readsDone = true; + await maybePushEnd(); + }); + } + consumeUnpushedMessages(readable) { + this.canPush = true; + while (this.messagesToPush.length > 0) { + const nextMessage = this.messagesToPush.shift(); + const canPush = readable.push(nextMessage); + if (nextMessage === null || canPush === false) { + this.canPush = false; + break; + } + } + return this.canPush; + } + async pushOrBufferMessage(readable, messageBytes) { + if (this.isPushPending) { + this.bufferedMessages.push(messageBytes); + } else { + await this.pushMessage(readable, messageBytes); + } + } + async pushMessage(readable, messageBytes) { + if (messageBytes === null) { + trace("Received end of stream"); + if (this.canPush) { + readable.push(null); + } else { + this.messagesToPush.push(null); + } + return; + } + trace("Received message of length " + messageBytes.length); + this.isPushPending = true; + try { + const deserialized = await this.deserializeMessage(messageBytes); + if (this.canPush) { + if (!readable.push(deserialized)) { + this.canPush = false; + this.stream.pause(); + } + } else { + this.messagesToPush.push(deserialized); + } + } catch (error2) { + this.bufferedMessages.length = 0; + let code = (0, error_1.getErrorCode)(error2); + if (code === null || code < constants_1.Status.OK || code > constants_1.Status.UNAUTHENTICATED) { + code = constants_1.Status.INTERNAL; + } + readable.emit("error", { + details: (0, error_1.getErrorMessage)(error2), + code + }); + } + this.isPushPending = false; + if (this.bufferedMessages.length > 0) { + await this.pushMessage(readable, this.bufferedMessages.shift()); + } + } + getPeer() { + var _a2; + const socket = (_a2 = this.stream.session) === null || _a2 === void 0 ? void 0 : _a2.socket; + if (socket === null || socket === void 0 ? void 0 : socket.remoteAddress) { + if (socket.remotePort) { + return `${socket.remoteAddress}:${socket.remotePort}`; + } else { + return socket.remoteAddress; + } + } else { + return "unknown"; + } + } + getDeadline() { + return this.deadline; + } + getPath() { + return this.handler.path; + } + }; + exports2.Http2ServerCallStream = Http2ServerCallStream; + function handleExpiredDeadline(call) { + const err = new Error("Deadline exceeded"); + err.code = constants_1.Status.DEADLINE_EXCEEDED; + call.sendError(err); + call.cancelled = true; + call.emit("cancelled", "deadline"); + } + } +}); + +// node_modules/@grpc/grpc-js/build/src/server-credentials.js +var require_server_credentials = __commonJS({ + "node_modules/@grpc/grpc-js/build/src/server-credentials.js"(exports2) { + "use strict"; + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.ServerCredentials = void 0; + var tls_helpers_1 = require_tls_helpers(); + var ServerCredentials2 = class { + static createInsecure() { + return new InsecureServerCredentials(); + } + static createSsl(rootCerts, keyCertPairs, checkClientCertificate = false) { + if (rootCerts !== null && !Buffer.isBuffer(rootCerts)) { + throw new TypeError("rootCerts must be null or a Buffer"); + } + if (!Array.isArray(keyCertPairs)) { + throw new TypeError("keyCertPairs must be an array"); + } + if (typeof checkClientCertificate !== "boolean") { + throw new TypeError("checkClientCertificate must be a boolean"); + } + const cert = []; + const key = []; + for (let i = 0; i < keyCertPairs.length; i++) { + const pair = keyCertPairs[i]; + if (pair === null || typeof pair !== "object") { + throw new TypeError(`keyCertPair[${i}] must be an object`); + } + if (!Buffer.isBuffer(pair.private_key)) { + throw new TypeError(`keyCertPair[${i}].private_key must be a Buffer`); + } + if (!Buffer.isBuffer(pair.cert_chain)) { + throw new TypeError(`keyCertPair[${i}].cert_chain must be a Buffer`); + } + cert.push(pair.cert_chain); + key.push(pair.private_key); + } + return new SecureServerCredentials({ + ca: rootCerts || (0, tls_helpers_1.getDefaultRootsData)() || void 0, + cert, + key, + requestCert: checkClientCertificate, + ciphers: tls_helpers_1.CIPHER_SUITES + }); + } + }; + exports2.ServerCredentials = ServerCredentials2; + var InsecureServerCredentials = class extends ServerCredentials2 { + _isSecure() { + return false; + } + _getSettings() { + return null; + } + }; + var SecureServerCredentials = class extends ServerCredentials2 { + constructor(options2) { + super(); + this.options = options2; + } + _isSecure() { + return true; + } + _getSettings() { + return this.options; + } + }; + } +}); + +// node_modules/@grpc/grpc-js/build/src/server.js +var require_server = __commonJS({ + "node_modules/@grpc/grpc-js/build/src/server.js"(exports2) { + "use strict"; + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.Server = void 0; + var http2 = require("http2"); + var constants_1 = require_constants(); + var server_call_1 = require_server_call(); + var server_credentials_1 = require_server_credentials(); + var resolver_1 = require_resolver(); + var logging = require_logging(); + var subchannel_address_1 = require_subchannel_address(); + var uri_parser_1 = require_uri_parser(); + var channelz_1 = require_channelz(); + var UNLIMITED_CONNECTION_AGE_MS = ~(1 << 31); + var KEEPALIVE_MAX_TIME_MS = ~(1 << 31); + var KEEPALIVE_TIMEOUT_MS = 2e4; + var { HTTP2_HEADER_PATH } = http2.constants; + var TRACER_NAME = "server"; + function noop() { + } + function getUnimplementedStatusResponse(methodName) { + return { + code: constants_1.Status.UNIMPLEMENTED, + details: `The server does not implement the method ${methodName}` + }; + } + function getDefaultHandler(handlerType, methodName) { + const unimplementedStatusResponse = getUnimplementedStatusResponse(methodName); + switch (handlerType) { + case "unary": + return (call, callback) => { + callback(unimplementedStatusResponse, null); + }; + case "clientStream": + return (call, callback) => { + callback(unimplementedStatusResponse, null); + }; + case "serverStream": + return (call) => { + call.emit("error", unimplementedStatusResponse); + }; + case "bidi": + return (call) => { + call.emit("error", unimplementedStatusResponse); + }; + default: + throw new Error(`Invalid handlerType ${handlerType}`); + } + } + var Server3 = class { + constructor(options2) { + var _a2, _b, _c2, _d; + this.http2ServerList = []; + this.handlers = /* @__PURE__ */ new Map(); + this.sessions = /* @__PURE__ */ new Map(); + this.started = false; + this.serverAddressString = "null"; + this.channelzEnabled = true; + this.channelzTrace = new channelz_1.ChannelzTrace(); + this.callTracker = new channelz_1.ChannelzCallTracker(); + this.listenerChildrenTracker = new channelz_1.ChannelzChildrenTracker(); + this.sessionChildrenTracker = new channelz_1.ChannelzChildrenTracker(); + this.options = options2 !== null && options2 !== void 0 ? options2 : {}; + if (this.options["grpc.enable_channelz"] === 0) { + this.channelzEnabled = false; + } + this.channelzRef = (0, channelz_1.registerChannelzServer)(() => this.getChannelzInfo(), this.channelzEnabled); + if (this.channelzEnabled) { + this.channelzTrace.addTrace("CT_INFO", "Server created"); + } + this.maxConnectionAgeMs = (_a2 = this.options["grpc.max_connection_age_ms"]) !== null && _a2 !== void 0 ? _a2 : UNLIMITED_CONNECTION_AGE_MS; + this.maxConnectionAgeGraceMs = (_b = this.options["grpc.max_connection_age_grace_ms"]) !== null && _b !== void 0 ? _b : UNLIMITED_CONNECTION_AGE_MS; + this.keepaliveTimeMs = (_c2 = this.options["grpc.keepalive_time_ms"]) !== null && _c2 !== void 0 ? _c2 : KEEPALIVE_MAX_TIME_MS; + this.keepaliveTimeoutMs = (_d = this.options["grpc.keepalive_timeout_ms"]) !== null && _d !== void 0 ? _d : KEEPALIVE_TIMEOUT_MS; + this.trace("Server constructed"); + } + getChannelzInfo() { + return { + trace: this.channelzTrace, + callTracker: this.callTracker, + listenerChildren: this.listenerChildrenTracker.getChildLists(), + sessionChildren: this.sessionChildrenTracker.getChildLists() + }; + } + getChannelzSessionInfoGetter(session) { + return () => { + var _a2, _b, _c2; + const sessionInfo = this.sessions.get(session); + const sessionSocket = session.socket; + const remoteAddress = sessionSocket.remoteAddress ? (0, subchannel_address_1.stringToSubchannelAddress)(sessionSocket.remoteAddress, sessionSocket.remotePort) : null; + const localAddress = sessionSocket.localAddress ? (0, subchannel_address_1.stringToSubchannelAddress)(sessionSocket.localAddress, sessionSocket.localPort) : null; + let tlsInfo; + if (session.encrypted) { + const tlsSocket = sessionSocket; + const cipherInfo = tlsSocket.getCipher(); + const certificate = tlsSocket.getCertificate(); + const peerCertificate = tlsSocket.getPeerCertificate(); + tlsInfo = { + cipherSuiteStandardName: (_a2 = cipherInfo.standardName) !== null && _a2 !== void 0 ? _a2 : null, + cipherSuiteOtherName: cipherInfo.standardName ? null : cipherInfo.name, + localCertificate: certificate && "raw" in certificate ? certificate.raw : null, + remoteCertificate: peerCertificate && "raw" in peerCertificate ? peerCertificate.raw : null + }; + } else { + tlsInfo = null; + } + const socketInfo = { + remoteAddress, + localAddress, + security: tlsInfo, + remoteName: null, + streamsStarted: sessionInfo.streamTracker.callsStarted, + streamsSucceeded: sessionInfo.streamTracker.callsSucceeded, + streamsFailed: sessionInfo.streamTracker.callsFailed, + messagesSent: sessionInfo.messagesSent, + messagesReceived: sessionInfo.messagesReceived, + keepAlivesSent: 0, + lastLocalStreamCreatedTimestamp: null, + lastRemoteStreamCreatedTimestamp: sessionInfo.streamTracker.lastCallStartedTimestamp, + lastMessageSentTimestamp: sessionInfo.lastMessageSentTimestamp, + lastMessageReceivedTimestamp: sessionInfo.lastMessageReceivedTimestamp, + localFlowControlWindow: (_b = session.state.localWindowSize) !== null && _b !== void 0 ? _b : null, + remoteFlowControlWindow: (_c2 = session.state.remoteWindowSize) !== null && _c2 !== void 0 ? _c2 : null + }; + return socketInfo; + }; + } + trace(text) { + logging.trace(constants_1.LogVerbosity.DEBUG, TRACER_NAME, "(" + this.channelzRef.id + ") " + text); + } + addProtoService() { + throw new Error("Not implemented. Use addService() instead"); + } + addService(service, implementation) { + if (service === null || typeof service !== "object" || implementation === null || typeof implementation !== "object") { + throw new Error("addService() requires two objects as arguments"); + } + const serviceKeys = Object.keys(service); + if (serviceKeys.length === 0) { + throw new Error("Cannot add an empty service to a server"); + } + serviceKeys.forEach((name) => { + const attrs = service[name]; + let methodType; + if (attrs.requestStream) { + if (attrs.responseStream) { + methodType = "bidi"; + } else { + methodType = "clientStream"; + } + } else { + if (attrs.responseStream) { + methodType = "serverStream"; + } else { + methodType = "unary"; + } + } + let implFn = implementation[name]; + let impl; + if (implFn === void 0 && typeof attrs.originalName === "string") { + implFn = implementation[attrs.originalName]; + } + if (implFn !== void 0) { + impl = implFn.bind(implementation); + } else { + impl = getDefaultHandler(methodType, name); + } + const success = this.register(attrs.path, impl, attrs.responseSerialize, attrs.requestDeserialize, methodType); + if (success === false) { + throw new Error(`Method handler for ${attrs.path} already provided.`); + } + }); + } + removeService(service) { + if (service === null || typeof service !== "object") { + throw new Error("removeService() requires object as argument"); + } + const serviceKeys = Object.keys(service); + serviceKeys.forEach((name) => { + const attrs = service[name]; + this.unregister(attrs.path); + }); + } + bind(port, creds) { + throw new Error("Not implemented. Use bindAsync() instead"); + } + bindAsync(port, creds, callback) { + if (this.started === true) { + throw new Error("server is already started"); + } + if (typeof port !== "string") { + throw new TypeError("port must be a string"); + } + if (creds === null || !(creds instanceof server_credentials_1.ServerCredentials)) { + throw new TypeError("creds must be a ServerCredentials object"); + } + if (typeof callback !== "function") { + throw new TypeError("callback must be a function"); + } + const initialPortUri = (0, uri_parser_1.parseUri)(port); + if (initialPortUri === null) { + throw new Error(`Could not parse port "${port}"`); + } + const portUri = (0, resolver_1.mapUriDefaultScheme)(initialPortUri); + if (portUri === null) { + throw new Error(`Could not get a default scheme for port "${port}"`); + } + const serverOptions = { + maxSendHeaderBlockLength: Number.MAX_SAFE_INTEGER + }; + if ("grpc-node.max_session_memory" in this.options) { + serverOptions.maxSessionMemory = this.options["grpc-node.max_session_memory"]; + } else { + serverOptions.maxSessionMemory = Number.MAX_SAFE_INTEGER; + } + if ("grpc.max_concurrent_streams" in this.options) { + serverOptions.settings = { + maxConcurrentStreams: this.options["grpc.max_concurrent_streams"] + }; + } + const deferredCallback = (error2, port2) => { + process.nextTick(() => callback(error2, port2)); + }; + const setupServer = () => { + let http2Server; + if (creds._isSecure()) { + const secureServerOptions = Object.assign(serverOptions, creds._getSettings()); + secureServerOptions.enableTrace = this.options["grpc-node.tls_enable_trace"] === 1; + http2Server = http2.createSecureServer(secureServerOptions); + http2Server.on("secureConnection", (socket) => { + socket.on("error", (e) => { + this.trace("An incoming TLS connection closed with error: " + e.message); + }); + }); + } else { + http2Server = http2.createServer(serverOptions); + } + http2Server.setTimeout(0, noop); + this._setupHandlers(http2Server); + return http2Server; + }; + const bindSpecificPort = (addressList, portNum, previousCount) => { + if (addressList.length === 0) { + return Promise.resolve({ port: portNum, count: previousCount }); + } + return Promise.all(addressList.map((address) => { + this.trace("Attempting to bind " + (0, subchannel_address_1.subchannelAddressToString)(address)); + let addr; + if ((0, subchannel_address_1.isTcpSubchannelAddress)(address)) { + addr = { + host: address.host, + port: portNum + }; + } else { + addr = address; + } + const http2Server = setupServer(); + return new Promise((resolve, reject) => { + const onError = (err) => { + this.trace("Failed to bind " + (0, subchannel_address_1.subchannelAddressToString)(address) + " with error " + err.message); + resolve(err); + }; + http2Server.once("error", onError); + http2Server.listen(addr, () => { + const boundAddress = http2Server.address(); + let boundSubchannelAddress; + if (typeof boundAddress === "string") { + boundSubchannelAddress = { + path: boundAddress + }; + } else { + boundSubchannelAddress = { + host: boundAddress.address, + port: boundAddress.port + }; + } + const channelzRef = (0, channelz_1.registerChannelzSocket)((0, subchannel_address_1.subchannelAddressToString)(boundSubchannelAddress), () => { + return { + localAddress: boundSubchannelAddress, + remoteAddress: null, + security: null, + remoteName: null, + streamsStarted: 0, + streamsSucceeded: 0, + streamsFailed: 0, + messagesSent: 0, + messagesReceived: 0, + keepAlivesSent: 0, + lastLocalStreamCreatedTimestamp: null, + lastRemoteStreamCreatedTimestamp: null, + lastMessageSentTimestamp: null, + lastMessageReceivedTimestamp: null, + localFlowControlWindow: null, + remoteFlowControlWindow: null + }; + }, this.channelzEnabled); + if (this.channelzEnabled) { + this.listenerChildrenTracker.refChild(channelzRef); + } + this.http2ServerList.push({ + server: http2Server, + channelzRef + }); + this.trace("Successfully bound " + (0, subchannel_address_1.subchannelAddressToString)(boundSubchannelAddress)); + resolve("port" in boundSubchannelAddress ? boundSubchannelAddress.port : portNum); + http2Server.removeListener("error", onError); + }); + }); + })).then((results) => { + let count = 0; + for (const result of results) { + if (typeof result === "number") { + count += 1; + if (result !== portNum) { + throw new Error("Invalid state: multiple port numbers added from single address"); + } + } + } + return { + port: portNum, + count: count + previousCount + }; + }); + }; + const bindWildcardPort = (addressList) => { + if (addressList.length === 0) { + return Promise.resolve({ port: 0, count: 0 }); + } + const address = addressList[0]; + const http2Server = setupServer(); + return new Promise((resolve, reject) => { + const onError = (err) => { + this.trace("Failed to bind " + (0, subchannel_address_1.subchannelAddressToString)(address) + " with error " + err.message); + resolve(bindWildcardPort(addressList.slice(1))); + }; + http2Server.once("error", onError); + http2Server.listen(address, () => { + const boundAddress = http2Server.address(); + const boundSubchannelAddress = { + host: boundAddress.address, + port: boundAddress.port + }; + const channelzRef = (0, channelz_1.registerChannelzSocket)((0, subchannel_address_1.subchannelAddressToString)(boundSubchannelAddress), () => { + return { + localAddress: boundSubchannelAddress, + remoteAddress: null, + security: null, + remoteName: null, + streamsStarted: 0, + streamsSucceeded: 0, + streamsFailed: 0, + messagesSent: 0, + messagesReceived: 0, + keepAlivesSent: 0, + lastLocalStreamCreatedTimestamp: null, + lastRemoteStreamCreatedTimestamp: null, + lastMessageSentTimestamp: null, + lastMessageReceivedTimestamp: null, + localFlowControlWindow: null, + remoteFlowControlWindow: null + }; + }, this.channelzEnabled); + if (this.channelzEnabled) { + this.listenerChildrenTracker.refChild(channelzRef); + } + this.http2ServerList.push({ + server: http2Server, + channelzRef + }); + this.trace("Successfully bound " + (0, subchannel_address_1.subchannelAddressToString)(boundSubchannelAddress)); + resolve(bindSpecificPort(addressList.slice(1), boundAddress.port, 1)); + http2Server.removeListener("error", onError); + }); + }); + }; + const resolverListener = { + onSuccessfulResolution: (addressList, serviceConfig, serviceConfigError) => { + resolverListener.onSuccessfulResolution = () => { + }; + if (addressList.length === 0) { + deferredCallback(new Error(`No addresses resolved for port ${port}`), 0); + return; + } + let bindResultPromise; + if ((0, subchannel_address_1.isTcpSubchannelAddress)(addressList[0])) { + if (addressList[0].port === 0) { + bindResultPromise = bindWildcardPort(addressList); + } else { + bindResultPromise = bindSpecificPort(addressList, addressList[0].port, 0); + } + } else { + bindResultPromise = bindSpecificPort(addressList, 1, 0); + } + bindResultPromise.then((bindResult) => { + if (bindResult.count === 0) { + const errorString = `No address added out of total ${addressList.length} resolved`; + logging.log(constants_1.LogVerbosity.ERROR, errorString); + deferredCallback(new Error(errorString), 0); + } else { + if (bindResult.count < addressList.length) { + logging.log(constants_1.LogVerbosity.INFO, `WARNING Only ${bindResult.count} addresses added out of total ${addressList.length} resolved`); + } + deferredCallback(null, bindResult.port); + } + }, (error2) => { + const errorString = `No address added out of total ${addressList.length} resolved`; + logging.log(constants_1.LogVerbosity.ERROR, errorString); + deferredCallback(new Error(errorString), 0); + }); + }, + onError: (error2) => { + deferredCallback(new Error(error2.details), 0); + } + }; + const resolver = (0, resolver_1.createResolver)(portUri, resolverListener, this.options); + resolver.updateResolution(); + } + forceShutdown() { + for (const { server: http2Server, channelzRef: ref } of this.http2ServerList) { + if (http2Server.listening) { + http2Server.close(() => { + if (this.channelzEnabled) { + this.listenerChildrenTracker.unrefChild(ref); + (0, channelz_1.unregisterChannelzRef)(ref); + } + }); + } + } + this.started = false; + this.sessions.forEach((channelzInfo, session) => { + session.destroy(http2.constants.NGHTTP2_CANCEL); + }); + this.sessions.clear(); + if (this.channelzEnabled) { + (0, channelz_1.unregisterChannelzRef)(this.channelzRef); + } + } + register(name, handler2, serialize, deserialize, type) { + if (this.handlers.has(name)) { + return false; + } + this.handlers.set(name, { + func: handler2, + serialize, + deserialize, + type, + path: name + }); + return true; + } + unregister(name) { + return this.handlers.delete(name); + } + start() { + if (this.http2ServerList.length === 0 || this.http2ServerList.every(({ server: http2Server }) => http2Server.listening !== true)) { + throw new Error("server must be bound in order to start"); + } + if (this.started === true) { + throw new Error("server is already started"); + } + if (this.channelzEnabled) { + this.channelzTrace.addTrace("CT_INFO", "Starting"); + } + this.started = true; + } + tryShutdown(callback) { + const wrappedCallback = (error2) => { + if (this.channelzEnabled) { + (0, channelz_1.unregisterChannelzRef)(this.channelzRef); + } + callback(error2); + }; + let pendingChecks = 0; + function maybeCallback() { + pendingChecks--; + if (pendingChecks === 0) { + wrappedCallback(); + } + } + this.started = false; + for (const { server: http2Server, channelzRef: ref } of this.http2ServerList) { + if (http2Server.listening) { + pendingChecks++; + http2Server.close(() => { + if (this.channelzEnabled) { + this.listenerChildrenTracker.unrefChild(ref); + (0, channelz_1.unregisterChannelzRef)(ref); + } + maybeCallback(); + }); + } + } + this.sessions.forEach((channelzInfo, session) => { + if (!session.closed) { + pendingChecks += 1; + session.close(maybeCallback); + } + }); + if (pendingChecks === 0) { + wrappedCallback(); + } + } + addHttp2Port() { + throw new Error("Not yet implemented"); + } + /** + * Get the channelz reference object for this server. The returned value is + * garbage if channelz is disabled for this server. + * @returns + */ + getChannelzRef() { + return this.channelzRef; + } + _verifyContentType(stream, headers) { + const contentType = headers[http2.constants.HTTP2_HEADER_CONTENT_TYPE]; + if (typeof contentType !== "string" || !contentType.startsWith("application/grpc")) { + stream.respond({ + [http2.constants.HTTP2_HEADER_STATUS]: http2.constants.HTTP_STATUS_UNSUPPORTED_MEDIA_TYPE + }, { endStream: true }); + return false; + } + return true; + } + _retrieveHandler(path) { + this.trace("Received call to method " + path + " at address " + this.serverAddressString); + const handler2 = this.handlers.get(path); + if (handler2 === void 0) { + this.trace("No handler registered for method " + path + ". Sending UNIMPLEMENTED status."); + return null; + } + return handler2; + } + _respondWithError(err, stream, channelzSessionInfo = null) { + const call = new server_call_1.Http2ServerCallStream(stream, null, this.options); + if (err.code === void 0) { + err.code = constants_1.Status.INTERNAL; + } + if (this.channelzEnabled) { + this.callTracker.addCallFailed(); + channelzSessionInfo === null || channelzSessionInfo === void 0 ? void 0 : channelzSessionInfo.streamTracker.addCallFailed(); + } + call.sendError(err); + } + _channelzHandler(stream, headers) { + const channelzSessionInfo = this.sessions.get(stream.session); + this.callTracker.addCallStarted(); + channelzSessionInfo === null || channelzSessionInfo === void 0 ? void 0 : channelzSessionInfo.streamTracker.addCallStarted(); + if (!this._verifyContentType(stream, headers)) { + this.callTracker.addCallFailed(); + channelzSessionInfo === null || channelzSessionInfo === void 0 ? void 0 : channelzSessionInfo.streamTracker.addCallFailed(); + return; + } + const path = headers[HTTP2_HEADER_PATH]; + const handler2 = this._retrieveHandler(path); + if (!handler2) { + this._respondWithError(getUnimplementedStatusResponse(path), stream, channelzSessionInfo); + return; + } + const call = new server_call_1.Http2ServerCallStream(stream, handler2, this.options); + call.once("callEnd", (code) => { + if (code === constants_1.Status.OK) { + this.callTracker.addCallSucceeded(); + } else { + this.callTracker.addCallFailed(); + } + }); + if (channelzSessionInfo) { + call.once("streamEnd", (success) => { + if (success) { + channelzSessionInfo.streamTracker.addCallSucceeded(); + } else { + channelzSessionInfo.streamTracker.addCallFailed(); + } + }); + call.on("sendMessage", () => { + channelzSessionInfo.messagesSent += 1; + channelzSessionInfo.lastMessageSentTimestamp = /* @__PURE__ */ new Date(); + }); + call.on("receiveMessage", () => { + channelzSessionInfo.messagesReceived += 1; + channelzSessionInfo.lastMessageReceivedTimestamp = /* @__PURE__ */ new Date(); + }); + } + if (!this._runHandlerForCall(call, handler2, headers)) { + this.callTracker.addCallFailed(); + channelzSessionInfo === null || channelzSessionInfo === void 0 ? void 0 : channelzSessionInfo.streamTracker.addCallFailed(); + call.sendError({ + code: constants_1.Status.INTERNAL, + details: `Unknown handler type: ${handler2.type}` + }); + } + } + _streamHandler(stream, headers) { + if (this._verifyContentType(stream, headers) !== true) { + return; + } + const path = headers[HTTP2_HEADER_PATH]; + const handler2 = this._retrieveHandler(path); + if (!handler2) { + this._respondWithError(getUnimplementedStatusResponse(path), stream, null); + return; + } + const call = new server_call_1.Http2ServerCallStream(stream, handler2, this.options); + if (!this._runHandlerForCall(call, handler2, headers)) { + call.sendError({ + code: constants_1.Status.INTERNAL, + details: `Unknown handler type: ${handler2.type}` + }); + } + } + _runHandlerForCall(call, handler2, headers) { + var _a2; + const metadata = call.receiveMetadata(headers); + const encoding = (_a2 = metadata.get("grpc-encoding")[0]) !== null && _a2 !== void 0 ? _a2 : "identity"; + metadata.remove("grpc-encoding"); + const { type } = handler2; + if (type === "unary") { + handleUnary(call, handler2, metadata, encoding); + } else if (type === "clientStream") { + handleClientStreaming(call, handler2, metadata, encoding); + } else if (type === "serverStream") { + handleServerStreaming(call, handler2, metadata, encoding); + } else if (type === "bidi") { + handleBidiStreaming(call, handler2, metadata, encoding); + } else { + return false; + } + return true; + } + _setupHandlers(http2Server) { + if (http2Server === null) { + return; + } + const serverAddress = http2Server.address(); + let serverAddressString = "null"; + if (serverAddress) { + if (typeof serverAddress === "string") { + serverAddressString = serverAddress; + } else { + serverAddressString = serverAddress.address + ":" + serverAddress.port; + } + } + this.serverAddressString = serverAddressString; + const handler2 = this.channelzEnabled ? this._channelzHandler : this._streamHandler; + http2Server.on("stream", handler2.bind(this)); + http2Server.on("session", (session) => { + var _a2, _b, _c2, _d, _e2; + if (!this.started) { + session.destroy(); + return; + } + const channelzRef = (0, channelz_1.registerChannelzSocket)((_a2 = session.socket.remoteAddress) !== null && _a2 !== void 0 ? _a2 : "unknown", this.getChannelzSessionInfoGetter(session), this.channelzEnabled); + const channelzSessionInfo = { + ref: channelzRef, + streamTracker: new channelz_1.ChannelzCallTracker(), + messagesSent: 0, + messagesReceived: 0, + lastMessageSentTimestamp: null, + lastMessageReceivedTimestamp: null + }; + this.sessions.set(session, channelzSessionInfo); + const clientAddress = session.socket.remoteAddress; + if (this.channelzEnabled) { + this.channelzTrace.addTrace("CT_INFO", "Connection established by client " + clientAddress); + this.sessionChildrenTracker.refChild(channelzRef); + } + let connectionAgeTimer = null; + let connectionAgeGraceTimer = null; + let sessionClosedByServer = false; + if (this.maxConnectionAgeMs !== UNLIMITED_CONNECTION_AGE_MS) { + const jitterMagnitude = this.maxConnectionAgeMs / 10; + const jitter = Math.random() * jitterMagnitude * 2 - jitterMagnitude; + connectionAgeTimer = (_c2 = (_b = setTimeout(() => { + var _a3, _b2; + sessionClosedByServer = true; + if (this.channelzEnabled) { + this.channelzTrace.addTrace("CT_INFO", "Connection dropped by max connection age from " + clientAddress); + } + try { + session.goaway(http2.constants.NGHTTP2_NO_ERROR, ~(1 << 31), Buffer.from("max_age")); + } catch (e) { + session.destroy(); + return; + } + session.close(); + if (this.maxConnectionAgeGraceMs !== UNLIMITED_CONNECTION_AGE_MS) { + connectionAgeGraceTimer = (_b2 = (_a3 = setTimeout(() => { + session.destroy(); + }, this.maxConnectionAgeGraceMs)).unref) === null || _b2 === void 0 ? void 0 : _b2.call(_a3); + } + }, this.maxConnectionAgeMs + jitter)).unref) === null || _c2 === void 0 ? void 0 : _c2.call(_b); + } + const keeapliveTimeTimer = (_e2 = (_d = setInterval(() => { + var _a3, _b2; + const timeoutTImer = (_b2 = (_a3 = setTimeout(() => { + sessionClosedByServer = true; + if (this.channelzEnabled) { + this.channelzTrace.addTrace("CT_INFO", "Connection dropped by keepalive timeout from " + clientAddress); + } + session.close(); + }, this.keepaliveTimeoutMs)).unref) === null || _b2 === void 0 ? void 0 : _b2.call(_a3); + try { + session.ping((err, duration, payload) => { + clearTimeout(timeoutTImer); + }); + } catch (e) { + session.destroy(); + } + }, this.keepaliveTimeMs)).unref) === null || _e2 === void 0 ? void 0 : _e2.call(_d); + session.on("close", () => { + if (this.channelzEnabled) { + if (!sessionClosedByServer) { + this.channelzTrace.addTrace("CT_INFO", "Connection dropped by client " + clientAddress); + } + this.sessionChildrenTracker.unrefChild(channelzRef); + (0, channelz_1.unregisterChannelzRef)(channelzRef); + } + if (connectionAgeTimer) { + clearTimeout(connectionAgeTimer); + } + if (connectionAgeGraceTimer) { + clearTimeout(connectionAgeGraceTimer); + } + if (keeapliveTimeTimer) { + clearTimeout(keeapliveTimeTimer); + } + this.sessions.delete(session); + }); + }); + } + }; + exports2.Server = Server3; + async function handleUnary(call, handler2, metadata, encoding) { + try { + const request = await call.receiveUnaryMessage(encoding); + if (request === void 0 || call.cancelled) { + return; + } + const emitter = new server_call_1.ServerUnaryCallImpl(call, metadata, request); + handler2.func(emitter, (err, value, trailer, flags) => { + call.sendUnaryMessage(err, value, trailer, flags); + }); + } catch (err) { + call.sendError(err); + } + } + function handleClientStreaming(call, handler2, metadata, encoding) { + const stream = new server_call_1.ServerReadableStreamImpl(call, metadata, handler2.deserialize, encoding); + function respond(err, value, trailer, flags) { + stream.destroy(); + call.sendUnaryMessage(err, value, trailer, flags); + } + if (call.cancelled) { + return; + } + stream.on("error", respond); + handler2.func(stream, respond); + } + async function handleServerStreaming(call, handler2, metadata, encoding) { + try { + const request = await call.receiveUnaryMessage(encoding); + if (request === void 0 || call.cancelled) { + return; + } + const stream = new server_call_1.ServerWritableStreamImpl(call, metadata, handler2.serialize, request); + handler2.func(stream); + } catch (err) { + call.sendError(err); + } + } + function handleBidiStreaming(call, handler2, metadata, encoding) { + const stream = new server_call_1.ServerDuplexStreamImpl(call, metadata, handler2.serialize, handler2.deserialize, encoding); + if (call.cancelled) { + return; + } + handler2.func(stream); + } + } +}); + +// node_modules/@grpc/grpc-js/build/src/status-builder.js +var require_status_builder = __commonJS({ + "node_modules/@grpc/grpc-js/build/src/status-builder.js"(exports2) { + "use strict"; + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.StatusBuilder = void 0; + var StatusBuilder = class { + constructor() { + this.code = null; + this.details = null; + this.metadata = null; + } + /** + * Adds a status code to the builder. + */ + withCode(code) { + this.code = code; + return this; + } + /** + * Adds details to the builder. + */ + withDetails(details) { + this.details = details; + return this; + } + /** + * Adds metadata to the builder. + */ + withMetadata(metadata) { + this.metadata = metadata; + return this; + } + /** + * Builds the status object. + */ + build() { + const status2 = {}; + if (this.code !== null) { + status2.code = this.code; + } + if (this.details !== null) { + status2.details = this.details; + } + if (this.metadata !== null) { + status2.metadata = this.metadata; + } + return status2; + } + }; + exports2.StatusBuilder = StatusBuilder; + } +}); + +// node_modules/@grpc/grpc-js/build/src/duration.js +var require_duration = __commonJS({ + "node_modules/@grpc/grpc-js/build/src/duration.js"(exports2) { + "use strict"; + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.isDuration = exports2.durationToMs = exports2.msToDuration = void 0; + function msToDuration(millis) { + return { + seconds: millis / 1e3 | 0, + nanos: millis % 1e3 * 1e6 | 0 + }; + } + exports2.msToDuration = msToDuration; + function durationToMs(duration) { + return duration.seconds * 1e3 + duration.nanos / 1e6 | 0; + } + exports2.durationToMs = durationToMs; + function isDuration(value) { + return typeof value.seconds === "number" && typeof value.nanos === "number"; + } + exports2.isDuration = isDuration; + } +}); + +// node_modules/@grpc/grpc-js/build/src/load-balancer-outlier-detection.js +var require_load_balancer_outlier_detection = __commonJS({ + "node_modules/@grpc/grpc-js/build/src/load-balancer-outlier-detection.js"(exports2) { + "use strict"; + var _a2; + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.setup = exports2.OutlierDetectionLoadBalancer = exports2.OutlierDetectionLoadBalancingConfig = void 0; + var connectivity_state_1 = require_connectivity_state(); + var constants_1 = require_constants(); + var duration_1 = require_duration(); + var experimental_1 = require_experimental(); + var load_balancer_1 = require_load_balancer(); + var load_balancer_child_handler_1 = require_load_balancer_child_handler(); + var picker_1 = require_picker(); + var subchannel_address_1 = require_subchannel_address(); + var subchannel_interface_1 = require_subchannel_interface(); + var logging = require_logging(); + var TRACER_NAME = "outlier_detection"; + function trace(text) { + logging.trace(constants_1.LogVerbosity.DEBUG, TRACER_NAME, text); + } + var TYPE_NAME = "outlier_detection"; + var OUTLIER_DETECTION_ENABLED = ((_a2 = process.env.GRPC_EXPERIMENTAL_ENABLE_OUTLIER_DETECTION) !== null && _a2 !== void 0 ? _a2 : "true") === "true"; + var defaultSuccessRateEjectionConfig = { + stdev_factor: 1900, + enforcement_percentage: 100, + minimum_hosts: 5, + request_volume: 100 + }; + var defaultFailurePercentageEjectionConfig = { + threshold: 85, + enforcement_percentage: 100, + minimum_hosts: 5, + request_volume: 50 + }; + function validateFieldType(obj, fieldName, expectedType, objectName) { + if (fieldName in obj && typeof obj[fieldName] !== expectedType) { + const fullFieldName = objectName ? `${objectName}.${fieldName}` : fieldName; + throw new Error(`outlier detection config ${fullFieldName} parse error: expected ${expectedType}, got ${typeof obj[fieldName]}`); + } + } + function validatePositiveDuration(obj, fieldName, objectName) { + const fullFieldName = objectName ? `${objectName}.${fieldName}` : fieldName; + if (fieldName in obj) { + if (!(0, duration_1.isDuration)(obj[fieldName])) { + throw new Error(`outlier detection config ${fullFieldName} parse error: expected Duration, got ${typeof obj[fieldName]}`); + } + if (!(obj[fieldName].seconds >= 0 && obj[fieldName].seconds <= 315576e6 && obj[fieldName].nanos >= 0 && obj[fieldName].nanos <= 999999999)) { + throw new Error(`outlier detection config ${fullFieldName} parse error: values out of range for non-negative Duaration`); + } + } + } + function validatePercentage(obj, fieldName, objectName) { + const fullFieldName = objectName ? `${objectName}.${fieldName}` : fieldName; + validateFieldType(obj, fieldName, "number", objectName); + if (fieldName in obj && !(obj[fieldName] >= 0 && obj[fieldName] <= 100)) { + throw new Error(`outlier detection config ${fullFieldName} parse error: value out of range for percentage (0-100)`); + } + } + var OutlierDetectionLoadBalancingConfig = class _OutlierDetectionLoadBalancingConfig { + constructor(intervalMs, baseEjectionTimeMs, maxEjectionTimeMs, maxEjectionPercent, successRateEjection, failurePercentageEjection, childPolicy) { + this.childPolicy = childPolicy; + if (childPolicy.length > 0 && childPolicy[0].getLoadBalancerName() === "pick_first") { + throw new Error("outlier_detection LB policy cannot have a pick_first child policy"); + } + this.intervalMs = intervalMs !== null && intervalMs !== void 0 ? intervalMs : 1e4; + this.baseEjectionTimeMs = baseEjectionTimeMs !== null && baseEjectionTimeMs !== void 0 ? baseEjectionTimeMs : 3e4; + this.maxEjectionTimeMs = maxEjectionTimeMs !== null && maxEjectionTimeMs !== void 0 ? maxEjectionTimeMs : 3e5; + this.maxEjectionPercent = maxEjectionPercent !== null && maxEjectionPercent !== void 0 ? maxEjectionPercent : 10; + this.successRateEjection = successRateEjection ? Object.assign(Object.assign({}, defaultSuccessRateEjectionConfig), successRateEjection) : null; + this.failurePercentageEjection = failurePercentageEjection ? Object.assign(Object.assign({}, defaultFailurePercentageEjectionConfig), failurePercentageEjection) : null; + } + getLoadBalancerName() { + return TYPE_NAME; + } + toJsonObject() { + return { + interval: (0, duration_1.msToDuration)(this.intervalMs), + base_ejection_time: (0, duration_1.msToDuration)(this.baseEjectionTimeMs), + max_ejection_time: (0, duration_1.msToDuration)(this.maxEjectionTimeMs), + max_ejection_percent: this.maxEjectionPercent, + success_rate_ejection: this.successRateEjection, + failure_percentage_ejection: this.failurePercentageEjection, + child_policy: this.childPolicy.map((policy) => policy.toJsonObject()) + }; + } + getIntervalMs() { + return this.intervalMs; + } + getBaseEjectionTimeMs() { + return this.baseEjectionTimeMs; + } + getMaxEjectionTimeMs() { + return this.maxEjectionTimeMs; + } + getMaxEjectionPercent() { + return this.maxEjectionPercent; + } + getSuccessRateEjectionConfig() { + return this.successRateEjection; + } + getFailurePercentageEjectionConfig() { + return this.failurePercentageEjection; + } + getChildPolicy() { + return this.childPolicy; + } + copyWithChildPolicy(childPolicy) { + return new _OutlierDetectionLoadBalancingConfig(this.intervalMs, this.baseEjectionTimeMs, this.maxEjectionTimeMs, this.maxEjectionPercent, this.successRateEjection, this.failurePercentageEjection, childPolicy); + } + static createFromJson(obj) { + var _a3; + validatePositiveDuration(obj, "interval"); + validatePositiveDuration(obj, "base_ejection_time"); + validatePositiveDuration(obj, "max_ejection_time"); + validatePercentage(obj, "max_ejection_percent"); + if ("success_rate_ejection" in obj) { + if (typeof obj.success_rate_ejection !== "object") { + throw new Error("outlier detection config success_rate_ejection must be an object"); + } + validateFieldType(obj.success_rate_ejection, "stdev_factor", "number", "success_rate_ejection"); + validatePercentage(obj.success_rate_ejection, "enforcement_percentage", "success_rate_ejection"); + validateFieldType(obj.success_rate_ejection, "minimum_hosts", "number", "success_rate_ejection"); + validateFieldType(obj.success_rate_ejection, "request_volume", "number", "success_rate_ejection"); + } + if ("failure_percentage_ejection" in obj) { + if (typeof obj.failure_percentage_ejection !== "object") { + throw new Error("outlier detection config failure_percentage_ejection must be an object"); + } + validatePercentage(obj.failure_percentage_ejection, "threshold", "failure_percentage_ejection"); + validatePercentage(obj.failure_percentage_ejection, "enforcement_percentage", "failure_percentage_ejection"); + validateFieldType(obj.failure_percentage_ejection, "minimum_hosts", "number", "failure_percentage_ejection"); + validateFieldType(obj.failure_percentage_ejection, "request_volume", "number", "failure_percentage_ejection"); + } + return new _OutlierDetectionLoadBalancingConfig(obj.interval ? (0, duration_1.durationToMs)(obj.interval) : null, obj.base_ejection_time ? (0, duration_1.durationToMs)(obj.base_ejection_time) : null, obj.max_ejection_time ? (0, duration_1.durationToMs)(obj.max_ejection_time) : null, (_a3 = obj.max_ejection_percent) !== null && _a3 !== void 0 ? _a3 : null, obj.success_rate_ejection, obj.failure_percentage_ejection, obj.child_policy.map(load_balancer_1.validateLoadBalancingConfig)); + } + }; + exports2.OutlierDetectionLoadBalancingConfig = OutlierDetectionLoadBalancingConfig; + var OutlierDetectionSubchannelWrapper = class extends subchannel_interface_1.BaseSubchannelWrapper { + constructor(childSubchannel, mapEntry) { + super(childSubchannel); + this.mapEntry = mapEntry; + this.stateListeners = []; + this.ejected = false; + this.refCount = 0; + this.childSubchannelState = childSubchannel.getConnectivityState(); + childSubchannel.addConnectivityStateListener((subchannel, previousState, newState, keepaliveTime) => { + this.childSubchannelState = newState; + if (!this.ejected) { + for (const listener of this.stateListeners) { + listener(this, previousState, newState, keepaliveTime); + } + } + }); + } + getConnectivityState() { + if (this.ejected) { + return connectivity_state_1.ConnectivityState.TRANSIENT_FAILURE; + } else { + return this.childSubchannelState; + } + } + /** + * Add a listener function to be called whenever the wrapper's + * connectivity state changes. + * @param listener + */ + addConnectivityStateListener(listener) { + this.stateListeners.push(listener); + } + /** + * Remove a listener previously added with `addConnectivityStateListener` + * @param listener A reference to a function previously passed to + * `addConnectivityStateListener` + */ + removeConnectivityStateListener(listener) { + const listenerIndex = this.stateListeners.indexOf(listener); + if (listenerIndex > -1) { + this.stateListeners.splice(listenerIndex, 1); + } + } + ref() { + this.child.ref(); + this.refCount += 1; + } + unref() { + this.child.unref(); + this.refCount -= 1; + if (this.refCount <= 0) { + if (this.mapEntry) { + const index = this.mapEntry.subchannelWrappers.indexOf(this); + if (index >= 0) { + this.mapEntry.subchannelWrappers.splice(index, 1); + } + } + } + } + eject() { + this.ejected = true; + for (const listener of this.stateListeners) { + listener(this, this.childSubchannelState, connectivity_state_1.ConnectivityState.TRANSIENT_FAILURE, -1); + } + } + uneject() { + this.ejected = false; + for (const listener of this.stateListeners) { + listener(this, connectivity_state_1.ConnectivityState.TRANSIENT_FAILURE, this.childSubchannelState, -1); + } + } + getMapEntry() { + return this.mapEntry; + } + getWrappedSubchannel() { + return this.child; + } + }; + function createEmptyBucket() { + return { + success: 0, + failure: 0 + }; + } + var CallCounter = class { + constructor() { + this.activeBucket = createEmptyBucket(); + this.inactiveBucket = createEmptyBucket(); + } + addSuccess() { + this.activeBucket.success += 1; + } + addFailure() { + this.activeBucket.failure += 1; + } + switchBuckets() { + this.inactiveBucket = this.activeBucket; + this.activeBucket = createEmptyBucket(); + } + getLastSuccesses() { + return this.inactiveBucket.success; + } + getLastFailures() { + return this.inactiveBucket.failure; + } + }; + var OutlierDetectionPicker = class { + constructor(wrappedPicker, countCalls) { + this.wrappedPicker = wrappedPicker; + this.countCalls = countCalls; + } + pick(pickArgs) { + const wrappedPick = this.wrappedPicker.pick(pickArgs); + if (wrappedPick.pickResultType === picker_1.PickResultType.COMPLETE) { + const subchannelWrapper = wrappedPick.subchannel; + const mapEntry = subchannelWrapper.getMapEntry(); + if (mapEntry) { + let onCallEnded = wrappedPick.onCallEnded; + if (this.countCalls) { + onCallEnded = (statusCode) => { + var _a3; + if (statusCode === constants_1.Status.OK) { + mapEntry.counter.addSuccess(); + } else { + mapEntry.counter.addFailure(); + } + (_a3 = wrappedPick.onCallEnded) === null || _a3 === void 0 ? void 0 : _a3.call(wrappedPick, statusCode); + }; + } + return Object.assign(Object.assign({}, wrappedPick), { subchannel: subchannelWrapper.getWrappedSubchannel(), onCallEnded }); + } else { + return Object.assign(Object.assign({}, wrappedPick), { subchannel: subchannelWrapper.getWrappedSubchannel() }); + } + } else { + return wrappedPick; + } + } + }; + var OutlierDetectionLoadBalancer = class { + constructor(channelControlHelper) { + this.addressMap = /* @__PURE__ */ new Map(); + this.latestConfig = null; + this.timerStartTime = null; + this.childBalancer = new load_balancer_child_handler_1.ChildLoadBalancerHandler((0, experimental_1.createChildChannelControlHelper)(channelControlHelper, { + createSubchannel: (subchannelAddress, subchannelArgs) => { + const originalSubchannel = channelControlHelper.createSubchannel(subchannelAddress, subchannelArgs); + const mapEntry = this.addressMap.get((0, subchannel_address_1.subchannelAddressToString)(subchannelAddress)); + const subchannelWrapper = new OutlierDetectionSubchannelWrapper(originalSubchannel, mapEntry); + if ((mapEntry === null || mapEntry === void 0 ? void 0 : mapEntry.currentEjectionTimestamp) !== null) { + subchannelWrapper.eject(); + } + mapEntry === null || mapEntry === void 0 ? void 0 : mapEntry.subchannelWrappers.push(subchannelWrapper); + return subchannelWrapper; + }, + updateState: (connectivityState, picker) => { + if (connectivityState === connectivity_state_1.ConnectivityState.READY) { + channelControlHelper.updateState(connectivityState, new OutlierDetectionPicker(picker, this.isCountingEnabled())); + } else { + channelControlHelper.updateState(connectivityState, picker); + } + } + })); + this.ejectionTimer = setInterval(() => { + }, 0); + clearInterval(this.ejectionTimer); + } + isCountingEnabled() { + return this.latestConfig !== null && (this.latestConfig.getSuccessRateEjectionConfig() !== null || this.latestConfig.getFailurePercentageEjectionConfig() !== null); + } + getCurrentEjectionPercent() { + let ejectionCount = 0; + for (const mapEntry of this.addressMap.values()) { + if (mapEntry.currentEjectionTimestamp !== null) { + ejectionCount += 1; + } + } + return ejectionCount * 100 / this.addressMap.size; + } + runSuccessRateCheck(ejectionTimestamp) { + if (!this.latestConfig) { + return; + } + const successRateConfig = this.latestConfig.getSuccessRateEjectionConfig(); + if (!successRateConfig) { + return; + } + trace("Running success rate check"); + const targetRequestVolume = successRateConfig.request_volume; + let addresesWithTargetVolume = 0; + const successRates = []; + for (const [address, mapEntry] of this.addressMap) { + const successes = mapEntry.counter.getLastSuccesses(); + const failures = mapEntry.counter.getLastFailures(); + trace("Stats for " + address + ": successes=" + successes + " failures=" + failures + " targetRequestVolume=" + targetRequestVolume); + if (successes + failures >= targetRequestVolume) { + addresesWithTargetVolume += 1; + successRates.push(successes / (successes + failures)); + } + } + trace("Found " + addresesWithTargetVolume + " success rate candidates; currentEjectionPercent=" + this.getCurrentEjectionPercent() + " successRates=[" + successRates + "]"); + if (addresesWithTargetVolume < successRateConfig.minimum_hosts) { + return; + } + const successRateMean = successRates.reduce((a, b) => a + b) / successRates.length; + let successRateDeviationSum = 0; + for (const rate of successRates) { + const deviation = rate - successRateMean; + successRateDeviationSum += deviation * deviation; + } + const successRateVariance = successRateDeviationSum / successRates.length; + const successRateStdev = Math.sqrt(successRateVariance); + const ejectionThreshold = successRateMean - successRateStdev * (successRateConfig.stdev_factor / 1e3); + trace("stdev=" + successRateStdev + " ejectionThreshold=" + ejectionThreshold); + for (const [address, mapEntry] of this.addressMap.entries()) { + if (this.getCurrentEjectionPercent() >= this.latestConfig.getMaxEjectionPercent()) { + break; + } + const successes = mapEntry.counter.getLastSuccesses(); + const failures = mapEntry.counter.getLastFailures(); + if (successes + failures < targetRequestVolume) { + continue; + } + const successRate = successes / (successes + failures); + trace("Checking candidate " + address + " successRate=" + successRate); + if (successRate < ejectionThreshold) { + const randomNumber = Math.random() * 100; + trace("Candidate " + address + " randomNumber=" + randomNumber + " enforcement_percentage=" + successRateConfig.enforcement_percentage); + if (randomNumber < successRateConfig.enforcement_percentage) { + trace("Ejecting candidate " + address); + this.eject(mapEntry, ejectionTimestamp); + } + } + } + } + runFailurePercentageCheck(ejectionTimestamp) { + if (!this.latestConfig) { + return; + } + const failurePercentageConfig = this.latestConfig.getFailurePercentageEjectionConfig(); + if (!failurePercentageConfig) { + return; + } + trace("Running failure percentage check. threshold=" + failurePercentageConfig.threshold + " request volume threshold=" + failurePercentageConfig.request_volume); + let addressesWithTargetVolume = 0; + for (const mapEntry of this.addressMap.values()) { + const successes = mapEntry.counter.getLastSuccesses(); + const failures = mapEntry.counter.getLastFailures(); + if (successes + failures >= failurePercentageConfig.request_volume) { + addressesWithTargetVolume += 1; + } + } + if (addressesWithTargetVolume < failurePercentageConfig.minimum_hosts) { + return; + } + for (const [address, mapEntry] of this.addressMap.entries()) { + if (this.getCurrentEjectionPercent() >= this.latestConfig.getMaxEjectionPercent()) { + break; + } + const successes = mapEntry.counter.getLastSuccesses(); + const failures = mapEntry.counter.getLastFailures(); + trace("Candidate successes=" + successes + " failures=" + failures); + if (successes + failures < failurePercentageConfig.request_volume) { + continue; + } + const failurePercentage = failures * 100 / (failures + successes); + if (failurePercentage > failurePercentageConfig.threshold) { + const randomNumber = Math.random() * 100; + trace("Candidate " + address + " randomNumber=" + randomNumber + " enforcement_percentage=" + failurePercentageConfig.enforcement_percentage); + if (randomNumber < failurePercentageConfig.enforcement_percentage) { + trace("Ejecting candidate " + address); + this.eject(mapEntry, ejectionTimestamp); + } + } + } + } + eject(mapEntry, ejectionTimestamp) { + mapEntry.currentEjectionTimestamp = /* @__PURE__ */ new Date(); + mapEntry.ejectionTimeMultiplier += 1; + for (const subchannelWrapper of mapEntry.subchannelWrappers) { + subchannelWrapper.eject(); + } + } + uneject(mapEntry) { + mapEntry.currentEjectionTimestamp = null; + for (const subchannelWrapper of mapEntry.subchannelWrappers) { + subchannelWrapper.uneject(); + } + } + switchAllBuckets() { + for (const mapEntry of this.addressMap.values()) { + mapEntry.counter.switchBuckets(); + } + } + startTimer(delayMs) { + var _a3, _b; + this.ejectionTimer = setTimeout(() => this.runChecks(), delayMs); + (_b = (_a3 = this.ejectionTimer).unref) === null || _b === void 0 ? void 0 : _b.call(_a3); + } + runChecks() { + const ejectionTimestamp = /* @__PURE__ */ new Date(); + trace("Ejection timer running"); + this.switchAllBuckets(); + if (!this.latestConfig) { + return; + } + this.timerStartTime = ejectionTimestamp; + this.startTimer(this.latestConfig.getIntervalMs()); + this.runSuccessRateCheck(ejectionTimestamp); + this.runFailurePercentageCheck(ejectionTimestamp); + for (const [address, mapEntry] of this.addressMap.entries()) { + if (mapEntry.currentEjectionTimestamp === null) { + if (mapEntry.ejectionTimeMultiplier > 0) { + mapEntry.ejectionTimeMultiplier -= 1; + } + } else { + const baseEjectionTimeMs = this.latestConfig.getBaseEjectionTimeMs(); + const maxEjectionTimeMs = this.latestConfig.getMaxEjectionTimeMs(); + const returnTime = new Date(mapEntry.currentEjectionTimestamp.getTime()); + returnTime.setMilliseconds(returnTime.getMilliseconds() + Math.min(baseEjectionTimeMs * mapEntry.ejectionTimeMultiplier, Math.max(baseEjectionTimeMs, maxEjectionTimeMs))); + if (returnTime < /* @__PURE__ */ new Date()) { + trace("Unejecting " + address); + this.uneject(mapEntry); + } + } + } + } + updateAddressList(addressList, lbConfig, attributes) { + if (!(lbConfig instanceof OutlierDetectionLoadBalancingConfig)) { + return; + } + const subchannelAddresses = /* @__PURE__ */ new Set(); + for (const address of addressList) { + subchannelAddresses.add((0, subchannel_address_1.subchannelAddressToString)(address)); + } + for (const address of subchannelAddresses) { + if (!this.addressMap.has(address)) { + trace("Adding map entry for " + address); + this.addressMap.set(address, { + counter: new CallCounter(), + currentEjectionTimestamp: null, + ejectionTimeMultiplier: 0, + subchannelWrappers: [] + }); + } + } + for (const key of this.addressMap.keys()) { + if (!subchannelAddresses.has(key)) { + trace("Removing map entry for " + key); + this.addressMap.delete(key); + } + } + const childPolicy = (0, load_balancer_1.getFirstUsableConfig)(lbConfig.getChildPolicy(), true); + this.childBalancer.updateAddressList(addressList, childPolicy, attributes); + if (lbConfig.getSuccessRateEjectionConfig() || lbConfig.getFailurePercentageEjectionConfig()) { + if (this.timerStartTime) { + trace("Previous timer existed. Replacing timer"); + clearTimeout(this.ejectionTimer); + const remainingDelay = lbConfig.getIntervalMs() - ((/* @__PURE__ */ new Date()).getTime() - this.timerStartTime.getTime()); + this.startTimer(remainingDelay); + } else { + trace("Starting new timer"); + this.timerStartTime = /* @__PURE__ */ new Date(); + this.startTimer(lbConfig.getIntervalMs()); + this.switchAllBuckets(); + } + } else { + trace("Counting disabled. Cancelling timer."); + this.timerStartTime = null; + clearTimeout(this.ejectionTimer); + for (const mapEntry of this.addressMap.values()) { + this.uneject(mapEntry); + mapEntry.ejectionTimeMultiplier = 0; + } + } + this.latestConfig = lbConfig; + } + exitIdle() { + this.childBalancer.exitIdle(); + } + resetBackoff() { + this.childBalancer.resetBackoff(); + } + destroy() { + clearTimeout(this.ejectionTimer); + this.childBalancer.destroy(); + } + getTypeName() { + return TYPE_NAME; + } + }; + exports2.OutlierDetectionLoadBalancer = OutlierDetectionLoadBalancer; + function setup() { + if (OUTLIER_DETECTION_ENABLED) { + (0, experimental_1.registerLoadBalancerType)(TYPE_NAME, OutlierDetectionLoadBalancer, OutlierDetectionLoadBalancingConfig); + } + } + exports2.setup = setup; + } +}); + +// node_modules/@grpc/grpc-js/build/src/experimental.js +var require_experimental = __commonJS({ + "node_modules/@grpc/grpc-js/build/src/experimental.js"(exports2) { + "use strict"; + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.OutlierDetectionLoadBalancingConfig = exports2.BaseSubchannelWrapper = exports2.registerAdminService = exports2.FilterStackFactory = exports2.BaseFilter = exports2.PickResultType = exports2.QueuePicker = exports2.UnavailablePicker = exports2.ChildLoadBalancerHandler = exports2.subchannelAddressToString = exports2.validateLoadBalancingConfig = exports2.getFirstUsableConfig = exports2.registerLoadBalancerType = exports2.createChildChannelControlHelper = exports2.BackoffTimeout = exports2.durationToMs = exports2.uriToString = exports2.createResolver = exports2.registerResolver = exports2.log = exports2.trace = void 0; + var logging_1 = require_logging(); + Object.defineProperty(exports2, "trace", { enumerable: true, get: function() { + return logging_1.trace; + } }); + Object.defineProperty(exports2, "log", { enumerable: true, get: function() { + return logging_1.log; + } }); + var resolver_1 = require_resolver(); + Object.defineProperty(exports2, "registerResolver", { enumerable: true, get: function() { + return resolver_1.registerResolver; + } }); + Object.defineProperty(exports2, "createResolver", { enumerable: true, get: function() { + return resolver_1.createResolver; + } }); + var uri_parser_1 = require_uri_parser(); + Object.defineProperty(exports2, "uriToString", { enumerable: true, get: function() { + return uri_parser_1.uriToString; + } }); + var duration_1 = require_duration(); + Object.defineProperty(exports2, "durationToMs", { enumerable: true, get: function() { + return duration_1.durationToMs; + } }); + var backoff_timeout_1 = require_backoff_timeout(); + Object.defineProperty(exports2, "BackoffTimeout", { enumerable: true, get: function() { + return backoff_timeout_1.BackoffTimeout; + } }); + var load_balancer_1 = require_load_balancer(); + Object.defineProperty(exports2, "createChildChannelControlHelper", { enumerable: true, get: function() { + return load_balancer_1.createChildChannelControlHelper; + } }); + Object.defineProperty(exports2, "registerLoadBalancerType", { enumerable: true, get: function() { + return load_balancer_1.registerLoadBalancerType; + } }); + Object.defineProperty(exports2, "getFirstUsableConfig", { enumerable: true, get: function() { + return load_balancer_1.getFirstUsableConfig; + } }); + Object.defineProperty(exports2, "validateLoadBalancingConfig", { enumerable: true, get: function() { + return load_balancer_1.validateLoadBalancingConfig; + } }); + var subchannel_address_1 = require_subchannel_address(); + Object.defineProperty(exports2, "subchannelAddressToString", { enumerable: true, get: function() { + return subchannel_address_1.subchannelAddressToString; + } }); + var load_balancer_child_handler_1 = require_load_balancer_child_handler(); + Object.defineProperty(exports2, "ChildLoadBalancerHandler", { enumerable: true, get: function() { + return load_balancer_child_handler_1.ChildLoadBalancerHandler; + } }); + var picker_1 = require_picker(); + Object.defineProperty(exports2, "UnavailablePicker", { enumerable: true, get: function() { + return picker_1.UnavailablePicker; + } }); + Object.defineProperty(exports2, "QueuePicker", { enumerable: true, get: function() { + return picker_1.QueuePicker; + } }); + Object.defineProperty(exports2, "PickResultType", { enumerable: true, get: function() { + return picker_1.PickResultType; + } }); + var filter_1 = require_filter(); + Object.defineProperty(exports2, "BaseFilter", { enumerable: true, get: function() { + return filter_1.BaseFilter; + } }); + var filter_stack_1 = require_filter_stack(); + Object.defineProperty(exports2, "FilterStackFactory", { enumerable: true, get: function() { + return filter_stack_1.FilterStackFactory; + } }); + var admin_1 = require_admin(); + Object.defineProperty(exports2, "registerAdminService", { enumerable: true, get: function() { + return admin_1.registerAdminService; + } }); + var subchannel_interface_1 = require_subchannel_interface(); + Object.defineProperty(exports2, "BaseSubchannelWrapper", { enumerable: true, get: function() { + return subchannel_interface_1.BaseSubchannelWrapper; + } }); + var load_balancer_outlier_detection_1 = require_load_balancer_outlier_detection(); + Object.defineProperty(exports2, "OutlierDetectionLoadBalancingConfig", { enumerable: true, get: function() { + return load_balancer_outlier_detection_1.OutlierDetectionLoadBalancingConfig; + } }); + } +}); + +// node_modules/@grpc/grpc-js/build/src/resolver-dns.js +var require_resolver_dns = __commonJS({ + "node_modules/@grpc/grpc-js/build/src/resolver-dns.js"(exports2) { + "use strict"; + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.setup = void 0; + var resolver_1 = require_resolver(); + var dns = require("dns"); + var util = require("util"); + var service_config_1 = require_service_config(); + var constants_1 = require_constants(); + var metadata_1 = require_metadata(); + var logging = require_logging(); + var constants_2 = require_constants(); + var uri_parser_1 = require_uri_parser(); + var net_1 = require("net"); + var backoff_timeout_1 = require_backoff_timeout(); + var TRACER_NAME = "dns_resolver"; + function trace(text) { + logging.trace(constants_2.LogVerbosity.DEBUG, TRACER_NAME, text); + } + var DEFAULT_PORT = 443; + var DEFAULT_MIN_TIME_BETWEEN_RESOLUTIONS_MS = 3e4; + var resolveTxtPromise = util.promisify(dns.resolveTxt); + var dnsLookupPromise = util.promisify(dns.lookup); + function mergeArrays(...arrays) { + const result = []; + for (let i = 0; i < Math.max.apply(null, arrays.map((array) => array.length)); i++) { + for (const array of arrays) { + if (i < array.length) { + result.push(array[i]); + } + } + } + return result; + } + var DnsResolver = class { + constructor(target, listener, channelOptions) { + var _a2, _b, _c2; + this.target = target; + this.listener = listener; + this.pendingLookupPromise = null; + this.pendingTxtPromise = null; + this.latestLookupResult = null; + this.latestServiceConfig = null; + this.latestServiceConfigError = null; + this.continueResolving = false; + this.isNextResolutionTimerRunning = false; + this.isServiceConfigEnabled = true; + trace("Resolver constructed for target " + (0, uri_parser_1.uriToString)(target)); + const hostPort = (0, uri_parser_1.splitHostPort)(target.path); + if (hostPort === null) { + this.ipResult = null; + this.dnsHostname = null; + this.port = null; + } else { + if ((0, net_1.isIPv4)(hostPort.host) || (0, net_1.isIPv6)(hostPort.host)) { + this.ipResult = [ + { + host: hostPort.host, + port: (_a2 = hostPort.port) !== null && _a2 !== void 0 ? _a2 : DEFAULT_PORT + } + ]; + this.dnsHostname = null; + this.port = null; + } else { + this.ipResult = null; + this.dnsHostname = hostPort.host; + this.port = (_b = hostPort.port) !== null && _b !== void 0 ? _b : DEFAULT_PORT; + } + } + this.percentage = Math.random() * 100; + if (channelOptions["grpc.service_config_disable_resolution"] === 1) { + this.isServiceConfigEnabled = false; + } + this.defaultResolutionError = { + code: constants_1.Status.UNAVAILABLE, + details: `Name resolution failed for target ${(0, uri_parser_1.uriToString)(this.target)}`, + metadata: new metadata_1.Metadata() + }; + const backoffOptions = { + initialDelay: channelOptions["grpc.initial_reconnect_backoff_ms"], + maxDelay: channelOptions["grpc.max_reconnect_backoff_ms"] + }; + this.backoff = new backoff_timeout_1.BackoffTimeout(() => { + if (this.continueResolving) { + this.startResolutionWithBackoff(); + } + }, backoffOptions); + this.backoff.unref(); + this.minTimeBetweenResolutionsMs = (_c2 = channelOptions["grpc.dns_min_time_between_resolutions_ms"]) !== null && _c2 !== void 0 ? _c2 : DEFAULT_MIN_TIME_BETWEEN_RESOLUTIONS_MS; + this.nextResolutionTimer = setTimeout(() => { + }, 0); + clearTimeout(this.nextResolutionTimer); + } + /** + * If the target is an IP address, just provide that address as a result. + * Otherwise, initiate A, AAAA, and TXT lookups + */ + startResolution() { + if (this.ipResult !== null) { + trace("Returning IP address for target " + (0, uri_parser_1.uriToString)(this.target)); + setImmediate(() => { + this.listener.onSuccessfulResolution(this.ipResult, null, null, null, {}); + }); + this.backoff.stop(); + this.backoff.reset(); + return; + } + if (this.dnsHostname === null) { + trace("Failed to parse DNS address " + (0, uri_parser_1.uriToString)(this.target)); + setImmediate(() => { + this.listener.onError({ + code: constants_1.Status.UNAVAILABLE, + details: `Failed to parse DNS address ${(0, uri_parser_1.uriToString)(this.target)}`, + metadata: new metadata_1.Metadata() + }); + }); + this.stopNextResolutionTimer(); + } else { + if (this.pendingLookupPromise !== null) { + return; + } + trace("Looking up DNS hostname " + this.dnsHostname); + this.latestLookupResult = null; + const hostname = this.dnsHostname; + this.pendingLookupPromise = dnsLookupPromise(hostname, { all: true }); + this.pendingLookupPromise.then((addressList) => { + if (this.pendingLookupPromise === null) { + return; + } + this.pendingLookupPromise = null; + this.backoff.reset(); + this.backoff.stop(); + const ip4Addresses = addressList.filter((addr) => addr.family === 4); + const ip6Addresses = addressList.filter((addr) => addr.family === 6); + this.latestLookupResult = mergeArrays(ip6Addresses, ip4Addresses).map((addr) => ({ host: addr.address, port: +this.port })); + const allAddressesString = "[" + this.latestLookupResult.map((addr) => addr.host + ":" + addr.port).join(",") + "]"; + trace("Resolved addresses for target " + (0, uri_parser_1.uriToString)(this.target) + ": " + allAddressesString); + if (this.latestLookupResult.length === 0) { + this.listener.onError(this.defaultResolutionError); + return; + } + this.listener.onSuccessfulResolution(this.latestLookupResult, this.latestServiceConfig, this.latestServiceConfigError, null, {}); + }, (err) => { + if (this.pendingLookupPromise === null) { + return; + } + trace("Resolution error for target " + (0, uri_parser_1.uriToString)(this.target) + ": " + err.message); + this.pendingLookupPromise = null; + this.stopNextResolutionTimer(); + this.listener.onError(this.defaultResolutionError); + }); + if (this.isServiceConfigEnabled && this.pendingTxtPromise === null) { + this.pendingTxtPromise = resolveTxtPromise(hostname); + this.pendingTxtPromise.then((txtRecord) => { + if (this.pendingTxtPromise === null) { + return; + } + this.pendingTxtPromise = null; + try { + this.latestServiceConfig = (0, service_config_1.extractAndSelectServiceConfig)(txtRecord, this.percentage); + } catch (err) { + this.latestServiceConfigError = { + code: constants_1.Status.UNAVAILABLE, + details: `Parsing service config failed with error ${err.message}`, + metadata: new metadata_1.Metadata() + }; + } + if (this.latestLookupResult !== null) { + this.listener.onSuccessfulResolution(this.latestLookupResult, this.latestServiceConfig, this.latestServiceConfigError, null, {}); + } + }, (err) => { + }); + } + } + } + startNextResolutionTimer() { + var _a2, _b; + clearTimeout(this.nextResolutionTimer); + this.nextResolutionTimer = (_b = (_a2 = setTimeout(() => { + this.stopNextResolutionTimer(); + if (this.continueResolving) { + this.startResolutionWithBackoff(); + } + }, this.minTimeBetweenResolutionsMs)).unref) === null || _b === void 0 ? void 0 : _b.call(_a2); + this.isNextResolutionTimerRunning = true; + } + stopNextResolutionTimer() { + clearTimeout(this.nextResolutionTimer); + this.isNextResolutionTimerRunning = false; + } + startResolutionWithBackoff() { + if (this.pendingLookupPromise === null) { + this.continueResolving = false; + this.startResolution(); + this.backoff.runOnce(); + this.startNextResolutionTimer(); + } + } + updateResolution() { + if (this.pendingLookupPromise === null) { + if (this.isNextResolutionTimerRunning || this.backoff.isRunning()) { + this.continueResolving = true; + } else { + this.startResolutionWithBackoff(); + } + } + } + /** + * Reset the resolver to the same state it had when it was created. In-flight + * DNS requests cannot be cancelled, but they are discarded and their results + * will be ignored. + */ + destroy() { + this.continueResolving = false; + this.backoff.reset(); + this.backoff.stop(); + this.stopNextResolutionTimer(); + this.pendingLookupPromise = null; + this.pendingTxtPromise = null; + this.latestLookupResult = null; + this.latestServiceConfig = null; + this.latestServiceConfigError = null; + } + /** + * Get the default authority for the given target. For IP targets, that is + * the IP address. For DNS targets, it is the hostname. + * @param target + */ + static getDefaultAuthority(target) { + return target.path; + } + }; + function setup() { + (0, resolver_1.registerResolver)("dns", DnsResolver); + (0, resolver_1.registerDefaultScheme)("dns"); + } + exports2.setup = setup; + } +}); + +// node_modules/@grpc/grpc-js/build/src/resolver-uds.js +var require_resolver_uds = __commonJS({ + "node_modules/@grpc/grpc-js/build/src/resolver-uds.js"(exports2) { + "use strict"; + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.setup = void 0; + var resolver_1 = require_resolver(); + var UdsResolver = class { + constructor(target, listener, channelOptions) { + this.listener = listener; + this.addresses = []; + let path; + if (target.authority === "") { + path = "/" + target.path; + } else { + path = target.path; + } + this.addresses = [{ path }]; + } + updateResolution() { + process.nextTick(this.listener.onSuccessfulResolution, this.addresses, null, null, null, {}); + } + destroy() { + } + static getDefaultAuthority(target) { + return "localhost"; + } + }; + function setup() { + (0, resolver_1.registerResolver)("unix", UdsResolver); + } + exports2.setup = setup; + } +}); + +// node_modules/@grpc/grpc-js/build/src/resolver-ip.js +var require_resolver_ip = __commonJS({ + "node_modules/@grpc/grpc-js/build/src/resolver-ip.js"(exports2) { + "use strict"; + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.setup = void 0; + var net_1 = require("net"); + var constants_1 = require_constants(); + var metadata_1 = require_metadata(); + var resolver_1 = require_resolver(); + var uri_parser_1 = require_uri_parser(); + var logging = require_logging(); + var TRACER_NAME = "ip_resolver"; + function trace(text) { + logging.trace(constants_1.LogVerbosity.DEBUG, TRACER_NAME, text); + } + var IPV4_SCHEME = "ipv4"; + var IPV6_SCHEME = "ipv6"; + var DEFAULT_PORT = 443; + var IpResolver = class { + constructor(target, listener, channelOptions) { + var _a2; + this.listener = listener; + this.addresses = []; + this.error = null; + trace("Resolver constructed for target " + (0, uri_parser_1.uriToString)(target)); + const addresses = []; + if (!(target.scheme === IPV4_SCHEME || target.scheme === IPV6_SCHEME)) { + this.error = { + code: constants_1.Status.UNAVAILABLE, + details: `Unrecognized scheme ${target.scheme} in IP resolver`, + metadata: new metadata_1.Metadata() + }; + return; + } + const pathList = target.path.split(","); + for (const path of pathList) { + const hostPort = (0, uri_parser_1.splitHostPort)(path); + if (hostPort === null) { + this.error = { + code: constants_1.Status.UNAVAILABLE, + details: `Failed to parse ${target.scheme} address ${path}`, + metadata: new metadata_1.Metadata() + }; + return; + } + if (target.scheme === IPV4_SCHEME && !(0, net_1.isIPv4)(hostPort.host) || target.scheme === IPV6_SCHEME && !(0, net_1.isIPv6)(hostPort.host)) { + this.error = { + code: constants_1.Status.UNAVAILABLE, + details: `Failed to parse ${target.scheme} address ${path}`, + metadata: new metadata_1.Metadata() + }; + return; + } + addresses.push({ + host: hostPort.host, + port: (_a2 = hostPort.port) !== null && _a2 !== void 0 ? _a2 : DEFAULT_PORT + }); + } + this.addresses = addresses; + trace("Parsed " + target.scheme + " address list " + this.addresses); + } + updateResolution() { + process.nextTick(() => { + if (this.error) { + this.listener.onError(this.error); + } else { + this.listener.onSuccessfulResolution(this.addresses, null, null, null, {}); + } + }); + } + destroy() { + } + static getDefaultAuthority(target) { + return target.path.split(",")[0]; + } + }; + function setup() { + (0, resolver_1.registerResolver)(IPV4_SCHEME, IpResolver); + (0, resolver_1.registerResolver)(IPV6_SCHEME, IpResolver); + } + exports2.setup = setup; + } +}); + +// node_modules/@grpc/grpc-js/build/src/load-balancer-pick-first.js +var require_load_balancer_pick_first = __commonJS({ + "node_modules/@grpc/grpc-js/build/src/load-balancer-pick-first.js"(exports2) { + "use strict"; + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.setup = exports2.PickFirstLoadBalancer = exports2.shuffled = exports2.PickFirstLoadBalancingConfig = void 0; + var load_balancer_1 = require_load_balancer(); + var connectivity_state_1 = require_connectivity_state(); + var picker_1 = require_picker(); + var logging = require_logging(); + var constants_1 = require_constants(); + var TRACER_NAME = "pick_first"; + function trace(text) { + logging.trace(constants_1.LogVerbosity.DEBUG, TRACER_NAME, text); + } + var TYPE_NAME = "pick_first"; + var CONNECTION_DELAY_INTERVAL_MS = 250; + var PickFirstLoadBalancingConfig = class _PickFirstLoadBalancingConfig { + constructor(shuffleAddressList) { + this.shuffleAddressList = shuffleAddressList; + } + getLoadBalancerName() { + return TYPE_NAME; + } + toJsonObject() { + return { + [TYPE_NAME]: { + shuffleAddressList: this.shuffleAddressList + } + }; + } + getShuffleAddressList() { + return this.shuffleAddressList; + } + // eslint-disable-next-line @typescript-eslint/no-explicit-any + static createFromJson(obj) { + if ("shuffleAddressList" in obj && !(typeof obj.shuffleAddressList === "boolean")) { + throw new Error("pick_first config field shuffleAddressList must be a boolean if provided"); + } + return new _PickFirstLoadBalancingConfig(obj.shuffleAddressList === true); + } + }; + exports2.PickFirstLoadBalancingConfig = PickFirstLoadBalancingConfig; + var PickFirstPicker = class { + constructor(subchannel) { + this.subchannel = subchannel; + } + pick(pickArgs) { + return { + pickResultType: picker_1.PickResultType.COMPLETE, + subchannel: this.subchannel, + status: null, + onCallStarted: null, + onCallEnded: null + }; + } + }; + function shuffled(list) { + const result = list.slice(); + for (let i = result.length - 1; i > 1; i--) { + const j2 = Math.floor(Math.random() * (i + 1)); + const temp = result[i]; + result[i] = result[j2]; + result[j2] = temp; + } + return result; + } + exports2.shuffled = shuffled; + var PickFirstLoadBalancer = class { + /** + * Load balancer that attempts to connect to each backend in the address list + * in order, and picks the first one that connects, using it for every + * request. + * @param channelControlHelper `ChannelControlHelper` instance provided by + * this load balancer's owner. + */ + constructor(channelControlHelper) { + this.channelControlHelper = channelControlHelper; + this.children = []; + this.currentState = connectivity_state_1.ConnectivityState.IDLE; + this.currentSubchannelIndex = 0; + this.currentPick = null; + this.subchannelStateListener = (subchannel, previousState, newState) => { + this.onSubchannelStateUpdate(subchannel, previousState, newState); + }; + this.triedAllSubchannels = false; + this.stickyTransientFailureMode = false; + this.connectionDelayTimeout = setTimeout(() => { + }, 0); + clearTimeout(this.connectionDelayTimeout); + } + allChildrenHaveReportedTF() { + return this.children.every((child) => child.hasReportedTransientFailure); + } + calculateAndReportNewState() { + if (this.currentPick) { + this.updateState(connectivity_state_1.ConnectivityState.READY, new PickFirstPicker(this.currentPick)); + } else if (this.children.length === 0) { + this.updateState(connectivity_state_1.ConnectivityState.IDLE, new picker_1.QueuePicker(this)); + } else { + if (this.stickyTransientFailureMode) { + this.updateState(connectivity_state_1.ConnectivityState.TRANSIENT_FAILURE, new picker_1.UnavailablePicker()); + } else { + this.updateState(connectivity_state_1.ConnectivityState.CONNECTING, new picker_1.QueuePicker(this)); + } + } + } + maybeEnterStickyTransientFailureMode() { + if (this.stickyTransientFailureMode) { + return; + } + if (!this.allChildrenHaveReportedTF()) { + return; + } + this.stickyTransientFailureMode = true; + this.channelControlHelper.requestReresolution(); + for (const { subchannel } of this.children) { + subchannel.startConnecting(); + } + this.calculateAndReportNewState(); + } + removeCurrentPick() { + if (this.currentPick !== null) { + const currentPick = this.currentPick; + this.currentPick = null; + currentPick.unref(); + currentPick.removeConnectivityStateListener(this.subchannelStateListener); + this.channelControlHelper.removeChannelzChild(currentPick.getChannelzRef()); + } + } + onSubchannelStateUpdate(subchannel, previousState, newState) { + var _a2; + if ((_a2 = this.currentPick) === null || _a2 === void 0 ? void 0 : _a2.realSubchannelEquals(subchannel)) { + if (newState !== connectivity_state_1.ConnectivityState.READY) { + this.removeCurrentPick(); + this.calculateAndReportNewState(); + this.channelControlHelper.requestReresolution(); + } + return; + } + for (const [index, child] of this.children.entries()) { + if (subchannel.realSubchannelEquals(child.subchannel)) { + if (newState === connectivity_state_1.ConnectivityState.READY) { + this.pickSubchannel(child.subchannel); + } + if (newState === connectivity_state_1.ConnectivityState.TRANSIENT_FAILURE) { + child.hasReportedTransientFailure = true; + this.maybeEnterStickyTransientFailureMode(); + if (index === this.currentSubchannelIndex) { + this.startNextSubchannelConnecting(index + 1); + } + } + child.subchannel.startConnecting(); + return; + } + } + } + startNextSubchannelConnecting(startIndex) { + clearTimeout(this.connectionDelayTimeout); + if (this.triedAllSubchannels || this.stickyTransientFailureMode) { + return; + } + for (const [index, child] of this.children.entries()) { + if (index >= startIndex) { + const subchannelState = child.subchannel.getConnectivityState(); + if (subchannelState === connectivity_state_1.ConnectivityState.IDLE || subchannelState === connectivity_state_1.ConnectivityState.CONNECTING) { + this.startConnecting(index); + return; + } + } + } + this.triedAllSubchannels = true; + this.maybeEnterStickyTransientFailureMode(); + } + /** + * Have a single subchannel in the `subchannels` list start connecting. + * @param subchannelIndex The index into the `subchannels` list. + */ + startConnecting(subchannelIndex) { + var _a2, _b; + clearTimeout(this.connectionDelayTimeout); + this.currentSubchannelIndex = subchannelIndex; + if (this.children[subchannelIndex].subchannel.getConnectivityState() === connectivity_state_1.ConnectivityState.IDLE) { + trace("Start connecting to subchannel with address " + this.children[subchannelIndex].subchannel.getAddress()); + process.nextTick(() => { + this.children[subchannelIndex].subchannel.startConnecting(); + }); + } + this.connectionDelayTimeout = (_b = (_a2 = setTimeout(() => { + this.startNextSubchannelConnecting(subchannelIndex + 1); + }, CONNECTION_DELAY_INTERVAL_MS)).unref) === null || _b === void 0 ? void 0 : _b.call(_a2); + } + pickSubchannel(subchannel) { + if (subchannel === this.currentPick) { + return; + } + trace("Pick subchannel with address " + subchannel.getAddress()); + this.stickyTransientFailureMode = false; + if (this.currentPick !== null) { + this.currentPick.unref(); + this.channelControlHelper.removeChannelzChild(this.currentPick.getChannelzRef()); + this.currentPick.removeConnectivityStateListener(this.subchannelStateListener); + } + this.currentPick = subchannel; + subchannel.ref(); + this.channelControlHelper.addChannelzChild(subchannel.getChannelzRef()); + this.resetSubchannelList(); + clearTimeout(this.connectionDelayTimeout); + this.calculateAndReportNewState(); + } + updateState(newState, picker) { + trace(connectivity_state_1.ConnectivityState[this.currentState] + " -> " + connectivity_state_1.ConnectivityState[newState]); + this.currentState = newState; + this.channelControlHelper.updateState(newState, picker); + } + resetSubchannelList() { + for (const child of this.children) { + if (child.subchannel !== this.currentPick) { + child.subchannel.removeConnectivityStateListener(this.subchannelStateListener); + } + child.subchannel.unref(); + this.channelControlHelper.removeChannelzChild(child.subchannel.getChannelzRef()); + } + this.currentSubchannelIndex = 0; + this.children = []; + this.triedAllSubchannels = false; + } + updateAddressList(addressList, lbConfig) { + if (!(lbConfig instanceof PickFirstLoadBalancingConfig)) { + return; + } + if (lbConfig.getShuffleAddressList()) { + addressList = shuffled(addressList); + } + const newChildrenList = addressList.map((address) => ({ + subchannel: this.channelControlHelper.createSubchannel(address, {}), + hasReportedTransientFailure: false + })); + for (const { subchannel } of newChildrenList) { + subchannel.ref(); + this.channelControlHelper.addChannelzChild(subchannel.getChannelzRef()); + } + this.resetSubchannelList(); + this.children = newChildrenList; + for (const { subchannel } of this.children) { + subchannel.addConnectivityStateListener(this.subchannelStateListener); + if (subchannel.getConnectivityState() === connectivity_state_1.ConnectivityState.READY) { + this.pickSubchannel(subchannel); + return; + } + } + for (const child of this.children) { + if (child.subchannel.getConnectivityState() === connectivity_state_1.ConnectivityState.TRANSIENT_FAILURE) { + child.hasReportedTransientFailure = true; + } + } + this.startNextSubchannelConnecting(0); + this.calculateAndReportNewState(); + } + exitIdle() { + } + resetBackoff() { + } + destroy() { + this.resetSubchannelList(); + this.removeCurrentPick(); + } + getTypeName() { + return TYPE_NAME; + } + }; + exports2.PickFirstLoadBalancer = PickFirstLoadBalancer; + function setup() { + (0, load_balancer_1.registerLoadBalancerType)(TYPE_NAME, PickFirstLoadBalancer, PickFirstLoadBalancingConfig); + (0, load_balancer_1.registerDefaultLoadBalancerType)(TYPE_NAME); + } + exports2.setup = setup; + } +}); + +// node_modules/@grpc/grpc-js/build/src/load-balancer-round-robin.js +var require_load_balancer_round_robin = __commonJS({ + "node_modules/@grpc/grpc-js/build/src/load-balancer-round-robin.js"(exports2) { + "use strict"; + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.setup = exports2.RoundRobinLoadBalancer = void 0; + var load_balancer_1 = require_load_balancer(); + var connectivity_state_1 = require_connectivity_state(); + var picker_1 = require_picker(); + var subchannel_address_1 = require_subchannel_address(); + var logging = require_logging(); + var constants_1 = require_constants(); + var TRACER_NAME = "round_robin"; + function trace(text) { + logging.trace(constants_1.LogVerbosity.DEBUG, TRACER_NAME, text); + } + var TYPE_NAME = "round_robin"; + var RoundRobinLoadBalancingConfig = class _RoundRobinLoadBalancingConfig { + getLoadBalancerName() { + return TYPE_NAME; + } + constructor() { + } + toJsonObject() { + return { + [TYPE_NAME]: {} + }; + } + // eslint-disable-next-line @typescript-eslint/no-explicit-any + static createFromJson(obj) { + return new _RoundRobinLoadBalancingConfig(); + } + }; + var RoundRobinPicker = class { + constructor(subchannelList, nextIndex = 0) { + this.subchannelList = subchannelList; + this.nextIndex = nextIndex; + } + pick(pickArgs) { + const pickedSubchannel = this.subchannelList[this.nextIndex]; + this.nextIndex = (this.nextIndex + 1) % this.subchannelList.length; + return { + pickResultType: picker_1.PickResultType.COMPLETE, + subchannel: pickedSubchannel, + status: null, + onCallStarted: null, + onCallEnded: null + }; + } + /** + * Check what the next subchannel returned would be. Used by the load + * balancer implementation to preserve this part of the picker state if + * possible when a subchannel connects or disconnects. + */ + peekNextSubchannel() { + return this.subchannelList[this.nextIndex]; + } + }; + var RoundRobinLoadBalancer = class { + constructor(channelControlHelper) { + this.channelControlHelper = channelControlHelper; + this.subchannels = []; + this.currentState = connectivity_state_1.ConnectivityState.IDLE; + this.currentReadyPicker = null; + this.subchannelStateListener = (subchannel, previousState, newState) => { + this.calculateAndUpdateState(); + if (newState === connectivity_state_1.ConnectivityState.TRANSIENT_FAILURE || newState === connectivity_state_1.ConnectivityState.IDLE) { + this.channelControlHelper.requestReresolution(); + subchannel.startConnecting(); + } + }; + } + countSubchannelsWithState(state) { + return this.subchannels.filter((subchannel) => subchannel.getConnectivityState() === state).length; + } + calculateAndUpdateState() { + if (this.countSubchannelsWithState(connectivity_state_1.ConnectivityState.READY) > 0) { + const readySubchannels = this.subchannels.filter((subchannel) => subchannel.getConnectivityState() === connectivity_state_1.ConnectivityState.READY); + let index = 0; + if (this.currentReadyPicker !== null) { + index = readySubchannels.indexOf(this.currentReadyPicker.peekNextSubchannel()); + if (index < 0) { + index = 0; + } + } + this.updateState(connectivity_state_1.ConnectivityState.READY, new RoundRobinPicker(readySubchannels, index)); + } else if (this.countSubchannelsWithState(connectivity_state_1.ConnectivityState.CONNECTING) > 0) { + this.updateState(connectivity_state_1.ConnectivityState.CONNECTING, new picker_1.QueuePicker(this)); + } else if (this.countSubchannelsWithState(connectivity_state_1.ConnectivityState.TRANSIENT_FAILURE) > 0) { + this.updateState(connectivity_state_1.ConnectivityState.TRANSIENT_FAILURE, new picker_1.UnavailablePicker()); + } else { + this.updateState(connectivity_state_1.ConnectivityState.IDLE, new picker_1.QueuePicker(this)); + } + } + updateState(newState, picker) { + trace(connectivity_state_1.ConnectivityState[this.currentState] + " -> " + connectivity_state_1.ConnectivityState[newState]); + if (newState === connectivity_state_1.ConnectivityState.READY) { + this.currentReadyPicker = picker; + } else { + this.currentReadyPicker = null; + } + this.currentState = newState; + this.channelControlHelper.updateState(newState, picker); + } + resetSubchannelList() { + for (const subchannel of this.subchannels) { + subchannel.removeConnectivityStateListener(this.subchannelStateListener); + subchannel.unref(); + this.channelControlHelper.removeChannelzChild(subchannel.getChannelzRef()); + } + this.subchannels = []; + } + updateAddressList(addressList, lbConfig) { + this.resetSubchannelList(); + trace("Connect to address list " + addressList.map((address) => (0, subchannel_address_1.subchannelAddressToString)(address))); + this.subchannels = addressList.map((address) => this.channelControlHelper.createSubchannel(address, {})); + for (const subchannel of this.subchannels) { + subchannel.ref(); + subchannel.addConnectivityStateListener(this.subchannelStateListener); + this.channelControlHelper.addChannelzChild(subchannel.getChannelzRef()); + const subchannelState = subchannel.getConnectivityState(); + if (subchannelState === connectivity_state_1.ConnectivityState.IDLE || subchannelState === connectivity_state_1.ConnectivityState.TRANSIENT_FAILURE) { + subchannel.startConnecting(); + } + } + this.calculateAndUpdateState(); + } + exitIdle() { + for (const subchannel of this.subchannels) { + subchannel.startConnecting(); + } + } + resetBackoff() { + } + destroy() { + this.resetSubchannelList(); + } + getTypeName() { + return TYPE_NAME; + } + }; + exports2.RoundRobinLoadBalancer = RoundRobinLoadBalancer; + function setup() { + (0, load_balancer_1.registerLoadBalancerType)(TYPE_NAME, RoundRobinLoadBalancer, RoundRobinLoadBalancingConfig); + } + exports2.setup = setup; + } +}); + +// node_modules/@grpc/grpc-js/build/src/index.js +var require_src3 = __commonJS({ + "node_modules/@grpc/grpc-js/build/src/index.js"(exports2) { + "use strict"; + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.experimental = exports2.addAdminServicesToServer = exports2.getChannelzHandlers = exports2.getChannelzServiceDefinition = exports2.InterceptorConfigurationError = exports2.InterceptingCall = exports2.RequesterBuilder = exports2.ListenerBuilder = exports2.StatusBuilder = exports2.getClientChannel = exports2.ServerCredentials = exports2.Server = exports2.setLogVerbosity = exports2.setLogger = exports2.load = exports2.loadObject = exports2.CallCredentials = exports2.ChannelCredentials = exports2.waitForClientReady = exports2.closeClient = exports2.Channel = exports2.makeGenericClientConstructor = exports2.makeClientConstructor = exports2.loadPackageDefinition = exports2.Client = exports2.compressionAlgorithms = exports2.propagate = exports2.connectivityState = exports2.status = exports2.logVerbosity = exports2.Metadata = exports2.credentials = void 0; + var call_credentials_1 = require_call_credentials(); + Object.defineProperty(exports2, "CallCredentials", { enumerable: true, get: function() { + return call_credentials_1.CallCredentials; + } }); + var channel_1 = require_channel(); + Object.defineProperty(exports2, "Channel", { enumerable: true, get: function() { + return channel_1.ChannelImplementation; + } }); + var compression_algorithms_1 = require_compression_algorithms(); + Object.defineProperty(exports2, "compressionAlgorithms", { enumerable: true, get: function() { + return compression_algorithms_1.CompressionAlgorithms; + } }); + var connectivity_state_1 = require_connectivity_state(); + Object.defineProperty(exports2, "connectivityState", { enumerable: true, get: function() { + return connectivity_state_1.ConnectivityState; + } }); + var channel_credentials_1 = require_channel_credentials(); + Object.defineProperty(exports2, "ChannelCredentials", { enumerable: true, get: function() { + return channel_credentials_1.ChannelCredentials; + } }); + var client_1 = require_client(); + Object.defineProperty(exports2, "Client", { enumerable: true, get: function() { + return client_1.Client; + } }); + var constants_1 = require_constants(); + Object.defineProperty(exports2, "logVerbosity", { enumerable: true, get: function() { + return constants_1.LogVerbosity; + } }); + Object.defineProperty(exports2, "status", { enumerable: true, get: function() { + return constants_1.Status; + } }); + Object.defineProperty(exports2, "propagate", { enumerable: true, get: function() { + return constants_1.Propagate; + } }); + var logging = require_logging(); + var make_client_1 = require_make_client(); + Object.defineProperty(exports2, "loadPackageDefinition", { enumerable: true, get: function() { + return make_client_1.loadPackageDefinition; + } }); + Object.defineProperty(exports2, "makeClientConstructor", { enumerable: true, get: function() { + return make_client_1.makeClientConstructor; + } }); + Object.defineProperty(exports2, "makeGenericClientConstructor", { enumerable: true, get: function() { + return make_client_1.makeClientConstructor; + } }); + var metadata_1 = require_metadata(); + Object.defineProperty(exports2, "Metadata", { enumerable: true, get: function() { + return metadata_1.Metadata; + } }); + var server_1 = require_server(); + Object.defineProperty(exports2, "Server", { enumerable: true, get: function() { + return server_1.Server; + } }); + var server_credentials_1 = require_server_credentials(); + Object.defineProperty(exports2, "ServerCredentials", { enumerable: true, get: function() { + return server_credentials_1.ServerCredentials; + } }); + var status_builder_1 = require_status_builder(); + Object.defineProperty(exports2, "StatusBuilder", { enumerable: true, get: function() { + return status_builder_1.StatusBuilder; + } }); + exports2.credentials = { + /** + * Combine a ChannelCredentials with any number of CallCredentials into a + * single ChannelCredentials object. + * @param channelCredentials The ChannelCredentials object. + * @param callCredentials Any number of CallCredentials objects. + * @return The resulting ChannelCredentials object. + */ + combineChannelCredentials: (channelCredentials, ...callCredentials) => { + return callCredentials.reduce((acc, other) => acc.compose(other), channelCredentials); + }, + /** + * Combine any number of CallCredentials into a single CallCredentials + * object. + * @param first The first CallCredentials object. + * @param additional Any number of additional CallCredentials objects. + * @return The resulting CallCredentials object. + */ + combineCallCredentials: (first, ...additional) => { + return additional.reduce((acc, other) => acc.compose(other), first); + }, + // from channel-credentials.ts + createInsecure: channel_credentials_1.ChannelCredentials.createInsecure, + createSsl: channel_credentials_1.ChannelCredentials.createSsl, + createFromSecureContext: channel_credentials_1.ChannelCredentials.createFromSecureContext, + // from call-credentials.ts + createFromMetadataGenerator: call_credentials_1.CallCredentials.createFromMetadataGenerator, + createFromGoogleCredential: call_credentials_1.CallCredentials.createFromGoogleCredential, + createEmpty: call_credentials_1.CallCredentials.createEmpty + }; + var closeClient = (client) => client.close(); + exports2.closeClient = closeClient; + var waitForClientReady = (client, deadline, callback) => client.waitForReady(deadline, callback); + exports2.waitForClientReady = waitForClientReady; + var loadObject = (value, options2) => { + throw new Error("Not available in this library. Use @grpc/proto-loader and loadPackageDefinition instead"); + }; + exports2.loadObject = loadObject; + var load = (filename, format, options2) => { + throw new Error("Not available in this library. Use @grpc/proto-loader and loadPackageDefinition instead"); + }; + exports2.load = load; + var setLogger = (logger) => { + logging.setLogger(logger); + }; + exports2.setLogger = setLogger; + var setLogVerbosity = (verbosity) => { + logging.setLoggerVerbosity(verbosity); + }; + exports2.setLogVerbosity = setLogVerbosity; + var getClientChannel = (client) => { + return client_1.Client.prototype.getChannel.call(client); + }; + exports2.getClientChannel = getClientChannel; + var client_interceptors_1 = require_client_interceptors(); + Object.defineProperty(exports2, "ListenerBuilder", { enumerable: true, get: function() { + return client_interceptors_1.ListenerBuilder; + } }); + Object.defineProperty(exports2, "RequesterBuilder", { enumerable: true, get: function() { + return client_interceptors_1.RequesterBuilder; + } }); + Object.defineProperty(exports2, "InterceptingCall", { enumerable: true, get: function() { + return client_interceptors_1.InterceptingCall; + } }); + Object.defineProperty(exports2, "InterceptorConfigurationError", { enumerable: true, get: function() { + return client_interceptors_1.InterceptorConfigurationError; + } }); + var channelz_1 = require_channelz(); + Object.defineProperty(exports2, "getChannelzServiceDefinition", { enumerable: true, get: function() { + return channelz_1.getChannelzServiceDefinition; + } }); + Object.defineProperty(exports2, "getChannelzHandlers", { enumerable: true, get: function() { + return channelz_1.getChannelzHandlers; + } }); + var admin_1 = require_admin(); + Object.defineProperty(exports2, "addAdminServicesToServer", { enumerable: true, get: function() { + return admin_1.addAdminServicesToServer; + } }); + var experimental = require_experimental(); + exports2.experimental = experimental; + var resolver_dns = require_resolver_dns(); + var resolver_uds = require_resolver_uds(); + var resolver_ip = require_resolver_ip(); + var load_balancer_pick_first = require_load_balancer_pick_first(); + var load_balancer_round_robin = require_load_balancer_round_robin(); + var load_balancer_outlier_detection = require_load_balancer_outlier_detection(); + var channelz = require_channelz(); + var clientVersion = require_package2().version; + (() => { + logging.trace(constants_1.LogVerbosity.DEBUG, "index", "Loading @grpc/grpc-js version " + clientVersion); + resolver_dns.setup(); + resolver_uds.setup(); + resolver_ip.setup(); + load_balancer_pick_first.setup(); + load_balancer_round_robin.setup(); + load_balancer_outlier_detection.setup(); + channelz.setup(); + })(); + } +}); + +// node_modules/@prisma/client/runtime/library.js +var require_library = __commonJS({ + "node_modules/@prisma/client/runtime/library.js"(exports, module) { + "use strict"; + var Qa = Object.create; + var Gt = Object.defineProperty; + var Ja = Object.getOwnPropertyDescriptor; + var Ga = Object.getOwnPropertyNames; + var Wa = Object.getPrototypeOf; + var Ha = Object.prototype.hasOwnProperty; + var L = (e, t) => () => (t || e((t = { exports: {} }).exports, t), t.exports); + var xt = (e, t) => { + for (var r in t) + Gt(e, r, { get: t[r], enumerable: true }); + }; + var pi = (e, t, r, n) => { + if (t && typeof t == "object" || typeof t == "function") + for (let i of Ga(t)) + !Ha.call(e, i) && i !== r && Gt(e, i, { get: () => t[i], enumerable: !(n = Ja(t, i)) || n.enumerable }); + return e; + }; + var A = (e, t, r) => (r = e != null ? Qa(Wa(e)) : {}, pi(t || !e || !e.__esModule ? Gt(r, "default", { value: e, enumerable: true }) : r, e)); + var za = (e) => pi(Gt({}, "__esModule", { value: true }), e); + var Ei = L((pd, Pi) => { + var ze = 1e3, Ye = ze * 60, Ze = Ye * 60, Ve = Ze * 24, Ya = Ve * 7, Za = Ve * 365.25; + Pi.exports = function(e, t) { + t = t || {}; + var r = typeof e; + if (r === "string" && e.length > 0) + return Xa(e); + if (r === "number" && isFinite(e)) + return t.long ? tl(e) : el(e); + throw new Error("val is not a non-empty string or a valid number. val=" + JSON.stringify(e)); + }; + function Xa(e) { + if (e = String(e), !(e.length > 100)) { + var t = /^(-?(?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec(e); + if (!!t) { + var r = parseFloat(t[1]), n = (t[2] || "ms").toLowerCase(); + switch (n) { + case "years": + case "year": + case "yrs": + case "yr": + case "y": + return r * Za; + case "weeks": + case "week": + case "w": + return r * Ya; + case "days": + case "day": + case "d": + return r * Ve; + case "hours": + case "hour": + case "hrs": + case "hr": + case "h": + return r * Ze; + case "minutes": + case "minute": + case "mins": + case "min": + case "m": + return r * Ye; + case "seconds": + case "second": + case "secs": + case "sec": + case "s": + return r * ze; + case "milliseconds": + case "millisecond": + case "msecs": + case "msec": + case "ms": + return r; + default: + return; + } + } + } + } + function el(e) { + var t = Math.abs(e); + return t >= Ve ? Math.round(e / Ve) + "d" : t >= Ze ? Math.round(e / Ze) + "h" : t >= Ye ? Math.round(e / Ye) + "m" : t >= ze ? Math.round(e / ze) + "s" : e + "ms"; + } + function tl(e) { + var t = Math.abs(e); + return t >= Ve ? Yt(e, t, Ve, "day") : t >= Ze ? Yt(e, t, Ze, "hour") : t >= Ye ? Yt(e, t, Ye, "minute") : t >= ze ? Yt(e, t, ze, "second") : e + " ms"; + } + function Yt(e, t, r, n) { + var i = t >= r * 1.5; + return Math.round(e / r) + " " + n + (i ? "s" : ""); + } + }); + var en = L((dd, Ti) => { + function rl(e) { + r.debug = r, r.default = r, r.coerce = l, r.disable = o, r.enable = i, r.enabled = s, r.humanize = Ei(), r.destroy = u, Object.keys(e).forEach((c) => { + r[c] = e[c]; + }), r.names = [], r.skips = [], r.formatters = {}; + function t(c) { + let p = 0; + for (let d = 0; d < c.length; d++) + p = (p << 5) - p + c.charCodeAt(d), p |= 0; + return r.colors[Math.abs(p) % r.colors.length]; + } + r.selectColor = t; + function r(c) { + let p, d = null, g, y; + function f(...b) { + if (!f.enabled) + return; + let E = f, v = Number(/* @__PURE__ */ new Date()), x = v - (p || v); + E.diff = x, E.prev = p, E.curr = v, p = v, b[0] = r.coerce(b[0]), typeof b[0] != "string" && b.unshift("%O"); + let M = 0; + b[0] = b[0].replace(/%([a-zA-Z%])/g, (K, Ke) => { + if (K === "%%") + return "%"; + M++; + let I = r.formatters[Ke]; + if (typeof I == "function") { + let J = b[M]; + K = I.call(E, J), b.splice(M, 1), M--; + } + return K; + }), r.formatArgs.call(E, b), (E.log || r.log).apply(E, b); + } + return f.namespace = c, f.useColors = r.useColors(), f.color = r.selectColor(c), f.extend = n, f.destroy = r.destroy, Object.defineProperty(f, "enabled", { enumerable: true, configurable: false, get: () => d !== null ? d : (g !== r.namespaces && (g = r.namespaces, y = r.enabled(c)), y), set: (b) => { + d = b; + } }), typeof r.init == "function" && r.init(f), f; + } + function n(c, p) { + let d = r(this.namespace + (typeof p > "u" ? ":" : p) + c); + return d.log = this.log, d; + } + function i(c) { + r.save(c), r.namespaces = c, r.names = [], r.skips = []; + let p, d = (typeof c == "string" ? c : "").split(/[\s,]+/), g = d.length; + for (p = 0; p < g; p++) + !d[p] || (c = d[p].replace(/\*/g, ".*?"), c[0] === "-" ? r.skips.push(new RegExp("^" + c.slice(1) + "$")) : r.names.push(new RegExp("^" + c + "$"))); + } + function o() { + let c = [...r.names.map(a), ...r.skips.map(a).map((p) => "-" + p)].join(","); + return r.enable(""), c; + } + function s(c) { + if (c[c.length - 1] === "*") + return true; + let p, d; + for (p = 0, d = r.skips.length; p < d; p++) + if (r.skips[p].test(c)) + return false; + for (p = 0, d = r.names.length; p < d; p++) + if (r.names[p].test(c)) + return true; + return false; + } + function a(c) { + return c.toString().substring(2, c.toString().length - 2).replace(/\.\*\?$/, "*"); + } + function l(c) { + return c instanceof Error ? c.stack || c.message : c; + } + function u() { + console.warn("Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`."); + } + return r.enable(r.load()), r; + } + Ti.exports = rl; + }); + var vi = L((se, Zt) => { + se.formatArgs = il; + se.save = ol; + se.load = sl; + se.useColors = nl; + se.storage = al(); + se.destroy = (() => { + let e = false; + return () => { + e || (e = true, console.warn("Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.")); + }; + })(); + se.colors = ["#0000CC", "#0000FF", "#0033CC", "#0033FF", "#0066CC", "#0066FF", "#0099CC", "#0099FF", "#00CC00", "#00CC33", "#00CC66", "#00CC99", "#00CCCC", "#00CCFF", "#3300CC", "#3300FF", "#3333CC", "#3333FF", "#3366CC", "#3366FF", "#3399CC", "#3399FF", "#33CC00", "#33CC33", "#33CC66", "#33CC99", "#33CCCC", "#33CCFF", "#6600CC", "#6600FF", "#6633CC", "#6633FF", "#66CC00", "#66CC33", "#9900CC", "#9900FF", "#9933CC", "#9933FF", "#99CC00", "#99CC33", "#CC0000", "#CC0033", "#CC0066", "#CC0099", "#CC00CC", "#CC00FF", "#CC3300", "#CC3333", "#CC3366", "#CC3399", "#CC33CC", "#CC33FF", "#CC6600", "#CC6633", "#CC9900", "#CC9933", "#CCCC00", "#CCCC33", "#FF0000", "#FF0033", "#FF0066", "#FF0099", "#FF00CC", "#FF00FF", "#FF3300", "#FF3333", "#FF3366", "#FF3399", "#FF33CC", "#FF33FF", "#FF6600", "#FF6633", "#FF9900", "#FF9933", "#FFCC00", "#FFCC33"]; + function nl() { + return typeof window < "u" && window.process && (window.process.type === "renderer" || window.process.__nwjs) ? true : typeof navigator < "u" && navigator.userAgent && navigator.userAgent.toLowerCase().match(/(edge|trident)\/(\d+)/) ? false : typeof document < "u" && document.documentElement && document.documentElement.style && document.documentElement.style.WebkitAppearance || typeof window < "u" && window.console && (window.console.firebug || window.console.exception && window.console.table) || typeof navigator < "u" && navigator.userAgent && navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/) && parseInt(RegExp.$1, 10) >= 31 || typeof navigator < "u" && navigator.userAgent && navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/); + } + function il(e) { + if (e[0] = (this.useColors ? "%c" : "") + this.namespace + (this.useColors ? " %c" : " ") + e[0] + (this.useColors ? "%c " : " ") + "+" + Zt.exports.humanize(this.diff), !this.useColors) + return; + let t = "color: " + this.color; + e.splice(1, 0, t, "color: inherit"); + let r = 0, n = 0; + e[0].replace(/%[a-zA-Z%]/g, (i) => { + i !== "%%" && (r++, i === "%c" && (n = r)); + }), e.splice(n, 0, t); + } + se.log = console.debug || console.log || (() => { + }); + function ol(e) { + try { + e ? se.storage.setItem("debug", e) : se.storage.removeItem("debug"); + } catch { + } + } + function sl() { + let e; + try { + e = se.storage.getItem("debug"); + } catch { + } + return !e && typeof process < "u" && "env" in process && (e = process.env.DEBUG), e; + } + function al() { + try { + return localStorage; + } catch { + } + } + Zt.exports = en()(se); + var { formatters: ll } = Zt.exports; + ll.j = function(e) { + try { + return JSON.stringify(e); + } catch (t) { + return "[UnexpectedJSONParseError]: " + t.message; + } + }; + }); + var tn = L((md, Ci) => { + "use strict"; + Ci.exports = (e, t = process.argv) => { + let r = e.startsWith("-") ? "" : e.length === 1 ? "-" : "--", n = t.indexOf(r + e), i = t.indexOf("--"); + return n !== -1 && (i === -1 || n < i); + }; + }); + var on = L((fd, Ai) => { + "use strict"; + var ul = require("os"), Mi = require("tty"), ce = tn(), { env: q } = process, Fe; + ce("no-color") || ce("no-colors") || ce("color=false") || ce("color=never") ? Fe = 0 : (ce("color") || ce("colors") || ce("color=true") || ce("color=always")) && (Fe = 1); + "FORCE_COLOR" in q && (q.FORCE_COLOR === "true" ? Fe = 1 : q.FORCE_COLOR === "false" ? Fe = 0 : Fe = q.FORCE_COLOR.length === 0 ? 1 : Math.min(parseInt(q.FORCE_COLOR, 10), 3)); + function rn(e) { + return e === 0 ? false : { level: e, hasBasic: true, has256: e >= 2, has16m: e >= 3 }; + } + function nn(e, t) { + if (Fe === 0) + return 0; + if (ce("color=16m") || ce("color=full") || ce("color=truecolor")) + return 3; + if (ce("color=256")) + return 2; + if (e && !t && Fe === void 0) + return 0; + let r = Fe || 0; + if (q.TERM === "dumb") + return r; + if (process.platform === "win32") { + let n = ul.release().split("."); + return Number(n[0]) >= 10 && Number(n[2]) >= 10586 ? Number(n[2]) >= 14931 ? 3 : 2 : 1; + } + if ("CI" in q) + return ["TRAVIS", "CIRCLECI", "APPVEYOR", "GITLAB_CI", "GITHUB_ACTIONS", "BUILDKITE"].some((n) => n in q) || q.CI_NAME === "codeship" ? 1 : r; + if ("TEAMCITY_VERSION" in q) + return /^(9\.(0*[1-9]\d*)\.|\d{2,}\.)/.test(q.TEAMCITY_VERSION) ? 1 : 0; + if (q.COLORTERM === "truecolor") + return 3; + if ("TERM_PROGRAM" in q) { + let n = parseInt((q.TERM_PROGRAM_VERSION || "").split(".")[0], 10); + switch (q.TERM_PROGRAM) { + case "iTerm.app": + return n >= 3 ? 3 : 2; + case "Apple_Terminal": + return 2; + } + } + return /-256(color)?$/i.test(q.TERM) ? 2 : /^screen|^xterm|^vt100|^vt220|^rxvt|color|ansi|cygwin|linux/i.test(q.TERM) || "COLORTERM" in q ? 1 : r; + } + function cl(e) { + let t = nn(e, e && e.isTTY); + return rn(t); + } + Ai.exports = { supportsColor: cl, stdout: rn(nn(true, Mi.isatty(1))), stderr: rn(nn(true, Mi.isatty(2))) }; + }); + var Ri = L((V, er) => { + var pl = require("tty"), Xt = require("util"); + V.init = xl; + V.log = gl; + V.formatArgs = ml; + V.save = yl; + V.load = hl; + V.useColors = dl; + V.destroy = Xt.deprecate(() => { + }, "Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`."); + V.colors = [6, 2, 3, 4, 5, 1]; + try { + let e = on(); + e && (e.stderr || e).level >= 2 && (V.colors = [20, 21, 26, 27, 32, 33, 38, 39, 40, 41, 42, 43, 44, 45, 56, 57, 62, 63, 68, 69, 74, 75, 76, 77, 78, 79, 80, 81, 92, 93, 98, 99, 112, 113, 128, 129, 134, 135, 148, 149, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 178, 179, 184, 185, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 214, 215, 220, 221]); + } catch { + } + V.inspectOpts = Object.keys(process.env).filter((e) => /^debug_/i.test(e)).reduce((e, t) => { + let r = t.substring(6).toLowerCase().replace(/_([a-z])/g, (i, o) => o.toUpperCase()), n = process.env[t]; + return /^(yes|on|true|enabled)$/i.test(n) ? n = true : /^(no|off|false|disabled)$/i.test(n) ? n = false : n === "null" ? n = null : n = Number(n), e[r] = n, e; + }, {}); + function dl() { + return "colors" in V.inspectOpts ? Boolean(V.inspectOpts.colors) : pl.isatty(process.stderr.fd); + } + function ml(e) { + let { namespace: t, useColors: r } = this; + if (r) { + let n = this.color, i = "\x1B[3" + (n < 8 ? n : "8;5;" + n), o = ` ${i};1m${t} \x1B[0m`; + e[0] = o + e[0].split(` +`).join(` +` + o), e.push(i + "m+" + er.exports.humanize(this.diff) + "\x1B[0m"); + } else + e[0] = fl() + t + " " + e[0]; + } + function fl() { + return V.inspectOpts.hideDate ? "" : (/* @__PURE__ */ new Date()).toISOString() + " "; + } + function gl(...e) { + return process.stderr.write(Xt.format(...e) + ` +`); + } + function yl(e) { + e ? process.env.DEBUG = e : delete process.env.DEBUG; + } + function hl() { + return process.env.DEBUG; + } + function xl(e) { + e.inspectOpts = {}; + let t = Object.keys(V.inspectOpts); + for (let r = 0; r < t.length; r++) + e.inspectOpts[t[r]] = V.inspectOpts[t[r]]; + } + er.exports = en()(V); + var { formatters: Si } = er.exports; + Si.o = function(e) { + return this.inspectOpts.colors = this.useColors, Xt.inspect(e, this.inspectOpts).split(` +`).map((t) => t.trim()).join(" "); + }; + Si.O = function(e) { + return this.inspectOpts.colors = this.useColors, Xt.inspect(e, this.inspectOpts); + }; + }); + var Fi = L((gd, sn) => { + typeof process > "u" || process.type === "renderer" || process.browser === true || process.__nwjs ? sn.exports = vi() : sn.exports = Ri(); + }); + var Bi = L((Gd, dn) => { + "use strict"; + var C = dn.exports; + dn.exports.default = C; + var S = "\x1B[", Pt = "\x1B]", tt = "\x07", or = ";", ji = process.env.TERM_PROGRAM === "Apple_Terminal"; + C.cursorTo = (e, t) => { + if (typeof e != "number") + throw new TypeError("The `x` argument is required"); + return typeof t != "number" ? S + (e + 1) + "G" : S + (t + 1) + ";" + (e + 1) + "H"; + }; + C.cursorMove = (e, t) => { + if (typeof e != "number") + throw new TypeError("The `x` argument is required"); + let r = ""; + return e < 0 ? r += S + -e + "D" : e > 0 && (r += S + e + "C"), t < 0 ? r += S + -t + "A" : t > 0 && (r += S + t + "B"), r; + }; + C.cursorUp = (e = 1) => S + e + "A"; + C.cursorDown = (e = 1) => S + e + "B"; + C.cursorForward = (e = 1) => S + e + "C"; + C.cursorBackward = (e = 1) => S + e + "D"; + C.cursorLeft = S + "G"; + C.cursorSavePosition = ji ? "\x1B7" : S + "s"; + C.cursorRestorePosition = ji ? "\x1B8" : S + "u"; + C.cursorGetPosition = S + "6n"; + C.cursorNextLine = S + "E"; + C.cursorPrevLine = S + "F"; + C.cursorHide = S + "?25l"; + C.cursorShow = S + "?25h"; + C.eraseLines = (e) => { + let t = ""; + for (let r = 0; r < e; r++) + t += C.eraseLine + (r < e - 1 ? C.cursorUp() : ""); + return e && (t += C.cursorLeft), t; + }; + C.eraseEndLine = S + "K"; + C.eraseStartLine = S + "1K"; + C.eraseLine = S + "2K"; + C.eraseDown = S + "J"; + C.eraseUp = S + "1J"; + C.eraseScreen = S + "2J"; + C.scrollUp = S + "S"; + C.scrollDown = S + "T"; + C.clearScreen = "\x1Bc"; + C.clearTerminal = process.platform === "win32" ? `${C.eraseScreen}${S}0f` : `${C.eraseScreen}${S}3J${S}H`; + C.beep = tt; + C.link = (e, t) => [Pt, "8", or, or, t, tt, e, Pt, "8", or, or, tt].join(""); + C.image = (e, t = {}) => { + let r = `${Pt}1337;File=inline=1`; + return t.width && (r += `;width=${t.width}`), t.height && (r += `;height=${t.height}`), t.preserveAspectRatio === false && (r += ";preserveAspectRatio=0"), r + ":" + e.toString("base64") + tt; + }; + C.iTerm = { setCwd: (e = process.cwd()) => `${Pt}50;CurrentDir=${e}${tt}`, annotation: (e, t = {}) => { + let r = `${Pt}1337;`, n = typeof t.x < "u", i = typeof t.y < "u"; + if ((n || i) && !(n && i && typeof t.length < "u")) + throw new Error("`x`, `y` and `length` must be defined when `x` or `y` is defined"); + return e = e.replace(/\|/g, ""), r += t.isHidden ? "AddHiddenAnnotation=" : "AddAnnotation=", t.length > 0 ? r += (n ? [e, t.length, t.x, t.y] : [t.length, e]).join("|") : r += e, r + tt; + } }; + }); + var Ui = L((Wd, Vi) => { + "use strict"; + var vl = on(), rt = tn(); + function Ki(e) { + if (/^\d{3,4}$/.test(e)) { + let r = /(\d{1,2})(\d{2})/.exec(e); + return { major: 0, minor: parseInt(r[1], 10), patch: parseInt(r[2], 10) }; + } + let t = (e || "").split(".").map((r) => parseInt(r, 10)); + return { major: t[0], minor: t[1], patch: t[2] }; + } + function mn(e) { + let { env: t } = process; + if ("FORCE_HYPERLINK" in t) + return !(t.FORCE_HYPERLINK.length > 0 && parseInt(t.FORCE_HYPERLINK, 10) === 0); + if (rt("no-hyperlink") || rt("no-hyperlinks") || rt("hyperlink=false") || rt("hyperlink=never")) + return false; + if (rt("hyperlink=true") || rt("hyperlink=always") || "NETLIFY" in t) + return true; + if (!vl.supportsColor(e) || e && !e.isTTY || process.platform === "win32" || "CI" in t || "TEAMCITY_VERSION" in t) + return false; + if ("TERM_PROGRAM" in t) { + let r = Ki(t.TERM_PROGRAM_VERSION); + switch (t.TERM_PROGRAM) { + case "iTerm.app": + return r.major === 3 ? r.minor >= 1 : r.major > 3; + case "WezTerm": + return r.major >= 20200620; + case "vscode": + return r.major > 1 || r.major === 1 && r.minor >= 72; + } + } + if ("VTE_VERSION" in t) { + if (t.VTE_VERSION === "0.50.0") + return false; + let r = Ki(t.VTE_VERSION); + return r.major > 0 || r.minor >= 50; + } + return false; + } + Vi.exports = { supportsHyperlink: mn, stdout: mn(process.stdout), stderr: mn(process.stderr) }; + }); + var Ji = L((Hd, Et) => { + "use strict"; + var Cl = Bi(), fn = Ui(), Qi = (e, t, { target: r = "stdout", ...n } = {}) => fn[r] ? Cl.link(e, t) : n.fallback === false ? e : typeof n.fallback == "function" ? n.fallback(e, t) : `${e} (\u200B${t}\u200B)`; + Et.exports = (e, t, r = {}) => Qi(e, t, r); + Et.exports.stderr = (e, t, r = {}) => Qi(e, t, { target: "stderr", ...r }); + Et.exports.isSupported = fn.stdout; + Et.exports.stderr.isSupported = fn.stderr; + }); + var ro = L((mm, jl) => { + jl.exports = { name: "dotenv", version: "16.0.3", description: "Loads environment variables from .env file", main: "lib/main.js", types: "lib/main.d.ts", exports: { ".": { require: "./lib/main.js", types: "./lib/main.d.ts", default: "./lib/main.js" }, "./config": "./config.js", "./config.js": "./config.js", "./lib/env-options": "./lib/env-options.js", "./lib/env-options.js": "./lib/env-options.js", "./lib/cli-options": "./lib/cli-options.js", "./lib/cli-options.js": "./lib/cli-options.js", "./package.json": "./package.json" }, scripts: { "dts-check": "tsc --project tests/types/tsconfig.json", lint: "standard", "lint-readme": "standard-markdown", pretest: "npm run lint && npm run dts-check", test: "tap tests/*.js --100 -Rspec", prerelease: "npm test", release: "standard-version" }, repository: { type: "git", url: "git://github.com/motdotla/dotenv.git" }, keywords: ["dotenv", "env", ".env", "environment", "variables", "config", "settings"], readmeFilename: "README.md", license: "BSD-2-Clause", devDependencies: { "@types/node": "^17.0.9", decache: "^4.6.1", dtslint: "^3.7.0", sinon: "^12.0.1", standard: "^16.0.4", "standard-markdown": "^7.1.0", "standard-version": "^9.3.2", tap: "^15.1.6", tar: "^6.1.11", typescript: "^4.5.4" }, engines: { node: ">=12" } }; + }); + var io = L((fm, cr) => { + var Bl = require("fs"), no = require("path"), Kl = require("os"), Vl = ro(), Ul = Vl.version, Ql = /(?:^|^)\s*(?:export\s+)?([\w.-]+)(?:\s*=\s*?|:\s+?)(\s*'(?:\\'|[^'])*'|\s*"(?:\\"|[^"])*"|\s*`(?:\\`|[^`])*`|[^#\r\n]+)?\s*(?:#.*)?(?:$|$)/mg; + function Jl(e) { + let t = {}, r = e.toString(); + r = r.replace(/\r\n?/mg, ` +`); + let n; + for (; (n = Ql.exec(r)) != null; ) { + let i = n[1], o = n[2] || ""; + o = o.trim(); + let s = o[0]; + o = o.replace(/^(['"`])([\s\S]*)\1$/mg, "$2"), s === '"' && (o = o.replace(/\\n/g, ` +`), o = o.replace(/\\r/g, "\r")), t[i] = o; + } + return t; + } + function xn(e) { + console.log(`[dotenv@${Ul}][DEBUG] ${e}`); + } + function Gl(e) { + return e[0] === "~" ? no.join(Kl.homedir(), e.slice(1)) : e; + } + function Wl(e) { + let t = no.resolve(process.cwd(), ".env"), r = "utf8", n = Boolean(e && e.debug), i = Boolean(e && e.override); + e && (e.path != null && (t = Gl(e.path)), e.encoding != null && (r = e.encoding)); + try { + let o = ur.parse(Bl.readFileSync(t, { encoding: r })); + return Object.keys(o).forEach(function(s) { + Object.prototype.hasOwnProperty.call(process.env, s) ? (i === true && (process.env[s] = o[s]), n && xn(i === true ? `"${s}" is already defined in \`process.env\` and WAS overwritten` : `"${s}" is already defined in \`process.env\` and was NOT overwritten`)) : process.env[s] = o[s]; + }), { parsed: o }; + } catch (o) { + return n && xn(`Failed to load ${t} ${o.message}`), { error: o }; + } + } + var ur = { config: Wl, parse: Jl }; + cr.exports.config = ur.config; + cr.exports.parse = ur.parse; + cr.exports = ur; + }); + var co = L((Pm, uo) => { + "use strict"; + uo.exports = (e) => { + let t = e.match(/^[ \t]*(?=\S)/gm); + return t ? t.reduce((r, n) => Math.min(r, n.length), 1 / 0) : 0; + }; + }); + var mo = L((Em, po) => { + "use strict"; + var Zl = co(); + po.exports = (e) => { + let t = Zl(e); + if (t === 0) + return e; + let r = new RegExp(`^[ \\t]{${t}}`, "gm"); + return e.replace(r, ""); + }; + }); + var fo = L((Tm, Xl) => { + Xl.exports = { name: "@prisma/engines-version", version: "5.1.0-28.a9b7003df90aa623086e4d6f4e43c72468e6339b", main: "index.js", types: "index.d.ts", license: "Apache-2.0", author: "Tim Suchanek ", prisma: { enginesVersion: "a9b7003df90aa623086e4d6f4e43c72468e6339b" }, repository: { type: "git", url: "https://github.com/prisma/engines-wrapper.git", directory: "packages/engines-version" }, devDependencies: { "@types/node": "18.17.1", typescript: "4.9.5" }, files: ["index.js", "index.d.ts"], scripts: { build: "tsc -d" } }; + }); + var En = L((dr) => { + "use strict"; + Object.defineProperty(dr, "__esModule", { value: true }); + dr.enginesVersion = void 0; + dr.enginesVersion = fo().prisma.enginesVersion; + }); + var An = L((Nm, ho) => { + "use strict"; + ho.exports = (e, t = 1, r) => { + if (r = { indent: " ", includeEmptyLines: false, ...r }, typeof e != "string") + throw new TypeError(`Expected \`input\` to be a \`string\`, got \`${typeof e}\``); + if (typeof t != "number") + throw new TypeError(`Expected \`count\` to be a \`number\`, got \`${typeof t}\``); + if (typeof r.indent != "string") + throw new TypeError(`Expected \`options.indent\` to be a \`string\`, got \`${typeof r.indent}\``); + if (t === 0) + return e; + let n = r.includeEmptyLines ? /^/gm : /^(?!\s*$)/gm; + return e.replace(n, r.indent.repeat(t)); + }; + }); + var Po = L((qm, wo) => { + "use strict"; + wo.exports = ({ onlyFirst: e = false } = {}) => { + let t = ["[\\u001B\\u009B][[\\]()#;?]*(?:(?:(?:(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]+)*|[a-zA-Z\\d]+(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]*)*)?\\u0007)", "(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PR-TZcf-ntqry=><~]))"].join("|"); + return new RegExp(t, e ? void 0 : "g"); + }; + }); + var On = L((jm, Eo) => { + "use strict"; + var uu = Po(); + Eo.exports = (e) => typeof e == "string" ? e.replace(uu(), "") : e; + }); + var To = L((Km, mr) => { + "use strict"; + mr.exports = (e = {}) => { + let t; + if (e.repoUrl) + t = e.repoUrl; + else if (e.user && e.repo) + t = `https://github.com/${e.user}/${e.repo}`; + else + throw new Error("You need to specify either the `repoUrl` option or both the `user` and `repo` options"); + let r = new URL(`${t}/issues/new`), n = ["body", "title", "labels", "template", "milestone", "assignee", "projects"]; + for (let i of n) { + let o = e[i]; + if (o !== void 0) { + if (i === "labels" || i === "projects") { + if (!Array.isArray(o)) + throw new TypeError(`The \`${i}\` option should be an array`); + o = o.join(","); + } + r.searchParams.set(i, o); + } + } + return r.toString(); + }; + mr.exports.default = mr.exports; + }); + var ni = L((jx, Hs) => { + "use strict"; + Hs.exports = function() { + function e(t, r, n, i, o) { + return t < r || n < r ? t > n ? n + 1 : t + 1 : i === o ? r : r + 1; + } + return function(t, r) { + if (t === r) + return 0; + if (t.length > r.length) { + var n = t; + t = r, r = n; + } + for (var i = t.length, o = r.length; i > 0 && t.charCodeAt(i - 1) === r.charCodeAt(o - 1); ) + i--, o--; + for (var s = 0; s < i && t.charCodeAt(s) === r.charCodeAt(s); ) + s++; + if (i -= s, o -= s, i === 0 || o < 3) + return o; + var a = 0, l, u, c, p, d, g, y, f, b, E, v, x, M = []; + for (l = 0; l < i; l++) + M.push(l + 1), M.push(t.charCodeAt(s + l)); + for (var le = M.length - 1; a < o - 3; ) + for (b = r.charCodeAt(s + (u = a)), E = r.charCodeAt(s + (c = a + 1)), v = r.charCodeAt(s + (p = a + 2)), x = r.charCodeAt(s + (d = a + 3)), g = a += 4, l = 0; l < le; l += 2) + y = M[l], f = M[l + 1], u = e(y, u, c, b, f), c = e(u, c, p, E, f), p = e(c, p, d, v, f), g = e(p, d, g, x, f), M[l] = g, d = p, p = c, c = u, u = y; + for (; a < o; ) + for (b = r.charCodeAt(s + (u = a)), g = ++a, l = 0; l < le; l += 2) + y = M[l], M[l] = g = e(y, u, g, b, M[l + 1]), u = y; + return g; + }; + }(); + }); + var Yp = {}; + xt(Yp, { DMMF: () => ue, DMMFClass: () => bt, Debug: () => an, Decimal: () => we, Extensions: () => Yr, MetricsClient: () => st, NotFoundError: () => Ce, PrismaClientInitializationError: () => _, PrismaClientKnownRequestError: () => H, PrismaClientRustPanicError: () => ae, PrismaClientUnknownRequestError: () => z, PrismaClientValidationError: () => te, Public: () => Zr, Sql: () => U, Types: () => Xr, defineDmmfProperty: () => Co, empty: () => Ao, getPrismaClient: () => Ka, join: () => Mo, makeStrictEnum: () => Va, objectEnumValues: () => Pr, raw: () => Ln, sqltag: () => $n, warnEnvConflicts: () => Ua, warnOnce: () => In }); + module.exports = za(Yp); + var Yr = {}; + xt(Yr, { defineExtension: () => di, getExtensionContext: () => mi }); + function di(e) { + return typeof e == "function" ? e : (t) => t.$extends(e); + } + function mi(e) { + return e; + } + var Zr = {}; + xt(Zr, { validator: () => fi }); + function fi(...e) { + return (t) => t; + } + var Xr = {}; + xt(Xr, { Extensions: () => gi, Public: () => yi, Result: () => hi, Utils: () => xi }); + var gi = {}; + var yi = {}; + var hi = {}; + var xi = {}; + function bi(e, t) { + for (let r of t) + for (let n of Object.getOwnPropertyNames(r.prototype)) + Object.defineProperty(e.prototype, n, Object.getOwnPropertyDescriptor(r.prototype, n) ?? /* @__PURE__ */ Object.create(null)); + } + var Z = (e, t) => { + let r = {}; + for (let n of e) { + let i = n[t]; + r[i] = n; + } + return r; + }; + function wi(e) { + return e.substring(0, 1).toLowerCase() + e.substring(1); + } + var Wt = class { + constructor({ datamodel: t }) { + this.datamodel = t, this.datamodelEnumMap = this.getDatamodelEnumMap(), this.modelMap = this.getModelMap(), this.typeMap = this.getTypeMap(), this.typeAndModelMap = this.getTypeModelMap(); + } + getDatamodelEnumMap() { + return Z(this.datamodel.enums, "name"); + } + getModelMap() { + return { ...Z(this.datamodel.models, "name") }; + } + getTypeMap() { + return { ...Z(this.datamodel.types, "name") }; + } + getTypeModelMap() { + return { ...this.getTypeMap(), ...this.getModelMap() }; + } + }; + var Ht = class { + constructor({ mappings: t }) { + this.mappings = t, this.mappingsMap = this.getMappingsMap(); + } + getMappingsMap() { + return Z(this.mappings.modelOperations, "model"); + } + getOtherOperationNames() { + return [Object.values(this.mappings.otherOperations.write), Object.values(this.mappings.otherOperations.read)].flat(); + } + }; + var zt = class { + constructor({ schema: t }) { + this.outputTypeToMergedOutputType = (t2) => ({ ...t2, fields: t2.fields }); + this.schema = t, this.enumMap = this.getEnumMap(), this.outputTypes = this.getOutputTypes(), this.outputTypeMap = this.getMergedOutputTypeMap(), this.resolveOutputTypes(), this.inputObjectTypes = this.schema.inputObjectTypes, this.inputTypeMap = this.getInputTypeMap(), this.resolveInputTypes(), this.resolveFieldArgumentTypes(), this.queryType = this.outputTypeMap.prisma.Query, this.mutationType = this.outputTypeMap.prisma.Mutation, this.rootFieldMap = this.getRootFieldMap(); + } + get [Symbol.toStringTag]() { + return "DMMFClass"; + } + resolveOutputTypes() { + this.resolveOutputTypesInNamespace("prisma"), this.resolveOutputTypesInNamespace("model"); + } + resolveOutputTypesInNamespace(t) { + for (let r of this.outputTypes[t]) { + for (let n of r.fields) { + if (typeof n.outputType.type != "string" || n.outputType.location === "scalar") + continue; + let i = n.outputType.namespace ?? "model"; + n.outputType.location === "outputObjectTypes" ? n.outputType.type = this.outputTypeMap[i][n.outputType.type] : n.outputType.location === "enumTypes" && (n.outputType.type = this.enumMap[i][n.outputType.type]); + } + r.fieldMap = Z(r.fields, "name"); + } + } + resolveInputTypes() { + this.resolveNamespaceInputTypes("model"), this.resolveNamespaceInputTypes("prisma"); + } + resolveNamespaceInputTypes(t) { + let r = this.inputObjectTypes[t] ?? []; + for (let n of r) { + for (let i of n.fields) + for (let o of i.inputTypes) { + if (typeof o.type != "string") + continue; + let s = o.type; + if (o.location === "scalar") + continue; + let a = o.namespace ?? "model"; + o.location === "inputObjectTypes" && (o.type = this.inputTypeMap[a][s]), o.location === "enumTypes" && (o.type = this.enumMap[a][s]); + } + n.fieldMap = Z(n.fields, "name"); + } + } + resolveFieldArgumentTypes() { + this.resolveFieldArgumentTypesInNamespace("model"), this.resolveFieldArgumentTypesInNamespace("prisma"); + } + resolveFieldArgumentTypesInNamespace(t) { + let r = this.outputTypes[t] ?? []; + for (let n of r) + for (let i of n.fields) + for (let o of i.args) + for (let s of o.inputTypes) { + let a = s.type; + if (typeof a != "string" || s.location === "scalar") + continue; + let l = s.namespace ?? "model"; + s.location === "inputObjectTypes" && (s.type = this.inputTypeMap[l][a]), s.location === "enumTypes" && (s.type = this.enumMap[l][a]); + } + } + getOutputTypes() { + return { model: this.schema.outputObjectTypes.model.map(this.outputTypeToMergedOutputType), prisma: this.schema.outputObjectTypes.prisma.map(this.outputTypeToMergedOutputType) }; + } + getEnumMap() { + return { prisma: Z(this.schema.enumTypes.prisma, "name"), model: this.schema.enumTypes.model ? Z(this.schema.enumTypes.model, "name") : {} }; + } + hasEnumInNamespace(t, r) { + return this.schema.enumTypes[r]?.find((n) => n.name === t) !== void 0; + } + getMergedOutputTypeMap() { + return { model: Z(this.outputTypes.model, "name"), prisma: Z(this.outputTypes.prisma, "name") }; + } + getInputTypeMap() { + return { prisma: Z(this.schema.inputObjectTypes.prisma, "name"), model: this.schema.inputObjectTypes.model ? Z(this.schema.inputObjectTypes.model, "name") : {} }; + } + getRootFieldMap() { + return { ...Z(this.queryType.fields, "name"), ...Z(this.mutationType.fields, "name") }; + } + }; + var bt = class { + constructor(t) { + return Object.assign(this, new Wt(t), new Ht(t), new zt(t)); + } + }; + bi(bt, [Wt, Ht, zt]); + var ue; + ((t) => { + let e; + ((x) => (x.findUnique = "findUnique", x.findUniqueOrThrow = "findUniqueOrThrow", x.findFirst = "findFirst", x.findFirstOrThrow = "findFirstOrThrow", x.findMany = "findMany", x.create = "create", x.createMany = "createMany", x.update = "update", x.updateMany = "updateMany", x.upsert = "upsert", x.delete = "delete", x.deleteMany = "deleteMany", x.groupBy = "groupBy", x.count = "count", x.aggregate = "aggregate", x.findRaw = "findRaw", x.aggregateRaw = "aggregateRaw"))(e = t.ModelAction || (t.ModelAction = {})); + })(ue || (ue = {})); + var tr = A(Fi()); + var bl = 100; + var wt = []; + typeof process < "u" && typeof process.stderr?.write != "function" && (tr.default.log = console.debug ?? console.log); + function wl(e) { + let t = (0, tr.default)(e), r = Object.assign((...n) => (t.log = r.log, n.length !== 0 && wt.push([e, ...n]), wt.length > bl && wt.shift(), t("", ...n)), t); + return r; + } + var an = Object.assign(wl, tr.default); + function Oi(e = 7500) { + let t = wt.map((r) => r.map((n) => typeof n == "string" ? n : JSON.stringify(n)).join(" ")).join(` +`); + return t.length < e ? t : t.slice(-e); + } + function ki() { + wt.length = 0; + } + var N = an; + var ln; + var Di; + var _i; + var Ii; + var Ni = true; + typeof process < "u" && ({ FORCE_COLOR: ln, NODE_DISABLE_COLORS: Di, NO_COLOR: _i, TERM: Ii } = process.env || {}, Ni = process.stdout && process.stdout.isTTY); + var Pl = { enabled: !Di && _i == null && Ii !== "dumb" && (ln != null && ln !== "0" || Ni) }; + function O(e, t) { + let r = new RegExp(`\\x1b\\[${t}m`, "g"), n = `\x1B[${e}m`, i = `\x1B[${t}m`; + return function(o) { + return !Pl.enabled || o == null ? o : n + (~("" + o).indexOf(i) ? o.replace(r, i + n) : o) + i; + }; + } + var hd = O(0, 0); + var ne = O(1, 22); + var Oe = O(2, 22); + var xd = O(3, 23); + var X = O(4, 24); + var bd = O(7, 27); + var wd = O(8, 28); + var Pd = O(9, 29); + var Ed = O(30, 39); + var pe = O(31, 39); + var Ue = O(32, 39); + var ye = O(33, 39); + var Xe = O(34, 39); + var Td = O(35, 39); + var ke = O(36, 39); + var vd = O(37, 39); + var rr = O(90, 39); + var Cd = O(90, 39); + var Md = O(40, 49); + var Ad = O(41, 49); + var Sd = O(42, 49); + var Rd = O(43, 49); + var Fd = O(44, 49); + var Od = O(45, 49); + var kd = O(46, 49); + var Dd = O(47, 49); + var Li = A(require("fs")); + function un() { + let e = process.env.PRISMA_QUERY_ENGINE_LIBRARY; + if (!(e && Li.default.existsSync(e)) && process.arch === "ia32") + throw new Error('The default query engine type (Node-API, "library") is currently not supported for 32bit Node. Please set `engineType = "binary"` in the "generator" block of your "schema.prisma" file (or use the environment variables "PRISMA_CLIENT_ENGINE_TYPE=binary" and/or "PRISMA_CLI_QUERY_ENGINE_TYPE=binary".)'); + } + var nr = "libquery_engine"; + function cn(e, t) { + let r = t === "url"; + return e.includes("windows") ? r ? "query_engine.dll.node" : `query_engine-${e}.dll.node` : e.includes("darwin") ? r ? `${nr}.dylib.node` : `${nr}-${e}.dylib.node` : r ? `${nr}.so.node` : `${nr}-${e}.so.node`; + } + var zi = A(require("child_process")); + var gn = A(require("fs/promises")); + var ar = A(require("os")); + var ir = Symbol("@ts-pattern/matcher"); + var $i = "@ts-pattern/anonymous-select-key"; + var qi = function(e) { + return Boolean(e && typeof e == "object"); + }; + var pn = function(e) { + return e && !!e[ir]; + }; + var El = function e(t, r, n) { + if (qi(t)) { + if (pn(t)) { + var i = t[ir]().match(r), o = i.matched, s = i.selections; + return o && s && Object.keys(s).forEach(function(l) { + return n(l, s[l]); + }), o; + } + if (!qi(r)) + return false; + if (Array.isArray(t)) + return !!Array.isArray(r) && t.length === r.length && t.every(function(l, u) { + return e(l, r[u], n); + }); + if (t instanceof Map) + return r instanceof Map && Array.from(t.keys()).every(function(l) { + return e(t.get(l), r.get(l), n); + }); + if (t instanceof Set) { + if (!(r instanceof Set)) + return false; + if (t.size === 0) + return r.size === 0; + if (t.size === 1) { + var a = Array.from(t.values())[0]; + return pn(a) ? Array.from(r.values()).every(function(l) { + return e(a, l, n); + }) : r.has(a); + } + return Array.from(t.values()).every(function(l) { + return r.has(l); + }); + } + return Object.keys(t).every(function(l) { + var u, c = t[l]; + return (l in r || pn(u = c) && u[ir]().matcherType === "optional") && e(c, r[l], n); + }); + } + return Object.is(r, t); + }; + function Qe(e) { + var t; + return (t = {})[ir] = function() { + return { match: function(r) { + return { matched: Boolean(e(r)) }; + } }; + }, t; + } + var qd = Qe(function(e) { + return true; + }); + var jd = Qe(function(e) { + return typeof e == "string"; + }); + var Bd = Qe(function(e) { + return typeof e == "number"; + }); + var Kd = Qe(function(e) { + return typeof e == "boolean"; + }); + var Vd = Qe(function(e) { + return typeof e == "bigint"; + }); + var Ud = Qe(function(e) { + return typeof e == "symbol"; + }); + var Qd = Qe(function(e) { + return e == null; + }); + function et(e) { + return new Tl(e, []); + } + var Tl = function() { + function e(r, n) { + this.value = void 0, this.cases = void 0, this.value = r, this.cases = n; + } + var t = e.prototype; + return t.with = function() { + var r = [].slice.call(arguments), n = r[r.length - 1], i = [r[0]], o = []; + return r.length === 3 && typeof r[1] == "function" ? (i.push(r[0]), o.push(r[1])) : r.length > 2 && i.push.apply(i, r.slice(1, r.length - 1)), new e(this.value, this.cases.concat([{ match: function(s) { + var a = {}, l = Boolean(i.some(function(u) { + return El(u, s, function(c, p) { + a[c] = p; + }); + }) && o.every(function(u) { + return u(s); + })); + return { matched: l, value: l && Object.keys(a).length ? $i in a ? a[$i] : a : s }; + }, handler: n }])); + }, t.when = function(r, n) { + return new e(this.value, this.cases.concat([{ match: function(i) { + return { matched: Boolean(r(i)), value: i }; + }, handler: n }])); + }, t.otherwise = function(r) { + return new e(this.value, this.cases.concat([{ match: function(n) { + return { matched: true, value: n }; + }, handler: r }])).run(); + }, t.exhaustive = function() { + return this.run(); + }, t.run = function() { + for (var r = this.value, n = void 0, i = 0; i < this.cases.length; i++) { + var o = this.cases[i], s = o.match(this.value); + if (s.matched) { + r = s.value, n = o.handler; + break; + } + } + if (!n) { + var a; + try { + a = JSON.stringify(this.value); + } catch { + a = this.value; + } + throw new Error("Pattern matching error: no pattern matches value " + a); + } + return n(r, this.value); + }, e; + }(); + var Yi = require("util"); + var Gi = A(Ji()); + function Tt(e) { + return (0, Gi.default)(e, e, { fallback: X }); + } + var Ml = { warn: ye("prisma:warn") }; + var Al = { warn: () => !process.env.PRISMA_DISABLE_WARNINGS }; + function vt(e, ...t) { + Al.warn() && console.warn(`${Ml.warn} ${e}`, ...t); + } + var Sl = (0, Yi.promisify)(zi.default.exec); + var ie = N("prisma:get-platform"); + var Rl = ["1.0.x", "1.1.x", "3.0.x"]; + async function Zi() { + let e = ar.default.platform(), t = process.arch; + if (e === "freebsd") { + let s = await lr("freebsd-version"); + if (s && s.trim().length > 0) { + let l = /^(\d+)\.?/.exec(s); + if (l) + return { platform: "freebsd", targetDistro: `freebsd${l[1]}`, arch: t }; + } + } + if (e !== "linux") + return { platform: e, arch: t }; + let r = await Ol(), n = await ql(), i = Dl({ arch: t, archFromUname: n, familyDistro: r.familyDistro }), { libssl: o } = await _l(i); + return { platform: "linux", libssl: o, arch: t, archFromUname: n, ...r }; + } + function Fl(e) { + let t = /^ID="?([^"\n]*)"?$/im, r = /^ID_LIKE="?([^"\n]*)"?$/im, n = t.exec(e), i = n && n[1] && n[1].toLowerCase() || "", o = r.exec(e), s = o && o[1] && o[1].toLowerCase() || "", a = et({ id: i, idLike: s }).with({ id: "alpine" }, ({ id: l }) => ({ targetDistro: "musl", familyDistro: l, originalDistro: l })).with({ id: "raspbian" }, ({ id: l }) => ({ targetDistro: "arm", familyDistro: "debian", originalDistro: l })).with({ id: "nixos" }, ({ id: l }) => ({ targetDistro: "nixos", originalDistro: l, familyDistro: "nixos" })).with({ id: "debian" }, { id: "ubuntu" }, ({ id: l }) => ({ targetDistro: "debian", familyDistro: "debian", originalDistro: l })).with({ id: "rhel" }, { id: "centos" }, { id: "fedora" }, ({ id: l }) => ({ targetDistro: "rhel", familyDistro: "rhel", originalDistro: l })).when(({ idLike: l }) => l.includes("debian") || l.includes("ubuntu"), ({ id: l }) => ({ targetDistro: "debian", familyDistro: "debian", originalDistro: l })).when(({ idLike: l }) => i === "arch" || l.includes("arch"), ({ id: l }) => ({ targetDistro: "debian", familyDistro: "arch", originalDistro: l })).when(({ idLike: l }) => l.includes("centos") || l.includes("fedora") || l.includes("rhel") || l.includes("suse"), ({ id: l }) => ({ targetDistro: "rhel", familyDistro: "rhel", originalDistro: l })).otherwise(({ id: l }) => ({ targetDistro: void 0, familyDistro: void 0, originalDistro: l })); + return ie(`Found distro info: +${JSON.stringify(a, null, 2)}`), a; + } + async function Ol() { + let e = "/etc/os-release"; + try { + let t = await gn.default.readFile(e, { encoding: "utf-8" }); + return Fl(t); + } catch { + return { targetDistro: void 0, familyDistro: void 0, originalDistro: void 0 }; + } + } + function kl(e) { + let t = /^OpenSSL\s(\d+\.\d+)\.\d+/.exec(e); + if (t) { + let r = `${t[1]}.x`; + return Xi(r); + } + } + function Wi(e) { + let t = /libssl\.so\.(\d)(\.\d)?/.exec(e); + if (t) { + let r = `${t[1]}${t[2] ?? ".0"}.x`; + return Xi(r); + } + } + function Xi(e) { + let t = (() => { + if (to(e)) + return e; + let r = e.split("."); + return r[1] = "0", r.join("."); + })(); + if (Rl.includes(t)) + return t; + } + function Dl(e) { + return et(e).with({ familyDistro: "musl" }, () => (ie('Trying platform-specific paths for "alpine"'), ["/lib"])).with({ familyDistro: "debian" }, ({ archFromUname: t }) => (ie('Trying platform-specific paths for "debian" (and "ubuntu")'), [`/usr/lib/${t}-linux-gnu`, `/lib/${t}-linux-gnu`])).with({ familyDistro: "rhel" }, () => (ie('Trying platform-specific paths for "rhel"'), ["/lib64", "/usr/lib64"])).otherwise(({ familyDistro: t, arch: r, archFromUname: n }) => (ie(`Don't know any platform-specific paths for "${t}" on ${r} (${n})`), [])); + } + async function _l(e) { + let t = 'grep -v "libssl.so.0"', r = await Hi(e); + if (r) { + ie(`Found libssl.so file using platform-specific paths: ${r}`); + let o = Wi(r); + if (ie(`The parsed libssl version is: ${o}`), o) + return { libssl: o, strategy: "libssl-specific-path" }; + } + ie('Falling back to "ldconfig" and other generic paths'); + let n = await lr(`ldconfig -p | sed "s/.*=>s*//" | sed "s|.*/||" | grep libssl | sort | ${t}`); + if (n || (n = await Hi(["/lib64", "/usr/lib64", "/lib"])), n) { + ie(`Found libssl.so file using "ldconfig" or other generic paths: ${n}`); + let o = Wi(n); + if (ie(`The parsed libssl version is: ${o}`), o) + return { libssl: o, strategy: "ldconfig" }; + } + let i = await lr("openssl version -v"); + if (i) { + ie(`Found openssl binary with version: ${i}`); + let o = kl(i); + if (ie(`The parsed openssl version is: ${o}`), o) + return { libssl: o, strategy: "openssl-binary" }; + } + return ie("Couldn't find any version of libssl or OpenSSL in the system"), {}; + } + async function Hi(e) { + for (let t of e) { + let r = await Il(t); + if (r) + return r; + } + } + async function Il(e) { + try { + return (await gn.default.readdir(e)).find((r) => r.startsWith("libssl.so.") && !r.startsWith("libssl.so.0")); + } catch (t) { + if (t.code === "ENOENT") + return; + throw t; + } + } + async function nt() { + let { binaryTarget: e } = await eo(); + return e; + } + function Nl(e) { + return e.binaryTarget !== void 0; + } + async function yn() { + let { memoized: e, ...t } = await eo(); + return t; + } + var sr = {}; + async function eo() { + if (Nl(sr)) + return Promise.resolve({ ...sr, memoized: true }); + let e = await Zi(), t = Ll(e); + return sr = { ...e, binaryTarget: t }, { ...sr, memoized: false }; + } + function Ll(e) { + let { platform: t, arch: r, archFromUname: n, libssl: i, targetDistro: o, familyDistro: s, originalDistro: a } = e; + t === "linux" && !["x64", "arm64"].includes(r) && vt(`Prisma only officially supports Linux on amd64 (x86_64) and arm64 (aarch64) system architectures. If you are using your own custom Prisma engines, you can ignore this warning, as long as you've compiled the engines for your system architecture "${n}".`); + let l = "1.1.x"; + if (t === "linux" && i === void 0) { + let c = et({ familyDistro: s }).with({ familyDistro: "debian" }, () => "Please manually install OpenSSL via `apt-get update -y && apt-get install -y openssl` and try installing Prisma again. If you're running Prisma on Docker, add this command to your Dockerfile, or switch to an image that already has OpenSSL installed.").otherwise(() => "Please manually install OpenSSL and try installing Prisma again."); + vt(`Prisma failed to detect the libssl/openssl version to use, and may not work as expected. Defaulting to "openssl-${l}". +${c}`); + } + let u = "debian"; + if (t === "linux" && o === void 0 && vt(`Prisma doesn't know which engines to download for the Linux distro "${a}". Falling back to Prisma engines built "${u}". +Please report your experience by creating an issue at ${Tt("https://github.com/prisma/prisma/issues")} so we can add your distro to the list of known supported distros.`), t === "darwin" && r === "arm64") + return "darwin-arm64"; + if (t === "darwin") + return "darwin"; + if (t === "win32") + return "windows"; + if (t === "freebsd") + return o; + if (t === "openbsd") + return "openbsd"; + if (t === "netbsd") + return "netbsd"; + if (t === "linux" && o === "nixos") + return "linux-nixos"; + if (t === "linux" && r === "arm64") + return `${o === "musl" ? "linux-musl-arm64" : "linux-arm64"}-openssl-${i || l}`; + if (t === "linux" && r === "arm") + return `linux-arm-openssl-${i || l}`; + if (t === "linux" && o === "musl") { + let c = "linux-musl"; + return !i || to(i) ? c : `${c}-openssl-${i}`; + } + return t === "linux" && o && i ? `${o}-openssl-${i}` : (t !== "linux" && vt(`Prisma detected unknown OS "${t}" and may not work as expected. Defaulting to "linux".`), i ? `${u}-openssl-${i}` : o ? `${o}-openssl-${l}` : `${u}-openssl-${l}`); + } + async function $l(e) { + try { + return await e(); + } catch { + return; + } + } + function lr(e) { + return $l(async () => { + let t = await Sl(e); + return ie(`Command "${e}" successfully returned "${t.stdout}"`), t.stdout; + }); + } + async function ql() { + return typeof ar.default.machine == "function" ? ar.default.machine() : (await lr("uname -m"))?.trim(); + } + function to(e) { + return e.startsWith("1."); + } + var hn = ["darwin", "darwin-arm64", "debian-openssl-1.0.x", "debian-openssl-1.1.x", "debian-openssl-3.0.x", "rhel-openssl-1.0.x", "rhel-openssl-1.1.x", "rhel-openssl-3.0.x", "linux-arm64-openssl-1.1.x", "linux-arm64-openssl-1.0.x", "linux-arm64-openssl-3.0.x", "linux-arm-openssl-1.1.x", "linux-arm-openssl-1.0.x", "linux-arm-openssl-3.0.x", "linux-musl", "linux-musl-openssl-3.0.x", "linux-musl-arm64-openssl-1.1.x", "linux-musl-arm64-openssl-3.0.x", "linux-nixos", "linux-static-x64", "linux-static-arm64", "windows", "freebsd11", "freebsd12", "freebsd13", "openbsd", "netbsd", "arm"]; + var wn = A(io()); + var pr = A(require("fs")); + var it = A(require("path")); + function oo(e) { + let t = e.ignoreProcessEnv ? {} : process.env, r = (n) => n.match(/(.?\${(?:[a-zA-Z0-9_]+)?})/g)?.reduce(function(o, s) { + let a = /(.?)\${([a-zA-Z0-9_]+)?}/g.exec(s); + if (!a) + return o; + let l = a[1], u, c; + if (l === "\\") + c = a[0], u = c.replace("\\$", "$"); + else { + let p = a[2]; + c = a[0].substring(l.length), u = Object.hasOwnProperty.call(t, p) ? t[p] : e.parsed[p] || "", u = r(u); + } + return o.replace(c, u); + }, n) ?? n; + for (let n in e.parsed) { + let i = Object.hasOwnProperty.call(t, n) ? t[n] : e.parsed[n]; + e.parsed[n] = r(i); + } + for (let n in e.parsed) + t[n] = e.parsed[n]; + return e; + } + var bn = N("prisma:tryLoadEnv"); + function Ct({ rootEnvPath: e, schemaEnvPath: t }, r = { conflictCheck: "none" }) { + let n = so(e); + r.conflictCheck !== "none" && Hl(n, t, r.conflictCheck); + let i = null; + return ao(n?.path, t) || (i = so(t)), !n && !i && bn("No Environment variables loaded"), i?.dotenvResult.error ? console.error(pe(ne("Schema Env Error: ")) + i.dotenvResult.error) : { message: [n?.message, i?.message].filter(Boolean).join(` +`), parsed: { ...n?.dotenvResult?.parsed, ...i?.dotenvResult?.parsed } }; + } + function Hl(e, t, r) { + let n = e?.dotenvResult.parsed, i = !ao(e?.path, t); + if (n && t && i && pr.default.existsSync(t)) { + let o = wn.default.parse(pr.default.readFileSync(t)), s = []; + for (let a in o) + n[a] === o[a] && s.push(a); + if (s.length > 0) { + let a = it.default.relative(process.cwd(), e.path), l = it.default.relative(process.cwd(), t); + if (r === "error") { + let u = `There is a conflict between env var${s.length > 1 ? "s" : ""} in ${X(a)} and ${X(l)} +Conflicting env vars: +${s.map((c) => ` ${ne(c)}`).join(` +`)} + +We suggest to move the contents of ${X(l)} to ${X(a)} to consolidate your env vars. +`; + throw new Error(u); + } else if (r === "warn") { + let u = `Conflict for env var${s.length > 1 ? "s" : ""} ${s.map((c) => ne(c)).join(", ")} in ${X(a)} and ${X(l)} +Env vars from ${X(l)} overwrite the ones from ${X(a)} + `; + console.warn(`${ye("warn(prisma)")} ${u}`); + } + } + } + } + function so(e) { + return zl(e) ? (bn(`Environment variables loaded from ${e}`), { dotenvResult: oo(wn.default.config({ path: e, debug: process.env.DOTENV_CONFIG_DEBUG ? true : void 0 })), message: Oe(`Environment variables loaded from ${it.default.relative(process.cwd(), e)}`), path: e }) : (bn(`Environment variables not found at ${e}`), null); + } + function ao(e, t) { + return e && t && it.default.resolve(e) === it.default.resolve(t); + } + function zl(e) { + return Boolean(e && pr.default.existsSync(e)); + } + var lo = "library"; + function Pn(e) { + let t = Yl(); + return t || (e?.config.engineType === "library" ? "library" : e?.config.engineType === "binary" ? "binary" : lo); + } + function Yl() { + let e = process.env.PRISMA_CLIENT_ENGINE_TYPE; + return e === "library" ? "library" : e === "binary" ? "binary" : void 0; + } + var eu = A(En()); + var k = A(require("path")); + var tu = A(En()); + var Mm = N("prisma:engines"); + function go() { + return k.default.join(__dirname, "../"); + } + var Am = "libquery-engine"; + k.default.join(__dirname, "../query-engine-darwin"); + k.default.join(__dirname, "../query-engine-darwin-arm64"); + k.default.join(__dirname, "../query-engine-debian-openssl-1.0.x"); + k.default.join(__dirname, "../query-engine-debian-openssl-1.1.x"); + k.default.join(__dirname, "../query-engine-debian-openssl-3.0.x"); + k.default.join(__dirname, "../query-engine-linux-static-x64"); + k.default.join(__dirname, "../query-engine-linux-static-arm64"); + k.default.join(__dirname, "../query-engine-rhel-openssl-1.0.x"); + k.default.join(__dirname, "../query-engine-rhel-openssl-1.1.x"); + k.default.join(__dirname, "../query-engine-rhel-openssl-3.0.x"); + k.default.join(__dirname, "../libquery_engine-darwin.dylib.node"); + k.default.join(__dirname, "../libquery_engine-darwin-arm64.dylib.node"); + k.default.join(__dirname, "../libquery_engine-debian-openssl-1.0.x.so.node"); + k.default.join(__dirname, "../libquery_engine-debian-openssl-1.1.x.so.node"); + k.default.join(__dirname, "../libquery_engine-debian-openssl-3.0.x.so.node"); + k.default.join(__dirname, "../libquery_engine-linux-arm64-openssl-1.0.x.so.node"); + k.default.join(__dirname, "../libquery_engine-linux-arm64-openssl-1.1.x.so.node"); + k.default.join(__dirname, "../libquery_engine-linux-arm64-openssl-3.0.x.so.node"); + k.default.join(__dirname, "../libquery_engine-linux-musl.so.node"); + k.default.join(__dirname, "../libquery_engine-linux-musl-openssl-3.0.x.so.node"); + k.default.join(__dirname, "../libquery_engine-rhel-openssl-1.0.x.so.node"); + k.default.join(__dirname, "../libquery_engine-rhel-openssl-1.1.x.so.node"); + k.default.join(__dirname, "../libquery_engine-rhel-openssl-3.0.x.so.node"); + k.default.join(__dirname, "../query_engine-windows.dll.node"); + var Tn = A(require("fs")); + var yo = N("chmodPlusX"); + function vn(e) { + if (process.platform === "win32") + return; + let t = Tn.default.statSync(e), r = t.mode | 64 | 8 | 1; + if (t.mode === r) { + yo(`Execution permissions of ${e} are fine`); + return; + } + let n = r.toString(8).slice(-3); + yo(`Have to call chmodPlusX on ${e}`), Tn.default.chmodSync(e, n); + } + function Cn(e) { + let t = e.e, r = (a) => `Prisma cannot find the required \`${a}\` system library in your system`, n = t.message.includes("cannot open shared object file"), i = `Please refer to the documentation about Prisma's system requirements: ${Tt("https://pris.ly/d/system-requirements")}`, o = `Unable to require(\`${Oe(e.id)}\`).`, s = et({ message: t.message, code: t.code }).with({ code: "ENOENT" }, () => "File does not exist.").when(({ message: a }) => n && a.includes("libz"), () => `${r("libz")}. Please install it and try again.`).when(({ message: a }) => n && a.includes("libgcc_s"), () => `${r("libgcc_s")}. Please install it and try again.`).when(({ message: a }) => n && a.includes("libssl"), () => { + let a = e.platformInfo.libssl ? `openssl-${e.platformInfo.libssl}` : "openssl"; + return `${r("libssl")}. Please install ${a} and try again.`; + }).when(({ message: a }) => a.includes("GLIBC"), () => `Prisma has detected an incompatible version of the \`glibc\` C standard library installed in your system. This probably means your system may be too old to run Prisma. ${i}`).when(({ message: a }) => e.platformInfo.platform === "linux" && a.includes("symbol not found"), () => `The Prisma engines are not compatible with your system ${e.platformInfo.originalDistro} on (${e.platformInfo.archFromUname}) which uses the \`${e.platformInfo.binaryTarget}\` binaryTarget by default. ${i}`).otherwise(() => `The Prisma engines do not seem to be compatible with your system. ${i}`); + return `${o} +${s} + +Details: ${t.message}`; + } + var Mt = A(require("path")); + function Mn(e) { + return Mt.default.sep === Mt.default.posix.sep ? e : e.split(Mt.default.sep).join(Mt.default.posix.sep); + } + var xo = A(An()); + function Rn(e) { + return String(new Sn(e)); + } + var Sn = class { + constructor(t) { + this.config = t; + } + toString() { + let { config: t } = this, r = t.provider.fromEnvVar ? `env("${t.provider.fromEnvVar}")` : t.provider.value, n = JSON.parse(JSON.stringify({ provider: r, binaryTargets: ru(t.binaryTargets) })); + return `generator ${t.name} { +${(0, xo.default)(nu(n), 2)} +}`; + } + }; + function ru(e) { + let t; + if (e.length > 0) { + let r = e.find((n) => n.fromEnvVar !== null); + r ? t = `env("${r.fromEnvVar}")` : t = e.map((n) => n.native ? "native" : n.value); + } else + t = void 0; + return t; + } + function nu(e) { + let t = Object.keys(e).reduce((r, n) => Math.max(r, n.length), 0); + return Object.entries(e).map(([r, n]) => `${r.padEnd(t)} = ${iu(n)}`).join(` +`); + } + function iu(e) { + return JSON.parse(JSON.stringify(e, (t, r) => Array.isArray(r) ? `[${r.map((n) => JSON.stringify(n)).join(", ")}]` : JSON.stringify(r))); + } + var St = {}; + xt(St, { error: () => au, info: () => su, log: () => ou, query: () => lu, should: () => bo, tags: () => At, warn: () => Fn }); + var At = { error: pe("prisma:error"), warn: ye("prisma:warn"), info: ke("prisma:info"), query: Xe("prisma:query") }; + var bo = { warn: () => !process.env.PRISMA_DISABLE_WARNINGS }; + function ou(...e) { + console.log(...e); + } + function Fn(e, ...t) { + bo.warn() && console.warn(`${At.warn} ${e}`, ...t); + } + function su(e, ...t) { + console.info(`${At.info} ${e}`, ...t); + } + function au(e, ...t) { + console.error(`${At.error} ${e}`, ...t); + } + function lu(e, ...t) { + console.log(`${At.query} ${e}`, ...t); + } + function Je(e, t) { + throw new Error(t); + } + function kn(e, t) { + return Object.prototype.hasOwnProperty.call(e, t); + } + var Dn = (e, t) => e.reduce((r, n) => (r[t(n)] = n, r), {}); + function ot(e, t) { + let r = {}; + for (let n of Object.keys(e)) + r[n] = t(e[n], n); + return r; + } + function _n(e, t) { + if (e.length === 0) + return; + let r = e[0]; + for (let n = 1; n < e.length; n++) + t(r, e[n]) < 0 && (r = e[n]); + return r; + } + function ee(e, t) { + Object.defineProperty(e, "name", { value: t, configurable: true }); + } + var vo = /* @__PURE__ */ new Set(); + var In = (e, t, ...r) => { + vo.has(e) || (vo.add(e), Fn(t, ...r)); + }; + var H = class extends Error { + constructor(r, { code: n, clientVersion: i, meta: o, batchRequestIdx: s }) { + super(r); + this.name = "PrismaClientKnownRequestError", this.code = n, this.clientVersion = i, this.meta = o, Object.defineProperty(this, "batchRequestIdx", { value: s, enumerable: false, writable: true }); + } + get [Symbol.toStringTag]() { + return "PrismaClientKnownRequestError"; + } + }; + ee(H, "PrismaClientKnownRequestError"); + var Ce = class extends H { + constructor(t, r) { + super(t, { code: "P2025", clientVersion: r }), this.name = "NotFoundError"; + } + }; + ee(Ce, "NotFoundError"); + var _ = class extends Error { + constructor(r, n, i) { + super(r); + this.name = "PrismaClientInitializationError", this.clientVersion = n, this.errorCode = i, Error.captureStackTrace(_); + } + get [Symbol.toStringTag]() { + return "PrismaClientInitializationError"; + } + }; + ee(_, "PrismaClientInitializationError"); + var ae = class extends Error { + constructor(r, n) { + super(r); + this.name = "PrismaClientRustPanicError", this.clientVersion = n; + } + get [Symbol.toStringTag]() { + return "PrismaClientRustPanicError"; + } + }; + ee(ae, "PrismaClientRustPanicError"); + var z = class extends Error { + constructor(r, { clientVersion: n, batchRequestIdx: i }) { + super(r); + this.name = "PrismaClientUnknownRequestError", this.clientVersion = n, Object.defineProperty(this, "batchRequestIdx", { value: i, writable: true, enumerable: false }); + } + get [Symbol.toStringTag]() { + return "PrismaClientUnknownRequestError"; + } + }; + ee(z, "PrismaClientUnknownRequestError"); + var te = class extends Error { + constructor(r, { clientVersion: n }) { + super(r); + this.name = "PrismaClientValidationError"; + this.clientVersion = n; + } + get [Symbol.toStringTag]() { + return "PrismaClientValidationError"; + } + }; + ee(te, "PrismaClientValidationError"); + var st = class { + constructor(t) { + this._engine = t; + } + prometheus(t) { + return this._engine.metrics({ format: "prometheus", ...t }); + } + json(t) { + return this._engine.metrics({ format: "json", ...t }); + } + }; + function Rt(e) { + let t; + return { get() { + return t || (t = { value: e() }), t.value; + } }; + } + function Co(e, t) { + let r = Rt(() => pu(t)); + Object.defineProperty(e, "dmmf", { get: () => r.get() }); + } + function pu(e) { + return { datamodel: { models: Nn(e.models), enums: Nn(e.enums), types: Nn(e.types) } }; + } + function Nn(e) { + return Object.entries(e).map(([t, r]) => ({ name: t, ...r })); + } + var qa = require("async_hooks"); + var ja = require("events"); + var Ba = A(require("fs")); + var Qt = A(require("path")); + var U = class { + constructor(t, r) { + if (t.length - 1 !== r.length) + throw t.length === 0 ? new TypeError("Expected at least 1 string") : new TypeError(`Expected ${t.length} strings to have ${t.length - 1} values`); + let n = r.reduce((s, a) => s + (a instanceof U ? a.values.length : 1), 0); + this.values = new Array(n), this.strings = new Array(n + 1), this.strings[0] = t[0]; + let i = 0, o = 0; + for (; i < r.length; ) { + let s = r[i++], a = t[i]; + if (s instanceof U) { + this.strings[o] += s.strings[0]; + let l = 0; + for (; l < s.values.length; ) + this.values[o++] = s.values[l++], this.strings[o] = s.strings[l]; + this.strings[o] += a; + } else + this.values[o++] = s, this.strings[o] = a; + } + } + get text() { + let t = 1, r = this.strings[0]; + for (; t < this.strings.length; ) + r += `$${t}${this.strings[t++]}`; + return r; + } + get sql() { + let t = 1, r = this.strings[0]; + for (; t < this.strings.length; ) + r += `?${this.strings[t++]}`; + return r; + } + inspect() { + return { text: this.text, sql: this.sql, values: this.values }; + } + }; + function Mo(e, t = ",", r = "", n = "") { + if (e.length === 0) + throw new TypeError("Expected `join([])` to be called with an array of multiple elements, but got an empty array"); + return new U([r, ...Array(e.length - 1).fill(t), n], e); + } + function Ln(e) { + return new U([e], []); + } + var Ao = Ln(""); + function $n(e, ...t) { + return new U(e, t); + } + function Ft(e) { + return { getKeys() { + return Object.keys(e); + }, getPropertyValue(t) { + return e[t]; + } }; + } + function re(e, t) { + return { getKeys() { + return [e]; + }, getPropertyValue() { + return t(); + } }; + } + var he = class { + constructor() { + this._map = /* @__PURE__ */ new Map(); + } + get(t) { + return this._map.get(t)?.value; + } + set(t, r) { + this._map.set(t, { value: r }); + } + getOrCreate(t, r) { + let n = this._map.get(t); + if (n) + return n.value; + let i = r(); + return this.set(t, i), i; + } + }; + function Ge(e) { + let t = new he(); + return { getKeys() { + return e.getKeys(); + }, getPropertyValue(r) { + return t.getOrCreate(r, () => e.getPropertyValue(r)); + }, getPropertyDescriptor(r) { + return e.getPropertyDescriptor?.(r); + } }; + } + var Fo = require("util"); + var fr = { enumerable: true, configurable: true, writable: true }; + function gr(e) { + let t = new Set(e); + return { getOwnPropertyDescriptor: () => fr, has: (r, n) => t.has(n), set: (r, n, i) => t.add(n) && Reflect.set(r, n, i), ownKeys: () => [...t] }; + } + var So = Symbol.for("nodejs.util.inspect.custom"); + function xe(e, t) { + let r = du(t), n = /* @__PURE__ */ new Set(), i = new Proxy(e, { get(o, s) { + if (n.has(s)) + return o[s]; + let a = r.get(s); + return a ? a.getPropertyValue(s) : o[s]; + }, has(o, s) { + if (n.has(s)) + return true; + let a = r.get(s); + return a ? a.has?.(s) ?? true : Reflect.has(o, s); + }, ownKeys(o) { + let s = Ro(Reflect.ownKeys(o), r), a = Ro(Array.from(r.keys()), r); + return [.../* @__PURE__ */ new Set([...s, ...a, ...n])]; + }, set(o, s, a) { + return r.get(s)?.getPropertyDescriptor?.(s)?.writable === false ? false : (n.add(s), Reflect.set(o, s, a)); + }, getOwnPropertyDescriptor(o, s) { + let a = Reflect.getOwnPropertyDescriptor(o, s); + if (a && !a.configurable) + return a; + let l = r.get(s); + return l ? l.getPropertyDescriptor ? { ...fr, ...l?.getPropertyDescriptor(s) } : fr : a; + }, defineProperty(o, s, a) { + return n.add(s), Reflect.defineProperty(o, s, a); + } }); + return i[So] = function(o, s, a = Fo.inspect) { + let l = { ...this }; + return delete l[So], a(l, s); + }, i; + } + function du(e) { + let t = /* @__PURE__ */ new Map(); + for (let r of e) { + let n = r.getKeys(); + for (let i of n) + t.set(i, r); + } + return t; + } + function Ro(e, t) { + return e.filter((r) => t.get(r)?.has?.(r) ?? true); + } + function Ot(e) { + return { getKeys() { + return e; + }, has() { + return false; + }, getPropertyValue() { + } }; + } + function Oo({ error: e, user_facing_error: t }, r) { + return t.error_code ? new H(t.message, { code: t.error_code, clientVersion: r, meta: t.meta, batchRequestIdx: t.batch_request_idx }) : new z(e, { clientVersion: r, batchRequestIdx: t.batch_request_idx }); + } + var yr = class { + }; + var No = A(require("fs")); + var kt = A(require("path")); + function hr(e) { + let { runtimeBinaryTarget: t } = e; + return `Add "${t}" to \`binaryTargets\` in the "schema.prisma" file and run \`prisma generate\` after saving it: + +${mu(e)}`; + } + function mu(e) { + let { generator: t, generatorBinaryTargets: r, runtimeBinaryTarget: n } = e, i = { fromEnvVar: null, value: n }, o = [...r, i]; + return Rn({ ...t, binaryTargets: o }); + } + function De(e) { + let { runtimeBinaryTarget: t } = e; + return `Prisma Client could not locate the Query Engine for runtime "${t}".`; + } + function _e(e) { + let { searchedLocations: t } = e; + return `The following locations have been searched: +${[...new Set(t)].map((i) => ` ${i}`).join(` +`)}`; + } + function ko(e) { + let { runtimeBinaryTarget: t } = e; + return `${De(e)} + +This happened because \`binaryTargets\` have been pinned, but the actual deployment also required "${t}". +${hr(e)} + +${_e(e)}`; + } + function xr(e) { + return `We would appreciate if you could take the time to share some information with us. +Please help us by answering a few questions: https://pris.ly/${e}`; + } + function Do(e) { + let { queryEngineName: t } = e; + return `${De(e)} + +This is likely caused by a bundler that has not copied "${t}" next to the resulting bundle. +Ensure that "${t}" has been copied next to the bundle or in "${e.expectedLocation}". + +${xr("engine-not-found-bundler-investigation")} + +${_e(e)}`; + } + function _o(e) { + let { runtimeBinaryTarget: t, generatorBinaryTargets: r } = e, n = r.find((i) => i.native); + return `${De(e)} + +This happened because Prisma Client was generated for "${n?.value ?? "unknown"}", but the actual deployment required "${t}". +${hr(e)} + +${_e(e)}`; + } + function Io(e) { + let { queryEngineName: t } = e; + return `${De(e)} + +This is likely caused by tooling that has not copied "${t}" to the deployment folder. +Ensure that you ran \`prisma generate\` and that "${t}" has been copied to "${e.expectedLocation}". + +${xr("engine-not-found-tooling-investigation")} + +${_e(e)}`; + } + var fu = N("prisma:client:engines:resolveEnginePath"); + var gu = () => new RegExp("runtime[\\\\/]library\\.m?js$"); + async function Lo(e, t) { + let r = { binary: process.env.PRISMA_QUERY_ENGINE_BINARY, library: process.env.PRISMA_QUERY_ENGINE_LIBRARY }[e] ?? t.prismaPath; + if (r !== void 0) + return r; + let { enginePath: n, searchedLocations: i } = await yu(e, t); + if (fu("enginePath", n), n !== void 0 && e === "binary" && vn(n), n !== void 0) + return t.prismaPath = n; + let o = await nt(), s = t.generator?.binaryTargets ?? [], a = s.some((d) => d.native), l = !s.some((d) => d.value === o), u = __filename.match(gu()) === null, c = { searchedLocations: i, generatorBinaryTargets: s, generator: t.generator, runtimeBinaryTarget: o, queryEngineName: $o(e, o), expectedLocation: kt.default.relative(process.cwd(), t.dirname) }, p; + throw a && l ? p = _o(c) : l ? p = ko(c) : u ? p = Do(c) : p = Io(c), new _(p, t.clientVersion); + } + async function yu(engineType, config) { + let binaryTarget = await nt(), searchedLocations = [], dirname = eval("__dirname"), searchLocations = [config.dirname, kt.default.resolve(dirname, ".."), config.generator?.output?.value ?? dirname, kt.default.resolve(dirname, "../../../.prisma/client"), "/tmp/prisma-engines", config.cwd]; + __filename.includes("resolveEnginePath") && searchLocations.push(go()); + for (let e of searchLocations) { + let t = $o(engineType, binaryTarget), r = kt.default.join(e, t); + if (searchedLocations.push(e), No.default.existsSync(r)) + return { enginePath: r, searchedLocations }; + } + return { enginePath: void 0, searchedLocations }; + } + function $o(e, t) { + return e === "library" ? cn(t, "fs") : `query-engine-${t}${t === "windows" ? ".exe" : ""}`; + } + function qo(e, t) { + return { batch: e, transaction: t?.kind === "batch" ? { isolationLevel: t.options.isolationLevel } : void 0 }; + } + var qn = A(On()); + function jo(e) { + return e ? e.replace(/".*"/g, '"X"').replace(/[\s:\[]([+-]?([0-9]*[.])?[0-9]+)/g, (t) => `${t[0]}5`) : ""; + } + function Bo(e) { + return e.split(` +`).map((t) => t.replace(/^\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d\.\d+([+-][0-2]\d:[0-5]\d|Z)\s*/, "").replace(/\+\d+\s*ms$/, "")).join(` +`); + } + var Ko = A(To()); + function Vo({ title: e, user: t = "prisma", repo: r = "prisma", template: n = "bug_report.md", body: i }) { + return (0, Ko.default)({ user: t, repo: r, template: n, title: e, body: i }); + } + function Uo({ version: e, platform: t, title: r, description: n, engineVersion: i, database: o, query: s }) { + let a = Oi(6e3 - (s?.length ?? 0)), l = Bo((0, qn.default)(a)), u = n ? `# Description +\`\`\` +${n} +\`\`\`` : "", c = (0, qn.default)(`Hi Prisma Team! My Prisma Client just crashed. This is the report: +## Versions + +| Name | Version | +|-----------------|--------------------| +| Node | ${process.version?.padEnd(19)}| +| OS | ${t?.padEnd(19)}| +| Prisma Client | ${e?.padEnd(19)}| +| Query Engine | ${i?.padEnd(19)}| +| Database | ${o?.padEnd(19)}| + +${u} + +## Logs +\`\`\` +${l} +\`\`\` + +## Client Snippet +\`\`\`ts +// PLEASE FILL YOUR CODE SNIPPET HERE +\`\`\` + +## Schema +\`\`\`prisma +// PLEASE ADD YOUR SCHEMA HERE IF POSSIBLE +\`\`\` + +## Prisma Engine Query +\`\`\` +${s ? jo(s) : ""} +\`\`\` +`), p = Vo({ title: r, body: c }); + return `${r} + +This is a non-recoverable error which probably happens when the Prisma Query Engine has a panic. + +${X(p)} + +If you want the Prisma team to look into it, please open the link above \u{1F64F} +To increase the chance of success, please post your schema and a snippet of +how you used Prisma Client in the issue. +`; + } + var Ho = A(require("fs")); + function Qo(e) { + if (e?.kind === "itx") + return e.options.id; + } + var Bn = A(require("os")); + var Jo = A(require("path")); + var jn = Symbol("PrismaLibraryEngineCache"); + function hu() { + let e = globalThis; + return e[jn] === void 0 && (e[jn] = {}), e[jn]; + } + function xu(e) { + let t = hu(); + if (t[e] !== void 0) + return t[e]; + let r = Jo.default.toNamespacedPath(e), n = { exports: {} }, i = 0; + return process.platform !== "win32" && (i = Bn.default.constants.dlopen.RTLD_LAZY | Bn.default.constants.dlopen.RTLD_DEEPBIND), process.dlopen(n, r, i), t[e] = n.exports, n.exports; + } + var br = class { + constructor(t) { + this.config = t; + } + async loadLibrary() { + let t = await yn(), r = await Lo("library", this.config); + try { + return this.config.tracingHelper.runInChildSpan({ name: "loadLibrary", internal: true }, () => xu(r)); + } catch (n) { + let i = Cn({ e: n, platformInfo: t, id: r }); + throw new _(i, this.config.clientVersion); + } + } + }; + var Me = N("prisma:client:libraryEngine"); + function bu(e) { + return e.item_type === "query" && "query" in e; + } + function wu(e) { + return "level" in e ? e.level === "error" && e.message === "PANIC" : false; + } + var Go = [...hn, "native"]; + var Wo = 0; + var Dt = class extends yr { + constructor(r, n = new br(r)) { + super(); + try { + this.datamodel = Ho.default.readFileSync(r.datamodelPath, "utf-8"); + } catch (i) { + throw i.stack.match(/\/\.next|\/next@|\/next\//) ? new _(`Your schema.prisma could not be found, and we detected that you are using Next.js. +Find out why and learn how to fix this: https://pris.ly/d/schema-not-found-nextjs`, r.clientVersion) : r.isBundled === true ? new _("Prisma Client could not find its `schema.prisma`. This is likely caused by a bundling step, which leads to `schema.prisma` not being copied near the resulting bundle. We would appreciate if you could take the time to share some information with us.\nPlease help us by answering a few questions: https://pris.ly/bundler-investigation-error", r.clientVersion) : i; + } + this.config = r, this.libraryStarted = false, this.logQueries = r.logQueries ?? false, this.logLevel = r.logLevel ?? "error", this.libraryLoader = n, this.logEmitter = r.logEmitter, this.datasourceOverrides = r.datasources ? this.convertDatasources(r.datasources) : {}, r.enableDebugLogs && (this.logLevel = "debug"), this.libraryInstantiationPromise = this.instantiateLibrary(), this.checkForTooManyEngines(); + } + checkForTooManyEngines() { + Wo === 10 && console.warn(`${ye("warn(prisma-client)")} This is the 10th instance of Prisma Client being started. Make sure this is intentional.`); + } + async transaction(r, n, i) { + await this.start(); + let o = JSON.stringify(n), s; + if (r === "start") { + let l = JSON.stringify({ max_wait: i?.maxWait ?? 2e3, timeout: i?.timeout ?? 5e3, isolation_level: i?.isolationLevel }); + s = await this.engine?.startTransaction(l, o); + } else + r === "commit" ? s = await this.engine?.commitTransaction(i.id, o) : r === "rollback" && (s = await this.engine?.rollbackTransaction(i.id, o)); + let a = this.parseEngineResponse(s); + if (a.error_code) + throw new H(a.message, { code: a.error_code, clientVersion: this.config.clientVersion, meta: a.meta }); + return a; + } + async instantiateLibrary() { + if (Me("internalSetup"), this.libraryInstantiationPromise) + return this.libraryInstantiationPromise; + un(), this.platform = await this.getPlatform(), await this.loadEngine(), this.version(); + } + async getPlatform() { + if (this.platform) + return this.platform; + let r = await nt(); + if (!Go.includes(r)) + throw new _(`Unknown ${pe("PRISMA_QUERY_ENGINE_LIBRARY")} ${pe(ne(r))}. Possible binaryTargets: ${Ue(Go.join(", "))} or a path to the query engine library. +You may have to run ${Ue("prisma generate")} for your changes to take effect.`, this.config.clientVersion); + return r; + } + parseEngineResponse(r) { + if (!r) + throw new z("Response from the Engine was empty", { clientVersion: this.config.clientVersion }); + try { + return JSON.parse(r); + } catch { + throw new z("Unable to JSON.parse response from engine", { clientVersion: this.config.clientVersion }); + } + } + convertDatasources(r) { + let n = /* @__PURE__ */ Object.create(null); + for (let { name: i, url: o } of r) + n[i] = o; + return n; + } + async loadEngine() { + if (!this.engine) { + this.QueryEngineConstructor || (this.library = await this.libraryLoader.loadLibrary(), this.QueryEngineConstructor = this.library.QueryEngine); + try { + let r = new WeakRef(this); + this.engine = new this.QueryEngineConstructor({ datamodel: this.datamodel, env: process.env, logQueries: this.config.logQueries ?? false, ignoreEnvVarErrors: true, datasourceOverrides: this.datasourceOverrides, logLevel: this.logLevel, configDir: this.config.cwd, engineProtocol: "json" }, (n) => { + r.deref()?.logger(n); + }), Wo++; + } catch (r) { + let n = r, i = this.parseInitError(n.message); + throw typeof i == "string" ? n : new _(i.message, this.config.clientVersion, i.error_code); + } + } + } + logger(r) { + let n = this.parseEngineResponse(r); + if (!!n) { + if ("span" in n) { + this.config.tracingHelper.createEngineSpan(n); + return; + } + n.level = n?.level.toLowerCase() ?? "unknown", bu(n) ? this.logEmitter.emit("query", { timestamp: /* @__PURE__ */ new Date(), query: n.query, params: n.params, duration: Number(n.duration_ms), target: n.module_path }) : wu(n) ? this.loggerRustPanic = new ae(this.getErrorMessageWithLink(`${n.message}: ${n.reason} in ${n.file}:${n.line}:${n.column}`), this.config.clientVersion) : this.logEmitter.emit(n.level, { timestamp: /* @__PURE__ */ new Date(), message: n.message, target: n.module_path }); + } + } + getErrorMessageWithLink(r) { + return Uo({ platform: this.platform, title: r, version: this.config.clientVersion, engineVersion: this.versionInfo?.commit, database: this.config.activeProvider, query: this.lastQuery }); + } + parseInitError(r) { + try { + return JSON.parse(r); + } catch { + } + return r; + } + parseRequestError(r) { + try { + return JSON.parse(r); + } catch { + } + return r; + } + on(r, n) { + if (r === "beforeExit") + throw new Error('"beforeExit" hook is not applicable to the library engine since Prisma 5.0.0, it is only relevant and implemented for the binary engine. Please add your event listener to the `process` object directly instead.'); + this.logEmitter.on(r, n); + } + async start() { + if (await this.libraryInstantiationPromise, await this.libraryStoppingPromise, this.libraryStartingPromise) + return Me(`library already starting, this.libraryStarted: ${this.libraryStarted}`), this.libraryStartingPromise; + if (this.libraryStarted) + return; + let r = async () => { + Me("library starting"); + try { + let n = { traceparent: this.config.tracingHelper.getTraceParent() }; + await this.engine?.connect(JSON.stringify(n)), this.libraryStarted = true, Me("library started"); + } catch (n) { + let i = this.parseInitError(n.message); + throw typeof i == "string" ? n : new _(i.message, this.config.clientVersion, i.error_code); + } finally { + this.libraryStartingPromise = void 0; + } + }; + return this.libraryStartingPromise = this.config.tracingHelper.runInChildSpan("connect", r), this.libraryStartingPromise; + } + async stop() { + if (await this.libraryStartingPromise, await this.executingQueryPromise, this.libraryStoppingPromise) + return Me("library is already stopping"), this.libraryStoppingPromise; + if (!this.libraryStarted) + return; + let r = async () => { + await new Promise((i) => setTimeout(i, 5)), Me("library stopping"); + let n = { traceparent: this.config.tracingHelper.getTraceParent() }; + await this.engine?.disconnect(JSON.stringify(n)), this.libraryStarted = false, this.libraryStoppingPromise = void 0, Me("library stopped"); + }; + return this.libraryStoppingPromise = this.config.tracingHelper.runInChildSpan("disconnect", r), this.libraryStoppingPromise; + } + version() { + return this.versionInfo = this.library?.version(), this.versionInfo?.version ?? "unknown"; + } + debugPanic(r) { + return this.library?.debugPanic(r); + } + async request(r, { traceparent: n, interactiveTransaction: i }) { + Me(`sending request, this.libraryStarted: ${this.libraryStarted}`); + let o = JSON.stringify({ traceparent: n }), s = JSON.stringify(r); + try { + await this.start(), this.executingQueryPromise = this.engine?.query(s, o, i?.id), this.lastQuery = s; + let a = this.parseEngineResponse(await this.executingQueryPromise); + if (a.errors) + throw a.errors.length === 1 ? this.buildQueryError(a.errors[0]) : new z(JSON.stringify(a.errors), { clientVersion: this.config.clientVersion }); + if (this.loggerRustPanic) + throw this.loggerRustPanic; + return { data: a, elapsed: 0 }; + } catch (a) { + if (a instanceof _) + throw a; + if (a.code === "GenericFailure" && a.message?.startsWith("PANIC:")) + throw new ae(this.getErrorMessageWithLink(a.message), this.config.clientVersion); + let l = this.parseRequestError(a.message); + throw typeof l == "string" ? a : new z(`${l.message} +${l.backtrace}`, { clientVersion: this.config.clientVersion }); + } + } + async requestBatch(r, { transaction: n, traceparent: i }) { + Me("requestBatch"); + let o = qo(r, n); + await this.start(), this.lastQuery = JSON.stringify(o), this.executingQueryPromise = this.engine.query(this.lastQuery, JSON.stringify({ traceparent: i }), Qo(n)); + let s = await this.executingQueryPromise, a = this.parseEngineResponse(s); + if (a.errors) + throw a.errors.length === 1 ? this.buildQueryError(a.errors[0]) : new z(JSON.stringify(a.errors), { clientVersion: this.config.clientVersion }); + let { batchResult: l, errors: u } = a; + if (Array.isArray(l)) + return l.map((c) => c.errors && c.errors.length > 0 ? this.loggerRustPanic ?? this.buildQueryError(c.errors[0]) : { data: c, elapsed: 0 }); + throw u && u.length === 1 ? new Error(u[0].error) : new Error(JSON.stringify(a)); + } + buildQueryError(r) { + return r.user_facing_error.is_panic ? new ae(this.getErrorMessageWithLink(r.user_facing_error.message), this.config.clientVersion) : Oo(r, this.config.clientVersion); + } + async metrics(r) { + await this.start(); + let n = await this.engine.metrics(JSON.stringify(r)); + return r.format === "prometheus" ? n : this.parseEngineResponse(n); + } + }; + var at = class { + constructor(t = 0, r) { + this.context = r; + this.lines = []; + this.currentLine = ""; + this.currentIndent = 0; + this.currentIndent = t; + } + write(t) { + return typeof t == "string" ? this.currentLine += t : t.write(this), this; + } + writeJoined(t, r) { + let n = r.length - 1; + for (let i = 0; i < r.length; i++) + this.write(r[i]), i !== n && this.write(t); + return this; + } + writeLine(t) { + return this.write(t).newLine(); + } + newLine() { + this.lines.push(this.indentedCurrentLine()), this.currentLine = "", this.marginSymbol = void 0; + let t = this.afterNextNewLineCallback; + return this.afterNextNewLineCallback = void 0, t?.(), this; + } + withIndent(t) { + return this.indent(), t(this), this.unindent(), this; + } + afterNextNewline(t) { + return this.afterNextNewLineCallback = t, this; + } + indent() { + return this.currentIndent++, this; + } + unindent() { + return this.currentIndent > 0 && this.currentIndent--, this; + } + addMarginSymbol(t) { + return this.marginSymbol = t, this; + } + toString() { + return this.lines.concat(this.indentedCurrentLine()).join(` +`); + } + getCurrentLineLength() { + return this.currentLine.length; + } + indentedCurrentLine() { + let t = this.currentLine.padStart(this.currentLine.length + 2 * this.currentIndent); + return this.marginSymbol ? this.marginSymbol + t.slice(1) : t; + } + }; + var wr = Symbol(); + var Kn = /* @__PURE__ */ new WeakMap(); + var Ae = class { + constructor(t) { + t === wr ? Kn.set(this, `Prisma.${this._getName()}`) : Kn.set(this, `new Prisma.${this._getNamespace()}.${this._getName()}()`); + } + _getName() { + return this.constructor.name; + } + toString() { + return Kn.get(this); + } + }; + var _t = class extends Ae { + _getNamespace() { + return "NullTypes"; + } + }; + var It = class extends _t { + }; + Vn(It, "DbNull"); + var Nt = class extends _t { + }; + Vn(Nt, "JsonNull"); + var Lt = class extends _t { + }; + Vn(Lt, "AnyNull"); + var Pr = { classes: { DbNull: It, JsonNull: Nt, AnyNull: Lt }, instances: { DbNull: new It(wr), JsonNull: new Nt(wr), AnyNull: new Lt(wr) } }; + function Vn(e, t) { + Object.defineProperty(e, "name", { value: t, configurable: true }); + } + function lt(e) { + return e instanceof Date || Object.prototype.toString.call(e) === "[object Date]"; + } + function Er(e) { + return e.toString() !== "Invalid Date"; + } + var ut = 9e15; + var $e = 1e9; + var Un = "0123456789abcdef"; + var vr = "2.3025850929940456840179914546843642076011014886287729760333279009675726096773524802359972050895982983419677840422862486334095254650828067566662873690987816894829072083255546808437998948262331985283935053089653777326288461633662222876982198867465436674744042432743651550489343149393914796194044002221051017141748003688084012647080685567743216228355220114804663715659121373450747856947683463616792101806445070648000277502684916746550586856935673420670581136429224554405758925724208241314695689016758940256776311356919292033376587141660230105703089634572075440370847469940168269282808481184289314848524948644871927809676271275775397027668605952496716674183485704422507197965004714951050492214776567636938662976979522110718264549734772662425709429322582798502585509785265383207606726317164309505995087807523710333101197857547331541421808427543863591778117054309827482385045648019095610299291824318237525357709750539565187697510374970888692180205189339507238539205144634197265287286965110862571492198849978748873771345686209167058"; + var Cr = "3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679821480865132823066470938446095505822317253594081284811174502841027019385211055596446229489549303819644288109756659334461284756482337867831652712019091456485669234603486104543266482133936072602491412737245870066063155881748815209209628292540917153643678925903600113305305488204665213841469519415116094330572703657595919530921861173819326117931051185480744623799627495673518857527248912279381830119491298336733624406566430860213949463952247371907021798609437027705392171762931767523846748184676694051320005681271452635608277857713427577896091736371787214684409012249534301465495853710507922796892589235420199561121290219608640344181598136297747713099605187072113499999983729780499510597317328160963185950244594553469083026425223082533446850352619311881710100031378387528865875332083814206171776691473035982534904287554687311595628638823537875937519577818577805321712268066130019278766111959092164201989380952572010654858632789"; + var Qn = { precision: 20, rounding: 4, modulo: 1, toExpNeg: -7, toExpPos: 21, minE: -ut, maxE: ut, crypto: false }; + var Xo; + var Se; + var P = true; + var Ar = "[DecimalError] "; + var Le = Ar + "Invalid argument: "; + var es = Ar + "Precision limit exceeded"; + var ts = Ar + "crypto unavailable"; + var rs = "[object Decimal]"; + var Y = Math.floor; + var $ = Math.pow; + var Pu = /^0b([01]+(\.[01]*)?|\.[01]+)(p[+-]?\d+)?$/i; + var Eu = /^0x([0-9a-f]+(\.[0-9a-f]*)?|\.[0-9a-f]+)(p[+-]?\d+)?$/i; + var Tu = /^0o([0-7]+(\.[0-7]*)?|\.[0-7]+)(p[+-]?\d+)?$/i; + var ns = /^(\d+(\.\d*)?|\.\d+)(e[+-]?\d+)?$/i; + var me = 1e7; + var w = 7; + var vu = 9007199254740991; + var Cu = vr.length - 1; + var Jn = Cr.length - 1; + var m = { toStringTag: rs }; + m.absoluteValue = m.abs = function() { + var e = new this.constructor(this); + return e.s < 0 && (e.s = 1), h(e); + }; + m.ceil = function() { + return h(new this.constructor(this), this.e + 1, 2); + }; + m.clampedTo = m.clamp = function(e, t) { + var r, n = this, i = n.constructor; + if (e = new i(e), t = new i(t), !e.s || !t.s) + return new i(NaN); + if (e.gt(t)) + throw Error(Le + t); + return r = n.cmp(e), r < 0 ? e : n.cmp(t) > 0 ? t : new i(n); + }; + m.comparedTo = m.cmp = function(e) { + var t, r, n, i, o = this, s = o.d, a = (e = new o.constructor(e)).d, l = o.s, u = e.s; + if (!s || !a) + return !l || !u ? NaN : l !== u ? l : s === a ? 0 : !s ^ l < 0 ? 1 : -1; + if (!s[0] || !a[0]) + return s[0] ? l : a[0] ? -u : 0; + if (l !== u) + return l; + if (o.e !== e.e) + return o.e > e.e ^ l < 0 ? 1 : -1; + for (n = s.length, i = a.length, t = 0, r = n < i ? n : i; t < r; ++t) + if (s[t] !== a[t]) + return s[t] > a[t] ^ l < 0 ? 1 : -1; + return n === i ? 0 : n > i ^ l < 0 ? 1 : -1; + }; + m.cosine = m.cos = function() { + var e, t, r = this, n = r.constructor; + return r.d ? r.d[0] ? (e = n.precision, t = n.rounding, n.precision = e + Math.max(r.e, r.sd()) + w, n.rounding = 1, r = Mu(n, ls(n, r)), n.precision = e, n.rounding = t, h(Se == 2 || Se == 3 ? r.neg() : r, e, t, true)) : new n(1) : new n(NaN); + }; + m.cubeRoot = m.cbrt = function() { + var e, t, r, n, i, o, s, a, l, u, c = this, p = c.constructor; + if (!c.isFinite() || c.isZero()) + return new p(c); + for (P = false, o = c.s * $(c.s * c, 1 / 3), !o || Math.abs(o) == 1 / 0 ? (r = Q(c.d), e = c.e, (o = (e - r.length + 1) % 3) && (r += o == 1 || o == -2 ? "0" : "00"), o = $(r, 1 / 3), e = Y((e + 1) / 3) - (e % 3 == (e < 0 ? -1 : 2)), o == 1 / 0 ? r = "5e" + e : (r = o.toExponential(), r = r.slice(0, r.indexOf("e") + 1) + e), n = new p(r), n.s = c.s) : n = new p(o.toString()), s = (e = p.precision) + 3; ; ) + if (a = n, l = a.times(a).times(a), u = l.plus(c), n = F(u.plus(c).times(a), u.plus(l), s + 2, 1), Q(a.d).slice(0, s) === (r = Q(n.d)).slice(0, s)) + if (r = r.slice(s - 3, s + 1), r == "9999" || !i && r == "4999") { + if (!i && (h(a, e + 1, 0), a.times(a).times(a).eq(c))) { + n = a; + break; + } + s += 4, i = 1; + } else { + (!+r || !+r.slice(1) && r.charAt(0) == "5") && (h(n, e + 1, 1), t = !n.times(n).times(n).eq(c)); + break; + } + return P = true, h(n, e, p.rounding, t); + }; + m.decimalPlaces = m.dp = function() { + var e, t = this.d, r = NaN; + if (t) { + if (e = t.length - 1, r = (e - Y(this.e / w)) * w, e = t[e], e) + for (; e % 10 == 0; e /= 10) + r--; + r < 0 && (r = 0); + } + return r; + }; + m.dividedBy = m.div = function(e) { + return F(this, new this.constructor(e)); + }; + m.dividedToIntegerBy = m.divToInt = function(e) { + var t = this, r = t.constructor; + return h(F(t, new r(e), 0, 1, 1), r.precision, r.rounding); + }; + m.equals = m.eq = function(e) { + return this.cmp(e) === 0; + }; + m.floor = function() { + return h(new this.constructor(this), this.e + 1, 3); + }; + m.greaterThan = m.gt = function(e) { + return this.cmp(e) > 0; + }; + m.greaterThanOrEqualTo = m.gte = function(e) { + var t = this.cmp(e); + return t == 1 || t === 0; + }; + m.hyperbolicCosine = m.cosh = function() { + var e, t, r, n, i, o = this, s = o.constructor, a = new s(1); + if (!o.isFinite()) + return new s(o.s ? 1 / 0 : NaN); + if (o.isZero()) + return a; + r = s.precision, n = s.rounding, s.precision = r + Math.max(o.e, o.sd()) + 4, s.rounding = 1, i = o.d.length, i < 32 ? (e = Math.ceil(i / 3), t = (1 / Rr(4, e)).toString()) : (e = 16, t = "2.3283064365386962890625e-10"), o = ct(s, 1, o.times(t), new s(1), true); + for (var l, u = e, c = new s(8); u--; ) + l = o.times(o), o = a.minus(l.times(c.minus(l.times(c)))); + return h(o, s.precision = r, s.rounding = n, true); + }; + m.hyperbolicSine = m.sinh = function() { + var e, t, r, n, i = this, o = i.constructor; + if (!i.isFinite() || i.isZero()) + return new o(i); + if (t = o.precision, r = o.rounding, o.precision = t + Math.max(i.e, i.sd()) + 4, o.rounding = 1, n = i.d.length, n < 3) + i = ct(o, 2, i, i, true); + else { + e = 1.4 * Math.sqrt(n), e = e > 16 ? 16 : e | 0, i = i.times(1 / Rr(5, e)), i = ct(o, 2, i, i, true); + for (var s, a = new o(5), l = new o(16), u = new o(20); e--; ) + s = i.times(i), i = i.times(a.plus(s.times(l.times(s).plus(u)))); + } + return o.precision = t, o.rounding = r, h(i, t, r, true); + }; + m.hyperbolicTangent = m.tanh = function() { + var e, t, r = this, n = r.constructor; + return r.isFinite() ? r.isZero() ? new n(r) : (e = n.precision, t = n.rounding, n.precision = e + 7, n.rounding = 1, F(r.sinh(), r.cosh(), n.precision = e, n.rounding = t)) : new n(r.s); + }; + m.inverseCosine = m.acos = function() { + var e, t = this, r = t.constructor, n = t.abs().cmp(1), i = r.precision, o = r.rounding; + return n !== -1 ? n === 0 ? t.isNeg() ? de(r, i, o) : new r(0) : new r(NaN) : t.isZero() ? de(r, i + 4, o).times(0.5) : (r.precision = i + 6, r.rounding = 1, t = t.asin(), e = de(r, i + 4, o).times(0.5), r.precision = i, r.rounding = o, e.minus(t)); + }; + m.inverseHyperbolicCosine = m.acosh = function() { + var e, t, r = this, n = r.constructor; + return r.lte(1) ? new n(r.eq(1) ? 0 : NaN) : r.isFinite() ? (e = n.precision, t = n.rounding, n.precision = e + Math.max(Math.abs(r.e), r.sd()) + 4, n.rounding = 1, P = false, r = r.times(r).minus(1).sqrt().plus(r), P = true, n.precision = e, n.rounding = t, r.ln()) : new n(r); + }; + m.inverseHyperbolicSine = m.asinh = function() { + var e, t, r = this, n = r.constructor; + return !r.isFinite() || r.isZero() ? new n(r) : (e = n.precision, t = n.rounding, n.precision = e + 2 * Math.max(Math.abs(r.e), r.sd()) + 6, n.rounding = 1, P = false, r = r.times(r).plus(1).sqrt().plus(r), P = true, n.precision = e, n.rounding = t, r.ln()); + }; + m.inverseHyperbolicTangent = m.atanh = function() { + var e, t, r, n, i = this, o = i.constructor; + return i.isFinite() ? i.e >= 0 ? new o(i.abs().eq(1) ? i.s / 0 : i.isZero() ? i : NaN) : (e = o.precision, t = o.rounding, n = i.sd(), Math.max(n, e) < 2 * -i.e - 1 ? h(new o(i), e, t, true) : (o.precision = r = n - i.e, i = F(i.plus(1), new o(1).minus(i), r + e, 1), o.precision = e + 4, o.rounding = 1, i = i.ln(), o.precision = e, o.rounding = t, i.times(0.5))) : new o(NaN); + }; + m.inverseSine = m.asin = function() { + var e, t, r, n, i = this, o = i.constructor; + return i.isZero() ? new o(i) : (t = i.abs().cmp(1), r = o.precision, n = o.rounding, t !== -1 ? t === 0 ? (e = de(o, r + 4, n).times(0.5), e.s = i.s, e) : new o(NaN) : (o.precision = r + 6, o.rounding = 1, i = i.div(new o(1).minus(i.times(i)).sqrt().plus(1)).atan(), o.precision = r, o.rounding = n, i.times(2))); + }; + m.inverseTangent = m.atan = function() { + var e, t, r, n, i, o, s, a, l, u = this, c = u.constructor, p = c.precision, d = c.rounding; + if (u.isFinite()) { + if (u.isZero()) + return new c(u); + if (u.abs().eq(1) && p + 4 <= Jn) + return s = de(c, p + 4, d).times(0.25), s.s = u.s, s; + } else { + if (!u.s) + return new c(NaN); + if (p + 4 <= Jn) + return s = de(c, p + 4, d).times(0.5), s.s = u.s, s; + } + for (c.precision = a = p + 10, c.rounding = 1, r = Math.min(28, a / w + 2 | 0), e = r; e; --e) + u = u.div(u.times(u).plus(1).sqrt().plus(1)); + for (P = false, t = Math.ceil(a / w), n = 1, l = u.times(u), s = new c(u), i = u; e !== -1; ) + if (i = i.times(l), o = s.minus(i.div(n += 2)), i = i.times(l), s = o.plus(i.div(n += 2)), s.d[t] !== void 0) + for (e = t; s.d[e] === o.d[e] && e--; ) + ; + return r && (s = s.times(2 << r - 1)), P = true, h(s, c.precision = p, c.rounding = d, true); + }; + m.isFinite = function() { + return !!this.d; + }; + m.isInteger = m.isInt = function() { + return !!this.d && Y(this.e / w) > this.d.length - 2; + }; + m.isNaN = function() { + return !this.s; + }; + m.isNegative = m.isNeg = function() { + return this.s < 0; + }; + m.isPositive = m.isPos = function() { + return this.s > 0; + }; + m.isZero = function() { + return !!this.d && this.d[0] === 0; + }; + m.lessThan = m.lt = function(e) { + return this.cmp(e) < 0; + }; + m.lessThanOrEqualTo = m.lte = function(e) { + return this.cmp(e) < 1; + }; + m.logarithm = m.log = function(e) { + var t, r, n, i, o, s, a, l, u = this, c = u.constructor, p = c.precision, d = c.rounding, g = 5; + if (e == null) + e = new c(10), t = true; + else { + if (e = new c(e), r = e.d, e.s < 0 || !r || !r[0] || e.eq(1)) + return new c(NaN); + t = e.eq(10); + } + if (r = u.d, u.s < 0 || !r || !r[0] || u.eq(1)) + return new c(r && !r[0] ? -1 / 0 : u.s != 1 ? NaN : r ? 0 : 1 / 0); + if (t) + if (r.length > 1) + o = true; + else { + for (i = r[0]; i % 10 === 0; ) + i /= 10; + o = i !== 1; + } + if (P = false, a = p + g, s = Ne(u, a), n = t ? Mr(c, a + 10) : Ne(e, a), l = F(s, n, a, 1), $t(l.d, i = p, d)) + do + if (a += 10, s = Ne(u, a), n = t ? Mr(c, a + 10) : Ne(e, a), l = F(s, n, a, 1), !o) { + +Q(l.d).slice(i + 1, i + 15) + 1 == 1e14 && (l = h(l, p + 1, 0)); + break; + } + while ($t(l.d, i += 10, d)); + return P = true, h(l, p, d); + }; + m.minus = m.sub = function(e) { + var t, r, n, i, o, s, a, l, u, c, p, d, g = this, y = g.constructor; + if (e = new y(e), !g.d || !e.d) + return !g.s || !e.s ? e = new y(NaN) : g.d ? e.s = -e.s : e = new y(e.d || g.s !== e.s ? g : NaN), e; + if (g.s != e.s) + return e.s = -e.s, g.plus(e); + if (u = g.d, d = e.d, a = y.precision, l = y.rounding, !u[0] || !d[0]) { + if (d[0]) + e.s = -e.s; + else if (u[0]) + e = new y(g); + else + return new y(l === 3 ? -0 : 0); + return P ? h(e, a, l) : e; + } + if (r = Y(e.e / w), c = Y(g.e / w), u = u.slice(), o = c - r, o) { + for (p = o < 0, p ? (t = u, o = -o, s = d.length) : (t = d, r = c, s = u.length), n = Math.max(Math.ceil(a / w), s) + 2, o > n && (o = n, t.length = 1), t.reverse(), n = o; n--; ) + t.push(0); + t.reverse(); + } else { + for (n = u.length, s = d.length, p = n < s, p && (s = n), n = 0; n < s; n++) + if (u[n] != d[n]) { + p = u[n] < d[n]; + break; + } + o = 0; + } + for (p && (t = u, u = d, d = t, e.s = -e.s), s = u.length, n = d.length - s; n > 0; --n) + u[s++] = 0; + for (n = d.length; n > o; ) { + if (u[--n] < d[n]) { + for (i = n; i && u[--i] === 0; ) + u[i] = me - 1; + --u[i], u[n] += me; + } + u[n] -= d[n]; + } + for (; u[--s] === 0; ) + u.pop(); + for (; u[0] === 0; u.shift()) + --r; + return u[0] ? (e.d = u, e.e = Sr(u, r), P ? h(e, a, l) : e) : new y(l === 3 ? -0 : 0); + }; + m.modulo = m.mod = function(e) { + var t, r = this, n = r.constructor; + return e = new n(e), !r.d || !e.s || e.d && !e.d[0] ? new n(NaN) : !e.d || r.d && !r.d[0] ? h(new n(r), n.precision, n.rounding) : (P = false, n.modulo == 9 ? (t = F(r, e.abs(), 0, 3, 1), t.s *= e.s) : t = F(r, e, 0, n.modulo, 1), t = t.times(e), P = true, r.minus(t)); + }; + m.naturalExponential = m.exp = function() { + return Gn(this); + }; + m.naturalLogarithm = m.ln = function() { + return Ne(this); + }; + m.negated = m.neg = function() { + var e = new this.constructor(this); + return e.s = -e.s, h(e); + }; + m.plus = m.add = function(e) { + var t, r, n, i, o, s, a, l, u, c, p = this, d = p.constructor; + if (e = new d(e), !p.d || !e.d) + return !p.s || !e.s ? e = new d(NaN) : p.d || (e = new d(e.d || p.s === e.s ? p : NaN)), e; + if (p.s != e.s) + return e.s = -e.s, p.minus(e); + if (u = p.d, c = e.d, a = d.precision, l = d.rounding, !u[0] || !c[0]) + return c[0] || (e = new d(p)), P ? h(e, a, l) : e; + if (o = Y(p.e / w), n = Y(e.e / w), u = u.slice(), i = o - n, i) { + for (i < 0 ? (r = u, i = -i, s = c.length) : (r = c, n = o, s = u.length), o = Math.ceil(a / w), s = o > s ? o + 1 : s + 1, i > s && (i = s, r.length = 1), r.reverse(); i--; ) + r.push(0); + r.reverse(); + } + for (s = u.length, i = c.length, s - i < 0 && (i = s, r = c, c = u, u = r), t = 0; i; ) + t = (u[--i] = u[i] + c[i] + t) / me | 0, u[i] %= me; + for (t && (u.unshift(t), ++n), s = u.length; u[--s] == 0; ) + u.pop(); + return e.d = u, e.e = Sr(u, n), P ? h(e, a, l) : e; + }; + m.precision = m.sd = function(e) { + var t, r = this; + if (e !== void 0 && e !== !!e && e !== 1 && e !== 0) + throw Error(Le + e); + return r.d ? (t = is(r.d), e && r.e + 1 > t && (t = r.e + 1)) : t = NaN, t; + }; + m.round = function() { + var e = this, t = e.constructor; + return h(new t(e), e.e + 1, t.rounding); + }; + m.sine = m.sin = function() { + var e, t, r = this, n = r.constructor; + return r.isFinite() ? r.isZero() ? new n(r) : (e = n.precision, t = n.rounding, n.precision = e + Math.max(r.e, r.sd()) + w, n.rounding = 1, r = Su(n, ls(n, r)), n.precision = e, n.rounding = t, h(Se > 2 ? r.neg() : r, e, t, true)) : new n(NaN); + }; + m.squareRoot = m.sqrt = function() { + var e, t, r, n, i, o, s = this, a = s.d, l = s.e, u = s.s, c = s.constructor; + if (u !== 1 || !a || !a[0]) + return new c(!u || u < 0 && (!a || a[0]) ? NaN : a ? s : 1 / 0); + for (P = false, u = Math.sqrt(+s), u == 0 || u == 1 / 0 ? (t = Q(a), (t.length + l) % 2 == 0 && (t += "0"), u = Math.sqrt(t), l = Y((l + 1) / 2) - (l < 0 || l % 2), u == 1 / 0 ? t = "5e" + l : (t = u.toExponential(), t = t.slice(0, t.indexOf("e") + 1) + l), n = new c(t)) : n = new c(u.toString()), r = (l = c.precision) + 3; ; ) + if (o = n, n = o.plus(F(s, o, r + 2, 1)).times(0.5), Q(o.d).slice(0, r) === (t = Q(n.d)).slice(0, r)) + if (t = t.slice(r - 3, r + 1), t == "9999" || !i && t == "4999") { + if (!i && (h(o, l + 1, 0), o.times(o).eq(s))) { + n = o; + break; + } + r += 4, i = 1; + } else { + (!+t || !+t.slice(1) && t.charAt(0) == "5") && (h(n, l + 1, 1), e = !n.times(n).eq(s)); + break; + } + return P = true, h(n, l, c.rounding, e); + }; + m.tangent = m.tan = function() { + var e, t, r = this, n = r.constructor; + return r.isFinite() ? r.isZero() ? new n(r) : (e = n.precision, t = n.rounding, n.precision = e + 10, n.rounding = 1, r = r.sin(), r.s = 1, r = F(r, new n(1).minus(r.times(r)).sqrt(), e + 10, 0), n.precision = e, n.rounding = t, h(Se == 2 || Se == 4 ? r.neg() : r, e, t, true)) : new n(NaN); + }; + m.times = m.mul = function(e) { + var t, r, n, i, o, s, a, l, u, c = this, p = c.constructor, d = c.d, g = (e = new p(e)).d; + if (e.s *= c.s, !d || !d[0] || !g || !g[0]) + return new p(!e.s || d && !d[0] && !g || g && !g[0] && !d ? NaN : !d || !g ? e.s / 0 : e.s * 0); + for (r = Y(c.e / w) + Y(e.e / w), l = d.length, u = g.length, l < u && (o = d, d = g, g = o, s = l, l = u, u = s), o = [], s = l + u, n = s; n--; ) + o.push(0); + for (n = u; --n >= 0; ) { + for (t = 0, i = l + n; i > n; ) + a = o[i] + g[n] * d[i - n - 1] + t, o[i--] = a % me | 0, t = a / me | 0; + o[i] = (o[i] + t) % me | 0; + } + for (; !o[--s]; ) + o.pop(); + return t ? ++r : o.shift(), e.d = o, e.e = Sr(o, r), P ? h(e, p.precision, p.rounding) : e; + }; + m.toBinary = function(e, t) { + return Hn(this, 2, e, t); + }; + m.toDecimalPlaces = m.toDP = function(e, t) { + var r = this, n = r.constructor; + return r = new n(r), e === void 0 ? r : (oe(e, 0, $e), t === void 0 ? t = n.rounding : oe(t, 0, 8), h(r, e + r.e + 1, t)); + }; + m.toExponential = function(e, t) { + var r, n = this, i = n.constructor; + return e === void 0 ? r = be(n, true) : (oe(e, 0, $e), t === void 0 ? t = i.rounding : oe(t, 0, 8), n = h(new i(n), e + 1, t), r = be(n, true, e + 1)), n.isNeg() && !n.isZero() ? "-" + r : r; + }; + m.toFixed = function(e, t) { + var r, n, i = this, o = i.constructor; + return e === void 0 ? r = be(i) : (oe(e, 0, $e), t === void 0 ? t = o.rounding : oe(t, 0, 8), n = h(new o(i), e + i.e + 1, t), r = be(n, false, e + n.e + 1)), i.isNeg() && !i.isZero() ? "-" + r : r; + }; + m.toFraction = function(e) { + var t, r, n, i, o, s, a, l, u, c, p, d, g = this, y = g.d, f = g.constructor; + if (!y) + return new f(g); + if (u = r = new f(1), n = l = new f(0), t = new f(n), o = t.e = is(y) - g.e - 1, s = o % w, t.d[0] = $(10, s < 0 ? w + s : s), e == null) + e = o > 0 ? t : u; + else { + if (a = new f(e), !a.isInt() || a.lt(u)) + throw Error(Le + a); + e = a.gt(t) ? o > 0 ? t : u : a; + } + for (P = false, a = new f(Q(y)), c = f.precision, f.precision = o = y.length * w * 2; p = F(a, t, 0, 1, 1), i = r.plus(p.times(n)), i.cmp(e) != 1; ) + r = n, n = i, i = u, u = l.plus(p.times(i)), l = i, i = t, t = a.minus(p.times(i)), a = i; + return i = F(e.minus(r), n, 0, 1, 1), l = l.plus(i.times(u)), r = r.plus(i.times(n)), l.s = u.s = g.s, d = F(u, n, o, 1).minus(g).abs().cmp(F(l, r, o, 1).minus(g).abs()) < 1 ? [u, n] : [l, r], f.precision = c, P = true, d; + }; + m.toHexadecimal = m.toHex = function(e, t) { + return Hn(this, 16, e, t); + }; + m.toNearest = function(e, t) { + var r = this, n = r.constructor; + if (r = new n(r), e == null) { + if (!r.d) + return r; + e = new n(1), t = n.rounding; + } else { + if (e = new n(e), t === void 0 ? t = n.rounding : oe(t, 0, 8), !r.d) + return e.s ? r : e; + if (!e.d) + return e.s && (e.s = r.s), e; + } + return e.d[0] ? (P = false, r = F(r, e, 0, t, 1).times(e), P = true, h(r)) : (e.s = r.s, r = e), r; + }; + m.toNumber = function() { + return +this; + }; + m.toOctal = function(e, t) { + return Hn(this, 8, e, t); + }; + m.toPower = m.pow = function(e) { + var t, r, n, i, o, s, a = this, l = a.constructor, u = +(e = new l(e)); + if (!a.d || !e.d || !a.d[0] || !e.d[0]) + return new l($(+a, u)); + if (a = new l(a), a.eq(1)) + return a; + if (n = l.precision, o = l.rounding, e.eq(1)) + return h(a, n, o); + if (t = Y(e.e / w), t >= e.d.length - 1 && (r = u < 0 ? -u : u) <= vu) + return i = os(l, a, r, n), e.s < 0 ? new l(1).div(i) : h(i, n, o); + if (s = a.s, s < 0) { + if (t < e.d.length - 1) + return new l(NaN); + if ((e.d[t] & 1) == 0 && (s = 1), a.e == 0 && a.d[0] == 1 && a.d.length == 1) + return a.s = s, a; + } + return r = $(+a, u), t = r == 0 || !isFinite(r) ? Y(u * (Math.log("0." + Q(a.d)) / Math.LN10 + a.e + 1)) : new l(r + "").e, t > l.maxE + 1 || t < l.minE - 1 ? new l(t > 0 ? s / 0 : 0) : (P = false, l.rounding = a.s = 1, r = Math.min(12, (t + "").length), i = Gn(e.times(Ne(a, n + r)), n), i.d && (i = h(i, n + 5, 1), $t(i.d, n, o) && (t = n + 10, i = h(Gn(e.times(Ne(a, t + r)), t), t + 5, 1), +Q(i.d).slice(n + 1, n + 15) + 1 == 1e14 && (i = h(i, n + 1, 0)))), i.s = s, P = true, l.rounding = o, h(i, n, o)); + }; + m.toPrecision = function(e, t) { + var r, n = this, i = n.constructor; + return e === void 0 ? r = be(n, n.e <= i.toExpNeg || n.e >= i.toExpPos) : (oe(e, 1, $e), t === void 0 ? t = i.rounding : oe(t, 0, 8), n = h(new i(n), e, t), r = be(n, e <= n.e || n.e <= i.toExpNeg, e)), n.isNeg() && !n.isZero() ? "-" + r : r; + }; + m.toSignificantDigits = m.toSD = function(e, t) { + var r = this, n = r.constructor; + return e === void 0 ? (e = n.precision, t = n.rounding) : (oe(e, 1, $e), t === void 0 ? t = n.rounding : oe(t, 0, 8)), h(new n(r), e, t); + }; + m.toString = function() { + var e = this, t = e.constructor, r = be(e, e.e <= t.toExpNeg || e.e >= t.toExpPos); + return e.isNeg() && !e.isZero() ? "-" + r : r; + }; + m.truncated = m.trunc = function() { + return h(new this.constructor(this), this.e + 1, 1); + }; + m.valueOf = m.toJSON = function() { + var e = this, t = e.constructor, r = be(e, e.e <= t.toExpNeg || e.e >= t.toExpPos); + return e.isNeg() ? "-" + r : r; + }; + function Q(e) { + var t, r, n, i = e.length - 1, o = "", s = e[0]; + if (i > 0) { + for (o += s, t = 1; t < i; t++) + n = e[t] + "", r = w - n.length, r && (o += Ie(r)), o += n; + s = e[t], n = s + "", r = w - n.length, r && (o += Ie(r)); + } else if (s === 0) + return "0"; + for (; s % 10 === 0; ) + s /= 10; + return o + s; + } + function oe(e, t, r) { + if (e !== ~~e || e < t || e > r) + throw Error(Le + e); + } + function $t(e, t, r, n) { + var i, o, s, a; + for (o = e[0]; o >= 10; o /= 10) + --t; + return --t < 0 ? (t += w, i = 0) : (i = Math.ceil((t + 1) / w), t %= w), o = $(10, w - t), a = e[i] % o | 0, n == null ? t < 3 ? (t == 0 ? a = a / 100 | 0 : t == 1 && (a = a / 10 | 0), s = r < 4 && a == 99999 || r > 3 && a == 49999 || a == 5e4 || a == 0) : s = (r < 4 && a + 1 == o || r > 3 && a + 1 == o / 2) && (e[i + 1] / o / 100 | 0) == $(10, t - 2) - 1 || (a == o / 2 || a == 0) && (e[i + 1] / o / 100 | 0) == 0 : t < 4 ? (t == 0 ? a = a / 1e3 | 0 : t == 1 ? a = a / 100 | 0 : t == 2 && (a = a / 10 | 0), s = (n || r < 4) && a == 9999 || !n && r > 3 && a == 4999) : s = ((n || r < 4) && a + 1 == o || !n && r > 3 && a + 1 == o / 2) && (e[i + 1] / o / 1e3 | 0) == $(10, t - 3) - 1, s; + } + function Tr(e, t, r) { + for (var n, i = [0], o, s = 0, a = e.length; s < a; ) { + for (o = i.length; o--; ) + i[o] *= t; + for (i[0] += Un.indexOf(e.charAt(s++)), n = 0; n < i.length; n++) + i[n] > r - 1 && (i[n + 1] === void 0 && (i[n + 1] = 0), i[n + 1] += i[n] / r | 0, i[n] %= r); + } + return i.reverse(); + } + function Mu(e, t) { + var r, n, i; + if (t.isZero()) + return t; + n = t.d.length, n < 32 ? (r = Math.ceil(n / 3), i = (1 / Rr(4, r)).toString()) : (r = 16, i = "2.3283064365386962890625e-10"), e.precision += r, t = ct(e, 1, t.times(i), new e(1)); + for (var o = r; o--; ) { + var s = t.times(t); + t = s.times(s).minus(s).times(8).plus(1); + } + return e.precision -= r, t; + } + var F = function() { + function e(n, i, o) { + var s, a = 0, l = n.length; + for (n = n.slice(); l--; ) + s = n[l] * i + a, n[l] = s % o | 0, a = s / o | 0; + return a && n.unshift(a), n; + } + function t(n, i, o, s) { + var a, l; + if (o != s) + l = o > s ? 1 : -1; + else + for (a = l = 0; a < o; a++) + if (n[a] != i[a]) { + l = n[a] > i[a] ? 1 : -1; + break; + } + return l; + } + function r(n, i, o, s) { + for (var a = 0; o--; ) + n[o] -= a, a = n[o] < i[o] ? 1 : 0, n[o] = a * s + n[o] - i[o]; + for (; !n[0] && n.length > 1; ) + n.shift(); + } + return function(n, i, o, s, a, l) { + var u, c, p, d, g, y, f, b, E, v, x, M, le, K, Ke, I, J, ve, G, He, Jt = n.constructor, zr = n.s == i.s ? 1 : -1, W = n.d, R = i.d; + if (!W || !W[0] || !R || !R[0]) + return new Jt(!n.s || !i.s || (W ? R && W[0] == R[0] : !R) ? NaN : W && W[0] == 0 || !R ? zr * 0 : zr / 0); + for (l ? (g = 1, c = n.e - i.e) : (l = me, g = w, c = Y(n.e / g) - Y(i.e / g)), G = R.length, J = W.length, E = new Jt(zr), v = E.d = [], p = 0; R[p] == (W[p] || 0); p++) + ; + if (R[p] > (W[p] || 0) && c--, o == null ? (K = o = Jt.precision, s = Jt.rounding) : a ? K = o + (n.e - i.e) + 1 : K = o, K < 0) + v.push(1), y = true; + else { + if (K = K / g + 2 | 0, p = 0, G == 1) { + for (d = 0, R = R[0], K++; (p < J || d) && K--; p++) + Ke = d * l + (W[p] || 0), v[p] = Ke / R | 0, d = Ke % R | 0; + y = d || p < J; + } else { + for (d = l / (R[0] + 1) | 0, d > 1 && (R = e(R, d, l), W = e(W, d, l), G = R.length, J = W.length), I = G, x = W.slice(0, G), M = x.length; M < G; ) + x[M++] = 0; + He = R.slice(), He.unshift(0), ve = R[0], R[1] >= l / 2 && ++ve; + do + d = 0, u = t(R, x, G, M), u < 0 ? (le = x[0], G != M && (le = le * l + (x[1] || 0)), d = le / ve | 0, d > 1 ? (d >= l && (d = l - 1), f = e(R, d, l), b = f.length, M = x.length, u = t(f, x, b, M), u == 1 && (d--, r(f, G < b ? He : R, b, l))) : (d == 0 && (u = d = 1), f = R.slice()), b = f.length, b < M && f.unshift(0), r(x, f, M, l), u == -1 && (M = x.length, u = t(R, x, G, M), u < 1 && (d++, r(x, G < M ? He : R, M, l))), M = x.length) : u === 0 && (d++, x = [0]), v[p++] = d, u && x[0] ? x[M++] = W[I] || 0 : (x = [W[I]], M = 1); + while ((I++ < J || x[0] !== void 0) && K--); + y = x[0] !== void 0; + } + v[0] || v.shift(); + } + if (g == 1) + E.e = c, Xo = y; + else { + for (p = 1, d = v[0]; d >= 10; d /= 10) + p++; + E.e = p + c * g - 1, h(E, a ? o + E.e + 1 : o, s, y); + } + return E; + }; + }(); + function h(e, t, r, n) { + var i, o, s, a, l, u, c, p, d, g = e.constructor; + e: + if (t != null) { + if (p = e.d, !p) + return e; + for (i = 1, a = p[0]; a >= 10; a /= 10) + i++; + if (o = t - i, o < 0) + o += w, s = t, c = p[d = 0], l = c / $(10, i - s - 1) % 10 | 0; + else if (d = Math.ceil((o + 1) / w), a = p.length, d >= a) + if (n) { + for (; a++ <= d; ) + p.push(0); + c = l = 0, i = 1, o %= w, s = o - w + 1; + } else + break e; + else { + for (c = a = p[d], i = 1; a >= 10; a /= 10) + i++; + o %= w, s = o - w + i, l = s < 0 ? 0 : c / $(10, i - s - 1) % 10 | 0; + } + if (n = n || t < 0 || p[d + 1] !== void 0 || (s < 0 ? c : c % $(10, i - s - 1)), u = r < 4 ? (l || n) && (r == 0 || r == (e.s < 0 ? 3 : 2)) : l > 5 || l == 5 && (r == 4 || n || r == 6 && (o > 0 ? s > 0 ? c / $(10, i - s) : 0 : p[d - 1]) % 10 & 1 || r == (e.s < 0 ? 8 : 7)), t < 1 || !p[0]) + return p.length = 0, u ? (t -= e.e + 1, p[0] = $(10, (w - t % w) % w), e.e = -t || 0) : p[0] = e.e = 0, e; + if (o == 0 ? (p.length = d, a = 1, d--) : (p.length = d + 1, a = $(10, w - o), p[d] = s > 0 ? (c / $(10, i - s) % $(10, s) | 0) * a : 0), u) + for (; ; ) + if (d == 0) { + for (o = 1, s = p[0]; s >= 10; s /= 10) + o++; + for (s = p[0] += a, a = 1; s >= 10; s /= 10) + a++; + o != a && (e.e++, p[0] == me && (p[0] = 1)); + break; + } else { + if (p[d] += a, p[d] != me) + break; + p[d--] = 0, a = 1; + } + for (o = p.length; p[--o] === 0; ) + p.pop(); + } + return P && (e.e > g.maxE ? (e.d = null, e.e = NaN) : e.e < g.minE && (e.e = 0, e.d = [0])), e; + } + function be(e, t, r) { + if (!e.isFinite()) + return as(e); + var n, i = e.e, o = Q(e.d), s = o.length; + return t ? (r && (n = r - s) > 0 ? o = o.charAt(0) + "." + o.slice(1) + Ie(n) : s > 1 && (o = o.charAt(0) + "." + o.slice(1)), o = o + (e.e < 0 ? "e" : "e+") + e.e) : i < 0 ? (o = "0." + Ie(-i - 1) + o, r && (n = r - s) > 0 && (o += Ie(n))) : i >= s ? (o += Ie(i + 1 - s), r && (n = r - i - 1) > 0 && (o = o + "." + Ie(n))) : ((n = i + 1) < s && (o = o.slice(0, n) + "." + o.slice(n)), r && (n = r - s) > 0 && (i + 1 === s && (o += "."), o += Ie(n))), o; + } + function Sr(e, t) { + var r = e[0]; + for (t *= w; r >= 10; r /= 10) + t++; + return t; + } + function Mr(e, t, r) { + if (t > Cu) + throw P = true, r && (e.precision = r), Error(es); + return h(new e(vr), t, 1, true); + } + function de(e, t, r) { + if (t > Jn) + throw Error(es); + return h(new e(Cr), t, r, true); + } + function is(e) { + var t = e.length - 1, r = t * w + 1; + if (t = e[t], t) { + for (; t % 10 == 0; t /= 10) + r--; + for (t = e[0]; t >= 10; t /= 10) + r++; + } + return r; + } + function Ie(e) { + for (var t = ""; e--; ) + t += "0"; + return t; + } + function os(e, t, r, n) { + var i, o = new e(1), s = Math.ceil(n / w + 4); + for (P = false; ; ) { + if (r % 2 && (o = o.times(t), Yo(o.d, s) && (i = true)), r = Y(r / 2), r === 0) { + r = o.d.length - 1, i && o.d[r] === 0 && ++o.d[r]; + break; + } + t = t.times(t), Yo(t.d, s); + } + return P = true, o; + } + function zo(e) { + return e.d[e.d.length - 1] & 1; + } + function ss(e, t, r) { + for (var n, i = new e(t[0]), o = 0; ++o < t.length; ) + if (n = new e(t[o]), n.s) + i[r](n) && (i = n); + else { + i = n; + break; + } + return i; + } + function Gn(e, t) { + var r, n, i, o, s, a, l, u = 0, c = 0, p = 0, d = e.constructor, g = d.rounding, y = d.precision; + if (!e.d || !e.d[0] || e.e > 17) + return new d(e.d ? e.d[0] ? e.s < 0 ? 0 : 1 / 0 : 1 : e.s ? e.s < 0 ? 0 : e : 0 / 0); + for (t == null ? (P = false, l = y) : l = t, a = new d(0.03125); e.e > -2; ) + e = e.times(a), p += 5; + for (n = Math.log($(2, p)) / Math.LN10 * 2 + 5 | 0, l += n, r = o = s = new d(1), d.precision = l; ; ) { + if (o = h(o.times(e), l, 1), r = r.times(++c), a = s.plus(F(o, r, l, 1)), Q(a.d).slice(0, l) === Q(s.d).slice(0, l)) { + for (i = p; i--; ) + s = h(s.times(s), l, 1); + if (t == null) + if (u < 3 && $t(s.d, l - n, g, u)) + d.precision = l += 10, r = o = a = new d(1), c = 0, u++; + else + return h(s, d.precision = y, g, P = true); + else + return d.precision = y, s; + } + s = a; + } + } + function Ne(e, t) { + var r, n, i, o, s, a, l, u, c, p, d, g = 1, y = 10, f = e, b = f.d, E = f.constructor, v = E.rounding, x = E.precision; + if (f.s < 0 || !b || !b[0] || !f.e && b[0] == 1 && b.length == 1) + return new E(b && !b[0] ? -1 / 0 : f.s != 1 ? NaN : b ? 0 : f); + if (t == null ? (P = false, c = x) : c = t, E.precision = c += y, r = Q(b), n = r.charAt(0), Math.abs(o = f.e) < 15e14) { + for (; n < 7 && n != 1 || n == 1 && r.charAt(1) > 3; ) + f = f.times(e), r = Q(f.d), n = r.charAt(0), g++; + o = f.e, n > 1 ? (f = new E("0." + r), o++) : f = new E(n + "." + r.slice(1)); + } else + return u = Mr(E, c + 2, x).times(o + ""), f = Ne(new E(n + "." + r.slice(1)), c - y).plus(u), E.precision = x, t == null ? h(f, x, v, P = true) : f; + for (p = f, l = s = f = F(f.minus(1), f.plus(1), c, 1), d = h(f.times(f), c, 1), i = 3; ; ) { + if (s = h(s.times(d), c, 1), u = l.plus(F(s, new E(i), c, 1)), Q(u.d).slice(0, c) === Q(l.d).slice(0, c)) + if (l = l.times(2), o !== 0 && (l = l.plus(Mr(E, c + 2, x).times(o + ""))), l = F(l, new E(g), c, 1), t == null) + if ($t(l.d, c - y, v, a)) + E.precision = c += y, u = s = f = F(p.minus(1), p.plus(1), c, 1), d = h(f.times(f), c, 1), i = a = 1; + else + return h(l, E.precision = x, v, P = true); + else + return E.precision = x, l; + l = u, i += 2; + } + } + function as(e) { + return String(e.s * e.s / 0); + } + function Wn(e, t) { + var r, n, i; + for ((r = t.indexOf(".")) > -1 && (t = t.replace(".", "")), (n = t.search(/e/i)) > 0 ? (r < 0 && (r = n), r += +t.slice(n + 1), t = t.substring(0, n)) : r < 0 && (r = t.length), n = 0; t.charCodeAt(n) === 48; n++) + ; + for (i = t.length; t.charCodeAt(i - 1) === 48; --i) + ; + if (t = t.slice(n, i), t) { + if (i -= n, e.e = r = r - n - 1, e.d = [], n = (r + 1) % w, r < 0 && (n += w), n < i) { + for (n && e.d.push(+t.slice(0, n)), i -= w; n < i; ) + e.d.push(+t.slice(n, n += w)); + t = t.slice(n), n = w - t.length; + } else + n -= i; + for (; n--; ) + t += "0"; + e.d.push(+t), P && (e.e > e.constructor.maxE ? (e.d = null, e.e = NaN) : e.e < e.constructor.minE && (e.e = 0, e.d = [0])); + } else + e.e = 0, e.d = [0]; + return e; + } + function Au(e, t) { + var r, n, i, o, s, a, l, u, c; + if (t.indexOf("_") > -1) { + if (t = t.replace(/(\d)_(?=\d)/g, "$1"), ns.test(t)) + return Wn(e, t); + } else if (t === "Infinity" || t === "NaN") + return +t || (e.s = NaN), e.e = NaN, e.d = null, e; + if (Eu.test(t)) + r = 16, t = t.toLowerCase(); + else if (Pu.test(t)) + r = 2; + else if (Tu.test(t)) + r = 8; + else + throw Error(Le + t); + for (o = t.search(/p/i), o > 0 ? (l = +t.slice(o + 1), t = t.substring(2, o)) : t = t.slice(2), o = t.indexOf("."), s = o >= 0, n = e.constructor, s && (t = t.replace(".", ""), a = t.length, o = a - o, i = os(n, new n(r), o, o * 2)), u = Tr(t, r, me), c = u.length - 1, o = c; u[o] === 0; --o) + u.pop(); + return o < 0 ? new n(e.s * 0) : (e.e = Sr(u, c), e.d = u, P = false, s && (e = F(e, i, a * 4)), l && (e = e.times(Math.abs(l) < 54 ? $(2, l) : We.pow(2, l))), P = true, e); + } + function Su(e, t) { + var r, n = t.d.length; + if (n < 3) + return t.isZero() ? t : ct(e, 2, t, t); + r = 1.4 * Math.sqrt(n), r = r > 16 ? 16 : r | 0, t = t.times(1 / Rr(5, r)), t = ct(e, 2, t, t); + for (var i, o = new e(5), s = new e(16), a = new e(20); r--; ) + i = t.times(t), t = t.times(o.plus(i.times(s.times(i).minus(a)))); + return t; + } + function ct(e, t, r, n, i) { + var o, s, a, l, u = 1, c = e.precision, p = Math.ceil(c / w); + for (P = false, l = r.times(r), a = new e(n); ; ) { + if (s = F(a.times(l), new e(t++ * t++), c, 1), a = i ? n.plus(s) : n.minus(s), n = F(s.times(l), new e(t++ * t++), c, 1), s = a.plus(n), s.d[p] !== void 0) { + for (o = p; s.d[o] === a.d[o] && o--; ) + ; + if (o == -1) + break; + } + o = a, a = n, n = s, s = o, u++; + } + return P = true, s.d.length = p + 1, s; + } + function Rr(e, t) { + for (var r = e; --t; ) + r *= e; + return r; + } + function ls(e, t) { + var r, n = t.s < 0, i = de(e, e.precision, 1), o = i.times(0.5); + if (t = t.abs(), t.lte(o)) + return Se = n ? 4 : 1, t; + if (r = t.divToInt(i), r.isZero()) + Se = n ? 3 : 2; + else { + if (t = t.minus(r.times(i)), t.lte(o)) + return Se = zo(r) ? n ? 2 : 3 : n ? 4 : 1, t; + Se = zo(r) ? n ? 1 : 4 : n ? 3 : 2; + } + return t.minus(i).abs(); + } + function Hn(e, t, r, n) { + var i, o, s, a, l, u, c, p, d, g = e.constructor, y = r !== void 0; + if (y ? (oe(r, 1, $e), n === void 0 ? n = g.rounding : oe(n, 0, 8)) : (r = g.precision, n = g.rounding), !e.isFinite()) + c = as(e); + else { + for (c = be(e), s = c.indexOf("."), y ? (i = 2, t == 16 ? r = r * 4 - 3 : t == 8 && (r = r * 3 - 2)) : i = t, s >= 0 && (c = c.replace(".", ""), d = new g(1), d.e = c.length - s, d.d = Tr(be(d), 10, i), d.e = d.d.length), p = Tr(c, 10, i), o = l = p.length; p[--l] == 0; ) + p.pop(); + if (!p[0]) + c = y ? "0p+0" : "0"; + else { + if (s < 0 ? o-- : (e = new g(e), e.d = p, e.e = o, e = F(e, d, r, n, 0, i), p = e.d, o = e.e, u = Xo), s = p[r], a = i / 2, u = u || p[r + 1] !== void 0, u = n < 4 ? (s !== void 0 || u) && (n === 0 || n === (e.s < 0 ? 3 : 2)) : s > a || s === a && (n === 4 || u || n === 6 && p[r - 1] & 1 || n === (e.s < 0 ? 8 : 7)), p.length = r, u) + for (; ++p[--r] > i - 1; ) + p[r] = 0, r || (++o, p.unshift(1)); + for (l = p.length; !p[l - 1]; --l) + ; + for (s = 0, c = ""; s < l; s++) + c += Un.charAt(p[s]); + if (y) { + if (l > 1) + if (t == 16 || t == 8) { + for (s = t == 16 ? 4 : 3, --l; l % s; l++) + c += "0"; + for (p = Tr(c, i, t), l = p.length; !p[l - 1]; --l) + ; + for (s = 1, c = "1."; s < l; s++) + c += Un.charAt(p[s]); + } else + c = c.charAt(0) + "." + c.slice(1); + c = c + (o < 0 ? "p" : "p+") + o; + } else if (o < 0) { + for (; ++o; ) + c = "0" + c; + c = "0." + c; + } else if (++o > l) + for (o -= l; o--; ) + c += "0"; + else + o < l && (c = c.slice(0, o) + "." + c.slice(o)); + } + c = (t == 16 ? "0x" : t == 2 ? "0b" : t == 8 ? "0o" : "") + c; + } + return e.s < 0 ? "-" + c : c; + } + function Yo(e, t) { + if (e.length > t) + return e.length = t, true; + } + function Ru(e) { + return new this(e).abs(); + } + function Fu(e) { + return new this(e).acos(); + } + function Ou(e) { + return new this(e).acosh(); + } + function ku(e, t) { + return new this(e).plus(t); + } + function Du(e) { + return new this(e).asin(); + } + function _u(e) { + return new this(e).asinh(); + } + function Iu(e) { + return new this(e).atan(); + } + function Nu(e) { + return new this(e).atanh(); + } + function Lu(e, t) { + e = new this(e), t = new this(t); + var r, n = this.precision, i = this.rounding, o = n + 4; + return !e.s || !t.s ? r = new this(NaN) : !e.d && !t.d ? (r = de(this, o, 1).times(t.s > 0 ? 0.25 : 0.75), r.s = e.s) : !t.d || e.isZero() ? (r = t.s < 0 ? de(this, n, i) : new this(0), r.s = e.s) : !e.d || t.isZero() ? (r = de(this, o, 1).times(0.5), r.s = e.s) : t.s < 0 ? (this.precision = o, this.rounding = 1, r = this.atan(F(e, t, o, 1)), t = de(this, o, 1), this.precision = n, this.rounding = i, r = e.s < 0 ? r.minus(t) : r.plus(t)) : r = this.atan(F(e, t, o, 1)), r; + } + function $u(e) { + return new this(e).cbrt(); + } + function qu(e) { + return h(e = new this(e), e.e + 1, 2); + } + function ju(e, t, r) { + return new this(e).clamp(t, r); + } + function Bu(e) { + if (!e || typeof e != "object") + throw Error(Ar + "Object expected"); + var t, r, n, i = e.defaults === true, o = ["precision", 1, $e, "rounding", 0, 8, "toExpNeg", -ut, 0, "toExpPos", 0, ut, "maxE", 0, ut, "minE", -ut, 0, "modulo", 0, 9]; + for (t = 0; t < o.length; t += 3) + if (r = o[t], i && (this[r] = Qn[r]), (n = e[r]) !== void 0) + if (Y(n) === n && n >= o[t + 1] && n <= o[t + 2]) + this[r] = n; + else + throw Error(Le + r + ": " + n); + if (r = "crypto", i && (this[r] = Qn[r]), (n = e[r]) !== void 0) + if (n === true || n === false || n === 0 || n === 1) + if (n) + if (typeof crypto < "u" && crypto && (crypto.getRandomValues || crypto.randomBytes)) + this[r] = true; + else + throw Error(ts); + else + this[r] = false; + else + throw Error(Le + r + ": " + n); + return this; + } + function Ku(e) { + return new this(e).cos(); + } + function Vu(e) { + return new this(e).cosh(); + } + function us(e) { + var t, r, n; + function i(o) { + var s, a, l, u = this; + if (!(u instanceof i)) + return new i(o); + if (u.constructor = i, Zo(o)) { + u.s = o.s, P ? !o.d || o.e > i.maxE ? (u.e = NaN, u.d = null) : o.e < i.minE ? (u.e = 0, u.d = [0]) : (u.e = o.e, u.d = o.d.slice()) : (u.e = o.e, u.d = o.d ? o.d.slice() : o.d); + return; + } + if (l = typeof o, l === "number") { + if (o === 0) { + u.s = 1 / o < 0 ? -1 : 1, u.e = 0, u.d = [0]; + return; + } + if (o < 0 ? (o = -o, u.s = -1) : u.s = 1, o === ~~o && o < 1e7) { + for (s = 0, a = o; a >= 10; a /= 10) + s++; + P ? s > i.maxE ? (u.e = NaN, u.d = null) : s < i.minE ? (u.e = 0, u.d = [0]) : (u.e = s, u.d = [o]) : (u.e = s, u.d = [o]); + return; + } else if (o * 0 !== 0) { + o || (u.s = NaN), u.e = NaN, u.d = null; + return; + } + return Wn(u, o.toString()); + } else if (l !== "string") + throw Error(Le + o); + return (a = o.charCodeAt(0)) === 45 ? (o = o.slice(1), u.s = -1) : (a === 43 && (o = o.slice(1)), u.s = 1), ns.test(o) ? Wn(u, o) : Au(u, o); + } + if (i.prototype = m, i.ROUND_UP = 0, i.ROUND_DOWN = 1, i.ROUND_CEIL = 2, i.ROUND_FLOOR = 3, i.ROUND_HALF_UP = 4, i.ROUND_HALF_DOWN = 5, i.ROUND_HALF_EVEN = 6, i.ROUND_HALF_CEIL = 7, i.ROUND_HALF_FLOOR = 8, i.EUCLID = 9, i.config = i.set = Bu, i.clone = us, i.isDecimal = Zo, i.abs = Ru, i.acos = Fu, i.acosh = Ou, i.add = ku, i.asin = Du, i.asinh = _u, i.atan = Iu, i.atanh = Nu, i.atan2 = Lu, i.cbrt = $u, i.ceil = qu, i.clamp = ju, i.cos = Ku, i.cosh = Vu, i.div = Uu, i.exp = Qu, i.floor = Ju, i.hypot = Gu, i.ln = Wu, i.log = Hu, i.log10 = Yu, i.log2 = zu, i.max = Zu, i.min = Xu, i.mod = ec, i.mul = tc, i.pow = rc, i.random = nc, i.round = ic, i.sign = oc, i.sin = sc, i.sinh = ac, i.sqrt = lc, i.sub = uc, i.sum = cc, i.tan = pc, i.tanh = dc, i.trunc = mc, e === void 0 && (e = {}), e && e.defaults !== true) + for (n = ["precision", "rounding", "toExpNeg", "toExpPos", "maxE", "minE", "modulo", "crypto"], t = 0; t < n.length; ) + e.hasOwnProperty(r = n[t++]) || (e[r] = this[r]); + return i.config(e), i; + } + function Uu(e, t) { + return new this(e).div(t); + } + function Qu(e) { + return new this(e).exp(); + } + function Ju(e) { + return h(e = new this(e), e.e + 1, 3); + } + function Gu() { + var e, t, r = new this(0); + for (P = false, e = 0; e < arguments.length; ) + if (t = new this(arguments[e++]), t.d) + r.d && (r = r.plus(t.times(t))); + else { + if (t.s) + return P = true, new this(1 / 0); + r = t; + } + return P = true, r.sqrt(); + } + function Zo(e) { + return e instanceof We || e && e.toStringTag === rs || false; + } + function Wu(e) { + return new this(e).ln(); + } + function Hu(e, t) { + return new this(e).log(t); + } + function zu(e) { + return new this(e).log(2); + } + function Yu(e) { + return new this(e).log(10); + } + function Zu() { + return ss(this, arguments, "lt"); + } + function Xu() { + return ss(this, arguments, "gt"); + } + function ec(e, t) { + return new this(e).mod(t); + } + function tc(e, t) { + return new this(e).mul(t); + } + function rc(e, t) { + return new this(e).pow(t); + } + function nc(e) { + var t, r, n, i, o = 0, s = new this(1), a = []; + if (e === void 0 ? e = this.precision : oe(e, 1, $e), n = Math.ceil(e / w), this.crypto) + if (crypto.getRandomValues) + for (t = crypto.getRandomValues(new Uint32Array(n)); o < n; ) + i = t[o], i >= 429e7 ? t[o] = crypto.getRandomValues(new Uint32Array(1))[0] : a[o++] = i % 1e7; + else if (crypto.randomBytes) { + for (t = crypto.randomBytes(n *= 4); o < n; ) + i = t[o] + (t[o + 1] << 8) + (t[o + 2] << 16) + ((t[o + 3] & 127) << 24), i >= 214e7 ? crypto.randomBytes(4).copy(t, o) : (a.push(i % 1e7), o += 4); + o = n / 4; + } else + throw Error(ts); + else + for (; o < n; ) + a[o++] = Math.random() * 1e7 | 0; + for (n = a[--o], e %= w, n && e && (i = $(10, w - e), a[o] = (n / i | 0) * i); a[o] === 0; o--) + a.pop(); + if (o < 0) + r = 0, a = [0]; + else { + for (r = -1; a[0] === 0; r -= w) + a.shift(); + for (n = 1, i = a[0]; i >= 10; i /= 10) + n++; + n < w && (r -= w - n); + } + return s.e = r, s.d = a, s; + } + function ic(e) { + return h(e = new this(e), e.e + 1, this.rounding); + } + function oc(e) { + return e = new this(e), e.d ? e.d[0] ? e.s : 0 * e.s : e.s || NaN; + } + function sc(e) { + return new this(e).sin(); + } + function ac(e) { + return new this(e).sinh(); + } + function lc(e) { + return new this(e).sqrt(); + } + function uc(e, t) { + return new this(e).sub(t); + } + function cc() { + var e = 0, t = arguments, r = new this(t[e]); + for (P = false; r.s && ++e < t.length; ) + r = r.plus(t[e]); + return P = true, h(r, this.precision, this.rounding); + } + function pc(e) { + return new this(e).tan(); + } + function dc(e) { + return new this(e).tanh(); + } + function mc(e) { + return h(e = new this(e), e.e + 1, 1); + } + m[Symbol.for("nodejs.util.inspect.custom")] = m.toString; + m[Symbol.toStringTag] = "Decimal"; + var We = m.constructor = us(Qn); + vr = new We(vr); + Cr = new We(Cr); + var we = We; + function pt(e) { + return We.isDecimal(e) ? true : e !== null && typeof e == "object" && typeof e.s == "number" && typeof e.e == "number" && typeof e.toFixed == "function" && Array.isArray(e.d); + } + var qt = class { + constructor(t, r, n, i, o) { + this.modelName = t, this.name = r, this.typeName = n, this.isList = i, this.isEnum = o; + } + _toGraphQLInputType() { + let t = this.isList ? "List" : "", r = this.isEnum ? "Enum" : ""; + return `${t}${r}${this.typeName}FieldRefInput<${this.modelName}>`; + } + }; + function dt(e) { + return e instanceof qt; + } + var Fr = (e) => e; + var Or = { bold: Fr, red: Fr, green: Fr, dim: Fr }; + var cs = { bold: ne, red: pe, green: Ue, dim: Oe }; + var mt = { write(e) { + e.writeLine(","); + } }; + var Pe = class { + constructor(t) { + this.contents = t; + this.isUnderlined = false; + this.color = (t2) => t2; + } + underline() { + return this.isUnderlined = true, this; + } + setColor(t) { + return this.color = t, this; + } + write(t) { + let r = t.getCurrentLineLength(); + t.write(this.color(this.contents)), this.isUnderlined && t.afterNextNewline(() => { + t.write(" ".repeat(r)).writeLine(this.color("~".repeat(this.contents.length))); + }); + } + }; + var qe = class { + constructor() { + this.hasError = false; + } + markAsError() { + return this.hasError = true, this; + } + }; + var kr = class extends qe { + constructor() { + super(...arguments); + this.items = []; + } + addItem(r) { + return this.items.push(r), this; + } + getPrintWidth() { + return this.items.length === 0 ? 2 : Math.max(...this.items.map((n) => n.getPrintWidth())) + 2; + } + write(r) { + if (this.items.length === 0) { + this.writeEmpty(r); + return; + } + this.writeWithItems(r); + } + writeEmpty(r) { + let n = new Pe("[]"); + this.hasError && n.setColor(r.context.colors.red).underline(), r.write(n); + } + writeWithItems(r) { + let { colors: n } = r.context; + r.writeLine("[").withIndent(() => r.writeJoined(mt, this.items).newLine()).write("]"), this.hasError && r.afterNextNewline(() => { + r.writeLine(n.red("~".repeat(this.getPrintWidth()))); + }); + } + }; + var ps = ": "; + var Dr = class { + constructor(t, r) { + this.name = t; + this.value = r; + this.hasError = false; + } + markAsError() { + this.hasError = true; + } + getPrintWidth() { + return this.name.length + this.value.getPrintWidth() + ps.length; + } + write(t) { + let r = new Pe(this.name); + this.hasError && r.underline().setColor(t.context.colors.red), t.write(r).write(ps).write(this.value); + } + }; + var D = class extends qe { + constructor() { + super(...arguments); + this.fields = {}; + this.suggestions = []; + } + addField(r) { + this.fields[r.name] = r; + } + addSuggestion(r) { + this.suggestions.push(r); + } + getField(r) { + return this.fields[r]; + } + getDeepField(r) { + let [n, ...i] = r, o = this.getField(n); + if (!o) + return; + let s = o; + for (let a of i) { + if (!(s.value instanceof D)) + return; + let l = s.value.getField(a); + if (!l) + return; + s = l; + } + return s; + } + getDeepFieldValue(r) { + return r.length === 0 ? this : this.getDeepField(r)?.value; + } + hasField(r) { + return Boolean(this.getField(r)); + } + removeAllFields() { + this.fields = {}; + } + removeField(r) { + delete this.fields[r]; + } + getFields() { + return this.fields; + } + isEmpty() { + return Object.keys(this.fields).length === 0; + } + getFieldValue(r) { + return this.getField(r)?.value; + } + getDeepSubSelectionValue(r) { + let n = this; + for (let i of r) { + if (!(n instanceof D)) + return; + let o = n.getSubSelectionValue(i); + if (!o) + return; + n = o; + } + return n; + } + getDeepSelectionParent(r) { + let n = this.getSelectionParent(); + if (!n) + return; + let i = n; + for (let o of r) { + let s = i.value.getFieldValue(o); + if (!s || !(s instanceof D)) + return; + let a = s.getSelectionParent(); + if (!a) + return; + i = a; + } + return i; + } + getSelectionParent() { + let r = this.getField("select"); + if (r?.value instanceof D) + return { kind: "select", value: r.value }; + let n = this.getField("include"); + if (n?.value instanceof D) + return { kind: "include", value: n.value }; + } + getSubSelectionValue(r) { + return this.getSelectionParent()?.value.fields[r].value; + } + getPrintWidth() { + let r = Object.values(this.fields); + return r.length == 0 ? 2 : Math.max(...r.map((i) => i.getPrintWidth())) + 2; + } + write(r) { + let n = Object.values(this.fields); + if (n.length === 0 && this.suggestions.length === 0) { + this.writeEmpty(r); + return; + } + this.writeWithContents(r, n); + } + writeEmpty(r) { + let n = new Pe("{}"); + this.hasError && n.setColor(r.context.colors.red).underline(), r.write(n); + } + writeWithContents(r, n) { + r.writeLine("{").withIndent(() => { + r.writeJoined(mt, [...n, ...this.suggestions]).newLine(); + }), r.write("}"), this.hasError && r.afterNextNewline(() => { + r.writeLine(r.context.colors.red("~".repeat(this.getPrintWidth()))); + }); + } + }; + var j = class extends qe { + constructor(r) { + super(); + this.text = r; + } + getPrintWidth() { + return this.text.length; + } + write(r) { + let n = new Pe(this.text); + this.hasError && n.underline().setColor(r.context.colors.red), r.write(n); + } + }; + var zn = class { + constructor(t) { + this.errorMessages = []; + this.arguments = t; + } + write(t) { + t.write(this.arguments); + } + addErrorMessage(t) { + this.errorMessages.push(t); + } + renderAllMessages(t) { + return this.errorMessages.map((r) => r(t)).join(` +`); + } + }; + function _r(e) { + return new zn(ds(e)); + } + function ds(e) { + let t = new D(); + for (let [r, n] of Object.entries(e)) { + let i = new Dr(r, ms(n)); + t.addField(i); + } + return t; + } + function ms(e) { + if (typeof e == "string") + return new j(JSON.stringify(e)); + if (typeof e == "number" || typeof e == "boolean") + return new j(String(e)); + if (typeof e == "bigint") + return new j(`${e}n`); + if (e === null) + return new j("null"); + if (e === void 0) + return new j("undefined"); + if (pt(e)) + return new j(`new Prisma.Decimal("${e.toFixed()}")`); + if (e instanceof Uint8Array) + return Buffer.isBuffer(e) ? new j(`Buffer.alloc(${e.byteLength})`) : new j(`new Uint8Array(${e.byteLength})`); + if (e instanceof Date) { + let t = Er(e) ? e.toISOString() : "Invalid Date"; + return new j(`new Date("${t}")`); + } + return e instanceof Ae ? new j(`Prisma.${e._getName()}`) : dt(e) ? new j(`prisma.${wi(e.modelName)}.$fields.${e.name}`) : Array.isArray(e) ? gc(e) : typeof e == "object" ? ds(e) : new j(Object.prototype.toString.call(e)); + } + function gc(e) { + let t = new kr(); + for (let r of e) + t.addItem(ms(r)); + return t; + } + function fs(e) { + if (e === void 0) + return ""; + let t = _r(e); + return new at(0, { colors: Or }).write(t).toString(); + } + var jt = ""; + function gs(e) { + var t = e.split(` +`); + return t.reduce(function(r, n) { + var i = xc(n) || wc(n) || Tc(n) || Ac(n) || Cc(n); + return i && r.push(i), r; + }, []); + } + var yc = /^\s*at (.*?) ?\(((?:file|https?|blob|chrome-extension|native|eval|webpack||\/|[a-z]:\\|\\\\).*?)(?::(\d+))?(?::(\d+))?\)?\s*$/i; + var hc = /\((\S*)(?::(\d+))(?::(\d+))\)/; + function xc(e) { + var t = yc.exec(e); + if (!t) + return null; + var r = t[2] && t[2].indexOf("native") === 0, n = t[2] && t[2].indexOf("eval") === 0, i = hc.exec(t[2]); + return n && i != null && (t[2] = i[1], t[3] = i[2], t[4] = i[3]), { file: r ? null : t[2], methodName: t[1] || jt, arguments: r ? [t[2]] : [], lineNumber: t[3] ? +t[3] : null, column: t[4] ? +t[4] : null }; + } + var bc = /^\s*at (?:((?:\[object object\])?.+) )?\(?((?:file|ms-appx|https?|webpack|blob):.*?):(\d+)(?::(\d+))?\)?\s*$/i; + function wc(e) { + var t = bc.exec(e); + return t ? { file: t[2], methodName: t[1] || jt, arguments: [], lineNumber: +t[3], column: t[4] ? +t[4] : null } : null; + } + var Pc = /^\s*(.*?)(?:\((.*?)\))?(?:^|@)((?:file|https?|blob|chrome|webpack|resource|\[native).*?|[^@]*bundle)(?::(\d+))?(?::(\d+))?\s*$/i; + var Ec = /(\S+) line (\d+)(?: > eval line \d+)* > eval/i; + function Tc(e) { + var t = Pc.exec(e); + if (!t) + return null; + var r = t[3] && t[3].indexOf(" > eval") > -1, n = Ec.exec(t[3]); + return r && n != null && (t[3] = n[1], t[4] = n[2], t[5] = null), { file: t[3], methodName: t[1] || jt, arguments: t[2] ? t[2].split(",") : [], lineNumber: t[4] ? +t[4] : null, column: t[5] ? +t[5] : null }; + } + var vc = /^\s*(?:([^@]*)(?:\((.*?)\))?@)?(\S.*?):(\d+)(?::(\d+))?\s*$/i; + function Cc(e) { + var t = vc.exec(e); + return t ? { file: t[3], methodName: t[1] || jt, arguments: [], lineNumber: +t[4], column: t[5] ? +t[5] : null } : null; + } + var Mc = /^\s*at (?:((?:\[object object\])?[^\\/]+(?: \[as \S+\])?) )?\(?(.*?):(\d+)(?::(\d+))?\)?\s*$/i; + function Ac(e) { + var t = Mc.exec(e); + return t ? { file: t[2], methodName: t[1] || jt, arguments: [], lineNumber: +t[3], column: t[4] ? +t[4] : null } : null; + } + var Yn = class { + getLocation() { + return null; + } + }; + var Zn = class { + constructor() { + this._error = new Error(); + } + getLocation() { + let t = this._error.stack; + if (!t) + return null; + let n = gs(t).find((i) => { + if (!i.file) + return false; + let o = Mn(i.file); + return o !== "" && !o.includes("@prisma") && !o.includes("/packages/client/src/runtime/") && !o.endsWith("/runtime/binary.js") && !o.endsWith("/runtime/library.js") && !o.endsWith("/runtime/data-proxy.js") && !o.endsWith("/runtime/edge.js") && !o.endsWith("/runtime/edge-esm.js") && !o.startsWith("internal/") && !i.methodName.includes("new ") && !i.methodName.includes("getCallSite") && !i.methodName.includes("Proxy.") && i.methodName.split(".").length < 4; + }); + return !n || !n.file ? null : { fileName: n.file, lineNumber: n.lineNumber, columnNumber: n.column }; + } + }; + function je(e) { + return e === "minimal" ? new Yn() : new Zn(); + } + var ys = { _avg: true, _count: true, _sum: true, _min: true, _max: true }; + function ft(e = {}) { + let t = Rc(e); + return Object.entries(t).reduce((n, [i, o]) => (ys[i] !== void 0 ? n.select[i] = { select: o } : n[i] = o, n), { select: {} }); + } + function Rc(e = {}) { + return typeof e._count == "boolean" ? { ...e, _count: { _all: e._count } } : e; + } + function Ir(e = {}) { + return (t) => (typeof e._count == "boolean" && (t._count = t._count._all), t); + } + function hs(e, t) { + let r = Ir(e); + return t({ action: "aggregate", unpacker: r, argsMapper: ft })(e); + } + function Fc(e = {}) { + let { select: t, ...r } = e; + return typeof t == "object" ? ft({ ...r, _count: t }) : ft({ ...r, _count: { _all: true } }); + } + function Oc(e = {}) { + return typeof e.select == "object" ? (t) => Ir(e)(t)._count : (t) => Ir(e)(t)._count._all; + } + function xs(e, t) { + return t({ action: "count", unpacker: Oc(e), argsMapper: Fc })(e); + } + function kc(e = {}) { + let t = ft(e); + if (Array.isArray(t.by)) + for (let r of t.by) + typeof r == "string" && (t.select[r] = true); + else + typeof t.by == "string" && (t.select[t.by] = true); + return t; + } + function Dc(e = {}) { + return (t) => (typeof e?._count == "boolean" && t.forEach((r) => { + r._count = r._count._all; + }), t); + } + function bs(e, t) { + return t({ action: "groupBy", unpacker: Dc(e), argsMapper: kc })(e); + } + function ws(e, t, r) { + if (t === "aggregate") + return (n) => hs(n, r); + if (t === "count") + return (n) => xs(n, r); + if (t === "groupBy") + return (n) => bs(n, r); + } + function Ps(e, t) { + let r = t.fields.filter((i) => !i.relationName), n = Dn(r, (i) => i.name); + return new Proxy({}, { get(i, o) { + if (o in i || typeof o == "symbol") + return i[o]; + let s = n[o]; + if (s) + return new qt(e, o, s.type, s.isList, s.kind === "enum"); + }, ...gr(Object.keys(n)) }); + } + var Es = (e) => Array.isArray(e) ? e : e.split("."); + var Xn = (e, t) => Es(t).reduce((r, n) => r && r[n], e); + var Ts = (e, t, r) => Es(t).reduceRight((n, i, o, s) => Object.assign({}, Xn(e, s.slice(0, o)), { [i]: n }), r); + function _c(e, t) { + return e === void 0 || t === void 0 ? [] : [...t, "select", e]; + } + function Ic(e, t, r) { + return t === void 0 ? e ?? {} : Ts(t, r, e || true); + } + function ei(e, t, r, n, i, o) { + let a = e._runtimeDataModel.models[t].fields.reduce((l, u) => ({ ...l, [u.name]: u }), {}); + return (l) => { + let u = je(e._errorFormat), c = _c(n, i), p = Ic(l, o, c), d = r({ dataPath: c, callsite: u })(p), g = Nc(e, t); + return new Proxy(d, { get(y, f) { + if (!g.includes(f)) + return y[f]; + let E = [a[f].type, r, f], v = [c, p]; + return ei(e, ...E, ...v); + }, ...gr([...g, ...Object.getOwnPropertyNames(d)]) }); + }; + } + function Nc(e, t) { + return e._runtimeDataModel.models[t].fields.filter((r) => r.kind === "object").map((r) => r.name); + } + var Rs = A(An()); + var Ss = A(require("fs")); + var vs = { keyword: ke, entity: ke, value: (e) => ne(Xe(e)), punctuation: Xe, directive: ke, function: ke, variable: (e) => ne(Xe(e)), string: (e) => ne(Ue(e)), boolean: ye, number: ke, comment: rr }; + var Lc = (e) => e; + var Nr = {}; + var $c = 0; + var T = { manual: Nr.Prism && Nr.Prism.manual, disableWorkerMessageHandler: Nr.Prism && Nr.Prism.disableWorkerMessageHandler, util: { encode: function(e) { + if (e instanceof fe) { + let t = e; + return new fe(t.type, T.util.encode(t.content), t.alias); + } else + return Array.isArray(e) ? e.map(T.util.encode) : e.replace(/&/g, "&").replace(/ e.length) + return; + if (ve instanceof fe) + continue; + if (le && I != t.length - 1) { + v.lastIndex = J; + var p = v.exec(e); + if (!p) + break; + var c = p.index + (M ? p[1].length : 0), d = p.index + p[0].length, a = I, l = J; + for (let R = t.length; a < R && (l < d || !t[a].type && !t[a - 1].greedy); ++a) + l += t[a].length, c >= l && (++I, J = l); + if (t[I] instanceof fe) + continue; + u = a - I, ve = e.slice(J, l), p.index -= J; + } else { + v.lastIndex = 0; + var p = v.exec(ve), u = 1; + } + if (!p) { + if (o) + break; + continue; + } + M && (K = p[1] ? p[1].length : 0); + var c = p.index + K, p = p[0].slice(K), d = c + p.length, g = ve.slice(0, c), y = ve.slice(d); + let G = [I, u]; + g && (++I, J += g.length, G.push(g)); + let He = new fe(f, x ? T.tokenize(p, x) : p, Ke, p, le); + if (G.push(He), y && G.push(y), Array.prototype.splice.apply(t, G), u != 1 && T.matchGrammar(e, t, r, I, J, true, f), o) + break; + } + } + } + }, tokenize: function(e, t) { + let r = [e], n = t.rest; + if (n) { + for (let i in n) + t[i] = n[i]; + delete t.rest; + } + return T.matchGrammar(e, r, t, 0, 0, false), r; + }, hooks: { all: {}, add: function(e, t) { + let r = T.hooks.all; + r[e] = r[e] || [], r[e].push(t); + }, run: function(e, t) { + let r = T.hooks.all[e]; + if (!(!r || !r.length)) + for (var n = 0, i; i = r[n++]; ) + i(t); + } }, Token: fe }; + T.languages.clike = { comment: [{ pattern: /(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/, lookbehind: true }, { pattern: /(^|[^\\:])\/\/.*/, lookbehind: true, greedy: true }], string: { pattern: /(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/, greedy: true }, "class-name": { pattern: /((?:\b(?:class|interface|extends|implements|trait|instanceof|new)\s+)|(?:catch\s+\())[\w.\\]+/i, lookbehind: true, inside: { punctuation: /[.\\]/ } }, keyword: /\b(?:if|else|while|do|for|return|in|instanceof|function|new|try|throw|catch|finally|null|break|continue)\b/, boolean: /\b(?:true|false)\b/, function: /\w+(?=\()/, number: /\b0x[\da-f]+\b|(?:\b\d+\.?\d*|\B\.\d+)(?:e[+-]?\d+)?/i, operator: /--?|\+\+?|!=?=?|<=?|>=?|==?=?|&&?|\|\|?|\?|\*|\/|~|\^|%/, punctuation: /[{}[\];(),.:]/ }; + T.languages.javascript = T.languages.extend("clike", { "class-name": [T.languages.clike["class-name"], { pattern: /(^|[^$\w\xA0-\uFFFF])[_$A-Z\xA0-\uFFFF][$\w\xA0-\uFFFF]*(?=\.(?:prototype|constructor))/, lookbehind: true }], keyword: [{ pattern: /((?:^|})\s*)(?:catch|finally)\b/, lookbehind: true }, { pattern: /(^|[^.])\b(?:as|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/, lookbehind: true }], number: /\b(?:(?:0[xX](?:[\dA-Fa-f](?:_[\dA-Fa-f])?)+|0[bB](?:[01](?:_[01])?)+|0[oO](?:[0-7](?:_[0-7])?)+)n?|(?:\d(?:_\d)?)+n|NaN|Infinity)\b|(?:\b(?:\d(?:_\d)?)+\.?(?:\d(?:_\d)?)*|\B\.(?:\d(?:_\d)?)+)(?:[Ee][+-]?(?:\d(?:_\d)?)+)?/, function: /[_$a-zA-Z\xA0-\uFFFF][$\w\xA0-\uFFFF]*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/, operator: /-[-=]?|\+[+=]?|!=?=?|<>?>?=?|=(?:==?|>)?|&[&=]?|\|[|=]?|\*\*?=?|\/=?|~|\^=?|%=?|\?|\.{3}/ }); + T.languages.javascript["class-name"][0].pattern = /(\b(?:class|interface|extends|implements|instanceof|new)\s+)[\w.\\]+/; + T.languages.insertBefore("javascript", "keyword", { regex: { pattern: /((?:^|[^$\w\xA0-\uFFFF."'\])\s])\s*)\/(\[(?:[^\]\\\r\n]|\\.)*]|\\.|[^/\\\[\r\n])+\/[gimyus]{0,6}(?=\s*($|[\r\n,.;})\]]))/, lookbehind: true, greedy: true }, "function-variable": { pattern: /[_$a-zA-Z\xA0-\uFFFF][$\w\xA0-\uFFFF]*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|[_$a-zA-Z\xA0-\uFFFF][$\w\xA0-\uFFFF]*)\s*=>))/, alias: "function" }, parameter: [{ pattern: /(function(?:\s+[_$A-Za-z\xA0-\uFFFF][$\w\xA0-\uFFFF]*)?\s*\(\s*)(?!\s)(?:[^()]|\([^()]*\))+?(?=\s*\))/, lookbehind: true, inside: T.languages.javascript }, { pattern: /[_$a-z\xA0-\uFFFF][$\w\xA0-\uFFFF]*(?=\s*=>)/i, inside: T.languages.javascript }, { pattern: /(\(\s*)(?!\s)(?:[^()]|\([^()]*\))+?(?=\s*\)\s*=>)/, lookbehind: true, inside: T.languages.javascript }, { pattern: /((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:[_$A-Za-z\xA0-\uFFFF][$\w\xA0-\uFFFF]*\s*)\(\s*)(?!\s)(?:[^()]|\([^()]*\))+?(?=\s*\)\s*\{)/, lookbehind: true, inside: T.languages.javascript }], constant: /\b[A-Z](?:[A-Z_]|\dx?)*\b/ }); + T.languages.markup && T.languages.markup.tag.addInlined("script", "javascript"); + T.languages.js = T.languages.javascript; + T.languages.typescript = T.languages.extend("javascript", { keyword: /\b(?:abstract|as|async|await|break|case|catch|class|const|constructor|continue|debugger|declare|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|is|keyof|let|module|namespace|new|null|of|package|private|protected|public|readonly|return|require|set|static|super|switch|this|throw|try|type|typeof|var|void|while|with|yield)\b/, builtin: /\b(?:string|Function|any|number|boolean|Array|symbol|console|Promise|unknown|never)\b/ }); + T.languages.ts = T.languages.typescript; + function fe(e, t, r, n, i) { + this.type = e, this.content = t, this.alias = r, this.length = (n || "").length | 0, this.greedy = !!i; + } + fe.stringify = function(e, t) { + return typeof e == "string" ? e : Array.isArray(e) ? e.map(function(r) { + return fe.stringify(r, t); + }).join("") : qc(e.type)(e.content); + }; + function qc(e) { + return vs[e] || Lc; + } + function Cs(e) { + return jc(e, T.languages.javascript); + } + function jc(e, t) { + return T.tokenize(e, t).map((n) => fe.stringify(n)).join(""); + } + var Ms = A(mo()); + function As(e) { + return (0, Ms.default)(e); + } + var ge = class { + static read(t) { + let r; + try { + r = Ss.default.readFileSync(t, "utf-8"); + } catch { + return null; + } + return ge.fromContent(r); + } + static fromContent(t) { + let r = t.split(/\r?\n/); + return new ge(1, r); + } + constructor(t, r) { + this.firstLineNumber = t, this.lines = r; + } + get lastLineNumber() { + return this.firstLineNumber + this.lines.length - 1; + } + mapLineAt(t, r) { + if (t < this.firstLineNumber || t > this.lines.length + this.firstLineNumber) + return this; + let n = t - this.firstLineNumber, i = [...this.lines]; + return i[n] = r(i[n]), new ge(this.firstLineNumber, i); + } + mapLines(t) { + return new ge(this.firstLineNumber, this.lines.map((r, n) => t(r, this.firstLineNumber + n))); + } + lineAt(t) { + return this.lines[t - this.firstLineNumber]; + } + prependSymbolAt(t, r) { + return this.mapLines((n, i) => i === t ? `${r} ${n}` : ` ${n}`); + } + slice(t, r) { + let n = this.lines.slice(t - 1, r).join(` +`); + return new ge(t, As(n).split(` +`)); + } + highlight() { + let t = Cs(this.toString()); + return new ge(this.firstLineNumber, t.split(` +`)); + } + toString() { + return this.lines.join(` +`); + } + }; + var Bc = { red: pe, gray: rr, dim: Oe, bold: ne, underline: X, highlightSource: (e) => e.highlight() }; + var Kc = { red: (e) => e, gray: (e) => e, dim: (e) => e, bold: (e) => e, underline: (e) => e, highlightSource: (e) => e }; + function Vc({ callsite: e, message: t, originalMethod: r, isPanic: n, callArguments: i }, o) { + let s = { functionName: `prisma.${r}()`, message: t, isPanic: n ?? false, callArguments: i }; + if (!e || typeof window < "u" || process.env.NODE_ENV === "production") + return s; + let a = e.getLocation(); + if (!a || !a.lineNumber || !a.columnNumber) + return s; + let l = Math.max(1, a.lineNumber - 3), u = ge.read(a.fileName)?.slice(l, a.lineNumber), c = u?.lineAt(a.lineNumber); + if (u && c) { + let p = Qc(c), d = Uc(c); + if (!d) + return s; + s.functionName = `${d.code})`, s.location = a, n || (u = u.mapLineAt(a.lineNumber, (y) => y.slice(0, d.openingBraceIndex))), u = o.highlightSource(u); + let g = String(u.lastLineNumber).length; + if (s.contextLines = u.mapLines((y, f) => o.gray(String(f).padStart(g)) + " " + y).mapLines((y) => o.dim(y)).prependSymbolAt(a.lineNumber, o.bold(o.red("\u2192"))), i) { + let y = p + g + 1; + y += 2, s.callArguments = (0, Rs.default)(i, y).slice(y); + } + } + return s; + } + function Uc(e) { + let t = Object.keys(ue.ModelAction).join("|"), n = new RegExp(String.raw`\.(${t})\(`).exec(e); + if (n) { + let i = n.index + n[0].length, o = e.lastIndexOf(" ", n.index) + 1; + return { code: e.slice(o, i), openingBraceIndex: i }; + } + return null; + } + function Qc(e) { + let t = 0; + for (let r = 0; r < e.length; r++) { + if (e.charAt(r) !== " ") + return t; + t++; + } + return t; + } + function Jc({ functionName: e, location: t, message: r, isPanic: n, contextLines: i, callArguments: o }, s) { + let a = [""], l = t ? " in" : ":"; + if (n ? (a.push(s.red(`Oops, an unknown error occurred! This is ${s.bold("on us")}, you did nothing wrong.`)), a.push(s.red(`It occurred in the ${s.bold(`\`${e}\``)} invocation${l}`))) : a.push(s.red(`Invalid ${s.bold(`\`${e}\``)} invocation${l}`)), t && a.push(s.underline(Gc(t))), i) { + a.push(""); + let u = [i.toString()]; + o && (u.push(o), u.push(s.dim(")"))), a.push(u.join("")), o && a.push(""); + } else + a.push(""), o && a.push(o), a.push(""); + return a.push(r), a.join(` +`); + } + function Gc(e) { + let t = [e.fileName]; + return e.lineNumber && t.push(String(e.lineNumber)), e.columnNumber && t.push(String(e.columnNumber)), t.join(":"); + } + function gt(e) { + let t = e.showColors ? Bc : Kc, r = Vc(e, t); + return Jc(r, t); + } + function Fs(e, t, r, n) { + return e === ue.ModelAction.findFirstOrThrow || e === ue.ModelAction.findUniqueOrThrow ? Wc(t, r, n) : n; + } + function Wc(e, t, r) { + return async (n) => { + if ("rejectOnNotFound" in n.args) { + let o = gt({ originalMethod: n.clientMethod, callsite: n.callsite, message: "'rejectOnNotFound' option is not supported" }); + throw new te(o, { clientVersion: t }); + } + return await r(n).catch((o) => { + throw o instanceof H && o.code === "P2025" ? new Ce(`No ${e} found`, t) : o; + }); + }; + } + function Ee(e) { + return e.replace(/^./, (t) => t.toLowerCase()); + } + var Hc = ["findUnique", "findUniqueOrThrow", "findFirst", "findFirstOrThrow", "create", "update", "upsert", "delete"]; + var zc = ["aggregate", "count", "groupBy"]; + function ti(e, t) { + let r = e._extensions.getAllModelExtensions(t) ?? {}, n = [Yc(e, t), Xc(e, t), Ft(r), re("name", () => t), re("$name", () => t), re("$parent", () => e._appliedParent)]; + return xe({}, n); + } + function Yc(e, t) { + let r = Ee(t), n = Object.keys(ue.ModelAction).concat("count"); + return { getKeys() { + return n; + }, getPropertyValue(i) { + let o = i, s = (l) => e._request(l); + s = Fs(o, t, e._clientVersion, s); + let a = (l) => (u) => { + let c = je(e._errorFormat); + return e._createPrismaPromise((p) => { + let d = { args: u, dataPath: [], action: o, model: t, clientMethod: `${r}.${i}`, jsModelName: r, transaction: p, callsite: c }; + return s({ ...d, ...l }); + }); + }; + return Hc.includes(o) ? ei(e, t, a) : Zc(i) ? ws(e, i, a) : a({}); + } }; + } + function Zc(e) { + return zc.includes(e); + } + function Xc(e, t) { + return Ge(re("fields", () => { + let r = e._runtimeDataModel.models[t]; + return Ps(t, r); + })); + } + function Os(e) { + return e.replace(/^./, (t) => t.toUpperCase()); + } + var ri = Symbol(); + function Bt(e) { + let t = [ep(e), re(ri, () => e), re("$parent", () => e._appliedParent)], r = e._extensions.getAllClientExtensions(); + return r && t.push(Ft(r)), xe(e, t); + } + function ep(e) { + let t = Object.keys(e._runtimeDataModel.models), r = t.map(Ee), n = [...new Set(t.concat(r))]; + return Ge({ getKeys() { + return n; + }, getPropertyValue(i) { + let o = Os(i); + if (e._runtimeDataModel.models[o] !== void 0) + return ti(e, o); + if (e._runtimeDataModel.models[i] !== void 0) + return ti(e, i); + }, getPropertyDescriptor(i) { + if (!r.includes(i)) + return { enumerable: false }; + } }); + } + function Lr(e) { + return e[ri] ? e[ri] : e; + } + function ks(e) { + if (typeof e == "function") + return e(this); + let t = Lr(this), r = Object.create(t, { _extensions: { value: this._extensions.append(e) }, _appliedParent: { value: this, configurable: true }, $use: { value: void 0 }, $on: { value: void 0 } }); + return Bt(r); + } + function Ds({ result: e, modelName: t, select: r, extensions: n }) { + let i = n.getAllComputedFields(t); + if (!i) + return e; + let o = [], s = []; + for (let a of Object.values(i)) { + if (r) { + if (!r[a.name]) + continue; + let l = a.needs.filter((u) => !r[u]); + l.length > 0 && s.push(Ot(l)); + } + tp(e, a.needs) && o.push(rp(a, xe(e, o))); + } + return o.length > 0 || s.length > 0 ? xe(e, [...o, ...s]) : e; + } + function tp(e, t) { + return t.every((r) => kn(e, r)); + } + function rp(e, t) { + return Ge(re(e.name, () => e.compute(t))); + } + function $r({ visitor: e, result: t, args: r, runtimeDataModel: n, modelName: i }) { + if (Array.isArray(t)) { + for (let s = 0; s < t.length; s++) + t[s] = $r({ result: t[s], args: r, modelName: i, runtimeDataModel: n, visitor: e }); + return t; + } + let o = e(t, i, r) ?? t; + return r.include && _s({ includeOrSelect: r.include, result: o, parentModelName: i, runtimeDataModel: n, visitor: e }), r.select && _s({ includeOrSelect: r.select, result: o, parentModelName: i, runtimeDataModel: n, visitor: e }), o; + } + function _s({ includeOrSelect: e, result: t, parentModelName: r, runtimeDataModel: n, visitor: i }) { + for (let [o, s] of Object.entries(e)) { + if (!s || t[o] == null) + continue; + let l = n.models[r].fields.find((c) => c.name === o); + if (!l || l.kind !== "object" || !l.relationName) + continue; + let u = typeof s == "object" ? s : {}; + t[o] = $r({ visitor: i, result: t[o], args: u, modelName: l.type, runtimeDataModel: n }); + } + } + function Is({ result: e, modelName: t, args: r, extensions: n, runtimeDataModel: i }) { + return n.isEmpty() || e == null || !i.models[t] ? e : $r({ result: e, args: r ?? {}, modelName: t, runtimeDataModel: i, visitor: (s, a, l) => Ds({ result: s, modelName: Ee(a), select: l.select, extensions: n }) }); + } + function Ns(e) { + if (e instanceof U) + return np(e); + if (Array.isArray(e)) { + let r = [e[0]]; + for (let n = 1; n < e.length; n++) + r[n] = Kt(e[n]); + return r; + } + let t = {}; + for (let r in e) + t[r] = Kt(e[r]); + return t; + } + function np(e) { + return new U(e.strings, e.values); + } + function Kt(e) { + if (typeof e != "object" || e == null || e instanceof Ae || dt(e)) + return e; + if (pt(e)) + return new we(e.toFixed()); + if (lt(e)) + return /* @__PURE__ */ new Date(+e); + if (ArrayBuffer.isView(e)) + return e.slice(0); + if (Array.isArray(e)) { + let t = e.length, r; + for (r = Array(t); t--; ) + r[t] = Kt(e[t]); + return r; + } + if (typeof e == "object") { + let t = {}; + for (let r in e) + r === "__proto__" ? Object.defineProperty(t, r, { value: Kt(e[r]), configurable: true, enumerable: true, writable: true }) : t[r] = Kt(e[r]); + return t; + } + Je(e, "Unknown value"); + } + function $s(e, t, r, n = 0) { + return e._createPrismaPromise((i) => { + let o = t.customDataProxyFetch; + return "transaction" in t && i !== void 0 && (t.transaction?.kind === "batch" && t.transaction.lock.then(), t.transaction = i), n === r.length ? e._executeRequest(t) : r[n]({ model: t.model, operation: t.model ? t.action : t.clientMethod, args: Ns(t.args ?? {}), __internalParams: t, query: (s, a = t) => { + let l = a.customDataProxyFetch; + return a.customDataProxyFetch = Ks(o, l), a.args = s, $s(e, a, r, n + 1); + } }); + }); + } + function qs(e, t) { + let { jsModelName: r, action: n, clientMethod: i } = t, o = r ? n : i; + if (e._extensions.isEmpty()) + return e._executeRequest(t); + let s = e._extensions.getAllQueryCallbacks(r ?? "$none", o); + return $s(e, t, s); + } + function js(e) { + return (t) => { + let r = { requests: t }, n = t[0].extensions.getAllBatchQueryCallbacks(); + return n.length ? Bs(r, n, 0, e) : e(r); + }; + } + function Bs(e, t, r, n) { + if (r === t.length) + return n(e); + let i = e.customDataProxyFetch, o = e.requests[0].transaction; + return t[r]({ args: { queries: e.requests.map((s) => ({ model: s.modelName, operation: s.action, args: s.args })), transaction: o ? { isolationLevel: o.kind === "batch" ? o.isolationLevel : void 0 } : void 0 }, __internalParams: e, query(s, a = e) { + let l = a.customDataProxyFetch; + return a.customDataProxyFetch = Ks(i, l), Bs(a, t, r + 1, n); + } }); + } + var Ls = (e) => e; + function Ks(e = Ls, t = Ls) { + return (r) => e(t(r)); + } + function Us(e, t, r) { + let n = Ee(r); + return !t.result || !(t.result.$allModels || t.result[n]) ? e : ip({ ...e, ...Vs(t.name, e, t.result.$allModels), ...Vs(t.name, e, t.result[n]) }); + } + function ip(e) { + let t = new he(), r = (n, i) => t.getOrCreate(n, () => i.has(n) ? [n] : (i.add(n), e[n] ? e[n].needs.flatMap((o) => r(o, i)) : [n])); + return ot(e, (n) => ({ ...n, needs: r(n.name, /* @__PURE__ */ new Set()) })); + } + function Vs(e, t, r) { + return r ? ot(r, ({ needs: n, compute: i }, o) => ({ name: o, needs: n ? Object.keys(n).filter((s) => n[s]) : [], compute: op(t, o, i) })) : {}; + } + function op(e, t, r) { + let n = e?.[t]?.compute; + return n ? (i) => r({ ...i, [t]: n(i) }) : r; + } + function Qs(e, t) { + if (!t) + return e; + let r = { ...e }; + for (let n of Object.values(t)) + if (!!e[n.name]) + for (let i of n.needs) + r[i] = true; + return r; + } + var qr = class { + constructor(t, r) { + this.extension = t; + this.previous = r; + this.computedFieldsCache = new he(); + this.modelExtensionsCache = new he(); + this.queryCallbacksCache = new he(); + this.clientExtensions = Rt(() => this.extension.client ? { ...this.previous?.getAllClientExtensions(), ...this.extension.client } : this.previous?.getAllClientExtensions()); + this.batchCallbacks = Rt(() => { + let t2 = this.previous?.getAllBatchQueryCallbacks() ?? [], r2 = this.extension.query?.$__internalBatch; + return r2 ? t2.concat(r2) : t2; + }); + } + getAllComputedFields(t) { + return this.computedFieldsCache.getOrCreate(t, () => Us(this.previous?.getAllComputedFields(t), this.extension, t)); + } + getAllClientExtensions() { + return this.clientExtensions.get(); + } + getAllModelExtensions(t) { + return this.modelExtensionsCache.getOrCreate(t, () => { + let r = Ee(t); + return !this.extension.model || !(this.extension.model[r] || this.extension.model.$allModels) ? this.previous?.getAllModelExtensions(t) : { ...this.previous?.getAllModelExtensions(t), ...this.extension.model.$allModels, ...this.extension.model[r] }; + }); + } + getAllQueryCallbacks(t, r) { + return this.queryCallbacksCache.getOrCreate(`${t}:${r}`, () => { + let n = this.previous?.getAllQueryCallbacks(t, r) ?? [], i = [], o = this.extension.query; + return !o || !(o[t] || o.$allModels || o[r] || o.$allOperations) ? n : (o[t] !== void 0 && (o[t][r] !== void 0 && i.push(o[t][r]), o[t].$allOperations !== void 0 && i.push(o[t].$allOperations)), t !== "$none" && o.$allModels !== void 0 && (o.$allModels[r] !== void 0 && i.push(o.$allModels[r]), o.$allModels.$allOperations !== void 0 && i.push(o.$allModels.$allOperations)), o[r] !== void 0 && i.push(o[r]), o.$allOperations !== void 0 && i.push(o.$allOperations), n.concat(i)); + }); + } + getAllBatchQueryCallbacks() { + return this.batchCallbacks.get(); + } + }; + var Be = class { + constructor(t) { + this.head = t; + } + static empty() { + return new Be(); + } + static single(t) { + return new Be(new qr(t)); + } + isEmpty() { + return this.head === void 0; + } + append(t) { + return new Be(new qr(t, this.head)); + } + getAllComputedFields(t) { + return this.head?.getAllComputedFields(t); + } + getAllClientExtensions() { + return this.head?.getAllClientExtensions(); + } + getAllModelExtensions(t) { + return this.head?.getAllModelExtensions(t); + } + getAllQueryCallbacks(t, r) { + return this.head?.getAllQueryCallbacks(t, r) ?? []; + } + getAllBatchQueryCallbacks() { + return this.head?.getAllBatchQueryCallbacks() ?? []; + } + }; + var Js = N("prisma:client"); + var Gs = { Vercel: "vercel", "Netlify CI": "netlify" }; + function Ws({ postinstall: e, ciName: t, clientVersion: r }) { + if (Js("checkPlatformCaching:postinstall", e), Js("checkPlatformCaching:ciName", t), e === true && t && t in Gs) { + let n = `Prisma has detected that this project was built on ${t}, which caches dependencies. This leads to an outdated Prisma Client because Prisma's auto-generation isn't triggered. To fix this, make sure to run the \`prisma generate\` command during the build process. + +Learn how: https://pris.ly/d/${Gs[t]}-build`; + throw console.error(n), new _(n, r); + } + } + var ea = A(ni()); + function Zs(e, t) { + let r = Xs(e), n = sp(r), i = lp(n); + i ? jr(i, t) : t.addErrorMessage(() => "Unknown error"); + } + function Xs(e) { + return e.errors.flatMap((t) => t.kind === "Union" ? Xs(t) : [t]); + } + function sp(e) { + let t = /* @__PURE__ */ new Map(), r = []; + for (let n of e) { + if (n.kind !== "InvalidArgumentType") { + r.push(n); + continue; + } + let i = `${n.selectionPath.join(".")}:${n.argumentPath.join(".")}`, o = t.get(i); + o ? t.set(i, { ...n, argument: { ...n.argument, typeNames: ap(o.argument.typeNames, n.argument.typeNames) } }) : t.set(i, n); + } + return r.push(...t.values()), r; + } + function ap(e, t) { + return [...new Set(e.concat(t))]; + } + function lp(e) { + return _n(e, (t, r) => { + let n = zs(t), i = zs(r); + return n !== i ? n - i : Ys(t) - Ys(r); + }); + } + function zs(e) { + let t = 0; + return Array.isArray(e.selectionPath) && (t += e.selectionPath.length), Array.isArray(e.argumentPath) && (t += e.argumentPath.length), t; + } + function Ys(e) { + switch (e.kind) { + case "InvalidArgumentValue": + case "ValueTooLarge": + return 20; + case "InvalidArgumentType": + return 10; + case "RequiredArgumentMissing": + return -10; + default: + return 0; + } + } + var Re = class { + constructor(t, r) { + this.name = t; + this.value = r; + this.isRequired = false; + } + makeRequired() { + return this.isRequired = true, this; + } + write(t) { + let { colors: { green: r } } = t.context; + t.addMarginSymbol(r(this.isRequired ? "+" : "?")), t.write(r(this.name)), this.isRequired || t.write(r("?")), t.write(r(": ")), typeof this.value == "string" ? t.write(r(this.value)) : t.write(this.value); + } + }; + var Br = class { + constructor() { + this.fields = []; + } + addField(t, r) { + return this.fields.push({ write(n) { + let { green: i, dim: o } = n.context.colors; + n.write(i(o(`${t}: ${r}`))).addMarginSymbol(i(o("+"))); + } }), this; + } + write(t) { + let { colors: { green: r } } = t.context; + t.writeLine(r("{")).withIndent(() => { + t.writeJoined(mt, this.fields).newLine(); + }).write(r("}")).addMarginSymbol(r("+")); + } + }; + function jr(e, t) { + switch (e.kind) { + case "IncludeAndSelect": + up(e, t); + break; + case "IncludeOnScalar": + cp(e, t); + break; + case "EmptySelection": + pp(e, t); + break; + case "UnknownSelectionField": + dp(e, t); + break; + case "UnknownArgument": + mp(e, t); + break; + case "UnknownInputField": + fp(e, t); + break; + case "RequiredArgumentMissing": + gp(e, t); + break; + case "InvalidArgumentType": + yp(e, t); + break; + case "InvalidArgumentValue": + hp(e, t); + break; + case "ValueTooLarge": + xp(e, t); + break; + case "SomeFieldsMissing": + bp(e, t); + break; + case "TooManyFieldsGiven": + wp(e, t); + break; + case "Union": + Zs(e, t); + break; + default: + throw new Error("not implemented: " + e.kind); + } + } + function up(e, t) { + let r = t.arguments.getDeepSubSelectionValue(e.selectionPath); + r && r instanceof D && (r.getField("include")?.markAsError(), r.getField("select")?.markAsError()), t.addErrorMessage((n) => `Please ${n.bold("either")} use ${n.green("`include`")} or ${n.green("`select`")}, but ${n.red("not both")} at the same time.`); + } + function cp(e, t) { + let [r, n] = Kr(e.selectionPath), i = e.outputType, o = t.arguments.getDeepSelectionParent(r)?.value; + if (o && (o.getField(n)?.markAsError(), i)) + for (let s of i.fields) + s.isRelation && o.addSuggestion(new Re(s.name, "true")); + t.addErrorMessage((s) => { + let a = `Invalid scalar field ${s.red(`\`${n}\``)} for ${s.bold("include")} statement`; + return i ? a += ` on model ${s.bold(i.name)}. ${Vt(s)}` : a += ".", a += ` +Note that ${s.bold("include")} statements only accept relation fields.`, a; + }); + } + function pp(e, t) { + let r = e.outputType, n = t.arguments.getDeepSelectionParent(e.selectionPath)?.value, i = n?.isEmpty() ?? false; + n && (n.removeAllFields(), na(n, r)), t.addErrorMessage((o) => i ? `The ${o.red("`select`")} statement for type ${o.bold(r.name)} must not be empty. ${Vt(o)}` : `The ${o.red("`select`")} statement for type ${o.bold(r.name)} needs ${o.bold("at least one truthy value")}.`); + } + function dp(e, t) { + let [r, n] = Kr(e.selectionPath), i = t.arguments.getDeepSelectionParent(r); + i && (i.value.getField(n)?.markAsError(), na(i.value, e.outputType)), t.addErrorMessage((o) => { + let s = [`Unknown field ${o.red(`\`${n}\``)}`]; + return i && s.push(`for ${o.bold(i.kind)} statement`), s.push(`on model ${o.bold(`\`${e.outputType.name}\``)}.`), s.push(Vt(o)), s.join(" "); + }); + } + function mp(e, t) { + let r = e.argumentPath[0], n = t.arguments.getDeepSubSelectionValue(e.selectionPath); + n instanceof D && (n.getField(r)?.markAsError(), Pp(n, e.arguments)), t.addErrorMessage((i) => ta(i, r, e.arguments.map((o) => o.name))); + } + function fp(e, t) { + let [r, n] = Kr(e.argumentPath), i = t.arguments.getDeepSubSelectionValue(e.selectionPath); + if (i instanceof D) { + i.getDeepField(e.argumentPath)?.markAsError(); + let o = i.getDeepFieldValue(r); + o instanceof D && ia(o, e.inputType); + } + t.addErrorMessage((o) => ta(o, n, e.inputType.fields.map((s) => s.name))); + } + function ta(e, t, r) { + let n = [`Unknown argument \`${e.red(t)}\`.`], i = Tp(t, r); + return i && n.push(`Did you mean \`${e.green(i)}\`?`), r.length > 0 && n.push(Vt(e)), n.join(" "); + } + function gp(e, t) { + let r; + t.addErrorMessage((l) => r?.value instanceof j && r.value.text === "null" ? `Argument \`${l.green(o)}\` must not be ${l.red("null")}.` : `Argument \`${l.green(o)}\` is missing.`); + let n = t.arguments.getDeepSubSelectionValue(e.selectionPath); + if (!(n instanceof D)) + return; + let [i, o] = Kr(e.argumentPath), s = new Br(), a = n.getDeepFieldValue(i); + if (a instanceof D) + if (r = a.getField(o), r && a.removeField(o), e.inputTypes.length === 1 && e.inputTypes[0].kind === "object") { + for (let l of e.inputTypes[0].fields) + s.addField(l.name, l.typeNames.join(" | ")); + a.addSuggestion(new Re(o, s).makeRequired()); + } else { + let l = e.inputTypes.map(ra).join(" | "); + a.addSuggestion(new Re(o, l).makeRequired()); + } + } + function ra(e) { + return e.kind === "list" ? `${ra(e.elementType)}[]` : e.name; + } + function yp(e, t) { + let r = e.argument.name, n = t.arguments.getDeepSubSelectionValue(e.selectionPath); + n instanceof D && n.getDeepFieldValue(e.argumentPath)?.markAsError(), t.addErrorMessage((i) => { + let o = Vr("or", e.argument.typeNames.map((s) => i.green(s))); + return `Argument \`${i.bold(r)}\`: Invalid value provided. Expected ${o}, provided ${i.red(e.inferredType)}.`; + }); + } + function hp(e, t) { + let r = e.argument.name, n = t.arguments.getDeepSubSelectionValue(e.selectionPath); + n instanceof D && n.getDeepFieldValue(e.argumentPath)?.markAsError(), t.addErrorMessage((i) => { + let o = [`Invalid value for argument \`${i.bold(r)}\``]; + if (e.underlyingError && o.push(`: ${e.underlyingError}`), o.push("."), e.argument.typeNames.length > 0) { + let s = Vr("or", e.argument.typeNames.map((a) => i.green(a))); + o.push(` Expected ${s}.`); + } + return o.join(""); + }); + } + function xp(e, t) { + let r = e.argument.name, n = t.arguments.getDeepSubSelectionValue(e.selectionPath), i; + if (n instanceof D) { + let s = n.getDeepField(e.argumentPath)?.value; + s?.markAsError(), s instanceof j && (i = s.text); + } + t.addErrorMessage((o) => { + let s = ["Unable to fit value"]; + return i && s.push(o.red(i)), s.push(`into a 64-bit signed integer for field \`${o.bold(r)}\``), s.join(" "); + }); + } + function bp(e, t) { + let r = e.argumentPath[e.argumentPath.length - 1], n = t.arguments.getDeepSubSelectionValue(e.selectionPath); + if (n instanceof D) { + let i = n.getDeepFieldValue(e.argumentPath); + i instanceof D && ia(i, e.inputType); + } + t.addErrorMessage((i) => { + let o = [`Argument \`${i.bold(r)}\` of type ${i.bold(e.inputType.name)} needs`]; + return e.constraints.minFieldCount === 1 ? e.constraints.requiredFields ? o.push(`${i.green("at least one of")} ${Vr("or", e.constraints.requiredFields.map((s) => `\`${i.bold(s)}\``))} arguments.`) : o.push(`${i.green("at least one")} argument.`) : o.push(`${i.green(`at least ${e.constraints.minFieldCount}`)} arguments.`), o.push(Vt(i)), o.join(" "); + }); + } + function wp(e, t) { + let r = e.argumentPath[e.argumentPath.length - 1], n = t.arguments.getDeepSubSelectionValue(e.selectionPath), i = []; + if (n instanceof D) { + let o = n.getDeepFieldValue(e.argumentPath); + o instanceof D && (o.markAsError(), i = Object.keys(o.getFields())); + } + t.addErrorMessage((o) => { + let s = [`Argument \`${o.bold(r)}\` of type ${o.bold(e.inputType.name)} needs`]; + return e.constraints.minFieldCount === 1 && e.constraints.maxFieldCount == 1 ? s.push(`${o.green("exactly one")} argument,`) : e.constraints.maxFieldCount == 1 ? s.push(`${o.green("at most one")} argument,`) : s.push(`${o.green(`at most ${e.constraints.maxFieldCount}`)} arguments,`), s.push(`but you provided ${Vr("and", i.map((a) => o.red(a)))}. Please choose`), e.constraints.maxFieldCount === 1 ? s.push("one.") : s.push(`${e.constraints.maxFieldCount}.`), s.join(" "); + }); + } + function na(e, t) { + for (let r of t.fields) + e.hasField(r.name) || e.addSuggestion(new Re(r.name, "true")); + } + function Pp(e, t) { + for (let r of t) + e.hasField(r.name) || e.addSuggestion(new Re(r.name, r.typeNames.join(" | "))); + } + function ia(e, t) { + if (t.kind === "object") + for (let r of t.fields) + e.hasField(r.name) || e.addSuggestion(new Re(r.name, r.typeNames.join(" | "))); + } + function Kr(e) { + let t = [...e], r = t.pop(); + if (!r) + throw new Error("unexpected empty path"); + return [t, r]; + } + function Vt({ green: e }) { + return `Available options are listed in ${e("green")}.`; + } + function Vr(e, t) { + if (t.length === 1) + return t[0]; + let r = [...t], n = r.pop(); + return `${r.join(", ")} ${e} ${n}`; + } + var Ep = 3; + function Tp(e, t) { + let r = 1 / 0, n; + for (let i of t) { + let o = (0, ea.default)(e, i); + o > Ep || o < r && (r = o, n = i); + } + return n; + } + function Ur({ args: e, errors: t, errorFormat: r, callsite: n, originalMethod: i, clientVersion: o }) { + let s = _r(e); + for (let p of t) + jr(p, s); + let a = r === "pretty" ? cs : Or, l = s.renderAllMessages(a), u = new at(0, { colors: a }).write(s).toString(), c = gt({ message: l, callsite: n, originalMethod: i, showColors: r === "pretty", callArguments: u }); + throw new te(c, { clientVersion: o }); + } + var vp = { findUnique: "findUnique", findUniqueOrThrow: "findUniqueOrThrow", findFirst: "findFirst", findFirstOrThrow: "findFirstOrThrow", findMany: "findMany", count: "aggregate", create: "createOne", createMany: "createMany", update: "updateOne", updateMany: "updateMany", upsert: "upsertOne", delete: "deleteOne", deleteMany: "deleteMany", executeRaw: "executeRaw", queryRaw: "queryRaw", aggregate: "aggregate", groupBy: "groupBy", runCommandRaw: "runCommandRaw", findRaw: "findRaw", aggregateRaw: "aggregateRaw" }; + function oa({ modelName: e, action: t, args: r, runtimeDataModel: n, extensions: i, callsite: o, clientMethod: s, errorFormat: a, clientVersion: l }) { + let u = new yt({ runtimeDataModel: n, modelName: e, action: t, rootArgs: r, callsite: o, extensions: i, selectionPath: [], argumentPath: [], originalMethod: s, errorFormat: a, clientVersion: l }); + return { modelName: e, action: vp[t], query: ii(r, u) }; + } + function ii({ select: e, include: t, ...r } = {}, n) { + return { arguments: aa(r, n), selection: Cp(e, t, n) }; + } + function Cp(e, t, r) { + return e && t && r.throwValidationError({ kind: "IncludeAndSelect", selectionPath: r.getSelectionPath() }), e ? Sp(e, r) : Mp(r, t); + } + function Mp(e, t) { + let r = {}; + return e.model && !e.isRawAction() && (r.$composites = true, r.$scalars = true), t && Ap(r, t, e), r; + } + function Ap(e, t, r) { + for (let [n, i] of Object.entries(t)) { + let o = r.findField(n); + o && o?.kind !== "object" && r.throwValidationError({ kind: "IncludeOnScalar", selectionPath: r.getSelectionPath().concat(n), outputType: r.getOutputTypeDescription() }), i === true ? e[n] = true : typeof i == "object" && (e[n] = ii(i, r.nestSelection(n))); + } + } + function Sp(e, t) { + let r = {}, n = t.getComputedFields(), i = Qs(e, n); + for (let [o, s] of Object.entries(i)) { + let a = t.findField(o); + n?.[o] && !a || (s === true ? r[o] = true : typeof s == "object" && (r[o] = ii(s, t.nestSelection(o)))); + } + return r; + } + function sa(e, t) { + if (e === null) + return null; + if (typeof e == "string" || typeof e == "number" || typeof e == "boolean") + return e; + if (typeof e == "bigint") + return { $type: "BigInt", value: String(e) }; + if (lt(e)) { + if (Er(e)) + return { $type: "DateTime", value: e.toISOString() }; + t.throwValidationError({ kind: "InvalidArgumentValue", selectionPath: t.getSelectionPath(), argumentPath: t.getArgumentPath(), argument: { name: t.getArgumentName(), typeNames: ["Date"] }, underlyingError: "Provided Date object is invalid" }); + } + if (dt(e)) + return { $type: "FieldRef", value: { _ref: e.name, _container: e.modelName } }; + if (Array.isArray(e)) + return Rp(e, t); + if (ArrayBuffer.isView(e)) + return { $type: "Bytes", value: Buffer.from(e).toString("base64") }; + if (Fp(e)) + return e.values; + if (pt(e)) + return { $type: "Decimal", value: e.toFixed() }; + if (e instanceof Ae) { + if (e !== Pr.instances[e._getName()]) + throw new Error("Invalid ObjectEnumValue"); + return { $type: "Enum", value: e._getName() }; + } + if (Op(e)) + return e.toJSON(); + if (typeof e == "object") + return aa(e, t); + t.throwValidationError({ kind: "InvalidArgumentValue", selectionPath: t.getSelectionPath(), argumentPath: t.getArgumentPath(), argument: { name: t.getArgumentName(), typeNames: [] }, underlyingError: `We could not serialize ${Object.prototype.toString.call(e)} value. Serialize the object to JSON or implement a ".toJSON()" method on it` }); + } + function aa(e, t) { + if (e.$type) + return { $type: "Json", value: JSON.stringify(e) }; + let r = {}; + for (let n in e) { + let i = e[n]; + i !== void 0 && (r[n] = sa(i, t.nestArgument(n))); + } + return r; + } + function Rp(e, t) { + let r = []; + for (let n = 0; n < e.length; n++) { + let i = e[n]; + i !== void 0 && r.push(sa(i, t.nestArgument(String(n)))); + } + return r; + } + function Fp(e) { + return typeof e == "object" && e !== null && e.__prismaRawParameters__ === true; + } + function Op(e) { + return typeof e == "object" && e !== null && typeof e.toJSON == "function"; + } + var yt = class { + constructor(t) { + this.params = t; + this.params.modelName && (this.model = this.params.runtimeDataModel.models[this.params.modelName]); + } + throwValidationError(t) { + Ur({ errors: [t], originalMethod: this.params.originalMethod, args: this.params.rootArgs ?? {}, callsite: this.params.callsite, errorFormat: this.params.errorFormat, clientVersion: this.params.clientVersion }); + } + getSelectionPath() { + return this.params.selectionPath; + } + getArgumentPath() { + return this.params.argumentPath; + } + getArgumentName() { + return this.params.argumentPath[this.params.argumentPath.length - 1]; + } + getOutputTypeDescription() { + if (!(!this.params.modelName || !this.model)) + return { name: this.params.modelName, fields: this.model.fields.map((t) => ({ name: t.name, typeName: "boolean", isRelation: t.kind === "object" })) }; + } + isRawAction() { + return ["executeRaw", "queryRaw", "runCommandRaw", "findRaw", "aggregateRaw"].includes(this.params.action); + } + getComputedFields() { + if (!!this.params.modelName) + return this.params.extensions.getAllComputedFields(this.params.modelName); + } + findField(t) { + return this.model?.fields.find((r) => r.name === t); + } + nestSelection(t) { + let r = this.findField(t), n = r?.kind === "object" ? r.type : void 0; + return new yt({ ...this.params, modelName: n, selectionPath: this.params.selectionPath.concat(t) }); + } + nestArgument(t) { + return new yt({ ...this.params, argumentPath: this.params.argumentPath.concat(t) }); + } + }; + var la = (e) => ({ command: e }); + var ua = (e) => e.strings.reduce((t, r, n) => `${t}@P${n}${r}`); + function Ut(e) { + try { + return ca(e, "fast"); + } catch { + return ca(e, "slow"); + } + } + function ca(e, t) { + return JSON.stringify(e.map((r) => kp(r, t))); + } + function kp(e, t) { + return typeof e == "bigint" ? { prisma__type: "bigint", prisma__value: e.toString() } : lt(e) ? { prisma__type: "date", prisma__value: e.toJSON() } : we.isDecimal(e) ? { prisma__type: "decimal", prisma__value: e.toJSON() } : Buffer.isBuffer(e) ? { prisma__type: "bytes", prisma__value: e.toString("base64") } : Dp(e) || ArrayBuffer.isView(e) ? { prisma__type: "bytes", prisma__value: Buffer.from(e).toString("base64") } : typeof e == "object" && t === "slow" ? da(e) : e; + } + function Dp(e) { + return e instanceof ArrayBuffer || e instanceof SharedArrayBuffer ? true : typeof e == "object" && e !== null ? e[Symbol.toStringTag] === "ArrayBuffer" || e[Symbol.toStringTag] === "SharedArrayBuffer" : false; + } + function da(e) { + if (typeof e != "object" || e === null) + return e; + if (typeof e.toJSON == "function") + return e.toJSON(); + if (Array.isArray(e)) + return e.map(pa); + let t = {}; + for (let r of Object.keys(e)) + t[r] = pa(e[r]); + return t; + } + function pa(e) { + return typeof e == "bigint" ? e.toString() : da(e); + } + var _p = /^(\s*alter\s)/i; + var ma = N("prisma:client"); + function oi(e, t, r, n) { + if (!(e !== "postgresql" && e !== "cockroachdb") && r.length > 0 && _p.exec(t)) + throw new Error(`Running ALTER using ${n} is not supported +Using the example below you can still execute your query with Prisma, but please note that it is vulnerable to SQL injection attacks and requires you to take care of input sanitization. + +Example: + await prisma.$executeRawUnsafe(\`ALTER USER prisma WITH PASSWORD '\${password}'\`) + +More Information: https://pris.ly/d/execute-raw +`); + } + var si = (e, t) => (r) => { + let n = "", i; + if (Array.isArray(r)) { + let [o, ...s] = r; + n = o, i = { values: Ut(s || []), __prismaRawParameters__: true }; + } else + switch (e) { + case "sqlite": + case "mysql": { + n = r.sql, i = { values: Ut(r.values), __prismaRawParameters__: true }; + break; + } + case "cockroachdb": + case "postgresql": { + n = r.text, i = { values: Ut(r.values), __prismaRawParameters__: true }; + break; + } + case "sqlserver": { + n = ua(r), i = { values: Ut(r.values), __prismaRawParameters__: true }; + break; + } + default: + throw new Error(`The ${e} provider does not support ${t}`); + } + return i?.values ? ma(`prisma.${t}(${n}, ${i.values})`) : ma(`prisma.${t}(${n})`), { query: n, parameters: i }; + }; + var fa = { requestArgsToMiddlewareArgs(e) { + return [e.strings, ...e.values]; + }, middlewareArgsToRequestArgs(e) { + let [t, ...r] = e; + return new U(t, r); + } }; + var ga = { requestArgsToMiddlewareArgs(e) { + return [e]; + }, middlewareArgsToRequestArgs(e) { + return e[0]; + } }; + function ai(e) { + return function(r) { + let n, i = (o = e) => { + try { + return o === void 0 || o?.kind === "itx" ? n ?? (n = ya(r(o))) : ya(r(o)); + } catch (s) { + return Promise.reject(s); + } + }; + return { then(o, s) { + return i().then(o, s); + }, catch(o) { + return i().catch(o); + }, finally(o) { + return i().finally(o); + }, requestTransaction(o) { + let s = i(o); + return s.requestTransaction ? s.requestTransaction(o) : s; + }, [Symbol.toStringTag]: "PrismaPromise" }; + }; + } + function ya(e) { + return typeof e.then == "function" ? e : Promise.resolve(e); + } + var ha = { isEnabled() { + return false; + }, getTraceParent() { + return "00-10-10-00"; + }, async createEngineSpan() { + }, getActiveContext() { + }, runInChildSpan(e, t) { + return t(); + } }; + var li = class { + isEnabled() { + return this.getGlobalTracingHelper().isEnabled(); + } + getTraceParent(t) { + return this.getGlobalTracingHelper().getTraceParent(t); + } + createEngineSpan(t) { + return this.getGlobalTracingHelper().createEngineSpan(t); + } + getActiveContext() { + return this.getGlobalTracingHelper().getActiveContext(); + } + runInChildSpan(t, r) { + return this.getGlobalTracingHelper().runInChildSpan(t, r); + } + getGlobalTracingHelper() { + return globalThis.PRISMA_INSTRUMENTATION?.helper ?? ha; + } + }; + function xa(e) { + return e.includes("tracing") ? new li() : ha; + } + function ba(e, t = () => { + }) { + let r, n = new Promise((i) => r = i); + return { then(i) { + return --e === 0 && r(t()), i?.(n); + } }; + } + function wa(e) { + return typeof e == "string" ? e : e.reduce((t, r) => { + let n = typeof r == "string" ? r : r.level; + return n === "query" ? t : t && (r === "info" || t === "info") ? "info" : n; + }, void 0); + } + var Ip = ["$connect", "$disconnect", "$on", "$transaction", "$use", "$extends"]; + var Pa = Ip; + function Ta(e, t, r) { + let n = Ea(e, r), i = Ea(t, r), o = Object.values(i).map((a) => a[a.length - 1]), s = Object.keys(i); + return Object.entries(n).forEach(([a, l]) => { + s.includes(a) || o.push(l[l.length - 1]); + }), o; + } + var Ea = (e, t) => e.reduce((r, n) => { + let i = t(n); + return r[i] || (r[i] = []), r[i].push(n), r; + }, {}); + var Qr = class { + constructor() { + this._middlewares = []; + } + use(t) { + this._middlewares.push(t); + } + get(t) { + return this._middlewares[t]; + } + has(t) { + return !!this._middlewares[t]; + } + length() { + return this._middlewares.length; + } + }; + var Ca = A(On()); + function Jr(e) { + return typeof e.batchRequestIdx == "number"; + } + function Gr(e) { + return e === null ? e : Array.isArray(e) ? e.map(Gr) : typeof e == "object" ? Np(e) ? Lp(e) : ot(e, Gr) : e; + } + function Np(e) { + return e !== null && typeof e == "object" && typeof e.$type == "string"; + } + function Lp({ $type: e, value: t }) { + switch (e) { + case "BigInt": + return BigInt(t); + case "Bytes": + return Buffer.from(t, "base64"); + case "DateTime": + return new Date(t); + case "Decimal": + return new we(t); + case "Json": + return JSON.parse(t); + default: + Je(t, "Unknown tagged value"); + } + } + function va(e) { + if (e.action !== "findUnique" && e.action !== "findUniqueOrThrow") + return; + let t = []; + return e.modelName && t.push(e.modelName), e.query.arguments && t.push(ui(e.query.arguments)), t.push(ui(e.query.selection)), t.join(""); + } + function ui(e) { + return `(${Object.keys(e).sort().map((r) => { + let n = e[r]; + return typeof n == "object" && n !== null ? `(${r} ${ui(n)})` : r; + }).join(" ")})`; + } + var $p = { aggregate: false, aggregateRaw: false, createMany: true, createOne: true, deleteMany: true, deleteOne: true, executeRaw: true, findFirst: false, findFirstOrThrow: false, findMany: false, findRaw: false, findUnique: false, findUniqueOrThrow: false, groupBy: false, queryRaw: false, runCommandRaw: true, updateMany: true, updateOne: true, upsertOne: true }; + function ci(e) { + return $p[e]; + } + var Wr = class { + constructor(t) { + this.options = t; + this.tickActive = false; + this.batches = {}; + } + request(t) { + let r = this.options.batchBy(t); + return r ? (this.batches[r] || (this.batches[r] = [], this.tickActive || (this.tickActive = true, process.nextTick(() => { + this.dispatchBatches(), this.tickActive = false; + }))), new Promise((n, i) => { + this.batches[r].push({ request: t, resolve: n, reject: i }); + })) : this.options.singleLoader(t); + } + dispatchBatches() { + for (let t in this.batches) { + let r = this.batches[t]; + delete this.batches[t], r.length === 1 ? this.options.singleLoader(r[0].request).then((n) => { + n instanceof Error ? r[0].reject(n) : r[0].resolve(n); + }).catch((n) => { + r[0].reject(n); + }) : (r.sort((n, i) => this.options.batchOrder(n.request, i.request)), this.options.batchLoader(r.map((n) => n.request)).then((n) => { + if (n instanceof Error) + for (let i = 0; i < r.length; i++) + r[i].reject(n); + else + for (let i = 0; i < r.length; i++) { + let o = n[i]; + o instanceof Error ? r[i].reject(o) : r[i].resolve(o); + } + }).catch((n) => { + for (let i = 0; i < r.length; i++) + r[i].reject(n); + })); + } + } + get [Symbol.toStringTag]() { + return "DataLoader"; + } + }; + var qp = N("prisma:client:request_handler"); + var Hr = class { + constructor(t, r) { + this.logEmitter = r, this.client = t, this.dataloader = new Wr({ batchLoader: js(async ({ requests: n, customDataProxyFetch: i }) => { + let { transaction: o, otelParentCtx: s } = n[0], a = n.map((p) => p.protocolQuery), l = this.client._tracingHelper.getTraceParent(s), u = n.some((p) => ci(p.protocolQuery.action)); + return (await this.client._engine.requestBatch(a, { traceparent: l, transaction: jp(o), containsWrite: u, customDataProxyFetch: i })).map((p, d) => { + if (p instanceof Error) + return p; + try { + return this.mapQueryEngineResult(n[d], p); + } catch (g) { + return g; + } + }); + }), singleLoader: async (n) => { + let i = n.transaction?.kind === "itx" ? Ma(n.transaction) : void 0, o = await this.client._engine.request(n.protocolQuery, { traceparent: this.client._tracingHelper.getTraceParent(), interactiveTransaction: i, isWrite: ci(n.protocolQuery.action), customDataProxyFetch: n.customDataProxyFetch }); + return this.mapQueryEngineResult(n, o); + }, batchBy: (n) => n.transaction?.id ? `transaction-${n.transaction.id}` : va(n.protocolQuery), batchOrder(n, i) { + return n.transaction?.kind === "batch" && i.transaction?.kind === "batch" ? n.transaction.index - i.transaction.index : 0; + } }); + } + async request(t) { + try { + return await this.dataloader.request(t); + } catch (r) { + let { clientMethod: n, callsite: i, transaction: o, args: s } = t; + this.handleAndLogRequestError({ error: r, clientMethod: n, callsite: i, transaction: o, args: s }); + } + } + mapQueryEngineResult({ dataPath: t, unpacker: r }, n) { + let i = n?.data, o = n?.elapsed, s = this.unpack(i, t, r); + return process.env.PRISMA_CLIENT_GET_TIME ? { data: s, elapsed: o } : s; + } + handleAndLogRequestError(t) { + try { + this.handleRequestError(t); + } catch (r) { + throw this.logEmitter && this.logEmitter.emit("error", { message: r.message, target: t.clientMethod, timestamp: /* @__PURE__ */ new Date() }), r; + } + } + handleRequestError({ error: t, clientMethod: r, callsite: n, transaction: i, args: o }) { + if (qp(t), Bp(t, i) || t instanceof Ce) + throw t; + if (t instanceof H && Kp(t)) { + let a = Aa(t.meta); + Ur({ args: o, errors: [a], callsite: n, errorFormat: this.client._errorFormat, originalMethod: r, clientVersion: this.client._clientVersion }); + } + let s = t.message; + throw n && (s = gt({ callsite: n, originalMethod: r, isPanic: t.isPanic, showColors: this.client._errorFormat === "pretty", message: s })), s = this.sanitizeMessage(s), t.code ? new H(s, { code: t.code, clientVersion: this.client._clientVersion, meta: t.meta, batchRequestIdx: t.batchRequestIdx }) : t.isPanic ? new ae(s, this.client._clientVersion) : t instanceof z ? new z(s, { clientVersion: this.client._clientVersion, batchRequestIdx: t.batchRequestIdx }) : t instanceof _ ? new _(s, this.client._clientVersion) : t instanceof ae ? new ae(s, this.client._clientVersion) : (t.clientVersion = this.client._clientVersion, t); + } + sanitizeMessage(t) { + return this.client._errorFormat && this.client._errorFormat !== "pretty" ? (0, Ca.default)(t) : t; + } + unpack(t, r, n) { + if (!t || (t.data && (t = t.data), !t)) + return t; + let i = Object.values(t)[0], o = r.filter((a) => a !== "select" && a !== "include"), s = Gr(Xn(i, o)); + return n ? n(s) : s; + } + get [Symbol.toStringTag]() { + return "RequestHandler"; + } + }; + function jp(e) { + if (!!e) { + if (e.kind === "batch") + return { kind: "batch", options: { isolationLevel: e.isolationLevel } }; + if (e.kind === "itx") + return { kind: "itx", options: Ma(e) }; + Je(e, "Unknown transaction kind"); + } + } + function Ma(e) { + return { id: e.id, payload: e.payload }; + } + function Bp(e, t) { + return Jr(e) && t?.kind === "batch" && e.batchRequestIdx !== t.index; + } + function Kp(e) { + return e.code === "P2009" || e.code === "P2012"; + } + function Aa(e) { + if (e.kind === "Union") + return { kind: "Union", errors: e.errors.map(Aa) }; + if (Array.isArray(e.selectionPath)) { + let [, ...t] = e.selectionPath; + return { ...e, selectionPath: t }; + } + return e; + } + var Sa = "5.1.0"; + var Ra = Sa; + function Fa(e) { + return e.map((t) => { + let r = {}; + for (let n of Object.keys(t)) + r[n] = Oa(t[n]); + return r; + }); + } + function Oa({ prisma__type: e, prisma__value: t }) { + switch (e) { + case "bigint": + return BigInt(t); + case "bytes": + return Buffer.from(t, "base64"); + case "decimal": + return new we(t); + case "datetime": + case "date": + return new Date(t); + case "time": + return /* @__PURE__ */ new Date(`1970-01-01T${t}Z`); + case "array": + return t.map(Oa); + default: + return t; + } + } + var Ia = A(ni()); + var B = class extends Error { + constructor(t) { + super(t + ` +Read more at https://pris.ly/d/client-constructor`), this.name = "PrismaClientConstructorValidationError"; + } + get [Symbol.toStringTag]() { + return "PrismaClientConstructorValidationError"; + } + }; + ee(B, "PrismaClientConstructorValidationError"); + var ka = ["datasources", "errorFormat", "log", "__internal"]; + var Da = ["pretty", "colorless", "minimal"]; + var _a = ["info", "query", "warn", "error"]; + var Up = { datasources: (e, t) => { + if (!!e) { + if (typeof e != "object" || Array.isArray(e)) + throw new B(`Invalid value ${JSON.stringify(e)} for "datasources" provided to PrismaClient constructor`); + for (let [r, n] of Object.entries(e)) { + if (!t.includes(r)) { + let i = ht(r, t) || ` Available datasources: ${t.join(", ")}`; + throw new B(`Unknown datasource ${r} provided to PrismaClient constructor.${i}`); + } + if (typeof n != "object" || Array.isArray(n)) + throw new B(`Invalid value ${JSON.stringify(e)} for datasource "${r}" provided to PrismaClient constructor. +It should have this form: { url: "CONNECTION_STRING" }`); + if (n && typeof n == "object") + for (let [i, o] of Object.entries(n)) { + if (i !== "url") + throw new B(`Invalid value ${JSON.stringify(e)} for datasource "${r}" provided to PrismaClient constructor. +It should have this form: { url: "CONNECTION_STRING" }`); + if (typeof o != "string") + throw new B(`Invalid value ${JSON.stringify(o)} for datasource "${r}" provided to PrismaClient constructor. +It should have this form: { url: "CONNECTION_STRING" }`); + } + } + } + }, errorFormat: (e) => { + if (!!e) { + if (typeof e != "string") + throw new B(`Invalid value ${JSON.stringify(e)} for "errorFormat" provided to PrismaClient constructor.`); + if (!Da.includes(e)) { + let t = ht(e, Da); + throw new B(`Invalid errorFormat ${e} provided to PrismaClient constructor.${t}`); + } + } + }, log: (e) => { + if (!e) + return; + if (!Array.isArray(e)) + throw new B(`Invalid value ${JSON.stringify(e)} for "log" provided to PrismaClient constructor.`); + function t(r) { + if (typeof r == "string" && !_a.includes(r)) { + let n = ht(r, _a); + throw new B(`Invalid log level "${r}" provided to PrismaClient constructor.${n}`); + } + } + for (let r of e) { + t(r); + let n = { level: t, emit: (i) => { + let o = ["stdout", "event"]; + if (!o.includes(i)) { + let s = ht(i, o); + throw new B(`Invalid value ${JSON.stringify(i)} for "emit" in logLevel provided to PrismaClient constructor.${s}`); + } + } }; + if (r && typeof r == "object") + for (let [i, o] of Object.entries(r)) + if (n[i]) + n[i](o); + else + throw new B(`Invalid property ${i} for "log" provided to PrismaClient constructor`); + } + }, __internal: (e) => { + if (!e) + return; + let t = ["debug", "hooks", "engine", "measurePerformance"]; + if (typeof e != "object") + throw new B(`Invalid value ${JSON.stringify(e)} for "__internal" to PrismaClient constructor`); + for (let [r] of Object.entries(e)) + if (!t.includes(r)) { + let n = ht(r, t); + throw new B(`Invalid property ${JSON.stringify(r)} for "__internal" provided to PrismaClient constructor.${n}`); + } + } }; + function Na(e, t) { + for (let [r, n] of Object.entries(e)) { + if (!ka.includes(r)) { + let i = ht(r, ka); + throw new B(`Unknown property ${r} provided to PrismaClient constructor.${i}`); + } + Up[r](n, t); + } + } + function ht(e, t) { + if (t.length === 0 || typeof e != "string") + return ""; + let r = Qp(e, t); + return r ? ` Did you mean "${r}"?` : ""; + } + function Qp(e, t) { + if (t.length === 0) + return null; + let r = t.map((i) => ({ value: i, distance: (0, Ia.default)(e, i) })); + r.sort((i, o) => i.distance < o.distance ? -1 : 1); + let n = r[0]; + return n.distance < 3 ? n.value : null; + } + function La(e) { + return e.length === 0 ? Promise.resolve([]) : new Promise((t, r) => { + let n = new Array(e.length), i = null, o = false, s = 0, a = () => { + o || (s++, s === e.length && (o = true, i ? r(i) : t(n))); + }, l = (u) => { + o || (o = true, r(u)); + }; + for (let u = 0; u < e.length; u++) + e[u].then((c) => { + n[u] = c, a(); + }, (c) => { + if (!Jr(c)) { + l(c); + return; + } + c.batchRequestIdx === u ? l(c) : (i || (i = c), a()); + }); + }); + } + var Te = N("prisma:client"); + typeof globalThis == "object" && (globalThis.NODE_CLIENT = true); + var Jp = { requestArgsToMiddlewareArgs: (e) => e, middlewareArgsToRequestArgs: (e) => e }; + var Gp = Symbol.for("prisma.client.transaction.id"); + var Wp = { id: 0, nextId() { + return ++this.id; + } }; + function Ka(e) { + class t { + constructor(n) { + this._middlewares = new Qr(); + this._createPrismaPromise = ai(); + this.$extends = ks; + Ws(e), n && Na(n, e.datasourceNames); + let i = new ja.EventEmitter().on("error", () => { + }); + this._extensions = Be.empty(), this._previewFeatures = e.generator?.previewFeatures ?? [], this._clientVersion = e.clientVersion ?? Ra, this._activeProvider = e.activeProvider, this._dataProxy = e.dataProxy, this._tracingHelper = xa(this._previewFeatures), this._clientEngineType = Pn(e.generator); + let o = { rootEnvPath: e.relativeEnvPaths.rootEnvPath && Qt.default.resolve(e.dirname, e.relativeEnvPaths.rootEnvPath), schemaEnvPath: e.relativeEnvPaths.schemaEnvPath && Qt.default.resolve(e.dirname, e.relativeEnvPaths.schemaEnvPath) }, s = Ct(o, { conflictCheck: "none" }); + try { + let a = n ?? {}, l = a.__internal ?? {}, u = l.debug === true; + u && N.enable("prisma:client"); + let c = Qt.default.resolve(e.dirname, e.relativePath); + Ba.default.existsSync(c) || (c = e.dirname), Te("dirname", e.dirname), Te("relativePath", e.relativePath), Te("cwd", c); + let p = a.datasources || {}, d = Object.entries(p).filter(([f, b]) => b && b.url).map(([f, { url: b }]) => ({ name: f, url: b })), g = Ta([], d, (f) => f.name), y = l.engine || {}; + if (a.errorFormat ? this._errorFormat = a.errorFormat : process.env.NODE_ENV === "production" ? this._errorFormat = "minimal" : process.env.NO_COLOR ? this._errorFormat = "colorless" : this._errorFormat = "colorless", this._runtimeDataModel = e.runtimeDataModel, this._engineConfig = { cwd: c, dirname: e.dirname, enableDebugLogs: u, allowTriggerPanic: y.allowTriggerPanic, datamodelPath: Qt.default.join(e.dirname, e.filename ?? "schema.prisma"), prismaPath: y.binaryPath ?? void 0, engineEndpoint: y.endpoint, datasources: g, generator: e.generator, showColors: this._errorFormat === "pretty", logLevel: a.log && wa(a.log), logQueries: a.log && Boolean(typeof a.log == "string" ? a.log === "query" : a.log.find((f) => typeof f == "string" ? f === "query" : f.level === "query")), env: s?.parsed ?? e.injectableEdgeEnv?.parsed ?? {}, flags: [], clientVersion: e.clientVersion, previewFeatures: this._previewFeatures, activeProvider: e.activeProvider, inlineSchema: e.inlineSchema, inlineDatasources: e.inlineDatasources, inlineSchemaHash: e.inlineSchemaHash, tracingHelper: this._tracingHelper, logEmitter: i, isBundled: e.isBundled }, Te("clientVersion", e.clientVersion), Te("clientEngineType", this._dataProxy ? "dataproxy" : this._clientEngineType), this._dataProxy && Te("using Data Proxy with Node.js runtime"), this._engine = this.getEngine(), this._fetcher = new Hr(this, i), a.log) + for (let f of a.log) { + let b = typeof f == "string" ? f : f.emit === "stdout" ? f.level : null; + b && this.$on(b, (E) => { + St.log(`${St.tags[b] ?? ""}`, E.message || E.query); + }); + } + this._metrics = new st(this._engine); + } catch (a) { + throw a.clientVersion = this._clientVersion, a; + } + return this._appliedParent = Bt(this); + } + get [Symbol.toStringTag]() { + return "PrismaClient"; + } + getEngine() { + if (this._dataProxy, this._clientEngineType === "library") + return new Dt(this._engineConfig); + throw this._clientEngineType, "binary", new te("Invalid client engine type, please use `library` or `binary`", { clientVersion: this._clientVersion }); + } + $use(n) { + this._middlewares.use(n); + } + $on(n, i) { + n === "beforeExit" ? this._engine.on("beforeExit", i) : this._engine.on(n, (o) => { + let s = o.fields; + return i(n === "query" ? { timestamp: o.timestamp, query: s?.query ?? o.query, params: s?.params ?? o.params, duration: s?.duration_ms ?? o.duration, target: o.target } : { timestamp: o.timestamp, message: s?.message ?? o.message, target: o.target }); + }); + } + $connect() { + try { + return this._engine.start(); + } catch (n) { + throw n.clientVersion = this._clientVersion, n; + } + } + async _runDisconnect() { + await this._engine.stop(), delete this._connectionPromise, this._engine = this.getEngine(), delete this._disconnectionPromise; + } + async $disconnect() { + try { + await this._engine.stop(); + } catch (n) { + throw n.clientVersion = this._clientVersion, n; + } finally { + ki(); + } + } + $executeRawInternal(n, i, o, s) { + return this._request({ action: "executeRaw", args: o, transaction: n, clientMethod: i, argsMapper: si(this._activeProvider, i), callsite: je(this._errorFormat), dataPath: [], middlewareArgsMapper: s }); + } + $executeRaw(n, ...i) { + return this._createPrismaPromise((o) => { + if (n.raw !== void 0 || n.sql !== void 0) { + let [s, a] = $a(n, i); + return oi(this._activeProvider, s.text, s.values, Array.isArray(n) ? "prisma.$executeRaw``" : "prisma.$executeRaw(sql``)"), this.$executeRawInternal(o, "$executeRaw", s, a); + } + throw new te("`$executeRaw` is a tag function, please use it like the following:\n```\nconst result = await prisma.$executeRaw`UPDATE User SET cool = ${true} WHERE email = ${'user@email.com'};`\n```\n\nOr read our docs at https://www.prisma.io/docs/concepts/components/prisma-client/raw-database-access#executeraw\n", { clientVersion: this._clientVersion }); + }); + } + $executeRawUnsafe(n, ...i) { + return this._createPrismaPromise((o) => (oi(this._activeProvider, n, i, "prisma.$executeRawUnsafe(, [...values])"), this.$executeRawInternal(o, "$executeRawUnsafe", [n, ...i]))); + } + $runCommandRaw(n) { + if (e.activeProvider !== "mongodb") + throw new te(`The ${e.activeProvider} provider does not support $runCommandRaw. Use the mongodb provider.`, { clientVersion: this._clientVersion }); + return this._createPrismaPromise((i) => this._request({ args: n, clientMethod: "$runCommandRaw", dataPath: [], action: "runCommandRaw", argsMapper: la, callsite: je(this._errorFormat), transaction: i })); + } + async $queryRawInternal(n, i, o, s) { + return this._request({ action: "queryRaw", args: o, transaction: n, clientMethod: i, argsMapper: si(this._activeProvider, i), callsite: je(this._errorFormat), dataPath: [], middlewareArgsMapper: s }).then(Fa); + } + $queryRaw(n, ...i) { + return this._createPrismaPromise((o) => { + if (n.raw !== void 0 || n.sql !== void 0) + return this.$queryRawInternal(o, "$queryRaw", ...$a(n, i)); + throw new te("`$queryRaw` is a tag function, please use it like the following:\n```\nconst result = await prisma.$queryRaw`SELECT * FROM User WHERE id = ${1} OR email = ${'user@email.com'};`\n```\n\nOr read our docs at https://www.prisma.io/docs/concepts/components/prisma-client/raw-database-access#queryraw\n", { clientVersion: this._clientVersion }); + }); + } + $queryRawUnsafe(n, ...i) { + return this._createPrismaPromise((o) => this.$queryRawInternal(o, "$queryRawUnsafe", [n, ...i])); + } + _transactionWithArray({ promises: n, options: i }) { + let o = Wp.nextId(), s = ba(n.length), a = n.map((l, u) => { + if (l?.[Symbol.toStringTag] !== "PrismaPromise") + throw new Error("All elements of the array need to be Prisma Client promises. Hint: Please make sure you are not awaiting the Prisma client calls you intended to pass in the $transaction function."); + let c = i?.isolationLevel, p = { kind: "batch", id: o, index: u, isolationLevel: c, lock: s }; + return l.requestTransaction?.(p) ?? l; + }); + return La(a); + } + async _transactionWithCallback({ callback: n, options: i }) { + let o = { traceparent: this._tracingHelper.getTraceParent() }, s = await this._engine.transaction("start", o, i), a; + try { + let l = { kind: "itx", ...s }; + a = await n(this._createItxClient(l)), await this._engine.transaction("commit", o, s); + } catch (l) { + throw await this._engine.transaction("rollback", o, s).catch(() => { + }), l; + } + return a; + } + _createItxClient(n) { + return Bt(xe(Lr(this), [re("_appliedParent", () => this._appliedParent._createItxClient(n)), re("_createPrismaPromise", () => ai(n)), re(Gp, () => n.id), Ot(Pa)])); + } + $transaction(n, i) { + let o; + typeof n == "function" ? o = () => this._transactionWithCallback({ callback: n, options: i }) : o = () => this._transactionWithArray({ promises: n, options: i }); + let s = { name: "transaction", attributes: { method: "$transaction" } }; + return this._tracingHelper.runInChildSpan(s, o); + } + _request(n) { + n.otelParentCtx = this._tracingHelper.getActiveContext(); + let i = n.middlewareArgsMapper ?? Jp, o = { args: i.requestArgsToMiddlewareArgs(n.args), dataPath: n.dataPath, runInTransaction: Boolean(n.transaction), action: n.action, model: n.model }, s = { middleware: { name: "middleware", middleware: true, attributes: { method: "$use" }, active: false }, operation: { name: "operation", attributes: { method: o.action, model: o.model, name: `${o.model}.${o.action}` } } }, a = -1, l = async (u) => { + let c = this._middlewares.get(++a); + if (c) + return this._tracingHelper.runInChildSpan(s.middleware, (b) => c(u, (E) => (b?.end(), l(E)))); + let { runInTransaction: p, args: d, ...g } = u, y = { ...n, ...g }; + d && (y.args = i.middlewareArgsToRequestArgs(d)), n.transaction !== void 0 && p === false && delete y.transaction; + let f = await qs(this, y); + return y.model ? Is({ result: f, modelName: y.model, args: y.args, extensions: this._extensions, runtimeDataModel: this._runtimeDataModel }) : f; + }; + return this._tracingHelper.runInChildSpan(s.operation, () => new qa.AsyncResource("prisma-client-request").runInAsyncScope(() => l(o))); + } + async _executeRequest({ args: n, clientMethod: i, dataPath: o, callsite: s, action: a, model: l, argsMapper: u, transaction: c, unpacker: p, otelParentCtx: d, customDataProxyFetch: g }) { + try { + n = u ? u(n) : n; + let y = { name: "serialize" }, f = this._tracingHelper.runInChildSpan(y, () => oa({ modelName: l, runtimeDataModel: this._runtimeDataModel, action: a, args: n, clientMethod: i, callsite: s, extensions: this._extensions, errorFormat: this._errorFormat, clientVersion: this._clientVersion })); + return N.enabled("prisma:client") && (Te("Prisma Client call:"), Te(`prisma.${i}(${fs(n)})`), Te("Generated request:"), Te(JSON.stringify(f, null, 2) + ` +`)), c?.kind === "batch" && await c.lock, this._fetcher.request({ protocolQuery: f, modelName: l, action: a, clientMethod: i, dataPath: o, callsite: s, args: n, extensions: this._extensions, transaction: c, unpacker: p, otelParentCtx: d, otelChildCtx: this._tracingHelper.getActiveContext(), customDataProxyFetch: g }); + } catch (y) { + throw y.clientVersion = this._clientVersion, y; + } + } + get $metrics() { + if (!this._hasPreviewFlag("metrics")) + throw new te("`metrics` preview feature must be enabled in order to access metrics API", { clientVersion: this._clientVersion }); + return this._metrics; + } + _hasPreviewFlag(n) { + return !!this._engineConfig.previewFeatures?.includes(n); + } + } + return t; + } + function $a(e, t) { + return Hp(e) ? [new U(e, t), fa] : [e, ga]; + } + function Hp(e) { + return Array.isArray(e) && Array.isArray(e.raw); + } + var zp = /* @__PURE__ */ new Set(["toJSON", "$$typeof", "asymmetricMatch", Symbol.iterator, Symbol.toStringTag, Symbol.isConcatSpreadable, Symbol.toPrimitive]); + function Va(e) { + return new Proxy(e, { get(t, r) { + if (r in t) + return t[r]; + if (!zp.has(r)) + throw new TypeError(`Invalid enum value: ${String(r)}`); + } }); + } + function Ua(e) { + Ct(e, { conflictCheck: "warn" }); + } + } +}); + +// node_modules/.prisma/client/index.js +var require_client2 = __commonJS({ + "node_modules/.prisma/client/index.js"(exports2) { + Object.defineProperty(exports2, "__esModule", { value: true }); + var { + PrismaClientKnownRequestError: PrismaClientKnownRequestError2, + PrismaClientUnknownRequestError: PrismaClientUnknownRequestError2, + PrismaClientRustPanicError: PrismaClientRustPanicError2, + PrismaClientInitializationError: PrismaClientInitializationError2, + PrismaClientValidationError: PrismaClientValidationError2, + NotFoundError: NotFoundError2, + getPrismaClient: getPrismaClient2, + sqltag: sqltag2, + empty: empty2, + join: join2, + raw: raw2, + Decimal: Decimal2, + Debug: Debug2, + objectEnumValues: objectEnumValues2, + makeStrictEnum: makeStrictEnum2, + Extensions: Extensions2, + warnOnce: warnOnce2, + defineDmmfProperty: defineDmmfProperty2, + Public: Public2 + } = require_library(); + var Prisma2 = {}; + exports2.Prisma = Prisma2; + Prisma2.prismaVersion = { + client: "5.1.0", + engine: "6a3747c37ff169c90047725a05a6ef02e32ac97e" + }; + Prisma2.PrismaClientKnownRequestError = PrismaClientKnownRequestError2; + Prisma2.PrismaClientUnknownRequestError = PrismaClientUnknownRequestError2; + Prisma2.PrismaClientRustPanicError = PrismaClientRustPanicError2; + Prisma2.PrismaClientInitializationError = PrismaClientInitializationError2; + Prisma2.PrismaClientValidationError = PrismaClientValidationError2; + Prisma2.NotFoundError = NotFoundError2; + Prisma2.Decimal = Decimal2; + Prisma2.sql = sqltag2; + Prisma2.empty = empty2; + Prisma2.join = join2; + Prisma2.raw = raw2; + Prisma2.validator = Public2.validator; + Prisma2.getExtensionContext = Extensions2.getExtensionContext; + Prisma2.defineExtension = Extensions2.defineExtension; + Prisma2.DbNull = objectEnumValues2.instances.DbNull; + Prisma2.JsonNull = objectEnumValues2.instances.JsonNull; + Prisma2.AnyNull = objectEnumValues2.instances.AnyNull; + Prisma2.NullTypes = { + DbNull: objectEnumValues2.classes.DbNull, + JsonNull: objectEnumValues2.classes.JsonNull, + AnyNull: objectEnumValues2.classes.AnyNull + }; + var path = require("path"); + exports2.$Enums = {}; + exports2.Prisma.TransactionIsolationLevel = makeStrictEnum2({ + ReadUncommitted: "ReadUncommitted", + ReadCommitted: "ReadCommitted", + RepeatableRead: "RepeatableRead", + Serializable: "Serializable" + }); + exports2.Prisma.NotificationScalarFieldEnum = { + id: "id", + title: "title", + message: "message", + message_type: "message_type" + }; + exports2.Prisma.SortOrder = { + asc: "asc", + desc: "desc" + }; + exports2.Prisma.QueryMode = { + default: "default", + insensitive: "insensitive" + }; + exports2.MessageType = exports2.$Enums.MessageType = { + USER_REQUEST: "USER_REQUEST", + OUTPUT: "OUTPUT" + }; + exports2.Prisma.ModelName = { + Notification: "Notification" + }; + var config2 = { + "generator": { + "name": "client", + "provider": { + "fromEnvVar": null, + "value": "prisma-client-js" + }, + "output": { + "value": "/home/pierre/public_html/goodfood/services/notification/node_modules/@prisma/client", + "fromEnvVar": null + }, + "config": { + "engineType": "library" + }, + "binaryTargets": [ + { + "fromEnvVar": null, + "value": "debian-openssl-3.0.x", + "native": true + } + ], + "previewFeatures": [] + }, + "relativeEnvPaths": { + "rootEnvPath": "../../../.env", + "schemaEnvPath": "../../../.env" + }, + "relativePath": "../../../prisma", + "clientVersion": "5.1.0", + "engineVersion": "6a3747c37ff169c90047725a05a6ef02e32ac97e", + "datasourceNames": [ + "db" + ], + "activeProvider": "postgresql", + "dataProxy": false, + "postinstall": false + }; + var fs2 = require("fs"); + config2.dirname = __dirname; + if (!fs2.existsSync(path.join(__dirname, "schema.prisma"))) { + const alternativePaths = [ + "node_modules/.prisma/client", + ".prisma/client" + ]; + const alternativePath = alternativePaths.find((altPath) => { + return fs2.existsSync(path.join(process.cwd(), altPath, "schema.prisma")); + }) ?? alternativePaths[0]; + config2.dirname = path.join(process.cwd(), alternativePath); + config2.isBundled = true; + } + config2.runtimeDataModel = JSON.parse('{"models":{"Notification":{"dbName":null,"fields":[{"name":"id","kind":"scalar","isList":false,"isRequired":true,"isUnique":false,"isId":true,"isReadOnly":false,"hasDefaultValue":true,"type":"String","default":{"name":"cuid","args":[]},"isGenerated":false,"isUpdatedAt":false},{"name":"title","kind":"scalar","isList":false,"isRequired":true,"isUnique":false,"isId":false,"isReadOnly":false,"hasDefaultValue":false,"type":"String","isGenerated":false,"isUpdatedAt":false},{"name":"message","kind":"scalar","isList":false,"isRequired":true,"isUnique":false,"isId":false,"isReadOnly":false,"hasDefaultValue":false,"type":"String","isGenerated":false,"isUpdatedAt":false},{"name":"message_type","kind":"enum","isList":false,"isRequired":true,"isUnique":false,"isId":false,"isReadOnly":false,"hasDefaultValue":false,"type":"MessageType","isGenerated":false,"isUpdatedAt":false}],"primaryKey":null,"uniqueFields":[],"uniqueIndexes":[],"isGenerated":false}},"enums":{"MessageType":{"values":[{"name":"USER_REQUEST","dbName":null},{"name":"OUTPUT","dbName":null}],"dbName":null}},"types":{}}'); + defineDmmfProperty2(exports2.Prisma, config2.runtimeDataModel); + var { warnEnvConflicts: warnEnvConflicts2 } = require_library(); + warnEnvConflicts2({ + rootEnvPath: config2.relativeEnvPaths.rootEnvPath && path.resolve(config2.dirname, config2.relativeEnvPaths.rootEnvPath), + schemaEnvPath: config2.relativeEnvPaths.schemaEnvPath && path.resolve(config2.dirname, config2.relativeEnvPaths.schemaEnvPath) + }); + var PrismaClient2 = getPrismaClient2(config2); + exports2.PrismaClient = PrismaClient2; + Object.assign(exports2, Prisma2); + path.join(__dirname, "libquery_engine-debian-openssl-3.0.x.so.node"); + path.join(process.cwd(), "node_modules/.prisma/client/libquery_engine-debian-openssl-3.0.x.so.node"); + path.join(__dirname, "schema.prisma"); + path.join(process.cwd(), "node_modules/.prisma/client/schema.prisma"); + } +}); + +// node_modules/@prisma/client/index.js +var require_client3 = __commonJS({ + "node_modules/@prisma/client/index.js"(exports2, module2) { + module2.exports = { + ...require_client2() + }; + } +}); + +// node_modules/requires-port/index.js +var require_requires_port = __commonJS({ + "node_modules/requires-port/index.js"(exports2, module2) { + "use strict"; + module2.exports = function required(port, protocol) { + protocol = protocol.split(":")[0]; + port = +port; + if (!port) + return false; + switch (protocol) { + case "http": + case "ws": + return port !== 80; + case "https": + case "wss": + return port !== 443; + case "ftp": + return port !== 21; + case "gopher": + return port !== 70; + case "file": + return false; + } + return port !== 0; + }; + } +}); + +// node_modules/querystringify/index.js +var require_querystringify = __commonJS({ + "node_modules/querystringify/index.js"(exports2) { + "use strict"; + var has = Object.prototype.hasOwnProperty; + var undef; + function decode(input) { + try { + return decodeURIComponent(input.replace(/\+/g, " ")); + } catch (e) { + return null; + } + } + function encode(input) { + try { + return encodeURIComponent(input); + } catch (e) { + return null; + } + } + function querystring(query) { + var parser = /([^=?#&]+)=?([^&]*)/g, result = {}, part; + while (part = parser.exec(query)) { + var key = decode(part[1]), value = decode(part[2]); + if (key === null || value === null || key in result) + continue; + result[key] = value; + } + return result; + } + function querystringify(obj, prefix) { + prefix = prefix || ""; + var pairs = [], value, key; + if ("string" !== typeof prefix) + prefix = "?"; + for (key in obj) { + if (has.call(obj, key)) { + value = obj[key]; + if (!value && (value === null || value === undef || isNaN(value))) { + value = ""; + } + key = encode(key); + value = encode(value); + if (key === null || value === null) + continue; + pairs.push(key + "=" + value); + } + } + return pairs.length ? prefix + pairs.join("&") : ""; + } + exports2.stringify = querystringify; + exports2.parse = querystring; + } +}); + +// node_modules/url-parse/index.js +var require_url_parse = __commonJS({ + "node_modules/url-parse/index.js"(exports2, module2) { + "use strict"; + var required = require_requires_port(); + var qs2 = require_querystringify(); + var controlOrWhitespace = /^[\x00-\x20\u00a0\u1680\u2000-\u200a\u2028\u2029\u202f\u205f\u3000\ufeff]+/; + var CRHTLF = /[\n\r\t]/g; + var slashes = /^[A-Za-z][A-Za-z0-9+-.]*:\/\//; + var port = /:\d+$/; + var protocolre = /^([a-z][a-z0-9.+-]*:)?(\/\/)?([\\/]+)?([\S\s]*)/i; + var windowsDriveLetter = /^[a-zA-Z]:/; + function trimLeft(str) { + return (str ? str : "").toString().replace(controlOrWhitespace, ""); + } + var rules = [ + ["#", "hash"], + // Extract from the back. + ["?", "query"], + // Extract from the back. + function sanitize(address, url) { + return isSpecial(url.protocol) ? address.replace(/\\/g, "/") : address; + }, + ["/", "pathname"], + // Extract from the back. + ["@", "auth", 1], + // Extract from the front. + [NaN, "host", void 0, 1, 1], + // Set left over value. + [/:(\d*)$/, "port", void 0, 1], + // RegExp the back. + [NaN, "hostname", void 0, 1, 1] + // Set left over. + ]; + var ignore = { hash: 1, query: 1 }; + function lolcation(loc) { + var globalVar; + if (typeof window !== "undefined") + globalVar = window; + else if (typeof global !== "undefined") + globalVar = global; + else if (typeof self !== "undefined") + globalVar = self; + else + globalVar = {}; + var location = globalVar.location || {}; + loc = loc || location; + var finaldestination = {}, type = typeof loc, key; + if ("blob:" === loc.protocol) { + finaldestination = new Url(unescape(loc.pathname), {}); + } else if ("string" === type) { + finaldestination = new Url(loc, {}); + for (key in ignore) + delete finaldestination[key]; + } else if ("object" === type) { + for (key in loc) { + if (key in ignore) + continue; + finaldestination[key] = loc[key]; + } + if (finaldestination.slashes === void 0) { + finaldestination.slashes = slashes.test(loc.href); + } + } + return finaldestination; + } + function isSpecial(scheme) { + return scheme === "file:" || scheme === "ftp:" || scheme === "http:" || scheme === "https:" || scheme === "ws:" || scheme === "wss:"; + } + function extractProtocol(address, location) { + address = trimLeft(address); + address = address.replace(CRHTLF, ""); + location = location || {}; + var match = protocolre.exec(address); + var protocol = match[1] ? match[1].toLowerCase() : ""; + var forwardSlashes = !!match[2]; + var otherSlashes = !!match[3]; + var slashesCount = 0; + var rest; + if (forwardSlashes) { + if (otherSlashes) { + rest = match[2] + match[3] + match[4]; + slashesCount = match[2].length + match[3].length; + } else { + rest = match[2] + match[4]; + slashesCount = match[2].length; + } + } else { + if (otherSlashes) { + rest = match[3] + match[4]; + slashesCount = match[3].length; + } else { + rest = match[4]; + } + } + if (protocol === "file:") { + if (slashesCount >= 2) { + rest = rest.slice(2); + } + } else if (isSpecial(protocol)) { + rest = match[4]; + } else if (protocol) { + if (forwardSlashes) { + rest = rest.slice(2); + } + } else if (slashesCount >= 2 && isSpecial(location.protocol)) { + rest = match[4]; + } + return { + protocol, + slashes: forwardSlashes || isSpecial(protocol), + slashesCount, + rest + }; + } + function resolve(relative, base) { + if (relative === "") + return base; + var path = (base || "/").split("/").slice(0, -1).concat(relative.split("/")), i = path.length, last = path[i - 1], unshift = false, up2 = 0; + while (i--) { + if (path[i] === ".") { + path.splice(i, 1); + } else if (path[i] === "..") { + path.splice(i, 1); + up2++; + } else if (up2) { + if (i === 0) + unshift = true; + path.splice(i, 1); + up2--; + } + } + if (unshift) + path.unshift(""); + if (last === "." || last === "..") + path.push(""); + return path.join("/"); + } + function Url(address, location, parser) { + address = trimLeft(address); + address = address.replace(CRHTLF, ""); + if (!(this instanceof Url)) { + return new Url(address, location, parser); + } + var relative, extracted, parse, instruction, index, key, instructions = rules.slice(), type = typeof location, url = this, i = 0; + if ("object" !== type && "string" !== type) { + parser = location; + location = null; + } + if (parser && "function" !== typeof parser) + parser = qs2.parse; + location = lolcation(location); + extracted = extractProtocol(address || "", location); + relative = !extracted.protocol && !extracted.slashes; + url.slashes = extracted.slashes || relative && location.slashes; + url.protocol = extracted.protocol || location.protocol || ""; + address = extracted.rest; + if (extracted.protocol === "file:" && (extracted.slashesCount !== 2 || windowsDriveLetter.test(address)) || !extracted.slashes && (extracted.protocol || extracted.slashesCount < 2 || !isSpecial(url.protocol))) { + instructions[3] = [/(.*)/, "pathname"]; + } + for (; i < instructions.length; i++) { + instruction = instructions[i]; + if (typeof instruction === "function") { + address = instruction(address, url); + continue; + } + parse = instruction[0]; + key = instruction[1]; + if (parse !== parse) { + url[key] = address; + } else if ("string" === typeof parse) { + index = parse === "@" ? address.lastIndexOf(parse) : address.indexOf(parse); + if (~index) { + if ("number" === typeof instruction[2]) { + url[key] = address.slice(0, index); + address = address.slice(index + instruction[2]); + } else { + url[key] = address.slice(index); + address = address.slice(0, index); + } + } + } else if (index = parse.exec(address)) { + url[key] = index[1]; + address = address.slice(0, index.index); + } + url[key] = url[key] || (relative && instruction[3] ? location[key] || "" : ""); + if (instruction[4]) + url[key] = url[key].toLowerCase(); + } + if (parser) + url.query = parser(url.query); + if (relative && location.slashes && url.pathname.charAt(0) !== "/" && (url.pathname !== "" || location.pathname !== "")) { + url.pathname = resolve(url.pathname, location.pathname); + } + if (url.pathname.charAt(0) !== "/" && isSpecial(url.protocol)) { + url.pathname = "/" + url.pathname; + } + if (!required(url.port, url.protocol)) { + url.host = url.hostname; + url.port = ""; + } + url.username = url.password = ""; + if (url.auth) { + index = url.auth.indexOf(":"); + if (~index) { + url.username = url.auth.slice(0, index); + url.username = encodeURIComponent(decodeURIComponent(url.username)); + url.password = url.auth.slice(index + 1); + url.password = encodeURIComponent(decodeURIComponent(url.password)); + } else { + url.username = encodeURIComponent(decodeURIComponent(url.auth)); + } + url.auth = url.password ? url.username + ":" + url.password : url.username; + } + url.origin = url.protocol !== "file:" && isSpecial(url.protocol) && url.host ? url.protocol + "//" + url.host : "null"; + url.href = url.toString(); + } + function set(part, value, fn) { + var url = this; + switch (part) { + case "query": + if ("string" === typeof value && value.length) { + value = (fn || qs2.parse)(value); + } + url[part] = value; + break; + case "port": + url[part] = value; + if (!required(value, url.protocol)) { + url.host = url.hostname; + url[part] = ""; + } else if (value) { + url.host = url.hostname + ":" + value; + } + break; + case "hostname": + url[part] = value; + if (url.port) + value += ":" + url.port; + url.host = value; + break; + case "host": + url[part] = value; + if (port.test(value)) { + value = value.split(":"); + url.port = value.pop(); + url.hostname = value.join(":"); + } else { + url.hostname = value; + url.port = ""; + } + break; + case "protocol": + url.protocol = value.toLowerCase(); + url.slashes = !fn; + break; + case "pathname": + case "hash": + if (value) { + var char = part === "pathname" ? "/" : "#"; + url[part] = value.charAt(0) !== char ? char + value : value; + } else { + url[part] = value; + } + break; + case "username": + case "password": + url[part] = encodeURIComponent(value); + break; + case "auth": + var index = value.indexOf(":"); + if (~index) { + url.username = value.slice(0, index); + url.username = encodeURIComponent(decodeURIComponent(url.username)); + url.password = value.slice(index + 1); + url.password = encodeURIComponent(decodeURIComponent(url.password)); + } else { + url.username = encodeURIComponent(decodeURIComponent(value)); + } + } + for (var i = 0; i < rules.length; i++) { + var ins = rules[i]; + if (ins[4]) + url[ins[1]] = url[ins[1]].toLowerCase(); + } + url.auth = url.password ? url.username + ":" + url.password : url.username; + url.origin = url.protocol !== "file:" && isSpecial(url.protocol) && url.host ? url.protocol + "//" + url.host : "null"; + url.href = url.toString(); + return url; + } + function toString(stringify) { + if (!stringify || "function" !== typeof stringify) + stringify = qs2.stringify; + var query, url = this, host = url.host, protocol = url.protocol; + if (protocol && protocol.charAt(protocol.length - 1) !== ":") + protocol += ":"; + var result = protocol + (url.protocol && url.slashes || isSpecial(url.protocol) ? "//" : ""); + if (url.username) { + result += url.username; + if (url.password) + result += ":" + url.password; + result += "@"; + } else if (url.password) { + result += ":" + url.password; + result += "@"; + } else if (url.protocol !== "file:" && isSpecial(url.protocol) && !host && url.pathname !== "/") { + result += "@"; + } + if (host[host.length - 1] === ":" || port.test(url.hostname) && !url.port) { + host += ":"; + } + result += host + url.pathname; + query = "object" === typeof url.query ? stringify(url.query) : url.query; + if (query) + result += "?" !== query.charAt(0) ? "?" + query : query; + if (url.hash) + result += url.hash; + return result; + } + Url.prototype = { set, toString }; + Url.extractProtocol = extractProtocol; + Url.location = lolcation; + Url.trimLeft = trimLeft; + Url.qs = qs2; + module2.exports = Url; + } +}); + +// node_modules/buffer-more-ints/buffer-more-ints.js +var require_buffer_more_ints = __commonJS({ + "node_modules/buffer-more-ints/buffer-more-ints.js"(exports2, module2) { + "use strict"; + var SHIFT_LEFT_32 = (1 << 16) * (1 << 16); + var SHIFT_RIGHT_32 = 1 / SHIFT_LEFT_32; + var MAX_INT = 9007199254740991; + function isContiguousInt(val) { + return val <= MAX_INT && val >= -MAX_INT; + } + function assertContiguousInt(val) { + if (!isContiguousInt(val)) { + throw new TypeError("number cannot be represented as a contiguous integer"); + } + } + module2.exports.isContiguousInt = isContiguousInt; + module2.exports.assertContiguousInt = assertContiguousInt; + ["UInt", "Int"].forEach(function(sign) { + var suffix = sign + "8"; + module2.exports["read" + suffix] = Buffer.prototype["read" + suffix].call; + module2.exports["write" + suffix] = Buffer.prototype["write" + suffix].call; + ["16", "32"].forEach(function(size) { + ["LE", "BE"].forEach(function(endian) { + var suffix2 = sign + size + endian; + var read = Buffer.prototype["read" + suffix2]; + module2.exports["read" + suffix2] = function(buf, offset) { + return read.call(buf, offset); + }; + var write = Buffer.prototype["write" + suffix2]; + module2.exports["write" + suffix2] = function(buf, val, offset) { + return write.call(buf, val, offset); + }; + }); + }); + }); + function check_value(val, min, max) { + val = +val; + if (typeof val != "number" || val < min || val > max || Math.floor(val) !== val) { + throw new TypeError('"value" argument is out of bounds'); + } + return val; + } + function check_bounds(buf, offset, len) { + if (offset < 0 || offset + len > buf.length) { + throw new RangeError("Index out of range"); + } + } + function readUInt24BE(buf, offset) { + return buf.readUInt8(offset) << 16 | buf.readUInt16BE(offset + 1); + } + module2.exports.readUInt24BE = readUInt24BE; + function writeUInt24BE(buf, val, offset) { + val = check_value(val, 0, 16777215); + check_bounds(buf, offset, 3); + buf.writeUInt8(val >>> 16, offset); + buf.writeUInt16BE(val & 65535, offset + 1); + } + module2.exports.writeUInt24BE = writeUInt24BE; + function readUInt40BE(buf, offset) { + return (buf.readUInt8(offset) || 0) * SHIFT_LEFT_32 + buf.readUInt32BE(offset + 1); + } + module2.exports.readUInt40BE = readUInt40BE; + function writeUInt40BE(buf, val, offset) { + val = check_value(val, 0, 1099511627775); + check_bounds(buf, offset, 5); + buf.writeUInt8(Math.floor(val * SHIFT_RIGHT_32), offset); + buf.writeInt32BE(val & -1, offset + 1); + } + module2.exports.writeUInt40BE = writeUInt40BE; + function readUInt48BE(buf, offset) { + return buf.readUInt16BE(offset) * SHIFT_LEFT_32 + buf.readUInt32BE(offset + 2); + } + module2.exports.readUInt48BE = readUInt48BE; + function writeUInt48BE(buf, val, offset) { + val = check_value(val, 0, 281474976710655); + check_bounds(buf, offset, 6); + buf.writeUInt16BE(Math.floor(val * SHIFT_RIGHT_32), offset); + buf.writeInt32BE(val & -1, offset + 2); + } + module2.exports.writeUInt48BE = writeUInt48BE; + function readUInt56BE(buf, offset) { + return ((buf.readUInt8(offset) || 0) << 16 | buf.readUInt16BE(offset + 1)) * SHIFT_LEFT_32 + buf.readUInt32BE(offset + 3); + } + module2.exports.readUInt56BE = readUInt56BE; + function writeUInt56BE(buf, val, offset) { + val = check_value(val, 0, 72057594037927940); + check_bounds(buf, offset, 7); + if (val < 72057594037927940) { + var hi2 = Math.floor(val * SHIFT_RIGHT_32); + buf.writeUInt8(hi2 >>> 16, offset); + buf.writeUInt16BE(hi2 & 65535, offset + 1); + buf.writeInt32BE(val & -1, offset + 3); + } else { + buf[offset] = 255; + buf[offset + 1] = 255; + buf[offset + 2] = 255; + buf[offset + 3] = 255; + buf[offset + 4] = 255; + buf[offset + 5] = 255; + buf[offset + 6] = 255; + } + } + module2.exports.writeUInt56BE = writeUInt56BE; + function readUInt64BE(buf, offset) { + return buf.readUInt32BE(offset) * SHIFT_LEFT_32 + buf.readUInt32BE(offset + 4); + } + module2.exports.readUInt64BE = readUInt64BE; + function writeUInt64BE(buf, val, offset) { + val = check_value(val, 0, 18446744073709552e3); + check_bounds(buf, offset, 8); + if (val < 18446744073709552e3) { + buf.writeUInt32BE(Math.floor(val * SHIFT_RIGHT_32), offset); + buf.writeInt32BE(val & -1, offset + 4); + } else { + buf[offset] = 255; + buf[offset + 1] = 255; + buf[offset + 2] = 255; + buf[offset + 3] = 255; + buf[offset + 4] = 255; + buf[offset + 5] = 255; + buf[offset + 6] = 255; + buf[offset + 7] = 255; + } + } + module2.exports.writeUInt64BE = writeUInt64BE; + function readUInt24LE(buf, offset) { + return buf.readUInt8(offset + 2) << 16 | buf.readUInt16LE(offset); + } + module2.exports.readUInt24LE = readUInt24LE; + function writeUInt24LE(buf, val, offset) { + val = check_value(val, 0, 16777215); + check_bounds(buf, offset, 3); + buf.writeUInt16LE(val & 65535, offset); + buf.writeUInt8(val >>> 16, offset + 2); + } + module2.exports.writeUInt24LE = writeUInt24LE; + function readUInt40LE(buf, offset) { + return (buf.readUInt8(offset + 4) || 0) * SHIFT_LEFT_32 + buf.readUInt32LE(offset); + } + module2.exports.readUInt40LE = readUInt40LE; + function writeUInt40LE(buf, val, offset) { + val = check_value(val, 0, 1099511627775); + check_bounds(buf, offset, 5); + buf.writeInt32LE(val & -1, offset); + buf.writeUInt8(Math.floor(val * SHIFT_RIGHT_32), offset + 4); + } + module2.exports.writeUInt40LE = writeUInt40LE; + function readUInt48LE(buf, offset) { + return buf.readUInt16LE(offset + 4) * SHIFT_LEFT_32 + buf.readUInt32LE(offset); + } + module2.exports.readUInt48LE = readUInt48LE; + function writeUInt48LE(buf, val, offset) { + val = check_value(val, 0, 281474976710655); + check_bounds(buf, offset, 6); + buf.writeInt32LE(val & -1, offset); + buf.writeUInt16LE(Math.floor(val * SHIFT_RIGHT_32), offset + 4); + } + module2.exports.writeUInt48LE = writeUInt48LE; + function readUInt56LE(buf, offset) { + return ((buf.readUInt8(offset + 6) || 0) << 16 | buf.readUInt16LE(offset + 4)) * SHIFT_LEFT_32 + buf.readUInt32LE(offset); + } + module2.exports.readUInt56LE = readUInt56LE; + function writeUInt56LE(buf, val, offset) { + val = check_value(val, 0, 72057594037927940); + check_bounds(buf, offset, 7); + if (val < 72057594037927940) { + buf.writeInt32LE(val & -1, offset); + var hi2 = Math.floor(val * SHIFT_RIGHT_32); + buf.writeUInt16LE(hi2 & 65535, offset + 4); + buf.writeUInt8(hi2 >>> 16, offset + 6); + } else { + buf[offset] = 255; + buf[offset + 1] = 255; + buf[offset + 2] = 255; + buf[offset + 3] = 255; + buf[offset + 4] = 255; + buf[offset + 5] = 255; + buf[offset + 6] = 255; + } + } + module2.exports.writeUInt56LE = writeUInt56LE; + function readUInt64LE(buf, offset) { + return buf.readUInt32LE(offset + 4) * SHIFT_LEFT_32 + buf.readUInt32LE(offset); + } + module2.exports.readUInt64LE = readUInt64LE; + function writeUInt64LE(buf, val, offset) { + val = check_value(val, 0, 18446744073709552e3); + check_bounds(buf, offset, 8); + if (val < 18446744073709552e3) { + buf.writeInt32LE(val & -1, offset); + buf.writeUInt32LE(Math.floor(val * SHIFT_RIGHT_32), offset + 4); + } else { + buf[offset] = 255; + buf[offset + 1] = 255; + buf[offset + 2] = 255; + buf[offset + 3] = 255; + buf[offset + 4] = 255; + buf[offset + 5] = 255; + buf[offset + 6] = 255; + buf[offset + 7] = 255; + } + } + module2.exports.writeUInt64LE = writeUInt64LE; + function readInt24BE(buf, offset) { + return (buf.readInt8(offset) << 16) + buf.readUInt16BE(offset + 1); + } + module2.exports.readInt24BE = readInt24BE; + function writeInt24BE(buf, val, offset) { + val = check_value(val, -8388608, 8388607); + check_bounds(buf, offset, 3); + buf.writeInt8(val >> 16, offset); + buf.writeUInt16BE(val & 65535, offset + 1); + } + module2.exports.writeInt24BE = writeInt24BE; + function readInt40BE(buf, offset) { + return (buf.readInt8(offset) || 0) * SHIFT_LEFT_32 + buf.readUInt32BE(offset + 1); + } + module2.exports.readInt40BE = readInt40BE; + function writeInt40BE(buf, val, offset) { + val = check_value(val, -549755813888, 549755813887); + check_bounds(buf, offset, 5); + buf.writeInt8(Math.floor(val * SHIFT_RIGHT_32), offset); + buf.writeInt32BE(val & -1, offset + 1); + } + module2.exports.writeInt40BE = writeInt40BE; + function readInt48BE(buf, offset) { + return buf.readInt16BE(offset) * SHIFT_LEFT_32 + buf.readUInt32BE(offset + 2); + } + module2.exports.readInt48BE = readInt48BE; + function writeInt48BE(buf, val, offset) { + val = check_value(val, -140737488355328, 140737488355327); + check_bounds(buf, offset, 6); + buf.writeInt16BE(Math.floor(val * SHIFT_RIGHT_32), offset); + buf.writeInt32BE(val & -1, offset + 2); + } + module2.exports.writeInt48BE = writeInt48BE; + function readInt56BE(buf, offset) { + return (((buf.readInt8(offset) || 0) << 16) + buf.readUInt16BE(offset + 1)) * SHIFT_LEFT_32 + buf.readUInt32BE(offset + 3); + } + module2.exports.readInt56BE = readInt56BE; + function writeInt56BE(buf, val, offset) { + val = check_value(val, -576460752303423500, 36028797018963970); + check_bounds(buf, offset, 7); + if (val < 36028797018963970) { + var hi2 = Math.floor(val * SHIFT_RIGHT_32); + buf.writeInt8(hi2 >> 16, offset); + buf.writeUInt16BE(hi2 & 65535, offset + 1); + buf.writeInt32BE(val & -1, offset + 3); + } else { + buf[offset] = 127; + buf[offset + 1] = 255; + buf[offset + 2] = 255; + buf[offset + 3] = 255; + buf[offset + 4] = 255; + buf[offset + 5] = 255; + buf[offset + 6] = 255; + } + } + module2.exports.writeInt56BE = writeInt56BE; + function readInt64BE(buf, offset) { + return buf.readInt32BE(offset) * SHIFT_LEFT_32 + buf.readUInt32BE(offset + 4); + } + module2.exports.readInt64BE = readInt64BE; + function writeInt64BE(buf, val, offset) { + val = check_value(val, -23611832414348226e5, 9223372036854776e3); + check_bounds(buf, offset, 8); + if (val < 9223372036854776e3) { + buf.writeInt32BE(Math.floor(val * SHIFT_RIGHT_32), offset); + buf.writeInt32BE(val & -1, offset + 4); + } else { + buf[offset] = 127; + buf[offset + 1] = 255; + buf[offset + 2] = 255; + buf[offset + 3] = 255; + buf[offset + 4] = 255; + buf[offset + 5] = 255; + buf[offset + 6] = 255; + buf[offset + 7] = 255; + } + } + module2.exports.writeInt64BE = writeInt64BE; + function readInt24LE(buf, offset) { + return (buf.readInt8(offset + 2) << 16) + buf.readUInt16LE(offset); + } + module2.exports.readInt24LE = readInt24LE; + function writeInt24LE(buf, val, offset) { + val = check_value(val, -8388608, 8388607); + check_bounds(buf, offset, 3); + buf.writeUInt16LE(val & 65535, offset); + buf.writeInt8(val >> 16, offset + 2); + } + module2.exports.writeInt24LE = writeInt24LE; + function readInt40LE(buf, offset) { + return (buf.readInt8(offset + 4) || 0) * SHIFT_LEFT_32 + buf.readUInt32LE(offset); + } + module2.exports.readInt40LE = readInt40LE; + function writeInt40LE(buf, val, offset) { + val = check_value(val, -549755813888, 549755813887); + check_bounds(buf, offset, 5); + buf.writeInt32LE(val & -1, offset); + buf.writeInt8(Math.floor(val * SHIFT_RIGHT_32), offset + 4); + } + module2.exports.writeInt40LE = writeInt40LE; + function readInt48LE(buf, offset) { + return buf.readInt16LE(offset + 4) * SHIFT_LEFT_32 + buf.readUInt32LE(offset); + } + module2.exports.readInt48LE = readInt48LE; + function writeInt48LE(buf, val, offset) { + val = check_value(val, -140737488355328, 140737488355327); + check_bounds(buf, offset, 6); + buf.writeInt32LE(val & -1, offset); + buf.writeInt16LE(Math.floor(val * SHIFT_RIGHT_32), offset + 4); + } + module2.exports.writeInt48LE = writeInt48LE; + function readInt56LE(buf, offset) { + return (((buf.readInt8(offset + 6) || 0) << 16) + buf.readUInt16LE(offset + 4)) * SHIFT_LEFT_32 + buf.readUInt32LE(offset); + } + module2.exports.readInt56LE = readInt56LE; + function writeInt56LE(buf, val, offset) { + val = check_value(val, -36028797018963970, 36028797018963970); + check_bounds(buf, offset, 7); + if (val < 36028797018963970) { + buf.writeInt32LE(val & -1, offset); + var hi2 = Math.floor(val * SHIFT_RIGHT_32); + buf.writeUInt16LE(hi2 & 65535, offset + 4); + buf.writeInt8(hi2 >> 16, offset + 6); + } else { + buf[offset] = 255; + buf[offset + 1] = 255; + buf[offset + 2] = 255; + buf[offset + 3] = 255; + buf[offset + 4] = 255; + buf[offset + 5] = 255; + buf[offset + 6] = 127; + } + } + module2.exports.writeInt56LE = writeInt56LE; + function readInt64LE(buf, offset) { + return buf.readInt32LE(offset + 4) * SHIFT_LEFT_32 + buf.readUInt32LE(offset); + } + module2.exports.readInt64LE = readInt64LE; + function writeInt64LE(buf, val, offset) { + val = check_value(val, -9223372036854776e3, 9223372036854776e3); + check_bounds(buf, offset, 8); + if (val < 9223372036854776e3) { + buf.writeInt32LE(val & -1, offset); + buf.writeInt32LE(Math.floor(val * SHIFT_RIGHT_32), offset + 4); + } else { + buf[offset] = 255; + buf[offset + 1] = 255; + buf[offset + 2] = 255; + buf[offset + 3] = 255; + buf[offset + 4] = 255; + buf[offset + 5] = 255; + buf[offset + 6] = 255; + buf[offset + 7] = 127; + } + } + module2.exports.writeInt64LE = writeInt64LE; + } +}); + +// node_modules/amqplib/lib/codec.js +var require_codec = __commonJS({ + "node_modules/amqplib/lib/codec.js"(exports2, module2) { + "use strict"; + var ints = require_buffer_more_ints(); + function isFloatingPoint(n) { + return n >= 9223372036854776e3 || Math.abs(n) < 1125899906842624 && Math.floor(n) !== n; + } + function encodeTable(buffer, val, offset) { + var start = offset; + offset += 4; + for (var key in val) { + if (val[key] !== void 0) { + var len = Buffer.byteLength(key); + buffer.writeUInt8(len, offset); + offset++; + buffer.write(key, offset, "utf8"); + offset += len; + offset += encodeFieldValue(buffer, val[key], offset); + } + } + var size = offset - start; + buffer.writeUInt32BE(size - 4, start); + return size; + } + function encodeArray(buffer, val, offset) { + var start = offset; + offset += 4; + for (var i = 0, num = val.length; i < num; i++) { + offset += encodeFieldValue(buffer, val[i], offset); + } + var size = offset - start; + buffer.writeUInt32BE(size - 4, start); + return size; + } + function encodeFieldValue(buffer, value, offset) { + var start = offset; + var type = typeof value, val = value; + if (value && type === "object" && value.hasOwnProperty("!")) { + val = value.value; + type = value["!"]; + } + if (type == "number") { + if (isFloatingPoint(val)) { + type = "double"; + } else { + if (val < 128 && val >= -128) { + type = "byte"; + } else if (val >= -32768 && val < 32768) { + type = "short"; + } else if (val >= -2147483648 && val < 2147483648) { + type = "int"; + } else { + type = "long"; + } + } + } + function tag(t) { + buffer.write(t, offset); + offset++; + } + switch (type) { + case "string": + var len = Buffer.byteLength(val, "utf8"); + tag("S"); + buffer.writeUInt32BE(len, offset); + offset += 4; + buffer.write(val, offset, "utf8"); + offset += len; + break; + case "object": + if (val === null) { + tag("V"); + } else if (Array.isArray(val)) { + tag("A"); + offset += encodeArray(buffer, val, offset); + } else if (Buffer.isBuffer(val)) { + tag("x"); + buffer.writeUInt32BE(val.length, offset); + offset += 4; + val.copy(buffer, offset); + offset += val.length; + } else { + tag("F"); + offset += encodeTable(buffer, val, offset); + } + break; + case "boolean": + tag("t"); + buffer.writeUInt8(val ? 1 : 0, offset); + offset++; + break; + case "double": + case "float64": + tag("d"); + buffer.writeDoubleBE(val, offset); + offset += 8; + break; + case "byte": + case "int8": + tag("b"); + buffer.writeInt8(val, offset); + offset++; + break; + case "short": + case "int16": + tag("s"); + buffer.writeInt16BE(val, offset); + offset += 2; + break; + case "int": + case "int32": + tag("I"); + buffer.writeInt32BE(val, offset); + offset += 4; + break; + case "long": + case "int64": + tag("l"); + ints.writeInt64BE(buffer, val, offset); + offset += 8; + break; + case "timestamp": + tag("T"); + ints.writeUInt64BE(buffer, val, offset); + offset += 8; + break; + case "float": + tag("f"); + buffer.writeFloatBE(val, offset); + offset += 4; + break; + case "decimal": + tag("D"); + if (val.hasOwnProperty("places") && val.hasOwnProperty("digits") && val.places >= 0 && val.places < 256) { + buffer[offset] = val.places; + offset++; + buffer.writeUInt32BE(val.digits, offset); + offset += 4; + } else + throw new TypeError( + "Decimal value must be {'places': 0..255, 'digits': uint32}, got " + JSON.stringify(val) + ); + break; + default: + throw new TypeError("Unknown type to encode: " + type); + } + return offset - start; + } + function decodeFields(slice) { + var fields = {}, offset = 0, size = slice.length; + var len, key, val; + function decodeFieldValue() { + var tag = String.fromCharCode(slice[offset]); + offset++; + switch (tag) { + case "b": + val = slice.readInt8(offset); + offset++; + break; + case "S": + len = slice.readUInt32BE(offset); + offset += 4; + val = slice.toString("utf8", offset, offset + len); + offset += len; + break; + case "I": + val = slice.readInt32BE(offset); + offset += 4; + break; + case "D": + var places = slice[offset]; + offset++; + var digits = slice.readUInt32BE(offset); + offset += 4; + val = { "!": "decimal", value: { places, digits } }; + break; + case "T": + val = ints.readUInt64BE(slice, offset); + offset += 8; + val = { "!": "timestamp", value: val }; + break; + case "F": + len = slice.readUInt32BE(offset); + offset += 4; + val = decodeFields(slice.slice(offset, offset + len)); + offset += len; + break; + case "A": + len = slice.readUInt32BE(offset); + offset += 4; + decodeArray(offset + len); + break; + case "d": + val = slice.readDoubleBE(offset); + offset += 8; + break; + case "f": + val = slice.readFloatBE(offset); + offset += 4; + break; + case "l": + val = ints.readInt64BE(slice, offset); + offset += 8; + break; + case "s": + val = slice.readInt16BE(offset); + offset += 2; + break; + case "t": + val = slice[offset] != 0; + offset++; + break; + case "V": + val = null; + break; + case "x": + len = slice.readUInt32BE(offset); + offset += 4; + val = slice.slice(offset, offset + len); + offset += len; + break; + default: + throw new TypeError('Unexpected type tag "' + tag + '"'); + } + } + function decodeArray(until) { + var vals = []; + while (offset < until) { + decodeFieldValue(); + vals.push(val); + } + val = vals; + } + while (offset < size) { + len = slice.readUInt8(offset); + offset++; + key = slice.toString("utf8", offset, offset + len); + offset += len; + decodeFieldValue(); + fields[key] = val; + } + return fields; + } + module2.exports.encodeTable = encodeTable; + module2.exports.decodeFields = decodeFields; + } +}); + +// node_modules/amqplib/lib/defs.js +var require_defs = __commonJS({ + "node_modules/amqplib/lib/defs.js"(exports2, module2) { + "use strict"; + function decodeConnectionStart(buffer) { + var val, len, offset = 0, fields = { + versionMajor: void 0, + versionMinor: void 0, + serverProperties: void 0, + mechanisms: void 0, + locales: void 0 + }; + val = buffer[offset]; + offset++; + fields.versionMajor = val; + val = buffer[offset]; + offset++; + fields.versionMinor = val; + len = buffer.readUInt32BE(offset); + offset += 4; + val = decodeFields(buffer.slice(offset, offset + len)); + offset += len; + fields.serverProperties = val; + len = buffer.readUInt32BE(offset); + offset += 4; + val = buffer.slice(offset, offset + len); + offset += len; + fields.mechanisms = val; + len = buffer.readUInt32BE(offset); + offset += 4; + val = buffer.slice(offset, offset + len); + offset += len; + fields.locales = val; + return fields; + } + function encodeConnectionStart(channel, fields) { + var len, offset = 0, val = null, varyingSize = 0, scratchOffset = 0; + val = fields.serverProperties; + if (void 0 === val) + throw new Error("Missing value for mandatory field 'serverProperties'"); + if ("object" != typeof val) + throw new TypeError("Field 'serverProperties' is the wrong type; must be an object"); + len = encodeTable(SCRATCH, val, scratchOffset); + var serverProperties_encoded = SCRATCH.slice(scratchOffset, scratchOffset + len); + scratchOffset += len; + varyingSize += serverProperties_encoded.length; + val = fields.mechanisms; + if (void 0 === val) + val = Buffer.from("PLAIN"); + else if (!Buffer.isBuffer(val)) + throw new TypeError("Field 'mechanisms' is the wrong type; must be a Buffer"); + varyingSize += val.length; + val = fields.locales; + if (void 0 === val) + val = Buffer.from("en_US"); + else if (!Buffer.isBuffer(val)) + throw new TypeError("Field 'locales' is the wrong type; must be a Buffer"); + varyingSize += val.length; + var buffer = Buffer.alloc(22 + varyingSize); + buffer[0] = 1; + buffer.writeUInt16BE(channel, 1); + buffer.writeUInt32BE(655370, 7); + offset = 11; + val = fields.versionMajor; + if (void 0 === val) + val = 0; + else if ("number" != typeof val || isNaN(val)) + throw new TypeError("Field 'versionMajor' is the wrong type; must be a number (but not NaN)"); + buffer.writeUInt8(val, offset); + offset++; + val = fields.versionMinor; + if (void 0 === val) + val = 9; + else if ("number" != typeof val || isNaN(val)) + throw new TypeError("Field 'versionMinor' is the wrong type; must be a number (but not NaN)"); + buffer.writeUInt8(val, offset); + offset++; + offset += serverProperties_encoded.copy(buffer, offset); + val = fields.mechanisms; + void 0 === val && (val = Buffer.from("PLAIN")); + len = val.length; + buffer.writeUInt32BE(len, offset); + offset += 4; + val.copy(buffer, offset); + offset += len; + val = fields.locales; + void 0 === val && (val = Buffer.from("en_US")); + len = val.length; + buffer.writeUInt32BE(len, offset); + offset += 4; + val.copy(buffer, offset); + offset += len; + buffer[offset] = 206; + buffer.writeUInt32BE(offset - 7, 3); + return buffer; + } + function decodeConnectionStartOk(buffer) { + var val, len, offset = 0, fields = { + clientProperties: void 0, + mechanism: void 0, + response: void 0, + locale: void 0 + }; + len = buffer.readUInt32BE(offset); + offset += 4; + val = decodeFields(buffer.slice(offset, offset + len)); + offset += len; + fields.clientProperties = val; + len = buffer.readUInt8(offset); + offset++; + val = buffer.toString("utf8", offset, offset + len); + offset += len; + fields.mechanism = val; + len = buffer.readUInt32BE(offset); + offset += 4; + val = buffer.slice(offset, offset + len); + offset += len; + fields.response = val; + len = buffer.readUInt8(offset); + offset++; + val = buffer.toString("utf8", offset, offset + len); + offset += len; + fields.locale = val; + return fields; + } + function encodeConnectionStartOk(channel, fields) { + var len, offset = 0, val = null, varyingSize = 0, scratchOffset = 0; + val = fields.clientProperties; + if (void 0 === val) + throw new Error("Missing value for mandatory field 'clientProperties'"); + if ("object" != typeof val) + throw new TypeError("Field 'clientProperties' is the wrong type; must be an object"); + len = encodeTable(SCRATCH, val, scratchOffset); + var clientProperties_encoded = SCRATCH.slice(scratchOffset, scratchOffset + len); + scratchOffset += len; + varyingSize += clientProperties_encoded.length; + val = fields.mechanism; + if (void 0 === val) + val = "PLAIN"; + else if (!("string" == typeof val && Buffer.byteLength(val) < 256)) + throw new TypeError("Field 'mechanism' is the wrong type; must be a string (up to 255 chars)"); + var mechanism_len = Buffer.byteLength(val, "utf8"); + varyingSize += mechanism_len; + val = fields.response; + if (void 0 === val) + throw new Error("Missing value for mandatory field 'response'"); + if (!Buffer.isBuffer(val)) + throw new TypeError("Field 'response' is the wrong type; must be a Buffer"); + varyingSize += val.length; + val = fields.locale; + if (void 0 === val) + val = "en_US"; + else if (!("string" == typeof val && Buffer.byteLength(val) < 256)) + throw new TypeError("Field 'locale' is the wrong type; must be a string (up to 255 chars)"); + var locale_len = Buffer.byteLength(val, "utf8"); + varyingSize += locale_len; + var buffer = Buffer.alloc(18 + varyingSize); + buffer[0] = 1; + buffer.writeUInt16BE(channel, 1); + buffer.writeUInt32BE(655371, 7); + offset = 11; + offset += clientProperties_encoded.copy(buffer, offset); + val = fields.mechanism; + void 0 === val && (val = "PLAIN"); + buffer[offset] = mechanism_len; + offset++; + buffer.write(val, offset, "utf8"); + offset += mechanism_len; + val = fields.response; + void 0 === val && (val = Buffer.from(void 0)); + len = val.length; + buffer.writeUInt32BE(len, offset); + offset += 4; + val.copy(buffer, offset); + offset += len; + val = fields.locale; + void 0 === val && (val = "en_US"); + buffer[offset] = locale_len; + offset++; + buffer.write(val, offset, "utf8"); + offset += locale_len; + buffer[offset] = 206; + buffer.writeUInt32BE(offset - 7, 3); + return buffer; + } + function decodeConnectionSecure(buffer) { + var val, len, offset = 0, fields = { + challenge: void 0 + }; + len = buffer.readUInt32BE(offset); + offset += 4; + val = buffer.slice(offset, offset + len); + offset += len; + fields.challenge = val; + return fields; + } + function encodeConnectionSecure(channel, fields) { + var len, offset = 0, val = null, varyingSize = 0; + val = fields.challenge; + if (void 0 === val) + throw new Error("Missing value for mandatory field 'challenge'"); + if (!Buffer.isBuffer(val)) + throw new TypeError("Field 'challenge' is the wrong type; must be a Buffer"); + varyingSize += val.length; + var buffer = Buffer.alloc(16 + varyingSize); + buffer[0] = 1; + buffer.writeUInt16BE(channel, 1); + buffer.writeUInt32BE(655380, 7); + offset = 11; + val = fields.challenge; + void 0 === val && (val = Buffer.from(void 0)); + len = val.length; + buffer.writeUInt32BE(len, offset); + offset += 4; + val.copy(buffer, offset); + offset += len; + buffer[offset] = 206; + buffer.writeUInt32BE(offset - 7, 3); + return buffer; + } + function decodeConnectionSecureOk(buffer) { + var val, len, offset = 0, fields = { + response: void 0 + }; + len = buffer.readUInt32BE(offset); + offset += 4; + val = buffer.slice(offset, offset + len); + offset += len; + fields.response = val; + return fields; + } + function encodeConnectionSecureOk(channel, fields) { + var len, offset = 0, val = null, varyingSize = 0; + val = fields.response; + if (void 0 === val) + throw new Error("Missing value for mandatory field 'response'"); + if (!Buffer.isBuffer(val)) + throw new TypeError("Field 'response' is the wrong type; must be a Buffer"); + varyingSize += val.length; + var buffer = Buffer.alloc(16 + varyingSize); + buffer[0] = 1; + buffer.writeUInt16BE(channel, 1); + buffer.writeUInt32BE(655381, 7); + offset = 11; + val = fields.response; + void 0 === val && (val = Buffer.from(void 0)); + len = val.length; + buffer.writeUInt32BE(len, offset); + offset += 4; + val.copy(buffer, offset); + offset += len; + buffer[offset] = 206; + buffer.writeUInt32BE(offset - 7, 3); + return buffer; + } + function decodeConnectionTune(buffer) { + var val, offset = 0, fields = { + channelMax: void 0, + frameMax: void 0, + heartbeat: void 0 + }; + val = buffer.readUInt16BE(offset); + offset += 2; + fields.channelMax = val; + val = buffer.readUInt32BE(offset); + offset += 4; + fields.frameMax = val; + val = buffer.readUInt16BE(offset); + offset += 2; + fields.heartbeat = val; + return fields; + } + function encodeConnectionTune(channel, fields) { + var offset = 0, val = null, buffer = Buffer.alloc(20); + buffer[0] = 1; + buffer.writeUInt16BE(channel, 1); + buffer.writeUInt32BE(655390, 7); + offset = 11; + val = fields.channelMax; + if (void 0 === val) + val = 0; + else if ("number" != typeof val || isNaN(val)) + throw new TypeError("Field 'channelMax' is the wrong type; must be a number (but not NaN)"); + buffer.writeUInt16BE(val, offset); + offset += 2; + val = fields.frameMax; + if (void 0 === val) + val = 0; + else if ("number" != typeof val || isNaN(val)) + throw new TypeError("Field 'frameMax' is the wrong type; must be a number (but not NaN)"); + buffer.writeUInt32BE(val, offset); + offset += 4; + val = fields.heartbeat; + if (void 0 === val) + val = 0; + else if ("number" != typeof val || isNaN(val)) + throw new TypeError("Field 'heartbeat' is the wrong type; must be a number (but not NaN)"); + buffer.writeUInt16BE(val, offset); + offset += 2; + buffer[offset] = 206; + buffer.writeUInt32BE(offset - 7, 3); + return buffer; + } + function decodeConnectionTuneOk(buffer) { + var val, offset = 0, fields = { + channelMax: void 0, + frameMax: void 0, + heartbeat: void 0 + }; + val = buffer.readUInt16BE(offset); + offset += 2; + fields.channelMax = val; + val = buffer.readUInt32BE(offset); + offset += 4; + fields.frameMax = val; + val = buffer.readUInt16BE(offset); + offset += 2; + fields.heartbeat = val; + return fields; + } + function encodeConnectionTuneOk(channel, fields) { + var offset = 0, val = null, buffer = Buffer.alloc(20); + buffer[0] = 1; + buffer.writeUInt16BE(channel, 1); + buffer.writeUInt32BE(655391, 7); + offset = 11; + val = fields.channelMax; + if (void 0 === val) + val = 0; + else if ("number" != typeof val || isNaN(val)) + throw new TypeError("Field 'channelMax' is the wrong type; must be a number (but not NaN)"); + buffer.writeUInt16BE(val, offset); + offset += 2; + val = fields.frameMax; + if (void 0 === val) + val = 0; + else if ("number" != typeof val || isNaN(val)) + throw new TypeError("Field 'frameMax' is the wrong type; must be a number (but not NaN)"); + buffer.writeUInt32BE(val, offset); + offset += 4; + val = fields.heartbeat; + if (void 0 === val) + val = 0; + else if ("number" != typeof val || isNaN(val)) + throw new TypeError("Field 'heartbeat' is the wrong type; must be a number (but not NaN)"); + buffer.writeUInt16BE(val, offset); + offset += 2; + buffer[offset] = 206; + buffer.writeUInt32BE(offset - 7, 3); + return buffer; + } + function decodeConnectionOpen(buffer) { + var val, len, offset = 0, fields = { + virtualHost: void 0, + capabilities: void 0, + insist: void 0 + }; + len = buffer.readUInt8(offset); + offset++; + val = buffer.toString("utf8", offset, offset + len); + offset += len; + fields.virtualHost = val; + len = buffer.readUInt8(offset); + offset++; + val = buffer.toString("utf8", offset, offset + len); + offset += len; + fields.capabilities = val; + val = !!(1 & buffer[offset]); + fields.insist = val; + return fields; + } + function encodeConnectionOpen(channel, fields) { + var offset = 0, val = null, bits = 0, varyingSize = 0; + val = fields.virtualHost; + if (void 0 === val) + val = "/"; + else if (!("string" == typeof val && Buffer.byteLength(val) < 256)) + throw new TypeError("Field 'virtualHost' is the wrong type; must be a string (up to 255 chars)"); + var virtualHost_len = Buffer.byteLength(val, "utf8"); + varyingSize += virtualHost_len; + val = fields.capabilities; + if (void 0 === val) + val = ""; + else if (!("string" == typeof val && Buffer.byteLength(val) < 256)) + throw new TypeError("Field 'capabilities' is the wrong type; must be a string (up to 255 chars)"); + var capabilities_len = Buffer.byteLength(val, "utf8"); + varyingSize += capabilities_len; + var buffer = Buffer.alloc(15 + varyingSize); + buffer[0] = 1; + buffer.writeUInt16BE(channel, 1); + buffer.writeUInt32BE(655400, 7); + offset = 11; + val = fields.virtualHost; + void 0 === val && (val = "/"); + buffer[offset] = virtualHost_len; + offset++; + buffer.write(val, offset, "utf8"); + offset += virtualHost_len; + val = fields.capabilities; + void 0 === val && (val = ""); + buffer[offset] = capabilities_len; + offset++; + buffer.write(val, offset, "utf8"); + offset += capabilities_len; + val = fields.insist; + void 0 === val && (val = false); + val && (bits += 1); + buffer[offset] = bits; + offset++; + buffer[offset] = 206; + buffer.writeUInt32BE(offset - 7, 3); + return buffer; + } + function decodeConnectionOpenOk(buffer) { + var val, len, offset = 0, fields = { + knownHosts: void 0 + }; + len = buffer.readUInt8(offset); + offset++; + val = buffer.toString("utf8", offset, offset + len); + offset += len; + fields.knownHosts = val; + return fields; + } + function encodeConnectionOpenOk(channel, fields) { + var offset = 0, val = null, varyingSize = 0; + val = fields.knownHosts; + if (void 0 === val) + val = ""; + else if (!("string" == typeof val && Buffer.byteLength(val) < 256)) + throw new TypeError("Field 'knownHosts' is the wrong type; must be a string (up to 255 chars)"); + var knownHosts_len = Buffer.byteLength(val, "utf8"); + varyingSize += knownHosts_len; + var buffer = Buffer.alloc(13 + varyingSize); + buffer[0] = 1; + buffer.writeUInt16BE(channel, 1); + buffer.writeUInt32BE(655401, 7); + offset = 11; + val = fields.knownHosts; + void 0 === val && (val = ""); + buffer[offset] = knownHosts_len; + offset++; + buffer.write(val, offset, "utf8"); + offset += knownHosts_len; + buffer[offset] = 206; + buffer.writeUInt32BE(offset - 7, 3); + return buffer; + } + function decodeConnectionClose(buffer) { + var val, len, offset = 0, fields = { + replyCode: void 0, + replyText: void 0, + classId: void 0, + methodId: void 0 + }; + val = buffer.readUInt16BE(offset); + offset += 2; + fields.replyCode = val; + len = buffer.readUInt8(offset); + offset++; + val = buffer.toString("utf8", offset, offset + len); + offset += len; + fields.replyText = val; + val = buffer.readUInt16BE(offset); + offset += 2; + fields.classId = val; + val = buffer.readUInt16BE(offset); + offset += 2; + fields.methodId = val; + return fields; + } + function encodeConnectionClose(channel, fields) { + var offset = 0, val = null, varyingSize = 0; + val = fields.replyText; + if (void 0 === val) + val = ""; + else if (!("string" == typeof val && Buffer.byteLength(val) < 256)) + throw new TypeError("Field 'replyText' is the wrong type; must be a string (up to 255 chars)"); + var replyText_len = Buffer.byteLength(val, "utf8"); + varyingSize += replyText_len; + var buffer = Buffer.alloc(19 + varyingSize); + buffer[0] = 1; + buffer.writeUInt16BE(channel, 1); + buffer.writeUInt32BE(655410, 7); + offset = 11; + val = fields.replyCode; + if (void 0 === val) + throw new Error("Missing value for mandatory field 'replyCode'"); + if ("number" != typeof val || isNaN(val)) + throw new TypeError("Field 'replyCode' is the wrong type; must be a number (but not NaN)"); + buffer.writeUInt16BE(val, offset); + offset += 2; + val = fields.replyText; + void 0 === val && (val = ""); + buffer[offset] = replyText_len; + offset++; + buffer.write(val, offset, "utf8"); + offset += replyText_len; + val = fields.classId; + if (void 0 === val) + throw new Error("Missing value for mandatory field 'classId'"); + if ("number" != typeof val || isNaN(val)) + throw new TypeError("Field 'classId' is the wrong type; must be a number (but not NaN)"); + buffer.writeUInt16BE(val, offset); + offset += 2; + val = fields.methodId; + if (void 0 === val) + throw new Error("Missing value for mandatory field 'methodId'"); + if ("number" != typeof val || isNaN(val)) + throw new TypeError("Field 'methodId' is the wrong type; must be a number (but not NaN)"); + buffer.writeUInt16BE(val, offset); + offset += 2; + buffer[offset] = 206; + buffer.writeUInt32BE(offset - 7, 3); + return buffer; + } + function decodeConnectionCloseOk(buffer) { + return {}; + } + function encodeConnectionCloseOk(channel, fields) { + var offset = 0, buffer = Buffer.alloc(12); + buffer[0] = 1; + buffer.writeUInt16BE(channel, 1); + buffer.writeUInt32BE(655411, 7); + offset = 11; + buffer[offset] = 206; + buffer.writeUInt32BE(offset - 7, 3); + return buffer; + } + function decodeConnectionBlocked(buffer) { + var val, len, offset = 0, fields = { + reason: void 0 + }; + len = buffer.readUInt8(offset); + offset++; + val = buffer.toString("utf8", offset, offset + len); + offset += len; + fields.reason = val; + return fields; + } + function encodeConnectionBlocked(channel, fields) { + var offset = 0, val = null, varyingSize = 0; + val = fields.reason; + if (void 0 === val) + val = ""; + else if (!("string" == typeof val && Buffer.byteLength(val) < 256)) + throw new TypeError("Field 'reason' is the wrong type; must be a string (up to 255 chars)"); + var reason_len = Buffer.byteLength(val, "utf8"); + varyingSize += reason_len; + var buffer = Buffer.alloc(13 + varyingSize); + buffer[0] = 1; + buffer.writeUInt16BE(channel, 1); + buffer.writeUInt32BE(655420, 7); + offset = 11; + val = fields.reason; + void 0 === val && (val = ""); + buffer[offset] = reason_len; + offset++; + buffer.write(val, offset, "utf8"); + offset += reason_len; + buffer[offset] = 206; + buffer.writeUInt32BE(offset - 7, 3); + return buffer; + } + function decodeConnectionUnblocked(buffer) { + return {}; + } + function encodeConnectionUnblocked(channel, fields) { + var offset = 0, buffer = Buffer.alloc(12); + buffer[0] = 1; + buffer.writeUInt16BE(channel, 1); + buffer.writeUInt32BE(655421, 7); + offset = 11; + buffer[offset] = 206; + buffer.writeUInt32BE(offset - 7, 3); + return buffer; + } + function decodeChannelOpen(buffer) { + var val, len, offset = 0, fields = { + outOfBand: void 0 + }; + len = buffer.readUInt8(offset); + offset++; + val = buffer.toString("utf8", offset, offset + len); + offset += len; + fields.outOfBand = val; + return fields; + } + function encodeChannelOpen(channel, fields) { + var offset = 0, val = null, varyingSize = 0; + val = fields.outOfBand; + if (void 0 === val) + val = ""; + else if (!("string" == typeof val && Buffer.byteLength(val) < 256)) + throw new TypeError("Field 'outOfBand' is the wrong type; must be a string (up to 255 chars)"); + var outOfBand_len = Buffer.byteLength(val, "utf8"); + varyingSize += outOfBand_len; + var buffer = Buffer.alloc(13 + varyingSize); + buffer[0] = 1; + buffer.writeUInt16BE(channel, 1); + buffer.writeUInt32BE(1310730, 7); + offset = 11; + val = fields.outOfBand; + void 0 === val && (val = ""); + buffer[offset] = outOfBand_len; + offset++; + buffer.write(val, offset, "utf8"); + offset += outOfBand_len; + buffer[offset] = 206; + buffer.writeUInt32BE(offset - 7, 3); + return buffer; + } + function decodeChannelOpenOk(buffer) { + var val, len, offset = 0, fields = { + channelId: void 0 + }; + len = buffer.readUInt32BE(offset); + offset += 4; + val = buffer.slice(offset, offset + len); + offset += len; + fields.channelId = val; + return fields; + } + function encodeChannelOpenOk(channel, fields) { + var len, offset = 0, val = null, varyingSize = 0; + val = fields.channelId; + if (void 0 === val) + val = Buffer.from(""); + else if (!Buffer.isBuffer(val)) + throw new TypeError("Field 'channelId' is the wrong type; must be a Buffer"); + varyingSize += val.length; + var buffer = Buffer.alloc(16 + varyingSize); + buffer[0] = 1; + buffer.writeUInt16BE(channel, 1); + buffer.writeUInt32BE(1310731, 7); + offset = 11; + val = fields.channelId; + void 0 === val && (val = Buffer.from("")); + len = val.length; + buffer.writeUInt32BE(len, offset); + offset += 4; + val.copy(buffer, offset); + offset += len; + buffer[offset] = 206; + buffer.writeUInt32BE(offset - 7, 3); + return buffer; + } + function decodeChannelFlow(buffer) { + var val, fields = { + active: void 0 + }; + val = !!(1 & buffer[0]); + fields.active = val; + return fields; + } + function encodeChannelFlow(channel, fields) { + var offset = 0, val = null, bits = 0, buffer = Buffer.alloc(13); + buffer[0] = 1; + buffer.writeUInt16BE(channel, 1); + buffer.writeUInt32BE(1310740, 7); + offset = 11; + val = fields.active; + if (void 0 === val) + throw new Error("Missing value for mandatory field 'active'"); + val && (bits += 1); + buffer[offset] = bits; + offset++; + buffer[offset] = 206; + buffer.writeUInt32BE(offset - 7, 3); + return buffer; + } + function decodeChannelFlowOk(buffer) { + var val, fields = { + active: void 0 + }; + val = !!(1 & buffer[0]); + fields.active = val; + return fields; + } + function encodeChannelFlowOk(channel, fields) { + var offset = 0, val = null, bits = 0, buffer = Buffer.alloc(13); + buffer[0] = 1; + buffer.writeUInt16BE(channel, 1); + buffer.writeUInt32BE(1310741, 7); + offset = 11; + val = fields.active; + if (void 0 === val) + throw new Error("Missing value for mandatory field 'active'"); + val && (bits += 1); + buffer[offset] = bits; + offset++; + buffer[offset] = 206; + buffer.writeUInt32BE(offset - 7, 3); + return buffer; + } + function decodeChannelClose(buffer) { + var val, len, offset = 0, fields = { + replyCode: void 0, + replyText: void 0, + classId: void 0, + methodId: void 0 + }; + val = buffer.readUInt16BE(offset); + offset += 2; + fields.replyCode = val; + len = buffer.readUInt8(offset); + offset++; + val = buffer.toString("utf8", offset, offset + len); + offset += len; + fields.replyText = val; + val = buffer.readUInt16BE(offset); + offset += 2; + fields.classId = val; + val = buffer.readUInt16BE(offset); + offset += 2; + fields.methodId = val; + return fields; + } + function encodeChannelClose(channel, fields) { + var offset = 0, val = null, varyingSize = 0; + val = fields.replyText; + if (void 0 === val) + val = ""; + else if (!("string" == typeof val && Buffer.byteLength(val) < 256)) + throw new TypeError("Field 'replyText' is the wrong type; must be a string (up to 255 chars)"); + var replyText_len = Buffer.byteLength(val, "utf8"); + varyingSize += replyText_len; + var buffer = Buffer.alloc(19 + varyingSize); + buffer[0] = 1; + buffer.writeUInt16BE(channel, 1); + buffer.writeUInt32BE(1310760, 7); + offset = 11; + val = fields.replyCode; + if (void 0 === val) + throw new Error("Missing value for mandatory field 'replyCode'"); + if ("number" != typeof val || isNaN(val)) + throw new TypeError("Field 'replyCode' is the wrong type; must be a number (but not NaN)"); + buffer.writeUInt16BE(val, offset); + offset += 2; + val = fields.replyText; + void 0 === val && (val = ""); + buffer[offset] = replyText_len; + offset++; + buffer.write(val, offset, "utf8"); + offset += replyText_len; + val = fields.classId; + if (void 0 === val) + throw new Error("Missing value for mandatory field 'classId'"); + if ("number" != typeof val || isNaN(val)) + throw new TypeError("Field 'classId' is the wrong type; must be a number (but not NaN)"); + buffer.writeUInt16BE(val, offset); + offset += 2; + val = fields.methodId; + if (void 0 === val) + throw new Error("Missing value for mandatory field 'methodId'"); + if ("number" != typeof val || isNaN(val)) + throw new TypeError("Field 'methodId' is the wrong type; must be a number (but not NaN)"); + buffer.writeUInt16BE(val, offset); + offset += 2; + buffer[offset] = 206; + buffer.writeUInt32BE(offset - 7, 3); + return buffer; + } + function decodeChannelCloseOk(buffer) { + return {}; + } + function encodeChannelCloseOk(channel, fields) { + var offset = 0, buffer = Buffer.alloc(12); + buffer[0] = 1; + buffer.writeUInt16BE(channel, 1); + buffer.writeUInt32BE(1310761, 7); + offset = 11; + buffer[offset] = 206; + buffer.writeUInt32BE(offset - 7, 3); + return buffer; + } + function decodeAccessRequest(buffer) { + var val, len, offset = 0, fields = { + realm: void 0, + exclusive: void 0, + passive: void 0, + active: void 0, + write: void 0, + read: void 0 + }; + len = buffer.readUInt8(offset); + offset++; + val = buffer.toString("utf8", offset, offset + len); + offset += len; + fields.realm = val; + val = !!(1 & buffer[offset]); + fields.exclusive = val; + val = !!(2 & buffer[offset]); + fields.passive = val; + val = !!(4 & buffer[offset]); + fields.active = val; + val = !!(8 & buffer[offset]); + fields.write = val; + val = !!(16 & buffer[offset]); + fields.read = val; + return fields; + } + function encodeAccessRequest(channel, fields) { + var offset = 0, val = null, bits = 0, varyingSize = 0; + val = fields.realm; + if (void 0 === val) + val = "/data"; + else if (!("string" == typeof val && Buffer.byteLength(val) < 256)) + throw new TypeError("Field 'realm' is the wrong type; must be a string (up to 255 chars)"); + var realm_len = Buffer.byteLength(val, "utf8"); + varyingSize += realm_len; + var buffer = Buffer.alloc(14 + varyingSize); + buffer[0] = 1; + buffer.writeUInt16BE(channel, 1); + buffer.writeUInt32BE(1966090, 7); + offset = 11; + val = fields.realm; + void 0 === val && (val = "/data"); + buffer[offset] = realm_len; + offset++; + buffer.write(val, offset, "utf8"); + offset += realm_len; + val = fields.exclusive; + void 0 === val && (val = false); + val && (bits += 1); + val = fields.passive; + void 0 === val && (val = true); + val && (bits += 2); + val = fields.active; + void 0 === val && (val = true); + val && (bits += 4); + val = fields.write; + void 0 === val && (val = true); + val && (bits += 8); + val = fields.read; + void 0 === val && (val = true); + val && (bits += 16); + buffer[offset] = bits; + offset++; + buffer[offset] = 206; + buffer.writeUInt32BE(offset - 7, 3); + return buffer; + } + function decodeAccessRequestOk(buffer) { + var val, offset = 0, fields = { + ticket: void 0 + }; + val = buffer.readUInt16BE(offset); + offset += 2; + fields.ticket = val; + return fields; + } + function encodeAccessRequestOk(channel, fields) { + var offset = 0, val = null, buffer = Buffer.alloc(14); + buffer[0] = 1; + buffer.writeUInt16BE(channel, 1); + buffer.writeUInt32BE(1966091, 7); + offset = 11; + val = fields.ticket; + if (void 0 === val) + val = 1; + else if ("number" != typeof val || isNaN(val)) + throw new TypeError("Field 'ticket' is the wrong type; must be a number (but not NaN)"); + buffer.writeUInt16BE(val, offset); + offset += 2; + buffer[offset] = 206; + buffer.writeUInt32BE(offset - 7, 3); + return buffer; + } + function decodeExchangeDeclare(buffer) { + var val, len, offset = 0, fields = { + ticket: void 0, + exchange: void 0, + type: void 0, + passive: void 0, + durable: void 0, + autoDelete: void 0, + internal: void 0, + nowait: void 0, + arguments: void 0 + }; + val = buffer.readUInt16BE(offset); + offset += 2; + fields.ticket = val; + len = buffer.readUInt8(offset); + offset++; + val = buffer.toString("utf8", offset, offset + len); + offset += len; + fields.exchange = val; + len = buffer.readUInt8(offset); + offset++; + val = buffer.toString("utf8", offset, offset + len); + offset += len; + fields.type = val; + val = !!(1 & buffer[offset]); + fields.passive = val; + val = !!(2 & buffer[offset]); + fields.durable = val; + val = !!(4 & buffer[offset]); + fields.autoDelete = val; + val = !!(8 & buffer[offset]); + fields.internal = val; + val = !!(16 & buffer[offset]); + fields.nowait = val; + offset++; + len = buffer.readUInt32BE(offset); + offset += 4; + val = decodeFields(buffer.slice(offset, offset + len)); + offset += len; + fields.arguments = val; + return fields; + } + function encodeExchangeDeclare(channel, fields) { + var len, offset = 0, val = null, bits = 0, varyingSize = 0, scratchOffset = 0; + val = fields.exchange; + if (void 0 === val) + throw new Error("Missing value for mandatory field 'exchange'"); + if (!("string" == typeof val && Buffer.byteLength(val) < 256)) + throw new TypeError("Field 'exchange' is the wrong type; must be a string (up to 255 chars)"); + var exchange_len = Buffer.byteLength(val, "utf8"); + varyingSize += exchange_len; + val = fields.type; + if (void 0 === val) + val = "direct"; + else if (!("string" == typeof val && Buffer.byteLength(val) < 256)) + throw new TypeError("Field 'type' is the wrong type; must be a string (up to 255 chars)"); + var type_len = Buffer.byteLength(val, "utf8"); + varyingSize += type_len; + val = fields.arguments; + if (void 0 === val) + val = {}; + else if ("object" != typeof val) + throw new TypeError("Field 'arguments' is the wrong type; must be an object"); + len = encodeTable(SCRATCH, val, scratchOffset); + var arguments_encoded = SCRATCH.slice(scratchOffset, scratchOffset + len); + scratchOffset += len; + varyingSize += arguments_encoded.length; + var buffer = Buffer.alloc(17 + varyingSize); + buffer[0] = 1; + buffer.writeUInt16BE(channel, 1); + buffer.writeUInt32BE(2621450, 7); + offset = 11; + val = fields.ticket; + if (void 0 === val) + val = 0; + else if ("number" != typeof val || isNaN(val)) + throw new TypeError("Field 'ticket' is the wrong type; must be a number (but not NaN)"); + buffer.writeUInt16BE(val, offset); + offset += 2; + val = fields.exchange; + void 0 === val && (val = void 0); + buffer[offset] = exchange_len; + offset++; + buffer.write(val, offset, "utf8"); + offset += exchange_len; + val = fields.type; + void 0 === val && (val = "direct"); + buffer[offset] = type_len; + offset++; + buffer.write(val, offset, "utf8"); + offset += type_len; + val = fields.passive; + void 0 === val && (val = false); + val && (bits += 1); + val = fields.durable; + void 0 === val && (val = false); + val && (bits += 2); + val = fields.autoDelete; + void 0 === val && (val = false); + val && (bits += 4); + val = fields.internal; + void 0 === val && (val = false); + val && (bits += 8); + val = fields.nowait; + void 0 === val && (val = false); + val && (bits += 16); + buffer[offset] = bits; + offset++; + bits = 0; + offset += arguments_encoded.copy(buffer, offset); + buffer[offset] = 206; + buffer.writeUInt32BE(offset - 7, 3); + return buffer; + } + function decodeExchangeDeclareOk(buffer) { + return {}; + } + function encodeExchangeDeclareOk(channel, fields) { + var offset = 0, buffer = Buffer.alloc(12); + buffer[0] = 1; + buffer.writeUInt16BE(channel, 1); + buffer.writeUInt32BE(2621451, 7); + offset = 11; + buffer[offset] = 206; + buffer.writeUInt32BE(offset - 7, 3); + return buffer; + } + function decodeExchangeDelete(buffer) { + var val, len, offset = 0, fields = { + ticket: void 0, + exchange: void 0, + ifUnused: void 0, + nowait: void 0 + }; + val = buffer.readUInt16BE(offset); + offset += 2; + fields.ticket = val; + len = buffer.readUInt8(offset); + offset++; + val = buffer.toString("utf8", offset, offset + len); + offset += len; + fields.exchange = val; + val = !!(1 & buffer[offset]); + fields.ifUnused = val; + val = !!(2 & buffer[offset]); + fields.nowait = val; + return fields; + } + function encodeExchangeDelete(channel, fields) { + var offset = 0, val = null, bits = 0, varyingSize = 0; + val = fields.exchange; + if (void 0 === val) + throw new Error("Missing value for mandatory field 'exchange'"); + if (!("string" == typeof val && Buffer.byteLength(val) < 256)) + throw new TypeError("Field 'exchange' is the wrong type; must be a string (up to 255 chars)"); + var exchange_len = Buffer.byteLength(val, "utf8"); + varyingSize += exchange_len; + var buffer = Buffer.alloc(16 + varyingSize); + buffer[0] = 1; + buffer.writeUInt16BE(channel, 1); + buffer.writeUInt32BE(2621460, 7); + offset = 11; + val = fields.ticket; + if (void 0 === val) + val = 0; + else if ("number" != typeof val || isNaN(val)) + throw new TypeError("Field 'ticket' is the wrong type; must be a number (but not NaN)"); + buffer.writeUInt16BE(val, offset); + offset += 2; + val = fields.exchange; + void 0 === val && (val = void 0); + buffer[offset] = exchange_len; + offset++; + buffer.write(val, offset, "utf8"); + offset += exchange_len; + val = fields.ifUnused; + void 0 === val && (val = false); + val && (bits += 1); + val = fields.nowait; + void 0 === val && (val = false); + val && (bits += 2); + buffer[offset] = bits; + offset++; + buffer[offset] = 206; + buffer.writeUInt32BE(offset - 7, 3); + return buffer; + } + function decodeExchangeDeleteOk(buffer) { + return {}; + } + function encodeExchangeDeleteOk(channel, fields) { + var offset = 0, buffer = Buffer.alloc(12); + buffer[0] = 1; + buffer.writeUInt16BE(channel, 1); + buffer.writeUInt32BE(2621461, 7); + offset = 11; + buffer[offset] = 206; + buffer.writeUInt32BE(offset - 7, 3); + return buffer; + } + function decodeExchangeBind(buffer) { + var val, len, offset = 0, fields = { + ticket: void 0, + destination: void 0, + source: void 0, + routingKey: void 0, + nowait: void 0, + arguments: void 0 + }; + val = buffer.readUInt16BE(offset); + offset += 2; + fields.ticket = val; + len = buffer.readUInt8(offset); + offset++; + val = buffer.toString("utf8", offset, offset + len); + offset += len; + fields.destination = val; + len = buffer.readUInt8(offset); + offset++; + val = buffer.toString("utf8", offset, offset + len); + offset += len; + fields.source = val; + len = buffer.readUInt8(offset); + offset++; + val = buffer.toString("utf8", offset, offset + len); + offset += len; + fields.routingKey = val; + val = !!(1 & buffer[offset]); + fields.nowait = val; + offset++; + len = buffer.readUInt32BE(offset); + offset += 4; + val = decodeFields(buffer.slice(offset, offset + len)); + offset += len; + fields.arguments = val; + return fields; + } + function encodeExchangeBind(channel, fields) { + var len, offset = 0, val = null, bits = 0, varyingSize = 0, scratchOffset = 0; + val = fields.destination; + if (void 0 === val) + throw new Error("Missing value for mandatory field 'destination'"); + if (!("string" == typeof val && Buffer.byteLength(val) < 256)) + throw new TypeError("Field 'destination' is the wrong type; must be a string (up to 255 chars)"); + var destination_len = Buffer.byteLength(val, "utf8"); + varyingSize += destination_len; + val = fields.source; + if (void 0 === val) + throw new Error("Missing value for mandatory field 'source'"); + if (!("string" == typeof val && Buffer.byteLength(val) < 256)) + throw new TypeError("Field 'source' is the wrong type; must be a string (up to 255 chars)"); + var source_len = Buffer.byteLength(val, "utf8"); + varyingSize += source_len; + val = fields.routingKey; + if (void 0 === val) + val = ""; + else if (!("string" == typeof val && Buffer.byteLength(val) < 256)) + throw new TypeError("Field 'routingKey' is the wrong type; must be a string (up to 255 chars)"); + var routingKey_len = Buffer.byteLength(val, "utf8"); + varyingSize += routingKey_len; + val = fields.arguments; + if (void 0 === val) + val = {}; + else if ("object" != typeof val) + throw new TypeError("Field 'arguments' is the wrong type; must be an object"); + len = encodeTable(SCRATCH, val, scratchOffset); + var arguments_encoded = SCRATCH.slice(scratchOffset, scratchOffset + len); + scratchOffset += len; + varyingSize += arguments_encoded.length; + var buffer = Buffer.alloc(18 + varyingSize); + buffer[0] = 1; + buffer.writeUInt16BE(channel, 1); + buffer.writeUInt32BE(2621470, 7); + offset = 11; + val = fields.ticket; + if (void 0 === val) + val = 0; + else if ("number" != typeof val || isNaN(val)) + throw new TypeError("Field 'ticket' is the wrong type; must be a number (but not NaN)"); + buffer.writeUInt16BE(val, offset); + offset += 2; + val = fields.destination; + void 0 === val && (val = void 0); + buffer[offset] = destination_len; + offset++; + buffer.write(val, offset, "utf8"); + offset += destination_len; + val = fields.source; + void 0 === val && (val = void 0); + buffer[offset] = source_len; + offset++; + buffer.write(val, offset, "utf8"); + offset += source_len; + val = fields.routingKey; + void 0 === val && (val = ""); + buffer[offset] = routingKey_len; + offset++; + buffer.write(val, offset, "utf8"); + offset += routingKey_len; + val = fields.nowait; + void 0 === val && (val = false); + val && (bits += 1); + buffer[offset] = bits; + offset++; + bits = 0; + offset += arguments_encoded.copy(buffer, offset); + buffer[offset] = 206; + buffer.writeUInt32BE(offset - 7, 3); + return buffer; + } + function decodeExchangeBindOk(buffer) { + return {}; + } + function encodeExchangeBindOk(channel, fields) { + var offset = 0, buffer = Buffer.alloc(12); + buffer[0] = 1; + buffer.writeUInt16BE(channel, 1); + buffer.writeUInt32BE(2621471, 7); + offset = 11; + buffer[offset] = 206; + buffer.writeUInt32BE(offset - 7, 3); + return buffer; + } + function decodeExchangeUnbind(buffer) { + var val, len, offset = 0, fields = { + ticket: void 0, + destination: void 0, + source: void 0, + routingKey: void 0, + nowait: void 0, + arguments: void 0 + }; + val = buffer.readUInt16BE(offset); + offset += 2; + fields.ticket = val; + len = buffer.readUInt8(offset); + offset++; + val = buffer.toString("utf8", offset, offset + len); + offset += len; + fields.destination = val; + len = buffer.readUInt8(offset); + offset++; + val = buffer.toString("utf8", offset, offset + len); + offset += len; + fields.source = val; + len = buffer.readUInt8(offset); + offset++; + val = buffer.toString("utf8", offset, offset + len); + offset += len; + fields.routingKey = val; + val = !!(1 & buffer[offset]); + fields.nowait = val; + offset++; + len = buffer.readUInt32BE(offset); + offset += 4; + val = decodeFields(buffer.slice(offset, offset + len)); + offset += len; + fields.arguments = val; + return fields; + } + function encodeExchangeUnbind(channel, fields) { + var len, offset = 0, val = null, bits = 0, varyingSize = 0, scratchOffset = 0; + val = fields.destination; + if (void 0 === val) + throw new Error("Missing value for mandatory field 'destination'"); + if (!("string" == typeof val && Buffer.byteLength(val) < 256)) + throw new TypeError("Field 'destination' is the wrong type; must be a string (up to 255 chars)"); + var destination_len = Buffer.byteLength(val, "utf8"); + varyingSize += destination_len; + val = fields.source; + if (void 0 === val) + throw new Error("Missing value for mandatory field 'source'"); + if (!("string" == typeof val && Buffer.byteLength(val) < 256)) + throw new TypeError("Field 'source' is the wrong type; must be a string (up to 255 chars)"); + var source_len = Buffer.byteLength(val, "utf8"); + varyingSize += source_len; + val = fields.routingKey; + if (void 0 === val) + val = ""; + else if (!("string" == typeof val && Buffer.byteLength(val) < 256)) + throw new TypeError("Field 'routingKey' is the wrong type; must be a string (up to 255 chars)"); + var routingKey_len = Buffer.byteLength(val, "utf8"); + varyingSize += routingKey_len; + val = fields.arguments; + if (void 0 === val) + val = {}; + else if ("object" != typeof val) + throw new TypeError("Field 'arguments' is the wrong type; must be an object"); + len = encodeTable(SCRATCH, val, scratchOffset); + var arguments_encoded = SCRATCH.slice(scratchOffset, scratchOffset + len); + scratchOffset += len; + varyingSize += arguments_encoded.length; + var buffer = Buffer.alloc(18 + varyingSize); + buffer[0] = 1; + buffer.writeUInt16BE(channel, 1); + buffer.writeUInt32BE(2621480, 7); + offset = 11; + val = fields.ticket; + if (void 0 === val) + val = 0; + else if ("number" != typeof val || isNaN(val)) + throw new TypeError("Field 'ticket' is the wrong type; must be a number (but not NaN)"); + buffer.writeUInt16BE(val, offset); + offset += 2; + val = fields.destination; + void 0 === val && (val = void 0); + buffer[offset] = destination_len; + offset++; + buffer.write(val, offset, "utf8"); + offset += destination_len; + val = fields.source; + void 0 === val && (val = void 0); + buffer[offset] = source_len; + offset++; + buffer.write(val, offset, "utf8"); + offset += source_len; + val = fields.routingKey; + void 0 === val && (val = ""); + buffer[offset] = routingKey_len; + offset++; + buffer.write(val, offset, "utf8"); + offset += routingKey_len; + val = fields.nowait; + void 0 === val && (val = false); + val && (bits += 1); + buffer[offset] = bits; + offset++; + bits = 0; + offset += arguments_encoded.copy(buffer, offset); + buffer[offset] = 206; + buffer.writeUInt32BE(offset - 7, 3); + return buffer; + } + function decodeExchangeUnbindOk(buffer) { + return {}; + } + function encodeExchangeUnbindOk(channel, fields) { + var offset = 0, buffer = Buffer.alloc(12); + buffer[0] = 1; + buffer.writeUInt16BE(channel, 1); + buffer.writeUInt32BE(2621491, 7); + offset = 11; + buffer[offset] = 206; + buffer.writeUInt32BE(offset - 7, 3); + return buffer; + } + function decodeQueueDeclare(buffer) { + var val, len, offset = 0, fields = { + ticket: void 0, + queue: void 0, + passive: void 0, + durable: void 0, + exclusive: void 0, + autoDelete: void 0, + nowait: void 0, + arguments: void 0 + }; + val = buffer.readUInt16BE(offset); + offset += 2; + fields.ticket = val; + len = buffer.readUInt8(offset); + offset++; + val = buffer.toString("utf8", offset, offset + len); + offset += len; + fields.queue = val; + val = !!(1 & buffer[offset]); + fields.passive = val; + val = !!(2 & buffer[offset]); + fields.durable = val; + val = !!(4 & buffer[offset]); + fields.exclusive = val; + val = !!(8 & buffer[offset]); + fields.autoDelete = val; + val = !!(16 & buffer[offset]); + fields.nowait = val; + offset++; + len = buffer.readUInt32BE(offset); + offset += 4; + val = decodeFields(buffer.slice(offset, offset + len)); + offset += len; + fields.arguments = val; + return fields; + } + function encodeQueueDeclare(channel, fields) { + var len, offset = 0, val = null, bits = 0, varyingSize = 0, scratchOffset = 0; + val = fields.queue; + if (void 0 === val) + val = ""; + else if (!("string" == typeof val && Buffer.byteLength(val) < 256)) + throw new TypeError("Field 'queue' is the wrong type; must be a string (up to 255 chars)"); + var queue_len = Buffer.byteLength(val, "utf8"); + varyingSize += queue_len; + val = fields.arguments; + if (void 0 === val) + val = {}; + else if ("object" != typeof val) + throw new TypeError("Field 'arguments' is the wrong type; must be an object"); + len = encodeTable(SCRATCH, val, scratchOffset); + var arguments_encoded = SCRATCH.slice(scratchOffset, scratchOffset + len); + scratchOffset += len; + varyingSize += arguments_encoded.length; + var buffer = Buffer.alloc(16 + varyingSize); + buffer[0] = 1; + buffer.writeUInt16BE(channel, 1); + buffer.writeUInt32BE(3276810, 7); + offset = 11; + val = fields.ticket; + if (void 0 === val) + val = 0; + else if ("number" != typeof val || isNaN(val)) + throw new TypeError("Field 'ticket' is the wrong type; must be a number (but not NaN)"); + buffer.writeUInt16BE(val, offset); + offset += 2; + val = fields.queue; + void 0 === val && (val = ""); + buffer[offset] = queue_len; + offset++; + buffer.write(val, offset, "utf8"); + offset += queue_len; + val = fields.passive; + void 0 === val && (val = false); + val && (bits += 1); + val = fields.durable; + void 0 === val && (val = false); + val && (bits += 2); + val = fields.exclusive; + void 0 === val && (val = false); + val && (bits += 4); + val = fields.autoDelete; + void 0 === val && (val = false); + val && (bits += 8); + val = fields.nowait; + void 0 === val && (val = false); + val && (bits += 16); + buffer[offset] = bits; + offset++; + bits = 0; + offset += arguments_encoded.copy(buffer, offset); + buffer[offset] = 206; + buffer.writeUInt32BE(offset - 7, 3); + return buffer; + } + function decodeQueueDeclareOk(buffer) { + var val, len, offset = 0, fields = { + queue: void 0, + messageCount: void 0, + consumerCount: void 0 + }; + len = buffer.readUInt8(offset); + offset++; + val = buffer.toString("utf8", offset, offset + len); + offset += len; + fields.queue = val; + val = buffer.readUInt32BE(offset); + offset += 4; + fields.messageCount = val; + val = buffer.readUInt32BE(offset); + offset += 4; + fields.consumerCount = val; + return fields; + } + function encodeQueueDeclareOk(channel, fields) { + var offset = 0, val = null, varyingSize = 0; + val = fields.queue; + if (void 0 === val) + throw new Error("Missing value for mandatory field 'queue'"); + if (!("string" == typeof val && Buffer.byteLength(val) < 256)) + throw new TypeError("Field 'queue' is the wrong type; must be a string (up to 255 chars)"); + var queue_len = Buffer.byteLength(val, "utf8"); + varyingSize += queue_len; + var buffer = Buffer.alloc(21 + varyingSize); + buffer[0] = 1; + buffer.writeUInt16BE(channel, 1); + buffer.writeUInt32BE(3276811, 7); + offset = 11; + val = fields.queue; + void 0 === val && (val = void 0); + buffer[offset] = queue_len; + offset++; + buffer.write(val, offset, "utf8"); + offset += queue_len; + val = fields.messageCount; + if (void 0 === val) + throw new Error("Missing value for mandatory field 'messageCount'"); + if ("number" != typeof val || isNaN(val)) + throw new TypeError("Field 'messageCount' is the wrong type; must be a number (but not NaN)"); + buffer.writeUInt32BE(val, offset); + offset += 4; + val = fields.consumerCount; + if (void 0 === val) + throw new Error("Missing value for mandatory field 'consumerCount'"); + if ("number" != typeof val || isNaN(val)) + throw new TypeError("Field 'consumerCount' is the wrong type; must be a number (but not NaN)"); + buffer.writeUInt32BE(val, offset); + offset += 4; + buffer[offset] = 206; + buffer.writeUInt32BE(offset - 7, 3); + return buffer; + } + function decodeQueueBind(buffer) { + var val, len, offset = 0, fields = { + ticket: void 0, + queue: void 0, + exchange: void 0, + routingKey: void 0, + nowait: void 0, + arguments: void 0 + }; + val = buffer.readUInt16BE(offset); + offset += 2; + fields.ticket = val; + len = buffer.readUInt8(offset); + offset++; + val = buffer.toString("utf8", offset, offset + len); + offset += len; + fields.queue = val; + len = buffer.readUInt8(offset); + offset++; + val = buffer.toString("utf8", offset, offset + len); + offset += len; + fields.exchange = val; + len = buffer.readUInt8(offset); + offset++; + val = buffer.toString("utf8", offset, offset + len); + offset += len; + fields.routingKey = val; + val = !!(1 & buffer[offset]); + fields.nowait = val; + offset++; + len = buffer.readUInt32BE(offset); + offset += 4; + val = decodeFields(buffer.slice(offset, offset + len)); + offset += len; + fields.arguments = val; + return fields; + } + function encodeQueueBind(channel, fields) { + var len, offset = 0, val = null, bits = 0, varyingSize = 0, scratchOffset = 0; + val = fields.queue; + if (void 0 === val) + val = ""; + else if (!("string" == typeof val && Buffer.byteLength(val) < 256)) + throw new TypeError("Field 'queue' is the wrong type; must be a string (up to 255 chars)"); + var queue_len = Buffer.byteLength(val, "utf8"); + varyingSize += queue_len; + val = fields.exchange; + if (void 0 === val) + throw new Error("Missing value for mandatory field 'exchange'"); + if (!("string" == typeof val && Buffer.byteLength(val) < 256)) + throw new TypeError("Field 'exchange' is the wrong type; must be a string (up to 255 chars)"); + var exchange_len = Buffer.byteLength(val, "utf8"); + varyingSize += exchange_len; + val = fields.routingKey; + if (void 0 === val) + val = ""; + else if (!("string" == typeof val && Buffer.byteLength(val) < 256)) + throw new TypeError("Field 'routingKey' is the wrong type; must be a string (up to 255 chars)"); + var routingKey_len = Buffer.byteLength(val, "utf8"); + varyingSize += routingKey_len; + val = fields.arguments; + if (void 0 === val) + val = {}; + else if ("object" != typeof val) + throw new TypeError("Field 'arguments' is the wrong type; must be an object"); + len = encodeTable(SCRATCH, val, scratchOffset); + var arguments_encoded = SCRATCH.slice(scratchOffset, scratchOffset + len); + scratchOffset += len; + varyingSize += arguments_encoded.length; + var buffer = Buffer.alloc(18 + varyingSize); + buffer[0] = 1; + buffer.writeUInt16BE(channel, 1); + buffer.writeUInt32BE(3276820, 7); + offset = 11; + val = fields.ticket; + if (void 0 === val) + val = 0; + else if ("number" != typeof val || isNaN(val)) + throw new TypeError("Field 'ticket' is the wrong type; must be a number (but not NaN)"); + buffer.writeUInt16BE(val, offset); + offset += 2; + val = fields.queue; + void 0 === val && (val = ""); + buffer[offset] = queue_len; + offset++; + buffer.write(val, offset, "utf8"); + offset += queue_len; + val = fields.exchange; + void 0 === val && (val = void 0); + buffer[offset] = exchange_len; + offset++; + buffer.write(val, offset, "utf8"); + offset += exchange_len; + val = fields.routingKey; + void 0 === val && (val = ""); + buffer[offset] = routingKey_len; + offset++; + buffer.write(val, offset, "utf8"); + offset += routingKey_len; + val = fields.nowait; + void 0 === val && (val = false); + val && (bits += 1); + buffer[offset] = bits; + offset++; + bits = 0; + offset += arguments_encoded.copy(buffer, offset); + buffer[offset] = 206; + buffer.writeUInt32BE(offset - 7, 3); + return buffer; + } + function decodeQueueBindOk(buffer) { + return {}; + } + function encodeQueueBindOk(channel, fields) { + var offset = 0, buffer = Buffer.alloc(12); + buffer[0] = 1; + buffer.writeUInt16BE(channel, 1); + buffer.writeUInt32BE(3276821, 7); + offset = 11; + buffer[offset] = 206; + buffer.writeUInt32BE(offset - 7, 3); + return buffer; + } + function decodeQueuePurge(buffer) { + var val, len, offset = 0, fields = { + ticket: void 0, + queue: void 0, + nowait: void 0 + }; + val = buffer.readUInt16BE(offset); + offset += 2; + fields.ticket = val; + len = buffer.readUInt8(offset); + offset++; + val = buffer.toString("utf8", offset, offset + len); + offset += len; + fields.queue = val; + val = !!(1 & buffer[offset]); + fields.nowait = val; + return fields; + } + function encodeQueuePurge(channel, fields) { + var offset = 0, val = null, bits = 0, varyingSize = 0; + val = fields.queue; + if (void 0 === val) + val = ""; + else if (!("string" == typeof val && Buffer.byteLength(val) < 256)) + throw new TypeError("Field 'queue' is the wrong type; must be a string (up to 255 chars)"); + var queue_len = Buffer.byteLength(val, "utf8"); + varyingSize += queue_len; + var buffer = Buffer.alloc(16 + varyingSize); + buffer[0] = 1; + buffer.writeUInt16BE(channel, 1); + buffer.writeUInt32BE(3276830, 7); + offset = 11; + val = fields.ticket; + if (void 0 === val) + val = 0; + else if ("number" != typeof val || isNaN(val)) + throw new TypeError("Field 'ticket' is the wrong type; must be a number (but not NaN)"); + buffer.writeUInt16BE(val, offset); + offset += 2; + val = fields.queue; + void 0 === val && (val = ""); + buffer[offset] = queue_len; + offset++; + buffer.write(val, offset, "utf8"); + offset += queue_len; + val = fields.nowait; + void 0 === val && (val = false); + val && (bits += 1); + buffer[offset] = bits; + offset++; + buffer[offset] = 206; + buffer.writeUInt32BE(offset - 7, 3); + return buffer; + } + function decodeQueuePurgeOk(buffer) { + var val, offset = 0, fields = { + messageCount: void 0 + }; + val = buffer.readUInt32BE(offset); + offset += 4; + fields.messageCount = val; + return fields; + } + function encodeQueuePurgeOk(channel, fields) { + var offset = 0, val = null, buffer = Buffer.alloc(16); + buffer[0] = 1; + buffer.writeUInt16BE(channel, 1); + buffer.writeUInt32BE(3276831, 7); + offset = 11; + val = fields.messageCount; + if (void 0 === val) + throw new Error("Missing value for mandatory field 'messageCount'"); + if ("number" != typeof val || isNaN(val)) + throw new TypeError("Field 'messageCount' is the wrong type; must be a number (but not NaN)"); + buffer.writeUInt32BE(val, offset); + offset += 4; + buffer[offset] = 206; + buffer.writeUInt32BE(offset - 7, 3); + return buffer; + } + function decodeQueueDelete(buffer) { + var val, len, offset = 0, fields = { + ticket: void 0, + queue: void 0, + ifUnused: void 0, + ifEmpty: void 0, + nowait: void 0 + }; + val = buffer.readUInt16BE(offset); + offset += 2; + fields.ticket = val; + len = buffer.readUInt8(offset); + offset++; + val = buffer.toString("utf8", offset, offset + len); + offset += len; + fields.queue = val; + val = !!(1 & buffer[offset]); + fields.ifUnused = val; + val = !!(2 & buffer[offset]); + fields.ifEmpty = val; + val = !!(4 & buffer[offset]); + fields.nowait = val; + return fields; + } + function encodeQueueDelete(channel, fields) { + var offset = 0, val = null, bits = 0, varyingSize = 0; + val = fields.queue; + if (void 0 === val) + val = ""; + else if (!("string" == typeof val && Buffer.byteLength(val) < 256)) + throw new TypeError("Field 'queue' is the wrong type; must be a string (up to 255 chars)"); + var queue_len = Buffer.byteLength(val, "utf8"); + varyingSize += queue_len; + var buffer = Buffer.alloc(16 + varyingSize); + buffer[0] = 1; + buffer.writeUInt16BE(channel, 1); + buffer.writeUInt32BE(3276840, 7); + offset = 11; + val = fields.ticket; + if (void 0 === val) + val = 0; + else if ("number" != typeof val || isNaN(val)) + throw new TypeError("Field 'ticket' is the wrong type; must be a number (but not NaN)"); + buffer.writeUInt16BE(val, offset); + offset += 2; + val = fields.queue; + void 0 === val && (val = ""); + buffer[offset] = queue_len; + offset++; + buffer.write(val, offset, "utf8"); + offset += queue_len; + val = fields.ifUnused; + void 0 === val && (val = false); + val && (bits += 1); + val = fields.ifEmpty; + void 0 === val && (val = false); + val && (bits += 2); + val = fields.nowait; + void 0 === val && (val = false); + val && (bits += 4); + buffer[offset] = bits; + offset++; + buffer[offset] = 206; + buffer.writeUInt32BE(offset - 7, 3); + return buffer; + } + function decodeQueueDeleteOk(buffer) { + var val, offset = 0, fields = { + messageCount: void 0 + }; + val = buffer.readUInt32BE(offset); + offset += 4; + fields.messageCount = val; + return fields; + } + function encodeQueueDeleteOk(channel, fields) { + var offset = 0, val = null, buffer = Buffer.alloc(16); + buffer[0] = 1; + buffer.writeUInt16BE(channel, 1); + buffer.writeUInt32BE(3276841, 7); + offset = 11; + val = fields.messageCount; + if (void 0 === val) + throw new Error("Missing value for mandatory field 'messageCount'"); + if ("number" != typeof val || isNaN(val)) + throw new TypeError("Field 'messageCount' is the wrong type; must be a number (but not NaN)"); + buffer.writeUInt32BE(val, offset); + offset += 4; + buffer[offset] = 206; + buffer.writeUInt32BE(offset - 7, 3); + return buffer; + } + function decodeQueueUnbind(buffer) { + var val, len, offset = 0, fields = { + ticket: void 0, + queue: void 0, + exchange: void 0, + routingKey: void 0, + arguments: void 0 + }; + val = buffer.readUInt16BE(offset); + offset += 2; + fields.ticket = val; + len = buffer.readUInt8(offset); + offset++; + val = buffer.toString("utf8", offset, offset + len); + offset += len; + fields.queue = val; + len = buffer.readUInt8(offset); + offset++; + val = buffer.toString("utf8", offset, offset + len); + offset += len; + fields.exchange = val; + len = buffer.readUInt8(offset); + offset++; + val = buffer.toString("utf8", offset, offset + len); + offset += len; + fields.routingKey = val; + len = buffer.readUInt32BE(offset); + offset += 4; + val = decodeFields(buffer.slice(offset, offset + len)); + offset += len; + fields.arguments = val; + return fields; + } + function encodeQueueUnbind(channel, fields) { + var len, offset = 0, val = null, varyingSize = 0, scratchOffset = 0; + val = fields.queue; + if (void 0 === val) + val = ""; + else if (!("string" == typeof val && Buffer.byteLength(val) < 256)) + throw new TypeError("Field 'queue' is the wrong type; must be a string (up to 255 chars)"); + var queue_len = Buffer.byteLength(val, "utf8"); + varyingSize += queue_len; + val = fields.exchange; + if (void 0 === val) + throw new Error("Missing value for mandatory field 'exchange'"); + if (!("string" == typeof val && Buffer.byteLength(val) < 256)) + throw new TypeError("Field 'exchange' is the wrong type; must be a string (up to 255 chars)"); + var exchange_len = Buffer.byteLength(val, "utf8"); + varyingSize += exchange_len; + val = fields.routingKey; + if (void 0 === val) + val = ""; + else if (!("string" == typeof val && Buffer.byteLength(val) < 256)) + throw new TypeError("Field 'routingKey' is the wrong type; must be a string (up to 255 chars)"); + var routingKey_len = Buffer.byteLength(val, "utf8"); + varyingSize += routingKey_len; + val = fields.arguments; + if (void 0 === val) + val = {}; + else if ("object" != typeof val) + throw new TypeError("Field 'arguments' is the wrong type; must be an object"); + len = encodeTable(SCRATCH, val, scratchOffset); + var arguments_encoded = SCRATCH.slice(scratchOffset, scratchOffset + len); + scratchOffset += len; + varyingSize += arguments_encoded.length; + var buffer = Buffer.alloc(17 + varyingSize); + buffer[0] = 1; + buffer.writeUInt16BE(channel, 1); + buffer.writeUInt32BE(3276850, 7); + offset = 11; + val = fields.ticket; + if (void 0 === val) + val = 0; + else if ("number" != typeof val || isNaN(val)) + throw new TypeError("Field 'ticket' is the wrong type; must be a number (but not NaN)"); + buffer.writeUInt16BE(val, offset); + offset += 2; + val = fields.queue; + void 0 === val && (val = ""); + buffer[offset] = queue_len; + offset++; + buffer.write(val, offset, "utf8"); + offset += queue_len; + val = fields.exchange; + void 0 === val && (val = void 0); + buffer[offset] = exchange_len; + offset++; + buffer.write(val, offset, "utf8"); + offset += exchange_len; + val = fields.routingKey; + void 0 === val && (val = ""); + buffer[offset] = routingKey_len; + offset++; + buffer.write(val, offset, "utf8"); + offset += routingKey_len; + offset += arguments_encoded.copy(buffer, offset); + buffer[offset] = 206; + buffer.writeUInt32BE(offset - 7, 3); + return buffer; + } + function decodeQueueUnbindOk(buffer) { + return {}; + } + function encodeQueueUnbindOk(channel, fields) { + var offset = 0, buffer = Buffer.alloc(12); + buffer[0] = 1; + buffer.writeUInt16BE(channel, 1); + buffer.writeUInt32BE(3276851, 7); + offset = 11; + buffer[offset] = 206; + buffer.writeUInt32BE(offset - 7, 3); + return buffer; + } + function decodeBasicQos(buffer) { + var val, offset = 0, fields = { + prefetchSize: void 0, + prefetchCount: void 0, + global: void 0 + }; + val = buffer.readUInt32BE(offset); + offset += 4; + fields.prefetchSize = val; + val = buffer.readUInt16BE(offset); + offset += 2; + fields.prefetchCount = val; + val = !!(1 & buffer[offset]); + fields.global = val; + return fields; + } + function encodeBasicQos(channel, fields) { + var offset = 0, val = null, bits = 0, buffer = Buffer.alloc(19); + buffer[0] = 1; + buffer.writeUInt16BE(channel, 1); + buffer.writeUInt32BE(3932170, 7); + offset = 11; + val = fields.prefetchSize; + if (void 0 === val) + val = 0; + else if ("number" != typeof val || isNaN(val)) + throw new TypeError("Field 'prefetchSize' is the wrong type; must be a number (but not NaN)"); + buffer.writeUInt32BE(val, offset); + offset += 4; + val = fields.prefetchCount; + if (void 0 === val) + val = 0; + else if ("number" != typeof val || isNaN(val)) + throw new TypeError("Field 'prefetchCount' is the wrong type; must be a number (but not NaN)"); + buffer.writeUInt16BE(val, offset); + offset += 2; + val = fields.global; + void 0 === val && (val = false); + val && (bits += 1); + buffer[offset] = bits; + offset++; + buffer[offset] = 206; + buffer.writeUInt32BE(offset - 7, 3); + return buffer; + } + function decodeBasicQosOk(buffer) { + return {}; + } + function encodeBasicQosOk(channel, fields) { + var offset = 0, buffer = Buffer.alloc(12); + buffer[0] = 1; + buffer.writeUInt16BE(channel, 1); + buffer.writeUInt32BE(3932171, 7); + offset = 11; + buffer[offset] = 206; + buffer.writeUInt32BE(offset - 7, 3); + return buffer; + } + function decodeBasicConsume(buffer) { + var val, len, offset = 0, fields = { + ticket: void 0, + queue: void 0, + consumerTag: void 0, + noLocal: void 0, + noAck: void 0, + exclusive: void 0, + nowait: void 0, + arguments: void 0 + }; + val = buffer.readUInt16BE(offset); + offset += 2; + fields.ticket = val; + len = buffer.readUInt8(offset); + offset++; + val = buffer.toString("utf8", offset, offset + len); + offset += len; + fields.queue = val; + len = buffer.readUInt8(offset); + offset++; + val = buffer.toString("utf8", offset, offset + len); + offset += len; + fields.consumerTag = val; + val = !!(1 & buffer[offset]); + fields.noLocal = val; + val = !!(2 & buffer[offset]); + fields.noAck = val; + val = !!(4 & buffer[offset]); + fields.exclusive = val; + val = !!(8 & buffer[offset]); + fields.nowait = val; + offset++; + len = buffer.readUInt32BE(offset); + offset += 4; + val = decodeFields(buffer.slice(offset, offset + len)); + offset += len; + fields.arguments = val; + return fields; + } + function encodeBasicConsume(channel, fields) { + var len, offset = 0, val = null, bits = 0, varyingSize = 0, scratchOffset = 0; + val = fields.queue; + if (void 0 === val) + val = ""; + else if (!("string" == typeof val && Buffer.byteLength(val) < 256)) + throw new TypeError("Field 'queue' is the wrong type; must be a string (up to 255 chars)"); + var queue_len = Buffer.byteLength(val, "utf8"); + varyingSize += queue_len; + val = fields.consumerTag; + if (void 0 === val) + val = ""; + else if (!("string" == typeof val && Buffer.byteLength(val) < 256)) + throw new TypeError("Field 'consumerTag' is the wrong type; must be a string (up to 255 chars)"); + var consumerTag_len = Buffer.byteLength(val, "utf8"); + varyingSize += consumerTag_len; + val = fields.arguments; + if (void 0 === val) + val = {}; + else if ("object" != typeof val) + throw new TypeError("Field 'arguments' is the wrong type; must be an object"); + len = encodeTable(SCRATCH, val, scratchOffset); + var arguments_encoded = SCRATCH.slice(scratchOffset, scratchOffset + len); + scratchOffset += len; + varyingSize += arguments_encoded.length; + var buffer = Buffer.alloc(17 + varyingSize); + buffer[0] = 1; + buffer.writeUInt16BE(channel, 1); + buffer.writeUInt32BE(3932180, 7); + offset = 11; + val = fields.ticket; + if (void 0 === val) + val = 0; + else if ("number" != typeof val || isNaN(val)) + throw new TypeError("Field 'ticket' is the wrong type; must be a number (but not NaN)"); + buffer.writeUInt16BE(val, offset); + offset += 2; + val = fields.queue; + void 0 === val && (val = ""); + buffer[offset] = queue_len; + offset++; + buffer.write(val, offset, "utf8"); + offset += queue_len; + val = fields.consumerTag; + void 0 === val && (val = ""); + buffer[offset] = consumerTag_len; + offset++; + buffer.write(val, offset, "utf8"); + offset += consumerTag_len; + val = fields.noLocal; + void 0 === val && (val = false); + val && (bits += 1); + val = fields.noAck; + void 0 === val && (val = false); + val && (bits += 2); + val = fields.exclusive; + void 0 === val && (val = false); + val && (bits += 4); + val = fields.nowait; + void 0 === val && (val = false); + val && (bits += 8); + buffer[offset] = bits; + offset++; + bits = 0; + offset += arguments_encoded.copy(buffer, offset); + buffer[offset] = 206; + buffer.writeUInt32BE(offset - 7, 3); + return buffer; + } + function decodeBasicConsumeOk(buffer) { + var val, len, offset = 0, fields = { + consumerTag: void 0 + }; + len = buffer.readUInt8(offset); + offset++; + val = buffer.toString("utf8", offset, offset + len); + offset += len; + fields.consumerTag = val; + return fields; + } + function encodeBasicConsumeOk(channel, fields) { + var offset = 0, val = null, varyingSize = 0; + val = fields.consumerTag; + if (void 0 === val) + throw new Error("Missing value for mandatory field 'consumerTag'"); + if (!("string" == typeof val && Buffer.byteLength(val) < 256)) + throw new TypeError("Field 'consumerTag' is the wrong type; must be a string (up to 255 chars)"); + var consumerTag_len = Buffer.byteLength(val, "utf8"); + varyingSize += consumerTag_len; + var buffer = Buffer.alloc(13 + varyingSize); + buffer[0] = 1; + buffer.writeUInt16BE(channel, 1); + buffer.writeUInt32BE(3932181, 7); + offset = 11; + val = fields.consumerTag; + void 0 === val && (val = void 0); + buffer[offset] = consumerTag_len; + offset++; + buffer.write(val, offset, "utf8"); + offset += consumerTag_len; + buffer[offset] = 206; + buffer.writeUInt32BE(offset - 7, 3); + return buffer; + } + function decodeBasicCancel(buffer) { + var val, len, offset = 0, fields = { + consumerTag: void 0, + nowait: void 0 + }; + len = buffer.readUInt8(offset); + offset++; + val = buffer.toString("utf8", offset, offset + len); + offset += len; + fields.consumerTag = val; + val = !!(1 & buffer[offset]); + fields.nowait = val; + return fields; + } + function encodeBasicCancel(channel, fields) { + var offset = 0, val = null, bits = 0, varyingSize = 0; + val = fields.consumerTag; + if (void 0 === val) + throw new Error("Missing value for mandatory field 'consumerTag'"); + if (!("string" == typeof val && Buffer.byteLength(val) < 256)) + throw new TypeError("Field 'consumerTag' is the wrong type; must be a string (up to 255 chars)"); + var consumerTag_len = Buffer.byteLength(val, "utf8"); + varyingSize += consumerTag_len; + var buffer = Buffer.alloc(14 + varyingSize); + buffer[0] = 1; + buffer.writeUInt16BE(channel, 1); + buffer.writeUInt32BE(3932190, 7); + offset = 11; + val = fields.consumerTag; + void 0 === val && (val = void 0); + buffer[offset] = consumerTag_len; + offset++; + buffer.write(val, offset, "utf8"); + offset += consumerTag_len; + val = fields.nowait; + void 0 === val && (val = false); + val && (bits += 1); + buffer[offset] = bits; + offset++; + buffer[offset] = 206; + buffer.writeUInt32BE(offset - 7, 3); + return buffer; + } + function decodeBasicCancelOk(buffer) { + var val, len, offset = 0, fields = { + consumerTag: void 0 + }; + len = buffer.readUInt8(offset); + offset++; + val = buffer.toString("utf8", offset, offset + len); + offset += len; + fields.consumerTag = val; + return fields; + } + function encodeBasicCancelOk(channel, fields) { + var offset = 0, val = null, varyingSize = 0; + val = fields.consumerTag; + if (void 0 === val) + throw new Error("Missing value for mandatory field 'consumerTag'"); + if (!("string" == typeof val && Buffer.byteLength(val) < 256)) + throw new TypeError("Field 'consumerTag' is the wrong type; must be a string (up to 255 chars)"); + var consumerTag_len = Buffer.byteLength(val, "utf8"); + varyingSize += consumerTag_len; + var buffer = Buffer.alloc(13 + varyingSize); + buffer[0] = 1; + buffer.writeUInt16BE(channel, 1); + buffer.writeUInt32BE(3932191, 7); + offset = 11; + val = fields.consumerTag; + void 0 === val && (val = void 0); + buffer[offset] = consumerTag_len; + offset++; + buffer.write(val, offset, "utf8"); + offset += consumerTag_len; + buffer[offset] = 206; + buffer.writeUInt32BE(offset - 7, 3); + return buffer; + } + function decodeBasicPublish(buffer) { + var val, len, offset = 0, fields = { + ticket: void 0, + exchange: void 0, + routingKey: void 0, + mandatory: void 0, + immediate: void 0 + }; + val = buffer.readUInt16BE(offset); + offset += 2; + fields.ticket = val; + len = buffer.readUInt8(offset); + offset++; + val = buffer.toString("utf8", offset, offset + len); + offset += len; + fields.exchange = val; + len = buffer.readUInt8(offset); + offset++; + val = buffer.toString("utf8", offset, offset + len); + offset += len; + fields.routingKey = val; + val = !!(1 & buffer[offset]); + fields.mandatory = val; + val = !!(2 & buffer[offset]); + fields.immediate = val; + return fields; + } + function encodeBasicPublish(channel, fields) { + var offset = 0, val = null, bits = 0, varyingSize = 0; + val = fields.exchange; + if (void 0 === val) + val = ""; + else if (!("string" == typeof val && Buffer.byteLength(val) < 256)) + throw new TypeError("Field 'exchange' is the wrong type; must be a string (up to 255 chars)"); + var exchange_len = Buffer.byteLength(val, "utf8"); + varyingSize += exchange_len; + val = fields.routingKey; + if (void 0 === val) + val = ""; + else if (!("string" == typeof val && Buffer.byteLength(val) < 256)) + throw new TypeError("Field 'routingKey' is the wrong type; must be a string (up to 255 chars)"); + var routingKey_len = Buffer.byteLength(val, "utf8"); + varyingSize += routingKey_len; + var buffer = Buffer.alloc(17 + varyingSize); + buffer[0] = 1; + buffer.writeUInt16BE(channel, 1); + buffer.writeUInt32BE(3932200, 7); + offset = 11; + val = fields.ticket; + if (void 0 === val) + val = 0; + else if ("number" != typeof val || isNaN(val)) + throw new TypeError("Field 'ticket' is the wrong type; must be a number (but not NaN)"); + buffer.writeUInt16BE(val, offset); + offset += 2; + val = fields.exchange; + void 0 === val && (val = ""); + buffer[offset] = exchange_len; + offset++; + buffer.write(val, offset, "utf8"); + offset += exchange_len; + val = fields.routingKey; + void 0 === val && (val = ""); + buffer[offset] = routingKey_len; + offset++; + buffer.write(val, offset, "utf8"); + offset += routingKey_len; + val = fields.mandatory; + void 0 === val && (val = false); + val && (bits += 1); + val = fields.immediate; + void 0 === val && (val = false); + val && (bits += 2); + buffer[offset] = bits; + offset++; + buffer[offset] = 206; + buffer.writeUInt32BE(offset - 7, 3); + return buffer; + } + function decodeBasicReturn(buffer) { + var val, len, offset = 0, fields = { + replyCode: void 0, + replyText: void 0, + exchange: void 0, + routingKey: void 0 + }; + val = buffer.readUInt16BE(offset); + offset += 2; + fields.replyCode = val; + len = buffer.readUInt8(offset); + offset++; + val = buffer.toString("utf8", offset, offset + len); + offset += len; + fields.replyText = val; + len = buffer.readUInt8(offset); + offset++; + val = buffer.toString("utf8", offset, offset + len); + offset += len; + fields.exchange = val; + len = buffer.readUInt8(offset); + offset++; + val = buffer.toString("utf8", offset, offset + len); + offset += len; + fields.routingKey = val; + return fields; + } + function encodeBasicReturn(channel, fields) { + var offset = 0, val = null, varyingSize = 0; + val = fields.replyText; + if (void 0 === val) + val = ""; + else if (!("string" == typeof val && Buffer.byteLength(val) < 256)) + throw new TypeError("Field 'replyText' is the wrong type; must be a string (up to 255 chars)"); + var replyText_len = Buffer.byteLength(val, "utf8"); + varyingSize += replyText_len; + val = fields.exchange; + if (void 0 === val) + throw new Error("Missing value for mandatory field 'exchange'"); + if (!("string" == typeof val && Buffer.byteLength(val) < 256)) + throw new TypeError("Field 'exchange' is the wrong type; must be a string (up to 255 chars)"); + var exchange_len = Buffer.byteLength(val, "utf8"); + varyingSize += exchange_len; + val = fields.routingKey; + if (void 0 === val) + throw new Error("Missing value for mandatory field 'routingKey'"); + if (!("string" == typeof val && Buffer.byteLength(val) < 256)) + throw new TypeError("Field 'routingKey' is the wrong type; must be a string (up to 255 chars)"); + var routingKey_len = Buffer.byteLength(val, "utf8"); + varyingSize += routingKey_len; + var buffer = Buffer.alloc(17 + varyingSize); + buffer[0] = 1; + buffer.writeUInt16BE(channel, 1); + buffer.writeUInt32BE(3932210, 7); + offset = 11; + val = fields.replyCode; + if (void 0 === val) + throw new Error("Missing value for mandatory field 'replyCode'"); + if ("number" != typeof val || isNaN(val)) + throw new TypeError("Field 'replyCode' is the wrong type; must be a number (but not NaN)"); + buffer.writeUInt16BE(val, offset); + offset += 2; + val = fields.replyText; + void 0 === val && (val = ""); + buffer[offset] = replyText_len; + offset++; + buffer.write(val, offset, "utf8"); + offset += replyText_len; + val = fields.exchange; + void 0 === val && (val = void 0); + buffer[offset] = exchange_len; + offset++; + buffer.write(val, offset, "utf8"); + offset += exchange_len; + val = fields.routingKey; + void 0 === val && (val = void 0); + buffer[offset] = routingKey_len; + offset++; + buffer.write(val, offset, "utf8"); + offset += routingKey_len; + buffer[offset] = 206; + buffer.writeUInt32BE(offset - 7, 3); + return buffer; + } + function decodeBasicDeliver(buffer) { + var val, len, offset = 0, fields = { + consumerTag: void 0, + deliveryTag: void 0, + redelivered: void 0, + exchange: void 0, + routingKey: void 0 + }; + len = buffer.readUInt8(offset); + offset++; + val = buffer.toString("utf8", offset, offset + len); + offset += len; + fields.consumerTag = val; + val = ints.readUInt64BE(buffer, offset); + offset += 8; + fields.deliveryTag = val; + val = !!(1 & buffer[offset]); + fields.redelivered = val; + offset++; + len = buffer.readUInt8(offset); + offset++; + val = buffer.toString("utf8", offset, offset + len); + offset += len; + fields.exchange = val; + len = buffer.readUInt8(offset); + offset++; + val = buffer.toString("utf8", offset, offset + len); + offset += len; + fields.routingKey = val; + return fields; + } + function encodeBasicDeliver(channel, fields) { + var offset = 0, val = null, bits = 0, varyingSize = 0; + val = fields.consumerTag; + if (void 0 === val) + throw new Error("Missing value for mandatory field 'consumerTag'"); + if (!("string" == typeof val && Buffer.byteLength(val) < 256)) + throw new TypeError("Field 'consumerTag' is the wrong type; must be a string (up to 255 chars)"); + var consumerTag_len = Buffer.byteLength(val, "utf8"); + varyingSize += consumerTag_len; + val = fields.exchange; + if (void 0 === val) + throw new Error("Missing value for mandatory field 'exchange'"); + if (!("string" == typeof val && Buffer.byteLength(val) < 256)) + throw new TypeError("Field 'exchange' is the wrong type; must be a string (up to 255 chars)"); + var exchange_len = Buffer.byteLength(val, "utf8"); + varyingSize += exchange_len; + val = fields.routingKey; + if (void 0 === val) + throw new Error("Missing value for mandatory field 'routingKey'"); + if (!("string" == typeof val && Buffer.byteLength(val) < 256)) + throw new TypeError("Field 'routingKey' is the wrong type; must be a string (up to 255 chars)"); + var routingKey_len = Buffer.byteLength(val, "utf8"); + varyingSize += routingKey_len; + var buffer = Buffer.alloc(24 + varyingSize); + buffer[0] = 1; + buffer.writeUInt16BE(channel, 1); + buffer.writeUInt32BE(3932220, 7); + offset = 11; + val = fields.consumerTag; + void 0 === val && (val = void 0); + buffer[offset] = consumerTag_len; + offset++; + buffer.write(val, offset, "utf8"); + offset += consumerTag_len; + val = fields.deliveryTag; + if (void 0 === val) + throw new Error("Missing value for mandatory field 'deliveryTag'"); + if ("number" != typeof val || isNaN(val)) + throw new TypeError("Field 'deliveryTag' is the wrong type; must be a number (but not NaN)"); + ints.writeUInt64BE(buffer, val, offset); + offset += 8; + val = fields.redelivered; + void 0 === val && (val = false); + val && (bits += 1); + buffer[offset] = bits; + offset++; + bits = 0; + val = fields.exchange; + void 0 === val && (val = void 0); + buffer[offset] = exchange_len; + offset++; + buffer.write(val, offset, "utf8"); + offset += exchange_len; + val = fields.routingKey; + void 0 === val && (val = void 0); + buffer[offset] = routingKey_len; + offset++; + buffer.write(val, offset, "utf8"); + offset += routingKey_len; + buffer[offset] = 206; + buffer.writeUInt32BE(offset - 7, 3); + return buffer; + } + function decodeBasicGet(buffer) { + var val, len, offset = 0, fields = { + ticket: void 0, + queue: void 0, + noAck: void 0 + }; + val = buffer.readUInt16BE(offset); + offset += 2; + fields.ticket = val; + len = buffer.readUInt8(offset); + offset++; + val = buffer.toString("utf8", offset, offset + len); + offset += len; + fields.queue = val; + val = !!(1 & buffer[offset]); + fields.noAck = val; + return fields; + } + function encodeBasicGet(channel, fields) { + var offset = 0, val = null, bits = 0, varyingSize = 0; + val = fields.queue; + if (void 0 === val) + val = ""; + else if (!("string" == typeof val && Buffer.byteLength(val) < 256)) + throw new TypeError("Field 'queue' is the wrong type; must be a string (up to 255 chars)"); + var queue_len = Buffer.byteLength(val, "utf8"); + varyingSize += queue_len; + var buffer = Buffer.alloc(16 + varyingSize); + buffer[0] = 1; + buffer.writeUInt16BE(channel, 1); + buffer.writeUInt32BE(3932230, 7); + offset = 11; + val = fields.ticket; + if (void 0 === val) + val = 0; + else if ("number" != typeof val || isNaN(val)) + throw new TypeError("Field 'ticket' is the wrong type; must be a number (but not NaN)"); + buffer.writeUInt16BE(val, offset); + offset += 2; + val = fields.queue; + void 0 === val && (val = ""); + buffer[offset] = queue_len; + offset++; + buffer.write(val, offset, "utf8"); + offset += queue_len; + val = fields.noAck; + void 0 === val && (val = false); + val && (bits += 1); + buffer[offset] = bits; + offset++; + buffer[offset] = 206; + buffer.writeUInt32BE(offset - 7, 3); + return buffer; + } + function decodeBasicGetOk(buffer) { + var val, len, offset = 0, fields = { + deliveryTag: void 0, + redelivered: void 0, + exchange: void 0, + routingKey: void 0, + messageCount: void 0 + }; + val = ints.readUInt64BE(buffer, offset); + offset += 8; + fields.deliveryTag = val; + val = !!(1 & buffer[offset]); + fields.redelivered = val; + offset++; + len = buffer.readUInt8(offset); + offset++; + val = buffer.toString("utf8", offset, offset + len); + offset += len; + fields.exchange = val; + len = buffer.readUInt8(offset); + offset++; + val = buffer.toString("utf8", offset, offset + len); + offset += len; + fields.routingKey = val; + val = buffer.readUInt32BE(offset); + offset += 4; + fields.messageCount = val; + return fields; + } + function encodeBasicGetOk(channel, fields) { + var offset = 0, val = null, bits = 0, varyingSize = 0; + val = fields.exchange; + if (void 0 === val) + throw new Error("Missing value for mandatory field 'exchange'"); + if (!("string" == typeof val && Buffer.byteLength(val) < 256)) + throw new TypeError("Field 'exchange' is the wrong type; must be a string (up to 255 chars)"); + var exchange_len = Buffer.byteLength(val, "utf8"); + varyingSize += exchange_len; + val = fields.routingKey; + if (void 0 === val) + throw new Error("Missing value for mandatory field 'routingKey'"); + if (!("string" == typeof val && Buffer.byteLength(val) < 256)) + throw new TypeError("Field 'routingKey' is the wrong type; must be a string (up to 255 chars)"); + var routingKey_len = Buffer.byteLength(val, "utf8"); + varyingSize += routingKey_len; + var buffer = Buffer.alloc(27 + varyingSize); + buffer[0] = 1; + buffer.writeUInt16BE(channel, 1); + buffer.writeUInt32BE(3932231, 7); + offset = 11; + val = fields.deliveryTag; + if (void 0 === val) + throw new Error("Missing value for mandatory field 'deliveryTag'"); + if ("number" != typeof val || isNaN(val)) + throw new TypeError("Field 'deliveryTag' is the wrong type; must be a number (but not NaN)"); + ints.writeUInt64BE(buffer, val, offset); + offset += 8; + val = fields.redelivered; + void 0 === val && (val = false); + val && (bits += 1); + buffer[offset] = bits; + offset++; + bits = 0; + val = fields.exchange; + void 0 === val && (val = void 0); + buffer[offset] = exchange_len; + offset++; + buffer.write(val, offset, "utf8"); + offset += exchange_len; + val = fields.routingKey; + void 0 === val && (val = void 0); + buffer[offset] = routingKey_len; + offset++; + buffer.write(val, offset, "utf8"); + offset += routingKey_len; + val = fields.messageCount; + if (void 0 === val) + throw new Error("Missing value for mandatory field 'messageCount'"); + if ("number" != typeof val || isNaN(val)) + throw new TypeError("Field 'messageCount' is the wrong type; must be a number (but not NaN)"); + buffer.writeUInt32BE(val, offset); + offset += 4; + buffer[offset] = 206; + buffer.writeUInt32BE(offset - 7, 3); + return buffer; + } + function decodeBasicGetEmpty(buffer) { + var val, len, offset = 0, fields = { + clusterId: void 0 + }; + len = buffer.readUInt8(offset); + offset++; + val = buffer.toString("utf8", offset, offset + len); + offset += len; + fields.clusterId = val; + return fields; + } + function encodeBasicGetEmpty(channel, fields) { + var offset = 0, val = null, varyingSize = 0; + val = fields.clusterId; + if (void 0 === val) + val = ""; + else if (!("string" == typeof val && Buffer.byteLength(val) < 256)) + throw new TypeError("Field 'clusterId' is the wrong type; must be a string (up to 255 chars)"); + var clusterId_len = Buffer.byteLength(val, "utf8"); + varyingSize += clusterId_len; + var buffer = Buffer.alloc(13 + varyingSize); + buffer[0] = 1; + buffer.writeUInt16BE(channel, 1); + buffer.writeUInt32BE(3932232, 7); + offset = 11; + val = fields.clusterId; + void 0 === val && (val = ""); + buffer[offset] = clusterId_len; + offset++; + buffer.write(val, offset, "utf8"); + offset += clusterId_len; + buffer[offset] = 206; + buffer.writeUInt32BE(offset - 7, 3); + return buffer; + } + function decodeBasicAck(buffer) { + var val, offset = 0, fields = { + deliveryTag: void 0, + multiple: void 0 + }; + val = ints.readUInt64BE(buffer, offset); + offset += 8; + fields.deliveryTag = val; + val = !!(1 & buffer[offset]); + fields.multiple = val; + return fields; + } + function encodeBasicAck(channel, fields) { + var offset = 0, val = null, bits = 0, buffer = Buffer.alloc(21); + buffer[0] = 1; + buffer.writeUInt16BE(channel, 1); + buffer.writeUInt32BE(3932240, 7); + offset = 11; + val = fields.deliveryTag; + if (void 0 === val) + val = 0; + else if ("number" != typeof val || isNaN(val)) + throw new TypeError("Field 'deliveryTag' is the wrong type; must be a number (but not NaN)"); + ints.writeUInt64BE(buffer, val, offset); + offset += 8; + val = fields.multiple; + void 0 === val && (val = false); + val && (bits += 1); + buffer[offset] = bits; + offset++; + buffer[offset] = 206; + buffer.writeUInt32BE(offset - 7, 3); + return buffer; + } + function decodeBasicReject(buffer) { + var val, offset = 0, fields = { + deliveryTag: void 0, + requeue: void 0 + }; + val = ints.readUInt64BE(buffer, offset); + offset += 8; + fields.deliveryTag = val; + val = !!(1 & buffer[offset]); + fields.requeue = val; + return fields; + } + function encodeBasicReject(channel, fields) { + var offset = 0, val = null, bits = 0, buffer = Buffer.alloc(21); + buffer[0] = 1; + buffer.writeUInt16BE(channel, 1); + buffer.writeUInt32BE(3932250, 7); + offset = 11; + val = fields.deliveryTag; + if (void 0 === val) + throw new Error("Missing value for mandatory field 'deliveryTag'"); + if ("number" != typeof val || isNaN(val)) + throw new TypeError("Field 'deliveryTag' is the wrong type; must be a number (but not NaN)"); + ints.writeUInt64BE(buffer, val, offset); + offset += 8; + val = fields.requeue; + void 0 === val && (val = true); + val && (bits += 1); + buffer[offset] = bits; + offset++; + buffer[offset] = 206; + buffer.writeUInt32BE(offset - 7, 3); + return buffer; + } + function decodeBasicRecoverAsync(buffer) { + var val, fields = { + requeue: void 0 + }; + val = !!(1 & buffer[0]); + fields.requeue = val; + return fields; + } + function encodeBasicRecoverAsync(channel, fields) { + var offset = 0, val = null, bits = 0, buffer = Buffer.alloc(13); + buffer[0] = 1; + buffer.writeUInt16BE(channel, 1); + buffer.writeUInt32BE(3932260, 7); + offset = 11; + val = fields.requeue; + void 0 === val && (val = false); + val && (bits += 1); + buffer[offset] = bits; + offset++; + buffer[offset] = 206; + buffer.writeUInt32BE(offset - 7, 3); + return buffer; + } + function decodeBasicRecover(buffer) { + var val, fields = { + requeue: void 0 + }; + val = !!(1 & buffer[0]); + fields.requeue = val; + return fields; + } + function encodeBasicRecover(channel, fields) { + var offset = 0, val = null, bits = 0, buffer = Buffer.alloc(13); + buffer[0] = 1; + buffer.writeUInt16BE(channel, 1); + buffer.writeUInt32BE(3932270, 7); + offset = 11; + val = fields.requeue; + void 0 === val && (val = false); + val && (bits += 1); + buffer[offset] = bits; + offset++; + buffer[offset] = 206; + buffer.writeUInt32BE(offset - 7, 3); + return buffer; + } + function decodeBasicRecoverOk(buffer) { + return {}; + } + function encodeBasicRecoverOk(channel, fields) { + var offset = 0, buffer = Buffer.alloc(12); + buffer[0] = 1; + buffer.writeUInt16BE(channel, 1); + buffer.writeUInt32BE(3932271, 7); + offset = 11; + buffer[offset] = 206; + buffer.writeUInt32BE(offset - 7, 3); + return buffer; + } + function decodeBasicNack(buffer) { + var val, offset = 0, fields = { + deliveryTag: void 0, + multiple: void 0, + requeue: void 0 + }; + val = ints.readUInt64BE(buffer, offset); + offset += 8; + fields.deliveryTag = val; + val = !!(1 & buffer[offset]); + fields.multiple = val; + val = !!(2 & buffer[offset]); + fields.requeue = val; + return fields; + } + function encodeBasicNack(channel, fields) { + var offset = 0, val = null, bits = 0, buffer = Buffer.alloc(21); + buffer[0] = 1; + buffer.writeUInt16BE(channel, 1); + buffer.writeUInt32BE(3932280, 7); + offset = 11; + val = fields.deliveryTag; + if (void 0 === val) + val = 0; + else if ("number" != typeof val || isNaN(val)) + throw new TypeError("Field 'deliveryTag' is the wrong type; must be a number (but not NaN)"); + ints.writeUInt64BE(buffer, val, offset); + offset += 8; + val = fields.multiple; + void 0 === val && (val = false); + val && (bits += 1); + val = fields.requeue; + void 0 === val && (val = true); + val && (bits += 2); + buffer[offset] = bits; + offset++; + buffer[offset] = 206; + buffer.writeUInt32BE(offset - 7, 3); + return buffer; + } + function decodeTxSelect(buffer) { + return {}; + } + function encodeTxSelect(channel, fields) { + var offset = 0, buffer = Buffer.alloc(12); + buffer[0] = 1; + buffer.writeUInt16BE(channel, 1); + buffer.writeUInt32BE(5898250, 7); + offset = 11; + buffer[offset] = 206; + buffer.writeUInt32BE(offset - 7, 3); + return buffer; + } + function decodeTxSelectOk(buffer) { + return {}; + } + function encodeTxSelectOk(channel, fields) { + var offset = 0, buffer = Buffer.alloc(12); + buffer[0] = 1; + buffer.writeUInt16BE(channel, 1); + buffer.writeUInt32BE(5898251, 7); + offset = 11; + buffer[offset] = 206; + buffer.writeUInt32BE(offset - 7, 3); + return buffer; + } + function decodeTxCommit(buffer) { + return {}; + } + function encodeTxCommit(channel, fields) { + var offset = 0, buffer = Buffer.alloc(12); + buffer[0] = 1; + buffer.writeUInt16BE(channel, 1); + buffer.writeUInt32BE(5898260, 7); + offset = 11; + buffer[offset] = 206; + buffer.writeUInt32BE(offset - 7, 3); + return buffer; + } + function decodeTxCommitOk(buffer) { + return {}; + } + function encodeTxCommitOk(channel, fields) { + var offset = 0, buffer = Buffer.alloc(12); + buffer[0] = 1; + buffer.writeUInt16BE(channel, 1); + buffer.writeUInt32BE(5898261, 7); + offset = 11; + buffer[offset] = 206; + buffer.writeUInt32BE(offset - 7, 3); + return buffer; + } + function decodeTxRollback(buffer) { + return {}; + } + function encodeTxRollback(channel, fields) { + var offset = 0, buffer = Buffer.alloc(12); + buffer[0] = 1; + buffer.writeUInt16BE(channel, 1); + buffer.writeUInt32BE(5898270, 7); + offset = 11; + buffer[offset] = 206; + buffer.writeUInt32BE(offset - 7, 3); + return buffer; + } + function decodeTxRollbackOk(buffer) { + return {}; + } + function encodeTxRollbackOk(channel, fields) { + var offset = 0, buffer = Buffer.alloc(12); + buffer[0] = 1; + buffer.writeUInt16BE(channel, 1); + buffer.writeUInt32BE(5898271, 7); + offset = 11; + buffer[offset] = 206; + buffer.writeUInt32BE(offset - 7, 3); + return buffer; + } + function decodeConfirmSelect(buffer) { + var val, fields = { + nowait: void 0 + }; + val = !!(1 & buffer[0]); + fields.nowait = val; + return fields; + } + function encodeConfirmSelect(channel, fields) { + var offset = 0, val = null, bits = 0, buffer = Buffer.alloc(13); + buffer[0] = 1; + buffer.writeUInt16BE(channel, 1); + buffer.writeUInt32BE(5570570, 7); + offset = 11; + val = fields.nowait; + void 0 === val && (val = false); + val && (bits += 1); + buffer[offset] = bits; + offset++; + buffer[offset] = 206; + buffer.writeUInt32BE(offset - 7, 3); + return buffer; + } + function decodeConfirmSelectOk(buffer) { + return {}; + } + function encodeConfirmSelectOk(channel, fields) { + var offset = 0, buffer = Buffer.alloc(12); + buffer[0] = 1; + buffer.writeUInt16BE(channel, 1); + buffer.writeUInt32BE(5570571, 7); + offset = 11; + buffer[offset] = 206; + buffer.writeUInt32BE(offset - 7, 3); + return buffer; + } + function encodeBasicProperties(channel, size, fields) { + var val, len, offset = 0, flags = 0, scratchOffset = 0, varyingSize = 0; + val = fields.contentType; + if (void 0 != val) { + if (!("string" == typeof val && Buffer.byteLength(val) < 256)) + throw new TypeError("Field 'contentType' is the wrong type; must be a string (up to 255 chars)"); + var contentType_len = Buffer.byteLength(val, "utf8"); + varyingSize += 1; + varyingSize += contentType_len; + } + val = fields.contentEncoding; + if (void 0 != val) { + if (!("string" == typeof val && Buffer.byteLength(val) < 256)) + throw new TypeError("Field 'contentEncoding' is the wrong type; must be a string (up to 255 chars)"); + var contentEncoding_len = Buffer.byteLength(val, "utf8"); + varyingSize += 1; + varyingSize += contentEncoding_len; + } + val = fields.headers; + if (void 0 != val) { + if ("object" != typeof val) + throw new TypeError("Field 'headers' is the wrong type; must be an object"); + len = encodeTable(SCRATCH, val, scratchOffset); + var headers_encoded = SCRATCH.slice(scratchOffset, scratchOffset + len); + scratchOffset += len; + varyingSize += headers_encoded.length; + } + val = fields.deliveryMode; + if (void 0 != val) { + if ("number" != typeof val || isNaN(val)) + throw new TypeError("Field 'deliveryMode' is the wrong type; must be a number (but not NaN)"); + varyingSize += 1; + } + val = fields.priority; + if (void 0 != val) { + if ("number" != typeof val || isNaN(val)) + throw new TypeError("Field 'priority' is the wrong type; must be a number (but not NaN)"); + varyingSize += 1; + } + val = fields.correlationId; + if (void 0 != val) { + if (!("string" == typeof val && Buffer.byteLength(val) < 256)) + throw new TypeError("Field 'correlationId' is the wrong type; must be a string (up to 255 chars)"); + var correlationId_len = Buffer.byteLength(val, "utf8"); + varyingSize += 1; + varyingSize += correlationId_len; + } + val = fields.replyTo; + if (void 0 != val) { + if (!("string" == typeof val && Buffer.byteLength(val) < 256)) + throw new TypeError("Field 'replyTo' is the wrong type; must be a string (up to 255 chars)"); + var replyTo_len = Buffer.byteLength(val, "utf8"); + varyingSize += 1; + varyingSize += replyTo_len; + } + val = fields.expiration; + if (void 0 != val) { + if (!("string" == typeof val && Buffer.byteLength(val) < 256)) + throw new TypeError("Field 'expiration' is the wrong type; must be a string (up to 255 chars)"); + var expiration_len = Buffer.byteLength(val, "utf8"); + varyingSize += 1; + varyingSize += expiration_len; + } + val = fields.messageId; + if (void 0 != val) { + if (!("string" == typeof val && Buffer.byteLength(val) < 256)) + throw new TypeError("Field 'messageId' is the wrong type; must be a string (up to 255 chars)"); + var messageId_len = Buffer.byteLength(val, "utf8"); + varyingSize += 1; + varyingSize += messageId_len; + } + val = fields.timestamp; + if (void 0 != val) { + if ("number" != typeof val || isNaN(val)) + throw new TypeError("Field 'timestamp' is the wrong type; must be a number (but not NaN)"); + varyingSize += 8; + } + val = fields.type; + if (void 0 != val) { + if (!("string" == typeof val && Buffer.byteLength(val) < 256)) + throw new TypeError("Field 'type' is the wrong type; must be a string (up to 255 chars)"); + var type_len = Buffer.byteLength(val, "utf8"); + varyingSize += 1; + varyingSize += type_len; + } + val = fields.userId; + if (void 0 != val) { + if (!("string" == typeof val && Buffer.byteLength(val) < 256)) + throw new TypeError("Field 'userId' is the wrong type; must be a string (up to 255 chars)"); + var userId_len = Buffer.byteLength(val, "utf8"); + varyingSize += 1; + varyingSize += userId_len; + } + val = fields.appId; + if (void 0 != val) { + if (!("string" == typeof val && Buffer.byteLength(val) < 256)) + throw new TypeError("Field 'appId' is the wrong type; must be a string (up to 255 chars)"); + var appId_len = Buffer.byteLength(val, "utf8"); + varyingSize += 1; + varyingSize += appId_len; + } + val = fields.clusterId; + if (void 0 != val) { + if (!("string" == typeof val && Buffer.byteLength(val) < 256)) + throw new TypeError("Field 'clusterId' is the wrong type; must be a string (up to 255 chars)"); + var clusterId_len = Buffer.byteLength(val, "utf8"); + varyingSize += 1; + varyingSize += clusterId_len; + } + var buffer = Buffer.alloc(22 + varyingSize); + buffer[0] = 2; + buffer.writeUInt16BE(channel, 1); + buffer.writeUInt32BE(3932160, 7); + ints.writeUInt64BE(buffer, size, 11); + flags = 0; + offset = 21; + val = fields.contentType; + if (void 0 != val) { + flags += 32768; + buffer[offset] = contentType_len; + offset++; + buffer.write(val, offset, "utf8"); + offset += contentType_len; + } + val = fields.contentEncoding; + if (void 0 != val) { + flags += 16384; + buffer[offset] = contentEncoding_len; + offset++; + buffer.write(val, offset, "utf8"); + offset += contentEncoding_len; + } + val = fields.headers; + if (void 0 != val) { + flags += 8192; + offset += headers_encoded.copy(buffer, offset); + } + val = fields.deliveryMode; + if (void 0 != val) { + flags += 4096; + buffer.writeUInt8(val, offset); + offset++; + } + val = fields.priority; + if (void 0 != val) { + flags += 2048; + buffer.writeUInt8(val, offset); + offset++; + } + val = fields.correlationId; + if (void 0 != val) { + flags += 1024; + buffer[offset] = correlationId_len; + offset++; + buffer.write(val, offset, "utf8"); + offset += correlationId_len; + } + val = fields.replyTo; + if (void 0 != val) { + flags += 512; + buffer[offset] = replyTo_len; + offset++; + buffer.write(val, offset, "utf8"); + offset += replyTo_len; + } + val = fields.expiration; + if (void 0 != val) { + flags += 256; + buffer[offset] = expiration_len; + offset++; + buffer.write(val, offset, "utf8"); + offset += expiration_len; + } + val = fields.messageId; + if (void 0 != val) { + flags += 128; + buffer[offset] = messageId_len; + offset++; + buffer.write(val, offset, "utf8"); + offset += messageId_len; + } + val = fields.timestamp; + if (void 0 != val) { + flags += 64; + ints.writeUInt64BE(buffer, val, offset); + offset += 8; + } + val = fields.type; + if (void 0 != val) { + flags += 32; + buffer[offset] = type_len; + offset++; + buffer.write(val, offset, "utf8"); + offset += type_len; + } + val = fields.userId; + if (void 0 != val) { + flags += 16; + buffer[offset] = userId_len; + offset++; + buffer.write(val, offset, "utf8"); + offset += userId_len; + } + val = fields.appId; + if (void 0 != val) { + flags += 8; + buffer[offset] = appId_len; + offset++; + buffer.write(val, offset, "utf8"); + offset += appId_len; + } + val = fields.clusterId; + if (void 0 != val) { + flags += 4; + buffer[offset] = clusterId_len; + offset++; + buffer.write(val, offset, "utf8"); + offset += clusterId_len; + } + buffer[offset] = 206; + buffer.writeUInt32BE(offset - 7, 3); + buffer.writeUInt16BE(flags, 19); + return buffer.slice(0, offset + 1); + } + function decodeBasicProperties(buffer) { + var flags, val, len, offset = 2; + flags = buffer.readUInt16BE(0); + if (0 === flags) + return {}; + var fields = { + contentType: void 0, + contentEncoding: void 0, + headers: void 0, + deliveryMode: void 0, + priority: void 0, + correlationId: void 0, + replyTo: void 0, + expiration: void 0, + messageId: void 0, + timestamp: void 0, + type: void 0, + userId: void 0, + appId: void 0, + clusterId: void 0 + }; + if (32768 & flags) { + len = buffer.readUInt8(offset); + offset++; + val = buffer.toString("utf8", offset, offset + len); + offset += len; + fields.contentType = val; + } + if (16384 & flags) { + len = buffer.readUInt8(offset); + offset++; + val = buffer.toString("utf8", offset, offset + len); + offset += len; + fields.contentEncoding = val; + } + if (8192 & flags) { + len = buffer.readUInt32BE(offset); + offset += 4; + val = decodeFields(buffer.slice(offset, offset + len)); + offset += len; + fields.headers = val; + } + if (4096 & flags) { + val = buffer[offset]; + offset++; + fields.deliveryMode = val; + } + if (2048 & flags) { + val = buffer[offset]; + offset++; + fields.priority = val; + } + if (1024 & flags) { + len = buffer.readUInt8(offset); + offset++; + val = buffer.toString("utf8", offset, offset + len); + offset += len; + fields.correlationId = val; + } + if (512 & flags) { + len = buffer.readUInt8(offset); + offset++; + val = buffer.toString("utf8", offset, offset + len); + offset += len; + fields.replyTo = val; + } + if (256 & flags) { + len = buffer.readUInt8(offset); + offset++; + val = buffer.toString("utf8", offset, offset + len); + offset += len; + fields.expiration = val; + } + if (128 & flags) { + len = buffer.readUInt8(offset); + offset++; + val = buffer.toString("utf8", offset, offset + len); + offset += len; + fields.messageId = val; + } + if (64 & flags) { + val = ints.readUInt64BE(buffer, offset); + offset += 8; + fields.timestamp = val; + } + if (32 & flags) { + len = buffer.readUInt8(offset); + offset++; + val = buffer.toString("utf8", offset, offset + len); + offset += len; + fields.type = val; + } + if (16 & flags) { + len = buffer.readUInt8(offset); + offset++; + val = buffer.toString("utf8", offset, offset + len); + offset += len; + fields.userId = val; + } + if (8 & flags) { + len = buffer.readUInt8(offset); + offset++; + val = buffer.toString("utf8", offset, offset + len); + offset += len; + fields.appId = val; + } + if (4 & flags) { + len = buffer.readUInt8(offset); + offset++; + val = buffer.toString("utf8", offset, offset + len); + offset += len; + fields.clusterId = val; + } + return fields; + } + var codec = require_codec(); + var ints = require_buffer_more_ints(); + var encodeTable = codec.encodeTable; + var decodeFields = codec.decodeFields; + var SCRATCH = Buffer.alloc(65536); + var EMPTY_OBJECT = Object.freeze({}); + module2.exports.constants = { + FRAME_METHOD: 1, + FRAME_HEADER: 2, + FRAME_BODY: 3, + FRAME_HEARTBEAT: 8, + FRAME_MIN_SIZE: 4096, + FRAME_END: 206, + REPLY_SUCCESS: 200, + CONTENT_TOO_LARGE: 311, + NO_ROUTE: 312, + NO_CONSUMERS: 313, + ACCESS_REFUSED: 403, + NOT_FOUND: 404, + RESOURCE_LOCKED: 405, + PRECONDITION_FAILED: 406, + CONNECTION_FORCED: 320, + INVALID_PATH: 402, + FRAME_ERROR: 501, + SYNTAX_ERROR: 502, + COMMAND_INVALID: 503, + CHANNEL_ERROR: 504, + UNEXPECTED_FRAME: 505, + RESOURCE_ERROR: 506, + NOT_ALLOWED: 530, + NOT_IMPLEMENTED: 540, + INTERNAL_ERROR: 541 + }; + module2.exports.constant_strs = { + "1": "FRAME-METHOD", + "2": "FRAME-HEADER", + "3": "FRAME-BODY", + "8": "FRAME-HEARTBEAT", + "200": "REPLY-SUCCESS", + "206": "FRAME-END", + "311": "CONTENT-TOO-LARGE", + "312": "NO-ROUTE", + "313": "NO-CONSUMERS", + "320": "CONNECTION-FORCED", + "402": "INVALID-PATH", + "403": "ACCESS-REFUSED", + "404": "NOT-FOUND", + "405": "RESOURCE-LOCKED", + "406": "PRECONDITION-FAILED", + "501": "FRAME-ERROR", + "502": "SYNTAX-ERROR", + "503": "COMMAND-INVALID", + "504": "CHANNEL-ERROR", + "505": "UNEXPECTED-FRAME", + "506": "RESOURCE-ERROR", + "530": "NOT-ALLOWED", + "540": "NOT-IMPLEMENTED", + "541": "INTERNAL-ERROR", + "4096": "FRAME-MIN-SIZE" + }; + module2.exports.FRAME_OVERHEAD = 8; + module2.exports.decode = function(id, buf) { + switch (id) { + case 655370: + return decodeConnectionStart(buf); + case 655371: + return decodeConnectionStartOk(buf); + case 655380: + return decodeConnectionSecure(buf); + case 655381: + return decodeConnectionSecureOk(buf); + case 655390: + return decodeConnectionTune(buf); + case 655391: + return decodeConnectionTuneOk(buf); + case 655400: + return decodeConnectionOpen(buf); + case 655401: + return decodeConnectionOpenOk(buf); + case 655410: + return decodeConnectionClose(buf); + case 655411: + return decodeConnectionCloseOk(buf); + case 655420: + return decodeConnectionBlocked(buf); + case 655421: + return decodeConnectionUnblocked(buf); + case 1310730: + return decodeChannelOpen(buf); + case 1310731: + return decodeChannelOpenOk(buf); + case 1310740: + return decodeChannelFlow(buf); + case 1310741: + return decodeChannelFlowOk(buf); + case 1310760: + return decodeChannelClose(buf); + case 1310761: + return decodeChannelCloseOk(buf); + case 1966090: + return decodeAccessRequest(buf); + case 1966091: + return decodeAccessRequestOk(buf); + case 2621450: + return decodeExchangeDeclare(buf); + case 2621451: + return decodeExchangeDeclareOk(buf); + case 2621460: + return decodeExchangeDelete(buf); + case 2621461: + return decodeExchangeDeleteOk(buf); + case 2621470: + return decodeExchangeBind(buf); + case 2621471: + return decodeExchangeBindOk(buf); + case 2621480: + return decodeExchangeUnbind(buf); + case 2621491: + return decodeExchangeUnbindOk(buf); + case 3276810: + return decodeQueueDeclare(buf); + case 3276811: + return decodeQueueDeclareOk(buf); + case 3276820: + return decodeQueueBind(buf); + case 3276821: + return decodeQueueBindOk(buf); + case 3276830: + return decodeQueuePurge(buf); + case 3276831: + return decodeQueuePurgeOk(buf); + case 3276840: + return decodeQueueDelete(buf); + case 3276841: + return decodeQueueDeleteOk(buf); + case 3276850: + return decodeQueueUnbind(buf); + case 3276851: + return decodeQueueUnbindOk(buf); + case 3932170: + return decodeBasicQos(buf); + case 3932171: + return decodeBasicQosOk(buf); + case 3932180: + return decodeBasicConsume(buf); + case 3932181: + return decodeBasicConsumeOk(buf); + case 3932190: + return decodeBasicCancel(buf); + case 3932191: + return decodeBasicCancelOk(buf); + case 3932200: + return decodeBasicPublish(buf); + case 3932210: + return decodeBasicReturn(buf); + case 3932220: + return decodeBasicDeliver(buf); + case 3932230: + return decodeBasicGet(buf); + case 3932231: + return decodeBasicGetOk(buf); + case 3932232: + return decodeBasicGetEmpty(buf); + case 3932240: + return decodeBasicAck(buf); + case 3932250: + return decodeBasicReject(buf); + case 3932260: + return decodeBasicRecoverAsync(buf); + case 3932270: + return decodeBasicRecover(buf); + case 3932271: + return decodeBasicRecoverOk(buf); + case 3932280: + return decodeBasicNack(buf); + case 5898250: + return decodeTxSelect(buf); + case 5898251: + return decodeTxSelectOk(buf); + case 5898260: + return decodeTxCommit(buf); + case 5898261: + return decodeTxCommitOk(buf); + case 5898270: + return decodeTxRollback(buf); + case 5898271: + return decodeTxRollbackOk(buf); + case 5570570: + return decodeConfirmSelect(buf); + case 5570571: + return decodeConfirmSelectOk(buf); + case 60: + return decodeBasicProperties(buf); + default: + throw new Error("Unknown class/method ID"); + } + }; + module2.exports.encodeMethod = function(id, channel, fields) { + switch (id) { + case 655370: + return encodeConnectionStart(channel, fields); + case 655371: + return encodeConnectionStartOk(channel, fields); + case 655380: + return encodeConnectionSecure(channel, fields); + case 655381: + return encodeConnectionSecureOk(channel, fields); + case 655390: + return encodeConnectionTune(channel, fields); + case 655391: + return encodeConnectionTuneOk(channel, fields); + case 655400: + return encodeConnectionOpen(channel, fields); + case 655401: + return encodeConnectionOpenOk(channel, fields); + case 655410: + return encodeConnectionClose(channel, fields); + case 655411: + return encodeConnectionCloseOk(channel, fields); + case 655420: + return encodeConnectionBlocked(channel, fields); + case 655421: + return encodeConnectionUnblocked(channel, fields); + case 1310730: + return encodeChannelOpen(channel, fields); + case 1310731: + return encodeChannelOpenOk(channel, fields); + case 1310740: + return encodeChannelFlow(channel, fields); + case 1310741: + return encodeChannelFlowOk(channel, fields); + case 1310760: + return encodeChannelClose(channel, fields); + case 1310761: + return encodeChannelCloseOk(channel, fields); + case 1966090: + return encodeAccessRequest(channel, fields); + case 1966091: + return encodeAccessRequestOk(channel, fields); + case 2621450: + return encodeExchangeDeclare(channel, fields); + case 2621451: + return encodeExchangeDeclareOk(channel, fields); + case 2621460: + return encodeExchangeDelete(channel, fields); + case 2621461: + return encodeExchangeDeleteOk(channel, fields); + case 2621470: + return encodeExchangeBind(channel, fields); + case 2621471: + return encodeExchangeBindOk(channel, fields); + case 2621480: + return encodeExchangeUnbind(channel, fields); + case 2621491: + return encodeExchangeUnbindOk(channel, fields); + case 3276810: + return encodeQueueDeclare(channel, fields); + case 3276811: + return encodeQueueDeclareOk(channel, fields); + case 3276820: + return encodeQueueBind(channel, fields); + case 3276821: + return encodeQueueBindOk(channel, fields); + case 3276830: + return encodeQueuePurge(channel, fields); + case 3276831: + return encodeQueuePurgeOk(channel, fields); + case 3276840: + return encodeQueueDelete(channel, fields); + case 3276841: + return encodeQueueDeleteOk(channel, fields); + case 3276850: + return encodeQueueUnbind(channel, fields); + case 3276851: + return encodeQueueUnbindOk(channel, fields); + case 3932170: + return encodeBasicQos(channel, fields); + case 3932171: + return encodeBasicQosOk(channel, fields); + case 3932180: + return encodeBasicConsume(channel, fields); + case 3932181: + return encodeBasicConsumeOk(channel, fields); + case 3932190: + return encodeBasicCancel(channel, fields); + case 3932191: + return encodeBasicCancelOk(channel, fields); + case 3932200: + return encodeBasicPublish(channel, fields); + case 3932210: + return encodeBasicReturn(channel, fields); + case 3932220: + return encodeBasicDeliver(channel, fields); + case 3932230: + return encodeBasicGet(channel, fields); + case 3932231: + return encodeBasicGetOk(channel, fields); + case 3932232: + return encodeBasicGetEmpty(channel, fields); + case 3932240: + return encodeBasicAck(channel, fields); + case 3932250: + return encodeBasicReject(channel, fields); + case 3932260: + return encodeBasicRecoverAsync(channel, fields); + case 3932270: + return encodeBasicRecover(channel, fields); + case 3932271: + return encodeBasicRecoverOk(channel, fields); + case 3932280: + return encodeBasicNack(channel, fields); + case 5898250: + return encodeTxSelect(channel, fields); + case 5898251: + return encodeTxSelectOk(channel, fields); + case 5898260: + return encodeTxCommit(channel, fields); + case 5898261: + return encodeTxCommitOk(channel, fields); + case 5898270: + return encodeTxRollback(channel, fields); + case 5898271: + return encodeTxRollbackOk(channel, fields); + case 5570570: + return encodeConfirmSelect(channel, fields); + case 5570571: + return encodeConfirmSelectOk(channel, fields); + default: + throw new Error("Unknown class/method ID"); + } + }; + module2.exports.encodeProperties = function(id, channel, size, fields) { + switch (id) { + case 60: + return encodeBasicProperties(channel, size, fields); + default: + throw new Error("Unknown class/properties ID"); + } + }; + module2.exports.info = function(id) { + switch (id) { + case 655370: + return methodInfoConnectionStart; + case 655371: + return methodInfoConnectionStartOk; + case 655380: + return methodInfoConnectionSecure; + case 655381: + return methodInfoConnectionSecureOk; + case 655390: + return methodInfoConnectionTune; + case 655391: + return methodInfoConnectionTuneOk; + case 655400: + return methodInfoConnectionOpen; + case 655401: + return methodInfoConnectionOpenOk; + case 655410: + return methodInfoConnectionClose; + case 655411: + return methodInfoConnectionCloseOk; + case 655420: + return methodInfoConnectionBlocked; + case 655421: + return methodInfoConnectionUnblocked; + case 1310730: + return methodInfoChannelOpen; + case 1310731: + return methodInfoChannelOpenOk; + case 1310740: + return methodInfoChannelFlow; + case 1310741: + return methodInfoChannelFlowOk; + case 1310760: + return methodInfoChannelClose; + case 1310761: + return methodInfoChannelCloseOk; + case 1966090: + return methodInfoAccessRequest; + case 1966091: + return methodInfoAccessRequestOk; + case 2621450: + return methodInfoExchangeDeclare; + case 2621451: + return methodInfoExchangeDeclareOk; + case 2621460: + return methodInfoExchangeDelete; + case 2621461: + return methodInfoExchangeDeleteOk; + case 2621470: + return methodInfoExchangeBind; + case 2621471: + return methodInfoExchangeBindOk; + case 2621480: + return methodInfoExchangeUnbind; + case 2621491: + return methodInfoExchangeUnbindOk; + case 3276810: + return methodInfoQueueDeclare; + case 3276811: + return methodInfoQueueDeclareOk; + case 3276820: + return methodInfoQueueBind; + case 3276821: + return methodInfoQueueBindOk; + case 3276830: + return methodInfoQueuePurge; + case 3276831: + return methodInfoQueuePurgeOk; + case 3276840: + return methodInfoQueueDelete; + case 3276841: + return methodInfoQueueDeleteOk; + case 3276850: + return methodInfoQueueUnbind; + case 3276851: + return methodInfoQueueUnbindOk; + case 3932170: + return methodInfoBasicQos; + case 3932171: + return methodInfoBasicQosOk; + case 3932180: + return methodInfoBasicConsume; + case 3932181: + return methodInfoBasicConsumeOk; + case 3932190: + return methodInfoBasicCancel; + case 3932191: + return methodInfoBasicCancelOk; + case 3932200: + return methodInfoBasicPublish; + case 3932210: + return methodInfoBasicReturn; + case 3932220: + return methodInfoBasicDeliver; + case 3932230: + return methodInfoBasicGet; + case 3932231: + return methodInfoBasicGetOk; + case 3932232: + return methodInfoBasicGetEmpty; + case 3932240: + return methodInfoBasicAck; + case 3932250: + return methodInfoBasicReject; + case 3932260: + return methodInfoBasicRecoverAsync; + case 3932270: + return methodInfoBasicRecover; + case 3932271: + return methodInfoBasicRecoverOk; + case 3932280: + return methodInfoBasicNack; + case 5898250: + return methodInfoTxSelect; + case 5898251: + return methodInfoTxSelectOk; + case 5898260: + return methodInfoTxCommit; + case 5898261: + return methodInfoTxCommitOk; + case 5898270: + return methodInfoTxRollback; + case 5898271: + return methodInfoTxRollbackOk; + case 5570570: + return methodInfoConfirmSelect; + case 5570571: + return methodInfoConfirmSelectOk; + case 60: + return propertiesInfoBasicProperties; + default: + throw new Error("Unknown class/method ID"); + } + }; + module2.exports.ConnectionStart = 655370; + var methodInfoConnectionStart = module2.exports.methodInfoConnectionStart = { + id: 655370, + classId: 10, + methodId: 10, + name: "ConnectionStart", + args: [{ + type: "octet", + name: "versionMajor", + default: 0 + }, { + type: "octet", + name: "versionMinor", + default: 9 + }, { + type: "table", + name: "serverProperties" + }, { + type: "longstr", + name: "mechanisms", + default: "PLAIN" + }, { + type: "longstr", + name: "locales", + default: "en_US" + }] + }; + module2.exports.ConnectionStartOk = 655371; + var methodInfoConnectionStartOk = module2.exports.methodInfoConnectionStartOk = { + id: 655371, + classId: 10, + methodId: 11, + name: "ConnectionStartOk", + args: [{ + type: "table", + name: "clientProperties" + }, { + type: "shortstr", + name: "mechanism", + default: "PLAIN" + }, { + type: "longstr", + name: "response" + }, { + type: "shortstr", + name: "locale", + default: "en_US" + }] + }; + module2.exports.ConnectionSecure = 655380; + var methodInfoConnectionSecure = module2.exports.methodInfoConnectionSecure = { + id: 655380, + classId: 10, + methodId: 20, + name: "ConnectionSecure", + args: [{ + type: "longstr", + name: "challenge" + }] + }; + module2.exports.ConnectionSecureOk = 655381; + var methodInfoConnectionSecureOk = module2.exports.methodInfoConnectionSecureOk = { + id: 655381, + classId: 10, + methodId: 21, + name: "ConnectionSecureOk", + args: [{ + type: "longstr", + name: "response" + }] + }; + module2.exports.ConnectionTune = 655390; + var methodInfoConnectionTune = module2.exports.methodInfoConnectionTune = { + id: 655390, + classId: 10, + methodId: 30, + name: "ConnectionTune", + args: [{ + type: "short", + name: "channelMax", + default: 0 + }, { + type: "long", + name: "frameMax", + default: 0 + }, { + type: "short", + name: "heartbeat", + default: 0 + }] + }; + module2.exports.ConnectionTuneOk = 655391; + var methodInfoConnectionTuneOk = module2.exports.methodInfoConnectionTuneOk = { + id: 655391, + classId: 10, + methodId: 31, + name: "ConnectionTuneOk", + args: [{ + type: "short", + name: "channelMax", + default: 0 + }, { + type: "long", + name: "frameMax", + default: 0 + }, { + type: "short", + name: "heartbeat", + default: 0 + }] + }; + module2.exports.ConnectionOpen = 655400; + var methodInfoConnectionOpen = module2.exports.methodInfoConnectionOpen = { + id: 655400, + classId: 10, + methodId: 40, + name: "ConnectionOpen", + args: [{ + type: "shortstr", + name: "virtualHost", + default: "/" + }, { + type: "shortstr", + name: "capabilities", + default: "" + }, { + type: "bit", + name: "insist", + default: false + }] + }; + module2.exports.ConnectionOpenOk = 655401; + var methodInfoConnectionOpenOk = module2.exports.methodInfoConnectionOpenOk = { + id: 655401, + classId: 10, + methodId: 41, + name: "ConnectionOpenOk", + args: [{ + type: "shortstr", + name: "knownHosts", + default: "" + }] + }; + module2.exports.ConnectionClose = 655410; + var methodInfoConnectionClose = module2.exports.methodInfoConnectionClose = { + id: 655410, + classId: 10, + methodId: 50, + name: "ConnectionClose", + args: [{ + type: "short", + name: "replyCode" + }, { + type: "shortstr", + name: "replyText", + default: "" + }, { + type: "short", + name: "classId" + }, { + type: "short", + name: "methodId" + }] + }; + module2.exports.ConnectionCloseOk = 655411; + var methodInfoConnectionCloseOk = module2.exports.methodInfoConnectionCloseOk = { + id: 655411, + classId: 10, + methodId: 51, + name: "ConnectionCloseOk", + args: [] + }; + module2.exports.ConnectionBlocked = 655420; + var methodInfoConnectionBlocked = module2.exports.methodInfoConnectionBlocked = { + id: 655420, + classId: 10, + methodId: 60, + name: "ConnectionBlocked", + args: [{ + type: "shortstr", + name: "reason", + default: "" + }] + }; + module2.exports.ConnectionUnblocked = 655421; + var methodInfoConnectionUnblocked = module2.exports.methodInfoConnectionUnblocked = { + id: 655421, + classId: 10, + methodId: 61, + name: "ConnectionUnblocked", + args: [] + }; + module2.exports.ChannelOpen = 1310730; + var methodInfoChannelOpen = module2.exports.methodInfoChannelOpen = { + id: 1310730, + classId: 20, + methodId: 10, + name: "ChannelOpen", + args: [{ + type: "shortstr", + name: "outOfBand", + default: "" + }] + }; + module2.exports.ChannelOpenOk = 1310731; + var methodInfoChannelOpenOk = module2.exports.methodInfoChannelOpenOk = { + id: 1310731, + classId: 20, + methodId: 11, + name: "ChannelOpenOk", + args: [{ + type: "longstr", + name: "channelId", + default: "" + }] + }; + module2.exports.ChannelFlow = 1310740; + var methodInfoChannelFlow = module2.exports.methodInfoChannelFlow = { + id: 1310740, + classId: 20, + methodId: 20, + name: "ChannelFlow", + args: [{ + type: "bit", + name: "active" + }] + }; + module2.exports.ChannelFlowOk = 1310741; + var methodInfoChannelFlowOk = module2.exports.methodInfoChannelFlowOk = { + id: 1310741, + classId: 20, + methodId: 21, + name: "ChannelFlowOk", + args: [{ + type: "bit", + name: "active" + }] + }; + module2.exports.ChannelClose = 1310760; + var methodInfoChannelClose = module2.exports.methodInfoChannelClose = { + id: 1310760, + classId: 20, + methodId: 40, + name: "ChannelClose", + args: [{ + type: "short", + name: "replyCode" + }, { + type: "shortstr", + name: "replyText", + default: "" + }, { + type: "short", + name: "classId" + }, { + type: "short", + name: "methodId" + }] + }; + module2.exports.ChannelCloseOk = 1310761; + var methodInfoChannelCloseOk = module2.exports.methodInfoChannelCloseOk = { + id: 1310761, + classId: 20, + methodId: 41, + name: "ChannelCloseOk", + args: [] + }; + module2.exports.AccessRequest = 1966090; + var methodInfoAccessRequest = module2.exports.methodInfoAccessRequest = { + id: 1966090, + classId: 30, + methodId: 10, + name: "AccessRequest", + args: [{ + type: "shortstr", + name: "realm", + default: "/data" + }, { + type: "bit", + name: "exclusive", + default: false + }, { + type: "bit", + name: "passive", + default: true + }, { + type: "bit", + name: "active", + default: true + }, { + type: "bit", + name: "write", + default: true + }, { + type: "bit", + name: "read", + default: true + }] + }; + module2.exports.AccessRequestOk = 1966091; + var methodInfoAccessRequestOk = module2.exports.methodInfoAccessRequestOk = { + id: 1966091, + classId: 30, + methodId: 11, + name: "AccessRequestOk", + args: [{ + type: "short", + name: "ticket", + default: 1 + }] + }; + module2.exports.ExchangeDeclare = 2621450; + var methodInfoExchangeDeclare = module2.exports.methodInfoExchangeDeclare = { + id: 2621450, + classId: 40, + methodId: 10, + name: "ExchangeDeclare", + args: [{ + type: "short", + name: "ticket", + default: 0 + }, { + type: "shortstr", + name: "exchange" + }, { + type: "shortstr", + name: "type", + default: "direct" + }, { + type: "bit", + name: "passive", + default: false + }, { + type: "bit", + name: "durable", + default: false + }, { + type: "bit", + name: "autoDelete", + default: false + }, { + type: "bit", + name: "internal", + default: false + }, { + type: "bit", + name: "nowait", + default: false + }, { + type: "table", + name: "arguments", + default: {} + }] + }; + module2.exports.ExchangeDeclareOk = 2621451; + var methodInfoExchangeDeclareOk = module2.exports.methodInfoExchangeDeclareOk = { + id: 2621451, + classId: 40, + methodId: 11, + name: "ExchangeDeclareOk", + args: [] + }; + module2.exports.ExchangeDelete = 2621460; + var methodInfoExchangeDelete = module2.exports.methodInfoExchangeDelete = { + id: 2621460, + classId: 40, + methodId: 20, + name: "ExchangeDelete", + args: [{ + type: "short", + name: "ticket", + default: 0 + }, { + type: "shortstr", + name: "exchange" + }, { + type: "bit", + name: "ifUnused", + default: false + }, { + type: "bit", + name: "nowait", + default: false + }] + }; + module2.exports.ExchangeDeleteOk = 2621461; + var methodInfoExchangeDeleteOk = module2.exports.methodInfoExchangeDeleteOk = { + id: 2621461, + classId: 40, + methodId: 21, + name: "ExchangeDeleteOk", + args: [] + }; + module2.exports.ExchangeBind = 2621470; + var methodInfoExchangeBind = module2.exports.methodInfoExchangeBind = { + id: 2621470, + classId: 40, + methodId: 30, + name: "ExchangeBind", + args: [{ + type: "short", + name: "ticket", + default: 0 + }, { + type: "shortstr", + name: "destination" + }, { + type: "shortstr", + name: "source" + }, { + type: "shortstr", + name: "routingKey", + default: "" + }, { + type: "bit", + name: "nowait", + default: false + }, { + type: "table", + name: "arguments", + default: {} + }] + }; + module2.exports.ExchangeBindOk = 2621471; + var methodInfoExchangeBindOk = module2.exports.methodInfoExchangeBindOk = { + id: 2621471, + classId: 40, + methodId: 31, + name: "ExchangeBindOk", + args: [] + }; + module2.exports.ExchangeUnbind = 2621480; + var methodInfoExchangeUnbind = module2.exports.methodInfoExchangeUnbind = { + id: 2621480, + classId: 40, + methodId: 40, + name: "ExchangeUnbind", + args: [{ + type: "short", + name: "ticket", + default: 0 + }, { + type: "shortstr", + name: "destination" + }, { + type: "shortstr", + name: "source" + }, { + type: "shortstr", + name: "routingKey", + default: "" + }, { + type: "bit", + name: "nowait", + default: false + }, { + type: "table", + name: "arguments", + default: {} + }] + }; + module2.exports.ExchangeUnbindOk = 2621491; + var methodInfoExchangeUnbindOk = module2.exports.methodInfoExchangeUnbindOk = { + id: 2621491, + classId: 40, + methodId: 51, + name: "ExchangeUnbindOk", + args: [] + }; + module2.exports.QueueDeclare = 3276810; + var methodInfoQueueDeclare = module2.exports.methodInfoQueueDeclare = { + id: 3276810, + classId: 50, + methodId: 10, + name: "QueueDeclare", + args: [{ + type: "short", + name: "ticket", + default: 0 + }, { + type: "shortstr", + name: "queue", + default: "" + }, { + type: "bit", + name: "passive", + default: false + }, { + type: "bit", + name: "durable", + default: false + }, { + type: "bit", + name: "exclusive", + default: false + }, { + type: "bit", + name: "autoDelete", + default: false + }, { + type: "bit", + name: "nowait", + default: false + }, { + type: "table", + name: "arguments", + default: {} + }] + }; + module2.exports.QueueDeclareOk = 3276811; + var methodInfoQueueDeclareOk = module2.exports.methodInfoQueueDeclareOk = { + id: 3276811, + classId: 50, + methodId: 11, + name: "QueueDeclareOk", + args: [{ + type: "shortstr", + name: "queue" + }, { + type: "long", + name: "messageCount" + }, { + type: "long", + name: "consumerCount" + }] + }; + module2.exports.QueueBind = 3276820; + var methodInfoQueueBind = module2.exports.methodInfoQueueBind = { + id: 3276820, + classId: 50, + methodId: 20, + name: "QueueBind", + args: [{ + type: "short", + name: "ticket", + default: 0 + }, { + type: "shortstr", + name: "queue", + default: "" + }, { + type: "shortstr", + name: "exchange" + }, { + type: "shortstr", + name: "routingKey", + default: "" + }, { + type: "bit", + name: "nowait", + default: false + }, { + type: "table", + name: "arguments", + default: {} + }] + }; + module2.exports.QueueBindOk = 3276821; + var methodInfoQueueBindOk = module2.exports.methodInfoQueueBindOk = { + id: 3276821, + classId: 50, + methodId: 21, + name: "QueueBindOk", + args: [] + }; + module2.exports.QueuePurge = 3276830; + var methodInfoQueuePurge = module2.exports.methodInfoQueuePurge = { + id: 3276830, + classId: 50, + methodId: 30, + name: "QueuePurge", + args: [{ + type: "short", + name: "ticket", + default: 0 + }, { + type: "shortstr", + name: "queue", + default: "" + }, { + type: "bit", + name: "nowait", + default: false + }] + }; + module2.exports.QueuePurgeOk = 3276831; + var methodInfoQueuePurgeOk = module2.exports.methodInfoQueuePurgeOk = { + id: 3276831, + classId: 50, + methodId: 31, + name: "QueuePurgeOk", + args: [{ + type: "long", + name: "messageCount" + }] + }; + module2.exports.QueueDelete = 3276840; + var methodInfoQueueDelete = module2.exports.methodInfoQueueDelete = { + id: 3276840, + classId: 50, + methodId: 40, + name: "QueueDelete", + args: [{ + type: "short", + name: "ticket", + default: 0 + }, { + type: "shortstr", + name: "queue", + default: "" + }, { + type: "bit", + name: "ifUnused", + default: false + }, { + type: "bit", + name: "ifEmpty", + default: false + }, { + type: "bit", + name: "nowait", + default: false + }] + }; + module2.exports.QueueDeleteOk = 3276841; + var methodInfoQueueDeleteOk = module2.exports.methodInfoQueueDeleteOk = { + id: 3276841, + classId: 50, + methodId: 41, + name: "QueueDeleteOk", + args: [{ + type: "long", + name: "messageCount" + }] + }; + module2.exports.QueueUnbind = 3276850; + var methodInfoQueueUnbind = module2.exports.methodInfoQueueUnbind = { + id: 3276850, + classId: 50, + methodId: 50, + name: "QueueUnbind", + args: [{ + type: "short", + name: "ticket", + default: 0 + }, { + type: "shortstr", + name: "queue", + default: "" + }, { + type: "shortstr", + name: "exchange" + }, { + type: "shortstr", + name: "routingKey", + default: "" + }, { + type: "table", + name: "arguments", + default: {} + }] + }; + module2.exports.QueueUnbindOk = 3276851; + var methodInfoQueueUnbindOk = module2.exports.methodInfoQueueUnbindOk = { + id: 3276851, + classId: 50, + methodId: 51, + name: "QueueUnbindOk", + args: [] + }; + module2.exports.BasicQos = 3932170; + var methodInfoBasicQos = module2.exports.methodInfoBasicQos = { + id: 3932170, + classId: 60, + methodId: 10, + name: "BasicQos", + args: [{ + type: "long", + name: "prefetchSize", + default: 0 + }, { + type: "short", + name: "prefetchCount", + default: 0 + }, { + type: "bit", + name: "global", + default: false + }] + }; + module2.exports.BasicQosOk = 3932171; + var methodInfoBasicQosOk = module2.exports.methodInfoBasicQosOk = { + id: 3932171, + classId: 60, + methodId: 11, + name: "BasicQosOk", + args: [] + }; + module2.exports.BasicConsume = 3932180; + var methodInfoBasicConsume = module2.exports.methodInfoBasicConsume = { + id: 3932180, + classId: 60, + methodId: 20, + name: "BasicConsume", + args: [{ + type: "short", + name: "ticket", + default: 0 + }, { + type: "shortstr", + name: "queue", + default: "" + }, { + type: "shortstr", + name: "consumerTag", + default: "" + }, { + type: "bit", + name: "noLocal", + default: false + }, { + type: "bit", + name: "noAck", + default: false + }, { + type: "bit", + name: "exclusive", + default: false + }, { + type: "bit", + name: "nowait", + default: false + }, { + type: "table", + name: "arguments", + default: {} + }] + }; + module2.exports.BasicConsumeOk = 3932181; + var methodInfoBasicConsumeOk = module2.exports.methodInfoBasicConsumeOk = { + id: 3932181, + classId: 60, + methodId: 21, + name: "BasicConsumeOk", + args: [{ + type: "shortstr", + name: "consumerTag" + }] + }; + module2.exports.BasicCancel = 3932190; + var methodInfoBasicCancel = module2.exports.methodInfoBasicCancel = { + id: 3932190, + classId: 60, + methodId: 30, + name: "BasicCancel", + args: [{ + type: "shortstr", + name: "consumerTag" + }, { + type: "bit", + name: "nowait", + default: false + }] + }; + module2.exports.BasicCancelOk = 3932191; + var methodInfoBasicCancelOk = module2.exports.methodInfoBasicCancelOk = { + id: 3932191, + classId: 60, + methodId: 31, + name: "BasicCancelOk", + args: [{ + type: "shortstr", + name: "consumerTag" + }] + }; + module2.exports.BasicPublish = 3932200; + var methodInfoBasicPublish = module2.exports.methodInfoBasicPublish = { + id: 3932200, + classId: 60, + methodId: 40, + name: "BasicPublish", + args: [{ + type: "short", + name: "ticket", + default: 0 + }, { + type: "shortstr", + name: "exchange", + default: "" + }, { + type: "shortstr", + name: "routingKey", + default: "" + }, { + type: "bit", + name: "mandatory", + default: false + }, { + type: "bit", + name: "immediate", + default: false + }] + }; + module2.exports.BasicReturn = 3932210; + var methodInfoBasicReturn = module2.exports.methodInfoBasicReturn = { + id: 3932210, + classId: 60, + methodId: 50, + name: "BasicReturn", + args: [{ + type: "short", + name: "replyCode" + }, { + type: "shortstr", + name: "replyText", + default: "" + }, { + type: "shortstr", + name: "exchange" + }, { + type: "shortstr", + name: "routingKey" + }] + }; + module2.exports.BasicDeliver = 3932220; + var methodInfoBasicDeliver = module2.exports.methodInfoBasicDeliver = { + id: 3932220, + classId: 60, + methodId: 60, + name: "BasicDeliver", + args: [{ + type: "shortstr", + name: "consumerTag" + }, { + type: "longlong", + name: "deliveryTag" + }, { + type: "bit", + name: "redelivered", + default: false + }, { + type: "shortstr", + name: "exchange" + }, { + type: "shortstr", + name: "routingKey" + }] + }; + module2.exports.BasicGet = 3932230; + var methodInfoBasicGet = module2.exports.methodInfoBasicGet = { + id: 3932230, + classId: 60, + methodId: 70, + name: "BasicGet", + args: [{ + type: "short", + name: "ticket", + default: 0 + }, { + type: "shortstr", + name: "queue", + default: "" + }, { + type: "bit", + name: "noAck", + default: false + }] + }; + module2.exports.BasicGetOk = 3932231; + var methodInfoBasicGetOk = module2.exports.methodInfoBasicGetOk = { + id: 3932231, + classId: 60, + methodId: 71, + name: "BasicGetOk", + args: [{ + type: "longlong", + name: "deliveryTag" + }, { + type: "bit", + name: "redelivered", + default: false + }, { + type: "shortstr", + name: "exchange" + }, { + type: "shortstr", + name: "routingKey" + }, { + type: "long", + name: "messageCount" + }] + }; + module2.exports.BasicGetEmpty = 3932232; + var methodInfoBasicGetEmpty = module2.exports.methodInfoBasicGetEmpty = { + id: 3932232, + classId: 60, + methodId: 72, + name: "BasicGetEmpty", + args: [{ + type: "shortstr", + name: "clusterId", + default: "" + }] + }; + module2.exports.BasicAck = 3932240; + var methodInfoBasicAck = module2.exports.methodInfoBasicAck = { + id: 3932240, + classId: 60, + methodId: 80, + name: "BasicAck", + args: [{ + type: "longlong", + name: "deliveryTag", + default: 0 + }, { + type: "bit", + name: "multiple", + default: false + }] + }; + module2.exports.BasicReject = 3932250; + var methodInfoBasicReject = module2.exports.methodInfoBasicReject = { + id: 3932250, + classId: 60, + methodId: 90, + name: "BasicReject", + args: [{ + type: "longlong", + name: "deliveryTag" + }, { + type: "bit", + name: "requeue", + default: true + }] + }; + module2.exports.BasicRecoverAsync = 3932260; + var methodInfoBasicRecoverAsync = module2.exports.methodInfoBasicRecoverAsync = { + id: 3932260, + classId: 60, + methodId: 100, + name: "BasicRecoverAsync", + args: [{ + type: "bit", + name: "requeue", + default: false + }] + }; + module2.exports.BasicRecover = 3932270; + var methodInfoBasicRecover = module2.exports.methodInfoBasicRecover = { + id: 3932270, + classId: 60, + methodId: 110, + name: "BasicRecover", + args: [{ + type: "bit", + name: "requeue", + default: false + }] + }; + module2.exports.BasicRecoverOk = 3932271; + var methodInfoBasicRecoverOk = module2.exports.methodInfoBasicRecoverOk = { + id: 3932271, + classId: 60, + methodId: 111, + name: "BasicRecoverOk", + args: [] + }; + module2.exports.BasicNack = 3932280; + var methodInfoBasicNack = module2.exports.methodInfoBasicNack = { + id: 3932280, + classId: 60, + methodId: 120, + name: "BasicNack", + args: [{ + type: "longlong", + name: "deliveryTag", + default: 0 + }, { + type: "bit", + name: "multiple", + default: false + }, { + type: "bit", + name: "requeue", + default: true + }] + }; + module2.exports.TxSelect = 5898250; + var methodInfoTxSelect = module2.exports.methodInfoTxSelect = { + id: 5898250, + classId: 90, + methodId: 10, + name: "TxSelect", + args: [] + }; + module2.exports.TxSelectOk = 5898251; + var methodInfoTxSelectOk = module2.exports.methodInfoTxSelectOk = { + id: 5898251, + classId: 90, + methodId: 11, + name: "TxSelectOk", + args: [] + }; + module2.exports.TxCommit = 5898260; + var methodInfoTxCommit = module2.exports.methodInfoTxCommit = { + id: 5898260, + classId: 90, + methodId: 20, + name: "TxCommit", + args: [] + }; + module2.exports.TxCommitOk = 5898261; + var methodInfoTxCommitOk = module2.exports.methodInfoTxCommitOk = { + id: 5898261, + classId: 90, + methodId: 21, + name: "TxCommitOk", + args: [] + }; + module2.exports.TxRollback = 5898270; + var methodInfoTxRollback = module2.exports.methodInfoTxRollback = { + id: 5898270, + classId: 90, + methodId: 30, + name: "TxRollback", + args: [] + }; + module2.exports.TxRollbackOk = 5898271; + var methodInfoTxRollbackOk = module2.exports.methodInfoTxRollbackOk = { + id: 5898271, + classId: 90, + methodId: 31, + name: "TxRollbackOk", + args: [] + }; + module2.exports.ConfirmSelect = 5570570; + var methodInfoConfirmSelect = module2.exports.methodInfoConfirmSelect = { + id: 5570570, + classId: 85, + methodId: 10, + name: "ConfirmSelect", + args: [{ + type: "bit", + name: "nowait", + default: false + }] + }; + module2.exports.ConfirmSelectOk = 5570571; + var methodInfoConfirmSelectOk = module2.exports.methodInfoConfirmSelectOk = { + id: 5570571, + classId: 85, + methodId: 11, + name: "ConfirmSelectOk", + args: [] + }; + module2.exports.BasicProperties = 60; + var propertiesInfoBasicProperties = module2.exports.propertiesInfoBasicProperties = { + id: 60, + name: "BasicProperties", + args: [{ + type: "shortstr", + name: "contentType" + }, { + type: "shortstr", + name: "contentEncoding" + }, { + type: "table", + name: "headers" + }, { + type: "octet", + name: "deliveryMode" + }, { + type: "octet", + name: "priority" + }, { + type: "shortstr", + name: "correlationId" + }, { + type: "shortstr", + name: "replyTo" + }, { + type: "shortstr", + name: "expiration" + }, { + type: "shortstr", + name: "messageId" + }, { + type: "timestamp", + name: "timestamp" + }, { + type: "shortstr", + name: "type" + }, { + type: "shortstr", + name: "userId" + }, { + type: "shortstr", + name: "appId" + }, { + type: "shortstr", + name: "clusterId" + }] + }; + } +}); + +// node_modules/@acuminous/bitsyntax/lib/pattern.js +var require_pattern = __commonJS({ + "node_modules/@acuminous/bitsyntax/lib/pattern.js"(exports2, module2) { + "use strict"; + function set(values) { + var s = {}; + for (var i in values) { + if (!Object.prototype.hasOwnProperty.call(values, i)) + continue; + s[values[i]] = 1; + } + return s; + } + function variable(name, size, specifiers0) { + var specifiers = set(specifiers0); + var segment = { name }; + segment.type = type_in(specifiers); + specs(segment, segment.type, specifiers); + segment.size = size_of(segment, segment.type, size, segment.unit); + return segment; + } + module2.exports.variable = variable; + module2.exports.rest = function() { + return variable("_", true, ["binary"]); + }; + function value(val, size, specifiers0) { + var specifiers = set(specifiers0); + var segment = { value: val }; + segment.type = type_in(specifiers); + specs(segment, segment.type, specifiers); + segment.size = size_of(segment, segment.type, size, segment.unit); + return segment; + } + module2.exports.value = value; + function string(val) { + return { value: val, type: "string" }; + } + module2.exports.string = string; + var TYPES = { "integer": 1, "binary": 1, "float": 1 }; + function type_in(specifiers) { + for (var t in specifiers) { + if (!Object.prototype.hasOwnProperty.call(specifiers, t)) + continue; + if (TYPES[t]) { + return t; + } + } + return "integer"; + } + function specs(segment, type, specifiers) { + switch (type) { + case "integer": + segment.signed = signed_in(specifiers); + case "float": + segment.bigendian = endian_in(specifiers); + default: + segment.unit = unit_in(specifiers, segment.type); + } + return segment; + } + function endian_in(specifiers) { + return !specifiers["little"]; + } + function signed_in(specifiers) { + return specifiers["signed"]; + } + function unit_in(specifiers, type) { + for (var s in specifiers) { + if (!Object.prototype.hasOwnProperty.call(specifiers, s)) + continue; + if (s.substr(0, 5) == "unit:") { + var unit = parseInt(s.substr(5)); + return unit; + } + } + switch (type) { + case "binary": + return 8; + case "integer": + case "float": + return 1; + } + } + function size_of(segment, type, size, unit) { + if (size !== void 0 && size !== "") { + return size; + } else { + switch (type) { + case "integer": + return 8; + case "float": + return 64; + case "binary": + return true; + } + } + } + } +}); + +// node_modules/@acuminous/bitsyntax/lib/parser.js +var require_parser = __commonJS({ + "node_modules/@acuminous/bitsyntax/lib/parser.js"(exports2, module2) { + module2.exports = function() { + function quote(s) { + return '"' + s.replace(/\\/g, "\\\\").replace(/"/g, '\\"').replace(/\x08/g, "\\b").replace(/\t/g, "\\t").replace(/\n/g, "\\n").replace(/\f/g, "\\f").replace(/\r/g, "\\r").replace(/[\x00-\x07\x0B\x0E-\x1F\x80-\uFFFF]/g, escape) + '"'; + } + var result = { + /* + * Parses the input with a generated parser. If the parsing is successfull, + * returns a value explicitly or implicitly specified by the grammar from + * which the parser was generated (see |PEG.buildParser|). If the parsing is + * unsuccessful, throws |PEG.parser.SyntaxError| describing the error. + */ + parse: function(input, startRule) { + var parseFunctions = { + "start": parse_start, + "segmentTail": parse_segmentTail, + "segment": parse_segment, + "string": parse_string, + "chars": parse_chars, + "char": parse_char, + "hexDigit": parse_hexDigit, + "identifier": parse_identifier, + "number": parse_number, + "size": parse_size, + "specifierList": parse_specifierList, + "specifierTail": parse_specifierTail, + "specifier": parse_specifier, + "unit": parse_unit, + "ws": parse_ws + }; + if (startRule !== void 0) { + if (parseFunctions[startRule] === void 0) { + throw new Error("Invalid rule name: " + quote(startRule) + "."); + } + } else { + startRule = "start"; + } + var pos = 0; + var reportFailures = 0; + var rightmostFailuresPos = 0; + var rightmostFailuresExpected = []; + function padLeft(input2, padding, length) { + var result3 = input2; + var padLength = length - input2.length; + for (var i = 0; i < padLength; i++) { + result3 = padding + result3; + } + return result3; + } + function escape2(ch) { + var charCode = ch.charCodeAt(0); + var escapeChar; + var length; + if (charCode <= 255) { + escapeChar = "x"; + length = 2; + } else { + escapeChar = "u"; + length = 4; + } + return "\\" + escapeChar + padLeft(charCode.toString(16).toUpperCase(), "0", length); + } + function matchFailed(failure) { + if (pos < rightmostFailuresPos) { + return; + } + if (pos > rightmostFailuresPos) { + rightmostFailuresPos = pos; + rightmostFailuresExpected = []; + } + rightmostFailuresExpected.push(failure); + } + function parse_start() { + var result0, result1, result22, result3; + var pos0, pos1; + pos0 = pos; + pos1 = pos; + result0 = parse_ws(); + if (result0 !== null) { + result1 = parse_segment(); + if (result1 !== null) { + result22 = []; + result3 = parse_segmentTail(); + while (result3 !== null) { + result22.push(result3); + result3 = parse_segmentTail(); + } + if (result22 !== null) { + result0 = [result0, result1, result22]; + } else { + result0 = null; + pos = pos1; + } + } else { + result0 = null; + pos = pos1; + } + } else { + result0 = null; + pos = pos1; + } + if (result0 !== null) { + result0 = function(offset2, head, tail) { + tail.unshift(head); + return tail; + }(pos0, result0[1], result0[2]); + } + if (result0 === null) { + pos = pos0; + } + return result0; + } + function parse_segmentTail() { + var result0, result1, result22, result3; + var pos0, pos1; + pos0 = pos; + pos1 = pos; + result0 = parse_ws(); + if (result0 !== null) { + if (input.charCodeAt(pos) === 44) { + result1 = ","; + pos++; + } else { + result1 = null; + if (reportFailures === 0) { + matchFailed('","'); + } + } + if (result1 !== null) { + result22 = parse_ws(); + if (result22 !== null) { + result3 = parse_segment(); + if (result3 !== null) { + result0 = [result0, result1, result22, result3]; + } else { + result0 = null; + pos = pos1; + } + } else { + result0 = null; + pos = pos1; + } + } else { + result0 = null; + pos = pos1; + } + } else { + result0 = null; + pos = pos1; + } + if (result0 !== null) { + result0 = function(offset2, seg) { + return seg; + }(pos0, result0[3]); + } + if (result0 === null) { + pos = pos0; + } + return result0; + } + function parse_segment() { + var result0, result1, result22; + var pos0, pos1; + pos0 = pos; + result0 = parse_string(); + if (result0 !== null) { + result0 = function(offset2, str) { + return { string: str }; + }(pos0, result0); + } + if (result0 === null) { + pos = pos0; + } + if (result0 === null) { + pos0 = pos; + pos1 = pos; + result0 = parse_identifier(); + if (result0 !== null) { + result1 = parse_size(); + result1 = result1 !== null ? result1 : ""; + if (result1 !== null) { + result22 = parse_specifierList(); + result22 = result22 !== null ? result22 : ""; + if (result22 !== null) { + result0 = [result0, result1, result22]; + } else { + result0 = null; + pos = pos1; + } + } else { + result0 = null; + pos = pos1; + } + } else { + result0 = null; + pos = pos1; + } + if (result0 !== null) { + result0 = function(offset2, v, size, specs) { + return { name: v, size, specifiers: specs }; + }(pos0, result0[0], result0[1], result0[2]); + } + if (result0 === null) { + pos = pos0; + } + if (result0 === null) { + pos0 = pos; + pos1 = pos; + result0 = parse_number(); + if (result0 !== null) { + result1 = parse_size(); + result1 = result1 !== null ? result1 : ""; + if (result1 !== null) { + result22 = parse_specifierList(); + result22 = result22 !== null ? result22 : ""; + if (result22 !== null) { + result0 = [result0, result1, result22]; + } else { + result0 = null; + pos = pos1; + } + } else { + result0 = null; + pos = pos1; + } + } else { + result0 = null; + pos = pos1; + } + if (result0 !== null) { + result0 = function(offset2, v, size, specs) { + return { value: v, size, specifiers: specs }; + }(pos0, result0[0], result0[1], result0[2]); + } + if (result0 === null) { + pos = pos0; + } + } + } + return result0; + } + function parse_string() { + var result0, result1, result22; + var pos0, pos1; + pos0 = pos; + pos1 = pos; + if (input.charCodeAt(pos) === 34) { + result0 = '"'; + pos++; + } else { + result0 = null; + if (reportFailures === 0) { + matchFailed('"\\""'); + } + } + if (result0 !== null) { + if (input.charCodeAt(pos) === 34) { + result1 = '"'; + pos++; + } else { + result1 = null; + if (reportFailures === 0) { + matchFailed('"\\""'); + } + } + if (result1 !== null) { + result0 = [result0, result1]; + } else { + result0 = null; + pos = pos1; + } + } else { + result0 = null; + pos = pos1; + } + if (result0 !== null) { + result0 = function(offset2) { + return ""; + }(pos0); + } + if (result0 === null) { + pos = pos0; + } + if (result0 === null) { + pos0 = pos; + pos1 = pos; + if (input.charCodeAt(pos) === 34) { + result0 = '"'; + pos++; + } else { + result0 = null; + if (reportFailures === 0) { + matchFailed('"\\""'); + } + } + if (result0 !== null) { + result1 = parse_chars(); + if (result1 !== null) { + if (input.charCodeAt(pos) === 34) { + result22 = '"'; + pos++; + } else { + result22 = null; + if (reportFailures === 0) { + matchFailed('"\\""'); + } + } + if (result22 !== null) { + result0 = [result0, result1, result22]; + } else { + result0 = null; + pos = pos1; + } + } else { + result0 = null; + pos = pos1; + } + } else { + result0 = null; + pos = pos1; + } + if (result0 !== null) { + result0 = function(offset2, chars) { + return chars; + }(pos0, result0[1]); + } + if (result0 === null) { + pos = pos0; + } + } + return result0; + } + function parse_chars() { + var result0, result1; + var pos0; + pos0 = pos; + result1 = parse_char(); + if (result1 !== null) { + result0 = []; + while (result1 !== null) { + result0.push(result1); + result1 = parse_char(); + } + } else { + result0 = null; + } + if (result0 !== null) { + result0 = function(offset2, chars) { + return chars.join(""); + }(pos0, result0); + } + if (result0 === null) { + pos = pos0; + } + return result0; + } + function parse_char() { + var result0, result1, result22, result3, result4; + var pos0, pos1; + if (/^[^"\\\0-\x1F]/.test(input.charAt(pos))) { + result0 = input.charAt(pos); + pos++; + } else { + result0 = null; + if (reportFailures === 0) { + matchFailed('[^"\\\\\\0-\\x1F\x7F]'); + } + } + if (result0 === null) { + pos0 = pos; + if (input.substr(pos, 2) === '\\"') { + result0 = '\\"'; + pos += 2; + } else { + result0 = null; + if (reportFailures === 0) { + matchFailed('"\\\\\\""'); + } + } + if (result0 !== null) { + result0 = function(offset2) { + return '"'; + }(pos0); + } + if (result0 === null) { + pos = pos0; + } + if (result0 === null) { + pos0 = pos; + if (input.substr(pos, 2) === "\\\\") { + result0 = "\\\\"; + pos += 2; + } else { + result0 = null; + if (reportFailures === 0) { + matchFailed('"\\\\\\\\"'); + } + } + if (result0 !== null) { + result0 = function(offset2) { + return "\\"; + }(pos0); + } + if (result0 === null) { + pos = pos0; + } + if (result0 === null) { + pos0 = pos; + if (input.substr(pos, 2) === "\\/") { + result0 = "\\/"; + pos += 2; + } else { + result0 = null; + if (reportFailures === 0) { + matchFailed('"\\\\/"'); + } + } + if (result0 !== null) { + result0 = function(offset2) { + return "/"; + }(pos0); + } + if (result0 === null) { + pos = pos0; + } + if (result0 === null) { + pos0 = pos; + if (input.substr(pos, 2) === "\\b") { + result0 = "\\b"; + pos += 2; + } else { + result0 = null; + if (reportFailures === 0) { + matchFailed('"\\\\b"'); + } + } + if (result0 !== null) { + result0 = function(offset2) { + return "\b"; + }(pos0); + } + if (result0 === null) { + pos = pos0; + } + if (result0 === null) { + pos0 = pos; + if (input.substr(pos, 2) === "\\f") { + result0 = "\\f"; + pos += 2; + } else { + result0 = null; + if (reportFailures === 0) { + matchFailed('"\\\\f"'); + } + } + if (result0 !== null) { + result0 = function(offset2) { + return "\f"; + }(pos0); + } + if (result0 === null) { + pos = pos0; + } + if (result0 === null) { + pos0 = pos; + if (input.substr(pos, 2) === "\\n") { + result0 = "\\n"; + pos += 2; + } else { + result0 = null; + if (reportFailures === 0) { + matchFailed('"\\\\n"'); + } + } + if (result0 !== null) { + result0 = function(offset2) { + return "\n"; + }(pos0); + } + if (result0 === null) { + pos = pos0; + } + if (result0 === null) { + pos0 = pos; + if (input.substr(pos, 2) === "\\r") { + result0 = "\\r"; + pos += 2; + } else { + result0 = null; + if (reportFailures === 0) { + matchFailed('"\\\\r"'); + } + } + if (result0 !== null) { + result0 = function(offset2) { + return "\r"; + }(pos0); + } + if (result0 === null) { + pos = pos0; + } + if (result0 === null) { + pos0 = pos; + if (input.substr(pos, 2) === "\\t") { + result0 = "\\t"; + pos += 2; + } else { + result0 = null; + if (reportFailures === 0) { + matchFailed('"\\\\t"'); + } + } + if (result0 !== null) { + result0 = function(offset2) { + return " "; + }(pos0); + } + if (result0 === null) { + pos = pos0; + } + if (result0 === null) { + pos0 = pos; + pos1 = pos; + if (input.substr(pos, 2) === "\\u") { + result0 = "\\u"; + pos += 2; + } else { + result0 = null; + if (reportFailures === 0) { + matchFailed('"\\\\u"'); + } + } + if (result0 !== null) { + result1 = parse_hexDigit(); + if (result1 !== null) { + result22 = parse_hexDigit(); + if (result22 !== null) { + result3 = parse_hexDigit(); + if (result3 !== null) { + result4 = parse_hexDigit(); + if (result4 !== null) { + result0 = [result0, result1, result22, result3, result4]; + } else { + result0 = null; + pos = pos1; + } + } else { + result0 = null; + pos = pos1; + } + } else { + result0 = null; + pos = pos1; + } + } else { + result0 = null; + pos = pos1; + } + } else { + result0 = null; + pos = pos1; + } + if (result0 !== null) { + result0 = function(offset2, h1, h2, h3, h4) { + return String.fromCharCode(parseInt("0x" + h1 + h2 + h3 + h4)); + }(pos0, result0[1], result0[2], result0[3], result0[4]); + } + if (result0 === null) { + pos = pos0; + } + } + } + } + } + } + } + } + } + } + return result0; + } + function parse_hexDigit() { + var result0; + if (/^[0-9a-fA-F]/.test(input.charAt(pos))) { + result0 = input.charAt(pos); + pos++; + } else { + result0 = null; + if (reportFailures === 0) { + matchFailed("[0-9a-fA-F]"); + } + } + return result0; + } + function parse_identifier() { + var result0, result1, result22; + var pos0, pos1; + pos0 = pos; + pos1 = pos; + if (/^[_a-zA-Z]/.test(input.charAt(pos))) { + result0 = input.charAt(pos); + pos++; + } else { + result0 = null; + if (reportFailures === 0) { + matchFailed("[_a-zA-Z]"); + } + } + if (result0 !== null) { + result1 = []; + if (/^[_a-zA-Z0-9]/.test(input.charAt(pos))) { + result22 = input.charAt(pos); + pos++; + } else { + result22 = null; + if (reportFailures === 0) { + matchFailed("[_a-zA-Z0-9]"); + } + } + while (result22 !== null) { + result1.push(result22); + if (/^[_a-zA-Z0-9]/.test(input.charAt(pos))) { + result22 = input.charAt(pos); + pos++; + } else { + result22 = null; + if (reportFailures === 0) { + matchFailed("[_a-zA-Z0-9]"); + } + } + } + if (result1 !== null) { + result0 = [result0, result1]; + } else { + result0 = null; + pos = pos1; + } + } else { + result0 = null; + pos = pos1; + } + if (result0 !== null) { + result0 = function(offset2, head, tail) { + return head + tail.join(""); + }(pos0, result0[0], result0[1]); + } + if (result0 === null) { + pos = pos0; + } + return result0; + } + function parse_number() { + var result0, result1, result22; + var pos0, pos1; + pos0 = pos; + if (input.charCodeAt(pos) === 48) { + result0 = "0"; + pos++; + } else { + result0 = null; + if (reportFailures === 0) { + matchFailed('"0"'); + } + } + if (result0 !== null) { + result0 = function(offset2) { + return 0; + }(pos0); + } + if (result0 === null) { + pos = pos0; + } + if (result0 === null) { + pos0 = pos; + pos1 = pos; + if (/^[1-9]/.test(input.charAt(pos))) { + result0 = input.charAt(pos); + pos++; + } else { + result0 = null; + if (reportFailures === 0) { + matchFailed("[1-9]"); + } + } + if (result0 !== null) { + result1 = []; + if (/^[0-9]/.test(input.charAt(pos))) { + result22 = input.charAt(pos); + pos++; + } else { + result22 = null; + if (reportFailures === 0) { + matchFailed("[0-9]"); + } + } + while (result22 !== null) { + result1.push(result22); + if (/^[0-9]/.test(input.charAt(pos))) { + result22 = input.charAt(pos); + pos++; + } else { + result22 = null; + if (reportFailures === 0) { + matchFailed("[0-9]"); + } + } + } + if (result1 !== null) { + result0 = [result0, result1]; + } else { + result0 = null; + pos = pos1; + } + } else { + result0 = null; + pos = pos1; + } + if (result0 !== null) { + result0 = function(offset2, head, tail) { + return parseInt(head + tail.join("")); + }(pos0, result0[0], result0[1]); + } + if (result0 === null) { + pos = pos0; + } + } + return result0; + } + function parse_size() { + var result0, result1; + var pos0, pos1; + pos0 = pos; + pos1 = pos; + if (input.charCodeAt(pos) === 58) { + result0 = ":"; + pos++; + } else { + result0 = null; + if (reportFailures === 0) { + matchFailed('":"'); + } + } + if (result0 !== null) { + result1 = parse_number(); + if (result1 !== null) { + result0 = [result0, result1]; + } else { + result0 = null; + pos = pos1; + } + } else { + result0 = null; + pos = pos1; + } + if (result0 !== null) { + result0 = function(offset2, num) { + return num; + }(pos0, result0[1]); + } + if (result0 === null) { + pos = pos0; + } + if (result0 === null) { + pos0 = pos; + pos1 = pos; + if (input.charCodeAt(pos) === 58) { + result0 = ":"; + pos++; + } else { + result0 = null; + if (reportFailures === 0) { + matchFailed('":"'); + } + } + if (result0 !== null) { + result1 = parse_identifier(); + if (result1 !== null) { + result0 = [result0, result1]; + } else { + result0 = null; + pos = pos1; + } + } else { + result0 = null; + pos = pos1; + } + if (result0 !== null) { + result0 = function(offset2, id) { + return id; + }(pos0, result0[1]); + } + if (result0 === null) { + pos = pos0; + } + } + return result0; + } + function parse_specifierList() { + var result0, result1, result22, result3; + var pos0, pos1; + pos0 = pos; + pos1 = pos; + if (input.charCodeAt(pos) === 47) { + result0 = "/"; + pos++; + } else { + result0 = null; + if (reportFailures === 0) { + matchFailed('"/"'); + } + } + if (result0 !== null) { + result1 = parse_specifier(); + if (result1 !== null) { + result22 = []; + result3 = parse_specifierTail(); + while (result3 !== null) { + result22.push(result3); + result3 = parse_specifierTail(); + } + if (result22 !== null) { + result0 = [result0, result1, result22]; + } else { + result0 = null; + pos = pos1; + } + } else { + result0 = null; + pos = pos1; + } + } else { + result0 = null; + pos = pos1; + } + if (result0 !== null) { + result0 = function(offset2, head, tail) { + tail.unshift(head); + return tail; + }(pos0, result0[1], result0[2]); + } + if (result0 === null) { + pos = pos0; + } + return result0; + } + function parse_specifierTail() { + var result0, result1; + var pos0, pos1; + pos0 = pos; + pos1 = pos; + if (input.charCodeAt(pos) === 45) { + result0 = "-"; + pos++; + } else { + result0 = null; + if (reportFailures === 0) { + matchFailed('"-"'); + } + } + if (result0 !== null) { + result1 = parse_specifier(); + if (result1 !== null) { + result0 = [result0, result1]; + } else { + result0 = null; + pos = pos1; + } + } else { + result0 = null; + pos = pos1; + } + if (result0 !== null) { + result0 = function(offset2, spec) { + return spec; + }(pos0, result0[1]); + } + if (result0 === null) { + pos = pos0; + } + return result0; + } + function parse_specifier() { + var result0; + if (input.substr(pos, 6) === "little") { + result0 = "little"; + pos += 6; + } else { + result0 = null; + if (reportFailures === 0) { + matchFailed('"little"'); + } + } + if (result0 === null) { + if (input.substr(pos, 3) === "big") { + result0 = "big"; + pos += 3; + } else { + result0 = null; + if (reportFailures === 0) { + matchFailed('"big"'); + } + } + if (result0 === null) { + if (input.substr(pos, 6) === "signed") { + result0 = "signed"; + pos += 6; + } else { + result0 = null; + if (reportFailures === 0) { + matchFailed('"signed"'); + } + } + if (result0 === null) { + if (input.substr(pos, 8) === "unsigned") { + result0 = "unsigned"; + pos += 8; + } else { + result0 = null; + if (reportFailures === 0) { + matchFailed('"unsigned"'); + } + } + if (result0 === null) { + if (input.substr(pos, 7) === "integer") { + result0 = "integer"; + pos += 7; + } else { + result0 = null; + if (reportFailures === 0) { + matchFailed('"integer"'); + } + } + if (result0 === null) { + if (input.substr(pos, 6) === "binary") { + result0 = "binary"; + pos += 6; + } else { + result0 = null; + if (reportFailures === 0) { + matchFailed('"binary"'); + } + } + if (result0 === null) { + if (input.substr(pos, 5) === "float") { + result0 = "float"; + pos += 5; + } else { + result0 = null; + if (reportFailures === 0) { + matchFailed('"float"'); + } + } + if (result0 === null) { + result0 = parse_unit(); + } + } + } + } + } + } + } + return result0; + } + function parse_unit() { + var result0, result1; + var pos0, pos1; + pos0 = pos; + pos1 = pos; + if (input.substr(pos, 5) === "unit:") { + result0 = "unit:"; + pos += 5; + } else { + result0 = null; + if (reportFailures === 0) { + matchFailed('"unit:"'); + } + } + if (result0 !== null) { + result1 = parse_number(); + if (result1 !== null) { + result0 = [result0, result1]; + } else { + result0 = null; + pos = pos1; + } + } else { + result0 = null; + pos = pos1; + } + if (result0 !== null) { + result0 = function(offset2, num) { + return "unit:" + num; + }(pos0, result0[1]); + } + if (result0 === null) { + pos = pos0; + } + return result0; + } + function parse_ws() { + var result0, result1; + result0 = []; + if (/^[ \t\n]/.test(input.charAt(pos))) { + result1 = input.charAt(pos); + pos++; + } else { + result1 = null; + if (reportFailures === 0) { + matchFailed("[ \\t\\n]"); + } + } + while (result1 !== null) { + result0.push(result1); + if (/^[ \t\n]/.test(input.charAt(pos))) { + result1 = input.charAt(pos); + pos++; + } else { + result1 = null; + if (reportFailures === 0) { + matchFailed("[ \\t\\n]"); + } + } + } + return result0; + } + function cleanupExpected(expected) { + expected.sort(); + var lastExpected = null; + var cleanExpected = []; + for (var i = 0; i < expected.length; i++) { + if (expected[i] !== lastExpected) { + cleanExpected.push(expected[i]); + lastExpected = expected[i]; + } + } + return cleanExpected; + } + function computeErrorPosition() { + var line = 1; + var column = 1; + var seenCR = false; + for (var i = 0; i < Math.max(pos, rightmostFailuresPos); i++) { + var ch = input.charAt(i); + if (ch === "\n") { + if (!seenCR) { + line++; + } + column = 1; + seenCR = false; + } else if (ch === "\r" || ch === "\u2028" || ch === "\u2029") { + line++; + column = 1; + seenCR = true; + } else { + column++; + seenCR = false; + } + } + return { line, column }; + } + var result2 = parseFunctions[startRule](); + if (result2 === null || pos !== input.length) { + var offset = Math.max(pos, rightmostFailuresPos); + var found = offset < input.length ? input.charAt(offset) : null; + var errorPosition = computeErrorPosition(); + throw new this.SyntaxError( + cleanupExpected(rightmostFailuresExpected), + found, + offset, + errorPosition.line, + errorPosition.column + ); + } + return result2; + }, + /* Returns the parser source code. */ + toSource: function() { + return this._source; + } + }; + result.SyntaxError = function(expected, found, offset, line, column) { + function buildMessage(expected2, found2) { + var expectedHumanized, foundHumanized; + switch (expected2.length) { + case 0: + expectedHumanized = "end of input"; + break; + case 1: + expectedHumanized = expected2[0]; + break; + default: + expectedHumanized = expected2.slice(0, expected2.length - 1).join(", ") + " or " + expected2[expected2.length - 1]; + } + foundHumanized = found2 ? quote(found2) : "end of input"; + return "Expected " + expectedHumanized + " but " + foundHumanized + " found."; + } + this.name = "SyntaxError"; + this.expected = expected; + this.found = found; + this.message = buildMessage(expected, found); + this.offset = offset; + this.line = line; + this.column = column; + }; + result.SyntaxError.prototype = Error.prototype; + return result; + }(); + } +}); + +// node_modules/@acuminous/bitsyntax/lib/parse.js +var require_parse2 = __commonJS({ + "node_modules/@acuminous/bitsyntax/lib/parse.js"(exports2, module2) { + "use strict"; + var ast = require_pattern(); + var parser = require_parser(); + function parse_pattern(string) { + var segments = parser.parse(string); + for (var i = 0, len = segments.length; i < len; i++) { + var s = segments[i]; + if (s.string != void 0) { + segments[i] = ast.string(s.string); + } else if (s.value != void 0) { + segments[i] = ast.value(s.value, s.size, s.specifiers); + } else if (s.name != void 0) { + segments[i] = ast.variable(s.name, s.size, s.specifiers); + } else { + throw "Unknown segment " + s; + } + } + return segments; + } + module2.exports.parse = function() { + var str = [].join.call(arguments, ","); + return parse_pattern(str); + }; + } +}); + +// node_modules/ms/index.js +var require_ms = __commonJS({ + "node_modules/ms/index.js"(exports2, module2) { + var s = 1e3; + var m2 = s * 60; + var h2 = m2 * 60; + var d = h2 * 24; + var w2 = d * 7; + var y = d * 365.25; + module2.exports = function(val, options2) { + options2 = options2 || {}; + var type = typeof val; + if (type === "string" && val.length > 0) { + return parse(val); + } else if (type === "number" && isFinite(val)) { + return options2.long ? fmtLong(val) : fmtShort(val); + } + throw new Error( + "val is not a non-empty string or a valid number. val=" + JSON.stringify(val) + ); + }; + function parse(str) { + str = String(str); + if (str.length > 100) { + return; + } + var match = /^(-?(?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec( + str + ); + if (!match) { + return; + } + var n = parseFloat(match[1]); + var type = (match[2] || "ms").toLowerCase(); + switch (type) { + case "years": + case "year": + case "yrs": + case "yr": + case "y": + return n * y; + case "weeks": + case "week": + case "w": + return n * w2; + case "days": + case "day": + case "d": + return n * d; + case "hours": + case "hour": + case "hrs": + case "hr": + case "h": + return n * h2; + case "minutes": + case "minute": + case "mins": + case "min": + case "m": + return n * m2; + case "seconds": + case "second": + case "secs": + case "sec": + case "s": + return n * s; + case "milliseconds": + case "millisecond": + case "msecs": + case "msec": + case "ms": + return n; + default: + return void 0; + } + } + function fmtShort(ms2) { + var msAbs = Math.abs(ms2); + if (msAbs >= d) { + return Math.round(ms2 / d) + "d"; + } + if (msAbs >= h2) { + return Math.round(ms2 / h2) + "h"; + } + if (msAbs >= m2) { + return Math.round(ms2 / m2) + "m"; + } + if (msAbs >= s) { + return Math.round(ms2 / s) + "s"; + } + return ms2 + "ms"; + } + function fmtLong(ms2) { + var msAbs = Math.abs(ms2); + if (msAbs >= d) { + return plural(ms2, msAbs, d, "day"); + } + if (msAbs >= h2) { + return plural(ms2, msAbs, h2, "hour"); + } + if (msAbs >= m2) { + return plural(ms2, msAbs, m2, "minute"); + } + if (msAbs >= s) { + return plural(ms2, msAbs, s, "second"); + } + return ms2 + " ms"; + } + function plural(ms2, msAbs, n, name) { + var isPlural = msAbs >= n * 1.5; + return Math.round(ms2 / n) + " " + name + (isPlural ? "s" : ""); + } + } +}); + +// node_modules/debug/src/common.js +var require_common2 = __commonJS({ + "node_modules/debug/src/common.js"(exports2, module2) { + function setup(env) { + createDebug.debug = createDebug; + createDebug.default = createDebug; + createDebug.coerce = coerce; + createDebug.disable = disable; + createDebug.enable = enable; + createDebug.enabled = enabled; + createDebug.humanize = require_ms(); + createDebug.destroy = destroy; + Object.keys(env).forEach((key) => { + createDebug[key] = env[key]; + }); + createDebug.names = []; + createDebug.skips = []; + createDebug.formatters = {}; + function selectColor(namespace) { + let hash = 0; + for (let i = 0; i < namespace.length; i++) { + hash = (hash << 5) - hash + namespace.charCodeAt(i); + hash |= 0; + } + return createDebug.colors[Math.abs(hash) % createDebug.colors.length]; + } + createDebug.selectColor = selectColor; + function createDebug(namespace) { + let prevTime; + let enableOverride = null; + let namespacesCache; + let enabledCache; + function debug2(...args) { + if (!debug2.enabled) { + return; + } + const self2 = debug2; + const curr = Number(/* @__PURE__ */ new Date()); + const ms2 = curr - (prevTime || curr); + self2.diff = ms2; + self2.prev = prevTime; + self2.curr = curr; + prevTime = curr; + args[0] = createDebug.coerce(args[0]); + if (typeof args[0] !== "string") { + args.unshift("%O"); + } + let index = 0; + args[0] = args[0].replace(/%([a-zA-Z%])/g, (match, format) => { + if (match === "%%") { + return "%"; + } + index++; + const formatter = createDebug.formatters[format]; + if (typeof formatter === "function") { + const val = args[index]; + match = formatter.call(self2, val); + args.splice(index, 1); + index--; + } + return match; + }); + createDebug.formatArgs.call(self2, args); + const logFn = self2.log || createDebug.log; + logFn.apply(self2, args); + } + debug2.namespace = namespace; + debug2.useColors = createDebug.useColors(); + debug2.color = createDebug.selectColor(namespace); + debug2.extend = extend; + debug2.destroy = createDebug.destroy; + Object.defineProperty(debug2, "enabled", { + enumerable: true, + configurable: false, + get: () => { + if (enableOverride !== null) { + return enableOverride; + } + if (namespacesCache !== createDebug.namespaces) { + namespacesCache = createDebug.namespaces; + enabledCache = createDebug.enabled(namespace); + } + return enabledCache; + }, + set: (v) => { + enableOverride = v; + } + }); + if (typeof createDebug.init === "function") { + createDebug.init(debug2); + } + return debug2; + } + function extend(namespace, delimiter) { + const newDebug = createDebug(this.namespace + (typeof delimiter === "undefined" ? ":" : delimiter) + namespace); + newDebug.log = this.log; + return newDebug; + } + function enable(namespaces) { + createDebug.save(namespaces); + createDebug.namespaces = namespaces; + createDebug.names = []; + createDebug.skips = []; + let i; + const split = (typeof namespaces === "string" ? namespaces : "").split(/[\s,]+/); + const len = split.length; + for (i = 0; i < len; i++) { + if (!split[i]) { + continue; + } + namespaces = split[i].replace(/\*/g, ".*?"); + if (namespaces[0] === "-") { + createDebug.skips.push(new RegExp("^" + namespaces.slice(1) + "$")); + } else { + createDebug.names.push(new RegExp("^" + namespaces + "$")); + } + } + } + function disable() { + const namespaces = [ + ...createDebug.names.map(toNamespace), + ...createDebug.skips.map(toNamespace).map((namespace) => "-" + namespace) + ].join(","); + createDebug.enable(""); + return namespaces; + } + function enabled(name) { + if (name[name.length - 1] === "*") { + return true; + } + let i; + let len; + for (i = 0, len = createDebug.skips.length; i < len; i++) { + if (createDebug.skips[i].test(name)) { + return false; + } + } + for (i = 0, len = createDebug.names.length; i < len; i++) { + if (createDebug.names[i].test(name)) { + return true; + } + } + return false; + } + function toNamespace(regexp) { + return regexp.toString().substring(2, regexp.toString().length - 2).replace(/\.\*\?$/, "*"); + } + function coerce(val) { + if (val instanceof Error) { + return val.stack || val.message; + } + return val; + } + function destroy() { + console.warn("Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`."); + } + createDebug.enable(createDebug.load()); + return createDebug; + } + module2.exports = setup; + } +}); + +// node_modules/debug/src/browser.js +var require_browser = __commonJS({ + "node_modules/debug/src/browser.js"(exports2, module2) { + exports2.formatArgs = formatArgs; + exports2.save = save; + exports2.load = load; + exports2.useColors = useColors; + exports2.storage = localstorage(); + exports2.destroy = (() => { + let warned = false; + return () => { + if (!warned) { + warned = true; + console.warn("Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`."); + } + }; + })(); + exports2.colors = [ + "#0000CC", + "#0000FF", + "#0033CC", + "#0033FF", + "#0066CC", + "#0066FF", + "#0099CC", + "#0099FF", + "#00CC00", + "#00CC33", + "#00CC66", + "#00CC99", + "#00CCCC", + "#00CCFF", + "#3300CC", + "#3300FF", + "#3333CC", + "#3333FF", + "#3366CC", + "#3366FF", + "#3399CC", + "#3399FF", + "#33CC00", + "#33CC33", + "#33CC66", + "#33CC99", + "#33CCCC", + "#33CCFF", + "#6600CC", + "#6600FF", + "#6633CC", + "#6633FF", + "#66CC00", + "#66CC33", + "#9900CC", + "#9900FF", + "#9933CC", + "#9933FF", + "#99CC00", + "#99CC33", + "#CC0000", + "#CC0033", + "#CC0066", + "#CC0099", + "#CC00CC", + "#CC00FF", + "#CC3300", + "#CC3333", + "#CC3366", + "#CC3399", + "#CC33CC", + "#CC33FF", + "#CC6600", + "#CC6633", + "#CC9900", + "#CC9933", + "#CCCC00", + "#CCCC33", + "#FF0000", + "#FF0033", + "#FF0066", + "#FF0099", + "#FF00CC", + "#FF00FF", + "#FF3300", + "#FF3333", + "#FF3366", + "#FF3399", + "#FF33CC", + "#FF33FF", + "#FF6600", + "#FF6633", + "#FF9900", + "#FF9933", + "#FFCC00", + "#FFCC33" + ]; + function useColors() { + if (typeof window !== "undefined" && window.process && (window.process.type === "renderer" || window.process.__nwjs)) { + return true; + } + if (typeof navigator !== "undefined" && navigator.userAgent && navigator.userAgent.toLowerCase().match(/(edge|trident)\/(\d+)/)) { + return false; + } + return typeof document !== "undefined" && document.documentElement && document.documentElement.style && document.documentElement.style.WebkitAppearance || // Is firebug? http://stackoverflow.com/a/398120/376773 + typeof window !== "undefined" && window.console && (window.console.firebug || window.console.exception && window.console.table) || // Is firefox >= v31? + // https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages + typeof navigator !== "undefined" && navigator.userAgent && navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/) && parseInt(RegExp.$1, 10) >= 31 || // Double check webkit in userAgent just in case we are in a worker + typeof navigator !== "undefined" && navigator.userAgent && navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/); + } + function formatArgs(args) { + args[0] = (this.useColors ? "%c" : "") + this.namespace + (this.useColors ? " %c" : " ") + args[0] + (this.useColors ? "%c " : " ") + "+" + module2.exports.humanize(this.diff); + if (!this.useColors) { + return; + } + const c = "color: " + this.color; + args.splice(1, 0, c, "color: inherit"); + let index = 0; + let lastC = 0; + args[0].replace(/%[a-zA-Z%]/g, (match) => { + if (match === "%%") { + return; + } + index++; + if (match === "%c") { + lastC = index; + } + }); + args.splice(lastC, 0, c); + } + exports2.log = console.debug || console.log || (() => { + }); + function save(namespaces) { + try { + if (namespaces) { + exports2.storage.setItem("debug", namespaces); + } else { + exports2.storage.removeItem("debug"); + } + } catch (error2) { + } + } + function load() { + let r; + try { + r = exports2.storage.getItem("debug"); + } catch (error2) { + } + if (!r && typeof process !== "undefined" && "env" in process) { + r = process.env.DEBUG; + } + return r; + } + function localstorage() { + try { + return localStorage; + } catch (error2) { + } + } + module2.exports = require_common2()(exports2); + var { formatters } = module2.exports; + formatters.j = function(v) { + try { + return JSON.stringify(v); + } catch (error2) { + return "[UnexpectedJSONParseError]: " + error2.message; + } + }; + } +}); + +// node_modules/has-flag/index.js +var require_has_flag = __commonJS({ + "node_modules/has-flag/index.js"(exports2, module2) { + "use strict"; + module2.exports = (flag, argv) => { + argv = argv || process.argv; + const prefix = flag.startsWith("-") ? "" : flag.length === 1 ? "-" : "--"; + const pos = argv.indexOf(prefix + flag); + const terminatorPos = argv.indexOf("--"); + return pos !== -1 && (terminatorPos === -1 ? true : pos < terminatorPos); + }; + } +}); + +// node_modules/supports-color/index.js +var require_supports_color = __commonJS({ + "node_modules/supports-color/index.js"(exports2, module2) { + "use strict"; + var os2 = require("os"); + var hasFlag = require_has_flag(); + var env = process.env; + var forceColor; + if (hasFlag("no-color") || hasFlag("no-colors") || hasFlag("color=false")) { + forceColor = false; + } else if (hasFlag("color") || hasFlag("colors") || hasFlag("color=true") || hasFlag("color=always")) { + forceColor = true; + } + if ("FORCE_COLOR" in env) { + forceColor = env.FORCE_COLOR.length === 0 || parseInt(env.FORCE_COLOR, 10) !== 0; + } + function translateLevel(level) { + if (level === 0) { + return false; + } + return { + level, + hasBasic: true, + has256: level >= 2, + has16m: level >= 3 + }; + } + function supportsColor(stream) { + if (forceColor === false) { + return 0; + } + if (hasFlag("color=16m") || hasFlag("color=full") || hasFlag("color=truecolor")) { + return 3; + } + if (hasFlag("color=256")) { + return 2; + } + if (stream && !stream.isTTY && forceColor !== true) { + return 0; + } + const min = forceColor ? 1 : 0; + if (process.platform === "win32") { + const osRelease = os2.release().split("."); + if (Number(process.versions.node.split(".")[0]) >= 8 && Number(osRelease[0]) >= 10 && Number(osRelease[2]) >= 10586) { + return Number(osRelease[2]) >= 14931 ? 3 : 2; + } + return 1; + } + if ("CI" in env) { + if (["TRAVIS", "CIRCLECI", "APPVEYOR", "GITLAB_CI"].some((sign) => sign in env) || env.CI_NAME === "codeship") { + return 1; + } + return min; + } + if ("TEAMCITY_VERSION" in env) { + return /^(9\.(0*[1-9]\d*)\.|\d{2,}\.)/.test(env.TEAMCITY_VERSION) ? 1 : 0; + } + if (env.COLORTERM === "truecolor") { + return 3; + } + if ("TERM_PROGRAM" in env) { + const version = parseInt((env.TERM_PROGRAM_VERSION || "").split(".")[0], 10); + switch (env.TERM_PROGRAM) { + case "iTerm.app": + return version >= 3 ? 3 : 2; + case "Apple_Terminal": + return 2; + } + } + if (/-256(color)?$/i.test(env.TERM)) { + return 2; + } + if (/^screen|^xterm|^vt100|^vt220|^rxvt|color|ansi|cygwin|linux/i.test(env.TERM)) { + return 1; + } + if ("COLORTERM" in env) { + return 1; + } + if (env.TERM === "dumb") { + return min; + } + return min; + } + function getSupportLevel(stream) { + const level = supportsColor(stream); + return translateLevel(level); + } + module2.exports = { + supportsColor: getSupportLevel, + stdout: getSupportLevel(process.stdout), + stderr: getSupportLevel(process.stderr) + }; + } +}); + +// node_modules/debug/src/node.js +var require_node = __commonJS({ + "node_modules/debug/src/node.js"(exports2, module2) { + var tty = require("tty"); + var util = require("util"); + exports2.init = init; + exports2.log = log2; + exports2.formatArgs = formatArgs; + exports2.save = save; + exports2.load = load; + exports2.useColors = useColors; + exports2.destroy = util.deprecate( + () => { + }, + "Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`." + ); + exports2.colors = [6, 2, 3, 4, 5, 1]; + try { + const supportsColor = require_supports_color(); + if (supportsColor && (supportsColor.stderr || supportsColor).level >= 2) { + exports2.colors = [ + 20, + 21, + 26, + 27, + 32, + 33, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 56, + 57, + 62, + 63, + 68, + 69, + 74, + 75, + 76, + 77, + 78, + 79, + 80, + 81, + 92, + 93, + 98, + 99, + 112, + 113, + 128, + 129, + 134, + 135, + 148, + 149, + 160, + 161, + 162, + 163, + 164, + 165, + 166, + 167, + 168, + 169, + 170, + 171, + 172, + 173, + 178, + 179, + 184, + 185, + 196, + 197, + 198, + 199, + 200, + 201, + 202, + 203, + 204, + 205, + 206, + 207, + 208, + 209, + 214, + 215, + 220, + 221 + ]; + } + } catch (error2) { + } + exports2.inspectOpts = Object.keys(process.env).filter((key) => { + return /^debug_/i.test(key); + }).reduce((obj, key) => { + const prop = key.substring(6).toLowerCase().replace(/_([a-z])/g, (_2, k2) => { + return k2.toUpperCase(); + }); + let val = process.env[key]; + if (/^(yes|on|true|enabled)$/i.test(val)) { + val = true; + } else if (/^(no|off|false|disabled)$/i.test(val)) { + val = false; + } else if (val === "null") { + val = null; + } else { + val = Number(val); + } + obj[prop] = val; + return obj; + }, {}); + function useColors() { + return "colors" in exports2.inspectOpts ? Boolean(exports2.inspectOpts.colors) : tty.isatty(process.stderr.fd); + } + function formatArgs(args) { + const { namespace: name, useColors: useColors2 } = this; + if (useColors2) { + const c = this.color; + const colorCode = "\x1B[3" + (c < 8 ? c : "8;5;" + c); + const prefix = ` ${colorCode};1m${name} \x1B[0m`; + args[0] = prefix + args[0].split("\n").join("\n" + prefix); + args.push(colorCode + "m+" + module2.exports.humanize(this.diff) + "\x1B[0m"); + } else { + args[0] = getDate() + name + " " + args[0]; + } + } + function getDate() { + if (exports2.inspectOpts.hideDate) { + return ""; + } + return (/* @__PURE__ */ new Date()).toISOString() + " "; + } + function log2(...args) { + return process.stderr.write(util.format(...args) + "\n"); + } + function save(namespaces) { + if (namespaces) { + process.env.DEBUG = namespaces; + } else { + delete process.env.DEBUG; + } + } + function load() { + return process.env.DEBUG; + } + function init(debug2) { + debug2.inspectOpts = {}; + const keys = Object.keys(exports2.inspectOpts); + for (let i = 0; i < keys.length; i++) { + debug2.inspectOpts[keys[i]] = exports2.inspectOpts[keys[i]]; + } + } + module2.exports = require_common2()(exports2); + var { formatters } = module2.exports; + formatters.o = function(v) { + this.inspectOpts.colors = this.useColors; + return util.inspect(v, this.inspectOpts).split("\n").map((str) => str.trim()).join(" "); + }; + formatters.O = function(v) { + this.inspectOpts.colors = this.useColors; + return util.inspect(v, this.inspectOpts); + }; + } +}); + +// node_modules/debug/src/index.js +var require_src4 = __commonJS({ + "node_modules/debug/src/index.js"(exports2, module2) { + if (typeof process === "undefined" || process.type === "renderer" || process.browser === true || process.__nwjs) { + module2.exports = require_browser(); + } else { + module2.exports = require_node(); + } + } +}); + +// node_modules/@acuminous/bitsyntax/lib/interp.js +var require_interp = __commonJS({ + "node_modules/@acuminous/bitsyntax/lib/interp.js"(exports2, module2) { + "use strict"; + var ints = require_buffer_more_ints(); + var debug2 = require_src4()("bitsyntax-Interpreter"); + function parse_int(bin, off, sizeInBytes, bigendian, signed) { + switch (sizeInBytes) { + case 1: + return signed ? bin.readInt8(off) : bin.readUInt8(off); + case 2: + return bigendian ? signed ? bin.readInt16BE(off) : bin.readUInt16BE(off) : signed ? bin.readInt16LE(off) : bin.readUInt16LE(off); + case 4: + return bigendian ? signed ? bin.readInt32BE(off) : bin.readUInt32BE(off) : signed ? bin.readInt32LE(off) : bin.readUInt32LE(off); + case 8: + return bigendian ? (signed ? ints.readInt64BE : ints.readUInt64BE)(bin, off) : (signed ? ints.readInt64LE : ints.readUInt64LE)(bin, off); + default: + throw "Integers must be 8-, 16-, 32- or 64-bit"; + } + } + function parse_float(bin, off, sizeInBytes, bigendian) { + switch (sizeInBytes) { + case 4: + return bigendian ? bin.readFloatBE(off) : bin.readFloatLE(off); + case 8: + return bigendian ? bin.readDoubleBE(off) : bin.readDoubleLE(off); + default: + throw "Floats must be 32- or 64-bit"; + } + } + function size_of(segment, bound) { + var size = segment.size; + if (typeof size === "string") { + return bound[size]; + } else { + return size; + } + } + function new_scope(env) { + function scope() { + } + ; + scope.prototype = env; + return new scope(); + } + function bindings(scope) { + var s = {}; + for (var k2 in scope) { + if (scope.hasOwnProperty(k2)) { + s[k2] = scope[k2]; + } + } + return s; + } + function match(pattern, binary, boundvars) { + var offset = 0, vars = new_scope(boundvars); + var binsize = binary.length * 8; + function skip_bits(segment2) { + debug2("skip bits"); + debug2(segment2); + var size = size_of(segment2, vars); + if (size === true) { + if (offset % 8 === 0) { + offset = binsize; + return true; + } else { + return false; + } + } + var bits = segment2.unit * size; + if (offset + bits > binsize) { + return false; + } else { + offset += bits; + } + } + function get_integer(segment2) { + debug2("get_integer"); + debug2(segment2); + var unit = segment2.unit, size = size_of(segment2, vars); + var bitsize = size * unit; + var byteoffset = offset / 8; + offset += bitsize; + if (bitsize % 8 > 0 || offset > binsize) { + return false; + } else { + return parse_int( + binary, + byteoffset, + bitsize / 8, + segment2.bigendian, + segment2.signed + ); + } + } + function get_float(segment2) { + debug2("get_float"); + debug2(segment2); + var unit = segment2.unit; + var size = size_of(segment2, vars); + var bitsize = size * unit; + var byteoffset = offset / 8; + offset += bitsize; + if (offset > binsize) { + return false; + } else { + return parse_float( + binary, + byteoffset, + bitsize / 8, + segment2.bigendian + ); + } + } + function get_binary(segment2) { + debug2("get_binary"); + debug2(segment2); + var unit = segment2.unit, size = size_of(segment2, vars); + var byteoffset = offset / 8; + if (size === true) { + offset = binsize; + return binary.slice(byteoffset); + } else { + var bitsize = size * unit; + if (bitsize % 8 > 0 || offset + bitsize > binsize) { + return false; + } else { + offset += bitsize; + return binary.slice(byteoffset, byteoffset + bitsize / 8); + } + } + } + function get_string(segment2) { + debug2("get_string"); + debug2(segment2); + var len = segment2.value.length; + var byteoffset = offset / 8; + offset += len * 8; + if (offset > binsize) { + return false; + } + return binary.slice(byteoffset, byteoffset + len).toString("utf8"); + } + var patternlen = pattern.length; + for (var i = 0; i < patternlen; i++) { + var segment = pattern[i]; + var result = false; + if (segment.name === "_") { + result = skip_bits(segment); + } else { + switch (segment.type) { + case "string": + result = get_string(segment); + break; + case "integer": + result = get_integer(segment); + break; + case "float": + result = get_float(segment); + break; + case "binary": + result = get_binary(segment); + break; + } + if (result === false) { + return false; + } else if (segment.name) { + vars[segment.name] = result; + } else if (segment.value != result) { + return false; + } + } + } + if (offset == binsize) { + return bindings(vars); + } else { + return false; + } + } + module2.exports.match = match; + module2.exports.parse_int = parse_int; + module2.exports.parse_float = parse_float; + } +}); + +// node_modules/safe-buffer/index.js +var require_safe_buffer = __commonJS({ + "node_modules/safe-buffer/index.js"(exports2, module2) { + var buffer = require("buffer"); + var Buffer2 = buffer.Buffer; + function copyProps(src, dst) { + for (var key in src) { + dst[key] = src[key]; + } + } + if (Buffer2.from && Buffer2.alloc && Buffer2.allocUnsafe && Buffer2.allocUnsafeSlow) { + module2.exports = buffer; + } else { + copyProps(buffer, exports2); + exports2.Buffer = SafeBuffer; + } + function SafeBuffer(arg, encodingOrOffset, length) { + return Buffer2(arg, encodingOrOffset, length); + } + copyProps(Buffer2, SafeBuffer); + SafeBuffer.from = function(arg, encodingOrOffset, length) { + if (typeof arg === "number") { + throw new TypeError("Argument must not be a number"); + } + return Buffer2(arg, encodingOrOffset, length); + }; + SafeBuffer.alloc = function(size, fill, encoding) { + if (typeof size !== "number") { + throw new TypeError("Argument must be a number"); + } + var buf = Buffer2(size); + if (fill !== void 0) { + if (typeof encoding === "string") { + buf.fill(fill, encoding); + } else { + buf.fill(fill); + } + } else { + buf.fill(0); + } + return buf; + }; + SafeBuffer.allocUnsafe = function(size) { + if (typeof size !== "number") { + throw new TypeError("Argument must be a number"); + } + return Buffer2(size); + }; + SafeBuffer.allocUnsafeSlow = function(size) { + if (typeof size !== "number") { + throw new TypeError("Argument must be a number"); + } + return buffer.SlowBuffer(size); + }; + } +}); + +// node_modules/@acuminous/bitsyntax/lib/constructor.js +var require_constructor = __commonJS({ + "node_modules/@acuminous/bitsyntax/lib/constructor.js"(exports2, module2) { + "use strict"; + var ints = require_buffer_more_ints(); + var Buffer2 = require_safe_buffer().Buffer; + function write(buf, offset, pattern, bindings) { + for (var i = 0, len = pattern.length; i < len; i++) { + var segment = pattern[i]; + switch (segment.type) { + case "string": + offset += buf.write(segment.value, offset, "utf8"); + break; + case "binary": + offset += writeBinary(segment, buf, offset, bindings); + break; + case "integer": + offset += writeInteger(segment, buf, offset, bindings); + break; + case "float": + offset += writeFloat(segment, buf, offset, bindings); + break; + } + } + return offset; + } + function build(pattern, bindings) { + var bufsize = size_of(pattern, bindings); + var buf = Buffer2.alloc(bufsize); + write(buf, 0, pattern, bindings); + return buf; + } + function size_of_segment(segment, bindings) { + if (typeof segment.size === "string") { + return bindings[segment.size] * segment.unit / 8; + } + if (segment.type === "string") { + return Buffer2.byteLength(segment.value, "utf8"); + } + if (segment.type === "binary" && segment.size === true) { + var val = bindings[segment.name]; + return val.length; + } + return segment.size * segment.unit / 8; + } + function size_of(segments, bindings) { + var size = 0; + for (var i = 0, len = segments.length; i < len; i++) { + size += size_of_segment(segments[i], bindings); + } + return size; + } + function writeBinary(segment, buf, offset, bindings) { + var bin = bindings[segment.name]; + var size = size_of_segment(segment, bindings); + bin.copy(buf, offset, 0, size); + return size; + } + function writeInteger(segment, buf, offset, bindings) { + var value = segment.name ? bindings[segment.name] : segment.value; + var size = size_of_segment(segment, bindings); + return write_int(buf, value, offset, size, segment.bigendian); + } + function write_int(buf, value, offset, size, bigendian) { + switch (size) { + case 1: + buf.writeUInt8(value, offset); + break; + case 2: + bigendian ? buf.writeUInt16BE(value, offset) : buf.writeUInt16LE(value, offset); + break; + case 4: + bigendian ? buf.writeUInt32BE(value, offset) : buf.writeUInt32LE(value, offset); + break; + case 8: + bigendian ? ints.writeUInt64BE(buf, value, offset) : ints.writeUInt64LE(buf, value, offset); + break; + default: + throw new Error("integer size * unit must be 8, 16, 32 or 64"); + } + return size; + } + function writeFloat(segment, buf, offset, bindings) { + var value = segment.name ? bindings[segment.name] : segment.value; + var size = size_of_segment(segment, bindings); + return write_float(buf, value, offset, size, segment.bigendian); + } + function write_float(buf, value, offset, size, bigendian) { + if (size === 4) { + bigendian ? buf.writeFloatBE(value, offset) : buf.writeFloatLE(value, offset); + } else if (size === 8) { + bigendian ? buf.writeDoubleBE(value, offset) : buf.writeDoubleLE(value, offset); + } else { + throw new Error("float size * unit must be 32 or 64"); + } + return size; + } + var parse = require_parse2().parse; + module2.exports.write = write; + module2.exports.build = build; + module2.exports.write_int = write_int; + module2.exports.write_float = write_float; + module2.exports.builder = function(pstr) { + pstr = arguments.length > 1 ? [].join.call(arguments, ",") : pstr; + var pattern = parse(pstr); + return function(vars) { + return build(pattern, vars); + }; + }; + } +}); + +// node_modules/@acuminous/bitsyntax/lib/compile.js +var require_compile = __commonJS({ + "node_modules/@acuminous/bitsyntax/lib/compile.js"(exports2, module2) { + "use strict"; + require_buffer_more_ints(); + var $2 = require("util").format; + var parse = require_parse2().parse; + var interp = require_interp(); + var parse_int = interp.parse_int; + var parse_float = interp.parse_float; + var construct = require_constructor(); + var write_int = construct.write_int; + var write_float = construct.write_float; + var Buffer2 = require_safe_buffer().Buffer; + var lines = []; + function $start() { + lines = []; + } + function $line() { + lines.push($2.apply(null, arguments)); + } + function $result() { + return lines.join("\n"); + } + function bits_expr(segment) { + if (typeof segment.size === "string") { + return $2("%s * %d", var_name(segment.size), segment.unit); + } else { + return (segment.size * segment.unit).toString(); + } + } + function get_number(segment) { + $line("bits = %s;\n", bits_expr(segment)); + var parser = segment.type === "integer" ? "parse_int" : "parse_float"; + var be2 = segment.bigendian, sg = segment.signed; + $line("byteoffset = offset / 8; offset += bits"); + $line("if (offset > binsize) { return false; }"); + $line( + "else { result = %s(bin, byteoffset, bits / 8, %s, %s); }", + parser, + be2, + sg + ); + } + function get_binary(segment) { + $line("byteoffset = offset / 8;"); + if (segment.size === true) { + $line("offset = binsize;"); + $line("result = bin.slice(byteoffset);"); + } else { + $line("bits = %s;", bits_expr(segment)); + $line("offset += bits;"); + $line("if (offset > binsize) { return false; }"); + $line( + "else { result = bin.slice(byteoffset,", + "byteoffset + bits / 8); }" + ); + } + } + function get_string(segment) { + $line("byteoffset = offset / 8;"); + var strlen = segment.value.length; + var strlenbits = strlen * 8; + $line("offset += %d;", strlenbits); + $line("if (offset > binsize) { return false; }"); + $line( + "else { result = bin.toString(byteoffset,", + $2("byteoffset + %d); }", strlen) + ); + } + function skip_bits(segment) { + if (typeof segment.size === "string") { + $line( + "var skipbits = %s * %d;", + var_name(segment.size), + segment.unit + ); + $line("if (offset + skipbits > binsize) { return false; }"); + $line("else { offset += skipbits; }"); + } else if (segment.size === true) { + $line("if (offset % 8 === 0) { offset = binsize; }"); + $line("else { return false; }"); + } else { + var bits = segment.unit * segment.size; + $line("if (offset + %d > binsize) { return false; }", bits); + $line("else { offset += %d; }", bits); + } + } + function match_seg(segment) { + if (segment.name === "_") { + skip_bits(segment); + } else { + var assign_result; + switch (segment.type) { + case "integer": + case "float": + get_number(segment); + break; + case "binary": + get_binary(segment); + break; + case "string": + get_string(segment); + break; + } + $line("if (result === false) return false;"); + if (segment.name) { + $line("else if (%s !== undefined) {", var_name(segment.name)); + $line( + "if (%s != result) return false;", + var_name(segment.name) + ); + $line("}"); + $line("else %s = result;", var_name(segment.name)); + } else { + var repr = JSON.stringify(segment.value); + $line("else if (result != %s) return false;", repr); + } + } + } + function var_name(name) { + return "var_" + name; + } + function variables(segments) { + var names = {}; + for (var i = 0; i < segments.length; i++) { + var name = segments[i].name; + if (name && name !== "_") { + names[name] = true; + } + name = segments[i].size; + if (typeof name === "string") { + names[name] = true; + } + } + return Object.keys(names); + } + function compile_pattern(segments) { + $start(); + $line("return function(binary, env) {"); + $line("'use strict';"); + $line("var bin = binary, env = env || {};"); + $line("var offset = 0, binsize = bin.length * 8;"); + $line("var bits, result, byteoffset;"); + var varnames = variables(segments); + for (var v = 0; v < varnames.length; v++) { + var name = varnames[v]; + $line("var %s = env['%s'];", var_name(name), name); + } + var len = segments.length; + for (var i = 0; i < len; i++) { + var segment = segments[i]; + $line("// " + JSON.stringify(segment)); + match_seg(segment); + } + $line("if (offset == binsize) {"); + $line("return {"); + for (var v = 0; v < varnames.length; v++) { + var name = varnames[v]; + $line("%s: %s,", name, var_name(name)); + } + $line("};"); + $line("}"); + $line("else return false;"); + $line("}"); + var fn = new Function("parse_int", "parse_float", $result()); + return fn(parse_int, parse_float); + } + function write_seg(segment) { + switch (segment.type) { + case "string": + $line( + "offset += buf.write(%s, offset, 'utf8');", + JSON.stringify(segment.value) + ); + break; + case "binary": + $line("val = bindings['%s'];", segment.name); + if (segment.size === true) { + $line("size = val.length;"); + } else if (typeof segment.size === "string") { + $line( + "size = (bindings['%s'] * %d) / 8;", + segment.size, + segment.unit + ); + } else { + $line("size = %d;", segment.size * segment.unit / 8); + } + $line("val.copy(buf, offset, 0, size);"); + $line("offset += size;"); + break; + case "integer": + case "float": + write_number(segment); + break; + } + } + function write_number(segment) { + if (segment.name) { + $line("val = bindings['%s'];", segment.name); + } else { + $line("val = %d", segment.value); + } + var writer = segment.type === "integer" ? "write_int" : "write_float"; + if (typeof segment.size === "string") { + $line( + "size = (bindings['%s'] * %d) / 8;", + segment.size, + segment.unit + ); + } else { + $line("size = %d;", segment.size * segment.unit / 8); + } + $line( + "%s(buf, val, offset, size, %s);", + writer, + segment.bigendian + ); + $line("offset += size;"); + } + function size_of(segments) { + var variable = []; + var fixed = 0; + for (var i = 0; i < segments.length; i++) { + var segment = segments[i]; + if (typeof segment.size === "string" || segment.size === true) { + variable.push(segment); + } else if (segment.type === "string") { + fixed += Buffer2.byteLength(segment.value); + } else { + fixed += segment.size * segment.unit / 8; + } + } + $line("var buffersize = %d;", fixed); + if (variable.length > 0) { + for (var j2 = 0; j2 < variable.length; j2++) { + var segment = variable[j2]; + if (segment.size === true) { + $line("buffersize += bindings['%s'].length;", segment.name); + } else { + $line( + "buffersize += (bindings['%s'] * %d) / 8;", + segment.size, + segment.unit + ); + } + } + } + } + function emit_write(segments) { + $line("var val, size;"); + var len = segments.length; + for (var i = 0; i < len; i++) { + var segment = segments[i]; + $line("// %s", JSON.stringify(segment)); + write_seg(segment); + } + } + function compile_ctor(segments) { + $start(); + $line("return function(bindings) {"); + $line("'use strict';"); + size_of(segments); + $line("var buf = Buffer.alloc(buffersize);"); + $line("var offset = 0;"); + emit_write(segments); + $line("return buf;"); + $line("}"); + return new Function( + "write_int", + "write_float", + "Buffer", + $result() + )(write_int, write_float, Buffer2); + } + module2.exports.compile_pattern = compile_pattern; + module2.exports.compile = function() { + var str = [].join.call(arguments, ","); + var p = parse(str); + return compile_pattern(p); + }; + module2.exports.compile_builder = function() { + var str = [].join.call(arguments, ","); + var p = parse(str); + return compile_ctor(p); + }; + } +}); + +// node_modules/@acuminous/bitsyntax/index.js +var require_bitsyntax = __commonJS({ + "node_modules/@acuminous/bitsyntax/index.js"(exports2, module2) { + "use strict"; + module2.exports.parse = require_parse2().parse; + module2.exports.match = require_interp().match; + module2.exports.build = require_constructor().build; + module2.exports.write = require_constructor().write; + module2.exports.matcher = module2.exports.compile = require_compile().compile; + module2.exports.builder = require_compile().compile_builder; + } +}); + +// node_modules/amqplib/lib/frame.js +var require_frame = __commonJS({ + "node_modules/amqplib/lib/frame.js"(exports2, module2) { + "use strict"; + var defs = require_defs(); + var constants = defs.constants; + var decode = defs.decode; + var Bits = require_bitsyntax(); + module2.exports.PROTOCOL_HEADER = "AMQP" + String.fromCharCode(0, 0, 9, 1); + var FRAME_METHOD = constants.FRAME_METHOD; + var FRAME_HEARTBEAT = constants.FRAME_HEARTBEAT; + var FRAME_HEADER = constants.FRAME_HEADER; + var FRAME_BODY = constants.FRAME_BODY; + var FRAME_END = constants.FRAME_END; + var bodyCons = Bits.builder( + FRAME_BODY, + "channel:16, size:32, payload:size/binary", + FRAME_END + ); + module2.exports.makeBodyFrame = function(channel, payload) { + return bodyCons({ channel, size: payload.length, payload }); + }; + var frameHeaderPattern = Bits.matcher( + "type:8", + "channel:16", + "size:32", + "rest/binary" + ); + function parseFrame(bin, max) { + var fh = frameHeaderPattern(bin); + if (fh) { + var size = fh.size, rest = fh.rest; + if (size > max) { + throw new Error("Frame size exceeds frame max"); + } else if (rest.length > size) { + if (rest[size] !== FRAME_END) + throw new Error("Invalid frame"); + return { + type: fh.type, + channel: fh.channel, + size, + payload: rest.slice(0, size), + rest: rest.slice(size + 1) + }; + } + } + return false; + } + module2.exports.parseFrame = parseFrame; + var headerPattern = Bits.matcher( + "class:16", + "_weight:16", + "size:64", + "flagsAndfields/binary" + ); + var methodPattern = Bits.matcher("id:32, args/binary"); + var HEARTBEAT = { channel: 0 }; + module2.exports.decodeFrame = function(frame) { + var payload = frame.payload; + switch (frame.type) { + case FRAME_METHOD: + var idAndArgs = methodPattern(payload); + var id = idAndArgs.id; + var fields = decode(id, idAndArgs.args); + return { id, channel: frame.channel, fields }; + case FRAME_HEADER: + var parts = headerPattern(payload); + var id = parts["class"]; + var fields = decode(id, parts.flagsAndfields); + return { + id, + channel: frame.channel, + size: parts.size, + fields + }; + case FRAME_BODY: + return { channel: frame.channel, content: frame.payload }; + case FRAME_HEARTBEAT: + return HEARTBEAT; + default: + throw new Error("Unknown frame type " + frame.type); + } + }; + module2.exports.HEARTBEAT_BUF = Buffer.from([ + constants.FRAME_HEARTBEAT, + 0, + 0, + 0, + 0, + // size = 0 + 0, + 0, + // channel = 0 + constants.FRAME_END + ]); + module2.exports.HEARTBEAT = HEARTBEAT; + } +}); + +// node_modules/amqplib/lib/mux.js +var require_mux = __commonJS({ + "node_modules/amqplib/lib/mux.js"(exports2, module2) { + "use strict"; + var assert = require("assert"); + var schedule = typeof setImmediate === "function" ? setImmediate : process.nextTick; + function Mux(downstream) { + this.newStreams = []; + this.oldStreams = []; + this.blocked = false; + this.scheduledRead = false; + this.out = downstream; + var self2 = this; + downstream.on("drain", function() { + self2.blocked = false; + self2._readIncoming(); + }); + } + Mux.prototype._readIncoming = function() { + if (this.blocked) + return; + var accepting = true; + var out = this.out; + function roundrobin(streams) { + var s; + while (accepting && (s = streams.shift())) { + var chunk = s.read(); + if (chunk !== null) { + accepting = out.write(chunk); + streams.push(s); + } + } + } + roundrobin(this.newStreams); + if (accepting) { + assert.equal(0, this.newStreams.length); + roundrobin(this.oldStreams); + } else { + assert(this.newStreams.length > 0, "Expect some new streams to remain"); + Array.prototype.push.apply(this.oldStreams, this.newStreams); + this.newStreams = []; + } + this.blocked = !accepting; + }; + Mux.prototype._scheduleRead = function() { + var self2 = this; + if (!self2.scheduledRead) { + schedule(function() { + self2.scheduledRead = false; + self2._readIncoming(); + }); + self2.scheduledRead = true; + } + }; + Mux.prototype.pipeFrom = function(readable) { + var self2 = this; + function enqueue() { + self2.newStreams.push(readable); + self2._scheduleRead(); + } + function cleanup() { + readable.removeListener("readable", enqueue); + readable.removeListener("error", cleanup); + readable.removeListener("end", cleanup); + readable.removeListener("unpipeFrom", cleanupIfMe); + } + function cleanupIfMe(dest) { + if (dest === self2) + cleanup(); + } + readable.on("unpipeFrom", cleanupIfMe); + readable.on("end", cleanup); + readable.on("error", cleanup); + readable.on("readable", enqueue); + }; + Mux.prototype.unpipeFrom = function(readable) { + readable.emit("unpipeFrom", this); + }; + module2.exports.Mux = Mux; + } +}); + +// node_modules/core-util-is/lib/util.js +var require_util3 = __commonJS({ + "node_modules/core-util-is/lib/util.js"(exports2) { + function isArray(arg) { + if (Array.isArray) { + return Array.isArray(arg); + } + return objectToString(arg) === "[object Array]"; + } + exports2.isArray = isArray; + function isBoolean(arg) { + return typeof arg === "boolean"; + } + exports2.isBoolean = isBoolean; + function isNull(arg) { + return arg === null; + } + exports2.isNull = isNull; + function isNullOrUndefined(arg) { + return arg == null; + } + exports2.isNullOrUndefined = isNullOrUndefined; + function isNumber(arg) { + return typeof arg === "number"; + } + exports2.isNumber = isNumber; + function isString(arg) { + return typeof arg === "string"; + } + exports2.isString = isString; + function isSymbol(arg) { + return typeof arg === "symbol"; + } + exports2.isSymbol = isSymbol; + function isUndefined(arg) { + return arg === void 0; + } + exports2.isUndefined = isUndefined; + function isRegExp(re2) { + return objectToString(re2) === "[object RegExp]"; + } + exports2.isRegExp = isRegExp; + function isObject(arg) { + return typeof arg === "object" && arg !== null; + } + exports2.isObject = isObject; + function isDate(d) { + return objectToString(d) === "[object Date]"; + } + exports2.isDate = isDate; + function isError(e) { + return objectToString(e) === "[object Error]" || e instanceof Error; + } + exports2.isError = isError; + function isFunction(arg) { + return typeof arg === "function"; + } + exports2.isFunction = isFunction; + function isPrimitive(arg) { + return arg === null || typeof arg === "boolean" || typeof arg === "number" || typeof arg === "string" || typeof arg === "symbol" || // ES6 symbol + typeof arg === "undefined"; + } + exports2.isPrimitive = isPrimitive; + exports2.isBuffer = require("buffer").Buffer.isBuffer; + function objectToString(o) { + return Object.prototype.toString.call(o); + } + } +}); + +// node_modules/inherits/inherits_browser.js +var require_inherits_browser = __commonJS({ + "node_modules/inherits/inherits_browser.js"(exports2, module2) { + if (typeof Object.create === "function") { + module2.exports = function inherits(ctor, superCtor) { + if (superCtor) { + ctor.super_ = superCtor; + ctor.prototype = Object.create(superCtor.prototype, { + constructor: { + value: ctor, + enumerable: false, + writable: true, + configurable: true + } + }); + } + }; + } else { + module2.exports = function inherits(ctor, superCtor) { + if (superCtor) { + ctor.super_ = superCtor; + var TempCtor = function() { + }; + TempCtor.prototype = superCtor.prototype; + ctor.prototype = new TempCtor(); + ctor.prototype.constructor = ctor; + } + }; + } + } +}); + +// node_modules/inherits/inherits.js +var require_inherits = __commonJS({ + "node_modules/inherits/inherits.js"(exports2, module2) { + try { + util = require("util"); + if (typeof util.inherits !== "function") + throw ""; + module2.exports = util.inherits; + } catch (e) { + module2.exports = require_inherits_browser(); + } + var util; + } +}); + +// node_modules/isarray/index.js +var require_isarray = __commonJS({ + "node_modules/isarray/index.js"(exports2, module2) { + module2.exports = Array.isArray || function(arr) { + return Object.prototype.toString.call(arr) == "[object Array]"; + }; + } +}); + +// node_modules/string_decoder/index.js +var require_string_decoder = __commonJS({ + "node_modules/string_decoder/index.js"(exports2) { + var Buffer2 = require("buffer").Buffer; + var isBufferEncoding = Buffer2.isEncoding || function(encoding) { + switch (encoding && encoding.toLowerCase()) { + case "hex": + case "utf8": + case "utf-8": + case "ascii": + case "binary": + case "base64": + case "ucs2": + case "ucs-2": + case "utf16le": + case "utf-16le": + case "raw": + return true; + default: + return false; + } + }; + function assertEncoding(encoding) { + if (encoding && !isBufferEncoding(encoding)) { + throw new Error("Unknown encoding: " + encoding); + } + } + var StringDecoder = exports2.StringDecoder = function(encoding) { + this.encoding = (encoding || "utf8").toLowerCase().replace(/[-_]/, ""); + assertEncoding(encoding); + switch (this.encoding) { + case "utf8": + this.surrogateSize = 3; + break; + case "ucs2": + case "utf16le": + this.surrogateSize = 2; + this.detectIncompleteChar = utf16DetectIncompleteChar; + break; + case "base64": + this.surrogateSize = 3; + this.detectIncompleteChar = base64DetectIncompleteChar; + break; + default: + this.write = passThroughWrite; + return; + } + this.charBuffer = new Buffer2(6); + this.charReceived = 0; + this.charLength = 0; + }; + StringDecoder.prototype.write = function(buffer) { + var charStr = ""; + while (this.charLength) { + var available = buffer.length >= this.charLength - this.charReceived ? this.charLength - this.charReceived : buffer.length; + buffer.copy(this.charBuffer, this.charReceived, 0, available); + this.charReceived += available; + if (this.charReceived < this.charLength) { + return ""; + } + buffer = buffer.slice(available, buffer.length); + charStr = this.charBuffer.slice(0, this.charLength).toString(this.encoding); + var charCode = charStr.charCodeAt(charStr.length - 1); + if (charCode >= 55296 && charCode <= 56319) { + this.charLength += this.surrogateSize; + charStr = ""; + continue; + } + this.charReceived = this.charLength = 0; + if (buffer.length === 0) { + return charStr; + } + break; + } + this.detectIncompleteChar(buffer); + var end = buffer.length; + if (this.charLength) { + buffer.copy(this.charBuffer, 0, buffer.length - this.charReceived, end); + end -= this.charReceived; + } + charStr += buffer.toString(this.encoding, 0, end); + var end = charStr.length - 1; + var charCode = charStr.charCodeAt(end); + if (charCode >= 55296 && charCode <= 56319) { + var size = this.surrogateSize; + this.charLength += size; + this.charReceived += size; + this.charBuffer.copy(this.charBuffer, size, 0, size); + buffer.copy(this.charBuffer, 0, 0, size); + return charStr.substring(0, end); + } + return charStr; + }; + StringDecoder.prototype.detectIncompleteChar = function(buffer) { + var i = buffer.length >= 3 ? 3 : buffer.length; + for (; i > 0; i--) { + var c = buffer[buffer.length - i]; + if (i == 1 && c >> 5 == 6) { + this.charLength = 2; + break; + } + if (i <= 2 && c >> 4 == 14) { + this.charLength = 3; + break; + } + if (i <= 3 && c >> 3 == 30) { + this.charLength = 4; + break; + } + } + this.charReceived = i; + }; + StringDecoder.prototype.end = function(buffer) { + var res = ""; + if (buffer && buffer.length) + res = this.write(buffer); + if (this.charReceived) { + var cr = this.charReceived; + var buf = this.charBuffer; + var enc = this.encoding; + res += buf.slice(0, cr).toString(enc); + } + return res; + }; + function passThroughWrite(buffer) { + return buffer.toString(this.encoding); + } + function utf16DetectIncompleteChar(buffer) { + this.charReceived = buffer.length % 2; + this.charLength = this.charReceived ? 2 : 0; + } + function base64DetectIncompleteChar(buffer) { + this.charReceived = buffer.length % 3; + this.charLength = this.charReceived ? 3 : 0; + } + } +}); + +// node_modules/readable-stream/lib/_stream_readable.js +var require_stream_readable = __commonJS({ + "node_modules/readable-stream/lib/_stream_readable.js"(exports2, module2) { + module2.exports = Readable; + var isArray = require_isarray(); + var Buffer2 = require("buffer").Buffer; + Readable.ReadableState = ReadableState; + var EE = require("events").EventEmitter; + if (!EE.listenerCount) + EE.listenerCount = function(emitter, type) { + return emitter.listeners(type).length; + }; + var Stream = require("stream"); + var util = require_util3(); + util.inherits = require_inherits(); + var StringDecoder; + var debug2 = require("util"); + if (debug2 && debug2.debuglog) { + debug2 = debug2.debuglog("stream"); + } else { + debug2 = function() { + }; + } + util.inherits(Readable, Stream); + function ReadableState(options2, stream) { + var Duplex = require_stream_duplex(); + options2 = options2 || {}; + var hwm = options2.highWaterMark; + var defaultHwm = options2.objectMode ? 16 : 16 * 1024; + this.highWaterMark = hwm || hwm === 0 ? hwm : defaultHwm; + this.highWaterMark = ~~this.highWaterMark; + this.buffer = []; + this.length = 0; + this.pipes = null; + this.pipesCount = 0; + this.flowing = null; + this.ended = false; + this.endEmitted = false; + this.reading = false; + this.sync = true; + this.needReadable = false; + this.emittedReadable = false; + this.readableListening = false; + this.objectMode = !!options2.objectMode; + if (stream instanceof Duplex) + this.objectMode = this.objectMode || !!options2.readableObjectMode; + this.defaultEncoding = options2.defaultEncoding || "utf8"; + this.ranOut = false; + this.awaitDrain = 0; + this.readingMore = false; + this.decoder = null; + this.encoding = null; + if (options2.encoding) { + if (!StringDecoder) + StringDecoder = require_string_decoder().StringDecoder; + this.decoder = new StringDecoder(options2.encoding); + this.encoding = options2.encoding; + } + } + function Readable(options2) { + var Duplex = require_stream_duplex(); + if (!(this instanceof Readable)) + return new Readable(options2); + this._readableState = new ReadableState(options2, this); + this.readable = true; + Stream.call(this); + } + Readable.prototype.push = function(chunk, encoding) { + var state = this._readableState; + if (util.isString(chunk) && !state.objectMode) { + encoding = encoding || state.defaultEncoding; + if (encoding !== state.encoding) { + chunk = new Buffer2(chunk, encoding); + encoding = ""; + } + } + return readableAddChunk(this, state, chunk, encoding, false); + }; + Readable.prototype.unshift = function(chunk) { + var state = this._readableState; + return readableAddChunk(this, state, chunk, "", true); + }; + function readableAddChunk(stream, state, chunk, encoding, addToFront) { + var er = chunkInvalid(state, chunk); + if (er) { + stream.emit("error", er); + } else if (util.isNullOrUndefined(chunk)) { + state.reading = false; + if (!state.ended) + onEofChunk(stream, state); + } else if (state.objectMode || chunk && chunk.length > 0) { + if (state.ended && !addToFront) { + var e = new Error("stream.push() after EOF"); + stream.emit("error", e); + } else if (state.endEmitted && addToFront) { + var e = new Error("stream.unshift() after end event"); + stream.emit("error", e); + } else { + if (state.decoder && !addToFront && !encoding) + chunk = state.decoder.write(chunk); + if (!addToFront) + state.reading = false; + if (state.flowing && state.length === 0 && !state.sync) { + stream.emit("data", chunk); + stream.read(0); + } else { + state.length += state.objectMode ? 1 : chunk.length; + if (addToFront) + state.buffer.unshift(chunk); + else + state.buffer.push(chunk); + if (state.needReadable) + emitReadable(stream); + } + maybeReadMore(stream, state); + } + } else if (!addToFront) { + state.reading = false; + } + return needMoreData(state); + } + function needMoreData(state) { + return !state.ended && (state.needReadable || state.length < state.highWaterMark || state.length === 0); + } + Readable.prototype.setEncoding = function(enc) { + if (!StringDecoder) + StringDecoder = require_string_decoder().StringDecoder; + this._readableState.decoder = new StringDecoder(enc); + this._readableState.encoding = enc; + return this; + }; + var MAX_HWM = 8388608; + function roundUpToNextPowerOf2(n) { + if (n >= MAX_HWM) { + n = MAX_HWM; + } else { + n--; + for (var p = 1; p < 32; p <<= 1) + n |= n >> p; + n++; + } + return n; + } + function howMuchToRead(n, state) { + if (state.length === 0 && state.ended) + return 0; + if (state.objectMode) + return n === 0 ? 0 : 1; + if (isNaN(n) || util.isNull(n)) { + if (state.flowing && state.buffer.length) + return state.buffer[0].length; + else + return state.length; + } + if (n <= 0) + return 0; + if (n > state.highWaterMark) + state.highWaterMark = roundUpToNextPowerOf2(n); + if (n > state.length) { + if (!state.ended) { + state.needReadable = true; + return 0; + } else + return state.length; + } + return n; + } + Readable.prototype.read = function(n) { + debug2("read", n); + var state = this._readableState; + var nOrig = n; + if (!util.isNumber(n) || n > 0) + state.emittedReadable = false; + if (n === 0 && state.needReadable && (state.length >= state.highWaterMark || state.ended)) { + debug2("read: emitReadable", state.length, state.ended); + if (state.length === 0 && state.ended) + endReadable(this); + else + emitReadable(this); + return null; + } + n = howMuchToRead(n, state); + if (n === 0 && state.ended) { + if (state.length === 0) + endReadable(this); + return null; + } + var doRead = state.needReadable; + debug2("need readable", doRead); + if (state.length === 0 || state.length - n < state.highWaterMark) { + doRead = true; + debug2("length less than watermark", doRead); + } + if (state.ended || state.reading) { + doRead = false; + debug2("reading or ended", doRead); + } + if (doRead) { + debug2("do read"); + state.reading = true; + state.sync = true; + if (state.length === 0) + state.needReadable = true; + this._read(state.highWaterMark); + state.sync = false; + } + if (doRead && !state.reading) + n = howMuchToRead(nOrig, state); + var ret; + if (n > 0) + ret = fromList(n, state); + else + ret = null; + if (util.isNull(ret)) { + state.needReadable = true; + n = 0; + } + state.length -= n; + if (state.length === 0 && !state.ended) + state.needReadable = true; + if (nOrig !== n && state.ended && state.length === 0) + endReadable(this); + if (!util.isNull(ret)) + this.emit("data", ret); + return ret; + }; + function chunkInvalid(state, chunk) { + var er = null; + if (!util.isBuffer(chunk) && !util.isString(chunk) && !util.isNullOrUndefined(chunk) && !state.objectMode) { + er = new TypeError("Invalid non-string/buffer chunk"); + } + return er; + } + function onEofChunk(stream, state) { + if (state.decoder && !state.ended) { + var chunk = state.decoder.end(); + if (chunk && chunk.length) { + state.buffer.push(chunk); + state.length += state.objectMode ? 1 : chunk.length; + } + } + state.ended = true; + emitReadable(stream); + } + function emitReadable(stream) { + var state = stream._readableState; + state.needReadable = false; + if (!state.emittedReadable) { + debug2("emitReadable", state.flowing); + state.emittedReadable = true; + if (state.sync) + process.nextTick(function() { + emitReadable_(stream); + }); + else + emitReadable_(stream); + } + } + function emitReadable_(stream) { + debug2("emit readable"); + stream.emit("readable"); + flow(stream); + } + function maybeReadMore(stream, state) { + if (!state.readingMore) { + state.readingMore = true; + process.nextTick(function() { + maybeReadMore_(stream, state); + }); + } + } + function maybeReadMore_(stream, state) { + var len = state.length; + while (!state.reading && !state.flowing && !state.ended && state.length < state.highWaterMark) { + debug2("maybeReadMore read 0"); + stream.read(0); + if (len === state.length) + break; + else + len = state.length; + } + state.readingMore = false; + } + Readable.prototype._read = function(n) { + this.emit("error", new Error("not implemented")); + }; + Readable.prototype.pipe = function(dest, pipeOpts) { + var src = this; + var state = this._readableState; + switch (state.pipesCount) { + case 0: + state.pipes = dest; + break; + case 1: + state.pipes = [state.pipes, dest]; + break; + default: + state.pipes.push(dest); + break; + } + state.pipesCount += 1; + debug2("pipe count=%d opts=%j", state.pipesCount, pipeOpts); + var doEnd = (!pipeOpts || pipeOpts.end !== false) && dest !== process.stdout && dest !== process.stderr; + var endFn = doEnd ? onend : cleanup; + if (state.endEmitted) + process.nextTick(endFn); + else + src.once("end", endFn); + dest.on("unpipe", onunpipe); + function onunpipe(readable) { + debug2("onunpipe"); + if (readable === src) { + cleanup(); + } + } + function onend() { + debug2("onend"); + dest.end(); + } + var ondrain = pipeOnDrain(src); + dest.on("drain", ondrain); + function cleanup() { + debug2("cleanup"); + dest.removeListener("close", onclose); + dest.removeListener("finish", onfinish); + dest.removeListener("drain", ondrain); + dest.removeListener("error", onerror); + dest.removeListener("unpipe", onunpipe); + src.removeListener("end", onend); + src.removeListener("end", cleanup); + src.removeListener("data", ondata); + if (state.awaitDrain && (!dest._writableState || dest._writableState.needDrain)) + ondrain(); + } + src.on("data", ondata); + function ondata(chunk) { + debug2("ondata"); + var ret = dest.write(chunk); + if (false === ret) { + debug2( + "false write response, pause", + src._readableState.awaitDrain + ); + src._readableState.awaitDrain++; + src.pause(); + } + } + function onerror(er) { + debug2("onerror", er); + unpipe(); + dest.removeListener("error", onerror); + if (EE.listenerCount(dest, "error") === 0) + dest.emit("error", er); + } + if (!dest._events || !dest._events.error) + dest.on("error", onerror); + else if (isArray(dest._events.error)) + dest._events.error.unshift(onerror); + else + dest._events.error = [onerror, dest._events.error]; + function onclose() { + dest.removeListener("finish", onfinish); + unpipe(); + } + dest.once("close", onclose); + function onfinish() { + debug2("onfinish"); + dest.removeListener("close", onclose); + unpipe(); + } + dest.once("finish", onfinish); + function unpipe() { + debug2("unpipe"); + src.unpipe(dest); + } + dest.emit("pipe", src); + if (!state.flowing) { + debug2("pipe resume"); + src.resume(); + } + return dest; + }; + function pipeOnDrain(src) { + return function() { + var state = src._readableState; + debug2("pipeOnDrain", state.awaitDrain); + if (state.awaitDrain) + state.awaitDrain--; + if (state.awaitDrain === 0 && EE.listenerCount(src, "data")) { + state.flowing = true; + flow(src); + } + }; + } + Readable.prototype.unpipe = function(dest) { + var state = this._readableState; + if (state.pipesCount === 0) + return this; + if (state.pipesCount === 1) { + if (dest && dest !== state.pipes) + return this; + if (!dest) + dest = state.pipes; + state.pipes = null; + state.pipesCount = 0; + state.flowing = false; + if (dest) + dest.emit("unpipe", this); + return this; + } + if (!dest) { + var dests = state.pipes; + var len = state.pipesCount; + state.pipes = null; + state.pipesCount = 0; + state.flowing = false; + for (var i = 0; i < len; i++) + dests[i].emit("unpipe", this); + return this; + } + var i = indexOf(state.pipes, dest); + if (i === -1) + return this; + state.pipes.splice(i, 1); + state.pipesCount -= 1; + if (state.pipesCount === 1) + state.pipes = state.pipes[0]; + dest.emit("unpipe", this); + return this; + }; + Readable.prototype.on = function(ev, fn) { + var res = Stream.prototype.on.call(this, ev, fn); + if (ev === "data" && false !== this._readableState.flowing) { + this.resume(); + } + if (ev === "readable" && this.readable) { + var state = this._readableState; + if (!state.readableListening) { + state.readableListening = true; + state.emittedReadable = false; + state.needReadable = true; + if (!state.reading) { + var self2 = this; + process.nextTick(function() { + debug2("readable nexttick read 0"); + self2.read(0); + }); + } else if (state.length) { + emitReadable(this, state); + } + } + } + return res; + }; + Readable.prototype.addListener = Readable.prototype.on; + Readable.prototype.resume = function() { + var state = this._readableState; + if (!state.flowing) { + debug2("resume"); + state.flowing = true; + if (!state.reading) { + debug2("resume read 0"); + this.read(0); + } + resume(this, state); + } + return this; + }; + function resume(stream, state) { + if (!state.resumeScheduled) { + state.resumeScheduled = true; + process.nextTick(function() { + resume_(stream, state); + }); + } + } + function resume_(stream, state) { + state.resumeScheduled = false; + stream.emit("resume"); + flow(stream); + if (state.flowing && !state.reading) + stream.read(0); + } + Readable.prototype.pause = function() { + debug2("call pause flowing=%j", this._readableState.flowing); + if (false !== this._readableState.flowing) { + debug2("pause"); + this._readableState.flowing = false; + this.emit("pause"); + } + return this; + }; + function flow(stream) { + var state = stream._readableState; + debug2("flow", state.flowing); + if (state.flowing) { + do { + var chunk = stream.read(); + } while (null !== chunk && state.flowing); + } + } + Readable.prototype.wrap = function(stream) { + var state = this._readableState; + var paused = false; + var self2 = this; + stream.on("end", function() { + debug2("wrapped end"); + if (state.decoder && !state.ended) { + var chunk = state.decoder.end(); + if (chunk && chunk.length) + self2.push(chunk); + } + self2.push(null); + }); + stream.on("data", function(chunk) { + debug2("wrapped data"); + if (state.decoder) + chunk = state.decoder.write(chunk); + if (!chunk || !state.objectMode && !chunk.length) + return; + var ret = self2.push(chunk); + if (!ret) { + paused = true; + stream.pause(); + } + }); + for (var i in stream) { + if (util.isFunction(stream[i]) && util.isUndefined(this[i])) { + this[i] = function(method) { + return function() { + return stream[method].apply(stream, arguments); + }; + }(i); + } + } + var events = ["error", "close", "destroy", "pause", "resume"]; + forEach(events, function(ev) { + stream.on(ev, self2.emit.bind(self2, ev)); + }); + self2._read = function(n) { + debug2("wrapped _read", n); + if (paused) { + paused = false; + stream.resume(); + } + }; + return self2; + }; + Readable._fromList = fromList; + function fromList(n, state) { + var list = state.buffer; + var length = state.length; + var stringMode = !!state.decoder; + var objectMode = !!state.objectMode; + var ret; + if (list.length === 0) + return null; + if (length === 0) + ret = null; + else if (objectMode) + ret = list.shift(); + else if (!n || n >= length) { + if (stringMode) + ret = list.join(""); + else + ret = Buffer2.concat(list, length); + list.length = 0; + } else { + if (n < list[0].length) { + var buf = list[0]; + ret = buf.slice(0, n); + list[0] = buf.slice(n); + } else if (n === list[0].length) { + ret = list.shift(); + } else { + if (stringMode) + ret = ""; + else + ret = new Buffer2(n); + var c = 0; + for (var i = 0, l = list.length; i < l && c < n; i++) { + var buf = list[0]; + var cpy = Math.min(n - c, buf.length); + if (stringMode) + ret += buf.slice(0, cpy); + else + buf.copy(ret, c, 0, cpy); + if (cpy < buf.length) + list[0] = buf.slice(cpy); + else + list.shift(); + c += cpy; + } + } + } + return ret; + } + function endReadable(stream) { + var state = stream._readableState; + if (state.length > 0) + throw new Error("endReadable called on non-empty stream"); + if (!state.endEmitted) { + state.ended = true; + process.nextTick(function() { + if (!state.endEmitted && state.length === 0) { + state.endEmitted = true; + stream.readable = false; + stream.emit("end"); + } + }); + } + } + function forEach(xs2, f) { + for (var i = 0, l = xs2.length; i < l; i++) { + f(xs2[i], i); + } + } + function indexOf(xs2, x) { + for (var i = 0, l = xs2.length; i < l; i++) { + if (xs2[i] === x) + return i; + } + return -1; + } + } +}); + +// node_modules/readable-stream/lib/_stream_writable.js +var require_stream_writable = __commonJS({ + "node_modules/readable-stream/lib/_stream_writable.js"(exports2, module2) { + module2.exports = Writable; + var Buffer2 = require("buffer").Buffer; + Writable.WritableState = WritableState; + var util = require_util3(); + util.inherits = require_inherits(); + var Stream = require("stream"); + util.inherits(Writable, Stream); + function WriteReq(chunk, encoding, cb) { + this.chunk = chunk; + this.encoding = encoding; + this.callback = cb; + } + function WritableState(options2, stream) { + var Duplex = require_stream_duplex(); + options2 = options2 || {}; + var hwm = options2.highWaterMark; + var defaultHwm = options2.objectMode ? 16 : 16 * 1024; + this.highWaterMark = hwm || hwm === 0 ? hwm : defaultHwm; + this.objectMode = !!options2.objectMode; + if (stream instanceof Duplex) + this.objectMode = this.objectMode || !!options2.writableObjectMode; + this.highWaterMark = ~~this.highWaterMark; + this.needDrain = false; + this.ending = false; + this.ended = false; + this.finished = false; + var noDecode = options2.decodeStrings === false; + this.decodeStrings = !noDecode; + this.defaultEncoding = options2.defaultEncoding || "utf8"; + this.length = 0; + this.writing = false; + this.corked = 0; + this.sync = true; + this.bufferProcessing = false; + this.onwrite = function(er) { + onwrite(stream, er); + }; + this.writecb = null; + this.writelen = 0; + this.buffer = []; + this.pendingcb = 0; + this.prefinished = false; + this.errorEmitted = false; + } + function Writable(options2) { + var Duplex = require_stream_duplex(); + if (!(this instanceof Writable) && !(this instanceof Duplex)) + return new Writable(options2); + this._writableState = new WritableState(options2, this); + this.writable = true; + Stream.call(this); + } + Writable.prototype.pipe = function() { + this.emit("error", new Error("Cannot pipe. Not readable.")); + }; + function writeAfterEnd(stream, state, cb) { + var er = new Error("write after end"); + stream.emit("error", er); + process.nextTick(function() { + cb(er); + }); + } + function validChunk(stream, state, chunk, cb) { + var valid = true; + if (!util.isBuffer(chunk) && !util.isString(chunk) && !util.isNullOrUndefined(chunk) && !state.objectMode) { + var er = new TypeError("Invalid non-string/buffer chunk"); + stream.emit("error", er); + process.nextTick(function() { + cb(er); + }); + valid = false; + } + return valid; + } + Writable.prototype.write = function(chunk, encoding, cb) { + var state = this._writableState; + var ret = false; + if (util.isFunction(encoding)) { + cb = encoding; + encoding = null; + } + if (util.isBuffer(chunk)) + encoding = "buffer"; + else if (!encoding) + encoding = state.defaultEncoding; + if (!util.isFunction(cb)) + cb = function() { + }; + if (state.ended) + writeAfterEnd(this, state, cb); + else if (validChunk(this, state, chunk, cb)) { + state.pendingcb++; + ret = writeOrBuffer(this, state, chunk, encoding, cb); + } + return ret; + }; + Writable.prototype.cork = function() { + var state = this._writableState; + state.corked++; + }; + Writable.prototype.uncork = function() { + var state = this._writableState; + if (state.corked) { + state.corked--; + if (!state.writing && !state.corked && !state.finished && !state.bufferProcessing && state.buffer.length) + clearBuffer(this, state); + } + }; + function decodeChunk(state, chunk, encoding) { + if (!state.objectMode && state.decodeStrings !== false && util.isString(chunk)) { + chunk = new Buffer2(chunk, encoding); + } + return chunk; + } + function writeOrBuffer(stream, state, chunk, encoding, cb) { + chunk = decodeChunk(state, chunk, encoding); + if (util.isBuffer(chunk)) + encoding = "buffer"; + var len = state.objectMode ? 1 : chunk.length; + state.length += len; + var ret = state.length < state.highWaterMark; + if (!ret) + state.needDrain = true; + if (state.writing || state.corked) + state.buffer.push(new WriteReq(chunk, encoding, cb)); + else + doWrite(stream, state, false, len, chunk, encoding, cb); + return ret; + } + function doWrite(stream, state, writev, len, chunk, encoding, cb) { + state.writelen = len; + state.writecb = cb; + state.writing = true; + state.sync = true; + if (writev) + stream._writev(chunk, state.onwrite); + else + stream._write(chunk, encoding, state.onwrite); + state.sync = false; + } + function onwriteError(stream, state, sync, er, cb) { + if (sync) + process.nextTick(function() { + state.pendingcb--; + cb(er); + }); + else { + state.pendingcb--; + cb(er); + } + stream._writableState.errorEmitted = true; + stream.emit("error", er); + } + function onwriteStateUpdate(state) { + state.writing = false; + state.writecb = null; + state.length -= state.writelen; + state.writelen = 0; + } + function onwrite(stream, er) { + var state = stream._writableState; + var sync = state.sync; + var cb = state.writecb; + onwriteStateUpdate(state); + if (er) + onwriteError(stream, state, sync, er, cb); + else { + var finished = needFinish(stream, state); + if (!finished && !state.corked && !state.bufferProcessing && state.buffer.length) { + clearBuffer(stream, state); + } + if (sync) { + process.nextTick(function() { + afterWrite(stream, state, finished, cb); + }); + } else { + afterWrite(stream, state, finished, cb); + } + } + } + function afterWrite(stream, state, finished, cb) { + if (!finished) + onwriteDrain(stream, state); + state.pendingcb--; + cb(); + finishMaybe(stream, state); + } + function onwriteDrain(stream, state) { + if (state.length === 0 && state.needDrain) { + state.needDrain = false; + stream.emit("drain"); + } + } + function clearBuffer(stream, state) { + state.bufferProcessing = true; + if (stream._writev && state.buffer.length > 1) { + var cbs = []; + for (var c = 0; c < state.buffer.length; c++) + cbs.push(state.buffer[c].callback); + state.pendingcb++; + doWrite(stream, state, true, state.length, state.buffer, "", function(err) { + for (var i = 0; i < cbs.length; i++) { + state.pendingcb--; + cbs[i](err); + } + }); + state.buffer = []; + } else { + for (var c = 0; c < state.buffer.length; c++) { + var entry = state.buffer[c]; + var chunk = entry.chunk; + var encoding = entry.encoding; + var cb = entry.callback; + var len = state.objectMode ? 1 : chunk.length; + doWrite(stream, state, false, len, chunk, encoding, cb); + if (state.writing) { + c++; + break; + } + } + if (c < state.buffer.length) + state.buffer = state.buffer.slice(c); + else + state.buffer.length = 0; + } + state.bufferProcessing = false; + } + Writable.prototype._write = function(chunk, encoding, cb) { + cb(new Error("not implemented")); + }; + Writable.prototype._writev = null; + Writable.prototype.end = function(chunk, encoding, cb) { + var state = this._writableState; + if (util.isFunction(chunk)) { + cb = chunk; + chunk = null; + encoding = null; + } else if (util.isFunction(encoding)) { + cb = encoding; + encoding = null; + } + if (!util.isNullOrUndefined(chunk)) + this.write(chunk, encoding); + if (state.corked) { + state.corked = 1; + this.uncork(); + } + if (!state.ending && !state.finished) + endWritable(this, state, cb); + }; + function needFinish(stream, state) { + return state.ending && state.length === 0 && !state.finished && !state.writing; + } + function prefinish(stream, state) { + if (!state.prefinished) { + state.prefinished = true; + stream.emit("prefinish"); + } + } + function finishMaybe(stream, state) { + var need = needFinish(stream, state); + if (need) { + if (state.pendingcb === 0) { + prefinish(stream, state); + state.finished = true; + stream.emit("finish"); + } else + prefinish(stream, state); + } + return need; + } + function endWritable(stream, state, cb) { + state.ending = true; + finishMaybe(stream, state); + if (cb) { + if (state.finished) + process.nextTick(cb); + else + stream.once("finish", cb); + } + state.ended = true; + } + } +}); + +// node_modules/readable-stream/lib/_stream_duplex.js +var require_stream_duplex = __commonJS({ + "node_modules/readable-stream/lib/_stream_duplex.js"(exports2, module2) { + module2.exports = Duplex; + var objectKeys = Object.keys || function(obj) { + var keys = []; + for (var key in obj) + keys.push(key); + return keys; + }; + var util = require_util3(); + util.inherits = require_inherits(); + var Readable = require_stream_readable(); + var Writable = require_stream_writable(); + util.inherits(Duplex, Readable); + forEach(objectKeys(Writable.prototype), function(method) { + if (!Duplex.prototype[method]) + Duplex.prototype[method] = Writable.prototype[method]; + }); + function Duplex(options2) { + if (!(this instanceof Duplex)) + return new Duplex(options2); + Readable.call(this, options2); + Writable.call(this, options2); + if (options2 && options2.readable === false) + this.readable = false; + if (options2 && options2.writable === false) + this.writable = false; + this.allowHalfOpen = true; + if (options2 && options2.allowHalfOpen === false) + this.allowHalfOpen = false; + this.once("end", onend); + } + function onend() { + if (this.allowHalfOpen || this._writableState.ended) + return; + process.nextTick(this.end.bind(this)); + } + function forEach(xs2, f) { + for (var i = 0, l = xs2.length; i < l; i++) { + f(xs2[i], i); + } + } + } +}); + +// node_modules/readable-stream/duplex.js +var require_duplex = __commonJS({ + "node_modules/readable-stream/duplex.js"(exports2, module2) { + module2.exports = require_stream_duplex(); + } +}); + +// node_modules/amqplib/lib/heartbeat.js +var require_heartbeat = __commonJS({ + "node_modules/amqplib/lib/heartbeat.js"(exports2, module2) { + "use strict"; + var inherits = require("util").inherits; + var EventEmitter = require("events").EventEmitter; + module2.exports.UNITS_TO_MS = 1e3; + function Heart(interval, checkSend, checkRecv) { + EventEmitter.call(this); + this.interval = interval; + var intervalMs = interval * module2.exports.UNITS_TO_MS; + var beat = this.emit.bind(this, "beat"); + var timeout = this.emit.bind(this, "timeout"); + this.sendTimer = setInterval( + this.runHeartbeat.bind(this, checkSend, beat), + intervalMs / 2 + ); + var recvMissed = 0; + function missedTwo() { + if (!checkRecv()) + return ++recvMissed < 2; + else { + recvMissed = 0; + return true; + } + } + this.recvTimer = setInterval( + this.runHeartbeat.bind(this, missedTwo, timeout), + intervalMs + ); + } + inherits(Heart, EventEmitter); + module2.exports.Heart = Heart; + Heart.prototype.clear = function() { + clearInterval(this.sendTimer); + clearInterval(this.recvTimer); + }; + Heart.prototype.runHeartbeat = function(check, fail) { + if (!check()) + fail(); + }; + } +}); + +// node_modules/amqplib/lib/format.js +var require_format = __commonJS({ + "node_modules/amqplib/lib/format.js"(exports2, module2) { + "use strict"; + var defs = require_defs(); + var format = require("util").format; + var inherits = require("util").inherits; + var HEARTBEAT = require_frame().HEARTBEAT; + module2.exports.closeMessage = function(close) { + var code = close.fields.replyCode; + return format( + '%d (%s) with message "%s"', + code, + defs.constant_strs[code], + close.fields.replyText + ); + }; + module2.exports.methodName = function(id) { + return defs.info(id).name; + }; + module2.exports.inspect = function(frame, showFields) { + if (frame === HEARTBEAT) { + return ""; + } else if (!frame.id) { + return format( + "", + frame.channel, + frame.size + ); + } else { + var info2 = defs.info(frame.id); + return format( + "<%s channel:%d%s>", + info2.name, + frame.channel, + showFields ? " " + JSON.stringify(frame.fields, void 0, 2) : "" + ); + } + }; + } +}); + +// node_modules/amqplib/lib/bitset.js +var require_bitset = __commonJS({ + "node_modules/amqplib/lib/bitset.js"(exports2, module2) { + "use strict"; + var BitSet = class { + /** + * @param {number} [size] + */ + constructor(size) { + if (size) { + const numWords = Math.ceil(size / 32); + this.words = new Array(numWords); + } else { + this.words = []; + } + this.wordsInUse = 0; + } + /** + * @param {number} numWords + */ + ensureSize(numWords) { + const wordsPresent = this.words.length; + if (wordsPresent < numWords) { + this.words = this.words.concat(new Array(numWords - wordsPresent)); + } + } + /** + * @param {number} bitIndex + */ + set(bitIndex) { + const w2 = wordIndex(bitIndex); + if (w2 >= this.wordsInUse) { + this.ensureSize(w2 + 1); + this.wordsInUse = w2 + 1; + } + const bit = 1 << bitIndex; + this.words[w2] |= bit; + } + /** + * @param {number} bitIndex + */ + clear(bitIndex) { + const w2 = wordIndex(bitIndex); + if (w2 >= this.wordsInUse) + return; + const mask = ~(1 << bitIndex); + this.words[w2] &= mask; + } + /** + * @param {number} bitIndex + */ + get(bitIndex) { + const w2 = wordIndex(bitIndex); + if (w2 >= this.wordsInUse) + return false; + const bit = 1 << bitIndex; + return !!(this.words[w2] & bit); + } + /** + * Give the next bit that is set on or after fromIndex, or -1 if no such bit + * + * @param {number} fromIndex + */ + nextSetBit(fromIndex) { + let w2 = wordIndex(fromIndex); + if (w2 >= this.wordsInUse) + return -1; + let word = this.words[w2] & 4294967295 << fromIndex; + while (true) { + if (word) + return w2 * 32 + trailingZeros(word); + w2++; + if (w2 === this.wordsInUse) + return -1; + word = this.words[w2]; + } + } + /** + * @param {number} fromIndex + */ + nextClearBit(fromIndex) { + let w2 = wordIndex(fromIndex); + if (w2 >= this.wordsInUse) + return fromIndex; + let word = ~this.words[w2] & 4294967295 << fromIndex; + while (true) { + if (word) + return w2 * 32 + trailingZeros(word); + w2++; + if (w2 == this.wordsInUse) + return w2 * 32; + word = ~this.words[w2]; + } + } + }; + function wordIndex(bitIndex) { + return Math.floor(bitIndex / 32); + } + function trailingZeros(i) { + if (i === 0) + return 32; + let y, n = 31; + y = i << 16; + if (y != 0) { + n = n - 16; + i = y; + } + y = i << 8; + if (y != 0) { + n = n - 8; + i = y; + } + y = i << 4; + if (y != 0) { + n = n - 4; + i = y; + } + y = i << 2; + if (y != 0) { + n = n - 2; + i = y; + } + return n - (i << 1 >>> 31); + } + module2.exports.BitSet = BitSet; + } +}); + +// node_modules/readable-stream/lib/_stream_transform.js +var require_stream_transform = __commonJS({ + "node_modules/readable-stream/lib/_stream_transform.js"(exports2, module2) { + module2.exports = Transform; + var Duplex = require_stream_duplex(); + var util = require_util3(); + util.inherits = require_inherits(); + util.inherits(Transform, Duplex); + function TransformState(options2, stream) { + this.afterTransform = function(er, data) { + return afterTransform(stream, er, data); + }; + this.needTransform = false; + this.transforming = false; + this.writecb = null; + this.writechunk = null; + } + function afterTransform(stream, er, data) { + var ts2 = stream._transformState; + ts2.transforming = false; + var cb = ts2.writecb; + if (!cb) + return stream.emit("error", new Error("no writecb in Transform class")); + ts2.writechunk = null; + ts2.writecb = null; + if (!util.isNullOrUndefined(data)) + stream.push(data); + if (cb) + cb(er); + var rs2 = stream._readableState; + rs2.reading = false; + if (rs2.needReadable || rs2.length < rs2.highWaterMark) { + stream._read(rs2.highWaterMark); + } + } + function Transform(options2) { + if (!(this instanceof Transform)) + return new Transform(options2); + Duplex.call(this, options2); + this._transformState = new TransformState(options2, this); + var stream = this; + this._readableState.needReadable = true; + this._readableState.sync = false; + this.once("prefinish", function() { + if (util.isFunction(this._flush)) + this._flush(function(er) { + done(stream, er); + }); + else + done(stream); + }); + } + Transform.prototype.push = function(chunk, encoding) { + this._transformState.needTransform = false; + return Duplex.prototype.push.call(this, chunk, encoding); + }; + Transform.prototype._transform = function(chunk, encoding, cb) { + throw new Error("not implemented"); + }; + Transform.prototype._write = function(chunk, encoding, cb) { + var ts2 = this._transformState; + ts2.writecb = cb; + ts2.writechunk = chunk; + ts2.writeencoding = encoding; + if (!ts2.transforming) { + var rs2 = this._readableState; + if (ts2.needTransform || rs2.needReadable || rs2.length < rs2.highWaterMark) + this._read(rs2.highWaterMark); + } + }; + Transform.prototype._read = function(n) { + var ts2 = this._transformState; + if (!util.isNull(ts2.writechunk) && ts2.writecb && !ts2.transforming) { + ts2.transforming = true; + this._transform(ts2.writechunk, ts2.writeencoding, ts2.afterTransform); + } else { + ts2.needTransform = true; + } + }; + function done(stream, er) { + if (er) + return stream.emit("error", er); + var ws2 = stream._writableState; + var ts2 = stream._transformState; + if (ws2.length) + throw new Error("calling transform done when ws.length != 0"); + if (ts2.transforming) + throw new Error("calling transform done when still transforming"); + return stream.push(null); + } + } +}); + +// node_modules/readable-stream/lib/_stream_passthrough.js +var require_stream_passthrough = __commonJS({ + "node_modules/readable-stream/lib/_stream_passthrough.js"(exports2, module2) { + module2.exports = PassThrough; + var Transform = require_stream_transform(); + var util = require_util3(); + util.inherits = require_inherits(); + util.inherits(PassThrough, Transform); + function PassThrough(options2) { + if (!(this instanceof PassThrough)) + return new PassThrough(options2); + Transform.call(this, options2); + } + PassThrough.prototype._transform = function(chunk, encoding, cb) { + cb(null, chunk); + }; + } +}); + +// node_modules/readable-stream/passthrough.js +var require_passthrough = __commonJS({ + "node_modules/readable-stream/passthrough.js"(exports2, module2) { + module2.exports = require_stream_passthrough(); + } +}); + +// node_modules/amqplib/lib/error.js +var require_error2 = __commonJS({ + "node_modules/amqplib/lib/error.js"(exports2, module2) { + var inherits = require("util").inherits; + function trimStack(stack, num) { + return stack && stack.split("\n").slice(num).join("\n"); + } + function IllegalOperationError(msg2, stack) { + var tmp = new Error(); + this.message = msg2; + this.stack = this.toString() + "\n" + trimStack(tmp.stack, 2); + this.stackAtStateChange = stack; + } + inherits(IllegalOperationError, Error); + IllegalOperationError.prototype.name = "IllegalOperationError"; + function stackCapture(reason) { + var e = new Error(); + return "Stack capture: " + reason + "\n" + trimStack(e.stack, 2); + } + module2.exports.IllegalOperationError = IllegalOperationError; + module2.exports.stackCapture = stackCapture; + } +}); + +// node_modules/amqplib/lib/connection.js +var require_connection = __commonJS({ + "node_modules/amqplib/lib/connection.js"(exports2, module2) { + "use strict"; + var defs = require_defs(); + var constants = defs.constants; + var frame = require_frame(); + var HEARTBEAT = frame.HEARTBEAT; + var Mux = require_mux().Mux; + var Duplex = require("stream").Duplex || require_duplex(); + var EventEmitter = require("events").EventEmitter; + var Heart = require_heartbeat().Heart; + var methodName = require_format().methodName; + var closeMsg = require_format().closeMessage; + var inspect = require_format().inspect; + var BitSet = require_bitset().BitSet; + var inherits = require("util").inherits; + var fmt = require("util").format; + var PassThrough = require("stream").PassThrough || require_passthrough(); + var IllegalOperationError = require_error2().IllegalOperationError; + var stackCapture = require_error2().stackCapture; + var DEFAULT_WRITE_HWM = 1024; + var SINGLE_CHUNK_THRESHOLD = 2048; + function Connection(underlying) { + EventEmitter.call(this); + var stream = this.stream = wrapStream(underlying); + this.muxer = new Mux(stream); + this.rest = Buffer.alloc(0); + this.frameMax = constants.FRAME_MIN_SIZE; + this.sentSinceLastCheck = false; + this.recvSinceLastCheck = false; + this.expectSocketClose = false; + this.freeChannels = new BitSet(); + this.channels = [{ + channel: { accept: channel0(this) }, + buffer: underlying + }]; + } + inherits(Connection, EventEmitter); + var C = Connection.prototype; + function mainAccept(frame2) { + var rec = this.channels[frame2.channel]; + if (rec) { + return rec.channel.accept(frame2); + } else + this.closeWithError( + fmt("Frame on unknown channel %d", frame2.channel), + constants.CHANNEL_ERROR, + new Error(fmt( + "Frame on unknown channel: %s", + inspect(frame2, false) + )) + ); + } + function channel0(connection) { + return function(f) { + if (f === HEARTBEAT) + ; + else if (f.id === defs.ConnectionClose) { + connection.sendMethod(0, defs.ConnectionCloseOk, {}); + var emsg = fmt("Connection closed: %s", closeMsg(f)); + var s = stackCapture(emsg); + var e = new Error(emsg); + e.code = f.fields.replyCode; + if (isFatalError(e)) { + connection.emit("error", e); + } + connection.toClosed(s, e); + } else if (f.id === defs.ConnectionBlocked) { + connection.emit("blocked", f.fields.reason); + } else if (f.id === defs.ConnectionUnblocked) { + connection.emit("unblocked"); + } else { + connection.closeWithError( + fmt("Unexpected frame on channel 0"), + constants.UNEXPECTED_FRAME, + new Error(fmt( + "Unexpected frame on channel 0: %s", + inspect(f, false) + )) + ); + } + }; + } + C.sendProtocolHeader = function() { + this.sendBytes(frame.PROTOCOL_HEADER); + }; + C.open = function(allFields, openCallback0) { + var self2 = this; + var openCallback = openCallback0 || function() { + }; + var tunedOptions = Object.create(allFields); + function wait(k2) { + self2.step(function(err, frame2) { + if (err !== null) + bail(err); + else if (frame2.channel !== 0) { + bail(new Error( + fmt( + "Frame on channel != 0 during handshake: %s", + inspect(frame2, false) + ) + )); + } else + k2(frame2); + }); + } + function expect(Method, k2) { + wait(function(frame2) { + if (frame2.id === Method) + k2(frame2); + else { + bail(new Error( + fmt( + "Expected %s; got %s", + methodName(Method), + inspect(frame2, false) + ) + )); + } + }); + } + function bail(err) { + openCallback(err); + } + function send(Method) { + self2.sendMethod(0, Method, tunedOptions); + } + function negotiate(server2, desired) { + if (server2 === 0 || desired === 0) { + return Math.max(server2, desired); + } else { + return Math.min(server2, desired); + } + } + function onStart(start) { + var mechanisms = start.fields.mechanisms.toString().split(" "); + if (mechanisms.indexOf(allFields.mechanism) < 0) { + bail(new Error(fmt( + "SASL mechanism %s is not provided by the server", + allFields.mechanism + ))); + return; + } + self2.serverProperties = start.fields.serverProperties; + try { + send(defs.ConnectionStartOk); + } catch (err) { + bail(err); + return; + } + wait(afterStartOk); + } + function afterStartOk(reply) { + switch (reply.id) { + case defs.ConnectionSecure: + bail(new Error( + "Wasn't expecting to have to go through secure" + )); + break; + case defs.ConnectionClose: + bail(new Error(fmt( + "Handshake terminated by server: %s", + closeMsg(reply) + ))); + break; + case defs.ConnectionTune: + var fields = reply.fields; + tunedOptions.frameMax = negotiate(fields.frameMax, allFields.frameMax); + tunedOptions.channelMax = negotiate(fields.channelMax, allFields.channelMax); + tunedOptions.heartbeat = negotiate(fields.heartbeat, allFields.heartbeat); + try { + send(defs.ConnectionTuneOk); + send(defs.ConnectionOpen); + } catch (err) { + bail(err); + return; + } + expect(defs.ConnectionOpenOk, onOpenOk); + break; + default: + bail(new Error( + fmt( + "Expected connection.secure, connection.close, or connection.tune during handshake; got %s", + inspect(reply, false) + ) + )); + break; + } + } + function onOpenOk(openOk) { + self2.channelMax = tunedOptions.channelMax || 65535; + self2.frameMax = tunedOptions.frameMax || 4294967295; + self2.heartbeat = tunedOptions.heartbeat; + self2.heartbeater = self2.startHeartbeater(); + self2.accept = mainAccept; + succeed(openOk); + } + function endWhileOpening(err) { + bail(err || new Error("Socket closed abruptly during opening handshake")); + } + this.stream.on("end", endWhileOpening); + this.stream.on("error", endWhileOpening); + function succeed(ok) { + self2.stream.removeListener("end", endWhileOpening); + self2.stream.removeListener("error", endWhileOpening); + self2.stream.on("error", self2.onSocketError.bind(self2)); + self2.stream.on("end", self2.onSocketError.bind( + self2, + new Error("Unexpected close") + )); + self2.on("frameError", self2.onSocketError.bind(self2)); + self2.acceptLoop(); + openCallback(null, ok); + } + this.sendProtocolHeader(); + expect(defs.ConnectionStart, onStart); + }; + C.close = function(closeCallback) { + var k2 = closeCallback && function() { + closeCallback(null); + }; + this.closeBecause("Cheers, thanks", constants.REPLY_SUCCESS, k2); + }; + C.closeBecause = function(reason, code, k2) { + this.sendMethod(0, defs.ConnectionClose, { + replyText: reason, + replyCode: code, + methodId: 0, + classId: 0 + }); + var s = stackCapture("closeBecause called: " + reason); + this.toClosing(s, k2); + }; + C.closeWithError = function(reason, code, error2) { + this.emit("error", error2); + this.closeBecause(reason, code); + }; + C.onSocketError = function(err) { + if (!this.expectSocketClose) { + this.expectSocketClose = true; + this.emit("error", err); + var s = stackCapture("Socket error"); + this.toClosed(s, err); + } + }; + function invalidOp(msg2, stack) { + return function() { + throw new IllegalOperationError(msg2, stack); + }; + } + function invalidateSend(conn, msg2, stack) { + conn.sendMethod = conn.sendContent = conn.sendMessage = invalidOp(msg2, stack); + } + C.toClosing = function(capturedStack, k2) { + var send = this.sendMethod.bind(this); + this.accept = function(f) { + if (f.id === defs.ConnectionCloseOk) { + if (k2) + k2(); + var s = stackCapture("ConnectionCloseOk received"); + this.toClosed(s, void 0); + } else if (f.id === defs.ConnectionClose) { + send(0, defs.ConnectionCloseOk, {}); + } + }; + invalidateSend(this, "Connection closing", capturedStack); + }; + C._closeChannels = function(capturedStack) { + for (var i = 1; i < this.channels.length; i++) { + var ch = this.channels[i]; + if (ch !== null) { + ch.channel.toClosed(capturedStack); + } + } + }; + C.toClosed = function(capturedStack, maybeErr) { + this._closeChannels(capturedStack); + var info2 = fmt( + "Connection closed (%s)", + maybeErr ? maybeErr.toString() : "by client" + ); + invalidateSend(this, info2, capturedStack); + this.accept = invalidOp(info2, capturedStack); + this.close = function(cb) { + cb && cb(new IllegalOperationError(info2, capturedStack)); + }; + if (this.heartbeater) + this.heartbeater.clear(); + this.expectSocketClose = true; + this.stream.end(); + this.emit("close", maybeErr); + }; + C.startHeartbeater = function() { + if (this.heartbeat === 0) + return null; + else { + var self2 = this; + var hb = new Heart( + this.heartbeat, + this.checkSend.bind(this), + this.checkRecv.bind(this) + ); + hb.on("timeout", function() { + var hberr = new Error("Heartbeat timeout"); + self2.emit("error", hberr); + var s = stackCapture("Heartbeat timeout"); + self2.toClosed(s, hberr); + }); + hb.on("beat", function() { + self2.sendHeartbeat(); + }); + return hb; + } + }; + C.freshChannel = function(channel, options2) { + var next = this.freeChannels.nextClearBit(1); + if (next < 0 || next > this.channelMax) + throw new Error("No channels left to allocate"); + this.freeChannels.set(next); + var hwm = options2 && options2.highWaterMark || DEFAULT_WRITE_HWM; + var writeBuffer = new PassThrough({ + objectMode: true, + highWaterMark: hwm + }); + this.channels[next] = { channel, buffer: writeBuffer }; + writeBuffer.on("drain", function() { + channel.onBufferDrain(); + }); + this.muxer.pipeFrom(writeBuffer); + return next; + }; + C.releaseChannel = function(channel) { + this.freeChannels.clear(channel); + var buffer = this.channels[channel].buffer; + buffer.end(); + this.channels[channel] = null; + }; + C.acceptLoop = function() { + var self2 = this; + function go2() { + try { + var f; + while (f = self2.recvFrame()) + self2.accept(f); + } catch (e) { + self2.emit("frameError", e); + } + } + self2.stream.on("readable", go2); + go2(); + }; + C.step = function(cb) { + var self2 = this; + function recv() { + var f; + try { + f = self2.recvFrame(); + } catch (e) { + cb(e, null); + return; + } + if (f) + cb(null, f); + else + self2.stream.once("readable", recv); + } + recv(); + }; + C.checkSend = function() { + var check = this.sentSinceLastCheck; + this.sentSinceLastCheck = false; + return check; + }; + C.checkRecv = function() { + var check = this.recvSinceLastCheck; + this.recvSinceLastCheck = false; + return check; + }; + C.sendBytes = function(bytes) { + this.sentSinceLastCheck = true; + this.stream.write(bytes); + }; + C.sendHeartbeat = function() { + return this.sendBytes(frame.HEARTBEAT_BUF); + }; + var encodeMethod = defs.encodeMethod; + var encodeProperties = defs.encodeProperties; + C.sendMethod = function(channel, Method, fields) { + var frame2 = encodeMethod(Method, channel, fields); + this.sentSinceLastCheck = true; + var buffer = this.channels[channel].buffer; + return buffer.write(frame2); + }; + C.sendMessage = function(channel, Method, fields, Properties, props, content) { + if (!Buffer.isBuffer(content)) + throw new TypeError("content is not a buffer"); + var mframe = encodeMethod(Method, channel, fields); + var pframe = encodeProperties( + Properties, + channel, + content.length, + props + ); + var buffer = this.channels[channel].buffer; + this.sentSinceLastCheck = true; + var methodHeaderLen = mframe.length + pframe.length; + var bodyLen = content.length > 0 ? content.length + FRAME_OVERHEAD : 0; + var allLen = methodHeaderLen + bodyLen; + if (allLen < SINGLE_CHUNK_THRESHOLD) { + var all = Buffer.allocUnsafe(allLen); + var offset = mframe.copy(all, 0); + offset += pframe.copy(all, offset); + if (bodyLen > 0) + makeBodyFrame(channel, content).copy(all, offset); + return buffer.write(all); + } else { + if (methodHeaderLen < SINGLE_CHUNK_THRESHOLD) { + var both = Buffer.allocUnsafe(methodHeaderLen); + var offset = mframe.copy(both, 0); + pframe.copy(both, offset); + buffer.write(both); + } else { + buffer.write(mframe); + buffer.write(pframe); + } + return this.sendContent(channel, content); + } + }; + var FRAME_OVERHEAD = defs.FRAME_OVERHEAD; + var makeBodyFrame = frame.makeBodyFrame; + C.sendContent = function(channel, body) { + if (!Buffer.isBuffer(body)) { + throw new TypeError(fmt("Expected buffer; got %s", body)); + } + var writeResult = true; + var buffer = this.channels[channel].buffer; + var maxBody = this.frameMax - FRAME_OVERHEAD; + for (var offset = 0; offset < body.length; offset += maxBody) { + var end = offset + maxBody; + var slice = end > body.length ? body.slice(offset) : body.slice(offset, end); + var bodyFrame = makeBodyFrame(channel, slice); + writeResult = buffer.write(bodyFrame); + } + this.sentSinceLastCheck = true; + return writeResult; + }; + var parseFrame = frame.parseFrame; + var decodeFrame = frame.decodeFrame; + C.recvFrame = function() { + var frame2 = parseFrame(this.rest, this.frameMax); + if (!frame2) { + var incoming = this.stream.read(); + if (incoming === null) { + return false; + } else { + this.recvSinceLastCheck = true; + this.rest = Buffer.concat([this.rest, incoming]); + return this.recvFrame(); + } + } else { + this.rest = frame2.rest; + return decodeFrame(frame2); + } + }; + function wrapStream(s) { + if (s instanceof Duplex) + return s; + else { + var ws2 = new Duplex(); + ws2.wrap(s); + ws2._write = function(chunk, encoding, callback) { + return s.write(chunk, encoding, callback); + }; + return ws2; + } + } + function isFatalError(error2) { + switch (error2 && error2.code) { + case defs.constants.CONNECTION_FORCED: + case defs.constants.REPLY_SUCCESS: + return false; + default: + return true; + } + } + module2.exports.Connection = Connection; + module2.exports.isFatalError = isFatalError; + } +}); + +// node_modules/amqplib/lib/credentials.js +var require_credentials = __commonJS({ + "node_modules/amqplib/lib/credentials.js"(exports2, module2) { + var codec = require_codec(); + module2.exports.plain = function(user, passwd) { + return { + mechanism: "PLAIN", + response: function() { + return Buffer.from(["", user, passwd].join(String.fromCharCode(0))); + }, + username: user, + password: passwd + }; + }; + module2.exports.amqplain = function(user, passwd) { + return { + mechanism: "AMQPLAIN", + response: function() { + const buffer = Buffer.alloc(16384); + const size = codec.encodeTable(buffer, { LOGIN: user, PASSWORD: passwd }, 0); + return buffer.slice(4, size); + }, + username: user, + password: passwd + }; + }; + module2.exports.external = function() { + return { + mechanism: "EXTERNAL", + response: function() { + return Buffer.from(""); + } + }; + }; + } +}); + +// node_modules/amqplib/package.json +var require_package3 = __commonJS({ + "node_modules/amqplib/package.json"(exports2, module2) { + module2.exports = { + name: "amqplib", + homepage: "http://amqp-node.github.io/amqplib/", + main: "./channel_api.js", + version: "0.10.3", + description: "An AMQP 0-9-1 (e.g., RabbitMQ) library and client.", + repository: { + type: "git", + url: "https://github.com/amqp-node/amqplib.git" + }, + engines: { + node: ">=10" + }, + dependencies: { + "@acuminous/bitsyntax": "^0.1.2", + "buffer-more-ints": "~1.0.0", + "readable-stream": "1.x >=1.1.9", + "url-parse": "~1.5.10" + }, + devDependencies: { + claire: "0.4.1", + mocha: "^9.2.2", + nyc: "^15.1.0", + "uglify-js": "2.8.x" + }, + scripts: { + test: "make test", + prepare: "make" + }, + keywords: [ + "AMQP", + "AMQP 0-9-1", + "RabbitMQ" + ], + author: "Michael Bridgen ", + license: "MIT" + }; + } +}); + +// node_modules/amqplib/lib/connect.js +var require_connect = __commonJS({ + "node_modules/amqplib/lib/connect.js"(exports2, module2) { + "use strict"; + var URL2 = require_url_parse(); + var QS = require("querystring"); + var Connection = require_connection().Connection; + var fmt = require("util").format; + var credentials2 = require_credentials(); + function copyInto(obj, target) { + var keys = Object.keys(obj); + var i = keys.length; + while (i--) { + var k2 = keys[i]; + target[k2] = obj[k2]; + } + return target; + } + function clone(obj) { + return copyInto(obj, {}); + } + var CLIENT_PROPERTIES = { + "product": "amqplib", + "version": require_package3().version, + "platform": fmt("Node.JS %s", process.version), + "information": "http://squaremo.github.io/amqp.node", + "capabilities": { + "publisher_confirms": true, + "exchange_exchange_bindings": true, + "basic.nack": true, + "consumer_cancel_notify": true, + "connection.blocked": true, + "authentication_failure_close": true + } + }; + function openFrames(vhost, query, credentials3, extraClientProperties) { + if (!vhost) + vhost = "/"; + else + vhost = QS.unescape(vhost); + var query = query || {}; + function intOrDefault(val, def) { + return val === void 0 ? def : parseInt(val); + } + var clientProperties = Object.create(CLIENT_PROPERTIES); + return { + // start-ok + "clientProperties": copyInto(extraClientProperties, clientProperties), + "mechanism": credentials3.mechanism, + "response": credentials3.response(), + "locale": query.locale || "en_US", + // tune-ok + "channelMax": intOrDefault(query.channelMax, 0), + "frameMax": intOrDefault(query.frameMax, 4096), + "heartbeat": intOrDefault(query.heartbeat, 0), + // open + "virtualHost": vhost, + "capabilities": "", + "insist": 0 + }; + } + function credentialsFromUrl(parts) { + var user = "guest", passwd = "guest"; + if (parts.username != "" || parts.password != "") { + user = parts.username ? unescape(parts.username) : ""; + passwd = parts.password ? unescape(parts.password) : ""; + } + return credentials2.plain(user, passwd); + } + function connect(url, socketOptions, openCallback) { + var sockopts = clone(socketOptions || {}); + url = url || "amqp://localhost"; + var noDelay = !!sockopts.noDelay; + var timeout = sockopts.timeout; + var keepAlive = !!sockopts.keepAlive; + var keepAliveDelay = sockopts.keepAliveDelay || 0; + var extraClientProperties = sockopts.clientProperties || {}; + var protocol, fields; + if (typeof url === "object") { + protocol = (url.protocol || "amqp") + ":"; + sockopts.host = url.hostname; + sockopts.servername = sockopts.servername || url.hostname; + sockopts.port = url.port || (protocol === "amqp:" ? 5672 : 5671); + var user, pass; + if (url.username == void 0 && url.password == void 0) { + user = "guest"; + pass = "guest"; + } else { + user = url.username || ""; + pass = url.password || ""; + } + var config2 = { + locale: url.locale, + channelMax: url.channelMax, + frameMax: url.frameMax, + heartbeat: url.heartbeat + }; + fields = openFrames(url.vhost, config2, sockopts.credentials || credentials2.plain(user, pass), extraClientProperties); + } else { + var parts = URL2(url, true); + protocol = parts.protocol; + sockopts.host = parts.hostname; + sockopts.servername = sockopts.servername || parts.hostname; + sockopts.port = parseInt(parts.port) || (protocol === "amqp:" ? 5672 : 5671); + var vhost = parts.pathname ? parts.pathname.substr(1) : null; + fields = openFrames(vhost, parts.query, sockopts.credentials || credentialsFromUrl(parts), extraClientProperties); + } + var sockok = false; + var sock; + function onConnect() { + sockok = true; + sock.setNoDelay(noDelay); + if (keepAlive) + sock.setKeepAlive(keepAlive, keepAliveDelay); + var c = new Connection(sock); + c.open(fields, function(err, ok) { + if (timeout) + sock.setTimeout(0); + if (err === null) { + openCallback(null, c); + } else { + sock.end(); + sock.destroy(); + openCallback(err); + } + }); + } + if (protocol === "amqp:") { + sock = require("net").connect(sockopts, onConnect); + } else if (protocol === "amqps:") { + sock = require("tls").connect(sockopts, onConnect); + } else { + throw new Error("Expected amqp: or amqps: as the protocol; got " + protocol); + } + if (timeout) { + sock.setTimeout(timeout, function() { + sock.end(); + sock.destroy(); + openCallback(new Error("connect ETIMEDOUT")); + }); + } + sock.once("error", function(err) { + if (!sockok) + openCallback(err); + }); + } + module2.exports.connect = connect; + module2.exports.credentialsFromUrl = credentialsFromUrl; + } +}); + +// node_modules/amqplib/lib/channel.js +var require_channel2 = __commonJS({ + "node_modules/amqplib/lib/channel.js"(exports2, module2) { + "use strict"; + var defs = require_defs(); + var closeMsg = require_format().closeMessage; + var inspect = require_format().inspect; + var methodName = require_format().methodName; + var assert = require("assert"); + var inherits = require("util").inherits; + var EventEmitter = require("events").EventEmitter; + var fmt = require("util").format; + var IllegalOperationError = require_error2().IllegalOperationError; + var stackCapture = require_error2().stackCapture; + function Channel(connection) { + EventEmitter.call(this); + this.connection = connection; + this.reply = null; + this.pending = []; + this.lwm = 1; + this.unconfirmed = []; + this.on("ack", this.handleConfirm.bind(this, function(cb) { + if (cb) + cb(null); + })); + this.on("nack", this.handleConfirm.bind(this, function(cb) { + if (cb) + cb(new Error("message nacked")); + })); + this.on("close", function() { + var cb; + while (cb = this.unconfirmed.shift()) { + if (cb) + cb(new Error("channel closed")); + } + }); + this.handleMessage = acceptDeliveryOrReturn; + } + inherits(Channel, EventEmitter); + module2.exports.Channel = Channel; + module2.exports.acceptMessage = acceptMessage; + var C = Channel.prototype; + C.allocate = function() { + this.ch = this.connection.freshChannel(this); + return this; + }; + C.sendImmediately = function(method, fields) { + return this.connection.sendMethod(this.ch, method, fields); + }; + C.sendOrEnqueue = function(method, fields, reply) { + if (!this.reply) { + assert(this.pending.length === 0); + this.reply = reply; + this.sendImmediately(method, fields); + } else { + this.pending.push({ + method, + fields, + reply + }); + } + }; + C.sendMessage = function(fields, properties, content) { + return this.connection.sendMessage( + this.ch, + defs.BasicPublish, + fields, + defs.BasicProperties, + properties, + content + ); + }; + C._rpc = function(method, fields, expect, cb) { + var self2 = this; + function reply(err, f) { + if (err === null) { + if (f.id === expect) { + return cb(null, f); + } else { + var expectedName = methodName(expect); + var e = new Error(fmt( + "Expected %s; got %s", + expectedName, + inspect(f, false) + )); + self2.closeWithError( + f.id, + fmt( + "Expected %s; got %s", + expectedName, + methodName(f.id) + ), + defs.constants.UNEXPECTED_FRAME, + e + ); + return cb(e); + } + } else if (err instanceof Error) + return cb(err); + else { + var closeReason = (err.fields.classId << 16) + err.fields.methodId; + var e = method === closeReason ? fmt( + "Operation failed: %s; %s", + methodName(method), + closeMsg(err) + ) : fmt("Channel closed by server: %s", closeMsg(err)); + var closeFrameError = new Error(e); + closeFrameError.code = err.fields.replyCode; + closeFrameError.classId = err.fields.classId; + closeFrameError.methodId = err.fields.methodId; + return cb(closeFrameError); + } + } + this.sendOrEnqueue(method, fields, reply); + }; + function invalidOp(msg2, stack) { + return function() { + throw new IllegalOperationError(msg2, stack); + }; + } + function invalidateSend(ch, msg2, stack) { + ch.sendImmediately = ch.sendOrEnqueue = ch.sendMessage = invalidOp(msg2, stack); + } + C.toClosed = function(capturedStack) { + this._rejectPending(); + invalidateSend(this, "Channel closed", capturedStack); + this.accept = invalidOp("Channel closed", capturedStack); + this.connection.releaseChannel(this.ch); + this.emit("close"); + }; + C.toClosing = function(capturedStack, k2) { + var send = this.sendImmediately.bind(this); + invalidateSend(this, "Channel closing", capturedStack); + this.accept = function(f) { + if (f.id === defs.ChannelCloseOk) { + if (k2) + k2(); + var s = stackCapture("ChannelCloseOk frame received"); + this.toClosed(s); + } else if (f.id === defs.ChannelClose) { + send(defs.ChannelCloseOk, {}); + } + }; + }; + C._rejectPending = function() { + function rej(r) { + r(new Error("Channel ended, no reply will be forthcoming")); + } + if (this.reply !== null) + rej(this.reply); + this.reply = null; + var discard; + while (discard = this.pending.shift()) + rej(discard.reply); + this.pending = null; + }; + C.closeBecause = function(reason, code, k2) { + this.sendImmediately(defs.ChannelClose, { + replyText: reason, + replyCode: code, + methodId: 0, + classId: 0 + }); + var s = stackCapture("closeBecause called: " + reason); + this.toClosing(s, k2); + }; + C.closeWithError = function(id, reason, code, error2) { + var self2 = this; + this.closeBecause(reason, code, function() { + error2.code = code; + if (id) { + error2.classId = defs.info(id).classId; + error2.methodId = defs.info(id).methodId; + } + self2.emit("error", error2); + }); + }; + C.acceptMessageFrame = function(f) { + try { + this.handleMessage = this.handleMessage(f); + } catch (msg2) { + if (typeof msg2 === "string") { + this.closeWithError( + f.id, + msg2, + defs.constants.UNEXPECTED_FRAME, + new Error(msg2) + ); + } else if (msg2 instanceof Error) { + this.closeWithError( + f.id, + "Error while processing message", + defs.constants.INTERNAL_ERROR, + msg2 + ); + } else { + this.closeWithError( + f.id, + "Internal error while processing message", + defs.constants.INTERNAL_ERROR, + new Error(msg2.toString()) + ); + } + } + }; + function acceptDeliveryOrReturn(f) { + var event; + if (f.id === defs.BasicDeliver) + event = "delivery"; + else if (f.id === defs.BasicReturn) + event = "return"; + else + throw fmt( + "Expected BasicDeliver or BasicReturn; got %s", + inspect(f) + ); + var self2 = this; + var fields = f.fields; + return acceptMessage(function(message) { + message.fields = fields; + self2.emit(event, message); + }); + } + function acceptMessage(continuation) { + var totalSize = 0, remaining = 0; + var buffers = null; + var message = { + fields: null, + properties: null, + content: null + }; + return headers; + function headers(f) { + if (f.id === defs.BasicProperties) { + message.properties = f.fields; + totalSize = remaining = f.size; + if (totalSize === 0) { + message.content = Buffer.alloc(0); + continuation(message); + return acceptDeliveryOrReturn; + } else { + return content; + } + } else { + throw "Expected headers frame after delivery"; + } + } + function content(f) { + if (f.content) { + var size = f.content.length; + remaining -= size; + if (remaining === 0) { + if (buffers !== null) { + buffers.push(f.content); + message.content = Buffer.concat(buffers); + } else { + message.content = f.content; + } + continuation(message); + return acceptDeliveryOrReturn; + } else if (remaining < 0) { + throw fmt( + "Too much content sent! Expected %d bytes", + totalSize + ); + } else { + if (buffers !== null) + buffers.push(f.content); + else + buffers = [f.content]; + return content; + } + } else + throw "Expected content frame after headers"; + } + } + C.handleConfirm = function(handle, f) { + var tag = f.deliveryTag; + var multi = f.multiple; + if (multi) { + var confirmed = this.unconfirmed.splice(0, tag - this.lwm + 1); + this.lwm = tag + 1; + confirmed.forEach(handle); + } else { + var c; + if (tag === this.lwm) { + c = this.unconfirmed.shift(); + this.lwm++; + while (this.unconfirmed[0] === null) { + this.unconfirmed.shift(); + this.lwm++; + } + } else { + c = this.unconfirmed[tag - this.lwm]; + this.unconfirmed[tag - this.lwm] = null; + } + handle(c); + } + }; + C.pushConfirmCallback = function(cb) { + this.unconfirmed.push(cb || false); + }; + C.accept = function(f) { + switch (f.id) { + case void 0: + case defs.BasicDeliver: + case defs.BasicReturn: + case defs.BasicProperties: + return this.acceptMessageFrame(f); + case defs.BasicAck: + return this.emit("ack", f.fields); + case defs.BasicNack: + return this.emit("nack", f.fields); + case defs.BasicCancel: + return this.emit("cancel", f.fields); + case defs.ChannelClose: + if (this.reply) { + var reply = this.reply; + this.reply = null; + reply(f); + } + var emsg = "Channel closed by server: " + closeMsg(f); + this.sendImmediately(defs.ChannelCloseOk, {}); + var error2 = new Error(emsg); + error2.code = f.fields.replyCode; + error2.classId = f.fields.classId; + error2.methodId = f.fields.methodId; + this.emit("error", error2); + var s = stackCapture(emsg); + this.toClosed(s); + return; + case defs.BasicFlow: + return this.closeWithError( + f.id, + "Flow not implemented", + defs.constants.NOT_IMPLEMENTED, + new Error("Flow not implemented") + ); + default: + var reply = this.reply; + this.reply = null; + if (this.pending.length > 0) { + var send = this.pending.shift(); + this.reply = send.reply; + this.sendImmediately(send.method, send.fields); + } + return reply(null, f); + } + }; + C.onBufferDrain = function() { + this.emit("drain"); + }; + function BaseChannel(connection) { + Channel.call(this, connection); + this.consumers = /* @__PURE__ */ new Map(); + } + inherits(BaseChannel, Channel); + module2.exports.BaseChannel = BaseChannel; + BaseChannel.prototype.registerConsumer = function(tag, callback) { + this.consumers.set(tag, callback); + }; + BaseChannel.prototype.unregisterConsumer = function(tag) { + this.consumers.delete(tag); + }; + BaseChannel.prototype.dispatchMessage = function(fields, message) { + var consumerTag = fields.consumerTag; + var consumer = this.consumers.get(consumerTag); + if (consumer) { + return consumer(message); + } else { + throw new Error("Unknown consumer: " + consumerTag); + } + }; + BaseChannel.prototype.handleDelivery = function(message) { + return this.dispatchMessage(message.fields, message); + }; + BaseChannel.prototype.handleCancel = function(fields) { + var result = this.dispatchMessage(fields, null); + this.unregisterConsumer(fields.consumerTag); + return result; + }; + } +}); + +// node_modules/amqplib/lib/api_args.js +var require_api_args = __commonJS({ + "node_modules/amqplib/lib/api_args.js"(exports2, module2) { + "use strict"; + function setIfDefined(obj, prop, value) { + if (value != void 0) + obj[prop] = value; + } + var EMPTY_OPTIONS = Object.freeze({}); + var Args = {}; + Args.assertQueue = function(queue, options2) { + queue = queue || ""; + options2 = options2 || EMPTY_OPTIONS; + var argt = Object.create(options2.arguments || null); + setIfDefined(argt, "x-expires", options2.expires); + setIfDefined(argt, "x-message-ttl", options2.messageTtl); + setIfDefined( + argt, + "x-dead-letter-exchange", + options2.deadLetterExchange + ); + setIfDefined( + argt, + "x-dead-letter-routing-key", + options2.deadLetterRoutingKey + ); + setIfDefined(argt, "x-max-length", options2.maxLength); + setIfDefined(argt, "x-max-priority", options2.maxPriority); + setIfDefined(argt, "x-overflow", options2.overflow); + setIfDefined(argt, "x-queue-mode", options2.queueMode); + return { + queue, + exclusive: !!options2.exclusive, + durable: options2.durable === void 0 ? true : options2.durable, + autoDelete: !!options2.autoDelete, + arguments: argt, + passive: false, + // deprecated but we have to include it + ticket: 0, + nowait: false + }; + }; + Args.checkQueue = function(queue) { + return { + queue, + passive: true, + // switch to "completely different" mode + nowait: false, + durable: true, + autoDelete: false, + exclusive: false, + // ignored + ticket: 0 + }; + }; + Args.deleteQueue = function(queue, options2) { + options2 = options2 || EMPTY_OPTIONS; + return { + queue, + ifUnused: !!options2.ifUnused, + ifEmpty: !!options2.ifEmpty, + ticket: 0, + nowait: false + }; + }; + Args.purgeQueue = function(queue) { + return { + queue, + ticket: 0, + nowait: false + }; + }; + Args.bindQueue = function(queue, source, pattern, argt) { + return { + queue, + exchange: source, + routingKey: pattern, + arguments: argt, + ticket: 0, + nowait: false + }; + }; + Args.unbindQueue = function(queue, source, pattern, argt) { + return { + queue, + exchange: source, + routingKey: pattern, + arguments: argt, + ticket: 0, + nowait: false + }; + }; + Args.assertExchange = function(exchange, type, options2) { + options2 = options2 || EMPTY_OPTIONS; + var argt = Object.create(options2.arguments || null); + setIfDefined(argt, "alternate-exchange", options2.alternateExchange); + return { + exchange, + ticket: 0, + type, + passive: false, + durable: options2.durable === void 0 ? true : options2.durable, + autoDelete: !!options2.autoDelete, + internal: !!options2.internal, + nowait: false, + arguments: argt + }; + }; + Args.checkExchange = function(exchange) { + return { + exchange, + passive: true, + // switch to 'may as well be another method' mode + nowait: false, + // ff are ignored + durable: true, + internal: false, + type: "", + autoDelete: false, + ticket: 0 + }; + }; + Args.deleteExchange = function(exchange, options2) { + options2 = options2 || EMPTY_OPTIONS; + return { + exchange, + ifUnused: !!options2.ifUnused, + ticket: 0, + nowait: false + }; + }; + Args.bindExchange = function(dest, source, pattern, argt) { + return { + source, + destination: dest, + routingKey: pattern, + arguments: argt, + ticket: 0, + nowait: false + }; + }; + Args.unbindExchange = function(dest, source, pattern, argt) { + return { + source, + destination: dest, + routingKey: pattern, + arguments: argt, + ticket: 0, + nowait: false + }; + }; + Args.publish = function(exchange, routingKey, options2) { + options2 = options2 || EMPTY_OPTIONS; + function convertCC(cc2) { + if (cc2 === void 0) { + return void 0; + } else if (Array.isArray(cc2)) { + return cc2.map(String); + } else + return [String(cc2)]; + } + var headers = Object.create(options2.headers || null); + setIfDefined(headers, "CC", convertCC(options2.CC)); + setIfDefined(headers, "BCC", convertCC(options2.BCC)); + var deliveryMode; + if (options2.persistent !== void 0) + deliveryMode = options2.persistent ? 2 : 1; + else if (typeof options2.deliveryMode === "number") + deliveryMode = options2.deliveryMode; + else if (options2.deliveryMode) + deliveryMode = 2; + var expiration = options2.expiration; + if (expiration !== void 0) + expiration = expiration.toString(); + return { + // method fields + exchange, + routingKey, + mandatory: !!options2.mandatory, + immediate: false, + // RabbitMQ doesn't implement this any more + ticket: void 0, + // properties + contentType: options2.contentType, + contentEncoding: options2.contentEncoding, + headers, + deliveryMode, + priority: options2.priority, + correlationId: options2.correlationId, + replyTo: options2.replyTo, + expiration, + messageId: options2.messageId, + timestamp: options2.timestamp, + type: options2.type, + userId: options2.userId, + appId: options2.appId, + clusterId: void 0 + }; + }; + Args.consume = function(queue, options2) { + options2 = options2 || EMPTY_OPTIONS; + var argt = Object.create(options2.arguments || null); + setIfDefined(argt, "x-priority", options2.priority); + return { + ticket: 0, + queue, + consumerTag: options2.consumerTag || "", + noLocal: !!options2.noLocal, + noAck: !!options2.noAck, + exclusive: !!options2.exclusive, + nowait: false, + arguments: argt + }; + }; + Args.cancel = function(consumerTag) { + return { + consumerTag, + nowait: false + }; + }; + Args.get = function(queue, options2) { + options2 = options2 || EMPTY_OPTIONS; + return { + ticket: 0, + queue, + noAck: !!options2.noAck + }; + }; + Args.ack = function(tag, allUpTo) { + return { + deliveryTag: tag, + multiple: !!allUpTo + }; + }; + Args.nack = function(tag, allUpTo, requeue) { + return { + deliveryTag: tag, + multiple: !!allUpTo, + requeue: requeue === void 0 ? true : requeue + }; + }; + Args.reject = function(tag, requeue) { + return { + deliveryTag: tag, + requeue: requeue === void 0 ? true : requeue + }; + }; + Args.prefetch = function(count, global2) { + return { + prefetchCount: count || 0, + prefetchSize: 0, + global: !!global2 + }; + }; + Args.recover = function() { + return { requeue: true }; + }; + module2.exports = Object.freeze(Args); + } +}); + +// node_modules/amqplib/lib/channel_model.js +var require_channel_model = __commonJS({ + "node_modules/amqplib/lib/channel_model.js"(exports2, module2) { + "use strict"; + var EventEmitter = require("events"); + var promisify = require("util").promisify; + var defs = require_defs(); + var { BaseChannel } = require_channel2(); + var { acceptMessage } = require_channel2(); + var Args = require_api_args(); + var { inspect } = require_format(); + var ChannelModel = class extends EventEmitter { + constructor(connection) { + super(); + this.connection = connection; + ["error", "close", "blocked", "unblocked"].forEach((ev) => { + connection.on(ev, this.emit.bind(this, ev)); + }); + } + close() { + return promisify(this.connection.close.bind(this.connection))(); + } + async createChannel() { + const channel = new Channel(this.connection); + await channel.open(); + return channel; + } + async createConfirmChannel() { + const channel = new ConfirmChannel(this.connection); + await channel.open(); + await channel.rpc(defs.ConfirmSelect, { nowait: false }, defs.ConfirmSelectOk); + return channel; + } + }; + var Channel = class extends BaseChannel { + constructor(connection) { + super(connection); + this.on("delivery", this.handleDelivery.bind(this)); + this.on("cancel", this.handleCancel.bind(this)); + } + // An RPC that returns a 'proper' promise, which resolves to just the + // response's fields; this is intended to be suitable for implementing + // API procedures. + async rpc(method, fields, expect) { + const f = await promisify((cb) => { + return this._rpc(method, fields, expect, cb); + })(); + return f.fields; + } + // Do the remarkably simple channel open handshake + async open() { + const ch = await this.allocate.bind(this)(); + return ch.rpc( + defs.ChannelOpen, + { outOfBand: "" }, + defs.ChannelOpenOk + ); + } + close() { + return promisify((cb) => { + return this.closeBecause( + "Goodbye", + defs.constants.REPLY_SUCCESS, + cb + ); + })(); + } + // === Public API, declaring queues and stuff === + assertQueue(queue, options2) { + return this.rpc( + defs.QueueDeclare, + Args.assertQueue(queue, options2), + defs.QueueDeclareOk + ); + } + checkQueue(queue) { + return this.rpc( + defs.QueueDeclare, + Args.checkQueue(queue), + defs.QueueDeclareOk + ); + } + deleteQueue(queue, options2) { + return this.rpc( + defs.QueueDelete, + Args.deleteQueue(queue, options2), + defs.QueueDeleteOk + ); + } + purgeQueue(queue) { + return this.rpc( + defs.QueuePurge, + Args.purgeQueue(queue), + defs.QueuePurgeOk + ); + } + bindQueue(queue, source, pattern, argt) { + return this.rpc( + defs.QueueBind, + Args.bindQueue(queue, source, pattern, argt), + defs.QueueBindOk + ); + } + unbindQueue(queue, source, pattern, argt) { + return this.rpc( + defs.QueueUnbind, + Args.unbindQueue(queue, source, pattern, argt), + defs.QueueUnbindOk + ); + } + assertExchange(exchange, type, options2) { + return this.rpc( + defs.ExchangeDeclare, + Args.assertExchange(exchange, type, options2), + defs.ExchangeDeclareOk + ).then((_ok) => { + return { exchange }; + }); + } + checkExchange(exchange) { + return this.rpc( + defs.ExchangeDeclare, + Args.checkExchange(exchange), + defs.ExchangeDeclareOk + ); + } + deleteExchange(name, options2) { + return this.rpc( + defs.ExchangeDelete, + Args.deleteExchange(name, options2), + defs.ExchangeDeleteOk + ); + } + bindExchange(dest, source, pattern, argt) { + return this.rpc( + defs.ExchangeBind, + Args.bindExchange(dest, source, pattern, argt), + defs.ExchangeBindOk + ); + } + unbindExchange(dest, source, pattern, argt) { + return this.rpc( + defs.ExchangeUnbind, + Args.unbindExchange(dest, source, pattern, argt), + defs.ExchangeUnbindOk + ); + } + // Working with messages + publish(exchange, routingKey, content, options2) { + const fieldsAndProps = Args.publish(exchange, routingKey, options2); + return this.sendMessage(fieldsAndProps, fieldsAndProps, content); + } + sendToQueue(queue, content, options2) { + return this.publish("", queue, content, options2); + } + consume(queue, callback, options2) { + const fields = Args.consume(queue, options2); + return new Promise((resolve, reject) => { + this._rpc(defs.BasicConsume, fields, defs.BasicConsumeOk, (err, ok) => { + if (err) + return reject(err); + this.registerConsumer(ok.fields.consumerTag, callback); + resolve(ok.fields); + }); + }); + } + async cancel(consumerTag) { + const ok = await promisify((cb) => { + this._rpc( + defs.BasicCancel, + Args.cancel(consumerTag), + defs.BasicCancelOk, + cb + ); + })().then((ok2) => { + this.unregisterConsumer(consumerTag); + return ok2.fields; + }); + } + get(queue, options2) { + const fields = Args.get(queue, options2); + return new Promise((resolve, reject) => { + this.sendOrEnqueue(defs.BasicGet, fields, (err, f) => { + if (err) + return reject(err); + if (f.id === defs.BasicGetEmpty) { + return resolve(false); + } else if (f.id === defs.BasicGetOk) { + const fields2 = f.fields; + this.handleMessage = acceptMessage((m2) => { + m2.fields = fields2; + resolve(m2); + }); + } else { + reject(new Error(`Unexpected response to BasicGet: ${inspect(f)}`)); + } + }); + }); + } + ack(message, allUpTo) { + this.sendImmediately( + defs.BasicAck, + Args.ack(message.fields.deliveryTag, allUpTo) + ); + } + ackAll() { + this.sendImmediately(defs.BasicAck, Args.ack(0, true)); + } + nack(message, allUpTo, requeue) { + this.sendImmediately( + defs.BasicNack, + Args.nack(message.fields.deliveryTag, allUpTo, requeue) + ); + } + nackAll(requeue) { + this.sendImmediately( + defs.BasicNack, + Args.nack(0, true, requeue) + ); + } + // `Basic.Nack` is not available in older RabbitMQ versions (or in the + // AMQP specification), so you have to use the one-at-a-time + // `Basic.Reject`. This is otherwise synonymous with + // `#nack(message, false, requeue)`. + reject(message, requeue) { + this.sendImmediately( + defs.BasicReject, + Args.reject(message.fields.deliveryTag, requeue) + ); + } + recover() { + return this.rpc( + defs.BasicRecover, + Args.recover(), + defs.BasicRecoverOk + ); + } + qos(count, global2) { + return this.rpc( + defs.BasicQos, + Args.prefetch(count, global2), + defs.BasicQosOk + ); + } + }; + Channel.prototype.prefetch = Channel.prototype.qos; + var ConfirmChannel = class extends Channel { + publish(exchange, routingKey, content, options2, cb) { + this.pushConfirmCallback(cb); + return Channel.prototype.publish.call(this, exchange, routingKey, content, options2); + } + sendToQueue(queue, content, options2, cb) { + return this.publish("", queue, content, options2, cb); + } + waitForConfirms() { + const awaiting = []; + const unconfirmed = this.unconfirmed; + unconfirmed.forEach((val, index) => { + if (val !== null) { + const confirmed = new Promise((resolve, reject) => { + unconfirmed[index] = (err) => { + if (val) + val(err); + if (err === null) + resolve(); + else + reject(err); + }; + }); + awaiting.push(confirmed); + } + }); + if (!this.pending) { + var cb; + while (cb = this.unconfirmed.shift()) { + if (cb) + cb(new Error("channel closed")); + } + } + return Promise.all(awaiting); + } + }; + module2.exports.ConfirmChannel = ConfirmChannel; + module2.exports.Channel = Channel; + module2.exports.ChannelModel = ChannelModel; + } +}); + +// node_modules/amqplib/channel_api.js +var require_channel_api = __commonJS({ + "node_modules/amqplib/channel_api.js"(exports2, module2) { + var raw_connect = require_connect().connect; + var ChannelModel = require_channel_model().ChannelModel; + var promisify = require("util").promisify; + function connect(url, connOptions) { + return promisify(function(cb) { + return raw_connect(url, connOptions, cb); + })().then(function(conn) { + return new ChannelModel(conn); + }); + } + module2.exports.connect = connect; + module2.exports.credentials = require_credentials(); + module2.exports.IllegalOperationError = require_error2().IllegalOperationError; + } +}); + +// node_modules/tslib/tslib.es6.mjs +var tslib_es6_exports = {}; +__export(tslib_es6_exports, { + __addDisposableResource: () => __addDisposableResource, + __assign: () => __assign, + __asyncDelegator: () => __asyncDelegator, + __asyncGenerator: () => __asyncGenerator, + __asyncValues: () => __asyncValues, + __await: () => __await, + __awaiter: () => __awaiter, + __classPrivateFieldGet: () => __classPrivateFieldGet, + __classPrivateFieldIn: () => __classPrivateFieldIn, + __classPrivateFieldSet: () => __classPrivateFieldSet, + __createBinding: () => __createBinding, + __decorate: () => __decorate, + __disposeResources: () => __disposeResources, + __esDecorate: () => __esDecorate, + __exportStar: () => __exportStar, + __extends: () => __extends, + __generator: () => __generator, + __importDefault: () => __importDefault, + __importStar: () => __importStar, + __makeTemplateObject: () => __makeTemplateObject, + __metadata: () => __metadata, + __param: () => __param, + __propKey: () => __propKey, + __read: () => __read, + __rest: () => __rest, + __runInitializers: () => __runInitializers, + __setFunctionName: () => __setFunctionName, + __spread: () => __spread, + __spreadArray: () => __spreadArray, + __spreadArrays: () => __spreadArrays, + __values: () => __values, + default: () => tslib_es6_default +}); +function __extends(d, b) { + if (typeof b !== "function" && b !== null) + throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); + extendStatics(d, b); + function __() { + this.constructor = d; + } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); +} +function __rest(s, e) { + var t = {}; + for (var p in s) + if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) + t[p] = s[p]; + if (s != null && typeof Object.getOwnPropertySymbols === "function") + for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { + if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) + t[p[i]] = s[p[i]]; + } + return t; +} +function __decorate(decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") + r = Reflect.decorate(decorators, target, key, desc); + else + for (var i = decorators.length - 1; i >= 0; i--) + if (d = decorators[i]) + r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +} +function __param(paramIndex, decorator) { + return function(target, key) { + decorator(target, key, paramIndex); + }; +} +function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) { + function accept(f) { + if (f !== void 0 && typeof f !== "function") + throw new TypeError("Function expected"); + return f; + } + var kind = contextIn.kind, key = kind === "getter" ? "get" : kind === "setter" ? "set" : "value"; + var target = !descriptorIn && ctor ? contextIn["static"] ? ctor : ctor.prototype : null; + var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {}); + var _2, done = false; + for (var i = decorators.length - 1; i >= 0; i--) { + var context = {}; + for (var p in contextIn) + context[p] = p === "access" ? {} : contextIn[p]; + for (var p in contextIn.access) + context.access[p] = contextIn.access[p]; + context.addInitializer = function(f) { + if (done) + throw new TypeError("Cannot add initializers after decoration has completed"); + extraInitializers.push(accept(f || null)); + }; + var result = (0, decorators[i])(kind === "accessor" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context); + if (kind === "accessor") { + if (result === void 0) + continue; + if (result === null || typeof result !== "object") + throw new TypeError("Object expected"); + if (_2 = accept(result.get)) + descriptor.get = _2; + if (_2 = accept(result.set)) + descriptor.set = _2; + if (_2 = accept(result.init)) + initializers.unshift(_2); + } else if (_2 = accept(result)) { + if (kind === "field") + initializers.unshift(_2); + else + descriptor[key] = _2; + } + } + if (target) + Object.defineProperty(target, contextIn.name, descriptor); + done = true; +} +function __runInitializers(thisArg, initializers, value) { + var useValue = arguments.length > 2; + for (var i = 0; i < initializers.length; i++) { + value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg); + } + return useValue ? value : void 0; +} +function __propKey(x) { + return typeof x === "symbol" ? x : "".concat(x); +} +function __setFunctionName(f, name, prefix) { + if (typeof name === "symbol") + name = name.description ? "[".concat(name.description, "]") : ""; + return Object.defineProperty(f, "name", { configurable: true, value: prefix ? "".concat(prefix, " ", name) : name }); +} +function __metadata(metadataKey, metadataValue) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") + return Reflect.metadata(metadataKey, metadataValue); +} +function __awaiter(thisArg, _arguments, P2, generator) { + function adopt(value) { + return value instanceof P2 ? value : new P2(function(resolve) { + resolve(value); + }); + } + return new (P2 || (P2 = Promise))(function(resolve, reject) { + function fulfilled(value) { + try { + step(generator.next(value)); + } catch (e) { + reject(e); + } + } + function rejected(value) { + try { + step(generator["throw"](value)); + } catch (e) { + reject(e); + } + } + function step(result) { + result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); + } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +} +function __generator(thisArg, body) { + var _2 = { label: 0, sent: function() { + if (t[0] & 1) + throw t[1]; + return t[1]; + }, trys: [], ops: [] }, f, y, t, g; + return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { + return this; + }), g; + function verb(n) { + return function(v) { + return step([n, v]); + }; + } + function step(op2) { + if (f) + throw new TypeError("Generator is already executing."); + while (g && (g = 0, op2[0] && (_2 = 0)), _2) + try { + if (f = 1, y && (t = op2[0] & 2 ? y["return"] : op2[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op2[1])).done) + return t; + if (y = 0, t) + op2 = [op2[0] & 2, t.value]; + switch (op2[0]) { + case 0: + case 1: + t = op2; + break; + case 4: + _2.label++; + return { value: op2[1], done: false }; + case 5: + _2.label++; + y = op2[1]; + op2 = [0]; + continue; + case 7: + op2 = _2.ops.pop(); + _2.trys.pop(); + continue; + default: + if (!(t = _2.trys, t = t.length > 0 && t[t.length - 1]) && (op2[0] === 6 || op2[0] === 2)) { + _2 = 0; + continue; + } + if (op2[0] === 3 && (!t || op2[1] > t[0] && op2[1] < t[3])) { + _2.label = op2[1]; + break; + } + if (op2[0] === 6 && _2.label < t[1]) { + _2.label = t[1]; + t = op2; + break; + } + if (t && _2.label < t[2]) { + _2.label = t[2]; + _2.ops.push(op2); + break; + } + if (t[2]) + _2.ops.pop(); + _2.trys.pop(); + continue; + } + op2 = body.call(thisArg, _2); + } catch (e) { + op2 = [6, e]; + y = 0; + } finally { + f = t = 0; + } + if (op2[0] & 5) + throw op2[1]; + return { value: op2[0] ? op2[1] : void 0, done: true }; + } +} +function __exportStar(m2, o) { + for (var p in m2) + if (p !== "default" && !Object.prototype.hasOwnProperty.call(o, p)) + __createBinding(o, m2, p); +} +function __values(o) { + var s = typeof Symbol === "function" && Symbol.iterator, m2 = s && o[s], i = 0; + if (m2) + return m2.call(o); + if (o && typeof o.length === "number") + return { + next: function() { + if (o && i >= o.length) + o = void 0; + return { value: o && o[i++], done: !o }; + } + }; + throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined."); +} +function __read(o, n) { + var m2 = typeof Symbol === "function" && o[Symbol.iterator]; + if (!m2) + return o; + var i = m2.call(o), r, ar2 = [], e; + try { + while ((n === void 0 || n-- > 0) && !(r = i.next()).done) + ar2.push(r.value); + } catch (error2) { + e = { error: error2 }; + } finally { + try { + if (r && !r.done && (m2 = i["return"])) + m2.call(i); + } finally { + if (e) + throw e.error; + } + } + return ar2; +} +function __spread() { + for (var ar2 = [], i = 0; i < arguments.length; i++) + ar2 = ar2.concat(__read(arguments[i])); + return ar2; +} +function __spreadArrays() { + for (var s = 0, i = 0, il = arguments.length; i < il; i++) + s += arguments[i].length; + for (var r = Array(s), k2 = 0, i = 0; i < il; i++) + for (var a = arguments[i], j2 = 0, jl = a.length; j2 < jl; j2++, k2++) + r[k2] = a[j2]; + return r; +} +function __spreadArray(to2, from, pack) { + if (pack || arguments.length === 2) + for (var i = 0, l = from.length, ar2; i < l; i++) { + if (ar2 || !(i in from)) { + if (!ar2) + ar2 = Array.prototype.slice.call(from, 0, i); + ar2[i] = from[i]; + } + } + return to2.concat(ar2 || Array.prototype.slice.call(from)); +} +function __await(v) { + return this instanceof __await ? (this.v = v, this) : new __await(v); +} +function __asyncGenerator(thisArg, _arguments, generator) { + if (!Symbol.asyncIterator) + throw new TypeError("Symbol.asyncIterator is not defined."); + var g = generator.apply(thisArg, _arguments || []), i, q = []; + return i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function() { + return this; + }, i; + function verb(n) { + if (g[n]) + i[n] = function(v) { + return new Promise(function(a, b) { + q.push([n, v, a, b]) > 1 || resume(n, v); + }); + }; + } + function resume(n, v) { + try { + step(g[n](v)); + } catch (e) { + settle(q[0][3], e); + } + } + function step(r) { + r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); + } + function fulfill(value) { + resume("next", value); + } + function reject(value) { + resume("throw", value); + } + function settle(f, v) { + if (f(v), q.shift(), q.length) + resume(q[0][0], q[0][1]); + } +} +function __asyncDelegator(o) { + var i, p; + return i = {}, verb("next"), verb("throw", function(e) { + throw e; + }), verb("return"), i[Symbol.iterator] = function() { + return this; + }, i; + function verb(n, f) { + i[n] = o[n] ? function(v) { + return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; + } : f; + } +} +function __asyncValues(o) { + if (!Symbol.asyncIterator) + throw new TypeError("Symbol.asyncIterator is not defined."); + var m2 = o[Symbol.asyncIterator], i; + return m2 ? m2.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function() { + return this; + }, i); + function verb(n) { + i[n] = o[n] && function(v) { + return new Promise(function(resolve, reject) { + v = o[n](v), settle(resolve, reject, v.done, v.value); + }); + }; + } + function settle(resolve, reject, d, v) { + Promise.resolve(v).then(function(v2) { + resolve({ value: v2, done: d }); + }, reject); + } +} +function __makeTemplateObject(cooked, raw2) { + if (Object.defineProperty) { + Object.defineProperty(cooked, "raw", { value: raw2 }); + } else { + cooked.raw = raw2; + } + return cooked; +} +function __importStar(mod2) { + if (mod2 && mod2.__esModule) + return mod2; + var result = {}; + if (mod2 != null) { + for (var k2 in mod2) + if (k2 !== "default" && Object.prototype.hasOwnProperty.call(mod2, k2)) + __createBinding(result, mod2, k2); + } + __setModuleDefault(result, mod2); + return result; +} +function __importDefault(mod2) { + return mod2 && mod2.__esModule ? mod2 : { default: mod2 }; +} +function __classPrivateFieldGet(receiver, state, kind, f) { + if (kind === "a" && !f) + throw new TypeError("Private accessor was defined without a getter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) + throw new TypeError("Cannot read private member from an object whose class did not declare it"); + return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver); +} +function __classPrivateFieldSet(receiver, state, value, kind, f) { + if (kind === "m") + throw new TypeError("Private method is not writable"); + if (kind === "a" && !f) + throw new TypeError("Private accessor was defined without a setter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) + throw new TypeError("Cannot write private member to an object whose class did not declare it"); + return kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value), value; +} +function __classPrivateFieldIn(state, receiver) { + if (receiver === null || typeof receiver !== "object" && typeof receiver !== "function") + throw new TypeError("Cannot use 'in' operator on non-object"); + return typeof state === "function" ? receiver === state : state.has(receiver); +} +function __addDisposableResource(env, value, async) { + if (value !== null && value !== void 0) { + if (typeof value !== "object" && typeof value !== "function") + throw new TypeError("Object expected."); + var dispose; + if (async) { + if (!Symbol.asyncDispose) + throw new TypeError("Symbol.asyncDispose is not defined."); + dispose = value[Symbol.asyncDispose]; + } + if (dispose === void 0) { + if (!Symbol.dispose) + throw new TypeError("Symbol.dispose is not defined."); + dispose = value[Symbol.dispose]; + } + if (typeof dispose !== "function") + throw new TypeError("Object not disposable."); + env.stack.push({ value, dispose, async }); + } else if (async) { + env.stack.push({ async: true }); + } + return value; +} +function __disposeResources(env) { + function fail(e) { + env.error = env.hasError ? new _SuppressedError(e, env.error, "An error was suppressed during disposal.") : e; + env.hasError = true; + } + function next() { + while (env.stack.length) { + var rec = env.stack.pop(); + try { + var result = rec.dispose && rec.dispose.call(rec.value); + if (rec.async) + return Promise.resolve(result).then(next, function(e) { + fail(e); + return next(); + }); + } catch (e) { + fail(e); + } + } + if (env.hasError) + throw env.error; + } + return next(); +} +var extendStatics, __assign, __createBinding, __setModuleDefault, _SuppressedError, tslib_es6_default; +var init_tslib_es6 = __esm({ + "node_modules/tslib/tslib.es6.mjs"() { + extendStatics = function(d, b) { + extendStatics = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function(d2, b2) { + d2.__proto__ = b2; + } || function(d2, b2) { + for (var p in b2) + if (Object.prototype.hasOwnProperty.call(b2, p)) + d2[p] = b2[p]; + }; + return extendStatics(d, b); + }; + __assign = function() { + __assign = Object.assign || function __assign2(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + for (var p in s) + if (Object.prototype.hasOwnProperty.call(s, p)) + t[p] = s[p]; + } + return t; + }; + return __assign.apply(this, arguments); + }; + __createBinding = Object.create ? function(o, m2, k2, k22) { + if (k22 === void 0) + k22 = k2; + var desc = Object.getOwnPropertyDescriptor(m2, k2); + if (!desc || ("get" in desc ? !m2.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { + return m2[k2]; + } }; + } + Object.defineProperty(o, k22, desc); + } : function(o, m2, k2, k22) { + if (k22 === void 0) + k22 = k2; + o[k22] = m2[k2]; + }; + __setModuleDefault = Object.create ? function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); + } : function(o, v) { + o["default"] = v; + }; + _SuppressedError = typeof SuppressedError === "function" ? SuppressedError : function(error2, suppressed, message) { + var e = new Error(message); + return e.name = "SuppressedError", e.error = error2, e.suppressed = suppressed, e; + }; + tslib_es6_default = { + __extends, + __assign, + __rest, + __decorate, + __param, + __metadata, + __awaiter, + __generator, + __createBinding, + __exportStar, + __values, + __read, + __spread, + __spreadArrays, + __spreadArray, + __await, + __asyncGenerator, + __asyncDelegator, + __asyncValues, + __makeTemplateObject, + __importStar, + __importDefault, + __classPrivateFieldGet, + __classPrivateFieldSet, + __classPrivateFieldIn, + __addDisposableResource, + __disposeResources + }; + } +}); + +// node_modules/undici/lib/core/symbols.js +var require_symbols = __commonJS({ + "node_modules/undici/lib/core/symbols.js"(exports2, module2) { + module2.exports = { + kClose: Symbol("close"), + kDestroy: Symbol("destroy"), + kDispatch: Symbol("dispatch"), + kUrl: Symbol("url"), + kWriting: Symbol("writing"), + kResuming: Symbol("resuming"), + kQueue: Symbol("queue"), + kConnect: Symbol("connect"), + kConnecting: Symbol("connecting"), + kHeadersList: Symbol("headers list"), + kKeepAliveDefaultTimeout: Symbol("default keep alive timeout"), + kKeepAliveMaxTimeout: Symbol("max keep alive timeout"), + kKeepAliveTimeoutThreshold: Symbol("keep alive timeout threshold"), + kKeepAliveTimeoutValue: Symbol("keep alive timeout"), + kKeepAlive: Symbol("keep alive"), + kHeadersTimeout: Symbol("headers timeout"), + kBodyTimeout: Symbol("body timeout"), + kServerName: Symbol("server name"), + kLocalAddress: Symbol("local address"), + kHost: Symbol("host"), + kNoRef: Symbol("no ref"), + kBodyUsed: Symbol("used"), + kRunning: Symbol("running"), + kBlocking: Symbol("blocking"), + kPending: Symbol("pending"), + kSize: Symbol("size"), + kBusy: Symbol("busy"), + kQueued: Symbol("queued"), + kFree: Symbol("free"), + kConnected: Symbol("connected"), + kClosed: Symbol("closed"), + kNeedDrain: Symbol("need drain"), + kReset: Symbol("reset"), + kDestroyed: Symbol.for("nodejs.stream.destroyed"), + kMaxHeadersSize: Symbol("max headers size"), + kRunningIdx: Symbol("running index"), + kPendingIdx: Symbol("pending index"), + kError: Symbol("error"), + kClients: Symbol("clients"), + kClient: Symbol("client"), + kParser: Symbol("parser"), + kOnDestroyed: Symbol("destroy callbacks"), + kPipelining: Symbol("pipelining"), + kSocket: Symbol("socket"), + kHostHeader: Symbol("host header"), + kConnector: Symbol("connector"), + kStrictContentLength: Symbol("strict content length"), + kMaxRedirections: Symbol("maxRedirections"), + kMaxRequests: Symbol("maxRequestsPerClient"), + kProxy: Symbol("proxy agent options"), + kCounter: Symbol("socket request counter"), + kInterceptors: Symbol("dispatch interceptors"), + kMaxResponseSize: Symbol("max response size") + }; + } +}); + +// node_modules/undici/lib/core/errors.js +var require_errors = __commonJS({ + "node_modules/undici/lib/core/errors.js"(exports2, module2) { + "use strict"; + var UndiciError = class extends Error { + constructor(message) { + super(message); + this.name = "UndiciError"; + this.code = "UND_ERR"; + } + }; + var ConnectTimeoutError = class _ConnectTimeoutError extends UndiciError { + constructor(message) { + super(message); + Error.captureStackTrace(this, _ConnectTimeoutError); + this.name = "ConnectTimeoutError"; + this.message = message || "Connect Timeout Error"; + this.code = "UND_ERR_CONNECT_TIMEOUT"; + } + }; + var HeadersTimeoutError = class _HeadersTimeoutError extends UndiciError { + constructor(message) { + super(message); + Error.captureStackTrace(this, _HeadersTimeoutError); + this.name = "HeadersTimeoutError"; + this.message = message || "Headers Timeout Error"; + this.code = "UND_ERR_HEADERS_TIMEOUT"; + } + }; + var HeadersOverflowError = class _HeadersOverflowError extends UndiciError { + constructor(message) { + super(message); + Error.captureStackTrace(this, _HeadersOverflowError); + this.name = "HeadersOverflowError"; + this.message = message || "Headers Overflow Error"; + this.code = "UND_ERR_HEADERS_OVERFLOW"; + } + }; + var BodyTimeoutError = class _BodyTimeoutError extends UndiciError { + constructor(message) { + super(message); + Error.captureStackTrace(this, _BodyTimeoutError); + this.name = "BodyTimeoutError"; + this.message = message || "Body Timeout Error"; + this.code = "UND_ERR_BODY_TIMEOUT"; + } + }; + var ResponseStatusCodeError = class _ResponseStatusCodeError extends UndiciError { + constructor(message, statusCode, headers, body) { + super(message); + Error.captureStackTrace(this, _ResponseStatusCodeError); + this.name = "ResponseStatusCodeError"; + this.message = message || "Response Status Code Error"; + this.code = "UND_ERR_RESPONSE_STATUS_CODE"; + this.body = body; + this.status = statusCode; + this.statusCode = statusCode; + this.headers = headers; + } + }; + var InvalidArgumentError = class _InvalidArgumentError extends UndiciError { + constructor(message) { + super(message); + Error.captureStackTrace(this, _InvalidArgumentError); + this.name = "InvalidArgumentError"; + this.message = message || "Invalid Argument Error"; + this.code = "UND_ERR_INVALID_ARG"; + } + }; + var InvalidReturnValueError = class _InvalidReturnValueError extends UndiciError { + constructor(message) { + super(message); + Error.captureStackTrace(this, _InvalidReturnValueError); + this.name = "InvalidReturnValueError"; + this.message = message || "Invalid Return Value Error"; + this.code = "UND_ERR_INVALID_RETURN_VALUE"; + } + }; + var RequestAbortedError = class _RequestAbortedError extends UndiciError { + constructor(message) { + super(message); + Error.captureStackTrace(this, _RequestAbortedError); + this.name = "AbortError"; + this.message = message || "Request aborted"; + this.code = "UND_ERR_ABORTED"; + } + }; + var InformationalError = class _InformationalError extends UndiciError { + constructor(message) { + super(message); + Error.captureStackTrace(this, _InformationalError); + this.name = "InformationalError"; + this.message = message || "Request information"; + this.code = "UND_ERR_INFO"; + } + }; + var RequestContentLengthMismatchError = class _RequestContentLengthMismatchError extends UndiciError { + constructor(message) { + super(message); + Error.captureStackTrace(this, _RequestContentLengthMismatchError); + this.name = "RequestContentLengthMismatchError"; + this.message = message || "Request body length does not match content-length header"; + this.code = "UND_ERR_REQ_CONTENT_LENGTH_MISMATCH"; + } + }; + var ResponseContentLengthMismatchError = class _ResponseContentLengthMismatchError extends UndiciError { + constructor(message) { + super(message); + Error.captureStackTrace(this, _ResponseContentLengthMismatchError); + this.name = "ResponseContentLengthMismatchError"; + this.message = message || "Response body length does not match content-length header"; + this.code = "UND_ERR_RES_CONTENT_LENGTH_MISMATCH"; + } + }; + var ClientDestroyedError = class _ClientDestroyedError extends UndiciError { + constructor(message) { + super(message); + Error.captureStackTrace(this, _ClientDestroyedError); + this.name = "ClientDestroyedError"; + this.message = message || "The client is destroyed"; + this.code = "UND_ERR_DESTROYED"; + } + }; + var ClientClosedError = class _ClientClosedError extends UndiciError { + constructor(message) { + super(message); + Error.captureStackTrace(this, _ClientClosedError); + this.name = "ClientClosedError"; + this.message = message || "The client is closed"; + this.code = "UND_ERR_CLOSED"; + } + }; + var SocketError = class _SocketError extends UndiciError { + constructor(message, socket) { + super(message); + Error.captureStackTrace(this, _SocketError); + this.name = "SocketError"; + this.message = message || "Socket error"; + this.code = "UND_ERR_SOCKET"; + this.socket = socket; + } + }; + var NotSupportedError = class _NotSupportedError extends UndiciError { + constructor(message) { + super(message); + Error.captureStackTrace(this, _NotSupportedError); + this.name = "NotSupportedError"; + this.message = message || "Not supported error"; + this.code = "UND_ERR_NOT_SUPPORTED"; + } + }; + var BalancedPoolMissingUpstreamError = class extends UndiciError { + constructor(message) { + super(message); + Error.captureStackTrace(this, NotSupportedError); + this.name = "MissingUpstreamError"; + this.message = message || "No upstream has been added to the BalancedPool"; + this.code = "UND_ERR_BPL_MISSING_UPSTREAM"; + } + }; + var HTTPParserError = class _HTTPParserError extends Error { + constructor(message, code, data) { + super(message); + Error.captureStackTrace(this, _HTTPParserError); + this.name = "HTTPParserError"; + this.code = code ? `HPE_${code}` : void 0; + this.data = data ? data.toString() : void 0; + } + }; + var ResponseExceededMaxSizeError = class _ResponseExceededMaxSizeError extends UndiciError { + constructor(message) { + super(message); + Error.captureStackTrace(this, _ResponseExceededMaxSizeError); + this.name = "ResponseExceededMaxSizeError"; + this.message = message || "Response content exceeded max size"; + this.code = "UND_ERR_RES_EXCEEDED_MAX_SIZE"; + } + }; + module2.exports = { + HTTPParserError, + UndiciError, + HeadersTimeoutError, + HeadersOverflowError, + BodyTimeoutError, + RequestContentLengthMismatchError, + ConnectTimeoutError, + ResponseStatusCodeError, + InvalidArgumentError, + InvalidReturnValueError, + RequestAbortedError, + ClientDestroyedError, + ClientClosedError, + InformationalError, + SocketError, + NotSupportedError, + ResponseContentLengthMismatchError, + BalancedPoolMissingUpstreamError, + ResponseExceededMaxSizeError + }; + } +}); + +// node_modules/undici/lib/core/util.js +var require_util4 = __commonJS({ + "node_modules/undici/lib/core/util.js"(exports2, module2) { + "use strict"; + var assert = require("assert"); + var { kDestroyed, kBodyUsed } = require_symbols(); + var { IncomingMessage } = require("http"); + var stream = require("stream"); + var net = require("net"); + var { InvalidArgumentError } = require_errors(); + var { Blob: Blob2 } = require("buffer"); + var nodeUtil = require("util"); + var { stringify } = require("querystring"); + var [nodeMajor, nodeMinor] = process.versions.node.split(".").map((v) => Number(v)); + function nop() { + } + function isStream(obj) { + return obj && typeof obj === "object" && typeof obj.pipe === "function" && typeof obj.on === "function"; + } + function isBlobLike(object) { + return Blob2 && object instanceof Blob2 || object && typeof object === "object" && (typeof object.stream === "function" || typeof object.arrayBuffer === "function") && /^(Blob|File)$/.test(object[Symbol.toStringTag]); + } + function buildURL(url, queryParams) { + if (url.includes("?") || url.includes("#")) { + throw new Error('Query params cannot be passed when url already contains "?" or "#".'); + } + const stringified = stringify(queryParams); + if (stringified) { + url += "?" + stringified; + } + return url; + } + function parseURL(url) { + if (typeof url === "string") { + url = new URL(url); + if (!/^https?:/.test(url.origin || url.protocol)) { + throw new InvalidArgumentError("Invalid URL protocol: the URL must start with `http:` or `https:`."); + } + return url; + } + if (!url || typeof url !== "object") { + throw new InvalidArgumentError("Invalid URL: The URL argument must be a non-null object."); + } + if (url.port != null && url.port !== "" && !Number.isFinite(parseInt(url.port))) { + throw new InvalidArgumentError("Invalid URL: port must be a valid integer or a string representation of an integer."); + } + if (url.path != null && typeof url.path !== "string") { + throw new InvalidArgumentError("Invalid URL path: the path must be a string or null/undefined."); + } + if (url.pathname != null && typeof url.pathname !== "string") { + throw new InvalidArgumentError("Invalid URL pathname: the pathname must be a string or null/undefined."); + } + if (url.hostname != null && typeof url.hostname !== "string") { + throw new InvalidArgumentError("Invalid URL hostname: the hostname must be a string or null/undefined."); + } + if (url.origin != null && typeof url.origin !== "string") { + throw new InvalidArgumentError("Invalid URL origin: the origin must be a string or null/undefined."); + } + if (!/^https?:/.test(url.origin || url.protocol)) { + throw new InvalidArgumentError("Invalid URL protocol: the URL must start with `http:` or `https:`."); + } + if (!(url instanceof URL)) { + const port = url.port != null ? url.port : url.protocol === "https:" ? 443 : 80; + let origin = url.origin != null ? url.origin : `${url.protocol}//${url.hostname}:${port}`; + let path = url.path != null ? url.path : `${url.pathname || ""}${url.search || ""}`; + if (origin.endsWith("/")) { + origin = origin.substring(0, origin.length - 1); + } + if (path && !path.startsWith("/")) { + path = `/${path}`; + } + url = new URL(origin + path); + } + return url; + } + function parseOrigin(url) { + url = parseURL(url); + if (url.pathname !== "/" || url.search || url.hash) { + throw new InvalidArgumentError("invalid url"); + } + return url; + } + function getHostname(host) { + if (host[0] === "[") { + const idx2 = host.indexOf("]"); + assert(idx2 !== -1); + return host.substr(1, idx2 - 1); + } + const idx = host.indexOf(":"); + if (idx === -1) + return host; + return host.substr(0, idx); + } + function getServerName(host) { + if (!host) { + return null; + } + assert.strictEqual(typeof host, "string"); + const servername = getHostname(host); + if (net.isIP(servername)) { + return ""; + } + return servername; + } + function deepClone(obj) { + return JSON.parse(JSON.stringify(obj)); + } + function isAsyncIterable(obj) { + return !!(obj != null && typeof obj[Symbol.asyncIterator] === "function"); + } + function isIterable(obj) { + return !!(obj != null && (typeof obj[Symbol.iterator] === "function" || typeof obj[Symbol.asyncIterator] === "function")); + } + function bodyLength(body) { + if (body == null) { + return 0; + } else if (isStream(body)) { + const state = body._readableState; + return state && state.ended === true && Number.isFinite(state.length) ? state.length : null; + } else if (isBlobLike(body)) { + return body.size != null ? body.size : null; + } else if (isBuffer(body)) { + return body.byteLength; + } + return null; + } + function isDestroyed(stream2) { + return !stream2 || !!(stream2.destroyed || stream2[kDestroyed]); + } + function isReadableAborted(stream2) { + const state = stream2 && stream2._readableState; + return isDestroyed(stream2) && state && !state.endEmitted; + } + function destroy(stream2, err) { + if (!isStream(stream2) || isDestroyed(stream2)) { + return; + } + if (typeof stream2.destroy === "function") { + if (Object.getPrototypeOf(stream2).constructor === IncomingMessage) { + stream2.socket = null; + } + stream2.destroy(err); + } else if (err) { + process.nextTick((stream3, err2) => { + stream3.emit("error", err2); + }, stream2, err); + } + if (stream2.destroyed !== true) { + stream2[kDestroyed] = true; + } + } + var KEEPALIVE_TIMEOUT_EXPR = /timeout=(\d+)/; + function parseKeepAliveTimeout(val) { + const m2 = val.toString().match(KEEPALIVE_TIMEOUT_EXPR); + return m2 ? parseInt(m2[1], 10) * 1e3 : null; + } + function parseHeaders(headers, obj = {}) { + for (let i = 0; i < headers.length; i += 2) { + const key = headers[i].toString().toLowerCase(); + let val = obj[key]; + if (!val) { + if (Array.isArray(headers[i + 1])) { + obj[key] = headers[i + 1]; + } else { + obj[key] = headers[i + 1].toString("utf8"); + } + } else { + if (!Array.isArray(val)) { + val = [val]; + obj[key] = val; + } + val.push(headers[i + 1].toString("utf8")); + } + } + if ("content-length" in obj && "content-disposition" in obj) { + obj["content-disposition"] = Buffer.from(obj["content-disposition"]).toString("latin1"); + } + return obj; + } + function parseRawHeaders(headers) { + const ret = []; + let hasContentLength = false; + let contentDispositionIdx = -1; + for (let n = 0; n < headers.length; n += 2) { + const key = headers[n + 0].toString(); + const val = headers[n + 1].toString("utf8"); + if (key.length === 14 && (key === "content-length" || key.toLowerCase() === "content-length")) { + ret.push(key, val); + hasContentLength = true; + } else if (key.length === 19 && (key === "content-disposition" || key.toLowerCase() === "content-disposition")) { + contentDispositionIdx = ret.push(key, val) - 1; + } else { + ret.push(key, val); + } + } + if (hasContentLength && contentDispositionIdx !== -1) { + ret[contentDispositionIdx] = Buffer.from(ret[contentDispositionIdx]).toString("latin1"); + } + return ret; + } + function isBuffer(buffer) { + return buffer instanceof Uint8Array || Buffer.isBuffer(buffer); + } + function validateHandler(handler2, method, upgrade) { + if (!handler2 || typeof handler2 !== "object") { + throw new InvalidArgumentError("handler must be an object"); + } + if (typeof handler2.onConnect !== "function") { + throw new InvalidArgumentError("invalid onConnect method"); + } + if (typeof handler2.onError !== "function") { + throw new InvalidArgumentError("invalid onError method"); + } + if (typeof handler2.onBodySent !== "function" && handler2.onBodySent !== void 0) { + throw new InvalidArgumentError("invalid onBodySent method"); + } + if (upgrade || method === "CONNECT") { + if (typeof handler2.onUpgrade !== "function") { + throw new InvalidArgumentError("invalid onUpgrade method"); + } + } else { + if (typeof handler2.onHeaders !== "function") { + throw new InvalidArgumentError("invalid onHeaders method"); + } + if (typeof handler2.onData !== "function") { + throw new InvalidArgumentError("invalid onData method"); + } + if (typeof handler2.onComplete !== "function") { + throw new InvalidArgumentError("invalid onComplete method"); + } + } + } + function isDisturbed(body) { + return !!(body && (stream.isDisturbed ? stream.isDisturbed(body) || body[kBodyUsed] : body[kBodyUsed] || body.readableDidRead || body._readableState && body._readableState.dataEmitted || isReadableAborted(body))); + } + function isErrored(body) { + return !!(body && (stream.isErrored ? stream.isErrored(body) : /state: 'errored'/.test( + nodeUtil.inspect(body) + ))); + } + function isReadable(body) { + return !!(body && (stream.isReadable ? stream.isReadable(body) : /state: 'readable'/.test( + nodeUtil.inspect(body) + ))); + } + function getSocketInfo(socket) { + return { + localAddress: socket.localAddress, + localPort: socket.localPort, + remoteAddress: socket.remoteAddress, + remotePort: socket.remotePort, + remoteFamily: socket.remoteFamily, + timeout: socket.timeout, + bytesWritten: socket.bytesWritten, + bytesRead: socket.bytesRead + }; + } + var ReadableStream; + function ReadableStreamFrom(iterable) { + if (!ReadableStream) { + ReadableStream = require("stream/web").ReadableStream; + } + if (ReadableStream.from) { + return ReadableStream.from(iterable); + } + let iterator; + return new ReadableStream( + { + async start() { + iterator = iterable[Symbol.asyncIterator](); + }, + async pull(controller) { + const { done, value } = await iterator.next(); + if (done) { + queueMicrotask(() => { + controller.close(); + }); + } else { + const buf = Buffer.isBuffer(value) ? value : Buffer.from(value); + controller.enqueue(new Uint8Array(buf)); + } + return controller.desiredSize > 0; + }, + async cancel(reason) { + await iterator.return(); + } + }, + 0 + ); + } + function isFormDataLike(object) { + return object && typeof object === "object" && typeof object.append === "function" && typeof object.delete === "function" && typeof object.get === "function" && typeof object.getAll === "function" && typeof object.has === "function" && typeof object.set === "function" && object[Symbol.toStringTag] === "FormData"; + } + function throwIfAborted(signal) { + if (!signal) { + return; + } + if (typeof signal.throwIfAborted === "function") { + signal.throwIfAborted(); + } else { + if (signal.aborted) { + const err = new Error("The operation was aborted"); + err.name = "AbortError"; + throw err; + } + } + } + var events; + function addAbortListener(signal, listener) { + if (typeof Symbol.dispose === "symbol") { + if (!events) { + events = require("events"); + } + if (typeof events.addAbortListener === "function" && "aborted" in signal) { + return events.addAbortListener(signal, listener); + } + } + if ("addEventListener" in signal) { + signal.addEventListener("abort", listener, { once: true }); + return () => signal.removeEventListener("abort", listener); + } + signal.addListener("abort", listener); + return () => signal.removeListener("abort", listener); + } + var hasToWellFormed = !!String.prototype.toWellFormed; + function toUSVString(val) { + if (hasToWellFormed) { + return `${val}`.toWellFormed(); + } else if (nodeUtil.toUSVString) { + return nodeUtil.toUSVString(val); + } + return `${val}`; + } + var kEnumerableProperty = /* @__PURE__ */ Object.create(null); + kEnumerableProperty.enumerable = true; + module2.exports = { + kEnumerableProperty, + nop, + isDisturbed, + isErrored, + isReadable, + toUSVString, + isReadableAborted, + isBlobLike, + parseOrigin, + parseURL, + getServerName, + isStream, + isIterable, + isAsyncIterable, + isDestroyed, + parseRawHeaders, + parseHeaders, + parseKeepAliveTimeout, + destroy, + bodyLength, + deepClone, + ReadableStreamFrom, + isBuffer, + validateHandler, + getSocketInfo, + isFormDataLike, + buildURL, + throwIfAborted, + addAbortListener, + nodeMajor, + nodeMinor, + nodeHasAutoSelectFamily: nodeMajor > 18 || nodeMajor === 18 && nodeMinor >= 13 + }; + } +}); + +// node_modules/undici/lib/timers.js +var require_timers = __commonJS({ + "node_modules/undici/lib/timers.js"(exports2, module2) { + "use strict"; + var fastNow = Date.now(); + var fastNowTimeout; + var fastTimers = []; + function onTimeout() { + fastNow = Date.now(); + let len = fastTimers.length; + let idx = 0; + while (idx < len) { + const timer = fastTimers[idx]; + if (timer.state === 0) { + timer.state = fastNow + timer.delay; + } else if (timer.state > 0 && fastNow >= timer.state) { + timer.state = -1; + timer.callback(timer.opaque); + } + if (timer.state === -1) { + timer.state = -2; + if (idx !== len - 1) { + fastTimers[idx] = fastTimers.pop(); + } else { + fastTimers.pop(); + } + len -= 1; + } else { + idx += 1; + } + } + if (fastTimers.length > 0) { + refreshTimeout(); + } + } + function refreshTimeout() { + if (fastNowTimeout && fastNowTimeout.refresh) { + fastNowTimeout.refresh(); + } else { + clearTimeout(fastNowTimeout); + fastNowTimeout = setTimeout(onTimeout, 1e3); + if (fastNowTimeout.unref) { + fastNowTimeout.unref(); + } + } + } + var Timeout = class { + constructor(callback, delay, opaque) { + this.callback = callback; + this.delay = delay; + this.opaque = opaque; + this.state = -2; + this.refresh(); + } + refresh() { + if (this.state === -2) { + fastTimers.push(this); + if (!fastNowTimeout || fastTimers.length === 1) { + refreshTimeout(); + } + } + this.state = 0; + } + clear() { + this.state = -1; + } + }; + module2.exports = { + setTimeout(callback, delay, opaque) { + return delay < 1e3 ? setTimeout(callback, delay, opaque) : new Timeout(callback, delay, opaque); + }, + clearTimeout(timeout) { + if (timeout instanceof Timeout) { + timeout.clear(); + } else { + clearTimeout(timeout); + } + } + }; + } +}); + +// node_modules/busboy/lib/utils.js +var require_utils = __commonJS({ + "node_modules/busboy/lib/utils.js"(exports2, module2) { + "use strict"; + function parseContentType(str) { + if (str.length === 0) + return; + const params = /* @__PURE__ */ Object.create(null); + let i = 0; + for (; i < str.length; ++i) { + const code = str.charCodeAt(i); + if (TOKEN[code] !== 1) { + if (code !== 47 || i === 0) + return; + break; + } + } + if (i === str.length) + return; + const type = str.slice(0, i).toLowerCase(); + const subtypeStart = ++i; + for (; i < str.length; ++i) { + const code = str.charCodeAt(i); + if (TOKEN[code] !== 1) { + if (i === subtypeStart) + return; + if (parseContentTypeParams(str, i, params) === void 0) + return; + break; + } + } + if (i === subtypeStart) + return; + const subtype = str.slice(subtypeStart, i).toLowerCase(); + return { type, subtype, params }; + } + function parseContentTypeParams(str, i, params) { + while (i < str.length) { + for (; i < str.length; ++i) { + const code = str.charCodeAt(i); + if (code !== 32 && code !== 9) + break; + } + if (i === str.length) + break; + if (str.charCodeAt(i++) !== 59) + return; + for (; i < str.length; ++i) { + const code = str.charCodeAt(i); + if (code !== 32 && code !== 9) + break; + } + if (i === str.length) + return; + let name; + const nameStart = i; + for (; i < str.length; ++i) { + const code = str.charCodeAt(i); + if (TOKEN[code] !== 1) { + if (code !== 61) + return; + break; + } + } + if (i === str.length) + return; + name = str.slice(nameStart, i); + ++i; + if (i === str.length) + return; + let value = ""; + let valueStart; + if (str.charCodeAt(i) === 34) { + valueStart = ++i; + let escaping = false; + for (; i < str.length; ++i) { + const code = str.charCodeAt(i); + if (code === 92) { + if (escaping) { + valueStart = i; + escaping = false; + } else { + value += str.slice(valueStart, i); + escaping = true; + } + continue; + } + if (code === 34) { + if (escaping) { + valueStart = i; + escaping = false; + continue; + } + value += str.slice(valueStart, i); + break; + } + if (escaping) { + valueStart = i - 1; + escaping = false; + } + if (QDTEXT[code] !== 1) + return; + } + if (i === str.length) + return; + ++i; + } else { + valueStart = i; + for (; i < str.length; ++i) { + const code = str.charCodeAt(i); + if (TOKEN[code] !== 1) { + if (i === valueStart) + return; + break; + } + } + value = str.slice(valueStart, i); + } + name = name.toLowerCase(); + if (params[name] === void 0) + params[name] = value; + } + return params; + } + function parseDisposition(str, defDecoder) { + if (str.length === 0) + return; + const params = /* @__PURE__ */ Object.create(null); + let i = 0; + for (; i < str.length; ++i) { + const code = str.charCodeAt(i); + if (TOKEN[code] !== 1) { + if (parseDispositionParams(str, i, params, defDecoder) === void 0) + return; + break; + } + } + const type = str.slice(0, i).toLowerCase(); + return { type, params }; + } + function parseDispositionParams(str, i, params, defDecoder) { + while (i < str.length) { + for (; i < str.length; ++i) { + const code = str.charCodeAt(i); + if (code !== 32 && code !== 9) + break; + } + if (i === str.length) + break; + if (str.charCodeAt(i++) !== 59) + return; + for (; i < str.length; ++i) { + const code = str.charCodeAt(i); + if (code !== 32 && code !== 9) + break; + } + if (i === str.length) + return; + let name; + const nameStart = i; + for (; i < str.length; ++i) { + const code = str.charCodeAt(i); + if (TOKEN[code] !== 1) { + if (code === 61) + break; + return; + } + } + if (i === str.length) + return; + let value = ""; + let valueStart; + let charset; + name = str.slice(nameStart, i); + if (name.charCodeAt(name.length - 1) === 42) { + const charsetStart = ++i; + for (; i < str.length; ++i) { + const code = str.charCodeAt(i); + if (CHARSET[code] !== 1) { + if (code !== 39) + return; + break; + } + } + if (i === str.length) + return; + charset = str.slice(charsetStart, i); + ++i; + for (; i < str.length; ++i) { + const code = str.charCodeAt(i); + if (code === 39) + break; + } + if (i === str.length) + return; + ++i; + if (i === str.length) + return; + valueStart = i; + let encode = 0; + for (; i < str.length; ++i) { + const code = str.charCodeAt(i); + if (EXTENDED_VALUE[code] !== 1) { + if (code === 37) { + let hexUpper; + let hexLower; + if (i + 2 < str.length && (hexUpper = HEX_VALUES[str.charCodeAt(i + 1)]) !== -1 && (hexLower = HEX_VALUES[str.charCodeAt(i + 2)]) !== -1) { + const byteVal = (hexUpper << 4) + hexLower; + value += str.slice(valueStart, i); + value += String.fromCharCode(byteVal); + i += 2; + valueStart = i + 1; + if (byteVal >= 128) + encode = 2; + else if (encode === 0) + encode = 1; + continue; + } + return; + } + break; + } + } + value += str.slice(valueStart, i); + value = convertToUTF8(value, charset, encode); + if (value === void 0) + return; + } else { + ++i; + if (i === str.length) + return; + if (str.charCodeAt(i) === 34) { + valueStart = ++i; + let escaping = false; + for (; i < str.length; ++i) { + const code = str.charCodeAt(i); + if (code === 92) { + if (escaping) { + valueStart = i; + escaping = false; + } else { + value += str.slice(valueStart, i); + escaping = true; + } + continue; + } + if (code === 34) { + if (escaping) { + valueStart = i; + escaping = false; + continue; + } + value += str.slice(valueStart, i); + break; + } + if (escaping) { + valueStart = i - 1; + escaping = false; + } + if (QDTEXT[code] !== 1) + return; + } + if (i === str.length) + return; + ++i; + } else { + valueStart = i; + for (; i < str.length; ++i) { + const code = str.charCodeAt(i); + if (TOKEN[code] !== 1) { + if (i === valueStart) + return; + break; + } + } + value = str.slice(valueStart, i); + } + value = defDecoder(value, 2); + if (value === void 0) + return; + } + name = name.toLowerCase(); + if (params[name] === void 0) + params[name] = value; + } + return params; + } + function getDecoder(charset) { + let lc2; + while (true) { + switch (charset) { + case "utf-8": + case "utf8": + return decoders.utf8; + case "latin1": + case "ascii": + case "us-ascii": + case "iso-8859-1": + case "iso8859-1": + case "iso88591": + case "iso_8859-1": + case "windows-1252": + case "iso_8859-1:1987": + case "cp1252": + case "x-cp1252": + return decoders.latin1; + case "utf16le": + case "utf-16le": + case "ucs2": + case "ucs-2": + return decoders.utf16le; + case "base64": + return decoders.base64; + default: + if (lc2 === void 0) { + lc2 = true; + charset = charset.toLowerCase(); + continue; + } + return decoders.other.bind(charset); + } + } + } + var decoders = { + utf8: (data, hint) => { + if (data.length === 0) + return ""; + if (typeof data === "string") { + if (hint < 2) + return data; + data = Buffer.from(data, "latin1"); + } + return data.utf8Slice(0, data.length); + }, + latin1: (data, hint) => { + if (data.length === 0) + return ""; + if (typeof data === "string") + return data; + return data.latin1Slice(0, data.length); + }, + utf16le: (data, hint) => { + if (data.length === 0) + return ""; + if (typeof data === "string") + data = Buffer.from(data, "latin1"); + return data.ucs2Slice(0, data.length); + }, + base64: (data, hint) => { + if (data.length === 0) + return ""; + if (typeof data === "string") + data = Buffer.from(data, "latin1"); + return data.base64Slice(0, data.length); + }, + other: (data, hint) => { + if (data.length === 0) + return ""; + if (typeof data === "string") + data = Buffer.from(data, "latin1"); + try { + const decoder = new TextDecoder(exports2); + return decoder.decode(data); + } catch { + } + } + }; + function convertToUTF8(data, charset, hint) { + const decode = getDecoder(charset); + if (decode) + return decode(data, hint); + } + function basename(path) { + if (typeof path !== "string") + return ""; + for (let i = path.length - 1; i >= 0; --i) { + switch (path.charCodeAt(i)) { + case 47: + case 92: + path = path.slice(i + 1); + return path === ".." || path === "." ? "" : path; + } + } + return path === ".." || path === "." ? "" : path; + } + var TOKEN = [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ]; + var QDTEXT = [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ]; + var CHARSET = [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ]; + var EXTENDED_VALUE = [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ]; + var HEX_VALUES = [ + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + 10, + 11, + 12, + 13, + 14, + 15, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + 10, + 11, + 12, + 13, + 14, + 15, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1 + ]; + module2.exports = { + basename, + convertToUTF8, + getDecoder, + parseContentType, + parseDisposition + }; + } +}); + +// node_modules/streamsearch/lib/sbmh.js +var require_sbmh = __commonJS({ + "node_modules/streamsearch/lib/sbmh.js"(exports2, module2) { + "use strict"; + function memcmp(buf1, pos1, buf2, pos2, num) { + for (let i = 0; i < num; ++i) { + if (buf1[pos1 + i] !== buf2[pos2 + i]) + return false; + } + return true; + } + var SBMH = class { + constructor(needle, cb) { + if (typeof cb !== "function") + throw new Error("Missing match callback"); + if (typeof needle === "string") + needle = Buffer.from(needle); + else if (!Buffer.isBuffer(needle)) + throw new Error(`Expected Buffer for needle, got ${typeof needle}`); + const needleLen = needle.length; + this.maxMatches = Infinity; + this.matches = 0; + this._cb = cb; + this._lookbehindSize = 0; + this._needle = needle; + this._bufPos = 0; + this._lookbehind = Buffer.allocUnsafe(needleLen); + this._occ = [ + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen, + needleLen + ]; + if (needleLen > 1) { + for (let i = 0; i < needleLen - 1; ++i) + this._occ[needle[i]] = needleLen - 1 - i; + } + } + reset() { + this.matches = 0; + this._lookbehindSize = 0; + this._bufPos = 0; + } + push(chunk, pos) { + let result; + if (!Buffer.isBuffer(chunk)) + chunk = Buffer.from(chunk, "latin1"); + const chunkLen = chunk.length; + this._bufPos = pos || 0; + while (result !== chunkLen && this.matches < this.maxMatches) + result = feed(this, chunk); + return result; + } + destroy() { + const lbSize = this._lookbehindSize; + if (lbSize) + this._cb(false, this._lookbehind, 0, lbSize, false); + this.reset(); + } + }; + function feed(self2, data) { + const len = data.length; + const needle = self2._needle; + const needleLen = needle.length; + let pos = -self2._lookbehindSize; + const lastNeedleCharPos = needleLen - 1; + const lastNeedleChar = needle[lastNeedleCharPos]; + const end = len - needleLen; + const occ = self2._occ; + const lookbehind = self2._lookbehind; + if (pos < 0) { + while (pos < 0 && pos <= end) { + const nextPos = pos + lastNeedleCharPos; + const ch = nextPos < 0 ? lookbehind[self2._lookbehindSize + nextPos] : data[nextPos]; + if (ch === lastNeedleChar && matchNeedle(self2, data, pos, lastNeedleCharPos)) { + self2._lookbehindSize = 0; + ++self2.matches; + if (pos > -self2._lookbehindSize) + self2._cb(true, lookbehind, 0, self2._lookbehindSize + pos, false); + else + self2._cb(true, void 0, 0, 0, true); + return self2._bufPos = pos + needleLen; + } + pos += occ[ch]; + } + while (pos < 0 && !matchNeedle(self2, data, pos, len - pos)) + ++pos; + if (pos < 0) { + const bytesToCutOff = self2._lookbehindSize + pos; + if (bytesToCutOff > 0) { + self2._cb(false, lookbehind, 0, bytesToCutOff, false); + } + self2._lookbehindSize -= bytesToCutOff; + lookbehind.copy(lookbehind, 0, bytesToCutOff, self2._lookbehindSize); + lookbehind.set(data, self2._lookbehindSize); + self2._lookbehindSize += len; + self2._bufPos = len; + return len; + } + self2._cb(false, lookbehind, 0, self2._lookbehindSize, false); + self2._lookbehindSize = 0; + } + pos += self2._bufPos; + const firstNeedleChar = needle[0]; + while (pos <= end) { + const ch = data[pos + lastNeedleCharPos]; + if (ch === lastNeedleChar && data[pos] === firstNeedleChar && memcmp(needle, 0, data, pos, lastNeedleCharPos)) { + ++self2.matches; + if (pos > 0) + self2._cb(true, data, self2._bufPos, pos, true); + else + self2._cb(true, void 0, 0, 0, true); + return self2._bufPos = pos + needleLen; + } + pos += occ[ch]; + } + while (pos < len) { + if (data[pos] !== firstNeedleChar || !memcmp(data, pos, needle, 0, len - pos)) { + ++pos; + continue; + } + data.copy(lookbehind, 0, pos, len); + self2._lookbehindSize = len - pos; + break; + } + if (pos > 0) + self2._cb(false, data, self2._bufPos, pos < len ? pos : len, true); + self2._bufPos = len; + return len; + } + function matchNeedle(self2, data, pos, len) { + const lb = self2._lookbehind; + const lbSize = self2._lookbehindSize; + const needle = self2._needle; + for (let i = 0; i < len; ++i, ++pos) { + const ch = pos < 0 ? lb[lbSize + pos] : data[pos]; + if (ch !== needle[i]) + return false; + } + return true; + } + module2.exports = SBMH; + } +}); + +// node_modules/busboy/lib/types/multipart.js +var require_multipart = __commonJS({ + "node_modules/busboy/lib/types/multipart.js"(exports2, module2) { + "use strict"; + var { Readable, Writable } = require("stream"); + var StreamSearch = require_sbmh(); + var { + basename, + convertToUTF8, + getDecoder, + parseContentType, + parseDisposition + } = require_utils(); + var BUF_CRLF = Buffer.from("\r\n"); + var BUF_CR = Buffer.from("\r"); + var BUF_DASH = Buffer.from("-"); + function noop() { + } + var MAX_HEADER_PAIRS = 2e3; + var MAX_HEADER_SIZE = 16 * 1024; + var HPARSER_NAME = 0; + var HPARSER_PRE_OWS = 1; + var HPARSER_VALUE = 2; + var HeaderParser = class { + constructor(cb) { + this.header = /* @__PURE__ */ Object.create(null); + this.pairCount = 0; + this.byteCount = 0; + this.state = HPARSER_NAME; + this.name = ""; + this.value = ""; + this.crlf = 0; + this.cb = cb; + } + reset() { + this.header = /* @__PURE__ */ Object.create(null); + this.pairCount = 0; + this.byteCount = 0; + this.state = HPARSER_NAME; + this.name = ""; + this.value = ""; + this.crlf = 0; + } + push(chunk, pos, end) { + let start = pos; + while (pos < end) { + switch (this.state) { + case HPARSER_NAME: { + let done = false; + for (; pos < end; ++pos) { + if (this.byteCount === MAX_HEADER_SIZE) + return -1; + ++this.byteCount; + const code = chunk[pos]; + if (TOKEN[code] !== 1) { + if (code !== 58) + return -1; + this.name += chunk.latin1Slice(start, pos); + if (this.name.length === 0) + return -1; + ++pos; + done = true; + this.state = HPARSER_PRE_OWS; + break; + } + } + if (!done) { + this.name += chunk.latin1Slice(start, pos); + break; + } + } + case HPARSER_PRE_OWS: { + let done = false; + for (; pos < end; ++pos) { + if (this.byteCount === MAX_HEADER_SIZE) + return -1; + ++this.byteCount; + const code = chunk[pos]; + if (code !== 32 && code !== 9) { + start = pos; + done = true; + this.state = HPARSER_VALUE; + break; + } + } + if (!done) + break; + } + case HPARSER_VALUE: + switch (this.crlf) { + case 0: + for (; pos < end; ++pos) { + if (this.byteCount === MAX_HEADER_SIZE) + return -1; + ++this.byteCount; + const code = chunk[pos]; + if (FIELD_VCHAR[code] !== 1) { + if (code !== 13) + return -1; + ++this.crlf; + break; + } + } + this.value += chunk.latin1Slice(start, pos++); + break; + case 1: + if (this.byteCount === MAX_HEADER_SIZE) + return -1; + ++this.byteCount; + if (chunk[pos++] !== 10) + return -1; + ++this.crlf; + break; + case 2: { + if (this.byteCount === MAX_HEADER_SIZE) + return -1; + ++this.byteCount; + const code = chunk[pos]; + if (code === 32 || code === 9) { + start = pos; + this.crlf = 0; + } else { + if (++this.pairCount < MAX_HEADER_PAIRS) { + this.name = this.name.toLowerCase(); + if (this.header[this.name] === void 0) + this.header[this.name] = [this.value]; + else + this.header[this.name].push(this.value); + } + if (code === 13) { + ++this.crlf; + ++pos; + } else { + start = pos; + this.crlf = 0; + this.state = HPARSER_NAME; + this.name = ""; + this.value = ""; + } + } + break; + } + case 3: { + if (this.byteCount === MAX_HEADER_SIZE) + return -1; + ++this.byteCount; + if (chunk[pos++] !== 10) + return -1; + const header = this.header; + this.reset(); + this.cb(header); + return pos; + } + } + break; + } + } + return pos; + } + }; + var FileStream = class extends Readable { + constructor(opts, owner) { + super(opts); + this.truncated = false; + this._readcb = null; + this.once("end", () => { + this._read(); + if (--owner._fileEndsLeft === 0 && owner._finalcb) { + const cb = owner._finalcb; + owner._finalcb = null; + process.nextTick(cb); + } + }); + } + _read(n) { + const cb = this._readcb; + if (cb) { + this._readcb = null; + cb(); + } + } + }; + var ignoreData = { + push: (chunk, pos) => { + }, + destroy: () => { + } + }; + function callAndUnsetCb(self2, err) { + const cb = self2._writecb; + self2._writecb = null; + if (err) + self2.destroy(err); + else if (cb) + cb(); + } + function nullDecoder(val, hint) { + return val; + } + var Multipart = class extends Writable { + constructor(cfg) { + const streamOpts = { + autoDestroy: true, + emitClose: true, + highWaterMark: typeof cfg.highWaterMark === "number" ? cfg.highWaterMark : void 0 + }; + super(streamOpts); + if (!cfg.conType.params || typeof cfg.conType.params.boundary !== "string") + throw new Error("Multipart: Boundary not found"); + const boundary = cfg.conType.params.boundary; + const paramDecoder = typeof cfg.defParamCharset === "string" && cfg.defParamCharset ? getDecoder(cfg.defParamCharset) : nullDecoder; + const defCharset = cfg.defCharset || "utf8"; + const preservePath = cfg.preservePath; + const fileOpts = { + autoDestroy: true, + emitClose: true, + highWaterMark: typeof cfg.fileHwm === "number" ? cfg.fileHwm : void 0 + }; + const limits = cfg.limits; + const fieldSizeLimit = limits && typeof limits.fieldSize === "number" ? limits.fieldSize : 1 * 1024 * 1024; + const fileSizeLimit = limits && typeof limits.fileSize === "number" ? limits.fileSize : Infinity; + const filesLimit = limits && typeof limits.files === "number" ? limits.files : Infinity; + const fieldsLimit = limits && typeof limits.fields === "number" ? limits.fields : Infinity; + const partsLimit = limits && typeof limits.parts === "number" ? limits.parts : Infinity; + let parts = -1; + let fields = 0; + let files = 0; + let skipPart = false; + this._fileEndsLeft = 0; + this._fileStream = void 0; + this._complete = false; + let fileSize = 0; + let field; + let fieldSize = 0; + let partCharset; + let partEncoding; + let partType; + let partName; + let partTruncated = false; + let hitFilesLimit = false; + let hitFieldsLimit = false; + this._hparser = null; + const hparser = new HeaderParser((header) => { + this._hparser = null; + skipPart = false; + partType = "text/plain"; + partCharset = defCharset; + partEncoding = "7bit"; + partName = void 0; + partTruncated = false; + let filename; + if (!header["content-disposition"]) { + skipPart = true; + return; + } + const disp = parseDisposition( + header["content-disposition"][0], + paramDecoder + ); + if (!disp || disp.type !== "form-data") { + skipPart = true; + return; + } + if (disp.params) { + if (disp.params.name) + partName = disp.params.name; + if (disp.params["filename*"]) + filename = disp.params["filename*"]; + else if (disp.params.filename) + filename = disp.params.filename; + if (filename !== void 0 && !preservePath) + filename = basename(filename); + } + if (header["content-type"]) { + const conType = parseContentType(header["content-type"][0]); + if (conType) { + partType = `${conType.type}/${conType.subtype}`; + if (conType.params && typeof conType.params.charset === "string") + partCharset = conType.params.charset.toLowerCase(); + } + } + if (header["content-transfer-encoding"]) + partEncoding = header["content-transfer-encoding"][0].toLowerCase(); + if (partType === "application/octet-stream" || filename !== void 0) { + if (files === filesLimit) { + if (!hitFilesLimit) { + hitFilesLimit = true; + this.emit("filesLimit"); + } + skipPart = true; + return; + } + ++files; + if (this.listenerCount("file") === 0) { + skipPart = true; + return; + } + fileSize = 0; + this._fileStream = new FileStream(fileOpts, this); + ++this._fileEndsLeft; + this.emit( + "file", + partName, + this._fileStream, + { + filename, + encoding: partEncoding, + mimeType: partType + } + ); + } else { + if (fields === fieldsLimit) { + if (!hitFieldsLimit) { + hitFieldsLimit = true; + this.emit("fieldsLimit"); + } + skipPart = true; + return; + } + ++fields; + if (this.listenerCount("field") === 0) { + skipPart = true; + return; + } + field = []; + fieldSize = 0; + } + }); + let matchPostBoundary = 0; + const ssCb = (isMatch, data, start, end, isDataSafe) => { + retrydata: + while (data) { + if (this._hparser !== null) { + const ret = this._hparser.push(data, start, end); + if (ret === -1) { + this._hparser = null; + hparser.reset(); + this.emit("error", new Error("Malformed part header")); + break; + } + start = ret; + } + if (start === end) + break; + if (matchPostBoundary !== 0) { + if (matchPostBoundary === 1) { + switch (data[start]) { + case 45: + matchPostBoundary = 2; + ++start; + break; + case 13: + matchPostBoundary = 3; + ++start; + break; + default: + matchPostBoundary = 0; + } + if (start === end) + return; + } + if (matchPostBoundary === 2) { + matchPostBoundary = 0; + if (data[start] === 45) { + this._complete = true; + this._bparser = ignoreData; + return; + } + const writecb = this._writecb; + this._writecb = noop; + ssCb(false, BUF_DASH, 0, 1, false); + this._writecb = writecb; + } else if (matchPostBoundary === 3) { + matchPostBoundary = 0; + if (data[start] === 10) { + ++start; + if (parts >= partsLimit) + break; + this._hparser = hparser; + if (start === end) + break; + continue retrydata; + } else { + const writecb = this._writecb; + this._writecb = noop; + ssCb(false, BUF_CR, 0, 1, false); + this._writecb = writecb; + } + } + } + if (!skipPart) { + if (this._fileStream) { + let chunk; + const actualLen = Math.min(end - start, fileSizeLimit - fileSize); + if (!isDataSafe) { + chunk = Buffer.allocUnsafe(actualLen); + data.copy(chunk, 0, start, start + actualLen); + } else { + chunk = data.slice(start, start + actualLen); + } + fileSize += chunk.length; + if (fileSize === fileSizeLimit) { + if (chunk.length > 0) + this._fileStream.push(chunk); + this._fileStream.emit("limit"); + this._fileStream.truncated = true; + skipPart = true; + } else if (!this._fileStream.push(chunk)) { + if (this._writecb) + this._fileStream._readcb = this._writecb; + this._writecb = null; + } + } else if (field !== void 0) { + let chunk; + const actualLen = Math.min( + end - start, + fieldSizeLimit - fieldSize + ); + if (!isDataSafe) { + chunk = Buffer.allocUnsafe(actualLen); + data.copy(chunk, 0, start, start + actualLen); + } else { + chunk = data.slice(start, start + actualLen); + } + fieldSize += actualLen; + field.push(chunk); + if (fieldSize === fieldSizeLimit) { + skipPart = true; + partTruncated = true; + } + } + } + break; + } + if (isMatch) { + matchPostBoundary = 1; + if (this._fileStream) { + this._fileStream.push(null); + this._fileStream = null; + } else if (field !== void 0) { + let data2; + switch (field.length) { + case 0: + data2 = ""; + break; + case 1: + data2 = convertToUTF8(field[0], partCharset, 0); + break; + default: + data2 = convertToUTF8( + Buffer.concat(field, fieldSize), + partCharset, + 0 + ); + } + field = void 0; + fieldSize = 0; + this.emit( + "field", + partName, + data2, + { + nameTruncated: false, + valueTruncated: partTruncated, + encoding: partEncoding, + mimeType: partType + } + ); + } + if (++parts === partsLimit) + this.emit("partsLimit"); + } + }; + this._bparser = new StreamSearch(`\r +--${boundary}`, ssCb); + this._writecb = null; + this._finalcb = null; + this.write(BUF_CRLF); + } + static detect(conType) { + return conType.type === "multipart" && conType.subtype === "form-data"; + } + _write(chunk, enc, cb) { + this._writecb = cb; + this._bparser.push(chunk, 0); + if (this._writecb) + callAndUnsetCb(this); + } + _destroy(err, cb) { + this._hparser = null; + this._bparser = ignoreData; + if (!err) + err = checkEndState(this); + const fileStream = this._fileStream; + if (fileStream) { + this._fileStream = null; + fileStream.destroy(err); + } + cb(err); + } + _final(cb) { + this._bparser.destroy(); + if (!this._complete) + return cb(new Error("Unexpected end of form")); + if (this._fileEndsLeft) + this._finalcb = finalcb.bind(null, this, cb); + else + finalcb(this, cb); + } + }; + function finalcb(self2, cb, err) { + if (err) + return cb(err); + err = checkEndState(self2); + cb(err); + } + function checkEndState(self2) { + if (self2._hparser) + return new Error("Malformed part header"); + const fileStream = self2._fileStream; + if (fileStream) { + self2._fileStream = null; + fileStream.destroy(new Error("Unexpected end of file")); + } + if (!self2._complete) + return new Error("Unexpected end of form"); + } + var TOKEN = [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 1, + 1, + 0, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ]; + var FIELD_VCHAR = [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1 + ]; + module2.exports = Multipart; + } +}); + +// node_modules/busboy/lib/types/urlencoded.js +var require_urlencoded = __commonJS({ + "node_modules/busboy/lib/types/urlencoded.js"(exports2, module2) { + "use strict"; + var { Writable } = require("stream"); + var { getDecoder } = require_utils(); + var URLEncoded = class extends Writable { + constructor(cfg) { + const streamOpts = { + autoDestroy: true, + emitClose: true, + highWaterMark: typeof cfg.highWaterMark === "number" ? cfg.highWaterMark : void 0 + }; + super(streamOpts); + let charset = cfg.defCharset || "utf8"; + if (cfg.conType.params && typeof cfg.conType.params.charset === "string") + charset = cfg.conType.params.charset; + this.charset = charset; + const limits = cfg.limits; + this.fieldSizeLimit = limits && typeof limits.fieldSize === "number" ? limits.fieldSize : 1 * 1024 * 1024; + this.fieldsLimit = limits && typeof limits.fields === "number" ? limits.fields : Infinity; + this.fieldNameSizeLimit = limits && typeof limits.fieldNameSize === "number" ? limits.fieldNameSize : 100; + this._inKey = true; + this._keyTrunc = false; + this._valTrunc = false; + this._bytesKey = 0; + this._bytesVal = 0; + this._fields = 0; + this._key = ""; + this._val = ""; + this._byte = -2; + this._lastPos = 0; + this._encode = 0; + this._decoder = getDecoder(charset); + } + static detect(conType) { + return conType.type === "application" && conType.subtype === "x-www-form-urlencoded"; + } + _write(chunk, enc, cb) { + if (this._fields >= this.fieldsLimit) + return cb(); + let i = 0; + const len = chunk.length; + this._lastPos = 0; + if (this._byte !== -2) { + i = readPctEnc(this, chunk, i, len); + if (i === -1) + return cb(new Error("Malformed urlencoded form")); + if (i >= len) + return cb(); + if (this._inKey) + ++this._bytesKey; + else + ++this._bytesVal; + } + main: + while (i < len) { + if (this._inKey) { + i = skipKeyBytes(this, chunk, i, len); + while (i < len) { + switch (chunk[i]) { + case 61: + if (this._lastPos < i) + this._key += chunk.latin1Slice(this._lastPos, i); + this._lastPos = ++i; + this._key = this._decoder(this._key, this._encode); + this._encode = 0; + this._inKey = false; + continue main; + case 38: + if (this._lastPos < i) + this._key += chunk.latin1Slice(this._lastPos, i); + this._lastPos = ++i; + this._key = this._decoder(this._key, this._encode); + this._encode = 0; + if (this._bytesKey > 0) { + this.emit( + "field", + this._key, + "", + { + nameTruncated: this._keyTrunc, + valueTruncated: false, + encoding: this.charset, + mimeType: "text/plain" + } + ); + } + this._key = ""; + this._val = ""; + this._keyTrunc = false; + this._valTrunc = false; + this._bytesKey = 0; + this._bytesVal = 0; + if (++this._fields >= this.fieldsLimit) { + this.emit("fieldsLimit"); + return cb(); + } + continue; + case 43: + if (this._lastPos < i) + this._key += chunk.latin1Slice(this._lastPos, i); + this._key += " "; + this._lastPos = i + 1; + break; + case 37: + if (this._encode === 0) + this._encode = 1; + if (this._lastPos < i) + this._key += chunk.latin1Slice(this._lastPos, i); + this._lastPos = i + 1; + this._byte = -1; + i = readPctEnc(this, chunk, i + 1, len); + if (i === -1) + return cb(new Error("Malformed urlencoded form")); + if (i >= len) + return cb(); + ++this._bytesKey; + i = skipKeyBytes(this, chunk, i, len); + continue; + } + ++i; + ++this._bytesKey; + i = skipKeyBytes(this, chunk, i, len); + } + if (this._lastPos < i) + this._key += chunk.latin1Slice(this._lastPos, i); + } else { + i = skipValBytes(this, chunk, i, len); + while (i < len) { + switch (chunk[i]) { + case 38: + if (this._lastPos < i) + this._val += chunk.latin1Slice(this._lastPos, i); + this._lastPos = ++i; + this._inKey = true; + this._val = this._decoder(this._val, this._encode); + this._encode = 0; + if (this._bytesKey > 0 || this._bytesVal > 0) { + this.emit( + "field", + this._key, + this._val, + { + nameTruncated: this._keyTrunc, + valueTruncated: this._valTrunc, + encoding: this.charset, + mimeType: "text/plain" + } + ); + } + this._key = ""; + this._val = ""; + this._keyTrunc = false; + this._valTrunc = false; + this._bytesKey = 0; + this._bytesVal = 0; + if (++this._fields >= this.fieldsLimit) { + this.emit("fieldsLimit"); + return cb(); + } + continue main; + case 43: + if (this._lastPos < i) + this._val += chunk.latin1Slice(this._lastPos, i); + this._val += " "; + this._lastPos = i + 1; + break; + case 37: + if (this._encode === 0) + this._encode = 1; + if (this._lastPos < i) + this._val += chunk.latin1Slice(this._lastPos, i); + this._lastPos = i + 1; + this._byte = -1; + i = readPctEnc(this, chunk, i + 1, len); + if (i === -1) + return cb(new Error("Malformed urlencoded form")); + if (i >= len) + return cb(); + ++this._bytesVal; + i = skipValBytes(this, chunk, i, len); + continue; + } + ++i; + ++this._bytesVal; + i = skipValBytes(this, chunk, i, len); + } + if (this._lastPos < i) + this._val += chunk.latin1Slice(this._lastPos, i); + } + } + cb(); + } + _final(cb) { + if (this._byte !== -2) + return cb(new Error("Malformed urlencoded form")); + if (!this._inKey || this._bytesKey > 0 || this._bytesVal > 0) { + if (this._inKey) + this._key = this._decoder(this._key, this._encode); + else + this._val = this._decoder(this._val, this._encode); + this.emit( + "field", + this._key, + this._val, + { + nameTruncated: this._keyTrunc, + valueTruncated: this._valTrunc, + encoding: this.charset, + mimeType: "text/plain" + } + ); + } + cb(); + } + }; + function readPctEnc(self2, chunk, pos, len) { + if (pos >= len) + return len; + if (self2._byte === -1) { + const hexUpper = HEX_VALUES[chunk[pos++]]; + if (hexUpper === -1) + return -1; + if (hexUpper >= 8) + self2._encode = 2; + if (pos < len) { + const hexLower = HEX_VALUES[chunk[pos++]]; + if (hexLower === -1) + return -1; + if (self2._inKey) + self2._key += String.fromCharCode((hexUpper << 4) + hexLower); + else + self2._val += String.fromCharCode((hexUpper << 4) + hexLower); + self2._byte = -2; + self2._lastPos = pos; + } else { + self2._byte = hexUpper; + } + } else { + const hexLower = HEX_VALUES[chunk[pos++]]; + if (hexLower === -1) + return -1; + if (self2._inKey) + self2._key += String.fromCharCode((self2._byte << 4) + hexLower); + else + self2._val += String.fromCharCode((self2._byte << 4) + hexLower); + self2._byte = -2; + self2._lastPos = pos; + } + return pos; + } + function skipKeyBytes(self2, chunk, pos, len) { + if (self2._bytesKey > self2.fieldNameSizeLimit) { + if (!self2._keyTrunc) { + if (self2._lastPos < pos) + self2._key += chunk.latin1Slice(self2._lastPos, pos - 1); + } + self2._keyTrunc = true; + for (; pos < len; ++pos) { + const code = chunk[pos]; + if (code === 61 || code === 38) + break; + ++self2._bytesKey; + } + self2._lastPos = pos; + } + return pos; + } + function skipValBytes(self2, chunk, pos, len) { + if (self2._bytesVal > self2.fieldSizeLimit) { + if (!self2._valTrunc) { + if (self2._lastPos < pos) + self2._val += chunk.latin1Slice(self2._lastPos, pos - 1); + } + self2._valTrunc = true; + for (; pos < len; ++pos) { + if (chunk[pos] === 38) + break; + ++self2._bytesVal; + } + self2._lastPos = pos; + } + return pos; + } + var HEX_VALUES = [ + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + 10, + 11, + 12, + 13, + 14, + 15, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + 10, + 11, + 12, + 13, + 14, + 15, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1, + -1 + ]; + module2.exports = URLEncoded; + } +}); + +// node_modules/busboy/lib/index.js +var require_lib = __commonJS({ + "node_modules/busboy/lib/index.js"(exports2, module2) { + "use strict"; + var { parseContentType } = require_utils(); + function getInstance(cfg) { + const headers = cfg.headers; + const conType = parseContentType(headers["content-type"]); + if (!conType) + throw new Error("Malformed content type"); + for (const type of TYPES) { + const matched = type.detect(conType); + if (!matched) + continue; + const instanceCfg = { + limits: cfg.limits, + headers, + conType, + highWaterMark: void 0, + fileHwm: void 0, + defCharset: void 0, + defParamCharset: void 0, + preservePath: false + }; + if (cfg.highWaterMark) + instanceCfg.highWaterMark = cfg.highWaterMark; + if (cfg.fileHwm) + instanceCfg.fileHwm = cfg.fileHwm; + instanceCfg.defCharset = cfg.defCharset; + instanceCfg.defParamCharset = cfg.defParamCharset; + instanceCfg.preservePath = cfg.preservePath; + return new type(instanceCfg); + } + throw new Error(`Unsupported content type: ${headers["content-type"]}`); + } + var TYPES = [ + require_multipart(), + require_urlencoded() + ].filter(function(typemod) { + return typeof typemod.detect === "function"; + }); + module2.exports = (cfg) => { + if (typeof cfg !== "object" || cfg === null) + cfg = {}; + if (typeof cfg.headers !== "object" || cfg.headers === null || typeof cfg.headers["content-type"] !== "string") { + throw new Error("Missing Content-Type"); + } + return getInstance(cfg); + }; + } +}); + +// node_modules/undici/lib/fetch/constants.js +var require_constants2 = __commonJS({ + "node_modules/undici/lib/fetch/constants.js"(exports2, module2) { + "use strict"; + var { MessageChannel, receiveMessageOnPort } = require("worker_threads"); + var corsSafeListedMethods = ["GET", "HEAD", "POST"]; + var nullBodyStatus = [101, 204, 205, 304]; + var redirectStatus = [301, 302, 303, 307, 308]; + var badPorts = [ + "1", + "7", + "9", + "11", + "13", + "15", + "17", + "19", + "20", + "21", + "22", + "23", + "25", + "37", + "42", + "43", + "53", + "69", + "77", + "79", + "87", + "95", + "101", + "102", + "103", + "104", + "109", + "110", + "111", + "113", + "115", + "117", + "119", + "123", + "135", + "137", + "139", + "143", + "161", + "179", + "389", + "427", + "465", + "512", + "513", + "514", + "515", + "526", + "530", + "531", + "532", + "540", + "548", + "554", + "556", + "563", + "587", + "601", + "636", + "989", + "990", + "993", + "995", + "1719", + "1720", + "1723", + "2049", + "3659", + "4045", + "5060", + "5061", + "6000", + "6566", + "6665", + "6666", + "6667", + "6668", + "6669", + "6697", + "10080" + ]; + var referrerPolicy = [ + "", + "no-referrer", + "no-referrer-when-downgrade", + "same-origin", + "origin", + "strict-origin", + "origin-when-cross-origin", + "strict-origin-when-cross-origin", + "unsafe-url" + ]; + var requestRedirect = ["follow", "manual", "error"]; + var safeMethods = ["GET", "HEAD", "OPTIONS", "TRACE"]; + var requestMode = ["navigate", "same-origin", "no-cors", "cors"]; + var requestCredentials = ["omit", "same-origin", "include"]; + var requestCache = [ + "default", + "no-store", + "reload", + "no-cache", + "force-cache", + "only-if-cached" + ]; + var requestBodyHeader = [ + "content-encoding", + "content-language", + "content-location", + "content-type", + // See https://github.com/nodejs/undici/issues/2021 + // 'Content-Length' is a forbidden header name, which is typically + // removed in the Headers implementation. However, undici doesn't + // filter out headers, so we add it here. + "content-length" + ]; + var requestDuplex = [ + "half" + ]; + var forbiddenMethods = ["CONNECT", "TRACE", "TRACK"]; + var subresource = [ + "audio", + "audioworklet", + "font", + "image", + "manifest", + "paintworklet", + "script", + "style", + "track", + "video", + "xslt", + "" + ]; + var DOMException2 = globalThis.DOMException ?? (() => { + try { + atob("~"); + } catch (err) { + return Object.getPrototypeOf(err).constructor; + } + })(); + var channel; + var structuredClone = globalThis.structuredClone ?? // https://github.com/nodejs/node/blob/b27ae24dcc4251bad726d9d84baf678d1f707fed/lib/internal/structured_clone.js + // structuredClone was added in v17.0.0, but fetch supports v16.8 + function structuredClone2(value, options2 = void 0) { + if (arguments.length === 0) { + throw new TypeError("missing argument"); + } + if (!channel) { + channel = new MessageChannel(); + } + channel.port1.unref(); + channel.port2.unref(); + channel.port1.postMessage(value, options2?.transfer); + return receiveMessageOnPort(channel.port2).message; + }; + module2.exports = { + DOMException: DOMException2, + structuredClone, + subresource, + forbiddenMethods, + requestBodyHeader, + referrerPolicy, + requestRedirect, + requestMode, + requestCredentials, + requestCache, + redirectStatus, + corsSafeListedMethods, + nullBodyStatus, + safeMethods, + badPorts, + requestDuplex + }; + } +}); + +// node_modules/undici/lib/fetch/global.js +var require_global = __commonJS({ + "node_modules/undici/lib/fetch/global.js"(exports2, module2) { + "use strict"; + var globalOrigin = Symbol.for("undici.globalOrigin.1"); + function getGlobalOrigin() { + return globalThis[globalOrigin]; + } + function setGlobalOrigin(newOrigin) { + if (newOrigin !== void 0 && typeof newOrigin !== "string" && !(newOrigin instanceof URL)) { + throw new Error("Invalid base url"); + } + if (newOrigin === void 0) { + Object.defineProperty(globalThis, globalOrigin, { + value: void 0, + writable: true, + enumerable: false, + configurable: false + }); + return; + } + const parsedURL = new URL(newOrigin); + if (parsedURL.protocol !== "http:" && parsedURL.protocol !== "https:") { + throw new TypeError(`Only http & https urls are allowed, received ${parsedURL.protocol}`); + } + Object.defineProperty(globalThis, globalOrigin, { + value: parsedURL, + writable: true, + enumerable: false, + configurable: false + }); + } + module2.exports = { + getGlobalOrigin, + setGlobalOrigin + }; + } +}); + +// node_modules/undici/lib/fetch/util.js +var require_util5 = __commonJS({ + "node_modules/undici/lib/fetch/util.js"(exports2, module2) { + "use strict"; + var { redirectStatus, badPorts, referrerPolicy: referrerPolicyTokens } = require_constants2(); + var { getGlobalOrigin } = require_global(); + var { performance: performance2 } = require("perf_hooks"); + var { isBlobLike, toUSVString, ReadableStreamFrom } = require_util4(); + var assert = require("assert"); + var { isUint8Array } = require("util/types"); + var crypto2; + try { + crypto2 = require("crypto"); + } catch { + } + function responseURL(response) { + const urlList = response.urlList; + const length = urlList.length; + return length === 0 ? null : urlList[length - 1].toString(); + } + function responseLocationURL(response, requestFragment) { + if (!redirectStatus.includes(response.status)) { + return null; + } + let location = response.headersList.get("location"); + if (location !== null && isValidHeaderValue(location)) { + location = new URL(location, responseURL(response)); + } + if (location && !location.hash) { + location.hash = requestFragment; + } + return location; + } + function requestCurrentURL(request) { + return request.urlList[request.urlList.length - 1]; + } + function requestBadPort(request) { + const url = requestCurrentURL(request); + if (urlIsHttpHttpsScheme(url) && badPorts.includes(url.port)) { + return "blocked"; + } + return "allowed"; + } + function isErrorLike(object) { + return object instanceof Error || (object?.constructor?.name === "Error" || object?.constructor?.name === "DOMException"); + } + function isValidReasonPhrase(statusText) { + for (let i = 0; i < statusText.length; ++i) { + const c = statusText.charCodeAt(i); + if (!(c === 9 || // HTAB + c >= 32 && c <= 126 || // SP / VCHAR + c >= 128 && c <= 255)) { + return false; + } + } + return true; + } + function isTokenChar(c) { + return !(c >= 127 || c <= 32 || c === "(" || c === ")" || c === "<" || c === ">" || c === "@" || c === "," || c === ";" || c === ":" || c === "\\" || c === '"' || c === "/" || c === "[" || c === "]" || c === "?" || c === "=" || c === "{" || c === "}"); + } + function isValidHTTPToken(characters) { + if (!characters || typeof characters !== "string") { + return false; + } + for (let i = 0; i < characters.length; ++i) { + const c = characters.charCodeAt(i); + if (c > 127 || !isTokenChar(c)) { + return false; + } + } + return true; + } + function isValidHeaderName(potentialValue) { + if (potentialValue.length === 0) { + return false; + } + return isValidHTTPToken(potentialValue); + } + function isValidHeaderValue(potentialValue) { + if (potentialValue.startsWith(" ") || potentialValue.startsWith(" ") || potentialValue.endsWith(" ") || potentialValue.endsWith(" ")) { + return false; + } + if (potentialValue.includes("\0") || potentialValue.includes("\r") || potentialValue.includes("\n")) { + return false; + } + return true; + } + function setRequestReferrerPolicyOnRedirect(request, actualResponse) { + const { headersList } = actualResponse; + const policyHeader = (headersList.get("referrer-policy") ?? "").split(","); + let policy = ""; + if (policyHeader.length > 0) { + for (let i = policyHeader.length; i !== 0; i--) { + const token = policyHeader[i - 1].trim(); + if (referrerPolicyTokens.includes(token)) { + policy = token; + break; + } + } + } + if (policy !== "") { + request.referrerPolicy = policy; + } + } + function crossOriginResourcePolicyCheck() { + return "allowed"; + } + function corsCheck() { + return "success"; + } + function TAOCheck() { + return "success"; + } + function appendFetchMetadata(httpRequest) { + let header = null; + header = httpRequest.mode; + httpRequest.headersList.set("sec-fetch-mode", header); + } + function appendRequestOriginHeader(request) { + let serializedOrigin = request.origin; + if (request.responseTainting === "cors" || request.mode === "websocket") { + if (serializedOrigin) { + request.headersList.append("origin", serializedOrigin); + } + } else if (request.method !== "GET" && request.method !== "HEAD") { + switch (request.referrerPolicy) { + case "no-referrer": + serializedOrigin = null; + break; + case "no-referrer-when-downgrade": + case "strict-origin": + case "strict-origin-when-cross-origin": + if (request.origin && urlHasHttpsScheme(request.origin) && !urlHasHttpsScheme(requestCurrentURL(request))) { + serializedOrigin = null; + } + break; + case "same-origin": + if (!sameOrigin(request, requestCurrentURL(request))) { + serializedOrigin = null; + } + break; + default: + } + if (serializedOrigin) { + request.headersList.append("origin", serializedOrigin); + } + } + } + function coarsenedSharedCurrentTime(crossOriginIsolatedCapability) { + return performance2.now(); + } + function createOpaqueTimingInfo(timingInfo) { + return { + startTime: timingInfo.startTime ?? 0, + redirectStartTime: 0, + redirectEndTime: 0, + postRedirectStartTime: timingInfo.startTime ?? 0, + finalServiceWorkerStartTime: 0, + finalNetworkResponseStartTime: 0, + finalNetworkRequestStartTime: 0, + endTime: 0, + encodedBodySize: 0, + decodedBodySize: 0, + finalConnectionTimingInfo: null + }; + } + function makePolicyContainer() { + return { + referrerPolicy: "strict-origin-when-cross-origin" + }; + } + function clonePolicyContainer(policyContainer) { + return { + referrerPolicy: policyContainer.referrerPolicy + }; + } + function determineRequestsReferrer(request) { + const policy = request.referrerPolicy; + assert(policy); + let referrerSource = null; + if (request.referrer === "client") { + const globalOrigin = getGlobalOrigin(); + if (!globalOrigin || globalOrigin.origin === "null") { + return "no-referrer"; + } + referrerSource = new URL(globalOrigin); + } else if (request.referrer instanceof URL) { + referrerSource = request.referrer; + } + let referrerURL = stripURLForReferrer(referrerSource); + const referrerOrigin = stripURLForReferrer(referrerSource, true); + if (referrerURL.toString().length > 4096) { + referrerURL = referrerOrigin; + } + const areSameOrigin = sameOrigin(request, referrerURL); + const isNonPotentiallyTrustWorthy = isURLPotentiallyTrustworthy(referrerURL) && !isURLPotentiallyTrustworthy(request.url); + switch (policy) { + case "origin": + return referrerOrigin != null ? referrerOrigin : stripURLForReferrer(referrerSource, true); + case "unsafe-url": + return referrerURL; + case "same-origin": + return areSameOrigin ? referrerOrigin : "no-referrer"; + case "origin-when-cross-origin": + return areSameOrigin ? referrerURL : referrerOrigin; + case "strict-origin-when-cross-origin": { + const currentURL = requestCurrentURL(request); + if (sameOrigin(referrerURL, currentURL)) { + return referrerURL; + } + if (isURLPotentiallyTrustworthy(referrerURL) && !isURLPotentiallyTrustworthy(currentURL)) { + return "no-referrer"; + } + return referrerOrigin; + } + case "strict-origin": + case "no-referrer-when-downgrade": + default: + return isNonPotentiallyTrustWorthy ? "no-referrer" : referrerOrigin; + } + } + function stripURLForReferrer(url, originOnly) { + assert(url instanceof URL); + if (url.protocol === "file:" || url.protocol === "about:" || url.protocol === "blank:") { + return "no-referrer"; + } + url.username = ""; + url.password = ""; + url.hash = ""; + if (originOnly) { + url.pathname = ""; + url.search = ""; + } + return url; + } + function isURLPotentiallyTrustworthy(url) { + if (!(url instanceof URL)) { + return false; + } + if (url.href === "about:blank" || url.href === "about:srcdoc") { + return true; + } + if (url.protocol === "data:") + return true; + if (url.protocol === "file:") + return true; + return isOriginPotentiallyTrustworthy(url.origin); + function isOriginPotentiallyTrustworthy(origin) { + if (origin == null || origin === "null") + return false; + const originAsURL = new URL(origin); + if (originAsURL.protocol === "https:" || originAsURL.protocol === "wss:") { + return true; + } + if (/^127(?:\.[0-9]+){0,2}\.[0-9]+$|^\[(?:0*:)*?:?0*1\]$/.test(originAsURL.hostname) || (originAsURL.hostname === "localhost" || originAsURL.hostname.includes("localhost.")) || originAsURL.hostname.endsWith(".localhost")) { + return true; + } + return false; + } + } + function bytesMatch(bytes, metadataList) { + if (crypto2 === void 0) { + return true; + } + const parsedMetadata = parseMetadata(metadataList); + if (parsedMetadata === "no metadata") { + return true; + } + if (parsedMetadata.length === 0) { + return true; + } + const list = parsedMetadata.sort((c, d) => d.algo.localeCompare(c.algo)); + const strongest = list[0].algo; + const metadata = list.filter((item) => item.algo === strongest); + for (const item of metadata) { + const algorithm = item.algo; + const expectedValue = item.hash; + const actualValue = crypto2.createHash(algorithm).update(bytes).digest("base64"); + if (actualValue === expectedValue) { + return true; + } + } + return false; + } + var parseHashWithOptions = /((?sha256|sha384|sha512)-(?[A-z0-9+/]{1}.*={0,2}))( +[\x21-\x7e]?)?/i; + function parseMetadata(metadata) { + const result = []; + let empty2 = true; + const supportedHashes = crypto2.getHashes(); + for (const token of metadata.split(" ")) { + empty2 = false; + const parsedToken = parseHashWithOptions.exec(token); + if (parsedToken === null || parsedToken.groups === void 0) { + continue; + } + const algorithm = parsedToken.groups.algo; + if (supportedHashes.includes(algorithm.toLowerCase())) { + result.push(parsedToken.groups); + } + } + if (empty2 === true) { + return "no metadata"; + } + return result; + } + function tryUpgradeRequestToAPotentiallyTrustworthyURL(request) { + } + function sameOrigin(A2, B2) { + if (A2.origin === B2.origin && A2.origin === "null") { + return true; + } + if (A2.protocol === B2.protocol && A2.hostname === B2.hostname && A2.port === B2.port) { + return true; + } + return false; + } + function createDeferredPromise() { + let res; + let rej; + const promise = new Promise((resolve, reject) => { + res = resolve; + rej = reject; + }); + return { promise, resolve: res, reject: rej }; + } + function isAborted(fetchParams) { + return fetchParams.controller.state === "aborted"; + } + function isCancelled(fetchParams) { + return fetchParams.controller.state === "aborted" || fetchParams.controller.state === "terminated"; + } + function normalizeMethod(method) { + return /^(DELETE|GET|HEAD|OPTIONS|POST|PUT)$/i.test(method) ? method.toUpperCase() : method; + } + function serializeJavascriptValueToJSONString(value) { + const result = JSON.stringify(value); + if (result === void 0) { + throw new TypeError("Value is not JSON serializable"); + } + assert(typeof result === "string"); + return result; + } + var esIteratorPrototype = Object.getPrototypeOf(Object.getPrototypeOf([][Symbol.iterator]())); + function makeIterator(iterator, name, kind) { + const object = { + index: 0, + kind, + target: iterator + }; + const i = { + next() { + if (Object.getPrototypeOf(this) !== i) { + throw new TypeError( + `'next' called on an object that does not implement interface ${name} Iterator.` + ); + } + const { index, kind: kind2, target } = object; + const values = target(); + const len = values.length; + if (index >= len) { + return { value: void 0, done: true }; + } + const pair = values[index]; + object.index = index + 1; + return iteratorResult(pair, kind2); + }, + // The class string of an iterator prototype object for a given interface is the + // result of concatenating the identifier of the interface and the string " Iterator". + [Symbol.toStringTag]: `${name} Iterator` + }; + Object.setPrototypeOf(i, esIteratorPrototype); + return Object.setPrototypeOf({}, i); + } + function iteratorResult(pair, kind) { + let result; + switch (kind) { + case "key": { + result = pair[0]; + break; + } + case "value": { + result = pair[1]; + break; + } + case "key+value": { + result = pair; + break; + } + } + return { value: result, done: false }; + } + function fullyReadBody(body, processBody, processBodyError) { + const successSteps = (bytes) => queueMicrotask(() => processBody(bytes)); + const errorSteps = (error2) => queueMicrotask(() => processBodyError(error2)); + let reader; + try { + reader = body.stream.getReader(); + } catch (e) { + errorSteps(e); + return; + } + readAllBytes(reader, successSteps, errorSteps); + } + var ReadableStream = globalThis.ReadableStream; + function isReadableStreamLike(stream) { + if (!ReadableStream) { + ReadableStream = require("stream/web").ReadableStream; + } + return stream instanceof ReadableStream || stream[Symbol.toStringTag] === "ReadableStream" && typeof stream.tee === "function"; + } + var MAXIMUM_ARGUMENT_LENGTH = 65535; + function isomorphicDecode(input) { + if (input.length < MAXIMUM_ARGUMENT_LENGTH) { + return String.fromCharCode(...input); + } + return input.reduce((previous, current) => previous + String.fromCharCode(current), ""); + } + function readableStreamClose(controller) { + try { + controller.close(); + } catch (err) { + if (!err.message.includes("Controller is already closed")) { + throw err; + } + } + } + function isomorphicEncode(input) { + for (let i = 0; i < input.length; i++) { + assert(input.charCodeAt(i) <= 255); + } + return input; + } + async function readAllBytes(reader, successSteps, failureSteps) { + const bytes = []; + let byteLength = 0; + while (true) { + let done; + let chunk; + try { + ({ done, value: chunk } = await reader.read()); + } catch (e) { + failureSteps(e); + return; + } + if (done) { + successSteps(Buffer.concat(bytes, byteLength)); + return; + } + if (!isUint8Array(chunk)) { + failureSteps(new TypeError("Received non-Uint8Array chunk")); + return; + } + bytes.push(chunk); + byteLength += chunk.length; + } + } + function urlIsLocal(url) { + assert("protocol" in url); + const protocol = url.protocol; + return protocol === "about:" || protocol === "blob:" || protocol === "data:"; + } + function urlHasHttpsScheme(url) { + if (typeof url === "string") { + return url.startsWith("https:"); + } + return url.protocol === "https:"; + } + function urlIsHttpHttpsScheme(url) { + assert("protocol" in url); + const protocol = url.protocol; + return protocol === "http:" || protocol === "https:"; + } + var hasOwn = Object.hasOwn || ((dict, key) => Object.prototype.hasOwnProperty.call(dict, key)); + module2.exports = { + isAborted, + isCancelled, + createDeferredPromise, + ReadableStreamFrom, + toUSVString, + tryUpgradeRequestToAPotentiallyTrustworthyURL, + coarsenedSharedCurrentTime, + determineRequestsReferrer, + makePolicyContainer, + clonePolicyContainer, + appendFetchMetadata, + appendRequestOriginHeader, + TAOCheck, + corsCheck, + crossOriginResourcePolicyCheck, + createOpaqueTimingInfo, + setRequestReferrerPolicyOnRedirect, + isValidHTTPToken, + requestBadPort, + requestCurrentURL, + responseURL, + responseLocationURL, + isBlobLike, + isURLPotentiallyTrustworthy, + isValidReasonPhrase, + sameOrigin, + normalizeMethod, + serializeJavascriptValueToJSONString, + makeIterator, + isValidHeaderName, + isValidHeaderValue, + hasOwn, + isErrorLike, + fullyReadBody, + bytesMatch, + isReadableStreamLike, + readableStreamClose, + isomorphicEncode, + isomorphicDecode, + urlIsLocal, + urlHasHttpsScheme, + urlIsHttpHttpsScheme, + readAllBytes + }; + } +}); + +// node_modules/undici/lib/fetch/symbols.js +var require_symbols2 = __commonJS({ + "node_modules/undici/lib/fetch/symbols.js"(exports2, module2) { + "use strict"; + module2.exports = { + kUrl: Symbol("url"), + kHeaders: Symbol("headers"), + kSignal: Symbol("signal"), + kState: Symbol("state"), + kGuard: Symbol("guard"), + kRealm: Symbol("realm") + }; + } +}); + +// node_modules/undici/lib/fetch/webidl.js +var require_webidl = __commonJS({ + "node_modules/undici/lib/fetch/webidl.js"(exports2, module2) { + "use strict"; + var { types } = require("util"); + var { hasOwn, toUSVString } = require_util5(); + var webidl = {}; + webidl.converters = {}; + webidl.util = {}; + webidl.errors = {}; + webidl.errors.exception = function(message) { + return new TypeError(`${message.header}: ${message.message}`); + }; + webidl.errors.conversionFailed = function(context) { + const plural = context.types.length === 1 ? "" : " one of"; + const message = `${context.argument} could not be converted to${plural}: ${context.types.join(", ")}.`; + return webidl.errors.exception({ + header: context.prefix, + message + }); + }; + webidl.errors.invalidArgument = function(context) { + return webidl.errors.exception({ + header: context.prefix, + message: `"${context.value}" is an invalid ${context.type}.` + }); + }; + webidl.brandCheck = function(V, I, opts = void 0) { + if (opts?.strict !== false && !(V instanceof I)) { + throw new TypeError("Illegal invocation"); + } else { + return V?.[Symbol.toStringTag] === I.prototype[Symbol.toStringTag]; + } + }; + webidl.argumentLengthCheck = function({ length }, min, ctx) { + if (length < min) { + throw webidl.errors.exception({ + message: `${min} argument${min !== 1 ? "s" : ""} required, but${length ? " only" : ""} ${length} found.`, + ...ctx + }); + } + }; + webidl.illegalConstructor = function() { + throw webidl.errors.exception({ + header: "TypeError", + message: "Illegal constructor" + }); + }; + webidl.util.Type = function(V) { + switch (typeof V) { + case "undefined": + return "Undefined"; + case "boolean": + return "Boolean"; + case "string": + return "String"; + case "symbol": + return "Symbol"; + case "number": + return "Number"; + case "bigint": + return "BigInt"; + case "function": + case "object": { + if (V === null) { + return "Null"; + } + return "Object"; + } + } + }; + webidl.util.ConvertToInt = function(V, bitLength, signedness, opts = {}) { + let upperBound; + let lowerBound; + if (bitLength === 64) { + upperBound = Math.pow(2, 53) - 1; + if (signedness === "unsigned") { + lowerBound = 0; + } else { + lowerBound = Math.pow(-2, 53) + 1; + } + } else if (signedness === "unsigned") { + lowerBound = 0; + upperBound = Math.pow(2, bitLength) - 1; + } else { + lowerBound = Math.pow(-2, bitLength) - 1; + upperBound = Math.pow(2, bitLength - 1) - 1; + } + let x = Number(V); + if (x === 0) { + x = 0; + } + if (opts.enforceRange === true) { + if (Number.isNaN(x) || x === Number.POSITIVE_INFINITY || x === Number.NEGATIVE_INFINITY) { + throw webidl.errors.exception({ + header: "Integer conversion", + message: `Could not convert ${V} to an integer.` + }); + } + x = webidl.util.IntegerPart(x); + if (x < lowerBound || x > upperBound) { + throw webidl.errors.exception({ + header: "Integer conversion", + message: `Value must be between ${lowerBound}-${upperBound}, got ${x}.` + }); + } + return x; + } + if (!Number.isNaN(x) && opts.clamp === true) { + x = Math.min(Math.max(x, lowerBound), upperBound); + if (Math.floor(x) % 2 === 0) { + x = Math.floor(x); + } else { + x = Math.ceil(x); + } + return x; + } + if (Number.isNaN(x) || x === 0 && Object.is(0, x) || x === Number.POSITIVE_INFINITY || x === Number.NEGATIVE_INFINITY) { + return 0; + } + x = webidl.util.IntegerPart(x); + x = x % Math.pow(2, bitLength); + if (signedness === "signed" && x >= Math.pow(2, bitLength) - 1) { + return x - Math.pow(2, bitLength); + } + return x; + }; + webidl.util.IntegerPart = function(n) { + const r = Math.floor(Math.abs(n)); + if (n < 0) { + return -1 * r; + } + return r; + }; + webidl.sequenceConverter = function(converter) { + return (V) => { + if (webidl.util.Type(V) !== "Object") { + throw webidl.errors.exception({ + header: "Sequence", + message: `Value of type ${webidl.util.Type(V)} is not an Object.` + }); + } + const method = V?.[Symbol.iterator]?.(); + const seq = []; + if (method === void 0 || typeof method.next !== "function") { + throw webidl.errors.exception({ + header: "Sequence", + message: "Object is not an iterator." + }); + } + while (true) { + const { done, value } = method.next(); + if (done) { + break; + } + seq.push(converter(value)); + } + return seq; + }; + }; + webidl.recordConverter = function(keyConverter, valueConverter) { + return (O2) => { + if (webidl.util.Type(O2) !== "Object") { + throw webidl.errors.exception({ + header: "Record", + message: `Value of type ${webidl.util.Type(O2)} is not an Object.` + }); + } + const result = {}; + if (!types.isProxy(O2)) { + const keys2 = Object.keys(O2); + for (const key of keys2) { + const typedKey = keyConverter(key); + const typedValue = valueConverter(O2[key]); + result[typedKey] = typedValue; + } + return result; + } + const keys = Reflect.ownKeys(O2); + for (const key of keys) { + const desc = Reflect.getOwnPropertyDescriptor(O2, key); + if (desc?.enumerable) { + const typedKey = keyConverter(key); + const typedValue = valueConverter(O2[key]); + result[typedKey] = typedValue; + } + } + return result; + }; + }; + webidl.interfaceConverter = function(i) { + return (V, opts = {}) => { + if (opts.strict !== false && !(V instanceof i)) { + throw webidl.errors.exception({ + header: i.name, + message: `Expected ${V} to be an instance of ${i.name}.` + }); + } + return V; + }; + }; + webidl.dictionaryConverter = function(converters) { + return (dictionary) => { + const type = webidl.util.Type(dictionary); + const dict = {}; + if (type === "Null" || type === "Undefined") { + return dict; + } else if (type !== "Object") { + throw webidl.errors.exception({ + header: "Dictionary", + message: `Expected ${dictionary} to be one of: Null, Undefined, Object.` + }); + } + for (const options2 of converters) { + const { key, defaultValue, required, converter } = options2; + if (required === true) { + if (!hasOwn(dictionary, key)) { + throw webidl.errors.exception({ + header: "Dictionary", + message: `Missing required key "${key}".` + }); + } + } + let value = dictionary[key]; + const hasDefault = hasOwn(options2, "defaultValue"); + if (hasDefault && value !== null) { + value = value ?? defaultValue; + } + if (required || hasDefault || value !== void 0) { + value = converter(value); + if (options2.allowedValues && !options2.allowedValues.includes(value)) { + throw webidl.errors.exception({ + header: "Dictionary", + message: `${value} is not an accepted type. Expected one of ${options2.allowedValues.join(", ")}.` + }); + } + dict[key] = value; + } + } + return dict; + }; + }; + webidl.nullableConverter = function(converter) { + return (V) => { + if (V === null) { + return V; + } + return converter(V); + }; + }; + webidl.converters.DOMString = function(V, opts = {}) { + if (V === null && opts.legacyNullToEmptyString) { + return ""; + } + if (typeof V === "symbol") { + throw new TypeError("Could not convert argument of type symbol to string."); + } + return String(V); + }; + webidl.converters.ByteString = function(V) { + const x = webidl.converters.DOMString(V); + for (let index = 0; index < x.length; index++) { + const charCode = x.charCodeAt(index); + if (charCode > 255) { + throw new TypeError( + `Cannot convert argument to a ByteString because the character at index ${index} has a value of ${charCode} which is greater than 255.` + ); + } + } + return x; + }; + webidl.converters.USVString = toUSVString; + webidl.converters.boolean = function(V) { + const x = Boolean(V); + return x; + }; + webidl.converters.any = function(V) { + return V; + }; + webidl.converters["long long"] = function(V) { + const x = webidl.util.ConvertToInt(V, 64, "signed"); + return x; + }; + webidl.converters["unsigned long long"] = function(V) { + const x = webidl.util.ConvertToInt(V, 64, "unsigned"); + return x; + }; + webidl.converters["unsigned long"] = function(V) { + const x = webidl.util.ConvertToInt(V, 32, "unsigned"); + return x; + }; + webidl.converters["unsigned short"] = function(V, opts) { + const x = webidl.util.ConvertToInt(V, 16, "unsigned", opts); + return x; + }; + webidl.converters.ArrayBuffer = function(V, opts = {}) { + if (webidl.util.Type(V) !== "Object" || !types.isAnyArrayBuffer(V)) { + throw webidl.errors.conversionFailed({ + prefix: `${V}`, + argument: `${V}`, + types: ["ArrayBuffer"] + }); + } + if (opts.allowShared === false && types.isSharedArrayBuffer(V)) { + throw webidl.errors.exception({ + header: "ArrayBuffer", + message: "SharedArrayBuffer is not allowed." + }); + } + return V; + }; + webidl.converters.TypedArray = function(V, T2, opts = {}) { + if (webidl.util.Type(V) !== "Object" || !types.isTypedArray(V) || V.constructor.name !== T2.name) { + throw webidl.errors.conversionFailed({ + prefix: `${T2.name}`, + argument: `${V}`, + types: [T2.name] + }); + } + if (opts.allowShared === false && types.isSharedArrayBuffer(V.buffer)) { + throw webidl.errors.exception({ + header: "ArrayBuffer", + message: "SharedArrayBuffer is not allowed." + }); + } + return V; + }; + webidl.converters.DataView = function(V, opts = {}) { + if (webidl.util.Type(V) !== "Object" || !types.isDataView(V)) { + throw webidl.errors.exception({ + header: "DataView", + message: "Object is not a DataView." + }); + } + if (opts.allowShared === false && types.isSharedArrayBuffer(V.buffer)) { + throw webidl.errors.exception({ + header: "ArrayBuffer", + message: "SharedArrayBuffer is not allowed." + }); + } + return V; + }; + webidl.converters.BufferSource = function(V, opts = {}) { + if (types.isAnyArrayBuffer(V)) { + return webidl.converters.ArrayBuffer(V, opts); + } + if (types.isTypedArray(V)) { + return webidl.converters.TypedArray(V, V.constructor); + } + if (types.isDataView(V)) { + return webidl.converters.DataView(V, opts); + } + throw new TypeError(`Could not convert ${V} to a BufferSource.`); + }; + webidl.converters["sequence"] = webidl.sequenceConverter( + webidl.converters.ByteString + ); + webidl.converters["sequence>"] = webidl.sequenceConverter( + webidl.converters["sequence"] + ); + webidl.converters["record"] = webidl.recordConverter( + webidl.converters.ByteString, + webidl.converters.ByteString + ); + module2.exports = { + webidl + }; + } +}); + +// node_modules/undici/lib/fetch/dataURL.js +var require_dataURL = __commonJS({ + "node_modules/undici/lib/fetch/dataURL.js"(exports2, module2) { + var assert = require("assert"); + var { atob: atob2 } = require("buffer"); + var { isomorphicDecode } = require_util5(); + var encoder = new TextEncoder(); + var HTTP_TOKEN_CODEPOINTS = /^[!#$%&'*+-.^_|~A-Za-z0-9]+$/; + var HTTP_WHITESPACE_REGEX = /(\u000A|\u000D|\u0009|\u0020)/; + var HTTP_QUOTED_STRING_TOKENS = /[\u0009|\u0020-\u007E|\u0080-\u00FF]/; + function dataURLProcessor(dataURL) { + assert(dataURL.protocol === "data:"); + let input = URLSerializer(dataURL, true); + input = input.slice(5); + const position = { position: 0 }; + let mimeType = collectASequenceOfCodePointsFast( + ",", + input, + position + ); + const mimeTypeLength = mimeType.length; + mimeType = removeASCIIWhitespace(mimeType, true, true); + if (position.position >= input.length) { + return "failure"; + } + position.position++; + const encodedBody = input.slice(mimeTypeLength + 1); + let body = stringPercentDecode(encodedBody); + if (/;(\u0020){0,}base64$/i.test(mimeType)) { + const stringBody = isomorphicDecode(body); + body = forgivingBase64(stringBody); + if (body === "failure") { + return "failure"; + } + mimeType = mimeType.slice(0, -6); + mimeType = mimeType.replace(/(\u0020)+$/, ""); + mimeType = mimeType.slice(0, -1); + } + if (mimeType.startsWith(";")) { + mimeType = "text/plain" + mimeType; + } + let mimeTypeRecord = parseMIMEType(mimeType); + if (mimeTypeRecord === "failure") { + mimeTypeRecord = parseMIMEType("text/plain;charset=US-ASCII"); + } + return { mimeType: mimeTypeRecord, body }; + } + function URLSerializer(url, excludeFragment = false) { + const href = url.href; + if (!excludeFragment) { + return href; + } + const hash = href.lastIndexOf("#"); + if (hash === -1) { + return href; + } + return href.slice(0, hash); + } + function collectASequenceOfCodePoints(condition, input, position) { + let result = ""; + while (position.position < input.length && condition(input[position.position])) { + result += input[position.position]; + position.position++; + } + return result; + } + function collectASequenceOfCodePointsFast(char, input, position) { + const idx = input.indexOf(char, position.position); + const start = position.position; + if (idx === -1) { + position.position = input.length; + return input.slice(start); + } + position.position = idx; + return input.slice(start, position.position); + } + function stringPercentDecode(input) { + const bytes = encoder.encode(input); + return percentDecode(bytes); + } + function percentDecode(input) { + const output = []; + for (let i = 0; i < input.length; i++) { + const byte = input[i]; + if (byte !== 37) { + output.push(byte); + } else if (byte === 37 && !/^[0-9A-Fa-f]{2}$/i.test(String.fromCharCode(input[i + 1], input[i + 2]))) { + output.push(37); + } else { + const nextTwoBytes = String.fromCharCode(input[i + 1], input[i + 2]); + const bytePoint = Number.parseInt(nextTwoBytes, 16); + output.push(bytePoint); + i += 2; + } + } + return Uint8Array.from(output); + } + function parseMIMEType(input) { + input = removeHTTPWhitespace(input, true, true); + const position = { position: 0 }; + const type = collectASequenceOfCodePointsFast( + "/", + input, + position + ); + if (type.length === 0 || !HTTP_TOKEN_CODEPOINTS.test(type)) { + return "failure"; + } + if (position.position > input.length) { + return "failure"; + } + position.position++; + let subtype = collectASequenceOfCodePointsFast( + ";", + input, + position + ); + subtype = removeHTTPWhitespace(subtype, false, true); + if (subtype.length === 0 || !HTTP_TOKEN_CODEPOINTS.test(subtype)) { + return "failure"; + } + const typeLowercase = type.toLowerCase(); + const subtypeLowercase = subtype.toLowerCase(); + const mimeType = { + type: typeLowercase, + subtype: subtypeLowercase, + /** @type {Map} */ + parameters: /* @__PURE__ */ new Map(), + // https://mimesniff.spec.whatwg.org/#mime-type-essence + essence: `${typeLowercase}/${subtypeLowercase}` + }; + while (position.position < input.length) { + position.position++; + collectASequenceOfCodePoints( + // https://fetch.spec.whatwg.org/#http-whitespace + (char) => HTTP_WHITESPACE_REGEX.test(char), + input, + position + ); + let parameterName = collectASequenceOfCodePoints( + (char) => char !== ";" && char !== "=", + input, + position + ); + parameterName = parameterName.toLowerCase(); + if (position.position < input.length) { + if (input[position.position] === ";") { + continue; + } + position.position++; + } + if (position.position > input.length) { + break; + } + let parameterValue = null; + if (input[position.position] === '"') { + parameterValue = collectAnHTTPQuotedString(input, position, true); + collectASequenceOfCodePointsFast( + ";", + input, + position + ); + } else { + parameterValue = collectASequenceOfCodePointsFast( + ";", + input, + position + ); + parameterValue = removeHTTPWhitespace(parameterValue, false, true); + if (parameterValue.length === 0) { + continue; + } + } + if (parameterName.length !== 0 && HTTP_TOKEN_CODEPOINTS.test(parameterName) && (parameterValue.length === 0 || HTTP_QUOTED_STRING_TOKENS.test(parameterValue)) && !mimeType.parameters.has(parameterName)) { + mimeType.parameters.set(parameterName, parameterValue); + } + } + return mimeType; + } + function forgivingBase64(data) { + data = data.replace(/[\u0009\u000A\u000C\u000D\u0020]/g, ""); + if (data.length % 4 === 0) { + data = data.replace(/=?=$/, ""); + } + if (data.length % 4 === 1) { + return "failure"; + } + if (/[^+/0-9A-Za-z]/.test(data)) { + return "failure"; + } + const binary = atob2(data); + const bytes = new Uint8Array(binary.length); + for (let byte = 0; byte < binary.length; byte++) { + bytes[byte] = binary.charCodeAt(byte); + } + return bytes; + } + function collectAnHTTPQuotedString(input, position, extractValue) { + const positionStart = position.position; + let value = ""; + assert(input[position.position] === '"'); + position.position++; + while (true) { + value += collectASequenceOfCodePoints( + (char) => char !== '"' && char !== "\\", + input, + position + ); + if (position.position >= input.length) { + break; + } + const quoteOrBackslash = input[position.position]; + position.position++; + if (quoteOrBackslash === "\\") { + if (position.position >= input.length) { + value += "\\"; + break; + } + value += input[position.position]; + position.position++; + } else { + assert(quoteOrBackslash === '"'); + break; + } + } + if (extractValue) { + return value; + } + return input.slice(positionStart, position.position); + } + function serializeAMimeType(mimeType) { + assert(mimeType !== "failure"); + const { parameters, essence } = mimeType; + let serialization = essence; + for (let [name, value] of parameters.entries()) { + serialization += ";"; + serialization += name; + serialization += "="; + if (!HTTP_TOKEN_CODEPOINTS.test(value)) { + value = value.replace(/(\\|")/g, "\\$1"); + value = '"' + value; + value += '"'; + } + serialization += value; + } + return serialization; + } + function isHTTPWhiteSpace(char) { + return char === "\r" || char === "\n" || char === " " || char === " "; + } + function removeHTTPWhitespace(str, leading = true, trailing = true) { + let lead = 0; + let trail = str.length - 1; + if (leading) { + for (; lead < str.length && isHTTPWhiteSpace(str[lead]); lead++) + ; + } + if (trailing) { + for (; trail > 0 && isHTTPWhiteSpace(str[trail]); trail--) + ; + } + return str.slice(lead, trail + 1); + } + function isASCIIWhitespace(char) { + return char === "\r" || char === "\n" || char === " " || char === "\f" || char === " "; + } + function removeASCIIWhitespace(str, leading = true, trailing = true) { + let lead = 0; + let trail = str.length - 1; + if (leading) { + for (; lead < str.length && isASCIIWhitespace(str[lead]); lead++) + ; + } + if (trailing) { + for (; trail > 0 && isASCIIWhitespace(str[trail]); trail--) + ; + } + return str.slice(lead, trail + 1); + } + module2.exports = { + dataURLProcessor, + URLSerializer, + collectASequenceOfCodePoints, + collectASequenceOfCodePointsFast, + stringPercentDecode, + parseMIMEType, + collectAnHTTPQuotedString, + serializeAMimeType + }; + } +}); + +// node_modules/undici/lib/fetch/file.js +var require_file = __commonJS({ + "node_modules/undici/lib/fetch/file.js"(exports2, module2) { + "use strict"; + var { Blob: Blob2, File: NativeFile } = require("buffer"); + var { types } = require("util"); + var { kState } = require_symbols2(); + var { isBlobLike } = require_util5(); + var { webidl } = require_webidl(); + var { parseMIMEType, serializeAMimeType } = require_dataURL(); + var { kEnumerableProperty } = require_util4(); + var File = class _File extends Blob2 { + constructor(fileBits, fileName, options2 = {}) { + webidl.argumentLengthCheck(arguments, 2, { header: "File constructor" }); + fileBits = webidl.converters["sequence"](fileBits); + fileName = webidl.converters.USVString(fileName); + options2 = webidl.converters.FilePropertyBag(options2); + const n = fileName; + let t = options2.type; + let d; + substep: { + if (t) { + t = parseMIMEType(t); + if (t === "failure") { + t = ""; + break substep; + } + t = serializeAMimeType(t).toLowerCase(); + } + d = options2.lastModified; + } + super(processBlobParts(fileBits, options2), { type: t }); + this[kState] = { + name: n, + lastModified: d, + type: t + }; + } + get name() { + webidl.brandCheck(this, _File); + return this[kState].name; + } + get lastModified() { + webidl.brandCheck(this, _File); + return this[kState].lastModified; + } + get type() { + webidl.brandCheck(this, _File); + return this[kState].type; + } + }; + var FileLike = class _FileLike { + constructor(blobLike, fileName, options2 = {}) { + const n = fileName; + const t = options2.type; + const d = options2.lastModified ?? Date.now(); + this[kState] = { + blobLike, + name: n, + type: t, + lastModified: d + }; + } + stream(...args) { + webidl.brandCheck(this, _FileLike); + return this[kState].blobLike.stream(...args); + } + arrayBuffer(...args) { + webidl.brandCheck(this, _FileLike); + return this[kState].blobLike.arrayBuffer(...args); + } + slice(...args) { + webidl.brandCheck(this, _FileLike); + return this[kState].blobLike.slice(...args); + } + text(...args) { + webidl.brandCheck(this, _FileLike); + return this[kState].blobLike.text(...args); + } + get size() { + webidl.brandCheck(this, _FileLike); + return this[kState].blobLike.size; + } + get type() { + webidl.brandCheck(this, _FileLike); + return this[kState].blobLike.type; + } + get name() { + webidl.brandCheck(this, _FileLike); + return this[kState].name; + } + get lastModified() { + webidl.brandCheck(this, _FileLike); + return this[kState].lastModified; + } + get [Symbol.toStringTag]() { + return "File"; + } + }; + Object.defineProperties(File.prototype, { + [Symbol.toStringTag]: { + value: "File", + configurable: true + }, + name: kEnumerableProperty, + lastModified: kEnumerableProperty + }); + webidl.converters.Blob = webidl.interfaceConverter(Blob2); + webidl.converters.BlobPart = function(V, opts) { + if (webidl.util.Type(V) === "Object") { + if (isBlobLike(V)) { + return webidl.converters.Blob(V, { strict: false }); + } + if (ArrayBuffer.isView(V) || types.isAnyArrayBuffer(V)) { + return webidl.converters.BufferSource(V, opts); + } + } + return webidl.converters.USVString(V, opts); + }; + webidl.converters["sequence"] = webidl.sequenceConverter( + webidl.converters.BlobPart + ); + webidl.converters.FilePropertyBag = webidl.dictionaryConverter([ + { + key: "lastModified", + converter: webidl.converters["long long"], + get defaultValue() { + return Date.now(); + } + }, + { + key: "type", + converter: webidl.converters.DOMString, + defaultValue: "" + }, + { + key: "endings", + converter: (value) => { + value = webidl.converters.DOMString(value); + value = value.toLowerCase(); + if (value !== "native") { + value = "transparent"; + } + return value; + }, + defaultValue: "transparent" + } + ]); + function processBlobParts(parts, options2) { + const bytes = []; + for (const element of parts) { + if (typeof element === "string") { + let s = element; + if (options2.endings === "native") { + s = convertLineEndingsNative(s); + } + bytes.push(new TextEncoder().encode(s)); + } else if (types.isAnyArrayBuffer(element) || types.isTypedArray(element)) { + if (!element.buffer) { + bytes.push(new Uint8Array(element)); + } else { + bytes.push( + new Uint8Array(element.buffer, element.byteOffset, element.byteLength) + ); + } + } else if (isBlobLike(element)) { + bytes.push(element); + } + } + return bytes; + } + function convertLineEndingsNative(s) { + let nativeLineEnding = "\n"; + if (process.platform === "win32") { + nativeLineEnding = "\r\n"; + } + return s.replace(/\r?\n/g, nativeLineEnding); + } + function isFileLike(object) { + return NativeFile && object instanceof NativeFile || object instanceof File || object && (typeof object.stream === "function" || typeof object.arrayBuffer === "function") && object[Symbol.toStringTag] === "File"; + } + module2.exports = { File, FileLike, isFileLike }; + } +}); + +// node_modules/undici/lib/fetch/formdata.js +var require_formdata = __commonJS({ + "node_modules/undici/lib/fetch/formdata.js"(exports2, module2) { + "use strict"; + var { isBlobLike, toUSVString, makeIterator } = require_util5(); + var { kState } = require_symbols2(); + var { File: UndiciFile, FileLike, isFileLike } = require_file(); + var { webidl } = require_webidl(); + var { Blob: Blob2, File: NativeFile } = require("buffer"); + var File = NativeFile ?? UndiciFile; + var FormData = class _FormData { + constructor(form) { + if (form !== void 0) { + throw webidl.errors.conversionFailed({ + prefix: "FormData constructor", + argument: "Argument 1", + types: ["undefined"] + }); + } + this[kState] = []; + } + append(name, value, filename = void 0) { + webidl.brandCheck(this, _FormData); + webidl.argumentLengthCheck(arguments, 2, { header: "FormData.append" }); + if (arguments.length === 3 && !isBlobLike(value)) { + throw new TypeError( + "Failed to execute 'append' on 'FormData': parameter 2 is not of type 'Blob'" + ); + } + name = webidl.converters.USVString(name); + value = isBlobLike(value) ? webidl.converters.Blob(value, { strict: false }) : webidl.converters.USVString(value); + filename = arguments.length === 3 ? webidl.converters.USVString(filename) : void 0; + const entry = makeEntry(name, value, filename); + this[kState].push(entry); + } + delete(name) { + webidl.brandCheck(this, _FormData); + webidl.argumentLengthCheck(arguments, 1, { header: "FormData.delete" }); + name = webidl.converters.USVString(name); + this[kState] = this[kState].filter((entry) => entry.name !== name); + } + get(name) { + webidl.brandCheck(this, _FormData); + webidl.argumentLengthCheck(arguments, 1, { header: "FormData.get" }); + name = webidl.converters.USVString(name); + const idx = this[kState].findIndex((entry) => entry.name === name); + if (idx === -1) { + return null; + } + return this[kState][idx].value; + } + getAll(name) { + webidl.brandCheck(this, _FormData); + webidl.argumentLengthCheck(arguments, 1, { header: "FormData.getAll" }); + name = webidl.converters.USVString(name); + return this[kState].filter((entry) => entry.name === name).map((entry) => entry.value); + } + has(name) { + webidl.brandCheck(this, _FormData); + webidl.argumentLengthCheck(arguments, 1, { header: "FormData.has" }); + name = webidl.converters.USVString(name); + return this[kState].findIndex((entry) => entry.name === name) !== -1; + } + set(name, value, filename = void 0) { + webidl.brandCheck(this, _FormData); + webidl.argumentLengthCheck(arguments, 2, { header: "FormData.set" }); + if (arguments.length === 3 && !isBlobLike(value)) { + throw new TypeError( + "Failed to execute 'set' on 'FormData': parameter 2 is not of type 'Blob'" + ); + } + name = webidl.converters.USVString(name); + value = isBlobLike(value) ? webidl.converters.Blob(value, { strict: false }) : webidl.converters.USVString(value); + filename = arguments.length === 3 ? toUSVString(filename) : void 0; + const entry = makeEntry(name, value, filename); + const idx = this[kState].findIndex((entry2) => entry2.name === name); + if (idx !== -1) { + this[kState] = [ + ...this[kState].slice(0, idx), + entry, + ...this[kState].slice(idx + 1).filter((entry2) => entry2.name !== name) + ]; + } else { + this[kState].push(entry); + } + } + entries() { + webidl.brandCheck(this, _FormData); + return makeIterator( + () => this[kState].map((pair) => [pair.name, pair.value]), + "FormData", + "key+value" + ); + } + keys() { + webidl.brandCheck(this, _FormData); + return makeIterator( + () => this[kState].map((pair) => [pair.name, pair.value]), + "FormData", + "key" + ); + } + values() { + webidl.brandCheck(this, _FormData); + return makeIterator( + () => this[kState].map((pair) => [pair.name, pair.value]), + "FormData", + "value" + ); + } + /** + * @param {(value: string, key: string, self: FormData) => void} callbackFn + * @param {unknown} thisArg + */ + forEach(callbackFn, thisArg = globalThis) { + webidl.brandCheck(this, _FormData); + webidl.argumentLengthCheck(arguments, 1, { header: "FormData.forEach" }); + if (typeof callbackFn !== "function") { + throw new TypeError( + "Failed to execute 'forEach' on 'FormData': parameter 1 is not of type 'Function'." + ); + } + for (const [key, value] of this) { + callbackFn.apply(thisArg, [value, key, this]); + } + } + }; + FormData.prototype[Symbol.iterator] = FormData.prototype.entries; + Object.defineProperties(FormData.prototype, { + [Symbol.toStringTag]: { + value: "FormData", + configurable: true + } + }); + function makeEntry(name, value, filename) { + name = Buffer.from(name).toString("utf8"); + if (typeof value === "string") { + value = Buffer.from(value).toString("utf8"); + } else { + if (!isFileLike(value)) { + value = value instanceof Blob2 ? new File([value], "blob", { type: value.type }) : new FileLike(value, "blob", { type: value.type }); + } + if (filename !== void 0) { + const options2 = { + type: value.type, + lastModified: value.lastModified + }; + value = NativeFile && value instanceof NativeFile || value instanceof UndiciFile ? new File([value], filename, options2) : new FileLike(value, filename, options2); + } + } + return { name, value }; + } + module2.exports = { FormData }; + } +}); + +// node_modules/undici/lib/fetch/body.js +var require_body = __commonJS({ + "node_modules/undici/lib/fetch/body.js"(exports2, module2) { + "use strict"; + var Busboy = require_lib(); + var util = require_util4(); + var { + ReadableStreamFrom, + isBlobLike, + isReadableStreamLike, + readableStreamClose, + createDeferredPromise, + fullyReadBody + } = require_util5(); + var { FormData } = require_formdata(); + var { kState } = require_symbols2(); + var { webidl } = require_webidl(); + var { DOMException: DOMException2, structuredClone } = require_constants2(); + var { Blob: Blob2, File: NativeFile } = require("buffer"); + var { kBodyUsed } = require_symbols(); + var assert = require("assert"); + var { isErrored } = require_util4(); + var { isUint8Array, isArrayBuffer } = require("util/types"); + var { File: UndiciFile } = require_file(); + var { parseMIMEType, serializeAMimeType } = require_dataURL(); + var ReadableStream = globalThis.ReadableStream; + var File = NativeFile ?? UndiciFile; + function extractBody(object, keepalive = false) { + if (!ReadableStream) { + ReadableStream = require("stream/web").ReadableStream; + } + let stream = null; + if (object instanceof ReadableStream) { + stream = object; + } else if (isBlobLike(object)) { + stream = object.stream(); + } else { + stream = new ReadableStream({ + async pull(controller) { + controller.enqueue( + typeof source === "string" ? new TextEncoder().encode(source) : source + ); + queueMicrotask(() => readableStreamClose(controller)); + }, + start() { + }, + type: void 0 + }); + } + assert(isReadableStreamLike(stream)); + let action = null; + let source = null; + let length = null; + let type = null; + if (typeof object === "string") { + source = object; + type = "text/plain;charset=UTF-8"; + } else if (object instanceof URLSearchParams) { + source = object.toString(); + type = "application/x-www-form-urlencoded;charset=UTF-8"; + } else if (isArrayBuffer(object)) { + source = new Uint8Array(object.slice()); + } else if (ArrayBuffer.isView(object)) { + source = new Uint8Array(object.buffer.slice(object.byteOffset, object.byteOffset + object.byteLength)); + } else if (util.isFormDataLike(object)) { + const boundary = `----formdata-undici-0${`${Math.floor(Math.random() * 1e11)}`.padStart(11, "0")}`; + const prefix = `--${boundary}\r +Content-Disposition: form-data`; + const escape2 = (str) => str.replace(/\n/g, "%0A").replace(/\r/g, "%0D").replace(/"/g, "%22"); + const normalizeLinefeeds = (value) => value.replace(/\r?\n|\r/g, "\r\n"); + const enc = new TextEncoder(); + const blobParts = []; + const rn = new Uint8Array([13, 10]); + length = 0; + let hasUnknownSizeValue = false; + for (const [name, value] of object) { + if (typeof value === "string") { + const chunk2 = enc.encode(prefix + `; name="${escape2(normalizeLinefeeds(name))}"\r +\r +${normalizeLinefeeds(value)}\r +`); + blobParts.push(chunk2); + length += chunk2.byteLength; + } else { + const chunk2 = enc.encode(`${prefix}; name="${escape2(normalizeLinefeeds(name))}"` + (value.name ? `; filename="${escape2(value.name)}"` : "") + `\r +Content-Type: ${value.type || "application/octet-stream"}\r +\r +`); + blobParts.push(chunk2, value, rn); + if (typeof value.size === "number") { + length += chunk2.byteLength + value.size + rn.byteLength; + } else { + hasUnknownSizeValue = true; + } + } + } + const chunk = enc.encode(`--${boundary}--`); + blobParts.push(chunk); + length += chunk.byteLength; + if (hasUnknownSizeValue) { + length = null; + } + source = object; + action = async function* () { + for (const part of blobParts) { + if (part.stream) { + yield* part.stream(); + } else { + yield part; + } + } + }; + type = "multipart/form-data; boundary=" + boundary; + } else if (isBlobLike(object)) { + source = object; + length = object.size; + if (object.type) { + type = object.type; + } + } else if (typeof object[Symbol.asyncIterator] === "function") { + if (keepalive) { + throw new TypeError("keepalive"); + } + if (util.isDisturbed(object) || object.locked) { + throw new TypeError( + "Response body object should not be disturbed or locked" + ); + } + stream = object instanceof ReadableStream ? object : ReadableStreamFrom(object); + } + if (typeof source === "string" || util.isBuffer(source)) { + length = Buffer.byteLength(source); + } + if (action != null) { + let iterator; + stream = new ReadableStream({ + async start() { + iterator = action(object)[Symbol.asyncIterator](); + }, + async pull(controller) { + const { value, done } = await iterator.next(); + if (done) { + queueMicrotask(() => { + controller.close(); + }); + } else { + if (!isErrored(stream)) { + controller.enqueue(new Uint8Array(value)); + } + } + return controller.desiredSize > 0; + }, + async cancel(reason) { + await iterator.return(); + }, + type: void 0 + }); + } + const body = { stream, source, length }; + return [body, type]; + } + function safelyExtractBody(object, keepalive = false) { + if (!ReadableStream) { + ReadableStream = require("stream/web").ReadableStream; + } + if (object instanceof ReadableStream) { + assert(!util.isDisturbed(object), "The body has already been consumed."); + assert(!object.locked, "The stream is locked."); + } + return extractBody(object, keepalive); + } + function cloneBody(body) { + const [out1, out2] = body.stream.tee(); + const out2Clone = structuredClone(out2, { transfer: [out2] }); + const [, finalClone] = out2Clone.tee(); + body.stream = out1; + return { + stream: finalClone, + length: body.length, + source: body.source + }; + } + async function* consumeBody(body) { + if (body) { + if (isUint8Array(body)) { + yield body; + } else { + const stream = body.stream; + if (util.isDisturbed(stream)) { + throw new TypeError("The body has already been consumed."); + } + if (stream.locked) { + throw new TypeError("The stream is locked."); + } + stream[kBodyUsed] = true; + yield* stream; + } + } + } + function throwIfAborted(state) { + if (state.aborted) { + throw new DOMException2("The operation was aborted.", "AbortError"); + } + } + function bodyMixinMethods(instance) { + const methods = { + blob() { + return specConsumeBody(this, (bytes) => { + let mimeType = bodyMimeType(this); + if (mimeType === "failure") { + mimeType = ""; + } else if (mimeType) { + mimeType = serializeAMimeType(mimeType); + } + return new Blob2([bytes], { type: mimeType }); + }, instance); + }, + arrayBuffer() { + return specConsumeBody(this, (bytes) => { + return new Uint8Array(bytes).buffer; + }, instance); + }, + text() { + return specConsumeBody(this, utf8DecodeBytes, instance); + }, + json() { + return specConsumeBody(this, parseJSONFromBytes, instance); + }, + async formData() { + webidl.brandCheck(this, instance); + throwIfAborted(this[kState]); + const contentType = this.headers.get("Content-Type"); + if (/multipart\/form-data/.test(contentType)) { + const headers = {}; + for (const [key, value] of this.headers) + headers[key.toLowerCase()] = value; + const responseFormData = new FormData(); + let busboy; + try { + busboy = Busboy({ + headers, + defParamCharset: "utf8" + }); + } catch (err) { + throw new DOMException2(`${err}`, "AbortError"); + } + busboy.on("field", (name, value) => { + responseFormData.append(name, value); + }); + busboy.on("file", (name, value, info2) => { + const { filename, encoding, mimeType } = info2; + const chunks = []; + if (encoding === "base64" || encoding.toLowerCase() === "base64") { + let base64chunk = ""; + value.on("data", (chunk) => { + base64chunk += chunk.toString().replace(/[\r\n]/gm, ""); + const end = base64chunk.length - base64chunk.length % 4; + chunks.push(Buffer.from(base64chunk.slice(0, end), "base64")); + base64chunk = base64chunk.slice(end); + }); + value.on("end", () => { + chunks.push(Buffer.from(base64chunk, "base64")); + responseFormData.append(name, new File(chunks, filename, { type: mimeType })); + }); + } else { + value.on("data", (chunk) => { + chunks.push(chunk); + }); + value.on("end", () => { + responseFormData.append(name, new File(chunks, filename, { type: mimeType })); + }); + } + }); + const busboyResolve = new Promise((resolve, reject) => { + busboy.on("finish", resolve); + busboy.on("error", (err) => reject(new TypeError(err))); + }); + if (this.body !== null) + for await (const chunk of consumeBody(this[kState].body)) + busboy.write(chunk); + busboy.end(); + await busboyResolve; + return responseFormData; + } else if (/application\/x-www-form-urlencoded/.test(contentType)) { + let entries; + try { + let text = ""; + const textDecoder = new TextDecoder("utf-8", { ignoreBOM: true }); + for await (const chunk of consumeBody(this[kState].body)) { + if (!isUint8Array(chunk)) { + throw new TypeError("Expected Uint8Array chunk"); + } + text += textDecoder.decode(chunk, { stream: true }); + } + text += textDecoder.decode(); + entries = new URLSearchParams(text); + } catch (err) { + throw Object.assign(new TypeError(), { cause: err }); + } + const formData = new FormData(); + for (const [name, value] of entries) { + formData.append(name, value); + } + return formData; + } else { + await Promise.resolve(); + throwIfAborted(this[kState]); + throw webidl.errors.exception({ + header: `${instance.name}.formData`, + message: "Could not parse content as FormData." + }); + } + } + }; + return methods; + } + function mixinBody(prototype) { + Object.assign(prototype.prototype, bodyMixinMethods(prototype)); + } + async function specConsumeBody(object, convertBytesToJSValue, instance) { + webidl.brandCheck(object, instance); + throwIfAborted(object[kState]); + if (bodyUnusable(object[kState].body)) { + throw new TypeError("Body is unusable"); + } + const promise = createDeferredPromise(); + const errorSteps = (error2) => promise.reject(error2); + const successSteps = (data) => { + try { + promise.resolve(convertBytesToJSValue(data)); + } catch (e) { + errorSteps(e); + } + }; + if (object[kState].body == null) { + successSteps(new Uint8Array()); + return promise.promise; + } + fullyReadBody(object[kState].body, successSteps, errorSteps); + return promise.promise; + } + function bodyUnusable(body) { + return body != null && (body.stream.locked || util.isDisturbed(body.stream)); + } + function utf8DecodeBytes(buffer) { + if (buffer.length === 0) { + return ""; + } + if (buffer[0] === 239 && buffer[1] === 187 && buffer[2] === 191) { + buffer = buffer.subarray(3); + } + const output = new TextDecoder().decode(buffer); + return output; + } + function parseJSONFromBytes(bytes) { + return JSON.parse(utf8DecodeBytes(bytes)); + } + function bodyMimeType(object) { + const { headersList } = object[kState]; + const contentType = headersList.get("content-type"); + if (contentType === null) { + return "failure"; + } + return parseMIMEType(contentType); + } + module2.exports = { + extractBody, + safelyExtractBody, + cloneBody, + mixinBody + }; + } +}); + +// node_modules/undici/lib/core/request.js +var require_request = __commonJS({ + "node_modules/undici/lib/core/request.js"(exports2, module2) { + "use strict"; + var { + InvalidArgumentError, + NotSupportedError + } = require_errors(); + var assert = require("assert"); + var util = require_util4(); + var tokenRegExp = /^[\^_`a-zA-Z\-0-9!#$%&'*+.|~]+$/; + var headerCharRegex = /[^\t\x20-\x7e\x80-\xff]/; + var invalidPathRegex = /[^\u0021-\u00ff]/; + var kHandler = Symbol("handler"); + var channels = {}; + var extractBody; + try { + const diagnosticsChannel = require("diagnostics_channel"); + channels.create = diagnosticsChannel.channel("undici:request:create"); + channels.bodySent = diagnosticsChannel.channel("undici:request:bodySent"); + channels.headers = diagnosticsChannel.channel("undici:request:headers"); + channels.trailers = diagnosticsChannel.channel("undici:request:trailers"); + channels.error = diagnosticsChannel.channel("undici:request:error"); + } catch { + channels.create = { hasSubscribers: false }; + channels.bodySent = { hasSubscribers: false }; + channels.headers = { hasSubscribers: false }; + channels.trailers = { hasSubscribers: false }; + channels.error = { hasSubscribers: false }; + } + var Request = class { + constructor(origin, { + path, + method, + body, + headers, + query, + idempotent, + blocking, + upgrade, + headersTimeout, + bodyTimeout, + reset, + throwOnError + }, handler2) { + if (typeof path !== "string") { + throw new InvalidArgumentError("path must be a string"); + } else if (path[0] !== "/" && !(path.startsWith("http://") || path.startsWith("https://")) && method !== "CONNECT") { + throw new InvalidArgumentError("path must be an absolute URL or start with a slash"); + } else if (invalidPathRegex.exec(path) !== null) { + throw new InvalidArgumentError("invalid request path"); + } + if (typeof method !== "string") { + throw new InvalidArgumentError("method must be a string"); + } else if (tokenRegExp.exec(method) === null) { + throw new InvalidArgumentError("invalid request method"); + } + if (upgrade && typeof upgrade !== "string") { + throw new InvalidArgumentError("upgrade must be a string"); + } + if (headersTimeout != null && (!Number.isFinite(headersTimeout) || headersTimeout < 0)) { + throw new InvalidArgumentError("invalid headersTimeout"); + } + if (bodyTimeout != null && (!Number.isFinite(bodyTimeout) || bodyTimeout < 0)) { + throw new InvalidArgumentError("invalid bodyTimeout"); + } + if (reset != null && typeof reset !== "boolean") { + throw new InvalidArgumentError("invalid reset"); + } + this.headersTimeout = headersTimeout; + this.bodyTimeout = bodyTimeout; + this.throwOnError = throwOnError === true; + this.method = method; + if (body == null) { + this.body = null; + } else if (util.isStream(body)) { + this.body = body; + } else if (util.isBuffer(body)) { + this.body = body.byteLength ? body : null; + } else if (ArrayBuffer.isView(body)) { + this.body = body.buffer.byteLength ? Buffer.from(body.buffer, body.byteOffset, body.byteLength) : null; + } else if (body instanceof ArrayBuffer) { + this.body = body.byteLength ? Buffer.from(body) : null; + } else if (typeof body === "string") { + this.body = body.length ? Buffer.from(body) : null; + } else if (util.isFormDataLike(body) || util.isIterable(body) || util.isBlobLike(body)) { + this.body = body; + } else { + throw new InvalidArgumentError("body must be a string, a Buffer, a Readable stream, an iterable, or an async iterable"); + } + this.completed = false; + this.aborted = false; + this.upgrade = upgrade || null; + this.path = query ? util.buildURL(path, query) : path; + this.origin = origin; + this.idempotent = idempotent == null ? method === "HEAD" || method === "GET" : idempotent; + this.blocking = blocking == null ? false : blocking; + this.reset = reset == null ? null : reset; + this.host = null; + this.contentLength = null; + this.contentType = null; + this.headers = ""; + if (Array.isArray(headers)) { + if (headers.length % 2 !== 0) { + throw new InvalidArgumentError("headers array must be even"); + } + for (let i = 0; i < headers.length; i += 2) { + processHeader(this, headers[i], headers[i + 1]); + } + } else if (headers && typeof headers === "object") { + const keys = Object.keys(headers); + for (let i = 0; i < keys.length; i++) { + const key = keys[i]; + processHeader(this, key, headers[key]); + } + } else if (headers != null) { + throw new InvalidArgumentError("headers must be an object or an array"); + } + if (util.isFormDataLike(this.body)) { + if (util.nodeMajor < 16 || util.nodeMajor === 16 && util.nodeMinor < 8) { + throw new InvalidArgumentError("Form-Data bodies are only supported in node v16.8 and newer."); + } + if (!extractBody) { + extractBody = require_body().extractBody; + } + const [bodyStream, contentType] = extractBody(body); + if (this.contentType == null) { + this.contentType = contentType; + this.headers += `content-type: ${contentType}\r +`; + } + this.body = bodyStream.stream; + this.contentLength = bodyStream.length; + } else if (util.isBlobLike(body) && this.contentType == null && body.type) { + this.contentType = body.type; + this.headers += `content-type: ${body.type}\r +`; + } + util.validateHandler(handler2, method, upgrade); + this.servername = util.getServerName(this.host); + this[kHandler] = handler2; + if (channels.create.hasSubscribers) { + channels.create.publish({ request: this }); + } + } + onBodySent(chunk) { + if (this[kHandler].onBodySent) { + try { + this[kHandler].onBodySent(chunk); + } catch (err) { + this.onError(err); + } + } + } + onRequestSent() { + if (channels.bodySent.hasSubscribers) { + channels.bodySent.publish({ request: this }); + } + } + onConnect(abort) { + assert(!this.aborted); + assert(!this.completed); + return this[kHandler].onConnect(abort); + } + onHeaders(statusCode, headers, resume, statusText) { + assert(!this.aborted); + assert(!this.completed); + if (channels.headers.hasSubscribers) { + channels.headers.publish({ request: this, response: { statusCode, headers, statusText } }); + } + return this[kHandler].onHeaders(statusCode, headers, resume, statusText); + } + onData(chunk) { + assert(!this.aborted); + assert(!this.completed); + return this[kHandler].onData(chunk); + } + onUpgrade(statusCode, headers, socket) { + assert(!this.aborted); + assert(!this.completed); + return this[kHandler].onUpgrade(statusCode, headers, socket); + } + onComplete(trailers) { + assert(!this.aborted); + this.completed = true; + if (channels.trailers.hasSubscribers) { + channels.trailers.publish({ request: this, trailers }); + } + return this[kHandler].onComplete(trailers); + } + onError(error2) { + if (channels.error.hasSubscribers) { + channels.error.publish({ request: this, error: error2 }); + } + if (this.aborted) { + return; + } + this.aborted = true; + return this[kHandler].onError(error2); + } + addHeader(key, value) { + processHeader(this, key, value); + return this; + } + }; + function processHeaderValue(key, val) { + if (val && typeof val === "object") { + throw new InvalidArgumentError(`invalid ${key} header`); + } + val = val != null ? `${val}` : ""; + if (headerCharRegex.exec(val) !== null) { + throw new InvalidArgumentError(`invalid ${key} header`); + } + return `${key}: ${val}\r +`; + } + function processHeader(request, key, val) { + if (val && (typeof val === "object" && !Array.isArray(val))) { + throw new InvalidArgumentError(`invalid ${key} header`); + } else if (val === void 0) { + return; + } + if (request.host === null && key.length === 4 && key.toLowerCase() === "host") { + if (headerCharRegex.exec(val) !== null) { + throw new InvalidArgumentError(`invalid ${key} header`); + } + request.host = val; + } else if (request.contentLength === null && key.length === 14 && key.toLowerCase() === "content-length") { + request.contentLength = parseInt(val, 10); + if (!Number.isFinite(request.contentLength)) { + throw new InvalidArgumentError("invalid content-length header"); + } + } else if (request.contentType === null && key.length === 12 && key.toLowerCase() === "content-type") { + request.contentType = val; + request.headers += processHeaderValue(key, val); + } else if (key.length === 17 && key.toLowerCase() === "transfer-encoding") { + throw new InvalidArgumentError("invalid transfer-encoding header"); + } else if (key.length === 10 && key.toLowerCase() === "connection") { + const value = typeof val === "string" ? val.toLowerCase() : null; + if (value !== "close" && value !== "keep-alive") { + throw new InvalidArgumentError("invalid connection header"); + } else if (value === "close") { + request.reset = true; + } + } else if (key.length === 10 && key.toLowerCase() === "keep-alive") { + throw new InvalidArgumentError("invalid keep-alive header"); + } else if (key.length === 7 && key.toLowerCase() === "upgrade") { + throw new InvalidArgumentError("invalid upgrade header"); + } else if (key.length === 6 && key.toLowerCase() === "expect") { + throw new NotSupportedError("expect header not supported"); + } else if (tokenRegExp.exec(key) === null) { + throw new InvalidArgumentError("invalid header key"); + } else { + if (Array.isArray(val)) { + for (let i = 0; i < val.length; i++) { + request.headers += processHeaderValue(key, val[i]); + } + } else { + request.headers += processHeaderValue(key, val); + } + } + } + module2.exports = Request; + } +}); + +// node_modules/undici/lib/dispatcher.js +var require_dispatcher = __commonJS({ + "node_modules/undici/lib/dispatcher.js"(exports2, module2) { + "use strict"; + var EventEmitter = require("events"); + var Dispatcher = class extends EventEmitter { + dispatch() { + throw new Error("not implemented"); + } + close() { + throw new Error("not implemented"); + } + destroy() { + throw new Error("not implemented"); + } + }; + module2.exports = Dispatcher; + } +}); + +// node_modules/undici/lib/dispatcher-base.js +var require_dispatcher_base = __commonJS({ + "node_modules/undici/lib/dispatcher-base.js"(exports2, module2) { + "use strict"; + var Dispatcher = require_dispatcher(); + var { + ClientDestroyedError, + ClientClosedError, + InvalidArgumentError + } = require_errors(); + var { kDestroy, kClose, kDispatch, kInterceptors } = require_symbols(); + var kDestroyed = Symbol("destroyed"); + var kClosed = Symbol("closed"); + var kOnDestroyed = Symbol("onDestroyed"); + var kOnClosed = Symbol("onClosed"); + var kInterceptedDispatch = Symbol("Intercepted Dispatch"); + var DispatcherBase = class extends Dispatcher { + constructor() { + super(); + this[kDestroyed] = false; + this[kOnDestroyed] = null; + this[kClosed] = false; + this[kOnClosed] = []; + } + get destroyed() { + return this[kDestroyed]; + } + get closed() { + return this[kClosed]; + } + get interceptors() { + return this[kInterceptors]; + } + set interceptors(newInterceptors) { + if (newInterceptors) { + for (let i = newInterceptors.length - 1; i >= 0; i--) { + const interceptor = this[kInterceptors][i]; + if (typeof interceptor !== "function") { + throw new InvalidArgumentError("interceptor must be an function"); + } + } + } + this[kInterceptors] = newInterceptors; + } + close(callback) { + if (callback === void 0) { + return new Promise((resolve, reject) => { + this.close((err, data) => { + return err ? reject(err) : resolve(data); + }); + }); + } + if (typeof callback !== "function") { + throw new InvalidArgumentError("invalid callback"); + } + if (this[kDestroyed]) { + queueMicrotask(() => callback(new ClientDestroyedError(), null)); + return; + } + if (this[kClosed]) { + if (this[kOnClosed]) { + this[kOnClosed].push(callback); + } else { + queueMicrotask(() => callback(null, null)); + } + return; + } + this[kClosed] = true; + this[kOnClosed].push(callback); + const onClosed = () => { + const callbacks = this[kOnClosed]; + this[kOnClosed] = null; + for (let i = 0; i < callbacks.length; i++) { + callbacks[i](null, null); + } + }; + this[kClose]().then(() => this.destroy()).then(() => { + queueMicrotask(onClosed); + }); + } + destroy(err, callback) { + if (typeof err === "function") { + callback = err; + err = null; + } + if (callback === void 0) { + return new Promise((resolve, reject) => { + this.destroy(err, (err2, data) => { + return err2 ? ( + /* istanbul ignore next: should never error */ + reject(err2) + ) : resolve(data); + }); + }); + } + if (typeof callback !== "function") { + throw new InvalidArgumentError("invalid callback"); + } + if (this[kDestroyed]) { + if (this[kOnDestroyed]) { + this[kOnDestroyed].push(callback); + } else { + queueMicrotask(() => callback(null, null)); + } + return; + } + if (!err) { + err = new ClientDestroyedError(); + } + this[kDestroyed] = true; + this[kOnDestroyed] = this[kOnDestroyed] || []; + this[kOnDestroyed].push(callback); + const onDestroyed = () => { + const callbacks = this[kOnDestroyed]; + this[kOnDestroyed] = null; + for (let i = 0; i < callbacks.length; i++) { + callbacks[i](null, null); + } + }; + this[kDestroy](err).then(() => { + queueMicrotask(onDestroyed); + }); + } + [kInterceptedDispatch](opts, handler2) { + if (!this[kInterceptors] || this[kInterceptors].length === 0) { + this[kInterceptedDispatch] = this[kDispatch]; + return this[kDispatch](opts, handler2); + } + let dispatch = this[kDispatch].bind(this); + for (let i = this[kInterceptors].length - 1; i >= 0; i--) { + dispatch = this[kInterceptors][i](dispatch); + } + this[kInterceptedDispatch] = dispatch; + return dispatch(opts, handler2); + } + dispatch(opts, handler2) { + if (!handler2 || typeof handler2 !== "object") { + throw new InvalidArgumentError("handler must be an object"); + } + try { + if (!opts || typeof opts !== "object") { + throw new InvalidArgumentError("opts must be an object."); + } + if (this[kDestroyed] || this[kOnDestroyed]) { + throw new ClientDestroyedError(); + } + if (this[kClosed]) { + throw new ClientClosedError(); + } + return this[kInterceptedDispatch](opts, handler2); + } catch (err) { + if (typeof handler2.onError !== "function") { + throw new InvalidArgumentError("invalid onError method"); + } + handler2.onError(err); + return false; + } + } + }; + module2.exports = DispatcherBase; + } +}); + +// node_modules/undici/lib/core/connect.js +var require_connect2 = __commonJS({ + "node_modules/undici/lib/core/connect.js"(exports2, module2) { + "use strict"; + var net = require("net"); + var assert = require("assert"); + var util = require_util4(); + var { InvalidArgumentError, ConnectTimeoutError } = require_errors(); + var tls; + var SessionCache; + if (global.FinalizationRegistry) { + SessionCache = class WeakSessionCache { + constructor(maxCachedSessions) { + this._maxCachedSessions = maxCachedSessions; + this._sessionCache = /* @__PURE__ */ new Map(); + this._sessionRegistry = new global.FinalizationRegistry((key) => { + if (this._sessionCache.size < this._maxCachedSessions) { + return; + } + const ref = this._sessionCache.get(key); + if (ref !== void 0 && ref.deref() === void 0) { + this._sessionCache.delete(key); + } + }); + } + get(sessionKey) { + const ref = this._sessionCache.get(sessionKey); + return ref ? ref.deref() : null; + } + set(sessionKey, session) { + if (this._maxCachedSessions === 0) { + return; + } + this._sessionCache.set(sessionKey, new WeakRef(session)); + this._sessionRegistry.register(session, sessionKey); + } + }; + } else { + SessionCache = class SimpleSessionCache { + constructor(maxCachedSessions) { + this._maxCachedSessions = maxCachedSessions; + this._sessionCache = /* @__PURE__ */ new Map(); + } + get(sessionKey) { + return this._sessionCache.get(sessionKey); + } + set(sessionKey, session) { + if (this._maxCachedSessions === 0) { + return; + } + if (this._sessionCache.size >= this._maxCachedSessions) { + const { value: oldestKey } = this._sessionCache.keys().next(); + this._sessionCache.delete(oldestKey); + } + this._sessionCache.set(sessionKey, session); + } + }; + } + function buildConnector({ maxCachedSessions, socketPath, timeout, ...opts }) { + if (maxCachedSessions != null && (!Number.isInteger(maxCachedSessions) || maxCachedSessions < 0)) { + throw new InvalidArgumentError("maxCachedSessions must be a positive integer or zero"); + } + const options2 = { path: socketPath, ...opts }; + const sessionCache = new SessionCache(maxCachedSessions == null ? 100 : maxCachedSessions); + timeout = timeout == null ? 1e4 : timeout; + return function connect({ hostname, host, protocol, port, servername, localAddress, httpSocket }, callback) { + let socket; + if (protocol === "https:") { + if (!tls) { + tls = require("tls"); + } + servername = servername || options2.servername || util.getServerName(host) || null; + const sessionKey = servername || hostname; + const session = sessionCache.get(sessionKey) || null; + assert(sessionKey); + socket = tls.connect({ + highWaterMark: 16384, + // TLS in node can't have bigger HWM anyway... + ...options2, + servername, + session, + localAddress, + socket: httpSocket, + // upgrade socket connection + port: port || 443, + host: hostname + }); + socket.on("session", function(session2) { + sessionCache.set(sessionKey, session2); + }); + } else { + assert(!httpSocket, "httpSocket can only be sent on TLS update"); + socket = net.connect({ + highWaterMark: 64 * 1024, + // Same as nodejs fs streams. + ...options2, + localAddress, + port: port || 80, + host: hostname + }); + } + if (options2.keepAlive == null || options2.keepAlive) { + const keepAliveInitialDelay = options2.keepAliveInitialDelay === void 0 ? 6e4 : options2.keepAliveInitialDelay; + socket.setKeepAlive(true, keepAliveInitialDelay); + } + const cancelTimeout = setupTimeout(() => onConnectTimeout(socket), timeout); + socket.setNoDelay(true).once(protocol === "https:" ? "secureConnect" : "connect", function() { + cancelTimeout(); + if (callback) { + const cb = callback; + callback = null; + cb(null, this); + } + }).on("error", function(err) { + cancelTimeout(); + if (callback) { + const cb = callback; + callback = null; + cb(err); + } + }); + return socket; + }; + } + function setupTimeout(onConnectTimeout2, timeout) { + if (!timeout) { + return () => { + }; + } + let s1 = null; + let s2 = null; + const timeoutId = setTimeout(() => { + s1 = setImmediate(() => { + if (process.platform === "win32") { + s2 = setImmediate(() => onConnectTimeout2()); + } else { + onConnectTimeout2(); + } + }); + }, timeout); + return () => { + clearTimeout(timeoutId); + clearImmediate(s1); + clearImmediate(s2); + }; + } + function onConnectTimeout(socket) { + util.destroy(socket, new ConnectTimeoutError()); + } + module2.exports = buildConnector; + } +}); + +// node_modules/undici/lib/llhttp/utils.js +var require_utils2 = __commonJS({ + "node_modules/undici/lib/llhttp/utils.js"(exports2) { + "use strict"; + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.enumToMap = void 0; + function enumToMap(obj) { + const res = {}; + Object.keys(obj).forEach((key) => { + const value = obj[key]; + if (typeof value === "number") { + res[key] = value; + } + }); + return res; + } + exports2.enumToMap = enumToMap; + } +}); + +// node_modules/undici/lib/llhttp/constants.js +var require_constants3 = __commonJS({ + "node_modules/undici/lib/llhttp/constants.js"(exports2) { + "use strict"; + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.SPECIAL_HEADERS = exports2.HEADER_STATE = exports2.MINOR = exports2.MAJOR = exports2.CONNECTION_TOKEN_CHARS = exports2.HEADER_CHARS = exports2.TOKEN = exports2.STRICT_TOKEN = exports2.HEX = exports2.URL_CHAR = exports2.STRICT_URL_CHAR = exports2.USERINFO_CHARS = exports2.MARK = exports2.ALPHANUM = exports2.NUM = exports2.HEX_MAP = exports2.NUM_MAP = exports2.ALPHA = exports2.FINISH = exports2.H_METHOD_MAP = exports2.METHOD_MAP = exports2.METHODS_RTSP = exports2.METHODS_ICE = exports2.METHODS_HTTP = exports2.METHODS = exports2.LENIENT_FLAGS = exports2.FLAGS = exports2.TYPE = exports2.ERROR = void 0; + var utils_1 = require_utils2(); + var ERROR; + (function(ERROR2) { + ERROR2[ERROR2["OK"] = 0] = "OK"; + ERROR2[ERROR2["INTERNAL"] = 1] = "INTERNAL"; + ERROR2[ERROR2["STRICT"] = 2] = "STRICT"; + ERROR2[ERROR2["LF_EXPECTED"] = 3] = "LF_EXPECTED"; + ERROR2[ERROR2["UNEXPECTED_CONTENT_LENGTH"] = 4] = "UNEXPECTED_CONTENT_LENGTH"; + ERROR2[ERROR2["CLOSED_CONNECTION"] = 5] = "CLOSED_CONNECTION"; + ERROR2[ERROR2["INVALID_METHOD"] = 6] = "INVALID_METHOD"; + ERROR2[ERROR2["INVALID_URL"] = 7] = "INVALID_URL"; + ERROR2[ERROR2["INVALID_CONSTANT"] = 8] = "INVALID_CONSTANT"; + ERROR2[ERROR2["INVALID_VERSION"] = 9] = "INVALID_VERSION"; + ERROR2[ERROR2["INVALID_HEADER_TOKEN"] = 10] = "INVALID_HEADER_TOKEN"; + ERROR2[ERROR2["INVALID_CONTENT_LENGTH"] = 11] = "INVALID_CONTENT_LENGTH"; + ERROR2[ERROR2["INVALID_CHUNK_SIZE"] = 12] = "INVALID_CHUNK_SIZE"; + ERROR2[ERROR2["INVALID_STATUS"] = 13] = "INVALID_STATUS"; + ERROR2[ERROR2["INVALID_EOF_STATE"] = 14] = "INVALID_EOF_STATE"; + ERROR2[ERROR2["INVALID_TRANSFER_ENCODING"] = 15] = "INVALID_TRANSFER_ENCODING"; + ERROR2[ERROR2["CB_MESSAGE_BEGIN"] = 16] = "CB_MESSAGE_BEGIN"; + ERROR2[ERROR2["CB_HEADERS_COMPLETE"] = 17] = "CB_HEADERS_COMPLETE"; + ERROR2[ERROR2["CB_MESSAGE_COMPLETE"] = 18] = "CB_MESSAGE_COMPLETE"; + ERROR2[ERROR2["CB_CHUNK_HEADER"] = 19] = "CB_CHUNK_HEADER"; + ERROR2[ERROR2["CB_CHUNK_COMPLETE"] = 20] = "CB_CHUNK_COMPLETE"; + ERROR2[ERROR2["PAUSED"] = 21] = "PAUSED"; + ERROR2[ERROR2["PAUSED_UPGRADE"] = 22] = "PAUSED_UPGRADE"; + ERROR2[ERROR2["PAUSED_H2_UPGRADE"] = 23] = "PAUSED_H2_UPGRADE"; + ERROR2[ERROR2["USER"] = 24] = "USER"; + })(ERROR = exports2.ERROR || (exports2.ERROR = {})); + var TYPE; + (function(TYPE2) { + TYPE2[TYPE2["BOTH"] = 0] = "BOTH"; + TYPE2[TYPE2["REQUEST"] = 1] = "REQUEST"; + TYPE2[TYPE2["RESPONSE"] = 2] = "RESPONSE"; + })(TYPE = exports2.TYPE || (exports2.TYPE = {})); + var FLAGS; + (function(FLAGS2) { + FLAGS2[FLAGS2["CONNECTION_KEEP_ALIVE"] = 1] = "CONNECTION_KEEP_ALIVE"; + FLAGS2[FLAGS2["CONNECTION_CLOSE"] = 2] = "CONNECTION_CLOSE"; + FLAGS2[FLAGS2["CONNECTION_UPGRADE"] = 4] = "CONNECTION_UPGRADE"; + FLAGS2[FLAGS2["CHUNKED"] = 8] = "CHUNKED"; + FLAGS2[FLAGS2["UPGRADE"] = 16] = "UPGRADE"; + FLAGS2[FLAGS2["CONTENT_LENGTH"] = 32] = "CONTENT_LENGTH"; + FLAGS2[FLAGS2["SKIPBODY"] = 64] = "SKIPBODY"; + FLAGS2[FLAGS2["TRAILING"] = 128] = "TRAILING"; + FLAGS2[FLAGS2["TRANSFER_ENCODING"] = 512] = "TRANSFER_ENCODING"; + })(FLAGS = exports2.FLAGS || (exports2.FLAGS = {})); + var LENIENT_FLAGS; + (function(LENIENT_FLAGS2) { + LENIENT_FLAGS2[LENIENT_FLAGS2["HEADERS"] = 1] = "HEADERS"; + LENIENT_FLAGS2[LENIENT_FLAGS2["CHUNKED_LENGTH"] = 2] = "CHUNKED_LENGTH"; + LENIENT_FLAGS2[LENIENT_FLAGS2["KEEP_ALIVE"] = 4] = "KEEP_ALIVE"; + })(LENIENT_FLAGS = exports2.LENIENT_FLAGS || (exports2.LENIENT_FLAGS = {})); + var METHODS; + (function(METHODS2) { + METHODS2[METHODS2["DELETE"] = 0] = "DELETE"; + METHODS2[METHODS2["GET"] = 1] = "GET"; + METHODS2[METHODS2["HEAD"] = 2] = "HEAD"; + METHODS2[METHODS2["POST"] = 3] = "POST"; + METHODS2[METHODS2["PUT"] = 4] = "PUT"; + METHODS2[METHODS2["CONNECT"] = 5] = "CONNECT"; + METHODS2[METHODS2["OPTIONS"] = 6] = "OPTIONS"; + METHODS2[METHODS2["TRACE"] = 7] = "TRACE"; + METHODS2[METHODS2["COPY"] = 8] = "COPY"; + METHODS2[METHODS2["LOCK"] = 9] = "LOCK"; + METHODS2[METHODS2["MKCOL"] = 10] = "MKCOL"; + METHODS2[METHODS2["MOVE"] = 11] = "MOVE"; + METHODS2[METHODS2["PROPFIND"] = 12] = "PROPFIND"; + METHODS2[METHODS2["PROPPATCH"] = 13] = "PROPPATCH"; + METHODS2[METHODS2["SEARCH"] = 14] = "SEARCH"; + METHODS2[METHODS2["UNLOCK"] = 15] = "UNLOCK"; + METHODS2[METHODS2["BIND"] = 16] = "BIND"; + METHODS2[METHODS2["REBIND"] = 17] = "REBIND"; + METHODS2[METHODS2["UNBIND"] = 18] = "UNBIND"; + METHODS2[METHODS2["ACL"] = 19] = "ACL"; + METHODS2[METHODS2["REPORT"] = 20] = "REPORT"; + METHODS2[METHODS2["MKACTIVITY"] = 21] = "MKACTIVITY"; + METHODS2[METHODS2["CHECKOUT"] = 22] = "CHECKOUT"; + METHODS2[METHODS2["MERGE"] = 23] = "MERGE"; + METHODS2[METHODS2["M-SEARCH"] = 24] = "M-SEARCH"; + METHODS2[METHODS2["NOTIFY"] = 25] = "NOTIFY"; + METHODS2[METHODS2["SUBSCRIBE"] = 26] = "SUBSCRIBE"; + METHODS2[METHODS2["UNSUBSCRIBE"] = 27] = "UNSUBSCRIBE"; + METHODS2[METHODS2["PATCH"] = 28] = "PATCH"; + METHODS2[METHODS2["PURGE"] = 29] = "PURGE"; + METHODS2[METHODS2["MKCALENDAR"] = 30] = "MKCALENDAR"; + METHODS2[METHODS2["LINK"] = 31] = "LINK"; + METHODS2[METHODS2["UNLINK"] = 32] = "UNLINK"; + METHODS2[METHODS2["SOURCE"] = 33] = "SOURCE"; + METHODS2[METHODS2["PRI"] = 34] = "PRI"; + METHODS2[METHODS2["DESCRIBE"] = 35] = "DESCRIBE"; + METHODS2[METHODS2["ANNOUNCE"] = 36] = "ANNOUNCE"; + METHODS2[METHODS2["SETUP"] = 37] = "SETUP"; + METHODS2[METHODS2["PLAY"] = 38] = "PLAY"; + METHODS2[METHODS2["PAUSE"] = 39] = "PAUSE"; + METHODS2[METHODS2["TEARDOWN"] = 40] = "TEARDOWN"; + METHODS2[METHODS2["GET_PARAMETER"] = 41] = "GET_PARAMETER"; + METHODS2[METHODS2["SET_PARAMETER"] = 42] = "SET_PARAMETER"; + METHODS2[METHODS2["REDIRECT"] = 43] = "REDIRECT"; + METHODS2[METHODS2["RECORD"] = 44] = "RECORD"; + METHODS2[METHODS2["FLUSH"] = 45] = "FLUSH"; + })(METHODS = exports2.METHODS || (exports2.METHODS = {})); + exports2.METHODS_HTTP = [ + METHODS.DELETE, + METHODS.GET, + METHODS.HEAD, + METHODS.POST, + METHODS.PUT, + METHODS.CONNECT, + METHODS.OPTIONS, + METHODS.TRACE, + METHODS.COPY, + METHODS.LOCK, + METHODS.MKCOL, + METHODS.MOVE, + METHODS.PROPFIND, + METHODS.PROPPATCH, + METHODS.SEARCH, + METHODS.UNLOCK, + METHODS.BIND, + METHODS.REBIND, + METHODS.UNBIND, + METHODS.ACL, + METHODS.REPORT, + METHODS.MKACTIVITY, + METHODS.CHECKOUT, + METHODS.MERGE, + METHODS["M-SEARCH"], + METHODS.NOTIFY, + METHODS.SUBSCRIBE, + METHODS.UNSUBSCRIBE, + METHODS.PATCH, + METHODS.PURGE, + METHODS.MKCALENDAR, + METHODS.LINK, + METHODS.UNLINK, + METHODS.PRI, + // TODO(indutny): should we allow it with HTTP? + METHODS.SOURCE + ]; + exports2.METHODS_ICE = [ + METHODS.SOURCE + ]; + exports2.METHODS_RTSP = [ + METHODS.OPTIONS, + METHODS.DESCRIBE, + METHODS.ANNOUNCE, + METHODS.SETUP, + METHODS.PLAY, + METHODS.PAUSE, + METHODS.TEARDOWN, + METHODS.GET_PARAMETER, + METHODS.SET_PARAMETER, + METHODS.REDIRECT, + METHODS.RECORD, + METHODS.FLUSH, + // For AirPlay + METHODS.GET, + METHODS.POST + ]; + exports2.METHOD_MAP = utils_1.enumToMap(METHODS); + exports2.H_METHOD_MAP = {}; + Object.keys(exports2.METHOD_MAP).forEach((key) => { + if (/^H/.test(key)) { + exports2.H_METHOD_MAP[key] = exports2.METHOD_MAP[key]; + } + }); + var FINISH; + (function(FINISH2) { + FINISH2[FINISH2["SAFE"] = 0] = "SAFE"; + FINISH2[FINISH2["SAFE_WITH_CB"] = 1] = "SAFE_WITH_CB"; + FINISH2[FINISH2["UNSAFE"] = 2] = "UNSAFE"; + })(FINISH = exports2.FINISH || (exports2.FINISH = {})); + exports2.ALPHA = []; + for (let i = "A".charCodeAt(0); i <= "Z".charCodeAt(0); i++) { + exports2.ALPHA.push(String.fromCharCode(i)); + exports2.ALPHA.push(String.fromCharCode(i + 32)); + } + exports2.NUM_MAP = { + 0: 0, + 1: 1, + 2: 2, + 3: 3, + 4: 4, + 5: 5, + 6: 6, + 7: 7, + 8: 8, + 9: 9 + }; + exports2.HEX_MAP = { + 0: 0, + 1: 1, + 2: 2, + 3: 3, + 4: 4, + 5: 5, + 6: 6, + 7: 7, + 8: 8, + 9: 9, + A: 10, + B: 11, + C: 12, + D: 13, + E: 14, + F: 15, + a: 10, + b: 11, + c: 12, + d: 13, + e: 14, + f: 15 + }; + exports2.NUM = [ + "0", + "1", + "2", + "3", + "4", + "5", + "6", + "7", + "8", + "9" + ]; + exports2.ALPHANUM = exports2.ALPHA.concat(exports2.NUM); + exports2.MARK = ["-", "_", ".", "!", "~", "*", "'", "(", ")"]; + exports2.USERINFO_CHARS = exports2.ALPHANUM.concat(exports2.MARK).concat(["%", ";", ":", "&", "=", "+", "$", ","]); + exports2.STRICT_URL_CHAR = [ + "!", + '"', + "$", + "%", + "&", + "'", + "(", + ")", + "*", + "+", + ",", + "-", + ".", + "/", + ":", + ";", + "<", + "=", + ">", + "@", + "[", + "\\", + "]", + "^", + "_", + "`", + "{", + "|", + "}", + "~" + ].concat(exports2.ALPHANUM); + exports2.URL_CHAR = exports2.STRICT_URL_CHAR.concat([" ", "\f"]); + for (let i = 128; i <= 255; i++) { + exports2.URL_CHAR.push(i); + } + exports2.HEX = exports2.NUM.concat(["a", "b", "c", "d", "e", "f", "A", "B", "C", "D", "E", "F"]); + exports2.STRICT_TOKEN = [ + "!", + "#", + "$", + "%", + "&", + "'", + "*", + "+", + "-", + ".", + "^", + "_", + "`", + "|", + "~" + ].concat(exports2.ALPHANUM); + exports2.TOKEN = exports2.STRICT_TOKEN.concat([" "]); + exports2.HEADER_CHARS = [" "]; + for (let i = 32; i <= 255; i++) { + if (i !== 127) { + exports2.HEADER_CHARS.push(i); + } + } + exports2.CONNECTION_TOKEN_CHARS = exports2.HEADER_CHARS.filter((c) => c !== 44); + exports2.MAJOR = exports2.NUM_MAP; + exports2.MINOR = exports2.MAJOR; + var HEADER_STATE; + (function(HEADER_STATE2) { + HEADER_STATE2[HEADER_STATE2["GENERAL"] = 0] = "GENERAL"; + HEADER_STATE2[HEADER_STATE2["CONNECTION"] = 1] = "CONNECTION"; + HEADER_STATE2[HEADER_STATE2["CONTENT_LENGTH"] = 2] = "CONTENT_LENGTH"; + HEADER_STATE2[HEADER_STATE2["TRANSFER_ENCODING"] = 3] = "TRANSFER_ENCODING"; + HEADER_STATE2[HEADER_STATE2["UPGRADE"] = 4] = "UPGRADE"; + HEADER_STATE2[HEADER_STATE2["CONNECTION_KEEP_ALIVE"] = 5] = "CONNECTION_KEEP_ALIVE"; + HEADER_STATE2[HEADER_STATE2["CONNECTION_CLOSE"] = 6] = "CONNECTION_CLOSE"; + HEADER_STATE2[HEADER_STATE2["CONNECTION_UPGRADE"] = 7] = "CONNECTION_UPGRADE"; + HEADER_STATE2[HEADER_STATE2["TRANSFER_ENCODING_CHUNKED"] = 8] = "TRANSFER_ENCODING_CHUNKED"; + })(HEADER_STATE = exports2.HEADER_STATE || (exports2.HEADER_STATE = {})); + exports2.SPECIAL_HEADERS = { + "connection": HEADER_STATE.CONNECTION, + "content-length": HEADER_STATE.CONTENT_LENGTH, + "proxy-connection": HEADER_STATE.CONNECTION, + "transfer-encoding": HEADER_STATE.TRANSFER_ENCODING, + "upgrade": HEADER_STATE.UPGRADE + }; + } +}); + +// node_modules/undici/lib/handler/RedirectHandler.js +var require_RedirectHandler = __commonJS({ + "node_modules/undici/lib/handler/RedirectHandler.js"(exports2, module2) { + "use strict"; + var util = require_util4(); + var { kBodyUsed } = require_symbols(); + var assert = require("assert"); + var { InvalidArgumentError } = require_errors(); + var EE = require("events"); + var redirectableStatusCodes = [300, 301, 302, 303, 307, 308]; + var kBody = Symbol("body"); + var BodyAsyncIterable = class { + constructor(body) { + this[kBody] = body; + this[kBodyUsed] = false; + } + async *[Symbol.asyncIterator]() { + assert(!this[kBodyUsed], "disturbed"); + this[kBodyUsed] = true; + yield* this[kBody]; + } + }; + var RedirectHandler = class { + constructor(dispatch, maxRedirections, opts, handler2) { + if (maxRedirections != null && (!Number.isInteger(maxRedirections) || maxRedirections < 0)) { + throw new InvalidArgumentError("maxRedirections must be a positive number"); + } + util.validateHandler(handler2, opts.method, opts.upgrade); + this.dispatch = dispatch; + this.location = null; + this.abort = null; + this.opts = { ...opts, maxRedirections: 0 }; + this.maxRedirections = maxRedirections; + this.handler = handler2; + this.history = []; + if (util.isStream(this.opts.body)) { + if (util.bodyLength(this.opts.body) === 0) { + this.opts.body.on("data", function() { + assert(false); + }); + } + if (typeof this.opts.body.readableDidRead !== "boolean") { + this.opts.body[kBodyUsed] = false; + EE.prototype.on.call(this.opts.body, "data", function() { + this[kBodyUsed] = true; + }); + } + } else if (this.opts.body && typeof this.opts.body.pipeTo === "function") { + this.opts.body = new BodyAsyncIterable(this.opts.body); + } else if (this.opts.body && typeof this.opts.body !== "string" && !ArrayBuffer.isView(this.opts.body) && util.isIterable(this.opts.body)) { + this.opts.body = new BodyAsyncIterable(this.opts.body); + } + } + onConnect(abort) { + this.abort = abort; + this.handler.onConnect(abort, { history: this.history }); + } + onUpgrade(statusCode, headers, socket) { + this.handler.onUpgrade(statusCode, headers, socket); + } + onError(error2) { + this.handler.onError(error2); + } + onHeaders(statusCode, headers, resume, statusText) { + this.location = this.history.length >= this.maxRedirections || util.isDisturbed(this.opts.body) ? null : parseLocation(statusCode, headers); + if (this.opts.origin) { + this.history.push(new URL(this.opts.path, this.opts.origin)); + } + if (!this.location) { + return this.handler.onHeaders(statusCode, headers, resume, statusText); + } + const { origin, pathname, search } = util.parseURL(new URL(this.location, this.opts.origin && new URL(this.opts.path, this.opts.origin))); + const path = search ? `${pathname}${search}` : pathname; + this.opts.headers = cleanRequestHeaders(this.opts.headers, statusCode === 303, this.opts.origin !== origin); + this.opts.path = path; + this.opts.origin = origin; + this.opts.maxRedirections = 0; + this.opts.query = null; + if (statusCode === 303 && this.opts.method !== "HEAD") { + this.opts.method = "GET"; + this.opts.body = null; + } + } + onData(chunk) { + if (this.location) { + } else { + return this.handler.onData(chunk); + } + } + onComplete(trailers) { + if (this.location) { + this.location = null; + this.abort = null; + this.dispatch(this.opts, this); + } else { + this.handler.onComplete(trailers); + } + } + onBodySent(chunk) { + if (this.handler.onBodySent) { + this.handler.onBodySent(chunk); + } + } + }; + function parseLocation(statusCode, headers) { + if (redirectableStatusCodes.indexOf(statusCode) === -1) { + return null; + } + for (let i = 0; i < headers.length; i += 2) { + if (headers[i].toString().toLowerCase() === "location") { + return headers[i + 1]; + } + } + } + function shouldRemoveHeader(header, removeContent, unknownOrigin) { + return header.length === 4 && header.toString().toLowerCase() === "host" || removeContent && header.toString().toLowerCase().indexOf("content-") === 0 || unknownOrigin && header.length === 13 && header.toString().toLowerCase() === "authorization" || unknownOrigin && header.length === 6 && header.toString().toLowerCase() === "cookie"; + } + function cleanRequestHeaders(headers, removeContent, unknownOrigin) { + const ret = []; + if (Array.isArray(headers)) { + for (let i = 0; i < headers.length; i += 2) { + if (!shouldRemoveHeader(headers[i], removeContent, unknownOrigin)) { + ret.push(headers[i], headers[i + 1]); + } + } + } else if (headers && typeof headers === "object") { + for (const key of Object.keys(headers)) { + if (!shouldRemoveHeader(key, removeContent, unknownOrigin)) { + ret.push(key, headers[key]); + } + } + } else { + assert(headers == null, "headers must be an object or an array"); + } + return ret; + } + module2.exports = RedirectHandler; + } +}); + +// node_modules/undici/lib/interceptor/redirectInterceptor.js +var require_redirectInterceptor = __commonJS({ + "node_modules/undici/lib/interceptor/redirectInterceptor.js"(exports2, module2) { + "use strict"; + var RedirectHandler = require_RedirectHandler(); + function createRedirectInterceptor({ maxRedirections: defaultMaxRedirections }) { + return (dispatch) => { + return function Intercept(opts, handler2) { + const { maxRedirections = defaultMaxRedirections } = opts; + if (!maxRedirections) { + return dispatch(opts, handler2); + } + const redirectHandler = new RedirectHandler(dispatch, maxRedirections, opts, handler2); + opts = { ...opts, maxRedirections: 0 }; + return dispatch(opts, redirectHandler); + }; + }; + } + module2.exports = createRedirectInterceptor; + } +}); + +// node_modules/undici/lib/llhttp/llhttp-wasm.js +var require_llhttp_wasm = __commonJS({ + "node_modules/undici/lib/llhttp/llhttp-wasm.js"(exports2, module2) { + module2.exports = "AGFzbQEAAAABMAhgAX8Bf2ADf39/AX9gBH9/f38Bf2AAAGADf39/AGABfwBgAn9/AGAGf39/f39/AALLAQgDZW52GHdhc21fb25faGVhZGVyc19jb21wbGV0ZQACA2VudhV3YXNtX29uX21lc3NhZ2VfYmVnaW4AAANlbnYLd2FzbV9vbl91cmwAAQNlbnYOd2FzbV9vbl9zdGF0dXMAAQNlbnYUd2FzbV9vbl9oZWFkZXJfZmllbGQAAQNlbnYUd2FzbV9vbl9oZWFkZXJfdmFsdWUAAQNlbnYMd2FzbV9vbl9ib2R5AAEDZW52GHdhc21fb25fbWVzc2FnZV9jb21wbGV0ZQAAA0ZFAwMEAAAFAAAAAAAABQEFAAUFBQAABgAAAAAGBgYGAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAAABAQcAAAUFAwABBAUBcAESEgUDAQACBggBfwFBgNQECwfRBSIGbWVtb3J5AgALX2luaXRpYWxpemUACRlfX2luZGlyZWN0X2Z1bmN0aW9uX3RhYmxlAQALbGxodHRwX2luaXQAChhsbGh0dHBfc2hvdWxkX2tlZXBfYWxpdmUAQQxsbGh0dHBfYWxsb2MADAZtYWxsb2MARgtsbGh0dHBfZnJlZQANBGZyZWUASA9sbGh0dHBfZ2V0X3R5cGUADhVsbGh0dHBfZ2V0X2h0dHBfbWFqb3IADxVsbGh0dHBfZ2V0X2h0dHBfbWlub3IAEBFsbGh0dHBfZ2V0X21ldGhvZAARFmxsaHR0cF9nZXRfc3RhdHVzX2NvZGUAEhJsbGh0dHBfZ2V0X3VwZ3JhZGUAEwxsbGh0dHBfcmVzZXQAFA5sbGh0dHBfZXhlY3V0ZQAVFGxsaHR0cF9zZXR0aW5nc19pbml0ABYNbGxodHRwX2ZpbmlzaAAXDGxsaHR0cF9wYXVzZQAYDWxsaHR0cF9yZXN1bWUAGRtsbGh0dHBfcmVzdW1lX2FmdGVyX3VwZ3JhZGUAGhBsbGh0dHBfZ2V0X2Vycm5vABsXbGxodHRwX2dldF9lcnJvcl9yZWFzb24AHBdsbGh0dHBfc2V0X2Vycm9yX3JlYXNvbgAdFGxsaHR0cF9nZXRfZXJyb3JfcG9zAB4RbGxodHRwX2Vycm5vX25hbWUAHxJsbGh0dHBfbWV0aG9kX25hbWUAIBJsbGh0dHBfc3RhdHVzX25hbWUAIRpsbGh0dHBfc2V0X2xlbmllbnRfaGVhZGVycwAiIWxsaHR0cF9zZXRfbGVuaWVudF9jaHVua2VkX2xlbmd0aAAjHWxsaHR0cF9zZXRfbGVuaWVudF9rZWVwX2FsaXZlACQkbGxodHRwX3NldF9sZW5pZW50X3RyYW5zZmVyX2VuY29kaW5nACUYbGxodHRwX21lc3NhZ2VfbmVlZHNfZW9mAD8JFwEAQQELEQECAwQFCwYHNTk3MS8tJyspCsLgAkUCAAsIABCIgICAAAsZACAAEMKAgIAAGiAAIAI2AjggACABOgAoCxwAIAAgAC8BMiAALQAuIAAQwYCAgAAQgICAgAALKgEBf0HAABDGgICAACIBEMKAgIAAGiABQYCIgIAANgI4IAEgADoAKCABCwoAIAAQyICAgAALBwAgAC0AKAsHACAALQAqCwcAIAAtACsLBwAgAC0AKQsHACAALwEyCwcAIAAtAC4LRQEEfyAAKAIYIQEgAC0ALSECIAAtACghAyAAKAI4IQQgABDCgICAABogACAENgI4IAAgAzoAKCAAIAI6AC0gACABNgIYCxEAIAAgASABIAJqEMOAgIAACxAAIABBAEHcABDMgICAABoLZwEBf0EAIQECQCAAKAIMDQACQAJAAkACQCAALQAvDgMBAAMCCyAAKAI4IgFFDQAgASgCLCIBRQ0AIAAgARGAgICAAAAiAQ0DC0EADwsQyoCAgAAACyAAQcOWgIAANgIQQQ4hAQsgAQseAAJAIAAoAgwNACAAQdGbgIAANgIQIABBFTYCDAsLFgACQCAAKAIMQRVHDQAgAEEANgIMCwsWAAJAIAAoAgxBFkcNACAAQQA2AgwLCwcAIAAoAgwLBwAgACgCEAsJACAAIAE2AhALBwAgACgCFAsiAAJAIABBJEkNABDKgICAAAALIABBAnRBoLOAgABqKAIACyIAAkAgAEEuSQ0AEMqAgIAAAAsgAEECdEGwtICAAGooAgAL7gsBAX9B66iAgAAhAQJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIABBnH9qDvQDY2IAAWFhYWFhYQIDBAVhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhBgcICQoLDA0OD2FhYWFhEGFhYWFhYWFhYWFhEWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYRITFBUWFxgZGhthYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhHB0eHyAhIiMkJSYnKCkqKywtLi8wMTIzNDU2YTc4OTphYWFhYWFhYTthYWE8YWFhYT0+P2FhYWFhYWFhQGFhQWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYUJDREVGR0hJSktMTU5PUFFSU2FhYWFhYWFhVFVWV1hZWlthXF1hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFeYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhX2BhC0Hhp4CAAA8LQaShgIAADwtBy6yAgAAPC0H+sYCAAA8LQcCkgIAADwtBq6SAgAAPC0GNqICAAA8LQeKmgIAADwtBgLCAgAAPC0G5r4CAAA8LQdekgIAADwtB75+AgAAPC0Hhn4CAAA8LQfqfgIAADwtB8qCAgAAPC0Gor4CAAA8LQa6ygIAADwtBiLCAgAAPC0Hsp4CAAA8LQYKigIAADwtBjp2AgAAPC0HQroCAAA8LQcqjgIAADwtBxbKAgAAPC0HfnICAAA8LQdKcgIAADwtBxKCAgAAPC0HXoICAAA8LQaKfgIAADwtB7a6AgAAPC0GrsICAAA8LQdSlgIAADwtBzK6AgAAPC0H6roCAAA8LQfyrgIAADwtB0rCAgAAPC0HxnYCAAA8LQbuggIAADwtB96uAgAAPC0GQsYCAAA8LQdexgIAADwtBoq2AgAAPC0HUp4CAAA8LQeCrgIAADwtBn6yAgAAPC0HrsYCAAA8LQdWfgIAADwtByrGAgAAPC0HepYCAAA8LQdSegIAADwtB9JyAgAAPC0GnsoCAAA8LQbGdgIAADwtBoJ2AgAAPC0G5sYCAAA8LQbywgIAADwtBkqGAgAAPC0GzpoCAAA8LQemsgIAADwtBrJ6AgAAPC0HUq4CAAA8LQfemgIAADwtBgKaAgAAPC0GwoYCAAA8LQf6egIAADwtBjaOAgAAPC0GJrYCAAA8LQfeigIAADwtBoLGAgAAPC0Gun4CAAA8LQcalgIAADwtB6J6AgAAPC0GTooCAAA8LQcKvgIAADwtBw52AgAAPC0GLrICAAA8LQeGdgIAADwtBja+AgAAPC0HqoYCAAA8LQbStgIAADwtB0q+AgAAPC0HfsoCAAA8LQdKygIAADwtB8LCAgAAPC0GpooCAAA8LQfmjgIAADwtBmZ6AgAAPC0G1rICAAA8LQZuwgIAADwtBkrKAgAAPC0G2q4CAAA8LQcKigIAADwtB+LKAgAAPC0GepYCAAA8LQdCigIAADwtBup6AgAAPC0GBnoCAAA8LEMqAgIAAAAtB1qGAgAAhAQsgAQsWACAAIAAtAC1B/gFxIAFBAEdyOgAtCxkAIAAgAC0ALUH9AXEgAUEAR0EBdHI6AC0LGQAgACAALQAtQfsBcSABQQBHQQJ0cjoALQsZACAAIAAtAC1B9wFxIAFBAEdBA3RyOgAtCy4BAn9BACEDAkAgACgCOCIERQ0AIAQoAgAiBEUNACAAIAQRgICAgAAAIQMLIAMLSQECf0EAIQMCQCAAKAI4IgRFDQAgBCgCBCIERQ0AIAAgASACIAFrIAQRgYCAgAAAIgNBf0cNACAAQcaRgIAANgIQQRghAwsgAwsuAQJ/QQAhAwJAIAAoAjgiBEUNACAEKAIwIgRFDQAgACAEEYCAgIAAACEDCyADC0kBAn9BACEDAkAgACgCOCIERQ0AIAQoAggiBEUNACAAIAEgAiABayAEEYGAgIAAACIDQX9HDQAgAEH2ioCAADYCEEEYIQMLIAMLLgECf0EAIQMCQCAAKAI4IgRFDQAgBCgCNCIERQ0AIAAgBBGAgICAAAAhAwsgAwtJAQJ/QQAhAwJAIAAoAjgiBEUNACAEKAIMIgRFDQAgACABIAIgAWsgBBGBgICAAAAiA0F/Rw0AIABB7ZqAgAA2AhBBGCEDCyADCy4BAn9BACEDAkAgACgCOCIERQ0AIAQoAjgiBEUNACAAIAQRgICAgAAAIQMLIAMLSQECf0EAIQMCQCAAKAI4IgRFDQAgBCgCECIERQ0AIAAgASACIAFrIAQRgYCAgAAAIgNBf0cNACAAQZWQgIAANgIQQRghAwsgAwsuAQJ/QQAhAwJAIAAoAjgiBEUNACAEKAI8IgRFDQAgACAEEYCAgIAAACEDCyADC0kBAn9BACEDAkAgACgCOCIERQ0AIAQoAhQiBEUNACAAIAEgAiABayAEEYGAgIAAACIDQX9HDQAgAEGqm4CAADYCEEEYIQMLIAMLLgECf0EAIQMCQCAAKAI4IgRFDQAgBCgCQCIERQ0AIAAgBBGAgICAAAAhAwsgAwtJAQJ/QQAhAwJAIAAoAjgiBEUNACAEKAIYIgRFDQAgACABIAIgAWsgBBGBgICAAAAiA0F/Rw0AIABB7ZOAgAA2AhBBGCEDCyADCy4BAn9BACEDAkAgACgCOCIERQ0AIAQoAkQiBEUNACAAIAQRgICAgAAAIQMLIAMLLgECf0EAIQMCQCAAKAI4IgRFDQAgBCgCJCIERQ0AIAAgBBGAgICAAAAhAwsgAwsuAQJ/QQAhAwJAIAAoAjgiBEUNACAEKAIsIgRFDQAgACAEEYCAgIAAACEDCyADC0kBAn9BACEDAkAgACgCOCIERQ0AIAQoAigiBEUNACAAIAEgAiABayAEEYGAgIAAACIDQX9HDQAgAEH2iICAADYCEEEYIQMLIAMLLgECf0EAIQMCQCAAKAI4IgRFDQAgBCgCUCIERQ0AIAAgBBGAgICAAAAhAwsgAwtJAQJ/QQAhAwJAIAAoAjgiBEUNACAEKAIcIgRFDQAgACABIAIgAWsgBBGBgICAAAAiA0F/Rw0AIABBwpmAgAA2AhBBGCEDCyADCy4BAn9BACEDAkAgACgCOCIERQ0AIAQoAkgiBEUNACAAIAQRgICAgAAAIQMLIAMLSQECf0EAIQMCQCAAKAI4IgRFDQAgBCgCICIERQ0AIAAgASACIAFrIAQRgYCAgAAAIgNBf0cNACAAQZSUgIAANgIQQRghAwsgAwsuAQJ/QQAhAwJAIAAoAjgiBEUNACAEKAJMIgRFDQAgACAEEYCAgIAAACEDCyADCy4BAn9BACEDAkAgACgCOCIERQ0AIAQoAlQiBEUNACAAIAQRgICAgAAAIQMLIAMLLgECf0EAIQMCQCAAKAI4IgRFDQAgBCgCWCIERQ0AIAAgBBGAgICAAAAhAwsgAwtFAQF/AkACQCAALwEwQRRxQRRHDQBBASEDIAAtAChBAUYNASAALwEyQeUARiEDDAELIAAtAClBBUYhAwsgACADOgAuQQAL/gEBA39BASEDAkAgAC8BMCIEQQhxDQAgACkDIEIAUiEDCwJAAkAgAC0ALkUNAEEBIQUgAC0AKUEFRg0BQQEhBSAEQcAAcUUgA3FBAUcNAQtBACEFIARBwABxDQBBAiEFIARB//8DcSIDQQhxDQACQCADQYAEcUUNAAJAIAAtAChBAUcNACAALQAtQQpxDQBBBQ8LQQQPCwJAIANBIHENAAJAIAAtAChBAUYNACAALwEyQf//A3EiAEGcf2pB5ABJDQAgAEHMAUYNACAAQbACRg0AQQQhBSAEQShxRQ0CIANBiARxQYAERg0CC0EADwtBAEEDIAApAyBQGyEFCyAFC2IBAn9BACEBAkAgAC0AKEEBRg0AIAAvATJB//8DcSICQZx/akHkAEkNACACQcwBRg0AIAJBsAJGDQAgAC8BMCIAQcAAcQ0AQQEhASAAQYgEcUGABEYNACAAQShxRSEBCyABC6cBAQN/AkACQAJAIAAtACpFDQAgAC0AK0UNAEEAIQMgAC8BMCIEQQJxRQ0BDAILQQAhAyAALwEwIgRBAXFFDQELQQEhAyAALQAoQQFGDQAgAC8BMkH//wNxIgVBnH9qQeQASQ0AIAVBzAFGDQAgBUGwAkYNACAEQcAAcQ0AQQAhAyAEQYgEcUGABEYNACAEQShxQQBHIQMLIABBADsBMCAAQQA6AC8gAwuZAQECfwJAAkACQCAALQAqRQ0AIAAtACtFDQBBACEBIAAvATAiAkECcUUNAQwCC0EAIQEgAC8BMCICQQFxRQ0BC0EBIQEgAC0AKEEBRg0AIAAvATJB//8DcSIAQZx/akHkAEkNACAAQcwBRg0AIABBsAJGDQAgAkHAAHENAEEAIQEgAkGIBHFBgARGDQAgAkEocUEARyEBCyABC1kAIABBGGpCADcDACAAQgA3AwAgAEE4akIANwMAIABBMGpCADcDACAAQShqQgA3AwAgAEEgakIANwMAIABBEGpCADcDACAAQQhqQgA3AwAgAEHdATYCHEEAC3sBAX8CQCAAKAIMIgMNAAJAIAAoAgRFDQAgACABNgIECwJAIAAgASACEMSAgIAAIgMNACAAKAIMDwsgACADNgIcQQAhAyAAKAIEIgFFDQAgACABIAIgACgCCBGBgICAAAAiAUUNACAAIAI2AhQgACABNgIMIAEhAwsgAwvk8wEDDn8DfgR/I4CAgIAAQRBrIgMkgICAgAAgASEEIAEhBSABIQYgASEHIAEhCCABIQkgASEKIAEhCyABIQwgASENIAEhDiABIQ8CQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgACgCHCIQQX9qDt0B2gEB2QECAwQFBgcICQoLDA0O2AEPENcBERLWARMUFRYXGBkaG+AB3wEcHR7VAR8gISIjJCXUASYnKCkqKyzTAdIBLS7RAdABLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVG2wFHSElKzwHOAUvNAUzMAU1OT1BRUlNUVVZXWFlaW1xdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+f4ABgQGCAYMBhAGFAYYBhwGIAYkBigGLAYwBjQGOAY8BkAGRAZIBkwGUAZUBlgGXAZgBmQGaAZsBnAGdAZ4BnwGgAaEBogGjAaQBpQGmAacBqAGpAaoBqwGsAa0BrgGvAbABsQGyAbMBtAG1AbYBtwHLAcoBuAHJAbkByAG6AbsBvAG9Ab4BvwHAAcEBwgHDAcQBxQHGAQDcAQtBACEQDMYBC0EOIRAMxQELQQ0hEAzEAQtBDyEQDMMBC0EQIRAMwgELQRMhEAzBAQtBFCEQDMABC0EVIRAMvwELQRYhEAy+AQtBFyEQDL0BC0EYIRAMvAELQRkhEAy7AQtBGiEQDLoBC0EbIRAMuQELQRwhEAy4AQtBCCEQDLcBC0EdIRAMtgELQSAhEAy1AQtBHyEQDLQBC0EHIRAMswELQSEhEAyyAQtBIiEQDLEBC0EeIRAMsAELQSMhEAyvAQtBEiEQDK4BC0ERIRAMrQELQSQhEAysAQtBJSEQDKsBC0EmIRAMqgELQSchEAypAQtBwwEhEAyoAQtBKSEQDKcBC0ErIRAMpgELQSwhEAylAQtBLSEQDKQBC0EuIRAMowELQS8hEAyiAQtBxAEhEAyhAQtBMCEQDKABC0E0IRAMnwELQQwhEAyeAQtBMSEQDJ0BC0EyIRAMnAELQTMhEAybAQtBOSEQDJoBC0E1IRAMmQELQcUBIRAMmAELQQshEAyXAQtBOiEQDJYBC0E2IRAMlQELQQohEAyUAQtBNyEQDJMBC0E4IRAMkgELQTwhEAyRAQtBOyEQDJABC0E9IRAMjwELQQkhEAyOAQtBKCEQDI0BC0E+IRAMjAELQT8hEAyLAQtBwAAhEAyKAQtBwQAhEAyJAQtBwgAhEAyIAQtBwwAhEAyHAQtBxAAhEAyGAQtBxQAhEAyFAQtBxgAhEAyEAQtBKiEQDIMBC0HHACEQDIIBC0HIACEQDIEBC0HJACEQDIABC0HKACEQDH8LQcsAIRAMfgtBzQAhEAx9C0HMACEQDHwLQc4AIRAMewtBzwAhEAx6C0HQACEQDHkLQdEAIRAMeAtB0gAhEAx3C0HTACEQDHYLQdQAIRAMdQtB1gAhEAx0C0HVACEQDHMLQQYhEAxyC0HXACEQDHELQQUhEAxwC0HYACEQDG8LQQQhEAxuC0HZACEQDG0LQdoAIRAMbAtB2wAhEAxrC0HcACEQDGoLQQMhEAxpC0HdACEQDGgLQd4AIRAMZwtB3wAhEAxmC0HhACEQDGULQeAAIRAMZAtB4gAhEAxjC0HjACEQDGILQQIhEAxhC0HkACEQDGALQeUAIRAMXwtB5gAhEAxeC0HnACEQDF0LQegAIRAMXAtB6QAhEAxbC0HqACEQDFoLQesAIRAMWQtB7AAhEAxYC0HtACEQDFcLQe4AIRAMVgtB7wAhEAxVC0HwACEQDFQLQfEAIRAMUwtB8gAhEAxSC0HzACEQDFELQfQAIRAMUAtB9QAhEAxPC0H2ACEQDE4LQfcAIRAMTQtB+AAhEAxMC0H5ACEQDEsLQfoAIRAMSgtB+wAhEAxJC0H8ACEQDEgLQf0AIRAMRwtB/gAhEAxGC0H/ACEQDEULQYABIRAMRAtBgQEhEAxDC0GCASEQDEILQYMBIRAMQQtBhAEhEAxAC0GFASEQDD8LQYYBIRAMPgtBhwEhEAw9C0GIASEQDDwLQYkBIRAMOwtBigEhEAw6C0GLASEQDDkLQYwBIRAMOAtBjQEhEAw3C0GOASEQDDYLQY8BIRAMNQtBkAEhEAw0C0GRASEQDDMLQZIBIRAMMgtBkwEhEAwxC0GUASEQDDALQZUBIRAMLwtBlgEhEAwuC0GXASEQDC0LQZgBIRAMLAtBmQEhEAwrC0GaASEQDCoLQZsBIRAMKQtBnAEhEAwoC0GdASEQDCcLQZ4BIRAMJgtBnwEhEAwlC0GgASEQDCQLQaEBIRAMIwtBogEhEAwiC0GjASEQDCELQaQBIRAMIAtBpQEhEAwfC0GmASEQDB4LQacBIRAMHQtBqAEhEAwcC0GpASEQDBsLQaoBIRAMGgtBqwEhEAwZC0GsASEQDBgLQa0BIRAMFwtBrgEhEAwWC0EBIRAMFQtBrwEhEAwUC0GwASEQDBMLQbEBIRAMEgtBswEhEAwRC0GyASEQDBALQbQBIRAMDwtBtQEhEAwOC0G2ASEQDA0LQbcBIRAMDAtBuAEhEAwLC0G5ASEQDAoLQboBIRAMCQtBuwEhEAwIC0HGASEQDAcLQbwBIRAMBgtBvQEhEAwFC0G+ASEQDAQLQb8BIRAMAwtBwAEhEAwCC0HCASEQDAELQcEBIRALA0ACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCAQDscBAAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxweHyAhIyUoP0BBREVGR0hJSktMTU9QUVJT3gNXWVtcXWBiZWZnaGlqa2xtb3BxcnN0dXZ3eHl6e3x9foABggGFAYYBhwGJAYsBjAGNAY4BjwGQAZEBlAGVAZYBlwGYAZkBmgGbAZwBnQGeAZ8BoAGhAaIBowGkAaUBpgGnAagBqQGqAasBrAGtAa4BrwGwAbEBsgGzAbQBtQG2AbcBuAG5AboBuwG8Ab0BvgG/AcABwQHCAcMBxAHFAcYBxwHIAckBygHLAcwBzQHOAc8B0AHRAdIB0wHUAdUB1gHXAdgB2QHaAdsB3AHdAd4B4AHhAeIB4wHkAeUB5gHnAegB6QHqAesB7AHtAe4B7wHwAfEB8gHzAZkCpAKwAv4C/gILIAEiBCACRw3zAUHdASEQDP8DCyABIhAgAkcN3QFBwwEhEAz+AwsgASIBIAJHDZABQfcAIRAM/QMLIAEiASACRw2GAUHvACEQDPwDCyABIgEgAkcNf0HqACEQDPsDCyABIgEgAkcNe0HoACEQDPoDCyABIgEgAkcNeEHmACEQDPkDCyABIgEgAkcNGkEYIRAM+AMLIAEiASACRw0UQRIhEAz3AwsgASIBIAJHDVlBxQAhEAz2AwsgASIBIAJHDUpBPyEQDPUDCyABIgEgAkcNSEE8IRAM9AMLIAEiASACRw1BQTEhEAzzAwsgAC0ALkEBRg3rAwyHAgsgACABIgEgAhDAgICAAEEBRw3mASAAQgA3AyAM5wELIAAgASIBIAIQtICAgAAiEA3nASABIQEM9QILAkAgASIBIAJHDQBBBiEQDPADCyAAIAFBAWoiASACELuAgIAAIhAN6AEgASEBDDELIABCADcDIEESIRAM1QMLIAEiECACRw0rQR0hEAztAwsCQCABIgEgAkYNACABQQFqIQFBECEQDNQDC0EHIRAM7AMLIABCACAAKQMgIhEgAiABIhBrrSISfSITIBMgEVYbNwMgIBEgElYiFEUN5QFBCCEQDOsDCwJAIAEiASACRg0AIABBiYCAgAA2AgggACABNgIEIAEhAUEUIRAM0gMLQQkhEAzqAwsgASEBIAApAyBQDeQBIAEhAQzyAgsCQCABIgEgAkcNAEELIRAM6QMLIAAgAUEBaiIBIAIQtoCAgAAiEA3lASABIQEM8gILIAAgASIBIAIQuICAgAAiEA3lASABIQEM8gILIAAgASIBIAIQuICAgAAiEA3mASABIQEMDQsgACABIgEgAhC6gICAACIQDecBIAEhAQzwAgsCQCABIgEgAkcNAEEPIRAM5QMLIAEtAAAiEEE7Rg0IIBBBDUcN6AEgAUEBaiEBDO8CCyAAIAEiASACELqAgIAAIhAN6AEgASEBDPICCwNAAkAgAS0AAEHwtYCAAGotAAAiEEEBRg0AIBBBAkcN6wEgACgCBCEQIABBADYCBCAAIBAgAUEBaiIBELmAgIAAIhAN6gEgASEBDPQCCyABQQFqIgEgAkcNAAtBEiEQDOIDCyAAIAEiASACELqAgIAAIhAN6QEgASEBDAoLIAEiASACRw0GQRshEAzgAwsCQCABIgEgAkcNAEEWIRAM4AMLIABBioCAgAA2AgggACABNgIEIAAgASACELiAgIAAIhAN6gEgASEBQSAhEAzGAwsCQCABIgEgAkYNAANAAkAgAS0AAEHwt4CAAGotAAAiEEECRg0AAkAgEEF/ag4E5QHsAQDrAewBCyABQQFqIQFBCCEQDMgDCyABQQFqIgEgAkcNAAtBFSEQDN8DC0EVIRAM3gMLA0ACQCABLQAAQfC5gIAAai0AACIQQQJGDQAgEEF/ag4E3gHsAeAB6wHsAQsgAUEBaiIBIAJHDQALQRghEAzdAwsCQCABIgEgAkYNACAAQYuAgIAANgIIIAAgATYCBCABIQFBByEQDMQDC0EZIRAM3AMLIAFBAWohAQwCCwJAIAEiFCACRw0AQRohEAzbAwsgFCEBAkAgFC0AAEFzag4U3QLuAu4C7gLuAu4C7gLuAu4C7gLuAu4C7gLuAu4C7gLuAu4C7gIA7gILQQAhECAAQQA2AhwgAEGvi4CAADYCECAAQQI2AgwgACAUQQFqNgIUDNoDCwJAIAEtAAAiEEE7Rg0AIBBBDUcN6AEgAUEBaiEBDOUCCyABQQFqIQELQSIhEAy/AwsCQCABIhAgAkcNAEEcIRAM2AMLQgAhESAQIQEgEC0AAEFQag435wHmAQECAwQFBgcIAAAAAAAAAAkKCwwNDgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADxAREhMUAAtBHiEQDL0DC0ICIREM5QELQgMhEQzkAQtCBCERDOMBC0IFIREM4gELQgYhEQzhAQtCByERDOABC0IIIREM3wELQgkhEQzeAQtCCiERDN0BC0ILIREM3AELQgwhEQzbAQtCDSERDNoBC0IOIREM2QELQg8hEQzYAQtCCiERDNcBC0ILIREM1gELQgwhEQzVAQtCDSERDNQBC0IOIREM0wELQg8hEQzSAQtCACERAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCAQLQAAQVBqDjflAeQBAAECAwQFBgfmAeYB5gHmAeYB5gHmAQgJCgsMDeYB5gHmAeYB5gHmAeYB5gHmAeYB5gHmAeYB5gHmAeYB5gHmAeYB5gHmAeYB5gHmAeYB5gEODxAREhPmAQtCAiERDOQBC0IDIREM4wELQgQhEQziAQtCBSERDOEBC0IGIREM4AELQgchEQzfAQtCCCERDN4BC0IJIREM3QELQgohEQzcAQtCCyERDNsBC0IMIREM2gELQg0hEQzZAQtCDiERDNgBC0IPIREM1wELQgohEQzWAQtCCyERDNUBC0IMIREM1AELQg0hEQzTAQtCDiERDNIBC0IPIREM0QELIABCACAAKQMgIhEgAiABIhBrrSISfSITIBMgEVYbNwMgIBEgElYiFEUN0gFBHyEQDMADCwJAIAEiASACRg0AIABBiYCAgAA2AgggACABNgIEIAEhAUEkIRAMpwMLQSAhEAy/AwsgACABIhAgAhC+gICAAEF/ag4FtgEAxQIB0QHSAQtBESEQDKQDCyAAQQE6AC8gECEBDLsDCyABIgEgAkcN0gFBJCEQDLsDCyABIg0gAkcNHkHGACEQDLoDCyAAIAEiASACELKAgIAAIhAN1AEgASEBDLUBCyABIhAgAkcNJkHQACEQDLgDCwJAIAEiASACRw0AQSghEAy4AwsgAEEANgIEIABBjICAgAA2AgggACABIAEQsYCAgAAiEA3TASABIQEM2AELAkAgASIQIAJHDQBBKSEQDLcDCyAQLQAAIgFBIEYNFCABQQlHDdMBIBBBAWohAQwVCwJAIAEiASACRg0AIAFBAWohAQwXC0EqIRAMtQMLAkAgASIQIAJHDQBBKyEQDLUDCwJAIBAtAAAiAUEJRg0AIAFBIEcN1QELIAAtACxBCEYN0wEgECEBDJEDCwJAIAEiASACRw0AQSwhEAy0AwsgAS0AAEEKRw3VASABQQFqIQEMyQILIAEiDiACRw3VAUEvIRAMsgMLA0ACQCABLQAAIhBBIEYNAAJAIBBBdmoOBADcAdwBANoBCyABIQEM4AELIAFBAWoiASACRw0AC0ExIRAMsQMLQTIhECABIhQgAkYNsAMgAiAUayAAKAIAIgFqIRUgFCABa0EDaiEWAkADQCAULQAAIhdBIHIgFyAXQb9/akH/AXFBGkkbQf8BcSABQfC7gIAAai0AAEcNAQJAIAFBA0cNAEEGIQEMlgMLIAFBAWohASAUQQFqIhQgAkcNAAsgACAVNgIADLEDCyAAQQA2AgAgFCEBDNkBC0EzIRAgASIUIAJGDa8DIAIgFGsgACgCACIBaiEVIBQgAWtBCGohFgJAA0AgFC0AACIXQSByIBcgF0G/f2pB/wFxQRpJG0H/AXEgAUH0u4CAAGotAABHDQECQCABQQhHDQBBBSEBDJUDCyABQQFqIQEgFEEBaiIUIAJHDQALIAAgFTYCAAywAwsgAEEANgIAIBQhAQzYAQtBNCEQIAEiFCACRg2uAyACIBRrIAAoAgAiAWohFSAUIAFrQQVqIRYCQANAIBQtAAAiF0EgciAXIBdBv39qQf8BcUEaSRtB/wFxIAFB0MKAgABqLQAARw0BAkAgAUEFRw0AQQchAQyUAwsgAUEBaiEBIBRBAWoiFCACRw0ACyAAIBU2AgAMrwMLIABBADYCACAUIQEM1wELAkAgASIBIAJGDQADQAJAIAEtAABBgL6AgABqLQAAIhBBAUYNACAQQQJGDQogASEBDN0BCyABQQFqIgEgAkcNAAtBMCEQDK4DC0EwIRAMrQMLAkAgASIBIAJGDQADQAJAIAEtAAAiEEEgRg0AIBBBdmoOBNkB2gHaAdkB2gELIAFBAWoiASACRw0AC0E4IRAMrQMLQTghEAysAwsDQAJAIAEtAAAiEEEgRg0AIBBBCUcNAwsgAUEBaiIBIAJHDQALQTwhEAyrAwsDQAJAIAEtAAAiEEEgRg0AAkACQCAQQXZqDgTaAQEB2gEACyAQQSxGDdsBCyABIQEMBAsgAUEBaiIBIAJHDQALQT8hEAyqAwsgASEBDNsBC0HAACEQIAEiFCACRg2oAyACIBRrIAAoAgAiAWohFiAUIAFrQQZqIRcCQANAIBQtAABBIHIgAUGAwICAAGotAABHDQEgAUEGRg2OAyABQQFqIQEgFEEBaiIUIAJHDQALIAAgFjYCAAypAwsgAEEANgIAIBQhAQtBNiEQDI4DCwJAIAEiDyACRw0AQcEAIRAMpwMLIABBjICAgAA2AgggACAPNgIEIA8hASAALQAsQX9qDgTNAdUB1wHZAYcDCyABQQFqIQEMzAELAkAgASIBIAJGDQADQAJAIAEtAAAiEEEgciAQIBBBv39qQf8BcUEaSRtB/wFxIhBBCUYNACAQQSBGDQACQAJAAkACQCAQQZ1/ag4TAAMDAwMDAwMBAwMDAwMDAwMDAgMLIAFBAWohAUExIRAMkQMLIAFBAWohAUEyIRAMkAMLIAFBAWohAUEzIRAMjwMLIAEhAQzQAQsgAUEBaiIBIAJHDQALQTUhEAylAwtBNSEQDKQDCwJAIAEiASACRg0AA0ACQCABLQAAQYC8gIAAai0AAEEBRg0AIAEhAQzTAQsgAUEBaiIBIAJHDQALQT0hEAykAwtBPSEQDKMDCyAAIAEiASACELCAgIAAIhAN1gEgASEBDAELIBBBAWohAQtBPCEQDIcDCwJAIAEiASACRw0AQcIAIRAMoAMLAkADQAJAIAEtAABBd2oOGAAC/gL+AoQD/gL+Av4C/gL+Av4C/gL+Av4C/gL+Av4C/gL+Av4C/gL+Av4CAP4CCyABQQFqIgEgAkcNAAtBwgAhEAygAwsgAUEBaiEBIAAtAC1BAXFFDb0BIAEhAQtBLCEQDIUDCyABIgEgAkcN0wFBxAAhEAydAwsDQAJAIAEtAABBkMCAgABqLQAAQQFGDQAgASEBDLcCCyABQQFqIgEgAkcNAAtBxQAhEAycAwsgDS0AACIQQSBGDbMBIBBBOkcNgQMgACgCBCEBIABBADYCBCAAIAEgDRCvgICAACIBDdABIA1BAWohAQyzAgtBxwAhECABIg0gAkYNmgMgAiANayAAKAIAIgFqIRYgDSABa0EFaiEXA0AgDS0AACIUQSByIBQgFEG/f2pB/wFxQRpJG0H/AXEgAUGQwoCAAGotAABHDYADIAFBBUYN9AIgAUEBaiEBIA1BAWoiDSACRw0ACyAAIBY2AgAMmgMLQcgAIRAgASINIAJGDZkDIAIgDWsgACgCACIBaiEWIA0gAWtBCWohFwNAIA0tAAAiFEEgciAUIBRBv39qQf8BcUEaSRtB/wFxIAFBlsKAgABqLQAARw3/AgJAIAFBCUcNAEECIQEM9QILIAFBAWohASANQQFqIg0gAkcNAAsgACAWNgIADJkDCwJAIAEiDSACRw0AQckAIRAMmQMLAkACQCANLQAAIgFBIHIgASABQb9/akH/AXFBGkkbQf8BcUGSf2oOBwCAA4ADgAOAA4ADAYADCyANQQFqIQFBPiEQDIADCyANQQFqIQFBPyEQDP8CC0HKACEQIAEiDSACRg2XAyACIA1rIAAoAgAiAWohFiANIAFrQQFqIRcDQCANLQAAIhRBIHIgFCAUQb9/akH/AXFBGkkbQf8BcSABQaDCgIAAai0AAEcN/QIgAUEBRg3wAiABQQFqIQEgDUEBaiINIAJHDQALIAAgFjYCAAyXAwtBywAhECABIg0gAkYNlgMgAiANayAAKAIAIgFqIRYgDSABa0EOaiEXA0AgDS0AACIUQSByIBQgFEG/f2pB/wFxQRpJG0H/AXEgAUGiwoCAAGotAABHDfwCIAFBDkYN8AIgAUEBaiEBIA1BAWoiDSACRw0ACyAAIBY2AgAMlgMLQcwAIRAgASINIAJGDZUDIAIgDWsgACgCACIBaiEWIA0gAWtBD2ohFwNAIA0tAAAiFEEgciAUIBRBv39qQf8BcUEaSRtB/wFxIAFBwMKAgABqLQAARw37AgJAIAFBD0cNAEEDIQEM8QILIAFBAWohASANQQFqIg0gAkcNAAsgACAWNgIADJUDC0HNACEQIAEiDSACRg2UAyACIA1rIAAoAgAiAWohFiANIAFrQQVqIRcDQCANLQAAIhRBIHIgFCAUQb9/akH/AXFBGkkbQf8BcSABQdDCgIAAai0AAEcN+gICQCABQQVHDQBBBCEBDPACCyABQQFqIQEgDUEBaiINIAJHDQALIAAgFjYCAAyUAwsCQCABIg0gAkcNAEHOACEQDJQDCwJAAkACQAJAIA0tAAAiAUEgciABIAFBv39qQf8BcUEaSRtB/wFxQZ1/ag4TAP0C/QL9Av0C/QL9Av0C/QL9Av0C/QL9AgH9Av0C/QICA/0CCyANQQFqIQFBwQAhEAz9AgsgDUEBaiEBQcIAIRAM/AILIA1BAWohAUHDACEQDPsCCyANQQFqIQFBxAAhEAz6AgsCQCABIgEgAkYNACAAQY2AgIAANgIIIAAgATYCBCABIQFBxQAhEAz6AgtBzwAhEAySAwsgECEBAkACQCAQLQAAQXZqDgQBqAKoAgCoAgsgEEEBaiEBC0EnIRAM+AILAkAgASIBIAJHDQBB0QAhEAyRAwsCQCABLQAAQSBGDQAgASEBDI0BCyABQQFqIQEgAC0ALUEBcUUNxwEgASEBDIwBCyABIhcgAkcNyAFB0gAhEAyPAwtB0wAhECABIhQgAkYNjgMgAiAUayAAKAIAIgFqIRYgFCABa0EBaiEXA0AgFC0AACABQdbCgIAAai0AAEcNzAEgAUEBRg3HASABQQFqIQEgFEEBaiIUIAJHDQALIAAgFjYCAAyOAwsCQCABIgEgAkcNAEHVACEQDI4DCyABLQAAQQpHDcwBIAFBAWohAQzHAQsCQCABIgEgAkcNAEHWACEQDI0DCwJAAkAgAS0AAEF2ag4EAM0BzQEBzQELIAFBAWohAQzHAQsgAUEBaiEBQcoAIRAM8wILIAAgASIBIAIQroCAgAAiEA3LASABIQFBzQAhEAzyAgsgAC0AKUEiRg2FAwymAgsCQCABIgEgAkcNAEHbACEQDIoDC0EAIRRBASEXQQEhFkEAIRACQAJAAkACQAJAAkACQAJAAkAgAS0AAEFQag4K1AHTAQABAgMEBQYI1QELQQIhEAwGC0EDIRAMBQtBBCEQDAQLQQUhEAwDC0EGIRAMAgtBByEQDAELQQghEAtBACEXQQAhFkEAIRQMzAELQQkhEEEBIRRBACEXQQAhFgzLAQsCQCABIgEgAkcNAEHdACEQDIkDCyABLQAAQS5HDcwBIAFBAWohAQymAgsgASIBIAJHDcwBQd8AIRAMhwMLAkAgASIBIAJGDQAgAEGOgICAADYCCCAAIAE2AgQgASEBQdAAIRAM7gILQeAAIRAMhgMLQeEAIRAgASIBIAJGDYUDIAIgAWsgACgCACIUaiEWIAEgFGtBA2ohFwNAIAEtAAAgFEHiwoCAAGotAABHDc0BIBRBA0YNzAEgFEEBaiEUIAFBAWoiASACRw0ACyAAIBY2AgAMhQMLQeIAIRAgASIBIAJGDYQDIAIgAWsgACgCACIUaiEWIAEgFGtBAmohFwNAIAEtAAAgFEHmwoCAAGotAABHDcwBIBRBAkYNzgEgFEEBaiEUIAFBAWoiASACRw0ACyAAIBY2AgAMhAMLQeMAIRAgASIBIAJGDYMDIAIgAWsgACgCACIUaiEWIAEgFGtBA2ohFwNAIAEtAAAgFEHpwoCAAGotAABHDcsBIBRBA0YNzgEgFEEBaiEUIAFBAWoiASACRw0ACyAAIBY2AgAMgwMLAkAgASIBIAJHDQBB5QAhEAyDAwsgACABQQFqIgEgAhCogICAACIQDc0BIAEhAUHWACEQDOkCCwJAIAEiASACRg0AA0ACQCABLQAAIhBBIEYNAAJAAkACQCAQQbh/ag4LAAHPAc8BzwHPAc8BzwHPAc8BAs8BCyABQQFqIQFB0gAhEAztAgsgAUEBaiEBQdMAIRAM7AILIAFBAWohAUHUACEQDOsCCyABQQFqIgEgAkcNAAtB5AAhEAyCAwtB5AAhEAyBAwsDQAJAIAEtAABB8MKAgABqLQAAIhBBAUYNACAQQX5qDgPPAdAB0QHSAQsgAUEBaiIBIAJHDQALQeYAIRAMgAMLAkAgASIBIAJGDQAgAUEBaiEBDAMLQecAIRAM/wILA0ACQCABLQAAQfDEgIAAai0AACIQQQFGDQACQCAQQX5qDgTSAdMB1AEA1QELIAEhAUHXACEQDOcCCyABQQFqIgEgAkcNAAtB6AAhEAz+AgsCQCABIgEgAkcNAEHpACEQDP4CCwJAIAEtAAAiEEF2ag4augHVAdUBvAHVAdUB1QHVAdUB1QHVAdUB1QHVAdUB1QHVAdUB1QHVAdUB1QHKAdUB1QEA0wELIAFBAWohAQtBBiEQDOMCCwNAAkAgAS0AAEHwxoCAAGotAABBAUYNACABIQEMngILIAFBAWoiASACRw0AC0HqACEQDPsCCwJAIAEiASACRg0AIAFBAWohAQwDC0HrACEQDPoCCwJAIAEiASACRw0AQewAIRAM+gILIAFBAWohAQwBCwJAIAEiASACRw0AQe0AIRAM+QILIAFBAWohAQtBBCEQDN4CCwJAIAEiFCACRw0AQe4AIRAM9wILIBQhAQJAAkACQCAULQAAQfDIgIAAai0AAEF/ag4H1AHVAdYBAJwCAQLXAQsgFEEBaiEBDAoLIBRBAWohAQzNAQtBACEQIABBADYCHCAAQZuSgIAANgIQIABBBzYCDCAAIBRBAWo2AhQM9gILAkADQAJAIAEtAABB8MiAgABqLQAAIhBBBEYNAAJAAkAgEEF/ag4H0gHTAdQB2QEABAHZAQsgASEBQdoAIRAM4AILIAFBAWohAUHcACEQDN8CCyABQQFqIgEgAkcNAAtB7wAhEAz2AgsgAUEBaiEBDMsBCwJAIAEiFCACRw0AQfAAIRAM9QILIBQtAABBL0cN1AEgFEEBaiEBDAYLAkAgASIUIAJHDQBB8QAhEAz0AgsCQCAULQAAIgFBL0cNACAUQQFqIQFB3QAhEAzbAgsgAUF2aiIEQRZLDdMBQQEgBHRBiYCAAnFFDdMBDMoCCwJAIAEiASACRg0AIAFBAWohAUHeACEQDNoCC0HyACEQDPICCwJAIAEiFCACRw0AQfQAIRAM8gILIBQhAQJAIBQtAABB8MyAgABqLQAAQX9qDgPJApQCANQBC0HhACEQDNgCCwJAIAEiFCACRg0AA0ACQCAULQAAQfDKgIAAai0AACIBQQNGDQACQCABQX9qDgLLAgDVAQsgFCEBQd8AIRAM2gILIBRBAWoiFCACRw0AC0HzACEQDPECC0HzACEQDPACCwJAIAEiASACRg0AIABBj4CAgAA2AgggACABNgIEIAEhAUHgACEQDNcCC0H1ACEQDO8CCwJAIAEiASACRw0AQfYAIRAM7wILIABBj4CAgAA2AgggACABNgIEIAEhAQtBAyEQDNQCCwNAIAEtAABBIEcNwwIgAUEBaiIBIAJHDQALQfcAIRAM7AILAkAgASIBIAJHDQBB+AAhEAzsAgsgAS0AAEEgRw3OASABQQFqIQEM7wELIAAgASIBIAIQrICAgAAiEA3OASABIQEMjgILAkAgASIEIAJHDQBB+gAhEAzqAgsgBC0AAEHMAEcN0QEgBEEBaiEBQRMhEAzPAQsCQCABIgQgAkcNAEH7ACEQDOkCCyACIARrIAAoAgAiAWohFCAEIAFrQQVqIRADQCAELQAAIAFB8M6AgABqLQAARw3QASABQQVGDc4BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQfsAIRAM6AILAkAgASIEIAJHDQBB/AAhEAzoAgsCQAJAIAQtAABBvX9qDgwA0QHRAdEB0QHRAdEB0QHRAdEB0QEB0QELIARBAWohAUHmACEQDM8CCyAEQQFqIQFB5wAhEAzOAgsCQCABIgQgAkcNAEH9ACEQDOcCCyACIARrIAAoAgAiAWohFCAEIAFrQQJqIRACQANAIAQtAAAgAUHtz4CAAGotAABHDc8BIAFBAkYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEH9ACEQDOcCCyAAQQA2AgAgEEEBaiEBQRAhEAzMAQsCQCABIgQgAkcNAEH+ACEQDOYCCyACIARrIAAoAgAiAWohFCAEIAFrQQVqIRACQANAIAQtAAAgAUH2zoCAAGotAABHDc4BIAFBBUYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEH+ACEQDOYCCyAAQQA2AgAgEEEBaiEBQRYhEAzLAQsCQCABIgQgAkcNAEH/ACEQDOUCCyACIARrIAAoAgAiAWohFCAEIAFrQQNqIRACQANAIAQtAAAgAUH8zoCAAGotAABHDc0BIAFBA0YNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEH/ACEQDOUCCyAAQQA2AgAgEEEBaiEBQQUhEAzKAQsCQCABIgQgAkcNAEGAASEQDOQCCyAELQAAQdkARw3LASAEQQFqIQFBCCEQDMkBCwJAIAEiBCACRw0AQYEBIRAM4wILAkACQCAELQAAQbJ/ag4DAMwBAcwBCyAEQQFqIQFB6wAhEAzKAgsgBEEBaiEBQewAIRAMyQILAkAgASIEIAJHDQBBggEhEAziAgsCQAJAIAQtAABBuH9qDggAywHLAcsBywHLAcsBAcsBCyAEQQFqIQFB6gAhEAzJAgsgBEEBaiEBQe0AIRAMyAILAkAgASIEIAJHDQBBgwEhEAzhAgsgAiAEayAAKAIAIgFqIRAgBCABa0ECaiEUAkADQCAELQAAIAFBgM+AgABqLQAARw3JASABQQJGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBA2AgBBgwEhEAzhAgtBACEQIABBADYCACAUQQFqIQEMxgELAkAgASIEIAJHDQBBhAEhEAzgAgsgAiAEayAAKAIAIgFqIRQgBCABa0EEaiEQAkADQCAELQAAIAFBg8+AgABqLQAARw3IASABQQRGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBBhAEhEAzgAgsgAEEANgIAIBBBAWohAUEjIRAMxQELAkAgASIEIAJHDQBBhQEhEAzfAgsCQAJAIAQtAABBtH9qDggAyAHIAcgByAHIAcgBAcgBCyAEQQFqIQFB7wAhEAzGAgsgBEEBaiEBQfAAIRAMxQILAkAgASIEIAJHDQBBhgEhEAzeAgsgBC0AAEHFAEcNxQEgBEEBaiEBDIMCCwJAIAEiBCACRw0AQYcBIRAM3QILIAIgBGsgACgCACIBaiEUIAQgAWtBA2ohEAJAA0AgBC0AACABQYjPgIAAai0AAEcNxQEgAUEDRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQYcBIRAM3QILIABBADYCACAQQQFqIQFBLSEQDMIBCwJAIAEiBCACRw0AQYgBIRAM3AILIAIgBGsgACgCACIBaiEUIAQgAWtBCGohEAJAA0AgBC0AACABQdDPgIAAai0AAEcNxAEgAUEIRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQYgBIRAM3AILIABBADYCACAQQQFqIQFBKSEQDMEBCwJAIAEiASACRw0AQYkBIRAM2wILQQEhECABLQAAQd8ARw3AASABQQFqIQEMgQILAkAgASIEIAJHDQBBigEhEAzaAgsgAiAEayAAKAIAIgFqIRQgBCABa0EBaiEQA0AgBC0AACABQYzPgIAAai0AAEcNwQEgAUEBRg2vAiABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEGKASEQDNkCCwJAIAEiBCACRw0AQYsBIRAM2QILIAIgBGsgACgCACIBaiEUIAQgAWtBAmohEAJAA0AgBC0AACABQY7PgIAAai0AAEcNwQEgAUECRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQYsBIRAM2QILIABBADYCACAQQQFqIQFBAiEQDL4BCwJAIAEiBCACRw0AQYwBIRAM2AILIAIgBGsgACgCACIBaiEUIAQgAWtBAWohEAJAA0AgBC0AACABQfDPgIAAai0AAEcNwAEgAUEBRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQYwBIRAM2AILIABBADYCACAQQQFqIQFBHyEQDL0BCwJAIAEiBCACRw0AQY0BIRAM1wILIAIgBGsgACgCACIBaiEUIAQgAWtBAWohEAJAA0AgBC0AACABQfLPgIAAai0AAEcNvwEgAUEBRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQY0BIRAM1wILIABBADYCACAQQQFqIQFBCSEQDLwBCwJAIAEiBCACRw0AQY4BIRAM1gILAkACQCAELQAAQbd/ag4HAL8BvwG/Ab8BvwEBvwELIARBAWohAUH4ACEQDL0CCyAEQQFqIQFB+QAhEAy8AgsCQCABIgQgAkcNAEGPASEQDNUCCyACIARrIAAoAgAiAWohFCAEIAFrQQVqIRACQANAIAQtAAAgAUGRz4CAAGotAABHDb0BIAFBBUYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEGPASEQDNUCCyAAQQA2AgAgEEEBaiEBQRghEAy6AQsCQCABIgQgAkcNAEGQASEQDNQCCyACIARrIAAoAgAiAWohFCAEIAFrQQJqIRACQANAIAQtAAAgAUGXz4CAAGotAABHDbwBIAFBAkYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEGQASEQDNQCCyAAQQA2AgAgEEEBaiEBQRchEAy5AQsCQCABIgQgAkcNAEGRASEQDNMCCyACIARrIAAoAgAiAWohFCAEIAFrQQZqIRACQANAIAQtAAAgAUGaz4CAAGotAABHDbsBIAFBBkYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEGRASEQDNMCCyAAQQA2AgAgEEEBaiEBQRUhEAy4AQsCQCABIgQgAkcNAEGSASEQDNICCyACIARrIAAoAgAiAWohFCAEIAFrQQVqIRACQANAIAQtAAAgAUGhz4CAAGotAABHDboBIAFBBUYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEGSASEQDNICCyAAQQA2AgAgEEEBaiEBQR4hEAy3AQsCQCABIgQgAkcNAEGTASEQDNECCyAELQAAQcwARw24ASAEQQFqIQFBCiEQDLYBCwJAIAQgAkcNAEGUASEQDNACCwJAAkAgBC0AAEG/f2oODwC5AbkBuQG5AbkBuQG5AbkBuQG5AbkBuQG5AQG5AQsgBEEBaiEBQf4AIRAMtwILIARBAWohAUH/ACEQDLYCCwJAIAQgAkcNAEGVASEQDM8CCwJAAkAgBC0AAEG/f2oOAwC4AQG4AQsgBEEBaiEBQf0AIRAMtgILIARBAWohBEGAASEQDLUCCwJAIAQgAkcNAEGWASEQDM4CCyACIARrIAAoAgAiAWohFCAEIAFrQQFqIRACQANAIAQtAAAgAUGnz4CAAGotAABHDbYBIAFBAUYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEGWASEQDM4CCyAAQQA2AgAgEEEBaiEBQQshEAyzAQsCQCAEIAJHDQBBlwEhEAzNAgsCQAJAAkACQCAELQAAQVNqDiMAuAG4AbgBuAG4AbgBuAG4AbgBuAG4AbgBuAG4AbgBuAG4AbgBuAG4AbgBuAG4AQG4AbgBuAG4AbgBArgBuAG4AQO4AQsgBEEBaiEBQfsAIRAMtgILIARBAWohAUH8ACEQDLUCCyAEQQFqIQRBgQEhEAy0AgsgBEEBaiEEQYIBIRAMswILAkAgBCACRw0AQZgBIRAMzAILIAIgBGsgACgCACIBaiEUIAQgAWtBBGohEAJAA0AgBC0AACABQanPgIAAai0AAEcNtAEgAUEERg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQZgBIRAMzAILIABBADYCACAQQQFqIQFBGSEQDLEBCwJAIAQgAkcNAEGZASEQDMsCCyACIARrIAAoAgAiAWohFCAEIAFrQQVqIRACQANAIAQtAAAgAUGuz4CAAGotAABHDbMBIAFBBUYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEGZASEQDMsCCyAAQQA2AgAgEEEBaiEBQQYhEAywAQsCQCAEIAJHDQBBmgEhEAzKAgsgAiAEayAAKAIAIgFqIRQgBCABa0EBaiEQAkADQCAELQAAIAFBtM+AgABqLQAARw2yASABQQFGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBBmgEhEAzKAgsgAEEANgIAIBBBAWohAUEcIRAMrwELAkAgBCACRw0AQZsBIRAMyQILIAIgBGsgACgCACIBaiEUIAQgAWtBAWohEAJAA0AgBC0AACABQbbPgIAAai0AAEcNsQEgAUEBRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQZsBIRAMyQILIABBADYCACAQQQFqIQFBJyEQDK4BCwJAIAQgAkcNAEGcASEQDMgCCwJAAkAgBC0AAEGsf2oOAgABsQELIARBAWohBEGGASEQDK8CCyAEQQFqIQRBhwEhEAyuAgsCQCAEIAJHDQBBnQEhEAzHAgsgAiAEayAAKAIAIgFqIRQgBCABa0EBaiEQAkADQCAELQAAIAFBuM+AgABqLQAARw2vASABQQFGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBBnQEhEAzHAgsgAEEANgIAIBBBAWohAUEmIRAMrAELAkAgBCACRw0AQZ4BIRAMxgILIAIgBGsgACgCACIBaiEUIAQgAWtBAWohEAJAA0AgBC0AACABQbrPgIAAai0AAEcNrgEgAUEBRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQZ4BIRAMxgILIABBADYCACAQQQFqIQFBAyEQDKsBCwJAIAQgAkcNAEGfASEQDMUCCyACIARrIAAoAgAiAWohFCAEIAFrQQJqIRACQANAIAQtAAAgAUHtz4CAAGotAABHDa0BIAFBAkYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEGfASEQDMUCCyAAQQA2AgAgEEEBaiEBQQwhEAyqAQsCQCAEIAJHDQBBoAEhEAzEAgsgAiAEayAAKAIAIgFqIRQgBCABa0EDaiEQAkADQCAELQAAIAFBvM+AgABqLQAARw2sASABQQNGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBBoAEhEAzEAgsgAEEANgIAIBBBAWohAUENIRAMqQELAkAgBCACRw0AQaEBIRAMwwILAkACQCAELQAAQbp/ag4LAKwBrAGsAawBrAGsAawBrAGsAQGsAQsgBEEBaiEEQYsBIRAMqgILIARBAWohBEGMASEQDKkCCwJAIAQgAkcNAEGiASEQDMICCyAELQAAQdAARw2pASAEQQFqIQQM6QELAkAgBCACRw0AQaMBIRAMwQILAkACQCAELQAAQbd/ag4HAaoBqgGqAaoBqgEAqgELIARBAWohBEGOASEQDKgCCyAEQQFqIQFBIiEQDKYBCwJAIAQgAkcNAEGkASEQDMACCyACIARrIAAoAgAiAWohFCAEIAFrQQFqIRACQANAIAQtAAAgAUHAz4CAAGotAABHDagBIAFBAUYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEGkASEQDMACCyAAQQA2AgAgEEEBaiEBQR0hEAylAQsCQCAEIAJHDQBBpQEhEAy/AgsCQAJAIAQtAABBrn9qDgMAqAEBqAELIARBAWohBEGQASEQDKYCCyAEQQFqIQFBBCEQDKQBCwJAIAQgAkcNAEGmASEQDL4CCwJAAkACQAJAAkAgBC0AAEG/f2oOFQCqAaoBqgGqAaoBqgGqAaoBqgGqAQGqAaoBAqoBqgEDqgGqAQSqAQsgBEEBaiEEQYgBIRAMqAILIARBAWohBEGJASEQDKcCCyAEQQFqIQRBigEhEAymAgsgBEEBaiEEQY8BIRAMpQILIARBAWohBEGRASEQDKQCCwJAIAQgAkcNAEGnASEQDL0CCyACIARrIAAoAgAiAWohFCAEIAFrQQJqIRACQANAIAQtAAAgAUHtz4CAAGotAABHDaUBIAFBAkYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEGnASEQDL0CCyAAQQA2AgAgEEEBaiEBQREhEAyiAQsCQCAEIAJHDQBBqAEhEAy8AgsgAiAEayAAKAIAIgFqIRQgBCABa0ECaiEQAkADQCAELQAAIAFBws+AgABqLQAARw2kASABQQJGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBBqAEhEAy8AgsgAEEANgIAIBBBAWohAUEsIRAMoQELAkAgBCACRw0AQakBIRAMuwILIAIgBGsgACgCACIBaiEUIAQgAWtBBGohEAJAA0AgBC0AACABQcXPgIAAai0AAEcNowEgAUEERg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQakBIRAMuwILIABBADYCACAQQQFqIQFBKyEQDKABCwJAIAQgAkcNAEGqASEQDLoCCyACIARrIAAoAgAiAWohFCAEIAFrQQJqIRACQANAIAQtAAAgAUHKz4CAAGotAABHDaIBIAFBAkYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEGqASEQDLoCCyAAQQA2AgAgEEEBaiEBQRQhEAyfAQsCQCAEIAJHDQBBqwEhEAy5AgsCQAJAAkACQCAELQAAQb5/ag4PAAECpAGkAaQBpAGkAaQBpAGkAaQBpAGkAQOkAQsgBEEBaiEEQZMBIRAMogILIARBAWohBEGUASEQDKECCyAEQQFqIQRBlQEhEAygAgsgBEEBaiEEQZYBIRAMnwILAkAgBCACRw0AQawBIRAMuAILIAQtAABBxQBHDZ8BIARBAWohBAzgAQsCQCAEIAJHDQBBrQEhEAy3AgsgAiAEayAAKAIAIgFqIRQgBCABa0ECaiEQAkADQCAELQAAIAFBzc+AgABqLQAARw2fASABQQJGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBBrQEhEAy3AgsgAEEANgIAIBBBAWohAUEOIRAMnAELAkAgBCACRw0AQa4BIRAMtgILIAQtAABB0ABHDZ0BIARBAWohAUElIRAMmwELAkAgBCACRw0AQa8BIRAMtQILIAIgBGsgACgCACIBaiEUIAQgAWtBCGohEAJAA0AgBC0AACABQdDPgIAAai0AAEcNnQEgAUEIRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQa8BIRAMtQILIABBADYCACAQQQFqIQFBKiEQDJoBCwJAIAQgAkcNAEGwASEQDLQCCwJAAkAgBC0AAEGrf2oOCwCdAZ0BnQGdAZ0BnQGdAZ0BnQEBnQELIARBAWohBEGaASEQDJsCCyAEQQFqIQRBmwEhEAyaAgsCQCAEIAJHDQBBsQEhEAyzAgsCQAJAIAQtAABBv39qDhQAnAGcAZwBnAGcAZwBnAGcAZwBnAGcAZwBnAGcAZwBnAGcAZwBAZwBCyAEQQFqIQRBmQEhEAyaAgsgBEEBaiEEQZwBIRAMmQILAkAgBCACRw0AQbIBIRAMsgILIAIgBGsgACgCACIBaiEUIAQgAWtBA2ohEAJAA0AgBC0AACABQdnPgIAAai0AAEcNmgEgAUEDRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQbIBIRAMsgILIABBADYCACAQQQFqIQFBISEQDJcBCwJAIAQgAkcNAEGzASEQDLECCyACIARrIAAoAgAiAWohFCAEIAFrQQZqIRACQANAIAQtAAAgAUHdz4CAAGotAABHDZkBIAFBBkYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEGzASEQDLECCyAAQQA2AgAgEEEBaiEBQRohEAyWAQsCQCAEIAJHDQBBtAEhEAywAgsCQAJAAkAgBC0AAEG7f2oOEQCaAZoBmgGaAZoBmgGaAZoBmgEBmgGaAZoBmgGaAQKaAQsgBEEBaiEEQZ0BIRAMmAILIARBAWohBEGeASEQDJcCCyAEQQFqIQRBnwEhEAyWAgsCQCAEIAJHDQBBtQEhEAyvAgsgAiAEayAAKAIAIgFqIRQgBCABa0EFaiEQAkADQCAELQAAIAFB5M+AgABqLQAARw2XASABQQVGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBBtQEhEAyvAgsgAEEANgIAIBBBAWohAUEoIRAMlAELAkAgBCACRw0AQbYBIRAMrgILIAIgBGsgACgCACIBaiEUIAQgAWtBAmohEAJAA0AgBC0AACABQerPgIAAai0AAEcNlgEgAUECRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQbYBIRAMrgILIABBADYCACAQQQFqIQFBByEQDJMBCwJAIAQgAkcNAEG3ASEQDK0CCwJAAkAgBC0AAEG7f2oODgCWAZYBlgGWAZYBlgGWAZYBlgGWAZYBlgEBlgELIARBAWohBEGhASEQDJQCCyAEQQFqIQRBogEhEAyTAgsCQCAEIAJHDQBBuAEhEAysAgsgAiAEayAAKAIAIgFqIRQgBCABa0ECaiEQAkADQCAELQAAIAFB7c+AgABqLQAARw2UASABQQJGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBBuAEhEAysAgsgAEEANgIAIBBBAWohAUESIRAMkQELAkAgBCACRw0AQbkBIRAMqwILIAIgBGsgACgCACIBaiEUIAQgAWtBAWohEAJAA0AgBC0AACABQfDPgIAAai0AAEcNkwEgAUEBRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQbkBIRAMqwILIABBADYCACAQQQFqIQFBICEQDJABCwJAIAQgAkcNAEG6ASEQDKoCCyACIARrIAAoAgAiAWohFCAEIAFrQQFqIRACQANAIAQtAAAgAUHyz4CAAGotAABHDZIBIAFBAUYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEG6ASEQDKoCCyAAQQA2AgAgEEEBaiEBQQ8hEAyPAQsCQCAEIAJHDQBBuwEhEAypAgsCQAJAIAQtAABBt39qDgcAkgGSAZIBkgGSAQGSAQsgBEEBaiEEQaUBIRAMkAILIARBAWohBEGmASEQDI8CCwJAIAQgAkcNAEG8ASEQDKgCCyACIARrIAAoAgAiAWohFCAEIAFrQQdqIRACQANAIAQtAAAgAUH0z4CAAGotAABHDZABIAFBB0YNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEG8ASEQDKgCCyAAQQA2AgAgEEEBaiEBQRshEAyNAQsCQCAEIAJHDQBBvQEhEAynAgsCQAJAAkAgBC0AAEG+f2oOEgCRAZEBkQGRAZEBkQGRAZEBkQEBkQGRAZEBkQGRAZEBApEBCyAEQQFqIQRBpAEhEAyPAgsgBEEBaiEEQacBIRAMjgILIARBAWohBEGoASEQDI0CCwJAIAQgAkcNAEG+ASEQDKYCCyAELQAAQc4ARw2NASAEQQFqIQQMzwELAkAgBCACRw0AQb8BIRAMpQILAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgBC0AAEG/f2oOFQABAgOcAQQFBpwBnAGcAQcICQoLnAEMDQ4PnAELIARBAWohAUHoACEQDJoCCyAEQQFqIQFB6QAhEAyZAgsgBEEBaiEBQe4AIRAMmAILIARBAWohAUHyACEQDJcCCyAEQQFqIQFB8wAhEAyWAgsgBEEBaiEBQfYAIRAMlQILIARBAWohAUH3ACEQDJQCCyAEQQFqIQFB+gAhEAyTAgsgBEEBaiEEQYMBIRAMkgILIARBAWohBEGEASEQDJECCyAEQQFqIQRBhQEhEAyQAgsgBEEBaiEEQZIBIRAMjwILIARBAWohBEGYASEQDI4CCyAEQQFqIQRBoAEhEAyNAgsgBEEBaiEEQaMBIRAMjAILIARBAWohBEGqASEQDIsCCwJAIAQgAkYNACAAQZCAgIAANgIIIAAgBDYCBEGrASEQDIsCC0HAASEQDKMCCyAAIAUgAhCqgICAACIBDYsBIAUhAQxcCwJAIAYgAkYNACAGQQFqIQUMjQELQcIBIRAMoQILA0ACQCAQLQAAQXZqDgSMAQAAjwEACyAQQQFqIhAgAkcNAAtBwwEhEAygAgsCQCAHIAJGDQAgAEGRgICAADYCCCAAIAc2AgQgByEBQQEhEAyHAgtBxAEhEAyfAgsCQCAHIAJHDQBBxQEhEAyfAgsCQAJAIActAABBdmoOBAHOAc4BAM4BCyAHQQFqIQYMjQELIAdBAWohBQyJAQsCQCAHIAJHDQBBxgEhEAyeAgsCQAJAIActAABBdmoOFwGPAY8BAY8BjwGPAY8BjwGPAY8BjwGPAY8BjwGPAY8BjwGPAY8BjwGPAQCPAQsgB0EBaiEHC0GwASEQDIQCCwJAIAggAkcNAEHIASEQDJ0CCyAILQAAQSBHDY0BIABBADsBMiAIQQFqIQFBswEhEAyDAgsgASEXAkADQCAXIgcgAkYNASAHLQAAQVBqQf8BcSIQQQpPDcwBAkAgAC8BMiIUQZkzSw0AIAAgFEEKbCIUOwEyIBBB//8DcyAUQf7/A3FJDQAgB0EBaiEXIAAgFCAQaiIQOwEyIBBB//8DcUHoB0kNAQsLQQAhECAAQQA2AhwgAEHBiYCAADYCECAAQQ02AgwgACAHQQFqNgIUDJwCC0HHASEQDJsCCyAAIAggAhCugICAACIQRQ3KASAQQRVHDYwBIABByAE2AhwgACAINgIUIABByZeAgAA2AhAgAEEVNgIMQQAhEAyaAgsCQCAJIAJHDQBBzAEhEAyaAgtBACEUQQEhF0EBIRZBACEQAkACQAJAAkACQAJAAkACQAJAIAktAABBUGoOCpYBlQEAAQIDBAUGCJcBC0ECIRAMBgtBAyEQDAULQQQhEAwEC0EFIRAMAwtBBiEQDAILQQchEAwBC0EIIRALQQAhF0EAIRZBACEUDI4BC0EJIRBBASEUQQAhF0EAIRYMjQELAkAgCiACRw0AQc4BIRAMmQILIAotAABBLkcNjgEgCkEBaiEJDMoBCyALIAJHDY4BQdABIRAMlwILAkAgCyACRg0AIABBjoCAgAA2AgggACALNgIEQbcBIRAM/gELQdEBIRAMlgILAkAgBCACRw0AQdIBIRAMlgILIAIgBGsgACgCACIQaiEUIAQgEGtBBGohCwNAIAQtAAAgEEH8z4CAAGotAABHDY4BIBBBBEYN6QEgEEEBaiEQIARBAWoiBCACRw0ACyAAIBQ2AgBB0gEhEAyVAgsgACAMIAIQrICAgAAiAQ2NASAMIQEMuAELAkAgBCACRw0AQdQBIRAMlAILIAIgBGsgACgCACIQaiEUIAQgEGtBAWohDANAIAQtAAAgEEGB0ICAAGotAABHDY8BIBBBAUYNjgEgEEEBaiEQIARBAWoiBCACRw0ACyAAIBQ2AgBB1AEhEAyTAgsCQCAEIAJHDQBB1gEhEAyTAgsgAiAEayAAKAIAIhBqIRQgBCAQa0ECaiELA0AgBC0AACAQQYPQgIAAai0AAEcNjgEgEEECRg2QASAQQQFqIRAgBEEBaiIEIAJHDQALIAAgFDYCAEHWASEQDJICCwJAIAQgAkcNAEHXASEQDJICCwJAAkAgBC0AAEG7f2oOEACPAY8BjwGPAY8BjwGPAY8BjwGPAY8BjwGPAY8BAY8BCyAEQQFqIQRBuwEhEAz5AQsgBEEBaiEEQbwBIRAM+AELAkAgBCACRw0AQdgBIRAMkQILIAQtAABByABHDYwBIARBAWohBAzEAQsCQCAEIAJGDQAgAEGQgICAADYCCCAAIAQ2AgRBvgEhEAz3AQtB2QEhEAyPAgsCQCAEIAJHDQBB2gEhEAyPAgsgBC0AAEHIAEYNwwEgAEEBOgAoDLkBCyAAQQI6AC8gACAEIAIQpoCAgAAiEA2NAUHCASEQDPQBCyAALQAoQX9qDgK3AbkBuAELA0ACQCAELQAAQXZqDgQAjgGOAQCOAQsgBEEBaiIEIAJHDQALQd0BIRAMiwILIABBADoALyAALQAtQQRxRQ2EAgsgAEEAOgAvIABBAToANCABIQEMjAELIBBBFUYN2gEgAEEANgIcIAAgATYCFCAAQaeOgIAANgIQIABBEjYCDEEAIRAMiAILAkAgACAQIAIQtICAgAAiBA0AIBAhAQyBAgsCQCAEQRVHDQAgAEEDNgIcIAAgEDYCFCAAQbCYgIAANgIQIABBFTYCDEEAIRAMiAILIABBADYCHCAAIBA2AhQgAEGnjoCAADYCECAAQRI2AgxBACEQDIcCCyAQQRVGDdYBIABBADYCHCAAIAE2AhQgAEHajYCAADYCECAAQRQ2AgxBACEQDIYCCyAAKAIEIRcgAEEANgIEIBAgEadqIhYhASAAIBcgECAWIBQbIhAQtYCAgAAiFEUNjQEgAEEHNgIcIAAgEDYCFCAAIBQ2AgxBACEQDIUCCyAAIAAvATBBgAFyOwEwIAEhAQtBKiEQDOoBCyAQQRVGDdEBIABBADYCHCAAIAE2AhQgAEGDjICAADYCECAAQRM2AgxBACEQDIICCyAQQRVGDc8BIABBADYCHCAAIAE2AhQgAEGaj4CAADYCECAAQSI2AgxBACEQDIECCyAAKAIEIRAgAEEANgIEAkAgACAQIAEQt4CAgAAiEA0AIAFBAWohAQyNAQsgAEEMNgIcIAAgEDYCDCAAIAFBAWo2AhRBACEQDIACCyAQQRVGDcwBIABBADYCHCAAIAE2AhQgAEGaj4CAADYCECAAQSI2AgxBACEQDP8BCyAAKAIEIRAgAEEANgIEAkAgACAQIAEQt4CAgAAiEA0AIAFBAWohAQyMAQsgAEENNgIcIAAgEDYCDCAAIAFBAWo2AhRBACEQDP4BCyAQQRVGDckBIABBADYCHCAAIAE2AhQgAEHGjICAADYCECAAQSM2AgxBACEQDP0BCyAAKAIEIRAgAEEANgIEAkAgACAQIAEQuYCAgAAiEA0AIAFBAWohAQyLAQsgAEEONgIcIAAgEDYCDCAAIAFBAWo2AhRBACEQDPwBCyAAQQA2AhwgACABNgIUIABBwJWAgAA2AhAgAEECNgIMQQAhEAz7AQsgEEEVRg3FASAAQQA2AhwgACABNgIUIABBxoyAgAA2AhAgAEEjNgIMQQAhEAz6AQsgAEEQNgIcIAAgATYCFCAAIBA2AgxBACEQDPkBCyAAKAIEIQQgAEEANgIEAkAgACAEIAEQuYCAgAAiBA0AIAFBAWohAQzxAQsgAEERNgIcIAAgBDYCDCAAIAFBAWo2AhRBACEQDPgBCyAQQRVGDcEBIABBADYCHCAAIAE2AhQgAEHGjICAADYCECAAQSM2AgxBACEQDPcBCyAAKAIEIRAgAEEANgIEAkAgACAQIAEQuYCAgAAiEA0AIAFBAWohAQyIAQsgAEETNgIcIAAgEDYCDCAAIAFBAWo2AhRBACEQDPYBCyAAKAIEIQQgAEEANgIEAkAgACAEIAEQuYCAgAAiBA0AIAFBAWohAQztAQsgAEEUNgIcIAAgBDYCDCAAIAFBAWo2AhRBACEQDPUBCyAQQRVGDb0BIABBADYCHCAAIAE2AhQgAEGaj4CAADYCECAAQSI2AgxBACEQDPQBCyAAKAIEIRAgAEEANgIEAkAgACAQIAEQt4CAgAAiEA0AIAFBAWohAQyGAQsgAEEWNgIcIAAgEDYCDCAAIAFBAWo2AhRBACEQDPMBCyAAKAIEIQQgAEEANgIEAkAgACAEIAEQt4CAgAAiBA0AIAFBAWohAQzpAQsgAEEXNgIcIAAgBDYCDCAAIAFBAWo2AhRBACEQDPIBCyAAQQA2AhwgACABNgIUIABBzZOAgAA2AhAgAEEMNgIMQQAhEAzxAQtCASERCyAQQQFqIQECQCAAKQMgIhJC//////////8PVg0AIAAgEkIEhiARhDcDICABIQEMhAELIABBADYCHCAAIAE2AhQgAEGtiYCAADYCECAAQQw2AgxBACEQDO8BCyAAQQA2AhwgACAQNgIUIABBzZOAgAA2AhAgAEEMNgIMQQAhEAzuAQsgACgCBCEXIABBADYCBCAQIBGnaiIWIQEgACAXIBAgFiAUGyIQELWAgIAAIhRFDXMgAEEFNgIcIAAgEDYCFCAAIBQ2AgxBACEQDO0BCyAAQQA2AhwgACAQNgIUIABBqpyAgAA2AhAgAEEPNgIMQQAhEAzsAQsgACAQIAIQtICAgAAiAQ0BIBAhAQtBDiEQDNEBCwJAIAFBFUcNACAAQQI2AhwgACAQNgIUIABBsJiAgAA2AhAgAEEVNgIMQQAhEAzqAQsgAEEANgIcIAAgEDYCFCAAQaeOgIAANgIQIABBEjYCDEEAIRAM6QELIAFBAWohEAJAIAAvATAiAUGAAXFFDQACQCAAIBAgAhC7gICAACIBDQAgECEBDHALIAFBFUcNugEgAEEFNgIcIAAgEDYCFCAAQfmXgIAANgIQIABBFTYCDEEAIRAM6QELAkAgAUGgBHFBoARHDQAgAC0ALUECcQ0AIABBADYCHCAAIBA2AhQgAEGWk4CAADYCECAAQQQ2AgxBACEQDOkBCyAAIBAgAhC9gICAABogECEBAkACQAJAAkACQCAAIBAgAhCzgICAAA4WAgEABAQEBAQEBAQEBAQEBAQEBAQEAwQLIABBAToALgsgACAALwEwQcAAcjsBMCAQIQELQSYhEAzRAQsgAEEjNgIcIAAgEDYCFCAAQaWWgIAANgIQIABBFTYCDEEAIRAM6QELIABBADYCHCAAIBA2AhQgAEHVi4CAADYCECAAQRE2AgxBACEQDOgBCyAALQAtQQFxRQ0BQcMBIRAMzgELAkAgDSACRg0AA0ACQCANLQAAQSBGDQAgDSEBDMQBCyANQQFqIg0gAkcNAAtBJSEQDOcBC0ElIRAM5gELIAAoAgQhBCAAQQA2AgQgACAEIA0Qr4CAgAAiBEUNrQEgAEEmNgIcIAAgBDYCDCAAIA1BAWo2AhRBACEQDOUBCyAQQRVGDasBIABBADYCHCAAIAE2AhQgAEH9jYCAADYCECAAQR02AgxBACEQDOQBCyAAQSc2AhwgACABNgIUIAAgEDYCDEEAIRAM4wELIBAhAUEBIRQCQAJAAkACQAJAAkACQCAALQAsQX5qDgcGBQUDAQIABQsgACAALwEwQQhyOwEwDAMLQQIhFAwBC0EEIRQLIABBAToALCAAIAAvATAgFHI7ATALIBAhAQtBKyEQDMoBCyAAQQA2AhwgACAQNgIUIABBq5KAgAA2AhAgAEELNgIMQQAhEAziAQsgAEEANgIcIAAgATYCFCAAQeGPgIAANgIQIABBCjYCDEEAIRAM4QELIABBADoALCAQIQEMvQELIBAhAUEBIRQCQAJAAkACQAJAIAAtACxBe2oOBAMBAgAFCyAAIAAvATBBCHI7ATAMAwtBAiEUDAELQQQhFAsgAEEBOgAsIAAgAC8BMCAUcjsBMAsgECEBC0EpIRAMxQELIABBADYCHCAAIAE2AhQgAEHwlICAADYCECAAQQM2AgxBACEQDN0BCwJAIA4tAABBDUcNACAAKAIEIQEgAEEANgIEAkAgACABIA4QsYCAgAAiAQ0AIA5BAWohAQx1CyAAQSw2AhwgACABNgIMIAAgDkEBajYCFEEAIRAM3QELIAAtAC1BAXFFDQFBxAEhEAzDAQsCQCAOIAJHDQBBLSEQDNwBCwJAAkADQAJAIA4tAABBdmoOBAIAAAMACyAOQQFqIg4gAkcNAAtBLSEQDN0BCyAAKAIEIQEgAEEANgIEAkAgACABIA4QsYCAgAAiAQ0AIA4hAQx0CyAAQSw2AhwgACAONgIUIAAgATYCDEEAIRAM3AELIAAoAgQhASAAQQA2AgQCQCAAIAEgDhCxgICAACIBDQAgDkEBaiEBDHMLIABBLDYCHCAAIAE2AgwgACAOQQFqNgIUQQAhEAzbAQsgACgCBCEEIABBADYCBCAAIAQgDhCxgICAACIEDaABIA4hAQzOAQsgEEEsRw0BIAFBAWohEEEBIQECQAJAAkACQAJAIAAtACxBe2oOBAMBAgQACyAQIQEMBAtBAiEBDAELQQQhAQsgAEEBOgAsIAAgAC8BMCABcjsBMCAQIQEMAQsgACAALwEwQQhyOwEwIBAhAQtBOSEQDL8BCyAAQQA6ACwgASEBC0E0IRAMvQELIAAgAC8BMEEgcjsBMCABIQEMAgsgACgCBCEEIABBADYCBAJAIAAgBCABELGAgIAAIgQNACABIQEMxwELIABBNzYCHCAAIAE2AhQgACAENgIMQQAhEAzUAQsgAEEIOgAsIAEhAQtBMCEQDLkBCwJAIAAtAChBAUYNACABIQEMBAsgAC0ALUEIcUUNkwEgASEBDAMLIAAtADBBIHENlAFBxQEhEAy3AQsCQCAPIAJGDQACQANAAkAgDy0AAEFQaiIBQf8BcUEKSQ0AIA8hAUE1IRAMugELIAApAyAiEUKZs+bMmbPmzBlWDQEgACARQgp+IhE3AyAgESABrUL/AYMiEkJ/hVYNASAAIBEgEnw3AyAgD0EBaiIPIAJHDQALQTkhEAzRAQsgACgCBCECIABBADYCBCAAIAIgD0EBaiIEELGAgIAAIgINlQEgBCEBDMMBC0E5IRAMzwELAkAgAC8BMCIBQQhxRQ0AIAAtAChBAUcNACAALQAtQQhxRQ2QAQsgACABQff7A3FBgARyOwEwIA8hAQtBNyEQDLQBCyAAIAAvATBBEHI7ATAMqwELIBBBFUYNiwEgAEEANgIcIAAgATYCFCAAQfCOgIAANgIQIABBHDYCDEEAIRAMywELIABBwwA2AhwgACABNgIMIAAgDUEBajYCFEEAIRAMygELAkAgAS0AAEE6Rw0AIAAoAgQhECAAQQA2AgQCQCAAIBAgARCvgICAACIQDQAgAUEBaiEBDGMLIABBwwA2AhwgACAQNgIMIAAgAUEBajYCFEEAIRAMygELIABBADYCHCAAIAE2AhQgAEGxkYCAADYCECAAQQo2AgxBACEQDMkBCyAAQQA2AhwgACABNgIUIABBoJmAgAA2AhAgAEEeNgIMQQAhEAzIAQsgAEEANgIACyAAQYASOwEqIAAgF0EBaiIBIAIQqICAgAAiEA0BIAEhAQtBxwAhEAysAQsgEEEVRw2DASAAQdEANgIcIAAgATYCFCAAQeOXgIAANgIQIABBFTYCDEEAIRAMxAELIAAoAgQhECAAQQA2AgQCQCAAIBAgARCngICAACIQDQAgASEBDF4LIABB0gA2AhwgACABNgIUIAAgEDYCDEEAIRAMwwELIABBADYCHCAAIBQ2AhQgAEHBqICAADYCECAAQQc2AgwgAEEANgIAQQAhEAzCAQsgACgCBCEQIABBADYCBAJAIAAgECABEKeAgIAAIhANACABIQEMXQsgAEHTADYCHCAAIAE2AhQgACAQNgIMQQAhEAzBAQtBACEQIABBADYCHCAAIAE2AhQgAEGAkYCAADYCECAAQQk2AgwMwAELIBBBFUYNfSAAQQA2AhwgACABNgIUIABBlI2AgAA2AhAgAEEhNgIMQQAhEAy/AQtBASEWQQAhF0EAIRRBASEQCyAAIBA6ACsgAUEBaiEBAkACQCAALQAtQRBxDQACQAJAAkAgAC0AKg4DAQACBAsgFkUNAwwCCyAUDQEMAgsgF0UNAQsgACgCBCEQIABBADYCBAJAIAAgECABEK2AgIAAIhANACABIQEMXAsgAEHYADYCHCAAIAE2AhQgACAQNgIMQQAhEAy+AQsgACgCBCEEIABBADYCBAJAIAAgBCABEK2AgIAAIgQNACABIQEMrQELIABB2QA2AhwgACABNgIUIAAgBDYCDEEAIRAMvQELIAAoAgQhBCAAQQA2AgQCQCAAIAQgARCtgICAACIEDQAgASEBDKsBCyAAQdoANgIcIAAgATYCFCAAIAQ2AgxBACEQDLwBCyAAKAIEIQQgAEEANgIEAkAgACAEIAEQrYCAgAAiBA0AIAEhAQypAQsgAEHcADYCHCAAIAE2AhQgACAENgIMQQAhEAy7AQsCQCABLQAAQVBqIhBB/wFxQQpPDQAgACAQOgAqIAFBAWohAUHPACEQDKIBCyAAKAIEIQQgAEEANgIEAkAgACAEIAEQrYCAgAAiBA0AIAEhAQynAQsgAEHeADYCHCAAIAE2AhQgACAENgIMQQAhEAy6AQsgAEEANgIAIBdBAWohAQJAIAAtAClBI08NACABIQEMWQsgAEEANgIcIAAgATYCFCAAQdOJgIAANgIQIABBCDYCDEEAIRAMuQELIABBADYCAAtBACEQIABBADYCHCAAIAE2AhQgAEGQs4CAADYCECAAQQg2AgwMtwELIABBADYCACAXQQFqIQECQCAALQApQSFHDQAgASEBDFYLIABBADYCHCAAIAE2AhQgAEGbioCAADYCECAAQQg2AgxBACEQDLYBCyAAQQA2AgAgF0EBaiEBAkAgAC0AKSIQQV1qQQtPDQAgASEBDFULAkAgEEEGSw0AQQEgEHRBygBxRQ0AIAEhAQxVC0EAIRAgAEEANgIcIAAgATYCFCAAQfeJgIAANgIQIABBCDYCDAy1AQsgEEEVRg1xIABBADYCHCAAIAE2AhQgAEG5jYCAADYCECAAQRo2AgxBACEQDLQBCyAAKAIEIRAgAEEANgIEAkAgACAQIAEQp4CAgAAiEA0AIAEhAQxUCyAAQeUANgIcIAAgATYCFCAAIBA2AgxBACEQDLMBCyAAKAIEIRAgAEEANgIEAkAgACAQIAEQp4CAgAAiEA0AIAEhAQxNCyAAQdIANgIcIAAgATYCFCAAIBA2AgxBACEQDLIBCyAAKAIEIRAgAEEANgIEAkAgACAQIAEQp4CAgAAiEA0AIAEhAQxNCyAAQdMANgIcIAAgATYCFCAAIBA2AgxBACEQDLEBCyAAKAIEIRAgAEEANgIEAkAgACAQIAEQp4CAgAAiEA0AIAEhAQxRCyAAQeUANgIcIAAgATYCFCAAIBA2AgxBACEQDLABCyAAQQA2AhwgACABNgIUIABBxoqAgAA2AhAgAEEHNgIMQQAhEAyvAQsgACgCBCEQIABBADYCBAJAIAAgECABEKeAgIAAIhANACABIQEMSQsgAEHSADYCHCAAIAE2AhQgACAQNgIMQQAhEAyuAQsgACgCBCEQIABBADYCBAJAIAAgECABEKeAgIAAIhANACABIQEMSQsgAEHTADYCHCAAIAE2AhQgACAQNgIMQQAhEAytAQsgACgCBCEQIABBADYCBAJAIAAgECABEKeAgIAAIhANACABIQEMTQsgAEHlADYCHCAAIAE2AhQgACAQNgIMQQAhEAysAQsgAEEANgIcIAAgATYCFCAAQdyIgIAANgIQIABBBzYCDEEAIRAMqwELIBBBP0cNASABQQFqIQELQQUhEAyQAQtBACEQIABBADYCHCAAIAE2AhQgAEH9koCAADYCECAAQQc2AgwMqAELIAAoAgQhECAAQQA2AgQCQCAAIBAgARCngICAACIQDQAgASEBDEILIABB0gA2AhwgACABNgIUIAAgEDYCDEEAIRAMpwELIAAoAgQhECAAQQA2AgQCQCAAIBAgARCngICAACIQDQAgASEBDEILIABB0wA2AhwgACABNgIUIAAgEDYCDEEAIRAMpgELIAAoAgQhECAAQQA2AgQCQCAAIBAgARCngICAACIQDQAgASEBDEYLIABB5QA2AhwgACABNgIUIAAgEDYCDEEAIRAMpQELIAAoAgQhASAAQQA2AgQCQCAAIAEgFBCngICAACIBDQAgFCEBDD8LIABB0gA2AhwgACAUNgIUIAAgATYCDEEAIRAMpAELIAAoAgQhASAAQQA2AgQCQCAAIAEgFBCngICAACIBDQAgFCEBDD8LIABB0wA2AhwgACAUNgIUIAAgATYCDEEAIRAMowELIAAoAgQhASAAQQA2AgQCQCAAIAEgFBCngICAACIBDQAgFCEBDEMLIABB5QA2AhwgACAUNgIUIAAgATYCDEEAIRAMogELIABBADYCHCAAIBQ2AhQgAEHDj4CAADYCECAAQQc2AgxBACEQDKEBCyAAQQA2AhwgACABNgIUIABBw4+AgAA2AhAgAEEHNgIMQQAhEAygAQtBACEQIABBADYCHCAAIBQ2AhQgAEGMnICAADYCECAAQQc2AgwMnwELIABBADYCHCAAIBQ2AhQgAEGMnICAADYCECAAQQc2AgxBACEQDJ4BCyAAQQA2AhwgACAUNgIUIABB/pGAgAA2AhAgAEEHNgIMQQAhEAydAQsgAEEANgIcIAAgATYCFCAAQY6bgIAANgIQIABBBjYCDEEAIRAMnAELIBBBFUYNVyAAQQA2AhwgACABNgIUIABBzI6AgAA2AhAgAEEgNgIMQQAhEAybAQsgAEEANgIAIBBBAWohAUEkIRALIAAgEDoAKSAAKAIEIRAgAEEANgIEIAAgECABEKuAgIAAIhANVCABIQEMPgsgAEEANgIAC0EAIRAgAEEANgIcIAAgBDYCFCAAQfGbgIAANgIQIABBBjYCDAyXAQsgAUEVRg1QIABBADYCHCAAIAU2AhQgAEHwjICAADYCECAAQRs2AgxBACEQDJYBCyAAKAIEIQUgAEEANgIEIAAgBSAQEKmAgIAAIgUNASAQQQFqIQULQa0BIRAMewsgAEHBATYCHCAAIAU2AgwgACAQQQFqNgIUQQAhEAyTAQsgACgCBCEGIABBADYCBCAAIAYgEBCpgICAACIGDQEgEEEBaiEGC0GuASEQDHgLIABBwgE2AhwgACAGNgIMIAAgEEEBajYCFEEAIRAMkAELIABBADYCHCAAIAc2AhQgAEGXi4CAADYCECAAQQ02AgxBACEQDI8BCyAAQQA2AhwgACAINgIUIABB45CAgAA2AhAgAEEJNgIMQQAhEAyOAQsgAEEANgIcIAAgCDYCFCAAQZSNgIAANgIQIABBITYCDEEAIRAMjQELQQEhFkEAIRdBACEUQQEhEAsgACAQOgArIAlBAWohCAJAAkAgAC0ALUEQcQ0AAkACQAJAIAAtACoOAwEAAgQLIBZFDQMMAgsgFA0BDAILIBdFDQELIAAoAgQhECAAQQA2AgQgACAQIAgQrYCAgAAiEEUNPSAAQckBNgIcIAAgCDYCFCAAIBA2AgxBACEQDIwBCyAAKAIEIQQgAEEANgIEIAAgBCAIEK2AgIAAIgRFDXYgAEHKATYCHCAAIAg2AhQgACAENgIMQQAhEAyLAQsgACgCBCEEIABBADYCBCAAIAQgCRCtgICAACIERQ10IABBywE2AhwgACAJNgIUIAAgBDYCDEEAIRAMigELIAAoAgQhBCAAQQA2AgQgACAEIAoQrYCAgAAiBEUNciAAQc0BNgIcIAAgCjYCFCAAIAQ2AgxBACEQDIkBCwJAIAstAABBUGoiEEH/AXFBCk8NACAAIBA6ACogC0EBaiEKQbYBIRAMcAsgACgCBCEEIABBADYCBCAAIAQgCxCtgICAACIERQ1wIABBzwE2AhwgACALNgIUIAAgBDYCDEEAIRAMiAELIABBADYCHCAAIAQ2AhQgAEGQs4CAADYCECAAQQg2AgwgAEEANgIAQQAhEAyHAQsgAUEVRg0/IABBADYCHCAAIAw2AhQgAEHMjoCAADYCECAAQSA2AgxBACEQDIYBCyAAQYEEOwEoIAAoAgQhECAAQgA3AwAgACAQIAxBAWoiDBCrgICAACIQRQ04IABB0wE2AhwgACAMNgIUIAAgEDYCDEEAIRAMhQELIABBADYCAAtBACEQIABBADYCHCAAIAQ2AhQgAEHYm4CAADYCECAAQQg2AgwMgwELIAAoAgQhECAAQgA3AwAgACAQIAtBAWoiCxCrgICAACIQDQFBxgEhEAxpCyAAQQI6ACgMVQsgAEHVATYCHCAAIAs2AhQgACAQNgIMQQAhEAyAAQsgEEEVRg03IABBADYCHCAAIAQ2AhQgAEGkjICAADYCECAAQRA2AgxBACEQDH8LIAAtADRBAUcNNCAAIAQgAhC8gICAACIQRQ00IBBBFUcNNSAAQdwBNgIcIAAgBDYCFCAAQdWWgIAANgIQIABBFTYCDEEAIRAMfgtBACEQIABBADYCHCAAQa+LgIAANgIQIABBAjYCDCAAIBRBAWo2AhQMfQtBACEQDGMLQQIhEAxiC0ENIRAMYQtBDyEQDGALQSUhEAxfC0ETIRAMXgtBFSEQDF0LQRYhEAxcC0EXIRAMWwtBGCEQDFoLQRkhEAxZC0EaIRAMWAtBGyEQDFcLQRwhEAxWC0EdIRAMVQtBHyEQDFQLQSEhEAxTC0EjIRAMUgtBxgAhEAxRC0EuIRAMUAtBLyEQDE8LQTshEAxOC0E9IRAMTQtByAAhEAxMC0HJACEQDEsLQcsAIRAMSgtBzAAhEAxJC0HOACEQDEgLQdEAIRAMRwtB1QAhEAxGC0HYACEQDEULQdkAIRAMRAtB2wAhEAxDC0HkACEQDEILQeUAIRAMQQtB8QAhEAxAC0H0ACEQDD8LQY0BIRAMPgtBlwEhEAw9C0GpASEQDDwLQawBIRAMOwtBwAEhEAw6C0G5ASEQDDkLQa8BIRAMOAtBsQEhEAw3C0GyASEQDDYLQbQBIRAMNQtBtQEhEAw0C0G6ASEQDDMLQb0BIRAMMgtBvwEhEAwxC0HBASEQDDALIABBADYCHCAAIAQ2AhQgAEHpi4CAADYCECAAQR82AgxBACEQDEgLIABB2wE2AhwgACAENgIUIABB+paAgAA2AhAgAEEVNgIMQQAhEAxHCyAAQfgANgIcIAAgDDYCFCAAQcqYgIAANgIQIABBFTYCDEEAIRAMRgsgAEHRADYCHCAAIAU2AhQgAEGwl4CAADYCECAAQRU2AgxBACEQDEULIABB+QA2AhwgACABNgIUIAAgEDYCDEEAIRAMRAsgAEH4ADYCHCAAIAE2AhQgAEHKmICAADYCECAAQRU2AgxBACEQDEMLIABB5AA2AhwgACABNgIUIABB45eAgAA2AhAgAEEVNgIMQQAhEAxCCyAAQdcANgIcIAAgATYCFCAAQcmXgIAANgIQIABBFTYCDEEAIRAMQQsgAEEANgIcIAAgATYCFCAAQbmNgIAANgIQIABBGjYCDEEAIRAMQAsgAEHCADYCHCAAIAE2AhQgAEHjmICAADYCECAAQRU2AgxBACEQDD8LIABBADYCBCAAIA8gDxCxgICAACIERQ0BIABBOjYCHCAAIAQ2AgwgACAPQQFqNgIUQQAhEAw+CyAAKAIEIQQgAEEANgIEAkAgACAEIAEQsYCAgAAiBEUNACAAQTs2AhwgACAENgIMIAAgAUEBajYCFEEAIRAMPgsgAUEBaiEBDC0LIA9BAWohAQwtCyAAQQA2AhwgACAPNgIUIABB5JKAgAA2AhAgAEEENgIMQQAhEAw7CyAAQTY2AhwgACAENgIUIAAgAjYCDEEAIRAMOgsgAEEuNgIcIAAgDjYCFCAAIAQ2AgxBACEQDDkLIABB0AA2AhwgACABNgIUIABBkZiAgAA2AhAgAEEVNgIMQQAhEAw4CyANQQFqIQEMLAsgAEEVNgIcIAAgATYCFCAAQYKZgIAANgIQIABBFTYCDEEAIRAMNgsgAEEbNgIcIAAgATYCFCAAQZGXgIAANgIQIABBFTYCDEEAIRAMNQsgAEEPNgIcIAAgATYCFCAAQZGXgIAANgIQIABBFTYCDEEAIRAMNAsgAEELNgIcIAAgATYCFCAAQZGXgIAANgIQIABBFTYCDEEAIRAMMwsgAEEaNgIcIAAgATYCFCAAQYKZgIAANgIQIABBFTYCDEEAIRAMMgsgAEELNgIcIAAgATYCFCAAQYKZgIAANgIQIABBFTYCDEEAIRAMMQsgAEEKNgIcIAAgATYCFCAAQeSWgIAANgIQIABBFTYCDEEAIRAMMAsgAEEeNgIcIAAgATYCFCAAQfmXgIAANgIQIABBFTYCDEEAIRAMLwsgAEEANgIcIAAgEDYCFCAAQdqNgIAANgIQIABBFDYCDEEAIRAMLgsgAEEENgIcIAAgATYCFCAAQbCYgIAANgIQIABBFTYCDEEAIRAMLQsgAEEANgIAIAtBAWohCwtBuAEhEAwSCyAAQQA2AgAgEEEBaiEBQfUAIRAMEQsgASEBAkAgAC0AKUEFRw0AQeMAIRAMEQtB4gAhEAwQC0EAIRAgAEEANgIcIABB5JGAgAA2AhAgAEEHNgIMIAAgFEEBajYCFAwoCyAAQQA2AgAgF0EBaiEBQcAAIRAMDgtBASEBCyAAIAE6ACwgAEEANgIAIBdBAWohAQtBKCEQDAsLIAEhAQtBOCEQDAkLAkAgASIPIAJGDQADQAJAIA8tAABBgL6AgABqLQAAIgFBAUYNACABQQJHDQMgD0EBaiEBDAQLIA9BAWoiDyACRw0AC0E+IRAMIgtBPiEQDCELIABBADoALCAPIQEMAQtBCyEQDAYLQTohEAwFCyABQQFqIQFBLSEQDAQLIAAgAToALCAAQQA2AgAgFkEBaiEBQQwhEAwDCyAAQQA2AgAgF0EBaiEBQQohEAwCCyAAQQA2AgALIABBADoALCANIQFBCSEQDAALC0EAIRAgAEEANgIcIAAgCzYCFCAAQc2QgIAANgIQIABBCTYCDAwXC0EAIRAgAEEANgIcIAAgCjYCFCAAQemKgIAANgIQIABBCTYCDAwWC0EAIRAgAEEANgIcIAAgCTYCFCAAQbeQgIAANgIQIABBCTYCDAwVC0EAIRAgAEEANgIcIAAgCDYCFCAAQZyRgIAANgIQIABBCTYCDAwUC0EAIRAgAEEANgIcIAAgATYCFCAAQc2QgIAANgIQIABBCTYCDAwTC0EAIRAgAEEANgIcIAAgATYCFCAAQemKgIAANgIQIABBCTYCDAwSC0EAIRAgAEEANgIcIAAgATYCFCAAQbeQgIAANgIQIABBCTYCDAwRC0EAIRAgAEEANgIcIAAgATYCFCAAQZyRgIAANgIQIABBCTYCDAwQC0EAIRAgAEEANgIcIAAgATYCFCAAQZeVgIAANgIQIABBDzYCDAwPC0EAIRAgAEEANgIcIAAgATYCFCAAQZeVgIAANgIQIABBDzYCDAwOC0EAIRAgAEEANgIcIAAgATYCFCAAQcCSgIAANgIQIABBCzYCDAwNC0EAIRAgAEEANgIcIAAgATYCFCAAQZWJgIAANgIQIABBCzYCDAwMC0EAIRAgAEEANgIcIAAgATYCFCAAQeGPgIAANgIQIABBCjYCDAwLC0EAIRAgAEEANgIcIAAgATYCFCAAQfuPgIAANgIQIABBCjYCDAwKC0EAIRAgAEEANgIcIAAgATYCFCAAQfGZgIAANgIQIABBAjYCDAwJC0EAIRAgAEEANgIcIAAgATYCFCAAQcSUgIAANgIQIABBAjYCDAwIC0EAIRAgAEEANgIcIAAgATYCFCAAQfKVgIAANgIQIABBAjYCDAwHCyAAQQI2AhwgACABNgIUIABBnJqAgAA2AhAgAEEWNgIMQQAhEAwGC0EBIRAMBQtB1AAhECABIgQgAkYNBCADQQhqIAAgBCACQdjCgIAAQQoQxYCAgAAgAygCDCEEIAMoAggOAwEEAgALEMqAgIAAAAsgAEEANgIcIABBtZqAgAA2AhAgAEEXNgIMIAAgBEEBajYCFEEAIRAMAgsgAEEANgIcIAAgBDYCFCAAQcqagIAANgIQIABBCTYCDEEAIRAMAQsCQCABIgQgAkcNAEEiIRAMAQsgAEGJgICAADYCCCAAIAQ2AgRBISEQCyADQRBqJICAgIAAIBALrwEBAn8gASgCACEGAkACQCACIANGDQAgBCAGaiEEIAYgA2ogAmshByACIAZBf3MgBWoiBmohBQNAAkAgAi0AACAELQAARg0AQQIhBAwDCwJAIAYNAEEAIQQgBSECDAMLIAZBf2ohBiAEQQFqIQQgAkEBaiICIANHDQALIAchBiADIQILIABBATYCACABIAY2AgAgACACNgIEDwsgAUEANgIAIAAgBDYCACAAIAI2AgQLCgAgABDHgICAAAvyNgELfyOAgICAAEEQayIBJICAgIAAAkBBACgCoNCAgAANAEEAEMuAgIAAQYDUhIAAayICQdkASQ0AQQAhAwJAQQAoAuDTgIAAIgQNAEEAQn83AuzTgIAAQQBCgICEgICAwAA3AuTTgIAAQQAgAUEIakFwcUHYqtWqBXMiBDYC4NOAgABBAEEANgL004CAAEEAQQA2AsTTgIAAC0EAIAI2AszTgIAAQQBBgNSEgAA2AsjTgIAAQQBBgNSEgAA2ApjQgIAAQQAgBDYCrNCAgABBAEF/NgKo0ICAAANAIANBxNCAgABqIANBuNCAgABqIgQ2AgAgBCADQbDQgIAAaiIFNgIAIANBvNCAgABqIAU2AgAgA0HM0ICAAGogA0HA0ICAAGoiBTYCACAFIAQ2AgAgA0HU0ICAAGogA0HI0ICAAGoiBDYCACAEIAU2AgAgA0HQ0ICAAGogBDYCACADQSBqIgNBgAJHDQALQYDUhIAAQXhBgNSEgABrQQ9xQQBBgNSEgABBCGpBD3EbIgNqIgRBBGogAkFIaiIFIANrIgNBAXI2AgBBAEEAKALw04CAADYCpNCAgABBACADNgKU0ICAAEEAIAQ2AqDQgIAAQYDUhIAAIAVqQTg2AgQLAkACQAJAAkACQAJAAkACQAJAAkACQAJAIABB7AFLDQACQEEAKAKI0ICAACIGQRAgAEETakFwcSAAQQtJGyICQQN2IgR2IgNBA3FFDQACQAJAIANBAXEgBHJBAXMiBUEDdCIEQbDQgIAAaiIDIARBuNCAgABqKAIAIgQoAggiAkcNAEEAIAZBfiAFd3E2AojQgIAADAELIAMgAjYCCCACIAM2AgwLIARBCGohAyAEIAVBA3QiBUEDcjYCBCAEIAVqIgQgBCgCBEEBcjYCBAwMCyACQQAoApDQgIAAIgdNDQECQCADRQ0AAkACQCADIAR0QQIgBHQiA0EAIANrcnEiA0EAIANrcUF/aiIDIANBDHZBEHEiA3YiBEEFdkEIcSIFIANyIAQgBXYiA0ECdkEEcSIEciADIAR2IgNBAXZBAnEiBHIgAyAEdiIDQQF2QQFxIgRyIAMgBHZqIgRBA3QiA0Gw0ICAAGoiBSADQbjQgIAAaigCACIDKAIIIgBHDQBBACAGQX4gBHdxIgY2AojQgIAADAELIAUgADYCCCAAIAU2AgwLIAMgAkEDcjYCBCADIARBA3QiBGogBCACayIFNgIAIAMgAmoiACAFQQFyNgIEAkAgB0UNACAHQXhxQbDQgIAAaiECQQAoApzQgIAAIQQCQAJAIAZBASAHQQN2dCIIcQ0AQQAgBiAIcjYCiNCAgAAgAiEIDAELIAIoAgghCAsgCCAENgIMIAIgBDYCCCAEIAI2AgwgBCAINgIICyADQQhqIQNBACAANgKc0ICAAEEAIAU2ApDQgIAADAwLQQAoAozQgIAAIglFDQEgCUEAIAlrcUF/aiIDIANBDHZBEHEiA3YiBEEFdkEIcSIFIANyIAQgBXYiA0ECdkEEcSIEciADIAR2IgNBAXZBAnEiBHIgAyAEdiIDQQF2QQFxIgRyIAMgBHZqQQJ0QbjSgIAAaigCACIAKAIEQXhxIAJrIQQgACEFAkADQAJAIAUoAhAiAw0AIAVBFGooAgAiA0UNAgsgAygCBEF4cSACayIFIAQgBSAESSIFGyEEIAMgACAFGyEAIAMhBQwACwsgACgCGCEKAkAgACgCDCIIIABGDQAgACgCCCIDQQAoApjQgIAASRogCCADNgIIIAMgCDYCDAwLCwJAIABBFGoiBSgCACIDDQAgACgCECIDRQ0DIABBEGohBQsDQCAFIQsgAyIIQRRqIgUoAgAiAw0AIAhBEGohBSAIKAIQIgMNAAsgC0EANgIADAoLQX8hAiAAQb9/Sw0AIABBE2oiA0FwcSECQQAoAozQgIAAIgdFDQBBACELAkAgAkGAAkkNAEEfIQsgAkH///8HSw0AIANBCHYiAyADQYD+P2pBEHZBCHEiA3QiBCAEQYDgH2pBEHZBBHEiBHQiBSAFQYCAD2pBEHZBAnEiBXRBD3YgAyAEciAFcmsiA0EBdCACIANBFWp2QQFxckEcaiELC0EAIAJrIQQCQAJAAkACQCALQQJ0QbjSgIAAaigCACIFDQBBACEDQQAhCAwBC0EAIQMgAkEAQRkgC0EBdmsgC0EfRht0IQBBACEIA0ACQCAFKAIEQXhxIAJrIgYgBE8NACAGIQQgBSEIIAYNAEEAIQQgBSEIIAUhAwwDCyADIAVBFGooAgAiBiAGIAUgAEEddkEEcWpBEGooAgAiBUYbIAMgBhshAyAAQQF0IQAgBQ0ACwsCQCADIAhyDQBBACEIQQIgC3QiA0EAIANrciAHcSIDRQ0DIANBACADa3FBf2oiAyADQQx2QRBxIgN2IgVBBXZBCHEiACADciAFIAB2IgNBAnZBBHEiBXIgAyAFdiIDQQF2QQJxIgVyIAMgBXYiA0EBdkEBcSIFciADIAV2akECdEG40oCAAGooAgAhAwsgA0UNAQsDQCADKAIEQXhxIAJrIgYgBEkhAAJAIAMoAhAiBQ0AIANBFGooAgAhBQsgBiAEIAAbIQQgAyAIIAAbIQggBSEDIAUNAAsLIAhFDQAgBEEAKAKQ0ICAACACa08NACAIKAIYIQsCQCAIKAIMIgAgCEYNACAIKAIIIgNBACgCmNCAgABJGiAAIAM2AgggAyAANgIMDAkLAkAgCEEUaiIFKAIAIgMNACAIKAIQIgNFDQMgCEEQaiEFCwNAIAUhBiADIgBBFGoiBSgCACIDDQAgAEEQaiEFIAAoAhAiAw0ACyAGQQA2AgAMCAsCQEEAKAKQ0ICAACIDIAJJDQBBACgCnNCAgAAhBAJAAkAgAyACayIFQRBJDQAgBCACaiIAIAVBAXI2AgRBACAFNgKQ0ICAAEEAIAA2ApzQgIAAIAQgA2ogBTYCACAEIAJBA3I2AgQMAQsgBCADQQNyNgIEIAQgA2oiAyADKAIEQQFyNgIEQQBBADYCnNCAgABBAEEANgKQ0ICAAAsgBEEIaiEDDAoLAkBBACgClNCAgAAiACACTQ0AQQAoAqDQgIAAIgMgAmoiBCAAIAJrIgVBAXI2AgRBACAFNgKU0ICAAEEAIAQ2AqDQgIAAIAMgAkEDcjYCBCADQQhqIQMMCgsCQAJAQQAoAuDTgIAARQ0AQQAoAujTgIAAIQQMAQtBAEJ/NwLs04CAAEEAQoCAhICAgMAANwLk04CAAEEAIAFBDGpBcHFB2KrVqgVzNgLg04CAAEEAQQA2AvTTgIAAQQBBADYCxNOAgABBgIAEIQQLQQAhAwJAIAQgAkHHAGoiB2oiBkEAIARrIgtxIgggAksNAEEAQTA2AvjTgIAADAoLAkBBACgCwNOAgAAiA0UNAAJAQQAoArjTgIAAIgQgCGoiBSAETQ0AIAUgA00NAQtBACEDQQBBMDYC+NOAgAAMCgtBAC0AxNOAgABBBHENBAJAAkACQEEAKAKg0ICAACIERQ0AQcjTgIAAIQMDQAJAIAMoAgAiBSAESw0AIAUgAygCBGogBEsNAwsgAygCCCIDDQALC0EAEMuAgIAAIgBBf0YNBSAIIQYCQEEAKALk04CAACIDQX9qIgQgAHFFDQAgCCAAayAEIABqQQAgA2txaiEGCyAGIAJNDQUgBkH+////B0sNBQJAQQAoAsDTgIAAIgNFDQBBACgCuNOAgAAiBCAGaiIFIARNDQYgBSADSw0GCyAGEMuAgIAAIgMgAEcNAQwHCyAGIABrIAtxIgZB/v///wdLDQQgBhDLgICAACIAIAMoAgAgAygCBGpGDQMgACEDCwJAIANBf0YNACACQcgAaiAGTQ0AAkAgByAGa0EAKALo04CAACIEakEAIARrcSIEQf7///8HTQ0AIAMhAAwHCwJAIAQQy4CAgABBf0YNACAEIAZqIQYgAyEADAcLQQAgBmsQy4CAgAAaDAQLIAMhACADQX9HDQUMAwtBACEIDAcLQQAhAAwFCyAAQX9HDQILQQBBACgCxNOAgABBBHI2AsTTgIAACyAIQf7///8HSw0BIAgQy4CAgAAhAEEAEMuAgIAAIQMgAEF/Rg0BIANBf0YNASAAIANPDQEgAyAAayIGIAJBOGpNDQELQQBBACgCuNOAgAAgBmoiAzYCuNOAgAACQCADQQAoArzTgIAATQ0AQQAgAzYCvNOAgAALAkACQAJAAkBBACgCoNCAgAAiBEUNAEHI04CAACEDA0AgACADKAIAIgUgAygCBCIIakYNAiADKAIIIgMNAAwDCwsCQAJAQQAoApjQgIAAIgNFDQAgACADTw0BC0EAIAA2ApjQgIAAC0EAIQNBACAGNgLM04CAAEEAIAA2AsjTgIAAQQBBfzYCqNCAgABBAEEAKALg04CAADYCrNCAgABBAEEANgLU04CAAANAIANBxNCAgABqIANBuNCAgABqIgQ2AgAgBCADQbDQgIAAaiIFNgIAIANBvNCAgABqIAU2AgAgA0HM0ICAAGogA0HA0ICAAGoiBTYCACAFIAQ2AgAgA0HU0ICAAGogA0HI0ICAAGoiBDYCACAEIAU2AgAgA0HQ0ICAAGogBDYCACADQSBqIgNBgAJHDQALIABBeCAAa0EPcUEAIABBCGpBD3EbIgNqIgQgBkFIaiIFIANrIgNBAXI2AgRBAEEAKALw04CAADYCpNCAgABBACADNgKU0ICAAEEAIAQ2AqDQgIAAIAAgBWpBODYCBAwCCyADLQAMQQhxDQAgBCAFSQ0AIAQgAE8NACAEQXggBGtBD3FBACAEQQhqQQ9xGyIFaiIAQQAoApTQgIAAIAZqIgsgBWsiBUEBcjYCBCADIAggBmo2AgRBAEEAKALw04CAADYCpNCAgABBACAFNgKU0ICAAEEAIAA2AqDQgIAAIAQgC2pBODYCBAwBCwJAIABBACgCmNCAgAAiCE8NAEEAIAA2ApjQgIAAIAAhCAsgACAGaiEFQcjTgIAAIQMCQAJAAkACQAJAAkACQANAIAMoAgAgBUYNASADKAIIIgMNAAwCCwsgAy0ADEEIcUUNAQtByNOAgAAhAwNAAkAgAygCACIFIARLDQAgBSADKAIEaiIFIARLDQMLIAMoAgghAwwACwsgAyAANgIAIAMgAygCBCAGajYCBCAAQXggAGtBD3FBACAAQQhqQQ9xG2oiCyACQQNyNgIEIAVBeCAFa0EPcUEAIAVBCGpBD3EbaiIGIAsgAmoiAmshAwJAIAYgBEcNAEEAIAI2AqDQgIAAQQBBACgClNCAgAAgA2oiAzYClNCAgAAgAiADQQFyNgIEDAMLAkAgBkEAKAKc0ICAAEcNAEEAIAI2ApzQgIAAQQBBACgCkNCAgAAgA2oiAzYCkNCAgAAgAiADQQFyNgIEIAIgA2ogAzYCAAwDCwJAIAYoAgQiBEEDcUEBRw0AIARBeHEhBwJAAkAgBEH/AUsNACAGKAIIIgUgBEEDdiIIQQN0QbDQgIAAaiIARhoCQCAGKAIMIgQgBUcNAEEAQQAoAojQgIAAQX4gCHdxNgKI0ICAAAwCCyAEIABGGiAEIAU2AgggBSAENgIMDAELIAYoAhghCQJAAkAgBigCDCIAIAZGDQAgBigCCCIEIAhJGiAAIAQ2AgggBCAANgIMDAELAkAgBkEUaiIEKAIAIgUNACAGQRBqIgQoAgAiBQ0AQQAhAAwBCwNAIAQhCCAFIgBBFGoiBCgCACIFDQAgAEEQaiEEIAAoAhAiBQ0ACyAIQQA2AgALIAlFDQACQAJAIAYgBigCHCIFQQJ0QbjSgIAAaiIEKAIARw0AIAQgADYCACAADQFBAEEAKAKM0ICAAEF+IAV3cTYCjNCAgAAMAgsgCUEQQRQgCSgCECAGRhtqIAA2AgAgAEUNAQsgACAJNgIYAkAgBigCECIERQ0AIAAgBDYCECAEIAA2AhgLIAYoAhQiBEUNACAAQRRqIAQ2AgAgBCAANgIYCyAHIANqIQMgBiAHaiIGKAIEIQQLIAYgBEF+cTYCBCACIANqIAM2AgAgAiADQQFyNgIEAkAgA0H/AUsNACADQXhxQbDQgIAAaiEEAkACQEEAKAKI0ICAACIFQQEgA0EDdnQiA3ENAEEAIAUgA3I2AojQgIAAIAQhAwwBCyAEKAIIIQMLIAMgAjYCDCAEIAI2AgggAiAENgIMIAIgAzYCCAwDC0EfIQQCQCADQf///wdLDQAgA0EIdiIEIARBgP4/akEQdkEIcSIEdCIFIAVBgOAfakEQdkEEcSIFdCIAIABBgIAPakEQdkECcSIAdEEPdiAEIAVyIAByayIEQQF0IAMgBEEVanZBAXFyQRxqIQQLIAIgBDYCHCACQgA3AhAgBEECdEG40oCAAGohBQJAQQAoAozQgIAAIgBBASAEdCIIcQ0AIAUgAjYCAEEAIAAgCHI2AozQgIAAIAIgBTYCGCACIAI2AgggAiACNgIMDAMLIANBAEEZIARBAXZrIARBH0YbdCEEIAUoAgAhAANAIAAiBSgCBEF4cSADRg0CIARBHXYhACAEQQF0IQQgBSAAQQRxakEQaiIIKAIAIgANAAsgCCACNgIAIAIgBTYCGCACIAI2AgwgAiACNgIIDAILIABBeCAAa0EPcUEAIABBCGpBD3EbIgNqIgsgBkFIaiIIIANrIgNBAXI2AgQgACAIakE4NgIEIAQgBUE3IAVrQQ9xQQAgBUFJakEPcRtqQUFqIgggCCAEQRBqSRsiCEEjNgIEQQBBACgC8NOAgAA2AqTQgIAAQQAgAzYClNCAgABBACALNgKg0ICAACAIQRBqQQApAtDTgIAANwIAIAhBACkCyNOAgAA3AghBACAIQQhqNgLQ04CAAEEAIAY2AszTgIAAQQAgADYCyNOAgABBAEEANgLU04CAACAIQSRqIQMDQCADQQc2AgAgA0EEaiIDIAVJDQALIAggBEYNAyAIIAgoAgRBfnE2AgQgCCAIIARrIgA2AgAgBCAAQQFyNgIEAkAgAEH/AUsNACAAQXhxQbDQgIAAaiEDAkACQEEAKAKI0ICAACIFQQEgAEEDdnQiAHENAEEAIAUgAHI2AojQgIAAIAMhBQwBCyADKAIIIQULIAUgBDYCDCADIAQ2AgggBCADNgIMIAQgBTYCCAwEC0EfIQMCQCAAQf///wdLDQAgAEEIdiIDIANBgP4/akEQdkEIcSIDdCIFIAVBgOAfakEQdkEEcSIFdCIIIAhBgIAPakEQdkECcSIIdEEPdiADIAVyIAhyayIDQQF0IAAgA0EVanZBAXFyQRxqIQMLIAQgAzYCHCAEQgA3AhAgA0ECdEG40oCAAGohBQJAQQAoAozQgIAAIghBASADdCIGcQ0AIAUgBDYCAEEAIAggBnI2AozQgIAAIAQgBTYCGCAEIAQ2AgggBCAENgIMDAQLIABBAEEZIANBAXZrIANBH0YbdCEDIAUoAgAhCANAIAgiBSgCBEF4cSAARg0DIANBHXYhCCADQQF0IQMgBSAIQQRxakEQaiIGKAIAIggNAAsgBiAENgIAIAQgBTYCGCAEIAQ2AgwgBCAENgIIDAMLIAUoAggiAyACNgIMIAUgAjYCCCACQQA2AhggAiAFNgIMIAIgAzYCCAsgC0EIaiEDDAULIAUoAggiAyAENgIMIAUgBDYCCCAEQQA2AhggBCAFNgIMIAQgAzYCCAtBACgClNCAgAAiAyACTQ0AQQAoAqDQgIAAIgQgAmoiBSADIAJrIgNBAXI2AgRBACADNgKU0ICAAEEAIAU2AqDQgIAAIAQgAkEDcjYCBCAEQQhqIQMMAwtBACEDQQBBMDYC+NOAgAAMAgsCQCALRQ0AAkACQCAIIAgoAhwiBUECdEG40oCAAGoiAygCAEcNACADIAA2AgAgAA0BQQAgB0F+IAV3cSIHNgKM0ICAAAwCCyALQRBBFCALKAIQIAhGG2ogADYCACAARQ0BCyAAIAs2AhgCQCAIKAIQIgNFDQAgACADNgIQIAMgADYCGAsgCEEUaigCACIDRQ0AIABBFGogAzYCACADIAA2AhgLAkACQCAEQQ9LDQAgCCAEIAJqIgNBA3I2AgQgCCADaiIDIAMoAgRBAXI2AgQMAQsgCCACaiIAIARBAXI2AgQgCCACQQNyNgIEIAAgBGogBDYCAAJAIARB/wFLDQAgBEF4cUGw0ICAAGohAwJAAkBBACgCiNCAgAAiBUEBIARBA3Z0IgRxDQBBACAFIARyNgKI0ICAACADIQQMAQsgAygCCCEECyAEIAA2AgwgAyAANgIIIAAgAzYCDCAAIAQ2AggMAQtBHyEDAkAgBEH///8HSw0AIARBCHYiAyADQYD+P2pBEHZBCHEiA3QiBSAFQYDgH2pBEHZBBHEiBXQiAiACQYCAD2pBEHZBAnEiAnRBD3YgAyAFciACcmsiA0EBdCAEIANBFWp2QQFxckEcaiEDCyAAIAM2AhwgAEIANwIQIANBAnRBuNKAgABqIQUCQCAHQQEgA3QiAnENACAFIAA2AgBBACAHIAJyNgKM0ICAACAAIAU2AhggACAANgIIIAAgADYCDAwBCyAEQQBBGSADQQF2ayADQR9GG3QhAyAFKAIAIQICQANAIAIiBSgCBEF4cSAERg0BIANBHXYhAiADQQF0IQMgBSACQQRxakEQaiIGKAIAIgINAAsgBiAANgIAIAAgBTYCGCAAIAA2AgwgACAANgIIDAELIAUoAggiAyAANgIMIAUgADYCCCAAQQA2AhggACAFNgIMIAAgAzYCCAsgCEEIaiEDDAELAkAgCkUNAAJAAkAgACAAKAIcIgVBAnRBuNKAgABqIgMoAgBHDQAgAyAINgIAIAgNAUEAIAlBfiAFd3E2AozQgIAADAILIApBEEEUIAooAhAgAEYbaiAINgIAIAhFDQELIAggCjYCGAJAIAAoAhAiA0UNACAIIAM2AhAgAyAINgIYCyAAQRRqKAIAIgNFDQAgCEEUaiADNgIAIAMgCDYCGAsCQAJAIARBD0sNACAAIAQgAmoiA0EDcjYCBCAAIANqIgMgAygCBEEBcjYCBAwBCyAAIAJqIgUgBEEBcjYCBCAAIAJBA3I2AgQgBSAEaiAENgIAAkAgB0UNACAHQXhxQbDQgIAAaiECQQAoApzQgIAAIQMCQAJAQQEgB0EDdnQiCCAGcQ0AQQAgCCAGcjYCiNCAgAAgAiEIDAELIAIoAgghCAsgCCADNgIMIAIgAzYCCCADIAI2AgwgAyAINgIIC0EAIAU2ApzQgIAAQQAgBDYCkNCAgAALIABBCGohAwsgAUEQaiSAgICAACADCwoAIAAQyYCAgAAL4g0BB38CQCAARQ0AIABBeGoiASAAQXxqKAIAIgJBeHEiAGohAwJAIAJBAXENACACQQNxRQ0BIAEgASgCACICayIBQQAoApjQgIAAIgRJDQEgAiAAaiEAAkAgAUEAKAKc0ICAAEYNAAJAIAJB/wFLDQAgASgCCCIEIAJBA3YiBUEDdEGw0ICAAGoiBkYaAkAgASgCDCICIARHDQBBAEEAKAKI0ICAAEF+IAV3cTYCiNCAgAAMAwsgAiAGRhogAiAENgIIIAQgAjYCDAwCCyABKAIYIQcCQAJAIAEoAgwiBiABRg0AIAEoAggiAiAESRogBiACNgIIIAIgBjYCDAwBCwJAIAFBFGoiAigCACIEDQAgAUEQaiICKAIAIgQNAEEAIQYMAQsDQCACIQUgBCIGQRRqIgIoAgAiBA0AIAZBEGohAiAGKAIQIgQNAAsgBUEANgIACyAHRQ0BAkACQCABIAEoAhwiBEECdEG40oCAAGoiAigCAEcNACACIAY2AgAgBg0BQQBBACgCjNCAgABBfiAEd3E2AozQgIAADAMLIAdBEEEUIAcoAhAgAUYbaiAGNgIAIAZFDQILIAYgBzYCGAJAIAEoAhAiAkUNACAGIAI2AhAgAiAGNgIYCyABKAIUIgJFDQEgBkEUaiACNgIAIAIgBjYCGAwBCyADKAIEIgJBA3FBA0cNACADIAJBfnE2AgRBACAANgKQ0ICAACABIABqIAA2AgAgASAAQQFyNgIEDwsgASADTw0AIAMoAgQiAkEBcUUNAAJAAkAgAkECcQ0AAkAgA0EAKAKg0ICAAEcNAEEAIAE2AqDQgIAAQQBBACgClNCAgAAgAGoiADYClNCAgAAgASAAQQFyNgIEIAFBACgCnNCAgABHDQNBAEEANgKQ0ICAAEEAQQA2ApzQgIAADwsCQCADQQAoApzQgIAARw0AQQAgATYCnNCAgABBAEEAKAKQ0ICAACAAaiIANgKQ0ICAACABIABBAXI2AgQgASAAaiAANgIADwsgAkF4cSAAaiEAAkACQCACQf8BSw0AIAMoAggiBCACQQN2IgVBA3RBsNCAgABqIgZGGgJAIAMoAgwiAiAERw0AQQBBACgCiNCAgABBfiAFd3E2AojQgIAADAILIAIgBkYaIAIgBDYCCCAEIAI2AgwMAQsgAygCGCEHAkACQCADKAIMIgYgA0YNACADKAIIIgJBACgCmNCAgABJGiAGIAI2AgggAiAGNgIMDAELAkAgA0EUaiICKAIAIgQNACADQRBqIgIoAgAiBA0AQQAhBgwBCwNAIAIhBSAEIgZBFGoiAigCACIEDQAgBkEQaiECIAYoAhAiBA0ACyAFQQA2AgALIAdFDQACQAJAIAMgAygCHCIEQQJ0QbjSgIAAaiICKAIARw0AIAIgBjYCACAGDQFBAEEAKAKM0ICAAEF+IAR3cTYCjNCAgAAMAgsgB0EQQRQgBygCECADRhtqIAY2AgAgBkUNAQsgBiAHNgIYAkAgAygCECICRQ0AIAYgAjYCECACIAY2AhgLIAMoAhQiAkUNACAGQRRqIAI2AgAgAiAGNgIYCyABIABqIAA2AgAgASAAQQFyNgIEIAFBACgCnNCAgABHDQFBACAANgKQ0ICAAA8LIAMgAkF+cTYCBCABIABqIAA2AgAgASAAQQFyNgIECwJAIABB/wFLDQAgAEF4cUGw0ICAAGohAgJAAkBBACgCiNCAgAAiBEEBIABBA3Z0IgBxDQBBACAEIAByNgKI0ICAACACIQAMAQsgAigCCCEACyAAIAE2AgwgAiABNgIIIAEgAjYCDCABIAA2AggPC0EfIQICQCAAQf///wdLDQAgAEEIdiICIAJBgP4/akEQdkEIcSICdCIEIARBgOAfakEQdkEEcSIEdCIGIAZBgIAPakEQdkECcSIGdEEPdiACIARyIAZyayICQQF0IAAgAkEVanZBAXFyQRxqIQILIAEgAjYCHCABQgA3AhAgAkECdEG40oCAAGohBAJAAkBBACgCjNCAgAAiBkEBIAJ0IgNxDQAgBCABNgIAQQAgBiADcjYCjNCAgAAgASAENgIYIAEgATYCCCABIAE2AgwMAQsgAEEAQRkgAkEBdmsgAkEfRht0IQIgBCgCACEGAkADQCAGIgQoAgRBeHEgAEYNASACQR12IQYgAkEBdCECIAQgBkEEcWpBEGoiAygCACIGDQALIAMgATYCACABIAQ2AhggASABNgIMIAEgATYCCAwBCyAEKAIIIgAgATYCDCAEIAE2AgggAUEANgIYIAEgBDYCDCABIAA2AggLQQBBACgCqNCAgABBf2oiAUF/IAEbNgKo0ICAAAsLBAAAAAtOAAJAIAANAD8AQRB0DwsCQCAAQf//A3ENACAAQX9MDQACQCAAQRB2QAAiAEF/Rw0AQQBBMDYC+NOAgABBfw8LIABBEHQPCxDKgICAAAAL8gICA38BfgJAIAJFDQAgACABOgAAIAIgAGoiA0F/aiABOgAAIAJBA0kNACAAIAE6AAIgACABOgABIANBfWogAToAACADQX5qIAE6AAAgAkEHSQ0AIAAgAToAAyADQXxqIAE6AAAgAkEJSQ0AIABBACAAa0EDcSIEaiIDIAFB/wFxQYGChAhsIgE2AgAgAyACIARrQXxxIgRqIgJBfGogATYCACAEQQlJDQAgAyABNgIIIAMgATYCBCACQXhqIAE2AgAgAkF0aiABNgIAIARBGUkNACADIAE2AhggAyABNgIUIAMgATYCECADIAE2AgwgAkFwaiABNgIAIAJBbGogATYCACACQWhqIAE2AgAgAkFkaiABNgIAIAQgA0EEcUEYciIFayICQSBJDQAgAa1CgYCAgBB+IQYgAyAFaiEBA0AgASAGNwMYIAEgBjcDECABIAY3AwggASAGNwMAIAFBIGohASACQWBqIgJBH0sNAAsLIAALC45IAQBBgAgLhkgBAAAAAgAAAAMAAAAAAAAAAAAAAAQAAAAFAAAAAAAAAAAAAAAGAAAABwAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEludmFsaWQgY2hhciBpbiB1cmwgcXVlcnkAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9ib2R5AENvbnRlbnQtTGVuZ3RoIG92ZXJmbG93AENodW5rIHNpemUgb3ZlcmZsb3cAUmVzcG9uc2Ugb3ZlcmZsb3cASW52YWxpZCBtZXRob2QgZm9yIEhUVFAveC54IHJlcXVlc3QASW52YWxpZCBtZXRob2QgZm9yIFJUU1AveC54IHJlcXVlc3QARXhwZWN0ZWQgU09VUkNFIG1ldGhvZCBmb3IgSUNFL3gueCByZXF1ZXN0AEludmFsaWQgY2hhciBpbiB1cmwgZnJhZ21lbnQgc3RhcnQARXhwZWN0ZWQgZG90AFNwYW4gY2FsbGJhY2sgZXJyb3IgaW4gb25fc3RhdHVzAEludmFsaWQgcmVzcG9uc2Ugc3RhdHVzAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIGV4dGVuc2lvbnMAVXNlciBjYWxsYmFjayBlcnJvcgBgb25fcmVzZXRgIGNhbGxiYWNrIGVycm9yAGBvbl9jaHVua19oZWFkZXJgIGNhbGxiYWNrIGVycm9yAGBvbl9tZXNzYWdlX2JlZ2luYCBjYWxsYmFjayBlcnJvcgBgb25fY2h1bmtfZXh0ZW5zaW9uX3ZhbHVlYCBjYWxsYmFjayBlcnJvcgBgb25fc3RhdHVzX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fdmVyc2lvbl9jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX3VybF9jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX2NodW5rX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25faGVhZGVyX3ZhbHVlX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fbWVzc2FnZV9jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX21ldGhvZF9jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX2hlYWRlcl9maWVsZF9jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX2NodW5rX2V4dGVuc2lvbl9uYW1lYCBjYWxsYmFjayBlcnJvcgBVbmV4cGVjdGVkIGNoYXIgaW4gdXJsIHNlcnZlcgBJbnZhbGlkIGhlYWRlciB2YWx1ZSBjaGFyAEludmFsaWQgaGVhZGVyIGZpZWxkIGNoYXIAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl92ZXJzaW9uAEludmFsaWQgbWlub3IgdmVyc2lvbgBJbnZhbGlkIG1ham9yIHZlcnNpb24ARXhwZWN0ZWQgc3BhY2UgYWZ0ZXIgdmVyc2lvbgBFeHBlY3RlZCBDUkxGIGFmdGVyIHZlcnNpb24ASW52YWxpZCBIVFRQIHZlcnNpb24ASW52YWxpZCBoZWFkZXIgdG9rZW4AU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl91cmwASW52YWxpZCBjaGFyYWN0ZXJzIGluIHVybABVbmV4cGVjdGVkIHN0YXJ0IGNoYXIgaW4gdXJsAERvdWJsZSBAIGluIHVybABFbXB0eSBDb250ZW50LUxlbmd0aABJbnZhbGlkIGNoYXJhY3RlciBpbiBDb250ZW50LUxlbmd0aABEdXBsaWNhdGUgQ29udGVudC1MZW5ndGgASW52YWxpZCBjaGFyIGluIHVybCBwYXRoAENvbnRlbnQtTGVuZ3RoIGNhbid0IGJlIHByZXNlbnQgd2l0aCBUcmFuc2Zlci1FbmNvZGluZwBJbnZhbGlkIGNoYXJhY3RlciBpbiBjaHVuayBzaXplAFNwYW4gY2FsbGJhY2sgZXJyb3IgaW4gb25faGVhZGVyX3ZhbHVlAFNwYW4gY2FsbGJhY2sgZXJyb3IgaW4gb25fY2h1bmtfZXh0ZW5zaW9uX3ZhbHVlAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIGV4dGVuc2lvbnMgdmFsdWUATWlzc2luZyBleHBlY3RlZCBMRiBhZnRlciBoZWFkZXIgdmFsdWUASW52YWxpZCBgVHJhbnNmZXItRW5jb2RpbmdgIGhlYWRlciB2YWx1ZQBJbnZhbGlkIGNoYXJhY3RlciBpbiBjaHVuayBleHRlbnNpb25zIHF1b3RlIHZhbHVlAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIGV4dGVuc2lvbnMgcXVvdGVkIHZhbHVlAFBhdXNlZCBieSBvbl9oZWFkZXJzX2NvbXBsZXRlAEludmFsaWQgRU9GIHN0YXRlAG9uX3Jlc2V0IHBhdXNlAG9uX2NodW5rX2hlYWRlciBwYXVzZQBvbl9tZXNzYWdlX2JlZ2luIHBhdXNlAG9uX2NodW5rX2V4dGVuc2lvbl92YWx1ZSBwYXVzZQBvbl9zdGF0dXNfY29tcGxldGUgcGF1c2UAb25fdmVyc2lvbl9jb21wbGV0ZSBwYXVzZQBvbl91cmxfY29tcGxldGUgcGF1c2UAb25fY2h1bmtfY29tcGxldGUgcGF1c2UAb25faGVhZGVyX3ZhbHVlX2NvbXBsZXRlIHBhdXNlAG9uX21lc3NhZ2VfY29tcGxldGUgcGF1c2UAb25fbWV0aG9kX2NvbXBsZXRlIHBhdXNlAG9uX2hlYWRlcl9maWVsZF9jb21wbGV0ZSBwYXVzZQBvbl9jaHVua19leHRlbnNpb25fbmFtZSBwYXVzZQBVbmV4cGVjdGVkIHNwYWNlIGFmdGVyIHN0YXJ0IGxpbmUAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9jaHVua19leHRlbnNpb25fbmFtZQBJbnZhbGlkIGNoYXJhY3RlciBpbiBjaHVuayBleHRlbnNpb25zIG5hbWUAUGF1c2Ugb24gQ09OTkVDVC9VcGdyYWRlAFBhdXNlIG9uIFBSSS9VcGdyYWRlAEV4cGVjdGVkIEhUVFAvMiBDb25uZWN0aW9uIFByZWZhY2UAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9tZXRob2QARXhwZWN0ZWQgc3BhY2UgYWZ0ZXIgbWV0aG9kAFNwYW4gY2FsbGJhY2sgZXJyb3IgaW4gb25faGVhZGVyX2ZpZWxkAFBhdXNlZABJbnZhbGlkIHdvcmQgZW5jb3VudGVyZWQASW52YWxpZCBtZXRob2QgZW5jb3VudGVyZWQAVW5leHBlY3RlZCBjaGFyIGluIHVybCBzY2hlbWEAUmVxdWVzdCBoYXMgaW52YWxpZCBgVHJhbnNmZXItRW5jb2RpbmdgAFNXSVRDSF9QUk9YWQBVU0VfUFJPWFkATUtBQ1RJVklUWQBVTlBST0NFU1NBQkxFX0VOVElUWQBDT1BZAE1PVkVEX1BFUk1BTkVOVExZAFRPT19FQVJMWQBOT1RJRlkARkFJTEVEX0RFUEVOREVOQ1kAQkFEX0dBVEVXQVkAUExBWQBQVVQAQ0hFQ0tPVVQAR0FURVdBWV9USU1FT1VUAFJFUVVFU1RfVElNRU9VVABORVRXT1JLX0NPTk5FQ1RfVElNRU9VVABDT05ORUNUSU9OX1RJTUVPVVQATE9HSU5fVElNRU9VVABORVRXT1JLX1JFQURfVElNRU9VVABQT1NUAE1JU0RJUkVDVEVEX1JFUVVFU1QAQ0xJRU5UX0NMT1NFRF9SRVFVRVNUAENMSUVOVF9DTE9TRURfTE9BRF9CQUxBTkNFRF9SRVFVRVNUAEJBRF9SRVFVRVNUAEhUVFBfUkVRVUVTVF9TRU5UX1RPX0hUVFBTX1BPUlQAUkVQT1JUAElNX0FfVEVBUE9UAFJFU0VUX0NPTlRFTlQATk9fQ09OVEVOVABQQVJUSUFMX0NPTlRFTlQASFBFX0lOVkFMSURfQ09OU1RBTlQASFBFX0NCX1JFU0VUAEdFVABIUEVfU1RSSUNUAENPTkZMSUNUAFRFTVBPUkFSWV9SRURJUkVDVABQRVJNQU5FTlRfUkVESVJFQ1QAQ09OTkVDVABNVUxUSV9TVEFUVVMASFBFX0lOVkFMSURfU1RBVFVTAFRPT19NQU5ZX1JFUVVFU1RTAEVBUkxZX0hJTlRTAFVOQVZBSUxBQkxFX0ZPUl9MRUdBTF9SRUFTT05TAE9QVElPTlMAU1dJVENISU5HX1BST1RPQ09MUwBWQVJJQU5UX0FMU09fTkVHT1RJQVRFUwBNVUxUSVBMRV9DSE9JQ0VTAElOVEVSTkFMX1NFUlZFUl9FUlJPUgBXRUJfU0VSVkVSX1VOS05PV05fRVJST1IAUkFJTEdVTl9FUlJPUgBJREVOVElUWV9QUk9WSURFUl9BVVRIRU5USUNBVElPTl9FUlJPUgBTU0xfQ0VSVElGSUNBVEVfRVJST1IASU5WQUxJRF9YX0ZPUldBUkRFRF9GT1IAU0VUX1BBUkFNRVRFUgBHRVRfUEFSQU1FVEVSAEhQRV9VU0VSAFNFRV9PVEhFUgBIUEVfQ0JfQ0hVTktfSEVBREVSAE1LQ0FMRU5EQVIAU0VUVVAAV0VCX1NFUlZFUl9JU19ET1dOAFRFQVJET1dOAEhQRV9DTE9TRURfQ09OTkVDVElPTgBIRVVSSVNUSUNfRVhQSVJBVElPTgBESVNDT05ORUNURURfT1BFUkFUSU9OAE5PTl9BVVRIT1JJVEFUSVZFX0lORk9STUFUSU9OAEhQRV9JTlZBTElEX1ZFUlNJT04ASFBFX0NCX01FU1NBR0VfQkVHSU4AU0lURV9JU19GUk9aRU4ASFBFX0lOVkFMSURfSEVBREVSX1RPS0VOAElOVkFMSURfVE9LRU4ARk9SQklEREVOAEVOSEFOQ0VfWU9VUl9DQUxNAEhQRV9JTlZBTElEX1VSTABCTE9DS0VEX0JZX1BBUkVOVEFMX0NPTlRST0wATUtDT0wAQUNMAEhQRV9JTlRFUk5BTABSRVFVRVNUX0hFQURFUl9GSUVMRFNfVE9PX0xBUkdFX1VOT0ZGSUNJQUwASFBFX09LAFVOTElOSwBVTkxPQ0sAUFJJAFJFVFJZX1dJVEgASFBFX0lOVkFMSURfQ09OVEVOVF9MRU5HVEgASFBFX1VORVhQRUNURURfQ09OVEVOVF9MRU5HVEgARkxVU0gAUFJPUFBBVENIAE0tU0VBUkNIAFVSSV9UT09fTE9ORwBQUk9DRVNTSU5HAE1JU0NFTExBTkVPVVNfUEVSU0lTVEVOVF9XQVJOSU5HAE1JU0NFTExBTkVPVVNfV0FSTklORwBIUEVfSU5WQUxJRF9UUkFOU0ZFUl9FTkNPRElORwBFeHBlY3RlZCBDUkxGAEhQRV9JTlZBTElEX0NIVU5LX1NJWkUATU9WRQBDT05USU5VRQBIUEVfQ0JfU1RBVFVTX0NPTVBMRVRFAEhQRV9DQl9IRUFERVJTX0NPTVBMRVRFAEhQRV9DQl9WRVJTSU9OX0NPTVBMRVRFAEhQRV9DQl9VUkxfQ09NUExFVEUASFBFX0NCX0NIVU5LX0NPTVBMRVRFAEhQRV9DQl9IRUFERVJfVkFMVUVfQ09NUExFVEUASFBFX0NCX0NIVU5LX0VYVEVOU0lPTl9WQUxVRV9DT01QTEVURQBIUEVfQ0JfQ0hVTktfRVhURU5TSU9OX05BTUVfQ09NUExFVEUASFBFX0NCX01FU1NBR0VfQ09NUExFVEUASFBFX0NCX01FVEhPRF9DT01QTEVURQBIUEVfQ0JfSEVBREVSX0ZJRUxEX0NPTVBMRVRFAERFTEVURQBIUEVfSU5WQUxJRF9FT0ZfU1RBVEUASU5WQUxJRF9TU0xfQ0VSVElGSUNBVEUAUEFVU0UATk9fUkVTUE9OU0UAVU5TVVBQT1JURURfTUVESUFfVFlQRQBHT05FAE5PVF9BQ0NFUFRBQkxFAFNFUlZJQ0VfVU5BVkFJTEFCTEUAUkFOR0VfTk9UX1NBVElTRklBQkxFAE9SSUdJTl9JU19VTlJFQUNIQUJMRQBSRVNQT05TRV9JU19TVEFMRQBQVVJHRQBNRVJHRQBSRVFVRVNUX0hFQURFUl9GSUVMRFNfVE9PX0xBUkdFAFJFUVVFU1RfSEVBREVSX1RPT19MQVJHRQBQQVlMT0FEX1RPT19MQVJHRQBJTlNVRkZJQ0lFTlRfU1RPUkFHRQBIUEVfUEFVU0VEX1VQR1JBREUASFBFX1BBVVNFRF9IMl9VUEdSQURFAFNPVVJDRQBBTk5PVU5DRQBUUkFDRQBIUEVfVU5FWFBFQ1RFRF9TUEFDRQBERVNDUklCRQBVTlNVQlNDUklCRQBSRUNPUkQASFBFX0lOVkFMSURfTUVUSE9EAE5PVF9GT1VORABQUk9QRklORABVTkJJTkQAUkVCSU5EAFVOQVVUSE9SSVpFRABNRVRIT0RfTk9UX0FMTE9XRUQASFRUUF9WRVJTSU9OX05PVF9TVVBQT1JURUQAQUxSRUFEWV9SRVBPUlRFRABBQ0NFUFRFRABOT1RfSU1QTEVNRU5URUQATE9PUF9ERVRFQ1RFRABIUEVfQ1JfRVhQRUNURUQASFBFX0xGX0VYUEVDVEVEAENSRUFURUQASU1fVVNFRABIUEVfUEFVU0VEAFRJTUVPVVRfT0NDVVJFRABQQVlNRU5UX1JFUVVJUkVEAFBSRUNPTkRJVElPTl9SRVFVSVJFRABQUk9YWV9BVVRIRU5USUNBVElPTl9SRVFVSVJFRABORVRXT1JLX0FVVEhFTlRJQ0FUSU9OX1JFUVVJUkVEAExFTkdUSF9SRVFVSVJFRABTU0xfQ0VSVElGSUNBVEVfUkVRVUlSRUQAVVBHUkFERV9SRVFVSVJFRABQQUdFX0VYUElSRUQAUFJFQ09ORElUSU9OX0ZBSUxFRABFWFBFQ1RBVElPTl9GQUlMRUQAUkVWQUxJREFUSU9OX0ZBSUxFRABTU0xfSEFORFNIQUtFX0ZBSUxFRABMT0NLRUQAVFJBTlNGT1JNQVRJT05fQVBQTElFRABOT1RfTU9ESUZJRUQATk9UX0VYVEVOREVEAEJBTkRXSURUSF9MSU1JVF9FWENFRURFRABTSVRFX0lTX09WRVJMT0FERUQASEVBRABFeHBlY3RlZCBIVFRQLwAAXhMAACYTAAAwEAAA8BcAAJ0TAAAVEgAAORcAAPASAAAKEAAAdRIAAK0SAACCEwAATxQAAH8QAACgFQAAIxQAAIkSAACLFAAATRUAANQRAADPFAAAEBgAAMkWAADcFgAAwREAAOAXAAC7FAAAdBQAAHwVAADlFAAACBcAAB8QAABlFQAAoxQAACgVAAACFQAAmRUAACwQAACLGQAATw8AANQOAABqEAAAzhAAAAIXAACJDgAAbhMAABwTAABmFAAAVhcAAMETAADNEwAAbBMAAGgXAABmFwAAXxcAACITAADODwAAaQ4AANgOAABjFgAAyxMAAKoOAAAoFwAAJhcAAMUTAABdFgAA6BEAAGcTAABlEwAA8hYAAHMTAAAdFwAA+RYAAPMRAADPDgAAzhUAAAwSAACzEQAApREAAGEQAAAyFwAAuxMAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQIBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAIDAgICAgIAAAICAAICAAICAgICAgICAgIABAAAAAAAAgICAgICAgICAgICAgICAgICAgICAgICAgIAAAACAgICAgICAgICAgICAgICAgICAgICAgICAgICAgACAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAACAAICAgICAAACAgACAgACAgICAgICAgICAAMABAAAAAICAgICAgICAgICAgICAgICAgICAgICAgICAAAAAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAAgACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbG9zZWVlcC1hbGl2ZQAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQIBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBY2h1bmtlZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEAAQEBAQEAAAEBAAEBAAEBAQEBAQEBAQEAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABlY3Rpb25lbnQtbGVuZ3Rob25yb3h5LWNvbm5lY3Rpb24AAAAAAAAAAAAAAAAAAAByYW5zZmVyLWVuY29kaW5ncGdyYWRlDQoNCg0KU00NCg0KVFRQL0NFL1RTUC8AAAAAAAAAAAAAAAABAgABAwAAAAAAAAAAAAAAAAAAAAAAAAQBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAQIAAQMAAAAAAAAAAAAAAAAAAAAAAAAEAQEFAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAEAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAQAAAgAAAAAAAAAAAAAAAAAAAAAAAAMEAAAEBAQEBAQEBAQEBAUEBAQEBAQEBAQEBAQABAAGBwQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEAAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAADAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwAAAAAAAAMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAABAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAIAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAAAAAAAADAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABOT1VOQ0VFQ0tPVVRORUNURVRFQ1JJQkVMVVNIRVRFQURTRUFSQ0hSR0VDVElWSVRZTEVOREFSVkVPVElGWVBUSU9OU0NIU0VBWVNUQVRDSEdFT1JESVJFQ1RPUlRSQ0hQQVJBTUVURVJVUkNFQlNDUklCRUFSRE9XTkFDRUlORE5LQ0tVQlNDUklCRUhUVFAvQURUUC8="; + } +}); + +// node_modules/undici/lib/llhttp/llhttp_simd-wasm.js +var require_llhttp_simd_wasm = __commonJS({ + "node_modules/undici/lib/llhttp/llhttp_simd-wasm.js"(exports2, module2) { + module2.exports = "AGFzbQEAAAABMAhgAX8Bf2ADf39/AX9gBH9/f38Bf2AAAGADf39/AGABfwBgAn9/AGAGf39/f39/AALLAQgDZW52GHdhc21fb25faGVhZGVyc19jb21wbGV0ZQACA2VudhV3YXNtX29uX21lc3NhZ2VfYmVnaW4AAANlbnYLd2FzbV9vbl91cmwAAQNlbnYOd2FzbV9vbl9zdGF0dXMAAQNlbnYUd2FzbV9vbl9oZWFkZXJfZmllbGQAAQNlbnYUd2FzbV9vbl9oZWFkZXJfdmFsdWUAAQNlbnYMd2FzbV9vbl9ib2R5AAEDZW52GHdhc21fb25fbWVzc2FnZV9jb21wbGV0ZQAAA0ZFAwMEAAAFAAAAAAAABQEFAAUFBQAABgAAAAAGBgYGAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAAABAQcAAAUFAwABBAUBcAESEgUDAQACBggBfwFBgNQECwfRBSIGbWVtb3J5AgALX2luaXRpYWxpemUACRlfX2luZGlyZWN0X2Z1bmN0aW9uX3RhYmxlAQALbGxodHRwX2luaXQAChhsbGh0dHBfc2hvdWxkX2tlZXBfYWxpdmUAQQxsbGh0dHBfYWxsb2MADAZtYWxsb2MARgtsbGh0dHBfZnJlZQANBGZyZWUASA9sbGh0dHBfZ2V0X3R5cGUADhVsbGh0dHBfZ2V0X2h0dHBfbWFqb3IADxVsbGh0dHBfZ2V0X2h0dHBfbWlub3IAEBFsbGh0dHBfZ2V0X21ldGhvZAARFmxsaHR0cF9nZXRfc3RhdHVzX2NvZGUAEhJsbGh0dHBfZ2V0X3VwZ3JhZGUAEwxsbGh0dHBfcmVzZXQAFA5sbGh0dHBfZXhlY3V0ZQAVFGxsaHR0cF9zZXR0aW5nc19pbml0ABYNbGxodHRwX2ZpbmlzaAAXDGxsaHR0cF9wYXVzZQAYDWxsaHR0cF9yZXN1bWUAGRtsbGh0dHBfcmVzdW1lX2FmdGVyX3VwZ3JhZGUAGhBsbGh0dHBfZ2V0X2Vycm5vABsXbGxodHRwX2dldF9lcnJvcl9yZWFzb24AHBdsbGh0dHBfc2V0X2Vycm9yX3JlYXNvbgAdFGxsaHR0cF9nZXRfZXJyb3JfcG9zAB4RbGxodHRwX2Vycm5vX25hbWUAHxJsbGh0dHBfbWV0aG9kX25hbWUAIBJsbGh0dHBfc3RhdHVzX25hbWUAIRpsbGh0dHBfc2V0X2xlbmllbnRfaGVhZGVycwAiIWxsaHR0cF9zZXRfbGVuaWVudF9jaHVua2VkX2xlbmd0aAAjHWxsaHR0cF9zZXRfbGVuaWVudF9rZWVwX2FsaXZlACQkbGxodHRwX3NldF9sZW5pZW50X3RyYW5zZmVyX2VuY29kaW5nACUYbGxodHRwX21lc3NhZ2VfbmVlZHNfZW9mAD8JFwEAQQELEQECAwQFCwYHNTk3MS8tJyspCrLgAkUCAAsIABCIgICAAAsZACAAEMKAgIAAGiAAIAI2AjggACABOgAoCxwAIAAgAC8BMiAALQAuIAAQwYCAgAAQgICAgAALKgEBf0HAABDGgICAACIBEMKAgIAAGiABQYCIgIAANgI4IAEgADoAKCABCwoAIAAQyICAgAALBwAgAC0AKAsHACAALQAqCwcAIAAtACsLBwAgAC0AKQsHACAALwEyCwcAIAAtAC4LRQEEfyAAKAIYIQEgAC0ALSECIAAtACghAyAAKAI4IQQgABDCgICAABogACAENgI4IAAgAzoAKCAAIAI6AC0gACABNgIYCxEAIAAgASABIAJqEMOAgIAACxAAIABBAEHcABDMgICAABoLZwEBf0EAIQECQCAAKAIMDQACQAJAAkACQCAALQAvDgMBAAMCCyAAKAI4IgFFDQAgASgCLCIBRQ0AIAAgARGAgICAAAAiAQ0DC0EADwsQyoCAgAAACyAAQcOWgIAANgIQQQ4hAQsgAQseAAJAIAAoAgwNACAAQdGbgIAANgIQIABBFTYCDAsLFgACQCAAKAIMQRVHDQAgAEEANgIMCwsWAAJAIAAoAgxBFkcNACAAQQA2AgwLCwcAIAAoAgwLBwAgACgCEAsJACAAIAE2AhALBwAgACgCFAsiAAJAIABBJEkNABDKgICAAAALIABBAnRBoLOAgABqKAIACyIAAkAgAEEuSQ0AEMqAgIAAAAsgAEECdEGwtICAAGooAgAL7gsBAX9B66iAgAAhAQJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIABBnH9qDvQDY2IAAWFhYWFhYQIDBAVhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhBgcICQoLDA0OD2FhYWFhEGFhYWFhYWFhYWFhEWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYRITFBUWFxgZGhthYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhHB0eHyAhIiMkJSYnKCkqKywtLi8wMTIzNDU2YTc4OTphYWFhYWFhYTthYWE8YWFhYT0+P2FhYWFhYWFhQGFhQWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYUJDREVGR0hJSktMTU5PUFFSU2FhYWFhYWFhVFVWV1hZWlthXF1hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFeYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhX2BhC0Hhp4CAAA8LQaShgIAADwtBy6yAgAAPC0H+sYCAAA8LQcCkgIAADwtBq6SAgAAPC0GNqICAAA8LQeKmgIAADwtBgLCAgAAPC0G5r4CAAA8LQdekgIAADwtB75+AgAAPC0Hhn4CAAA8LQfqfgIAADwtB8qCAgAAPC0Gor4CAAA8LQa6ygIAADwtBiLCAgAAPC0Hsp4CAAA8LQYKigIAADwtBjp2AgAAPC0HQroCAAA8LQcqjgIAADwtBxbKAgAAPC0HfnICAAA8LQdKcgIAADwtBxKCAgAAPC0HXoICAAA8LQaKfgIAADwtB7a6AgAAPC0GrsICAAA8LQdSlgIAADwtBzK6AgAAPC0H6roCAAA8LQfyrgIAADwtB0rCAgAAPC0HxnYCAAA8LQbuggIAADwtB96uAgAAPC0GQsYCAAA8LQdexgIAADwtBoq2AgAAPC0HUp4CAAA8LQeCrgIAADwtBn6yAgAAPC0HrsYCAAA8LQdWfgIAADwtByrGAgAAPC0HepYCAAA8LQdSegIAADwtB9JyAgAAPC0GnsoCAAA8LQbGdgIAADwtBoJ2AgAAPC0G5sYCAAA8LQbywgIAADwtBkqGAgAAPC0GzpoCAAA8LQemsgIAADwtBrJ6AgAAPC0HUq4CAAA8LQfemgIAADwtBgKaAgAAPC0GwoYCAAA8LQf6egIAADwtBjaOAgAAPC0GJrYCAAA8LQfeigIAADwtBoLGAgAAPC0Gun4CAAA8LQcalgIAADwtB6J6AgAAPC0GTooCAAA8LQcKvgIAADwtBw52AgAAPC0GLrICAAA8LQeGdgIAADwtBja+AgAAPC0HqoYCAAA8LQbStgIAADwtB0q+AgAAPC0HfsoCAAA8LQdKygIAADwtB8LCAgAAPC0GpooCAAA8LQfmjgIAADwtBmZ6AgAAPC0G1rICAAA8LQZuwgIAADwtBkrKAgAAPC0G2q4CAAA8LQcKigIAADwtB+LKAgAAPC0GepYCAAA8LQdCigIAADwtBup6AgAAPC0GBnoCAAA8LEMqAgIAAAAtB1qGAgAAhAQsgAQsWACAAIAAtAC1B/gFxIAFBAEdyOgAtCxkAIAAgAC0ALUH9AXEgAUEAR0EBdHI6AC0LGQAgACAALQAtQfsBcSABQQBHQQJ0cjoALQsZACAAIAAtAC1B9wFxIAFBAEdBA3RyOgAtCy4BAn9BACEDAkAgACgCOCIERQ0AIAQoAgAiBEUNACAAIAQRgICAgAAAIQMLIAMLSQECf0EAIQMCQCAAKAI4IgRFDQAgBCgCBCIERQ0AIAAgASACIAFrIAQRgYCAgAAAIgNBf0cNACAAQcaRgIAANgIQQRghAwsgAwsuAQJ/QQAhAwJAIAAoAjgiBEUNACAEKAIwIgRFDQAgACAEEYCAgIAAACEDCyADC0kBAn9BACEDAkAgACgCOCIERQ0AIAQoAggiBEUNACAAIAEgAiABayAEEYGAgIAAACIDQX9HDQAgAEH2ioCAADYCEEEYIQMLIAMLLgECf0EAIQMCQCAAKAI4IgRFDQAgBCgCNCIERQ0AIAAgBBGAgICAAAAhAwsgAwtJAQJ/QQAhAwJAIAAoAjgiBEUNACAEKAIMIgRFDQAgACABIAIgAWsgBBGBgICAAAAiA0F/Rw0AIABB7ZqAgAA2AhBBGCEDCyADCy4BAn9BACEDAkAgACgCOCIERQ0AIAQoAjgiBEUNACAAIAQRgICAgAAAIQMLIAMLSQECf0EAIQMCQCAAKAI4IgRFDQAgBCgCECIERQ0AIAAgASACIAFrIAQRgYCAgAAAIgNBf0cNACAAQZWQgIAANgIQQRghAwsgAwsuAQJ/QQAhAwJAIAAoAjgiBEUNACAEKAI8IgRFDQAgACAEEYCAgIAAACEDCyADC0kBAn9BACEDAkAgACgCOCIERQ0AIAQoAhQiBEUNACAAIAEgAiABayAEEYGAgIAAACIDQX9HDQAgAEGqm4CAADYCEEEYIQMLIAMLLgECf0EAIQMCQCAAKAI4IgRFDQAgBCgCQCIERQ0AIAAgBBGAgICAAAAhAwsgAwtJAQJ/QQAhAwJAIAAoAjgiBEUNACAEKAIYIgRFDQAgACABIAIgAWsgBBGBgICAAAAiA0F/Rw0AIABB7ZOAgAA2AhBBGCEDCyADCy4BAn9BACEDAkAgACgCOCIERQ0AIAQoAkQiBEUNACAAIAQRgICAgAAAIQMLIAMLLgECf0EAIQMCQCAAKAI4IgRFDQAgBCgCJCIERQ0AIAAgBBGAgICAAAAhAwsgAwsuAQJ/QQAhAwJAIAAoAjgiBEUNACAEKAIsIgRFDQAgACAEEYCAgIAAACEDCyADC0kBAn9BACEDAkAgACgCOCIERQ0AIAQoAigiBEUNACAAIAEgAiABayAEEYGAgIAAACIDQX9HDQAgAEH2iICAADYCEEEYIQMLIAMLLgECf0EAIQMCQCAAKAI4IgRFDQAgBCgCUCIERQ0AIAAgBBGAgICAAAAhAwsgAwtJAQJ/QQAhAwJAIAAoAjgiBEUNACAEKAIcIgRFDQAgACABIAIgAWsgBBGBgICAAAAiA0F/Rw0AIABBwpmAgAA2AhBBGCEDCyADCy4BAn9BACEDAkAgACgCOCIERQ0AIAQoAkgiBEUNACAAIAQRgICAgAAAIQMLIAMLSQECf0EAIQMCQCAAKAI4IgRFDQAgBCgCICIERQ0AIAAgASACIAFrIAQRgYCAgAAAIgNBf0cNACAAQZSUgIAANgIQQRghAwsgAwsuAQJ/QQAhAwJAIAAoAjgiBEUNACAEKAJMIgRFDQAgACAEEYCAgIAAACEDCyADCy4BAn9BACEDAkAgACgCOCIERQ0AIAQoAlQiBEUNACAAIAQRgICAgAAAIQMLIAMLLgECf0EAIQMCQCAAKAI4IgRFDQAgBCgCWCIERQ0AIAAgBBGAgICAAAAhAwsgAwtFAQF/AkACQCAALwEwQRRxQRRHDQBBASEDIAAtAChBAUYNASAALwEyQeUARiEDDAELIAAtAClBBUYhAwsgACADOgAuQQAL/gEBA39BASEDAkAgAC8BMCIEQQhxDQAgACkDIEIAUiEDCwJAAkAgAC0ALkUNAEEBIQUgAC0AKUEFRg0BQQEhBSAEQcAAcUUgA3FBAUcNAQtBACEFIARBwABxDQBBAiEFIARB//8DcSIDQQhxDQACQCADQYAEcUUNAAJAIAAtAChBAUcNACAALQAtQQpxDQBBBQ8LQQQPCwJAIANBIHENAAJAIAAtAChBAUYNACAALwEyQf//A3EiAEGcf2pB5ABJDQAgAEHMAUYNACAAQbACRg0AQQQhBSAEQShxRQ0CIANBiARxQYAERg0CC0EADwtBAEEDIAApAyBQGyEFCyAFC2IBAn9BACEBAkAgAC0AKEEBRg0AIAAvATJB//8DcSICQZx/akHkAEkNACACQcwBRg0AIAJBsAJGDQAgAC8BMCIAQcAAcQ0AQQEhASAAQYgEcUGABEYNACAAQShxRSEBCyABC6cBAQN/AkACQAJAIAAtACpFDQAgAC0AK0UNAEEAIQMgAC8BMCIEQQJxRQ0BDAILQQAhAyAALwEwIgRBAXFFDQELQQEhAyAALQAoQQFGDQAgAC8BMkH//wNxIgVBnH9qQeQASQ0AIAVBzAFGDQAgBUGwAkYNACAEQcAAcQ0AQQAhAyAEQYgEcUGABEYNACAEQShxQQBHIQMLIABBADsBMCAAQQA6AC8gAwuZAQECfwJAAkACQCAALQAqRQ0AIAAtACtFDQBBACEBIAAvATAiAkECcUUNAQwCC0EAIQEgAC8BMCICQQFxRQ0BC0EBIQEgAC0AKEEBRg0AIAAvATJB//8DcSIAQZx/akHkAEkNACAAQcwBRg0AIABBsAJGDQAgAkHAAHENAEEAIQEgAkGIBHFBgARGDQAgAkEocUEARyEBCyABC0kBAXsgAEEQav0MAAAAAAAAAAAAAAAAAAAAACIB/QsDACAAIAH9CwMAIABBMGogAf0LAwAgAEEgaiAB/QsDACAAQd0BNgIcQQALewEBfwJAIAAoAgwiAw0AAkAgACgCBEUNACAAIAE2AgQLAkAgACABIAIQxICAgAAiAw0AIAAoAgwPCyAAIAM2AhxBACEDIAAoAgQiAUUNACAAIAEgAiAAKAIIEYGAgIAAACIBRQ0AIAAgAjYCFCAAIAE2AgwgASEDCyADC+TzAQMOfwN+BH8jgICAgABBEGsiAySAgICAACABIQQgASEFIAEhBiABIQcgASEIIAEhCSABIQogASELIAEhDCABIQ0gASEOIAEhDwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCAAKAIcIhBBf2oO3QHaAQHZAQIDBAUGBwgJCgsMDQ7YAQ8Q1wEREtYBExQVFhcYGRob4AHfARwdHtUBHyAhIiMkJdQBJicoKSorLNMB0gEtLtEB0AEvMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUbbAUdISUrPAc4BS80BTMwBTU5PUFFSU1RVVldYWVpbXF1eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX5/gAGBAYIBgwGEAYUBhgGHAYgBiQGKAYsBjAGNAY4BjwGQAZEBkgGTAZQBlQGWAZcBmAGZAZoBmwGcAZ0BngGfAaABoQGiAaMBpAGlAaYBpwGoAakBqgGrAawBrQGuAa8BsAGxAbIBswG0AbUBtgG3AcsBygG4AckBuQHIAboBuwG8Ab0BvgG/AcABwQHCAcMBxAHFAcYBANwBC0EAIRAMxgELQQ4hEAzFAQtBDSEQDMQBC0EPIRAMwwELQRAhEAzCAQtBEyEQDMEBC0EUIRAMwAELQRUhEAy/AQtBFiEQDL4BC0EXIRAMvQELQRghEAy8AQtBGSEQDLsBC0EaIRAMugELQRshEAy5AQtBHCEQDLgBC0EIIRAMtwELQR0hEAy2AQtBICEQDLUBC0EfIRAMtAELQQchEAyzAQtBISEQDLIBC0EiIRAMsQELQR4hEAywAQtBIyEQDK8BC0ESIRAMrgELQREhEAytAQtBJCEQDKwBC0ElIRAMqwELQSYhEAyqAQtBJyEQDKkBC0HDASEQDKgBC0EpIRAMpwELQSshEAymAQtBLCEQDKUBC0EtIRAMpAELQS4hEAyjAQtBLyEQDKIBC0HEASEQDKEBC0EwIRAMoAELQTQhEAyfAQtBDCEQDJ4BC0ExIRAMnQELQTIhEAycAQtBMyEQDJsBC0E5IRAMmgELQTUhEAyZAQtBxQEhEAyYAQtBCyEQDJcBC0E6IRAMlgELQTYhEAyVAQtBCiEQDJQBC0E3IRAMkwELQTghEAySAQtBPCEQDJEBC0E7IRAMkAELQT0hEAyPAQtBCSEQDI4BC0EoIRAMjQELQT4hEAyMAQtBPyEQDIsBC0HAACEQDIoBC0HBACEQDIkBC0HCACEQDIgBC0HDACEQDIcBC0HEACEQDIYBC0HFACEQDIUBC0HGACEQDIQBC0EqIRAMgwELQccAIRAMggELQcgAIRAMgQELQckAIRAMgAELQcoAIRAMfwtBywAhEAx+C0HNACEQDH0LQcwAIRAMfAtBzgAhEAx7C0HPACEQDHoLQdAAIRAMeQtB0QAhEAx4C0HSACEQDHcLQdMAIRAMdgtB1AAhEAx1C0HWACEQDHQLQdUAIRAMcwtBBiEQDHILQdcAIRAMcQtBBSEQDHALQdgAIRAMbwtBBCEQDG4LQdkAIRAMbQtB2gAhEAxsC0HbACEQDGsLQdwAIRAMagtBAyEQDGkLQd0AIRAMaAtB3gAhEAxnC0HfACEQDGYLQeEAIRAMZQtB4AAhEAxkC0HiACEQDGMLQeMAIRAMYgtBAiEQDGELQeQAIRAMYAtB5QAhEAxfC0HmACEQDF4LQecAIRAMXQtB6AAhEAxcC0HpACEQDFsLQeoAIRAMWgtB6wAhEAxZC0HsACEQDFgLQe0AIRAMVwtB7gAhEAxWC0HvACEQDFULQfAAIRAMVAtB8QAhEAxTC0HyACEQDFILQfMAIRAMUQtB9AAhEAxQC0H1ACEQDE8LQfYAIRAMTgtB9wAhEAxNC0H4ACEQDEwLQfkAIRAMSwtB+gAhEAxKC0H7ACEQDEkLQfwAIRAMSAtB/QAhEAxHC0H+ACEQDEYLQf8AIRAMRQtBgAEhEAxEC0GBASEQDEMLQYIBIRAMQgtBgwEhEAxBC0GEASEQDEALQYUBIRAMPwtBhgEhEAw+C0GHASEQDD0LQYgBIRAMPAtBiQEhEAw7C0GKASEQDDoLQYsBIRAMOQtBjAEhEAw4C0GNASEQDDcLQY4BIRAMNgtBjwEhEAw1C0GQASEQDDQLQZEBIRAMMwtBkgEhEAwyC0GTASEQDDELQZQBIRAMMAtBlQEhEAwvC0GWASEQDC4LQZcBIRAMLQtBmAEhEAwsC0GZASEQDCsLQZoBIRAMKgtBmwEhEAwpC0GcASEQDCgLQZ0BIRAMJwtBngEhEAwmC0GfASEQDCULQaABIRAMJAtBoQEhEAwjC0GiASEQDCILQaMBIRAMIQtBpAEhEAwgC0GlASEQDB8LQaYBIRAMHgtBpwEhEAwdC0GoASEQDBwLQakBIRAMGwtBqgEhEAwaC0GrASEQDBkLQawBIRAMGAtBrQEhEAwXC0GuASEQDBYLQQEhEAwVC0GvASEQDBQLQbABIRAMEwtBsQEhEAwSC0GzASEQDBELQbIBIRAMEAtBtAEhEAwPC0G1ASEQDA4LQbYBIRAMDQtBtwEhEAwMC0G4ASEQDAsLQbkBIRAMCgtBugEhEAwJC0G7ASEQDAgLQcYBIRAMBwtBvAEhEAwGC0G9ASEQDAULQb4BIRAMBAtBvwEhEAwDC0HAASEQDAILQcIBIRAMAQtBwQEhEAsDQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIBAOxwEAAQIDBAUGBwgJCgsMDQ4PEBESExQVFhcYGRobHB4fICEjJSg/QEFERUZHSElKS0xNT1BRUlPeA1dZW1xdYGJlZmdoaWprbG1vcHFyc3R1dnd4eXp7fH1+gAGCAYUBhgGHAYkBiwGMAY0BjgGPAZABkQGUAZUBlgGXAZgBmQGaAZsBnAGdAZ4BnwGgAaEBogGjAaQBpQGmAacBqAGpAaoBqwGsAa0BrgGvAbABsQGyAbMBtAG1AbYBtwG4AbkBugG7AbwBvQG+Ab8BwAHBAcIBwwHEAcUBxgHHAcgByQHKAcsBzAHNAc4BzwHQAdEB0gHTAdQB1QHWAdcB2AHZAdoB2wHcAd0B3gHgAeEB4gHjAeQB5QHmAecB6AHpAeoB6wHsAe0B7gHvAfAB8QHyAfMBmQKkArAC/gL+AgsgASIEIAJHDfMBQd0BIRAM/wMLIAEiECACRw3dAUHDASEQDP4DCyABIgEgAkcNkAFB9wAhEAz9AwsgASIBIAJHDYYBQe8AIRAM/AMLIAEiASACRw1/QeoAIRAM+wMLIAEiASACRw17QegAIRAM+gMLIAEiASACRw14QeYAIRAM+QMLIAEiASACRw0aQRghEAz4AwsgASIBIAJHDRRBEiEQDPcDCyABIgEgAkcNWUHFACEQDPYDCyABIgEgAkcNSkE/IRAM9QMLIAEiASACRw1IQTwhEAz0AwsgASIBIAJHDUFBMSEQDPMDCyAALQAuQQFGDesDDIcCCyAAIAEiASACEMCAgIAAQQFHDeYBIABCADcDIAznAQsgACABIgEgAhC0gICAACIQDecBIAEhAQz1AgsCQCABIgEgAkcNAEEGIRAM8AMLIAAgAUEBaiIBIAIQu4CAgAAiEA3oASABIQEMMQsgAEIANwMgQRIhEAzVAwsgASIQIAJHDStBHSEQDO0DCwJAIAEiASACRg0AIAFBAWohAUEQIRAM1AMLQQchEAzsAwsgAEIAIAApAyAiESACIAEiEGutIhJ9IhMgEyARVhs3AyAgESASViIURQ3lAUEIIRAM6wMLAkAgASIBIAJGDQAgAEGJgICAADYCCCAAIAE2AgQgASEBQRQhEAzSAwtBCSEQDOoDCyABIQEgACkDIFAN5AEgASEBDPICCwJAIAEiASACRw0AQQshEAzpAwsgACABQQFqIgEgAhC2gICAACIQDeUBIAEhAQzyAgsgACABIgEgAhC4gICAACIQDeUBIAEhAQzyAgsgACABIgEgAhC4gICAACIQDeYBIAEhAQwNCyAAIAEiASACELqAgIAAIhAN5wEgASEBDPACCwJAIAEiASACRw0AQQ8hEAzlAwsgAS0AACIQQTtGDQggEEENRw3oASABQQFqIQEM7wILIAAgASIBIAIQuoCAgAAiEA3oASABIQEM8gILA0ACQCABLQAAQfC1gIAAai0AACIQQQFGDQAgEEECRw3rASAAKAIEIRAgAEEANgIEIAAgECABQQFqIgEQuYCAgAAiEA3qASABIQEM9AILIAFBAWoiASACRw0AC0ESIRAM4gMLIAAgASIBIAIQuoCAgAAiEA3pASABIQEMCgsgASIBIAJHDQZBGyEQDOADCwJAIAEiASACRw0AQRYhEAzgAwsgAEGKgICAADYCCCAAIAE2AgQgACABIAIQuICAgAAiEA3qASABIQFBICEQDMYDCwJAIAEiASACRg0AA0ACQCABLQAAQfC3gIAAai0AACIQQQJGDQACQCAQQX9qDgTlAewBAOsB7AELIAFBAWohAUEIIRAMyAMLIAFBAWoiASACRw0AC0EVIRAM3wMLQRUhEAzeAwsDQAJAIAEtAABB8LmAgABqLQAAIhBBAkYNACAQQX9qDgTeAewB4AHrAewBCyABQQFqIgEgAkcNAAtBGCEQDN0DCwJAIAEiASACRg0AIABBi4CAgAA2AgggACABNgIEIAEhAUEHIRAMxAMLQRkhEAzcAwsgAUEBaiEBDAILAkAgASIUIAJHDQBBGiEQDNsDCyAUIQECQCAULQAAQXNqDhTdAu4C7gLuAu4C7gLuAu4C7gLuAu4C7gLuAu4C7gLuAu4C7gLuAgDuAgtBACEQIABBADYCHCAAQa+LgIAANgIQIABBAjYCDCAAIBRBAWo2AhQM2gMLAkAgAS0AACIQQTtGDQAgEEENRw3oASABQQFqIQEM5QILIAFBAWohAQtBIiEQDL8DCwJAIAEiECACRw0AQRwhEAzYAwtCACERIBAhASAQLQAAQVBqDjfnAeYBAQIDBAUGBwgAAAAAAAAACQoLDA0OAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPEBESExQAC0EeIRAMvQMLQgIhEQzlAQtCAyERDOQBC0IEIREM4wELQgUhEQziAQtCBiERDOEBC0IHIREM4AELQgghEQzfAQtCCSERDN4BC0IKIREM3QELQgshEQzcAQtCDCERDNsBC0INIREM2gELQg4hEQzZAQtCDyERDNgBC0IKIREM1wELQgshEQzWAQtCDCERDNUBC0INIREM1AELQg4hEQzTAQtCDyERDNIBC0IAIRECQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIBAtAABBUGoON+UB5AEAAQIDBAUGB+YB5gHmAeYB5gHmAeYBCAkKCwwN5gHmAeYB5gHmAeYB5gHmAeYB5gHmAeYB5gHmAeYB5gHmAeYB5gHmAeYB5gHmAeYB5gHmAQ4PEBESE+YBC0ICIREM5AELQgMhEQzjAQtCBCERDOIBC0IFIREM4QELQgYhEQzgAQtCByERDN8BC0IIIREM3gELQgkhEQzdAQtCCiERDNwBC0ILIREM2wELQgwhEQzaAQtCDSERDNkBC0IOIREM2AELQg8hEQzXAQtCCiERDNYBC0ILIREM1QELQgwhEQzUAQtCDSERDNMBC0IOIREM0gELQg8hEQzRAQsgAEIAIAApAyAiESACIAEiEGutIhJ9IhMgEyARVhs3AyAgESASViIURQ3SAUEfIRAMwAMLAkAgASIBIAJGDQAgAEGJgICAADYCCCAAIAE2AgQgASEBQSQhEAynAwtBICEQDL8DCyAAIAEiECACEL6AgIAAQX9qDgW2AQDFAgHRAdIBC0ERIRAMpAMLIABBAToALyAQIQEMuwMLIAEiASACRw3SAUEkIRAMuwMLIAEiDSACRw0eQcYAIRAMugMLIAAgASIBIAIQsoCAgAAiEA3UASABIQEMtQELIAEiECACRw0mQdAAIRAMuAMLAkAgASIBIAJHDQBBKCEQDLgDCyAAQQA2AgQgAEGMgICAADYCCCAAIAEgARCxgICAACIQDdMBIAEhAQzYAQsCQCABIhAgAkcNAEEpIRAMtwMLIBAtAAAiAUEgRg0UIAFBCUcN0wEgEEEBaiEBDBULAkAgASIBIAJGDQAgAUEBaiEBDBcLQSohEAy1AwsCQCABIhAgAkcNAEErIRAMtQMLAkAgEC0AACIBQQlGDQAgAUEgRw3VAQsgAC0ALEEIRg3TASAQIQEMkQMLAkAgASIBIAJHDQBBLCEQDLQDCyABLQAAQQpHDdUBIAFBAWohAQzJAgsgASIOIAJHDdUBQS8hEAyyAwsDQAJAIAEtAAAiEEEgRg0AAkAgEEF2ag4EANwB3AEA2gELIAEhAQzgAQsgAUEBaiIBIAJHDQALQTEhEAyxAwtBMiEQIAEiFCACRg2wAyACIBRrIAAoAgAiAWohFSAUIAFrQQNqIRYCQANAIBQtAAAiF0EgciAXIBdBv39qQf8BcUEaSRtB/wFxIAFB8LuAgABqLQAARw0BAkAgAUEDRw0AQQYhAQyWAwsgAUEBaiEBIBRBAWoiFCACRw0ACyAAIBU2AgAMsQMLIABBADYCACAUIQEM2QELQTMhECABIhQgAkYNrwMgAiAUayAAKAIAIgFqIRUgFCABa0EIaiEWAkADQCAULQAAIhdBIHIgFyAXQb9/akH/AXFBGkkbQf8BcSABQfS7gIAAai0AAEcNAQJAIAFBCEcNAEEFIQEMlQMLIAFBAWohASAUQQFqIhQgAkcNAAsgACAVNgIADLADCyAAQQA2AgAgFCEBDNgBC0E0IRAgASIUIAJGDa4DIAIgFGsgACgCACIBaiEVIBQgAWtBBWohFgJAA0AgFC0AACIXQSByIBcgF0G/f2pB/wFxQRpJG0H/AXEgAUHQwoCAAGotAABHDQECQCABQQVHDQBBByEBDJQDCyABQQFqIQEgFEEBaiIUIAJHDQALIAAgFTYCAAyvAwsgAEEANgIAIBQhAQzXAQsCQCABIgEgAkYNAANAAkAgAS0AAEGAvoCAAGotAAAiEEEBRg0AIBBBAkYNCiABIQEM3QELIAFBAWoiASACRw0AC0EwIRAMrgMLQTAhEAytAwsCQCABIgEgAkYNAANAAkAgAS0AACIQQSBGDQAgEEF2ag4E2QHaAdoB2QHaAQsgAUEBaiIBIAJHDQALQTghEAytAwtBOCEQDKwDCwNAAkAgAS0AACIQQSBGDQAgEEEJRw0DCyABQQFqIgEgAkcNAAtBPCEQDKsDCwNAAkAgAS0AACIQQSBGDQACQAJAIBBBdmoOBNoBAQHaAQALIBBBLEYN2wELIAEhAQwECyABQQFqIgEgAkcNAAtBPyEQDKoDCyABIQEM2wELQcAAIRAgASIUIAJGDagDIAIgFGsgACgCACIBaiEWIBQgAWtBBmohFwJAA0AgFC0AAEEgciABQYDAgIAAai0AAEcNASABQQZGDY4DIAFBAWohASAUQQFqIhQgAkcNAAsgACAWNgIADKkDCyAAQQA2AgAgFCEBC0E2IRAMjgMLAkAgASIPIAJHDQBBwQAhEAynAwsgAEGMgICAADYCCCAAIA82AgQgDyEBIAAtACxBf2oOBM0B1QHXAdkBhwMLIAFBAWohAQzMAQsCQCABIgEgAkYNAANAAkAgAS0AACIQQSByIBAgEEG/f2pB/wFxQRpJG0H/AXEiEEEJRg0AIBBBIEYNAAJAAkACQAJAIBBBnX9qDhMAAwMDAwMDAwEDAwMDAwMDAwMCAwsgAUEBaiEBQTEhEAyRAwsgAUEBaiEBQTIhEAyQAwsgAUEBaiEBQTMhEAyPAwsgASEBDNABCyABQQFqIgEgAkcNAAtBNSEQDKUDC0E1IRAMpAMLAkAgASIBIAJGDQADQAJAIAEtAABBgLyAgABqLQAAQQFGDQAgASEBDNMBCyABQQFqIgEgAkcNAAtBPSEQDKQDC0E9IRAMowMLIAAgASIBIAIQsICAgAAiEA3WASABIQEMAQsgEEEBaiEBC0E8IRAMhwMLAkAgASIBIAJHDQBBwgAhEAygAwsCQANAAkAgAS0AAEF3ag4YAAL+Av4ChAP+Av4C/gL+Av4C/gL+Av4C/gL+Av4C/gL+Av4C/gL+Av4C/gIA/gILIAFBAWoiASACRw0AC0HCACEQDKADCyABQQFqIQEgAC0ALUEBcUUNvQEgASEBC0EsIRAMhQMLIAEiASACRw3TAUHEACEQDJ0DCwNAAkAgAS0AAEGQwICAAGotAABBAUYNACABIQEMtwILIAFBAWoiASACRw0AC0HFACEQDJwDCyANLQAAIhBBIEYNswEgEEE6Rw2BAyAAKAIEIQEgAEEANgIEIAAgASANEK+AgIAAIgEN0AEgDUEBaiEBDLMCC0HHACEQIAEiDSACRg2aAyACIA1rIAAoAgAiAWohFiANIAFrQQVqIRcDQCANLQAAIhRBIHIgFCAUQb9/akH/AXFBGkkbQf8BcSABQZDCgIAAai0AAEcNgAMgAUEFRg30AiABQQFqIQEgDUEBaiINIAJHDQALIAAgFjYCAAyaAwtByAAhECABIg0gAkYNmQMgAiANayAAKAIAIgFqIRYgDSABa0EJaiEXA0AgDS0AACIUQSByIBQgFEG/f2pB/wFxQRpJG0H/AXEgAUGWwoCAAGotAABHDf8CAkAgAUEJRw0AQQIhAQz1AgsgAUEBaiEBIA1BAWoiDSACRw0ACyAAIBY2AgAMmQMLAkAgASINIAJHDQBByQAhEAyZAwsCQAJAIA0tAAAiAUEgciABIAFBv39qQf8BcUEaSRtB/wFxQZJ/ag4HAIADgAOAA4ADgAMBgAMLIA1BAWohAUE+IRAMgAMLIA1BAWohAUE/IRAM/wILQcoAIRAgASINIAJGDZcDIAIgDWsgACgCACIBaiEWIA0gAWtBAWohFwNAIA0tAAAiFEEgciAUIBRBv39qQf8BcUEaSRtB/wFxIAFBoMKAgABqLQAARw39AiABQQFGDfACIAFBAWohASANQQFqIg0gAkcNAAsgACAWNgIADJcDC0HLACEQIAEiDSACRg2WAyACIA1rIAAoAgAiAWohFiANIAFrQQ5qIRcDQCANLQAAIhRBIHIgFCAUQb9/akH/AXFBGkkbQf8BcSABQaLCgIAAai0AAEcN/AIgAUEORg3wAiABQQFqIQEgDUEBaiINIAJHDQALIAAgFjYCAAyWAwtBzAAhECABIg0gAkYNlQMgAiANayAAKAIAIgFqIRYgDSABa0EPaiEXA0AgDS0AACIUQSByIBQgFEG/f2pB/wFxQRpJG0H/AXEgAUHAwoCAAGotAABHDfsCAkAgAUEPRw0AQQMhAQzxAgsgAUEBaiEBIA1BAWoiDSACRw0ACyAAIBY2AgAMlQMLQc0AIRAgASINIAJGDZQDIAIgDWsgACgCACIBaiEWIA0gAWtBBWohFwNAIA0tAAAiFEEgciAUIBRBv39qQf8BcUEaSRtB/wFxIAFB0MKAgABqLQAARw36AgJAIAFBBUcNAEEEIQEM8AILIAFBAWohASANQQFqIg0gAkcNAAsgACAWNgIADJQDCwJAIAEiDSACRw0AQc4AIRAMlAMLAkACQAJAAkAgDS0AACIBQSByIAEgAUG/f2pB/wFxQRpJG0H/AXFBnX9qDhMA/QL9Av0C/QL9Av0C/QL9Av0C/QL9Av0CAf0C/QL9AgID/QILIA1BAWohAUHBACEQDP0CCyANQQFqIQFBwgAhEAz8AgsgDUEBaiEBQcMAIRAM+wILIA1BAWohAUHEACEQDPoCCwJAIAEiASACRg0AIABBjYCAgAA2AgggACABNgIEIAEhAUHFACEQDPoCC0HPACEQDJIDCyAQIQECQAJAIBAtAABBdmoOBAGoAqgCAKgCCyAQQQFqIQELQSchEAz4AgsCQCABIgEgAkcNAEHRACEQDJEDCwJAIAEtAABBIEYNACABIQEMjQELIAFBAWohASAALQAtQQFxRQ3HASABIQEMjAELIAEiFyACRw3IAUHSACEQDI8DC0HTACEQIAEiFCACRg2OAyACIBRrIAAoAgAiAWohFiAUIAFrQQFqIRcDQCAULQAAIAFB1sKAgABqLQAARw3MASABQQFGDccBIAFBAWohASAUQQFqIhQgAkcNAAsgACAWNgIADI4DCwJAIAEiASACRw0AQdUAIRAMjgMLIAEtAABBCkcNzAEgAUEBaiEBDMcBCwJAIAEiASACRw0AQdYAIRAMjQMLAkACQCABLQAAQXZqDgQAzQHNAQHNAQsgAUEBaiEBDMcBCyABQQFqIQFBygAhEAzzAgsgACABIgEgAhCugICAACIQDcsBIAEhAUHNACEQDPICCyAALQApQSJGDYUDDKYCCwJAIAEiASACRw0AQdsAIRAMigMLQQAhFEEBIRdBASEWQQAhEAJAAkACQAJAAkACQAJAAkACQCABLQAAQVBqDgrUAdMBAAECAwQFBgjVAQtBAiEQDAYLQQMhEAwFC0EEIRAMBAtBBSEQDAMLQQYhEAwCC0EHIRAMAQtBCCEQC0EAIRdBACEWQQAhFAzMAQtBCSEQQQEhFEEAIRdBACEWDMsBCwJAIAEiASACRw0AQd0AIRAMiQMLIAEtAABBLkcNzAEgAUEBaiEBDKYCCyABIgEgAkcNzAFB3wAhEAyHAwsCQCABIgEgAkYNACAAQY6AgIAANgIIIAAgATYCBCABIQFB0AAhEAzuAgtB4AAhEAyGAwtB4QAhECABIgEgAkYNhQMgAiABayAAKAIAIhRqIRYgASAUa0EDaiEXA0AgAS0AACAUQeLCgIAAai0AAEcNzQEgFEEDRg3MASAUQQFqIRQgAUEBaiIBIAJHDQALIAAgFjYCAAyFAwtB4gAhECABIgEgAkYNhAMgAiABayAAKAIAIhRqIRYgASAUa0ECaiEXA0AgAS0AACAUQebCgIAAai0AAEcNzAEgFEECRg3OASAUQQFqIRQgAUEBaiIBIAJHDQALIAAgFjYCAAyEAwtB4wAhECABIgEgAkYNgwMgAiABayAAKAIAIhRqIRYgASAUa0EDaiEXA0AgAS0AACAUQenCgIAAai0AAEcNywEgFEEDRg3OASAUQQFqIRQgAUEBaiIBIAJHDQALIAAgFjYCAAyDAwsCQCABIgEgAkcNAEHlACEQDIMDCyAAIAFBAWoiASACEKiAgIAAIhANzQEgASEBQdYAIRAM6QILAkAgASIBIAJGDQADQAJAIAEtAAAiEEEgRg0AAkACQAJAIBBBuH9qDgsAAc8BzwHPAc8BzwHPAc8BzwECzwELIAFBAWohAUHSACEQDO0CCyABQQFqIQFB0wAhEAzsAgsgAUEBaiEBQdQAIRAM6wILIAFBAWoiASACRw0AC0HkACEQDIIDC0HkACEQDIEDCwNAAkAgAS0AAEHwwoCAAGotAAAiEEEBRg0AIBBBfmoOA88B0AHRAdIBCyABQQFqIgEgAkcNAAtB5gAhEAyAAwsCQCABIgEgAkYNACABQQFqIQEMAwtB5wAhEAz/AgsDQAJAIAEtAABB8MSAgABqLQAAIhBBAUYNAAJAIBBBfmoOBNIB0wHUAQDVAQsgASEBQdcAIRAM5wILIAFBAWoiASACRw0AC0HoACEQDP4CCwJAIAEiASACRw0AQekAIRAM/gILAkAgAS0AACIQQXZqDhq6AdUB1QG8AdUB1QHVAdUB1QHVAdUB1QHVAdUB1QHVAdUB1QHVAdUB1QHVAcoB1QHVAQDTAQsgAUEBaiEBC0EGIRAM4wILA0ACQCABLQAAQfDGgIAAai0AAEEBRg0AIAEhAQyeAgsgAUEBaiIBIAJHDQALQeoAIRAM+wILAkAgASIBIAJGDQAgAUEBaiEBDAMLQesAIRAM+gILAkAgASIBIAJHDQBB7AAhEAz6AgsgAUEBaiEBDAELAkAgASIBIAJHDQBB7QAhEAz5AgsgAUEBaiEBC0EEIRAM3gILAkAgASIUIAJHDQBB7gAhEAz3AgsgFCEBAkACQAJAIBQtAABB8MiAgABqLQAAQX9qDgfUAdUB1gEAnAIBAtcBCyAUQQFqIQEMCgsgFEEBaiEBDM0BC0EAIRAgAEEANgIcIABBm5KAgAA2AhAgAEEHNgIMIAAgFEEBajYCFAz2AgsCQANAAkAgAS0AAEHwyICAAGotAAAiEEEERg0AAkACQCAQQX9qDgfSAdMB1AHZAQAEAdkBCyABIQFB2gAhEAzgAgsgAUEBaiEBQdwAIRAM3wILIAFBAWoiASACRw0AC0HvACEQDPYCCyABQQFqIQEMywELAkAgASIUIAJHDQBB8AAhEAz1AgsgFC0AAEEvRw3UASAUQQFqIQEMBgsCQCABIhQgAkcNAEHxACEQDPQCCwJAIBQtAAAiAUEvRw0AIBRBAWohAUHdACEQDNsCCyABQXZqIgRBFksN0wFBASAEdEGJgIACcUUN0wEMygILAkAgASIBIAJGDQAgAUEBaiEBQd4AIRAM2gILQfIAIRAM8gILAkAgASIUIAJHDQBB9AAhEAzyAgsgFCEBAkAgFC0AAEHwzICAAGotAABBf2oOA8kClAIA1AELQeEAIRAM2AILAkAgASIUIAJGDQADQAJAIBQtAABB8MqAgABqLQAAIgFBA0YNAAJAIAFBf2oOAssCANUBCyAUIQFB3wAhEAzaAgsgFEEBaiIUIAJHDQALQfMAIRAM8QILQfMAIRAM8AILAkAgASIBIAJGDQAgAEGPgICAADYCCCAAIAE2AgQgASEBQeAAIRAM1wILQfUAIRAM7wILAkAgASIBIAJHDQBB9gAhEAzvAgsgAEGPgICAADYCCCAAIAE2AgQgASEBC0EDIRAM1AILA0AgAS0AAEEgRw3DAiABQQFqIgEgAkcNAAtB9wAhEAzsAgsCQCABIgEgAkcNAEH4ACEQDOwCCyABLQAAQSBHDc4BIAFBAWohAQzvAQsgACABIgEgAhCsgICAACIQDc4BIAEhAQyOAgsCQCABIgQgAkcNAEH6ACEQDOoCCyAELQAAQcwARw3RASAEQQFqIQFBEyEQDM8BCwJAIAEiBCACRw0AQfsAIRAM6QILIAIgBGsgACgCACIBaiEUIAQgAWtBBWohEANAIAQtAAAgAUHwzoCAAGotAABHDdABIAFBBUYNzgEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBB+wAhEAzoAgsCQCABIgQgAkcNAEH8ACEQDOgCCwJAAkAgBC0AAEG9f2oODADRAdEB0QHRAdEB0QHRAdEB0QHRAQHRAQsgBEEBaiEBQeYAIRAMzwILIARBAWohAUHnACEQDM4CCwJAIAEiBCACRw0AQf0AIRAM5wILIAIgBGsgACgCACIBaiEUIAQgAWtBAmohEAJAA0AgBC0AACABQe3PgIAAai0AAEcNzwEgAUECRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQf0AIRAM5wILIABBADYCACAQQQFqIQFBECEQDMwBCwJAIAEiBCACRw0AQf4AIRAM5gILIAIgBGsgACgCACIBaiEUIAQgAWtBBWohEAJAA0AgBC0AACABQfbOgIAAai0AAEcNzgEgAUEFRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQf4AIRAM5gILIABBADYCACAQQQFqIQFBFiEQDMsBCwJAIAEiBCACRw0AQf8AIRAM5QILIAIgBGsgACgCACIBaiEUIAQgAWtBA2ohEAJAA0AgBC0AACABQfzOgIAAai0AAEcNzQEgAUEDRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQf8AIRAM5QILIABBADYCACAQQQFqIQFBBSEQDMoBCwJAIAEiBCACRw0AQYABIRAM5AILIAQtAABB2QBHDcsBIARBAWohAUEIIRAMyQELAkAgASIEIAJHDQBBgQEhEAzjAgsCQAJAIAQtAABBsn9qDgMAzAEBzAELIARBAWohAUHrACEQDMoCCyAEQQFqIQFB7AAhEAzJAgsCQCABIgQgAkcNAEGCASEQDOICCwJAAkAgBC0AAEG4f2oOCADLAcsBywHLAcsBywEBywELIARBAWohAUHqACEQDMkCCyAEQQFqIQFB7QAhEAzIAgsCQCABIgQgAkcNAEGDASEQDOECCyACIARrIAAoAgAiAWohECAEIAFrQQJqIRQCQANAIAQtAAAgAUGAz4CAAGotAABHDckBIAFBAkYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgEDYCAEGDASEQDOECC0EAIRAgAEEANgIAIBRBAWohAQzGAQsCQCABIgQgAkcNAEGEASEQDOACCyACIARrIAAoAgAiAWohFCAEIAFrQQRqIRACQANAIAQtAAAgAUGDz4CAAGotAABHDcgBIAFBBEYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEGEASEQDOACCyAAQQA2AgAgEEEBaiEBQSMhEAzFAQsCQCABIgQgAkcNAEGFASEQDN8CCwJAAkAgBC0AAEG0f2oOCADIAcgByAHIAcgByAEByAELIARBAWohAUHvACEQDMYCCyAEQQFqIQFB8AAhEAzFAgsCQCABIgQgAkcNAEGGASEQDN4CCyAELQAAQcUARw3FASAEQQFqIQEMgwILAkAgASIEIAJHDQBBhwEhEAzdAgsgAiAEayAAKAIAIgFqIRQgBCABa0EDaiEQAkADQCAELQAAIAFBiM+AgABqLQAARw3FASABQQNGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBBhwEhEAzdAgsgAEEANgIAIBBBAWohAUEtIRAMwgELAkAgASIEIAJHDQBBiAEhEAzcAgsgAiAEayAAKAIAIgFqIRQgBCABa0EIaiEQAkADQCAELQAAIAFB0M+AgABqLQAARw3EASABQQhGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBBiAEhEAzcAgsgAEEANgIAIBBBAWohAUEpIRAMwQELAkAgASIBIAJHDQBBiQEhEAzbAgtBASEQIAEtAABB3wBHDcABIAFBAWohAQyBAgsCQCABIgQgAkcNAEGKASEQDNoCCyACIARrIAAoAgAiAWohFCAEIAFrQQFqIRADQCAELQAAIAFBjM+AgABqLQAARw3BASABQQFGDa8CIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQYoBIRAM2QILAkAgASIEIAJHDQBBiwEhEAzZAgsgAiAEayAAKAIAIgFqIRQgBCABa0ECaiEQAkADQCAELQAAIAFBjs+AgABqLQAARw3BASABQQJGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBBiwEhEAzZAgsgAEEANgIAIBBBAWohAUECIRAMvgELAkAgASIEIAJHDQBBjAEhEAzYAgsgAiAEayAAKAIAIgFqIRQgBCABa0EBaiEQAkADQCAELQAAIAFB8M+AgABqLQAARw3AASABQQFGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBBjAEhEAzYAgsgAEEANgIAIBBBAWohAUEfIRAMvQELAkAgASIEIAJHDQBBjQEhEAzXAgsgAiAEayAAKAIAIgFqIRQgBCABa0EBaiEQAkADQCAELQAAIAFB8s+AgABqLQAARw2/ASABQQFGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBBjQEhEAzXAgsgAEEANgIAIBBBAWohAUEJIRAMvAELAkAgASIEIAJHDQBBjgEhEAzWAgsCQAJAIAQtAABBt39qDgcAvwG/Ab8BvwG/AQG/AQsgBEEBaiEBQfgAIRAMvQILIARBAWohAUH5ACEQDLwCCwJAIAEiBCACRw0AQY8BIRAM1QILIAIgBGsgACgCACIBaiEUIAQgAWtBBWohEAJAA0AgBC0AACABQZHPgIAAai0AAEcNvQEgAUEFRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQY8BIRAM1QILIABBADYCACAQQQFqIQFBGCEQDLoBCwJAIAEiBCACRw0AQZABIRAM1AILIAIgBGsgACgCACIBaiEUIAQgAWtBAmohEAJAA0AgBC0AACABQZfPgIAAai0AAEcNvAEgAUECRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQZABIRAM1AILIABBADYCACAQQQFqIQFBFyEQDLkBCwJAIAEiBCACRw0AQZEBIRAM0wILIAIgBGsgACgCACIBaiEUIAQgAWtBBmohEAJAA0AgBC0AACABQZrPgIAAai0AAEcNuwEgAUEGRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQZEBIRAM0wILIABBADYCACAQQQFqIQFBFSEQDLgBCwJAIAEiBCACRw0AQZIBIRAM0gILIAIgBGsgACgCACIBaiEUIAQgAWtBBWohEAJAA0AgBC0AACABQaHPgIAAai0AAEcNugEgAUEFRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQZIBIRAM0gILIABBADYCACAQQQFqIQFBHiEQDLcBCwJAIAEiBCACRw0AQZMBIRAM0QILIAQtAABBzABHDbgBIARBAWohAUEKIRAMtgELAkAgBCACRw0AQZQBIRAM0AILAkACQCAELQAAQb9/ag4PALkBuQG5AbkBuQG5AbkBuQG5AbkBuQG5AbkBAbkBCyAEQQFqIQFB/gAhEAy3AgsgBEEBaiEBQf8AIRAMtgILAkAgBCACRw0AQZUBIRAMzwILAkACQCAELQAAQb9/ag4DALgBAbgBCyAEQQFqIQFB/QAhEAy2AgsgBEEBaiEEQYABIRAMtQILAkAgBCACRw0AQZYBIRAMzgILIAIgBGsgACgCACIBaiEUIAQgAWtBAWohEAJAA0AgBC0AACABQafPgIAAai0AAEcNtgEgAUEBRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQZYBIRAMzgILIABBADYCACAQQQFqIQFBCyEQDLMBCwJAIAQgAkcNAEGXASEQDM0CCwJAAkACQAJAIAQtAABBU2oOIwC4AbgBuAG4AbgBuAG4AbgBuAG4AbgBuAG4AbgBuAG4AbgBuAG4AbgBuAG4AbgBAbgBuAG4AbgBuAECuAG4AbgBA7gBCyAEQQFqIQFB+wAhEAy2AgsgBEEBaiEBQfwAIRAMtQILIARBAWohBEGBASEQDLQCCyAEQQFqIQRBggEhEAyzAgsCQCAEIAJHDQBBmAEhEAzMAgsgAiAEayAAKAIAIgFqIRQgBCABa0EEaiEQAkADQCAELQAAIAFBqc+AgABqLQAARw20ASABQQRGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBBmAEhEAzMAgsgAEEANgIAIBBBAWohAUEZIRAMsQELAkAgBCACRw0AQZkBIRAMywILIAIgBGsgACgCACIBaiEUIAQgAWtBBWohEAJAA0AgBC0AACABQa7PgIAAai0AAEcNswEgAUEFRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQZkBIRAMywILIABBADYCACAQQQFqIQFBBiEQDLABCwJAIAQgAkcNAEGaASEQDMoCCyACIARrIAAoAgAiAWohFCAEIAFrQQFqIRACQANAIAQtAAAgAUG0z4CAAGotAABHDbIBIAFBAUYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEGaASEQDMoCCyAAQQA2AgAgEEEBaiEBQRwhEAyvAQsCQCAEIAJHDQBBmwEhEAzJAgsgAiAEayAAKAIAIgFqIRQgBCABa0EBaiEQAkADQCAELQAAIAFBts+AgABqLQAARw2xASABQQFGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBBmwEhEAzJAgsgAEEANgIAIBBBAWohAUEnIRAMrgELAkAgBCACRw0AQZwBIRAMyAILAkACQCAELQAAQax/ag4CAAGxAQsgBEEBaiEEQYYBIRAMrwILIARBAWohBEGHASEQDK4CCwJAIAQgAkcNAEGdASEQDMcCCyACIARrIAAoAgAiAWohFCAEIAFrQQFqIRACQANAIAQtAAAgAUG4z4CAAGotAABHDa8BIAFBAUYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEGdASEQDMcCCyAAQQA2AgAgEEEBaiEBQSYhEAysAQsCQCAEIAJHDQBBngEhEAzGAgsgAiAEayAAKAIAIgFqIRQgBCABa0EBaiEQAkADQCAELQAAIAFBus+AgABqLQAARw2uASABQQFGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBBngEhEAzGAgsgAEEANgIAIBBBAWohAUEDIRAMqwELAkAgBCACRw0AQZ8BIRAMxQILIAIgBGsgACgCACIBaiEUIAQgAWtBAmohEAJAA0AgBC0AACABQe3PgIAAai0AAEcNrQEgAUECRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQZ8BIRAMxQILIABBADYCACAQQQFqIQFBDCEQDKoBCwJAIAQgAkcNAEGgASEQDMQCCyACIARrIAAoAgAiAWohFCAEIAFrQQNqIRACQANAIAQtAAAgAUG8z4CAAGotAABHDawBIAFBA0YNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEGgASEQDMQCCyAAQQA2AgAgEEEBaiEBQQ0hEAypAQsCQCAEIAJHDQBBoQEhEAzDAgsCQAJAIAQtAABBun9qDgsArAGsAawBrAGsAawBrAGsAawBAawBCyAEQQFqIQRBiwEhEAyqAgsgBEEBaiEEQYwBIRAMqQILAkAgBCACRw0AQaIBIRAMwgILIAQtAABB0ABHDakBIARBAWohBAzpAQsCQCAEIAJHDQBBowEhEAzBAgsCQAJAIAQtAABBt39qDgcBqgGqAaoBqgGqAQCqAQsgBEEBaiEEQY4BIRAMqAILIARBAWohAUEiIRAMpgELAkAgBCACRw0AQaQBIRAMwAILIAIgBGsgACgCACIBaiEUIAQgAWtBAWohEAJAA0AgBC0AACABQcDPgIAAai0AAEcNqAEgAUEBRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQaQBIRAMwAILIABBADYCACAQQQFqIQFBHSEQDKUBCwJAIAQgAkcNAEGlASEQDL8CCwJAAkAgBC0AAEGuf2oOAwCoAQGoAQsgBEEBaiEEQZABIRAMpgILIARBAWohAUEEIRAMpAELAkAgBCACRw0AQaYBIRAMvgILAkACQAJAAkACQCAELQAAQb9/ag4VAKoBqgGqAaoBqgGqAaoBqgGqAaoBAaoBqgECqgGqAQOqAaoBBKoBCyAEQQFqIQRBiAEhEAyoAgsgBEEBaiEEQYkBIRAMpwILIARBAWohBEGKASEQDKYCCyAEQQFqIQRBjwEhEAylAgsgBEEBaiEEQZEBIRAMpAILAkAgBCACRw0AQacBIRAMvQILIAIgBGsgACgCACIBaiEUIAQgAWtBAmohEAJAA0AgBC0AACABQe3PgIAAai0AAEcNpQEgAUECRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQacBIRAMvQILIABBADYCACAQQQFqIQFBESEQDKIBCwJAIAQgAkcNAEGoASEQDLwCCyACIARrIAAoAgAiAWohFCAEIAFrQQJqIRACQANAIAQtAAAgAUHCz4CAAGotAABHDaQBIAFBAkYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEGoASEQDLwCCyAAQQA2AgAgEEEBaiEBQSwhEAyhAQsCQCAEIAJHDQBBqQEhEAy7AgsgAiAEayAAKAIAIgFqIRQgBCABa0EEaiEQAkADQCAELQAAIAFBxc+AgABqLQAARw2jASABQQRGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBBqQEhEAy7AgsgAEEANgIAIBBBAWohAUErIRAMoAELAkAgBCACRw0AQaoBIRAMugILIAIgBGsgACgCACIBaiEUIAQgAWtBAmohEAJAA0AgBC0AACABQcrPgIAAai0AAEcNogEgAUECRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQaoBIRAMugILIABBADYCACAQQQFqIQFBFCEQDJ8BCwJAIAQgAkcNAEGrASEQDLkCCwJAAkACQAJAIAQtAABBvn9qDg8AAQKkAaQBpAGkAaQBpAGkAaQBpAGkAaQBA6QBCyAEQQFqIQRBkwEhEAyiAgsgBEEBaiEEQZQBIRAMoQILIARBAWohBEGVASEQDKACCyAEQQFqIQRBlgEhEAyfAgsCQCAEIAJHDQBBrAEhEAy4AgsgBC0AAEHFAEcNnwEgBEEBaiEEDOABCwJAIAQgAkcNAEGtASEQDLcCCyACIARrIAAoAgAiAWohFCAEIAFrQQJqIRACQANAIAQtAAAgAUHNz4CAAGotAABHDZ8BIAFBAkYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEGtASEQDLcCCyAAQQA2AgAgEEEBaiEBQQ4hEAycAQsCQCAEIAJHDQBBrgEhEAy2AgsgBC0AAEHQAEcNnQEgBEEBaiEBQSUhEAybAQsCQCAEIAJHDQBBrwEhEAy1AgsgAiAEayAAKAIAIgFqIRQgBCABa0EIaiEQAkADQCAELQAAIAFB0M+AgABqLQAARw2dASABQQhGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBBrwEhEAy1AgsgAEEANgIAIBBBAWohAUEqIRAMmgELAkAgBCACRw0AQbABIRAMtAILAkACQCAELQAAQat/ag4LAJ0BnQGdAZ0BnQGdAZ0BnQGdAQGdAQsgBEEBaiEEQZoBIRAMmwILIARBAWohBEGbASEQDJoCCwJAIAQgAkcNAEGxASEQDLMCCwJAAkAgBC0AAEG/f2oOFACcAZwBnAGcAZwBnAGcAZwBnAGcAZwBnAGcAZwBnAGcAZwBnAEBnAELIARBAWohBEGZASEQDJoCCyAEQQFqIQRBnAEhEAyZAgsCQCAEIAJHDQBBsgEhEAyyAgsgAiAEayAAKAIAIgFqIRQgBCABa0EDaiEQAkADQCAELQAAIAFB2c+AgABqLQAARw2aASABQQNGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBBsgEhEAyyAgsgAEEANgIAIBBBAWohAUEhIRAMlwELAkAgBCACRw0AQbMBIRAMsQILIAIgBGsgACgCACIBaiEUIAQgAWtBBmohEAJAA0AgBC0AACABQd3PgIAAai0AAEcNmQEgAUEGRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQbMBIRAMsQILIABBADYCACAQQQFqIQFBGiEQDJYBCwJAIAQgAkcNAEG0ASEQDLACCwJAAkACQCAELQAAQbt/ag4RAJoBmgGaAZoBmgGaAZoBmgGaAQGaAZoBmgGaAZoBApoBCyAEQQFqIQRBnQEhEAyYAgsgBEEBaiEEQZ4BIRAMlwILIARBAWohBEGfASEQDJYCCwJAIAQgAkcNAEG1ASEQDK8CCyACIARrIAAoAgAiAWohFCAEIAFrQQVqIRACQANAIAQtAAAgAUHkz4CAAGotAABHDZcBIAFBBUYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEG1ASEQDK8CCyAAQQA2AgAgEEEBaiEBQSghEAyUAQsCQCAEIAJHDQBBtgEhEAyuAgsgAiAEayAAKAIAIgFqIRQgBCABa0ECaiEQAkADQCAELQAAIAFB6s+AgABqLQAARw2WASABQQJGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBBtgEhEAyuAgsgAEEANgIAIBBBAWohAUEHIRAMkwELAkAgBCACRw0AQbcBIRAMrQILAkACQCAELQAAQbt/ag4OAJYBlgGWAZYBlgGWAZYBlgGWAZYBlgGWAQGWAQsgBEEBaiEEQaEBIRAMlAILIARBAWohBEGiASEQDJMCCwJAIAQgAkcNAEG4ASEQDKwCCyACIARrIAAoAgAiAWohFCAEIAFrQQJqIRACQANAIAQtAAAgAUHtz4CAAGotAABHDZQBIAFBAkYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEG4ASEQDKwCCyAAQQA2AgAgEEEBaiEBQRIhEAyRAQsCQCAEIAJHDQBBuQEhEAyrAgsgAiAEayAAKAIAIgFqIRQgBCABa0EBaiEQAkADQCAELQAAIAFB8M+AgABqLQAARw2TASABQQFGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBBuQEhEAyrAgsgAEEANgIAIBBBAWohAUEgIRAMkAELAkAgBCACRw0AQboBIRAMqgILIAIgBGsgACgCACIBaiEUIAQgAWtBAWohEAJAA0AgBC0AACABQfLPgIAAai0AAEcNkgEgAUEBRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQboBIRAMqgILIABBADYCACAQQQFqIQFBDyEQDI8BCwJAIAQgAkcNAEG7ASEQDKkCCwJAAkAgBC0AAEG3f2oOBwCSAZIBkgGSAZIBAZIBCyAEQQFqIQRBpQEhEAyQAgsgBEEBaiEEQaYBIRAMjwILAkAgBCACRw0AQbwBIRAMqAILIAIgBGsgACgCACIBaiEUIAQgAWtBB2ohEAJAA0AgBC0AACABQfTPgIAAai0AAEcNkAEgAUEHRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQbwBIRAMqAILIABBADYCACAQQQFqIQFBGyEQDI0BCwJAIAQgAkcNAEG9ASEQDKcCCwJAAkACQCAELQAAQb5/ag4SAJEBkQGRAZEBkQGRAZEBkQGRAQGRAZEBkQGRAZEBkQECkQELIARBAWohBEGkASEQDI8CCyAEQQFqIQRBpwEhEAyOAgsgBEEBaiEEQagBIRAMjQILAkAgBCACRw0AQb4BIRAMpgILIAQtAABBzgBHDY0BIARBAWohBAzPAQsCQCAEIAJHDQBBvwEhEAylAgsCQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCAELQAAQb9/ag4VAAECA5wBBAUGnAGcAZwBBwgJCgucAQwNDg+cAQsgBEEBaiEBQegAIRAMmgILIARBAWohAUHpACEQDJkCCyAEQQFqIQFB7gAhEAyYAgsgBEEBaiEBQfIAIRAMlwILIARBAWohAUHzACEQDJYCCyAEQQFqIQFB9gAhEAyVAgsgBEEBaiEBQfcAIRAMlAILIARBAWohAUH6ACEQDJMCCyAEQQFqIQRBgwEhEAySAgsgBEEBaiEEQYQBIRAMkQILIARBAWohBEGFASEQDJACCyAEQQFqIQRBkgEhEAyPAgsgBEEBaiEEQZgBIRAMjgILIARBAWohBEGgASEQDI0CCyAEQQFqIQRBowEhEAyMAgsgBEEBaiEEQaoBIRAMiwILAkAgBCACRg0AIABBkICAgAA2AgggACAENgIEQasBIRAMiwILQcABIRAMowILIAAgBSACEKqAgIAAIgENiwEgBSEBDFwLAkAgBiACRg0AIAZBAWohBQyNAQtBwgEhEAyhAgsDQAJAIBAtAABBdmoOBIwBAACPAQALIBBBAWoiECACRw0AC0HDASEQDKACCwJAIAcgAkYNACAAQZGAgIAANgIIIAAgBzYCBCAHIQFBASEQDIcCC0HEASEQDJ8CCwJAIAcgAkcNAEHFASEQDJ8CCwJAAkAgBy0AAEF2ag4EAc4BzgEAzgELIAdBAWohBgyNAQsgB0EBaiEFDIkBCwJAIAcgAkcNAEHGASEQDJ4CCwJAAkAgBy0AAEF2ag4XAY8BjwEBjwGPAY8BjwGPAY8BjwGPAY8BjwGPAY8BjwGPAY8BjwGPAY8BAI8BCyAHQQFqIQcLQbABIRAMhAILAkAgCCACRw0AQcgBIRAMnQILIAgtAABBIEcNjQEgAEEAOwEyIAhBAWohAUGzASEQDIMCCyABIRcCQANAIBciByACRg0BIActAABBUGpB/wFxIhBBCk8NzAECQCAALwEyIhRBmTNLDQAgACAUQQpsIhQ7ATIgEEH//wNzIBRB/v8DcUkNACAHQQFqIRcgACAUIBBqIhA7ATIgEEH//wNxQegHSQ0BCwtBACEQIABBADYCHCAAQcGJgIAANgIQIABBDTYCDCAAIAdBAWo2AhQMnAILQccBIRAMmwILIAAgCCACEK6AgIAAIhBFDcoBIBBBFUcNjAEgAEHIATYCHCAAIAg2AhQgAEHJl4CAADYCECAAQRU2AgxBACEQDJoCCwJAIAkgAkcNAEHMASEQDJoCC0EAIRRBASEXQQEhFkEAIRACQAJAAkACQAJAAkACQAJAAkAgCS0AAEFQag4KlgGVAQABAgMEBQYIlwELQQIhEAwGC0EDIRAMBQtBBCEQDAQLQQUhEAwDC0EGIRAMAgtBByEQDAELQQghEAtBACEXQQAhFkEAIRQMjgELQQkhEEEBIRRBACEXQQAhFgyNAQsCQCAKIAJHDQBBzgEhEAyZAgsgCi0AAEEuRw2OASAKQQFqIQkMygELIAsgAkcNjgFB0AEhEAyXAgsCQCALIAJGDQAgAEGOgICAADYCCCAAIAs2AgRBtwEhEAz+AQtB0QEhEAyWAgsCQCAEIAJHDQBB0gEhEAyWAgsgAiAEayAAKAIAIhBqIRQgBCAQa0EEaiELA0AgBC0AACAQQfzPgIAAai0AAEcNjgEgEEEERg3pASAQQQFqIRAgBEEBaiIEIAJHDQALIAAgFDYCAEHSASEQDJUCCyAAIAwgAhCsgICAACIBDY0BIAwhAQy4AQsCQCAEIAJHDQBB1AEhEAyUAgsgAiAEayAAKAIAIhBqIRQgBCAQa0EBaiEMA0AgBC0AACAQQYHQgIAAai0AAEcNjwEgEEEBRg2OASAQQQFqIRAgBEEBaiIEIAJHDQALIAAgFDYCAEHUASEQDJMCCwJAIAQgAkcNAEHWASEQDJMCCyACIARrIAAoAgAiEGohFCAEIBBrQQJqIQsDQCAELQAAIBBBg9CAgABqLQAARw2OASAQQQJGDZABIBBBAWohECAEQQFqIgQgAkcNAAsgACAUNgIAQdYBIRAMkgILAkAgBCACRw0AQdcBIRAMkgILAkACQCAELQAAQbt/ag4QAI8BjwGPAY8BjwGPAY8BjwGPAY8BjwGPAY8BjwEBjwELIARBAWohBEG7ASEQDPkBCyAEQQFqIQRBvAEhEAz4AQsCQCAEIAJHDQBB2AEhEAyRAgsgBC0AAEHIAEcNjAEgBEEBaiEEDMQBCwJAIAQgAkYNACAAQZCAgIAANgIIIAAgBDYCBEG+ASEQDPcBC0HZASEQDI8CCwJAIAQgAkcNAEHaASEQDI8CCyAELQAAQcgARg3DASAAQQE6ACgMuQELIABBAjoALyAAIAQgAhCmgICAACIQDY0BQcIBIRAM9AELIAAtAChBf2oOArcBuQG4AQsDQAJAIAQtAABBdmoOBACOAY4BAI4BCyAEQQFqIgQgAkcNAAtB3QEhEAyLAgsgAEEAOgAvIAAtAC1BBHFFDYQCCyAAQQA6AC8gAEEBOgA0IAEhAQyMAQsgEEEVRg3aASAAQQA2AhwgACABNgIUIABBp46AgAA2AhAgAEESNgIMQQAhEAyIAgsCQCAAIBAgAhC0gICAACIEDQAgECEBDIECCwJAIARBFUcNACAAQQM2AhwgACAQNgIUIABBsJiAgAA2AhAgAEEVNgIMQQAhEAyIAgsgAEEANgIcIAAgEDYCFCAAQaeOgIAANgIQIABBEjYCDEEAIRAMhwILIBBBFUYN1gEgAEEANgIcIAAgATYCFCAAQdqNgIAANgIQIABBFDYCDEEAIRAMhgILIAAoAgQhFyAAQQA2AgQgECARp2oiFiEBIAAgFyAQIBYgFBsiEBC1gICAACIURQ2NASAAQQc2AhwgACAQNgIUIAAgFDYCDEEAIRAMhQILIAAgAC8BMEGAAXI7ATAgASEBC0EqIRAM6gELIBBBFUYN0QEgAEEANgIcIAAgATYCFCAAQYOMgIAANgIQIABBEzYCDEEAIRAMggILIBBBFUYNzwEgAEEANgIcIAAgATYCFCAAQZqPgIAANgIQIABBIjYCDEEAIRAMgQILIAAoAgQhECAAQQA2AgQCQCAAIBAgARC3gICAACIQDQAgAUEBaiEBDI0BCyAAQQw2AhwgACAQNgIMIAAgAUEBajYCFEEAIRAMgAILIBBBFUYNzAEgAEEANgIcIAAgATYCFCAAQZqPgIAANgIQIABBIjYCDEEAIRAM/wELIAAoAgQhECAAQQA2AgQCQCAAIBAgARC3gICAACIQDQAgAUEBaiEBDIwBCyAAQQ02AhwgACAQNgIMIAAgAUEBajYCFEEAIRAM/gELIBBBFUYNyQEgAEEANgIcIAAgATYCFCAAQcaMgIAANgIQIABBIzYCDEEAIRAM/QELIAAoAgQhECAAQQA2AgQCQCAAIBAgARC5gICAACIQDQAgAUEBaiEBDIsBCyAAQQ42AhwgACAQNgIMIAAgAUEBajYCFEEAIRAM/AELIABBADYCHCAAIAE2AhQgAEHAlYCAADYCECAAQQI2AgxBACEQDPsBCyAQQRVGDcUBIABBADYCHCAAIAE2AhQgAEHGjICAADYCECAAQSM2AgxBACEQDPoBCyAAQRA2AhwgACABNgIUIAAgEDYCDEEAIRAM+QELIAAoAgQhBCAAQQA2AgQCQCAAIAQgARC5gICAACIEDQAgAUEBaiEBDPEBCyAAQRE2AhwgACAENgIMIAAgAUEBajYCFEEAIRAM+AELIBBBFUYNwQEgAEEANgIcIAAgATYCFCAAQcaMgIAANgIQIABBIzYCDEEAIRAM9wELIAAoAgQhECAAQQA2AgQCQCAAIBAgARC5gICAACIQDQAgAUEBaiEBDIgBCyAAQRM2AhwgACAQNgIMIAAgAUEBajYCFEEAIRAM9gELIAAoAgQhBCAAQQA2AgQCQCAAIAQgARC5gICAACIEDQAgAUEBaiEBDO0BCyAAQRQ2AhwgACAENgIMIAAgAUEBajYCFEEAIRAM9QELIBBBFUYNvQEgAEEANgIcIAAgATYCFCAAQZqPgIAANgIQIABBIjYCDEEAIRAM9AELIAAoAgQhECAAQQA2AgQCQCAAIBAgARC3gICAACIQDQAgAUEBaiEBDIYBCyAAQRY2AhwgACAQNgIMIAAgAUEBajYCFEEAIRAM8wELIAAoAgQhBCAAQQA2AgQCQCAAIAQgARC3gICAACIEDQAgAUEBaiEBDOkBCyAAQRc2AhwgACAENgIMIAAgAUEBajYCFEEAIRAM8gELIABBADYCHCAAIAE2AhQgAEHNk4CAADYCECAAQQw2AgxBACEQDPEBC0IBIRELIBBBAWohAQJAIAApAyAiEkL//////////w9WDQAgACASQgSGIBGENwMgIAEhAQyEAQsgAEEANgIcIAAgATYCFCAAQa2JgIAANgIQIABBDDYCDEEAIRAM7wELIABBADYCHCAAIBA2AhQgAEHNk4CAADYCECAAQQw2AgxBACEQDO4BCyAAKAIEIRcgAEEANgIEIBAgEadqIhYhASAAIBcgECAWIBQbIhAQtYCAgAAiFEUNcyAAQQU2AhwgACAQNgIUIAAgFDYCDEEAIRAM7QELIABBADYCHCAAIBA2AhQgAEGqnICAADYCECAAQQ82AgxBACEQDOwBCyAAIBAgAhC0gICAACIBDQEgECEBC0EOIRAM0QELAkAgAUEVRw0AIABBAjYCHCAAIBA2AhQgAEGwmICAADYCECAAQRU2AgxBACEQDOoBCyAAQQA2AhwgACAQNgIUIABBp46AgAA2AhAgAEESNgIMQQAhEAzpAQsgAUEBaiEQAkAgAC8BMCIBQYABcUUNAAJAIAAgECACELuAgIAAIgENACAQIQEMcAsgAUEVRw26ASAAQQU2AhwgACAQNgIUIABB+ZeAgAA2AhAgAEEVNgIMQQAhEAzpAQsCQCABQaAEcUGgBEcNACAALQAtQQJxDQAgAEEANgIcIAAgEDYCFCAAQZaTgIAANgIQIABBBDYCDEEAIRAM6QELIAAgECACEL2AgIAAGiAQIQECQAJAAkACQAJAIAAgECACELOAgIAADhYCAQAEBAQEBAQEBAQEBAQEBAQEBAQDBAsgAEEBOgAuCyAAIAAvATBBwAByOwEwIBAhAQtBJiEQDNEBCyAAQSM2AhwgACAQNgIUIABBpZaAgAA2AhAgAEEVNgIMQQAhEAzpAQsgAEEANgIcIAAgEDYCFCAAQdWLgIAANgIQIABBETYCDEEAIRAM6AELIAAtAC1BAXFFDQFBwwEhEAzOAQsCQCANIAJGDQADQAJAIA0tAABBIEYNACANIQEMxAELIA1BAWoiDSACRw0AC0ElIRAM5wELQSUhEAzmAQsgACgCBCEEIABBADYCBCAAIAQgDRCvgICAACIERQ2tASAAQSY2AhwgACAENgIMIAAgDUEBajYCFEEAIRAM5QELIBBBFUYNqwEgAEEANgIcIAAgATYCFCAAQf2NgIAANgIQIABBHTYCDEEAIRAM5AELIABBJzYCHCAAIAE2AhQgACAQNgIMQQAhEAzjAQsgECEBQQEhFAJAAkACQAJAAkACQAJAIAAtACxBfmoOBwYFBQMBAgAFCyAAIAAvATBBCHI7ATAMAwtBAiEUDAELQQQhFAsgAEEBOgAsIAAgAC8BMCAUcjsBMAsgECEBC0ErIRAMygELIABBADYCHCAAIBA2AhQgAEGrkoCAADYCECAAQQs2AgxBACEQDOIBCyAAQQA2AhwgACABNgIUIABB4Y+AgAA2AhAgAEEKNgIMQQAhEAzhAQsgAEEAOgAsIBAhAQy9AQsgECEBQQEhFAJAAkACQAJAAkAgAC0ALEF7ag4EAwECAAULIAAgAC8BMEEIcjsBMAwDC0ECIRQMAQtBBCEUCyAAQQE6ACwgACAALwEwIBRyOwEwCyAQIQELQSkhEAzFAQsgAEEANgIcIAAgATYCFCAAQfCUgIAANgIQIABBAzYCDEEAIRAM3QELAkAgDi0AAEENRw0AIAAoAgQhASAAQQA2AgQCQCAAIAEgDhCxgICAACIBDQAgDkEBaiEBDHULIABBLDYCHCAAIAE2AgwgACAOQQFqNgIUQQAhEAzdAQsgAC0ALUEBcUUNAUHEASEQDMMBCwJAIA4gAkcNAEEtIRAM3AELAkACQANAAkAgDi0AAEF2ag4EAgAAAwALIA5BAWoiDiACRw0AC0EtIRAM3QELIAAoAgQhASAAQQA2AgQCQCAAIAEgDhCxgICAACIBDQAgDiEBDHQLIABBLDYCHCAAIA42AhQgACABNgIMQQAhEAzcAQsgACgCBCEBIABBADYCBAJAIAAgASAOELGAgIAAIgENACAOQQFqIQEMcwsgAEEsNgIcIAAgATYCDCAAIA5BAWo2AhRBACEQDNsBCyAAKAIEIQQgAEEANgIEIAAgBCAOELGAgIAAIgQNoAEgDiEBDM4BCyAQQSxHDQEgAUEBaiEQQQEhAQJAAkACQAJAAkAgAC0ALEF7ag4EAwECBAALIBAhAQwEC0ECIQEMAQtBBCEBCyAAQQE6ACwgACAALwEwIAFyOwEwIBAhAQwBCyAAIAAvATBBCHI7ATAgECEBC0E5IRAMvwELIABBADoALCABIQELQTQhEAy9AQsgACAALwEwQSByOwEwIAEhAQwCCyAAKAIEIQQgAEEANgIEAkAgACAEIAEQsYCAgAAiBA0AIAEhAQzHAQsgAEE3NgIcIAAgATYCFCAAIAQ2AgxBACEQDNQBCyAAQQg6ACwgASEBC0EwIRAMuQELAkAgAC0AKEEBRg0AIAEhAQwECyAALQAtQQhxRQ2TASABIQEMAwsgAC0AMEEgcQ2UAUHFASEQDLcBCwJAIA8gAkYNAAJAA0ACQCAPLQAAQVBqIgFB/wFxQQpJDQAgDyEBQTUhEAy6AQsgACkDICIRQpmz5syZs+bMGVYNASAAIBFCCn4iETcDICARIAGtQv8BgyISQn+FVg0BIAAgESASfDcDICAPQQFqIg8gAkcNAAtBOSEQDNEBCyAAKAIEIQIgAEEANgIEIAAgAiAPQQFqIgQQsYCAgAAiAg2VASAEIQEMwwELQTkhEAzPAQsCQCAALwEwIgFBCHFFDQAgAC0AKEEBRw0AIAAtAC1BCHFFDZABCyAAIAFB9/sDcUGABHI7ATAgDyEBC0E3IRAMtAELIAAgAC8BMEEQcjsBMAyrAQsgEEEVRg2LASAAQQA2AhwgACABNgIUIABB8I6AgAA2AhAgAEEcNgIMQQAhEAzLAQsgAEHDADYCHCAAIAE2AgwgACANQQFqNgIUQQAhEAzKAQsCQCABLQAAQTpHDQAgACgCBCEQIABBADYCBAJAIAAgECABEK+AgIAAIhANACABQQFqIQEMYwsgAEHDADYCHCAAIBA2AgwgACABQQFqNgIUQQAhEAzKAQsgAEEANgIcIAAgATYCFCAAQbGRgIAANgIQIABBCjYCDEEAIRAMyQELIABBADYCHCAAIAE2AhQgAEGgmYCAADYCECAAQR42AgxBACEQDMgBCyAAQQA2AgALIABBgBI7ASogACAXQQFqIgEgAhCogICAACIQDQEgASEBC0HHACEQDKwBCyAQQRVHDYMBIABB0QA2AhwgACABNgIUIABB45eAgAA2AhAgAEEVNgIMQQAhEAzEAQsgACgCBCEQIABBADYCBAJAIAAgECABEKeAgIAAIhANACABIQEMXgsgAEHSADYCHCAAIAE2AhQgACAQNgIMQQAhEAzDAQsgAEEANgIcIAAgFDYCFCAAQcGogIAANgIQIABBBzYCDCAAQQA2AgBBACEQDMIBCyAAKAIEIRAgAEEANgIEAkAgACAQIAEQp4CAgAAiEA0AIAEhAQxdCyAAQdMANgIcIAAgATYCFCAAIBA2AgxBACEQDMEBC0EAIRAgAEEANgIcIAAgATYCFCAAQYCRgIAANgIQIABBCTYCDAzAAQsgEEEVRg19IABBADYCHCAAIAE2AhQgAEGUjYCAADYCECAAQSE2AgxBACEQDL8BC0EBIRZBACEXQQAhFEEBIRALIAAgEDoAKyABQQFqIQECQAJAIAAtAC1BEHENAAJAAkACQCAALQAqDgMBAAIECyAWRQ0DDAILIBQNAQwCCyAXRQ0BCyAAKAIEIRAgAEEANgIEAkAgACAQIAEQrYCAgAAiEA0AIAEhAQxcCyAAQdgANgIcIAAgATYCFCAAIBA2AgxBACEQDL4BCyAAKAIEIQQgAEEANgIEAkAgACAEIAEQrYCAgAAiBA0AIAEhAQytAQsgAEHZADYCHCAAIAE2AhQgACAENgIMQQAhEAy9AQsgACgCBCEEIABBADYCBAJAIAAgBCABEK2AgIAAIgQNACABIQEMqwELIABB2gA2AhwgACABNgIUIAAgBDYCDEEAIRAMvAELIAAoAgQhBCAAQQA2AgQCQCAAIAQgARCtgICAACIEDQAgASEBDKkBCyAAQdwANgIcIAAgATYCFCAAIAQ2AgxBACEQDLsBCwJAIAEtAABBUGoiEEH/AXFBCk8NACAAIBA6ACogAUEBaiEBQc8AIRAMogELIAAoAgQhBCAAQQA2AgQCQCAAIAQgARCtgICAACIEDQAgASEBDKcBCyAAQd4ANgIcIAAgATYCFCAAIAQ2AgxBACEQDLoBCyAAQQA2AgAgF0EBaiEBAkAgAC0AKUEjTw0AIAEhAQxZCyAAQQA2AhwgACABNgIUIABB04mAgAA2AhAgAEEINgIMQQAhEAy5AQsgAEEANgIAC0EAIRAgAEEANgIcIAAgATYCFCAAQZCzgIAANgIQIABBCDYCDAy3AQsgAEEANgIAIBdBAWohAQJAIAAtAClBIUcNACABIQEMVgsgAEEANgIcIAAgATYCFCAAQZuKgIAANgIQIABBCDYCDEEAIRAMtgELIABBADYCACAXQQFqIQECQCAALQApIhBBXWpBC08NACABIQEMVQsCQCAQQQZLDQBBASAQdEHKAHFFDQAgASEBDFULQQAhECAAQQA2AhwgACABNgIUIABB94mAgAA2AhAgAEEINgIMDLUBCyAQQRVGDXEgAEEANgIcIAAgATYCFCAAQbmNgIAANgIQIABBGjYCDEEAIRAMtAELIAAoAgQhECAAQQA2AgQCQCAAIBAgARCngICAACIQDQAgASEBDFQLIABB5QA2AhwgACABNgIUIAAgEDYCDEEAIRAMswELIAAoAgQhECAAQQA2AgQCQCAAIBAgARCngICAACIQDQAgASEBDE0LIABB0gA2AhwgACABNgIUIAAgEDYCDEEAIRAMsgELIAAoAgQhECAAQQA2AgQCQCAAIBAgARCngICAACIQDQAgASEBDE0LIABB0wA2AhwgACABNgIUIAAgEDYCDEEAIRAMsQELIAAoAgQhECAAQQA2AgQCQCAAIBAgARCngICAACIQDQAgASEBDFELIABB5QA2AhwgACABNgIUIAAgEDYCDEEAIRAMsAELIABBADYCHCAAIAE2AhQgAEHGioCAADYCECAAQQc2AgxBACEQDK8BCyAAKAIEIRAgAEEANgIEAkAgACAQIAEQp4CAgAAiEA0AIAEhAQxJCyAAQdIANgIcIAAgATYCFCAAIBA2AgxBACEQDK4BCyAAKAIEIRAgAEEANgIEAkAgACAQIAEQp4CAgAAiEA0AIAEhAQxJCyAAQdMANgIcIAAgATYCFCAAIBA2AgxBACEQDK0BCyAAKAIEIRAgAEEANgIEAkAgACAQIAEQp4CAgAAiEA0AIAEhAQxNCyAAQeUANgIcIAAgATYCFCAAIBA2AgxBACEQDKwBCyAAQQA2AhwgACABNgIUIABB3IiAgAA2AhAgAEEHNgIMQQAhEAyrAQsgEEE/Rw0BIAFBAWohAQtBBSEQDJABC0EAIRAgAEEANgIcIAAgATYCFCAAQf2SgIAANgIQIABBBzYCDAyoAQsgACgCBCEQIABBADYCBAJAIAAgECABEKeAgIAAIhANACABIQEMQgsgAEHSADYCHCAAIAE2AhQgACAQNgIMQQAhEAynAQsgACgCBCEQIABBADYCBAJAIAAgECABEKeAgIAAIhANACABIQEMQgsgAEHTADYCHCAAIAE2AhQgACAQNgIMQQAhEAymAQsgACgCBCEQIABBADYCBAJAIAAgECABEKeAgIAAIhANACABIQEMRgsgAEHlADYCHCAAIAE2AhQgACAQNgIMQQAhEAylAQsgACgCBCEBIABBADYCBAJAIAAgASAUEKeAgIAAIgENACAUIQEMPwsgAEHSADYCHCAAIBQ2AhQgACABNgIMQQAhEAykAQsgACgCBCEBIABBADYCBAJAIAAgASAUEKeAgIAAIgENACAUIQEMPwsgAEHTADYCHCAAIBQ2AhQgACABNgIMQQAhEAyjAQsgACgCBCEBIABBADYCBAJAIAAgASAUEKeAgIAAIgENACAUIQEMQwsgAEHlADYCHCAAIBQ2AhQgACABNgIMQQAhEAyiAQsgAEEANgIcIAAgFDYCFCAAQcOPgIAANgIQIABBBzYCDEEAIRAMoQELIABBADYCHCAAIAE2AhQgAEHDj4CAADYCECAAQQc2AgxBACEQDKABC0EAIRAgAEEANgIcIAAgFDYCFCAAQYycgIAANgIQIABBBzYCDAyfAQsgAEEANgIcIAAgFDYCFCAAQYycgIAANgIQIABBBzYCDEEAIRAMngELIABBADYCHCAAIBQ2AhQgAEH+kYCAADYCECAAQQc2AgxBACEQDJ0BCyAAQQA2AhwgACABNgIUIABBjpuAgAA2AhAgAEEGNgIMQQAhEAycAQsgEEEVRg1XIABBADYCHCAAIAE2AhQgAEHMjoCAADYCECAAQSA2AgxBACEQDJsBCyAAQQA2AgAgEEEBaiEBQSQhEAsgACAQOgApIAAoAgQhECAAQQA2AgQgACAQIAEQq4CAgAAiEA1UIAEhAQw+CyAAQQA2AgALQQAhECAAQQA2AhwgACAENgIUIABB8ZuAgAA2AhAgAEEGNgIMDJcBCyABQRVGDVAgAEEANgIcIAAgBTYCFCAAQfCMgIAANgIQIABBGzYCDEEAIRAMlgELIAAoAgQhBSAAQQA2AgQgACAFIBAQqYCAgAAiBQ0BIBBBAWohBQtBrQEhEAx7CyAAQcEBNgIcIAAgBTYCDCAAIBBBAWo2AhRBACEQDJMBCyAAKAIEIQYgAEEANgIEIAAgBiAQEKmAgIAAIgYNASAQQQFqIQYLQa4BIRAMeAsgAEHCATYCHCAAIAY2AgwgACAQQQFqNgIUQQAhEAyQAQsgAEEANgIcIAAgBzYCFCAAQZeLgIAANgIQIABBDTYCDEEAIRAMjwELIABBADYCHCAAIAg2AhQgAEHjkICAADYCECAAQQk2AgxBACEQDI4BCyAAQQA2AhwgACAINgIUIABBlI2AgAA2AhAgAEEhNgIMQQAhEAyNAQtBASEWQQAhF0EAIRRBASEQCyAAIBA6ACsgCUEBaiEIAkACQCAALQAtQRBxDQACQAJAAkAgAC0AKg4DAQACBAsgFkUNAwwCCyAUDQEMAgsgF0UNAQsgACgCBCEQIABBADYCBCAAIBAgCBCtgICAACIQRQ09IABByQE2AhwgACAINgIUIAAgEDYCDEEAIRAMjAELIAAoAgQhBCAAQQA2AgQgACAEIAgQrYCAgAAiBEUNdiAAQcoBNgIcIAAgCDYCFCAAIAQ2AgxBACEQDIsBCyAAKAIEIQQgAEEANgIEIAAgBCAJEK2AgIAAIgRFDXQgAEHLATYCHCAAIAk2AhQgACAENgIMQQAhEAyKAQsgACgCBCEEIABBADYCBCAAIAQgChCtgICAACIERQ1yIABBzQE2AhwgACAKNgIUIAAgBDYCDEEAIRAMiQELAkAgCy0AAEFQaiIQQf8BcUEKTw0AIAAgEDoAKiALQQFqIQpBtgEhEAxwCyAAKAIEIQQgAEEANgIEIAAgBCALEK2AgIAAIgRFDXAgAEHPATYCHCAAIAs2AhQgACAENgIMQQAhEAyIAQsgAEEANgIcIAAgBDYCFCAAQZCzgIAANgIQIABBCDYCDCAAQQA2AgBBACEQDIcBCyABQRVGDT8gAEEANgIcIAAgDDYCFCAAQcyOgIAANgIQIABBIDYCDEEAIRAMhgELIABBgQQ7ASggACgCBCEQIABCADcDACAAIBAgDEEBaiIMEKuAgIAAIhBFDTggAEHTATYCHCAAIAw2AhQgACAQNgIMQQAhEAyFAQsgAEEANgIAC0EAIRAgAEEANgIcIAAgBDYCFCAAQdibgIAANgIQIABBCDYCDAyDAQsgACgCBCEQIABCADcDACAAIBAgC0EBaiILEKuAgIAAIhANAUHGASEQDGkLIABBAjoAKAxVCyAAQdUBNgIcIAAgCzYCFCAAIBA2AgxBACEQDIABCyAQQRVGDTcgAEEANgIcIAAgBDYCFCAAQaSMgIAANgIQIABBEDYCDEEAIRAMfwsgAC0ANEEBRw00IAAgBCACELyAgIAAIhBFDTQgEEEVRw01IABB3AE2AhwgACAENgIUIABB1ZaAgAA2AhAgAEEVNgIMQQAhEAx+C0EAIRAgAEEANgIcIABBr4uAgAA2AhAgAEECNgIMIAAgFEEBajYCFAx9C0EAIRAMYwtBAiEQDGILQQ0hEAxhC0EPIRAMYAtBJSEQDF8LQRMhEAxeC0EVIRAMXQtBFiEQDFwLQRchEAxbC0EYIRAMWgtBGSEQDFkLQRohEAxYC0EbIRAMVwtBHCEQDFYLQR0hEAxVC0EfIRAMVAtBISEQDFMLQSMhEAxSC0HGACEQDFELQS4hEAxQC0EvIRAMTwtBOyEQDE4LQT0hEAxNC0HIACEQDEwLQckAIRAMSwtBywAhEAxKC0HMACEQDEkLQc4AIRAMSAtB0QAhEAxHC0HVACEQDEYLQdgAIRAMRQtB2QAhEAxEC0HbACEQDEMLQeQAIRAMQgtB5QAhEAxBC0HxACEQDEALQfQAIRAMPwtBjQEhEAw+C0GXASEQDD0LQakBIRAMPAtBrAEhEAw7C0HAASEQDDoLQbkBIRAMOQtBrwEhEAw4C0GxASEQDDcLQbIBIRAMNgtBtAEhEAw1C0G1ASEQDDQLQboBIRAMMwtBvQEhEAwyC0G/ASEQDDELQcEBIRAMMAsgAEEANgIcIAAgBDYCFCAAQemLgIAANgIQIABBHzYCDEEAIRAMSAsgAEHbATYCHCAAIAQ2AhQgAEH6loCAADYCECAAQRU2AgxBACEQDEcLIABB+AA2AhwgACAMNgIUIABBypiAgAA2AhAgAEEVNgIMQQAhEAxGCyAAQdEANgIcIAAgBTYCFCAAQbCXgIAANgIQIABBFTYCDEEAIRAMRQsgAEH5ADYCHCAAIAE2AhQgACAQNgIMQQAhEAxECyAAQfgANgIcIAAgATYCFCAAQcqYgIAANgIQIABBFTYCDEEAIRAMQwsgAEHkADYCHCAAIAE2AhQgAEHjl4CAADYCECAAQRU2AgxBACEQDEILIABB1wA2AhwgACABNgIUIABByZeAgAA2AhAgAEEVNgIMQQAhEAxBCyAAQQA2AhwgACABNgIUIABBuY2AgAA2AhAgAEEaNgIMQQAhEAxACyAAQcIANgIcIAAgATYCFCAAQeOYgIAANgIQIABBFTYCDEEAIRAMPwsgAEEANgIEIAAgDyAPELGAgIAAIgRFDQEgAEE6NgIcIAAgBDYCDCAAIA9BAWo2AhRBACEQDD4LIAAoAgQhBCAAQQA2AgQCQCAAIAQgARCxgICAACIERQ0AIABBOzYCHCAAIAQ2AgwgACABQQFqNgIUQQAhEAw+CyABQQFqIQEMLQsgD0EBaiEBDC0LIABBADYCHCAAIA82AhQgAEHkkoCAADYCECAAQQQ2AgxBACEQDDsLIABBNjYCHCAAIAQ2AhQgACACNgIMQQAhEAw6CyAAQS42AhwgACAONgIUIAAgBDYCDEEAIRAMOQsgAEHQADYCHCAAIAE2AhQgAEGRmICAADYCECAAQRU2AgxBACEQDDgLIA1BAWohAQwsCyAAQRU2AhwgACABNgIUIABBgpmAgAA2AhAgAEEVNgIMQQAhEAw2CyAAQRs2AhwgACABNgIUIABBkZeAgAA2AhAgAEEVNgIMQQAhEAw1CyAAQQ82AhwgACABNgIUIABBkZeAgAA2AhAgAEEVNgIMQQAhEAw0CyAAQQs2AhwgACABNgIUIABBkZeAgAA2AhAgAEEVNgIMQQAhEAwzCyAAQRo2AhwgACABNgIUIABBgpmAgAA2AhAgAEEVNgIMQQAhEAwyCyAAQQs2AhwgACABNgIUIABBgpmAgAA2AhAgAEEVNgIMQQAhEAwxCyAAQQo2AhwgACABNgIUIABB5JaAgAA2AhAgAEEVNgIMQQAhEAwwCyAAQR42AhwgACABNgIUIABB+ZeAgAA2AhAgAEEVNgIMQQAhEAwvCyAAQQA2AhwgACAQNgIUIABB2o2AgAA2AhAgAEEUNgIMQQAhEAwuCyAAQQQ2AhwgACABNgIUIABBsJiAgAA2AhAgAEEVNgIMQQAhEAwtCyAAQQA2AgAgC0EBaiELC0G4ASEQDBILIABBADYCACAQQQFqIQFB9QAhEAwRCyABIQECQCAALQApQQVHDQBB4wAhEAwRC0HiACEQDBALQQAhECAAQQA2AhwgAEHkkYCAADYCECAAQQc2AgwgACAUQQFqNgIUDCgLIABBADYCACAXQQFqIQFBwAAhEAwOC0EBIQELIAAgAToALCAAQQA2AgAgF0EBaiEBC0EoIRAMCwsgASEBC0E4IRAMCQsCQCABIg8gAkYNAANAAkAgDy0AAEGAvoCAAGotAAAiAUEBRg0AIAFBAkcNAyAPQQFqIQEMBAsgD0EBaiIPIAJHDQALQT4hEAwiC0E+IRAMIQsgAEEAOgAsIA8hAQwBC0ELIRAMBgtBOiEQDAULIAFBAWohAUEtIRAMBAsgACABOgAsIABBADYCACAWQQFqIQFBDCEQDAMLIABBADYCACAXQQFqIQFBCiEQDAILIABBADYCAAsgAEEAOgAsIA0hAUEJIRAMAAsLQQAhECAAQQA2AhwgACALNgIUIABBzZCAgAA2AhAgAEEJNgIMDBcLQQAhECAAQQA2AhwgACAKNgIUIABB6YqAgAA2AhAgAEEJNgIMDBYLQQAhECAAQQA2AhwgACAJNgIUIABBt5CAgAA2AhAgAEEJNgIMDBULQQAhECAAQQA2AhwgACAINgIUIABBnJGAgAA2AhAgAEEJNgIMDBQLQQAhECAAQQA2AhwgACABNgIUIABBzZCAgAA2AhAgAEEJNgIMDBMLQQAhECAAQQA2AhwgACABNgIUIABB6YqAgAA2AhAgAEEJNgIMDBILQQAhECAAQQA2AhwgACABNgIUIABBt5CAgAA2AhAgAEEJNgIMDBELQQAhECAAQQA2AhwgACABNgIUIABBnJGAgAA2AhAgAEEJNgIMDBALQQAhECAAQQA2AhwgACABNgIUIABBl5WAgAA2AhAgAEEPNgIMDA8LQQAhECAAQQA2AhwgACABNgIUIABBl5WAgAA2AhAgAEEPNgIMDA4LQQAhECAAQQA2AhwgACABNgIUIABBwJKAgAA2AhAgAEELNgIMDA0LQQAhECAAQQA2AhwgACABNgIUIABBlYmAgAA2AhAgAEELNgIMDAwLQQAhECAAQQA2AhwgACABNgIUIABB4Y+AgAA2AhAgAEEKNgIMDAsLQQAhECAAQQA2AhwgACABNgIUIABB+4+AgAA2AhAgAEEKNgIMDAoLQQAhECAAQQA2AhwgACABNgIUIABB8ZmAgAA2AhAgAEECNgIMDAkLQQAhECAAQQA2AhwgACABNgIUIABBxJSAgAA2AhAgAEECNgIMDAgLQQAhECAAQQA2AhwgACABNgIUIABB8pWAgAA2AhAgAEECNgIMDAcLIABBAjYCHCAAIAE2AhQgAEGcmoCAADYCECAAQRY2AgxBACEQDAYLQQEhEAwFC0HUACEQIAEiBCACRg0EIANBCGogACAEIAJB2MKAgABBChDFgICAACADKAIMIQQgAygCCA4DAQQCAAsQyoCAgAAACyAAQQA2AhwgAEG1moCAADYCECAAQRc2AgwgACAEQQFqNgIUQQAhEAwCCyAAQQA2AhwgACAENgIUIABBypqAgAA2AhAgAEEJNgIMQQAhEAwBCwJAIAEiBCACRw0AQSIhEAwBCyAAQYmAgIAANgIIIAAgBDYCBEEhIRALIANBEGokgICAgAAgEAuvAQECfyABKAIAIQYCQAJAIAIgA0YNACAEIAZqIQQgBiADaiACayEHIAIgBkF/cyAFaiIGaiEFA0ACQCACLQAAIAQtAABGDQBBAiEEDAMLAkAgBg0AQQAhBCAFIQIMAwsgBkF/aiEGIARBAWohBCACQQFqIgIgA0cNAAsgByEGIAMhAgsgAEEBNgIAIAEgBjYCACAAIAI2AgQPCyABQQA2AgAgACAENgIAIAAgAjYCBAsKACAAEMeAgIAAC/I2AQt/I4CAgIAAQRBrIgEkgICAgAACQEEAKAKg0ICAAA0AQQAQy4CAgABBgNSEgABrIgJB2QBJDQBBACEDAkBBACgC4NOAgAAiBA0AQQBCfzcC7NOAgABBAEKAgISAgIDAADcC5NOAgABBACABQQhqQXBxQdiq1aoFcyIENgLg04CAAEEAQQA2AvTTgIAAQQBBADYCxNOAgAALQQAgAjYCzNOAgABBAEGA1ISAADYCyNOAgABBAEGA1ISAADYCmNCAgABBACAENgKs0ICAAEEAQX82AqjQgIAAA0AgA0HE0ICAAGogA0G40ICAAGoiBDYCACAEIANBsNCAgABqIgU2AgAgA0G80ICAAGogBTYCACADQczQgIAAaiADQcDQgIAAaiIFNgIAIAUgBDYCACADQdTQgIAAaiADQcjQgIAAaiIENgIAIAQgBTYCACADQdDQgIAAaiAENgIAIANBIGoiA0GAAkcNAAtBgNSEgABBeEGA1ISAAGtBD3FBAEGA1ISAAEEIakEPcRsiA2oiBEEEaiACQUhqIgUgA2siA0EBcjYCAEEAQQAoAvDTgIAANgKk0ICAAEEAIAM2ApTQgIAAQQAgBDYCoNCAgABBgNSEgAAgBWpBODYCBAsCQAJAAkACQAJAAkACQAJAAkACQAJAAkAgAEHsAUsNAAJAQQAoAojQgIAAIgZBECAAQRNqQXBxIABBC0kbIgJBA3YiBHYiA0EDcUUNAAJAAkAgA0EBcSAEckEBcyIFQQN0IgRBsNCAgABqIgMgBEG40ICAAGooAgAiBCgCCCICRw0AQQAgBkF+IAV3cTYCiNCAgAAMAQsgAyACNgIIIAIgAzYCDAsgBEEIaiEDIAQgBUEDdCIFQQNyNgIEIAQgBWoiBCAEKAIEQQFyNgIEDAwLIAJBACgCkNCAgAAiB00NAQJAIANFDQACQAJAIAMgBHRBAiAEdCIDQQAgA2tycSIDQQAgA2txQX9qIgMgA0EMdkEQcSIDdiIEQQV2QQhxIgUgA3IgBCAFdiIDQQJ2QQRxIgRyIAMgBHYiA0EBdkECcSIEciADIAR2IgNBAXZBAXEiBHIgAyAEdmoiBEEDdCIDQbDQgIAAaiIFIANBuNCAgABqKAIAIgMoAggiAEcNAEEAIAZBfiAEd3EiBjYCiNCAgAAMAQsgBSAANgIIIAAgBTYCDAsgAyACQQNyNgIEIAMgBEEDdCIEaiAEIAJrIgU2AgAgAyACaiIAIAVBAXI2AgQCQCAHRQ0AIAdBeHFBsNCAgABqIQJBACgCnNCAgAAhBAJAAkAgBkEBIAdBA3Z0IghxDQBBACAGIAhyNgKI0ICAACACIQgMAQsgAigCCCEICyAIIAQ2AgwgAiAENgIIIAQgAjYCDCAEIAg2AggLIANBCGohA0EAIAA2ApzQgIAAQQAgBTYCkNCAgAAMDAtBACgCjNCAgAAiCUUNASAJQQAgCWtxQX9qIgMgA0EMdkEQcSIDdiIEQQV2QQhxIgUgA3IgBCAFdiIDQQJ2QQRxIgRyIAMgBHYiA0EBdkECcSIEciADIAR2IgNBAXZBAXEiBHIgAyAEdmpBAnRBuNKAgABqKAIAIgAoAgRBeHEgAmshBCAAIQUCQANAAkAgBSgCECIDDQAgBUEUaigCACIDRQ0CCyADKAIEQXhxIAJrIgUgBCAFIARJIgUbIQQgAyAAIAUbIQAgAyEFDAALCyAAKAIYIQoCQCAAKAIMIgggAEYNACAAKAIIIgNBACgCmNCAgABJGiAIIAM2AgggAyAINgIMDAsLAkAgAEEUaiIFKAIAIgMNACAAKAIQIgNFDQMgAEEQaiEFCwNAIAUhCyADIghBFGoiBSgCACIDDQAgCEEQaiEFIAgoAhAiAw0ACyALQQA2AgAMCgtBfyECIABBv39LDQAgAEETaiIDQXBxIQJBACgCjNCAgAAiB0UNAEEAIQsCQCACQYACSQ0AQR8hCyACQf///wdLDQAgA0EIdiIDIANBgP4/akEQdkEIcSIDdCIEIARBgOAfakEQdkEEcSIEdCIFIAVBgIAPakEQdkECcSIFdEEPdiADIARyIAVyayIDQQF0IAIgA0EVanZBAXFyQRxqIQsLQQAgAmshBAJAAkACQAJAIAtBAnRBuNKAgABqKAIAIgUNAEEAIQNBACEIDAELQQAhAyACQQBBGSALQQF2ayALQR9GG3QhAEEAIQgDQAJAIAUoAgRBeHEgAmsiBiAETw0AIAYhBCAFIQggBg0AQQAhBCAFIQggBSEDDAMLIAMgBUEUaigCACIGIAYgBSAAQR12QQRxakEQaigCACIFRhsgAyAGGyEDIABBAXQhACAFDQALCwJAIAMgCHINAEEAIQhBAiALdCIDQQAgA2tyIAdxIgNFDQMgA0EAIANrcUF/aiIDIANBDHZBEHEiA3YiBUEFdkEIcSIAIANyIAUgAHYiA0ECdkEEcSIFciADIAV2IgNBAXZBAnEiBXIgAyAFdiIDQQF2QQFxIgVyIAMgBXZqQQJ0QbjSgIAAaigCACEDCyADRQ0BCwNAIAMoAgRBeHEgAmsiBiAESSEAAkAgAygCECIFDQAgA0EUaigCACEFCyAGIAQgABshBCADIAggABshCCAFIQMgBQ0ACwsgCEUNACAEQQAoApDQgIAAIAJrTw0AIAgoAhghCwJAIAgoAgwiACAIRg0AIAgoAggiA0EAKAKY0ICAAEkaIAAgAzYCCCADIAA2AgwMCQsCQCAIQRRqIgUoAgAiAw0AIAgoAhAiA0UNAyAIQRBqIQULA0AgBSEGIAMiAEEUaiIFKAIAIgMNACAAQRBqIQUgACgCECIDDQALIAZBADYCAAwICwJAQQAoApDQgIAAIgMgAkkNAEEAKAKc0ICAACEEAkACQCADIAJrIgVBEEkNACAEIAJqIgAgBUEBcjYCBEEAIAU2ApDQgIAAQQAgADYCnNCAgAAgBCADaiAFNgIAIAQgAkEDcjYCBAwBCyAEIANBA3I2AgQgBCADaiIDIAMoAgRBAXI2AgRBAEEANgKc0ICAAEEAQQA2ApDQgIAACyAEQQhqIQMMCgsCQEEAKAKU0ICAACIAIAJNDQBBACgCoNCAgAAiAyACaiIEIAAgAmsiBUEBcjYCBEEAIAU2ApTQgIAAQQAgBDYCoNCAgAAgAyACQQNyNgIEIANBCGohAwwKCwJAAkBBACgC4NOAgABFDQBBACgC6NOAgAAhBAwBC0EAQn83AuzTgIAAQQBCgICEgICAwAA3AuTTgIAAQQAgAUEMakFwcUHYqtWqBXM2AuDTgIAAQQBBADYC9NOAgABBAEEANgLE04CAAEGAgAQhBAtBACEDAkAgBCACQccAaiIHaiIGQQAgBGsiC3EiCCACSw0AQQBBMDYC+NOAgAAMCgsCQEEAKALA04CAACIDRQ0AAkBBACgCuNOAgAAiBCAIaiIFIARNDQAgBSADTQ0BC0EAIQNBAEEwNgL404CAAAwKC0EALQDE04CAAEEEcQ0EAkACQAJAQQAoAqDQgIAAIgRFDQBByNOAgAAhAwNAAkAgAygCACIFIARLDQAgBSADKAIEaiAESw0DCyADKAIIIgMNAAsLQQAQy4CAgAAiAEF/Rg0FIAghBgJAQQAoAuTTgIAAIgNBf2oiBCAAcUUNACAIIABrIAQgAGpBACADa3FqIQYLIAYgAk0NBSAGQf7///8HSw0FAkBBACgCwNOAgAAiA0UNAEEAKAK404CAACIEIAZqIgUgBE0NBiAFIANLDQYLIAYQy4CAgAAiAyAARw0BDAcLIAYgAGsgC3EiBkH+////B0sNBCAGEMuAgIAAIgAgAygCACADKAIEakYNAyAAIQMLAkAgA0F/Rg0AIAJByABqIAZNDQACQCAHIAZrQQAoAujTgIAAIgRqQQAgBGtxIgRB/v///wdNDQAgAyEADAcLAkAgBBDLgICAAEF/Rg0AIAQgBmohBiADIQAMBwtBACAGaxDLgICAABoMBAsgAyEAIANBf0cNBQwDC0EAIQgMBwtBACEADAULIABBf0cNAgtBAEEAKALE04CAAEEEcjYCxNOAgAALIAhB/v///wdLDQEgCBDLgICAACEAQQAQy4CAgAAhAyAAQX9GDQEgA0F/Rg0BIAAgA08NASADIABrIgYgAkE4ak0NAQtBAEEAKAK404CAACAGaiIDNgK404CAAAJAIANBACgCvNOAgABNDQBBACADNgK804CAAAsCQAJAAkACQEEAKAKg0ICAACIERQ0AQcjTgIAAIQMDQCAAIAMoAgAiBSADKAIEIghqRg0CIAMoAggiAw0ADAMLCwJAAkBBACgCmNCAgAAiA0UNACAAIANPDQELQQAgADYCmNCAgAALQQAhA0EAIAY2AszTgIAAQQAgADYCyNOAgABBAEF/NgKo0ICAAEEAQQAoAuDTgIAANgKs0ICAAEEAQQA2AtTTgIAAA0AgA0HE0ICAAGogA0G40ICAAGoiBDYCACAEIANBsNCAgABqIgU2AgAgA0G80ICAAGogBTYCACADQczQgIAAaiADQcDQgIAAaiIFNgIAIAUgBDYCACADQdTQgIAAaiADQcjQgIAAaiIENgIAIAQgBTYCACADQdDQgIAAaiAENgIAIANBIGoiA0GAAkcNAAsgAEF4IABrQQ9xQQAgAEEIakEPcRsiA2oiBCAGQUhqIgUgA2siA0EBcjYCBEEAQQAoAvDTgIAANgKk0ICAAEEAIAM2ApTQgIAAQQAgBDYCoNCAgAAgACAFakE4NgIEDAILIAMtAAxBCHENACAEIAVJDQAgBCAATw0AIARBeCAEa0EPcUEAIARBCGpBD3EbIgVqIgBBACgClNCAgAAgBmoiCyAFayIFQQFyNgIEIAMgCCAGajYCBEEAQQAoAvDTgIAANgKk0ICAAEEAIAU2ApTQgIAAQQAgADYCoNCAgAAgBCALakE4NgIEDAELAkAgAEEAKAKY0ICAACIITw0AQQAgADYCmNCAgAAgACEICyAAIAZqIQVByNOAgAAhAwJAAkACQAJAAkACQAJAA0AgAygCACAFRg0BIAMoAggiAw0ADAILCyADLQAMQQhxRQ0BC0HI04CAACEDA0ACQCADKAIAIgUgBEsNACAFIAMoAgRqIgUgBEsNAwsgAygCCCEDDAALCyADIAA2AgAgAyADKAIEIAZqNgIEIABBeCAAa0EPcUEAIABBCGpBD3EbaiILIAJBA3I2AgQgBUF4IAVrQQ9xQQAgBUEIakEPcRtqIgYgCyACaiICayEDAkAgBiAERw0AQQAgAjYCoNCAgABBAEEAKAKU0ICAACADaiIDNgKU0ICAACACIANBAXI2AgQMAwsCQCAGQQAoApzQgIAARw0AQQAgAjYCnNCAgABBAEEAKAKQ0ICAACADaiIDNgKQ0ICAACACIANBAXI2AgQgAiADaiADNgIADAMLAkAgBigCBCIEQQNxQQFHDQAgBEF4cSEHAkACQCAEQf8BSw0AIAYoAggiBSAEQQN2IghBA3RBsNCAgABqIgBGGgJAIAYoAgwiBCAFRw0AQQBBACgCiNCAgABBfiAId3E2AojQgIAADAILIAQgAEYaIAQgBTYCCCAFIAQ2AgwMAQsgBigCGCEJAkACQCAGKAIMIgAgBkYNACAGKAIIIgQgCEkaIAAgBDYCCCAEIAA2AgwMAQsCQCAGQRRqIgQoAgAiBQ0AIAZBEGoiBCgCACIFDQBBACEADAELA0AgBCEIIAUiAEEUaiIEKAIAIgUNACAAQRBqIQQgACgCECIFDQALIAhBADYCAAsgCUUNAAJAAkAgBiAGKAIcIgVBAnRBuNKAgABqIgQoAgBHDQAgBCAANgIAIAANAUEAQQAoAozQgIAAQX4gBXdxNgKM0ICAAAwCCyAJQRBBFCAJKAIQIAZGG2ogADYCACAARQ0BCyAAIAk2AhgCQCAGKAIQIgRFDQAgACAENgIQIAQgADYCGAsgBigCFCIERQ0AIABBFGogBDYCACAEIAA2AhgLIAcgA2ohAyAGIAdqIgYoAgQhBAsgBiAEQX5xNgIEIAIgA2ogAzYCACACIANBAXI2AgQCQCADQf8BSw0AIANBeHFBsNCAgABqIQQCQAJAQQAoAojQgIAAIgVBASADQQN2dCIDcQ0AQQAgBSADcjYCiNCAgAAgBCEDDAELIAQoAgghAwsgAyACNgIMIAQgAjYCCCACIAQ2AgwgAiADNgIIDAMLQR8hBAJAIANB////B0sNACADQQh2IgQgBEGA/j9qQRB2QQhxIgR0IgUgBUGA4B9qQRB2QQRxIgV0IgAgAEGAgA9qQRB2QQJxIgB0QQ92IAQgBXIgAHJrIgRBAXQgAyAEQRVqdkEBcXJBHGohBAsgAiAENgIcIAJCADcCECAEQQJ0QbjSgIAAaiEFAkBBACgCjNCAgAAiAEEBIAR0IghxDQAgBSACNgIAQQAgACAIcjYCjNCAgAAgAiAFNgIYIAIgAjYCCCACIAI2AgwMAwsgA0EAQRkgBEEBdmsgBEEfRht0IQQgBSgCACEAA0AgACIFKAIEQXhxIANGDQIgBEEddiEAIARBAXQhBCAFIABBBHFqQRBqIggoAgAiAA0ACyAIIAI2AgAgAiAFNgIYIAIgAjYCDCACIAI2AggMAgsgAEF4IABrQQ9xQQAgAEEIakEPcRsiA2oiCyAGQUhqIgggA2siA0EBcjYCBCAAIAhqQTg2AgQgBCAFQTcgBWtBD3FBACAFQUlqQQ9xG2pBQWoiCCAIIARBEGpJGyIIQSM2AgRBAEEAKALw04CAADYCpNCAgABBACADNgKU0ICAAEEAIAs2AqDQgIAAIAhBEGpBACkC0NOAgAA3AgAgCEEAKQLI04CAADcCCEEAIAhBCGo2AtDTgIAAQQAgBjYCzNOAgABBACAANgLI04CAAEEAQQA2AtTTgIAAIAhBJGohAwNAIANBBzYCACADQQRqIgMgBUkNAAsgCCAERg0DIAggCCgCBEF+cTYCBCAIIAggBGsiADYCACAEIABBAXI2AgQCQCAAQf8BSw0AIABBeHFBsNCAgABqIQMCQAJAQQAoAojQgIAAIgVBASAAQQN2dCIAcQ0AQQAgBSAAcjYCiNCAgAAgAyEFDAELIAMoAgghBQsgBSAENgIMIAMgBDYCCCAEIAM2AgwgBCAFNgIIDAQLQR8hAwJAIABB////B0sNACAAQQh2IgMgA0GA/j9qQRB2QQhxIgN0IgUgBUGA4B9qQRB2QQRxIgV0IgggCEGAgA9qQRB2QQJxIgh0QQ92IAMgBXIgCHJrIgNBAXQgACADQRVqdkEBcXJBHGohAwsgBCADNgIcIARCADcCECADQQJ0QbjSgIAAaiEFAkBBACgCjNCAgAAiCEEBIAN0IgZxDQAgBSAENgIAQQAgCCAGcjYCjNCAgAAgBCAFNgIYIAQgBDYCCCAEIAQ2AgwMBAsgAEEAQRkgA0EBdmsgA0EfRht0IQMgBSgCACEIA0AgCCIFKAIEQXhxIABGDQMgA0EddiEIIANBAXQhAyAFIAhBBHFqQRBqIgYoAgAiCA0ACyAGIAQ2AgAgBCAFNgIYIAQgBDYCDCAEIAQ2AggMAwsgBSgCCCIDIAI2AgwgBSACNgIIIAJBADYCGCACIAU2AgwgAiADNgIICyALQQhqIQMMBQsgBSgCCCIDIAQ2AgwgBSAENgIIIARBADYCGCAEIAU2AgwgBCADNgIIC0EAKAKU0ICAACIDIAJNDQBBACgCoNCAgAAiBCACaiIFIAMgAmsiA0EBcjYCBEEAIAM2ApTQgIAAQQAgBTYCoNCAgAAgBCACQQNyNgIEIARBCGohAwwDC0EAIQNBAEEwNgL404CAAAwCCwJAIAtFDQACQAJAIAggCCgCHCIFQQJ0QbjSgIAAaiIDKAIARw0AIAMgADYCACAADQFBACAHQX4gBXdxIgc2AozQgIAADAILIAtBEEEUIAsoAhAgCEYbaiAANgIAIABFDQELIAAgCzYCGAJAIAgoAhAiA0UNACAAIAM2AhAgAyAANgIYCyAIQRRqKAIAIgNFDQAgAEEUaiADNgIAIAMgADYCGAsCQAJAIARBD0sNACAIIAQgAmoiA0EDcjYCBCAIIANqIgMgAygCBEEBcjYCBAwBCyAIIAJqIgAgBEEBcjYCBCAIIAJBA3I2AgQgACAEaiAENgIAAkAgBEH/AUsNACAEQXhxQbDQgIAAaiEDAkACQEEAKAKI0ICAACIFQQEgBEEDdnQiBHENAEEAIAUgBHI2AojQgIAAIAMhBAwBCyADKAIIIQQLIAQgADYCDCADIAA2AgggACADNgIMIAAgBDYCCAwBC0EfIQMCQCAEQf///wdLDQAgBEEIdiIDIANBgP4/akEQdkEIcSIDdCIFIAVBgOAfakEQdkEEcSIFdCICIAJBgIAPakEQdkECcSICdEEPdiADIAVyIAJyayIDQQF0IAQgA0EVanZBAXFyQRxqIQMLIAAgAzYCHCAAQgA3AhAgA0ECdEG40oCAAGohBQJAIAdBASADdCICcQ0AIAUgADYCAEEAIAcgAnI2AozQgIAAIAAgBTYCGCAAIAA2AgggACAANgIMDAELIARBAEEZIANBAXZrIANBH0YbdCEDIAUoAgAhAgJAA0AgAiIFKAIEQXhxIARGDQEgA0EddiECIANBAXQhAyAFIAJBBHFqQRBqIgYoAgAiAg0ACyAGIAA2AgAgACAFNgIYIAAgADYCDCAAIAA2AggMAQsgBSgCCCIDIAA2AgwgBSAANgIIIABBADYCGCAAIAU2AgwgACADNgIICyAIQQhqIQMMAQsCQCAKRQ0AAkACQCAAIAAoAhwiBUECdEG40oCAAGoiAygCAEcNACADIAg2AgAgCA0BQQAgCUF+IAV3cTYCjNCAgAAMAgsgCkEQQRQgCigCECAARhtqIAg2AgAgCEUNAQsgCCAKNgIYAkAgACgCECIDRQ0AIAggAzYCECADIAg2AhgLIABBFGooAgAiA0UNACAIQRRqIAM2AgAgAyAINgIYCwJAAkAgBEEPSw0AIAAgBCACaiIDQQNyNgIEIAAgA2oiAyADKAIEQQFyNgIEDAELIAAgAmoiBSAEQQFyNgIEIAAgAkEDcjYCBCAFIARqIAQ2AgACQCAHRQ0AIAdBeHFBsNCAgABqIQJBACgCnNCAgAAhAwJAAkBBASAHQQN2dCIIIAZxDQBBACAIIAZyNgKI0ICAACACIQgMAQsgAigCCCEICyAIIAM2AgwgAiADNgIIIAMgAjYCDCADIAg2AggLQQAgBTYCnNCAgABBACAENgKQ0ICAAAsgAEEIaiEDCyABQRBqJICAgIAAIAMLCgAgABDJgICAAAviDQEHfwJAIABFDQAgAEF4aiIBIABBfGooAgAiAkF4cSIAaiEDAkAgAkEBcQ0AIAJBA3FFDQEgASABKAIAIgJrIgFBACgCmNCAgAAiBEkNASACIABqIQACQCABQQAoApzQgIAARg0AAkAgAkH/AUsNACABKAIIIgQgAkEDdiIFQQN0QbDQgIAAaiIGRhoCQCABKAIMIgIgBEcNAEEAQQAoAojQgIAAQX4gBXdxNgKI0ICAAAwDCyACIAZGGiACIAQ2AgggBCACNgIMDAILIAEoAhghBwJAAkAgASgCDCIGIAFGDQAgASgCCCICIARJGiAGIAI2AgggAiAGNgIMDAELAkAgAUEUaiICKAIAIgQNACABQRBqIgIoAgAiBA0AQQAhBgwBCwNAIAIhBSAEIgZBFGoiAigCACIEDQAgBkEQaiECIAYoAhAiBA0ACyAFQQA2AgALIAdFDQECQAJAIAEgASgCHCIEQQJ0QbjSgIAAaiICKAIARw0AIAIgBjYCACAGDQFBAEEAKAKM0ICAAEF+IAR3cTYCjNCAgAAMAwsgB0EQQRQgBygCECABRhtqIAY2AgAgBkUNAgsgBiAHNgIYAkAgASgCECICRQ0AIAYgAjYCECACIAY2AhgLIAEoAhQiAkUNASAGQRRqIAI2AgAgAiAGNgIYDAELIAMoAgQiAkEDcUEDRw0AIAMgAkF+cTYCBEEAIAA2ApDQgIAAIAEgAGogADYCACABIABBAXI2AgQPCyABIANPDQAgAygCBCICQQFxRQ0AAkACQCACQQJxDQACQCADQQAoAqDQgIAARw0AQQAgATYCoNCAgABBAEEAKAKU0ICAACAAaiIANgKU0ICAACABIABBAXI2AgQgAUEAKAKc0ICAAEcNA0EAQQA2ApDQgIAAQQBBADYCnNCAgAAPCwJAIANBACgCnNCAgABHDQBBACABNgKc0ICAAEEAQQAoApDQgIAAIABqIgA2ApDQgIAAIAEgAEEBcjYCBCABIABqIAA2AgAPCyACQXhxIABqIQACQAJAIAJB/wFLDQAgAygCCCIEIAJBA3YiBUEDdEGw0ICAAGoiBkYaAkAgAygCDCICIARHDQBBAEEAKAKI0ICAAEF+IAV3cTYCiNCAgAAMAgsgAiAGRhogAiAENgIIIAQgAjYCDAwBCyADKAIYIQcCQAJAIAMoAgwiBiADRg0AIAMoAggiAkEAKAKY0ICAAEkaIAYgAjYCCCACIAY2AgwMAQsCQCADQRRqIgIoAgAiBA0AIANBEGoiAigCACIEDQBBACEGDAELA0AgAiEFIAQiBkEUaiICKAIAIgQNACAGQRBqIQIgBigCECIEDQALIAVBADYCAAsgB0UNAAJAAkAgAyADKAIcIgRBAnRBuNKAgABqIgIoAgBHDQAgAiAGNgIAIAYNAUEAQQAoAozQgIAAQX4gBHdxNgKM0ICAAAwCCyAHQRBBFCAHKAIQIANGG2ogBjYCACAGRQ0BCyAGIAc2AhgCQCADKAIQIgJFDQAgBiACNgIQIAIgBjYCGAsgAygCFCICRQ0AIAZBFGogAjYCACACIAY2AhgLIAEgAGogADYCACABIABBAXI2AgQgAUEAKAKc0ICAAEcNAUEAIAA2ApDQgIAADwsgAyACQX5xNgIEIAEgAGogADYCACABIABBAXI2AgQLAkAgAEH/AUsNACAAQXhxQbDQgIAAaiECAkACQEEAKAKI0ICAACIEQQEgAEEDdnQiAHENAEEAIAQgAHI2AojQgIAAIAIhAAwBCyACKAIIIQALIAAgATYCDCACIAE2AgggASACNgIMIAEgADYCCA8LQR8hAgJAIABB////B0sNACAAQQh2IgIgAkGA/j9qQRB2QQhxIgJ0IgQgBEGA4B9qQRB2QQRxIgR0IgYgBkGAgA9qQRB2QQJxIgZ0QQ92IAIgBHIgBnJrIgJBAXQgACACQRVqdkEBcXJBHGohAgsgASACNgIcIAFCADcCECACQQJ0QbjSgIAAaiEEAkACQEEAKAKM0ICAACIGQQEgAnQiA3ENACAEIAE2AgBBACAGIANyNgKM0ICAACABIAQ2AhggASABNgIIIAEgATYCDAwBCyAAQQBBGSACQQF2ayACQR9GG3QhAiAEKAIAIQYCQANAIAYiBCgCBEF4cSAARg0BIAJBHXYhBiACQQF0IQIgBCAGQQRxakEQaiIDKAIAIgYNAAsgAyABNgIAIAEgBDYCGCABIAE2AgwgASABNgIIDAELIAQoAggiACABNgIMIAQgATYCCCABQQA2AhggASAENgIMIAEgADYCCAtBAEEAKAKo0ICAAEF/aiIBQX8gARs2AqjQgIAACwsEAAAAC04AAkAgAA0APwBBEHQPCwJAIABB//8DcQ0AIABBf0wNAAJAIABBEHZAACIAQX9HDQBBAEEwNgL404CAAEF/DwsgAEEQdA8LEMqAgIAAAAvyAgIDfwF+AkAgAkUNACAAIAE6AAAgAiAAaiIDQX9qIAE6AAAgAkEDSQ0AIAAgAToAAiAAIAE6AAEgA0F9aiABOgAAIANBfmogAToAACACQQdJDQAgACABOgADIANBfGogAToAACACQQlJDQAgAEEAIABrQQNxIgRqIgMgAUH/AXFBgYKECGwiATYCACADIAIgBGtBfHEiBGoiAkF8aiABNgIAIARBCUkNACADIAE2AgggAyABNgIEIAJBeGogATYCACACQXRqIAE2AgAgBEEZSQ0AIAMgATYCGCADIAE2AhQgAyABNgIQIAMgATYCDCACQXBqIAE2AgAgAkFsaiABNgIAIAJBaGogATYCACACQWRqIAE2AgAgBCADQQRxQRhyIgVrIgJBIEkNACABrUKBgICAEH4hBiADIAVqIQEDQCABIAY3AxggASAGNwMQIAEgBjcDCCABIAY3AwAgAUEgaiEBIAJBYGoiAkEfSw0ACwsgAAsLjkgBAEGACAuGSAEAAAACAAAAAwAAAAAAAAAAAAAABAAAAAUAAAAAAAAAAAAAAAYAAAAHAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASW52YWxpZCBjaGFyIGluIHVybCBxdWVyeQBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX2JvZHkAQ29udGVudC1MZW5ndGggb3ZlcmZsb3cAQ2h1bmsgc2l6ZSBvdmVyZmxvdwBSZXNwb25zZSBvdmVyZmxvdwBJbnZhbGlkIG1ldGhvZCBmb3IgSFRUUC94LnggcmVxdWVzdABJbnZhbGlkIG1ldGhvZCBmb3IgUlRTUC94LnggcmVxdWVzdABFeHBlY3RlZCBTT1VSQ0UgbWV0aG9kIGZvciBJQ0UveC54IHJlcXVlc3QASW52YWxpZCBjaGFyIGluIHVybCBmcmFnbWVudCBzdGFydABFeHBlY3RlZCBkb3QAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9zdGF0dXMASW52YWxpZCByZXNwb25zZSBzdGF0dXMASW52YWxpZCBjaGFyYWN0ZXIgaW4gY2h1bmsgZXh0ZW5zaW9ucwBVc2VyIGNhbGxiYWNrIGVycm9yAGBvbl9yZXNldGAgY2FsbGJhY2sgZXJyb3IAYG9uX2NodW5rX2hlYWRlcmAgY2FsbGJhY2sgZXJyb3IAYG9uX21lc3NhZ2VfYmVnaW5gIGNhbGxiYWNrIGVycm9yAGBvbl9jaHVua19leHRlbnNpb25fdmFsdWVgIGNhbGxiYWNrIGVycm9yAGBvbl9zdGF0dXNfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl92ZXJzaW9uX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fdXJsX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fY2h1bmtfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl9oZWFkZXJfdmFsdWVfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl9tZXNzYWdlX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fbWV0aG9kX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25faGVhZGVyX2ZpZWxkX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fY2h1bmtfZXh0ZW5zaW9uX25hbWVgIGNhbGxiYWNrIGVycm9yAFVuZXhwZWN0ZWQgY2hhciBpbiB1cmwgc2VydmVyAEludmFsaWQgaGVhZGVyIHZhbHVlIGNoYXIASW52YWxpZCBoZWFkZXIgZmllbGQgY2hhcgBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX3ZlcnNpb24ASW52YWxpZCBtaW5vciB2ZXJzaW9uAEludmFsaWQgbWFqb3IgdmVyc2lvbgBFeHBlY3RlZCBzcGFjZSBhZnRlciB2ZXJzaW9uAEV4cGVjdGVkIENSTEYgYWZ0ZXIgdmVyc2lvbgBJbnZhbGlkIEhUVFAgdmVyc2lvbgBJbnZhbGlkIGhlYWRlciB0b2tlbgBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX3VybABJbnZhbGlkIGNoYXJhY3RlcnMgaW4gdXJsAFVuZXhwZWN0ZWQgc3RhcnQgY2hhciBpbiB1cmwARG91YmxlIEAgaW4gdXJsAEVtcHR5IENvbnRlbnQtTGVuZ3RoAEludmFsaWQgY2hhcmFjdGVyIGluIENvbnRlbnQtTGVuZ3RoAER1cGxpY2F0ZSBDb250ZW50LUxlbmd0aABJbnZhbGlkIGNoYXIgaW4gdXJsIHBhdGgAQ29udGVudC1MZW5ndGggY2FuJ3QgYmUgcHJlc2VudCB3aXRoIFRyYW5zZmVyLUVuY29kaW5nAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIHNpemUAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9oZWFkZXJfdmFsdWUAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9jaHVua19leHRlbnNpb25fdmFsdWUASW52YWxpZCBjaGFyYWN0ZXIgaW4gY2h1bmsgZXh0ZW5zaW9ucyB2YWx1ZQBNaXNzaW5nIGV4cGVjdGVkIExGIGFmdGVyIGhlYWRlciB2YWx1ZQBJbnZhbGlkIGBUcmFuc2Zlci1FbmNvZGluZ2AgaGVhZGVyIHZhbHVlAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIGV4dGVuc2lvbnMgcXVvdGUgdmFsdWUASW52YWxpZCBjaGFyYWN0ZXIgaW4gY2h1bmsgZXh0ZW5zaW9ucyBxdW90ZWQgdmFsdWUAUGF1c2VkIGJ5IG9uX2hlYWRlcnNfY29tcGxldGUASW52YWxpZCBFT0Ygc3RhdGUAb25fcmVzZXQgcGF1c2UAb25fY2h1bmtfaGVhZGVyIHBhdXNlAG9uX21lc3NhZ2VfYmVnaW4gcGF1c2UAb25fY2h1bmtfZXh0ZW5zaW9uX3ZhbHVlIHBhdXNlAG9uX3N0YXR1c19jb21wbGV0ZSBwYXVzZQBvbl92ZXJzaW9uX2NvbXBsZXRlIHBhdXNlAG9uX3VybF9jb21wbGV0ZSBwYXVzZQBvbl9jaHVua19jb21wbGV0ZSBwYXVzZQBvbl9oZWFkZXJfdmFsdWVfY29tcGxldGUgcGF1c2UAb25fbWVzc2FnZV9jb21wbGV0ZSBwYXVzZQBvbl9tZXRob2RfY29tcGxldGUgcGF1c2UAb25faGVhZGVyX2ZpZWxkX2NvbXBsZXRlIHBhdXNlAG9uX2NodW5rX2V4dGVuc2lvbl9uYW1lIHBhdXNlAFVuZXhwZWN0ZWQgc3BhY2UgYWZ0ZXIgc3RhcnQgbGluZQBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX2NodW5rX2V4dGVuc2lvbl9uYW1lAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIGV4dGVuc2lvbnMgbmFtZQBQYXVzZSBvbiBDT05ORUNUL1VwZ3JhZGUAUGF1c2Ugb24gUFJJL1VwZ3JhZGUARXhwZWN0ZWQgSFRUUC8yIENvbm5lY3Rpb24gUHJlZmFjZQBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX21ldGhvZABFeHBlY3RlZCBzcGFjZSBhZnRlciBtZXRob2QAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9oZWFkZXJfZmllbGQAUGF1c2VkAEludmFsaWQgd29yZCBlbmNvdW50ZXJlZABJbnZhbGlkIG1ldGhvZCBlbmNvdW50ZXJlZABVbmV4cGVjdGVkIGNoYXIgaW4gdXJsIHNjaGVtYQBSZXF1ZXN0IGhhcyBpbnZhbGlkIGBUcmFuc2Zlci1FbmNvZGluZ2AAU1dJVENIX1BST1hZAFVTRV9QUk9YWQBNS0FDVElWSVRZAFVOUFJPQ0VTU0FCTEVfRU5USVRZAENPUFkATU9WRURfUEVSTUFORU5UTFkAVE9PX0VBUkxZAE5PVElGWQBGQUlMRURfREVQRU5ERU5DWQBCQURfR0FURVdBWQBQTEFZAFBVVABDSEVDS09VVABHQVRFV0FZX1RJTUVPVVQAUkVRVUVTVF9USU1FT1VUAE5FVFdPUktfQ09OTkVDVF9USU1FT1VUAENPTk5FQ1RJT05fVElNRU9VVABMT0dJTl9USU1FT1VUAE5FVFdPUktfUkVBRF9USU1FT1VUAFBPU1QATUlTRElSRUNURURfUkVRVUVTVABDTElFTlRfQ0xPU0VEX1JFUVVFU1QAQ0xJRU5UX0NMT1NFRF9MT0FEX0JBTEFOQ0VEX1JFUVVFU1QAQkFEX1JFUVVFU1QASFRUUF9SRVFVRVNUX1NFTlRfVE9fSFRUUFNfUE9SVABSRVBPUlQASU1fQV9URUFQT1QAUkVTRVRfQ09OVEVOVABOT19DT05URU5UAFBBUlRJQUxfQ09OVEVOVABIUEVfSU5WQUxJRF9DT05TVEFOVABIUEVfQ0JfUkVTRVQAR0VUAEhQRV9TVFJJQ1QAQ09ORkxJQ1QAVEVNUE9SQVJZX1JFRElSRUNUAFBFUk1BTkVOVF9SRURJUkVDVABDT05ORUNUAE1VTFRJX1NUQVRVUwBIUEVfSU5WQUxJRF9TVEFUVVMAVE9PX01BTllfUkVRVUVTVFMARUFSTFlfSElOVFMAVU5BVkFJTEFCTEVfRk9SX0xFR0FMX1JFQVNPTlMAT1BUSU9OUwBTV0lUQ0hJTkdfUFJPVE9DT0xTAFZBUklBTlRfQUxTT19ORUdPVElBVEVTAE1VTFRJUExFX0NIT0lDRVMASU5URVJOQUxfU0VSVkVSX0VSUk9SAFdFQl9TRVJWRVJfVU5LTk9XTl9FUlJPUgBSQUlMR1VOX0VSUk9SAElERU5USVRZX1BST1ZJREVSX0FVVEhFTlRJQ0FUSU9OX0VSUk9SAFNTTF9DRVJUSUZJQ0FURV9FUlJPUgBJTlZBTElEX1hfRk9SV0FSREVEX0ZPUgBTRVRfUEFSQU1FVEVSAEdFVF9QQVJBTUVURVIASFBFX1VTRVIAU0VFX09USEVSAEhQRV9DQl9DSFVOS19IRUFERVIATUtDQUxFTkRBUgBTRVRVUABXRUJfU0VSVkVSX0lTX0RPV04AVEVBUkRPV04ASFBFX0NMT1NFRF9DT05ORUNUSU9OAEhFVVJJU1RJQ19FWFBJUkFUSU9OAERJU0NPTk5FQ1RFRF9PUEVSQVRJT04ATk9OX0FVVEhPUklUQVRJVkVfSU5GT1JNQVRJT04ASFBFX0lOVkFMSURfVkVSU0lPTgBIUEVfQ0JfTUVTU0FHRV9CRUdJTgBTSVRFX0lTX0ZST1pFTgBIUEVfSU5WQUxJRF9IRUFERVJfVE9LRU4ASU5WQUxJRF9UT0tFTgBGT1JCSURERU4ARU5IQU5DRV9ZT1VSX0NBTE0ASFBFX0lOVkFMSURfVVJMAEJMT0NLRURfQllfUEFSRU5UQUxfQ09OVFJPTABNS0NPTABBQ0wASFBFX0lOVEVSTkFMAFJFUVVFU1RfSEVBREVSX0ZJRUxEU19UT09fTEFSR0VfVU5PRkZJQ0lBTABIUEVfT0sAVU5MSU5LAFVOTE9DSwBQUkkAUkVUUllfV0lUSABIUEVfSU5WQUxJRF9DT05URU5UX0xFTkdUSABIUEVfVU5FWFBFQ1RFRF9DT05URU5UX0xFTkdUSABGTFVTSABQUk9QUEFUQ0gATS1TRUFSQ0gAVVJJX1RPT19MT05HAFBST0NFU1NJTkcATUlTQ0VMTEFORU9VU19QRVJTSVNURU5UX1dBUk5JTkcATUlTQ0VMTEFORU9VU19XQVJOSU5HAEhQRV9JTlZBTElEX1RSQU5TRkVSX0VOQ09ESU5HAEV4cGVjdGVkIENSTEYASFBFX0lOVkFMSURfQ0hVTktfU0laRQBNT1ZFAENPTlRJTlVFAEhQRV9DQl9TVEFUVVNfQ09NUExFVEUASFBFX0NCX0hFQURFUlNfQ09NUExFVEUASFBFX0NCX1ZFUlNJT05fQ09NUExFVEUASFBFX0NCX1VSTF9DT01QTEVURQBIUEVfQ0JfQ0hVTktfQ09NUExFVEUASFBFX0NCX0hFQURFUl9WQUxVRV9DT01QTEVURQBIUEVfQ0JfQ0hVTktfRVhURU5TSU9OX1ZBTFVFX0NPTVBMRVRFAEhQRV9DQl9DSFVOS19FWFRFTlNJT05fTkFNRV9DT01QTEVURQBIUEVfQ0JfTUVTU0FHRV9DT01QTEVURQBIUEVfQ0JfTUVUSE9EX0NPTVBMRVRFAEhQRV9DQl9IRUFERVJfRklFTERfQ09NUExFVEUAREVMRVRFAEhQRV9JTlZBTElEX0VPRl9TVEFURQBJTlZBTElEX1NTTF9DRVJUSUZJQ0FURQBQQVVTRQBOT19SRVNQT05TRQBVTlNVUFBPUlRFRF9NRURJQV9UWVBFAEdPTkUATk9UX0FDQ0VQVEFCTEUAU0VSVklDRV9VTkFWQUlMQUJMRQBSQU5HRV9OT1RfU0FUSVNGSUFCTEUAT1JJR0lOX0lTX1VOUkVBQ0hBQkxFAFJFU1BPTlNFX0lTX1NUQUxFAFBVUkdFAE1FUkdFAFJFUVVFU1RfSEVBREVSX0ZJRUxEU19UT09fTEFSR0UAUkVRVUVTVF9IRUFERVJfVE9PX0xBUkdFAFBBWUxPQURfVE9PX0xBUkdFAElOU1VGRklDSUVOVF9TVE9SQUdFAEhQRV9QQVVTRURfVVBHUkFERQBIUEVfUEFVU0VEX0gyX1VQR1JBREUAU09VUkNFAEFOTk9VTkNFAFRSQUNFAEhQRV9VTkVYUEVDVEVEX1NQQUNFAERFU0NSSUJFAFVOU1VCU0NSSUJFAFJFQ09SRABIUEVfSU5WQUxJRF9NRVRIT0QATk9UX0ZPVU5EAFBST1BGSU5EAFVOQklORABSRUJJTkQAVU5BVVRIT1JJWkVEAE1FVEhPRF9OT1RfQUxMT1dFRABIVFRQX1ZFUlNJT05fTk9UX1NVUFBPUlRFRABBTFJFQURZX1JFUE9SVEVEAEFDQ0VQVEVEAE5PVF9JTVBMRU1FTlRFRABMT09QX0RFVEVDVEVEAEhQRV9DUl9FWFBFQ1RFRABIUEVfTEZfRVhQRUNURUQAQ1JFQVRFRABJTV9VU0VEAEhQRV9QQVVTRUQAVElNRU9VVF9PQ0NVUkVEAFBBWU1FTlRfUkVRVUlSRUQAUFJFQ09ORElUSU9OX1JFUVVJUkVEAFBST1hZX0FVVEhFTlRJQ0FUSU9OX1JFUVVJUkVEAE5FVFdPUktfQVVUSEVOVElDQVRJT05fUkVRVUlSRUQATEVOR1RIX1JFUVVJUkVEAFNTTF9DRVJUSUZJQ0FURV9SRVFVSVJFRABVUEdSQURFX1JFUVVJUkVEAFBBR0VfRVhQSVJFRABQUkVDT05ESVRJT05fRkFJTEVEAEVYUEVDVEFUSU9OX0ZBSUxFRABSRVZBTElEQVRJT05fRkFJTEVEAFNTTF9IQU5EU0hBS0VfRkFJTEVEAExPQ0tFRABUUkFOU0ZPUk1BVElPTl9BUFBMSUVEAE5PVF9NT0RJRklFRABOT1RfRVhURU5ERUQAQkFORFdJRFRIX0xJTUlUX0VYQ0VFREVEAFNJVEVfSVNfT1ZFUkxPQURFRABIRUFEAEV4cGVjdGVkIEhUVFAvAABeEwAAJhMAADAQAADwFwAAnRMAABUSAAA5FwAA8BIAAAoQAAB1EgAArRIAAIITAABPFAAAfxAAAKAVAAAjFAAAiRIAAIsUAABNFQAA1BEAAM8UAAAQGAAAyRYAANwWAADBEQAA4BcAALsUAAB0FAAAfBUAAOUUAAAIFwAAHxAAAGUVAACjFAAAKBUAAAIVAACZFQAALBAAAIsZAABPDwAA1A4AAGoQAADOEAAAAhcAAIkOAABuEwAAHBMAAGYUAABWFwAAwRMAAM0TAABsEwAAaBcAAGYXAABfFwAAIhMAAM4PAABpDgAA2A4AAGMWAADLEwAAqg4AACgXAAAmFwAAxRMAAF0WAADoEQAAZxMAAGUTAADyFgAAcxMAAB0XAAD5FgAA8xEAAM8OAADOFQAADBIAALMRAAClEQAAYRAAADIXAAC7EwAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAgEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAgMCAgICAgAAAgIAAgIAAgICAgICAgICAgAEAAAAAAACAgICAgICAgICAgICAgICAgICAgICAgICAgAAAAICAgICAgICAgICAgICAgICAgICAgICAgICAgICAAIAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAIAAgICAgIAAAICAAICAAICAgICAgICAgIAAwAEAAAAAgICAgICAgICAgICAgICAgICAgICAgICAgIAAAACAgICAgICAgICAgICAgICAgICAgICAgICAgICAgACAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABsb3NlZWVwLWFsaXZlAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAgEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQFjaHVua2VkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQABAQEBAQAAAQEAAQEAAQEBAQEBAQEBAQAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGVjdGlvbmVudC1sZW5ndGhvbnJveHktY29ubmVjdGlvbgAAAAAAAAAAAAAAAAAAAHJhbnNmZXItZW5jb2RpbmdwZ3JhZGUNCg0KDQpTTQ0KDQpUVFAvQ0UvVFNQLwAAAAAAAAAAAAAAAAECAAEDAAAAAAAAAAAAAAAAAAAAAAAABAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAABAgABAwAAAAAAAAAAAAAAAAAAAAAAAAQBAQUBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAQAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAABAAACAAAAAAAAAAAAAAAAAAAAAAAAAwQAAAQEBAQEBAQEBAQEBQQEBAQEBAQEBAQEBAAEAAYHBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQABAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAAAAAAAAAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAgAAAAACAAAAAAAAAAAAAAAAAAAAAAADAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwAAAAAAAAMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE5PVU5DRUVDS09VVE5FQ1RFVEVDUklCRUxVU0hFVEVBRFNFQVJDSFJHRUNUSVZJVFlMRU5EQVJWRU9USUZZUFRJT05TQ0hTRUFZU1RBVENIR0VPUkRJUkVDVE9SVFJDSFBBUkFNRVRFUlVSQ0VCU0NSSUJFQVJET1dOQUNFSU5ETktDS1VCU0NSSUJFSFRUUC9BRFRQLw=="; + } +}); + +// node_modules/undici/lib/client.js +var require_client4 = __commonJS({ + "node_modules/undici/lib/client.js"(exports2, module2) { + "use strict"; + var assert = require("assert"); + var net = require("net"); + var util = require_util4(); + var timers = require_timers(); + var Request = require_request(); + var DispatcherBase = require_dispatcher_base(); + var { + RequestContentLengthMismatchError, + ResponseContentLengthMismatchError, + InvalidArgumentError, + RequestAbortedError, + HeadersTimeoutError, + HeadersOverflowError, + SocketError, + InformationalError, + BodyTimeoutError, + HTTPParserError, + ResponseExceededMaxSizeError, + ClientDestroyedError + } = require_errors(); + var buildConnector = require_connect2(); + var { + kUrl, + kReset, + kServerName, + kClient, + kBusy, + kParser, + kConnect, + kBlocking, + kResuming, + kRunning, + kPending, + kSize, + kWriting, + kQueue, + kConnected, + kConnecting, + kNeedDrain, + kNoRef, + kKeepAliveDefaultTimeout, + kHostHeader, + kPendingIdx, + kRunningIdx, + kError, + kPipelining, + kSocket, + kKeepAliveTimeoutValue, + kMaxHeadersSize, + kKeepAliveMaxTimeout, + kKeepAliveTimeoutThreshold, + kHeadersTimeout, + kBodyTimeout, + kStrictContentLength, + kConnector, + kMaxRedirections, + kMaxRequests, + kCounter, + kClose, + kDestroy, + kDispatch, + kInterceptors, + kLocalAddress, + kMaxResponseSize + } = require_symbols(); + var FastBuffer = Buffer[Symbol.species]; + var kClosedResolve = Symbol("kClosedResolve"); + var channels = {}; + try { + const diagnosticsChannel = require("diagnostics_channel"); + channels.sendHeaders = diagnosticsChannel.channel("undici:client:sendHeaders"); + channels.beforeConnect = diagnosticsChannel.channel("undici:client:beforeConnect"); + channels.connectError = diagnosticsChannel.channel("undici:client:connectError"); + channels.connected = diagnosticsChannel.channel("undici:client:connected"); + } catch { + channels.sendHeaders = { hasSubscribers: false }; + channels.beforeConnect = { hasSubscribers: false }; + channels.connectError = { hasSubscribers: false }; + channels.connected = { hasSubscribers: false }; + } + var Client = class extends DispatcherBase { + /** + * + * @param {string|URL} url + * @param {import('../types/client').Client.Options} options + */ + constructor(url, { + interceptors, + maxHeaderSize, + headersTimeout, + socketTimeout, + requestTimeout, + connectTimeout, + bodyTimeout, + idleTimeout, + keepAlive, + keepAliveTimeout, + maxKeepAliveTimeout, + keepAliveMaxTimeout, + keepAliveTimeoutThreshold, + socketPath, + pipelining, + tls, + strictContentLength, + maxCachedSessions, + maxRedirections, + connect: connect2, + maxRequestsPerClient, + localAddress, + maxResponseSize, + autoSelectFamily, + autoSelectFamilyAttemptTimeout + } = {}) { + super(); + if (keepAlive !== void 0) { + throw new InvalidArgumentError("unsupported keepAlive, use pipelining=0 instead"); + } + if (socketTimeout !== void 0) { + throw new InvalidArgumentError("unsupported socketTimeout, use headersTimeout & bodyTimeout instead"); + } + if (requestTimeout !== void 0) { + throw new InvalidArgumentError("unsupported requestTimeout, use headersTimeout & bodyTimeout instead"); + } + if (idleTimeout !== void 0) { + throw new InvalidArgumentError("unsupported idleTimeout, use keepAliveTimeout instead"); + } + if (maxKeepAliveTimeout !== void 0) { + throw new InvalidArgumentError("unsupported maxKeepAliveTimeout, use keepAliveMaxTimeout instead"); + } + if (maxHeaderSize != null && !Number.isFinite(maxHeaderSize)) { + throw new InvalidArgumentError("invalid maxHeaderSize"); + } + if (socketPath != null && typeof socketPath !== "string") { + throw new InvalidArgumentError("invalid socketPath"); + } + if (connectTimeout != null && (!Number.isFinite(connectTimeout) || connectTimeout < 0)) { + throw new InvalidArgumentError("invalid connectTimeout"); + } + if (keepAliveTimeout != null && (!Number.isFinite(keepAliveTimeout) || keepAliveTimeout <= 0)) { + throw new InvalidArgumentError("invalid keepAliveTimeout"); + } + if (keepAliveMaxTimeout != null && (!Number.isFinite(keepAliveMaxTimeout) || keepAliveMaxTimeout <= 0)) { + throw new InvalidArgumentError("invalid keepAliveMaxTimeout"); + } + if (keepAliveTimeoutThreshold != null && !Number.isFinite(keepAliveTimeoutThreshold)) { + throw new InvalidArgumentError("invalid keepAliveTimeoutThreshold"); + } + if (headersTimeout != null && (!Number.isInteger(headersTimeout) || headersTimeout < 0)) { + throw new InvalidArgumentError("headersTimeout must be a positive integer or zero"); + } + if (bodyTimeout != null && (!Number.isInteger(bodyTimeout) || bodyTimeout < 0)) { + throw new InvalidArgumentError("bodyTimeout must be a positive integer or zero"); + } + if (connect2 != null && typeof connect2 !== "function" && typeof connect2 !== "object") { + throw new InvalidArgumentError("connect must be a function or an object"); + } + if (maxRedirections != null && (!Number.isInteger(maxRedirections) || maxRedirections < 0)) { + throw new InvalidArgumentError("maxRedirections must be a positive number"); + } + if (maxRequestsPerClient != null && (!Number.isInteger(maxRequestsPerClient) || maxRequestsPerClient < 0)) { + throw new InvalidArgumentError("maxRequestsPerClient must be a positive number"); + } + if (localAddress != null && (typeof localAddress !== "string" || net.isIP(localAddress) === 0)) { + throw new InvalidArgumentError("localAddress must be valid string IP address"); + } + if (maxResponseSize != null && (!Number.isInteger(maxResponseSize) || maxResponseSize < -1)) { + throw new InvalidArgumentError("maxResponseSize must be a positive number"); + } + if (autoSelectFamilyAttemptTimeout != null && (!Number.isInteger(autoSelectFamilyAttemptTimeout) || autoSelectFamilyAttemptTimeout < -1)) { + throw new InvalidArgumentError("autoSelectFamilyAttemptTimeout must be a positive number"); + } + if (typeof connect2 !== "function") { + connect2 = buildConnector({ + ...tls, + maxCachedSessions, + socketPath, + timeout: connectTimeout, + ...util.nodeHasAutoSelectFamily && autoSelectFamily ? { autoSelectFamily, autoSelectFamilyAttemptTimeout } : void 0, + ...connect2 + }); + } + this[kInterceptors] = interceptors && interceptors.Client && Array.isArray(interceptors.Client) ? interceptors.Client : [createRedirectInterceptor({ maxRedirections })]; + this[kUrl] = util.parseOrigin(url); + this[kConnector] = connect2; + this[kSocket] = null; + this[kPipelining] = pipelining != null ? pipelining : 1; + this[kMaxHeadersSize] = maxHeaderSize || 16384; + this[kKeepAliveDefaultTimeout] = keepAliveTimeout == null ? 4e3 : keepAliveTimeout; + this[kKeepAliveMaxTimeout] = keepAliveMaxTimeout == null ? 6e5 : keepAliveMaxTimeout; + this[kKeepAliveTimeoutThreshold] = keepAliveTimeoutThreshold == null ? 1e3 : keepAliveTimeoutThreshold; + this[kKeepAliveTimeoutValue] = this[kKeepAliveDefaultTimeout]; + this[kServerName] = null; + this[kLocalAddress] = localAddress != null ? localAddress : null; + this[kResuming] = 0; + this[kNeedDrain] = 0; + this[kHostHeader] = `host: ${this[kUrl].hostname}${this[kUrl].port ? `:${this[kUrl].port}` : ""}\r +`; + this[kBodyTimeout] = bodyTimeout != null ? bodyTimeout : 3e5; + this[kHeadersTimeout] = headersTimeout != null ? headersTimeout : 3e5; + this[kStrictContentLength] = strictContentLength == null ? true : strictContentLength; + this[kMaxRedirections] = maxRedirections; + this[kMaxRequests] = maxRequestsPerClient; + this[kClosedResolve] = null; + this[kMaxResponseSize] = maxResponseSize > -1 ? maxResponseSize : -1; + this[kQueue] = []; + this[kRunningIdx] = 0; + this[kPendingIdx] = 0; + } + get pipelining() { + return this[kPipelining]; + } + set pipelining(value) { + this[kPipelining] = value; + resume(this, true); + } + get [kPending]() { + return this[kQueue].length - this[kPendingIdx]; + } + get [kRunning]() { + return this[kPendingIdx] - this[kRunningIdx]; + } + get [kSize]() { + return this[kQueue].length - this[kRunningIdx]; + } + get [kConnected]() { + return !!this[kSocket] && !this[kConnecting] && !this[kSocket].destroyed; + } + get [kBusy]() { + const socket = this[kSocket]; + return socket && (socket[kReset] || socket[kWriting] || socket[kBlocking]) || this[kSize] >= (this[kPipelining] || 1) || this[kPending] > 0; + } + /* istanbul ignore: only used for test */ + [kConnect](cb) { + connect(this); + this.once("connect", cb); + } + [kDispatch](opts, handler2) { + const origin = opts.origin || this[kUrl].origin; + const request = new Request(origin, opts, handler2); + this[kQueue].push(request); + if (this[kResuming]) { + } else if (util.bodyLength(request.body) == null && util.isIterable(request.body)) { + this[kResuming] = 1; + process.nextTick(resume, this); + } else { + resume(this, true); + } + if (this[kResuming] && this[kNeedDrain] !== 2 && this[kBusy]) { + this[kNeedDrain] = 2; + } + return this[kNeedDrain] < 2; + } + async [kClose]() { + return new Promise((resolve) => { + if (!this[kSize]) { + resolve(null); + } else { + this[kClosedResolve] = resolve; + } + }); + } + async [kDestroy](err) { + return new Promise((resolve) => { + const requests = this[kQueue].splice(this[kPendingIdx]); + for (let i = 0; i < requests.length; i++) { + const request = requests[i]; + errorRequest(this, request, err); + } + const callback = () => { + if (this[kClosedResolve]) { + this[kClosedResolve](); + this[kClosedResolve] = null; + } + resolve(); + }; + if (!this[kSocket]) { + queueMicrotask(callback); + } else { + util.destroy(this[kSocket].on("close", callback), err); + } + resume(this); + }); + } + }; + var constants = require_constants3(); + var createRedirectInterceptor = require_redirectInterceptor(); + var EMPTY_BUF = Buffer.alloc(0); + async function lazyllhttp() { + const llhttpWasmData = process.env.JEST_WORKER_ID ? require_llhttp_wasm() : void 0; + let mod2; + try { + mod2 = await WebAssembly.compile(Buffer.from(require_llhttp_simd_wasm(), "base64")); + } catch (e) { + mod2 = await WebAssembly.compile(Buffer.from(llhttpWasmData || require_llhttp_wasm(), "base64")); + } + return await WebAssembly.instantiate(mod2, { + env: { + /* eslint-disable camelcase */ + wasm_on_url: (p, at2, len) => { + return 0; + }, + wasm_on_status: (p, at2, len) => { + assert.strictEqual(currentParser.ptr, p); + const start = at2 - currentBufferPtr + currentBufferRef.byteOffset; + return currentParser.onStatus(new FastBuffer(currentBufferRef.buffer, start, len)) || 0; + }, + wasm_on_message_begin: (p) => { + assert.strictEqual(currentParser.ptr, p); + return currentParser.onMessageBegin() || 0; + }, + wasm_on_header_field: (p, at2, len) => { + assert.strictEqual(currentParser.ptr, p); + const start = at2 - currentBufferPtr + currentBufferRef.byteOffset; + return currentParser.onHeaderField(new FastBuffer(currentBufferRef.buffer, start, len)) || 0; + }, + wasm_on_header_value: (p, at2, len) => { + assert.strictEqual(currentParser.ptr, p); + const start = at2 - currentBufferPtr + currentBufferRef.byteOffset; + return currentParser.onHeaderValue(new FastBuffer(currentBufferRef.buffer, start, len)) || 0; + }, + wasm_on_headers_complete: (p, statusCode, upgrade, shouldKeepAlive) => { + assert.strictEqual(currentParser.ptr, p); + return currentParser.onHeadersComplete(statusCode, Boolean(upgrade), Boolean(shouldKeepAlive)) || 0; + }, + wasm_on_body: (p, at2, len) => { + assert.strictEqual(currentParser.ptr, p); + const start = at2 - currentBufferPtr + currentBufferRef.byteOffset; + return currentParser.onBody(new FastBuffer(currentBufferRef.buffer, start, len)) || 0; + }, + wasm_on_message_complete: (p) => { + assert.strictEqual(currentParser.ptr, p); + return currentParser.onMessageComplete() || 0; + } + /* eslint-enable camelcase */ + } + }); + } + var llhttpInstance = null; + var llhttpPromise = lazyllhttp(); + llhttpPromise.catch(); + var currentParser = null; + var currentBufferRef = null; + var currentBufferSize = 0; + var currentBufferPtr = null; + var TIMEOUT_HEADERS = 1; + var TIMEOUT_BODY = 2; + var TIMEOUT_IDLE = 3; + var Parser = class { + constructor(client, socket, { exports: exports3 }) { + assert(Number.isFinite(client[kMaxHeadersSize]) && client[kMaxHeadersSize] > 0); + this.llhttp = exports3; + this.ptr = this.llhttp.llhttp_alloc(constants.TYPE.RESPONSE); + this.client = client; + this.socket = socket; + this.timeout = null; + this.timeoutValue = null; + this.timeoutType = null; + this.statusCode = null; + this.statusText = ""; + this.upgrade = false; + this.headers = []; + this.headersSize = 0; + this.headersMaxSize = client[kMaxHeadersSize]; + this.shouldKeepAlive = false; + this.paused = false; + this.resume = this.resume.bind(this); + this.bytesRead = 0; + this.keepAlive = ""; + this.contentLength = ""; + this.connection = ""; + this.maxResponseSize = client[kMaxResponseSize]; + } + setTimeout(value, type) { + this.timeoutType = type; + if (value !== this.timeoutValue) { + timers.clearTimeout(this.timeout); + if (value) { + this.timeout = timers.setTimeout(onParserTimeout, value, this); + if (this.timeout.unref) { + this.timeout.unref(); + } + } else { + this.timeout = null; + } + this.timeoutValue = value; + } else if (this.timeout) { + if (this.timeout.refresh) { + this.timeout.refresh(); + } + } + } + resume() { + if (this.socket.destroyed || !this.paused) { + return; + } + assert(this.ptr != null); + assert(currentParser == null); + this.llhttp.llhttp_resume(this.ptr); + assert(this.timeoutType === TIMEOUT_BODY); + if (this.timeout) { + if (this.timeout.refresh) { + this.timeout.refresh(); + } + } + this.paused = false; + this.execute(this.socket.read() || EMPTY_BUF); + this.readMore(); + } + readMore() { + while (!this.paused && this.ptr) { + const chunk = this.socket.read(); + if (chunk === null) { + break; + } + this.execute(chunk); + } + } + execute(data) { + assert(this.ptr != null); + assert(currentParser == null); + assert(!this.paused); + const { socket, llhttp } = this; + if (data.length > currentBufferSize) { + if (currentBufferPtr) { + llhttp.free(currentBufferPtr); + } + currentBufferSize = Math.ceil(data.length / 4096) * 4096; + currentBufferPtr = llhttp.malloc(currentBufferSize); + } + new Uint8Array(llhttp.memory.buffer, currentBufferPtr, currentBufferSize).set(data); + try { + let ret; + try { + currentBufferRef = data; + currentParser = this; + ret = llhttp.llhttp_execute(this.ptr, currentBufferPtr, data.length); + } catch (err) { + throw err; + } finally { + currentParser = null; + currentBufferRef = null; + } + const offset = llhttp.llhttp_get_error_pos(this.ptr) - currentBufferPtr; + if (ret === constants.ERROR.PAUSED_UPGRADE) { + this.onUpgrade(data.slice(offset)); + } else if (ret === constants.ERROR.PAUSED) { + this.paused = true; + socket.unshift(data.slice(offset)); + } else if (ret !== constants.ERROR.OK) { + const ptr = llhttp.llhttp_get_error_reason(this.ptr); + let message = ""; + if (ptr) { + const len = new Uint8Array(llhttp.memory.buffer, ptr).indexOf(0); + message = "Response does not match the HTTP/1.1 protocol (" + Buffer.from(llhttp.memory.buffer, ptr, len).toString() + ")"; + } + throw new HTTPParserError(message, constants.ERROR[ret], data.slice(offset)); + } + } catch (err) { + util.destroy(socket, err); + } + } + destroy() { + assert(this.ptr != null); + assert(currentParser == null); + this.llhttp.llhttp_free(this.ptr); + this.ptr = null; + timers.clearTimeout(this.timeout); + this.timeout = null; + this.timeoutValue = null; + this.timeoutType = null; + this.paused = false; + } + onStatus(buf) { + this.statusText = buf.toString(); + } + onMessageBegin() { + const { socket, client } = this; + if (socket.destroyed) { + return -1; + } + const request = client[kQueue][client[kRunningIdx]]; + if (!request) { + return -1; + } + } + onHeaderField(buf) { + const len = this.headers.length; + if ((len & 1) === 0) { + this.headers.push(buf); + } else { + this.headers[len - 1] = Buffer.concat([this.headers[len - 1], buf]); + } + this.trackHeader(buf.length); + } + onHeaderValue(buf) { + let len = this.headers.length; + if ((len & 1) === 1) { + this.headers.push(buf); + len += 1; + } else { + this.headers[len - 1] = Buffer.concat([this.headers[len - 1], buf]); + } + const key = this.headers[len - 2]; + if (key.length === 10 && key.toString().toLowerCase() === "keep-alive") { + this.keepAlive += buf.toString(); + } else if (key.length === 10 && key.toString().toLowerCase() === "connection") { + this.connection += buf.toString(); + } else if (key.length === 14 && key.toString().toLowerCase() === "content-length") { + this.contentLength += buf.toString(); + } + this.trackHeader(buf.length); + } + trackHeader(len) { + this.headersSize += len; + if (this.headersSize >= this.headersMaxSize) { + util.destroy(this.socket, new HeadersOverflowError()); + } + } + onUpgrade(head) { + const { upgrade, client, socket, headers, statusCode } = this; + assert(upgrade); + const request = client[kQueue][client[kRunningIdx]]; + assert(request); + assert(!socket.destroyed); + assert(socket === client[kSocket]); + assert(!this.paused); + assert(request.upgrade || request.method === "CONNECT"); + this.statusCode = null; + this.statusText = ""; + this.shouldKeepAlive = null; + assert(this.headers.length % 2 === 0); + this.headers = []; + this.headersSize = 0; + socket.unshift(head); + socket[kParser].destroy(); + socket[kParser] = null; + socket[kClient] = null; + socket[kError] = null; + socket.removeListener("error", onSocketError).removeListener("readable", onSocketReadable).removeListener("end", onSocketEnd).removeListener("close", onSocketClose); + client[kSocket] = null; + client[kQueue][client[kRunningIdx]++] = null; + client.emit("disconnect", client[kUrl], [client], new InformationalError("upgrade")); + try { + request.onUpgrade(statusCode, headers, socket); + } catch (err) { + util.destroy(socket, err); + } + resume(client); + } + onHeadersComplete(statusCode, upgrade, shouldKeepAlive) { + const { client, socket, headers, statusText } = this; + if (socket.destroyed) { + return -1; + } + const request = client[kQueue][client[kRunningIdx]]; + if (!request) { + return -1; + } + assert(!this.upgrade); + assert(this.statusCode < 200); + if (statusCode === 100) { + util.destroy(socket, new SocketError("bad response", util.getSocketInfo(socket))); + return -1; + } + if (upgrade && !request.upgrade) { + util.destroy(socket, new SocketError("bad upgrade", util.getSocketInfo(socket))); + return -1; + } + assert.strictEqual(this.timeoutType, TIMEOUT_HEADERS); + this.statusCode = statusCode; + this.shouldKeepAlive = shouldKeepAlive || // Override llhttp value which does not allow keepAlive for HEAD. + request.method === "HEAD" && !socket[kReset] && this.connection.toLowerCase() === "keep-alive"; + if (this.statusCode >= 200) { + const bodyTimeout = request.bodyTimeout != null ? request.bodyTimeout : client[kBodyTimeout]; + this.setTimeout(bodyTimeout, TIMEOUT_BODY); + } else if (this.timeout) { + if (this.timeout.refresh) { + this.timeout.refresh(); + } + } + if (request.method === "CONNECT") { + assert(client[kRunning] === 1); + this.upgrade = true; + return 2; + } + if (upgrade) { + assert(client[kRunning] === 1); + this.upgrade = true; + return 2; + } + assert(this.headers.length % 2 === 0); + this.headers = []; + this.headersSize = 0; + if (this.shouldKeepAlive && client[kPipelining]) { + const keepAliveTimeout = this.keepAlive ? util.parseKeepAliveTimeout(this.keepAlive) : null; + if (keepAliveTimeout != null) { + const timeout = Math.min( + keepAliveTimeout - client[kKeepAliveTimeoutThreshold], + client[kKeepAliveMaxTimeout] + ); + if (timeout <= 0) { + socket[kReset] = true; + } else { + client[kKeepAliveTimeoutValue] = timeout; + } + } else { + client[kKeepAliveTimeoutValue] = client[kKeepAliveDefaultTimeout]; + } + } else { + socket[kReset] = true; + } + let pause; + try { + pause = request.onHeaders(statusCode, headers, this.resume, statusText) === false; + } catch (err) { + util.destroy(socket, err); + return -1; + } + if (request.method === "HEAD") { + return 1; + } + if (statusCode < 200) { + return 1; + } + if (socket[kBlocking]) { + socket[kBlocking] = false; + resume(client); + } + return pause ? constants.ERROR.PAUSED : 0; + } + onBody(buf) { + const { client, socket, statusCode, maxResponseSize } = this; + if (socket.destroyed) { + return -1; + } + const request = client[kQueue][client[kRunningIdx]]; + assert(request); + assert.strictEqual(this.timeoutType, TIMEOUT_BODY); + if (this.timeout) { + if (this.timeout.refresh) { + this.timeout.refresh(); + } + } + assert(statusCode >= 200); + if (maxResponseSize > -1 && this.bytesRead + buf.length > maxResponseSize) { + util.destroy(socket, new ResponseExceededMaxSizeError()); + return -1; + } + this.bytesRead += buf.length; + try { + if (request.onData(buf) === false) { + return constants.ERROR.PAUSED; + } + } catch (err) { + util.destroy(socket, err); + return -1; + } + } + onMessageComplete() { + const { client, socket, statusCode, upgrade, headers, contentLength, bytesRead, shouldKeepAlive } = this; + if (socket.destroyed && (!statusCode || shouldKeepAlive)) { + return -1; + } + if (upgrade) { + return; + } + const request = client[kQueue][client[kRunningIdx]]; + assert(request); + assert(statusCode >= 100); + this.statusCode = null; + this.statusText = ""; + this.bytesRead = 0; + this.contentLength = ""; + this.keepAlive = ""; + this.connection = ""; + assert(this.headers.length % 2 === 0); + this.headers = []; + this.headersSize = 0; + if (statusCode < 200) { + return; + } + if (request.method !== "HEAD" && contentLength && bytesRead !== parseInt(contentLength, 10)) { + util.destroy(socket, new ResponseContentLengthMismatchError()); + return -1; + } + try { + request.onComplete(headers); + } catch (err) { + errorRequest(client, request, err); + } + client[kQueue][client[kRunningIdx]++] = null; + if (socket[kWriting]) { + assert.strictEqual(client[kRunning], 0); + util.destroy(socket, new InformationalError("reset")); + return constants.ERROR.PAUSED; + } else if (!shouldKeepAlive) { + util.destroy(socket, new InformationalError("reset")); + return constants.ERROR.PAUSED; + } else if (socket[kReset] && client[kRunning] === 0) { + util.destroy(socket, new InformationalError("reset")); + return constants.ERROR.PAUSED; + } else if (client[kPipelining] === 1) { + setImmediate(resume, client); + } else { + resume(client); + } + } + }; + function onParserTimeout(parser) { + const { socket, timeoutType, client } = parser; + if (timeoutType === TIMEOUT_HEADERS) { + if (!socket[kWriting] || socket.writableNeedDrain || client[kRunning] > 1) { + assert(!parser.paused, "cannot be paused while waiting for headers"); + util.destroy(socket, new HeadersTimeoutError()); + } + } else if (timeoutType === TIMEOUT_BODY) { + if (!parser.paused) { + util.destroy(socket, new BodyTimeoutError()); + } + } else if (timeoutType === TIMEOUT_IDLE) { + assert(client[kRunning] === 0 && client[kKeepAliveTimeoutValue]); + util.destroy(socket, new InformationalError("socket idle timeout")); + } + } + function onSocketReadable() { + const { [kParser]: parser } = this; + parser.readMore(); + } + function onSocketError(err) { + const { [kParser]: parser } = this; + assert(err.code !== "ERR_TLS_CERT_ALTNAME_INVALID"); + if (err.code === "ECONNRESET" && parser.statusCode && !parser.shouldKeepAlive) { + parser.onMessageComplete(); + return; + } + this[kError] = err; + onError(this[kClient], err); + } + function onError(client, err) { + if (client[kRunning] === 0 && err.code !== "UND_ERR_INFO" && err.code !== "UND_ERR_SOCKET") { + assert(client[kPendingIdx] === client[kRunningIdx]); + const requests = client[kQueue].splice(client[kRunningIdx]); + for (let i = 0; i < requests.length; i++) { + const request = requests[i]; + errorRequest(client, request, err); + } + assert(client[kSize] === 0); + } + } + function onSocketEnd() { + const { [kParser]: parser } = this; + if (parser.statusCode && !parser.shouldKeepAlive) { + parser.onMessageComplete(); + return; + } + util.destroy(this, new SocketError("other side closed", util.getSocketInfo(this))); + } + function onSocketClose() { + const { [kClient]: client } = this; + if (!this[kError] && this[kParser].statusCode && !this[kParser].shouldKeepAlive) { + this[kParser].onMessageComplete(); + } + this[kParser].destroy(); + this[kParser] = null; + const err = this[kError] || new SocketError("closed", util.getSocketInfo(this)); + client[kSocket] = null; + if (client.destroyed) { + assert(client[kPending] === 0); + const requests = client[kQueue].splice(client[kRunningIdx]); + for (let i = 0; i < requests.length; i++) { + const request = requests[i]; + errorRequest(client, request, err); + } + } else if (client[kRunning] > 0 && err.code !== "UND_ERR_INFO") { + const request = client[kQueue][client[kRunningIdx]]; + client[kQueue][client[kRunningIdx]++] = null; + errorRequest(client, request, err); + } + client[kPendingIdx] = client[kRunningIdx]; + assert(client[kRunning] === 0); + client.emit("disconnect", client[kUrl], [client], err); + resume(client); + } + async function connect(client) { + assert(!client[kConnecting]); + assert(!client[kSocket]); + let { host, hostname, protocol, port } = client[kUrl]; + if (hostname[0] === "[") { + const idx = hostname.indexOf("]"); + assert(idx !== -1); + const ip2 = hostname.substr(1, idx - 1); + assert(net.isIP(ip2)); + hostname = ip2; + } + client[kConnecting] = true; + if (channels.beforeConnect.hasSubscribers) { + channels.beforeConnect.publish({ + connectParams: { + host, + hostname, + protocol, + port, + servername: client[kServerName], + localAddress: client[kLocalAddress] + }, + connector: client[kConnector] + }); + } + try { + const socket = await new Promise((resolve, reject) => { + client[kConnector]({ + host, + hostname, + protocol, + port, + servername: client[kServerName], + localAddress: client[kLocalAddress] + }, (err, socket2) => { + if (err) { + reject(err); + } else { + resolve(socket2); + } + }); + }); + if (client.destroyed) { + util.destroy(socket.on("error", () => { + }), new ClientDestroyedError()); + return; + } + if (!llhttpInstance) { + llhttpInstance = await llhttpPromise; + llhttpPromise = null; + } + client[kConnecting] = false; + assert(socket); + socket[kNoRef] = false; + socket[kWriting] = false; + socket[kReset] = false; + socket[kBlocking] = false; + socket[kError] = null; + socket[kParser] = new Parser(client, socket, llhttpInstance); + socket[kClient] = client; + socket[kCounter] = 0; + socket[kMaxRequests] = client[kMaxRequests]; + socket.on("error", onSocketError).on("readable", onSocketReadable).on("end", onSocketEnd).on("close", onSocketClose); + client[kSocket] = socket; + if (channels.connected.hasSubscribers) { + channels.connected.publish({ + connectParams: { + host, + hostname, + protocol, + port, + servername: client[kServerName], + localAddress: client[kLocalAddress] + }, + connector: client[kConnector], + socket + }); + } + client.emit("connect", client[kUrl], [client]); + } catch (err) { + if (client.destroyed) { + return; + } + client[kConnecting] = false; + if (channels.connectError.hasSubscribers) { + channels.connectError.publish({ + connectParams: { + host, + hostname, + protocol, + port, + servername: client[kServerName], + localAddress: client[kLocalAddress] + }, + connector: client[kConnector], + error: err + }); + } + if (err.code === "ERR_TLS_CERT_ALTNAME_INVALID") { + assert(client[kRunning] === 0); + while (client[kPending] > 0 && client[kQueue][client[kPendingIdx]].servername === client[kServerName]) { + const request = client[kQueue][client[kPendingIdx]++]; + errorRequest(client, request, err); + } + } else { + onError(client, err); + } + client.emit("connectionError", client[kUrl], [client], err); + } + resume(client); + } + function emitDrain(client) { + client[kNeedDrain] = 0; + client.emit("drain", client[kUrl], [client]); + } + function resume(client, sync) { + if (client[kResuming] === 2) { + return; + } + client[kResuming] = 2; + _resume(client, sync); + client[kResuming] = 0; + if (client[kRunningIdx] > 256) { + client[kQueue].splice(0, client[kRunningIdx]); + client[kPendingIdx] -= client[kRunningIdx]; + client[kRunningIdx] = 0; + } + } + function _resume(client, sync) { + while (true) { + if (client.destroyed) { + assert(client[kPending] === 0); + return; + } + if (client[kClosedResolve] && !client[kSize]) { + client[kClosedResolve](); + client[kClosedResolve] = null; + return; + } + const socket = client[kSocket]; + if (socket && !socket.destroyed) { + if (client[kSize] === 0) { + if (!socket[kNoRef] && socket.unref) { + socket.unref(); + socket[kNoRef] = true; + } + } else if (socket[kNoRef] && socket.ref) { + socket.ref(); + socket[kNoRef] = false; + } + if (client[kSize] === 0) { + if (socket[kParser].timeoutType !== TIMEOUT_IDLE) { + socket[kParser].setTimeout(client[kKeepAliveTimeoutValue], TIMEOUT_IDLE); + } + } else if (client[kRunning] > 0 && socket[kParser].statusCode < 200) { + if (socket[kParser].timeoutType !== TIMEOUT_HEADERS) { + const request2 = client[kQueue][client[kRunningIdx]]; + const headersTimeout = request2.headersTimeout != null ? request2.headersTimeout : client[kHeadersTimeout]; + socket[kParser].setTimeout(headersTimeout, TIMEOUT_HEADERS); + } + } + } + if (client[kBusy]) { + client[kNeedDrain] = 2; + } else if (client[kNeedDrain] === 2) { + if (sync) { + client[kNeedDrain] = 1; + process.nextTick(emitDrain, client); + } else { + emitDrain(client); + } + continue; + } + if (client[kPending] === 0) { + return; + } + if (client[kRunning] >= (client[kPipelining] || 1)) { + return; + } + const request = client[kQueue][client[kPendingIdx]]; + if (client[kUrl].protocol === "https:" && client[kServerName] !== request.servername) { + if (client[kRunning] > 0) { + return; + } + client[kServerName] = request.servername; + if (socket && socket.servername !== request.servername) { + util.destroy(socket, new InformationalError("servername changed")); + return; + } + } + if (client[kConnecting]) { + return; + } + if (!socket) { + connect(client); + return; + } + if (socket.destroyed || socket[kWriting] || socket[kReset] || socket[kBlocking]) { + return; + } + if (client[kRunning] > 0 && !request.idempotent) { + return; + } + if (client[kRunning] > 0 && (request.upgrade || request.method === "CONNECT")) { + return; + } + if (util.isStream(request.body) && util.bodyLength(request.body) === 0) { + request.body.on( + "data", + /* istanbul ignore next */ + function() { + assert(false); + } + ).on("error", function(err) { + errorRequest(client, request, err); + }).on("end", function() { + util.destroy(this); + }); + request.body = null; + } + if (client[kRunning] > 0 && (util.isStream(request.body) || util.isAsyncIterable(request.body))) { + return; + } + if (!request.aborted && write(client, request)) { + client[kPendingIdx]++; + } else { + client[kQueue].splice(client[kPendingIdx], 1); + } + } + } + function write(client, request) { + const { body, method, path, host, upgrade, headers, blocking, reset } = request; + const expectsPayload = method === "PUT" || method === "POST" || method === "PATCH"; + if (body && typeof body.read === "function") { + body.read(0); + } + let contentLength = util.bodyLength(body); + if (contentLength === null) { + contentLength = request.contentLength; + } + if (contentLength === 0 && !expectsPayload) { + contentLength = null; + } + if (request.contentLength !== null && request.contentLength !== contentLength) { + if (client[kStrictContentLength]) { + errorRequest(client, request, new RequestContentLengthMismatchError()); + return false; + } + process.emitWarning(new RequestContentLengthMismatchError()); + } + const socket = client[kSocket]; + try { + request.onConnect((err) => { + if (request.aborted || request.completed) { + return; + } + errorRequest(client, request, err || new RequestAbortedError()); + util.destroy(socket, new InformationalError("aborted")); + }); + } catch (err) { + errorRequest(client, request, err); + } + if (request.aborted) { + return false; + } + if (method === "HEAD") { + socket[kReset] = true; + } + if (upgrade || method === "CONNECT") { + socket[kReset] = true; + } + if (reset != null) { + socket[kReset] = reset; + } + if (client[kMaxRequests] && socket[kCounter]++ >= client[kMaxRequests]) { + socket[kReset] = true; + } + if (blocking) { + socket[kBlocking] = true; + } + let header = `${method} ${path} HTTP/1.1\r +`; + if (typeof host === "string") { + header += `host: ${host}\r +`; + } else { + header += client[kHostHeader]; + } + if (upgrade) { + header += `connection: upgrade\r +upgrade: ${upgrade}\r +`; + } else if (client[kPipelining] && !socket[kReset]) { + header += "connection: keep-alive\r\n"; + } else { + header += "connection: close\r\n"; + } + if (headers) { + header += headers; + } + if (channels.sendHeaders.hasSubscribers) { + channels.sendHeaders.publish({ request, headers: header, socket }); + } + if (!body) { + if (contentLength === 0) { + socket.write(`${header}content-length: 0\r +\r +`, "latin1"); + } else { + assert(contentLength === null, "no body must not have content length"); + socket.write(`${header}\r +`, "latin1"); + } + request.onRequestSent(); + } else if (util.isBuffer(body)) { + assert(contentLength === body.byteLength, "buffer body must have content length"); + socket.cork(); + socket.write(`${header}content-length: ${contentLength}\r +\r +`, "latin1"); + socket.write(body); + socket.uncork(); + request.onBodySent(body); + request.onRequestSent(); + if (!expectsPayload) { + socket[kReset] = true; + } + } else if (util.isBlobLike(body)) { + if (typeof body.stream === "function") { + writeIterable({ body: body.stream(), client, request, socket, contentLength, header, expectsPayload }); + } else { + writeBlob({ body, client, request, socket, contentLength, header, expectsPayload }); + } + } else if (util.isStream(body)) { + writeStream({ body, client, request, socket, contentLength, header, expectsPayload }); + } else if (util.isIterable(body)) { + writeIterable({ body, client, request, socket, contentLength, header, expectsPayload }); + } else { + assert(false); + } + return true; + } + function writeStream({ body, client, request, socket, contentLength, header, expectsPayload }) { + assert(contentLength !== 0 || client[kRunning] === 0, "stream body cannot be pipelined"); + let finished = false; + const writer = new AsyncWriter({ socket, request, contentLength, client, expectsPayload, header }); + const onData = function(chunk) { + if (finished) { + return; + } + try { + if (!writer.write(chunk) && this.pause) { + this.pause(); + } + } catch (err) { + util.destroy(this, err); + } + }; + const onDrain = function() { + if (finished) { + return; + } + if (body.resume) { + body.resume(); + } + }; + const onAbort = function() { + onFinished(new RequestAbortedError()); + }; + const onFinished = function(err) { + if (finished) { + return; + } + finished = true; + assert(socket.destroyed || socket[kWriting] && client[kRunning] <= 1); + socket.off("drain", onDrain).off("error", onFinished); + body.removeListener("data", onData).removeListener("end", onFinished).removeListener("error", onFinished).removeListener("close", onAbort); + if (!err) { + try { + writer.end(); + } catch (er) { + err = er; + } + } + writer.destroy(err); + if (err && (err.code !== "UND_ERR_INFO" || err.message !== "reset")) { + util.destroy(body, err); + } else { + util.destroy(body); + } + }; + body.on("data", onData).on("end", onFinished).on("error", onFinished).on("close", onAbort); + if (body.resume) { + body.resume(); + } + socket.on("drain", onDrain).on("error", onFinished); + } + async function writeBlob({ body, client, request, socket, contentLength, header, expectsPayload }) { + assert(contentLength === body.size, "blob body must have content length"); + try { + if (contentLength != null && contentLength !== body.size) { + throw new RequestContentLengthMismatchError(); + } + const buffer = Buffer.from(await body.arrayBuffer()); + socket.cork(); + socket.write(`${header}content-length: ${contentLength}\r +\r +`, "latin1"); + socket.write(buffer); + socket.uncork(); + request.onBodySent(buffer); + request.onRequestSent(); + if (!expectsPayload) { + socket[kReset] = true; + } + resume(client); + } catch (err) { + util.destroy(socket, err); + } + } + async function writeIterable({ body, client, request, socket, contentLength, header, expectsPayload }) { + assert(contentLength !== 0 || client[kRunning] === 0, "iterator body cannot be pipelined"); + let callback = null; + function onDrain() { + if (callback) { + const cb = callback; + callback = null; + cb(); + } + } + const waitForDrain = () => new Promise((resolve, reject) => { + assert(callback === null); + if (socket[kError]) { + reject(socket[kError]); + } else { + callback = resolve; + } + }); + socket.on("close", onDrain).on("drain", onDrain); + const writer = new AsyncWriter({ socket, request, contentLength, client, expectsPayload, header }); + try { + for await (const chunk of body) { + if (socket[kError]) { + throw socket[kError]; + } + if (!writer.write(chunk)) { + await waitForDrain(); + } + } + writer.end(); + } catch (err) { + writer.destroy(err); + } finally { + socket.off("close", onDrain).off("drain", onDrain); + } + } + var AsyncWriter = class { + constructor({ socket, request, contentLength, client, expectsPayload, header }) { + this.socket = socket; + this.request = request; + this.contentLength = contentLength; + this.client = client; + this.bytesWritten = 0; + this.expectsPayload = expectsPayload; + this.header = header; + socket[kWriting] = true; + } + write(chunk) { + const { socket, request, contentLength, client, bytesWritten, expectsPayload, header } = this; + if (socket[kError]) { + throw socket[kError]; + } + if (socket.destroyed) { + return false; + } + const len = Buffer.byteLength(chunk); + if (!len) { + return true; + } + if (contentLength !== null && bytesWritten + len > contentLength) { + if (client[kStrictContentLength]) { + throw new RequestContentLengthMismatchError(); + } + process.emitWarning(new RequestContentLengthMismatchError()); + } + socket.cork(); + if (bytesWritten === 0) { + if (!expectsPayload) { + socket[kReset] = true; + } + if (contentLength === null) { + socket.write(`${header}transfer-encoding: chunked\r +`, "latin1"); + } else { + socket.write(`${header}content-length: ${contentLength}\r +\r +`, "latin1"); + } + } + if (contentLength === null) { + socket.write(`\r +${len.toString(16)}\r +`, "latin1"); + } + this.bytesWritten += len; + const ret = socket.write(chunk); + socket.uncork(); + request.onBodySent(chunk); + if (!ret) { + if (socket[kParser].timeout && socket[kParser].timeoutType === TIMEOUT_HEADERS) { + if (socket[kParser].timeout.refresh) { + socket[kParser].timeout.refresh(); + } + } + } + return ret; + } + end() { + const { socket, contentLength, client, bytesWritten, expectsPayload, header, request } = this; + request.onRequestSent(); + socket[kWriting] = false; + if (socket[kError]) { + throw socket[kError]; + } + if (socket.destroyed) { + return; + } + if (bytesWritten === 0) { + if (expectsPayload) { + socket.write(`${header}content-length: 0\r +\r +`, "latin1"); + } else { + socket.write(`${header}\r +`, "latin1"); + } + } else if (contentLength === null) { + socket.write("\r\n0\r\n\r\n", "latin1"); + } + if (contentLength !== null && bytesWritten !== contentLength) { + if (client[kStrictContentLength]) { + throw new RequestContentLengthMismatchError(); + } else { + process.emitWarning(new RequestContentLengthMismatchError()); + } + } + if (socket[kParser].timeout && socket[kParser].timeoutType === TIMEOUT_HEADERS) { + if (socket[kParser].timeout.refresh) { + socket[kParser].timeout.refresh(); + } + } + resume(client); + } + destroy(err) { + const { socket, client } = this; + socket[kWriting] = false; + if (err) { + assert(client[kRunning] <= 1, "pipeline should only contain this request"); + util.destroy(socket, err); + } + } + }; + function errorRequest(client, request, err) { + try { + request.onError(err); + assert(request.aborted); + } catch (err2) { + client.emit("error", err2); + } + } + module2.exports = Client; + } +}); + +// node_modules/undici/lib/node/fixed-queue.js +var require_fixed_queue = __commonJS({ + "node_modules/undici/lib/node/fixed-queue.js"(exports2, module2) { + "use strict"; + var kSize = 2048; + var kMask = kSize - 1; + var FixedCircularBuffer = class { + constructor() { + this.bottom = 0; + this.top = 0; + this.list = new Array(kSize); + this.next = null; + } + isEmpty() { + return this.top === this.bottom; + } + isFull() { + return (this.top + 1 & kMask) === this.bottom; + } + push(data) { + this.list[this.top] = data; + this.top = this.top + 1 & kMask; + } + shift() { + const nextItem = this.list[this.bottom]; + if (nextItem === void 0) + return null; + this.list[this.bottom] = void 0; + this.bottom = this.bottom + 1 & kMask; + return nextItem; + } + }; + module2.exports = class FixedQueue { + constructor() { + this.head = this.tail = new FixedCircularBuffer(); + } + isEmpty() { + return this.head.isEmpty(); + } + push(data) { + if (this.head.isFull()) { + this.head = this.head.next = new FixedCircularBuffer(); + } + this.head.push(data); + } + shift() { + const tail = this.tail; + const next = tail.shift(); + if (tail.isEmpty() && tail.next !== null) { + this.tail = tail.next; + } + return next; + } + }; + } +}); + +// node_modules/undici/lib/pool-stats.js +var require_pool_stats = __commonJS({ + "node_modules/undici/lib/pool-stats.js"(exports2, module2) { + var { kFree, kConnected, kPending, kQueued, kRunning, kSize } = require_symbols(); + var kPool = Symbol("pool"); + var PoolStats = class { + constructor(pool) { + this[kPool] = pool; + } + get connected() { + return this[kPool][kConnected]; + } + get free() { + return this[kPool][kFree]; + } + get pending() { + return this[kPool][kPending]; + } + get queued() { + return this[kPool][kQueued]; + } + get running() { + return this[kPool][kRunning]; + } + get size() { + return this[kPool][kSize]; + } + }; + module2.exports = PoolStats; + } +}); + +// node_modules/undici/lib/pool-base.js +var require_pool_base = __commonJS({ + "node_modules/undici/lib/pool-base.js"(exports2, module2) { + "use strict"; + var DispatcherBase = require_dispatcher_base(); + var FixedQueue = require_fixed_queue(); + var { kConnected, kSize, kRunning, kPending, kQueued, kBusy, kFree, kUrl, kClose, kDestroy, kDispatch } = require_symbols(); + var PoolStats = require_pool_stats(); + var kClients = Symbol("clients"); + var kNeedDrain = Symbol("needDrain"); + var kQueue = Symbol("queue"); + var kClosedResolve = Symbol("closed resolve"); + var kOnDrain = Symbol("onDrain"); + var kOnConnect = Symbol("onConnect"); + var kOnDisconnect = Symbol("onDisconnect"); + var kOnConnectionError = Symbol("onConnectionError"); + var kGetDispatcher = Symbol("get dispatcher"); + var kAddClient = Symbol("add client"); + var kRemoveClient = Symbol("remove client"); + var kStats = Symbol("stats"); + var PoolBase = class extends DispatcherBase { + constructor() { + super(); + this[kQueue] = new FixedQueue(); + this[kClients] = []; + this[kQueued] = 0; + const pool = this; + this[kOnDrain] = function onDrain(origin, targets) { + const queue = pool[kQueue]; + let needDrain = false; + while (!needDrain) { + const item = queue.shift(); + if (!item) { + break; + } + pool[kQueued]--; + needDrain = !this.dispatch(item.opts, item.handler); + } + this[kNeedDrain] = needDrain; + if (!this[kNeedDrain] && pool[kNeedDrain]) { + pool[kNeedDrain] = false; + pool.emit("drain", origin, [pool, ...targets]); + } + if (pool[kClosedResolve] && queue.isEmpty()) { + Promise.all(pool[kClients].map((c) => c.close())).then(pool[kClosedResolve]); + } + }; + this[kOnConnect] = (origin, targets) => { + pool.emit("connect", origin, [pool, ...targets]); + }; + this[kOnDisconnect] = (origin, targets, err) => { + pool.emit("disconnect", origin, [pool, ...targets], err); + }; + this[kOnConnectionError] = (origin, targets, err) => { + pool.emit("connectionError", origin, [pool, ...targets], err); + }; + this[kStats] = new PoolStats(this); + } + get [kBusy]() { + return this[kNeedDrain]; + } + get [kConnected]() { + return this[kClients].filter((client) => client[kConnected]).length; + } + get [kFree]() { + return this[kClients].filter((client) => client[kConnected] && !client[kNeedDrain]).length; + } + get [kPending]() { + let ret = this[kQueued]; + for (const { [kPending]: pending } of this[kClients]) { + ret += pending; + } + return ret; + } + get [kRunning]() { + let ret = 0; + for (const { [kRunning]: running } of this[kClients]) { + ret += running; + } + return ret; + } + get [kSize]() { + let ret = this[kQueued]; + for (const { [kSize]: size } of this[kClients]) { + ret += size; + } + return ret; + } + get stats() { + return this[kStats]; + } + async [kClose]() { + if (this[kQueue].isEmpty()) { + return Promise.all(this[kClients].map((c) => c.close())); + } else { + return new Promise((resolve) => { + this[kClosedResolve] = resolve; + }); + } + } + async [kDestroy](err) { + while (true) { + const item = this[kQueue].shift(); + if (!item) { + break; + } + item.handler.onError(err); + } + return Promise.all(this[kClients].map((c) => c.destroy(err))); + } + [kDispatch](opts, handler2) { + const dispatcher = this[kGetDispatcher](); + if (!dispatcher) { + this[kNeedDrain] = true; + this[kQueue].push({ opts, handler: handler2 }); + this[kQueued]++; + } else if (!dispatcher.dispatch(opts, handler2)) { + dispatcher[kNeedDrain] = true; + this[kNeedDrain] = !this[kGetDispatcher](); + } + return !this[kNeedDrain]; + } + [kAddClient](client) { + client.on("drain", this[kOnDrain]).on("connect", this[kOnConnect]).on("disconnect", this[kOnDisconnect]).on("connectionError", this[kOnConnectionError]); + this[kClients].push(client); + if (this[kNeedDrain]) { + process.nextTick(() => { + if (this[kNeedDrain]) { + this[kOnDrain](client[kUrl], [this, client]); + } + }); + } + return this; + } + [kRemoveClient](client) { + client.close(() => { + const idx = this[kClients].indexOf(client); + if (idx !== -1) { + this[kClients].splice(idx, 1); + } + }); + this[kNeedDrain] = this[kClients].some((dispatcher) => !dispatcher[kNeedDrain] && dispatcher.closed !== true && dispatcher.destroyed !== true); + } + }; + module2.exports = { + PoolBase, + kClients, + kNeedDrain, + kAddClient, + kRemoveClient, + kGetDispatcher + }; + } +}); + +// node_modules/undici/lib/pool.js +var require_pool2 = __commonJS({ + "node_modules/undici/lib/pool.js"(exports2, module2) { + "use strict"; + var { + PoolBase, + kClients, + kNeedDrain, + kAddClient, + kGetDispatcher + } = require_pool_base(); + var Client = require_client4(); + var { + InvalidArgumentError + } = require_errors(); + var util = require_util4(); + var { kUrl, kInterceptors } = require_symbols(); + var buildConnector = require_connect2(); + var kOptions = Symbol("options"); + var kConnections = Symbol("connections"); + var kFactory = Symbol("factory"); + function defaultFactory(origin, opts) { + return new Client(origin, opts); + } + var Pool = class extends PoolBase { + constructor(origin, { + connections, + factory = defaultFactory, + connect, + connectTimeout, + tls, + maxCachedSessions, + socketPath, + autoSelectFamily, + autoSelectFamilyAttemptTimeout, + ...options2 + } = {}) { + super(); + if (connections != null && (!Number.isFinite(connections) || connections < 0)) { + throw new InvalidArgumentError("invalid connections"); + } + if (typeof factory !== "function") { + throw new InvalidArgumentError("factory must be a function."); + } + if (connect != null && typeof connect !== "function" && typeof connect !== "object") { + throw new InvalidArgumentError("connect must be a function or an object"); + } + if (typeof connect !== "function") { + connect = buildConnector({ + ...tls, + maxCachedSessions, + socketPath, + timeout: connectTimeout == null ? 1e4 : connectTimeout, + ...util.nodeHasAutoSelectFamily && autoSelectFamily ? { autoSelectFamily, autoSelectFamilyAttemptTimeout } : void 0, + ...connect + }); + } + this[kInterceptors] = options2.interceptors && options2.interceptors.Pool && Array.isArray(options2.interceptors.Pool) ? options2.interceptors.Pool : []; + this[kConnections] = connections || null; + this[kUrl] = util.parseOrigin(origin); + this[kOptions] = { ...util.deepClone(options2), connect }; + this[kOptions].interceptors = options2.interceptors ? { ...options2.interceptors } : void 0; + this[kFactory] = factory; + } + [kGetDispatcher]() { + let dispatcher = this[kClients].find((dispatcher2) => !dispatcher2[kNeedDrain]); + if (dispatcher) { + return dispatcher; + } + if (!this[kConnections] || this[kClients].length < this[kConnections]) { + dispatcher = this[kFactory](this[kUrl], this[kOptions]); + this[kAddClient](dispatcher); + } + return dispatcher; + } + }; + module2.exports = Pool; + } +}); + +// node_modules/undici/lib/balanced-pool.js +var require_balanced_pool = __commonJS({ + "node_modules/undici/lib/balanced-pool.js"(exports2, module2) { + "use strict"; + var { + BalancedPoolMissingUpstreamError, + InvalidArgumentError + } = require_errors(); + var { + PoolBase, + kClients, + kNeedDrain, + kAddClient, + kRemoveClient, + kGetDispatcher + } = require_pool_base(); + var Pool = require_pool2(); + var { kUrl, kInterceptors } = require_symbols(); + var { parseOrigin } = require_util4(); + var kFactory = Symbol("factory"); + var kOptions = Symbol("options"); + var kGreatestCommonDivisor = Symbol("kGreatestCommonDivisor"); + var kCurrentWeight = Symbol("kCurrentWeight"); + var kIndex = Symbol("kIndex"); + var kWeight = Symbol("kWeight"); + var kMaxWeightPerServer = Symbol("kMaxWeightPerServer"); + var kErrorPenalty = Symbol("kErrorPenalty"); + function getGreatestCommonDivisor(a, b) { + if (b === 0) + return a; + return getGreatestCommonDivisor(b, a % b); + } + function defaultFactory(origin, opts) { + return new Pool(origin, opts); + } + var BalancedPool = class extends PoolBase { + constructor(upstreams = [], { factory = defaultFactory, ...opts } = {}) { + super(); + this[kOptions] = opts; + this[kIndex] = -1; + this[kCurrentWeight] = 0; + this[kMaxWeightPerServer] = this[kOptions].maxWeightPerServer || 100; + this[kErrorPenalty] = this[kOptions].errorPenalty || 15; + if (!Array.isArray(upstreams)) { + upstreams = [upstreams]; + } + if (typeof factory !== "function") { + throw new InvalidArgumentError("factory must be a function."); + } + this[kInterceptors] = opts.interceptors && opts.interceptors.BalancedPool && Array.isArray(opts.interceptors.BalancedPool) ? opts.interceptors.BalancedPool : []; + this[kFactory] = factory; + for (const upstream of upstreams) { + this.addUpstream(upstream); + } + this._updateBalancedPoolStats(); + } + addUpstream(upstream) { + const upstreamOrigin = parseOrigin(upstream).origin; + if (this[kClients].find((pool2) => pool2[kUrl].origin === upstreamOrigin && pool2.closed !== true && pool2.destroyed !== true)) { + return this; + } + const pool = this[kFactory](upstreamOrigin, Object.assign({}, this[kOptions])); + this[kAddClient](pool); + pool.on("connect", () => { + pool[kWeight] = Math.min(this[kMaxWeightPerServer], pool[kWeight] + this[kErrorPenalty]); + }); + pool.on("connectionError", () => { + pool[kWeight] = Math.max(1, pool[kWeight] - this[kErrorPenalty]); + this._updateBalancedPoolStats(); + }); + pool.on("disconnect", (...args) => { + const err = args[2]; + if (err && err.code === "UND_ERR_SOCKET") { + pool[kWeight] = Math.max(1, pool[kWeight] - this[kErrorPenalty]); + this._updateBalancedPoolStats(); + } + }); + for (const client of this[kClients]) { + client[kWeight] = this[kMaxWeightPerServer]; + } + this._updateBalancedPoolStats(); + return this; + } + _updateBalancedPoolStats() { + this[kGreatestCommonDivisor] = this[kClients].map((p) => p[kWeight]).reduce(getGreatestCommonDivisor, 0); + } + removeUpstream(upstream) { + const upstreamOrigin = parseOrigin(upstream).origin; + const pool = this[kClients].find((pool2) => pool2[kUrl].origin === upstreamOrigin && pool2.closed !== true && pool2.destroyed !== true); + if (pool) { + this[kRemoveClient](pool); + } + return this; + } + get upstreams() { + return this[kClients].filter((dispatcher) => dispatcher.closed !== true && dispatcher.destroyed !== true).map((p) => p[kUrl].origin); + } + [kGetDispatcher]() { + if (this[kClients].length === 0) { + throw new BalancedPoolMissingUpstreamError(); + } + const dispatcher = this[kClients].find((dispatcher2) => !dispatcher2[kNeedDrain] && dispatcher2.closed !== true && dispatcher2.destroyed !== true); + if (!dispatcher) { + return; + } + const allClientsBusy = this[kClients].map((pool) => pool[kNeedDrain]).reduce((a, b) => a && b, true); + if (allClientsBusy) { + return; + } + let counter = 0; + let maxWeightIndex = this[kClients].findIndex((pool) => !pool[kNeedDrain]); + while (counter++ < this[kClients].length) { + this[kIndex] = (this[kIndex] + 1) % this[kClients].length; + const pool = this[kClients][this[kIndex]]; + if (pool[kWeight] > this[kClients][maxWeightIndex][kWeight] && !pool[kNeedDrain]) { + maxWeightIndex = this[kIndex]; + } + if (this[kIndex] === 0) { + this[kCurrentWeight] = this[kCurrentWeight] - this[kGreatestCommonDivisor]; + if (this[kCurrentWeight] <= 0) { + this[kCurrentWeight] = this[kMaxWeightPerServer]; + } + } + if (pool[kWeight] >= this[kCurrentWeight] && !pool[kNeedDrain]) { + return pool; + } + } + this[kCurrentWeight] = this[kClients][maxWeightIndex][kWeight]; + this[kIndex] = maxWeightIndex; + return this[kClients][maxWeightIndex]; + } + }; + module2.exports = BalancedPool; + } +}); + +// node_modules/undici/lib/compat/dispatcher-weakref.js +var require_dispatcher_weakref = __commonJS({ + "node_modules/undici/lib/compat/dispatcher-weakref.js"(exports2, module2) { + "use strict"; + var { kConnected, kSize } = require_symbols(); + var CompatWeakRef = class { + constructor(value) { + this.value = value; + } + deref() { + return this.value[kConnected] === 0 && this.value[kSize] === 0 ? void 0 : this.value; + } + }; + var CompatFinalizer = class { + constructor(finalizer) { + this.finalizer = finalizer; + } + register(dispatcher, key) { + dispatcher.on("disconnect", () => { + if (dispatcher[kConnected] === 0 && dispatcher[kSize] === 0) { + this.finalizer(key); + } + }); + } + }; + module2.exports = function() { + return { + WeakRef: global.WeakRef || CompatWeakRef, + FinalizationRegistry: global.FinalizationRegistry || CompatFinalizer + }; + }; + } +}); + +// node_modules/undici/lib/agent.js +var require_agent = __commonJS({ + "node_modules/undici/lib/agent.js"(exports2, module2) { + "use strict"; + var { InvalidArgumentError } = require_errors(); + var { kClients, kRunning, kClose, kDestroy, kDispatch, kInterceptors } = require_symbols(); + var DispatcherBase = require_dispatcher_base(); + var Pool = require_pool2(); + var Client = require_client4(); + var util = require_util4(); + var createRedirectInterceptor = require_redirectInterceptor(); + var { WeakRef: WeakRef2, FinalizationRegistry } = require_dispatcher_weakref()(); + var kOnConnect = Symbol("onConnect"); + var kOnDisconnect = Symbol("onDisconnect"); + var kOnConnectionError = Symbol("onConnectionError"); + var kMaxRedirections = Symbol("maxRedirections"); + var kOnDrain = Symbol("onDrain"); + var kFactory = Symbol("factory"); + var kFinalizer = Symbol("finalizer"); + var kOptions = Symbol("options"); + function defaultFactory(origin, opts) { + return opts && opts.connections === 1 ? new Client(origin, opts) : new Pool(origin, opts); + } + var Agent = class extends DispatcherBase { + constructor({ factory = defaultFactory, maxRedirections = 0, connect, ...options2 } = {}) { + super(); + if (typeof factory !== "function") { + throw new InvalidArgumentError("factory must be a function."); + } + if (connect != null && typeof connect !== "function" && typeof connect !== "object") { + throw new InvalidArgumentError("connect must be a function or an object"); + } + if (!Number.isInteger(maxRedirections) || maxRedirections < 0) { + throw new InvalidArgumentError("maxRedirections must be a positive number"); + } + if (connect && typeof connect !== "function") { + connect = { ...connect }; + } + this[kInterceptors] = options2.interceptors && options2.interceptors.Agent && Array.isArray(options2.interceptors.Agent) ? options2.interceptors.Agent : [createRedirectInterceptor({ maxRedirections })]; + this[kOptions] = { ...util.deepClone(options2), connect }; + this[kOptions].interceptors = options2.interceptors ? { ...options2.interceptors } : void 0; + this[kMaxRedirections] = maxRedirections; + this[kFactory] = factory; + this[kClients] = /* @__PURE__ */ new Map(); + this[kFinalizer] = new FinalizationRegistry( + /* istanbul ignore next: gc is undeterministic */ + (key) => { + const ref = this[kClients].get(key); + if (ref !== void 0 && ref.deref() === void 0) { + this[kClients].delete(key); + } + } + ); + const agent = this; + this[kOnDrain] = (origin, targets) => { + agent.emit("drain", origin, [agent, ...targets]); + }; + this[kOnConnect] = (origin, targets) => { + agent.emit("connect", origin, [agent, ...targets]); + }; + this[kOnDisconnect] = (origin, targets, err) => { + agent.emit("disconnect", origin, [agent, ...targets], err); + }; + this[kOnConnectionError] = (origin, targets, err) => { + agent.emit("connectionError", origin, [agent, ...targets], err); + }; + } + get [kRunning]() { + let ret = 0; + for (const ref of this[kClients].values()) { + const client = ref.deref(); + if (client) { + ret += client[kRunning]; + } + } + return ret; + } + [kDispatch](opts, handler2) { + let key; + if (opts.origin && (typeof opts.origin === "string" || opts.origin instanceof URL)) { + key = String(opts.origin); + } else { + throw new InvalidArgumentError("opts.origin must be a non-empty string or URL."); + } + const ref = this[kClients].get(key); + let dispatcher = ref ? ref.deref() : null; + if (!dispatcher) { + dispatcher = this[kFactory](opts.origin, this[kOptions]).on("drain", this[kOnDrain]).on("connect", this[kOnConnect]).on("disconnect", this[kOnDisconnect]).on("connectionError", this[kOnConnectionError]); + this[kClients].set(key, new WeakRef2(dispatcher)); + this[kFinalizer].register(dispatcher, key); + } + return dispatcher.dispatch(opts, handler2); + } + async [kClose]() { + const closePromises = []; + for (const ref of this[kClients].values()) { + const client = ref.deref(); + if (client) { + closePromises.push(client.close()); + } + } + await Promise.all(closePromises); + } + async [kDestroy](err) { + const destroyPromises = []; + for (const ref of this[kClients].values()) { + const client = ref.deref(); + if (client) { + destroyPromises.push(client.destroy(err)); + } + } + await Promise.all(destroyPromises); + } + }; + module2.exports = Agent; + } +}); + +// node_modules/undici/lib/api/readable.js +var require_readable = __commonJS({ + "node_modules/undici/lib/api/readable.js"(exports2, module2) { + "use strict"; + var assert = require("assert"); + var { Readable } = require("stream"); + var { RequestAbortedError, NotSupportedError, InvalidArgumentError } = require_errors(); + var util = require_util4(); + var { ReadableStreamFrom, toUSVString } = require_util4(); + var Blob2; + var kConsume = Symbol("kConsume"); + var kReading = Symbol("kReading"); + var kBody = Symbol("kBody"); + var kAbort = Symbol("abort"); + var kContentType = Symbol("kContentType"); + module2.exports = class BodyReadable extends Readable { + constructor({ + resume, + abort, + contentType = "", + highWaterMark = 64 * 1024 + // Same as nodejs fs streams. + }) { + super({ + autoDestroy: true, + read: resume, + highWaterMark + }); + this._readableState.dataEmitted = false; + this[kAbort] = abort; + this[kConsume] = null; + this[kBody] = null; + this[kContentType] = contentType; + this[kReading] = false; + } + destroy(err) { + if (this.destroyed) { + return this; + } + if (!err && !this._readableState.endEmitted) { + err = new RequestAbortedError(); + } + if (err) { + this[kAbort](); + } + return super.destroy(err); + } + emit(ev, ...args) { + if (ev === "data") { + this._readableState.dataEmitted = true; + } else if (ev === "error") { + this._readableState.errorEmitted = true; + } + return super.emit(ev, ...args); + } + on(ev, ...args) { + if (ev === "data" || ev === "readable") { + this[kReading] = true; + } + return super.on(ev, ...args); + } + addListener(ev, ...args) { + return this.on(ev, ...args); + } + off(ev, ...args) { + const ret = super.off(ev, ...args); + if (ev === "data" || ev === "readable") { + this[kReading] = this.listenerCount("data") > 0 || this.listenerCount("readable") > 0; + } + return ret; + } + removeListener(ev, ...args) { + return this.off(ev, ...args); + } + push(chunk) { + if (this[kConsume] && chunk !== null && this.readableLength === 0) { + consumePush(this[kConsume], chunk); + return this[kReading] ? super.push(chunk) : true; + } + return super.push(chunk); + } + // https://fetch.spec.whatwg.org/#dom-body-text + async text() { + return consume(this, "text"); + } + // https://fetch.spec.whatwg.org/#dom-body-json + async json() { + return consume(this, "json"); + } + // https://fetch.spec.whatwg.org/#dom-body-blob + async blob() { + return consume(this, "blob"); + } + // https://fetch.spec.whatwg.org/#dom-body-arraybuffer + async arrayBuffer() { + return consume(this, "arrayBuffer"); + } + // https://fetch.spec.whatwg.org/#dom-body-formdata + async formData() { + throw new NotSupportedError(); + } + // https://fetch.spec.whatwg.org/#dom-body-bodyused + get bodyUsed() { + return util.isDisturbed(this); + } + // https://fetch.spec.whatwg.org/#dom-body-body + get body() { + if (!this[kBody]) { + this[kBody] = ReadableStreamFrom(this); + if (this[kConsume]) { + this[kBody].getReader(); + assert(this[kBody].locked); + } + } + return this[kBody]; + } + async dump(opts) { + let limit = opts && Number.isFinite(opts.limit) ? opts.limit : 262144; + const signal = opts && opts.signal; + const abortFn = () => { + this.destroy(); + }; + let signalListenerCleanup; + if (signal) { + if (typeof signal !== "object" || !("aborted" in signal)) { + throw new InvalidArgumentError("signal must be an AbortSignal"); + } + util.throwIfAborted(signal); + signalListenerCleanup = util.addAbortListener(signal, abortFn); + } + try { + for await (const chunk of this) { + util.throwIfAborted(signal); + limit -= Buffer.byteLength(chunk); + if (limit < 0) { + return; + } + } + } catch { + util.throwIfAborted(signal); + } finally { + if (typeof signalListenerCleanup === "function") { + signalListenerCleanup(); + } else if (signalListenerCleanup) { + signalListenerCleanup[Symbol.dispose](); + } + } + } + }; + function isLocked(self2) { + return self2[kBody] && self2[kBody].locked === true || self2[kConsume]; + } + function isUnusable(self2) { + return util.isDisturbed(self2) || isLocked(self2); + } + async function consume(stream, type) { + if (isUnusable(stream)) { + throw new TypeError("unusable"); + } + assert(!stream[kConsume]); + return new Promise((resolve, reject) => { + stream[kConsume] = { + type, + stream, + resolve, + reject, + length: 0, + body: [] + }; + stream.on("error", function(err) { + consumeFinish(this[kConsume], err); + }).on("close", function() { + if (this[kConsume].body !== null) { + consumeFinish(this[kConsume], new RequestAbortedError()); + } + }); + process.nextTick(consumeStart, stream[kConsume]); + }); + } + function consumeStart(consume2) { + if (consume2.body === null) { + return; + } + const { _readableState: state } = consume2.stream; + for (const chunk of state.buffer) { + consumePush(consume2, chunk); + } + if (state.endEmitted) { + consumeEnd(this[kConsume]); + } else { + consume2.stream.on("end", function() { + consumeEnd(this[kConsume]); + }); + } + consume2.stream.resume(); + while (consume2.stream.read() != null) { + } + } + function consumeEnd(consume2) { + const { type, body, resolve, stream, length } = consume2; + try { + if (type === "text") { + resolve(toUSVString(Buffer.concat(body))); + } else if (type === "json") { + resolve(JSON.parse(Buffer.concat(body))); + } else if (type === "arrayBuffer") { + const dst = new Uint8Array(length); + let pos = 0; + for (const buf of body) { + dst.set(buf, pos); + pos += buf.byteLength; + } + resolve(dst); + } else if (type === "blob") { + if (!Blob2) { + Blob2 = require("buffer").Blob; + } + resolve(new Blob2(body, { type: stream[kContentType] })); + } + consumeFinish(consume2); + } catch (err) { + stream.destroy(err); + } + } + function consumePush(consume2, chunk) { + consume2.length += chunk.length; + consume2.body.push(chunk); + } + function consumeFinish(consume2, err) { + if (consume2.body === null) { + return; + } + if (err) { + consume2.reject(err); + } else { + consume2.resolve(); + } + consume2.type = null; + consume2.stream = null; + consume2.resolve = null; + consume2.reject = null; + consume2.length = 0; + consume2.body = null; + } + } +}); + +// node_modules/undici/lib/api/util.js +var require_util6 = __commonJS({ + "node_modules/undici/lib/api/util.js"(exports2, module2) { + var assert = require("assert"); + var { + ResponseStatusCodeError + } = require_errors(); + var { toUSVString } = require_util4(); + async function getResolveErrorBodyCallback({ callback, body, contentType, statusCode, statusMessage, headers }) { + assert(body); + let chunks = []; + let limit = 0; + for await (const chunk of body) { + chunks.push(chunk); + limit += chunk.length; + if (limit > 128 * 1024) { + chunks = null; + break; + } + } + if (statusCode === 204 || !contentType || !chunks) { + process.nextTick(callback, new ResponseStatusCodeError(`Response status code ${statusCode}${statusMessage ? `: ${statusMessage}` : ""}`, statusCode, headers)); + return; + } + try { + if (contentType.startsWith("application/json")) { + const payload = JSON.parse(toUSVString(Buffer.concat(chunks))); + process.nextTick(callback, new ResponseStatusCodeError(`Response status code ${statusCode}${statusMessage ? `: ${statusMessage}` : ""}`, statusCode, headers, payload)); + return; + } + if (contentType.startsWith("text/")) { + const payload = toUSVString(Buffer.concat(chunks)); + process.nextTick(callback, new ResponseStatusCodeError(`Response status code ${statusCode}${statusMessage ? `: ${statusMessage}` : ""}`, statusCode, headers, payload)); + return; + } + } catch (err) { + } + process.nextTick(callback, new ResponseStatusCodeError(`Response status code ${statusCode}${statusMessage ? `: ${statusMessage}` : ""}`, statusCode, headers)); + } + module2.exports = { getResolveErrorBodyCallback }; + } +}); + +// node_modules/undici/lib/api/abort-signal.js +var require_abort_signal = __commonJS({ + "node_modules/undici/lib/api/abort-signal.js"(exports2, module2) { + var { addAbortListener } = require_util4(); + var { RequestAbortedError } = require_errors(); + var kListener = Symbol("kListener"); + var kSignal = Symbol("kSignal"); + function abort(self2) { + if (self2.abort) { + self2.abort(); + } else { + self2.onError(new RequestAbortedError()); + } + } + function addSignal(self2, signal) { + self2[kSignal] = null; + self2[kListener] = null; + if (!signal) { + return; + } + if (signal.aborted) { + abort(self2); + return; + } + self2[kSignal] = signal; + self2[kListener] = () => { + abort(self2); + }; + addAbortListener(self2[kSignal], self2[kListener]); + } + function removeSignal(self2) { + if (!self2[kSignal]) { + return; + } + if ("removeEventListener" in self2[kSignal]) { + self2[kSignal].removeEventListener("abort", self2[kListener]); + } else { + self2[kSignal].removeListener("abort", self2[kListener]); + } + self2[kSignal] = null; + self2[kListener] = null; + } + module2.exports = { + addSignal, + removeSignal + }; + } +}); + +// node_modules/undici/lib/api/api-request.js +var require_api_request = __commonJS({ + "node_modules/undici/lib/api/api-request.js"(exports2, module2) { + "use strict"; + var Readable = require_readable(); + var { + InvalidArgumentError, + RequestAbortedError + } = require_errors(); + var util = require_util4(); + var { getResolveErrorBodyCallback } = require_util6(); + var { AsyncResource } = require("async_hooks"); + var { addSignal, removeSignal } = require_abort_signal(); + var RequestHandler = class extends AsyncResource { + constructor(opts, callback) { + if (!opts || typeof opts !== "object") { + throw new InvalidArgumentError("invalid opts"); + } + const { signal, method, opaque, body, onInfo, responseHeaders, throwOnError, highWaterMark } = opts; + try { + if (typeof callback !== "function") { + throw new InvalidArgumentError("invalid callback"); + } + if (highWaterMark && (typeof highWaterMark !== "number" || highWaterMark < 0)) { + throw new InvalidArgumentError("invalid highWaterMark"); + } + if (signal && typeof signal.on !== "function" && typeof signal.addEventListener !== "function") { + throw new InvalidArgumentError("signal must be an EventEmitter or EventTarget"); + } + if (method === "CONNECT") { + throw new InvalidArgumentError("invalid method"); + } + if (onInfo && typeof onInfo !== "function") { + throw new InvalidArgumentError("invalid onInfo callback"); + } + super("UNDICI_REQUEST"); + } catch (err) { + if (util.isStream(body)) { + util.destroy(body.on("error", util.nop), err); + } + throw err; + } + this.responseHeaders = responseHeaders || null; + this.opaque = opaque || null; + this.callback = callback; + this.res = null; + this.abort = null; + this.body = body; + this.trailers = {}; + this.context = null; + this.onInfo = onInfo || null; + this.throwOnError = throwOnError; + this.highWaterMark = highWaterMark; + if (util.isStream(body)) { + body.on("error", (err) => { + this.onError(err); + }); + } + addSignal(this, signal); + } + onConnect(abort, context) { + if (!this.callback) { + throw new RequestAbortedError(); + } + this.abort = abort; + this.context = context; + } + onHeaders(statusCode, rawHeaders, resume, statusMessage) { + const { callback, opaque, abort, context, responseHeaders, highWaterMark } = this; + const headers = responseHeaders === "raw" ? util.parseRawHeaders(rawHeaders) : util.parseHeaders(rawHeaders); + if (statusCode < 200) { + if (this.onInfo) { + this.onInfo({ statusCode, headers }); + } + return; + } + const parsedHeaders = responseHeaders === "raw" ? util.parseHeaders(rawHeaders) : headers; + const contentType = parsedHeaders["content-type"]; + const body = new Readable({ resume, abort, contentType, highWaterMark }); + this.callback = null; + this.res = body; + if (callback !== null) { + if (this.throwOnError && statusCode >= 400) { + this.runInAsyncScope( + getResolveErrorBodyCallback, + null, + { callback, body, contentType, statusCode, statusMessage, headers } + ); + } else { + this.runInAsyncScope(callback, null, null, { + statusCode, + headers, + trailers: this.trailers, + opaque, + body, + context + }); + } + } + } + onData(chunk) { + const { res } = this; + return res.push(chunk); + } + onComplete(trailers) { + const { res } = this; + removeSignal(this); + util.parseHeaders(trailers, this.trailers); + res.push(null); + } + onError(err) { + const { res, callback, body, opaque } = this; + removeSignal(this); + if (callback) { + this.callback = null; + queueMicrotask(() => { + this.runInAsyncScope(callback, null, err, { opaque }); + }); + } + if (res) { + this.res = null; + queueMicrotask(() => { + util.destroy(res, err); + }); + } + if (body) { + this.body = null; + util.destroy(body, err); + } + } + }; + function request(opts, callback) { + if (callback === void 0) { + return new Promise((resolve, reject) => { + request.call(this, opts, (err, data) => { + return err ? reject(err) : resolve(data); + }); + }); + } + try { + this.dispatch(opts, new RequestHandler(opts, callback)); + } catch (err) { + if (typeof callback !== "function") { + throw err; + } + const opaque = opts && opts.opaque; + queueMicrotask(() => callback(err, { opaque })); + } + } + module2.exports = request; + } +}); + +// node_modules/undici/lib/api/api-stream.js +var require_api_stream = __commonJS({ + "node_modules/undici/lib/api/api-stream.js"(exports2, module2) { + "use strict"; + var { finished, PassThrough } = require("stream"); + var { + InvalidArgumentError, + InvalidReturnValueError, + RequestAbortedError + } = require_errors(); + var util = require_util4(); + var { getResolveErrorBodyCallback } = require_util6(); + var { AsyncResource } = require("async_hooks"); + var { addSignal, removeSignal } = require_abort_signal(); + var StreamHandler = class extends AsyncResource { + constructor(opts, factory, callback) { + if (!opts || typeof opts !== "object") { + throw new InvalidArgumentError("invalid opts"); + } + const { signal, method, opaque, body, onInfo, responseHeaders, throwOnError } = opts; + try { + if (typeof callback !== "function") { + throw new InvalidArgumentError("invalid callback"); + } + if (typeof factory !== "function") { + throw new InvalidArgumentError("invalid factory"); + } + if (signal && typeof signal.on !== "function" && typeof signal.addEventListener !== "function") { + throw new InvalidArgumentError("signal must be an EventEmitter or EventTarget"); + } + if (method === "CONNECT") { + throw new InvalidArgumentError("invalid method"); + } + if (onInfo && typeof onInfo !== "function") { + throw new InvalidArgumentError("invalid onInfo callback"); + } + super("UNDICI_STREAM"); + } catch (err) { + if (util.isStream(body)) { + util.destroy(body.on("error", util.nop), err); + } + throw err; + } + this.responseHeaders = responseHeaders || null; + this.opaque = opaque || null; + this.factory = factory; + this.callback = callback; + this.res = null; + this.abort = null; + this.context = null; + this.trailers = null; + this.body = body; + this.onInfo = onInfo || null; + this.throwOnError = throwOnError || false; + if (util.isStream(body)) { + body.on("error", (err) => { + this.onError(err); + }); + } + addSignal(this, signal); + } + onConnect(abort, context) { + if (!this.callback) { + throw new RequestAbortedError(); + } + this.abort = abort; + this.context = context; + } + onHeaders(statusCode, rawHeaders, resume, statusMessage) { + const { factory, opaque, context, callback, responseHeaders } = this; + const headers = responseHeaders === "raw" ? util.parseRawHeaders(rawHeaders) : util.parseHeaders(rawHeaders); + if (statusCode < 200) { + if (this.onInfo) { + this.onInfo({ statusCode, headers }); + } + return; + } + this.factory = null; + let res; + if (this.throwOnError && statusCode >= 400) { + const parsedHeaders = responseHeaders === "raw" ? util.parseHeaders(rawHeaders) : headers; + const contentType = parsedHeaders["content-type"]; + res = new PassThrough(); + this.callback = null; + this.runInAsyncScope( + getResolveErrorBodyCallback, + null, + { callback, body: res, contentType, statusCode, statusMessage, headers } + ); + } else { + res = this.runInAsyncScope(factory, null, { + statusCode, + headers, + opaque, + context + }); + if (!res || typeof res.write !== "function" || typeof res.end !== "function" || typeof res.on !== "function") { + throw new InvalidReturnValueError("expected Writable"); + } + finished(res, { readable: false }, (err) => { + const { callback: callback2, res: res2, opaque: opaque2, trailers, abort } = this; + this.res = null; + if (err || !res2.readable) { + util.destroy(res2, err); + } + this.callback = null; + this.runInAsyncScope(callback2, null, err || null, { opaque: opaque2, trailers }); + if (err) { + abort(); + } + }); + } + res.on("drain", resume); + this.res = res; + const needDrain = res.writableNeedDrain !== void 0 ? res.writableNeedDrain : res._writableState && res._writableState.needDrain; + return needDrain !== true; + } + onData(chunk) { + const { res } = this; + return res.write(chunk); + } + onComplete(trailers) { + const { res } = this; + removeSignal(this); + this.trailers = util.parseHeaders(trailers); + res.end(); + } + onError(err) { + const { res, callback, opaque, body } = this; + removeSignal(this); + this.factory = null; + if (res) { + this.res = null; + util.destroy(res, err); + } else if (callback) { + this.callback = null; + queueMicrotask(() => { + this.runInAsyncScope(callback, null, err, { opaque }); + }); + } + if (body) { + this.body = null; + util.destroy(body, err); + } + } + }; + function stream(opts, factory, callback) { + if (callback === void 0) { + return new Promise((resolve, reject) => { + stream.call(this, opts, factory, (err, data) => { + return err ? reject(err) : resolve(data); + }); + }); + } + try { + this.dispatch(opts, new StreamHandler(opts, factory, callback)); + } catch (err) { + if (typeof callback !== "function") { + throw err; + } + const opaque = opts && opts.opaque; + queueMicrotask(() => callback(err, { opaque })); + } + } + module2.exports = stream; + } +}); + +// node_modules/undici/lib/api/api-pipeline.js +var require_api_pipeline = __commonJS({ + "node_modules/undici/lib/api/api-pipeline.js"(exports2, module2) { + "use strict"; + var { + Readable, + Duplex, + PassThrough + } = require("stream"); + var { + InvalidArgumentError, + InvalidReturnValueError, + RequestAbortedError + } = require_errors(); + var util = require_util4(); + var { AsyncResource } = require("async_hooks"); + var { addSignal, removeSignal } = require_abort_signal(); + var assert = require("assert"); + var kResume = Symbol("resume"); + var PipelineRequest = class extends Readable { + constructor() { + super({ autoDestroy: true }); + this[kResume] = null; + } + _read() { + const { [kResume]: resume } = this; + if (resume) { + this[kResume] = null; + resume(); + } + } + _destroy(err, callback) { + this._read(); + callback(err); + } + }; + var PipelineResponse = class extends Readable { + constructor(resume) { + super({ autoDestroy: true }); + this[kResume] = resume; + } + _read() { + this[kResume](); + } + _destroy(err, callback) { + if (!err && !this._readableState.endEmitted) { + err = new RequestAbortedError(); + } + callback(err); + } + }; + var PipelineHandler = class extends AsyncResource { + constructor(opts, handler2) { + if (!opts || typeof opts !== "object") { + throw new InvalidArgumentError("invalid opts"); + } + if (typeof handler2 !== "function") { + throw new InvalidArgumentError("invalid handler"); + } + const { signal, method, opaque, onInfo, responseHeaders } = opts; + if (signal && typeof signal.on !== "function" && typeof signal.addEventListener !== "function") { + throw new InvalidArgumentError("signal must be an EventEmitter or EventTarget"); + } + if (method === "CONNECT") { + throw new InvalidArgumentError("invalid method"); + } + if (onInfo && typeof onInfo !== "function") { + throw new InvalidArgumentError("invalid onInfo callback"); + } + super("UNDICI_PIPELINE"); + this.opaque = opaque || null; + this.responseHeaders = responseHeaders || null; + this.handler = handler2; + this.abort = null; + this.context = null; + this.onInfo = onInfo || null; + this.req = new PipelineRequest().on("error", util.nop); + this.ret = new Duplex({ + readableObjectMode: opts.objectMode, + autoDestroy: true, + read: () => { + const { body } = this; + if (body && body.resume) { + body.resume(); + } + }, + write: (chunk, encoding, callback) => { + const { req } = this; + if (req.push(chunk, encoding) || req._readableState.destroyed) { + callback(); + } else { + req[kResume] = callback; + } + }, + destroy: (err, callback) => { + const { body, req, res, ret, abort } = this; + if (!err && !ret._readableState.endEmitted) { + err = new RequestAbortedError(); + } + if (abort && err) { + abort(); + } + util.destroy(body, err); + util.destroy(req, err); + util.destroy(res, err); + removeSignal(this); + callback(err); + } + }).on("prefinish", () => { + const { req } = this; + req.push(null); + }); + this.res = null; + addSignal(this, signal); + } + onConnect(abort, context) { + const { ret, res } = this; + assert(!res, "pipeline cannot be retried"); + if (ret.destroyed) { + throw new RequestAbortedError(); + } + this.abort = abort; + this.context = context; + } + onHeaders(statusCode, rawHeaders, resume) { + const { opaque, handler: handler2, context } = this; + if (statusCode < 200) { + if (this.onInfo) { + const headers = this.responseHeaders === "raw" ? util.parseRawHeaders(rawHeaders) : util.parseHeaders(rawHeaders); + this.onInfo({ statusCode, headers }); + } + return; + } + this.res = new PipelineResponse(resume); + let body; + try { + this.handler = null; + const headers = this.responseHeaders === "raw" ? util.parseRawHeaders(rawHeaders) : util.parseHeaders(rawHeaders); + body = this.runInAsyncScope(handler2, null, { + statusCode, + headers, + opaque, + body: this.res, + context + }); + } catch (err) { + this.res.on("error", util.nop); + throw err; + } + if (!body || typeof body.on !== "function") { + throw new InvalidReturnValueError("expected Readable"); + } + body.on("data", (chunk) => { + const { ret, body: body2 } = this; + if (!ret.push(chunk) && body2.pause) { + body2.pause(); + } + }).on("error", (err) => { + const { ret } = this; + util.destroy(ret, err); + }).on("end", () => { + const { ret } = this; + ret.push(null); + }).on("close", () => { + const { ret } = this; + if (!ret._readableState.ended) { + util.destroy(ret, new RequestAbortedError()); + } + }); + this.body = body; + } + onData(chunk) { + const { res } = this; + return res.push(chunk); + } + onComplete(trailers) { + const { res } = this; + res.push(null); + } + onError(err) { + const { ret } = this; + this.handler = null; + util.destroy(ret, err); + } + }; + function pipeline(opts, handler2) { + try { + const pipelineHandler = new PipelineHandler(opts, handler2); + this.dispatch({ ...opts, body: pipelineHandler.req }, pipelineHandler); + return pipelineHandler.ret; + } catch (err) { + return new PassThrough().destroy(err); + } + } + module2.exports = pipeline; + } +}); + +// node_modules/undici/lib/api/api-upgrade.js +var require_api_upgrade = __commonJS({ + "node_modules/undici/lib/api/api-upgrade.js"(exports2, module2) { + "use strict"; + var { InvalidArgumentError, RequestAbortedError, SocketError } = require_errors(); + var { AsyncResource } = require("async_hooks"); + var util = require_util4(); + var { addSignal, removeSignal } = require_abort_signal(); + var assert = require("assert"); + var UpgradeHandler = class extends AsyncResource { + constructor(opts, callback) { + if (!opts || typeof opts !== "object") { + throw new InvalidArgumentError("invalid opts"); + } + if (typeof callback !== "function") { + throw new InvalidArgumentError("invalid callback"); + } + const { signal, opaque, responseHeaders } = opts; + if (signal && typeof signal.on !== "function" && typeof signal.addEventListener !== "function") { + throw new InvalidArgumentError("signal must be an EventEmitter or EventTarget"); + } + super("UNDICI_UPGRADE"); + this.responseHeaders = responseHeaders || null; + this.opaque = opaque || null; + this.callback = callback; + this.abort = null; + this.context = null; + addSignal(this, signal); + } + onConnect(abort, context) { + if (!this.callback) { + throw new RequestAbortedError(); + } + this.abort = abort; + this.context = null; + } + onHeaders() { + throw new SocketError("bad upgrade", null); + } + onUpgrade(statusCode, rawHeaders, socket) { + const { callback, opaque, context } = this; + assert.strictEqual(statusCode, 101); + removeSignal(this); + this.callback = null; + const headers = this.responseHeaders === "raw" ? util.parseRawHeaders(rawHeaders) : util.parseHeaders(rawHeaders); + this.runInAsyncScope(callback, null, null, { + headers, + socket, + opaque, + context + }); + } + onError(err) { + const { callback, opaque } = this; + removeSignal(this); + if (callback) { + this.callback = null; + queueMicrotask(() => { + this.runInAsyncScope(callback, null, err, { opaque }); + }); + } + } + }; + function upgrade(opts, callback) { + if (callback === void 0) { + return new Promise((resolve, reject) => { + upgrade.call(this, opts, (err, data) => { + return err ? reject(err) : resolve(data); + }); + }); + } + try { + const upgradeHandler = new UpgradeHandler(opts, callback); + this.dispatch({ + ...opts, + method: opts.method || "GET", + upgrade: opts.protocol || "Websocket" + }, upgradeHandler); + } catch (err) { + if (typeof callback !== "function") { + throw err; + } + const opaque = opts && opts.opaque; + queueMicrotask(() => callback(err, { opaque })); + } + } + module2.exports = upgrade; + } +}); + +// node_modules/undici/lib/api/api-connect.js +var require_api_connect = __commonJS({ + "node_modules/undici/lib/api/api-connect.js"(exports2, module2) { + "use strict"; + var { InvalidArgumentError, RequestAbortedError, SocketError } = require_errors(); + var { AsyncResource } = require("async_hooks"); + var util = require_util4(); + var { addSignal, removeSignal } = require_abort_signal(); + var ConnectHandler = class extends AsyncResource { + constructor(opts, callback) { + if (!opts || typeof opts !== "object") { + throw new InvalidArgumentError("invalid opts"); + } + if (typeof callback !== "function") { + throw new InvalidArgumentError("invalid callback"); + } + const { signal, opaque, responseHeaders } = opts; + if (signal && typeof signal.on !== "function" && typeof signal.addEventListener !== "function") { + throw new InvalidArgumentError("signal must be an EventEmitter or EventTarget"); + } + super("UNDICI_CONNECT"); + this.opaque = opaque || null; + this.responseHeaders = responseHeaders || null; + this.callback = callback; + this.abort = null; + addSignal(this, signal); + } + onConnect(abort, context) { + if (!this.callback) { + throw new RequestAbortedError(); + } + this.abort = abort; + this.context = context; + } + onHeaders() { + throw new SocketError("bad connect", null); + } + onUpgrade(statusCode, rawHeaders, socket) { + const { callback, opaque, context } = this; + removeSignal(this); + this.callback = null; + const headers = this.responseHeaders === "raw" ? util.parseRawHeaders(rawHeaders) : util.parseHeaders(rawHeaders); + this.runInAsyncScope(callback, null, null, { + statusCode, + headers, + socket, + opaque, + context + }); + } + onError(err) { + const { callback, opaque } = this; + removeSignal(this); + if (callback) { + this.callback = null; + queueMicrotask(() => { + this.runInAsyncScope(callback, null, err, { opaque }); + }); + } + } + }; + function connect(opts, callback) { + if (callback === void 0) { + return new Promise((resolve, reject) => { + connect.call(this, opts, (err, data) => { + return err ? reject(err) : resolve(data); + }); + }); + } + try { + const connectHandler = new ConnectHandler(opts, callback); + this.dispatch({ ...opts, method: "CONNECT" }, connectHandler); + } catch (err) { + if (typeof callback !== "function") { + throw err; + } + const opaque = opts && opts.opaque; + queueMicrotask(() => callback(err, { opaque })); + } + } + module2.exports = connect; + } +}); + +// node_modules/undici/lib/api/index.js +var require_api2 = __commonJS({ + "node_modules/undici/lib/api/index.js"(exports2, module2) { + "use strict"; + module2.exports.request = require_api_request(); + module2.exports.stream = require_api_stream(); + module2.exports.pipeline = require_api_pipeline(); + module2.exports.upgrade = require_api_upgrade(); + module2.exports.connect = require_api_connect(); + } +}); + +// node_modules/undici/lib/mock/mock-errors.js +var require_mock_errors = __commonJS({ + "node_modules/undici/lib/mock/mock-errors.js"(exports2, module2) { + "use strict"; + var { UndiciError } = require_errors(); + var MockNotMatchedError = class _MockNotMatchedError extends UndiciError { + constructor(message) { + super(message); + Error.captureStackTrace(this, _MockNotMatchedError); + this.name = "MockNotMatchedError"; + this.message = message || "The request does not match any registered mock dispatches"; + this.code = "UND_MOCK_ERR_MOCK_NOT_MATCHED"; + } + }; + module2.exports = { + MockNotMatchedError + }; + } +}); + +// node_modules/undici/lib/mock/mock-symbols.js +var require_mock_symbols = __commonJS({ + "node_modules/undici/lib/mock/mock-symbols.js"(exports2, module2) { + "use strict"; + module2.exports = { + kAgent: Symbol("agent"), + kOptions: Symbol("options"), + kFactory: Symbol("factory"), + kDispatches: Symbol("dispatches"), + kDispatchKey: Symbol("dispatch key"), + kDefaultHeaders: Symbol("default headers"), + kDefaultTrailers: Symbol("default trailers"), + kContentLength: Symbol("content length"), + kMockAgent: Symbol("mock agent"), + kMockAgentSet: Symbol("mock agent set"), + kMockAgentGet: Symbol("mock agent get"), + kMockDispatch: Symbol("mock dispatch"), + kClose: Symbol("close"), + kOriginalClose: Symbol("original agent close"), + kOrigin: Symbol("origin"), + kIsMockActive: Symbol("is mock active"), + kNetConnect: Symbol("net connect"), + kGetNetConnect: Symbol("get net connect"), + kConnected: Symbol("connected") + }; + } +}); + +// node_modules/undici/lib/mock/mock-utils.js +var require_mock_utils = __commonJS({ + "node_modules/undici/lib/mock/mock-utils.js"(exports2, module2) { + "use strict"; + var { MockNotMatchedError } = require_mock_errors(); + var { + kDispatches, + kMockAgent, + kOriginalDispatch, + kOrigin, + kGetNetConnect + } = require_mock_symbols(); + var { buildURL, nop } = require_util4(); + var { STATUS_CODES } = require("http"); + var { + types: { + isPromise + } + } = require("util"); + function matchValue(match, value) { + if (typeof match === "string") { + return match === value; + } + if (match instanceof RegExp) { + return match.test(value); + } + if (typeof match === "function") { + return match(value) === true; + } + return false; + } + function lowerCaseEntries(headers) { + return Object.fromEntries( + Object.entries(headers).map(([headerName, headerValue]) => { + return [headerName.toLocaleLowerCase(), headerValue]; + }) + ); + } + function getHeaderByName(headers, key) { + if (Array.isArray(headers)) { + for (let i = 0; i < headers.length; i += 2) { + if (headers[i].toLocaleLowerCase() === key.toLocaleLowerCase()) { + return headers[i + 1]; + } + } + return void 0; + } else if (typeof headers.get === "function") { + return headers.get(key); + } else { + return lowerCaseEntries(headers)[key.toLocaleLowerCase()]; + } + } + function buildHeadersFromArray(headers) { + const clone = headers.slice(); + const entries = []; + for (let index = 0; index < clone.length; index += 2) { + entries.push([clone[index], clone[index + 1]]); + } + return Object.fromEntries(entries); + } + function matchHeaders(mockDispatch2, headers) { + if (typeof mockDispatch2.headers === "function") { + if (Array.isArray(headers)) { + headers = buildHeadersFromArray(headers); + } + return mockDispatch2.headers(headers ? lowerCaseEntries(headers) : {}); + } + if (typeof mockDispatch2.headers === "undefined") { + return true; + } + if (typeof headers !== "object" || typeof mockDispatch2.headers !== "object") { + return false; + } + for (const [matchHeaderName, matchHeaderValue] of Object.entries(mockDispatch2.headers)) { + const headerValue = getHeaderByName(headers, matchHeaderName); + if (!matchValue(matchHeaderValue, headerValue)) { + return false; + } + } + return true; + } + function safeUrl(path) { + if (typeof path !== "string") { + return path; + } + const pathSegments = path.split("?"); + if (pathSegments.length !== 2) { + return path; + } + const qp2 = new URLSearchParams(pathSegments.pop()); + qp2.sort(); + return [...pathSegments, qp2.toString()].join("?"); + } + function matchKey(mockDispatch2, { path, method, body, headers }) { + const pathMatch = matchValue(mockDispatch2.path, path); + const methodMatch = matchValue(mockDispatch2.method, method); + const bodyMatch = typeof mockDispatch2.body !== "undefined" ? matchValue(mockDispatch2.body, body) : true; + const headersMatch = matchHeaders(mockDispatch2, headers); + return pathMatch && methodMatch && bodyMatch && headersMatch; + } + function getResponseData(data) { + if (Buffer.isBuffer(data)) { + return data; + } else if (typeof data === "object") { + return JSON.stringify(data); + } else { + return data.toString(); + } + } + function getMockDispatch(mockDispatches, key) { + const basePath = key.query ? buildURL(key.path, key.query) : key.path; + const resolvedPath = typeof basePath === "string" ? safeUrl(basePath) : basePath; + let matchedMockDispatches = mockDispatches.filter(({ consumed }) => !consumed).filter(({ path }) => matchValue(safeUrl(path), resolvedPath)); + if (matchedMockDispatches.length === 0) { + throw new MockNotMatchedError(`Mock dispatch not matched for path '${resolvedPath}'`); + } + matchedMockDispatches = matchedMockDispatches.filter(({ method }) => matchValue(method, key.method)); + if (matchedMockDispatches.length === 0) { + throw new MockNotMatchedError(`Mock dispatch not matched for method '${key.method}'`); + } + matchedMockDispatches = matchedMockDispatches.filter(({ body }) => typeof body !== "undefined" ? matchValue(body, key.body) : true); + if (matchedMockDispatches.length === 0) { + throw new MockNotMatchedError(`Mock dispatch not matched for body '${key.body}'`); + } + matchedMockDispatches = matchedMockDispatches.filter((mockDispatch2) => matchHeaders(mockDispatch2, key.headers)); + if (matchedMockDispatches.length === 0) { + throw new MockNotMatchedError(`Mock dispatch not matched for headers '${typeof key.headers === "object" ? JSON.stringify(key.headers) : key.headers}'`); + } + return matchedMockDispatches[0]; + } + function addMockDispatch(mockDispatches, key, data) { + const baseData = { timesInvoked: 0, times: 1, persist: false, consumed: false }; + const replyData = typeof data === "function" ? { callback: data } : { ...data }; + const newMockDispatch = { ...baseData, ...key, pending: true, data: { error: null, ...replyData } }; + mockDispatches.push(newMockDispatch); + return newMockDispatch; + } + function deleteMockDispatch(mockDispatches, key) { + const index = mockDispatches.findIndex((dispatch) => { + if (!dispatch.consumed) { + return false; + } + return matchKey(dispatch, key); + }); + if (index !== -1) { + mockDispatches.splice(index, 1); + } + } + function buildKey(opts) { + const { path, method, body, headers, query } = opts; + return { + path, + method, + body, + headers, + query + }; + } + function generateKeyValues(data) { + return Object.entries(data).reduce((keyValuePairs, [key, value]) => [ + ...keyValuePairs, + Buffer.from(`${key}`), + Array.isArray(value) ? value.map((x) => Buffer.from(`${x}`)) : Buffer.from(`${value}`) + ], []); + } + function getStatusText(statusCode) { + return STATUS_CODES[statusCode] || "unknown"; + } + async function getResponse(body) { + const buffers = []; + for await (const data of body) { + buffers.push(data); + } + return Buffer.concat(buffers).toString("utf8"); + } + function mockDispatch(opts, handler2) { + const key = buildKey(opts); + const mockDispatch2 = getMockDispatch(this[kDispatches], key); + mockDispatch2.timesInvoked++; + if (mockDispatch2.data.callback) { + mockDispatch2.data = { ...mockDispatch2.data, ...mockDispatch2.data.callback(opts) }; + } + const { data: { statusCode, data, headers, trailers, error: error2 }, delay, persist } = mockDispatch2; + const { timesInvoked, times } = mockDispatch2; + mockDispatch2.consumed = !persist && timesInvoked >= times; + mockDispatch2.pending = timesInvoked < times; + if (error2 !== null) { + deleteMockDispatch(this[kDispatches], key); + handler2.onError(error2); + return true; + } + if (typeof delay === "number" && delay > 0) { + setTimeout(() => { + handleReply(this[kDispatches]); + }, delay); + } else { + handleReply(this[kDispatches]); + } + function handleReply(mockDispatches, _data = data) { + const optsHeaders = Array.isArray(opts.headers) ? buildHeadersFromArray(opts.headers) : opts.headers; + const body = typeof _data === "function" ? _data({ ...opts, headers: optsHeaders }) : _data; + if (isPromise(body)) { + body.then((newData) => handleReply(mockDispatches, newData)); + return; + } + const responseData = getResponseData(body); + const responseHeaders = generateKeyValues(headers); + const responseTrailers = generateKeyValues(trailers); + handler2.abort = nop; + handler2.onHeaders(statusCode, responseHeaders, resume, getStatusText(statusCode)); + handler2.onData(Buffer.from(responseData)); + handler2.onComplete(responseTrailers); + deleteMockDispatch(mockDispatches, key); + } + function resume() { + } + return true; + } + function buildMockDispatch() { + const agent = this[kMockAgent]; + const origin = this[kOrigin]; + const originalDispatch = this[kOriginalDispatch]; + return function dispatch(opts, handler2) { + if (agent.isMockActive) { + try { + mockDispatch.call(this, opts, handler2); + } catch (error2) { + if (error2 instanceof MockNotMatchedError) { + const netConnect = agent[kGetNetConnect](); + if (netConnect === false) { + throw new MockNotMatchedError(`${error2.message}: subsequent request to origin ${origin} was not allowed (net.connect disabled)`); + } + if (checkNetConnect(netConnect, origin)) { + originalDispatch.call(this, opts, handler2); + } else { + throw new MockNotMatchedError(`${error2.message}: subsequent request to origin ${origin} was not allowed (net.connect is not enabled for this origin)`); + } + } else { + throw error2; + } + } + } else { + originalDispatch.call(this, opts, handler2); + } + }; + } + function checkNetConnect(netConnect, origin) { + const url = new URL(origin); + if (netConnect === true) { + return true; + } else if (Array.isArray(netConnect) && netConnect.some((matcher) => matchValue(matcher, url.host))) { + return true; + } + return false; + } + function buildMockOptions(opts) { + if (opts) { + const { agent, ...mockOptions } = opts; + return mockOptions; + } + } + module2.exports = { + getResponseData, + getMockDispatch, + addMockDispatch, + deleteMockDispatch, + buildKey, + generateKeyValues, + matchValue, + getResponse, + getStatusText, + mockDispatch, + buildMockDispatch, + checkNetConnect, + buildMockOptions, + getHeaderByName + }; + } +}); + +// node_modules/undici/lib/mock/mock-interceptor.js +var require_mock_interceptor = __commonJS({ + "node_modules/undici/lib/mock/mock-interceptor.js"(exports2, module2) { + "use strict"; + var { getResponseData, buildKey, addMockDispatch } = require_mock_utils(); + var { + kDispatches, + kDispatchKey, + kDefaultHeaders, + kDefaultTrailers, + kContentLength, + kMockDispatch + } = require_mock_symbols(); + var { InvalidArgumentError } = require_errors(); + var { buildURL } = require_util4(); + var MockScope = class { + constructor(mockDispatch) { + this[kMockDispatch] = mockDispatch; + } + /** + * Delay a reply by a set amount in ms. + */ + delay(waitInMs) { + if (typeof waitInMs !== "number" || !Number.isInteger(waitInMs) || waitInMs <= 0) { + throw new InvalidArgumentError("waitInMs must be a valid integer > 0"); + } + this[kMockDispatch].delay = waitInMs; + return this; + } + /** + * For a defined reply, never mark as consumed. + */ + persist() { + this[kMockDispatch].persist = true; + return this; + } + /** + * Allow one to define a reply for a set amount of matching requests. + */ + times(repeatTimes) { + if (typeof repeatTimes !== "number" || !Number.isInteger(repeatTimes) || repeatTimes <= 0) { + throw new InvalidArgumentError("repeatTimes must be a valid integer > 0"); + } + this[kMockDispatch].times = repeatTimes; + return this; + } + }; + var MockInterceptor = class { + constructor(opts, mockDispatches) { + if (typeof opts !== "object") { + throw new InvalidArgumentError("opts must be an object"); + } + if (typeof opts.path === "undefined") { + throw new InvalidArgumentError("opts.path must be defined"); + } + if (typeof opts.method === "undefined") { + opts.method = "GET"; + } + if (typeof opts.path === "string") { + if (opts.query) { + opts.path = buildURL(opts.path, opts.query); + } else { + const parsedURL = new URL(opts.path, "data://"); + opts.path = parsedURL.pathname + parsedURL.search; + } + } + if (typeof opts.method === "string") { + opts.method = opts.method.toUpperCase(); + } + this[kDispatchKey] = buildKey(opts); + this[kDispatches] = mockDispatches; + this[kDefaultHeaders] = {}; + this[kDefaultTrailers] = {}; + this[kContentLength] = false; + } + createMockScopeDispatchData(statusCode, data, responseOptions = {}) { + const responseData = getResponseData(data); + const contentLength = this[kContentLength] ? { "content-length": responseData.length } : {}; + const headers = { ...this[kDefaultHeaders], ...contentLength, ...responseOptions.headers }; + const trailers = { ...this[kDefaultTrailers], ...responseOptions.trailers }; + return { statusCode, data, headers, trailers }; + } + validateReplyParameters(statusCode, data, responseOptions) { + if (typeof statusCode === "undefined") { + throw new InvalidArgumentError("statusCode must be defined"); + } + if (typeof data === "undefined") { + throw new InvalidArgumentError("data must be defined"); + } + if (typeof responseOptions !== "object") { + throw new InvalidArgumentError("responseOptions must be an object"); + } + } + /** + * Mock an undici request with a defined reply. + */ + reply(replyData) { + if (typeof replyData === "function") { + const wrappedDefaultsCallback = (opts) => { + const resolvedData = replyData(opts); + if (typeof resolvedData !== "object") { + throw new InvalidArgumentError("reply options callback must return an object"); + } + const { statusCode: statusCode2, data: data2 = "", responseOptions: responseOptions2 = {} } = resolvedData; + this.validateReplyParameters(statusCode2, data2, responseOptions2); + return { + ...this.createMockScopeDispatchData(statusCode2, data2, responseOptions2) + }; + }; + const newMockDispatch2 = addMockDispatch(this[kDispatches], this[kDispatchKey], wrappedDefaultsCallback); + return new MockScope(newMockDispatch2); + } + const [statusCode, data = "", responseOptions = {}] = [...arguments]; + this.validateReplyParameters(statusCode, data, responseOptions); + const dispatchData = this.createMockScopeDispatchData(statusCode, data, responseOptions); + const newMockDispatch = addMockDispatch(this[kDispatches], this[kDispatchKey], dispatchData); + return new MockScope(newMockDispatch); + } + /** + * Mock an undici request with a defined error. + */ + replyWithError(error2) { + if (typeof error2 === "undefined") { + throw new InvalidArgumentError("error must be defined"); + } + const newMockDispatch = addMockDispatch(this[kDispatches], this[kDispatchKey], { error: error2 }); + return new MockScope(newMockDispatch); + } + /** + * Set default reply headers on the interceptor for subsequent replies + */ + defaultReplyHeaders(headers) { + if (typeof headers === "undefined") { + throw new InvalidArgumentError("headers must be defined"); + } + this[kDefaultHeaders] = headers; + return this; + } + /** + * Set default reply trailers on the interceptor for subsequent replies + */ + defaultReplyTrailers(trailers) { + if (typeof trailers === "undefined") { + throw new InvalidArgumentError("trailers must be defined"); + } + this[kDefaultTrailers] = trailers; + return this; + } + /** + * Set reply content length header for replies on the interceptor + */ + replyContentLength() { + this[kContentLength] = true; + return this; + } + }; + module2.exports.MockInterceptor = MockInterceptor; + module2.exports.MockScope = MockScope; + } +}); + +// node_modules/undici/lib/mock/mock-client.js +var require_mock_client = __commonJS({ + "node_modules/undici/lib/mock/mock-client.js"(exports2, module2) { + "use strict"; + var { promisify } = require("util"); + var Client = require_client4(); + var { buildMockDispatch } = require_mock_utils(); + var { + kDispatches, + kMockAgent, + kClose, + kOriginalClose, + kOrigin, + kOriginalDispatch, + kConnected + } = require_mock_symbols(); + var { MockInterceptor } = require_mock_interceptor(); + var Symbols = require_symbols(); + var { InvalidArgumentError } = require_errors(); + var MockClient = class extends Client { + constructor(origin, opts) { + super(origin, opts); + if (!opts || !opts.agent || typeof opts.agent.dispatch !== "function") { + throw new InvalidArgumentError("Argument opts.agent must implement Agent"); + } + this[kMockAgent] = opts.agent; + this[kOrigin] = origin; + this[kDispatches] = []; + this[kConnected] = 1; + this[kOriginalDispatch] = this.dispatch; + this[kOriginalClose] = this.close.bind(this); + this.dispatch = buildMockDispatch.call(this); + this.close = this[kClose]; + } + get [Symbols.kConnected]() { + return this[kConnected]; + } + /** + * Sets up the base interceptor for mocking replies from undici. + */ + intercept(opts) { + return new MockInterceptor(opts, this[kDispatches]); + } + async [kClose]() { + await promisify(this[kOriginalClose])(); + this[kConnected] = 0; + this[kMockAgent][Symbols.kClients].delete(this[kOrigin]); + } + }; + module2.exports = MockClient; + } +}); + +// node_modules/undici/lib/mock/mock-pool.js +var require_mock_pool = __commonJS({ + "node_modules/undici/lib/mock/mock-pool.js"(exports2, module2) { + "use strict"; + var { promisify } = require("util"); + var Pool = require_pool2(); + var { buildMockDispatch } = require_mock_utils(); + var { + kDispatches, + kMockAgent, + kClose, + kOriginalClose, + kOrigin, + kOriginalDispatch, + kConnected + } = require_mock_symbols(); + var { MockInterceptor } = require_mock_interceptor(); + var Symbols = require_symbols(); + var { InvalidArgumentError } = require_errors(); + var MockPool = class extends Pool { + constructor(origin, opts) { + super(origin, opts); + if (!opts || !opts.agent || typeof opts.agent.dispatch !== "function") { + throw new InvalidArgumentError("Argument opts.agent must implement Agent"); + } + this[kMockAgent] = opts.agent; + this[kOrigin] = origin; + this[kDispatches] = []; + this[kConnected] = 1; + this[kOriginalDispatch] = this.dispatch; + this[kOriginalClose] = this.close.bind(this); + this.dispatch = buildMockDispatch.call(this); + this.close = this[kClose]; + } + get [Symbols.kConnected]() { + return this[kConnected]; + } + /** + * Sets up the base interceptor for mocking replies from undici. + */ + intercept(opts) { + return new MockInterceptor(opts, this[kDispatches]); + } + async [kClose]() { + await promisify(this[kOriginalClose])(); + this[kConnected] = 0; + this[kMockAgent][Symbols.kClients].delete(this[kOrigin]); + } + }; + module2.exports = MockPool; + } +}); + +// node_modules/undici/lib/mock/pluralizer.js +var require_pluralizer = __commonJS({ + "node_modules/undici/lib/mock/pluralizer.js"(exports2, module2) { + "use strict"; + var singulars = { + pronoun: "it", + is: "is", + was: "was", + this: "this" + }; + var plurals = { + pronoun: "they", + is: "are", + was: "were", + this: "these" + }; + module2.exports = class Pluralizer { + constructor(singular, plural) { + this.singular = singular; + this.plural = plural; + } + pluralize(count) { + const one = count === 1; + const keys = one ? singulars : plurals; + const noun = one ? this.singular : this.plural; + return { ...keys, count, noun }; + } + }; + } +}); + +// node_modules/undici/lib/mock/pending-interceptors-formatter.js +var require_pending_interceptors_formatter = __commonJS({ + "node_modules/undici/lib/mock/pending-interceptors-formatter.js"(exports2, module2) { + "use strict"; + var { Transform } = require("stream"); + var { Console } = require("console"); + module2.exports = class PendingInterceptorsFormatter { + constructor({ disableColors } = {}) { + this.transform = new Transform({ + transform(chunk, _enc, cb) { + cb(null, chunk); + } + }); + this.logger = new Console({ + stdout: this.transform, + inspectOptions: { + colors: !disableColors && !process.env.CI + } + }); + } + format(pendingInterceptors) { + const withPrettyHeaders = pendingInterceptors.map( + ({ method, path, data: { statusCode }, persist, times, timesInvoked, origin }) => ({ + Method: method, + Origin: origin, + Path: path, + "Status code": statusCode, + Persistent: persist ? "\u2705" : "\u274C", + Invocations: timesInvoked, + Remaining: persist ? Infinity : times - timesInvoked + }) + ); + this.logger.table(withPrettyHeaders); + return this.transform.read().toString(); + } + }; + } +}); + +// node_modules/undici/lib/mock/mock-agent.js +var require_mock_agent = __commonJS({ + "node_modules/undici/lib/mock/mock-agent.js"(exports2, module2) { + "use strict"; + var { kClients } = require_symbols(); + var Agent = require_agent(); + var { + kAgent, + kMockAgentSet, + kMockAgentGet, + kDispatches, + kIsMockActive, + kNetConnect, + kGetNetConnect, + kOptions, + kFactory + } = require_mock_symbols(); + var MockClient = require_mock_client(); + var MockPool = require_mock_pool(); + var { matchValue, buildMockOptions } = require_mock_utils(); + var { InvalidArgumentError, UndiciError } = require_errors(); + var Dispatcher = require_dispatcher(); + var Pluralizer = require_pluralizer(); + var PendingInterceptorsFormatter = require_pending_interceptors_formatter(); + var FakeWeakRef = class { + constructor(value) { + this.value = value; + } + deref() { + return this.value; + } + }; + var MockAgent = class extends Dispatcher { + constructor(opts) { + super(opts); + this[kNetConnect] = true; + this[kIsMockActive] = true; + if (opts && opts.agent && typeof opts.agent.dispatch !== "function") { + throw new InvalidArgumentError("Argument opts.agent must implement Agent"); + } + const agent = opts && opts.agent ? opts.agent : new Agent(opts); + this[kAgent] = agent; + this[kClients] = agent[kClients]; + this[kOptions] = buildMockOptions(opts); + } + get(origin) { + let dispatcher = this[kMockAgentGet](origin); + if (!dispatcher) { + dispatcher = this[kFactory](origin); + this[kMockAgentSet](origin, dispatcher); + } + return dispatcher; + } + dispatch(opts, handler2) { + this.get(opts.origin); + return this[kAgent].dispatch(opts, handler2); + } + async close() { + await this[kAgent].close(); + this[kClients].clear(); + } + deactivate() { + this[kIsMockActive] = false; + } + activate() { + this[kIsMockActive] = true; + } + enableNetConnect(matcher) { + if (typeof matcher === "string" || typeof matcher === "function" || matcher instanceof RegExp) { + if (Array.isArray(this[kNetConnect])) { + this[kNetConnect].push(matcher); + } else { + this[kNetConnect] = [matcher]; + } + } else if (typeof matcher === "undefined") { + this[kNetConnect] = true; + } else { + throw new InvalidArgumentError("Unsupported matcher. Must be one of String|Function|RegExp."); + } + } + disableNetConnect() { + this[kNetConnect] = false; + } + // This is required to bypass issues caused by using global symbols - see: + // https://github.com/nodejs/undici/issues/1447 + get isMockActive() { + return this[kIsMockActive]; + } + [kMockAgentSet](origin, dispatcher) { + this[kClients].set(origin, new FakeWeakRef(dispatcher)); + } + [kFactory](origin) { + const mockOptions = Object.assign({ agent: this }, this[kOptions]); + return this[kOptions] && this[kOptions].connections === 1 ? new MockClient(origin, mockOptions) : new MockPool(origin, mockOptions); + } + [kMockAgentGet](origin) { + const ref = this[kClients].get(origin); + if (ref) { + return ref.deref(); + } + if (typeof origin !== "string") { + const dispatcher = this[kFactory]("http://localhost:9999"); + this[kMockAgentSet](origin, dispatcher); + return dispatcher; + } + for (const [keyMatcher, nonExplicitRef] of Array.from(this[kClients])) { + const nonExplicitDispatcher = nonExplicitRef.deref(); + if (nonExplicitDispatcher && typeof keyMatcher !== "string" && matchValue(keyMatcher, origin)) { + const dispatcher = this[kFactory](origin); + this[kMockAgentSet](origin, dispatcher); + dispatcher[kDispatches] = nonExplicitDispatcher[kDispatches]; + return dispatcher; + } + } + } + [kGetNetConnect]() { + return this[kNetConnect]; + } + pendingInterceptors() { + const mockAgentClients = this[kClients]; + return Array.from(mockAgentClients.entries()).flatMap(([origin, scope]) => scope.deref()[kDispatches].map((dispatch) => ({ ...dispatch, origin }))).filter(({ pending }) => pending); + } + assertNoPendingInterceptors({ pendingInterceptorsFormatter = new PendingInterceptorsFormatter() } = {}) { + const pending = this.pendingInterceptors(); + if (pending.length === 0) { + return; + } + const pluralizer = new Pluralizer("interceptor", "interceptors").pluralize(pending.length); + throw new UndiciError(` +${pluralizer.count} ${pluralizer.noun} ${pluralizer.is} pending: + +${pendingInterceptorsFormatter.format(pending)} +`.trim()); + } + }; + module2.exports = MockAgent; + } +}); + +// node_modules/undici/lib/proxy-agent.js +var require_proxy_agent = __commonJS({ + "node_modules/undici/lib/proxy-agent.js"(exports2, module2) { + "use strict"; + var { kProxy, kClose, kDestroy, kInterceptors } = require_symbols(); + var { URL: URL2 } = require("url"); + var Agent = require_agent(); + var Pool = require_pool2(); + var DispatcherBase = require_dispatcher_base(); + var { InvalidArgumentError, RequestAbortedError } = require_errors(); + var buildConnector = require_connect2(); + var kAgent = Symbol("proxy agent"); + var kClient = Symbol("proxy client"); + var kProxyHeaders = Symbol("proxy headers"); + var kRequestTls = Symbol("request tls settings"); + var kProxyTls = Symbol("proxy tls settings"); + var kConnectEndpoint = Symbol("connect endpoint function"); + function defaultProtocolPort(protocol) { + return protocol === "https:" ? 443 : 80; + } + function buildProxyOptions(opts) { + if (typeof opts === "string") { + opts = { uri: opts }; + } + if (!opts || !opts.uri) { + throw new InvalidArgumentError("Proxy opts.uri is mandatory"); + } + return { + uri: opts.uri, + protocol: opts.protocol || "https" + }; + } + function defaultFactory(origin, opts) { + return new Pool(origin, opts); + } + var ProxyAgent = class extends DispatcherBase { + constructor(opts) { + super(opts); + this[kProxy] = buildProxyOptions(opts); + this[kAgent] = new Agent(opts); + this[kInterceptors] = opts.interceptors && opts.interceptors.ProxyAgent && Array.isArray(opts.interceptors.ProxyAgent) ? opts.interceptors.ProxyAgent : []; + if (typeof opts === "string") { + opts = { uri: opts }; + } + if (!opts || !opts.uri) { + throw new InvalidArgumentError("Proxy opts.uri is mandatory"); + } + const { clientFactory = defaultFactory } = opts; + if (typeof clientFactory !== "function") { + throw new InvalidArgumentError("Proxy opts.clientFactory must be a function."); + } + this[kRequestTls] = opts.requestTls; + this[kProxyTls] = opts.proxyTls; + this[kProxyHeaders] = opts.headers || {}; + if (opts.auth && opts.token) { + throw new InvalidArgumentError("opts.auth cannot be used in combination with opts.token"); + } else if (opts.auth) { + this[kProxyHeaders]["proxy-authorization"] = `Basic ${opts.auth}`; + } else if (opts.token) { + this[kProxyHeaders]["proxy-authorization"] = opts.token; + } + const resolvedUrl = new URL2(opts.uri); + const { origin, port, host } = resolvedUrl; + const connect = buildConnector({ ...opts.proxyTls }); + this[kConnectEndpoint] = buildConnector({ ...opts.requestTls }); + this[kClient] = clientFactory(resolvedUrl, { connect }); + this[kAgent] = new Agent({ + ...opts, + connect: async (opts2, callback) => { + let requestedHost = opts2.host; + if (!opts2.port) { + requestedHost += `:${defaultProtocolPort(opts2.protocol)}`; + } + try { + const { socket, statusCode } = await this[kClient].connect({ + origin, + port, + path: requestedHost, + signal: opts2.signal, + headers: { + ...this[kProxyHeaders], + host + } + }); + if (statusCode !== 200) { + socket.on("error", () => { + }).destroy(); + callback(new RequestAbortedError("Proxy response !== 200 when HTTP Tunneling")); + } + if (opts2.protocol !== "https:") { + callback(null, socket); + return; + } + let servername; + if (this[kRequestTls]) { + servername = this[kRequestTls].servername; + } else { + servername = opts2.servername; + } + this[kConnectEndpoint]({ ...opts2, servername, httpSocket: socket }, callback); + } catch (err) { + callback(err); + } + } + }); + } + dispatch(opts, handler2) { + const { host } = new URL2(opts.origin); + const headers = buildHeaders(opts.headers); + throwIfProxyAuthIsSent(headers); + return this[kAgent].dispatch( + { + ...opts, + headers: { + ...headers, + host + } + }, + handler2 + ); + } + async [kClose]() { + await this[kAgent].close(); + await this[kClient].close(); + } + async [kDestroy]() { + await this[kAgent].destroy(); + await this[kClient].destroy(); + } + }; + function buildHeaders(headers) { + if (Array.isArray(headers)) { + const headersPair = {}; + for (let i = 0; i < headers.length; i += 2) { + headersPair[headers[i]] = headers[i + 1]; + } + return headersPair; + } + return headers; + } + function throwIfProxyAuthIsSent(headers) { + const existProxyAuth = headers && Object.keys(headers).find((key) => key.toLowerCase() === "proxy-authorization"); + if (existProxyAuth) { + throw new InvalidArgumentError("Proxy-Authorization should be sent in ProxyAgent constructor"); + } + } + module2.exports = ProxyAgent; + } +}); + +// node_modules/undici/lib/global.js +var require_global2 = __commonJS({ + "node_modules/undici/lib/global.js"(exports2, module2) { + "use strict"; + var globalDispatcher = Symbol.for("undici.globalDispatcher.1"); + var { InvalidArgumentError } = require_errors(); + var Agent = require_agent(); + if (getGlobalDispatcher() === void 0) { + setGlobalDispatcher(new Agent()); + } + function setGlobalDispatcher(agent) { + if (!agent || typeof agent.dispatch !== "function") { + throw new InvalidArgumentError("Argument agent must implement Agent"); + } + Object.defineProperty(globalThis, globalDispatcher, { + value: agent, + writable: true, + enumerable: false, + configurable: false + }); + } + function getGlobalDispatcher() { + return globalThis[globalDispatcher]; + } + module2.exports = { + setGlobalDispatcher, + getGlobalDispatcher + }; + } +}); + +// node_modules/undici/lib/handler/DecoratorHandler.js +var require_DecoratorHandler = __commonJS({ + "node_modules/undici/lib/handler/DecoratorHandler.js"(exports2, module2) { + "use strict"; + module2.exports = class DecoratorHandler { + constructor(handler2) { + this.handler = handler2; + } + onConnect(...args) { + return this.handler.onConnect(...args); + } + onError(...args) { + return this.handler.onError(...args); + } + onUpgrade(...args) { + return this.handler.onUpgrade(...args); + } + onHeaders(...args) { + return this.handler.onHeaders(...args); + } + onData(...args) { + return this.handler.onData(...args); + } + onComplete(...args) { + return this.handler.onComplete(...args); + } + onBodySent(...args) { + return this.handler.onBodySent(...args); + } + }; + } +}); + +// node_modules/undici/lib/fetch/headers.js +var require_headers = __commonJS({ + "node_modules/undici/lib/fetch/headers.js"(exports2, module2) { + "use strict"; + var { kHeadersList } = require_symbols(); + var { kGuard } = require_symbols2(); + var { kEnumerableProperty } = require_util4(); + var { + makeIterator, + isValidHeaderName, + isValidHeaderValue + } = require_util5(); + var { webidl } = require_webidl(); + var assert = require("assert"); + var kHeadersMap = Symbol("headers map"); + var kHeadersSortedMap = Symbol("headers map sorted"); + function headerValueNormalize(potentialValue) { + let i = potentialValue.length; + while (/[\r\n\t ]/.test(potentialValue.charAt(--i))) + ; + return potentialValue.slice(0, i + 1).replace(/^[\r\n\t ]+/, ""); + } + function fill(headers, object) { + if (Array.isArray(object)) { + for (const header of object) { + if (header.length !== 2) { + throw webidl.errors.exception({ + header: "Headers constructor", + message: `expected name/value pair to be length 2, found ${header.length}.` + }); + } + headers.append(header[0], header[1]); + } + } else if (typeof object === "object" && object !== null) { + for (const [key, value] of Object.entries(object)) { + headers.append(key, value); + } + } else { + throw webidl.errors.conversionFailed({ + prefix: "Headers constructor", + argument: "Argument 1", + types: ["sequence>", "record"] + }); + } + } + var HeadersList = class _HeadersList { + /** @type {[string, string][]|null} */ + cookies = null; + constructor(init) { + if (init instanceof _HeadersList) { + this[kHeadersMap] = new Map(init[kHeadersMap]); + this[kHeadersSortedMap] = init[kHeadersSortedMap]; + this.cookies = init.cookies; + } else { + this[kHeadersMap] = new Map(init); + this[kHeadersSortedMap] = null; + } + } + // https://fetch.spec.whatwg.org/#header-list-contains + contains(name) { + name = name.toLowerCase(); + return this[kHeadersMap].has(name); + } + clear() { + this[kHeadersMap].clear(); + this[kHeadersSortedMap] = null; + this.cookies = null; + } + // https://fetch.spec.whatwg.org/#concept-header-list-append + append(name, value) { + this[kHeadersSortedMap] = null; + const lowercaseName = name.toLowerCase(); + const exists = this[kHeadersMap].get(lowercaseName); + if (exists) { + const delimiter = lowercaseName === "cookie" ? "; " : ", "; + this[kHeadersMap].set(lowercaseName, { + name: exists.name, + value: `${exists.value}${delimiter}${value}` + }); + } else { + this[kHeadersMap].set(lowercaseName, { name, value }); + } + if (lowercaseName === "set-cookie") { + this.cookies ??= []; + this.cookies.push(value); + } + } + // https://fetch.spec.whatwg.org/#concept-header-list-set + set(name, value) { + this[kHeadersSortedMap] = null; + const lowercaseName = name.toLowerCase(); + if (lowercaseName === "set-cookie") { + this.cookies = [value]; + } + return this[kHeadersMap].set(lowercaseName, { name, value }); + } + // https://fetch.spec.whatwg.org/#concept-header-list-delete + delete(name) { + this[kHeadersSortedMap] = null; + name = name.toLowerCase(); + if (name === "set-cookie") { + this.cookies = null; + } + return this[kHeadersMap].delete(name); + } + // https://fetch.spec.whatwg.org/#concept-header-list-get + get(name) { + if (!this.contains(name)) { + return null; + } + return this[kHeadersMap].get(name.toLowerCase())?.value ?? null; + } + *[Symbol.iterator]() { + for (const [name, { value }] of this[kHeadersMap]) { + yield [name, value]; + } + } + get entries() { + const headers = {}; + if (this[kHeadersMap].size) { + for (const { name, value } of this[kHeadersMap].values()) { + headers[name] = value; + } + } + return headers; + } + }; + var Headers = class _Headers { + constructor(init = void 0) { + this[kHeadersList] = new HeadersList(); + this[kGuard] = "none"; + if (init !== void 0) { + init = webidl.converters.HeadersInit(init); + fill(this, init); + } + } + // https://fetch.spec.whatwg.org/#dom-headers-append + append(name, value) { + webidl.brandCheck(this, _Headers); + webidl.argumentLengthCheck(arguments, 2, { header: "Headers.append" }); + name = webidl.converters.ByteString(name); + value = webidl.converters.ByteString(value); + value = headerValueNormalize(value); + if (!isValidHeaderName(name)) { + throw webidl.errors.invalidArgument({ + prefix: "Headers.append", + value: name, + type: "header name" + }); + } else if (!isValidHeaderValue(value)) { + throw webidl.errors.invalidArgument({ + prefix: "Headers.append", + value, + type: "header value" + }); + } + if (this[kGuard] === "immutable") { + throw new TypeError("immutable"); + } else if (this[kGuard] === "request-no-cors") { + } + return this[kHeadersList].append(name, value); + } + // https://fetch.spec.whatwg.org/#dom-headers-delete + delete(name) { + webidl.brandCheck(this, _Headers); + webidl.argumentLengthCheck(arguments, 1, { header: "Headers.delete" }); + name = webidl.converters.ByteString(name); + if (!isValidHeaderName(name)) { + throw webidl.errors.invalidArgument({ + prefix: "Headers.delete", + value: name, + type: "header name" + }); + } + if (this[kGuard] === "immutable") { + throw new TypeError("immutable"); + } else if (this[kGuard] === "request-no-cors") { + } + if (!this[kHeadersList].contains(name)) { + return; + } + return this[kHeadersList].delete(name); + } + // https://fetch.spec.whatwg.org/#dom-headers-get + get(name) { + webidl.brandCheck(this, _Headers); + webidl.argumentLengthCheck(arguments, 1, { header: "Headers.get" }); + name = webidl.converters.ByteString(name); + if (!isValidHeaderName(name)) { + throw webidl.errors.invalidArgument({ + prefix: "Headers.get", + value: name, + type: "header name" + }); + } + return this[kHeadersList].get(name); + } + // https://fetch.spec.whatwg.org/#dom-headers-has + has(name) { + webidl.brandCheck(this, _Headers); + webidl.argumentLengthCheck(arguments, 1, { header: "Headers.has" }); + name = webidl.converters.ByteString(name); + if (!isValidHeaderName(name)) { + throw webidl.errors.invalidArgument({ + prefix: "Headers.has", + value: name, + type: "header name" + }); + } + return this[kHeadersList].contains(name); + } + // https://fetch.spec.whatwg.org/#dom-headers-set + set(name, value) { + webidl.brandCheck(this, _Headers); + webidl.argumentLengthCheck(arguments, 2, { header: "Headers.set" }); + name = webidl.converters.ByteString(name); + value = webidl.converters.ByteString(value); + value = headerValueNormalize(value); + if (!isValidHeaderName(name)) { + throw webidl.errors.invalidArgument({ + prefix: "Headers.set", + value: name, + type: "header name" + }); + } else if (!isValidHeaderValue(value)) { + throw webidl.errors.invalidArgument({ + prefix: "Headers.set", + value, + type: "header value" + }); + } + if (this[kGuard] === "immutable") { + throw new TypeError("immutable"); + } else if (this[kGuard] === "request-no-cors") { + } + return this[kHeadersList].set(name, value); + } + // https://fetch.spec.whatwg.org/#dom-headers-getsetcookie + getSetCookie() { + webidl.brandCheck(this, _Headers); + const list = this[kHeadersList].cookies; + if (list) { + return [...list]; + } + return []; + } + // https://fetch.spec.whatwg.org/#concept-header-list-sort-and-combine + get [kHeadersSortedMap]() { + if (this[kHeadersList][kHeadersSortedMap]) { + return this[kHeadersList][kHeadersSortedMap]; + } + const headers = []; + const names = [...this[kHeadersList]].sort((a, b) => a[0] < b[0] ? -1 : 1); + const cookies = this[kHeadersList].cookies; + for (const [name, value] of names) { + if (name === "set-cookie") { + for (const value2 of cookies) { + headers.push([name, value2]); + } + } else { + assert(value !== null); + headers.push([name, value]); + } + } + this[kHeadersList][kHeadersSortedMap] = headers; + return headers; + } + keys() { + webidl.brandCheck(this, _Headers); + return makeIterator( + () => [...this[kHeadersSortedMap].values()], + "Headers", + "key" + ); + } + values() { + webidl.brandCheck(this, _Headers); + return makeIterator( + () => [...this[kHeadersSortedMap].values()], + "Headers", + "value" + ); + } + entries() { + webidl.brandCheck(this, _Headers); + return makeIterator( + () => [...this[kHeadersSortedMap].values()], + "Headers", + "key+value" + ); + } + /** + * @param {(value: string, key: string, self: Headers) => void} callbackFn + * @param {unknown} thisArg + */ + forEach(callbackFn, thisArg = globalThis) { + webidl.brandCheck(this, _Headers); + webidl.argumentLengthCheck(arguments, 1, { header: "Headers.forEach" }); + if (typeof callbackFn !== "function") { + throw new TypeError( + "Failed to execute 'forEach' on 'Headers': parameter 1 is not of type 'Function'." + ); + } + for (const [key, value] of this) { + callbackFn.apply(thisArg, [value, key, this]); + } + } + [Symbol.for("nodejs.util.inspect.custom")]() { + webidl.brandCheck(this, _Headers); + return this[kHeadersList]; + } + }; + Headers.prototype[Symbol.iterator] = Headers.prototype.entries; + Object.defineProperties(Headers.prototype, { + append: kEnumerableProperty, + delete: kEnumerableProperty, + get: kEnumerableProperty, + has: kEnumerableProperty, + set: kEnumerableProperty, + getSetCookie: kEnumerableProperty, + keys: kEnumerableProperty, + values: kEnumerableProperty, + entries: kEnumerableProperty, + forEach: kEnumerableProperty, + [Symbol.iterator]: { enumerable: false }, + [Symbol.toStringTag]: { + value: "Headers", + configurable: true + } + }); + webidl.converters.HeadersInit = function(V) { + if (webidl.util.Type(V) === "Object") { + if (V[Symbol.iterator]) { + return webidl.converters["sequence>"](V); + } + return webidl.converters["record"](V); + } + throw webidl.errors.conversionFailed({ + prefix: "Headers constructor", + argument: "Argument 1", + types: ["sequence>", "record"] + }); + }; + module2.exports = { + fill, + Headers, + HeadersList + }; + } +}); + +// node_modules/undici/lib/fetch/response.js +var require_response = __commonJS({ + "node_modules/undici/lib/fetch/response.js"(exports2, module2) { + "use strict"; + var { Headers, HeadersList, fill } = require_headers(); + var { extractBody, cloneBody, mixinBody } = require_body(); + var util = require_util4(); + var { kEnumerableProperty } = util; + var { + isValidReasonPhrase, + isCancelled, + isAborted, + isBlobLike, + serializeJavascriptValueToJSONString, + isErrorLike, + isomorphicEncode + } = require_util5(); + var { + redirectStatus, + nullBodyStatus, + DOMException: DOMException2 + } = require_constants2(); + var { kState, kHeaders, kGuard, kRealm } = require_symbols2(); + var { webidl } = require_webidl(); + var { FormData } = require_formdata(); + var { getGlobalOrigin } = require_global(); + var { URLSerializer } = require_dataURL(); + var { kHeadersList } = require_symbols(); + var assert = require("assert"); + var { types } = require("util"); + var ReadableStream = globalThis.ReadableStream || require("stream/web").ReadableStream; + var Response = class _Response { + // Creates network error Response. + static error() { + const relevantRealm = { settingsObject: {} }; + const responseObject = new _Response(); + responseObject[kState] = makeNetworkError(); + responseObject[kRealm] = relevantRealm; + responseObject[kHeaders][kHeadersList] = responseObject[kState].headersList; + responseObject[kHeaders][kGuard] = "immutable"; + responseObject[kHeaders][kRealm] = relevantRealm; + return responseObject; + } + // https://fetch.spec.whatwg.org/#dom-response-json + static json(data = void 0, init = {}) { + webidl.argumentLengthCheck(arguments, 1, { header: "Response.json" }); + if (init !== null) { + init = webidl.converters.ResponseInit(init); + } + const bytes = new TextEncoder("utf-8").encode( + serializeJavascriptValueToJSONString(data) + ); + const body = extractBody(bytes); + const relevantRealm = { settingsObject: {} }; + const responseObject = new _Response(); + responseObject[kRealm] = relevantRealm; + responseObject[kHeaders][kGuard] = "response"; + responseObject[kHeaders][kRealm] = relevantRealm; + initializeResponse(responseObject, init, { body: body[0], type: "application/json" }); + return responseObject; + } + // Creates a redirect Response that redirects to url with status status. + static redirect(url, status2 = 302) { + const relevantRealm = { settingsObject: {} }; + webidl.argumentLengthCheck(arguments, 1, { header: "Response.redirect" }); + url = webidl.converters.USVString(url); + status2 = webidl.converters["unsigned short"](status2); + let parsedURL; + try { + parsedURL = new URL(url, getGlobalOrigin()); + } catch (err) { + throw Object.assign(new TypeError("Failed to parse URL from " + url), { + cause: err + }); + } + if (!redirectStatus.includes(status2)) { + throw new RangeError("Invalid status code " + status2); + } + const responseObject = new _Response(); + responseObject[kRealm] = relevantRealm; + responseObject[kHeaders][kGuard] = "immutable"; + responseObject[kHeaders][kRealm] = relevantRealm; + responseObject[kState].status = status2; + const value = isomorphicEncode(URLSerializer(parsedURL)); + responseObject[kState].headersList.append("location", value); + return responseObject; + } + // https://fetch.spec.whatwg.org/#dom-response + constructor(body = null, init = {}) { + if (body !== null) { + body = webidl.converters.BodyInit(body); + } + init = webidl.converters.ResponseInit(init); + this[kRealm] = { settingsObject: {} }; + this[kState] = makeResponse({}); + this[kHeaders] = new Headers(); + this[kHeaders][kGuard] = "response"; + this[kHeaders][kHeadersList] = this[kState].headersList; + this[kHeaders][kRealm] = this[kRealm]; + let bodyWithType = null; + if (body != null) { + const [extractedBody, type] = extractBody(body); + bodyWithType = { body: extractedBody, type }; + } + initializeResponse(this, init, bodyWithType); + } + // Returns response’s type, e.g., "cors". + get type() { + webidl.brandCheck(this, _Response); + return this[kState].type; + } + // Returns response’s URL, if it has one; otherwise the empty string. + get url() { + webidl.brandCheck(this, _Response); + const urlList = this[kState].urlList; + const url = urlList[urlList.length - 1] ?? null; + if (url === null) { + return ""; + } + return URLSerializer(url, true); + } + // Returns whether response was obtained through a redirect. + get redirected() { + webidl.brandCheck(this, _Response); + return this[kState].urlList.length > 1; + } + // Returns response’s status. + get status() { + webidl.brandCheck(this, _Response); + return this[kState].status; + } + // Returns whether response’s status is an ok status. + get ok() { + webidl.brandCheck(this, _Response); + return this[kState].status >= 200 && this[kState].status <= 299; + } + // Returns response’s status message. + get statusText() { + webidl.brandCheck(this, _Response); + return this[kState].statusText; + } + // Returns response’s headers as Headers. + get headers() { + webidl.brandCheck(this, _Response); + return this[kHeaders]; + } + get body() { + webidl.brandCheck(this, _Response); + return this[kState].body ? this[kState].body.stream : null; + } + get bodyUsed() { + webidl.brandCheck(this, _Response); + return !!this[kState].body && util.isDisturbed(this[kState].body.stream); + } + // Returns a clone of response. + clone() { + webidl.brandCheck(this, _Response); + if (this.bodyUsed || this.body && this.body.locked) { + throw webidl.errors.exception({ + header: "Response.clone", + message: "Body has already been consumed." + }); + } + const clonedResponse = cloneResponse(this[kState]); + const clonedResponseObject = new _Response(); + clonedResponseObject[kState] = clonedResponse; + clonedResponseObject[kRealm] = this[kRealm]; + clonedResponseObject[kHeaders][kHeadersList] = clonedResponse.headersList; + clonedResponseObject[kHeaders][kGuard] = this[kHeaders][kGuard]; + clonedResponseObject[kHeaders][kRealm] = this[kHeaders][kRealm]; + return clonedResponseObject; + } + }; + mixinBody(Response); + Object.defineProperties(Response.prototype, { + type: kEnumerableProperty, + url: kEnumerableProperty, + status: kEnumerableProperty, + ok: kEnumerableProperty, + redirected: kEnumerableProperty, + statusText: kEnumerableProperty, + headers: kEnumerableProperty, + clone: kEnumerableProperty, + body: kEnumerableProperty, + bodyUsed: kEnumerableProperty, + [Symbol.toStringTag]: { + value: "Response", + configurable: true + } + }); + Object.defineProperties(Response, { + json: kEnumerableProperty, + redirect: kEnumerableProperty, + error: kEnumerableProperty + }); + function cloneResponse(response) { + if (response.internalResponse) { + return filterResponse( + cloneResponse(response.internalResponse), + response.type + ); + } + const newResponse = makeResponse({ ...response, body: null }); + if (response.body != null) { + newResponse.body = cloneBody(response.body); + } + return newResponse; + } + function makeResponse(init) { + return { + aborted: false, + rangeRequested: false, + timingAllowPassed: false, + requestIncludesCredentials: false, + type: "default", + status: 200, + timingInfo: null, + cacheState: "", + statusText: "", + ...init, + headersList: init.headersList ? new HeadersList(init.headersList) : new HeadersList(), + urlList: init.urlList ? [...init.urlList] : [] + }; + } + function makeNetworkError(reason) { + const isError = isErrorLike(reason); + return makeResponse({ + type: "error", + status: 0, + error: isError ? reason : new Error(reason ? String(reason) : reason), + aborted: reason && reason.name === "AbortError" + }); + } + function makeFilteredResponse(response, state) { + state = { + internalResponse: response, + ...state + }; + return new Proxy(response, { + get(target, p) { + return p in state ? state[p] : target[p]; + }, + set(target, p, value) { + assert(!(p in state)); + target[p] = value; + return true; + } + }); + } + function filterResponse(response, type) { + if (type === "basic") { + return makeFilteredResponse(response, { + type: "basic", + headersList: response.headersList + }); + } else if (type === "cors") { + return makeFilteredResponse(response, { + type: "cors", + headersList: response.headersList + }); + } else if (type === "opaque") { + return makeFilteredResponse(response, { + type: "opaque", + urlList: Object.freeze([]), + status: 0, + statusText: "", + body: null + }); + } else if (type === "opaqueredirect") { + return makeFilteredResponse(response, { + type: "opaqueredirect", + status: 0, + statusText: "", + headersList: [], + body: null + }); + } else { + assert(false); + } + } + function makeAppropriateNetworkError(fetchParams) { + assert(isCancelled(fetchParams)); + return isAborted(fetchParams) ? makeNetworkError(new DOMException2("The operation was aborted.", "AbortError")) : makeNetworkError("Request was cancelled."); + } + function initializeResponse(response, init, body) { + if (init.status !== null && (init.status < 200 || init.status > 599)) { + throw new RangeError('init["status"] must be in the range of 200 to 599, inclusive.'); + } + if ("statusText" in init && init.statusText != null) { + if (!isValidReasonPhrase(String(init.statusText))) { + throw new TypeError("Invalid statusText"); + } + } + if ("status" in init && init.status != null) { + response[kState].status = init.status; + } + if ("statusText" in init && init.statusText != null) { + response[kState].statusText = init.statusText; + } + if ("headers" in init && init.headers != null) { + fill(response[kHeaders], init.headers); + } + if (body) { + if (nullBodyStatus.includes(response.status)) { + throw webidl.errors.exception({ + header: "Response constructor", + message: "Invalid response status code " + response.status + }); + } + response[kState].body = body.body; + if (body.type != null && !response[kState].headersList.contains("Content-Type")) { + response[kState].headersList.append("content-type", body.type); + } + } + } + webidl.converters.ReadableStream = webidl.interfaceConverter( + ReadableStream + ); + webidl.converters.FormData = webidl.interfaceConverter( + FormData + ); + webidl.converters.URLSearchParams = webidl.interfaceConverter( + URLSearchParams + ); + webidl.converters.XMLHttpRequestBodyInit = function(V) { + if (typeof V === "string") { + return webidl.converters.USVString(V); + } + if (isBlobLike(V)) { + return webidl.converters.Blob(V, { strict: false }); + } + if (types.isAnyArrayBuffer(V) || types.isTypedArray(V) || types.isDataView(V)) { + return webidl.converters.BufferSource(V); + } + if (util.isFormDataLike(V)) { + return webidl.converters.FormData(V, { strict: false }); + } + if (V instanceof URLSearchParams) { + return webidl.converters.URLSearchParams(V); + } + return webidl.converters.DOMString(V); + }; + webidl.converters.BodyInit = function(V) { + if (V instanceof ReadableStream) { + return webidl.converters.ReadableStream(V); + } + if (V?.[Symbol.asyncIterator]) { + return V; + } + return webidl.converters.XMLHttpRequestBodyInit(V); + }; + webidl.converters.ResponseInit = webidl.dictionaryConverter([ + { + key: "status", + converter: webidl.converters["unsigned short"], + defaultValue: 200 + }, + { + key: "statusText", + converter: webidl.converters.ByteString, + defaultValue: "" + }, + { + key: "headers", + converter: webidl.converters.HeadersInit + } + ]); + module2.exports = { + makeNetworkError, + makeResponse, + makeAppropriateNetworkError, + filterResponse, + Response, + cloneResponse + }; + } +}); + +// node_modules/undici/lib/fetch/request.js +var require_request2 = __commonJS({ + "node_modules/undici/lib/fetch/request.js"(exports2, module2) { + "use strict"; + var { extractBody, mixinBody, cloneBody } = require_body(); + var { Headers, fill: fillHeaders, HeadersList } = require_headers(); + var { FinalizationRegistry } = require_dispatcher_weakref()(); + var util = require_util4(); + var { + isValidHTTPToken, + sameOrigin, + normalizeMethod, + makePolicyContainer + } = require_util5(); + var { + forbiddenMethods, + corsSafeListedMethods, + referrerPolicy, + requestRedirect, + requestMode, + requestCredentials, + requestCache, + requestDuplex + } = require_constants2(); + var { kEnumerableProperty } = util; + var { kHeaders, kSignal, kState, kGuard, kRealm } = require_symbols2(); + var { webidl } = require_webidl(); + var { getGlobalOrigin } = require_global(); + var { URLSerializer } = require_dataURL(); + var { kHeadersList } = require_symbols(); + var assert = require("assert"); + var { getMaxListeners, setMaxListeners, getEventListeners, defaultMaxListeners } = require("events"); + var TransformStream = globalThis.TransformStream; + var kInit = Symbol("init"); + var kAbortController = Symbol("abortController"); + var requestFinalizer = new FinalizationRegistry(({ signal, abort }) => { + signal.removeEventListener("abort", abort); + }); + var Request = class _Request { + // https://fetch.spec.whatwg.org/#dom-request + constructor(input, init = {}) { + if (input === kInit) { + return; + } + webidl.argumentLengthCheck(arguments, 1, { header: "Request constructor" }); + input = webidl.converters.RequestInfo(input); + init = webidl.converters.RequestInit(init); + this[kRealm] = { + settingsObject: { + baseUrl: getGlobalOrigin(), + get origin() { + return this.baseUrl?.origin; + }, + policyContainer: makePolicyContainer() + } + }; + let request = null; + let fallbackMode = null; + const baseUrl = this[kRealm].settingsObject.baseUrl; + let signal = null; + if (typeof input === "string") { + let parsedURL; + try { + parsedURL = new URL(input, baseUrl); + } catch (err) { + throw new TypeError("Failed to parse URL from " + input, { cause: err }); + } + if (parsedURL.username || parsedURL.password) { + throw new TypeError( + "Request cannot be constructed from a URL that includes credentials: " + input + ); + } + request = makeRequest({ urlList: [parsedURL] }); + fallbackMode = "cors"; + } else { + assert(input instanceof _Request); + request = input[kState]; + signal = input[kSignal]; + } + const origin = this[kRealm].settingsObject.origin; + let window2 = "client"; + if (request.window?.constructor?.name === "EnvironmentSettingsObject" && sameOrigin(request.window, origin)) { + window2 = request.window; + } + if (init.window != null) { + throw new TypeError(`'window' option '${window2}' must be null`); + } + if ("window" in init) { + window2 = "no-window"; + } + request = makeRequest({ + // URL request’s URL. + // undici implementation note: this is set as the first item in request's urlList in makeRequest + // method request’s method. + method: request.method, + // header list A copy of request’s header list. + // undici implementation note: headersList is cloned in makeRequest + headersList: request.headersList, + // unsafe-request flag Set. + unsafeRequest: request.unsafeRequest, + // client This’s relevant settings object. + client: this[kRealm].settingsObject, + // window window. + window: window2, + // priority request’s priority. + priority: request.priority, + // origin request’s origin. The propagation of the origin is only significant for navigation requests + // being handled by a service worker. In this scenario a request can have an origin that is different + // from the current client. + origin: request.origin, + // referrer request’s referrer. + referrer: request.referrer, + // referrer policy request’s referrer policy. + referrerPolicy: request.referrerPolicy, + // mode request’s mode. + mode: request.mode, + // credentials mode request’s credentials mode. + credentials: request.credentials, + // cache mode request’s cache mode. + cache: request.cache, + // redirect mode request’s redirect mode. + redirect: request.redirect, + // integrity metadata request’s integrity metadata. + integrity: request.integrity, + // keepalive request’s keepalive. + keepalive: request.keepalive, + // reload-navigation flag request’s reload-navigation flag. + reloadNavigation: request.reloadNavigation, + // history-navigation flag request’s history-navigation flag. + historyNavigation: request.historyNavigation, + // URL list A clone of request’s URL list. + urlList: [...request.urlList] + }); + if (Object.keys(init).length > 0) { + if (request.mode === "navigate") { + request.mode = "same-origin"; + } + request.reloadNavigation = false; + request.historyNavigation = false; + request.origin = "client"; + request.referrer = "client"; + request.referrerPolicy = ""; + request.url = request.urlList[request.urlList.length - 1]; + request.urlList = [request.url]; + } + if (init.referrer !== void 0) { + const referrer = init.referrer; + if (referrer === "") { + request.referrer = "no-referrer"; + } else { + let parsedReferrer; + try { + parsedReferrer = new URL(referrer, baseUrl); + } catch (err) { + throw new TypeError(`Referrer "${referrer}" is not a valid URL.`, { cause: err }); + } + if (parsedReferrer.protocol === "about:" && parsedReferrer.hostname === "client" || origin && !sameOrigin(parsedReferrer, this[kRealm].settingsObject.baseUrl)) { + request.referrer = "client"; + } else { + request.referrer = parsedReferrer; + } + } + } + if (init.referrerPolicy !== void 0) { + request.referrerPolicy = init.referrerPolicy; + } + let mode; + if (init.mode !== void 0) { + mode = init.mode; + } else { + mode = fallbackMode; + } + if (mode === "navigate") { + throw webidl.errors.exception({ + header: "Request constructor", + message: "invalid request mode navigate." + }); + } + if (mode != null) { + request.mode = mode; + } + if (init.credentials !== void 0) { + request.credentials = init.credentials; + } + if (init.cache !== void 0) { + request.cache = init.cache; + } + if (request.cache === "only-if-cached" && request.mode !== "same-origin") { + throw new TypeError( + "'only-if-cached' can be set only with 'same-origin' mode" + ); + } + if (init.redirect !== void 0) { + request.redirect = init.redirect; + } + if (init.integrity !== void 0 && init.integrity != null) { + request.integrity = String(init.integrity); + } + if (init.keepalive !== void 0) { + request.keepalive = Boolean(init.keepalive); + } + if (init.method !== void 0) { + let method = init.method; + if (!isValidHTTPToken(init.method)) { + throw TypeError(`'${init.method}' is not a valid HTTP method.`); + } + if (forbiddenMethods.indexOf(method.toUpperCase()) !== -1) { + throw TypeError(`'${init.method}' HTTP method is unsupported.`); + } + method = normalizeMethod(init.method); + request.method = method; + } + if (init.signal !== void 0) { + signal = init.signal; + } + this[kState] = request; + const ac2 = new AbortController(); + this[kSignal] = ac2.signal; + this[kSignal][kRealm] = this[kRealm]; + if (signal != null) { + if (!signal || typeof signal.aborted !== "boolean" || typeof signal.addEventListener !== "function") { + throw new TypeError( + "Failed to construct 'Request': member signal is not of type AbortSignal." + ); + } + if (signal.aborted) { + ac2.abort(signal.reason); + } else { + this[kAbortController] = ac2; + const acRef = new WeakRef(ac2); + const abort = function() { + const ac3 = acRef.deref(); + if (ac3 !== void 0) { + ac3.abort(this.reason); + } + }; + try { + if (typeof getMaxListeners === "function" && getMaxListeners(signal) === defaultMaxListeners) { + setMaxListeners(100, signal); + } else if (getEventListeners(signal, "abort").length >= defaultMaxListeners) { + setMaxListeners(100, signal); + } + } catch { + } + util.addAbortListener(signal, abort); + requestFinalizer.register(ac2, { signal, abort }); + } + } + this[kHeaders] = new Headers(); + this[kHeaders][kHeadersList] = request.headersList; + this[kHeaders][kGuard] = "request"; + this[kHeaders][kRealm] = this[kRealm]; + if (mode === "no-cors") { + if (!corsSafeListedMethods.includes(request.method)) { + throw new TypeError( + `'${request.method} is unsupported in no-cors mode.` + ); + } + this[kHeaders][kGuard] = "request-no-cors"; + } + if (Object.keys(init).length !== 0) { + let headers = new Headers(this[kHeaders]); + if (init.headers !== void 0) { + headers = init.headers; + } + this[kHeaders][kHeadersList].clear(); + if (headers.constructor.name === "Headers") { + for (const [key, val] of headers) { + this[kHeaders].append(key, val); + } + } else { + fillHeaders(this[kHeaders], headers); + } + } + const inputBody = input instanceof _Request ? input[kState].body : null; + if ((init.body != null || inputBody != null) && (request.method === "GET" || request.method === "HEAD")) { + throw new TypeError("Request with GET/HEAD method cannot have body."); + } + let initBody = null; + if (init.body != null) { + const [extractedBody, contentType] = extractBody( + init.body, + request.keepalive + ); + initBody = extractedBody; + if (contentType && !this[kHeaders][kHeadersList].contains("content-type")) { + this[kHeaders].append("content-type", contentType); + } + } + const inputOrInitBody = initBody ?? inputBody; + if (inputOrInitBody != null && inputOrInitBody.source == null) { + if (initBody != null && init.duplex == null) { + throw new TypeError("RequestInit: duplex option is required when sending a body."); + } + if (request.mode !== "same-origin" && request.mode !== "cors") { + throw new TypeError( + 'If request is made from ReadableStream, mode should be "same-origin" or "cors"' + ); + } + request.useCORSPreflightFlag = true; + } + let finalBody = inputOrInitBody; + if (initBody == null && inputBody != null) { + if (util.isDisturbed(inputBody.stream) || inputBody.stream.locked) { + throw new TypeError( + "Cannot construct a Request with a Request object that has already been used." + ); + } + if (!TransformStream) { + TransformStream = require("stream/web").TransformStream; + } + const identityTransform = new TransformStream(); + inputBody.stream.pipeThrough(identityTransform); + finalBody = { + source: inputBody.source, + length: inputBody.length, + stream: identityTransform.readable + }; + } + this[kState].body = finalBody; + } + // Returns request’s HTTP method, which is "GET" by default. + get method() { + webidl.brandCheck(this, _Request); + return this[kState].method; + } + // Returns the URL of request as a string. + get url() { + webidl.brandCheck(this, _Request); + return URLSerializer(this[kState].url); + } + // Returns a Headers object consisting of the headers associated with request. + // Note that headers added in the network layer by the user agent will not + // be accounted for in this object, e.g., the "Host" header. + get headers() { + webidl.brandCheck(this, _Request); + return this[kHeaders]; + } + // Returns the kind of resource requested by request, e.g., "document" + // or "script". + get destination() { + webidl.brandCheck(this, _Request); + return this[kState].destination; + } + // Returns the referrer of request. Its value can be a same-origin URL if + // explicitly set in init, the empty string to indicate no referrer, and + // "about:client" when defaulting to the global’s default. This is used + // during fetching to determine the value of the `Referer` header of the + // request being made. + get referrer() { + webidl.brandCheck(this, _Request); + if (this[kState].referrer === "no-referrer") { + return ""; + } + if (this[kState].referrer === "client") { + return "about:client"; + } + return this[kState].referrer.toString(); + } + // Returns the referrer policy associated with request. + // This is used during fetching to compute the value of the request’s + // referrer. + get referrerPolicy() { + webidl.brandCheck(this, _Request); + return this[kState].referrerPolicy; + } + // Returns the mode associated with request, which is a string indicating + // whether the request will use CORS, or will be restricted to same-origin + // URLs. + get mode() { + webidl.brandCheck(this, _Request); + return this[kState].mode; + } + // Returns the credentials mode associated with request, + // which is a string indicating whether credentials will be sent with the + // request always, never, or only when sent to a same-origin URL. + get credentials() { + return this[kState].credentials; + } + // Returns the cache mode associated with request, + // which is a string indicating how the request will + // interact with the browser’s cache when fetching. + get cache() { + webidl.brandCheck(this, _Request); + return this[kState].cache; + } + // Returns the redirect mode associated with request, + // which is a string indicating how redirects for the + // request will be handled during fetching. A request + // will follow redirects by default. + get redirect() { + webidl.brandCheck(this, _Request); + return this[kState].redirect; + } + // Returns request’s subresource integrity metadata, which is a + // cryptographic hash of the resource being fetched. Its value + // consists of multiple hashes separated by whitespace. [SRI] + get integrity() { + webidl.brandCheck(this, _Request); + return this[kState].integrity; + } + // Returns a boolean indicating whether or not request can outlive the + // global in which it was created. + get keepalive() { + webidl.brandCheck(this, _Request); + return this[kState].keepalive; + } + // Returns a boolean indicating whether or not request is for a reload + // navigation. + get isReloadNavigation() { + webidl.brandCheck(this, _Request); + return this[kState].reloadNavigation; + } + // Returns a boolean indicating whether or not request is for a history + // navigation (a.k.a. back-foward navigation). + get isHistoryNavigation() { + webidl.brandCheck(this, _Request); + return this[kState].historyNavigation; + } + // Returns the signal associated with request, which is an AbortSignal + // object indicating whether or not request has been aborted, and its + // abort event handler. + get signal() { + webidl.brandCheck(this, _Request); + return this[kSignal]; + } + get body() { + webidl.brandCheck(this, _Request); + return this[kState].body ? this[kState].body.stream : null; + } + get bodyUsed() { + webidl.brandCheck(this, _Request); + return !!this[kState].body && util.isDisturbed(this[kState].body.stream); + } + get duplex() { + webidl.brandCheck(this, _Request); + return "half"; + } + // Returns a clone of request. + clone() { + webidl.brandCheck(this, _Request); + if (this.bodyUsed || this.body?.locked) { + throw new TypeError("unusable"); + } + const clonedRequest = cloneRequest(this[kState]); + const clonedRequestObject = new _Request(kInit); + clonedRequestObject[kState] = clonedRequest; + clonedRequestObject[kRealm] = this[kRealm]; + clonedRequestObject[kHeaders] = new Headers(); + clonedRequestObject[kHeaders][kHeadersList] = clonedRequest.headersList; + clonedRequestObject[kHeaders][kGuard] = this[kHeaders][kGuard]; + clonedRequestObject[kHeaders][kRealm] = this[kHeaders][kRealm]; + const ac2 = new AbortController(); + if (this.signal.aborted) { + ac2.abort(this.signal.reason); + } else { + util.addAbortListener( + this.signal, + () => { + ac2.abort(this.signal.reason); + } + ); + } + clonedRequestObject[kSignal] = ac2.signal; + return clonedRequestObject; + } + }; + mixinBody(Request); + function makeRequest(init) { + const request = { + method: "GET", + localURLsOnly: false, + unsafeRequest: false, + body: null, + client: null, + reservedClient: null, + replacesClientId: "", + window: "client", + keepalive: false, + serviceWorkers: "all", + initiator: "", + destination: "", + priority: null, + origin: "client", + policyContainer: "client", + referrer: "client", + referrerPolicy: "", + mode: "no-cors", + useCORSPreflightFlag: false, + credentials: "same-origin", + useCredentials: false, + cache: "default", + redirect: "follow", + integrity: "", + cryptoGraphicsNonceMetadata: "", + parserMetadata: "", + reloadNavigation: false, + historyNavigation: false, + userActivation: false, + taintedOrigin: false, + redirectCount: 0, + responseTainting: "basic", + preventNoCacheCacheControlHeaderModification: false, + done: false, + timingAllowFailed: false, + ...init, + headersList: init.headersList ? new HeadersList(init.headersList) : new HeadersList() + }; + request.url = request.urlList[0]; + return request; + } + function cloneRequest(request) { + const newRequest = makeRequest({ ...request, body: null }); + if (request.body != null) { + newRequest.body = cloneBody(request.body); + } + return newRequest; + } + Object.defineProperties(Request.prototype, { + method: kEnumerableProperty, + url: kEnumerableProperty, + headers: kEnumerableProperty, + redirect: kEnumerableProperty, + clone: kEnumerableProperty, + signal: kEnumerableProperty, + duplex: kEnumerableProperty, + destination: kEnumerableProperty, + body: kEnumerableProperty, + bodyUsed: kEnumerableProperty, + isHistoryNavigation: kEnumerableProperty, + isReloadNavigation: kEnumerableProperty, + keepalive: kEnumerableProperty, + integrity: kEnumerableProperty, + cache: kEnumerableProperty, + credentials: kEnumerableProperty, + attribute: kEnumerableProperty, + referrerPolicy: kEnumerableProperty, + referrer: kEnumerableProperty, + mode: kEnumerableProperty, + [Symbol.toStringTag]: { + value: "Request", + configurable: true + } + }); + webidl.converters.Request = webidl.interfaceConverter( + Request + ); + webidl.converters.RequestInfo = function(V) { + if (typeof V === "string") { + return webidl.converters.USVString(V); + } + if (V instanceof Request) { + return webidl.converters.Request(V); + } + return webidl.converters.USVString(V); + }; + webidl.converters.AbortSignal = webidl.interfaceConverter( + AbortSignal + ); + webidl.converters.RequestInit = webidl.dictionaryConverter([ + { + key: "method", + converter: webidl.converters.ByteString + }, + { + key: "headers", + converter: webidl.converters.HeadersInit + }, + { + key: "body", + converter: webidl.nullableConverter( + webidl.converters.BodyInit + ) + }, + { + key: "referrer", + converter: webidl.converters.USVString + }, + { + key: "referrerPolicy", + converter: webidl.converters.DOMString, + // https://w3c.github.io/webappsec-referrer-policy/#referrer-policy + allowedValues: referrerPolicy + }, + { + key: "mode", + converter: webidl.converters.DOMString, + // https://fetch.spec.whatwg.org/#concept-request-mode + allowedValues: requestMode + }, + { + key: "credentials", + converter: webidl.converters.DOMString, + // https://fetch.spec.whatwg.org/#requestcredentials + allowedValues: requestCredentials + }, + { + key: "cache", + converter: webidl.converters.DOMString, + // https://fetch.spec.whatwg.org/#requestcache + allowedValues: requestCache + }, + { + key: "redirect", + converter: webidl.converters.DOMString, + // https://fetch.spec.whatwg.org/#requestredirect + allowedValues: requestRedirect + }, + { + key: "integrity", + converter: webidl.converters.DOMString + }, + { + key: "keepalive", + converter: webidl.converters.boolean + }, + { + key: "signal", + converter: webidl.nullableConverter( + (signal) => webidl.converters.AbortSignal( + signal, + { strict: false } + ) + ) + }, + { + key: "window", + converter: webidl.converters.any + }, + { + key: "duplex", + converter: webidl.converters.DOMString, + allowedValues: requestDuplex + } + ]); + module2.exports = { Request, makeRequest }; + } +}); + +// node_modules/undici/lib/fetch/index.js +var require_fetch2 = __commonJS({ + "node_modules/undici/lib/fetch/index.js"(exports2, module2) { + "use strict"; + var { + Response, + makeNetworkError, + makeAppropriateNetworkError, + filterResponse, + makeResponse + } = require_response(); + var { Headers } = require_headers(); + var { Request, makeRequest } = require_request2(); + var zlib = require("zlib"); + var { + bytesMatch, + makePolicyContainer, + clonePolicyContainer, + requestBadPort, + TAOCheck, + appendRequestOriginHeader, + responseLocationURL, + requestCurrentURL, + setRequestReferrerPolicyOnRedirect, + tryUpgradeRequestToAPotentiallyTrustworthyURL, + createOpaqueTimingInfo, + appendFetchMetadata, + corsCheck, + crossOriginResourcePolicyCheck, + determineRequestsReferrer, + coarsenedSharedCurrentTime, + createDeferredPromise, + isBlobLike, + sameOrigin, + isCancelled, + isAborted, + isErrorLike, + fullyReadBody, + readableStreamClose, + isomorphicEncode, + urlIsLocal, + urlIsHttpHttpsScheme, + urlHasHttpsScheme + } = require_util5(); + var { kState, kHeaders, kGuard, kRealm } = require_symbols2(); + var assert = require("assert"); + var { safelyExtractBody } = require_body(); + var { + redirectStatus, + nullBodyStatus, + safeMethods, + requestBodyHeader, + subresource, + DOMException: DOMException2 + } = require_constants2(); + var { kHeadersList } = require_symbols(); + var EE = require("events"); + var { Readable, pipeline } = require("stream"); + var { addAbortListener, isErrored, isReadable, nodeMajor, nodeMinor } = require_util4(); + var { dataURLProcessor, serializeAMimeType } = require_dataURL(); + var { TransformStream } = require("stream/web"); + var { getGlobalDispatcher } = require_global2(); + var { webidl } = require_webidl(); + var { STATUS_CODES } = require("http"); + var resolveObjectURL; + var ReadableStream = globalThis.ReadableStream; + var Fetch = class extends EE { + constructor(dispatcher) { + super(); + this.dispatcher = dispatcher; + this.connection = null; + this.dump = false; + this.state = "ongoing"; + this.setMaxListeners(21); + } + terminate(reason) { + if (this.state !== "ongoing") { + return; + } + this.state = "terminated"; + this.connection?.destroy(reason); + this.emit("terminated", reason); + } + // https://fetch.spec.whatwg.org/#fetch-controller-abort + abort(error2) { + if (this.state !== "ongoing") { + return; + } + this.state = "aborted"; + if (!error2) { + error2 = new DOMException2("The operation was aborted.", "AbortError"); + } + this.serializedAbortReason = error2; + this.connection?.destroy(error2); + this.emit("terminated", error2); + } + }; + async function fetch(input, init = {}) { + webidl.argumentLengthCheck(arguments, 1, { header: "globalThis.fetch" }); + const p = createDeferredPromise(); + let requestObject; + try { + requestObject = new Request(input, init); + } catch (e) { + p.reject(e); + return p.promise; + } + const request = requestObject[kState]; + if (requestObject.signal.aborted) { + abortFetch(p, request, null, requestObject.signal.reason); + return p.promise; + } + const globalObject = request.client.globalObject; + if (globalObject?.constructor?.name === "ServiceWorkerGlobalScope") { + request.serviceWorkers = "none"; + } + let responseObject = null; + const relevantRealm = null; + let locallyAborted = false; + let controller = null; + addAbortListener( + requestObject.signal, + () => { + locallyAborted = true; + assert(controller != null); + controller.abort(requestObject.signal.reason); + abortFetch(p, request, responseObject, requestObject.signal.reason); + } + ); + const handleFetchDone = (response) => finalizeAndReportTiming(response, "fetch"); + const processResponse = (response) => { + if (locallyAborted) { + return; + } + if (response.aborted) { + abortFetch(p, request, responseObject, controller.serializedAbortReason); + return; + } + if (response.type === "error") { + p.reject( + Object.assign(new TypeError("fetch failed"), { cause: response.error }) + ); + return; + } + responseObject = new Response(); + responseObject[kState] = response; + responseObject[kRealm] = relevantRealm; + responseObject[kHeaders][kHeadersList] = response.headersList; + responseObject[kHeaders][kGuard] = "immutable"; + responseObject[kHeaders][kRealm] = relevantRealm; + p.resolve(responseObject); + }; + controller = fetching({ + request, + processResponseEndOfBody: handleFetchDone, + processResponse, + dispatcher: init.dispatcher ?? getGlobalDispatcher() + // undici + }); + return p.promise; + } + function finalizeAndReportTiming(response, initiatorType = "other") { + if (response.type === "error" && response.aborted) { + return; + } + if (!response.urlList?.length) { + return; + } + const originalURL = response.urlList[0]; + let timingInfo = response.timingInfo; + let cacheState = response.cacheState; + if (!urlIsHttpHttpsScheme(originalURL)) { + return; + } + if (timingInfo === null) { + return; + } + if (!timingInfo.timingAllowPassed) { + timingInfo = createOpaqueTimingInfo({ + startTime: timingInfo.startTime + }); + cacheState = ""; + } + timingInfo.endTime = coarsenedSharedCurrentTime(); + response.timingInfo = timingInfo; + markResourceTiming( + timingInfo, + originalURL, + initiatorType, + globalThis, + cacheState + ); + } + function markResourceTiming(timingInfo, originalURL, initiatorType, globalThis2, cacheState) { + if (nodeMajor > 18 || nodeMajor === 18 && nodeMinor >= 2) { + performance.markResourceTiming(timingInfo, originalURL.href, initiatorType, globalThis2, cacheState); + } + } + function abortFetch(p, request, responseObject, error2) { + if (!error2) { + error2 = new DOMException2("The operation was aborted.", "AbortError"); + } + p.reject(error2); + if (request.body != null && isReadable(request.body?.stream)) { + request.body.stream.cancel(error2).catch((err) => { + if (err.code === "ERR_INVALID_STATE") { + return; + } + throw err; + }); + } + if (responseObject == null) { + return; + } + const response = responseObject[kState]; + if (response.body != null && isReadable(response.body?.stream)) { + response.body.stream.cancel(error2).catch((err) => { + if (err.code === "ERR_INVALID_STATE") { + return; + } + throw err; + }); + } + } + function fetching({ + request, + processRequestBodyChunkLength, + processRequestEndOfBody, + processResponse, + processResponseEndOfBody, + processResponseConsumeBody, + useParallelQueue = false, + dispatcher + // undici + }) { + let taskDestination = null; + let crossOriginIsolatedCapability = false; + if (request.client != null) { + taskDestination = request.client.globalObject; + crossOriginIsolatedCapability = request.client.crossOriginIsolatedCapability; + } + const currenTime = coarsenedSharedCurrentTime(crossOriginIsolatedCapability); + const timingInfo = createOpaqueTimingInfo({ + startTime: currenTime + }); + const fetchParams = { + controller: new Fetch(dispatcher), + request, + timingInfo, + processRequestBodyChunkLength, + processRequestEndOfBody, + processResponse, + processResponseConsumeBody, + processResponseEndOfBody, + taskDestination, + crossOriginIsolatedCapability + }; + assert(!request.body || request.body.stream); + if (request.window === "client") { + request.window = request.client?.globalObject?.constructor?.name === "Window" ? request.client : "no-window"; + } + if (request.origin === "client") { + request.origin = request.client?.origin; + } + if (request.policyContainer === "client") { + if (request.client != null) { + request.policyContainer = clonePolicyContainer( + request.client.policyContainer + ); + } else { + request.policyContainer = makePolicyContainer(); + } + } + if (!request.headersList.contains("accept")) { + const value = "*/*"; + request.headersList.append("accept", value); + } + if (!request.headersList.contains("accept-language")) { + request.headersList.append("accept-language", "*"); + } + if (request.priority === null) { + } + if (subresource.includes(request.destination)) { + } + mainFetch(fetchParams).catch((err) => { + fetchParams.controller.terminate(err); + }); + return fetchParams.controller; + } + async function mainFetch(fetchParams, recursive = false) { + const request = fetchParams.request; + let response = null; + if (request.localURLsOnly && !urlIsLocal(requestCurrentURL(request))) { + response = makeNetworkError("local URLs only"); + } + tryUpgradeRequestToAPotentiallyTrustworthyURL(request); + if (requestBadPort(request) === "blocked") { + response = makeNetworkError("bad port"); + } + if (request.referrerPolicy === "") { + request.referrerPolicy = request.policyContainer.referrerPolicy; + } + if (request.referrer !== "no-referrer") { + request.referrer = determineRequestsReferrer(request); + } + if (response === null) { + response = await (async () => { + const currentURL = requestCurrentURL(request); + if ( + // - request’s current URL’s origin is same origin with request’s origin, + // and request’s response tainting is "basic" + sameOrigin(currentURL, request.url) && request.responseTainting === "basic" || // request’s current URL’s scheme is "data" + currentURL.protocol === "data:" || // - request’s mode is "navigate" or "websocket" + (request.mode === "navigate" || request.mode === "websocket") + ) { + request.responseTainting = "basic"; + return await schemeFetch(fetchParams); + } + if (request.mode === "same-origin") { + return makeNetworkError('request mode cannot be "same-origin"'); + } + if (request.mode === "no-cors") { + if (request.redirect !== "follow") { + return makeNetworkError( + 'redirect mode cannot be "follow" for "no-cors" request' + ); + } + request.responseTainting = "opaque"; + return await schemeFetch(fetchParams); + } + if (!urlIsHttpHttpsScheme(requestCurrentURL(request))) { + return makeNetworkError("URL scheme must be a HTTP(S) scheme"); + } + request.responseTainting = "cors"; + return await httpFetch(fetchParams); + })(); + } + if (recursive) { + return response; + } + if (response.status !== 0 && !response.internalResponse) { + if (request.responseTainting === "cors") { + } + if (request.responseTainting === "basic") { + response = filterResponse(response, "basic"); + } else if (request.responseTainting === "cors") { + response = filterResponse(response, "cors"); + } else if (request.responseTainting === "opaque") { + response = filterResponse(response, "opaque"); + } else { + assert(false); + } + } + let internalResponse = response.status === 0 ? response : response.internalResponse; + if (internalResponse.urlList.length === 0) { + internalResponse.urlList.push(...request.urlList); + } + if (!request.timingAllowFailed) { + response.timingAllowPassed = true; + } + if (response.type === "opaque" && internalResponse.status === 206 && internalResponse.rangeRequested && !request.headers.contains("range")) { + response = internalResponse = makeNetworkError(); + } + if (response.status !== 0 && (request.method === "HEAD" || request.method === "CONNECT" || nullBodyStatus.includes(internalResponse.status))) { + internalResponse.body = null; + fetchParams.controller.dump = true; + } + if (request.integrity) { + const processBodyError = (reason) => fetchFinale(fetchParams, makeNetworkError(reason)); + if (request.responseTainting === "opaque" || response.body == null) { + processBodyError(response.error); + return; + } + const processBody = (bytes) => { + if (!bytesMatch(bytes, request.integrity)) { + processBodyError("integrity mismatch"); + return; + } + response.body = safelyExtractBody(bytes)[0]; + fetchFinale(fetchParams, response); + }; + await fullyReadBody(response.body, processBody, processBodyError); + } else { + fetchFinale(fetchParams, response); + } + } + async function schemeFetch(fetchParams) { + if (isCancelled(fetchParams) && fetchParams.request.redirectCount === 0) { + return makeAppropriateNetworkError(fetchParams); + } + const { request } = fetchParams; + const { protocol: scheme } = requestCurrentURL(request); + switch (scheme) { + case "about:": { + return makeNetworkError("about scheme is not supported"); + } + case "blob:": { + if (!resolveObjectURL) { + resolveObjectURL = require("buffer").resolveObjectURL; + } + const blobURLEntry = requestCurrentURL(request); + if (blobURLEntry.search.length !== 0) { + return makeNetworkError("NetworkError when attempting to fetch resource."); + } + const blobURLEntryObject = resolveObjectURL(blobURLEntry.toString()); + if (request.method !== "GET" || !isBlobLike(blobURLEntryObject)) { + return makeNetworkError("invalid method"); + } + const bodyWithType = safelyExtractBody(blobURLEntryObject); + const body = bodyWithType[0]; + const length = isomorphicEncode(`${body.length}`); + const type = bodyWithType[1] ?? ""; + const response = makeResponse({ + statusText: "OK", + headersList: [ + ["content-length", { name: "Content-Length", value: length }], + ["content-type", { name: "Content-Type", value: type }] + ] + }); + response.body = body; + return response; + } + case "data:": { + const currentURL = requestCurrentURL(request); + const dataURLStruct = dataURLProcessor(currentURL); + if (dataURLStruct === "failure") { + return makeNetworkError("failed to fetch the data URL"); + } + const mimeType = serializeAMimeType(dataURLStruct.mimeType); + return makeResponse({ + statusText: "OK", + headersList: [ + ["content-type", { name: "Content-Type", value: mimeType }] + ], + body: safelyExtractBody(dataURLStruct.body)[0] + }); + } + case "file:": { + return makeNetworkError("not implemented... yet..."); + } + case "http:": + case "https:": { + return await httpFetch(fetchParams).catch((err) => makeNetworkError(err)); + } + default: { + return makeNetworkError("unknown scheme"); + } + } + } + function finalizeResponse(fetchParams, response) { + fetchParams.request.done = true; + if (fetchParams.processResponseDone != null) { + queueMicrotask(() => fetchParams.processResponseDone(response)); + } + } + async function fetchFinale(fetchParams, response) { + if (response.type === "error") { + response.urlList = [fetchParams.request.urlList[0]]; + response.timingInfo = createOpaqueTimingInfo({ + startTime: fetchParams.timingInfo.startTime + }); + } + const processResponseEndOfBody = () => { + fetchParams.request.done = true; + if (fetchParams.processResponseEndOfBody != null) { + queueMicrotask(() => fetchParams.processResponseEndOfBody(response)); + } + }; + if (fetchParams.processResponse != null) { + queueMicrotask(() => fetchParams.processResponse(response)); + } + if (response.body == null) { + processResponseEndOfBody(); + } else { + const identityTransformAlgorithm = (chunk, controller) => { + controller.enqueue(chunk); + }; + const transformStream = new TransformStream({ + start() { + }, + transform: identityTransformAlgorithm, + flush: processResponseEndOfBody + }, { + size() { + return 1; + } + }, { + size() { + return 1; + } + }); + response.body = { stream: response.body.stream.pipeThrough(transformStream) }; + } + if (fetchParams.processResponseConsumeBody != null) { + const processBody = (nullOrBytes) => fetchParams.processResponseConsumeBody(response, nullOrBytes); + const processBodyError = (failure) => fetchParams.processResponseConsumeBody(response, failure); + if (response.body == null) { + queueMicrotask(() => processBody(null)); + } else { + await fullyReadBody(response.body, processBody, processBodyError); + } + } + } + async function httpFetch(fetchParams) { + const request = fetchParams.request; + let response = null; + let actualResponse = null; + const timingInfo = fetchParams.timingInfo; + if (request.serviceWorkers === "all") { + } + if (response === null) { + if (request.redirect === "follow") { + request.serviceWorkers = "none"; + } + actualResponse = response = await httpNetworkOrCacheFetch(fetchParams); + if (request.responseTainting === "cors" && corsCheck(request, response) === "failure") { + return makeNetworkError("cors failure"); + } + if (TAOCheck(request, response) === "failure") { + request.timingAllowFailed = true; + } + } + if ((request.responseTainting === "opaque" || response.type === "opaque") && crossOriginResourcePolicyCheck( + request.origin, + request.client, + request.destination, + actualResponse + ) === "blocked") { + return makeNetworkError("blocked"); + } + if (redirectStatus.includes(actualResponse.status)) { + if (request.redirect !== "manual") { + fetchParams.controller.connection.destroy(); + } + if (request.redirect === "error") { + response = makeNetworkError("unexpected redirect"); + } else if (request.redirect === "manual") { + response = actualResponse; + } else if (request.redirect === "follow") { + response = await httpRedirectFetch(fetchParams, response); + } else { + assert(false); + } + } + response.timingInfo = timingInfo; + return response; + } + async function httpRedirectFetch(fetchParams, response) { + const request = fetchParams.request; + const actualResponse = response.internalResponse ? response.internalResponse : response; + let locationURL; + try { + locationURL = responseLocationURL( + actualResponse, + requestCurrentURL(request).hash + ); + if (locationURL == null) { + return response; + } + } catch (err) { + return makeNetworkError(err); + } + if (!urlIsHttpHttpsScheme(locationURL)) { + return makeNetworkError("URL scheme must be a HTTP(S) scheme"); + } + if (request.redirectCount === 20) { + return makeNetworkError("redirect count exceeded"); + } + request.redirectCount += 1; + if (request.mode === "cors" && (locationURL.username || locationURL.password) && !sameOrigin(request, locationURL)) { + return makeNetworkError('cross origin not allowed for request mode "cors"'); + } + if (request.responseTainting === "cors" && (locationURL.username || locationURL.password)) { + return makeNetworkError( + 'URL cannot contain credentials for request mode "cors"' + ); + } + if (actualResponse.status !== 303 && request.body != null && request.body.source == null) { + return makeNetworkError(); + } + if ([301, 302].includes(actualResponse.status) && request.method === "POST" || actualResponse.status === 303 && !["GET", "HEAD"].includes(request.method)) { + request.method = "GET"; + request.body = null; + for (const headerName of requestBodyHeader) { + request.headersList.delete(headerName); + } + } + if (!sameOrigin(requestCurrentURL(request), locationURL)) { + request.headersList.delete("authorization"); + } + if (request.body != null) { + assert(request.body.source != null); + request.body = safelyExtractBody(request.body.source)[0]; + } + const timingInfo = fetchParams.timingInfo; + timingInfo.redirectEndTime = timingInfo.postRedirectStartTime = coarsenedSharedCurrentTime(fetchParams.crossOriginIsolatedCapability); + if (timingInfo.redirectStartTime === 0) { + timingInfo.redirectStartTime = timingInfo.startTime; + } + request.urlList.push(locationURL); + setRequestReferrerPolicyOnRedirect(request, actualResponse); + return mainFetch(fetchParams, true); + } + async function httpNetworkOrCacheFetch(fetchParams, isAuthenticationFetch = false, isNewConnectionFetch = false) { + const request = fetchParams.request; + let httpFetchParams = null; + let httpRequest = null; + let response = null; + const httpCache = null; + const revalidatingFlag = false; + if (request.window === "no-window" && request.redirect === "error") { + httpFetchParams = fetchParams; + httpRequest = request; + } else { + httpRequest = makeRequest(request); + httpFetchParams = { ...fetchParams }; + httpFetchParams.request = httpRequest; + } + const includeCredentials = request.credentials === "include" || request.credentials === "same-origin" && request.responseTainting === "basic"; + const contentLength = httpRequest.body ? httpRequest.body.length : null; + let contentLengthHeaderValue = null; + if (httpRequest.body == null && ["POST", "PUT"].includes(httpRequest.method)) { + contentLengthHeaderValue = "0"; + } + if (contentLength != null) { + contentLengthHeaderValue = isomorphicEncode(`${contentLength}`); + } + if (contentLengthHeaderValue != null) { + httpRequest.headersList.append("content-length", contentLengthHeaderValue); + } + if (contentLength != null && httpRequest.keepalive) { + } + if (httpRequest.referrer instanceof URL) { + httpRequest.headersList.append("referer", isomorphicEncode(httpRequest.referrer.href)); + } + appendRequestOriginHeader(httpRequest); + appendFetchMetadata(httpRequest); + if (!httpRequest.headersList.contains("user-agent")) { + httpRequest.headersList.append("user-agent", "undici"); + } + if (httpRequest.cache === "default" && (httpRequest.headersList.contains("if-modified-since") || httpRequest.headersList.contains("if-none-match") || httpRequest.headersList.contains("if-unmodified-since") || httpRequest.headersList.contains("if-match") || httpRequest.headersList.contains("if-range"))) { + httpRequest.cache = "no-store"; + } + if (httpRequest.cache === "no-cache" && !httpRequest.preventNoCacheCacheControlHeaderModification && !httpRequest.headersList.contains("cache-control")) { + httpRequest.headersList.append("cache-control", "max-age=0"); + } + if (httpRequest.cache === "no-store" || httpRequest.cache === "reload") { + if (!httpRequest.headersList.contains("pragma")) { + httpRequest.headersList.append("pragma", "no-cache"); + } + if (!httpRequest.headersList.contains("cache-control")) { + httpRequest.headersList.append("cache-control", "no-cache"); + } + } + if (httpRequest.headersList.contains("range")) { + httpRequest.headersList.append("accept-encoding", "identity"); + } + if (!httpRequest.headersList.contains("accept-encoding")) { + if (urlHasHttpsScheme(requestCurrentURL(httpRequest))) { + httpRequest.headersList.append("accept-encoding", "br, gzip, deflate"); + } else { + httpRequest.headersList.append("accept-encoding", "gzip, deflate"); + } + } + if (includeCredentials) { + } + if (httpCache == null) { + httpRequest.cache = "no-store"; + } + if (httpRequest.mode !== "no-store" && httpRequest.mode !== "reload") { + } + if (response == null) { + if (httpRequest.mode === "only-if-cached") { + return makeNetworkError("only if cached"); + } + const forwardResponse = await httpNetworkFetch( + httpFetchParams, + includeCredentials, + isNewConnectionFetch + ); + if (!safeMethods.includes(httpRequest.method) && forwardResponse.status >= 200 && forwardResponse.status <= 399) { + } + if (revalidatingFlag && forwardResponse.status === 304) { + } + if (response == null) { + response = forwardResponse; + } + } + response.urlList = [...httpRequest.urlList]; + if (httpRequest.headersList.contains("range")) { + response.rangeRequested = true; + } + response.requestIncludesCredentials = includeCredentials; + if (response.status === 407) { + if (request.window === "no-window") { + return makeNetworkError(); + } + if (isCancelled(fetchParams)) { + return makeAppropriateNetworkError(fetchParams); + } + return makeNetworkError("proxy authentication required"); + } + if ( + // response’s status is 421 + response.status === 421 && // isNewConnectionFetch is false + !isNewConnectionFetch && // request’s body is null, or request’s body is non-null and request’s body’s source is non-null + (request.body == null || request.body.source != null) + ) { + if (isCancelled(fetchParams)) { + return makeAppropriateNetworkError(fetchParams); + } + fetchParams.controller.connection.destroy(); + response = await httpNetworkOrCacheFetch( + fetchParams, + isAuthenticationFetch, + true + ); + } + if (isAuthenticationFetch) { + } + return response; + } + async function httpNetworkFetch(fetchParams, includeCredentials = false, forceNewConnection = false) { + assert(!fetchParams.controller.connection || fetchParams.controller.connection.destroyed); + fetchParams.controller.connection = { + abort: null, + destroyed: false, + destroy(err) { + if (!this.destroyed) { + this.destroyed = true; + this.abort?.(err ?? new DOMException2("The operation was aborted.", "AbortError")); + } + } + }; + const request = fetchParams.request; + let response = null; + const timingInfo = fetchParams.timingInfo; + const httpCache = null; + if (httpCache == null) { + request.cache = "no-store"; + } + const newConnection = forceNewConnection ? "yes" : "no"; + if (request.mode === "websocket") { + } else { + } + let requestBody = null; + if (request.body == null && fetchParams.processRequestEndOfBody) { + queueMicrotask(() => fetchParams.processRequestEndOfBody()); + } else if (request.body != null) { + const processBodyChunk = async function* (bytes) { + if (isCancelled(fetchParams)) { + return; + } + yield bytes; + fetchParams.processRequestBodyChunkLength?.(bytes.byteLength); + }; + const processEndOfBody = () => { + if (isCancelled(fetchParams)) { + return; + } + if (fetchParams.processRequestEndOfBody) { + fetchParams.processRequestEndOfBody(); + } + }; + const processBodyError = (e) => { + if (isCancelled(fetchParams)) { + return; + } + if (e.name === "AbortError") { + fetchParams.controller.abort(); + } else { + fetchParams.controller.terminate(e); + } + }; + requestBody = async function* () { + try { + for await (const bytes of request.body.stream) { + yield* processBodyChunk(bytes); + } + processEndOfBody(); + } catch (err) { + processBodyError(err); + } + }(); + } + try { + const { body, status: status2, statusText, headersList, socket } = await dispatch({ body: requestBody }); + if (socket) { + response = makeResponse({ status: status2, statusText, headersList, socket }); + } else { + const iterator = body[Symbol.asyncIterator](); + fetchParams.controller.next = () => iterator.next(); + response = makeResponse({ status: status2, statusText, headersList }); + } + } catch (err) { + if (err.name === "AbortError") { + fetchParams.controller.connection.destroy(); + return makeAppropriateNetworkError(fetchParams); + } + return makeNetworkError(err); + } + const pullAlgorithm = () => { + fetchParams.controller.resume(); + }; + const cancelAlgorithm = (reason) => { + fetchParams.controller.abort(reason); + }; + if (!ReadableStream) { + ReadableStream = require("stream/web").ReadableStream; + } + const stream = new ReadableStream( + { + async start(controller) { + fetchParams.controller.controller = controller; + }, + async pull(controller) { + await pullAlgorithm(controller); + }, + async cancel(reason) { + await cancelAlgorithm(reason); + } + }, + { + highWaterMark: 0, + size() { + return 1; + } + } + ); + response.body = { stream }; + fetchParams.controller.on("terminated", onAborted); + fetchParams.controller.resume = async () => { + while (true) { + let bytes; + let isFailure; + try { + const { done, value } = await fetchParams.controller.next(); + if (isAborted(fetchParams)) { + break; + } + bytes = done ? void 0 : value; + } catch (err) { + if (fetchParams.controller.ended && !timingInfo.encodedBodySize) { + bytes = void 0; + } else { + bytes = err; + isFailure = true; + } + } + if (bytes === void 0) { + readableStreamClose(fetchParams.controller.controller); + finalizeResponse(fetchParams, response); + return; + } + timingInfo.decodedBodySize += bytes?.byteLength ?? 0; + if (isFailure) { + fetchParams.controller.terminate(bytes); + return; + } + fetchParams.controller.controller.enqueue(new Uint8Array(bytes)); + if (isErrored(stream)) { + fetchParams.controller.terminate(); + return; + } + if (!fetchParams.controller.controller.desiredSize) { + return; + } + } + }; + function onAborted(reason) { + if (isAborted(fetchParams)) { + response.aborted = true; + if (isReadable(stream)) { + fetchParams.controller.controller.error( + fetchParams.controller.serializedAbortReason + ); + } + } else { + if (isReadable(stream)) { + fetchParams.controller.controller.error(new TypeError("terminated", { + cause: isErrorLike(reason) ? reason : void 0 + })); + } + } + fetchParams.controller.connection.destroy(); + } + return response; + async function dispatch({ body }) { + const url = requestCurrentURL(request); + const agent = fetchParams.controller.dispatcher; + return new Promise((resolve, reject) => agent.dispatch( + { + path: url.pathname + url.search, + origin: url.origin, + method: request.method, + body: fetchParams.controller.dispatcher.isMockActive ? request.body && request.body.source : body, + headers: request.headersList.entries, + maxRedirections: 0, + upgrade: request.mode === "websocket" ? "websocket" : void 0 + }, + { + body: null, + abort: null, + onConnect(abort) { + const { connection } = fetchParams.controller; + if (connection.destroyed) { + abort(new DOMException2("The operation was aborted.", "AbortError")); + } else { + fetchParams.controller.on("terminated", abort); + this.abort = connection.abort = abort; + } + }, + onHeaders(status2, headersList, resume, statusText) { + if (status2 < 200) { + return; + } + let codings = []; + let location = ""; + const headers = new Headers(); + for (let n = 0; n < headersList.length; n += 2) { + const key = headersList[n + 0].toString("latin1"); + const val = headersList[n + 1].toString("latin1"); + if (key.toLowerCase() === "content-encoding") { + codings = val.toLowerCase().split(",").map((x) => x.trim()).reverse(); + } else if (key.toLowerCase() === "location") { + location = val; + } + headers.append(key, val); + } + this.body = new Readable({ read: resume }); + const decoders = []; + const willFollow = request.redirect === "follow" && location && redirectStatus.includes(status2); + if (request.method !== "HEAD" && request.method !== "CONNECT" && !nullBodyStatus.includes(status2) && !willFollow) { + for (const coding of codings) { + if (coding === "x-gzip" || coding === "gzip") { + decoders.push(zlib.createGunzip({ + // Be less strict when decoding compressed responses, since sometimes + // servers send slightly invalid responses that are still accepted + // by common browsers. + // Always using Z_SYNC_FLUSH is what cURL does. + flush: zlib.constants.Z_SYNC_FLUSH, + finishFlush: zlib.constants.Z_SYNC_FLUSH + })); + } else if (coding === "deflate") { + decoders.push(zlib.createInflate()); + } else if (coding === "br") { + decoders.push(zlib.createBrotliDecompress()); + } else { + decoders.length = 0; + break; + } + } + } + resolve({ + status: status2, + statusText, + headersList: headers[kHeadersList], + body: decoders.length ? pipeline(this.body, ...decoders, () => { + }) : this.body.on("error", () => { + }) + }); + return true; + }, + onData(chunk) { + if (fetchParams.controller.dump) { + return; + } + const bytes = chunk; + timingInfo.encodedBodySize += bytes.byteLength; + return this.body.push(bytes); + }, + onComplete() { + if (this.abort) { + fetchParams.controller.off("terminated", this.abort); + } + fetchParams.controller.ended = true; + this.body.push(null); + }, + onError(error2) { + if (this.abort) { + fetchParams.controller.off("terminated", this.abort); + } + this.body?.destroy(error2); + fetchParams.controller.terminate(error2); + reject(error2); + }, + onUpgrade(status2, headersList, socket) { + if (status2 !== 101) { + return; + } + const headers = new Headers(); + for (let n = 0; n < headersList.length; n += 2) { + const key = headersList[n + 0].toString("latin1"); + const val = headersList[n + 1].toString("latin1"); + headers.append(key, val); + } + resolve({ + status: status2, + statusText: STATUS_CODES[status2], + headersList: headers[kHeadersList], + socket + }); + return true; + } + } + )); + } + } + module2.exports = { + fetch, + Fetch, + fetching, + finalizeAndReportTiming + }; + } +}); + +// node_modules/undici/lib/fileapi/symbols.js +var require_symbols3 = __commonJS({ + "node_modules/undici/lib/fileapi/symbols.js"(exports2, module2) { + "use strict"; + module2.exports = { + kState: Symbol("FileReader state"), + kResult: Symbol("FileReader result"), + kError: Symbol("FileReader error"), + kLastProgressEventFired: Symbol("FileReader last progress event fired timestamp"), + kEvents: Symbol("FileReader events"), + kAborted: Symbol("FileReader aborted") + }; + } +}); + +// node_modules/undici/lib/fileapi/progressevent.js +var require_progressevent = __commonJS({ + "node_modules/undici/lib/fileapi/progressevent.js"(exports2, module2) { + "use strict"; + var { webidl } = require_webidl(); + var kState = Symbol("ProgressEvent state"); + var ProgressEvent = class _ProgressEvent extends Event { + constructor(type, eventInitDict = {}) { + type = webidl.converters.DOMString(type); + eventInitDict = webidl.converters.ProgressEventInit(eventInitDict ?? {}); + super(type, eventInitDict); + this[kState] = { + lengthComputable: eventInitDict.lengthComputable, + loaded: eventInitDict.loaded, + total: eventInitDict.total + }; + } + get lengthComputable() { + webidl.brandCheck(this, _ProgressEvent); + return this[kState].lengthComputable; + } + get loaded() { + webidl.brandCheck(this, _ProgressEvent); + return this[kState].loaded; + } + get total() { + webidl.brandCheck(this, _ProgressEvent); + return this[kState].total; + } + }; + webidl.converters.ProgressEventInit = webidl.dictionaryConverter([ + { + key: "lengthComputable", + converter: webidl.converters.boolean, + defaultValue: false + }, + { + key: "loaded", + converter: webidl.converters["unsigned long long"], + defaultValue: 0 + }, + { + key: "total", + converter: webidl.converters["unsigned long long"], + defaultValue: 0 + }, + { + key: "bubbles", + converter: webidl.converters.boolean, + defaultValue: false + }, + { + key: "cancelable", + converter: webidl.converters.boolean, + defaultValue: false + }, + { + key: "composed", + converter: webidl.converters.boolean, + defaultValue: false + } + ]); + module2.exports = { + ProgressEvent + }; + } +}); + +// node_modules/undici/lib/fileapi/encoding.js +var require_encoding = __commonJS({ + "node_modules/undici/lib/fileapi/encoding.js"(exports2, module2) { + "use strict"; + function getEncoding(label) { + if (!label) { + return "failure"; + } + switch (label.trim().toLowerCase()) { + case "unicode-1-1-utf-8": + case "unicode11utf8": + case "unicode20utf8": + case "utf-8": + case "utf8": + case "x-unicode20utf8": + return "UTF-8"; + case "866": + case "cp866": + case "csibm866": + case "ibm866": + return "IBM866"; + case "csisolatin2": + case "iso-8859-2": + case "iso-ir-101": + case "iso8859-2": + case "iso88592": + case "iso_8859-2": + case "iso_8859-2:1987": + case "l2": + case "latin2": + return "ISO-8859-2"; + case "csisolatin3": + case "iso-8859-3": + case "iso-ir-109": + case "iso8859-3": + case "iso88593": + case "iso_8859-3": + case "iso_8859-3:1988": + case "l3": + case "latin3": + return "ISO-8859-3"; + case "csisolatin4": + case "iso-8859-4": + case "iso-ir-110": + case "iso8859-4": + case "iso88594": + case "iso_8859-4": + case "iso_8859-4:1988": + case "l4": + case "latin4": + return "ISO-8859-4"; + case "csisolatincyrillic": + case "cyrillic": + case "iso-8859-5": + case "iso-ir-144": + case "iso8859-5": + case "iso88595": + case "iso_8859-5": + case "iso_8859-5:1988": + return "ISO-8859-5"; + case "arabic": + case "asmo-708": + case "csiso88596e": + case "csiso88596i": + case "csisolatinarabic": + case "ecma-114": + case "iso-8859-6": + case "iso-8859-6-e": + case "iso-8859-6-i": + case "iso-ir-127": + case "iso8859-6": + case "iso88596": + case "iso_8859-6": + case "iso_8859-6:1987": + return "ISO-8859-6"; + case "csisolatingreek": + case "ecma-118": + case "elot_928": + case "greek": + case "greek8": + case "iso-8859-7": + case "iso-ir-126": + case "iso8859-7": + case "iso88597": + case "iso_8859-7": + case "iso_8859-7:1987": + case "sun_eu_greek": + return "ISO-8859-7"; + case "csiso88598e": + case "csisolatinhebrew": + case "hebrew": + case "iso-8859-8": + case "iso-8859-8-e": + case "iso-ir-138": + case "iso8859-8": + case "iso88598": + case "iso_8859-8": + case "iso_8859-8:1988": + case "visual": + return "ISO-8859-8"; + case "csiso88598i": + case "iso-8859-8-i": + case "logical": + return "ISO-8859-8-I"; + case "csisolatin6": + case "iso-8859-10": + case "iso-ir-157": + case "iso8859-10": + case "iso885910": + case "l6": + case "latin6": + return "ISO-8859-10"; + case "iso-8859-13": + case "iso8859-13": + case "iso885913": + return "ISO-8859-13"; + case "iso-8859-14": + case "iso8859-14": + case "iso885914": + return "ISO-8859-14"; + case "csisolatin9": + case "iso-8859-15": + case "iso8859-15": + case "iso885915": + case "iso_8859-15": + case "l9": + return "ISO-8859-15"; + case "iso-8859-16": + return "ISO-8859-16"; + case "cskoi8r": + case "koi": + case "koi8": + case "koi8-r": + case "koi8_r": + return "KOI8-R"; + case "koi8-ru": + case "koi8-u": + return "KOI8-U"; + case "csmacintosh": + case "mac": + case "macintosh": + case "x-mac-roman": + return "macintosh"; + case "iso-8859-11": + case "iso8859-11": + case "iso885911": + case "tis-620": + case "windows-874": + return "windows-874"; + case "cp1250": + case "windows-1250": + case "x-cp1250": + return "windows-1250"; + case "cp1251": + case "windows-1251": + case "x-cp1251": + return "windows-1251"; + case "ansi_x3.4-1968": + case "ascii": + case "cp1252": + case "cp819": + case "csisolatin1": + case "ibm819": + case "iso-8859-1": + case "iso-ir-100": + case "iso8859-1": + case "iso88591": + case "iso_8859-1": + case "iso_8859-1:1987": + case "l1": + case "latin1": + case "us-ascii": + case "windows-1252": + case "x-cp1252": + return "windows-1252"; + case "cp1253": + case "windows-1253": + case "x-cp1253": + return "windows-1253"; + case "cp1254": + case "csisolatin5": + case "iso-8859-9": + case "iso-ir-148": + case "iso8859-9": + case "iso88599": + case "iso_8859-9": + case "iso_8859-9:1989": + case "l5": + case "latin5": + case "windows-1254": + case "x-cp1254": + return "windows-1254"; + case "cp1255": + case "windows-1255": + case "x-cp1255": + return "windows-1255"; + case "cp1256": + case "windows-1256": + case "x-cp1256": + return "windows-1256"; + case "cp1257": + case "windows-1257": + case "x-cp1257": + return "windows-1257"; + case "cp1258": + case "windows-1258": + case "x-cp1258": + return "windows-1258"; + case "x-mac-cyrillic": + case "x-mac-ukrainian": + return "x-mac-cyrillic"; + case "chinese": + case "csgb2312": + case "csiso58gb231280": + case "gb2312": + case "gb_2312": + case "gb_2312-80": + case "gbk": + case "iso-ir-58": + case "x-gbk": + return "GBK"; + case "gb18030": + return "gb18030"; + case "big5": + case "big5-hkscs": + case "cn-big5": + case "csbig5": + case "x-x-big5": + return "Big5"; + case "cseucpkdfmtjapanese": + case "euc-jp": + case "x-euc-jp": + return "EUC-JP"; + case "csiso2022jp": + case "iso-2022-jp": + return "ISO-2022-JP"; + case "csshiftjis": + case "ms932": + case "ms_kanji": + case "shift-jis": + case "shift_jis": + case "sjis": + case "windows-31j": + case "x-sjis": + return "Shift_JIS"; + case "cseuckr": + case "csksc56011987": + case "euc-kr": + case "iso-ir-149": + case "korean": + case "ks_c_5601-1987": + case "ks_c_5601-1989": + case "ksc5601": + case "ksc_5601": + case "windows-949": + return "EUC-KR"; + case "csiso2022kr": + case "hz-gb-2312": + case "iso-2022-cn": + case "iso-2022-cn-ext": + case "iso-2022-kr": + case "replacement": + return "replacement"; + case "unicodefffe": + case "utf-16be": + return "UTF-16BE"; + case "csunicode": + case "iso-10646-ucs-2": + case "ucs-2": + case "unicode": + case "unicodefeff": + case "utf-16": + case "utf-16le": + return "UTF-16LE"; + case "x-user-defined": + return "x-user-defined"; + default: + return "failure"; + } + } + module2.exports = { + getEncoding + }; + } +}); + +// node_modules/undici/lib/fileapi/util.js +var require_util7 = __commonJS({ + "node_modules/undici/lib/fileapi/util.js"(exports2, module2) { + "use strict"; + var { + kState, + kError, + kResult, + kAborted, + kLastProgressEventFired + } = require_symbols3(); + var { ProgressEvent } = require_progressevent(); + var { getEncoding } = require_encoding(); + var { DOMException: DOMException2 } = require_constants2(); + var { serializeAMimeType, parseMIMEType } = require_dataURL(); + var { types } = require("util"); + var { StringDecoder } = require("string_decoder"); + var { btoa } = require("buffer"); + var staticPropertyDescriptors = { + enumerable: true, + writable: false, + configurable: false + }; + function readOperation(fr2, blob, type, encodingName) { + if (fr2[kState] === "loading") { + throw new DOMException2("Invalid state", "InvalidStateError"); + } + fr2[kState] = "loading"; + fr2[kResult] = null; + fr2[kError] = null; + const stream = blob.stream(); + const reader = stream.getReader(); + const bytes = []; + let chunkPromise = reader.read(); + let isFirstChunk = true; + (async () => { + while (!fr2[kAborted]) { + try { + const { done, value } = await chunkPromise; + if (isFirstChunk && !fr2[kAborted]) { + queueMicrotask(() => { + fireAProgressEvent("loadstart", fr2); + }); + } + isFirstChunk = false; + if (!done && types.isUint8Array(value)) { + bytes.push(value); + if ((fr2[kLastProgressEventFired] === void 0 || Date.now() - fr2[kLastProgressEventFired] >= 50) && !fr2[kAborted]) { + fr2[kLastProgressEventFired] = Date.now(); + queueMicrotask(() => { + fireAProgressEvent("progress", fr2); + }); + } + chunkPromise = reader.read(); + } else if (done) { + queueMicrotask(() => { + fr2[kState] = "done"; + try { + const result = packageData(bytes, type, blob.type, encodingName); + if (fr2[kAborted]) { + return; + } + fr2[kResult] = result; + fireAProgressEvent("load", fr2); + } catch (error2) { + fr2[kError] = error2; + fireAProgressEvent("error", fr2); + } + if (fr2[kState] !== "loading") { + fireAProgressEvent("loadend", fr2); + } + }); + break; + } + } catch (error2) { + if (fr2[kAborted]) { + return; + } + queueMicrotask(() => { + fr2[kState] = "done"; + fr2[kError] = error2; + fireAProgressEvent("error", fr2); + if (fr2[kState] !== "loading") { + fireAProgressEvent("loadend", fr2); + } + }); + break; + } + } + })(); + } + function fireAProgressEvent(e, reader) { + const event = new ProgressEvent(e, { + bubbles: false, + cancelable: false + }); + reader.dispatchEvent(event); + } + function packageData(bytes, type, mimeType, encodingName) { + switch (type) { + case "DataURL": { + let dataURL = "data:"; + const parsed = parseMIMEType(mimeType || "application/octet-stream"); + if (parsed !== "failure") { + dataURL += serializeAMimeType(parsed); + } + dataURL += ";base64,"; + const decoder = new StringDecoder("latin1"); + for (const chunk of bytes) { + dataURL += btoa(decoder.write(chunk)); + } + dataURL += btoa(decoder.end()); + return dataURL; + } + case "Text": { + let encoding = "failure"; + if (encodingName) { + encoding = getEncoding(encodingName); + } + if (encoding === "failure" && mimeType) { + const type2 = parseMIMEType(mimeType); + if (type2 !== "failure") { + encoding = getEncoding(type2.parameters.get("charset")); + } + } + if (encoding === "failure") { + encoding = "UTF-8"; + } + return decode(bytes, encoding); + } + case "ArrayBuffer": { + const sequence = combineByteSequences(bytes); + return sequence.buffer; + } + case "BinaryString": { + let binaryString = ""; + const decoder = new StringDecoder("latin1"); + for (const chunk of bytes) { + binaryString += decoder.write(chunk); + } + binaryString += decoder.end(); + return binaryString; + } + } + } + function decode(ioQueue, encoding) { + const bytes = combineByteSequences(ioQueue); + const BOMEncoding = BOMSniffing(bytes); + let slice = 0; + if (BOMEncoding !== null) { + encoding = BOMEncoding; + slice = BOMEncoding === "UTF-8" ? 3 : 2; + } + const sliced = bytes.slice(slice); + return new TextDecoder(encoding).decode(sliced); + } + function BOMSniffing(ioQueue) { + const [a, b, c] = ioQueue; + if (a === 239 && b === 187 && c === 191) { + return "UTF-8"; + } else if (a === 254 && b === 255) { + return "UTF-16BE"; + } else if (a === 255 && b === 254) { + return "UTF-16LE"; + } + return null; + } + function combineByteSequences(sequences) { + const size = sequences.reduce((a, b) => { + return a + b.byteLength; + }, 0); + let offset = 0; + return sequences.reduce((a, b) => { + a.set(b, offset); + offset += b.byteLength; + return a; + }, new Uint8Array(size)); + } + module2.exports = { + staticPropertyDescriptors, + readOperation, + fireAProgressEvent + }; + } +}); + +// node_modules/undici/lib/fileapi/filereader.js +var require_filereader = __commonJS({ + "node_modules/undici/lib/fileapi/filereader.js"(exports2, module2) { + "use strict"; + var { + staticPropertyDescriptors, + readOperation, + fireAProgressEvent + } = require_util7(); + var { + kState, + kError, + kResult, + kEvents, + kAborted + } = require_symbols3(); + var { webidl } = require_webidl(); + var { kEnumerableProperty } = require_util4(); + var FileReader = class _FileReader extends EventTarget { + constructor() { + super(); + this[kState] = "empty"; + this[kResult] = null; + this[kError] = null; + this[kEvents] = { + loadend: null, + error: null, + abort: null, + load: null, + progress: null, + loadstart: null + }; + } + /** + * @see https://w3c.github.io/FileAPI/#dfn-readAsArrayBuffer + * @param {import('buffer').Blob} blob + */ + readAsArrayBuffer(blob) { + webidl.brandCheck(this, _FileReader); + webidl.argumentLengthCheck(arguments, 1, { header: "FileReader.readAsArrayBuffer" }); + blob = webidl.converters.Blob(blob, { strict: false }); + readOperation(this, blob, "ArrayBuffer"); + } + /** + * @see https://w3c.github.io/FileAPI/#readAsBinaryString + * @param {import('buffer').Blob} blob + */ + readAsBinaryString(blob) { + webidl.brandCheck(this, _FileReader); + webidl.argumentLengthCheck(arguments, 1, { header: "FileReader.readAsBinaryString" }); + blob = webidl.converters.Blob(blob, { strict: false }); + readOperation(this, blob, "BinaryString"); + } + /** + * @see https://w3c.github.io/FileAPI/#readAsDataText + * @param {import('buffer').Blob} blob + * @param {string?} encoding + */ + readAsText(blob, encoding = void 0) { + webidl.brandCheck(this, _FileReader); + webidl.argumentLengthCheck(arguments, 1, { header: "FileReader.readAsText" }); + blob = webidl.converters.Blob(blob, { strict: false }); + if (encoding !== void 0) { + encoding = webidl.converters.DOMString(encoding); + } + readOperation(this, blob, "Text", encoding); + } + /** + * @see https://w3c.github.io/FileAPI/#dfn-readAsDataURL + * @param {import('buffer').Blob} blob + */ + readAsDataURL(blob) { + webidl.brandCheck(this, _FileReader); + webidl.argumentLengthCheck(arguments, 1, { header: "FileReader.readAsDataURL" }); + blob = webidl.converters.Blob(blob, { strict: false }); + readOperation(this, blob, "DataURL"); + } + /** + * @see https://w3c.github.io/FileAPI/#dfn-abort + */ + abort() { + if (this[kState] === "empty" || this[kState] === "done") { + this[kResult] = null; + return; + } + if (this[kState] === "loading") { + this[kState] = "done"; + this[kResult] = null; + } + this[kAborted] = true; + fireAProgressEvent("abort", this); + if (this[kState] !== "loading") { + fireAProgressEvent("loadend", this); + } + } + /** + * @see https://w3c.github.io/FileAPI/#dom-filereader-readystate + */ + get readyState() { + webidl.brandCheck(this, _FileReader); + switch (this[kState]) { + case "empty": + return this.EMPTY; + case "loading": + return this.LOADING; + case "done": + return this.DONE; + } + } + /** + * @see https://w3c.github.io/FileAPI/#dom-filereader-result + */ + get result() { + webidl.brandCheck(this, _FileReader); + return this[kResult]; + } + /** + * @see https://w3c.github.io/FileAPI/#dom-filereader-error + */ + get error() { + webidl.brandCheck(this, _FileReader); + return this[kError]; + } + get onloadend() { + webidl.brandCheck(this, _FileReader); + return this[kEvents].loadend; + } + set onloadend(fn) { + webidl.brandCheck(this, _FileReader); + if (this[kEvents].loadend) { + this.removeEventListener("loadend", this[kEvents].loadend); + } + if (typeof fn === "function") { + this[kEvents].loadend = fn; + this.addEventListener("loadend", fn); + } else { + this[kEvents].loadend = null; + } + } + get onerror() { + webidl.brandCheck(this, _FileReader); + return this[kEvents].error; + } + set onerror(fn) { + webidl.brandCheck(this, _FileReader); + if (this[kEvents].error) { + this.removeEventListener("error", this[kEvents].error); + } + if (typeof fn === "function") { + this[kEvents].error = fn; + this.addEventListener("error", fn); + } else { + this[kEvents].error = null; + } + } + get onloadstart() { + webidl.brandCheck(this, _FileReader); + return this[kEvents].loadstart; + } + set onloadstart(fn) { + webidl.brandCheck(this, _FileReader); + if (this[kEvents].loadstart) { + this.removeEventListener("loadstart", this[kEvents].loadstart); + } + if (typeof fn === "function") { + this[kEvents].loadstart = fn; + this.addEventListener("loadstart", fn); + } else { + this[kEvents].loadstart = null; + } + } + get onprogress() { + webidl.brandCheck(this, _FileReader); + return this[kEvents].progress; + } + set onprogress(fn) { + webidl.brandCheck(this, _FileReader); + if (this[kEvents].progress) { + this.removeEventListener("progress", this[kEvents].progress); + } + if (typeof fn === "function") { + this[kEvents].progress = fn; + this.addEventListener("progress", fn); + } else { + this[kEvents].progress = null; + } + } + get onload() { + webidl.brandCheck(this, _FileReader); + return this[kEvents].load; + } + set onload(fn) { + webidl.brandCheck(this, _FileReader); + if (this[kEvents].load) { + this.removeEventListener("load", this[kEvents].load); + } + if (typeof fn === "function") { + this[kEvents].load = fn; + this.addEventListener("load", fn); + } else { + this[kEvents].load = null; + } + } + get onabort() { + webidl.brandCheck(this, _FileReader); + return this[kEvents].abort; + } + set onabort(fn) { + webidl.brandCheck(this, _FileReader); + if (this[kEvents].abort) { + this.removeEventListener("abort", this[kEvents].abort); + } + if (typeof fn === "function") { + this[kEvents].abort = fn; + this.addEventListener("abort", fn); + } else { + this[kEvents].abort = null; + } + } + }; + FileReader.EMPTY = FileReader.prototype.EMPTY = 0; + FileReader.LOADING = FileReader.prototype.LOADING = 1; + FileReader.DONE = FileReader.prototype.DONE = 2; + Object.defineProperties(FileReader.prototype, { + EMPTY: staticPropertyDescriptors, + LOADING: staticPropertyDescriptors, + DONE: staticPropertyDescriptors, + readAsArrayBuffer: kEnumerableProperty, + readAsBinaryString: kEnumerableProperty, + readAsText: kEnumerableProperty, + readAsDataURL: kEnumerableProperty, + abort: kEnumerableProperty, + readyState: kEnumerableProperty, + result: kEnumerableProperty, + error: kEnumerableProperty, + onloadstart: kEnumerableProperty, + onprogress: kEnumerableProperty, + onload: kEnumerableProperty, + onabort: kEnumerableProperty, + onerror: kEnumerableProperty, + onloadend: kEnumerableProperty, + [Symbol.toStringTag]: { + value: "FileReader", + writable: false, + enumerable: false, + configurable: true + } + }); + Object.defineProperties(FileReader, { + EMPTY: staticPropertyDescriptors, + LOADING: staticPropertyDescriptors, + DONE: staticPropertyDescriptors + }); + module2.exports = { + FileReader + }; + } +}); + +// node_modules/undici/lib/cache/symbols.js +var require_symbols4 = __commonJS({ + "node_modules/undici/lib/cache/symbols.js"(exports2, module2) { + "use strict"; + module2.exports = { + kConstruct: Symbol("constructable") + }; + } +}); + +// node_modules/undici/lib/cache/util.js +var require_util8 = __commonJS({ + "node_modules/undici/lib/cache/util.js"(exports2, module2) { + "use strict"; + var assert = require("assert"); + var { URLSerializer } = require_dataURL(); + var { isValidHeaderName } = require_util5(); + function urlEquals(A2, B2, excludeFragment = false) { + const serializedA = URLSerializer(A2, excludeFragment); + const serializedB = URLSerializer(B2, excludeFragment); + return serializedA === serializedB; + } + function fieldValues(header) { + assert(header !== null); + const values = []; + for (let value of header.split(",")) { + value = value.trim(); + if (!value.length) { + continue; + } else if (!isValidHeaderName(value)) { + continue; + } + values.push(value); + } + return values; + } + module2.exports = { + urlEquals, + fieldValues + }; + } +}); + +// node_modules/undici/lib/cache/cache.js +var require_cache = __commonJS({ + "node_modules/undici/lib/cache/cache.js"(exports2, module2) { + "use strict"; + var { kConstruct } = require_symbols4(); + var { urlEquals, fieldValues: getFieldValues } = require_util8(); + var { kEnumerableProperty, isDisturbed } = require_util4(); + var { kHeadersList } = require_symbols(); + var { webidl } = require_webidl(); + var { Response, cloneResponse } = require_response(); + var { Request } = require_request2(); + var { kState, kHeaders, kGuard, kRealm } = require_symbols2(); + var { fetching } = require_fetch2(); + var { urlIsHttpHttpsScheme, createDeferredPromise, readAllBytes } = require_util5(); + var assert = require("assert"); + var { getGlobalDispatcher } = require_global2(); + var Cache = class _Cache { + /** + * @see https://w3c.github.io/ServiceWorker/#dfn-relevant-request-response-list + * @type {requestResponseList} + */ + #relevantRequestResponseList; + constructor() { + if (arguments[0] !== kConstruct) { + webidl.illegalConstructor(); + } + this.#relevantRequestResponseList = arguments[1]; + } + async match(request, options2 = {}) { + webidl.brandCheck(this, _Cache); + webidl.argumentLengthCheck(arguments, 1, { header: "Cache.match" }); + request = webidl.converters.RequestInfo(request); + options2 = webidl.converters.CacheQueryOptions(options2); + const p = await this.matchAll(request, options2); + if (p.length === 0) { + return; + } + return p[0]; + } + async matchAll(request = void 0, options2 = {}) { + webidl.brandCheck(this, _Cache); + if (request !== void 0) + request = webidl.converters.RequestInfo(request); + options2 = webidl.converters.CacheQueryOptions(options2); + let r = null; + if (request !== void 0) { + if (request instanceof Request) { + r = request[kState]; + if (r.method !== "GET" && !options2.ignoreMethod) { + return []; + } + } else if (typeof request === "string") { + r = new Request(request)[kState]; + } + } + const responses = []; + if (request === void 0) { + for (const requestResponse of this.#relevantRequestResponseList) { + responses.push(requestResponse[1]); + } + } else { + const requestResponses = this.#queryCache(r, options2); + for (const requestResponse of requestResponses) { + responses.push(requestResponse[1]); + } + } + const responseList = []; + for (const response of responses) { + const responseObject = new Response(response.body?.source ?? null); + const body = responseObject[kState].body; + responseObject[kState] = response; + responseObject[kState].body = body; + responseObject[kHeaders][kHeadersList] = response.headersList; + responseObject[kHeaders][kGuard] = "immutable"; + responseList.push(responseObject); + } + return Object.freeze(responseList); + } + async add(request) { + webidl.brandCheck(this, _Cache); + webidl.argumentLengthCheck(arguments, 1, { header: "Cache.add" }); + request = webidl.converters.RequestInfo(request); + const requests = [request]; + const responseArrayPromise = this.addAll(requests); + return await responseArrayPromise; + } + async addAll(requests) { + webidl.brandCheck(this, _Cache); + webidl.argumentLengthCheck(arguments, 1, { header: "Cache.addAll" }); + requests = webidl.converters["sequence"](requests); + const responsePromises = []; + const requestList = []; + for (const request of requests) { + if (typeof request === "string") { + continue; + } + const r = request[kState]; + if (!urlIsHttpHttpsScheme(r.url) || r.method !== "GET") { + throw webidl.errors.exception({ + header: "Cache.addAll", + message: "Expected http/s scheme when method is not GET." + }); + } + } + const fetchControllers = []; + for (const request of requests) { + const r = new Request(request)[kState]; + if (!urlIsHttpHttpsScheme(r.url)) { + throw webidl.errors.exception({ + header: "Cache.addAll", + message: "Expected http/s scheme." + }); + } + r.initiator = "fetch"; + r.destination = "subresource"; + requestList.push(r); + const responsePromise = createDeferredPromise(); + fetchControllers.push(fetching({ + request: r, + dispatcher: getGlobalDispatcher(), + processResponse(response) { + if (response.type === "error" || response.status === 206 || response.status < 200 || response.status > 299) { + responsePromise.reject(webidl.errors.exception({ + header: "Cache.addAll", + message: "Received an invalid status code or the request failed." + })); + } else if (response.headersList.contains("vary")) { + const fieldValues = getFieldValues(response.headersList.get("vary")); + for (const fieldValue of fieldValues) { + if (fieldValue === "*") { + responsePromise.reject(webidl.errors.exception({ + header: "Cache.addAll", + message: "invalid vary field value" + })); + for (const controller of fetchControllers) { + controller.abort(); + } + return; + } + } + } + }, + processResponseEndOfBody(response) { + if (response.aborted) { + responsePromise.reject(new DOMException("aborted", "AbortError")); + return; + } + responsePromise.resolve(response); + } + })); + responsePromises.push(responsePromise.promise); + } + const p = Promise.all(responsePromises); + const responses = await p; + const operations = []; + let index = 0; + for (const response of responses) { + const operation = { + type: "put", + // 7.3.2 + request: requestList[index], + // 7.3.3 + response + // 7.3.4 + }; + operations.push(operation); + index++; + } + const cacheJobPromise = createDeferredPromise(); + let errorData = null; + try { + this.#batchCacheOperations(operations); + } catch (e) { + errorData = e; + } + queueMicrotask(() => { + if (errorData === null) { + cacheJobPromise.resolve(void 0); + } else { + cacheJobPromise.reject(errorData); + } + }); + return cacheJobPromise.promise; + } + async put(request, response) { + webidl.brandCheck(this, _Cache); + webidl.argumentLengthCheck(arguments, 2, { header: "Cache.put" }); + request = webidl.converters.RequestInfo(request); + response = webidl.converters.Response(response); + let innerRequest = null; + if (request instanceof Request) { + innerRequest = request[kState]; + } else { + innerRequest = new Request(request)[kState]; + } + if (!urlIsHttpHttpsScheme(innerRequest.url) || innerRequest.method !== "GET") { + throw webidl.errors.exception({ + header: "Cache.put", + message: "Expected an http/s scheme when method is not GET" + }); + } + const innerResponse = response[kState]; + if (innerResponse.status === 206) { + throw webidl.errors.exception({ + header: "Cache.put", + message: "Got 206 status" + }); + } + if (innerResponse.headersList.contains("vary")) { + const fieldValues = getFieldValues(innerResponse.headersList.get("vary")); + for (const fieldValue of fieldValues) { + if (fieldValue === "*") { + throw webidl.errors.exception({ + header: "Cache.put", + message: "Got * vary field value" + }); + } + } + } + if (innerResponse.body && (isDisturbed(innerResponse.body.stream) || innerResponse.body.stream.locked)) { + throw webidl.errors.exception({ + header: "Cache.put", + message: "Response body is locked or disturbed" + }); + } + const clonedResponse = cloneResponse(innerResponse); + const bodyReadPromise = createDeferredPromise(); + if (innerResponse.body != null) { + const stream = innerResponse.body.stream; + const reader = stream.getReader(); + readAllBytes( + reader, + (bytes2) => bodyReadPromise.resolve(bytes2), + (error2) => bodyReadPromise.reject(error2) + ); + } else { + bodyReadPromise.resolve(void 0); + } + const operations = []; + const operation = { + type: "put", + // 14. + request: innerRequest, + // 15. + response: clonedResponse + // 16. + }; + operations.push(operation); + const bytes = await bodyReadPromise.promise; + if (clonedResponse.body != null) { + clonedResponse.body.source = bytes; + } + const cacheJobPromise = createDeferredPromise(); + let errorData = null; + try { + this.#batchCacheOperations(operations); + } catch (e) { + errorData = e; + } + queueMicrotask(() => { + if (errorData === null) { + cacheJobPromise.resolve(); + } else { + cacheJobPromise.reject(errorData); + } + }); + return cacheJobPromise.promise; + } + async delete(request, options2 = {}) { + webidl.brandCheck(this, _Cache); + webidl.argumentLengthCheck(arguments, 1, { header: "Cache.delete" }); + request = webidl.converters.RequestInfo(request); + options2 = webidl.converters.CacheQueryOptions(options2); + let r = null; + if (request instanceof Request) { + r = request[kState]; + if (r.method !== "GET" && !options2.ignoreMethod) { + return false; + } + } else { + assert(typeof request === "string"); + r = new Request(request)[kState]; + } + const operations = []; + const operation = { + type: "delete", + request: r, + options: options2 + }; + operations.push(operation); + const cacheJobPromise = createDeferredPromise(); + let errorData = null; + let requestResponses; + try { + requestResponses = this.#batchCacheOperations(operations); + } catch (e) { + errorData = e; + } + queueMicrotask(() => { + if (errorData === null) { + cacheJobPromise.resolve(!!requestResponses?.length); + } else { + cacheJobPromise.reject(errorData); + } + }); + return cacheJobPromise.promise; + } + /** + * @see https://w3c.github.io/ServiceWorker/#dom-cache-keys + * @param {any} request + * @param {import('../../types/cache').CacheQueryOptions} options + * @returns {readonly Request[]} + */ + async keys(request = void 0, options2 = {}) { + webidl.brandCheck(this, _Cache); + if (request !== void 0) + request = webidl.converters.RequestInfo(request); + options2 = webidl.converters.CacheQueryOptions(options2); + let r = null; + if (request !== void 0) { + if (request instanceof Request) { + r = request[kState]; + if (r.method !== "GET" && !options2.ignoreMethod) { + return []; + } + } else if (typeof request === "string") { + r = new Request(request)[kState]; + } + } + const promise = createDeferredPromise(); + const requests = []; + if (request === void 0) { + for (const requestResponse of this.#relevantRequestResponseList) { + requests.push(requestResponse[0]); + } + } else { + const requestResponses = this.#queryCache(r, options2); + for (const requestResponse of requestResponses) { + requests.push(requestResponse[0]); + } + } + queueMicrotask(() => { + const requestList = []; + for (const request2 of requests) { + const requestObject = new Request("https://a"); + requestObject[kState] = request2; + requestObject[kHeaders][kHeadersList] = request2.headersList; + requestObject[kHeaders][kGuard] = "immutable"; + requestObject[kRealm] = request2.client; + requestList.push(requestObject); + } + promise.resolve(Object.freeze(requestList)); + }); + return promise.promise; + } + /** + * @see https://w3c.github.io/ServiceWorker/#batch-cache-operations-algorithm + * @param {CacheBatchOperation[]} operations + * @returns {requestResponseList} + */ + #batchCacheOperations(operations) { + const cache = this.#relevantRequestResponseList; + const backupCache = [...cache]; + const addedItems = []; + const resultList = []; + try { + for (const operation of operations) { + if (operation.type !== "delete" && operation.type !== "put") { + throw webidl.errors.exception({ + header: "Cache.#batchCacheOperations", + message: 'operation type does not match "delete" or "put"' + }); + } + if (operation.type === "delete" && operation.response != null) { + throw webidl.errors.exception({ + header: "Cache.#batchCacheOperations", + message: "delete operation should not have an associated response" + }); + } + if (this.#queryCache(operation.request, operation.options, addedItems).length) { + throw new DOMException("???", "InvalidStateError"); + } + let requestResponses; + if (operation.type === "delete") { + requestResponses = this.#queryCache(operation.request, operation.options); + if (requestResponses.length === 0) { + return []; + } + for (const requestResponse of requestResponses) { + const idx = cache.indexOf(requestResponse); + assert(idx !== -1); + cache.splice(idx, 1); + } + } else if (operation.type === "put") { + if (operation.response == null) { + throw webidl.errors.exception({ + header: "Cache.#batchCacheOperations", + message: "put operation should have an associated response" + }); + } + const r = operation.request; + if (!urlIsHttpHttpsScheme(r.url)) { + throw webidl.errors.exception({ + header: "Cache.#batchCacheOperations", + message: "expected http or https scheme" + }); + } + if (r.method !== "GET") { + throw webidl.errors.exception({ + header: "Cache.#batchCacheOperations", + message: "not get method" + }); + } + if (operation.options != null) { + throw webidl.errors.exception({ + header: "Cache.#batchCacheOperations", + message: "options must not be defined" + }); + } + requestResponses = this.#queryCache(operation.request); + for (const requestResponse of requestResponses) { + const idx = cache.indexOf(requestResponse); + assert(idx !== -1); + cache.splice(idx, 1); + } + cache.push([operation.request, operation.response]); + addedItems.push([operation.request, operation.response]); + } + resultList.push([operation.request, operation.response]); + } + return resultList; + } catch (e) { + this.#relevantRequestResponseList.length = 0; + this.#relevantRequestResponseList = backupCache; + throw e; + } + } + /** + * @see https://w3c.github.io/ServiceWorker/#query-cache + * @param {any} requestQuery + * @param {import('../../types/cache').CacheQueryOptions} options + * @param {requestResponseList} targetStorage + * @returns {requestResponseList} + */ + #queryCache(requestQuery, options2, targetStorage) { + const resultList = []; + const storage = targetStorage ?? this.#relevantRequestResponseList; + for (const requestResponse of storage) { + const [cachedRequest, cachedResponse] = requestResponse; + if (this.#requestMatchesCachedItem(requestQuery, cachedRequest, cachedResponse, options2)) { + resultList.push(requestResponse); + } + } + return resultList; + } + /** + * @see https://w3c.github.io/ServiceWorker/#request-matches-cached-item-algorithm + * @param {any} requestQuery + * @param {any} request + * @param {any | null} response + * @param {import('../../types/cache').CacheQueryOptions | undefined} options + * @returns {boolean} + */ + #requestMatchesCachedItem(requestQuery, request, response = null, options2) { + const queryURL = new URL(requestQuery.url); + const cachedURL = new URL(request.url); + if (options2?.ignoreSearch) { + cachedURL.search = ""; + queryURL.search = ""; + } + if (!urlEquals(queryURL, cachedURL, true)) { + return false; + } + if (response == null || options2?.ignoreVary || !response.headersList.contains("vary")) { + return true; + } + const fieldValues = getFieldValues(response.headersList.get("vary")); + for (const fieldValue of fieldValues) { + if (fieldValue === "*") { + return false; + } + const requestValue = request.headersList.get(fieldValue); + const queryValue = requestQuery.headersList.get(fieldValue); + if (requestValue !== queryValue) { + return false; + } + } + return true; + } + }; + Object.defineProperties(Cache.prototype, { + [Symbol.toStringTag]: { + value: "Cache", + configurable: true + }, + match: kEnumerableProperty, + matchAll: kEnumerableProperty, + add: kEnumerableProperty, + addAll: kEnumerableProperty, + put: kEnumerableProperty, + delete: kEnumerableProperty, + keys: kEnumerableProperty + }); + var cacheQueryOptionConverters = [ + { + key: "ignoreSearch", + converter: webidl.converters.boolean, + defaultValue: false + }, + { + key: "ignoreMethod", + converter: webidl.converters.boolean, + defaultValue: false + }, + { + key: "ignoreVary", + converter: webidl.converters.boolean, + defaultValue: false + } + ]; + webidl.converters.CacheQueryOptions = webidl.dictionaryConverter(cacheQueryOptionConverters); + webidl.converters.MultiCacheQueryOptions = webidl.dictionaryConverter([ + ...cacheQueryOptionConverters, + { + key: "cacheName", + converter: webidl.converters.DOMString + } + ]); + webidl.converters.Response = webidl.interfaceConverter(Response); + webidl.converters["sequence"] = webidl.sequenceConverter( + webidl.converters.RequestInfo + ); + module2.exports = { + Cache + }; + } +}); + +// node_modules/undici/lib/cache/cachestorage.js +var require_cachestorage = __commonJS({ + "node_modules/undici/lib/cache/cachestorage.js"(exports2, module2) { + "use strict"; + var { kConstruct } = require_symbols4(); + var { Cache } = require_cache(); + var { webidl } = require_webidl(); + var { kEnumerableProperty } = require_util4(); + var CacheStorage = class _CacheStorage { + /** + * @see https://w3c.github.io/ServiceWorker/#dfn-relevant-name-to-cache-map + * @type {Map} + */ + async has(cacheName) { + webidl.brandCheck(this, _CacheStorage); + webidl.argumentLengthCheck(arguments, 1, { header: "CacheStorage.has" }); + cacheName = webidl.converters.DOMString(cacheName); + return this.#caches.has(cacheName); + } + /** + * @see https://w3c.github.io/ServiceWorker/#dom-cachestorage-open + * @param {string} cacheName + * @returns {Promise} + */ + async open(cacheName) { + webidl.brandCheck(this, _CacheStorage); + webidl.argumentLengthCheck(arguments, 1, { header: "CacheStorage.open" }); + cacheName = webidl.converters.DOMString(cacheName); + if (this.#caches.has(cacheName)) { + const cache2 = this.#caches.get(cacheName); + return new Cache(kConstruct, cache2); + } + const cache = []; + this.#caches.set(cacheName, cache); + return new Cache(kConstruct, cache); + } + /** + * @see https://w3c.github.io/ServiceWorker/#cache-storage-delete + * @param {string} cacheName + * @returns {Promise} + */ + async delete(cacheName) { + webidl.brandCheck(this, _CacheStorage); + webidl.argumentLengthCheck(arguments, 1, { header: "CacheStorage.delete" }); + cacheName = webidl.converters.DOMString(cacheName); + return this.#caches.delete(cacheName); + } + /** + * @see https://w3c.github.io/ServiceWorker/#cache-storage-keys + * @returns {string[]} + */ + async keys() { + webidl.brandCheck(this, _CacheStorage); + const keys = this.#caches.keys(); + return [...keys]; + } + }; + Object.defineProperties(CacheStorage.prototype, { + [Symbol.toStringTag]: { + value: "CacheStorage", + configurable: true + }, + match: kEnumerableProperty, + has: kEnumerableProperty, + open: kEnumerableProperty, + delete: kEnumerableProperty, + keys: kEnumerableProperty + }); + module2.exports = { + CacheStorage + }; + } +}); + +// node_modules/undici/lib/cookies/constants.js +var require_constants4 = __commonJS({ + "node_modules/undici/lib/cookies/constants.js"(exports2, module2) { + "use strict"; + var maxAttributeValueSize = 1024; + var maxNameValuePairSize = 4096; + module2.exports = { + maxAttributeValueSize, + maxNameValuePairSize + }; + } +}); + +// node_modules/undici/lib/cookies/util.js +var require_util9 = __commonJS({ + "node_modules/undici/lib/cookies/util.js"(exports2, module2) { + "use strict"; + var assert = require("assert"); + var { kHeadersList } = require_symbols(); + function isCTLExcludingHtab(value) { + if (value.length === 0) { + return false; + } + for (const char of value) { + const code = char.charCodeAt(0); + if (code >= 0 || code <= 8 || (code >= 10 || code <= 31) || code === 127) { + return false; + } + } + } + function validateCookieName(name) { + for (const char of name) { + const code = char.charCodeAt(0); + if (code <= 32 || code > 127 || char === "(" || char === ")" || char === ">" || char === "<" || char === "@" || char === "," || char === ";" || char === ":" || char === "\\" || char === '"' || char === "/" || char === "[" || char === "]" || char === "?" || char === "=" || char === "{" || char === "}") { + throw new Error("Invalid cookie name"); + } + } + } + function validateCookieValue(value) { + for (const char of value) { + const code = char.charCodeAt(0); + if (code < 33 || // exclude CTLs (0-31) + code === 34 || code === 44 || code === 59 || code === 92 || code > 126) { + throw new Error("Invalid header value"); + } + } + } + function validateCookiePath(path) { + for (const char of path) { + const code = char.charCodeAt(0); + if (code < 33 || char === ";") { + throw new Error("Invalid cookie path"); + } + } + } + function validateCookieDomain(domain) { + if (domain.startsWith("-") || domain.endsWith(".") || domain.endsWith("-")) { + throw new Error("Invalid cookie domain"); + } + } + function toIMFDate(date) { + if (typeof date === "number") { + date = new Date(date); + } + const days = [ + "Sun", + "Mon", + "Tue", + "Wed", + "Thu", + "Fri", + "Sat" + ]; + const months = [ + "Jan", + "Feb", + "Mar", + "Apr", + "May", + "Jun", + "Jul", + "Aug", + "Sep", + "Oct", + "Nov", + "Dec" + ]; + const dayName = days[date.getUTCDay()]; + const day = date.getUTCDate().toString().padStart(2, "0"); + const month = months[date.getUTCMonth()]; + const year = date.getUTCFullYear(); + const hour = date.getUTCHours().toString().padStart(2, "0"); + const minute = date.getUTCMinutes().toString().padStart(2, "0"); + const second = date.getUTCSeconds().toString().padStart(2, "0"); + return `${dayName}, ${day} ${month} ${year} ${hour}:${minute}:${second} GMT`; + } + function validateCookieMaxAge(maxAge) { + if (maxAge < 0) { + throw new Error("Invalid cookie max-age"); + } + } + function stringify(cookie) { + if (cookie.name.length === 0) { + return null; + } + validateCookieName(cookie.name); + validateCookieValue(cookie.value); + const out = [`${cookie.name}=${cookie.value}`]; + if (cookie.name.startsWith("__Secure-")) { + cookie.secure = true; + } + if (cookie.name.startsWith("__Host-")) { + cookie.secure = true; + cookie.domain = null; + cookie.path = "/"; + } + if (cookie.secure) { + out.push("Secure"); + } + if (cookie.httpOnly) { + out.push("HttpOnly"); + } + if (typeof cookie.maxAge === "number") { + validateCookieMaxAge(cookie.maxAge); + out.push(`Max-Age=${cookie.maxAge}`); + } + if (cookie.domain) { + validateCookieDomain(cookie.domain); + out.push(`Domain=${cookie.domain}`); + } + if (cookie.path) { + validateCookiePath(cookie.path); + out.push(`Path=${cookie.path}`); + } + if (cookie.expires && cookie.expires.toString() !== "Invalid Date") { + out.push(`Expires=${toIMFDate(cookie.expires)}`); + } + if (cookie.sameSite) { + out.push(`SameSite=${cookie.sameSite}`); + } + for (const part of cookie.unparsed) { + if (!part.includes("=")) { + throw new Error("Invalid unparsed"); + } + const [key, ...value] = part.split("="); + out.push(`${key.trim()}=${value.join("=")}`); + } + return out.join("; "); + } + var kHeadersListNode; + function getHeadersList(headers) { + if (headers[kHeadersList]) { + return headers[kHeadersList]; + } + if (!kHeadersListNode) { + kHeadersListNode = Object.getOwnPropertySymbols(headers).find( + (symbol) => symbol.description === "headers list" + ); + assert(kHeadersListNode, "Headers cannot be parsed"); + } + const headersList = headers[kHeadersListNode]; + assert(headersList); + return headersList; + } + module2.exports = { + isCTLExcludingHtab, + stringify, + getHeadersList + }; + } +}); + +// node_modules/undici/lib/cookies/parse.js +var require_parse3 = __commonJS({ + "node_modules/undici/lib/cookies/parse.js"(exports2, module2) { + "use strict"; + var { maxNameValuePairSize, maxAttributeValueSize } = require_constants4(); + var { isCTLExcludingHtab } = require_util9(); + var { collectASequenceOfCodePointsFast } = require_dataURL(); + var assert = require("assert"); + function parseSetCookie(header) { + if (isCTLExcludingHtab(header)) { + return null; + } + let nameValuePair = ""; + let unparsedAttributes = ""; + let name = ""; + let value = ""; + if (header.includes(";")) { + const position = { position: 0 }; + nameValuePair = collectASequenceOfCodePointsFast(";", header, position); + unparsedAttributes = header.slice(position.position); + } else { + nameValuePair = header; + } + if (!nameValuePair.includes("=")) { + value = nameValuePair; + } else { + const position = { position: 0 }; + name = collectASequenceOfCodePointsFast( + "=", + nameValuePair, + position + ); + value = nameValuePair.slice(position.position + 1); + } + name = name.trim(); + value = value.trim(); + if (name.length + value.length > maxNameValuePairSize) { + return null; + } + return { + name, + value, + ...parseUnparsedAttributes(unparsedAttributes) + }; + } + function parseUnparsedAttributes(unparsedAttributes, cookieAttributeList = {}) { + if (unparsedAttributes.length === 0) { + return cookieAttributeList; + } + assert(unparsedAttributes[0] === ";"); + unparsedAttributes = unparsedAttributes.slice(1); + let cookieAv = ""; + if (unparsedAttributes.includes(";")) { + cookieAv = collectASequenceOfCodePointsFast( + ";", + unparsedAttributes, + { position: 0 } + ); + unparsedAttributes = unparsedAttributes.slice(cookieAv.length); + } else { + cookieAv = unparsedAttributes; + unparsedAttributes = ""; + } + let attributeName = ""; + let attributeValue = ""; + if (cookieAv.includes("=")) { + const position = { position: 0 }; + attributeName = collectASequenceOfCodePointsFast( + "=", + cookieAv, + position + ); + attributeValue = cookieAv.slice(position.position + 1); + } else { + attributeName = cookieAv; + } + attributeName = attributeName.trim(); + attributeValue = attributeValue.trim(); + if (attributeValue.length > maxAttributeValueSize) { + return parseUnparsedAttributes(unparsedAttributes, cookieAttributeList); + } + const attributeNameLowercase = attributeName.toLowerCase(); + if (attributeNameLowercase === "expires") { + const expiryTime = new Date(attributeValue); + cookieAttributeList.expires = expiryTime; + } else if (attributeNameLowercase === "max-age") { + const charCode = attributeValue.charCodeAt(0); + if ((charCode < 48 || charCode > 57) && attributeValue[0] !== "-") { + return parseUnparsedAttributes(unparsedAttributes, cookieAttributeList); + } + if (!/^\d+$/.test(attributeValue)) { + return parseUnparsedAttributes(unparsedAttributes, cookieAttributeList); + } + const deltaSeconds = Number(attributeValue); + cookieAttributeList.maxAge = deltaSeconds; + } else if (attributeNameLowercase === "domain") { + let cookieDomain = attributeValue; + if (cookieDomain[0] === ".") { + cookieDomain = cookieDomain.slice(1); + } + cookieDomain = cookieDomain.toLowerCase(); + cookieAttributeList.domain = cookieDomain; + } else if (attributeNameLowercase === "path") { + let cookiePath = ""; + if (attributeValue.length === 0 || attributeValue[0] !== "/") { + cookiePath = "/"; + } else { + cookiePath = attributeValue; + } + cookieAttributeList.path = cookiePath; + } else if (attributeNameLowercase === "secure") { + cookieAttributeList.secure = true; + } else if (attributeNameLowercase === "httponly") { + cookieAttributeList.httpOnly = true; + } else if (attributeNameLowercase === "samesite") { + let enforcement = "Default"; + const attributeValueLowercase = attributeValue.toLowerCase(); + if (attributeValueLowercase.includes("none")) { + enforcement = "None"; + } + if (attributeValueLowercase.includes("strict")) { + enforcement = "Strict"; + } + if (attributeValueLowercase.includes("lax")) { + enforcement = "Lax"; + } + cookieAttributeList.sameSite = enforcement; + } else { + cookieAttributeList.unparsed ??= []; + cookieAttributeList.unparsed.push(`${attributeName}=${attributeValue}`); + } + return parseUnparsedAttributes(unparsedAttributes, cookieAttributeList); + } + module2.exports = { + parseSetCookie, + parseUnparsedAttributes + }; + } +}); + +// node_modules/undici/lib/cookies/index.js +var require_cookies = __commonJS({ + "node_modules/undici/lib/cookies/index.js"(exports2, module2) { + "use strict"; + var { parseSetCookie } = require_parse3(); + var { stringify, getHeadersList } = require_util9(); + var { webidl } = require_webidl(); + var { Headers } = require_headers(); + function getCookies(headers) { + webidl.argumentLengthCheck(arguments, 1, { header: "getCookies" }); + webidl.brandCheck(headers, Headers, { strict: false }); + const cookie = headers.get("cookie"); + const out = {}; + if (!cookie) { + return out; + } + for (const piece of cookie.split(";")) { + const [name, ...value] = piece.split("="); + out[name.trim()] = value.join("="); + } + return out; + } + function deleteCookie(headers, name, attributes) { + webidl.argumentLengthCheck(arguments, 2, { header: "deleteCookie" }); + webidl.brandCheck(headers, Headers, { strict: false }); + name = webidl.converters.DOMString(name); + attributes = webidl.converters.DeleteCookieAttributes(attributes); + setCookie(headers, { + name, + value: "", + expires: /* @__PURE__ */ new Date(0), + ...attributes + }); + } + function getSetCookies(headers) { + webidl.argumentLengthCheck(arguments, 1, { header: "getSetCookies" }); + webidl.brandCheck(headers, Headers, { strict: false }); + const cookies = getHeadersList(headers).cookies; + if (!cookies) { + return []; + } + return cookies.map((pair) => parseSetCookie(Array.isArray(pair) ? pair[1] : pair)); + } + function setCookie(headers, cookie) { + webidl.argumentLengthCheck(arguments, 2, { header: "setCookie" }); + webidl.brandCheck(headers, Headers, { strict: false }); + cookie = webidl.converters.Cookie(cookie); + const str = stringify(cookie); + if (str) { + headers.append("Set-Cookie", stringify(cookie)); + } + } + webidl.converters.DeleteCookieAttributes = webidl.dictionaryConverter([ + { + converter: webidl.nullableConverter(webidl.converters.DOMString), + key: "path", + defaultValue: null + }, + { + converter: webidl.nullableConverter(webidl.converters.DOMString), + key: "domain", + defaultValue: null + } + ]); + webidl.converters.Cookie = webidl.dictionaryConverter([ + { + converter: webidl.converters.DOMString, + key: "name" + }, + { + converter: webidl.converters.DOMString, + key: "value" + }, + { + converter: webidl.nullableConverter((value) => { + if (typeof value === "number") { + return webidl.converters["unsigned long long"](value); + } + return new Date(value); + }), + key: "expires", + defaultValue: null + }, + { + converter: webidl.nullableConverter(webidl.converters["long long"]), + key: "maxAge", + defaultValue: null + }, + { + converter: webidl.nullableConverter(webidl.converters.DOMString), + key: "domain", + defaultValue: null + }, + { + converter: webidl.nullableConverter(webidl.converters.DOMString), + key: "path", + defaultValue: null + }, + { + converter: webidl.nullableConverter(webidl.converters.boolean), + key: "secure", + defaultValue: null + }, + { + converter: webidl.nullableConverter(webidl.converters.boolean), + key: "httpOnly", + defaultValue: null + }, + { + converter: webidl.converters.USVString, + key: "sameSite", + allowedValues: ["Strict", "Lax", "None"] + }, + { + converter: webidl.sequenceConverter(webidl.converters.DOMString), + key: "unparsed", + defaultValue: [] + } + ]); + module2.exports = { + getCookies, + deleteCookie, + getSetCookies, + setCookie + }; + } +}); + +// node_modules/undici/lib/websocket/constants.js +var require_constants5 = __commonJS({ + "node_modules/undici/lib/websocket/constants.js"(exports2, module2) { + "use strict"; + var uid = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11"; + var staticPropertyDescriptors = { + enumerable: true, + writable: false, + configurable: false + }; + var states = { + CONNECTING: 0, + OPEN: 1, + CLOSING: 2, + CLOSED: 3 + }; + var opcodes = { + CONTINUATION: 0, + TEXT: 1, + BINARY: 2, + CLOSE: 8, + PING: 9, + PONG: 10 + }; + var maxUnsigned16Bit = 2 ** 16 - 1; + var parserStates = { + INFO: 0, + PAYLOADLENGTH_16: 2, + PAYLOADLENGTH_64: 3, + READ_DATA: 4 + }; + var emptyBuffer = Buffer.allocUnsafe(0); + module2.exports = { + uid, + staticPropertyDescriptors, + states, + opcodes, + maxUnsigned16Bit, + parserStates, + emptyBuffer + }; + } +}); + +// node_modules/undici/lib/websocket/symbols.js +var require_symbols5 = __commonJS({ + "node_modules/undici/lib/websocket/symbols.js"(exports2, module2) { + "use strict"; + module2.exports = { + kWebSocketURL: Symbol("url"), + kReadyState: Symbol("ready state"), + kController: Symbol("controller"), + kResponse: Symbol("response"), + kBinaryType: Symbol("binary type"), + kSentClose: Symbol("sent close"), + kReceivedClose: Symbol("received close"), + kByteParser: Symbol("byte parser") + }; + } +}); + +// node_modules/undici/lib/websocket/events.js +var require_events = __commonJS({ + "node_modules/undici/lib/websocket/events.js"(exports2, module2) { + "use strict"; + var { webidl } = require_webidl(); + var { kEnumerableProperty } = require_util4(); + var { MessagePort } = require("worker_threads"); + var MessageEvent = class _MessageEvent extends Event { + #eventInit; + constructor(type, eventInitDict = {}) { + webidl.argumentLengthCheck(arguments, 1, { header: "MessageEvent constructor" }); + type = webidl.converters.DOMString(type); + eventInitDict = webidl.converters.MessageEventInit(eventInitDict); + super(type, eventInitDict); + this.#eventInit = eventInitDict; + } + get data() { + webidl.brandCheck(this, _MessageEvent); + return this.#eventInit.data; + } + get origin() { + webidl.brandCheck(this, _MessageEvent); + return this.#eventInit.origin; + } + get lastEventId() { + webidl.brandCheck(this, _MessageEvent); + return this.#eventInit.lastEventId; + } + get source() { + webidl.brandCheck(this, _MessageEvent); + return this.#eventInit.source; + } + get ports() { + webidl.brandCheck(this, _MessageEvent); + if (!Object.isFrozen(this.#eventInit.ports)) { + Object.freeze(this.#eventInit.ports); + } + return this.#eventInit.ports; + } + initMessageEvent(type, bubbles = false, cancelable = false, data = null, origin = "", lastEventId = "", source = null, ports = []) { + webidl.brandCheck(this, _MessageEvent); + webidl.argumentLengthCheck(arguments, 1, { header: "MessageEvent.initMessageEvent" }); + return new _MessageEvent(type, { + bubbles, + cancelable, + data, + origin, + lastEventId, + source, + ports + }); + } + }; + var CloseEvent = class _CloseEvent extends Event { + #eventInit; + constructor(type, eventInitDict = {}) { + webidl.argumentLengthCheck(arguments, 1, { header: "CloseEvent constructor" }); + type = webidl.converters.DOMString(type); + eventInitDict = webidl.converters.CloseEventInit(eventInitDict); + super(type, eventInitDict); + this.#eventInit = eventInitDict; + } + get wasClean() { + webidl.brandCheck(this, _CloseEvent); + return this.#eventInit.wasClean; + } + get code() { + webidl.brandCheck(this, _CloseEvent); + return this.#eventInit.code; + } + get reason() { + webidl.brandCheck(this, _CloseEvent); + return this.#eventInit.reason; + } + }; + var ErrorEvent = class _ErrorEvent extends Event { + #eventInit; + constructor(type, eventInitDict) { + webidl.argumentLengthCheck(arguments, 1, { header: "ErrorEvent constructor" }); + super(type, eventInitDict); + type = webidl.converters.DOMString(type); + eventInitDict = webidl.converters.ErrorEventInit(eventInitDict ?? {}); + this.#eventInit = eventInitDict; + } + get message() { + webidl.brandCheck(this, _ErrorEvent); + return this.#eventInit.message; + } + get filename() { + webidl.brandCheck(this, _ErrorEvent); + return this.#eventInit.filename; + } + get lineno() { + webidl.brandCheck(this, _ErrorEvent); + return this.#eventInit.lineno; + } + get colno() { + webidl.brandCheck(this, _ErrorEvent); + return this.#eventInit.colno; + } + get error() { + webidl.brandCheck(this, _ErrorEvent); + return this.#eventInit.error; + } + }; + Object.defineProperties(MessageEvent.prototype, { + [Symbol.toStringTag]: { + value: "MessageEvent", + configurable: true + }, + data: kEnumerableProperty, + origin: kEnumerableProperty, + lastEventId: kEnumerableProperty, + source: kEnumerableProperty, + ports: kEnumerableProperty, + initMessageEvent: kEnumerableProperty + }); + Object.defineProperties(CloseEvent.prototype, { + [Symbol.toStringTag]: { + value: "CloseEvent", + configurable: true + }, + reason: kEnumerableProperty, + code: kEnumerableProperty, + wasClean: kEnumerableProperty + }); + Object.defineProperties(ErrorEvent.prototype, { + [Symbol.toStringTag]: { + value: "ErrorEvent", + configurable: true + }, + message: kEnumerableProperty, + filename: kEnumerableProperty, + lineno: kEnumerableProperty, + colno: kEnumerableProperty, + error: kEnumerableProperty + }); + webidl.converters.MessagePort = webidl.interfaceConverter(MessagePort); + webidl.converters["sequence"] = webidl.sequenceConverter( + webidl.converters.MessagePort + ); + var eventInit = [ + { + key: "bubbles", + converter: webidl.converters.boolean, + defaultValue: false + }, + { + key: "cancelable", + converter: webidl.converters.boolean, + defaultValue: false + }, + { + key: "composed", + converter: webidl.converters.boolean, + defaultValue: false + } + ]; + webidl.converters.MessageEventInit = webidl.dictionaryConverter([ + ...eventInit, + { + key: "data", + converter: webidl.converters.any, + defaultValue: null + }, + { + key: "origin", + converter: webidl.converters.USVString, + defaultValue: "" + }, + { + key: "lastEventId", + converter: webidl.converters.DOMString, + defaultValue: "" + }, + { + key: "source", + // Node doesn't implement WindowProxy or ServiceWorker, so the only + // valid value for source is a MessagePort. + converter: webidl.nullableConverter(webidl.converters.MessagePort), + defaultValue: null + }, + { + key: "ports", + converter: webidl.converters["sequence"], + get defaultValue() { + return []; + } + } + ]); + webidl.converters.CloseEventInit = webidl.dictionaryConverter([ + ...eventInit, + { + key: "wasClean", + converter: webidl.converters.boolean, + defaultValue: false + }, + { + key: "code", + converter: webidl.converters["unsigned short"], + defaultValue: 0 + }, + { + key: "reason", + converter: webidl.converters.USVString, + defaultValue: "" + } + ]); + webidl.converters.ErrorEventInit = webidl.dictionaryConverter([ + ...eventInit, + { + key: "message", + converter: webidl.converters.DOMString, + defaultValue: "" + }, + { + key: "filename", + converter: webidl.converters.USVString, + defaultValue: "" + }, + { + key: "lineno", + converter: webidl.converters["unsigned long"], + defaultValue: 0 + }, + { + key: "colno", + converter: webidl.converters["unsigned long"], + defaultValue: 0 + }, + { + key: "error", + converter: webidl.converters.any + } + ]); + module2.exports = { + MessageEvent, + CloseEvent, + ErrorEvent + }; + } +}); + +// node_modules/undici/lib/websocket/util.js +var require_util10 = __commonJS({ + "node_modules/undici/lib/websocket/util.js"(exports2, module2) { + "use strict"; + var { kReadyState, kController, kResponse, kBinaryType, kWebSocketURL } = require_symbols5(); + var { states, opcodes } = require_constants5(); + var { MessageEvent, ErrorEvent } = require_events(); + function isEstablished(ws2) { + return ws2[kReadyState] === states.OPEN; + } + function isClosing(ws2) { + return ws2[kReadyState] === states.CLOSING; + } + function isClosed(ws2) { + return ws2[kReadyState] === states.CLOSED; + } + function fireEvent(e, target, eventConstructor = Event, eventInitDict) { + const event = new eventConstructor(e, eventInitDict); + target.dispatchEvent(event); + } + function websocketMessageReceived(ws2, type, data) { + if (ws2[kReadyState] !== states.OPEN) { + return; + } + let dataForEvent; + if (type === opcodes.TEXT) { + try { + dataForEvent = new TextDecoder("utf-8", { fatal: true }).decode(data); + } catch { + failWebsocketConnection(ws2, "Received invalid UTF-8 in text frame."); + return; + } + } else if (type === opcodes.BINARY) { + if (ws2[kBinaryType] === "blob") { + dataForEvent = new Blob([data]); + } else { + dataForEvent = new Uint8Array(data).buffer; + } + } + fireEvent("message", ws2, MessageEvent, { + origin: ws2[kWebSocketURL].origin, + data: dataForEvent + }); + } + function isValidSubprotocol(protocol) { + if (protocol.length === 0) { + return false; + } + for (const char of protocol) { + const code = char.charCodeAt(0); + if (code < 33 || code > 126 || char === "(" || char === ")" || char === "<" || char === ">" || char === "@" || char === "," || char === ";" || char === ":" || char === "\\" || char === '"' || char === "/" || char === "[" || char === "]" || char === "?" || char === "=" || char === "{" || char === "}" || code === 32 || // SP + code === 9) { + return false; + } + } + return true; + } + function isValidStatusCode(code) { + if (code >= 1e3 && code < 1015) { + return code !== 1004 && // reserved + code !== 1005 && // "MUST NOT be set as a status code" + code !== 1006; + } + return code >= 3e3 && code <= 4999; + } + function failWebsocketConnection(ws2, reason) { + const { [kController]: controller, [kResponse]: response } = ws2; + controller.abort(); + if (response?.socket && !response.socket.destroyed) { + response.socket.destroy(); + } + if (reason) { + fireEvent("error", ws2, ErrorEvent, { + error: new Error(reason) + }); + } + } + module2.exports = { + isEstablished, + isClosing, + isClosed, + fireEvent, + isValidSubprotocol, + isValidStatusCode, + failWebsocketConnection, + websocketMessageReceived + }; + } +}); + +// node_modules/undici/lib/websocket/connection.js +var require_connection2 = __commonJS({ + "node_modules/undici/lib/websocket/connection.js"(exports2, module2) { + "use strict"; + var { randomBytes, createHash } = require("crypto"); + var diagnosticsChannel = require("diagnostics_channel"); + var { uid, states } = require_constants5(); + var { + kReadyState, + kSentClose, + kByteParser, + kReceivedClose + } = require_symbols5(); + var { fireEvent, failWebsocketConnection } = require_util10(); + var { CloseEvent } = require_events(); + var { makeRequest } = require_request2(); + var { fetching } = require_fetch2(); + var { Headers } = require_headers(); + var { getGlobalDispatcher } = require_global2(); + var { kHeadersList } = require_symbols(); + var channels = {}; + channels.open = diagnosticsChannel.channel("undici:websocket:open"); + channels.close = diagnosticsChannel.channel("undici:websocket:close"); + channels.socketError = diagnosticsChannel.channel("undici:websocket:socket_error"); + function establishWebSocketConnection(url, protocols, ws2, onEstablish, options2) { + const requestURL = url; + requestURL.protocol = url.protocol === "ws:" ? "http:" : "https:"; + const request = makeRequest({ + urlList: [requestURL], + serviceWorkers: "none", + referrer: "no-referrer", + mode: "websocket", + credentials: "include", + cache: "no-store", + redirect: "error" + }); + if (options2.headers) { + const headersList = new Headers(options2.headers)[kHeadersList]; + request.headersList = headersList; + } + const keyValue = randomBytes(16).toString("base64"); + request.headersList.append("sec-websocket-key", keyValue); + request.headersList.append("sec-websocket-version", "13"); + for (const protocol of protocols) { + request.headersList.append("sec-websocket-protocol", protocol); + } + const permessageDeflate = ""; + const controller = fetching({ + request, + useParallelQueue: true, + dispatcher: options2.dispatcher ?? getGlobalDispatcher(), + processResponse(response) { + if (response.type === "error" || response.status !== 101) { + failWebsocketConnection(ws2, "Received network error or non-101 status code."); + return; + } + if (protocols.length !== 0 && !response.headersList.get("Sec-WebSocket-Protocol")) { + failWebsocketConnection(ws2, "Server did not respond with sent protocols."); + return; + } + if (response.headersList.get("Upgrade")?.toLowerCase() !== "websocket") { + failWebsocketConnection(ws2, 'Server did not set Upgrade header to "websocket".'); + return; + } + if (response.headersList.get("Connection")?.toLowerCase() !== "upgrade") { + failWebsocketConnection(ws2, 'Server did not set Connection header to "upgrade".'); + return; + } + const secWSAccept = response.headersList.get("Sec-WebSocket-Accept"); + const digest = createHash("sha1").update(keyValue + uid).digest("base64"); + if (secWSAccept !== digest) { + failWebsocketConnection(ws2, "Incorrect hash received in Sec-WebSocket-Accept header."); + return; + } + const secExtension = response.headersList.get("Sec-WebSocket-Extensions"); + if (secExtension !== null && secExtension !== permessageDeflate) { + failWebsocketConnection(ws2, "Received different permessage-deflate than the one set."); + return; + } + const secProtocol = response.headersList.get("Sec-WebSocket-Protocol"); + if (secProtocol !== null && secProtocol !== request.headersList.get("Sec-WebSocket-Protocol")) { + failWebsocketConnection(ws2, "Protocol was not set in the opening handshake."); + return; + } + response.socket.on("data", onSocketData); + response.socket.on("close", onSocketClose); + response.socket.on("error", onSocketError); + if (channels.open.hasSubscribers) { + channels.open.publish({ + address: response.socket.address(), + protocol: secProtocol, + extensions: secExtension + }); + } + onEstablish(response); + } + }); + return controller; + } + function onSocketData(chunk) { + if (!this.ws[kByteParser].write(chunk)) { + this.pause(); + } + } + function onSocketClose() { + const { ws: ws2 } = this; + const wasClean = ws2[kSentClose] && ws2[kReceivedClose]; + let code = 1005; + let reason = ""; + const result = ws2[kByteParser].closingInfo; + if (result) { + code = result.code ?? 1005; + reason = result.reason; + } else if (!ws2[kSentClose]) { + code = 1006; + } + ws2[kReadyState] = states.CLOSED; + fireEvent("close", ws2, CloseEvent, { + wasClean, + code, + reason + }); + if (channels.close.hasSubscribers) { + channels.close.publish({ + websocket: ws2, + code, + reason + }); + } + } + function onSocketError(error2) { + const { ws: ws2 } = this; + ws2[kReadyState] = states.CLOSING; + if (channels.socketError.hasSubscribers) { + channels.socketError.publish(error2); + } + this.destroy(); + } + module2.exports = { + establishWebSocketConnection + }; + } +}); + +// node_modules/undici/lib/websocket/frame.js +var require_frame2 = __commonJS({ + "node_modules/undici/lib/websocket/frame.js"(exports2, module2) { + "use strict"; + var { randomBytes } = require("crypto"); + var { maxUnsigned16Bit } = require_constants5(); + var WebsocketFrameSend = class { + /** + * @param {Buffer|undefined} data + */ + constructor(data) { + this.frameData = data; + this.maskKey = randomBytes(4); + } + createFrame(opcode) { + const bodyLength = this.frameData?.byteLength ?? 0; + let payloadLength = bodyLength; + let offset = 6; + if (bodyLength > maxUnsigned16Bit) { + offset += 8; + payloadLength = 127; + } else if (bodyLength > 125) { + offset += 2; + payloadLength = 126; + } + const buffer = Buffer.allocUnsafe(bodyLength + offset); + buffer[0] = buffer[1] = 0; + buffer[0] |= 128; + buffer[0] = (buffer[0] & 240) + opcode; + buffer[offset - 4] = this.maskKey[0]; + buffer[offset - 3] = this.maskKey[1]; + buffer[offset - 2] = this.maskKey[2]; + buffer[offset - 1] = this.maskKey[3]; + buffer[1] = payloadLength; + if (payloadLength === 126) { + buffer.writeUInt16BE(bodyLength, 2); + } else if (payloadLength === 127) { + buffer[2] = buffer[3] = 0; + buffer.writeUIntBE(bodyLength, 4, 6); + } + buffer[1] |= 128; + for (let i = 0; i < bodyLength; i++) { + buffer[offset + i] = this.frameData[i] ^ this.maskKey[i % 4]; + } + return buffer; + } + }; + module2.exports = { + WebsocketFrameSend + }; + } +}); + +// node_modules/undici/lib/websocket/receiver.js +var require_receiver = __commonJS({ + "node_modules/undici/lib/websocket/receiver.js"(exports2, module2) { + "use strict"; + var { Writable } = require("stream"); + var diagnosticsChannel = require("diagnostics_channel"); + var { parserStates, opcodes, states, emptyBuffer } = require_constants5(); + var { kReadyState, kSentClose, kResponse, kReceivedClose } = require_symbols5(); + var { isValidStatusCode, failWebsocketConnection, websocketMessageReceived } = require_util10(); + var { WebsocketFrameSend } = require_frame2(); + var channels = {}; + channels.ping = diagnosticsChannel.channel("undici:websocket:ping"); + channels.pong = diagnosticsChannel.channel("undici:websocket:pong"); + var ByteParser = class extends Writable { + #buffers = []; + #byteOffset = 0; + #state = parserStates.INFO; + #info = {}; + #fragments = []; + constructor(ws2) { + super(); + this.ws = ws2; + } + /** + * @param {Buffer} chunk + * @param {() => void} callback + */ + _write(chunk, _2, callback) { + this.#buffers.push(chunk); + this.#byteOffset += chunk.length; + this.run(callback); + } + /** + * Runs whenever a new chunk is received. + * Callback is called whenever there are no more chunks buffering, + * or not enough bytes are buffered to parse. + */ + run(callback) { + while (true) { + if (this.#state === parserStates.INFO) { + if (this.#byteOffset < 2) { + return callback(); + } + const buffer = this.consume(2); + this.#info.fin = (buffer[0] & 128) !== 0; + this.#info.opcode = buffer[0] & 15; + this.#info.originalOpcode ??= this.#info.opcode; + this.#info.fragmented = !this.#info.fin && this.#info.opcode !== opcodes.CONTINUATION; + if (this.#info.fragmented && this.#info.opcode !== opcodes.BINARY && this.#info.opcode !== opcodes.TEXT) { + failWebsocketConnection(this.ws, "Invalid frame type was fragmented."); + return; + } + const payloadLength = buffer[1] & 127; + if (payloadLength <= 125) { + this.#info.payloadLength = payloadLength; + this.#state = parserStates.READ_DATA; + } else if (payloadLength === 126) { + this.#state = parserStates.PAYLOADLENGTH_16; + } else if (payloadLength === 127) { + this.#state = parserStates.PAYLOADLENGTH_64; + } + if (this.#info.fragmented && payloadLength > 125) { + failWebsocketConnection(this.ws, "Fragmented frame exceeded 125 bytes."); + return; + } else if ((this.#info.opcode === opcodes.PING || this.#info.opcode === opcodes.PONG || this.#info.opcode === opcodes.CLOSE) && payloadLength > 125) { + failWebsocketConnection(this.ws, "Payload length for control frame exceeded 125 bytes."); + return; + } else if (this.#info.opcode === opcodes.CLOSE) { + if (payloadLength === 1) { + failWebsocketConnection(this.ws, "Received close frame with a 1-byte body."); + return; + } + const body = this.consume(payloadLength); + this.#info.closeInfo = this.parseCloseBody(false, body); + if (!this.ws[kSentClose]) { + const body2 = Buffer.allocUnsafe(2); + body2.writeUInt16BE(this.#info.closeInfo.code, 0); + const closeFrame = new WebsocketFrameSend(body2); + this.ws[kResponse].socket.write( + closeFrame.createFrame(opcodes.CLOSE), + (err) => { + if (!err) { + this.ws[kSentClose] = true; + } + } + ); + } + this.ws[kReadyState] = states.CLOSING; + this.ws[kReceivedClose] = true; + this.end(); + return; + } else if (this.#info.opcode === opcodes.PING) { + const body = this.consume(payloadLength); + if (!this.ws[kReceivedClose]) { + const frame = new WebsocketFrameSend(body); + this.ws[kResponse].socket.write(frame.createFrame(opcodes.PONG)); + if (channels.ping.hasSubscribers) { + channels.ping.publish({ + payload: body + }); + } + } + this.#state = parserStates.INFO; + if (this.#byteOffset > 0) { + continue; + } else { + callback(); + return; + } + } else if (this.#info.opcode === opcodes.PONG) { + const body = this.consume(payloadLength); + if (channels.pong.hasSubscribers) { + channels.pong.publish({ + payload: body + }); + } + if (this.#byteOffset > 0) { + continue; + } else { + callback(); + return; + } + } + } else if (this.#state === parserStates.PAYLOADLENGTH_16) { + if (this.#byteOffset < 2) { + return callback(); + } + const buffer = this.consume(2); + this.#info.payloadLength = buffer.readUInt16BE(0); + this.#state = parserStates.READ_DATA; + } else if (this.#state === parserStates.PAYLOADLENGTH_64) { + if (this.#byteOffset < 8) { + return callback(); + } + const buffer = this.consume(8); + const upper = buffer.readUInt32BE(0); + if (upper > 2 ** 31 - 1) { + failWebsocketConnection(this.ws, "Received payload length > 2^31 bytes."); + return; + } + const lower = buffer.readUInt32BE(4); + this.#info.payloadLength = (upper << 8) + lower; + this.#state = parserStates.READ_DATA; + } else if (this.#state === parserStates.READ_DATA) { + if (this.#byteOffset < this.#info.payloadLength) { + return callback(); + } else if (this.#byteOffset >= this.#info.payloadLength) { + const body = this.consume(this.#info.payloadLength); + this.#fragments.push(body); + if (!this.#info.fragmented || this.#info.fin && this.#info.opcode === opcodes.CONTINUATION) { + const fullMessage = Buffer.concat(this.#fragments); + websocketMessageReceived(this.ws, this.#info.originalOpcode, fullMessage); + this.#info = {}; + this.#fragments.length = 0; + } + this.#state = parserStates.INFO; + } + } + if (this.#byteOffset > 0) { + continue; + } else { + callback(); + break; + } + } + } + /** + * Take n bytes from the buffered Buffers + * @param {number} n + * @returns {Buffer|null} + */ + consume(n) { + if (n > this.#byteOffset) { + return null; + } else if (n === 0) { + return emptyBuffer; + } + if (this.#buffers[0].length === n) { + this.#byteOffset -= this.#buffers[0].length; + return this.#buffers.shift(); + } + const buffer = Buffer.allocUnsafe(n); + let offset = 0; + while (offset !== n) { + const next = this.#buffers[0]; + const { length } = next; + if (length + offset === n) { + buffer.set(this.#buffers.shift(), offset); + break; + } else if (length + offset > n) { + buffer.set(next.subarray(0, n - offset), offset); + this.#buffers[0] = next.subarray(n - offset); + break; + } else { + buffer.set(this.#buffers.shift(), offset); + offset += next.length; + } + } + this.#byteOffset -= n; + return buffer; + } + parseCloseBody(onlyCode, data) { + let code; + if (data.length >= 2) { + code = data.readUInt16BE(0); + } + if (onlyCode) { + if (!isValidStatusCode(code)) { + return null; + } + return { code }; + } + let reason = data.subarray(2); + if (reason[0] === 239 && reason[1] === 187 && reason[2] === 191) { + reason = reason.subarray(3); + } + if (code !== void 0 && !isValidStatusCode(code)) { + return null; + } + try { + reason = new TextDecoder("utf-8", { fatal: true }).decode(reason); + } catch { + return null; + } + return { code, reason }; + } + get closingInfo() { + return this.#info.closeInfo; + } + }; + module2.exports = { + ByteParser + }; + } +}); + +// node_modules/undici/lib/websocket/websocket.js +var require_websocket = __commonJS({ + "node_modules/undici/lib/websocket/websocket.js"(exports2, module2) { + "use strict"; + var { webidl } = require_webidl(); + var { DOMException: DOMException2 } = require_constants2(); + var { URLSerializer } = require_dataURL(); + var { staticPropertyDescriptors, states, opcodes, emptyBuffer } = require_constants5(); + var { + kWebSocketURL, + kReadyState, + kController, + kBinaryType, + kResponse, + kSentClose, + kByteParser + } = require_symbols5(); + var { isEstablished, isClosing, isValidSubprotocol, failWebsocketConnection, fireEvent } = require_util10(); + var { establishWebSocketConnection } = require_connection2(); + var { WebsocketFrameSend } = require_frame2(); + var { ByteParser } = require_receiver(); + var { kEnumerableProperty, isBlobLike } = require_util4(); + var { getGlobalDispatcher } = require_global2(); + var { types } = require("util"); + var experimentalWarned = false; + var WebSocket = class _WebSocket extends EventTarget { + #events = { + open: null, + error: null, + close: null, + message: null + }; + #bufferedAmount = 0; + #protocol = ""; + #extensions = ""; + /** + * @param {string} url + * @param {string|string[]} protocols + */ + constructor(url, protocols = []) { + super(); + webidl.argumentLengthCheck(arguments, 1, { header: "WebSocket constructor" }); + if (!experimentalWarned) { + experimentalWarned = true; + process.emitWarning("WebSockets are experimental, expect them to change at any time.", { + code: "UNDICI-WS" + }); + } + const options2 = webidl.converters["DOMString or sequence or WebSocketInit"](protocols); + url = webidl.converters.USVString(url); + protocols = options2.protocols; + let urlRecord; + try { + urlRecord = new URL(url); + } catch (e) { + throw new DOMException2(e, "SyntaxError"); + } + if (urlRecord.protocol !== "ws:" && urlRecord.protocol !== "wss:") { + throw new DOMException2( + `Expected a ws: or wss: protocol, got ${urlRecord.protocol}`, + "SyntaxError" + ); + } + if (urlRecord.hash) { + throw new DOMException2("Got fragment", "SyntaxError"); + } + if (typeof protocols === "string") { + protocols = [protocols]; + } + if (protocols.length !== new Set(protocols.map((p) => p.toLowerCase())).size) { + throw new DOMException2("Invalid Sec-WebSocket-Protocol value", "SyntaxError"); + } + if (protocols.length > 0 && !protocols.every((p) => isValidSubprotocol(p))) { + throw new DOMException2("Invalid Sec-WebSocket-Protocol value", "SyntaxError"); + } + this[kWebSocketURL] = urlRecord; + this[kController] = establishWebSocketConnection( + urlRecord, + protocols, + this, + (response) => this.#onConnectionEstablished(response), + options2 + ); + this[kReadyState] = _WebSocket.CONNECTING; + this[kBinaryType] = "blob"; + } + /** + * @see https://websockets.spec.whatwg.org/#dom-websocket-close + * @param {number|undefined} code + * @param {string|undefined} reason + */ + close(code = void 0, reason = void 0) { + webidl.brandCheck(this, _WebSocket); + if (code !== void 0) { + code = webidl.converters["unsigned short"](code, { clamp: true }); + } + if (reason !== void 0) { + reason = webidl.converters.USVString(reason); + } + if (code !== void 0) { + if (code !== 1e3 && (code < 3e3 || code > 4999)) { + throw new DOMException2("invalid code", "InvalidAccessError"); + } + } + let reasonByteLength = 0; + if (reason !== void 0) { + reasonByteLength = Buffer.byteLength(reason); + if (reasonByteLength > 123) { + throw new DOMException2( + `Reason must be less than 123 bytes; received ${reasonByteLength}`, + "SyntaxError" + ); + } + } + if (this[kReadyState] === _WebSocket.CLOSING || this[kReadyState] === _WebSocket.CLOSED) { + } else if (!isEstablished(this)) { + failWebsocketConnection(this, "Connection was closed before it was established."); + this[kReadyState] = _WebSocket.CLOSING; + } else if (!isClosing(this)) { + const frame = new WebsocketFrameSend(); + if (code !== void 0 && reason === void 0) { + frame.frameData = Buffer.allocUnsafe(2); + frame.frameData.writeUInt16BE(code, 0); + } else if (code !== void 0 && reason !== void 0) { + frame.frameData = Buffer.allocUnsafe(2 + reasonByteLength); + frame.frameData.writeUInt16BE(code, 0); + frame.frameData.write(reason, 2, "utf-8"); + } else { + frame.frameData = emptyBuffer; + } + const socket = this[kResponse].socket; + socket.write(frame.createFrame(opcodes.CLOSE), (err) => { + if (!err) { + this[kSentClose] = true; + } + }); + this[kReadyState] = states.CLOSING; + } else { + this[kReadyState] = _WebSocket.CLOSING; + } + } + /** + * @see https://websockets.spec.whatwg.org/#dom-websocket-send + * @param {NodeJS.TypedArray|ArrayBuffer|Blob|string} data + */ + send(data) { + webidl.brandCheck(this, _WebSocket); + webidl.argumentLengthCheck(arguments, 1, { header: "WebSocket.send" }); + data = webidl.converters.WebSocketSendData(data); + if (this[kReadyState] === _WebSocket.CONNECTING) { + throw new DOMException2("Sent before connected.", "InvalidStateError"); + } + if (!isEstablished(this) || isClosing(this)) { + return; + } + const socket = this[kResponse].socket; + if (typeof data === "string") { + const value = Buffer.from(data); + const frame = new WebsocketFrameSend(value); + const buffer = frame.createFrame(opcodes.TEXT); + this.#bufferedAmount += value.byteLength; + socket.write(buffer, () => { + this.#bufferedAmount -= value.byteLength; + }); + } else if (types.isArrayBuffer(data)) { + const value = Buffer.from(data); + const frame = new WebsocketFrameSend(value); + const buffer = frame.createFrame(opcodes.BINARY); + this.#bufferedAmount += value.byteLength; + socket.write(buffer, () => { + this.#bufferedAmount -= value.byteLength; + }); + } else if (ArrayBuffer.isView(data)) { + const ab = Buffer.from(data, data.byteOffset, data.byteLength); + const frame = new WebsocketFrameSend(ab); + const buffer = frame.createFrame(opcodes.BINARY); + this.#bufferedAmount += ab.byteLength; + socket.write(buffer, () => { + this.#bufferedAmount -= ab.byteLength; + }); + } else if (isBlobLike(data)) { + const frame = new WebsocketFrameSend(); + data.arrayBuffer().then((ab) => { + const value = Buffer.from(ab); + frame.frameData = value; + const buffer = frame.createFrame(opcodes.BINARY); + this.#bufferedAmount += value.byteLength; + socket.write(buffer, () => { + this.#bufferedAmount -= value.byteLength; + }); + }); + } + } + get readyState() { + webidl.brandCheck(this, _WebSocket); + return this[kReadyState]; + } + get bufferedAmount() { + webidl.brandCheck(this, _WebSocket); + return this.#bufferedAmount; + } + get url() { + webidl.brandCheck(this, _WebSocket); + return URLSerializer(this[kWebSocketURL]); + } + get extensions() { + webidl.brandCheck(this, _WebSocket); + return this.#extensions; + } + get protocol() { + webidl.brandCheck(this, _WebSocket); + return this.#protocol; + } + get onopen() { + webidl.brandCheck(this, _WebSocket); + return this.#events.open; + } + set onopen(fn) { + webidl.brandCheck(this, _WebSocket); + if (this.#events.open) { + this.removeEventListener("open", this.#events.open); + } + if (typeof fn === "function") { + this.#events.open = fn; + this.addEventListener("open", fn); + } else { + this.#events.open = null; + } + } + get onerror() { + webidl.brandCheck(this, _WebSocket); + return this.#events.error; + } + set onerror(fn) { + webidl.brandCheck(this, _WebSocket); + if (this.#events.error) { + this.removeEventListener("error", this.#events.error); + } + if (typeof fn === "function") { + this.#events.error = fn; + this.addEventListener("error", fn); + } else { + this.#events.error = null; + } + } + get onclose() { + webidl.brandCheck(this, _WebSocket); + return this.#events.close; + } + set onclose(fn) { + webidl.brandCheck(this, _WebSocket); + if (this.#events.close) { + this.removeEventListener("close", this.#events.close); + } + if (typeof fn === "function") { + this.#events.close = fn; + this.addEventListener("close", fn); + } else { + this.#events.close = null; + } + } + get onmessage() { + webidl.brandCheck(this, _WebSocket); + return this.#events.message; + } + set onmessage(fn) { + webidl.brandCheck(this, _WebSocket); + if (this.#events.message) { + this.removeEventListener("message", this.#events.message); + } + if (typeof fn === "function") { + this.#events.message = fn; + this.addEventListener("message", fn); + } else { + this.#events.message = null; + } + } + get binaryType() { + webidl.brandCheck(this, _WebSocket); + return this[kBinaryType]; + } + set binaryType(type) { + webidl.brandCheck(this, _WebSocket); + if (type !== "blob" && type !== "arraybuffer") { + this[kBinaryType] = "blob"; + } else { + this[kBinaryType] = type; + } + } + /** + * @see https://websockets.spec.whatwg.org/#feedback-from-the-protocol + */ + #onConnectionEstablished(response) { + this[kResponse] = response; + const parser = new ByteParser(this); + parser.on("drain", function onParserDrain() { + this.ws[kResponse].socket.resume(); + }); + response.socket.ws = this; + this[kByteParser] = parser; + this[kReadyState] = states.OPEN; + const extensions = response.headersList.get("sec-websocket-extensions"); + if (extensions !== null) { + this.#extensions = extensions; + } + const protocol = response.headersList.get("sec-websocket-protocol"); + if (protocol !== null) { + this.#protocol = protocol; + } + fireEvent("open", this); + } + }; + WebSocket.CONNECTING = WebSocket.prototype.CONNECTING = states.CONNECTING; + WebSocket.OPEN = WebSocket.prototype.OPEN = states.OPEN; + WebSocket.CLOSING = WebSocket.prototype.CLOSING = states.CLOSING; + WebSocket.CLOSED = WebSocket.prototype.CLOSED = states.CLOSED; + Object.defineProperties(WebSocket.prototype, { + CONNECTING: staticPropertyDescriptors, + OPEN: staticPropertyDescriptors, + CLOSING: staticPropertyDescriptors, + CLOSED: staticPropertyDescriptors, + url: kEnumerableProperty, + readyState: kEnumerableProperty, + bufferedAmount: kEnumerableProperty, + onopen: kEnumerableProperty, + onerror: kEnumerableProperty, + onclose: kEnumerableProperty, + close: kEnumerableProperty, + onmessage: kEnumerableProperty, + binaryType: kEnumerableProperty, + send: kEnumerableProperty, + extensions: kEnumerableProperty, + protocol: kEnumerableProperty, + [Symbol.toStringTag]: { + value: "WebSocket", + writable: false, + enumerable: false, + configurable: true + } + }); + Object.defineProperties(WebSocket, { + CONNECTING: staticPropertyDescriptors, + OPEN: staticPropertyDescriptors, + CLOSING: staticPropertyDescriptors, + CLOSED: staticPropertyDescriptors + }); + webidl.converters["sequence"] = webidl.sequenceConverter( + webidl.converters.DOMString + ); + webidl.converters["DOMString or sequence"] = function(V) { + if (webidl.util.Type(V) === "Object" && Symbol.iterator in V) { + return webidl.converters["sequence"](V); + } + return webidl.converters.DOMString(V); + }; + webidl.converters.WebSocketInit = webidl.dictionaryConverter([ + { + key: "protocols", + converter: webidl.converters["DOMString or sequence"], + get defaultValue() { + return []; + } + }, + { + key: "dispatcher", + converter: (V) => V, + get defaultValue() { + return getGlobalDispatcher(); + } + }, + { + key: "headers", + converter: webidl.nullableConverter(webidl.converters.HeadersInit) + } + ]); + webidl.converters["DOMString or sequence or WebSocketInit"] = function(V) { + if (webidl.util.Type(V) === "Object" && !(Symbol.iterator in V)) { + return webidl.converters.WebSocketInit(V); + } + return { protocols: webidl.converters["DOMString or sequence"](V) }; + }; + webidl.converters.WebSocketSendData = function(V) { + if (webidl.util.Type(V) === "Object") { + if (isBlobLike(V)) { + return webidl.converters.Blob(V, { strict: false }); + } + if (ArrayBuffer.isView(V) || types.isAnyArrayBuffer(V)) { + return webidl.converters.BufferSource(V); + } + } + return webidl.converters.USVString(V); + }; + module2.exports = { + WebSocket + }; + } +}); + +// node_modules/undici/index.js +var require_undici = __commonJS({ + "node_modules/undici/index.js"(exports2, module2) { + "use strict"; + var Client = require_client4(); + var Dispatcher = require_dispatcher(); + var errors = require_errors(); + var Pool = require_pool2(); + var BalancedPool = require_balanced_pool(); + var Agent = require_agent(); + var util = require_util4(); + var { InvalidArgumentError } = errors; + var api = require_api2(); + var buildConnector = require_connect2(); + var MockClient = require_mock_client(); + var MockAgent = require_mock_agent(); + var MockPool = require_mock_pool(); + var mockErrors = require_mock_errors(); + var ProxyAgent = require_proxy_agent(); + var { getGlobalDispatcher, setGlobalDispatcher } = require_global2(); + var DecoratorHandler = require_DecoratorHandler(); + var RedirectHandler = require_RedirectHandler(); + var createRedirectInterceptor = require_redirectInterceptor(); + var hasCrypto; + try { + require("crypto"); + hasCrypto = true; + } catch { + hasCrypto = false; + } + Object.assign(Dispatcher.prototype, api); + module2.exports.Dispatcher = Dispatcher; + module2.exports.Client = Client; + module2.exports.Pool = Pool; + module2.exports.BalancedPool = BalancedPool; + module2.exports.Agent = Agent; + module2.exports.ProxyAgent = ProxyAgent; + module2.exports.DecoratorHandler = DecoratorHandler; + module2.exports.RedirectHandler = RedirectHandler; + module2.exports.createRedirectInterceptor = createRedirectInterceptor; + module2.exports.buildConnector = buildConnector; + module2.exports.errors = errors; + function makeDispatcher(fn) { + return (url, opts, handler2) => { + if (typeof opts === "function") { + handler2 = opts; + opts = null; + } + if (!url || typeof url !== "string" && typeof url !== "object" && !(url instanceof URL)) { + throw new InvalidArgumentError("invalid url"); + } + if (opts != null && typeof opts !== "object") { + throw new InvalidArgumentError("invalid opts"); + } + if (opts && opts.path != null) { + if (typeof opts.path !== "string") { + throw new InvalidArgumentError("invalid opts.path"); + } + let path = opts.path; + if (!opts.path.startsWith("/")) { + path = `/${path}`; + } + url = new URL(util.parseOrigin(url).origin + path); + } else { + if (!opts) { + opts = typeof url === "object" ? url : {}; + } + url = util.parseURL(url); + } + const { agent, dispatcher = getGlobalDispatcher() } = opts; + if (agent) { + throw new InvalidArgumentError("unsupported opts.agent. Did you mean opts.client?"); + } + return fn.call(dispatcher, { + ...opts, + origin: url.origin, + path: url.search ? `${url.pathname}${url.search}` : url.pathname, + method: opts.method || (opts.body ? "PUT" : "GET") + }, handler2); + }; + } + module2.exports.setGlobalDispatcher = setGlobalDispatcher; + module2.exports.getGlobalDispatcher = getGlobalDispatcher; + if (util.nodeMajor > 16 || util.nodeMajor === 16 && util.nodeMinor >= 8) { + let fetchImpl = null; + module2.exports.fetch = async function fetch(resource) { + if (!fetchImpl) { + fetchImpl = require_fetch2().fetch; + } + try { + return await fetchImpl(...arguments); + } catch (err) { + Error.captureStackTrace(err, this); + throw err; + } + }; + module2.exports.Headers = require_headers().Headers; + module2.exports.Response = require_response().Response; + module2.exports.Request = require_request2().Request; + module2.exports.FormData = require_formdata().FormData; + module2.exports.File = require_file().File; + module2.exports.FileReader = require_filereader().FileReader; + const { setGlobalOrigin, getGlobalOrigin } = require_global(); + module2.exports.setGlobalOrigin = setGlobalOrigin; + module2.exports.getGlobalOrigin = getGlobalOrigin; + const { CacheStorage } = require_cachestorage(); + const { kConstruct } = require_symbols4(); + module2.exports.caches = new CacheStorage(kConstruct); + } + if (util.nodeMajor >= 16) { + const { deleteCookie, getCookies, getSetCookies, setCookie } = require_cookies(); + module2.exports.deleteCookie = deleteCookie; + module2.exports.getCookies = getCookies; + module2.exports.getSetCookies = getSetCookies; + module2.exports.setCookie = setCookie; + const { parseMIMEType, serializeAMimeType } = require_dataURL(); + module2.exports.parseMIMEType = parseMIMEType; + module2.exports.serializeAMimeType = serializeAMimeType; + } + if (util.nodeMajor >= 18 && hasCrypto) { + const { WebSocket } = require_websocket(); + module2.exports.WebSocket = WebSocket; + } + module2.exports.request = makeDispatcher(api.request); + module2.exports.stream = makeDispatcher(api.stream); + module2.exports.pipeline = makeDispatcher(api.pipeline); + module2.exports.connect = makeDispatcher(api.connect); + module2.exports.upgrade = makeDispatcher(api.upgrade); + module2.exports.MockClient = MockClient; + module2.exports.MockPool = MockPool; + module2.exports.MockAgent = MockAgent; + module2.exports.mockErrors = mockErrors; + } +}); + +// node_modules/native-fetch/cjs/src/index-node.js +var require_index_node = __commonJS({ + "node_modules/native-fetch/cjs/src/index-node.js"(exports2) { + "use strict"; + Object.defineProperty(exports2, "__esModule", { value: true }); + var undici = require_undici(); + function _interopNamespace(e) { + if (e && e.__esModule) + return e; + var n = /* @__PURE__ */ Object.create(null); + if (e) { + Object.keys(e).forEach(function(k2) { + if (k2 !== "default") { + var d = Object.getOwnPropertyDescriptor(e, k2); + Object.defineProperty(n, k2, d.get ? d : { + enumerable: true, + get: function() { + return e[k2]; + } + }); + } + }); + } + n["default"] = e; + return Object.freeze(n); + } + var undici__namespace = /* @__PURE__ */ _interopNamespace(undici); + var fetch = globalThis.fetch ? globalThis.fetch : undici__namespace.fetch; + var Headers = globalThis.Headers ? globalThis.Headers : undici__namespace.Headers; + var Request = globalThis.Request ? globalThis.Request : undici__namespace.Request; + var Response = globalThis.Response ? globalThis.Response : undici__namespace.Response; + exports2.Headers = Headers; + exports2.Request = Request; + exports2.Response = Response; + exports2.fetch = fetch; + } +}); + +// node_modules/@plunk/node/dist/errors/PlunkError.js +var require_PlunkError = __commonJS({ + "node_modules/@plunk/node/dist/errors/PlunkError.js"(exports2) { + "use strict"; + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.PlunkError = void 0; + var PlunkError = class _PlunkError extends Error { + constructor(msg2) { + super(msg2); + Object.setPrototypeOf(this, _PlunkError.prototype); + } + }; + exports2.PlunkError = PlunkError; + } +}); + +// node_modules/@plunk/node/dist/errors/NotFound.js +var require_NotFound = __commonJS({ + "node_modules/@plunk/node/dist/errors/NotFound.js"(exports2) { + "use strict"; + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.NotFoundError = void 0; + var PlunkError_1 = require_PlunkError(); + var NotFoundError2 = class _NotFoundError extends PlunkError_1.PlunkError { + constructor(msg2 = "That resource could not be found") { + super(msg2); + Object.setPrototypeOf(this, _NotFoundError.prototype); + } + }; + exports2.NotFoundError = NotFoundError2; + } +}); + +// node_modules/@plunk/node/dist/errors/TokenError.js +var require_TokenError = __commonJS({ + "node_modules/@plunk/node/dist/errors/TokenError.js"(exports2) { + "use strict"; + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.TokenError = void 0; + var PlunkError_1 = require_PlunkError(); + var TokenError = class _TokenError extends PlunkError_1.PlunkError { + constructor(msg2 = "Invalid API Credentials Provided") { + super(msg2); + Object.setPrototypeOf(this, _TokenError.prototype); + } + }; + exports2.TokenError = TokenError; + } +}); + +// node_modules/@plunk/node/dist/lib/Plunk.js +var require_Plunk = __commonJS({ + "node_modules/@plunk/node/dist/lib/Plunk.js"(exports2) { + "use strict"; + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.Plunk = void 0; + var tslib_1 = (init_tslib_es6(), __toCommonJS(tslib_es6_exports)); + var native_fetch_1 = require_index_node(); + var NotFound_1 = require_NotFound(); + var TokenError_1 = require_TokenError(); + var Plunk2 = class { + constructor(key) { + this.events = { + /** + * Publishes an event to Plunk + * @param {string} event.event - The event you want to publish + * @param {string} event.email - The email associated with this event + * @param {Object=} event.data - The user data associated with this event + */ + track: (event) => tslib_1.__awaiter(this, void 0, void 0, function* () { + return yield this.fetch({ + method: "POST", + url: "track", + json: Object.assign({}, event) + }); + }) + }; + this.emails = { + /** + * Sends a transactional email with Plunk + * + * @param {string} body.to - The email you want to send to + * @param {string} body.subject - The subject of the email + * @param {string} body.body - The body of the email + * @param {string=} body.from - The email you want to send from + * @param {string=} body.name - The name you want to send as + * @param {string=html} body.type - The type of email you want to send + * @param {boolean=false} body.withUnsubscribe - Whether to include an unsubscribe link + */ + send: (body) => tslib_1.__awaiter(this, void 0, void 0, function* () { + return yield this.fetch({ + method: "POST", + url: "send", + json: Object.assign({}, body) + }); + }) + }; + this.key = key; + } + fetch(_a2) { + var _b; + var { json, url } = _a2, options2 = tslib_1.__rest(_a2, ["json", "url"]); + return tslib_1.__awaiter(this, void 0, void 0, function* () { + const res = yield (0, native_fetch_1.fetch)(new URL(url, "https://api.useplunk.com/v1/").toString(), Object.assign(Object.assign({}, options2), { headers: Object.assign(Object.assign({ Authorization: `Bearer ${this.key}` }, json && { "Content-Type": "application/json" }), options2.headers), body: json ? JSON.stringify(json) : void 0 })); + const text = yield res.text(); + const data = safeJsonParse(text); + if ((res === null || res === void 0 ? void 0 : res.status) === 401) { + throw new TokenError_1.TokenError(data === null || data === void 0 ? void 0 : data.message); + } + if ((res === null || res === void 0 ? void 0 : res.status) === 404) { + throw new NotFound_1.NotFoundError(data === null || data === void 0 ? void 0 : data.message); + } + if (!res.ok) { + throw new Error((_b = data === null || data === void 0 ? void 0 : data.message) !== null && _b !== void 0 ? _b : "Unknown API Error"); + } + return data; + }); + } + }; + exports2.Plunk = Plunk2; + function safeJsonParse(text) { + try { + return JSON.parse(text); + } catch (e) { + return text; + } + } + } +}); + +// node_modules/@plunk/node/dist/index.js +var require_dist = __commonJS({ + "node_modules/@plunk/node/dist/index.js"(exports2) { + "use strict"; + Object.defineProperty(exports2, "__esModule", { value: true }); + var Plunk_1 = require_Plunk(); + exports2.default = Plunk_1.Plunk; + } +}); + +// src/server.ts +var server_exports = {}; +__export(server_exports, { + default: () => server_default +}); +module.exports = __toCommonJS(server_exports); + +// node_modules/dotenv/config.js +(function() { + require_main().config( + Object.assign( + {}, + require_env_options(), + require_cli_options()(process.argv) + ) + ); +})(); + +// src/server.ts +var import_path = require("path"); +var import_proto_loader = __toESM(require_src2()); +var import_grpc_js3 = __toESM(require_src3()); + +// src/lib/log.ts +function getStackTrace() { + let stack; + try { + throw new Error(""); + } catch (error2) { + stack = error2.stack || ""; + } + stack = stack.split("\n").map((line) => line.trim()); + return stack.splice(stack[0] === "Error" ? 2 : 1); +} +var getInitiator = () => { + const [, , caller] = getStackTrace(); + const file = caller.split("/").at(-1) || ""; + return file.replace(")", ""); +}; +var warn = (...args) => { + console.group( + `\x1B[33m${(/* @__PURE__ */ new Date()).toISOString()} - WARN - ${getInitiator()}\x1B[0m` + ); + console.warn(...args); + console.groupEnd(); +}; +var error = (...args) => { + console.group( + `\x1B[31m${(/* @__PURE__ */ new Date()).toISOString()} - ERROR - ${getInitiator()}\x1B[0m` + ); + console.error(...args); + console.groupEnd(); +}; +var info = (...args) => { + console.group( + `\x1B[34m${(/* @__PURE__ */ new Date()).toISOString()} - INFO - ${getInitiator()}\x1B[0m` + ); + console.log(...args); + console.groupEnd(); +}; +var debug = (...args) => { + console.log(...args); +}; +var log = { + warn, + error, + info, + debug +}; +var utils = { + bold: (text) => `\x1B[1m${text}\x1B[0m`, + red: (text) => `\x1B[31m${text}\x1B[0m`, + green: (text) => `\x1B[32m${text}\x1B[0m`, + yellow: (text) => `\x1B[33m${text}\x1B[0m`, + blue: (text) => `\x1B[34m${text}\x1B[0m`, + magenta: (text) => `\x1B[35m${text}\x1B[0m`, + cyan: (text) => `\x1B[36m${text}\x1B[0m`, + white: (text) => `\x1B[37m${text}\x1B[0m`, + gray: (text) => `\x1B[90m${text}\x1B[0m` +}; + +// src/resources/protoloader-options.ts +var options = { + keepCase: true, + longs: String, + enums: String, + defaults: true, + oneofs: true +}; + +// src/resources/grpc-credentials.ts +var import_grpc_js = __toESM(require_src3()); +var insecure = import_grpc_js.credentials.createInsecure(); +var serverInsecure = import_grpc_js.ServerCredentials.createInsecure(); + +// src/lib/prisma.ts +var import_client = __toESM(require_client3()); +var prisma; +var OPTIONS = { + log: process.env.NEXT_PUBLIC_APP_ENV !== "production" ? ["info", "warn"] : void 0 +}; +if (process.env.NODE_ENV === "production") { + prisma = new import_client.PrismaClient(OPTIONS); +} else { + if (!("prisma" in global)) { + global.prisma = new import_client.PrismaClient(OPTIONS); + } + prisma = global.prisma; +} +var prisma_default = prisma; + +// src/handler/create.ts +var CreateNotification = async ({ request }, callback) => { + try { + const { message, message_type, title } = request; + const notifications = await prisma_default.notification.create({ + data: { + title, + message, + message_type + } + }); + callback(null, notifications); + } catch (error2) { + log.error(error2); + callback(error2, null); + } +}; + +// src/handler/get.ts +var GetNotification = async ({ request }, callback) => { + try { + const { id } = request; + const notification = await prisma_default.notification.findFirstOrThrow({ where: { id } }); + callback(null, notification); + } catch (error2) { + log.error(error2); + callback(error2, null); + } +}; + +// src/handler/update.ts +var UpdateNotification = async ({ request }, callback) => { + try { + const { id, title, message, message_type } = request; + const notification = await prisma_default.notification.update({ + where: { id }, + data: { + title, + message, + message_type + } + }); + callback(null, notification); + } catch (error2) { + log.error(error2); + callback(error2, null); + } +}; + +// src/handler/delete.ts +var DeleteNotification = async ({ request }, callback) => { + try { + const { id } = request; + await prisma_default.notification.delete({ where: { id } }); + callback(null, null); + } catch (error2) { + log.error(error2); + callback(error2, null); + } +}; + +// src/handler/listByType.ts +var GetNotifications = async ({ request }, callback) => { + try { + const { message_type } = request; + log.debug(message_type); + const notifications = { + notifications: await prisma_default.notification.findMany({ where: { message_type } }) + }; + callback(null, notifications); + } catch (error2) { + log.error(error2); + callback(error2, null); + } +}; + +// src/handler/index.ts +var handler_default = { + CreateNotification, + GetNotification, + UpdateNotification, + DeleteNotification, + GetNotifications +}; + +// src/lib/proxy.ts +var import_grpc_js2 = __toESM(require_src3()); +var getType = (method) => { + if (method.requestStream === false && method.responseStream === false) { + return "unary"; + } + return "unknown"; +}; +var lookupServiceMetadata = (service) => { + const serviceKeys = Object.keys(service); + const intersectingMethods = serviceKeys.reduce((acc, k2) => { + const method = service[k2]; + if (!method) { + throw new Error(`cannot find method ${k2} on service`); + } + const components = method.path.split("/"); + acc[k2] = { + name: components[1], + method: components[2], + type: getType(method), + path: method.path, + responseType: method.responseType, + requestType: method.requestType + }; + return acc; + }, {}); + return (key) => intersectingMethods[key]; +}; +var handler = { + get(target, propKey) { + if (propKey !== "addService") { + return target[propKey]; + } + return (service, implementation) => { + const newImplementation = {}; + const lookup = lookupServiceMetadata(service); + for (const k2 in implementation) { + const name = k2; + const fn = implementation[k2]; + newImplementation[name] = (call, callback) => { + const ctx = { + call, + name, + service: lookup(name), + status: { + code: import_grpc_js2.status.UNKNOWN, + details: "" + } + }; + const newCallback = (callback2) => { + return (...args) => { + ctx.status = { + code: import_grpc_js2.status.OK, + details: "" + }; + const err = args[0]; + if (err) { + ctx.status = { + code: import_grpc_js2.status.UNKNOWN, + details: err + }; + } + callback2(...args); + }; + }; + const interceptors = target.intercept(); + const first = interceptors.next(); + if (!first.value) { + return new Promise((resolve) => { + return resolve(fn(call, newCallback(callback))); + }); + } + first.value(ctx, function next() { + return new Promise((resolve) => { + const i = interceptors.next(); + if (i.done) { + return resolve(fn(call, newCallback(callback))); + } + return resolve(i.value(ctx, next)); + }); + }); + }; + } + return target.addService(service, newImplementation); + }; + } +}; +var createServerProxy = (server2) => { + server2.interceptors = []; + server2.use = (fn) => { + server2.interceptors.push(fn); + }; + server2.intercept = function* intercept() { + let i = 0; + while (i < server2.interceptors.length) { + yield server2.interceptors[i]; + i++; + } + }; + return new Proxy(server2, handler); +}; + +// src/lib/amqp.ts +var import_amqplib = __toESM(require_channel_api()); + +// src/lib/plunk.ts +var import_node = __toESM(require_dist()); +var plunkKey = process.env.PLUNK_PUBLIC_KEY; +if (!plunkKey) + throw new Error("Plunk API key not found"); +var plunk = new import_node.default(plunkKey); +var plunk_default = plunk; + +// src/lib/amqp.ts +var DEFAULT_QUEUE = "log"; +var DEFAULT_SUB_QUEUE = "notification"; +async function connectQueue(queue = DEFAULT_QUEUE) { + try { + const connection = await import_amqplib.default.connect(process.env.AMQP_URL || ""); + const channel = await connection.createChannel(); + await channel.assertExchange(queue, "fanout", { durable: true }); + return channel; + } catch (error2) { + return error2; + } +} +var toLog = (message) => { + const { request, path } = message; + return { event_message: path, metadata: { request } }; +}; +var publish = async (message, queue = DEFAULT_QUEUE) => { + const channel = await connectQueue(queue); + if (channel instanceof Error) + return console.log("Error to connect to queue: ", channel); + channel.sendToQueue(queue, Buffer.from(JSON.stringify(toLog(message)))); + log.debug( + msg("AMQP", `${queue} (queue)`, /* @__PURE__ */ new Date(), /* @__PURE__ */ new Date()), + JSON.stringify(message) + ); +}; +var toNotification = (message) => { + const { email, title, messageTexte } = JSON.parse(message.content.toString()); + return { email, title, messageTexte, messageType: "OUTPUT" /* OUTPUT */ }; +}; +var subscribe = async (queue = DEFAULT_SUB_QUEUE) => { + const channel = await connectQueue(queue); + if (channel instanceof Error) + return console.log("Error to connect to queue: ", channel); + channel.consume( + queue, + async function(message) { + const { email, title, messageTexte, messageType } = toNotification(message); + const notification = { + request: { + title, + message: messageTexte, + message_type: messageType + } + }; + CreateNotification(notification, () => { + }); + const { success } = await plunk_default.emails.send({ + to: email, + body: messageTexte, + subject: title + }); + if (success) + log.debug( + msg("AMQP", `${queue} (queue)`, /* @__PURE__ */ new Date(), /* @__PURE__ */ new Date()), + "Email send" + ); + else + log.debug( + msg("AMQP", `${queue} (queue)`, /* @__PURE__ */ new Date(), /* @__PURE__ */ new Date()), + "Email not send" + ); + }, + { + noAck: true + } + ); +}; + +// src/middleware/log.ts +var parseContext = (ctx) => { + const { + call: { request }, + service: { path } + } = ctx; + return { request, path }; +}; +var msg = (type, path, requestAt, responseAt) => `${utils.magenta(requestAt.toISOString())} | ${utils[type === "GRPC" ? "cyan" : "red"](type)}${path ? ` | ${utils.yellow(path)}` : ""} | ${utils.green( + responseAt.getTime() - requestAt.getTime() + "ms" +)} |`; +var logGRPC = async (ctx, next) => { + const requestAt = /* @__PURE__ */ new Date(); + await next(); + const responseAt = /* @__PURE__ */ new Date(); + let { request, path } = parseContext(ctx); + path = path?.split(".").at(-1) || ""; + publish({ request, path }, "log"); + log.debug(msg("GRPC", path, requestAt, responseAt), JSON.stringify(request)); +}; + +// src/server.ts +var PORT = process.env.PORT || 50022; +var ADDRESS = `0.0.0.0:${PORT}`; +var PROTO_PATH = (0, import_path.resolve)(__dirname + "/../../proto/notification.proto"); +var packageDefinition = (0, import_proto_loader.loadSync)(PROTO_PATH, options); +var grpc = (0, import_grpc_js3.loadPackageDefinition)(packageDefinition); +var { + NotificationService: { service: ns2 } +} = grpc.com.goodfood.notification; +subscribe(); +var server = createServerProxy(new import_grpc_js3.Server()); +server.addService(ns2, handler_default); +server.use(logGRPC); +server.bindAsync(ADDRESS, serverInsecure, () => { + server.start(); + const message = `---- ${utils.green("good")}${utils.yellow( + "food" + )} Notification Service ---- +started on: ${utils.bold(ADDRESS)} ${utils.green( + "\u2713" + )} +`; + log.debug(message); +}); +var server_default = server; +/*! Bundled license information: + +@grpc/proto-loader/build/src/util.js: + (** + * @license + * Copyright 2018 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + *) + +@grpc/proto-loader/build/src/index.js: + (** + * @license + * Copyright 2018 gRPC authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + *) + +@prisma/client/runtime/library.js: + (*! + * decimal.js v10.4.3 + * An arbitrary-precision Decimal type for JavaScript. + * https://github.com/MikeMcl/decimal.js + * Copyright (c) 2022 Michael Mclaughlin + * MIT Licence + *) + +amqplib/lib/defs.js: + (** @preserve This file is generated by the script + * ../bin/generate-defs.js, which is not in general included in a + * distribution, but is available in the source repository e.g. at + * https://github.com/squaremo/amqp.node/ + *) + +undici/lib/fetch/body.js: + (*! formdata-polyfill. MIT License. Jimmy Wärting *) + +undici/lib/websocket/frame.js: + (*! ws. MIT License. Einar Otto Stangvik *) +*/ diff --git a/services/notification/package-lock.json b/services/notification/package-lock.json new file mode 100644 index 00000000..3f90893b --- /dev/null +++ b/services/notification/package-lock.json @@ -0,0 +1,1492 @@ +{ + "name": "@goodfood/notification", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "@goodfood/notification", + "hasInstallScript": true, + "dependencies": { + "@grpc/grpc-js": "^1.9.0", + "@grpc/proto-loader": "^0.7.8", + "@plunk/node": "^2.0.0", + "@prisma/client": "5.1.0", + "@types/amqplib": "^0.10.1", + "amqplib": "^0.10.3", + "dotenv": "^16.3.1", + "esbuild": "^0.19.2", + "nodemon": "^3.0.1", + "path": "^0.12.7", + "ts-node": "^10.9.1", + "tsconfig-paths": "^4.2.0" + }, + "bin": { + "notification": "dist/index.js" + }, + "devDependencies": { + "prisma": "^5.1.0", + "typescript": "^5.1.6" + } + }, + "node_modules/@acuminous/bitsyntax": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@acuminous/bitsyntax/-/bitsyntax-0.1.2.tgz", + "integrity": "sha512-29lUK80d1muEQqiUsSo+3A0yP6CdspgC95EnKBMi22Xlwt79i/En4Vr67+cXhU+cZjbti3TgGGC5wy1stIywVQ==", + "dependencies": { + "buffer-more-ints": "~1.0.0", + "debug": "^4.3.4", + "safe-buffer": "~5.1.2" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.2.tgz", + "integrity": "sha512-tM8yLeYVe7pRyAu9VMi/Q7aunpLwD139EY1S99xbQkT4/q2qa6eA4ige/WJQYdJ8GBL1K33pPFhPfPdJ/WzT8Q==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.2.tgz", + "integrity": "sha512-lsB65vAbe90I/Qe10OjkmrdxSX4UJDjosDgb8sZUKcg3oefEuW2OT2Vozz8ef7wrJbMcmhvCC+hciF8jY/uAkw==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.2.tgz", + "integrity": "sha512-qK/TpmHt2M/Hg82WXHRc/W/2SGo/l1thtDHZWqFq7oi24AjZ4O/CpPSu6ZuYKFkEgmZlFoa7CooAyYmuvnaG8w==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.2.tgz", + "integrity": "sha512-Ora8JokrvrzEPEpZO18ZYXkH4asCdc1DLdcVy8TGf5eWtPO1Ie4WroEJzwI52ZGtpODy3+m0a2yEX9l+KUn0tA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.2.tgz", + "integrity": "sha512-tP+B5UuIbbFMj2hQaUr6EALlHOIOmlLM2FK7jeFBobPy2ERdohI4Ka6ZFjZ1ZYsrHE/hZimGuU90jusRE0pwDw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.2.tgz", + "integrity": "sha512-YbPY2kc0acfzL1VPVK6EnAlig4f+l8xmq36OZkU0jzBVHcOTyQDhnKQaLzZudNJQyymd9OqQezeaBgkTGdTGeQ==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.2.tgz", + "integrity": "sha512-nSO5uZT2clM6hosjWHAsS15hLrwCvIWx+b2e3lZ3MwbYSaXwvfO528OF+dLjas1g3bZonciivI8qKR/Hm7IWGw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.2.tgz", + "integrity": "sha512-Odalh8hICg7SOD7XCj0YLpYCEc+6mkoq63UnExDCiRA2wXEmGlK5JVrW50vZR9Qz4qkvqnHcpH+OFEggO3PgTg==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.2.tgz", + "integrity": "sha512-ig2P7GeG//zWlU0AggA3pV1h5gdix0MA3wgB+NsnBXViwiGgY77fuN9Wr5uoCrs2YzaYfogXgsWZbm+HGr09xg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.2.tgz", + "integrity": "sha512-mLfp0ziRPOLSTek0Gd9T5B8AtzKAkoZE70fneiiyPlSnUKKI4lp+mGEnQXcQEHLJAcIYDPSyBvsUbKUG2ri/XQ==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.2.tgz", + "integrity": "sha512-hn28+JNDTxxCpnYjdDYVMNTR3SKavyLlCHHkufHV91fkewpIyQchS1d8wSbmXhs1fiYDpNww8KTFlJ1dHsxeSw==", + "cpu": [ + "loong64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.2.tgz", + "integrity": "sha512-KbXaC0Sejt7vD2fEgPoIKb6nxkfYW9OmFUK9XQE4//PvGIxNIfPk1NmlHmMg6f25x57rpmEFrn1OotASYIAaTg==", + "cpu": [ + "mips64el" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.2.tgz", + "integrity": "sha512-dJ0kE8KTqbiHtA3Fc/zn7lCd7pqVr4JcT0JqOnbj4LLzYnp+7h8Qi4yjfq42ZlHfhOCM42rBh0EwHYLL6LEzcw==", + "cpu": [ + "ppc64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.2.tgz", + "integrity": "sha512-7Z/jKNFufZ/bbu4INqqCN6DDlrmOTmdw6D0gH+6Y7auok2r02Ur661qPuXidPOJ+FSgbEeQnnAGgsVynfLuOEw==", + "cpu": [ + "riscv64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.2.tgz", + "integrity": "sha512-U+RinR6aXXABFCcAY4gSlv4CL1oOVvSSCdseQmGO66H+XyuQGZIUdhG56SZaDJQcLmrSfRmx5XZOWyCJPRqS7g==", + "cpu": [ + "s390x" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.2.tgz", + "integrity": "sha512-oxzHTEv6VPm3XXNaHPyUTTte+3wGv7qVQtqaZCrgstI16gCuhNOtBXLEBkBREP57YTd68P0VgDgG73jSD8bwXQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.2.tgz", + "integrity": "sha512-WNa5zZk1XpTTwMDompZmvQLHszDDDN7lYjEHCUmAGB83Bgs20EMs7ICD+oKeT6xt4phV4NDdSi/8OfjPbSbZfQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.2.tgz", + "integrity": "sha512-S6kI1aT3S++Dedb7vxIuUOb3oAxqxk2Rh5rOXOTYnzN8JzW1VzBd+IqPiSpgitu45042SYD3HCoEyhLKQcDFDw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.2.tgz", + "integrity": "sha512-VXSSMsmb+Z8LbsQGcBMiM+fYObDNRm8p7tkUDMPG/g4fhFX5DEFmjxIEa3N8Zr96SjsJ1woAhF0DUnS3MF3ARw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.2.tgz", + "integrity": "sha512-5NayUlSAyb5PQYFAU9x3bHdsqB88RC3aM9lKDAz4X1mo/EchMIT1Q+pSeBXNgkfNmRecLXA0O8xP+x8V+g/LKg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.2.tgz", + "integrity": "sha512-47gL/ek1v36iN0wL9L4Q2MFdujR0poLZMJwhO2/N3gA89jgHp4MR8DKCmwYtGNksbfJb9JoTtbkoe6sDhg2QTA==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.2.tgz", + "integrity": "sha512-tcuhV7ncXBqbt/Ybf0IyrMcwVOAPDckMK9rXNHtF17UTK18OKLpg08glminN06pt2WCoALhXdLfSPbVvK/6fxw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@grpc/grpc-js": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.9.0.tgz", + "integrity": "sha512-H8+iZh+kCE6VR/Krj6W28Y/ZlxoZ1fOzsNt77nrdE3knkbSelW1Uus192xOFCxHyeszLj8i4APQkSIXjAoOxXg==", + "dependencies": { + "@grpc/proto-loader": "^0.7.0", + "@types/node": ">=12.12.47" + }, + "engines": { + "node": "^8.13.0 || >=10.10.0" + } + }, + "node_modules/@grpc/proto-loader": { + "version": "0.7.8", + "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.8.tgz", + "integrity": "sha512-GU12e2c8dmdXb7XUlOgYWZ2o2i+z9/VeACkxTA/zzAe2IjclC5PnVL0lpgjhrqfpDYHzM8B1TF6pqWegMYAzlA==", + "dependencies": { + "@types/long": "^4.0.1", + "lodash.camelcase": "^4.3.0", + "long": "^4.0.0", + "protobufjs": "^7.2.4", + "yargs": "^17.7.2" + }, + "bin": { + "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@plunk/node": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@plunk/node/-/node-2.0.0.tgz", + "integrity": "sha512-53lgots3fWGAo1QdS18BdEpJl7A29O1F9rYVn/7DfJ07SpJ1ZlzUeeWGVrWGL7PRRZb4a9Tw7Tt8Wnw0Xorhjg==", + "dependencies": { + "native-fetch": "^4.0.2", + "tslib": "^2.4.0", + "undici": "^5.22.1" + } + }, + "node_modules/@prisma/client": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@prisma/client/-/client-5.1.0.tgz", + "integrity": "sha512-aIxuXlH3p3Vy91buodQhYgAD9m0yuxJzpXMhc1ejQ/WN3pNNWzBA0iDcBObLq8DMdszcXmoLAk3hiRq/ZwBsOw==", + "hasInstallScript": true, + "dependencies": { + "@prisma/engines-version": "5.1.0-28.a9b7003df90aa623086e4d6f4e43c72468e6339b" + }, + "engines": { + "node": ">=16.13" + }, + "peerDependencies": { + "prisma": "*" + }, + "peerDependenciesMeta": { + "prisma": { + "optional": true + } + } + }, + "node_modules/@prisma/engines": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-5.1.1.tgz", + "integrity": "sha512-NV/4nVNWFZSJCCIA3HIFJbbDKO/NARc9ej0tX5S9k2EVbkrFJC4Xt9b0u4rNZWL4V+F5LAjvta8vzEUw0rw+HA==", + "devOptional": true, + "hasInstallScript": true + }, + "node_modules/@prisma/engines-version": { + "version": "5.1.0-28.a9b7003df90aa623086e4d6f4e43c72468e6339b", + "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-5.1.0-28.a9b7003df90aa623086e4d6f4e43c72468e6339b.tgz", + "integrity": "sha512-jTwE2oy1yjICmTfnCR0ASIpuMZXZ18sUzQXB7V0RMbrM9OlcmbUwXPuYhnxXuWN8XwRmujeIhsXs/Zeh+fjPOQ==" + }, + "node_modules/@protobufjs/aspromise": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==" + }, + "node_modules/@protobufjs/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" + }, + "node_modules/@protobufjs/codegen": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", + "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" + }, + "node_modules/@protobufjs/eventemitter": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", + "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==" + }, + "node_modules/@protobufjs/fetch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", + "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", + "dependencies": { + "@protobufjs/aspromise": "^1.1.1", + "@protobufjs/inquire": "^1.1.0" + } + }, + "node_modules/@protobufjs/float": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", + "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==" + }, + "node_modules/@protobufjs/inquire": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", + "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==" + }, + "node_modules/@protobufjs/path": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==" + }, + "node_modules/@protobufjs/pool": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==" + }, + "node_modules/@protobufjs/utf8": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", + "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==" + }, + "node_modules/@tsconfig/node10": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", + "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==" + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==" + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==" + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==" + }, + "node_modules/@types/amqplib": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/@types/amqplib/-/amqplib-0.10.1.tgz", + "integrity": "sha512-j6ANKT79ncUDnAs/+9r9eDujxbeJoTjoVu33gHHcaPfmLQaMhvfbH2GqSe8KUM444epAp1Vl3peVOQfZk3UIqA==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/long": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz", + "integrity": "sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==" + }, + "node_modules/@types/node": { + "version": "20.5.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.5.1.tgz", + "integrity": "sha512-4tT2UrL5LBqDwoed9wZ6N3umC4Yhz3W3FloMmiiG4JwmUJWpie0c7lcnUNd4gtMKuDEO4wRVS8B6Xa0uMRsMKg==" + }, + "node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" + }, + "node_modules/acorn": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/amqplib": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/amqplib/-/amqplib-0.10.3.tgz", + "integrity": "sha512-UHmuSa7n8vVW/a5HGh2nFPqAEr8+cD4dEZ6u9GjP91nHfr1a54RyAKyra7Sb5NH7NBKOUlyQSMXIp0qAixKexw==", + "dependencies": { + "@acuminous/bitsyntax": "^0.1.2", + "buffer-more-ints": "~1.0.0", + "readable-stream": "1.x >=1.1.9", + "url-parse": "~1.5.10" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==" + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/buffer-more-ints": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-more-ints/-/buffer-more-ints-1.0.0.tgz", + "integrity": "sha512-EMetuGFz5SLsT0QTnXzINh4Ksr+oo4i+UGTXEshiGCQWnsgSs7ZhJ8fzlwQ+OzEMs0MpDAMr1hxnblp5a4vcHg==" + }, + "node_modules/busboy": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", + "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", + "dependencies": { + "streamsearch": "^1.1.0" + }, + "engines": { + "node": ">=10.16.0" + } + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==" + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/dotenv": { + "version": "16.3.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.3.1.tgz", + "integrity": "sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/motdotla/dotenv?sponsor=1" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/esbuild": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.2.tgz", + "integrity": "sha512-G6hPax8UbFakEj3hWO0Vs52LQ8k3lnBhxZWomUJDxfz3rZTLqF5k/FCzuNdLx2RbpBiQQF9H9onlDDH1lZsnjg==", + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.19.2", + "@esbuild/android-arm64": "0.19.2", + "@esbuild/android-x64": "0.19.2", + "@esbuild/darwin-arm64": "0.19.2", + "@esbuild/darwin-x64": "0.19.2", + "@esbuild/freebsd-arm64": "0.19.2", + "@esbuild/freebsd-x64": "0.19.2", + "@esbuild/linux-arm": "0.19.2", + "@esbuild/linux-arm64": "0.19.2", + "@esbuild/linux-ia32": "0.19.2", + "@esbuild/linux-loong64": "0.19.2", + "@esbuild/linux-mips64el": "0.19.2", + "@esbuild/linux-ppc64": "0.19.2", + "@esbuild/linux-riscv64": "0.19.2", + "@esbuild/linux-s390x": "0.19.2", + "@esbuild/linux-x64": "0.19.2", + "@esbuild/netbsd-x64": "0.19.2", + "@esbuild/openbsd-x64": "0.19.2", + "@esbuild/sunos-x64": "0.19.2", + "@esbuild/win32-arm64": "0.19.2", + "@esbuild/win32-ia32": "0.19.2", + "@esbuild/win32-x64": "0.19.2" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "engines": { + "node": ">=6" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/ignore-by-default": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", + "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==" + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==" + }, + "node_modules/long": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", + "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==" + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/native-fetch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/native-fetch/-/native-fetch-4.0.2.tgz", + "integrity": "sha512-4QcVlKFtv2EYVS5MBgsGX5+NWKtbDbIECdUXDBGDMAZXq3Jkv9zf+y8iS7Ub8fEdga3GpYeazp9gauNqXHJOCg==", + "peerDependencies": { + "undici": "*" + } + }, + "node_modules/nodemon": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.0.1.tgz", + "integrity": "sha512-g9AZ7HmkhQkqXkRc20w+ZfQ73cHLbE8hnPbtaFbFtCumZsjyMhKk9LajQ07U5Ux28lvFjZ5X7HvWR1xzU8jHVw==", + "dependencies": { + "chokidar": "^3.5.2", + "debug": "^3.2.7", + "ignore-by-default": "^1.0.1", + "minimatch": "^3.1.2", + "pstree.remy": "^1.1.8", + "semver": "^7.5.3", + "simple-update-notifier": "^2.0.0", + "supports-color": "^5.5.0", + "touch": "^3.1.0", + "undefsafe": "^2.0.5" + }, + "bin": { + "nodemon": "bin/nodemon.js" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/nodemon" + } + }, + "node_modules/nodemon/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/nopt": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", + "integrity": "sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==", + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "*" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path": { + "version": "0.12.7", + "resolved": "https://registry.npmjs.org/path/-/path-0.12.7.tgz", + "integrity": "sha512-aXXC6s+1w7otVF9UletFkFcDsJeO7lSZBPUQhtb5O0xJe8LtYhj/GxldoL09bBj9+ZmE2hNoHqQSFMN5fikh4Q==", + "dependencies": { + "process": "^0.11.1", + "util": "^0.10.3" + } + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/prisma": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/prisma/-/prisma-5.1.1.tgz", + "integrity": "sha512-WJFG/U7sMmcc6TjJTTifTfpI6Wjoh55xl4AzopVwAdyK68L9/ogNo8QQ2cxuUjJf/Wa82z/uhyh3wMzvRIBphg==", + "devOptional": true, + "hasInstallScript": true, + "dependencies": { + "@prisma/engines": "5.1.1" + }, + "bin": { + "prisma": "build/index.js" + }, + "engines": { + "node": ">=16.13" + } + }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/protobufjs": { + "version": "7.2.4", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.2.4.tgz", + "integrity": "sha512-AT+RJgD2sH8phPmCf7OUZR8xGdcJRga4+1cOaXJ64hvcSkVhNcRHOwIxUatPH15+nj59WAGTDv3LSGZPEQbJaQ==", + "hasInstallScript": true, + "dependencies": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/node": ">=13.7.0", + "long": "^5.0.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/protobufjs/node_modules/long": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", + "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==" + }, + "node_modules/pstree.remy": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", + "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==" + }, + "node_modules/querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==" + }, + "node_modules/readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==" + }, + "node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/simple-update-notifier": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", + "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==", + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/streamsearch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", + "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==" + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "engines": { + "node": ">=4" + } + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/touch": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", + "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", + "dependencies": { + "nopt": "~1.0.10" + }, + "bin": { + "nodetouch": "bin/nodetouch.js" + } + }, + "node_modules/ts-node": { + "version": "10.9.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", + "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "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 + } + } + }, + "node_modules/tsconfig-paths": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", + "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==", + "dependencies": { + "json5": "^2.2.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + }, + "node_modules/typescript": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz", + "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undefsafe": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", + "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==" + }, + "node_modules/undici": { + "version": "5.23.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.23.0.tgz", + "integrity": "sha512-1D7w+fvRsqlQ9GscLBwcAJinqcZGHUKjbOmXdlE/v8BvEGXjeWAax+341q44EuTcHXXnfyKNbKRq4Lg7OzhMmg==", + "dependencies": { + "busboy": "^1.6.0" + }, + "engines": { + "node": ">=14.0" + } + }, + "node_modules/url-parse": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "node_modules/util": { + "version": "0.10.4", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", + "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==", + "dependencies": { + "inherits": "2.0.3" + } + }, + "node_modules/util/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==" + }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==" + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "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.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "engines": { + "node": ">=12" + } + }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "engines": { + "node": ">=6" + } + } + } +} diff --git a/services/notification/package.json b/services/notification/package.json index f2ab816f..077b603c 100644 --- a/services/notification/package.json +++ b/services/notification/package.json @@ -10,7 +10,7 @@ "postinstall": "npm run prisma:generate" }, "devDependencies": { - "prisma": "^5.1.0", + "prisma": "^5.1.1", "typescript": "^5.1.6" }, "dependencies": { diff --git a/services/notification/pnpm-lock.yaml b/services/notification/pnpm-lock.yaml deleted file mode 100644 index 5c090eb9..00000000 --- a/services/notification/pnpm-lock.yaml +++ /dev/null @@ -1,1073 +0,0 @@ -lockfileVersion: '6.0' - -settings: - autoInstallPeers: true - excludeLinksFromLockfile: false - -dependencies: - '@grpc/grpc-js': - specifier: ^1.9.0 - version: 1.9.0 - '@grpc/proto-loader': - specifier: ^0.7.8 - version: 0.7.8 - '@plunk/node': - specifier: ^2.0.0 - version: 2.0.0 - '@prisma/client': - specifier: 5.1.0 - version: 5.1.0(prisma@5.1.0) - '@types/amqplib': - specifier: ^0.10.1 - version: 0.10.1 - amqplib: - specifier: ^0.10.3 - version: 0.10.3 - dotenv: - specifier: ^16.3.1 - version: 16.3.1 - esbuild: - specifier: ^0.19.2 - version: 0.19.2 - node-fetch: - specifier: ^3.3.2 - version: 3.3.2 - nodemon: - specifier: ^3.0.1 - version: 3.0.1 - path: - specifier: ^0.12.7 - version: 0.12.7 - ts-node: - specifier: ^10.9.1 - version: 10.9.1(@types/node@20.5.1)(typescript@5.1.6) - tsconfig-paths: - specifier: ^4.2.0 - version: 4.2.0 - -devDependencies: - prisma: - specifier: ^5.1.0 - version: 5.1.0 - typescript: - specifier: ^5.1.6 - version: 5.1.6 - -packages: - - /@acuminous/bitsyntax@0.1.2: - resolution: {integrity: sha512-29lUK80d1muEQqiUsSo+3A0yP6CdspgC95EnKBMi22Xlwt79i/En4Vr67+cXhU+cZjbti3TgGGC5wy1stIywVQ==} - engines: {node: '>=0.8'} - dependencies: - buffer-more-ints: 1.0.0 - debug: 4.3.4 - safe-buffer: 5.1.2 - transitivePeerDependencies: - - supports-color - dev: false - - /@cspotcode/source-map-support@0.8.1: - resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} - engines: {node: '>=12'} - dependencies: - '@jridgewell/trace-mapping': 0.3.9 - dev: false - - /@esbuild/android-arm64@0.19.2: - resolution: {integrity: sha512-lsB65vAbe90I/Qe10OjkmrdxSX4UJDjosDgb8sZUKcg3oefEuW2OT2Vozz8ef7wrJbMcmhvCC+hciF8jY/uAkw==} - engines: {node: '>=12'} - cpu: [arm64] - os: [android] - requiresBuild: true - dev: false - optional: true - - /@esbuild/android-arm@0.19.2: - resolution: {integrity: sha512-tM8yLeYVe7pRyAu9VMi/Q7aunpLwD139EY1S99xbQkT4/q2qa6eA4ige/WJQYdJ8GBL1K33pPFhPfPdJ/WzT8Q==} - engines: {node: '>=12'} - cpu: [arm] - os: [android] - requiresBuild: true - dev: false - optional: true - - /@esbuild/android-x64@0.19.2: - resolution: {integrity: sha512-qK/TpmHt2M/Hg82WXHRc/W/2SGo/l1thtDHZWqFq7oi24AjZ4O/CpPSu6ZuYKFkEgmZlFoa7CooAyYmuvnaG8w==} - engines: {node: '>=12'} - cpu: [x64] - os: [android] - requiresBuild: true - dev: false - optional: true - - /@esbuild/darwin-arm64@0.19.2: - resolution: {integrity: sha512-Ora8JokrvrzEPEpZO18ZYXkH4asCdc1DLdcVy8TGf5eWtPO1Ie4WroEJzwI52ZGtpODy3+m0a2yEX9l+KUn0tA==} - engines: {node: '>=12'} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: false - optional: true - - /@esbuild/darwin-x64@0.19.2: - resolution: {integrity: sha512-tP+B5UuIbbFMj2hQaUr6EALlHOIOmlLM2FK7jeFBobPy2ERdohI4Ka6ZFjZ1ZYsrHE/hZimGuU90jusRE0pwDw==} - engines: {node: '>=12'} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: false - optional: true - - /@esbuild/freebsd-arm64@0.19.2: - resolution: {integrity: sha512-YbPY2kc0acfzL1VPVK6EnAlig4f+l8xmq36OZkU0jzBVHcOTyQDhnKQaLzZudNJQyymd9OqQezeaBgkTGdTGeQ==} - engines: {node: '>=12'} - cpu: [arm64] - os: [freebsd] - requiresBuild: true - dev: false - optional: true - - /@esbuild/freebsd-x64@0.19.2: - resolution: {integrity: sha512-nSO5uZT2clM6hosjWHAsS15hLrwCvIWx+b2e3lZ3MwbYSaXwvfO528OF+dLjas1g3bZonciivI8qKR/Hm7IWGw==} - engines: {node: '>=12'} - cpu: [x64] - os: [freebsd] - requiresBuild: true - dev: false - optional: true - - /@esbuild/linux-arm64@0.19.2: - resolution: {integrity: sha512-ig2P7GeG//zWlU0AggA3pV1h5gdix0MA3wgB+NsnBXViwiGgY77fuN9Wr5uoCrs2YzaYfogXgsWZbm+HGr09xg==} - engines: {node: '>=12'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@esbuild/linux-arm@0.19.2: - resolution: {integrity: sha512-Odalh8hICg7SOD7XCj0YLpYCEc+6mkoq63UnExDCiRA2wXEmGlK5JVrW50vZR9Qz4qkvqnHcpH+OFEggO3PgTg==} - engines: {node: '>=12'} - cpu: [arm] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@esbuild/linux-ia32@0.19.2: - resolution: {integrity: sha512-mLfp0ziRPOLSTek0Gd9T5B8AtzKAkoZE70fneiiyPlSnUKKI4lp+mGEnQXcQEHLJAcIYDPSyBvsUbKUG2ri/XQ==} - engines: {node: '>=12'} - cpu: [ia32] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@esbuild/linux-loong64@0.19.2: - resolution: {integrity: sha512-hn28+JNDTxxCpnYjdDYVMNTR3SKavyLlCHHkufHV91fkewpIyQchS1d8wSbmXhs1fiYDpNww8KTFlJ1dHsxeSw==} - engines: {node: '>=12'} - cpu: [loong64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@esbuild/linux-mips64el@0.19.2: - resolution: {integrity: sha512-KbXaC0Sejt7vD2fEgPoIKb6nxkfYW9OmFUK9XQE4//PvGIxNIfPk1NmlHmMg6f25x57rpmEFrn1OotASYIAaTg==} - engines: {node: '>=12'} - cpu: [mips64el] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@esbuild/linux-ppc64@0.19.2: - resolution: {integrity: sha512-dJ0kE8KTqbiHtA3Fc/zn7lCd7pqVr4JcT0JqOnbj4LLzYnp+7h8Qi4yjfq42ZlHfhOCM42rBh0EwHYLL6LEzcw==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@esbuild/linux-riscv64@0.19.2: - resolution: {integrity: sha512-7Z/jKNFufZ/bbu4INqqCN6DDlrmOTmdw6D0gH+6Y7auok2r02Ur661qPuXidPOJ+FSgbEeQnnAGgsVynfLuOEw==} - engines: {node: '>=12'} - cpu: [riscv64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@esbuild/linux-s390x@0.19.2: - resolution: {integrity: sha512-U+RinR6aXXABFCcAY4gSlv4CL1oOVvSSCdseQmGO66H+XyuQGZIUdhG56SZaDJQcLmrSfRmx5XZOWyCJPRqS7g==} - engines: {node: '>=12'} - cpu: [s390x] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@esbuild/linux-x64@0.19.2: - resolution: {integrity: sha512-oxzHTEv6VPm3XXNaHPyUTTte+3wGv7qVQtqaZCrgstI16gCuhNOtBXLEBkBREP57YTd68P0VgDgG73jSD8bwXQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@esbuild/netbsd-x64@0.19.2: - resolution: {integrity: sha512-WNa5zZk1XpTTwMDompZmvQLHszDDDN7lYjEHCUmAGB83Bgs20EMs7ICD+oKeT6xt4phV4NDdSi/8OfjPbSbZfQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [netbsd] - requiresBuild: true - dev: false - optional: true - - /@esbuild/openbsd-x64@0.19.2: - resolution: {integrity: sha512-S6kI1aT3S++Dedb7vxIuUOb3oAxqxk2Rh5rOXOTYnzN8JzW1VzBd+IqPiSpgitu45042SYD3HCoEyhLKQcDFDw==} - engines: {node: '>=12'} - cpu: [x64] - os: [openbsd] - requiresBuild: true - dev: false - optional: true - - /@esbuild/sunos-x64@0.19.2: - resolution: {integrity: sha512-VXSSMsmb+Z8LbsQGcBMiM+fYObDNRm8p7tkUDMPG/g4fhFX5DEFmjxIEa3N8Zr96SjsJ1woAhF0DUnS3MF3ARw==} - engines: {node: '>=12'} - cpu: [x64] - os: [sunos] - requiresBuild: true - dev: false - optional: true - - /@esbuild/win32-arm64@0.19.2: - resolution: {integrity: sha512-5NayUlSAyb5PQYFAU9x3bHdsqB88RC3aM9lKDAz4X1mo/EchMIT1Q+pSeBXNgkfNmRecLXA0O8xP+x8V+g/LKg==} - engines: {node: '>=12'} - cpu: [arm64] - os: [win32] - requiresBuild: true - dev: false - optional: true - - /@esbuild/win32-ia32@0.19.2: - resolution: {integrity: sha512-47gL/ek1v36iN0wL9L4Q2MFdujR0poLZMJwhO2/N3gA89jgHp4MR8DKCmwYtGNksbfJb9JoTtbkoe6sDhg2QTA==} - engines: {node: '>=12'} - cpu: [ia32] - os: [win32] - requiresBuild: true - dev: false - optional: true - - /@esbuild/win32-x64@0.19.2: - resolution: {integrity: sha512-tcuhV7ncXBqbt/Ybf0IyrMcwVOAPDckMK9rXNHtF17UTK18OKLpg08glminN06pt2WCoALhXdLfSPbVvK/6fxw==} - engines: {node: '>=12'} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: false - optional: true - - /@grpc/grpc-js@1.9.0: - resolution: {integrity: sha512-H8+iZh+kCE6VR/Krj6W28Y/ZlxoZ1fOzsNt77nrdE3knkbSelW1Uus192xOFCxHyeszLj8i4APQkSIXjAoOxXg==} - engines: {node: ^8.13.0 || >=10.10.0} - dependencies: - '@grpc/proto-loader': 0.7.8 - '@types/node': 20.5.1 - dev: false - - /@grpc/proto-loader@0.7.8: - resolution: {integrity: sha512-GU12e2c8dmdXb7XUlOgYWZ2o2i+z9/VeACkxTA/zzAe2IjclC5PnVL0lpgjhrqfpDYHzM8B1TF6pqWegMYAzlA==} - engines: {node: '>=6'} - hasBin: true - dependencies: - '@types/long': 4.0.2 - lodash.camelcase: 4.3.0 - long: 4.0.0 - protobufjs: 7.2.4 - yargs: 17.7.2 - dev: false - - /@jridgewell/resolve-uri@3.1.1: - resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} - engines: {node: '>=6.0.0'} - dev: false - - /@jridgewell/sourcemap-codec@1.4.15: - resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} - dev: false - - /@jridgewell/trace-mapping@0.3.9: - resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} - dependencies: - '@jridgewell/resolve-uri': 3.1.1 - '@jridgewell/sourcemap-codec': 1.4.15 - dev: false - - /@plunk/node@2.0.0: - resolution: {integrity: sha512-53lgots3fWGAo1QdS18BdEpJl7A29O1F9rYVn/7DfJ07SpJ1ZlzUeeWGVrWGL7PRRZb4a9Tw7Tt8Wnw0Xorhjg==} - dependencies: - native-fetch: 4.0.2(undici@5.23.0) - tslib: 2.6.2 - undici: 5.23.0 - dev: false - - /@prisma/client@5.1.0(prisma@5.1.0): - resolution: {integrity: sha512-aIxuXlH3p3Vy91buodQhYgAD9m0yuxJzpXMhc1ejQ/WN3pNNWzBA0iDcBObLq8DMdszcXmoLAk3hiRq/ZwBsOw==} - engines: {node: '>=16.13'} - requiresBuild: true - peerDependencies: - prisma: '*' - peerDependenciesMeta: - prisma: - optional: true - dependencies: - '@prisma/engines-version': 5.1.0-28.a9b7003df90aa623086e4d6f4e43c72468e6339b - prisma: 5.1.0 - dev: false - - /@prisma/engines-version@5.1.0-28.a9b7003df90aa623086e4d6f4e43c72468e6339b: - resolution: {integrity: sha512-jTwE2oy1yjICmTfnCR0ASIpuMZXZ18sUzQXB7V0RMbrM9OlcmbUwXPuYhnxXuWN8XwRmujeIhsXs/Zeh+fjPOQ==} - dev: false - - /@prisma/engines@5.1.0: - resolution: {integrity: sha512-HqaFsnPmZOdMWkPq6tT2eTVTQyaAXEDdKszcZ4yc7DGMBIYRP6j/zAJTtZUG9SsMV8FaucdL5vRyxY/p5Ni28g==} - requiresBuild: true - - /@protobufjs/aspromise@1.1.2: - resolution: {integrity: sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==} - dev: false - - /@protobufjs/base64@1.1.2: - resolution: {integrity: sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==} - dev: false - - /@protobufjs/codegen@2.0.4: - resolution: {integrity: sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==} - dev: false - - /@protobufjs/eventemitter@1.1.0: - resolution: {integrity: sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==} - dev: false - - /@protobufjs/fetch@1.1.0: - resolution: {integrity: sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==} - dependencies: - '@protobufjs/aspromise': 1.1.2 - '@protobufjs/inquire': 1.1.0 - dev: false - - /@protobufjs/float@1.0.2: - resolution: {integrity: sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==} - dev: false - - /@protobufjs/inquire@1.1.0: - resolution: {integrity: sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==} - dev: false - - /@protobufjs/path@1.1.2: - resolution: {integrity: sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==} - dev: false - - /@protobufjs/pool@1.1.0: - resolution: {integrity: sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==} - dev: false - - /@protobufjs/utf8@1.1.0: - resolution: {integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==} - dev: false - - /@tsconfig/node10@1.0.9: - resolution: {integrity: sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==} - dev: false - - /@tsconfig/node12@1.0.11: - resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} - dev: false - - /@tsconfig/node14@1.0.3: - resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} - dev: false - - /@tsconfig/node16@1.0.4: - resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} - dev: false - - /@types/amqplib@0.10.1: - resolution: {integrity: sha512-j6ANKT79ncUDnAs/+9r9eDujxbeJoTjoVu33gHHcaPfmLQaMhvfbH2GqSe8KUM444epAp1Vl3peVOQfZk3UIqA==} - dependencies: - '@types/node': 20.5.1 - dev: false - - /@types/long@4.0.2: - resolution: {integrity: sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==} - dev: false - - /@types/node@20.5.1: - resolution: {integrity: sha512-4tT2UrL5LBqDwoed9wZ6N3umC4Yhz3W3FloMmiiG4JwmUJWpie0c7lcnUNd4gtMKuDEO4wRVS8B6Xa0uMRsMKg==} - dev: false - - /abbrev@1.1.1: - resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} - dev: false - - /acorn-walk@8.2.0: - resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} - engines: {node: '>=0.4.0'} - dev: false - - /acorn@8.10.0: - resolution: {integrity: sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==} - engines: {node: '>=0.4.0'} - hasBin: true - dev: false - - /amqplib@0.10.3: - resolution: {integrity: sha512-UHmuSa7n8vVW/a5HGh2nFPqAEr8+cD4dEZ6u9GjP91nHfr1a54RyAKyra7Sb5NH7NBKOUlyQSMXIp0qAixKexw==} - engines: {node: '>=10'} - dependencies: - '@acuminous/bitsyntax': 0.1.2 - buffer-more-ints: 1.0.0 - readable-stream: 1.1.14 - url-parse: 1.5.10 - transitivePeerDependencies: - - supports-color - dev: false - - /ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} - dev: false - - /ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} - dependencies: - color-convert: 2.0.1 - dev: false - - /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: false - - /arg@4.1.3: - resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} - dev: false - - /balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - dev: false - - /binary-extensions@2.2.0: - resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} - engines: {node: '>=8'} - 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 - - /buffer-more-ints@1.0.0: - resolution: {integrity: sha512-EMetuGFz5SLsT0QTnXzINh4Ksr+oo4i+UGTXEshiGCQWnsgSs7ZhJ8fzlwQ+OzEMs0MpDAMr1hxnblp5a4vcHg==} - dev: false - - /busboy@1.6.0: - resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} - engines: {node: '>=10.16.0'} - dependencies: - streamsearch: 1.1.0 - dev: false - - /chokidar@3.5.3: - resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} - engines: {node: '>= 8.10.0'} - dependencies: - anymatch: 3.1.3 - braces: 3.0.2 - glob-parent: 5.1.2 - is-binary-path: 2.1.0 - is-glob: 4.0.3 - normalize-path: 3.0.0 - readdirp: 3.6.0 - optionalDependencies: - fsevents: 2.3.2 - 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 - 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 - - /core-util-is@1.0.3: - resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} - dev: false - - /create-require@1.1.1: - resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} - dev: false - - /data-uri-to-buffer@4.0.1: - resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} - engines: {node: '>= 12'} - dev: false - - /debug@3.2.7(supports-color@5.5.0): - resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - dependencies: - ms: 2.1.2 - supports-color: 5.5.0 - 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 - dev: false - - /diff@4.0.2: - resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} - engines: {node: '>=0.3.1'} - dev: false - - /dotenv@16.3.1: - resolution: {integrity: sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==} - engines: {node: '>=12'} - dev: false - - /emoji-regex@8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - dev: false - - /esbuild@0.19.2: - resolution: {integrity: sha512-G6hPax8UbFakEj3hWO0Vs52LQ8k3lnBhxZWomUJDxfz3rZTLqF5k/FCzuNdLx2RbpBiQQF9H9onlDDH1lZsnjg==} - engines: {node: '>=12'} - hasBin: true - requiresBuild: true - optionalDependencies: - '@esbuild/android-arm': 0.19.2 - '@esbuild/android-arm64': 0.19.2 - '@esbuild/android-x64': 0.19.2 - '@esbuild/darwin-arm64': 0.19.2 - '@esbuild/darwin-x64': 0.19.2 - '@esbuild/freebsd-arm64': 0.19.2 - '@esbuild/freebsd-x64': 0.19.2 - '@esbuild/linux-arm': 0.19.2 - '@esbuild/linux-arm64': 0.19.2 - '@esbuild/linux-ia32': 0.19.2 - '@esbuild/linux-loong64': 0.19.2 - '@esbuild/linux-mips64el': 0.19.2 - '@esbuild/linux-ppc64': 0.19.2 - '@esbuild/linux-riscv64': 0.19.2 - '@esbuild/linux-s390x': 0.19.2 - '@esbuild/linux-x64': 0.19.2 - '@esbuild/netbsd-x64': 0.19.2 - '@esbuild/openbsd-x64': 0.19.2 - '@esbuild/sunos-x64': 0.19.2 - '@esbuild/win32-arm64': 0.19.2 - '@esbuild/win32-ia32': 0.19.2 - '@esbuild/win32-x64': 0.19.2 - dev: false - - /escalade@3.1.1: - resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} - engines: {node: '>=6'} - dev: false - - /fetch-blob@3.2.0: - resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==} - engines: {node: ^12.20 || >= 14.13} - dependencies: - node-domexception: 1.0.0 - web-streams-polyfill: 3.2.1 - 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 - - /formdata-polyfill@4.0.10: - resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==} - engines: {node: '>=12.20.0'} - dependencies: - fetch-blob: 3.2.0 - dev: false - - /fsevents@2.3.2: - resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - requiresBuild: true - dev: false - optional: true - - /get-caller-file@2.0.5: - resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} - engines: {node: 6.* || 8.* || >= 10.*} - dev: false - - /glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} - dependencies: - is-glob: 4.0.3 - dev: false - - /has-flag@3.0.0: - resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} - engines: {node: '>=4'} - dev: false - - /ignore-by-default@1.0.1: - resolution: {integrity: sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==} - dev: false - - /inherits@2.0.3: - resolution: {integrity: sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==} - dev: false - - /is-binary-path@2.1.0: - resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} - engines: {node: '>=8'} - dependencies: - binary-extensions: 2.2.0 - dev: false - - /is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} - dev: false - - /is-fullwidth-code-point@3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} - engines: {node: '>=8'} - 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-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} - dev: false - - /isarray@0.0.1: - resolution: {integrity: sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==} - dev: false - - /json5@2.2.3: - resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} - engines: {node: '>=6'} - hasBin: true - dev: false - - /lodash.camelcase@4.3.0: - resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} - dev: false - - /long@4.0.0: - resolution: {integrity: sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==} - dev: false - - /long@5.2.3: - resolution: {integrity: sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==} - dev: false - - /lru-cache@6.0.0: - resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} - engines: {node: '>=10'} - dependencies: - yallist: 4.0.0 - dev: false - - /make-error@1.3.6: - resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} - dev: false - - /minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} - dependencies: - brace-expansion: 1.1.11 - dev: false - - /minimist@1.2.8: - resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - dev: false - - /ms@2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - dev: false - - /native-fetch@4.0.2(undici@5.23.0): - resolution: {integrity: sha512-4QcVlKFtv2EYVS5MBgsGX5+NWKtbDbIECdUXDBGDMAZXq3Jkv9zf+y8iS7Ub8fEdga3GpYeazp9gauNqXHJOCg==} - peerDependencies: - undici: '*' - dependencies: - undici: 5.23.0 - dev: false - - /node-domexception@1.0.0: - resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} - engines: {node: '>=10.5.0'} - dev: false - - /node-fetch@3.3.2: - resolution: {integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dependencies: - data-uri-to-buffer: 4.0.1 - fetch-blob: 3.2.0 - formdata-polyfill: 4.0.10 - dev: false - - /nodemon@3.0.1: - resolution: {integrity: sha512-g9AZ7HmkhQkqXkRc20w+ZfQ73cHLbE8hnPbtaFbFtCumZsjyMhKk9LajQ07U5Ux28lvFjZ5X7HvWR1xzU8jHVw==} - engines: {node: '>=10'} - hasBin: true - dependencies: - chokidar: 3.5.3 - debug: 3.2.7(supports-color@5.5.0) - ignore-by-default: 1.0.1 - minimatch: 3.1.2 - pstree.remy: 1.1.8 - semver: 7.5.4 - simple-update-notifier: 2.0.0 - supports-color: 5.5.0 - touch: 3.1.0 - undefsafe: 2.0.5 - dev: false - - /nopt@1.0.10: - resolution: {integrity: sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==} - hasBin: true - dependencies: - abbrev: 1.1.1 - dev: false - - /normalize-path@3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} - engines: {node: '>=0.10.0'} - dev: false - - /path@0.12.7: - resolution: {integrity: sha512-aXXC6s+1w7otVF9UletFkFcDsJeO7lSZBPUQhtb5O0xJe8LtYhj/GxldoL09bBj9+ZmE2hNoHqQSFMN5fikh4Q==} - dependencies: - process: 0.11.10 - util: 0.10.4 - dev: false - - /picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} - dev: false - - /prisma@5.1.0: - resolution: {integrity: sha512-wkXvh+6wxk03G8qwpZMOed4Y3j+EQ+bMTlvbDZHeal6k1E8QuGKzRO7DRXlE1NV0WNgOAas8kwZqcLETQ2+BiQ==} - engines: {node: '>=16.13'} - hasBin: true - requiresBuild: true - dependencies: - '@prisma/engines': 5.1.0 - - /process@0.11.10: - resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} - engines: {node: '>= 0.6.0'} - dev: false - - /protobufjs@7.2.4: - resolution: {integrity: sha512-AT+RJgD2sH8phPmCf7OUZR8xGdcJRga4+1cOaXJ64hvcSkVhNcRHOwIxUatPH15+nj59WAGTDv3LSGZPEQbJaQ==} - engines: {node: '>=12.0.0'} - requiresBuild: true - dependencies: - '@protobufjs/aspromise': 1.1.2 - '@protobufjs/base64': 1.1.2 - '@protobufjs/codegen': 2.0.4 - '@protobufjs/eventemitter': 1.1.0 - '@protobufjs/fetch': 1.1.0 - '@protobufjs/float': 1.0.2 - '@protobufjs/inquire': 1.1.0 - '@protobufjs/path': 1.1.2 - '@protobufjs/pool': 1.1.0 - '@protobufjs/utf8': 1.1.0 - '@types/node': 20.5.1 - long: 5.2.3 - dev: false - - /pstree.remy@1.1.8: - resolution: {integrity: sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==} - dev: false - - /querystringify@2.2.0: - resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} - dev: false - - /readable-stream@1.1.14: - resolution: {integrity: sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==} - dependencies: - core-util-is: 1.0.3 - inherits: 2.0.3 - isarray: 0.0.1 - string_decoder: 0.10.31 - dev: false - - /readdirp@3.6.0: - resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} - engines: {node: '>=8.10.0'} - dependencies: - picomatch: 2.3.1 - dev: false - - /require-directory@2.1.1: - resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} - engines: {node: '>=0.10.0'} - dev: false - - /requires-port@1.0.0: - resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} - dev: false - - /safe-buffer@5.1.2: - resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} - dev: false - - /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 - dev: false - - /simple-update-notifier@2.0.0: - resolution: {integrity: sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==} - engines: {node: '>=10'} - dependencies: - semver: 7.5.4 - dev: false - - /streamsearch@1.1.0: - resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} - engines: {node: '>=10.0.0'} - dev: false - - /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 - dev: false - - /string_decoder@0.10.31: - resolution: {integrity: sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==} - dev: false - - /strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} - dependencies: - ansi-regex: 5.0.1 - dev: false - - /strip-bom@3.0.0: - resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} - engines: {node: '>=4'} - dev: false - - /supports-color@5.5.0: - resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} - engines: {node: '>=4'} - dependencies: - has-flag: 3.0.0 - 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 - - /touch@3.1.0: - resolution: {integrity: sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==} - hasBin: true - dependencies: - nopt: 1.0.10 - dev: false - - /ts-node@10.9.1(@types/node@20.5.1)(typescript@5.1.6): - 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': 20.5.1 - 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.1.6 - v8-compile-cache-lib: 3.0.1 - yn: 3.1.1 - dev: false - - /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: false - - /tslib@2.6.2: - resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} - dev: false - - /typescript@5.1.6: - resolution: {integrity: sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==} - engines: {node: '>=14.17'} - hasBin: true - - /undefsafe@2.0.5: - resolution: {integrity: sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==} - dev: false - - /undici@5.23.0: - resolution: {integrity: sha512-1D7w+fvRsqlQ9GscLBwcAJinqcZGHUKjbOmXdlE/v8BvEGXjeWAax+341q44EuTcHXXnfyKNbKRq4Lg7OzhMmg==} - engines: {node: '>=14.0'} - dependencies: - busboy: 1.6.0 - dev: false - - /url-parse@1.5.10: - resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} - dependencies: - querystringify: 2.2.0 - requires-port: 1.0.0 - dev: false - - /util@0.10.4: - resolution: {integrity: sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==} - dependencies: - inherits: 2.0.3 - dev: false - - /v8-compile-cache-lib@3.0.1: - resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} - dev: false - - /web-streams-polyfill@3.2.1: - resolution: {integrity: sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==} - engines: {node: '>= 8'} - dev: false - - /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 - dev: false - - /y18n@5.0.8: - resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} - engines: {node: '>=10'} - dev: false - - /yallist@4.0.0: - resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} - dev: false - - /yargs-parser@21.1.1: - resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} - engines: {node: '>=12'} - 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 - dev: false - - /yn@3.1.1: - resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} - engines: {node: '>=6'} - dev: false diff --git a/services/notification/src/lib/amqp.ts b/services/notification/src/lib/amqp.ts index d3f3ea7c..22333df5 100644 --- a/services/notification/src/lib/amqp.ts +++ b/services/notification/src/lib/amqp.ts @@ -2,9 +2,9 @@ import amqp from "amqplib"; import plunk from "@notifications/lib/plunk"; import { msg } from "@notifications/middleware/log"; import { log } from "@notifications/lib/log"; -import { CreateNotification } from "@notifications/handler/create"; -import { NotificationCreateInput, MessageType } from "@notifications/types/notification"; import { Data } from "@notifications/types"; +import { NotificationCreateInput, MessageType } from "@notifications/types/notification"; +import { CreateNotification } from "@notifications/handler/create"; const DEFAULT_QUEUE = "log"; const DEFAULT_SUB_QUEUE = "notification"; @@ -42,7 +42,6 @@ const toNotification = (message: any) => { } export const subscribe = async (queue = DEFAULT_SUB_QUEUE) => { - log.debug("Subscribe") const channel = await connectQueue(queue); if (channel instanceof Error) return console.log("Error to connect to queue: ", channel); @@ -75,7 +74,7 @@ export const subscribe = async (queue = DEFAULT_SUB_QUEUE) => { else log.debug( msg("AMQP", `${queue} (queue)`, new Date(), new Date()), - "Email send" + "Email not send" ); }, { diff --git a/services/notification/src/types/notification.d.ts b/services/notification/src/types/notification.ts similarity index 64% rename from services/notification/src/types/notification.d.ts rename to services/notification/src/types/notification.ts index d413aff0..0c5e4d85 100644 --- a/services/notification/src/types/notification.d.ts +++ b/services/notification/src/types/notification.ts @@ -1,4 +1,4 @@ -export type Notification = { +export interface Notification { id: string; title: string; @@ -6,21 +6,21 @@ export type Notification = { message_type: MessageType; } -export type NotificationCreateInput = { +export interface NotificationCreateInput { title: string; message: string; message_type: MessageType; } -export type NotificationId = { +export interface NotificationId { id: string; } -export type NotificationList = { +export interface NotificationList { notifications: Notification[]; } -export type MessageTypeInput = { +export interface MessageTypeInput { message_type: string; } From 5c1aadb7bebb5ae75a6312b9f2425718a65934a6 Mon Sep 17 00:00:00 2001 From: anatole Date: Sun, 20 Aug 2023 11:54:50 +0200 Subject: [PATCH 427/883] feat(global): add payment service to the docker compose --- services/docker-compose.yml | 36 +++++++++++++++++-- services/gateway/.env.example | 2 +- services/gateway/README.md | 3 +- .../controller/payment/payment.controller.ts | 29 +++++++++++++++ .../controller/payment/stripe.controller.ts | 17 +++++++++ services/gateway/src/server.ts | 8 +++++ .../src/services/clients/payment.client.ts | 12 +++++++ services/order/src/lib/reflection.ts | 1 - services/payment/.env.docker | 10 ++++++ services/payment/.gitignore | 1 + services/payment/src/lib/reflection.ts | 1 - 11 files changed, 114 insertions(+), 6 deletions(-) create mode 100644 services/gateway/src/controller/payment/payment.controller.ts create mode 100644 services/gateway/src/controller/payment/stripe.controller.ts create mode 100644 services/gateway/src/services/clients/payment.client.ts create mode 100644 services/payment/.env.docker diff --git a/services/docker-compose.yml b/services/docker-compose.yml index 85162d71..0676de1f 100644 --- a/services/docker-compose.yml +++ b/services/docker-compose.yml @@ -28,7 +28,7 @@ services: env_file: - user/dev.env ports: - - "50007" + - "50001" networks: - goodfood-network @@ -46,7 +46,6 @@ services: POSTGRES_DB: postgres PGDATA: /var/lib/postgresql/data/pgdata - # Basket service basket-service: @@ -74,6 +73,38 @@ services: REDIS_USERNAME: redis REDIS_PASSWORD: password + # Payment service + + payment-service: + image: goodfood-payment:1.0.0 + build: + context: . + dockerfile: ./payment/Dockerfile + depends_on: + - payment-postgres + restart: always + env_file: + - payment/.env.docker + ports: + - "50003" + - "4242:4242" + networks: + - goodfood-network + + payment-postgres: + image: postgres:latest + ports: + - "5432" + volumes: + - goodfood-payment-volume:/var/lib/postgresql/data + networks: + - goodfood-network + environment: + POSTGRES_USER: postgres + POSTGRES_PASSWORD: password + POSTGRES_DB: postgres + PGDATA: /var/lib/postgresql/data/pgdata + # Delivery service delivery-service: @@ -270,6 +301,7 @@ services: volumes: goodfood-user-volume: goodfood-basket-volume: + goodfood-payment-volume: goodfood-delivery-volume: goodfood-order-volume: goodfood-product-volume: diff --git a/services/gateway/.env.example b/services/gateway/.env.example index 294a02cf..c90c7eda 100644 --- a/services/gateway/.env.example +++ b/services/gateway/.env.example @@ -1,7 +1,7 @@ GATEWAY_PORT=50000 GATEWAY_USER_URL=user-service:50001 GATEWAY_BASKET_URL=basket-service:50002 -GATEWAY_PAYMENT_URL=50003 +GATEWAY_PAYMENT_URL=payment-service:50003 GATEWAY_PRODUCT_URL=product-service:50004 GATEWAY_RESTAURANT_URL=50005 GATEWAY_PROMOTION_URL=promotion-service:50006 diff --git a/services/gateway/README.md b/services/gateway/README.md index 16b83558..b74ab276 100644 --- a/services/gateway/README.md +++ b/services/gateway/README.md @@ -37,7 +37,8 @@ You can use the following tools to help you with the setup: 4. Create a `.env` file at the root of the project directory and add the environment variables values ( see `.env.example`). 5. Run `sh proto/build-protos.sh` to generate js file to create the clients. -5.1. Then replace all "grpc" package iteration by "@grpc/grpc-js" +5.1. Then replace all "import * as grpc from "grpc";" package iteration by "import * as grpc from "@grpc/grpc-js";" +All the occurence of the package "grpc" must be replaced by "@grpc/grpc-js" in the folder "services/gateway/src/proto" 6. Run `npm run start` to start the microservice. You can now access the microservice at `http://localhost:50000`. diff --git a/services/gateway/src/controller/payment/payment.controller.ts b/services/gateway/src/controller/payment/payment.controller.ts new file mode 100644 index 00000000..e7b10a5c --- /dev/null +++ b/services/gateway/src/controller/payment/payment.controller.ts @@ -0,0 +1,29 @@ +import {Request, Response, Router} from "express"; +import {GetPaymentRequest, GetPaymentsByUserRequest} from "@gateway/proto/payment_pb"; +import {paymentServiceClient} from "@gateway/services/clients/payment.client"; + +export const paymentRoutes = Router(); + +paymentRoutes.get('/api/payment/:id', (req: Request, res: Response) => { + const {id} = req.params; + + paymentServiceClient.getPayment(new GetPaymentRequest().setId(id), (error, response) => { + if (error) { + res.status(500).send({error: error.message}); + } else { + res.json(response.toObject()); + } + }); +}); + +paymentRoutes.get('/api/payment/by-user/:userId', (req: Request, res: Response) => { + const {id} = req.params; + + paymentServiceClient.getPaymentsByUser(new GetPaymentsByUserRequest().setId(id), (error, response) => { + if (error) { + res.status(500).send({error: error.message}); + } else { + res.json(response.toObject()); + } + }); +}); \ No newline at end of file diff --git a/services/gateway/src/controller/payment/stripe.controller.ts b/services/gateway/src/controller/payment/stripe.controller.ts new file mode 100644 index 00000000..6efbbdf0 --- /dev/null +++ b/services/gateway/src/controller/payment/stripe.controller.ts @@ -0,0 +1,17 @@ +import {Request, Response, Router} from "express"; +import {CreateCheckoutSessionRequest} from "@gateway/proto/payment_pb"; +import {stripeServiceClient} from "@gateway/services/clients/payment.client"; + +export const stripeRoutes = Router(); + +stripeRoutes.post('/api/payment/stripe', (req: Request, res: Response) => { + const {userId, name, email, total} = req.body; + const createCheckoutSessionRequest = new CreateCheckoutSessionRequest().setUserId(userId).setName(name).setEmail(email).setTotal(total); + stripeServiceClient.createCheckoutSession(createCheckoutSessionRequest, (error, response) => { + if (error) { + res.status(500).send({error: error.message}); + } else { + res.json(response.toObject()); + } + }); +}); diff --git a/services/gateway/src/server.ts b/services/gateway/src/server.ts index 8e7fbb0c..fce1c329 100644 --- a/services/gateway/src/server.ts +++ b/services/gateway/src/server.ts @@ -12,6 +12,8 @@ import {logRoutes} from "@gateway/controller/log/log.controller"; import {metricRoutes} from "@gateway/controller/metric/metric.controller"; import {basketRoutes} from "@gateway/controller/basket/basket.controller"; import {log, utils} from "@gateway/lib/log/log"; +import {stripeRoutes} from "@gateway/controller/payment/stripe.controller"; +import {paymentRoutes} from "@gateway/controller/payment/payment.controller"; const express = require('express'); const bodyParser = require('body-parser'); @@ -27,6 +29,12 @@ app.use('/', userRoutes app.use('/', basketRoutes // #swagger.tags = ['Basket'] ); +app.use('/', paymentRoutes +// #swagger.tags = ['Payment'] +); +app.use('/', stripeRoutes +// #swagger.tags = ['Payment'] +); app.use('/', orderRoutes // #swagger.tags = ['Order'] ); diff --git a/services/gateway/src/services/clients/payment.client.ts b/services/gateway/src/services/clients/payment.client.ts new file mode 100644 index 00000000..5a9c5039 --- /dev/null +++ b/services/gateway/src/services/clients/payment.client.ts @@ -0,0 +1,12 @@ +import services from '../../proto/payment_grpc_pb'; +import * as grpc from '@grpc/grpc-js'; + +const url = process.env.GATEWAY_PAYMENT_URL || "localhost:50003"; + +export const paymentServiceClient = new services.PaymentServiceClient( + url, + grpc.credentials.createInsecure()); + +export const stripeServiceClient = new services.StripeServiceClient( + url, + grpc.credentials.createInsecure()); \ No newline at end of file diff --git a/services/order/src/lib/reflection.ts b/services/order/src/lib/reflection.ts index e00ef94e..73f0d05e 100644 --- a/services/order/src/lib/reflection.ts +++ b/services/order/src/lib/reflection.ts @@ -16,7 +16,6 @@ export const addReflection = (server: Server, path: string) => { base_addReflection(server, path); } catch (err) { - console.log("here"); log.warn(`Reflection file ${resolvedPath} is not readable`); return; } diff --git a/services/payment/.env.docker b/services/payment/.env.docker new file mode 100644 index 00000000..8e253ab1 --- /dev/null +++ b/services/payment/.env.docker @@ -0,0 +1,10 @@ +DATABASE_URL=postgres://postgres:password@payment-postgres:5432/postgres +AMQP_URL=amqp://guest:guest@log-rabbitmq + +PORT=50003 + +STRIPE_API_KEY= +STRIPE_API_SECRET= +STRIPE_WEBHOOK_ENDPOINT="/webhook" +STRIPE_WEBHOOK_SECRET= +STRIPE_WEBHOOK_PORT=4242 \ No newline at end of file diff --git a/services/payment/.gitignore b/services/payment/.gitignore index 583204b4..82abeb3b 100644 --- a/services/payment/.gitignore +++ b/services/payment/.gitignore @@ -3,3 +3,4 @@ dist/ bin/ *.env* !*.env.example +!*.env.docker diff --git a/services/payment/src/lib/reflection.ts b/services/payment/src/lib/reflection.ts index 060091b0..a5544fcb 100644 --- a/services/payment/src/lib/reflection.ts +++ b/services/payment/src/lib/reflection.ts @@ -16,7 +16,6 @@ export const addReflection = (server: Server, path: string) => { base_addReflection(server, path); } catch (err) { - console.log("here"); log.warn(`Reflection file ${resolvedPath} is not readable`); return; } From 029a09aa69063fa63484792a7005f7ce72e7767c Mon Sep 17 00:00:00 2001 From: Pierre Lebigre Date: Sun, 20 Aug 2023 14:12:27 +0200 Subject: [PATCH 428/883] switch to pnpm.lock --- services/notification/package-lock.json | 1492 ----------------------- services/notification/pnpm-lock.yaml | 1039 ++++++++++++++++ 2 files changed, 1039 insertions(+), 1492 deletions(-) delete mode 100644 services/notification/package-lock.json create mode 100644 services/notification/pnpm-lock.yaml diff --git a/services/notification/package-lock.json b/services/notification/package-lock.json deleted file mode 100644 index 3f90893b..00000000 --- a/services/notification/package-lock.json +++ /dev/null @@ -1,1492 +0,0 @@ -{ - "name": "@goodfood/notification", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "@goodfood/notification", - "hasInstallScript": true, - "dependencies": { - "@grpc/grpc-js": "^1.9.0", - "@grpc/proto-loader": "^0.7.8", - "@plunk/node": "^2.0.0", - "@prisma/client": "5.1.0", - "@types/amqplib": "^0.10.1", - "amqplib": "^0.10.3", - "dotenv": "^16.3.1", - "esbuild": "^0.19.2", - "nodemon": "^3.0.1", - "path": "^0.12.7", - "ts-node": "^10.9.1", - "tsconfig-paths": "^4.2.0" - }, - "bin": { - "notification": "dist/index.js" - }, - "devDependencies": { - "prisma": "^5.1.0", - "typescript": "^5.1.6" - } - }, - "node_modules/@acuminous/bitsyntax": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/@acuminous/bitsyntax/-/bitsyntax-0.1.2.tgz", - "integrity": "sha512-29lUK80d1muEQqiUsSo+3A0yP6CdspgC95EnKBMi22Xlwt79i/En4Vr67+cXhU+cZjbti3TgGGC5wy1stIywVQ==", - "dependencies": { - "buffer-more-ints": "~1.0.0", - "debug": "^4.3.4", - "safe-buffer": "~5.1.2" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/@cspotcode/source-map-support": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", - "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", - "dependencies": { - "@jridgewell/trace-mapping": "0.3.9" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.2.tgz", - "integrity": "sha512-tM8yLeYVe7pRyAu9VMi/Q7aunpLwD139EY1S99xbQkT4/q2qa6eA4ige/WJQYdJ8GBL1K33pPFhPfPdJ/WzT8Q==", - "cpu": [ - "arm" - ], - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.2.tgz", - "integrity": "sha512-lsB65vAbe90I/Qe10OjkmrdxSX4UJDjosDgb8sZUKcg3oefEuW2OT2Vozz8ef7wrJbMcmhvCC+hciF8jY/uAkw==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.2.tgz", - "integrity": "sha512-qK/TpmHt2M/Hg82WXHRc/W/2SGo/l1thtDHZWqFq7oi24AjZ4O/CpPSu6ZuYKFkEgmZlFoa7CooAyYmuvnaG8w==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.2.tgz", - "integrity": "sha512-Ora8JokrvrzEPEpZO18ZYXkH4asCdc1DLdcVy8TGf5eWtPO1Ie4WroEJzwI52ZGtpODy3+m0a2yEX9l+KUn0tA==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.2.tgz", - "integrity": "sha512-tP+B5UuIbbFMj2hQaUr6EALlHOIOmlLM2FK7jeFBobPy2ERdohI4Ka6ZFjZ1ZYsrHE/hZimGuU90jusRE0pwDw==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.2.tgz", - "integrity": "sha512-YbPY2kc0acfzL1VPVK6EnAlig4f+l8xmq36OZkU0jzBVHcOTyQDhnKQaLzZudNJQyymd9OqQezeaBgkTGdTGeQ==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.2.tgz", - "integrity": "sha512-nSO5uZT2clM6hosjWHAsS15hLrwCvIWx+b2e3lZ3MwbYSaXwvfO528OF+dLjas1g3bZonciivI8qKR/Hm7IWGw==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.2.tgz", - "integrity": "sha512-Odalh8hICg7SOD7XCj0YLpYCEc+6mkoq63UnExDCiRA2wXEmGlK5JVrW50vZR9Qz4qkvqnHcpH+OFEggO3PgTg==", - "cpu": [ - "arm" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.2.tgz", - "integrity": "sha512-ig2P7GeG//zWlU0AggA3pV1h5gdix0MA3wgB+NsnBXViwiGgY77fuN9Wr5uoCrs2YzaYfogXgsWZbm+HGr09xg==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.2.tgz", - "integrity": "sha512-mLfp0ziRPOLSTek0Gd9T5B8AtzKAkoZE70fneiiyPlSnUKKI4lp+mGEnQXcQEHLJAcIYDPSyBvsUbKUG2ri/XQ==", - "cpu": [ - "ia32" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.2.tgz", - "integrity": "sha512-hn28+JNDTxxCpnYjdDYVMNTR3SKavyLlCHHkufHV91fkewpIyQchS1d8wSbmXhs1fiYDpNww8KTFlJ1dHsxeSw==", - "cpu": [ - "loong64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.2.tgz", - "integrity": "sha512-KbXaC0Sejt7vD2fEgPoIKb6nxkfYW9OmFUK9XQE4//PvGIxNIfPk1NmlHmMg6f25x57rpmEFrn1OotASYIAaTg==", - "cpu": [ - "mips64el" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.2.tgz", - "integrity": "sha512-dJ0kE8KTqbiHtA3Fc/zn7lCd7pqVr4JcT0JqOnbj4LLzYnp+7h8Qi4yjfq42ZlHfhOCM42rBh0EwHYLL6LEzcw==", - "cpu": [ - "ppc64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.2.tgz", - "integrity": "sha512-7Z/jKNFufZ/bbu4INqqCN6DDlrmOTmdw6D0gH+6Y7auok2r02Ur661qPuXidPOJ+FSgbEeQnnAGgsVynfLuOEw==", - "cpu": [ - "riscv64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.2.tgz", - "integrity": "sha512-U+RinR6aXXABFCcAY4gSlv4CL1oOVvSSCdseQmGO66H+XyuQGZIUdhG56SZaDJQcLmrSfRmx5XZOWyCJPRqS7g==", - "cpu": [ - "s390x" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.2.tgz", - "integrity": "sha512-oxzHTEv6VPm3XXNaHPyUTTte+3wGv7qVQtqaZCrgstI16gCuhNOtBXLEBkBREP57YTd68P0VgDgG73jSD8bwXQ==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.2.tgz", - "integrity": "sha512-WNa5zZk1XpTTwMDompZmvQLHszDDDN7lYjEHCUmAGB83Bgs20EMs7ICD+oKeT6xt4phV4NDdSi/8OfjPbSbZfQ==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.2.tgz", - "integrity": "sha512-S6kI1aT3S++Dedb7vxIuUOb3oAxqxk2Rh5rOXOTYnzN8JzW1VzBd+IqPiSpgitu45042SYD3HCoEyhLKQcDFDw==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.2.tgz", - "integrity": "sha512-VXSSMsmb+Z8LbsQGcBMiM+fYObDNRm8p7tkUDMPG/g4fhFX5DEFmjxIEa3N8Zr96SjsJ1woAhF0DUnS3MF3ARw==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.2.tgz", - "integrity": "sha512-5NayUlSAyb5PQYFAU9x3bHdsqB88RC3aM9lKDAz4X1mo/EchMIT1Q+pSeBXNgkfNmRecLXA0O8xP+x8V+g/LKg==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.2.tgz", - "integrity": "sha512-47gL/ek1v36iN0wL9L4Q2MFdujR0poLZMJwhO2/N3gA89jgHp4MR8DKCmwYtGNksbfJb9JoTtbkoe6sDhg2QTA==", - "cpu": [ - "ia32" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.2.tgz", - "integrity": "sha512-tcuhV7ncXBqbt/Ybf0IyrMcwVOAPDckMK9rXNHtF17UTK18OKLpg08glminN06pt2WCoALhXdLfSPbVvK/6fxw==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@grpc/grpc-js": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.9.0.tgz", - "integrity": "sha512-H8+iZh+kCE6VR/Krj6W28Y/ZlxoZ1fOzsNt77nrdE3knkbSelW1Uus192xOFCxHyeszLj8i4APQkSIXjAoOxXg==", - "dependencies": { - "@grpc/proto-loader": "^0.7.0", - "@types/node": ">=12.12.47" - }, - "engines": { - "node": "^8.13.0 || >=10.10.0" - } - }, - "node_modules/@grpc/proto-loader": { - "version": "0.7.8", - "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.8.tgz", - "integrity": "sha512-GU12e2c8dmdXb7XUlOgYWZ2o2i+z9/VeACkxTA/zzAe2IjclC5PnVL0lpgjhrqfpDYHzM8B1TF6pqWegMYAzlA==", - "dependencies": { - "@types/long": "^4.0.1", - "lodash.camelcase": "^4.3.0", - "long": "^4.0.0", - "protobufjs": "^7.2.4", - "yargs": "^17.7.2" - }, - "bin": { - "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", - "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", - "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", - "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, - "node_modules/@plunk/node": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@plunk/node/-/node-2.0.0.tgz", - "integrity": "sha512-53lgots3fWGAo1QdS18BdEpJl7A29O1F9rYVn/7DfJ07SpJ1ZlzUeeWGVrWGL7PRRZb4a9Tw7Tt8Wnw0Xorhjg==", - "dependencies": { - "native-fetch": "^4.0.2", - "tslib": "^2.4.0", - "undici": "^5.22.1" - } - }, - "node_modules/@prisma/client": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@prisma/client/-/client-5.1.0.tgz", - "integrity": "sha512-aIxuXlH3p3Vy91buodQhYgAD9m0yuxJzpXMhc1ejQ/WN3pNNWzBA0iDcBObLq8DMdszcXmoLAk3hiRq/ZwBsOw==", - "hasInstallScript": true, - "dependencies": { - "@prisma/engines-version": "5.1.0-28.a9b7003df90aa623086e4d6f4e43c72468e6339b" - }, - "engines": { - "node": ">=16.13" - }, - "peerDependencies": { - "prisma": "*" - }, - "peerDependenciesMeta": { - "prisma": { - "optional": true - } - } - }, - "node_modules/@prisma/engines": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-5.1.1.tgz", - "integrity": "sha512-NV/4nVNWFZSJCCIA3HIFJbbDKO/NARc9ej0tX5S9k2EVbkrFJC4Xt9b0u4rNZWL4V+F5LAjvta8vzEUw0rw+HA==", - "devOptional": true, - "hasInstallScript": true - }, - "node_modules/@prisma/engines-version": { - "version": "5.1.0-28.a9b7003df90aa623086e4d6f4e43c72468e6339b", - "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-5.1.0-28.a9b7003df90aa623086e4d6f4e43c72468e6339b.tgz", - "integrity": "sha512-jTwE2oy1yjICmTfnCR0ASIpuMZXZ18sUzQXB7V0RMbrM9OlcmbUwXPuYhnxXuWN8XwRmujeIhsXs/Zeh+fjPOQ==" - }, - "node_modules/@protobufjs/aspromise": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", - "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==" - }, - "node_modules/@protobufjs/base64": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", - "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" - }, - "node_modules/@protobufjs/codegen": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", - "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" - }, - "node_modules/@protobufjs/eventemitter": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", - "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==" - }, - "node_modules/@protobufjs/fetch": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", - "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", - "dependencies": { - "@protobufjs/aspromise": "^1.1.1", - "@protobufjs/inquire": "^1.1.0" - } - }, - "node_modules/@protobufjs/float": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", - "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==" - }, - "node_modules/@protobufjs/inquire": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", - "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==" - }, - "node_modules/@protobufjs/path": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", - "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==" - }, - "node_modules/@protobufjs/pool": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", - "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==" - }, - "node_modules/@protobufjs/utf8": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", - "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==" - }, - "node_modules/@tsconfig/node10": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", - "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==" - }, - "node_modules/@tsconfig/node12": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", - "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==" - }, - "node_modules/@tsconfig/node14": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", - "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==" - }, - "node_modules/@tsconfig/node16": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", - "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==" - }, - "node_modules/@types/amqplib": { - "version": "0.10.1", - "resolved": "https://registry.npmjs.org/@types/amqplib/-/amqplib-0.10.1.tgz", - "integrity": "sha512-j6ANKT79ncUDnAs/+9r9eDujxbeJoTjoVu33gHHcaPfmLQaMhvfbH2GqSe8KUM444epAp1Vl3peVOQfZk3UIqA==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/long": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz", - "integrity": "sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==" - }, - "node_modules/@types/node": { - "version": "20.5.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.5.1.tgz", - "integrity": "sha512-4tT2UrL5LBqDwoed9wZ6N3umC4Yhz3W3FloMmiiG4JwmUJWpie0c7lcnUNd4gtMKuDEO4wRVS8B6Xa0uMRsMKg==" - }, - "node_modules/abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" - }, - "node_modules/acorn": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", - "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-walk": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", - "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/amqplib": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/amqplib/-/amqplib-0.10.3.tgz", - "integrity": "sha512-UHmuSa7n8vVW/a5HGh2nFPqAEr8+cD4dEZ6u9GjP91nHfr1a54RyAKyra7Sb5NH7NBKOUlyQSMXIp0qAixKexw==", - "dependencies": { - "@acuminous/bitsyntax": "^0.1.2", - "buffer-more-ints": "~1.0.0", - "readable-stream": "1.x >=1.1.9", - "url-parse": "~1.5.10" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==" - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" - }, - "node_modules/binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "engines": { - "node": ">=8" - } - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/buffer-more-ints": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-more-ints/-/buffer-more-ints-1.0.0.tgz", - "integrity": "sha512-EMetuGFz5SLsT0QTnXzINh4Ksr+oo4i+UGTXEshiGCQWnsgSs7ZhJ8fzlwQ+OzEMs0MpDAMr1hxnblp5a4vcHg==" - }, - "node_modules/busboy": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", - "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", - "dependencies": { - "streamsearch": "^1.1.0" - }, - "engines": { - "node": ">=10.16.0" - } - }, - "node_modules/chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" - }, - "node_modules/core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" - }, - "node_modules/create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==" - }, - "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/dotenv": { - "version": "16.3.1", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.3.1.tgz", - "integrity": "sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/motdotla/dotenv?sponsor=1" - } - }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "node_modules/esbuild": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.2.tgz", - "integrity": "sha512-G6hPax8UbFakEj3hWO0Vs52LQ8k3lnBhxZWomUJDxfz3rZTLqF5k/FCzuNdLx2RbpBiQQF9H9onlDDH1lZsnjg==", - "hasInstallScript": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/android-arm": "0.19.2", - "@esbuild/android-arm64": "0.19.2", - "@esbuild/android-x64": "0.19.2", - "@esbuild/darwin-arm64": "0.19.2", - "@esbuild/darwin-x64": "0.19.2", - "@esbuild/freebsd-arm64": "0.19.2", - "@esbuild/freebsd-x64": "0.19.2", - "@esbuild/linux-arm": "0.19.2", - "@esbuild/linux-arm64": "0.19.2", - "@esbuild/linux-ia32": "0.19.2", - "@esbuild/linux-loong64": "0.19.2", - "@esbuild/linux-mips64el": "0.19.2", - "@esbuild/linux-ppc64": "0.19.2", - "@esbuild/linux-riscv64": "0.19.2", - "@esbuild/linux-s390x": "0.19.2", - "@esbuild/linux-x64": "0.19.2", - "@esbuild/netbsd-x64": "0.19.2", - "@esbuild/openbsd-x64": "0.19.2", - "@esbuild/sunos-x64": "0.19.2", - "@esbuild/win32-arm64": "0.19.2", - "@esbuild/win32-ia32": "0.19.2", - "@esbuild/win32-x64": "0.19.2" - } - }, - "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "engines": { - "node": ">=6" - } - }, - "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "engines": { - "node": ">=4" - } - }, - "node_modules/ignore-by-default": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", - "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==" - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" - }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/lodash.camelcase": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", - "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==" - }, - "node_modules/long": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", - "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" - }, - "node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==" - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "node_modules/native-fetch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/native-fetch/-/native-fetch-4.0.2.tgz", - "integrity": "sha512-4QcVlKFtv2EYVS5MBgsGX5+NWKtbDbIECdUXDBGDMAZXq3Jkv9zf+y8iS7Ub8fEdga3GpYeazp9gauNqXHJOCg==", - "peerDependencies": { - "undici": "*" - } - }, - "node_modules/nodemon": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.0.1.tgz", - "integrity": "sha512-g9AZ7HmkhQkqXkRc20w+ZfQ73cHLbE8hnPbtaFbFtCumZsjyMhKk9LajQ07U5Ux28lvFjZ5X7HvWR1xzU8jHVw==", - "dependencies": { - "chokidar": "^3.5.2", - "debug": "^3.2.7", - "ignore-by-default": "^1.0.1", - "minimatch": "^3.1.2", - "pstree.remy": "^1.1.8", - "semver": "^7.5.3", - "simple-update-notifier": "^2.0.0", - "supports-color": "^5.5.0", - "touch": "^3.1.0", - "undefsafe": "^2.0.5" - }, - "bin": { - "nodemon": "bin/nodemon.js" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/nodemon" - } - }, - "node_modules/nodemon/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/nopt": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", - "integrity": "sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==", - "dependencies": { - "abbrev": "1" - }, - "bin": { - "nopt": "bin/nopt.js" - }, - "engines": { - "node": "*" - } - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path": { - "version": "0.12.7", - "resolved": "https://registry.npmjs.org/path/-/path-0.12.7.tgz", - "integrity": "sha512-aXXC6s+1w7otVF9UletFkFcDsJeO7lSZBPUQhtb5O0xJe8LtYhj/GxldoL09bBj9+ZmE2hNoHqQSFMN5fikh4Q==", - "dependencies": { - "process": "^0.11.1", - "util": "^0.10.3" - } - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/prisma": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/prisma/-/prisma-5.1.1.tgz", - "integrity": "sha512-WJFG/U7sMmcc6TjJTTifTfpI6Wjoh55xl4AzopVwAdyK68L9/ogNo8QQ2cxuUjJf/Wa82z/uhyh3wMzvRIBphg==", - "devOptional": true, - "hasInstallScript": true, - "dependencies": { - "@prisma/engines": "5.1.1" - }, - "bin": { - "prisma": "build/index.js" - }, - "engines": { - "node": ">=16.13" - } - }, - "node_modules/process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", - "engines": { - "node": ">= 0.6.0" - } - }, - "node_modules/protobufjs": { - "version": "7.2.4", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.2.4.tgz", - "integrity": "sha512-AT+RJgD2sH8phPmCf7OUZR8xGdcJRga4+1cOaXJ64hvcSkVhNcRHOwIxUatPH15+nj59WAGTDv3LSGZPEQbJaQ==", - "hasInstallScript": true, - "dependencies": { - "@protobufjs/aspromise": "^1.1.2", - "@protobufjs/base64": "^1.1.2", - "@protobufjs/codegen": "^2.0.4", - "@protobufjs/eventemitter": "^1.1.0", - "@protobufjs/fetch": "^1.1.0", - "@protobufjs/float": "^1.0.2", - "@protobufjs/inquire": "^1.1.0", - "@protobufjs/path": "^1.1.2", - "@protobufjs/pool": "^1.1.0", - "@protobufjs/utf8": "^1.1.0", - "@types/node": ">=13.7.0", - "long": "^5.0.0" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/protobufjs/node_modules/long": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", - "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==" - }, - "node_modules/pstree.remy": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", - "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==" - }, - "node_modules/querystringify": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", - "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==" - }, - "node_modules/readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==" - }, - "node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/simple-update-notifier": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", - "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==", - "dependencies": { - "semver": "^7.5.3" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/streamsearch": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", - "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==" - }, - "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "engines": { - "node": ">=4" - } - }, - "node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/touch": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", - "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", - "dependencies": { - "nopt": "~1.0.10" - }, - "bin": { - "nodetouch": "bin/nodetouch.js" - } - }, - "node_modules/ts-node": { - "version": "10.9.1", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", - "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", - "dependencies": { - "@cspotcode/source-map-support": "^0.8.0", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "v8-compile-cache-lib": "^3.0.1", - "yn": "3.1.1" - }, - "bin": { - "ts-node": "dist/bin.js", - "ts-node-cwd": "dist/bin-cwd.js", - "ts-node-esm": "dist/bin-esm.js", - "ts-node-script": "dist/bin-script.js", - "ts-node-transpile-only": "dist/bin-transpile.js", - "ts-script": "dist/bin-script-deprecated.js" - }, - "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 - } - } - }, - "node_modules/tsconfig-paths": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", - "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==", - "dependencies": { - "json5": "^2.2.2", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" - }, - "node_modules/typescript": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz", - "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/undefsafe": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", - "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==" - }, - "node_modules/undici": { - "version": "5.23.0", - "resolved": "https://registry.npmjs.org/undici/-/undici-5.23.0.tgz", - "integrity": "sha512-1D7w+fvRsqlQ9GscLBwcAJinqcZGHUKjbOmXdlE/v8BvEGXjeWAax+341q44EuTcHXXnfyKNbKRq4Lg7OzhMmg==", - "dependencies": { - "busboy": "^1.6.0" - }, - "engines": { - "node": ">=14.0" - } - }, - "node_modules/url-parse": { - "version": "1.5.10", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", - "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", - "dependencies": { - "querystringify": "^2.1.1", - "requires-port": "^1.0.0" - } - }, - "node_modules/util": { - "version": "0.10.4", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", - "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==", - "dependencies": { - "inherits": "2.0.3" - } - }, - "node_modules/util/node_modules/inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==" - }, - "node_modules/v8-compile-cache-lib": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", - "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==" - }, - "node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "engines": { - "node": ">=10" - } - }, - "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, - "node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "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.5", - "yargs-parser": "^21.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "engines": { - "node": ">=12" - } - }, - "node_modules/yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "engines": { - "node": ">=6" - } - } - } -} diff --git a/services/notification/pnpm-lock.yaml b/services/notification/pnpm-lock.yaml new file mode 100644 index 00000000..7043033b --- /dev/null +++ b/services/notification/pnpm-lock.yaml @@ -0,0 +1,1039 @@ +lockfileVersion: '6.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +dependencies: + '@grpc/grpc-js': + specifier: ^1.9.0 + version: 1.9.0 + '@grpc/proto-loader': + specifier: ^0.7.8 + version: 0.7.8 + '@plunk/node': + specifier: ^2.0.0 + version: 2.0.0 + '@prisma/client': + specifier: 5.1.0 + version: 5.1.0(prisma@5.1.1) + '@types/amqplib': + specifier: ^0.10.1 + version: 0.10.1 + amqplib: + specifier: ^0.10.3 + version: 0.10.3 + dotenv: + specifier: ^16.3.1 + version: 16.3.1 + esbuild: + specifier: ^0.19.2 + version: 0.19.2 + nodemon: + specifier: ^3.0.1 + version: 3.0.1 + path: + specifier: ^0.12.7 + version: 0.12.7 + ts-node: + specifier: ^10.9.1 + version: 10.9.1(@types/node@20.5.1)(typescript@5.1.6) + tsconfig-paths: + specifier: ^4.2.0 + version: 4.2.0 + +devDependencies: + prisma: + specifier: ^5.1.1 + version: 5.1.1 + typescript: + specifier: ^5.1.6 + version: 5.1.6 + +packages: + + /@acuminous/bitsyntax@0.1.2: + resolution: {integrity: sha512-29lUK80d1muEQqiUsSo+3A0yP6CdspgC95EnKBMi22Xlwt79i/En4Vr67+cXhU+cZjbti3TgGGC5wy1stIywVQ==} + engines: {node: '>=0.8'} + dependencies: + buffer-more-ints: 1.0.0 + debug: 4.3.4 + safe-buffer: 5.1.2 + transitivePeerDependencies: + - supports-color + dev: false + + /@cspotcode/source-map-support@0.8.1: + resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} + engines: {node: '>=12'} + dependencies: + '@jridgewell/trace-mapping': 0.3.9 + dev: false + + /@esbuild/android-arm64@0.19.2: + resolution: {integrity: sha512-lsB65vAbe90I/Qe10OjkmrdxSX4UJDjosDgb8sZUKcg3oefEuW2OT2Vozz8ef7wrJbMcmhvCC+hciF8jY/uAkw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: false + optional: true + + /@esbuild/android-arm@0.19.2: + resolution: {integrity: sha512-tM8yLeYVe7pRyAu9VMi/Q7aunpLwD139EY1S99xbQkT4/q2qa6eA4ige/WJQYdJ8GBL1K33pPFhPfPdJ/WzT8Q==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + requiresBuild: true + dev: false + optional: true + + /@esbuild/android-x64@0.19.2: + resolution: {integrity: sha512-qK/TpmHt2M/Hg82WXHRc/W/2SGo/l1thtDHZWqFq7oi24AjZ4O/CpPSu6ZuYKFkEgmZlFoa7CooAyYmuvnaG8w==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + requiresBuild: true + dev: false + optional: true + + /@esbuild/darwin-arm64@0.19.2: + resolution: {integrity: sha512-Ora8JokrvrzEPEpZO18ZYXkH4asCdc1DLdcVy8TGf5eWtPO1Ie4WroEJzwI52ZGtpODy3+m0a2yEX9l+KUn0tA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@esbuild/darwin-x64@0.19.2: + resolution: {integrity: sha512-tP+B5UuIbbFMj2hQaUr6EALlHOIOmlLM2FK7jeFBobPy2ERdohI4Ka6ZFjZ1ZYsrHE/hZimGuU90jusRE0pwDw==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@esbuild/freebsd-arm64@0.19.2: + resolution: {integrity: sha512-YbPY2kc0acfzL1VPVK6EnAlig4f+l8xmq36OZkU0jzBVHcOTyQDhnKQaLzZudNJQyymd9OqQezeaBgkTGdTGeQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: false + optional: true + + /@esbuild/freebsd-x64@0.19.2: + resolution: {integrity: sha512-nSO5uZT2clM6hosjWHAsS15hLrwCvIWx+b2e3lZ3MwbYSaXwvfO528OF+dLjas1g3bZonciivI8qKR/Hm7IWGw==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-arm64@0.19.2: + resolution: {integrity: sha512-ig2P7GeG//zWlU0AggA3pV1h5gdix0MA3wgB+NsnBXViwiGgY77fuN9Wr5uoCrs2YzaYfogXgsWZbm+HGr09xg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-arm@0.19.2: + resolution: {integrity: sha512-Odalh8hICg7SOD7XCj0YLpYCEc+6mkoq63UnExDCiRA2wXEmGlK5JVrW50vZR9Qz4qkvqnHcpH+OFEggO3PgTg==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-ia32@0.19.2: + resolution: {integrity: sha512-mLfp0ziRPOLSTek0Gd9T5B8AtzKAkoZE70fneiiyPlSnUKKI4lp+mGEnQXcQEHLJAcIYDPSyBvsUbKUG2ri/XQ==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-loong64@0.19.2: + resolution: {integrity: sha512-hn28+JNDTxxCpnYjdDYVMNTR3SKavyLlCHHkufHV91fkewpIyQchS1d8wSbmXhs1fiYDpNww8KTFlJ1dHsxeSw==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-mips64el@0.19.2: + resolution: {integrity: sha512-KbXaC0Sejt7vD2fEgPoIKb6nxkfYW9OmFUK9XQE4//PvGIxNIfPk1NmlHmMg6f25x57rpmEFrn1OotASYIAaTg==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-ppc64@0.19.2: + resolution: {integrity: sha512-dJ0kE8KTqbiHtA3Fc/zn7lCd7pqVr4JcT0JqOnbj4LLzYnp+7h8Qi4yjfq42ZlHfhOCM42rBh0EwHYLL6LEzcw==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-riscv64@0.19.2: + resolution: {integrity: sha512-7Z/jKNFufZ/bbu4INqqCN6DDlrmOTmdw6D0gH+6Y7auok2r02Ur661qPuXidPOJ+FSgbEeQnnAGgsVynfLuOEw==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-s390x@0.19.2: + resolution: {integrity: sha512-U+RinR6aXXABFCcAY4gSlv4CL1oOVvSSCdseQmGO66H+XyuQGZIUdhG56SZaDJQcLmrSfRmx5XZOWyCJPRqS7g==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-x64@0.19.2: + resolution: {integrity: sha512-oxzHTEv6VPm3XXNaHPyUTTte+3wGv7qVQtqaZCrgstI16gCuhNOtBXLEBkBREP57YTd68P0VgDgG73jSD8bwXQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/netbsd-x64@0.19.2: + resolution: {integrity: sha512-WNa5zZk1XpTTwMDompZmvQLHszDDDN7lYjEHCUmAGB83Bgs20EMs7ICD+oKeT6xt4phV4NDdSi/8OfjPbSbZfQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: false + optional: true + + /@esbuild/openbsd-x64@0.19.2: + resolution: {integrity: sha512-S6kI1aT3S++Dedb7vxIuUOb3oAxqxk2Rh5rOXOTYnzN8JzW1VzBd+IqPiSpgitu45042SYD3HCoEyhLKQcDFDw==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: false + optional: true + + /@esbuild/sunos-x64@0.19.2: + resolution: {integrity: sha512-VXSSMsmb+Z8LbsQGcBMiM+fYObDNRm8p7tkUDMPG/g4fhFX5DEFmjxIEa3N8Zr96SjsJ1woAhF0DUnS3MF3ARw==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: false + optional: true + + /@esbuild/win32-arm64@0.19.2: + resolution: {integrity: sha512-5NayUlSAyb5PQYFAU9x3bHdsqB88RC3aM9lKDAz4X1mo/EchMIT1Q+pSeBXNgkfNmRecLXA0O8xP+x8V+g/LKg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@esbuild/win32-ia32@0.19.2: + resolution: {integrity: sha512-47gL/ek1v36iN0wL9L4Q2MFdujR0poLZMJwhO2/N3gA89jgHp4MR8DKCmwYtGNksbfJb9JoTtbkoe6sDhg2QTA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@esbuild/win32-x64@0.19.2: + resolution: {integrity: sha512-tcuhV7ncXBqbt/Ybf0IyrMcwVOAPDckMK9rXNHtF17UTK18OKLpg08glminN06pt2WCoALhXdLfSPbVvK/6fxw==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@grpc/grpc-js@1.9.0: + resolution: {integrity: sha512-H8+iZh+kCE6VR/Krj6W28Y/ZlxoZ1fOzsNt77nrdE3knkbSelW1Uus192xOFCxHyeszLj8i4APQkSIXjAoOxXg==} + engines: {node: ^8.13.0 || >=10.10.0} + dependencies: + '@grpc/proto-loader': 0.7.8 + '@types/node': 20.5.1 + dev: false + + /@grpc/proto-loader@0.7.8: + resolution: {integrity: sha512-GU12e2c8dmdXb7XUlOgYWZ2o2i+z9/VeACkxTA/zzAe2IjclC5PnVL0lpgjhrqfpDYHzM8B1TF6pqWegMYAzlA==} + engines: {node: '>=6'} + hasBin: true + dependencies: + '@types/long': 4.0.2 + lodash.camelcase: 4.3.0 + long: 4.0.0 + protobufjs: 7.2.4 + yargs: 17.7.2 + dev: false + + /@jridgewell/resolve-uri@3.1.1: + resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} + engines: {node: '>=6.0.0'} + dev: false + + /@jridgewell/sourcemap-codec@1.4.15: + resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + dev: false + + /@jridgewell/trace-mapping@0.3.9: + resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} + dependencies: + '@jridgewell/resolve-uri': 3.1.1 + '@jridgewell/sourcemap-codec': 1.4.15 + dev: false + + /@plunk/node@2.0.0: + resolution: {integrity: sha512-53lgots3fWGAo1QdS18BdEpJl7A29O1F9rYVn/7DfJ07SpJ1ZlzUeeWGVrWGL7PRRZb4a9Tw7Tt8Wnw0Xorhjg==} + dependencies: + native-fetch: 4.0.2(undici@5.23.0) + tslib: 2.6.2 + undici: 5.23.0 + dev: false + + /@prisma/client@5.1.0(prisma@5.1.1): + resolution: {integrity: sha512-aIxuXlH3p3Vy91buodQhYgAD9m0yuxJzpXMhc1ejQ/WN3pNNWzBA0iDcBObLq8DMdszcXmoLAk3hiRq/ZwBsOw==} + engines: {node: '>=16.13'} + requiresBuild: true + peerDependencies: + prisma: '*' + peerDependenciesMeta: + prisma: + optional: true + dependencies: + '@prisma/engines-version': 5.1.0-28.a9b7003df90aa623086e4d6f4e43c72468e6339b + prisma: 5.1.1 + dev: false + + /@prisma/engines-version@5.1.0-28.a9b7003df90aa623086e4d6f4e43c72468e6339b: + resolution: {integrity: sha512-jTwE2oy1yjICmTfnCR0ASIpuMZXZ18sUzQXB7V0RMbrM9OlcmbUwXPuYhnxXuWN8XwRmujeIhsXs/Zeh+fjPOQ==} + dev: false + + /@prisma/engines@5.1.1: + resolution: {integrity: sha512-NV/4nVNWFZSJCCIA3HIFJbbDKO/NARc9ej0tX5S9k2EVbkrFJC4Xt9b0u4rNZWL4V+F5LAjvta8vzEUw0rw+HA==} + requiresBuild: true + + /@protobufjs/aspromise@1.1.2: + resolution: {integrity: sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==} + dev: false + + /@protobufjs/base64@1.1.2: + resolution: {integrity: sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==} + dev: false + + /@protobufjs/codegen@2.0.4: + resolution: {integrity: sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==} + dev: false + + /@protobufjs/eventemitter@1.1.0: + resolution: {integrity: sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==} + dev: false + + /@protobufjs/fetch@1.1.0: + resolution: {integrity: sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==} + dependencies: + '@protobufjs/aspromise': 1.1.2 + '@protobufjs/inquire': 1.1.0 + dev: false + + /@protobufjs/float@1.0.2: + resolution: {integrity: sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==} + dev: false + + /@protobufjs/inquire@1.1.0: + resolution: {integrity: sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==} + dev: false + + /@protobufjs/path@1.1.2: + resolution: {integrity: sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==} + dev: false + + /@protobufjs/pool@1.1.0: + resolution: {integrity: sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==} + dev: false + + /@protobufjs/utf8@1.1.0: + resolution: {integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==} + dev: false + + /@tsconfig/node10@1.0.9: + resolution: {integrity: sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==} + dev: false + + /@tsconfig/node12@1.0.11: + resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} + dev: false + + /@tsconfig/node14@1.0.3: + resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} + dev: false + + /@tsconfig/node16@1.0.4: + resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} + dev: false + + /@types/amqplib@0.10.1: + resolution: {integrity: sha512-j6ANKT79ncUDnAs/+9r9eDujxbeJoTjoVu33gHHcaPfmLQaMhvfbH2GqSe8KUM444epAp1Vl3peVOQfZk3UIqA==} + dependencies: + '@types/node': 20.5.1 + dev: false + + /@types/long@4.0.2: + resolution: {integrity: sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==} + dev: false + + /@types/node@20.5.1: + resolution: {integrity: sha512-4tT2UrL5LBqDwoed9wZ6N3umC4Yhz3W3FloMmiiG4JwmUJWpie0c7lcnUNd4gtMKuDEO4wRVS8B6Xa0uMRsMKg==} + dev: false + + /abbrev@1.1.1: + resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} + dev: false + + /acorn-walk@8.2.0: + resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} + engines: {node: '>=0.4.0'} + dev: false + + /acorn@8.10.0: + resolution: {integrity: sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==} + engines: {node: '>=0.4.0'} + hasBin: true + dev: false + + /amqplib@0.10.3: + resolution: {integrity: sha512-UHmuSa7n8vVW/a5HGh2nFPqAEr8+cD4dEZ6u9GjP91nHfr1a54RyAKyra7Sb5NH7NBKOUlyQSMXIp0qAixKexw==} + engines: {node: '>=10'} + dependencies: + '@acuminous/bitsyntax': 0.1.2 + buffer-more-ints: 1.0.0 + readable-stream: 1.1.14 + url-parse: 1.5.10 + transitivePeerDependencies: + - supports-color + dev: false + + /ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + dev: false + + /ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + dependencies: + color-convert: 2.0.1 + dev: false + + /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: false + + /arg@4.1.3: + resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} + dev: false + + /balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + dev: false + + /binary-extensions@2.2.0: + resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} + engines: {node: '>=8'} + 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 + + /buffer-more-ints@1.0.0: + resolution: {integrity: sha512-EMetuGFz5SLsT0QTnXzINh4Ksr+oo4i+UGTXEshiGCQWnsgSs7ZhJ8fzlwQ+OzEMs0MpDAMr1hxnblp5a4vcHg==} + dev: false + + /busboy@1.6.0: + resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} + engines: {node: '>=10.16.0'} + dependencies: + streamsearch: 1.1.0 + dev: false + + /chokidar@3.5.3: + resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} + engines: {node: '>= 8.10.0'} + dependencies: + anymatch: 3.1.3 + braces: 3.0.2 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.2 + 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 + 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 + + /core-util-is@1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + dev: false + + /create-require@1.1.1: + resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} + dev: false + + /debug@3.2.7(supports-color@5.5.0): + resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.3 + supports-color: 5.5.0 + 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 + dev: false + + /diff@4.0.2: + resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} + engines: {node: '>=0.3.1'} + dev: false + + /dotenv@16.3.1: + resolution: {integrity: sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==} + engines: {node: '>=12'} + dev: false + + /emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + dev: false + + /esbuild@0.19.2: + resolution: {integrity: sha512-G6hPax8UbFakEj3hWO0Vs52LQ8k3lnBhxZWomUJDxfz3rZTLqF5k/FCzuNdLx2RbpBiQQF9H9onlDDH1lZsnjg==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/android-arm': 0.19.2 + '@esbuild/android-arm64': 0.19.2 + '@esbuild/android-x64': 0.19.2 + '@esbuild/darwin-arm64': 0.19.2 + '@esbuild/darwin-x64': 0.19.2 + '@esbuild/freebsd-arm64': 0.19.2 + '@esbuild/freebsd-x64': 0.19.2 + '@esbuild/linux-arm': 0.19.2 + '@esbuild/linux-arm64': 0.19.2 + '@esbuild/linux-ia32': 0.19.2 + '@esbuild/linux-loong64': 0.19.2 + '@esbuild/linux-mips64el': 0.19.2 + '@esbuild/linux-ppc64': 0.19.2 + '@esbuild/linux-riscv64': 0.19.2 + '@esbuild/linux-s390x': 0.19.2 + '@esbuild/linux-x64': 0.19.2 + '@esbuild/netbsd-x64': 0.19.2 + '@esbuild/openbsd-x64': 0.19.2 + '@esbuild/sunos-x64': 0.19.2 + '@esbuild/win32-arm64': 0.19.2 + '@esbuild/win32-ia32': 0.19.2 + '@esbuild/win32-x64': 0.19.2 + dev: false + + /escalade@3.1.1: + resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} + engines: {node: '>=6'} + 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 + + /fsevents@2.3.2: + resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + dev: false + + /glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + dependencies: + is-glob: 4.0.3 + dev: false + + /has-flag@3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + dev: false + + /ignore-by-default@1.0.1: + resolution: {integrity: sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==} + dev: false + + /inherits@2.0.3: + resolution: {integrity: sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==} + dev: false + + /inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + dev: false + + /is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + dependencies: + binary-extensions: 2.2.0 + dev: false + + /is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + dev: false + + /is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + 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-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + dev: false + + /isarray@0.0.1: + resolution: {integrity: sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==} + dev: false + + /json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + dev: false + + /lodash.camelcase@4.3.0: + resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} + dev: false + + /long@4.0.0: + resolution: {integrity: sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==} + dev: false + + /long@5.2.3: + resolution: {integrity: sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==} + dev: false + + /lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + dependencies: + yallist: 4.0.0 + dev: false + + /make-error@1.3.6: + resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + dev: false + + /minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + dependencies: + brace-expansion: 1.1.11 + dev: false + + /minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + dev: false + + /ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + dev: false + + /ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + dev: false + + /native-fetch@4.0.2(undici@5.23.0): + resolution: {integrity: sha512-4QcVlKFtv2EYVS5MBgsGX5+NWKtbDbIECdUXDBGDMAZXq3Jkv9zf+y8iS7Ub8fEdga3GpYeazp9gauNqXHJOCg==} + peerDependencies: + undici: '*' + dependencies: + undici: 5.23.0 + dev: false + + /nodemon@3.0.1: + resolution: {integrity: sha512-g9AZ7HmkhQkqXkRc20w+ZfQ73cHLbE8hnPbtaFbFtCumZsjyMhKk9LajQ07U5Ux28lvFjZ5X7HvWR1xzU8jHVw==} + engines: {node: '>=10'} + hasBin: true + dependencies: + chokidar: 3.5.3 + debug: 3.2.7(supports-color@5.5.0) + ignore-by-default: 1.0.1 + minimatch: 3.1.2 + pstree.remy: 1.1.8 + semver: 7.5.4 + simple-update-notifier: 2.0.0 + supports-color: 5.5.0 + touch: 3.1.0 + undefsafe: 2.0.5 + dev: false + + /nopt@1.0.10: + resolution: {integrity: sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==} + hasBin: true + dependencies: + abbrev: 1.1.1 + dev: false + + /normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + dev: false + + /path@0.12.7: + resolution: {integrity: sha512-aXXC6s+1w7otVF9UletFkFcDsJeO7lSZBPUQhtb5O0xJe8LtYhj/GxldoL09bBj9+ZmE2hNoHqQSFMN5fikh4Q==} + dependencies: + process: 0.11.10 + util: 0.10.4 + dev: false + + /picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + dev: false + + /prisma@5.1.1: + resolution: {integrity: sha512-WJFG/U7sMmcc6TjJTTifTfpI6Wjoh55xl4AzopVwAdyK68L9/ogNo8QQ2cxuUjJf/Wa82z/uhyh3wMzvRIBphg==} + engines: {node: '>=16.13'} + hasBin: true + requiresBuild: true + dependencies: + '@prisma/engines': 5.1.1 + + /process@0.11.10: + resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} + engines: {node: '>= 0.6.0'} + dev: false + + /protobufjs@7.2.4: + resolution: {integrity: sha512-AT+RJgD2sH8phPmCf7OUZR8xGdcJRga4+1cOaXJ64hvcSkVhNcRHOwIxUatPH15+nj59WAGTDv3LSGZPEQbJaQ==} + engines: {node: '>=12.0.0'} + requiresBuild: true + dependencies: + '@protobufjs/aspromise': 1.1.2 + '@protobufjs/base64': 1.1.2 + '@protobufjs/codegen': 2.0.4 + '@protobufjs/eventemitter': 1.1.0 + '@protobufjs/fetch': 1.1.0 + '@protobufjs/float': 1.0.2 + '@protobufjs/inquire': 1.1.0 + '@protobufjs/path': 1.1.2 + '@protobufjs/pool': 1.1.0 + '@protobufjs/utf8': 1.1.0 + '@types/node': 20.5.1 + long: 5.2.3 + dev: false + + /pstree.remy@1.1.8: + resolution: {integrity: sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==} + dev: false + + /querystringify@2.2.0: + resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} + dev: false + + /readable-stream@1.1.14: + resolution: {integrity: sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==} + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 0.0.1 + string_decoder: 0.10.31 + dev: false + + /readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + dependencies: + picomatch: 2.3.1 + dev: false + + /require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + dev: false + + /requires-port@1.0.0: + resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} + dev: false + + /safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + dev: false + + /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 + dev: false + + /simple-update-notifier@2.0.0: + resolution: {integrity: sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==} + engines: {node: '>=10'} + dependencies: + semver: 7.5.4 + dev: false + + /streamsearch@1.1.0: + resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} + engines: {node: '>=10.0.0'} + dev: false + + /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 + dev: false + + /string_decoder@0.10.31: + resolution: {integrity: sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==} + dev: false + + /strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + dependencies: + ansi-regex: 5.0.1 + dev: false + + /strip-bom@3.0.0: + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} + dev: false + + /supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + dependencies: + has-flag: 3.0.0 + 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 + + /touch@3.1.0: + resolution: {integrity: sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==} + hasBin: true + dependencies: + nopt: 1.0.10 + dev: false + + /ts-node@10.9.1(@types/node@20.5.1)(typescript@5.1.6): + 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': 20.5.1 + 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.1.6 + v8-compile-cache-lib: 3.0.1 + yn: 3.1.1 + dev: false + + /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: false + + /tslib@2.6.2: + resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} + dev: false + + /typescript@5.1.6: + resolution: {integrity: sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==} + engines: {node: '>=14.17'} + hasBin: true + + /undefsafe@2.0.5: + resolution: {integrity: sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==} + dev: false + + /undici@5.23.0: + resolution: {integrity: sha512-1D7w+fvRsqlQ9GscLBwcAJinqcZGHUKjbOmXdlE/v8BvEGXjeWAax+341q44EuTcHXXnfyKNbKRq4Lg7OzhMmg==} + engines: {node: '>=14.0'} + dependencies: + busboy: 1.6.0 + dev: false + + /url-parse@1.5.10: + resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} + dependencies: + querystringify: 2.2.0 + requires-port: 1.0.0 + dev: false + + /util@0.10.4: + resolution: {integrity: sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==} + dependencies: + inherits: 2.0.3 + dev: false + + /v8-compile-cache-lib@3.0.1: + resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} + dev: false + + /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 + dev: false + + /y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + dev: false + + /yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + dev: false + + /yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + 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 + dev: false + + /yn@3.1.1: + resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} + engines: {node: '>=6'} + dev: false From ad49adeb39c6cbd8f17d851501b0966de6ca49f9 Mon Sep 17 00:00:00 2001 From: Florian Leroux <10078837+floriaaan@users.noreply.github.com> Date: Sun, 20 Aug 2023 14:29:36 +0200 Subject: [PATCH 429/883] ref: delete dist/index.js --- services/notification/dist/index.js | 54652 -------------------------- 1 file changed, 54652 deletions(-) delete mode 100644 services/notification/dist/index.js diff --git a/services/notification/dist/index.js b/services/notification/dist/index.js deleted file mode 100644 index e882dda7..00000000 --- a/services/notification/dist/index.js +++ /dev/null @@ -1,54652 +0,0 @@ -"use strict"; -var __create = Object.create; -var __defProp = Object.defineProperty; -var __getOwnPropDesc = Object.getOwnPropertyDescriptor; -var __getOwnPropNames = Object.getOwnPropertyNames; -var __getProtoOf = Object.getPrototypeOf; -var __hasOwnProp = Object.prototype.hasOwnProperty; -var __esm = (fn, res) => function __init() { - return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res; -}; -var __commonJS = (cb, mod2) => function __require() { - return mod2 || (0, cb[__getOwnPropNames(cb)[0]])((mod2 = { exports: {} }).exports, mod2), mod2.exports; -}; -var __export = (target, all) => { - for (var name in all) - __defProp(target, name, { get: all[name], enumerable: true }); -}; -var __copyProps = (to2, from, except, desc) => { - if (from && typeof from === "object" || typeof from === "function") { - for (let key of __getOwnPropNames(from)) - if (!__hasOwnProp.call(to2, key) && key !== except) - __defProp(to2, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); - } - return to2; -}; -var __toESM = (mod2, isNodeMode, target) => (target = mod2 != null ? __create(__getProtoOf(mod2)) : {}, __copyProps( - // If the importer is in node compatibility mode or this is not an ESM - // file that has been converted to a CommonJS file using a Babel- - // compatible transform (i.e. "__esModule" has not been set), then set - // "default" to the CommonJS "module.exports" for node compatibility. - isNodeMode || !mod2 || !mod2.__esModule ? __defProp(target, "default", { value: mod2, enumerable: true }) : target, - mod2 -)); -var __toCommonJS = (mod2) => __copyProps(__defProp({}, "__esModule", { value: true }), mod2); - -// node_modules/dotenv/package.json -var require_package = __commonJS({ - "node_modules/dotenv/package.json"(exports2, module2) { - module2.exports = { - name: "dotenv", - version: "16.3.1", - description: "Loads environment variables from .env file", - main: "lib/main.js", - types: "lib/main.d.ts", - exports: { - ".": { - types: "./lib/main.d.ts", - require: "./lib/main.js", - default: "./lib/main.js" - }, - "./config": "./config.js", - "./config.js": "./config.js", - "./lib/env-options": "./lib/env-options.js", - "./lib/env-options.js": "./lib/env-options.js", - "./lib/cli-options": "./lib/cli-options.js", - "./lib/cli-options.js": "./lib/cli-options.js", - "./package.json": "./package.json" - }, - scripts: { - "dts-check": "tsc --project tests/types/tsconfig.json", - lint: "standard", - "lint-readme": "standard-markdown", - pretest: "npm run lint && npm run dts-check", - test: "tap tests/*.js --100 -Rspec", - prerelease: "npm test", - release: "standard-version" - }, - repository: { - type: "git", - url: "git://github.com/motdotla/dotenv.git" - }, - funding: "https://github.com/motdotla/dotenv?sponsor=1", - keywords: [ - "dotenv", - "env", - ".env", - "environment", - "variables", - "config", - "settings" - ], - readmeFilename: "README.md", - license: "BSD-2-Clause", - devDependencies: { - "@definitelytyped/dtslint": "^0.0.133", - "@types/node": "^18.11.3", - decache: "^4.6.1", - sinon: "^14.0.1", - standard: "^17.0.0", - "standard-markdown": "^7.1.0", - "standard-version": "^9.5.0", - tap: "^16.3.0", - tar: "^6.1.11", - typescript: "^4.8.4" - }, - engines: { - node: ">=12" - }, - browser: { - fs: false - } - }; - } -}); - -// node_modules/dotenv/lib/main.js -var require_main = __commonJS({ - "node_modules/dotenv/lib/main.js"(exports2, module2) { - var fs2 = require("fs"); - var path = require("path"); - var os2 = require("os"); - var crypto2 = require("crypto"); - var packageJson = require_package(); - var version = packageJson.version; - var LINE = /(?:^|^)\s*(?:export\s+)?([\w.-]+)(?:\s*=\s*?|:\s+?)(\s*'(?:\\'|[^'])*'|\s*"(?:\\"|[^"])*"|\s*`(?:\\`|[^`])*`|[^#\r\n]+)?\s*(?:#.*)?(?:$|$)/mg; - function parse(src) { - const obj = {}; - let lines = src.toString(); - lines = lines.replace(/\r\n?/mg, "\n"); - let match; - while ((match = LINE.exec(lines)) != null) { - const key = match[1]; - let value = match[2] || ""; - value = value.trim(); - const maybeQuote = value[0]; - value = value.replace(/^(['"`])([\s\S]*)\1$/mg, "$2"); - if (maybeQuote === '"') { - value = value.replace(/\\n/g, "\n"); - value = value.replace(/\\r/g, "\r"); - } - obj[key] = value; - } - return obj; - } - function _parseVault(options2) { - const vaultPath = _vaultPath(options2); - const result = DotenvModule.configDotenv({ path: vaultPath }); - if (!result.parsed) { - throw new Error(`MISSING_DATA: Cannot parse ${vaultPath} for an unknown reason`); - } - const keys = _dotenvKey(options2).split(","); - const length = keys.length; - let decrypted; - for (let i = 0; i < length; i++) { - try { - const key = keys[i].trim(); - const attrs = _instructions(result, key); - decrypted = DotenvModule.decrypt(attrs.ciphertext, attrs.key); - break; - } catch (error2) { - if (i + 1 >= length) { - throw error2; - } - } - } - return DotenvModule.parse(decrypted); - } - function _log(message) { - console.log(`[dotenv@${version}][INFO] ${message}`); - } - function _warn(message) { - console.log(`[dotenv@${version}][WARN] ${message}`); - } - function _debug(message) { - console.log(`[dotenv@${version}][DEBUG] ${message}`); - } - function _dotenvKey(options2) { - if (options2 && options2.DOTENV_KEY && options2.DOTENV_KEY.length > 0) { - return options2.DOTENV_KEY; - } - if (process.env.DOTENV_KEY && process.env.DOTENV_KEY.length > 0) { - return process.env.DOTENV_KEY; - } - return ""; - } - function _instructions(result, dotenvKey) { - let uri; - try { - uri = new URL(dotenvKey); - } catch (error2) { - if (error2.code === "ERR_INVALID_URL") { - throw new Error("INVALID_DOTENV_KEY: Wrong format. Must be in valid uri format like dotenv://:key_1234@dotenv.org/vault/.env.vault?environment=development"); - } - throw error2; - } - const key = uri.password; - if (!key) { - throw new Error("INVALID_DOTENV_KEY: Missing key part"); - } - const environment = uri.searchParams.get("environment"); - if (!environment) { - throw new Error("INVALID_DOTENV_KEY: Missing environment part"); - } - const environmentKey = `DOTENV_VAULT_${environment.toUpperCase()}`; - const ciphertext = result.parsed[environmentKey]; - if (!ciphertext) { - throw new Error(`NOT_FOUND_DOTENV_ENVIRONMENT: Cannot locate environment ${environmentKey} in your .env.vault file.`); - } - return { ciphertext, key }; - } - function _vaultPath(options2) { - let dotenvPath = path.resolve(process.cwd(), ".env"); - if (options2 && options2.path && options2.path.length > 0) { - dotenvPath = options2.path; - } - return dotenvPath.endsWith(".vault") ? dotenvPath : `${dotenvPath}.vault`; - } - function _resolveHome(envPath) { - return envPath[0] === "~" ? path.join(os2.homedir(), envPath.slice(1)) : envPath; - } - function _configVault(options2) { - _log("Loading env from encrypted .env.vault"); - const parsed = DotenvModule._parseVault(options2); - let processEnv = process.env; - if (options2 && options2.processEnv != null) { - processEnv = options2.processEnv; - } - DotenvModule.populate(processEnv, parsed, options2); - return { parsed }; - } - function configDotenv(options2) { - let dotenvPath = path.resolve(process.cwd(), ".env"); - let encoding = "utf8"; - const debug2 = Boolean(options2 && options2.debug); - if (options2) { - if (options2.path != null) { - dotenvPath = _resolveHome(options2.path); - } - if (options2.encoding != null) { - encoding = options2.encoding; - } - } - try { - const parsed = DotenvModule.parse(fs2.readFileSync(dotenvPath, { encoding })); - let processEnv = process.env; - if (options2 && options2.processEnv != null) { - processEnv = options2.processEnv; - } - DotenvModule.populate(processEnv, parsed, options2); - return { parsed }; - } catch (e) { - if (debug2) { - _debug(`Failed to load ${dotenvPath} ${e.message}`); - } - return { error: e }; - } - } - function config2(options2) { - const vaultPath = _vaultPath(options2); - if (_dotenvKey(options2).length === 0) { - return DotenvModule.configDotenv(options2); - } - if (!fs2.existsSync(vaultPath)) { - _warn(`You set DOTENV_KEY but you are missing a .env.vault file at ${vaultPath}. Did you forget to build it?`); - return DotenvModule.configDotenv(options2); - } - return DotenvModule._configVault(options2); - } - function decrypt(encrypted, keyStr) { - const key = Buffer.from(keyStr.slice(-64), "hex"); - let ciphertext = Buffer.from(encrypted, "base64"); - const nonce = ciphertext.slice(0, 12); - const authTag = ciphertext.slice(-16); - ciphertext = ciphertext.slice(12, -16); - try { - const aesgcm = crypto2.createDecipheriv("aes-256-gcm", key, nonce); - aesgcm.setAuthTag(authTag); - return `${aesgcm.update(ciphertext)}${aesgcm.final()}`; - } catch (error2) { - const isRange = error2 instanceof RangeError; - const invalidKeyLength = error2.message === "Invalid key length"; - const decryptionFailed = error2.message === "Unsupported state or unable to authenticate data"; - if (isRange || invalidKeyLength) { - const msg2 = "INVALID_DOTENV_KEY: It must be 64 characters long (or more)"; - throw new Error(msg2); - } else if (decryptionFailed) { - const msg2 = "DECRYPTION_FAILED: Please check your DOTENV_KEY"; - throw new Error(msg2); - } else { - console.error("Error: ", error2.code); - console.error("Error: ", error2.message); - throw error2; - } - } - } - function populate(processEnv, parsed, options2 = {}) { - const debug2 = Boolean(options2 && options2.debug); - const override = Boolean(options2 && options2.override); - if (typeof parsed !== "object") { - throw new Error("OBJECT_REQUIRED: Please check the processEnv argument being passed to populate"); - } - for (const key of Object.keys(parsed)) { - if (Object.prototype.hasOwnProperty.call(processEnv, key)) { - if (override === true) { - processEnv[key] = parsed[key]; - } - if (debug2) { - if (override === true) { - _debug(`"${key}" is already defined and WAS overwritten`); - } else { - _debug(`"${key}" is already defined and was NOT overwritten`); - } - } - } else { - processEnv[key] = parsed[key]; - } - } - } - var DotenvModule = { - configDotenv, - _configVault, - _parseVault, - config: config2, - decrypt, - parse, - populate - }; - module2.exports.configDotenv = DotenvModule.configDotenv; - module2.exports._configVault = DotenvModule._configVault; - module2.exports._parseVault = DotenvModule._parseVault; - module2.exports.config = DotenvModule.config; - module2.exports.decrypt = DotenvModule.decrypt; - module2.exports.parse = DotenvModule.parse; - module2.exports.populate = DotenvModule.populate; - module2.exports = DotenvModule; - } -}); - -// node_modules/dotenv/lib/env-options.js -var require_env_options = __commonJS({ - "node_modules/dotenv/lib/env-options.js"(exports2, module2) { - var options2 = {}; - if (process.env.DOTENV_CONFIG_ENCODING != null) { - options2.encoding = process.env.DOTENV_CONFIG_ENCODING; - } - if (process.env.DOTENV_CONFIG_PATH != null) { - options2.path = process.env.DOTENV_CONFIG_PATH; - } - if (process.env.DOTENV_CONFIG_DEBUG != null) { - options2.debug = process.env.DOTENV_CONFIG_DEBUG; - } - if (process.env.DOTENV_CONFIG_OVERRIDE != null) { - options2.override = process.env.DOTENV_CONFIG_OVERRIDE; - } - if (process.env.DOTENV_CONFIG_DOTENV_KEY != null) { - options2.DOTENV_KEY = process.env.DOTENV_CONFIG_DOTENV_KEY; - } - module2.exports = options2; - } -}); - -// node_modules/dotenv/lib/cli-options.js -var require_cli_options = __commonJS({ - "node_modules/dotenv/lib/cli-options.js"(exports2, module2) { - var re2 = /^dotenv_config_(encoding|path|debug|override|DOTENV_KEY)=(.+)$/; - module2.exports = function optionMatcher(args) { - return args.reduce(function(acc, cur) { - const matches = cur.match(re2); - if (matches) { - acc[matches[1]] = matches[2]; - } - return acc; - }, {}); - }; - } -}); - -// node_modules/lodash.camelcase/index.js -var require_lodash = __commonJS({ - "node_modules/lodash.camelcase/index.js"(exports2, module2) { - var INFINITY = 1 / 0; - var symbolTag = "[object Symbol]"; - var reAsciiWord = /[^\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]+/g; - var reLatin = /[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g; - var rsAstralRange = "\\ud800-\\udfff"; - var rsComboMarksRange = "\\u0300-\\u036f\\ufe20-\\ufe23"; - var rsComboSymbolsRange = "\\u20d0-\\u20f0"; - var rsDingbatRange = "\\u2700-\\u27bf"; - var rsLowerRange = "a-z\\xdf-\\xf6\\xf8-\\xff"; - var rsMathOpRange = "\\xac\\xb1\\xd7\\xf7"; - var rsNonCharRange = "\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf"; - var rsPunctuationRange = "\\u2000-\\u206f"; - var rsSpaceRange = " \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000"; - var rsUpperRange = "A-Z\\xc0-\\xd6\\xd8-\\xde"; - var rsVarRange = "\\ufe0e\\ufe0f"; - var rsBreakRange = rsMathOpRange + rsNonCharRange + rsPunctuationRange + rsSpaceRange; - var rsApos = "['\u2019]"; - var rsAstral = "[" + rsAstralRange + "]"; - var rsBreak = "[" + rsBreakRange + "]"; - var rsCombo = "[" + rsComboMarksRange + rsComboSymbolsRange + "]"; - var rsDigits = "\\d+"; - var rsDingbat = "[" + rsDingbatRange + "]"; - var rsLower = "[" + rsLowerRange + "]"; - var rsMisc = "[^" + rsAstralRange + rsBreakRange + rsDigits + rsDingbatRange + rsLowerRange + rsUpperRange + "]"; - var rsFitz = "\\ud83c[\\udffb-\\udfff]"; - var rsModifier = "(?:" + rsCombo + "|" + rsFitz + ")"; - var rsNonAstral = "[^" + rsAstralRange + "]"; - var rsRegional = "(?:\\ud83c[\\udde6-\\uddff]){2}"; - var rsSurrPair = "[\\ud800-\\udbff][\\udc00-\\udfff]"; - var rsUpper = "[" + rsUpperRange + "]"; - var rsZWJ = "\\u200d"; - var rsLowerMisc = "(?:" + rsLower + "|" + rsMisc + ")"; - var rsUpperMisc = "(?:" + rsUpper + "|" + rsMisc + ")"; - var rsOptLowerContr = "(?:" + rsApos + "(?:d|ll|m|re|s|t|ve))?"; - var rsOptUpperContr = "(?:" + rsApos + "(?:D|LL|M|RE|S|T|VE))?"; - var reOptMod = rsModifier + "?"; - var rsOptVar = "[" + rsVarRange + "]?"; - var rsOptJoin = "(?:" + rsZWJ + "(?:" + [rsNonAstral, rsRegional, rsSurrPair].join("|") + ")" + rsOptVar + reOptMod + ")*"; - var rsSeq = rsOptVar + reOptMod + rsOptJoin; - var rsEmoji = "(?:" + [rsDingbat, rsRegional, rsSurrPair].join("|") + ")" + rsSeq; - var rsSymbol = "(?:" + [rsNonAstral + rsCombo + "?", rsCombo, rsRegional, rsSurrPair, rsAstral].join("|") + ")"; - var reApos = RegExp(rsApos, "g"); - var reComboMark = RegExp(rsCombo, "g"); - var reUnicode = RegExp(rsFitz + "(?=" + rsFitz + ")|" + rsSymbol + rsSeq, "g"); - var reUnicodeWord = RegExp([ - rsUpper + "?" + rsLower + "+" + rsOptLowerContr + "(?=" + [rsBreak, rsUpper, "$"].join("|") + ")", - rsUpperMisc + "+" + rsOptUpperContr + "(?=" + [rsBreak, rsUpper + rsLowerMisc, "$"].join("|") + ")", - rsUpper + "?" + rsLowerMisc + "+" + rsOptLowerContr, - rsUpper + "+" + rsOptUpperContr, - rsDigits, - rsEmoji - ].join("|"), "g"); - var reHasUnicode = RegExp("[" + rsZWJ + rsAstralRange + rsComboMarksRange + rsComboSymbolsRange + rsVarRange + "]"); - var reHasUnicodeWord = /[a-z][A-Z]|[A-Z]{2,}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/; - var deburredLetters = { - // Latin-1 Supplement block. - "\xC0": "A", - "\xC1": "A", - "\xC2": "A", - "\xC3": "A", - "\xC4": "A", - "\xC5": "A", - "\xE0": "a", - "\xE1": "a", - "\xE2": "a", - "\xE3": "a", - "\xE4": "a", - "\xE5": "a", - "\xC7": "C", - "\xE7": "c", - "\xD0": "D", - "\xF0": "d", - "\xC8": "E", - "\xC9": "E", - "\xCA": "E", - "\xCB": "E", - "\xE8": "e", - "\xE9": "e", - "\xEA": "e", - "\xEB": "e", - "\xCC": "I", - "\xCD": "I", - "\xCE": "I", - "\xCF": "I", - "\xEC": "i", - "\xED": "i", - "\xEE": "i", - "\xEF": "i", - "\xD1": "N", - "\xF1": "n", - "\xD2": "O", - "\xD3": "O", - "\xD4": "O", - "\xD5": "O", - "\xD6": "O", - "\xD8": "O", - "\xF2": "o", - "\xF3": "o", - "\xF4": "o", - "\xF5": "o", - "\xF6": "o", - "\xF8": "o", - "\xD9": "U", - "\xDA": "U", - "\xDB": "U", - "\xDC": "U", - "\xF9": "u", - "\xFA": "u", - "\xFB": "u", - "\xFC": "u", - "\xDD": "Y", - "\xFD": "y", - "\xFF": "y", - "\xC6": "Ae", - "\xE6": "ae", - "\xDE": "Th", - "\xFE": "th", - "\xDF": "ss", - // Latin Extended-A block. - "\u0100": "A", - "\u0102": "A", - "\u0104": "A", - "\u0101": "a", - "\u0103": "a", - "\u0105": "a", - "\u0106": "C", - "\u0108": "C", - "\u010A": "C", - "\u010C": "C", - "\u0107": "c", - "\u0109": "c", - "\u010B": "c", - "\u010D": "c", - "\u010E": "D", - "\u0110": "D", - "\u010F": "d", - "\u0111": "d", - "\u0112": "E", - "\u0114": "E", - "\u0116": "E", - "\u0118": "E", - "\u011A": "E", - "\u0113": "e", - "\u0115": "e", - "\u0117": "e", - "\u0119": "e", - "\u011B": "e", - "\u011C": "G", - "\u011E": "G", - "\u0120": "G", - "\u0122": "G", - "\u011D": "g", - "\u011F": "g", - "\u0121": "g", - "\u0123": "g", - "\u0124": "H", - "\u0126": "H", - "\u0125": "h", - "\u0127": "h", - "\u0128": "I", - "\u012A": "I", - "\u012C": "I", - "\u012E": "I", - "\u0130": "I", - "\u0129": "i", - "\u012B": "i", - "\u012D": "i", - "\u012F": "i", - "\u0131": "i", - "\u0134": "J", - "\u0135": "j", - "\u0136": "K", - "\u0137": "k", - "\u0138": "k", - "\u0139": "L", - "\u013B": "L", - "\u013D": "L", - "\u013F": "L", - "\u0141": "L", - "\u013A": "l", - "\u013C": "l", - "\u013E": "l", - "\u0140": "l", - "\u0142": "l", - "\u0143": "N", - "\u0145": "N", - "\u0147": "N", - "\u014A": "N", - "\u0144": "n", - "\u0146": "n", - "\u0148": "n", - "\u014B": "n", - "\u014C": "O", - "\u014E": "O", - "\u0150": "O", - "\u014D": "o", - "\u014F": "o", - "\u0151": "o", - "\u0154": "R", - "\u0156": "R", - "\u0158": "R", - "\u0155": "r", - "\u0157": "r", - "\u0159": "r", - "\u015A": "S", - "\u015C": "S", - "\u015E": "S", - "\u0160": "S", - "\u015B": "s", - "\u015D": "s", - "\u015F": "s", - "\u0161": "s", - "\u0162": "T", - "\u0164": "T", - "\u0166": "T", - "\u0163": "t", - "\u0165": "t", - "\u0167": "t", - "\u0168": "U", - "\u016A": "U", - "\u016C": "U", - "\u016E": "U", - "\u0170": "U", - "\u0172": "U", - "\u0169": "u", - "\u016B": "u", - "\u016D": "u", - "\u016F": "u", - "\u0171": "u", - "\u0173": "u", - "\u0174": "W", - "\u0175": "w", - "\u0176": "Y", - "\u0177": "y", - "\u0178": "Y", - "\u0179": "Z", - "\u017B": "Z", - "\u017D": "Z", - "\u017A": "z", - "\u017C": "z", - "\u017E": "z", - "\u0132": "IJ", - "\u0133": "ij", - "\u0152": "Oe", - "\u0153": "oe", - "\u0149": "'n", - "\u017F": "ss" - }; - var freeGlobal = typeof global == "object" && global && global.Object === Object && global; - var freeSelf = typeof self == "object" && self && self.Object === Object && self; - var root = freeGlobal || freeSelf || Function("return this")(); - function arrayReduce(array, iteratee, accumulator, initAccum) { - var index = -1, length = array ? array.length : 0; - if (initAccum && length) { - accumulator = array[++index]; - } - while (++index < length) { - accumulator = iteratee(accumulator, array[index], index, array); - } - return accumulator; - } - function asciiToArray(string) { - return string.split(""); - } - function asciiWords(string) { - return string.match(reAsciiWord) || []; - } - function basePropertyOf(object) { - return function(key) { - return object == null ? void 0 : object[key]; - }; - } - var deburrLetter = basePropertyOf(deburredLetters); - function hasUnicode(string) { - return reHasUnicode.test(string); - } - function hasUnicodeWord(string) { - return reHasUnicodeWord.test(string); - } - function stringToArray(string) { - return hasUnicode(string) ? unicodeToArray(string) : asciiToArray(string); - } - function unicodeToArray(string) { - return string.match(reUnicode) || []; - } - function unicodeWords(string) { - return string.match(reUnicodeWord) || []; - } - var objectProto = Object.prototype; - var objectToString = objectProto.toString; - var Symbol2 = root.Symbol; - var symbolProto = Symbol2 ? Symbol2.prototype : void 0; - var symbolToString = symbolProto ? symbolProto.toString : void 0; - function baseSlice(array, start, end) { - var index = -1, length = array.length; - if (start < 0) { - start = -start > length ? 0 : length + start; - } - end = end > length ? length : end; - if (end < 0) { - end += length; - } - length = start > end ? 0 : end - start >>> 0; - start >>>= 0; - var result = Array(length); - while (++index < length) { - result[index] = array[index + start]; - } - return result; - } - function baseToString(value) { - if (typeof value == "string") { - return value; - } - if (isSymbol(value)) { - return symbolToString ? symbolToString.call(value) : ""; - } - var result = value + ""; - return result == "0" && 1 / value == -INFINITY ? "-0" : result; - } - function castSlice(array, start, end) { - var length = array.length; - end = end === void 0 ? length : end; - return !start && end >= length ? array : baseSlice(array, start, end); - } - function createCaseFirst(methodName) { - return function(string) { - string = toString(string); - var strSymbols = hasUnicode(string) ? stringToArray(string) : void 0; - var chr = strSymbols ? strSymbols[0] : string.charAt(0); - var trailing = strSymbols ? castSlice(strSymbols, 1).join("") : string.slice(1); - return chr[methodName]() + trailing; - }; - } - function createCompounder(callback) { - return function(string) { - return arrayReduce(words(deburr(string).replace(reApos, "")), callback, ""); - }; - } - function isObjectLike(value) { - return !!value && typeof value == "object"; - } - function isSymbol(value) { - return typeof value == "symbol" || isObjectLike(value) && objectToString.call(value) == symbolTag; - } - function toString(value) { - return value == null ? "" : baseToString(value); - } - var camelCase = createCompounder(function(result, word, index) { - word = word.toLowerCase(); - return result + (index ? capitalize(word) : word); - }); - function capitalize(string) { - return upperFirst(toString(string).toLowerCase()); - } - function deburr(string) { - string = toString(string); - return string && string.replace(reLatin, deburrLetter).replace(reComboMark, ""); - } - var upperFirst = createCaseFirst("toUpperCase"); - function words(string, pattern, guard) { - string = toString(string); - pattern = guard ? void 0 : pattern; - if (pattern === void 0) { - return hasUnicodeWord(string) ? unicodeWords(string) : asciiWords(string); - } - return string.match(pattern) || []; - } - module2.exports = camelCase; - } -}); - -// node_modules/@protobufjs/aspromise/index.js -var require_aspromise = __commonJS({ - "node_modules/@protobufjs/aspromise/index.js"(exports2, module2) { - "use strict"; - module2.exports = asPromise; - function asPromise(fn, ctx) { - var params = new Array(arguments.length - 1), offset = 0, index = 2, pending = true; - while (index < arguments.length) - params[offset++] = arguments[index++]; - return new Promise(function executor(resolve, reject) { - params[offset] = function callback(err) { - if (pending) { - pending = false; - if (err) - reject(err); - else { - var params2 = new Array(arguments.length - 1), offset2 = 0; - while (offset2 < params2.length) - params2[offset2++] = arguments[offset2]; - resolve.apply(null, params2); - } - } - }; - try { - fn.apply(ctx || null, params); - } catch (err) { - if (pending) { - pending = false; - reject(err); - } - } - }); - } - } -}); - -// node_modules/@protobufjs/base64/index.js -var require_base64 = __commonJS({ - "node_modules/@protobufjs/base64/index.js"(exports2) { - "use strict"; - var base64 = exports2; - base64.length = function length(string) { - var p = string.length; - if (!p) - return 0; - var n = 0; - while (--p % 4 > 1 && string.charAt(p) === "=") - ++n; - return Math.ceil(string.length * 3) / 4 - n; - }; - var b64 = new Array(64); - var s64 = new Array(123); - for (i = 0; i < 64; ) - s64[b64[i] = i < 26 ? i + 65 : i < 52 ? i + 71 : i < 62 ? i - 4 : i - 59 | 43] = i++; - var i; - base64.encode = function encode(buffer, start, end) { - var parts = null, chunk = []; - var i2 = 0, j2 = 0, t; - while (start < end) { - var b = buffer[start++]; - switch (j2) { - case 0: - chunk[i2++] = b64[b >> 2]; - t = (b & 3) << 4; - j2 = 1; - break; - case 1: - chunk[i2++] = b64[t | b >> 4]; - t = (b & 15) << 2; - j2 = 2; - break; - case 2: - chunk[i2++] = b64[t | b >> 6]; - chunk[i2++] = b64[b & 63]; - j2 = 0; - break; - } - if (i2 > 8191) { - (parts || (parts = [])).push(String.fromCharCode.apply(String, chunk)); - i2 = 0; - } - } - if (j2) { - chunk[i2++] = b64[t]; - chunk[i2++] = 61; - if (j2 === 1) - chunk[i2++] = 61; - } - if (parts) { - if (i2) - parts.push(String.fromCharCode.apply(String, chunk.slice(0, i2))); - return parts.join(""); - } - return String.fromCharCode.apply(String, chunk.slice(0, i2)); - }; - var invalidEncoding = "invalid encoding"; - base64.decode = function decode(string, buffer, offset) { - var start = offset; - var j2 = 0, t; - for (var i2 = 0; i2 < string.length; ) { - var c = string.charCodeAt(i2++); - if (c === 61 && j2 > 1) - break; - if ((c = s64[c]) === void 0) - throw Error(invalidEncoding); - switch (j2) { - case 0: - t = c; - j2 = 1; - break; - case 1: - buffer[offset++] = t << 2 | (c & 48) >> 4; - t = c; - j2 = 2; - break; - case 2: - buffer[offset++] = (t & 15) << 4 | (c & 60) >> 2; - t = c; - j2 = 3; - break; - case 3: - buffer[offset++] = (t & 3) << 6 | c; - j2 = 0; - break; - } - } - if (j2 === 1) - throw Error(invalidEncoding); - return offset - start; - }; - base64.test = function test(string) { - return /^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/.test(string); - }; - } -}); - -// node_modules/@protobufjs/eventemitter/index.js -var require_eventemitter = __commonJS({ - "node_modules/@protobufjs/eventemitter/index.js"(exports2, module2) { - "use strict"; - module2.exports = EventEmitter; - function EventEmitter() { - this._listeners = {}; - } - EventEmitter.prototype.on = function on2(evt, fn, ctx) { - (this._listeners[evt] || (this._listeners[evt] = [])).push({ - fn, - ctx: ctx || this - }); - return this; - }; - EventEmitter.prototype.off = function off(evt, fn) { - if (evt === void 0) - this._listeners = {}; - else { - if (fn === void 0) - this._listeners[evt] = []; - else { - var listeners = this._listeners[evt]; - for (var i = 0; i < listeners.length; ) - if (listeners[i].fn === fn) - listeners.splice(i, 1); - else - ++i; - } - } - return this; - }; - EventEmitter.prototype.emit = function emit(evt) { - var listeners = this._listeners[evt]; - if (listeners) { - var args = [], i = 1; - for (; i < arguments.length; ) - args.push(arguments[i++]); - for (i = 0; i < listeners.length; ) - listeners[i].fn.apply(listeners[i++].ctx, args); - } - return this; - }; - } -}); - -// node_modules/@protobufjs/float/index.js -var require_float = __commonJS({ - "node_modules/@protobufjs/float/index.js"(exports2, module2) { - "use strict"; - module2.exports = factory(factory); - function factory(exports3) { - if (typeof Float32Array !== "undefined") - (function() { - var f32 = new Float32Array([-0]), f8b = new Uint8Array(f32.buffer), le = f8b[3] === 128; - function writeFloat_f32_cpy(val, buf, pos) { - f32[0] = val; - buf[pos] = f8b[0]; - buf[pos + 1] = f8b[1]; - buf[pos + 2] = f8b[2]; - buf[pos + 3] = f8b[3]; - } - function writeFloat_f32_rev(val, buf, pos) { - f32[0] = val; - buf[pos] = f8b[3]; - buf[pos + 1] = f8b[2]; - buf[pos + 2] = f8b[1]; - buf[pos + 3] = f8b[0]; - } - exports3.writeFloatLE = le ? writeFloat_f32_cpy : writeFloat_f32_rev; - exports3.writeFloatBE = le ? writeFloat_f32_rev : writeFloat_f32_cpy; - function readFloat_f32_cpy(buf, pos) { - f8b[0] = buf[pos]; - f8b[1] = buf[pos + 1]; - f8b[2] = buf[pos + 2]; - f8b[3] = buf[pos + 3]; - return f32[0]; - } - function readFloat_f32_rev(buf, pos) { - f8b[3] = buf[pos]; - f8b[2] = buf[pos + 1]; - f8b[1] = buf[pos + 2]; - f8b[0] = buf[pos + 3]; - return f32[0]; - } - exports3.readFloatLE = le ? readFloat_f32_cpy : readFloat_f32_rev; - exports3.readFloatBE = le ? readFloat_f32_rev : readFloat_f32_cpy; - })(); - else - (function() { - function writeFloat_ieee754(writeUint, val, buf, pos) { - var sign = val < 0 ? 1 : 0; - if (sign) - val = -val; - if (val === 0) - writeUint(1 / val > 0 ? ( - /* positive */ - 0 - ) : ( - /* negative 0 */ - 2147483648 - ), buf, pos); - else if (isNaN(val)) - writeUint(2143289344, buf, pos); - else if (val > 34028234663852886e22) - writeUint((sign << 31 | 2139095040) >>> 0, buf, pos); - else if (val < 11754943508222875e-54) - writeUint((sign << 31 | Math.round(val / 1401298464324817e-60)) >>> 0, buf, pos); - else { - var exponent = Math.floor(Math.log(val) / Math.LN2), mantissa = Math.round(val * Math.pow(2, -exponent) * 8388608) & 8388607; - writeUint((sign << 31 | exponent + 127 << 23 | mantissa) >>> 0, buf, pos); - } - } - exports3.writeFloatLE = writeFloat_ieee754.bind(null, writeUintLE); - exports3.writeFloatBE = writeFloat_ieee754.bind(null, writeUintBE); - function readFloat_ieee754(readUint, buf, pos) { - var uint = readUint(buf, pos), sign = (uint >> 31) * 2 + 1, exponent = uint >>> 23 & 255, mantissa = uint & 8388607; - return exponent === 255 ? mantissa ? NaN : sign * Infinity : exponent === 0 ? sign * 1401298464324817e-60 * mantissa : sign * Math.pow(2, exponent - 150) * (mantissa + 8388608); - } - exports3.readFloatLE = readFloat_ieee754.bind(null, readUintLE); - exports3.readFloatBE = readFloat_ieee754.bind(null, readUintBE); - })(); - if (typeof Float64Array !== "undefined") - (function() { - var f64 = new Float64Array([-0]), f8b = new Uint8Array(f64.buffer), le = f8b[7] === 128; - function writeDouble_f64_cpy(val, buf, pos) { - f64[0] = val; - buf[pos] = f8b[0]; - buf[pos + 1] = f8b[1]; - buf[pos + 2] = f8b[2]; - buf[pos + 3] = f8b[3]; - buf[pos + 4] = f8b[4]; - buf[pos + 5] = f8b[5]; - buf[pos + 6] = f8b[6]; - buf[pos + 7] = f8b[7]; - } - function writeDouble_f64_rev(val, buf, pos) { - f64[0] = val; - buf[pos] = f8b[7]; - buf[pos + 1] = f8b[6]; - buf[pos + 2] = f8b[5]; - buf[pos + 3] = f8b[4]; - buf[pos + 4] = f8b[3]; - buf[pos + 5] = f8b[2]; - buf[pos + 6] = f8b[1]; - buf[pos + 7] = f8b[0]; - } - exports3.writeDoubleLE = le ? writeDouble_f64_cpy : writeDouble_f64_rev; - exports3.writeDoubleBE = le ? writeDouble_f64_rev : writeDouble_f64_cpy; - function readDouble_f64_cpy(buf, pos) { - f8b[0] = buf[pos]; - f8b[1] = buf[pos + 1]; - f8b[2] = buf[pos + 2]; - f8b[3] = buf[pos + 3]; - f8b[4] = buf[pos + 4]; - f8b[5] = buf[pos + 5]; - f8b[6] = buf[pos + 6]; - f8b[7] = buf[pos + 7]; - return f64[0]; - } - function readDouble_f64_rev(buf, pos) { - f8b[7] = buf[pos]; - f8b[6] = buf[pos + 1]; - f8b[5] = buf[pos + 2]; - f8b[4] = buf[pos + 3]; - f8b[3] = buf[pos + 4]; - f8b[2] = buf[pos + 5]; - f8b[1] = buf[pos + 6]; - f8b[0] = buf[pos + 7]; - return f64[0]; - } - exports3.readDoubleLE = le ? readDouble_f64_cpy : readDouble_f64_rev; - exports3.readDoubleBE = le ? readDouble_f64_rev : readDouble_f64_cpy; - })(); - else - (function() { - function writeDouble_ieee754(writeUint, off0, off1, val, buf, pos) { - var sign = val < 0 ? 1 : 0; - if (sign) - val = -val; - if (val === 0) { - writeUint(0, buf, pos + off0); - writeUint(1 / val > 0 ? ( - /* positive */ - 0 - ) : ( - /* negative 0 */ - 2147483648 - ), buf, pos + off1); - } else if (isNaN(val)) { - writeUint(0, buf, pos + off0); - writeUint(2146959360, buf, pos + off1); - } else if (val > 17976931348623157e292) { - writeUint(0, buf, pos + off0); - writeUint((sign << 31 | 2146435072) >>> 0, buf, pos + off1); - } else { - var mantissa; - if (val < 22250738585072014e-324) { - mantissa = val / 5e-324; - writeUint(mantissa >>> 0, buf, pos + off0); - writeUint((sign << 31 | mantissa / 4294967296) >>> 0, buf, pos + off1); - } else { - var exponent = Math.floor(Math.log(val) / Math.LN2); - if (exponent === 1024) - exponent = 1023; - mantissa = val * Math.pow(2, -exponent); - writeUint(mantissa * 4503599627370496 >>> 0, buf, pos + off0); - writeUint((sign << 31 | exponent + 1023 << 20 | mantissa * 1048576 & 1048575) >>> 0, buf, pos + off1); - } - } - } - exports3.writeDoubleLE = writeDouble_ieee754.bind(null, writeUintLE, 0, 4); - exports3.writeDoubleBE = writeDouble_ieee754.bind(null, writeUintBE, 4, 0); - function readDouble_ieee754(readUint, off0, off1, buf, pos) { - var lo2 = readUint(buf, pos + off0), hi2 = readUint(buf, pos + off1); - var sign = (hi2 >> 31) * 2 + 1, exponent = hi2 >>> 20 & 2047, mantissa = 4294967296 * (hi2 & 1048575) + lo2; - return exponent === 2047 ? mantissa ? NaN : sign * Infinity : exponent === 0 ? sign * 5e-324 * mantissa : sign * Math.pow(2, exponent - 1075) * (mantissa + 4503599627370496); - } - exports3.readDoubleLE = readDouble_ieee754.bind(null, readUintLE, 0, 4); - exports3.readDoubleBE = readDouble_ieee754.bind(null, readUintBE, 4, 0); - })(); - return exports3; - } - function writeUintLE(val, buf, pos) { - buf[pos] = val & 255; - buf[pos + 1] = val >>> 8 & 255; - buf[pos + 2] = val >>> 16 & 255; - buf[pos + 3] = val >>> 24; - } - function writeUintBE(val, buf, pos) { - buf[pos] = val >>> 24; - buf[pos + 1] = val >>> 16 & 255; - buf[pos + 2] = val >>> 8 & 255; - buf[pos + 3] = val & 255; - } - function readUintLE(buf, pos) { - return (buf[pos] | buf[pos + 1] << 8 | buf[pos + 2] << 16 | buf[pos + 3] << 24) >>> 0; - } - function readUintBE(buf, pos) { - return (buf[pos] << 24 | buf[pos + 1] << 16 | buf[pos + 2] << 8 | buf[pos + 3]) >>> 0; - } - } -}); - -// node_modules/@protobufjs/inquire/index.js -var require_inquire = __commonJS({ - "node_modules/@protobufjs/inquire/index.js"(exports, module) { - "use strict"; - module.exports = inquire; - function inquire(moduleName) { - try { - var mod = eval("quire".replace(/^/, "re"))(moduleName); - if (mod && (mod.length || Object.keys(mod).length)) - return mod; - } catch (e) { - } - return null; - } - } -}); - -// node_modules/@protobufjs/utf8/index.js -var require_utf8 = __commonJS({ - "node_modules/@protobufjs/utf8/index.js"(exports2) { - "use strict"; - var utf8 = exports2; - utf8.length = function utf8_length(string) { - var len = 0, c = 0; - for (var i = 0; i < string.length; ++i) { - c = string.charCodeAt(i); - if (c < 128) - len += 1; - else if (c < 2048) - len += 2; - else if ((c & 64512) === 55296 && (string.charCodeAt(i + 1) & 64512) === 56320) { - ++i; - len += 4; - } else - len += 3; - } - return len; - }; - utf8.read = function utf8_read(buffer, start, end) { - var len = end - start; - if (len < 1) - return ""; - var parts = null, chunk = [], i = 0, t; - while (start < end) { - t = buffer[start++]; - if (t < 128) - chunk[i++] = t; - else if (t > 191 && t < 224) - chunk[i++] = (t & 31) << 6 | buffer[start++] & 63; - else if (t > 239 && t < 365) { - t = ((t & 7) << 18 | (buffer[start++] & 63) << 12 | (buffer[start++] & 63) << 6 | buffer[start++] & 63) - 65536; - chunk[i++] = 55296 + (t >> 10); - chunk[i++] = 56320 + (t & 1023); - } else - chunk[i++] = (t & 15) << 12 | (buffer[start++] & 63) << 6 | buffer[start++] & 63; - if (i > 8191) { - (parts || (parts = [])).push(String.fromCharCode.apply(String, chunk)); - i = 0; - } - } - if (parts) { - if (i) - parts.push(String.fromCharCode.apply(String, chunk.slice(0, i))); - return parts.join(""); - } - return String.fromCharCode.apply(String, chunk.slice(0, i)); - }; - utf8.write = function utf8_write(string, buffer, offset) { - var start = offset, c1, c2; - for (var i = 0; i < string.length; ++i) { - c1 = string.charCodeAt(i); - if (c1 < 128) { - buffer[offset++] = c1; - } else if (c1 < 2048) { - buffer[offset++] = c1 >> 6 | 192; - buffer[offset++] = c1 & 63 | 128; - } else if ((c1 & 64512) === 55296 && ((c2 = string.charCodeAt(i + 1)) & 64512) === 56320) { - c1 = 65536 + ((c1 & 1023) << 10) + (c2 & 1023); - ++i; - buffer[offset++] = c1 >> 18 | 240; - buffer[offset++] = c1 >> 12 & 63 | 128; - buffer[offset++] = c1 >> 6 & 63 | 128; - buffer[offset++] = c1 & 63 | 128; - } else { - buffer[offset++] = c1 >> 12 | 224; - buffer[offset++] = c1 >> 6 & 63 | 128; - buffer[offset++] = c1 & 63 | 128; - } - } - return offset - start; - }; - } -}); - -// node_modules/@protobufjs/pool/index.js -var require_pool = __commonJS({ - "node_modules/@protobufjs/pool/index.js"(exports2, module2) { - "use strict"; - module2.exports = pool; - function pool(alloc, slice, size) { - var SIZE = size || 8192; - var MAX = SIZE >>> 1; - var slab = null; - var offset = SIZE; - return function pool_alloc(size2) { - if (size2 < 1 || size2 > MAX) - return alloc(size2); - if (offset + size2 > SIZE) { - slab = alloc(SIZE); - offset = 0; - } - var buf = slice.call(slab, offset, offset += size2); - if (offset & 7) - offset = (offset | 7) + 1; - return buf; - }; - } - } -}); - -// node_modules/protobufjs/src/util/longbits.js -var require_longbits = __commonJS({ - "node_modules/protobufjs/src/util/longbits.js"(exports2, module2) { - "use strict"; - module2.exports = LongBits; - var util = require_minimal(); - function LongBits(lo2, hi2) { - this.lo = lo2 >>> 0; - this.hi = hi2 >>> 0; - } - var zero = LongBits.zero = new LongBits(0, 0); - zero.toNumber = function() { - return 0; - }; - zero.zzEncode = zero.zzDecode = function() { - return this; - }; - zero.length = function() { - return 1; - }; - var zeroHash = LongBits.zeroHash = "\0\0\0\0\0\0\0\0"; - LongBits.fromNumber = function fromNumber(value) { - if (value === 0) - return zero; - var sign = value < 0; - if (sign) - value = -value; - var lo2 = value >>> 0, hi2 = (value - lo2) / 4294967296 >>> 0; - if (sign) { - hi2 = ~hi2 >>> 0; - lo2 = ~lo2 >>> 0; - if (++lo2 > 4294967295) { - lo2 = 0; - if (++hi2 > 4294967295) - hi2 = 0; - } - } - return new LongBits(lo2, hi2); - }; - LongBits.from = function from(value) { - if (typeof value === "number") - return LongBits.fromNumber(value); - if (util.isString(value)) { - if (util.Long) - value = util.Long.fromString(value); - else - return LongBits.fromNumber(parseInt(value, 10)); - } - return value.low || value.high ? new LongBits(value.low >>> 0, value.high >>> 0) : zero; - }; - LongBits.prototype.toNumber = function toNumber(unsigned) { - if (!unsigned && this.hi >>> 31) { - var lo2 = ~this.lo + 1 >>> 0, hi2 = ~this.hi >>> 0; - if (!lo2) - hi2 = hi2 + 1 >>> 0; - return -(lo2 + hi2 * 4294967296); - } - return this.lo + this.hi * 4294967296; - }; - LongBits.prototype.toLong = function toLong(unsigned) { - return util.Long ? new util.Long(this.lo | 0, this.hi | 0, Boolean(unsigned)) : { low: this.lo | 0, high: this.hi | 0, unsigned: Boolean(unsigned) }; - }; - var charCodeAt = String.prototype.charCodeAt; - LongBits.fromHash = function fromHash(hash) { - if (hash === zeroHash) - return zero; - return new LongBits( - (charCodeAt.call(hash, 0) | charCodeAt.call(hash, 1) << 8 | charCodeAt.call(hash, 2) << 16 | charCodeAt.call(hash, 3) << 24) >>> 0, - (charCodeAt.call(hash, 4) | charCodeAt.call(hash, 5) << 8 | charCodeAt.call(hash, 6) << 16 | charCodeAt.call(hash, 7) << 24) >>> 0 - ); - }; - LongBits.prototype.toHash = function toHash() { - return String.fromCharCode( - this.lo & 255, - this.lo >>> 8 & 255, - this.lo >>> 16 & 255, - this.lo >>> 24, - this.hi & 255, - this.hi >>> 8 & 255, - this.hi >>> 16 & 255, - this.hi >>> 24 - ); - }; - LongBits.prototype.zzEncode = function zzEncode() { - var mask = this.hi >> 31; - this.hi = ((this.hi << 1 | this.lo >>> 31) ^ mask) >>> 0; - this.lo = (this.lo << 1 ^ mask) >>> 0; - return this; - }; - LongBits.prototype.zzDecode = function zzDecode() { - var mask = -(this.lo & 1); - this.lo = ((this.lo >>> 1 | this.hi << 31) ^ mask) >>> 0; - this.hi = (this.hi >>> 1 ^ mask) >>> 0; - return this; - }; - LongBits.prototype.length = function length() { - var part0 = this.lo, part1 = (this.lo >>> 28 | this.hi << 4) >>> 0, part2 = this.hi >>> 24; - return part2 === 0 ? part1 === 0 ? part0 < 16384 ? part0 < 128 ? 1 : 2 : part0 < 2097152 ? 3 : 4 : part1 < 16384 ? part1 < 128 ? 5 : 6 : part1 < 2097152 ? 7 : 8 : part2 < 128 ? 9 : 10; - }; - } -}); - -// node_modules/protobufjs/src/util/minimal.js -var require_minimal = __commonJS({ - "node_modules/protobufjs/src/util/minimal.js"(exports2) { - "use strict"; - var util = exports2; - util.asPromise = require_aspromise(); - util.base64 = require_base64(); - util.EventEmitter = require_eventemitter(); - util.float = require_float(); - util.inquire = require_inquire(); - util.utf8 = require_utf8(); - util.pool = require_pool(); - util.LongBits = require_longbits(); - util.isNode = Boolean(typeof global !== "undefined" && global && global.process && global.process.versions && global.process.versions.node); - util.global = util.isNode && global || typeof window !== "undefined" && window || typeof self !== "undefined" && self || exports2; - util.emptyArray = Object.freeze ? Object.freeze([]) : ( - /* istanbul ignore next */ - [] - ); - util.emptyObject = Object.freeze ? Object.freeze({}) : ( - /* istanbul ignore next */ - {} - ); - util.isInteger = Number.isInteger || /* istanbul ignore next */ - function isInteger(value) { - return typeof value === "number" && isFinite(value) && Math.floor(value) === value; - }; - util.isString = function isString(value) { - return typeof value === "string" || value instanceof String; - }; - util.isObject = function isObject(value) { - return value && typeof value === "object"; - }; - util.isset = /** - * Checks if a property on a message is considered to be present. - * @param {Object} obj Plain object or message instance - * @param {string} prop Property name - * @returns {boolean} `true` if considered to be present, otherwise `false` - */ - util.isSet = function isSet(obj, prop) { - var value = obj[prop]; - if (value != null && obj.hasOwnProperty(prop)) - return typeof value !== "object" || (Array.isArray(value) ? value.length : Object.keys(value).length) > 0; - return false; - }; - util.Buffer = function() { - try { - var Buffer2 = util.inquire("buffer").Buffer; - return Buffer2.prototype.utf8Write ? Buffer2 : ( - /* istanbul ignore next */ - null - ); - } catch (e) { - return null; - } - }(); - util._Buffer_from = null; - util._Buffer_allocUnsafe = null; - util.newBuffer = function newBuffer(sizeOrArray) { - return typeof sizeOrArray === "number" ? util.Buffer ? util._Buffer_allocUnsafe(sizeOrArray) : new util.Array(sizeOrArray) : util.Buffer ? util._Buffer_from(sizeOrArray) : typeof Uint8Array === "undefined" ? sizeOrArray : new Uint8Array(sizeOrArray); - }; - util.Array = typeof Uint8Array !== "undefined" ? Uint8Array : Array; - util.Long = /* istanbul ignore next */ - util.global.dcodeIO && /* istanbul ignore next */ - util.global.dcodeIO.Long || /* istanbul ignore next */ - util.global.Long || util.inquire("long"); - util.key2Re = /^true|false|0|1$/; - util.key32Re = /^-?(?:0|[1-9][0-9]*)$/; - util.key64Re = /^(?:[\\x00-\\xff]{8}|-?(?:0|[1-9][0-9]*))$/; - util.longToHash = function longToHash(value) { - return value ? util.LongBits.from(value).toHash() : util.LongBits.zeroHash; - }; - util.longFromHash = function longFromHash(hash, unsigned) { - var bits = util.LongBits.fromHash(hash); - if (util.Long) - return util.Long.fromBits(bits.lo, bits.hi, unsigned); - return bits.toNumber(Boolean(unsigned)); - }; - function merge(dst, src, ifNotSet) { - for (var keys = Object.keys(src), i = 0; i < keys.length; ++i) - if (dst[keys[i]] === void 0 || !ifNotSet) - dst[keys[i]] = src[keys[i]]; - return dst; - } - util.merge = merge; - util.lcFirst = function lcFirst(str) { - return str.charAt(0).toLowerCase() + str.substring(1); - }; - function newError(name) { - function CustomError(message, properties) { - if (!(this instanceof CustomError)) - return new CustomError(message, properties); - Object.defineProperty(this, "message", { get: function() { - return message; - } }); - if (Error.captureStackTrace) - Error.captureStackTrace(this, CustomError); - else - Object.defineProperty(this, "stack", { value: new Error().stack || "" }); - if (properties) - merge(this, properties); - } - CustomError.prototype = Object.create(Error.prototype, { - constructor: { - value: CustomError, - writable: true, - enumerable: false, - configurable: true - }, - name: { - get: function get() { - return name; - }, - set: void 0, - enumerable: false, - // configurable: false would accurately preserve the behavior of - // the original, but I'm guessing that was not intentional. - // For an actual error subclass, this property would - // be configurable. - configurable: true - }, - toString: { - value: function value() { - return this.name + ": " + this.message; - }, - writable: true, - enumerable: false, - configurable: true - } - }); - return CustomError; - } - util.newError = newError; - util.ProtocolError = newError("ProtocolError"); - util.oneOfGetter = function getOneOf(fieldNames) { - var fieldMap = {}; - for (var i = 0; i < fieldNames.length; ++i) - fieldMap[fieldNames[i]] = 1; - return function() { - for (var keys = Object.keys(this), i2 = keys.length - 1; i2 > -1; --i2) - if (fieldMap[keys[i2]] === 1 && this[keys[i2]] !== void 0 && this[keys[i2]] !== null) - return keys[i2]; - }; - }; - util.oneOfSetter = function setOneOf(fieldNames) { - return function(name) { - for (var i = 0; i < fieldNames.length; ++i) - if (fieldNames[i] !== name) - delete this[fieldNames[i]]; - }; - }; - util.toJSONOptions = { - longs: String, - enums: String, - bytes: String, - json: true - }; - util._configure = function() { - var Buffer2 = util.Buffer; - if (!Buffer2) { - util._Buffer_from = util._Buffer_allocUnsafe = null; - return; - } - util._Buffer_from = Buffer2.from !== Uint8Array.from && Buffer2.from || /* istanbul ignore next */ - function Buffer_from(value, encoding) { - return new Buffer2(value, encoding); - }; - util._Buffer_allocUnsafe = Buffer2.allocUnsafe || /* istanbul ignore next */ - function Buffer_allocUnsafe(size) { - return new Buffer2(size); - }; - }; - } -}); - -// node_modules/protobufjs/src/writer.js -var require_writer = __commonJS({ - "node_modules/protobufjs/src/writer.js"(exports2, module2) { - "use strict"; - module2.exports = Writer; - var util = require_minimal(); - var BufferWriter; - var LongBits = util.LongBits; - var base64 = util.base64; - var utf8 = util.utf8; - function Op2(fn, len, val) { - this.fn = fn; - this.len = len; - this.next = void 0; - this.val = val; - } - function noop() { - } - function State(writer) { - this.head = writer.head; - this.tail = writer.tail; - this.len = writer.len; - this.next = writer.states; - } - function Writer() { - this.len = 0; - this.head = new Op2(noop, 0, 0); - this.tail = this.head; - this.states = null; - } - var create = function create2() { - return util.Buffer ? function create_buffer_setup() { - return (Writer.create = function create_buffer() { - return new BufferWriter(); - })(); - } : function create_array() { - return new Writer(); - }; - }; - Writer.create = create(); - Writer.alloc = function alloc(size) { - return new util.Array(size); - }; - if (util.Array !== Array) - Writer.alloc = util.pool(Writer.alloc, util.Array.prototype.subarray); - Writer.prototype._push = function push(fn, len, val) { - this.tail = this.tail.next = new Op2(fn, len, val); - this.len += len; - return this; - }; - function writeByte(val, buf, pos) { - buf[pos] = val & 255; - } - function writeVarint32(val, buf, pos) { - while (val > 127) { - buf[pos++] = val & 127 | 128; - val >>>= 7; - } - buf[pos] = val; - } - function VarintOp(len, val) { - this.len = len; - this.next = void 0; - this.val = val; - } - VarintOp.prototype = Object.create(Op2.prototype); - VarintOp.prototype.fn = writeVarint32; - Writer.prototype.uint32 = function write_uint32(value) { - this.len += (this.tail = this.tail.next = new VarintOp( - (value = value >>> 0) < 128 ? 1 : value < 16384 ? 2 : value < 2097152 ? 3 : value < 268435456 ? 4 : 5, - value - )).len; - return this; - }; - Writer.prototype.int32 = function write_int32(value) { - return value < 0 ? this._push(writeVarint64, 10, LongBits.fromNumber(value)) : this.uint32(value); - }; - Writer.prototype.sint32 = function write_sint32(value) { - return this.uint32((value << 1 ^ value >> 31) >>> 0); - }; - function writeVarint64(val, buf, pos) { - while (val.hi) { - buf[pos++] = val.lo & 127 | 128; - val.lo = (val.lo >>> 7 | val.hi << 25) >>> 0; - val.hi >>>= 7; - } - while (val.lo > 127) { - buf[pos++] = val.lo & 127 | 128; - val.lo = val.lo >>> 7; - } - buf[pos++] = val.lo; - } - Writer.prototype.uint64 = function write_uint64(value) { - var bits = LongBits.from(value); - return this._push(writeVarint64, bits.length(), bits); - }; - Writer.prototype.int64 = Writer.prototype.uint64; - Writer.prototype.sint64 = function write_sint64(value) { - var bits = LongBits.from(value).zzEncode(); - return this._push(writeVarint64, bits.length(), bits); - }; - Writer.prototype.bool = function write_bool(value) { - return this._push(writeByte, 1, value ? 1 : 0); - }; - function writeFixed32(val, buf, pos) { - buf[pos] = val & 255; - buf[pos + 1] = val >>> 8 & 255; - buf[pos + 2] = val >>> 16 & 255; - buf[pos + 3] = val >>> 24; - } - Writer.prototype.fixed32 = function write_fixed32(value) { - return this._push(writeFixed32, 4, value >>> 0); - }; - Writer.prototype.sfixed32 = Writer.prototype.fixed32; - Writer.prototype.fixed64 = function write_fixed64(value) { - var bits = LongBits.from(value); - return this._push(writeFixed32, 4, bits.lo)._push(writeFixed32, 4, bits.hi); - }; - Writer.prototype.sfixed64 = Writer.prototype.fixed64; - Writer.prototype.float = function write_float(value) { - return this._push(util.float.writeFloatLE, 4, value); - }; - Writer.prototype.double = function write_double(value) { - return this._push(util.float.writeDoubleLE, 8, value); - }; - var writeBytes = util.Array.prototype.set ? function writeBytes_set(val, buf, pos) { - buf.set(val, pos); - } : function writeBytes_for(val, buf, pos) { - for (var i = 0; i < val.length; ++i) - buf[pos + i] = val[i]; - }; - Writer.prototype.bytes = function write_bytes(value) { - var len = value.length >>> 0; - if (!len) - return this._push(writeByte, 1, 0); - if (util.isString(value)) { - var buf = Writer.alloc(len = base64.length(value)); - base64.decode(value, buf, 0); - value = buf; - } - return this.uint32(len)._push(writeBytes, len, value); - }; - Writer.prototype.string = function write_string(value) { - var len = utf8.length(value); - return len ? this.uint32(len)._push(utf8.write, len, value) : this._push(writeByte, 1, 0); - }; - Writer.prototype.fork = function fork() { - this.states = new State(this); - this.head = this.tail = new Op2(noop, 0, 0); - this.len = 0; - return this; - }; - Writer.prototype.reset = function reset() { - if (this.states) { - this.head = this.states.head; - this.tail = this.states.tail; - this.len = this.states.len; - this.states = this.states.next; - } else { - this.head = this.tail = new Op2(noop, 0, 0); - this.len = 0; - } - return this; - }; - Writer.prototype.ldelim = function ldelim() { - var head = this.head, tail = this.tail, len = this.len; - this.reset().uint32(len); - if (len) { - this.tail.next = head.next; - this.tail = tail; - this.len += len; - } - return this; - }; - Writer.prototype.finish = function finish() { - var head = this.head.next, buf = this.constructor.alloc(this.len), pos = 0; - while (head) { - head.fn(head.val, buf, pos); - pos += head.len; - head = head.next; - } - return buf; - }; - Writer._configure = function(BufferWriter_) { - BufferWriter = BufferWriter_; - Writer.create = create(); - BufferWriter._configure(); - }; - } -}); - -// node_modules/protobufjs/src/writer_buffer.js -var require_writer_buffer = __commonJS({ - "node_modules/protobufjs/src/writer_buffer.js"(exports2, module2) { - "use strict"; - module2.exports = BufferWriter; - var Writer = require_writer(); - (BufferWriter.prototype = Object.create(Writer.prototype)).constructor = BufferWriter; - var util = require_minimal(); - function BufferWriter() { - Writer.call(this); - } - BufferWriter._configure = function() { - BufferWriter.alloc = util._Buffer_allocUnsafe; - BufferWriter.writeBytesBuffer = util.Buffer && util.Buffer.prototype instanceof Uint8Array && util.Buffer.prototype.set.name === "set" ? function writeBytesBuffer_set(val, buf, pos) { - buf.set(val, pos); - } : function writeBytesBuffer_copy(val, buf, pos) { - if (val.copy) - val.copy(buf, pos, 0, val.length); - else - for (var i = 0; i < val.length; ) - buf[pos++] = val[i++]; - }; - }; - BufferWriter.prototype.bytes = function write_bytes_buffer(value) { - if (util.isString(value)) - value = util._Buffer_from(value, "base64"); - var len = value.length >>> 0; - this.uint32(len); - if (len) - this._push(BufferWriter.writeBytesBuffer, len, value); - return this; - }; - function writeStringBuffer(val, buf, pos) { - if (val.length < 40) - util.utf8.write(val, buf, pos); - else if (buf.utf8Write) - buf.utf8Write(val, pos); - else - buf.write(val, pos); - } - BufferWriter.prototype.string = function write_string_buffer(value) { - var len = util.Buffer.byteLength(value); - this.uint32(len); - if (len) - this._push(writeStringBuffer, len, value); - return this; - }; - BufferWriter._configure(); - } -}); - -// node_modules/protobufjs/src/reader.js -var require_reader = __commonJS({ - "node_modules/protobufjs/src/reader.js"(exports2, module2) { - "use strict"; - module2.exports = Reader; - var util = require_minimal(); - var BufferReader; - var LongBits = util.LongBits; - var utf8 = util.utf8; - function indexOutOfRange(reader, writeLength) { - return RangeError("index out of range: " + reader.pos + " + " + (writeLength || 1) + " > " + reader.len); - } - function Reader(buffer) { - this.buf = buffer; - this.pos = 0; - this.len = buffer.length; - } - var create_array = typeof Uint8Array !== "undefined" ? function create_typed_array(buffer) { - if (buffer instanceof Uint8Array || Array.isArray(buffer)) - return new Reader(buffer); - throw Error("illegal buffer"); - } : function create_array2(buffer) { - if (Array.isArray(buffer)) - return new Reader(buffer); - throw Error("illegal buffer"); - }; - var create = function create2() { - return util.Buffer ? function create_buffer_setup(buffer) { - return (Reader.create = function create_buffer(buffer2) { - return util.Buffer.isBuffer(buffer2) ? new BufferReader(buffer2) : create_array(buffer2); - })(buffer); - } : create_array; - }; - Reader.create = create(); - Reader.prototype._slice = util.Array.prototype.subarray || /* istanbul ignore next */ - util.Array.prototype.slice; - Reader.prototype.uint32 = function read_uint32_setup() { - var value = 4294967295; - return function read_uint32() { - value = (this.buf[this.pos] & 127) >>> 0; - if (this.buf[this.pos++] < 128) - return value; - value = (value | (this.buf[this.pos] & 127) << 7) >>> 0; - if (this.buf[this.pos++] < 128) - return value; - value = (value | (this.buf[this.pos] & 127) << 14) >>> 0; - if (this.buf[this.pos++] < 128) - return value; - value = (value | (this.buf[this.pos] & 127) << 21) >>> 0; - if (this.buf[this.pos++] < 128) - return value; - value = (value | (this.buf[this.pos] & 15) << 28) >>> 0; - if (this.buf[this.pos++] < 128) - return value; - if ((this.pos += 5) > this.len) { - this.pos = this.len; - throw indexOutOfRange(this, 10); - } - return value; - }; - }(); - Reader.prototype.int32 = function read_int32() { - return this.uint32() | 0; - }; - Reader.prototype.sint32 = function read_sint32() { - var value = this.uint32(); - return value >>> 1 ^ -(value & 1) | 0; - }; - function readLongVarint() { - var bits = new LongBits(0, 0); - var i = 0; - if (this.len - this.pos > 4) { - for (; i < 4; ++i) { - bits.lo = (bits.lo | (this.buf[this.pos] & 127) << i * 7) >>> 0; - if (this.buf[this.pos++] < 128) - return bits; - } - bits.lo = (bits.lo | (this.buf[this.pos] & 127) << 28) >>> 0; - bits.hi = (bits.hi | (this.buf[this.pos] & 127) >> 4) >>> 0; - if (this.buf[this.pos++] < 128) - return bits; - i = 0; - } else { - for (; i < 3; ++i) { - if (this.pos >= this.len) - throw indexOutOfRange(this); - bits.lo = (bits.lo | (this.buf[this.pos] & 127) << i * 7) >>> 0; - if (this.buf[this.pos++] < 128) - return bits; - } - bits.lo = (bits.lo | (this.buf[this.pos++] & 127) << i * 7) >>> 0; - return bits; - } - if (this.len - this.pos > 4) { - for (; i < 5; ++i) { - bits.hi = (bits.hi | (this.buf[this.pos] & 127) << i * 7 + 3) >>> 0; - if (this.buf[this.pos++] < 128) - return bits; - } - } else { - for (; i < 5; ++i) { - if (this.pos >= this.len) - throw indexOutOfRange(this); - bits.hi = (bits.hi | (this.buf[this.pos] & 127) << i * 7 + 3) >>> 0; - if (this.buf[this.pos++] < 128) - return bits; - } - } - throw Error("invalid varint encoding"); - } - Reader.prototype.bool = function read_bool() { - return this.uint32() !== 0; - }; - function readFixed32_end(buf, end) { - return (buf[end - 4] | buf[end - 3] << 8 | buf[end - 2] << 16 | buf[end - 1] << 24) >>> 0; - } - Reader.prototype.fixed32 = function read_fixed32() { - if (this.pos + 4 > this.len) - throw indexOutOfRange(this, 4); - return readFixed32_end(this.buf, this.pos += 4); - }; - Reader.prototype.sfixed32 = function read_sfixed32() { - if (this.pos + 4 > this.len) - throw indexOutOfRange(this, 4); - return readFixed32_end(this.buf, this.pos += 4) | 0; - }; - function readFixed64() { - if (this.pos + 8 > this.len) - throw indexOutOfRange(this, 8); - return new LongBits(readFixed32_end(this.buf, this.pos += 4), readFixed32_end(this.buf, this.pos += 4)); - } - Reader.prototype.float = function read_float() { - if (this.pos + 4 > this.len) - throw indexOutOfRange(this, 4); - var value = util.float.readFloatLE(this.buf, this.pos); - this.pos += 4; - return value; - }; - Reader.prototype.double = function read_double() { - if (this.pos + 8 > this.len) - throw indexOutOfRange(this, 4); - var value = util.float.readDoubleLE(this.buf, this.pos); - this.pos += 8; - return value; - }; - Reader.prototype.bytes = function read_bytes() { - var length = this.uint32(), start = this.pos, end = this.pos + length; - if (end > this.len) - throw indexOutOfRange(this, length); - this.pos += length; - if (Array.isArray(this.buf)) - return this.buf.slice(start, end); - return start === end ? new this.buf.constructor(0) : this._slice.call(this.buf, start, end); - }; - Reader.prototype.string = function read_string() { - var bytes = this.bytes(); - return utf8.read(bytes, 0, bytes.length); - }; - Reader.prototype.skip = function skip(length) { - if (typeof length === "number") { - if (this.pos + length > this.len) - throw indexOutOfRange(this, length); - this.pos += length; - } else { - do { - if (this.pos >= this.len) - throw indexOutOfRange(this); - } while (this.buf[this.pos++] & 128); - } - return this; - }; - Reader.prototype.skipType = function(wireType) { - switch (wireType) { - case 0: - this.skip(); - break; - case 1: - this.skip(8); - break; - case 2: - this.skip(this.uint32()); - break; - case 3: - while ((wireType = this.uint32() & 7) !== 4) { - this.skipType(wireType); - } - break; - case 5: - this.skip(4); - break; - default: - throw Error("invalid wire type " + wireType + " at offset " + this.pos); - } - return this; - }; - Reader._configure = function(BufferReader_) { - BufferReader = BufferReader_; - Reader.create = create(); - BufferReader._configure(); - var fn = util.Long ? "toLong" : ( - /* istanbul ignore next */ - "toNumber" - ); - util.merge(Reader.prototype, { - int64: function read_int64() { - return readLongVarint.call(this)[fn](false); - }, - uint64: function read_uint64() { - return readLongVarint.call(this)[fn](true); - }, - sint64: function read_sint64() { - return readLongVarint.call(this).zzDecode()[fn](false); - }, - fixed64: function read_fixed64() { - return readFixed64.call(this)[fn](true); - }, - sfixed64: function read_sfixed64() { - return readFixed64.call(this)[fn](false); - } - }); - }; - } -}); - -// node_modules/protobufjs/src/reader_buffer.js -var require_reader_buffer = __commonJS({ - "node_modules/protobufjs/src/reader_buffer.js"(exports2, module2) { - "use strict"; - module2.exports = BufferReader; - var Reader = require_reader(); - (BufferReader.prototype = Object.create(Reader.prototype)).constructor = BufferReader; - var util = require_minimal(); - function BufferReader(buffer) { - Reader.call(this, buffer); - } - BufferReader._configure = function() { - if (util.Buffer) - BufferReader.prototype._slice = util.Buffer.prototype.slice; - }; - BufferReader.prototype.string = function read_string_buffer() { - var len = this.uint32(); - return this.buf.utf8Slice ? this.buf.utf8Slice(this.pos, this.pos = Math.min(this.pos + len, this.len)) : this.buf.toString("utf-8", this.pos, this.pos = Math.min(this.pos + len, this.len)); - }; - BufferReader._configure(); - } -}); - -// node_modules/protobufjs/src/rpc/service.js -var require_service = __commonJS({ - "node_modules/protobufjs/src/rpc/service.js"(exports2, module2) { - "use strict"; - module2.exports = Service; - var util = require_minimal(); - (Service.prototype = Object.create(util.EventEmitter.prototype)).constructor = Service; - function Service(rpcImpl, requestDelimited, responseDelimited) { - if (typeof rpcImpl !== "function") - throw TypeError("rpcImpl must be a function"); - util.EventEmitter.call(this); - this.rpcImpl = rpcImpl; - this.requestDelimited = Boolean(requestDelimited); - this.responseDelimited = Boolean(responseDelimited); - } - Service.prototype.rpcCall = function rpcCall(method, requestCtor, responseCtor, request, callback) { - if (!request) - throw TypeError("request must be specified"); - var self2 = this; - if (!callback) - return util.asPromise(rpcCall, self2, method, requestCtor, responseCtor, request); - if (!self2.rpcImpl) { - setTimeout(function() { - callback(Error("already ended")); - }, 0); - return void 0; - } - try { - return self2.rpcImpl( - method, - requestCtor[self2.requestDelimited ? "encodeDelimited" : "encode"](request).finish(), - function rpcCallback(err, response) { - if (err) { - self2.emit("error", err, method); - return callback(err); - } - if (response === null) { - self2.end( - /* endedByRPC */ - true - ); - return void 0; - } - if (!(response instanceof responseCtor)) { - try { - response = responseCtor[self2.responseDelimited ? "decodeDelimited" : "decode"](response); - } catch (err2) { - self2.emit("error", err2, method); - return callback(err2); - } - } - self2.emit("data", response, method); - return callback(null, response); - } - ); - } catch (err) { - self2.emit("error", err, method); - setTimeout(function() { - callback(err); - }, 0); - return void 0; - } - }; - Service.prototype.end = function end(endedByRPC) { - if (this.rpcImpl) { - if (!endedByRPC) - this.rpcImpl(null, null, null); - this.rpcImpl = null; - this.emit("end").off(); - } - return this; - }; - } -}); - -// node_modules/protobufjs/src/rpc.js -var require_rpc = __commonJS({ - "node_modules/protobufjs/src/rpc.js"(exports2) { - "use strict"; - var rpc = exports2; - rpc.Service = require_service(); - } -}); - -// node_modules/protobufjs/src/roots.js -var require_roots = __commonJS({ - "node_modules/protobufjs/src/roots.js"(exports2, module2) { - "use strict"; - module2.exports = {}; - } -}); - -// node_modules/protobufjs/src/index-minimal.js -var require_index_minimal = __commonJS({ - "node_modules/protobufjs/src/index-minimal.js"(exports2) { - "use strict"; - var protobuf = exports2; - protobuf.build = "minimal"; - protobuf.Writer = require_writer(); - protobuf.BufferWriter = require_writer_buffer(); - protobuf.Reader = require_reader(); - protobuf.BufferReader = require_reader_buffer(); - protobuf.util = require_minimal(); - protobuf.rpc = require_rpc(); - protobuf.roots = require_roots(); - protobuf.configure = configure; - function configure() { - protobuf.util._configure(); - protobuf.Writer._configure(protobuf.BufferWriter); - protobuf.Reader._configure(protobuf.BufferReader); - } - configure(); - } -}); - -// node_modules/@protobufjs/codegen/index.js -var require_codegen = __commonJS({ - "node_modules/@protobufjs/codegen/index.js"(exports2, module2) { - "use strict"; - module2.exports = codegen; - function codegen(functionParams, functionName) { - if (typeof functionParams === "string") { - functionName = functionParams; - functionParams = void 0; - } - var body = []; - function Codegen(formatStringOrScope) { - if (typeof formatStringOrScope !== "string") { - var source = toString(); - if (codegen.verbose) - console.log("codegen: " + source); - source = "return " + source; - if (formatStringOrScope) { - var scopeKeys = Object.keys(formatStringOrScope), scopeParams = new Array(scopeKeys.length + 1), scopeValues = new Array(scopeKeys.length), scopeOffset = 0; - while (scopeOffset < scopeKeys.length) { - scopeParams[scopeOffset] = scopeKeys[scopeOffset]; - scopeValues[scopeOffset] = formatStringOrScope[scopeKeys[scopeOffset++]]; - } - scopeParams[scopeOffset] = source; - return Function.apply(null, scopeParams).apply(null, scopeValues); - } - return Function(source)(); - } - var formatParams = new Array(arguments.length - 1), formatOffset = 0; - while (formatOffset < formatParams.length) - formatParams[formatOffset] = arguments[++formatOffset]; - formatOffset = 0; - formatStringOrScope = formatStringOrScope.replace(/%([%dfijs])/g, function replace($0, $1) { - var value = formatParams[formatOffset++]; - switch ($1) { - case "d": - case "f": - return String(Number(value)); - case "i": - return String(Math.floor(value)); - case "j": - return JSON.stringify(value); - case "s": - return String(value); - } - return "%"; - }); - if (formatOffset !== formatParams.length) - throw Error("parameter count mismatch"); - body.push(formatStringOrScope); - return Codegen; - } - function toString(functionNameOverride) { - return "function " + (functionNameOverride || functionName || "") + "(" + (functionParams && functionParams.join(",") || "") + "){\n " + body.join("\n ") + "\n}"; - } - Codegen.toString = toString; - return Codegen; - } - codegen.verbose = false; - } -}); - -// node_modules/@protobufjs/fetch/index.js -var require_fetch = __commonJS({ - "node_modules/@protobufjs/fetch/index.js"(exports2, module2) { - "use strict"; - module2.exports = fetch; - var asPromise = require_aspromise(); - var inquire2 = require_inquire(); - var fs2 = inquire2("fs"); - function fetch(filename, options2, callback) { - if (typeof options2 === "function") { - callback = options2; - options2 = {}; - } else if (!options2) - options2 = {}; - if (!callback) - return asPromise(fetch, this, filename, options2); - if (!options2.xhr && fs2 && fs2.readFile) - return fs2.readFile(filename, function fetchReadFileCallback(err, contents) { - return err && typeof XMLHttpRequest !== "undefined" ? fetch.xhr(filename, options2, callback) : err ? callback(err) : callback(null, options2.binary ? contents : contents.toString("utf8")); - }); - return fetch.xhr(filename, options2, callback); - } - fetch.xhr = function fetch_xhr(filename, options2, callback) { - var xhr = new XMLHttpRequest(); - xhr.onreadystatechange = function fetchOnReadyStateChange() { - if (xhr.readyState !== 4) - return void 0; - if (xhr.status !== 0 && xhr.status !== 200) - return callback(Error("status " + xhr.status)); - if (options2.binary) { - var buffer = xhr.response; - if (!buffer) { - buffer = []; - for (var i = 0; i < xhr.responseText.length; ++i) - buffer.push(xhr.responseText.charCodeAt(i) & 255); - } - return callback(null, typeof Uint8Array !== "undefined" ? new Uint8Array(buffer) : buffer); - } - return callback(null, xhr.responseText); - }; - if (options2.binary) { - if ("overrideMimeType" in xhr) - xhr.overrideMimeType("text/plain; charset=x-user-defined"); - xhr.responseType = "arraybuffer"; - } - xhr.open("GET", filename); - xhr.send(); - }; - } -}); - -// node_modules/@protobufjs/path/index.js -var require_path = __commonJS({ - "node_modules/@protobufjs/path/index.js"(exports2) { - "use strict"; - var path = exports2; - var isAbsolute = ( - /** - * Tests if the specified path is absolute. - * @param {string} path Path to test - * @returns {boolean} `true` if path is absolute - */ - path.isAbsolute = function isAbsolute2(path2) { - return /^(?:\/|\w+:)/.test(path2); - } - ); - var normalize = ( - /** - * Normalizes the specified path. - * @param {string} path Path to normalize - * @returns {string} Normalized path - */ - path.normalize = function normalize2(path2) { - path2 = path2.replace(/\\/g, "/").replace(/\/{2,}/g, "/"); - var parts = path2.split("/"), absolute = isAbsolute(path2), prefix = ""; - if (absolute) - prefix = parts.shift() + "/"; - for (var i = 0; i < parts.length; ) { - if (parts[i] === "..") { - if (i > 0 && parts[i - 1] !== "..") - parts.splice(--i, 2); - else if (absolute) - parts.splice(i, 1); - else - ++i; - } else if (parts[i] === ".") - parts.splice(i, 1); - else - ++i; - } - return prefix + parts.join("/"); - } - ); - path.resolve = function resolve(originPath, includePath, alreadyNormalized) { - if (!alreadyNormalized) - includePath = normalize(includePath); - if (isAbsolute(includePath)) - return includePath; - if (!alreadyNormalized) - originPath = normalize(originPath); - return (originPath = originPath.replace(/(?:\/|^)[^/]+$/, "")).length ? normalize(originPath + "/" + includePath) : includePath; - }; - } -}); - -// node_modules/protobufjs/src/types.js -var require_types = __commonJS({ - "node_modules/protobufjs/src/types.js"(exports2) { - "use strict"; - var types = exports2; - var util = require_util(); - var s = [ - "double", - // 0 - "float", - // 1 - "int32", - // 2 - "uint32", - // 3 - "sint32", - // 4 - "fixed32", - // 5 - "sfixed32", - // 6 - "int64", - // 7 - "uint64", - // 8 - "sint64", - // 9 - "fixed64", - // 10 - "sfixed64", - // 11 - "bool", - // 12 - "string", - // 13 - "bytes" - // 14 - ]; - function bake(values, offset) { - var i = 0, o = {}; - offset |= 0; - while (i < values.length) - o[s[i + offset]] = values[i++]; - return o; - } - types.basic = bake([ - /* double */ - 1, - /* float */ - 5, - /* int32 */ - 0, - /* uint32 */ - 0, - /* sint32 */ - 0, - /* fixed32 */ - 5, - /* sfixed32 */ - 5, - /* int64 */ - 0, - /* uint64 */ - 0, - /* sint64 */ - 0, - /* fixed64 */ - 1, - /* sfixed64 */ - 1, - /* bool */ - 0, - /* string */ - 2, - /* bytes */ - 2 - ]); - types.defaults = bake([ - /* double */ - 0, - /* float */ - 0, - /* int32 */ - 0, - /* uint32 */ - 0, - /* sint32 */ - 0, - /* fixed32 */ - 0, - /* sfixed32 */ - 0, - /* int64 */ - 0, - /* uint64 */ - 0, - /* sint64 */ - 0, - /* fixed64 */ - 0, - /* sfixed64 */ - 0, - /* bool */ - false, - /* string */ - "", - /* bytes */ - util.emptyArray, - /* message */ - null - ]); - types.long = bake([ - /* int64 */ - 0, - /* uint64 */ - 0, - /* sint64 */ - 0, - /* fixed64 */ - 1, - /* sfixed64 */ - 1 - ], 7); - types.mapKey = bake([ - /* int32 */ - 0, - /* uint32 */ - 0, - /* sint32 */ - 0, - /* fixed32 */ - 5, - /* sfixed32 */ - 5, - /* int64 */ - 0, - /* uint64 */ - 0, - /* sint64 */ - 0, - /* fixed64 */ - 1, - /* sfixed64 */ - 1, - /* bool */ - 0, - /* string */ - 2 - ], 2); - types.packed = bake([ - /* double */ - 1, - /* float */ - 5, - /* int32 */ - 0, - /* uint32 */ - 0, - /* sint32 */ - 0, - /* fixed32 */ - 5, - /* sfixed32 */ - 5, - /* int64 */ - 0, - /* uint64 */ - 0, - /* sint64 */ - 0, - /* fixed64 */ - 1, - /* sfixed64 */ - 1, - /* bool */ - 0 - ]); - } -}); - -// node_modules/protobufjs/src/field.js -var require_field = __commonJS({ - "node_modules/protobufjs/src/field.js"(exports2, module2) { - "use strict"; - module2.exports = Field; - var ReflectionObject = require_object(); - ((Field.prototype = Object.create(ReflectionObject.prototype)).constructor = Field).className = "Field"; - var Enum = require_enum(); - var types = require_types(); - var util = require_util(); - var Type; - var ruleRe = /^required|optional|repeated$/; - Field.fromJSON = function fromJSON(name, json) { - return new Field(name, json.id, json.type, json.rule, json.extend, json.options, json.comment); - }; - function Field(name, id, type, rule, extend, options2, comment) { - if (util.isObject(rule)) { - comment = extend; - options2 = rule; - rule = extend = void 0; - } else if (util.isObject(extend)) { - comment = options2; - options2 = extend; - extend = void 0; - } - ReflectionObject.call(this, name, options2); - if (!util.isInteger(id) || id < 0) - throw TypeError("id must be a non-negative integer"); - if (!util.isString(type)) - throw TypeError("type must be a string"); - if (rule !== void 0 && !ruleRe.test(rule = rule.toString().toLowerCase())) - throw TypeError("rule must be a string rule"); - if (extend !== void 0 && !util.isString(extend)) - throw TypeError("extend must be a string"); - if (rule === "proto3_optional") { - rule = "optional"; - } - this.rule = rule && rule !== "optional" ? rule : void 0; - this.type = type; - this.id = id; - this.extend = extend || void 0; - this.required = rule === "required"; - this.optional = !this.required; - this.repeated = rule === "repeated"; - this.map = false; - this.message = null; - this.partOf = null; - this.typeDefault = null; - this.defaultValue = null; - this.long = util.Long ? types.long[type] !== void 0 : ( - /* istanbul ignore next */ - false - ); - this.bytes = type === "bytes"; - this.resolvedType = null; - this.extensionField = null; - this.declaringField = null; - this._packed = null; - this.comment = comment; - } - Object.defineProperty(Field.prototype, "packed", { - get: function() { - if (this._packed === null) - this._packed = this.getOption("packed") !== false; - return this._packed; - } - }); - Field.prototype.setOption = function setOption(name, value, ifNotSet) { - if (name === "packed") - this._packed = null; - return ReflectionObject.prototype.setOption.call(this, name, value, ifNotSet); - }; - Field.prototype.toJSON = function toJSON(toJSONOptions) { - var keepComments = toJSONOptions ? Boolean(toJSONOptions.keepComments) : false; - return util.toObject([ - "rule", - this.rule !== "optional" && this.rule || void 0, - "type", - this.type, - "id", - this.id, - "extend", - this.extend, - "options", - this.options, - "comment", - keepComments ? this.comment : void 0 - ]); - }; - Field.prototype.resolve = function resolve() { - if (this.resolved) - return this; - if ((this.typeDefault = types.defaults[this.type]) === void 0) { - this.resolvedType = (this.declaringField ? this.declaringField.parent : this.parent).lookupTypeOrEnum(this.type); - if (this.resolvedType instanceof Type) - this.typeDefault = null; - else - this.typeDefault = this.resolvedType.values[Object.keys(this.resolvedType.values)[0]]; - } else if (this.options && this.options.proto3_optional) { - this.typeDefault = null; - } - if (this.options && this.options["default"] != null) { - this.typeDefault = this.options["default"]; - if (this.resolvedType instanceof Enum && typeof this.typeDefault === "string") - this.typeDefault = this.resolvedType.values[this.typeDefault]; - } - if (this.options) { - if (this.options.packed === true || this.options.packed !== void 0 && this.resolvedType && !(this.resolvedType instanceof Enum)) - delete this.options.packed; - if (!Object.keys(this.options).length) - this.options = void 0; - } - if (this.long) { - this.typeDefault = util.Long.fromNumber(this.typeDefault, this.type.charAt(0) === "u"); - if (Object.freeze) - Object.freeze(this.typeDefault); - } else if (this.bytes && typeof this.typeDefault === "string") { - var buf; - if (util.base64.test(this.typeDefault)) - util.base64.decode(this.typeDefault, buf = util.newBuffer(util.base64.length(this.typeDefault)), 0); - else - util.utf8.write(this.typeDefault, buf = util.newBuffer(util.utf8.length(this.typeDefault)), 0); - this.typeDefault = buf; - } - if (this.map) - this.defaultValue = util.emptyObject; - else if (this.repeated) - this.defaultValue = util.emptyArray; - else - this.defaultValue = this.typeDefault; - if (this.parent instanceof Type) - this.parent.ctor.prototype[this.name] = this.defaultValue; - return ReflectionObject.prototype.resolve.call(this); - }; - Field.d = function decorateField(fieldId, fieldType, fieldRule, defaultValue) { - if (typeof fieldType === "function") - fieldType = util.decorateType(fieldType).name; - else if (fieldType && typeof fieldType === "object") - fieldType = util.decorateEnum(fieldType).name; - return function fieldDecorator(prototype, fieldName) { - util.decorateType(prototype.constructor).add(new Field(fieldName, fieldId, fieldType, fieldRule, { "default": defaultValue })); - }; - }; - Field._configure = function configure(Type_) { - Type = Type_; - }; - } -}); - -// node_modules/protobufjs/src/oneof.js -var require_oneof = __commonJS({ - "node_modules/protobufjs/src/oneof.js"(exports2, module2) { - "use strict"; - module2.exports = OneOf; - var ReflectionObject = require_object(); - ((OneOf.prototype = Object.create(ReflectionObject.prototype)).constructor = OneOf).className = "OneOf"; - var Field = require_field(); - var util = require_util(); - function OneOf(name, fieldNames, options2, comment) { - if (!Array.isArray(fieldNames)) { - options2 = fieldNames; - fieldNames = void 0; - } - ReflectionObject.call(this, name, options2); - if (!(fieldNames === void 0 || Array.isArray(fieldNames))) - throw TypeError("fieldNames must be an Array"); - this.oneof = fieldNames || []; - this.fieldsArray = []; - this.comment = comment; - } - OneOf.fromJSON = function fromJSON(name, json) { - return new OneOf(name, json.oneof, json.options, json.comment); - }; - OneOf.prototype.toJSON = function toJSON(toJSONOptions) { - var keepComments = toJSONOptions ? Boolean(toJSONOptions.keepComments) : false; - return util.toObject([ - "options", - this.options, - "oneof", - this.oneof, - "comment", - keepComments ? this.comment : void 0 - ]); - }; - function addFieldsToParent(oneof) { - if (oneof.parent) { - for (var i = 0; i < oneof.fieldsArray.length; ++i) - if (!oneof.fieldsArray[i].parent) - oneof.parent.add(oneof.fieldsArray[i]); - } - } - OneOf.prototype.add = function add(field) { - if (!(field instanceof Field)) - throw TypeError("field must be a Field"); - if (field.parent && field.parent !== this.parent) - field.parent.remove(field); - this.oneof.push(field.name); - this.fieldsArray.push(field); - field.partOf = this; - addFieldsToParent(this); - return this; - }; - OneOf.prototype.remove = function remove(field) { - if (!(field instanceof Field)) - throw TypeError("field must be a Field"); - var index = this.fieldsArray.indexOf(field); - if (index < 0) - throw Error(field + " is not a member of " + this); - this.fieldsArray.splice(index, 1); - index = this.oneof.indexOf(field.name); - if (index > -1) - this.oneof.splice(index, 1); - field.partOf = null; - return this; - }; - OneOf.prototype.onAdd = function onAdd(parent) { - ReflectionObject.prototype.onAdd.call(this, parent); - var self2 = this; - for (var i = 0; i < this.oneof.length; ++i) { - var field = parent.get(this.oneof[i]); - if (field && !field.partOf) { - field.partOf = self2; - self2.fieldsArray.push(field); - } - } - addFieldsToParent(this); - }; - OneOf.prototype.onRemove = function onRemove(parent) { - for (var i = 0, field; i < this.fieldsArray.length; ++i) - if ((field = this.fieldsArray[i]).parent) - field.parent.remove(field); - ReflectionObject.prototype.onRemove.call(this, parent); - }; - OneOf.d = function decorateOneOf() { - var fieldNames = new Array(arguments.length), index = 0; - while (index < arguments.length) - fieldNames[index] = arguments[index++]; - return function oneOfDecorator(prototype, oneofName) { - util.decorateType(prototype.constructor).add(new OneOf(oneofName, fieldNames)); - Object.defineProperty(prototype, oneofName, { - get: util.oneOfGetter(fieldNames), - set: util.oneOfSetter(fieldNames) - }); - }; - }; - } -}); - -// node_modules/protobufjs/src/namespace.js -var require_namespace = __commonJS({ - "node_modules/protobufjs/src/namespace.js"(exports2, module2) { - "use strict"; - module2.exports = Namespace; - var ReflectionObject = require_object(); - ((Namespace.prototype = Object.create(ReflectionObject.prototype)).constructor = Namespace).className = "Namespace"; - var Field = require_field(); - var util = require_util(); - var OneOf = require_oneof(); - var Type; - var Service; - var Enum; - Namespace.fromJSON = function fromJSON(name, json) { - return new Namespace(name, json.options).addJSON(json.nested); - }; - function arrayToJSON(array, toJSONOptions) { - if (!(array && array.length)) - return void 0; - var obj = {}; - for (var i = 0; i < array.length; ++i) - obj[array[i].name] = array[i].toJSON(toJSONOptions); - return obj; - } - Namespace.arrayToJSON = arrayToJSON; - Namespace.isReservedId = function isReservedId(reserved, id) { - if (reserved) { - for (var i = 0; i < reserved.length; ++i) - if (typeof reserved[i] !== "string" && reserved[i][0] <= id && reserved[i][1] > id) - return true; - } - return false; - }; - Namespace.isReservedName = function isReservedName(reserved, name) { - if (reserved) { - for (var i = 0; i < reserved.length; ++i) - if (reserved[i] === name) - return true; - } - return false; - }; - function Namespace(name, options2) { - ReflectionObject.call(this, name, options2); - this.nested = void 0; - this._nestedArray = null; - } - function clearCache(namespace) { - namespace._nestedArray = null; - return namespace; - } - Object.defineProperty(Namespace.prototype, "nestedArray", { - get: function() { - return this._nestedArray || (this._nestedArray = util.toArray(this.nested)); - } - }); - Namespace.prototype.toJSON = function toJSON(toJSONOptions) { - return util.toObject([ - "options", - this.options, - "nested", - arrayToJSON(this.nestedArray, toJSONOptions) - ]); - }; - Namespace.prototype.addJSON = function addJSON(nestedJson) { - var ns3 = this; - if (nestedJson) { - for (var names = Object.keys(nestedJson), i = 0, nested; i < names.length; ++i) { - nested = nestedJson[names[i]]; - ns3.add( - // most to least likely - (nested.fields !== void 0 ? Type.fromJSON : nested.values !== void 0 ? Enum.fromJSON : nested.methods !== void 0 ? Service.fromJSON : nested.id !== void 0 ? Field.fromJSON : Namespace.fromJSON)(names[i], nested) - ); - } - } - return this; - }; - Namespace.prototype.get = function get(name) { - return this.nested && this.nested[name] || null; - }; - Namespace.prototype.getEnum = function getEnum(name) { - if (this.nested && this.nested[name] instanceof Enum) - return this.nested[name].values; - throw Error("no such enum: " + name); - }; - Namespace.prototype.add = function add(object) { - if (!(object instanceof Field && object.extend !== void 0 || object instanceof Type || object instanceof OneOf || object instanceof Enum || object instanceof Service || object instanceof Namespace)) - throw TypeError("object must be a valid nested object"); - if (!this.nested) - this.nested = {}; - else { - var prev = this.get(object.name); - if (prev) { - if (prev instanceof Namespace && object instanceof Namespace && !(prev instanceof Type || prev instanceof Service)) { - var nested = prev.nestedArray; - for (var i = 0; i < nested.length; ++i) - object.add(nested[i]); - this.remove(prev); - if (!this.nested) - this.nested = {}; - object.setOptions(prev.options, true); - } else - throw Error("duplicate name '" + object.name + "' in " + this); - } - } - this.nested[object.name] = object; - object.onAdd(this); - return clearCache(this); - }; - Namespace.prototype.remove = function remove(object) { - if (!(object instanceof ReflectionObject)) - throw TypeError("object must be a ReflectionObject"); - if (object.parent !== this) - throw Error(object + " is not a member of " + this); - delete this.nested[object.name]; - if (!Object.keys(this.nested).length) - this.nested = void 0; - object.onRemove(this); - return clearCache(this); - }; - Namespace.prototype.define = function define(path, json) { - if (util.isString(path)) - path = path.split("."); - else if (!Array.isArray(path)) - throw TypeError("illegal path"); - if (path && path.length && path[0] === "") - throw Error("path must be relative"); - var ptr = this; - while (path.length > 0) { - var part = path.shift(); - if (ptr.nested && ptr.nested[part]) { - ptr = ptr.nested[part]; - if (!(ptr instanceof Namespace)) - throw Error("path conflicts with non-namespace objects"); - } else - ptr.add(ptr = new Namespace(part)); - } - if (json) - ptr.addJSON(json); - return ptr; - }; - Namespace.prototype.resolveAll = function resolveAll() { - var nested = this.nestedArray, i = 0; - while (i < nested.length) - if (nested[i] instanceof Namespace) - nested[i++].resolveAll(); - else - nested[i++].resolve(); - return this.resolve(); - }; - Namespace.prototype.lookup = function lookup(path, filterTypes, parentAlreadyChecked) { - if (typeof filterTypes === "boolean") { - parentAlreadyChecked = filterTypes; - filterTypes = void 0; - } else if (filterTypes && !Array.isArray(filterTypes)) - filterTypes = [filterTypes]; - if (util.isString(path) && path.length) { - if (path === ".") - return this.root; - path = path.split("."); - } else if (!path.length) - return this; - if (path[0] === "") - return this.root.lookup(path.slice(1), filterTypes); - var found = this.get(path[0]); - if (found) { - if (path.length === 1) { - if (!filterTypes || filterTypes.indexOf(found.constructor) > -1) - return found; - } else if (found instanceof Namespace && (found = found.lookup(path.slice(1), filterTypes, true))) - return found; - } else - for (var i = 0; i < this.nestedArray.length; ++i) - if (this._nestedArray[i] instanceof Namespace && (found = this._nestedArray[i].lookup(path, filterTypes, true))) - return found; - if (this.parent === null || parentAlreadyChecked) - return null; - return this.parent.lookup(path, filterTypes); - }; - Namespace.prototype.lookupType = function lookupType(path) { - var found = this.lookup(path, [Type]); - if (!found) - throw Error("no such type: " + path); - return found; - }; - Namespace.prototype.lookupEnum = function lookupEnum(path) { - var found = this.lookup(path, [Enum]); - if (!found) - throw Error("no such Enum '" + path + "' in " + this); - return found; - }; - Namespace.prototype.lookupTypeOrEnum = function lookupTypeOrEnum(path) { - var found = this.lookup(path, [Type, Enum]); - if (!found) - throw Error("no such Type or Enum '" + path + "' in " + this); - return found; - }; - Namespace.prototype.lookupService = function lookupService(path) { - var found = this.lookup(path, [Service]); - if (!found) - throw Error("no such Service '" + path + "' in " + this); - return found; - }; - Namespace._configure = function(Type_, Service_, Enum_) { - Type = Type_; - Service = Service_; - Enum = Enum_; - }; - } -}); - -// node_modules/protobufjs/src/mapfield.js -var require_mapfield = __commonJS({ - "node_modules/protobufjs/src/mapfield.js"(exports2, module2) { - "use strict"; - module2.exports = MapField; - var Field = require_field(); - ((MapField.prototype = Object.create(Field.prototype)).constructor = MapField).className = "MapField"; - var types = require_types(); - var util = require_util(); - function MapField(name, id, keyType, type, options2, comment) { - Field.call(this, name, id, type, void 0, void 0, options2, comment); - if (!util.isString(keyType)) - throw TypeError("keyType must be a string"); - this.keyType = keyType; - this.resolvedKeyType = null; - this.map = true; - } - MapField.fromJSON = function fromJSON(name, json) { - return new MapField(name, json.id, json.keyType, json.type, json.options, json.comment); - }; - MapField.prototype.toJSON = function toJSON(toJSONOptions) { - var keepComments = toJSONOptions ? Boolean(toJSONOptions.keepComments) : false; - return util.toObject([ - "keyType", - this.keyType, - "type", - this.type, - "id", - this.id, - "extend", - this.extend, - "options", - this.options, - "comment", - keepComments ? this.comment : void 0 - ]); - }; - MapField.prototype.resolve = function resolve() { - if (this.resolved) - return this; - if (types.mapKey[this.keyType] === void 0) - throw Error("invalid key type: " + this.keyType); - return Field.prototype.resolve.call(this); - }; - MapField.d = function decorateMapField(fieldId, fieldKeyType, fieldValueType) { - if (typeof fieldValueType === "function") - fieldValueType = util.decorateType(fieldValueType).name; - else if (fieldValueType && typeof fieldValueType === "object") - fieldValueType = util.decorateEnum(fieldValueType).name; - return function mapFieldDecorator(prototype, fieldName) { - util.decorateType(prototype.constructor).add(new MapField(fieldName, fieldId, fieldKeyType, fieldValueType)); - }; - }; - } -}); - -// node_modules/protobufjs/src/method.js -var require_method = __commonJS({ - "node_modules/protobufjs/src/method.js"(exports2, module2) { - "use strict"; - module2.exports = Method; - var ReflectionObject = require_object(); - ((Method.prototype = Object.create(ReflectionObject.prototype)).constructor = Method).className = "Method"; - var util = require_util(); - function Method(name, type, requestType, responseType, requestStream, responseStream, options2, comment, parsedOptions) { - if (util.isObject(requestStream)) { - options2 = requestStream; - requestStream = responseStream = void 0; - } else if (util.isObject(responseStream)) { - options2 = responseStream; - responseStream = void 0; - } - if (!(type === void 0 || util.isString(type))) - throw TypeError("type must be a string"); - if (!util.isString(requestType)) - throw TypeError("requestType must be a string"); - if (!util.isString(responseType)) - throw TypeError("responseType must be a string"); - ReflectionObject.call(this, name, options2); - this.type = type || "rpc"; - this.requestType = requestType; - this.requestStream = requestStream ? true : void 0; - this.responseType = responseType; - this.responseStream = responseStream ? true : void 0; - this.resolvedRequestType = null; - this.resolvedResponseType = null; - this.comment = comment; - this.parsedOptions = parsedOptions; - } - Method.fromJSON = function fromJSON(name, json) { - return new Method(name, json.type, json.requestType, json.responseType, json.requestStream, json.responseStream, json.options, json.comment, json.parsedOptions); - }; - Method.prototype.toJSON = function toJSON(toJSONOptions) { - var keepComments = toJSONOptions ? Boolean(toJSONOptions.keepComments) : false; - return util.toObject([ - "type", - this.type !== "rpc" && /* istanbul ignore next */ - this.type || void 0, - "requestType", - this.requestType, - "requestStream", - this.requestStream, - "responseType", - this.responseType, - "responseStream", - this.responseStream, - "options", - this.options, - "comment", - keepComments ? this.comment : void 0, - "parsedOptions", - this.parsedOptions - ]); - }; - Method.prototype.resolve = function resolve() { - if (this.resolved) - return this; - this.resolvedRequestType = this.parent.lookupType(this.requestType); - this.resolvedResponseType = this.parent.lookupType(this.responseType); - return ReflectionObject.prototype.resolve.call(this); - }; - } -}); - -// node_modules/protobufjs/src/service.js -var require_service2 = __commonJS({ - "node_modules/protobufjs/src/service.js"(exports2, module2) { - "use strict"; - module2.exports = Service; - var Namespace = require_namespace(); - ((Service.prototype = Object.create(Namespace.prototype)).constructor = Service).className = "Service"; - var Method = require_method(); - var util = require_util(); - var rpc = require_rpc(); - function Service(name, options2) { - Namespace.call(this, name, options2); - this.methods = {}; - this._methodsArray = null; - } - Service.fromJSON = function fromJSON(name, json) { - var service = new Service(name, json.options); - if (json.methods) - for (var names = Object.keys(json.methods), i = 0; i < names.length; ++i) - service.add(Method.fromJSON(names[i], json.methods[names[i]])); - if (json.nested) - service.addJSON(json.nested); - service.comment = json.comment; - return service; - }; - Service.prototype.toJSON = function toJSON(toJSONOptions) { - var inherited = Namespace.prototype.toJSON.call(this, toJSONOptions); - var keepComments = toJSONOptions ? Boolean(toJSONOptions.keepComments) : false; - return util.toObject([ - "options", - inherited && inherited.options || void 0, - "methods", - Namespace.arrayToJSON(this.methodsArray, toJSONOptions) || /* istanbul ignore next */ - {}, - "nested", - inherited && inherited.nested || void 0, - "comment", - keepComments ? this.comment : void 0 - ]); - }; - Object.defineProperty(Service.prototype, "methodsArray", { - get: function() { - return this._methodsArray || (this._methodsArray = util.toArray(this.methods)); - } - }); - function clearCache(service) { - service._methodsArray = null; - return service; - } - Service.prototype.get = function get(name) { - return this.methods[name] || Namespace.prototype.get.call(this, name); - }; - Service.prototype.resolveAll = function resolveAll() { - var methods = this.methodsArray; - for (var i = 0; i < methods.length; ++i) - methods[i].resolve(); - return Namespace.prototype.resolve.call(this); - }; - Service.prototype.add = function add(object) { - if (this.get(object.name)) - throw Error("duplicate name '" + object.name + "' in " + this); - if (object instanceof Method) { - this.methods[object.name] = object; - object.parent = this; - return clearCache(this); - } - return Namespace.prototype.add.call(this, object); - }; - Service.prototype.remove = function remove(object) { - if (object instanceof Method) { - if (this.methods[object.name] !== object) - throw Error(object + " is not a member of " + this); - delete this.methods[object.name]; - object.parent = null; - return clearCache(this); - } - return Namespace.prototype.remove.call(this, object); - }; - Service.prototype.create = function create(rpcImpl, requestDelimited, responseDelimited) { - var rpcService = new rpc.Service(rpcImpl, requestDelimited, responseDelimited); - for (var i = 0, method; i < /* initializes */ - this.methodsArray.length; ++i) { - var methodName = util.lcFirst((method = this._methodsArray[i]).resolve().name).replace(/[^$\w_]/g, ""); - rpcService[methodName] = util.codegen(["r", "c"], util.isReserved(methodName) ? methodName + "_" : methodName)("return this.rpcCall(m,q,s,r,c)")({ - m: method, - q: method.resolvedRequestType.ctor, - s: method.resolvedResponseType.ctor - }); - } - return rpcService; - }; - } -}); - -// node_modules/protobufjs/src/message.js -var require_message = __commonJS({ - "node_modules/protobufjs/src/message.js"(exports2, module2) { - "use strict"; - module2.exports = Message; - var util = require_minimal(); - function Message(properties) { - if (properties) - for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) - this[keys[i]] = properties[keys[i]]; - } - Message.create = function create(properties) { - return this.$type.create(properties); - }; - Message.encode = function encode(message, writer) { - return this.$type.encode(message, writer); - }; - Message.encodeDelimited = function encodeDelimited(message, writer) { - return this.$type.encodeDelimited(message, writer); - }; - Message.decode = function decode(reader) { - return this.$type.decode(reader); - }; - Message.decodeDelimited = function decodeDelimited(reader) { - return this.$type.decodeDelimited(reader); - }; - Message.verify = function verify(message) { - return this.$type.verify(message); - }; - Message.fromObject = function fromObject(object) { - return this.$type.fromObject(object); - }; - Message.toObject = function toObject(message, options2) { - return this.$type.toObject(message, options2); - }; - Message.prototype.toJSON = function toJSON() { - return this.$type.toObject(this, util.toJSONOptions); - }; - } -}); - -// node_modules/protobufjs/src/decoder.js -var require_decoder = __commonJS({ - "node_modules/protobufjs/src/decoder.js"(exports2, module2) { - "use strict"; - module2.exports = decoder; - var Enum = require_enum(); - var types = require_types(); - var util = require_util(); - function missing(field) { - return "missing required '" + field.name + "'"; - } - function decoder(mtype) { - var gen = util.codegen(["r", "l"], mtype.name + "$decode")("if(!(r instanceof Reader))")("r=Reader.create(r)")("var c=l===undefined?r.len:r.pos+l,m=new this.ctor" + (mtype.fieldsArray.filter(function(field2) { - return field2.map; - }).length ? ",k,value" : ""))("while(r.pos>>3){"); - var i = 0; - for (; i < /* initializes */ - mtype.fieldsArray.length; ++i) { - var field = mtype._fieldsArray[i].resolve(), type = field.resolvedType instanceof Enum ? "int32" : field.type, ref = "m" + util.safeProp(field.name); - gen("case %i: {", field.id); - if (field.map) { - gen("if(%s===util.emptyObject)", ref)("%s={}", ref)("var c2 = r.uint32()+r.pos"); - if (types.defaults[field.keyType] !== void 0) - gen("k=%j", types.defaults[field.keyType]); - else - gen("k=null"); - if (types.defaults[type] !== void 0) - gen("value=%j", types.defaults[type]); - else - gen("value=null"); - gen("while(r.pos>>3){")("case 1: k=r.%s(); break", field.keyType)("case 2:"); - if (types.basic[type] === void 0) - gen("value=types[%i].decode(r,r.uint32())", i); - else - gen("value=r.%s()", type); - gen("break")("default:")("r.skipType(tag2&7)")("break")("}")("}"); - if (types.long[field.keyType] !== void 0) - gen('%s[typeof k==="object"?util.longToHash(k):k]=value', ref); - else - gen("%s[k]=value", ref); - } else if (field.repeated) { - gen("if(!(%s&&%s.length))", ref, ref)("%s=[]", ref); - if (types.packed[type] !== void 0) - gen("if((t&7)===2){")("var c2=r.uint32()+r.pos")("while(r.pos>>0", prop, prop); - break; - case "int32": - case "sint32": - case "sfixed32": - gen("m%s=d%s|0", prop, prop); - break; - case "uint64": - isUnsigned = true; - case "int64": - case "sint64": - case "fixed64": - case "sfixed64": - gen("if(util.Long)")("(m%s=util.Long.fromValue(d%s)).unsigned=%j", prop, prop, isUnsigned)('else if(typeof d%s==="string")', prop)("m%s=parseInt(d%s,10)", prop, prop)('else if(typeof d%s==="number")', prop)("m%s=d%s", prop, prop)('else if(typeof d%s==="object")', prop)("m%s=new util.LongBits(d%s.low>>>0,d%s.high>>>0).toNumber(%s)", prop, prop, prop, isUnsigned ? "true" : ""); - break; - case "bytes": - gen('if(typeof d%s==="string")', prop)("util.base64.decode(d%s,m%s=util.newBuffer(util.base64.length(d%s)),0)", prop, prop, prop)("else if(d%s.length >= 0)", prop)("m%s=d%s", prop, prop); - break; - case "string": - gen("m%s=String(d%s)", prop, prop); - break; - case "bool": - gen("m%s=Boolean(d%s)", prop, prop); - break; - } - } - return gen; - } - converter.fromObject = function fromObject(mtype) { - var fields = mtype.fieldsArray; - var gen = util.codegen(["d"], mtype.name + "$fromObject")("if(d instanceof this.ctor)")("return d"); - if (!fields.length) - return gen("return new this.ctor"); - gen("var m=new this.ctor"); - for (var i = 0; i < fields.length; ++i) { - var field = fields[i].resolve(), prop = util.safeProp(field.name); - if (field.map) { - gen("if(d%s){", prop)('if(typeof d%s!=="object")', prop)("throw TypeError(%j)", field.fullName + ": object expected")("m%s={}", prop)("for(var ks=Object.keys(d%s),i=0;i>>0,m%s.high>>>0).toNumber(%s):m%s", prop, prop, prop, prop, isUnsigned ? "true" : "", prop); - break; - case "bytes": - gen("d%s=o.bytes===String?util.base64.encode(m%s,0,m%s.length):o.bytes===Array?Array.prototype.slice.call(m%s):m%s", prop, prop, prop, prop, prop); - break; - default: - gen("d%s=m%s", prop, prop); - break; - } - } - return gen; - } - converter.toObject = function toObject(mtype) { - var fields = mtype.fieldsArray.slice().sort(util.compareFieldsById); - if (!fields.length) - return util.codegen()("return {}"); - var gen = util.codegen(["m", "o"], mtype.name + "$toObject")("if(!o)")("o={}")("var d={}"); - var repeatedFields = [], mapFields = [], normalFields = [], i = 0; - for (; i < fields.length; ++i) - if (!fields[i].partOf) - (fields[i].resolve().repeated ? repeatedFields : fields[i].map ? mapFields : normalFields).push(fields[i]); - if (repeatedFields.length) { - gen("if(o.arrays||o.defaults){"); - for (i = 0; i < repeatedFields.length; ++i) - gen("d%s=[]", util.safeProp(repeatedFields[i].name)); - gen("}"); - } - if (mapFields.length) { - gen("if(o.objects||o.defaults){"); - for (i = 0; i < mapFields.length; ++i) - gen("d%s={}", util.safeProp(mapFields[i].name)); - gen("}"); - } - if (normalFields.length) { - gen("if(o.defaults){"); - for (i = 0; i < normalFields.length; ++i) { - var field = normalFields[i], prop = util.safeProp(field.name); - if (field.resolvedType instanceof Enum) - gen("d%s=o.enums===String?%j:%j", prop, field.resolvedType.valuesById[field.typeDefault], field.typeDefault); - else if (field.long) - gen("if(util.Long){")("var n=new util.Long(%i,%i,%j)", field.typeDefault.low, field.typeDefault.high, field.typeDefault.unsigned)("d%s=o.longs===String?n.toString():o.longs===Number?n.toNumber():n", prop)("}else")("d%s=o.longs===String?%j:%i", prop, field.typeDefault.toString(), field.typeDefault.toNumber()); - else if (field.bytes) { - var arrayDefault = "[" + Array.prototype.slice.call(field.typeDefault).join(",") + "]"; - gen("if(o.bytes===String)d%s=%j", prop, String.fromCharCode.apply(String, field.typeDefault))("else{")("d%s=%s", prop, arrayDefault)("if(o.bytes!==Array)d%s=util.newBuffer(d%s)", prop, prop)("}"); - } else - gen("d%s=%j", prop, field.typeDefault); - } - gen("}"); - } - var hasKs2 = false; - for (i = 0; i < fields.length; ++i) { - var field = fields[i], index = mtype._fieldsArray.indexOf(field), prop = util.safeProp(field.name); - if (field.map) { - if (!hasKs2) { - hasKs2 = true; - gen("var ks2"); - } - gen("if(m%s&&(ks2=Object.keys(m%s)).length){", prop, prop)("d%s={}", prop)("for(var j=0;j} - * @readonly - */ - fieldsById: { - get: function() { - if (this._fieldsById) - return this._fieldsById; - this._fieldsById = {}; - for (var names = Object.keys(this.fields), i = 0; i < names.length; ++i) { - var field = this.fields[names[i]], id = field.id; - if (this._fieldsById[id]) - throw Error("duplicate id " + id + " in " + this); - this._fieldsById[id] = field; - } - return this._fieldsById; - } - }, - /** - * Fields of this message as an array for iteration. - * @name Type#fieldsArray - * @type {Field[]} - * @readonly - */ - fieldsArray: { - get: function() { - return this._fieldsArray || (this._fieldsArray = util.toArray(this.fields)); - } - }, - /** - * Oneofs of this message as an array for iteration. - * @name Type#oneofsArray - * @type {OneOf[]} - * @readonly - */ - oneofsArray: { - get: function() { - return this._oneofsArray || (this._oneofsArray = util.toArray(this.oneofs)); - } - }, - /** - * The registered constructor, if any registered, otherwise a generic constructor. - * Assigning a function replaces the internal constructor. If the function does not extend {@link Message} yet, its prototype will be setup accordingly and static methods will be populated. If it already extends {@link Message}, it will just replace the internal constructor. - * @name Type#ctor - * @type {Constructor<{}>} - */ - ctor: { - get: function() { - return this._ctor || (this.ctor = Type.generateConstructor(this)()); - }, - set: function(ctor) { - var prototype = ctor.prototype; - if (!(prototype instanceof Message)) { - (ctor.prototype = new Message()).constructor = ctor; - util.merge(ctor.prototype, prototype); - } - ctor.$type = ctor.prototype.$type = this; - util.merge(ctor, Message, true); - this._ctor = ctor; - var i = 0; - for (; i < /* initializes */ - this.fieldsArray.length; ++i) - this._fieldsArray[i].resolve(); - var ctorProperties = {}; - for (i = 0; i < /* initializes */ - this.oneofsArray.length; ++i) - ctorProperties[this._oneofsArray[i].resolve().name] = { - get: util.oneOfGetter(this._oneofsArray[i].oneof), - set: util.oneOfSetter(this._oneofsArray[i].oneof) - }; - if (i) - Object.defineProperties(ctor.prototype, ctorProperties); - } - } - }); - Type.generateConstructor = function generateConstructor(mtype) { - var gen = util.codegen(["p"], mtype.name); - for (var i = 0, field; i < mtype.fieldsArray.length; ++i) - if ((field = mtype._fieldsArray[i]).map) - gen("this%s={}", util.safeProp(field.name)); - else if (field.repeated) - gen("this%s=[]", util.safeProp(field.name)); - return gen("if(p)for(var ks=Object.keys(p),i=0;i -1) { - var altname = filename2.substring(idx); - if (altname in common) - return altname; - } - return null; - } - function process2(filename2, source) { - try { - if (util.isString(source) && source.charAt(0) === "{") - source = JSON.parse(source); - if (!util.isString(source)) - self2.setOptions(source.options).addJSON(source.nested); - else { - parse.filename = filename2; - var parsed = parse(source, self2, options2), resolved2, i2 = 0; - if (parsed.imports) { - for (; i2 < parsed.imports.length; ++i2) - if (resolved2 = getBundledFileName(parsed.imports[i2]) || self2.resolvePath(filename2, parsed.imports[i2])) - fetch(resolved2); - } - if (parsed.weakImports) { - for (i2 = 0; i2 < parsed.weakImports.length; ++i2) - if (resolved2 = getBundledFileName(parsed.weakImports[i2]) || self2.resolvePath(filename2, parsed.weakImports[i2])) - fetch(resolved2, true); - } - } - } catch (err) { - finish(err); - } - if (!sync && !queued) - finish(null, self2); - } - function fetch(filename2, weak) { - filename2 = getBundledFileName(filename2) || filename2; - if (self2.files.indexOf(filename2) > -1) - return; - self2.files.push(filename2); - if (filename2 in common) { - if (sync) - process2(filename2, common[filename2]); - else { - ++queued; - setTimeout(function() { - --queued; - process2(filename2, common[filename2]); - }); - } - return; - } - if (sync) { - var source; - try { - source = util.fs.readFileSync(filename2).toString("utf8"); - } catch (err) { - if (!weak) - finish(err); - return; - } - process2(filename2, source); - } else { - ++queued; - self2.fetch(filename2, function(err, source2) { - --queued; - if (!callback) - return; - if (err) { - if (!weak) - finish(err); - else if (!queued) - finish(null, self2); - return; - } - process2(filename2, source2); - }); - } - } - var queued = 0; - if (util.isString(filename)) - filename = [filename]; - for (var i = 0, resolved; i < filename.length; ++i) - if (resolved = self2.resolvePath("", filename[i])) - fetch(resolved); - if (sync) - return self2; - if (!queued) - finish(null, self2); - return void 0; - }; - Root.prototype.loadSync = function loadSync2(filename, options2) { - if (!util.isNode) - throw Error("not supported"); - return this.load(filename, options2, SYNC); - }; - Root.prototype.resolveAll = function resolveAll() { - if (this.deferred.length) - throw Error("unresolvable extensions: " + this.deferred.map(function(field) { - return "'extend " + field.extend + "' in " + field.parent.fullName; - }).join(", ")); - return Namespace.prototype.resolveAll.call(this); - }; - var exposeRe = /^[A-Z]/; - function tryHandleExtension(root, field) { - var extendedType = field.parent.lookup(field.extend); - if (extendedType) { - var sisterField = new Field(field.fullName, field.id, field.type, field.rule, void 0, field.options); - if (extendedType.get(sisterField.name)) { - return true; - } - sisterField.declaringField = field; - field.extensionField = sisterField; - extendedType.add(sisterField); - return true; - } - return false; - } - Root.prototype._handleAdd = function _handleAdd(object) { - if (object instanceof Field) { - if ( - /* an extension field (implies not part of a oneof) */ - object.extend !== void 0 && /* not already handled */ - !object.extensionField - ) { - if (!tryHandleExtension(this, object)) - this.deferred.push(object); - } - } else if (object instanceof Enum) { - if (exposeRe.test(object.name)) - object.parent[object.name] = object.values; - } else if (!(object instanceof OneOf)) { - if (object instanceof Type) - for (var i = 0; i < this.deferred.length; ) - if (tryHandleExtension(this, this.deferred[i])) - this.deferred.splice(i, 1); - else - ++i; - for (var j2 = 0; j2 < /* initializes */ - object.nestedArray.length; ++j2) - this._handleAdd(object._nestedArray[j2]); - if (exposeRe.test(object.name)) - object.parent[object.name] = object; - } - }; - Root.prototype._handleRemove = function _handleRemove(object) { - if (object instanceof Field) { - if ( - /* an extension field */ - object.extend !== void 0 - ) { - if ( - /* already handled */ - object.extensionField - ) { - object.extensionField.parent.remove(object.extensionField); - object.extensionField = null; - } else { - var index = this.deferred.indexOf(object); - if (index > -1) - this.deferred.splice(index, 1); - } - } - } else if (object instanceof Enum) { - if (exposeRe.test(object.name)) - delete object.parent[object.name]; - } else if (object instanceof Namespace) { - for (var i = 0; i < /* initializes */ - object.nestedArray.length; ++i) - this._handleRemove(object._nestedArray[i]); - if (exposeRe.test(object.name)) - delete object.parent[object.name]; - } - }; - Root._configure = function(Type_, parse_, common_) { - Type = Type_; - parse = parse_; - common = common_; - }; - } -}); - -// node_modules/protobufjs/src/util.js -var require_util = __commonJS({ - "node_modules/protobufjs/src/util.js"(exports2, module2) { - "use strict"; - var util = module2.exports = require_minimal(); - var roots = require_roots(); - var Type; - var Enum; - util.codegen = require_codegen(); - util.fetch = require_fetch(); - util.path = require_path(); - util.fs = util.inquire("fs"); - util.toArray = function toArray(object) { - if (object) { - var keys = Object.keys(object), array = new Array(keys.length), index = 0; - while (index < keys.length) - array[index] = object[keys[index++]]; - return array; - } - return []; - }; - util.toObject = function toObject(array) { - var object = {}, index = 0; - while (index < array.length) { - var key = array[index++], val = array[index++]; - if (val !== void 0) - object[key] = val; - } - return object; - }; - var safePropBackslashRe = /\\/g; - var safePropQuoteRe = /"/g; - util.isReserved = function isReserved(name) { - return /^(?:do|if|in|for|let|new|try|var|case|else|enum|eval|false|null|this|true|void|with|break|catch|class|const|super|throw|while|yield|delete|export|import|public|return|static|switch|typeof|default|extends|finally|package|private|continue|debugger|function|arguments|interface|protected|implements|instanceof)$/.test(name); - }; - util.safeProp = function safeProp(prop) { - if (!/^[$\w_]+$/.test(prop) || util.isReserved(prop)) - return '["' + prop.replace(safePropBackslashRe, "\\\\").replace(safePropQuoteRe, '\\"') + '"]'; - return "." + prop; - }; - util.ucFirst = function ucFirst(str) { - return str.charAt(0).toUpperCase() + str.substring(1); - }; - var camelCaseRe = /_([a-z])/g; - util.camelCase = function camelCase(str) { - return str.substring(0, 1) + str.substring(1).replace(camelCaseRe, function($0, $1) { - return $1.toUpperCase(); - }); - }; - util.compareFieldsById = function compareFieldsById(a, b) { - return a.id - b.id; - }; - util.decorateType = function decorateType(ctor, typeName) { - if (ctor.$type) { - if (typeName && ctor.$type.name !== typeName) { - util.decorateRoot.remove(ctor.$type); - ctor.$type.name = typeName; - util.decorateRoot.add(ctor.$type); - } - return ctor.$type; - } - if (!Type) - Type = require_type(); - var type = new Type(typeName || ctor.name); - util.decorateRoot.add(type); - type.ctor = ctor; - Object.defineProperty(ctor, "$type", { value: type, enumerable: false }); - Object.defineProperty(ctor.prototype, "$type", { value: type, enumerable: false }); - return type; - }; - var decorateEnumIndex = 0; - util.decorateEnum = function decorateEnum(object) { - if (object.$type) - return object.$type; - if (!Enum) - Enum = require_enum(); - var enm = new Enum("Enum" + decorateEnumIndex++, object); - util.decorateRoot.add(enm); - Object.defineProperty(object, "$type", { value: enm, enumerable: false }); - return enm; - }; - util.setProperty = function setProperty(dst, path, value) { - function setProp(dst2, path2, value2) { - var part = path2.shift(); - if (part === "__proto__" || part === "prototype") { - return dst2; - } - if (path2.length > 0) { - dst2[part] = setProp(dst2[part] || {}, path2, value2); - } else { - var prevValue = dst2[part]; - if (prevValue) - value2 = [].concat(prevValue).concat(value2); - dst2[part] = value2; - } - return dst2; - } - if (typeof dst !== "object") - throw TypeError("dst must be an object"); - if (!path) - throw TypeError("path must be specified"); - path = path.split("."); - return setProp(dst, path, value); - }; - Object.defineProperty(util, "decorateRoot", { - get: function() { - return roots["decorated"] || (roots["decorated"] = new (require_root())()); - } - }); - } -}); - -// node_modules/protobufjs/src/object.js -var require_object = __commonJS({ - "node_modules/protobufjs/src/object.js"(exports2, module2) { - "use strict"; - module2.exports = ReflectionObject; - ReflectionObject.className = "ReflectionObject"; - var util = require_util(); - var Root; - function ReflectionObject(name, options2) { - if (!util.isString(name)) - throw TypeError("name must be a string"); - if (options2 && !util.isObject(options2)) - throw TypeError("options must be an object"); - this.options = options2; - this.parsedOptions = null; - this.name = name; - this.parent = null; - this.resolved = false; - this.comment = null; - this.filename = null; - } - Object.defineProperties(ReflectionObject.prototype, { - /** - * Reference to the root namespace. - * @name ReflectionObject#root - * @type {Root} - * @readonly - */ - root: { - get: function() { - var ptr = this; - while (ptr.parent !== null) - ptr = ptr.parent; - return ptr; - } - }, - /** - * Full name including leading dot. - * @name ReflectionObject#fullName - * @type {string} - * @readonly - */ - fullName: { - get: function() { - var path = [this.name], ptr = this.parent; - while (ptr) { - path.unshift(ptr.name); - ptr = ptr.parent; - } - return path.join("."); - } - } - }); - ReflectionObject.prototype.toJSON = /* istanbul ignore next */ - function toJSON() { - throw Error(); - }; - ReflectionObject.prototype.onAdd = function onAdd(parent) { - if (this.parent && this.parent !== parent) - this.parent.remove(this); - this.parent = parent; - this.resolved = false; - var root = parent.root; - if (root instanceof Root) - root._handleAdd(this); - }; - ReflectionObject.prototype.onRemove = function onRemove(parent) { - var root = parent.root; - if (root instanceof Root) - root._handleRemove(this); - this.parent = null; - this.resolved = false; - }; - ReflectionObject.prototype.resolve = function resolve() { - if (this.resolved) - return this; - if (this.root instanceof Root) - this.resolved = true; - return this; - }; - ReflectionObject.prototype.getOption = function getOption(name) { - if (this.options) - return this.options[name]; - return void 0; - }; - ReflectionObject.prototype.setOption = function setOption(name, value, ifNotSet) { - if (!ifNotSet || !this.options || this.options[name] === void 0) - (this.options || (this.options = {}))[name] = value; - return this; - }; - ReflectionObject.prototype.setParsedOption = function setParsedOption(name, value, propName) { - if (!this.parsedOptions) { - this.parsedOptions = []; - } - var parsedOptions = this.parsedOptions; - if (propName) { - var opt = parsedOptions.find(function(opt2) { - return Object.prototype.hasOwnProperty.call(opt2, name); - }); - if (opt) { - var newValue = opt[name]; - util.setProperty(newValue, propName, value); - } else { - opt = {}; - opt[name] = util.setProperty({}, propName, value); - parsedOptions.push(opt); - } - } else { - var newOpt = {}; - newOpt[name] = value; - parsedOptions.push(newOpt); - } - return this; - }; - ReflectionObject.prototype.setOptions = function setOptions(options2, ifNotSet) { - if (options2) - for (var keys = Object.keys(options2), i = 0; i < keys.length; ++i) - this.setOption(keys[i], options2[keys[i]], ifNotSet); - return this; - }; - ReflectionObject.prototype.toString = function toString() { - var className = this.constructor.className, fullName = this.fullName; - if (fullName.length) - return className + " " + fullName; - return className; - }; - ReflectionObject._configure = function(Root_) { - Root = Root_; - }; - } -}); - -// node_modules/protobufjs/src/enum.js -var require_enum = __commonJS({ - "node_modules/protobufjs/src/enum.js"(exports2, module2) { - "use strict"; - module2.exports = Enum; - var ReflectionObject = require_object(); - ((Enum.prototype = Object.create(ReflectionObject.prototype)).constructor = Enum).className = "Enum"; - var Namespace = require_namespace(); - var util = require_util(); - function Enum(name, values, options2, comment, comments, valuesOptions) { - ReflectionObject.call(this, name, options2); - if (values && typeof values !== "object") - throw TypeError("values must be an object"); - this.valuesById = {}; - this.values = Object.create(this.valuesById); - this.comment = comment; - this.comments = comments || {}; - this.valuesOptions = valuesOptions; - this.reserved = void 0; - if (values) { - for (var keys = Object.keys(values), i = 0; i < keys.length; ++i) - if (typeof values[keys[i]] === "number") - this.valuesById[this.values[keys[i]] = values[keys[i]]] = keys[i]; - } - } - Enum.fromJSON = function fromJSON(name, json) { - var enm = new Enum(name, json.values, json.options, json.comment, json.comments); - enm.reserved = json.reserved; - return enm; - }; - Enum.prototype.toJSON = function toJSON(toJSONOptions) { - var keepComments = toJSONOptions ? Boolean(toJSONOptions.keepComments) : false; - return util.toObject([ - "options", - this.options, - "valuesOptions", - this.valuesOptions, - "values", - this.values, - "reserved", - this.reserved && this.reserved.length ? this.reserved : void 0, - "comment", - keepComments ? this.comment : void 0, - "comments", - keepComments ? this.comments : void 0 - ]); - }; - Enum.prototype.add = function add(name, id, comment, options2) { - if (!util.isString(name)) - throw TypeError("name must be a string"); - if (!util.isInteger(id)) - throw TypeError("id must be an integer"); - if (this.values[name] !== void 0) - throw Error("duplicate name '" + name + "' in " + this); - if (this.isReservedId(id)) - throw Error("id " + id + " is reserved in " + this); - if (this.isReservedName(name)) - throw Error("name '" + name + "' is reserved in " + this); - if (this.valuesById[id] !== void 0) { - if (!(this.options && this.options.allow_alias)) - throw Error("duplicate id " + id + " in " + this); - this.values[name] = id; - } else - this.valuesById[this.values[name] = id] = name; - if (options2) { - if (this.valuesOptions === void 0) - this.valuesOptions = {}; - this.valuesOptions[name] = options2 || null; - } - this.comments[name] = comment || null; - return this; - }; - Enum.prototype.remove = function remove(name) { - if (!util.isString(name)) - throw TypeError("name must be a string"); - var val = this.values[name]; - if (val == null) - throw Error("name '" + name + "' does not exist in " + this); - delete this.valuesById[val]; - delete this.values[name]; - delete this.comments[name]; - if (this.valuesOptions) - delete this.valuesOptions[name]; - return this; - }; - Enum.prototype.isReservedId = function isReservedId(id) { - return Namespace.isReservedId(this.reserved, id); - }; - Enum.prototype.isReservedName = function isReservedName(name) { - return Namespace.isReservedName(this.reserved, name); - }; - } -}); - -// node_modules/protobufjs/src/encoder.js -var require_encoder = __commonJS({ - "node_modules/protobufjs/src/encoder.js"(exports2, module2) { - "use strict"; - module2.exports = encoder; - var Enum = require_enum(); - var types = require_types(); - var util = require_util(); - function genTypePartial(gen, field, fieldIndex, ref) { - return field.resolvedType.group ? gen("types[%i].encode(%s,w.uint32(%i)).uint32(%i)", fieldIndex, ref, (field.id << 3 | 3) >>> 0, (field.id << 3 | 4) >>> 0) : gen("types[%i].encode(%s,w.uint32(%i).fork()).ldelim()", fieldIndex, ref, (field.id << 3 | 2) >>> 0); - } - function encoder(mtype) { - var gen = util.codegen(["m", "w"], mtype.name + "$encode")("if(!w)")("w=Writer.create()"); - var i, ref; - var fields = ( - /* initializes */ - mtype.fieldsArray.slice().sort(util.compareFieldsById) - ); - for (var i = 0; i < fields.length; ++i) { - var field = fields[i].resolve(), index = mtype._fieldsArray.indexOf(field), type = field.resolvedType instanceof Enum ? "int32" : field.type, wireType = types.basic[type]; - ref = "m" + util.safeProp(field.name); - if (field.map) { - gen("if(%s!=null&&Object.hasOwnProperty.call(m,%j)){", ref, field.name)("for(var ks=Object.keys(%s),i=0;i>> 0, 8 | types.mapKey[field.keyType], field.keyType); - if (wireType === void 0) - gen("types[%i].encode(%s[ks[i]],w.uint32(18).fork()).ldelim().ldelim()", index, ref); - else - gen(".uint32(%i).%s(%s[ks[i]]).ldelim()", 16 | wireType, type, ref); - gen("}")("}"); - } else if (field.repeated) { - gen("if(%s!=null&&%s.length){", ref, ref); - if (field.packed && types.packed[type] !== void 0) { - gen("w.uint32(%i).fork()", (field.id << 3 | 2) >>> 0)("for(var i=0;i<%s.length;++i)", ref)("w.%s(%s[i])", type, ref)("w.ldelim()"); - } else { - gen("for(var i=0;i<%s.length;++i)", ref); - if (wireType === void 0) - genTypePartial(gen, field, index, ref + "[i]"); - else - gen("w.uint32(%i).%s(%s[i])", (field.id << 3 | wireType) >>> 0, type, ref); - } - gen("}"); - } else { - if (field.optional) - gen("if(%s!=null&&Object.hasOwnProperty.call(m,%j))", ref, field.name); - if (wireType === void 0) - genTypePartial(gen, field, index, ref); - else - gen("w.uint32(%i).%s(%s)", (field.id << 3 | wireType) >>> 0, type, ref); - } - } - return gen("return w"); - } - } -}); - -// node_modules/protobufjs/src/index-light.js -var require_index_light = __commonJS({ - "node_modules/protobufjs/src/index-light.js"(exports2, module2) { - "use strict"; - var protobuf = module2.exports = require_index_minimal(); - protobuf.build = "light"; - function load(filename, root, callback) { - if (typeof root === "function") { - callback = root; - root = new protobuf.Root(); - } else if (!root) - root = new protobuf.Root(); - return root.load(filename, callback); - } - protobuf.load = load; - function loadSync2(filename, root) { - if (!root) - root = new protobuf.Root(); - return root.loadSync(filename); - } - protobuf.loadSync = loadSync2; - protobuf.encoder = require_encoder(); - protobuf.decoder = require_decoder(); - protobuf.verifier = require_verifier(); - protobuf.converter = require_converter(); - protobuf.ReflectionObject = require_object(); - protobuf.Namespace = require_namespace(); - protobuf.Root = require_root(); - protobuf.Enum = require_enum(); - protobuf.Type = require_type(); - protobuf.Field = require_field(); - protobuf.OneOf = require_oneof(); - protobuf.MapField = require_mapfield(); - protobuf.Service = require_service2(); - protobuf.Method = require_method(); - protobuf.Message = require_message(); - protobuf.wrappers = require_wrappers(); - protobuf.types = require_types(); - protobuf.util = require_util(); - protobuf.ReflectionObject._configure(protobuf.Root); - protobuf.Namespace._configure(protobuf.Type, protobuf.Service, protobuf.Enum); - protobuf.Root._configure(protobuf.Type); - protobuf.Field._configure(protobuf.Type); - } -}); - -// node_modules/protobufjs/src/tokenize.js -var require_tokenize = __commonJS({ - "node_modules/protobufjs/src/tokenize.js"(exports2, module2) { - "use strict"; - module2.exports = tokenize; - var delimRe = /[\s{}=;:[\],'"()<>]/g; - var stringDoubleRe = /(?:"([^"\\]*(?:\\.[^"\\]*)*)")/g; - var stringSingleRe = /(?:'([^'\\]*(?:\\.[^'\\]*)*)')/g; - var setCommentRe = /^ *[*/]+ */; - var setCommentAltRe = /^\s*\*?\/*/; - var setCommentSplitRe = /\n/g; - var whitespaceRe = /\s/; - var unescapeRe = /\\(.?)/g; - var unescapeMap = { - "0": "\0", - "r": "\r", - "n": "\n", - "t": " " - }; - function unescape2(str) { - return str.replace(unescapeRe, function($0, $1) { - switch ($1) { - case "\\": - case "": - return $1; - default: - return unescapeMap[$1] || ""; - } - }); - } - tokenize.unescape = unescape2; - function tokenize(source, alternateCommentMode) { - source = source.toString(); - var offset = 0, length = source.length, line = 1, lastCommentLine = 0, comments = {}; - var stack = []; - var stringDelim = null; - function illegal(subject) { - return Error("illegal " + subject + " (line " + line + ")"); - } - function readString() { - var re2 = stringDelim === "'" ? stringSingleRe : stringDoubleRe; - re2.lastIndex = offset - 1; - var match = re2.exec(source); - if (!match) - throw illegal("string"); - offset = re2.lastIndex; - push(stringDelim); - stringDelim = null; - return unescape2(match[1]); - } - function charAt(pos) { - return source.charAt(pos); - } - function setComment(start, end, isLeading) { - var comment = { - type: source.charAt(start++), - lineEmpty: false, - leading: isLeading - }; - var lookback; - if (alternateCommentMode) { - lookback = 2; - } else { - lookback = 3; - } - var commentOffset = start - lookback, c; - do { - if (--commentOffset < 0 || (c = source.charAt(commentOffset)) === "\n") { - comment.lineEmpty = true; - break; - } - } while (c === " " || c === " "); - var lines = source.substring(start, end).split(setCommentSplitRe); - for (var i = 0; i < lines.length; ++i) - lines[i] = lines[i].replace(alternateCommentMode ? setCommentAltRe : setCommentRe, "").trim(); - comment.text = lines.join("\n").trim(); - comments[line] = comment; - lastCommentLine = line; - } - function isDoubleSlashCommentLine(startOffset) { - var endOffset = findEndOfLine(startOffset); - var lineText = source.substring(startOffset, endOffset); - var isComment = /^\s*\/{1,2}/.test(lineText); - return isComment; - } - function findEndOfLine(cursor) { - var endOffset = cursor; - while (endOffset < length && charAt(endOffset) !== "\n") { - endOffset++; - } - return endOffset; - } - function next() { - if (stack.length > 0) - return stack.shift(); - if (stringDelim) - return readString(); - var repeat, prev, curr, start, isDoc, isLeadingComment = offset === 0; - do { - if (offset === length) - return null; - repeat = false; - while (whitespaceRe.test(curr = charAt(offset))) { - if (curr === "\n") { - isLeadingComment = true; - ++line; - } - if (++offset === length) - return null; - } - if (charAt(offset) === "/") { - if (++offset === length) { - throw illegal("comment"); - } - if (charAt(offset) === "/") { - if (!alternateCommentMode) { - isDoc = charAt(start = offset + 1) === "/"; - while (charAt(++offset) !== "\n") { - if (offset === length) { - return null; - } - } - ++offset; - if (isDoc) { - setComment(start, offset - 1, isLeadingComment); - isLeadingComment = true; - } - ++line; - repeat = true; - } else { - start = offset; - isDoc = false; - if (isDoubleSlashCommentLine(offset)) { - isDoc = true; - do { - offset = findEndOfLine(offset); - if (offset === length) { - break; - } - offset++; - if (!isLeadingComment) { - break; - } - } while (isDoubleSlashCommentLine(offset)); - } else { - offset = Math.min(length, findEndOfLine(offset) + 1); - } - if (isDoc) { - setComment(start, offset, isLeadingComment); - isLeadingComment = true; - } - line++; - repeat = true; - } - } else if ((curr = charAt(offset)) === "*") { - start = offset + 1; - isDoc = alternateCommentMode || charAt(start) === "*"; - do { - if (curr === "\n") { - ++line; - } - if (++offset === length) { - throw illegal("comment"); - } - prev = curr; - curr = charAt(offset); - } while (prev !== "*" || curr !== "/"); - ++offset; - if (isDoc) { - setComment(start, offset - 2, isLeadingComment); - isLeadingComment = true; - } - repeat = true; - } else { - return "/"; - } - } - } while (repeat); - var end = offset; - delimRe.lastIndex = 0; - var delim = delimRe.test(charAt(end++)); - if (!delim) - while (end < length && !delimRe.test(charAt(end))) - ++end; - var token = source.substring(offset, offset = end); - if (token === '"' || token === "'") - stringDelim = token; - return token; - } - function push(token) { - stack.push(token); - } - function peek() { - if (!stack.length) { - var token = next(); - if (token === null) - return null; - push(token); - } - return stack[0]; - } - function skip(expected, optional) { - var actual = peek(), equals = actual === expected; - if (equals) { - next(); - return true; - } - if (!optional) - throw illegal("token '" + actual + "', '" + expected + "' expected"); - return false; - } - function cmnt(trailingLine) { - var ret = null; - var comment; - if (trailingLine === void 0) { - comment = comments[line - 1]; - delete comments[line - 1]; - if (comment && (alternateCommentMode || comment.type === "*" || comment.lineEmpty)) { - ret = comment.leading ? comment.text : null; - } - } else { - if (lastCommentLine < trailingLine) { - peek(); - } - comment = comments[trailingLine]; - delete comments[trailingLine]; - if (comment && !comment.lineEmpty && (alternateCommentMode || comment.type === "/")) { - ret = comment.leading ? null : comment.text; - } - } - return ret; - } - return Object.defineProperty({ - next, - peek, - push, - skip, - cmnt - }, "line", { - get: function() { - return line; - } - }); - } - } -}); - -// node_modules/protobufjs/src/parse.js -var require_parse = __commonJS({ - "node_modules/protobufjs/src/parse.js"(exports2, module2) { - "use strict"; - module2.exports = parse; - parse.filename = null; - parse.defaults = { keepCase: false }; - var tokenize = require_tokenize(); - var Root = require_root(); - var Type = require_type(); - var Field = require_field(); - var MapField = require_mapfield(); - var OneOf = require_oneof(); - var Enum = require_enum(); - var Service = require_service2(); - var Method = require_method(); - var types = require_types(); - var util = require_util(); - var base10Re = /^[1-9][0-9]*$/; - var base10NegRe = /^-?[1-9][0-9]*$/; - var base16Re = /^0[x][0-9a-fA-F]+$/; - var base16NegRe = /^-?0[x][0-9a-fA-F]+$/; - var base8Re = /^0[0-7]+$/; - var base8NegRe = /^-?0[0-7]+$/; - var numberRe = /^(?![eE])[0-9]*(?:\.[0-9]*)?(?:[eE][+-]?[0-9]+)?$/; - var nameRe = /^[a-zA-Z_][a-zA-Z_0-9]*$/; - var typeRefRe = /^(?:\.?[a-zA-Z_][a-zA-Z_0-9]*)(?:\.[a-zA-Z_][a-zA-Z_0-9]*)*$/; - var fqTypeRefRe = /^(?:\.[a-zA-Z_][a-zA-Z_0-9]*)+$/; - function parse(source, root, options2) { - if (!(root instanceof Root)) { - options2 = root; - root = new Root(); - } - if (!options2) - options2 = parse.defaults; - var preferTrailingComment = options2.preferTrailingComment || false; - var tn2 = tokenize(source, options2.alternateCommentMode || false), next = tn2.next, push = tn2.push, peek = tn2.peek, skip = tn2.skip, cmnt = tn2.cmnt; - var head = true, pkg, imports, weakImports, syntax, isProto3 = false; - var ptr = root; - var applyCase = options2.keepCase ? function(name) { - return name; - } : util.camelCase; - function illegal(token2, name, insideTryCatch) { - var filename = parse.filename; - if (!insideTryCatch) - parse.filename = null; - return Error("illegal " + (name || "token") + " '" + token2 + "' (" + (filename ? filename + ", " : "") + "line " + tn2.line + ")"); - } - function readString() { - var values = [], token2; - do { - if ((token2 = next()) !== '"' && token2 !== "'") - throw illegal(token2); - values.push(next()); - skip(token2); - token2 = peek(); - } while (token2 === '"' || token2 === "'"); - return values.join(""); - } - function readValue(acceptTypeRef) { - var token2 = next(); - switch (token2) { - case "'": - case '"': - push(token2); - return readString(); - case "true": - case "TRUE": - return true; - case "false": - case "FALSE": - return false; - } - try { - return parseNumber( - token2, - /* insideTryCatch */ - true - ); - } catch (e) { - if (acceptTypeRef && typeRefRe.test(token2)) - return token2; - throw illegal(token2, "value"); - } - } - function readRanges(target, acceptStrings) { - var token2, start; - do { - if (acceptStrings && ((token2 = peek()) === '"' || token2 === "'")) - target.push(readString()); - else - target.push([start = parseId(next()), skip("to", true) ? parseId(next()) : start]); - } while (skip(",", true)); - skip(";"); - } - function parseNumber(token2, insideTryCatch) { - var sign = 1; - if (token2.charAt(0) === "-") { - sign = -1; - token2 = token2.substring(1); - } - switch (token2) { - case "inf": - case "INF": - case "Inf": - return sign * Infinity; - case "nan": - case "NAN": - case "Nan": - case "NaN": - return NaN; - case "0": - return 0; - } - if (base10Re.test(token2)) - return sign * parseInt(token2, 10); - if (base16Re.test(token2)) - return sign * parseInt(token2, 16); - if (base8Re.test(token2)) - return sign * parseInt(token2, 8); - if (numberRe.test(token2)) - return sign * parseFloat(token2); - throw illegal(token2, "number", insideTryCatch); - } - function parseId(token2, acceptNegative) { - switch (token2) { - case "max": - case "MAX": - case "Max": - return 536870911; - case "0": - return 0; - } - if (!acceptNegative && token2.charAt(0) === "-") - throw illegal(token2, "id"); - if (base10NegRe.test(token2)) - return parseInt(token2, 10); - if (base16NegRe.test(token2)) - return parseInt(token2, 16); - if (base8NegRe.test(token2)) - return parseInt(token2, 8); - throw illegal(token2, "id"); - } - function parsePackage() { - if (pkg !== void 0) - throw illegal("package"); - pkg = next(); - if (!typeRefRe.test(pkg)) - throw illegal(pkg, "name"); - ptr = ptr.define(pkg); - skip(";"); - } - function parseImport() { - var token2 = peek(); - var whichImports; - switch (token2) { - case "weak": - whichImports = weakImports || (weakImports = []); - next(); - break; - case "public": - next(); - default: - whichImports = imports || (imports = []); - break; - } - token2 = readString(); - skip(";"); - whichImports.push(token2); - } - function parseSyntax() { - skip("="); - syntax = readString(); - isProto3 = syntax === "proto3"; - if (!isProto3 && syntax !== "proto2") - throw illegal(syntax, "syntax"); - skip(";"); - } - function parseCommon(parent, token2) { - switch (token2) { - case "option": - parseOption(parent, token2); - skip(";"); - return true; - case "message": - parseType(parent, token2); - return true; - case "enum": - parseEnum(parent, token2); - return true; - case "service": - parseService(parent, token2); - return true; - case "extend": - parseExtension(parent, token2); - return true; - } - return false; - } - function ifBlock(obj, fnIf, fnElse) { - var trailingLine = tn2.line; - if (obj) { - if (typeof obj.comment !== "string") { - obj.comment = cmnt(); - } - obj.filename = parse.filename; - } - if (skip("{", true)) { - var token2; - while ((token2 = next()) !== "}") - fnIf(token2); - skip(";", true); - } else { - if (fnElse) - fnElse(); - skip(";"); - if (obj && (typeof obj.comment !== "string" || preferTrailingComment)) - obj.comment = cmnt(trailingLine) || obj.comment; - } - } - function parseType(parent, token2) { - if (!nameRe.test(token2 = next())) - throw illegal(token2, "type name"); - var type = new Type(token2); - ifBlock(type, function parseType_block(token3) { - if (parseCommon(type, token3)) - return; - switch (token3) { - case "map": - parseMapField(type, token3); - break; - case "required": - case "repeated": - parseField(type, token3); - break; - case "optional": - if (isProto3) { - parseField(type, "proto3_optional"); - } else { - parseField(type, "optional"); - } - break; - case "oneof": - parseOneOf(type, token3); - break; - case "extensions": - readRanges(type.extensions || (type.extensions = [])); - break; - case "reserved": - readRanges(type.reserved || (type.reserved = []), true); - break; - default: - if (!isProto3 || !typeRefRe.test(token3)) - throw illegal(token3); - push(token3); - parseField(type, "optional"); - break; - } - }); - parent.add(type); - } - function parseField(parent, rule, extend) { - var type = next(); - if (type === "group") { - parseGroup(parent, rule); - return; - } - while (type.endsWith(".") || peek().startsWith(".")) { - type += next(); - } - if (!typeRefRe.test(type)) - throw illegal(type, "type"); - var name = next(); - if (!nameRe.test(name)) - throw illegal(name, "name"); - name = applyCase(name); - skip("="); - var field = new Field(name, parseId(next()), type, rule, extend); - ifBlock(field, function parseField_block(token2) { - if (token2 === "option") { - parseOption(field, token2); - skip(";"); - } else - throw illegal(token2); - }, function parseField_line() { - parseInlineOptions(field); - }); - if (rule === "proto3_optional") { - var oneof = new OneOf("_" + name); - field.setOption("proto3_optional", true); - oneof.add(field); - parent.add(oneof); - } else { - parent.add(field); - } - if (!isProto3 && field.repeated && (types.packed[type] !== void 0 || types.basic[type] === void 0)) - field.setOption( - "packed", - false, - /* ifNotSet */ - true - ); - } - function parseGroup(parent, rule) { - var name = next(); - if (!nameRe.test(name)) - throw illegal(name, "name"); - var fieldName = util.lcFirst(name); - if (name === fieldName) - name = util.ucFirst(name); - skip("="); - var id = parseId(next()); - var type = new Type(name); - type.group = true; - var field = new Field(fieldName, id, name, rule); - field.filename = parse.filename; - ifBlock(type, function parseGroup_block(token2) { - switch (token2) { - case "option": - parseOption(type, token2); - skip(";"); - break; - case "required": - case "repeated": - parseField(type, token2); - break; - case "optional": - if (isProto3) { - parseField(type, "proto3_optional"); - } else { - parseField(type, "optional"); - } - break; - case "message": - parseType(type, token2); - break; - case "enum": - parseEnum(type, token2); - break; - default: - throw illegal(token2); - } - }); - parent.add(type).add(field); - } - function parseMapField(parent) { - skip("<"); - var keyType = next(); - if (types.mapKey[keyType] === void 0) - throw illegal(keyType, "type"); - skip(","); - var valueType = next(); - if (!typeRefRe.test(valueType)) - throw illegal(valueType, "type"); - skip(">"); - var name = next(); - if (!nameRe.test(name)) - throw illegal(name, "name"); - skip("="); - var field = new MapField(applyCase(name), parseId(next()), keyType, valueType); - ifBlock(field, function parseMapField_block(token2) { - if (token2 === "option") { - parseOption(field, token2); - skip(";"); - } else - throw illegal(token2); - }, function parseMapField_line() { - parseInlineOptions(field); - }); - parent.add(field); - } - function parseOneOf(parent, token2) { - if (!nameRe.test(token2 = next())) - throw illegal(token2, "name"); - var oneof = new OneOf(applyCase(token2)); - ifBlock(oneof, function parseOneOf_block(token3) { - if (token3 === "option") { - parseOption(oneof, token3); - skip(";"); - } else { - push(token3); - parseField(oneof, "optional"); - } - }); - parent.add(oneof); - } - function parseEnum(parent, token2) { - if (!nameRe.test(token2 = next())) - throw illegal(token2, "name"); - var enm = new Enum(token2); - ifBlock(enm, function parseEnum_block(token3) { - switch (token3) { - case "option": - parseOption(enm, token3); - skip(";"); - break; - case "reserved": - readRanges(enm.reserved || (enm.reserved = []), true); - break; - default: - parseEnumValue(enm, token3); - } - }); - parent.add(enm); - } - function parseEnumValue(parent, token2) { - if (!nameRe.test(token2)) - throw illegal(token2, "name"); - skip("="); - var value = parseId(next(), true), dummy = { - options: void 0 - }; - dummy.setOption = function(name, value2) { - if (this.options === void 0) - this.options = {}; - this.options[name] = value2; - }; - ifBlock(dummy, function parseEnumValue_block(token3) { - if (token3 === "option") { - parseOption(dummy, token3); - skip(";"); - } else - throw illegal(token3); - }, function parseEnumValue_line() { - parseInlineOptions(dummy); - }); - parent.add(token2, value, dummy.comment, dummy.options); - } - function parseOption(parent, token2) { - var isCustom = skip("(", true); - if (!typeRefRe.test(token2 = next())) - throw illegal(token2, "name"); - var name = token2; - var option = name; - var propName; - if (isCustom) { - skip(")"); - name = "(" + name + ")"; - option = name; - token2 = peek(); - if (fqTypeRefRe.test(token2)) { - propName = token2.slice(1); - name += token2; - next(); - } - } - skip("="); - var optionValue = parseOptionValue(parent, name); - setParsedOption(parent, option, optionValue, propName); - } - function parseOptionValue(parent, name) { - if (skip("{", true)) { - var objectResult = {}; - while (!skip("}", true)) { - if (!nameRe.test(token = next())) { - throw illegal(token, "name"); - } - var value; - var propName = token; - skip(":", true); - if (peek() === "{") - value = parseOptionValue(parent, name + "." + token); - else if (peek() === "[") { - value = []; - var lastValue; - if (skip("[", true)) { - do { - lastValue = readValue(true); - value.push(lastValue); - } while (skip(",", true)); - skip("]"); - if (typeof lastValue !== "undefined") { - setOption(parent, name + "." + token, lastValue); - } - } - } else { - value = readValue(true); - setOption(parent, name + "." + token, value); - } - var prevValue = objectResult[propName]; - if (prevValue) - value = [].concat(prevValue).concat(value); - objectResult[propName] = value; - skip(",", true); - skip(";", true); - } - return objectResult; - } - var simpleValue = readValue(true); - setOption(parent, name, simpleValue); - return simpleValue; - } - function setOption(parent, name, value) { - if (parent.setOption) - parent.setOption(name, value); - } - function setParsedOption(parent, name, value, propName) { - if (parent.setParsedOption) - parent.setParsedOption(name, value, propName); - } - function parseInlineOptions(parent) { - if (skip("[", true)) { - do { - parseOption(parent, "option"); - } while (skip(",", true)); - skip("]"); - } - return parent; - } - function parseService(parent, token2) { - if (!nameRe.test(token2 = next())) - throw illegal(token2, "service name"); - var service = new Service(token2); - ifBlock(service, function parseService_block(token3) { - if (parseCommon(service, token3)) - return; - if (token3 === "rpc") - parseMethod(service, token3); - else - throw illegal(token3); - }); - parent.add(service); - } - function parseMethod(parent, token2) { - var commentText = cmnt(); - var type = token2; - if (!nameRe.test(token2 = next())) - throw illegal(token2, "name"); - var name = token2, requestType, requestStream, responseType, responseStream; - skip("("); - if (skip("stream", true)) - requestStream = true; - if (!typeRefRe.test(token2 = next())) - throw illegal(token2); - requestType = token2; - skip(")"); - skip("returns"); - skip("("); - if (skip("stream", true)) - responseStream = true; - if (!typeRefRe.test(token2 = next())) - throw illegal(token2); - responseType = token2; - skip(")"); - var method = new Method(name, type, requestType, responseType, requestStream, responseStream); - method.comment = commentText; - ifBlock(method, function parseMethod_block(token3) { - if (token3 === "option") { - parseOption(method, token3); - skip(";"); - } else - throw illegal(token3); - }); - parent.add(method); - } - function parseExtension(parent, token2) { - if (!typeRefRe.test(token2 = next())) - throw illegal(token2, "reference"); - var reference = token2; - ifBlock(null, function parseExtension_block(token3) { - switch (token3) { - case "required": - case "repeated": - parseField(parent, token3, reference); - break; - case "optional": - if (isProto3) { - parseField(parent, "proto3_optional", reference); - } else { - parseField(parent, "optional", reference); - } - break; - default: - if (!isProto3 || !typeRefRe.test(token3)) - throw illegal(token3); - push(token3); - parseField(parent, "optional", reference); - break; - } - }); - } - var token; - while ((token = next()) !== null) { - switch (token) { - case "package": - if (!head) - throw illegal(token); - parsePackage(); - break; - case "import": - if (!head) - throw illegal(token); - parseImport(); - break; - case "syntax": - if (!head) - throw illegal(token); - parseSyntax(); - break; - case "option": - parseOption(ptr, token); - skip(";"); - break; - default: - if (parseCommon(ptr, token)) { - head = false; - continue; - } - throw illegal(token); - } - } - parse.filename = null; - return { - "package": pkg, - "imports": imports, - weakImports, - syntax, - root - }; - } - } -}); - -// node_modules/protobufjs/src/common.js -var require_common = __commonJS({ - "node_modules/protobufjs/src/common.js"(exports2, module2) { - "use strict"; - module2.exports = common; - var commonRe = /\/|\./; - function common(name, json) { - if (!commonRe.test(name)) { - name = "google/protobuf/" + name + ".proto"; - json = { nested: { google: { nested: { protobuf: { nested: json } } } } }; - } - common[name] = json; - } - common("any", { - /** - * Properties of a google.protobuf.Any message. - * @interface IAny - * @type {Object} - * @property {string} [typeUrl] - * @property {Uint8Array} [bytes] - * @memberof common - */ - Any: { - fields: { - type_url: { - type: "string", - id: 1 - }, - value: { - type: "bytes", - id: 2 - } - } - } - }); - var timeType; - common("duration", { - /** - * Properties of a google.protobuf.Duration message. - * @interface IDuration - * @type {Object} - * @property {number|Long} [seconds] - * @property {number} [nanos] - * @memberof common - */ - Duration: timeType = { - fields: { - seconds: { - type: "int64", - id: 1 - }, - nanos: { - type: "int32", - id: 2 - } - } - } - }); - common("timestamp", { - /** - * Properties of a google.protobuf.Timestamp message. - * @interface ITimestamp - * @type {Object} - * @property {number|Long} [seconds] - * @property {number} [nanos] - * @memberof common - */ - Timestamp: timeType - }); - common("empty", { - /** - * Properties of a google.protobuf.Empty message. - * @interface IEmpty - * @memberof common - */ - Empty: { - fields: {} - } - }); - common("struct", { - /** - * Properties of a google.protobuf.Struct message. - * @interface IStruct - * @type {Object} - * @property {Object.} [fields] - * @memberof common - */ - Struct: { - fields: { - fields: { - keyType: "string", - type: "Value", - id: 1 - } - } - }, - /** - * Properties of a google.protobuf.Value message. - * @interface IValue - * @type {Object} - * @property {string} [kind] - * @property {0} [nullValue] - * @property {number} [numberValue] - * @property {string} [stringValue] - * @property {boolean} [boolValue] - * @property {IStruct} [structValue] - * @property {IListValue} [listValue] - * @memberof common - */ - Value: { - oneofs: { - kind: { - oneof: [ - "nullValue", - "numberValue", - "stringValue", - "boolValue", - "structValue", - "listValue" - ] - } - }, - fields: { - nullValue: { - type: "NullValue", - id: 1 - }, - numberValue: { - type: "double", - id: 2 - }, - stringValue: { - type: "string", - id: 3 - }, - boolValue: { - type: "bool", - id: 4 - }, - structValue: { - type: "Struct", - id: 5 - }, - listValue: { - type: "ListValue", - id: 6 - } - } - }, - NullValue: { - values: { - NULL_VALUE: 0 - } - }, - /** - * Properties of a google.protobuf.ListValue message. - * @interface IListValue - * @type {Object} - * @property {Array.} [values] - * @memberof common - */ - ListValue: { - fields: { - values: { - rule: "repeated", - type: "Value", - id: 1 - } - } - } - }); - common("wrappers", { - /** - * Properties of a google.protobuf.DoubleValue message. - * @interface IDoubleValue - * @type {Object} - * @property {number} [value] - * @memberof common - */ - DoubleValue: { - fields: { - value: { - type: "double", - id: 1 - } - } - }, - /** - * Properties of a google.protobuf.FloatValue message. - * @interface IFloatValue - * @type {Object} - * @property {number} [value] - * @memberof common - */ - FloatValue: { - fields: { - value: { - type: "float", - id: 1 - } - } - }, - /** - * Properties of a google.protobuf.Int64Value message. - * @interface IInt64Value - * @type {Object} - * @property {number|Long} [value] - * @memberof common - */ - Int64Value: { - fields: { - value: { - type: "int64", - id: 1 - } - } - }, - /** - * Properties of a google.protobuf.UInt64Value message. - * @interface IUInt64Value - * @type {Object} - * @property {number|Long} [value] - * @memberof common - */ - UInt64Value: { - fields: { - value: { - type: "uint64", - id: 1 - } - } - }, - /** - * Properties of a google.protobuf.Int32Value message. - * @interface IInt32Value - * @type {Object} - * @property {number} [value] - * @memberof common - */ - Int32Value: { - fields: { - value: { - type: "int32", - id: 1 - } - } - }, - /** - * Properties of a google.protobuf.UInt32Value message. - * @interface IUInt32Value - * @type {Object} - * @property {number} [value] - * @memberof common - */ - UInt32Value: { - fields: { - value: { - type: "uint32", - id: 1 - } - } - }, - /** - * Properties of a google.protobuf.BoolValue message. - * @interface IBoolValue - * @type {Object} - * @property {boolean} [value] - * @memberof common - */ - BoolValue: { - fields: { - value: { - type: "bool", - id: 1 - } - } - }, - /** - * Properties of a google.protobuf.StringValue message. - * @interface IStringValue - * @type {Object} - * @property {string} [value] - * @memberof common - */ - StringValue: { - fields: { - value: { - type: "string", - id: 1 - } - } - }, - /** - * Properties of a google.protobuf.BytesValue message. - * @interface IBytesValue - * @type {Object} - * @property {Uint8Array} [value] - * @memberof common - */ - BytesValue: { - fields: { - value: { - type: "bytes", - id: 1 - } - } - } - }); - common("field_mask", { - /** - * Properties of a google.protobuf.FieldMask message. - * @interface IDoubleValue - * @type {Object} - * @property {number} [value] - * @memberof common - */ - FieldMask: { - fields: { - paths: { - rule: "repeated", - type: "string", - id: 1 - } - } - } - }); - common.get = function get(file) { - return common[file] || null; - }; - } -}); - -// node_modules/protobufjs/src/index.js -var require_src = __commonJS({ - "node_modules/protobufjs/src/index.js"(exports2, module2) { - "use strict"; - var protobuf = module2.exports = require_index_light(); - protobuf.build = "full"; - protobuf.tokenize = require_tokenize(); - protobuf.parse = require_parse(); - protobuf.common = require_common(); - protobuf.Root._configure(protobuf.Type, protobuf.parse, protobuf.common); - } -}); - -// node_modules/protobufjs/index.js -var require_protobufjs = __commonJS({ - "node_modules/protobufjs/index.js"(exports2, module2) { - "use strict"; - module2.exports = require_src(); - } -}); - -// node_modules/protobufjs/google/protobuf/descriptor.json -var require_descriptor = __commonJS({ - "node_modules/protobufjs/google/protobuf/descriptor.json"(exports2, module2) { - module2.exports = { - nested: { - google: { - nested: { - protobuf: { - nested: { - FileDescriptorSet: { - fields: { - file: { - rule: "repeated", - type: "FileDescriptorProto", - id: 1 - } - } - }, - FileDescriptorProto: { - fields: { - name: { - type: "string", - id: 1 - }, - package: { - type: "string", - id: 2 - }, - dependency: { - rule: "repeated", - type: "string", - id: 3 - }, - publicDependency: { - rule: "repeated", - type: "int32", - id: 10, - options: { - packed: false - } - }, - weakDependency: { - rule: "repeated", - type: "int32", - id: 11, - options: { - packed: false - } - }, - messageType: { - rule: "repeated", - type: "DescriptorProto", - id: 4 - }, - enumType: { - rule: "repeated", - type: "EnumDescriptorProto", - id: 5 - }, - service: { - rule: "repeated", - type: "ServiceDescriptorProto", - id: 6 - }, - extension: { - rule: "repeated", - type: "FieldDescriptorProto", - id: 7 - }, - options: { - type: "FileOptions", - id: 8 - }, - sourceCodeInfo: { - type: "SourceCodeInfo", - id: 9 - }, - syntax: { - type: "string", - id: 12 - } - } - }, - DescriptorProto: { - fields: { - name: { - type: "string", - id: 1 - }, - field: { - rule: "repeated", - type: "FieldDescriptorProto", - id: 2 - }, - extension: { - rule: "repeated", - type: "FieldDescriptorProto", - id: 6 - }, - nestedType: { - rule: "repeated", - type: "DescriptorProto", - id: 3 - }, - enumType: { - rule: "repeated", - type: "EnumDescriptorProto", - id: 4 - }, - extensionRange: { - rule: "repeated", - type: "ExtensionRange", - id: 5 - }, - oneofDecl: { - rule: "repeated", - type: "OneofDescriptorProto", - id: 8 - }, - options: { - type: "MessageOptions", - id: 7 - }, - reservedRange: { - rule: "repeated", - type: "ReservedRange", - id: 9 - }, - reservedName: { - rule: "repeated", - type: "string", - id: 10 - } - }, - nested: { - ExtensionRange: { - fields: { - start: { - type: "int32", - id: 1 - }, - end: { - type: "int32", - id: 2 - } - } - }, - ReservedRange: { - fields: { - start: { - type: "int32", - id: 1 - }, - end: { - type: "int32", - id: 2 - } - } - } - } - }, - FieldDescriptorProto: { - fields: { - name: { - type: "string", - id: 1 - }, - number: { - type: "int32", - id: 3 - }, - label: { - type: "Label", - id: 4 - }, - type: { - type: "Type", - id: 5 - }, - typeName: { - type: "string", - id: 6 - }, - extendee: { - type: "string", - id: 2 - }, - defaultValue: { - type: "string", - id: 7 - }, - oneofIndex: { - type: "int32", - id: 9 - }, - jsonName: { - type: "string", - id: 10 - }, - options: { - type: "FieldOptions", - id: 8 - } - }, - nested: { - Type: { - values: { - TYPE_DOUBLE: 1, - TYPE_FLOAT: 2, - TYPE_INT64: 3, - TYPE_UINT64: 4, - TYPE_INT32: 5, - TYPE_FIXED64: 6, - TYPE_FIXED32: 7, - TYPE_BOOL: 8, - TYPE_STRING: 9, - TYPE_GROUP: 10, - TYPE_MESSAGE: 11, - TYPE_BYTES: 12, - TYPE_UINT32: 13, - TYPE_ENUM: 14, - TYPE_SFIXED32: 15, - TYPE_SFIXED64: 16, - TYPE_SINT32: 17, - TYPE_SINT64: 18 - } - }, - Label: { - values: { - LABEL_OPTIONAL: 1, - LABEL_REQUIRED: 2, - LABEL_REPEATED: 3 - } - } - } - }, - OneofDescriptorProto: { - fields: { - name: { - type: "string", - id: 1 - }, - options: { - type: "OneofOptions", - id: 2 - } - } - }, - EnumDescriptorProto: { - fields: { - name: { - type: "string", - id: 1 - }, - value: { - rule: "repeated", - type: "EnumValueDescriptorProto", - id: 2 - }, - options: { - type: "EnumOptions", - id: 3 - } - } - }, - EnumValueDescriptorProto: { - fields: { - name: { - type: "string", - id: 1 - }, - number: { - type: "int32", - id: 2 - }, - options: { - type: "EnumValueOptions", - id: 3 - } - } - }, - ServiceDescriptorProto: { - fields: { - name: { - type: "string", - id: 1 - }, - method: { - rule: "repeated", - type: "MethodDescriptorProto", - id: 2 - }, - options: { - type: "ServiceOptions", - id: 3 - } - } - }, - MethodDescriptorProto: { - fields: { - name: { - type: "string", - id: 1 - }, - inputType: { - type: "string", - id: 2 - }, - outputType: { - type: "string", - id: 3 - }, - options: { - type: "MethodOptions", - id: 4 - }, - clientStreaming: { - type: "bool", - id: 5 - }, - serverStreaming: { - type: "bool", - id: 6 - } - } - }, - FileOptions: { - fields: { - javaPackage: { - type: "string", - id: 1 - }, - javaOuterClassname: { - type: "string", - id: 8 - }, - javaMultipleFiles: { - type: "bool", - id: 10 - }, - javaGenerateEqualsAndHash: { - type: "bool", - id: 20, - options: { - deprecated: true - } - }, - javaStringCheckUtf8: { - type: "bool", - id: 27 - }, - optimizeFor: { - type: "OptimizeMode", - id: 9, - options: { - default: "SPEED" - } - }, - goPackage: { - type: "string", - id: 11 - }, - ccGenericServices: { - type: "bool", - id: 16 - }, - javaGenericServices: { - type: "bool", - id: 17 - }, - pyGenericServices: { - type: "bool", - id: 18 - }, - deprecated: { - type: "bool", - id: 23 - }, - ccEnableArenas: { - type: "bool", - id: 31 - }, - objcClassPrefix: { - type: "string", - id: 36 - }, - csharpNamespace: { - type: "string", - id: 37 - }, - uninterpretedOption: { - rule: "repeated", - type: "UninterpretedOption", - id: 999 - } - }, - extensions: [ - [ - 1e3, - 536870911 - ] - ], - reserved: [ - [ - 38, - 38 - ] - ], - nested: { - OptimizeMode: { - values: { - SPEED: 1, - CODE_SIZE: 2, - LITE_RUNTIME: 3 - } - } - } - }, - MessageOptions: { - fields: { - messageSetWireFormat: { - type: "bool", - id: 1 - }, - noStandardDescriptorAccessor: { - type: "bool", - id: 2 - }, - deprecated: { - type: "bool", - id: 3 - }, - mapEntry: { - type: "bool", - id: 7 - }, - uninterpretedOption: { - rule: "repeated", - type: "UninterpretedOption", - id: 999 - } - }, - extensions: [ - [ - 1e3, - 536870911 - ] - ], - reserved: [ - [ - 8, - 8 - ] - ] - }, - FieldOptions: { - fields: { - ctype: { - type: "CType", - id: 1, - options: { - default: "STRING" - } - }, - packed: { - type: "bool", - id: 2 - }, - jstype: { - type: "JSType", - id: 6, - options: { - default: "JS_NORMAL" - } - }, - lazy: { - type: "bool", - id: 5 - }, - deprecated: { - type: "bool", - id: 3 - }, - weak: { - type: "bool", - id: 10 - }, - uninterpretedOption: { - rule: "repeated", - type: "UninterpretedOption", - id: 999 - } - }, - extensions: [ - [ - 1e3, - 536870911 - ] - ], - reserved: [ - [ - 4, - 4 - ] - ], - nested: { - CType: { - values: { - STRING: 0, - CORD: 1, - STRING_PIECE: 2 - } - }, - JSType: { - values: { - JS_NORMAL: 0, - JS_STRING: 1, - JS_NUMBER: 2 - } - } - } - }, - OneofOptions: { - fields: { - uninterpretedOption: { - rule: "repeated", - type: "UninterpretedOption", - id: 999 - } - }, - extensions: [ - [ - 1e3, - 536870911 - ] - ] - }, - EnumOptions: { - fields: { - allowAlias: { - type: "bool", - id: 2 - }, - deprecated: { - type: "bool", - id: 3 - }, - uninterpretedOption: { - rule: "repeated", - type: "UninterpretedOption", - id: 999 - } - }, - extensions: [ - [ - 1e3, - 536870911 - ] - ] - }, - EnumValueOptions: { - fields: { - deprecated: { - type: "bool", - id: 1 - }, - uninterpretedOption: { - rule: "repeated", - type: "UninterpretedOption", - id: 999 - } - }, - extensions: [ - [ - 1e3, - 536870911 - ] - ] - }, - ServiceOptions: { - fields: { - deprecated: { - type: "bool", - id: 33 - }, - uninterpretedOption: { - rule: "repeated", - type: "UninterpretedOption", - id: 999 - } - }, - extensions: [ - [ - 1e3, - 536870911 - ] - ] - }, - MethodOptions: { - fields: { - deprecated: { - type: "bool", - id: 33 - }, - uninterpretedOption: { - rule: "repeated", - type: "UninterpretedOption", - id: 999 - } - }, - extensions: [ - [ - 1e3, - 536870911 - ] - ] - }, - UninterpretedOption: { - fields: { - name: { - rule: "repeated", - type: "NamePart", - id: 2 - }, - identifierValue: { - type: "string", - id: 3 - }, - positiveIntValue: { - type: "uint64", - id: 4 - }, - negativeIntValue: { - type: "int64", - id: 5 - }, - doubleValue: { - type: "double", - id: 6 - }, - stringValue: { - type: "bytes", - id: 7 - }, - aggregateValue: { - type: "string", - id: 8 - } - }, - nested: { - NamePart: { - fields: { - namePart: { - rule: "required", - type: "string", - id: 1 - }, - isExtension: { - rule: "required", - type: "bool", - id: 2 - } - } - } - } - }, - SourceCodeInfo: { - fields: { - location: { - rule: "repeated", - type: "Location", - id: 1 - } - }, - nested: { - Location: { - fields: { - path: { - rule: "repeated", - type: "int32", - id: 1 - }, - span: { - rule: "repeated", - type: "int32", - id: 2 - }, - leadingComments: { - type: "string", - id: 3 - }, - trailingComments: { - type: "string", - id: 4 - }, - leadingDetachedComments: { - rule: "repeated", - type: "string", - id: 6 - } - } - } - } - }, - GeneratedCodeInfo: { - fields: { - annotation: { - rule: "repeated", - type: "Annotation", - id: 1 - } - }, - nested: { - Annotation: { - fields: { - path: { - rule: "repeated", - type: "int32", - id: 1 - }, - sourceFile: { - type: "string", - id: 2 - }, - begin: { - type: "int32", - id: 3 - }, - end: { - type: "int32", - id: 4 - } - } - } - } - } - } - } - } - } - } - }; - } -}); - -// node_modules/protobufjs/ext/descriptor/index.js -var require_descriptor2 = __commonJS({ - "node_modules/protobufjs/ext/descriptor/index.js"(exports2, module2) { - "use strict"; - var $protobuf = require_protobufjs(); - module2.exports = exports2 = $protobuf.descriptor = $protobuf.Root.fromJSON(require_descriptor()).lookup(".google.protobuf"); - var Namespace = $protobuf.Namespace; - var Root = $protobuf.Root; - var Enum = $protobuf.Enum; - var Type = $protobuf.Type; - var Field = $protobuf.Field; - var MapField = $protobuf.MapField; - var OneOf = $protobuf.OneOf; - var Service = $protobuf.Service; - var Method = $protobuf.Method; - Root.fromDescriptor = function fromDescriptor(descriptor) { - if (typeof descriptor.length === "number") - descriptor = exports2.FileDescriptorSet.decode(descriptor); - var root = new Root(); - if (descriptor.file) { - var fileDescriptor, filePackage; - for (var j2 = 0, i; j2 < descriptor.file.length; ++j2) { - filePackage = root; - if ((fileDescriptor = descriptor.file[j2])["package"] && fileDescriptor["package"].length) - filePackage = root.define(fileDescriptor["package"]); - if (fileDescriptor.name && fileDescriptor.name.length) - root.files.push(filePackage.filename = fileDescriptor.name); - if (fileDescriptor.messageType) - for (i = 0; i < fileDescriptor.messageType.length; ++i) - filePackage.add(Type.fromDescriptor(fileDescriptor.messageType[i], fileDescriptor.syntax)); - if (fileDescriptor.enumType) - for (i = 0; i < fileDescriptor.enumType.length; ++i) - filePackage.add(Enum.fromDescriptor(fileDescriptor.enumType[i])); - if (fileDescriptor.extension) - for (i = 0; i < fileDescriptor.extension.length; ++i) - filePackage.add(Field.fromDescriptor(fileDescriptor.extension[i])); - if (fileDescriptor.service) - for (i = 0; i < fileDescriptor.service.length; ++i) - filePackage.add(Service.fromDescriptor(fileDescriptor.service[i])); - var opts = fromDescriptorOptions(fileDescriptor.options, exports2.FileOptions); - if (opts) { - var ks2 = Object.keys(opts); - for (i = 0; i < ks2.length; ++i) - filePackage.setOption(ks2[i], opts[ks2[i]]); - } - } - } - return root; - }; - Root.prototype.toDescriptor = function toDescriptor(syntax) { - var set = exports2.FileDescriptorSet.create(); - Root_toDescriptorRecursive(this, set.file, syntax); - return set; - }; - function Root_toDescriptorRecursive(ns3, files, syntax) { - var file = exports2.FileDescriptorProto.create({ name: ns3.filename || (ns3.fullName.substring(1).replace(/\./g, "_") || "root") + ".proto" }); - if (syntax) - file.syntax = syntax; - if (!(ns3 instanceof Root)) - file["package"] = ns3.fullName.substring(1); - for (var i = 0, nested; i < ns3.nestedArray.length; ++i) - if ((nested = ns3._nestedArray[i]) instanceof Type) - file.messageType.push(nested.toDescriptor(syntax)); - else if (nested instanceof Enum) - file.enumType.push(nested.toDescriptor()); - else if (nested instanceof Field) - file.extension.push(nested.toDescriptor(syntax)); - else if (nested instanceof Service) - file.service.push(nested.toDescriptor()); - else if (nested instanceof /* plain */ - Namespace) - Root_toDescriptorRecursive(nested, files, syntax); - file.options = toDescriptorOptions(ns3.options, exports2.FileOptions); - if (file.messageType.length + file.enumType.length + file.extension.length + file.service.length) - files.push(file); - } - var unnamedMessageIndex = 0; - Type.fromDescriptor = function fromDescriptor(descriptor, syntax) { - if (typeof descriptor.length === "number") - descriptor = exports2.DescriptorProto.decode(descriptor); - var type = new Type(descriptor.name.length ? descriptor.name : "Type" + unnamedMessageIndex++, fromDescriptorOptions(descriptor.options, exports2.MessageOptions)), i; - if (descriptor.oneofDecl) - for (i = 0; i < descriptor.oneofDecl.length; ++i) - type.add(OneOf.fromDescriptor(descriptor.oneofDecl[i])); - if (descriptor.field) - for (i = 0; i < descriptor.field.length; ++i) { - var field = Field.fromDescriptor(descriptor.field[i], syntax); - type.add(field); - if (descriptor.field[i].hasOwnProperty("oneofIndex")) - type.oneofsArray[descriptor.field[i].oneofIndex].add(field); - } - if (descriptor.extension) - for (i = 0; i < descriptor.extension.length; ++i) - type.add(Field.fromDescriptor(descriptor.extension[i], syntax)); - if (descriptor.nestedType) - for (i = 0; i < descriptor.nestedType.length; ++i) { - type.add(Type.fromDescriptor(descriptor.nestedType[i], syntax)); - if (descriptor.nestedType[i].options && descriptor.nestedType[i].options.mapEntry) - type.setOption("map_entry", true); - } - if (descriptor.enumType) - for (i = 0; i < descriptor.enumType.length; ++i) - type.add(Enum.fromDescriptor(descriptor.enumType[i])); - if (descriptor.extensionRange && descriptor.extensionRange.length) { - type.extensions = []; - for (i = 0; i < descriptor.extensionRange.length; ++i) - type.extensions.push([descriptor.extensionRange[i].start, descriptor.extensionRange[i].end]); - } - if (descriptor.reservedRange && descriptor.reservedRange.length || descriptor.reservedName && descriptor.reservedName.length) { - type.reserved = []; - if (descriptor.reservedRange) - for (i = 0; i < descriptor.reservedRange.length; ++i) - type.reserved.push([descriptor.reservedRange[i].start, descriptor.reservedRange[i].end]); - if (descriptor.reservedName) - for (i = 0; i < descriptor.reservedName.length; ++i) - type.reserved.push(descriptor.reservedName[i]); - } - return type; - }; - Type.prototype.toDescriptor = function toDescriptor(syntax) { - var descriptor = exports2.DescriptorProto.create({ name: this.name }), i; - for (i = 0; i < this.fieldsArray.length; ++i) { - var fieldDescriptor; - descriptor.field.push(fieldDescriptor = this._fieldsArray[i].toDescriptor(syntax)); - if (this._fieldsArray[i] instanceof MapField) { - var keyType = toDescriptorType(this._fieldsArray[i].keyType, this._fieldsArray[i].resolvedKeyType), valueType = toDescriptorType(this._fieldsArray[i].type, this._fieldsArray[i].resolvedType), valueTypeName = valueType === /* type */ - 11 || valueType === /* enum */ - 14 ? this._fieldsArray[i].resolvedType && shortname(this.parent, this._fieldsArray[i].resolvedType) || this._fieldsArray[i].type : void 0; - descriptor.nestedType.push(exports2.DescriptorProto.create({ - name: fieldDescriptor.typeName, - field: [ - exports2.FieldDescriptorProto.create({ name: "key", number: 1, label: 1, type: keyType }), - // can't reference a type or enum - exports2.FieldDescriptorProto.create({ name: "value", number: 2, label: 1, type: valueType, typeName: valueTypeName }) - ], - options: exports2.MessageOptions.create({ mapEntry: true }) - })); - } - } - for (i = 0; i < this.oneofsArray.length; ++i) - descriptor.oneofDecl.push(this._oneofsArray[i].toDescriptor()); - for (i = 0; i < this.nestedArray.length; ++i) { - if (this._nestedArray[i] instanceof Field) - descriptor.field.push(this._nestedArray[i].toDescriptor(syntax)); - else if (this._nestedArray[i] instanceof Type) - descriptor.nestedType.push(this._nestedArray[i].toDescriptor(syntax)); - else if (this._nestedArray[i] instanceof Enum) - descriptor.enumType.push(this._nestedArray[i].toDescriptor()); - } - if (this.extensions) - for (i = 0; i < this.extensions.length; ++i) - descriptor.extensionRange.push(exports2.DescriptorProto.ExtensionRange.create({ start: this.extensions[i][0], end: this.extensions[i][1] })); - if (this.reserved) - for (i = 0; i < this.reserved.length; ++i) - if (typeof this.reserved[i] === "string") - descriptor.reservedName.push(this.reserved[i]); - else - descriptor.reservedRange.push(exports2.DescriptorProto.ReservedRange.create({ start: this.reserved[i][0], end: this.reserved[i][1] })); - descriptor.options = toDescriptorOptions(this.options, exports2.MessageOptions); - return descriptor; - }; - var numberRe = /^(?![eE])[0-9]*(?:\.[0-9]*)?(?:[eE][+-]?[0-9]+)?$/; - Field.fromDescriptor = function fromDescriptor(descriptor, syntax) { - if (typeof descriptor.length === "number") - descriptor = exports2.DescriptorProto.decode(descriptor); - if (typeof descriptor.number !== "number") - throw Error("missing field id"); - var fieldType; - if (descriptor.typeName && descriptor.typeName.length) - fieldType = descriptor.typeName; - else - fieldType = fromDescriptorType(descriptor.type); - var fieldRule; - switch (descriptor.label) { - case 1: - fieldRule = void 0; - break; - case 2: - fieldRule = "required"; - break; - case 3: - fieldRule = "repeated"; - break; - default: - throw Error("illegal label: " + descriptor.label); - } - var extendee = descriptor.extendee; - if (descriptor.extendee !== void 0) { - extendee = extendee.length ? extendee : void 0; - } - var field = new Field( - descriptor.name.length ? descriptor.name : "field" + descriptor.number, - descriptor.number, - fieldType, - fieldRule, - extendee - ); - field.options = fromDescriptorOptions(descriptor.options, exports2.FieldOptions); - if (descriptor.defaultValue && descriptor.defaultValue.length) { - var defaultValue = descriptor.defaultValue; - switch (defaultValue) { - case "true": - case "TRUE": - defaultValue = true; - break; - case "false": - case "FALSE": - defaultValue = false; - break; - default: - var match = numberRe.exec(defaultValue); - if (match) - defaultValue = parseInt(defaultValue); - break; - } - field.setOption("default", defaultValue); - } - if (packableDescriptorType(descriptor.type)) { - if (syntax === "proto3") { - if (descriptor.options && !descriptor.options.packed) - field.setOption("packed", false); - } else if (!(descriptor.options && descriptor.options.packed)) - field.setOption("packed", false); - } - return field; - }; - Field.prototype.toDescriptor = function toDescriptor(syntax) { - var descriptor = exports2.FieldDescriptorProto.create({ name: this.name, number: this.id }); - if (this.map) { - descriptor.type = 11; - descriptor.typeName = $protobuf.util.ucFirst(this.name); - descriptor.label = 3; - } else { - switch (descriptor.type = toDescriptorType(this.type, this.resolve().resolvedType)) { - case 10: - case 11: - case 14: - descriptor.typeName = this.resolvedType ? shortname(this.parent, this.resolvedType) : this.type; - break; - } - switch (this.rule) { - case "repeated": - descriptor.label = 3; - break; - case "required": - descriptor.label = 2; - break; - default: - descriptor.label = 1; - break; - } - } - descriptor.extendee = this.extensionField ? this.extensionField.parent.fullName : this.extend; - if (this.partOf) { - if ((descriptor.oneofIndex = this.parent.oneofsArray.indexOf(this.partOf)) < 0) - throw Error("missing oneof"); - } - if (this.options) { - descriptor.options = toDescriptorOptions(this.options, exports2.FieldOptions); - if (this.options["default"] != null) - descriptor.defaultValue = String(this.options["default"]); - } - if (syntax === "proto3") { - if (!this.packed) - (descriptor.options || (descriptor.options = exports2.FieldOptions.create())).packed = false; - } else if (this.packed) - (descriptor.options || (descriptor.options = exports2.FieldOptions.create())).packed = true; - return descriptor; - }; - var unnamedEnumIndex = 0; - Enum.fromDescriptor = function fromDescriptor(descriptor) { - if (typeof descriptor.length === "number") - descriptor = exports2.EnumDescriptorProto.decode(descriptor); - var values = {}; - if (descriptor.value) - for (var i = 0; i < descriptor.value.length; ++i) { - var name = descriptor.value[i].name, value = descriptor.value[i].number || 0; - values[name && name.length ? name : "NAME" + value] = value; - } - return new Enum( - descriptor.name && descriptor.name.length ? descriptor.name : "Enum" + unnamedEnumIndex++, - values, - fromDescriptorOptions(descriptor.options, exports2.EnumOptions) - ); - }; - Enum.prototype.toDescriptor = function toDescriptor() { - var values = []; - for (var i = 0, ks2 = Object.keys(this.values); i < ks2.length; ++i) - values.push(exports2.EnumValueDescriptorProto.create({ name: ks2[i], number: this.values[ks2[i]] })); - return exports2.EnumDescriptorProto.create({ - name: this.name, - value: values, - options: toDescriptorOptions(this.options, exports2.EnumOptions) - }); - }; - var unnamedOneofIndex = 0; - OneOf.fromDescriptor = function fromDescriptor(descriptor) { - if (typeof descriptor.length === "number") - descriptor = exports2.OneofDescriptorProto.decode(descriptor); - return new OneOf( - // unnamedOneOfIndex is global, not per type, because we have no ref to a type here - descriptor.name && descriptor.name.length ? descriptor.name : "oneof" + unnamedOneofIndex++ - // fromDescriptorOptions(descriptor.options, exports.OneofOptions) - only uninterpreted_option - ); - }; - OneOf.prototype.toDescriptor = function toDescriptor() { - return exports2.OneofDescriptorProto.create({ - name: this.name - // options: toDescriptorOptions(this.options, exports.OneofOptions) - only uninterpreted_option - }); - }; - var unnamedServiceIndex = 0; - Service.fromDescriptor = function fromDescriptor(descriptor) { - if (typeof descriptor.length === "number") - descriptor = exports2.ServiceDescriptorProto.decode(descriptor); - var service = new Service(descriptor.name && descriptor.name.length ? descriptor.name : "Service" + unnamedServiceIndex++, fromDescriptorOptions(descriptor.options, exports2.ServiceOptions)); - if (descriptor.method) - for (var i = 0; i < descriptor.method.length; ++i) - service.add(Method.fromDescriptor(descriptor.method[i])); - return service; - }; - Service.prototype.toDescriptor = function toDescriptor() { - var methods = []; - for (var i = 0; i < this.methodsArray.length; ++i) - methods.push(this._methodsArray[i].toDescriptor()); - return exports2.ServiceDescriptorProto.create({ - name: this.name, - method: methods, - options: toDescriptorOptions(this.options, exports2.ServiceOptions) - }); - }; - var unnamedMethodIndex = 0; - Method.fromDescriptor = function fromDescriptor(descriptor) { - if (typeof descriptor.length === "number") - descriptor = exports2.MethodDescriptorProto.decode(descriptor); - return new Method( - // unnamedMethodIndex is global, not per service, because we have no ref to a service here - descriptor.name && descriptor.name.length ? descriptor.name : "Method" + unnamedMethodIndex++, - "rpc", - descriptor.inputType, - descriptor.outputType, - Boolean(descriptor.clientStreaming), - Boolean(descriptor.serverStreaming), - fromDescriptorOptions(descriptor.options, exports2.MethodOptions) - ); - }; - Method.prototype.toDescriptor = function toDescriptor() { - return exports2.MethodDescriptorProto.create({ - name: this.name, - inputType: this.resolvedRequestType ? this.resolvedRequestType.fullName : this.requestType, - outputType: this.resolvedResponseType ? this.resolvedResponseType.fullName : this.responseType, - clientStreaming: this.requestStream, - serverStreaming: this.responseStream, - options: toDescriptorOptions(this.options, exports2.MethodOptions) - }); - }; - function fromDescriptorType(type) { - switch (type) { - case 1: - return "double"; - case 2: - return "float"; - case 3: - return "int64"; - case 4: - return "uint64"; - case 5: - return "int32"; - case 6: - return "fixed64"; - case 7: - return "fixed32"; - case 8: - return "bool"; - case 9: - return "string"; - case 12: - return "bytes"; - case 13: - return "uint32"; - case 15: - return "sfixed32"; - case 16: - return "sfixed64"; - case 17: - return "sint32"; - case 18: - return "sint64"; - } - throw Error("illegal type: " + type); - } - function packableDescriptorType(type) { - switch (type) { - case 1: - case 2: - case 3: - case 4: - case 5: - case 6: - case 7: - case 8: - case 13: - case 14: - case 15: - case 16: - case 17: - case 18: - return true; - } - return false; - } - function toDescriptorType(type, resolvedType) { - switch (type) { - case "double": - return 1; - case "float": - return 2; - case "int64": - return 3; - case "uint64": - return 4; - case "int32": - return 5; - case "fixed64": - return 6; - case "fixed32": - return 7; - case "bool": - return 8; - case "string": - return 9; - case "bytes": - return 12; - case "uint32": - return 13; - case "sfixed32": - return 15; - case "sfixed64": - return 16; - case "sint32": - return 17; - case "sint64": - return 18; - } - if (resolvedType instanceof Enum) - return 14; - if (resolvedType instanceof Type) - return resolvedType.group ? 10 : 11; - throw Error("illegal type: " + type); - } - function fromDescriptorOptions(options2, type) { - if (!options2) - return void 0; - var out = []; - for (var i = 0, field, key, val; i < type.fieldsArray.length; ++i) - if ((key = (field = type._fieldsArray[i]).name) !== "uninterpretedOption") { - if (options2.hasOwnProperty(key)) { - val = options2[key]; - if (field.resolvedType instanceof Enum && typeof val === "number" && field.resolvedType.valuesById[val] !== void 0) - val = field.resolvedType.valuesById[val]; - out.push(underScore(key), val); - } - } - return out.length ? $protobuf.util.toObject(out) : void 0; - } - function toDescriptorOptions(options2, type) { - if (!options2) - return void 0; - var out = []; - for (var i = 0, ks2 = Object.keys(options2), key, val; i < ks2.length; ++i) { - val = options2[key = ks2[i]]; - if (key === "default") - continue; - var field = type.fields[key]; - if (!field && !(field = type.fields[key = $protobuf.util.camelCase(key)])) - continue; - out.push(key, val); - } - return out.length ? type.fromObject($protobuf.util.toObject(out)) : void 0; - } - function shortname(from, to2) { - var fromPath = from.fullName.split("."), toPath = to2.fullName.split("."), i = 0, j2 = 0, k2 = toPath.length - 1; - if (!(from instanceof Root) && to2 instanceof Namespace) - while (i < fromPath.length && j2 < k2 && fromPath[i] === toPath[j2]) { - var other = to2.lookup(fromPath[i++], true); - if (other !== null && other !== to2) - break; - ++j2; - } - else - for (; i < fromPath.length && j2 < k2 && fromPath[i] === toPath[j2]; ++i, ++j2) - ; - return toPath.slice(j2).join("."); - } - function underScore(str) { - return str.substring(0, 1) + str.substring(1).replace(/([A-Z])(?=[a-z]|$)/g, function($0, $1) { - return "_" + $1.toLowerCase(); - }); - } - } -}); - -// node_modules/protobufjs/google/protobuf/api.json -var require_api = __commonJS({ - "node_modules/protobufjs/google/protobuf/api.json"(exports2, module2) { - module2.exports = { - nested: { - google: { - nested: { - protobuf: { - nested: { - Api: { - fields: { - name: { - type: "string", - id: 1 - }, - methods: { - rule: "repeated", - type: "Method", - id: 2 - }, - options: { - rule: "repeated", - type: "Option", - id: 3 - }, - version: { - type: "string", - id: 4 - }, - sourceContext: { - type: "SourceContext", - id: 5 - }, - mixins: { - rule: "repeated", - type: "Mixin", - id: 6 - }, - syntax: { - type: "Syntax", - id: 7 - } - } - }, - Method: { - fields: { - name: { - type: "string", - id: 1 - }, - requestTypeUrl: { - type: "string", - id: 2 - }, - requestStreaming: { - type: "bool", - id: 3 - }, - responseTypeUrl: { - type: "string", - id: 4 - }, - responseStreaming: { - type: "bool", - id: 5 - }, - options: { - rule: "repeated", - type: "Option", - id: 6 - }, - syntax: { - type: "Syntax", - id: 7 - } - } - }, - Mixin: { - fields: { - name: { - type: "string", - id: 1 - }, - root: { - type: "string", - id: 2 - } - } - }, - SourceContext: { - fields: { - fileName: { - type: "string", - id: 1 - } - } - }, - Option: { - fields: { - name: { - type: "string", - id: 1 - }, - value: { - type: "Any", - id: 2 - } - } - }, - Syntax: { - values: { - SYNTAX_PROTO2: 0, - SYNTAX_PROTO3: 1 - } - } - } - } - } - } - } - }; - } -}); - -// node_modules/protobufjs/google/protobuf/source_context.json -var require_source_context = __commonJS({ - "node_modules/protobufjs/google/protobuf/source_context.json"(exports2, module2) { - module2.exports = { - nested: { - google: { - nested: { - protobuf: { - nested: { - SourceContext: { - fields: { - fileName: { - type: "string", - id: 1 - } - } - } - } - } - } - } - } - }; - } -}); - -// node_modules/protobufjs/google/protobuf/type.json -var require_type2 = __commonJS({ - "node_modules/protobufjs/google/protobuf/type.json"(exports2, module2) { - module2.exports = { - nested: { - google: { - nested: { - protobuf: { - nested: { - Type: { - fields: { - name: { - type: "string", - id: 1 - }, - fields: { - rule: "repeated", - type: "Field", - id: 2 - }, - oneofs: { - rule: "repeated", - type: "string", - id: 3 - }, - options: { - rule: "repeated", - type: "Option", - id: 4 - }, - sourceContext: { - type: "SourceContext", - id: 5 - }, - syntax: { - type: "Syntax", - id: 6 - } - } - }, - Field: { - fields: { - kind: { - type: "Kind", - id: 1 - }, - cardinality: { - type: "Cardinality", - id: 2 - }, - number: { - type: "int32", - id: 3 - }, - name: { - type: "string", - id: 4 - }, - typeUrl: { - type: "string", - id: 6 - }, - oneofIndex: { - type: "int32", - id: 7 - }, - packed: { - type: "bool", - id: 8 - }, - options: { - rule: "repeated", - type: "Option", - id: 9 - }, - jsonName: { - type: "string", - id: 10 - }, - defaultValue: { - type: "string", - id: 11 - } - }, - nested: { - Kind: { - values: { - TYPE_UNKNOWN: 0, - TYPE_DOUBLE: 1, - TYPE_FLOAT: 2, - TYPE_INT64: 3, - TYPE_UINT64: 4, - TYPE_INT32: 5, - TYPE_FIXED64: 6, - TYPE_FIXED32: 7, - TYPE_BOOL: 8, - TYPE_STRING: 9, - TYPE_GROUP: 10, - TYPE_MESSAGE: 11, - TYPE_BYTES: 12, - TYPE_UINT32: 13, - TYPE_ENUM: 14, - TYPE_SFIXED32: 15, - TYPE_SFIXED64: 16, - TYPE_SINT32: 17, - TYPE_SINT64: 18 - } - }, - Cardinality: { - values: { - CARDINALITY_UNKNOWN: 0, - CARDINALITY_OPTIONAL: 1, - CARDINALITY_REQUIRED: 2, - CARDINALITY_REPEATED: 3 - } - } - } - }, - Enum: { - fields: { - name: { - type: "string", - id: 1 - }, - enumvalue: { - rule: "repeated", - type: "EnumValue", - id: 2 - }, - options: { - rule: "repeated", - type: "Option", - id: 3 - }, - sourceContext: { - type: "SourceContext", - id: 4 - }, - syntax: { - type: "Syntax", - id: 5 - } - } - }, - EnumValue: { - fields: { - name: { - type: "string", - id: 1 - }, - number: { - type: "int32", - id: 2 - }, - options: { - rule: "repeated", - type: "Option", - id: 3 - } - } - }, - Option: { - fields: { - name: { - type: "string", - id: 1 - }, - value: { - type: "Any", - id: 2 - } - } - }, - Syntax: { - values: { - SYNTAX_PROTO2: 0, - SYNTAX_PROTO3: 1 - } - }, - Any: { - fields: { - type_url: { - type: "string", - id: 1 - }, - value: { - type: "bytes", - id: 2 - } - } - }, - SourceContext: { - fields: { - fileName: { - type: "string", - id: 1 - } - } - } - } - } - } - } - } - }; - } -}); - -// node_modules/@grpc/proto-loader/build/src/util.js -var require_util2 = __commonJS({ - "node_modules/@grpc/proto-loader/build/src/util.js"(exports2) { - "use strict"; - Object.defineProperty(exports2, "__esModule", { value: true }); - exports2.addCommonProtos = exports2.loadProtosWithOptionsSync = exports2.loadProtosWithOptions = void 0; - var fs2 = require("fs"); - var path = require("path"); - var Protobuf = require_protobufjs(); - function addIncludePathResolver(root, includePaths) { - const originalResolvePath = root.resolvePath; - root.resolvePath = (origin, target) => { - if (path.isAbsolute(target)) { - return target; - } - for (const directory of includePaths) { - const fullPath = path.join(directory, target); - try { - fs2.accessSync(fullPath, fs2.constants.R_OK); - return fullPath; - } catch (err) { - continue; - } - } - process.emitWarning(`${target} not found in any of the include paths ${includePaths}`); - return originalResolvePath(origin, target); - }; - } - async function loadProtosWithOptions(filename, options2) { - const root = new Protobuf.Root(); - options2 = options2 || {}; - if (!!options2.includeDirs) { - if (!Array.isArray(options2.includeDirs)) { - return Promise.reject(new Error("The includeDirs option must be an array")); - } - addIncludePathResolver(root, options2.includeDirs); - } - const loadedRoot = await root.load(filename, options2); - loadedRoot.resolveAll(); - return loadedRoot; - } - exports2.loadProtosWithOptions = loadProtosWithOptions; - function loadProtosWithOptionsSync(filename, options2) { - const root = new Protobuf.Root(); - options2 = options2 || {}; - if (!!options2.includeDirs) { - if (!Array.isArray(options2.includeDirs)) { - throw new Error("The includeDirs option must be an array"); - } - addIncludePathResolver(root, options2.includeDirs); - } - const loadedRoot = root.loadSync(filename, options2); - loadedRoot.resolveAll(); - return loadedRoot; - } - exports2.loadProtosWithOptionsSync = loadProtosWithOptionsSync; - function addCommonProtos() { - const apiDescriptor = require_api(); - const descriptorDescriptor = require_descriptor(); - const sourceContextDescriptor = require_source_context(); - const typeDescriptor = require_type2(); - Protobuf.common("api", apiDescriptor.nested.google.nested.protobuf.nested); - Protobuf.common("descriptor", descriptorDescriptor.nested.google.nested.protobuf.nested); - Protobuf.common("source_context", sourceContextDescriptor.nested.google.nested.protobuf.nested); - Protobuf.common("type", typeDescriptor.nested.google.nested.protobuf.nested); - } - exports2.addCommonProtos = addCommonProtos; - } -}); - -// node_modules/long/src/long.js -var require_long = __commonJS({ - "node_modules/long/src/long.js"(exports2, module2) { - module2.exports = Long; - var wasm = null; - try { - wasm = new WebAssembly.Instance(new WebAssembly.Module(new Uint8Array([ - 0, - 97, - 115, - 109, - 1, - 0, - 0, - 0, - 1, - 13, - 2, - 96, - 0, - 1, - 127, - 96, - 4, - 127, - 127, - 127, - 127, - 1, - 127, - 3, - 7, - 6, - 0, - 1, - 1, - 1, - 1, - 1, - 6, - 6, - 1, - 127, - 1, - 65, - 0, - 11, - 7, - 50, - 6, - 3, - 109, - 117, - 108, - 0, - 1, - 5, - 100, - 105, - 118, - 95, - 115, - 0, - 2, - 5, - 100, - 105, - 118, - 95, - 117, - 0, - 3, - 5, - 114, - 101, - 109, - 95, - 115, - 0, - 4, - 5, - 114, - 101, - 109, - 95, - 117, - 0, - 5, - 8, - 103, - 101, - 116, - 95, - 104, - 105, - 103, - 104, - 0, - 0, - 10, - 191, - 1, - 6, - 4, - 0, - 35, - 0, - 11, - 36, - 1, - 1, - 126, - 32, - 0, - 173, - 32, - 1, - 173, - 66, - 32, - 134, - 132, - 32, - 2, - 173, - 32, - 3, - 173, - 66, - 32, - 134, - 132, - 126, - 34, - 4, - 66, - 32, - 135, - 167, - 36, - 0, - 32, - 4, - 167, - 11, - 36, - 1, - 1, - 126, - 32, - 0, - 173, - 32, - 1, - 173, - 66, - 32, - 134, - 132, - 32, - 2, - 173, - 32, - 3, - 173, - 66, - 32, - 134, - 132, - 127, - 34, - 4, - 66, - 32, - 135, - 167, - 36, - 0, - 32, - 4, - 167, - 11, - 36, - 1, - 1, - 126, - 32, - 0, - 173, - 32, - 1, - 173, - 66, - 32, - 134, - 132, - 32, - 2, - 173, - 32, - 3, - 173, - 66, - 32, - 134, - 132, - 128, - 34, - 4, - 66, - 32, - 135, - 167, - 36, - 0, - 32, - 4, - 167, - 11, - 36, - 1, - 1, - 126, - 32, - 0, - 173, - 32, - 1, - 173, - 66, - 32, - 134, - 132, - 32, - 2, - 173, - 32, - 3, - 173, - 66, - 32, - 134, - 132, - 129, - 34, - 4, - 66, - 32, - 135, - 167, - 36, - 0, - 32, - 4, - 167, - 11, - 36, - 1, - 1, - 126, - 32, - 0, - 173, - 32, - 1, - 173, - 66, - 32, - 134, - 132, - 32, - 2, - 173, - 32, - 3, - 173, - 66, - 32, - 134, - 132, - 130, - 34, - 4, - 66, - 32, - 135, - 167, - 36, - 0, - 32, - 4, - 167, - 11 - ])), {}).exports; - } catch (e) { - } - function Long(low, high, unsigned) { - this.low = low | 0; - this.high = high | 0; - this.unsigned = !!unsigned; - } - Long.prototype.__isLong__; - Object.defineProperty(Long.prototype, "__isLong__", { value: true }); - function isLong(obj) { - return (obj && obj["__isLong__"]) === true; - } - Long.isLong = isLong; - var INT_CACHE = {}; - var UINT_CACHE = {}; - function fromInt(value, unsigned) { - var obj, cachedObj, cache; - if (unsigned) { - value >>>= 0; - if (cache = 0 <= value && value < 256) { - cachedObj = UINT_CACHE[value]; - if (cachedObj) - return cachedObj; - } - obj = fromBits(value, (value | 0) < 0 ? -1 : 0, true); - if (cache) - UINT_CACHE[value] = obj; - return obj; - } else { - value |= 0; - if (cache = -128 <= value && value < 128) { - cachedObj = INT_CACHE[value]; - if (cachedObj) - return cachedObj; - } - obj = fromBits(value, value < 0 ? -1 : 0, false); - if (cache) - INT_CACHE[value] = obj; - return obj; - } - } - Long.fromInt = fromInt; - function fromNumber(value, unsigned) { - if (isNaN(value)) - return unsigned ? UZERO : ZERO; - if (unsigned) { - if (value < 0) - return UZERO; - if (value >= TWO_PWR_64_DBL) - return MAX_UNSIGNED_VALUE; - } else { - if (value <= -TWO_PWR_63_DBL) - return MIN_VALUE; - if (value + 1 >= TWO_PWR_63_DBL) - return MAX_VALUE; - } - if (value < 0) - return fromNumber(-value, unsigned).neg(); - return fromBits(value % TWO_PWR_32_DBL | 0, value / TWO_PWR_32_DBL | 0, unsigned); - } - Long.fromNumber = fromNumber; - function fromBits(lowBits, highBits, unsigned) { - return new Long(lowBits, highBits, unsigned); - } - Long.fromBits = fromBits; - var pow_dbl = Math.pow; - function fromString(str, unsigned, radix) { - if (str.length === 0) - throw Error("empty string"); - if (str === "NaN" || str === "Infinity" || str === "+Infinity" || str === "-Infinity") - return ZERO; - if (typeof unsigned === "number") { - radix = unsigned, unsigned = false; - } else { - unsigned = !!unsigned; - } - radix = radix || 10; - if (radix < 2 || 36 < radix) - throw RangeError("radix"); - var p; - if ((p = str.indexOf("-")) > 0) - throw Error("interior hyphen"); - else if (p === 0) { - return fromString(str.substring(1), unsigned, radix).neg(); - } - var radixToPower = fromNumber(pow_dbl(radix, 8)); - var result = ZERO; - for (var i = 0; i < str.length; i += 8) { - var size = Math.min(8, str.length - i), value = parseInt(str.substring(i, i + size), radix); - if (size < 8) { - var power = fromNumber(pow_dbl(radix, size)); - result = result.mul(power).add(fromNumber(value)); - } else { - result = result.mul(radixToPower); - result = result.add(fromNumber(value)); - } - } - result.unsigned = unsigned; - return result; - } - Long.fromString = fromString; - function fromValue(val, unsigned) { - if (typeof val === "number") - return fromNumber(val, unsigned); - if (typeof val === "string") - return fromString(val, unsigned); - return fromBits(val.low, val.high, typeof unsigned === "boolean" ? unsigned : val.unsigned); - } - Long.fromValue = fromValue; - var TWO_PWR_16_DBL = 1 << 16; - var TWO_PWR_24_DBL = 1 << 24; - var TWO_PWR_32_DBL = TWO_PWR_16_DBL * TWO_PWR_16_DBL; - var TWO_PWR_64_DBL = TWO_PWR_32_DBL * TWO_PWR_32_DBL; - var TWO_PWR_63_DBL = TWO_PWR_64_DBL / 2; - var TWO_PWR_24 = fromInt(TWO_PWR_24_DBL); - var ZERO = fromInt(0); - Long.ZERO = ZERO; - var UZERO = fromInt(0, true); - Long.UZERO = UZERO; - var ONE = fromInt(1); - Long.ONE = ONE; - var UONE = fromInt(1, true); - Long.UONE = UONE; - var NEG_ONE = fromInt(-1); - Long.NEG_ONE = NEG_ONE; - var MAX_VALUE = fromBits(4294967295 | 0, 2147483647 | 0, false); - Long.MAX_VALUE = MAX_VALUE; - var MAX_UNSIGNED_VALUE = fromBits(4294967295 | 0, 4294967295 | 0, true); - Long.MAX_UNSIGNED_VALUE = MAX_UNSIGNED_VALUE; - var MIN_VALUE = fromBits(0, 2147483648 | 0, false); - Long.MIN_VALUE = MIN_VALUE; - var LongPrototype = Long.prototype; - LongPrototype.toInt = function toInt() { - return this.unsigned ? this.low >>> 0 : this.low; - }; - LongPrototype.toNumber = function toNumber() { - if (this.unsigned) - return (this.high >>> 0) * TWO_PWR_32_DBL + (this.low >>> 0); - return this.high * TWO_PWR_32_DBL + (this.low >>> 0); - }; - LongPrototype.toString = function toString(radix) { - radix = radix || 10; - if (radix < 2 || 36 < radix) - throw RangeError("radix"); - if (this.isZero()) - return "0"; - if (this.isNegative()) { - if (this.eq(MIN_VALUE)) { - var radixLong = fromNumber(radix), div = this.div(radixLong), rem1 = div.mul(radixLong).sub(this); - return div.toString(radix) + rem1.toInt().toString(radix); - } else - return "-" + this.neg().toString(radix); - } - var radixToPower = fromNumber(pow_dbl(radix, 6), this.unsigned), rem = this; - var result = ""; - while (true) { - var remDiv = rem.div(radixToPower), intval = rem.sub(remDiv.mul(radixToPower)).toInt() >>> 0, digits = intval.toString(radix); - rem = remDiv; - if (rem.isZero()) - return digits + result; - else { - while (digits.length < 6) - digits = "0" + digits; - result = "" + digits + result; - } - } - }; - LongPrototype.getHighBits = function getHighBits() { - return this.high; - }; - LongPrototype.getHighBitsUnsigned = function getHighBitsUnsigned() { - return this.high >>> 0; - }; - LongPrototype.getLowBits = function getLowBits() { - return this.low; - }; - LongPrototype.getLowBitsUnsigned = function getLowBitsUnsigned() { - return this.low >>> 0; - }; - LongPrototype.getNumBitsAbs = function getNumBitsAbs() { - if (this.isNegative()) - return this.eq(MIN_VALUE) ? 64 : this.neg().getNumBitsAbs(); - var val = this.high != 0 ? this.high : this.low; - for (var bit = 31; bit > 0; bit--) - if ((val & 1 << bit) != 0) - break; - return this.high != 0 ? bit + 33 : bit + 1; - }; - LongPrototype.isZero = function isZero() { - return this.high === 0 && this.low === 0; - }; - LongPrototype.eqz = LongPrototype.isZero; - LongPrototype.isNegative = function isNegative() { - return !this.unsigned && this.high < 0; - }; - LongPrototype.isPositive = function isPositive() { - return this.unsigned || this.high >= 0; - }; - LongPrototype.isOdd = function isOdd() { - return (this.low & 1) === 1; - }; - LongPrototype.isEven = function isEven() { - return (this.low & 1) === 0; - }; - LongPrototype.equals = function equals(other) { - if (!isLong(other)) - other = fromValue(other); - if (this.unsigned !== other.unsigned && this.high >>> 31 === 1 && other.high >>> 31 === 1) - return false; - return this.high === other.high && this.low === other.low; - }; - LongPrototype.eq = LongPrototype.equals; - LongPrototype.notEquals = function notEquals(other) { - return !this.eq( - /* validates */ - other - ); - }; - LongPrototype.neq = LongPrototype.notEquals; - LongPrototype.ne = LongPrototype.notEquals; - LongPrototype.lessThan = function lessThan(other) { - return this.comp( - /* validates */ - other - ) < 0; - }; - LongPrototype.lt = LongPrototype.lessThan; - LongPrototype.lessThanOrEqual = function lessThanOrEqual(other) { - return this.comp( - /* validates */ - other - ) <= 0; - }; - LongPrototype.lte = LongPrototype.lessThanOrEqual; - LongPrototype.le = LongPrototype.lessThanOrEqual; - LongPrototype.greaterThan = function greaterThan(other) { - return this.comp( - /* validates */ - other - ) > 0; - }; - LongPrototype.gt = LongPrototype.greaterThan; - LongPrototype.greaterThanOrEqual = function greaterThanOrEqual(other) { - return this.comp( - /* validates */ - other - ) >= 0; - }; - LongPrototype.gte = LongPrototype.greaterThanOrEqual; - LongPrototype.ge = LongPrototype.greaterThanOrEqual; - LongPrototype.compare = function compare(other) { - if (!isLong(other)) - other = fromValue(other); - if (this.eq(other)) - return 0; - var thisNeg = this.isNegative(), otherNeg = other.isNegative(); - if (thisNeg && !otherNeg) - return -1; - if (!thisNeg && otherNeg) - return 1; - if (!this.unsigned) - return this.sub(other).isNegative() ? -1 : 1; - return other.high >>> 0 > this.high >>> 0 || other.high === this.high && other.low >>> 0 > this.low >>> 0 ? -1 : 1; - }; - LongPrototype.comp = LongPrototype.compare; - LongPrototype.negate = function negate() { - if (!this.unsigned && this.eq(MIN_VALUE)) - return MIN_VALUE; - return this.not().add(ONE); - }; - LongPrototype.neg = LongPrototype.negate; - LongPrototype.add = function add(addend) { - if (!isLong(addend)) - addend = fromValue(addend); - var a48 = this.high >>> 16; - var a32 = this.high & 65535; - var a16 = this.low >>> 16; - var a00 = this.low & 65535; - var b48 = addend.high >>> 16; - var b32 = addend.high & 65535; - var b16 = addend.low >>> 16; - var b00 = addend.low & 65535; - var c48 = 0, c32 = 0, c16 = 0, c00 = 0; - c00 += a00 + b00; - c16 += c00 >>> 16; - c00 &= 65535; - c16 += a16 + b16; - c32 += c16 >>> 16; - c16 &= 65535; - c32 += a32 + b32; - c48 += c32 >>> 16; - c32 &= 65535; - c48 += a48 + b48; - c48 &= 65535; - return fromBits(c16 << 16 | c00, c48 << 16 | c32, this.unsigned); - }; - LongPrototype.subtract = function subtract(subtrahend) { - if (!isLong(subtrahend)) - subtrahend = fromValue(subtrahend); - return this.add(subtrahend.neg()); - }; - LongPrototype.sub = LongPrototype.subtract; - LongPrototype.multiply = function multiply(multiplier) { - if (this.isZero()) - return ZERO; - if (!isLong(multiplier)) - multiplier = fromValue(multiplier); - if (wasm) { - var low = wasm.mul( - this.low, - this.high, - multiplier.low, - multiplier.high - ); - return fromBits(low, wasm.get_high(), this.unsigned); - } - if (multiplier.isZero()) - return ZERO; - if (this.eq(MIN_VALUE)) - return multiplier.isOdd() ? MIN_VALUE : ZERO; - if (multiplier.eq(MIN_VALUE)) - return this.isOdd() ? MIN_VALUE : ZERO; - if (this.isNegative()) { - if (multiplier.isNegative()) - return this.neg().mul(multiplier.neg()); - else - return this.neg().mul(multiplier).neg(); - } else if (multiplier.isNegative()) - return this.mul(multiplier.neg()).neg(); - if (this.lt(TWO_PWR_24) && multiplier.lt(TWO_PWR_24)) - return fromNumber(this.toNumber() * multiplier.toNumber(), this.unsigned); - var a48 = this.high >>> 16; - var a32 = this.high & 65535; - var a16 = this.low >>> 16; - var a00 = this.low & 65535; - var b48 = multiplier.high >>> 16; - var b32 = multiplier.high & 65535; - var b16 = multiplier.low >>> 16; - var b00 = multiplier.low & 65535; - var c48 = 0, c32 = 0, c16 = 0, c00 = 0; - c00 += a00 * b00; - c16 += c00 >>> 16; - c00 &= 65535; - c16 += a16 * b00; - c32 += c16 >>> 16; - c16 &= 65535; - c16 += a00 * b16; - c32 += c16 >>> 16; - c16 &= 65535; - c32 += a32 * b00; - c48 += c32 >>> 16; - c32 &= 65535; - c32 += a16 * b16; - c48 += c32 >>> 16; - c32 &= 65535; - c32 += a00 * b32; - c48 += c32 >>> 16; - c32 &= 65535; - c48 += a48 * b00 + a32 * b16 + a16 * b32 + a00 * b48; - c48 &= 65535; - return fromBits(c16 << 16 | c00, c48 << 16 | c32, this.unsigned); - }; - LongPrototype.mul = LongPrototype.multiply; - LongPrototype.divide = function divide(divisor) { - if (!isLong(divisor)) - divisor = fromValue(divisor); - if (divisor.isZero()) - throw Error("division by zero"); - if (wasm) { - if (!this.unsigned && this.high === -2147483648 && divisor.low === -1 && divisor.high === -1) { - return this; - } - var low = (this.unsigned ? wasm.div_u : wasm.div_s)( - this.low, - this.high, - divisor.low, - divisor.high - ); - return fromBits(low, wasm.get_high(), this.unsigned); - } - if (this.isZero()) - return this.unsigned ? UZERO : ZERO; - var approx, rem, res; - if (!this.unsigned) { - if (this.eq(MIN_VALUE)) { - if (divisor.eq(ONE) || divisor.eq(NEG_ONE)) - return MIN_VALUE; - else if (divisor.eq(MIN_VALUE)) - return ONE; - else { - var halfThis = this.shr(1); - approx = halfThis.div(divisor).shl(1); - if (approx.eq(ZERO)) { - return divisor.isNegative() ? ONE : NEG_ONE; - } else { - rem = this.sub(divisor.mul(approx)); - res = approx.add(rem.div(divisor)); - return res; - } - } - } else if (divisor.eq(MIN_VALUE)) - return this.unsigned ? UZERO : ZERO; - if (this.isNegative()) { - if (divisor.isNegative()) - return this.neg().div(divisor.neg()); - return this.neg().div(divisor).neg(); - } else if (divisor.isNegative()) - return this.div(divisor.neg()).neg(); - res = ZERO; - } else { - if (!divisor.unsigned) - divisor = divisor.toUnsigned(); - if (divisor.gt(this)) - return UZERO; - if (divisor.gt(this.shru(1))) - return UONE; - res = UZERO; - } - rem = this; - while (rem.gte(divisor)) { - approx = Math.max(1, Math.floor(rem.toNumber() / divisor.toNumber())); - var log2 = Math.ceil(Math.log(approx) / Math.LN2), delta = log2 <= 48 ? 1 : pow_dbl(2, log2 - 48), approxRes = fromNumber(approx), approxRem = approxRes.mul(divisor); - while (approxRem.isNegative() || approxRem.gt(rem)) { - approx -= delta; - approxRes = fromNumber(approx, this.unsigned); - approxRem = approxRes.mul(divisor); - } - if (approxRes.isZero()) - approxRes = ONE; - res = res.add(approxRes); - rem = rem.sub(approxRem); - } - return res; - }; - LongPrototype.div = LongPrototype.divide; - LongPrototype.modulo = function modulo(divisor) { - if (!isLong(divisor)) - divisor = fromValue(divisor); - if (wasm) { - var low = (this.unsigned ? wasm.rem_u : wasm.rem_s)( - this.low, - this.high, - divisor.low, - divisor.high - ); - return fromBits(low, wasm.get_high(), this.unsigned); - } - return this.sub(this.div(divisor).mul(divisor)); - }; - LongPrototype.mod = LongPrototype.modulo; - LongPrototype.rem = LongPrototype.modulo; - LongPrototype.not = function not() { - return fromBits(~this.low, ~this.high, this.unsigned); - }; - LongPrototype.and = function and(other) { - if (!isLong(other)) - other = fromValue(other); - return fromBits(this.low & other.low, this.high & other.high, this.unsigned); - }; - LongPrototype.or = function or(other) { - if (!isLong(other)) - other = fromValue(other); - return fromBits(this.low | other.low, this.high | other.high, this.unsigned); - }; - LongPrototype.xor = function xor(other) { - if (!isLong(other)) - other = fromValue(other); - return fromBits(this.low ^ other.low, this.high ^ other.high, this.unsigned); - }; - LongPrototype.shiftLeft = function shiftLeft(numBits) { - if (isLong(numBits)) - numBits = numBits.toInt(); - if ((numBits &= 63) === 0) - return this; - else if (numBits < 32) - return fromBits(this.low << numBits, this.high << numBits | this.low >>> 32 - numBits, this.unsigned); - else - return fromBits(0, this.low << numBits - 32, this.unsigned); - }; - LongPrototype.shl = LongPrototype.shiftLeft; - LongPrototype.shiftRight = function shiftRight(numBits) { - if (isLong(numBits)) - numBits = numBits.toInt(); - if ((numBits &= 63) === 0) - return this; - else if (numBits < 32) - return fromBits(this.low >>> numBits | this.high << 32 - numBits, this.high >> numBits, this.unsigned); - else - return fromBits(this.high >> numBits - 32, this.high >= 0 ? 0 : -1, this.unsigned); - }; - LongPrototype.shr = LongPrototype.shiftRight; - LongPrototype.shiftRightUnsigned = function shiftRightUnsigned(numBits) { - if (isLong(numBits)) - numBits = numBits.toInt(); - numBits &= 63; - if (numBits === 0) - return this; - else { - var high = this.high; - if (numBits < 32) { - var low = this.low; - return fromBits(low >>> numBits | high << 32 - numBits, high >>> numBits, this.unsigned); - } else if (numBits === 32) - return fromBits(high, 0, this.unsigned); - else - return fromBits(high >>> numBits - 32, 0, this.unsigned); - } - }; - LongPrototype.shru = LongPrototype.shiftRightUnsigned; - LongPrototype.shr_u = LongPrototype.shiftRightUnsigned; - LongPrototype.toSigned = function toSigned() { - if (!this.unsigned) - return this; - return fromBits(this.low, this.high, false); - }; - LongPrototype.toUnsigned = function toUnsigned() { - if (this.unsigned) - return this; - return fromBits(this.low, this.high, true); - }; - LongPrototype.toBytes = function toBytes(le) { - return le ? this.toBytesLE() : this.toBytesBE(); - }; - LongPrototype.toBytesLE = function toBytesLE() { - var hi2 = this.high, lo2 = this.low; - return [ - lo2 & 255, - lo2 >>> 8 & 255, - lo2 >>> 16 & 255, - lo2 >>> 24, - hi2 & 255, - hi2 >>> 8 & 255, - hi2 >>> 16 & 255, - hi2 >>> 24 - ]; - }; - LongPrototype.toBytesBE = function toBytesBE() { - var hi2 = this.high, lo2 = this.low; - return [ - hi2 >>> 24, - hi2 >>> 16 & 255, - hi2 >>> 8 & 255, - hi2 & 255, - lo2 >>> 24, - lo2 >>> 16 & 255, - lo2 >>> 8 & 255, - lo2 & 255 - ]; - }; - Long.fromBytes = function fromBytes(bytes, unsigned, le) { - return le ? Long.fromBytesLE(bytes, unsigned) : Long.fromBytesBE(bytes, unsigned); - }; - Long.fromBytesLE = function fromBytesLE(bytes, unsigned) { - return new Long( - bytes[0] | bytes[1] << 8 | bytes[2] << 16 | bytes[3] << 24, - bytes[4] | bytes[5] << 8 | bytes[6] << 16 | bytes[7] << 24, - unsigned - ); - }; - Long.fromBytesBE = function fromBytesBE(bytes, unsigned) { - return new Long( - bytes[4] << 24 | bytes[5] << 16 | bytes[6] << 8 | bytes[7], - bytes[0] << 24 | bytes[1] << 16 | bytes[2] << 8 | bytes[3], - unsigned - ); - }; - } -}); - -// node_modules/@grpc/proto-loader/build/src/index.js -var require_src2 = __commonJS({ - "node_modules/@grpc/proto-loader/build/src/index.js"(exports2) { - "use strict"; - Object.defineProperty(exports2, "__esModule", { value: true }); - exports2.loadFileDescriptorSetFromObject = exports2.loadFileDescriptorSetFromBuffer = exports2.fromJSON = exports2.loadSync = exports2.load = exports2.isAnyExtension = exports2.Long = void 0; - var camelCase = require_lodash(); - var Protobuf = require_protobufjs(); - var descriptor = require_descriptor2(); - var util_1 = require_util2(); - var Long = require_long(); - exports2.Long = Long; - function isAnyExtension(obj) { - return "@type" in obj && typeof obj["@type"] === "string"; - } - exports2.isAnyExtension = isAnyExtension; - var descriptorOptions = { - longs: String, - enums: String, - bytes: String, - defaults: true, - oneofs: true, - json: true - }; - function joinName(baseName, name) { - if (baseName === "") { - return name; - } else { - return baseName + "." + name; - } - } - function isHandledReflectionObject(obj) { - return obj instanceof Protobuf.Service || obj instanceof Protobuf.Type || obj instanceof Protobuf.Enum; - } - function isNamespaceBase(obj) { - return obj instanceof Protobuf.Namespace || obj instanceof Protobuf.Root; - } - function getAllHandledReflectionObjects(obj, parentName) { - const objName = joinName(parentName, obj.name); - if (isHandledReflectionObject(obj)) { - return [[objName, obj]]; - } else { - if (isNamespaceBase(obj) && typeof obj.nested !== "undefined") { - return Object.keys(obj.nested).map((name) => { - return getAllHandledReflectionObjects(obj.nested[name], objName); - }).reduce((accumulator, currentValue) => accumulator.concat(currentValue), []); - } - } - return []; - } - function createDeserializer(cls, options2) { - return function deserialize(argBuf) { - return cls.toObject(cls.decode(argBuf), options2); - }; - } - function createSerializer(cls) { - return function serialize(arg) { - if (Array.isArray(arg)) { - throw new Error(`Failed to serialize message: expected object with ${cls.name} structure, got array instead`); - } - const message = cls.fromObject(arg); - return cls.encode(message).finish(); - }; - } - function createMethodDefinition(method, serviceName, options2, fileDescriptors) { - const requestType = method.resolvedRequestType; - const responseType = method.resolvedResponseType; - return { - path: "/" + serviceName + "/" + method.name, - requestStream: !!method.requestStream, - responseStream: !!method.responseStream, - requestSerialize: createSerializer(requestType), - requestDeserialize: createDeserializer(requestType, options2), - responseSerialize: createSerializer(responseType), - responseDeserialize: createDeserializer(responseType, options2), - // TODO(murgatroid99): Find a better way to handle this - originalName: camelCase(method.name), - requestType: createMessageDefinition(requestType, fileDescriptors), - responseType: createMessageDefinition(responseType, fileDescriptors) - }; - } - function createServiceDefinition(service, name, options2, fileDescriptors) { - const def = {}; - for (const method of service.methodsArray) { - def[method.name] = createMethodDefinition(method, name, options2, fileDescriptors); - } - return def; - } - function createMessageDefinition(message, fileDescriptors) { - const messageDescriptor = message.toDescriptor("proto3"); - return { - format: "Protocol Buffer 3 DescriptorProto", - type: messageDescriptor.$type.toObject(messageDescriptor, descriptorOptions), - fileDescriptorProtos: fileDescriptors - }; - } - function createEnumDefinition(enumType, fileDescriptors) { - const enumDescriptor = enumType.toDescriptor("proto3"); - return { - format: "Protocol Buffer 3 EnumDescriptorProto", - type: enumDescriptor.$type.toObject(enumDescriptor, descriptorOptions), - fileDescriptorProtos: fileDescriptors - }; - } - function createDefinition(obj, name, options2, fileDescriptors) { - if (obj instanceof Protobuf.Service) { - return createServiceDefinition(obj, name, options2, fileDescriptors); - } else if (obj instanceof Protobuf.Type) { - return createMessageDefinition(obj, fileDescriptors); - } else if (obj instanceof Protobuf.Enum) { - return createEnumDefinition(obj, fileDescriptors); - } else { - throw new Error("Type mismatch in reflection object handling"); - } - } - function createPackageDefinition(root, options2) { - const def = {}; - root.resolveAll(); - const descriptorList = root.toDescriptor("proto3").file; - const bufferList = descriptorList.map((value) => Buffer.from(descriptor.FileDescriptorProto.encode(value).finish())); - for (const [name, obj] of getAllHandledReflectionObjects(root, "")) { - def[name] = createDefinition(obj, name, options2, bufferList); - } - return def; - } - function createPackageDefinitionFromDescriptorSet(decodedDescriptorSet, options2) { - options2 = options2 || {}; - const root = Protobuf.Root.fromDescriptor(decodedDescriptorSet); - root.resolveAll(); - return createPackageDefinition(root, options2); - } - function load(filename, options2) { - return (0, util_1.loadProtosWithOptions)(filename, options2).then((loadedRoot) => { - return createPackageDefinition(loadedRoot, options2); - }); - } - exports2.load = load; - function loadSync2(filename, options2) { - const loadedRoot = (0, util_1.loadProtosWithOptionsSync)(filename, options2); - return createPackageDefinition(loadedRoot, options2); - } - exports2.loadSync = loadSync2; - function fromJSON(json, options2) { - options2 = options2 || {}; - const loadedRoot = Protobuf.Root.fromJSON(json); - loadedRoot.resolveAll(); - return createPackageDefinition(loadedRoot, options2); - } - exports2.fromJSON = fromJSON; - function loadFileDescriptorSetFromBuffer(descriptorSet, options2) { - const decodedDescriptorSet = descriptor.FileDescriptorSet.decode(descriptorSet); - return createPackageDefinitionFromDescriptorSet(decodedDescriptorSet, options2); - } - exports2.loadFileDescriptorSetFromBuffer = loadFileDescriptorSetFromBuffer; - function loadFileDescriptorSetFromObject(descriptorSet, options2) { - const decodedDescriptorSet = descriptor.FileDescriptorSet.fromObject(descriptorSet); - return createPackageDefinitionFromDescriptorSet(decodedDescriptorSet, options2); - } - exports2.loadFileDescriptorSetFromObject = loadFileDescriptorSetFromObject; - (0, util_1.addCommonProtos)(); - } -}); - -// node_modules/@grpc/grpc-js/build/src/constants.js -var require_constants = __commonJS({ - "node_modules/@grpc/grpc-js/build/src/constants.js"(exports2) { - "use strict"; - Object.defineProperty(exports2, "__esModule", { value: true }); - exports2.DEFAULT_MAX_RECEIVE_MESSAGE_LENGTH = exports2.DEFAULT_MAX_SEND_MESSAGE_LENGTH = exports2.Propagate = exports2.LogVerbosity = exports2.Status = void 0; - var Status; - (function(Status2) { - Status2[Status2["OK"] = 0] = "OK"; - Status2[Status2["CANCELLED"] = 1] = "CANCELLED"; - Status2[Status2["UNKNOWN"] = 2] = "UNKNOWN"; - Status2[Status2["INVALID_ARGUMENT"] = 3] = "INVALID_ARGUMENT"; - Status2[Status2["DEADLINE_EXCEEDED"] = 4] = "DEADLINE_EXCEEDED"; - Status2[Status2["NOT_FOUND"] = 5] = "NOT_FOUND"; - Status2[Status2["ALREADY_EXISTS"] = 6] = "ALREADY_EXISTS"; - Status2[Status2["PERMISSION_DENIED"] = 7] = "PERMISSION_DENIED"; - Status2[Status2["RESOURCE_EXHAUSTED"] = 8] = "RESOURCE_EXHAUSTED"; - Status2[Status2["FAILED_PRECONDITION"] = 9] = "FAILED_PRECONDITION"; - Status2[Status2["ABORTED"] = 10] = "ABORTED"; - Status2[Status2["OUT_OF_RANGE"] = 11] = "OUT_OF_RANGE"; - Status2[Status2["UNIMPLEMENTED"] = 12] = "UNIMPLEMENTED"; - Status2[Status2["INTERNAL"] = 13] = "INTERNAL"; - Status2[Status2["UNAVAILABLE"] = 14] = "UNAVAILABLE"; - Status2[Status2["DATA_LOSS"] = 15] = "DATA_LOSS"; - Status2[Status2["UNAUTHENTICATED"] = 16] = "UNAUTHENTICATED"; - })(Status || (exports2.Status = Status = {})); - var LogVerbosity; - (function(LogVerbosity2) { - LogVerbosity2[LogVerbosity2["DEBUG"] = 0] = "DEBUG"; - LogVerbosity2[LogVerbosity2["INFO"] = 1] = "INFO"; - LogVerbosity2[LogVerbosity2["ERROR"] = 2] = "ERROR"; - LogVerbosity2[LogVerbosity2["NONE"] = 3] = "NONE"; - })(LogVerbosity || (exports2.LogVerbosity = LogVerbosity = {})); - var Propagate; - (function(Propagate2) { - Propagate2[Propagate2["DEADLINE"] = 1] = "DEADLINE"; - Propagate2[Propagate2["CENSUS_STATS_CONTEXT"] = 2] = "CENSUS_STATS_CONTEXT"; - Propagate2[Propagate2["CENSUS_TRACING_CONTEXT"] = 4] = "CENSUS_TRACING_CONTEXT"; - Propagate2[Propagate2["CANCELLATION"] = 8] = "CANCELLATION"; - Propagate2[Propagate2["DEFAULTS"] = 65535] = "DEFAULTS"; - })(Propagate || (exports2.Propagate = Propagate = {})); - exports2.DEFAULT_MAX_SEND_MESSAGE_LENGTH = -1; - exports2.DEFAULT_MAX_RECEIVE_MESSAGE_LENGTH = 4 * 1024 * 1024; - } -}); - -// node_modules/@grpc/grpc-js/build/src/logging.js -var require_logging = __commonJS({ - "node_modules/@grpc/grpc-js/build/src/logging.js"(exports2) { - "use strict"; - var _a2; - var _b; - var _c2; - var _d; - Object.defineProperty(exports2, "__esModule", { value: true }); - exports2.isTracerEnabled = exports2.trace = exports2.log = exports2.setLoggerVerbosity = exports2.setLogger = exports2.getLogger = void 0; - var constants_1 = require_constants(); - var DEFAULT_LOGGER = { - error: (message, ...optionalParams) => { - console.error("E " + message, ...optionalParams); - }, - info: (message, ...optionalParams) => { - console.error("I " + message, ...optionalParams); - }, - debug: (message, ...optionalParams) => { - console.error("D " + message, ...optionalParams); - } - }; - var _logger = DEFAULT_LOGGER; - var _logVerbosity = constants_1.LogVerbosity.ERROR; - var verbosityString = (_b = (_a2 = process.env.GRPC_NODE_VERBOSITY) !== null && _a2 !== void 0 ? _a2 : process.env.GRPC_VERBOSITY) !== null && _b !== void 0 ? _b : ""; - switch (verbosityString.toUpperCase()) { - case "DEBUG": - _logVerbosity = constants_1.LogVerbosity.DEBUG; - break; - case "INFO": - _logVerbosity = constants_1.LogVerbosity.INFO; - break; - case "ERROR": - _logVerbosity = constants_1.LogVerbosity.ERROR; - break; - case "NONE": - _logVerbosity = constants_1.LogVerbosity.NONE; - break; - default: - } - var getLogger = () => { - return _logger; - }; - exports2.getLogger = getLogger; - var setLogger = (logger) => { - _logger = logger; - }; - exports2.setLogger = setLogger; - var setLoggerVerbosity = (verbosity) => { - _logVerbosity = verbosity; - }; - exports2.setLoggerVerbosity = setLoggerVerbosity; - var log2 = (severity, ...args) => { - let logFunction; - if (severity >= _logVerbosity) { - switch (severity) { - case constants_1.LogVerbosity.DEBUG: - logFunction = _logger.debug; - break; - case constants_1.LogVerbosity.INFO: - logFunction = _logger.info; - break; - case constants_1.LogVerbosity.ERROR: - logFunction = _logger.error; - break; - } - if (!logFunction) { - logFunction = _logger.error; - } - if (logFunction) { - logFunction.bind(_logger)(...args); - } - } - }; - exports2.log = log2; - var tracersString = (_d = (_c2 = process.env.GRPC_NODE_TRACE) !== null && _c2 !== void 0 ? _c2 : process.env.GRPC_TRACE) !== null && _d !== void 0 ? _d : ""; - var enabledTracers = /* @__PURE__ */ new Set(); - var disabledTracers = /* @__PURE__ */ new Set(); - for (const tracerName of tracersString.split(",")) { - if (tracerName.startsWith("-")) { - disabledTracers.add(tracerName.substring(1)); - } else { - enabledTracers.add(tracerName); - } - } - var allEnabled = enabledTracers.has("all"); - function trace(severity, tracer, text) { - if (isTracerEnabled(tracer)) { - (0, exports2.log)(severity, (/* @__PURE__ */ new Date()).toISOString() + " | " + tracer + " | " + text); - } - } - exports2.trace = trace; - function isTracerEnabled(tracer) { - return !disabledTracers.has(tracer) && (allEnabled || enabledTracers.has(tracer)); - } - exports2.isTracerEnabled = isTracerEnabled; - } -}); - -// node_modules/@grpc/grpc-js/build/src/error.js -var require_error = __commonJS({ - "node_modules/@grpc/grpc-js/build/src/error.js"(exports2) { - "use strict"; - Object.defineProperty(exports2, "__esModule", { value: true }); - exports2.getErrorCode = exports2.getErrorMessage = void 0; - function getErrorMessage(error2) { - if (error2 instanceof Error) { - return error2.message; - } else { - return String(error2); - } - } - exports2.getErrorMessage = getErrorMessage; - function getErrorCode(error2) { - if (typeof error2 === "object" && error2 !== null && "code" in error2 && typeof error2.code === "number") { - return error2.code; - } else { - return null; - } - } - exports2.getErrorCode = getErrorCode; - } -}); - -// node_modules/@grpc/grpc-js/build/src/metadata.js -var require_metadata = __commonJS({ - "node_modules/@grpc/grpc-js/build/src/metadata.js"(exports2) { - "use strict"; - Object.defineProperty(exports2, "__esModule", { value: true }); - exports2.Metadata = void 0; - var logging_1 = require_logging(); - var constants_1 = require_constants(); - var error_1 = require_error(); - var LEGAL_KEY_REGEX = /^[0-9a-z_.-]+$/; - var LEGAL_NON_BINARY_VALUE_REGEX = /^[ -~]*$/; - function isLegalKey(key) { - return LEGAL_KEY_REGEX.test(key); - } - function isLegalNonBinaryValue(value) { - return LEGAL_NON_BINARY_VALUE_REGEX.test(value); - } - function isBinaryKey(key) { - return key.endsWith("-bin"); - } - function isCustomMetadata(key) { - return !key.startsWith("grpc-"); - } - function normalizeKey(key) { - return key.toLowerCase(); - } - function validate(key, value) { - if (!isLegalKey(key)) { - throw new Error('Metadata key "' + key + '" contains illegal characters'); - } - if (value !== null && value !== void 0) { - if (isBinaryKey(key)) { - if (!Buffer.isBuffer(value)) { - throw new Error("keys that end with '-bin' must have Buffer values"); - } - } else { - if (Buffer.isBuffer(value)) { - throw new Error("keys that don't end with '-bin' must have String values"); - } - if (!isLegalNonBinaryValue(value)) { - throw new Error('Metadata string value "' + value + '" contains illegal characters'); - } - } - } - } - var Metadata = class _Metadata { - constructor(options2 = {}) { - this.internalRepr = /* @__PURE__ */ new Map(); - this.options = options2; - } - /** - * Sets the given value for the given key by replacing any other values - * associated with that key. Normalizes the key. - * @param key The key to whose value should be set. - * @param value The value to set. Must be a buffer if and only - * if the normalized key ends with '-bin'. - */ - set(key, value) { - key = normalizeKey(key); - validate(key, value); - this.internalRepr.set(key, [value]); - } - /** - * Adds the given value for the given key by appending to a list of previous - * values associated with that key. Normalizes the key. - * @param key The key for which a new value should be appended. - * @param value The value to add. Must be a buffer if and only - * if the normalized key ends with '-bin'. - */ - add(key, value) { - key = normalizeKey(key); - validate(key, value); - const existingValue = this.internalRepr.get(key); - if (existingValue === void 0) { - this.internalRepr.set(key, [value]); - } else { - existingValue.push(value); - } - } - /** - * Removes the given key and any associated values. Normalizes the key. - * @param key The key whose values should be removed. - */ - remove(key) { - key = normalizeKey(key); - this.internalRepr.delete(key); - } - /** - * Gets a list of all values associated with the key. Normalizes the key. - * @param key The key whose value should be retrieved. - * @return A list of values associated with the given key. - */ - get(key) { - key = normalizeKey(key); - return this.internalRepr.get(key) || []; - } - /** - * Gets a plain object mapping each key to the first value associated with it. - * This reflects the most common way that people will want to see metadata. - * @return A key/value mapping of the metadata. - */ - getMap() { - const result = {}; - for (const [key, values] of this.internalRepr) { - if (values.length > 0) { - const v = values[0]; - result[key] = Buffer.isBuffer(v) ? Buffer.from(v) : v; - } - } - return result; - } - /** - * Clones the metadata object. - * @return The newly cloned object. - */ - clone() { - const newMetadata = new _Metadata(this.options); - const newInternalRepr = newMetadata.internalRepr; - for (const [key, value] of this.internalRepr) { - const clonedValue = value.map((v) => { - if (Buffer.isBuffer(v)) { - return Buffer.from(v); - } else { - return v; - } - }); - newInternalRepr.set(key, clonedValue); - } - return newMetadata; - } - /** - * Merges all key-value pairs from a given Metadata object into this one. - * If both this object and the given object have values in the same key, - * values from the other Metadata object will be appended to this object's - * values. - * @param other A Metadata object. - */ - merge(other) { - for (const [key, values] of other.internalRepr) { - const mergedValue = (this.internalRepr.get(key) || []).concat(values); - this.internalRepr.set(key, mergedValue); - } - } - setOptions(options2) { - this.options = options2; - } - getOptions() { - return this.options; - } - /** - * Creates an OutgoingHttpHeaders object that can be used with the http2 API. - */ - toHttp2Headers() { - const result = {}; - for (const [key, values] of this.internalRepr) { - result[key] = values.map(bufToString); - } - return result; - } - /** - * This modifies the behavior of JSON.stringify to show an object - * representation of the metadata map. - */ - toJSON() { - const result = {}; - for (const [key, values] of this.internalRepr) { - result[key] = values; - } - return result; - } - /** - * Returns a new Metadata object based fields in a given IncomingHttpHeaders - * object. - * @param headers An IncomingHttpHeaders object. - */ - static fromHttp2Headers(headers) { - const result = new _Metadata(); - for (const key of Object.keys(headers)) { - if (key.charAt(0) === ":") { - continue; - } - const values = headers[key]; - try { - if (isBinaryKey(key)) { - if (Array.isArray(values)) { - values.forEach((value) => { - result.add(key, Buffer.from(value, "base64")); - }); - } else if (values !== void 0) { - if (isCustomMetadata(key)) { - values.split(",").forEach((v) => { - result.add(key, Buffer.from(v.trim(), "base64")); - }); - } else { - result.add(key, Buffer.from(values, "base64")); - } - } - } else { - if (Array.isArray(values)) { - values.forEach((value) => { - result.add(key, value); - }); - } else if (values !== void 0) { - result.add(key, values); - } - } - } catch (error2) { - const message = `Failed to add metadata entry ${key}: ${values}. ${(0, error_1.getErrorMessage)(error2)}. For more information see https://github.com/grpc/grpc-node/issues/1173`; - (0, logging_1.log)(constants_1.LogVerbosity.ERROR, message); - } - } - return result; - } - }; - exports2.Metadata = Metadata; - var bufToString = (val) => { - return Buffer.isBuffer(val) ? val.toString("base64") : val; - }; - } -}); - -// node_modules/@grpc/grpc-js/build/src/call-credentials.js -var require_call_credentials = __commonJS({ - "node_modules/@grpc/grpc-js/build/src/call-credentials.js"(exports2) { - "use strict"; - Object.defineProperty(exports2, "__esModule", { value: true }); - exports2.CallCredentials = void 0; - var metadata_1 = require_metadata(); - function isCurrentOauth2Client(client) { - return "getRequestHeaders" in client && typeof client.getRequestHeaders === "function"; - } - var CallCredentials = class _CallCredentials { - /** - * Creates a new CallCredentials object from a given function that generates - * Metadata objects. - * @param metadataGenerator A function that accepts a set of options, and - * generates a Metadata object based on these options, which is passed back - * to the caller via a supplied (err, metadata) callback. - */ - static createFromMetadataGenerator(metadataGenerator) { - return new SingleCallCredentials(metadataGenerator); - } - /** - * Create a gRPC credential from a Google credential object. - * @param googleCredentials The authentication client to use. - * @return The resulting CallCredentials object. - */ - static createFromGoogleCredential(googleCredentials) { - return _CallCredentials.createFromMetadataGenerator((options2, callback) => { - let getHeaders; - if (isCurrentOauth2Client(googleCredentials)) { - getHeaders = googleCredentials.getRequestHeaders(options2.service_url); - } else { - getHeaders = new Promise((resolve, reject) => { - googleCredentials.getRequestMetadata(options2.service_url, (err, headers) => { - if (err) { - reject(err); - return; - } - if (!headers) { - reject(new Error("Headers not set by metadata plugin")); - return; - } - resolve(headers); - }); - }); - } - getHeaders.then((headers) => { - const metadata = new metadata_1.Metadata(); - for (const key of Object.keys(headers)) { - metadata.add(key, headers[key]); - } - callback(null, metadata); - }, (err) => { - callback(err); - }); - }); - } - static createEmpty() { - return new EmptyCallCredentials(); - } - }; - exports2.CallCredentials = CallCredentials; - var ComposedCallCredentials = class _ComposedCallCredentials extends CallCredentials { - constructor(creds) { - super(); - this.creds = creds; - } - async generateMetadata(options2) { - const base = new metadata_1.Metadata(); - const generated = await Promise.all(this.creds.map((cred) => cred.generateMetadata(options2))); - for (const gen of generated) { - base.merge(gen); - } - return base; - } - compose(other) { - return new _ComposedCallCredentials(this.creds.concat([other])); - } - _equals(other) { - if (this === other) { - return true; - } - if (other instanceof _ComposedCallCredentials) { - return this.creds.every((value, index) => value._equals(other.creds[index])); - } else { - return false; - } - } - }; - var SingleCallCredentials = class _SingleCallCredentials extends CallCredentials { - constructor(metadataGenerator) { - super(); - this.metadataGenerator = metadataGenerator; - } - generateMetadata(options2) { - return new Promise((resolve, reject) => { - this.metadataGenerator(options2, (err, metadata) => { - if (metadata !== void 0) { - resolve(metadata); - } else { - reject(err); - } - }); - }); - } - compose(other) { - return new ComposedCallCredentials([this, other]); - } - _equals(other) { - if (this === other) { - return true; - } - if (other instanceof _SingleCallCredentials) { - return this.metadataGenerator === other.metadataGenerator; - } else { - return false; - } - } - }; - var EmptyCallCredentials = class _EmptyCallCredentials extends CallCredentials { - generateMetadata(options2) { - return Promise.resolve(new metadata_1.Metadata()); - } - compose(other) { - return other; - } - _equals(other) { - return other instanceof _EmptyCallCredentials; - } - }; - } -}); - -// node_modules/@grpc/grpc-js/build/src/tls-helpers.js -var require_tls_helpers = __commonJS({ - "node_modules/@grpc/grpc-js/build/src/tls-helpers.js"(exports2) { - "use strict"; - Object.defineProperty(exports2, "__esModule", { value: true }); - exports2.getDefaultRootsData = exports2.CIPHER_SUITES = void 0; - var fs2 = require("fs"); - exports2.CIPHER_SUITES = process.env.GRPC_SSL_CIPHER_SUITES; - var DEFAULT_ROOTS_FILE_PATH = process.env.GRPC_DEFAULT_SSL_ROOTS_FILE_PATH; - var defaultRootsData = null; - function getDefaultRootsData() { - if (DEFAULT_ROOTS_FILE_PATH) { - if (defaultRootsData === null) { - defaultRootsData = fs2.readFileSync(DEFAULT_ROOTS_FILE_PATH); - } - return defaultRootsData; - } - return null; - } - exports2.getDefaultRootsData = getDefaultRootsData; - } -}); - -// node_modules/@grpc/grpc-js/build/src/channel-credentials.js -var require_channel_credentials = __commonJS({ - "node_modules/@grpc/grpc-js/build/src/channel-credentials.js"(exports2) { - "use strict"; - Object.defineProperty(exports2, "__esModule", { value: true }); - exports2.ChannelCredentials = void 0; - var tls_1 = require("tls"); - var call_credentials_1 = require_call_credentials(); - var tls_helpers_1 = require_tls_helpers(); - function verifyIsBufferOrNull(obj, friendlyName) { - if (obj && !(obj instanceof Buffer)) { - throw new TypeError(`${friendlyName}, if provided, must be a Buffer.`); - } - } - var ChannelCredentials = class { - constructor(callCredentials) { - this.callCredentials = callCredentials || call_credentials_1.CallCredentials.createEmpty(); - } - /** - * Gets the set of per-call credentials associated with this instance. - */ - _getCallCredentials() { - return this.callCredentials; - } - /** - * Return a new ChannelCredentials instance with a given set of credentials. - * The resulting instance can be used to construct a Channel that communicates - * over TLS. - * @param rootCerts The root certificate data. - * @param privateKey The client certificate private key, if available. - * @param certChain The client certificate key chain, if available. - * @param verifyOptions Additional options to modify certificate verification - */ - static createSsl(rootCerts, privateKey, certChain, verifyOptions) { - var _a2; - verifyIsBufferOrNull(rootCerts, "Root certificate"); - verifyIsBufferOrNull(privateKey, "Private key"); - verifyIsBufferOrNull(certChain, "Certificate chain"); - if (privateKey && !certChain) { - throw new Error("Private key must be given with accompanying certificate chain"); - } - if (!privateKey && certChain) { - throw new Error("Certificate chain must be given with accompanying private key"); - } - const secureContext = (0, tls_1.createSecureContext)({ - ca: (_a2 = rootCerts !== null && rootCerts !== void 0 ? rootCerts : (0, tls_helpers_1.getDefaultRootsData)()) !== null && _a2 !== void 0 ? _a2 : void 0, - key: privateKey !== null && privateKey !== void 0 ? privateKey : void 0, - cert: certChain !== null && certChain !== void 0 ? certChain : void 0, - ciphers: tls_helpers_1.CIPHER_SUITES - }); - return new SecureChannelCredentialsImpl(secureContext, verifyOptions !== null && verifyOptions !== void 0 ? verifyOptions : {}); - } - /** - * Return a new ChannelCredentials instance with credentials created using - * the provided secureContext. The resulting instances can be used to - * construct a Channel that communicates over TLS. gRPC will not override - * anything in the provided secureContext, so the environment variables - * GRPC_SSL_CIPHER_SUITES and GRPC_DEFAULT_SSL_ROOTS_FILE_PATH will - * not be applied. - * @param secureContext The return value of tls.createSecureContext() - * @param verifyOptions Additional options to modify certificate verification - */ - static createFromSecureContext(secureContext, verifyOptions) { - return new SecureChannelCredentialsImpl(secureContext, verifyOptions !== null && verifyOptions !== void 0 ? verifyOptions : {}); - } - /** - * Return a new ChannelCredentials instance with no credentials. - */ - static createInsecure() { - return new InsecureChannelCredentialsImpl(); - } - }; - exports2.ChannelCredentials = ChannelCredentials; - var InsecureChannelCredentialsImpl = class _InsecureChannelCredentialsImpl extends ChannelCredentials { - constructor(callCredentials) { - super(callCredentials); - } - compose(callCredentials) { - throw new Error("Cannot compose insecure credentials"); - } - _getConnectionOptions() { - return null; - } - _isSecure() { - return false; - } - _equals(other) { - return other instanceof _InsecureChannelCredentialsImpl; - } - }; - var SecureChannelCredentialsImpl = class _SecureChannelCredentialsImpl extends ChannelCredentials { - constructor(secureContext, verifyOptions) { - super(); - this.secureContext = secureContext; - this.verifyOptions = verifyOptions; - this.connectionOptions = { - secureContext - }; - if (verifyOptions === null || verifyOptions === void 0 ? void 0 : verifyOptions.checkServerIdentity) { - this.connectionOptions.checkServerIdentity = verifyOptions.checkServerIdentity; - } - } - compose(callCredentials) { - const combinedCallCredentials = this.callCredentials.compose(callCredentials); - return new ComposedChannelCredentialsImpl(this, combinedCallCredentials); - } - _getConnectionOptions() { - return Object.assign({}, this.connectionOptions); - } - _isSecure() { - return true; - } - _equals(other) { - if (this === other) { - return true; - } - if (other instanceof _SecureChannelCredentialsImpl) { - return this.secureContext === other.secureContext && this.verifyOptions.checkServerIdentity === other.verifyOptions.checkServerIdentity; - } else { - return false; - } - } - }; - var ComposedChannelCredentialsImpl = class _ComposedChannelCredentialsImpl extends ChannelCredentials { - constructor(channelCredentials, callCreds) { - super(callCreds); - this.channelCredentials = channelCredentials; - } - compose(callCredentials) { - const combinedCallCredentials = this.callCredentials.compose(callCredentials); - return new _ComposedChannelCredentialsImpl(this.channelCredentials, combinedCallCredentials); - } - _getConnectionOptions() { - return this.channelCredentials._getConnectionOptions(); - } - _isSecure() { - return true; - } - _equals(other) { - if (this === other) { - return true; - } - if (other instanceof _ComposedChannelCredentialsImpl) { - return this.channelCredentials._equals(other.channelCredentials) && this.callCredentials._equals(other.callCredentials); - } else { - return false; - } - } - }; - } -}); - -// node_modules/@grpc/grpc-js/build/src/load-balancer.js -var require_load_balancer = __commonJS({ - "node_modules/@grpc/grpc-js/build/src/load-balancer.js"(exports2) { - "use strict"; - Object.defineProperty(exports2, "__esModule", { value: true }); - exports2.validateLoadBalancingConfig = exports2.getFirstUsableConfig = exports2.isLoadBalancerNameRegistered = exports2.createLoadBalancer = exports2.registerDefaultLoadBalancerType = exports2.registerLoadBalancerType = exports2.createChildChannelControlHelper = void 0; - function createChildChannelControlHelper(parent, overrides) { - var _a2, _b, _c2, _d, _e2, _f, _g, _h, _j, _k; - return { - createSubchannel: (_b = (_a2 = overrides.createSubchannel) === null || _a2 === void 0 ? void 0 : _a2.bind(overrides)) !== null && _b !== void 0 ? _b : parent.createSubchannel.bind(parent), - updateState: (_d = (_c2 = overrides.updateState) === null || _c2 === void 0 ? void 0 : _c2.bind(overrides)) !== null && _d !== void 0 ? _d : parent.updateState.bind(parent), - requestReresolution: (_f = (_e2 = overrides.requestReresolution) === null || _e2 === void 0 ? void 0 : _e2.bind(overrides)) !== null && _f !== void 0 ? _f : parent.requestReresolution.bind(parent), - addChannelzChild: (_h = (_g = overrides.addChannelzChild) === null || _g === void 0 ? void 0 : _g.bind(overrides)) !== null && _h !== void 0 ? _h : parent.addChannelzChild.bind(parent), - removeChannelzChild: (_k = (_j = overrides.removeChannelzChild) === null || _j === void 0 ? void 0 : _j.bind(overrides)) !== null && _k !== void 0 ? _k : parent.removeChannelzChild.bind(parent) - }; - } - exports2.createChildChannelControlHelper = createChildChannelControlHelper; - var registeredLoadBalancerTypes = {}; - var defaultLoadBalancerType = null; - function registerLoadBalancerType(typeName, loadBalancerType, loadBalancingConfigType) { - registeredLoadBalancerTypes[typeName] = { - LoadBalancer: loadBalancerType, - LoadBalancingConfig: loadBalancingConfigType - }; - } - exports2.registerLoadBalancerType = registerLoadBalancerType; - function registerDefaultLoadBalancerType(typeName) { - defaultLoadBalancerType = typeName; - } - exports2.registerDefaultLoadBalancerType = registerDefaultLoadBalancerType; - function createLoadBalancer(config2, channelControlHelper) { - const typeName = config2.getLoadBalancerName(); - if (typeName in registeredLoadBalancerTypes) { - return new registeredLoadBalancerTypes[typeName].LoadBalancer(channelControlHelper); - } else { - return null; - } - } - exports2.createLoadBalancer = createLoadBalancer; - function isLoadBalancerNameRegistered(typeName) { - return typeName in registeredLoadBalancerTypes; - } - exports2.isLoadBalancerNameRegistered = isLoadBalancerNameRegistered; - function getFirstUsableConfig(configs, fallbackTodefault = false) { - for (const config2 of configs) { - if (config2.getLoadBalancerName() in registeredLoadBalancerTypes) { - return config2; - } - } - if (fallbackTodefault) { - if (defaultLoadBalancerType) { - return new registeredLoadBalancerTypes[defaultLoadBalancerType].LoadBalancingConfig(); - } else { - return null; - } - } else { - return null; - } - } - exports2.getFirstUsableConfig = getFirstUsableConfig; - function validateLoadBalancingConfig(obj) { - if (!(obj !== null && typeof obj === "object")) { - throw new Error("Load balancing config must be an object"); - } - const keys = Object.keys(obj); - if (keys.length !== 1) { - throw new Error("Provided load balancing config has multiple conflicting entries"); - } - const typeName = keys[0]; - if (typeName in registeredLoadBalancerTypes) { - return registeredLoadBalancerTypes[typeName].LoadBalancingConfig.createFromJson(obj[typeName]); - } else { - throw new Error(`Unrecognized load balancing config name ${typeName}`); - } - } - exports2.validateLoadBalancingConfig = validateLoadBalancingConfig; - } -}); - -// node_modules/@grpc/grpc-js/build/src/service-config.js -var require_service_config = __commonJS({ - "node_modules/@grpc/grpc-js/build/src/service-config.js"(exports2) { - "use strict"; - Object.defineProperty(exports2, "__esModule", { value: true }); - exports2.extractAndSelectServiceConfig = exports2.validateServiceConfig = exports2.validateRetryThrottling = void 0; - var os2 = require("os"); - var constants_1 = require_constants(); - var load_balancer_1 = require_load_balancer(); - var DURATION_REGEX = /^\d+(\.\d{1,9})?s$/; - var CLIENT_LANGUAGE_STRING = "node"; - function validateName(obj) { - if (!("service" in obj) || typeof obj.service !== "string") { - throw new Error("Invalid method config name: invalid service"); - } - const result = { - service: obj.service - }; - if ("method" in obj) { - if (typeof obj.method === "string") { - result.method = obj.method; - } else { - throw new Error("Invalid method config name: invalid method"); - } - } - return result; - } - function validateRetryPolicy(obj) { - if (!("maxAttempts" in obj) || !Number.isInteger(obj.maxAttempts) || obj.maxAttempts < 2) { - throw new Error("Invalid method config retry policy: maxAttempts must be an integer at least 2"); - } - if (!("initialBackoff" in obj) || typeof obj.initialBackoff !== "string" || !DURATION_REGEX.test(obj.initialBackoff)) { - throw new Error("Invalid method config retry policy: initialBackoff must be a string consisting of a positive integer followed by s"); - } - if (!("maxBackoff" in obj) || typeof obj.maxBackoff !== "string" || !DURATION_REGEX.test(obj.maxBackoff)) { - throw new Error("Invalid method config retry policy: maxBackoff must be a string consisting of a positive integer followed by s"); - } - if (!("backoffMultiplier" in obj) || typeof obj.backoffMultiplier !== "number" || obj.backoffMultiplier <= 0) { - throw new Error("Invalid method config retry policy: backoffMultiplier must be a number greater than 0"); - } - if (!("retryableStatusCodes" in obj && Array.isArray(obj.retryableStatusCodes))) { - throw new Error("Invalid method config retry policy: retryableStatusCodes is required"); - } - if (obj.retryableStatusCodes.length === 0) { - throw new Error("Invalid method config retry policy: retryableStatusCodes must be non-empty"); - } - for (const value of obj.retryableStatusCodes) { - if (typeof value === "number") { - if (!Object.values(constants_1.Status).includes(value)) { - throw new Error("Invalid method config retry policy: retryableStatusCodes value not in status code range"); - } - } else if (typeof value === "string") { - if (!Object.values(constants_1.Status).includes(value.toUpperCase())) { - throw new Error("Invalid method config retry policy: retryableStatusCodes value not a status code name"); - } - } else { - throw new Error("Invalid method config retry policy: retryableStatusCodes value must be a string or number"); - } - } - return { - maxAttempts: obj.maxAttempts, - initialBackoff: obj.initialBackoff, - maxBackoff: obj.maxBackoff, - backoffMultiplier: obj.backoffMultiplier, - retryableStatusCodes: obj.retryableStatusCodes - }; - } - function validateHedgingPolicy(obj) { - if (!("maxAttempts" in obj) || !Number.isInteger(obj.maxAttempts) || obj.maxAttempts < 2) { - throw new Error("Invalid method config hedging policy: maxAttempts must be an integer at least 2"); - } - if ("hedgingDelay" in obj && (typeof obj.hedgingDelay !== "string" || !DURATION_REGEX.test(obj.hedgingDelay))) { - throw new Error("Invalid method config hedging policy: hedgingDelay must be a string consisting of a positive integer followed by s"); - } - if ("nonFatalStatusCodes" in obj && Array.isArray(obj.nonFatalStatusCodes)) { - for (const value of obj.nonFatalStatusCodes) { - if (typeof value === "number") { - if (!Object.values(constants_1.Status).includes(value)) { - throw new Error("Invlid method config hedging policy: nonFatalStatusCodes value not in status code range"); - } - } else if (typeof value === "string") { - if (!Object.values(constants_1.Status).includes(value.toUpperCase())) { - throw new Error("Invlid method config hedging policy: nonFatalStatusCodes value not a status code name"); - } - } else { - throw new Error("Invlid method config hedging policy: nonFatalStatusCodes value must be a string or number"); - } - } - } - const result = { - maxAttempts: obj.maxAttempts - }; - if (obj.hedgingDelay) { - result.hedgingDelay = obj.hedgingDelay; - } - if (obj.nonFatalStatusCodes) { - result.nonFatalStatusCodes = obj.nonFatalStatusCodes; - } - return result; - } - function validateMethodConfig(obj) { - var _a2; - const result = { - name: [] - }; - if (!("name" in obj) || !Array.isArray(obj.name)) { - throw new Error("Invalid method config: invalid name array"); - } - for (const name of obj.name) { - result.name.push(validateName(name)); - } - if ("waitForReady" in obj) { - if (typeof obj.waitForReady !== "boolean") { - throw new Error("Invalid method config: invalid waitForReady"); - } - result.waitForReady = obj.waitForReady; - } - if ("timeout" in obj) { - if (typeof obj.timeout === "object") { - if (!("seconds" in obj.timeout) || !(typeof obj.timeout.seconds === "number")) { - throw new Error("Invalid method config: invalid timeout.seconds"); - } - if (!("nanos" in obj.timeout) || !(typeof obj.timeout.nanos === "number")) { - throw new Error("Invalid method config: invalid timeout.nanos"); - } - result.timeout = obj.timeout; - } else if (typeof obj.timeout === "string" && DURATION_REGEX.test(obj.timeout)) { - const timeoutParts = obj.timeout.substring(0, obj.timeout.length - 1).split("."); - result.timeout = { - seconds: timeoutParts[0] | 0, - nanos: ((_a2 = timeoutParts[1]) !== null && _a2 !== void 0 ? _a2 : 0) | 0 - }; - } else { - throw new Error("Invalid method config: invalid timeout"); - } - } - if ("maxRequestBytes" in obj) { - if (typeof obj.maxRequestBytes !== "number") { - throw new Error("Invalid method config: invalid maxRequestBytes"); - } - result.maxRequestBytes = obj.maxRequestBytes; - } - if ("maxResponseBytes" in obj) { - if (typeof obj.maxResponseBytes !== "number") { - throw new Error("Invalid method config: invalid maxRequestBytes"); - } - result.maxResponseBytes = obj.maxResponseBytes; - } - if ("retryPolicy" in obj) { - if ("hedgingPolicy" in obj) { - throw new Error("Invalid method config: retryPolicy and hedgingPolicy cannot both be specified"); - } else { - result.retryPolicy = validateRetryPolicy(obj.retryPolicy); - } - } else if ("hedgingPolicy" in obj) { - result.hedgingPolicy = validateHedgingPolicy(obj.hedgingPolicy); - } - return result; - } - function validateRetryThrottling(obj) { - if (!("maxTokens" in obj) || typeof obj.maxTokens !== "number" || obj.maxTokens <= 0 || obj.maxTokens > 1e3) { - throw new Error("Invalid retryThrottling: maxTokens must be a number in (0, 1000]"); - } - if (!("tokenRatio" in obj) || typeof obj.tokenRatio !== "number" || obj.tokenRatio <= 0) { - throw new Error("Invalid retryThrottling: tokenRatio must be a number greater than 0"); - } - return { - maxTokens: +obj.maxTokens.toFixed(3), - tokenRatio: +obj.tokenRatio.toFixed(3) - }; - } - exports2.validateRetryThrottling = validateRetryThrottling; - function validateServiceConfig(obj) { - const result = { - loadBalancingConfig: [], - methodConfig: [] - }; - if ("loadBalancingPolicy" in obj) { - if (typeof obj.loadBalancingPolicy === "string") { - result.loadBalancingPolicy = obj.loadBalancingPolicy; - } else { - throw new Error("Invalid service config: invalid loadBalancingPolicy"); - } - } - if ("loadBalancingConfig" in obj) { - if (Array.isArray(obj.loadBalancingConfig)) { - for (const config2 of obj.loadBalancingConfig) { - result.loadBalancingConfig.push((0, load_balancer_1.validateLoadBalancingConfig)(config2)); - } - } else { - throw new Error("Invalid service config: invalid loadBalancingConfig"); - } - } - if ("methodConfig" in obj) { - if (Array.isArray(obj.methodConfig)) { - for (const methodConfig of obj.methodConfig) { - result.methodConfig.push(validateMethodConfig(methodConfig)); - } - } - } - if ("retryThrottling" in obj) { - result.retryThrottling = validateRetryThrottling(obj.retryThrottling); - } - const seenMethodNames = []; - for (const methodConfig of result.methodConfig) { - for (const name of methodConfig.name) { - for (const seenName of seenMethodNames) { - if (name.service === seenName.service && name.method === seenName.method) { - throw new Error(`Invalid service config: duplicate name ${name.service}/${name.method}`); - } - } - seenMethodNames.push(name); - } - } - return result; - } - exports2.validateServiceConfig = validateServiceConfig; - function validateCanaryConfig(obj) { - if (!("serviceConfig" in obj)) { - throw new Error("Invalid service config choice: missing service config"); - } - const result = { - serviceConfig: validateServiceConfig(obj.serviceConfig) - }; - if ("clientLanguage" in obj) { - if (Array.isArray(obj.clientLanguage)) { - result.clientLanguage = []; - for (const lang of obj.clientLanguage) { - if (typeof lang === "string") { - result.clientLanguage.push(lang); - } else { - throw new Error("Invalid service config choice: invalid clientLanguage"); - } - } - } else { - throw new Error("Invalid service config choice: invalid clientLanguage"); - } - } - if ("clientHostname" in obj) { - if (Array.isArray(obj.clientHostname)) { - result.clientHostname = []; - for (const lang of obj.clientHostname) { - if (typeof lang === "string") { - result.clientHostname.push(lang); - } else { - throw new Error("Invalid service config choice: invalid clientHostname"); - } - } - } else { - throw new Error("Invalid service config choice: invalid clientHostname"); - } - } - if ("percentage" in obj) { - if (typeof obj.percentage === "number" && 0 <= obj.percentage && obj.percentage <= 100) { - result.percentage = obj.percentage; - } else { - throw new Error("Invalid service config choice: invalid percentage"); - } - } - const allowedFields = [ - "clientLanguage", - "percentage", - "clientHostname", - "serviceConfig" - ]; - for (const field in obj) { - if (!allowedFields.includes(field)) { - throw new Error(`Invalid service config choice: unexpected field ${field}`); - } - } - return result; - } - function validateAndSelectCanaryConfig(obj, percentage) { - if (!Array.isArray(obj)) { - throw new Error("Invalid service config list"); - } - for (const config2 of obj) { - const validatedConfig = validateCanaryConfig(config2); - if (typeof validatedConfig.percentage === "number" && percentage > validatedConfig.percentage) { - continue; - } - if (Array.isArray(validatedConfig.clientHostname)) { - let hostnameMatched = false; - for (const hostname of validatedConfig.clientHostname) { - if (hostname === os2.hostname()) { - hostnameMatched = true; - } - } - if (!hostnameMatched) { - continue; - } - } - if (Array.isArray(validatedConfig.clientLanguage)) { - let languageMatched = false; - for (const language of validatedConfig.clientLanguage) { - if (language === CLIENT_LANGUAGE_STRING) { - languageMatched = true; - } - } - if (!languageMatched) { - continue; - } - } - return validatedConfig.serviceConfig; - } - throw new Error("No matching service config found"); - } - function extractAndSelectServiceConfig(txtRecord, percentage) { - for (const record of txtRecord) { - if (record.length > 0 && record[0].startsWith("grpc_config=")) { - const recordString = record.join("").substring("grpc_config=".length); - const recordJson = JSON.parse(recordString); - return validateAndSelectCanaryConfig(recordJson, percentage); - } - } - return null; - } - exports2.extractAndSelectServiceConfig = extractAndSelectServiceConfig; - } -}); - -// node_modules/@grpc/grpc-js/build/src/connectivity-state.js -var require_connectivity_state = __commonJS({ - "node_modules/@grpc/grpc-js/build/src/connectivity-state.js"(exports2) { - "use strict"; - Object.defineProperty(exports2, "__esModule", { value: true }); - exports2.ConnectivityState = void 0; - var ConnectivityState; - (function(ConnectivityState2) { - ConnectivityState2[ConnectivityState2["IDLE"] = 0] = "IDLE"; - ConnectivityState2[ConnectivityState2["CONNECTING"] = 1] = "CONNECTING"; - ConnectivityState2[ConnectivityState2["READY"] = 2] = "READY"; - ConnectivityState2[ConnectivityState2["TRANSIENT_FAILURE"] = 3] = "TRANSIENT_FAILURE"; - ConnectivityState2[ConnectivityState2["SHUTDOWN"] = 4] = "SHUTDOWN"; - })(ConnectivityState || (exports2.ConnectivityState = ConnectivityState = {})); - } -}); - -// node_modules/@grpc/grpc-js/build/src/uri-parser.js -var require_uri_parser = __commonJS({ - "node_modules/@grpc/grpc-js/build/src/uri-parser.js"(exports2) { - "use strict"; - Object.defineProperty(exports2, "__esModule", { value: true }); - exports2.uriToString = exports2.splitHostPort = exports2.parseUri = void 0; - var URI_REGEX = /^(?:([A-Za-z0-9+.-]+):)?(?:\/\/([^/]*)\/)?(.+)$/; - function parseUri(uriString) { - const parsedUri = URI_REGEX.exec(uriString); - if (parsedUri === null) { - return null; - } - return { - scheme: parsedUri[1], - authority: parsedUri[2], - path: parsedUri[3] - }; - } - exports2.parseUri = parseUri; - var NUMBER_REGEX = /^\d+$/; - function splitHostPort(path) { - if (path.startsWith("[")) { - const hostEnd = path.indexOf("]"); - if (hostEnd === -1) { - return null; - } - const host = path.substring(1, hostEnd); - if (host.indexOf(":") === -1) { - return null; - } - if (path.length > hostEnd + 1) { - if (path[hostEnd + 1] === ":") { - const portString = path.substring(hostEnd + 2); - if (NUMBER_REGEX.test(portString)) { - return { - host, - port: +portString - }; - } else { - return null; - } - } else { - return null; - } - } else { - return { - host - }; - } - } else { - const splitPath = path.split(":"); - if (splitPath.length === 2) { - if (NUMBER_REGEX.test(splitPath[1])) { - return { - host: splitPath[0], - port: +splitPath[1] - }; - } else { - return null; - } - } else { - return { - host: path - }; - } - } - } - exports2.splitHostPort = splitHostPort; - function uriToString(uri) { - let result = ""; - if (uri.scheme !== void 0) { - result += uri.scheme + ":"; - } - if (uri.authority !== void 0) { - result += "//" + uri.authority + "/"; - } - result += uri.path; - return result; - } - exports2.uriToString = uriToString; - } -}); - -// node_modules/@grpc/grpc-js/build/src/resolver.js -var require_resolver = __commonJS({ - "node_modules/@grpc/grpc-js/build/src/resolver.js"(exports2) { - "use strict"; - Object.defineProperty(exports2, "__esModule", { value: true }); - exports2.mapUriDefaultScheme = exports2.getDefaultAuthority = exports2.createResolver = exports2.registerDefaultScheme = exports2.registerResolver = void 0; - var uri_parser_1 = require_uri_parser(); - var registeredResolvers = {}; - var defaultScheme = null; - function registerResolver(scheme, resolverClass) { - registeredResolvers[scheme] = resolverClass; - } - exports2.registerResolver = registerResolver; - function registerDefaultScheme(scheme) { - defaultScheme = scheme; - } - exports2.registerDefaultScheme = registerDefaultScheme; - function createResolver(target, listener, options2) { - if (target.scheme !== void 0 && target.scheme in registeredResolvers) { - return new registeredResolvers[target.scheme](target, listener, options2); - } else { - throw new Error(`No resolver could be created for target ${(0, uri_parser_1.uriToString)(target)}`); - } - } - exports2.createResolver = createResolver; - function getDefaultAuthority(target) { - if (target.scheme !== void 0 && target.scheme in registeredResolvers) { - return registeredResolvers[target.scheme].getDefaultAuthority(target); - } else { - throw new Error(`Invalid target ${(0, uri_parser_1.uriToString)(target)}`); - } - } - exports2.getDefaultAuthority = getDefaultAuthority; - function mapUriDefaultScheme(target) { - if (target.scheme === void 0 || !(target.scheme in registeredResolvers)) { - if (defaultScheme !== null) { - return { - scheme: defaultScheme, - authority: void 0, - path: (0, uri_parser_1.uriToString)(target) - }; - } else { - return null; - } - } - return target; - } - exports2.mapUriDefaultScheme = mapUriDefaultScheme; - } -}); - -// node_modules/@grpc/grpc-js/build/src/picker.js -var require_picker = __commonJS({ - "node_modules/@grpc/grpc-js/build/src/picker.js"(exports2) { - "use strict"; - Object.defineProperty(exports2, "__esModule", { value: true }); - exports2.QueuePicker = exports2.UnavailablePicker = exports2.PickResultType = void 0; - var metadata_1 = require_metadata(); - var constants_1 = require_constants(); - var PickResultType; - (function(PickResultType2) { - PickResultType2[PickResultType2["COMPLETE"] = 0] = "COMPLETE"; - PickResultType2[PickResultType2["QUEUE"] = 1] = "QUEUE"; - PickResultType2[PickResultType2["TRANSIENT_FAILURE"] = 2] = "TRANSIENT_FAILURE"; - PickResultType2[PickResultType2["DROP"] = 3] = "DROP"; - })(PickResultType || (exports2.PickResultType = PickResultType = {})); - var UnavailablePicker = class { - constructor(status2) { - if (status2 !== void 0) { - this.status = status2; - } else { - this.status = { - code: constants_1.Status.UNAVAILABLE, - details: "No connection established", - metadata: new metadata_1.Metadata() - }; - } - } - pick(pickArgs) { - return { - pickResultType: PickResultType.TRANSIENT_FAILURE, - subchannel: null, - status: this.status, - onCallStarted: null, - onCallEnded: null - }; - } - }; - exports2.UnavailablePicker = UnavailablePicker; - var QueuePicker = class { - // Constructed with a load balancer. Calls exitIdle on it the first time pick is called - constructor(loadBalancer) { - this.loadBalancer = loadBalancer; - this.calledExitIdle = false; - } - pick(pickArgs) { - if (!this.calledExitIdle) { - process.nextTick(() => { - this.loadBalancer.exitIdle(); - }); - this.calledExitIdle = true; - } - return { - pickResultType: PickResultType.QUEUE, - subchannel: null, - status: null, - onCallStarted: null, - onCallEnded: null - }; - } - }; - exports2.QueuePicker = QueuePicker; - } -}); - -// node_modules/@grpc/grpc-js/build/src/backoff-timeout.js -var require_backoff_timeout = __commonJS({ - "node_modules/@grpc/grpc-js/build/src/backoff-timeout.js"(exports2) { - "use strict"; - Object.defineProperty(exports2, "__esModule", { value: true }); - exports2.BackoffTimeout = void 0; - var INITIAL_BACKOFF_MS = 1e3; - var BACKOFF_MULTIPLIER = 1.6; - var MAX_BACKOFF_MS = 12e4; - var BACKOFF_JITTER = 0.2; - function uniformRandom(min, max) { - return Math.random() * (max - min) + min; - } - var BackoffTimeout = class { - constructor(callback, options2) { - this.callback = callback; - this.initialDelay = INITIAL_BACKOFF_MS; - this.multiplier = BACKOFF_MULTIPLIER; - this.maxDelay = MAX_BACKOFF_MS; - this.jitter = BACKOFF_JITTER; - this.running = false; - this.hasRef = true; - this.startTime = /* @__PURE__ */ new Date(); - if (options2) { - if (options2.initialDelay) { - this.initialDelay = options2.initialDelay; - } - if (options2.multiplier) { - this.multiplier = options2.multiplier; - } - if (options2.jitter) { - this.jitter = options2.jitter; - } - if (options2.maxDelay) { - this.maxDelay = options2.maxDelay; - } - } - this.nextDelay = this.initialDelay; - this.timerId = setTimeout(() => { - }, 0); - clearTimeout(this.timerId); - } - runTimer(delay) { - var _a2, _b; - clearTimeout(this.timerId); - this.timerId = setTimeout(() => { - this.callback(); - this.running = false; - }, delay); - if (!this.hasRef) { - (_b = (_a2 = this.timerId).unref) === null || _b === void 0 ? void 0 : _b.call(_a2); - } - } - /** - * Call the callback after the current amount of delay time - */ - runOnce() { - this.running = true; - this.startTime = /* @__PURE__ */ new Date(); - this.runTimer(this.nextDelay); - const nextBackoff = Math.min(this.nextDelay * this.multiplier, this.maxDelay); - const jitterMagnitude = nextBackoff * this.jitter; - this.nextDelay = nextBackoff + uniformRandom(-jitterMagnitude, jitterMagnitude); - } - /** - * Stop the timer. The callback will not be called until `runOnce` is called - * again. - */ - stop() { - clearTimeout(this.timerId); - this.running = false; - } - /** - * Reset the delay time to its initial value. If the timer is still running, - * retroactively apply that reset to the current timer. - */ - reset() { - this.nextDelay = this.initialDelay; - if (this.running) { - const now = /* @__PURE__ */ new Date(); - const newEndTime = this.startTime; - newEndTime.setMilliseconds(newEndTime.getMilliseconds() + this.nextDelay); - clearTimeout(this.timerId); - if (now < newEndTime) { - this.runTimer(newEndTime.getTime() - now.getTime()); - } else { - this.running = false; - } - } - } - /** - * Check whether the timer is currently running. - */ - isRunning() { - return this.running; - } - /** - * Set that while the timer is running, it should keep the Node process - * running. - */ - ref() { - var _a2, _b; - this.hasRef = true; - (_b = (_a2 = this.timerId).ref) === null || _b === void 0 ? void 0 : _b.call(_a2); - } - /** - * Set that while the timer is running, it should not keep the Node process - * running. - */ - unref() { - var _a2, _b; - this.hasRef = false; - (_b = (_a2 = this.timerId).unref) === null || _b === void 0 ? void 0 : _b.call(_a2); - } - }; - exports2.BackoffTimeout = BackoffTimeout; - } -}); - -// node_modules/@grpc/grpc-js/build/src/load-balancer-child-handler.js -var require_load_balancer_child_handler = __commonJS({ - "node_modules/@grpc/grpc-js/build/src/load-balancer-child-handler.js"(exports2) { - "use strict"; - Object.defineProperty(exports2, "__esModule", { value: true }); - exports2.ChildLoadBalancerHandler = void 0; - var load_balancer_1 = require_load_balancer(); - var connectivity_state_1 = require_connectivity_state(); - var TYPE_NAME = "child_load_balancer_helper"; - var ChildLoadBalancerHandler = class { - constructor(channelControlHelper) { - this.channelControlHelper = channelControlHelper; - this.currentChild = null; - this.pendingChild = null; - this.latestConfig = null; - this.ChildPolicyHelper = class { - constructor(parent) { - this.parent = parent; - this.child = null; - } - createSubchannel(subchannelAddress, subchannelArgs) { - return this.parent.channelControlHelper.createSubchannel(subchannelAddress, subchannelArgs); - } - updateState(connectivityState, picker) { - var _a2; - if (this.calledByPendingChild()) { - if (connectivityState === connectivity_state_1.ConnectivityState.CONNECTING) { - return; - } - (_a2 = this.parent.currentChild) === null || _a2 === void 0 ? void 0 : _a2.destroy(); - this.parent.currentChild = this.parent.pendingChild; - this.parent.pendingChild = null; - } else if (!this.calledByCurrentChild()) { - return; - } - this.parent.channelControlHelper.updateState(connectivityState, picker); - } - requestReresolution() { - var _a2; - const latestChild = (_a2 = this.parent.pendingChild) !== null && _a2 !== void 0 ? _a2 : this.parent.currentChild; - if (this.child === latestChild) { - this.parent.channelControlHelper.requestReresolution(); - } - } - setChild(newChild) { - this.child = newChild; - } - addChannelzChild(child) { - this.parent.channelControlHelper.addChannelzChild(child); - } - removeChannelzChild(child) { - this.parent.channelControlHelper.removeChannelzChild(child); - } - calledByPendingChild() { - return this.child === this.parent.pendingChild; - } - calledByCurrentChild() { - return this.child === this.parent.currentChild; - } - }; - } - configUpdateRequiresNewPolicyInstance(oldConfig, newConfig) { - return oldConfig.getLoadBalancerName() !== newConfig.getLoadBalancerName(); - } - /** - * Prerequisites: lbConfig !== null and lbConfig.name is registered - * @param addressList - * @param lbConfig - * @param attributes - */ - updateAddressList(addressList, lbConfig, attributes) { - let childToUpdate; - if (this.currentChild === null || this.latestConfig === null || this.configUpdateRequiresNewPolicyInstance(this.latestConfig, lbConfig)) { - const newHelper = new this.ChildPolicyHelper(this); - const newChild = (0, load_balancer_1.createLoadBalancer)(lbConfig, newHelper); - newHelper.setChild(newChild); - if (this.currentChild === null) { - this.currentChild = newChild; - childToUpdate = this.currentChild; - } else { - if (this.pendingChild) { - this.pendingChild.destroy(); - } - this.pendingChild = newChild; - childToUpdate = this.pendingChild; - } - } else { - if (this.pendingChild === null) { - childToUpdate = this.currentChild; - } else { - childToUpdate = this.pendingChild; - } - } - this.latestConfig = lbConfig; - childToUpdate.updateAddressList(addressList, lbConfig, attributes); - } - exitIdle() { - if (this.currentChild) { - this.currentChild.exitIdle(); - if (this.pendingChild) { - this.pendingChild.exitIdle(); - } - } - } - resetBackoff() { - if (this.currentChild) { - this.currentChild.resetBackoff(); - if (this.pendingChild) { - this.pendingChild.resetBackoff(); - } - } - } - destroy() { - if (this.currentChild) { - this.currentChild.destroy(); - this.currentChild = null; - } - if (this.pendingChild) { - this.pendingChild.destroy(); - this.pendingChild = null; - } - } - getTypeName() { - return TYPE_NAME; - } - }; - exports2.ChildLoadBalancerHandler = ChildLoadBalancerHandler; - } -}); - -// node_modules/@grpc/grpc-js/build/src/resolving-load-balancer.js -var require_resolving_load_balancer = __commonJS({ - "node_modules/@grpc/grpc-js/build/src/resolving-load-balancer.js"(exports2) { - "use strict"; - Object.defineProperty(exports2, "__esModule", { value: true }); - exports2.ResolvingLoadBalancer = void 0; - var load_balancer_1 = require_load_balancer(); - var service_config_1 = require_service_config(); - var connectivity_state_1 = require_connectivity_state(); - var resolver_1 = require_resolver(); - var picker_1 = require_picker(); - var backoff_timeout_1 = require_backoff_timeout(); - var constants_1 = require_constants(); - var metadata_1 = require_metadata(); - var logging = require_logging(); - var constants_2 = require_constants(); - var uri_parser_1 = require_uri_parser(); - var load_balancer_child_handler_1 = require_load_balancer_child_handler(); - var TRACER_NAME = "resolving_load_balancer"; - function trace(text) { - logging.trace(constants_2.LogVerbosity.DEBUG, TRACER_NAME, text); - } - function getDefaultConfigSelector(serviceConfig) { - return function defaultConfigSelector(methodName, metadata) { - var _a2, _b; - const splitName = methodName.split("/").filter((x) => x.length > 0); - const service = (_a2 = splitName[0]) !== null && _a2 !== void 0 ? _a2 : ""; - const method = (_b = splitName[1]) !== null && _b !== void 0 ? _b : ""; - if (serviceConfig && serviceConfig.methodConfig) { - for (const methodConfig of serviceConfig.methodConfig) { - for (const name of methodConfig.name) { - if (name.service === service && (name.method === void 0 || name.method === method)) { - return { - methodConfig, - pickInformation: {}, - status: constants_1.Status.OK, - dynamicFilterFactories: [] - }; - } - } - } - } - return { - methodConfig: { name: [] }, - pickInformation: {}, - status: constants_1.Status.OK, - dynamicFilterFactories: [] - }; - }; - } - var ResolvingLoadBalancer = class { - /** - * Wrapper class that behaves like a `LoadBalancer` and also handles name - * resolution internally. - * @param target The address of the backend to connect to. - * @param channelControlHelper `ChannelControlHelper` instance provided by - * this load balancer's owner. - * @param defaultServiceConfig The default service configuration to be used - * if none is provided by the name resolver. A `null` value indicates - * that the default behavior should be the default unconfigured behavior. - * In practice, that means using the "pick first" load balancer - * implmentation - */ - constructor(target, channelControlHelper, channelOptions, onSuccessfulResolution, onFailedResolution) { - this.target = target; - this.channelControlHelper = channelControlHelper; - this.onSuccessfulResolution = onSuccessfulResolution; - this.onFailedResolution = onFailedResolution; - this.latestChildState = connectivity_state_1.ConnectivityState.IDLE; - this.latestChildPicker = new picker_1.QueuePicker(this); - this.currentState = connectivity_state_1.ConnectivityState.IDLE; - this.previousServiceConfig = null; - this.continueResolving = false; - if (channelOptions["grpc.service_config"]) { - this.defaultServiceConfig = (0, service_config_1.validateServiceConfig)(JSON.parse(channelOptions["grpc.service_config"])); - } else { - this.defaultServiceConfig = { - loadBalancingConfig: [], - methodConfig: [] - }; - } - this.updateState(connectivity_state_1.ConnectivityState.IDLE, new picker_1.QueuePicker(this)); - this.childLoadBalancer = new load_balancer_child_handler_1.ChildLoadBalancerHandler({ - createSubchannel: channelControlHelper.createSubchannel.bind(channelControlHelper), - requestReresolution: () => { - if (this.backoffTimeout.isRunning()) { - this.continueResolving = true; - } else { - this.updateResolution(); - } - }, - updateState: (newState, picker) => { - this.latestChildState = newState; - this.latestChildPicker = picker; - this.updateState(newState, picker); - }, - addChannelzChild: channelControlHelper.addChannelzChild.bind(channelControlHelper), - removeChannelzChild: channelControlHelper.removeChannelzChild.bind(channelControlHelper) - }); - this.innerResolver = (0, resolver_1.createResolver)(target, { - onSuccessfulResolution: (addressList, serviceConfig, serviceConfigError, configSelector, attributes) => { - var _a2; - let workingServiceConfig = null; - if (serviceConfig === null) { - if (serviceConfigError === null) { - this.previousServiceConfig = null; - workingServiceConfig = this.defaultServiceConfig; - } else { - if (this.previousServiceConfig === null) { - this.handleResolutionFailure(serviceConfigError); - } else { - workingServiceConfig = this.previousServiceConfig; - } - } - } else { - workingServiceConfig = serviceConfig; - this.previousServiceConfig = serviceConfig; - } - const workingConfigList = (_a2 = workingServiceConfig === null || workingServiceConfig === void 0 ? void 0 : workingServiceConfig.loadBalancingConfig) !== null && _a2 !== void 0 ? _a2 : []; - const loadBalancingConfig = (0, load_balancer_1.getFirstUsableConfig)(workingConfigList, true); - if (loadBalancingConfig === null) { - this.handleResolutionFailure({ - code: constants_1.Status.UNAVAILABLE, - details: "All load balancer options in service config are not compatible", - metadata: new metadata_1.Metadata() - }); - return; - } - this.childLoadBalancer.updateAddressList(addressList, loadBalancingConfig, attributes); - const finalServiceConfig = workingServiceConfig !== null && workingServiceConfig !== void 0 ? workingServiceConfig : this.defaultServiceConfig; - this.onSuccessfulResolution(finalServiceConfig, configSelector !== null && configSelector !== void 0 ? configSelector : getDefaultConfigSelector(finalServiceConfig)); - }, - onError: (error2) => { - this.handleResolutionFailure(error2); - } - }, channelOptions); - const backoffOptions = { - initialDelay: channelOptions["grpc.initial_reconnect_backoff_ms"], - maxDelay: channelOptions["grpc.max_reconnect_backoff_ms"] - }; - this.backoffTimeout = new backoff_timeout_1.BackoffTimeout(() => { - if (this.continueResolving) { - this.updateResolution(); - this.continueResolving = false; - } else { - this.updateState(this.latestChildState, this.latestChildPicker); - } - }, backoffOptions); - this.backoffTimeout.unref(); - } - updateResolution() { - this.innerResolver.updateResolution(); - if (this.currentState === connectivity_state_1.ConnectivityState.IDLE) { - this.updateState(connectivity_state_1.ConnectivityState.CONNECTING, new picker_1.QueuePicker(this)); - } - this.backoffTimeout.runOnce(); - } - updateState(connectivityState, picker) { - trace((0, uri_parser_1.uriToString)(this.target) + " " + connectivity_state_1.ConnectivityState[this.currentState] + " -> " + connectivity_state_1.ConnectivityState[connectivityState]); - if (connectivityState === connectivity_state_1.ConnectivityState.IDLE) { - picker = new picker_1.QueuePicker(this); - } - this.currentState = connectivityState; - this.channelControlHelper.updateState(connectivityState, picker); - } - handleResolutionFailure(error2) { - if (this.latestChildState === connectivity_state_1.ConnectivityState.IDLE) { - this.updateState(connectivity_state_1.ConnectivityState.TRANSIENT_FAILURE, new picker_1.UnavailablePicker(error2)); - this.onFailedResolution(error2); - } - } - exitIdle() { - if (this.currentState === connectivity_state_1.ConnectivityState.IDLE || this.currentState === connectivity_state_1.ConnectivityState.TRANSIENT_FAILURE) { - if (this.backoffTimeout.isRunning()) { - this.continueResolving = true; - } else { - this.updateResolution(); - } - } - this.childLoadBalancer.exitIdle(); - } - updateAddressList(addressList, lbConfig) { - throw new Error("updateAddressList not supported on ResolvingLoadBalancer"); - } - resetBackoff() { - this.backoffTimeout.reset(); - this.childLoadBalancer.resetBackoff(); - } - destroy() { - this.childLoadBalancer.destroy(); - this.innerResolver.destroy(); - this.backoffTimeout.reset(); - this.backoffTimeout.stop(); - this.latestChildState = connectivity_state_1.ConnectivityState.IDLE; - this.latestChildPicker = new picker_1.QueuePicker(this); - this.currentState = connectivity_state_1.ConnectivityState.IDLE; - this.previousServiceConfig = null; - this.continueResolving = false; - } - getTypeName() { - return "resolving_load_balancer"; - } - }; - exports2.ResolvingLoadBalancer = ResolvingLoadBalancer; - } -}); - -// node_modules/@grpc/grpc-js/build/src/channel-options.js -var require_channel_options = __commonJS({ - "node_modules/@grpc/grpc-js/build/src/channel-options.js"(exports2) { - "use strict"; - Object.defineProperty(exports2, "__esModule", { value: true }); - exports2.channelOptionsEqual = exports2.recognizedOptions = void 0; - exports2.recognizedOptions = { - "grpc.ssl_target_name_override": true, - "grpc.primary_user_agent": true, - "grpc.secondary_user_agent": true, - "grpc.default_authority": true, - "grpc.keepalive_time_ms": true, - "grpc.keepalive_timeout_ms": true, - "grpc.keepalive_permit_without_calls": true, - "grpc.service_config": true, - "grpc.max_concurrent_streams": true, - "grpc.initial_reconnect_backoff_ms": true, - "grpc.max_reconnect_backoff_ms": true, - "grpc.use_local_subchannel_pool": true, - "grpc.max_send_message_length": true, - "grpc.max_receive_message_length": true, - "grpc.enable_http_proxy": true, - "grpc.enable_channelz": true, - "grpc.dns_min_time_between_resolutions_ms": true, - "grpc.enable_retries": true, - "grpc.per_rpc_retry_buffer_size": true, - "grpc.retry_buffer_size": true, - "grpc.max_connection_age_ms": true, - "grpc.max_connection_age_grace_ms": true, - "grpc-node.max_session_memory": true, - "grpc.service_config_disable_resolution": true, - "grpc.client_idle_timeout_ms": true, - "grpc-node.tls_enable_trace": true - }; - function channelOptionsEqual(options1, options2) { - const keys1 = Object.keys(options1).sort(); - const keys2 = Object.keys(options2).sort(); - if (keys1.length !== keys2.length) { - return false; - } - for (let i = 0; i < keys1.length; i += 1) { - if (keys1[i] !== keys2[i]) { - return false; - } - if (options1[keys1[i]] !== options2[keys2[i]]) { - return false; - } - } - return true; - } - exports2.channelOptionsEqual = channelOptionsEqual; - } -}); - -// node_modules/@grpc/grpc-js/build/src/subchannel-address.js -var require_subchannel_address = __commonJS({ - "node_modules/@grpc/grpc-js/build/src/subchannel-address.js"(exports2) { - "use strict"; - Object.defineProperty(exports2, "__esModule", { value: true }); - exports2.stringToSubchannelAddress = exports2.subchannelAddressToString = exports2.subchannelAddressEqual = exports2.isTcpSubchannelAddress = void 0; - var net_1 = require("net"); - function isTcpSubchannelAddress(address) { - return "port" in address; - } - exports2.isTcpSubchannelAddress = isTcpSubchannelAddress; - function subchannelAddressEqual(address1, address2) { - if (!address1 && !address2) { - return true; - } - if (!address1 || !address2) { - return false; - } - if (isTcpSubchannelAddress(address1)) { - return isTcpSubchannelAddress(address2) && address1.host === address2.host && address1.port === address2.port; - } else { - return !isTcpSubchannelAddress(address2) && address1.path === address2.path; - } - } - exports2.subchannelAddressEqual = subchannelAddressEqual; - function subchannelAddressToString(address) { - if (isTcpSubchannelAddress(address)) { - return address.host + ":" + address.port; - } else { - return address.path; - } - } - exports2.subchannelAddressToString = subchannelAddressToString; - var DEFAULT_PORT = 443; - function stringToSubchannelAddress(addressString, port) { - if ((0, net_1.isIP)(addressString)) { - return { - host: addressString, - port: port !== null && port !== void 0 ? port : DEFAULT_PORT - }; - } else { - return { - path: addressString - }; - } - } - exports2.stringToSubchannelAddress = stringToSubchannelAddress; - } -}); - -// node_modules/@grpc/grpc-js/build/src/admin.js -var require_admin = __commonJS({ - "node_modules/@grpc/grpc-js/build/src/admin.js"(exports2) { - "use strict"; - Object.defineProperty(exports2, "__esModule", { value: true }); - exports2.addAdminServicesToServer = exports2.registerAdminService = void 0; - var registeredAdminServices = []; - function registerAdminService(getServiceDefinition, getHandlers) { - registeredAdminServices.push({ getServiceDefinition, getHandlers }); - } - exports2.registerAdminService = registerAdminService; - function addAdminServicesToServer(server2) { - for (const { getServiceDefinition, getHandlers } of registeredAdminServices) { - server2.addService(getServiceDefinition(), getHandlers()); - } - } - exports2.addAdminServicesToServer = addAdminServicesToServer; - } -}); - -// node_modules/@grpc/grpc-js/build/src/call.js -var require_call = __commonJS({ - "node_modules/@grpc/grpc-js/build/src/call.js"(exports2) { - "use strict"; - Object.defineProperty(exports2, "__esModule", { value: true }); - exports2.ClientDuplexStreamImpl = exports2.ClientWritableStreamImpl = exports2.ClientReadableStreamImpl = exports2.ClientUnaryCallImpl = exports2.callErrorFromStatus = void 0; - var events_1 = require("events"); - var stream_1 = require("stream"); - var constants_1 = require_constants(); - function callErrorFromStatus(status2, callerStack) { - const message = `${status2.code} ${constants_1.Status[status2.code]}: ${status2.details}`; - const error2 = new Error(message); - const stack = `${error2.stack} -for call at -${callerStack}`; - return Object.assign(new Error(message), status2, { stack }); - } - exports2.callErrorFromStatus = callErrorFromStatus; - var ClientUnaryCallImpl = class extends events_1.EventEmitter { - constructor() { - super(); - } - cancel() { - var _a2; - (_a2 = this.call) === null || _a2 === void 0 ? void 0 : _a2.cancelWithStatus(constants_1.Status.CANCELLED, "Cancelled on client"); - } - getPeer() { - var _a2, _b; - return (_b = (_a2 = this.call) === null || _a2 === void 0 ? void 0 : _a2.getPeer()) !== null && _b !== void 0 ? _b : "unknown"; - } - }; - exports2.ClientUnaryCallImpl = ClientUnaryCallImpl; - var ClientReadableStreamImpl = class extends stream_1.Readable { - constructor(deserialize) { - super({ objectMode: true }); - this.deserialize = deserialize; - } - cancel() { - var _a2; - (_a2 = this.call) === null || _a2 === void 0 ? void 0 : _a2.cancelWithStatus(constants_1.Status.CANCELLED, "Cancelled on client"); - } - getPeer() { - var _a2, _b; - return (_b = (_a2 = this.call) === null || _a2 === void 0 ? void 0 : _a2.getPeer()) !== null && _b !== void 0 ? _b : "unknown"; - } - _read(_size) { - var _a2; - (_a2 = this.call) === null || _a2 === void 0 ? void 0 : _a2.startRead(); - } - }; - exports2.ClientReadableStreamImpl = ClientReadableStreamImpl; - var ClientWritableStreamImpl = class extends stream_1.Writable { - constructor(serialize) { - super({ objectMode: true }); - this.serialize = serialize; - } - cancel() { - var _a2; - (_a2 = this.call) === null || _a2 === void 0 ? void 0 : _a2.cancelWithStatus(constants_1.Status.CANCELLED, "Cancelled on client"); - } - getPeer() { - var _a2, _b; - return (_b = (_a2 = this.call) === null || _a2 === void 0 ? void 0 : _a2.getPeer()) !== null && _b !== void 0 ? _b : "unknown"; - } - _write(chunk, encoding, cb) { - var _a2; - const context = { - callback: cb - }; - const flags = Number(encoding); - if (!Number.isNaN(flags)) { - context.flags = flags; - } - (_a2 = this.call) === null || _a2 === void 0 ? void 0 : _a2.sendMessageWithContext(context, chunk); - } - _final(cb) { - var _a2; - (_a2 = this.call) === null || _a2 === void 0 ? void 0 : _a2.halfClose(); - cb(); - } - }; - exports2.ClientWritableStreamImpl = ClientWritableStreamImpl; - var ClientDuplexStreamImpl = class extends stream_1.Duplex { - constructor(serialize, deserialize) { - super({ objectMode: true }); - this.serialize = serialize; - this.deserialize = deserialize; - } - cancel() { - var _a2; - (_a2 = this.call) === null || _a2 === void 0 ? void 0 : _a2.cancelWithStatus(constants_1.Status.CANCELLED, "Cancelled on client"); - } - getPeer() { - var _a2, _b; - return (_b = (_a2 = this.call) === null || _a2 === void 0 ? void 0 : _a2.getPeer()) !== null && _b !== void 0 ? _b : "unknown"; - } - _read(_size) { - var _a2; - (_a2 = this.call) === null || _a2 === void 0 ? void 0 : _a2.startRead(); - } - _write(chunk, encoding, cb) { - var _a2; - const context = { - callback: cb - }; - const flags = Number(encoding); - if (!Number.isNaN(flags)) { - context.flags = flags; - } - (_a2 = this.call) === null || _a2 === void 0 ? void 0 : _a2.sendMessageWithContext(context, chunk); - } - _final(cb) { - var _a2; - (_a2 = this.call) === null || _a2 === void 0 ? void 0 : _a2.halfClose(); - cb(); - } - }; - exports2.ClientDuplexStreamImpl = ClientDuplexStreamImpl; - } -}); - -// node_modules/@grpc/grpc-js/build/src/call-interface.js -var require_call_interface = __commonJS({ - "node_modules/@grpc/grpc-js/build/src/call-interface.js"(exports2) { - "use strict"; - Object.defineProperty(exports2, "__esModule", { value: true }); - exports2.InterceptingListenerImpl = exports2.isInterceptingListener = void 0; - function isInterceptingListener(listener) { - return listener.onReceiveMetadata !== void 0 && listener.onReceiveMetadata.length === 1; - } - exports2.isInterceptingListener = isInterceptingListener; - var InterceptingListenerImpl = class { - constructor(listener, nextListener) { - this.listener = listener; - this.nextListener = nextListener; - this.processingMetadata = false; - this.hasPendingMessage = false; - this.processingMessage = false; - this.pendingStatus = null; - } - processPendingMessage() { - if (this.hasPendingMessage) { - this.nextListener.onReceiveMessage(this.pendingMessage); - this.pendingMessage = null; - this.hasPendingMessage = false; - } - } - processPendingStatus() { - if (this.pendingStatus) { - this.nextListener.onReceiveStatus(this.pendingStatus); - } - } - onReceiveMetadata(metadata) { - this.processingMetadata = true; - this.listener.onReceiveMetadata(metadata, (metadata2) => { - this.processingMetadata = false; - this.nextListener.onReceiveMetadata(metadata2); - this.processPendingMessage(); - this.processPendingStatus(); - }); - } - // eslint-disable-next-line @typescript-eslint/no-explicit-any - onReceiveMessage(message) { - this.processingMessage = true; - this.listener.onReceiveMessage(message, (msg2) => { - this.processingMessage = false; - if (this.processingMetadata) { - this.pendingMessage = msg2; - this.hasPendingMessage = true; - } else { - this.nextListener.onReceiveMessage(msg2); - this.processPendingStatus(); - } - }); - } - onReceiveStatus(status2) { - this.listener.onReceiveStatus(status2, (processedStatus) => { - if (this.processingMetadata || this.processingMessage) { - this.pendingStatus = processedStatus; - } else { - this.nextListener.onReceiveStatus(processedStatus); - } - }); - } - }; - exports2.InterceptingListenerImpl = InterceptingListenerImpl; - } -}); - -// node_modules/@grpc/grpc-js/build/src/client-interceptors.js -var require_client_interceptors = __commonJS({ - "node_modules/@grpc/grpc-js/build/src/client-interceptors.js"(exports2) { - "use strict"; - Object.defineProperty(exports2, "__esModule", { value: true }); - exports2.getInterceptingCall = exports2.InterceptingCall = exports2.RequesterBuilder = exports2.ListenerBuilder = exports2.InterceptorConfigurationError = void 0; - var metadata_1 = require_metadata(); - var call_interface_1 = require_call_interface(); - var constants_1 = require_constants(); - var error_1 = require_error(); - var InterceptorConfigurationError = class _InterceptorConfigurationError extends Error { - constructor(message) { - super(message); - this.name = "InterceptorConfigurationError"; - Error.captureStackTrace(this, _InterceptorConfigurationError); - } - }; - exports2.InterceptorConfigurationError = InterceptorConfigurationError; - var ListenerBuilder = class { - constructor() { - this.metadata = void 0; - this.message = void 0; - this.status = void 0; - } - withOnReceiveMetadata(onReceiveMetadata) { - this.metadata = onReceiveMetadata; - return this; - } - withOnReceiveMessage(onReceiveMessage) { - this.message = onReceiveMessage; - return this; - } - withOnReceiveStatus(onReceiveStatus) { - this.status = onReceiveStatus; - return this; - } - build() { - return { - onReceiveMetadata: this.metadata, - onReceiveMessage: this.message, - onReceiveStatus: this.status - }; - } - }; - exports2.ListenerBuilder = ListenerBuilder; - var RequesterBuilder = class { - constructor() { - this.start = void 0; - this.message = void 0; - this.halfClose = void 0; - this.cancel = void 0; - } - withStart(start) { - this.start = start; - return this; - } - withSendMessage(sendMessage) { - this.message = sendMessage; - return this; - } - withHalfClose(halfClose) { - this.halfClose = halfClose; - return this; - } - withCancel(cancel) { - this.cancel = cancel; - return this; - } - build() { - return { - start: this.start, - sendMessage: this.message, - halfClose: this.halfClose, - cancel: this.cancel - }; - } - }; - exports2.RequesterBuilder = RequesterBuilder; - var defaultListener = { - onReceiveMetadata: (metadata, next) => { - next(metadata); - }, - onReceiveMessage: (message, next) => { - next(message); - }, - onReceiveStatus: (status2, next) => { - next(status2); - } - }; - var defaultRequester = { - start: (metadata, listener, next) => { - next(metadata, listener); - }, - sendMessage: (message, next) => { - next(message); - }, - halfClose: (next) => { - next(); - }, - cancel: (next) => { - next(); - } - }; - var InterceptingCall = class { - constructor(nextCall, requester) { - var _a2, _b, _c2, _d; - this.nextCall = nextCall; - this.processingMetadata = false; - this.pendingMessageContext = null; - this.processingMessage = false; - this.pendingHalfClose = false; - if (requester) { - this.requester = { - start: (_a2 = requester.start) !== null && _a2 !== void 0 ? _a2 : defaultRequester.start, - sendMessage: (_b = requester.sendMessage) !== null && _b !== void 0 ? _b : defaultRequester.sendMessage, - halfClose: (_c2 = requester.halfClose) !== null && _c2 !== void 0 ? _c2 : defaultRequester.halfClose, - cancel: (_d = requester.cancel) !== null && _d !== void 0 ? _d : defaultRequester.cancel - }; - } else { - this.requester = defaultRequester; - } - } - cancelWithStatus(status2, details) { - this.requester.cancel(() => { - this.nextCall.cancelWithStatus(status2, details); - }); - } - getPeer() { - return this.nextCall.getPeer(); - } - processPendingMessage() { - if (this.pendingMessageContext) { - this.nextCall.sendMessageWithContext(this.pendingMessageContext, this.pendingMessage); - this.pendingMessageContext = null; - this.pendingMessage = null; - } - } - processPendingHalfClose() { - if (this.pendingHalfClose) { - this.nextCall.halfClose(); - } - } - start(metadata, interceptingListener) { - var _a2, _b, _c2, _d, _e2, _f; - const fullInterceptingListener = { - onReceiveMetadata: (_b = (_a2 = interceptingListener === null || interceptingListener === void 0 ? void 0 : interceptingListener.onReceiveMetadata) === null || _a2 === void 0 ? void 0 : _a2.bind(interceptingListener)) !== null && _b !== void 0 ? _b : (metadata2) => { - }, - onReceiveMessage: (_d = (_c2 = interceptingListener === null || interceptingListener === void 0 ? void 0 : interceptingListener.onReceiveMessage) === null || _c2 === void 0 ? void 0 : _c2.bind(interceptingListener)) !== null && _d !== void 0 ? _d : (message) => { - }, - onReceiveStatus: (_f = (_e2 = interceptingListener === null || interceptingListener === void 0 ? void 0 : interceptingListener.onReceiveStatus) === null || _e2 === void 0 ? void 0 : _e2.bind(interceptingListener)) !== null && _f !== void 0 ? _f : (status2) => { - } - }; - this.processingMetadata = true; - this.requester.start(metadata, fullInterceptingListener, (md, listener) => { - var _a3, _b2, _c3; - this.processingMetadata = false; - let finalInterceptingListener; - if ((0, call_interface_1.isInterceptingListener)(listener)) { - finalInterceptingListener = listener; - } else { - const fullListener = { - onReceiveMetadata: (_a3 = listener.onReceiveMetadata) !== null && _a3 !== void 0 ? _a3 : defaultListener.onReceiveMetadata, - onReceiveMessage: (_b2 = listener.onReceiveMessage) !== null && _b2 !== void 0 ? _b2 : defaultListener.onReceiveMessage, - onReceiveStatus: (_c3 = listener.onReceiveStatus) !== null && _c3 !== void 0 ? _c3 : defaultListener.onReceiveStatus - }; - finalInterceptingListener = new call_interface_1.InterceptingListenerImpl(fullListener, fullInterceptingListener); - } - this.nextCall.start(md, finalInterceptingListener); - this.processPendingMessage(); - this.processPendingHalfClose(); - }); - } - // eslint-disable-next-line @typescript-eslint/no-explicit-any - sendMessageWithContext(context, message) { - this.processingMessage = true; - this.requester.sendMessage(message, (finalMessage) => { - this.processingMessage = false; - if (this.processingMetadata) { - this.pendingMessageContext = context; - this.pendingMessage = message; - } else { - this.nextCall.sendMessageWithContext(context, finalMessage); - this.processPendingHalfClose(); - } - }); - } - // eslint-disable-next-line @typescript-eslint/no-explicit-any - sendMessage(message) { - this.sendMessageWithContext({}, message); - } - startRead() { - this.nextCall.startRead(); - } - halfClose() { - this.requester.halfClose(() => { - if (this.processingMetadata || this.processingMessage) { - this.pendingHalfClose = true; - } else { - this.nextCall.halfClose(); - } - }); - } - }; - exports2.InterceptingCall = InterceptingCall; - function getCall(channel, path, options2) { - var _a2, _b; - const deadline = (_a2 = options2.deadline) !== null && _a2 !== void 0 ? _a2 : Infinity; - const host = options2.host; - const parent = (_b = options2.parent) !== null && _b !== void 0 ? _b : null; - const propagateFlags = options2.propagate_flags; - const credentials2 = options2.credentials; - const call = channel.createCall(path, deadline, host, parent, propagateFlags); - if (credentials2) { - call.setCredentials(credentials2); - } - return call; - } - var BaseInterceptingCall = class { - constructor(call, methodDefinition) { - this.call = call; - this.methodDefinition = methodDefinition; - } - cancelWithStatus(status2, details) { - this.call.cancelWithStatus(status2, details); - } - getPeer() { - return this.call.getPeer(); - } - // eslint-disable-next-line @typescript-eslint/no-explicit-any - sendMessageWithContext(context, message) { - let serialized; - try { - serialized = this.methodDefinition.requestSerialize(message); - } catch (e) { - this.call.cancelWithStatus(constants_1.Status.INTERNAL, `Request message serialization failure: ${(0, error_1.getErrorMessage)(e)}`); - return; - } - this.call.sendMessageWithContext(context, serialized); - } - // eslint-disable-next-line @typescript-eslint/no-explicit-any - sendMessage(message) { - this.sendMessageWithContext({}, message); - } - start(metadata, interceptingListener) { - let readError = null; - this.call.start(metadata, { - onReceiveMetadata: (metadata2) => { - var _a2; - (_a2 = interceptingListener === null || interceptingListener === void 0 ? void 0 : interceptingListener.onReceiveMetadata) === null || _a2 === void 0 ? void 0 : _a2.call(interceptingListener, metadata2); - }, - onReceiveMessage: (message) => { - var _a2; - let deserialized; - try { - deserialized = this.methodDefinition.responseDeserialize(message); - } catch (e) { - readError = { - code: constants_1.Status.INTERNAL, - details: `Response message parsing error: ${(0, error_1.getErrorMessage)(e)}`, - metadata: new metadata_1.Metadata() - }; - this.call.cancelWithStatus(readError.code, readError.details); - return; - } - (_a2 = interceptingListener === null || interceptingListener === void 0 ? void 0 : interceptingListener.onReceiveMessage) === null || _a2 === void 0 ? void 0 : _a2.call(interceptingListener, deserialized); - }, - onReceiveStatus: (status2) => { - var _a2, _b; - if (readError) { - (_a2 = interceptingListener === null || interceptingListener === void 0 ? void 0 : interceptingListener.onReceiveStatus) === null || _a2 === void 0 ? void 0 : _a2.call(interceptingListener, readError); - } else { - (_b = interceptingListener === null || interceptingListener === void 0 ? void 0 : interceptingListener.onReceiveStatus) === null || _b === void 0 ? void 0 : _b.call(interceptingListener, status2); - } - } - }); - } - startRead() { - this.call.startRead(); - } - halfClose() { - this.call.halfClose(); - } - }; - var BaseUnaryInterceptingCall = class extends BaseInterceptingCall { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - constructor(call, methodDefinition) { - super(call, methodDefinition); - } - start(metadata, listener) { - var _a2, _b; - let receivedMessage = false; - const wrapperListener = { - onReceiveMetadata: (_b = (_a2 = listener === null || listener === void 0 ? void 0 : listener.onReceiveMetadata) === null || _a2 === void 0 ? void 0 : _a2.bind(listener)) !== null && _b !== void 0 ? _b : (metadata2) => { - }, - // eslint-disable-next-line @typescript-eslint/no-explicit-any - onReceiveMessage: (message) => { - var _a3; - receivedMessage = true; - (_a3 = listener === null || listener === void 0 ? void 0 : listener.onReceiveMessage) === null || _a3 === void 0 ? void 0 : _a3.call(listener, message); - }, - onReceiveStatus: (status2) => { - var _a3, _b2; - if (!receivedMessage) { - (_a3 = listener === null || listener === void 0 ? void 0 : listener.onReceiveMessage) === null || _a3 === void 0 ? void 0 : _a3.call(listener, null); - } - (_b2 = listener === null || listener === void 0 ? void 0 : listener.onReceiveStatus) === null || _b2 === void 0 ? void 0 : _b2.call(listener, status2); - } - }; - super.start(metadata, wrapperListener); - this.call.startRead(); - } - }; - var BaseStreamingInterceptingCall = class extends BaseInterceptingCall { - }; - function getBottomInterceptingCall(channel, options2, methodDefinition) { - const call = getCall(channel, methodDefinition.path, options2); - if (methodDefinition.responseStream) { - return new BaseStreamingInterceptingCall(call, methodDefinition); - } else { - return new BaseUnaryInterceptingCall(call, methodDefinition); - } - } - function getInterceptingCall(interceptorArgs, methodDefinition, options2, channel) { - if (interceptorArgs.clientInterceptors.length > 0 && interceptorArgs.clientInterceptorProviders.length > 0) { - throw new InterceptorConfigurationError("Both interceptors and interceptor_providers were passed as options to the client constructor. Only one of these is allowed."); - } - if (interceptorArgs.callInterceptors.length > 0 && interceptorArgs.callInterceptorProviders.length > 0) { - throw new InterceptorConfigurationError("Both interceptors and interceptor_providers were passed as call options. Only one of these is allowed."); - } - let interceptors = []; - if (interceptorArgs.callInterceptors.length > 0 || interceptorArgs.callInterceptorProviders.length > 0) { - interceptors = [].concat(interceptorArgs.callInterceptors, interceptorArgs.callInterceptorProviders.map((provider) => provider(methodDefinition))).filter((interceptor) => interceptor); - } else { - interceptors = [].concat(interceptorArgs.clientInterceptors, interceptorArgs.clientInterceptorProviders.map((provider) => provider(methodDefinition))).filter((interceptor) => interceptor); - } - const interceptorOptions = Object.assign({}, options2, { - method_definition: methodDefinition - }); - const getCall2 = interceptors.reduceRight((nextCall, nextInterceptor) => { - return (currentOptions) => nextInterceptor(currentOptions, nextCall); - }, (finalOptions) => getBottomInterceptingCall(channel, finalOptions, methodDefinition)); - return getCall2(interceptorOptions); - } - exports2.getInterceptingCall = getInterceptingCall; - } -}); - -// node_modules/@grpc/grpc-js/build/src/client.js -var require_client = __commonJS({ - "node_modules/@grpc/grpc-js/build/src/client.js"(exports2) { - "use strict"; - Object.defineProperty(exports2, "__esModule", { value: true }); - exports2.Client = void 0; - var call_1 = require_call(); - var channel_1 = require_channel(); - var connectivity_state_1 = require_connectivity_state(); - var constants_1 = require_constants(); - var metadata_1 = require_metadata(); - var client_interceptors_1 = require_client_interceptors(); - var CHANNEL_SYMBOL = Symbol(); - var INTERCEPTOR_SYMBOL = Symbol(); - var INTERCEPTOR_PROVIDER_SYMBOL = Symbol(); - var CALL_INVOCATION_TRANSFORMER_SYMBOL = Symbol(); - function isFunction(arg) { - return typeof arg === "function"; - } - function getErrorStackString(error2) { - return error2.stack.split("\n").slice(1).join("\n"); - } - var Client = class { - constructor(address, credentials2, options2 = {}) { - var _a2, _b; - options2 = Object.assign({}, options2); - this[INTERCEPTOR_SYMBOL] = (_a2 = options2.interceptors) !== null && _a2 !== void 0 ? _a2 : []; - delete options2.interceptors; - this[INTERCEPTOR_PROVIDER_SYMBOL] = (_b = options2.interceptor_providers) !== null && _b !== void 0 ? _b : []; - delete options2.interceptor_providers; - if (this[INTERCEPTOR_SYMBOL].length > 0 && this[INTERCEPTOR_PROVIDER_SYMBOL].length > 0) { - throw new Error("Both interceptors and interceptor_providers were passed as options to the client constructor. Only one of these is allowed."); - } - this[CALL_INVOCATION_TRANSFORMER_SYMBOL] = options2.callInvocationTransformer; - delete options2.callInvocationTransformer; - if (options2.channelOverride) { - this[CHANNEL_SYMBOL] = options2.channelOverride; - } else if (options2.channelFactoryOverride) { - const channelFactoryOverride = options2.channelFactoryOverride; - delete options2.channelFactoryOverride; - this[CHANNEL_SYMBOL] = channelFactoryOverride(address, credentials2, options2); - } else { - this[CHANNEL_SYMBOL] = new channel_1.ChannelImplementation(address, credentials2, options2); - } - } - close() { - this[CHANNEL_SYMBOL].close(); - } - getChannel() { - return this[CHANNEL_SYMBOL]; - } - waitForReady(deadline, callback) { - const checkState = (err) => { - if (err) { - callback(new Error("Failed to connect before the deadline")); - return; - } - let newState; - try { - newState = this[CHANNEL_SYMBOL].getConnectivityState(true); - } catch (e) { - callback(new Error("The channel has been closed")); - return; - } - if (newState === connectivity_state_1.ConnectivityState.READY) { - callback(); - } else { - try { - this[CHANNEL_SYMBOL].watchConnectivityState(newState, deadline, checkState); - } catch (e) { - callback(new Error("The channel has been closed")); - } - } - }; - setImmediate(checkState); - } - checkOptionalUnaryResponseArguments(arg1, arg2, arg3) { - if (isFunction(arg1)) { - return { metadata: new metadata_1.Metadata(), options: {}, callback: arg1 }; - } else if (isFunction(arg2)) { - if (arg1 instanceof metadata_1.Metadata) { - return { metadata: arg1, options: {}, callback: arg2 }; - } else { - return { metadata: new metadata_1.Metadata(), options: arg1, callback: arg2 }; - } - } else { - if (!(arg1 instanceof metadata_1.Metadata && arg2 instanceof Object && isFunction(arg3))) { - throw new Error("Incorrect arguments passed"); - } - return { metadata: arg1, options: arg2, callback: arg3 }; - } - } - makeUnaryRequest(method, serialize, deserialize, argument, metadata, options2, callback) { - var _a2, _b; - const checkedArguments = this.checkOptionalUnaryResponseArguments(metadata, options2, callback); - const methodDefinition = { - path: method, - requestStream: false, - responseStream: false, - requestSerialize: serialize, - responseDeserialize: deserialize - }; - let callProperties = { - argument, - metadata: checkedArguments.metadata, - call: new call_1.ClientUnaryCallImpl(), - channel: this[CHANNEL_SYMBOL], - methodDefinition, - callOptions: checkedArguments.options, - callback: checkedArguments.callback - }; - if (this[CALL_INVOCATION_TRANSFORMER_SYMBOL]) { - callProperties = this[CALL_INVOCATION_TRANSFORMER_SYMBOL](callProperties); - } - const emitter = callProperties.call; - const interceptorArgs = { - clientInterceptors: this[INTERCEPTOR_SYMBOL], - clientInterceptorProviders: this[INTERCEPTOR_PROVIDER_SYMBOL], - callInterceptors: (_a2 = callProperties.callOptions.interceptors) !== null && _a2 !== void 0 ? _a2 : [], - callInterceptorProviders: (_b = callProperties.callOptions.interceptor_providers) !== null && _b !== void 0 ? _b : [] - }; - const call = (0, client_interceptors_1.getInterceptingCall)(interceptorArgs, callProperties.methodDefinition, callProperties.callOptions, callProperties.channel); - emitter.call = call; - let responseMessage = null; - let receivedStatus = false; - let callerStackError = new Error(); - call.start(callProperties.metadata, { - onReceiveMetadata: (metadata2) => { - emitter.emit("metadata", metadata2); - }, - // eslint-disable-next-line @typescript-eslint/no-explicit-any - onReceiveMessage(message) { - if (responseMessage !== null) { - call.cancelWithStatus(constants_1.Status.INTERNAL, "Too many responses received"); - } - responseMessage = message; - }, - onReceiveStatus(status2) { - if (receivedStatus) { - return; - } - receivedStatus = true; - if (status2.code === constants_1.Status.OK) { - if (responseMessage === null) { - const callerStack = getErrorStackString(callerStackError); - callProperties.callback((0, call_1.callErrorFromStatus)({ - code: constants_1.Status.INTERNAL, - details: "No message received", - metadata: status2.metadata - }, callerStack)); - } else { - callProperties.callback(null, responseMessage); - } - } else { - const callerStack = getErrorStackString(callerStackError); - callProperties.callback((0, call_1.callErrorFromStatus)(status2, callerStack)); - } - callerStackError = null; - emitter.emit("status", status2); - } - }); - call.sendMessage(argument); - call.halfClose(); - return emitter; - } - makeClientStreamRequest(method, serialize, deserialize, metadata, options2, callback) { - var _a2, _b; - const checkedArguments = this.checkOptionalUnaryResponseArguments(metadata, options2, callback); - const methodDefinition = { - path: method, - requestStream: true, - responseStream: false, - requestSerialize: serialize, - responseDeserialize: deserialize - }; - let callProperties = { - metadata: checkedArguments.metadata, - call: new call_1.ClientWritableStreamImpl(serialize), - channel: this[CHANNEL_SYMBOL], - methodDefinition, - callOptions: checkedArguments.options, - callback: checkedArguments.callback - }; - if (this[CALL_INVOCATION_TRANSFORMER_SYMBOL]) { - callProperties = this[CALL_INVOCATION_TRANSFORMER_SYMBOL](callProperties); - } - const emitter = callProperties.call; - const interceptorArgs = { - clientInterceptors: this[INTERCEPTOR_SYMBOL], - clientInterceptorProviders: this[INTERCEPTOR_PROVIDER_SYMBOL], - callInterceptors: (_a2 = callProperties.callOptions.interceptors) !== null && _a2 !== void 0 ? _a2 : [], - callInterceptorProviders: (_b = callProperties.callOptions.interceptor_providers) !== null && _b !== void 0 ? _b : [] - }; - const call = (0, client_interceptors_1.getInterceptingCall)(interceptorArgs, callProperties.methodDefinition, callProperties.callOptions, callProperties.channel); - emitter.call = call; - let responseMessage = null; - let receivedStatus = false; - let callerStackError = new Error(); - call.start(callProperties.metadata, { - onReceiveMetadata: (metadata2) => { - emitter.emit("metadata", metadata2); - }, - // eslint-disable-next-line @typescript-eslint/no-explicit-any - onReceiveMessage(message) { - if (responseMessage !== null) { - call.cancelWithStatus(constants_1.Status.INTERNAL, "Too many responses received"); - } - responseMessage = message; - }, - onReceiveStatus(status2) { - if (receivedStatus) { - return; - } - receivedStatus = true; - if (status2.code === constants_1.Status.OK) { - if (responseMessage === null) { - const callerStack = getErrorStackString(callerStackError); - callProperties.callback((0, call_1.callErrorFromStatus)({ - code: constants_1.Status.INTERNAL, - details: "No message received", - metadata: status2.metadata - }, callerStack)); - } else { - callProperties.callback(null, responseMessage); - } - } else { - const callerStack = getErrorStackString(callerStackError); - callProperties.callback((0, call_1.callErrorFromStatus)(status2, callerStack)); - } - callerStackError = null; - emitter.emit("status", status2); - } - }); - return emitter; - } - checkMetadataAndOptions(arg1, arg2) { - let metadata; - let options2; - if (arg1 instanceof metadata_1.Metadata) { - metadata = arg1; - if (arg2) { - options2 = arg2; - } else { - options2 = {}; - } - } else { - if (arg1) { - options2 = arg1; - } else { - options2 = {}; - } - metadata = new metadata_1.Metadata(); - } - return { metadata, options: options2 }; - } - makeServerStreamRequest(method, serialize, deserialize, argument, metadata, options2) { - var _a2, _b; - const checkedArguments = this.checkMetadataAndOptions(metadata, options2); - const methodDefinition = { - path: method, - requestStream: false, - responseStream: true, - requestSerialize: serialize, - responseDeserialize: deserialize - }; - let callProperties = { - argument, - metadata: checkedArguments.metadata, - call: new call_1.ClientReadableStreamImpl(deserialize), - channel: this[CHANNEL_SYMBOL], - methodDefinition, - callOptions: checkedArguments.options - }; - if (this[CALL_INVOCATION_TRANSFORMER_SYMBOL]) { - callProperties = this[CALL_INVOCATION_TRANSFORMER_SYMBOL](callProperties); - } - const stream = callProperties.call; - const interceptorArgs = { - clientInterceptors: this[INTERCEPTOR_SYMBOL], - clientInterceptorProviders: this[INTERCEPTOR_PROVIDER_SYMBOL], - callInterceptors: (_a2 = callProperties.callOptions.interceptors) !== null && _a2 !== void 0 ? _a2 : [], - callInterceptorProviders: (_b = callProperties.callOptions.interceptor_providers) !== null && _b !== void 0 ? _b : [] - }; - const call = (0, client_interceptors_1.getInterceptingCall)(interceptorArgs, callProperties.methodDefinition, callProperties.callOptions, callProperties.channel); - stream.call = call; - let receivedStatus = false; - let callerStackError = new Error(); - call.start(callProperties.metadata, { - onReceiveMetadata(metadata2) { - stream.emit("metadata", metadata2); - }, - // eslint-disable-next-line @typescript-eslint/no-explicit-any - onReceiveMessage(message) { - stream.push(message); - }, - onReceiveStatus(status2) { - if (receivedStatus) { - return; - } - receivedStatus = true; - stream.push(null); - if (status2.code !== constants_1.Status.OK) { - const callerStack = getErrorStackString(callerStackError); - stream.emit("error", (0, call_1.callErrorFromStatus)(status2, callerStack)); - } - callerStackError = null; - stream.emit("status", status2); - } - }); - call.sendMessage(argument); - call.halfClose(); - return stream; - } - makeBidiStreamRequest(method, serialize, deserialize, metadata, options2) { - var _a2, _b; - const checkedArguments = this.checkMetadataAndOptions(metadata, options2); - const methodDefinition = { - path: method, - requestStream: true, - responseStream: true, - requestSerialize: serialize, - responseDeserialize: deserialize - }; - let callProperties = { - metadata: checkedArguments.metadata, - call: new call_1.ClientDuplexStreamImpl(serialize, deserialize), - channel: this[CHANNEL_SYMBOL], - methodDefinition, - callOptions: checkedArguments.options - }; - if (this[CALL_INVOCATION_TRANSFORMER_SYMBOL]) { - callProperties = this[CALL_INVOCATION_TRANSFORMER_SYMBOL](callProperties); - } - const stream = callProperties.call; - const interceptorArgs = { - clientInterceptors: this[INTERCEPTOR_SYMBOL], - clientInterceptorProviders: this[INTERCEPTOR_PROVIDER_SYMBOL], - callInterceptors: (_a2 = callProperties.callOptions.interceptors) !== null && _a2 !== void 0 ? _a2 : [], - callInterceptorProviders: (_b = callProperties.callOptions.interceptor_providers) !== null && _b !== void 0 ? _b : [] - }; - const call = (0, client_interceptors_1.getInterceptingCall)(interceptorArgs, callProperties.methodDefinition, callProperties.callOptions, callProperties.channel); - stream.call = call; - let receivedStatus = false; - let callerStackError = new Error(); - call.start(callProperties.metadata, { - onReceiveMetadata(metadata2) { - stream.emit("metadata", metadata2); - }, - onReceiveMessage(message) { - stream.push(message); - }, - onReceiveStatus(status2) { - if (receivedStatus) { - return; - } - receivedStatus = true; - stream.push(null); - if (status2.code !== constants_1.Status.OK) { - const callerStack = getErrorStackString(callerStackError); - stream.emit("error", (0, call_1.callErrorFromStatus)(status2, callerStack)); - } - callerStackError = null; - stream.emit("status", status2); - } - }); - return stream; - } - }; - exports2.Client = Client; - } -}); - -// node_modules/@grpc/grpc-js/build/src/make-client.js -var require_make_client = __commonJS({ - "node_modules/@grpc/grpc-js/build/src/make-client.js"(exports2) { - "use strict"; - Object.defineProperty(exports2, "__esModule", { value: true }); - exports2.loadPackageDefinition = exports2.makeClientConstructor = void 0; - var client_1 = require_client(); - var requesterFuncs = { - unary: client_1.Client.prototype.makeUnaryRequest, - server_stream: client_1.Client.prototype.makeServerStreamRequest, - client_stream: client_1.Client.prototype.makeClientStreamRequest, - bidi: client_1.Client.prototype.makeBidiStreamRequest - }; - function isPrototypePolluted(key) { - return ["__proto__", "prototype", "constructor"].includes(key); - } - function makeClientConstructor(methods, serviceName, classOptions) { - if (!classOptions) { - classOptions = {}; - } - class ServiceClientImpl extends client_1.Client { - } - Object.keys(methods).forEach((name) => { - if (isPrototypePolluted(name)) { - return; - } - const attrs = methods[name]; - let methodType; - if (typeof name === "string" && name.charAt(0) === "$") { - throw new Error("Method names cannot start with $"); - } - if (attrs.requestStream) { - if (attrs.responseStream) { - methodType = "bidi"; - } else { - methodType = "client_stream"; - } - } else { - if (attrs.responseStream) { - methodType = "server_stream"; - } else { - methodType = "unary"; - } - } - const serialize = attrs.requestSerialize; - const deserialize = attrs.responseDeserialize; - const methodFunc = partial(requesterFuncs[methodType], attrs.path, serialize, deserialize); - ServiceClientImpl.prototype[name] = methodFunc; - Object.assign(ServiceClientImpl.prototype[name], attrs); - if (attrs.originalName && !isPrototypePolluted(attrs.originalName)) { - ServiceClientImpl.prototype[attrs.originalName] = ServiceClientImpl.prototype[name]; - } - }); - ServiceClientImpl.service = methods; - ServiceClientImpl.serviceName = serviceName; - return ServiceClientImpl; - } - exports2.makeClientConstructor = makeClientConstructor; - function partial(fn, path, serialize, deserialize) { - return function(...args) { - return fn.call(this, path, serialize, deserialize, ...args); - }; - } - function isProtobufTypeDefinition(obj) { - return "format" in obj; - } - function loadPackageDefinition2(packageDef) { - const result = {}; - for (const serviceFqn in packageDef) { - if (Object.prototype.hasOwnProperty.call(packageDef, serviceFqn)) { - const service = packageDef[serviceFqn]; - const nameComponents = serviceFqn.split("."); - if (nameComponents.some((comp) => isPrototypePolluted(comp))) { - continue; - } - const serviceName = nameComponents[nameComponents.length - 1]; - let current = result; - for (const packageName of nameComponents.slice(0, -1)) { - if (!current[packageName]) { - current[packageName] = {}; - } - current = current[packageName]; - } - if (isProtobufTypeDefinition(service)) { - current[serviceName] = service; - } else { - current[serviceName] = makeClientConstructor(service, serviceName, {}); - } - } - } - return result; - } - exports2.loadPackageDefinition = loadPackageDefinition2; - } -}); - -// node_modules/@grpc/grpc-js/build/src/channelz.js -var require_channelz = __commonJS({ - "node_modules/@grpc/grpc-js/build/src/channelz.js"(exports2) { - "use strict"; - Object.defineProperty(exports2, "__esModule", { value: true }); - exports2.setup = exports2.getChannelzServiceDefinition = exports2.getChannelzHandlers = exports2.unregisterChannelzRef = exports2.registerChannelzSocket = exports2.registerChannelzServer = exports2.registerChannelzSubchannel = exports2.registerChannelzChannel = exports2.ChannelzCallTracker = exports2.ChannelzChildrenTracker = exports2.ChannelzTrace = void 0; - var net_1 = require("net"); - var connectivity_state_1 = require_connectivity_state(); - var constants_1 = require_constants(); - var subchannel_address_1 = require_subchannel_address(); - var admin_1 = require_admin(); - var make_client_1 = require_make_client(); - function channelRefToMessage(ref) { - return { - channel_id: ref.id, - name: ref.name - }; - } - function subchannelRefToMessage(ref) { - return { - subchannel_id: ref.id, - name: ref.name - }; - } - function serverRefToMessage(ref) { - return { - server_id: ref.id - }; - } - function socketRefToMessage(ref) { - return { - socket_id: ref.id, - name: ref.name - }; - } - var TARGET_RETAINED_TRACES = 32; - var ChannelzTrace = class { - constructor() { - this.events = []; - this.eventsLogged = 0; - this.creationTimestamp = /* @__PURE__ */ new Date(); - } - addTrace(severity, description, child) { - const timestamp = /* @__PURE__ */ new Date(); - this.events.push({ - description, - severity, - timestamp, - childChannel: (child === null || child === void 0 ? void 0 : child.kind) === "channel" ? child : void 0, - childSubchannel: (child === null || child === void 0 ? void 0 : child.kind) === "subchannel" ? child : void 0 - }); - if (this.events.length >= TARGET_RETAINED_TRACES * 2) { - this.events = this.events.slice(TARGET_RETAINED_TRACES); - } - this.eventsLogged += 1; - } - getTraceMessage() { - return { - creation_timestamp: dateToProtoTimestamp(this.creationTimestamp), - num_events_logged: this.eventsLogged, - events: this.events.map((event) => { - return { - description: event.description, - severity: event.severity, - timestamp: dateToProtoTimestamp(event.timestamp), - channel_ref: event.childChannel ? channelRefToMessage(event.childChannel) : null, - subchannel_ref: event.childSubchannel ? subchannelRefToMessage(event.childSubchannel) : null - }; - }) - }; - } - }; - exports2.ChannelzTrace = ChannelzTrace; - var ChannelzChildrenTracker = class { - constructor() { - this.channelChildren = /* @__PURE__ */ new Map(); - this.subchannelChildren = /* @__PURE__ */ new Map(); - this.socketChildren = /* @__PURE__ */ new Map(); - } - refChild(child) { - var _a2, _b, _c2; - switch (child.kind) { - case "channel": { - const trackedChild = (_a2 = this.channelChildren.get(child.id)) !== null && _a2 !== void 0 ? _a2 : { - ref: child, - count: 0 - }; - trackedChild.count += 1; - this.channelChildren.set(child.id, trackedChild); - break; - } - case "subchannel": { - const trackedChild = (_b = this.subchannelChildren.get(child.id)) !== null && _b !== void 0 ? _b : { - ref: child, - count: 0 - }; - trackedChild.count += 1; - this.subchannelChildren.set(child.id, trackedChild); - break; - } - case "socket": { - const trackedChild = (_c2 = this.socketChildren.get(child.id)) !== null && _c2 !== void 0 ? _c2 : { - ref: child, - count: 0 - }; - trackedChild.count += 1; - this.socketChildren.set(child.id, trackedChild); - break; - } - } - } - unrefChild(child) { - switch (child.kind) { - case "channel": { - const trackedChild = this.channelChildren.get(child.id); - if (trackedChild !== void 0) { - trackedChild.count -= 1; - if (trackedChild.count === 0) { - this.channelChildren.delete(child.id); - } else { - this.channelChildren.set(child.id, trackedChild); - } - } - break; - } - case "subchannel": { - const trackedChild = this.subchannelChildren.get(child.id); - if (trackedChild !== void 0) { - trackedChild.count -= 1; - if (trackedChild.count === 0) { - this.subchannelChildren.delete(child.id); - } else { - this.subchannelChildren.set(child.id, trackedChild); - } - } - break; - } - case "socket": { - const trackedChild = this.socketChildren.get(child.id); - if (trackedChild !== void 0) { - trackedChild.count -= 1; - if (trackedChild.count === 0) { - this.socketChildren.delete(child.id); - } else { - this.socketChildren.set(child.id, trackedChild); - } - } - break; - } - } - } - getChildLists() { - const channels2 = []; - for (const { ref } of this.channelChildren.values()) { - channels2.push(ref); - } - const subchannels2 = []; - for (const { ref } of this.subchannelChildren.values()) { - subchannels2.push(ref); - } - const sockets2 = []; - for (const { ref } of this.socketChildren.values()) { - sockets2.push(ref); - } - return { channels: channels2, subchannels: subchannels2, sockets: sockets2 }; - } - }; - exports2.ChannelzChildrenTracker = ChannelzChildrenTracker; - var ChannelzCallTracker = class { - constructor() { - this.callsStarted = 0; - this.callsSucceeded = 0; - this.callsFailed = 0; - this.lastCallStartedTimestamp = null; - } - addCallStarted() { - this.callsStarted += 1; - this.lastCallStartedTimestamp = /* @__PURE__ */ new Date(); - } - addCallSucceeded() { - this.callsSucceeded += 1; - } - addCallFailed() { - this.callsFailed += 1; - } - }; - exports2.ChannelzCallTracker = ChannelzCallTracker; - var nextId = 1; - function getNextId() { - return nextId++; - } - var channels = []; - var subchannels = []; - var servers = []; - var sockets = []; - function registerChannelzChannel(name, getInfo, channelzEnabled) { - const id = getNextId(); - const ref = { id, name, kind: "channel" }; - if (channelzEnabled) { - channels[id] = { ref, getInfo }; - } - return ref; - } - exports2.registerChannelzChannel = registerChannelzChannel; - function registerChannelzSubchannel(name, getInfo, channelzEnabled) { - const id = getNextId(); - const ref = { id, name, kind: "subchannel" }; - if (channelzEnabled) { - subchannels[id] = { ref, getInfo }; - } - return ref; - } - exports2.registerChannelzSubchannel = registerChannelzSubchannel; - function registerChannelzServer(getInfo, channelzEnabled) { - const id = getNextId(); - const ref = { id, kind: "server" }; - if (channelzEnabled) { - servers[id] = { ref, getInfo }; - } - return ref; - } - exports2.registerChannelzServer = registerChannelzServer; - function registerChannelzSocket(name, getInfo, channelzEnabled) { - const id = getNextId(); - const ref = { id, name, kind: "socket" }; - if (channelzEnabled) { - sockets[id] = { ref, getInfo }; - } - return ref; - } - exports2.registerChannelzSocket = registerChannelzSocket; - function unregisterChannelzRef(ref) { - switch (ref.kind) { - case "channel": - delete channels[ref.id]; - return; - case "subchannel": - delete subchannels[ref.id]; - return; - case "server": - delete servers[ref.id]; - return; - case "socket": - delete sockets[ref.id]; - return; - } - } - exports2.unregisterChannelzRef = unregisterChannelzRef; - function parseIPv6Section(addressSection) { - const numberValue = Number.parseInt(addressSection, 16); - return [numberValue / 256 | 0, numberValue % 256]; - } - function parseIPv6Chunk(addressChunk) { - if (addressChunk === "") { - return []; - } - const bytePairs = addressChunk.split(":").map((section) => parseIPv6Section(section)); - const result = []; - return result.concat(...bytePairs); - } - function ipAddressStringToBuffer(ipAddress) { - if ((0, net_1.isIPv4)(ipAddress)) { - return Buffer.from(Uint8Array.from(ipAddress.split(".").map((segment) => Number.parseInt(segment)))); - } else if ((0, net_1.isIPv6)(ipAddress)) { - let leftSection; - let rightSection; - const doubleColonIndex = ipAddress.indexOf("::"); - if (doubleColonIndex === -1) { - leftSection = ipAddress; - rightSection = ""; - } else { - leftSection = ipAddress.substring(0, doubleColonIndex); - rightSection = ipAddress.substring(doubleColonIndex + 2); - } - const leftBuffer = Buffer.from(parseIPv6Chunk(leftSection)); - const rightBuffer = Buffer.from(parseIPv6Chunk(rightSection)); - const middleBuffer = Buffer.alloc(16 - leftBuffer.length - rightBuffer.length, 0); - return Buffer.concat([leftBuffer, middleBuffer, rightBuffer]); - } else { - return null; - } - } - function connectivityStateToMessage(state) { - switch (state) { - case connectivity_state_1.ConnectivityState.CONNECTING: - return { - state: "CONNECTING" - }; - case connectivity_state_1.ConnectivityState.IDLE: - return { - state: "IDLE" - }; - case connectivity_state_1.ConnectivityState.READY: - return { - state: "READY" - }; - case connectivity_state_1.ConnectivityState.SHUTDOWN: - return { - state: "SHUTDOWN" - }; - case connectivity_state_1.ConnectivityState.TRANSIENT_FAILURE: - return { - state: "TRANSIENT_FAILURE" - }; - default: - return { - state: "UNKNOWN" - }; - } - } - function dateToProtoTimestamp(date) { - if (!date) { - return null; - } - const millisSinceEpoch = date.getTime(); - return { - seconds: millisSinceEpoch / 1e3 | 0, - nanos: millisSinceEpoch % 1e3 * 1e6 - }; - } - function getChannelMessage(channelEntry) { - const resolvedInfo = channelEntry.getInfo(); - return { - ref: channelRefToMessage(channelEntry.ref), - data: { - target: resolvedInfo.target, - state: connectivityStateToMessage(resolvedInfo.state), - calls_started: resolvedInfo.callTracker.callsStarted, - calls_succeeded: resolvedInfo.callTracker.callsSucceeded, - calls_failed: resolvedInfo.callTracker.callsFailed, - last_call_started_timestamp: dateToProtoTimestamp(resolvedInfo.callTracker.lastCallStartedTimestamp), - trace: resolvedInfo.trace.getTraceMessage() - }, - channel_ref: resolvedInfo.children.channels.map((ref) => channelRefToMessage(ref)), - subchannel_ref: resolvedInfo.children.subchannels.map((ref) => subchannelRefToMessage(ref)) - }; - } - function GetChannel(call, callback) { - const channelId = Number.parseInt(call.request.channel_id); - const channelEntry = channels[channelId]; - if (channelEntry === void 0) { - callback({ - code: constants_1.Status.NOT_FOUND, - details: "No channel data found for id " + channelId - }); - return; - } - callback(null, { channel: getChannelMessage(channelEntry) }); - } - function GetTopChannels(call, callback) { - const maxResults = Number.parseInt(call.request.max_results); - const resultList = []; - let i = Number.parseInt(call.request.start_channel_id); - for (; i < channels.length; i++) { - const channelEntry = channels[i]; - if (channelEntry === void 0) { - continue; - } - resultList.push(getChannelMessage(channelEntry)); - if (resultList.length >= maxResults) { - break; - } - } - callback(null, { - channel: resultList, - end: i >= servers.length - }); - } - function getServerMessage(serverEntry) { - const resolvedInfo = serverEntry.getInfo(); - return { - ref: serverRefToMessage(serverEntry.ref), - data: { - calls_started: resolvedInfo.callTracker.callsStarted, - calls_succeeded: resolvedInfo.callTracker.callsSucceeded, - calls_failed: resolvedInfo.callTracker.callsFailed, - last_call_started_timestamp: dateToProtoTimestamp(resolvedInfo.callTracker.lastCallStartedTimestamp), - trace: resolvedInfo.trace.getTraceMessage() - }, - listen_socket: resolvedInfo.listenerChildren.sockets.map((ref) => socketRefToMessage(ref)) - }; - } - function GetServer(call, callback) { - const serverId = Number.parseInt(call.request.server_id); - const serverEntry = servers[serverId]; - if (serverEntry === void 0) { - callback({ - code: constants_1.Status.NOT_FOUND, - details: "No server data found for id " + serverId - }); - return; - } - callback(null, { server: getServerMessage(serverEntry) }); - } - function GetServers(call, callback) { - const maxResults = Number.parseInt(call.request.max_results); - const resultList = []; - let i = Number.parseInt(call.request.start_server_id); - for (; i < servers.length; i++) { - const serverEntry = servers[i]; - if (serverEntry === void 0) { - continue; - } - resultList.push(getServerMessage(serverEntry)); - if (resultList.length >= maxResults) { - break; - } - } - callback(null, { - server: resultList, - end: i >= servers.length - }); - } - function GetSubchannel(call, callback) { - const subchannelId = Number.parseInt(call.request.subchannel_id); - const subchannelEntry = subchannels[subchannelId]; - if (subchannelEntry === void 0) { - callback({ - code: constants_1.Status.NOT_FOUND, - details: "No subchannel data found for id " + subchannelId - }); - return; - } - const resolvedInfo = subchannelEntry.getInfo(); - const subchannelMessage = { - ref: subchannelRefToMessage(subchannelEntry.ref), - data: { - target: resolvedInfo.target, - state: connectivityStateToMessage(resolvedInfo.state), - calls_started: resolvedInfo.callTracker.callsStarted, - calls_succeeded: resolvedInfo.callTracker.callsSucceeded, - calls_failed: resolvedInfo.callTracker.callsFailed, - last_call_started_timestamp: dateToProtoTimestamp(resolvedInfo.callTracker.lastCallStartedTimestamp), - trace: resolvedInfo.trace.getTraceMessage() - }, - socket_ref: resolvedInfo.children.sockets.map((ref) => socketRefToMessage(ref)) - }; - callback(null, { subchannel: subchannelMessage }); - } - function subchannelAddressToAddressMessage(subchannelAddress) { - var _a2; - if ((0, subchannel_address_1.isTcpSubchannelAddress)(subchannelAddress)) { - return { - address: "tcpip_address", - tcpip_address: { - ip_address: (_a2 = ipAddressStringToBuffer(subchannelAddress.host)) !== null && _a2 !== void 0 ? _a2 : void 0, - port: subchannelAddress.port - } - }; - } else { - return { - address: "uds_address", - uds_address: { - filename: subchannelAddress.path - } - }; - } - } - function GetSocket(call, callback) { - var _a2, _b, _c2, _d, _e2; - const socketId = Number.parseInt(call.request.socket_id); - const socketEntry = sockets[socketId]; - if (socketEntry === void 0) { - callback({ - code: constants_1.Status.NOT_FOUND, - details: "No socket data found for id " + socketId - }); - return; - } - const resolvedInfo = socketEntry.getInfo(); - const securityMessage = resolvedInfo.security ? { - model: "tls", - tls: { - cipher_suite: resolvedInfo.security.cipherSuiteStandardName ? "standard_name" : "other_name", - standard_name: (_a2 = resolvedInfo.security.cipherSuiteStandardName) !== null && _a2 !== void 0 ? _a2 : void 0, - other_name: (_b = resolvedInfo.security.cipherSuiteOtherName) !== null && _b !== void 0 ? _b : void 0, - local_certificate: (_c2 = resolvedInfo.security.localCertificate) !== null && _c2 !== void 0 ? _c2 : void 0, - remote_certificate: (_d = resolvedInfo.security.remoteCertificate) !== null && _d !== void 0 ? _d : void 0 - } - } : null; - const socketMessage = { - ref: socketRefToMessage(socketEntry.ref), - local: resolvedInfo.localAddress ? subchannelAddressToAddressMessage(resolvedInfo.localAddress) : null, - remote: resolvedInfo.remoteAddress ? subchannelAddressToAddressMessage(resolvedInfo.remoteAddress) : null, - remote_name: (_e2 = resolvedInfo.remoteName) !== null && _e2 !== void 0 ? _e2 : void 0, - security: securityMessage, - data: { - keep_alives_sent: resolvedInfo.keepAlivesSent, - streams_started: resolvedInfo.streamsStarted, - streams_succeeded: resolvedInfo.streamsSucceeded, - streams_failed: resolvedInfo.streamsFailed, - last_local_stream_created_timestamp: dateToProtoTimestamp(resolvedInfo.lastLocalStreamCreatedTimestamp), - last_remote_stream_created_timestamp: dateToProtoTimestamp(resolvedInfo.lastRemoteStreamCreatedTimestamp), - messages_received: resolvedInfo.messagesReceived, - messages_sent: resolvedInfo.messagesSent, - last_message_received_timestamp: dateToProtoTimestamp(resolvedInfo.lastMessageReceivedTimestamp), - last_message_sent_timestamp: dateToProtoTimestamp(resolvedInfo.lastMessageSentTimestamp), - local_flow_control_window: resolvedInfo.localFlowControlWindow ? { value: resolvedInfo.localFlowControlWindow } : null, - remote_flow_control_window: resolvedInfo.remoteFlowControlWindow ? { value: resolvedInfo.remoteFlowControlWindow } : null - } - }; - callback(null, { socket: socketMessage }); - } - function GetServerSockets(call, callback) { - const serverId = Number.parseInt(call.request.server_id); - const serverEntry = servers[serverId]; - if (serverEntry === void 0) { - callback({ - code: constants_1.Status.NOT_FOUND, - details: "No server data found for id " + serverId - }); - return; - } - const startId = Number.parseInt(call.request.start_socket_id); - const maxResults = Number.parseInt(call.request.max_results); - const resolvedInfo = serverEntry.getInfo(); - const allSockets = resolvedInfo.sessionChildren.sockets.sort((ref1, ref2) => ref1.id - ref2.id); - const resultList = []; - let i = 0; - for (; i < allSockets.length; i++) { - if (allSockets[i].id >= startId) { - resultList.push(socketRefToMessage(allSockets[i])); - if (resultList.length >= maxResults) { - break; - } - } - } - callback(null, { - socket_ref: resultList, - end: i >= allSockets.length - }); - } - function getChannelzHandlers() { - return { - GetChannel, - GetTopChannels, - GetServer, - GetServers, - GetSubchannel, - GetSocket, - GetServerSockets - }; - } - exports2.getChannelzHandlers = getChannelzHandlers; - var loadedChannelzDefinition = null; - function getChannelzServiceDefinition() { - if (loadedChannelzDefinition) { - return loadedChannelzDefinition; - } - const loaderLoadSync = require_src2().loadSync; - const loadedProto = loaderLoadSync("channelz.proto", { - keepCase: true, - longs: String, - enums: String, - defaults: true, - oneofs: true, - includeDirs: [`${__dirname}/../../proto`] - }); - const channelzGrpcObject = (0, make_client_1.loadPackageDefinition)(loadedProto); - loadedChannelzDefinition = channelzGrpcObject.grpc.channelz.v1.Channelz.service; - return loadedChannelzDefinition; - } - exports2.getChannelzServiceDefinition = getChannelzServiceDefinition; - function setup() { - (0, admin_1.registerAdminService)(getChannelzServiceDefinition, getChannelzHandlers); - } - exports2.setup = setup; - } -}); - -// node_modules/@grpc/grpc-js/build/src/subchannel.js -var require_subchannel = __commonJS({ - "node_modules/@grpc/grpc-js/build/src/subchannel.js"(exports2) { - "use strict"; - Object.defineProperty(exports2, "__esModule", { value: true }); - exports2.Subchannel = void 0; - var connectivity_state_1 = require_connectivity_state(); - var backoff_timeout_1 = require_backoff_timeout(); - var logging = require_logging(); - var constants_1 = require_constants(); - var uri_parser_1 = require_uri_parser(); - var subchannel_address_1 = require_subchannel_address(); - var channelz_1 = require_channelz(); - var TRACER_NAME = "subchannel"; - var KEEPALIVE_MAX_TIME_MS = ~(1 << 31); - var Subchannel = class { - /** - * A class representing a connection to a single backend. - * @param channelTarget The target string for the channel as a whole - * @param subchannelAddress The address for the backend that this subchannel - * will connect to - * @param options The channel options, plus any specific subchannel options - * for this subchannel - * @param credentials The channel credentials used to establish this - * connection - */ - constructor(channelTarget, subchannelAddress, options2, credentials2, connector) { - var _a2; - this.channelTarget = channelTarget; - this.subchannelAddress = subchannelAddress; - this.options = options2; - this.credentials = credentials2; - this.connector = connector; - this.connectivityState = connectivity_state_1.ConnectivityState.IDLE; - this.transport = null; - this.continueConnecting = false; - this.stateListeners = /* @__PURE__ */ new Set(); - this.refcount = 0; - this.channelzEnabled = true; - this.callTracker = new channelz_1.ChannelzCallTracker(); - this.childrenTracker = new channelz_1.ChannelzChildrenTracker(); - this.streamTracker = new channelz_1.ChannelzCallTracker(); - const backoffOptions = { - initialDelay: options2["grpc.initial_reconnect_backoff_ms"], - maxDelay: options2["grpc.max_reconnect_backoff_ms"] - }; - this.backoffTimeout = new backoff_timeout_1.BackoffTimeout(() => { - this.handleBackoffTimer(); - }, backoffOptions); - this.subchannelAddressString = (0, subchannel_address_1.subchannelAddressToString)(subchannelAddress); - this.keepaliveTime = (_a2 = options2["grpc.keepalive_time_ms"]) !== null && _a2 !== void 0 ? _a2 : -1; - if (options2["grpc.enable_channelz"] === 0) { - this.channelzEnabled = false; - } - this.channelzTrace = new channelz_1.ChannelzTrace(); - this.channelzRef = (0, channelz_1.registerChannelzSubchannel)(this.subchannelAddressString, () => this.getChannelzInfo(), this.channelzEnabled); - if (this.channelzEnabled) { - this.channelzTrace.addTrace("CT_INFO", "Subchannel created"); - } - this.trace("Subchannel constructed with options " + JSON.stringify(options2, void 0, 2)); - } - getChannelzInfo() { - return { - state: this.connectivityState, - trace: this.channelzTrace, - callTracker: this.callTracker, - children: this.childrenTracker.getChildLists(), - target: this.subchannelAddressString - }; - } - trace(text) { - logging.trace(constants_1.LogVerbosity.DEBUG, TRACER_NAME, "(" + this.channelzRef.id + ") " + this.subchannelAddressString + " " + text); - } - refTrace(text) { - logging.trace(constants_1.LogVerbosity.DEBUG, "subchannel_refcount", "(" + this.channelzRef.id + ") " + this.subchannelAddressString + " " + text); - } - handleBackoffTimer() { - if (this.continueConnecting) { - this.transitionToState([connectivity_state_1.ConnectivityState.TRANSIENT_FAILURE], connectivity_state_1.ConnectivityState.CONNECTING); - } else { - this.transitionToState([connectivity_state_1.ConnectivityState.TRANSIENT_FAILURE], connectivity_state_1.ConnectivityState.IDLE); - } - } - /** - * Start a backoff timer with the current nextBackoff timeout - */ - startBackoff() { - this.backoffTimeout.runOnce(); - } - stopBackoff() { - this.backoffTimeout.stop(); - this.backoffTimeout.reset(); - } - startConnectingInternal() { - let options2 = this.options; - if (options2["grpc.keepalive_time_ms"]) { - const adjustedKeepaliveTime = Math.min(this.keepaliveTime, KEEPALIVE_MAX_TIME_MS); - options2 = Object.assign(Object.assign({}, options2), { "grpc.keepalive_time_ms": adjustedKeepaliveTime }); - } - this.connector.connect(this.subchannelAddress, this.credentials, options2).then((transport) => { - if (this.transitionToState([connectivity_state_1.ConnectivityState.CONNECTING], connectivity_state_1.ConnectivityState.READY)) { - this.transport = transport; - if (this.channelzEnabled) { - this.childrenTracker.refChild(transport.getChannelzRef()); - } - transport.addDisconnectListener((tooManyPings) => { - this.transitionToState([connectivity_state_1.ConnectivityState.READY], connectivity_state_1.ConnectivityState.IDLE); - if (tooManyPings && this.keepaliveTime > 0) { - this.keepaliveTime *= 2; - logging.log(constants_1.LogVerbosity.ERROR, `Connection to ${(0, uri_parser_1.uriToString)(this.channelTarget)} at ${this.subchannelAddressString} rejected by server because of excess pings. Increasing ping interval to ${this.keepaliveTime} ms`); - } - }); - } - }, (error2) => { - this.transitionToState([connectivity_state_1.ConnectivityState.CONNECTING], connectivity_state_1.ConnectivityState.TRANSIENT_FAILURE); - }); - } - /** - * Initiate a state transition from any element of oldStates to the new - * state. If the current connectivityState is not in oldStates, do nothing. - * @param oldStates The set of states to transition from - * @param newState The state to transition to - * @returns True if the state changed, false otherwise - */ - transitionToState(oldStates, newState) { - var _a2, _b; - if (oldStates.indexOf(this.connectivityState) === -1) { - return false; - } - this.trace(connectivity_state_1.ConnectivityState[this.connectivityState] + " -> " + connectivity_state_1.ConnectivityState[newState]); - if (this.channelzEnabled) { - this.channelzTrace.addTrace("CT_INFO", connectivity_state_1.ConnectivityState[this.connectivityState] + " -> " + connectivity_state_1.ConnectivityState[newState]); - } - const previousState = this.connectivityState; - this.connectivityState = newState; - switch (newState) { - case connectivity_state_1.ConnectivityState.READY: - this.stopBackoff(); - break; - case connectivity_state_1.ConnectivityState.CONNECTING: - this.startBackoff(); - this.startConnectingInternal(); - this.continueConnecting = false; - break; - case connectivity_state_1.ConnectivityState.TRANSIENT_FAILURE: - if (this.channelzEnabled && this.transport) { - this.childrenTracker.unrefChild(this.transport.getChannelzRef()); - } - (_a2 = this.transport) === null || _a2 === void 0 ? void 0 : _a2.shutdown(); - this.transport = null; - if (!this.backoffTimeout.isRunning()) { - process.nextTick(() => { - this.handleBackoffTimer(); - }); - } - break; - case connectivity_state_1.ConnectivityState.IDLE: - if (this.channelzEnabled && this.transport) { - this.childrenTracker.unrefChild(this.transport.getChannelzRef()); - } - (_b = this.transport) === null || _b === void 0 ? void 0 : _b.shutdown(); - this.transport = null; - break; - default: - throw new Error(`Invalid state: unknown ConnectivityState ${newState}`); - } - for (const listener of this.stateListeners) { - listener(this, previousState, newState, this.keepaliveTime); - } - return true; - } - ref() { - this.refTrace("refcount " + this.refcount + " -> " + (this.refcount + 1)); - this.refcount += 1; - } - unref() { - this.refTrace("refcount " + this.refcount + " -> " + (this.refcount - 1)); - this.refcount -= 1; - if (this.refcount === 0) { - if (this.channelzEnabled) { - this.channelzTrace.addTrace("CT_INFO", "Shutting down"); - } - if (this.channelzEnabled) { - (0, channelz_1.unregisterChannelzRef)(this.channelzRef); - } - process.nextTick(() => { - this.transitionToState([connectivity_state_1.ConnectivityState.CONNECTING, connectivity_state_1.ConnectivityState.READY], connectivity_state_1.ConnectivityState.IDLE); - }); - } - } - unrefIfOneRef() { - if (this.refcount === 1) { - this.unref(); - return true; - } - return false; - } - createCall(metadata, host, method, listener) { - if (!this.transport) { - throw new Error("Cannot create call, subchannel not READY"); - } - let statsTracker; - if (this.channelzEnabled) { - this.callTracker.addCallStarted(); - this.streamTracker.addCallStarted(); - statsTracker = { - onCallEnd: (status2) => { - if (status2.code === constants_1.Status.OK) { - this.callTracker.addCallSucceeded(); - } else { - this.callTracker.addCallFailed(); - } - } - }; - } else { - statsTracker = {}; - } - return this.transport.createCall(metadata, host, method, listener, statsTracker); - } - /** - * If the subchannel is currently IDLE, start connecting and switch to the - * CONNECTING state. If the subchannel is current in TRANSIENT_FAILURE, - * the next time it would transition to IDLE, start connecting again instead. - * Otherwise, do nothing. - */ - startConnecting() { - process.nextTick(() => { - if (!this.transitionToState([connectivity_state_1.ConnectivityState.IDLE], connectivity_state_1.ConnectivityState.CONNECTING)) { - if (this.connectivityState === connectivity_state_1.ConnectivityState.TRANSIENT_FAILURE) { - this.continueConnecting = true; - } - } - }); - } - /** - * Get the subchannel's current connectivity state. - */ - getConnectivityState() { - return this.connectivityState; - } - /** - * Add a listener function to be called whenever the subchannel's - * connectivity state changes. - * @param listener - */ - addConnectivityStateListener(listener) { - this.stateListeners.add(listener); - } - /** - * Remove a listener previously added with `addConnectivityStateListener` - * @param listener A reference to a function previously passed to - * `addConnectivityStateListener` - */ - removeConnectivityStateListener(listener) { - this.stateListeners.delete(listener); - } - /** - * Reset the backoff timeout, and immediately start connecting if in backoff. - */ - resetBackoff() { - process.nextTick(() => { - this.backoffTimeout.reset(); - this.transitionToState([connectivity_state_1.ConnectivityState.TRANSIENT_FAILURE], connectivity_state_1.ConnectivityState.CONNECTING); - }); - } - getAddress() { - return this.subchannelAddressString; - } - getChannelzRef() { - return this.channelzRef; - } - getRealSubchannel() { - return this; - } - realSubchannelEquals(other) { - return other.getRealSubchannel() === this; - } - throttleKeepalive(newKeepaliveTime) { - if (newKeepaliveTime > this.keepaliveTime) { - this.keepaliveTime = newKeepaliveTime; - } - } - }; - exports2.Subchannel = Subchannel; - } -}); - -// node_modules/@grpc/grpc-js/build/src/http_proxy.js -var require_http_proxy = __commonJS({ - "node_modules/@grpc/grpc-js/build/src/http_proxy.js"(exports2) { - "use strict"; - Object.defineProperty(exports2, "__esModule", { value: true }); - exports2.getProxiedConnection = exports2.mapProxyName = void 0; - var logging_1 = require_logging(); - var constants_1 = require_constants(); - var resolver_1 = require_resolver(); - var http = require("http"); - var tls = require("tls"); - var logging = require_logging(); - var subchannel_address_1 = require_subchannel_address(); - var uri_parser_1 = require_uri_parser(); - var url_1 = require("url"); - var TRACER_NAME = "proxy"; - function trace(text) { - logging.trace(constants_1.LogVerbosity.DEBUG, TRACER_NAME, text); - } - function getProxyInfo() { - let proxyEnv = ""; - let envVar = ""; - if (process.env.grpc_proxy) { - envVar = "grpc_proxy"; - proxyEnv = process.env.grpc_proxy; - } else if (process.env.https_proxy) { - envVar = "https_proxy"; - proxyEnv = process.env.https_proxy; - } else if (process.env.http_proxy) { - envVar = "http_proxy"; - proxyEnv = process.env.http_proxy; - } else { - return {}; - } - let proxyUrl; - try { - proxyUrl = new url_1.URL(proxyEnv); - } catch (e) { - (0, logging_1.log)(constants_1.LogVerbosity.ERROR, `cannot parse value of "${envVar}" env var`); - return {}; - } - if (proxyUrl.protocol !== "http:") { - (0, logging_1.log)(constants_1.LogVerbosity.ERROR, `"${proxyUrl.protocol}" scheme not supported in proxy URI`); - return {}; - } - let userCred = null; - if (proxyUrl.username) { - if (proxyUrl.password) { - (0, logging_1.log)(constants_1.LogVerbosity.INFO, "userinfo found in proxy URI"); - userCred = `${proxyUrl.username}:${proxyUrl.password}`; - } else { - userCred = proxyUrl.username; - } - } - const hostname = proxyUrl.hostname; - let port = proxyUrl.port; - if (port === "") { - port = "80"; - } - const result = { - address: `${hostname}:${port}` - }; - if (userCred) { - result.creds = userCred; - } - trace("Proxy server " + result.address + " set by environment variable " + envVar); - return result; - } - function getNoProxyHostList() { - let noProxyStr = process.env.no_grpc_proxy; - let envVar = "no_grpc_proxy"; - if (!noProxyStr) { - noProxyStr = process.env.no_proxy; - envVar = "no_proxy"; - } - if (noProxyStr) { - trace("No proxy server list set by environment variable " + envVar); - return noProxyStr.split(","); - } else { - return []; - } - } - function mapProxyName(target, options2) { - var _a2; - const noProxyResult = { - target, - extraOptions: {} - }; - if (((_a2 = options2["grpc.enable_http_proxy"]) !== null && _a2 !== void 0 ? _a2 : 1) === 0) { - return noProxyResult; - } - if (target.scheme === "unix") { - return noProxyResult; - } - const proxyInfo = getProxyInfo(); - if (!proxyInfo.address) { - return noProxyResult; - } - const hostPort = (0, uri_parser_1.splitHostPort)(target.path); - if (!hostPort) { - return noProxyResult; - } - const serverHost = hostPort.host; - for (const host of getNoProxyHostList()) { - if (host === serverHost) { - trace("Not using proxy for target in no_proxy list: " + (0, uri_parser_1.uriToString)(target)); - return noProxyResult; - } - } - const extraOptions = { - "grpc.http_connect_target": (0, uri_parser_1.uriToString)(target) - }; - if (proxyInfo.creds) { - extraOptions["grpc.http_connect_creds"] = proxyInfo.creds; - } - return { - target: { - scheme: "dns", - path: proxyInfo.address - }, - extraOptions - }; - } - exports2.mapProxyName = mapProxyName; - function getProxiedConnection(address, channelOptions, connectionOptions) { - if (!("grpc.http_connect_target" in channelOptions)) { - return Promise.resolve({}); - } - const realTarget = channelOptions["grpc.http_connect_target"]; - const parsedTarget = (0, uri_parser_1.parseUri)(realTarget); - if (parsedTarget === null) { - return Promise.resolve({}); - } - const options2 = { - method: "CONNECT", - path: parsedTarget.path - }; - const headers = { - Host: parsedTarget.path - }; - if ((0, subchannel_address_1.isTcpSubchannelAddress)(address)) { - options2.host = address.host; - options2.port = address.port; - } else { - options2.socketPath = address.path; - } - if ("grpc.http_connect_creds" in channelOptions) { - headers["Proxy-Authorization"] = "Basic " + Buffer.from(channelOptions["grpc.http_connect_creds"]).toString("base64"); - } - options2.headers = headers; - const proxyAddressString = (0, subchannel_address_1.subchannelAddressToString)(address); - trace("Using proxy " + proxyAddressString + " to connect to " + options2.path); - return new Promise((resolve, reject) => { - const request = http.request(options2); - request.once("connect", (res, socket, head) => { - var _a2; - request.removeAllListeners(); - socket.removeAllListeners(); - if (res.statusCode === 200) { - trace("Successfully connected to " + options2.path + " through proxy " + proxyAddressString); - if ("secureContext" in connectionOptions) { - const targetPath = (0, resolver_1.getDefaultAuthority)(parsedTarget); - const hostPort = (0, uri_parser_1.splitHostPort)(targetPath); - const remoteHost = (_a2 = hostPort === null || hostPort === void 0 ? void 0 : hostPort.host) !== null && _a2 !== void 0 ? _a2 : targetPath; - const cts = tls.connect(Object.assign({ host: remoteHost, servername: remoteHost, socket }, connectionOptions), () => { - trace("Successfully established a TLS connection to " + options2.path + " through proxy " + proxyAddressString); - resolve({ socket: cts, realTarget: parsedTarget }); - }); - cts.on("error", (error2) => { - trace("Failed to establish a TLS connection to " + options2.path + " through proxy " + proxyAddressString + " with error " + error2.message); - reject(); - }); - } else { - trace("Successfully established a plaintext connection to " + options2.path + " through proxy " + proxyAddressString); - resolve({ - socket, - realTarget: parsedTarget - }); - } - } else { - (0, logging_1.log)(constants_1.LogVerbosity.ERROR, "Failed to connect to " + options2.path + " through proxy " + proxyAddressString + " with status " + res.statusCode); - reject(); - } - }); - request.once("error", (err) => { - request.removeAllListeners(); - (0, logging_1.log)(constants_1.LogVerbosity.ERROR, "Failed to connect to proxy " + proxyAddressString + " with error " + err.message); - reject(); - }); - request.end(); - }); - } - exports2.getProxiedConnection = getProxiedConnection; - } -}); - -// node_modules/@grpc/grpc-js/build/src/stream-decoder.js -var require_stream_decoder = __commonJS({ - "node_modules/@grpc/grpc-js/build/src/stream-decoder.js"(exports2) { - "use strict"; - Object.defineProperty(exports2, "__esModule", { value: true }); - exports2.StreamDecoder = void 0; - var ReadState; - (function(ReadState2) { - ReadState2[ReadState2["NO_DATA"] = 0] = "NO_DATA"; - ReadState2[ReadState2["READING_SIZE"] = 1] = "READING_SIZE"; - ReadState2[ReadState2["READING_MESSAGE"] = 2] = "READING_MESSAGE"; - })(ReadState || (ReadState = {})); - var StreamDecoder = class { - constructor() { - this.readState = ReadState.NO_DATA; - this.readCompressFlag = Buffer.alloc(1); - this.readPartialSize = Buffer.alloc(4); - this.readSizeRemaining = 4; - this.readMessageSize = 0; - this.readPartialMessage = []; - this.readMessageRemaining = 0; - } - write(data) { - let readHead = 0; - let toRead; - const result = []; - while (readHead < data.length) { - switch (this.readState) { - case ReadState.NO_DATA: - this.readCompressFlag = data.slice(readHead, readHead + 1); - readHead += 1; - this.readState = ReadState.READING_SIZE; - this.readPartialSize.fill(0); - this.readSizeRemaining = 4; - this.readMessageSize = 0; - this.readMessageRemaining = 0; - this.readPartialMessage = []; - break; - case ReadState.READING_SIZE: - toRead = Math.min(data.length - readHead, this.readSizeRemaining); - data.copy(this.readPartialSize, 4 - this.readSizeRemaining, readHead, readHead + toRead); - this.readSizeRemaining -= toRead; - readHead += toRead; - if (this.readSizeRemaining === 0) { - this.readMessageSize = this.readPartialSize.readUInt32BE(0); - this.readMessageRemaining = this.readMessageSize; - if (this.readMessageRemaining > 0) { - this.readState = ReadState.READING_MESSAGE; - } else { - const message = Buffer.concat([this.readCompressFlag, this.readPartialSize], 5); - this.readState = ReadState.NO_DATA; - result.push(message); - } - } - break; - case ReadState.READING_MESSAGE: - toRead = Math.min(data.length - readHead, this.readMessageRemaining); - this.readPartialMessage.push(data.slice(readHead, readHead + toRead)); - this.readMessageRemaining -= toRead; - readHead += toRead; - if (this.readMessageRemaining === 0) { - const framedMessageBuffers = [ - this.readCompressFlag, - this.readPartialSize - ].concat(this.readPartialMessage); - const framedMessage = Buffer.concat(framedMessageBuffers, this.readMessageSize + 5); - this.readState = ReadState.NO_DATA; - result.push(framedMessage); - } - break; - default: - throw new Error("Unexpected read state"); - } - } - return result; - } - }; - exports2.StreamDecoder = StreamDecoder; - } -}); - -// node_modules/@grpc/grpc-js/build/src/subchannel-call.js -var require_subchannel_call = __commonJS({ - "node_modules/@grpc/grpc-js/build/src/subchannel-call.js"(exports2) { - "use strict"; - Object.defineProperty(exports2, "__esModule", { value: true }); - exports2.Http2SubchannelCall = void 0; - var http2 = require("http2"); - var os2 = require("os"); - var constants_1 = require_constants(); - var metadata_1 = require_metadata(); - var stream_decoder_1 = require_stream_decoder(); - var logging = require_logging(); - var constants_2 = require_constants(); - var TRACER_NAME = "subchannel_call"; - function getSystemErrorName(errno) { - for (const [name, num] of Object.entries(os2.constants.errno)) { - if (num === errno) { - return name; - } - } - return "Unknown system error " + errno; - } - var Http2SubchannelCall = class { - constructor(http2Stream, callEventTracker, listener, transport, callId) { - this.http2Stream = http2Stream; - this.callEventTracker = callEventTracker; - this.listener = listener; - this.transport = transport; - this.callId = callId; - this.decoder = new stream_decoder_1.StreamDecoder(); - this.isReadFilterPending = false; - this.isPushPending = false; - this.canPush = false; - this.readsClosed = false; - this.statusOutput = false; - this.unpushedReadMessages = []; - this.mappedStatusCode = constants_1.Status.UNKNOWN; - this.finalStatus = null; - this.internalError = null; - http2Stream.on("response", (headers, flags) => { - let headersString = ""; - for (const header of Object.keys(headers)) { - headersString += " " + header + ": " + headers[header] + "\n"; - } - this.trace("Received server headers:\n" + headersString); - switch (headers[":status"]) { - case 400: - this.mappedStatusCode = constants_1.Status.INTERNAL; - break; - case 401: - this.mappedStatusCode = constants_1.Status.UNAUTHENTICATED; - break; - case 403: - this.mappedStatusCode = constants_1.Status.PERMISSION_DENIED; - break; - case 404: - this.mappedStatusCode = constants_1.Status.UNIMPLEMENTED; - break; - case 429: - case 502: - case 503: - case 504: - this.mappedStatusCode = constants_1.Status.UNAVAILABLE; - break; - default: - this.mappedStatusCode = constants_1.Status.UNKNOWN; - } - if (flags & http2.constants.NGHTTP2_FLAG_END_STREAM) { - this.handleTrailers(headers); - } else { - let metadata; - try { - metadata = metadata_1.Metadata.fromHttp2Headers(headers); - } catch (error2) { - this.endCall({ - code: constants_1.Status.UNKNOWN, - details: error2.message, - metadata: new metadata_1.Metadata() - }); - return; - } - this.listener.onReceiveMetadata(metadata); - } - }); - http2Stream.on("trailers", (headers) => { - this.handleTrailers(headers); - }); - http2Stream.on("data", (data) => { - if (this.statusOutput) { - return; - } - this.trace("receive HTTP/2 data frame of length " + data.length); - const messages = this.decoder.write(data); - for (const message of messages) { - this.trace("parsed message of length " + message.length); - this.callEventTracker.addMessageReceived(); - this.tryPush(message); - } - }); - http2Stream.on("end", () => { - this.readsClosed = true; - this.maybeOutputStatus(); - }); - http2Stream.on("close", () => { - process.nextTick(() => { - var _a2; - this.trace("HTTP/2 stream closed with code " + http2Stream.rstCode); - if (((_a2 = this.finalStatus) === null || _a2 === void 0 ? void 0 : _a2.code) === constants_1.Status.OK) { - return; - } - let code; - let details = ""; - switch (http2Stream.rstCode) { - case http2.constants.NGHTTP2_NO_ERROR: - if (this.finalStatus !== null) { - return; - } - code = constants_1.Status.INTERNAL; - details = `Received RST_STREAM with code ${http2Stream.rstCode}`; - break; - case http2.constants.NGHTTP2_REFUSED_STREAM: - code = constants_1.Status.UNAVAILABLE; - details = "Stream refused by server"; - break; - case http2.constants.NGHTTP2_CANCEL: - code = constants_1.Status.CANCELLED; - details = "Call cancelled"; - break; - case http2.constants.NGHTTP2_ENHANCE_YOUR_CALM: - code = constants_1.Status.RESOURCE_EXHAUSTED; - details = "Bandwidth exhausted or memory limit exceeded"; - break; - case http2.constants.NGHTTP2_INADEQUATE_SECURITY: - code = constants_1.Status.PERMISSION_DENIED; - details = "Protocol not secure enough"; - break; - case http2.constants.NGHTTP2_INTERNAL_ERROR: - code = constants_1.Status.INTERNAL; - if (this.internalError === null) { - details = `Received RST_STREAM with code ${http2Stream.rstCode} (Internal server error)`; - } else { - if (this.internalError.code === "ECONNRESET" || this.internalError.code === "ETIMEDOUT") { - code = constants_1.Status.UNAVAILABLE; - details = this.internalError.message; - } else { - details = `Received RST_STREAM with code ${http2Stream.rstCode} triggered by internal client error: ${this.internalError.message}`; - } - } - break; - default: - code = constants_1.Status.INTERNAL; - details = `Received RST_STREAM with code ${http2Stream.rstCode}`; - } - this.endCall({ - code, - details, - metadata: new metadata_1.Metadata(), - rstCode: http2Stream.rstCode - }); - }); - }); - http2Stream.on("error", (err) => { - if (err.code !== "ERR_HTTP2_STREAM_ERROR") { - this.trace("Node error event: message=" + err.message + " code=" + err.code + " errno=" + getSystemErrorName(err.errno) + " syscall=" + err.syscall); - this.internalError = err; - } - this.callEventTracker.onStreamEnd(false); - }); - } - onDisconnect() { - this.endCall({ - code: constants_1.Status.UNAVAILABLE, - details: "Connection dropped", - metadata: new metadata_1.Metadata() - }); - } - outputStatus() { - if (!this.statusOutput) { - this.statusOutput = true; - this.trace("ended with status: code=" + this.finalStatus.code + ' details="' + this.finalStatus.details + '"'); - this.callEventTracker.onCallEnd(this.finalStatus); - process.nextTick(() => { - this.listener.onReceiveStatus(this.finalStatus); - }); - this.http2Stream.resume(); - } - } - trace(text) { - logging.trace(constants_2.LogVerbosity.DEBUG, TRACER_NAME, "[" + this.callId + "] " + text); - } - /** - * On first call, emits a 'status' event with the given StatusObject. - * Subsequent calls are no-ops. - * @param status The status of the call. - */ - endCall(status2) { - if (this.finalStatus === null || this.finalStatus.code === constants_1.Status.OK) { - this.finalStatus = status2; - this.maybeOutputStatus(); - } - this.destroyHttp2Stream(); - } - maybeOutputStatus() { - if (this.finalStatus !== null) { - if (this.finalStatus.code !== constants_1.Status.OK || this.readsClosed && this.unpushedReadMessages.length === 0 && !this.isReadFilterPending && !this.isPushPending) { - this.outputStatus(); - } - } - } - push(message) { - this.trace("pushing to reader message of length " + (message instanceof Buffer ? message.length : null)); - this.canPush = false; - this.isPushPending = true; - process.nextTick(() => { - this.isPushPending = false; - if (this.statusOutput) { - return; - } - this.listener.onReceiveMessage(message); - this.maybeOutputStatus(); - }); - } - tryPush(messageBytes) { - if (this.canPush) { - this.http2Stream.pause(); - this.push(messageBytes); - } else { - this.trace("unpushedReadMessages.push message of length " + messageBytes.length); - this.unpushedReadMessages.push(messageBytes); - } - } - handleTrailers(headers) { - this.callEventTracker.onStreamEnd(true); - let headersString = ""; - for (const header of Object.keys(headers)) { - headersString += " " + header + ": " + headers[header] + "\n"; - } - this.trace("Received server trailers:\n" + headersString); - let metadata; - try { - metadata = metadata_1.Metadata.fromHttp2Headers(headers); - } catch (e) { - metadata = new metadata_1.Metadata(); - } - const metadataMap = metadata.getMap(); - let code = this.mappedStatusCode; - if (code === constants_1.Status.UNKNOWN && typeof metadataMap["grpc-status"] === "string") { - const receivedStatus = Number(metadataMap["grpc-status"]); - if (receivedStatus in constants_1.Status) { - code = receivedStatus; - this.trace("received status code " + receivedStatus + " from server"); - } - metadata.remove("grpc-status"); - } - let details = ""; - if (typeof metadataMap["grpc-message"] === "string") { - try { - details = decodeURI(metadataMap["grpc-message"]); - } catch (e) { - details = metadataMap["grpc-message"]; - } - metadata.remove("grpc-message"); - this.trace('received status details string "' + details + '" from server'); - } - const status2 = { code, details, metadata }; - this.endCall(status2); - } - destroyHttp2Stream() { - var _a2; - if (!this.http2Stream.destroyed) { - let code; - if (((_a2 = this.finalStatus) === null || _a2 === void 0 ? void 0 : _a2.code) === constants_1.Status.OK) { - code = http2.constants.NGHTTP2_NO_ERROR; - } else { - code = http2.constants.NGHTTP2_CANCEL; - } - this.trace("close http2 stream with code " + code); - this.http2Stream.close(code); - } - } - cancelWithStatus(status2, details) { - this.trace("cancelWithStatus code: " + status2 + ' details: "' + details + '"'); - this.endCall({ code: status2, details, metadata: new metadata_1.Metadata() }); - } - getStatus() { - return this.finalStatus; - } - getPeer() { - return this.transport.getPeerName(); - } - getCallNumber() { - return this.callId; - } - startRead() { - if (this.finalStatus !== null && this.finalStatus.code !== constants_1.Status.OK) { - this.readsClosed = true; - this.maybeOutputStatus(); - return; - } - this.canPush = true; - if (this.unpushedReadMessages.length > 0) { - const nextMessage = this.unpushedReadMessages.shift(); - this.push(nextMessage); - return; - } - this.http2Stream.resume(); - } - sendMessageWithContext(context, message) { - this.trace("write() called with message of length " + message.length); - const cb = (error2) => { - var _a2; - let code = constants_1.Status.UNAVAILABLE; - if ((error2 === null || error2 === void 0 ? void 0 : error2.code) === "ERR_STREAM_WRITE_AFTER_END") { - code = constants_1.Status.INTERNAL; - } - if (error2) { - this.cancelWithStatus(code, `Write error: ${error2.message}`); - } - (_a2 = context.callback) === null || _a2 === void 0 ? void 0 : _a2.call(context); - }; - this.trace("sending data chunk of length " + message.length); - this.callEventTracker.addMessageSent(); - try { - this.http2Stream.write(message, cb); - } catch (error2) { - this.endCall({ - code: constants_1.Status.UNAVAILABLE, - details: `Write failed with error ${error2.message}`, - metadata: new metadata_1.Metadata() - }); - } - } - halfClose() { - this.trace("end() called"); - this.trace("calling end() on HTTP/2 stream"); - this.http2Stream.end(); - } - }; - exports2.Http2SubchannelCall = Http2SubchannelCall; - } -}); - -// node_modules/@grpc/grpc-js/build/src/call-number.js -var require_call_number = __commonJS({ - "node_modules/@grpc/grpc-js/build/src/call-number.js"(exports2) { - "use strict"; - Object.defineProperty(exports2, "__esModule", { value: true }); - exports2.getNextCallNumber = void 0; - var nextCallNumber = 0; - function getNextCallNumber() { - return nextCallNumber++; - } - exports2.getNextCallNumber = getNextCallNumber; - } -}); - -// node_modules/@grpc/grpc-js/package.json -var require_package2 = __commonJS({ - "node_modules/@grpc/grpc-js/package.json"(exports2, module2) { - module2.exports = { - name: "@grpc/grpc-js", - version: "1.9.0", - description: "gRPC Library for Node - pure JS implementation", - homepage: "https://grpc.io/", - repository: "https://github.com/grpc/grpc-node/tree/master/packages/grpc-js", - main: "build/src/index.js", - engines: { - node: "^8.13.0 || >=10.10.0" - }, - keywords: [], - author: { - name: "Google Inc." - }, - types: "build/src/index.d.ts", - license: "Apache-2.0", - devDependencies: { - "@types/gulp": "^4.0.6", - "@types/gulp-mocha": "0.0.32", - "@types/lodash": "^4.14.186", - "@types/mocha": "^5.2.6", - "@types/ncp": "^2.0.1", - "@types/pify": "^3.0.2", - "@types/semver": "^7.3.9", - "@typescript-eslint/eslint-plugin": "^5.59.11", - "@typescript-eslint/parser": "^5.59.11", - "@typescript-eslint/typescript-estree": "^5.59.11", - "clang-format": "^1.0.55", - eslint: "^8.42.0", - "eslint-config-prettier": "^8.8.0", - "eslint-plugin-node": "^11.1.0", - "eslint-plugin-prettier": "^4.2.1", - execa: "^2.0.3", - gulp: "^4.0.2", - "gulp-mocha": "^6.0.0", - lodash: "^4.17.4", - madge: "^5.0.1", - "mocha-jenkins-reporter": "^0.4.1", - ncp: "^2.0.0", - pify: "^4.0.1", - prettier: "^2.8.8", - rimraf: "^3.0.2", - semver: "^7.3.5", - "ts-node": "^10.9.1", - typescript: "^5.1.3" - }, - contributors: [ - { - name: "Google Inc." - } - ], - scripts: { - build: "npm run compile", - clean: "rimraf ./build", - compile: "tsc -p .", - format: 'clang-format -i -style="{Language: JavaScript, BasedOnStyle: Google, ColumnLimit: 80}" src/*.ts test/*.ts', - lint: "eslint src/*.ts test/*.ts", - prepare: "npm run generate-types && npm run compile", - test: "gulp test", - check: "npm run lint", - fix: "eslint --fix src/*.ts test/*.ts", - pretest: "npm run generate-types && npm run generate-test-types && npm run compile", - posttest: "npm run check && madge -c ./build/src", - "generate-types": "proto-loader-gen-types --keepCase --longs String --enums String --defaults --oneofs --includeComments --includeDirs proto/ --include-dirs test/fixtures/ -O src/generated/ --grpcLib ../index channelz.proto", - "generate-test-types": "proto-loader-gen-types --keepCase --longs String --enums String --defaults --oneofs --includeComments --include-dirs test/fixtures/ -O test/generated/ --grpcLib ../../src/index test_service.proto" - }, - dependencies: { - "@grpc/proto-loader": "^0.7.0", - "@types/node": ">=12.12.47" - }, - files: [ - "src/**/*.ts", - "build/src/**/*.{js,d.ts,js.map}", - "proto/*.proto", - "LICENSE", - "deps/envoy-api/envoy/api/v2/**/*.proto", - "deps/envoy-api/envoy/config/**/*.proto", - "deps/envoy-api/envoy/service/**/*.proto", - "deps/envoy-api/envoy/type/**/*.proto", - "deps/udpa/udpa/**/*.proto", - "deps/googleapis/google/api/*.proto", - "deps/googleapis/google/rpc/*.proto", - "deps/protoc-gen-validate/validate/**/*.proto" - ] - }; - } -}); - -// node_modules/@grpc/grpc-js/build/src/transport.js -var require_transport = __commonJS({ - "node_modules/@grpc/grpc-js/build/src/transport.js"(exports2) { - "use strict"; - Object.defineProperty(exports2, "__esModule", { value: true }); - exports2.Http2SubchannelConnector = void 0; - var http2 = require("http2"); - var tls_1 = require("tls"); - var channelz_1 = require_channelz(); - var constants_1 = require_constants(); - var http_proxy_1 = require_http_proxy(); - var logging = require_logging(); - var resolver_1 = require_resolver(); - var subchannel_address_1 = require_subchannel_address(); - var uri_parser_1 = require_uri_parser(); - var net = require("net"); - var subchannel_call_1 = require_subchannel_call(); - var call_number_1 = require_call_number(); - var TRACER_NAME = "transport"; - var FLOW_CONTROL_TRACER_NAME = "transport_flowctrl"; - var clientVersion = require_package2().version; - var { HTTP2_HEADER_AUTHORITY, HTTP2_HEADER_CONTENT_TYPE, HTTP2_HEADER_METHOD, HTTP2_HEADER_PATH, HTTP2_HEADER_TE, HTTP2_HEADER_USER_AGENT } = http2.constants; - var KEEPALIVE_TIMEOUT_MS = 2e4; - var tooManyPingsData = Buffer.from("too_many_pings", "ascii"); - var Http2Transport = class { - constructor(session, subchannelAddress, options2, remoteName) { - this.session = session; - this.remoteName = remoteName; - this.keepaliveTimeMs = -1; - this.keepaliveTimeoutMs = KEEPALIVE_TIMEOUT_MS; - this.keepaliveTimerId = null; - this.pendingSendKeepalivePing = false; - this.keepaliveTimeoutId = null; - this.keepaliveWithoutCalls = false; - this.activeCalls = /* @__PURE__ */ new Set(); - this.disconnectListeners = []; - this.disconnectHandled = false; - this.channelzEnabled = true; - this.streamTracker = new channelz_1.ChannelzCallTracker(); - this.keepalivesSent = 0; - this.messagesSent = 0; - this.messagesReceived = 0; - this.lastMessageSentTimestamp = null; - this.lastMessageReceivedTimestamp = null; - this.subchannelAddressString = (0, subchannel_address_1.subchannelAddressToString)(subchannelAddress); - if (options2["grpc.enable_channelz"] === 0) { - this.channelzEnabled = false; - } - this.channelzRef = (0, channelz_1.registerChannelzSocket)(this.subchannelAddressString, () => this.getChannelzInfo(), this.channelzEnabled); - this.userAgent = [ - options2["grpc.primary_user_agent"], - `grpc-node-js/${clientVersion}`, - options2["grpc.secondary_user_agent"] - ].filter((e) => e).join(" "); - if ("grpc.keepalive_time_ms" in options2) { - this.keepaliveTimeMs = options2["grpc.keepalive_time_ms"]; - } - if ("grpc.keepalive_timeout_ms" in options2) { - this.keepaliveTimeoutMs = options2["grpc.keepalive_timeout_ms"]; - } - if ("grpc.keepalive_permit_without_calls" in options2) { - this.keepaliveWithoutCalls = options2["grpc.keepalive_permit_without_calls"] === 1; - } else { - this.keepaliveWithoutCalls = false; - } - session.once("close", () => { - this.trace("session closed"); - this.stopKeepalivePings(); - this.handleDisconnect(); - }); - session.once("goaway", (errorCode, lastStreamID, opaqueData) => { - let tooManyPings = false; - if (errorCode === http2.constants.NGHTTP2_ENHANCE_YOUR_CALM && opaqueData.equals(tooManyPingsData)) { - tooManyPings = true; - } - this.trace("connection closed by GOAWAY with code " + errorCode); - this.reportDisconnectToOwner(tooManyPings); - }); - session.once("error", (error2) => { - this.trace("connection closed with error " + error2.message); - }); - if (logging.isTracerEnabled(TRACER_NAME)) { - session.on("remoteSettings", (settings) => { - this.trace("new settings received" + (this.session !== session ? " on the old connection" : "") + ": " + JSON.stringify(settings)); - }); - session.on("localSettings", (settings) => { - this.trace("local settings acknowledged by remote" + (this.session !== session ? " on the old connection" : "") + ": " + JSON.stringify(settings)); - }); - } - if (this.keepaliveWithoutCalls) { - this.maybeStartKeepalivePingTimer(); - } - } - getChannelzInfo() { - var _a2, _b, _c2; - const sessionSocket = this.session.socket; - const remoteAddress = sessionSocket.remoteAddress ? (0, subchannel_address_1.stringToSubchannelAddress)(sessionSocket.remoteAddress, sessionSocket.remotePort) : null; - const localAddress = sessionSocket.localAddress ? (0, subchannel_address_1.stringToSubchannelAddress)(sessionSocket.localAddress, sessionSocket.localPort) : null; - let tlsInfo; - if (this.session.encrypted) { - const tlsSocket = sessionSocket; - const cipherInfo = tlsSocket.getCipher(); - const certificate = tlsSocket.getCertificate(); - const peerCertificate = tlsSocket.getPeerCertificate(); - tlsInfo = { - cipherSuiteStandardName: (_a2 = cipherInfo.standardName) !== null && _a2 !== void 0 ? _a2 : null, - cipherSuiteOtherName: cipherInfo.standardName ? null : cipherInfo.name, - localCertificate: certificate && "raw" in certificate ? certificate.raw : null, - remoteCertificate: peerCertificate && "raw" in peerCertificate ? peerCertificate.raw : null - }; - } else { - tlsInfo = null; - } - const socketInfo = { - remoteAddress, - localAddress, - security: tlsInfo, - remoteName: this.remoteName, - streamsStarted: this.streamTracker.callsStarted, - streamsSucceeded: this.streamTracker.callsSucceeded, - streamsFailed: this.streamTracker.callsFailed, - messagesSent: this.messagesSent, - messagesReceived: this.messagesReceived, - keepAlivesSent: this.keepalivesSent, - lastLocalStreamCreatedTimestamp: this.streamTracker.lastCallStartedTimestamp, - lastRemoteStreamCreatedTimestamp: null, - lastMessageSentTimestamp: this.lastMessageSentTimestamp, - lastMessageReceivedTimestamp: this.lastMessageReceivedTimestamp, - localFlowControlWindow: (_b = this.session.state.localWindowSize) !== null && _b !== void 0 ? _b : null, - remoteFlowControlWindow: (_c2 = this.session.state.remoteWindowSize) !== null && _c2 !== void 0 ? _c2 : null - }; - return socketInfo; - } - trace(text) { - logging.trace(constants_1.LogVerbosity.DEBUG, TRACER_NAME, "(" + this.channelzRef.id + ") " + this.subchannelAddressString + " " + text); - } - keepaliveTrace(text) { - logging.trace(constants_1.LogVerbosity.DEBUG, "keepalive", "(" + this.channelzRef.id + ") " + this.subchannelAddressString + " " + text); - } - flowControlTrace(text) { - logging.trace(constants_1.LogVerbosity.DEBUG, FLOW_CONTROL_TRACER_NAME, "(" + this.channelzRef.id + ") " + this.subchannelAddressString + " " + text); - } - internalsTrace(text) { - logging.trace(constants_1.LogVerbosity.DEBUG, "transport_internals", "(" + this.channelzRef.id + ") " + this.subchannelAddressString + " " + text); - } - /** - * Indicate to the owner of this object that this transport should no longer - * be used. That happens if the connection drops, or if the server sends a - * GOAWAY. - * @param tooManyPings If true, this was triggered by a GOAWAY with data - * indicating that the session was closed becaues the client sent too many - * pings. - * @returns - */ - reportDisconnectToOwner(tooManyPings) { - if (this.disconnectHandled) { - return; - } - this.disconnectHandled = true; - this.disconnectListeners.forEach((listener) => listener(tooManyPings)); - } - /** - * Handle connection drops, but not GOAWAYs. - */ - handleDisconnect() { - this.reportDisconnectToOwner(false); - setImmediate(() => { - for (const call of this.activeCalls) { - call.onDisconnect(); - } - }); - } - addDisconnectListener(listener) { - this.disconnectListeners.push(listener); - } - clearKeepaliveTimer() { - if (!this.keepaliveTimerId) { - return; - } - clearTimeout(this.keepaliveTimerId); - this.keepaliveTimerId = null; - } - clearKeepaliveTimeout() { - if (!this.keepaliveTimeoutId) { - return; - } - clearTimeout(this.keepaliveTimeoutId); - this.keepaliveTimeoutId = null; - } - canSendPing() { - return this.keepaliveTimeMs > 0 && (this.keepaliveWithoutCalls || this.activeCalls.size > 0); - } - maybeSendPing() { - var _a2, _b; - this.clearKeepaliveTimer(); - if (!this.canSendPing()) { - this.pendingSendKeepalivePing = true; - return; - } - if (this.channelzEnabled) { - this.keepalivesSent += 1; - } - this.keepaliveTrace("Sending ping with timeout " + this.keepaliveTimeoutMs + "ms"); - if (!this.keepaliveTimeoutId) { - this.keepaliveTimeoutId = setTimeout(() => { - this.keepaliveTrace("Ping timeout passed without response"); - this.handleDisconnect(); - }, this.keepaliveTimeoutMs); - (_b = (_a2 = this.keepaliveTimeoutId).unref) === null || _b === void 0 ? void 0 : _b.call(_a2); - } - try { - this.session.ping((err, duration, payload) => { - this.keepaliveTrace("Received ping response"); - this.clearKeepaliveTimeout(); - this.maybeStartKeepalivePingTimer(); - }); - } catch (e) { - this.handleDisconnect(); - } - } - /** - * Starts the keepalive ping timer if appropriate. If the timer already ran - * out while there were no active requests, instead send a ping immediately. - * If the ping timer is already running or a ping is currently in flight, - * instead do nothing and wait for them to resolve. - */ - maybeStartKeepalivePingTimer() { - var _a2, _b; - if (!this.canSendPing()) { - return; - } - if (this.pendingSendKeepalivePing) { - this.pendingSendKeepalivePing = false; - this.maybeSendPing(); - } else if (!this.keepaliveTimerId && !this.keepaliveTimeoutId) { - this.keepaliveTrace("Starting keepalive timer for " + this.keepaliveTimeMs + "ms"); - this.keepaliveTimerId = (_b = (_a2 = setTimeout(() => { - this.maybeSendPing(); - }, this.keepaliveTimeMs)).unref) === null || _b === void 0 ? void 0 : _b.call(_a2); - } - } - stopKeepalivePings() { - if (this.keepaliveTimerId) { - clearTimeout(this.keepaliveTimerId); - this.keepaliveTimerId = null; - } - this.clearKeepaliveTimeout(); - } - removeActiveCall(call) { - this.activeCalls.delete(call); - if (this.activeCalls.size === 0) { - this.session.unref(); - } - } - addActiveCall(call) { - this.activeCalls.add(call); - if (this.activeCalls.size === 1) { - this.session.ref(); - if (!this.keepaliveWithoutCalls) { - this.maybeStartKeepalivePingTimer(); - } - } - } - createCall(metadata, host, method, listener, subchannelCallStatsTracker) { - const headers = metadata.toHttp2Headers(); - headers[HTTP2_HEADER_AUTHORITY] = host; - headers[HTTP2_HEADER_USER_AGENT] = this.userAgent; - headers[HTTP2_HEADER_CONTENT_TYPE] = "application/grpc"; - headers[HTTP2_HEADER_METHOD] = "POST"; - headers[HTTP2_HEADER_PATH] = method; - headers[HTTP2_HEADER_TE] = "trailers"; - let http2Stream; - try { - http2Stream = this.session.request(headers); - } catch (e) { - this.handleDisconnect(); - throw e; - } - this.flowControlTrace("local window size: " + this.session.state.localWindowSize + " remote window size: " + this.session.state.remoteWindowSize); - this.internalsTrace("session.closed=" + this.session.closed + " session.destroyed=" + this.session.destroyed + " session.socket.destroyed=" + this.session.socket.destroyed); - let eventTracker; - let call; - if (this.channelzEnabled) { - this.streamTracker.addCallStarted(); - eventTracker = { - addMessageSent: () => { - var _a2; - this.messagesSent += 1; - this.lastMessageSentTimestamp = /* @__PURE__ */ new Date(); - (_a2 = subchannelCallStatsTracker.addMessageSent) === null || _a2 === void 0 ? void 0 : _a2.call(subchannelCallStatsTracker); - }, - addMessageReceived: () => { - var _a2; - this.messagesReceived += 1; - this.lastMessageReceivedTimestamp = /* @__PURE__ */ new Date(); - (_a2 = subchannelCallStatsTracker.addMessageReceived) === null || _a2 === void 0 ? void 0 : _a2.call(subchannelCallStatsTracker); - }, - onCallEnd: (status2) => { - var _a2; - (_a2 = subchannelCallStatsTracker.onCallEnd) === null || _a2 === void 0 ? void 0 : _a2.call(subchannelCallStatsTracker, status2); - this.removeActiveCall(call); - }, - onStreamEnd: (success) => { - var _a2; - if (success) { - this.streamTracker.addCallSucceeded(); - } else { - this.streamTracker.addCallFailed(); - } - (_a2 = subchannelCallStatsTracker.onStreamEnd) === null || _a2 === void 0 ? void 0 : _a2.call(subchannelCallStatsTracker, success); - } - }; - } else { - eventTracker = { - addMessageSent: () => { - var _a2; - (_a2 = subchannelCallStatsTracker.addMessageSent) === null || _a2 === void 0 ? void 0 : _a2.call(subchannelCallStatsTracker); - }, - addMessageReceived: () => { - var _a2; - (_a2 = subchannelCallStatsTracker.addMessageReceived) === null || _a2 === void 0 ? void 0 : _a2.call(subchannelCallStatsTracker); - }, - onCallEnd: (status2) => { - var _a2; - (_a2 = subchannelCallStatsTracker.onCallEnd) === null || _a2 === void 0 ? void 0 : _a2.call(subchannelCallStatsTracker, status2); - this.removeActiveCall(call); - }, - onStreamEnd: (success) => { - var _a2; - (_a2 = subchannelCallStatsTracker.onStreamEnd) === null || _a2 === void 0 ? void 0 : _a2.call(subchannelCallStatsTracker, success); - } - }; - } - call = new subchannel_call_1.Http2SubchannelCall(http2Stream, eventTracker, listener, this, (0, call_number_1.getNextCallNumber)()); - this.addActiveCall(call); - return call; - } - getChannelzRef() { - return this.channelzRef; - } - getPeerName() { - return this.subchannelAddressString; - } - shutdown() { - this.session.close(); - (0, channelz_1.unregisterChannelzRef)(this.channelzRef); - } - }; - var Http2SubchannelConnector = class { - constructor(channelTarget) { - this.channelTarget = channelTarget; - this.session = null; - this.isShutdown = false; - } - trace(text) { - logging.trace(constants_1.LogVerbosity.DEBUG, TRACER_NAME, (0, uri_parser_1.uriToString)(this.channelTarget) + " " + text); - } - createSession(address, credentials2, options2, proxyConnectionResult) { - if (this.isShutdown) { - return Promise.reject(); - } - return new Promise((resolve, reject) => { - var _a2, _b, _c2; - let remoteName; - if (proxyConnectionResult.realTarget) { - remoteName = (0, uri_parser_1.uriToString)(proxyConnectionResult.realTarget); - this.trace("creating HTTP/2 session through proxy to " + (0, uri_parser_1.uriToString)(proxyConnectionResult.realTarget)); - } else { - remoteName = null; - this.trace("creating HTTP/2 session to " + (0, subchannel_address_1.subchannelAddressToString)(address)); - } - const targetAuthority = (0, resolver_1.getDefaultAuthority)((_a2 = proxyConnectionResult.realTarget) !== null && _a2 !== void 0 ? _a2 : this.channelTarget); - let connectionOptions = credentials2._getConnectionOptions() || {}; - connectionOptions.maxSendHeaderBlockLength = Number.MAX_SAFE_INTEGER; - if ("grpc-node.max_session_memory" in options2) { - connectionOptions.maxSessionMemory = options2["grpc-node.max_session_memory"]; - } else { - connectionOptions.maxSessionMemory = Number.MAX_SAFE_INTEGER; - } - let addressScheme = "http://"; - if ("secureContext" in connectionOptions) { - addressScheme = "https://"; - if (options2["grpc.ssl_target_name_override"]) { - const sslTargetNameOverride = options2["grpc.ssl_target_name_override"]; - connectionOptions.checkServerIdentity = (host, cert) => { - return (0, tls_1.checkServerIdentity)(sslTargetNameOverride, cert); - }; - connectionOptions.servername = sslTargetNameOverride; - } else { - const authorityHostname = (_c2 = (_b = (0, uri_parser_1.splitHostPort)(targetAuthority)) === null || _b === void 0 ? void 0 : _b.host) !== null && _c2 !== void 0 ? _c2 : "localhost"; - connectionOptions.servername = authorityHostname; - } - if (proxyConnectionResult.socket) { - connectionOptions.createConnection = (authority, option) => { - return proxyConnectionResult.socket; - }; - } - } else { - connectionOptions.createConnection = (authority, option) => { - if (proxyConnectionResult.socket) { - return proxyConnectionResult.socket; - } else { - return net.connect(address); - } - }; - } - connectionOptions = Object.assign(Object.assign(Object.assign({}, connectionOptions), address), { enableTrace: options2["grpc-node.tls_enable_trace"] === 1 }); - const session = http2.connect(addressScheme + targetAuthority, connectionOptions); - this.session = session; - session.unref(); - session.once("connect", () => { - session.removeAllListeners(); - resolve(new Http2Transport(session, address, options2, remoteName)); - this.session = null; - }); - session.once("close", () => { - this.session = null; - reject(); - }); - session.once("error", (error2) => { - this.trace("connection failed with error " + error2.message); - }); - }); - } - connect(address, credentials2, options2) { - var _a2, _b; - if (this.isShutdown) { - return Promise.reject(); - } - const connectionOptions = credentials2._getConnectionOptions() || {}; - if ("secureContext" in connectionOptions) { - connectionOptions.ALPNProtocols = ["h2"]; - if (options2["grpc.ssl_target_name_override"]) { - const sslTargetNameOverride = options2["grpc.ssl_target_name_override"]; - connectionOptions.checkServerIdentity = (host, cert) => { - return (0, tls_1.checkServerIdentity)(sslTargetNameOverride, cert); - }; - connectionOptions.servername = sslTargetNameOverride; - } else { - if ("grpc.http_connect_target" in options2) { - const targetPath = (0, resolver_1.getDefaultAuthority)((_a2 = (0, uri_parser_1.parseUri)(options2["grpc.http_connect_target"])) !== null && _a2 !== void 0 ? _a2 : { - path: "localhost" - }); - const hostPort = (0, uri_parser_1.splitHostPort)(targetPath); - connectionOptions.servername = (_b = hostPort === null || hostPort === void 0 ? void 0 : hostPort.host) !== null && _b !== void 0 ? _b : targetPath; - } - } - if (options2["grpc-node.tls_enable_trace"]) { - connectionOptions.enableTrace = true; - } - } - return (0, http_proxy_1.getProxiedConnection)(address, options2, connectionOptions).then((result) => this.createSession(address, credentials2, options2, result)); - } - shutdown() { - var _a2; - this.isShutdown = true; - (_a2 = this.session) === null || _a2 === void 0 ? void 0 : _a2.close(); - this.session = null; - } - }; - exports2.Http2SubchannelConnector = Http2SubchannelConnector; - } -}); - -// node_modules/@grpc/grpc-js/build/src/subchannel-pool.js -var require_subchannel_pool = __commonJS({ - "node_modules/@grpc/grpc-js/build/src/subchannel-pool.js"(exports2) { - "use strict"; - Object.defineProperty(exports2, "__esModule", { value: true }); - exports2.getSubchannelPool = exports2.SubchannelPool = void 0; - var channel_options_1 = require_channel_options(); - var subchannel_1 = require_subchannel(); - var subchannel_address_1 = require_subchannel_address(); - var uri_parser_1 = require_uri_parser(); - var transport_1 = require_transport(); - var REF_CHECK_INTERVAL = 1e4; - var SubchannelPool = class { - /** - * A pool of subchannels use for making connections. Subchannels with the - * exact same parameters will be reused. - */ - constructor() { - this.pool = /* @__PURE__ */ Object.create(null); - this.cleanupTimer = null; - } - /** - * Unrefs all unused subchannels and cancels the cleanup task if all - * subchannels have been unrefed. - */ - unrefUnusedSubchannels() { - let allSubchannelsUnrefed = true; - for (const channelTarget in this.pool) { - const subchannelObjArray = this.pool[channelTarget]; - const refedSubchannels = subchannelObjArray.filter((value) => !value.subchannel.unrefIfOneRef()); - if (refedSubchannels.length > 0) { - allSubchannelsUnrefed = false; - } - this.pool[channelTarget] = refedSubchannels; - } - if (allSubchannelsUnrefed && this.cleanupTimer !== null) { - clearInterval(this.cleanupTimer); - this.cleanupTimer = null; - } - } - /** - * Ensures that the cleanup task is spawned. - */ - ensureCleanupTask() { - var _a2, _b; - if (this.cleanupTimer === null) { - this.cleanupTimer = setInterval(() => { - this.unrefUnusedSubchannels(); - }, REF_CHECK_INTERVAL); - (_b = (_a2 = this.cleanupTimer).unref) === null || _b === void 0 ? void 0 : _b.call(_a2); - } - } - /** - * Get a subchannel if one already exists with exactly matching parameters. - * Otherwise, create and save a subchannel with those parameters. - * @param channelTarget - * @param subchannelTarget - * @param channelArguments - * @param channelCredentials - */ - getOrCreateSubchannel(channelTargetUri, subchannelTarget, channelArguments, channelCredentials) { - this.ensureCleanupTask(); - const channelTarget = (0, uri_parser_1.uriToString)(channelTargetUri); - if (channelTarget in this.pool) { - const subchannelObjArray = this.pool[channelTarget]; - for (const subchannelObj of subchannelObjArray) { - if ((0, subchannel_address_1.subchannelAddressEqual)(subchannelTarget, subchannelObj.subchannelAddress) && (0, channel_options_1.channelOptionsEqual)(channelArguments, subchannelObj.channelArguments) && channelCredentials._equals(subchannelObj.channelCredentials)) { - return subchannelObj.subchannel; - } - } - } - const subchannel = new subchannel_1.Subchannel(channelTargetUri, subchannelTarget, channelArguments, channelCredentials, new transport_1.Http2SubchannelConnector(channelTargetUri)); - if (!(channelTarget in this.pool)) { - this.pool[channelTarget] = []; - } - this.pool[channelTarget].push({ - subchannelAddress: subchannelTarget, - channelArguments, - channelCredentials, - subchannel - }); - subchannel.ref(); - return subchannel; - } - }; - exports2.SubchannelPool = SubchannelPool; - var globalSubchannelPool = new SubchannelPool(); - function getSubchannelPool(global2) { - if (global2) { - return globalSubchannelPool; - } else { - return new SubchannelPool(); - } - } - exports2.getSubchannelPool = getSubchannelPool; - } -}); - -// node_modules/@grpc/grpc-js/build/src/filter-stack.js -var require_filter_stack = __commonJS({ - "node_modules/@grpc/grpc-js/build/src/filter-stack.js"(exports2) { - "use strict"; - Object.defineProperty(exports2, "__esModule", { value: true }); - exports2.FilterStackFactory = exports2.FilterStack = void 0; - var FilterStack = class { - constructor(filters) { - this.filters = filters; - } - sendMetadata(metadata) { - let result = metadata; - for (let i = 0; i < this.filters.length; i++) { - result = this.filters[i].sendMetadata(result); - } - return result; - } - receiveMetadata(metadata) { - let result = metadata; - for (let i = this.filters.length - 1; i >= 0; i--) { - result = this.filters[i].receiveMetadata(result); - } - return result; - } - sendMessage(message) { - let result = message; - for (let i = 0; i < this.filters.length; i++) { - result = this.filters[i].sendMessage(result); - } - return result; - } - receiveMessage(message) { - let result = message; - for (let i = this.filters.length - 1; i >= 0; i--) { - result = this.filters[i].receiveMessage(result); - } - return result; - } - receiveTrailers(status2) { - let result = status2; - for (let i = this.filters.length - 1; i >= 0; i--) { - result = this.filters[i].receiveTrailers(result); - } - return result; - } - push(filters) { - this.filters.unshift(...filters); - } - getFilters() { - return this.filters; - } - }; - exports2.FilterStack = FilterStack; - var FilterStackFactory = class _FilterStackFactory { - constructor(factories) { - this.factories = factories; - } - push(filterFactories) { - this.factories.unshift(...filterFactories); - } - clone() { - return new _FilterStackFactory([...this.factories]); - } - createFilter() { - return new FilterStack(this.factories.map((factory) => factory.createFilter())); - } - }; - exports2.FilterStackFactory = FilterStackFactory; - } -}); - -// node_modules/@grpc/grpc-js/build/src/compression-algorithms.js -var require_compression_algorithms = __commonJS({ - "node_modules/@grpc/grpc-js/build/src/compression-algorithms.js"(exports2) { - "use strict"; - Object.defineProperty(exports2, "__esModule", { value: true }); - exports2.CompressionAlgorithms = void 0; - var CompressionAlgorithms; - (function(CompressionAlgorithms2) { - CompressionAlgorithms2[CompressionAlgorithms2["identity"] = 0] = "identity"; - CompressionAlgorithms2[CompressionAlgorithms2["deflate"] = 1] = "deflate"; - CompressionAlgorithms2[CompressionAlgorithms2["gzip"] = 2] = "gzip"; - })(CompressionAlgorithms || (exports2.CompressionAlgorithms = CompressionAlgorithms = {})); - } -}); - -// node_modules/@grpc/grpc-js/build/src/filter.js -var require_filter = __commonJS({ - "node_modules/@grpc/grpc-js/build/src/filter.js"(exports2) { - "use strict"; - Object.defineProperty(exports2, "__esModule", { value: true }); - exports2.BaseFilter = void 0; - var BaseFilter = class { - async sendMetadata(metadata) { - return metadata; - } - receiveMetadata(metadata) { - return metadata; - } - async sendMessage(message) { - return message; - } - async receiveMessage(message) { - return message; - } - receiveTrailers(status2) { - return status2; - } - }; - exports2.BaseFilter = BaseFilter; - } -}); - -// node_modules/@grpc/grpc-js/build/src/compression-filter.js -var require_compression_filter = __commonJS({ - "node_modules/@grpc/grpc-js/build/src/compression-filter.js"(exports2) { - "use strict"; - Object.defineProperty(exports2, "__esModule", { value: true }); - exports2.CompressionFilterFactory = exports2.CompressionFilter = void 0; - var zlib = require("zlib"); - var compression_algorithms_1 = require_compression_algorithms(); - var constants_1 = require_constants(); - var filter_1 = require_filter(); - var logging = require_logging(); - var isCompressionAlgorithmKey = (key) => { - return typeof key === "number" && typeof compression_algorithms_1.CompressionAlgorithms[key] === "string"; - }; - var CompressionHandler = class { - /** - * @param message Raw uncompressed message bytes - * @param compress Indicates whether the message should be compressed - * @return Framed message, compressed if applicable - */ - async writeMessage(message, compress) { - let messageBuffer = message; - if (compress) { - messageBuffer = await this.compressMessage(messageBuffer); - } - const output = Buffer.allocUnsafe(messageBuffer.length + 5); - output.writeUInt8(compress ? 1 : 0, 0); - output.writeUInt32BE(messageBuffer.length, 1); - messageBuffer.copy(output, 5); - return output; - } - /** - * @param data Framed message, possibly compressed - * @return Uncompressed message - */ - async readMessage(data) { - const compressed = data.readUInt8(0) === 1; - let messageBuffer = data.slice(5); - if (compressed) { - messageBuffer = await this.decompressMessage(messageBuffer); - } - return messageBuffer; - } - }; - var IdentityHandler = class extends CompressionHandler { - async compressMessage(message) { - return message; - } - async writeMessage(message, compress) { - const output = Buffer.allocUnsafe(message.length + 5); - output.writeUInt8(0, 0); - output.writeUInt32BE(message.length, 1); - message.copy(output, 5); - return output; - } - decompressMessage(message) { - return Promise.reject(new Error('Received compressed message but "grpc-encoding" header was identity')); - } - }; - var DeflateHandler = class extends CompressionHandler { - compressMessage(message) { - return new Promise((resolve, reject) => { - zlib.deflate(message, (err, output) => { - if (err) { - reject(err); - } else { - resolve(output); - } - }); - }); - } - decompressMessage(message) { - return new Promise((resolve, reject) => { - zlib.inflate(message, (err, output) => { - if (err) { - reject(err); - } else { - resolve(output); - } - }); - }); - } - }; - var GzipHandler = class extends CompressionHandler { - compressMessage(message) { - return new Promise((resolve, reject) => { - zlib.gzip(message, (err, output) => { - if (err) { - reject(err); - } else { - resolve(output); - } - }); - }); - } - decompressMessage(message) { - return new Promise((resolve, reject) => { - zlib.unzip(message, (err, output) => { - if (err) { - reject(err); - } else { - resolve(output); - } - }); - }); - } - }; - var UnknownHandler = class extends CompressionHandler { - constructor(compressionName) { - super(); - this.compressionName = compressionName; - } - compressMessage(message) { - return Promise.reject(new Error(`Received message compressed with unsupported compression method ${this.compressionName}`)); - } - decompressMessage(message) { - return Promise.reject(new Error(`Compression method not supported: ${this.compressionName}`)); - } - }; - function getCompressionHandler(compressionName) { - switch (compressionName) { - case "identity": - return new IdentityHandler(); - case "deflate": - return new DeflateHandler(); - case "gzip": - return new GzipHandler(); - default: - return new UnknownHandler(compressionName); - } - } - var CompressionFilter = class extends filter_1.BaseFilter { - constructor(channelOptions, sharedFilterConfig) { - var _a2; - super(); - this.sharedFilterConfig = sharedFilterConfig; - this.sendCompression = new IdentityHandler(); - this.receiveCompression = new IdentityHandler(); - this.currentCompressionAlgorithm = "identity"; - const compressionAlgorithmKey = channelOptions["grpc.default_compression_algorithm"]; - if (compressionAlgorithmKey !== void 0) { - if (isCompressionAlgorithmKey(compressionAlgorithmKey)) { - const clientSelectedEncoding = compression_algorithms_1.CompressionAlgorithms[compressionAlgorithmKey]; - const serverSupportedEncodings = (_a2 = sharedFilterConfig.serverSupportedEncodingHeader) === null || _a2 === void 0 ? void 0 : _a2.split(","); - if (!serverSupportedEncodings || serverSupportedEncodings.includes(clientSelectedEncoding)) { - this.currentCompressionAlgorithm = clientSelectedEncoding; - this.sendCompression = getCompressionHandler(this.currentCompressionAlgorithm); - } - } else { - logging.log(constants_1.LogVerbosity.ERROR, `Invalid value provided for grpc.default_compression_algorithm option: ${compressionAlgorithmKey}`); - } - } - } - async sendMetadata(metadata) { - const headers = await metadata; - headers.set("grpc-accept-encoding", "identity,deflate,gzip"); - headers.set("accept-encoding", "identity"); - if (this.currentCompressionAlgorithm === "identity") { - headers.remove("grpc-encoding"); - } else { - headers.set("grpc-encoding", this.currentCompressionAlgorithm); - } - return headers; - } - receiveMetadata(metadata) { - const receiveEncoding = metadata.get("grpc-encoding"); - if (receiveEncoding.length > 0) { - const encoding = receiveEncoding[0]; - if (typeof encoding === "string") { - this.receiveCompression = getCompressionHandler(encoding); - } - } - metadata.remove("grpc-encoding"); - const serverSupportedEncodingsHeader = metadata.get("grpc-accept-encoding")[0]; - if (serverSupportedEncodingsHeader) { - this.sharedFilterConfig.serverSupportedEncodingHeader = serverSupportedEncodingsHeader; - const serverSupportedEncodings = serverSupportedEncodingsHeader.split(","); - if (!serverSupportedEncodings.includes(this.currentCompressionAlgorithm)) { - this.sendCompression = new IdentityHandler(); - this.currentCompressionAlgorithm = "identity"; - } - } - metadata.remove("grpc-accept-encoding"); - return metadata; - } - async sendMessage(message) { - var _a2; - const resolvedMessage = await message; - let compress; - if (this.sendCompression instanceof IdentityHandler) { - compress = false; - } else { - compress = (((_a2 = resolvedMessage.flags) !== null && _a2 !== void 0 ? _a2 : 0) & 2) === 0; - } - return { - message: await this.sendCompression.writeMessage(resolvedMessage.message, compress), - flags: resolvedMessage.flags - }; - } - async receiveMessage(message) { - return this.receiveCompression.readMessage(await message); - } - }; - exports2.CompressionFilter = CompressionFilter; - var CompressionFilterFactory = class { - constructor(channel, options2) { - this.options = options2; - this.sharedFilterConfig = {}; - } - createFilter() { - return new CompressionFilter(this.options, this.sharedFilterConfig); - } - }; - exports2.CompressionFilterFactory = CompressionFilterFactory; - } -}); - -// node_modules/@grpc/grpc-js/build/src/max-message-size-filter.js -var require_max_message_size_filter = __commonJS({ - "node_modules/@grpc/grpc-js/build/src/max-message-size-filter.js"(exports2) { - "use strict"; - Object.defineProperty(exports2, "__esModule", { value: true }); - exports2.MaxMessageSizeFilterFactory = exports2.MaxMessageSizeFilter = void 0; - var filter_1 = require_filter(); - var constants_1 = require_constants(); - var metadata_1 = require_metadata(); - var MaxMessageSizeFilter = class extends filter_1.BaseFilter { - constructor(options2) { - super(); - this.maxSendMessageSize = constants_1.DEFAULT_MAX_SEND_MESSAGE_LENGTH; - this.maxReceiveMessageSize = constants_1.DEFAULT_MAX_RECEIVE_MESSAGE_LENGTH; - if ("grpc.max_send_message_length" in options2) { - this.maxSendMessageSize = options2["grpc.max_send_message_length"]; - } - if ("grpc.max_receive_message_length" in options2) { - this.maxReceiveMessageSize = options2["grpc.max_receive_message_length"]; - } - } - async sendMessage(message) { - if (this.maxSendMessageSize === -1) { - return message; - } else { - const concreteMessage = await message; - if (concreteMessage.message.length > this.maxSendMessageSize) { - throw { - code: constants_1.Status.RESOURCE_EXHAUSTED, - details: `Sent message larger than max (${concreteMessage.message.length} vs. ${this.maxSendMessageSize})`, - metadata: new metadata_1.Metadata() - }; - } else { - return concreteMessage; - } - } - } - async receiveMessage(message) { - if (this.maxReceiveMessageSize === -1) { - return message; - } else { - const concreteMessage = await message; - if (concreteMessage.length > this.maxReceiveMessageSize) { - throw { - code: constants_1.Status.RESOURCE_EXHAUSTED, - details: `Received message larger than max (${concreteMessage.length} vs. ${this.maxReceiveMessageSize})`, - metadata: new metadata_1.Metadata() - }; - } else { - return concreteMessage; - } - } - } - }; - exports2.MaxMessageSizeFilter = MaxMessageSizeFilter; - var MaxMessageSizeFilterFactory = class { - constructor(options2) { - this.options = options2; - } - createFilter() { - return new MaxMessageSizeFilter(this.options); - } - }; - exports2.MaxMessageSizeFilterFactory = MaxMessageSizeFilterFactory; - } -}); - -// node_modules/@grpc/grpc-js/build/src/deadline.js -var require_deadline = __commonJS({ - "node_modules/@grpc/grpc-js/build/src/deadline.js"(exports2) { - "use strict"; - Object.defineProperty(exports2, "__esModule", { value: true }); - exports2.deadlineToString = exports2.getRelativeTimeout = exports2.getDeadlineTimeoutString = exports2.minDeadline = void 0; - function minDeadline(...deadlineList) { - let minValue = Infinity; - for (const deadline of deadlineList) { - const deadlineMsecs = deadline instanceof Date ? deadline.getTime() : deadline; - if (deadlineMsecs < minValue) { - minValue = deadlineMsecs; - } - } - return minValue; - } - exports2.minDeadline = minDeadline; - var units = [ - ["m", 1], - ["S", 1e3], - ["M", 60 * 1e3], - ["H", 60 * 60 * 1e3] - ]; - function getDeadlineTimeoutString(deadline) { - const now = (/* @__PURE__ */ new Date()).getTime(); - if (deadline instanceof Date) { - deadline = deadline.getTime(); - } - const timeoutMs = Math.max(deadline - now, 0); - for (const [unit, factor] of units) { - const amount = timeoutMs / factor; - if (amount < 1e8) { - return String(Math.ceil(amount)) + unit; - } - } - throw new Error("Deadline is too far in the future"); - } - exports2.getDeadlineTimeoutString = getDeadlineTimeoutString; - var MAX_TIMEOUT_TIME = 2147483647; - function getRelativeTimeout(deadline) { - const deadlineMs = deadline instanceof Date ? deadline.getTime() : deadline; - const now = (/* @__PURE__ */ new Date()).getTime(); - const timeout = deadlineMs - now; - if (timeout < 0) { - return 0; - } else if (timeout > MAX_TIMEOUT_TIME) { - return Infinity; - } else { - return timeout; - } - } - exports2.getRelativeTimeout = getRelativeTimeout; - function deadlineToString(deadline) { - if (deadline instanceof Date) { - return deadline.toISOString(); - } else { - const dateDeadline = new Date(deadline); - if (Number.isNaN(dateDeadline.getTime())) { - return "" + deadline; - } else { - return dateDeadline.toISOString(); - } - } - } - exports2.deadlineToString = deadlineToString; - } -}); - -// node_modules/@grpc/grpc-js/build/src/control-plane-status.js -var require_control_plane_status = __commonJS({ - "node_modules/@grpc/grpc-js/build/src/control-plane-status.js"(exports2) { - "use strict"; - Object.defineProperty(exports2, "__esModule", { value: true }); - exports2.restrictControlPlaneStatusCode = void 0; - var constants_1 = require_constants(); - var INAPPROPRIATE_CONTROL_PLANE_CODES = [ - constants_1.Status.OK, - constants_1.Status.INVALID_ARGUMENT, - constants_1.Status.NOT_FOUND, - constants_1.Status.ALREADY_EXISTS, - constants_1.Status.FAILED_PRECONDITION, - constants_1.Status.ABORTED, - constants_1.Status.OUT_OF_RANGE, - constants_1.Status.DATA_LOSS - ]; - function restrictControlPlaneStatusCode(code, details) { - if (INAPPROPRIATE_CONTROL_PLANE_CODES.includes(code)) { - return { - code: constants_1.Status.INTERNAL, - details: `Invalid status from control plane: ${code} ${constants_1.Status[code]} ${details}` - }; - } else { - return { code, details }; - } - } - exports2.restrictControlPlaneStatusCode = restrictControlPlaneStatusCode; - } -}); - -// node_modules/@grpc/grpc-js/build/src/load-balancing-call.js -var require_load_balancing_call = __commonJS({ - "node_modules/@grpc/grpc-js/build/src/load-balancing-call.js"(exports2) { - "use strict"; - Object.defineProperty(exports2, "__esModule", { value: true }); - exports2.LoadBalancingCall = void 0; - var connectivity_state_1 = require_connectivity_state(); - var constants_1 = require_constants(); - var deadline_1 = require_deadline(); - var metadata_1 = require_metadata(); - var picker_1 = require_picker(); - var uri_parser_1 = require_uri_parser(); - var logging = require_logging(); - var control_plane_status_1 = require_control_plane_status(); - var http2 = require("http2"); - var TRACER_NAME = "load_balancing_call"; - var LoadBalancingCall = class { - constructor(channel, callConfig, methodName, host, credentials2, deadline, callNumber) { - var _a2, _b; - this.channel = channel; - this.callConfig = callConfig; - this.methodName = methodName; - this.host = host; - this.credentials = credentials2; - this.deadline = deadline; - this.callNumber = callNumber; - this.child = null; - this.readPending = false; - this.pendingMessage = null; - this.pendingHalfClose = false; - this.ended = false; - this.metadata = null; - this.listener = null; - this.onCallEnded = null; - const splitPath = this.methodName.split("/"); - let serviceName = ""; - if (splitPath.length >= 2) { - serviceName = splitPath[1]; - } - const hostname = (_b = (_a2 = (0, uri_parser_1.splitHostPort)(this.host)) === null || _a2 === void 0 ? void 0 : _a2.host) !== null && _b !== void 0 ? _b : "localhost"; - this.serviceUrl = `https://${hostname}/${serviceName}`; - } - trace(text) { - logging.trace(constants_1.LogVerbosity.DEBUG, TRACER_NAME, "[" + this.callNumber + "] " + text); - } - outputStatus(status2, progress) { - var _a2, _b; - if (!this.ended) { - this.ended = true; - this.trace("ended with status: code=" + status2.code + ' details="' + status2.details + '"'); - const finalStatus = Object.assign(Object.assign({}, status2), { progress }); - (_a2 = this.listener) === null || _a2 === void 0 ? void 0 : _a2.onReceiveStatus(finalStatus); - (_b = this.onCallEnded) === null || _b === void 0 ? void 0 : _b.call(this, finalStatus.code); - } - } - doPick() { - var _a2, _b; - if (this.ended) { - return; - } - if (!this.metadata) { - throw new Error("doPick called before start"); - } - this.trace("Pick called"); - const pickResult = this.channel.doPick(this.metadata, this.callConfig.pickInformation); - const subchannelString = pickResult.subchannel ? "(" + pickResult.subchannel.getChannelzRef().id + ") " + pickResult.subchannel.getAddress() : "" + pickResult.subchannel; - this.trace("Pick result: " + picker_1.PickResultType[pickResult.pickResultType] + " subchannel: " + subchannelString + " status: " + ((_a2 = pickResult.status) === null || _a2 === void 0 ? void 0 : _a2.code) + " " + ((_b = pickResult.status) === null || _b === void 0 ? void 0 : _b.details)); - switch (pickResult.pickResultType) { - case picker_1.PickResultType.COMPLETE: - this.credentials.generateMetadata({ service_url: this.serviceUrl }).then((credsMetadata) => { - var _a3, _b2, _c2; - const finalMetadata = this.metadata.clone(); - finalMetadata.merge(credsMetadata); - if (finalMetadata.get("authorization").length > 1) { - this.outputStatus({ - code: constants_1.Status.INTERNAL, - details: '"authorization" metadata cannot have multiple values', - metadata: new metadata_1.Metadata() - }, "PROCESSED"); - } - if (pickResult.subchannel.getConnectivityState() !== connectivity_state_1.ConnectivityState.READY) { - this.trace("Picked subchannel " + subchannelString + " has state " + connectivity_state_1.ConnectivityState[pickResult.subchannel.getConnectivityState()] + " after getting credentials metadata. Retrying pick"); - this.doPick(); - return; - } - if (this.deadline !== Infinity) { - finalMetadata.set("grpc-timeout", (0, deadline_1.getDeadlineTimeoutString)(this.deadline)); - } - try { - this.child = pickResult.subchannel.getRealSubchannel().createCall(finalMetadata, this.host, this.methodName, { - onReceiveMetadata: (metadata) => { - this.trace("Received metadata"); - this.listener.onReceiveMetadata(metadata); - }, - onReceiveMessage: (message) => { - this.trace("Received message"); - this.listener.onReceiveMessage(message); - }, - onReceiveStatus: (status2) => { - this.trace("Received status"); - if (status2.rstCode === http2.constants.NGHTTP2_REFUSED_STREAM) { - this.outputStatus(status2, "REFUSED"); - } else { - this.outputStatus(status2, "PROCESSED"); - } - } - }); - } catch (error2) { - this.trace("Failed to start call on picked subchannel " + subchannelString + " with error " + error2.message); - this.outputStatus({ - code: constants_1.Status.INTERNAL, - details: "Failed to start HTTP/2 stream with error " + error2.message, - metadata: new metadata_1.Metadata() - }, "NOT_STARTED"); - return; - } - (_b2 = (_a3 = this.callConfig).onCommitted) === null || _b2 === void 0 ? void 0 : _b2.call(_a3); - (_c2 = pickResult.onCallStarted) === null || _c2 === void 0 ? void 0 : _c2.call(pickResult); - this.onCallEnded = pickResult.onCallEnded; - this.trace("Created child call [" + this.child.getCallNumber() + "]"); - if (this.readPending) { - this.child.startRead(); - } - if (this.pendingMessage) { - this.child.sendMessageWithContext(this.pendingMessage.context, this.pendingMessage.message); - } - if (this.pendingHalfClose) { - this.child.halfClose(); - } - }, (error2) => { - const { code: code2, details: details2 } = (0, control_plane_status_1.restrictControlPlaneStatusCode)(typeof error2.code === "number" ? error2.code : constants_1.Status.UNKNOWN, `Getting metadata from plugin failed with error: ${error2.message}`); - this.outputStatus({ - code: code2, - details: details2, - metadata: new metadata_1.Metadata() - }, "PROCESSED"); - }); - break; - case picker_1.PickResultType.DROP: - const { code, details } = (0, control_plane_status_1.restrictControlPlaneStatusCode)(pickResult.status.code, pickResult.status.details); - setImmediate(() => { - this.outputStatus({ code, details, metadata: pickResult.status.metadata }, "DROP"); - }); - break; - case picker_1.PickResultType.TRANSIENT_FAILURE: - if (this.metadata.getOptions().waitForReady) { - this.channel.queueCallForPick(this); - } else { - const { code: code2, details: details2 } = (0, control_plane_status_1.restrictControlPlaneStatusCode)(pickResult.status.code, pickResult.status.details); - setImmediate(() => { - this.outputStatus({ code: code2, details: details2, metadata: pickResult.status.metadata }, "PROCESSED"); - }); - } - break; - case picker_1.PickResultType.QUEUE: - this.channel.queueCallForPick(this); - } - } - cancelWithStatus(status2, details) { - var _a2; - this.trace("cancelWithStatus code: " + status2 + ' details: "' + details + '"'); - (_a2 = this.child) === null || _a2 === void 0 ? void 0 : _a2.cancelWithStatus(status2, details); - this.outputStatus({ code: status2, details, metadata: new metadata_1.Metadata() }, "PROCESSED"); - } - getPeer() { - var _a2, _b; - return (_b = (_a2 = this.child) === null || _a2 === void 0 ? void 0 : _a2.getPeer()) !== null && _b !== void 0 ? _b : this.channel.getTarget(); - } - start(metadata, listener) { - this.trace("start called"); - this.listener = listener; - this.metadata = metadata; - this.doPick(); - } - sendMessageWithContext(context, message) { - this.trace("write() called with message of length " + message.length); - if (this.child) { - this.child.sendMessageWithContext(context, message); - } else { - this.pendingMessage = { context, message }; - } - } - startRead() { - this.trace("startRead called"); - if (this.child) { - this.child.startRead(); - } else { - this.readPending = true; - } - } - halfClose() { - this.trace("halfClose called"); - if (this.child) { - this.child.halfClose(); - } else { - this.pendingHalfClose = true; - } - } - setCredentials(credentials2) { - throw new Error("Method not implemented."); - } - getCallNumber() { - return this.callNumber; - } - }; - exports2.LoadBalancingCall = LoadBalancingCall; - } -}); - -// node_modules/@grpc/grpc-js/build/src/resolving-call.js -var require_resolving_call = __commonJS({ - "node_modules/@grpc/grpc-js/build/src/resolving-call.js"(exports2) { - "use strict"; - Object.defineProperty(exports2, "__esModule", { value: true }); - exports2.ResolvingCall = void 0; - var constants_1 = require_constants(); - var deadline_1 = require_deadline(); - var metadata_1 = require_metadata(); - var logging = require_logging(); - var control_plane_status_1 = require_control_plane_status(); - var TRACER_NAME = "resolving_call"; - var ResolvingCall = class { - constructor(channel, method, options2, filterStackFactory, credentials2, callNumber) { - this.channel = channel; - this.method = method; - this.filterStackFactory = filterStackFactory; - this.credentials = credentials2; - this.callNumber = callNumber; - this.child = null; - this.readPending = false; - this.pendingMessage = null; - this.pendingHalfClose = false; - this.ended = false; - this.readFilterPending = false; - this.writeFilterPending = false; - this.pendingChildStatus = null; - this.metadata = null; - this.listener = null; - this.statusWatchers = []; - this.deadlineTimer = setTimeout(() => { - }, 0); - this.filterStack = null; - this.deadline = options2.deadline; - this.host = options2.host; - if (options2.parentCall) { - if (options2.flags & constants_1.Propagate.CANCELLATION) { - options2.parentCall.on("cancelled", () => { - this.cancelWithStatus(constants_1.Status.CANCELLED, "Cancelled by parent call"); - }); - } - if (options2.flags & constants_1.Propagate.DEADLINE) { - this.trace("Propagating deadline from parent: " + options2.parentCall.getDeadline()); - this.deadline = (0, deadline_1.minDeadline)(this.deadline, options2.parentCall.getDeadline()); - } - } - this.trace("Created"); - this.runDeadlineTimer(); - } - trace(text) { - logging.trace(constants_1.LogVerbosity.DEBUG, TRACER_NAME, "[" + this.callNumber + "] " + text); - } - runDeadlineTimer() { - clearTimeout(this.deadlineTimer); - this.trace("Deadline: " + (0, deadline_1.deadlineToString)(this.deadline)); - const timeout = (0, deadline_1.getRelativeTimeout)(this.deadline); - if (timeout !== Infinity) { - this.trace("Deadline will be reached in " + timeout + "ms"); - const handleDeadline = () => { - this.cancelWithStatus(constants_1.Status.DEADLINE_EXCEEDED, "Deadline exceeded"); - }; - if (timeout <= 0) { - process.nextTick(handleDeadline); - } else { - this.deadlineTimer = setTimeout(handleDeadline, timeout); - } - } - } - outputStatus(status2) { - if (!this.ended) { - this.ended = true; - if (!this.filterStack) { - this.filterStack = this.filterStackFactory.createFilter(); - } - clearTimeout(this.deadlineTimer); - const filteredStatus = this.filterStack.receiveTrailers(status2); - this.trace("ended with status: code=" + filteredStatus.code + ' details="' + filteredStatus.details + '"'); - this.statusWatchers.forEach((watcher) => watcher(filteredStatus)); - process.nextTick(() => { - var _a2; - (_a2 = this.listener) === null || _a2 === void 0 ? void 0 : _a2.onReceiveStatus(filteredStatus); - }); - } - } - sendMessageOnChild(context, message) { - if (!this.child) { - throw new Error("sendMessageonChild called with child not populated"); - } - const child = this.child; - this.writeFilterPending = true; - this.filterStack.sendMessage(Promise.resolve({ message, flags: context.flags })).then((filteredMessage) => { - this.writeFilterPending = false; - child.sendMessageWithContext(context, filteredMessage.message); - if (this.pendingHalfClose) { - child.halfClose(); - } - }, (status2) => { - this.cancelWithStatus(status2.code, status2.details); - }); - } - getConfig() { - if (this.ended) { - return; - } - if (!this.metadata || !this.listener) { - throw new Error("getConfig called before start"); - } - const configResult = this.channel.getConfig(this.method, this.metadata); - if (configResult.type === "NONE") { - this.channel.queueCallForConfig(this); - return; - } else if (configResult.type === "ERROR") { - if (this.metadata.getOptions().waitForReady) { - this.channel.queueCallForConfig(this); - } else { - this.outputStatus(configResult.error); - } - return; - } - const config2 = configResult.config; - if (config2.status !== constants_1.Status.OK) { - const { code, details } = (0, control_plane_status_1.restrictControlPlaneStatusCode)(config2.status, "Failed to route call to method " + this.method); - this.outputStatus({ - code, - details, - metadata: new metadata_1.Metadata() - }); - return; - } - if (config2.methodConfig.timeout) { - const configDeadline = /* @__PURE__ */ new Date(); - configDeadline.setSeconds(configDeadline.getSeconds() + config2.methodConfig.timeout.seconds); - configDeadline.setMilliseconds(configDeadline.getMilliseconds() + config2.methodConfig.timeout.nanos / 1e6); - this.deadline = (0, deadline_1.minDeadline)(this.deadline, configDeadline); - this.runDeadlineTimer(); - } - this.filterStackFactory.push(config2.dynamicFilterFactories); - this.filterStack = this.filterStackFactory.createFilter(); - this.filterStack.sendMetadata(Promise.resolve(this.metadata)).then((filteredMetadata) => { - this.child = this.channel.createInnerCall(config2, this.method, this.host, this.credentials, this.deadline); - this.trace("Created child [" + this.child.getCallNumber() + "]"); - this.child.start(filteredMetadata, { - onReceiveMetadata: (metadata) => { - this.trace("Received metadata"); - this.listener.onReceiveMetadata(this.filterStack.receiveMetadata(metadata)); - }, - onReceiveMessage: (message) => { - this.trace("Received message"); - this.readFilterPending = true; - this.filterStack.receiveMessage(message).then((filteredMesssage) => { - this.trace("Finished filtering received message"); - this.readFilterPending = false; - this.listener.onReceiveMessage(filteredMesssage); - if (this.pendingChildStatus) { - this.outputStatus(this.pendingChildStatus); - } - }, (status2) => { - this.cancelWithStatus(status2.code, status2.details); - }); - }, - onReceiveStatus: (status2) => { - this.trace("Received status"); - if (this.readFilterPending) { - this.pendingChildStatus = status2; - } else { - this.outputStatus(status2); - } - } - }); - if (this.readPending) { - this.child.startRead(); - } - if (this.pendingMessage) { - this.sendMessageOnChild(this.pendingMessage.context, this.pendingMessage.message); - } else if (this.pendingHalfClose) { - this.child.halfClose(); - } - }, (status2) => { - this.outputStatus(status2); - }); - } - reportResolverError(status2) { - var _a2; - if ((_a2 = this.metadata) === null || _a2 === void 0 ? void 0 : _a2.getOptions().waitForReady) { - this.channel.queueCallForConfig(this); - } else { - this.outputStatus(status2); - } - } - cancelWithStatus(status2, details) { - var _a2; - this.trace("cancelWithStatus code: " + status2 + ' details: "' + details + '"'); - (_a2 = this.child) === null || _a2 === void 0 ? void 0 : _a2.cancelWithStatus(status2, details); - this.outputStatus({ - code: status2, - details, - metadata: new metadata_1.Metadata() - }); - } - getPeer() { - var _a2, _b; - return (_b = (_a2 = this.child) === null || _a2 === void 0 ? void 0 : _a2.getPeer()) !== null && _b !== void 0 ? _b : this.channel.getTarget(); - } - start(metadata, listener) { - this.trace("start called"); - this.metadata = metadata.clone(); - this.listener = listener; - this.getConfig(); - } - sendMessageWithContext(context, message) { - this.trace("write() called with message of length " + message.length); - if (this.child) { - this.sendMessageOnChild(context, message); - } else { - this.pendingMessage = { context, message }; - } - } - startRead() { - this.trace("startRead called"); - if (this.child) { - this.child.startRead(); - } else { - this.readPending = true; - } - } - halfClose() { - this.trace("halfClose called"); - if (this.child && !this.writeFilterPending) { - this.child.halfClose(); - } else { - this.pendingHalfClose = true; - } - } - setCredentials(credentials2) { - this.credentials = this.credentials.compose(credentials2); - } - addStatusWatcher(watcher) { - this.statusWatchers.push(watcher); - } - getCallNumber() { - return this.callNumber; - } - }; - exports2.ResolvingCall = ResolvingCall; - } -}); - -// node_modules/@grpc/grpc-js/build/src/retrying-call.js -var require_retrying_call = __commonJS({ - "node_modules/@grpc/grpc-js/build/src/retrying-call.js"(exports2) { - "use strict"; - Object.defineProperty(exports2, "__esModule", { value: true }); - exports2.RetryingCall = exports2.MessageBufferTracker = exports2.RetryThrottler = void 0; - var constants_1 = require_constants(); - var metadata_1 = require_metadata(); - var logging = require_logging(); - var TRACER_NAME = "retrying_call"; - var RetryThrottler = class { - constructor(maxTokens, tokenRatio, previousRetryThrottler) { - this.maxTokens = maxTokens; - this.tokenRatio = tokenRatio; - if (previousRetryThrottler) { - this.tokens = previousRetryThrottler.tokens * (maxTokens / previousRetryThrottler.maxTokens); - } else { - this.tokens = maxTokens; - } - } - addCallSucceeded() { - this.tokens = Math.max(this.tokens + this.tokenRatio, this.maxTokens); - } - addCallFailed() { - this.tokens = Math.min(this.tokens - 1, 0); - } - canRetryCall() { - return this.tokens > this.maxTokens / 2; - } - }; - exports2.RetryThrottler = RetryThrottler; - var MessageBufferTracker = class { - constructor(totalLimit, limitPerCall) { - this.totalLimit = totalLimit; - this.limitPerCall = limitPerCall; - this.totalAllocated = 0; - this.allocatedPerCall = /* @__PURE__ */ new Map(); - } - allocate(size, callId) { - var _a2; - const currentPerCall = (_a2 = this.allocatedPerCall.get(callId)) !== null && _a2 !== void 0 ? _a2 : 0; - if (this.limitPerCall - currentPerCall < size || this.totalLimit - this.totalAllocated < size) { - return false; - } - this.allocatedPerCall.set(callId, currentPerCall + size); - this.totalAllocated += size; - return true; - } - free(size, callId) { - var _a2; - if (this.totalAllocated < size) { - throw new Error(`Invalid buffer allocation state: call ${callId} freed ${size} > total allocated ${this.totalAllocated}`); - } - this.totalAllocated -= size; - const currentPerCall = (_a2 = this.allocatedPerCall.get(callId)) !== null && _a2 !== void 0 ? _a2 : 0; - if (currentPerCall < size) { - throw new Error(`Invalid buffer allocation state: call ${callId} freed ${size} > allocated for call ${currentPerCall}`); - } - this.allocatedPerCall.set(callId, currentPerCall - size); - } - freeAll(callId) { - var _a2; - const currentPerCall = (_a2 = this.allocatedPerCall.get(callId)) !== null && _a2 !== void 0 ? _a2 : 0; - if (this.totalAllocated < currentPerCall) { - throw new Error(`Invalid buffer allocation state: call ${callId} allocated ${currentPerCall} > total allocated ${this.totalAllocated}`); - } - this.totalAllocated -= currentPerCall; - this.allocatedPerCall.delete(callId); - } - }; - exports2.MessageBufferTracker = MessageBufferTracker; - var PREVIONS_RPC_ATTEMPTS_METADATA_KEY = "grpc-previous-rpc-attempts"; - var RetryingCall = class { - constructor(channel, callConfig, methodName, host, credentials2, deadline, callNumber, bufferTracker, retryThrottler) { - this.channel = channel; - this.callConfig = callConfig; - this.methodName = methodName; - this.host = host; - this.credentials = credentials2; - this.deadline = deadline; - this.callNumber = callNumber; - this.bufferTracker = bufferTracker; - this.retryThrottler = retryThrottler; - this.listener = null; - this.initialMetadata = null; - this.underlyingCalls = []; - this.writeBuffer = []; - this.writeBufferOffset = 0; - this.readStarted = false; - this.transparentRetryUsed = false; - this.attempts = 0; - this.hedgingTimer = null; - this.committedCallIndex = null; - this.initialRetryBackoffSec = 0; - this.nextRetryBackoffSec = 0; - if (callConfig.methodConfig.retryPolicy) { - this.state = "RETRY"; - const retryPolicy = callConfig.methodConfig.retryPolicy; - this.nextRetryBackoffSec = this.initialRetryBackoffSec = Number(retryPolicy.initialBackoff.substring(0, retryPolicy.initialBackoff.length - 1)); - } else if (callConfig.methodConfig.hedgingPolicy) { - this.state = "HEDGING"; - } else { - this.state = "TRANSPARENT_ONLY"; - } - } - getCallNumber() { - return this.callNumber; - } - trace(text) { - logging.trace(constants_1.LogVerbosity.DEBUG, TRACER_NAME, "[" + this.callNumber + "] " + text); - } - reportStatus(statusObject) { - this.trace("ended with status: code=" + statusObject.code + ' details="' + statusObject.details + '"'); - this.bufferTracker.freeAll(this.callNumber); - this.writeBufferOffset = this.writeBufferOffset + this.writeBuffer.length; - this.writeBuffer = []; - process.nextTick(() => { - var _a2; - (_a2 = this.listener) === null || _a2 === void 0 ? void 0 : _a2.onReceiveStatus({ - code: statusObject.code, - details: statusObject.details, - metadata: statusObject.metadata - }); - }); - } - cancelWithStatus(status2, details) { - this.trace("cancelWithStatus code: " + status2 + ' details: "' + details + '"'); - this.reportStatus({ code: status2, details, metadata: new metadata_1.Metadata() }); - for (const { call } of this.underlyingCalls) { - call.cancelWithStatus(status2, details); - } - } - getPeer() { - if (this.committedCallIndex !== null) { - return this.underlyingCalls[this.committedCallIndex].call.getPeer(); - } else { - return "unknown"; - } - } - getBufferEntry(messageIndex) { - var _a2; - return (_a2 = this.writeBuffer[messageIndex - this.writeBufferOffset]) !== null && _a2 !== void 0 ? _a2 : { - entryType: "FREED", - allocated: false - }; - } - getNextBufferIndex() { - return this.writeBufferOffset + this.writeBuffer.length; - } - clearSentMessages() { - if (this.state !== "COMMITTED") { - return; - } - const earliestNeededMessageIndex = this.underlyingCalls[this.committedCallIndex].nextMessageToSend; - for (let messageIndex = this.writeBufferOffset; messageIndex < earliestNeededMessageIndex; messageIndex++) { - const bufferEntry = this.getBufferEntry(messageIndex); - if (bufferEntry.allocated) { - this.bufferTracker.free(bufferEntry.message.message.length, this.callNumber); - } - } - this.writeBuffer = this.writeBuffer.slice(earliestNeededMessageIndex - this.writeBufferOffset); - this.writeBufferOffset = earliestNeededMessageIndex; - } - commitCall(index) { - if (this.state === "COMMITTED") { - return; - } - if (this.underlyingCalls[index].state === "COMPLETED") { - return; - } - this.trace("Committing call [" + this.underlyingCalls[index].call.getCallNumber() + "] at index " + index); - this.state = "COMMITTED"; - this.committedCallIndex = index; - for (let i = 0; i < this.underlyingCalls.length; i++) { - if (i === index) { - continue; - } - if (this.underlyingCalls[i].state === "COMPLETED") { - continue; - } - this.underlyingCalls[i].state = "COMPLETED"; - this.underlyingCalls[i].call.cancelWithStatus(constants_1.Status.CANCELLED, "Discarded in favor of other hedged attempt"); - } - this.clearSentMessages(); - } - commitCallWithMostMessages() { - if (this.state === "COMMITTED") { - return; - } - let mostMessages = -1; - let callWithMostMessages = -1; - for (const [index, childCall] of this.underlyingCalls.entries()) { - if (childCall.state === "ACTIVE" && childCall.nextMessageToSend > mostMessages) { - mostMessages = childCall.nextMessageToSend; - callWithMostMessages = index; - } - } - if (callWithMostMessages === -1) { - this.state = "TRANSPARENT_ONLY"; - } else { - this.commitCall(callWithMostMessages); - } - } - isStatusCodeInList(list, code) { - return list.some((value) => value === code || value.toString().toLowerCase() === constants_1.Status[code].toLowerCase()); - } - getNextRetryBackoffMs() { - var _a2; - const retryPolicy = (_a2 = this.callConfig) === null || _a2 === void 0 ? void 0 : _a2.methodConfig.retryPolicy; - if (!retryPolicy) { - return 0; - } - const nextBackoffMs = Math.random() * this.nextRetryBackoffSec * 1e3; - const maxBackoffSec = Number(retryPolicy.maxBackoff.substring(0, retryPolicy.maxBackoff.length - 1)); - this.nextRetryBackoffSec = Math.min(this.nextRetryBackoffSec * retryPolicy.backoffMultiplier, maxBackoffSec); - return nextBackoffMs; - } - maybeRetryCall(pushback, callback) { - if (this.state !== "RETRY") { - callback(false); - return; - } - const retryPolicy = this.callConfig.methodConfig.retryPolicy; - if (this.attempts >= Math.min(retryPolicy.maxAttempts, 5)) { - callback(false); - return; - } - let retryDelayMs; - if (pushback === null) { - retryDelayMs = this.getNextRetryBackoffMs(); - } else if (pushback < 0) { - this.state = "TRANSPARENT_ONLY"; - callback(false); - return; - } else { - retryDelayMs = pushback; - this.nextRetryBackoffSec = this.initialRetryBackoffSec; - } - setTimeout(() => { - var _a2, _b; - if (this.state !== "RETRY") { - callback(false); - return; - } - if ((_b = (_a2 = this.retryThrottler) === null || _a2 === void 0 ? void 0 : _a2.canRetryCall()) !== null && _b !== void 0 ? _b : true) { - callback(true); - this.attempts += 1; - this.startNewAttempt(); - } - }, retryDelayMs); - } - countActiveCalls() { - let count = 0; - for (const call of this.underlyingCalls) { - if ((call === null || call === void 0 ? void 0 : call.state) === "ACTIVE") { - count += 1; - } - } - return count; - } - handleProcessedStatus(status2, callIndex, pushback) { - var _a2, _b, _c2; - switch (this.state) { - case "COMMITTED": - case "TRANSPARENT_ONLY": - this.commitCall(callIndex); - this.reportStatus(status2); - break; - case "HEDGING": - if (this.isStatusCodeInList((_a2 = this.callConfig.methodConfig.hedgingPolicy.nonFatalStatusCodes) !== null && _a2 !== void 0 ? _a2 : [], status2.code)) { - (_b = this.retryThrottler) === null || _b === void 0 ? void 0 : _b.addCallFailed(); - let delayMs; - if (pushback === null) { - delayMs = 0; - } else if (pushback < 0) { - this.state = "TRANSPARENT_ONLY"; - this.commitCall(callIndex); - this.reportStatus(status2); - return; - } else { - delayMs = pushback; - } - setTimeout(() => { - this.maybeStartHedgingAttempt(); - if (this.countActiveCalls() === 0) { - this.commitCall(callIndex); - this.reportStatus(status2); - } - }, delayMs); - } else { - this.commitCall(callIndex); - this.reportStatus(status2); - } - break; - case "RETRY": - if (this.isStatusCodeInList(this.callConfig.methodConfig.retryPolicy.retryableStatusCodes, status2.code)) { - (_c2 = this.retryThrottler) === null || _c2 === void 0 ? void 0 : _c2.addCallFailed(); - this.maybeRetryCall(pushback, (retried) => { - if (!retried) { - this.commitCall(callIndex); - this.reportStatus(status2); - } - }); - } else { - this.commitCall(callIndex); - this.reportStatus(status2); - } - break; - } - } - getPushback(metadata) { - const mdValue = metadata.get("grpc-retry-pushback-ms"); - if (mdValue.length === 0) { - return null; - } - try { - return parseInt(mdValue[0]); - } catch (e) { - return -1; - } - } - handleChildStatus(status2, callIndex) { - var _a2; - if (this.underlyingCalls[callIndex].state === "COMPLETED") { - return; - } - this.trace("state=" + this.state + " handling status with progress " + status2.progress + " from child [" + this.underlyingCalls[callIndex].call.getCallNumber() + "] in state " + this.underlyingCalls[callIndex].state); - this.underlyingCalls[callIndex].state = "COMPLETED"; - if (status2.code === constants_1.Status.OK) { - (_a2 = this.retryThrottler) === null || _a2 === void 0 ? void 0 : _a2.addCallSucceeded(); - this.commitCall(callIndex); - this.reportStatus(status2); - return; - } - if (this.state === "COMMITTED") { - this.reportStatus(status2); - return; - } - const pushback = this.getPushback(status2.metadata); - switch (status2.progress) { - case "NOT_STARTED": - this.startNewAttempt(); - break; - case "REFUSED": - if (this.transparentRetryUsed) { - this.handleProcessedStatus(status2, callIndex, pushback); - } else { - this.transparentRetryUsed = true; - this.startNewAttempt(); - } - break; - case "DROP": - this.commitCall(callIndex); - this.reportStatus(status2); - break; - case "PROCESSED": - this.handleProcessedStatus(status2, callIndex, pushback); - break; - } - } - maybeStartHedgingAttempt() { - if (this.state !== "HEDGING") { - return; - } - if (!this.callConfig.methodConfig.hedgingPolicy) { - return; - } - const hedgingPolicy = this.callConfig.methodConfig.hedgingPolicy; - if (this.attempts >= Math.min(hedgingPolicy.maxAttempts, 5)) { - return; - } - this.attempts += 1; - this.startNewAttempt(); - this.maybeStartHedgingTimer(); - } - maybeStartHedgingTimer() { - var _a2, _b, _c2; - if (this.hedgingTimer) { - clearTimeout(this.hedgingTimer); - } - if (this.state !== "HEDGING") { - return; - } - if (!this.callConfig.methodConfig.hedgingPolicy) { - return; - } - const hedgingPolicy = this.callConfig.methodConfig.hedgingPolicy; - if (this.attempts >= Math.min(hedgingPolicy.maxAttempts, 5)) { - return; - } - const hedgingDelayString = (_a2 = hedgingPolicy.hedgingDelay) !== null && _a2 !== void 0 ? _a2 : "0s"; - const hedgingDelaySec = Number(hedgingDelayString.substring(0, hedgingDelayString.length - 1)); - this.hedgingTimer = setTimeout(() => { - this.maybeStartHedgingAttempt(); - }, hedgingDelaySec * 1e3); - (_c2 = (_b = this.hedgingTimer).unref) === null || _c2 === void 0 ? void 0 : _c2.call(_b); - } - startNewAttempt() { - const child = this.channel.createLoadBalancingCall(this.callConfig, this.methodName, this.host, this.credentials, this.deadline); - this.trace("Created child call [" + child.getCallNumber() + "] for attempt " + this.attempts); - const index = this.underlyingCalls.length; - this.underlyingCalls.push({ - state: "ACTIVE", - call: child, - nextMessageToSend: 0 - }); - const previousAttempts = this.attempts - 1; - const initialMetadata = this.initialMetadata.clone(); - if (previousAttempts > 0) { - initialMetadata.set(PREVIONS_RPC_ATTEMPTS_METADATA_KEY, `${previousAttempts}`); - } - let receivedMetadata = false; - child.start(initialMetadata, { - onReceiveMetadata: (metadata) => { - this.trace("Received metadata from child [" + child.getCallNumber() + "]"); - this.commitCall(index); - receivedMetadata = true; - if (previousAttempts > 0) { - metadata.set(PREVIONS_RPC_ATTEMPTS_METADATA_KEY, `${previousAttempts}`); - } - if (this.underlyingCalls[index].state === "ACTIVE") { - this.listener.onReceiveMetadata(metadata); - } - }, - onReceiveMessage: (message) => { - this.trace("Received message from child [" + child.getCallNumber() + "]"); - this.commitCall(index); - if (this.underlyingCalls[index].state === "ACTIVE") { - this.listener.onReceiveMessage(message); - } - }, - onReceiveStatus: (status2) => { - this.trace("Received status from child [" + child.getCallNumber() + "]"); - if (!receivedMetadata && previousAttempts > 0) { - status2.metadata.set(PREVIONS_RPC_ATTEMPTS_METADATA_KEY, `${previousAttempts}`); - } - this.handleChildStatus(status2, index); - } - }); - this.sendNextChildMessage(index); - if (this.readStarted) { - child.startRead(); - } - } - start(metadata, listener) { - this.trace("start called"); - this.listener = listener; - this.initialMetadata = metadata; - this.attempts += 1; - this.startNewAttempt(); - this.maybeStartHedgingTimer(); - } - handleChildWriteCompleted(childIndex) { - var _a2, _b; - const childCall = this.underlyingCalls[childIndex]; - const messageIndex = childCall.nextMessageToSend; - (_b = (_a2 = this.getBufferEntry(messageIndex)).callback) === null || _b === void 0 ? void 0 : _b.call(_a2); - this.clearSentMessages(); - childCall.nextMessageToSend += 1; - this.sendNextChildMessage(childIndex); - } - sendNextChildMessage(childIndex) { - const childCall = this.underlyingCalls[childIndex]; - if (childCall.state === "COMPLETED") { - return; - } - if (this.getBufferEntry(childCall.nextMessageToSend)) { - const bufferEntry = this.getBufferEntry(childCall.nextMessageToSend); - switch (bufferEntry.entryType) { - case "MESSAGE": - childCall.call.sendMessageWithContext({ - callback: (error2) => { - this.handleChildWriteCompleted(childIndex); - } - }, bufferEntry.message.message); - break; - case "HALF_CLOSE": - childCall.nextMessageToSend += 1; - childCall.call.halfClose(); - break; - case "FREED": - break; - } - } - } - sendMessageWithContext(context, message) { - var _a2; - this.trace("write() called with message of length " + message.length); - const writeObj = { - message, - flags: context.flags - }; - const messageIndex = this.getNextBufferIndex(); - const bufferEntry = { - entryType: "MESSAGE", - message: writeObj, - allocated: this.bufferTracker.allocate(message.length, this.callNumber) - }; - this.writeBuffer.push(bufferEntry); - if (bufferEntry.allocated) { - (_a2 = context.callback) === null || _a2 === void 0 ? void 0 : _a2.call(context); - for (const [callIndex, call] of this.underlyingCalls.entries()) { - if (call.state === "ACTIVE" && call.nextMessageToSend === messageIndex) { - call.call.sendMessageWithContext({ - callback: (error2) => { - this.handleChildWriteCompleted(callIndex); - } - }, message); - } - } - } else { - this.commitCallWithMostMessages(); - if (this.committedCallIndex === null) { - return; - } - const call = this.underlyingCalls[this.committedCallIndex]; - bufferEntry.callback = context.callback; - if (call.state === "ACTIVE" && call.nextMessageToSend === messageIndex) { - call.call.sendMessageWithContext({ - callback: (error2) => { - this.handleChildWriteCompleted(this.committedCallIndex); - } - }, message); - } - } - } - startRead() { - this.trace("startRead called"); - this.readStarted = true; - for (const underlyingCall of this.underlyingCalls) { - if ((underlyingCall === null || underlyingCall === void 0 ? void 0 : underlyingCall.state) === "ACTIVE") { - underlyingCall.call.startRead(); - } - } - } - halfClose() { - this.trace("halfClose called"); - const halfCloseIndex = this.getNextBufferIndex(); - this.writeBuffer.push({ - entryType: "HALF_CLOSE", - allocated: false - }); - for (const call of this.underlyingCalls) { - if ((call === null || call === void 0 ? void 0 : call.state) === "ACTIVE" && call.nextMessageToSend === halfCloseIndex) { - call.nextMessageToSend += 1; - call.call.halfClose(); - } - } - } - setCredentials(newCredentials) { - throw new Error("Method not implemented."); - } - getMethod() { - return this.methodName; - } - getHost() { - return this.host; - } - }; - exports2.RetryingCall = RetryingCall; - } -}); - -// node_modules/@grpc/grpc-js/build/src/subchannel-interface.js -var require_subchannel_interface = __commonJS({ - "node_modules/@grpc/grpc-js/build/src/subchannel-interface.js"(exports2) { - "use strict"; - Object.defineProperty(exports2, "__esModule", { value: true }); - exports2.BaseSubchannelWrapper = void 0; - var BaseSubchannelWrapper = class { - constructor(child) { - this.child = child; - } - getConnectivityState() { - return this.child.getConnectivityState(); - } - addConnectivityStateListener(listener) { - this.child.addConnectivityStateListener(listener); - } - removeConnectivityStateListener(listener) { - this.child.removeConnectivityStateListener(listener); - } - startConnecting() { - this.child.startConnecting(); - } - getAddress() { - return this.child.getAddress(); - } - throttleKeepalive(newKeepaliveTime) { - this.child.throttleKeepalive(newKeepaliveTime); - } - ref() { - this.child.ref(); - } - unref() { - this.child.unref(); - } - getChannelzRef() { - return this.child.getChannelzRef(); - } - getRealSubchannel() { - return this.child.getRealSubchannel(); - } - realSubchannelEquals(other) { - return this.getRealSubchannel() === other.getRealSubchannel(); - } - }; - exports2.BaseSubchannelWrapper = BaseSubchannelWrapper; - } -}); - -// node_modules/@grpc/grpc-js/build/src/internal-channel.js -var require_internal_channel = __commonJS({ - "node_modules/@grpc/grpc-js/build/src/internal-channel.js"(exports2) { - "use strict"; - Object.defineProperty(exports2, "__esModule", { value: true }); - exports2.InternalChannel = void 0; - var channel_credentials_1 = require_channel_credentials(); - var resolving_load_balancer_1 = require_resolving_load_balancer(); - var subchannel_pool_1 = require_subchannel_pool(); - var picker_1 = require_picker(); - var constants_1 = require_constants(); - var filter_stack_1 = require_filter_stack(); - var compression_filter_1 = require_compression_filter(); - var resolver_1 = require_resolver(); - var logging_1 = require_logging(); - var max_message_size_filter_1 = require_max_message_size_filter(); - var http_proxy_1 = require_http_proxy(); - var uri_parser_1 = require_uri_parser(); - var connectivity_state_1 = require_connectivity_state(); - var channelz_1 = require_channelz(); - var load_balancing_call_1 = require_load_balancing_call(); - var deadline_1 = require_deadline(); - var resolving_call_1 = require_resolving_call(); - var call_number_1 = require_call_number(); - var control_plane_status_1 = require_control_plane_status(); - var retrying_call_1 = require_retrying_call(); - var subchannel_interface_1 = require_subchannel_interface(); - var MAX_TIMEOUT_TIME = 2147483647; - var MIN_IDLE_TIMEOUT_MS = 1e3; - var DEFAULT_IDLE_TIMEOUT_MS = 30 * 60 * 1e3; - var RETRY_THROTTLER_MAP = /* @__PURE__ */ new Map(); - var DEFAULT_RETRY_BUFFER_SIZE_BYTES = 1 << 24; - var DEFAULT_PER_RPC_RETRY_BUFFER_SIZE_BYTES = 1 << 20; - var ChannelSubchannelWrapper = class extends subchannel_interface_1.BaseSubchannelWrapper { - constructor(childSubchannel, channel) { - super(childSubchannel); - this.channel = channel; - this.refCount = 0; - this.subchannelStateListener = (subchannel, previousState, newState, keepaliveTime) => { - channel.throttleKeepalive(keepaliveTime); - }; - childSubchannel.addConnectivityStateListener(this.subchannelStateListener); - } - ref() { - this.child.ref(); - this.refCount += 1; - } - unref() { - this.child.unref(); - this.refCount -= 1; - if (this.refCount <= 0) { - this.child.removeConnectivityStateListener(this.subchannelStateListener); - this.channel.removeWrappedSubchannel(this); - } - } - }; - var InternalChannel = class { - constructor(target, credentials2, options2) { - var _a2, _b, _c2, _d, _e2, _f, _g, _h; - this.credentials = credentials2; - this.options = options2; - this.connectivityState = connectivity_state_1.ConnectivityState.IDLE; - this.currentPicker = new picker_1.UnavailablePicker(); - this.configSelectionQueue = []; - this.pickQueue = []; - this.connectivityStateWatchers = []; - this.configSelector = null; - this.currentResolutionError = null; - this.wrappedSubchannels = /* @__PURE__ */ new Set(); - this.callCount = 0; - this.idleTimer = null; - this.channelzEnabled = true; - this.callTracker = new channelz_1.ChannelzCallTracker(); - this.childrenTracker = new channelz_1.ChannelzChildrenTracker(); - if (typeof target !== "string") { - throw new TypeError("Channel target must be a string"); - } - if (!(credentials2 instanceof channel_credentials_1.ChannelCredentials)) { - throw new TypeError("Channel credentials must be a ChannelCredentials object"); - } - if (options2) { - if (typeof options2 !== "object") { - throw new TypeError("Channel options must be an object"); - } - } - this.originalTarget = target; - const originalTargetUri = (0, uri_parser_1.parseUri)(target); - if (originalTargetUri === null) { - throw new Error(`Could not parse target name "${target}"`); - } - const defaultSchemeMapResult = (0, resolver_1.mapUriDefaultScheme)(originalTargetUri); - if (defaultSchemeMapResult === null) { - throw new Error(`Could not find a default scheme for target name "${target}"`); - } - this.callRefTimer = setInterval(() => { - }, MAX_TIMEOUT_TIME); - (_b = (_a2 = this.callRefTimer).unref) === null || _b === void 0 ? void 0 : _b.call(_a2); - if (this.options["grpc.enable_channelz"] === 0) { - this.channelzEnabled = false; - } - this.channelzTrace = new channelz_1.ChannelzTrace(); - this.channelzRef = (0, channelz_1.registerChannelzChannel)(target, () => this.getChannelzInfo(), this.channelzEnabled); - if (this.channelzEnabled) { - this.channelzTrace.addTrace("CT_INFO", "Channel created"); - } - if (this.options["grpc.default_authority"]) { - this.defaultAuthority = this.options["grpc.default_authority"]; - } else { - this.defaultAuthority = (0, resolver_1.getDefaultAuthority)(defaultSchemeMapResult); - } - const proxyMapResult = (0, http_proxy_1.mapProxyName)(defaultSchemeMapResult, options2); - this.target = proxyMapResult.target; - this.options = Object.assign({}, this.options, proxyMapResult.extraOptions); - this.subchannelPool = (0, subchannel_pool_1.getSubchannelPool)(((_c2 = options2["grpc.use_local_subchannel_pool"]) !== null && _c2 !== void 0 ? _c2 : 0) === 0); - this.retryBufferTracker = new retrying_call_1.MessageBufferTracker((_d = options2["grpc.retry_buffer_size"]) !== null && _d !== void 0 ? _d : DEFAULT_RETRY_BUFFER_SIZE_BYTES, (_e2 = options2["grpc.per_rpc_retry_buffer_size"]) !== null && _e2 !== void 0 ? _e2 : DEFAULT_PER_RPC_RETRY_BUFFER_SIZE_BYTES); - this.keepaliveTime = (_f = options2["grpc.keepalive_time_ms"]) !== null && _f !== void 0 ? _f : -1; - this.idleTimeoutMs = Math.max((_g = options2["grpc.client_idle_timeout_ms"]) !== null && _g !== void 0 ? _g : DEFAULT_IDLE_TIMEOUT_MS, MIN_IDLE_TIMEOUT_MS); - const channelControlHelper = { - createSubchannel: (subchannelAddress, subchannelArgs) => { - const subchannel = this.subchannelPool.getOrCreateSubchannel(this.target, subchannelAddress, Object.assign({}, this.options, subchannelArgs), this.credentials); - subchannel.throttleKeepalive(this.keepaliveTime); - if (this.channelzEnabled) { - this.channelzTrace.addTrace("CT_INFO", "Created subchannel or used existing subchannel", subchannel.getChannelzRef()); - } - const wrappedSubchannel = new ChannelSubchannelWrapper(subchannel, this); - this.wrappedSubchannels.add(wrappedSubchannel); - return wrappedSubchannel; - }, - updateState: (connectivityState, picker) => { - this.currentPicker = picker; - const queueCopy = this.pickQueue.slice(); - this.pickQueue = []; - this.callRefTimerUnref(); - for (const call of queueCopy) { - call.doPick(); - } - this.updateState(connectivityState); - }, - requestReresolution: () => { - throw new Error("Resolving load balancer should never call requestReresolution"); - }, - addChannelzChild: (child) => { - if (this.channelzEnabled) { - this.childrenTracker.refChild(child); - } - }, - removeChannelzChild: (child) => { - if (this.channelzEnabled) { - this.childrenTracker.unrefChild(child); - } - } - }; - this.resolvingLoadBalancer = new resolving_load_balancer_1.ResolvingLoadBalancer(this.target, channelControlHelper, options2, (serviceConfig, configSelector) => { - if (serviceConfig.retryThrottling) { - RETRY_THROTTLER_MAP.set(this.getTarget(), new retrying_call_1.RetryThrottler(serviceConfig.retryThrottling.maxTokens, serviceConfig.retryThrottling.tokenRatio, RETRY_THROTTLER_MAP.get(this.getTarget()))); - } else { - RETRY_THROTTLER_MAP.delete(this.getTarget()); - } - if (this.channelzEnabled) { - this.channelzTrace.addTrace("CT_INFO", "Address resolution succeeded"); - } - this.configSelector = configSelector; - this.currentResolutionError = null; - process.nextTick(() => { - const localQueue = this.configSelectionQueue; - this.configSelectionQueue = []; - this.callRefTimerUnref(); - for (const call of localQueue) { - call.getConfig(); - } - this.configSelectionQueue = []; - }); - }, (status2) => { - if (this.channelzEnabled) { - this.channelzTrace.addTrace("CT_WARNING", "Address resolution failed with code " + status2.code + ' and details "' + status2.details + '"'); - } - if (this.configSelectionQueue.length > 0) { - this.trace("Name resolution failed with calls queued for config selection"); - } - if (this.configSelector === null) { - this.currentResolutionError = Object.assign(Object.assign({}, (0, control_plane_status_1.restrictControlPlaneStatusCode)(status2.code, status2.details)), { metadata: status2.metadata }); - } - const localQueue = this.configSelectionQueue; - this.configSelectionQueue = []; - this.callRefTimerUnref(); - for (const call of localQueue) { - call.reportResolverError(status2); - } - }); - this.filterStackFactory = new filter_stack_1.FilterStackFactory([ - new max_message_size_filter_1.MaxMessageSizeFilterFactory(this.options), - new compression_filter_1.CompressionFilterFactory(this, this.options) - ]); - this.trace("Channel constructed with options " + JSON.stringify(options2, void 0, 2)); - const error2 = new Error(); - (0, logging_1.trace)(constants_1.LogVerbosity.DEBUG, "channel_stacktrace", "(" + this.channelzRef.id + ") Channel constructed \n" + ((_h = error2.stack) === null || _h === void 0 ? void 0 : _h.substring(error2.stack.indexOf("\n") + 1))); - } - getChannelzInfo() { - return { - target: this.originalTarget, - state: this.connectivityState, - trace: this.channelzTrace, - callTracker: this.callTracker, - children: this.childrenTracker.getChildLists() - }; - } - trace(text, verbosityOverride) { - (0, logging_1.trace)(verbosityOverride !== null && verbosityOverride !== void 0 ? verbosityOverride : constants_1.LogVerbosity.DEBUG, "channel", "(" + this.channelzRef.id + ") " + (0, uri_parser_1.uriToString)(this.target) + " " + text); - } - callRefTimerRef() { - var _a2, _b, _c2, _d; - if (!((_b = (_a2 = this.callRefTimer).hasRef) === null || _b === void 0 ? void 0 : _b.call(_a2))) { - this.trace("callRefTimer.ref | configSelectionQueue.length=" + this.configSelectionQueue.length + " pickQueue.length=" + this.pickQueue.length); - (_d = (_c2 = this.callRefTimer).ref) === null || _d === void 0 ? void 0 : _d.call(_c2); - } - } - callRefTimerUnref() { - var _a2, _b; - if (!this.callRefTimer.hasRef || this.callRefTimer.hasRef()) { - this.trace("callRefTimer.unref | configSelectionQueue.length=" + this.configSelectionQueue.length + " pickQueue.length=" + this.pickQueue.length); - (_b = (_a2 = this.callRefTimer).unref) === null || _b === void 0 ? void 0 : _b.call(_a2); - } - } - removeConnectivityStateWatcher(watcherObject) { - const watcherIndex = this.connectivityStateWatchers.findIndex((value) => value === watcherObject); - if (watcherIndex >= 0) { - this.connectivityStateWatchers.splice(watcherIndex, 1); - } - } - updateState(newState) { - (0, logging_1.trace)(constants_1.LogVerbosity.DEBUG, "connectivity_state", "(" + this.channelzRef.id + ") " + (0, uri_parser_1.uriToString)(this.target) + " " + connectivity_state_1.ConnectivityState[this.connectivityState] + " -> " + connectivity_state_1.ConnectivityState[newState]); - if (this.channelzEnabled) { - this.channelzTrace.addTrace("CT_INFO", connectivity_state_1.ConnectivityState[this.connectivityState] + " -> " + connectivity_state_1.ConnectivityState[newState]); - } - this.connectivityState = newState; - const watchersCopy = this.connectivityStateWatchers.slice(); - for (const watcherObject of watchersCopy) { - if (newState !== watcherObject.currentState) { - if (watcherObject.timer) { - clearTimeout(watcherObject.timer); - } - this.removeConnectivityStateWatcher(watcherObject); - watcherObject.callback(); - } - } - if (newState !== connectivity_state_1.ConnectivityState.TRANSIENT_FAILURE) { - this.currentResolutionError = null; - } - } - throttleKeepalive(newKeepaliveTime) { - if (newKeepaliveTime > this.keepaliveTime) { - this.keepaliveTime = newKeepaliveTime; - for (const wrappedSubchannel of this.wrappedSubchannels) { - wrappedSubchannel.throttleKeepalive(newKeepaliveTime); - } - } - } - removeWrappedSubchannel(wrappedSubchannel) { - this.wrappedSubchannels.delete(wrappedSubchannel); - } - doPick(metadata, extraPickInfo) { - return this.currentPicker.pick({ - metadata, - extraPickInfo - }); - } - queueCallForPick(call) { - this.pickQueue.push(call); - this.callRefTimerRef(); - } - getConfig(method, metadata) { - this.resolvingLoadBalancer.exitIdle(); - if (this.configSelector) { - return { - type: "SUCCESS", - config: this.configSelector(method, metadata) - }; - } else { - if (this.currentResolutionError) { - return { - type: "ERROR", - error: this.currentResolutionError - }; - } else { - return { - type: "NONE" - }; - } - } - } - queueCallForConfig(call) { - this.configSelectionQueue.push(call); - this.callRefTimerRef(); - } - enterIdle() { - this.resolvingLoadBalancer.destroy(); - this.updateState(connectivity_state_1.ConnectivityState.IDLE); - this.currentPicker = new picker_1.QueuePicker(this.resolvingLoadBalancer); - } - maybeStartIdleTimer() { - var _a2, _b; - if (this.callCount === 0) { - this.idleTimer = setTimeout(() => { - this.trace("Idle timer triggered after " + this.idleTimeoutMs + "ms of inactivity"); - this.enterIdle(); - }, this.idleTimeoutMs); - (_b = (_a2 = this.idleTimer).unref) === null || _b === void 0 ? void 0 : _b.call(_a2); - } - } - onCallStart() { - if (this.channelzEnabled) { - this.callTracker.addCallStarted(); - } - this.callCount += 1; - if (this.idleTimer) { - clearTimeout(this.idleTimer); - this.idleTimer = null; - } - } - onCallEnd(status2) { - if (this.channelzEnabled) { - if (status2.code === constants_1.Status.OK) { - this.callTracker.addCallSucceeded(); - } else { - this.callTracker.addCallFailed(); - } - } - this.callCount -= 1; - this.maybeStartIdleTimer(); - } - createLoadBalancingCall(callConfig, method, host, credentials2, deadline) { - const callNumber = (0, call_number_1.getNextCallNumber)(); - this.trace("createLoadBalancingCall [" + callNumber + '] method="' + method + '"'); - return new load_balancing_call_1.LoadBalancingCall(this, callConfig, method, host, credentials2, deadline, callNumber); - } - createRetryingCall(callConfig, method, host, credentials2, deadline) { - const callNumber = (0, call_number_1.getNextCallNumber)(); - this.trace("createRetryingCall [" + callNumber + '] method="' + method + '"'); - return new retrying_call_1.RetryingCall(this, callConfig, method, host, credentials2, deadline, callNumber, this.retryBufferTracker, RETRY_THROTTLER_MAP.get(this.getTarget())); - } - createInnerCall(callConfig, method, host, credentials2, deadline) { - if (this.options["grpc.enable_retries"] === 0) { - return this.createLoadBalancingCall(callConfig, method, host, credentials2, deadline); - } else { - return this.createRetryingCall(callConfig, method, host, credentials2, deadline); - } - } - createResolvingCall(method, deadline, host, parentCall, propagateFlags) { - const callNumber = (0, call_number_1.getNextCallNumber)(); - this.trace("createResolvingCall [" + callNumber + '] method="' + method + '", deadline=' + (0, deadline_1.deadlineToString)(deadline)); - const finalOptions = { - deadline, - flags: propagateFlags !== null && propagateFlags !== void 0 ? propagateFlags : constants_1.Propagate.DEFAULTS, - host: host !== null && host !== void 0 ? host : this.defaultAuthority, - parentCall - }; - const call = new resolving_call_1.ResolvingCall(this, method, finalOptions, this.filterStackFactory.clone(), this.credentials._getCallCredentials(), callNumber); - this.onCallStart(); - call.addStatusWatcher((status2) => { - this.onCallEnd(status2); - }); - return call; - } - close() { - this.resolvingLoadBalancer.destroy(); - this.updateState(connectivity_state_1.ConnectivityState.SHUTDOWN); - clearInterval(this.callRefTimer); - if (this.channelzEnabled) { - (0, channelz_1.unregisterChannelzRef)(this.channelzRef); - } - this.subchannelPool.unrefUnusedSubchannels(); - } - getTarget() { - return (0, uri_parser_1.uriToString)(this.target); - } - getConnectivityState(tryToConnect) { - const connectivityState = this.connectivityState; - if (tryToConnect) { - this.resolvingLoadBalancer.exitIdle(); - this.maybeStartIdleTimer(); - } - return connectivityState; - } - watchConnectivityState(currentState, deadline, callback) { - if (this.connectivityState === connectivity_state_1.ConnectivityState.SHUTDOWN) { - throw new Error("Channel has been shut down"); - } - let timer = null; - if (deadline !== Infinity) { - const deadlineDate = deadline instanceof Date ? deadline : new Date(deadline); - const now = /* @__PURE__ */ new Date(); - if (deadline === -Infinity || deadlineDate <= now) { - process.nextTick(callback, new Error("Deadline passed without connectivity state change")); - return; - } - timer = setTimeout(() => { - this.removeConnectivityStateWatcher(watcherObject); - callback(new Error("Deadline passed without connectivity state change")); - }, deadlineDate.getTime() - now.getTime()); - } - const watcherObject = { - currentState, - callback, - timer - }; - this.connectivityStateWatchers.push(watcherObject); - } - /** - * Get the channelz reference object for this channel. The returned value is - * garbage if channelz is disabled for this channel. - * @returns - */ - getChannelzRef() { - return this.channelzRef; - } - createCall(method, deadline, host, parentCall, propagateFlags) { - if (typeof method !== "string") { - throw new TypeError("Channel#createCall: method must be a string"); - } - if (!(typeof deadline === "number" || deadline instanceof Date)) { - throw new TypeError("Channel#createCall: deadline must be a number or Date"); - } - if (this.connectivityState === connectivity_state_1.ConnectivityState.SHUTDOWN) { - throw new Error("Channel has been shut down"); - } - return this.createResolvingCall(method, deadline, host, parentCall, propagateFlags); - } - }; - exports2.InternalChannel = InternalChannel; - } -}); - -// node_modules/@grpc/grpc-js/build/src/channel.js -var require_channel = __commonJS({ - "node_modules/@grpc/grpc-js/build/src/channel.js"(exports2) { - "use strict"; - Object.defineProperty(exports2, "__esModule", { value: true }); - exports2.ChannelImplementation = void 0; - var channel_credentials_1 = require_channel_credentials(); - var internal_channel_1 = require_internal_channel(); - var ChannelImplementation = class { - constructor(target, credentials2, options2) { - if (typeof target !== "string") { - throw new TypeError("Channel target must be a string"); - } - if (!(credentials2 instanceof channel_credentials_1.ChannelCredentials)) { - throw new TypeError("Channel credentials must be a ChannelCredentials object"); - } - if (options2) { - if (typeof options2 !== "object") { - throw new TypeError("Channel options must be an object"); - } - } - this.internalChannel = new internal_channel_1.InternalChannel(target, credentials2, options2); - } - close() { - this.internalChannel.close(); - } - getTarget() { - return this.internalChannel.getTarget(); - } - getConnectivityState(tryToConnect) { - return this.internalChannel.getConnectivityState(tryToConnect); - } - watchConnectivityState(currentState, deadline, callback) { - this.internalChannel.watchConnectivityState(currentState, deadline, callback); - } - /** - * Get the channelz reference object for this channel. The returned value is - * garbage if channelz is disabled for this channel. - * @returns - */ - getChannelzRef() { - return this.internalChannel.getChannelzRef(); - } - createCall(method, deadline, host, parentCall, propagateFlags) { - if (typeof method !== "string") { - throw new TypeError("Channel#createCall: method must be a string"); - } - if (!(typeof deadline === "number" || deadline instanceof Date)) { - throw new TypeError("Channel#createCall: deadline must be a number or Date"); - } - return this.internalChannel.createCall(method, deadline, host, parentCall, propagateFlags); - } - }; - exports2.ChannelImplementation = ChannelImplementation; - } -}); - -// node_modules/@grpc/grpc-js/build/src/server-call.js -var require_server_call = __commonJS({ - "node_modules/@grpc/grpc-js/build/src/server-call.js"(exports2) { - "use strict"; - Object.defineProperty(exports2, "__esModule", { value: true }); - exports2.Http2ServerCallStream = exports2.ServerDuplexStreamImpl = exports2.ServerWritableStreamImpl = exports2.ServerReadableStreamImpl = exports2.ServerUnaryCallImpl = void 0; - var events_1 = require("events"); - var http2 = require("http2"); - var stream_1 = require("stream"); - var zlib = require("zlib"); - var util_1 = require("util"); - var constants_1 = require_constants(); - var metadata_1 = require_metadata(); - var stream_decoder_1 = require_stream_decoder(); - var logging = require_logging(); - var error_1 = require_error(); - var TRACER_NAME = "server_call"; - var unzip = (0, util_1.promisify)(zlib.unzip); - var inflate = (0, util_1.promisify)(zlib.inflate); - function trace(text) { - logging.trace(constants_1.LogVerbosity.DEBUG, TRACER_NAME, text); - } - var GRPC_ACCEPT_ENCODING_HEADER = "grpc-accept-encoding"; - var GRPC_ENCODING_HEADER = "grpc-encoding"; - var GRPC_MESSAGE_HEADER = "grpc-message"; - var GRPC_STATUS_HEADER = "grpc-status"; - var GRPC_TIMEOUT_HEADER = "grpc-timeout"; - var DEADLINE_REGEX = /(\d{1,8})\s*([HMSmun])/; - var deadlineUnitsToMs = { - H: 36e5, - M: 6e4, - S: 1e3, - m: 1, - u: 1e-3, - n: 1e-6 - }; - var defaultCompressionHeaders = { - // TODO(cjihrig): Remove these encoding headers from the default response - // once compression is integrated. - [GRPC_ACCEPT_ENCODING_HEADER]: "identity,deflate,gzip", - [GRPC_ENCODING_HEADER]: "identity" - }; - var defaultResponseHeaders = { - [http2.constants.HTTP2_HEADER_STATUS]: http2.constants.HTTP_STATUS_OK, - [http2.constants.HTTP2_HEADER_CONTENT_TYPE]: "application/grpc+proto" - }; - var defaultResponseOptions = { - waitForTrailers: true - }; - var ServerUnaryCallImpl = class extends events_1.EventEmitter { - constructor(call, metadata, request) { - super(); - this.call = call; - this.metadata = metadata; - this.request = request; - this.cancelled = false; - this.call.setupSurfaceCall(this); - } - getPeer() { - return this.call.getPeer(); - } - sendMetadata(responseMetadata) { - this.call.sendMetadata(responseMetadata); - } - getDeadline() { - return this.call.getDeadline(); - } - getPath() { - return this.call.getPath(); - } - }; - exports2.ServerUnaryCallImpl = ServerUnaryCallImpl; - var ServerReadableStreamImpl = class extends stream_1.Readable { - constructor(call, metadata, deserialize, encoding) { - super({ objectMode: true }); - this.call = call; - this.metadata = metadata; - this.deserialize = deserialize; - this.cancelled = false; - this.call.setupSurfaceCall(this); - this.call.setupReadable(this, encoding); - } - _read(size) { - if (!this.call.consumeUnpushedMessages(this)) { - return; - } - this.call.resume(); - } - getPeer() { - return this.call.getPeer(); - } - sendMetadata(responseMetadata) { - this.call.sendMetadata(responseMetadata); - } - getDeadline() { - return this.call.getDeadline(); - } - getPath() { - return this.call.getPath(); - } - }; - exports2.ServerReadableStreamImpl = ServerReadableStreamImpl; - var ServerWritableStreamImpl = class extends stream_1.Writable { - constructor(call, metadata, serialize, request) { - super({ objectMode: true }); - this.call = call; - this.metadata = metadata; - this.serialize = serialize; - this.request = request; - this.cancelled = false; - this.trailingMetadata = new metadata_1.Metadata(); - this.call.setupSurfaceCall(this); - this.on("error", (err) => { - this.call.sendError(err); - this.end(); - }); - } - getPeer() { - return this.call.getPeer(); - } - sendMetadata(responseMetadata) { - this.call.sendMetadata(responseMetadata); - } - getDeadline() { - return this.call.getDeadline(); - } - getPath() { - return this.call.getPath(); - } - _write(chunk, encoding, callback) { - try { - const response = this.call.serializeMessage(chunk); - if (!this.call.write(response)) { - this.call.once("drain", callback); - return; - } - } catch (err) { - this.emit("error", { - details: (0, error_1.getErrorMessage)(err), - code: constants_1.Status.INTERNAL - }); - } - callback(); - } - _final(callback) { - this.call.sendStatus({ - code: constants_1.Status.OK, - details: "OK", - metadata: this.trailingMetadata - }); - callback(null); - } - // eslint-disable-next-line @typescript-eslint/no-explicit-any - end(metadata) { - if (metadata) { - this.trailingMetadata = metadata; - } - return super.end(); - } - }; - exports2.ServerWritableStreamImpl = ServerWritableStreamImpl; - var ServerDuplexStreamImpl = class extends stream_1.Duplex { - constructor(call, metadata, serialize, deserialize, encoding) { - super({ objectMode: true }); - this.call = call; - this.metadata = metadata; - this.serialize = serialize; - this.deserialize = deserialize; - this.cancelled = false; - this.trailingMetadata = new metadata_1.Metadata(); - this.call.setupSurfaceCall(this); - this.call.setupReadable(this, encoding); - this.on("error", (err) => { - this.call.sendError(err); - this.end(); - }); - } - getPeer() { - return this.call.getPeer(); - } - sendMetadata(responseMetadata) { - this.call.sendMetadata(responseMetadata); - } - getDeadline() { - return this.call.getDeadline(); - } - getPath() { - return this.call.getPath(); - } - // eslint-disable-next-line @typescript-eslint/no-explicit-any - end(metadata) { - if (metadata) { - this.trailingMetadata = metadata; - } - return super.end(); - } - }; - exports2.ServerDuplexStreamImpl = ServerDuplexStreamImpl; - ServerDuplexStreamImpl.prototype._read = ServerReadableStreamImpl.prototype._read; - ServerDuplexStreamImpl.prototype._write = ServerWritableStreamImpl.prototype._write; - ServerDuplexStreamImpl.prototype._final = ServerWritableStreamImpl.prototype._final; - var Http2ServerCallStream = class extends events_1.EventEmitter { - constructor(stream, handler2, options2) { - super(); - this.stream = stream; - this.handler = handler2; - this.cancelled = false; - this.deadlineTimer = null; - this.statusSent = false; - this.deadline = Infinity; - this.wantTrailers = false; - this.metadataSent = false; - this.canPush = false; - this.isPushPending = false; - this.bufferedMessages = []; - this.messagesToPush = []; - this.maxSendMessageSize = constants_1.DEFAULT_MAX_SEND_MESSAGE_LENGTH; - this.maxReceiveMessageSize = constants_1.DEFAULT_MAX_RECEIVE_MESSAGE_LENGTH; - this.stream.once("error", (err) => { - }); - this.stream.once("close", () => { - var _a2; - trace("Request to method " + ((_a2 = this.handler) === null || _a2 === void 0 ? void 0 : _a2.path) + " stream closed with rstCode " + this.stream.rstCode); - if (!this.statusSent) { - this.cancelled = true; - this.emit("cancelled", "cancelled"); - this.emit("streamEnd", false); - this.sendStatus({ - code: constants_1.Status.CANCELLED, - details: "Cancelled by client", - metadata: null - }); - if (this.deadlineTimer) - clearTimeout(this.deadlineTimer); - } - }); - this.stream.on("drain", () => { - this.emit("drain"); - }); - if ("grpc.max_send_message_length" in options2) { - this.maxSendMessageSize = options2["grpc.max_send_message_length"]; - } - if ("grpc.max_receive_message_length" in options2) { - this.maxReceiveMessageSize = options2["grpc.max_receive_message_length"]; - } - } - checkCancelled() { - if (this.stream.destroyed || this.stream.closed) { - this.cancelled = true; - } - return this.cancelled; - } - getDecompressedMessage(message, encoding) { - if (encoding === "deflate") { - return inflate(message.subarray(5)); - } else if (encoding === "gzip") { - return unzip(message.subarray(5)); - } else if (encoding === "identity") { - return message.subarray(5); - } - return Promise.reject({ - code: constants_1.Status.UNIMPLEMENTED, - details: `Received message compressed with unsupported encoding "${encoding}"` - }); - } - sendMetadata(customMetadata) { - if (this.checkCancelled()) { - return; - } - if (this.metadataSent) { - return; - } - this.metadataSent = true; - const custom = customMetadata ? customMetadata.toHttp2Headers() : null; - const headers = Object.assign(Object.assign(Object.assign({}, defaultResponseHeaders), defaultCompressionHeaders), custom); - this.stream.respond(headers, defaultResponseOptions); - } - receiveMetadata(headers) { - const metadata = metadata_1.Metadata.fromHttp2Headers(headers); - if (logging.isTracerEnabled(TRACER_NAME)) { - trace("Request to " + this.handler.path + " received headers " + JSON.stringify(metadata.toJSON())); - } - const timeoutHeader = metadata.get(GRPC_TIMEOUT_HEADER); - if (timeoutHeader.length > 0) { - const match = timeoutHeader[0].toString().match(DEADLINE_REGEX); - if (match === null) { - const err = new Error("Invalid deadline"); - err.code = constants_1.Status.OUT_OF_RANGE; - this.sendError(err); - return metadata; - } - const timeout = +match[1] * deadlineUnitsToMs[match[2]] | 0; - const now = /* @__PURE__ */ new Date(); - this.deadline = now.setMilliseconds(now.getMilliseconds() + timeout); - this.deadlineTimer = setTimeout(handleExpiredDeadline, timeout, this); - metadata.remove(GRPC_TIMEOUT_HEADER); - } - metadata.remove(http2.constants.HTTP2_HEADER_ACCEPT_ENCODING); - metadata.remove(http2.constants.HTTP2_HEADER_TE); - metadata.remove(http2.constants.HTTP2_HEADER_CONTENT_TYPE); - metadata.remove("grpc-accept-encoding"); - return metadata; - } - receiveUnaryMessage(encoding) { - return new Promise((resolve, reject) => { - const { stream } = this; - let receivedLength = 0; - const call = this; - const body = []; - const limit = this.maxReceiveMessageSize; - this.stream.on("data", onData); - this.stream.on("end", onEnd); - this.stream.on("error", onEnd); - function onData(chunk) { - receivedLength += chunk.byteLength; - if (limit !== -1 && receivedLength > limit) { - stream.removeListener("data", onData); - stream.removeListener("end", onEnd); - stream.removeListener("error", onEnd); - reject({ - code: constants_1.Status.RESOURCE_EXHAUSTED, - details: `Received message larger than max (${receivedLength} vs. ${limit})` - }); - return; - } - body.push(chunk); - } - function onEnd(err) { - stream.removeListener("data", onData); - stream.removeListener("end", onEnd); - stream.removeListener("error", onEnd); - if (err !== void 0) { - reject({ code: constants_1.Status.INTERNAL, details: err.message }); - return; - } - if (receivedLength === 0) { - reject({ - code: constants_1.Status.INTERNAL, - details: "received empty unary message" - }); - return; - } - call.emit("receiveMessage"); - const requestBytes = Buffer.concat(body, receivedLength); - const compressed = requestBytes.readUInt8(0) === 1; - const compressedMessageEncoding = compressed ? encoding : "identity"; - const decompressedMessage = call.getDecompressedMessage(requestBytes, compressedMessageEncoding); - if (Buffer.isBuffer(decompressedMessage)) { - resolve(call.deserializeMessageWithInternalError(decompressedMessage)); - return; - } - decompressedMessage.then((decompressed) => resolve(call.deserializeMessageWithInternalError(decompressed)), (err2) => reject(err2.code ? err2 : { - code: constants_1.Status.INTERNAL, - details: `Received "grpc-encoding" header "${encoding}" but ${encoding} decompression failed` - })); - } - }); - } - async deserializeMessageWithInternalError(buffer) { - try { - return this.deserializeMessage(buffer); - } catch (err) { - throw { - details: (0, error_1.getErrorMessage)(err), - code: constants_1.Status.INTERNAL - }; - } - } - serializeMessage(value) { - const messageBuffer = this.handler.serialize(value); - const byteLength = messageBuffer.byteLength; - const output = Buffer.allocUnsafe(byteLength + 5); - output.writeUInt8(0, 0); - output.writeUInt32BE(byteLength, 1); - messageBuffer.copy(output, 5); - return output; - } - deserializeMessage(bytes) { - return this.handler.deserialize(bytes); - } - async sendUnaryMessage(err, value, metadata, flags) { - if (this.checkCancelled()) { - return; - } - if (metadata === void 0) { - metadata = null; - } - if (err) { - if (!Object.prototype.hasOwnProperty.call(err, "metadata") && metadata) { - err.metadata = metadata; - } - this.sendError(err); - return; - } - try { - const response = this.serializeMessage(value); - this.write(response); - this.sendStatus({ code: constants_1.Status.OK, details: "OK", metadata }); - } catch (err2) { - this.sendError({ - details: (0, error_1.getErrorMessage)(err2), - code: constants_1.Status.INTERNAL - }); - } - } - sendStatus(statusObj) { - var _a2, _b; - this.emit("callEnd", statusObj.code); - this.emit("streamEnd", statusObj.code === constants_1.Status.OK); - if (this.checkCancelled()) { - return; - } - trace("Request to method " + ((_a2 = this.handler) === null || _a2 === void 0 ? void 0 : _a2.path) + " ended with status code: " + constants_1.Status[statusObj.code] + " details: " + statusObj.details); - if (this.deadlineTimer) - clearTimeout(this.deadlineTimer); - if (this.stream.headersSent) { - if (!this.wantTrailers) { - this.wantTrailers = true; - this.stream.once("wantTrailers", () => { - var _a3; - const trailersToSend = Object.assign({ [GRPC_STATUS_HEADER]: statusObj.code, [GRPC_MESSAGE_HEADER]: encodeURI(statusObj.details) }, (_a3 = statusObj.metadata) === null || _a3 === void 0 ? void 0 : _a3.toHttp2Headers()); - this.stream.sendTrailers(trailersToSend); - this.statusSent = true; - }); - this.stream.end(); - } - } else { - const trailersToSend = Object.assign(Object.assign({ [GRPC_STATUS_HEADER]: statusObj.code, [GRPC_MESSAGE_HEADER]: encodeURI(statusObj.details) }, defaultResponseHeaders), (_b = statusObj.metadata) === null || _b === void 0 ? void 0 : _b.toHttp2Headers()); - this.stream.respond(trailersToSend, { endStream: true }); - this.statusSent = true; - } - } - sendError(error2) { - const status2 = { - code: constants_1.Status.UNKNOWN, - details: "message" in error2 ? error2.message : "Unknown Error", - metadata: "metadata" in error2 && error2.metadata !== void 0 ? error2.metadata : null - }; - if ("code" in error2 && typeof error2.code === "number" && Number.isInteger(error2.code)) { - status2.code = error2.code; - if ("details" in error2 && typeof error2.details === "string") { - status2.details = error2.details; - } - } - this.sendStatus(status2); - } - write(chunk) { - if (this.checkCancelled()) { - return; - } - if (this.maxSendMessageSize !== -1 && chunk.length > this.maxSendMessageSize) { - this.sendError({ - code: constants_1.Status.RESOURCE_EXHAUSTED, - details: `Sent message larger than max (${chunk.length} vs. ${this.maxSendMessageSize})` - }); - return; - } - this.sendMetadata(); - this.emit("sendMessage"); - return this.stream.write(chunk); - } - resume() { - this.stream.resume(); - } - setupSurfaceCall(call) { - this.once("cancelled", (reason) => { - call.cancelled = true; - call.emit("cancelled", reason); - }); - this.once("callEnd", (status2) => call.emit("callEnd", status2)); - } - setupReadable(readable, encoding) { - const decoder = new stream_decoder_1.StreamDecoder(); - let readsDone = false; - let pendingMessageProcessing = false; - let pushedEnd = false; - const maybePushEnd = async () => { - if (!pushedEnd && readsDone && !pendingMessageProcessing) { - pushedEnd = true; - await this.pushOrBufferMessage(readable, null); - } - }; - this.stream.on("data", async (data) => { - const messages = decoder.write(data); - pendingMessageProcessing = true; - this.stream.pause(); - for (const message of messages) { - if (this.maxReceiveMessageSize !== -1 && message.length > this.maxReceiveMessageSize) { - this.sendError({ - code: constants_1.Status.RESOURCE_EXHAUSTED, - details: `Received message larger than max (${message.length} vs. ${this.maxReceiveMessageSize})` - }); - return; - } - this.emit("receiveMessage"); - const compressed = message.readUInt8(0) === 1; - const compressedMessageEncoding = compressed ? encoding : "identity"; - const decompressedMessage = await this.getDecompressedMessage(message, compressedMessageEncoding); - if (!decompressedMessage) - return; - await this.pushOrBufferMessage(readable, decompressedMessage); - } - pendingMessageProcessing = false; - this.stream.resume(); - await maybePushEnd(); - }); - this.stream.once("end", async () => { - readsDone = true; - await maybePushEnd(); - }); - } - consumeUnpushedMessages(readable) { - this.canPush = true; - while (this.messagesToPush.length > 0) { - const nextMessage = this.messagesToPush.shift(); - const canPush = readable.push(nextMessage); - if (nextMessage === null || canPush === false) { - this.canPush = false; - break; - } - } - return this.canPush; - } - async pushOrBufferMessage(readable, messageBytes) { - if (this.isPushPending) { - this.bufferedMessages.push(messageBytes); - } else { - await this.pushMessage(readable, messageBytes); - } - } - async pushMessage(readable, messageBytes) { - if (messageBytes === null) { - trace("Received end of stream"); - if (this.canPush) { - readable.push(null); - } else { - this.messagesToPush.push(null); - } - return; - } - trace("Received message of length " + messageBytes.length); - this.isPushPending = true; - try { - const deserialized = await this.deserializeMessage(messageBytes); - if (this.canPush) { - if (!readable.push(deserialized)) { - this.canPush = false; - this.stream.pause(); - } - } else { - this.messagesToPush.push(deserialized); - } - } catch (error2) { - this.bufferedMessages.length = 0; - let code = (0, error_1.getErrorCode)(error2); - if (code === null || code < constants_1.Status.OK || code > constants_1.Status.UNAUTHENTICATED) { - code = constants_1.Status.INTERNAL; - } - readable.emit("error", { - details: (0, error_1.getErrorMessage)(error2), - code - }); - } - this.isPushPending = false; - if (this.bufferedMessages.length > 0) { - await this.pushMessage(readable, this.bufferedMessages.shift()); - } - } - getPeer() { - var _a2; - const socket = (_a2 = this.stream.session) === null || _a2 === void 0 ? void 0 : _a2.socket; - if (socket === null || socket === void 0 ? void 0 : socket.remoteAddress) { - if (socket.remotePort) { - return `${socket.remoteAddress}:${socket.remotePort}`; - } else { - return socket.remoteAddress; - } - } else { - return "unknown"; - } - } - getDeadline() { - return this.deadline; - } - getPath() { - return this.handler.path; - } - }; - exports2.Http2ServerCallStream = Http2ServerCallStream; - function handleExpiredDeadline(call) { - const err = new Error("Deadline exceeded"); - err.code = constants_1.Status.DEADLINE_EXCEEDED; - call.sendError(err); - call.cancelled = true; - call.emit("cancelled", "deadline"); - } - } -}); - -// node_modules/@grpc/grpc-js/build/src/server-credentials.js -var require_server_credentials = __commonJS({ - "node_modules/@grpc/grpc-js/build/src/server-credentials.js"(exports2) { - "use strict"; - Object.defineProperty(exports2, "__esModule", { value: true }); - exports2.ServerCredentials = void 0; - var tls_helpers_1 = require_tls_helpers(); - var ServerCredentials2 = class { - static createInsecure() { - return new InsecureServerCredentials(); - } - static createSsl(rootCerts, keyCertPairs, checkClientCertificate = false) { - if (rootCerts !== null && !Buffer.isBuffer(rootCerts)) { - throw new TypeError("rootCerts must be null or a Buffer"); - } - if (!Array.isArray(keyCertPairs)) { - throw new TypeError("keyCertPairs must be an array"); - } - if (typeof checkClientCertificate !== "boolean") { - throw new TypeError("checkClientCertificate must be a boolean"); - } - const cert = []; - const key = []; - for (let i = 0; i < keyCertPairs.length; i++) { - const pair = keyCertPairs[i]; - if (pair === null || typeof pair !== "object") { - throw new TypeError(`keyCertPair[${i}] must be an object`); - } - if (!Buffer.isBuffer(pair.private_key)) { - throw new TypeError(`keyCertPair[${i}].private_key must be a Buffer`); - } - if (!Buffer.isBuffer(pair.cert_chain)) { - throw new TypeError(`keyCertPair[${i}].cert_chain must be a Buffer`); - } - cert.push(pair.cert_chain); - key.push(pair.private_key); - } - return new SecureServerCredentials({ - ca: rootCerts || (0, tls_helpers_1.getDefaultRootsData)() || void 0, - cert, - key, - requestCert: checkClientCertificate, - ciphers: tls_helpers_1.CIPHER_SUITES - }); - } - }; - exports2.ServerCredentials = ServerCredentials2; - var InsecureServerCredentials = class extends ServerCredentials2 { - _isSecure() { - return false; - } - _getSettings() { - return null; - } - }; - var SecureServerCredentials = class extends ServerCredentials2 { - constructor(options2) { - super(); - this.options = options2; - } - _isSecure() { - return true; - } - _getSettings() { - return this.options; - } - }; - } -}); - -// node_modules/@grpc/grpc-js/build/src/server.js -var require_server = __commonJS({ - "node_modules/@grpc/grpc-js/build/src/server.js"(exports2) { - "use strict"; - Object.defineProperty(exports2, "__esModule", { value: true }); - exports2.Server = void 0; - var http2 = require("http2"); - var constants_1 = require_constants(); - var server_call_1 = require_server_call(); - var server_credentials_1 = require_server_credentials(); - var resolver_1 = require_resolver(); - var logging = require_logging(); - var subchannel_address_1 = require_subchannel_address(); - var uri_parser_1 = require_uri_parser(); - var channelz_1 = require_channelz(); - var UNLIMITED_CONNECTION_AGE_MS = ~(1 << 31); - var KEEPALIVE_MAX_TIME_MS = ~(1 << 31); - var KEEPALIVE_TIMEOUT_MS = 2e4; - var { HTTP2_HEADER_PATH } = http2.constants; - var TRACER_NAME = "server"; - function noop() { - } - function getUnimplementedStatusResponse(methodName) { - return { - code: constants_1.Status.UNIMPLEMENTED, - details: `The server does not implement the method ${methodName}` - }; - } - function getDefaultHandler(handlerType, methodName) { - const unimplementedStatusResponse = getUnimplementedStatusResponse(methodName); - switch (handlerType) { - case "unary": - return (call, callback) => { - callback(unimplementedStatusResponse, null); - }; - case "clientStream": - return (call, callback) => { - callback(unimplementedStatusResponse, null); - }; - case "serverStream": - return (call) => { - call.emit("error", unimplementedStatusResponse); - }; - case "bidi": - return (call) => { - call.emit("error", unimplementedStatusResponse); - }; - default: - throw new Error(`Invalid handlerType ${handlerType}`); - } - } - var Server3 = class { - constructor(options2) { - var _a2, _b, _c2, _d; - this.http2ServerList = []; - this.handlers = /* @__PURE__ */ new Map(); - this.sessions = /* @__PURE__ */ new Map(); - this.started = false; - this.serverAddressString = "null"; - this.channelzEnabled = true; - this.channelzTrace = new channelz_1.ChannelzTrace(); - this.callTracker = new channelz_1.ChannelzCallTracker(); - this.listenerChildrenTracker = new channelz_1.ChannelzChildrenTracker(); - this.sessionChildrenTracker = new channelz_1.ChannelzChildrenTracker(); - this.options = options2 !== null && options2 !== void 0 ? options2 : {}; - if (this.options["grpc.enable_channelz"] === 0) { - this.channelzEnabled = false; - } - this.channelzRef = (0, channelz_1.registerChannelzServer)(() => this.getChannelzInfo(), this.channelzEnabled); - if (this.channelzEnabled) { - this.channelzTrace.addTrace("CT_INFO", "Server created"); - } - this.maxConnectionAgeMs = (_a2 = this.options["grpc.max_connection_age_ms"]) !== null && _a2 !== void 0 ? _a2 : UNLIMITED_CONNECTION_AGE_MS; - this.maxConnectionAgeGraceMs = (_b = this.options["grpc.max_connection_age_grace_ms"]) !== null && _b !== void 0 ? _b : UNLIMITED_CONNECTION_AGE_MS; - this.keepaliveTimeMs = (_c2 = this.options["grpc.keepalive_time_ms"]) !== null && _c2 !== void 0 ? _c2 : KEEPALIVE_MAX_TIME_MS; - this.keepaliveTimeoutMs = (_d = this.options["grpc.keepalive_timeout_ms"]) !== null && _d !== void 0 ? _d : KEEPALIVE_TIMEOUT_MS; - this.trace("Server constructed"); - } - getChannelzInfo() { - return { - trace: this.channelzTrace, - callTracker: this.callTracker, - listenerChildren: this.listenerChildrenTracker.getChildLists(), - sessionChildren: this.sessionChildrenTracker.getChildLists() - }; - } - getChannelzSessionInfoGetter(session) { - return () => { - var _a2, _b, _c2; - const sessionInfo = this.sessions.get(session); - const sessionSocket = session.socket; - const remoteAddress = sessionSocket.remoteAddress ? (0, subchannel_address_1.stringToSubchannelAddress)(sessionSocket.remoteAddress, sessionSocket.remotePort) : null; - const localAddress = sessionSocket.localAddress ? (0, subchannel_address_1.stringToSubchannelAddress)(sessionSocket.localAddress, sessionSocket.localPort) : null; - let tlsInfo; - if (session.encrypted) { - const tlsSocket = sessionSocket; - const cipherInfo = tlsSocket.getCipher(); - const certificate = tlsSocket.getCertificate(); - const peerCertificate = tlsSocket.getPeerCertificate(); - tlsInfo = { - cipherSuiteStandardName: (_a2 = cipherInfo.standardName) !== null && _a2 !== void 0 ? _a2 : null, - cipherSuiteOtherName: cipherInfo.standardName ? null : cipherInfo.name, - localCertificate: certificate && "raw" in certificate ? certificate.raw : null, - remoteCertificate: peerCertificate && "raw" in peerCertificate ? peerCertificate.raw : null - }; - } else { - tlsInfo = null; - } - const socketInfo = { - remoteAddress, - localAddress, - security: tlsInfo, - remoteName: null, - streamsStarted: sessionInfo.streamTracker.callsStarted, - streamsSucceeded: sessionInfo.streamTracker.callsSucceeded, - streamsFailed: sessionInfo.streamTracker.callsFailed, - messagesSent: sessionInfo.messagesSent, - messagesReceived: sessionInfo.messagesReceived, - keepAlivesSent: 0, - lastLocalStreamCreatedTimestamp: null, - lastRemoteStreamCreatedTimestamp: sessionInfo.streamTracker.lastCallStartedTimestamp, - lastMessageSentTimestamp: sessionInfo.lastMessageSentTimestamp, - lastMessageReceivedTimestamp: sessionInfo.lastMessageReceivedTimestamp, - localFlowControlWindow: (_b = session.state.localWindowSize) !== null && _b !== void 0 ? _b : null, - remoteFlowControlWindow: (_c2 = session.state.remoteWindowSize) !== null && _c2 !== void 0 ? _c2 : null - }; - return socketInfo; - }; - } - trace(text) { - logging.trace(constants_1.LogVerbosity.DEBUG, TRACER_NAME, "(" + this.channelzRef.id + ") " + text); - } - addProtoService() { - throw new Error("Not implemented. Use addService() instead"); - } - addService(service, implementation) { - if (service === null || typeof service !== "object" || implementation === null || typeof implementation !== "object") { - throw new Error("addService() requires two objects as arguments"); - } - const serviceKeys = Object.keys(service); - if (serviceKeys.length === 0) { - throw new Error("Cannot add an empty service to a server"); - } - serviceKeys.forEach((name) => { - const attrs = service[name]; - let methodType; - if (attrs.requestStream) { - if (attrs.responseStream) { - methodType = "bidi"; - } else { - methodType = "clientStream"; - } - } else { - if (attrs.responseStream) { - methodType = "serverStream"; - } else { - methodType = "unary"; - } - } - let implFn = implementation[name]; - let impl; - if (implFn === void 0 && typeof attrs.originalName === "string") { - implFn = implementation[attrs.originalName]; - } - if (implFn !== void 0) { - impl = implFn.bind(implementation); - } else { - impl = getDefaultHandler(methodType, name); - } - const success = this.register(attrs.path, impl, attrs.responseSerialize, attrs.requestDeserialize, methodType); - if (success === false) { - throw new Error(`Method handler for ${attrs.path} already provided.`); - } - }); - } - removeService(service) { - if (service === null || typeof service !== "object") { - throw new Error("removeService() requires object as argument"); - } - const serviceKeys = Object.keys(service); - serviceKeys.forEach((name) => { - const attrs = service[name]; - this.unregister(attrs.path); - }); - } - bind(port, creds) { - throw new Error("Not implemented. Use bindAsync() instead"); - } - bindAsync(port, creds, callback) { - if (this.started === true) { - throw new Error("server is already started"); - } - if (typeof port !== "string") { - throw new TypeError("port must be a string"); - } - if (creds === null || !(creds instanceof server_credentials_1.ServerCredentials)) { - throw new TypeError("creds must be a ServerCredentials object"); - } - if (typeof callback !== "function") { - throw new TypeError("callback must be a function"); - } - const initialPortUri = (0, uri_parser_1.parseUri)(port); - if (initialPortUri === null) { - throw new Error(`Could not parse port "${port}"`); - } - const portUri = (0, resolver_1.mapUriDefaultScheme)(initialPortUri); - if (portUri === null) { - throw new Error(`Could not get a default scheme for port "${port}"`); - } - const serverOptions = { - maxSendHeaderBlockLength: Number.MAX_SAFE_INTEGER - }; - if ("grpc-node.max_session_memory" in this.options) { - serverOptions.maxSessionMemory = this.options["grpc-node.max_session_memory"]; - } else { - serverOptions.maxSessionMemory = Number.MAX_SAFE_INTEGER; - } - if ("grpc.max_concurrent_streams" in this.options) { - serverOptions.settings = { - maxConcurrentStreams: this.options["grpc.max_concurrent_streams"] - }; - } - const deferredCallback = (error2, port2) => { - process.nextTick(() => callback(error2, port2)); - }; - const setupServer = () => { - let http2Server; - if (creds._isSecure()) { - const secureServerOptions = Object.assign(serverOptions, creds._getSettings()); - secureServerOptions.enableTrace = this.options["grpc-node.tls_enable_trace"] === 1; - http2Server = http2.createSecureServer(secureServerOptions); - http2Server.on("secureConnection", (socket) => { - socket.on("error", (e) => { - this.trace("An incoming TLS connection closed with error: " + e.message); - }); - }); - } else { - http2Server = http2.createServer(serverOptions); - } - http2Server.setTimeout(0, noop); - this._setupHandlers(http2Server); - return http2Server; - }; - const bindSpecificPort = (addressList, portNum, previousCount) => { - if (addressList.length === 0) { - return Promise.resolve({ port: portNum, count: previousCount }); - } - return Promise.all(addressList.map((address) => { - this.trace("Attempting to bind " + (0, subchannel_address_1.subchannelAddressToString)(address)); - let addr; - if ((0, subchannel_address_1.isTcpSubchannelAddress)(address)) { - addr = { - host: address.host, - port: portNum - }; - } else { - addr = address; - } - const http2Server = setupServer(); - return new Promise((resolve, reject) => { - const onError = (err) => { - this.trace("Failed to bind " + (0, subchannel_address_1.subchannelAddressToString)(address) + " with error " + err.message); - resolve(err); - }; - http2Server.once("error", onError); - http2Server.listen(addr, () => { - const boundAddress = http2Server.address(); - let boundSubchannelAddress; - if (typeof boundAddress === "string") { - boundSubchannelAddress = { - path: boundAddress - }; - } else { - boundSubchannelAddress = { - host: boundAddress.address, - port: boundAddress.port - }; - } - const channelzRef = (0, channelz_1.registerChannelzSocket)((0, subchannel_address_1.subchannelAddressToString)(boundSubchannelAddress), () => { - return { - localAddress: boundSubchannelAddress, - remoteAddress: null, - security: null, - remoteName: null, - streamsStarted: 0, - streamsSucceeded: 0, - streamsFailed: 0, - messagesSent: 0, - messagesReceived: 0, - keepAlivesSent: 0, - lastLocalStreamCreatedTimestamp: null, - lastRemoteStreamCreatedTimestamp: null, - lastMessageSentTimestamp: null, - lastMessageReceivedTimestamp: null, - localFlowControlWindow: null, - remoteFlowControlWindow: null - }; - }, this.channelzEnabled); - if (this.channelzEnabled) { - this.listenerChildrenTracker.refChild(channelzRef); - } - this.http2ServerList.push({ - server: http2Server, - channelzRef - }); - this.trace("Successfully bound " + (0, subchannel_address_1.subchannelAddressToString)(boundSubchannelAddress)); - resolve("port" in boundSubchannelAddress ? boundSubchannelAddress.port : portNum); - http2Server.removeListener("error", onError); - }); - }); - })).then((results) => { - let count = 0; - for (const result of results) { - if (typeof result === "number") { - count += 1; - if (result !== portNum) { - throw new Error("Invalid state: multiple port numbers added from single address"); - } - } - } - return { - port: portNum, - count: count + previousCount - }; - }); - }; - const bindWildcardPort = (addressList) => { - if (addressList.length === 0) { - return Promise.resolve({ port: 0, count: 0 }); - } - const address = addressList[0]; - const http2Server = setupServer(); - return new Promise((resolve, reject) => { - const onError = (err) => { - this.trace("Failed to bind " + (0, subchannel_address_1.subchannelAddressToString)(address) + " with error " + err.message); - resolve(bindWildcardPort(addressList.slice(1))); - }; - http2Server.once("error", onError); - http2Server.listen(address, () => { - const boundAddress = http2Server.address(); - const boundSubchannelAddress = { - host: boundAddress.address, - port: boundAddress.port - }; - const channelzRef = (0, channelz_1.registerChannelzSocket)((0, subchannel_address_1.subchannelAddressToString)(boundSubchannelAddress), () => { - return { - localAddress: boundSubchannelAddress, - remoteAddress: null, - security: null, - remoteName: null, - streamsStarted: 0, - streamsSucceeded: 0, - streamsFailed: 0, - messagesSent: 0, - messagesReceived: 0, - keepAlivesSent: 0, - lastLocalStreamCreatedTimestamp: null, - lastRemoteStreamCreatedTimestamp: null, - lastMessageSentTimestamp: null, - lastMessageReceivedTimestamp: null, - localFlowControlWindow: null, - remoteFlowControlWindow: null - }; - }, this.channelzEnabled); - if (this.channelzEnabled) { - this.listenerChildrenTracker.refChild(channelzRef); - } - this.http2ServerList.push({ - server: http2Server, - channelzRef - }); - this.trace("Successfully bound " + (0, subchannel_address_1.subchannelAddressToString)(boundSubchannelAddress)); - resolve(bindSpecificPort(addressList.slice(1), boundAddress.port, 1)); - http2Server.removeListener("error", onError); - }); - }); - }; - const resolverListener = { - onSuccessfulResolution: (addressList, serviceConfig, serviceConfigError) => { - resolverListener.onSuccessfulResolution = () => { - }; - if (addressList.length === 0) { - deferredCallback(new Error(`No addresses resolved for port ${port}`), 0); - return; - } - let bindResultPromise; - if ((0, subchannel_address_1.isTcpSubchannelAddress)(addressList[0])) { - if (addressList[0].port === 0) { - bindResultPromise = bindWildcardPort(addressList); - } else { - bindResultPromise = bindSpecificPort(addressList, addressList[0].port, 0); - } - } else { - bindResultPromise = bindSpecificPort(addressList, 1, 0); - } - bindResultPromise.then((bindResult) => { - if (bindResult.count === 0) { - const errorString = `No address added out of total ${addressList.length} resolved`; - logging.log(constants_1.LogVerbosity.ERROR, errorString); - deferredCallback(new Error(errorString), 0); - } else { - if (bindResult.count < addressList.length) { - logging.log(constants_1.LogVerbosity.INFO, `WARNING Only ${bindResult.count} addresses added out of total ${addressList.length} resolved`); - } - deferredCallback(null, bindResult.port); - } - }, (error2) => { - const errorString = `No address added out of total ${addressList.length} resolved`; - logging.log(constants_1.LogVerbosity.ERROR, errorString); - deferredCallback(new Error(errorString), 0); - }); - }, - onError: (error2) => { - deferredCallback(new Error(error2.details), 0); - } - }; - const resolver = (0, resolver_1.createResolver)(portUri, resolverListener, this.options); - resolver.updateResolution(); - } - forceShutdown() { - for (const { server: http2Server, channelzRef: ref } of this.http2ServerList) { - if (http2Server.listening) { - http2Server.close(() => { - if (this.channelzEnabled) { - this.listenerChildrenTracker.unrefChild(ref); - (0, channelz_1.unregisterChannelzRef)(ref); - } - }); - } - } - this.started = false; - this.sessions.forEach((channelzInfo, session) => { - session.destroy(http2.constants.NGHTTP2_CANCEL); - }); - this.sessions.clear(); - if (this.channelzEnabled) { - (0, channelz_1.unregisterChannelzRef)(this.channelzRef); - } - } - register(name, handler2, serialize, deserialize, type) { - if (this.handlers.has(name)) { - return false; - } - this.handlers.set(name, { - func: handler2, - serialize, - deserialize, - type, - path: name - }); - return true; - } - unregister(name) { - return this.handlers.delete(name); - } - start() { - if (this.http2ServerList.length === 0 || this.http2ServerList.every(({ server: http2Server }) => http2Server.listening !== true)) { - throw new Error("server must be bound in order to start"); - } - if (this.started === true) { - throw new Error("server is already started"); - } - if (this.channelzEnabled) { - this.channelzTrace.addTrace("CT_INFO", "Starting"); - } - this.started = true; - } - tryShutdown(callback) { - const wrappedCallback = (error2) => { - if (this.channelzEnabled) { - (0, channelz_1.unregisterChannelzRef)(this.channelzRef); - } - callback(error2); - }; - let pendingChecks = 0; - function maybeCallback() { - pendingChecks--; - if (pendingChecks === 0) { - wrappedCallback(); - } - } - this.started = false; - for (const { server: http2Server, channelzRef: ref } of this.http2ServerList) { - if (http2Server.listening) { - pendingChecks++; - http2Server.close(() => { - if (this.channelzEnabled) { - this.listenerChildrenTracker.unrefChild(ref); - (0, channelz_1.unregisterChannelzRef)(ref); - } - maybeCallback(); - }); - } - } - this.sessions.forEach((channelzInfo, session) => { - if (!session.closed) { - pendingChecks += 1; - session.close(maybeCallback); - } - }); - if (pendingChecks === 0) { - wrappedCallback(); - } - } - addHttp2Port() { - throw new Error("Not yet implemented"); - } - /** - * Get the channelz reference object for this server. The returned value is - * garbage if channelz is disabled for this server. - * @returns - */ - getChannelzRef() { - return this.channelzRef; - } - _verifyContentType(stream, headers) { - const contentType = headers[http2.constants.HTTP2_HEADER_CONTENT_TYPE]; - if (typeof contentType !== "string" || !contentType.startsWith("application/grpc")) { - stream.respond({ - [http2.constants.HTTP2_HEADER_STATUS]: http2.constants.HTTP_STATUS_UNSUPPORTED_MEDIA_TYPE - }, { endStream: true }); - return false; - } - return true; - } - _retrieveHandler(path) { - this.trace("Received call to method " + path + " at address " + this.serverAddressString); - const handler2 = this.handlers.get(path); - if (handler2 === void 0) { - this.trace("No handler registered for method " + path + ". Sending UNIMPLEMENTED status."); - return null; - } - return handler2; - } - _respondWithError(err, stream, channelzSessionInfo = null) { - const call = new server_call_1.Http2ServerCallStream(stream, null, this.options); - if (err.code === void 0) { - err.code = constants_1.Status.INTERNAL; - } - if (this.channelzEnabled) { - this.callTracker.addCallFailed(); - channelzSessionInfo === null || channelzSessionInfo === void 0 ? void 0 : channelzSessionInfo.streamTracker.addCallFailed(); - } - call.sendError(err); - } - _channelzHandler(stream, headers) { - const channelzSessionInfo = this.sessions.get(stream.session); - this.callTracker.addCallStarted(); - channelzSessionInfo === null || channelzSessionInfo === void 0 ? void 0 : channelzSessionInfo.streamTracker.addCallStarted(); - if (!this._verifyContentType(stream, headers)) { - this.callTracker.addCallFailed(); - channelzSessionInfo === null || channelzSessionInfo === void 0 ? void 0 : channelzSessionInfo.streamTracker.addCallFailed(); - return; - } - const path = headers[HTTP2_HEADER_PATH]; - const handler2 = this._retrieveHandler(path); - if (!handler2) { - this._respondWithError(getUnimplementedStatusResponse(path), stream, channelzSessionInfo); - return; - } - const call = new server_call_1.Http2ServerCallStream(stream, handler2, this.options); - call.once("callEnd", (code) => { - if (code === constants_1.Status.OK) { - this.callTracker.addCallSucceeded(); - } else { - this.callTracker.addCallFailed(); - } - }); - if (channelzSessionInfo) { - call.once("streamEnd", (success) => { - if (success) { - channelzSessionInfo.streamTracker.addCallSucceeded(); - } else { - channelzSessionInfo.streamTracker.addCallFailed(); - } - }); - call.on("sendMessage", () => { - channelzSessionInfo.messagesSent += 1; - channelzSessionInfo.lastMessageSentTimestamp = /* @__PURE__ */ new Date(); - }); - call.on("receiveMessage", () => { - channelzSessionInfo.messagesReceived += 1; - channelzSessionInfo.lastMessageReceivedTimestamp = /* @__PURE__ */ new Date(); - }); - } - if (!this._runHandlerForCall(call, handler2, headers)) { - this.callTracker.addCallFailed(); - channelzSessionInfo === null || channelzSessionInfo === void 0 ? void 0 : channelzSessionInfo.streamTracker.addCallFailed(); - call.sendError({ - code: constants_1.Status.INTERNAL, - details: `Unknown handler type: ${handler2.type}` - }); - } - } - _streamHandler(stream, headers) { - if (this._verifyContentType(stream, headers) !== true) { - return; - } - const path = headers[HTTP2_HEADER_PATH]; - const handler2 = this._retrieveHandler(path); - if (!handler2) { - this._respondWithError(getUnimplementedStatusResponse(path), stream, null); - return; - } - const call = new server_call_1.Http2ServerCallStream(stream, handler2, this.options); - if (!this._runHandlerForCall(call, handler2, headers)) { - call.sendError({ - code: constants_1.Status.INTERNAL, - details: `Unknown handler type: ${handler2.type}` - }); - } - } - _runHandlerForCall(call, handler2, headers) { - var _a2; - const metadata = call.receiveMetadata(headers); - const encoding = (_a2 = metadata.get("grpc-encoding")[0]) !== null && _a2 !== void 0 ? _a2 : "identity"; - metadata.remove("grpc-encoding"); - const { type } = handler2; - if (type === "unary") { - handleUnary(call, handler2, metadata, encoding); - } else if (type === "clientStream") { - handleClientStreaming(call, handler2, metadata, encoding); - } else if (type === "serverStream") { - handleServerStreaming(call, handler2, metadata, encoding); - } else if (type === "bidi") { - handleBidiStreaming(call, handler2, metadata, encoding); - } else { - return false; - } - return true; - } - _setupHandlers(http2Server) { - if (http2Server === null) { - return; - } - const serverAddress = http2Server.address(); - let serverAddressString = "null"; - if (serverAddress) { - if (typeof serverAddress === "string") { - serverAddressString = serverAddress; - } else { - serverAddressString = serverAddress.address + ":" + serverAddress.port; - } - } - this.serverAddressString = serverAddressString; - const handler2 = this.channelzEnabled ? this._channelzHandler : this._streamHandler; - http2Server.on("stream", handler2.bind(this)); - http2Server.on("session", (session) => { - var _a2, _b, _c2, _d, _e2; - if (!this.started) { - session.destroy(); - return; - } - const channelzRef = (0, channelz_1.registerChannelzSocket)((_a2 = session.socket.remoteAddress) !== null && _a2 !== void 0 ? _a2 : "unknown", this.getChannelzSessionInfoGetter(session), this.channelzEnabled); - const channelzSessionInfo = { - ref: channelzRef, - streamTracker: new channelz_1.ChannelzCallTracker(), - messagesSent: 0, - messagesReceived: 0, - lastMessageSentTimestamp: null, - lastMessageReceivedTimestamp: null - }; - this.sessions.set(session, channelzSessionInfo); - const clientAddress = session.socket.remoteAddress; - if (this.channelzEnabled) { - this.channelzTrace.addTrace("CT_INFO", "Connection established by client " + clientAddress); - this.sessionChildrenTracker.refChild(channelzRef); - } - let connectionAgeTimer = null; - let connectionAgeGraceTimer = null; - let sessionClosedByServer = false; - if (this.maxConnectionAgeMs !== UNLIMITED_CONNECTION_AGE_MS) { - const jitterMagnitude = this.maxConnectionAgeMs / 10; - const jitter = Math.random() * jitterMagnitude * 2 - jitterMagnitude; - connectionAgeTimer = (_c2 = (_b = setTimeout(() => { - var _a3, _b2; - sessionClosedByServer = true; - if (this.channelzEnabled) { - this.channelzTrace.addTrace("CT_INFO", "Connection dropped by max connection age from " + clientAddress); - } - try { - session.goaway(http2.constants.NGHTTP2_NO_ERROR, ~(1 << 31), Buffer.from("max_age")); - } catch (e) { - session.destroy(); - return; - } - session.close(); - if (this.maxConnectionAgeGraceMs !== UNLIMITED_CONNECTION_AGE_MS) { - connectionAgeGraceTimer = (_b2 = (_a3 = setTimeout(() => { - session.destroy(); - }, this.maxConnectionAgeGraceMs)).unref) === null || _b2 === void 0 ? void 0 : _b2.call(_a3); - } - }, this.maxConnectionAgeMs + jitter)).unref) === null || _c2 === void 0 ? void 0 : _c2.call(_b); - } - const keeapliveTimeTimer = (_e2 = (_d = setInterval(() => { - var _a3, _b2; - const timeoutTImer = (_b2 = (_a3 = setTimeout(() => { - sessionClosedByServer = true; - if (this.channelzEnabled) { - this.channelzTrace.addTrace("CT_INFO", "Connection dropped by keepalive timeout from " + clientAddress); - } - session.close(); - }, this.keepaliveTimeoutMs)).unref) === null || _b2 === void 0 ? void 0 : _b2.call(_a3); - try { - session.ping((err, duration, payload) => { - clearTimeout(timeoutTImer); - }); - } catch (e) { - session.destroy(); - } - }, this.keepaliveTimeMs)).unref) === null || _e2 === void 0 ? void 0 : _e2.call(_d); - session.on("close", () => { - if (this.channelzEnabled) { - if (!sessionClosedByServer) { - this.channelzTrace.addTrace("CT_INFO", "Connection dropped by client " + clientAddress); - } - this.sessionChildrenTracker.unrefChild(channelzRef); - (0, channelz_1.unregisterChannelzRef)(channelzRef); - } - if (connectionAgeTimer) { - clearTimeout(connectionAgeTimer); - } - if (connectionAgeGraceTimer) { - clearTimeout(connectionAgeGraceTimer); - } - if (keeapliveTimeTimer) { - clearTimeout(keeapliveTimeTimer); - } - this.sessions.delete(session); - }); - }); - } - }; - exports2.Server = Server3; - async function handleUnary(call, handler2, metadata, encoding) { - try { - const request = await call.receiveUnaryMessage(encoding); - if (request === void 0 || call.cancelled) { - return; - } - const emitter = new server_call_1.ServerUnaryCallImpl(call, metadata, request); - handler2.func(emitter, (err, value, trailer, flags) => { - call.sendUnaryMessage(err, value, trailer, flags); - }); - } catch (err) { - call.sendError(err); - } - } - function handleClientStreaming(call, handler2, metadata, encoding) { - const stream = new server_call_1.ServerReadableStreamImpl(call, metadata, handler2.deserialize, encoding); - function respond(err, value, trailer, flags) { - stream.destroy(); - call.sendUnaryMessage(err, value, trailer, flags); - } - if (call.cancelled) { - return; - } - stream.on("error", respond); - handler2.func(stream, respond); - } - async function handleServerStreaming(call, handler2, metadata, encoding) { - try { - const request = await call.receiveUnaryMessage(encoding); - if (request === void 0 || call.cancelled) { - return; - } - const stream = new server_call_1.ServerWritableStreamImpl(call, metadata, handler2.serialize, request); - handler2.func(stream); - } catch (err) { - call.sendError(err); - } - } - function handleBidiStreaming(call, handler2, metadata, encoding) { - const stream = new server_call_1.ServerDuplexStreamImpl(call, metadata, handler2.serialize, handler2.deserialize, encoding); - if (call.cancelled) { - return; - } - handler2.func(stream); - } - } -}); - -// node_modules/@grpc/grpc-js/build/src/status-builder.js -var require_status_builder = __commonJS({ - "node_modules/@grpc/grpc-js/build/src/status-builder.js"(exports2) { - "use strict"; - Object.defineProperty(exports2, "__esModule", { value: true }); - exports2.StatusBuilder = void 0; - var StatusBuilder = class { - constructor() { - this.code = null; - this.details = null; - this.metadata = null; - } - /** - * Adds a status code to the builder. - */ - withCode(code) { - this.code = code; - return this; - } - /** - * Adds details to the builder. - */ - withDetails(details) { - this.details = details; - return this; - } - /** - * Adds metadata to the builder. - */ - withMetadata(metadata) { - this.metadata = metadata; - return this; - } - /** - * Builds the status object. - */ - build() { - const status2 = {}; - if (this.code !== null) { - status2.code = this.code; - } - if (this.details !== null) { - status2.details = this.details; - } - if (this.metadata !== null) { - status2.metadata = this.metadata; - } - return status2; - } - }; - exports2.StatusBuilder = StatusBuilder; - } -}); - -// node_modules/@grpc/grpc-js/build/src/duration.js -var require_duration = __commonJS({ - "node_modules/@grpc/grpc-js/build/src/duration.js"(exports2) { - "use strict"; - Object.defineProperty(exports2, "__esModule", { value: true }); - exports2.isDuration = exports2.durationToMs = exports2.msToDuration = void 0; - function msToDuration(millis) { - return { - seconds: millis / 1e3 | 0, - nanos: millis % 1e3 * 1e6 | 0 - }; - } - exports2.msToDuration = msToDuration; - function durationToMs(duration) { - return duration.seconds * 1e3 + duration.nanos / 1e6 | 0; - } - exports2.durationToMs = durationToMs; - function isDuration(value) { - return typeof value.seconds === "number" && typeof value.nanos === "number"; - } - exports2.isDuration = isDuration; - } -}); - -// node_modules/@grpc/grpc-js/build/src/load-balancer-outlier-detection.js -var require_load_balancer_outlier_detection = __commonJS({ - "node_modules/@grpc/grpc-js/build/src/load-balancer-outlier-detection.js"(exports2) { - "use strict"; - var _a2; - Object.defineProperty(exports2, "__esModule", { value: true }); - exports2.setup = exports2.OutlierDetectionLoadBalancer = exports2.OutlierDetectionLoadBalancingConfig = void 0; - var connectivity_state_1 = require_connectivity_state(); - var constants_1 = require_constants(); - var duration_1 = require_duration(); - var experimental_1 = require_experimental(); - var load_balancer_1 = require_load_balancer(); - var load_balancer_child_handler_1 = require_load_balancer_child_handler(); - var picker_1 = require_picker(); - var subchannel_address_1 = require_subchannel_address(); - var subchannel_interface_1 = require_subchannel_interface(); - var logging = require_logging(); - var TRACER_NAME = "outlier_detection"; - function trace(text) { - logging.trace(constants_1.LogVerbosity.DEBUG, TRACER_NAME, text); - } - var TYPE_NAME = "outlier_detection"; - var OUTLIER_DETECTION_ENABLED = ((_a2 = process.env.GRPC_EXPERIMENTAL_ENABLE_OUTLIER_DETECTION) !== null && _a2 !== void 0 ? _a2 : "true") === "true"; - var defaultSuccessRateEjectionConfig = { - stdev_factor: 1900, - enforcement_percentage: 100, - minimum_hosts: 5, - request_volume: 100 - }; - var defaultFailurePercentageEjectionConfig = { - threshold: 85, - enforcement_percentage: 100, - minimum_hosts: 5, - request_volume: 50 - }; - function validateFieldType(obj, fieldName, expectedType, objectName) { - if (fieldName in obj && typeof obj[fieldName] !== expectedType) { - const fullFieldName = objectName ? `${objectName}.${fieldName}` : fieldName; - throw new Error(`outlier detection config ${fullFieldName} parse error: expected ${expectedType}, got ${typeof obj[fieldName]}`); - } - } - function validatePositiveDuration(obj, fieldName, objectName) { - const fullFieldName = objectName ? `${objectName}.${fieldName}` : fieldName; - if (fieldName in obj) { - if (!(0, duration_1.isDuration)(obj[fieldName])) { - throw new Error(`outlier detection config ${fullFieldName} parse error: expected Duration, got ${typeof obj[fieldName]}`); - } - if (!(obj[fieldName].seconds >= 0 && obj[fieldName].seconds <= 315576e6 && obj[fieldName].nanos >= 0 && obj[fieldName].nanos <= 999999999)) { - throw new Error(`outlier detection config ${fullFieldName} parse error: values out of range for non-negative Duaration`); - } - } - } - function validatePercentage(obj, fieldName, objectName) { - const fullFieldName = objectName ? `${objectName}.${fieldName}` : fieldName; - validateFieldType(obj, fieldName, "number", objectName); - if (fieldName in obj && !(obj[fieldName] >= 0 && obj[fieldName] <= 100)) { - throw new Error(`outlier detection config ${fullFieldName} parse error: value out of range for percentage (0-100)`); - } - } - var OutlierDetectionLoadBalancingConfig = class _OutlierDetectionLoadBalancingConfig { - constructor(intervalMs, baseEjectionTimeMs, maxEjectionTimeMs, maxEjectionPercent, successRateEjection, failurePercentageEjection, childPolicy) { - this.childPolicy = childPolicy; - if (childPolicy.length > 0 && childPolicy[0].getLoadBalancerName() === "pick_first") { - throw new Error("outlier_detection LB policy cannot have a pick_first child policy"); - } - this.intervalMs = intervalMs !== null && intervalMs !== void 0 ? intervalMs : 1e4; - this.baseEjectionTimeMs = baseEjectionTimeMs !== null && baseEjectionTimeMs !== void 0 ? baseEjectionTimeMs : 3e4; - this.maxEjectionTimeMs = maxEjectionTimeMs !== null && maxEjectionTimeMs !== void 0 ? maxEjectionTimeMs : 3e5; - this.maxEjectionPercent = maxEjectionPercent !== null && maxEjectionPercent !== void 0 ? maxEjectionPercent : 10; - this.successRateEjection = successRateEjection ? Object.assign(Object.assign({}, defaultSuccessRateEjectionConfig), successRateEjection) : null; - this.failurePercentageEjection = failurePercentageEjection ? Object.assign(Object.assign({}, defaultFailurePercentageEjectionConfig), failurePercentageEjection) : null; - } - getLoadBalancerName() { - return TYPE_NAME; - } - toJsonObject() { - return { - interval: (0, duration_1.msToDuration)(this.intervalMs), - base_ejection_time: (0, duration_1.msToDuration)(this.baseEjectionTimeMs), - max_ejection_time: (0, duration_1.msToDuration)(this.maxEjectionTimeMs), - max_ejection_percent: this.maxEjectionPercent, - success_rate_ejection: this.successRateEjection, - failure_percentage_ejection: this.failurePercentageEjection, - child_policy: this.childPolicy.map((policy) => policy.toJsonObject()) - }; - } - getIntervalMs() { - return this.intervalMs; - } - getBaseEjectionTimeMs() { - return this.baseEjectionTimeMs; - } - getMaxEjectionTimeMs() { - return this.maxEjectionTimeMs; - } - getMaxEjectionPercent() { - return this.maxEjectionPercent; - } - getSuccessRateEjectionConfig() { - return this.successRateEjection; - } - getFailurePercentageEjectionConfig() { - return this.failurePercentageEjection; - } - getChildPolicy() { - return this.childPolicy; - } - copyWithChildPolicy(childPolicy) { - return new _OutlierDetectionLoadBalancingConfig(this.intervalMs, this.baseEjectionTimeMs, this.maxEjectionTimeMs, this.maxEjectionPercent, this.successRateEjection, this.failurePercentageEjection, childPolicy); - } - static createFromJson(obj) { - var _a3; - validatePositiveDuration(obj, "interval"); - validatePositiveDuration(obj, "base_ejection_time"); - validatePositiveDuration(obj, "max_ejection_time"); - validatePercentage(obj, "max_ejection_percent"); - if ("success_rate_ejection" in obj) { - if (typeof obj.success_rate_ejection !== "object") { - throw new Error("outlier detection config success_rate_ejection must be an object"); - } - validateFieldType(obj.success_rate_ejection, "stdev_factor", "number", "success_rate_ejection"); - validatePercentage(obj.success_rate_ejection, "enforcement_percentage", "success_rate_ejection"); - validateFieldType(obj.success_rate_ejection, "minimum_hosts", "number", "success_rate_ejection"); - validateFieldType(obj.success_rate_ejection, "request_volume", "number", "success_rate_ejection"); - } - if ("failure_percentage_ejection" in obj) { - if (typeof obj.failure_percentage_ejection !== "object") { - throw new Error("outlier detection config failure_percentage_ejection must be an object"); - } - validatePercentage(obj.failure_percentage_ejection, "threshold", "failure_percentage_ejection"); - validatePercentage(obj.failure_percentage_ejection, "enforcement_percentage", "failure_percentage_ejection"); - validateFieldType(obj.failure_percentage_ejection, "minimum_hosts", "number", "failure_percentage_ejection"); - validateFieldType(obj.failure_percentage_ejection, "request_volume", "number", "failure_percentage_ejection"); - } - return new _OutlierDetectionLoadBalancingConfig(obj.interval ? (0, duration_1.durationToMs)(obj.interval) : null, obj.base_ejection_time ? (0, duration_1.durationToMs)(obj.base_ejection_time) : null, obj.max_ejection_time ? (0, duration_1.durationToMs)(obj.max_ejection_time) : null, (_a3 = obj.max_ejection_percent) !== null && _a3 !== void 0 ? _a3 : null, obj.success_rate_ejection, obj.failure_percentage_ejection, obj.child_policy.map(load_balancer_1.validateLoadBalancingConfig)); - } - }; - exports2.OutlierDetectionLoadBalancingConfig = OutlierDetectionLoadBalancingConfig; - var OutlierDetectionSubchannelWrapper = class extends subchannel_interface_1.BaseSubchannelWrapper { - constructor(childSubchannel, mapEntry) { - super(childSubchannel); - this.mapEntry = mapEntry; - this.stateListeners = []; - this.ejected = false; - this.refCount = 0; - this.childSubchannelState = childSubchannel.getConnectivityState(); - childSubchannel.addConnectivityStateListener((subchannel, previousState, newState, keepaliveTime) => { - this.childSubchannelState = newState; - if (!this.ejected) { - for (const listener of this.stateListeners) { - listener(this, previousState, newState, keepaliveTime); - } - } - }); - } - getConnectivityState() { - if (this.ejected) { - return connectivity_state_1.ConnectivityState.TRANSIENT_FAILURE; - } else { - return this.childSubchannelState; - } - } - /** - * Add a listener function to be called whenever the wrapper's - * connectivity state changes. - * @param listener - */ - addConnectivityStateListener(listener) { - this.stateListeners.push(listener); - } - /** - * Remove a listener previously added with `addConnectivityStateListener` - * @param listener A reference to a function previously passed to - * `addConnectivityStateListener` - */ - removeConnectivityStateListener(listener) { - const listenerIndex = this.stateListeners.indexOf(listener); - if (listenerIndex > -1) { - this.stateListeners.splice(listenerIndex, 1); - } - } - ref() { - this.child.ref(); - this.refCount += 1; - } - unref() { - this.child.unref(); - this.refCount -= 1; - if (this.refCount <= 0) { - if (this.mapEntry) { - const index = this.mapEntry.subchannelWrappers.indexOf(this); - if (index >= 0) { - this.mapEntry.subchannelWrappers.splice(index, 1); - } - } - } - } - eject() { - this.ejected = true; - for (const listener of this.stateListeners) { - listener(this, this.childSubchannelState, connectivity_state_1.ConnectivityState.TRANSIENT_FAILURE, -1); - } - } - uneject() { - this.ejected = false; - for (const listener of this.stateListeners) { - listener(this, connectivity_state_1.ConnectivityState.TRANSIENT_FAILURE, this.childSubchannelState, -1); - } - } - getMapEntry() { - return this.mapEntry; - } - getWrappedSubchannel() { - return this.child; - } - }; - function createEmptyBucket() { - return { - success: 0, - failure: 0 - }; - } - var CallCounter = class { - constructor() { - this.activeBucket = createEmptyBucket(); - this.inactiveBucket = createEmptyBucket(); - } - addSuccess() { - this.activeBucket.success += 1; - } - addFailure() { - this.activeBucket.failure += 1; - } - switchBuckets() { - this.inactiveBucket = this.activeBucket; - this.activeBucket = createEmptyBucket(); - } - getLastSuccesses() { - return this.inactiveBucket.success; - } - getLastFailures() { - return this.inactiveBucket.failure; - } - }; - var OutlierDetectionPicker = class { - constructor(wrappedPicker, countCalls) { - this.wrappedPicker = wrappedPicker; - this.countCalls = countCalls; - } - pick(pickArgs) { - const wrappedPick = this.wrappedPicker.pick(pickArgs); - if (wrappedPick.pickResultType === picker_1.PickResultType.COMPLETE) { - const subchannelWrapper = wrappedPick.subchannel; - const mapEntry = subchannelWrapper.getMapEntry(); - if (mapEntry) { - let onCallEnded = wrappedPick.onCallEnded; - if (this.countCalls) { - onCallEnded = (statusCode) => { - var _a3; - if (statusCode === constants_1.Status.OK) { - mapEntry.counter.addSuccess(); - } else { - mapEntry.counter.addFailure(); - } - (_a3 = wrappedPick.onCallEnded) === null || _a3 === void 0 ? void 0 : _a3.call(wrappedPick, statusCode); - }; - } - return Object.assign(Object.assign({}, wrappedPick), { subchannel: subchannelWrapper.getWrappedSubchannel(), onCallEnded }); - } else { - return Object.assign(Object.assign({}, wrappedPick), { subchannel: subchannelWrapper.getWrappedSubchannel() }); - } - } else { - return wrappedPick; - } - } - }; - var OutlierDetectionLoadBalancer = class { - constructor(channelControlHelper) { - this.addressMap = /* @__PURE__ */ new Map(); - this.latestConfig = null; - this.timerStartTime = null; - this.childBalancer = new load_balancer_child_handler_1.ChildLoadBalancerHandler((0, experimental_1.createChildChannelControlHelper)(channelControlHelper, { - createSubchannel: (subchannelAddress, subchannelArgs) => { - const originalSubchannel = channelControlHelper.createSubchannel(subchannelAddress, subchannelArgs); - const mapEntry = this.addressMap.get((0, subchannel_address_1.subchannelAddressToString)(subchannelAddress)); - const subchannelWrapper = new OutlierDetectionSubchannelWrapper(originalSubchannel, mapEntry); - if ((mapEntry === null || mapEntry === void 0 ? void 0 : mapEntry.currentEjectionTimestamp) !== null) { - subchannelWrapper.eject(); - } - mapEntry === null || mapEntry === void 0 ? void 0 : mapEntry.subchannelWrappers.push(subchannelWrapper); - return subchannelWrapper; - }, - updateState: (connectivityState, picker) => { - if (connectivityState === connectivity_state_1.ConnectivityState.READY) { - channelControlHelper.updateState(connectivityState, new OutlierDetectionPicker(picker, this.isCountingEnabled())); - } else { - channelControlHelper.updateState(connectivityState, picker); - } - } - })); - this.ejectionTimer = setInterval(() => { - }, 0); - clearInterval(this.ejectionTimer); - } - isCountingEnabled() { - return this.latestConfig !== null && (this.latestConfig.getSuccessRateEjectionConfig() !== null || this.latestConfig.getFailurePercentageEjectionConfig() !== null); - } - getCurrentEjectionPercent() { - let ejectionCount = 0; - for (const mapEntry of this.addressMap.values()) { - if (mapEntry.currentEjectionTimestamp !== null) { - ejectionCount += 1; - } - } - return ejectionCount * 100 / this.addressMap.size; - } - runSuccessRateCheck(ejectionTimestamp) { - if (!this.latestConfig) { - return; - } - const successRateConfig = this.latestConfig.getSuccessRateEjectionConfig(); - if (!successRateConfig) { - return; - } - trace("Running success rate check"); - const targetRequestVolume = successRateConfig.request_volume; - let addresesWithTargetVolume = 0; - const successRates = []; - for (const [address, mapEntry] of this.addressMap) { - const successes = mapEntry.counter.getLastSuccesses(); - const failures = mapEntry.counter.getLastFailures(); - trace("Stats for " + address + ": successes=" + successes + " failures=" + failures + " targetRequestVolume=" + targetRequestVolume); - if (successes + failures >= targetRequestVolume) { - addresesWithTargetVolume += 1; - successRates.push(successes / (successes + failures)); - } - } - trace("Found " + addresesWithTargetVolume + " success rate candidates; currentEjectionPercent=" + this.getCurrentEjectionPercent() + " successRates=[" + successRates + "]"); - if (addresesWithTargetVolume < successRateConfig.minimum_hosts) { - return; - } - const successRateMean = successRates.reduce((a, b) => a + b) / successRates.length; - let successRateDeviationSum = 0; - for (const rate of successRates) { - const deviation = rate - successRateMean; - successRateDeviationSum += deviation * deviation; - } - const successRateVariance = successRateDeviationSum / successRates.length; - const successRateStdev = Math.sqrt(successRateVariance); - const ejectionThreshold = successRateMean - successRateStdev * (successRateConfig.stdev_factor / 1e3); - trace("stdev=" + successRateStdev + " ejectionThreshold=" + ejectionThreshold); - for (const [address, mapEntry] of this.addressMap.entries()) { - if (this.getCurrentEjectionPercent() >= this.latestConfig.getMaxEjectionPercent()) { - break; - } - const successes = mapEntry.counter.getLastSuccesses(); - const failures = mapEntry.counter.getLastFailures(); - if (successes + failures < targetRequestVolume) { - continue; - } - const successRate = successes / (successes + failures); - trace("Checking candidate " + address + " successRate=" + successRate); - if (successRate < ejectionThreshold) { - const randomNumber = Math.random() * 100; - trace("Candidate " + address + " randomNumber=" + randomNumber + " enforcement_percentage=" + successRateConfig.enforcement_percentage); - if (randomNumber < successRateConfig.enforcement_percentage) { - trace("Ejecting candidate " + address); - this.eject(mapEntry, ejectionTimestamp); - } - } - } - } - runFailurePercentageCheck(ejectionTimestamp) { - if (!this.latestConfig) { - return; - } - const failurePercentageConfig = this.latestConfig.getFailurePercentageEjectionConfig(); - if (!failurePercentageConfig) { - return; - } - trace("Running failure percentage check. threshold=" + failurePercentageConfig.threshold + " request volume threshold=" + failurePercentageConfig.request_volume); - let addressesWithTargetVolume = 0; - for (const mapEntry of this.addressMap.values()) { - const successes = mapEntry.counter.getLastSuccesses(); - const failures = mapEntry.counter.getLastFailures(); - if (successes + failures >= failurePercentageConfig.request_volume) { - addressesWithTargetVolume += 1; - } - } - if (addressesWithTargetVolume < failurePercentageConfig.minimum_hosts) { - return; - } - for (const [address, mapEntry] of this.addressMap.entries()) { - if (this.getCurrentEjectionPercent() >= this.latestConfig.getMaxEjectionPercent()) { - break; - } - const successes = mapEntry.counter.getLastSuccesses(); - const failures = mapEntry.counter.getLastFailures(); - trace("Candidate successes=" + successes + " failures=" + failures); - if (successes + failures < failurePercentageConfig.request_volume) { - continue; - } - const failurePercentage = failures * 100 / (failures + successes); - if (failurePercentage > failurePercentageConfig.threshold) { - const randomNumber = Math.random() * 100; - trace("Candidate " + address + " randomNumber=" + randomNumber + " enforcement_percentage=" + failurePercentageConfig.enforcement_percentage); - if (randomNumber < failurePercentageConfig.enforcement_percentage) { - trace("Ejecting candidate " + address); - this.eject(mapEntry, ejectionTimestamp); - } - } - } - } - eject(mapEntry, ejectionTimestamp) { - mapEntry.currentEjectionTimestamp = /* @__PURE__ */ new Date(); - mapEntry.ejectionTimeMultiplier += 1; - for (const subchannelWrapper of mapEntry.subchannelWrappers) { - subchannelWrapper.eject(); - } - } - uneject(mapEntry) { - mapEntry.currentEjectionTimestamp = null; - for (const subchannelWrapper of mapEntry.subchannelWrappers) { - subchannelWrapper.uneject(); - } - } - switchAllBuckets() { - for (const mapEntry of this.addressMap.values()) { - mapEntry.counter.switchBuckets(); - } - } - startTimer(delayMs) { - var _a3, _b; - this.ejectionTimer = setTimeout(() => this.runChecks(), delayMs); - (_b = (_a3 = this.ejectionTimer).unref) === null || _b === void 0 ? void 0 : _b.call(_a3); - } - runChecks() { - const ejectionTimestamp = /* @__PURE__ */ new Date(); - trace("Ejection timer running"); - this.switchAllBuckets(); - if (!this.latestConfig) { - return; - } - this.timerStartTime = ejectionTimestamp; - this.startTimer(this.latestConfig.getIntervalMs()); - this.runSuccessRateCheck(ejectionTimestamp); - this.runFailurePercentageCheck(ejectionTimestamp); - for (const [address, mapEntry] of this.addressMap.entries()) { - if (mapEntry.currentEjectionTimestamp === null) { - if (mapEntry.ejectionTimeMultiplier > 0) { - mapEntry.ejectionTimeMultiplier -= 1; - } - } else { - const baseEjectionTimeMs = this.latestConfig.getBaseEjectionTimeMs(); - const maxEjectionTimeMs = this.latestConfig.getMaxEjectionTimeMs(); - const returnTime = new Date(mapEntry.currentEjectionTimestamp.getTime()); - returnTime.setMilliseconds(returnTime.getMilliseconds() + Math.min(baseEjectionTimeMs * mapEntry.ejectionTimeMultiplier, Math.max(baseEjectionTimeMs, maxEjectionTimeMs))); - if (returnTime < /* @__PURE__ */ new Date()) { - trace("Unejecting " + address); - this.uneject(mapEntry); - } - } - } - } - updateAddressList(addressList, lbConfig, attributes) { - if (!(lbConfig instanceof OutlierDetectionLoadBalancingConfig)) { - return; - } - const subchannelAddresses = /* @__PURE__ */ new Set(); - for (const address of addressList) { - subchannelAddresses.add((0, subchannel_address_1.subchannelAddressToString)(address)); - } - for (const address of subchannelAddresses) { - if (!this.addressMap.has(address)) { - trace("Adding map entry for " + address); - this.addressMap.set(address, { - counter: new CallCounter(), - currentEjectionTimestamp: null, - ejectionTimeMultiplier: 0, - subchannelWrappers: [] - }); - } - } - for (const key of this.addressMap.keys()) { - if (!subchannelAddresses.has(key)) { - trace("Removing map entry for " + key); - this.addressMap.delete(key); - } - } - const childPolicy = (0, load_balancer_1.getFirstUsableConfig)(lbConfig.getChildPolicy(), true); - this.childBalancer.updateAddressList(addressList, childPolicy, attributes); - if (lbConfig.getSuccessRateEjectionConfig() || lbConfig.getFailurePercentageEjectionConfig()) { - if (this.timerStartTime) { - trace("Previous timer existed. Replacing timer"); - clearTimeout(this.ejectionTimer); - const remainingDelay = lbConfig.getIntervalMs() - ((/* @__PURE__ */ new Date()).getTime() - this.timerStartTime.getTime()); - this.startTimer(remainingDelay); - } else { - trace("Starting new timer"); - this.timerStartTime = /* @__PURE__ */ new Date(); - this.startTimer(lbConfig.getIntervalMs()); - this.switchAllBuckets(); - } - } else { - trace("Counting disabled. Cancelling timer."); - this.timerStartTime = null; - clearTimeout(this.ejectionTimer); - for (const mapEntry of this.addressMap.values()) { - this.uneject(mapEntry); - mapEntry.ejectionTimeMultiplier = 0; - } - } - this.latestConfig = lbConfig; - } - exitIdle() { - this.childBalancer.exitIdle(); - } - resetBackoff() { - this.childBalancer.resetBackoff(); - } - destroy() { - clearTimeout(this.ejectionTimer); - this.childBalancer.destroy(); - } - getTypeName() { - return TYPE_NAME; - } - }; - exports2.OutlierDetectionLoadBalancer = OutlierDetectionLoadBalancer; - function setup() { - if (OUTLIER_DETECTION_ENABLED) { - (0, experimental_1.registerLoadBalancerType)(TYPE_NAME, OutlierDetectionLoadBalancer, OutlierDetectionLoadBalancingConfig); - } - } - exports2.setup = setup; - } -}); - -// node_modules/@grpc/grpc-js/build/src/experimental.js -var require_experimental = __commonJS({ - "node_modules/@grpc/grpc-js/build/src/experimental.js"(exports2) { - "use strict"; - Object.defineProperty(exports2, "__esModule", { value: true }); - exports2.OutlierDetectionLoadBalancingConfig = exports2.BaseSubchannelWrapper = exports2.registerAdminService = exports2.FilterStackFactory = exports2.BaseFilter = exports2.PickResultType = exports2.QueuePicker = exports2.UnavailablePicker = exports2.ChildLoadBalancerHandler = exports2.subchannelAddressToString = exports2.validateLoadBalancingConfig = exports2.getFirstUsableConfig = exports2.registerLoadBalancerType = exports2.createChildChannelControlHelper = exports2.BackoffTimeout = exports2.durationToMs = exports2.uriToString = exports2.createResolver = exports2.registerResolver = exports2.log = exports2.trace = void 0; - var logging_1 = require_logging(); - Object.defineProperty(exports2, "trace", { enumerable: true, get: function() { - return logging_1.trace; - } }); - Object.defineProperty(exports2, "log", { enumerable: true, get: function() { - return logging_1.log; - } }); - var resolver_1 = require_resolver(); - Object.defineProperty(exports2, "registerResolver", { enumerable: true, get: function() { - return resolver_1.registerResolver; - } }); - Object.defineProperty(exports2, "createResolver", { enumerable: true, get: function() { - return resolver_1.createResolver; - } }); - var uri_parser_1 = require_uri_parser(); - Object.defineProperty(exports2, "uriToString", { enumerable: true, get: function() { - return uri_parser_1.uriToString; - } }); - var duration_1 = require_duration(); - Object.defineProperty(exports2, "durationToMs", { enumerable: true, get: function() { - return duration_1.durationToMs; - } }); - var backoff_timeout_1 = require_backoff_timeout(); - Object.defineProperty(exports2, "BackoffTimeout", { enumerable: true, get: function() { - return backoff_timeout_1.BackoffTimeout; - } }); - var load_balancer_1 = require_load_balancer(); - Object.defineProperty(exports2, "createChildChannelControlHelper", { enumerable: true, get: function() { - return load_balancer_1.createChildChannelControlHelper; - } }); - Object.defineProperty(exports2, "registerLoadBalancerType", { enumerable: true, get: function() { - return load_balancer_1.registerLoadBalancerType; - } }); - Object.defineProperty(exports2, "getFirstUsableConfig", { enumerable: true, get: function() { - return load_balancer_1.getFirstUsableConfig; - } }); - Object.defineProperty(exports2, "validateLoadBalancingConfig", { enumerable: true, get: function() { - return load_balancer_1.validateLoadBalancingConfig; - } }); - var subchannel_address_1 = require_subchannel_address(); - Object.defineProperty(exports2, "subchannelAddressToString", { enumerable: true, get: function() { - return subchannel_address_1.subchannelAddressToString; - } }); - var load_balancer_child_handler_1 = require_load_balancer_child_handler(); - Object.defineProperty(exports2, "ChildLoadBalancerHandler", { enumerable: true, get: function() { - return load_balancer_child_handler_1.ChildLoadBalancerHandler; - } }); - var picker_1 = require_picker(); - Object.defineProperty(exports2, "UnavailablePicker", { enumerable: true, get: function() { - return picker_1.UnavailablePicker; - } }); - Object.defineProperty(exports2, "QueuePicker", { enumerable: true, get: function() { - return picker_1.QueuePicker; - } }); - Object.defineProperty(exports2, "PickResultType", { enumerable: true, get: function() { - return picker_1.PickResultType; - } }); - var filter_1 = require_filter(); - Object.defineProperty(exports2, "BaseFilter", { enumerable: true, get: function() { - return filter_1.BaseFilter; - } }); - var filter_stack_1 = require_filter_stack(); - Object.defineProperty(exports2, "FilterStackFactory", { enumerable: true, get: function() { - return filter_stack_1.FilterStackFactory; - } }); - var admin_1 = require_admin(); - Object.defineProperty(exports2, "registerAdminService", { enumerable: true, get: function() { - return admin_1.registerAdminService; - } }); - var subchannel_interface_1 = require_subchannel_interface(); - Object.defineProperty(exports2, "BaseSubchannelWrapper", { enumerable: true, get: function() { - return subchannel_interface_1.BaseSubchannelWrapper; - } }); - var load_balancer_outlier_detection_1 = require_load_balancer_outlier_detection(); - Object.defineProperty(exports2, "OutlierDetectionLoadBalancingConfig", { enumerable: true, get: function() { - return load_balancer_outlier_detection_1.OutlierDetectionLoadBalancingConfig; - } }); - } -}); - -// node_modules/@grpc/grpc-js/build/src/resolver-dns.js -var require_resolver_dns = __commonJS({ - "node_modules/@grpc/grpc-js/build/src/resolver-dns.js"(exports2) { - "use strict"; - Object.defineProperty(exports2, "__esModule", { value: true }); - exports2.setup = void 0; - var resolver_1 = require_resolver(); - var dns = require("dns"); - var util = require("util"); - var service_config_1 = require_service_config(); - var constants_1 = require_constants(); - var metadata_1 = require_metadata(); - var logging = require_logging(); - var constants_2 = require_constants(); - var uri_parser_1 = require_uri_parser(); - var net_1 = require("net"); - var backoff_timeout_1 = require_backoff_timeout(); - var TRACER_NAME = "dns_resolver"; - function trace(text) { - logging.trace(constants_2.LogVerbosity.DEBUG, TRACER_NAME, text); - } - var DEFAULT_PORT = 443; - var DEFAULT_MIN_TIME_BETWEEN_RESOLUTIONS_MS = 3e4; - var resolveTxtPromise = util.promisify(dns.resolveTxt); - var dnsLookupPromise = util.promisify(dns.lookup); - function mergeArrays(...arrays) { - const result = []; - for (let i = 0; i < Math.max.apply(null, arrays.map((array) => array.length)); i++) { - for (const array of arrays) { - if (i < array.length) { - result.push(array[i]); - } - } - } - return result; - } - var DnsResolver = class { - constructor(target, listener, channelOptions) { - var _a2, _b, _c2; - this.target = target; - this.listener = listener; - this.pendingLookupPromise = null; - this.pendingTxtPromise = null; - this.latestLookupResult = null; - this.latestServiceConfig = null; - this.latestServiceConfigError = null; - this.continueResolving = false; - this.isNextResolutionTimerRunning = false; - this.isServiceConfigEnabled = true; - trace("Resolver constructed for target " + (0, uri_parser_1.uriToString)(target)); - const hostPort = (0, uri_parser_1.splitHostPort)(target.path); - if (hostPort === null) { - this.ipResult = null; - this.dnsHostname = null; - this.port = null; - } else { - if ((0, net_1.isIPv4)(hostPort.host) || (0, net_1.isIPv6)(hostPort.host)) { - this.ipResult = [ - { - host: hostPort.host, - port: (_a2 = hostPort.port) !== null && _a2 !== void 0 ? _a2 : DEFAULT_PORT - } - ]; - this.dnsHostname = null; - this.port = null; - } else { - this.ipResult = null; - this.dnsHostname = hostPort.host; - this.port = (_b = hostPort.port) !== null && _b !== void 0 ? _b : DEFAULT_PORT; - } - } - this.percentage = Math.random() * 100; - if (channelOptions["grpc.service_config_disable_resolution"] === 1) { - this.isServiceConfigEnabled = false; - } - this.defaultResolutionError = { - code: constants_1.Status.UNAVAILABLE, - details: `Name resolution failed for target ${(0, uri_parser_1.uriToString)(this.target)}`, - metadata: new metadata_1.Metadata() - }; - const backoffOptions = { - initialDelay: channelOptions["grpc.initial_reconnect_backoff_ms"], - maxDelay: channelOptions["grpc.max_reconnect_backoff_ms"] - }; - this.backoff = new backoff_timeout_1.BackoffTimeout(() => { - if (this.continueResolving) { - this.startResolutionWithBackoff(); - } - }, backoffOptions); - this.backoff.unref(); - this.minTimeBetweenResolutionsMs = (_c2 = channelOptions["grpc.dns_min_time_between_resolutions_ms"]) !== null && _c2 !== void 0 ? _c2 : DEFAULT_MIN_TIME_BETWEEN_RESOLUTIONS_MS; - this.nextResolutionTimer = setTimeout(() => { - }, 0); - clearTimeout(this.nextResolutionTimer); - } - /** - * If the target is an IP address, just provide that address as a result. - * Otherwise, initiate A, AAAA, and TXT lookups - */ - startResolution() { - if (this.ipResult !== null) { - trace("Returning IP address for target " + (0, uri_parser_1.uriToString)(this.target)); - setImmediate(() => { - this.listener.onSuccessfulResolution(this.ipResult, null, null, null, {}); - }); - this.backoff.stop(); - this.backoff.reset(); - return; - } - if (this.dnsHostname === null) { - trace("Failed to parse DNS address " + (0, uri_parser_1.uriToString)(this.target)); - setImmediate(() => { - this.listener.onError({ - code: constants_1.Status.UNAVAILABLE, - details: `Failed to parse DNS address ${(0, uri_parser_1.uriToString)(this.target)}`, - metadata: new metadata_1.Metadata() - }); - }); - this.stopNextResolutionTimer(); - } else { - if (this.pendingLookupPromise !== null) { - return; - } - trace("Looking up DNS hostname " + this.dnsHostname); - this.latestLookupResult = null; - const hostname = this.dnsHostname; - this.pendingLookupPromise = dnsLookupPromise(hostname, { all: true }); - this.pendingLookupPromise.then((addressList) => { - if (this.pendingLookupPromise === null) { - return; - } - this.pendingLookupPromise = null; - this.backoff.reset(); - this.backoff.stop(); - const ip4Addresses = addressList.filter((addr) => addr.family === 4); - const ip6Addresses = addressList.filter((addr) => addr.family === 6); - this.latestLookupResult = mergeArrays(ip6Addresses, ip4Addresses).map((addr) => ({ host: addr.address, port: +this.port })); - const allAddressesString = "[" + this.latestLookupResult.map((addr) => addr.host + ":" + addr.port).join(",") + "]"; - trace("Resolved addresses for target " + (0, uri_parser_1.uriToString)(this.target) + ": " + allAddressesString); - if (this.latestLookupResult.length === 0) { - this.listener.onError(this.defaultResolutionError); - return; - } - this.listener.onSuccessfulResolution(this.latestLookupResult, this.latestServiceConfig, this.latestServiceConfigError, null, {}); - }, (err) => { - if (this.pendingLookupPromise === null) { - return; - } - trace("Resolution error for target " + (0, uri_parser_1.uriToString)(this.target) + ": " + err.message); - this.pendingLookupPromise = null; - this.stopNextResolutionTimer(); - this.listener.onError(this.defaultResolutionError); - }); - if (this.isServiceConfigEnabled && this.pendingTxtPromise === null) { - this.pendingTxtPromise = resolveTxtPromise(hostname); - this.pendingTxtPromise.then((txtRecord) => { - if (this.pendingTxtPromise === null) { - return; - } - this.pendingTxtPromise = null; - try { - this.latestServiceConfig = (0, service_config_1.extractAndSelectServiceConfig)(txtRecord, this.percentage); - } catch (err) { - this.latestServiceConfigError = { - code: constants_1.Status.UNAVAILABLE, - details: `Parsing service config failed with error ${err.message}`, - metadata: new metadata_1.Metadata() - }; - } - if (this.latestLookupResult !== null) { - this.listener.onSuccessfulResolution(this.latestLookupResult, this.latestServiceConfig, this.latestServiceConfigError, null, {}); - } - }, (err) => { - }); - } - } - } - startNextResolutionTimer() { - var _a2, _b; - clearTimeout(this.nextResolutionTimer); - this.nextResolutionTimer = (_b = (_a2 = setTimeout(() => { - this.stopNextResolutionTimer(); - if (this.continueResolving) { - this.startResolutionWithBackoff(); - } - }, this.minTimeBetweenResolutionsMs)).unref) === null || _b === void 0 ? void 0 : _b.call(_a2); - this.isNextResolutionTimerRunning = true; - } - stopNextResolutionTimer() { - clearTimeout(this.nextResolutionTimer); - this.isNextResolutionTimerRunning = false; - } - startResolutionWithBackoff() { - if (this.pendingLookupPromise === null) { - this.continueResolving = false; - this.startResolution(); - this.backoff.runOnce(); - this.startNextResolutionTimer(); - } - } - updateResolution() { - if (this.pendingLookupPromise === null) { - if (this.isNextResolutionTimerRunning || this.backoff.isRunning()) { - this.continueResolving = true; - } else { - this.startResolutionWithBackoff(); - } - } - } - /** - * Reset the resolver to the same state it had when it was created. In-flight - * DNS requests cannot be cancelled, but they are discarded and their results - * will be ignored. - */ - destroy() { - this.continueResolving = false; - this.backoff.reset(); - this.backoff.stop(); - this.stopNextResolutionTimer(); - this.pendingLookupPromise = null; - this.pendingTxtPromise = null; - this.latestLookupResult = null; - this.latestServiceConfig = null; - this.latestServiceConfigError = null; - } - /** - * Get the default authority for the given target. For IP targets, that is - * the IP address. For DNS targets, it is the hostname. - * @param target - */ - static getDefaultAuthority(target) { - return target.path; - } - }; - function setup() { - (0, resolver_1.registerResolver)("dns", DnsResolver); - (0, resolver_1.registerDefaultScheme)("dns"); - } - exports2.setup = setup; - } -}); - -// node_modules/@grpc/grpc-js/build/src/resolver-uds.js -var require_resolver_uds = __commonJS({ - "node_modules/@grpc/grpc-js/build/src/resolver-uds.js"(exports2) { - "use strict"; - Object.defineProperty(exports2, "__esModule", { value: true }); - exports2.setup = void 0; - var resolver_1 = require_resolver(); - var UdsResolver = class { - constructor(target, listener, channelOptions) { - this.listener = listener; - this.addresses = []; - let path; - if (target.authority === "") { - path = "/" + target.path; - } else { - path = target.path; - } - this.addresses = [{ path }]; - } - updateResolution() { - process.nextTick(this.listener.onSuccessfulResolution, this.addresses, null, null, null, {}); - } - destroy() { - } - static getDefaultAuthority(target) { - return "localhost"; - } - }; - function setup() { - (0, resolver_1.registerResolver)("unix", UdsResolver); - } - exports2.setup = setup; - } -}); - -// node_modules/@grpc/grpc-js/build/src/resolver-ip.js -var require_resolver_ip = __commonJS({ - "node_modules/@grpc/grpc-js/build/src/resolver-ip.js"(exports2) { - "use strict"; - Object.defineProperty(exports2, "__esModule", { value: true }); - exports2.setup = void 0; - var net_1 = require("net"); - var constants_1 = require_constants(); - var metadata_1 = require_metadata(); - var resolver_1 = require_resolver(); - var uri_parser_1 = require_uri_parser(); - var logging = require_logging(); - var TRACER_NAME = "ip_resolver"; - function trace(text) { - logging.trace(constants_1.LogVerbosity.DEBUG, TRACER_NAME, text); - } - var IPV4_SCHEME = "ipv4"; - var IPV6_SCHEME = "ipv6"; - var DEFAULT_PORT = 443; - var IpResolver = class { - constructor(target, listener, channelOptions) { - var _a2; - this.listener = listener; - this.addresses = []; - this.error = null; - trace("Resolver constructed for target " + (0, uri_parser_1.uriToString)(target)); - const addresses = []; - if (!(target.scheme === IPV4_SCHEME || target.scheme === IPV6_SCHEME)) { - this.error = { - code: constants_1.Status.UNAVAILABLE, - details: `Unrecognized scheme ${target.scheme} in IP resolver`, - metadata: new metadata_1.Metadata() - }; - return; - } - const pathList = target.path.split(","); - for (const path of pathList) { - const hostPort = (0, uri_parser_1.splitHostPort)(path); - if (hostPort === null) { - this.error = { - code: constants_1.Status.UNAVAILABLE, - details: `Failed to parse ${target.scheme} address ${path}`, - metadata: new metadata_1.Metadata() - }; - return; - } - if (target.scheme === IPV4_SCHEME && !(0, net_1.isIPv4)(hostPort.host) || target.scheme === IPV6_SCHEME && !(0, net_1.isIPv6)(hostPort.host)) { - this.error = { - code: constants_1.Status.UNAVAILABLE, - details: `Failed to parse ${target.scheme} address ${path}`, - metadata: new metadata_1.Metadata() - }; - return; - } - addresses.push({ - host: hostPort.host, - port: (_a2 = hostPort.port) !== null && _a2 !== void 0 ? _a2 : DEFAULT_PORT - }); - } - this.addresses = addresses; - trace("Parsed " + target.scheme + " address list " + this.addresses); - } - updateResolution() { - process.nextTick(() => { - if (this.error) { - this.listener.onError(this.error); - } else { - this.listener.onSuccessfulResolution(this.addresses, null, null, null, {}); - } - }); - } - destroy() { - } - static getDefaultAuthority(target) { - return target.path.split(",")[0]; - } - }; - function setup() { - (0, resolver_1.registerResolver)(IPV4_SCHEME, IpResolver); - (0, resolver_1.registerResolver)(IPV6_SCHEME, IpResolver); - } - exports2.setup = setup; - } -}); - -// node_modules/@grpc/grpc-js/build/src/load-balancer-pick-first.js -var require_load_balancer_pick_first = __commonJS({ - "node_modules/@grpc/grpc-js/build/src/load-balancer-pick-first.js"(exports2) { - "use strict"; - Object.defineProperty(exports2, "__esModule", { value: true }); - exports2.setup = exports2.PickFirstLoadBalancer = exports2.shuffled = exports2.PickFirstLoadBalancingConfig = void 0; - var load_balancer_1 = require_load_balancer(); - var connectivity_state_1 = require_connectivity_state(); - var picker_1 = require_picker(); - var logging = require_logging(); - var constants_1 = require_constants(); - var TRACER_NAME = "pick_first"; - function trace(text) { - logging.trace(constants_1.LogVerbosity.DEBUG, TRACER_NAME, text); - } - var TYPE_NAME = "pick_first"; - var CONNECTION_DELAY_INTERVAL_MS = 250; - var PickFirstLoadBalancingConfig = class _PickFirstLoadBalancingConfig { - constructor(shuffleAddressList) { - this.shuffleAddressList = shuffleAddressList; - } - getLoadBalancerName() { - return TYPE_NAME; - } - toJsonObject() { - return { - [TYPE_NAME]: { - shuffleAddressList: this.shuffleAddressList - } - }; - } - getShuffleAddressList() { - return this.shuffleAddressList; - } - // eslint-disable-next-line @typescript-eslint/no-explicit-any - static createFromJson(obj) { - if ("shuffleAddressList" in obj && !(typeof obj.shuffleAddressList === "boolean")) { - throw new Error("pick_first config field shuffleAddressList must be a boolean if provided"); - } - return new _PickFirstLoadBalancingConfig(obj.shuffleAddressList === true); - } - }; - exports2.PickFirstLoadBalancingConfig = PickFirstLoadBalancingConfig; - var PickFirstPicker = class { - constructor(subchannel) { - this.subchannel = subchannel; - } - pick(pickArgs) { - return { - pickResultType: picker_1.PickResultType.COMPLETE, - subchannel: this.subchannel, - status: null, - onCallStarted: null, - onCallEnded: null - }; - } - }; - function shuffled(list) { - const result = list.slice(); - for (let i = result.length - 1; i > 1; i--) { - const j2 = Math.floor(Math.random() * (i + 1)); - const temp = result[i]; - result[i] = result[j2]; - result[j2] = temp; - } - return result; - } - exports2.shuffled = shuffled; - var PickFirstLoadBalancer = class { - /** - * Load balancer that attempts to connect to each backend in the address list - * in order, and picks the first one that connects, using it for every - * request. - * @param channelControlHelper `ChannelControlHelper` instance provided by - * this load balancer's owner. - */ - constructor(channelControlHelper) { - this.channelControlHelper = channelControlHelper; - this.children = []; - this.currentState = connectivity_state_1.ConnectivityState.IDLE; - this.currentSubchannelIndex = 0; - this.currentPick = null; - this.subchannelStateListener = (subchannel, previousState, newState) => { - this.onSubchannelStateUpdate(subchannel, previousState, newState); - }; - this.triedAllSubchannels = false; - this.stickyTransientFailureMode = false; - this.connectionDelayTimeout = setTimeout(() => { - }, 0); - clearTimeout(this.connectionDelayTimeout); - } - allChildrenHaveReportedTF() { - return this.children.every((child) => child.hasReportedTransientFailure); - } - calculateAndReportNewState() { - if (this.currentPick) { - this.updateState(connectivity_state_1.ConnectivityState.READY, new PickFirstPicker(this.currentPick)); - } else if (this.children.length === 0) { - this.updateState(connectivity_state_1.ConnectivityState.IDLE, new picker_1.QueuePicker(this)); - } else { - if (this.stickyTransientFailureMode) { - this.updateState(connectivity_state_1.ConnectivityState.TRANSIENT_FAILURE, new picker_1.UnavailablePicker()); - } else { - this.updateState(connectivity_state_1.ConnectivityState.CONNECTING, new picker_1.QueuePicker(this)); - } - } - } - maybeEnterStickyTransientFailureMode() { - if (this.stickyTransientFailureMode) { - return; - } - if (!this.allChildrenHaveReportedTF()) { - return; - } - this.stickyTransientFailureMode = true; - this.channelControlHelper.requestReresolution(); - for (const { subchannel } of this.children) { - subchannel.startConnecting(); - } - this.calculateAndReportNewState(); - } - removeCurrentPick() { - if (this.currentPick !== null) { - const currentPick = this.currentPick; - this.currentPick = null; - currentPick.unref(); - currentPick.removeConnectivityStateListener(this.subchannelStateListener); - this.channelControlHelper.removeChannelzChild(currentPick.getChannelzRef()); - } - } - onSubchannelStateUpdate(subchannel, previousState, newState) { - var _a2; - if ((_a2 = this.currentPick) === null || _a2 === void 0 ? void 0 : _a2.realSubchannelEquals(subchannel)) { - if (newState !== connectivity_state_1.ConnectivityState.READY) { - this.removeCurrentPick(); - this.calculateAndReportNewState(); - this.channelControlHelper.requestReresolution(); - } - return; - } - for (const [index, child] of this.children.entries()) { - if (subchannel.realSubchannelEquals(child.subchannel)) { - if (newState === connectivity_state_1.ConnectivityState.READY) { - this.pickSubchannel(child.subchannel); - } - if (newState === connectivity_state_1.ConnectivityState.TRANSIENT_FAILURE) { - child.hasReportedTransientFailure = true; - this.maybeEnterStickyTransientFailureMode(); - if (index === this.currentSubchannelIndex) { - this.startNextSubchannelConnecting(index + 1); - } - } - child.subchannel.startConnecting(); - return; - } - } - } - startNextSubchannelConnecting(startIndex) { - clearTimeout(this.connectionDelayTimeout); - if (this.triedAllSubchannels || this.stickyTransientFailureMode) { - return; - } - for (const [index, child] of this.children.entries()) { - if (index >= startIndex) { - const subchannelState = child.subchannel.getConnectivityState(); - if (subchannelState === connectivity_state_1.ConnectivityState.IDLE || subchannelState === connectivity_state_1.ConnectivityState.CONNECTING) { - this.startConnecting(index); - return; - } - } - } - this.triedAllSubchannels = true; - this.maybeEnterStickyTransientFailureMode(); - } - /** - * Have a single subchannel in the `subchannels` list start connecting. - * @param subchannelIndex The index into the `subchannels` list. - */ - startConnecting(subchannelIndex) { - var _a2, _b; - clearTimeout(this.connectionDelayTimeout); - this.currentSubchannelIndex = subchannelIndex; - if (this.children[subchannelIndex].subchannel.getConnectivityState() === connectivity_state_1.ConnectivityState.IDLE) { - trace("Start connecting to subchannel with address " + this.children[subchannelIndex].subchannel.getAddress()); - process.nextTick(() => { - this.children[subchannelIndex].subchannel.startConnecting(); - }); - } - this.connectionDelayTimeout = (_b = (_a2 = setTimeout(() => { - this.startNextSubchannelConnecting(subchannelIndex + 1); - }, CONNECTION_DELAY_INTERVAL_MS)).unref) === null || _b === void 0 ? void 0 : _b.call(_a2); - } - pickSubchannel(subchannel) { - if (subchannel === this.currentPick) { - return; - } - trace("Pick subchannel with address " + subchannel.getAddress()); - this.stickyTransientFailureMode = false; - if (this.currentPick !== null) { - this.currentPick.unref(); - this.channelControlHelper.removeChannelzChild(this.currentPick.getChannelzRef()); - this.currentPick.removeConnectivityStateListener(this.subchannelStateListener); - } - this.currentPick = subchannel; - subchannel.ref(); - this.channelControlHelper.addChannelzChild(subchannel.getChannelzRef()); - this.resetSubchannelList(); - clearTimeout(this.connectionDelayTimeout); - this.calculateAndReportNewState(); - } - updateState(newState, picker) { - trace(connectivity_state_1.ConnectivityState[this.currentState] + " -> " + connectivity_state_1.ConnectivityState[newState]); - this.currentState = newState; - this.channelControlHelper.updateState(newState, picker); - } - resetSubchannelList() { - for (const child of this.children) { - if (child.subchannel !== this.currentPick) { - child.subchannel.removeConnectivityStateListener(this.subchannelStateListener); - } - child.subchannel.unref(); - this.channelControlHelper.removeChannelzChild(child.subchannel.getChannelzRef()); - } - this.currentSubchannelIndex = 0; - this.children = []; - this.triedAllSubchannels = false; - } - updateAddressList(addressList, lbConfig) { - if (!(lbConfig instanceof PickFirstLoadBalancingConfig)) { - return; - } - if (lbConfig.getShuffleAddressList()) { - addressList = shuffled(addressList); - } - const newChildrenList = addressList.map((address) => ({ - subchannel: this.channelControlHelper.createSubchannel(address, {}), - hasReportedTransientFailure: false - })); - for (const { subchannel } of newChildrenList) { - subchannel.ref(); - this.channelControlHelper.addChannelzChild(subchannel.getChannelzRef()); - } - this.resetSubchannelList(); - this.children = newChildrenList; - for (const { subchannel } of this.children) { - subchannel.addConnectivityStateListener(this.subchannelStateListener); - if (subchannel.getConnectivityState() === connectivity_state_1.ConnectivityState.READY) { - this.pickSubchannel(subchannel); - return; - } - } - for (const child of this.children) { - if (child.subchannel.getConnectivityState() === connectivity_state_1.ConnectivityState.TRANSIENT_FAILURE) { - child.hasReportedTransientFailure = true; - } - } - this.startNextSubchannelConnecting(0); - this.calculateAndReportNewState(); - } - exitIdle() { - } - resetBackoff() { - } - destroy() { - this.resetSubchannelList(); - this.removeCurrentPick(); - } - getTypeName() { - return TYPE_NAME; - } - }; - exports2.PickFirstLoadBalancer = PickFirstLoadBalancer; - function setup() { - (0, load_balancer_1.registerLoadBalancerType)(TYPE_NAME, PickFirstLoadBalancer, PickFirstLoadBalancingConfig); - (0, load_balancer_1.registerDefaultLoadBalancerType)(TYPE_NAME); - } - exports2.setup = setup; - } -}); - -// node_modules/@grpc/grpc-js/build/src/load-balancer-round-robin.js -var require_load_balancer_round_robin = __commonJS({ - "node_modules/@grpc/grpc-js/build/src/load-balancer-round-robin.js"(exports2) { - "use strict"; - Object.defineProperty(exports2, "__esModule", { value: true }); - exports2.setup = exports2.RoundRobinLoadBalancer = void 0; - var load_balancer_1 = require_load_balancer(); - var connectivity_state_1 = require_connectivity_state(); - var picker_1 = require_picker(); - var subchannel_address_1 = require_subchannel_address(); - var logging = require_logging(); - var constants_1 = require_constants(); - var TRACER_NAME = "round_robin"; - function trace(text) { - logging.trace(constants_1.LogVerbosity.DEBUG, TRACER_NAME, text); - } - var TYPE_NAME = "round_robin"; - var RoundRobinLoadBalancingConfig = class _RoundRobinLoadBalancingConfig { - getLoadBalancerName() { - return TYPE_NAME; - } - constructor() { - } - toJsonObject() { - return { - [TYPE_NAME]: {} - }; - } - // eslint-disable-next-line @typescript-eslint/no-explicit-any - static createFromJson(obj) { - return new _RoundRobinLoadBalancingConfig(); - } - }; - var RoundRobinPicker = class { - constructor(subchannelList, nextIndex = 0) { - this.subchannelList = subchannelList; - this.nextIndex = nextIndex; - } - pick(pickArgs) { - const pickedSubchannel = this.subchannelList[this.nextIndex]; - this.nextIndex = (this.nextIndex + 1) % this.subchannelList.length; - return { - pickResultType: picker_1.PickResultType.COMPLETE, - subchannel: pickedSubchannel, - status: null, - onCallStarted: null, - onCallEnded: null - }; - } - /** - * Check what the next subchannel returned would be. Used by the load - * balancer implementation to preserve this part of the picker state if - * possible when a subchannel connects or disconnects. - */ - peekNextSubchannel() { - return this.subchannelList[this.nextIndex]; - } - }; - var RoundRobinLoadBalancer = class { - constructor(channelControlHelper) { - this.channelControlHelper = channelControlHelper; - this.subchannels = []; - this.currentState = connectivity_state_1.ConnectivityState.IDLE; - this.currentReadyPicker = null; - this.subchannelStateListener = (subchannel, previousState, newState) => { - this.calculateAndUpdateState(); - if (newState === connectivity_state_1.ConnectivityState.TRANSIENT_FAILURE || newState === connectivity_state_1.ConnectivityState.IDLE) { - this.channelControlHelper.requestReresolution(); - subchannel.startConnecting(); - } - }; - } - countSubchannelsWithState(state) { - return this.subchannels.filter((subchannel) => subchannel.getConnectivityState() === state).length; - } - calculateAndUpdateState() { - if (this.countSubchannelsWithState(connectivity_state_1.ConnectivityState.READY) > 0) { - const readySubchannels = this.subchannels.filter((subchannel) => subchannel.getConnectivityState() === connectivity_state_1.ConnectivityState.READY); - let index = 0; - if (this.currentReadyPicker !== null) { - index = readySubchannels.indexOf(this.currentReadyPicker.peekNextSubchannel()); - if (index < 0) { - index = 0; - } - } - this.updateState(connectivity_state_1.ConnectivityState.READY, new RoundRobinPicker(readySubchannels, index)); - } else if (this.countSubchannelsWithState(connectivity_state_1.ConnectivityState.CONNECTING) > 0) { - this.updateState(connectivity_state_1.ConnectivityState.CONNECTING, new picker_1.QueuePicker(this)); - } else if (this.countSubchannelsWithState(connectivity_state_1.ConnectivityState.TRANSIENT_FAILURE) > 0) { - this.updateState(connectivity_state_1.ConnectivityState.TRANSIENT_FAILURE, new picker_1.UnavailablePicker()); - } else { - this.updateState(connectivity_state_1.ConnectivityState.IDLE, new picker_1.QueuePicker(this)); - } - } - updateState(newState, picker) { - trace(connectivity_state_1.ConnectivityState[this.currentState] + " -> " + connectivity_state_1.ConnectivityState[newState]); - if (newState === connectivity_state_1.ConnectivityState.READY) { - this.currentReadyPicker = picker; - } else { - this.currentReadyPicker = null; - } - this.currentState = newState; - this.channelControlHelper.updateState(newState, picker); - } - resetSubchannelList() { - for (const subchannel of this.subchannels) { - subchannel.removeConnectivityStateListener(this.subchannelStateListener); - subchannel.unref(); - this.channelControlHelper.removeChannelzChild(subchannel.getChannelzRef()); - } - this.subchannels = []; - } - updateAddressList(addressList, lbConfig) { - this.resetSubchannelList(); - trace("Connect to address list " + addressList.map((address) => (0, subchannel_address_1.subchannelAddressToString)(address))); - this.subchannels = addressList.map((address) => this.channelControlHelper.createSubchannel(address, {})); - for (const subchannel of this.subchannels) { - subchannel.ref(); - subchannel.addConnectivityStateListener(this.subchannelStateListener); - this.channelControlHelper.addChannelzChild(subchannel.getChannelzRef()); - const subchannelState = subchannel.getConnectivityState(); - if (subchannelState === connectivity_state_1.ConnectivityState.IDLE || subchannelState === connectivity_state_1.ConnectivityState.TRANSIENT_FAILURE) { - subchannel.startConnecting(); - } - } - this.calculateAndUpdateState(); - } - exitIdle() { - for (const subchannel of this.subchannels) { - subchannel.startConnecting(); - } - } - resetBackoff() { - } - destroy() { - this.resetSubchannelList(); - } - getTypeName() { - return TYPE_NAME; - } - }; - exports2.RoundRobinLoadBalancer = RoundRobinLoadBalancer; - function setup() { - (0, load_balancer_1.registerLoadBalancerType)(TYPE_NAME, RoundRobinLoadBalancer, RoundRobinLoadBalancingConfig); - } - exports2.setup = setup; - } -}); - -// node_modules/@grpc/grpc-js/build/src/index.js -var require_src3 = __commonJS({ - "node_modules/@grpc/grpc-js/build/src/index.js"(exports2) { - "use strict"; - Object.defineProperty(exports2, "__esModule", { value: true }); - exports2.experimental = exports2.addAdminServicesToServer = exports2.getChannelzHandlers = exports2.getChannelzServiceDefinition = exports2.InterceptorConfigurationError = exports2.InterceptingCall = exports2.RequesterBuilder = exports2.ListenerBuilder = exports2.StatusBuilder = exports2.getClientChannel = exports2.ServerCredentials = exports2.Server = exports2.setLogVerbosity = exports2.setLogger = exports2.load = exports2.loadObject = exports2.CallCredentials = exports2.ChannelCredentials = exports2.waitForClientReady = exports2.closeClient = exports2.Channel = exports2.makeGenericClientConstructor = exports2.makeClientConstructor = exports2.loadPackageDefinition = exports2.Client = exports2.compressionAlgorithms = exports2.propagate = exports2.connectivityState = exports2.status = exports2.logVerbosity = exports2.Metadata = exports2.credentials = void 0; - var call_credentials_1 = require_call_credentials(); - Object.defineProperty(exports2, "CallCredentials", { enumerable: true, get: function() { - return call_credentials_1.CallCredentials; - } }); - var channel_1 = require_channel(); - Object.defineProperty(exports2, "Channel", { enumerable: true, get: function() { - return channel_1.ChannelImplementation; - } }); - var compression_algorithms_1 = require_compression_algorithms(); - Object.defineProperty(exports2, "compressionAlgorithms", { enumerable: true, get: function() { - return compression_algorithms_1.CompressionAlgorithms; - } }); - var connectivity_state_1 = require_connectivity_state(); - Object.defineProperty(exports2, "connectivityState", { enumerable: true, get: function() { - return connectivity_state_1.ConnectivityState; - } }); - var channel_credentials_1 = require_channel_credentials(); - Object.defineProperty(exports2, "ChannelCredentials", { enumerable: true, get: function() { - return channel_credentials_1.ChannelCredentials; - } }); - var client_1 = require_client(); - Object.defineProperty(exports2, "Client", { enumerable: true, get: function() { - return client_1.Client; - } }); - var constants_1 = require_constants(); - Object.defineProperty(exports2, "logVerbosity", { enumerable: true, get: function() { - return constants_1.LogVerbosity; - } }); - Object.defineProperty(exports2, "status", { enumerable: true, get: function() { - return constants_1.Status; - } }); - Object.defineProperty(exports2, "propagate", { enumerable: true, get: function() { - return constants_1.Propagate; - } }); - var logging = require_logging(); - var make_client_1 = require_make_client(); - Object.defineProperty(exports2, "loadPackageDefinition", { enumerable: true, get: function() { - return make_client_1.loadPackageDefinition; - } }); - Object.defineProperty(exports2, "makeClientConstructor", { enumerable: true, get: function() { - return make_client_1.makeClientConstructor; - } }); - Object.defineProperty(exports2, "makeGenericClientConstructor", { enumerable: true, get: function() { - return make_client_1.makeClientConstructor; - } }); - var metadata_1 = require_metadata(); - Object.defineProperty(exports2, "Metadata", { enumerable: true, get: function() { - return metadata_1.Metadata; - } }); - var server_1 = require_server(); - Object.defineProperty(exports2, "Server", { enumerable: true, get: function() { - return server_1.Server; - } }); - var server_credentials_1 = require_server_credentials(); - Object.defineProperty(exports2, "ServerCredentials", { enumerable: true, get: function() { - return server_credentials_1.ServerCredentials; - } }); - var status_builder_1 = require_status_builder(); - Object.defineProperty(exports2, "StatusBuilder", { enumerable: true, get: function() { - return status_builder_1.StatusBuilder; - } }); - exports2.credentials = { - /** - * Combine a ChannelCredentials with any number of CallCredentials into a - * single ChannelCredentials object. - * @param channelCredentials The ChannelCredentials object. - * @param callCredentials Any number of CallCredentials objects. - * @return The resulting ChannelCredentials object. - */ - combineChannelCredentials: (channelCredentials, ...callCredentials) => { - return callCredentials.reduce((acc, other) => acc.compose(other), channelCredentials); - }, - /** - * Combine any number of CallCredentials into a single CallCredentials - * object. - * @param first The first CallCredentials object. - * @param additional Any number of additional CallCredentials objects. - * @return The resulting CallCredentials object. - */ - combineCallCredentials: (first, ...additional) => { - return additional.reduce((acc, other) => acc.compose(other), first); - }, - // from channel-credentials.ts - createInsecure: channel_credentials_1.ChannelCredentials.createInsecure, - createSsl: channel_credentials_1.ChannelCredentials.createSsl, - createFromSecureContext: channel_credentials_1.ChannelCredentials.createFromSecureContext, - // from call-credentials.ts - createFromMetadataGenerator: call_credentials_1.CallCredentials.createFromMetadataGenerator, - createFromGoogleCredential: call_credentials_1.CallCredentials.createFromGoogleCredential, - createEmpty: call_credentials_1.CallCredentials.createEmpty - }; - var closeClient = (client) => client.close(); - exports2.closeClient = closeClient; - var waitForClientReady = (client, deadline, callback) => client.waitForReady(deadline, callback); - exports2.waitForClientReady = waitForClientReady; - var loadObject = (value, options2) => { - throw new Error("Not available in this library. Use @grpc/proto-loader and loadPackageDefinition instead"); - }; - exports2.loadObject = loadObject; - var load = (filename, format, options2) => { - throw new Error("Not available in this library. Use @grpc/proto-loader and loadPackageDefinition instead"); - }; - exports2.load = load; - var setLogger = (logger) => { - logging.setLogger(logger); - }; - exports2.setLogger = setLogger; - var setLogVerbosity = (verbosity) => { - logging.setLoggerVerbosity(verbosity); - }; - exports2.setLogVerbosity = setLogVerbosity; - var getClientChannel = (client) => { - return client_1.Client.prototype.getChannel.call(client); - }; - exports2.getClientChannel = getClientChannel; - var client_interceptors_1 = require_client_interceptors(); - Object.defineProperty(exports2, "ListenerBuilder", { enumerable: true, get: function() { - return client_interceptors_1.ListenerBuilder; - } }); - Object.defineProperty(exports2, "RequesterBuilder", { enumerable: true, get: function() { - return client_interceptors_1.RequesterBuilder; - } }); - Object.defineProperty(exports2, "InterceptingCall", { enumerable: true, get: function() { - return client_interceptors_1.InterceptingCall; - } }); - Object.defineProperty(exports2, "InterceptorConfigurationError", { enumerable: true, get: function() { - return client_interceptors_1.InterceptorConfigurationError; - } }); - var channelz_1 = require_channelz(); - Object.defineProperty(exports2, "getChannelzServiceDefinition", { enumerable: true, get: function() { - return channelz_1.getChannelzServiceDefinition; - } }); - Object.defineProperty(exports2, "getChannelzHandlers", { enumerable: true, get: function() { - return channelz_1.getChannelzHandlers; - } }); - var admin_1 = require_admin(); - Object.defineProperty(exports2, "addAdminServicesToServer", { enumerable: true, get: function() { - return admin_1.addAdminServicesToServer; - } }); - var experimental = require_experimental(); - exports2.experimental = experimental; - var resolver_dns = require_resolver_dns(); - var resolver_uds = require_resolver_uds(); - var resolver_ip = require_resolver_ip(); - var load_balancer_pick_first = require_load_balancer_pick_first(); - var load_balancer_round_robin = require_load_balancer_round_robin(); - var load_balancer_outlier_detection = require_load_balancer_outlier_detection(); - var channelz = require_channelz(); - var clientVersion = require_package2().version; - (() => { - logging.trace(constants_1.LogVerbosity.DEBUG, "index", "Loading @grpc/grpc-js version " + clientVersion); - resolver_dns.setup(); - resolver_uds.setup(); - resolver_ip.setup(); - load_balancer_pick_first.setup(); - load_balancer_round_robin.setup(); - load_balancer_outlier_detection.setup(); - channelz.setup(); - })(); - } -}); - -// node_modules/@prisma/client/runtime/library.js -var require_library = __commonJS({ - "node_modules/@prisma/client/runtime/library.js"(exports, module) { - "use strict"; - var Qa = Object.create; - var Gt = Object.defineProperty; - var Ja = Object.getOwnPropertyDescriptor; - var Ga = Object.getOwnPropertyNames; - var Wa = Object.getPrototypeOf; - var Ha = Object.prototype.hasOwnProperty; - var L = (e, t) => () => (t || e((t = { exports: {} }).exports, t), t.exports); - var xt = (e, t) => { - for (var r in t) - Gt(e, r, { get: t[r], enumerable: true }); - }; - var pi = (e, t, r, n) => { - if (t && typeof t == "object" || typeof t == "function") - for (let i of Ga(t)) - !Ha.call(e, i) && i !== r && Gt(e, i, { get: () => t[i], enumerable: !(n = Ja(t, i)) || n.enumerable }); - return e; - }; - var A = (e, t, r) => (r = e != null ? Qa(Wa(e)) : {}, pi(t || !e || !e.__esModule ? Gt(r, "default", { value: e, enumerable: true }) : r, e)); - var za = (e) => pi(Gt({}, "__esModule", { value: true }), e); - var Ei = L((pd, Pi) => { - var ze = 1e3, Ye = ze * 60, Ze = Ye * 60, Ve = Ze * 24, Ya = Ve * 7, Za = Ve * 365.25; - Pi.exports = function(e, t) { - t = t || {}; - var r = typeof e; - if (r === "string" && e.length > 0) - return Xa(e); - if (r === "number" && isFinite(e)) - return t.long ? tl(e) : el(e); - throw new Error("val is not a non-empty string or a valid number. val=" + JSON.stringify(e)); - }; - function Xa(e) { - if (e = String(e), !(e.length > 100)) { - var t = /^(-?(?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec(e); - if (!!t) { - var r = parseFloat(t[1]), n = (t[2] || "ms").toLowerCase(); - switch (n) { - case "years": - case "year": - case "yrs": - case "yr": - case "y": - return r * Za; - case "weeks": - case "week": - case "w": - return r * Ya; - case "days": - case "day": - case "d": - return r * Ve; - case "hours": - case "hour": - case "hrs": - case "hr": - case "h": - return r * Ze; - case "minutes": - case "minute": - case "mins": - case "min": - case "m": - return r * Ye; - case "seconds": - case "second": - case "secs": - case "sec": - case "s": - return r * ze; - case "milliseconds": - case "millisecond": - case "msecs": - case "msec": - case "ms": - return r; - default: - return; - } - } - } - } - function el(e) { - var t = Math.abs(e); - return t >= Ve ? Math.round(e / Ve) + "d" : t >= Ze ? Math.round(e / Ze) + "h" : t >= Ye ? Math.round(e / Ye) + "m" : t >= ze ? Math.round(e / ze) + "s" : e + "ms"; - } - function tl(e) { - var t = Math.abs(e); - return t >= Ve ? Yt(e, t, Ve, "day") : t >= Ze ? Yt(e, t, Ze, "hour") : t >= Ye ? Yt(e, t, Ye, "minute") : t >= ze ? Yt(e, t, ze, "second") : e + " ms"; - } - function Yt(e, t, r, n) { - var i = t >= r * 1.5; - return Math.round(e / r) + " " + n + (i ? "s" : ""); - } - }); - var en = L((dd, Ti) => { - function rl(e) { - r.debug = r, r.default = r, r.coerce = l, r.disable = o, r.enable = i, r.enabled = s, r.humanize = Ei(), r.destroy = u, Object.keys(e).forEach((c) => { - r[c] = e[c]; - }), r.names = [], r.skips = [], r.formatters = {}; - function t(c) { - let p = 0; - for (let d = 0; d < c.length; d++) - p = (p << 5) - p + c.charCodeAt(d), p |= 0; - return r.colors[Math.abs(p) % r.colors.length]; - } - r.selectColor = t; - function r(c) { - let p, d = null, g, y; - function f(...b) { - if (!f.enabled) - return; - let E = f, v = Number(/* @__PURE__ */ new Date()), x = v - (p || v); - E.diff = x, E.prev = p, E.curr = v, p = v, b[0] = r.coerce(b[0]), typeof b[0] != "string" && b.unshift("%O"); - let M = 0; - b[0] = b[0].replace(/%([a-zA-Z%])/g, (K, Ke) => { - if (K === "%%") - return "%"; - M++; - let I = r.formatters[Ke]; - if (typeof I == "function") { - let J = b[M]; - K = I.call(E, J), b.splice(M, 1), M--; - } - return K; - }), r.formatArgs.call(E, b), (E.log || r.log).apply(E, b); - } - return f.namespace = c, f.useColors = r.useColors(), f.color = r.selectColor(c), f.extend = n, f.destroy = r.destroy, Object.defineProperty(f, "enabled", { enumerable: true, configurable: false, get: () => d !== null ? d : (g !== r.namespaces && (g = r.namespaces, y = r.enabled(c)), y), set: (b) => { - d = b; - } }), typeof r.init == "function" && r.init(f), f; - } - function n(c, p) { - let d = r(this.namespace + (typeof p > "u" ? ":" : p) + c); - return d.log = this.log, d; - } - function i(c) { - r.save(c), r.namespaces = c, r.names = [], r.skips = []; - let p, d = (typeof c == "string" ? c : "").split(/[\s,]+/), g = d.length; - for (p = 0; p < g; p++) - !d[p] || (c = d[p].replace(/\*/g, ".*?"), c[0] === "-" ? r.skips.push(new RegExp("^" + c.slice(1) + "$")) : r.names.push(new RegExp("^" + c + "$"))); - } - function o() { - let c = [...r.names.map(a), ...r.skips.map(a).map((p) => "-" + p)].join(","); - return r.enable(""), c; - } - function s(c) { - if (c[c.length - 1] === "*") - return true; - let p, d; - for (p = 0, d = r.skips.length; p < d; p++) - if (r.skips[p].test(c)) - return false; - for (p = 0, d = r.names.length; p < d; p++) - if (r.names[p].test(c)) - return true; - return false; - } - function a(c) { - return c.toString().substring(2, c.toString().length - 2).replace(/\.\*\?$/, "*"); - } - function l(c) { - return c instanceof Error ? c.stack || c.message : c; - } - function u() { - console.warn("Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`."); - } - return r.enable(r.load()), r; - } - Ti.exports = rl; - }); - var vi = L((se, Zt) => { - se.formatArgs = il; - se.save = ol; - se.load = sl; - se.useColors = nl; - se.storage = al(); - se.destroy = (() => { - let e = false; - return () => { - e || (e = true, console.warn("Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.")); - }; - })(); - se.colors = ["#0000CC", "#0000FF", "#0033CC", "#0033FF", "#0066CC", "#0066FF", "#0099CC", "#0099FF", "#00CC00", "#00CC33", "#00CC66", "#00CC99", "#00CCCC", "#00CCFF", "#3300CC", "#3300FF", "#3333CC", "#3333FF", "#3366CC", "#3366FF", "#3399CC", "#3399FF", "#33CC00", "#33CC33", "#33CC66", "#33CC99", "#33CCCC", "#33CCFF", "#6600CC", "#6600FF", "#6633CC", "#6633FF", "#66CC00", "#66CC33", "#9900CC", "#9900FF", "#9933CC", "#9933FF", "#99CC00", "#99CC33", "#CC0000", "#CC0033", "#CC0066", "#CC0099", "#CC00CC", "#CC00FF", "#CC3300", "#CC3333", "#CC3366", "#CC3399", "#CC33CC", "#CC33FF", "#CC6600", "#CC6633", "#CC9900", "#CC9933", "#CCCC00", "#CCCC33", "#FF0000", "#FF0033", "#FF0066", "#FF0099", "#FF00CC", "#FF00FF", "#FF3300", "#FF3333", "#FF3366", "#FF3399", "#FF33CC", "#FF33FF", "#FF6600", "#FF6633", "#FF9900", "#FF9933", "#FFCC00", "#FFCC33"]; - function nl() { - return typeof window < "u" && window.process && (window.process.type === "renderer" || window.process.__nwjs) ? true : typeof navigator < "u" && navigator.userAgent && navigator.userAgent.toLowerCase().match(/(edge|trident)\/(\d+)/) ? false : typeof document < "u" && document.documentElement && document.documentElement.style && document.documentElement.style.WebkitAppearance || typeof window < "u" && window.console && (window.console.firebug || window.console.exception && window.console.table) || typeof navigator < "u" && navigator.userAgent && navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/) && parseInt(RegExp.$1, 10) >= 31 || typeof navigator < "u" && navigator.userAgent && navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/); - } - function il(e) { - if (e[0] = (this.useColors ? "%c" : "") + this.namespace + (this.useColors ? " %c" : " ") + e[0] + (this.useColors ? "%c " : " ") + "+" + Zt.exports.humanize(this.diff), !this.useColors) - return; - let t = "color: " + this.color; - e.splice(1, 0, t, "color: inherit"); - let r = 0, n = 0; - e[0].replace(/%[a-zA-Z%]/g, (i) => { - i !== "%%" && (r++, i === "%c" && (n = r)); - }), e.splice(n, 0, t); - } - se.log = console.debug || console.log || (() => { - }); - function ol(e) { - try { - e ? se.storage.setItem("debug", e) : se.storage.removeItem("debug"); - } catch { - } - } - function sl() { - let e; - try { - e = se.storage.getItem("debug"); - } catch { - } - return !e && typeof process < "u" && "env" in process && (e = process.env.DEBUG), e; - } - function al() { - try { - return localStorage; - } catch { - } - } - Zt.exports = en()(se); - var { formatters: ll } = Zt.exports; - ll.j = function(e) { - try { - return JSON.stringify(e); - } catch (t) { - return "[UnexpectedJSONParseError]: " + t.message; - } - }; - }); - var tn = L((md, Ci) => { - "use strict"; - Ci.exports = (e, t = process.argv) => { - let r = e.startsWith("-") ? "" : e.length === 1 ? "-" : "--", n = t.indexOf(r + e), i = t.indexOf("--"); - return n !== -1 && (i === -1 || n < i); - }; - }); - var on = L((fd, Ai) => { - "use strict"; - var ul = require("os"), Mi = require("tty"), ce = tn(), { env: q } = process, Fe; - ce("no-color") || ce("no-colors") || ce("color=false") || ce("color=never") ? Fe = 0 : (ce("color") || ce("colors") || ce("color=true") || ce("color=always")) && (Fe = 1); - "FORCE_COLOR" in q && (q.FORCE_COLOR === "true" ? Fe = 1 : q.FORCE_COLOR === "false" ? Fe = 0 : Fe = q.FORCE_COLOR.length === 0 ? 1 : Math.min(parseInt(q.FORCE_COLOR, 10), 3)); - function rn(e) { - return e === 0 ? false : { level: e, hasBasic: true, has256: e >= 2, has16m: e >= 3 }; - } - function nn(e, t) { - if (Fe === 0) - return 0; - if (ce("color=16m") || ce("color=full") || ce("color=truecolor")) - return 3; - if (ce("color=256")) - return 2; - if (e && !t && Fe === void 0) - return 0; - let r = Fe || 0; - if (q.TERM === "dumb") - return r; - if (process.platform === "win32") { - let n = ul.release().split("."); - return Number(n[0]) >= 10 && Number(n[2]) >= 10586 ? Number(n[2]) >= 14931 ? 3 : 2 : 1; - } - if ("CI" in q) - return ["TRAVIS", "CIRCLECI", "APPVEYOR", "GITLAB_CI", "GITHUB_ACTIONS", "BUILDKITE"].some((n) => n in q) || q.CI_NAME === "codeship" ? 1 : r; - if ("TEAMCITY_VERSION" in q) - return /^(9\.(0*[1-9]\d*)\.|\d{2,}\.)/.test(q.TEAMCITY_VERSION) ? 1 : 0; - if (q.COLORTERM === "truecolor") - return 3; - if ("TERM_PROGRAM" in q) { - let n = parseInt((q.TERM_PROGRAM_VERSION || "").split(".")[0], 10); - switch (q.TERM_PROGRAM) { - case "iTerm.app": - return n >= 3 ? 3 : 2; - case "Apple_Terminal": - return 2; - } - } - return /-256(color)?$/i.test(q.TERM) ? 2 : /^screen|^xterm|^vt100|^vt220|^rxvt|color|ansi|cygwin|linux/i.test(q.TERM) || "COLORTERM" in q ? 1 : r; - } - function cl(e) { - let t = nn(e, e && e.isTTY); - return rn(t); - } - Ai.exports = { supportsColor: cl, stdout: rn(nn(true, Mi.isatty(1))), stderr: rn(nn(true, Mi.isatty(2))) }; - }); - var Ri = L((V, er) => { - var pl = require("tty"), Xt = require("util"); - V.init = xl; - V.log = gl; - V.formatArgs = ml; - V.save = yl; - V.load = hl; - V.useColors = dl; - V.destroy = Xt.deprecate(() => { - }, "Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`."); - V.colors = [6, 2, 3, 4, 5, 1]; - try { - let e = on(); - e && (e.stderr || e).level >= 2 && (V.colors = [20, 21, 26, 27, 32, 33, 38, 39, 40, 41, 42, 43, 44, 45, 56, 57, 62, 63, 68, 69, 74, 75, 76, 77, 78, 79, 80, 81, 92, 93, 98, 99, 112, 113, 128, 129, 134, 135, 148, 149, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 178, 179, 184, 185, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 214, 215, 220, 221]); - } catch { - } - V.inspectOpts = Object.keys(process.env).filter((e) => /^debug_/i.test(e)).reduce((e, t) => { - let r = t.substring(6).toLowerCase().replace(/_([a-z])/g, (i, o) => o.toUpperCase()), n = process.env[t]; - return /^(yes|on|true|enabled)$/i.test(n) ? n = true : /^(no|off|false|disabled)$/i.test(n) ? n = false : n === "null" ? n = null : n = Number(n), e[r] = n, e; - }, {}); - function dl() { - return "colors" in V.inspectOpts ? Boolean(V.inspectOpts.colors) : pl.isatty(process.stderr.fd); - } - function ml(e) { - let { namespace: t, useColors: r } = this; - if (r) { - let n = this.color, i = "\x1B[3" + (n < 8 ? n : "8;5;" + n), o = ` ${i};1m${t} \x1B[0m`; - e[0] = o + e[0].split(` -`).join(` -` + o), e.push(i + "m+" + er.exports.humanize(this.diff) + "\x1B[0m"); - } else - e[0] = fl() + t + " " + e[0]; - } - function fl() { - return V.inspectOpts.hideDate ? "" : (/* @__PURE__ */ new Date()).toISOString() + " "; - } - function gl(...e) { - return process.stderr.write(Xt.format(...e) + ` -`); - } - function yl(e) { - e ? process.env.DEBUG = e : delete process.env.DEBUG; - } - function hl() { - return process.env.DEBUG; - } - function xl(e) { - e.inspectOpts = {}; - let t = Object.keys(V.inspectOpts); - for (let r = 0; r < t.length; r++) - e.inspectOpts[t[r]] = V.inspectOpts[t[r]]; - } - er.exports = en()(V); - var { formatters: Si } = er.exports; - Si.o = function(e) { - return this.inspectOpts.colors = this.useColors, Xt.inspect(e, this.inspectOpts).split(` -`).map((t) => t.trim()).join(" "); - }; - Si.O = function(e) { - return this.inspectOpts.colors = this.useColors, Xt.inspect(e, this.inspectOpts); - }; - }); - var Fi = L((gd, sn) => { - typeof process > "u" || process.type === "renderer" || process.browser === true || process.__nwjs ? sn.exports = vi() : sn.exports = Ri(); - }); - var Bi = L((Gd, dn) => { - "use strict"; - var C = dn.exports; - dn.exports.default = C; - var S = "\x1B[", Pt = "\x1B]", tt = "\x07", or = ";", ji = process.env.TERM_PROGRAM === "Apple_Terminal"; - C.cursorTo = (e, t) => { - if (typeof e != "number") - throw new TypeError("The `x` argument is required"); - return typeof t != "number" ? S + (e + 1) + "G" : S + (t + 1) + ";" + (e + 1) + "H"; - }; - C.cursorMove = (e, t) => { - if (typeof e != "number") - throw new TypeError("The `x` argument is required"); - let r = ""; - return e < 0 ? r += S + -e + "D" : e > 0 && (r += S + e + "C"), t < 0 ? r += S + -t + "A" : t > 0 && (r += S + t + "B"), r; - }; - C.cursorUp = (e = 1) => S + e + "A"; - C.cursorDown = (e = 1) => S + e + "B"; - C.cursorForward = (e = 1) => S + e + "C"; - C.cursorBackward = (e = 1) => S + e + "D"; - C.cursorLeft = S + "G"; - C.cursorSavePosition = ji ? "\x1B7" : S + "s"; - C.cursorRestorePosition = ji ? "\x1B8" : S + "u"; - C.cursorGetPosition = S + "6n"; - C.cursorNextLine = S + "E"; - C.cursorPrevLine = S + "F"; - C.cursorHide = S + "?25l"; - C.cursorShow = S + "?25h"; - C.eraseLines = (e) => { - let t = ""; - for (let r = 0; r < e; r++) - t += C.eraseLine + (r < e - 1 ? C.cursorUp() : ""); - return e && (t += C.cursorLeft), t; - }; - C.eraseEndLine = S + "K"; - C.eraseStartLine = S + "1K"; - C.eraseLine = S + "2K"; - C.eraseDown = S + "J"; - C.eraseUp = S + "1J"; - C.eraseScreen = S + "2J"; - C.scrollUp = S + "S"; - C.scrollDown = S + "T"; - C.clearScreen = "\x1Bc"; - C.clearTerminal = process.platform === "win32" ? `${C.eraseScreen}${S}0f` : `${C.eraseScreen}${S}3J${S}H`; - C.beep = tt; - C.link = (e, t) => [Pt, "8", or, or, t, tt, e, Pt, "8", or, or, tt].join(""); - C.image = (e, t = {}) => { - let r = `${Pt}1337;File=inline=1`; - return t.width && (r += `;width=${t.width}`), t.height && (r += `;height=${t.height}`), t.preserveAspectRatio === false && (r += ";preserveAspectRatio=0"), r + ":" + e.toString("base64") + tt; - }; - C.iTerm = { setCwd: (e = process.cwd()) => `${Pt}50;CurrentDir=${e}${tt}`, annotation: (e, t = {}) => { - let r = `${Pt}1337;`, n = typeof t.x < "u", i = typeof t.y < "u"; - if ((n || i) && !(n && i && typeof t.length < "u")) - throw new Error("`x`, `y` and `length` must be defined when `x` or `y` is defined"); - return e = e.replace(/\|/g, ""), r += t.isHidden ? "AddHiddenAnnotation=" : "AddAnnotation=", t.length > 0 ? r += (n ? [e, t.length, t.x, t.y] : [t.length, e]).join("|") : r += e, r + tt; - } }; - }); - var Ui = L((Wd, Vi) => { - "use strict"; - var vl = on(), rt = tn(); - function Ki(e) { - if (/^\d{3,4}$/.test(e)) { - let r = /(\d{1,2})(\d{2})/.exec(e); - return { major: 0, minor: parseInt(r[1], 10), patch: parseInt(r[2], 10) }; - } - let t = (e || "").split(".").map((r) => parseInt(r, 10)); - return { major: t[0], minor: t[1], patch: t[2] }; - } - function mn(e) { - let { env: t } = process; - if ("FORCE_HYPERLINK" in t) - return !(t.FORCE_HYPERLINK.length > 0 && parseInt(t.FORCE_HYPERLINK, 10) === 0); - if (rt("no-hyperlink") || rt("no-hyperlinks") || rt("hyperlink=false") || rt("hyperlink=never")) - return false; - if (rt("hyperlink=true") || rt("hyperlink=always") || "NETLIFY" in t) - return true; - if (!vl.supportsColor(e) || e && !e.isTTY || process.platform === "win32" || "CI" in t || "TEAMCITY_VERSION" in t) - return false; - if ("TERM_PROGRAM" in t) { - let r = Ki(t.TERM_PROGRAM_VERSION); - switch (t.TERM_PROGRAM) { - case "iTerm.app": - return r.major === 3 ? r.minor >= 1 : r.major > 3; - case "WezTerm": - return r.major >= 20200620; - case "vscode": - return r.major > 1 || r.major === 1 && r.minor >= 72; - } - } - if ("VTE_VERSION" in t) { - if (t.VTE_VERSION === "0.50.0") - return false; - let r = Ki(t.VTE_VERSION); - return r.major > 0 || r.minor >= 50; - } - return false; - } - Vi.exports = { supportsHyperlink: mn, stdout: mn(process.stdout), stderr: mn(process.stderr) }; - }); - var Ji = L((Hd, Et) => { - "use strict"; - var Cl = Bi(), fn = Ui(), Qi = (e, t, { target: r = "stdout", ...n } = {}) => fn[r] ? Cl.link(e, t) : n.fallback === false ? e : typeof n.fallback == "function" ? n.fallback(e, t) : `${e} (\u200B${t}\u200B)`; - Et.exports = (e, t, r = {}) => Qi(e, t, r); - Et.exports.stderr = (e, t, r = {}) => Qi(e, t, { target: "stderr", ...r }); - Et.exports.isSupported = fn.stdout; - Et.exports.stderr.isSupported = fn.stderr; - }); - var ro = L((mm, jl) => { - jl.exports = { name: "dotenv", version: "16.0.3", description: "Loads environment variables from .env file", main: "lib/main.js", types: "lib/main.d.ts", exports: { ".": { require: "./lib/main.js", types: "./lib/main.d.ts", default: "./lib/main.js" }, "./config": "./config.js", "./config.js": "./config.js", "./lib/env-options": "./lib/env-options.js", "./lib/env-options.js": "./lib/env-options.js", "./lib/cli-options": "./lib/cli-options.js", "./lib/cli-options.js": "./lib/cli-options.js", "./package.json": "./package.json" }, scripts: { "dts-check": "tsc --project tests/types/tsconfig.json", lint: "standard", "lint-readme": "standard-markdown", pretest: "npm run lint && npm run dts-check", test: "tap tests/*.js --100 -Rspec", prerelease: "npm test", release: "standard-version" }, repository: { type: "git", url: "git://github.com/motdotla/dotenv.git" }, keywords: ["dotenv", "env", ".env", "environment", "variables", "config", "settings"], readmeFilename: "README.md", license: "BSD-2-Clause", devDependencies: { "@types/node": "^17.0.9", decache: "^4.6.1", dtslint: "^3.7.0", sinon: "^12.0.1", standard: "^16.0.4", "standard-markdown": "^7.1.0", "standard-version": "^9.3.2", tap: "^15.1.6", tar: "^6.1.11", typescript: "^4.5.4" }, engines: { node: ">=12" } }; - }); - var io = L((fm, cr) => { - var Bl = require("fs"), no = require("path"), Kl = require("os"), Vl = ro(), Ul = Vl.version, Ql = /(?:^|^)\s*(?:export\s+)?([\w.-]+)(?:\s*=\s*?|:\s+?)(\s*'(?:\\'|[^'])*'|\s*"(?:\\"|[^"])*"|\s*`(?:\\`|[^`])*`|[^#\r\n]+)?\s*(?:#.*)?(?:$|$)/mg; - function Jl(e) { - let t = {}, r = e.toString(); - r = r.replace(/\r\n?/mg, ` -`); - let n; - for (; (n = Ql.exec(r)) != null; ) { - let i = n[1], o = n[2] || ""; - o = o.trim(); - let s = o[0]; - o = o.replace(/^(['"`])([\s\S]*)\1$/mg, "$2"), s === '"' && (o = o.replace(/\\n/g, ` -`), o = o.replace(/\\r/g, "\r")), t[i] = o; - } - return t; - } - function xn(e) { - console.log(`[dotenv@${Ul}][DEBUG] ${e}`); - } - function Gl(e) { - return e[0] === "~" ? no.join(Kl.homedir(), e.slice(1)) : e; - } - function Wl(e) { - let t = no.resolve(process.cwd(), ".env"), r = "utf8", n = Boolean(e && e.debug), i = Boolean(e && e.override); - e && (e.path != null && (t = Gl(e.path)), e.encoding != null && (r = e.encoding)); - try { - let o = ur.parse(Bl.readFileSync(t, { encoding: r })); - return Object.keys(o).forEach(function(s) { - Object.prototype.hasOwnProperty.call(process.env, s) ? (i === true && (process.env[s] = o[s]), n && xn(i === true ? `"${s}" is already defined in \`process.env\` and WAS overwritten` : `"${s}" is already defined in \`process.env\` and was NOT overwritten`)) : process.env[s] = o[s]; - }), { parsed: o }; - } catch (o) { - return n && xn(`Failed to load ${t} ${o.message}`), { error: o }; - } - } - var ur = { config: Wl, parse: Jl }; - cr.exports.config = ur.config; - cr.exports.parse = ur.parse; - cr.exports = ur; - }); - var co = L((Pm, uo) => { - "use strict"; - uo.exports = (e) => { - let t = e.match(/^[ \t]*(?=\S)/gm); - return t ? t.reduce((r, n) => Math.min(r, n.length), 1 / 0) : 0; - }; - }); - var mo = L((Em, po) => { - "use strict"; - var Zl = co(); - po.exports = (e) => { - let t = Zl(e); - if (t === 0) - return e; - let r = new RegExp(`^[ \\t]{${t}}`, "gm"); - return e.replace(r, ""); - }; - }); - var fo = L((Tm, Xl) => { - Xl.exports = { name: "@prisma/engines-version", version: "5.1.0-28.a9b7003df90aa623086e4d6f4e43c72468e6339b", main: "index.js", types: "index.d.ts", license: "Apache-2.0", author: "Tim Suchanek ", prisma: { enginesVersion: "a9b7003df90aa623086e4d6f4e43c72468e6339b" }, repository: { type: "git", url: "https://github.com/prisma/engines-wrapper.git", directory: "packages/engines-version" }, devDependencies: { "@types/node": "18.17.1", typescript: "4.9.5" }, files: ["index.js", "index.d.ts"], scripts: { build: "tsc -d" } }; - }); - var En = L((dr) => { - "use strict"; - Object.defineProperty(dr, "__esModule", { value: true }); - dr.enginesVersion = void 0; - dr.enginesVersion = fo().prisma.enginesVersion; - }); - var An = L((Nm, ho) => { - "use strict"; - ho.exports = (e, t = 1, r) => { - if (r = { indent: " ", includeEmptyLines: false, ...r }, typeof e != "string") - throw new TypeError(`Expected \`input\` to be a \`string\`, got \`${typeof e}\``); - if (typeof t != "number") - throw new TypeError(`Expected \`count\` to be a \`number\`, got \`${typeof t}\``); - if (typeof r.indent != "string") - throw new TypeError(`Expected \`options.indent\` to be a \`string\`, got \`${typeof r.indent}\``); - if (t === 0) - return e; - let n = r.includeEmptyLines ? /^/gm : /^(?!\s*$)/gm; - return e.replace(n, r.indent.repeat(t)); - }; - }); - var Po = L((qm, wo) => { - "use strict"; - wo.exports = ({ onlyFirst: e = false } = {}) => { - let t = ["[\\u001B\\u009B][[\\]()#;?]*(?:(?:(?:(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]+)*|[a-zA-Z\\d]+(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]*)*)?\\u0007)", "(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PR-TZcf-ntqry=><~]))"].join("|"); - return new RegExp(t, e ? void 0 : "g"); - }; - }); - var On = L((jm, Eo) => { - "use strict"; - var uu = Po(); - Eo.exports = (e) => typeof e == "string" ? e.replace(uu(), "") : e; - }); - var To = L((Km, mr) => { - "use strict"; - mr.exports = (e = {}) => { - let t; - if (e.repoUrl) - t = e.repoUrl; - else if (e.user && e.repo) - t = `https://github.com/${e.user}/${e.repo}`; - else - throw new Error("You need to specify either the `repoUrl` option or both the `user` and `repo` options"); - let r = new URL(`${t}/issues/new`), n = ["body", "title", "labels", "template", "milestone", "assignee", "projects"]; - for (let i of n) { - let o = e[i]; - if (o !== void 0) { - if (i === "labels" || i === "projects") { - if (!Array.isArray(o)) - throw new TypeError(`The \`${i}\` option should be an array`); - o = o.join(","); - } - r.searchParams.set(i, o); - } - } - return r.toString(); - }; - mr.exports.default = mr.exports; - }); - var ni = L((jx, Hs) => { - "use strict"; - Hs.exports = function() { - function e(t, r, n, i, o) { - return t < r || n < r ? t > n ? n + 1 : t + 1 : i === o ? r : r + 1; - } - return function(t, r) { - if (t === r) - return 0; - if (t.length > r.length) { - var n = t; - t = r, r = n; - } - for (var i = t.length, o = r.length; i > 0 && t.charCodeAt(i - 1) === r.charCodeAt(o - 1); ) - i--, o--; - for (var s = 0; s < i && t.charCodeAt(s) === r.charCodeAt(s); ) - s++; - if (i -= s, o -= s, i === 0 || o < 3) - return o; - var a = 0, l, u, c, p, d, g, y, f, b, E, v, x, M = []; - for (l = 0; l < i; l++) - M.push(l + 1), M.push(t.charCodeAt(s + l)); - for (var le = M.length - 1; a < o - 3; ) - for (b = r.charCodeAt(s + (u = a)), E = r.charCodeAt(s + (c = a + 1)), v = r.charCodeAt(s + (p = a + 2)), x = r.charCodeAt(s + (d = a + 3)), g = a += 4, l = 0; l < le; l += 2) - y = M[l], f = M[l + 1], u = e(y, u, c, b, f), c = e(u, c, p, E, f), p = e(c, p, d, v, f), g = e(p, d, g, x, f), M[l] = g, d = p, p = c, c = u, u = y; - for (; a < o; ) - for (b = r.charCodeAt(s + (u = a)), g = ++a, l = 0; l < le; l += 2) - y = M[l], M[l] = g = e(y, u, g, b, M[l + 1]), u = y; - return g; - }; - }(); - }); - var Yp = {}; - xt(Yp, { DMMF: () => ue, DMMFClass: () => bt, Debug: () => an, Decimal: () => we, Extensions: () => Yr, MetricsClient: () => st, NotFoundError: () => Ce, PrismaClientInitializationError: () => _, PrismaClientKnownRequestError: () => H, PrismaClientRustPanicError: () => ae, PrismaClientUnknownRequestError: () => z, PrismaClientValidationError: () => te, Public: () => Zr, Sql: () => U, Types: () => Xr, defineDmmfProperty: () => Co, empty: () => Ao, getPrismaClient: () => Ka, join: () => Mo, makeStrictEnum: () => Va, objectEnumValues: () => Pr, raw: () => Ln, sqltag: () => $n, warnEnvConflicts: () => Ua, warnOnce: () => In }); - module.exports = za(Yp); - var Yr = {}; - xt(Yr, { defineExtension: () => di, getExtensionContext: () => mi }); - function di(e) { - return typeof e == "function" ? e : (t) => t.$extends(e); - } - function mi(e) { - return e; - } - var Zr = {}; - xt(Zr, { validator: () => fi }); - function fi(...e) { - return (t) => t; - } - var Xr = {}; - xt(Xr, { Extensions: () => gi, Public: () => yi, Result: () => hi, Utils: () => xi }); - var gi = {}; - var yi = {}; - var hi = {}; - var xi = {}; - function bi(e, t) { - for (let r of t) - for (let n of Object.getOwnPropertyNames(r.prototype)) - Object.defineProperty(e.prototype, n, Object.getOwnPropertyDescriptor(r.prototype, n) ?? /* @__PURE__ */ Object.create(null)); - } - var Z = (e, t) => { - let r = {}; - for (let n of e) { - let i = n[t]; - r[i] = n; - } - return r; - }; - function wi(e) { - return e.substring(0, 1).toLowerCase() + e.substring(1); - } - var Wt = class { - constructor({ datamodel: t }) { - this.datamodel = t, this.datamodelEnumMap = this.getDatamodelEnumMap(), this.modelMap = this.getModelMap(), this.typeMap = this.getTypeMap(), this.typeAndModelMap = this.getTypeModelMap(); - } - getDatamodelEnumMap() { - return Z(this.datamodel.enums, "name"); - } - getModelMap() { - return { ...Z(this.datamodel.models, "name") }; - } - getTypeMap() { - return { ...Z(this.datamodel.types, "name") }; - } - getTypeModelMap() { - return { ...this.getTypeMap(), ...this.getModelMap() }; - } - }; - var Ht = class { - constructor({ mappings: t }) { - this.mappings = t, this.mappingsMap = this.getMappingsMap(); - } - getMappingsMap() { - return Z(this.mappings.modelOperations, "model"); - } - getOtherOperationNames() { - return [Object.values(this.mappings.otherOperations.write), Object.values(this.mappings.otherOperations.read)].flat(); - } - }; - var zt = class { - constructor({ schema: t }) { - this.outputTypeToMergedOutputType = (t2) => ({ ...t2, fields: t2.fields }); - this.schema = t, this.enumMap = this.getEnumMap(), this.outputTypes = this.getOutputTypes(), this.outputTypeMap = this.getMergedOutputTypeMap(), this.resolveOutputTypes(), this.inputObjectTypes = this.schema.inputObjectTypes, this.inputTypeMap = this.getInputTypeMap(), this.resolveInputTypes(), this.resolveFieldArgumentTypes(), this.queryType = this.outputTypeMap.prisma.Query, this.mutationType = this.outputTypeMap.prisma.Mutation, this.rootFieldMap = this.getRootFieldMap(); - } - get [Symbol.toStringTag]() { - return "DMMFClass"; - } - resolveOutputTypes() { - this.resolveOutputTypesInNamespace("prisma"), this.resolveOutputTypesInNamespace("model"); - } - resolveOutputTypesInNamespace(t) { - for (let r of this.outputTypes[t]) { - for (let n of r.fields) { - if (typeof n.outputType.type != "string" || n.outputType.location === "scalar") - continue; - let i = n.outputType.namespace ?? "model"; - n.outputType.location === "outputObjectTypes" ? n.outputType.type = this.outputTypeMap[i][n.outputType.type] : n.outputType.location === "enumTypes" && (n.outputType.type = this.enumMap[i][n.outputType.type]); - } - r.fieldMap = Z(r.fields, "name"); - } - } - resolveInputTypes() { - this.resolveNamespaceInputTypes("model"), this.resolveNamespaceInputTypes("prisma"); - } - resolveNamespaceInputTypes(t) { - let r = this.inputObjectTypes[t] ?? []; - for (let n of r) { - for (let i of n.fields) - for (let o of i.inputTypes) { - if (typeof o.type != "string") - continue; - let s = o.type; - if (o.location === "scalar") - continue; - let a = o.namespace ?? "model"; - o.location === "inputObjectTypes" && (o.type = this.inputTypeMap[a][s]), o.location === "enumTypes" && (o.type = this.enumMap[a][s]); - } - n.fieldMap = Z(n.fields, "name"); - } - } - resolveFieldArgumentTypes() { - this.resolveFieldArgumentTypesInNamespace("model"), this.resolveFieldArgumentTypesInNamespace("prisma"); - } - resolveFieldArgumentTypesInNamespace(t) { - let r = this.outputTypes[t] ?? []; - for (let n of r) - for (let i of n.fields) - for (let o of i.args) - for (let s of o.inputTypes) { - let a = s.type; - if (typeof a != "string" || s.location === "scalar") - continue; - let l = s.namespace ?? "model"; - s.location === "inputObjectTypes" && (s.type = this.inputTypeMap[l][a]), s.location === "enumTypes" && (s.type = this.enumMap[l][a]); - } - } - getOutputTypes() { - return { model: this.schema.outputObjectTypes.model.map(this.outputTypeToMergedOutputType), prisma: this.schema.outputObjectTypes.prisma.map(this.outputTypeToMergedOutputType) }; - } - getEnumMap() { - return { prisma: Z(this.schema.enumTypes.prisma, "name"), model: this.schema.enumTypes.model ? Z(this.schema.enumTypes.model, "name") : {} }; - } - hasEnumInNamespace(t, r) { - return this.schema.enumTypes[r]?.find((n) => n.name === t) !== void 0; - } - getMergedOutputTypeMap() { - return { model: Z(this.outputTypes.model, "name"), prisma: Z(this.outputTypes.prisma, "name") }; - } - getInputTypeMap() { - return { prisma: Z(this.schema.inputObjectTypes.prisma, "name"), model: this.schema.inputObjectTypes.model ? Z(this.schema.inputObjectTypes.model, "name") : {} }; - } - getRootFieldMap() { - return { ...Z(this.queryType.fields, "name"), ...Z(this.mutationType.fields, "name") }; - } - }; - var bt = class { - constructor(t) { - return Object.assign(this, new Wt(t), new Ht(t), new zt(t)); - } - }; - bi(bt, [Wt, Ht, zt]); - var ue; - ((t) => { - let e; - ((x) => (x.findUnique = "findUnique", x.findUniqueOrThrow = "findUniqueOrThrow", x.findFirst = "findFirst", x.findFirstOrThrow = "findFirstOrThrow", x.findMany = "findMany", x.create = "create", x.createMany = "createMany", x.update = "update", x.updateMany = "updateMany", x.upsert = "upsert", x.delete = "delete", x.deleteMany = "deleteMany", x.groupBy = "groupBy", x.count = "count", x.aggregate = "aggregate", x.findRaw = "findRaw", x.aggregateRaw = "aggregateRaw"))(e = t.ModelAction || (t.ModelAction = {})); - })(ue || (ue = {})); - var tr = A(Fi()); - var bl = 100; - var wt = []; - typeof process < "u" && typeof process.stderr?.write != "function" && (tr.default.log = console.debug ?? console.log); - function wl(e) { - let t = (0, tr.default)(e), r = Object.assign((...n) => (t.log = r.log, n.length !== 0 && wt.push([e, ...n]), wt.length > bl && wt.shift(), t("", ...n)), t); - return r; - } - var an = Object.assign(wl, tr.default); - function Oi(e = 7500) { - let t = wt.map((r) => r.map((n) => typeof n == "string" ? n : JSON.stringify(n)).join(" ")).join(` -`); - return t.length < e ? t : t.slice(-e); - } - function ki() { - wt.length = 0; - } - var N = an; - var ln; - var Di; - var _i; - var Ii; - var Ni = true; - typeof process < "u" && ({ FORCE_COLOR: ln, NODE_DISABLE_COLORS: Di, NO_COLOR: _i, TERM: Ii } = process.env || {}, Ni = process.stdout && process.stdout.isTTY); - var Pl = { enabled: !Di && _i == null && Ii !== "dumb" && (ln != null && ln !== "0" || Ni) }; - function O(e, t) { - let r = new RegExp(`\\x1b\\[${t}m`, "g"), n = `\x1B[${e}m`, i = `\x1B[${t}m`; - return function(o) { - return !Pl.enabled || o == null ? o : n + (~("" + o).indexOf(i) ? o.replace(r, i + n) : o) + i; - }; - } - var hd = O(0, 0); - var ne = O(1, 22); - var Oe = O(2, 22); - var xd = O(3, 23); - var X = O(4, 24); - var bd = O(7, 27); - var wd = O(8, 28); - var Pd = O(9, 29); - var Ed = O(30, 39); - var pe = O(31, 39); - var Ue = O(32, 39); - var ye = O(33, 39); - var Xe = O(34, 39); - var Td = O(35, 39); - var ke = O(36, 39); - var vd = O(37, 39); - var rr = O(90, 39); - var Cd = O(90, 39); - var Md = O(40, 49); - var Ad = O(41, 49); - var Sd = O(42, 49); - var Rd = O(43, 49); - var Fd = O(44, 49); - var Od = O(45, 49); - var kd = O(46, 49); - var Dd = O(47, 49); - var Li = A(require("fs")); - function un() { - let e = process.env.PRISMA_QUERY_ENGINE_LIBRARY; - if (!(e && Li.default.existsSync(e)) && process.arch === "ia32") - throw new Error('The default query engine type (Node-API, "library") is currently not supported for 32bit Node. Please set `engineType = "binary"` in the "generator" block of your "schema.prisma" file (or use the environment variables "PRISMA_CLIENT_ENGINE_TYPE=binary" and/or "PRISMA_CLI_QUERY_ENGINE_TYPE=binary".)'); - } - var nr = "libquery_engine"; - function cn(e, t) { - let r = t === "url"; - return e.includes("windows") ? r ? "query_engine.dll.node" : `query_engine-${e}.dll.node` : e.includes("darwin") ? r ? `${nr}.dylib.node` : `${nr}-${e}.dylib.node` : r ? `${nr}.so.node` : `${nr}-${e}.so.node`; - } - var zi = A(require("child_process")); - var gn = A(require("fs/promises")); - var ar = A(require("os")); - var ir = Symbol("@ts-pattern/matcher"); - var $i = "@ts-pattern/anonymous-select-key"; - var qi = function(e) { - return Boolean(e && typeof e == "object"); - }; - var pn = function(e) { - return e && !!e[ir]; - }; - var El = function e(t, r, n) { - if (qi(t)) { - if (pn(t)) { - var i = t[ir]().match(r), o = i.matched, s = i.selections; - return o && s && Object.keys(s).forEach(function(l) { - return n(l, s[l]); - }), o; - } - if (!qi(r)) - return false; - if (Array.isArray(t)) - return !!Array.isArray(r) && t.length === r.length && t.every(function(l, u) { - return e(l, r[u], n); - }); - if (t instanceof Map) - return r instanceof Map && Array.from(t.keys()).every(function(l) { - return e(t.get(l), r.get(l), n); - }); - if (t instanceof Set) { - if (!(r instanceof Set)) - return false; - if (t.size === 0) - return r.size === 0; - if (t.size === 1) { - var a = Array.from(t.values())[0]; - return pn(a) ? Array.from(r.values()).every(function(l) { - return e(a, l, n); - }) : r.has(a); - } - return Array.from(t.values()).every(function(l) { - return r.has(l); - }); - } - return Object.keys(t).every(function(l) { - var u, c = t[l]; - return (l in r || pn(u = c) && u[ir]().matcherType === "optional") && e(c, r[l], n); - }); - } - return Object.is(r, t); - }; - function Qe(e) { - var t; - return (t = {})[ir] = function() { - return { match: function(r) { - return { matched: Boolean(e(r)) }; - } }; - }, t; - } - var qd = Qe(function(e) { - return true; - }); - var jd = Qe(function(e) { - return typeof e == "string"; - }); - var Bd = Qe(function(e) { - return typeof e == "number"; - }); - var Kd = Qe(function(e) { - return typeof e == "boolean"; - }); - var Vd = Qe(function(e) { - return typeof e == "bigint"; - }); - var Ud = Qe(function(e) { - return typeof e == "symbol"; - }); - var Qd = Qe(function(e) { - return e == null; - }); - function et(e) { - return new Tl(e, []); - } - var Tl = function() { - function e(r, n) { - this.value = void 0, this.cases = void 0, this.value = r, this.cases = n; - } - var t = e.prototype; - return t.with = function() { - var r = [].slice.call(arguments), n = r[r.length - 1], i = [r[0]], o = []; - return r.length === 3 && typeof r[1] == "function" ? (i.push(r[0]), o.push(r[1])) : r.length > 2 && i.push.apply(i, r.slice(1, r.length - 1)), new e(this.value, this.cases.concat([{ match: function(s) { - var a = {}, l = Boolean(i.some(function(u) { - return El(u, s, function(c, p) { - a[c] = p; - }); - }) && o.every(function(u) { - return u(s); - })); - return { matched: l, value: l && Object.keys(a).length ? $i in a ? a[$i] : a : s }; - }, handler: n }])); - }, t.when = function(r, n) { - return new e(this.value, this.cases.concat([{ match: function(i) { - return { matched: Boolean(r(i)), value: i }; - }, handler: n }])); - }, t.otherwise = function(r) { - return new e(this.value, this.cases.concat([{ match: function(n) { - return { matched: true, value: n }; - }, handler: r }])).run(); - }, t.exhaustive = function() { - return this.run(); - }, t.run = function() { - for (var r = this.value, n = void 0, i = 0; i < this.cases.length; i++) { - var o = this.cases[i], s = o.match(this.value); - if (s.matched) { - r = s.value, n = o.handler; - break; - } - } - if (!n) { - var a; - try { - a = JSON.stringify(this.value); - } catch { - a = this.value; - } - throw new Error("Pattern matching error: no pattern matches value " + a); - } - return n(r, this.value); - }, e; - }(); - var Yi = require("util"); - var Gi = A(Ji()); - function Tt(e) { - return (0, Gi.default)(e, e, { fallback: X }); - } - var Ml = { warn: ye("prisma:warn") }; - var Al = { warn: () => !process.env.PRISMA_DISABLE_WARNINGS }; - function vt(e, ...t) { - Al.warn() && console.warn(`${Ml.warn} ${e}`, ...t); - } - var Sl = (0, Yi.promisify)(zi.default.exec); - var ie = N("prisma:get-platform"); - var Rl = ["1.0.x", "1.1.x", "3.0.x"]; - async function Zi() { - let e = ar.default.platform(), t = process.arch; - if (e === "freebsd") { - let s = await lr("freebsd-version"); - if (s && s.trim().length > 0) { - let l = /^(\d+)\.?/.exec(s); - if (l) - return { platform: "freebsd", targetDistro: `freebsd${l[1]}`, arch: t }; - } - } - if (e !== "linux") - return { platform: e, arch: t }; - let r = await Ol(), n = await ql(), i = Dl({ arch: t, archFromUname: n, familyDistro: r.familyDistro }), { libssl: o } = await _l(i); - return { platform: "linux", libssl: o, arch: t, archFromUname: n, ...r }; - } - function Fl(e) { - let t = /^ID="?([^"\n]*)"?$/im, r = /^ID_LIKE="?([^"\n]*)"?$/im, n = t.exec(e), i = n && n[1] && n[1].toLowerCase() || "", o = r.exec(e), s = o && o[1] && o[1].toLowerCase() || "", a = et({ id: i, idLike: s }).with({ id: "alpine" }, ({ id: l }) => ({ targetDistro: "musl", familyDistro: l, originalDistro: l })).with({ id: "raspbian" }, ({ id: l }) => ({ targetDistro: "arm", familyDistro: "debian", originalDistro: l })).with({ id: "nixos" }, ({ id: l }) => ({ targetDistro: "nixos", originalDistro: l, familyDistro: "nixos" })).with({ id: "debian" }, { id: "ubuntu" }, ({ id: l }) => ({ targetDistro: "debian", familyDistro: "debian", originalDistro: l })).with({ id: "rhel" }, { id: "centos" }, { id: "fedora" }, ({ id: l }) => ({ targetDistro: "rhel", familyDistro: "rhel", originalDistro: l })).when(({ idLike: l }) => l.includes("debian") || l.includes("ubuntu"), ({ id: l }) => ({ targetDistro: "debian", familyDistro: "debian", originalDistro: l })).when(({ idLike: l }) => i === "arch" || l.includes("arch"), ({ id: l }) => ({ targetDistro: "debian", familyDistro: "arch", originalDistro: l })).when(({ idLike: l }) => l.includes("centos") || l.includes("fedora") || l.includes("rhel") || l.includes("suse"), ({ id: l }) => ({ targetDistro: "rhel", familyDistro: "rhel", originalDistro: l })).otherwise(({ id: l }) => ({ targetDistro: void 0, familyDistro: void 0, originalDistro: l })); - return ie(`Found distro info: -${JSON.stringify(a, null, 2)}`), a; - } - async function Ol() { - let e = "/etc/os-release"; - try { - let t = await gn.default.readFile(e, { encoding: "utf-8" }); - return Fl(t); - } catch { - return { targetDistro: void 0, familyDistro: void 0, originalDistro: void 0 }; - } - } - function kl(e) { - let t = /^OpenSSL\s(\d+\.\d+)\.\d+/.exec(e); - if (t) { - let r = `${t[1]}.x`; - return Xi(r); - } - } - function Wi(e) { - let t = /libssl\.so\.(\d)(\.\d)?/.exec(e); - if (t) { - let r = `${t[1]}${t[2] ?? ".0"}.x`; - return Xi(r); - } - } - function Xi(e) { - let t = (() => { - if (to(e)) - return e; - let r = e.split("."); - return r[1] = "0", r.join("."); - })(); - if (Rl.includes(t)) - return t; - } - function Dl(e) { - return et(e).with({ familyDistro: "musl" }, () => (ie('Trying platform-specific paths for "alpine"'), ["/lib"])).with({ familyDistro: "debian" }, ({ archFromUname: t }) => (ie('Trying platform-specific paths for "debian" (and "ubuntu")'), [`/usr/lib/${t}-linux-gnu`, `/lib/${t}-linux-gnu`])).with({ familyDistro: "rhel" }, () => (ie('Trying platform-specific paths for "rhel"'), ["/lib64", "/usr/lib64"])).otherwise(({ familyDistro: t, arch: r, archFromUname: n }) => (ie(`Don't know any platform-specific paths for "${t}" on ${r} (${n})`), [])); - } - async function _l(e) { - let t = 'grep -v "libssl.so.0"', r = await Hi(e); - if (r) { - ie(`Found libssl.so file using platform-specific paths: ${r}`); - let o = Wi(r); - if (ie(`The parsed libssl version is: ${o}`), o) - return { libssl: o, strategy: "libssl-specific-path" }; - } - ie('Falling back to "ldconfig" and other generic paths'); - let n = await lr(`ldconfig -p | sed "s/.*=>s*//" | sed "s|.*/||" | grep libssl | sort | ${t}`); - if (n || (n = await Hi(["/lib64", "/usr/lib64", "/lib"])), n) { - ie(`Found libssl.so file using "ldconfig" or other generic paths: ${n}`); - let o = Wi(n); - if (ie(`The parsed libssl version is: ${o}`), o) - return { libssl: o, strategy: "ldconfig" }; - } - let i = await lr("openssl version -v"); - if (i) { - ie(`Found openssl binary with version: ${i}`); - let o = kl(i); - if (ie(`The parsed openssl version is: ${o}`), o) - return { libssl: o, strategy: "openssl-binary" }; - } - return ie("Couldn't find any version of libssl or OpenSSL in the system"), {}; - } - async function Hi(e) { - for (let t of e) { - let r = await Il(t); - if (r) - return r; - } - } - async function Il(e) { - try { - return (await gn.default.readdir(e)).find((r) => r.startsWith("libssl.so.") && !r.startsWith("libssl.so.0")); - } catch (t) { - if (t.code === "ENOENT") - return; - throw t; - } - } - async function nt() { - let { binaryTarget: e } = await eo(); - return e; - } - function Nl(e) { - return e.binaryTarget !== void 0; - } - async function yn() { - let { memoized: e, ...t } = await eo(); - return t; - } - var sr = {}; - async function eo() { - if (Nl(sr)) - return Promise.resolve({ ...sr, memoized: true }); - let e = await Zi(), t = Ll(e); - return sr = { ...e, binaryTarget: t }, { ...sr, memoized: false }; - } - function Ll(e) { - let { platform: t, arch: r, archFromUname: n, libssl: i, targetDistro: o, familyDistro: s, originalDistro: a } = e; - t === "linux" && !["x64", "arm64"].includes(r) && vt(`Prisma only officially supports Linux on amd64 (x86_64) and arm64 (aarch64) system architectures. If you are using your own custom Prisma engines, you can ignore this warning, as long as you've compiled the engines for your system architecture "${n}".`); - let l = "1.1.x"; - if (t === "linux" && i === void 0) { - let c = et({ familyDistro: s }).with({ familyDistro: "debian" }, () => "Please manually install OpenSSL via `apt-get update -y && apt-get install -y openssl` and try installing Prisma again. If you're running Prisma on Docker, add this command to your Dockerfile, or switch to an image that already has OpenSSL installed.").otherwise(() => "Please manually install OpenSSL and try installing Prisma again."); - vt(`Prisma failed to detect the libssl/openssl version to use, and may not work as expected. Defaulting to "openssl-${l}". -${c}`); - } - let u = "debian"; - if (t === "linux" && o === void 0 && vt(`Prisma doesn't know which engines to download for the Linux distro "${a}". Falling back to Prisma engines built "${u}". -Please report your experience by creating an issue at ${Tt("https://github.com/prisma/prisma/issues")} so we can add your distro to the list of known supported distros.`), t === "darwin" && r === "arm64") - return "darwin-arm64"; - if (t === "darwin") - return "darwin"; - if (t === "win32") - return "windows"; - if (t === "freebsd") - return o; - if (t === "openbsd") - return "openbsd"; - if (t === "netbsd") - return "netbsd"; - if (t === "linux" && o === "nixos") - return "linux-nixos"; - if (t === "linux" && r === "arm64") - return `${o === "musl" ? "linux-musl-arm64" : "linux-arm64"}-openssl-${i || l}`; - if (t === "linux" && r === "arm") - return `linux-arm-openssl-${i || l}`; - if (t === "linux" && o === "musl") { - let c = "linux-musl"; - return !i || to(i) ? c : `${c}-openssl-${i}`; - } - return t === "linux" && o && i ? `${o}-openssl-${i}` : (t !== "linux" && vt(`Prisma detected unknown OS "${t}" and may not work as expected. Defaulting to "linux".`), i ? `${u}-openssl-${i}` : o ? `${o}-openssl-${l}` : `${u}-openssl-${l}`); - } - async function $l(e) { - try { - return await e(); - } catch { - return; - } - } - function lr(e) { - return $l(async () => { - let t = await Sl(e); - return ie(`Command "${e}" successfully returned "${t.stdout}"`), t.stdout; - }); - } - async function ql() { - return typeof ar.default.machine == "function" ? ar.default.machine() : (await lr("uname -m"))?.trim(); - } - function to(e) { - return e.startsWith("1."); - } - var hn = ["darwin", "darwin-arm64", "debian-openssl-1.0.x", "debian-openssl-1.1.x", "debian-openssl-3.0.x", "rhel-openssl-1.0.x", "rhel-openssl-1.1.x", "rhel-openssl-3.0.x", "linux-arm64-openssl-1.1.x", "linux-arm64-openssl-1.0.x", "linux-arm64-openssl-3.0.x", "linux-arm-openssl-1.1.x", "linux-arm-openssl-1.0.x", "linux-arm-openssl-3.0.x", "linux-musl", "linux-musl-openssl-3.0.x", "linux-musl-arm64-openssl-1.1.x", "linux-musl-arm64-openssl-3.0.x", "linux-nixos", "linux-static-x64", "linux-static-arm64", "windows", "freebsd11", "freebsd12", "freebsd13", "openbsd", "netbsd", "arm"]; - var wn = A(io()); - var pr = A(require("fs")); - var it = A(require("path")); - function oo(e) { - let t = e.ignoreProcessEnv ? {} : process.env, r = (n) => n.match(/(.?\${(?:[a-zA-Z0-9_]+)?})/g)?.reduce(function(o, s) { - let a = /(.?)\${([a-zA-Z0-9_]+)?}/g.exec(s); - if (!a) - return o; - let l = a[1], u, c; - if (l === "\\") - c = a[0], u = c.replace("\\$", "$"); - else { - let p = a[2]; - c = a[0].substring(l.length), u = Object.hasOwnProperty.call(t, p) ? t[p] : e.parsed[p] || "", u = r(u); - } - return o.replace(c, u); - }, n) ?? n; - for (let n in e.parsed) { - let i = Object.hasOwnProperty.call(t, n) ? t[n] : e.parsed[n]; - e.parsed[n] = r(i); - } - for (let n in e.parsed) - t[n] = e.parsed[n]; - return e; - } - var bn = N("prisma:tryLoadEnv"); - function Ct({ rootEnvPath: e, schemaEnvPath: t }, r = { conflictCheck: "none" }) { - let n = so(e); - r.conflictCheck !== "none" && Hl(n, t, r.conflictCheck); - let i = null; - return ao(n?.path, t) || (i = so(t)), !n && !i && bn("No Environment variables loaded"), i?.dotenvResult.error ? console.error(pe(ne("Schema Env Error: ")) + i.dotenvResult.error) : { message: [n?.message, i?.message].filter(Boolean).join(` -`), parsed: { ...n?.dotenvResult?.parsed, ...i?.dotenvResult?.parsed } }; - } - function Hl(e, t, r) { - let n = e?.dotenvResult.parsed, i = !ao(e?.path, t); - if (n && t && i && pr.default.existsSync(t)) { - let o = wn.default.parse(pr.default.readFileSync(t)), s = []; - for (let a in o) - n[a] === o[a] && s.push(a); - if (s.length > 0) { - let a = it.default.relative(process.cwd(), e.path), l = it.default.relative(process.cwd(), t); - if (r === "error") { - let u = `There is a conflict between env var${s.length > 1 ? "s" : ""} in ${X(a)} and ${X(l)} -Conflicting env vars: -${s.map((c) => ` ${ne(c)}`).join(` -`)} - -We suggest to move the contents of ${X(l)} to ${X(a)} to consolidate your env vars. -`; - throw new Error(u); - } else if (r === "warn") { - let u = `Conflict for env var${s.length > 1 ? "s" : ""} ${s.map((c) => ne(c)).join(", ")} in ${X(a)} and ${X(l)} -Env vars from ${X(l)} overwrite the ones from ${X(a)} - `; - console.warn(`${ye("warn(prisma)")} ${u}`); - } - } - } - } - function so(e) { - return zl(e) ? (bn(`Environment variables loaded from ${e}`), { dotenvResult: oo(wn.default.config({ path: e, debug: process.env.DOTENV_CONFIG_DEBUG ? true : void 0 })), message: Oe(`Environment variables loaded from ${it.default.relative(process.cwd(), e)}`), path: e }) : (bn(`Environment variables not found at ${e}`), null); - } - function ao(e, t) { - return e && t && it.default.resolve(e) === it.default.resolve(t); - } - function zl(e) { - return Boolean(e && pr.default.existsSync(e)); - } - var lo = "library"; - function Pn(e) { - let t = Yl(); - return t || (e?.config.engineType === "library" ? "library" : e?.config.engineType === "binary" ? "binary" : lo); - } - function Yl() { - let e = process.env.PRISMA_CLIENT_ENGINE_TYPE; - return e === "library" ? "library" : e === "binary" ? "binary" : void 0; - } - var eu = A(En()); - var k = A(require("path")); - var tu = A(En()); - var Mm = N("prisma:engines"); - function go() { - return k.default.join(__dirname, "../"); - } - var Am = "libquery-engine"; - k.default.join(__dirname, "../query-engine-darwin"); - k.default.join(__dirname, "../query-engine-darwin-arm64"); - k.default.join(__dirname, "../query-engine-debian-openssl-1.0.x"); - k.default.join(__dirname, "../query-engine-debian-openssl-1.1.x"); - k.default.join(__dirname, "../query-engine-debian-openssl-3.0.x"); - k.default.join(__dirname, "../query-engine-linux-static-x64"); - k.default.join(__dirname, "../query-engine-linux-static-arm64"); - k.default.join(__dirname, "../query-engine-rhel-openssl-1.0.x"); - k.default.join(__dirname, "../query-engine-rhel-openssl-1.1.x"); - k.default.join(__dirname, "../query-engine-rhel-openssl-3.0.x"); - k.default.join(__dirname, "../libquery_engine-darwin.dylib.node"); - k.default.join(__dirname, "../libquery_engine-darwin-arm64.dylib.node"); - k.default.join(__dirname, "../libquery_engine-debian-openssl-1.0.x.so.node"); - k.default.join(__dirname, "../libquery_engine-debian-openssl-1.1.x.so.node"); - k.default.join(__dirname, "../libquery_engine-debian-openssl-3.0.x.so.node"); - k.default.join(__dirname, "../libquery_engine-linux-arm64-openssl-1.0.x.so.node"); - k.default.join(__dirname, "../libquery_engine-linux-arm64-openssl-1.1.x.so.node"); - k.default.join(__dirname, "../libquery_engine-linux-arm64-openssl-3.0.x.so.node"); - k.default.join(__dirname, "../libquery_engine-linux-musl.so.node"); - k.default.join(__dirname, "../libquery_engine-linux-musl-openssl-3.0.x.so.node"); - k.default.join(__dirname, "../libquery_engine-rhel-openssl-1.0.x.so.node"); - k.default.join(__dirname, "../libquery_engine-rhel-openssl-1.1.x.so.node"); - k.default.join(__dirname, "../libquery_engine-rhel-openssl-3.0.x.so.node"); - k.default.join(__dirname, "../query_engine-windows.dll.node"); - var Tn = A(require("fs")); - var yo = N("chmodPlusX"); - function vn(e) { - if (process.platform === "win32") - return; - let t = Tn.default.statSync(e), r = t.mode | 64 | 8 | 1; - if (t.mode === r) { - yo(`Execution permissions of ${e} are fine`); - return; - } - let n = r.toString(8).slice(-3); - yo(`Have to call chmodPlusX on ${e}`), Tn.default.chmodSync(e, n); - } - function Cn(e) { - let t = e.e, r = (a) => `Prisma cannot find the required \`${a}\` system library in your system`, n = t.message.includes("cannot open shared object file"), i = `Please refer to the documentation about Prisma's system requirements: ${Tt("https://pris.ly/d/system-requirements")}`, o = `Unable to require(\`${Oe(e.id)}\`).`, s = et({ message: t.message, code: t.code }).with({ code: "ENOENT" }, () => "File does not exist.").when(({ message: a }) => n && a.includes("libz"), () => `${r("libz")}. Please install it and try again.`).when(({ message: a }) => n && a.includes("libgcc_s"), () => `${r("libgcc_s")}. Please install it and try again.`).when(({ message: a }) => n && a.includes("libssl"), () => { - let a = e.platformInfo.libssl ? `openssl-${e.platformInfo.libssl}` : "openssl"; - return `${r("libssl")}. Please install ${a} and try again.`; - }).when(({ message: a }) => a.includes("GLIBC"), () => `Prisma has detected an incompatible version of the \`glibc\` C standard library installed in your system. This probably means your system may be too old to run Prisma. ${i}`).when(({ message: a }) => e.platformInfo.platform === "linux" && a.includes("symbol not found"), () => `The Prisma engines are not compatible with your system ${e.platformInfo.originalDistro} on (${e.platformInfo.archFromUname}) which uses the \`${e.platformInfo.binaryTarget}\` binaryTarget by default. ${i}`).otherwise(() => `The Prisma engines do not seem to be compatible with your system. ${i}`); - return `${o} -${s} - -Details: ${t.message}`; - } - var Mt = A(require("path")); - function Mn(e) { - return Mt.default.sep === Mt.default.posix.sep ? e : e.split(Mt.default.sep).join(Mt.default.posix.sep); - } - var xo = A(An()); - function Rn(e) { - return String(new Sn(e)); - } - var Sn = class { - constructor(t) { - this.config = t; - } - toString() { - let { config: t } = this, r = t.provider.fromEnvVar ? `env("${t.provider.fromEnvVar}")` : t.provider.value, n = JSON.parse(JSON.stringify({ provider: r, binaryTargets: ru(t.binaryTargets) })); - return `generator ${t.name} { -${(0, xo.default)(nu(n), 2)} -}`; - } - }; - function ru(e) { - let t; - if (e.length > 0) { - let r = e.find((n) => n.fromEnvVar !== null); - r ? t = `env("${r.fromEnvVar}")` : t = e.map((n) => n.native ? "native" : n.value); - } else - t = void 0; - return t; - } - function nu(e) { - let t = Object.keys(e).reduce((r, n) => Math.max(r, n.length), 0); - return Object.entries(e).map(([r, n]) => `${r.padEnd(t)} = ${iu(n)}`).join(` -`); - } - function iu(e) { - return JSON.parse(JSON.stringify(e, (t, r) => Array.isArray(r) ? `[${r.map((n) => JSON.stringify(n)).join(", ")}]` : JSON.stringify(r))); - } - var St = {}; - xt(St, { error: () => au, info: () => su, log: () => ou, query: () => lu, should: () => bo, tags: () => At, warn: () => Fn }); - var At = { error: pe("prisma:error"), warn: ye("prisma:warn"), info: ke("prisma:info"), query: Xe("prisma:query") }; - var bo = { warn: () => !process.env.PRISMA_DISABLE_WARNINGS }; - function ou(...e) { - console.log(...e); - } - function Fn(e, ...t) { - bo.warn() && console.warn(`${At.warn} ${e}`, ...t); - } - function su(e, ...t) { - console.info(`${At.info} ${e}`, ...t); - } - function au(e, ...t) { - console.error(`${At.error} ${e}`, ...t); - } - function lu(e, ...t) { - console.log(`${At.query} ${e}`, ...t); - } - function Je(e, t) { - throw new Error(t); - } - function kn(e, t) { - return Object.prototype.hasOwnProperty.call(e, t); - } - var Dn = (e, t) => e.reduce((r, n) => (r[t(n)] = n, r), {}); - function ot(e, t) { - let r = {}; - for (let n of Object.keys(e)) - r[n] = t(e[n], n); - return r; - } - function _n(e, t) { - if (e.length === 0) - return; - let r = e[0]; - for (let n = 1; n < e.length; n++) - t(r, e[n]) < 0 && (r = e[n]); - return r; - } - function ee(e, t) { - Object.defineProperty(e, "name", { value: t, configurable: true }); - } - var vo = /* @__PURE__ */ new Set(); - var In = (e, t, ...r) => { - vo.has(e) || (vo.add(e), Fn(t, ...r)); - }; - var H = class extends Error { - constructor(r, { code: n, clientVersion: i, meta: o, batchRequestIdx: s }) { - super(r); - this.name = "PrismaClientKnownRequestError", this.code = n, this.clientVersion = i, this.meta = o, Object.defineProperty(this, "batchRequestIdx", { value: s, enumerable: false, writable: true }); - } - get [Symbol.toStringTag]() { - return "PrismaClientKnownRequestError"; - } - }; - ee(H, "PrismaClientKnownRequestError"); - var Ce = class extends H { - constructor(t, r) { - super(t, { code: "P2025", clientVersion: r }), this.name = "NotFoundError"; - } - }; - ee(Ce, "NotFoundError"); - var _ = class extends Error { - constructor(r, n, i) { - super(r); - this.name = "PrismaClientInitializationError", this.clientVersion = n, this.errorCode = i, Error.captureStackTrace(_); - } - get [Symbol.toStringTag]() { - return "PrismaClientInitializationError"; - } - }; - ee(_, "PrismaClientInitializationError"); - var ae = class extends Error { - constructor(r, n) { - super(r); - this.name = "PrismaClientRustPanicError", this.clientVersion = n; - } - get [Symbol.toStringTag]() { - return "PrismaClientRustPanicError"; - } - }; - ee(ae, "PrismaClientRustPanicError"); - var z = class extends Error { - constructor(r, { clientVersion: n, batchRequestIdx: i }) { - super(r); - this.name = "PrismaClientUnknownRequestError", this.clientVersion = n, Object.defineProperty(this, "batchRequestIdx", { value: i, writable: true, enumerable: false }); - } - get [Symbol.toStringTag]() { - return "PrismaClientUnknownRequestError"; - } - }; - ee(z, "PrismaClientUnknownRequestError"); - var te = class extends Error { - constructor(r, { clientVersion: n }) { - super(r); - this.name = "PrismaClientValidationError"; - this.clientVersion = n; - } - get [Symbol.toStringTag]() { - return "PrismaClientValidationError"; - } - }; - ee(te, "PrismaClientValidationError"); - var st = class { - constructor(t) { - this._engine = t; - } - prometheus(t) { - return this._engine.metrics({ format: "prometheus", ...t }); - } - json(t) { - return this._engine.metrics({ format: "json", ...t }); - } - }; - function Rt(e) { - let t; - return { get() { - return t || (t = { value: e() }), t.value; - } }; - } - function Co(e, t) { - let r = Rt(() => pu(t)); - Object.defineProperty(e, "dmmf", { get: () => r.get() }); - } - function pu(e) { - return { datamodel: { models: Nn(e.models), enums: Nn(e.enums), types: Nn(e.types) } }; - } - function Nn(e) { - return Object.entries(e).map(([t, r]) => ({ name: t, ...r })); - } - var qa = require("async_hooks"); - var ja = require("events"); - var Ba = A(require("fs")); - var Qt = A(require("path")); - var U = class { - constructor(t, r) { - if (t.length - 1 !== r.length) - throw t.length === 0 ? new TypeError("Expected at least 1 string") : new TypeError(`Expected ${t.length} strings to have ${t.length - 1} values`); - let n = r.reduce((s, a) => s + (a instanceof U ? a.values.length : 1), 0); - this.values = new Array(n), this.strings = new Array(n + 1), this.strings[0] = t[0]; - let i = 0, o = 0; - for (; i < r.length; ) { - let s = r[i++], a = t[i]; - if (s instanceof U) { - this.strings[o] += s.strings[0]; - let l = 0; - for (; l < s.values.length; ) - this.values[o++] = s.values[l++], this.strings[o] = s.strings[l]; - this.strings[o] += a; - } else - this.values[o++] = s, this.strings[o] = a; - } - } - get text() { - let t = 1, r = this.strings[0]; - for (; t < this.strings.length; ) - r += `$${t}${this.strings[t++]}`; - return r; - } - get sql() { - let t = 1, r = this.strings[0]; - for (; t < this.strings.length; ) - r += `?${this.strings[t++]}`; - return r; - } - inspect() { - return { text: this.text, sql: this.sql, values: this.values }; - } - }; - function Mo(e, t = ",", r = "", n = "") { - if (e.length === 0) - throw new TypeError("Expected `join([])` to be called with an array of multiple elements, but got an empty array"); - return new U([r, ...Array(e.length - 1).fill(t), n], e); - } - function Ln(e) { - return new U([e], []); - } - var Ao = Ln(""); - function $n(e, ...t) { - return new U(e, t); - } - function Ft(e) { - return { getKeys() { - return Object.keys(e); - }, getPropertyValue(t) { - return e[t]; - } }; - } - function re(e, t) { - return { getKeys() { - return [e]; - }, getPropertyValue() { - return t(); - } }; - } - var he = class { - constructor() { - this._map = /* @__PURE__ */ new Map(); - } - get(t) { - return this._map.get(t)?.value; - } - set(t, r) { - this._map.set(t, { value: r }); - } - getOrCreate(t, r) { - let n = this._map.get(t); - if (n) - return n.value; - let i = r(); - return this.set(t, i), i; - } - }; - function Ge(e) { - let t = new he(); - return { getKeys() { - return e.getKeys(); - }, getPropertyValue(r) { - return t.getOrCreate(r, () => e.getPropertyValue(r)); - }, getPropertyDescriptor(r) { - return e.getPropertyDescriptor?.(r); - } }; - } - var Fo = require("util"); - var fr = { enumerable: true, configurable: true, writable: true }; - function gr(e) { - let t = new Set(e); - return { getOwnPropertyDescriptor: () => fr, has: (r, n) => t.has(n), set: (r, n, i) => t.add(n) && Reflect.set(r, n, i), ownKeys: () => [...t] }; - } - var So = Symbol.for("nodejs.util.inspect.custom"); - function xe(e, t) { - let r = du(t), n = /* @__PURE__ */ new Set(), i = new Proxy(e, { get(o, s) { - if (n.has(s)) - return o[s]; - let a = r.get(s); - return a ? a.getPropertyValue(s) : o[s]; - }, has(o, s) { - if (n.has(s)) - return true; - let a = r.get(s); - return a ? a.has?.(s) ?? true : Reflect.has(o, s); - }, ownKeys(o) { - let s = Ro(Reflect.ownKeys(o), r), a = Ro(Array.from(r.keys()), r); - return [.../* @__PURE__ */ new Set([...s, ...a, ...n])]; - }, set(o, s, a) { - return r.get(s)?.getPropertyDescriptor?.(s)?.writable === false ? false : (n.add(s), Reflect.set(o, s, a)); - }, getOwnPropertyDescriptor(o, s) { - let a = Reflect.getOwnPropertyDescriptor(o, s); - if (a && !a.configurable) - return a; - let l = r.get(s); - return l ? l.getPropertyDescriptor ? { ...fr, ...l?.getPropertyDescriptor(s) } : fr : a; - }, defineProperty(o, s, a) { - return n.add(s), Reflect.defineProperty(o, s, a); - } }); - return i[So] = function(o, s, a = Fo.inspect) { - let l = { ...this }; - return delete l[So], a(l, s); - }, i; - } - function du(e) { - let t = /* @__PURE__ */ new Map(); - for (let r of e) { - let n = r.getKeys(); - for (let i of n) - t.set(i, r); - } - return t; - } - function Ro(e, t) { - return e.filter((r) => t.get(r)?.has?.(r) ?? true); - } - function Ot(e) { - return { getKeys() { - return e; - }, has() { - return false; - }, getPropertyValue() { - } }; - } - function Oo({ error: e, user_facing_error: t }, r) { - return t.error_code ? new H(t.message, { code: t.error_code, clientVersion: r, meta: t.meta, batchRequestIdx: t.batch_request_idx }) : new z(e, { clientVersion: r, batchRequestIdx: t.batch_request_idx }); - } - var yr = class { - }; - var No = A(require("fs")); - var kt = A(require("path")); - function hr(e) { - let { runtimeBinaryTarget: t } = e; - return `Add "${t}" to \`binaryTargets\` in the "schema.prisma" file and run \`prisma generate\` after saving it: - -${mu(e)}`; - } - function mu(e) { - let { generator: t, generatorBinaryTargets: r, runtimeBinaryTarget: n } = e, i = { fromEnvVar: null, value: n }, o = [...r, i]; - return Rn({ ...t, binaryTargets: o }); - } - function De(e) { - let { runtimeBinaryTarget: t } = e; - return `Prisma Client could not locate the Query Engine for runtime "${t}".`; - } - function _e(e) { - let { searchedLocations: t } = e; - return `The following locations have been searched: -${[...new Set(t)].map((i) => ` ${i}`).join(` -`)}`; - } - function ko(e) { - let { runtimeBinaryTarget: t } = e; - return `${De(e)} - -This happened because \`binaryTargets\` have been pinned, but the actual deployment also required "${t}". -${hr(e)} - -${_e(e)}`; - } - function xr(e) { - return `We would appreciate if you could take the time to share some information with us. -Please help us by answering a few questions: https://pris.ly/${e}`; - } - function Do(e) { - let { queryEngineName: t } = e; - return `${De(e)} - -This is likely caused by a bundler that has not copied "${t}" next to the resulting bundle. -Ensure that "${t}" has been copied next to the bundle or in "${e.expectedLocation}". - -${xr("engine-not-found-bundler-investigation")} - -${_e(e)}`; - } - function _o(e) { - let { runtimeBinaryTarget: t, generatorBinaryTargets: r } = e, n = r.find((i) => i.native); - return `${De(e)} - -This happened because Prisma Client was generated for "${n?.value ?? "unknown"}", but the actual deployment required "${t}". -${hr(e)} - -${_e(e)}`; - } - function Io(e) { - let { queryEngineName: t } = e; - return `${De(e)} - -This is likely caused by tooling that has not copied "${t}" to the deployment folder. -Ensure that you ran \`prisma generate\` and that "${t}" has been copied to "${e.expectedLocation}". - -${xr("engine-not-found-tooling-investigation")} - -${_e(e)}`; - } - var fu = N("prisma:client:engines:resolveEnginePath"); - var gu = () => new RegExp("runtime[\\\\/]library\\.m?js$"); - async function Lo(e, t) { - let r = { binary: process.env.PRISMA_QUERY_ENGINE_BINARY, library: process.env.PRISMA_QUERY_ENGINE_LIBRARY }[e] ?? t.prismaPath; - if (r !== void 0) - return r; - let { enginePath: n, searchedLocations: i } = await yu(e, t); - if (fu("enginePath", n), n !== void 0 && e === "binary" && vn(n), n !== void 0) - return t.prismaPath = n; - let o = await nt(), s = t.generator?.binaryTargets ?? [], a = s.some((d) => d.native), l = !s.some((d) => d.value === o), u = __filename.match(gu()) === null, c = { searchedLocations: i, generatorBinaryTargets: s, generator: t.generator, runtimeBinaryTarget: o, queryEngineName: $o(e, o), expectedLocation: kt.default.relative(process.cwd(), t.dirname) }, p; - throw a && l ? p = _o(c) : l ? p = ko(c) : u ? p = Do(c) : p = Io(c), new _(p, t.clientVersion); - } - async function yu(engineType, config) { - let binaryTarget = await nt(), searchedLocations = [], dirname = eval("__dirname"), searchLocations = [config.dirname, kt.default.resolve(dirname, ".."), config.generator?.output?.value ?? dirname, kt.default.resolve(dirname, "../../../.prisma/client"), "/tmp/prisma-engines", config.cwd]; - __filename.includes("resolveEnginePath") && searchLocations.push(go()); - for (let e of searchLocations) { - let t = $o(engineType, binaryTarget), r = kt.default.join(e, t); - if (searchedLocations.push(e), No.default.existsSync(r)) - return { enginePath: r, searchedLocations }; - } - return { enginePath: void 0, searchedLocations }; - } - function $o(e, t) { - return e === "library" ? cn(t, "fs") : `query-engine-${t}${t === "windows" ? ".exe" : ""}`; - } - function qo(e, t) { - return { batch: e, transaction: t?.kind === "batch" ? { isolationLevel: t.options.isolationLevel } : void 0 }; - } - var qn = A(On()); - function jo(e) { - return e ? e.replace(/".*"/g, '"X"').replace(/[\s:\[]([+-]?([0-9]*[.])?[0-9]+)/g, (t) => `${t[0]}5`) : ""; - } - function Bo(e) { - return e.split(` -`).map((t) => t.replace(/^\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d\.\d+([+-][0-2]\d:[0-5]\d|Z)\s*/, "").replace(/\+\d+\s*ms$/, "")).join(` -`); - } - var Ko = A(To()); - function Vo({ title: e, user: t = "prisma", repo: r = "prisma", template: n = "bug_report.md", body: i }) { - return (0, Ko.default)({ user: t, repo: r, template: n, title: e, body: i }); - } - function Uo({ version: e, platform: t, title: r, description: n, engineVersion: i, database: o, query: s }) { - let a = Oi(6e3 - (s?.length ?? 0)), l = Bo((0, qn.default)(a)), u = n ? `# Description -\`\`\` -${n} -\`\`\`` : "", c = (0, qn.default)(`Hi Prisma Team! My Prisma Client just crashed. This is the report: -## Versions - -| Name | Version | -|-----------------|--------------------| -| Node | ${process.version?.padEnd(19)}| -| OS | ${t?.padEnd(19)}| -| Prisma Client | ${e?.padEnd(19)}| -| Query Engine | ${i?.padEnd(19)}| -| Database | ${o?.padEnd(19)}| - -${u} - -## Logs -\`\`\` -${l} -\`\`\` - -## Client Snippet -\`\`\`ts -// PLEASE FILL YOUR CODE SNIPPET HERE -\`\`\` - -## Schema -\`\`\`prisma -// PLEASE ADD YOUR SCHEMA HERE IF POSSIBLE -\`\`\` - -## Prisma Engine Query -\`\`\` -${s ? jo(s) : ""} -\`\`\` -`), p = Vo({ title: r, body: c }); - return `${r} - -This is a non-recoverable error which probably happens when the Prisma Query Engine has a panic. - -${X(p)} - -If you want the Prisma team to look into it, please open the link above \u{1F64F} -To increase the chance of success, please post your schema and a snippet of -how you used Prisma Client in the issue. -`; - } - var Ho = A(require("fs")); - function Qo(e) { - if (e?.kind === "itx") - return e.options.id; - } - var Bn = A(require("os")); - var Jo = A(require("path")); - var jn = Symbol("PrismaLibraryEngineCache"); - function hu() { - let e = globalThis; - return e[jn] === void 0 && (e[jn] = {}), e[jn]; - } - function xu(e) { - let t = hu(); - if (t[e] !== void 0) - return t[e]; - let r = Jo.default.toNamespacedPath(e), n = { exports: {} }, i = 0; - return process.platform !== "win32" && (i = Bn.default.constants.dlopen.RTLD_LAZY | Bn.default.constants.dlopen.RTLD_DEEPBIND), process.dlopen(n, r, i), t[e] = n.exports, n.exports; - } - var br = class { - constructor(t) { - this.config = t; - } - async loadLibrary() { - let t = await yn(), r = await Lo("library", this.config); - try { - return this.config.tracingHelper.runInChildSpan({ name: "loadLibrary", internal: true }, () => xu(r)); - } catch (n) { - let i = Cn({ e: n, platformInfo: t, id: r }); - throw new _(i, this.config.clientVersion); - } - } - }; - var Me = N("prisma:client:libraryEngine"); - function bu(e) { - return e.item_type === "query" && "query" in e; - } - function wu(e) { - return "level" in e ? e.level === "error" && e.message === "PANIC" : false; - } - var Go = [...hn, "native"]; - var Wo = 0; - var Dt = class extends yr { - constructor(r, n = new br(r)) { - super(); - try { - this.datamodel = Ho.default.readFileSync(r.datamodelPath, "utf-8"); - } catch (i) { - throw i.stack.match(/\/\.next|\/next@|\/next\//) ? new _(`Your schema.prisma could not be found, and we detected that you are using Next.js. -Find out why and learn how to fix this: https://pris.ly/d/schema-not-found-nextjs`, r.clientVersion) : r.isBundled === true ? new _("Prisma Client could not find its `schema.prisma`. This is likely caused by a bundling step, which leads to `schema.prisma` not being copied near the resulting bundle. We would appreciate if you could take the time to share some information with us.\nPlease help us by answering a few questions: https://pris.ly/bundler-investigation-error", r.clientVersion) : i; - } - this.config = r, this.libraryStarted = false, this.logQueries = r.logQueries ?? false, this.logLevel = r.logLevel ?? "error", this.libraryLoader = n, this.logEmitter = r.logEmitter, this.datasourceOverrides = r.datasources ? this.convertDatasources(r.datasources) : {}, r.enableDebugLogs && (this.logLevel = "debug"), this.libraryInstantiationPromise = this.instantiateLibrary(), this.checkForTooManyEngines(); - } - checkForTooManyEngines() { - Wo === 10 && console.warn(`${ye("warn(prisma-client)")} This is the 10th instance of Prisma Client being started. Make sure this is intentional.`); - } - async transaction(r, n, i) { - await this.start(); - let o = JSON.stringify(n), s; - if (r === "start") { - let l = JSON.stringify({ max_wait: i?.maxWait ?? 2e3, timeout: i?.timeout ?? 5e3, isolation_level: i?.isolationLevel }); - s = await this.engine?.startTransaction(l, o); - } else - r === "commit" ? s = await this.engine?.commitTransaction(i.id, o) : r === "rollback" && (s = await this.engine?.rollbackTransaction(i.id, o)); - let a = this.parseEngineResponse(s); - if (a.error_code) - throw new H(a.message, { code: a.error_code, clientVersion: this.config.clientVersion, meta: a.meta }); - return a; - } - async instantiateLibrary() { - if (Me("internalSetup"), this.libraryInstantiationPromise) - return this.libraryInstantiationPromise; - un(), this.platform = await this.getPlatform(), await this.loadEngine(), this.version(); - } - async getPlatform() { - if (this.platform) - return this.platform; - let r = await nt(); - if (!Go.includes(r)) - throw new _(`Unknown ${pe("PRISMA_QUERY_ENGINE_LIBRARY")} ${pe(ne(r))}. Possible binaryTargets: ${Ue(Go.join(", "))} or a path to the query engine library. -You may have to run ${Ue("prisma generate")} for your changes to take effect.`, this.config.clientVersion); - return r; - } - parseEngineResponse(r) { - if (!r) - throw new z("Response from the Engine was empty", { clientVersion: this.config.clientVersion }); - try { - return JSON.parse(r); - } catch { - throw new z("Unable to JSON.parse response from engine", { clientVersion: this.config.clientVersion }); - } - } - convertDatasources(r) { - let n = /* @__PURE__ */ Object.create(null); - for (let { name: i, url: o } of r) - n[i] = o; - return n; - } - async loadEngine() { - if (!this.engine) { - this.QueryEngineConstructor || (this.library = await this.libraryLoader.loadLibrary(), this.QueryEngineConstructor = this.library.QueryEngine); - try { - let r = new WeakRef(this); - this.engine = new this.QueryEngineConstructor({ datamodel: this.datamodel, env: process.env, logQueries: this.config.logQueries ?? false, ignoreEnvVarErrors: true, datasourceOverrides: this.datasourceOverrides, logLevel: this.logLevel, configDir: this.config.cwd, engineProtocol: "json" }, (n) => { - r.deref()?.logger(n); - }), Wo++; - } catch (r) { - let n = r, i = this.parseInitError(n.message); - throw typeof i == "string" ? n : new _(i.message, this.config.clientVersion, i.error_code); - } - } - } - logger(r) { - let n = this.parseEngineResponse(r); - if (!!n) { - if ("span" in n) { - this.config.tracingHelper.createEngineSpan(n); - return; - } - n.level = n?.level.toLowerCase() ?? "unknown", bu(n) ? this.logEmitter.emit("query", { timestamp: /* @__PURE__ */ new Date(), query: n.query, params: n.params, duration: Number(n.duration_ms), target: n.module_path }) : wu(n) ? this.loggerRustPanic = new ae(this.getErrorMessageWithLink(`${n.message}: ${n.reason} in ${n.file}:${n.line}:${n.column}`), this.config.clientVersion) : this.logEmitter.emit(n.level, { timestamp: /* @__PURE__ */ new Date(), message: n.message, target: n.module_path }); - } - } - getErrorMessageWithLink(r) { - return Uo({ platform: this.platform, title: r, version: this.config.clientVersion, engineVersion: this.versionInfo?.commit, database: this.config.activeProvider, query: this.lastQuery }); - } - parseInitError(r) { - try { - return JSON.parse(r); - } catch { - } - return r; - } - parseRequestError(r) { - try { - return JSON.parse(r); - } catch { - } - return r; - } - on(r, n) { - if (r === "beforeExit") - throw new Error('"beforeExit" hook is not applicable to the library engine since Prisma 5.0.0, it is only relevant and implemented for the binary engine. Please add your event listener to the `process` object directly instead.'); - this.logEmitter.on(r, n); - } - async start() { - if (await this.libraryInstantiationPromise, await this.libraryStoppingPromise, this.libraryStartingPromise) - return Me(`library already starting, this.libraryStarted: ${this.libraryStarted}`), this.libraryStartingPromise; - if (this.libraryStarted) - return; - let r = async () => { - Me("library starting"); - try { - let n = { traceparent: this.config.tracingHelper.getTraceParent() }; - await this.engine?.connect(JSON.stringify(n)), this.libraryStarted = true, Me("library started"); - } catch (n) { - let i = this.parseInitError(n.message); - throw typeof i == "string" ? n : new _(i.message, this.config.clientVersion, i.error_code); - } finally { - this.libraryStartingPromise = void 0; - } - }; - return this.libraryStartingPromise = this.config.tracingHelper.runInChildSpan("connect", r), this.libraryStartingPromise; - } - async stop() { - if (await this.libraryStartingPromise, await this.executingQueryPromise, this.libraryStoppingPromise) - return Me("library is already stopping"), this.libraryStoppingPromise; - if (!this.libraryStarted) - return; - let r = async () => { - await new Promise((i) => setTimeout(i, 5)), Me("library stopping"); - let n = { traceparent: this.config.tracingHelper.getTraceParent() }; - await this.engine?.disconnect(JSON.stringify(n)), this.libraryStarted = false, this.libraryStoppingPromise = void 0, Me("library stopped"); - }; - return this.libraryStoppingPromise = this.config.tracingHelper.runInChildSpan("disconnect", r), this.libraryStoppingPromise; - } - version() { - return this.versionInfo = this.library?.version(), this.versionInfo?.version ?? "unknown"; - } - debugPanic(r) { - return this.library?.debugPanic(r); - } - async request(r, { traceparent: n, interactiveTransaction: i }) { - Me(`sending request, this.libraryStarted: ${this.libraryStarted}`); - let o = JSON.stringify({ traceparent: n }), s = JSON.stringify(r); - try { - await this.start(), this.executingQueryPromise = this.engine?.query(s, o, i?.id), this.lastQuery = s; - let a = this.parseEngineResponse(await this.executingQueryPromise); - if (a.errors) - throw a.errors.length === 1 ? this.buildQueryError(a.errors[0]) : new z(JSON.stringify(a.errors), { clientVersion: this.config.clientVersion }); - if (this.loggerRustPanic) - throw this.loggerRustPanic; - return { data: a, elapsed: 0 }; - } catch (a) { - if (a instanceof _) - throw a; - if (a.code === "GenericFailure" && a.message?.startsWith("PANIC:")) - throw new ae(this.getErrorMessageWithLink(a.message), this.config.clientVersion); - let l = this.parseRequestError(a.message); - throw typeof l == "string" ? a : new z(`${l.message} -${l.backtrace}`, { clientVersion: this.config.clientVersion }); - } - } - async requestBatch(r, { transaction: n, traceparent: i }) { - Me("requestBatch"); - let o = qo(r, n); - await this.start(), this.lastQuery = JSON.stringify(o), this.executingQueryPromise = this.engine.query(this.lastQuery, JSON.stringify({ traceparent: i }), Qo(n)); - let s = await this.executingQueryPromise, a = this.parseEngineResponse(s); - if (a.errors) - throw a.errors.length === 1 ? this.buildQueryError(a.errors[0]) : new z(JSON.stringify(a.errors), { clientVersion: this.config.clientVersion }); - let { batchResult: l, errors: u } = a; - if (Array.isArray(l)) - return l.map((c) => c.errors && c.errors.length > 0 ? this.loggerRustPanic ?? this.buildQueryError(c.errors[0]) : { data: c, elapsed: 0 }); - throw u && u.length === 1 ? new Error(u[0].error) : new Error(JSON.stringify(a)); - } - buildQueryError(r) { - return r.user_facing_error.is_panic ? new ae(this.getErrorMessageWithLink(r.user_facing_error.message), this.config.clientVersion) : Oo(r, this.config.clientVersion); - } - async metrics(r) { - await this.start(); - let n = await this.engine.metrics(JSON.stringify(r)); - return r.format === "prometheus" ? n : this.parseEngineResponse(n); - } - }; - var at = class { - constructor(t = 0, r) { - this.context = r; - this.lines = []; - this.currentLine = ""; - this.currentIndent = 0; - this.currentIndent = t; - } - write(t) { - return typeof t == "string" ? this.currentLine += t : t.write(this), this; - } - writeJoined(t, r) { - let n = r.length - 1; - for (let i = 0; i < r.length; i++) - this.write(r[i]), i !== n && this.write(t); - return this; - } - writeLine(t) { - return this.write(t).newLine(); - } - newLine() { - this.lines.push(this.indentedCurrentLine()), this.currentLine = "", this.marginSymbol = void 0; - let t = this.afterNextNewLineCallback; - return this.afterNextNewLineCallback = void 0, t?.(), this; - } - withIndent(t) { - return this.indent(), t(this), this.unindent(), this; - } - afterNextNewline(t) { - return this.afterNextNewLineCallback = t, this; - } - indent() { - return this.currentIndent++, this; - } - unindent() { - return this.currentIndent > 0 && this.currentIndent--, this; - } - addMarginSymbol(t) { - return this.marginSymbol = t, this; - } - toString() { - return this.lines.concat(this.indentedCurrentLine()).join(` -`); - } - getCurrentLineLength() { - return this.currentLine.length; - } - indentedCurrentLine() { - let t = this.currentLine.padStart(this.currentLine.length + 2 * this.currentIndent); - return this.marginSymbol ? this.marginSymbol + t.slice(1) : t; - } - }; - var wr = Symbol(); - var Kn = /* @__PURE__ */ new WeakMap(); - var Ae = class { - constructor(t) { - t === wr ? Kn.set(this, `Prisma.${this._getName()}`) : Kn.set(this, `new Prisma.${this._getNamespace()}.${this._getName()}()`); - } - _getName() { - return this.constructor.name; - } - toString() { - return Kn.get(this); - } - }; - var _t = class extends Ae { - _getNamespace() { - return "NullTypes"; - } - }; - var It = class extends _t { - }; - Vn(It, "DbNull"); - var Nt = class extends _t { - }; - Vn(Nt, "JsonNull"); - var Lt = class extends _t { - }; - Vn(Lt, "AnyNull"); - var Pr = { classes: { DbNull: It, JsonNull: Nt, AnyNull: Lt }, instances: { DbNull: new It(wr), JsonNull: new Nt(wr), AnyNull: new Lt(wr) } }; - function Vn(e, t) { - Object.defineProperty(e, "name", { value: t, configurable: true }); - } - function lt(e) { - return e instanceof Date || Object.prototype.toString.call(e) === "[object Date]"; - } - function Er(e) { - return e.toString() !== "Invalid Date"; - } - var ut = 9e15; - var $e = 1e9; - var Un = "0123456789abcdef"; - var vr = "2.3025850929940456840179914546843642076011014886287729760333279009675726096773524802359972050895982983419677840422862486334095254650828067566662873690987816894829072083255546808437998948262331985283935053089653777326288461633662222876982198867465436674744042432743651550489343149393914796194044002221051017141748003688084012647080685567743216228355220114804663715659121373450747856947683463616792101806445070648000277502684916746550586856935673420670581136429224554405758925724208241314695689016758940256776311356919292033376587141660230105703089634572075440370847469940168269282808481184289314848524948644871927809676271275775397027668605952496716674183485704422507197965004714951050492214776567636938662976979522110718264549734772662425709429322582798502585509785265383207606726317164309505995087807523710333101197857547331541421808427543863591778117054309827482385045648019095610299291824318237525357709750539565187697510374970888692180205189339507238539205144634197265287286965110862571492198849978748873771345686209167058"; - var Cr = "3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679821480865132823066470938446095505822317253594081284811174502841027019385211055596446229489549303819644288109756659334461284756482337867831652712019091456485669234603486104543266482133936072602491412737245870066063155881748815209209628292540917153643678925903600113305305488204665213841469519415116094330572703657595919530921861173819326117931051185480744623799627495673518857527248912279381830119491298336733624406566430860213949463952247371907021798609437027705392171762931767523846748184676694051320005681271452635608277857713427577896091736371787214684409012249534301465495853710507922796892589235420199561121290219608640344181598136297747713099605187072113499999983729780499510597317328160963185950244594553469083026425223082533446850352619311881710100031378387528865875332083814206171776691473035982534904287554687311595628638823537875937519577818577805321712268066130019278766111959092164201989380952572010654858632789"; - var Qn = { precision: 20, rounding: 4, modulo: 1, toExpNeg: -7, toExpPos: 21, minE: -ut, maxE: ut, crypto: false }; - var Xo; - var Se; - var P = true; - var Ar = "[DecimalError] "; - var Le = Ar + "Invalid argument: "; - var es = Ar + "Precision limit exceeded"; - var ts = Ar + "crypto unavailable"; - var rs = "[object Decimal]"; - var Y = Math.floor; - var $ = Math.pow; - var Pu = /^0b([01]+(\.[01]*)?|\.[01]+)(p[+-]?\d+)?$/i; - var Eu = /^0x([0-9a-f]+(\.[0-9a-f]*)?|\.[0-9a-f]+)(p[+-]?\d+)?$/i; - var Tu = /^0o([0-7]+(\.[0-7]*)?|\.[0-7]+)(p[+-]?\d+)?$/i; - var ns = /^(\d+(\.\d*)?|\.\d+)(e[+-]?\d+)?$/i; - var me = 1e7; - var w = 7; - var vu = 9007199254740991; - var Cu = vr.length - 1; - var Jn = Cr.length - 1; - var m = { toStringTag: rs }; - m.absoluteValue = m.abs = function() { - var e = new this.constructor(this); - return e.s < 0 && (e.s = 1), h(e); - }; - m.ceil = function() { - return h(new this.constructor(this), this.e + 1, 2); - }; - m.clampedTo = m.clamp = function(e, t) { - var r, n = this, i = n.constructor; - if (e = new i(e), t = new i(t), !e.s || !t.s) - return new i(NaN); - if (e.gt(t)) - throw Error(Le + t); - return r = n.cmp(e), r < 0 ? e : n.cmp(t) > 0 ? t : new i(n); - }; - m.comparedTo = m.cmp = function(e) { - var t, r, n, i, o = this, s = o.d, a = (e = new o.constructor(e)).d, l = o.s, u = e.s; - if (!s || !a) - return !l || !u ? NaN : l !== u ? l : s === a ? 0 : !s ^ l < 0 ? 1 : -1; - if (!s[0] || !a[0]) - return s[0] ? l : a[0] ? -u : 0; - if (l !== u) - return l; - if (o.e !== e.e) - return o.e > e.e ^ l < 0 ? 1 : -1; - for (n = s.length, i = a.length, t = 0, r = n < i ? n : i; t < r; ++t) - if (s[t] !== a[t]) - return s[t] > a[t] ^ l < 0 ? 1 : -1; - return n === i ? 0 : n > i ^ l < 0 ? 1 : -1; - }; - m.cosine = m.cos = function() { - var e, t, r = this, n = r.constructor; - return r.d ? r.d[0] ? (e = n.precision, t = n.rounding, n.precision = e + Math.max(r.e, r.sd()) + w, n.rounding = 1, r = Mu(n, ls(n, r)), n.precision = e, n.rounding = t, h(Se == 2 || Se == 3 ? r.neg() : r, e, t, true)) : new n(1) : new n(NaN); - }; - m.cubeRoot = m.cbrt = function() { - var e, t, r, n, i, o, s, a, l, u, c = this, p = c.constructor; - if (!c.isFinite() || c.isZero()) - return new p(c); - for (P = false, o = c.s * $(c.s * c, 1 / 3), !o || Math.abs(o) == 1 / 0 ? (r = Q(c.d), e = c.e, (o = (e - r.length + 1) % 3) && (r += o == 1 || o == -2 ? "0" : "00"), o = $(r, 1 / 3), e = Y((e + 1) / 3) - (e % 3 == (e < 0 ? -1 : 2)), o == 1 / 0 ? r = "5e" + e : (r = o.toExponential(), r = r.slice(0, r.indexOf("e") + 1) + e), n = new p(r), n.s = c.s) : n = new p(o.toString()), s = (e = p.precision) + 3; ; ) - if (a = n, l = a.times(a).times(a), u = l.plus(c), n = F(u.plus(c).times(a), u.plus(l), s + 2, 1), Q(a.d).slice(0, s) === (r = Q(n.d)).slice(0, s)) - if (r = r.slice(s - 3, s + 1), r == "9999" || !i && r == "4999") { - if (!i && (h(a, e + 1, 0), a.times(a).times(a).eq(c))) { - n = a; - break; - } - s += 4, i = 1; - } else { - (!+r || !+r.slice(1) && r.charAt(0) == "5") && (h(n, e + 1, 1), t = !n.times(n).times(n).eq(c)); - break; - } - return P = true, h(n, e, p.rounding, t); - }; - m.decimalPlaces = m.dp = function() { - var e, t = this.d, r = NaN; - if (t) { - if (e = t.length - 1, r = (e - Y(this.e / w)) * w, e = t[e], e) - for (; e % 10 == 0; e /= 10) - r--; - r < 0 && (r = 0); - } - return r; - }; - m.dividedBy = m.div = function(e) { - return F(this, new this.constructor(e)); - }; - m.dividedToIntegerBy = m.divToInt = function(e) { - var t = this, r = t.constructor; - return h(F(t, new r(e), 0, 1, 1), r.precision, r.rounding); - }; - m.equals = m.eq = function(e) { - return this.cmp(e) === 0; - }; - m.floor = function() { - return h(new this.constructor(this), this.e + 1, 3); - }; - m.greaterThan = m.gt = function(e) { - return this.cmp(e) > 0; - }; - m.greaterThanOrEqualTo = m.gte = function(e) { - var t = this.cmp(e); - return t == 1 || t === 0; - }; - m.hyperbolicCosine = m.cosh = function() { - var e, t, r, n, i, o = this, s = o.constructor, a = new s(1); - if (!o.isFinite()) - return new s(o.s ? 1 / 0 : NaN); - if (o.isZero()) - return a; - r = s.precision, n = s.rounding, s.precision = r + Math.max(o.e, o.sd()) + 4, s.rounding = 1, i = o.d.length, i < 32 ? (e = Math.ceil(i / 3), t = (1 / Rr(4, e)).toString()) : (e = 16, t = "2.3283064365386962890625e-10"), o = ct(s, 1, o.times(t), new s(1), true); - for (var l, u = e, c = new s(8); u--; ) - l = o.times(o), o = a.minus(l.times(c.minus(l.times(c)))); - return h(o, s.precision = r, s.rounding = n, true); - }; - m.hyperbolicSine = m.sinh = function() { - var e, t, r, n, i = this, o = i.constructor; - if (!i.isFinite() || i.isZero()) - return new o(i); - if (t = o.precision, r = o.rounding, o.precision = t + Math.max(i.e, i.sd()) + 4, o.rounding = 1, n = i.d.length, n < 3) - i = ct(o, 2, i, i, true); - else { - e = 1.4 * Math.sqrt(n), e = e > 16 ? 16 : e | 0, i = i.times(1 / Rr(5, e)), i = ct(o, 2, i, i, true); - for (var s, a = new o(5), l = new o(16), u = new o(20); e--; ) - s = i.times(i), i = i.times(a.plus(s.times(l.times(s).plus(u)))); - } - return o.precision = t, o.rounding = r, h(i, t, r, true); - }; - m.hyperbolicTangent = m.tanh = function() { - var e, t, r = this, n = r.constructor; - return r.isFinite() ? r.isZero() ? new n(r) : (e = n.precision, t = n.rounding, n.precision = e + 7, n.rounding = 1, F(r.sinh(), r.cosh(), n.precision = e, n.rounding = t)) : new n(r.s); - }; - m.inverseCosine = m.acos = function() { - var e, t = this, r = t.constructor, n = t.abs().cmp(1), i = r.precision, o = r.rounding; - return n !== -1 ? n === 0 ? t.isNeg() ? de(r, i, o) : new r(0) : new r(NaN) : t.isZero() ? de(r, i + 4, o).times(0.5) : (r.precision = i + 6, r.rounding = 1, t = t.asin(), e = de(r, i + 4, o).times(0.5), r.precision = i, r.rounding = o, e.minus(t)); - }; - m.inverseHyperbolicCosine = m.acosh = function() { - var e, t, r = this, n = r.constructor; - return r.lte(1) ? new n(r.eq(1) ? 0 : NaN) : r.isFinite() ? (e = n.precision, t = n.rounding, n.precision = e + Math.max(Math.abs(r.e), r.sd()) + 4, n.rounding = 1, P = false, r = r.times(r).minus(1).sqrt().plus(r), P = true, n.precision = e, n.rounding = t, r.ln()) : new n(r); - }; - m.inverseHyperbolicSine = m.asinh = function() { - var e, t, r = this, n = r.constructor; - return !r.isFinite() || r.isZero() ? new n(r) : (e = n.precision, t = n.rounding, n.precision = e + 2 * Math.max(Math.abs(r.e), r.sd()) + 6, n.rounding = 1, P = false, r = r.times(r).plus(1).sqrt().plus(r), P = true, n.precision = e, n.rounding = t, r.ln()); - }; - m.inverseHyperbolicTangent = m.atanh = function() { - var e, t, r, n, i = this, o = i.constructor; - return i.isFinite() ? i.e >= 0 ? new o(i.abs().eq(1) ? i.s / 0 : i.isZero() ? i : NaN) : (e = o.precision, t = o.rounding, n = i.sd(), Math.max(n, e) < 2 * -i.e - 1 ? h(new o(i), e, t, true) : (o.precision = r = n - i.e, i = F(i.plus(1), new o(1).minus(i), r + e, 1), o.precision = e + 4, o.rounding = 1, i = i.ln(), o.precision = e, o.rounding = t, i.times(0.5))) : new o(NaN); - }; - m.inverseSine = m.asin = function() { - var e, t, r, n, i = this, o = i.constructor; - return i.isZero() ? new o(i) : (t = i.abs().cmp(1), r = o.precision, n = o.rounding, t !== -1 ? t === 0 ? (e = de(o, r + 4, n).times(0.5), e.s = i.s, e) : new o(NaN) : (o.precision = r + 6, o.rounding = 1, i = i.div(new o(1).minus(i.times(i)).sqrt().plus(1)).atan(), o.precision = r, o.rounding = n, i.times(2))); - }; - m.inverseTangent = m.atan = function() { - var e, t, r, n, i, o, s, a, l, u = this, c = u.constructor, p = c.precision, d = c.rounding; - if (u.isFinite()) { - if (u.isZero()) - return new c(u); - if (u.abs().eq(1) && p + 4 <= Jn) - return s = de(c, p + 4, d).times(0.25), s.s = u.s, s; - } else { - if (!u.s) - return new c(NaN); - if (p + 4 <= Jn) - return s = de(c, p + 4, d).times(0.5), s.s = u.s, s; - } - for (c.precision = a = p + 10, c.rounding = 1, r = Math.min(28, a / w + 2 | 0), e = r; e; --e) - u = u.div(u.times(u).plus(1).sqrt().plus(1)); - for (P = false, t = Math.ceil(a / w), n = 1, l = u.times(u), s = new c(u), i = u; e !== -1; ) - if (i = i.times(l), o = s.minus(i.div(n += 2)), i = i.times(l), s = o.plus(i.div(n += 2)), s.d[t] !== void 0) - for (e = t; s.d[e] === o.d[e] && e--; ) - ; - return r && (s = s.times(2 << r - 1)), P = true, h(s, c.precision = p, c.rounding = d, true); - }; - m.isFinite = function() { - return !!this.d; - }; - m.isInteger = m.isInt = function() { - return !!this.d && Y(this.e / w) > this.d.length - 2; - }; - m.isNaN = function() { - return !this.s; - }; - m.isNegative = m.isNeg = function() { - return this.s < 0; - }; - m.isPositive = m.isPos = function() { - return this.s > 0; - }; - m.isZero = function() { - return !!this.d && this.d[0] === 0; - }; - m.lessThan = m.lt = function(e) { - return this.cmp(e) < 0; - }; - m.lessThanOrEqualTo = m.lte = function(e) { - return this.cmp(e) < 1; - }; - m.logarithm = m.log = function(e) { - var t, r, n, i, o, s, a, l, u = this, c = u.constructor, p = c.precision, d = c.rounding, g = 5; - if (e == null) - e = new c(10), t = true; - else { - if (e = new c(e), r = e.d, e.s < 0 || !r || !r[0] || e.eq(1)) - return new c(NaN); - t = e.eq(10); - } - if (r = u.d, u.s < 0 || !r || !r[0] || u.eq(1)) - return new c(r && !r[0] ? -1 / 0 : u.s != 1 ? NaN : r ? 0 : 1 / 0); - if (t) - if (r.length > 1) - o = true; - else { - for (i = r[0]; i % 10 === 0; ) - i /= 10; - o = i !== 1; - } - if (P = false, a = p + g, s = Ne(u, a), n = t ? Mr(c, a + 10) : Ne(e, a), l = F(s, n, a, 1), $t(l.d, i = p, d)) - do - if (a += 10, s = Ne(u, a), n = t ? Mr(c, a + 10) : Ne(e, a), l = F(s, n, a, 1), !o) { - +Q(l.d).slice(i + 1, i + 15) + 1 == 1e14 && (l = h(l, p + 1, 0)); - break; - } - while ($t(l.d, i += 10, d)); - return P = true, h(l, p, d); - }; - m.minus = m.sub = function(e) { - var t, r, n, i, o, s, a, l, u, c, p, d, g = this, y = g.constructor; - if (e = new y(e), !g.d || !e.d) - return !g.s || !e.s ? e = new y(NaN) : g.d ? e.s = -e.s : e = new y(e.d || g.s !== e.s ? g : NaN), e; - if (g.s != e.s) - return e.s = -e.s, g.plus(e); - if (u = g.d, d = e.d, a = y.precision, l = y.rounding, !u[0] || !d[0]) { - if (d[0]) - e.s = -e.s; - else if (u[0]) - e = new y(g); - else - return new y(l === 3 ? -0 : 0); - return P ? h(e, a, l) : e; - } - if (r = Y(e.e / w), c = Y(g.e / w), u = u.slice(), o = c - r, o) { - for (p = o < 0, p ? (t = u, o = -o, s = d.length) : (t = d, r = c, s = u.length), n = Math.max(Math.ceil(a / w), s) + 2, o > n && (o = n, t.length = 1), t.reverse(), n = o; n--; ) - t.push(0); - t.reverse(); - } else { - for (n = u.length, s = d.length, p = n < s, p && (s = n), n = 0; n < s; n++) - if (u[n] != d[n]) { - p = u[n] < d[n]; - break; - } - o = 0; - } - for (p && (t = u, u = d, d = t, e.s = -e.s), s = u.length, n = d.length - s; n > 0; --n) - u[s++] = 0; - for (n = d.length; n > o; ) { - if (u[--n] < d[n]) { - for (i = n; i && u[--i] === 0; ) - u[i] = me - 1; - --u[i], u[n] += me; - } - u[n] -= d[n]; - } - for (; u[--s] === 0; ) - u.pop(); - for (; u[0] === 0; u.shift()) - --r; - return u[0] ? (e.d = u, e.e = Sr(u, r), P ? h(e, a, l) : e) : new y(l === 3 ? -0 : 0); - }; - m.modulo = m.mod = function(e) { - var t, r = this, n = r.constructor; - return e = new n(e), !r.d || !e.s || e.d && !e.d[0] ? new n(NaN) : !e.d || r.d && !r.d[0] ? h(new n(r), n.precision, n.rounding) : (P = false, n.modulo == 9 ? (t = F(r, e.abs(), 0, 3, 1), t.s *= e.s) : t = F(r, e, 0, n.modulo, 1), t = t.times(e), P = true, r.minus(t)); - }; - m.naturalExponential = m.exp = function() { - return Gn(this); - }; - m.naturalLogarithm = m.ln = function() { - return Ne(this); - }; - m.negated = m.neg = function() { - var e = new this.constructor(this); - return e.s = -e.s, h(e); - }; - m.plus = m.add = function(e) { - var t, r, n, i, o, s, a, l, u, c, p = this, d = p.constructor; - if (e = new d(e), !p.d || !e.d) - return !p.s || !e.s ? e = new d(NaN) : p.d || (e = new d(e.d || p.s === e.s ? p : NaN)), e; - if (p.s != e.s) - return e.s = -e.s, p.minus(e); - if (u = p.d, c = e.d, a = d.precision, l = d.rounding, !u[0] || !c[0]) - return c[0] || (e = new d(p)), P ? h(e, a, l) : e; - if (o = Y(p.e / w), n = Y(e.e / w), u = u.slice(), i = o - n, i) { - for (i < 0 ? (r = u, i = -i, s = c.length) : (r = c, n = o, s = u.length), o = Math.ceil(a / w), s = o > s ? o + 1 : s + 1, i > s && (i = s, r.length = 1), r.reverse(); i--; ) - r.push(0); - r.reverse(); - } - for (s = u.length, i = c.length, s - i < 0 && (i = s, r = c, c = u, u = r), t = 0; i; ) - t = (u[--i] = u[i] + c[i] + t) / me | 0, u[i] %= me; - for (t && (u.unshift(t), ++n), s = u.length; u[--s] == 0; ) - u.pop(); - return e.d = u, e.e = Sr(u, n), P ? h(e, a, l) : e; - }; - m.precision = m.sd = function(e) { - var t, r = this; - if (e !== void 0 && e !== !!e && e !== 1 && e !== 0) - throw Error(Le + e); - return r.d ? (t = is(r.d), e && r.e + 1 > t && (t = r.e + 1)) : t = NaN, t; - }; - m.round = function() { - var e = this, t = e.constructor; - return h(new t(e), e.e + 1, t.rounding); - }; - m.sine = m.sin = function() { - var e, t, r = this, n = r.constructor; - return r.isFinite() ? r.isZero() ? new n(r) : (e = n.precision, t = n.rounding, n.precision = e + Math.max(r.e, r.sd()) + w, n.rounding = 1, r = Su(n, ls(n, r)), n.precision = e, n.rounding = t, h(Se > 2 ? r.neg() : r, e, t, true)) : new n(NaN); - }; - m.squareRoot = m.sqrt = function() { - var e, t, r, n, i, o, s = this, a = s.d, l = s.e, u = s.s, c = s.constructor; - if (u !== 1 || !a || !a[0]) - return new c(!u || u < 0 && (!a || a[0]) ? NaN : a ? s : 1 / 0); - for (P = false, u = Math.sqrt(+s), u == 0 || u == 1 / 0 ? (t = Q(a), (t.length + l) % 2 == 0 && (t += "0"), u = Math.sqrt(t), l = Y((l + 1) / 2) - (l < 0 || l % 2), u == 1 / 0 ? t = "5e" + l : (t = u.toExponential(), t = t.slice(0, t.indexOf("e") + 1) + l), n = new c(t)) : n = new c(u.toString()), r = (l = c.precision) + 3; ; ) - if (o = n, n = o.plus(F(s, o, r + 2, 1)).times(0.5), Q(o.d).slice(0, r) === (t = Q(n.d)).slice(0, r)) - if (t = t.slice(r - 3, r + 1), t == "9999" || !i && t == "4999") { - if (!i && (h(o, l + 1, 0), o.times(o).eq(s))) { - n = o; - break; - } - r += 4, i = 1; - } else { - (!+t || !+t.slice(1) && t.charAt(0) == "5") && (h(n, l + 1, 1), e = !n.times(n).eq(s)); - break; - } - return P = true, h(n, l, c.rounding, e); - }; - m.tangent = m.tan = function() { - var e, t, r = this, n = r.constructor; - return r.isFinite() ? r.isZero() ? new n(r) : (e = n.precision, t = n.rounding, n.precision = e + 10, n.rounding = 1, r = r.sin(), r.s = 1, r = F(r, new n(1).minus(r.times(r)).sqrt(), e + 10, 0), n.precision = e, n.rounding = t, h(Se == 2 || Se == 4 ? r.neg() : r, e, t, true)) : new n(NaN); - }; - m.times = m.mul = function(e) { - var t, r, n, i, o, s, a, l, u, c = this, p = c.constructor, d = c.d, g = (e = new p(e)).d; - if (e.s *= c.s, !d || !d[0] || !g || !g[0]) - return new p(!e.s || d && !d[0] && !g || g && !g[0] && !d ? NaN : !d || !g ? e.s / 0 : e.s * 0); - for (r = Y(c.e / w) + Y(e.e / w), l = d.length, u = g.length, l < u && (o = d, d = g, g = o, s = l, l = u, u = s), o = [], s = l + u, n = s; n--; ) - o.push(0); - for (n = u; --n >= 0; ) { - for (t = 0, i = l + n; i > n; ) - a = o[i] + g[n] * d[i - n - 1] + t, o[i--] = a % me | 0, t = a / me | 0; - o[i] = (o[i] + t) % me | 0; - } - for (; !o[--s]; ) - o.pop(); - return t ? ++r : o.shift(), e.d = o, e.e = Sr(o, r), P ? h(e, p.precision, p.rounding) : e; - }; - m.toBinary = function(e, t) { - return Hn(this, 2, e, t); - }; - m.toDecimalPlaces = m.toDP = function(e, t) { - var r = this, n = r.constructor; - return r = new n(r), e === void 0 ? r : (oe(e, 0, $e), t === void 0 ? t = n.rounding : oe(t, 0, 8), h(r, e + r.e + 1, t)); - }; - m.toExponential = function(e, t) { - var r, n = this, i = n.constructor; - return e === void 0 ? r = be(n, true) : (oe(e, 0, $e), t === void 0 ? t = i.rounding : oe(t, 0, 8), n = h(new i(n), e + 1, t), r = be(n, true, e + 1)), n.isNeg() && !n.isZero() ? "-" + r : r; - }; - m.toFixed = function(e, t) { - var r, n, i = this, o = i.constructor; - return e === void 0 ? r = be(i) : (oe(e, 0, $e), t === void 0 ? t = o.rounding : oe(t, 0, 8), n = h(new o(i), e + i.e + 1, t), r = be(n, false, e + n.e + 1)), i.isNeg() && !i.isZero() ? "-" + r : r; - }; - m.toFraction = function(e) { - var t, r, n, i, o, s, a, l, u, c, p, d, g = this, y = g.d, f = g.constructor; - if (!y) - return new f(g); - if (u = r = new f(1), n = l = new f(0), t = new f(n), o = t.e = is(y) - g.e - 1, s = o % w, t.d[0] = $(10, s < 0 ? w + s : s), e == null) - e = o > 0 ? t : u; - else { - if (a = new f(e), !a.isInt() || a.lt(u)) - throw Error(Le + a); - e = a.gt(t) ? o > 0 ? t : u : a; - } - for (P = false, a = new f(Q(y)), c = f.precision, f.precision = o = y.length * w * 2; p = F(a, t, 0, 1, 1), i = r.plus(p.times(n)), i.cmp(e) != 1; ) - r = n, n = i, i = u, u = l.plus(p.times(i)), l = i, i = t, t = a.minus(p.times(i)), a = i; - return i = F(e.minus(r), n, 0, 1, 1), l = l.plus(i.times(u)), r = r.plus(i.times(n)), l.s = u.s = g.s, d = F(u, n, o, 1).minus(g).abs().cmp(F(l, r, o, 1).minus(g).abs()) < 1 ? [u, n] : [l, r], f.precision = c, P = true, d; - }; - m.toHexadecimal = m.toHex = function(e, t) { - return Hn(this, 16, e, t); - }; - m.toNearest = function(e, t) { - var r = this, n = r.constructor; - if (r = new n(r), e == null) { - if (!r.d) - return r; - e = new n(1), t = n.rounding; - } else { - if (e = new n(e), t === void 0 ? t = n.rounding : oe(t, 0, 8), !r.d) - return e.s ? r : e; - if (!e.d) - return e.s && (e.s = r.s), e; - } - return e.d[0] ? (P = false, r = F(r, e, 0, t, 1).times(e), P = true, h(r)) : (e.s = r.s, r = e), r; - }; - m.toNumber = function() { - return +this; - }; - m.toOctal = function(e, t) { - return Hn(this, 8, e, t); - }; - m.toPower = m.pow = function(e) { - var t, r, n, i, o, s, a = this, l = a.constructor, u = +(e = new l(e)); - if (!a.d || !e.d || !a.d[0] || !e.d[0]) - return new l($(+a, u)); - if (a = new l(a), a.eq(1)) - return a; - if (n = l.precision, o = l.rounding, e.eq(1)) - return h(a, n, o); - if (t = Y(e.e / w), t >= e.d.length - 1 && (r = u < 0 ? -u : u) <= vu) - return i = os(l, a, r, n), e.s < 0 ? new l(1).div(i) : h(i, n, o); - if (s = a.s, s < 0) { - if (t < e.d.length - 1) - return new l(NaN); - if ((e.d[t] & 1) == 0 && (s = 1), a.e == 0 && a.d[0] == 1 && a.d.length == 1) - return a.s = s, a; - } - return r = $(+a, u), t = r == 0 || !isFinite(r) ? Y(u * (Math.log("0." + Q(a.d)) / Math.LN10 + a.e + 1)) : new l(r + "").e, t > l.maxE + 1 || t < l.minE - 1 ? new l(t > 0 ? s / 0 : 0) : (P = false, l.rounding = a.s = 1, r = Math.min(12, (t + "").length), i = Gn(e.times(Ne(a, n + r)), n), i.d && (i = h(i, n + 5, 1), $t(i.d, n, o) && (t = n + 10, i = h(Gn(e.times(Ne(a, t + r)), t), t + 5, 1), +Q(i.d).slice(n + 1, n + 15) + 1 == 1e14 && (i = h(i, n + 1, 0)))), i.s = s, P = true, l.rounding = o, h(i, n, o)); - }; - m.toPrecision = function(e, t) { - var r, n = this, i = n.constructor; - return e === void 0 ? r = be(n, n.e <= i.toExpNeg || n.e >= i.toExpPos) : (oe(e, 1, $e), t === void 0 ? t = i.rounding : oe(t, 0, 8), n = h(new i(n), e, t), r = be(n, e <= n.e || n.e <= i.toExpNeg, e)), n.isNeg() && !n.isZero() ? "-" + r : r; - }; - m.toSignificantDigits = m.toSD = function(e, t) { - var r = this, n = r.constructor; - return e === void 0 ? (e = n.precision, t = n.rounding) : (oe(e, 1, $e), t === void 0 ? t = n.rounding : oe(t, 0, 8)), h(new n(r), e, t); - }; - m.toString = function() { - var e = this, t = e.constructor, r = be(e, e.e <= t.toExpNeg || e.e >= t.toExpPos); - return e.isNeg() && !e.isZero() ? "-" + r : r; - }; - m.truncated = m.trunc = function() { - return h(new this.constructor(this), this.e + 1, 1); - }; - m.valueOf = m.toJSON = function() { - var e = this, t = e.constructor, r = be(e, e.e <= t.toExpNeg || e.e >= t.toExpPos); - return e.isNeg() ? "-" + r : r; - }; - function Q(e) { - var t, r, n, i = e.length - 1, o = "", s = e[0]; - if (i > 0) { - for (o += s, t = 1; t < i; t++) - n = e[t] + "", r = w - n.length, r && (o += Ie(r)), o += n; - s = e[t], n = s + "", r = w - n.length, r && (o += Ie(r)); - } else if (s === 0) - return "0"; - for (; s % 10 === 0; ) - s /= 10; - return o + s; - } - function oe(e, t, r) { - if (e !== ~~e || e < t || e > r) - throw Error(Le + e); - } - function $t(e, t, r, n) { - var i, o, s, a; - for (o = e[0]; o >= 10; o /= 10) - --t; - return --t < 0 ? (t += w, i = 0) : (i = Math.ceil((t + 1) / w), t %= w), o = $(10, w - t), a = e[i] % o | 0, n == null ? t < 3 ? (t == 0 ? a = a / 100 | 0 : t == 1 && (a = a / 10 | 0), s = r < 4 && a == 99999 || r > 3 && a == 49999 || a == 5e4 || a == 0) : s = (r < 4 && a + 1 == o || r > 3 && a + 1 == o / 2) && (e[i + 1] / o / 100 | 0) == $(10, t - 2) - 1 || (a == o / 2 || a == 0) && (e[i + 1] / o / 100 | 0) == 0 : t < 4 ? (t == 0 ? a = a / 1e3 | 0 : t == 1 ? a = a / 100 | 0 : t == 2 && (a = a / 10 | 0), s = (n || r < 4) && a == 9999 || !n && r > 3 && a == 4999) : s = ((n || r < 4) && a + 1 == o || !n && r > 3 && a + 1 == o / 2) && (e[i + 1] / o / 1e3 | 0) == $(10, t - 3) - 1, s; - } - function Tr(e, t, r) { - for (var n, i = [0], o, s = 0, a = e.length; s < a; ) { - for (o = i.length; o--; ) - i[o] *= t; - for (i[0] += Un.indexOf(e.charAt(s++)), n = 0; n < i.length; n++) - i[n] > r - 1 && (i[n + 1] === void 0 && (i[n + 1] = 0), i[n + 1] += i[n] / r | 0, i[n] %= r); - } - return i.reverse(); - } - function Mu(e, t) { - var r, n, i; - if (t.isZero()) - return t; - n = t.d.length, n < 32 ? (r = Math.ceil(n / 3), i = (1 / Rr(4, r)).toString()) : (r = 16, i = "2.3283064365386962890625e-10"), e.precision += r, t = ct(e, 1, t.times(i), new e(1)); - for (var o = r; o--; ) { - var s = t.times(t); - t = s.times(s).minus(s).times(8).plus(1); - } - return e.precision -= r, t; - } - var F = function() { - function e(n, i, o) { - var s, a = 0, l = n.length; - for (n = n.slice(); l--; ) - s = n[l] * i + a, n[l] = s % o | 0, a = s / o | 0; - return a && n.unshift(a), n; - } - function t(n, i, o, s) { - var a, l; - if (o != s) - l = o > s ? 1 : -1; - else - for (a = l = 0; a < o; a++) - if (n[a] != i[a]) { - l = n[a] > i[a] ? 1 : -1; - break; - } - return l; - } - function r(n, i, o, s) { - for (var a = 0; o--; ) - n[o] -= a, a = n[o] < i[o] ? 1 : 0, n[o] = a * s + n[o] - i[o]; - for (; !n[0] && n.length > 1; ) - n.shift(); - } - return function(n, i, o, s, a, l) { - var u, c, p, d, g, y, f, b, E, v, x, M, le, K, Ke, I, J, ve, G, He, Jt = n.constructor, zr = n.s == i.s ? 1 : -1, W = n.d, R = i.d; - if (!W || !W[0] || !R || !R[0]) - return new Jt(!n.s || !i.s || (W ? R && W[0] == R[0] : !R) ? NaN : W && W[0] == 0 || !R ? zr * 0 : zr / 0); - for (l ? (g = 1, c = n.e - i.e) : (l = me, g = w, c = Y(n.e / g) - Y(i.e / g)), G = R.length, J = W.length, E = new Jt(zr), v = E.d = [], p = 0; R[p] == (W[p] || 0); p++) - ; - if (R[p] > (W[p] || 0) && c--, o == null ? (K = o = Jt.precision, s = Jt.rounding) : a ? K = o + (n.e - i.e) + 1 : K = o, K < 0) - v.push(1), y = true; - else { - if (K = K / g + 2 | 0, p = 0, G == 1) { - for (d = 0, R = R[0], K++; (p < J || d) && K--; p++) - Ke = d * l + (W[p] || 0), v[p] = Ke / R | 0, d = Ke % R | 0; - y = d || p < J; - } else { - for (d = l / (R[0] + 1) | 0, d > 1 && (R = e(R, d, l), W = e(W, d, l), G = R.length, J = W.length), I = G, x = W.slice(0, G), M = x.length; M < G; ) - x[M++] = 0; - He = R.slice(), He.unshift(0), ve = R[0], R[1] >= l / 2 && ++ve; - do - d = 0, u = t(R, x, G, M), u < 0 ? (le = x[0], G != M && (le = le * l + (x[1] || 0)), d = le / ve | 0, d > 1 ? (d >= l && (d = l - 1), f = e(R, d, l), b = f.length, M = x.length, u = t(f, x, b, M), u == 1 && (d--, r(f, G < b ? He : R, b, l))) : (d == 0 && (u = d = 1), f = R.slice()), b = f.length, b < M && f.unshift(0), r(x, f, M, l), u == -1 && (M = x.length, u = t(R, x, G, M), u < 1 && (d++, r(x, G < M ? He : R, M, l))), M = x.length) : u === 0 && (d++, x = [0]), v[p++] = d, u && x[0] ? x[M++] = W[I] || 0 : (x = [W[I]], M = 1); - while ((I++ < J || x[0] !== void 0) && K--); - y = x[0] !== void 0; - } - v[0] || v.shift(); - } - if (g == 1) - E.e = c, Xo = y; - else { - for (p = 1, d = v[0]; d >= 10; d /= 10) - p++; - E.e = p + c * g - 1, h(E, a ? o + E.e + 1 : o, s, y); - } - return E; - }; - }(); - function h(e, t, r, n) { - var i, o, s, a, l, u, c, p, d, g = e.constructor; - e: - if (t != null) { - if (p = e.d, !p) - return e; - for (i = 1, a = p[0]; a >= 10; a /= 10) - i++; - if (o = t - i, o < 0) - o += w, s = t, c = p[d = 0], l = c / $(10, i - s - 1) % 10 | 0; - else if (d = Math.ceil((o + 1) / w), a = p.length, d >= a) - if (n) { - for (; a++ <= d; ) - p.push(0); - c = l = 0, i = 1, o %= w, s = o - w + 1; - } else - break e; - else { - for (c = a = p[d], i = 1; a >= 10; a /= 10) - i++; - o %= w, s = o - w + i, l = s < 0 ? 0 : c / $(10, i - s - 1) % 10 | 0; - } - if (n = n || t < 0 || p[d + 1] !== void 0 || (s < 0 ? c : c % $(10, i - s - 1)), u = r < 4 ? (l || n) && (r == 0 || r == (e.s < 0 ? 3 : 2)) : l > 5 || l == 5 && (r == 4 || n || r == 6 && (o > 0 ? s > 0 ? c / $(10, i - s) : 0 : p[d - 1]) % 10 & 1 || r == (e.s < 0 ? 8 : 7)), t < 1 || !p[0]) - return p.length = 0, u ? (t -= e.e + 1, p[0] = $(10, (w - t % w) % w), e.e = -t || 0) : p[0] = e.e = 0, e; - if (o == 0 ? (p.length = d, a = 1, d--) : (p.length = d + 1, a = $(10, w - o), p[d] = s > 0 ? (c / $(10, i - s) % $(10, s) | 0) * a : 0), u) - for (; ; ) - if (d == 0) { - for (o = 1, s = p[0]; s >= 10; s /= 10) - o++; - for (s = p[0] += a, a = 1; s >= 10; s /= 10) - a++; - o != a && (e.e++, p[0] == me && (p[0] = 1)); - break; - } else { - if (p[d] += a, p[d] != me) - break; - p[d--] = 0, a = 1; - } - for (o = p.length; p[--o] === 0; ) - p.pop(); - } - return P && (e.e > g.maxE ? (e.d = null, e.e = NaN) : e.e < g.minE && (e.e = 0, e.d = [0])), e; - } - function be(e, t, r) { - if (!e.isFinite()) - return as(e); - var n, i = e.e, o = Q(e.d), s = o.length; - return t ? (r && (n = r - s) > 0 ? o = o.charAt(0) + "." + o.slice(1) + Ie(n) : s > 1 && (o = o.charAt(0) + "." + o.slice(1)), o = o + (e.e < 0 ? "e" : "e+") + e.e) : i < 0 ? (o = "0." + Ie(-i - 1) + o, r && (n = r - s) > 0 && (o += Ie(n))) : i >= s ? (o += Ie(i + 1 - s), r && (n = r - i - 1) > 0 && (o = o + "." + Ie(n))) : ((n = i + 1) < s && (o = o.slice(0, n) + "." + o.slice(n)), r && (n = r - s) > 0 && (i + 1 === s && (o += "."), o += Ie(n))), o; - } - function Sr(e, t) { - var r = e[0]; - for (t *= w; r >= 10; r /= 10) - t++; - return t; - } - function Mr(e, t, r) { - if (t > Cu) - throw P = true, r && (e.precision = r), Error(es); - return h(new e(vr), t, 1, true); - } - function de(e, t, r) { - if (t > Jn) - throw Error(es); - return h(new e(Cr), t, r, true); - } - function is(e) { - var t = e.length - 1, r = t * w + 1; - if (t = e[t], t) { - for (; t % 10 == 0; t /= 10) - r--; - for (t = e[0]; t >= 10; t /= 10) - r++; - } - return r; - } - function Ie(e) { - for (var t = ""; e--; ) - t += "0"; - return t; - } - function os(e, t, r, n) { - var i, o = new e(1), s = Math.ceil(n / w + 4); - for (P = false; ; ) { - if (r % 2 && (o = o.times(t), Yo(o.d, s) && (i = true)), r = Y(r / 2), r === 0) { - r = o.d.length - 1, i && o.d[r] === 0 && ++o.d[r]; - break; - } - t = t.times(t), Yo(t.d, s); - } - return P = true, o; - } - function zo(e) { - return e.d[e.d.length - 1] & 1; - } - function ss(e, t, r) { - for (var n, i = new e(t[0]), o = 0; ++o < t.length; ) - if (n = new e(t[o]), n.s) - i[r](n) && (i = n); - else { - i = n; - break; - } - return i; - } - function Gn(e, t) { - var r, n, i, o, s, a, l, u = 0, c = 0, p = 0, d = e.constructor, g = d.rounding, y = d.precision; - if (!e.d || !e.d[0] || e.e > 17) - return new d(e.d ? e.d[0] ? e.s < 0 ? 0 : 1 / 0 : 1 : e.s ? e.s < 0 ? 0 : e : 0 / 0); - for (t == null ? (P = false, l = y) : l = t, a = new d(0.03125); e.e > -2; ) - e = e.times(a), p += 5; - for (n = Math.log($(2, p)) / Math.LN10 * 2 + 5 | 0, l += n, r = o = s = new d(1), d.precision = l; ; ) { - if (o = h(o.times(e), l, 1), r = r.times(++c), a = s.plus(F(o, r, l, 1)), Q(a.d).slice(0, l) === Q(s.d).slice(0, l)) { - for (i = p; i--; ) - s = h(s.times(s), l, 1); - if (t == null) - if (u < 3 && $t(s.d, l - n, g, u)) - d.precision = l += 10, r = o = a = new d(1), c = 0, u++; - else - return h(s, d.precision = y, g, P = true); - else - return d.precision = y, s; - } - s = a; - } - } - function Ne(e, t) { - var r, n, i, o, s, a, l, u, c, p, d, g = 1, y = 10, f = e, b = f.d, E = f.constructor, v = E.rounding, x = E.precision; - if (f.s < 0 || !b || !b[0] || !f.e && b[0] == 1 && b.length == 1) - return new E(b && !b[0] ? -1 / 0 : f.s != 1 ? NaN : b ? 0 : f); - if (t == null ? (P = false, c = x) : c = t, E.precision = c += y, r = Q(b), n = r.charAt(0), Math.abs(o = f.e) < 15e14) { - for (; n < 7 && n != 1 || n == 1 && r.charAt(1) > 3; ) - f = f.times(e), r = Q(f.d), n = r.charAt(0), g++; - o = f.e, n > 1 ? (f = new E("0." + r), o++) : f = new E(n + "." + r.slice(1)); - } else - return u = Mr(E, c + 2, x).times(o + ""), f = Ne(new E(n + "." + r.slice(1)), c - y).plus(u), E.precision = x, t == null ? h(f, x, v, P = true) : f; - for (p = f, l = s = f = F(f.minus(1), f.plus(1), c, 1), d = h(f.times(f), c, 1), i = 3; ; ) { - if (s = h(s.times(d), c, 1), u = l.plus(F(s, new E(i), c, 1)), Q(u.d).slice(0, c) === Q(l.d).slice(0, c)) - if (l = l.times(2), o !== 0 && (l = l.plus(Mr(E, c + 2, x).times(o + ""))), l = F(l, new E(g), c, 1), t == null) - if ($t(l.d, c - y, v, a)) - E.precision = c += y, u = s = f = F(p.minus(1), p.plus(1), c, 1), d = h(f.times(f), c, 1), i = a = 1; - else - return h(l, E.precision = x, v, P = true); - else - return E.precision = x, l; - l = u, i += 2; - } - } - function as(e) { - return String(e.s * e.s / 0); - } - function Wn(e, t) { - var r, n, i; - for ((r = t.indexOf(".")) > -1 && (t = t.replace(".", "")), (n = t.search(/e/i)) > 0 ? (r < 0 && (r = n), r += +t.slice(n + 1), t = t.substring(0, n)) : r < 0 && (r = t.length), n = 0; t.charCodeAt(n) === 48; n++) - ; - for (i = t.length; t.charCodeAt(i - 1) === 48; --i) - ; - if (t = t.slice(n, i), t) { - if (i -= n, e.e = r = r - n - 1, e.d = [], n = (r + 1) % w, r < 0 && (n += w), n < i) { - for (n && e.d.push(+t.slice(0, n)), i -= w; n < i; ) - e.d.push(+t.slice(n, n += w)); - t = t.slice(n), n = w - t.length; - } else - n -= i; - for (; n--; ) - t += "0"; - e.d.push(+t), P && (e.e > e.constructor.maxE ? (e.d = null, e.e = NaN) : e.e < e.constructor.minE && (e.e = 0, e.d = [0])); - } else - e.e = 0, e.d = [0]; - return e; - } - function Au(e, t) { - var r, n, i, o, s, a, l, u, c; - if (t.indexOf("_") > -1) { - if (t = t.replace(/(\d)_(?=\d)/g, "$1"), ns.test(t)) - return Wn(e, t); - } else if (t === "Infinity" || t === "NaN") - return +t || (e.s = NaN), e.e = NaN, e.d = null, e; - if (Eu.test(t)) - r = 16, t = t.toLowerCase(); - else if (Pu.test(t)) - r = 2; - else if (Tu.test(t)) - r = 8; - else - throw Error(Le + t); - for (o = t.search(/p/i), o > 0 ? (l = +t.slice(o + 1), t = t.substring(2, o)) : t = t.slice(2), o = t.indexOf("."), s = o >= 0, n = e.constructor, s && (t = t.replace(".", ""), a = t.length, o = a - o, i = os(n, new n(r), o, o * 2)), u = Tr(t, r, me), c = u.length - 1, o = c; u[o] === 0; --o) - u.pop(); - return o < 0 ? new n(e.s * 0) : (e.e = Sr(u, c), e.d = u, P = false, s && (e = F(e, i, a * 4)), l && (e = e.times(Math.abs(l) < 54 ? $(2, l) : We.pow(2, l))), P = true, e); - } - function Su(e, t) { - var r, n = t.d.length; - if (n < 3) - return t.isZero() ? t : ct(e, 2, t, t); - r = 1.4 * Math.sqrt(n), r = r > 16 ? 16 : r | 0, t = t.times(1 / Rr(5, r)), t = ct(e, 2, t, t); - for (var i, o = new e(5), s = new e(16), a = new e(20); r--; ) - i = t.times(t), t = t.times(o.plus(i.times(s.times(i).minus(a)))); - return t; - } - function ct(e, t, r, n, i) { - var o, s, a, l, u = 1, c = e.precision, p = Math.ceil(c / w); - for (P = false, l = r.times(r), a = new e(n); ; ) { - if (s = F(a.times(l), new e(t++ * t++), c, 1), a = i ? n.plus(s) : n.minus(s), n = F(s.times(l), new e(t++ * t++), c, 1), s = a.plus(n), s.d[p] !== void 0) { - for (o = p; s.d[o] === a.d[o] && o--; ) - ; - if (o == -1) - break; - } - o = a, a = n, n = s, s = o, u++; - } - return P = true, s.d.length = p + 1, s; - } - function Rr(e, t) { - for (var r = e; --t; ) - r *= e; - return r; - } - function ls(e, t) { - var r, n = t.s < 0, i = de(e, e.precision, 1), o = i.times(0.5); - if (t = t.abs(), t.lte(o)) - return Se = n ? 4 : 1, t; - if (r = t.divToInt(i), r.isZero()) - Se = n ? 3 : 2; - else { - if (t = t.minus(r.times(i)), t.lte(o)) - return Se = zo(r) ? n ? 2 : 3 : n ? 4 : 1, t; - Se = zo(r) ? n ? 1 : 4 : n ? 3 : 2; - } - return t.minus(i).abs(); - } - function Hn(e, t, r, n) { - var i, o, s, a, l, u, c, p, d, g = e.constructor, y = r !== void 0; - if (y ? (oe(r, 1, $e), n === void 0 ? n = g.rounding : oe(n, 0, 8)) : (r = g.precision, n = g.rounding), !e.isFinite()) - c = as(e); - else { - for (c = be(e), s = c.indexOf("."), y ? (i = 2, t == 16 ? r = r * 4 - 3 : t == 8 && (r = r * 3 - 2)) : i = t, s >= 0 && (c = c.replace(".", ""), d = new g(1), d.e = c.length - s, d.d = Tr(be(d), 10, i), d.e = d.d.length), p = Tr(c, 10, i), o = l = p.length; p[--l] == 0; ) - p.pop(); - if (!p[0]) - c = y ? "0p+0" : "0"; - else { - if (s < 0 ? o-- : (e = new g(e), e.d = p, e.e = o, e = F(e, d, r, n, 0, i), p = e.d, o = e.e, u = Xo), s = p[r], a = i / 2, u = u || p[r + 1] !== void 0, u = n < 4 ? (s !== void 0 || u) && (n === 0 || n === (e.s < 0 ? 3 : 2)) : s > a || s === a && (n === 4 || u || n === 6 && p[r - 1] & 1 || n === (e.s < 0 ? 8 : 7)), p.length = r, u) - for (; ++p[--r] > i - 1; ) - p[r] = 0, r || (++o, p.unshift(1)); - for (l = p.length; !p[l - 1]; --l) - ; - for (s = 0, c = ""; s < l; s++) - c += Un.charAt(p[s]); - if (y) { - if (l > 1) - if (t == 16 || t == 8) { - for (s = t == 16 ? 4 : 3, --l; l % s; l++) - c += "0"; - for (p = Tr(c, i, t), l = p.length; !p[l - 1]; --l) - ; - for (s = 1, c = "1."; s < l; s++) - c += Un.charAt(p[s]); - } else - c = c.charAt(0) + "." + c.slice(1); - c = c + (o < 0 ? "p" : "p+") + o; - } else if (o < 0) { - for (; ++o; ) - c = "0" + c; - c = "0." + c; - } else if (++o > l) - for (o -= l; o--; ) - c += "0"; - else - o < l && (c = c.slice(0, o) + "." + c.slice(o)); - } - c = (t == 16 ? "0x" : t == 2 ? "0b" : t == 8 ? "0o" : "") + c; - } - return e.s < 0 ? "-" + c : c; - } - function Yo(e, t) { - if (e.length > t) - return e.length = t, true; - } - function Ru(e) { - return new this(e).abs(); - } - function Fu(e) { - return new this(e).acos(); - } - function Ou(e) { - return new this(e).acosh(); - } - function ku(e, t) { - return new this(e).plus(t); - } - function Du(e) { - return new this(e).asin(); - } - function _u(e) { - return new this(e).asinh(); - } - function Iu(e) { - return new this(e).atan(); - } - function Nu(e) { - return new this(e).atanh(); - } - function Lu(e, t) { - e = new this(e), t = new this(t); - var r, n = this.precision, i = this.rounding, o = n + 4; - return !e.s || !t.s ? r = new this(NaN) : !e.d && !t.d ? (r = de(this, o, 1).times(t.s > 0 ? 0.25 : 0.75), r.s = e.s) : !t.d || e.isZero() ? (r = t.s < 0 ? de(this, n, i) : new this(0), r.s = e.s) : !e.d || t.isZero() ? (r = de(this, o, 1).times(0.5), r.s = e.s) : t.s < 0 ? (this.precision = o, this.rounding = 1, r = this.atan(F(e, t, o, 1)), t = de(this, o, 1), this.precision = n, this.rounding = i, r = e.s < 0 ? r.minus(t) : r.plus(t)) : r = this.atan(F(e, t, o, 1)), r; - } - function $u(e) { - return new this(e).cbrt(); - } - function qu(e) { - return h(e = new this(e), e.e + 1, 2); - } - function ju(e, t, r) { - return new this(e).clamp(t, r); - } - function Bu(e) { - if (!e || typeof e != "object") - throw Error(Ar + "Object expected"); - var t, r, n, i = e.defaults === true, o = ["precision", 1, $e, "rounding", 0, 8, "toExpNeg", -ut, 0, "toExpPos", 0, ut, "maxE", 0, ut, "minE", -ut, 0, "modulo", 0, 9]; - for (t = 0; t < o.length; t += 3) - if (r = o[t], i && (this[r] = Qn[r]), (n = e[r]) !== void 0) - if (Y(n) === n && n >= o[t + 1] && n <= o[t + 2]) - this[r] = n; - else - throw Error(Le + r + ": " + n); - if (r = "crypto", i && (this[r] = Qn[r]), (n = e[r]) !== void 0) - if (n === true || n === false || n === 0 || n === 1) - if (n) - if (typeof crypto < "u" && crypto && (crypto.getRandomValues || crypto.randomBytes)) - this[r] = true; - else - throw Error(ts); - else - this[r] = false; - else - throw Error(Le + r + ": " + n); - return this; - } - function Ku(e) { - return new this(e).cos(); - } - function Vu(e) { - return new this(e).cosh(); - } - function us(e) { - var t, r, n; - function i(o) { - var s, a, l, u = this; - if (!(u instanceof i)) - return new i(o); - if (u.constructor = i, Zo(o)) { - u.s = o.s, P ? !o.d || o.e > i.maxE ? (u.e = NaN, u.d = null) : o.e < i.minE ? (u.e = 0, u.d = [0]) : (u.e = o.e, u.d = o.d.slice()) : (u.e = o.e, u.d = o.d ? o.d.slice() : o.d); - return; - } - if (l = typeof o, l === "number") { - if (o === 0) { - u.s = 1 / o < 0 ? -1 : 1, u.e = 0, u.d = [0]; - return; - } - if (o < 0 ? (o = -o, u.s = -1) : u.s = 1, o === ~~o && o < 1e7) { - for (s = 0, a = o; a >= 10; a /= 10) - s++; - P ? s > i.maxE ? (u.e = NaN, u.d = null) : s < i.minE ? (u.e = 0, u.d = [0]) : (u.e = s, u.d = [o]) : (u.e = s, u.d = [o]); - return; - } else if (o * 0 !== 0) { - o || (u.s = NaN), u.e = NaN, u.d = null; - return; - } - return Wn(u, o.toString()); - } else if (l !== "string") - throw Error(Le + o); - return (a = o.charCodeAt(0)) === 45 ? (o = o.slice(1), u.s = -1) : (a === 43 && (o = o.slice(1)), u.s = 1), ns.test(o) ? Wn(u, o) : Au(u, o); - } - if (i.prototype = m, i.ROUND_UP = 0, i.ROUND_DOWN = 1, i.ROUND_CEIL = 2, i.ROUND_FLOOR = 3, i.ROUND_HALF_UP = 4, i.ROUND_HALF_DOWN = 5, i.ROUND_HALF_EVEN = 6, i.ROUND_HALF_CEIL = 7, i.ROUND_HALF_FLOOR = 8, i.EUCLID = 9, i.config = i.set = Bu, i.clone = us, i.isDecimal = Zo, i.abs = Ru, i.acos = Fu, i.acosh = Ou, i.add = ku, i.asin = Du, i.asinh = _u, i.atan = Iu, i.atanh = Nu, i.atan2 = Lu, i.cbrt = $u, i.ceil = qu, i.clamp = ju, i.cos = Ku, i.cosh = Vu, i.div = Uu, i.exp = Qu, i.floor = Ju, i.hypot = Gu, i.ln = Wu, i.log = Hu, i.log10 = Yu, i.log2 = zu, i.max = Zu, i.min = Xu, i.mod = ec, i.mul = tc, i.pow = rc, i.random = nc, i.round = ic, i.sign = oc, i.sin = sc, i.sinh = ac, i.sqrt = lc, i.sub = uc, i.sum = cc, i.tan = pc, i.tanh = dc, i.trunc = mc, e === void 0 && (e = {}), e && e.defaults !== true) - for (n = ["precision", "rounding", "toExpNeg", "toExpPos", "maxE", "minE", "modulo", "crypto"], t = 0; t < n.length; ) - e.hasOwnProperty(r = n[t++]) || (e[r] = this[r]); - return i.config(e), i; - } - function Uu(e, t) { - return new this(e).div(t); - } - function Qu(e) { - return new this(e).exp(); - } - function Ju(e) { - return h(e = new this(e), e.e + 1, 3); - } - function Gu() { - var e, t, r = new this(0); - for (P = false, e = 0; e < arguments.length; ) - if (t = new this(arguments[e++]), t.d) - r.d && (r = r.plus(t.times(t))); - else { - if (t.s) - return P = true, new this(1 / 0); - r = t; - } - return P = true, r.sqrt(); - } - function Zo(e) { - return e instanceof We || e && e.toStringTag === rs || false; - } - function Wu(e) { - return new this(e).ln(); - } - function Hu(e, t) { - return new this(e).log(t); - } - function zu(e) { - return new this(e).log(2); - } - function Yu(e) { - return new this(e).log(10); - } - function Zu() { - return ss(this, arguments, "lt"); - } - function Xu() { - return ss(this, arguments, "gt"); - } - function ec(e, t) { - return new this(e).mod(t); - } - function tc(e, t) { - return new this(e).mul(t); - } - function rc(e, t) { - return new this(e).pow(t); - } - function nc(e) { - var t, r, n, i, o = 0, s = new this(1), a = []; - if (e === void 0 ? e = this.precision : oe(e, 1, $e), n = Math.ceil(e / w), this.crypto) - if (crypto.getRandomValues) - for (t = crypto.getRandomValues(new Uint32Array(n)); o < n; ) - i = t[o], i >= 429e7 ? t[o] = crypto.getRandomValues(new Uint32Array(1))[0] : a[o++] = i % 1e7; - else if (crypto.randomBytes) { - for (t = crypto.randomBytes(n *= 4); o < n; ) - i = t[o] + (t[o + 1] << 8) + (t[o + 2] << 16) + ((t[o + 3] & 127) << 24), i >= 214e7 ? crypto.randomBytes(4).copy(t, o) : (a.push(i % 1e7), o += 4); - o = n / 4; - } else - throw Error(ts); - else - for (; o < n; ) - a[o++] = Math.random() * 1e7 | 0; - for (n = a[--o], e %= w, n && e && (i = $(10, w - e), a[o] = (n / i | 0) * i); a[o] === 0; o--) - a.pop(); - if (o < 0) - r = 0, a = [0]; - else { - for (r = -1; a[0] === 0; r -= w) - a.shift(); - for (n = 1, i = a[0]; i >= 10; i /= 10) - n++; - n < w && (r -= w - n); - } - return s.e = r, s.d = a, s; - } - function ic(e) { - return h(e = new this(e), e.e + 1, this.rounding); - } - function oc(e) { - return e = new this(e), e.d ? e.d[0] ? e.s : 0 * e.s : e.s || NaN; - } - function sc(e) { - return new this(e).sin(); - } - function ac(e) { - return new this(e).sinh(); - } - function lc(e) { - return new this(e).sqrt(); - } - function uc(e, t) { - return new this(e).sub(t); - } - function cc() { - var e = 0, t = arguments, r = new this(t[e]); - for (P = false; r.s && ++e < t.length; ) - r = r.plus(t[e]); - return P = true, h(r, this.precision, this.rounding); - } - function pc(e) { - return new this(e).tan(); - } - function dc(e) { - return new this(e).tanh(); - } - function mc(e) { - return h(e = new this(e), e.e + 1, 1); - } - m[Symbol.for("nodejs.util.inspect.custom")] = m.toString; - m[Symbol.toStringTag] = "Decimal"; - var We = m.constructor = us(Qn); - vr = new We(vr); - Cr = new We(Cr); - var we = We; - function pt(e) { - return We.isDecimal(e) ? true : e !== null && typeof e == "object" && typeof e.s == "number" && typeof e.e == "number" && typeof e.toFixed == "function" && Array.isArray(e.d); - } - var qt = class { - constructor(t, r, n, i, o) { - this.modelName = t, this.name = r, this.typeName = n, this.isList = i, this.isEnum = o; - } - _toGraphQLInputType() { - let t = this.isList ? "List" : "", r = this.isEnum ? "Enum" : ""; - return `${t}${r}${this.typeName}FieldRefInput<${this.modelName}>`; - } - }; - function dt(e) { - return e instanceof qt; - } - var Fr = (e) => e; - var Or = { bold: Fr, red: Fr, green: Fr, dim: Fr }; - var cs = { bold: ne, red: pe, green: Ue, dim: Oe }; - var mt = { write(e) { - e.writeLine(","); - } }; - var Pe = class { - constructor(t) { - this.contents = t; - this.isUnderlined = false; - this.color = (t2) => t2; - } - underline() { - return this.isUnderlined = true, this; - } - setColor(t) { - return this.color = t, this; - } - write(t) { - let r = t.getCurrentLineLength(); - t.write(this.color(this.contents)), this.isUnderlined && t.afterNextNewline(() => { - t.write(" ".repeat(r)).writeLine(this.color("~".repeat(this.contents.length))); - }); - } - }; - var qe = class { - constructor() { - this.hasError = false; - } - markAsError() { - return this.hasError = true, this; - } - }; - var kr = class extends qe { - constructor() { - super(...arguments); - this.items = []; - } - addItem(r) { - return this.items.push(r), this; - } - getPrintWidth() { - return this.items.length === 0 ? 2 : Math.max(...this.items.map((n) => n.getPrintWidth())) + 2; - } - write(r) { - if (this.items.length === 0) { - this.writeEmpty(r); - return; - } - this.writeWithItems(r); - } - writeEmpty(r) { - let n = new Pe("[]"); - this.hasError && n.setColor(r.context.colors.red).underline(), r.write(n); - } - writeWithItems(r) { - let { colors: n } = r.context; - r.writeLine("[").withIndent(() => r.writeJoined(mt, this.items).newLine()).write("]"), this.hasError && r.afterNextNewline(() => { - r.writeLine(n.red("~".repeat(this.getPrintWidth()))); - }); - } - }; - var ps = ": "; - var Dr = class { - constructor(t, r) { - this.name = t; - this.value = r; - this.hasError = false; - } - markAsError() { - this.hasError = true; - } - getPrintWidth() { - return this.name.length + this.value.getPrintWidth() + ps.length; - } - write(t) { - let r = new Pe(this.name); - this.hasError && r.underline().setColor(t.context.colors.red), t.write(r).write(ps).write(this.value); - } - }; - var D = class extends qe { - constructor() { - super(...arguments); - this.fields = {}; - this.suggestions = []; - } - addField(r) { - this.fields[r.name] = r; - } - addSuggestion(r) { - this.suggestions.push(r); - } - getField(r) { - return this.fields[r]; - } - getDeepField(r) { - let [n, ...i] = r, o = this.getField(n); - if (!o) - return; - let s = o; - for (let a of i) { - if (!(s.value instanceof D)) - return; - let l = s.value.getField(a); - if (!l) - return; - s = l; - } - return s; - } - getDeepFieldValue(r) { - return r.length === 0 ? this : this.getDeepField(r)?.value; - } - hasField(r) { - return Boolean(this.getField(r)); - } - removeAllFields() { - this.fields = {}; - } - removeField(r) { - delete this.fields[r]; - } - getFields() { - return this.fields; - } - isEmpty() { - return Object.keys(this.fields).length === 0; - } - getFieldValue(r) { - return this.getField(r)?.value; - } - getDeepSubSelectionValue(r) { - let n = this; - for (let i of r) { - if (!(n instanceof D)) - return; - let o = n.getSubSelectionValue(i); - if (!o) - return; - n = o; - } - return n; - } - getDeepSelectionParent(r) { - let n = this.getSelectionParent(); - if (!n) - return; - let i = n; - for (let o of r) { - let s = i.value.getFieldValue(o); - if (!s || !(s instanceof D)) - return; - let a = s.getSelectionParent(); - if (!a) - return; - i = a; - } - return i; - } - getSelectionParent() { - let r = this.getField("select"); - if (r?.value instanceof D) - return { kind: "select", value: r.value }; - let n = this.getField("include"); - if (n?.value instanceof D) - return { kind: "include", value: n.value }; - } - getSubSelectionValue(r) { - return this.getSelectionParent()?.value.fields[r].value; - } - getPrintWidth() { - let r = Object.values(this.fields); - return r.length == 0 ? 2 : Math.max(...r.map((i) => i.getPrintWidth())) + 2; - } - write(r) { - let n = Object.values(this.fields); - if (n.length === 0 && this.suggestions.length === 0) { - this.writeEmpty(r); - return; - } - this.writeWithContents(r, n); - } - writeEmpty(r) { - let n = new Pe("{}"); - this.hasError && n.setColor(r.context.colors.red).underline(), r.write(n); - } - writeWithContents(r, n) { - r.writeLine("{").withIndent(() => { - r.writeJoined(mt, [...n, ...this.suggestions]).newLine(); - }), r.write("}"), this.hasError && r.afterNextNewline(() => { - r.writeLine(r.context.colors.red("~".repeat(this.getPrintWidth()))); - }); - } - }; - var j = class extends qe { - constructor(r) { - super(); - this.text = r; - } - getPrintWidth() { - return this.text.length; - } - write(r) { - let n = new Pe(this.text); - this.hasError && n.underline().setColor(r.context.colors.red), r.write(n); - } - }; - var zn = class { - constructor(t) { - this.errorMessages = []; - this.arguments = t; - } - write(t) { - t.write(this.arguments); - } - addErrorMessage(t) { - this.errorMessages.push(t); - } - renderAllMessages(t) { - return this.errorMessages.map((r) => r(t)).join(` -`); - } - }; - function _r(e) { - return new zn(ds(e)); - } - function ds(e) { - let t = new D(); - for (let [r, n] of Object.entries(e)) { - let i = new Dr(r, ms(n)); - t.addField(i); - } - return t; - } - function ms(e) { - if (typeof e == "string") - return new j(JSON.stringify(e)); - if (typeof e == "number" || typeof e == "boolean") - return new j(String(e)); - if (typeof e == "bigint") - return new j(`${e}n`); - if (e === null) - return new j("null"); - if (e === void 0) - return new j("undefined"); - if (pt(e)) - return new j(`new Prisma.Decimal("${e.toFixed()}")`); - if (e instanceof Uint8Array) - return Buffer.isBuffer(e) ? new j(`Buffer.alloc(${e.byteLength})`) : new j(`new Uint8Array(${e.byteLength})`); - if (e instanceof Date) { - let t = Er(e) ? e.toISOString() : "Invalid Date"; - return new j(`new Date("${t}")`); - } - return e instanceof Ae ? new j(`Prisma.${e._getName()}`) : dt(e) ? new j(`prisma.${wi(e.modelName)}.$fields.${e.name}`) : Array.isArray(e) ? gc(e) : typeof e == "object" ? ds(e) : new j(Object.prototype.toString.call(e)); - } - function gc(e) { - let t = new kr(); - for (let r of e) - t.addItem(ms(r)); - return t; - } - function fs(e) { - if (e === void 0) - return ""; - let t = _r(e); - return new at(0, { colors: Or }).write(t).toString(); - } - var jt = ""; - function gs(e) { - var t = e.split(` -`); - return t.reduce(function(r, n) { - var i = xc(n) || wc(n) || Tc(n) || Ac(n) || Cc(n); - return i && r.push(i), r; - }, []); - } - var yc = /^\s*at (.*?) ?\(((?:file|https?|blob|chrome-extension|native|eval|webpack||\/|[a-z]:\\|\\\\).*?)(?::(\d+))?(?::(\d+))?\)?\s*$/i; - var hc = /\((\S*)(?::(\d+))(?::(\d+))\)/; - function xc(e) { - var t = yc.exec(e); - if (!t) - return null; - var r = t[2] && t[2].indexOf("native") === 0, n = t[2] && t[2].indexOf("eval") === 0, i = hc.exec(t[2]); - return n && i != null && (t[2] = i[1], t[3] = i[2], t[4] = i[3]), { file: r ? null : t[2], methodName: t[1] || jt, arguments: r ? [t[2]] : [], lineNumber: t[3] ? +t[3] : null, column: t[4] ? +t[4] : null }; - } - var bc = /^\s*at (?:((?:\[object object\])?.+) )?\(?((?:file|ms-appx|https?|webpack|blob):.*?):(\d+)(?::(\d+))?\)?\s*$/i; - function wc(e) { - var t = bc.exec(e); - return t ? { file: t[2], methodName: t[1] || jt, arguments: [], lineNumber: +t[3], column: t[4] ? +t[4] : null } : null; - } - var Pc = /^\s*(.*?)(?:\((.*?)\))?(?:^|@)((?:file|https?|blob|chrome|webpack|resource|\[native).*?|[^@]*bundle)(?::(\d+))?(?::(\d+))?\s*$/i; - var Ec = /(\S+) line (\d+)(?: > eval line \d+)* > eval/i; - function Tc(e) { - var t = Pc.exec(e); - if (!t) - return null; - var r = t[3] && t[3].indexOf(" > eval") > -1, n = Ec.exec(t[3]); - return r && n != null && (t[3] = n[1], t[4] = n[2], t[5] = null), { file: t[3], methodName: t[1] || jt, arguments: t[2] ? t[2].split(",") : [], lineNumber: t[4] ? +t[4] : null, column: t[5] ? +t[5] : null }; - } - var vc = /^\s*(?:([^@]*)(?:\((.*?)\))?@)?(\S.*?):(\d+)(?::(\d+))?\s*$/i; - function Cc(e) { - var t = vc.exec(e); - return t ? { file: t[3], methodName: t[1] || jt, arguments: [], lineNumber: +t[4], column: t[5] ? +t[5] : null } : null; - } - var Mc = /^\s*at (?:((?:\[object object\])?[^\\/]+(?: \[as \S+\])?) )?\(?(.*?):(\d+)(?::(\d+))?\)?\s*$/i; - function Ac(e) { - var t = Mc.exec(e); - return t ? { file: t[2], methodName: t[1] || jt, arguments: [], lineNumber: +t[3], column: t[4] ? +t[4] : null } : null; - } - var Yn = class { - getLocation() { - return null; - } - }; - var Zn = class { - constructor() { - this._error = new Error(); - } - getLocation() { - let t = this._error.stack; - if (!t) - return null; - let n = gs(t).find((i) => { - if (!i.file) - return false; - let o = Mn(i.file); - return o !== "" && !o.includes("@prisma") && !o.includes("/packages/client/src/runtime/") && !o.endsWith("/runtime/binary.js") && !o.endsWith("/runtime/library.js") && !o.endsWith("/runtime/data-proxy.js") && !o.endsWith("/runtime/edge.js") && !o.endsWith("/runtime/edge-esm.js") && !o.startsWith("internal/") && !i.methodName.includes("new ") && !i.methodName.includes("getCallSite") && !i.methodName.includes("Proxy.") && i.methodName.split(".").length < 4; - }); - return !n || !n.file ? null : { fileName: n.file, lineNumber: n.lineNumber, columnNumber: n.column }; - } - }; - function je(e) { - return e === "minimal" ? new Yn() : new Zn(); - } - var ys = { _avg: true, _count: true, _sum: true, _min: true, _max: true }; - function ft(e = {}) { - let t = Rc(e); - return Object.entries(t).reduce((n, [i, o]) => (ys[i] !== void 0 ? n.select[i] = { select: o } : n[i] = o, n), { select: {} }); - } - function Rc(e = {}) { - return typeof e._count == "boolean" ? { ...e, _count: { _all: e._count } } : e; - } - function Ir(e = {}) { - return (t) => (typeof e._count == "boolean" && (t._count = t._count._all), t); - } - function hs(e, t) { - let r = Ir(e); - return t({ action: "aggregate", unpacker: r, argsMapper: ft })(e); - } - function Fc(e = {}) { - let { select: t, ...r } = e; - return typeof t == "object" ? ft({ ...r, _count: t }) : ft({ ...r, _count: { _all: true } }); - } - function Oc(e = {}) { - return typeof e.select == "object" ? (t) => Ir(e)(t)._count : (t) => Ir(e)(t)._count._all; - } - function xs(e, t) { - return t({ action: "count", unpacker: Oc(e), argsMapper: Fc })(e); - } - function kc(e = {}) { - let t = ft(e); - if (Array.isArray(t.by)) - for (let r of t.by) - typeof r == "string" && (t.select[r] = true); - else - typeof t.by == "string" && (t.select[t.by] = true); - return t; - } - function Dc(e = {}) { - return (t) => (typeof e?._count == "boolean" && t.forEach((r) => { - r._count = r._count._all; - }), t); - } - function bs(e, t) { - return t({ action: "groupBy", unpacker: Dc(e), argsMapper: kc })(e); - } - function ws(e, t, r) { - if (t === "aggregate") - return (n) => hs(n, r); - if (t === "count") - return (n) => xs(n, r); - if (t === "groupBy") - return (n) => bs(n, r); - } - function Ps(e, t) { - let r = t.fields.filter((i) => !i.relationName), n = Dn(r, (i) => i.name); - return new Proxy({}, { get(i, o) { - if (o in i || typeof o == "symbol") - return i[o]; - let s = n[o]; - if (s) - return new qt(e, o, s.type, s.isList, s.kind === "enum"); - }, ...gr(Object.keys(n)) }); - } - var Es = (e) => Array.isArray(e) ? e : e.split("."); - var Xn = (e, t) => Es(t).reduce((r, n) => r && r[n], e); - var Ts = (e, t, r) => Es(t).reduceRight((n, i, o, s) => Object.assign({}, Xn(e, s.slice(0, o)), { [i]: n }), r); - function _c(e, t) { - return e === void 0 || t === void 0 ? [] : [...t, "select", e]; - } - function Ic(e, t, r) { - return t === void 0 ? e ?? {} : Ts(t, r, e || true); - } - function ei(e, t, r, n, i, o) { - let a = e._runtimeDataModel.models[t].fields.reduce((l, u) => ({ ...l, [u.name]: u }), {}); - return (l) => { - let u = je(e._errorFormat), c = _c(n, i), p = Ic(l, o, c), d = r({ dataPath: c, callsite: u })(p), g = Nc(e, t); - return new Proxy(d, { get(y, f) { - if (!g.includes(f)) - return y[f]; - let E = [a[f].type, r, f], v = [c, p]; - return ei(e, ...E, ...v); - }, ...gr([...g, ...Object.getOwnPropertyNames(d)]) }); - }; - } - function Nc(e, t) { - return e._runtimeDataModel.models[t].fields.filter((r) => r.kind === "object").map((r) => r.name); - } - var Rs = A(An()); - var Ss = A(require("fs")); - var vs = { keyword: ke, entity: ke, value: (e) => ne(Xe(e)), punctuation: Xe, directive: ke, function: ke, variable: (e) => ne(Xe(e)), string: (e) => ne(Ue(e)), boolean: ye, number: ke, comment: rr }; - var Lc = (e) => e; - var Nr = {}; - var $c = 0; - var T = { manual: Nr.Prism && Nr.Prism.manual, disableWorkerMessageHandler: Nr.Prism && Nr.Prism.disableWorkerMessageHandler, util: { encode: function(e) { - if (e instanceof fe) { - let t = e; - return new fe(t.type, T.util.encode(t.content), t.alias); - } else - return Array.isArray(e) ? e.map(T.util.encode) : e.replace(/&/g, "&").replace(/ e.length) - return; - if (ve instanceof fe) - continue; - if (le && I != t.length - 1) { - v.lastIndex = J; - var p = v.exec(e); - if (!p) - break; - var c = p.index + (M ? p[1].length : 0), d = p.index + p[0].length, a = I, l = J; - for (let R = t.length; a < R && (l < d || !t[a].type && !t[a - 1].greedy); ++a) - l += t[a].length, c >= l && (++I, J = l); - if (t[I] instanceof fe) - continue; - u = a - I, ve = e.slice(J, l), p.index -= J; - } else { - v.lastIndex = 0; - var p = v.exec(ve), u = 1; - } - if (!p) { - if (o) - break; - continue; - } - M && (K = p[1] ? p[1].length : 0); - var c = p.index + K, p = p[0].slice(K), d = c + p.length, g = ve.slice(0, c), y = ve.slice(d); - let G = [I, u]; - g && (++I, J += g.length, G.push(g)); - let He = new fe(f, x ? T.tokenize(p, x) : p, Ke, p, le); - if (G.push(He), y && G.push(y), Array.prototype.splice.apply(t, G), u != 1 && T.matchGrammar(e, t, r, I, J, true, f), o) - break; - } - } - } - }, tokenize: function(e, t) { - let r = [e], n = t.rest; - if (n) { - for (let i in n) - t[i] = n[i]; - delete t.rest; - } - return T.matchGrammar(e, r, t, 0, 0, false), r; - }, hooks: { all: {}, add: function(e, t) { - let r = T.hooks.all; - r[e] = r[e] || [], r[e].push(t); - }, run: function(e, t) { - let r = T.hooks.all[e]; - if (!(!r || !r.length)) - for (var n = 0, i; i = r[n++]; ) - i(t); - } }, Token: fe }; - T.languages.clike = { comment: [{ pattern: /(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/, lookbehind: true }, { pattern: /(^|[^\\:])\/\/.*/, lookbehind: true, greedy: true }], string: { pattern: /(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/, greedy: true }, "class-name": { pattern: /((?:\b(?:class|interface|extends|implements|trait|instanceof|new)\s+)|(?:catch\s+\())[\w.\\]+/i, lookbehind: true, inside: { punctuation: /[.\\]/ } }, keyword: /\b(?:if|else|while|do|for|return|in|instanceof|function|new|try|throw|catch|finally|null|break|continue)\b/, boolean: /\b(?:true|false)\b/, function: /\w+(?=\()/, number: /\b0x[\da-f]+\b|(?:\b\d+\.?\d*|\B\.\d+)(?:e[+-]?\d+)?/i, operator: /--?|\+\+?|!=?=?|<=?|>=?|==?=?|&&?|\|\|?|\?|\*|\/|~|\^|%/, punctuation: /[{}[\];(),.:]/ }; - T.languages.javascript = T.languages.extend("clike", { "class-name": [T.languages.clike["class-name"], { pattern: /(^|[^$\w\xA0-\uFFFF])[_$A-Z\xA0-\uFFFF][$\w\xA0-\uFFFF]*(?=\.(?:prototype|constructor))/, lookbehind: true }], keyword: [{ pattern: /((?:^|})\s*)(?:catch|finally)\b/, lookbehind: true }, { pattern: /(^|[^.])\b(?:as|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/, lookbehind: true }], number: /\b(?:(?:0[xX](?:[\dA-Fa-f](?:_[\dA-Fa-f])?)+|0[bB](?:[01](?:_[01])?)+|0[oO](?:[0-7](?:_[0-7])?)+)n?|(?:\d(?:_\d)?)+n|NaN|Infinity)\b|(?:\b(?:\d(?:_\d)?)+\.?(?:\d(?:_\d)?)*|\B\.(?:\d(?:_\d)?)+)(?:[Ee][+-]?(?:\d(?:_\d)?)+)?/, function: /[_$a-zA-Z\xA0-\uFFFF][$\w\xA0-\uFFFF]*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/, operator: /-[-=]?|\+[+=]?|!=?=?|<>?>?=?|=(?:==?|>)?|&[&=]?|\|[|=]?|\*\*?=?|\/=?|~|\^=?|%=?|\?|\.{3}/ }); - T.languages.javascript["class-name"][0].pattern = /(\b(?:class|interface|extends|implements|instanceof|new)\s+)[\w.\\]+/; - T.languages.insertBefore("javascript", "keyword", { regex: { pattern: /((?:^|[^$\w\xA0-\uFFFF."'\])\s])\s*)\/(\[(?:[^\]\\\r\n]|\\.)*]|\\.|[^/\\\[\r\n])+\/[gimyus]{0,6}(?=\s*($|[\r\n,.;})\]]))/, lookbehind: true, greedy: true }, "function-variable": { pattern: /[_$a-zA-Z\xA0-\uFFFF][$\w\xA0-\uFFFF]*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|[_$a-zA-Z\xA0-\uFFFF][$\w\xA0-\uFFFF]*)\s*=>))/, alias: "function" }, parameter: [{ pattern: /(function(?:\s+[_$A-Za-z\xA0-\uFFFF][$\w\xA0-\uFFFF]*)?\s*\(\s*)(?!\s)(?:[^()]|\([^()]*\))+?(?=\s*\))/, lookbehind: true, inside: T.languages.javascript }, { pattern: /[_$a-z\xA0-\uFFFF][$\w\xA0-\uFFFF]*(?=\s*=>)/i, inside: T.languages.javascript }, { pattern: /(\(\s*)(?!\s)(?:[^()]|\([^()]*\))+?(?=\s*\)\s*=>)/, lookbehind: true, inside: T.languages.javascript }, { pattern: /((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:[_$A-Za-z\xA0-\uFFFF][$\w\xA0-\uFFFF]*\s*)\(\s*)(?!\s)(?:[^()]|\([^()]*\))+?(?=\s*\)\s*\{)/, lookbehind: true, inside: T.languages.javascript }], constant: /\b[A-Z](?:[A-Z_]|\dx?)*\b/ }); - T.languages.markup && T.languages.markup.tag.addInlined("script", "javascript"); - T.languages.js = T.languages.javascript; - T.languages.typescript = T.languages.extend("javascript", { keyword: /\b(?:abstract|as|async|await|break|case|catch|class|const|constructor|continue|debugger|declare|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|is|keyof|let|module|namespace|new|null|of|package|private|protected|public|readonly|return|require|set|static|super|switch|this|throw|try|type|typeof|var|void|while|with|yield)\b/, builtin: /\b(?:string|Function|any|number|boolean|Array|symbol|console|Promise|unknown|never)\b/ }); - T.languages.ts = T.languages.typescript; - function fe(e, t, r, n, i) { - this.type = e, this.content = t, this.alias = r, this.length = (n || "").length | 0, this.greedy = !!i; - } - fe.stringify = function(e, t) { - return typeof e == "string" ? e : Array.isArray(e) ? e.map(function(r) { - return fe.stringify(r, t); - }).join("") : qc(e.type)(e.content); - }; - function qc(e) { - return vs[e] || Lc; - } - function Cs(e) { - return jc(e, T.languages.javascript); - } - function jc(e, t) { - return T.tokenize(e, t).map((n) => fe.stringify(n)).join(""); - } - var Ms = A(mo()); - function As(e) { - return (0, Ms.default)(e); - } - var ge = class { - static read(t) { - let r; - try { - r = Ss.default.readFileSync(t, "utf-8"); - } catch { - return null; - } - return ge.fromContent(r); - } - static fromContent(t) { - let r = t.split(/\r?\n/); - return new ge(1, r); - } - constructor(t, r) { - this.firstLineNumber = t, this.lines = r; - } - get lastLineNumber() { - return this.firstLineNumber + this.lines.length - 1; - } - mapLineAt(t, r) { - if (t < this.firstLineNumber || t > this.lines.length + this.firstLineNumber) - return this; - let n = t - this.firstLineNumber, i = [...this.lines]; - return i[n] = r(i[n]), new ge(this.firstLineNumber, i); - } - mapLines(t) { - return new ge(this.firstLineNumber, this.lines.map((r, n) => t(r, this.firstLineNumber + n))); - } - lineAt(t) { - return this.lines[t - this.firstLineNumber]; - } - prependSymbolAt(t, r) { - return this.mapLines((n, i) => i === t ? `${r} ${n}` : ` ${n}`); - } - slice(t, r) { - let n = this.lines.slice(t - 1, r).join(` -`); - return new ge(t, As(n).split(` -`)); - } - highlight() { - let t = Cs(this.toString()); - return new ge(this.firstLineNumber, t.split(` -`)); - } - toString() { - return this.lines.join(` -`); - } - }; - var Bc = { red: pe, gray: rr, dim: Oe, bold: ne, underline: X, highlightSource: (e) => e.highlight() }; - var Kc = { red: (e) => e, gray: (e) => e, dim: (e) => e, bold: (e) => e, underline: (e) => e, highlightSource: (e) => e }; - function Vc({ callsite: e, message: t, originalMethod: r, isPanic: n, callArguments: i }, o) { - let s = { functionName: `prisma.${r}()`, message: t, isPanic: n ?? false, callArguments: i }; - if (!e || typeof window < "u" || process.env.NODE_ENV === "production") - return s; - let a = e.getLocation(); - if (!a || !a.lineNumber || !a.columnNumber) - return s; - let l = Math.max(1, a.lineNumber - 3), u = ge.read(a.fileName)?.slice(l, a.lineNumber), c = u?.lineAt(a.lineNumber); - if (u && c) { - let p = Qc(c), d = Uc(c); - if (!d) - return s; - s.functionName = `${d.code})`, s.location = a, n || (u = u.mapLineAt(a.lineNumber, (y) => y.slice(0, d.openingBraceIndex))), u = o.highlightSource(u); - let g = String(u.lastLineNumber).length; - if (s.contextLines = u.mapLines((y, f) => o.gray(String(f).padStart(g)) + " " + y).mapLines((y) => o.dim(y)).prependSymbolAt(a.lineNumber, o.bold(o.red("\u2192"))), i) { - let y = p + g + 1; - y += 2, s.callArguments = (0, Rs.default)(i, y).slice(y); - } - } - return s; - } - function Uc(e) { - let t = Object.keys(ue.ModelAction).join("|"), n = new RegExp(String.raw`\.(${t})\(`).exec(e); - if (n) { - let i = n.index + n[0].length, o = e.lastIndexOf(" ", n.index) + 1; - return { code: e.slice(o, i), openingBraceIndex: i }; - } - return null; - } - function Qc(e) { - let t = 0; - for (let r = 0; r < e.length; r++) { - if (e.charAt(r) !== " ") - return t; - t++; - } - return t; - } - function Jc({ functionName: e, location: t, message: r, isPanic: n, contextLines: i, callArguments: o }, s) { - let a = [""], l = t ? " in" : ":"; - if (n ? (a.push(s.red(`Oops, an unknown error occurred! This is ${s.bold("on us")}, you did nothing wrong.`)), a.push(s.red(`It occurred in the ${s.bold(`\`${e}\``)} invocation${l}`))) : a.push(s.red(`Invalid ${s.bold(`\`${e}\``)} invocation${l}`)), t && a.push(s.underline(Gc(t))), i) { - a.push(""); - let u = [i.toString()]; - o && (u.push(o), u.push(s.dim(")"))), a.push(u.join("")), o && a.push(""); - } else - a.push(""), o && a.push(o), a.push(""); - return a.push(r), a.join(` -`); - } - function Gc(e) { - let t = [e.fileName]; - return e.lineNumber && t.push(String(e.lineNumber)), e.columnNumber && t.push(String(e.columnNumber)), t.join(":"); - } - function gt(e) { - let t = e.showColors ? Bc : Kc, r = Vc(e, t); - return Jc(r, t); - } - function Fs(e, t, r, n) { - return e === ue.ModelAction.findFirstOrThrow || e === ue.ModelAction.findUniqueOrThrow ? Wc(t, r, n) : n; - } - function Wc(e, t, r) { - return async (n) => { - if ("rejectOnNotFound" in n.args) { - let o = gt({ originalMethod: n.clientMethod, callsite: n.callsite, message: "'rejectOnNotFound' option is not supported" }); - throw new te(o, { clientVersion: t }); - } - return await r(n).catch((o) => { - throw o instanceof H && o.code === "P2025" ? new Ce(`No ${e} found`, t) : o; - }); - }; - } - function Ee(e) { - return e.replace(/^./, (t) => t.toLowerCase()); - } - var Hc = ["findUnique", "findUniqueOrThrow", "findFirst", "findFirstOrThrow", "create", "update", "upsert", "delete"]; - var zc = ["aggregate", "count", "groupBy"]; - function ti(e, t) { - let r = e._extensions.getAllModelExtensions(t) ?? {}, n = [Yc(e, t), Xc(e, t), Ft(r), re("name", () => t), re("$name", () => t), re("$parent", () => e._appliedParent)]; - return xe({}, n); - } - function Yc(e, t) { - let r = Ee(t), n = Object.keys(ue.ModelAction).concat("count"); - return { getKeys() { - return n; - }, getPropertyValue(i) { - let o = i, s = (l) => e._request(l); - s = Fs(o, t, e._clientVersion, s); - let a = (l) => (u) => { - let c = je(e._errorFormat); - return e._createPrismaPromise((p) => { - let d = { args: u, dataPath: [], action: o, model: t, clientMethod: `${r}.${i}`, jsModelName: r, transaction: p, callsite: c }; - return s({ ...d, ...l }); - }); - }; - return Hc.includes(o) ? ei(e, t, a) : Zc(i) ? ws(e, i, a) : a({}); - } }; - } - function Zc(e) { - return zc.includes(e); - } - function Xc(e, t) { - return Ge(re("fields", () => { - let r = e._runtimeDataModel.models[t]; - return Ps(t, r); - })); - } - function Os(e) { - return e.replace(/^./, (t) => t.toUpperCase()); - } - var ri = Symbol(); - function Bt(e) { - let t = [ep(e), re(ri, () => e), re("$parent", () => e._appliedParent)], r = e._extensions.getAllClientExtensions(); - return r && t.push(Ft(r)), xe(e, t); - } - function ep(e) { - let t = Object.keys(e._runtimeDataModel.models), r = t.map(Ee), n = [...new Set(t.concat(r))]; - return Ge({ getKeys() { - return n; - }, getPropertyValue(i) { - let o = Os(i); - if (e._runtimeDataModel.models[o] !== void 0) - return ti(e, o); - if (e._runtimeDataModel.models[i] !== void 0) - return ti(e, i); - }, getPropertyDescriptor(i) { - if (!r.includes(i)) - return { enumerable: false }; - } }); - } - function Lr(e) { - return e[ri] ? e[ri] : e; - } - function ks(e) { - if (typeof e == "function") - return e(this); - let t = Lr(this), r = Object.create(t, { _extensions: { value: this._extensions.append(e) }, _appliedParent: { value: this, configurable: true }, $use: { value: void 0 }, $on: { value: void 0 } }); - return Bt(r); - } - function Ds({ result: e, modelName: t, select: r, extensions: n }) { - let i = n.getAllComputedFields(t); - if (!i) - return e; - let o = [], s = []; - for (let a of Object.values(i)) { - if (r) { - if (!r[a.name]) - continue; - let l = a.needs.filter((u) => !r[u]); - l.length > 0 && s.push(Ot(l)); - } - tp(e, a.needs) && o.push(rp(a, xe(e, o))); - } - return o.length > 0 || s.length > 0 ? xe(e, [...o, ...s]) : e; - } - function tp(e, t) { - return t.every((r) => kn(e, r)); - } - function rp(e, t) { - return Ge(re(e.name, () => e.compute(t))); - } - function $r({ visitor: e, result: t, args: r, runtimeDataModel: n, modelName: i }) { - if (Array.isArray(t)) { - for (let s = 0; s < t.length; s++) - t[s] = $r({ result: t[s], args: r, modelName: i, runtimeDataModel: n, visitor: e }); - return t; - } - let o = e(t, i, r) ?? t; - return r.include && _s({ includeOrSelect: r.include, result: o, parentModelName: i, runtimeDataModel: n, visitor: e }), r.select && _s({ includeOrSelect: r.select, result: o, parentModelName: i, runtimeDataModel: n, visitor: e }), o; - } - function _s({ includeOrSelect: e, result: t, parentModelName: r, runtimeDataModel: n, visitor: i }) { - for (let [o, s] of Object.entries(e)) { - if (!s || t[o] == null) - continue; - let l = n.models[r].fields.find((c) => c.name === o); - if (!l || l.kind !== "object" || !l.relationName) - continue; - let u = typeof s == "object" ? s : {}; - t[o] = $r({ visitor: i, result: t[o], args: u, modelName: l.type, runtimeDataModel: n }); - } - } - function Is({ result: e, modelName: t, args: r, extensions: n, runtimeDataModel: i }) { - return n.isEmpty() || e == null || !i.models[t] ? e : $r({ result: e, args: r ?? {}, modelName: t, runtimeDataModel: i, visitor: (s, a, l) => Ds({ result: s, modelName: Ee(a), select: l.select, extensions: n }) }); - } - function Ns(e) { - if (e instanceof U) - return np(e); - if (Array.isArray(e)) { - let r = [e[0]]; - for (let n = 1; n < e.length; n++) - r[n] = Kt(e[n]); - return r; - } - let t = {}; - for (let r in e) - t[r] = Kt(e[r]); - return t; - } - function np(e) { - return new U(e.strings, e.values); - } - function Kt(e) { - if (typeof e != "object" || e == null || e instanceof Ae || dt(e)) - return e; - if (pt(e)) - return new we(e.toFixed()); - if (lt(e)) - return /* @__PURE__ */ new Date(+e); - if (ArrayBuffer.isView(e)) - return e.slice(0); - if (Array.isArray(e)) { - let t = e.length, r; - for (r = Array(t); t--; ) - r[t] = Kt(e[t]); - return r; - } - if (typeof e == "object") { - let t = {}; - for (let r in e) - r === "__proto__" ? Object.defineProperty(t, r, { value: Kt(e[r]), configurable: true, enumerable: true, writable: true }) : t[r] = Kt(e[r]); - return t; - } - Je(e, "Unknown value"); - } - function $s(e, t, r, n = 0) { - return e._createPrismaPromise((i) => { - let o = t.customDataProxyFetch; - return "transaction" in t && i !== void 0 && (t.transaction?.kind === "batch" && t.transaction.lock.then(), t.transaction = i), n === r.length ? e._executeRequest(t) : r[n]({ model: t.model, operation: t.model ? t.action : t.clientMethod, args: Ns(t.args ?? {}), __internalParams: t, query: (s, a = t) => { - let l = a.customDataProxyFetch; - return a.customDataProxyFetch = Ks(o, l), a.args = s, $s(e, a, r, n + 1); - } }); - }); - } - function qs(e, t) { - let { jsModelName: r, action: n, clientMethod: i } = t, o = r ? n : i; - if (e._extensions.isEmpty()) - return e._executeRequest(t); - let s = e._extensions.getAllQueryCallbacks(r ?? "$none", o); - return $s(e, t, s); - } - function js(e) { - return (t) => { - let r = { requests: t }, n = t[0].extensions.getAllBatchQueryCallbacks(); - return n.length ? Bs(r, n, 0, e) : e(r); - }; - } - function Bs(e, t, r, n) { - if (r === t.length) - return n(e); - let i = e.customDataProxyFetch, o = e.requests[0].transaction; - return t[r]({ args: { queries: e.requests.map((s) => ({ model: s.modelName, operation: s.action, args: s.args })), transaction: o ? { isolationLevel: o.kind === "batch" ? o.isolationLevel : void 0 } : void 0 }, __internalParams: e, query(s, a = e) { - let l = a.customDataProxyFetch; - return a.customDataProxyFetch = Ks(i, l), Bs(a, t, r + 1, n); - } }); - } - var Ls = (e) => e; - function Ks(e = Ls, t = Ls) { - return (r) => e(t(r)); - } - function Us(e, t, r) { - let n = Ee(r); - return !t.result || !(t.result.$allModels || t.result[n]) ? e : ip({ ...e, ...Vs(t.name, e, t.result.$allModels), ...Vs(t.name, e, t.result[n]) }); - } - function ip(e) { - let t = new he(), r = (n, i) => t.getOrCreate(n, () => i.has(n) ? [n] : (i.add(n), e[n] ? e[n].needs.flatMap((o) => r(o, i)) : [n])); - return ot(e, (n) => ({ ...n, needs: r(n.name, /* @__PURE__ */ new Set()) })); - } - function Vs(e, t, r) { - return r ? ot(r, ({ needs: n, compute: i }, o) => ({ name: o, needs: n ? Object.keys(n).filter((s) => n[s]) : [], compute: op(t, o, i) })) : {}; - } - function op(e, t, r) { - let n = e?.[t]?.compute; - return n ? (i) => r({ ...i, [t]: n(i) }) : r; - } - function Qs(e, t) { - if (!t) - return e; - let r = { ...e }; - for (let n of Object.values(t)) - if (!!e[n.name]) - for (let i of n.needs) - r[i] = true; - return r; - } - var qr = class { - constructor(t, r) { - this.extension = t; - this.previous = r; - this.computedFieldsCache = new he(); - this.modelExtensionsCache = new he(); - this.queryCallbacksCache = new he(); - this.clientExtensions = Rt(() => this.extension.client ? { ...this.previous?.getAllClientExtensions(), ...this.extension.client } : this.previous?.getAllClientExtensions()); - this.batchCallbacks = Rt(() => { - let t2 = this.previous?.getAllBatchQueryCallbacks() ?? [], r2 = this.extension.query?.$__internalBatch; - return r2 ? t2.concat(r2) : t2; - }); - } - getAllComputedFields(t) { - return this.computedFieldsCache.getOrCreate(t, () => Us(this.previous?.getAllComputedFields(t), this.extension, t)); - } - getAllClientExtensions() { - return this.clientExtensions.get(); - } - getAllModelExtensions(t) { - return this.modelExtensionsCache.getOrCreate(t, () => { - let r = Ee(t); - return !this.extension.model || !(this.extension.model[r] || this.extension.model.$allModels) ? this.previous?.getAllModelExtensions(t) : { ...this.previous?.getAllModelExtensions(t), ...this.extension.model.$allModels, ...this.extension.model[r] }; - }); - } - getAllQueryCallbacks(t, r) { - return this.queryCallbacksCache.getOrCreate(`${t}:${r}`, () => { - let n = this.previous?.getAllQueryCallbacks(t, r) ?? [], i = [], o = this.extension.query; - return !o || !(o[t] || o.$allModels || o[r] || o.$allOperations) ? n : (o[t] !== void 0 && (o[t][r] !== void 0 && i.push(o[t][r]), o[t].$allOperations !== void 0 && i.push(o[t].$allOperations)), t !== "$none" && o.$allModels !== void 0 && (o.$allModels[r] !== void 0 && i.push(o.$allModels[r]), o.$allModels.$allOperations !== void 0 && i.push(o.$allModels.$allOperations)), o[r] !== void 0 && i.push(o[r]), o.$allOperations !== void 0 && i.push(o.$allOperations), n.concat(i)); - }); - } - getAllBatchQueryCallbacks() { - return this.batchCallbacks.get(); - } - }; - var Be = class { - constructor(t) { - this.head = t; - } - static empty() { - return new Be(); - } - static single(t) { - return new Be(new qr(t)); - } - isEmpty() { - return this.head === void 0; - } - append(t) { - return new Be(new qr(t, this.head)); - } - getAllComputedFields(t) { - return this.head?.getAllComputedFields(t); - } - getAllClientExtensions() { - return this.head?.getAllClientExtensions(); - } - getAllModelExtensions(t) { - return this.head?.getAllModelExtensions(t); - } - getAllQueryCallbacks(t, r) { - return this.head?.getAllQueryCallbacks(t, r) ?? []; - } - getAllBatchQueryCallbacks() { - return this.head?.getAllBatchQueryCallbacks() ?? []; - } - }; - var Js = N("prisma:client"); - var Gs = { Vercel: "vercel", "Netlify CI": "netlify" }; - function Ws({ postinstall: e, ciName: t, clientVersion: r }) { - if (Js("checkPlatformCaching:postinstall", e), Js("checkPlatformCaching:ciName", t), e === true && t && t in Gs) { - let n = `Prisma has detected that this project was built on ${t}, which caches dependencies. This leads to an outdated Prisma Client because Prisma's auto-generation isn't triggered. To fix this, make sure to run the \`prisma generate\` command during the build process. - -Learn how: https://pris.ly/d/${Gs[t]}-build`; - throw console.error(n), new _(n, r); - } - } - var ea = A(ni()); - function Zs(e, t) { - let r = Xs(e), n = sp(r), i = lp(n); - i ? jr(i, t) : t.addErrorMessage(() => "Unknown error"); - } - function Xs(e) { - return e.errors.flatMap((t) => t.kind === "Union" ? Xs(t) : [t]); - } - function sp(e) { - let t = /* @__PURE__ */ new Map(), r = []; - for (let n of e) { - if (n.kind !== "InvalidArgumentType") { - r.push(n); - continue; - } - let i = `${n.selectionPath.join(".")}:${n.argumentPath.join(".")}`, o = t.get(i); - o ? t.set(i, { ...n, argument: { ...n.argument, typeNames: ap(o.argument.typeNames, n.argument.typeNames) } }) : t.set(i, n); - } - return r.push(...t.values()), r; - } - function ap(e, t) { - return [...new Set(e.concat(t))]; - } - function lp(e) { - return _n(e, (t, r) => { - let n = zs(t), i = zs(r); - return n !== i ? n - i : Ys(t) - Ys(r); - }); - } - function zs(e) { - let t = 0; - return Array.isArray(e.selectionPath) && (t += e.selectionPath.length), Array.isArray(e.argumentPath) && (t += e.argumentPath.length), t; - } - function Ys(e) { - switch (e.kind) { - case "InvalidArgumentValue": - case "ValueTooLarge": - return 20; - case "InvalidArgumentType": - return 10; - case "RequiredArgumentMissing": - return -10; - default: - return 0; - } - } - var Re = class { - constructor(t, r) { - this.name = t; - this.value = r; - this.isRequired = false; - } - makeRequired() { - return this.isRequired = true, this; - } - write(t) { - let { colors: { green: r } } = t.context; - t.addMarginSymbol(r(this.isRequired ? "+" : "?")), t.write(r(this.name)), this.isRequired || t.write(r("?")), t.write(r(": ")), typeof this.value == "string" ? t.write(r(this.value)) : t.write(this.value); - } - }; - var Br = class { - constructor() { - this.fields = []; - } - addField(t, r) { - return this.fields.push({ write(n) { - let { green: i, dim: o } = n.context.colors; - n.write(i(o(`${t}: ${r}`))).addMarginSymbol(i(o("+"))); - } }), this; - } - write(t) { - let { colors: { green: r } } = t.context; - t.writeLine(r("{")).withIndent(() => { - t.writeJoined(mt, this.fields).newLine(); - }).write(r("}")).addMarginSymbol(r("+")); - } - }; - function jr(e, t) { - switch (e.kind) { - case "IncludeAndSelect": - up(e, t); - break; - case "IncludeOnScalar": - cp(e, t); - break; - case "EmptySelection": - pp(e, t); - break; - case "UnknownSelectionField": - dp(e, t); - break; - case "UnknownArgument": - mp(e, t); - break; - case "UnknownInputField": - fp(e, t); - break; - case "RequiredArgumentMissing": - gp(e, t); - break; - case "InvalidArgumentType": - yp(e, t); - break; - case "InvalidArgumentValue": - hp(e, t); - break; - case "ValueTooLarge": - xp(e, t); - break; - case "SomeFieldsMissing": - bp(e, t); - break; - case "TooManyFieldsGiven": - wp(e, t); - break; - case "Union": - Zs(e, t); - break; - default: - throw new Error("not implemented: " + e.kind); - } - } - function up(e, t) { - let r = t.arguments.getDeepSubSelectionValue(e.selectionPath); - r && r instanceof D && (r.getField("include")?.markAsError(), r.getField("select")?.markAsError()), t.addErrorMessage((n) => `Please ${n.bold("either")} use ${n.green("`include`")} or ${n.green("`select`")}, but ${n.red("not both")} at the same time.`); - } - function cp(e, t) { - let [r, n] = Kr(e.selectionPath), i = e.outputType, o = t.arguments.getDeepSelectionParent(r)?.value; - if (o && (o.getField(n)?.markAsError(), i)) - for (let s of i.fields) - s.isRelation && o.addSuggestion(new Re(s.name, "true")); - t.addErrorMessage((s) => { - let a = `Invalid scalar field ${s.red(`\`${n}\``)} for ${s.bold("include")} statement`; - return i ? a += ` on model ${s.bold(i.name)}. ${Vt(s)}` : a += ".", a += ` -Note that ${s.bold("include")} statements only accept relation fields.`, a; - }); - } - function pp(e, t) { - let r = e.outputType, n = t.arguments.getDeepSelectionParent(e.selectionPath)?.value, i = n?.isEmpty() ?? false; - n && (n.removeAllFields(), na(n, r)), t.addErrorMessage((o) => i ? `The ${o.red("`select`")} statement for type ${o.bold(r.name)} must not be empty. ${Vt(o)}` : `The ${o.red("`select`")} statement for type ${o.bold(r.name)} needs ${o.bold("at least one truthy value")}.`); - } - function dp(e, t) { - let [r, n] = Kr(e.selectionPath), i = t.arguments.getDeepSelectionParent(r); - i && (i.value.getField(n)?.markAsError(), na(i.value, e.outputType)), t.addErrorMessage((o) => { - let s = [`Unknown field ${o.red(`\`${n}\``)}`]; - return i && s.push(`for ${o.bold(i.kind)} statement`), s.push(`on model ${o.bold(`\`${e.outputType.name}\``)}.`), s.push(Vt(o)), s.join(" "); - }); - } - function mp(e, t) { - let r = e.argumentPath[0], n = t.arguments.getDeepSubSelectionValue(e.selectionPath); - n instanceof D && (n.getField(r)?.markAsError(), Pp(n, e.arguments)), t.addErrorMessage((i) => ta(i, r, e.arguments.map((o) => o.name))); - } - function fp(e, t) { - let [r, n] = Kr(e.argumentPath), i = t.arguments.getDeepSubSelectionValue(e.selectionPath); - if (i instanceof D) { - i.getDeepField(e.argumentPath)?.markAsError(); - let o = i.getDeepFieldValue(r); - o instanceof D && ia(o, e.inputType); - } - t.addErrorMessage((o) => ta(o, n, e.inputType.fields.map((s) => s.name))); - } - function ta(e, t, r) { - let n = [`Unknown argument \`${e.red(t)}\`.`], i = Tp(t, r); - return i && n.push(`Did you mean \`${e.green(i)}\`?`), r.length > 0 && n.push(Vt(e)), n.join(" "); - } - function gp(e, t) { - let r; - t.addErrorMessage((l) => r?.value instanceof j && r.value.text === "null" ? `Argument \`${l.green(o)}\` must not be ${l.red("null")}.` : `Argument \`${l.green(o)}\` is missing.`); - let n = t.arguments.getDeepSubSelectionValue(e.selectionPath); - if (!(n instanceof D)) - return; - let [i, o] = Kr(e.argumentPath), s = new Br(), a = n.getDeepFieldValue(i); - if (a instanceof D) - if (r = a.getField(o), r && a.removeField(o), e.inputTypes.length === 1 && e.inputTypes[0].kind === "object") { - for (let l of e.inputTypes[0].fields) - s.addField(l.name, l.typeNames.join(" | ")); - a.addSuggestion(new Re(o, s).makeRequired()); - } else { - let l = e.inputTypes.map(ra).join(" | "); - a.addSuggestion(new Re(o, l).makeRequired()); - } - } - function ra(e) { - return e.kind === "list" ? `${ra(e.elementType)}[]` : e.name; - } - function yp(e, t) { - let r = e.argument.name, n = t.arguments.getDeepSubSelectionValue(e.selectionPath); - n instanceof D && n.getDeepFieldValue(e.argumentPath)?.markAsError(), t.addErrorMessage((i) => { - let o = Vr("or", e.argument.typeNames.map((s) => i.green(s))); - return `Argument \`${i.bold(r)}\`: Invalid value provided. Expected ${o}, provided ${i.red(e.inferredType)}.`; - }); - } - function hp(e, t) { - let r = e.argument.name, n = t.arguments.getDeepSubSelectionValue(e.selectionPath); - n instanceof D && n.getDeepFieldValue(e.argumentPath)?.markAsError(), t.addErrorMessage((i) => { - let o = [`Invalid value for argument \`${i.bold(r)}\``]; - if (e.underlyingError && o.push(`: ${e.underlyingError}`), o.push("."), e.argument.typeNames.length > 0) { - let s = Vr("or", e.argument.typeNames.map((a) => i.green(a))); - o.push(` Expected ${s}.`); - } - return o.join(""); - }); - } - function xp(e, t) { - let r = e.argument.name, n = t.arguments.getDeepSubSelectionValue(e.selectionPath), i; - if (n instanceof D) { - let s = n.getDeepField(e.argumentPath)?.value; - s?.markAsError(), s instanceof j && (i = s.text); - } - t.addErrorMessage((o) => { - let s = ["Unable to fit value"]; - return i && s.push(o.red(i)), s.push(`into a 64-bit signed integer for field \`${o.bold(r)}\``), s.join(" "); - }); - } - function bp(e, t) { - let r = e.argumentPath[e.argumentPath.length - 1], n = t.arguments.getDeepSubSelectionValue(e.selectionPath); - if (n instanceof D) { - let i = n.getDeepFieldValue(e.argumentPath); - i instanceof D && ia(i, e.inputType); - } - t.addErrorMessage((i) => { - let o = [`Argument \`${i.bold(r)}\` of type ${i.bold(e.inputType.name)} needs`]; - return e.constraints.minFieldCount === 1 ? e.constraints.requiredFields ? o.push(`${i.green("at least one of")} ${Vr("or", e.constraints.requiredFields.map((s) => `\`${i.bold(s)}\``))} arguments.`) : o.push(`${i.green("at least one")} argument.`) : o.push(`${i.green(`at least ${e.constraints.minFieldCount}`)} arguments.`), o.push(Vt(i)), o.join(" "); - }); - } - function wp(e, t) { - let r = e.argumentPath[e.argumentPath.length - 1], n = t.arguments.getDeepSubSelectionValue(e.selectionPath), i = []; - if (n instanceof D) { - let o = n.getDeepFieldValue(e.argumentPath); - o instanceof D && (o.markAsError(), i = Object.keys(o.getFields())); - } - t.addErrorMessage((o) => { - let s = [`Argument \`${o.bold(r)}\` of type ${o.bold(e.inputType.name)} needs`]; - return e.constraints.minFieldCount === 1 && e.constraints.maxFieldCount == 1 ? s.push(`${o.green("exactly one")} argument,`) : e.constraints.maxFieldCount == 1 ? s.push(`${o.green("at most one")} argument,`) : s.push(`${o.green(`at most ${e.constraints.maxFieldCount}`)} arguments,`), s.push(`but you provided ${Vr("and", i.map((a) => o.red(a)))}. Please choose`), e.constraints.maxFieldCount === 1 ? s.push("one.") : s.push(`${e.constraints.maxFieldCount}.`), s.join(" "); - }); - } - function na(e, t) { - for (let r of t.fields) - e.hasField(r.name) || e.addSuggestion(new Re(r.name, "true")); - } - function Pp(e, t) { - for (let r of t) - e.hasField(r.name) || e.addSuggestion(new Re(r.name, r.typeNames.join(" | "))); - } - function ia(e, t) { - if (t.kind === "object") - for (let r of t.fields) - e.hasField(r.name) || e.addSuggestion(new Re(r.name, r.typeNames.join(" | "))); - } - function Kr(e) { - let t = [...e], r = t.pop(); - if (!r) - throw new Error("unexpected empty path"); - return [t, r]; - } - function Vt({ green: e }) { - return `Available options are listed in ${e("green")}.`; - } - function Vr(e, t) { - if (t.length === 1) - return t[0]; - let r = [...t], n = r.pop(); - return `${r.join(", ")} ${e} ${n}`; - } - var Ep = 3; - function Tp(e, t) { - let r = 1 / 0, n; - for (let i of t) { - let o = (0, ea.default)(e, i); - o > Ep || o < r && (r = o, n = i); - } - return n; - } - function Ur({ args: e, errors: t, errorFormat: r, callsite: n, originalMethod: i, clientVersion: o }) { - let s = _r(e); - for (let p of t) - jr(p, s); - let a = r === "pretty" ? cs : Or, l = s.renderAllMessages(a), u = new at(0, { colors: a }).write(s).toString(), c = gt({ message: l, callsite: n, originalMethod: i, showColors: r === "pretty", callArguments: u }); - throw new te(c, { clientVersion: o }); - } - var vp = { findUnique: "findUnique", findUniqueOrThrow: "findUniqueOrThrow", findFirst: "findFirst", findFirstOrThrow: "findFirstOrThrow", findMany: "findMany", count: "aggregate", create: "createOne", createMany: "createMany", update: "updateOne", updateMany: "updateMany", upsert: "upsertOne", delete: "deleteOne", deleteMany: "deleteMany", executeRaw: "executeRaw", queryRaw: "queryRaw", aggregate: "aggregate", groupBy: "groupBy", runCommandRaw: "runCommandRaw", findRaw: "findRaw", aggregateRaw: "aggregateRaw" }; - function oa({ modelName: e, action: t, args: r, runtimeDataModel: n, extensions: i, callsite: o, clientMethod: s, errorFormat: a, clientVersion: l }) { - let u = new yt({ runtimeDataModel: n, modelName: e, action: t, rootArgs: r, callsite: o, extensions: i, selectionPath: [], argumentPath: [], originalMethod: s, errorFormat: a, clientVersion: l }); - return { modelName: e, action: vp[t], query: ii(r, u) }; - } - function ii({ select: e, include: t, ...r } = {}, n) { - return { arguments: aa(r, n), selection: Cp(e, t, n) }; - } - function Cp(e, t, r) { - return e && t && r.throwValidationError({ kind: "IncludeAndSelect", selectionPath: r.getSelectionPath() }), e ? Sp(e, r) : Mp(r, t); - } - function Mp(e, t) { - let r = {}; - return e.model && !e.isRawAction() && (r.$composites = true, r.$scalars = true), t && Ap(r, t, e), r; - } - function Ap(e, t, r) { - for (let [n, i] of Object.entries(t)) { - let o = r.findField(n); - o && o?.kind !== "object" && r.throwValidationError({ kind: "IncludeOnScalar", selectionPath: r.getSelectionPath().concat(n), outputType: r.getOutputTypeDescription() }), i === true ? e[n] = true : typeof i == "object" && (e[n] = ii(i, r.nestSelection(n))); - } - } - function Sp(e, t) { - let r = {}, n = t.getComputedFields(), i = Qs(e, n); - for (let [o, s] of Object.entries(i)) { - let a = t.findField(o); - n?.[o] && !a || (s === true ? r[o] = true : typeof s == "object" && (r[o] = ii(s, t.nestSelection(o)))); - } - return r; - } - function sa(e, t) { - if (e === null) - return null; - if (typeof e == "string" || typeof e == "number" || typeof e == "boolean") - return e; - if (typeof e == "bigint") - return { $type: "BigInt", value: String(e) }; - if (lt(e)) { - if (Er(e)) - return { $type: "DateTime", value: e.toISOString() }; - t.throwValidationError({ kind: "InvalidArgumentValue", selectionPath: t.getSelectionPath(), argumentPath: t.getArgumentPath(), argument: { name: t.getArgumentName(), typeNames: ["Date"] }, underlyingError: "Provided Date object is invalid" }); - } - if (dt(e)) - return { $type: "FieldRef", value: { _ref: e.name, _container: e.modelName } }; - if (Array.isArray(e)) - return Rp(e, t); - if (ArrayBuffer.isView(e)) - return { $type: "Bytes", value: Buffer.from(e).toString("base64") }; - if (Fp(e)) - return e.values; - if (pt(e)) - return { $type: "Decimal", value: e.toFixed() }; - if (e instanceof Ae) { - if (e !== Pr.instances[e._getName()]) - throw new Error("Invalid ObjectEnumValue"); - return { $type: "Enum", value: e._getName() }; - } - if (Op(e)) - return e.toJSON(); - if (typeof e == "object") - return aa(e, t); - t.throwValidationError({ kind: "InvalidArgumentValue", selectionPath: t.getSelectionPath(), argumentPath: t.getArgumentPath(), argument: { name: t.getArgumentName(), typeNames: [] }, underlyingError: `We could not serialize ${Object.prototype.toString.call(e)} value. Serialize the object to JSON or implement a ".toJSON()" method on it` }); - } - function aa(e, t) { - if (e.$type) - return { $type: "Json", value: JSON.stringify(e) }; - let r = {}; - for (let n in e) { - let i = e[n]; - i !== void 0 && (r[n] = sa(i, t.nestArgument(n))); - } - return r; - } - function Rp(e, t) { - let r = []; - for (let n = 0; n < e.length; n++) { - let i = e[n]; - i !== void 0 && r.push(sa(i, t.nestArgument(String(n)))); - } - return r; - } - function Fp(e) { - return typeof e == "object" && e !== null && e.__prismaRawParameters__ === true; - } - function Op(e) { - return typeof e == "object" && e !== null && typeof e.toJSON == "function"; - } - var yt = class { - constructor(t) { - this.params = t; - this.params.modelName && (this.model = this.params.runtimeDataModel.models[this.params.modelName]); - } - throwValidationError(t) { - Ur({ errors: [t], originalMethod: this.params.originalMethod, args: this.params.rootArgs ?? {}, callsite: this.params.callsite, errorFormat: this.params.errorFormat, clientVersion: this.params.clientVersion }); - } - getSelectionPath() { - return this.params.selectionPath; - } - getArgumentPath() { - return this.params.argumentPath; - } - getArgumentName() { - return this.params.argumentPath[this.params.argumentPath.length - 1]; - } - getOutputTypeDescription() { - if (!(!this.params.modelName || !this.model)) - return { name: this.params.modelName, fields: this.model.fields.map((t) => ({ name: t.name, typeName: "boolean", isRelation: t.kind === "object" })) }; - } - isRawAction() { - return ["executeRaw", "queryRaw", "runCommandRaw", "findRaw", "aggregateRaw"].includes(this.params.action); - } - getComputedFields() { - if (!!this.params.modelName) - return this.params.extensions.getAllComputedFields(this.params.modelName); - } - findField(t) { - return this.model?.fields.find((r) => r.name === t); - } - nestSelection(t) { - let r = this.findField(t), n = r?.kind === "object" ? r.type : void 0; - return new yt({ ...this.params, modelName: n, selectionPath: this.params.selectionPath.concat(t) }); - } - nestArgument(t) { - return new yt({ ...this.params, argumentPath: this.params.argumentPath.concat(t) }); - } - }; - var la = (e) => ({ command: e }); - var ua = (e) => e.strings.reduce((t, r, n) => `${t}@P${n}${r}`); - function Ut(e) { - try { - return ca(e, "fast"); - } catch { - return ca(e, "slow"); - } - } - function ca(e, t) { - return JSON.stringify(e.map((r) => kp(r, t))); - } - function kp(e, t) { - return typeof e == "bigint" ? { prisma__type: "bigint", prisma__value: e.toString() } : lt(e) ? { prisma__type: "date", prisma__value: e.toJSON() } : we.isDecimal(e) ? { prisma__type: "decimal", prisma__value: e.toJSON() } : Buffer.isBuffer(e) ? { prisma__type: "bytes", prisma__value: e.toString("base64") } : Dp(e) || ArrayBuffer.isView(e) ? { prisma__type: "bytes", prisma__value: Buffer.from(e).toString("base64") } : typeof e == "object" && t === "slow" ? da(e) : e; - } - function Dp(e) { - return e instanceof ArrayBuffer || e instanceof SharedArrayBuffer ? true : typeof e == "object" && e !== null ? e[Symbol.toStringTag] === "ArrayBuffer" || e[Symbol.toStringTag] === "SharedArrayBuffer" : false; - } - function da(e) { - if (typeof e != "object" || e === null) - return e; - if (typeof e.toJSON == "function") - return e.toJSON(); - if (Array.isArray(e)) - return e.map(pa); - let t = {}; - for (let r of Object.keys(e)) - t[r] = pa(e[r]); - return t; - } - function pa(e) { - return typeof e == "bigint" ? e.toString() : da(e); - } - var _p = /^(\s*alter\s)/i; - var ma = N("prisma:client"); - function oi(e, t, r, n) { - if (!(e !== "postgresql" && e !== "cockroachdb") && r.length > 0 && _p.exec(t)) - throw new Error(`Running ALTER using ${n} is not supported -Using the example below you can still execute your query with Prisma, but please note that it is vulnerable to SQL injection attacks and requires you to take care of input sanitization. - -Example: - await prisma.$executeRawUnsafe(\`ALTER USER prisma WITH PASSWORD '\${password}'\`) - -More Information: https://pris.ly/d/execute-raw -`); - } - var si = (e, t) => (r) => { - let n = "", i; - if (Array.isArray(r)) { - let [o, ...s] = r; - n = o, i = { values: Ut(s || []), __prismaRawParameters__: true }; - } else - switch (e) { - case "sqlite": - case "mysql": { - n = r.sql, i = { values: Ut(r.values), __prismaRawParameters__: true }; - break; - } - case "cockroachdb": - case "postgresql": { - n = r.text, i = { values: Ut(r.values), __prismaRawParameters__: true }; - break; - } - case "sqlserver": { - n = ua(r), i = { values: Ut(r.values), __prismaRawParameters__: true }; - break; - } - default: - throw new Error(`The ${e} provider does not support ${t}`); - } - return i?.values ? ma(`prisma.${t}(${n}, ${i.values})`) : ma(`prisma.${t}(${n})`), { query: n, parameters: i }; - }; - var fa = { requestArgsToMiddlewareArgs(e) { - return [e.strings, ...e.values]; - }, middlewareArgsToRequestArgs(e) { - let [t, ...r] = e; - return new U(t, r); - } }; - var ga = { requestArgsToMiddlewareArgs(e) { - return [e]; - }, middlewareArgsToRequestArgs(e) { - return e[0]; - } }; - function ai(e) { - return function(r) { - let n, i = (o = e) => { - try { - return o === void 0 || o?.kind === "itx" ? n ?? (n = ya(r(o))) : ya(r(o)); - } catch (s) { - return Promise.reject(s); - } - }; - return { then(o, s) { - return i().then(o, s); - }, catch(o) { - return i().catch(o); - }, finally(o) { - return i().finally(o); - }, requestTransaction(o) { - let s = i(o); - return s.requestTransaction ? s.requestTransaction(o) : s; - }, [Symbol.toStringTag]: "PrismaPromise" }; - }; - } - function ya(e) { - return typeof e.then == "function" ? e : Promise.resolve(e); - } - var ha = { isEnabled() { - return false; - }, getTraceParent() { - return "00-10-10-00"; - }, async createEngineSpan() { - }, getActiveContext() { - }, runInChildSpan(e, t) { - return t(); - } }; - var li = class { - isEnabled() { - return this.getGlobalTracingHelper().isEnabled(); - } - getTraceParent(t) { - return this.getGlobalTracingHelper().getTraceParent(t); - } - createEngineSpan(t) { - return this.getGlobalTracingHelper().createEngineSpan(t); - } - getActiveContext() { - return this.getGlobalTracingHelper().getActiveContext(); - } - runInChildSpan(t, r) { - return this.getGlobalTracingHelper().runInChildSpan(t, r); - } - getGlobalTracingHelper() { - return globalThis.PRISMA_INSTRUMENTATION?.helper ?? ha; - } - }; - function xa(e) { - return e.includes("tracing") ? new li() : ha; - } - function ba(e, t = () => { - }) { - let r, n = new Promise((i) => r = i); - return { then(i) { - return --e === 0 && r(t()), i?.(n); - } }; - } - function wa(e) { - return typeof e == "string" ? e : e.reduce((t, r) => { - let n = typeof r == "string" ? r : r.level; - return n === "query" ? t : t && (r === "info" || t === "info") ? "info" : n; - }, void 0); - } - var Ip = ["$connect", "$disconnect", "$on", "$transaction", "$use", "$extends"]; - var Pa = Ip; - function Ta(e, t, r) { - let n = Ea(e, r), i = Ea(t, r), o = Object.values(i).map((a) => a[a.length - 1]), s = Object.keys(i); - return Object.entries(n).forEach(([a, l]) => { - s.includes(a) || o.push(l[l.length - 1]); - }), o; - } - var Ea = (e, t) => e.reduce((r, n) => { - let i = t(n); - return r[i] || (r[i] = []), r[i].push(n), r; - }, {}); - var Qr = class { - constructor() { - this._middlewares = []; - } - use(t) { - this._middlewares.push(t); - } - get(t) { - return this._middlewares[t]; - } - has(t) { - return !!this._middlewares[t]; - } - length() { - return this._middlewares.length; - } - }; - var Ca = A(On()); - function Jr(e) { - return typeof e.batchRequestIdx == "number"; - } - function Gr(e) { - return e === null ? e : Array.isArray(e) ? e.map(Gr) : typeof e == "object" ? Np(e) ? Lp(e) : ot(e, Gr) : e; - } - function Np(e) { - return e !== null && typeof e == "object" && typeof e.$type == "string"; - } - function Lp({ $type: e, value: t }) { - switch (e) { - case "BigInt": - return BigInt(t); - case "Bytes": - return Buffer.from(t, "base64"); - case "DateTime": - return new Date(t); - case "Decimal": - return new we(t); - case "Json": - return JSON.parse(t); - default: - Je(t, "Unknown tagged value"); - } - } - function va(e) { - if (e.action !== "findUnique" && e.action !== "findUniqueOrThrow") - return; - let t = []; - return e.modelName && t.push(e.modelName), e.query.arguments && t.push(ui(e.query.arguments)), t.push(ui(e.query.selection)), t.join(""); - } - function ui(e) { - return `(${Object.keys(e).sort().map((r) => { - let n = e[r]; - return typeof n == "object" && n !== null ? `(${r} ${ui(n)})` : r; - }).join(" ")})`; - } - var $p = { aggregate: false, aggregateRaw: false, createMany: true, createOne: true, deleteMany: true, deleteOne: true, executeRaw: true, findFirst: false, findFirstOrThrow: false, findMany: false, findRaw: false, findUnique: false, findUniqueOrThrow: false, groupBy: false, queryRaw: false, runCommandRaw: true, updateMany: true, updateOne: true, upsertOne: true }; - function ci(e) { - return $p[e]; - } - var Wr = class { - constructor(t) { - this.options = t; - this.tickActive = false; - this.batches = {}; - } - request(t) { - let r = this.options.batchBy(t); - return r ? (this.batches[r] || (this.batches[r] = [], this.tickActive || (this.tickActive = true, process.nextTick(() => { - this.dispatchBatches(), this.tickActive = false; - }))), new Promise((n, i) => { - this.batches[r].push({ request: t, resolve: n, reject: i }); - })) : this.options.singleLoader(t); - } - dispatchBatches() { - for (let t in this.batches) { - let r = this.batches[t]; - delete this.batches[t], r.length === 1 ? this.options.singleLoader(r[0].request).then((n) => { - n instanceof Error ? r[0].reject(n) : r[0].resolve(n); - }).catch((n) => { - r[0].reject(n); - }) : (r.sort((n, i) => this.options.batchOrder(n.request, i.request)), this.options.batchLoader(r.map((n) => n.request)).then((n) => { - if (n instanceof Error) - for (let i = 0; i < r.length; i++) - r[i].reject(n); - else - for (let i = 0; i < r.length; i++) { - let o = n[i]; - o instanceof Error ? r[i].reject(o) : r[i].resolve(o); - } - }).catch((n) => { - for (let i = 0; i < r.length; i++) - r[i].reject(n); - })); - } - } - get [Symbol.toStringTag]() { - return "DataLoader"; - } - }; - var qp = N("prisma:client:request_handler"); - var Hr = class { - constructor(t, r) { - this.logEmitter = r, this.client = t, this.dataloader = new Wr({ batchLoader: js(async ({ requests: n, customDataProxyFetch: i }) => { - let { transaction: o, otelParentCtx: s } = n[0], a = n.map((p) => p.protocolQuery), l = this.client._tracingHelper.getTraceParent(s), u = n.some((p) => ci(p.protocolQuery.action)); - return (await this.client._engine.requestBatch(a, { traceparent: l, transaction: jp(o), containsWrite: u, customDataProxyFetch: i })).map((p, d) => { - if (p instanceof Error) - return p; - try { - return this.mapQueryEngineResult(n[d], p); - } catch (g) { - return g; - } - }); - }), singleLoader: async (n) => { - let i = n.transaction?.kind === "itx" ? Ma(n.transaction) : void 0, o = await this.client._engine.request(n.protocolQuery, { traceparent: this.client._tracingHelper.getTraceParent(), interactiveTransaction: i, isWrite: ci(n.protocolQuery.action), customDataProxyFetch: n.customDataProxyFetch }); - return this.mapQueryEngineResult(n, o); - }, batchBy: (n) => n.transaction?.id ? `transaction-${n.transaction.id}` : va(n.protocolQuery), batchOrder(n, i) { - return n.transaction?.kind === "batch" && i.transaction?.kind === "batch" ? n.transaction.index - i.transaction.index : 0; - } }); - } - async request(t) { - try { - return await this.dataloader.request(t); - } catch (r) { - let { clientMethod: n, callsite: i, transaction: o, args: s } = t; - this.handleAndLogRequestError({ error: r, clientMethod: n, callsite: i, transaction: o, args: s }); - } - } - mapQueryEngineResult({ dataPath: t, unpacker: r }, n) { - let i = n?.data, o = n?.elapsed, s = this.unpack(i, t, r); - return process.env.PRISMA_CLIENT_GET_TIME ? { data: s, elapsed: o } : s; - } - handleAndLogRequestError(t) { - try { - this.handleRequestError(t); - } catch (r) { - throw this.logEmitter && this.logEmitter.emit("error", { message: r.message, target: t.clientMethod, timestamp: /* @__PURE__ */ new Date() }), r; - } - } - handleRequestError({ error: t, clientMethod: r, callsite: n, transaction: i, args: o }) { - if (qp(t), Bp(t, i) || t instanceof Ce) - throw t; - if (t instanceof H && Kp(t)) { - let a = Aa(t.meta); - Ur({ args: o, errors: [a], callsite: n, errorFormat: this.client._errorFormat, originalMethod: r, clientVersion: this.client._clientVersion }); - } - let s = t.message; - throw n && (s = gt({ callsite: n, originalMethod: r, isPanic: t.isPanic, showColors: this.client._errorFormat === "pretty", message: s })), s = this.sanitizeMessage(s), t.code ? new H(s, { code: t.code, clientVersion: this.client._clientVersion, meta: t.meta, batchRequestIdx: t.batchRequestIdx }) : t.isPanic ? new ae(s, this.client._clientVersion) : t instanceof z ? new z(s, { clientVersion: this.client._clientVersion, batchRequestIdx: t.batchRequestIdx }) : t instanceof _ ? new _(s, this.client._clientVersion) : t instanceof ae ? new ae(s, this.client._clientVersion) : (t.clientVersion = this.client._clientVersion, t); - } - sanitizeMessage(t) { - return this.client._errorFormat && this.client._errorFormat !== "pretty" ? (0, Ca.default)(t) : t; - } - unpack(t, r, n) { - if (!t || (t.data && (t = t.data), !t)) - return t; - let i = Object.values(t)[0], o = r.filter((a) => a !== "select" && a !== "include"), s = Gr(Xn(i, o)); - return n ? n(s) : s; - } - get [Symbol.toStringTag]() { - return "RequestHandler"; - } - }; - function jp(e) { - if (!!e) { - if (e.kind === "batch") - return { kind: "batch", options: { isolationLevel: e.isolationLevel } }; - if (e.kind === "itx") - return { kind: "itx", options: Ma(e) }; - Je(e, "Unknown transaction kind"); - } - } - function Ma(e) { - return { id: e.id, payload: e.payload }; - } - function Bp(e, t) { - return Jr(e) && t?.kind === "batch" && e.batchRequestIdx !== t.index; - } - function Kp(e) { - return e.code === "P2009" || e.code === "P2012"; - } - function Aa(e) { - if (e.kind === "Union") - return { kind: "Union", errors: e.errors.map(Aa) }; - if (Array.isArray(e.selectionPath)) { - let [, ...t] = e.selectionPath; - return { ...e, selectionPath: t }; - } - return e; - } - var Sa = "5.1.0"; - var Ra = Sa; - function Fa(e) { - return e.map((t) => { - let r = {}; - for (let n of Object.keys(t)) - r[n] = Oa(t[n]); - return r; - }); - } - function Oa({ prisma__type: e, prisma__value: t }) { - switch (e) { - case "bigint": - return BigInt(t); - case "bytes": - return Buffer.from(t, "base64"); - case "decimal": - return new we(t); - case "datetime": - case "date": - return new Date(t); - case "time": - return /* @__PURE__ */ new Date(`1970-01-01T${t}Z`); - case "array": - return t.map(Oa); - default: - return t; - } - } - var Ia = A(ni()); - var B = class extends Error { - constructor(t) { - super(t + ` -Read more at https://pris.ly/d/client-constructor`), this.name = "PrismaClientConstructorValidationError"; - } - get [Symbol.toStringTag]() { - return "PrismaClientConstructorValidationError"; - } - }; - ee(B, "PrismaClientConstructorValidationError"); - var ka = ["datasources", "errorFormat", "log", "__internal"]; - var Da = ["pretty", "colorless", "minimal"]; - var _a = ["info", "query", "warn", "error"]; - var Up = { datasources: (e, t) => { - if (!!e) { - if (typeof e != "object" || Array.isArray(e)) - throw new B(`Invalid value ${JSON.stringify(e)} for "datasources" provided to PrismaClient constructor`); - for (let [r, n] of Object.entries(e)) { - if (!t.includes(r)) { - let i = ht(r, t) || ` Available datasources: ${t.join(", ")}`; - throw new B(`Unknown datasource ${r} provided to PrismaClient constructor.${i}`); - } - if (typeof n != "object" || Array.isArray(n)) - throw new B(`Invalid value ${JSON.stringify(e)} for datasource "${r}" provided to PrismaClient constructor. -It should have this form: { url: "CONNECTION_STRING" }`); - if (n && typeof n == "object") - for (let [i, o] of Object.entries(n)) { - if (i !== "url") - throw new B(`Invalid value ${JSON.stringify(e)} for datasource "${r}" provided to PrismaClient constructor. -It should have this form: { url: "CONNECTION_STRING" }`); - if (typeof o != "string") - throw new B(`Invalid value ${JSON.stringify(o)} for datasource "${r}" provided to PrismaClient constructor. -It should have this form: { url: "CONNECTION_STRING" }`); - } - } - } - }, errorFormat: (e) => { - if (!!e) { - if (typeof e != "string") - throw new B(`Invalid value ${JSON.stringify(e)} for "errorFormat" provided to PrismaClient constructor.`); - if (!Da.includes(e)) { - let t = ht(e, Da); - throw new B(`Invalid errorFormat ${e} provided to PrismaClient constructor.${t}`); - } - } - }, log: (e) => { - if (!e) - return; - if (!Array.isArray(e)) - throw new B(`Invalid value ${JSON.stringify(e)} for "log" provided to PrismaClient constructor.`); - function t(r) { - if (typeof r == "string" && !_a.includes(r)) { - let n = ht(r, _a); - throw new B(`Invalid log level "${r}" provided to PrismaClient constructor.${n}`); - } - } - for (let r of e) { - t(r); - let n = { level: t, emit: (i) => { - let o = ["stdout", "event"]; - if (!o.includes(i)) { - let s = ht(i, o); - throw new B(`Invalid value ${JSON.stringify(i)} for "emit" in logLevel provided to PrismaClient constructor.${s}`); - } - } }; - if (r && typeof r == "object") - for (let [i, o] of Object.entries(r)) - if (n[i]) - n[i](o); - else - throw new B(`Invalid property ${i} for "log" provided to PrismaClient constructor`); - } - }, __internal: (e) => { - if (!e) - return; - let t = ["debug", "hooks", "engine", "measurePerformance"]; - if (typeof e != "object") - throw new B(`Invalid value ${JSON.stringify(e)} for "__internal" to PrismaClient constructor`); - for (let [r] of Object.entries(e)) - if (!t.includes(r)) { - let n = ht(r, t); - throw new B(`Invalid property ${JSON.stringify(r)} for "__internal" provided to PrismaClient constructor.${n}`); - } - } }; - function Na(e, t) { - for (let [r, n] of Object.entries(e)) { - if (!ka.includes(r)) { - let i = ht(r, ka); - throw new B(`Unknown property ${r} provided to PrismaClient constructor.${i}`); - } - Up[r](n, t); - } - } - function ht(e, t) { - if (t.length === 0 || typeof e != "string") - return ""; - let r = Qp(e, t); - return r ? ` Did you mean "${r}"?` : ""; - } - function Qp(e, t) { - if (t.length === 0) - return null; - let r = t.map((i) => ({ value: i, distance: (0, Ia.default)(e, i) })); - r.sort((i, o) => i.distance < o.distance ? -1 : 1); - let n = r[0]; - return n.distance < 3 ? n.value : null; - } - function La(e) { - return e.length === 0 ? Promise.resolve([]) : new Promise((t, r) => { - let n = new Array(e.length), i = null, o = false, s = 0, a = () => { - o || (s++, s === e.length && (o = true, i ? r(i) : t(n))); - }, l = (u) => { - o || (o = true, r(u)); - }; - for (let u = 0; u < e.length; u++) - e[u].then((c) => { - n[u] = c, a(); - }, (c) => { - if (!Jr(c)) { - l(c); - return; - } - c.batchRequestIdx === u ? l(c) : (i || (i = c), a()); - }); - }); - } - var Te = N("prisma:client"); - typeof globalThis == "object" && (globalThis.NODE_CLIENT = true); - var Jp = { requestArgsToMiddlewareArgs: (e) => e, middlewareArgsToRequestArgs: (e) => e }; - var Gp = Symbol.for("prisma.client.transaction.id"); - var Wp = { id: 0, nextId() { - return ++this.id; - } }; - function Ka(e) { - class t { - constructor(n) { - this._middlewares = new Qr(); - this._createPrismaPromise = ai(); - this.$extends = ks; - Ws(e), n && Na(n, e.datasourceNames); - let i = new ja.EventEmitter().on("error", () => { - }); - this._extensions = Be.empty(), this._previewFeatures = e.generator?.previewFeatures ?? [], this._clientVersion = e.clientVersion ?? Ra, this._activeProvider = e.activeProvider, this._dataProxy = e.dataProxy, this._tracingHelper = xa(this._previewFeatures), this._clientEngineType = Pn(e.generator); - let o = { rootEnvPath: e.relativeEnvPaths.rootEnvPath && Qt.default.resolve(e.dirname, e.relativeEnvPaths.rootEnvPath), schemaEnvPath: e.relativeEnvPaths.schemaEnvPath && Qt.default.resolve(e.dirname, e.relativeEnvPaths.schemaEnvPath) }, s = Ct(o, { conflictCheck: "none" }); - try { - let a = n ?? {}, l = a.__internal ?? {}, u = l.debug === true; - u && N.enable("prisma:client"); - let c = Qt.default.resolve(e.dirname, e.relativePath); - Ba.default.existsSync(c) || (c = e.dirname), Te("dirname", e.dirname), Te("relativePath", e.relativePath), Te("cwd", c); - let p = a.datasources || {}, d = Object.entries(p).filter(([f, b]) => b && b.url).map(([f, { url: b }]) => ({ name: f, url: b })), g = Ta([], d, (f) => f.name), y = l.engine || {}; - if (a.errorFormat ? this._errorFormat = a.errorFormat : process.env.NODE_ENV === "production" ? this._errorFormat = "minimal" : process.env.NO_COLOR ? this._errorFormat = "colorless" : this._errorFormat = "colorless", this._runtimeDataModel = e.runtimeDataModel, this._engineConfig = { cwd: c, dirname: e.dirname, enableDebugLogs: u, allowTriggerPanic: y.allowTriggerPanic, datamodelPath: Qt.default.join(e.dirname, e.filename ?? "schema.prisma"), prismaPath: y.binaryPath ?? void 0, engineEndpoint: y.endpoint, datasources: g, generator: e.generator, showColors: this._errorFormat === "pretty", logLevel: a.log && wa(a.log), logQueries: a.log && Boolean(typeof a.log == "string" ? a.log === "query" : a.log.find((f) => typeof f == "string" ? f === "query" : f.level === "query")), env: s?.parsed ?? e.injectableEdgeEnv?.parsed ?? {}, flags: [], clientVersion: e.clientVersion, previewFeatures: this._previewFeatures, activeProvider: e.activeProvider, inlineSchema: e.inlineSchema, inlineDatasources: e.inlineDatasources, inlineSchemaHash: e.inlineSchemaHash, tracingHelper: this._tracingHelper, logEmitter: i, isBundled: e.isBundled }, Te("clientVersion", e.clientVersion), Te("clientEngineType", this._dataProxy ? "dataproxy" : this._clientEngineType), this._dataProxy && Te("using Data Proxy with Node.js runtime"), this._engine = this.getEngine(), this._fetcher = new Hr(this, i), a.log) - for (let f of a.log) { - let b = typeof f == "string" ? f : f.emit === "stdout" ? f.level : null; - b && this.$on(b, (E) => { - St.log(`${St.tags[b] ?? ""}`, E.message || E.query); - }); - } - this._metrics = new st(this._engine); - } catch (a) { - throw a.clientVersion = this._clientVersion, a; - } - return this._appliedParent = Bt(this); - } - get [Symbol.toStringTag]() { - return "PrismaClient"; - } - getEngine() { - if (this._dataProxy, this._clientEngineType === "library") - return new Dt(this._engineConfig); - throw this._clientEngineType, "binary", new te("Invalid client engine type, please use `library` or `binary`", { clientVersion: this._clientVersion }); - } - $use(n) { - this._middlewares.use(n); - } - $on(n, i) { - n === "beforeExit" ? this._engine.on("beforeExit", i) : this._engine.on(n, (o) => { - let s = o.fields; - return i(n === "query" ? { timestamp: o.timestamp, query: s?.query ?? o.query, params: s?.params ?? o.params, duration: s?.duration_ms ?? o.duration, target: o.target } : { timestamp: o.timestamp, message: s?.message ?? o.message, target: o.target }); - }); - } - $connect() { - try { - return this._engine.start(); - } catch (n) { - throw n.clientVersion = this._clientVersion, n; - } - } - async _runDisconnect() { - await this._engine.stop(), delete this._connectionPromise, this._engine = this.getEngine(), delete this._disconnectionPromise; - } - async $disconnect() { - try { - await this._engine.stop(); - } catch (n) { - throw n.clientVersion = this._clientVersion, n; - } finally { - ki(); - } - } - $executeRawInternal(n, i, o, s) { - return this._request({ action: "executeRaw", args: o, transaction: n, clientMethod: i, argsMapper: si(this._activeProvider, i), callsite: je(this._errorFormat), dataPath: [], middlewareArgsMapper: s }); - } - $executeRaw(n, ...i) { - return this._createPrismaPromise((o) => { - if (n.raw !== void 0 || n.sql !== void 0) { - let [s, a] = $a(n, i); - return oi(this._activeProvider, s.text, s.values, Array.isArray(n) ? "prisma.$executeRaw``" : "prisma.$executeRaw(sql``)"), this.$executeRawInternal(o, "$executeRaw", s, a); - } - throw new te("`$executeRaw` is a tag function, please use it like the following:\n```\nconst result = await prisma.$executeRaw`UPDATE User SET cool = ${true} WHERE email = ${'user@email.com'};`\n```\n\nOr read our docs at https://www.prisma.io/docs/concepts/components/prisma-client/raw-database-access#executeraw\n", { clientVersion: this._clientVersion }); - }); - } - $executeRawUnsafe(n, ...i) { - return this._createPrismaPromise((o) => (oi(this._activeProvider, n, i, "prisma.$executeRawUnsafe(, [...values])"), this.$executeRawInternal(o, "$executeRawUnsafe", [n, ...i]))); - } - $runCommandRaw(n) { - if (e.activeProvider !== "mongodb") - throw new te(`The ${e.activeProvider} provider does not support $runCommandRaw. Use the mongodb provider.`, { clientVersion: this._clientVersion }); - return this._createPrismaPromise((i) => this._request({ args: n, clientMethod: "$runCommandRaw", dataPath: [], action: "runCommandRaw", argsMapper: la, callsite: je(this._errorFormat), transaction: i })); - } - async $queryRawInternal(n, i, o, s) { - return this._request({ action: "queryRaw", args: o, transaction: n, clientMethod: i, argsMapper: si(this._activeProvider, i), callsite: je(this._errorFormat), dataPath: [], middlewareArgsMapper: s }).then(Fa); - } - $queryRaw(n, ...i) { - return this._createPrismaPromise((o) => { - if (n.raw !== void 0 || n.sql !== void 0) - return this.$queryRawInternal(o, "$queryRaw", ...$a(n, i)); - throw new te("`$queryRaw` is a tag function, please use it like the following:\n```\nconst result = await prisma.$queryRaw`SELECT * FROM User WHERE id = ${1} OR email = ${'user@email.com'};`\n```\n\nOr read our docs at https://www.prisma.io/docs/concepts/components/prisma-client/raw-database-access#queryraw\n", { clientVersion: this._clientVersion }); - }); - } - $queryRawUnsafe(n, ...i) { - return this._createPrismaPromise((o) => this.$queryRawInternal(o, "$queryRawUnsafe", [n, ...i])); - } - _transactionWithArray({ promises: n, options: i }) { - let o = Wp.nextId(), s = ba(n.length), a = n.map((l, u) => { - if (l?.[Symbol.toStringTag] !== "PrismaPromise") - throw new Error("All elements of the array need to be Prisma Client promises. Hint: Please make sure you are not awaiting the Prisma client calls you intended to pass in the $transaction function."); - let c = i?.isolationLevel, p = { kind: "batch", id: o, index: u, isolationLevel: c, lock: s }; - return l.requestTransaction?.(p) ?? l; - }); - return La(a); - } - async _transactionWithCallback({ callback: n, options: i }) { - let o = { traceparent: this._tracingHelper.getTraceParent() }, s = await this._engine.transaction("start", o, i), a; - try { - let l = { kind: "itx", ...s }; - a = await n(this._createItxClient(l)), await this._engine.transaction("commit", o, s); - } catch (l) { - throw await this._engine.transaction("rollback", o, s).catch(() => { - }), l; - } - return a; - } - _createItxClient(n) { - return Bt(xe(Lr(this), [re("_appliedParent", () => this._appliedParent._createItxClient(n)), re("_createPrismaPromise", () => ai(n)), re(Gp, () => n.id), Ot(Pa)])); - } - $transaction(n, i) { - let o; - typeof n == "function" ? o = () => this._transactionWithCallback({ callback: n, options: i }) : o = () => this._transactionWithArray({ promises: n, options: i }); - let s = { name: "transaction", attributes: { method: "$transaction" } }; - return this._tracingHelper.runInChildSpan(s, o); - } - _request(n) { - n.otelParentCtx = this._tracingHelper.getActiveContext(); - let i = n.middlewareArgsMapper ?? Jp, o = { args: i.requestArgsToMiddlewareArgs(n.args), dataPath: n.dataPath, runInTransaction: Boolean(n.transaction), action: n.action, model: n.model }, s = { middleware: { name: "middleware", middleware: true, attributes: { method: "$use" }, active: false }, operation: { name: "operation", attributes: { method: o.action, model: o.model, name: `${o.model}.${o.action}` } } }, a = -1, l = async (u) => { - let c = this._middlewares.get(++a); - if (c) - return this._tracingHelper.runInChildSpan(s.middleware, (b) => c(u, (E) => (b?.end(), l(E)))); - let { runInTransaction: p, args: d, ...g } = u, y = { ...n, ...g }; - d && (y.args = i.middlewareArgsToRequestArgs(d)), n.transaction !== void 0 && p === false && delete y.transaction; - let f = await qs(this, y); - return y.model ? Is({ result: f, modelName: y.model, args: y.args, extensions: this._extensions, runtimeDataModel: this._runtimeDataModel }) : f; - }; - return this._tracingHelper.runInChildSpan(s.operation, () => new qa.AsyncResource("prisma-client-request").runInAsyncScope(() => l(o))); - } - async _executeRequest({ args: n, clientMethod: i, dataPath: o, callsite: s, action: a, model: l, argsMapper: u, transaction: c, unpacker: p, otelParentCtx: d, customDataProxyFetch: g }) { - try { - n = u ? u(n) : n; - let y = { name: "serialize" }, f = this._tracingHelper.runInChildSpan(y, () => oa({ modelName: l, runtimeDataModel: this._runtimeDataModel, action: a, args: n, clientMethod: i, callsite: s, extensions: this._extensions, errorFormat: this._errorFormat, clientVersion: this._clientVersion })); - return N.enabled("prisma:client") && (Te("Prisma Client call:"), Te(`prisma.${i}(${fs(n)})`), Te("Generated request:"), Te(JSON.stringify(f, null, 2) + ` -`)), c?.kind === "batch" && await c.lock, this._fetcher.request({ protocolQuery: f, modelName: l, action: a, clientMethod: i, dataPath: o, callsite: s, args: n, extensions: this._extensions, transaction: c, unpacker: p, otelParentCtx: d, otelChildCtx: this._tracingHelper.getActiveContext(), customDataProxyFetch: g }); - } catch (y) { - throw y.clientVersion = this._clientVersion, y; - } - } - get $metrics() { - if (!this._hasPreviewFlag("metrics")) - throw new te("`metrics` preview feature must be enabled in order to access metrics API", { clientVersion: this._clientVersion }); - return this._metrics; - } - _hasPreviewFlag(n) { - return !!this._engineConfig.previewFeatures?.includes(n); - } - } - return t; - } - function $a(e, t) { - return Hp(e) ? [new U(e, t), fa] : [e, ga]; - } - function Hp(e) { - return Array.isArray(e) && Array.isArray(e.raw); - } - var zp = /* @__PURE__ */ new Set(["toJSON", "$$typeof", "asymmetricMatch", Symbol.iterator, Symbol.toStringTag, Symbol.isConcatSpreadable, Symbol.toPrimitive]); - function Va(e) { - return new Proxy(e, { get(t, r) { - if (r in t) - return t[r]; - if (!zp.has(r)) - throw new TypeError(`Invalid enum value: ${String(r)}`); - } }); - } - function Ua(e) { - Ct(e, { conflictCheck: "warn" }); - } - } -}); - -// node_modules/.prisma/client/index.js -var require_client2 = __commonJS({ - "node_modules/.prisma/client/index.js"(exports2) { - Object.defineProperty(exports2, "__esModule", { value: true }); - var { - PrismaClientKnownRequestError: PrismaClientKnownRequestError2, - PrismaClientUnknownRequestError: PrismaClientUnknownRequestError2, - PrismaClientRustPanicError: PrismaClientRustPanicError2, - PrismaClientInitializationError: PrismaClientInitializationError2, - PrismaClientValidationError: PrismaClientValidationError2, - NotFoundError: NotFoundError2, - getPrismaClient: getPrismaClient2, - sqltag: sqltag2, - empty: empty2, - join: join2, - raw: raw2, - Decimal: Decimal2, - Debug: Debug2, - objectEnumValues: objectEnumValues2, - makeStrictEnum: makeStrictEnum2, - Extensions: Extensions2, - warnOnce: warnOnce2, - defineDmmfProperty: defineDmmfProperty2, - Public: Public2 - } = require_library(); - var Prisma2 = {}; - exports2.Prisma = Prisma2; - Prisma2.prismaVersion = { - client: "5.1.0", - engine: "6a3747c37ff169c90047725a05a6ef02e32ac97e" - }; - Prisma2.PrismaClientKnownRequestError = PrismaClientKnownRequestError2; - Prisma2.PrismaClientUnknownRequestError = PrismaClientUnknownRequestError2; - Prisma2.PrismaClientRustPanicError = PrismaClientRustPanicError2; - Prisma2.PrismaClientInitializationError = PrismaClientInitializationError2; - Prisma2.PrismaClientValidationError = PrismaClientValidationError2; - Prisma2.NotFoundError = NotFoundError2; - Prisma2.Decimal = Decimal2; - Prisma2.sql = sqltag2; - Prisma2.empty = empty2; - Prisma2.join = join2; - Prisma2.raw = raw2; - Prisma2.validator = Public2.validator; - Prisma2.getExtensionContext = Extensions2.getExtensionContext; - Prisma2.defineExtension = Extensions2.defineExtension; - Prisma2.DbNull = objectEnumValues2.instances.DbNull; - Prisma2.JsonNull = objectEnumValues2.instances.JsonNull; - Prisma2.AnyNull = objectEnumValues2.instances.AnyNull; - Prisma2.NullTypes = { - DbNull: objectEnumValues2.classes.DbNull, - JsonNull: objectEnumValues2.classes.JsonNull, - AnyNull: objectEnumValues2.classes.AnyNull - }; - var path = require("path"); - exports2.$Enums = {}; - exports2.Prisma.TransactionIsolationLevel = makeStrictEnum2({ - ReadUncommitted: "ReadUncommitted", - ReadCommitted: "ReadCommitted", - RepeatableRead: "RepeatableRead", - Serializable: "Serializable" - }); - exports2.Prisma.NotificationScalarFieldEnum = { - id: "id", - title: "title", - message: "message", - message_type: "message_type" - }; - exports2.Prisma.SortOrder = { - asc: "asc", - desc: "desc" - }; - exports2.Prisma.QueryMode = { - default: "default", - insensitive: "insensitive" - }; - exports2.MessageType = exports2.$Enums.MessageType = { - USER_REQUEST: "USER_REQUEST", - OUTPUT: "OUTPUT" - }; - exports2.Prisma.ModelName = { - Notification: "Notification" - }; - var config2 = { - "generator": { - "name": "client", - "provider": { - "fromEnvVar": null, - "value": "prisma-client-js" - }, - "output": { - "value": "/home/pierre/public_html/goodfood/services/notification/node_modules/@prisma/client", - "fromEnvVar": null - }, - "config": { - "engineType": "library" - }, - "binaryTargets": [ - { - "fromEnvVar": null, - "value": "debian-openssl-3.0.x", - "native": true - } - ], - "previewFeatures": [] - }, - "relativeEnvPaths": { - "rootEnvPath": "../../../.env", - "schemaEnvPath": "../../../.env" - }, - "relativePath": "../../../prisma", - "clientVersion": "5.1.0", - "engineVersion": "6a3747c37ff169c90047725a05a6ef02e32ac97e", - "datasourceNames": [ - "db" - ], - "activeProvider": "postgresql", - "dataProxy": false, - "postinstall": false - }; - var fs2 = require("fs"); - config2.dirname = __dirname; - if (!fs2.existsSync(path.join(__dirname, "schema.prisma"))) { - const alternativePaths = [ - "node_modules/.prisma/client", - ".prisma/client" - ]; - const alternativePath = alternativePaths.find((altPath) => { - return fs2.existsSync(path.join(process.cwd(), altPath, "schema.prisma")); - }) ?? alternativePaths[0]; - config2.dirname = path.join(process.cwd(), alternativePath); - config2.isBundled = true; - } - config2.runtimeDataModel = JSON.parse('{"models":{"Notification":{"dbName":null,"fields":[{"name":"id","kind":"scalar","isList":false,"isRequired":true,"isUnique":false,"isId":true,"isReadOnly":false,"hasDefaultValue":true,"type":"String","default":{"name":"cuid","args":[]},"isGenerated":false,"isUpdatedAt":false},{"name":"title","kind":"scalar","isList":false,"isRequired":true,"isUnique":false,"isId":false,"isReadOnly":false,"hasDefaultValue":false,"type":"String","isGenerated":false,"isUpdatedAt":false},{"name":"message","kind":"scalar","isList":false,"isRequired":true,"isUnique":false,"isId":false,"isReadOnly":false,"hasDefaultValue":false,"type":"String","isGenerated":false,"isUpdatedAt":false},{"name":"message_type","kind":"enum","isList":false,"isRequired":true,"isUnique":false,"isId":false,"isReadOnly":false,"hasDefaultValue":false,"type":"MessageType","isGenerated":false,"isUpdatedAt":false}],"primaryKey":null,"uniqueFields":[],"uniqueIndexes":[],"isGenerated":false}},"enums":{"MessageType":{"values":[{"name":"USER_REQUEST","dbName":null},{"name":"OUTPUT","dbName":null}],"dbName":null}},"types":{}}'); - defineDmmfProperty2(exports2.Prisma, config2.runtimeDataModel); - var { warnEnvConflicts: warnEnvConflicts2 } = require_library(); - warnEnvConflicts2({ - rootEnvPath: config2.relativeEnvPaths.rootEnvPath && path.resolve(config2.dirname, config2.relativeEnvPaths.rootEnvPath), - schemaEnvPath: config2.relativeEnvPaths.schemaEnvPath && path.resolve(config2.dirname, config2.relativeEnvPaths.schemaEnvPath) - }); - var PrismaClient2 = getPrismaClient2(config2); - exports2.PrismaClient = PrismaClient2; - Object.assign(exports2, Prisma2); - path.join(__dirname, "libquery_engine-debian-openssl-3.0.x.so.node"); - path.join(process.cwd(), "node_modules/.prisma/client/libquery_engine-debian-openssl-3.0.x.so.node"); - path.join(__dirname, "schema.prisma"); - path.join(process.cwd(), "node_modules/.prisma/client/schema.prisma"); - } -}); - -// node_modules/@prisma/client/index.js -var require_client3 = __commonJS({ - "node_modules/@prisma/client/index.js"(exports2, module2) { - module2.exports = { - ...require_client2() - }; - } -}); - -// node_modules/requires-port/index.js -var require_requires_port = __commonJS({ - "node_modules/requires-port/index.js"(exports2, module2) { - "use strict"; - module2.exports = function required(port, protocol) { - protocol = protocol.split(":")[0]; - port = +port; - if (!port) - return false; - switch (protocol) { - case "http": - case "ws": - return port !== 80; - case "https": - case "wss": - return port !== 443; - case "ftp": - return port !== 21; - case "gopher": - return port !== 70; - case "file": - return false; - } - return port !== 0; - }; - } -}); - -// node_modules/querystringify/index.js -var require_querystringify = __commonJS({ - "node_modules/querystringify/index.js"(exports2) { - "use strict"; - var has = Object.prototype.hasOwnProperty; - var undef; - function decode(input) { - try { - return decodeURIComponent(input.replace(/\+/g, " ")); - } catch (e) { - return null; - } - } - function encode(input) { - try { - return encodeURIComponent(input); - } catch (e) { - return null; - } - } - function querystring(query) { - var parser = /([^=?#&]+)=?([^&]*)/g, result = {}, part; - while (part = parser.exec(query)) { - var key = decode(part[1]), value = decode(part[2]); - if (key === null || value === null || key in result) - continue; - result[key] = value; - } - return result; - } - function querystringify(obj, prefix) { - prefix = prefix || ""; - var pairs = [], value, key; - if ("string" !== typeof prefix) - prefix = "?"; - for (key in obj) { - if (has.call(obj, key)) { - value = obj[key]; - if (!value && (value === null || value === undef || isNaN(value))) { - value = ""; - } - key = encode(key); - value = encode(value); - if (key === null || value === null) - continue; - pairs.push(key + "=" + value); - } - } - return pairs.length ? prefix + pairs.join("&") : ""; - } - exports2.stringify = querystringify; - exports2.parse = querystring; - } -}); - -// node_modules/url-parse/index.js -var require_url_parse = __commonJS({ - "node_modules/url-parse/index.js"(exports2, module2) { - "use strict"; - var required = require_requires_port(); - var qs2 = require_querystringify(); - var controlOrWhitespace = /^[\x00-\x20\u00a0\u1680\u2000-\u200a\u2028\u2029\u202f\u205f\u3000\ufeff]+/; - var CRHTLF = /[\n\r\t]/g; - var slashes = /^[A-Za-z][A-Za-z0-9+-.]*:\/\//; - var port = /:\d+$/; - var protocolre = /^([a-z][a-z0-9.+-]*:)?(\/\/)?([\\/]+)?([\S\s]*)/i; - var windowsDriveLetter = /^[a-zA-Z]:/; - function trimLeft(str) { - return (str ? str : "").toString().replace(controlOrWhitespace, ""); - } - var rules = [ - ["#", "hash"], - // Extract from the back. - ["?", "query"], - // Extract from the back. - function sanitize(address, url) { - return isSpecial(url.protocol) ? address.replace(/\\/g, "/") : address; - }, - ["/", "pathname"], - // Extract from the back. - ["@", "auth", 1], - // Extract from the front. - [NaN, "host", void 0, 1, 1], - // Set left over value. - [/:(\d*)$/, "port", void 0, 1], - // RegExp the back. - [NaN, "hostname", void 0, 1, 1] - // Set left over. - ]; - var ignore = { hash: 1, query: 1 }; - function lolcation(loc) { - var globalVar; - if (typeof window !== "undefined") - globalVar = window; - else if (typeof global !== "undefined") - globalVar = global; - else if (typeof self !== "undefined") - globalVar = self; - else - globalVar = {}; - var location = globalVar.location || {}; - loc = loc || location; - var finaldestination = {}, type = typeof loc, key; - if ("blob:" === loc.protocol) { - finaldestination = new Url(unescape(loc.pathname), {}); - } else if ("string" === type) { - finaldestination = new Url(loc, {}); - for (key in ignore) - delete finaldestination[key]; - } else if ("object" === type) { - for (key in loc) { - if (key in ignore) - continue; - finaldestination[key] = loc[key]; - } - if (finaldestination.slashes === void 0) { - finaldestination.slashes = slashes.test(loc.href); - } - } - return finaldestination; - } - function isSpecial(scheme) { - return scheme === "file:" || scheme === "ftp:" || scheme === "http:" || scheme === "https:" || scheme === "ws:" || scheme === "wss:"; - } - function extractProtocol(address, location) { - address = trimLeft(address); - address = address.replace(CRHTLF, ""); - location = location || {}; - var match = protocolre.exec(address); - var protocol = match[1] ? match[1].toLowerCase() : ""; - var forwardSlashes = !!match[2]; - var otherSlashes = !!match[3]; - var slashesCount = 0; - var rest; - if (forwardSlashes) { - if (otherSlashes) { - rest = match[2] + match[3] + match[4]; - slashesCount = match[2].length + match[3].length; - } else { - rest = match[2] + match[4]; - slashesCount = match[2].length; - } - } else { - if (otherSlashes) { - rest = match[3] + match[4]; - slashesCount = match[3].length; - } else { - rest = match[4]; - } - } - if (protocol === "file:") { - if (slashesCount >= 2) { - rest = rest.slice(2); - } - } else if (isSpecial(protocol)) { - rest = match[4]; - } else if (protocol) { - if (forwardSlashes) { - rest = rest.slice(2); - } - } else if (slashesCount >= 2 && isSpecial(location.protocol)) { - rest = match[4]; - } - return { - protocol, - slashes: forwardSlashes || isSpecial(protocol), - slashesCount, - rest - }; - } - function resolve(relative, base) { - if (relative === "") - return base; - var path = (base || "/").split("/").slice(0, -1).concat(relative.split("/")), i = path.length, last = path[i - 1], unshift = false, up2 = 0; - while (i--) { - if (path[i] === ".") { - path.splice(i, 1); - } else if (path[i] === "..") { - path.splice(i, 1); - up2++; - } else if (up2) { - if (i === 0) - unshift = true; - path.splice(i, 1); - up2--; - } - } - if (unshift) - path.unshift(""); - if (last === "." || last === "..") - path.push(""); - return path.join("/"); - } - function Url(address, location, parser) { - address = trimLeft(address); - address = address.replace(CRHTLF, ""); - if (!(this instanceof Url)) { - return new Url(address, location, parser); - } - var relative, extracted, parse, instruction, index, key, instructions = rules.slice(), type = typeof location, url = this, i = 0; - if ("object" !== type && "string" !== type) { - parser = location; - location = null; - } - if (parser && "function" !== typeof parser) - parser = qs2.parse; - location = lolcation(location); - extracted = extractProtocol(address || "", location); - relative = !extracted.protocol && !extracted.slashes; - url.slashes = extracted.slashes || relative && location.slashes; - url.protocol = extracted.protocol || location.protocol || ""; - address = extracted.rest; - if (extracted.protocol === "file:" && (extracted.slashesCount !== 2 || windowsDriveLetter.test(address)) || !extracted.slashes && (extracted.protocol || extracted.slashesCount < 2 || !isSpecial(url.protocol))) { - instructions[3] = [/(.*)/, "pathname"]; - } - for (; i < instructions.length; i++) { - instruction = instructions[i]; - if (typeof instruction === "function") { - address = instruction(address, url); - continue; - } - parse = instruction[0]; - key = instruction[1]; - if (parse !== parse) { - url[key] = address; - } else if ("string" === typeof parse) { - index = parse === "@" ? address.lastIndexOf(parse) : address.indexOf(parse); - if (~index) { - if ("number" === typeof instruction[2]) { - url[key] = address.slice(0, index); - address = address.slice(index + instruction[2]); - } else { - url[key] = address.slice(index); - address = address.slice(0, index); - } - } - } else if (index = parse.exec(address)) { - url[key] = index[1]; - address = address.slice(0, index.index); - } - url[key] = url[key] || (relative && instruction[3] ? location[key] || "" : ""); - if (instruction[4]) - url[key] = url[key].toLowerCase(); - } - if (parser) - url.query = parser(url.query); - if (relative && location.slashes && url.pathname.charAt(0) !== "/" && (url.pathname !== "" || location.pathname !== "")) { - url.pathname = resolve(url.pathname, location.pathname); - } - if (url.pathname.charAt(0) !== "/" && isSpecial(url.protocol)) { - url.pathname = "/" + url.pathname; - } - if (!required(url.port, url.protocol)) { - url.host = url.hostname; - url.port = ""; - } - url.username = url.password = ""; - if (url.auth) { - index = url.auth.indexOf(":"); - if (~index) { - url.username = url.auth.slice(0, index); - url.username = encodeURIComponent(decodeURIComponent(url.username)); - url.password = url.auth.slice(index + 1); - url.password = encodeURIComponent(decodeURIComponent(url.password)); - } else { - url.username = encodeURIComponent(decodeURIComponent(url.auth)); - } - url.auth = url.password ? url.username + ":" + url.password : url.username; - } - url.origin = url.protocol !== "file:" && isSpecial(url.protocol) && url.host ? url.protocol + "//" + url.host : "null"; - url.href = url.toString(); - } - function set(part, value, fn) { - var url = this; - switch (part) { - case "query": - if ("string" === typeof value && value.length) { - value = (fn || qs2.parse)(value); - } - url[part] = value; - break; - case "port": - url[part] = value; - if (!required(value, url.protocol)) { - url.host = url.hostname; - url[part] = ""; - } else if (value) { - url.host = url.hostname + ":" + value; - } - break; - case "hostname": - url[part] = value; - if (url.port) - value += ":" + url.port; - url.host = value; - break; - case "host": - url[part] = value; - if (port.test(value)) { - value = value.split(":"); - url.port = value.pop(); - url.hostname = value.join(":"); - } else { - url.hostname = value; - url.port = ""; - } - break; - case "protocol": - url.protocol = value.toLowerCase(); - url.slashes = !fn; - break; - case "pathname": - case "hash": - if (value) { - var char = part === "pathname" ? "/" : "#"; - url[part] = value.charAt(0) !== char ? char + value : value; - } else { - url[part] = value; - } - break; - case "username": - case "password": - url[part] = encodeURIComponent(value); - break; - case "auth": - var index = value.indexOf(":"); - if (~index) { - url.username = value.slice(0, index); - url.username = encodeURIComponent(decodeURIComponent(url.username)); - url.password = value.slice(index + 1); - url.password = encodeURIComponent(decodeURIComponent(url.password)); - } else { - url.username = encodeURIComponent(decodeURIComponent(value)); - } - } - for (var i = 0; i < rules.length; i++) { - var ins = rules[i]; - if (ins[4]) - url[ins[1]] = url[ins[1]].toLowerCase(); - } - url.auth = url.password ? url.username + ":" + url.password : url.username; - url.origin = url.protocol !== "file:" && isSpecial(url.protocol) && url.host ? url.protocol + "//" + url.host : "null"; - url.href = url.toString(); - return url; - } - function toString(stringify) { - if (!stringify || "function" !== typeof stringify) - stringify = qs2.stringify; - var query, url = this, host = url.host, protocol = url.protocol; - if (protocol && protocol.charAt(protocol.length - 1) !== ":") - protocol += ":"; - var result = protocol + (url.protocol && url.slashes || isSpecial(url.protocol) ? "//" : ""); - if (url.username) { - result += url.username; - if (url.password) - result += ":" + url.password; - result += "@"; - } else if (url.password) { - result += ":" + url.password; - result += "@"; - } else if (url.protocol !== "file:" && isSpecial(url.protocol) && !host && url.pathname !== "/") { - result += "@"; - } - if (host[host.length - 1] === ":" || port.test(url.hostname) && !url.port) { - host += ":"; - } - result += host + url.pathname; - query = "object" === typeof url.query ? stringify(url.query) : url.query; - if (query) - result += "?" !== query.charAt(0) ? "?" + query : query; - if (url.hash) - result += url.hash; - return result; - } - Url.prototype = { set, toString }; - Url.extractProtocol = extractProtocol; - Url.location = lolcation; - Url.trimLeft = trimLeft; - Url.qs = qs2; - module2.exports = Url; - } -}); - -// node_modules/buffer-more-ints/buffer-more-ints.js -var require_buffer_more_ints = __commonJS({ - "node_modules/buffer-more-ints/buffer-more-ints.js"(exports2, module2) { - "use strict"; - var SHIFT_LEFT_32 = (1 << 16) * (1 << 16); - var SHIFT_RIGHT_32 = 1 / SHIFT_LEFT_32; - var MAX_INT = 9007199254740991; - function isContiguousInt(val) { - return val <= MAX_INT && val >= -MAX_INT; - } - function assertContiguousInt(val) { - if (!isContiguousInt(val)) { - throw new TypeError("number cannot be represented as a contiguous integer"); - } - } - module2.exports.isContiguousInt = isContiguousInt; - module2.exports.assertContiguousInt = assertContiguousInt; - ["UInt", "Int"].forEach(function(sign) { - var suffix = sign + "8"; - module2.exports["read" + suffix] = Buffer.prototype["read" + suffix].call; - module2.exports["write" + suffix] = Buffer.prototype["write" + suffix].call; - ["16", "32"].forEach(function(size) { - ["LE", "BE"].forEach(function(endian) { - var suffix2 = sign + size + endian; - var read = Buffer.prototype["read" + suffix2]; - module2.exports["read" + suffix2] = function(buf, offset) { - return read.call(buf, offset); - }; - var write = Buffer.prototype["write" + suffix2]; - module2.exports["write" + suffix2] = function(buf, val, offset) { - return write.call(buf, val, offset); - }; - }); - }); - }); - function check_value(val, min, max) { - val = +val; - if (typeof val != "number" || val < min || val > max || Math.floor(val) !== val) { - throw new TypeError('"value" argument is out of bounds'); - } - return val; - } - function check_bounds(buf, offset, len) { - if (offset < 0 || offset + len > buf.length) { - throw new RangeError("Index out of range"); - } - } - function readUInt24BE(buf, offset) { - return buf.readUInt8(offset) << 16 | buf.readUInt16BE(offset + 1); - } - module2.exports.readUInt24BE = readUInt24BE; - function writeUInt24BE(buf, val, offset) { - val = check_value(val, 0, 16777215); - check_bounds(buf, offset, 3); - buf.writeUInt8(val >>> 16, offset); - buf.writeUInt16BE(val & 65535, offset + 1); - } - module2.exports.writeUInt24BE = writeUInt24BE; - function readUInt40BE(buf, offset) { - return (buf.readUInt8(offset) || 0) * SHIFT_LEFT_32 + buf.readUInt32BE(offset + 1); - } - module2.exports.readUInt40BE = readUInt40BE; - function writeUInt40BE(buf, val, offset) { - val = check_value(val, 0, 1099511627775); - check_bounds(buf, offset, 5); - buf.writeUInt8(Math.floor(val * SHIFT_RIGHT_32), offset); - buf.writeInt32BE(val & -1, offset + 1); - } - module2.exports.writeUInt40BE = writeUInt40BE; - function readUInt48BE(buf, offset) { - return buf.readUInt16BE(offset) * SHIFT_LEFT_32 + buf.readUInt32BE(offset + 2); - } - module2.exports.readUInt48BE = readUInt48BE; - function writeUInt48BE(buf, val, offset) { - val = check_value(val, 0, 281474976710655); - check_bounds(buf, offset, 6); - buf.writeUInt16BE(Math.floor(val * SHIFT_RIGHT_32), offset); - buf.writeInt32BE(val & -1, offset + 2); - } - module2.exports.writeUInt48BE = writeUInt48BE; - function readUInt56BE(buf, offset) { - return ((buf.readUInt8(offset) || 0) << 16 | buf.readUInt16BE(offset + 1)) * SHIFT_LEFT_32 + buf.readUInt32BE(offset + 3); - } - module2.exports.readUInt56BE = readUInt56BE; - function writeUInt56BE(buf, val, offset) { - val = check_value(val, 0, 72057594037927940); - check_bounds(buf, offset, 7); - if (val < 72057594037927940) { - var hi2 = Math.floor(val * SHIFT_RIGHT_32); - buf.writeUInt8(hi2 >>> 16, offset); - buf.writeUInt16BE(hi2 & 65535, offset + 1); - buf.writeInt32BE(val & -1, offset + 3); - } else { - buf[offset] = 255; - buf[offset + 1] = 255; - buf[offset + 2] = 255; - buf[offset + 3] = 255; - buf[offset + 4] = 255; - buf[offset + 5] = 255; - buf[offset + 6] = 255; - } - } - module2.exports.writeUInt56BE = writeUInt56BE; - function readUInt64BE(buf, offset) { - return buf.readUInt32BE(offset) * SHIFT_LEFT_32 + buf.readUInt32BE(offset + 4); - } - module2.exports.readUInt64BE = readUInt64BE; - function writeUInt64BE(buf, val, offset) { - val = check_value(val, 0, 18446744073709552e3); - check_bounds(buf, offset, 8); - if (val < 18446744073709552e3) { - buf.writeUInt32BE(Math.floor(val * SHIFT_RIGHT_32), offset); - buf.writeInt32BE(val & -1, offset + 4); - } else { - buf[offset] = 255; - buf[offset + 1] = 255; - buf[offset + 2] = 255; - buf[offset + 3] = 255; - buf[offset + 4] = 255; - buf[offset + 5] = 255; - buf[offset + 6] = 255; - buf[offset + 7] = 255; - } - } - module2.exports.writeUInt64BE = writeUInt64BE; - function readUInt24LE(buf, offset) { - return buf.readUInt8(offset + 2) << 16 | buf.readUInt16LE(offset); - } - module2.exports.readUInt24LE = readUInt24LE; - function writeUInt24LE(buf, val, offset) { - val = check_value(val, 0, 16777215); - check_bounds(buf, offset, 3); - buf.writeUInt16LE(val & 65535, offset); - buf.writeUInt8(val >>> 16, offset + 2); - } - module2.exports.writeUInt24LE = writeUInt24LE; - function readUInt40LE(buf, offset) { - return (buf.readUInt8(offset + 4) || 0) * SHIFT_LEFT_32 + buf.readUInt32LE(offset); - } - module2.exports.readUInt40LE = readUInt40LE; - function writeUInt40LE(buf, val, offset) { - val = check_value(val, 0, 1099511627775); - check_bounds(buf, offset, 5); - buf.writeInt32LE(val & -1, offset); - buf.writeUInt8(Math.floor(val * SHIFT_RIGHT_32), offset + 4); - } - module2.exports.writeUInt40LE = writeUInt40LE; - function readUInt48LE(buf, offset) { - return buf.readUInt16LE(offset + 4) * SHIFT_LEFT_32 + buf.readUInt32LE(offset); - } - module2.exports.readUInt48LE = readUInt48LE; - function writeUInt48LE(buf, val, offset) { - val = check_value(val, 0, 281474976710655); - check_bounds(buf, offset, 6); - buf.writeInt32LE(val & -1, offset); - buf.writeUInt16LE(Math.floor(val * SHIFT_RIGHT_32), offset + 4); - } - module2.exports.writeUInt48LE = writeUInt48LE; - function readUInt56LE(buf, offset) { - return ((buf.readUInt8(offset + 6) || 0) << 16 | buf.readUInt16LE(offset + 4)) * SHIFT_LEFT_32 + buf.readUInt32LE(offset); - } - module2.exports.readUInt56LE = readUInt56LE; - function writeUInt56LE(buf, val, offset) { - val = check_value(val, 0, 72057594037927940); - check_bounds(buf, offset, 7); - if (val < 72057594037927940) { - buf.writeInt32LE(val & -1, offset); - var hi2 = Math.floor(val * SHIFT_RIGHT_32); - buf.writeUInt16LE(hi2 & 65535, offset + 4); - buf.writeUInt8(hi2 >>> 16, offset + 6); - } else { - buf[offset] = 255; - buf[offset + 1] = 255; - buf[offset + 2] = 255; - buf[offset + 3] = 255; - buf[offset + 4] = 255; - buf[offset + 5] = 255; - buf[offset + 6] = 255; - } - } - module2.exports.writeUInt56LE = writeUInt56LE; - function readUInt64LE(buf, offset) { - return buf.readUInt32LE(offset + 4) * SHIFT_LEFT_32 + buf.readUInt32LE(offset); - } - module2.exports.readUInt64LE = readUInt64LE; - function writeUInt64LE(buf, val, offset) { - val = check_value(val, 0, 18446744073709552e3); - check_bounds(buf, offset, 8); - if (val < 18446744073709552e3) { - buf.writeInt32LE(val & -1, offset); - buf.writeUInt32LE(Math.floor(val * SHIFT_RIGHT_32), offset + 4); - } else { - buf[offset] = 255; - buf[offset + 1] = 255; - buf[offset + 2] = 255; - buf[offset + 3] = 255; - buf[offset + 4] = 255; - buf[offset + 5] = 255; - buf[offset + 6] = 255; - buf[offset + 7] = 255; - } - } - module2.exports.writeUInt64LE = writeUInt64LE; - function readInt24BE(buf, offset) { - return (buf.readInt8(offset) << 16) + buf.readUInt16BE(offset + 1); - } - module2.exports.readInt24BE = readInt24BE; - function writeInt24BE(buf, val, offset) { - val = check_value(val, -8388608, 8388607); - check_bounds(buf, offset, 3); - buf.writeInt8(val >> 16, offset); - buf.writeUInt16BE(val & 65535, offset + 1); - } - module2.exports.writeInt24BE = writeInt24BE; - function readInt40BE(buf, offset) { - return (buf.readInt8(offset) || 0) * SHIFT_LEFT_32 + buf.readUInt32BE(offset + 1); - } - module2.exports.readInt40BE = readInt40BE; - function writeInt40BE(buf, val, offset) { - val = check_value(val, -549755813888, 549755813887); - check_bounds(buf, offset, 5); - buf.writeInt8(Math.floor(val * SHIFT_RIGHT_32), offset); - buf.writeInt32BE(val & -1, offset + 1); - } - module2.exports.writeInt40BE = writeInt40BE; - function readInt48BE(buf, offset) { - return buf.readInt16BE(offset) * SHIFT_LEFT_32 + buf.readUInt32BE(offset + 2); - } - module2.exports.readInt48BE = readInt48BE; - function writeInt48BE(buf, val, offset) { - val = check_value(val, -140737488355328, 140737488355327); - check_bounds(buf, offset, 6); - buf.writeInt16BE(Math.floor(val * SHIFT_RIGHT_32), offset); - buf.writeInt32BE(val & -1, offset + 2); - } - module2.exports.writeInt48BE = writeInt48BE; - function readInt56BE(buf, offset) { - return (((buf.readInt8(offset) || 0) << 16) + buf.readUInt16BE(offset + 1)) * SHIFT_LEFT_32 + buf.readUInt32BE(offset + 3); - } - module2.exports.readInt56BE = readInt56BE; - function writeInt56BE(buf, val, offset) { - val = check_value(val, -576460752303423500, 36028797018963970); - check_bounds(buf, offset, 7); - if (val < 36028797018963970) { - var hi2 = Math.floor(val * SHIFT_RIGHT_32); - buf.writeInt8(hi2 >> 16, offset); - buf.writeUInt16BE(hi2 & 65535, offset + 1); - buf.writeInt32BE(val & -1, offset + 3); - } else { - buf[offset] = 127; - buf[offset + 1] = 255; - buf[offset + 2] = 255; - buf[offset + 3] = 255; - buf[offset + 4] = 255; - buf[offset + 5] = 255; - buf[offset + 6] = 255; - } - } - module2.exports.writeInt56BE = writeInt56BE; - function readInt64BE(buf, offset) { - return buf.readInt32BE(offset) * SHIFT_LEFT_32 + buf.readUInt32BE(offset + 4); - } - module2.exports.readInt64BE = readInt64BE; - function writeInt64BE(buf, val, offset) { - val = check_value(val, -23611832414348226e5, 9223372036854776e3); - check_bounds(buf, offset, 8); - if (val < 9223372036854776e3) { - buf.writeInt32BE(Math.floor(val * SHIFT_RIGHT_32), offset); - buf.writeInt32BE(val & -1, offset + 4); - } else { - buf[offset] = 127; - buf[offset + 1] = 255; - buf[offset + 2] = 255; - buf[offset + 3] = 255; - buf[offset + 4] = 255; - buf[offset + 5] = 255; - buf[offset + 6] = 255; - buf[offset + 7] = 255; - } - } - module2.exports.writeInt64BE = writeInt64BE; - function readInt24LE(buf, offset) { - return (buf.readInt8(offset + 2) << 16) + buf.readUInt16LE(offset); - } - module2.exports.readInt24LE = readInt24LE; - function writeInt24LE(buf, val, offset) { - val = check_value(val, -8388608, 8388607); - check_bounds(buf, offset, 3); - buf.writeUInt16LE(val & 65535, offset); - buf.writeInt8(val >> 16, offset + 2); - } - module2.exports.writeInt24LE = writeInt24LE; - function readInt40LE(buf, offset) { - return (buf.readInt8(offset + 4) || 0) * SHIFT_LEFT_32 + buf.readUInt32LE(offset); - } - module2.exports.readInt40LE = readInt40LE; - function writeInt40LE(buf, val, offset) { - val = check_value(val, -549755813888, 549755813887); - check_bounds(buf, offset, 5); - buf.writeInt32LE(val & -1, offset); - buf.writeInt8(Math.floor(val * SHIFT_RIGHT_32), offset + 4); - } - module2.exports.writeInt40LE = writeInt40LE; - function readInt48LE(buf, offset) { - return buf.readInt16LE(offset + 4) * SHIFT_LEFT_32 + buf.readUInt32LE(offset); - } - module2.exports.readInt48LE = readInt48LE; - function writeInt48LE(buf, val, offset) { - val = check_value(val, -140737488355328, 140737488355327); - check_bounds(buf, offset, 6); - buf.writeInt32LE(val & -1, offset); - buf.writeInt16LE(Math.floor(val * SHIFT_RIGHT_32), offset + 4); - } - module2.exports.writeInt48LE = writeInt48LE; - function readInt56LE(buf, offset) { - return (((buf.readInt8(offset + 6) || 0) << 16) + buf.readUInt16LE(offset + 4)) * SHIFT_LEFT_32 + buf.readUInt32LE(offset); - } - module2.exports.readInt56LE = readInt56LE; - function writeInt56LE(buf, val, offset) { - val = check_value(val, -36028797018963970, 36028797018963970); - check_bounds(buf, offset, 7); - if (val < 36028797018963970) { - buf.writeInt32LE(val & -1, offset); - var hi2 = Math.floor(val * SHIFT_RIGHT_32); - buf.writeUInt16LE(hi2 & 65535, offset + 4); - buf.writeInt8(hi2 >> 16, offset + 6); - } else { - buf[offset] = 255; - buf[offset + 1] = 255; - buf[offset + 2] = 255; - buf[offset + 3] = 255; - buf[offset + 4] = 255; - buf[offset + 5] = 255; - buf[offset + 6] = 127; - } - } - module2.exports.writeInt56LE = writeInt56LE; - function readInt64LE(buf, offset) { - return buf.readInt32LE(offset + 4) * SHIFT_LEFT_32 + buf.readUInt32LE(offset); - } - module2.exports.readInt64LE = readInt64LE; - function writeInt64LE(buf, val, offset) { - val = check_value(val, -9223372036854776e3, 9223372036854776e3); - check_bounds(buf, offset, 8); - if (val < 9223372036854776e3) { - buf.writeInt32LE(val & -1, offset); - buf.writeInt32LE(Math.floor(val * SHIFT_RIGHT_32), offset + 4); - } else { - buf[offset] = 255; - buf[offset + 1] = 255; - buf[offset + 2] = 255; - buf[offset + 3] = 255; - buf[offset + 4] = 255; - buf[offset + 5] = 255; - buf[offset + 6] = 255; - buf[offset + 7] = 127; - } - } - module2.exports.writeInt64LE = writeInt64LE; - } -}); - -// node_modules/amqplib/lib/codec.js -var require_codec = __commonJS({ - "node_modules/amqplib/lib/codec.js"(exports2, module2) { - "use strict"; - var ints = require_buffer_more_ints(); - function isFloatingPoint(n) { - return n >= 9223372036854776e3 || Math.abs(n) < 1125899906842624 && Math.floor(n) !== n; - } - function encodeTable(buffer, val, offset) { - var start = offset; - offset += 4; - for (var key in val) { - if (val[key] !== void 0) { - var len = Buffer.byteLength(key); - buffer.writeUInt8(len, offset); - offset++; - buffer.write(key, offset, "utf8"); - offset += len; - offset += encodeFieldValue(buffer, val[key], offset); - } - } - var size = offset - start; - buffer.writeUInt32BE(size - 4, start); - return size; - } - function encodeArray(buffer, val, offset) { - var start = offset; - offset += 4; - for (var i = 0, num = val.length; i < num; i++) { - offset += encodeFieldValue(buffer, val[i], offset); - } - var size = offset - start; - buffer.writeUInt32BE(size - 4, start); - return size; - } - function encodeFieldValue(buffer, value, offset) { - var start = offset; - var type = typeof value, val = value; - if (value && type === "object" && value.hasOwnProperty("!")) { - val = value.value; - type = value["!"]; - } - if (type == "number") { - if (isFloatingPoint(val)) { - type = "double"; - } else { - if (val < 128 && val >= -128) { - type = "byte"; - } else if (val >= -32768 && val < 32768) { - type = "short"; - } else if (val >= -2147483648 && val < 2147483648) { - type = "int"; - } else { - type = "long"; - } - } - } - function tag(t) { - buffer.write(t, offset); - offset++; - } - switch (type) { - case "string": - var len = Buffer.byteLength(val, "utf8"); - tag("S"); - buffer.writeUInt32BE(len, offset); - offset += 4; - buffer.write(val, offset, "utf8"); - offset += len; - break; - case "object": - if (val === null) { - tag("V"); - } else if (Array.isArray(val)) { - tag("A"); - offset += encodeArray(buffer, val, offset); - } else if (Buffer.isBuffer(val)) { - tag("x"); - buffer.writeUInt32BE(val.length, offset); - offset += 4; - val.copy(buffer, offset); - offset += val.length; - } else { - tag("F"); - offset += encodeTable(buffer, val, offset); - } - break; - case "boolean": - tag("t"); - buffer.writeUInt8(val ? 1 : 0, offset); - offset++; - break; - case "double": - case "float64": - tag("d"); - buffer.writeDoubleBE(val, offset); - offset += 8; - break; - case "byte": - case "int8": - tag("b"); - buffer.writeInt8(val, offset); - offset++; - break; - case "short": - case "int16": - tag("s"); - buffer.writeInt16BE(val, offset); - offset += 2; - break; - case "int": - case "int32": - tag("I"); - buffer.writeInt32BE(val, offset); - offset += 4; - break; - case "long": - case "int64": - tag("l"); - ints.writeInt64BE(buffer, val, offset); - offset += 8; - break; - case "timestamp": - tag("T"); - ints.writeUInt64BE(buffer, val, offset); - offset += 8; - break; - case "float": - tag("f"); - buffer.writeFloatBE(val, offset); - offset += 4; - break; - case "decimal": - tag("D"); - if (val.hasOwnProperty("places") && val.hasOwnProperty("digits") && val.places >= 0 && val.places < 256) { - buffer[offset] = val.places; - offset++; - buffer.writeUInt32BE(val.digits, offset); - offset += 4; - } else - throw new TypeError( - "Decimal value must be {'places': 0..255, 'digits': uint32}, got " + JSON.stringify(val) - ); - break; - default: - throw new TypeError("Unknown type to encode: " + type); - } - return offset - start; - } - function decodeFields(slice) { - var fields = {}, offset = 0, size = slice.length; - var len, key, val; - function decodeFieldValue() { - var tag = String.fromCharCode(slice[offset]); - offset++; - switch (tag) { - case "b": - val = slice.readInt8(offset); - offset++; - break; - case "S": - len = slice.readUInt32BE(offset); - offset += 4; - val = slice.toString("utf8", offset, offset + len); - offset += len; - break; - case "I": - val = slice.readInt32BE(offset); - offset += 4; - break; - case "D": - var places = slice[offset]; - offset++; - var digits = slice.readUInt32BE(offset); - offset += 4; - val = { "!": "decimal", value: { places, digits } }; - break; - case "T": - val = ints.readUInt64BE(slice, offset); - offset += 8; - val = { "!": "timestamp", value: val }; - break; - case "F": - len = slice.readUInt32BE(offset); - offset += 4; - val = decodeFields(slice.slice(offset, offset + len)); - offset += len; - break; - case "A": - len = slice.readUInt32BE(offset); - offset += 4; - decodeArray(offset + len); - break; - case "d": - val = slice.readDoubleBE(offset); - offset += 8; - break; - case "f": - val = slice.readFloatBE(offset); - offset += 4; - break; - case "l": - val = ints.readInt64BE(slice, offset); - offset += 8; - break; - case "s": - val = slice.readInt16BE(offset); - offset += 2; - break; - case "t": - val = slice[offset] != 0; - offset++; - break; - case "V": - val = null; - break; - case "x": - len = slice.readUInt32BE(offset); - offset += 4; - val = slice.slice(offset, offset + len); - offset += len; - break; - default: - throw new TypeError('Unexpected type tag "' + tag + '"'); - } - } - function decodeArray(until) { - var vals = []; - while (offset < until) { - decodeFieldValue(); - vals.push(val); - } - val = vals; - } - while (offset < size) { - len = slice.readUInt8(offset); - offset++; - key = slice.toString("utf8", offset, offset + len); - offset += len; - decodeFieldValue(); - fields[key] = val; - } - return fields; - } - module2.exports.encodeTable = encodeTable; - module2.exports.decodeFields = decodeFields; - } -}); - -// node_modules/amqplib/lib/defs.js -var require_defs = __commonJS({ - "node_modules/amqplib/lib/defs.js"(exports2, module2) { - "use strict"; - function decodeConnectionStart(buffer) { - var val, len, offset = 0, fields = { - versionMajor: void 0, - versionMinor: void 0, - serverProperties: void 0, - mechanisms: void 0, - locales: void 0 - }; - val = buffer[offset]; - offset++; - fields.versionMajor = val; - val = buffer[offset]; - offset++; - fields.versionMinor = val; - len = buffer.readUInt32BE(offset); - offset += 4; - val = decodeFields(buffer.slice(offset, offset + len)); - offset += len; - fields.serverProperties = val; - len = buffer.readUInt32BE(offset); - offset += 4; - val = buffer.slice(offset, offset + len); - offset += len; - fields.mechanisms = val; - len = buffer.readUInt32BE(offset); - offset += 4; - val = buffer.slice(offset, offset + len); - offset += len; - fields.locales = val; - return fields; - } - function encodeConnectionStart(channel, fields) { - var len, offset = 0, val = null, varyingSize = 0, scratchOffset = 0; - val = fields.serverProperties; - if (void 0 === val) - throw new Error("Missing value for mandatory field 'serverProperties'"); - if ("object" != typeof val) - throw new TypeError("Field 'serverProperties' is the wrong type; must be an object"); - len = encodeTable(SCRATCH, val, scratchOffset); - var serverProperties_encoded = SCRATCH.slice(scratchOffset, scratchOffset + len); - scratchOffset += len; - varyingSize += serverProperties_encoded.length; - val = fields.mechanisms; - if (void 0 === val) - val = Buffer.from("PLAIN"); - else if (!Buffer.isBuffer(val)) - throw new TypeError("Field 'mechanisms' is the wrong type; must be a Buffer"); - varyingSize += val.length; - val = fields.locales; - if (void 0 === val) - val = Buffer.from("en_US"); - else if (!Buffer.isBuffer(val)) - throw new TypeError("Field 'locales' is the wrong type; must be a Buffer"); - varyingSize += val.length; - var buffer = Buffer.alloc(22 + varyingSize); - buffer[0] = 1; - buffer.writeUInt16BE(channel, 1); - buffer.writeUInt32BE(655370, 7); - offset = 11; - val = fields.versionMajor; - if (void 0 === val) - val = 0; - else if ("number" != typeof val || isNaN(val)) - throw new TypeError("Field 'versionMajor' is the wrong type; must be a number (but not NaN)"); - buffer.writeUInt8(val, offset); - offset++; - val = fields.versionMinor; - if (void 0 === val) - val = 9; - else if ("number" != typeof val || isNaN(val)) - throw new TypeError("Field 'versionMinor' is the wrong type; must be a number (but not NaN)"); - buffer.writeUInt8(val, offset); - offset++; - offset += serverProperties_encoded.copy(buffer, offset); - val = fields.mechanisms; - void 0 === val && (val = Buffer.from("PLAIN")); - len = val.length; - buffer.writeUInt32BE(len, offset); - offset += 4; - val.copy(buffer, offset); - offset += len; - val = fields.locales; - void 0 === val && (val = Buffer.from("en_US")); - len = val.length; - buffer.writeUInt32BE(len, offset); - offset += 4; - val.copy(buffer, offset); - offset += len; - buffer[offset] = 206; - buffer.writeUInt32BE(offset - 7, 3); - return buffer; - } - function decodeConnectionStartOk(buffer) { - var val, len, offset = 0, fields = { - clientProperties: void 0, - mechanism: void 0, - response: void 0, - locale: void 0 - }; - len = buffer.readUInt32BE(offset); - offset += 4; - val = decodeFields(buffer.slice(offset, offset + len)); - offset += len; - fields.clientProperties = val; - len = buffer.readUInt8(offset); - offset++; - val = buffer.toString("utf8", offset, offset + len); - offset += len; - fields.mechanism = val; - len = buffer.readUInt32BE(offset); - offset += 4; - val = buffer.slice(offset, offset + len); - offset += len; - fields.response = val; - len = buffer.readUInt8(offset); - offset++; - val = buffer.toString("utf8", offset, offset + len); - offset += len; - fields.locale = val; - return fields; - } - function encodeConnectionStartOk(channel, fields) { - var len, offset = 0, val = null, varyingSize = 0, scratchOffset = 0; - val = fields.clientProperties; - if (void 0 === val) - throw new Error("Missing value for mandatory field 'clientProperties'"); - if ("object" != typeof val) - throw new TypeError("Field 'clientProperties' is the wrong type; must be an object"); - len = encodeTable(SCRATCH, val, scratchOffset); - var clientProperties_encoded = SCRATCH.slice(scratchOffset, scratchOffset + len); - scratchOffset += len; - varyingSize += clientProperties_encoded.length; - val = fields.mechanism; - if (void 0 === val) - val = "PLAIN"; - else if (!("string" == typeof val && Buffer.byteLength(val) < 256)) - throw new TypeError("Field 'mechanism' is the wrong type; must be a string (up to 255 chars)"); - var mechanism_len = Buffer.byteLength(val, "utf8"); - varyingSize += mechanism_len; - val = fields.response; - if (void 0 === val) - throw new Error("Missing value for mandatory field 'response'"); - if (!Buffer.isBuffer(val)) - throw new TypeError("Field 'response' is the wrong type; must be a Buffer"); - varyingSize += val.length; - val = fields.locale; - if (void 0 === val) - val = "en_US"; - else if (!("string" == typeof val && Buffer.byteLength(val) < 256)) - throw new TypeError("Field 'locale' is the wrong type; must be a string (up to 255 chars)"); - var locale_len = Buffer.byteLength(val, "utf8"); - varyingSize += locale_len; - var buffer = Buffer.alloc(18 + varyingSize); - buffer[0] = 1; - buffer.writeUInt16BE(channel, 1); - buffer.writeUInt32BE(655371, 7); - offset = 11; - offset += clientProperties_encoded.copy(buffer, offset); - val = fields.mechanism; - void 0 === val && (val = "PLAIN"); - buffer[offset] = mechanism_len; - offset++; - buffer.write(val, offset, "utf8"); - offset += mechanism_len; - val = fields.response; - void 0 === val && (val = Buffer.from(void 0)); - len = val.length; - buffer.writeUInt32BE(len, offset); - offset += 4; - val.copy(buffer, offset); - offset += len; - val = fields.locale; - void 0 === val && (val = "en_US"); - buffer[offset] = locale_len; - offset++; - buffer.write(val, offset, "utf8"); - offset += locale_len; - buffer[offset] = 206; - buffer.writeUInt32BE(offset - 7, 3); - return buffer; - } - function decodeConnectionSecure(buffer) { - var val, len, offset = 0, fields = { - challenge: void 0 - }; - len = buffer.readUInt32BE(offset); - offset += 4; - val = buffer.slice(offset, offset + len); - offset += len; - fields.challenge = val; - return fields; - } - function encodeConnectionSecure(channel, fields) { - var len, offset = 0, val = null, varyingSize = 0; - val = fields.challenge; - if (void 0 === val) - throw new Error("Missing value for mandatory field 'challenge'"); - if (!Buffer.isBuffer(val)) - throw new TypeError("Field 'challenge' is the wrong type; must be a Buffer"); - varyingSize += val.length; - var buffer = Buffer.alloc(16 + varyingSize); - buffer[0] = 1; - buffer.writeUInt16BE(channel, 1); - buffer.writeUInt32BE(655380, 7); - offset = 11; - val = fields.challenge; - void 0 === val && (val = Buffer.from(void 0)); - len = val.length; - buffer.writeUInt32BE(len, offset); - offset += 4; - val.copy(buffer, offset); - offset += len; - buffer[offset] = 206; - buffer.writeUInt32BE(offset - 7, 3); - return buffer; - } - function decodeConnectionSecureOk(buffer) { - var val, len, offset = 0, fields = { - response: void 0 - }; - len = buffer.readUInt32BE(offset); - offset += 4; - val = buffer.slice(offset, offset + len); - offset += len; - fields.response = val; - return fields; - } - function encodeConnectionSecureOk(channel, fields) { - var len, offset = 0, val = null, varyingSize = 0; - val = fields.response; - if (void 0 === val) - throw new Error("Missing value for mandatory field 'response'"); - if (!Buffer.isBuffer(val)) - throw new TypeError("Field 'response' is the wrong type; must be a Buffer"); - varyingSize += val.length; - var buffer = Buffer.alloc(16 + varyingSize); - buffer[0] = 1; - buffer.writeUInt16BE(channel, 1); - buffer.writeUInt32BE(655381, 7); - offset = 11; - val = fields.response; - void 0 === val && (val = Buffer.from(void 0)); - len = val.length; - buffer.writeUInt32BE(len, offset); - offset += 4; - val.copy(buffer, offset); - offset += len; - buffer[offset] = 206; - buffer.writeUInt32BE(offset - 7, 3); - return buffer; - } - function decodeConnectionTune(buffer) { - var val, offset = 0, fields = { - channelMax: void 0, - frameMax: void 0, - heartbeat: void 0 - }; - val = buffer.readUInt16BE(offset); - offset += 2; - fields.channelMax = val; - val = buffer.readUInt32BE(offset); - offset += 4; - fields.frameMax = val; - val = buffer.readUInt16BE(offset); - offset += 2; - fields.heartbeat = val; - return fields; - } - function encodeConnectionTune(channel, fields) { - var offset = 0, val = null, buffer = Buffer.alloc(20); - buffer[0] = 1; - buffer.writeUInt16BE(channel, 1); - buffer.writeUInt32BE(655390, 7); - offset = 11; - val = fields.channelMax; - if (void 0 === val) - val = 0; - else if ("number" != typeof val || isNaN(val)) - throw new TypeError("Field 'channelMax' is the wrong type; must be a number (but not NaN)"); - buffer.writeUInt16BE(val, offset); - offset += 2; - val = fields.frameMax; - if (void 0 === val) - val = 0; - else if ("number" != typeof val || isNaN(val)) - throw new TypeError("Field 'frameMax' is the wrong type; must be a number (but not NaN)"); - buffer.writeUInt32BE(val, offset); - offset += 4; - val = fields.heartbeat; - if (void 0 === val) - val = 0; - else if ("number" != typeof val || isNaN(val)) - throw new TypeError("Field 'heartbeat' is the wrong type; must be a number (but not NaN)"); - buffer.writeUInt16BE(val, offset); - offset += 2; - buffer[offset] = 206; - buffer.writeUInt32BE(offset - 7, 3); - return buffer; - } - function decodeConnectionTuneOk(buffer) { - var val, offset = 0, fields = { - channelMax: void 0, - frameMax: void 0, - heartbeat: void 0 - }; - val = buffer.readUInt16BE(offset); - offset += 2; - fields.channelMax = val; - val = buffer.readUInt32BE(offset); - offset += 4; - fields.frameMax = val; - val = buffer.readUInt16BE(offset); - offset += 2; - fields.heartbeat = val; - return fields; - } - function encodeConnectionTuneOk(channel, fields) { - var offset = 0, val = null, buffer = Buffer.alloc(20); - buffer[0] = 1; - buffer.writeUInt16BE(channel, 1); - buffer.writeUInt32BE(655391, 7); - offset = 11; - val = fields.channelMax; - if (void 0 === val) - val = 0; - else if ("number" != typeof val || isNaN(val)) - throw new TypeError("Field 'channelMax' is the wrong type; must be a number (but not NaN)"); - buffer.writeUInt16BE(val, offset); - offset += 2; - val = fields.frameMax; - if (void 0 === val) - val = 0; - else if ("number" != typeof val || isNaN(val)) - throw new TypeError("Field 'frameMax' is the wrong type; must be a number (but not NaN)"); - buffer.writeUInt32BE(val, offset); - offset += 4; - val = fields.heartbeat; - if (void 0 === val) - val = 0; - else if ("number" != typeof val || isNaN(val)) - throw new TypeError("Field 'heartbeat' is the wrong type; must be a number (but not NaN)"); - buffer.writeUInt16BE(val, offset); - offset += 2; - buffer[offset] = 206; - buffer.writeUInt32BE(offset - 7, 3); - return buffer; - } - function decodeConnectionOpen(buffer) { - var val, len, offset = 0, fields = { - virtualHost: void 0, - capabilities: void 0, - insist: void 0 - }; - len = buffer.readUInt8(offset); - offset++; - val = buffer.toString("utf8", offset, offset + len); - offset += len; - fields.virtualHost = val; - len = buffer.readUInt8(offset); - offset++; - val = buffer.toString("utf8", offset, offset + len); - offset += len; - fields.capabilities = val; - val = !!(1 & buffer[offset]); - fields.insist = val; - return fields; - } - function encodeConnectionOpen(channel, fields) { - var offset = 0, val = null, bits = 0, varyingSize = 0; - val = fields.virtualHost; - if (void 0 === val) - val = "/"; - else if (!("string" == typeof val && Buffer.byteLength(val) < 256)) - throw new TypeError("Field 'virtualHost' is the wrong type; must be a string (up to 255 chars)"); - var virtualHost_len = Buffer.byteLength(val, "utf8"); - varyingSize += virtualHost_len; - val = fields.capabilities; - if (void 0 === val) - val = ""; - else if (!("string" == typeof val && Buffer.byteLength(val) < 256)) - throw new TypeError("Field 'capabilities' is the wrong type; must be a string (up to 255 chars)"); - var capabilities_len = Buffer.byteLength(val, "utf8"); - varyingSize += capabilities_len; - var buffer = Buffer.alloc(15 + varyingSize); - buffer[0] = 1; - buffer.writeUInt16BE(channel, 1); - buffer.writeUInt32BE(655400, 7); - offset = 11; - val = fields.virtualHost; - void 0 === val && (val = "/"); - buffer[offset] = virtualHost_len; - offset++; - buffer.write(val, offset, "utf8"); - offset += virtualHost_len; - val = fields.capabilities; - void 0 === val && (val = ""); - buffer[offset] = capabilities_len; - offset++; - buffer.write(val, offset, "utf8"); - offset += capabilities_len; - val = fields.insist; - void 0 === val && (val = false); - val && (bits += 1); - buffer[offset] = bits; - offset++; - buffer[offset] = 206; - buffer.writeUInt32BE(offset - 7, 3); - return buffer; - } - function decodeConnectionOpenOk(buffer) { - var val, len, offset = 0, fields = { - knownHosts: void 0 - }; - len = buffer.readUInt8(offset); - offset++; - val = buffer.toString("utf8", offset, offset + len); - offset += len; - fields.knownHosts = val; - return fields; - } - function encodeConnectionOpenOk(channel, fields) { - var offset = 0, val = null, varyingSize = 0; - val = fields.knownHosts; - if (void 0 === val) - val = ""; - else if (!("string" == typeof val && Buffer.byteLength(val) < 256)) - throw new TypeError("Field 'knownHosts' is the wrong type; must be a string (up to 255 chars)"); - var knownHosts_len = Buffer.byteLength(val, "utf8"); - varyingSize += knownHosts_len; - var buffer = Buffer.alloc(13 + varyingSize); - buffer[0] = 1; - buffer.writeUInt16BE(channel, 1); - buffer.writeUInt32BE(655401, 7); - offset = 11; - val = fields.knownHosts; - void 0 === val && (val = ""); - buffer[offset] = knownHosts_len; - offset++; - buffer.write(val, offset, "utf8"); - offset += knownHosts_len; - buffer[offset] = 206; - buffer.writeUInt32BE(offset - 7, 3); - return buffer; - } - function decodeConnectionClose(buffer) { - var val, len, offset = 0, fields = { - replyCode: void 0, - replyText: void 0, - classId: void 0, - methodId: void 0 - }; - val = buffer.readUInt16BE(offset); - offset += 2; - fields.replyCode = val; - len = buffer.readUInt8(offset); - offset++; - val = buffer.toString("utf8", offset, offset + len); - offset += len; - fields.replyText = val; - val = buffer.readUInt16BE(offset); - offset += 2; - fields.classId = val; - val = buffer.readUInt16BE(offset); - offset += 2; - fields.methodId = val; - return fields; - } - function encodeConnectionClose(channel, fields) { - var offset = 0, val = null, varyingSize = 0; - val = fields.replyText; - if (void 0 === val) - val = ""; - else if (!("string" == typeof val && Buffer.byteLength(val) < 256)) - throw new TypeError("Field 'replyText' is the wrong type; must be a string (up to 255 chars)"); - var replyText_len = Buffer.byteLength(val, "utf8"); - varyingSize += replyText_len; - var buffer = Buffer.alloc(19 + varyingSize); - buffer[0] = 1; - buffer.writeUInt16BE(channel, 1); - buffer.writeUInt32BE(655410, 7); - offset = 11; - val = fields.replyCode; - if (void 0 === val) - throw new Error("Missing value for mandatory field 'replyCode'"); - if ("number" != typeof val || isNaN(val)) - throw new TypeError("Field 'replyCode' is the wrong type; must be a number (but not NaN)"); - buffer.writeUInt16BE(val, offset); - offset += 2; - val = fields.replyText; - void 0 === val && (val = ""); - buffer[offset] = replyText_len; - offset++; - buffer.write(val, offset, "utf8"); - offset += replyText_len; - val = fields.classId; - if (void 0 === val) - throw new Error("Missing value for mandatory field 'classId'"); - if ("number" != typeof val || isNaN(val)) - throw new TypeError("Field 'classId' is the wrong type; must be a number (but not NaN)"); - buffer.writeUInt16BE(val, offset); - offset += 2; - val = fields.methodId; - if (void 0 === val) - throw new Error("Missing value for mandatory field 'methodId'"); - if ("number" != typeof val || isNaN(val)) - throw new TypeError("Field 'methodId' is the wrong type; must be a number (but not NaN)"); - buffer.writeUInt16BE(val, offset); - offset += 2; - buffer[offset] = 206; - buffer.writeUInt32BE(offset - 7, 3); - return buffer; - } - function decodeConnectionCloseOk(buffer) { - return {}; - } - function encodeConnectionCloseOk(channel, fields) { - var offset = 0, buffer = Buffer.alloc(12); - buffer[0] = 1; - buffer.writeUInt16BE(channel, 1); - buffer.writeUInt32BE(655411, 7); - offset = 11; - buffer[offset] = 206; - buffer.writeUInt32BE(offset - 7, 3); - return buffer; - } - function decodeConnectionBlocked(buffer) { - var val, len, offset = 0, fields = { - reason: void 0 - }; - len = buffer.readUInt8(offset); - offset++; - val = buffer.toString("utf8", offset, offset + len); - offset += len; - fields.reason = val; - return fields; - } - function encodeConnectionBlocked(channel, fields) { - var offset = 0, val = null, varyingSize = 0; - val = fields.reason; - if (void 0 === val) - val = ""; - else if (!("string" == typeof val && Buffer.byteLength(val) < 256)) - throw new TypeError("Field 'reason' is the wrong type; must be a string (up to 255 chars)"); - var reason_len = Buffer.byteLength(val, "utf8"); - varyingSize += reason_len; - var buffer = Buffer.alloc(13 + varyingSize); - buffer[0] = 1; - buffer.writeUInt16BE(channel, 1); - buffer.writeUInt32BE(655420, 7); - offset = 11; - val = fields.reason; - void 0 === val && (val = ""); - buffer[offset] = reason_len; - offset++; - buffer.write(val, offset, "utf8"); - offset += reason_len; - buffer[offset] = 206; - buffer.writeUInt32BE(offset - 7, 3); - return buffer; - } - function decodeConnectionUnblocked(buffer) { - return {}; - } - function encodeConnectionUnblocked(channel, fields) { - var offset = 0, buffer = Buffer.alloc(12); - buffer[0] = 1; - buffer.writeUInt16BE(channel, 1); - buffer.writeUInt32BE(655421, 7); - offset = 11; - buffer[offset] = 206; - buffer.writeUInt32BE(offset - 7, 3); - return buffer; - } - function decodeChannelOpen(buffer) { - var val, len, offset = 0, fields = { - outOfBand: void 0 - }; - len = buffer.readUInt8(offset); - offset++; - val = buffer.toString("utf8", offset, offset + len); - offset += len; - fields.outOfBand = val; - return fields; - } - function encodeChannelOpen(channel, fields) { - var offset = 0, val = null, varyingSize = 0; - val = fields.outOfBand; - if (void 0 === val) - val = ""; - else if (!("string" == typeof val && Buffer.byteLength(val) < 256)) - throw new TypeError("Field 'outOfBand' is the wrong type; must be a string (up to 255 chars)"); - var outOfBand_len = Buffer.byteLength(val, "utf8"); - varyingSize += outOfBand_len; - var buffer = Buffer.alloc(13 + varyingSize); - buffer[0] = 1; - buffer.writeUInt16BE(channel, 1); - buffer.writeUInt32BE(1310730, 7); - offset = 11; - val = fields.outOfBand; - void 0 === val && (val = ""); - buffer[offset] = outOfBand_len; - offset++; - buffer.write(val, offset, "utf8"); - offset += outOfBand_len; - buffer[offset] = 206; - buffer.writeUInt32BE(offset - 7, 3); - return buffer; - } - function decodeChannelOpenOk(buffer) { - var val, len, offset = 0, fields = { - channelId: void 0 - }; - len = buffer.readUInt32BE(offset); - offset += 4; - val = buffer.slice(offset, offset + len); - offset += len; - fields.channelId = val; - return fields; - } - function encodeChannelOpenOk(channel, fields) { - var len, offset = 0, val = null, varyingSize = 0; - val = fields.channelId; - if (void 0 === val) - val = Buffer.from(""); - else if (!Buffer.isBuffer(val)) - throw new TypeError("Field 'channelId' is the wrong type; must be a Buffer"); - varyingSize += val.length; - var buffer = Buffer.alloc(16 + varyingSize); - buffer[0] = 1; - buffer.writeUInt16BE(channel, 1); - buffer.writeUInt32BE(1310731, 7); - offset = 11; - val = fields.channelId; - void 0 === val && (val = Buffer.from("")); - len = val.length; - buffer.writeUInt32BE(len, offset); - offset += 4; - val.copy(buffer, offset); - offset += len; - buffer[offset] = 206; - buffer.writeUInt32BE(offset - 7, 3); - return buffer; - } - function decodeChannelFlow(buffer) { - var val, fields = { - active: void 0 - }; - val = !!(1 & buffer[0]); - fields.active = val; - return fields; - } - function encodeChannelFlow(channel, fields) { - var offset = 0, val = null, bits = 0, buffer = Buffer.alloc(13); - buffer[0] = 1; - buffer.writeUInt16BE(channel, 1); - buffer.writeUInt32BE(1310740, 7); - offset = 11; - val = fields.active; - if (void 0 === val) - throw new Error("Missing value for mandatory field 'active'"); - val && (bits += 1); - buffer[offset] = bits; - offset++; - buffer[offset] = 206; - buffer.writeUInt32BE(offset - 7, 3); - return buffer; - } - function decodeChannelFlowOk(buffer) { - var val, fields = { - active: void 0 - }; - val = !!(1 & buffer[0]); - fields.active = val; - return fields; - } - function encodeChannelFlowOk(channel, fields) { - var offset = 0, val = null, bits = 0, buffer = Buffer.alloc(13); - buffer[0] = 1; - buffer.writeUInt16BE(channel, 1); - buffer.writeUInt32BE(1310741, 7); - offset = 11; - val = fields.active; - if (void 0 === val) - throw new Error("Missing value for mandatory field 'active'"); - val && (bits += 1); - buffer[offset] = bits; - offset++; - buffer[offset] = 206; - buffer.writeUInt32BE(offset - 7, 3); - return buffer; - } - function decodeChannelClose(buffer) { - var val, len, offset = 0, fields = { - replyCode: void 0, - replyText: void 0, - classId: void 0, - methodId: void 0 - }; - val = buffer.readUInt16BE(offset); - offset += 2; - fields.replyCode = val; - len = buffer.readUInt8(offset); - offset++; - val = buffer.toString("utf8", offset, offset + len); - offset += len; - fields.replyText = val; - val = buffer.readUInt16BE(offset); - offset += 2; - fields.classId = val; - val = buffer.readUInt16BE(offset); - offset += 2; - fields.methodId = val; - return fields; - } - function encodeChannelClose(channel, fields) { - var offset = 0, val = null, varyingSize = 0; - val = fields.replyText; - if (void 0 === val) - val = ""; - else if (!("string" == typeof val && Buffer.byteLength(val) < 256)) - throw new TypeError("Field 'replyText' is the wrong type; must be a string (up to 255 chars)"); - var replyText_len = Buffer.byteLength(val, "utf8"); - varyingSize += replyText_len; - var buffer = Buffer.alloc(19 + varyingSize); - buffer[0] = 1; - buffer.writeUInt16BE(channel, 1); - buffer.writeUInt32BE(1310760, 7); - offset = 11; - val = fields.replyCode; - if (void 0 === val) - throw new Error("Missing value for mandatory field 'replyCode'"); - if ("number" != typeof val || isNaN(val)) - throw new TypeError("Field 'replyCode' is the wrong type; must be a number (but not NaN)"); - buffer.writeUInt16BE(val, offset); - offset += 2; - val = fields.replyText; - void 0 === val && (val = ""); - buffer[offset] = replyText_len; - offset++; - buffer.write(val, offset, "utf8"); - offset += replyText_len; - val = fields.classId; - if (void 0 === val) - throw new Error("Missing value for mandatory field 'classId'"); - if ("number" != typeof val || isNaN(val)) - throw new TypeError("Field 'classId' is the wrong type; must be a number (but not NaN)"); - buffer.writeUInt16BE(val, offset); - offset += 2; - val = fields.methodId; - if (void 0 === val) - throw new Error("Missing value for mandatory field 'methodId'"); - if ("number" != typeof val || isNaN(val)) - throw new TypeError("Field 'methodId' is the wrong type; must be a number (but not NaN)"); - buffer.writeUInt16BE(val, offset); - offset += 2; - buffer[offset] = 206; - buffer.writeUInt32BE(offset - 7, 3); - return buffer; - } - function decodeChannelCloseOk(buffer) { - return {}; - } - function encodeChannelCloseOk(channel, fields) { - var offset = 0, buffer = Buffer.alloc(12); - buffer[0] = 1; - buffer.writeUInt16BE(channel, 1); - buffer.writeUInt32BE(1310761, 7); - offset = 11; - buffer[offset] = 206; - buffer.writeUInt32BE(offset - 7, 3); - return buffer; - } - function decodeAccessRequest(buffer) { - var val, len, offset = 0, fields = { - realm: void 0, - exclusive: void 0, - passive: void 0, - active: void 0, - write: void 0, - read: void 0 - }; - len = buffer.readUInt8(offset); - offset++; - val = buffer.toString("utf8", offset, offset + len); - offset += len; - fields.realm = val; - val = !!(1 & buffer[offset]); - fields.exclusive = val; - val = !!(2 & buffer[offset]); - fields.passive = val; - val = !!(4 & buffer[offset]); - fields.active = val; - val = !!(8 & buffer[offset]); - fields.write = val; - val = !!(16 & buffer[offset]); - fields.read = val; - return fields; - } - function encodeAccessRequest(channel, fields) { - var offset = 0, val = null, bits = 0, varyingSize = 0; - val = fields.realm; - if (void 0 === val) - val = "/data"; - else if (!("string" == typeof val && Buffer.byteLength(val) < 256)) - throw new TypeError("Field 'realm' is the wrong type; must be a string (up to 255 chars)"); - var realm_len = Buffer.byteLength(val, "utf8"); - varyingSize += realm_len; - var buffer = Buffer.alloc(14 + varyingSize); - buffer[0] = 1; - buffer.writeUInt16BE(channel, 1); - buffer.writeUInt32BE(1966090, 7); - offset = 11; - val = fields.realm; - void 0 === val && (val = "/data"); - buffer[offset] = realm_len; - offset++; - buffer.write(val, offset, "utf8"); - offset += realm_len; - val = fields.exclusive; - void 0 === val && (val = false); - val && (bits += 1); - val = fields.passive; - void 0 === val && (val = true); - val && (bits += 2); - val = fields.active; - void 0 === val && (val = true); - val && (bits += 4); - val = fields.write; - void 0 === val && (val = true); - val && (bits += 8); - val = fields.read; - void 0 === val && (val = true); - val && (bits += 16); - buffer[offset] = bits; - offset++; - buffer[offset] = 206; - buffer.writeUInt32BE(offset - 7, 3); - return buffer; - } - function decodeAccessRequestOk(buffer) { - var val, offset = 0, fields = { - ticket: void 0 - }; - val = buffer.readUInt16BE(offset); - offset += 2; - fields.ticket = val; - return fields; - } - function encodeAccessRequestOk(channel, fields) { - var offset = 0, val = null, buffer = Buffer.alloc(14); - buffer[0] = 1; - buffer.writeUInt16BE(channel, 1); - buffer.writeUInt32BE(1966091, 7); - offset = 11; - val = fields.ticket; - if (void 0 === val) - val = 1; - else if ("number" != typeof val || isNaN(val)) - throw new TypeError("Field 'ticket' is the wrong type; must be a number (but not NaN)"); - buffer.writeUInt16BE(val, offset); - offset += 2; - buffer[offset] = 206; - buffer.writeUInt32BE(offset - 7, 3); - return buffer; - } - function decodeExchangeDeclare(buffer) { - var val, len, offset = 0, fields = { - ticket: void 0, - exchange: void 0, - type: void 0, - passive: void 0, - durable: void 0, - autoDelete: void 0, - internal: void 0, - nowait: void 0, - arguments: void 0 - }; - val = buffer.readUInt16BE(offset); - offset += 2; - fields.ticket = val; - len = buffer.readUInt8(offset); - offset++; - val = buffer.toString("utf8", offset, offset + len); - offset += len; - fields.exchange = val; - len = buffer.readUInt8(offset); - offset++; - val = buffer.toString("utf8", offset, offset + len); - offset += len; - fields.type = val; - val = !!(1 & buffer[offset]); - fields.passive = val; - val = !!(2 & buffer[offset]); - fields.durable = val; - val = !!(4 & buffer[offset]); - fields.autoDelete = val; - val = !!(8 & buffer[offset]); - fields.internal = val; - val = !!(16 & buffer[offset]); - fields.nowait = val; - offset++; - len = buffer.readUInt32BE(offset); - offset += 4; - val = decodeFields(buffer.slice(offset, offset + len)); - offset += len; - fields.arguments = val; - return fields; - } - function encodeExchangeDeclare(channel, fields) { - var len, offset = 0, val = null, bits = 0, varyingSize = 0, scratchOffset = 0; - val = fields.exchange; - if (void 0 === val) - throw new Error("Missing value for mandatory field 'exchange'"); - if (!("string" == typeof val && Buffer.byteLength(val) < 256)) - throw new TypeError("Field 'exchange' is the wrong type; must be a string (up to 255 chars)"); - var exchange_len = Buffer.byteLength(val, "utf8"); - varyingSize += exchange_len; - val = fields.type; - if (void 0 === val) - val = "direct"; - else if (!("string" == typeof val && Buffer.byteLength(val) < 256)) - throw new TypeError("Field 'type' is the wrong type; must be a string (up to 255 chars)"); - var type_len = Buffer.byteLength(val, "utf8"); - varyingSize += type_len; - val = fields.arguments; - if (void 0 === val) - val = {}; - else if ("object" != typeof val) - throw new TypeError("Field 'arguments' is the wrong type; must be an object"); - len = encodeTable(SCRATCH, val, scratchOffset); - var arguments_encoded = SCRATCH.slice(scratchOffset, scratchOffset + len); - scratchOffset += len; - varyingSize += arguments_encoded.length; - var buffer = Buffer.alloc(17 + varyingSize); - buffer[0] = 1; - buffer.writeUInt16BE(channel, 1); - buffer.writeUInt32BE(2621450, 7); - offset = 11; - val = fields.ticket; - if (void 0 === val) - val = 0; - else if ("number" != typeof val || isNaN(val)) - throw new TypeError("Field 'ticket' is the wrong type; must be a number (but not NaN)"); - buffer.writeUInt16BE(val, offset); - offset += 2; - val = fields.exchange; - void 0 === val && (val = void 0); - buffer[offset] = exchange_len; - offset++; - buffer.write(val, offset, "utf8"); - offset += exchange_len; - val = fields.type; - void 0 === val && (val = "direct"); - buffer[offset] = type_len; - offset++; - buffer.write(val, offset, "utf8"); - offset += type_len; - val = fields.passive; - void 0 === val && (val = false); - val && (bits += 1); - val = fields.durable; - void 0 === val && (val = false); - val && (bits += 2); - val = fields.autoDelete; - void 0 === val && (val = false); - val && (bits += 4); - val = fields.internal; - void 0 === val && (val = false); - val && (bits += 8); - val = fields.nowait; - void 0 === val && (val = false); - val && (bits += 16); - buffer[offset] = bits; - offset++; - bits = 0; - offset += arguments_encoded.copy(buffer, offset); - buffer[offset] = 206; - buffer.writeUInt32BE(offset - 7, 3); - return buffer; - } - function decodeExchangeDeclareOk(buffer) { - return {}; - } - function encodeExchangeDeclareOk(channel, fields) { - var offset = 0, buffer = Buffer.alloc(12); - buffer[0] = 1; - buffer.writeUInt16BE(channel, 1); - buffer.writeUInt32BE(2621451, 7); - offset = 11; - buffer[offset] = 206; - buffer.writeUInt32BE(offset - 7, 3); - return buffer; - } - function decodeExchangeDelete(buffer) { - var val, len, offset = 0, fields = { - ticket: void 0, - exchange: void 0, - ifUnused: void 0, - nowait: void 0 - }; - val = buffer.readUInt16BE(offset); - offset += 2; - fields.ticket = val; - len = buffer.readUInt8(offset); - offset++; - val = buffer.toString("utf8", offset, offset + len); - offset += len; - fields.exchange = val; - val = !!(1 & buffer[offset]); - fields.ifUnused = val; - val = !!(2 & buffer[offset]); - fields.nowait = val; - return fields; - } - function encodeExchangeDelete(channel, fields) { - var offset = 0, val = null, bits = 0, varyingSize = 0; - val = fields.exchange; - if (void 0 === val) - throw new Error("Missing value for mandatory field 'exchange'"); - if (!("string" == typeof val && Buffer.byteLength(val) < 256)) - throw new TypeError("Field 'exchange' is the wrong type; must be a string (up to 255 chars)"); - var exchange_len = Buffer.byteLength(val, "utf8"); - varyingSize += exchange_len; - var buffer = Buffer.alloc(16 + varyingSize); - buffer[0] = 1; - buffer.writeUInt16BE(channel, 1); - buffer.writeUInt32BE(2621460, 7); - offset = 11; - val = fields.ticket; - if (void 0 === val) - val = 0; - else if ("number" != typeof val || isNaN(val)) - throw new TypeError("Field 'ticket' is the wrong type; must be a number (but not NaN)"); - buffer.writeUInt16BE(val, offset); - offset += 2; - val = fields.exchange; - void 0 === val && (val = void 0); - buffer[offset] = exchange_len; - offset++; - buffer.write(val, offset, "utf8"); - offset += exchange_len; - val = fields.ifUnused; - void 0 === val && (val = false); - val && (bits += 1); - val = fields.nowait; - void 0 === val && (val = false); - val && (bits += 2); - buffer[offset] = bits; - offset++; - buffer[offset] = 206; - buffer.writeUInt32BE(offset - 7, 3); - return buffer; - } - function decodeExchangeDeleteOk(buffer) { - return {}; - } - function encodeExchangeDeleteOk(channel, fields) { - var offset = 0, buffer = Buffer.alloc(12); - buffer[0] = 1; - buffer.writeUInt16BE(channel, 1); - buffer.writeUInt32BE(2621461, 7); - offset = 11; - buffer[offset] = 206; - buffer.writeUInt32BE(offset - 7, 3); - return buffer; - } - function decodeExchangeBind(buffer) { - var val, len, offset = 0, fields = { - ticket: void 0, - destination: void 0, - source: void 0, - routingKey: void 0, - nowait: void 0, - arguments: void 0 - }; - val = buffer.readUInt16BE(offset); - offset += 2; - fields.ticket = val; - len = buffer.readUInt8(offset); - offset++; - val = buffer.toString("utf8", offset, offset + len); - offset += len; - fields.destination = val; - len = buffer.readUInt8(offset); - offset++; - val = buffer.toString("utf8", offset, offset + len); - offset += len; - fields.source = val; - len = buffer.readUInt8(offset); - offset++; - val = buffer.toString("utf8", offset, offset + len); - offset += len; - fields.routingKey = val; - val = !!(1 & buffer[offset]); - fields.nowait = val; - offset++; - len = buffer.readUInt32BE(offset); - offset += 4; - val = decodeFields(buffer.slice(offset, offset + len)); - offset += len; - fields.arguments = val; - return fields; - } - function encodeExchangeBind(channel, fields) { - var len, offset = 0, val = null, bits = 0, varyingSize = 0, scratchOffset = 0; - val = fields.destination; - if (void 0 === val) - throw new Error("Missing value for mandatory field 'destination'"); - if (!("string" == typeof val && Buffer.byteLength(val) < 256)) - throw new TypeError("Field 'destination' is the wrong type; must be a string (up to 255 chars)"); - var destination_len = Buffer.byteLength(val, "utf8"); - varyingSize += destination_len; - val = fields.source; - if (void 0 === val) - throw new Error("Missing value for mandatory field 'source'"); - if (!("string" == typeof val && Buffer.byteLength(val) < 256)) - throw new TypeError("Field 'source' is the wrong type; must be a string (up to 255 chars)"); - var source_len = Buffer.byteLength(val, "utf8"); - varyingSize += source_len; - val = fields.routingKey; - if (void 0 === val) - val = ""; - else if (!("string" == typeof val && Buffer.byteLength(val) < 256)) - throw new TypeError("Field 'routingKey' is the wrong type; must be a string (up to 255 chars)"); - var routingKey_len = Buffer.byteLength(val, "utf8"); - varyingSize += routingKey_len; - val = fields.arguments; - if (void 0 === val) - val = {}; - else if ("object" != typeof val) - throw new TypeError("Field 'arguments' is the wrong type; must be an object"); - len = encodeTable(SCRATCH, val, scratchOffset); - var arguments_encoded = SCRATCH.slice(scratchOffset, scratchOffset + len); - scratchOffset += len; - varyingSize += arguments_encoded.length; - var buffer = Buffer.alloc(18 + varyingSize); - buffer[0] = 1; - buffer.writeUInt16BE(channel, 1); - buffer.writeUInt32BE(2621470, 7); - offset = 11; - val = fields.ticket; - if (void 0 === val) - val = 0; - else if ("number" != typeof val || isNaN(val)) - throw new TypeError("Field 'ticket' is the wrong type; must be a number (but not NaN)"); - buffer.writeUInt16BE(val, offset); - offset += 2; - val = fields.destination; - void 0 === val && (val = void 0); - buffer[offset] = destination_len; - offset++; - buffer.write(val, offset, "utf8"); - offset += destination_len; - val = fields.source; - void 0 === val && (val = void 0); - buffer[offset] = source_len; - offset++; - buffer.write(val, offset, "utf8"); - offset += source_len; - val = fields.routingKey; - void 0 === val && (val = ""); - buffer[offset] = routingKey_len; - offset++; - buffer.write(val, offset, "utf8"); - offset += routingKey_len; - val = fields.nowait; - void 0 === val && (val = false); - val && (bits += 1); - buffer[offset] = bits; - offset++; - bits = 0; - offset += arguments_encoded.copy(buffer, offset); - buffer[offset] = 206; - buffer.writeUInt32BE(offset - 7, 3); - return buffer; - } - function decodeExchangeBindOk(buffer) { - return {}; - } - function encodeExchangeBindOk(channel, fields) { - var offset = 0, buffer = Buffer.alloc(12); - buffer[0] = 1; - buffer.writeUInt16BE(channel, 1); - buffer.writeUInt32BE(2621471, 7); - offset = 11; - buffer[offset] = 206; - buffer.writeUInt32BE(offset - 7, 3); - return buffer; - } - function decodeExchangeUnbind(buffer) { - var val, len, offset = 0, fields = { - ticket: void 0, - destination: void 0, - source: void 0, - routingKey: void 0, - nowait: void 0, - arguments: void 0 - }; - val = buffer.readUInt16BE(offset); - offset += 2; - fields.ticket = val; - len = buffer.readUInt8(offset); - offset++; - val = buffer.toString("utf8", offset, offset + len); - offset += len; - fields.destination = val; - len = buffer.readUInt8(offset); - offset++; - val = buffer.toString("utf8", offset, offset + len); - offset += len; - fields.source = val; - len = buffer.readUInt8(offset); - offset++; - val = buffer.toString("utf8", offset, offset + len); - offset += len; - fields.routingKey = val; - val = !!(1 & buffer[offset]); - fields.nowait = val; - offset++; - len = buffer.readUInt32BE(offset); - offset += 4; - val = decodeFields(buffer.slice(offset, offset + len)); - offset += len; - fields.arguments = val; - return fields; - } - function encodeExchangeUnbind(channel, fields) { - var len, offset = 0, val = null, bits = 0, varyingSize = 0, scratchOffset = 0; - val = fields.destination; - if (void 0 === val) - throw new Error("Missing value for mandatory field 'destination'"); - if (!("string" == typeof val && Buffer.byteLength(val) < 256)) - throw new TypeError("Field 'destination' is the wrong type; must be a string (up to 255 chars)"); - var destination_len = Buffer.byteLength(val, "utf8"); - varyingSize += destination_len; - val = fields.source; - if (void 0 === val) - throw new Error("Missing value for mandatory field 'source'"); - if (!("string" == typeof val && Buffer.byteLength(val) < 256)) - throw new TypeError("Field 'source' is the wrong type; must be a string (up to 255 chars)"); - var source_len = Buffer.byteLength(val, "utf8"); - varyingSize += source_len; - val = fields.routingKey; - if (void 0 === val) - val = ""; - else if (!("string" == typeof val && Buffer.byteLength(val) < 256)) - throw new TypeError("Field 'routingKey' is the wrong type; must be a string (up to 255 chars)"); - var routingKey_len = Buffer.byteLength(val, "utf8"); - varyingSize += routingKey_len; - val = fields.arguments; - if (void 0 === val) - val = {}; - else if ("object" != typeof val) - throw new TypeError("Field 'arguments' is the wrong type; must be an object"); - len = encodeTable(SCRATCH, val, scratchOffset); - var arguments_encoded = SCRATCH.slice(scratchOffset, scratchOffset + len); - scratchOffset += len; - varyingSize += arguments_encoded.length; - var buffer = Buffer.alloc(18 + varyingSize); - buffer[0] = 1; - buffer.writeUInt16BE(channel, 1); - buffer.writeUInt32BE(2621480, 7); - offset = 11; - val = fields.ticket; - if (void 0 === val) - val = 0; - else if ("number" != typeof val || isNaN(val)) - throw new TypeError("Field 'ticket' is the wrong type; must be a number (but not NaN)"); - buffer.writeUInt16BE(val, offset); - offset += 2; - val = fields.destination; - void 0 === val && (val = void 0); - buffer[offset] = destination_len; - offset++; - buffer.write(val, offset, "utf8"); - offset += destination_len; - val = fields.source; - void 0 === val && (val = void 0); - buffer[offset] = source_len; - offset++; - buffer.write(val, offset, "utf8"); - offset += source_len; - val = fields.routingKey; - void 0 === val && (val = ""); - buffer[offset] = routingKey_len; - offset++; - buffer.write(val, offset, "utf8"); - offset += routingKey_len; - val = fields.nowait; - void 0 === val && (val = false); - val && (bits += 1); - buffer[offset] = bits; - offset++; - bits = 0; - offset += arguments_encoded.copy(buffer, offset); - buffer[offset] = 206; - buffer.writeUInt32BE(offset - 7, 3); - return buffer; - } - function decodeExchangeUnbindOk(buffer) { - return {}; - } - function encodeExchangeUnbindOk(channel, fields) { - var offset = 0, buffer = Buffer.alloc(12); - buffer[0] = 1; - buffer.writeUInt16BE(channel, 1); - buffer.writeUInt32BE(2621491, 7); - offset = 11; - buffer[offset] = 206; - buffer.writeUInt32BE(offset - 7, 3); - return buffer; - } - function decodeQueueDeclare(buffer) { - var val, len, offset = 0, fields = { - ticket: void 0, - queue: void 0, - passive: void 0, - durable: void 0, - exclusive: void 0, - autoDelete: void 0, - nowait: void 0, - arguments: void 0 - }; - val = buffer.readUInt16BE(offset); - offset += 2; - fields.ticket = val; - len = buffer.readUInt8(offset); - offset++; - val = buffer.toString("utf8", offset, offset + len); - offset += len; - fields.queue = val; - val = !!(1 & buffer[offset]); - fields.passive = val; - val = !!(2 & buffer[offset]); - fields.durable = val; - val = !!(4 & buffer[offset]); - fields.exclusive = val; - val = !!(8 & buffer[offset]); - fields.autoDelete = val; - val = !!(16 & buffer[offset]); - fields.nowait = val; - offset++; - len = buffer.readUInt32BE(offset); - offset += 4; - val = decodeFields(buffer.slice(offset, offset + len)); - offset += len; - fields.arguments = val; - return fields; - } - function encodeQueueDeclare(channel, fields) { - var len, offset = 0, val = null, bits = 0, varyingSize = 0, scratchOffset = 0; - val = fields.queue; - if (void 0 === val) - val = ""; - else if (!("string" == typeof val && Buffer.byteLength(val) < 256)) - throw new TypeError("Field 'queue' is the wrong type; must be a string (up to 255 chars)"); - var queue_len = Buffer.byteLength(val, "utf8"); - varyingSize += queue_len; - val = fields.arguments; - if (void 0 === val) - val = {}; - else if ("object" != typeof val) - throw new TypeError("Field 'arguments' is the wrong type; must be an object"); - len = encodeTable(SCRATCH, val, scratchOffset); - var arguments_encoded = SCRATCH.slice(scratchOffset, scratchOffset + len); - scratchOffset += len; - varyingSize += arguments_encoded.length; - var buffer = Buffer.alloc(16 + varyingSize); - buffer[0] = 1; - buffer.writeUInt16BE(channel, 1); - buffer.writeUInt32BE(3276810, 7); - offset = 11; - val = fields.ticket; - if (void 0 === val) - val = 0; - else if ("number" != typeof val || isNaN(val)) - throw new TypeError("Field 'ticket' is the wrong type; must be a number (but not NaN)"); - buffer.writeUInt16BE(val, offset); - offset += 2; - val = fields.queue; - void 0 === val && (val = ""); - buffer[offset] = queue_len; - offset++; - buffer.write(val, offset, "utf8"); - offset += queue_len; - val = fields.passive; - void 0 === val && (val = false); - val && (bits += 1); - val = fields.durable; - void 0 === val && (val = false); - val && (bits += 2); - val = fields.exclusive; - void 0 === val && (val = false); - val && (bits += 4); - val = fields.autoDelete; - void 0 === val && (val = false); - val && (bits += 8); - val = fields.nowait; - void 0 === val && (val = false); - val && (bits += 16); - buffer[offset] = bits; - offset++; - bits = 0; - offset += arguments_encoded.copy(buffer, offset); - buffer[offset] = 206; - buffer.writeUInt32BE(offset - 7, 3); - return buffer; - } - function decodeQueueDeclareOk(buffer) { - var val, len, offset = 0, fields = { - queue: void 0, - messageCount: void 0, - consumerCount: void 0 - }; - len = buffer.readUInt8(offset); - offset++; - val = buffer.toString("utf8", offset, offset + len); - offset += len; - fields.queue = val; - val = buffer.readUInt32BE(offset); - offset += 4; - fields.messageCount = val; - val = buffer.readUInt32BE(offset); - offset += 4; - fields.consumerCount = val; - return fields; - } - function encodeQueueDeclareOk(channel, fields) { - var offset = 0, val = null, varyingSize = 0; - val = fields.queue; - if (void 0 === val) - throw new Error("Missing value for mandatory field 'queue'"); - if (!("string" == typeof val && Buffer.byteLength(val) < 256)) - throw new TypeError("Field 'queue' is the wrong type; must be a string (up to 255 chars)"); - var queue_len = Buffer.byteLength(val, "utf8"); - varyingSize += queue_len; - var buffer = Buffer.alloc(21 + varyingSize); - buffer[0] = 1; - buffer.writeUInt16BE(channel, 1); - buffer.writeUInt32BE(3276811, 7); - offset = 11; - val = fields.queue; - void 0 === val && (val = void 0); - buffer[offset] = queue_len; - offset++; - buffer.write(val, offset, "utf8"); - offset += queue_len; - val = fields.messageCount; - if (void 0 === val) - throw new Error("Missing value for mandatory field 'messageCount'"); - if ("number" != typeof val || isNaN(val)) - throw new TypeError("Field 'messageCount' is the wrong type; must be a number (but not NaN)"); - buffer.writeUInt32BE(val, offset); - offset += 4; - val = fields.consumerCount; - if (void 0 === val) - throw new Error("Missing value for mandatory field 'consumerCount'"); - if ("number" != typeof val || isNaN(val)) - throw new TypeError("Field 'consumerCount' is the wrong type; must be a number (but not NaN)"); - buffer.writeUInt32BE(val, offset); - offset += 4; - buffer[offset] = 206; - buffer.writeUInt32BE(offset - 7, 3); - return buffer; - } - function decodeQueueBind(buffer) { - var val, len, offset = 0, fields = { - ticket: void 0, - queue: void 0, - exchange: void 0, - routingKey: void 0, - nowait: void 0, - arguments: void 0 - }; - val = buffer.readUInt16BE(offset); - offset += 2; - fields.ticket = val; - len = buffer.readUInt8(offset); - offset++; - val = buffer.toString("utf8", offset, offset + len); - offset += len; - fields.queue = val; - len = buffer.readUInt8(offset); - offset++; - val = buffer.toString("utf8", offset, offset + len); - offset += len; - fields.exchange = val; - len = buffer.readUInt8(offset); - offset++; - val = buffer.toString("utf8", offset, offset + len); - offset += len; - fields.routingKey = val; - val = !!(1 & buffer[offset]); - fields.nowait = val; - offset++; - len = buffer.readUInt32BE(offset); - offset += 4; - val = decodeFields(buffer.slice(offset, offset + len)); - offset += len; - fields.arguments = val; - return fields; - } - function encodeQueueBind(channel, fields) { - var len, offset = 0, val = null, bits = 0, varyingSize = 0, scratchOffset = 0; - val = fields.queue; - if (void 0 === val) - val = ""; - else if (!("string" == typeof val && Buffer.byteLength(val) < 256)) - throw new TypeError("Field 'queue' is the wrong type; must be a string (up to 255 chars)"); - var queue_len = Buffer.byteLength(val, "utf8"); - varyingSize += queue_len; - val = fields.exchange; - if (void 0 === val) - throw new Error("Missing value for mandatory field 'exchange'"); - if (!("string" == typeof val && Buffer.byteLength(val) < 256)) - throw new TypeError("Field 'exchange' is the wrong type; must be a string (up to 255 chars)"); - var exchange_len = Buffer.byteLength(val, "utf8"); - varyingSize += exchange_len; - val = fields.routingKey; - if (void 0 === val) - val = ""; - else if (!("string" == typeof val && Buffer.byteLength(val) < 256)) - throw new TypeError("Field 'routingKey' is the wrong type; must be a string (up to 255 chars)"); - var routingKey_len = Buffer.byteLength(val, "utf8"); - varyingSize += routingKey_len; - val = fields.arguments; - if (void 0 === val) - val = {}; - else if ("object" != typeof val) - throw new TypeError("Field 'arguments' is the wrong type; must be an object"); - len = encodeTable(SCRATCH, val, scratchOffset); - var arguments_encoded = SCRATCH.slice(scratchOffset, scratchOffset + len); - scratchOffset += len; - varyingSize += arguments_encoded.length; - var buffer = Buffer.alloc(18 + varyingSize); - buffer[0] = 1; - buffer.writeUInt16BE(channel, 1); - buffer.writeUInt32BE(3276820, 7); - offset = 11; - val = fields.ticket; - if (void 0 === val) - val = 0; - else if ("number" != typeof val || isNaN(val)) - throw new TypeError("Field 'ticket' is the wrong type; must be a number (but not NaN)"); - buffer.writeUInt16BE(val, offset); - offset += 2; - val = fields.queue; - void 0 === val && (val = ""); - buffer[offset] = queue_len; - offset++; - buffer.write(val, offset, "utf8"); - offset += queue_len; - val = fields.exchange; - void 0 === val && (val = void 0); - buffer[offset] = exchange_len; - offset++; - buffer.write(val, offset, "utf8"); - offset += exchange_len; - val = fields.routingKey; - void 0 === val && (val = ""); - buffer[offset] = routingKey_len; - offset++; - buffer.write(val, offset, "utf8"); - offset += routingKey_len; - val = fields.nowait; - void 0 === val && (val = false); - val && (bits += 1); - buffer[offset] = bits; - offset++; - bits = 0; - offset += arguments_encoded.copy(buffer, offset); - buffer[offset] = 206; - buffer.writeUInt32BE(offset - 7, 3); - return buffer; - } - function decodeQueueBindOk(buffer) { - return {}; - } - function encodeQueueBindOk(channel, fields) { - var offset = 0, buffer = Buffer.alloc(12); - buffer[0] = 1; - buffer.writeUInt16BE(channel, 1); - buffer.writeUInt32BE(3276821, 7); - offset = 11; - buffer[offset] = 206; - buffer.writeUInt32BE(offset - 7, 3); - return buffer; - } - function decodeQueuePurge(buffer) { - var val, len, offset = 0, fields = { - ticket: void 0, - queue: void 0, - nowait: void 0 - }; - val = buffer.readUInt16BE(offset); - offset += 2; - fields.ticket = val; - len = buffer.readUInt8(offset); - offset++; - val = buffer.toString("utf8", offset, offset + len); - offset += len; - fields.queue = val; - val = !!(1 & buffer[offset]); - fields.nowait = val; - return fields; - } - function encodeQueuePurge(channel, fields) { - var offset = 0, val = null, bits = 0, varyingSize = 0; - val = fields.queue; - if (void 0 === val) - val = ""; - else if (!("string" == typeof val && Buffer.byteLength(val) < 256)) - throw new TypeError("Field 'queue' is the wrong type; must be a string (up to 255 chars)"); - var queue_len = Buffer.byteLength(val, "utf8"); - varyingSize += queue_len; - var buffer = Buffer.alloc(16 + varyingSize); - buffer[0] = 1; - buffer.writeUInt16BE(channel, 1); - buffer.writeUInt32BE(3276830, 7); - offset = 11; - val = fields.ticket; - if (void 0 === val) - val = 0; - else if ("number" != typeof val || isNaN(val)) - throw new TypeError("Field 'ticket' is the wrong type; must be a number (but not NaN)"); - buffer.writeUInt16BE(val, offset); - offset += 2; - val = fields.queue; - void 0 === val && (val = ""); - buffer[offset] = queue_len; - offset++; - buffer.write(val, offset, "utf8"); - offset += queue_len; - val = fields.nowait; - void 0 === val && (val = false); - val && (bits += 1); - buffer[offset] = bits; - offset++; - buffer[offset] = 206; - buffer.writeUInt32BE(offset - 7, 3); - return buffer; - } - function decodeQueuePurgeOk(buffer) { - var val, offset = 0, fields = { - messageCount: void 0 - }; - val = buffer.readUInt32BE(offset); - offset += 4; - fields.messageCount = val; - return fields; - } - function encodeQueuePurgeOk(channel, fields) { - var offset = 0, val = null, buffer = Buffer.alloc(16); - buffer[0] = 1; - buffer.writeUInt16BE(channel, 1); - buffer.writeUInt32BE(3276831, 7); - offset = 11; - val = fields.messageCount; - if (void 0 === val) - throw new Error("Missing value for mandatory field 'messageCount'"); - if ("number" != typeof val || isNaN(val)) - throw new TypeError("Field 'messageCount' is the wrong type; must be a number (but not NaN)"); - buffer.writeUInt32BE(val, offset); - offset += 4; - buffer[offset] = 206; - buffer.writeUInt32BE(offset - 7, 3); - return buffer; - } - function decodeQueueDelete(buffer) { - var val, len, offset = 0, fields = { - ticket: void 0, - queue: void 0, - ifUnused: void 0, - ifEmpty: void 0, - nowait: void 0 - }; - val = buffer.readUInt16BE(offset); - offset += 2; - fields.ticket = val; - len = buffer.readUInt8(offset); - offset++; - val = buffer.toString("utf8", offset, offset + len); - offset += len; - fields.queue = val; - val = !!(1 & buffer[offset]); - fields.ifUnused = val; - val = !!(2 & buffer[offset]); - fields.ifEmpty = val; - val = !!(4 & buffer[offset]); - fields.nowait = val; - return fields; - } - function encodeQueueDelete(channel, fields) { - var offset = 0, val = null, bits = 0, varyingSize = 0; - val = fields.queue; - if (void 0 === val) - val = ""; - else if (!("string" == typeof val && Buffer.byteLength(val) < 256)) - throw new TypeError("Field 'queue' is the wrong type; must be a string (up to 255 chars)"); - var queue_len = Buffer.byteLength(val, "utf8"); - varyingSize += queue_len; - var buffer = Buffer.alloc(16 + varyingSize); - buffer[0] = 1; - buffer.writeUInt16BE(channel, 1); - buffer.writeUInt32BE(3276840, 7); - offset = 11; - val = fields.ticket; - if (void 0 === val) - val = 0; - else if ("number" != typeof val || isNaN(val)) - throw new TypeError("Field 'ticket' is the wrong type; must be a number (but not NaN)"); - buffer.writeUInt16BE(val, offset); - offset += 2; - val = fields.queue; - void 0 === val && (val = ""); - buffer[offset] = queue_len; - offset++; - buffer.write(val, offset, "utf8"); - offset += queue_len; - val = fields.ifUnused; - void 0 === val && (val = false); - val && (bits += 1); - val = fields.ifEmpty; - void 0 === val && (val = false); - val && (bits += 2); - val = fields.nowait; - void 0 === val && (val = false); - val && (bits += 4); - buffer[offset] = bits; - offset++; - buffer[offset] = 206; - buffer.writeUInt32BE(offset - 7, 3); - return buffer; - } - function decodeQueueDeleteOk(buffer) { - var val, offset = 0, fields = { - messageCount: void 0 - }; - val = buffer.readUInt32BE(offset); - offset += 4; - fields.messageCount = val; - return fields; - } - function encodeQueueDeleteOk(channel, fields) { - var offset = 0, val = null, buffer = Buffer.alloc(16); - buffer[0] = 1; - buffer.writeUInt16BE(channel, 1); - buffer.writeUInt32BE(3276841, 7); - offset = 11; - val = fields.messageCount; - if (void 0 === val) - throw new Error("Missing value for mandatory field 'messageCount'"); - if ("number" != typeof val || isNaN(val)) - throw new TypeError("Field 'messageCount' is the wrong type; must be a number (but not NaN)"); - buffer.writeUInt32BE(val, offset); - offset += 4; - buffer[offset] = 206; - buffer.writeUInt32BE(offset - 7, 3); - return buffer; - } - function decodeQueueUnbind(buffer) { - var val, len, offset = 0, fields = { - ticket: void 0, - queue: void 0, - exchange: void 0, - routingKey: void 0, - arguments: void 0 - }; - val = buffer.readUInt16BE(offset); - offset += 2; - fields.ticket = val; - len = buffer.readUInt8(offset); - offset++; - val = buffer.toString("utf8", offset, offset + len); - offset += len; - fields.queue = val; - len = buffer.readUInt8(offset); - offset++; - val = buffer.toString("utf8", offset, offset + len); - offset += len; - fields.exchange = val; - len = buffer.readUInt8(offset); - offset++; - val = buffer.toString("utf8", offset, offset + len); - offset += len; - fields.routingKey = val; - len = buffer.readUInt32BE(offset); - offset += 4; - val = decodeFields(buffer.slice(offset, offset + len)); - offset += len; - fields.arguments = val; - return fields; - } - function encodeQueueUnbind(channel, fields) { - var len, offset = 0, val = null, varyingSize = 0, scratchOffset = 0; - val = fields.queue; - if (void 0 === val) - val = ""; - else if (!("string" == typeof val && Buffer.byteLength(val) < 256)) - throw new TypeError("Field 'queue' is the wrong type; must be a string (up to 255 chars)"); - var queue_len = Buffer.byteLength(val, "utf8"); - varyingSize += queue_len; - val = fields.exchange; - if (void 0 === val) - throw new Error("Missing value for mandatory field 'exchange'"); - if (!("string" == typeof val && Buffer.byteLength(val) < 256)) - throw new TypeError("Field 'exchange' is the wrong type; must be a string (up to 255 chars)"); - var exchange_len = Buffer.byteLength(val, "utf8"); - varyingSize += exchange_len; - val = fields.routingKey; - if (void 0 === val) - val = ""; - else if (!("string" == typeof val && Buffer.byteLength(val) < 256)) - throw new TypeError("Field 'routingKey' is the wrong type; must be a string (up to 255 chars)"); - var routingKey_len = Buffer.byteLength(val, "utf8"); - varyingSize += routingKey_len; - val = fields.arguments; - if (void 0 === val) - val = {}; - else if ("object" != typeof val) - throw new TypeError("Field 'arguments' is the wrong type; must be an object"); - len = encodeTable(SCRATCH, val, scratchOffset); - var arguments_encoded = SCRATCH.slice(scratchOffset, scratchOffset + len); - scratchOffset += len; - varyingSize += arguments_encoded.length; - var buffer = Buffer.alloc(17 + varyingSize); - buffer[0] = 1; - buffer.writeUInt16BE(channel, 1); - buffer.writeUInt32BE(3276850, 7); - offset = 11; - val = fields.ticket; - if (void 0 === val) - val = 0; - else if ("number" != typeof val || isNaN(val)) - throw new TypeError("Field 'ticket' is the wrong type; must be a number (but not NaN)"); - buffer.writeUInt16BE(val, offset); - offset += 2; - val = fields.queue; - void 0 === val && (val = ""); - buffer[offset] = queue_len; - offset++; - buffer.write(val, offset, "utf8"); - offset += queue_len; - val = fields.exchange; - void 0 === val && (val = void 0); - buffer[offset] = exchange_len; - offset++; - buffer.write(val, offset, "utf8"); - offset += exchange_len; - val = fields.routingKey; - void 0 === val && (val = ""); - buffer[offset] = routingKey_len; - offset++; - buffer.write(val, offset, "utf8"); - offset += routingKey_len; - offset += arguments_encoded.copy(buffer, offset); - buffer[offset] = 206; - buffer.writeUInt32BE(offset - 7, 3); - return buffer; - } - function decodeQueueUnbindOk(buffer) { - return {}; - } - function encodeQueueUnbindOk(channel, fields) { - var offset = 0, buffer = Buffer.alloc(12); - buffer[0] = 1; - buffer.writeUInt16BE(channel, 1); - buffer.writeUInt32BE(3276851, 7); - offset = 11; - buffer[offset] = 206; - buffer.writeUInt32BE(offset - 7, 3); - return buffer; - } - function decodeBasicQos(buffer) { - var val, offset = 0, fields = { - prefetchSize: void 0, - prefetchCount: void 0, - global: void 0 - }; - val = buffer.readUInt32BE(offset); - offset += 4; - fields.prefetchSize = val; - val = buffer.readUInt16BE(offset); - offset += 2; - fields.prefetchCount = val; - val = !!(1 & buffer[offset]); - fields.global = val; - return fields; - } - function encodeBasicQos(channel, fields) { - var offset = 0, val = null, bits = 0, buffer = Buffer.alloc(19); - buffer[0] = 1; - buffer.writeUInt16BE(channel, 1); - buffer.writeUInt32BE(3932170, 7); - offset = 11; - val = fields.prefetchSize; - if (void 0 === val) - val = 0; - else if ("number" != typeof val || isNaN(val)) - throw new TypeError("Field 'prefetchSize' is the wrong type; must be a number (but not NaN)"); - buffer.writeUInt32BE(val, offset); - offset += 4; - val = fields.prefetchCount; - if (void 0 === val) - val = 0; - else if ("number" != typeof val || isNaN(val)) - throw new TypeError("Field 'prefetchCount' is the wrong type; must be a number (but not NaN)"); - buffer.writeUInt16BE(val, offset); - offset += 2; - val = fields.global; - void 0 === val && (val = false); - val && (bits += 1); - buffer[offset] = bits; - offset++; - buffer[offset] = 206; - buffer.writeUInt32BE(offset - 7, 3); - return buffer; - } - function decodeBasicQosOk(buffer) { - return {}; - } - function encodeBasicQosOk(channel, fields) { - var offset = 0, buffer = Buffer.alloc(12); - buffer[0] = 1; - buffer.writeUInt16BE(channel, 1); - buffer.writeUInt32BE(3932171, 7); - offset = 11; - buffer[offset] = 206; - buffer.writeUInt32BE(offset - 7, 3); - return buffer; - } - function decodeBasicConsume(buffer) { - var val, len, offset = 0, fields = { - ticket: void 0, - queue: void 0, - consumerTag: void 0, - noLocal: void 0, - noAck: void 0, - exclusive: void 0, - nowait: void 0, - arguments: void 0 - }; - val = buffer.readUInt16BE(offset); - offset += 2; - fields.ticket = val; - len = buffer.readUInt8(offset); - offset++; - val = buffer.toString("utf8", offset, offset + len); - offset += len; - fields.queue = val; - len = buffer.readUInt8(offset); - offset++; - val = buffer.toString("utf8", offset, offset + len); - offset += len; - fields.consumerTag = val; - val = !!(1 & buffer[offset]); - fields.noLocal = val; - val = !!(2 & buffer[offset]); - fields.noAck = val; - val = !!(4 & buffer[offset]); - fields.exclusive = val; - val = !!(8 & buffer[offset]); - fields.nowait = val; - offset++; - len = buffer.readUInt32BE(offset); - offset += 4; - val = decodeFields(buffer.slice(offset, offset + len)); - offset += len; - fields.arguments = val; - return fields; - } - function encodeBasicConsume(channel, fields) { - var len, offset = 0, val = null, bits = 0, varyingSize = 0, scratchOffset = 0; - val = fields.queue; - if (void 0 === val) - val = ""; - else if (!("string" == typeof val && Buffer.byteLength(val) < 256)) - throw new TypeError("Field 'queue' is the wrong type; must be a string (up to 255 chars)"); - var queue_len = Buffer.byteLength(val, "utf8"); - varyingSize += queue_len; - val = fields.consumerTag; - if (void 0 === val) - val = ""; - else if (!("string" == typeof val && Buffer.byteLength(val) < 256)) - throw new TypeError("Field 'consumerTag' is the wrong type; must be a string (up to 255 chars)"); - var consumerTag_len = Buffer.byteLength(val, "utf8"); - varyingSize += consumerTag_len; - val = fields.arguments; - if (void 0 === val) - val = {}; - else if ("object" != typeof val) - throw new TypeError("Field 'arguments' is the wrong type; must be an object"); - len = encodeTable(SCRATCH, val, scratchOffset); - var arguments_encoded = SCRATCH.slice(scratchOffset, scratchOffset + len); - scratchOffset += len; - varyingSize += arguments_encoded.length; - var buffer = Buffer.alloc(17 + varyingSize); - buffer[0] = 1; - buffer.writeUInt16BE(channel, 1); - buffer.writeUInt32BE(3932180, 7); - offset = 11; - val = fields.ticket; - if (void 0 === val) - val = 0; - else if ("number" != typeof val || isNaN(val)) - throw new TypeError("Field 'ticket' is the wrong type; must be a number (but not NaN)"); - buffer.writeUInt16BE(val, offset); - offset += 2; - val = fields.queue; - void 0 === val && (val = ""); - buffer[offset] = queue_len; - offset++; - buffer.write(val, offset, "utf8"); - offset += queue_len; - val = fields.consumerTag; - void 0 === val && (val = ""); - buffer[offset] = consumerTag_len; - offset++; - buffer.write(val, offset, "utf8"); - offset += consumerTag_len; - val = fields.noLocal; - void 0 === val && (val = false); - val && (bits += 1); - val = fields.noAck; - void 0 === val && (val = false); - val && (bits += 2); - val = fields.exclusive; - void 0 === val && (val = false); - val && (bits += 4); - val = fields.nowait; - void 0 === val && (val = false); - val && (bits += 8); - buffer[offset] = bits; - offset++; - bits = 0; - offset += arguments_encoded.copy(buffer, offset); - buffer[offset] = 206; - buffer.writeUInt32BE(offset - 7, 3); - return buffer; - } - function decodeBasicConsumeOk(buffer) { - var val, len, offset = 0, fields = { - consumerTag: void 0 - }; - len = buffer.readUInt8(offset); - offset++; - val = buffer.toString("utf8", offset, offset + len); - offset += len; - fields.consumerTag = val; - return fields; - } - function encodeBasicConsumeOk(channel, fields) { - var offset = 0, val = null, varyingSize = 0; - val = fields.consumerTag; - if (void 0 === val) - throw new Error("Missing value for mandatory field 'consumerTag'"); - if (!("string" == typeof val && Buffer.byteLength(val) < 256)) - throw new TypeError("Field 'consumerTag' is the wrong type; must be a string (up to 255 chars)"); - var consumerTag_len = Buffer.byteLength(val, "utf8"); - varyingSize += consumerTag_len; - var buffer = Buffer.alloc(13 + varyingSize); - buffer[0] = 1; - buffer.writeUInt16BE(channel, 1); - buffer.writeUInt32BE(3932181, 7); - offset = 11; - val = fields.consumerTag; - void 0 === val && (val = void 0); - buffer[offset] = consumerTag_len; - offset++; - buffer.write(val, offset, "utf8"); - offset += consumerTag_len; - buffer[offset] = 206; - buffer.writeUInt32BE(offset - 7, 3); - return buffer; - } - function decodeBasicCancel(buffer) { - var val, len, offset = 0, fields = { - consumerTag: void 0, - nowait: void 0 - }; - len = buffer.readUInt8(offset); - offset++; - val = buffer.toString("utf8", offset, offset + len); - offset += len; - fields.consumerTag = val; - val = !!(1 & buffer[offset]); - fields.nowait = val; - return fields; - } - function encodeBasicCancel(channel, fields) { - var offset = 0, val = null, bits = 0, varyingSize = 0; - val = fields.consumerTag; - if (void 0 === val) - throw new Error("Missing value for mandatory field 'consumerTag'"); - if (!("string" == typeof val && Buffer.byteLength(val) < 256)) - throw new TypeError("Field 'consumerTag' is the wrong type; must be a string (up to 255 chars)"); - var consumerTag_len = Buffer.byteLength(val, "utf8"); - varyingSize += consumerTag_len; - var buffer = Buffer.alloc(14 + varyingSize); - buffer[0] = 1; - buffer.writeUInt16BE(channel, 1); - buffer.writeUInt32BE(3932190, 7); - offset = 11; - val = fields.consumerTag; - void 0 === val && (val = void 0); - buffer[offset] = consumerTag_len; - offset++; - buffer.write(val, offset, "utf8"); - offset += consumerTag_len; - val = fields.nowait; - void 0 === val && (val = false); - val && (bits += 1); - buffer[offset] = bits; - offset++; - buffer[offset] = 206; - buffer.writeUInt32BE(offset - 7, 3); - return buffer; - } - function decodeBasicCancelOk(buffer) { - var val, len, offset = 0, fields = { - consumerTag: void 0 - }; - len = buffer.readUInt8(offset); - offset++; - val = buffer.toString("utf8", offset, offset + len); - offset += len; - fields.consumerTag = val; - return fields; - } - function encodeBasicCancelOk(channel, fields) { - var offset = 0, val = null, varyingSize = 0; - val = fields.consumerTag; - if (void 0 === val) - throw new Error("Missing value for mandatory field 'consumerTag'"); - if (!("string" == typeof val && Buffer.byteLength(val) < 256)) - throw new TypeError("Field 'consumerTag' is the wrong type; must be a string (up to 255 chars)"); - var consumerTag_len = Buffer.byteLength(val, "utf8"); - varyingSize += consumerTag_len; - var buffer = Buffer.alloc(13 + varyingSize); - buffer[0] = 1; - buffer.writeUInt16BE(channel, 1); - buffer.writeUInt32BE(3932191, 7); - offset = 11; - val = fields.consumerTag; - void 0 === val && (val = void 0); - buffer[offset] = consumerTag_len; - offset++; - buffer.write(val, offset, "utf8"); - offset += consumerTag_len; - buffer[offset] = 206; - buffer.writeUInt32BE(offset - 7, 3); - return buffer; - } - function decodeBasicPublish(buffer) { - var val, len, offset = 0, fields = { - ticket: void 0, - exchange: void 0, - routingKey: void 0, - mandatory: void 0, - immediate: void 0 - }; - val = buffer.readUInt16BE(offset); - offset += 2; - fields.ticket = val; - len = buffer.readUInt8(offset); - offset++; - val = buffer.toString("utf8", offset, offset + len); - offset += len; - fields.exchange = val; - len = buffer.readUInt8(offset); - offset++; - val = buffer.toString("utf8", offset, offset + len); - offset += len; - fields.routingKey = val; - val = !!(1 & buffer[offset]); - fields.mandatory = val; - val = !!(2 & buffer[offset]); - fields.immediate = val; - return fields; - } - function encodeBasicPublish(channel, fields) { - var offset = 0, val = null, bits = 0, varyingSize = 0; - val = fields.exchange; - if (void 0 === val) - val = ""; - else if (!("string" == typeof val && Buffer.byteLength(val) < 256)) - throw new TypeError("Field 'exchange' is the wrong type; must be a string (up to 255 chars)"); - var exchange_len = Buffer.byteLength(val, "utf8"); - varyingSize += exchange_len; - val = fields.routingKey; - if (void 0 === val) - val = ""; - else if (!("string" == typeof val && Buffer.byteLength(val) < 256)) - throw new TypeError("Field 'routingKey' is the wrong type; must be a string (up to 255 chars)"); - var routingKey_len = Buffer.byteLength(val, "utf8"); - varyingSize += routingKey_len; - var buffer = Buffer.alloc(17 + varyingSize); - buffer[0] = 1; - buffer.writeUInt16BE(channel, 1); - buffer.writeUInt32BE(3932200, 7); - offset = 11; - val = fields.ticket; - if (void 0 === val) - val = 0; - else if ("number" != typeof val || isNaN(val)) - throw new TypeError("Field 'ticket' is the wrong type; must be a number (but not NaN)"); - buffer.writeUInt16BE(val, offset); - offset += 2; - val = fields.exchange; - void 0 === val && (val = ""); - buffer[offset] = exchange_len; - offset++; - buffer.write(val, offset, "utf8"); - offset += exchange_len; - val = fields.routingKey; - void 0 === val && (val = ""); - buffer[offset] = routingKey_len; - offset++; - buffer.write(val, offset, "utf8"); - offset += routingKey_len; - val = fields.mandatory; - void 0 === val && (val = false); - val && (bits += 1); - val = fields.immediate; - void 0 === val && (val = false); - val && (bits += 2); - buffer[offset] = bits; - offset++; - buffer[offset] = 206; - buffer.writeUInt32BE(offset - 7, 3); - return buffer; - } - function decodeBasicReturn(buffer) { - var val, len, offset = 0, fields = { - replyCode: void 0, - replyText: void 0, - exchange: void 0, - routingKey: void 0 - }; - val = buffer.readUInt16BE(offset); - offset += 2; - fields.replyCode = val; - len = buffer.readUInt8(offset); - offset++; - val = buffer.toString("utf8", offset, offset + len); - offset += len; - fields.replyText = val; - len = buffer.readUInt8(offset); - offset++; - val = buffer.toString("utf8", offset, offset + len); - offset += len; - fields.exchange = val; - len = buffer.readUInt8(offset); - offset++; - val = buffer.toString("utf8", offset, offset + len); - offset += len; - fields.routingKey = val; - return fields; - } - function encodeBasicReturn(channel, fields) { - var offset = 0, val = null, varyingSize = 0; - val = fields.replyText; - if (void 0 === val) - val = ""; - else if (!("string" == typeof val && Buffer.byteLength(val) < 256)) - throw new TypeError("Field 'replyText' is the wrong type; must be a string (up to 255 chars)"); - var replyText_len = Buffer.byteLength(val, "utf8"); - varyingSize += replyText_len; - val = fields.exchange; - if (void 0 === val) - throw new Error("Missing value for mandatory field 'exchange'"); - if (!("string" == typeof val && Buffer.byteLength(val) < 256)) - throw new TypeError("Field 'exchange' is the wrong type; must be a string (up to 255 chars)"); - var exchange_len = Buffer.byteLength(val, "utf8"); - varyingSize += exchange_len; - val = fields.routingKey; - if (void 0 === val) - throw new Error("Missing value for mandatory field 'routingKey'"); - if (!("string" == typeof val && Buffer.byteLength(val) < 256)) - throw new TypeError("Field 'routingKey' is the wrong type; must be a string (up to 255 chars)"); - var routingKey_len = Buffer.byteLength(val, "utf8"); - varyingSize += routingKey_len; - var buffer = Buffer.alloc(17 + varyingSize); - buffer[0] = 1; - buffer.writeUInt16BE(channel, 1); - buffer.writeUInt32BE(3932210, 7); - offset = 11; - val = fields.replyCode; - if (void 0 === val) - throw new Error("Missing value for mandatory field 'replyCode'"); - if ("number" != typeof val || isNaN(val)) - throw new TypeError("Field 'replyCode' is the wrong type; must be a number (but not NaN)"); - buffer.writeUInt16BE(val, offset); - offset += 2; - val = fields.replyText; - void 0 === val && (val = ""); - buffer[offset] = replyText_len; - offset++; - buffer.write(val, offset, "utf8"); - offset += replyText_len; - val = fields.exchange; - void 0 === val && (val = void 0); - buffer[offset] = exchange_len; - offset++; - buffer.write(val, offset, "utf8"); - offset += exchange_len; - val = fields.routingKey; - void 0 === val && (val = void 0); - buffer[offset] = routingKey_len; - offset++; - buffer.write(val, offset, "utf8"); - offset += routingKey_len; - buffer[offset] = 206; - buffer.writeUInt32BE(offset - 7, 3); - return buffer; - } - function decodeBasicDeliver(buffer) { - var val, len, offset = 0, fields = { - consumerTag: void 0, - deliveryTag: void 0, - redelivered: void 0, - exchange: void 0, - routingKey: void 0 - }; - len = buffer.readUInt8(offset); - offset++; - val = buffer.toString("utf8", offset, offset + len); - offset += len; - fields.consumerTag = val; - val = ints.readUInt64BE(buffer, offset); - offset += 8; - fields.deliveryTag = val; - val = !!(1 & buffer[offset]); - fields.redelivered = val; - offset++; - len = buffer.readUInt8(offset); - offset++; - val = buffer.toString("utf8", offset, offset + len); - offset += len; - fields.exchange = val; - len = buffer.readUInt8(offset); - offset++; - val = buffer.toString("utf8", offset, offset + len); - offset += len; - fields.routingKey = val; - return fields; - } - function encodeBasicDeliver(channel, fields) { - var offset = 0, val = null, bits = 0, varyingSize = 0; - val = fields.consumerTag; - if (void 0 === val) - throw new Error("Missing value for mandatory field 'consumerTag'"); - if (!("string" == typeof val && Buffer.byteLength(val) < 256)) - throw new TypeError("Field 'consumerTag' is the wrong type; must be a string (up to 255 chars)"); - var consumerTag_len = Buffer.byteLength(val, "utf8"); - varyingSize += consumerTag_len; - val = fields.exchange; - if (void 0 === val) - throw new Error("Missing value for mandatory field 'exchange'"); - if (!("string" == typeof val && Buffer.byteLength(val) < 256)) - throw new TypeError("Field 'exchange' is the wrong type; must be a string (up to 255 chars)"); - var exchange_len = Buffer.byteLength(val, "utf8"); - varyingSize += exchange_len; - val = fields.routingKey; - if (void 0 === val) - throw new Error("Missing value for mandatory field 'routingKey'"); - if (!("string" == typeof val && Buffer.byteLength(val) < 256)) - throw new TypeError("Field 'routingKey' is the wrong type; must be a string (up to 255 chars)"); - var routingKey_len = Buffer.byteLength(val, "utf8"); - varyingSize += routingKey_len; - var buffer = Buffer.alloc(24 + varyingSize); - buffer[0] = 1; - buffer.writeUInt16BE(channel, 1); - buffer.writeUInt32BE(3932220, 7); - offset = 11; - val = fields.consumerTag; - void 0 === val && (val = void 0); - buffer[offset] = consumerTag_len; - offset++; - buffer.write(val, offset, "utf8"); - offset += consumerTag_len; - val = fields.deliveryTag; - if (void 0 === val) - throw new Error("Missing value for mandatory field 'deliveryTag'"); - if ("number" != typeof val || isNaN(val)) - throw new TypeError("Field 'deliveryTag' is the wrong type; must be a number (but not NaN)"); - ints.writeUInt64BE(buffer, val, offset); - offset += 8; - val = fields.redelivered; - void 0 === val && (val = false); - val && (bits += 1); - buffer[offset] = bits; - offset++; - bits = 0; - val = fields.exchange; - void 0 === val && (val = void 0); - buffer[offset] = exchange_len; - offset++; - buffer.write(val, offset, "utf8"); - offset += exchange_len; - val = fields.routingKey; - void 0 === val && (val = void 0); - buffer[offset] = routingKey_len; - offset++; - buffer.write(val, offset, "utf8"); - offset += routingKey_len; - buffer[offset] = 206; - buffer.writeUInt32BE(offset - 7, 3); - return buffer; - } - function decodeBasicGet(buffer) { - var val, len, offset = 0, fields = { - ticket: void 0, - queue: void 0, - noAck: void 0 - }; - val = buffer.readUInt16BE(offset); - offset += 2; - fields.ticket = val; - len = buffer.readUInt8(offset); - offset++; - val = buffer.toString("utf8", offset, offset + len); - offset += len; - fields.queue = val; - val = !!(1 & buffer[offset]); - fields.noAck = val; - return fields; - } - function encodeBasicGet(channel, fields) { - var offset = 0, val = null, bits = 0, varyingSize = 0; - val = fields.queue; - if (void 0 === val) - val = ""; - else if (!("string" == typeof val && Buffer.byteLength(val) < 256)) - throw new TypeError("Field 'queue' is the wrong type; must be a string (up to 255 chars)"); - var queue_len = Buffer.byteLength(val, "utf8"); - varyingSize += queue_len; - var buffer = Buffer.alloc(16 + varyingSize); - buffer[0] = 1; - buffer.writeUInt16BE(channel, 1); - buffer.writeUInt32BE(3932230, 7); - offset = 11; - val = fields.ticket; - if (void 0 === val) - val = 0; - else if ("number" != typeof val || isNaN(val)) - throw new TypeError("Field 'ticket' is the wrong type; must be a number (but not NaN)"); - buffer.writeUInt16BE(val, offset); - offset += 2; - val = fields.queue; - void 0 === val && (val = ""); - buffer[offset] = queue_len; - offset++; - buffer.write(val, offset, "utf8"); - offset += queue_len; - val = fields.noAck; - void 0 === val && (val = false); - val && (bits += 1); - buffer[offset] = bits; - offset++; - buffer[offset] = 206; - buffer.writeUInt32BE(offset - 7, 3); - return buffer; - } - function decodeBasicGetOk(buffer) { - var val, len, offset = 0, fields = { - deliveryTag: void 0, - redelivered: void 0, - exchange: void 0, - routingKey: void 0, - messageCount: void 0 - }; - val = ints.readUInt64BE(buffer, offset); - offset += 8; - fields.deliveryTag = val; - val = !!(1 & buffer[offset]); - fields.redelivered = val; - offset++; - len = buffer.readUInt8(offset); - offset++; - val = buffer.toString("utf8", offset, offset + len); - offset += len; - fields.exchange = val; - len = buffer.readUInt8(offset); - offset++; - val = buffer.toString("utf8", offset, offset + len); - offset += len; - fields.routingKey = val; - val = buffer.readUInt32BE(offset); - offset += 4; - fields.messageCount = val; - return fields; - } - function encodeBasicGetOk(channel, fields) { - var offset = 0, val = null, bits = 0, varyingSize = 0; - val = fields.exchange; - if (void 0 === val) - throw new Error("Missing value for mandatory field 'exchange'"); - if (!("string" == typeof val && Buffer.byteLength(val) < 256)) - throw new TypeError("Field 'exchange' is the wrong type; must be a string (up to 255 chars)"); - var exchange_len = Buffer.byteLength(val, "utf8"); - varyingSize += exchange_len; - val = fields.routingKey; - if (void 0 === val) - throw new Error("Missing value for mandatory field 'routingKey'"); - if (!("string" == typeof val && Buffer.byteLength(val) < 256)) - throw new TypeError("Field 'routingKey' is the wrong type; must be a string (up to 255 chars)"); - var routingKey_len = Buffer.byteLength(val, "utf8"); - varyingSize += routingKey_len; - var buffer = Buffer.alloc(27 + varyingSize); - buffer[0] = 1; - buffer.writeUInt16BE(channel, 1); - buffer.writeUInt32BE(3932231, 7); - offset = 11; - val = fields.deliveryTag; - if (void 0 === val) - throw new Error("Missing value for mandatory field 'deliveryTag'"); - if ("number" != typeof val || isNaN(val)) - throw new TypeError("Field 'deliveryTag' is the wrong type; must be a number (but not NaN)"); - ints.writeUInt64BE(buffer, val, offset); - offset += 8; - val = fields.redelivered; - void 0 === val && (val = false); - val && (bits += 1); - buffer[offset] = bits; - offset++; - bits = 0; - val = fields.exchange; - void 0 === val && (val = void 0); - buffer[offset] = exchange_len; - offset++; - buffer.write(val, offset, "utf8"); - offset += exchange_len; - val = fields.routingKey; - void 0 === val && (val = void 0); - buffer[offset] = routingKey_len; - offset++; - buffer.write(val, offset, "utf8"); - offset += routingKey_len; - val = fields.messageCount; - if (void 0 === val) - throw new Error("Missing value for mandatory field 'messageCount'"); - if ("number" != typeof val || isNaN(val)) - throw new TypeError("Field 'messageCount' is the wrong type; must be a number (but not NaN)"); - buffer.writeUInt32BE(val, offset); - offset += 4; - buffer[offset] = 206; - buffer.writeUInt32BE(offset - 7, 3); - return buffer; - } - function decodeBasicGetEmpty(buffer) { - var val, len, offset = 0, fields = { - clusterId: void 0 - }; - len = buffer.readUInt8(offset); - offset++; - val = buffer.toString("utf8", offset, offset + len); - offset += len; - fields.clusterId = val; - return fields; - } - function encodeBasicGetEmpty(channel, fields) { - var offset = 0, val = null, varyingSize = 0; - val = fields.clusterId; - if (void 0 === val) - val = ""; - else if (!("string" == typeof val && Buffer.byteLength(val) < 256)) - throw new TypeError("Field 'clusterId' is the wrong type; must be a string (up to 255 chars)"); - var clusterId_len = Buffer.byteLength(val, "utf8"); - varyingSize += clusterId_len; - var buffer = Buffer.alloc(13 + varyingSize); - buffer[0] = 1; - buffer.writeUInt16BE(channel, 1); - buffer.writeUInt32BE(3932232, 7); - offset = 11; - val = fields.clusterId; - void 0 === val && (val = ""); - buffer[offset] = clusterId_len; - offset++; - buffer.write(val, offset, "utf8"); - offset += clusterId_len; - buffer[offset] = 206; - buffer.writeUInt32BE(offset - 7, 3); - return buffer; - } - function decodeBasicAck(buffer) { - var val, offset = 0, fields = { - deliveryTag: void 0, - multiple: void 0 - }; - val = ints.readUInt64BE(buffer, offset); - offset += 8; - fields.deliveryTag = val; - val = !!(1 & buffer[offset]); - fields.multiple = val; - return fields; - } - function encodeBasicAck(channel, fields) { - var offset = 0, val = null, bits = 0, buffer = Buffer.alloc(21); - buffer[0] = 1; - buffer.writeUInt16BE(channel, 1); - buffer.writeUInt32BE(3932240, 7); - offset = 11; - val = fields.deliveryTag; - if (void 0 === val) - val = 0; - else if ("number" != typeof val || isNaN(val)) - throw new TypeError("Field 'deliveryTag' is the wrong type; must be a number (but not NaN)"); - ints.writeUInt64BE(buffer, val, offset); - offset += 8; - val = fields.multiple; - void 0 === val && (val = false); - val && (bits += 1); - buffer[offset] = bits; - offset++; - buffer[offset] = 206; - buffer.writeUInt32BE(offset - 7, 3); - return buffer; - } - function decodeBasicReject(buffer) { - var val, offset = 0, fields = { - deliveryTag: void 0, - requeue: void 0 - }; - val = ints.readUInt64BE(buffer, offset); - offset += 8; - fields.deliveryTag = val; - val = !!(1 & buffer[offset]); - fields.requeue = val; - return fields; - } - function encodeBasicReject(channel, fields) { - var offset = 0, val = null, bits = 0, buffer = Buffer.alloc(21); - buffer[0] = 1; - buffer.writeUInt16BE(channel, 1); - buffer.writeUInt32BE(3932250, 7); - offset = 11; - val = fields.deliveryTag; - if (void 0 === val) - throw new Error("Missing value for mandatory field 'deliveryTag'"); - if ("number" != typeof val || isNaN(val)) - throw new TypeError("Field 'deliveryTag' is the wrong type; must be a number (but not NaN)"); - ints.writeUInt64BE(buffer, val, offset); - offset += 8; - val = fields.requeue; - void 0 === val && (val = true); - val && (bits += 1); - buffer[offset] = bits; - offset++; - buffer[offset] = 206; - buffer.writeUInt32BE(offset - 7, 3); - return buffer; - } - function decodeBasicRecoverAsync(buffer) { - var val, fields = { - requeue: void 0 - }; - val = !!(1 & buffer[0]); - fields.requeue = val; - return fields; - } - function encodeBasicRecoverAsync(channel, fields) { - var offset = 0, val = null, bits = 0, buffer = Buffer.alloc(13); - buffer[0] = 1; - buffer.writeUInt16BE(channel, 1); - buffer.writeUInt32BE(3932260, 7); - offset = 11; - val = fields.requeue; - void 0 === val && (val = false); - val && (bits += 1); - buffer[offset] = bits; - offset++; - buffer[offset] = 206; - buffer.writeUInt32BE(offset - 7, 3); - return buffer; - } - function decodeBasicRecover(buffer) { - var val, fields = { - requeue: void 0 - }; - val = !!(1 & buffer[0]); - fields.requeue = val; - return fields; - } - function encodeBasicRecover(channel, fields) { - var offset = 0, val = null, bits = 0, buffer = Buffer.alloc(13); - buffer[0] = 1; - buffer.writeUInt16BE(channel, 1); - buffer.writeUInt32BE(3932270, 7); - offset = 11; - val = fields.requeue; - void 0 === val && (val = false); - val && (bits += 1); - buffer[offset] = bits; - offset++; - buffer[offset] = 206; - buffer.writeUInt32BE(offset - 7, 3); - return buffer; - } - function decodeBasicRecoverOk(buffer) { - return {}; - } - function encodeBasicRecoverOk(channel, fields) { - var offset = 0, buffer = Buffer.alloc(12); - buffer[0] = 1; - buffer.writeUInt16BE(channel, 1); - buffer.writeUInt32BE(3932271, 7); - offset = 11; - buffer[offset] = 206; - buffer.writeUInt32BE(offset - 7, 3); - return buffer; - } - function decodeBasicNack(buffer) { - var val, offset = 0, fields = { - deliveryTag: void 0, - multiple: void 0, - requeue: void 0 - }; - val = ints.readUInt64BE(buffer, offset); - offset += 8; - fields.deliveryTag = val; - val = !!(1 & buffer[offset]); - fields.multiple = val; - val = !!(2 & buffer[offset]); - fields.requeue = val; - return fields; - } - function encodeBasicNack(channel, fields) { - var offset = 0, val = null, bits = 0, buffer = Buffer.alloc(21); - buffer[0] = 1; - buffer.writeUInt16BE(channel, 1); - buffer.writeUInt32BE(3932280, 7); - offset = 11; - val = fields.deliveryTag; - if (void 0 === val) - val = 0; - else if ("number" != typeof val || isNaN(val)) - throw new TypeError("Field 'deliveryTag' is the wrong type; must be a number (but not NaN)"); - ints.writeUInt64BE(buffer, val, offset); - offset += 8; - val = fields.multiple; - void 0 === val && (val = false); - val && (bits += 1); - val = fields.requeue; - void 0 === val && (val = true); - val && (bits += 2); - buffer[offset] = bits; - offset++; - buffer[offset] = 206; - buffer.writeUInt32BE(offset - 7, 3); - return buffer; - } - function decodeTxSelect(buffer) { - return {}; - } - function encodeTxSelect(channel, fields) { - var offset = 0, buffer = Buffer.alloc(12); - buffer[0] = 1; - buffer.writeUInt16BE(channel, 1); - buffer.writeUInt32BE(5898250, 7); - offset = 11; - buffer[offset] = 206; - buffer.writeUInt32BE(offset - 7, 3); - return buffer; - } - function decodeTxSelectOk(buffer) { - return {}; - } - function encodeTxSelectOk(channel, fields) { - var offset = 0, buffer = Buffer.alloc(12); - buffer[0] = 1; - buffer.writeUInt16BE(channel, 1); - buffer.writeUInt32BE(5898251, 7); - offset = 11; - buffer[offset] = 206; - buffer.writeUInt32BE(offset - 7, 3); - return buffer; - } - function decodeTxCommit(buffer) { - return {}; - } - function encodeTxCommit(channel, fields) { - var offset = 0, buffer = Buffer.alloc(12); - buffer[0] = 1; - buffer.writeUInt16BE(channel, 1); - buffer.writeUInt32BE(5898260, 7); - offset = 11; - buffer[offset] = 206; - buffer.writeUInt32BE(offset - 7, 3); - return buffer; - } - function decodeTxCommitOk(buffer) { - return {}; - } - function encodeTxCommitOk(channel, fields) { - var offset = 0, buffer = Buffer.alloc(12); - buffer[0] = 1; - buffer.writeUInt16BE(channel, 1); - buffer.writeUInt32BE(5898261, 7); - offset = 11; - buffer[offset] = 206; - buffer.writeUInt32BE(offset - 7, 3); - return buffer; - } - function decodeTxRollback(buffer) { - return {}; - } - function encodeTxRollback(channel, fields) { - var offset = 0, buffer = Buffer.alloc(12); - buffer[0] = 1; - buffer.writeUInt16BE(channel, 1); - buffer.writeUInt32BE(5898270, 7); - offset = 11; - buffer[offset] = 206; - buffer.writeUInt32BE(offset - 7, 3); - return buffer; - } - function decodeTxRollbackOk(buffer) { - return {}; - } - function encodeTxRollbackOk(channel, fields) { - var offset = 0, buffer = Buffer.alloc(12); - buffer[0] = 1; - buffer.writeUInt16BE(channel, 1); - buffer.writeUInt32BE(5898271, 7); - offset = 11; - buffer[offset] = 206; - buffer.writeUInt32BE(offset - 7, 3); - return buffer; - } - function decodeConfirmSelect(buffer) { - var val, fields = { - nowait: void 0 - }; - val = !!(1 & buffer[0]); - fields.nowait = val; - return fields; - } - function encodeConfirmSelect(channel, fields) { - var offset = 0, val = null, bits = 0, buffer = Buffer.alloc(13); - buffer[0] = 1; - buffer.writeUInt16BE(channel, 1); - buffer.writeUInt32BE(5570570, 7); - offset = 11; - val = fields.nowait; - void 0 === val && (val = false); - val && (bits += 1); - buffer[offset] = bits; - offset++; - buffer[offset] = 206; - buffer.writeUInt32BE(offset - 7, 3); - return buffer; - } - function decodeConfirmSelectOk(buffer) { - return {}; - } - function encodeConfirmSelectOk(channel, fields) { - var offset = 0, buffer = Buffer.alloc(12); - buffer[0] = 1; - buffer.writeUInt16BE(channel, 1); - buffer.writeUInt32BE(5570571, 7); - offset = 11; - buffer[offset] = 206; - buffer.writeUInt32BE(offset - 7, 3); - return buffer; - } - function encodeBasicProperties(channel, size, fields) { - var val, len, offset = 0, flags = 0, scratchOffset = 0, varyingSize = 0; - val = fields.contentType; - if (void 0 != val) { - if (!("string" == typeof val && Buffer.byteLength(val) < 256)) - throw new TypeError("Field 'contentType' is the wrong type; must be a string (up to 255 chars)"); - var contentType_len = Buffer.byteLength(val, "utf8"); - varyingSize += 1; - varyingSize += contentType_len; - } - val = fields.contentEncoding; - if (void 0 != val) { - if (!("string" == typeof val && Buffer.byteLength(val) < 256)) - throw new TypeError("Field 'contentEncoding' is the wrong type; must be a string (up to 255 chars)"); - var contentEncoding_len = Buffer.byteLength(val, "utf8"); - varyingSize += 1; - varyingSize += contentEncoding_len; - } - val = fields.headers; - if (void 0 != val) { - if ("object" != typeof val) - throw new TypeError("Field 'headers' is the wrong type; must be an object"); - len = encodeTable(SCRATCH, val, scratchOffset); - var headers_encoded = SCRATCH.slice(scratchOffset, scratchOffset + len); - scratchOffset += len; - varyingSize += headers_encoded.length; - } - val = fields.deliveryMode; - if (void 0 != val) { - if ("number" != typeof val || isNaN(val)) - throw new TypeError("Field 'deliveryMode' is the wrong type; must be a number (but not NaN)"); - varyingSize += 1; - } - val = fields.priority; - if (void 0 != val) { - if ("number" != typeof val || isNaN(val)) - throw new TypeError("Field 'priority' is the wrong type; must be a number (but not NaN)"); - varyingSize += 1; - } - val = fields.correlationId; - if (void 0 != val) { - if (!("string" == typeof val && Buffer.byteLength(val) < 256)) - throw new TypeError("Field 'correlationId' is the wrong type; must be a string (up to 255 chars)"); - var correlationId_len = Buffer.byteLength(val, "utf8"); - varyingSize += 1; - varyingSize += correlationId_len; - } - val = fields.replyTo; - if (void 0 != val) { - if (!("string" == typeof val && Buffer.byteLength(val) < 256)) - throw new TypeError("Field 'replyTo' is the wrong type; must be a string (up to 255 chars)"); - var replyTo_len = Buffer.byteLength(val, "utf8"); - varyingSize += 1; - varyingSize += replyTo_len; - } - val = fields.expiration; - if (void 0 != val) { - if (!("string" == typeof val && Buffer.byteLength(val) < 256)) - throw new TypeError("Field 'expiration' is the wrong type; must be a string (up to 255 chars)"); - var expiration_len = Buffer.byteLength(val, "utf8"); - varyingSize += 1; - varyingSize += expiration_len; - } - val = fields.messageId; - if (void 0 != val) { - if (!("string" == typeof val && Buffer.byteLength(val) < 256)) - throw new TypeError("Field 'messageId' is the wrong type; must be a string (up to 255 chars)"); - var messageId_len = Buffer.byteLength(val, "utf8"); - varyingSize += 1; - varyingSize += messageId_len; - } - val = fields.timestamp; - if (void 0 != val) { - if ("number" != typeof val || isNaN(val)) - throw new TypeError("Field 'timestamp' is the wrong type; must be a number (but not NaN)"); - varyingSize += 8; - } - val = fields.type; - if (void 0 != val) { - if (!("string" == typeof val && Buffer.byteLength(val) < 256)) - throw new TypeError("Field 'type' is the wrong type; must be a string (up to 255 chars)"); - var type_len = Buffer.byteLength(val, "utf8"); - varyingSize += 1; - varyingSize += type_len; - } - val = fields.userId; - if (void 0 != val) { - if (!("string" == typeof val && Buffer.byteLength(val) < 256)) - throw new TypeError("Field 'userId' is the wrong type; must be a string (up to 255 chars)"); - var userId_len = Buffer.byteLength(val, "utf8"); - varyingSize += 1; - varyingSize += userId_len; - } - val = fields.appId; - if (void 0 != val) { - if (!("string" == typeof val && Buffer.byteLength(val) < 256)) - throw new TypeError("Field 'appId' is the wrong type; must be a string (up to 255 chars)"); - var appId_len = Buffer.byteLength(val, "utf8"); - varyingSize += 1; - varyingSize += appId_len; - } - val = fields.clusterId; - if (void 0 != val) { - if (!("string" == typeof val && Buffer.byteLength(val) < 256)) - throw new TypeError("Field 'clusterId' is the wrong type; must be a string (up to 255 chars)"); - var clusterId_len = Buffer.byteLength(val, "utf8"); - varyingSize += 1; - varyingSize += clusterId_len; - } - var buffer = Buffer.alloc(22 + varyingSize); - buffer[0] = 2; - buffer.writeUInt16BE(channel, 1); - buffer.writeUInt32BE(3932160, 7); - ints.writeUInt64BE(buffer, size, 11); - flags = 0; - offset = 21; - val = fields.contentType; - if (void 0 != val) { - flags += 32768; - buffer[offset] = contentType_len; - offset++; - buffer.write(val, offset, "utf8"); - offset += contentType_len; - } - val = fields.contentEncoding; - if (void 0 != val) { - flags += 16384; - buffer[offset] = contentEncoding_len; - offset++; - buffer.write(val, offset, "utf8"); - offset += contentEncoding_len; - } - val = fields.headers; - if (void 0 != val) { - flags += 8192; - offset += headers_encoded.copy(buffer, offset); - } - val = fields.deliveryMode; - if (void 0 != val) { - flags += 4096; - buffer.writeUInt8(val, offset); - offset++; - } - val = fields.priority; - if (void 0 != val) { - flags += 2048; - buffer.writeUInt8(val, offset); - offset++; - } - val = fields.correlationId; - if (void 0 != val) { - flags += 1024; - buffer[offset] = correlationId_len; - offset++; - buffer.write(val, offset, "utf8"); - offset += correlationId_len; - } - val = fields.replyTo; - if (void 0 != val) { - flags += 512; - buffer[offset] = replyTo_len; - offset++; - buffer.write(val, offset, "utf8"); - offset += replyTo_len; - } - val = fields.expiration; - if (void 0 != val) { - flags += 256; - buffer[offset] = expiration_len; - offset++; - buffer.write(val, offset, "utf8"); - offset += expiration_len; - } - val = fields.messageId; - if (void 0 != val) { - flags += 128; - buffer[offset] = messageId_len; - offset++; - buffer.write(val, offset, "utf8"); - offset += messageId_len; - } - val = fields.timestamp; - if (void 0 != val) { - flags += 64; - ints.writeUInt64BE(buffer, val, offset); - offset += 8; - } - val = fields.type; - if (void 0 != val) { - flags += 32; - buffer[offset] = type_len; - offset++; - buffer.write(val, offset, "utf8"); - offset += type_len; - } - val = fields.userId; - if (void 0 != val) { - flags += 16; - buffer[offset] = userId_len; - offset++; - buffer.write(val, offset, "utf8"); - offset += userId_len; - } - val = fields.appId; - if (void 0 != val) { - flags += 8; - buffer[offset] = appId_len; - offset++; - buffer.write(val, offset, "utf8"); - offset += appId_len; - } - val = fields.clusterId; - if (void 0 != val) { - flags += 4; - buffer[offset] = clusterId_len; - offset++; - buffer.write(val, offset, "utf8"); - offset += clusterId_len; - } - buffer[offset] = 206; - buffer.writeUInt32BE(offset - 7, 3); - buffer.writeUInt16BE(flags, 19); - return buffer.slice(0, offset + 1); - } - function decodeBasicProperties(buffer) { - var flags, val, len, offset = 2; - flags = buffer.readUInt16BE(0); - if (0 === flags) - return {}; - var fields = { - contentType: void 0, - contentEncoding: void 0, - headers: void 0, - deliveryMode: void 0, - priority: void 0, - correlationId: void 0, - replyTo: void 0, - expiration: void 0, - messageId: void 0, - timestamp: void 0, - type: void 0, - userId: void 0, - appId: void 0, - clusterId: void 0 - }; - if (32768 & flags) { - len = buffer.readUInt8(offset); - offset++; - val = buffer.toString("utf8", offset, offset + len); - offset += len; - fields.contentType = val; - } - if (16384 & flags) { - len = buffer.readUInt8(offset); - offset++; - val = buffer.toString("utf8", offset, offset + len); - offset += len; - fields.contentEncoding = val; - } - if (8192 & flags) { - len = buffer.readUInt32BE(offset); - offset += 4; - val = decodeFields(buffer.slice(offset, offset + len)); - offset += len; - fields.headers = val; - } - if (4096 & flags) { - val = buffer[offset]; - offset++; - fields.deliveryMode = val; - } - if (2048 & flags) { - val = buffer[offset]; - offset++; - fields.priority = val; - } - if (1024 & flags) { - len = buffer.readUInt8(offset); - offset++; - val = buffer.toString("utf8", offset, offset + len); - offset += len; - fields.correlationId = val; - } - if (512 & flags) { - len = buffer.readUInt8(offset); - offset++; - val = buffer.toString("utf8", offset, offset + len); - offset += len; - fields.replyTo = val; - } - if (256 & flags) { - len = buffer.readUInt8(offset); - offset++; - val = buffer.toString("utf8", offset, offset + len); - offset += len; - fields.expiration = val; - } - if (128 & flags) { - len = buffer.readUInt8(offset); - offset++; - val = buffer.toString("utf8", offset, offset + len); - offset += len; - fields.messageId = val; - } - if (64 & flags) { - val = ints.readUInt64BE(buffer, offset); - offset += 8; - fields.timestamp = val; - } - if (32 & flags) { - len = buffer.readUInt8(offset); - offset++; - val = buffer.toString("utf8", offset, offset + len); - offset += len; - fields.type = val; - } - if (16 & flags) { - len = buffer.readUInt8(offset); - offset++; - val = buffer.toString("utf8", offset, offset + len); - offset += len; - fields.userId = val; - } - if (8 & flags) { - len = buffer.readUInt8(offset); - offset++; - val = buffer.toString("utf8", offset, offset + len); - offset += len; - fields.appId = val; - } - if (4 & flags) { - len = buffer.readUInt8(offset); - offset++; - val = buffer.toString("utf8", offset, offset + len); - offset += len; - fields.clusterId = val; - } - return fields; - } - var codec = require_codec(); - var ints = require_buffer_more_ints(); - var encodeTable = codec.encodeTable; - var decodeFields = codec.decodeFields; - var SCRATCH = Buffer.alloc(65536); - var EMPTY_OBJECT = Object.freeze({}); - module2.exports.constants = { - FRAME_METHOD: 1, - FRAME_HEADER: 2, - FRAME_BODY: 3, - FRAME_HEARTBEAT: 8, - FRAME_MIN_SIZE: 4096, - FRAME_END: 206, - REPLY_SUCCESS: 200, - CONTENT_TOO_LARGE: 311, - NO_ROUTE: 312, - NO_CONSUMERS: 313, - ACCESS_REFUSED: 403, - NOT_FOUND: 404, - RESOURCE_LOCKED: 405, - PRECONDITION_FAILED: 406, - CONNECTION_FORCED: 320, - INVALID_PATH: 402, - FRAME_ERROR: 501, - SYNTAX_ERROR: 502, - COMMAND_INVALID: 503, - CHANNEL_ERROR: 504, - UNEXPECTED_FRAME: 505, - RESOURCE_ERROR: 506, - NOT_ALLOWED: 530, - NOT_IMPLEMENTED: 540, - INTERNAL_ERROR: 541 - }; - module2.exports.constant_strs = { - "1": "FRAME-METHOD", - "2": "FRAME-HEADER", - "3": "FRAME-BODY", - "8": "FRAME-HEARTBEAT", - "200": "REPLY-SUCCESS", - "206": "FRAME-END", - "311": "CONTENT-TOO-LARGE", - "312": "NO-ROUTE", - "313": "NO-CONSUMERS", - "320": "CONNECTION-FORCED", - "402": "INVALID-PATH", - "403": "ACCESS-REFUSED", - "404": "NOT-FOUND", - "405": "RESOURCE-LOCKED", - "406": "PRECONDITION-FAILED", - "501": "FRAME-ERROR", - "502": "SYNTAX-ERROR", - "503": "COMMAND-INVALID", - "504": "CHANNEL-ERROR", - "505": "UNEXPECTED-FRAME", - "506": "RESOURCE-ERROR", - "530": "NOT-ALLOWED", - "540": "NOT-IMPLEMENTED", - "541": "INTERNAL-ERROR", - "4096": "FRAME-MIN-SIZE" - }; - module2.exports.FRAME_OVERHEAD = 8; - module2.exports.decode = function(id, buf) { - switch (id) { - case 655370: - return decodeConnectionStart(buf); - case 655371: - return decodeConnectionStartOk(buf); - case 655380: - return decodeConnectionSecure(buf); - case 655381: - return decodeConnectionSecureOk(buf); - case 655390: - return decodeConnectionTune(buf); - case 655391: - return decodeConnectionTuneOk(buf); - case 655400: - return decodeConnectionOpen(buf); - case 655401: - return decodeConnectionOpenOk(buf); - case 655410: - return decodeConnectionClose(buf); - case 655411: - return decodeConnectionCloseOk(buf); - case 655420: - return decodeConnectionBlocked(buf); - case 655421: - return decodeConnectionUnblocked(buf); - case 1310730: - return decodeChannelOpen(buf); - case 1310731: - return decodeChannelOpenOk(buf); - case 1310740: - return decodeChannelFlow(buf); - case 1310741: - return decodeChannelFlowOk(buf); - case 1310760: - return decodeChannelClose(buf); - case 1310761: - return decodeChannelCloseOk(buf); - case 1966090: - return decodeAccessRequest(buf); - case 1966091: - return decodeAccessRequestOk(buf); - case 2621450: - return decodeExchangeDeclare(buf); - case 2621451: - return decodeExchangeDeclareOk(buf); - case 2621460: - return decodeExchangeDelete(buf); - case 2621461: - return decodeExchangeDeleteOk(buf); - case 2621470: - return decodeExchangeBind(buf); - case 2621471: - return decodeExchangeBindOk(buf); - case 2621480: - return decodeExchangeUnbind(buf); - case 2621491: - return decodeExchangeUnbindOk(buf); - case 3276810: - return decodeQueueDeclare(buf); - case 3276811: - return decodeQueueDeclareOk(buf); - case 3276820: - return decodeQueueBind(buf); - case 3276821: - return decodeQueueBindOk(buf); - case 3276830: - return decodeQueuePurge(buf); - case 3276831: - return decodeQueuePurgeOk(buf); - case 3276840: - return decodeQueueDelete(buf); - case 3276841: - return decodeQueueDeleteOk(buf); - case 3276850: - return decodeQueueUnbind(buf); - case 3276851: - return decodeQueueUnbindOk(buf); - case 3932170: - return decodeBasicQos(buf); - case 3932171: - return decodeBasicQosOk(buf); - case 3932180: - return decodeBasicConsume(buf); - case 3932181: - return decodeBasicConsumeOk(buf); - case 3932190: - return decodeBasicCancel(buf); - case 3932191: - return decodeBasicCancelOk(buf); - case 3932200: - return decodeBasicPublish(buf); - case 3932210: - return decodeBasicReturn(buf); - case 3932220: - return decodeBasicDeliver(buf); - case 3932230: - return decodeBasicGet(buf); - case 3932231: - return decodeBasicGetOk(buf); - case 3932232: - return decodeBasicGetEmpty(buf); - case 3932240: - return decodeBasicAck(buf); - case 3932250: - return decodeBasicReject(buf); - case 3932260: - return decodeBasicRecoverAsync(buf); - case 3932270: - return decodeBasicRecover(buf); - case 3932271: - return decodeBasicRecoverOk(buf); - case 3932280: - return decodeBasicNack(buf); - case 5898250: - return decodeTxSelect(buf); - case 5898251: - return decodeTxSelectOk(buf); - case 5898260: - return decodeTxCommit(buf); - case 5898261: - return decodeTxCommitOk(buf); - case 5898270: - return decodeTxRollback(buf); - case 5898271: - return decodeTxRollbackOk(buf); - case 5570570: - return decodeConfirmSelect(buf); - case 5570571: - return decodeConfirmSelectOk(buf); - case 60: - return decodeBasicProperties(buf); - default: - throw new Error("Unknown class/method ID"); - } - }; - module2.exports.encodeMethod = function(id, channel, fields) { - switch (id) { - case 655370: - return encodeConnectionStart(channel, fields); - case 655371: - return encodeConnectionStartOk(channel, fields); - case 655380: - return encodeConnectionSecure(channel, fields); - case 655381: - return encodeConnectionSecureOk(channel, fields); - case 655390: - return encodeConnectionTune(channel, fields); - case 655391: - return encodeConnectionTuneOk(channel, fields); - case 655400: - return encodeConnectionOpen(channel, fields); - case 655401: - return encodeConnectionOpenOk(channel, fields); - case 655410: - return encodeConnectionClose(channel, fields); - case 655411: - return encodeConnectionCloseOk(channel, fields); - case 655420: - return encodeConnectionBlocked(channel, fields); - case 655421: - return encodeConnectionUnblocked(channel, fields); - case 1310730: - return encodeChannelOpen(channel, fields); - case 1310731: - return encodeChannelOpenOk(channel, fields); - case 1310740: - return encodeChannelFlow(channel, fields); - case 1310741: - return encodeChannelFlowOk(channel, fields); - case 1310760: - return encodeChannelClose(channel, fields); - case 1310761: - return encodeChannelCloseOk(channel, fields); - case 1966090: - return encodeAccessRequest(channel, fields); - case 1966091: - return encodeAccessRequestOk(channel, fields); - case 2621450: - return encodeExchangeDeclare(channel, fields); - case 2621451: - return encodeExchangeDeclareOk(channel, fields); - case 2621460: - return encodeExchangeDelete(channel, fields); - case 2621461: - return encodeExchangeDeleteOk(channel, fields); - case 2621470: - return encodeExchangeBind(channel, fields); - case 2621471: - return encodeExchangeBindOk(channel, fields); - case 2621480: - return encodeExchangeUnbind(channel, fields); - case 2621491: - return encodeExchangeUnbindOk(channel, fields); - case 3276810: - return encodeQueueDeclare(channel, fields); - case 3276811: - return encodeQueueDeclareOk(channel, fields); - case 3276820: - return encodeQueueBind(channel, fields); - case 3276821: - return encodeQueueBindOk(channel, fields); - case 3276830: - return encodeQueuePurge(channel, fields); - case 3276831: - return encodeQueuePurgeOk(channel, fields); - case 3276840: - return encodeQueueDelete(channel, fields); - case 3276841: - return encodeQueueDeleteOk(channel, fields); - case 3276850: - return encodeQueueUnbind(channel, fields); - case 3276851: - return encodeQueueUnbindOk(channel, fields); - case 3932170: - return encodeBasicQos(channel, fields); - case 3932171: - return encodeBasicQosOk(channel, fields); - case 3932180: - return encodeBasicConsume(channel, fields); - case 3932181: - return encodeBasicConsumeOk(channel, fields); - case 3932190: - return encodeBasicCancel(channel, fields); - case 3932191: - return encodeBasicCancelOk(channel, fields); - case 3932200: - return encodeBasicPublish(channel, fields); - case 3932210: - return encodeBasicReturn(channel, fields); - case 3932220: - return encodeBasicDeliver(channel, fields); - case 3932230: - return encodeBasicGet(channel, fields); - case 3932231: - return encodeBasicGetOk(channel, fields); - case 3932232: - return encodeBasicGetEmpty(channel, fields); - case 3932240: - return encodeBasicAck(channel, fields); - case 3932250: - return encodeBasicReject(channel, fields); - case 3932260: - return encodeBasicRecoverAsync(channel, fields); - case 3932270: - return encodeBasicRecover(channel, fields); - case 3932271: - return encodeBasicRecoverOk(channel, fields); - case 3932280: - return encodeBasicNack(channel, fields); - case 5898250: - return encodeTxSelect(channel, fields); - case 5898251: - return encodeTxSelectOk(channel, fields); - case 5898260: - return encodeTxCommit(channel, fields); - case 5898261: - return encodeTxCommitOk(channel, fields); - case 5898270: - return encodeTxRollback(channel, fields); - case 5898271: - return encodeTxRollbackOk(channel, fields); - case 5570570: - return encodeConfirmSelect(channel, fields); - case 5570571: - return encodeConfirmSelectOk(channel, fields); - default: - throw new Error("Unknown class/method ID"); - } - }; - module2.exports.encodeProperties = function(id, channel, size, fields) { - switch (id) { - case 60: - return encodeBasicProperties(channel, size, fields); - default: - throw new Error("Unknown class/properties ID"); - } - }; - module2.exports.info = function(id) { - switch (id) { - case 655370: - return methodInfoConnectionStart; - case 655371: - return methodInfoConnectionStartOk; - case 655380: - return methodInfoConnectionSecure; - case 655381: - return methodInfoConnectionSecureOk; - case 655390: - return methodInfoConnectionTune; - case 655391: - return methodInfoConnectionTuneOk; - case 655400: - return methodInfoConnectionOpen; - case 655401: - return methodInfoConnectionOpenOk; - case 655410: - return methodInfoConnectionClose; - case 655411: - return methodInfoConnectionCloseOk; - case 655420: - return methodInfoConnectionBlocked; - case 655421: - return methodInfoConnectionUnblocked; - case 1310730: - return methodInfoChannelOpen; - case 1310731: - return methodInfoChannelOpenOk; - case 1310740: - return methodInfoChannelFlow; - case 1310741: - return methodInfoChannelFlowOk; - case 1310760: - return methodInfoChannelClose; - case 1310761: - return methodInfoChannelCloseOk; - case 1966090: - return methodInfoAccessRequest; - case 1966091: - return methodInfoAccessRequestOk; - case 2621450: - return methodInfoExchangeDeclare; - case 2621451: - return methodInfoExchangeDeclareOk; - case 2621460: - return methodInfoExchangeDelete; - case 2621461: - return methodInfoExchangeDeleteOk; - case 2621470: - return methodInfoExchangeBind; - case 2621471: - return methodInfoExchangeBindOk; - case 2621480: - return methodInfoExchangeUnbind; - case 2621491: - return methodInfoExchangeUnbindOk; - case 3276810: - return methodInfoQueueDeclare; - case 3276811: - return methodInfoQueueDeclareOk; - case 3276820: - return methodInfoQueueBind; - case 3276821: - return methodInfoQueueBindOk; - case 3276830: - return methodInfoQueuePurge; - case 3276831: - return methodInfoQueuePurgeOk; - case 3276840: - return methodInfoQueueDelete; - case 3276841: - return methodInfoQueueDeleteOk; - case 3276850: - return methodInfoQueueUnbind; - case 3276851: - return methodInfoQueueUnbindOk; - case 3932170: - return methodInfoBasicQos; - case 3932171: - return methodInfoBasicQosOk; - case 3932180: - return methodInfoBasicConsume; - case 3932181: - return methodInfoBasicConsumeOk; - case 3932190: - return methodInfoBasicCancel; - case 3932191: - return methodInfoBasicCancelOk; - case 3932200: - return methodInfoBasicPublish; - case 3932210: - return methodInfoBasicReturn; - case 3932220: - return methodInfoBasicDeliver; - case 3932230: - return methodInfoBasicGet; - case 3932231: - return methodInfoBasicGetOk; - case 3932232: - return methodInfoBasicGetEmpty; - case 3932240: - return methodInfoBasicAck; - case 3932250: - return methodInfoBasicReject; - case 3932260: - return methodInfoBasicRecoverAsync; - case 3932270: - return methodInfoBasicRecover; - case 3932271: - return methodInfoBasicRecoverOk; - case 3932280: - return methodInfoBasicNack; - case 5898250: - return methodInfoTxSelect; - case 5898251: - return methodInfoTxSelectOk; - case 5898260: - return methodInfoTxCommit; - case 5898261: - return methodInfoTxCommitOk; - case 5898270: - return methodInfoTxRollback; - case 5898271: - return methodInfoTxRollbackOk; - case 5570570: - return methodInfoConfirmSelect; - case 5570571: - return methodInfoConfirmSelectOk; - case 60: - return propertiesInfoBasicProperties; - default: - throw new Error("Unknown class/method ID"); - } - }; - module2.exports.ConnectionStart = 655370; - var methodInfoConnectionStart = module2.exports.methodInfoConnectionStart = { - id: 655370, - classId: 10, - methodId: 10, - name: "ConnectionStart", - args: [{ - type: "octet", - name: "versionMajor", - default: 0 - }, { - type: "octet", - name: "versionMinor", - default: 9 - }, { - type: "table", - name: "serverProperties" - }, { - type: "longstr", - name: "mechanisms", - default: "PLAIN" - }, { - type: "longstr", - name: "locales", - default: "en_US" - }] - }; - module2.exports.ConnectionStartOk = 655371; - var methodInfoConnectionStartOk = module2.exports.methodInfoConnectionStartOk = { - id: 655371, - classId: 10, - methodId: 11, - name: "ConnectionStartOk", - args: [{ - type: "table", - name: "clientProperties" - }, { - type: "shortstr", - name: "mechanism", - default: "PLAIN" - }, { - type: "longstr", - name: "response" - }, { - type: "shortstr", - name: "locale", - default: "en_US" - }] - }; - module2.exports.ConnectionSecure = 655380; - var methodInfoConnectionSecure = module2.exports.methodInfoConnectionSecure = { - id: 655380, - classId: 10, - methodId: 20, - name: "ConnectionSecure", - args: [{ - type: "longstr", - name: "challenge" - }] - }; - module2.exports.ConnectionSecureOk = 655381; - var methodInfoConnectionSecureOk = module2.exports.methodInfoConnectionSecureOk = { - id: 655381, - classId: 10, - methodId: 21, - name: "ConnectionSecureOk", - args: [{ - type: "longstr", - name: "response" - }] - }; - module2.exports.ConnectionTune = 655390; - var methodInfoConnectionTune = module2.exports.methodInfoConnectionTune = { - id: 655390, - classId: 10, - methodId: 30, - name: "ConnectionTune", - args: [{ - type: "short", - name: "channelMax", - default: 0 - }, { - type: "long", - name: "frameMax", - default: 0 - }, { - type: "short", - name: "heartbeat", - default: 0 - }] - }; - module2.exports.ConnectionTuneOk = 655391; - var methodInfoConnectionTuneOk = module2.exports.methodInfoConnectionTuneOk = { - id: 655391, - classId: 10, - methodId: 31, - name: "ConnectionTuneOk", - args: [{ - type: "short", - name: "channelMax", - default: 0 - }, { - type: "long", - name: "frameMax", - default: 0 - }, { - type: "short", - name: "heartbeat", - default: 0 - }] - }; - module2.exports.ConnectionOpen = 655400; - var methodInfoConnectionOpen = module2.exports.methodInfoConnectionOpen = { - id: 655400, - classId: 10, - methodId: 40, - name: "ConnectionOpen", - args: [{ - type: "shortstr", - name: "virtualHost", - default: "/" - }, { - type: "shortstr", - name: "capabilities", - default: "" - }, { - type: "bit", - name: "insist", - default: false - }] - }; - module2.exports.ConnectionOpenOk = 655401; - var methodInfoConnectionOpenOk = module2.exports.methodInfoConnectionOpenOk = { - id: 655401, - classId: 10, - methodId: 41, - name: "ConnectionOpenOk", - args: [{ - type: "shortstr", - name: "knownHosts", - default: "" - }] - }; - module2.exports.ConnectionClose = 655410; - var methodInfoConnectionClose = module2.exports.methodInfoConnectionClose = { - id: 655410, - classId: 10, - methodId: 50, - name: "ConnectionClose", - args: [{ - type: "short", - name: "replyCode" - }, { - type: "shortstr", - name: "replyText", - default: "" - }, { - type: "short", - name: "classId" - }, { - type: "short", - name: "methodId" - }] - }; - module2.exports.ConnectionCloseOk = 655411; - var methodInfoConnectionCloseOk = module2.exports.methodInfoConnectionCloseOk = { - id: 655411, - classId: 10, - methodId: 51, - name: "ConnectionCloseOk", - args: [] - }; - module2.exports.ConnectionBlocked = 655420; - var methodInfoConnectionBlocked = module2.exports.methodInfoConnectionBlocked = { - id: 655420, - classId: 10, - methodId: 60, - name: "ConnectionBlocked", - args: [{ - type: "shortstr", - name: "reason", - default: "" - }] - }; - module2.exports.ConnectionUnblocked = 655421; - var methodInfoConnectionUnblocked = module2.exports.methodInfoConnectionUnblocked = { - id: 655421, - classId: 10, - methodId: 61, - name: "ConnectionUnblocked", - args: [] - }; - module2.exports.ChannelOpen = 1310730; - var methodInfoChannelOpen = module2.exports.methodInfoChannelOpen = { - id: 1310730, - classId: 20, - methodId: 10, - name: "ChannelOpen", - args: [{ - type: "shortstr", - name: "outOfBand", - default: "" - }] - }; - module2.exports.ChannelOpenOk = 1310731; - var methodInfoChannelOpenOk = module2.exports.methodInfoChannelOpenOk = { - id: 1310731, - classId: 20, - methodId: 11, - name: "ChannelOpenOk", - args: [{ - type: "longstr", - name: "channelId", - default: "" - }] - }; - module2.exports.ChannelFlow = 1310740; - var methodInfoChannelFlow = module2.exports.methodInfoChannelFlow = { - id: 1310740, - classId: 20, - methodId: 20, - name: "ChannelFlow", - args: [{ - type: "bit", - name: "active" - }] - }; - module2.exports.ChannelFlowOk = 1310741; - var methodInfoChannelFlowOk = module2.exports.methodInfoChannelFlowOk = { - id: 1310741, - classId: 20, - methodId: 21, - name: "ChannelFlowOk", - args: [{ - type: "bit", - name: "active" - }] - }; - module2.exports.ChannelClose = 1310760; - var methodInfoChannelClose = module2.exports.methodInfoChannelClose = { - id: 1310760, - classId: 20, - methodId: 40, - name: "ChannelClose", - args: [{ - type: "short", - name: "replyCode" - }, { - type: "shortstr", - name: "replyText", - default: "" - }, { - type: "short", - name: "classId" - }, { - type: "short", - name: "methodId" - }] - }; - module2.exports.ChannelCloseOk = 1310761; - var methodInfoChannelCloseOk = module2.exports.methodInfoChannelCloseOk = { - id: 1310761, - classId: 20, - methodId: 41, - name: "ChannelCloseOk", - args: [] - }; - module2.exports.AccessRequest = 1966090; - var methodInfoAccessRequest = module2.exports.methodInfoAccessRequest = { - id: 1966090, - classId: 30, - methodId: 10, - name: "AccessRequest", - args: [{ - type: "shortstr", - name: "realm", - default: "/data" - }, { - type: "bit", - name: "exclusive", - default: false - }, { - type: "bit", - name: "passive", - default: true - }, { - type: "bit", - name: "active", - default: true - }, { - type: "bit", - name: "write", - default: true - }, { - type: "bit", - name: "read", - default: true - }] - }; - module2.exports.AccessRequestOk = 1966091; - var methodInfoAccessRequestOk = module2.exports.methodInfoAccessRequestOk = { - id: 1966091, - classId: 30, - methodId: 11, - name: "AccessRequestOk", - args: [{ - type: "short", - name: "ticket", - default: 1 - }] - }; - module2.exports.ExchangeDeclare = 2621450; - var methodInfoExchangeDeclare = module2.exports.methodInfoExchangeDeclare = { - id: 2621450, - classId: 40, - methodId: 10, - name: "ExchangeDeclare", - args: [{ - type: "short", - name: "ticket", - default: 0 - }, { - type: "shortstr", - name: "exchange" - }, { - type: "shortstr", - name: "type", - default: "direct" - }, { - type: "bit", - name: "passive", - default: false - }, { - type: "bit", - name: "durable", - default: false - }, { - type: "bit", - name: "autoDelete", - default: false - }, { - type: "bit", - name: "internal", - default: false - }, { - type: "bit", - name: "nowait", - default: false - }, { - type: "table", - name: "arguments", - default: {} - }] - }; - module2.exports.ExchangeDeclareOk = 2621451; - var methodInfoExchangeDeclareOk = module2.exports.methodInfoExchangeDeclareOk = { - id: 2621451, - classId: 40, - methodId: 11, - name: "ExchangeDeclareOk", - args: [] - }; - module2.exports.ExchangeDelete = 2621460; - var methodInfoExchangeDelete = module2.exports.methodInfoExchangeDelete = { - id: 2621460, - classId: 40, - methodId: 20, - name: "ExchangeDelete", - args: [{ - type: "short", - name: "ticket", - default: 0 - }, { - type: "shortstr", - name: "exchange" - }, { - type: "bit", - name: "ifUnused", - default: false - }, { - type: "bit", - name: "nowait", - default: false - }] - }; - module2.exports.ExchangeDeleteOk = 2621461; - var methodInfoExchangeDeleteOk = module2.exports.methodInfoExchangeDeleteOk = { - id: 2621461, - classId: 40, - methodId: 21, - name: "ExchangeDeleteOk", - args: [] - }; - module2.exports.ExchangeBind = 2621470; - var methodInfoExchangeBind = module2.exports.methodInfoExchangeBind = { - id: 2621470, - classId: 40, - methodId: 30, - name: "ExchangeBind", - args: [{ - type: "short", - name: "ticket", - default: 0 - }, { - type: "shortstr", - name: "destination" - }, { - type: "shortstr", - name: "source" - }, { - type: "shortstr", - name: "routingKey", - default: "" - }, { - type: "bit", - name: "nowait", - default: false - }, { - type: "table", - name: "arguments", - default: {} - }] - }; - module2.exports.ExchangeBindOk = 2621471; - var methodInfoExchangeBindOk = module2.exports.methodInfoExchangeBindOk = { - id: 2621471, - classId: 40, - methodId: 31, - name: "ExchangeBindOk", - args: [] - }; - module2.exports.ExchangeUnbind = 2621480; - var methodInfoExchangeUnbind = module2.exports.methodInfoExchangeUnbind = { - id: 2621480, - classId: 40, - methodId: 40, - name: "ExchangeUnbind", - args: [{ - type: "short", - name: "ticket", - default: 0 - }, { - type: "shortstr", - name: "destination" - }, { - type: "shortstr", - name: "source" - }, { - type: "shortstr", - name: "routingKey", - default: "" - }, { - type: "bit", - name: "nowait", - default: false - }, { - type: "table", - name: "arguments", - default: {} - }] - }; - module2.exports.ExchangeUnbindOk = 2621491; - var methodInfoExchangeUnbindOk = module2.exports.methodInfoExchangeUnbindOk = { - id: 2621491, - classId: 40, - methodId: 51, - name: "ExchangeUnbindOk", - args: [] - }; - module2.exports.QueueDeclare = 3276810; - var methodInfoQueueDeclare = module2.exports.methodInfoQueueDeclare = { - id: 3276810, - classId: 50, - methodId: 10, - name: "QueueDeclare", - args: [{ - type: "short", - name: "ticket", - default: 0 - }, { - type: "shortstr", - name: "queue", - default: "" - }, { - type: "bit", - name: "passive", - default: false - }, { - type: "bit", - name: "durable", - default: false - }, { - type: "bit", - name: "exclusive", - default: false - }, { - type: "bit", - name: "autoDelete", - default: false - }, { - type: "bit", - name: "nowait", - default: false - }, { - type: "table", - name: "arguments", - default: {} - }] - }; - module2.exports.QueueDeclareOk = 3276811; - var methodInfoQueueDeclareOk = module2.exports.methodInfoQueueDeclareOk = { - id: 3276811, - classId: 50, - methodId: 11, - name: "QueueDeclareOk", - args: [{ - type: "shortstr", - name: "queue" - }, { - type: "long", - name: "messageCount" - }, { - type: "long", - name: "consumerCount" - }] - }; - module2.exports.QueueBind = 3276820; - var methodInfoQueueBind = module2.exports.methodInfoQueueBind = { - id: 3276820, - classId: 50, - methodId: 20, - name: "QueueBind", - args: [{ - type: "short", - name: "ticket", - default: 0 - }, { - type: "shortstr", - name: "queue", - default: "" - }, { - type: "shortstr", - name: "exchange" - }, { - type: "shortstr", - name: "routingKey", - default: "" - }, { - type: "bit", - name: "nowait", - default: false - }, { - type: "table", - name: "arguments", - default: {} - }] - }; - module2.exports.QueueBindOk = 3276821; - var methodInfoQueueBindOk = module2.exports.methodInfoQueueBindOk = { - id: 3276821, - classId: 50, - methodId: 21, - name: "QueueBindOk", - args: [] - }; - module2.exports.QueuePurge = 3276830; - var methodInfoQueuePurge = module2.exports.methodInfoQueuePurge = { - id: 3276830, - classId: 50, - methodId: 30, - name: "QueuePurge", - args: [{ - type: "short", - name: "ticket", - default: 0 - }, { - type: "shortstr", - name: "queue", - default: "" - }, { - type: "bit", - name: "nowait", - default: false - }] - }; - module2.exports.QueuePurgeOk = 3276831; - var methodInfoQueuePurgeOk = module2.exports.methodInfoQueuePurgeOk = { - id: 3276831, - classId: 50, - methodId: 31, - name: "QueuePurgeOk", - args: [{ - type: "long", - name: "messageCount" - }] - }; - module2.exports.QueueDelete = 3276840; - var methodInfoQueueDelete = module2.exports.methodInfoQueueDelete = { - id: 3276840, - classId: 50, - methodId: 40, - name: "QueueDelete", - args: [{ - type: "short", - name: "ticket", - default: 0 - }, { - type: "shortstr", - name: "queue", - default: "" - }, { - type: "bit", - name: "ifUnused", - default: false - }, { - type: "bit", - name: "ifEmpty", - default: false - }, { - type: "bit", - name: "nowait", - default: false - }] - }; - module2.exports.QueueDeleteOk = 3276841; - var methodInfoQueueDeleteOk = module2.exports.methodInfoQueueDeleteOk = { - id: 3276841, - classId: 50, - methodId: 41, - name: "QueueDeleteOk", - args: [{ - type: "long", - name: "messageCount" - }] - }; - module2.exports.QueueUnbind = 3276850; - var methodInfoQueueUnbind = module2.exports.methodInfoQueueUnbind = { - id: 3276850, - classId: 50, - methodId: 50, - name: "QueueUnbind", - args: [{ - type: "short", - name: "ticket", - default: 0 - }, { - type: "shortstr", - name: "queue", - default: "" - }, { - type: "shortstr", - name: "exchange" - }, { - type: "shortstr", - name: "routingKey", - default: "" - }, { - type: "table", - name: "arguments", - default: {} - }] - }; - module2.exports.QueueUnbindOk = 3276851; - var methodInfoQueueUnbindOk = module2.exports.methodInfoQueueUnbindOk = { - id: 3276851, - classId: 50, - methodId: 51, - name: "QueueUnbindOk", - args: [] - }; - module2.exports.BasicQos = 3932170; - var methodInfoBasicQos = module2.exports.methodInfoBasicQos = { - id: 3932170, - classId: 60, - methodId: 10, - name: "BasicQos", - args: [{ - type: "long", - name: "prefetchSize", - default: 0 - }, { - type: "short", - name: "prefetchCount", - default: 0 - }, { - type: "bit", - name: "global", - default: false - }] - }; - module2.exports.BasicQosOk = 3932171; - var methodInfoBasicQosOk = module2.exports.methodInfoBasicQosOk = { - id: 3932171, - classId: 60, - methodId: 11, - name: "BasicQosOk", - args: [] - }; - module2.exports.BasicConsume = 3932180; - var methodInfoBasicConsume = module2.exports.methodInfoBasicConsume = { - id: 3932180, - classId: 60, - methodId: 20, - name: "BasicConsume", - args: [{ - type: "short", - name: "ticket", - default: 0 - }, { - type: "shortstr", - name: "queue", - default: "" - }, { - type: "shortstr", - name: "consumerTag", - default: "" - }, { - type: "bit", - name: "noLocal", - default: false - }, { - type: "bit", - name: "noAck", - default: false - }, { - type: "bit", - name: "exclusive", - default: false - }, { - type: "bit", - name: "nowait", - default: false - }, { - type: "table", - name: "arguments", - default: {} - }] - }; - module2.exports.BasicConsumeOk = 3932181; - var methodInfoBasicConsumeOk = module2.exports.methodInfoBasicConsumeOk = { - id: 3932181, - classId: 60, - methodId: 21, - name: "BasicConsumeOk", - args: [{ - type: "shortstr", - name: "consumerTag" - }] - }; - module2.exports.BasicCancel = 3932190; - var methodInfoBasicCancel = module2.exports.methodInfoBasicCancel = { - id: 3932190, - classId: 60, - methodId: 30, - name: "BasicCancel", - args: [{ - type: "shortstr", - name: "consumerTag" - }, { - type: "bit", - name: "nowait", - default: false - }] - }; - module2.exports.BasicCancelOk = 3932191; - var methodInfoBasicCancelOk = module2.exports.methodInfoBasicCancelOk = { - id: 3932191, - classId: 60, - methodId: 31, - name: "BasicCancelOk", - args: [{ - type: "shortstr", - name: "consumerTag" - }] - }; - module2.exports.BasicPublish = 3932200; - var methodInfoBasicPublish = module2.exports.methodInfoBasicPublish = { - id: 3932200, - classId: 60, - methodId: 40, - name: "BasicPublish", - args: [{ - type: "short", - name: "ticket", - default: 0 - }, { - type: "shortstr", - name: "exchange", - default: "" - }, { - type: "shortstr", - name: "routingKey", - default: "" - }, { - type: "bit", - name: "mandatory", - default: false - }, { - type: "bit", - name: "immediate", - default: false - }] - }; - module2.exports.BasicReturn = 3932210; - var methodInfoBasicReturn = module2.exports.methodInfoBasicReturn = { - id: 3932210, - classId: 60, - methodId: 50, - name: "BasicReturn", - args: [{ - type: "short", - name: "replyCode" - }, { - type: "shortstr", - name: "replyText", - default: "" - }, { - type: "shortstr", - name: "exchange" - }, { - type: "shortstr", - name: "routingKey" - }] - }; - module2.exports.BasicDeliver = 3932220; - var methodInfoBasicDeliver = module2.exports.methodInfoBasicDeliver = { - id: 3932220, - classId: 60, - methodId: 60, - name: "BasicDeliver", - args: [{ - type: "shortstr", - name: "consumerTag" - }, { - type: "longlong", - name: "deliveryTag" - }, { - type: "bit", - name: "redelivered", - default: false - }, { - type: "shortstr", - name: "exchange" - }, { - type: "shortstr", - name: "routingKey" - }] - }; - module2.exports.BasicGet = 3932230; - var methodInfoBasicGet = module2.exports.methodInfoBasicGet = { - id: 3932230, - classId: 60, - methodId: 70, - name: "BasicGet", - args: [{ - type: "short", - name: "ticket", - default: 0 - }, { - type: "shortstr", - name: "queue", - default: "" - }, { - type: "bit", - name: "noAck", - default: false - }] - }; - module2.exports.BasicGetOk = 3932231; - var methodInfoBasicGetOk = module2.exports.methodInfoBasicGetOk = { - id: 3932231, - classId: 60, - methodId: 71, - name: "BasicGetOk", - args: [{ - type: "longlong", - name: "deliveryTag" - }, { - type: "bit", - name: "redelivered", - default: false - }, { - type: "shortstr", - name: "exchange" - }, { - type: "shortstr", - name: "routingKey" - }, { - type: "long", - name: "messageCount" - }] - }; - module2.exports.BasicGetEmpty = 3932232; - var methodInfoBasicGetEmpty = module2.exports.methodInfoBasicGetEmpty = { - id: 3932232, - classId: 60, - methodId: 72, - name: "BasicGetEmpty", - args: [{ - type: "shortstr", - name: "clusterId", - default: "" - }] - }; - module2.exports.BasicAck = 3932240; - var methodInfoBasicAck = module2.exports.methodInfoBasicAck = { - id: 3932240, - classId: 60, - methodId: 80, - name: "BasicAck", - args: [{ - type: "longlong", - name: "deliveryTag", - default: 0 - }, { - type: "bit", - name: "multiple", - default: false - }] - }; - module2.exports.BasicReject = 3932250; - var methodInfoBasicReject = module2.exports.methodInfoBasicReject = { - id: 3932250, - classId: 60, - methodId: 90, - name: "BasicReject", - args: [{ - type: "longlong", - name: "deliveryTag" - }, { - type: "bit", - name: "requeue", - default: true - }] - }; - module2.exports.BasicRecoverAsync = 3932260; - var methodInfoBasicRecoverAsync = module2.exports.methodInfoBasicRecoverAsync = { - id: 3932260, - classId: 60, - methodId: 100, - name: "BasicRecoverAsync", - args: [{ - type: "bit", - name: "requeue", - default: false - }] - }; - module2.exports.BasicRecover = 3932270; - var methodInfoBasicRecover = module2.exports.methodInfoBasicRecover = { - id: 3932270, - classId: 60, - methodId: 110, - name: "BasicRecover", - args: [{ - type: "bit", - name: "requeue", - default: false - }] - }; - module2.exports.BasicRecoverOk = 3932271; - var methodInfoBasicRecoverOk = module2.exports.methodInfoBasicRecoverOk = { - id: 3932271, - classId: 60, - methodId: 111, - name: "BasicRecoverOk", - args: [] - }; - module2.exports.BasicNack = 3932280; - var methodInfoBasicNack = module2.exports.methodInfoBasicNack = { - id: 3932280, - classId: 60, - methodId: 120, - name: "BasicNack", - args: [{ - type: "longlong", - name: "deliveryTag", - default: 0 - }, { - type: "bit", - name: "multiple", - default: false - }, { - type: "bit", - name: "requeue", - default: true - }] - }; - module2.exports.TxSelect = 5898250; - var methodInfoTxSelect = module2.exports.methodInfoTxSelect = { - id: 5898250, - classId: 90, - methodId: 10, - name: "TxSelect", - args: [] - }; - module2.exports.TxSelectOk = 5898251; - var methodInfoTxSelectOk = module2.exports.methodInfoTxSelectOk = { - id: 5898251, - classId: 90, - methodId: 11, - name: "TxSelectOk", - args: [] - }; - module2.exports.TxCommit = 5898260; - var methodInfoTxCommit = module2.exports.methodInfoTxCommit = { - id: 5898260, - classId: 90, - methodId: 20, - name: "TxCommit", - args: [] - }; - module2.exports.TxCommitOk = 5898261; - var methodInfoTxCommitOk = module2.exports.methodInfoTxCommitOk = { - id: 5898261, - classId: 90, - methodId: 21, - name: "TxCommitOk", - args: [] - }; - module2.exports.TxRollback = 5898270; - var methodInfoTxRollback = module2.exports.methodInfoTxRollback = { - id: 5898270, - classId: 90, - methodId: 30, - name: "TxRollback", - args: [] - }; - module2.exports.TxRollbackOk = 5898271; - var methodInfoTxRollbackOk = module2.exports.methodInfoTxRollbackOk = { - id: 5898271, - classId: 90, - methodId: 31, - name: "TxRollbackOk", - args: [] - }; - module2.exports.ConfirmSelect = 5570570; - var methodInfoConfirmSelect = module2.exports.methodInfoConfirmSelect = { - id: 5570570, - classId: 85, - methodId: 10, - name: "ConfirmSelect", - args: [{ - type: "bit", - name: "nowait", - default: false - }] - }; - module2.exports.ConfirmSelectOk = 5570571; - var methodInfoConfirmSelectOk = module2.exports.methodInfoConfirmSelectOk = { - id: 5570571, - classId: 85, - methodId: 11, - name: "ConfirmSelectOk", - args: [] - }; - module2.exports.BasicProperties = 60; - var propertiesInfoBasicProperties = module2.exports.propertiesInfoBasicProperties = { - id: 60, - name: "BasicProperties", - args: [{ - type: "shortstr", - name: "contentType" - }, { - type: "shortstr", - name: "contentEncoding" - }, { - type: "table", - name: "headers" - }, { - type: "octet", - name: "deliveryMode" - }, { - type: "octet", - name: "priority" - }, { - type: "shortstr", - name: "correlationId" - }, { - type: "shortstr", - name: "replyTo" - }, { - type: "shortstr", - name: "expiration" - }, { - type: "shortstr", - name: "messageId" - }, { - type: "timestamp", - name: "timestamp" - }, { - type: "shortstr", - name: "type" - }, { - type: "shortstr", - name: "userId" - }, { - type: "shortstr", - name: "appId" - }, { - type: "shortstr", - name: "clusterId" - }] - }; - } -}); - -// node_modules/@acuminous/bitsyntax/lib/pattern.js -var require_pattern = __commonJS({ - "node_modules/@acuminous/bitsyntax/lib/pattern.js"(exports2, module2) { - "use strict"; - function set(values) { - var s = {}; - for (var i in values) { - if (!Object.prototype.hasOwnProperty.call(values, i)) - continue; - s[values[i]] = 1; - } - return s; - } - function variable(name, size, specifiers0) { - var specifiers = set(specifiers0); - var segment = { name }; - segment.type = type_in(specifiers); - specs(segment, segment.type, specifiers); - segment.size = size_of(segment, segment.type, size, segment.unit); - return segment; - } - module2.exports.variable = variable; - module2.exports.rest = function() { - return variable("_", true, ["binary"]); - }; - function value(val, size, specifiers0) { - var specifiers = set(specifiers0); - var segment = { value: val }; - segment.type = type_in(specifiers); - specs(segment, segment.type, specifiers); - segment.size = size_of(segment, segment.type, size, segment.unit); - return segment; - } - module2.exports.value = value; - function string(val) { - return { value: val, type: "string" }; - } - module2.exports.string = string; - var TYPES = { "integer": 1, "binary": 1, "float": 1 }; - function type_in(specifiers) { - for (var t in specifiers) { - if (!Object.prototype.hasOwnProperty.call(specifiers, t)) - continue; - if (TYPES[t]) { - return t; - } - } - return "integer"; - } - function specs(segment, type, specifiers) { - switch (type) { - case "integer": - segment.signed = signed_in(specifiers); - case "float": - segment.bigendian = endian_in(specifiers); - default: - segment.unit = unit_in(specifiers, segment.type); - } - return segment; - } - function endian_in(specifiers) { - return !specifiers["little"]; - } - function signed_in(specifiers) { - return specifiers["signed"]; - } - function unit_in(specifiers, type) { - for (var s in specifiers) { - if (!Object.prototype.hasOwnProperty.call(specifiers, s)) - continue; - if (s.substr(0, 5) == "unit:") { - var unit = parseInt(s.substr(5)); - return unit; - } - } - switch (type) { - case "binary": - return 8; - case "integer": - case "float": - return 1; - } - } - function size_of(segment, type, size, unit) { - if (size !== void 0 && size !== "") { - return size; - } else { - switch (type) { - case "integer": - return 8; - case "float": - return 64; - case "binary": - return true; - } - } - } - } -}); - -// node_modules/@acuminous/bitsyntax/lib/parser.js -var require_parser = __commonJS({ - "node_modules/@acuminous/bitsyntax/lib/parser.js"(exports2, module2) { - module2.exports = function() { - function quote(s) { - return '"' + s.replace(/\\/g, "\\\\").replace(/"/g, '\\"').replace(/\x08/g, "\\b").replace(/\t/g, "\\t").replace(/\n/g, "\\n").replace(/\f/g, "\\f").replace(/\r/g, "\\r").replace(/[\x00-\x07\x0B\x0E-\x1F\x80-\uFFFF]/g, escape) + '"'; - } - var result = { - /* - * Parses the input with a generated parser. If the parsing is successfull, - * returns a value explicitly or implicitly specified by the grammar from - * which the parser was generated (see |PEG.buildParser|). If the parsing is - * unsuccessful, throws |PEG.parser.SyntaxError| describing the error. - */ - parse: function(input, startRule) { - var parseFunctions = { - "start": parse_start, - "segmentTail": parse_segmentTail, - "segment": parse_segment, - "string": parse_string, - "chars": parse_chars, - "char": parse_char, - "hexDigit": parse_hexDigit, - "identifier": parse_identifier, - "number": parse_number, - "size": parse_size, - "specifierList": parse_specifierList, - "specifierTail": parse_specifierTail, - "specifier": parse_specifier, - "unit": parse_unit, - "ws": parse_ws - }; - if (startRule !== void 0) { - if (parseFunctions[startRule] === void 0) { - throw new Error("Invalid rule name: " + quote(startRule) + "."); - } - } else { - startRule = "start"; - } - var pos = 0; - var reportFailures = 0; - var rightmostFailuresPos = 0; - var rightmostFailuresExpected = []; - function padLeft(input2, padding, length) { - var result3 = input2; - var padLength = length - input2.length; - for (var i = 0; i < padLength; i++) { - result3 = padding + result3; - } - return result3; - } - function escape2(ch) { - var charCode = ch.charCodeAt(0); - var escapeChar; - var length; - if (charCode <= 255) { - escapeChar = "x"; - length = 2; - } else { - escapeChar = "u"; - length = 4; - } - return "\\" + escapeChar + padLeft(charCode.toString(16).toUpperCase(), "0", length); - } - function matchFailed(failure) { - if (pos < rightmostFailuresPos) { - return; - } - if (pos > rightmostFailuresPos) { - rightmostFailuresPos = pos; - rightmostFailuresExpected = []; - } - rightmostFailuresExpected.push(failure); - } - function parse_start() { - var result0, result1, result22, result3; - var pos0, pos1; - pos0 = pos; - pos1 = pos; - result0 = parse_ws(); - if (result0 !== null) { - result1 = parse_segment(); - if (result1 !== null) { - result22 = []; - result3 = parse_segmentTail(); - while (result3 !== null) { - result22.push(result3); - result3 = parse_segmentTail(); - } - if (result22 !== null) { - result0 = [result0, result1, result22]; - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - if (result0 !== null) { - result0 = function(offset2, head, tail) { - tail.unshift(head); - return tail; - }(pos0, result0[1], result0[2]); - } - if (result0 === null) { - pos = pos0; - } - return result0; - } - function parse_segmentTail() { - var result0, result1, result22, result3; - var pos0, pos1; - pos0 = pos; - pos1 = pos; - result0 = parse_ws(); - if (result0 !== null) { - if (input.charCodeAt(pos) === 44) { - result1 = ","; - pos++; - } else { - result1 = null; - if (reportFailures === 0) { - matchFailed('","'); - } - } - if (result1 !== null) { - result22 = parse_ws(); - if (result22 !== null) { - result3 = parse_segment(); - if (result3 !== null) { - result0 = [result0, result1, result22, result3]; - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - if (result0 !== null) { - result0 = function(offset2, seg) { - return seg; - }(pos0, result0[3]); - } - if (result0 === null) { - pos = pos0; - } - return result0; - } - function parse_segment() { - var result0, result1, result22; - var pos0, pos1; - pos0 = pos; - result0 = parse_string(); - if (result0 !== null) { - result0 = function(offset2, str) { - return { string: str }; - }(pos0, result0); - } - if (result0 === null) { - pos = pos0; - } - if (result0 === null) { - pos0 = pos; - pos1 = pos; - result0 = parse_identifier(); - if (result0 !== null) { - result1 = parse_size(); - result1 = result1 !== null ? result1 : ""; - if (result1 !== null) { - result22 = parse_specifierList(); - result22 = result22 !== null ? result22 : ""; - if (result22 !== null) { - result0 = [result0, result1, result22]; - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - if (result0 !== null) { - result0 = function(offset2, v, size, specs) { - return { name: v, size, specifiers: specs }; - }(pos0, result0[0], result0[1], result0[2]); - } - if (result0 === null) { - pos = pos0; - } - if (result0 === null) { - pos0 = pos; - pos1 = pos; - result0 = parse_number(); - if (result0 !== null) { - result1 = parse_size(); - result1 = result1 !== null ? result1 : ""; - if (result1 !== null) { - result22 = parse_specifierList(); - result22 = result22 !== null ? result22 : ""; - if (result22 !== null) { - result0 = [result0, result1, result22]; - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - if (result0 !== null) { - result0 = function(offset2, v, size, specs) { - return { value: v, size, specifiers: specs }; - }(pos0, result0[0], result0[1], result0[2]); - } - if (result0 === null) { - pos = pos0; - } - } - } - return result0; - } - function parse_string() { - var result0, result1, result22; - var pos0, pos1; - pos0 = pos; - pos1 = pos; - if (input.charCodeAt(pos) === 34) { - result0 = '"'; - pos++; - } else { - result0 = null; - if (reportFailures === 0) { - matchFailed('"\\""'); - } - } - if (result0 !== null) { - if (input.charCodeAt(pos) === 34) { - result1 = '"'; - pos++; - } else { - result1 = null; - if (reportFailures === 0) { - matchFailed('"\\""'); - } - } - if (result1 !== null) { - result0 = [result0, result1]; - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - if (result0 !== null) { - result0 = function(offset2) { - return ""; - }(pos0); - } - if (result0 === null) { - pos = pos0; - } - if (result0 === null) { - pos0 = pos; - pos1 = pos; - if (input.charCodeAt(pos) === 34) { - result0 = '"'; - pos++; - } else { - result0 = null; - if (reportFailures === 0) { - matchFailed('"\\""'); - } - } - if (result0 !== null) { - result1 = parse_chars(); - if (result1 !== null) { - if (input.charCodeAt(pos) === 34) { - result22 = '"'; - pos++; - } else { - result22 = null; - if (reportFailures === 0) { - matchFailed('"\\""'); - } - } - if (result22 !== null) { - result0 = [result0, result1, result22]; - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - if (result0 !== null) { - result0 = function(offset2, chars) { - return chars; - }(pos0, result0[1]); - } - if (result0 === null) { - pos = pos0; - } - } - return result0; - } - function parse_chars() { - var result0, result1; - var pos0; - pos0 = pos; - result1 = parse_char(); - if (result1 !== null) { - result0 = []; - while (result1 !== null) { - result0.push(result1); - result1 = parse_char(); - } - } else { - result0 = null; - } - if (result0 !== null) { - result0 = function(offset2, chars) { - return chars.join(""); - }(pos0, result0); - } - if (result0 === null) { - pos = pos0; - } - return result0; - } - function parse_char() { - var result0, result1, result22, result3, result4; - var pos0, pos1; - if (/^[^"\\\0-\x1F]/.test(input.charAt(pos))) { - result0 = input.charAt(pos); - pos++; - } else { - result0 = null; - if (reportFailures === 0) { - matchFailed('[^"\\\\\\0-\\x1F\x7F]'); - } - } - if (result0 === null) { - pos0 = pos; - if (input.substr(pos, 2) === '\\"') { - result0 = '\\"'; - pos += 2; - } else { - result0 = null; - if (reportFailures === 0) { - matchFailed('"\\\\\\""'); - } - } - if (result0 !== null) { - result0 = function(offset2) { - return '"'; - }(pos0); - } - if (result0 === null) { - pos = pos0; - } - if (result0 === null) { - pos0 = pos; - if (input.substr(pos, 2) === "\\\\") { - result0 = "\\\\"; - pos += 2; - } else { - result0 = null; - if (reportFailures === 0) { - matchFailed('"\\\\\\\\"'); - } - } - if (result0 !== null) { - result0 = function(offset2) { - return "\\"; - }(pos0); - } - if (result0 === null) { - pos = pos0; - } - if (result0 === null) { - pos0 = pos; - if (input.substr(pos, 2) === "\\/") { - result0 = "\\/"; - pos += 2; - } else { - result0 = null; - if (reportFailures === 0) { - matchFailed('"\\\\/"'); - } - } - if (result0 !== null) { - result0 = function(offset2) { - return "/"; - }(pos0); - } - if (result0 === null) { - pos = pos0; - } - if (result0 === null) { - pos0 = pos; - if (input.substr(pos, 2) === "\\b") { - result0 = "\\b"; - pos += 2; - } else { - result0 = null; - if (reportFailures === 0) { - matchFailed('"\\\\b"'); - } - } - if (result0 !== null) { - result0 = function(offset2) { - return "\b"; - }(pos0); - } - if (result0 === null) { - pos = pos0; - } - if (result0 === null) { - pos0 = pos; - if (input.substr(pos, 2) === "\\f") { - result0 = "\\f"; - pos += 2; - } else { - result0 = null; - if (reportFailures === 0) { - matchFailed('"\\\\f"'); - } - } - if (result0 !== null) { - result0 = function(offset2) { - return "\f"; - }(pos0); - } - if (result0 === null) { - pos = pos0; - } - if (result0 === null) { - pos0 = pos; - if (input.substr(pos, 2) === "\\n") { - result0 = "\\n"; - pos += 2; - } else { - result0 = null; - if (reportFailures === 0) { - matchFailed('"\\\\n"'); - } - } - if (result0 !== null) { - result0 = function(offset2) { - return "\n"; - }(pos0); - } - if (result0 === null) { - pos = pos0; - } - if (result0 === null) { - pos0 = pos; - if (input.substr(pos, 2) === "\\r") { - result0 = "\\r"; - pos += 2; - } else { - result0 = null; - if (reportFailures === 0) { - matchFailed('"\\\\r"'); - } - } - if (result0 !== null) { - result0 = function(offset2) { - return "\r"; - }(pos0); - } - if (result0 === null) { - pos = pos0; - } - if (result0 === null) { - pos0 = pos; - if (input.substr(pos, 2) === "\\t") { - result0 = "\\t"; - pos += 2; - } else { - result0 = null; - if (reportFailures === 0) { - matchFailed('"\\\\t"'); - } - } - if (result0 !== null) { - result0 = function(offset2) { - return " "; - }(pos0); - } - if (result0 === null) { - pos = pos0; - } - if (result0 === null) { - pos0 = pos; - pos1 = pos; - if (input.substr(pos, 2) === "\\u") { - result0 = "\\u"; - pos += 2; - } else { - result0 = null; - if (reportFailures === 0) { - matchFailed('"\\\\u"'); - } - } - if (result0 !== null) { - result1 = parse_hexDigit(); - if (result1 !== null) { - result22 = parse_hexDigit(); - if (result22 !== null) { - result3 = parse_hexDigit(); - if (result3 !== null) { - result4 = parse_hexDigit(); - if (result4 !== null) { - result0 = [result0, result1, result22, result3, result4]; - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - if (result0 !== null) { - result0 = function(offset2, h1, h2, h3, h4) { - return String.fromCharCode(parseInt("0x" + h1 + h2 + h3 + h4)); - }(pos0, result0[1], result0[2], result0[3], result0[4]); - } - if (result0 === null) { - pos = pos0; - } - } - } - } - } - } - } - } - } - } - return result0; - } - function parse_hexDigit() { - var result0; - if (/^[0-9a-fA-F]/.test(input.charAt(pos))) { - result0 = input.charAt(pos); - pos++; - } else { - result0 = null; - if (reportFailures === 0) { - matchFailed("[0-9a-fA-F]"); - } - } - return result0; - } - function parse_identifier() { - var result0, result1, result22; - var pos0, pos1; - pos0 = pos; - pos1 = pos; - if (/^[_a-zA-Z]/.test(input.charAt(pos))) { - result0 = input.charAt(pos); - pos++; - } else { - result0 = null; - if (reportFailures === 0) { - matchFailed("[_a-zA-Z]"); - } - } - if (result0 !== null) { - result1 = []; - if (/^[_a-zA-Z0-9]/.test(input.charAt(pos))) { - result22 = input.charAt(pos); - pos++; - } else { - result22 = null; - if (reportFailures === 0) { - matchFailed("[_a-zA-Z0-9]"); - } - } - while (result22 !== null) { - result1.push(result22); - if (/^[_a-zA-Z0-9]/.test(input.charAt(pos))) { - result22 = input.charAt(pos); - pos++; - } else { - result22 = null; - if (reportFailures === 0) { - matchFailed("[_a-zA-Z0-9]"); - } - } - } - if (result1 !== null) { - result0 = [result0, result1]; - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - if (result0 !== null) { - result0 = function(offset2, head, tail) { - return head + tail.join(""); - }(pos0, result0[0], result0[1]); - } - if (result0 === null) { - pos = pos0; - } - return result0; - } - function parse_number() { - var result0, result1, result22; - var pos0, pos1; - pos0 = pos; - if (input.charCodeAt(pos) === 48) { - result0 = "0"; - pos++; - } else { - result0 = null; - if (reportFailures === 0) { - matchFailed('"0"'); - } - } - if (result0 !== null) { - result0 = function(offset2) { - return 0; - }(pos0); - } - if (result0 === null) { - pos = pos0; - } - if (result0 === null) { - pos0 = pos; - pos1 = pos; - if (/^[1-9]/.test(input.charAt(pos))) { - result0 = input.charAt(pos); - pos++; - } else { - result0 = null; - if (reportFailures === 0) { - matchFailed("[1-9]"); - } - } - if (result0 !== null) { - result1 = []; - if (/^[0-9]/.test(input.charAt(pos))) { - result22 = input.charAt(pos); - pos++; - } else { - result22 = null; - if (reportFailures === 0) { - matchFailed("[0-9]"); - } - } - while (result22 !== null) { - result1.push(result22); - if (/^[0-9]/.test(input.charAt(pos))) { - result22 = input.charAt(pos); - pos++; - } else { - result22 = null; - if (reportFailures === 0) { - matchFailed("[0-9]"); - } - } - } - if (result1 !== null) { - result0 = [result0, result1]; - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - if (result0 !== null) { - result0 = function(offset2, head, tail) { - return parseInt(head + tail.join("")); - }(pos0, result0[0], result0[1]); - } - if (result0 === null) { - pos = pos0; - } - } - return result0; - } - function parse_size() { - var result0, result1; - var pos0, pos1; - pos0 = pos; - pos1 = pos; - if (input.charCodeAt(pos) === 58) { - result0 = ":"; - pos++; - } else { - result0 = null; - if (reportFailures === 0) { - matchFailed('":"'); - } - } - if (result0 !== null) { - result1 = parse_number(); - if (result1 !== null) { - result0 = [result0, result1]; - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - if (result0 !== null) { - result0 = function(offset2, num) { - return num; - }(pos0, result0[1]); - } - if (result0 === null) { - pos = pos0; - } - if (result0 === null) { - pos0 = pos; - pos1 = pos; - if (input.charCodeAt(pos) === 58) { - result0 = ":"; - pos++; - } else { - result0 = null; - if (reportFailures === 0) { - matchFailed('":"'); - } - } - if (result0 !== null) { - result1 = parse_identifier(); - if (result1 !== null) { - result0 = [result0, result1]; - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - if (result0 !== null) { - result0 = function(offset2, id) { - return id; - }(pos0, result0[1]); - } - if (result0 === null) { - pos = pos0; - } - } - return result0; - } - function parse_specifierList() { - var result0, result1, result22, result3; - var pos0, pos1; - pos0 = pos; - pos1 = pos; - if (input.charCodeAt(pos) === 47) { - result0 = "/"; - pos++; - } else { - result0 = null; - if (reportFailures === 0) { - matchFailed('"/"'); - } - } - if (result0 !== null) { - result1 = parse_specifier(); - if (result1 !== null) { - result22 = []; - result3 = parse_specifierTail(); - while (result3 !== null) { - result22.push(result3); - result3 = parse_specifierTail(); - } - if (result22 !== null) { - result0 = [result0, result1, result22]; - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - if (result0 !== null) { - result0 = function(offset2, head, tail) { - tail.unshift(head); - return tail; - }(pos0, result0[1], result0[2]); - } - if (result0 === null) { - pos = pos0; - } - return result0; - } - function parse_specifierTail() { - var result0, result1; - var pos0, pos1; - pos0 = pos; - pos1 = pos; - if (input.charCodeAt(pos) === 45) { - result0 = "-"; - pos++; - } else { - result0 = null; - if (reportFailures === 0) { - matchFailed('"-"'); - } - } - if (result0 !== null) { - result1 = parse_specifier(); - if (result1 !== null) { - result0 = [result0, result1]; - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - if (result0 !== null) { - result0 = function(offset2, spec) { - return spec; - }(pos0, result0[1]); - } - if (result0 === null) { - pos = pos0; - } - return result0; - } - function parse_specifier() { - var result0; - if (input.substr(pos, 6) === "little") { - result0 = "little"; - pos += 6; - } else { - result0 = null; - if (reportFailures === 0) { - matchFailed('"little"'); - } - } - if (result0 === null) { - if (input.substr(pos, 3) === "big") { - result0 = "big"; - pos += 3; - } else { - result0 = null; - if (reportFailures === 0) { - matchFailed('"big"'); - } - } - if (result0 === null) { - if (input.substr(pos, 6) === "signed") { - result0 = "signed"; - pos += 6; - } else { - result0 = null; - if (reportFailures === 0) { - matchFailed('"signed"'); - } - } - if (result0 === null) { - if (input.substr(pos, 8) === "unsigned") { - result0 = "unsigned"; - pos += 8; - } else { - result0 = null; - if (reportFailures === 0) { - matchFailed('"unsigned"'); - } - } - if (result0 === null) { - if (input.substr(pos, 7) === "integer") { - result0 = "integer"; - pos += 7; - } else { - result0 = null; - if (reportFailures === 0) { - matchFailed('"integer"'); - } - } - if (result0 === null) { - if (input.substr(pos, 6) === "binary") { - result0 = "binary"; - pos += 6; - } else { - result0 = null; - if (reportFailures === 0) { - matchFailed('"binary"'); - } - } - if (result0 === null) { - if (input.substr(pos, 5) === "float") { - result0 = "float"; - pos += 5; - } else { - result0 = null; - if (reportFailures === 0) { - matchFailed('"float"'); - } - } - if (result0 === null) { - result0 = parse_unit(); - } - } - } - } - } - } - } - return result0; - } - function parse_unit() { - var result0, result1; - var pos0, pos1; - pos0 = pos; - pos1 = pos; - if (input.substr(pos, 5) === "unit:") { - result0 = "unit:"; - pos += 5; - } else { - result0 = null; - if (reportFailures === 0) { - matchFailed('"unit:"'); - } - } - if (result0 !== null) { - result1 = parse_number(); - if (result1 !== null) { - result0 = [result0, result1]; - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - if (result0 !== null) { - result0 = function(offset2, num) { - return "unit:" + num; - }(pos0, result0[1]); - } - if (result0 === null) { - pos = pos0; - } - return result0; - } - function parse_ws() { - var result0, result1; - result0 = []; - if (/^[ \t\n]/.test(input.charAt(pos))) { - result1 = input.charAt(pos); - pos++; - } else { - result1 = null; - if (reportFailures === 0) { - matchFailed("[ \\t\\n]"); - } - } - while (result1 !== null) { - result0.push(result1); - if (/^[ \t\n]/.test(input.charAt(pos))) { - result1 = input.charAt(pos); - pos++; - } else { - result1 = null; - if (reportFailures === 0) { - matchFailed("[ \\t\\n]"); - } - } - } - return result0; - } - function cleanupExpected(expected) { - expected.sort(); - var lastExpected = null; - var cleanExpected = []; - for (var i = 0; i < expected.length; i++) { - if (expected[i] !== lastExpected) { - cleanExpected.push(expected[i]); - lastExpected = expected[i]; - } - } - return cleanExpected; - } - function computeErrorPosition() { - var line = 1; - var column = 1; - var seenCR = false; - for (var i = 0; i < Math.max(pos, rightmostFailuresPos); i++) { - var ch = input.charAt(i); - if (ch === "\n") { - if (!seenCR) { - line++; - } - column = 1; - seenCR = false; - } else if (ch === "\r" || ch === "\u2028" || ch === "\u2029") { - line++; - column = 1; - seenCR = true; - } else { - column++; - seenCR = false; - } - } - return { line, column }; - } - var result2 = parseFunctions[startRule](); - if (result2 === null || pos !== input.length) { - var offset = Math.max(pos, rightmostFailuresPos); - var found = offset < input.length ? input.charAt(offset) : null; - var errorPosition = computeErrorPosition(); - throw new this.SyntaxError( - cleanupExpected(rightmostFailuresExpected), - found, - offset, - errorPosition.line, - errorPosition.column - ); - } - return result2; - }, - /* Returns the parser source code. */ - toSource: function() { - return this._source; - } - }; - result.SyntaxError = function(expected, found, offset, line, column) { - function buildMessage(expected2, found2) { - var expectedHumanized, foundHumanized; - switch (expected2.length) { - case 0: - expectedHumanized = "end of input"; - break; - case 1: - expectedHumanized = expected2[0]; - break; - default: - expectedHumanized = expected2.slice(0, expected2.length - 1).join(", ") + " or " + expected2[expected2.length - 1]; - } - foundHumanized = found2 ? quote(found2) : "end of input"; - return "Expected " + expectedHumanized + " but " + foundHumanized + " found."; - } - this.name = "SyntaxError"; - this.expected = expected; - this.found = found; - this.message = buildMessage(expected, found); - this.offset = offset; - this.line = line; - this.column = column; - }; - result.SyntaxError.prototype = Error.prototype; - return result; - }(); - } -}); - -// node_modules/@acuminous/bitsyntax/lib/parse.js -var require_parse2 = __commonJS({ - "node_modules/@acuminous/bitsyntax/lib/parse.js"(exports2, module2) { - "use strict"; - var ast = require_pattern(); - var parser = require_parser(); - function parse_pattern(string) { - var segments = parser.parse(string); - for (var i = 0, len = segments.length; i < len; i++) { - var s = segments[i]; - if (s.string != void 0) { - segments[i] = ast.string(s.string); - } else if (s.value != void 0) { - segments[i] = ast.value(s.value, s.size, s.specifiers); - } else if (s.name != void 0) { - segments[i] = ast.variable(s.name, s.size, s.specifiers); - } else { - throw "Unknown segment " + s; - } - } - return segments; - } - module2.exports.parse = function() { - var str = [].join.call(arguments, ","); - return parse_pattern(str); - }; - } -}); - -// node_modules/ms/index.js -var require_ms = __commonJS({ - "node_modules/ms/index.js"(exports2, module2) { - var s = 1e3; - var m2 = s * 60; - var h2 = m2 * 60; - var d = h2 * 24; - var w2 = d * 7; - var y = d * 365.25; - module2.exports = function(val, options2) { - options2 = options2 || {}; - var type = typeof val; - if (type === "string" && val.length > 0) { - return parse(val); - } else if (type === "number" && isFinite(val)) { - return options2.long ? fmtLong(val) : fmtShort(val); - } - throw new Error( - "val is not a non-empty string or a valid number. val=" + JSON.stringify(val) - ); - }; - function parse(str) { - str = String(str); - if (str.length > 100) { - return; - } - var match = /^(-?(?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec( - str - ); - if (!match) { - return; - } - var n = parseFloat(match[1]); - var type = (match[2] || "ms").toLowerCase(); - switch (type) { - case "years": - case "year": - case "yrs": - case "yr": - case "y": - return n * y; - case "weeks": - case "week": - case "w": - return n * w2; - case "days": - case "day": - case "d": - return n * d; - case "hours": - case "hour": - case "hrs": - case "hr": - case "h": - return n * h2; - case "minutes": - case "minute": - case "mins": - case "min": - case "m": - return n * m2; - case "seconds": - case "second": - case "secs": - case "sec": - case "s": - return n * s; - case "milliseconds": - case "millisecond": - case "msecs": - case "msec": - case "ms": - return n; - default: - return void 0; - } - } - function fmtShort(ms2) { - var msAbs = Math.abs(ms2); - if (msAbs >= d) { - return Math.round(ms2 / d) + "d"; - } - if (msAbs >= h2) { - return Math.round(ms2 / h2) + "h"; - } - if (msAbs >= m2) { - return Math.round(ms2 / m2) + "m"; - } - if (msAbs >= s) { - return Math.round(ms2 / s) + "s"; - } - return ms2 + "ms"; - } - function fmtLong(ms2) { - var msAbs = Math.abs(ms2); - if (msAbs >= d) { - return plural(ms2, msAbs, d, "day"); - } - if (msAbs >= h2) { - return plural(ms2, msAbs, h2, "hour"); - } - if (msAbs >= m2) { - return plural(ms2, msAbs, m2, "minute"); - } - if (msAbs >= s) { - return plural(ms2, msAbs, s, "second"); - } - return ms2 + " ms"; - } - function plural(ms2, msAbs, n, name) { - var isPlural = msAbs >= n * 1.5; - return Math.round(ms2 / n) + " " + name + (isPlural ? "s" : ""); - } - } -}); - -// node_modules/debug/src/common.js -var require_common2 = __commonJS({ - "node_modules/debug/src/common.js"(exports2, module2) { - function setup(env) { - createDebug.debug = createDebug; - createDebug.default = createDebug; - createDebug.coerce = coerce; - createDebug.disable = disable; - createDebug.enable = enable; - createDebug.enabled = enabled; - createDebug.humanize = require_ms(); - createDebug.destroy = destroy; - Object.keys(env).forEach((key) => { - createDebug[key] = env[key]; - }); - createDebug.names = []; - createDebug.skips = []; - createDebug.formatters = {}; - function selectColor(namespace) { - let hash = 0; - for (let i = 0; i < namespace.length; i++) { - hash = (hash << 5) - hash + namespace.charCodeAt(i); - hash |= 0; - } - return createDebug.colors[Math.abs(hash) % createDebug.colors.length]; - } - createDebug.selectColor = selectColor; - function createDebug(namespace) { - let prevTime; - let enableOverride = null; - let namespacesCache; - let enabledCache; - function debug2(...args) { - if (!debug2.enabled) { - return; - } - const self2 = debug2; - const curr = Number(/* @__PURE__ */ new Date()); - const ms2 = curr - (prevTime || curr); - self2.diff = ms2; - self2.prev = prevTime; - self2.curr = curr; - prevTime = curr; - args[0] = createDebug.coerce(args[0]); - if (typeof args[0] !== "string") { - args.unshift("%O"); - } - let index = 0; - args[0] = args[0].replace(/%([a-zA-Z%])/g, (match, format) => { - if (match === "%%") { - return "%"; - } - index++; - const formatter = createDebug.formatters[format]; - if (typeof formatter === "function") { - const val = args[index]; - match = formatter.call(self2, val); - args.splice(index, 1); - index--; - } - return match; - }); - createDebug.formatArgs.call(self2, args); - const logFn = self2.log || createDebug.log; - logFn.apply(self2, args); - } - debug2.namespace = namespace; - debug2.useColors = createDebug.useColors(); - debug2.color = createDebug.selectColor(namespace); - debug2.extend = extend; - debug2.destroy = createDebug.destroy; - Object.defineProperty(debug2, "enabled", { - enumerable: true, - configurable: false, - get: () => { - if (enableOverride !== null) { - return enableOverride; - } - if (namespacesCache !== createDebug.namespaces) { - namespacesCache = createDebug.namespaces; - enabledCache = createDebug.enabled(namespace); - } - return enabledCache; - }, - set: (v) => { - enableOverride = v; - } - }); - if (typeof createDebug.init === "function") { - createDebug.init(debug2); - } - return debug2; - } - function extend(namespace, delimiter) { - const newDebug = createDebug(this.namespace + (typeof delimiter === "undefined" ? ":" : delimiter) + namespace); - newDebug.log = this.log; - return newDebug; - } - function enable(namespaces) { - createDebug.save(namespaces); - createDebug.namespaces = namespaces; - createDebug.names = []; - createDebug.skips = []; - let i; - const split = (typeof namespaces === "string" ? namespaces : "").split(/[\s,]+/); - const len = split.length; - for (i = 0; i < len; i++) { - if (!split[i]) { - continue; - } - namespaces = split[i].replace(/\*/g, ".*?"); - if (namespaces[0] === "-") { - createDebug.skips.push(new RegExp("^" + namespaces.slice(1) + "$")); - } else { - createDebug.names.push(new RegExp("^" + namespaces + "$")); - } - } - } - function disable() { - const namespaces = [ - ...createDebug.names.map(toNamespace), - ...createDebug.skips.map(toNamespace).map((namespace) => "-" + namespace) - ].join(","); - createDebug.enable(""); - return namespaces; - } - function enabled(name) { - if (name[name.length - 1] === "*") { - return true; - } - let i; - let len; - for (i = 0, len = createDebug.skips.length; i < len; i++) { - if (createDebug.skips[i].test(name)) { - return false; - } - } - for (i = 0, len = createDebug.names.length; i < len; i++) { - if (createDebug.names[i].test(name)) { - return true; - } - } - return false; - } - function toNamespace(regexp) { - return regexp.toString().substring(2, regexp.toString().length - 2).replace(/\.\*\?$/, "*"); - } - function coerce(val) { - if (val instanceof Error) { - return val.stack || val.message; - } - return val; - } - function destroy() { - console.warn("Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`."); - } - createDebug.enable(createDebug.load()); - return createDebug; - } - module2.exports = setup; - } -}); - -// node_modules/debug/src/browser.js -var require_browser = __commonJS({ - "node_modules/debug/src/browser.js"(exports2, module2) { - exports2.formatArgs = formatArgs; - exports2.save = save; - exports2.load = load; - exports2.useColors = useColors; - exports2.storage = localstorage(); - exports2.destroy = (() => { - let warned = false; - return () => { - if (!warned) { - warned = true; - console.warn("Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`."); - } - }; - })(); - exports2.colors = [ - "#0000CC", - "#0000FF", - "#0033CC", - "#0033FF", - "#0066CC", - "#0066FF", - "#0099CC", - "#0099FF", - "#00CC00", - "#00CC33", - "#00CC66", - "#00CC99", - "#00CCCC", - "#00CCFF", - "#3300CC", - "#3300FF", - "#3333CC", - "#3333FF", - "#3366CC", - "#3366FF", - "#3399CC", - "#3399FF", - "#33CC00", - "#33CC33", - "#33CC66", - "#33CC99", - "#33CCCC", - "#33CCFF", - "#6600CC", - "#6600FF", - "#6633CC", - "#6633FF", - "#66CC00", - "#66CC33", - "#9900CC", - "#9900FF", - "#9933CC", - "#9933FF", - "#99CC00", - "#99CC33", - "#CC0000", - "#CC0033", - "#CC0066", - "#CC0099", - "#CC00CC", - "#CC00FF", - "#CC3300", - "#CC3333", - "#CC3366", - "#CC3399", - "#CC33CC", - "#CC33FF", - "#CC6600", - "#CC6633", - "#CC9900", - "#CC9933", - "#CCCC00", - "#CCCC33", - "#FF0000", - "#FF0033", - "#FF0066", - "#FF0099", - "#FF00CC", - "#FF00FF", - "#FF3300", - "#FF3333", - "#FF3366", - "#FF3399", - "#FF33CC", - "#FF33FF", - "#FF6600", - "#FF6633", - "#FF9900", - "#FF9933", - "#FFCC00", - "#FFCC33" - ]; - function useColors() { - if (typeof window !== "undefined" && window.process && (window.process.type === "renderer" || window.process.__nwjs)) { - return true; - } - if (typeof navigator !== "undefined" && navigator.userAgent && navigator.userAgent.toLowerCase().match(/(edge|trident)\/(\d+)/)) { - return false; - } - return typeof document !== "undefined" && document.documentElement && document.documentElement.style && document.documentElement.style.WebkitAppearance || // Is firebug? http://stackoverflow.com/a/398120/376773 - typeof window !== "undefined" && window.console && (window.console.firebug || window.console.exception && window.console.table) || // Is firefox >= v31? - // https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages - typeof navigator !== "undefined" && navigator.userAgent && navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/) && parseInt(RegExp.$1, 10) >= 31 || // Double check webkit in userAgent just in case we are in a worker - typeof navigator !== "undefined" && navigator.userAgent && navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/); - } - function formatArgs(args) { - args[0] = (this.useColors ? "%c" : "") + this.namespace + (this.useColors ? " %c" : " ") + args[0] + (this.useColors ? "%c " : " ") + "+" + module2.exports.humanize(this.diff); - if (!this.useColors) { - return; - } - const c = "color: " + this.color; - args.splice(1, 0, c, "color: inherit"); - let index = 0; - let lastC = 0; - args[0].replace(/%[a-zA-Z%]/g, (match) => { - if (match === "%%") { - return; - } - index++; - if (match === "%c") { - lastC = index; - } - }); - args.splice(lastC, 0, c); - } - exports2.log = console.debug || console.log || (() => { - }); - function save(namespaces) { - try { - if (namespaces) { - exports2.storage.setItem("debug", namespaces); - } else { - exports2.storage.removeItem("debug"); - } - } catch (error2) { - } - } - function load() { - let r; - try { - r = exports2.storage.getItem("debug"); - } catch (error2) { - } - if (!r && typeof process !== "undefined" && "env" in process) { - r = process.env.DEBUG; - } - return r; - } - function localstorage() { - try { - return localStorage; - } catch (error2) { - } - } - module2.exports = require_common2()(exports2); - var { formatters } = module2.exports; - formatters.j = function(v) { - try { - return JSON.stringify(v); - } catch (error2) { - return "[UnexpectedJSONParseError]: " + error2.message; - } - }; - } -}); - -// node_modules/has-flag/index.js -var require_has_flag = __commonJS({ - "node_modules/has-flag/index.js"(exports2, module2) { - "use strict"; - module2.exports = (flag, argv) => { - argv = argv || process.argv; - const prefix = flag.startsWith("-") ? "" : flag.length === 1 ? "-" : "--"; - const pos = argv.indexOf(prefix + flag); - const terminatorPos = argv.indexOf("--"); - return pos !== -1 && (terminatorPos === -1 ? true : pos < terminatorPos); - }; - } -}); - -// node_modules/supports-color/index.js -var require_supports_color = __commonJS({ - "node_modules/supports-color/index.js"(exports2, module2) { - "use strict"; - var os2 = require("os"); - var hasFlag = require_has_flag(); - var env = process.env; - var forceColor; - if (hasFlag("no-color") || hasFlag("no-colors") || hasFlag("color=false")) { - forceColor = false; - } else if (hasFlag("color") || hasFlag("colors") || hasFlag("color=true") || hasFlag("color=always")) { - forceColor = true; - } - if ("FORCE_COLOR" in env) { - forceColor = env.FORCE_COLOR.length === 0 || parseInt(env.FORCE_COLOR, 10) !== 0; - } - function translateLevel(level) { - if (level === 0) { - return false; - } - return { - level, - hasBasic: true, - has256: level >= 2, - has16m: level >= 3 - }; - } - function supportsColor(stream) { - if (forceColor === false) { - return 0; - } - if (hasFlag("color=16m") || hasFlag("color=full") || hasFlag("color=truecolor")) { - return 3; - } - if (hasFlag("color=256")) { - return 2; - } - if (stream && !stream.isTTY && forceColor !== true) { - return 0; - } - const min = forceColor ? 1 : 0; - if (process.platform === "win32") { - const osRelease = os2.release().split("."); - if (Number(process.versions.node.split(".")[0]) >= 8 && Number(osRelease[0]) >= 10 && Number(osRelease[2]) >= 10586) { - return Number(osRelease[2]) >= 14931 ? 3 : 2; - } - return 1; - } - if ("CI" in env) { - if (["TRAVIS", "CIRCLECI", "APPVEYOR", "GITLAB_CI"].some((sign) => sign in env) || env.CI_NAME === "codeship") { - return 1; - } - return min; - } - if ("TEAMCITY_VERSION" in env) { - return /^(9\.(0*[1-9]\d*)\.|\d{2,}\.)/.test(env.TEAMCITY_VERSION) ? 1 : 0; - } - if (env.COLORTERM === "truecolor") { - return 3; - } - if ("TERM_PROGRAM" in env) { - const version = parseInt((env.TERM_PROGRAM_VERSION || "").split(".")[0], 10); - switch (env.TERM_PROGRAM) { - case "iTerm.app": - return version >= 3 ? 3 : 2; - case "Apple_Terminal": - return 2; - } - } - if (/-256(color)?$/i.test(env.TERM)) { - return 2; - } - if (/^screen|^xterm|^vt100|^vt220|^rxvt|color|ansi|cygwin|linux/i.test(env.TERM)) { - return 1; - } - if ("COLORTERM" in env) { - return 1; - } - if (env.TERM === "dumb") { - return min; - } - return min; - } - function getSupportLevel(stream) { - const level = supportsColor(stream); - return translateLevel(level); - } - module2.exports = { - supportsColor: getSupportLevel, - stdout: getSupportLevel(process.stdout), - stderr: getSupportLevel(process.stderr) - }; - } -}); - -// node_modules/debug/src/node.js -var require_node = __commonJS({ - "node_modules/debug/src/node.js"(exports2, module2) { - var tty = require("tty"); - var util = require("util"); - exports2.init = init; - exports2.log = log2; - exports2.formatArgs = formatArgs; - exports2.save = save; - exports2.load = load; - exports2.useColors = useColors; - exports2.destroy = util.deprecate( - () => { - }, - "Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`." - ); - exports2.colors = [6, 2, 3, 4, 5, 1]; - try { - const supportsColor = require_supports_color(); - if (supportsColor && (supportsColor.stderr || supportsColor).level >= 2) { - exports2.colors = [ - 20, - 21, - 26, - 27, - 32, - 33, - 38, - 39, - 40, - 41, - 42, - 43, - 44, - 45, - 56, - 57, - 62, - 63, - 68, - 69, - 74, - 75, - 76, - 77, - 78, - 79, - 80, - 81, - 92, - 93, - 98, - 99, - 112, - 113, - 128, - 129, - 134, - 135, - 148, - 149, - 160, - 161, - 162, - 163, - 164, - 165, - 166, - 167, - 168, - 169, - 170, - 171, - 172, - 173, - 178, - 179, - 184, - 185, - 196, - 197, - 198, - 199, - 200, - 201, - 202, - 203, - 204, - 205, - 206, - 207, - 208, - 209, - 214, - 215, - 220, - 221 - ]; - } - } catch (error2) { - } - exports2.inspectOpts = Object.keys(process.env).filter((key) => { - return /^debug_/i.test(key); - }).reduce((obj, key) => { - const prop = key.substring(6).toLowerCase().replace(/_([a-z])/g, (_2, k2) => { - return k2.toUpperCase(); - }); - let val = process.env[key]; - if (/^(yes|on|true|enabled)$/i.test(val)) { - val = true; - } else if (/^(no|off|false|disabled)$/i.test(val)) { - val = false; - } else if (val === "null") { - val = null; - } else { - val = Number(val); - } - obj[prop] = val; - return obj; - }, {}); - function useColors() { - return "colors" in exports2.inspectOpts ? Boolean(exports2.inspectOpts.colors) : tty.isatty(process.stderr.fd); - } - function formatArgs(args) { - const { namespace: name, useColors: useColors2 } = this; - if (useColors2) { - const c = this.color; - const colorCode = "\x1B[3" + (c < 8 ? c : "8;5;" + c); - const prefix = ` ${colorCode};1m${name} \x1B[0m`; - args[0] = prefix + args[0].split("\n").join("\n" + prefix); - args.push(colorCode + "m+" + module2.exports.humanize(this.diff) + "\x1B[0m"); - } else { - args[0] = getDate() + name + " " + args[0]; - } - } - function getDate() { - if (exports2.inspectOpts.hideDate) { - return ""; - } - return (/* @__PURE__ */ new Date()).toISOString() + " "; - } - function log2(...args) { - return process.stderr.write(util.format(...args) + "\n"); - } - function save(namespaces) { - if (namespaces) { - process.env.DEBUG = namespaces; - } else { - delete process.env.DEBUG; - } - } - function load() { - return process.env.DEBUG; - } - function init(debug2) { - debug2.inspectOpts = {}; - const keys = Object.keys(exports2.inspectOpts); - for (let i = 0; i < keys.length; i++) { - debug2.inspectOpts[keys[i]] = exports2.inspectOpts[keys[i]]; - } - } - module2.exports = require_common2()(exports2); - var { formatters } = module2.exports; - formatters.o = function(v) { - this.inspectOpts.colors = this.useColors; - return util.inspect(v, this.inspectOpts).split("\n").map((str) => str.trim()).join(" "); - }; - formatters.O = function(v) { - this.inspectOpts.colors = this.useColors; - return util.inspect(v, this.inspectOpts); - }; - } -}); - -// node_modules/debug/src/index.js -var require_src4 = __commonJS({ - "node_modules/debug/src/index.js"(exports2, module2) { - if (typeof process === "undefined" || process.type === "renderer" || process.browser === true || process.__nwjs) { - module2.exports = require_browser(); - } else { - module2.exports = require_node(); - } - } -}); - -// node_modules/@acuminous/bitsyntax/lib/interp.js -var require_interp = __commonJS({ - "node_modules/@acuminous/bitsyntax/lib/interp.js"(exports2, module2) { - "use strict"; - var ints = require_buffer_more_ints(); - var debug2 = require_src4()("bitsyntax-Interpreter"); - function parse_int(bin, off, sizeInBytes, bigendian, signed) { - switch (sizeInBytes) { - case 1: - return signed ? bin.readInt8(off) : bin.readUInt8(off); - case 2: - return bigendian ? signed ? bin.readInt16BE(off) : bin.readUInt16BE(off) : signed ? bin.readInt16LE(off) : bin.readUInt16LE(off); - case 4: - return bigendian ? signed ? bin.readInt32BE(off) : bin.readUInt32BE(off) : signed ? bin.readInt32LE(off) : bin.readUInt32LE(off); - case 8: - return bigendian ? (signed ? ints.readInt64BE : ints.readUInt64BE)(bin, off) : (signed ? ints.readInt64LE : ints.readUInt64LE)(bin, off); - default: - throw "Integers must be 8-, 16-, 32- or 64-bit"; - } - } - function parse_float(bin, off, sizeInBytes, bigendian) { - switch (sizeInBytes) { - case 4: - return bigendian ? bin.readFloatBE(off) : bin.readFloatLE(off); - case 8: - return bigendian ? bin.readDoubleBE(off) : bin.readDoubleLE(off); - default: - throw "Floats must be 32- or 64-bit"; - } - } - function size_of(segment, bound) { - var size = segment.size; - if (typeof size === "string") { - return bound[size]; - } else { - return size; - } - } - function new_scope(env) { - function scope() { - } - ; - scope.prototype = env; - return new scope(); - } - function bindings(scope) { - var s = {}; - for (var k2 in scope) { - if (scope.hasOwnProperty(k2)) { - s[k2] = scope[k2]; - } - } - return s; - } - function match(pattern, binary, boundvars) { - var offset = 0, vars = new_scope(boundvars); - var binsize = binary.length * 8; - function skip_bits(segment2) { - debug2("skip bits"); - debug2(segment2); - var size = size_of(segment2, vars); - if (size === true) { - if (offset % 8 === 0) { - offset = binsize; - return true; - } else { - return false; - } - } - var bits = segment2.unit * size; - if (offset + bits > binsize) { - return false; - } else { - offset += bits; - } - } - function get_integer(segment2) { - debug2("get_integer"); - debug2(segment2); - var unit = segment2.unit, size = size_of(segment2, vars); - var bitsize = size * unit; - var byteoffset = offset / 8; - offset += bitsize; - if (bitsize % 8 > 0 || offset > binsize) { - return false; - } else { - return parse_int( - binary, - byteoffset, - bitsize / 8, - segment2.bigendian, - segment2.signed - ); - } - } - function get_float(segment2) { - debug2("get_float"); - debug2(segment2); - var unit = segment2.unit; - var size = size_of(segment2, vars); - var bitsize = size * unit; - var byteoffset = offset / 8; - offset += bitsize; - if (offset > binsize) { - return false; - } else { - return parse_float( - binary, - byteoffset, - bitsize / 8, - segment2.bigendian - ); - } - } - function get_binary(segment2) { - debug2("get_binary"); - debug2(segment2); - var unit = segment2.unit, size = size_of(segment2, vars); - var byteoffset = offset / 8; - if (size === true) { - offset = binsize; - return binary.slice(byteoffset); - } else { - var bitsize = size * unit; - if (bitsize % 8 > 0 || offset + bitsize > binsize) { - return false; - } else { - offset += bitsize; - return binary.slice(byteoffset, byteoffset + bitsize / 8); - } - } - } - function get_string(segment2) { - debug2("get_string"); - debug2(segment2); - var len = segment2.value.length; - var byteoffset = offset / 8; - offset += len * 8; - if (offset > binsize) { - return false; - } - return binary.slice(byteoffset, byteoffset + len).toString("utf8"); - } - var patternlen = pattern.length; - for (var i = 0; i < patternlen; i++) { - var segment = pattern[i]; - var result = false; - if (segment.name === "_") { - result = skip_bits(segment); - } else { - switch (segment.type) { - case "string": - result = get_string(segment); - break; - case "integer": - result = get_integer(segment); - break; - case "float": - result = get_float(segment); - break; - case "binary": - result = get_binary(segment); - break; - } - if (result === false) { - return false; - } else if (segment.name) { - vars[segment.name] = result; - } else if (segment.value != result) { - return false; - } - } - } - if (offset == binsize) { - return bindings(vars); - } else { - return false; - } - } - module2.exports.match = match; - module2.exports.parse_int = parse_int; - module2.exports.parse_float = parse_float; - } -}); - -// node_modules/safe-buffer/index.js -var require_safe_buffer = __commonJS({ - "node_modules/safe-buffer/index.js"(exports2, module2) { - var buffer = require("buffer"); - var Buffer2 = buffer.Buffer; - function copyProps(src, dst) { - for (var key in src) { - dst[key] = src[key]; - } - } - if (Buffer2.from && Buffer2.alloc && Buffer2.allocUnsafe && Buffer2.allocUnsafeSlow) { - module2.exports = buffer; - } else { - copyProps(buffer, exports2); - exports2.Buffer = SafeBuffer; - } - function SafeBuffer(arg, encodingOrOffset, length) { - return Buffer2(arg, encodingOrOffset, length); - } - copyProps(Buffer2, SafeBuffer); - SafeBuffer.from = function(arg, encodingOrOffset, length) { - if (typeof arg === "number") { - throw new TypeError("Argument must not be a number"); - } - return Buffer2(arg, encodingOrOffset, length); - }; - SafeBuffer.alloc = function(size, fill, encoding) { - if (typeof size !== "number") { - throw new TypeError("Argument must be a number"); - } - var buf = Buffer2(size); - if (fill !== void 0) { - if (typeof encoding === "string") { - buf.fill(fill, encoding); - } else { - buf.fill(fill); - } - } else { - buf.fill(0); - } - return buf; - }; - SafeBuffer.allocUnsafe = function(size) { - if (typeof size !== "number") { - throw new TypeError("Argument must be a number"); - } - return Buffer2(size); - }; - SafeBuffer.allocUnsafeSlow = function(size) { - if (typeof size !== "number") { - throw new TypeError("Argument must be a number"); - } - return buffer.SlowBuffer(size); - }; - } -}); - -// node_modules/@acuminous/bitsyntax/lib/constructor.js -var require_constructor = __commonJS({ - "node_modules/@acuminous/bitsyntax/lib/constructor.js"(exports2, module2) { - "use strict"; - var ints = require_buffer_more_ints(); - var Buffer2 = require_safe_buffer().Buffer; - function write(buf, offset, pattern, bindings) { - for (var i = 0, len = pattern.length; i < len; i++) { - var segment = pattern[i]; - switch (segment.type) { - case "string": - offset += buf.write(segment.value, offset, "utf8"); - break; - case "binary": - offset += writeBinary(segment, buf, offset, bindings); - break; - case "integer": - offset += writeInteger(segment, buf, offset, bindings); - break; - case "float": - offset += writeFloat(segment, buf, offset, bindings); - break; - } - } - return offset; - } - function build(pattern, bindings) { - var bufsize = size_of(pattern, bindings); - var buf = Buffer2.alloc(bufsize); - write(buf, 0, pattern, bindings); - return buf; - } - function size_of_segment(segment, bindings) { - if (typeof segment.size === "string") { - return bindings[segment.size] * segment.unit / 8; - } - if (segment.type === "string") { - return Buffer2.byteLength(segment.value, "utf8"); - } - if (segment.type === "binary" && segment.size === true) { - var val = bindings[segment.name]; - return val.length; - } - return segment.size * segment.unit / 8; - } - function size_of(segments, bindings) { - var size = 0; - for (var i = 0, len = segments.length; i < len; i++) { - size += size_of_segment(segments[i], bindings); - } - return size; - } - function writeBinary(segment, buf, offset, bindings) { - var bin = bindings[segment.name]; - var size = size_of_segment(segment, bindings); - bin.copy(buf, offset, 0, size); - return size; - } - function writeInteger(segment, buf, offset, bindings) { - var value = segment.name ? bindings[segment.name] : segment.value; - var size = size_of_segment(segment, bindings); - return write_int(buf, value, offset, size, segment.bigendian); - } - function write_int(buf, value, offset, size, bigendian) { - switch (size) { - case 1: - buf.writeUInt8(value, offset); - break; - case 2: - bigendian ? buf.writeUInt16BE(value, offset) : buf.writeUInt16LE(value, offset); - break; - case 4: - bigendian ? buf.writeUInt32BE(value, offset) : buf.writeUInt32LE(value, offset); - break; - case 8: - bigendian ? ints.writeUInt64BE(buf, value, offset) : ints.writeUInt64LE(buf, value, offset); - break; - default: - throw new Error("integer size * unit must be 8, 16, 32 or 64"); - } - return size; - } - function writeFloat(segment, buf, offset, bindings) { - var value = segment.name ? bindings[segment.name] : segment.value; - var size = size_of_segment(segment, bindings); - return write_float(buf, value, offset, size, segment.bigendian); - } - function write_float(buf, value, offset, size, bigendian) { - if (size === 4) { - bigendian ? buf.writeFloatBE(value, offset) : buf.writeFloatLE(value, offset); - } else if (size === 8) { - bigendian ? buf.writeDoubleBE(value, offset) : buf.writeDoubleLE(value, offset); - } else { - throw new Error("float size * unit must be 32 or 64"); - } - return size; - } - var parse = require_parse2().parse; - module2.exports.write = write; - module2.exports.build = build; - module2.exports.write_int = write_int; - module2.exports.write_float = write_float; - module2.exports.builder = function(pstr) { - pstr = arguments.length > 1 ? [].join.call(arguments, ",") : pstr; - var pattern = parse(pstr); - return function(vars) { - return build(pattern, vars); - }; - }; - } -}); - -// node_modules/@acuminous/bitsyntax/lib/compile.js -var require_compile = __commonJS({ - "node_modules/@acuminous/bitsyntax/lib/compile.js"(exports2, module2) { - "use strict"; - require_buffer_more_ints(); - var $2 = require("util").format; - var parse = require_parse2().parse; - var interp = require_interp(); - var parse_int = interp.parse_int; - var parse_float = interp.parse_float; - var construct = require_constructor(); - var write_int = construct.write_int; - var write_float = construct.write_float; - var Buffer2 = require_safe_buffer().Buffer; - var lines = []; - function $start() { - lines = []; - } - function $line() { - lines.push($2.apply(null, arguments)); - } - function $result() { - return lines.join("\n"); - } - function bits_expr(segment) { - if (typeof segment.size === "string") { - return $2("%s * %d", var_name(segment.size), segment.unit); - } else { - return (segment.size * segment.unit).toString(); - } - } - function get_number(segment) { - $line("bits = %s;\n", bits_expr(segment)); - var parser = segment.type === "integer" ? "parse_int" : "parse_float"; - var be2 = segment.bigendian, sg = segment.signed; - $line("byteoffset = offset / 8; offset += bits"); - $line("if (offset > binsize) { return false; }"); - $line( - "else { result = %s(bin, byteoffset, bits / 8, %s, %s); }", - parser, - be2, - sg - ); - } - function get_binary(segment) { - $line("byteoffset = offset / 8;"); - if (segment.size === true) { - $line("offset = binsize;"); - $line("result = bin.slice(byteoffset);"); - } else { - $line("bits = %s;", bits_expr(segment)); - $line("offset += bits;"); - $line("if (offset > binsize) { return false; }"); - $line( - "else { result = bin.slice(byteoffset,", - "byteoffset + bits / 8); }" - ); - } - } - function get_string(segment) { - $line("byteoffset = offset / 8;"); - var strlen = segment.value.length; - var strlenbits = strlen * 8; - $line("offset += %d;", strlenbits); - $line("if (offset > binsize) { return false; }"); - $line( - "else { result = bin.toString(byteoffset,", - $2("byteoffset + %d); }", strlen) - ); - } - function skip_bits(segment) { - if (typeof segment.size === "string") { - $line( - "var skipbits = %s * %d;", - var_name(segment.size), - segment.unit - ); - $line("if (offset + skipbits > binsize) { return false; }"); - $line("else { offset += skipbits; }"); - } else if (segment.size === true) { - $line("if (offset % 8 === 0) { offset = binsize; }"); - $line("else { return false; }"); - } else { - var bits = segment.unit * segment.size; - $line("if (offset + %d > binsize) { return false; }", bits); - $line("else { offset += %d; }", bits); - } - } - function match_seg(segment) { - if (segment.name === "_") { - skip_bits(segment); - } else { - var assign_result; - switch (segment.type) { - case "integer": - case "float": - get_number(segment); - break; - case "binary": - get_binary(segment); - break; - case "string": - get_string(segment); - break; - } - $line("if (result === false) return false;"); - if (segment.name) { - $line("else if (%s !== undefined) {", var_name(segment.name)); - $line( - "if (%s != result) return false;", - var_name(segment.name) - ); - $line("}"); - $line("else %s = result;", var_name(segment.name)); - } else { - var repr = JSON.stringify(segment.value); - $line("else if (result != %s) return false;", repr); - } - } - } - function var_name(name) { - return "var_" + name; - } - function variables(segments) { - var names = {}; - for (var i = 0; i < segments.length; i++) { - var name = segments[i].name; - if (name && name !== "_") { - names[name] = true; - } - name = segments[i].size; - if (typeof name === "string") { - names[name] = true; - } - } - return Object.keys(names); - } - function compile_pattern(segments) { - $start(); - $line("return function(binary, env) {"); - $line("'use strict';"); - $line("var bin = binary, env = env || {};"); - $line("var offset = 0, binsize = bin.length * 8;"); - $line("var bits, result, byteoffset;"); - var varnames = variables(segments); - for (var v = 0; v < varnames.length; v++) { - var name = varnames[v]; - $line("var %s = env['%s'];", var_name(name), name); - } - var len = segments.length; - for (var i = 0; i < len; i++) { - var segment = segments[i]; - $line("// " + JSON.stringify(segment)); - match_seg(segment); - } - $line("if (offset == binsize) {"); - $line("return {"); - for (var v = 0; v < varnames.length; v++) { - var name = varnames[v]; - $line("%s: %s,", name, var_name(name)); - } - $line("};"); - $line("}"); - $line("else return false;"); - $line("}"); - var fn = new Function("parse_int", "parse_float", $result()); - return fn(parse_int, parse_float); - } - function write_seg(segment) { - switch (segment.type) { - case "string": - $line( - "offset += buf.write(%s, offset, 'utf8');", - JSON.stringify(segment.value) - ); - break; - case "binary": - $line("val = bindings['%s'];", segment.name); - if (segment.size === true) { - $line("size = val.length;"); - } else if (typeof segment.size === "string") { - $line( - "size = (bindings['%s'] * %d) / 8;", - segment.size, - segment.unit - ); - } else { - $line("size = %d;", segment.size * segment.unit / 8); - } - $line("val.copy(buf, offset, 0, size);"); - $line("offset += size;"); - break; - case "integer": - case "float": - write_number(segment); - break; - } - } - function write_number(segment) { - if (segment.name) { - $line("val = bindings['%s'];", segment.name); - } else { - $line("val = %d", segment.value); - } - var writer = segment.type === "integer" ? "write_int" : "write_float"; - if (typeof segment.size === "string") { - $line( - "size = (bindings['%s'] * %d) / 8;", - segment.size, - segment.unit - ); - } else { - $line("size = %d;", segment.size * segment.unit / 8); - } - $line( - "%s(buf, val, offset, size, %s);", - writer, - segment.bigendian - ); - $line("offset += size;"); - } - function size_of(segments) { - var variable = []; - var fixed = 0; - for (var i = 0; i < segments.length; i++) { - var segment = segments[i]; - if (typeof segment.size === "string" || segment.size === true) { - variable.push(segment); - } else if (segment.type === "string") { - fixed += Buffer2.byteLength(segment.value); - } else { - fixed += segment.size * segment.unit / 8; - } - } - $line("var buffersize = %d;", fixed); - if (variable.length > 0) { - for (var j2 = 0; j2 < variable.length; j2++) { - var segment = variable[j2]; - if (segment.size === true) { - $line("buffersize += bindings['%s'].length;", segment.name); - } else { - $line( - "buffersize += (bindings['%s'] * %d) / 8;", - segment.size, - segment.unit - ); - } - } - } - } - function emit_write(segments) { - $line("var val, size;"); - var len = segments.length; - for (var i = 0; i < len; i++) { - var segment = segments[i]; - $line("// %s", JSON.stringify(segment)); - write_seg(segment); - } - } - function compile_ctor(segments) { - $start(); - $line("return function(bindings) {"); - $line("'use strict';"); - size_of(segments); - $line("var buf = Buffer.alloc(buffersize);"); - $line("var offset = 0;"); - emit_write(segments); - $line("return buf;"); - $line("}"); - return new Function( - "write_int", - "write_float", - "Buffer", - $result() - )(write_int, write_float, Buffer2); - } - module2.exports.compile_pattern = compile_pattern; - module2.exports.compile = function() { - var str = [].join.call(arguments, ","); - var p = parse(str); - return compile_pattern(p); - }; - module2.exports.compile_builder = function() { - var str = [].join.call(arguments, ","); - var p = parse(str); - return compile_ctor(p); - }; - } -}); - -// node_modules/@acuminous/bitsyntax/index.js -var require_bitsyntax = __commonJS({ - "node_modules/@acuminous/bitsyntax/index.js"(exports2, module2) { - "use strict"; - module2.exports.parse = require_parse2().parse; - module2.exports.match = require_interp().match; - module2.exports.build = require_constructor().build; - module2.exports.write = require_constructor().write; - module2.exports.matcher = module2.exports.compile = require_compile().compile; - module2.exports.builder = require_compile().compile_builder; - } -}); - -// node_modules/amqplib/lib/frame.js -var require_frame = __commonJS({ - "node_modules/amqplib/lib/frame.js"(exports2, module2) { - "use strict"; - var defs = require_defs(); - var constants = defs.constants; - var decode = defs.decode; - var Bits = require_bitsyntax(); - module2.exports.PROTOCOL_HEADER = "AMQP" + String.fromCharCode(0, 0, 9, 1); - var FRAME_METHOD = constants.FRAME_METHOD; - var FRAME_HEARTBEAT = constants.FRAME_HEARTBEAT; - var FRAME_HEADER = constants.FRAME_HEADER; - var FRAME_BODY = constants.FRAME_BODY; - var FRAME_END = constants.FRAME_END; - var bodyCons = Bits.builder( - FRAME_BODY, - "channel:16, size:32, payload:size/binary", - FRAME_END - ); - module2.exports.makeBodyFrame = function(channel, payload) { - return bodyCons({ channel, size: payload.length, payload }); - }; - var frameHeaderPattern = Bits.matcher( - "type:8", - "channel:16", - "size:32", - "rest/binary" - ); - function parseFrame(bin, max) { - var fh = frameHeaderPattern(bin); - if (fh) { - var size = fh.size, rest = fh.rest; - if (size > max) { - throw new Error("Frame size exceeds frame max"); - } else if (rest.length > size) { - if (rest[size] !== FRAME_END) - throw new Error("Invalid frame"); - return { - type: fh.type, - channel: fh.channel, - size, - payload: rest.slice(0, size), - rest: rest.slice(size + 1) - }; - } - } - return false; - } - module2.exports.parseFrame = parseFrame; - var headerPattern = Bits.matcher( - "class:16", - "_weight:16", - "size:64", - "flagsAndfields/binary" - ); - var methodPattern = Bits.matcher("id:32, args/binary"); - var HEARTBEAT = { channel: 0 }; - module2.exports.decodeFrame = function(frame) { - var payload = frame.payload; - switch (frame.type) { - case FRAME_METHOD: - var idAndArgs = methodPattern(payload); - var id = idAndArgs.id; - var fields = decode(id, idAndArgs.args); - return { id, channel: frame.channel, fields }; - case FRAME_HEADER: - var parts = headerPattern(payload); - var id = parts["class"]; - var fields = decode(id, parts.flagsAndfields); - return { - id, - channel: frame.channel, - size: parts.size, - fields - }; - case FRAME_BODY: - return { channel: frame.channel, content: frame.payload }; - case FRAME_HEARTBEAT: - return HEARTBEAT; - default: - throw new Error("Unknown frame type " + frame.type); - } - }; - module2.exports.HEARTBEAT_BUF = Buffer.from([ - constants.FRAME_HEARTBEAT, - 0, - 0, - 0, - 0, - // size = 0 - 0, - 0, - // channel = 0 - constants.FRAME_END - ]); - module2.exports.HEARTBEAT = HEARTBEAT; - } -}); - -// node_modules/amqplib/lib/mux.js -var require_mux = __commonJS({ - "node_modules/amqplib/lib/mux.js"(exports2, module2) { - "use strict"; - var assert = require("assert"); - var schedule = typeof setImmediate === "function" ? setImmediate : process.nextTick; - function Mux(downstream) { - this.newStreams = []; - this.oldStreams = []; - this.blocked = false; - this.scheduledRead = false; - this.out = downstream; - var self2 = this; - downstream.on("drain", function() { - self2.blocked = false; - self2._readIncoming(); - }); - } - Mux.prototype._readIncoming = function() { - if (this.blocked) - return; - var accepting = true; - var out = this.out; - function roundrobin(streams) { - var s; - while (accepting && (s = streams.shift())) { - var chunk = s.read(); - if (chunk !== null) { - accepting = out.write(chunk); - streams.push(s); - } - } - } - roundrobin(this.newStreams); - if (accepting) { - assert.equal(0, this.newStreams.length); - roundrobin(this.oldStreams); - } else { - assert(this.newStreams.length > 0, "Expect some new streams to remain"); - Array.prototype.push.apply(this.oldStreams, this.newStreams); - this.newStreams = []; - } - this.blocked = !accepting; - }; - Mux.prototype._scheduleRead = function() { - var self2 = this; - if (!self2.scheduledRead) { - schedule(function() { - self2.scheduledRead = false; - self2._readIncoming(); - }); - self2.scheduledRead = true; - } - }; - Mux.prototype.pipeFrom = function(readable) { - var self2 = this; - function enqueue() { - self2.newStreams.push(readable); - self2._scheduleRead(); - } - function cleanup() { - readable.removeListener("readable", enqueue); - readable.removeListener("error", cleanup); - readable.removeListener("end", cleanup); - readable.removeListener("unpipeFrom", cleanupIfMe); - } - function cleanupIfMe(dest) { - if (dest === self2) - cleanup(); - } - readable.on("unpipeFrom", cleanupIfMe); - readable.on("end", cleanup); - readable.on("error", cleanup); - readable.on("readable", enqueue); - }; - Mux.prototype.unpipeFrom = function(readable) { - readable.emit("unpipeFrom", this); - }; - module2.exports.Mux = Mux; - } -}); - -// node_modules/core-util-is/lib/util.js -var require_util3 = __commonJS({ - "node_modules/core-util-is/lib/util.js"(exports2) { - function isArray(arg) { - if (Array.isArray) { - return Array.isArray(arg); - } - return objectToString(arg) === "[object Array]"; - } - exports2.isArray = isArray; - function isBoolean(arg) { - return typeof arg === "boolean"; - } - exports2.isBoolean = isBoolean; - function isNull(arg) { - return arg === null; - } - exports2.isNull = isNull; - function isNullOrUndefined(arg) { - return arg == null; - } - exports2.isNullOrUndefined = isNullOrUndefined; - function isNumber(arg) { - return typeof arg === "number"; - } - exports2.isNumber = isNumber; - function isString(arg) { - return typeof arg === "string"; - } - exports2.isString = isString; - function isSymbol(arg) { - return typeof arg === "symbol"; - } - exports2.isSymbol = isSymbol; - function isUndefined(arg) { - return arg === void 0; - } - exports2.isUndefined = isUndefined; - function isRegExp(re2) { - return objectToString(re2) === "[object RegExp]"; - } - exports2.isRegExp = isRegExp; - function isObject(arg) { - return typeof arg === "object" && arg !== null; - } - exports2.isObject = isObject; - function isDate(d) { - return objectToString(d) === "[object Date]"; - } - exports2.isDate = isDate; - function isError(e) { - return objectToString(e) === "[object Error]" || e instanceof Error; - } - exports2.isError = isError; - function isFunction(arg) { - return typeof arg === "function"; - } - exports2.isFunction = isFunction; - function isPrimitive(arg) { - return arg === null || typeof arg === "boolean" || typeof arg === "number" || typeof arg === "string" || typeof arg === "symbol" || // ES6 symbol - typeof arg === "undefined"; - } - exports2.isPrimitive = isPrimitive; - exports2.isBuffer = require("buffer").Buffer.isBuffer; - function objectToString(o) { - return Object.prototype.toString.call(o); - } - } -}); - -// node_modules/inherits/inherits_browser.js -var require_inherits_browser = __commonJS({ - "node_modules/inherits/inherits_browser.js"(exports2, module2) { - if (typeof Object.create === "function") { - module2.exports = function inherits(ctor, superCtor) { - if (superCtor) { - ctor.super_ = superCtor; - ctor.prototype = Object.create(superCtor.prototype, { - constructor: { - value: ctor, - enumerable: false, - writable: true, - configurable: true - } - }); - } - }; - } else { - module2.exports = function inherits(ctor, superCtor) { - if (superCtor) { - ctor.super_ = superCtor; - var TempCtor = function() { - }; - TempCtor.prototype = superCtor.prototype; - ctor.prototype = new TempCtor(); - ctor.prototype.constructor = ctor; - } - }; - } - } -}); - -// node_modules/inherits/inherits.js -var require_inherits = __commonJS({ - "node_modules/inherits/inherits.js"(exports2, module2) { - try { - util = require("util"); - if (typeof util.inherits !== "function") - throw ""; - module2.exports = util.inherits; - } catch (e) { - module2.exports = require_inherits_browser(); - } - var util; - } -}); - -// node_modules/isarray/index.js -var require_isarray = __commonJS({ - "node_modules/isarray/index.js"(exports2, module2) { - module2.exports = Array.isArray || function(arr) { - return Object.prototype.toString.call(arr) == "[object Array]"; - }; - } -}); - -// node_modules/string_decoder/index.js -var require_string_decoder = __commonJS({ - "node_modules/string_decoder/index.js"(exports2) { - var Buffer2 = require("buffer").Buffer; - var isBufferEncoding = Buffer2.isEncoding || function(encoding) { - switch (encoding && encoding.toLowerCase()) { - case "hex": - case "utf8": - case "utf-8": - case "ascii": - case "binary": - case "base64": - case "ucs2": - case "ucs-2": - case "utf16le": - case "utf-16le": - case "raw": - return true; - default: - return false; - } - }; - function assertEncoding(encoding) { - if (encoding && !isBufferEncoding(encoding)) { - throw new Error("Unknown encoding: " + encoding); - } - } - var StringDecoder = exports2.StringDecoder = function(encoding) { - this.encoding = (encoding || "utf8").toLowerCase().replace(/[-_]/, ""); - assertEncoding(encoding); - switch (this.encoding) { - case "utf8": - this.surrogateSize = 3; - break; - case "ucs2": - case "utf16le": - this.surrogateSize = 2; - this.detectIncompleteChar = utf16DetectIncompleteChar; - break; - case "base64": - this.surrogateSize = 3; - this.detectIncompleteChar = base64DetectIncompleteChar; - break; - default: - this.write = passThroughWrite; - return; - } - this.charBuffer = new Buffer2(6); - this.charReceived = 0; - this.charLength = 0; - }; - StringDecoder.prototype.write = function(buffer) { - var charStr = ""; - while (this.charLength) { - var available = buffer.length >= this.charLength - this.charReceived ? this.charLength - this.charReceived : buffer.length; - buffer.copy(this.charBuffer, this.charReceived, 0, available); - this.charReceived += available; - if (this.charReceived < this.charLength) { - return ""; - } - buffer = buffer.slice(available, buffer.length); - charStr = this.charBuffer.slice(0, this.charLength).toString(this.encoding); - var charCode = charStr.charCodeAt(charStr.length - 1); - if (charCode >= 55296 && charCode <= 56319) { - this.charLength += this.surrogateSize; - charStr = ""; - continue; - } - this.charReceived = this.charLength = 0; - if (buffer.length === 0) { - return charStr; - } - break; - } - this.detectIncompleteChar(buffer); - var end = buffer.length; - if (this.charLength) { - buffer.copy(this.charBuffer, 0, buffer.length - this.charReceived, end); - end -= this.charReceived; - } - charStr += buffer.toString(this.encoding, 0, end); - var end = charStr.length - 1; - var charCode = charStr.charCodeAt(end); - if (charCode >= 55296 && charCode <= 56319) { - var size = this.surrogateSize; - this.charLength += size; - this.charReceived += size; - this.charBuffer.copy(this.charBuffer, size, 0, size); - buffer.copy(this.charBuffer, 0, 0, size); - return charStr.substring(0, end); - } - return charStr; - }; - StringDecoder.prototype.detectIncompleteChar = function(buffer) { - var i = buffer.length >= 3 ? 3 : buffer.length; - for (; i > 0; i--) { - var c = buffer[buffer.length - i]; - if (i == 1 && c >> 5 == 6) { - this.charLength = 2; - break; - } - if (i <= 2 && c >> 4 == 14) { - this.charLength = 3; - break; - } - if (i <= 3 && c >> 3 == 30) { - this.charLength = 4; - break; - } - } - this.charReceived = i; - }; - StringDecoder.prototype.end = function(buffer) { - var res = ""; - if (buffer && buffer.length) - res = this.write(buffer); - if (this.charReceived) { - var cr = this.charReceived; - var buf = this.charBuffer; - var enc = this.encoding; - res += buf.slice(0, cr).toString(enc); - } - return res; - }; - function passThroughWrite(buffer) { - return buffer.toString(this.encoding); - } - function utf16DetectIncompleteChar(buffer) { - this.charReceived = buffer.length % 2; - this.charLength = this.charReceived ? 2 : 0; - } - function base64DetectIncompleteChar(buffer) { - this.charReceived = buffer.length % 3; - this.charLength = this.charReceived ? 3 : 0; - } - } -}); - -// node_modules/readable-stream/lib/_stream_readable.js -var require_stream_readable = __commonJS({ - "node_modules/readable-stream/lib/_stream_readable.js"(exports2, module2) { - module2.exports = Readable; - var isArray = require_isarray(); - var Buffer2 = require("buffer").Buffer; - Readable.ReadableState = ReadableState; - var EE = require("events").EventEmitter; - if (!EE.listenerCount) - EE.listenerCount = function(emitter, type) { - return emitter.listeners(type).length; - }; - var Stream = require("stream"); - var util = require_util3(); - util.inherits = require_inherits(); - var StringDecoder; - var debug2 = require("util"); - if (debug2 && debug2.debuglog) { - debug2 = debug2.debuglog("stream"); - } else { - debug2 = function() { - }; - } - util.inherits(Readable, Stream); - function ReadableState(options2, stream) { - var Duplex = require_stream_duplex(); - options2 = options2 || {}; - var hwm = options2.highWaterMark; - var defaultHwm = options2.objectMode ? 16 : 16 * 1024; - this.highWaterMark = hwm || hwm === 0 ? hwm : defaultHwm; - this.highWaterMark = ~~this.highWaterMark; - this.buffer = []; - this.length = 0; - this.pipes = null; - this.pipesCount = 0; - this.flowing = null; - this.ended = false; - this.endEmitted = false; - this.reading = false; - this.sync = true; - this.needReadable = false; - this.emittedReadable = false; - this.readableListening = false; - this.objectMode = !!options2.objectMode; - if (stream instanceof Duplex) - this.objectMode = this.objectMode || !!options2.readableObjectMode; - this.defaultEncoding = options2.defaultEncoding || "utf8"; - this.ranOut = false; - this.awaitDrain = 0; - this.readingMore = false; - this.decoder = null; - this.encoding = null; - if (options2.encoding) { - if (!StringDecoder) - StringDecoder = require_string_decoder().StringDecoder; - this.decoder = new StringDecoder(options2.encoding); - this.encoding = options2.encoding; - } - } - function Readable(options2) { - var Duplex = require_stream_duplex(); - if (!(this instanceof Readable)) - return new Readable(options2); - this._readableState = new ReadableState(options2, this); - this.readable = true; - Stream.call(this); - } - Readable.prototype.push = function(chunk, encoding) { - var state = this._readableState; - if (util.isString(chunk) && !state.objectMode) { - encoding = encoding || state.defaultEncoding; - if (encoding !== state.encoding) { - chunk = new Buffer2(chunk, encoding); - encoding = ""; - } - } - return readableAddChunk(this, state, chunk, encoding, false); - }; - Readable.prototype.unshift = function(chunk) { - var state = this._readableState; - return readableAddChunk(this, state, chunk, "", true); - }; - function readableAddChunk(stream, state, chunk, encoding, addToFront) { - var er = chunkInvalid(state, chunk); - if (er) { - stream.emit("error", er); - } else if (util.isNullOrUndefined(chunk)) { - state.reading = false; - if (!state.ended) - onEofChunk(stream, state); - } else if (state.objectMode || chunk && chunk.length > 0) { - if (state.ended && !addToFront) { - var e = new Error("stream.push() after EOF"); - stream.emit("error", e); - } else if (state.endEmitted && addToFront) { - var e = new Error("stream.unshift() after end event"); - stream.emit("error", e); - } else { - if (state.decoder && !addToFront && !encoding) - chunk = state.decoder.write(chunk); - if (!addToFront) - state.reading = false; - if (state.flowing && state.length === 0 && !state.sync) { - stream.emit("data", chunk); - stream.read(0); - } else { - state.length += state.objectMode ? 1 : chunk.length; - if (addToFront) - state.buffer.unshift(chunk); - else - state.buffer.push(chunk); - if (state.needReadable) - emitReadable(stream); - } - maybeReadMore(stream, state); - } - } else if (!addToFront) { - state.reading = false; - } - return needMoreData(state); - } - function needMoreData(state) { - return !state.ended && (state.needReadable || state.length < state.highWaterMark || state.length === 0); - } - Readable.prototype.setEncoding = function(enc) { - if (!StringDecoder) - StringDecoder = require_string_decoder().StringDecoder; - this._readableState.decoder = new StringDecoder(enc); - this._readableState.encoding = enc; - return this; - }; - var MAX_HWM = 8388608; - function roundUpToNextPowerOf2(n) { - if (n >= MAX_HWM) { - n = MAX_HWM; - } else { - n--; - for (var p = 1; p < 32; p <<= 1) - n |= n >> p; - n++; - } - return n; - } - function howMuchToRead(n, state) { - if (state.length === 0 && state.ended) - return 0; - if (state.objectMode) - return n === 0 ? 0 : 1; - if (isNaN(n) || util.isNull(n)) { - if (state.flowing && state.buffer.length) - return state.buffer[0].length; - else - return state.length; - } - if (n <= 0) - return 0; - if (n > state.highWaterMark) - state.highWaterMark = roundUpToNextPowerOf2(n); - if (n > state.length) { - if (!state.ended) { - state.needReadable = true; - return 0; - } else - return state.length; - } - return n; - } - Readable.prototype.read = function(n) { - debug2("read", n); - var state = this._readableState; - var nOrig = n; - if (!util.isNumber(n) || n > 0) - state.emittedReadable = false; - if (n === 0 && state.needReadable && (state.length >= state.highWaterMark || state.ended)) { - debug2("read: emitReadable", state.length, state.ended); - if (state.length === 0 && state.ended) - endReadable(this); - else - emitReadable(this); - return null; - } - n = howMuchToRead(n, state); - if (n === 0 && state.ended) { - if (state.length === 0) - endReadable(this); - return null; - } - var doRead = state.needReadable; - debug2("need readable", doRead); - if (state.length === 0 || state.length - n < state.highWaterMark) { - doRead = true; - debug2("length less than watermark", doRead); - } - if (state.ended || state.reading) { - doRead = false; - debug2("reading or ended", doRead); - } - if (doRead) { - debug2("do read"); - state.reading = true; - state.sync = true; - if (state.length === 0) - state.needReadable = true; - this._read(state.highWaterMark); - state.sync = false; - } - if (doRead && !state.reading) - n = howMuchToRead(nOrig, state); - var ret; - if (n > 0) - ret = fromList(n, state); - else - ret = null; - if (util.isNull(ret)) { - state.needReadable = true; - n = 0; - } - state.length -= n; - if (state.length === 0 && !state.ended) - state.needReadable = true; - if (nOrig !== n && state.ended && state.length === 0) - endReadable(this); - if (!util.isNull(ret)) - this.emit("data", ret); - return ret; - }; - function chunkInvalid(state, chunk) { - var er = null; - if (!util.isBuffer(chunk) && !util.isString(chunk) && !util.isNullOrUndefined(chunk) && !state.objectMode) { - er = new TypeError("Invalid non-string/buffer chunk"); - } - return er; - } - function onEofChunk(stream, state) { - if (state.decoder && !state.ended) { - var chunk = state.decoder.end(); - if (chunk && chunk.length) { - state.buffer.push(chunk); - state.length += state.objectMode ? 1 : chunk.length; - } - } - state.ended = true; - emitReadable(stream); - } - function emitReadable(stream) { - var state = stream._readableState; - state.needReadable = false; - if (!state.emittedReadable) { - debug2("emitReadable", state.flowing); - state.emittedReadable = true; - if (state.sync) - process.nextTick(function() { - emitReadable_(stream); - }); - else - emitReadable_(stream); - } - } - function emitReadable_(stream) { - debug2("emit readable"); - stream.emit("readable"); - flow(stream); - } - function maybeReadMore(stream, state) { - if (!state.readingMore) { - state.readingMore = true; - process.nextTick(function() { - maybeReadMore_(stream, state); - }); - } - } - function maybeReadMore_(stream, state) { - var len = state.length; - while (!state.reading && !state.flowing && !state.ended && state.length < state.highWaterMark) { - debug2("maybeReadMore read 0"); - stream.read(0); - if (len === state.length) - break; - else - len = state.length; - } - state.readingMore = false; - } - Readable.prototype._read = function(n) { - this.emit("error", new Error("not implemented")); - }; - Readable.prototype.pipe = function(dest, pipeOpts) { - var src = this; - var state = this._readableState; - switch (state.pipesCount) { - case 0: - state.pipes = dest; - break; - case 1: - state.pipes = [state.pipes, dest]; - break; - default: - state.pipes.push(dest); - break; - } - state.pipesCount += 1; - debug2("pipe count=%d opts=%j", state.pipesCount, pipeOpts); - var doEnd = (!pipeOpts || pipeOpts.end !== false) && dest !== process.stdout && dest !== process.stderr; - var endFn = doEnd ? onend : cleanup; - if (state.endEmitted) - process.nextTick(endFn); - else - src.once("end", endFn); - dest.on("unpipe", onunpipe); - function onunpipe(readable) { - debug2("onunpipe"); - if (readable === src) { - cleanup(); - } - } - function onend() { - debug2("onend"); - dest.end(); - } - var ondrain = pipeOnDrain(src); - dest.on("drain", ondrain); - function cleanup() { - debug2("cleanup"); - dest.removeListener("close", onclose); - dest.removeListener("finish", onfinish); - dest.removeListener("drain", ondrain); - dest.removeListener("error", onerror); - dest.removeListener("unpipe", onunpipe); - src.removeListener("end", onend); - src.removeListener("end", cleanup); - src.removeListener("data", ondata); - if (state.awaitDrain && (!dest._writableState || dest._writableState.needDrain)) - ondrain(); - } - src.on("data", ondata); - function ondata(chunk) { - debug2("ondata"); - var ret = dest.write(chunk); - if (false === ret) { - debug2( - "false write response, pause", - src._readableState.awaitDrain - ); - src._readableState.awaitDrain++; - src.pause(); - } - } - function onerror(er) { - debug2("onerror", er); - unpipe(); - dest.removeListener("error", onerror); - if (EE.listenerCount(dest, "error") === 0) - dest.emit("error", er); - } - if (!dest._events || !dest._events.error) - dest.on("error", onerror); - else if (isArray(dest._events.error)) - dest._events.error.unshift(onerror); - else - dest._events.error = [onerror, dest._events.error]; - function onclose() { - dest.removeListener("finish", onfinish); - unpipe(); - } - dest.once("close", onclose); - function onfinish() { - debug2("onfinish"); - dest.removeListener("close", onclose); - unpipe(); - } - dest.once("finish", onfinish); - function unpipe() { - debug2("unpipe"); - src.unpipe(dest); - } - dest.emit("pipe", src); - if (!state.flowing) { - debug2("pipe resume"); - src.resume(); - } - return dest; - }; - function pipeOnDrain(src) { - return function() { - var state = src._readableState; - debug2("pipeOnDrain", state.awaitDrain); - if (state.awaitDrain) - state.awaitDrain--; - if (state.awaitDrain === 0 && EE.listenerCount(src, "data")) { - state.flowing = true; - flow(src); - } - }; - } - Readable.prototype.unpipe = function(dest) { - var state = this._readableState; - if (state.pipesCount === 0) - return this; - if (state.pipesCount === 1) { - if (dest && dest !== state.pipes) - return this; - if (!dest) - dest = state.pipes; - state.pipes = null; - state.pipesCount = 0; - state.flowing = false; - if (dest) - dest.emit("unpipe", this); - return this; - } - if (!dest) { - var dests = state.pipes; - var len = state.pipesCount; - state.pipes = null; - state.pipesCount = 0; - state.flowing = false; - for (var i = 0; i < len; i++) - dests[i].emit("unpipe", this); - return this; - } - var i = indexOf(state.pipes, dest); - if (i === -1) - return this; - state.pipes.splice(i, 1); - state.pipesCount -= 1; - if (state.pipesCount === 1) - state.pipes = state.pipes[0]; - dest.emit("unpipe", this); - return this; - }; - Readable.prototype.on = function(ev, fn) { - var res = Stream.prototype.on.call(this, ev, fn); - if (ev === "data" && false !== this._readableState.flowing) { - this.resume(); - } - if (ev === "readable" && this.readable) { - var state = this._readableState; - if (!state.readableListening) { - state.readableListening = true; - state.emittedReadable = false; - state.needReadable = true; - if (!state.reading) { - var self2 = this; - process.nextTick(function() { - debug2("readable nexttick read 0"); - self2.read(0); - }); - } else if (state.length) { - emitReadable(this, state); - } - } - } - return res; - }; - Readable.prototype.addListener = Readable.prototype.on; - Readable.prototype.resume = function() { - var state = this._readableState; - if (!state.flowing) { - debug2("resume"); - state.flowing = true; - if (!state.reading) { - debug2("resume read 0"); - this.read(0); - } - resume(this, state); - } - return this; - }; - function resume(stream, state) { - if (!state.resumeScheduled) { - state.resumeScheduled = true; - process.nextTick(function() { - resume_(stream, state); - }); - } - } - function resume_(stream, state) { - state.resumeScheduled = false; - stream.emit("resume"); - flow(stream); - if (state.flowing && !state.reading) - stream.read(0); - } - Readable.prototype.pause = function() { - debug2("call pause flowing=%j", this._readableState.flowing); - if (false !== this._readableState.flowing) { - debug2("pause"); - this._readableState.flowing = false; - this.emit("pause"); - } - return this; - }; - function flow(stream) { - var state = stream._readableState; - debug2("flow", state.flowing); - if (state.flowing) { - do { - var chunk = stream.read(); - } while (null !== chunk && state.flowing); - } - } - Readable.prototype.wrap = function(stream) { - var state = this._readableState; - var paused = false; - var self2 = this; - stream.on("end", function() { - debug2("wrapped end"); - if (state.decoder && !state.ended) { - var chunk = state.decoder.end(); - if (chunk && chunk.length) - self2.push(chunk); - } - self2.push(null); - }); - stream.on("data", function(chunk) { - debug2("wrapped data"); - if (state.decoder) - chunk = state.decoder.write(chunk); - if (!chunk || !state.objectMode && !chunk.length) - return; - var ret = self2.push(chunk); - if (!ret) { - paused = true; - stream.pause(); - } - }); - for (var i in stream) { - if (util.isFunction(stream[i]) && util.isUndefined(this[i])) { - this[i] = function(method) { - return function() { - return stream[method].apply(stream, arguments); - }; - }(i); - } - } - var events = ["error", "close", "destroy", "pause", "resume"]; - forEach(events, function(ev) { - stream.on(ev, self2.emit.bind(self2, ev)); - }); - self2._read = function(n) { - debug2("wrapped _read", n); - if (paused) { - paused = false; - stream.resume(); - } - }; - return self2; - }; - Readable._fromList = fromList; - function fromList(n, state) { - var list = state.buffer; - var length = state.length; - var stringMode = !!state.decoder; - var objectMode = !!state.objectMode; - var ret; - if (list.length === 0) - return null; - if (length === 0) - ret = null; - else if (objectMode) - ret = list.shift(); - else if (!n || n >= length) { - if (stringMode) - ret = list.join(""); - else - ret = Buffer2.concat(list, length); - list.length = 0; - } else { - if (n < list[0].length) { - var buf = list[0]; - ret = buf.slice(0, n); - list[0] = buf.slice(n); - } else if (n === list[0].length) { - ret = list.shift(); - } else { - if (stringMode) - ret = ""; - else - ret = new Buffer2(n); - var c = 0; - for (var i = 0, l = list.length; i < l && c < n; i++) { - var buf = list[0]; - var cpy = Math.min(n - c, buf.length); - if (stringMode) - ret += buf.slice(0, cpy); - else - buf.copy(ret, c, 0, cpy); - if (cpy < buf.length) - list[0] = buf.slice(cpy); - else - list.shift(); - c += cpy; - } - } - } - return ret; - } - function endReadable(stream) { - var state = stream._readableState; - if (state.length > 0) - throw new Error("endReadable called on non-empty stream"); - if (!state.endEmitted) { - state.ended = true; - process.nextTick(function() { - if (!state.endEmitted && state.length === 0) { - state.endEmitted = true; - stream.readable = false; - stream.emit("end"); - } - }); - } - } - function forEach(xs2, f) { - for (var i = 0, l = xs2.length; i < l; i++) { - f(xs2[i], i); - } - } - function indexOf(xs2, x) { - for (var i = 0, l = xs2.length; i < l; i++) { - if (xs2[i] === x) - return i; - } - return -1; - } - } -}); - -// node_modules/readable-stream/lib/_stream_writable.js -var require_stream_writable = __commonJS({ - "node_modules/readable-stream/lib/_stream_writable.js"(exports2, module2) { - module2.exports = Writable; - var Buffer2 = require("buffer").Buffer; - Writable.WritableState = WritableState; - var util = require_util3(); - util.inherits = require_inherits(); - var Stream = require("stream"); - util.inherits(Writable, Stream); - function WriteReq(chunk, encoding, cb) { - this.chunk = chunk; - this.encoding = encoding; - this.callback = cb; - } - function WritableState(options2, stream) { - var Duplex = require_stream_duplex(); - options2 = options2 || {}; - var hwm = options2.highWaterMark; - var defaultHwm = options2.objectMode ? 16 : 16 * 1024; - this.highWaterMark = hwm || hwm === 0 ? hwm : defaultHwm; - this.objectMode = !!options2.objectMode; - if (stream instanceof Duplex) - this.objectMode = this.objectMode || !!options2.writableObjectMode; - this.highWaterMark = ~~this.highWaterMark; - this.needDrain = false; - this.ending = false; - this.ended = false; - this.finished = false; - var noDecode = options2.decodeStrings === false; - this.decodeStrings = !noDecode; - this.defaultEncoding = options2.defaultEncoding || "utf8"; - this.length = 0; - this.writing = false; - this.corked = 0; - this.sync = true; - this.bufferProcessing = false; - this.onwrite = function(er) { - onwrite(stream, er); - }; - this.writecb = null; - this.writelen = 0; - this.buffer = []; - this.pendingcb = 0; - this.prefinished = false; - this.errorEmitted = false; - } - function Writable(options2) { - var Duplex = require_stream_duplex(); - if (!(this instanceof Writable) && !(this instanceof Duplex)) - return new Writable(options2); - this._writableState = new WritableState(options2, this); - this.writable = true; - Stream.call(this); - } - Writable.prototype.pipe = function() { - this.emit("error", new Error("Cannot pipe. Not readable.")); - }; - function writeAfterEnd(stream, state, cb) { - var er = new Error("write after end"); - stream.emit("error", er); - process.nextTick(function() { - cb(er); - }); - } - function validChunk(stream, state, chunk, cb) { - var valid = true; - if (!util.isBuffer(chunk) && !util.isString(chunk) && !util.isNullOrUndefined(chunk) && !state.objectMode) { - var er = new TypeError("Invalid non-string/buffer chunk"); - stream.emit("error", er); - process.nextTick(function() { - cb(er); - }); - valid = false; - } - return valid; - } - Writable.prototype.write = function(chunk, encoding, cb) { - var state = this._writableState; - var ret = false; - if (util.isFunction(encoding)) { - cb = encoding; - encoding = null; - } - if (util.isBuffer(chunk)) - encoding = "buffer"; - else if (!encoding) - encoding = state.defaultEncoding; - if (!util.isFunction(cb)) - cb = function() { - }; - if (state.ended) - writeAfterEnd(this, state, cb); - else if (validChunk(this, state, chunk, cb)) { - state.pendingcb++; - ret = writeOrBuffer(this, state, chunk, encoding, cb); - } - return ret; - }; - Writable.prototype.cork = function() { - var state = this._writableState; - state.corked++; - }; - Writable.prototype.uncork = function() { - var state = this._writableState; - if (state.corked) { - state.corked--; - if (!state.writing && !state.corked && !state.finished && !state.bufferProcessing && state.buffer.length) - clearBuffer(this, state); - } - }; - function decodeChunk(state, chunk, encoding) { - if (!state.objectMode && state.decodeStrings !== false && util.isString(chunk)) { - chunk = new Buffer2(chunk, encoding); - } - return chunk; - } - function writeOrBuffer(stream, state, chunk, encoding, cb) { - chunk = decodeChunk(state, chunk, encoding); - if (util.isBuffer(chunk)) - encoding = "buffer"; - var len = state.objectMode ? 1 : chunk.length; - state.length += len; - var ret = state.length < state.highWaterMark; - if (!ret) - state.needDrain = true; - if (state.writing || state.corked) - state.buffer.push(new WriteReq(chunk, encoding, cb)); - else - doWrite(stream, state, false, len, chunk, encoding, cb); - return ret; - } - function doWrite(stream, state, writev, len, chunk, encoding, cb) { - state.writelen = len; - state.writecb = cb; - state.writing = true; - state.sync = true; - if (writev) - stream._writev(chunk, state.onwrite); - else - stream._write(chunk, encoding, state.onwrite); - state.sync = false; - } - function onwriteError(stream, state, sync, er, cb) { - if (sync) - process.nextTick(function() { - state.pendingcb--; - cb(er); - }); - else { - state.pendingcb--; - cb(er); - } - stream._writableState.errorEmitted = true; - stream.emit("error", er); - } - function onwriteStateUpdate(state) { - state.writing = false; - state.writecb = null; - state.length -= state.writelen; - state.writelen = 0; - } - function onwrite(stream, er) { - var state = stream._writableState; - var sync = state.sync; - var cb = state.writecb; - onwriteStateUpdate(state); - if (er) - onwriteError(stream, state, sync, er, cb); - else { - var finished = needFinish(stream, state); - if (!finished && !state.corked && !state.bufferProcessing && state.buffer.length) { - clearBuffer(stream, state); - } - if (sync) { - process.nextTick(function() { - afterWrite(stream, state, finished, cb); - }); - } else { - afterWrite(stream, state, finished, cb); - } - } - } - function afterWrite(stream, state, finished, cb) { - if (!finished) - onwriteDrain(stream, state); - state.pendingcb--; - cb(); - finishMaybe(stream, state); - } - function onwriteDrain(stream, state) { - if (state.length === 0 && state.needDrain) { - state.needDrain = false; - stream.emit("drain"); - } - } - function clearBuffer(stream, state) { - state.bufferProcessing = true; - if (stream._writev && state.buffer.length > 1) { - var cbs = []; - for (var c = 0; c < state.buffer.length; c++) - cbs.push(state.buffer[c].callback); - state.pendingcb++; - doWrite(stream, state, true, state.length, state.buffer, "", function(err) { - for (var i = 0; i < cbs.length; i++) { - state.pendingcb--; - cbs[i](err); - } - }); - state.buffer = []; - } else { - for (var c = 0; c < state.buffer.length; c++) { - var entry = state.buffer[c]; - var chunk = entry.chunk; - var encoding = entry.encoding; - var cb = entry.callback; - var len = state.objectMode ? 1 : chunk.length; - doWrite(stream, state, false, len, chunk, encoding, cb); - if (state.writing) { - c++; - break; - } - } - if (c < state.buffer.length) - state.buffer = state.buffer.slice(c); - else - state.buffer.length = 0; - } - state.bufferProcessing = false; - } - Writable.prototype._write = function(chunk, encoding, cb) { - cb(new Error("not implemented")); - }; - Writable.prototype._writev = null; - Writable.prototype.end = function(chunk, encoding, cb) { - var state = this._writableState; - if (util.isFunction(chunk)) { - cb = chunk; - chunk = null; - encoding = null; - } else if (util.isFunction(encoding)) { - cb = encoding; - encoding = null; - } - if (!util.isNullOrUndefined(chunk)) - this.write(chunk, encoding); - if (state.corked) { - state.corked = 1; - this.uncork(); - } - if (!state.ending && !state.finished) - endWritable(this, state, cb); - }; - function needFinish(stream, state) { - return state.ending && state.length === 0 && !state.finished && !state.writing; - } - function prefinish(stream, state) { - if (!state.prefinished) { - state.prefinished = true; - stream.emit("prefinish"); - } - } - function finishMaybe(stream, state) { - var need = needFinish(stream, state); - if (need) { - if (state.pendingcb === 0) { - prefinish(stream, state); - state.finished = true; - stream.emit("finish"); - } else - prefinish(stream, state); - } - return need; - } - function endWritable(stream, state, cb) { - state.ending = true; - finishMaybe(stream, state); - if (cb) { - if (state.finished) - process.nextTick(cb); - else - stream.once("finish", cb); - } - state.ended = true; - } - } -}); - -// node_modules/readable-stream/lib/_stream_duplex.js -var require_stream_duplex = __commonJS({ - "node_modules/readable-stream/lib/_stream_duplex.js"(exports2, module2) { - module2.exports = Duplex; - var objectKeys = Object.keys || function(obj) { - var keys = []; - for (var key in obj) - keys.push(key); - return keys; - }; - var util = require_util3(); - util.inherits = require_inherits(); - var Readable = require_stream_readable(); - var Writable = require_stream_writable(); - util.inherits(Duplex, Readable); - forEach(objectKeys(Writable.prototype), function(method) { - if (!Duplex.prototype[method]) - Duplex.prototype[method] = Writable.prototype[method]; - }); - function Duplex(options2) { - if (!(this instanceof Duplex)) - return new Duplex(options2); - Readable.call(this, options2); - Writable.call(this, options2); - if (options2 && options2.readable === false) - this.readable = false; - if (options2 && options2.writable === false) - this.writable = false; - this.allowHalfOpen = true; - if (options2 && options2.allowHalfOpen === false) - this.allowHalfOpen = false; - this.once("end", onend); - } - function onend() { - if (this.allowHalfOpen || this._writableState.ended) - return; - process.nextTick(this.end.bind(this)); - } - function forEach(xs2, f) { - for (var i = 0, l = xs2.length; i < l; i++) { - f(xs2[i], i); - } - } - } -}); - -// node_modules/readable-stream/duplex.js -var require_duplex = __commonJS({ - "node_modules/readable-stream/duplex.js"(exports2, module2) { - module2.exports = require_stream_duplex(); - } -}); - -// node_modules/amqplib/lib/heartbeat.js -var require_heartbeat = __commonJS({ - "node_modules/amqplib/lib/heartbeat.js"(exports2, module2) { - "use strict"; - var inherits = require("util").inherits; - var EventEmitter = require("events").EventEmitter; - module2.exports.UNITS_TO_MS = 1e3; - function Heart(interval, checkSend, checkRecv) { - EventEmitter.call(this); - this.interval = interval; - var intervalMs = interval * module2.exports.UNITS_TO_MS; - var beat = this.emit.bind(this, "beat"); - var timeout = this.emit.bind(this, "timeout"); - this.sendTimer = setInterval( - this.runHeartbeat.bind(this, checkSend, beat), - intervalMs / 2 - ); - var recvMissed = 0; - function missedTwo() { - if (!checkRecv()) - return ++recvMissed < 2; - else { - recvMissed = 0; - return true; - } - } - this.recvTimer = setInterval( - this.runHeartbeat.bind(this, missedTwo, timeout), - intervalMs - ); - } - inherits(Heart, EventEmitter); - module2.exports.Heart = Heart; - Heart.prototype.clear = function() { - clearInterval(this.sendTimer); - clearInterval(this.recvTimer); - }; - Heart.prototype.runHeartbeat = function(check, fail) { - if (!check()) - fail(); - }; - } -}); - -// node_modules/amqplib/lib/format.js -var require_format = __commonJS({ - "node_modules/amqplib/lib/format.js"(exports2, module2) { - "use strict"; - var defs = require_defs(); - var format = require("util").format; - var inherits = require("util").inherits; - var HEARTBEAT = require_frame().HEARTBEAT; - module2.exports.closeMessage = function(close) { - var code = close.fields.replyCode; - return format( - '%d (%s) with message "%s"', - code, - defs.constant_strs[code], - close.fields.replyText - ); - }; - module2.exports.methodName = function(id) { - return defs.info(id).name; - }; - module2.exports.inspect = function(frame, showFields) { - if (frame === HEARTBEAT) { - return ""; - } else if (!frame.id) { - return format( - "", - frame.channel, - frame.size - ); - } else { - var info2 = defs.info(frame.id); - return format( - "<%s channel:%d%s>", - info2.name, - frame.channel, - showFields ? " " + JSON.stringify(frame.fields, void 0, 2) : "" - ); - } - }; - } -}); - -// node_modules/amqplib/lib/bitset.js -var require_bitset = __commonJS({ - "node_modules/amqplib/lib/bitset.js"(exports2, module2) { - "use strict"; - var BitSet = class { - /** - * @param {number} [size] - */ - constructor(size) { - if (size) { - const numWords = Math.ceil(size / 32); - this.words = new Array(numWords); - } else { - this.words = []; - } - this.wordsInUse = 0; - } - /** - * @param {number} numWords - */ - ensureSize(numWords) { - const wordsPresent = this.words.length; - if (wordsPresent < numWords) { - this.words = this.words.concat(new Array(numWords - wordsPresent)); - } - } - /** - * @param {number} bitIndex - */ - set(bitIndex) { - const w2 = wordIndex(bitIndex); - if (w2 >= this.wordsInUse) { - this.ensureSize(w2 + 1); - this.wordsInUse = w2 + 1; - } - const bit = 1 << bitIndex; - this.words[w2] |= bit; - } - /** - * @param {number} bitIndex - */ - clear(bitIndex) { - const w2 = wordIndex(bitIndex); - if (w2 >= this.wordsInUse) - return; - const mask = ~(1 << bitIndex); - this.words[w2] &= mask; - } - /** - * @param {number} bitIndex - */ - get(bitIndex) { - const w2 = wordIndex(bitIndex); - if (w2 >= this.wordsInUse) - return false; - const bit = 1 << bitIndex; - return !!(this.words[w2] & bit); - } - /** - * Give the next bit that is set on or after fromIndex, or -1 if no such bit - * - * @param {number} fromIndex - */ - nextSetBit(fromIndex) { - let w2 = wordIndex(fromIndex); - if (w2 >= this.wordsInUse) - return -1; - let word = this.words[w2] & 4294967295 << fromIndex; - while (true) { - if (word) - return w2 * 32 + trailingZeros(word); - w2++; - if (w2 === this.wordsInUse) - return -1; - word = this.words[w2]; - } - } - /** - * @param {number} fromIndex - */ - nextClearBit(fromIndex) { - let w2 = wordIndex(fromIndex); - if (w2 >= this.wordsInUse) - return fromIndex; - let word = ~this.words[w2] & 4294967295 << fromIndex; - while (true) { - if (word) - return w2 * 32 + trailingZeros(word); - w2++; - if (w2 == this.wordsInUse) - return w2 * 32; - word = ~this.words[w2]; - } - } - }; - function wordIndex(bitIndex) { - return Math.floor(bitIndex / 32); - } - function trailingZeros(i) { - if (i === 0) - return 32; - let y, n = 31; - y = i << 16; - if (y != 0) { - n = n - 16; - i = y; - } - y = i << 8; - if (y != 0) { - n = n - 8; - i = y; - } - y = i << 4; - if (y != 0) { - n = n - 4; - i = y; - } - y = i << 2; - if (y != 0) { - n = n - 2; - i = y; - } - return n - (i << 1 >>> 31); - } - module2.exports.BitSet = BitSet; - } -}); - -// node_modules/readable-stream/lib/_stream_transform.js -var require_stream_transform = __commonJS({ - "node_modules/readable-stream/lib/_stream_transform.js"(exports2, module2) { - module2.exports = Transform; - var Duplex = require_stream_duplex(); - var util = require_util3(); - util.inherits = require_inherits(); - util.inherits(Transform, Duplex); - function TransformState(options2, stream) { - this.afterTransform = function(er, data) { - return afterTransform(stream, er, data); - }; - this.needTransform = false; - this.transforming = false; - this.writecb = null; - this.writechunk = null; - } - function afterTransform(stream, er, data) { - var ts2 = stream._transformState; - ts2.transforming = false; - var cb = ts2.writecb; - if (!cb) - return stream.emit("error", new Error("no writecb in Transform class")); - ts2.writechunk = null; - ts2.writecb = null; - if (!util.isNullOrUndefined(data)) - stream.push(data); - if (cb) - cb(er); - var rs2 = stream._readableState; - rs2.reading = false; - if (rs2.needReadable || rs2.length < rs2.highWaterMark) { - stream._read(rs2.highWaterMark); - } - } - function Transform(options2) { - if (!(this instanceof Transform)) - return new Transform(options2); - Duplex.call(this, options2); - this._transformState = new TransformState(options2, this); - var stream = this; - this._readableState.needReadable = true; - this._readableState.sync = false; - this.once("prefinish", function() { - if (util.isFunction(this._flush)) - this._flush(function(er) { - done(stream, er); - }); - else - done(stream); - }); - } - Transform.prototype.push = function(chunk, encoding) { - this._transformState.needTransform = false; - return Duplex.prototype.push.call(this, chunk, encoding); - }; - Transform.prototype._transform = function(chunk, encoding, cb) { - throw new Error("not implemented"); - }; - Transform.prototype._write = function(chunk, encoding, cb) { - var ts2 = this._transformState; - ts2.writecb = cb; - ts2.writechunk = chunk; - ts2.writeencoding = encoding; - if (!ts2.transforming) { - var rs2 = this._readableState; - if (ts2.needTransform || rs2.needReadable || rs2.length < rs2.highWaterMark) - this._read(rs2.highWaterMark); - } - }; - Transform.prototype._read = function(n) { - var ts2 = this._transformState; - if (!util.isNull(ts2.writechunk) && ts2.writecb && !ts2.transforming) { - ts2.transforming = true; - this._transform(ts2.writechunk, ts2.writeencoding, ts2.afterTransform); - } else { - ts2.needTransform = true; - } - }; - function done(stream, er) { - if (er) - return stream.emit("error", er); - var ws2 = stream._writableState; - var ts2 = stream._transformState; - if (ws2.length) - throw new Error("calling transform done when ws.length != 0"); - if (ts2.transforming) - throw new Error("calling transform done when still transforming"); - return stream.push(null); - } - } -}); - -// node_modules/readable-stream/lib/_stream_passthrough.js -var require_stream_passthrough = __commonJS({ - "node_modules/readable-stream/lib/_stream_passthrough.js"(exports2, module2) { - module2.exports = PassThrough; - var Transform = require_stream_transform(); - var util = require_util3(); - util.inherits = require_inherits(); - util.inherits(PassThrough, Transform); - function PassThrough(options2) { - if (!(this instanceof PassThrough)) - return new PassThrough(options2); - Transform.call(this, options2); - } - PassThrough.prototype._transform = function(chunk, encoding, cb) { - cb(null, chunk); - }; - } -}); - -// node_modules/readable-stream/passthrough.js -var require_passthrough = __commonJS({ - "node_modules/readable-stream/passthrough.js"(exports2, module2) { - module2.exports = require_stream_passthrough(); - } -}); - -// node_modules/amqplib/lib/error.js -var require_error2 = __commonJS({ - "node_modules/amqplib/lib/error.js"(exports2, module2) { - var inherits = require("util").inherits; - function trimStack(stack, num) { - return stack && stack.split("\n").slice(num).join("\n"); - } - function IllegalOperationError(msg2, stack) { - var tmp = new Error(); - this.message = msg2; - this.stack = this.toString() + "\n" + trimStack(tmp.stack, 2); - this.stackAtStateChange = stack; - } - inherits(IllegalOperationError, Error); - IllegalOperationError.prototype.name = "IllegalOperationError"; - function stackCapture(reason) { - var e = new Error(); - return "Stack capture: " + reason + "\n" + trimStack(e.stack, 2); - } - module2.exports.IllegalOperationError = IllegalOperationError; - module2.exports.stackCapture = stackCapture; - } -}); - -// node_modules/amqplib/lib/connection.js -var require_connection = __commonJS({ - "node_modules/amqplib/lib/connection.js"(exports2, module2) { - "use strict"; - var defs = require_defs(); - var constants = defs.constants; - var frame = require_frame(); - var HEARTBEAT = frame.HEARTBEAT; - var Mux = require_mux().Mux; - var Duplex = require("stream").Duplex || require_duplex(); - var EventEmitter = require("events").EventEmitter; - var Heart = require_heartbeat().Heart; - var methodName = require_format().methodName; - var closeMsg = require_format().closeMessage; - var inspect = require_format().inspect; - var BitSet = require_bitset().BitSet; - var inherits = require("util").inherits; - var fmt = require("util").format; - var PassThrough = require("stream").PassThrough || require_passthrough(); - var IllegalOperationError = require_error2().IllegalOperationError; - var stackCapture = require_error2().stackCapture; - var DEFAULT_WRITE_HWM = 1024; - var SINGLE_CHUNK_THRESHOLD = 2048; - function Connection(underlying) { - EventEmitter.call(this); - var stream = this.stream = wrapStream(underlying); - this.muxer = new Mux(stream); - this.rest = Buffer.alloc(0); - this.frameMax = constants.FRAME_MIN_SIZE; - this.sentSinceLastCheck = false; - this.recvSinceLastCheck = false; - this.expectSocketClose = false; - this.freeChannels = new BitSet(); - this.channels = [{ - channel: { accept: channel0(this) }, - buffer: underlying - }]; - } - inherits(Connection, EventEmitter); - var C = Connection.prototype; - function mainAccept(frame2) { - var rec = this.channels[frame2.channel]; - if (rec) { - return rec.channel.accept(frame2); - } else - this.closeWithError( - fmt("Frame on unknown channel %d", frame2.channel), - constants.CHANNEL_ERROR, - new Error(fmt( - "Frame on unknown channel: %s", - inspect(frame2, false) - )) - ); - } - function channel0(connection) { - return function(f) { - if (f === HEARTBEAT) - ; - else if (f.id === defs.ConnectionClose) { - connection.sendMethod(0, defs.ConnectionCloseOk, {}); - var emsg = fmt("Connection closed: %s", closeMsg(f)); - var s = stackCapture(emsg); - var e = new Error(emsg); - e.code = f.fields.replyCode; - if (isFatalError(e)) { - connection.emit("error", e); - } - connection.toClosed(s, e); - } else if (f.id === defs.ConnectionBlocked) { - connection.emit("blocked", f.fields.reason); - } else if (f.id === defs.ConnectionUnblocked) { - connection.emit("unblocked"); - } else { - connection.closeWithError( - fmt("Unexpected frame on channel 0"), - constants.UNEXPECTED_FRAME, - new Error(fmt( - "Unexpected frame on channel 0: %s", - inspect(f, false) - )) - ); - } - }; - } - C.sendProtocolHeader = function() { - this.sendBytes(frame.PROTOCOL_HEADER); - }; - C.open = function(allFields, openCallback0) { - var self2 = this; - var openCallback = openCallback0 || function() { - }; - var tunedOptions = Object.create(allFields); - function wait(k2) { - self2.step(function(err, frame2) { - if (err !== null) - bail(err); - else if (frame2.channel !== 0) { - bail(new Error( - fmt( - "Frame on channel != 0 during handshake: %s", - inspect(frame2, false) - ) - )); - } else - k2(frame2); - }); - } - function expect(Method, k2) { - wait(function(frame2) { - if (frame2.id === Method) - k2(frame2); - else { - bail(new Error( - fmt( - "Expected %s; got %s", - methodName(Method), - inspect(frame2, false) - ) - )); - } - }); - } - function bail(err) { - openCallback(err); - } - function send(Method) { - self2.sendMethod(0, Method, tunedOptions); - } - function negotiate(server2, desired) { - if (server2 === 0 || desired === 0) { - return Math.max(server2, desired); - } else { - return Math.min(server2, desired); - } - } - function onStart(start) { - var mechanisms = start.fields.mechanisms.toString().split(" "); - if (mechanisms.indexOf(allFields.mechanism) < 0) { - bail(new Error(fmt( - "SASL mechanism %s is not provided by the server", - allFields.mechanism - ))); - return; - } - self2.serverProperties = start.fields.serverProperties; - try { - send(defs.ConnectionStartOk); - } catch (err) { - bail(err); - return; - } - wait(afterStartOk); - } - function afterStartOk(reply) { - switch (reply.id) { - case defs.ConnectionSecure: - bail(new Error( - "Wasn't expecting to have to go through secure" - )); - break; - case defs.ConnectionClose: - bail(new Error(fmt( - "Handshake terminated by server: %s", - closeMsg(reply) - ))); - break; - case defs.ConnectionTune: - var fields = reply.fields; - tunedOptions.frameMax = negotiate(fields.frameMax, allFields.frameMax); - tunedOptions.channelMax = negotiate(fields.channelMax, allFields.channelMax); - tunedOptions.heartbeat = negotiate(fields.heartbeat, allFields.heartbeat); - try { - send(defs.ConnectionTuneOk); - send(defs.ConnectionOpen); - } catch (err) { - bail(err); - return; - } - expect(defs.ConnectionOpenOk, onOpenOk); - break; - default: - bail(new Error( - fmt( - "Expected connection.secure, connection.close, or connection.tune during handshake; got %s", - inspect(reply, false) - ) - )); - break; - } - } - function onOpenOk(openOk) { - self2.channelMax = tunedOptions.channelMax || 65535; - self2.frameMax = tunedOptions.frameMax || 4294967295; - self2.heartbeat = tunedOptions.heartbeat; - self2.heartbeater = self2.startHeartbeater(); - self2.accept = mainAccept; - succeed(openOk); - } - function endWhileOpening(err) { - bail(err || new Error("Socket closed abruptly during opening handshake")); - } - this.stream.on("end", endWhileOpening); - this.stream.on("error", endWhileOpening); - function succeed(ok) { - self2.stream.removeListener("end", endWhileOpening); - self2.stream.removeListener("error", endWhileOpening); - self2.stream.on("error", self2.onSocketError.bind(self2)); - self2.stream.on("end", self2.onSocketError.bind( - self2, - new Error("Unexpected close") - )); - self2.on("frameError", self2.onSocketError.bind(self2)); - self2.acceptLoop(); - openCallback(null, ok); - } - this.sendProtocolHeader(); - expect(defs.ConnectionStart, onStart); - }; - C.close = function(closeCallback) { - var k2 = closeCallback && function() { - closeCallback(null); - }; - this.closeBecause("Cheers, thanks", constants.REPLY_SUCCESS, k2); - }; - C.closeBecause = function(reason, code, k2) { - this.sendMethod(0, defs.ConnectionClose, { - replyText: reason, - replyCode: code, - methodId: 0, - classId: 0 - }); - var s = stackCapture("closeBecause called: " + reason); - this.toClosing(s, k2); - }; - C.closeWithError = function(reason, code, error2) { - this.emit("error", error2); - this.closeBecause(reason, code); - }; - C.onSocketError = function(err) { - if (!this.expectSocketClose) { - this.expectSocketClose = true; - this.emit("error", err); - var s = stackCapture("Socket error"); - this.toClosed(s, err); - } - }; - function invalidOp(msg2, stack) { - return function() { - throw new IllegalOperationError(msg2, stack); - }; - } - function invalidateSend(conn, msg2, stack) { - conn.sendMethod = conn.sendContent = conn.sendMessage = invalidOp(msg2, stack); - } - C.toClosing = function(capturedStack, k2) { - var send = this.sendMethod.bind(this); - this.accept = function(f) { - if (f.id === defs.ConnectionCloseOk) { - if (k2) - k2(); - var s = stackCapture("ConnectionCloseOk received"); - this.toClosed(s, void 0); - } else if (f.id === defs.ConnectionClose) { - send(0, defs.ConnectionCloseOk, {}); - } - }; - invalidateSend(this, "Connection closing", capturedStack); - }; - C._closeChannels = function(capturedStack) { - for (var i = 1; i < this.channels.length; i++) { - var ch = this.channels[i]; - if (ch !== null) { - ch.channel.toClosed(capturedStack); - } - } - }; - C.toClosed = function(capturedStack, maybeErr) { - this._closeChannels(capturedStack); - var info2 = fmt( - "Connection closed (%s)", - maybeErr ? maybeErr.toString() : "by client" - ); - invalidateSend(this, info2, capturedStack); - this.accept = invalidOp(info2, capturedStack); - this.close = function(cb) { - cb && cb(new IllegalOperationError(info2, capturedStack)); - }; - if (this.heartbeater) - this.heartbeater.clear(); - this.expectSocketClose = true; - this.stream.end(); - this.emit("close", maybeErr); - }; - C.startHeartbeater = function() { - if (this.heartbeat === 0) - return null; - else { - var self2 = this; - var hb = new Heart( - this.heartbeat, - this.checkSend.bind(this), - this.checkRecv.bind(this) - ); - hb.on("timeout", function() { - var hberr = new Error("Heartbeat timeout"); - self2.emit("error", hberr); - var s = stackCapture("Heartbeat timeout"); - self2.toClosed(s, hberr); - }); - hb.on("beat", function() { - self2.sendHeartbeat(); - }); - return hb; - } - }; - C.freshChannel = function(channel, options2) { - var next = this.freeChannels.nextClearBit(1); - if (next < 0 || next > this.channelMax) - throw new Error("No channels left to allocate"); - this.freeChannels.set(next); - var hwm = options2 && options2.highWaterMark || DEFAULT_WRITE_HWM; - var writeBuffer = new PassThrough({ - objectMode: true, - highWaterMark: hwm - }); - this.channels[next] = { channel, buffer: writeBuffer }; - writeBuffer.on("drain", function() { - channel.onBufferDrain(); - }); - this.muxer.pipeFrom(writeBuffer); - return next; - }; - C.releaseChannel = function(channel) { - this.freeChannels.clear(channel); - var buffer = this.channels[channel].buffer; - buffer.end(); - this.channels[channel] = null; - }; - C.acceptLoop = function() { - var self2 = this; - function go2() { - try { - var f; - while (f = self2.recvFrame()) - self2.accept(f); - } catch (e) { - self2.emit("frameError", e); - } - } - self2.stream.on("readable", go2); - go2(); - }; - C.step = function(cb) { - var self2 = this; - function recv() { - var f; - try { - f = self2.recvFrame(); - } catch (e) { - cb(e, null); - return; - } - if (f) - cb(null, f); - else - self2.stream.once("readable", recv); - } - recv(); - }; - C.checkSend = function() { - var check = this.sentSinceLastCheck; - this.sentSinceLastCheck = false; - return check; - }; - C.checkRecv = function() { - var check = this.recvSinceLastCheck; - this.recvSinceLastCheck = false; - return check; - }; - C.sendBytes = function(bytes) { - this.sentSinceLastCheck = true; - this.stream.write(bytes); - }; - C.sendHeartbeat = function() { - return this.sendBytes(frame.HEARTBEAT_BUF); - }; - var encodeMethod = defs.encodeMethod; - var encodeProperties = defs.encodeProperties; - C.sendMethod = function(channel, Method, fields) { - var frame2 = encodeMethod(Method, channel, fields); - this.sentSinceLastCheck = true; - var buffer = this.channels[channel].buffer; - return buffer.write(frame2); - }; - C.sendMessage = function(channel, Method, fields, Properties, props, content) { - if (!Buffer.isBuffer(content)) - throw new TypeError("content is not a buffer"); - var mframe = encodeMethod(Method, channel, fields); - var pframe = encodeProperties( - Properties, - channel, - content.length, - props - ); - var buffer = this.channels[channel].buffer; - this.sentSinceLastCheck = true; - var methodHeaderLen = mframe.length + pframe.length; - var bodyLen = content.length > 0 ? content.length + FRAME_OVERHEAD : 0; - var allLen = methodHeaderLen + bodyLen; - if (allLen < SINGLE_CHUNK_THRESHOLD) { - var all = Buffer.allocUnsafe(allLen); - var offset = mframe.copy(all, 0); - offset += pframe.copy(all, offset); - if (bodyLen > 0) - makeBodyFrame(channel, content).copy(all, offset); - return buffer.write(all); - } else { - if (methodHeaderLen < SINGLE_CHUNK_THRESHOLD) { - var both = Buffer.allocUnsafe(methodHeaderLen); - var offset = mframe.copy(both, 0); - pframe.copy(both, offset); - buffer.write(both); - } else { - buffer.write(mframe); - buffer.write(pframe); - } - return this.sendContent(channel, content); - } - }; - var FRAME_OVERHEAD = defs.FRAME_OVERHEAD; - var makeBodyFrame = frame.makeBodyFrame; - C.sendContent = function(channel, body) { - if (!Buffer.isBuffer(body)) { - throw new TypeError(fmt("Expected buffer; got %s", body)); - } - var writeResult = true; - var buffer = this.channels[channel].buffer; - var maxBody = this.frameMax - FRAME_OVERHEAD; - for (var offset = 0; offset < body.length; offset += maxBody) { - var end = offset + maxBody; - var slice = end > body.length ? body.slice(offset) : body.slice(offset, end); - var bodyFrame = makeBodyFrame(channel, slice); - writeResult = buffer.write(bodyFrame); - } - this.sentSinceLastCheck = true; - return writeResult; - }; - var parseFrame = frame.parseFrame; - var decodeFrame = frame.decodeFrame; - C.recvFrame = function() { - var frame2 = parseFrame(this.rest, this.frameMax); - if (!frame2) { - var incoming = this.stream.read(); - if (incoming === null) { - return false; - } else { - this.recvSinceLastCheck = true; - this.rest = Buffer.concat([this.rest, incoming]); - return this.recvFrame(); - } - } else { - this.rest = frame2.rest; - return decodeFrame(frame2); - } - }; - function wrapStream(s) { - if (s instanceof Duplex) - return s; - else { - var ws2 = new Duplex(); - ws2.wrap(s); - ws2._write = function(chunk, encoding, callback) { - return s.write(chunk, encoding, callback); - }; - return ws2; - } - } - function isFatalError(error2) { - switch (error2 && error2.code) { - case defs.constants.CONNECTION_FORCED: - case defs.constants.REPLY_SUCCESS: - return false; - default: - return true; - } - } - module2.exports.Connection = Connection; - module2.exports.isFatalError = isFatalError; - } -}); - -// node_modules/amqplib/lib/credentials.js -var require_credentials = __commonJS({ - "node_modules/amqplib/lib/credentials.js"(exports2, module2) { - var codec = require_codec(); - module2.exports.plain = function(user, passwd) { - return { - mechanism: "PLAIN", - response: function() { - return Buffer.from(["", user, passwd].join(String.fromCharCode(0))); - }, - username: user, - password: passwd - }; - }; - module2.exports.amqplain = function(user, passwd) { - return { - mechanism: "AMQPLAIN", - response: function() { - const buffer = Buffer.alloc(16384); - const size = codec.encodeTable(buffer, { LOGIN: user, PASSWORD: passwd }, 0); - return buffer.slice(4, size); - }, - username: user, - password: passwd - }; - }; - module2.exports.external = function() { - return { - mechanism: "EXTERNAL", - response: function() { - return Buffer.from(""); - } - }; - }; - } -}); - -// node_modules/amqplib/package.json -var require_package3 = __commonJS({ - "node_modules/amqplib/package.json"(exports2, module2) { - module2.exports = { - name: "amqplib", - homepage: "http://amqp-node.github.io/amqplib/", - main: "./channel_api.js", - version: "0.10.3", - description: "An AMQP 0-9-1 (e.g., RabbitMQ) library and client.", - repository: { - type: "git", - url: "https://github.com/amqp-node/amqplib.git" - }, - engines: { - node: ">=10" - }, - dependencies: { - "@acuminous/bitsyntax": "^0.1.2", - "buffer-more-ints": "~1.0.0", - "readable-stream": "1.x >=1.1.9", - "url-parse": "~1.5.10" - }, - devDependencies: { - claire: "0.4.1", - mocha: "^9.2.2", - nyc: "^15.1.0", - "uglify-js": "2.8.x" - }, - scripts: { - test: "make test", - prepare: "make" - }, - keywords: [ - "AMQP", - "AMQP 0-9-1", - "RabbitMQ" - ], - author: "Michael Bridgen ", - license: "MIT" - }; - } -}); - -// node_modules/amqplib/lib/connect.js -var require_connect = __commonJS({ - "node_modules/amqplib/lib/connect.js"(exports2, module2) { - "use strict"; - var URL2 = require_url_parse(); - var QS = require("querystring"); - var Connection = require_connection().Connection; - var fmt = require("util").format; - var credentials2 = require_credentials(); - function copyInto(obj, target) { - var keys = Object.keys(obj); - var i = keys.length; - while (i--) { - var k2 = keys[i]; - target[k2] = obj[k2]; - } - return target; - } - function clone(obj) { - return copyInto(obj, {}); - } - var CLIENT_PROPERTIES = { - "product": "amqplib", - "version": require_package3().version, - "platform": fmt("Node.JS %s", process.version), - "information": "http://squaremo.github.io/amqp.node", - "capabilities": { - "publisher_confirms": true, - "exchange_exchange_bindings": true, - "basic.nack": true, - "consumer_cancel_notify": true, - "connection.blocked": true, - "authentication_failure_close": true - } - }; - function openFrames(vhost, query, credentials3, extraClientProperties) { - if (!vhost) - vhost = "/"; - else - vhost = QS.unescape(vhost); - var query = query || {}; - function intOrDefault(val, def) { - return val === void 0 ? def : parseInt(val); - } - var clientProperties = Object.create(CLIENT_PROPERTIES); - return { - // start-ok - "clientProperties": copyInto(extraClientProperties, clientProperties), - "mechanism": credentials3.mechanism, - "response": credentials3.response(), - "locale": query.locale || "en_US", - // tune-ok - "channelMax": intOrDefault(query.channelMax, 0), - "frameMax": intOrDefault(query.frameMax, 4096), - "heartbeat": intOrDefault(query.heartbeat, 0), - // open - "virtualHost": vhost, - "capabilities": "", - "insist": 0 - }; - } - function credentialsFromUrl(parts) { - var user = "guest", passwd = "guest"; - if (parts.username != "" || parts.password != "") { - user = parts.username ? unescape(parts.username) : ""; - passwd = parts.password ? unescape(parts.password) : ""; - } - return credentials2.plain(user, passwd); - } - function connect(url, socketOptions, openCallback) { - var sockopts = clone(socketOptions || {}); - url = url || "amqp://localhost"; - var noDelay = !!sockopts.noDelay; - var timeout = sockopts.timeout; - var keepAlive = !!sockopts.keepAlive; - var keepAliveDelay = sockopts.keepAliveDelay || 0; - var extraClientProperties = sockopts.clientProperties || {}; - var protocol, fields; - if (typeof url === "object") { - protocol = (url.protocol || "amqp") + ":"; - sockopts.host = url.hostname; - sockopts.servername = sockopts.servername || url.hostname; - sockopts.port = url.port || (protocol === "amqp:" ? 5672 : 5671); - var user, pass; - if (url.username == void 0 && url.password == void 0) { - user = "guest"; - pass = "guest"; - } else { - user = url.username || ""; - pass = url.password || ""; - } - var config2 = { - locale: url.locale, - channelMax: url.channelMax, - frameMax: url.frameMax, - heartbeat: url.heartbeat - }; - fields = openFrames(url.vhost, config2, sockopts.credentials || credentials2.plain(user, pass), extraClientProperties); - } else { - var parts = URL2(url, true); - protocol = parts.protocol; - sockopts.host = parts.hostname; - sockopts.servername = sockopts.servername || parts.hostname; - sockopts.port = parseInt(parts.port) || (protocol === "amqp:" ? 5672 : 5671); - var vhost = parts.pathname ? parts.pathname.substr(1) : null; - fields = openFrames(vhost, parts.query, sockopts.credentials || credentialsFromUrl(parts), extraClientProperties); - } - var sockok = false; - var sock; - function onConnect() { - sockok = true; - sock.setNoDelay(noDelay); - if (keepAlive) - sock.setKeepAlive(keepAlive, keepAliveDelay); - var c = new Connection(sock); - c.open(fields, function(err, ok) { - if (timeout) - sock.setTimeout(0); - if (err === null) { - openCallback(null, c); - } else { - sock.end(); - sock.destroy(); - openCallback(err); - } - }); - } - if (protocol === "amqp:") { - sock = require("net").connect(sockopts, onConnect); - } else if (protocol === "amqps:") { - sock = require("tls").connect(sockopts, onConnect); - } else { - throw new Error("Expected amqp: or amqps: as the protocol; got " + protocol); - } - if (timeout) { - sock.setTimeout(timeout, function() { - sock.end(); - sock.destroy(); - openCallback(new Error("connect ETIMEDOUT")); - }); - } - sock.once("error", function(err) { - if (!sockok) - openCallback(err); - }); - } - module2.exports.connect = connect; - module2.exports.credentialsFromUrl = credentialsFromUrl; - } -}); - -// node_modules/amqplib/lib/channel.js -var require_channel2 = __commonJS({ - "node_modules/amqplib/lib/channel.js"(exports2, module2) { - "use strict"; - var defs = require_defs(); - var closeMsg = require_format().closeMessage; - var inspect = require_format().inspect; - var methodName = require_format().methodName; - var assert = require("assert"); - var inherits = require("util").inherits; - var EventEmitter = require("events").EventEmitter; - var fmt = require("util").format; - var IllegalOperationError = require_error2().IllegalOperationError; - var stackCapture = require_error2().stackCapture; - function Channel(connection) { - EventEmitter.call(this); - this.connection = connection; - this.reply = null; - this.pending = []; - this.lwm = 1; - this.unconfirmed = []; - this.on("ack", this.handleConfirm.bind(this, function(cb) { - if (cb) - cb(null); - })); - this.on("nack", this.handleConfirm.bind(this, function(cb) { - if (cb) - cb(new Error("message nacked")); - })); - this.on("close", function() { - var cb; - while (cb = this.unconfirmed.shift()) { - if (cb) - cb(new Error("channel closed")); - } - }); - this.handleMessage = acceptDeliveryOrReturn; - } - inherits(Channel, EventEmitter); - module2.exports.Channel = Channel; - module2.exports.acceptMessage = acceptMessage; - var C = Channel.prototype; - C.allocate = function() { - this.ch = this.connection.freshChannel(this); - return this; - }; - C.sendImmediately = function(method, fields) { - return this.connection.sendMethod(this.ch, method, fields); - }; - C.sendOrEnqueue = function(method, fields, reply) { - if (!this.reply) { - assert(this.pending.length === 0); - this.reply = reply; - this.sendImmediately(method, fields); - } else { - this.pending.push({ - method, - fields, - reply - }); - } - }; - C.sendMessage = function(fields, properties, content) { - return this.connection.sendMessage( - this.ch, - defs.BasicPublish, - fields, - defs.BasicProperties, - properties, - content - ); - }; - C._rpc = function(method, fields, expect, cb) { - var self2 = this; - function reply(err, f) { - if (err === null) { - if (f.id === expect) { - return cb(null, f); - } else { - var expectedName = methodName(expect); - var e = new Error(fmt( - "Expected %s; got %s", - expectedName, - inspect(f, false) - )); - self2.closeWithError( - f.id, - fmt( - "Expected %s; got %s", - expectedName, - methodName(f.id) - ), - defs.constants.UNEXPECTED_FRAME, - e - ); - return cb(e); - } - } else if (err instanceof Error) - return cb(err); - else { - var closeReason = (err.fields.classId << 16) + err.fields.methodId; - var e = method === closeReason ? fmt( - "Operation failed: %s; %s", - methodName(method), - closeMsg(err) - ) : fmt("Channel closed by server: %s", closeMsg(err)); - var closeFrameError = new Error(e); - closeFrameError.code = err.fields.replyCode; - closeFrameError.classId = err.fields.classId; - closeFrameError.methodId = err.fields.methodId; - return cb(closeFrameError); - } - } - this.sendOrEnqueue(method, fields, reply); - }; - function invalidOp(msg2, stack) { - return function() { - throw new IllegalOperationError(msg2, stack); - }; - } - function invalidateSend(ch, msg2, stack) { - ch.sendImmediately = ch.sendOrEnqueue = ch.sendMessage = invalidOp(msg2, stack); - } - C.toClosed = function(capturedStack) { - this._rejectPending(); - invalidateSend(this, "Channel closed", capturedStack); - this.accept = invalidOp("Channel closed", capturedStack); - this.connection.releaseChannel(this.ch); - this.emit("close"); - }; - C.toClosing = function(capturedStack, k2) { - var send = this.sendImmediately.bind(this); - invalidateSend(this, "Channel closing", capturedStack); - this.accept = function(f) { - if (f.id === defs.ChannelCloseOk) { - if (k2) - k2(); - var s = stackCapture("ChannelCloseOk frame received"); - this.toClosed(s); - } else if (f.id === defs.ChannelClose) { - send(defs.ChannelCloseOk, {}); - } - }; - }; - C._rejectPending = function() { - function rej(r) { - r(new Error("Channel ended, no reply will be forthcoming")); - } - if (this.reply !== null) - rej(this.reply); - this.reply = null; - var discard; - while (discard = this.pending.shift()) - rej(discard.reply); - this.pending = null; - }; - C.closeBecause = function(reason, code, k2) { - this.sendImmediately(defs.ChannelClose, { - replyText: reason, - replyCode: code, - methodId: 0, - classId: 0 - }); - var s = stackCapture("closeBecause called: " + reason); - this.toClosing(s, k2); - }; - C.closeWithError = function(id, reason, code, error2) { - var self2 = this; - this.closeBecause(reason, code, function() { - error2.code = code; - if (id) { - error2.classId = defs.info(id).classId; - error2.methodId = defs.info(id).methodId; - } - self2.emit("error", error2); - }); - }; - C.acceptMessageFrame = function(f) { - try { - this.handleMessage = this.handleMessage(f); - } catch (msg2) { - if (typeof msg2 === "string") { - this.closeWithError( - f.id, - msg2, - defs.constants.UNEXPECTED_FRAME, - new Error(msg2) - ); - } else if (msg2 instanceof Error) { - this.closeWithError( - f.id, - "Error while processing message", - defs.constants.INTERNAL_ERROR, - msg2 - ); - } else { - this.closeWithError( - f.id, - "Internal error while processing message", - defs.constants.INTERNAL_ERROR, - new Error(msg2.toString()) - ); - } - } - }; - function acceptDeliveryOrReturn(f) { - var event; - if (f.id === defs.BasicDeliver) - event = "delivery"; - else if (f.id === defs.BasicReturn) - event = "return"; - else - throw fmt( - "Expected BasicDeliver or BasicReturn; got %s", - inspect(f) - ); - var self2 = this; - var fields = f.fields; - return acceptMessage(function(message) { - message.fields = fields; - self2.emit(event, message); - }); - } - function acceptMessage(continuation) { - var totalSize = 0, remaining = 0; - var buffers = null; - var message = { - fields: null, - properties: null, - content: null - }; - return headers; - function headers(f) { - if (f.id === defs.BasicProperties) { - message.properties = f.fields; - totalSize = remaining = f.size; - if (totalSize === 0) { - message.content = Buffer.alloc(0); - continuation(message); - return acceptDeliveryOrReturn; - } else { - return content; - } - } else { - throw "Expected headers frame after delivery"; - } - } - function content(f) { - if (f.content) { - var size = f.content.length; - remaining -= size; - if (remaining === 0) { - if (buffers !== null) { - buffers.push(f.content); - message.content = Buffer.concat(buffers); - } else { - message.content = f.content; - } - continuation(message); - return acceptDeliveryOrReturn; - } else if (remaining < 0) { - throw fmt( - "Too much content sent! Expected %d bytes", - totalSize - ); - } else { - if (buffers !== null) - buffers.push(f.content); - else - buffers = [f.content]; - return content; - } - } else - throw "Expected content frame after headers"; - } - } - C.handleConfirm = function(handle, f) { - var tag = f.deliveryTag; - var multi = f.multiple; - if (multi) { - var confirmed = this.unconfirmed.splice(0, tag - this.lwm + 1); - this.lwm = tag + 1; - confirmed.forEach(handle); - } else { - var c; - if (tag === this.lwm) { - c = this.unconfirmed.shift(); - this.lwm++; - while (this.unconfirmed[0] === null) { - this.unconfirmed.shift(); - this.lwm++; - } - } else { - c = this.unconfirmed[tag - this.lwm]; - this.unconfirmed[tag - this.lwm] = null; - } - handle(c); - } - }; - C.pushConfirmCallback = function(cb) { - this.unconfirmed.push(cb || false); - }; - C.accept = function(f) { - switch (f.id) { - case void 0: - case defs.BasicDeliver: - case defs.BasicReturn: - case defs.BasicProperties: - return this.acceptMessageFrame(f); - case defs.BasicAck: - return this.emit("ack", f.fields); - case defs.BasicNack: - return this.emit("nack", f.fields); - case defs.BasicCancel: - return this.emit("cancel", f.fields); - case defs.ChannelClose: - if (this.reply) { - var reply = this.reply; - this.reply = null; - reply(f); - } - var emsg = "Channel closed by server: " + closeMsg(f); - this.sendImmediately(defs.ChannelCloseOk, {}); - var error2 = new Error(emsg); - error2.code = f.fields.replyCode; - error2.classId = f.fields.classId; - error2.methodId = f.fields.methodId; - this.emit("error", error2); - var s = stackCapture(emsg); - this.toClosed(s); - return; - case defs.BasicFlow: - return this.closeWithError( - f.id, - "Flow not implemented", - defs.constants.NOT_IMPLEMENTED, - new Error("Flow not implemented") - ); - default: - var reply = this.reply; - this.reply = null; - if (this.pending.length > 0) { - var send = this.pending.shift(); - this.reply = send.reply; - this.sendImmediately(send.method, send.fields); - } - return reply(null, f); - } - }; - C.onBufferDrain = function() { - this.emit("drain"); - }; - function BaseChannel(connection) { - Channel.call(this, connection); - this.consumers = /* @__PURE__ */ new Map(); - } - inherits(BaseChannel, Channel); - module2.exports.BaseChannel = BaseChannel; - BaseChannel.prototype.registerConsumer = function(tag, callback) { - this.consumers.set(tag, callback); - }; - BaseChannel.prototype.unregisterConsumer = function(tag) { - this.consumers.delete(tag); - }; - BaseChannel.prototype.dispatchMessage = function(fields, message) { - var consumerTag = fields.consumerTag; - var consumer = this.consumers.get(consumerTag); - if (consumer) { - return consumer(message); - } else { - throw new Error("Unknown consumer: " + consumerTag); - } - }; - BaseChannel.prototype.handleDelivery = function(message) { - return this.dispatchMessage(message.fields, message); - }; - BaseChannel.prototype.handleCancel = function(fields) { - var result = this.dispatchMessage(fields, null); - this.unregisterConsumer(fields.consumerTag); - return result; - }; - } -}); - -// node_modules/amqplib/lib/api_args.js -var require_api_args = __commonJS({ - "node_modules/amqplib/lib/api_args.js"(exports2, module2) { - "use strict"; - function setIfDefined(obj, prop, value) { - if (value != void 0) - obj[prop] = value; - } - var EMPTY_OPTIONS = Object.freeze({}); - var Args = {}; - Args.assertQueue = function(queue, options2) { - queue = queue || ""; - options2 = options2 || EMPTY_OPTIONS; - var argt = Object.create(options2.arguments || null); - setIfDefined(argt, "x-expires", options2.expires); - setIfDefined(argt, "x-message-ttl", options2.messageTtl); - setIfDefined( - argt, - "x-dead-letter-exchange", - options2.deadLetterExchange - ); - setIfDefined( - argt, - "x-dead-letter-routing-key", - options2.deadLetterRoutingKey - ); - setIfDefined(argt, "x-max-length", options2.maxLength); - setIfDefined(argt, "x-max-priority", options2.maxPriority); - setIfDefined(argt, "x-overflow", options2.overflow); - setIfDefined(argt, "x-queue-mode", options2.queueMode); - return { - queue, - exclusive: !!options2.exclusive, - durable: options2.durable === void 0 ? true : options2.durable, - autoDelete: !!options2.autoDelete, - arguments: argt, - passive: false, - // deprecated but we have to include it - ticket: 0, - nowait: false - }; - }; - Args.checkQueue = function(queue) { - return { - queue, - passive: true, - // switch to "completely different" mode - nowait: false, - durable: true, - autoDelete: false, - exclusive: false, - // ignored - ticket: 0 - }; - }; - Args.deleteQueue = function(queue, options2) { - options2 = options2 || EMPTY_OPTIONS; - return { - queue, - ifUnused: !!options2.ifUnused, - ifEmpty: !!options2.ifEmpty, - ticket: 0, - nowait: false - }; - }; - Args.purgeQueue = function(queue) { - return { - queue, - ticket: 0, - nowait: false - }; - }; - Args.bindQueue = function(queue, source, pattern, argt) { - return { - queue, - exchange: source, - routingKey: pattern, - arguments: argt, - ticket: 0, - nowait: false - }; - }; - Args.unbindQueue = function(queue, source, pattern, argt) { - return { - queue, - exchange: source, - routingKey: pattern, - arguments: argt, - ticket: 0, - nowait: false - }; - }; - Args.assertExchange = function(exchange, type, options2) { - options2 = options2 || EMPTY_OPTIONS; - var argt = Object.create(options2.arguments || null); - setIfDefined(argt, "alternate-exchange", options2.alternateExchange); - return { - exchange, - ticket: 0, - type, - passive: false, - durable: options2.durable === void 0 ? true : options2.durable, - autoDelete: !!options2.autoDelete, - internal: !!options2.internal, - nowait: false, - arguments: argt - }; - }; - Args.checkExchange = function(exchange) { - return { - exchange, - passive: true, - // switch to 'may as well be another method' mode - nowait: false, - // ff are ignored - durable: true, - internal: false, - type: "", - autoDelete: false, - ticket: 0 - }; - }; - Args.deleteExchange = function(exchange, options2) { - options2 = options2 || EMPTY_OPTIONS; - return { - exchange, - ifUnused: !!options2.ifUnused, - ticket: 0, - nowait: false - }; - }; - Args.bindExchange = function(dest, source, pattern, argt) { - return { - source, - destination: dest, - routingKey: pattern, - arguments: argt, - ticket: 0, - nowait: false - }; - }; - Args.unbindExchange = function(dest, source, pattern, argt) { - return { - source, - destination: dest, - routingKey: pattern, - arguments: argt, - ticket: 0, - nowait: false - }; - }; - Args.publish = function(exchange, routingKey, options2) { - options2 = options2 || EMPTY_OPTIONS; - function convertCC(cc2) { - if (cc2 === void 0) { - return void 0; - } else if (Array.isArray(cc2)) { - return cc2.map(String); - } else - return [String(cc2)]; - } - var headers = Object.create(options2.headers || null); - setIfDefined(headers, "CC", convertCC(options2.CC)); - setIfDefined(headers, "BCC", convertCC(options2.BCC)); - var deliveryMode; - if (options2.persistent !== void 0) - deliveryMode = options2.persistent ? 2 : 1; - else if (typeof options2.deliveryMode === "number") - deliveryMode = options2.deliveryMode; - else if (options2.deliveryMode) - deliveryMode = 2; - var expiration = options2.expiration; - if (expiration !== void 0) - expiration = expiration.toString(); - return { - // method fields - exchange, - routingKey, - mandatory: !!options2.mandatory, - immediate: false, - // RabbitMQ doesn't implement this any more - ticket: void 0, - // properties - contentType: options2.contentType, - contentEncoding: options2.contentEncoding, - headers, - deliveryMode, - priority: options2.priority, - correlationId: options2.correlationId, - replyTo: options2.replyTo, - expiration, - messageId: options2.messageId, - timestamp: options2.timestamp, - type: options2.type, - userId: options2.userId, - appId: options2.appId, - clusterId: void 0 - }; - }; - Args.consume = function(queue, options2) { - options2 = options2 || EMPTY_OPTIONS; - var argt = Object.create(options2.arguments || null); - setIfDefined(argt, "x-priority", options2.priority); - return { - ticket: 0, - queue, - consumerTag: options2.consumerTag || "", - noLocal: !!options2.noLocal, - noAck: !!options2.noAck, - exclusive: !!options2.exclusive, - nowait: false, - arguments: argt - }; - }; - Args.cancel = function(consumerTag) { - return { - consumerTag, - nowait: false - }; - }; - Args.get = function(queue, options2) { - options2 = options2 || EMPTY_OPTIONS; - return { - ticket: 0, - queue, - noAck: !!options2.noAck - }; - }; - Args.ack = function(tag, allUpTo) { - return { - deliveryTag: tag, - multiple: !!allUpTo - }; - }; - Args.nack = function(tag, allUpTo, requeue) { - return { - deliveryTag: tag, - multiple: !!allUpTo, - requeue: requeue === void 0 ? true : requeue - }; - }; - Args.reject = function(tag, requeue) { - return { - deliveryTag: tag, - requeue: requeue === void 0 ? true : requeue - }; - }; - Args.prefetch = function(count, global2) { - return { - prefetchCount: count || 0, - prefetchSize: 0, - global: !!global2 - }; - }; - Args.recover = function() { - return { requeue: true }; - }; - module2.exports = Object.freeze(Args); - } -}); - -// node_modules/amqplib/lib/channel_model.js -var require_channel_model = __commonJS({ - "node_modules/amqplib/lib/channel_model.js"(exports2, module2) { - "use strict"; - var EventEmitter = require("events"); - var promisify = require("util").promisify; - var defs = require_defs(); - var { BaseChannel } = require_channel2(); - var { acceptMessage } = require_channel2(); - var Args = require_api_args(); - var { inspect } = require_format(); - var ChannelModel = class extends EventEmitter { - constructor(connection) { - super(); - this.connection = connection; - ["error", "close", "blocked", "unblocked"].forEach((ev) => { - connection.on(ev, this.emit.bind(this, ev)); - }); - } - close() { - return promisify(this.connection.close.bind(this.connection))(); - } - async createChannel() { - const channel = new Channel(this.connection); - await channel.open(); - return channel; - } - async createConfirmChannel() { - const channel = new ConfirmChannel(this.connection); - await channel.open(); - await channel.rpc(defs.ConfirmSelect, { nowait: false }, defs.ConfirmSelectOk); - return channel; - } - }; - var Channel = class extends BaseChannel { - constructor(connection) { - super(connection); - this.on("delivery", this.handleDelivery.bind(this)); - this.on("cancel", this.handleCancel.bind(this)); - } - // An RPC that returns a 'proper' promise, which resolves to just the - // response's fields; this is intended to be suitable for implementing - // API procedures. - async rpc(method, fields, expect) { - const f = await promisify((cb) => { - return this._rpc(method, fields, expect, cb); - })(); - return f.fields; - } - // Do the remarkably simple channel open handshake - async open() { - const ch = await this.allocate.bind(this)(); - return ch.rpc( - defs.ChannelOpen, - { outOfBand: "" }, - defs.ChannelOpenOk - ); - } - close() { - return promisify((cb) => { - return this.closeBecause( - "Goodbye", - defs.constants.REPLY_SUCCESS, - cb - ); - })(); - } - // === Public API, declaring queues and stuff === - assertQueue(queue, options2) { - return this.rpc( - defs.QueueDeclare, - Args.assertQueue(queue, options2), - defs.QueueDeclareOk - ); - } - checkQueue(queue) { - return this.rpc( - defs.QueueDeclare, - Args.checkQueue(queue), - defs.QueueDeclareOk - ); - } - deleteQueue(queue, options2) { - return this.rpc( - defs.QueueDelete, - Args.deleteQueue(queue, options2), - defs.QueueDeleteOk - ); - } - purgeQueue(queue) { - return this.rpc( - defs.QueuePurge, - Args.purgeQueue(queue), - defs.QueuePurgeOk - ); - } - bindQueue(queue, source, pattern, argt) { - return this.rpc( - defs.QueueBind, - Args.bindQueue(queue, source, pattern, argt), - defs.QueueBindOk - ); - } - unbindQueue(queue, source, pattern, argt) { - return this.rpc( - defs.QueueUnbind, - Args.unbindQueue(queue, source, pattern, argt), - defs.QueueUnbindOk - ); - } - assertExchange(exchange, type, options2) { - return this.rpc( - defs.ExchangeDeclare, - Args.assertExchange(exchange, type, options2), - defs.ExchangeDeclareOk - ).then((_ok) => { - return { exchange }; - }); - } - checkExchange(exchange) { - return this.rpc( - defs.ExchangeDeclare, - Args.checkExchange(exchange), - defs.ExchangeDeclareOk - ); - } - deleteExchange(name, options2) { - return this.rpc( - defs.ExchangeDelete, - Args.deleteExchange(name, options2), - defs.ExchangeDeleteOk - ); - } - bindExchange(dest, source, pattern, argt) { - return this.rpc( - defs.ExchangeBind, - Args.bindExchange(dest, source, pattern, argt), - defs.ExchangeBindOk - ); - } - unbindExchange(dest, source, pattern, argt) { - return this.rpc( - defs.ExchangeUnbind, - Args.unbindExchange(dest, source, pattern, argt), - defs.ExchangeUnbindOk - ); - } - // Working with messages - publish(exchange, routingKey, content, options2) { - const fieldsAndProps = Args.publish(exchange, routingKey, options2); - return this.sendMessage(fieldsAndProps, fieldsAndProps, content); - } - sendToQueue(queue, content, options2) { - return this.publish("", queue, content, options2); - } - consume(queue, callback, options2) { - const fields = Args.consume(queue, options2); - return new Promise((resolve, reject) => { - this._rpc(defs.BasicConsume, fields, defs.BasicConsumeOk, (err, ok) => { - if (err) - return reject(err); - this.registerConsumer(ok.fields.consumerTag, callback); - resolve(ok.fields); - }); - }); - } - async cancel(consumerTag) { - const ok = await promisify((cb) => { - this._rpc( - defs.BasicCancel, - Args.cancel(consumerTag), - defs.BasicCancelOk, - cb - ); - })().then((ok2) => { - this.unregisterConsumer(consumerTag); - return ok2.fields; - }); - } - get(queue, options2) { - const fields = Args.get(queue, options2); - return new Promise((resolve, reject) => { - this.sendOrEnqueue(defs.BasicGet, fields, (err, f) => { - if (err) - return reject(err); - if (f.id === defs.BasicGetEmpty) { - return resolve(false); - } else if (f.id === defs.BasicGetOk) { - const fields2 = f.fields; - this.handleMessage = acceptMessage((m2) => { - m2.fields = fields2; - resolve(m2); - }); - } else { - reject(new Error(`Unexpected response to BasicGet: ${inspect(f)}`)); - } - }); - }); - } - ack(message, allUpTo) { - this.sendImmediately( - defs.BasicAck, - Args.ack(message.fields.deliveryTag, allUpTo) - ); - } - ackAll() { - this.sendImmediately(defs.BasicAck, Args.ack(0, true)); - } - nack(message, allUpTo, requeue) { - this.sendImmediately( - defs.BasicNack, - Args.nack(message.fields.deliveryTag, allUpTo, requeue) - ); - } - nackAll(requeue) { - this.sendImmediately( - defs.BasicNack, - Args.nack(0, true, requeue) - ); - } - // `Basic.Nack` is not available in older RabbitMQ versions (or in the - // AMQP specification), so you have to use the one-at-a-time - // `Basic.Reject`. This is otherwise synonymous with - // `#nack(message, false, requeue)`. - reject(message, requeue) { - this.sendImmediately( - defs.BasicReject, - Args.reject(message.fields.deliveryTag, requeue) - ); - } - recover() { - return this.rpc( - defs.BasicRecover, - Args.recover(), - defs.BasicRecoverOk - ); - } - qos(count, global2) { - return this.rpc( - defs.BasicQos, - Args.prefetch(count, global2), - defs.BasicQosOk - ); - } - }; - Channel.prototype.prefetch = Channel.prototype.qos; - var ConfirmChannel = class extends Channel { - publish(exchange, routingKey, content, options2, cb) { - this.pushConfirmCallback(cb); - return Channel.prototype.publish.call(this, exchange, routingKey, content, options2); - } - sendToQueue(queue, content, options2, cb) { - return this.publish("", queue, content, options2, cb); - } - waitForConfirms() { - const awaiting = []; - const unconfirmed = this.unconfirmed; - unconfirmed.forEach((val, index) => { - if (val !== null) { - const confirmed = new Promise((resolve, reject) => { - unconfirmed[index] = (err) => { - if (val) - val(err); - if (err === null) - resolve(); - else - reject(err); - }; - }); - awaiting.push(confirmed); - } - }); - if (!this.pending) { - var cb; - while (cb = this.unconfirmed.shift()) { - if (cb) - cb(new Error("channel closed")); - } - } - return Promise.all(awaiting); - } - }; - module2.exports.ConfirmChannel = ConfirmChannel; - module2.exports.Channel = Channel; - module2.exports.ChannelModel = ChannelModel; - } -}); - -// node_modules/amqplib/channel_api.js -var require_channel_api = __commonJS({ - "node_modules/amqplib/channel_api.js"(exports2, module2) { - var raw_connect = require_connect().connect; - var ChannelModel = require_channel_model().ChannelModel; - var promisify = require("util").promisify; - function connect(url, connOptions) { - return promisify(function(cb) { - return raw_connect(url, connOptions, cb); - })().then(function(conn) { - return new ChannelModel(conn); - }); - } - module2.exports.connect = connect; - module2.exports.credentials = require_credentials(); - module2.exports.IllegalOperationError = require_error2().IllegalOperationError; - } -}); - -// node_modules/tslib/tslib.es6.mjs -var tslib_es6_exports = {}; -__export(tslib_es6_exports, { - __addDisposableResource: () => __addDisposableResource, - __assign: () => __assign, - __asyncDelegator: () => __asyncDelegator, - __asyncGenerator: () => __asyncGenerator, - __asyncValues: () => __asyncValues, - __await: () => __await, - __awaiter: () => __awaiter, - __classPrivateFieldGet: () => __classPrivateFieldGet, - __classPrivateFieldIn: () => __classPrivateFieldIn, - __classPrivateFieldSet: () => __classPrivateFieldSet, - __createBinding: () => __createBinding, - __decorate: () => __decorate, - __disposeResources: () => __disposeResources, - __esDecorate: () => __esDecorate, - __exportStar: () => __exportStar, - __extends: () => __extends, - __generator: () => __generator, - __importDefault: () => __importDefault, - __importStar: () => __importStar, - __makeTemplateObject: () => __makeTemplateObject, - __metadata: () => __metadata, - __param: () => __param, - __propKey: () => __propKey, - __read: () => __read, - __rest: () => __rest, - __runInitializers: () => __runInitializers, - __setFunctionName: () => __setFunctionName, - __spread: () => __spread, - __spreadArray: () => __spreadArray, - __spreadArrays: () => __spreadArrays, - __values: () => __values, - default: () => tslib_es6_default -}); -function __extends(d, b) { - if (typeof b !== "function" && b !== null) - throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); - extendStatics(d, b); - function __() { - this.constructor = d; - } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); -} -function __rest(s, e) { - var t = {}; - for (var p in s) - if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) - t[p] = s[p]; - if (s != null && typeof Object.getOwnPropertySymbols === "function") - for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { - if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) - t[p[i]] = s[p[i]]; - } - return t; -} -function __decorate(decorators, target, key, desc) { - var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; - if (typeof Reflect === "object" && typeof Reflect.decorate === "function") - r = Reflect.decorate(decorators, target, key, desc); - else - for (var i = decorators.length - 1; i >= 0; i--) - if (d = decorators[i]) - r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; - return c > 3 && r && Object.defineProperty(target, key, r), r; -} -function __param(paramIndex, decorator) { - return function(target, key) { - decorator(target, key, paramIndex); - }; -} -function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) { - function accept(f) { - if (f !== void 0 && typeof f !== "function") - throw new TypeError("Function expected"); - return f; - } - var kind = contextIn.kind, key = kind === "getter" ? "get" : kind === "setter" ? "set" : "value"; - var target = !descriptorIn && ctor ? contextIn["static"] ? ctor : ctor.prototype : null; - var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {}); - var _2, done = false; - for (var i = decorators.length - 1; i >= 0; i--) { - var context = {}; - for (var p in contextIn) - context[p] = p === "access" ? {} : contextIn[p]; - for (var p in contextIn.access) - context.access[p] = contextIn.access[p]; - context.addInitializer = function(f) { - if (done) - throw new TypeError("Cannot add initializers after decoration has completed"); - extraInitializers.push(accept(f || null)); - }; - var result = (0, decorators[i])(kind === "accessor" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context); - if (kind === "accessor") { - if (result === void 0) - continue; - if (result === null || typeof result !== "object") - throw new TypeError("Object expected"); - if (_2 = accept(result.get)) - descriptor.get = _2; - if (_2 = accept(result.set)) - descriptor.set = _2; - if (_2 = accept(result.init)) - initializers.unshift(_2); - } else if (_2 = accept(result)) { - if (kind === "field") - initializers.unshift(_2); - else - descriptor[key] = _2; - } - } - if (target) - Object.defineProperty(target, contextIn.name, descriptor); - done = true; -} -function __runInitializers(thisArg, initializers, value) { - var useValue = arguments.length > 2; - for (var i = 0; i < initializers.length; i++) { - value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg); - } - return useValue ? value : void 0; -} -function __propKey(x) { - return typeof x === "symbol" ? x : "".concat(x); -} -function __setFunctionName(f, name, prefix) { - if (typeof name === "symbol") - name = name.description ? "[".concat(name.description, "]") : ""; - return Object.defineProperty(f, "name", { configurable: true, value: prefix ? "".concat(prefix, " ", name) : name }); -} -function __metadata(metadataKey, metadataValue) { - if (typeof Reflect === "object" && typeof Reflect.metadata === "function") - return Reflect.metadata(metadataKey, metadataValue); -} -function __awaiter(thisArg, _arguments, P2, generator) { - function adopt(value) { - return value instanceof P2 ? value : new P2(function(resolve) { - resolve(value); - }); - } - return new (P2 || (P2 = Promise))(function(resolve, reject) { - function fulfilled(value) { - try { - step(generator.next(value)); - } catch (e) { - reject(e); - } - } - function rejected(value) { - try { - step(generator["throw"](value)); - } catch (e) { - reject(e); - } - } - function step(result) { - result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); - } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -} -function __generator(thisArg, body) { - var _2 = { label: 0, sent: function() { - if (t[0] & 1) - throw t[1]; - return t[1]; - }, trys: [], ops: [] }, f, y, t, g; - return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { - return this; - }), g; - function verb(n) { - return function(v) { - return step([n, v]); - }; - } - function step(op2) { - if (f) - throw new TypeError("Generator is already executing."); - while (g && (g = 0, op2[0] && (_2 = 0)), _2) - try { - if (f = 1, y && (t = op2[0] & 2 ? y["return"] : op2[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op2[1])).done) - return t; - if (y = 0, t) - op2 = [op2[0] & 2, t.value]; - switch (op2[0]) { - case 0: - case 1: - t = op2; - break; - case 4: - _2.label++; - return { value: op2[1], done: false }; - case 5: - _2.label++; - y = op2[1]; - op2 = [0]; - continue; - case 7: - op2 = _2.ops.pop(); - _2.trys.pop(); - continue; - default: - if (!(t = _2.trys, t = t.length > 0 && t[t.length - 1]) && (op2[0] === 6 || op2[0] === 2)) { - _2 = 0; - continue; - } - if (op2[0] === 3 && (!t || op2[1] > t[0] && op2[1] < t[3])) { - _2.label = op2[1]; - break; - } - if (op2[0] === 6 && _2.label < t[1]) { - _2.label = t[1]; - t = op2; - break; - } - if (t && _2.label < t[2]) { - _2.label = t[2]; - _2.ops.push(op2); - break; - } - if (t[2]) - _2.ops.pop(); - _2.trys.pop(); - continue; - } - op2 = body.call(thisArg, _2); - } catch (e) { - op2 = [6, e]; - y = 0; - } finally { - f = t = 0; - } - if (op2[0] & 5) - throw op2[1]; - return { value: op2[0] ? op2[1] : void 0, done: true }; - } -} -function __exportStar(m2, o) { - for (var p in m2) - if (p !== "default" && !Object.prototype.hasOwnProperty.call(o, p)) - __createBinding(o, m2, p); -} -function __values(o) { - var s = typeof Symbol === "function" && Symbol.iterator, m2 = s && o[s], i = 0; - if (m2) - return m2.call(o); - if (o && typeof o.length === "number") - return { - next: function() { - if (o && i >= o.length) - o = void 0; - return { value: o && o[i++], done: !o }; - } - }; - throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined."); -} -function __read(o, n) { - var m2 = typeof Symbol === "function" && o[Symbol.iterator]; - if (!m2) - return o; - var i = m2.call(o), r, ar2 = [], e; - try { - while ((n === void 0 || n-- > 0) && !(r = i.next()).done) - ar2.push(r.value); - } catch (error2) { - e = { error: error2 }; - } finally { - try { - if (r && !r.done && (m2 = i["return"])) - m2.call(i); - } finally { - if (e) - throw e.error; - } - } - return ar2; -} -function __spread() { - for (var ar2 = [], i = 0; i < arguments.length; i++) - ar2 = ar2.concat(__read(arguments[i])); - return ar2; -} -function __spreadArrays() { - for (var s = 0, i = 0, il = arguments.length; i < il; i++) - s += arguments[i].length; - for (var r = Array(s), k2 = 0, i = 0; i < il; i++) - for (var a = arguments[i], j2 = 0, jl = a.length; j2 < jl; j2++, k2++) - r[k2] = a[j2]; - return r; -} -function __spreadArray(to2, from, pack) { - if (pack || arguments.length === 2) - for (var i = 0, l = from.length, ar2; i < l; i++) { - if (ar2 || !(i in from)) { - if (!ar2) - ar2 = Array.prototype.slice.call(from, 0, i); - ar2[i] = from[i]; - } - } - return to2.concat(ar2 || Array.prototype.slice.call(from)); -} -function __await(v) { - return this instanceof __await ? (this.v = v, this) : new __await(v); -} -function __asyncGenerator(thisArg, _arguments, generator) { - if (!Symbol.asyncIterator) - throw new TypeError("Symbol.asyncIterator is not defined."); - var g = generator.apply(thisArg, _arguments || []), i, q = []; - return i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function() { - return this; - }, i; - function verb(n) { - if (g[n]) - i[n] = function(v) { - return new Promise(function(a, b) { - q.push([n, v, a, b]) > 1 || resume(n, v); - }); - }; - } - function resume(n, v) { - try { - step(g[n](v)); - } catch (e) { - settle(q[0][3], e); - } - } - function step(r) { - r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); - } - function fulfill(value) { - resume("next", value); - } - function reject(value) { - resume("throw", value); - } - function settle(f, v) { - if (f(v), q.shift(), q.length) - resume(q[0][0], q[0][1]); - } -} -function __asyncDelegator(o) { - var i, p; - return i = {}, verb("next"), verb("throw", function(e) { - throw e; - }), verb("return"), i[Symbol.iterator] = function() { - return this; - }, i; - function verb(n, f) { - i[n] = o[n] ? function(v) { - return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; - } : f; - } -} -function __asyncValues(o) { - if (!Symbol.asyncIterator) - throw new TypeError("Symbol.asyncIterator is not defined."); - var m2 = o[Symbol.asyncIterator], i; - return m2 ? m2.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function() { - return this; - }, i); - function verb(n) { - i[n] = o[n] && function(v) { - return new Promise(function(resolve, reject) { - v = o[n](v), settle(resolve, reject, v.done, v.value); - }); - }; - } - function settle(resolve, reject, d, v) { - Promise.resolve(v).then(function(v2) { - resolve({ value: v2, done: d }); - }, reject); - } -} -function __makeTemplateObject(cooked, raw2) { - if (Object.defineProperty) { - Object.defineProperty(cooked, "raw", { value: raw2 }); - } else { - cooked.raw = raw2; - } - return cooked; -} -function __importStar(mod2) { - if (mod2 && mod2.__esModule) - return mod2; - var result = {}; - if (mod2 != null) { - for (var k2 in mod2) - if (k2 !== "default" && Object.prototype.hasOwnProperty.call(mod2, k2)) - __createBinding(result, mod2, k2); - } - __setModuleDefault(result, mod2); - return result; -} -function __importDefault(mod2) { - return mod2 && mod2.__esModule ? mod2 : { default: mod2 }; -} -function __classPrivateFieldGet(receiver, state, kind, f) { - if (kind === "a" && !f) - throw new TypeError("Private accessor was defined without a getter"); - if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) - throw new TypeError("Cannot read private member from an object whose class did not declare it"); - return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver); -} -function __classPrivateFieldSet(receiver, state, value, kind, f) { - if (kind === "m") - throw new TypeError("Private method is not writable"); - if (kind === "a" && !f) - throw new TypeError("Private accessor was defined without a setter"); - if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) - throw new TypeError("Cannot write private member to an object whose class did not declare it"); - return kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value), value; -} -function __classPrivateFieldIn(state, receiver) { - if (receiver === null || typeof receiver !== "object" && typeof receiver !== "function") - throw new TypeError("Cannot use 'in' operator on non-object"); - return typeof state === "function" ? receiver === state : state.has(receiver); -} -function __addDisposableResource(env, value, async) { - if (value !== null && value !== void 0) { - if (typeof value !== "object" && typeof value !== "function") - throw new TypeError("Object expected."); - var dispose; - if (async) { - if (!Symbol.asyncDispose) - throw new TypeError("Symbol.asyncDispose is not defined."); - dispose = value[Symbol.asyncDispose]; - } - if (dispose === void 0) { - if (!Symbol.dispose) - throw new TypeError("Symbol.dispose is not defined."); - dispose = value[Symbol.dispose]; - } - if (typeof dispose !== "function") - throw new TypeError("Object not disposable."); - env.stack.push({ value, dispose, async }); - } else if (async) { - env.stack.push({ async: true }); - } - return value; -} -function __disposeResources(env) { - function fail(e) { - env.error = env.hasError ? new _SuppressedError(e, env.error, "An error was suppressed during disposal.") : e; - env.hasError = true; - } - function next() { - while (env.stack.length) { - var rec = env.stack.pop(); - try { - var result = rec.dispose && rec.dispose.call(rec.value); - if (rec.async) - return Promise.resolve(result).then(next, function(e) { - fail(e); - return next(); - }); - } catch (e) { - fail(e); - } - } - if (env.hasError) - throw env.error; - } - return next(); -} -var extendStatics, __assign, __createBinding, __setModuleDefault, _SuppressedError, tslib_es6_default; -var init_tslib_es6 = __esm({ - "node_modules/tslib/tslib.es6.mjs"() { - extendStatics = function(d, b) { - extendStatics = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function(d2, b2) { - d2.__proto__ = b2; - } || function(d2, b2) { - for (var p in b2) - if (Object.prototype.hasOwnProperty.call(b2, p)) - d2[p] = b2[p]; - }; - return extendStatics(d, b); - }; - __assign = function() { - __assign = Object.assign || function __assign2(t) { - for (var s, i = 1, n = arguments.length; i < n; i++) { - s = arguments[i]; - for (var p in s) - if (Object.prototype.hasOwnProperty.call(s, p)) - t[p] = s[p]; - } - return t; - }; - return __assign.apply(this, arguments); - }; - __createBinding = Object.create ? function(o, m2, k2, k22) { - if (k22 === void 0) - k22 = k2; - var desc = Object.getOwnPropertyDescriptor(m2, k2); - if (!desc || ("get" in desc ? !m2.__esModule : desc.writable || desc.configurable)) { - desc = { enumerable: true, get: function() { - return m2[k2]; - } }; - } - Object.defineProperty(o, k22, desc); - } : function(o, m2, k2, k22) { - if (k22 === void 0) - k22 = k2; - o[k22] = m2[k2]; - }; - __setModuleDefault = Object.create ? function(o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); - } : function(o, v) { - o["default"] = v; - }; - _SuppressedError = typeof SuppressedError === "function" ? SuppressedError : function(error2, suppressed, message) { - var e = new Error(message); - return e.name = "SuppressedError", e.error = error2, e.suppressed = suppressed, e; - }; - tslib_es6_default = { - __extends, - __assign, - __rest, - __decorate, - __param, - __metadata, - __awaiter, - __generator, - __createBinding, - __exportStar, - __values, - __read, - __spread, - __spreadArrays, - __spreadArray, - __await, - __asyncGenerator, - __asyncDelegator, - __asyncValues, - __makeTemplateObject, - __importStar, - __importDefault, - __classPrivateFieldGet, - __classPrivateFieldSet, - __classPrivateFieldIn, - __addDisposableResource, - __disposeResources - }; - } -}); - -// node_modules/undici/lib/core/symbols.js -var require_symbols = __commonJS({ - "node_modules/undici/lib/core/symbols.js"(exports2, module2) { - module2.exports = { - kClose: Symbol("close"), - kDestroy: Symbol("destroy"), - kDispatch: Symbol("dispatch"), - kUrl: Symbol("url"), - kWriting: Symbol("writing"), - kResuming: Symbol("resuming"), - kQueue: Symbol("queue"), - kConnect: Symbol("connect"), - kConnecting: Symbol("connecting"), - kHeadersList: Symbol("headers list"), - kKeepAliveDefaultTimeout: Symbol("default keep alive timeout"), - kKeepAliveMaxTimeout: Symbol("max keep alive timeout"), - kKeepAliveTimeoutThreshold: Symbol("keep alive timeout threshold"), - kKeepAliveTimeoutValue: Symbol("keep alive timeout"), - kKeepAlive: Symbol("keep alive"), - kHeadersTimeout: Symbol("headers timeout"), - kBodyTimeout: Symbol("body timeout"), - kServerName: Symbol("server name"), - kLocalAddress: Symbol("local address"), - kHost: Symbol("host"), - kNoRef: Symbol("no ref"), - kBodyUsed: Symbol("used"), - kRunning: Symbol("running"), - kBlocking: Symbol("blocking"), - kPending: Symbol("pending"), - kSize: Symbol("size"), - kBusy: Symbol("busy"), - kQueued: Symbol("queued"), - kFree: Symbol("free"), - kConnected: Symbol("connected"), - kClosed: Symbol("closed"), - kNeedDrain: Symbol("need drain"), - kReset: Symbol("reset"), - kDestroyed: Symbol.for("nodejs.stream.destroyed"), - kMaxHeadersSize: Symbol("max headers size"), - kRunningIdx: Symbol("running index"), - kPendingIdx: Symbol("pending index"), - kError: Symbol("error"), - kClients: Symbol("clients"), - kClient: Symbol("client"), - kParser: Symbol("parser"), - kOnDestroyed: Symbol("destroy callbacks"), - kPipelining: Symbol("pipelining"), - kSocket: Symbol("socket"), - kHostHeader: Symbol("host header"), - kConnector: Symbol("connector"), - kStrictContentLength: Symbol("strict content length"), - kMaxRedirections: Symbol("maxRedirections"), - kMaxRequests: Symbol("maxRequestsPerClient"), - kProxy: Symbol("proxy agent options"), - kCounter: Symbol("socket request counter"), - kInterceptors: Symbol("dispatch interceptors"), - kMaxResponseSize: Symbol("max response size") - }; - } -}); - -// node_modules/undici/lib/core/errors.js -var require_errors = __commonJS({ - "node_modules/undici/lib/core/errors.js"(exports2, module2) { - "use strict"; - var UndiciError = class extends Error { - constructor(message) { - super(message); - this.name = "UndiciError"; - this.code = "UND_ERR"; - } - }; - var ConnectTimeoutError = class _ConnectTimeoutError extends UndiciError { - constructor(message) { - super(message); - Error.captureStackTrace(this, _ConnectTimeoutError); - this.name = "ConnectTimeoutError"; - this.message = message || "Connect Timeout Error"; - this.code = "UND_ERR_CONNECT_TIMEOUT"; - } - }; - var HeadersTimeoutError = class _HeadersTimeoutError extends UndiciError { - constructor(message) { - super(message); - Error.captureStackTrace(this, _HeadersTimeoutError); - this.name = "HeadersTimeoutError"; - this.message = message || "Headers Timeout Error"; - this.code = "UND_ERR_HEADERS_TIMEOUT"; - } - }; - var HeadersOverflowError = class _HeadersOverflowError extends UndiciError { - constructor(message) { - super(message); - Error.captureStackTrace(this, _HeadersOverflowError); - this.name = "HeadersOverflowError"; - this.message = message || "Headers Overflow Error"; - this.code = "UND_ERR_HEADERS_OVERFLOW"; - } - }; - var BodyTimeoutError = class _BodyTimeoutError extends UndiciError { - constructor(message) { - super(message); - Error.captureStackTrace(this, _BodyTimeoutError); - this.name = "BodyTimeoutError"; - this.message = message || "Body Timeout Error"; - this.code = "UND_ERR_BODY_TIMEOUT"; - } - }; - var ResponseStatusCodeError = class _ResponseStatusCodeError extends UndiciError { - constructor(message, statusCode, headers, body) { - super(message); - Error.captureStackTrace(this, _ResponseStatusCodeError); - this.name = "ResponseStatusCodeError"; - this.message = message || "Response Status Code Error"; - this.code = "UND_ERR_RESPONSE_STATUS_CODE"; - this.body = body; - this.status = statusCode; - this.statusCode = statusCode; - this.headers = headers; - } - }; - var InvalidArgumentError = class _InvalidArgumentError extends UndiciError { - constructor(message) { - super(message); - Error.captureStackTrace(this, _InvalidArgumentError); - this.name = "InvalidArgumentError"; - this.message = message || "Invalid Argument Error"; - this.code = "UND_ERR_INVALID_ARG"; - } - }; - var InvalidReturnValueError = class _InvalidReturnValueError extends UndiciError { - constructor(message) { - super(message); - Error.captureStackTrace(this, _InvalidReturnValueError); - this.name = "InvalidReturnValueError"; - this.message = message || "Invalid Return Value Error"; - this.code = "UND_ERR_INVALID_RETURN_VALUE"; - } - }; - var RequestAbortedError = class _RequestAbortedError extends UndiciError { - constructor(message) { - super(message); - Error.captureStackTrace(this, _RequestAbortedError); - this.name = "AbortError"; - this.message = message || "Request aborted"; - this.code = "UND_ERR_ABORTED"; - } - }; - var InformationalError = class _InformationalError extends UndiciError { - constructor(message) { - super(message); - Error.captureStackTrace(this, _InformationalError); - this.name = "InformationalError"; - this.message = message || "Request information"; - this.code = "UND_ERR_INFO"; - } - }; - var RequestContentLengthMismatchError = class _RequestContentLengthMismatchError extends UndiciError { - constructor(message) { - super(message); - Error.captureStackTrace(this, _RequestContentLengthMismatchError); - this.name = "RequestContentLengthMismatchError"; - this.message = message || "Request body length does not match content-length header"; - this.code = "UND_ERR_REQ_CONTENT_LENGTH_MISMATCH"; - } - }; - var ResponseContentLengthMismatchError = class _ResponseContentLengthMismatchError extends UndiciError { - constructor(message) { - super(message); - Error.captureStackTrace(this, _ResponseContentLengthMismatchError); - this.name = "ResponseContentLengthMismatchError"; - this.message = message || "Response body length does not match content-length header"; - this.code = "UND_ERR_RES_CONTENT_LENGTH_MISMATCH"; - } - }; - var ClientDestroyedError = class _ClientDestroyedError extends UndiciError { - constructor(message) { - super(message); - Error.captureStackTrace(this, _ClientDestroyedError); - this.name = "ClientDestroyedError"; - this.message = message || "The client is destroyed"; - this.code = "UND_ERR_DESTROYED"; - } - }; - var ClientClosedError = class _ClientClosedError extends UndiciError { - constructor(message) { - super(message); - Error.captureStackTrace(this, _ClientClosedError); - this.name = "ClientClosedError"; - this.message = message || "The client is closed"; - this.code = "UND_ERR_CLOSED"; - } - }; - var SocketError = class _SocketError extends UndiciError { - constructor(message, socket) { - super(message); - Error.captureStackTrace(this, _SocketError); - this.name = "SocketError"; - this.message = message || "Socket error"; - this.code = "UND_ERR_SOCKET"; - this.socket = socket; - } - }; - var NotSupportedError = class _NotSupportedError extends UndiciError { - constructor(message) { - super(message); - Error.captureStackTrace(this, _NotSupportedError); - this.name = "NotSupportedError"; - this.message = message || "Not supported error"; - this.code = "UND_ERR_NOT_SUPPORTED"; - } - }; - var BalancedPoolMissingUpstreamError = class extends UndiciError { - constructor(message) { - super(message); - Error.captureStackTrace(this, NotSupportedError); - this.name = "MissingUpstreamError"; - this.message = message || "No upstream has been added to the BalancedPool"; - this.code = "UND_ERR_BPL_MISSING_UPSTREAM"; - } - }; - var HTTPParserError = class _HTTPParserError extends Error { - constructor(message, code, data) { - super(message); - Error.captureStackTrace(this, _HTTPParserError); - this.name = "HTTPParserError"; - this.code = code ? `HPE_${code}` : void 0; - this.data = data ? data.toString() : void 0; - } - }; - var ResponseExceededMaxSizeError = class _ResponseExceededMaxSizeError extends UndiciError { - constructor(message) { - super(message); - Error.captureStackTrace(this, _ResponseExceededMaxSizeError); - this.name = "ResponseExceededMaxSizeError"; - this.message = message || "Response content exceeded max size"; - this.code = "UND_ERR_RES_EXCEEDED_MAX_SIZE"; - } - }; - module2.exports = { - HTTPParserError, - UndiciError, - HeadersTimeoutError, - HeadersOverflowError, - BodyTimeoutError, - RequestContentLengthMismatchError, - ConnectTimeoutError, - ResponseStatusCodeError, - InvalidArgumentError, - InvalidReturnValueError, - RequestAbortedError, - ClientDestroyedError, - ClientClosedError, - InformationalError, - SocketError, - NotSupportedError, - ResponseContentLengthMismatchError, - BalancedPoolMissingUpstreamError, - ResponseExceededMaxSizeError - }; - } -}); - -// node_modules/undici/lib/core/util.js -var require_util4 = __commonJS({ - "node_modules/undici/lib/core/util.js"(exports2, module2) { - "use strict"; - var assert = require("assert"); - var { kDestroyed, kBodyUsed } = require_symbols(); - var { IncomingMessage } = require("http"); - var stream = require("stream"); - var net = require("net"); - var { InvalidArgumentError } = require_errors(); - var { Blob: Blob2 } = require("buffer"); - var nodeUtil = require("util"); - var { stringify } = require("querystring"); - var [nodeMajor, nodeMinor] = process.versions.node.split(".").map((v) => Number(v)); - function nop() { - } - function isStream(obj) { - return obj && typeof obj === "object" && typeof obj.pipe === "function" && typeof obj.on === "function"; - } - function isBlobLike(object) { - return Blob2 && object instanceof Blob2 || object && typeof object === "object" && (typeof object.stream === "function" || typeof object.arrayBuffer === "function") && /^(Blob|File)$/.test(object[Symbol.toStringTag]); - } - function buildURL(url, queryParams) { - if (url.includes("?") || url.includes("#")) { - throw new Error('Query params cannot be passed when url already contains "?" or "#".'); - } - const stringified = stringify(queryParams); - if (stringified) { - url += "?" + stringified; - } - return url; - } - function parseURL(url) { - if (typeof url === "string") { - url = new URL(url); - if (!/^https?:/.test(url.origin || url.protocol)) { - throw new InvalidArgumentError("Invalid URL protocol: the URL must start with `http:` or `https:`."); - } - return url; - } - if (!url || typeof url !== "object") { - throw new InvalidArgumentError("Invalid URL: The URL argument must be a non-null object."); - } - if (url.port != null && url.port !== "" && !Number.isFinite(parseInt(url.port))) { - throw new InvalidArgumentError("Invalid URL: port must be a valid integer or a string representation of an integer."); - } - if (url.path != null && typeof url.path !== "string") { - throw new InvalidArgumentError("Invalid URL path: the path must be a string or null/undefined."); - } - if (url.pathname != null && typeof url.pathname !== "string") { - throw new InvalidArgumentError("Invalid URL pathname: the pathname must be a string or null/undefined."); - } - if (url.hostname != null && typeof url.hostname !== "string") { - throw new InvalidArgumentError("Invalid URL hostname: the hostname must be a string or null/undefined."); - } - if (url.origin != null && typeof url.origin !== "string") { - throw new InvalidArgumentError("Invalid URL origin: the origin must be a string or null/undefined."); - } - if (!/^https?:/.test(url.origin || url.protocol)) { - throw new InvalidArgumentError("Invalid URL protocol: the URL must start with `http:` or `https:`."); - } - if (!(url instanceof URL)) { - const port = url.port != null ? url.port : url.protocol === "https:" ? 443 : 80; - let origin = url.origin != null ? url.origin : `${url.protocol}//${url.hostname}:${port}`; - let path = url.path != null ? url.path : `${url.pathname || ""}${url.search || ""}`; - if (origin.endsWith("/")) { - origin = origin.substring(0, origin.length - 1); - } - if (path && !path.startsWith("/")) { - path = `/${path}`; - } - url = new URL(origin + path); - } - return url; - } - function parseOrigin(url) { - url = parseURL(url); - if (url.pathname !== "/" || url.search || url.hash) { - throw new InvalidArgumentError("invalid url"); - } - return url; - } - function getHostname(host) { - if (host[0] === "[") { - const idx2 = host.indexOf("]"); - assert(idx2 !== -1); - return host.substr(1, idx2 - 1); - } - const idx = host.indexOf(":"); - if (idx === -1) - return host; - return host.substr(0, idx); - } - function getServerName(host) { - if (!host) { - return null; - } - assert.strictEqual(typeof host, "string"); - const servername = getHostname(host); - if (net.isIP(servername)) { - return ""; - } - return servername; - } - function deepClone(obj) { - return JSON.parse(JSON.stringify(obj)); - } - function isAsyncIterable(obj) { - return !!(obj != null && typeof obj[Symbol.asyncIterator] === "function"); - } - function isIterable(obj) { - return !!(obj != null && (typeof obj[Symbol.iterator] === "function" || typeof obj[Symbol.asyncIterator] === "function")); - } - function bodyLength(body) { - if (body == null) { - return 0; - } else if (isStream(body)) { - const state = body._readableState; - return state && state.ended === true && Number.isFinite(state.length) ? state.length : null; - } else if (isBlobLike(body)) { - return body.size != null ? body.size : null; - } else if (isBuffer(body)) { - return body.byteLength; - } - return null; - } - function isDestroyed(stream2) { - return !stream2 || !!(stream2.destroyed || stream2[kDestroyed]); - } - function isReadableAborted(stream2) { - const state = stream2 && stream2._readableState; - return isDestroyed(stream2) && state && !state.endEmitted; - } - function destroy(stream2, err) { - if (!isStream(stream2) || isDestroyed(stream2)) { - return; - } - if (typeof stream2.destroy === "function") { - if (Object.getPrototypeOf(stream2).constructor === IncomingMessage) { - stream2.socket = null; - } - stream2.destroy(err); - } else if (err) { - process.nextTick((stream3, err2) => { - stream3.emit("error", err2); - }, stream2, err); - } - if (stream2.destroyed !== true) { - stream2[kDestroyed] = true; - } - } - var KEEPALIVE_TIMEOUT_EXPR = /timeout=(\d+)/; - function parseKeepAliveTimeout(val) { - const m2 = val.toString().match(KEEPALIVE_TIMEOUT_EXPR); - return m2 ? parseInt(m2[1], 10) * 1e3 : null; - } - function parseHeaders(headers, obj = {}) { - for (let i = 0; i < headers.length; i += 2) { - const key = headers[i].toString().toLowerCase(); - let val = obj[key]; - if (!val) { - if (Array.isArray(headers[i + 1])) { - obj[key] = headers[i + 1]; - } else { - obj[key] = headers[i + 1].toString("utf8"); - } - } else { - if (!Array.isArray(val)) { - val = [val]; - obj[key] = val; - } - val.push(headers[i + 1].toString("utf8")); - } - } - if ("content-length" in obj && "content-disposition" in obj) { - obj["content-disposition"] = Buffer.from(obj["content-disposition"]).toString("latin1"); - } - return obj; - } - function parseRawHeaders(headers) { - const ret = []; - let hasContentLength = false; - let contentDispositionIdx = -1; - for (let n = 0; n < headers.length; n += 2) { - const key = headers[n + 0].toString(); - const val = headers[n + 1].toString("utf8"); - if (key.length === 14 && (key === "content-length" || key.toLowerCase() === "content-length")) { - ret.push(key, val); - hasContentLength = true; - } else if (key.length === 19 && (key === "content-disposition" || key.toLowerCase() === "content-disposition")) { - contentDispositionIdx = ret.push(key, val) - 1; - } else { - ret.push(key, val); - } - } - if (hasContentLength && contentDispositionIdx !== -1) { - ret[contentDispositionIdx] = Buffer.from(ret[contentDispositionIdx]).toString("latin1"); - } - return ret; - } - function isBuffer(buffer) { - return buffer instanceof Uint8Array || Buffer.isBuffer(buffer); - } - function validateHandler(handler2, method, upgrade) { - if (!handler2 || typeof handler2 !== "object") { - throw new InvalidArgumentError("handler must be an object"); - } - if (typeof handler2.onConnect !== "function") { - throw new InvalidArgumentError("invalid onConnect method"); - } - if (typeof handler2.onError !== "function") { - throw new InvalidArgumentError("invalid onError method"); - } - if (typeof handler2.onBodySent !== "function" && handler2.onBodySent !== void 0) { - throw new InvalidArgumentError("invalid onBodySent method"); - } - if (upgrade || method === "CONNECT") { - if (typeof handler2.onUpgrade !== "function") { - throw new InvalidArgumentError("invalid onUpgrade method"); - } - } else { - if (typeof handler2.onHeaders !== "function") { - throw new InvalidArgumentError("invalid onHeaders method"); - } - if (typeof handler2.onData !== "function") { - throw new InvalidArgumentError("invalid onData method"); - } - if (typeof handler2.onComplete !== "function") { - throw new InvalidArgumentError("invalid onComplete method"); - } - } - } - function isDisturbed(body) { - return !!(body && (stream.isDisturbed ? stream.isDisturbed(body) || body[kBodyUsed] : body[kBodyUsed] || body.readableDidRead || body._readableState && body._readableState.dataEmitted || isReadableAborted(body))); - } - function isErrored(body) { - return !!(body && (stream.isErrored ? stream.isErrored(body) : /state: 'errored'/.test( - nodeUtil.inspect(body) - ))); - } - function isReadable(body) { - return !!(body && (stream.isReadable ? stream.isReadable(body) : /state: 'readable'/.test( - nodeUtil.inspect(body) - ))); - } - function getSocketInfo(socket) { - return { - localAddress: socket.localAddress, - localPort: socket.localPort, - remoteAddress: socket.remoteAddress, - remotePort: socket.remotePort, - remoteFamily: socket.remoteFamily, - timeout: socket.timeout, - bytesWritten: socket.bytesWritten, - bytesRead: socket.bytesRead - }; - } - var ReadableStream; - function ReadableStreamFrom(iterable) { - if (!ReadableStream) { - ReadableStream = require("stream/web").ReadableStream; - } - if (ReadableStream.from) { - return ReadableStream.from(iterable); - } - let iterator; - return new ReadableStream( - { - async start() { - iterator = iterable[Symbol.asyncIterator](); - }, - async pull(controller) { - const { done, value } = await iterator.next(); - if (done) { - queueMicrotask(() => { - controller.close(); - }); - } else { - const buf = Buffer.isBuffer(value) ? value : Buffer.from(value); - controller.enqueue(new Uint8Array(buf)); - } - return controller.desiredSize > 0; - }, - async cancel(reason) { - await iterator.return(); - } - }, - 0 - ); - } - function isFormDataLike(object) { - return object && typeof object === "object" && typeof object.append === "function" && typeof object.delete === "function" && typeof object.get === "function" && typeof object.getAll === "function" && typeof object.has === "function" && typeof object.set === "function" && object[Symbol.toStringTag] === "FormData"; - } - function throwIfAborted(signal) { - if (!signal) { - return; - } - if (typeof signal.throwIfAborted === "function") { - signal.throwIfAborted(); - } else { - if (signal.aborted) { - const err = new Error("The operation was aborted"); - err.name = "AbortError"; - throw err; - } - } - } - var events; - function addAbortListener(signal, listener) { - if (typeof Symbol.dispose === "symbol") { - if (!events) { - events = require("events"); - } - if (typeof events.addAbortListener === "function" && "aborted" in signal) { - return events.addAbortListener(signal, listener); - } - } - if ("addEventListener" in signal) { - signal.addEventListener("abort", listener, { once: true }); - return () => signal.removeEventListener("abort", listener); - } - signal.addListener("abort", listener); - return () => signal.removeListener("abort", listener); - } - var hasToWellFormed = !!String.prototype.toWellFormed; - function toUSVString(val) { - if (hasToWellFormed) { - return `${val}`.toWellFormed(); - } else if (nodeUtil.toUSVString) { - return nodeUtil.toUSVString(val); - } - return `${val}`; - } - var kEnumerableProperty = /* @__PURE__ */ Object.create(null); - kEnumerableProperty.enumerable = true; - module2.exports = { - kEnumerableProperty, - nop, - isDisturbed, - isErrored, - isReadable, - toUSVString, - isReadableAborted, - isBlobLike, - parseOrigin, - parseURL, - getServerName, - isStream, - isIterable, - isAsyncIterable, - isDestroyed, - parseRawHeaders, - parseHeaders, - parseKeepAliveTimeout, - destroy, - bodyLength, - deepClone, - ReadableStreamFrom, - isBuffer, - validateHandler, - getSocketInfo, - isFormDataLike, - buildURL, - throwIfAborted, - addAbortListener, - nodeMajor, - nodeMinor, - nodeHasAutoSelectFamily: nodeMajor > 18 || nodeMajor === 18 && nodeMinor >= 13 - }; - } -}); - -// node_modules/undici/lib/timers.js -var require_timers = __commonJS({ - "node_modules/undici/lib/timers.js"(exports2, module2) { - "use strict"; - var fastNow = Date.now(); - var fastNowTimeout; - var fastTimers = []; - function onTimeout() { - fastNow = Date.now(); - let len = fastTimers.length; - let idx = 0; - while (idx < len) { - const timer = fastTimers[idx]; - if (timer.state === 0) { - timer.state = fastNow + timer.delay; - } else if (timer.state > 0 && fastNow >= timer.state) { - timer.state = -1; - timer.callback(timer.opaque); - } - if (timer.state === -1) { - timer.state = -2; - if (idx !== len - 1) { - fastTimers[idx] = fastTimers.pop(); - } else { - fastTimers.pop(); - } - len -= 1; - } else { - idx += 1; - } - } - if (fastTimers.length > 0) { - refreshTimeout(); - } - } - function refreshTimeout() { - if (fastNowTimeout && fastNowTimeout.refresh) { - fastNowTimeout.refresh(); - } else { - clearTimeout(fastNowTimeout); - fastNowTimeout = setTimeout(onTimeout, 1e3); - if (fastNowTimeout.unref) { - fastNowTimeout.unref(); - } - } - } - var Timeout = class { - constructor(callback, delay, opaque) { - this.callback = callback; - this.delay = delay; - this.opaque = opaque; - this.state = -2; - this.refresh(); - } - refresh() { - if (this.state === -2) { - fastTimers.push(this); - if (!fastNowTimeout || fastTimers.length === 1) { - refreshTimeout(); - } - } - this.state = 0; - } - clear() { - this.state = -1; - } - }; - module2.exports = { - setTimeout(callback, delay, opaque) { - return delay < 1e3 ? setTimeout(callback, delay, opaque) : new Timeout(callback, delay, opaque); - }, - clearTimeout(timeout) { - if (timeout instanceof Timeout) { - timeout.clear(); - } else { - clearTimeout(timeout); - } - } - }; - } -}); - -// node_modules/busboy/lib/utils.js -var require_utils = __commonJS({ - "node_modules/busboy/lib/utils.js"(exports2, module2) { - "use strict"; - function parseContentType(str) { - if (str.length === 0) - return; - const params = /* @__PURE__ */ Object.create(null); - let i = 0; - for (; i < str.length; ++i) { - const code = str.charCodeAt(i); - if (TOKEN[code] !== 1) { - if (code !== 47 || i === 0) - return; - break; - } - } - if (i === str.length) - return; - const type = str.slice(0, i).toLowerCase(); - const subtypeStart = ++i; - for (; i < str.length; ++i) { - const code = str.charCodeAt(i); - if (TOKEN[code] !== 1) { - if (i === subtypeStart) - return; - if (parseContentTypeParams(str, i, params) === void 0) - return; - break; - } - } - if (i === subtypeStart) - return; - const subtype = str.slice(subtypeStart, i).toLowerCase(); - return { type, subtype, params }; - } - function parseContentTypeParams(str, i, params) { - while (i < str.length) { - for (; i < str.length; ++i) { - const code = str.charCodeAt(i); - if (code !== 32 && code !== 9) - break; - } - if (i === str.length) - break; - if (str.charCodeAt(i++) !== 59) - return; - for (; i < str.length; ++i) { - const code = str.charCodeAt(i); - if (code !== 32 && code !== 9) - break; - } - if (i === str.length) - return; - let name; - const nameStart = i; - for (; i < str.length; ++i) { - const code = str.charCodeAt(i); - if (TOKEN[code] !== 1) { - if (code !== 61) - return; - break; - } - } - if (i === str.length) - return; - name = str.slice(nameStart, i); - ++i; - if (i === str.length) - return; - let value = ""; - let valueStart; - if (str.charCodeAt(i) === 34) { - valueStart = ++i; - let escaping = false; - for (; i < str.length; ++i) { - const code = str.charCodeAt(i); - if (code === 92) { - if (escaping) { - valueStart = i; - escaping = false; - } else { - value += str.slice(valueStart, i); - escaping = true; - } - continue; - } - if (code === 34) { - if (escaping) { - valueStart = i; - escaping = false; - continue; - } - value += str.slice(valueStart, i); - break; - } - if (escaping) { - valueStart = i - 1; - escaping = false; - } - if (QDTEXT[code] !== 1) - return; - } - if (i === str.length) - return; - ++i; - } else { - valueStart = i; - for (; i < str.length; ++i) { - const code = str.charCodeAt(i); - if (TOKEN[code] !== 1) { - if (i === valueStart) - return; - break; - } - } - value = str.slice(valueStart, i); - } - name = name.toLowerCase(); - if (params[name] === void 0) - params[name] = value; - } - return params; - } - function parseDisposition(str, defDecoder) { - if (str.length === 0) - return; - const params = /* @__PURE__ */ Object.create(null); - let i = 0; - for (; i < str.length; ++i) { - const code = str.charCodeAt(i); - if (TOKEN[code] !== 1) { - if (parseDispositionParams(str, i, params, defDecoder) === void 0) - return; - break; - } - } - const type = str.slice(0, i).toLowerCase(); - return { type, params }; - } - function parseDispositionParams(str, i, params, defDecoder) { - while (i < str.length) { - for (; i < str.length; ++i) { - const code = str.charCodeAt(i); - if (code !== 32 && code !== 9) - break; - } - if (i === str.length) - break; - if (str.charCodeAt(i++) !== 59) - return; - for (; i < str.length; ++i) { - const code = str.charCodeAt(i); - if (code !== 32 && code !== 9) - break; - } - if (i === str.length) - return; - let name; - const nameStart = i; - for (; i < str.length; ++i) { - const code = str.charCodeAt(i); - if (TOKEN[code] !== 1) { - if (code === 61) - break; - return; - } - } - if (i === str.length) - return; - let value = ""; - let valueStart; - let charset; - name = str.slice(nameStart, i); - if (name.charCodeAt(name.length - 1) === 42) { - const charsetStart = ++i; - for (; i < str.length; ++i) { - const code = str.charCodeAt(i); - if (CHARSET[code] !== 1) { - if (code !== 39) - return; - break; - } - } - if (i === str.length) - return; - charset = str.slice(charsetStart, i); - ++i; - for (; i < str.length; ++i) { - const code = str.charCodeAt(i); - if (code === 39) - break; - } - if (i === str.length) - return; - ++i; - if (i === str.length) - return; - valueStart = i; - let encode = 0; - for (; i < str.length; ++i) { - const code = str.charCodeAt(i); - if (EXTENDED_VALUE[code] !== 1) { - if (code === 37) { - let hexUpper; - let hexLower; - if (i + 2 < str.length && (hexUpper = HEX_VALUES[str.charCodeAt(i + 1)]) !== -1 && (hexLower = HEX_VALUES[str.charCodeAt(i + 2)]) !== -1) { - const byteVal = (hexUpper << 4) + hexLower; - value += str.slice(valueStart, i); - value += String.fromCharCode(byteVal); - i += 2; - valueStart = i + 1; - if (byteVal >= 128) - encode = 2; - else if (encode === 0) - encode = 1; - continue; - } - return; - } - break; - } - } - value += str.slice(valueStart, i); - value = convertToUTF8(value, charset, encode); - if (value === void 0) - return; - } else { - ++i; - if (i === str.length) - return; - if (str.charCodeAt(i) === 34) { - valueStart = ++i; - let escaping = false; - for (; i < str.length; ++i) { - const code = str.charCodeAt(i); - if (code === 92) { - if (escaping) { - valueStart = i; - escaping = false; - } else { - value += str.slice(valueStart, i); - escaping = true; - } - continue; - } - if (code === 34) { - if (escaping) { - valueStart = i; - escaping = false; - continue; - } - value += str.slice(valueStart, i); - break; - } - if (escaping) { - valueStart = i - 1; - escaping = false; - } - if (QDTEXT[code] !== 1) - return; - } - if (i === str.length) - return; - ++i; - } else { - valueStart = i; - for (; i < str.length; ++i) { - const code = str.charCodeAt(i); - if (TOKEN[code] !== 1) { - if (i === valueStart) - return; - break; - } - } - value = str.slice(valueStart, i); - } - value = defDecoder(value, 2); - if (value === void 0) - return; - } - name = name.toLowerCase(); - if (params[name] === void 0) - params[name] = value; - } - return params; - } - function getDecoder(charset) { - let lc2; - while (true) { - switch (charset) { - case "utf-8": - case "utf8": - return decoders.utf8; - case "latin1": - case "ascii": - case "us-ascii": - case "iso-8859-1": - case "iso8859-1": - case "iso88591": - case "iso_8859-1": - case "windows-1252": - case "iso_8859-1:1987": - case "cp1252": - case "x-cp1252": - return decoders.latin1; - case "utf16le": - case "utf-16le": - case "ucs2": - case "ucs-2": - return decoders.utf16le; - case "base64": - return decoders.base64; - default: - if (lc2 === void 0) { - lc2 = true; - charset = charset.toLowerCase(); - continue; - } - return decoders.other.bind(charset); - } - } - } - var decoders = { - utf8: (data, hint) => { - if (data.length === 0) - return ""; - if (typeof data === "string") { - if (hint < 2) - return data; - data = Buffer.from(data, "latin1"); - } - return data.utf8Slice(0, data.length); - }, - latin1: (data, hint) => { - if (data.length === 0) - return ""; - if (typeof data === "string") - return data; - return data.latin1Slice(0, data.length); - }, - utf16le: (data, hint) => { - if (data.length === 0) - return ""; - if (typeof data === "string") - data = Buffer.from(data, "latin1"); - return data.ucs2Slice(0, data.length); - }, - base64: (data, hint) => { - if (data.length === 0) - return ""; - if (typeof data === "string") - data = Buffer.from(data, "latin1"); - return data.base64Slice(0, data.length); - }, - other: (data, hint) => { - if (data.length === 0) - return ""; - if (typeof data === "string") - data = Buffer.from(data, "latin1"); - try { - const decoder = new TextDecoder(exports2); - return decoder.decode(data); - } catch { - } - } - }; - function convertToUTF8(data, charset, hint) { - const decode = getDecoder(charset); - if (decode) - return decode(data, hint); - } - function basename(path) { - if (typeof path !== "string") - return ""; - for (let i = path.length - 1; i >= 0; --i) { - switch (path.charCodeAt(i)) { - case 47: - case 92: - path = path.slice(i + 1); - return path === ".." || path === "." ? "" : path; - } - } - return path === ".." || path === "." ? "" : path; - } - var TOKEN = [ - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 1, - 0, - 1, - 1, - 1, - 1, - 1, - 0, - 0, - 1, - 1, - 0, - 1, - 1, - 0, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 0, - 0, - 0, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 0, - 1, - 0, - 1, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0 - ]; - var QDTEXT = [ - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 1, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 1, - 1, - 0, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 0, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 0, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1 - ]; - var CHARSET = [ - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 1, - 0, - 1, - 1, - 1, - 1, - 0, - 0, - 0, - 0, - 1, - 0, - 1, - 0, - 0, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 0, - 0, - 0, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 0, - 1, - 1, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0 - ]; - var EXTENDED_VALUE = [ - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 1, - 0, - 1, - 1, - 0, - 1, - 0, - 0, - 0, - 0, - 1, - 0, - 1, - 1, - 0, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 0, - 0, - 0, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 0, - 1, - 0, - 1, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0 - ]; - var HEX_VALUES = [ - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - 0, - 1, - 2, - 3, - 4, - 5, - 6, - 7, - 8, - 9, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - 10, - 11, - 12, - 13, - 14, - 15, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - 10, - 11, - 12, - 13, - 14, - 15, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1 - ]; - module2.exports = { - basename, - convertToUTF8, - getDecoder, - parseContentType, - parseDisposition - }; - } -}); - -// node_modules/streamsearch/lib/sbmh.js -var require_sbmh = __commonJS({ - "node_modules/streamsearch/lib/sbmh.js"(exports2, module2) { - "use strict"; - function memcmp(buf1, pos1, buf2, pos2, num) { - for (let i = 0; i < num; ++i) { - if (buf1[pos1 + i] !== buf2[pos2 + i]) - return false; - } - return true; - } - var SBMH = class { - constructor(needle, cb) { - if (typeof cb !== "function") - throw new Error("Missing match callback"); - if (typeof needle === "string") - needle = Buffer.from(needle); - else if (!Buffer.isBuffer(needle)) - throw new Error(`Expected Buffer for needle, got ${typeof needle}`); - const needleLen = needle.length; - this.maxMatches = Infinity; - this.matches = 0; - this._cb = cb; - this._lookbehindSize = 0; - this._needle = needle; - this._bufPos = 0; - this._lookbehind = Buffer.allocUnsafe(needleLen); - this._occ = [ - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen, - needleLen - ]; - if (needleLen > 1) { - for (let i = 0; i < needleLen - 1; ++i) - this._occ[needle[i]] = needleLen - 1 - i; - } - } - reset() { - this.matches = 0; - this._lookbehindSize = 0; - this._bufPos = 0; - } - push(chunk, pos) { - let result; - if (!Buffer.isBuffer(chunk)) - chunk = Buffer.from(chunk, "latin1"); - const chunkLen = chunk.length; - this._bufPos = pos || 0; - while (result !== chunkLen && this.matches < this.maxMatches) - result = feed(this, chunk); - return result; - } - destroy() { - const lbSize = this._lookbehindSize; - if (lbSize) - this._cb(false, this._lookbehind, 0, lbSize, false); - this.reset(); - } - }; - function feed(self2, data) { - const len = data.length; - const needle = self2._needle; - const needleLen = needle.length; - let pos = -self2._lookbehindSize; - const lastNeedleCharPos = needleLen - 1; - const lastNeedleChar = needle[lastNeedleCharPos]; - const end = len - needleLen; - const occ = self2._occ; - const lookbehind = self2._lookbehind; - if (pos < 0) { - while (pos < 0 && pos <= end) { - const nextPos = pos + lastNeedleCharPos; - const ch = nextPos < 0 ? lookbehind[self2._lookbehindSize + nextPos] : data[nextPos]; - if (ch === lastNeedleChar && matchNeedle(self2, data, pos, lastNeedleCharPos)) { - self2._lookbehindSize = 0; - ++self2.matches; - if (pos > -self2._lookbehindSize) - self2._cb(true, lookbehind, 0, self2._lookbehindSize + pos, false); - else - self2._cb(true, void 0, 0, 0, true); - return self2._bufPos = pos + needleLen; - } - pos += occ[ch]; - } - while (pos < 0 && !matchNeedle(self2, data, pos, len - pos)) - ++pos; - if (pos < 0) { - const bytesToCutOff = self2._lookbehindSize + pos; - if (bytesToCutOff > 0) { - self2._cb(false, lookbehind, 0, bytesToCutOff, false); - } - self2._lookbehindSize -= bytesToCutOff; - lookbehind.copy(lookbehind, 0, bytesToCutOff, self2._lookbehindSize); - lookbehind.set(data, self2._lookbehindSize); - self2._lookbehindSize += len; - self2._bufPos = len; - return len; - } - self2._cb(false, lookbehind, 0, self2._lookbehindSize, false); - self2._lookbehindSize = 0; - } - pos += self2._bufPos; - const firstNeedleChar = needle[0]; - while (pos <= end) { - const ch = data[pos + lastNeedleCharPos]; - if (ch === lastNeedleChar && data[pos] === firstNeedleChar && memcmp(needle, 0, data, pos, lastNeedleCharPos)) { - ++self2.matches; - if (pos > 0) - self2._cb(true, data, self2._bufPos, pos, true); - else - self2._cb(true, void 0, 0, 0, true); - return self2._bufPos = pos + needleLen; - } - pos += occ[ch]; - } - while (pos < len) { - if (data[pos] !== firstNeedleChar || !memcmp(data, pos, needle, 0, len - pos)) { - ++pos; - continue; - } - data.copy(lookbehind, 0, pos, len); - self2._lookbehindSize = len - pos; - break; - } - if (pos > 0) - self2._cb(false, data, self2._bufPos, pos < len ? pos : len, true); - self2._bufPos = len; - return len; - } - function matchNeedle(self2, data, pos, len) { - const lb = self2._lookbehind; - const lbSize = self2._lookbehindSize; - const needle = self2._needle; - for (let i = 0; i < len; ++i, ++pos) { - const ch = pos < 0 ? lb[lbSize + pos] : data[pos]; - if (ch !== needle[i]) - return false; - } - return true; - } - module2.exports = SBMH; - } -}); - -// node_modules/busboy/lib/types/multipart.js -var require_multipart = __commonJS({ - "node_modules/busboy/lib/types/multipart.js"(exports2, module2) { - "use strict"; - var { Readable, Writable } = require("stream"); - var StreamSearch = require_sbmh(); - var { - basename, - convertToUTF8, - getDecoder, - parseContentType, - parseDisposition - } = require_utils(); - var BUF_CRLF = Buffer.from("\r\n"); - var BUF_CR = Buffer.from("\r"); - var BUF_DASH = Buffer.from("-"); - function noop() { - } - var MAX_HEADER_PAIRS = 2e3; - var MAX_HEADER_SIZE = 16 * 1024; - var HPARSER_NAME = 0; - var HPARSER_PRE_OWS = 1; - var HPARSER_VALUE = 2; - var HeaderParser = class { - constructor(cb) { - this.header = /* @__PURE__ */ Object.create(null); - this.pairCount = 0; - this.byteCount = 0; - this.state = HPARSER_NAME; - this.name = ""; - this.value = ""; - this.crlf = 0; - this.cb = cb; - } - reset() { - this.header = /* @__PURE__ */ Object.create(null); - this.pairCount = 0; - this.byteCount = 0; - this.state = HPARSER_NAME; - this.name = ""; - this.value = ""; - this.crlf = 0; - } - push(chunk, pos, end) { - let start = pos; - while (pos < end) { - switch (this.state) { - case HPARSER_NAME: { - let done = false; - for (; pos < end; ++pos) { - if (this.byteCount === MAX_HEADER_SIZE) - return -1; - ++this.byteCount; - const code = chunk[pos]; - if (TOKEN[code] !== 1) { - if (code !== 58) - return -1; - this.name += chunk.latin1Slice(start, pos); - if (this.name.length === 0) - return -1; - ++pos; - done = true; - this.state = HPARSER_PRE_OWS; - break; - } - } - if (!done) { - this.name += chunk.latin1Slice(start, pos); - break; - } - } - case HPARSER_PRE_OWS: { - let done = false; - for (; pos < end; ++pos) { - if (this.byteCount === MAX_HEADER_SIZE) - return -1; - ++this.byteCount; - const code = chunk[pos]; - if (code !== 32 && code !== 9) { - start = pos; - done = true; - this.state = HPARSER_VALUE; - break; - } - } - if (!done) - break; - } - case HPARSER_VALUE: - switch (this.crlf) { - case 0: - for (; pos < end; ++pos) { - if (this.byteCount === MAX_HEADER_SIZE) - return -1; - ++this.byteCount; - const code = chunk[pos]; - if (FIELD_VCHAR[code] !== 1) { - if (code !== 13) - return -1; - ++this.crlf; - break; - } - } - this.value += chunk.latin1Slice(start, pos++); - break; - case 1: - if (this.byteCount === MAX_HEADER_SIZE) - return -1; - ++this.byteCount; - if (chunk[pos++] !== 10) - return -1; - ++this.crlf; - break; - case 2: { - if (this.byteCount === MAX_HEADER_SIZE) - return -1; - ++this.byteCount; - const code = chunk[pos]; - if (code === 32 || code === 9) { - start = pos; - this.crlf = 0; - } else { - if (++this.pairCount < MAX_HEADER_PAIRS) { - this.name = this.name.toLowerCase(); - if (this.header[this.name] === void 0) - this.header[this.name] = [this.value]; - else - this.header[this.name].push(this.value); - } - if (code === 13) { - ++this.crlf; - ++pos; - } else { - start = pos; - this.crlf = 0; - this.state = HPARSER_NAME; - this.name = ""; - this.value = ""; - } - } - break; - } - case 3: { - if (this.byteCount === MAX_HEADER_SIZE) - return -1; - ++this.byteCount; - if (chunk[pos++] !== 10) - return -1; - const header = this.header; - this.reset(); - this.cb(header); - return pos; - } - } - break; - } - } - return pos; - } - }; - var FileStream = class extends Readable { - constructor(opts, owner) { - super(opts); - this.truncated = false; - this._readcb = null; - this.once("end", () => { - this._read(); - if (--owner._fileEndsLeft === 0 && owner._finalcb) { - const cb = owner._finalcb; - owner._finalcb = null; - process.nextTick(cb); - } - }); - } - _read(n) { - const cb = this._readcb; - if (cb) { - this._readcb = null; - cb(); - } - } - }; - var ignoreData = { - push: (chunk, pos) => { - }, - destroy: () => { - } - }; - function callAndUnsetCb(self2, err) { - const cb = self2._writecb; - self2._writecb = null; - if (err) - self2.destroy(err); - else if (cb) - cb(); - } - function nullDecoder(val, hint) { - return val; - } - var Multipart = class extends Writable { - constructor(cfg) { - const streamOpts = { - autoDestroy: true, - emitClose: true, - highWaterMark: typeof cfg.highWaterMark === "number" ? cfg.highWaterMark : void 0 - }; - super(streamOpts); - if (!cfg.conType.params || typeof cfg.conType.params.boundary !== "string") - throw new Error("Multipart: Boundary not found"); - const boundary = cfg.conType.params.boundary; - const paramDecoder = typeof cfg.defParamCharset === "string" && cfg.defParamCharset ? getDecoder(cfg.defParamCharset) : nullDecoder; - const defCharset = cfg.defCharset || "utf8"; - const preservePath = cfg.preservePath; - const fileOpts = { - autoDestroy: true, - emitClose: true, - highWaterMark: typeof cfg.fileHwm === "number" ? cfg.fileHwm : void 0 - }; - const limits = cfg.limits; - const fieldSizeLimit = limits && typeof limits.fieldSize === "number" ? limits.fieldSize : 1 * 1024 * 1024; - const fileSizeLimit = limits && typeof limits.fileSize === "number" ? limits.fileSize : Infinity; - const filesLimit = limits && typeof limits.files === "number" ? limits.files : Infinity; - const fieldsLimit = limits && typeof limits.fields === "number" ? limits.fields : Infinity; - const partsLimit = limits && typeof limits.parts === "number" ? limits.parts : Infinity; - let parts = -1; - let fields = 0; - let files = 0; - let skipPart = false; - this._fileEndsLeft = 0; - this._fileStream = void 0; - this._complete = false; - let fileSize = 0; - let field; - let fieldSize = 0; - let partCharset; - let partEncoding; - let partType; - let partName; - let partTruncated = false; - let hitFilesLimit = false; - let hitFieldsLimit = false; - this._hparser = null; - const hparser = new HeaderParser((header) => { - this._hparser = null; - skipPart = false; - partType = "text/plain"; - partCharset = defCharset; - partEncoding = "7bit"; - partName = void 0; - partTruncated = false; - let filename; - if (!header["content-disposition"]) { - skipPart = true; - return; - } - const disp = parseDisposition( - header["content-disposition"][0], - paramDecoder - ); - if (!disp || disp.type !== "form-data") { - skipPart = true; - return; - } - if (disp.params) { - if (disp.params.name) - partName = disp.params.name; - if (disp.params["filename*"]) - filename = disp.params["filename*"]; - else if (disp.params.filename) - filename = disp.params.filename; - if (filename !== void 0 && !preservePath) - filename = basename(filename); - } - if (header["content-type"]) { - const conType = parseContentType(header["content-type"][0]); - if (conType) { - partType = `${conType.type}/${conType.subtype}`; - if (conType.params && typeof conType.params.charset === "string") - partCharset = conType.params.charset.toLowerCase(); - } - } - if (header["content-transfer-encoding"]) - partEncoding = header["content-transfer-encoding"][0].toLowerCase(); - if (partType === "application/octet-stream" || filename !== void 0) { - if (files === filesLimit) { - if (!hitFilesLimit) { - hitFilesLimit = true; - this.emit("filesLimit"); - } - skipPart = true; - return; - } - ++files; - if (this.listenerCount("file") === 0) { - skipPart = true; - return; - } - fileSize = 0; - this._fileStream = new FileStream(fileOpts, this); - ++this._fileEndsLeft; - this.emit( - "file", - partName, - this._fileStream, - { - filename, - encoding: partEncoding, - mimeType: partType - } - ); - } else { - if (fields === fieldsLimit) { - if (!hitFieldsLimit) { - hitFieldsLimit = true; - this.emit("fieldsLimit"); - } - skipPart = true; - return; - } - ++fields; - if (this.listenerCount("field") === 0) { - skipPart = true; - return; - } - field = []; - fieldSize = 0; - } - }); - let matchPostBoundary = 0; - const ssCb = (isMatch, data, start, end, isDataSafe) => { - retrydata: - while (data) { - if (this._hparser !== null) { - const ret = this._hparser.push(data, start, end); - if (ret === -1) { - this._hparser = null; - hparser.reset(); - this.emit("error", new Error("Malformed part header")); - break; - } - start = ret; - } - if (start === end) - break; - if (matchPostBoundary !== 0) { - if (matchPostBoundary === 1) { - switch (data[start]) { - case 45: - matchPostBoundary = 2; - ++start; - break; - case 13: - matchPostBoundary = 3; - ++start; - break; - default: - matchPostBoundary = 0; - } - if (start === end) - return; - } - if (matchPostBoundary === 2) { - matchPostBoundary = 0; - if (data[start] === 45) { - this._complete = true; - this._bparser = ignoreData; - return; - } - const writecb = this._writecb; - this._writecb = noop; - ssCb(false, BUF_DASH, 0, 1, false); - this._writecb = writecb; - } else if (matchPostBoundary === 3) { - matchPostBoundary = 0; - if (data[start] === 10) { - ++start; - if (parts >= partsLimit) - break; - this._hparser = hparser; - if (start === end) - break; - continue retrydata; - } else { - const writecb = this._writecb; - this._writecb = noop; - ssCb(false, BUF_CR, 0, 1, false); - this._writecb = writecb; - } - } - } - if (!skipPart) { - if (this._fileStream) { - let chunk; - const actualLen = Math.min(end - start, fileSizeLimit - fileSize); - if (!isDataSafe) { - chunk = Buffer.allocUnsafe(actualLen); - data.copy(chunk, 0, start, start + actualLen); - } else { - chunk = data.slice(start, start + actualLen); - } - fileSize += chunk.length; - if (fileSize === fileSizeLimit) { - if (chunk.length > 0) - this._fileStream.push(chunk); - this._fileStream.emit("limit"); - this._fileStream.truncated = true; - skipPart = true; - } else if (!this._fileStream.push(chunk)) { - if (this._writecb) - this._fileStream._readcb = this._writecb; - this._writecb = null; - } - } else if (field !== void 0) { - let chunk; - const actualLen = Math.min( - end - start, - fieldSizeLimit - fieldSize - ); - if (!isDataSafe) { - chunk = Buffer.allocUnsafe(actualLen); - data.copy(chunk, 0, start, start + actualLen); - } else { - chunk = data.slice(start, start + actualLen); - } - fieldSize += actualLen; - field.push(chunk); - if (fieldSize === fieldSizeLimit) { - skipPart = true; - partTruncated = true; - } - } - } - break; - } - if (isMatch) { - matchPostBoundary = 1; - if (this._fileStream) { - this._fileStream.push(null); - this._fileStream = null; - } else if (field !== void 0) { - let data2; - switch (field.length) { - case 0: - data2 = ""; - break; - case 1: - data2 = convertToUTF8(field[0], partCharset, 0); - break; - default: - data2 = convertToUTF8( - Buffer.concat(field, fieldSize), - partCharset, - 0 - ); - } - field = void 0; - fieldSize = 0; - this.emit( - "field", - partName, - data2, - { - nameTruncated: false, - valueTruncated: partTruncated, - encoding: partEncoding, - mimeType: partType - } - ); - } - if (++parts === partsLimit) - this.emit("partsLimit"); - } - }; - this._bparser = new StreamSearch(`\r ---${boundary}`, ssCb); - this._writecb = null; - this._finalcb = null; - this.write(BUF_CRLF); - } - static detect(conType) { - return conType.type === "multipart" && conType.subtype === "form-data"; - } - _write(chunk, enc, cb) { - this._writecb = cb; - this._bparser.push(chunk, 0); - if (this._writecb) - callAndUnsetCb(this); - } - _destroy(err, cb) { - this._hparser = null; - this._bparser = ignoreData; - if (!err) - err = checkEndState(this); - const fileStream = this._fileStream; - if (fileStream) { - this._fileStream = null; - fileStream.destroy(err); - } - cb(err); - } - _final(cb) { - this._bparser.destroy(); - if (!this._complete) - return cb(new Error("Unexpected end of form")); - if (this._fileEndsLeft) - this._finalcb = finalcb.bind(null, this, cb); - else - finalcb(this, cb); - } - }; - function finalcb(self2, cb, err) { - if (err) - return cb(err); - err = checkEndState(self2); - cb(err); - } - function checkEndState(self2) { - if (self2._hparser) - return new Error("Malformed part header"); - const fileStream = self2._fileStream; - if (fileStream) { - self2._fileStream = null; - fileStream.destroy(new Error("Unexpected end of file")); - } - if (!self2._complete) - return new Error("Unexpected end of form"); - } - var TOKEN = [ - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 1, - 0, - 1, - 1, - 1, - 1, - 1, - 0, - 0, - 1, - 1, - 0, - 1, - 1, - 0, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 0, - 0, - 0, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 0, - 1, - 0, - 1, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0 - ]; - var FIELD_VCHAR = [ - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 1, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 0, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1 - ]; - module2.exports = Multipart; - } -}); - -// node_modules/busboy/lib/types/urlencoded.js -var require_urlencoded = __commonJS({ - "node_modules/busboy/lib/types/urlencoded.js"(exports2, module2) { - "use strict"; - var { Writable } = require("stream"); - var { getDecoder } = require_utils(); - var URLEncoded = class extends Writable { - constructor(cfg) { - const streamOpts = { - autoDestroy: true, - emitClose: true, - highWaterMark: typeof cfg.highWaterMark === "number" ? cfg.highWaterMark : void 0 - }; - super(streamOpts); - let charset = cfg.defCharset || "utf8"; - if (cfg.conType.params && typeof cfg.conType.params.charset === "string") - charset = cfg.conType.params.charset; - this.charset = charset; - const limits = cfg.limits; - this.fieldSizeLimit = limits && typeof limits.fieldSize === "number" ? limits.fieldSize : 1 * 1024 * 1024; - this.fieldsLimit = limits && typeof limits.fields === "number" ? limits.fields : Infinity; - this.fieldNameSizeLimit = limits && typeof limits.fieldNameSize === "number" ? limits.fieldNameSize : 100; - this._inKey = true; - this._keyTrunc = false; - this._valTrunc = false; - this._bytesKey = 0; - this._bytesVal = 0; - this._fields = 0; - this._key = ""; - this._val = ""; - this._byte = -2; - this._lastPos = 0; - this._encode = 0; - this._decoder = getDecoder(charset); - } - static detect(conType) { - return conType.type === "application" && conType.subtype === "x-www-form-urlencoded"; - } - _write(chunk, enc, cb) { - if (this._fields >= this.fieldsLimit) - return cb(); - let i = 0; - const len = chunk.length; - this._lastPos = 0; - if (this._byte !== -2) { - i = readPctEnc(this, chunk, i, len); - if (i === -1) - return cb(new Error("Malformed urlencoded form")); - if (i >= len) - return cb(); - if (this._inKey) - ++this._bytesKey; - else - ++this._bytesVal; - } - main: - while (i < len) { - if (this._inKey) { - i = skipKeyBytes(this, chunk, i, len); - while (i < len) { - switch (chunk[i]) { - case 61: - if (this._lastPos < i) - this._key += chunk.latin1Slice(this._lastPos, i); - this._lastPos = ++i; - this._key = this._decoder(this._key, this._encode); - this._encode = 0; - this._inKey = false; - continue main; - case 38: - if (this._lastPos < i) - this._key += chunk.latin1Slice(this._lastPos, i); - this._lastPos = ++i; - this._key = this._decoder(this._key, this._encode); - this._encode = 0; - if (this._bytesKey > 0) { - this.emit( - "field", - this._key, - "", - { - nameTruncated: this._keyTrunc, - valueTruncated: false, - encoding: this.charset, - mimeType: "text/plain" - } - ); - } - this._key = ""; - this._val = ""; - this._keyTrunc = false; - this._valTrunc = false; - this._bytesKey = 0; - this._bytesVal = 0; - if (++this._fields >= this.fieldsLimit) { - this.emit("fieldsLimit"); - return cb(); - } - continue; - case 43: - if (this._lastPos < i) - this._key += chunk.latin1Slice(this._lastPos, i); - this._key += " "; - this._lastPos = i + 1; - break; - case 37: - if (this._encode === 0) - this._encode = 1; - if (this._lastPos < i) - this._key += chunk.latin1Slice(this._lastPos, i); - this._lastPos = i + 1; - this._byte = -1; - i = readPctEnc(this, chunk, i + 1, len); - if (i === -1) - return cb(new Error("Malformed urlencoded form")); - if (i >= len) - return cb(); - ++this._bytesKey; - i = skipKeyBytes(this, chunk, i, len); - continue; - } - ++i; - ++this._bytesKey; - i = skipKeyBytes(this, chunk, i, len); - } - if (this._lastPos < i) - this._key += chunk.latin1Slice(this._lastPos, i); - } else { - i = skipValBytes(this, chunk, i, len); - while (i < len) { - switch (chunk[i]) { - case 38: - if (this._lastPos < i) - this._val += chunk.latin1Slice(this._lastPos, i); - this._lastPos = ++i; - this._inKey = true; - this._val = this._decoder(this._val, this._encode); - this._encode = 0; - if (this._bytesKey > 0 || this._bytesVal > 0) { - this.emit( - "field", - this._key, - this._val, - { - nameTruncated: this._keyTrunc, - valueTruncated: this._valTrunc, - encoding: this.charset, - mimeType: "text/plain" - } - ); - } - this._key = ""; - this._val = ""; - this._keyTrunc = false; - this._valTrunc = false; - this._bytesKey = 0; - this._bytesVal = 0; - if (++this._fields >= this.fieldsLimit) { - this.emit("fieldsLimit"); - return cb(); - } - continue main; - case 43: - if (this._lastPos < i) - this._val += chunk.latin1Slice(this._lastPos, i); - this._val += " "; - this._lastPos = i + 1; - break; - case 37: - if (this._encode === 0) - this._encode = 1; - if (this._lastPos < i) - this._val += chunk.latin1Slice(this._lastPos, i); - this._lastPos = i + 1; - this._byte = -1; - i = readPctEnc(this, chunk, i + 1, len); - if (i === -1) - return cb(new Error("Malformed urlencoded form")); - if (i >= len) - return cb(); - ++this._bytesVal; - i = skipValBytes(this, chunk, i, len); - continue; - } - ++i; - ++this._bytesVal; - i = skipValBytes(this, chunk, i, len); - } - if (this._lastPos < i) - this._val += chunk.latin1Slice(this._lastPos, i); - } - } - cb(); - } - _final(cb) { - if (this._byte !== -2) - return cb(new Error("Malformed urlencoded form")); - if (!this._inKey || this._bytesKey > 0 || this._bytesVal > 0) { - if (this._inKey) - this._key = this._decoder(this._key, this._encode); - else - this._val = this._decoder(this._val, this._encode); - this.emit( - "field", - this._key, - this._val, - { - nameTruncated: this._keyTrunc, - valueTruncated: this._valTrunc, - encoding: this.charset, - mimeType: "text/plain" - } - ); - } - cb(); - } - }; - function readPctEnc(self2, chunk, pos, len) { - if (pos >= len) - return len; - if (self2._byte === -1) { - const hexUpper = HEX_VALUES[chunk[pos++]]; - if (hexUpper === -1) - return -1; - if (hexUpper >= 8) - self2._encode = 2; - if (pos < len) { - const hexLower = HEX_VALUES[chunk[pos++]]; - if (hexLower === -1) - return -1; - if (self2._inKey) - self2._key += String.fromCharCode((hexUpper << 4) + hexLower); - else - self2._val += String.fromCharCode((hexUpper << 4) + hexLower); - self2._byte = -2; - self2._lastPos = pos; - } else { - self2._byte = hexUpper; - } - } else { - const hexLower = HEX_VALUES[chunk[pos++]]; - if (hexLower === -1) - return -1; - if (self2._inKey) - self2._key += String.fromCharCode((self2._byte << 4) + hexLower); - else - self2._val += String.fromCharCode((self2._byte << 4) + hexLower); - self2._byte = -2; - self2._lastPos = pos; - } - return pos; - } - function skipKeyBytes(self2, chunk, pos, len) { - if (self2._bytesKey > self2.fieldNameSizeLimit) { - if (!self2._keyTrunc) { - if (self2._lastPos < pos) - self2._key += chunk.latin1Slice(self2._lastPos, pos - 1); - } - self2._keyTrunc = true; - for (; pos < len; ++pos) { - const code = chunk[pos]; - if (code === 61 || code === 38) - break; - ++self2._bytesKey; - } - self2._lastPos = pos; - } - return pos; - } - function skipValBytes(self2, chunk, pos, len) { - if (self2._bytesVal > self2.fieldSizeLimit) { - if (!self2._valTrunc) { - if (self2._lastPos < pos) - self2._val += chunk.latin1Slice(self2._lastPos, pos - 1); - } - self2._valTrunc = true; - for (; pos < len; ++pos) { - if (chunk[pos] === 38) - break; - ++self2._bytesVal; - } - self2._lastPos = pos; - } - return pos; - } - var HEX_VALUES = [ - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - 0, - 1, - 2, - 3, - 4, - 5, - 6, - 7, - 8, - 9, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - 10, - 11, - 12, - 13, - 14, - 15, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - 10, - 11, - 12, - 13, - 14, - 15, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1, - -1 - ]; - module2.exports = URLEncoded; - } -}); - -// node_modules/busboy/lib/index.js -var require_lib = __commonJS({ - "node_modules/busboy/lib/index.js"(exports2, module2) { - "use strict"; - var { parseContentType } = require_utils(); - function getInstance(cfg) { - const headers = cfg.headers; - const conType = parseContentType(headers["content-type"]); - if (!conType) - throw new Error("Malformed content type"); - for (const type of TYPES) { - const matched = type.detect(conType); - if (!matched) - continue; - const instanceCfg = { - limits: cfg.limits, - headers, - conType, - highWaterMark: void 0, - fileHwm: void 0, - defCharset: void 0, - defParamCharset: void 0, - preservePath: false - }; - if (cfg.highWaterMark) - instanceCfg.highWaterMark = cfg.highWaterMark; - if (cfg.fileHwm) - instanceCfg.fileHwm = cfg.fileHwm; - instanceCfg.defCharset = cfg.defCharset; - instanceCfg.defParamCharset = cfg.defParamCharset; - instanceCfg.preservePath = cfg.preservePath; - return new type(instanceCfg); - } - throw new Error(`Unsupported content type: ${headers["content-type"]}`); - } - var TYPES = [ - require_multipart(), - require_urlencoded() - ].filter(function(typemod) { - return typeof typemod.detect === "function"; - }); - module2.exports = (cfg) => { - if (typeof cfg !== "object" || cfg === null) - cfg = {}; - if (typeof cfg.headers !== "object" || cfg.headers === null || typeof cfg.headers["content-type"] !== "string") { - throw new Error("Missing Content-Type"); - } - return getInstance(cfg); - }; - } -}); - -// node_modules/undici/lib/fetch/constants.js -var require_constants2 = __commonJS({ - "node_modules/undici/lib/fetch/constants.js"(exports2, module2) { - "use strict"; - var { MessageChannel, receiveMessageOnPort } = require("worker_threads"); - var corsSafeListedMethods = ["GET", "HEAD", "POST"]; - var nullBodyStatus = [101, 204, 205, 304]; - var redirectStatus = [301, 302, 303, 307, 308]; - var badPorts = [ - "1", - "7", - "9", - "11", - "13", - "15", - "17", - "19", - "20", - "21", - "22", - "23", - "25", - "37", - "42", - "43", - "53", - "69", - "77", - "79", - "87", - "95", - "101", - "102", - "103", - "104", - "109", - "110", - "111", - "113", - "115", - "117", - "119", - "123", - "135", - "137", - "139", - "143", - "161", - "179", - "389", - "427", - "465", - "512", - "513", - "514", - "515", - "526", - "530", - "531", - "532", - "540", - "548", - "554", - "556", - "563", - "587", - "601", - "636", - "989", - "990", - "993", - "995", - "1719", - "1720", - "1723", - "2049", - "3659", - "4045", - "5060", - "5061", - "6000", - "6566", - "6665", - "6666", - "6667", - "6668", - "6669", - "6697", - "10080" - ]; - var referrerPolicy = [ - "", - "no-referrer", - "no-referrer-when-downgrade", - "same-origin", - "origin", - "strict-origin", - "origin-when-cross-origin", - "strict-origin-when-cross-origin", - "unsafe-url" - ]; - var requestRedirect = ["follow", "manual", "error"]; - var safeMethods = ["GET", "HEAD", "OPTIONS", "TRACE"]; - var requestMode = ["navigate", "same-origin", "no-cors", "cors"]; - var requestCredentials = ["omit", "same-origin", "include"]; - var requestCache = [ - "default", - "no-store", - "reload", - "no-cache", - "force-cache", - "only-if-cached" - ]; - var requestBodyHeader = [ - "content-encoding", - "content-language", - "content-location", - "content-type", - // See https://github.com/nodejs/undici/issues/2021 - // 'Content-Length' is a forbidden header name, which is typically - // removed in the Headers implementation. However, undici doesn't - // filter out headers, so we add it here. - "content-length" - ]; - var requestDuplex = [ - "half" - ]; - var forbiddenMethods = ["CONNECT", "TRACE", "TRACK"]; - var subresource = [ - "audio", - "audioworklet", - "font", - "image", - "manifest", - "paintworklet", - "script", - "style", - "track", - "video", - "xslt", - "" - ]; - var DOMException2 = globalThis.DOMException ?? (() => { - try { - atob("~"); - } catch (err) { - return Object.getPrototypeOf(err).constructor; - } - })(); - var channel; - var structuredClone = globalThis.structuredClone ?? // https://github.com/nodejs/node/blob/b27ae24dcc4251bad726d9d84baf678d1f707fed/lib/internal/structured_clone.js - // structuredClone was added in v17.0.0, but fetch supports v16.8 - function structuredClone2(value, options2 = void 0) { - if (arguments.length === 0) { - throw new TypeError("missing argument"); - } - if (!channel) { - channel = new MessageChannel(); - } - channel.port1.unref(); - channel.port2.unref(); - channel.port1.postMessage(value, options2?.transfer); - return receiveMessageOnPort(channel.port2).message; - }; - module2.exports = { - DOMException: DOMException2, - structuredClone, - subresource, - forbiddenMethods, - requestBodyHeader, - referrerPolicy, - requestRedirect, - requestMode, - requestCredentials, - requestCache, - redirectStatus, - corsSafeListedMethods, - nullBodyStatus, - safeMethods, - badPorts, - requestDuplex - }; - } -}); - -// node_modules/undici/lib/fetch/global.js -var require_global = __commonJS({ - "node_modules/undici/lib/fetch/global.js"(exports2, module2) { - "use strict"; - var globalOrigin = Symbol.for("undici.globalOrigin.1"); - function getGlobalOrigin() { - return globalThis[globalOrigin]; - } - function setGlobalOrigin(newOrigin) { - if (newOrigin !== void 0 && typeof newOrigin !== "string" && !(newOrigin instanceof URL)) { - throw new Error("Invalid base url"); - } - if (newOrigin === void 0) { - Object.defineProperty(globalThis, globalOrigin, { - value: void 0, - writable: true, - enumerable: false, - configurable: false - }); - return; - } - const parsedURL = new URL(newOrigin); - if (parsedURL.protocol !== "http:" && parsedURL.protocol !== "https:") { - throw new TypeError(`Only http & https urls are allowed, received ${parsedURL.protocol}`); - } - Object.defineProperty(globalThis, globalOrigin, { - value: parsedURL, - writable: true, - enumerable: false, - configurable: false - }); - } - module2.exports = { - getGlobalOrigin, - setGlobalOrigin - }; - } -}); - -// node_modules/undici/lib/fetch/util.js -var require_util5 = __commonJS({ - "node_modules/undici/lib/fetch/util.js"(exports2, module2) { - "use strict"; - var { redirectStatus, badPorts, referrerPolicy: referrerPolicyTokens } = require_constants2(); - var { getGlobalOrigin } = require_global(); - var { performance: performance2 } = require("perf_hooks"); - var { isBlobLike, toUSVString, ReadableStreamFrom } = require_util4(); - var assert = require("assert"); - var { isUint8Array } = require("util/types"); - var crypto2; - try { - crypto2 = require("crypto"); - } catch { - } - function responseURL(response) { - const urlList = response.urlList; - const length = urlList.length; - return length === 0 ? null : urlList[length - 1].toString(); - } - function responseLocationURL(response, requestFragment) { - if (!redirectStatus.includes(response.status)) { - return null; - } - let location = response.headersList.get("location"); - if (location !== null && isValidHeaderValue(location)) { - location = new URL(location, responseURL(response)); - } - if (location && !location.hash) { - location.hash = requestFragment; - } - return location; - } - function requestCurrentURL(request) { - return request.urlList[request.urlList.length - 1]; - } - function requestBadPort(request) { - const url = requestCurrentURL(request); - if (urlIsHttpHttpsScheme(url) && badPorts.includes(url.port)) { - return "blocked"; - } - return "allowed"; - } - function isErrorLike(object) { - return object instanceof Error || (object?.constructor?.name === "Error" || object?.constructor?.name === "DOMException"); - } - function isValidReasonPhrase(statusText) { - for (let i = 0; i < statusText.length; ++i) { - const c = statusText.charCodeAt(i); - if (!(c === 9 || // HTAB - c >= 32 && c <= 126 || // SP / VCHAR - c >= 128 && c <= 255)) { - return false; - } - } - return true; - } - function isTokenChar(c) { - return !(c >= 127 || c <= 32 || c === "(" || c === ")" || c === "<" || c === ">" || c === "@" || c === "," || c === ";" || c === ":" || c === "\\" || c === '"' || c === "/" || c === "[" || c === "]" || c === "?" || c === "=" || c === "{" || c === "}"); - } - function isValidHTTPToken(characters) { - if (!characters || typeof characters !== "string") { - return false; - } - for (let i = 0; i < characters.length; ++i) { - const c = characters.charCodeAt(i); - if (c > 127 || !isTokenChar(c)) { - return false; - } - } - return true; - } - function isValidHeaderName(potentialValue) { - if (potentialValue.length === 0) { - return false; - } - return isValidHTTPToken(potentialValue); - } - function isValidHeaderValue(potentialValue) { - if (potentialValue.startsWith(" ") || potentialValue.startsWith(" ") || potentialValue.endsWith(" ") || potentialValue.endsWith(" ")) { - return false; - } - if (potentialValue.includes("\0") || potentialValue.includes("\r") || potentialValue.includes("\n")) { - return false; - } - return true; - } - function setRequestReferrerPolicyOnRedirect(request, actualResponse) { - const { headersList } = actualResponse; - const policyHeader = (headersList.get("referrer-policy") ?? "").split(","); - let policy = ""; - if (policyHeader.length > 0) { - for (let i = policyHeader.length; i !== 0; i--) { - const token = policyHeader[i - 1].trim(); - if (referrerPolicyTokens.includes(token)) { - policy = token; - break; - } - } - } - if (policy !== "") { - request.referrerPolicy = policy; - } - } - function crossOriginResourcePolicyCheck() { - return "allowed"; - } - function corsCheck() { - return "success"; - } - function TAOCheck() { - return "success"; - } - function appendFetchMetadata(httpRequest) { - let header = null; - header = httpRequest.mode; - httpRequest.headersList.set("sec-fetch-mode", header); - } - function appendRequestOriginHeader(request) { - let serializedOrigin = request.origin; - if (request.responseTainting === "cors" || request.mode === "websocket") { - if (serializedOrigin) { - request.headersList.append("origin", serializedOrigin); - } - } else if (request.method !== "GET" && request.method !== "HEAD") { - switch (request.referrerPolicy) { - case "no-referrer": - serializedOrigin = null; - break; - case "no-referrer-when-downgrade": - case "strict-origin": - case "strict-origin-when-cross-origin": - if (request.origin && urlHasHttpsScheme(request.origin) && !urlHasHttpsScheme(requestCurrentURL(request))) { - serializedOrigin = null; - } - break; - case "same-origin": - if (!sameOrigin(request, requestCurrentURL(request))) { - serializedOrigin = null; - } - break; - default: - } - if (serializedOrigin) { - request.headersList.append("origin", serializedOrigin); - } - } - } - function coarsenedSharedCurrentTime(crossOriginIsolatedCapability) { - return performance2.now(); - } - function createOpaqueTimingInfo(timingInfo) { - return { - startTime: timingInfo.startTime ?? 0, - redirectStartTime: 0, - redirectEndTime: 0, - postRedirectStartTime: timingInfo.startTime ?? 0, - finalServiceWorkerStartTime: 0, - finalNetworkResponseStartTime: 0, - finalNetworkRequestStartTime: 0, - endTime: 0, - encodedBodySize: 0, - decodedBodySize: 0, - finalConnectionTimingInfo: null - }; - } - function makePolicyContainer() { - return { - referrerPolicy: "strict-origin-when-cross-origin" - }; - } - function clonePolicyContainer(policyContainer) { - return { - referrerPolicy: policyContainer.referrerPolicy - }; - } - function determineRequestsReferrer(request) { - const policy = request.referrerPolicy; - assert(policy); - let referrerSource = null; - if (request.referrer === "client") { - const globalOrigin = getGlobalOrigin(); - if (!globalOrigin || globalOrigin.origin === "null") { - return "no-referrer"; - } - referrerSource = new URL(globalOrigin); - } else if (request.referrer instanceof URL) { - referrerSource = request.referrer; - } - let referrerURL = stripURLForReferrer(referrerSource); - const referrerOrigin = stripURLForReferrer(referrerSource, true); - if (referrerURL.toString().length > 4096) { - referrerURL = referrerOrigin; - } - const areSameOrigin = sameOrigin(request, referrerURL); - const isNonPotentiallyTrustWorthy = isURLPotentiallyTrustworthy(referrerURL) && !isURLPotentiallyTrustworthy(request.url); - switch (policy) { - case "origin": - return referrerOrigin != null ? referrerOrigin : stripURLForReferrer(referrerSource, true); - case "unsafe-url": - return referrerURL; - case "same-origin": - return areSameOrigin ? referrerOrigin : "no-referrer"; - case "origin-when-cross-origin": - return areSameOrigin ? referrerURL : referrerOrigin; - case "strict-origin-when-cross-origin": { - const currentURL = requestCurrentURL(request); - if (sameOrigin(referrerURL, currentURL)) { - return referrerURL; - } - if (isURLPotentiallyTrustworthy(referrerURL) && !isURLPotentiallyTrustworthy(currentURL)) { - return "no-referrer"; - } - return referrerOrigin; - } - case "strict-origin": - case "no-referrer-when-downgrade": - default: - return isNonPotentiallyTrustWorthy ? "no-referrer" : referrerOrigin; - } - } - function stripURLForReferrer(url, originOnly) { - assert(url instanceof URL); - if (url.protocol === "file:" || url.protocol === "about:" || url.protocol === "blank:") { - return "no-referrer"; - } - url.username = ""; - url.password = ""; - url.hash = ""; - if (originOnly) { - url.pathname = ""; - url.search = ""; - } - return url; - } - function isURLPotentiallyTrustworthy(url) { - if (!(url instanceof URL)) { - return false; - } - if (url.href === "about:blank" || url.href === "about:srcdoc") { - return true; - } - if (url.protocol === "data:") - return true; - if (url.protocol === "file:") - return true; - return isOriginPotentiallyTrustworthy(url.origin); - function isOriginPotentiallyTrustworthy(origin) { - if (origin == null || origin === "null") - return false; - const originAsURL = new URL(origin); - if (originAsURL.protocol === "https:" || originAsURL.protocol === "wss:") { - return true; - } - if (/^127(?:\.[0-9]+){0,2}\.[0-9]+$|^\[(?:0*:)*?:?0*1\]$/.test(originAsURL.hostname) || (originAsURL.hostname === "localhost" || originAsURL.hostname.includes("localhost.")) || originAsURL.hostname.endsWith(".localhost")) { - return true; - } - return false; - } - } - function bytesMatch(bytes, metadataList) { - if (crypto2 === void 0) { - return true; - } - const parsedMetadata = parseMetadata(metadataList); - if (parsedMetadata === "no metadata") { - return true; - } - if (parsedMetadata.length === 0) { - return true; - } - const list = parsedMetadata.sort((c, d) => d.algo.localeCompare(c.algo)); - const strongest = list[0].algo; - const metadata = list.filter((item) => item.algo === strongest); - for (const item of metadata) { - const algorithm = item.algo; - const expectedValue = item.hash; - const actualValue = crypto2.createHash(algorithm).update(bytes).digest("base64"); - if (actualValue === expectedValue) { - return true; - } - } - return false; - } - var parseHashWithOptions = /((?sha256|sha384|sha512)-(?[A-z0-9+/]{1}.*={0,2}))( +[\x21-\x7e]?)?/i; - function parseMetadata(metadata) { - const result = []; - let empty2 = true; - const supportedHashes = crypto2.getHashes(); - for (const token of metadata.split(" ")) { - empty2 = false; - const parsedToken = parseHashWithOptions.exec(token); - if (parsedToken === null || parsedToken.groups === void 0) { - continue; - } - const algorithm = parsedToken.groups.algo; - if (supportedHashes.includes(algorithm.toLowerCase())) { - result.push(parsedToken.groups); - } - } - if (empty2 === true) { - return "no metadata"; - } - return result; - } - function tryUpgradeRequestToAPotentiallyTrustworthyURL(request) { - } - function sameOrigin(A2, B2) { - if (A2.origin === B2.origin && A2.origin === "null") { - return true; - } - if (A2.protocol === B2.protocol && A2.hostname === B2.hostname && A2.port === B2.port) { - return true; - } - return false; - } - function createDeferredPromise() { - let res; - let rej; - const promise = new Promise((resolve, reject) => { - res = resolve; - rej = reject; - }); - return { promise, resolve: res, reject: rej }; - } - function isAborted(fetchParams) { - return fetchParams.controller.state === "aborted"; - } - function isCancelled(fetchParams) { - return fetchParams.controller.state === "aborted" || fetchParams.controller.state === "terminated"; - } - function normalizeMethod(method) { - return /^(DELETE|GET|HEAD|OPTIONS|POST|PUT)$/i.test(method) ? method.toUpperCase() : method; - } - function serializeJavascriptValueToJSONString(value) { - const result = JSON.stringify(value); - if (result === void 0) { - throw new TypeError("Value is not JSON serializable"); - } - assert(typeof result === "string"); - return result; - } - var esIteratorPrototype = Object.getPrototypeOf(Object.getPrototypeOf([][Symbol.iterator]())); - function makeIterator(iterator, name, kind) { - const object = { - index: 0, - kind, - target: iterator - }; - const i = { - next() { - if (Object.getPrototypeOf(this) !== i) { - throw new TypeError( - `'next' called on an object that does not implement interface ${name} Iterator.` - ); - } - const { index, kind: kind2, target } = object; - const values = target(); - const len = values.length; - if (index >= len) { - return { value: void 0, done: true }; - } - const pair = values[index]; - object.index = index + 1; - return iteratorResult(pair, kind2); - }, - // The class string of an iterator prototype object for a given interface is the - // result of concatenating the identifier of the interface and the string " Iterator". - [Symbol.toStringTag]: `${name} Iterator` - }; - Object.setPrototypeOf(i, esIteratorPrototype); - return Object.setPrototypeOf({}, i); - } - function iteratorResult(pair, kind) { - let result; - switch (kind) { - case "key": { - result = pair[0]; - break; - } - case "value": { - result = pair[1]; - break; - } - case "key+value": { - result = pair; - break; - } - } - return { value: result, done: false }; - } - function fullyReadBody(body, processBody, processBodyError) { - const successSteps = (bytes) => queueMicrotask(() => processBody(bytes)); - const errorSteps = (error2) => queueMicrotask(() => processBodyError(error2)); - let reader; - try { - reader = body.stream.getReader(); - } catch (e) { - errorSteps(e); - return; - } - readAllBytes(reader, successSteps, errorSteps); - } - var ReadableStream = globalThis.ReadableStream; - function isReadableStreamLike(stream) { - if (!ReadableStream) { - ReadableStream = require("stream/web").ReadableStream; - } - return stream instanceof ReadableStream || stream[Symbol.toStringTag] === "ReadableStream" && typeof stream.tee === "function"; - } - var MAXIMUM_ARGUMENT_LENGTH = 65535; - function isomorphicDecode(input) { - if (input.length < MAXIMUM_ARGUMENT_LENGTH) { - return String.fromCharCode(...input); - } - return input.reduce((previous, current) => previous + String.fromCharCode(current), ""); - } - function readableStreamClose(controller) { - try { - controller.close(); - } catch (err) { - if (!err.message.includes("Controller is already closed")) { - throw err; - } - } - } - function isomorphicEncode(input) { - for (let i = 0; i < input.length; i++) { - assert(input.charCodeAt(i) <= 255); - } - return input; - } - async function readAllBytes(reader, successSteps, failureSteps) { - const bytes = []; - let byteLength = 0; - while (true) { - let done; - let chunk; - try { - ({ done, value: chunk } = await reader.read()); - } catch (e) { - failureSteps(e); - return; - } - if (done) { - successSteps(Buffer.concat(bytes, byteLength)); - return; - } - if (!isUint8Array(chunk)) { - failureSteps(new TypeError("Received non-Uint8Array chunk")); - return; - } - bytes.push(chunk); - byteLength += chunk.length; - } - } - function urlIsLocal(url) { - assert("protocol" in url); - const protocol = url.protocol; - return protocol === "about:" || protocol === "blob:" || protocol === "data:"; - } - function urlHasHttpsScheme(url) { - if (typeof url === "string") { - return url.startsWith("https:"); - } - return url.protocol === "https:"; - } - function urlIsHttpHttpsScheme(url) { - assert("protocol" in url); - const protocol = url.protocol; - return protocol === "http:" || protocol === "https:"; - } - var hasOwn = Object.hasOwn || ((dict, key) => Object.prototype.hasOwnProperty.call(dict, key)); - module2.exports = { - isAborted, - isCancelled, - createDeferredPromise, - ReadableStreamFrom, - toUSVString, - tryUpgradeRequestToAPotentiallyTrustworthyURL, - coarsenedSharedCurrentTime, - determineRequestsReferrer, - makePolicyContainer, - clonePolicyContainer, - appendFetchMetadata, - appendRequestOriginHeader, - TAOCheck, - corsCheck, - crossOriginResourcePolicyCheck, - createOpaqueTimingInfo, - setRequestReferrerPolicyOnRedirect, - isValidHTTPToken, - requestBadPort, - requestCurrentURL, - responseURL, - responseLocationURL, - isBlobLike, - isURLPotentiallyTrustworthy, - isValidReasonPhrase, - sameOrigin, - normalizeMethod, - serializeJavascriptValueToJSONString, - makeIterator, - isValidHeaderName, - isValidHeaderValue, - hasOwn, - isErrorLike, - fullyReadBody, - bytesMatch, - isReadableStreamLike, - readableStreamClose, - isomorphicEncode, - isomorphicDecode, - urlIsLocal, - urlHasHttpsScheme, - urlIsHttpHttpsScheme, - readAllBytes - }; - } -}); - -// node_modules/undici/lib/fetch/symbols.js -var require_symbols2 = __commonJS({ - "node_modules/undici/lib/fetch/symbols.js"(exports2, module2) { - "use strict"; - module2.exports = { - kUrl: Symbol("url"), - kHeaders: Symbol("headers"), - kSignal: Symbol("signal"), - kState: Symbol("state"), - kGuard: Symbol("guard"), - kRealm: Symbol("realm") - }; - } -}); - -// node_modules/undici/lib/fetch/webidl.js -var require_webidl = __commonJS({ - "node_modules/undici/lib/fetch/webidl.js"(exports2, module2) { - "use strict"; - var { types } = require("util"); - var { hasOwn, toUSVString } = require_util5(); - var webidl = {}; - webidl.converters = {}; - webidl.util = {}; - webidl.errors = {}; - webidl.errors.exception = function(message) { - return new TypeError(`${message.header}: ${message.message}`); - }; - webidl.errors.conversionFailed = function(context) { - const plural = context.types.length === 1 ? "" : " one of"; - const message = `${context.argument} could not be converted to${plural}: ${context.types.join(", ")}.`; - return webidl.errors.exception({ - header: context.prefix, - message - }); - }; - webidl.errors.invalidArgument = function(context) { - return webidl.errors.exception({ - header: context.prefix, - message: `"${context.value}" is an invalid ${context.type}.` - }); - }; - webidl.brandCheck = function(V, I, opts = void 0) { - if (opts?.strict !== false && !(V instanceof I)) { - throw new TypeError("Illegal invocation"); - } else { - return V?.[Symbol.toStringTag] === I.prototype[Symbol.toStringTag]; - } - }; - webidl.argumentLengthCheck = function({ length }, min, ctx) { - if (length < min) { - throw webidl.errors.exception({ - message: `${min} argument${min !== 1 ? "s" : ""} required, but${length ? " only" : ""} ${length} found.`, - ...ctx - }); - } - }; - webidl.illegalConstructor = function() { - throw webidl.errors.exception({ - header: "TypeError", - message: "Illegal constructor" - }); - }; - webidl.util.Type = function(V) { - switch (typeof V) { - case "undefined": - return "Undefined"; - case "boolean": - return "Boolean"; - case "string": - return "String"; - case "symbol": - return "Symbol"; - case "number": - return "Number"; - case "bigint": - return "BigInt"; - case "function": - case "object": { - if (V === null) { - return "Null"; - } - return "Object"; - } - } - }; - webidl.util.ConvertToInt = function(V, bitLength, signedness, opts = {}) { - let upperBound; - let lowerBound; - if (bitLength === 64) { - upperBound = Math.pow(2, 53) - 1; - if (signedness === "unsigned") { - lowerBound = 0; - } else { - lowerBound = Math.pow(-2, 53) + 1; - } - } else if (signedness === "unsigned") { - lowerBound = 0; - upperBound = Math.pow(2, bitLength) - 1; - } else { - lowerBound = Math.pow(-2, bitLength) - 1; - upperBound = Math.pow(2, bitLength - 1) - 1; - } - let x = Number(V); - if (x === 0) { - x = 0; - } - if (opts.enforceRange === true) { - if (Number.isNaN(x) || x === Number.POSITIVE_INFINITY || x === Number.NEGATIVE_INFINITY) { - throw webidl.errors.exception({ - header: "Integer conversion", - message: `Could not convert ${V} to an integer.` - }); - } - x = webidl.util.IntegerPart(x); - if (x < lowerBound || x > upperBound) { - throw webidl.errors.exception({ - header: "Integer conversion", - message: `Value must be between ${lowerBound}-${upperBound}, got ${x}.` - }); - } - return x; - } - if (!Number.isNaN(x) && opts.clamp === true) { - x = Math.min(Math.max(x, lowerBound), upperBound); - if (Math.floor(x) % 2 === 0) { - x = Math.floor(x); - } else { - x = Math.ceil(x); - } - return x; - } - if (Number.isNaN(x) || x === 0 && Object.is(0, x) || x === Number.POSITIVE_INFINITY || x === Number.NEGATIVE_INFINITY) { - return 0; - } - x = webidl.util.IntegerPart(x); - x = x % Math.pow(2, bitLength); - if (signedness === "signed" && x >= Math.pow(2, bitLength) - 1) { - return x - Math.pow(2, bitLength); - } - return x; - }; - webidl.util.IntegerPart = function(n) { - const r = Math.floor(Math.abs(n)); - if (n < 0) { - return -1 * r; - } - return r; - }; - webidl.sequenceConverter = function(converter) { - return (V) => { - if (webidl.util.Type(V) !== "Object") { - throw webidl.errors.exception({ - header: "Sequence", - message: `Value of type ${webidl.util.Type(V)} is not an Object.` - }); - } - const method = V?.[Symbol.iterator]?.(); - const seq = []; - if (method === void 0 || typeof method.next !== "function") { - throw webidl.errors.exception({ - header: "Sequence", - message: "Object is not an iterator." - }); - } - while (true) { - const { done, value } = method.next(); - if (done) { - break; - } - seq.push(converter(value)); - } - return seq; - }; - }; - webidl.recordConverter = function(keyConverter, valueConverter) { - return (O2) => { - if (webidl.util.Type(O2) !== "Object") { - throw webidl.errors.exception({ - header: "Record", - message: `Value of type ${webidl.util.Type(O2)} is not an Object.` - }); - } - const result = {}; - if (!types.isProxy(O2)) { - const keys2 = Object.keys(O2); - for (const key of keys2) { - const typedKey = keyConverter(key); - const typedValue = valueConverter(O2[key]); - result[typedKey] = typedValue; - } - return result; - } - const keys = Reflect.ownKeys(O2); - for (const key of keys) { - const desc = Reflect.getOwnPropertyDescriptor(O2, key); - if (desc?.enumerable) { - const typedKey = keyConverter(key); - const typedValue = valueConverter(O2[key]); - result[typedKey] = typedValue; - } - } - return result; - }; - }; - webidl.interfaceConverter = function(i) { - return (V, opts = {}) => { - if (opts.strict !== false && !(V instanceof i)) { - throw webidl.errors.exception({ - header: i.name, - message: `Expected ${V} to be an instance of ${i.name}.` - }); - } - return V; - }; - }; - webidl.dictionaryConverter = function(converters) { - return (dictionary) => { - const type = webidl.util.Type(dictionary); - const dict = {}; - if (type === "Null" || type === "Undefined") { - return dict; - } else if (type !== "Object") { - throw webidl.errors.exception({ - header: "Dictionary", - message: `Expected ${dictionary} to be one of: Null, Undefined, Object.` - }); - } - for (const options2 of converters) { - const { key, defaultValue, required, converter } = options2; - if (required === true) { - if (!hasOwn(dictionary, key)) { - throw webidl.errors.exception({ - header: "Dictionary", - message: `Missing required key "${key}".` - }); - } - } - let value = dictionary[key]; - const hasDefault = hasOwn(options2, "defaultValue"); - if (hasDefault && value !== null) { - value = value ?? defaultValue; - } - if (required || hasDefault || value !== void 0) { - value = converter(value); - if (options2.allowedValues && !options2.allowedValues.includes(value)) { - throw webidl.errors.exception({ - header: "Dictionary", - message: `${value} is not an accepted type. Expected one of ${options2.allowedValues.join(", ")}.` - }); - } - dict[key] = value; - } - } - return dict; - }; - }; - webidl.nullableConverter = function(converter) { - return (V) => { - if (V === null) { - return V; - } - return converter(V); - }; - }; - webidl.converters.DOMString = function(V, opts = {}) { - if (V === null && opts.legacyNullToEmptyString) { - return ""; - } - if (typeof V === "symbol") { - throw new TypeError("Could not convert argument of type symbol to string."); - } - return String(V); - }; - webidl.converters.ByteString = function(V) { - const x = webidl.converters.DOMString(V); - for (let index = 0; index < x.length; index++) { - const charCode = x.charCodeAt(index); - if (charCode > 255) { - throw new TypeError( - `Cannot convert argument to a ByteString because the character at index ${index} has a value of ${charCode} which is greater than 255.` - ); - } - } - return x; - }; - webidl.converters.USVString = toUSVString; - webidl.converters.boolean = function(V) { - const x = Boolean(V); - return x; - }; - webidl.converters.any = function(V) { - return V; - }; - webidl.converters["long long"] = function(V) { - const x = webidl.util.ConvertToInt(V, 64, "signed"); - return x; - }; - webidl.converters["unsigned long long"] = function(V) { - const x = webidl.util.ConvertToInt(V, 64, "unsigned"); - return x; - }; - webidl.converters["unsigned long"] = function(V) { - const x = webidl.util.ConvertToInt(V, 32, "unsigned"); - return x; - }; - webidl.converters["unsigned short"] = function(V, opts) { - const x = webidl.util.ConvertToInt(V, 16, "unsigned", opts); - return x; - }; - webidl.converters.ArrayBuffer = function(V, opts = {}) { - if (webidl.util.Type(V) !== "Object" || !types.isAnyArrayBuffer(V)) { - throw webidl.errors.conversionFailed({ - prefix: `${V}`, - argument: `${V}`, - types: ["ArrayBuffer"] - }); - } - if (opts.allowShared === false && types.isSharedArrayBuffer(V)) { - throw webidl.errors.exception({ - header: "ArrayBuffer", - message: "SharedArrayBuffer is not allowed." - }); - } - return V; - }; - webidl.converters.TypedArray = function(V, T2, opts = {}) { - if (webidl.util.Type(V) !== "Object" || !types.isTypedArray(V) || V.constructor.name !== T2.name) { - throw webidl.errors.conversionFailed({ - prefix: `${T2.name}`, - argument: `${V}`, - types: [T2.name] - }); - } - if (opts.allowShared === false && types.isSharedArrayBuffer(V.buffer)) { - throw webidl.errors.exception({ - header: "ArrayBuffer", - message: "SharedArrayBuffer is not allowed." - }); - } - return V; - }; - webidl.converters.DataView = function(V, opts = {}) { - if (webidl.util.Type(V) !== "Object" || !types.isDataView(V)) { - throw webidl.errors.exception({ - header: "DataView", - message: "Object is not a DataView." - }); - } - if (opts.allowShared === false && types.isSharedArrayBuffer(V.buffer)) { - throw webidl.errors.exception({ - header: "ArrayBuffer", - message: "SharedArrayBuffer is not allowed." - }); - } - return V; - }; - webidl.converters.BufferSource = function(V, opts = {}) { - if (types.isAnyArrayBuffer(V)) { - return webidl.converters.ArrayBuffer(V, opts); - } - if (types.isTypedArray(V)) { - return webidl.converters.TypedArray(V, V.constructor); - } - if (types.isDataView(V)) { - return webidl.converters.DataView(V, opts); - } - throw new TypeError(`Could not convert ${V} to a BufferSource.`); - }; - webidl.converters["sequence"] = webidl.sequenceConverter( - webidl.converters.ByteString - ); - webidl.converters["sequence>"] = webidl.sequenceConverter( - webidl.converters["sequence"] - ); - webidl.converters["record"] = webidl.recordConverter( - webidl.converters.ByteString, - webidl.converters.ByteString - ); - module2.exports = { - webidl - }; - } -}); - -// node_modules/undici/lib/fetch/dataURL.js -var require_dataURL = __commonJS({ - "node_modules/undici/lib/fetch/dataURL.js"(exports2, module2) { - var assert = require("assert"); - var { atob: atob2 } = require("buffer"); - var { isomorphicDecode } = require_util5(); - var encoder = new TextEncoder(); - var HTTP_TOKEN_CODEPOINTS = /^[!#$%&'*+-.^_|~A-Za-z0-9]+$/; - var HTTP_WHITESPACE_REGEX = /(\u000A|\u000D|\u0009|\u0020)/; - var HTTP_QUOTED_STRING_TOKENS = /[\u0009|\u0020-\u007E|\u0080-\u00FF]/; - function dataURLProcessor(dataURL) { - assert(dataURL.protocol === "data:"); - let input = URLSerializer(dataURL, true); - input = input.slice(5); - const position = { position: 0 }; - let mimeType = collectASequenceOfCodePointsFast( - ",", - input, - position - ); - const mimeTypeLength = mimeType.length; - mimeType = removeASCIIWhitespace(mimeType, true, true); - if (position.position >= input.length) { - return "failure"; - } - position.position++; - const encodedBody = input.slice(mimeTypeLength + 1); - let body = stringPercentDecode(encodedBody); - if (/;(\u0020){0,}base64$/i.test(mimeType)) { - const stringBody = isomorphicDecode(body); - body = forgivingBase64(stringBody); - if (body === "failure") { - return "failure"; - } - mimeType = mimeType.slice(0, -6); - mimeType = mimeType.replace(/(\u0020)+$/, ""); - mimeType = mimeType.slice(0, -1); - } - if (mimeType.startsWith(";")) { - mimeType = "text/plain" + mimeType; - } - let mimeTypeRecord = parseMIMEType(mimeType); - if (mimeTypeRecord === "failure") { - mimeTypeRecord = parseMIMEType("text/plain;charset=US-ASCII"); - } - return { mimeType: mimeTypeRecord, body }; - } - function URLSerializer(url, excludeFragment = false) { - const href = url.href; - if (!excludeFragment) { - return href; - } - const hash = href.lastIndexOf("#"); - if (hash === -1) { - return href; - } - return href.slice(0, hash); - } - function collectASequenceOfCodePoints(condition, input, position) { - let result = ""; - while (position.position < input.length && condition(input[position.position])) { - result += input[position.position]; - position.position++; - } - return result; - } - function collectASequenceOfCodePointsFast(char, input, position) { - const idx = input.indexOf(char, position.position); - const start = position.position; - if (idx === -1) { - position.position = input.length; - return input.slice(start); - } - position.position = idx; - return input.slice(start, position.position); - } - function stringPercentDecode(input) { - const bytes = encoder.encode(input); - return percentDecode(bytes); - } - function percentDecode(input) { - const output = []; - for (let i = 0; i < input.length; i++) { - const byte = input[i]; - if (byte !== 37) { - output.push(byte); - } else if (byte === 37 && !/^[0-9A-Fa-f]{2}$/i.test(String.fromCharCode(input[i + 1], input[i + 2]))) { - output.push(37); - } else { - const nextTwoBytes = String.fromCharCode(input[i + 1], input[i + 2]); - const bytePoint = Number.parseInt(nextTwoBytes, 16); - output.push(bytePoint); - i += 2; - } - } - return Uint8Array.from(output); - } - function parseMIMEType(input) { - input = removeHTTPWhitespace(input, true, true); - const position = { position: 0 }; - const type = collectASequenceOfCodePointsFast( - "/", - input, - position - ); - if (type.length === 0 || !HTTP_TOKEN_CODEPOINTS.test(type)) { - return "failure"; - } - if (position.position > input.length) { - return "failure"; - } - position.position++; - let subtype = collectASequenceOfCodePointsFast( - ";", - input, - position - ); - subtype = removeHTTPWhitespace(subtype, false, true); - if (subtype.length === 0 || !HTTP_TOKEN_CODEPOINTS.test(subtype)) { - return "failure"; - } - const typeLowercase = type.toLowerCase(); - const subtypeLowercase = subtype.toLowerCase(); - const mimeType = { - type: typeLowercase, - subtype: subtypeLowercase, - /** @type {Map} */ - parameters: /* @__PURE__ */ new Map(), - // https://mimesniff.spec.whatwg.org/#mime-type-essence - essence: `${typeLowercase}/${subtypeLowercase}` - }; - while (position.position < input.length) { - position.position++; - collectASequenceOfCodePoints( - // https://fetch.spec.whatwg.org/#http-whitespace - (char) => HTTP_WHITESPACE_REGEX.test(char), - input, - position - ); - let parameterName = collectASequenceOfCodePoints( - (char) => char !== ";" && char !== "=", - input, - position - ); - parameterName = parameterName.toLowerCase(); - if (position.position < input.length) { - if (input[position.position] === ";") { - continue; - } - position.position++; - } - if (position.position > input.length) { - break; - } - let parameterValue = null; - if (input[position.position] === '"') { - parameterValue = collectAnHTTPQuotedString(input, position, true); - collectASequenceOfCodePointsFast( - ";", - input, - position - ); - } else { - parameterValue = collectASequenceOfCodePointsFast( - ";", - input, - position - ); - parameterValue = removeHTTPWhitespace(parameterValue, false, true); - if (parameterValue.length === 0) { - continue; - } - } - if (parameterName.length !== 0 && HTTP_TOKEN_CODEPOINTS.test(parameterName) && (parameterValue.length === 0 || HTTP_QUOTED_STRING_TOKENS.test(parameterValue)) && !mimeType.parameters.has(parameterName)) { - mimeType.parameters.set(parameterName, parameterValue); - } - } - return mimeType; - } - function forgivingBase64(data) { - data = data.replace(/[\u0009\u000A\u000C\u000D\u0020]/g, ""); - if (data.length % 4 === 0) { - data = data.replace(/=?=$/, ""); - } - if (data.length % 4 === 1) { - return "failure"; - } - if (/[^+/0-9A-Za-z]/.test(data)) { - return "failure"; - } - const binary = atob2(data); - const bytes = new Uint8Array(binary.length); - for (let byte = 0; byte < binary.length; byte++) { - bytes[byte] = binary.charCodeAt(byte); - } - return bytes; - } - function collectAnHTTPQuotedString(input, position, extractValue) { - const positionStart = position.position; - let value = ""; - assert(input[position.position] === '"'); - position.position++; - while (true) { - value += collectASequenceOfCodePoints( - (char) => char !== '"' && char !== "\\", - input, - position - ); - if (position.position >= input.length) { - break; - } - const quoteOrBackslash = input[position.position]; - position.position++; - if (quoteOrBackslash === "\\") { - if (position.position >= input.length) { - value += "\\"; - break; - } - value += input[position.position]; - position.position++; - } else { - assert(quoteOrBackslash === '"'); - break; - } - } - if (extractValue) { - return value; - } - return input.slice(positionStart, position.position); - } - function serializeAMimeType(mimeType) { - assert(mimeType !== "failure"); - const { parameters, essence } = mimeType; - let serialization = essence; - for (let [name, value] of parameters.entries()) { - serialization += ";"; - serialization += name; - serialization += "="; - if (!HTTP_TOKEN_CODEPOINTS.test(value)) { - value = value.replace(/(\\|")/g, "\\$1"); - value = '"' + value; - value += '"'; - } - serialization += value; - } - return serialization; - } - function isHTTPWhiteSpace(char) { - return char === "\r" || char === "\n" || char === " " || char === " "; - } - function removeHTTPWhitespace(str, leading = true, trailing = true) { - let lead = 0; - let trail = str.length - 1; - if (leading) { - for (; lead < str.length && isHTTPWhiteSpace(str[lead]); lead++) - ; - } - if (trailing) { - for (; trail > 0 && isHTTPWhiteSpace(str[trail]); trail--) - ; - } - return str.slice(lead, trail + 1); - } - function isASCIIWhitespace(char) { - return char === "\r" || char === "\n" || char === " " || char === "\f" || char === " "; - } - function removeASCIIWhitespace(str, leading = true, trailing = true) { - let lead = 0; - let trail = str.length - 1; - if (leading) { - for (; lead < str.length && isASCIIWhitespace(str[lead]); lead++) - ; - } - if (trailing) { - for (; trail > 0 && isASCIIWhitespace(str[trail]); trail--) - ; - } - return str.slice(lead, trail + 1); - } - module2.exports = { - dataURLProcessor, - URLSerializer, - collectASequenceOfCodePoints, - collectASequenceOfCodePointsFast, - stringPercentDecode, - parseMIMEType, - collectAnHTTPQuotedString, - serializeAMimeType - }; - } -}); - -// node_modules/undici/lib/fetch/file.js -var require_file = __commonJS({ - "node_modules/undici/lib/fetch/file.js"(exports2, module2) { - "use strict"; - var { Blob: Blob2, File: NativeFile } = require("buffer"); - var { types } = require("util"); - var { kState } = require_symbols2(); - var { isBlobLike } = require_util5(); - var { webidl } = require_webidl(); - var { parseMIMEType, serializeAMimeType } = require_dataURL(); - var { kEnumerableProperty } = require_util4(); - var File = class _File extends Blob2 { - constructor(fileBits, fileName, options2 = {}) { - webidl.argumentLengthCheck(arguments, 2, { header: "File constructor" }); - fileBits = webidl.converters["sequence"](fileBits); - fileName = webidl.converters.USVString(fileName); - options2 = webidl.converters.FilePropertyBag(options2); - const n = fileName; - let t = options2.type; - let d; - substep: { - if (t) { - t = parseMIMEType(t); - if (t === "failure") { - t = ""; - break substep; - } - t = serializeAMimeType(t).toLowerCase(); - } - d = options2.lastModified; - } - super(processBlobParts(fileBits, options2), { type: t }); - this[kState] = { - name: n, - lastModified: d, - type: t - }; - } - get name() { - webidl.brandCheck(this, _File); - return this[kState].name; - } - get lastModified() { - webidl.brandCheck(this, _File); - return this[kState].lastModified; - } - get type() { - webidl.brandCheck(this, _File); - return this[kState].type; - } - }; - var FileLike = class _FileLike { - constructor(blobLike, fileName, options2 = {}) { - const n = fileName; - const t = options2.type; - const d = options2.lastModified ?? Date.now(); - this[kState] = { - blobLike, - name: n, - type: t, - lastModified: d - }; - } - stream(...args) { - webidl.brandCheck(this, _FileLike); - return this[kState].blobLike.stream(...args); - } - arrayBuffer(...args) { - webidl.brandCheck(this, _FileLike); - return this[kState].blobLike.arrayBuffer(...args); - } - slice(...args) { - webidl.brandCheck(this, _FileLike); - return this[kState].blobLike.slice(...args); - } - text(...args) { - webidl.brandCheck(this, _FileLike); - return this[kState].blobLike.text(...args); - } - get size() { - webidl.brandCheck(this, _FileLike); - return this[kState].blobLike.size; - } - get type() { - webidl.brandCheck(this, _FileLike); - return this[kState].blobLike.type; - } - get name() { - webidl.brandCheck(this, _FileLike); - return this[kState].name; - } - get lastModified() { - webidl.brandCheck(this, _FileLike); - return this[kState].lastModified; - } - get [Symbol.toStringTag]() { - return "File"; - } - }; - Object.defineProperties(File.prototype, { - [Symbol.toStringTag]: { - value: "File", - configurable: true - }, - name: kEnumerableProperty, - lastModified: kEnumerableProperty - }); - webidl.converters.Blob = webidl.interfaceConverter(Blob2); - webidl.converters.BlobPart = function(V, opts) { - if (webidl.util.Type(V) === "Object") { - if (isBlobLike(V)) { - return webidl.converters.Blob(V, { strict: false }); - } - if (ArrayBuffer.isView(V) || types.isAnyArrayBuffer(V)) { - return webidl.converters.BufferSource(V, opts); - } - } - return webidl.converters.USVString(V, opts); - }; - webidl.converters["sequence"] = webidl.sequenceConverter( - webidl.converters.BlobPart - ); - webidl.converters.FilePropertyBag = webidl.dictionaryConverter([ - { - key: "lastModified", - converter: webidl.converters["long long"], - get defaultValue() { - return Date.now(); - } - }, - { - key: "type", - converter: webidl.converters.DOMString, - defaultValue: "" - }, - { - key: "endings", - converter: (value) => { - value = webidl.converters.DOMString(value); - value = value.toLowerCase(); - if (value !== "native") { - value = "transparent"; - } - return value; - }, - defaultValue: "transparent" - } - ]); - function processBlobParts(parts, options2) { - const bytes = []; - for (const element of parts) { - if (typeof element === "string") { - let s = element; - if (options2.endings === "native") { - s = convertLineEndingsNative(s); - } - bytes.push(new TextEncoder().encode(s)); - } else if (types.isAnyArrayBuffer(element) || types.isTypedArray(element)) { - if (!element.buffer) { - bytes.push(new Uint8Array(element)); - } else { - bytes.push( - new Uint8Array(element.buffer, element.byteOffset, element.byteLength) - ); - } - } else if (isBlobLike(element)) { - bytes.push(element); - } - } - return bytes; - } - function convertLineEndingsNative(s) { - let nativeLineEnding = "\n"; - if (process.platform === "win32") { - nativeLineEnding = "\r\n"; - } - return s.replace(/\r?\n/g, nativeLineEnding); - } - function isFileLike(object) { - return NativeFile && object instanceof NativeFile || object instanceof File || object && (typeof object.stream === "function" || typeof object.arrayBuffer === "function") && object[Symbol.toStringTag] === "File"; - } - module2.exports = { File, FileLike, isFileLike }; - } -}); - -// node_modules/undici/lib/fetch/formdata.js -var require_formdata = __commonJS({ - "node_modules/undici/lib/fetch/formdata.js"(exports2, module2) { - "use strict"; - var { isBlobLike, toUSVString, makeIterator } = require_util5(); - var { kState } = require_symbols2(); - var { File: UndiciFile, FileLike, isFileLike } = require_file(); - var { webidl } = require_webidl(); - var { Blob: Blob2, File: NativeFile } = require("buffer"); - var File = NativeFile ?? UndiciFile; - var FormData = class _FormData { - constructor(form) { - if (form !== void 0) { - throw webidl.errors.conversionFailed({ - prefix: "FormData constructor", - argument: "Argument 1", - types: ["undefined"] - }); - } - this[kState] = []; - } - append(name, value, filename = void 0) { - webidl.brandCheck(this, _FormData); - webidl.argumentLengthCheck(arguments, 2, { header: "FormData.append" }); - if (arguments.length === 3 && !isBlobLike(value)) { - throw new TypeError( - "Failed to execute 'append' on 'FormData': parameter 2 is not of type 'Blob'" - ); - } - name = webidl.converters.USVString(name); - value = isBlobLike(value) ? webidl.converters.Blob(value, { strict: false }) : webidl.converters.USVString(value); - filename = arguments.length === 3 ? webidl.converters.USVString(filename) : void 0; - const entry = makeEntry(name, value, filename); - this[kState].push(entry); - } - delete(name) { - webidl.brandCheck(this, _FormData); - webidl.argumentLengthCheck(arguments, 1, { header: "FormData.delete" }); - name = webidl.converters.USVString(name); - this[kState] = this[kState].filter((entry) => entry.name !== name); - } - get(name) { - webidl.brandCheck(this, _FormData); - webidl.argumentLengthCheck(arguments, 1, { header: "FormData.get" }); - name = webidl.converters.USVString(name); - const idx = this[kState].findIndex((entry) => entry.name === name); - if (idx === -1) { - return null; - } - return this[kState][idx].value; - } - getAll(name) { - webidl.brandCheck(this, _FormData); - webidl.argumentLengthCheck(arguments, 1, { header: "FormData.getAll" }); - name = webidl.converters.USVString(name); - return this[kState].filter((entry) => entry.name === name).map((entry) => entry.value); - } - has(name) { - webidl.brandCheck(this, _FormData); - webidl.argumentLengthCheck(arguments, 1, { header: "FormData.has" }); - name = webidl.converters.USVString(name); - return this[kState].findIndex((entry) => entry.name === name) !== -1; - } - set(name, value, filename = void 0) { - webidl.brandCheck(this, _FormData); - webidl.argumentLengthCheck(arguments, 2, { header: "FormData.set" }); - if (arguments.length === 3 && !isBlobLike(value)) { - throw new TypeError( - "Failed to execute 'set' on 'FormData': parameter 2 is not of type 'Blob'" - ); - } - name = webidl.converters.USVString(name); - value = isBlobLike(value) ? webidl.converters.Blob(value, { strict: false }) : webidl.converters.USVString(value); - filename = arguments.length === 3 ? toUSVString(filename) : void 0; - const entry = makeEntry(name, value, filename); - const idx = this[kState].findIndex((entry2) => entry2.name === name); - if (idx !== -1) { - this[kState] = [ - ...this[kState].slice(0, idx), - entry, - ...this[kState].slice(idx + 1).filter((entry2) => entry2.name !== name) - ]; - } else { - this[kState].push(entry); - } - } - entries() { - webidl.brandCheck(this, _FormData); - return makeIterator( - () => this[kState].map((pair) => [pair.name, pair.value]), - "FormData", - "key+value" - ); - } - keys() { - webidl.brandCheck(this, _FormData); - return makeIterator( - () => this[kState].map((pair) => [pair.name, pair.value]), - "FormData", - "key" - ); - } - values() { - webidl.brandCheck(this, _FormData); - return makeIterator( - () => this[kState].map((pair) => [pair.name, pair.value]), - "FormData", - "value" - ); - } - /** - * @param {(value: string, key: string, self: FormData) => void} callbackFn - * @param {unknown} thisArg - */ - forEach(callbackFn, thisArg = globalThis) { - webidl.brandCheck(this, _FormData); - webidl.argumentLengthCheck(arguments, 1, { header: "FormData.forEach" }); - if (typeof callbackFn !== "function") { - throw new TypeError( - "Failed to execute 'forEach' on 'FormData': parameter 1 is not of type 'Function'." - ); - } - for (const [key, value] of this) { - callbackFn.apply(thisArg, [value, key, this]); - } - } - }; - FormData.prototype[Symbol.iterator] = FormData.prototype.entries; - Object.defineProperties(FormData.prototype, { - [Symbol.toStringTag]: { - value: "FormData", - configurable: true - } - }); - function makeEntry(name, value, filename) { - name = Buffer.from(name).toString("utf8"); - if (typeof value === "string") { - value = Buffer.from(value).toString("utf8"); - } else { - if (!isFileLike(value)) { - value = value instanceof Blob2 ? new File([value], "blob", { type: value.type }) : new FileLike(value, "blob", { type: value.type }); - } - if (filename !== void 0) { - const options2 = { - type: value.type, - lastModified: value.lastModified - }; - value = NativeFile && value instanceof NativeFile || value instanceof UndiciFile ? new File([value], filename, options2) : new FileLike(value, filename, options2); - } - } - return { name, value }; - } - module2.exports = { FormData }; - } -}); - -// node_modules/undici/lib/fetch/body.js -var require_body = __commonJS({ - "node_modules/undici/lib/fetch/body.js"(exports2, module2) { - "use strict"; - var Busboy = require_lib(); - var util = require_util4(); - var { - ReadableStreamFrom, - isBlobLike, - isReadableStreamLike, - readableStreamClose, - createDeferredPromise, - fullyReadBody - } = require_util5(); - var { FormData } = require_formdata(); - var { kState } = require_symbols2(); - var { webidl } = require_webidl(); - var { DOMException: DOMException2, structuredClone } = require_constants2(); - var { Blob: Blob2, File: NativeFile } = require("buffer"); - var { kBodyUsed } = require_symbols(); - var assert = require("assert"); - var { isErrored } = require_util4(); - var { isUint8Array, isArrayBuffer } = require("util/types"); - var { File: UndiciFile } = require_file(); - var { parseMIMEType, serializeAMimeType } = require_dataURL(); - var ReadableStream = globalThis.ReadableStream; - var File = NativeFile ?? UndiciFile; - function extractBody(object, keepalive = false) { - if (!ReadableStream) { - ReadableStream = require("stream/web").ReadableStream; - } - let stream = null; - if (object instanceof ReadableStream) { - stream = object; - } else if (isBlobLike(object)) { - stream = object.stream(); - } else { - stream = new ReadableStream({ - async pull(controller) { - controller.enqueue( - typeof source === "string" ? new TextEncoder().encode(source) : source - ); - queueMicrotask(() => readableStreamClose(controller)); - }, - start() { - }, - type: void 0 - }); - } - assert(isReadableStreamLike(stream)); - let action = null; - let source = null; - let length = null; - let type = null; - if (typeof object === "string") { - source = object; - type = "text/plain;charset=UTF-8"; - } else if (object instanceof URLSearchParams) { - source = object.toString(); - type = "application/x-www-form-urlencoded;charset=UTF-8"; - } else if (isArrayBuffer(object)) { - source = new Uint8Array(object.slice()); - } else if (ArrayBuffer.isView(object)) { - source = new Uint8Array(object.buffer.slice(object.byteOffset, object.byteOffset + object.byteLength)); - } else if (util.isFormDataLike(object)) { - const boundary = `----formdata-undici-0${`${Math.floor(Math.random() * 1e11)}`.padStart(11, "0")}`; - const prefix = `--${boundary}\r -Content-Disposition: form-data`; - const escape2 = (str) => str.replace(/\n/g, "%0A").replace(/\r/g, "%0D").replace(/"/g, "%22"); - const normalizeLinefeeds = (value) => value.replace(/\r?\n|\r/g, "\r\n"); - const enc = new TextEncoder(); - const blobParts = []; - const rn = new Uint8Array([13, 10]); - length = 0; - let hasUnknownSizeValue = false; - for (const [name, value] of object) { - if (typeof value === "string") { - const chunk2 = enc.encode(prefix + `; name="${escape2(normalizeLinefeeds(name))}"\r -\r -${normalizeLinefeeds(value)}\r -`); - blobParts.push(chunk2); - length += chunk2.byteLength; - } else { - const chunk2 = enc.encode(`${prefix}; name="${escape2(normalizeLinefeeds(name))}"` + (value.name ? `; filename="${escape2(value.name)}"` : "") + `\r -Content-Type: ${value.type || "application/octet-stream"}\r -\r -`); - blobParts.push(chunk2, value, rn); - if (typeof value.size === "number") { - length += chunk2.byteLength + value.size + rn.byteLength; - } else { - hasUnknownSizeValue = true; - } - } - } - const chunk = enc.encode(`--${boundary}--`); - blobParts.push(chunk); - length += chunk.byteLength; - if (hasUnknownSizeValue) { - length = null; - } - source = object; - action = async function* () { - for (const part of blobParts) { - if (part.stream) { - yield* part.stream(); - } else { - yield part; - } - } - }; - type = "multipart/form-data; boundary=" + boundary; - } else if (isBlobLike(object)) { - source = object; - length = object.size; - if (object.type) { - type = object.type; - } - } else if (typeof object[Symbol.asyncIterator] === "function") { - if (keepalive) { - throw new TypeError("keepalive"); - } - if (util.isDisturbed(object) || object.locked) { - throw new TypeError( - "Response body object should not be disturbed or locked" - ); - } - stream = object instanceof ReadableStream ? object : ReadableStreamFrom(object); - } - if (typeof source === "string" || util.isBuffer(source)) { - length = Buffer.byteLength(source); - } - if (action != null) { - let iterator; - stream = new ReadableStream({ - async start() { - iterator = action(object)[Symbol.asyncIterator](); - }, - async pull(controller) { - const { value, done } = await iterator.next(); - if (done) { - queueMicrotask(() => { - controller.close(); - }); - } else { - if (!isErrored(stream)) { - controller.enqueue(new Uint8Array(value)); - } - } - return controller.desiredSize > 0; - }, - async cancel(reason) { - await iterator.return(); - }, - type: void 0 - }); - } - const body = { stream, source, length }; - return [body, type]; - } - function safelyExtractBody(object, keepalive = false) { - if (!ReadableStream) { - ReadableStream = require("stream/web").ReadableStream; - } - if (object instanceof ReadableStream) { - assert(!util.isDisturbed(object), "The body has already been consumed."); - assert(!object.locked, "The stream is locked."); - } - return extractBody(object, keepalive); - } - function cloneBody(body) { - const [out1, out2] = body.stream.tee(); - const out2Clone = structuredClone(out2, { transfer: [out2] }); - const [, finalClone] = out2Clone.tee(); - body.stream = out1; - return { - stream: finalClone, - length: body.length, - source: body.source - }; - } - async function* consumeBody(body) { - if (body) { - if (isUint8Array(body)) { - yield body; - } else { - const stream = body.stream; - if (util.isDisturbed(stream)) { - throw new TypeError("The body has already been consumed."); - } - if (stream.locked) { - throw new TypeError("The stream is locked."); - } - stream[kBodyUsed] = true; - yield* stream; - } - } - } - function throwIfAborted(state) { - if (state.aborted) { - throw new DOMException2("The operation was aborted.", "AbortError"); - } - } - function bodyMixinMethods(instance) { - const methods = { - blob() { - return specConsumeBody(this, (bytes) => { - let mimeType = bodyMimeType(this); - if (mimeType === "failure") { - mimeType = ""; - } else if (mimeType) { - mimeType = serializeAMimeType(mimeType); - } - return new Blob2([bytes], { type: mimeType }); - }, instance); - }, - arrayBuffer() { - return specConsumeBody(this, (bytes) => { - return new Uint8Array(bytes).buffer; - }, instance); - }, - text() { - return specConsumeBody(this, utf8DecodeBytes, instance); - }, - json() { - return specConsumeBody(this, parseJSONFromBytes, instance); - }, - async formData() { - webidl.brandCheck(this, instance); - throwIfAborted(this[kState]); - const contentType = this.headers.get("Content-Type"); - if (/multipart\/form-data/.test(contentType)) { - const headers = {}; - for (const [key, value] of this.headers) - headers[key.toLowerCase()] = value; - const responseFormData = new FormData(); - let busboy; - try { - busboy = Busboy({ - headers, - defParamCharset: "utf8" - }); - } catch (err) { - throw new DOMException2(`${err}`, "AbortError"); - } - busboy.on("field", (name, value) => { - responseFormData.append(name, value); - }); - busboy.on("file", (name, value, info2) => { - const { filename, encoding, mimeType } = info2; - const chunks = []; - if (encoding === "base64" || encoding.toLowerCase() === "base64") { - let base64chunk = ""; - value.on("data", (chunk) => { - base64chunk += chunk.toString().replace(/[\r\n]/gm, ""); - const end = base64chunk.length - base64chunk.length % 4; - chunks.push(Buffer.from(base64chunk.slice(0, end), "base64")); - base64chunk = base64chunk.slice(end); - }); - value.on("end", () => { - chunks.push(Buffer.from(base64chunk, "base64")); - responseFormData.append(name, new File(chunks, filename, { type: mimeType })); - }); - } else { - value.on("data", (chunk) => { - chunks.push(chunk); - }); - value.on("end", () => { - responseFormData.append(name, new File(chunks, filename, { type: mimeType })); - }); - } - }); - const busboyResolve = new Promise((resolve, reject) => { - busboy.on("finish", resolve); - busboy.on("error", (err) => reject(new TypeError(err))); - }); - if (this.body !== null) - for await (const chunk of consumeBody(this[kState].body)) - busboy.write(chunk); - busboy.end(); - await busboyResolve; - return responseFormData; - } else if (/application\/x-www-form-urlencoded/.test(contentType)) { - let entries; - try { - let text = ""; - const textDecoder = new TextDecoder("utf-8", { ignoreBOM: true }); - for await (const chunk of consumeBody(this[kState].body)) { - if (!isUint8Array(chunk)) { - throw new TypeError("Expected Uint8Array chunk"); - } - text += textDecoder.decode(chunk, { stream: true }); - } - text += textDecoder.decode(); - entries = new URLSearchParams(text); - } catch (err) { - throw Object.assign(new TypeError(), { cause: err }); - } - const formData = new FormData(); - for (const [name, value] of entries) { - formData.append(name, value); - } - return formData; - } else { - await Promise.resolve(); - throwIfAborted(this[kState]); - throw webidl.errors.exception({ - header: `${instance.name}.formData`, - message: "Could not parse content as FormData." - }); - } - } - }; - return methods; - } - function mixinBody(prototype) { - Object.assign(prototype.prototype, bodyMixinMethods(prototype)); - } - async function specConsumeBody(object, convertBytesToJSValue, instance) { - webidl.brandCheck(object, instance); - throwIfAborted(object[kState]); - if (bodyUnusable(object[kState].body)) { - throw new TypeError("Body is unusable"); - } - const promise = createDeferredPromise(); - const errorSteps = (error2) => promise.reject(error2); - const successSteps = (data) => { - try { - promise.resolve(convertBytesToJSValue(data)); - } catch (e) { - errorSteps(e); - } - }; - if (object[kState].body == null) { - successSteps(new Uint8Array()); - return promise.promise; - } - fullyReadBody(object[kState].body, successSteps, errorSteps); - return promise.promise; - } - function bodyUnusable(body) { - return body != null && (body.stream.locked || util.isDisturbed(body.stream)); - } - function utf8DecodeBytes(buffer) { - if (buffer.length === 0) { - return ""; - } - if (buffer[0] === 239 && buffer[1] === 187 && buffer[2] === 191) { - buffer = buffer.subarray(3); - } - const output = new TextDecoder().decode(buffer); - return output; - } - function parseJSONFromBytes(bytes) { - return JSON.parse(utf8DecodeBytes(bytes)); - } - function bodyMimeType(object) { - const { headersList } = object[kState]; - const contentType = headersList.get("content-type"); - if (contentType === null) { - return "failure"; - } - return parseMIMEType(contentType); - } - module2.exports = { - extractBody, - safelyExtractBody, - cloneBody, - mixinBody - }; - } -}); - -// node_modules/undici/lib/core/request.js -var require_request = __commonJS({ - "node_modules/undici/lib/core/request.js"(exports2, module2) { - "use strict"; - var { - InvalidArgumentError, - NotSupportedError - } = require_errors(); - var assert = require("assert"); - var util = require_util4(); - var tokenRegExp = /^[\^_`a-zA-Z\-0-9!#$%&'*+.|~]+$/; - var headerCharRegex = /[^\t\x20-\x7e\x80-\xff]/; - var invalidPathRegex = /[^\u0021-\u00ff]/; - var kHandler = Symbol("handler"); - var channels = {}; - var extractBody; - try { - const diagnosticsChannel = require("diagnostics_channel"); - channels.create = diagnosticsChannel.channel("undici:request:create"); - channels.bodySent = diagnosticsChannel.channel("undici:request:bodySent"); - channels.headers = diagnosticsChannel.channel("undici:request:headers"); - channels.trailers = diagnosticsChannel.channel("undici:request:trailers"); - channels.error = diagnosticsChannel.channel("undici:request:error"); - } catch { - channels.create = { hasSubscribers: false }; - channels.bodySent = { hasSubscribers: false }; - channels.headers = { hasSubscribers: false }; - channels.trailers = { hasSubscribers: false }; - channels.error = { hasSubscribers: false }; - } - var Request = class { - constructor(origin, { - path, - method, - body, - headers, - query, - idempotent, - blocking, - upgrade, - headersTimeout, - bodyTimeout, - reset, - throwOnError - }, handler2) { - if (typeof path !== "string") { - throw new InvalidArgumentError("path must be a string"); - } else if (path[0] !== "/" && !(path.startsWith("http://") || path.startsWith("https://")) && method !== "CONNECT") { - throw new InvalidArgumentError("path must be an absolute URL or start with a slash"); - } else if (invalidPathRegex.exec(path) !== null) { - throw new InvalidArgumentError("invalid request path"); - } - if (typeof method !== "string") { - throw new InvalidArgumentError("method must be a string"); - } else if (tokenRegExp.exec(method) === null) { - throw new InvalidArgumentError("invalid request method"); - } - if (upgrade && typeof upgrade !== "string") { - throw new InvalidArgumentError("upgrade must be a string"); - } - if (headersTimeout != null && (!Number.isFinite(headersTimeout) || headersTimeout < 0)) { - throw new InvalidArgumentError("invalid headersTimeout"); - } - if (bodyTimeout != null && (!Number.isFinite(bodyTimeout) || bodyTimeout < 0)) { - throw new InvalidArgumentError("invalid bodyTimeout"); - } - if (reset != null && typeof reset !== "boolean") { - throw new InvalidArgumentError("invalid reset"); - } - this.headersTimeout = headersTimeout; - this.bodyTimeout = bodyTimeout; - this.throwOnError = throwOnError === true; - this.method = method; - if (body == null) { - this.body = null; - } else if (util.isStream(body)) { - this.body = body; - } else if (util.isBuffer(body)) { - this.body = body.byteLength ? body : null; - } else if (ArrayBuffer.isView(body)) { - this.body = body.buffer.byteLength ? Buffer.from(body.buffer, body.byteOffset, body.byteLength) : null; - } else if (body instanceof ArrayBuffer) { - this.body = body.byteLength ? Buffer.from(body) : null; - } else if (typeof body === "string") { - this.body = body.length ? Buffer.from(body) : null; - } else if (util.isFormDataLike(body) || util.isIterable(body) || util.isBlobLike(body)) { - this.body = body; - } else { - throw new InvalidArgumentError("body must be a string, a Buffer, a Readable stream, an iterable, or an async iterable"); - } - this.completed = false; - this.aborted = false; - this.upgrade = upgrade || null; - this.path = query ? util.buildURL(path, query) : path; - this.origin = origin; - this.idempotent = idempotent == null ? method === "HEAD" || method === "GET" : idempotent; - this.blocking = blocking == null ? false : blocking; - this.reset = reset == null ? null : reset; - this.host = null; - this.contentLength = null; - this.contentType = null; - this.headers = ""; - if (Array.isArray(headers)) { - if (headers.length % 2 !== 0) { - throw new InvalidArgumentError("headers array must be even"); - } - for (let i = 0; i < headers.length; i += 2) { - processHeader(this, headers[i], headers[i + 1]); - } - } else if (headers && typeof headers === "object") { - const keys = Object.keys(headers); - for (let i = 0; i < keys.length; i++) { - const key = keys[i]; - processHeader(this, key, headers[key]); - } - } else if (headers != null) { - throw new InvalidArgumentError("headers must be an object or an array"); - } - if (util.isFormDataLike(this.body)) { - if (util.nodeMajor < 16 || util.nodeMajor === 16 && util.nodeMinor < 8) { - throw new InvalidArgumentError("Form-Data bodies are only supported in node v16.8 and newer."); - } - if (!extractBody) { - extractBody = require_body().extractBody; - } - const [bodyStream, contentType] = extractBody(body); - if (this.contentType == null) { - this.contentType = contentType; - this.headers += `content-type: ${contentType}\r -`; - } - this.body = bodyStream.stream; - this.contentLength = bodyStream.length; - } else if (util.isBlobLike(body) && this.contentType == null && body.type) { - this.contentType = body.type; - this.headers += `content-type: ${body.type}\r -`; - } - util.validateHandler(handler2, method, upgrade); - this.servername = util.getServerName(this.host); - this[kHandler] = handler2; - if (channels.create.hasSubscribers) { - channels.create.publish({ request: this }); - } - } - onBodySent(chunk) { - if (this[kHandler].onBodySent) { - try { - this[kHandler].onBodySent(chunk); - } catch (err) { - this.onError(err); - } - } - } - onRequestSent() { - if (channels.bodySent.hasSubscribers) { - channels.bodySent.publish({ request: this }); - } - } - onConnect(abort) { - assert(!this.aborted); - assert(!this.completed); - return this[kHandler].onConnect(abort); - } - onHeaders(statusCode, headers, resume, statusText) { - assert(!this.aborted); - assert(!this.completed); - if (channels.headers.hasSubscribers) { - channels.headers.publish({ request: this, response: { statusCode, headers, statusText } }); - } - return this[kHandler].onHeaders(statusCode, headers, resume, statusText); - } - onData(chunk) { - assert(!this.aborted); - assert(!this.completed); - return this[kHandler].onData(chunk); - } - onUpgrade(statusCode, headers, socket) { - assert(!this.aborted); - assert(!this.completed); - return this[kHandler].onUpgrade(statusCode, headers, socket); - } - onComplete(trailers) { - assert(!this.aborted); - this.completed = true; - if (channels.trailers.hasSubscribers) { - channels.trailers.publish({ request: this, trailers }); - } - return this[kHandler].onComplete(trailers); - } - onError(error2) { - if (channels.error.hasSubscribers) { - channels.error.publish({ request: this, error: error2 }); - } - if (this.aborted) { - return; - } - this.aborted = true; - return this[kHandler].onError(error2); - } - addHeader(key, value) { - processHeader(this, key, value); - return this; - } - }; - function processHeaderValue(key, val) { - if (val && typeof val === "object") { - throw new InvalidArgumentError(`invalid ${key} header`); - } - val = val != null ? `${val}` : ""; - if (headerCharRegex.exec(val) !== null) { - throw new InvalidArgumentError(`invalid ${key} header`); - } - return `${key}: ${val}\r -`; - } - function processHeader(request, key, val) { - if (val && (typeof val === "object" && !Array.isArray(val))) { - throw new InvalidArgumentError(`invalid ${key} header`); - } else if (val === void 0) { - return; - } - if (request.host === null && key.length === 4 && key.toLowerCase() === "host") { - if (headerCharRegex.exec(val) !== null) { - throw new InvalidArgumentError(`invalid ${key} header`); - } - request.host = val; - } else if (request.contentLength === null && key.length === 14 && key.toLowerCase() === "content-length") { - request.contentLength = parseInt(val, 10); - if (!Number.isFinite(request.contentLength)) { - throw new InvalidArgumentError("invalid content-length header"); - } - } else if (request.contentType === null && key.length === 12 && key.toLowerCase() === "content-type") { - request.contentType = val; - request.headers += processHeaderValue(key, val); - } else if (key.length === 17 && key.toLowerCase() === "transfer-encoding") { - throw new InvalidArgumentError("invalid transfer-encoding header"); - } else if (key.length === 10 && key.toLowerCase() === "connection") { - const value = typeof val === "string" ? val.toLowerCase() : null; - if (value !== "close" && value !== "keep-alive") { - throw new InvalidArgumentError("invalid connection header"); - } else if (value === "close") { - request.reset = true; - } - } else if (key.length === 10 && key.toLowerCase() === "keep-alive") { - throw new InvalidArgumentError("invalid keep-alive header"); - } else if (key.length === 7 && key.toLowerCase() === "upgrade") { - throw new InvalidArgumentError("invalid upgrade header"); - } else if (key.length === 6 && key.toLowerCase() === "expect") { - throw new NotSupportedError("expect header not supported"); - } else if (tokenRegExp.exec(key) === null) { - throw new InvalidArgumentError("invalid header key"); - } else { - if (Array.isArray(val)) { - for (let i = 0; i < val.length; i++) { - request.headers += processHeaderValue(key, val[i]); - } - } else { - request.headers += processHeaderValue(key, val); - } - } - } - module2.exports = Request; - } -}); - -// node_modules/undici/lib/dispatcher.js -var require_dispatcher = __commonJS({ - "node_modules/undici/lib/dispatcher.js"(exports2, module2) { - "use strict"; - var EventEmitter = require("events"); - var Dispatcher = class extends EventEmitter { - dispatch() { - throw new Error("not implemented"); - } - close() { - throw new Error("not implemented"); - } - destroy() { - throw new Error("not implemented"); - } - }; - module2.exports = Dispatcher; - } -}); - -// node_modules/undici/lib/dispatcher-base.js -var require_dispatcher_base = __commonJS({ - "node_modules/undici/lib/dispatcher-base.js"(exports2, module2) { - "use strict"; - var Dispatcher = require_dispatcher(); - var { - ClientDestroyedError, - ClientClosedError, - InvalidArgumentError - } = require_errors(); - var { kDestroy, kClose, kDispatch, kInterceptors } = require_symbols(); - var kDestroyed = Symbol("destroyed"); - var kClosed = Symbol("closed"); - var kOnDestroyed = Symbol("onDestroyed"); - var kOnClosed = Symbol("onClosed"); - var kInterceptedDispatch = Symbol("Intercepted Dispatch"); - var DispatcherBase = class extends Dispatcher { - constructor() { - super(); - this[kDestroyed] = false; - this[kOnDestroyed] = null; - this[kClosed] = false; - this[kOnClosed] = []; - } - get destroyed() { - return this[kDestroyed]; - } - get closed() { - return this[kClosed]; - } - get interceptors() { - return this[kInterceptors]; - } - set interceptors(newInterceptors) { - if (newInterceptors) { - for (let i = newInterceptors.length - 1; i >= 0; i--) { - const interceptor = this[kInterceptors][i]; - if (typeof interceptor !== "function") { - throw new InvalidArgumentError("interceptor must be an function"); - } - } - } - this[kInterceptors] = newInterceptors; - } - close(callback) { - if (callback === void 0) { - return new Promise((resolve, reject) => { - this.close((err, data) => { - return err ? reject(err) : resolve(data); - }); - }); - } - if (typeof callback !== "function") { - throw new InvalidArgumentError("invalid callback"); - } - if (this[kDestroyed]) { - queueMicrotask(() => callback(new ClientDestroyedError(), null)); - return; - } - if (this[kClosed]) { - if (this[kOnClosed]) { - this[kOnClosed].push(callback); - } else { - queueMicrotask(() => callback(null, null)); - } - return; - } - this[kClosed] = true; - this[kOnClosed].push(callback); - const onClosed = () => { - const callbacks = this[kOnClosed]; - this[kOnClosed] = null; - for (let i = 0; i < callbacks.length; i++) { - callbacks[i](null, null); - } - }; - this[kClose]().then(() => this.destroy()).then(() => { - queueMicrotask(onClosed); - }); - } - destroy(err, callback) { - if (typeof err === "function") { - callback = err; - err = null; - } - if (callback === void 0) { - return new Promise((resolve, reject) => { - this.destroy(err, (err2, data) => { - return err2 ? ( - /* istanbul ignore next: should never error */ - reject(err2) - ) : resolve(data); - }); - }); - } - if (typeof callback !== "function") { - throw new InvalidArgumentError("invalid callback"); - } - if (this[kDestroyed]) { - if (this[kOnDestroyed]) { - this[kOnDestroyed].push(callback); - } else { - queueMicrotask(() => callback(null, null)); - } - return; - } - if (!err) { - err = new ClientDestroyedError(); - } - this[kDestroyed] = true; - this[kOnDestroyed] = this[kOnDestroyed] || []; - this[kOnDestroyed].push(callback); - const onDestroyed = () => { - const callbacks = this[kOnDestroyed]; - this[kOnDestroyed] = null; - for (let i = 0; i < callbacks.length; i++) { - callbacks[i](null, null); - } - }; - this[kDestroy](err).then(() => { - queueMicrotask(onDestroyed); - }); - } - [kInterceptedDispatch](opts, handler2) { - if (!this[kInterceptors] || this[kInterceptors].length === 0) { - this[kInterceptedDispatch] = this[kDispatch]; - return this[kDispatch](opts, handler2); - } - let dispatch = this[kDispatch].bind(this); - for (let i = this[kInterceptors].length - 1; i >= 0; i--) { - dispatch = this[kInterceptors][i](dispatch); - } - this[kInterceptedDispatch] = dispatch; - return dispatch(opts, handler2); - } - dispatch(opts, handler2) { - if (!handler2 || typeof handler2 !== "object") { - throw new InvalidArgumentError("handler must be an object"); - } - try { - if (!opts || typeof opts !== "object") { - throw new InvalidArgumentError("opts must be an object."); - } - if (this[kDestroyed] || this[kOnDestroyed]) { - throw new ClientDestroyedError(); - } - if (this[kClosed]) { - throw new ClientClosedError(); - } - return this[kInterceptedDispatch](opts, handler2); - } catch (err) { - if (typeof handler2.onError !== "function") { - throw new InvalidArgumentError("invalid onError method"); - } - handler2.onError(err); - return false; - } - } - }; - module2.exports = DispatcherBase; - } -}); - -// node_modules/undici/lib/core/connect.js -var require_connect2 = __commonJS({ - "node_modules/undici/lib/core/connect.js"(exports2, module2) { - "use strict"; - var net = require("net"); - var assert = require("assert"); - var util = require_util4(); - var { InvalidArgumentError, ConnectTimeoutError } = require_errors(); - var tls; - var SessionCache; - if (global.FinalizationRegistry) { - SessionCache = class WeakSessionCache { - constructor(maxCachedSessions) { - this._maxCachedSessions = maxCachedSessions; - this._sessionCache = /* @__PURE__ */ new Map(); - this._sessionRegistry = new global.FinalizationRegistry((key) => { - if (this._sessionCache.size < this._maxCachedSessions) { - return; - } - const ref = this._sessionCache.get(key); - if (ref !== void 0 && ref.deref() === void 0) { - this._sessionCache.delete(key); - } - }); - } - get(sessionKey) { - const ref = this._sessionCache.get(sessionKey); - return ref ? ref.deref() : null; - } - set(sessionKey, session) { - if (this._maxCachedSessions === 0) { - return; - } - this._sessionCache.set(sessionKey, new WeakRef(session)); - this._sessionRegistry.register(session, sessionKey); - } - }; - } else { - SessionCache = class SimpleSessionCache { - constructor(maxCachedSessions) { - this._maxCachedSessions = maxCachedSessions; - this._sessionCache = /* @__PURE__ */ new Map(); - } - get(sessionKey) { - return this._sessionCache.get(sessionKey); - } - set(sessionKey, session) { - if (this._maxCachedSessions === 0) { - return; - } - if (this._sessionCache.size >= this._maxCachedSessions) { - const { value: oldestKey } = this._sessionCache.keys().next(); - this._sessionCache.delete(oldestKey); - } - this._sessionCache.set(sessionKey, session); - } - }; - } - function buildConnector({ maxCachedSessions, socketPath, timeout, ...opts }) { - if (maxCachedSessions != null && (!Number.isInteger(maxCachedSessions) || maxCachedSessions < 0)) { - throw new InvalidArgumentError("maxCachedSessions must be a positive integer or zero"); - } - const options2 = { path: socketPath, ...opts }; - const sessionCache = new SessionCache(maxCachedSessions == null ? 100 : maxCachedSessions); - timeout = timeout == null ? 1e4 : timeout; - return function connect({ hostname, host, protocol, port, servername, localAddress, httpSocket }, callback) { - let socket; - if (protocol === "https:") { - if (!tls) { - tls = require("tls"); - } - servername = servername || options2.servername || util.getServerName(host) || null; - const sessionKey = servername || hostname; - const session = sessionCache.get(sessionKey) || null; - assert(sessionKey); - socket = tls.connect({ - highWaterMark: 16384, - // TLS in node can't have bigger HWM anyway... - ...options2, - servername, - session, - localAddress, - socket: httpSocket, - // upgrade socket connection - port: port || 443, - host: hostname - }); - socket.on("session", function(session2) { - sessionCache.set(sessionKey, session2); - }); - } else { - assert(!httpSocket, "httpSocket can only be sent on TLS update"); - socket = net.connect({ - highWaterMark: 64 * 1024, - // Same as nodejs fs streams. - ...options2, - localAddress, - port: port || 80, - host: hostname - }); - } - if (options2.keepAlive == null || options2.keepAlive) { - const keepAliveInitialDelay = options2.keepAliveInitialDelay === void 0 ? 6e4 : options2.keepAliveInitialDelay; - socket.setKeepAlive(true, keepAliveInitialDelay); - } - const cancelTimeout = setupTimeout(() => onConnectTimeout(socket), timeout); - socket.setNoDelay(true).once(protocol === "https:" ? "secureConnect" : "connect", function() { - cancelTimeout(); - if (callback) { - const cb = callback; - callback = null; - cb(null, this); - } - }).on("error", function(err) { - cancelTimeout(); - if (callback) { - const cb = callback; - callback = null; - cb(err); - } - }); - return socket; - }; - } - function setupTimeout(onConnectTimeout2, timeout) { - if (!timeout) { - return () => { - }; - } - let s1 = null; - let s2 = null; - const timeoutId = setTimeout(() => { - s1 = setImmediate(() => { - if (process.platform === "win32") { - s2 = setImmediate(() => onConnectTimeout2()); - } else { - onConnectTimeout2(); - } - }); - }, timeout); - return () => { - clearTimeout(timeoutId); - clearImmediate(s1); - clearImmediate(s2); - }; - } - function onConnectTimeout(socket) { - util.destroy(socket, new ConnectTimeoutError()); - } - module2.exports = buildConnector; - } -}); - -// node_modules/undici/lib/llhttp/utils.js -var require_utils2 = __commonJS({ - "node_modules/undici/lib/llhttp/utils.js"(exports2) { - "use strict"; - Object.defineProperty(exports2, "__esModule", { value: true }); - exports2.enumToMap = void 0; - function enumToMap(obj) { - const res = {}; - Object.keys(obj).forEach((key) => { - const value = obj[key]; - if (typeof value === "number") { - res[key] = value; - } - }); - return res; - } - exports2.enumToMap = enumToMap; - } -}); - -// node_modules/undici/lib/llhttp/constants.js -var require_constants3 = __commonJS({ - "node_modules/undici/lib/llhttp/constants.js"(exports2) { - "use strict"; - Object.defineProperty(exports2, "__esModule", { value: true }); - exports2.SPECIAL_HEADERS = exports2.HEADER_STATE = exports2.MINOR = exports2.MAJOR = exports2.CONNECTION_TOKEN_CHARS = exports2.HEADER_CHARS = exports2.TOKEN = exports2.STRICT_TOKEN = exports2.HEX = exports2.URL_CHAR = exports2.STRICT_URL_CHAR = exports2.USERINFO_CHARS = exports2.MARK = exports2.ALPHANUM = exports2.NUM = exports2.HEX_MAP = exports2.NUM_MAP = exports2.ALPHA = exports2.FINISH = exports2.H_METHOD_MAP = exports2.METHOD_MAP = exports2.METHODS_RTSP = exports2.METHODS_ICE = exports2.METHODS_HTTP = exports2.METHODS = exports2.LENIENT_FLAGS = exports2.FLAGS = exports2.TYPE = exports2.ERROR = void 0; - var utils_1 = require_utils2(); - var ERROR; - (function(ERROR2) { - ERROR2[ERROR2["OK"] = 0] = "OK"; - ERROR2[ERROR2["INTERNAL"] = 1] = "INTERNAL"; - ERROR2[ERROR2["STRICT"] = 2] = "STRICT"; - ERROR2[ERROR2["LF_EXPECTED"] = 3] = "LF_EXPECTED"; - ERROR2[ERROR2["UNEXPECTED_CONTENT_LENGTH"] = 4] = "UNEXPECTED_CONTENT_LENGTH"; - ERROR2[ERROR2["CLOSED_CONNECTION"] = 5] = "CLOSED_CONNECTION"; - ERROR2[ERROR2["INVALID_METHOD"] = 6] = "INVALID_METHOD"; - ERROR2[ERROR2["INVALID_URL"] = 7] = "INVALID_URL"; - ERROR2[ERROR2["INVALID_CONSTANT"] = 8] = "INVALID_CONSTANT"; - ERROR2[ERROR2["INVALID_VERSION"] = 9] = "INVALID_VERSION"; - ERROR2[ERROR2["INVALID_HEADER_TOKEN"] = 10] = "INVALID_HEADER_TOKEN"; - ERROR2[ERROR2["INVALID_CONTENT_LENGTH"] = 11] = "INVALID_CONTENT_LENGTH"; - ERROR2[ERROR2["INVALID_CHUNK_SIZE"] = 12] = "INVALID_CHUNK_SIZE"; - ERROR2[ERROR2["INVALID_STATUS"] = 13] = "INVALID_STATUS"; - ERROR2[ERROR2["INVALID_EOF_STATE"] = 14] = "INVALID_EOF_STATE"; - ERROR2[ERROR2["INVALID_TRANSFER_ENCODING"] = 15] = "INVALID_TRANSFER_ENCODING"; - ERROR2[ERROR2["CB_MESSAGE_BEGIN"] = 16] = "CB_MESSAGE_BEGIN"; - ERROR2[ERROR2["CB_HEADERS_COMPLETE"] = 17] = "CB_HEADERS_COMPLETE"; - ERROR2[ERROR2["CB_MESSAGE_COMPLETE"] = 18] = "CB_MESSAGE_COMPLETE"; - ERROR2[ERROR2["CB_CHUNK_HEADER"] = 19] = "CB_CHUNK_HEADER"; - ERROR2[ERROR2["CB_CHUNK_COMPLETE"] = 20] = "CB_CHUNK_COMPLETE"; - ERROR2[ERROR2["PAUSED"] = 21] = "PAUSED"; - ERROR2[ERROR2["PAUSED_UPGRADE"] = 22] = "PAUSED_UPGRADE"; - ERROR2[ERROR2["PAUSED_H2_UPGRADE"] = 23] = "PAUSED_H2_UPGRADE"; - ERROR2[ERROR2["USER"] = 24] = "USER"; - })(ERROR = exports2.ERROR || (exports2.ERROR = {})); - var TYPE; - (function(TYPE2) { - TYPE2[TYPE2["BOTH"] = 0] = "BOTH"; - TYPE2[TYPE2["REQUEST"] = 1] = "REQUEST"; - TYPE2[TYPE2["RESPONSE"] = 2] = "RESPONSE"; - })(TYPE = exports2.TYPE || (exports2.TYPE = {})); - var FLAGS; - (function(FLAGS2) { - FLAGS2[FLAGS2["CONNECTION_KEEP_ALIVE"] = 1] = "CONNECTION_KEEP_ALIVE"; - FLAGS2[FLAGS2["CONNECTION_CLOSE"] = 2] = "CONNECTION_CLOSE"; - FLAGS2[FLAGS2["CONNECTION_UPGRADE"] = 4] = "CONNECTION_UPGRADE"; - FLAGS2[FLAGS2["CHUNKED"] = 8] = "CHUNKED"; - FLAGS2[FLAGS2["UPGRADE"] = 16] = "UPGRADE"; - FLAGS2[FLAGS2["CONTENT_LENGTH"] = 32] = "CONTENT_LENGTH"; - FLAGS2[FLAGS2["SKIPBODY"] = 64] = "SKIPBODY"; - FLAGS2[FLAGS2["TRAILING"] = 128] = "TRAILING"; - FLAGS2[FLAGS2["TRANSFER_ENCODING"] = 512] = "TRANSFER_ENCODING"; - })(FLAGS = exports2.FLAGS || (exports2.FLAGS = {})); - var LENIENT_FLAGS; - (function(LENIENT_FLAGS2) { - LENIENT_FLAGS2[LENIENT_FLAGS2["HEADERS"] = 1] = "HEADERS"; - LENIENT_FLAGS2[LENIENT_FLAGS2["CHUNKED_LENGTH"] = 2] = "CHUNKED_LENGTH"; - LENIENT_FLAGS2[LENIENT_FLAGS2["KEEP_ALIVE"] = 4] = "KEEP_ALIVE"; - })(LENIENT_FLAGS = exports2.LENIENT_FLAGS || (exports2.LENIENT_FLAGS = {})); - var METHODS; - (function(METHODS2) { - METHODS2[METHODS2["DELETE"] = 0] = "DELETE"; - METHODS2[METHODS2["GET"] = 1] = "GET"; - METHODS2[METHODS2["HEAD"] = 2] = "HEAD"; - METHODS2[METHODS2["POST"] = 3] = "POST"; - METHODS2[METHODS2["PUT"] = 4] = "PUT"; - METHODS2[METHODS2["CONNECT"] = 5] = "CONNECT"; - METHODS2[METHODS2["OPTIONS"] = 6] = "OPTIONS"; - METHODS2[METHODS2["TRACE"] = 7] = "TRACE"; - METHODS2[METHODS2["COPY"] = 8] = "COPY"; - METHODS2[METHODS2["LOCK"] = 9] = "LOCK"; - METHODS2[METHODS2["MKCOL"] = 10] = "MKCOL"; - METHODS2[METHODS2["MOVE"] = 11] = "MOVE"; - METHODS2[METHODS2["PROPFIND"] = 12] = "PROPFIND"; - METHODS2[METHODS2["PROPPATCH"] = 13] = "PROPPATCH"; - METHODS2[METHODS2["SEARCH"] = 14] = "SEARCH"; - METHODS2[METHODS2["UNLOCK"] = 15] = "UNLOCK"; - METHODS2[METHODS2["BIND"] = 16] = "BIND"; - METHODS2[METHODS2["REBIND"] = 17] = "REBIND"; - METHODS2[METHODS2["UNBIND"] = 18] = "UNBIND"; - METHODS2[METHODS2["ACL"] = 19] = "ACL"; - METHODS2[METHODS2["REPORT"] = 20] = "REPORT"; - METHODS2[METHODS2["MKACTIVITY"] = 21] = "MKACTIVITY"; - METHODS2[METHODS2["CHECKOUT"] = 22] = "CHECKOUT"; - METHODS2[METHODS2["MERGE"] = 23] = "MERGE"; - METHODS2[METHODS2["M-SEARCH"] = 24] = "M-SEARCH"; - METHODS2[METHODS2["NOTIFY"] = 25] = "NOTIFY"; - METHODS2[METHODS2["SUBSCRIBE"] = 26] = "SUBSCRIBE"; - METHODS2[METHODS2["UNSUBSCRIBE"] = 27] = "UNSUBSCRIBE"; - METHODS2[METHODS2["PATCH"] = 28] = "PATCH"; - METHODS2[METHODS2["PURGE"] = 29] = "PURGE"; - METHODS2[METHODS2["MKCALENDAR"] = 30] = "MKCALENDAR"; - METHODS2[METHODS2["LINK"] = 31] = "LINK"; - METHODS2[METHODS2["UNLINK"] = 32] = "UNLINK"; - METHODS2[METHODS2["SOURCE"] = 33] = "SOURCE"; - METHODS2[METHODS2["PRI"] = 34] = "PRI"; - METHODS2[METHODS2["DESCRIBE"] = 35] = "DESCRIBE"; - METHODS2[METHODS2["ANNOUNCE"] = 36] = "ANNOUNCE"; - METHODS2[METHODS2["SETUP"] = 37] = "SETUP"; - METHODS2[METHODS2["PLAY"] = 38] = "PLAY"; - METHODS2[METHODS2["PAUSE"] = 39] = "PAUSE"; - METHODS2[METHODS2["TEARDOWN"] = 40] = "TEARDOWN"; - METHODS2[METHODS2["GET_PARAMETER"] = 41] = "GET_PARAMETER"; - METHODS2[METHODS2["SET_PARAMETER"] = 42] = "SET_PARAMETER"; - METHODS2[METHODS2["REDIRECT"] = 43] = "REDIRECT"; - METHODS2[METHODS2["RECORD"] = 44] = "RECORD"; - METHODS2[METHODS2["FLUSH"] = 45] = "FLUSH"; - })(METHODS = exports2.METHODS || (exports2.METHODS = {})); - exports2.METHODS_HTTP = [ - METHODS.DELETE, - METHODS.GET, - METHODS.HEAD, - METHODS.POST, - METHODS.PUT, - METHODS.CONNECT, - METHODS.OPTIONS, - METHODS.TRACE, - METHODS.COPY, - METHODS.LOCK, - METHODS.MKCOL, - METHODS.MOVE, - METHODS.PROPFIND, - METHODS.PROPPATCH, - METHODS.SEARCH, - METHODS.UNLOCK, - METHODS.BIND, - METHODS.REBIND, - METHODS.UNBIND, - METHODS.ACL, - METHODS.REPORT, - METHODS.MKACTIVITY, - METHODS.CHECKOUT, - METHODS.MERGE, - METHODS["M-SEARCH"], - METHODS.NOTIFY, - METHODS.SUBSCRIBE, - METHODS.UNSUBSCRIBE, - METHODS.PATCH, - METHODS.PURGE, - METHODS.MKCALENDAR, - METHODS.LINK, - METHODS.UNLINK, - METHODS.PRI, - // TODO(indutny): should we allow it with HTTP? - METHODS.SOURCE - ]; - exports2.METHODS_ICE = [ - METHODS.SOURCE - ]; - exports2.METHODS_RTSP = [ - METHODS.OPTIONS, - METHODS.DESCRIBE, - METHODS.ANNOUNCE, - METHODS.SETUP, - METHODS.PLAY, - METHODS.PAUSE, - METHODS.TEARDOWN, - METHODS.GET_PARAMETER, - METHODS.SET_PARAMETER, - METHODS.REDIRECT, - METHODS.RECORD, - METHODS.FLUSH, - // For AirPlay - METHODS.GET, - METHODS.POST - ]; - exports2.METHOD_MAP = utils_1.enumToMap(METHODS); - exports2.H_METHOD_MAP = {}; - Object.keys(exports2.METHOD_MAP).forEach((key) => { - if (/^H/.test(key)) { - exports2.H_METHOD_MAP[key] = exports2.METHOD_MAP[key]; - } - }); - var FINISH; - (function(FINISH2) { - FINISH2[FINISH2["SAFE"] = 0] = "SAFE"; - FINISH2[FINISH2["SAFE_WITH_CB"] = 1] = "SAFE_WITH_CB"; - FINISH2[FINISH2["UNSAFE"] = 2] = "UNSAFE"; - })(FINISH = exports2.FINISH || (exports2.FINISH = {})); - exports2.ALPHA = []; - for (let i = "A".charCodeAt(0); i <= "Z".charCodeAt(0); i++) { - exports2.ALPHA.push(String.fromCharCode(i)); - exports2.ALPHA.push(String.fromCharCode(i + 32)); - } - exports2.NUM_MAP = { - 0: 0, - 1: 1, - 2: 2, - 3: 3, - 4: 4, - 5: 5, - 6: 6, - 7: 7, - 8: 8, - 9: 9 - }; - exports2.HEX_MAP = { - 0: 0, - 1: 1, - 2: 2, - 3: 3, - 4: 4, - 5: 5, - 6: 6, - 7: 7, - 8: 8, - 9: 9, - A: 10, - B: 11, - C: 12, - D: 13, - E: 14, - F: 15, - a: 10, - b: 11, - c: 12, - d: 13, - e: 14, - f: 15 - }; - exports2.NUM = [ - "0", - "1", - "2", - "3", - "4", - "5", - "6", - "7", - "8", - "9" - ]; - exports2.ALPHANUM = exports2.ALPHA.concat(exports2.NUM); - exports2.MARK = ["-", "_", ".", "!", "~", "*", "'", "(", ")"]; - exports2.USERINFO_CHARS = exports2.ALPHANUM.concat(exports2.MARK).concat(["%", ";", ":", "&", "=", "+", "$", ","]); - exports2.STRICT_URL_CHAR = [ - "!", - '"', - "$", - "%", - "&", - "'", - "(", - ")", - "*", - "+", - ",", - "-", - ".", - "/", - ":", - ";", - "<", - "=", - ">", - "@", - "[", - "\\", - "]", - "^", - "_", - "`", - "{", - "|", - "}", - "~" - ].concat(exports2.ALPHANUM); - exports2.URL_CHAR = exports2.STRICT_URL_CHAR.concat([" ", "\f"]); - for (let i = 128; i <= 255; i++) { - exports2.URL_CHAR.push(i); - } - exports2.HEX = exports2.NUM.concat(["a", "b", "c", "d", "e", "f", "A", "B", "C", "D", "E", "F"]); - exports2.STRICT_TOKEN = [ - "!", - "#", - "$", - "%", - "&", - "'", - "*", - "+", - "-", - ".", - "^", - "_", - "`", - "|", - "~" - ].concat(exports2.ALPHANUM); - exports2.TOKEN = exports2.STRICT_TOKEN.concat([" "]); - exports2.HEADER_CHARS = [" "]; - for (let i = 32; i <= 255; i++) { - if (i !== 127) { - exports2.HEADER_CHARS.push(i); - } - } - exports2.CONNECTION_TOKEN_CHARS = exports2.HEADER_CHARS.filter((c) => c !== 44); - exports2.MAJOR = exports2.NUM_MAP; - exports2.MINOR = exports2.MAJOR; - var HEADER_STATE; - (function(HEADER_STATE2) { - HEADER_STATE2[HEADER_STATE2["GENERAL"] = 0] = "GENERAL"; - HEADER_STATE2[HEADER_STATE2["CONNECTION"] = 1] = "CONNECTION"; - HEADER_STATE2[HEADER_STATE2["CONTENT_LENGTH"] = 2] = "CONTENT_LENGTH"; - HEADER_STATE2[HEADER_STATE2["TRANSFER_ENCODING"] = 3] = "TRANSFER_ENCODING"; - HEADER_STATE2[HEADER_STATE2["UPGRADE"] = 4] = "UPGRADE"; - HEADER_STATE2[HEADER_STATE2["CONNECTION_KEEP_ALIVE"] = 5] = "CONNECTION_KEEP_ALIVE"; - HEADER_STATE2[HEADER_STATE2["CONNECTION_CLOSE"] = 6] = "CONNECTION_CLOSE"; - HEADER_STATE2[HEADER_STATE2["CONNECTION_UPGRADE"] = 7] = "CONNECTION_UPGRADE"; - HEADER_STATE2[HEADER_STATE2["TRANSFER_ENCODING_CHUNKED"] = 8] = "TRANSFER_ENCODING_CHUNKED"; - })(HEADER_STATE = exports2.HEADER_STATE || (exports2.HEADER_STATE = {})); - exports2.SPECIAL_HEADERS = { - "connection": HEADER_STATE.CONNECTION, - "content-length": HEADER_STATE.CONTENT_LENGTH, - "proxy-connection": HEADER_STATE.CONNECTION, - "transfer-encoding": HEADER_STATE.TRANSFER_ENCODING, - "upgrade": HEADER_STATE.UPGRADE - }; - } -}); - -// node_modules/undici/lib/handler/RedirectHandler.js -var require_RedirectHandler = __commonJS({ - "node_modules/undici/lib/handler/RedirectHandler.js"(exports2, module2) { - "use strict"; - var util = require_util4(); - var { kBodyUsed } = require_symbols(); - var assert = require("assert"); - var { InvalidArgumentError } = require_errors(); - var EE = require("events"); - var redirectableStatusCodes = [300, 301, 302, 303, 307, 308]; - var kBody = Symbol("body"); - var BodyAsyncIterable = class { - constructor(body) { - this[kBody] = body; - this[kBodyUsed] = false; - } - async *[Symbol.asyncIterator]() { - assert(!this[kBodyUsed], "disturbed"); - this[kBodyUsed] = true; - yield* this[kBody]; - } - }; - var RedirectHandler = class { - constructor(dispatch, maxRedirections, opts, handler2) { - if (maxRedirections != null && (!Number.isInteger(maxRedirections) || maxRedirections < 0)) { - throw new InvalidArgumentError("maxRedirections must be a positive number"); - } - util.validateHandler(handler2, opts.method, opts.upgrade); - this.dispatch = dispatch; - this.location = null; - this.abort = null; - this.opts = { ...opts, maxRedirections: 0 }; - this.maxRedirections = maxRedirections; - this.handler = handler2; - this.history = []; - if (util.isStream(this.opts.body)) { - if (util.bodyLength(this.opts.body) === 0) { - this.opts.body.on("data", function() { - assert(false); - }); - } - if (typeof this.opts.body.readableDidRead !== "boolean") { - this.opts.body[kBodyUsed] = false; - EE.prototype.on.call(this.opts.body, "data", function() { - this[kBodyUsed] = true; - }); - } - } else if (this.opts.body && typeof this.opts.body.pipeTo === "function") { - this.opts.body = new BodyAsyncIterable(this.opts.body); - } else if (this.opts.body && typeof this.opts.body !== "string" && !ArrayBuffer.isView(this.opts.body) && util.isIterable(this.opts.body)) { - this.opts.body = new BodyAsyncIterable(this.opts.body); - } - } - onConnect(abort) { - this.abort = abort; - this.handler.onConnect(abort, { history: this.history }); - } - onUpgrade(statusCode, headers, socket) { - this.handler.onUpgrade(statusCode, headers, socket); - } - onError(error2) { - this.handler.onError(error2); - } - onHeaders(statusCode, headers, resume, statusText) { - this.location = this.history.length >= this.maxRedirections || util.isDisturbed(this.opts.body) ? null : parseLocation(statusCode, headers); - if (this.opts.origin) { - this.history.push(new URL(this.opts.path, this.opts.origin)); - } - if (!this.location) { - return this.handler.onHeaders(statusCode, headers, resume, statusText); - } - const { origin, pathname, search } = util.parseURL(new URL(this.location, this.opts.origin && new URL(this.opts.path, this.opts.origin))); - const path = search ? `${pathname}${search}` : pathname; - this.opts.headers = cleanRequestHeaders(this.opts.headers, statusCode === 303, this.opts.origin !== origin); - this.opts.path = path; - this.opts.origin = origin; - this.opts.maxRedirections = 0; - this.opts.query = null; - if (statusCode === 303 && this.opts.method !== "HEAD") { - this.opts.method = "GET"; - this.opts.body = null; - } - } - onData(chunk) { - if (this.location) { - } else { - return this.handler.onData(chunk); - } - } - onComplete(trailers) { - if (this.location) { - this.location = null; - this.abort = null; - this.dispatch(this.opts, this); - } else { - this.handler.onComplete(trailers); - } - } - onBodySent(chunk) { - if (this.handler.onBodySent) { - this.handler.onBodySent(chunk); - } - } - }; - function parseLocation(statusCode, headers) { - if (redirectableStatusCodes.indexOf(statusCode) === -1) { - return null; - } - for (let i = 0; i < headers.length; i += 2) { - if (headers[i].toString().toLowerCase() === "location") { - return headers[i + 1]; - } - } - } - function shouldRemoveHeader(header, removeContent, unknownOrigin) { - return header.length === 4 && header.toString().toLowerCase() === "host" || removeContent && header.toString().toLowerCase().indexOf("content-") === 0 || unknownOrigin && header.length === 13 && header.toString().toLowerCase() === "authorization" || unknownOrigin && header.length === 6 && header.toString().toLowerCase() === "cookie"; - } - function cleanRequestHeaders(headers, removeContent, unknownOrigin) { - const ret = []; - if (Array.isArray(headers)) { - for (let i = 0; i < headers.length; i += 2) { - if (!shouldRemoveHeader(headers[i], removeContent, unknownOrigin)) { - ret.push(headers[i], headers[i + 1]); - } - } - } else if (headers && typeof headers === "object") { - for (const key of Object.keys(headers)) { - if (!shouldRemoveHeader(key, removeContent, unknownOrigin)) { - ret.push(key, headers[key]); - } - } - } else { - assert(headers == null, "headers must be an object or an array"); - } - return ret; - } - module2.exports = RedirectHandler; - } -}); - -// node_modules/undici/lib/interceptor/redirectInterceptor.js -var require_redirectInterceptor = __commonJS({ - "node_modules/undici/lib/interceptor/redirectInterceptor.js"(exports2, module2) { - "use strict"; - var RedirectHandler = require_RedirectHandler(); - function createRedirectInterceptor({ maxRedirections: defaultMaxRedirections }) { - return (dispatch) => { - return function Intercept(opts, handler2) { - const { maxRedirections = defaultMaxRedirections } = opts; - if (!maxRedirections) { - return dispatch(opts, handler2); - } - const redirectHandler = new RedirectHandler(dispatch, maxRedirections, opts, handler2); - opts = { ...opts, maxRedirections: 0 }; - return dispatch(opts, redirectHandler); - }; - }; - } - module2.exports = createRedirectInterceptor; - } -}); - -// node_modules/undici/lib/llhttp/llhttp-wasm.js -var require_llhttp_wasm = __commonJS({ - "node_modules/undici/lib/llhttp/llhttp-wasm.js"(exports2, module2) { - module2.exports = "AGFzbQEAAAABMAhgAX8Bf2ADf39/AX9gBH9/f38Bf2AAAGADf39/AGABfwBgAn9/AGAGf39/f39/AALLAQgDZW52GHdhc21fb25faGVhZGVyc19jb21wbGV0ZQACA2VudhV3YXNtX29uX21lc3NhZ2VfYmVnaW4AAANlbnYLd2FzbV9vbl91cmwAAQNlbnYOd2FzbV9vbl9zdGF0dXMAAQNlbnYUd2FzbV9vbl9oZWFkZXJfZmllbGQAAQNlbnYUd2FzbV9vbl9oZWFkZXJfdmFsdWUAAQNlbnYMd2FzbV9vbl9ib2R5AAEDZW52GHdhc21fb25fbWVzc2FnZV9jb21wbGV0ZQAAA0ZFAwMEAAAFAAAAAAAABQEFAAUFBQAABgAAAAAGBgYGAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAAABAQcAAAUFAwABBAUBcAESEgUDAQACBggBfwFBgNQECwfRBSIGbWVtb3J5AgALX2luaXRpYWxpemUACRlfX2luZGlyZWN0X2Z1bmN0aW9uX3RhYmxlAQALbGxodHRwX2luaXQAChhsbGh0dHBfc2hvdWxkX2tlZXBfYWxpdmUAQQxsbGh0dHBfYWxsb2MADAZtYWxsb2MARgtsbGh0dHBfZnJlZQANBGZyZWUASA9sbGh0dHBfZ2V0X3R5cGUADhVsbGh0dHBfZ2V0X2h0dHBfbWFqb3IADxVsbGh0dHBfZ2V0X2h0dHBfbWlub3IAEBFsbGh0dHBfZ2V0X21ldGhvZAARFmxsaHR0cF9nZXRfc3RhdHVzX2NvZGUAEhJsbGh0dHBfZ2V0X3VwZ3JhZGUAEwxsbGh0dHBfcmVzZXQAFA5sbGh0dHBfZXhlY3V0ZQAVFGxsaHR0cF9zZXR0aW5nc19pbml0ABYNbGxodHRwX2ZpbmlzaAAXDGxsaHR0cF9wYXVzZQAYDWxsaHR0cF9yZXN1bWUAGRtsbGh0dHBfcmVzdW1lX2FmdGVyX3VwZ3JhZGUAGhBsbGh0dHBfZ2V0X2Vycm5vABsXbGxodHRwX2dldF9lcnJvcl9yZWFzb24AHBdsbGh0dHBfc2V0X2Vycm9yX3JlYXNvbgAdFGxsaHR0cF9nZXRfZXJyb3JfcG9zAB4RbGxodHRwX2Vycm5vX25hbWUAHxJsbGh0dHBfbWV0aG9kX25hbWUAIBJsbGh0dHBfc3RhdHVzX25hbWUAIRpsbGh0dHBfc2V0X2xlbmllbnRfaGVhZGVycwAiIWxsaHR0cF9zZXRfbGVuaWVudF9jaHVua2VkX2xlbmd0aAAjHWxsaHR0cF9zZXRfbGVuaWVudF9rZWVwX2FsaXZlACQkbGxodHRwX3NldF9sZW5pZW50X3RyYW5zZmVyX2VuY29kaW5nACUYbGxodHRwX21lc3NhZ2VfbmVlZHNfZW9mAD8JFwEAQQELEQECAwQFCwYHNTk3MS8tJyspCsLgAkUCAAsIABCIgICAAAsZACAAEMKAgIAAGiAAIAI2AjggACABOgAoCxwAIAAgAC8BMiAALQAuIAAQwYCAgAAQgICAgAALKgEBf0HAABDGgICAACIBEMKAgIAAGiABQYCIgIAANgI4IAEgADoAKCABCwoAIAAQyICAgAALBwAgAC0AKAsHACAALQAqCwcAIAAtACsLBwAgAC0AKQsHACAALwEyCwcAIAAtAC4LRQEEfyAAKAIYIQEgAC0ALSECIAAtACghAyAAKAI4IQQgABDCgICAABogACAENgI4IAAgAzoAKCAAIAI6AC0gACABNgIYCxEAIAAgASABIAJqEMOAgIAACxAAIABBAEHcABDMgICAABoLZwEBf0EAIQECQCAAKAIMDQACQAJAAkACQCAALQAvDgMBAAMCCyAAKAI4IgFFDQAgASgCLCIBRQ0AIAAgARGAgICAAAAiAQ0DC0EADwsQyoCAgAAACyAAQcOWgIAANgIQQQ4hAQsgAQseAAJAIAAoAgwNACAAQdGbgIAANgIQIABBFTYCDAsLFgACQCAAKAIMQRVHDQAgAEEANgIMCwsWAAJAIAAoAgxBFkcNACAAQQA2AgwLCwcAIAAoAgwLBwAgACgCEAsJACAAIAE2AhALBwAgACgCFAsiAAJAIABBJEkNABDKgICAAAALIABBAnRBoLOAgABqKAIACyIAAkAgAEEuSQ0AEMqAgIAAAAsgAEECdEGwtICAAGooAgAL7gsBAX9B66iAgAAhAQJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIABBnH9qDvQDY2IAAWFhYWFhYQIDBAVhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhBgcICQoLDA0OD2FhYWFhEGFhYWFhYWFhYWFhEWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYRITFBUWFxgZGhthYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhHB0eHyAhIiMkJSYnKCkqKywtLi8wMTIzNDU2YTc4OTphYWFhYWFhYTthYWE8YWFhYT0+P2FhYWFhYWFhQGFhQWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYUJDREVGR0hJSktMTU5PUFFSU2FhYWFhYWFhVFVWV1hZWlthXF1hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFeYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhX2BhC0Hhp4CAAA8LQaShgIAADwtBy6yAgAAPC0H+sYCAAA8LQcCkgIAADwtBq6SAgAAPC0GNqICAAA8LQeKmgIAADwtBgLCAgAAPC0G5r4CAAA8LQdekgIAADwtB75+AgAAPC0Hhn4CAAA8LQfqfgIAADwtB8qCAgAAPC0Gor4CAAA8LQa6ygIAADwtBiLCAgAAPC0Hsp4CAAA8LQYKigIAADwtBjp2AgAAPC0HQroCAAA8LQcqjgIAADwtBxbKAgAAPC0HfnICAAA8LQdKcgIAADwtBxKCAgAAPC0HXoICAAA8LQaKfgIAADwtB7a6AgAAPC0GrsICAAA8LQdSlgIAADwtBzK6AgAAPC0H6roCAAA8LQfyrgIAADwtB0rCAgAAPC0HxnYCAAA8LQbuggIAADwtB96uAgAAPC0GQsYCAAA8LQdexgIAADwtBoq2AgAAPC0HUp4CAAA8LQeCrgIAADwtBn6yAgAAPC0HrsYCAAA8LQdWfgIAADwtByrGAgAAPC0HepYCAAA8LQdSegIAADwtB9JyAgAAPC0GnsoCAAA8LQbGdgIAADwtBoJ2AgAAPC0G5sYCAAA8LQbywgIAADwtBkqGAgAAPC0GzpoCAAA8LQemsgIAADwtBrJ6AgAAPC0HUq4CAAA8LQfemgIAADwtBgKaAgAAPC0GwoYCAAA8LQf6egIAADwtBjaOAgAAPC0GJrYCAAA8LQfeigIAADwtBoLGAgAAPC0Gun4CAAA8LQcalgIAADwtB6J6AgAAPC0GTooCAAA8LQcKvgIAADwtBw52AgAAPC0GLrICAAA8LQeGdgIAADwtBja+AgAAPC0HqoYCAAA8LQbStgIAADwtB0q+AgAAPC0HfsoCAAA8LQdKygIAADwtB8LCAgAAPC0GpooCAAA8LQfmjgIAADwtBmZ6AgAAPC0G1rICAAA8LQZuwgIAADwtBkrKAgAAPC0G2q4CAAA8LQcKigIAADwtB+LKAgAAPC0GepYCAAA8LQdCigIAADwtBup6AgAAPC0GBnoCAAA8LEMqAgIAAAAtB1qGAgAAhAQsgAQsWACAAIAAtAC1B/gFxIAFBAEdyOgAtCxkAIAAgAC0ALUH9AXEgAUEAR0EBdHI6AC0LGQAgACAALQAtQfsBcSABQQBHQQJ0cjoALQsZACAAIAAtAC1B9wFxIAFBAEdBA3RyOgAtCy4BAn9BACEDAkAgACgCOCIERQ0AIAQoAgAiBEUNACAAIAQRgICAgAAAIQMLIAMLSQECf0EAIQMCQCAAKAI4IgRFDQAgBCgCBCIERQ0AIAAgASACIAFrIAQRgYCAgAAAIgNBf0cNACAAQcaRgIAANgIQQRghAwsgAwsuAQJ/QQAhAwJAIAAoAjgiBEUNACAEKAIwIgRFDQAgACAEEYCAgIAAACEDCyADC0kBAn9BACEDAkAgACgCOCIERQ0AIAQoAggiBEUNACAAIAEgAiABayAEEYGAgIAAACIDQX9HDQAgAEH2ioCAADYCEEEYIQMLIAMLLgECf0EAIQMCQCAAKAI4IgRFDQAgBCgCNCIERQ0AIAAgBBGAgICAAAAhAwsgAwtJAQJ/QQAhAwJAIAAoAjgiBEUNACAEKAIMIgRFDQAgACABIAIgAWsgBBGBgICAAAAiA0F/Rw0AIABB7ZqAgAA2AhBBGCEDCyADCy4BAn9BACEDAkAgACgCOCIERQ0AIAQoAjgiBEUNACAAIAQRgICAgAAAIQMLIAMLSQECf0EAIQMCQCAAKAI4IgRFDQAgBCgCECIERQ0AIAAgASACIAFrIAQRgYCAgAAAIgNBf0cNACAAQZWQgIAANgIQQRghAwsgAwsuAQJ/QQAhAwJAIAAoAjgiBEUNACAEKAI8IgRFDQAgACAEEYCAgIAAACEDCyADC0kBAn9BACEDAkAgACgCOCIERQ0AIAQoAhQiBEUNACAAIAEgAiABayAEEYGAgIAAACIDQX9HDQAgAEGqm4CAADYCEEEYIQMLIAMLLgECf0EAIQMCQCAAKAI4IgRFDQAgBCgCQCIERQ0AIAAgBBGAgICAAAAhAwsgAwtJAQJ/QQAhAwJAIAAoAjgiBEUNACAEKAIYIgRFDQAgACABIAIgAWsgBBGBgICAAAAiA0F/Rw0AIABB7ZOAgAA2AhBBGCEDCyADCy4BAn9BACEDAkAgACgCOCIERQ0AIAQoAkQiBEUNACAAIAQRgICAgAAAIQMLIAMLLgECf0EAIQMCQCAAKAI4IgRFDQAgBCgCJCIERQ0AIAAgBBGAgICAAAAhAwsgAwsuAQJ/QQAhAwJAIAAoAjgiBEUNACAEKAIsIgRFDQAgACAEEYCAgIAAACEDCyADC0kBAn9BACEDAkAgACgCOCIERQ0AIAQoAigiBEUNACAAIAEgAiABayAEEYGAgIAAACIDQX9HDQAgAEH2iICAADYCEEEYIQMLIAMLLgECf0EAIQMCQCAAKAI4IgRFDQAgBCgCUCIERQ0AIAAgBBGAgICAAAAhAwsgAwtJAQJ/QQAhAwJAIAAoAjgiBEUNACAEKAIcIgRFDQAgACABIAIgAWsgBBGBgICAAAAiA0F/Rw0AIABBwpmAgAA2AhBBGCEDCyADCy4BAn9BACEDAkAgACgCOCIERQ0AIAQoAkgiBEUNACAAIAQRgICAgAAAIQMLIAMLSQECf0EAIQMCQCAAKAI4IgRFDQAgBCgCICIERQ0AIAAgASACIAFrIAQRgYCAgAAAIgNBf0cNACAAQZSUgIAANgIQQRghAwsgAwsuAQJ/QQAhAwJAIAAoAjgiBEUNACAEKAJMIgRFDQAgACAEEYCAgIAAACEDCyADCy4BAn9BACEDAkAgACgCOCIERQ0AIAQoAlQiBEUNACAAIAQRgICAgAAAIQMLIAMLLgECf0EAIQMCQCAAKAI4IgRFDQAgBCgCWCIERQ0AIAAgBBGAgICAAAAhAwsgAwtFAQF/AkACQCAALwEwQRRxQRRHDQBBASEDIAAtAChBAUYNASAALwEyQeUARiEDDAELIAAtAClBBUYhAwsgACADOgAuQQAL/gEBA39BASEDAkAgAC8BMCIEQQhxDQAgACkDIEIAUiEDCwJAAkAgAC0ALkUNAEEBIQUgAC0AKUEFRg0BQQEhBSAEQcAAcUUgA3FBAUcNAQtBACEFIARBwABxDQBBAiEFIARB//8DcSIDQQhxDQACQCADQYAEcUUNAAJAIAAtAChBAUcNACAALQAtQQpxDQBBBQ8LQQQPCwJAIANBIHENAAJAIAAtAChBAUYNACAALwEyQf//A3EiAEGcf2pB5ABJDQAgAEHMAUYNACAAQbACRg0AQQQhBSAEQShxRQ0CIANBiARxQYAERg0CC0EADwtBAEEDIAApAyBQGyEFCyAFC2IBAn9BACEBAkAgAC0AKEEBRg0AIAAvATJB//8DcSICQZx/akHkAEkNACACQcwBRg0AIAJBsAJGDQAgAC8BMCIAQcAAcQ0AQQEhASAAQYgEcUGABEYNACAAQShxRSEBCyABC6cBAQN/AkACQAJAIAAtACpFDQAgAC0AK0UNAEEAIQMgAC8BMCIEQQJxRQ0BDAILQQAhAyAALwEwIgRBAXFFDQELQQEhAyAALQAoQQFGDQAgAC8BMkH//wNxIgVBnH9qQeQASQ0AIAVBzAFGDQAgBUGwAkYNACAEQcAAcQ0AQQAhAyAEQYgEcUGABEYNACAEQShxQQBHIQMLIABBADsBMCAAQQA6AC8gAwuZAQECfwJAAkACQCAALQAqRQ0AIAAtACtFDQBBACEBIAAvATAiAkECcUUNAQwCC0EAIQEgAC8BMCICQQFxRQ0BC0EBIQEgAC0AKEEBRg0AIAAvATJB//8DcSIAQZx/akHkAEkNACAAQcwBRg0AIABBsAJGDQAgAkHAAHENAEEAIQEgAkGIBHFBgARGDQAgAkEocUEARyEBCyABC1kAIABBGGpCADcDACAAQgA3AwAgAEE4akIANwMAIABBMGpCADcDACAAQShqQgA3AwAgAEEgakIANwMAIABBEGpCADcDACAAQQhqQgA3AwAgAEHdATYCHEEAC3sBAX8CQCAAKAIMIgMNAAJAIAAoAgRFDQAgACABNgIECwJAIAAgASACEMSAgIAAIgMNACAAKAIMDwsgACADNgIcQQAhAyAAKAIEIgFFDQAgACABIAIgACgCCBGBgICAAAAiAUUNACAAIAI2AhQgACABNgIMIAEhAwsgAwvk8wEDDn8DfgR/I4CAgIAAQRBrIgMkgICAgAAgASEEIAEhBSABIQYgASEHIAEhCCABIQkgASEKIAEhCyABIQwgASENIAEhDiABIQ8CQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgACgCHCIQQX9qDt0B2gEB2QECAwQFBgcICQoLDA0O2AEPENcBERLWARMUFRYXGBkaG+AB3wEcHR7VAR8gISIjJCXUASYnKCkqKyzTAdIBLS7RAdABLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVG2wFHSElKzwHOAUvNAUzMAU1OT1BRUlNUVVZXWFlaW1xdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+f4ABgQGCAYMBhAGFAYYBhwGIAYkBigGLAYwBjQGOAY8BkAGRAZIBkwGUAZUBlgGXAZgBmQGaAZsBnAGdAZ4BnwGgAaEBogGjAaQBpQGmAacBqAGpAaoBqwGsAa0BrgGvAbABsQGyAbMBtAG1AbYBtwHLAcoBuAHJAbkByAG6AbsBvAG9Ab4BvwHAAcEBwgHDAcQBxQHGAQDcAQtBACEQDMYBC0EOIRAMxQELQQ0hEAzEAQtBDyEQDMMBC0EQIRAMwgELQRMhEAzBAQtBFCEQDMABC0EVIRAMvwELQRYhEAy+AQtBFyEQDL0BC0EYIRAMvAELQRkhEAy7AQtBGiEQDLoBC0EbIRAMuQELQRwhEAy4AQtBCCEQDLcBC0EdIRAMtgELQSAhEAy1AQtBHyEQDLQBC0EHIRAMswELQSEhEAyyAQtBIiEQDLEBC0EeIRAMsAELQSMhEAyvAQtBEiEQDK4BC0ERIRAMrQELQSQhEAysAQtBJSEQDKsBC0EmIRAMqgELQSchEAypAQtBwwEhEAyoAQtBKSEQDKcBC0ErIRAMpgELQSwhEAylAQtBLSEQDKQBC0EuIRAMowELQS8hEAyiAQtBxAEhEAyhAQtBMCEQDKABC0E0IRAMnwELQQwhEAyeAQtBMSEQDJ0BC0EyIRAMnAELQTMhEAybAQtBOSEQDJoBC0E1IRAMmQELQcUBIRAMmAELQQshEAyXAQtBOiEQDJYBC0E2IRAMlQELQQohEAyUAQtBNyEQDJMBC0E4IRAMkgELQTwhEAyRAQtBOyEQDJABC0E9IRAMjwELQQkhEAyOAQtBKCEQDI0BC0E+IRAMjAELQT8hEAyLAQtBwAAhEAyKAQtBwQAhEAyJAQtBwgAhEAyIAQtBwwAhEAyHAQtBxAAhEAyGAQtBxQAhEAyFAQtBxgAhEAyEAQtBKiEQDIMBC0HHACEQDIIBC0HIACEQDIEBC0HJACEQDIABC0HKACEQDH8LQcsAIRAMfgtBzQAhEAx9C0HMACEQDHwLQc4AIRAMewtBzwAhEAx6C0HQACEQDHkLQdEAIRAMeAtB0gAhEAx3C0HTACEQDHYLQdQAIRAMdQtB1gAhEAx0C0HVACEQDHMLQQYhEAxyC0HXACEQDHELQQUhEAxwC0HYACEQDG8LQQQhEAxuC0HZACEQDG0LQdoAIRAMbAtB2wAhEAxrC0HcACEQDGoLQQMhEAxpC0HdACEQDGgLQd4AIRAMZwtB3wAhEAxmC0HhACEQDGULQeAAIRAMZAtB4gAhEAxjC0HjACEQDGILQQIhEAxhC0HkACEQDGALQeUAIRAMXwtB5gAhEAxeC0HnACEQDF0LQegAIRAMXAtB6QAhEAxbC0HqACEQDFoLQesAIRAMWQtB7AAhEAxYC0HtACEQDFcLQe4AIRAMVgtB7wAhEAxVC0HwACEQDFQLQfEAIRAMUwtB8gAhEAxSC0HzACEQDFELQfQAIRAMUAtB9QAhEAxPC0H2ACEQDE4LQfcAIRAMTQtB+AAhEAxMC0H5ACEQDEsLQfoAIRAMSgtB+wAhEAxJC0H8ACEQDEgLQf0AIRAMRwtB/gAhEAxGC0H/ACEQDEULQYABIRAMRAtBgQEhEAxDC0GCASEQDEILQYMBIRAMQQtBhAEhEAxAC0GFASEQDD8LQYYBIRAMPgtBhwEhEAw9C0GIASEQDDwLQYkBIRAMOwtBigEhEAw6C0GLASEQDDkLQYwBIRAMOAtBjQEhEAw3C0GOASEQDDYLQY8BIRAMNQtBkAEhEAw0C0GRASEQDDMLQZIBIRAMMgtBkwEhEAwxC0GUASEQDDALQZUBIRAMLwtBlgEhEAwuC0GXASEQDC0LQZgBIRAMLAtBmQEhEAwrC0GaASEQDCoLQZsBIRAMKQtBnAEhEAwoC0GdASEQDCcLQZ4BIRAMJgtBnwEhEAwlC0GgASEQDCQLQaEBIRAMIwtBogEhEAwiC0GjASEQDCELQaQBIRAMIAtBpQEhEAwfC0GmASEQDB4LQacBIRAMHQtBqAEhEAwcC0GpASEQDBsLQaoBIRAMGgtBqwEhEAwZC0GsASEQDBgLQa0BIRAMFwtBrgEhEAwWC0EBIRAMFQtBrwEhEAwUC0GwASEQDBMLQbEBIRAMEgtBswEhEAwRC0GyASEQDBALQbQBIRAMDwtBtQEhEAwOC0G2ASEQDA0LQbcBIRAMDAtBuAEhEAwLC0G5ASEQDAoLQboBIRAMCQtBuwEhEAwIC0HGASEQDAcLQbwBIRAMBgtBvQEhEAwFC0G+ASEQDAQLQb8BIRAMAwtBwAEhEAwCC0HCASEQDAELQcEBIRALA0ACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCAQDscBAAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxweHyAhIyUoP0BBREVGR0hJSktMTU9QUVJT3gNXWVtcXWBiZWZnaGlqa2xtb3BxcnN0dXZ3eHl6e3x9foABggGFAYYBhwGJAYsBjAGNAY4BjwGQAZEBlAGVAZYBlwGYAZkBmgGbAZwBnQGeAZ8BoAGhAaIBowGkAaUBpgGnAagBqQGqAasBrAGtAa4BrwGwAbEBsgGzAbQBtQG2AbcBuAG5AboBuwG8Ab0BvgG/AcABwQHCAcMBxAHFAcYBxwHIAckBygHLAcwBzQHOAc8B0AHRAdIB0wHUAdUB1gHXAdgB2QHaAdsB3AHdAd4B4AHhAeIB4wHkAeUB5gHnAegB6QHqAesB7AHtAe4B7wHwAfEB8gHzAZkCpAKwAv4C/gILIAEiBCACRw3zAUHdASEQDP8DCyABIhAgAkcN3QFBwwEhEAz+AwsgASIBIAJHDZABQfcAIRAM/QMLIAEiASACRw2GAUHvACEQDPwDCyABIgEgAkcNf0HqACEQDPsDCyABIgEgAkcNe0HoACEQDPoDCyABIgEgAkcNeEHmACEQDPkDCyABIgEgAkcNGkEYIRAM+AMLIAEiASACRw0UQRIhEAz3AwsgASIBIAJHDVlBxQAhEAz2AwsgASIBIAJHDUpBPyEQDPUDCyABIgEgAkcNSEE8IRAM9AMLIAEiASACRw1BQTEhEAzzAwsgAC0ALkEBRg3rAwyHAgsgACABIgEgAhDAgICAAEEBRw3mASAAQgA3AyAM5wELIAAgASIBIAIQtICAgAAiEA3nASABIQEM9QILAkAgASIBIAJHDQBBBiEQDPADCyAAIAFBAWoiASACELuAgIAAIhAN6AEgASEBDDELIABCADcDIEESIRAM1QMLIAEiECACRw0rQR0hEAztAwsCQCABIgEgAkYNACABQQFqIQFBECEQDNQDC0EHIRAM7AMLIABCACAAKQMgIhEgAiABIhBrrSISfSITIBMgEVYbNwMgIBEgElYiFEUN5QFBCCEQDOsDCwJAIAEiASACRg0AIABBiYCAgAA2AgggACABNgIEIAEhAUEUIRAM0gMLQQkhEAzqAwsgASEBIAApAyBQDeQBIAEhAQzyAgsCQCABIgEgAkcNAEELIRAM6QMLIAAgAUEBaiIBIAIQtoCAgAAiEA3lASABIQEM8gILIAAgASIBIAIQuICAgAAiEA3lASABIQEM8gILIAAgASIBIAIQuICAgAAiEA3mASABIQEMDQsgACABIgEgAhC6gICAACIQDecBIAEhAQzwAgsCQCABIgEgAkcNAEEPIRAM5QMLIAEtAAAiEEE7Rg0IIBBBDUcN6AEgAUEBaiEBDO8CCyAAIAEiASACELqAgIAAIhAN6AEgASEBDPICCwNAAkAgAS0AAEHwtYCAAGotAAAiEEEBRg0AIBBBAkcN6wEgACgCBCEQIABBADYCBCAAIBAgAUEBaiIBELmAgIAAIhAN6gEgASEBDPQCCyABQQFqIgEgAkcNAAtBEiEQDOIDCyAAIAEiASACELqAgIAAIhAN6QEgASEBDAoLIAEiASACRw0GQRshEAzgAwsCQCABIgEgAkcNAEEWIRAM4AMLIABBioCAgAA2AgggACABNgIEIAAgASACELiAgIAAIhAN6gEgASEBQSAhEAzGAwsCQCABIgEgAkYNAANAAkAgAS0AAEHwt4CAAGotAAAiEEECRg0AAkAgEEF/ag4E5QHsAQDrAewBCyABQQFqIQFBCCEQDMgDCyABQQFqIgEgAkcNAAtBFSEQDN8DC0EVIRAM3gMLA0ACQCABLQAAQfC5gIAAai0AACIQQQJGDQAgEEF/ag4E3gHsAeAB6wHsAQsgAUEBaiIBIAJHDQALQRghEAzdAwsCQCABIgEgAkYNACAAQYuAgIAANgIIIAAgATYCBCABIQFBByEQDMQDC0EZIRAM3AMLIAFBAWohAQwCCwJAIAEiFCACRw0AQRohEAzbAwsgFCEBAkAgFC0AAEFzag4U3QLuAu4C7gLuAu4C7gLuAu4C7gLuAu4C7gLuAu4C7gLuAu4C7gIA7gILQQAhECAAQQA2AhwgAEGvi4CAADYCECAAQQI2AgwgACAUQQFqNgIUDNoDCwJAIAEtAAAiEEE7Rg0AIBBBDUcN6AEgAUEBaiEBDOUCCyABQQFqIQELQSIhEAy/AwsCQCABIhAgAkcNAEEcIRAM2AMLQgAhESAQIQEgEC0AAEFQag435wHmAQECAwQFBgcIAAAAAAAAAAkKCwwNDgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADxAREhMUAAtBHiEQDL0DC0ICIREM5QELQgMhEQzkAQtCBCERDOMBC0IFIREM4gELQgYhEQzhAQtCByERDOABC0IIIREM3wELQgkhEQzeAQtCCiERDN0BC0ILIREM3AELQgwhEQzbAQtCDSERDNoBC0IOIREM2QELQg8hEQzYAQtCCiERDNcBC0ILIREM1gELQgwhEQzVAQtCDSERDNQBC0IOIREM0wELQg8hEQzSAQtCACERAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCAQLQAAQVBqDjflAeQBAAECAwQFBgfmAeYB5gHmAeYB5gHmAQgJCgsMDeYB5gHmAeYB5gHmAeYB5gHmAeYB5gHmAeYB5gHmAeYB5gHmAeYB5gHmAeYB5gHmAeYB5gEODxAREhPmAQtCAiERDOQBC0IDIREM4wELQgQhEQziAQtCBSERDOEBC0IGIREM4AELQgchEQzfAQtCCCERDN4BC0IJIREM3QELQgohEQzcAQtCCyERDNsBC0IMIREM2gELQg0hEQzZAQtCDiERDNgBC0IPIREM1wELQgohEQzWAQtCCyERDNUBC0IMIREM1AELQg0hEQzTAQtCDiERDNIBC0IPIREM0QELIABCACAAKQMgIhEgAiABIhBrrSISfSITIBMgEVYbNwMgIBEgElYiFEUN0gFBHyEQDMADCwJAIAEiASACRg0AIABBiYCAgAA2AgggACABNgIEIAEhAUEkIRAMpwMLQSAhEAy/AwsgACABIhAgAhC+gICAAEF/ag4FtgEAxQIB0QHSAQtBESEQDKQDCyAAQQE6AC8gECEBDLsDCyABIgEgAkcN0gFBJCEQDLsDCyABIg0gAkcNHkHGACEQDLoDCyAAIAEiASACELKAgIAAIhAN1AEgASEBDLUBCyABIhAgAkcNJkHQACEQDLgDCwJAIAEiASACRw0AQSghEAy4AwsgAEEANgIEIABBjICAgAA2AgggACABIAEQsYCAgAAiEA3TASABIQEM2AELAkAgASIQIAJHDQBBKSEQDLcDCyAQLQAAIgFBIEYNFCABQQlHDdMBIBBBAWohAQwVCwJAIAEiASACRg0AIAFBAWohAQwXC0EqIRAMtQMLAkAgASIQIAJHDQBBKyEQDLUDCwJAIBAtAAAiAUEJRg0AIAFBIEcN1QELIAAtACxBCEYN0wEgECEBDJEDCwJAIAEiASACRw0AQSwhEAy0AwsgAS0AAEEKRw3VASABQQFqIQEMyQILIAEiDiACRw3VAUEvIRAMsgMLA0ACQCABLQAAIhBBIEYNAAJAIBBBdmoOBADcAdwBANoBCyABIQEM4AELIAFBAWoiASACRw0AC0ExIRAMsQMLQTIhECABIhQgAkYNsAMgAiAUayAAKAIAIgFqIRUgFCABa0EDaiEWAkADQCAULQAAIhdBIHIgFyAXQb9/akH/AXFBGkkbQf8BcSABQfC7gIAAai0AAEcNAQJAIAFBA0cNAEEGIQEMlgMLIAFBAWohASAUQQFqIhQgAkcNAAsgACAVNgIADLEDCyAAQQA2AgAgFCEBDNkBC0EzIRAgASIUIAJGDa8DIAIgFGsgACgCACIBaiEVIBQgAWtBCGohFgJAA0AgFC0AACIXQSByIBcgF0G/f2pB/wFxQRpJG0H/AXEgAUH0u4CAAGotAABHDQECQCABQQhHDQBBBSEBDJUDCyABQQFqIQEgFEEBaiIUIAJHDQALIAAgFTYCAAywAwsgAEEANgIAIBQhAQzYAQtBNCEQIAEiFCACRg2uAyACIBRrIAAoAgAiAWohFSAUIAFrQQVqIRYCQANAIBQtAAAiF0EgciAXIBdBv39qQf8BcUEaSRtB/wFxIAFB0MKAgABqLQAARw0BAkAgAUEFRw0AQQchAQyUAwsgAUEBaiEBIBRBAWoiFCACRw0ACyAAIBU2AgAMrwMLIABBADYCACAUIQEM1wELAkAgASIBIAJGDQADQAJAIAEtAABBgL6AgABqLQAAIhBBAUYNACAQQQJGDQogASEBDN0BCyABQQFqIgEgAkcNAAtBMCEQDK4DC0EwIRAMrQMLAkAgASIBIAJGDQADQAJAIAEtAAAiEEEgRg0AIBBBdmoOBNkB2gHaAdkB2gELIAFBAWoiASACRw0AC0E4IRAMrQMLQTghEAysAwsDQAJAIAEtAAAiEEEgRg0AIBBBCUcNAwsgAUEBaiIBIAJHDQALQTwhEAyrAwsDQAJAIAEtAAAiEEEgRg0AAkACQCAQQXZqDgTaAQEB2gEACyAQQSxGDdsBCyABIQEMBAsgAUEBaiIBIAJHDQALQT8hEAyqAwsgASEBDNsBC0HAACEQIAEiFCACRg2oAyACIBRrIAAoAgAiAWohFiAUIAFrQQZqIRcCQANAIBQtAABBIHIgAUGAwICAAGotAABHDQEgAUEGRg2OAyABQQFqIQEgFEEBaiIUIAJHDQALIAAgFjYCAAypAwsgAEEANgIAIBQhAQtBNiEQDI4DCwJAIAEiDyACRw0AQcEAIRAMpwMLIABBjICAgAA2AgggACAPNgIEIA8hASAALQAsQX9qDgTNAdUB1wHZAYcDCyABQQFqIQEMzAELAkAgASIBIAJGDQADQAJAIAEtAAAiEEEgciAQIBBBv39qQf8BcUEaSRtB/wFxIhBBCUYNACAQQSBGDQACQAJAAkACQCAQQZ1/ag4TAAMDAwMDAwMBAwMDAwMDAwMDAgMLIAFBAWohAUExIRAMkQMLIAFBAWohAUEyIRAMkAMLIAFBAWohAUEzIRAMjwMLIAEhAQzQAQsgAUEBaiIBIAJHDQALQTUhEAylAwtBNSEQDKQDCwJAIAEiASACRg0AA0ACQCABLQAAQYC8gIAAai0AAEEBRg0AIAEhAQzTAQsgAUEBaiIBIAJHDQALQT0hEAykAwtBPSEQDKMDCyAAIAEiASACELCAgIAAIhAN1gEgASEBDAELIBBBAWohAQtBPCEQDIcDCwJAIAEiASACRw0AQcIAIRAMoAMLAkADQAJAIAEtAABBd2oOGAAC/gL+AoQD/gL+Av4C/gL+Av4C/gL+Av4C/gL+Av4C/gL+Av4C/gL+Av4CAP4CCyABQQFqIgEgAkcNAAtBwgAhEAygAwsgAUEBaiEBIAAtAC1BAXFFDb0BIAEhAQtBLCEQDIUDCyABIgEgAkcN0wFBxAAhEAydAwsDQAJAIAEtAABBkMCAgABqLQAAQQFGDQAgASEBDLcCCyABQQFqIgEgAkcNAAtBxQAhEAycAwsgDS0AACIQQSBGDbMBIBBBOkcNgQMgACgCBCEBIABBADYCBCAAIAEgDRCvgICAACIBDdABIA1BAWohAQyzAgtBxwAhECABIg0gAkYNmgMgAiANayAAKAIAIgFqIRYgDSABa0EFaiEXA0AgDS0AACIUQSByIBQgFEG/f2pB/wFxQRpJG0H/AXEgAUGQwoCAAGotAABHDYADIAFBBUYN9AIgAUEBaiEBIA1BAWoiDSACRw0ACyAAIBY2AgAMmgMLQcgAIRAgASINIAJGDZkDIAIgDWsgACgCACIBaiEWIA0gAWtBCWohFwNAIA0tAAAiFEEgciAUIBRBv39qQf8BcUEaSRtB/wFxIAFBlsKAgABqLQAARw3/AgJAIAFBCUcNAEECIQEM9QILIAFBAWohASANQQFqIg0gAkcNAAsgACAWNgIADJkDCwJAIAEiDSACRw0AQckAIRAMmQMLAkACQCANLQAAIgFBIHIgASABQb9/akH/AXFBGkkbQf8BcUGSf2oOBwCAA4ADgAOAA4ADAYADCyANQQFqIQFBPiEQDIADCyANQQFqIQFBPyEQDP8CC0HKACEQIAEiDSACRg2XAyACIA1rIAAoAgAiAWohFiANIAFrQQFqIRcDQCANLQAAIhRBIHIgFCAUQb9/akH/AXFBGkkbQf8BcSABQaDCgIAAai0AAEcN/QIgAUEBRg3wAiABQQFqIQEgDUEBaiINIAJHDQALIAAgFjYCAAyXAwtBywAhECABIg0gAkYNlgMgAiANayAAKAIAIgFqIRYgDSABa0EOaiEXA0AgDS0AACIUQSByIBQgFEG/f2pB/wFxQRpJG0H/AXEgAUGiwoCAAGotAABHDfwCIAFBDkYN8AIgAUEBaiEBIA1BAWoiDSACRw0ACyAAIBY2AgAMlgMLQcwAIRAgASINIAJGDZUDIAIgDWsgACgCACIBaiEWIA0gAWtBD2ohFwNAIA0tAAAiFEEgciAUIBRBv39qQf8BcUEaSRtB/wFxIAFBwMKAgABqLQAARw37AgJAIAFBD0cNAEEDIQEM8QILIAFBAWohASANQQFqIg0gAkcNAAsgACAWNgIADJUDC0HNACEQIAEiDSACRg2UAyACIA1rIAAoAgAiAWohFiANIAFrQQVqIRcDQCANLQAAIhRBIHIgFCAUQb9/akH/AXFBGkkbQf8BcSABQdDCgIAAai0AAEcN+gICQCABQQVHDQBBBCEBDPACCyABQQFqIQEgDUEBaiINIAJHDQALIAAgFjYCAAyUAwsCQCABIg0gAkcNAEHOACEQDJQDCwJAAkACQAJAIA0tAAAiAUEgciABIAFBv39qQf8BcUEaSRtB/wFxQZ1/ag4TAP0C/QL9Av0C/QL9Av0C/QL9Av0C/QL9AgH9Av0C/QICA/0CCyANQQFqIQFBwQAhEAz9AgsgDUEBaiEBQcIAIRAM/AILIA1BAWohAUHDACEQDPsCCyANQQFqIQFBxAAhEAz6AgsCQCABIgEgAkYNACAAQY2AgIAANgIIIAAgATYCBCABIQFBxQAhEAz6AgtBzwAhEAySAwsgECEBAkACQCAQLQAAQXZqDgQBqAKoAgCoAgsgEEEBaiEBC0EnIRAM+AILAkAgASIBIAJHDQBB0QAhEAyRAwsCQCABLQAAQSBGDQAgASEBDI0BCyABQQFqIQEgAC0ALUEBcUUNxwEgASEBDIwBCyABIhcgAkcNyAFB0gAhEAyPAwtB0wAhECABIhQgAkYNjgMgAiAUayAAKAIAIgFqIRYgFCABa0EBaiEXA0AgFC0AACABQdbCgIAAai0AAEcNzAEgAUEBRg3HASABQQFqIQEgFEEBaiIUIAJHDQALIAAgFjYCAAyOAwsCQCABIgEgAkcNAEHVACEQDI4DCyABLQAAQQpHDcwBIAFBAWohAQzHAQsCQCABIgEgAkcNAEHWACEQDI0DCwJAAkAgAS0AAEF2ag4EAM0BzQEBzQELIAFBAWohAQzHAQsgAUEBaiEBQcoAIRAM8wILIAAgASIBIAIQroCAgAAiEA3LASABIQFBzQAhEAzyAgsgAC0AKUEiRg2FAwymAgsCQCABIgEgAkcNAEHbACEQDIoDC0EAIRRBASEXQQEhFkEAIRACQAJAAkACQAJAAkACQAJAAkAgAS0AAEFQag4K1AHTAQABAgMEBQYI1QELQQIhEAwGC0EDIRAMBQtBBCEQDAQLQQUhEAwDC0EGIRAMAgtBByEQDAELQQghEAtBACEXQQAhFkEAIRQMzAELQQkhEEEBIRRBACEXQQAhFgzLAQsCQCABIgEgAkcNAEHdACEQDIkDCyABLQAAQS5HDcwBIAFBAWohAQymAgsgASIBIAJHDcwBQd8AIRAMhwMLAkAgASIBIAJGDQAgAEGOgICAADYCCCAAIAE2AgQgASEBQdAAIRAM7gILQeAAIRAMhgMLQeEAIRAgASIBIAJGDYUDIAIgAWsgACgCACIUaiEWIAEgFGtBA2ohFwNAIAEtAAAgFEHiwoCAAGotAABHDc0BIBRBA0YNzAEgFEEBaiEUIAFBAWoiASACRw0ACyAAIBY2AgAMhQMLQeIAIRAgASIBIAJGDYQDIAIgAWsgACgCACIUaiEWIAEgFGtBAmohFwNAIAEtAAAgFEHmwoCAAGotAABHDcwBIBRBAkYNzgEgFEEBaiEUIAFBAWoiASACRw0ACyAAIBY2AgAMhAMLQeMAIRAgASIBIAJGDYMDIAIgAWsgACgCACIUaiEWIAEgFGtBA2ohFwNAIAEtAAAgFEHpwoCAAGotAABHDcsBIBRBA0YNzgEgFEEBaiEUIAFBAWoiASACRw0ACyAAIBY2AgAMgwMLAkAgASIBIAJHDQBB5QAhEAyDAwsgACABQQFqIgEgAhCogICAACIQDc0BIAEhAUHWACEQDOkCCwJAIAEiASACRg0AA0ACQCABLQAAIhBBIEYNAAJAAkACQCAQQbh/ag4LAAHPAc8BzwHPAc8BzwHPAc8BAs8BCyABQQFqIQFB0gAhEAztAgsgAUEBaiEBQdMAIRAM7AILIAFBAWohAUHUACEQDOsCCyABQQFqIgEgAkcNAAtB5AAhEAyCAwtB5AAhEAyBAwsDQAJAIAEtAABB8MKAgABqLQAAIhBBAUYNACAQQX5qDgPPAdAB0QHSAQsgAUEBaiIBIAJHDQALQeYAIRAMgAMLAkAgASIBIAJGDQAgAUEBaiEBDAMLQecAIRAM/wILA0ACQCABLQAAQfDEgIAAai0AACIQQQFGDQACQCAQQX5qDgTSAdMB1AEA1QELIAEhAUHXACEQDOcCCyABQQFqIgEgAkcNAAtB6AAhEAz+AgsCQCABIgEgAkcNAEHpACEQDP4CCwJAIAEtAAAiEEF2ag4augHVAdUBvAHVAdUB1QHVAdUB1QHVAdUB1QHVAdUB1QHVAdUB1QHVAdUB1QHKAdUB1QEA0wELIAFBAWohAQtBBiEQDOMCCwNAAkAgAS0AAEHwxoCAAGotAABBAUYNACABIQEMngILIAFBAWoiASACRw0AC0HqACEQDPsCCwJAIAEiASACRg0AIAFBAWohAQwDC0HrACEQDPoCCwJAIAEiASACRw0AQewAIRAM+gILIAFBAWohAQwBCwJAIAEiASACRw0AQe0AIRAM+QILIAFBAWohAQtBBCEQDN4CCwJAIAEiFCACRw0AQe4AIRAM9wILIBQhAQJAAkACQCAULQAAQfDIgIAAai0AAEF/ag4H1AHVAdYBAJwCAQLXAQsgFEEBaiEBDAoLIBRBAWohAQzNAQtBACEQIABBADYCHCAAQZuSgIAANgIQIABBBzYCDCAAIBRBAWo2AhQM9gILAkADQAJAIAEtAABB8MiAgABqLQAAIhBBBEYNAAJAAkAgEEF/ag4H0gHTAdQB2QEABAHZAQsgASEBQdoAIRAM4AILIAFBAWohAUHcACEQDN8CCyABQQFqIgEgAkcNAAtB7wAhEAz2AgsgAUEBaiEBDMsBCwJAIAEiFCACRw0AQfAAIRAM9QILIBQtAABBL0cN1AEgFEEBaiEBDAYLAkAgASIUIAJHDQBB8QAhEAz0AgsCQCAULQAAIgFBL0cNACAUQQFqIQFB3QAhEAzbAgsgAUF2aiIEQRZLDdMBQQEgBHRBiYCAAnFFDdMBDMoCCwJAIAEiASACRg0AIAFBAWohAUHeACEQDNoCC0HyACEQDPICCwJAIAEiFCACRw0AQfQAIRAM8gILIBQhAQJAIBQtAABB8MyAgABqLQAAQX9qDgPJApQCANQBC0HhACEQDNgCCwJAIAEiFCACRg0AA0ACQCAULQAAQfDKgIAAai0AACIBQQNGDQACQCABQX9qDgLLAgDVAQsgFCEBQd8AIRAM2gILIBRBAWoiFCACRw0AC0HzACEQDPECC0HzACEQDPACCwJAIAEiASACRg0AIABBj4CAgAA2AgggACABNgIEIAEhAUHgACEQDNcCC0H1ACEQDO8CCwJAIAEiASACRw0AQfYAIRAM7wILIABBj4CAgAA2AgggACABNgIEIAEhAQtBAyEQDNQCCwNAIAEtAABBIEcNwwIgAUEBaiIBIAJHDQALQfcAIRAM7AILAkAgASIBIAJHDQBB+AAhEAzsAgsgAS0AAEEgRw3OASABQQFqIQEM7wELIAAgASIBIAIQrICAgAAiEA3OASABIQEMjgILAkAgASIEIAJHDQBB+gAhEAzqAgsgBC0AAEHMAEcN0QEgBEEBaiEBQRMhEAzPAQsCQCABIgQgAkcNAEH7ACEQDOkCCyACIARrIAAoAgAiAWohFCAEIAFrQQVqIRADQCAELQAAIAFB8M6AgABqLQAARw3QASABQQVGDc4BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQfsAIRAM6AILAkAgASIEIAJHDQBB/AAhEAzoAgsCQAJAIAQtAABBvX9qDgwA0QHRAdEB0QHRAdEB0QHRAdEB0QEB0QELIARBAWohAUHmACEQDM8CCyAEQQFqIQFB5wAhEAzOAgsCQCABIgQgAkcNAEH9ACEQDOcCCyACIARrIAAoAgAiAWohFCAEIAFrQQJqIRACQANAIAQtAAAgAUHtz4CAAGotAABHDc8BIAFBAkYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEH9ACEQDOcCCyAAQQA2AgAgEEEBaiEBQRAhEAzMAQsCQCABIgQgAkcNAEH+ACEQDOYCCyACIARrIAAoAgAiAWohFCAEIAFrQQVqIRACQANAIAQtAAAgAUH2zoCAAGotAABHDc4BIAFBBUYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEH+ACEQDOYCCyAAQQA2AgAgEEEBaiEBQRYhEAzLAQsCQCABIgQgAkcNAEH/ACEQDOUCCyACIARrIAAoAgAiAWohFCAEIAFrQQNqIRACQANAIAQtAAAgAUH8zoCAAGotAABHDc0BIAFBA0YNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEH/ACEQDOUCCyAAQQA2AgAgEEEBaiEBQQUhEAzKAQsCQCABIgQgAkcNAEGAASEQDOQCCyAELQAAQdkARw3LASAEQQFqIQFBCCEQDMkBCwJAIAEiBCACRw0AQYEBIRAM4wILAkACQCAELQAAQbJ/ag4DAMwBAcwBCyAEQQFqIQFB6wAhEAzKAgsgBEEBaiEBQewAIRAMyQILAkAgASIEIAJHDQBBggEhEAziAgsCQAJAIAQtAABBuH9qDggAywHLAcsBywHLAcsBAcsBCyAEQQFqIQFB6gAhEAzJAgsgBEEBaiEBQe0AIRAMyAILAkAgASIEIAJHDQBBgwEhEAzhAgsgAiAEayAAKAIAIgFqIRAgBCABa0ECaiEUAkADQCAELQAAIAFBgM+AgABqLQAARw3JASABQQJGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBA2AgBBgwEhEAzhAgtBACEQIABBADYCACAUQQFqIQEMxgELAkAgASIEIAJHDQBBhAEhEAzgAgsgAiAEayAAKAIAIgFqIRQgBCABa0EEaiEQAkADQCAELQAAIAFBg8+AgABqLQAARw3IASABQQRGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBBhAEhEAzgAgsgAEEANgIAIBBBAWohAUEjIRAMxQELAkAgASIEIAJHDQBBhQEhEAzfAgsCQAJAIAQtAABBtH9qDggAyAHIAcgByAHIAcgBAcgBCyAEQQFqIQFB7wAhEAzGAgsgBEEBaiEBQfAAIRAMxQILAkAgASIEIAJHDQBBhgEhEAzeAgsgBC0AAEHFAEcNxQEgBEEBaiEBDIMCCwJAIAEiBCACRw0AQYcBIRAM3QILIAIgBGsgACgCACIBaiEUIAQgAWtBA2ohEAJAA0AgBC0AACABQYjPgIAAai0AAEcNxQEgAUEDRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQYcBIRAM3QILIABBADYCACAQQQFqIQFBLSEQDMIBCwJAIAEiBCACRw0AQYgBIRAM3AILIAIgBGsgACgCACIBaiEUIAQgAWtBCGohEAJAA0AgBC0AACABQdDPgIAAai0AAEcNxAEgAUEIRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQYgBIRAM3AILIABBADYCACAQQQFqIQFBKSEQDMEBCwJAIAEiASACRw0AQYkBIRAM2wILQQEhECABLQAAQd8ARw3AASABQQFqIQEMgQILAkAgASIEIAJHDQBBigEhEAzaAgsgAiAEayAAKAIAIgFqIRQgBCABa0EBaiEQA0AgBC0AACABQYzPgIAAai0AAEcNwQEgAUEBRg2vAiABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEGKASEQDNkCCwJAIAEiBCACRw0AQYsBIRAM2QILIAIgBGsgACgCACIBaiEUIAQgAWtBAmohEAJAA0AgBC0AACABQY7PgIAAai0AAEcNwQEgAUECRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQYsBIRAM2QILIABBADYCACAQQQFqIQFBAiEQDL4BCwJAIAEiBCACRw0AQYwBIRAM2AILIAIgBGsgACgCACIBaiEUIAQgAWtBAWohEAJAA0AgBC0AACABQfDPgIAAai0AAEcNwAEgAUEBRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQYwBIRAM2AILIABBADYCACAQQQFqIQFBHyEQDL0BCwJAIAEiBCACRw0AQY0BIRAM1wILIAIgBGsgACgCACIBaiEUIAQgAWtBAWohEAJAA0AgBC0AACABQfLPgIAAai0AAEcNvwEgAUEBRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQY0BIRAM1wILIABBADYCACAQQQFqIQFBCSEQDLwBCwJAIAEiBCACRw0AQY4BIRAM1gILAkACQCAELQAAQbd/ag4HAL8BvwG/Ab8BvwEBvwELIARBAWohAUH4ACEQDL0CCyAEQQFqIQFB+QAhEAy8AgsCQCABIgQgAkcNAEGPASEQDNUCCyACIARrIAAoAgAiAWohFCAEIAFrQQVqIRACQANAIAQtAAAgAUGRz4CAAGotAABHDb0BIAFBBUYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEGPASEQDNUCCyAAQQA2AgAgEEEBaiEBQRghEAy6AQsCQCABIgQgAkcNAEGQASEQDNQCCyACIARrIAAoAgAiAWohFCAEIAFrQQJqIRACQANAIAQtAAAgAUGXz4CAAGotAABHDbwBIAFBAkYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEGQASEQDNQCCyAAQQA2AgAgEEEBaiEBQRchEAy5AQsCQCABIgQgAkcNAEGRASEQDNMCCyACIARrIAAoAgAiAWohFCAEIAFrQQZqIRACQANAIAQtAAAgAUGaz4CAAGotAABHDbsBIAFBBkYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEGRASEQDNMCCyAAQQA2AgAgEEEBaiEBQRUhEAy4AQsCQCABIgQgAkcNAEGSASEQDNICCyACIARrIAAoAgAiAWohFCAEIAFrQQVqIRACQANAIAQtAAAgAUGhz4CAAGotAABHDboBIAFBBUYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEGSASEQDNICCyAAQQA2AgAgEEEBaiEBQR4hEAy3AQsCQCABIgQgAkcNAEGTASEQDNECCyAELQAAQcwARw24ASAEQQFqIQFBCiEQDLYBCwJAIAQgAkcNAEGUASEQDNACCwJAAkAgBC0AAEG/f2oODwC5AbkBuQG5AbkBuQG5AbkBuQG5AbkBuQG5AQG5AQsgBEEBaiEBQf4AIRAMtwILIARBAWohAUH/ACEQDLYCCwJAIAQgAkcNAEGVASEQDM8CCwJAAkAgBC0AAEG/f2oOAwC4AQG4AQsgBEEBaiEBQf0AIRAMtgILIARBAWohBEGAASEQDLUCCwJAIAQgAkcNAEGWASEQDM4CCyACIARrIAAoAgAiAWohFCAEIAFrQQFqIRACQANAIAQtAAAgAUGnz4CAAGotAABHDbYBIAFBAUYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEGWASEQDM4CCyAAQQA2AgAgEEEBaiEBQQshEAyzAQsCQCAEIAJHDQBBlwEhEAzNAgsCQAJAAkACQCAELQAAQVNqDiMAuAG4AbgBuAG4AbgBuAG4AbgBuAG4AbgBuAG4AbgBuAG4AbgBuAG4AbgBuAG4AQG4AbgBuAG4AbgBArgBuAG4AQO4AQsgBEEBaiEBQfsAIRAMtgILIARBAWohAUH8ACEQDLUCCyAEQQFqIQRBgQEhEAy0AgsgBEEBaiEEQYIBIRAMswILAkAgBCACRw0AQZgBIRAMzAILIAIgBGsgACgCACIBaiEUIAQgAWtBBGohEAJAA0AgBC0AACABQanPgIAAai0AAEcNtAEgAUEERg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQZgBIRAMzAILIABBADYCACAQQQFqIQFBGSEQDLEBCwJAIAQgAkcNAEGZASEQDMsCCyACIARrIAAoAgAiAWohFCAEIAFrQQVqIRACQANAIAQtAAAgAUGuz4CAAGotAABHDbMBIAFBBUYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEGZASEQDMsCCyAAQQA2AgAgEEEBaiEBQQYhEAywAQsCQCAEIAJHDQBBmgEhEAzKAgsgAiAEayAAKAIAIgFqIRQgBCABa0EBaiEQAkADQCAELQAAIAFBtM+AgABqLQAARw2yASABQQFGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBBmgEhEAzKAgsgAEEANgIAIBBBAWohAUEcIRAMrwELAkAgBCACRw0AQZsBIRAMyQILIAIgBGsgACgCACIBaiEUIAQgAWtBAWohEAJAA0AgBC0AACABQbbPgIAAai0AAEcNsQEgAUEBRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQZsBIRAMyQILIABBADYCACAQQQFqIQFBJyEQDK4BCwJAIAQgAkcNAEGcASEQDMgCCwJAAkAgBC0AAEGsf2oOAgABsQELIARBAWohBEGGASEQDK8CCyAEQQFqIQRBhwEhEAyuAgsCQCAEIAJHDQBBnQEhEAzHAgsgAiAEayAAKAIAIgFqIRQgBCABa0EBaiEQAkADQCAELQAAIAFBuM+AgABqLQAARw2vASABQQFGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBBnQEhEAzHAgsgAEEANgIAIBBBAWohAUEmIRAMrAELAkAgBCACRw0AQZ4BIRAMxgILIAIgBGsgACgCACIBaiEUIAQgAWtBAWohEAJAA0AgBC0AACABQbrPgIAAai0AAEcNrgEgAUEBRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQZ4BIRAMxgILIABBADYCACAQQQFqIQFBAyEQDKsBCwJAIAQgAkcNAEGfASEQDMUCCyACIARrIAAoAgAiAWohFCAEIAFrQQJqIRACQANAIAQtAAAgAUHtz4CAAGotAABHDa0BIAFBAkYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEGfASEQDMUCCyAAQQA2AgAgEEEBaiEBQQwhEAyqAQsCQCAEIAJHDQBBoAEhEAzEAgsgAiAEayAAKAIAIgFqIRQgBCABa0EDaiEQAkADQCAELQAAIAFBvM+AgABqLQAARw2sASABQQNGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBBoAEhEAzEAgsgAEEANgIAIBBBAWohAUENIRAMqQELAkAgBCACRw0AQaEBIRAMwwILAkACQCAELQAAQbp/ag4LAKwBrAGsAawBrAGsAawBrAGsAQGsAQsgBEEBaiEEQYsBIRAMqgILIARBAWohBEGMASEQDKkCCwJAIAQgAkcNAEGiASEQDMICCyAELQAAQdAARw2pASAEQQFqIQQM6QELAkAgBCACRw0AQaMBIRAMwQILAkACQCAELQAAQbd/ag4HAaoBqgGqAaoBqgEAqgELIARBAWohBEGOASEQDKgCCyAEQQFqIQFBIiEQDKYBCwJAIAQgAkcNAEGkASEQDMACCyACIARrIAAoAgAiAWohFCAEIAFrQQFqIRACQANAIAQtAAAgAUHAz4CAAGotAABHDagBIAFBAUYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEGkASEQDMACCyAAQQA2AgAgEEEBaiEBQR0hEAylAQsCQCAEIAJHDQBBpQEhEAy/AgsCQAJAIAQtAABBrn9qDgMAqAEBqAELIARBAWohBEGQASEQDKYCCyAEQQFqIQFBBCEQDKQBCwJAIAQgAkcNAEGmASEQDL4CCwJAAkACQAJAAkAgBC0AAEG/f2oOFQCqAaoBqgGqAaoBqgGqAaoBqgGqAQGqAaoBAqoBqgEDqgGqAQSqAQsgBEEBaiEEQYgBIRAMqAILIARBAWohBEGJASEQDKcCCyAEQQFqIQRBigEhEAymAgsgBEEBaiEEQY8BIRAMpQILIARBAWohBEGRASEQDKQCCwJAIAQgAkcNAEGnASEQDL0CCyACIARrIAAoAgAiAWohFCAEIAFrQQJqIRACQANAIAQtAAAgAUHtz4CAAGotAABHDaUBIAFBAkYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEGnASEQDL0CCyAAQQA2AgAgEEEBaiEBQREhEAyiAQsCQCAEIAJHDQBBqAEhEAy8AgsgAiAEayAAKAIAIgFqIRQgBCABa0ECaiEQAkADQCAELQAAIAFBws+AgABqLQAARw2kASABQQJGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBBqAEhEAy8AgsgAEEANgIAIBBBAWohAUEsIRAMoQELAkAgBCACRw0AQakBIRAMuwILIAIgBGsgACgCACIBaiEUIAQgAWtBBGohEAJAA0AgBC0AACABQcXPgIAAai0AAEcNowEgAUEERg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQakBIRAMuwILIABBADYCACAQQQFqIQFBKyEQDKABCwJAIAQgAkcNAEGqASEQDLoCCyACIARrIAAoAgAiAWohFCAEIAFrQQJqIRACQANAIAQtAAAgAUHKz4CAAGotAABHDaIBIAFBAkYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEGqASEQDLoCCyAAQQA2AgAgEEEBaiEBQRQhEAyfAQsCQCAEIAJHDQBBqwEhEAy5AgsCQAJAAkACQCAELQAAQb5/ag4PAAECpAGkAaQBpAGkAaQBpAGkAaQBpAGkAQOkAQsgBEEBaiEEQZMBIRAMogILIARBAWohBEGUASEQDKECCyAEQQFqIQRBlQEhEAygAgsgBEEBaiEEQZYBIRAMnwILAkAgBCACRw0AQawBIRAMuAILIAQtAABBxQBHDZ8BIARBAWohBAzgAQsCQCAEIAJHDQBBrQEhEAy3AgsgAiAEayAAKAIAIgFqIRQgBCABa0ECaiEQAkADQCAELQAAIAFBzc+AgABqLQAARw2fASABQQJGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBBrQEhEAy3AgsgAEEANgIAIBBBAWohAUEOIRAMnAELAkAgBCACRw0AQa4BIRAMtgILIAQtAABB0ABHDZ0BIARBAWohAUElIRAMmwELAkAgBCACRw0AQa8BIRAMtQILIAIgBGsgACgCACIBaiEUIAQgAWtBCGohEAJAA0AgBC0AACABQdDPgIAAai0AAEcNnQEgAUEIRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQa8BIRAMtQILIABBADYCACAQQQFqIQFBKiEQDJoBCwJAIAQgAkcNAEGwASEQDLQCCwJAAkAgBC0AAEGrf2oOCwCdAZ0BnQGdAZ0BnQGdAZ0BnQEBnQELIARBAWohBEGaASEQDJsCCyAEQQFqIQRBmwEhEAyaAgsCQCAEIAJHDQBBsQEhEAyzAgsCQAJAIAQtAABBv39qDhQAnAGcAZwBnAGcAZwBnAGcAZwBnAGcAZwBnAGcAZwBnAGcAZwBAZwBCyAEQQFqIQRBmQEhEAyaAgsgBEEBaiEEQZwBIRAMmQILAkAgBCACRw0AQbIBIRAMsgILIAIgBGsgACgCACIBaiEUIAQgAWtBA2ohEAJAA0AgBC0AACABQdnPgIAAai0AAEcNmgEgAUEDRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQbIBIRAMsgILIABBADYCACAQQQFqIQFBISEQDJcBCwJAIAQgAkcNAEGzASEQDLECCyACIARrIAAoAgAiAWohFCAEIAFrQQZqIRACQANAIAQtAAAgAUHdz4CAAGotAABHDZkBIAFBBkYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEGzASEQDLECCyAAQQA2AgAgEEEBaiEBQRohEAyWAQsCQCAEIAJHDQBBtAEhEAywAgsCQAJAAkAgBC0AAEG7f2oOEQCaAZoBmgGaAZoBmgGaAZoBmgEBmgGaAZoBmgGaAQKaAQsgBEEBaiEEQZ0BIRAMmAILIARBAWohBEGeASEQDJcCCyAEQQFqIQRBnwEhEAyWAgsCQCAEIAJHDQBBtQEhEAyvAgsgAiAEayAAKAIAIgFqIRQgBCABa0EFaiEQAkADQCAELQAAIAFB5M+AgABqLQAARw2XASABQQVGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBBtQEhEAyvAgsgAEEANgIAIBBBAWohAUEoIRAMlAELAkAgBCACRw0AQbYBIRAMrgILIAIgBGsgACgCACIBaiEUIAQgAWtBAmohEAJAA0AgBC0AACABQerPgIAAai0AAEcNlgEgAUECRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQbYBIRAMrgILIABBADYCACAQQQFqIQFBByEQDJMBCwJAIAQgAkcNAEG3ASEQDK0CCwJAAkAgBC0AAEG7f2oODgCWAZYBlgGWAZYBlgGWAZYBlgGWAZYBlgEBlgELIARBAWohBEGhASEQDJQCCyAEQQFqIQRBogEhEAyTAgsCQCAEIAJHDQBBuAEhEAysAgsgAiAEayAAKAIAIgFqIRQgBCABa0ECaiEQAkADQCAELQAAIAFB7c+AgABqLQAARw2UASABQQJGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBBuAEhEAysAgsgAEEANgIAIBBBAWohAUESIRAMkQELAkAgBCACRw0AQbkBIRAMqwILIAIgBGsgACgCACIBaiEUIAQgAWtBAWohEAJAA0AgBC0AACABQfDPgIAAai0AAEcNkwEgAUEBRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQbkBIRAMqwILIABBADYCACAQQQFqIQFBICEQDJABCwJAIAQgAkcNAEG6ASEQDKoCCyACIARrIAAoAgAiAWohFCAEIAFrQQFqIRACQANAIAQtAAAgAUHyz4CAAGotAABHDZIBIAFBAUYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEG6ASEQDKoCCyAAQQA2AgAgEEEBaiEBQQ8hEAyPAQsCQCAEIAJHDQBBuwEhEAypAgsCQAJAIAQtAABBt39qDgcAkgGSAZIBkgGSAQGSAQsgBEEBaiEEQaUBIRAMkAILIARBAWohBEGmASEQDI8CCwJAIAQgAkcNAEG8ASEQDKgCCyACIARrIAAoAgAiAWohFCAEIAFrQQdqIRACQANAIAQtAAAgAUH0z4CAAGotAABHDZABIAFBB0YNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEG8ASEQDKgCCyAAQQA2AgAgEEEBaiEBQRshEAyNAQsCQCAEIAJHDQBBvQEhEAynAgsCQAJAAkAgBC0AAEG+f2oOEgCRAZEBkQGRAZEBkQGRAZEBkQEBkQGRAZEBkQGRAZEBApEBCyAEQQFqIQRBpAEhEAyPAgsgBEEBaiEEQacBIRAMjgILIARBAWohBEGoASEQDI0CCwJAIAQgAkcNAEG+ASEQDKYCCyAELQAAQc4ARw2NASAEQQFqIQQMzwELAkAgBCACRw0AQb8BIRAMpQILAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgBC0AAEG/f2oOFQABAgOcAQQFBpwBnAGcAQcICQoLnAEMDQ4PnAELIARBAWohAUHoACEQDJoCCyAEQQFqIQFB6QAhEAyZAgsgBEEBaiEBQe4AIRAMmAILIARBAWohAUHyACEQDJcCCyAEQQFqIQFB8wAhEAyWAgsgBEEBaiEBQfYAIRAMlQILIARBAWohAUH3ACEQDJQCCyAEQQFqIQFB+gAhEAyTAgsgBEEBaiEEQYMBIRAMkgILIARBAWohBEGEASEQDJECCyAEQQFqIQRBhQEhEAyQAgsgBEEBaiEEQZIBIRAMjwILIARBAWohBEGYASEQDI4CCyAEQQFqIQRBoAEhEAyNAgsgBEEBaiEEQaMBIRAMjAILIARBAWohBEGqASEQDIsCCwJAIAQgAkYNACAAQZCAgIAANgIIIAAgBDYCBEGrASEQDIsCC0HAASEQDKMCCyAAIAUgAhCqgICAACIBDYsBIAUhAQxcCwJAIAYgAkYNACAGQQFqIQUMjQELQcIBIRAMoQILA0ACQCAQLQAAQXZqDgSMAQAAjwEACyAQQQFqIhAgAkcNAAtBwwEhEAygAgsCQCAHIAJGDQAgAEGRgICAADYCCCAAIAc2AgQgByEBQQEhEAyHAgtBxAEhEAyfAgsCQCAHIAJHDQBBxQEhEAyfAgsCQAJAIActAABBdmoOBAHOAc4BAM4BCyAHQQFqIQYMjQELIAdBAWohBQyJAQsCQCAHIAJHDQBBxgEhEAyeAgsCQAJAIActAABBdmoOFwGPAY8BAY8BjwGPAY8BjwGPAY8BjwGPAY8BjwGPAY8BjwGPAY8BjwGPAQCPAQsgB0EBaiEHC0GwASEQDIQCCwJAIAggAkcNAEHIASEQDJ0CCyAILQAAQSBHDY0BIABBADsBMiAIQQFqIQFBswEhEAyDAgsgASEXAkADQCAXIgcgAkYNASAHLQAAQVBqQf8BcSIQQQpPDcwBAkAgAC8BMiIUQZkzSw0AIAAgFEEKbCIUOwEyIBBB//8DcyAUQf7/A3FJDQAgB0EBaiEXIAAgFCAQaiIQOwEyIBBB//8DcUHoB0kNAQsLQQAhECAAQQA2AhwgAEHBiYCAADYCECAAQQ02AgwgACAHQQFqNgIUDJwCC0HHASEQDJsCCyAAIAggAhCugICAACIQRQ3KASAQQRVHDYwBIABByAE2AhwgACAINgIUIABByZeAgAA2AhAgAEEVNgIMQQAhEAyaAgsCQCAJIAJHDQBBzAEhEAyaAgtBACEUQQEhF0EBIRZBACEQAkACQAJAAkACQAJAAkACQAJAIAktAABBUGoOCpYBlQEAAQIDBAUGCJcBC0ECIRAMBgtBAyEQDAULQQQhEAwEC0EFIRAMAwtBBiEQDAILQQchEAwBC0EIIRALQQAhF0EAIRZBACEUDI4BC0EJIRBBASEUQQAhF0EAIRYMjQELAkAgCiACRw0AQc4BIRAMmQILIAotAABBLkcNjgEgCkEBaiEJDMoBCyALIAJHDY4BQdABIRAMlwILAkAgCyACRg0AIABBjoCAgAA2AgggACALNgIEQbcBIRAM/gELQdEBIRAMlgILAkAgBCACRw0AQdIBIRAMlgILIAIgBGsgACgCACIQaiEUIAQgEGtBBGohCwNAIAQtAAAgEEH8z4CAAGotAABHDY4BIBBBBEYN6QEgEEEBaiEQIARBAWoiBCACRw0ACyAAIBQ2AgBB0gEhEAyVAgsgACAMIAIQrICAgAAiAQ2NASAMIQEMuAELAkAgBCACRw0AQdQBIRAMlAILIAIgBGsgACgCACIQaiEUIAQgEGtBAWohDANAIAQtAAAgEEGB0ICAAGotAABHDY8BIBBBAUYNjgEgEEEBaiEQIARBAWoiBCACRw0ACyAAIBQ2AgBB1AEhEAyTAgsCQCAEIAJHDQBB1gEhEAyTAgsgAiAEayAAKAIAIhBqIRQgBCAQa0ECaiELA0AgBC0AACAQQYPQgIAAai0AAEcNjgEgEEECRg2QASAQQQFqIRAgBEEBaiIEIAJHDQALIAAgFDYCAEHWASEQDJICCwJAIAQgAkcNAEHXASEQDJICCwJAAkAgBC0AAEG7f2oOEACPAY8BjwGPAY8BjwGPAY8BjwGPAY8BjwGPAY8BAY8BCyAEQQFqIQRBuwEhEAz5AQsgBEEBaiEEQbwBIRAM+AELAkAgBCACRw0AQdgBIRAMkQILIAQtAABByABHDYwBIARBAWohBAzEAQsCQCAEIAJGDQAgAEGQgICAADYCCCAAIAQ2AgRBvgEhEAz3AQtB2QEhEAyPAgsCQCAEIAJHDQBB2gEhEAyPAgsgBC0AAEHIAEYNwwEgAEEBOgAoDLkBCyAAQQI6AC8gACAEIAIQpoCAgAAiEA2NAUHCASEQDPQBCyAALQAoQX9qDgK3AbkBuAELA0ACQCAELQAAQXZqDgQAjgGOAQCOAQsgBEEBaiIEIAJHDQALQd0BIRAMiwILIABBADoALyAALQAtQQRxRQ2EAgsgAEEAOgAvIABBAToANCABIQEMjAELIBBBFUYN2gEgAEEANgIcIAAgATYCFCAAQaeOgIAANgIQIABBEjYCDEEAIRAMiAILAkAgACAQIAIQtICAgAAiBA0AIBAhAQyBAgsCQCAEQRVHDQAgAEEDNgIcIAAgEDYCFCAAQbCYgIAANgIQIABBFTYCDEEAIRAMiAILIABBADYCHCAAIBA2AhQgAEGnjoCAADYCECAAQRI2AgxBACEQDIcCCyAQQRVGDdYBIABBADYCHCAAIAE2AhQgAEHajYCAADYCECAAQRQ2AgxBACEQDIYCCyAAKAIEIRcgAEEANgIEIBAgEadqIhYhASAAIBcgECAWIBQbIhAQtYCAgAAiFEUNjQEgAEEHNgIcIAAgEDYCFCAAIBQ2AgxBACEQDIUCCyAAIAAvATBBgAFyOwEwIAEhAQtBKiEQDOoBCyAQQRVGDdEBIABBADYCHCAAIAE2AhQgAEGDjICAADYCECAAQRM2AgxBACEQDIICCyAQQRVGDc8BIABBADYCHCAAIAE2AhQgAEGaj4CAADYCECAAQSI2AgxBACEQDIECCyAAKAIEIRAgAEEANgIEAkAgACAQIAEQt4CAgAAiEA0AIAFBAWohAQyNAQsgAEEMNgIcIAAgEDYCDCAAIAFBAWo2AhRBACEQDIACCyAQQRVGDcwBIABBADYCHCAAIAE2AhQgAEGaj4CAADYCECAAQSI2AgxBACEQDP8BCyAAKAIEIRAgAEEANgIEAkAgACAQIAEQt4CAgAAiEA0AIAFBAWohAQyMAQsgAEENNgIcIAAgEDYCDCAAIAFBAWo2AhRBACEQDP4BCyAQQRVGDckBIABBADYCHCAAIAE2AhQgAEHGjICAADYCECAAQSM2AgxBACEQDP0BCyAAKAIEIRAgAEEANgIEAkAgACAQIAEQuYCAgAAiEA0AIAFBAWohAQyLAQsgAEEONgIcIAAgEDYCDCAAIAFBAWo2AhRBACEQDPwBCyAAQQA2AhwgACABNgIUIABBwJWAgAA2AhAgAEECNgIMQQAhEAz7AQsgEEEVRg3FASAAQQA2AhwgACABNgIUIABBxoyAgAA2AhAgAEEjNgIMQQAhEAz6AQsgAEEQNgIcIAAgATYCFCAAIBA2AgxBACEQDPkBCyAAKAIEIQQgAEEANgIEAkAgACAEIAEQuYCAgAAiBA0AIAFBAWohAQzxAQsgAEERNgIcIAAgBDYCDCAAIAFBAWo2AhRBACEQDPgBCyAQQRVGDcEBIABBADYCHCAAIAE2AhQgAEHGjICAADYCECAAQSM2AgxBACEQDPcBCyAAKAIEIRAgAEEANgIEAkAgACAQIAEQuYCAgAAiEA0AIAFBAWohAQyIAQsgAEETNgIcIAAgEDYCDCAAIAFBAWo2AhRBACEQDPYBCyAAKAIEIQQgAEEANgIEAkAgACAEIAEQuYCAgAAiBA0AIAFBAWohAQztAQsgAEEUNgIcIAAgBDYCDCAAIAFBAWo2AhRBACEQDPUBCyAQQRVGDb0BIABBADYCHCAAIAE2AhQgAEGaj4CAADYCECAAQSI2AgxBACEQDPQBCyAAKAIEIRAgAEEANgIEAkAgACAQIAEQt4CAgAAiEA0AIAFBAWohAQyGAQsgAEEWNgIcIAAgEDYCDCAAIAFBAWo2AhRBACEQDPMBCyAAKAIEIQQgAEEANgIEAkAgACAEIAEQt4CAgAAiBA0AIAFBAWohAQzpAQsgAEEXNgIcIAAgBDYCDCAAIAFBAWo2AhRBACEQDPIBCyAAQQA2AhwgACABNgIUIABBzZOAgAA2AhAgAEEMNgIMQQAhEAzxAQtCASERCyAQQQFqIQECQCAAKQMgIhJC//////////8PVg0AIAAgEkIEhiARhDcDICABIQEMhAELIABBADYCHCAAIAE2AhQgAEGtiYCAADYCECAAQQw2AgxBACEQDO8BCyAAQQA2AhwgACAQNgIUIABBzZOAgAA2AhAgAEEMNgIMQQAhEAzuAQsgACgCBCEXIABBADYCBCAQIBGnaiIWIQEgACAXIBAgFiAUGyIQELWAgIAAIhRFDXMgAEEFNgIcIAAgEDYCFCAAIBQ2AgxBACEQDO0BCyAAQQA2AhwgACAQNgIUIABBqpyAgAA2AhAgAEEPNgIMQQAhEAzsAQsgACAQIAIQtICAgAAiAQ0BIBAhAQtBDiEQDNEBCwJAIAFBFUcNACAAQQI2AhwgACAQNgIUIABBsJiAgAA2AhAgAEEVNgIMQQAhEAzqAQsgAEEANgIcIAAgEDYCFCAAQaeOgIAANgIQIABBEjYCDEEAIRAM6QELIAFBAWohEAJAIAAvATAiAUGAAXFFDQACQCAAIBAgAhC7gICAACIBDQAgECEBDHALIAFBFUcNugEgAEEFNgIcIAAgEDYCFCAAQfmXgIAANgIQIABBFTYCDEEAIRAM6QELAkAgAUGgBHFBoARHDQAgAC0ALUECcQ0AIABBADYCHCAAIBA2AhQgAEGWk4CAADYCECAAQQQ2AgxBACEQDOkBCyAAIBAgAhC9gICAABogECEBAkACQAJAAkACQCAAIBAgAhCzgICAAA4WAgEABAQEBAQEBAQEBAQEBAQEBAQEAwQLIABBAToALgsgACAALwEwQcAAcjsBMCAQIQELQSYhEAzRAQsgAEEjNgIcIAAgEDYCFCAAQaWWgIAANgIQIABBFTYCDEEAIRAM6QELIABBADYCHCAAIBA2AhQgAEHVi4CAADYCECAAQRE2AgxBACEQDOgBCyAALQAtQQFxRQ0BQcMBIRAMzgELAkAgDSACRg0AA0ACQCANLQAAQSBGDQAgDSEBDMQBCyANQQFqIg0gAkcNAAtBJSEQDOcBC0ElIRAM5gELIAAoAgQhBCAAQQA2AgQgACAEIA0Qr4CAgAAiBEUNrQEgAEEmNgIcIAAgBDYCDCAAIA1BAWo2AhRBACEQDOUBCyAQQRVGDasBIABBADYCHCAAIAE2AhQgAEH9jYCAADYCECAAQR02AgxBACEQDOQBCyAAQSc2AhwgACABNgIUIAAgEDYCDEEAIRAM4wELIBAhAUEBIRQCQAJAAkACQAJAAkACQCAALQAsQX5qDgcGBQUDAQIABQsgACAALwEwQQhyOwEwDAMLQQIhFAwBC0EEIRQLIABBAToALCAAIAAvATAgFHI7ATALIBAhAQtBKyEQDMoBCyAAQQA2AhwgACAQNgIUIABBq5KAgAA2AhAgAEELNgIMQQAhEAziAQsgAEEANgIcIAAgATYCFCAAQeGPgIAANgIQIABBCjYCDEEAIRAM4QELIABBADoALCAQIQEMvQELIBAhAUEBIRQCQAJAAkACQAJAIAAtACxBe2oOBAMBAgAFCyAAIAAvATBBCHI7ATAMAwtBAiEUDAELQQQhFAsgAEEBOgAsIAAgAC8BMCAUcjsBMAsgECEBC0EpIRAMxQELIABBADYCHCAAIAE2AhQgAEHwlICAADYCECAAQQM2AgxBACEQDN0BCwJAIA4tAABBDUcNACAAKAIEIQEgAEEANgIEAkAgACABIA4QsYCAgAAiAQ0AIA5BAWohAQx1CyAAQSw2AhwgACABNgIMIAAgDkEBajYCFEEAIRAM3QELIAAtAC1BAXFFDQFBxAEhEAzDAQsCQCAOIAJHDQBBLSEQDNwBCwJAAkADQAJAIA4tAABBdmoOBAIAAAMACyAOQQFqIg4gAkcNAAtBLSEQDN0BCyAAKAIEIQEgAEEANgIEAkAgACABIA4QsYCAgAAiAQ0AIA4hAQx0CyAAQSw2AhwgACAONgIUIAAgATYCDEEAIRAM3AELIAAoAgQhASAAQQA2AgQCQCAAIAEgDhCxgICAACIBDQAgDkEBaiEBDHMLIABBLDYCHCAAIAE2AgwgACAOQQFqNgIUQQAhEAzbAQsgACgCBCEEIABBADYCBCAAIAQgDhCxgICAACIEDaABIA4hAQzOAQsgEEEsRw0BIAFBAWohEEEBIQECQAJAAkACQAJAIAAtACxBe2oOBAMBAgQACyAQIQEMBAtBAiEBDAELQQQhAQsgAEEBOgAsIAAgAC8BMCABcjsBMCAQIQEMAQsgACAALwEwQQhyOwEwIBAhAQtBOSEQDL8BCyAAQQA6ACwgASEBC0E0IRAMvQELIAAgAC8BMEEgcjsBMCABIQEMAgsgACgCBCEEIABBADYCBAJAIAAgBCABELGAgIAAIgQNACABIQEMxwELIABBNzYCHCAAIAE2AhQgACAENgIMQQAhEAzUAQsgAEEIOgAsIAEhAQtBMCEQDLkBCwJAIAAtAChBAUYNACABIQEMBAsgAC0ALUEIcUUNkwEgASEBDAMLIAAtADBBIHENlAFBxQEhEAy3AQsCQCAPIAJGDQACQANAAkAgDy0AAEFQaiIBQf8BcUEKSQ0AIA8hAUE1IRAMugELIAApAyAiEUKZs+bMmbPmzBlWDQEgACARQgp+IhE3AyAgESABrUL/AYMiEkJ/hVYNASAAIBEgEnw3AyAgD0EBaiIPIAJHDQALQTkhEAzRAQsgACgCBCECIABBADYCBCAAIAIgD0EBaiIEELGAgIAAIgINlQEgBCEBDMMBC0E5IRAMzwELAkAgAC8BMCIBQQhxRQ0AIAAtAChBAUcNACAALQAtQQhxRQ2QAQsgACABQff7A3FBgARyOwEwIA8hAQtBNyEQDLQBCyAAIAAvATBBEHI7ATAMqwELIBBBFUYNiwEgAEEANgIcIAAgATYCFCAAQfCOgIAANgIQIABBHDYCDEEAIRAMywELIABBwwA2AhwgACABNgIMIAAgDUEBajYCFEEAIRAMygELAkAgAS0AAEE6Rw0AIAAoAgQhECAAQQA2AgQCQCAAIBAgARCvgICAACIQDQAgAUEBaiEBDGMLIABBwwA2AhwgACAQNgIMIAAgAUEBajYCFEEAIRAMygELIABBADYCHCAAIAE2AhQgAEGxkYCAADYCECAAQQo2AgxBACEQDMkBCyAAQQA2AhwgACABNgIUIABBoJmAgAA2AhAgAEEeNgIMQQAhEAzIAQsgAEEANgIACyAAQYASOwEqIAAgF0EBaiIBIAIQqICAgAAiEA0BIAEhAQtBxwAhEAysAQsgEEEVRw2DASAAQdEANgIcIAAgATYCFCAAQeOXgIAANgIQIABBFTYCDEEAIRAMxAELIAAoAgQhECAAQQA2AgQCQCAAIBAgARCngICAACIQDQAgASEBDF4LIABB0gA2AhwgACABNgIUIAAgEDYCDEEAIRAMwwELIABBADYCHCAAIBQ2AhQgAEHBqICAADYCECAAQQc2AgwgAEEANgIAQQAhEAzCAQsgACgCBCEQIABBADYCBAJAIAAgECABEKeAgIAAIhANACABIQEMXQsgAEHTADYCHCAAIAE2AhQgACAQNgIMQQAhEAzBAQtBACEQIABBADYCHCAAIAE2AhQgAEGAkYCAADYCECAAQQk2AgwMwAELIBBBFUYNfSAAQQA2AhwgACABNgIUIABBlI2AgAA2AhAgAEEhNgIMQQAhEAy/AQtBASEWQQAhF0EAIRRBASEQCyAAIBA6ACsgAUEBaiEBAkACQCAALQAtQRBxDQACQAJAAkAgAC0AKg4DAQACBAsgFkUNAwwCCyAUDQEMAgsgF0UNAQsgACgCBCEQIABBADYCBAJAIAAgECABEK2AgIAAIhANACABIQEMXAsgAEHYADYCHCAAIAE2AhQgACAQNgIMQQAhEAy+AQsgACgCBCEEIABBADYCBAJAIAAgBCABEK2AgIAAIgQNACABIQEMrQELIABB2QA2AhwgACABNgIUIAAgBDYCDEEAIRAMvQELIAAoAgQhBCAAQQA2AgQCQCAAIAQgARCtgICAACIEDQAgASEBDKsBCyAAQdoANgIcIAAgATYCFCAAIAQ2AgxBACEQDLwBCyAAKAIEIQQgAEEANgIEAkAgACAEIAEQrYCAgAAiBA0AIAEhAQypAQsgAEHcADYCHCAAIAE2AhQgACAENgIMQQAhEAy7AQsCQCABLQAAQVBqIhBB/wFxQQpPDQAgACAQOgAqIAFBAWohAUHPACEQDKIBCyAAKAIEIQQgAEEANgIEAkAgACAEIAEQrYCAgAAiBA0AIAEhAQynAQsgAEHeADYCHCAAIAE2AhQgACAENgIMQQAhEAy6AQsgAEEANgIAIBdBAWohAQJAIAAtAClBI08NACABIQEMWQsgAEEANgIcIAAgATYCFCAAQdOJgIAANgIQIABBCDYCDEEAIRAMuQELIABBADYCAAtBACEQIABBADYCHCAAIAE2AhQgAEGQs4CAADYCECAAQQg2AgwMtwELIABBADYCACAXQQFqIQECQCAALQApQSFHDQAgASEBDFYLIABBADYCHCAAIAE2AhQgAEGbioCAADYCECAAQQg2AgxBACEQDLYBCyAAQQA2AgAgF0EBaiEBAkAgAC0AKSIQQV1qQQtPDQAgASEBDFULAkAgEEEGSw0AQQEgEHRBygBxRQ0AIAEhAQxVC0EAIRAgAEEANgIcIAAgATYCFCAAQfeJgIAANgIQIABBCDYCDAy1AQsgEEEVRg1xIABBADYCHCAAIAE2AhQgAEG5jYCAADYCECAAQRo2AgxBACEQDLQBCyAAKAIEIRAgAEEANgIEAkAgACAQIAEQp4CAgAAiEA0AIAEhAQxUCyAAQeUANgIcIAAgATYCFCAAIBA2AgxBACEQDLMBCyAAKAIEIRAgAEEANgIEAkAgACAQIAEQp4CAgAAiEA0AIAEhAQxNCyAAQdIANgIcIAAgATYCFCAAIBA2AgxBACEQDLIBCyAAKAIEIRAgAEEANgIEAkAgACAQIAEQp4CAgAAiEA0AIAEhAQxNCyAAQdMANgIcIAAgATYCFCAAIBA2AgxBACEQDLEBCyAAKAIEIRAgAEEANgIEAkAgACAQIAEQp4CAgAAiEA0AIAEhAQxRCyAAQeUANgIcIAAgATYCFCAAIBA2AgxBACEQDLABCyAAQQA2AhwgACABNgIUIABBxoqAgAA2AhAgAEEHNgIMQQAhEAyvAQsgACgCBCEQIABBADYCBAJAIAAgECABEKeAgIAAIhANACABIQEMSQsgAEHSADYCHCAAIAE2AhQgACAQNgIMQQAhEAyuAQsgACgCBCEQIABBADYCBAJAIAAgECABEKeAgIAAIhANACABIQEMSQsgAEHTADYCHCAAIAE2AhQgACAQNgIMQQAhEAytAQsgACgCBCEQIABBADYCBAJAIAAgECABEKeAgIAAIhANACABIQEMTQsgAEHlADYCHCAAIAE2AhQgACAQNgIMQQAhEAysAQsgAEEANgIcIAAgATYCFCAAQdyIgIAANgIQIABBBzYCDEEAIRAMqwELIBBBP0cNASABQQFqIQELQQUhEAyQAQtBACEQIABBADYCHCAAIAE2AhQgAEH9koCAADYCECAAQQc2AgwMqAELIAAoAgQhECAAQQA2AgQCQCAAIBAgARCngICAACIQDQAgASEBDEILIABB0gA2AhwgACABNgIUIAAgEDYCDEEAIRAMpwELIAAoAgQhECAAQQA2AgQCQCAAIBAgARCngICAACIQDQAgASEBDEILIABB0wA2AhwgACABNgIUIAAgEDYCDEEAIRAMpgELIAAoAgQhECAAQQA2AgQCQCAAIBAgARCngICAACIQDQAgASEBDEYLIABB5QA2AhwgACABNgIUIAAgEDYCDEEAIRAMpQELIAAoAgQhASAAQQA2AgQCQCAAIAEgFBCngICAACIBDQAgFCEBDD8LIABB0gA2AhwgACAUNgIUIAAgATYCDEEAIRAMpAELIAAoAgQhASAAQQA2AgQCQCAAIAEgFBCngICAACIBDQAgFCEBDD8LIABB0wA2AhwgACAUNgIUIAAgATYCDEEAIRAMowELIAAoAgQhASAAQQA2AgQCQCAAIAEgFBCngICAACIBDQAgFCEBDEMLIABB5QA2AhwgACAUNgIUIAAgATYCDEEAIRAMogELIABBADYCHCAAIBQ2AhQgAEHDj4CAADYCECAAQQc2AgxBACEQDKEBCyAAQQA2AhwgACABNgIUIABBw4+AgAA2AhAgAEEHNgIMQQAhEAygAQtBACEQIABBADYCHCAAIBQ2AhQgAEGMnICAADYCECAAQQc2AgwMnwELIABBADYCHCAAIBQ2AhQgAEGMnICAADYCECAAQQc2AgxBACEQDJ4BCyAAQQA2AhwgACAUNgIUIABB/pGAgAA2AhAgAEEHNgIMQQAhEAydAQsgAEEANgIcIAAgATYCFCAAQY6bgIAANgIQIABBBjYCDEEAIRAMnAELIBBBFUYNVyAAQQA2AhwgACABNgIUIABBzI6AgAA2AhAgAEEgNgIMQQAhEAybAQsgAEEANgIAIBBBAWohAUEkIRALIAAgEDoAKSAAKAIEIRAgAEEANgIEIAAgECABEKuAgIAAIhANVCABIQEMPgsgAEEANgIAC0EAIRAgAEEANgIcIAAgBDYCFCAAQfGbgIAANgIQIABBBjYCDAyXAQsgAUEVRg1QIABBADYCHCAAIAU2AhQgAEHwjICAADYCECAAQRs2AgxBACEQDJYBCyAAKAIEIQUgAEEANgIEIAAgBSAQEKmAgIAAIgUNASAQQQFqIQULQa0BIRAMewsgAEHBATYCHCAAIAU2AgwgACAQQQFqNgIUQQAhEAyTAQsgACgCBCEGIABBADYCBCAAIAYgEBCpgICAACIGDQEgEEEBaiEGC0GuASEQDHgLIABBwgE2AhwgACAGNgIMIAAgEEEBajYCFEEAIRAMkAELIABBADYCHCAAIAc2AhQgAEGXi4CAADYCECAAQQ02AgxBACEQDI8BCyAAQQA2AhwgACAINgIUIABB45CAgAA2AhAgAEEJNgIMQQAhEAyOAQsgAEEANgIcIAAgCDYCFCAAQZSNgIAANgIQIABBITYCDEEAIRAMjQELQQEhFkEAIRdBACEUQQEhEAsgACAQOgArIAlBAWohCAJAAkAgAC0ALUEQcQ0AAkACQAJAIAAtACoOAwEAAgQLIBZFDQMMAgsgFA0BDAILIBdFDQELIAAoAgQhECAAQQA2AgQgACAQIAgQrYCAgAAiEEUNPSAAQckBNgIcIAAgCDYCFCAAIBA2AgxBACEQDIwBCyAAKAIEIQQgAEEANgIEIAAgBCAIEK2AgIAAIgRFDXYgAEHKATYCHCAAIAg2AhQgACAENgIMQQAhEAyLAQsgACgCBCEEIABBADYCBCAAIAQgCRCtgICAACIERQ10IABBywE2AhwgACAJNgIUIAAgBDYCDEEAIRAMigELIAAoAgQhBCAAQQA2AgQgACAEIAoQrYCAgAAiBEUNciAAQc0BNgIcIAAgCjYCFCAAIAQ2AgxBACEQDIkBCwJAIAstAABBUGoiEEH/AXFBCk8NACAAIBA6ACogC0EBaiEKQbYBIRAMcAsgACgCBCEEIABBADYCBCAAIAQgCxCtgICAACIERQ1wIABBzwE2AhwgACALNgIUIAAgBDYCDEEAIRAMiAELIABBADYCHCAAIAQ2AhQgAEGQs4CAADYCECAAQQg2AgwgAEEANgIAQQAhEAyHAQsgAUEVRg0/IABBADYCHCAAIAw2AhQgAEHMjoCAADYCECAAQSA2AgxBACEQDIYBCyAAQYEEOwEoIAAoAgQhECAAQgA3AwAgACAQIAxBAWoiDBCrgICAACIQRQ04IABB0wE2AhwgACAMNgIUIAAgEDYCDEEAIRAMhQELIABBADYCAAtBACEQIABBADYCHCAAIAQ2AhQgAEHYm4CAADYCECAAQQg2AgwMgwELIAAoAgQhECAAQgA3AwAgACAQIAtBAWoiCxCrgICAACIQDQFBxgEhEAxpCyAAQQI6ACgMVQsgAEHVATYCHCAAIAs2AhQgACAQNgIMQQAhEAyAAQsgEEEVRg03IABBADYCHCAAIAQ2AhQgAEGkjICAADYCECAAQRA2AgxBACEQDH8LIAAtADRBAUcNNCAAIAQgAhC8gICAACIQRQ00IBBBFUcNNSAAQdwBNgIcIAAgBDYCFCAAQdWWgIAANgIQIABBFTYCDEEAIRAMfgtBACEQIABBADYCHCAAQa+LgIAANgIQIABBAjYCDCAAIBRBAWo2AhQMfQtBACEQDGMLQQIhEAxiC0ENIRAMYQtBDyEQDGALQSUhEAxfC0ETIRAMXgtBFSEQDF0LQRYhEAxcC0EXIRAMWwtBGCEQDFoLQRkhEAxZC0EaIRAMWAtBGyEQDFcLQRwhEAxWC0EdIRAMVQtBHyEQDFQLQSEhEAxTC0EjIRAMUgtBxgAhEAxRC0EuIRAMUAtBLyEQDE8LQTshEAxOC0E9IRAMTQtByAAhEAxMC0HJACEQDEsLQcsAIRAMSgtBzAAhEAxJC0HOACEQDEgLQdEAIRAMRwtB1QAhEAxGC0HYACEQDEULQdkAIRAMRAtB2wAhEAxDC0HkACEQDEILQeUAIRAMQQtB8QAhEAxAC0H0ACEQDD8LQY0BIRAMPgtBlwEhEAw9C0GpASEQDDwLQawBIRAMOwtBwAEhEAw6C0G5ASEQDDkLQa8BIRAMOAtBsQEhEAw3C0GyASEQDDYLQbQBIRAMNQtBtQEhEAw0C0G6ASEQDDMLQb0BIRAMMgtBvwEhEAwxC0HBASEQDDALIABBADYCHCAAIAQ2AhQgAEHpi4CAADYCECAAQR82AgxBACEQDEgLIABB2wE2AhwgACAENgIUIABB+paAgAA2AhAgAEEVNgIMQQAhEAxHCyAAQfgANgIcIAAgDDYCFCAAQcqYgIAANgIQIABBFTYCDEEAIRAMRgsgAEHRADYCHCAAIAU2AhQgAEGwl4CAADYCECAAQRU2AgxBACEQDEULIABB+QA2AhwgACABNgIUIAAgEDYCDEEAIRAMRAsgAEH4ADYCHCAAIAE2AhQgAEHKmICAADYCECAAQRU2AgxBACEQDEMLIABB5AA2AhwgACABNgIUIABB45eAgAA2AhAgAEEVNgIMQQAhEAxCCyAAQdcANgIcIAAgATYCFCAAQcmXgIAANgIQIABBFTYCDEEAIRAMQQsgAEEANgIcIAAgATYCFCAAQbmNgIAANgIQIABBGjYCDEEAIRAMQAsgAEHCADYCHCAAIAE2AhQgAEHjmICAADYCECAAQRU2AgxBACEQDD8LIABBADYCBCAAIA8gDxCxgICAACIERQ0BIABBOjYCHCAAIAQ2AgwgACAPQQFqNgIUQQAhEAw+CyAAKAIEIQQgAEEANgIEAkAgACAEIAEQsYCAgAAiBEUNACAAQTs2AhwgACAENgIMIAAgAUEBajYCFEEAIRAMPgsgAUEBaiEBDC0LIA9BAWohAQwtCyAAQQA2AhwgACAPNgIUIABB5JKAgAA2AhAgAEEENgIMQQAhEAw7CyAAQTY2AhwgACAENgIUIAAgAjYCDEEAIRAMOgsgAEEuNgIcIAAgDjYCFCAAIAQ2AgxBACEQDDkLIABB0AA2AhwgACABNgIUIABBkZiAgAA2AhAgAEEVNgIMQQAhEAw4CyANQQFqIQEMLAsgAEEVNgIcIAAgATYCFCAAQYKZgIAANgIQIABBFTYCDEEAIRAMNgsgAEEbNgIcIAAgATYCFCAAQZGXgIAANgIQIABBFTYCDEEAIRAMNQsgAEEPNgIcIAAgATYCFCAAQZGXgIAANgIQIABBFTYCDEEAIRAMNAsgAEELNgIcIAAgATYCFCAAQZGXgIAANgIQIABBFTYCDEEAIRAMMwsgAEEaNgIcIAAgATYCFCAAQYKZgIAANgIQIABBFTYCDEEAIRAMMgsgAEELNgIcIAAgATYCFCAAQYKZgIAANgIQIABBFTYCDEEAIRAMMQsgAEEKNgIcIAAgATYCFCAAQeSWgIAANgIQIABBFTYCDEEAIRAMMAsgAEEeNgIcIAAgATYCFCAAQfmXgIAANgIQIABBFTYCDEEAIRAMLwsgAEEANgIcIAAgEDYCFCAAQdqNgIAANgIQIABBFDYCDEEAIRAMLgsgAEEENgIcIAAgATYCFCAAQbCYgIAANgIQIABBFTYCDEEAIRAMLQsgAEEANgIAIAtBAWohCwtBuAEhEAwSCyAAQQA2AgAgEEEBaiEBQfUAIRAMEQsgASEBAkAgAC0AKUEFRw0AQeMAIRAMEQtB4gAhEAwQC0EAIRAgAEEANgIcIABB5JGAgAA2AhAgAEEHNgIMIAAgFEEBajYCFAwoCyAAQQA2AgAgF0EBaiEBQcAAIRAMDgtBASEBCyAAIAE6ACwgAEEANgIAIBdBAWohAQtBKCEQDAsLIAEhAQtBOCEQDAkLAkAgASIPIAJGDQADQAJAIA8tAABBgL6AgABqLQAAIgFBAUYNACABQQJHDQMgD0EBaiEBDAQLIA9BAWoiDyACRw0AC0E+IRAMIgtBPiEQDCELIABBADoALCAPIQEMAQtBCyEQDAYLQTohEAwFCyABQQFqIQFBLSEQDAQLIAAgAToALCAAQQA2AgAgFkEBaiEBQQwhEAwDCyAAQQA2AgAgF0EBaiEBQQohEAwCCyAAQQA2AgALIABBADoALCANIQFBCSEQDAALC0EAIRAgAEEANgIcIAAgCzYCFCAAQc2QgIAANgIQIABBCTYCDAwXC0EAIRAgAEEANgIcIAAgCjYCFCAAQemKgIAANgIQIABBCTYCDAwWC0EAIRAgAEEANgIcIAAgCTYCFCAAQbeQgIAANgIQIABBCTYCDAwVC0EAIRAgAEEANgIcIAAgCDYCFCAAQZyRgIAANgIQIABBCTYCDAwUC0EAIRAgAEEANgIcIAAgATYCFCAAQc2QgIAANgIQIABBCTYCDAwTC0EAIRAgAEEANgIcIAAgATYCFCAAQemKgIAANgIQIABBCTYCDAwSC0EAIRAgAEEANgIcIAAgATYCFCAAQbeQgIAANgIQIABBCTYCDAwRC0EAIRAgAEEANgIcIAAgATYCFCAAQZyRgIAANgIQIABBCTYCDAwQC0EAIRAgAEEANgIcIAAgATYCFCAAQZeVgIAANgIQIABBDzYCDAwPC0EAIRAgAEEANgIcIAAgATYCFCAAQZeVgIAANgIQIABBDzYCDAwOC0EAIRAgAEEANgIcIAAgATYCFCAAQcCSgIAANgIQIABBCzYCDAwNC0EAIRAgAEEANgIcIAAgATYCFCAAQZWJgIAANgIQIABBCzYCDAwMC0EAIRAgAEEANgIcIAAgATYCFCAAQeGPgIAANgIQIABBCjYCDAwLC0EAIRAgAEEANgIcIAAgATYCFCAAQfuPgIAANgIQIABBCjYCDAwKC0EAIRAgAEEANgIcIAAgATYCFCAAQfGZgIAANgIQIABBAjYCDAwJC0EAIRAgAEEANgIcIAAgATYCFCAAQcSUgIAANgIQIABBAjYCDAwIC0EAIRAgAEEANgIcIAAgATYCFCAAQfKVgIAANgIQIABBAjYCDAwHCyAAQQI2AhwgACABNgIUIABBnJqAgAA2AhAgAEEWNgIMQQAhEAwGC0EBIRAMBQtB1AAhECABIgQgAkYNBCADQQhqIAAgBCACQdjCgIAAQQoQxYCAgAAgAygCDCEEIAMoAggOAwEEAgALEMqAgIAAAAsgAEEANgIcIABBtZqAgAA2AhAgAEEXNgIMIAAgBEEBajYCFEEAIRAMAgsgAEEANgIcIAAgBDYCFCAAQcqagIAANgIQIABBCTYCDEEAIRAMAQsCQCABIgQgAkcNAEEiIRAMAQsgAEGJgICAADYCCCAAIAQ2AgRBISEQCyADQRBqJICAgIAAIBALrwEBAn8gASgCACEGAkACQCACIANGDQAgBCAGaiEEIAYgA2ogAmshByACIAZBf3MgBWoiBmohBQNAAkAgAi0AACAELQAARg0AQQIhBAwDCwJAIAYNAEEAIQQgBSECDAMLIAZBf2ohBiAEQQFqIQQgAkEBaiICIANHDQALIAchBiADIQILIABBATYCACABIAY2AgAgACACNgIEDwsgAUEANgIAIAAgBDYCACAAIAI2AgQLCgAgABDHgICAAAvyNgELfyOAgICAAEEQayIBJICAgIAAAkBBACgCoNCAgAANAEEAEMuAgIAAQYDUhIAAayICQdkASQ0AQQAhAwJAQQAoAuDTgIAAIgQNAEEAQn83AuzTgIAAQQBCgICEgICAwAA3AuTTgIAAQQAgAUEIakFwcUHYqtWqBXMiBDYC4NOAgABBAEEANgL004CAAEEAQQA2AsTTgIAAC0EAIAI2AszTgIAAQQBBgNSEgAA2AsjTgIAAQQBBgNSEgAA2ApjQgIAAQQAgBDYCrNCAgABBAEF/NgKo0ICAAANAIANBxNCAgABqIANBuNCAgABqIgQ2AgAgBCADQbDQgIAAaiIFNgIAIANBvNCAgABqIAU2AgAgA0HM0ICAAGogA0HA0ICAAGoiBTYCACAFIAQ2AgAgA0HU0ICAAGogA0HI0ICAAGoiBDYCACAEIAU2AgAgA0HQ0ICAAGogBDYCACADQSBqIgNBgAJHDQALQYDUhIAAQXhBgNSEgABrQQ9xQQBBgNSEgABBCGpBD3EbIgNqIgRBBGogAkFIaiIFIANrIgNBAXI2AgBBAEEAKALw04CAADYCpNCAgABBACADNgKU0ICAAEEAIAQ2AqDQgIAAQYDUhIAAIAVqQTg2AgQLAkACQAJAAkACQAJAAkACQAJAAkACQAJAIABB7AFLDQACQEEAKAKI0ICAACIGQRAgAEETakFwcSAAQQtJGyICQQN2IgR2IgNBA3FFDQACQAJAIANBAXEgBHJBAXMiBUEDdCIEQbDQgIAAaiIDIARBuNCAgABqKAIAIgQoAggiAkcNAEEAIAZBfiAFd3E2AojQgIAADAELIAMgAjYCCCACIAM2AgwLIARBCGohAyAEIAVBA3QiBUEDcjYCBCAEIAVqIgQgBCgCBEEBcjYCBAwMCyACQQAoApDQgIAAIgdNDQECQCADRQ0AAkACQCADIAR0QQIgBHQiA0EAIANrcnEiA0EAIANrcUF/aiIDIANBDHZBEHEiA3YiBEEFdkEIcSIFIANyIAQgBXYiA0ECdkEEcSIEciADIAR2IgNBAXZBAnEiBHIgAyAEdiIDQQF2QQFxIgRyIAMgBHZqIgRBA3QiA0Gw0ICAAGoiBSADQbjQgIAAaigCACIDKAIIIgBHDQBBACAGQX4gBHdxIgY2AojQgIAADAELIAUgADYCCCAAIAU2AgwLIAMgAkEDcjYCBCADIARBA3QiBGogBCACayIFNgIAIAMgAmoiACAFQQFyNgIEAkAgB0UNACAHQXhxQbDQgIAAaiECQQAoApzQgIAAIQQCQAJAIAZBASAHQQN2dCIIcQ0AQQAgBiAIcjYCiNCAgAAgAiEIDAELIAIoAgghCAsgCCAENgIMIAIgBDYCCCAEIAI2AgwgBCAINgIICyADQQhqIQNBACAANgKc0ICAAEEAIAU2ApDQgIAADAwLQQAoAozQgIAAIglFDQEgCUEAIAlrcUF/aiIDIANBDHZBEHEiA3YiBEEFdkEIcSIFIANyIAQgBXYiA0ECdkEEcSIEciADIAR2IgNBAXZBAnEiBHIgAyAEdiIDQQF2QQFxIgRyIAMgBHZqQQJ0QbjSgIAAaigCACIAKAIEQXhxIAJrIQQgACEFAkADQAJAIAUoAhAiAw0AIAVBFGooAgAiA0UNAgsgAygCBEF4cSACayIFIAQgBSAESSIFGyEEIAMgACAFGyEAIAMhBQwACwsgACgCGCEKAkAgACgCDCIIIABGDQAgACgCCCIDQQAoApjQgIAASRogCCADNgIIIAMgCDYCDAwLCwJAIABBFGoiBSgCACIDDQAgACgCECIDRQ0DIABBEGohBQsDQCAFIQsgAyIIQRRqIgUoAgAiAw0AIAhBEGohBSAIKAIQIgMNAAsgC0EANgIADAoLQX8hAiAAQb9/Sw0AIABBE2oiA0FwcSECQQAoAozQgIAAIgdFDQBBACELAkAgAkGAAkkNAEEfIQsgAkH///8HSw0AIANBCHYiAyADQYD+P2pBEHZBCHEiA3QiBCAEQYDgH2pBEHZBBHEiBHQiBSAFQYCAD2pBEHZBAnEiBXRBD3YgAyAEciAFcmsiA0EBdCACIANBFWp2QQFxckEcaiELC0EAIAJrIQQCQAJAAkACQCALQQJ0QbjSgIAAaigCACIFDQBBACEDQQAhCAwBC0EAIQMgAkEAQRkgC0EBdmsgC0EfRht0IQBBACEIA0ACQCAFKAIEQXhxIAJrIgYgBE8NACAGIQQgBSEIIAYNAEEAIQQgBSEIIAUhAwwDCyADIAVBFGooAgAiBiAGIAUgAEEddkEEcWpBEGooAgAiBUYbIAMgBhshAyAAQQF0IQAgBQ0ACwsCQCADIAhyDQBBACEIQQIgC3QiA0EAIANrciAHcSIDRQ0DIANBACADa3FBf2oiAyADQQx2QRBxIgN2IgVBBXZBCHEiACADciAFIAB2IgNBAnZBBHEiBXIgAyAFdiIDQQF2QQJxIgVyIAMgBXYiA0EBdkEBcSIFciADIAV2akECdEG40oCAAGooAgAhAwsgA0UNAQsDQCADKAIEQXhxIAJrIgYgBEkhAAJAIAMoAhAiBQ0AIANBFGooAgAhBQsgBiAEIAAbIQQgAyAIIAAbIQggBSEDIAUNAAsLIAhFDQAgBEEAKAKQ0ICAACACa08NACAIKAIYIQsCQCAIKAIMIgAgCEYNACAIKAIIIgNBACgCmNCAgABJGiAAIAM2AgggAyAANgIMDAkLAkAgCEEUaiIFKAIAIgMNACAIKAIQIgNFDQMgCEEQaiEFCwNAIAUhBiADIgBBFGoiBSgCACIDDQAgAEEQaiEFIAAoAhAiAw0ACyAGQQA2AgAMCAsCQEEAKAKQ0ICAACIDIAJJDQBBACgCnNCAgAAhBAJAAkAgAyACayIFQRBJDQAgBCACaiIAIAVBAXI2AgRBACAFNgKQ0ICAAEEAIAA2ApzQgIAAIAQgA2ogBTYCACAEIAJBA3I2AgQMAQsgBCADQQNyNgIEIAQgA2oiAyADKAIEQQFyNgIEQQBBADYCnNCAgABBAEEANgKQ0ICAAAsgBEEIaiEDDAoLAkBBACgClNCAgAAiACACTQ0AQQAoAqDQgIAAIgMgAmoiBCAAIAJrIgVBAXI2AgRBACAFNgKU0ICAAEEAIAQ2AqDQgIAAIAMgAkEDcjYCBCADQQhqIQMMCgsCQAJAQQAoAuDTgIAARQ0AQQAoAujTgIAAIQQMAQtBAEJ/NwLs04CAAEEAQoCAhICAgMAANwLk04CAAEEAIAFBDGpBcHFB2KrVqgVzNgLg04CAAEEAQQA2AvTTgIAAQQBBADYCxNOAgABBgIAEIQQLQQAhAwJAIAQgAkHHAGoiB2oiBkEAIARrIgtxIgggAksNAEEAQTA2AvjTgIAADAoLAkBBACgCwNOAgAAiA0UNAAJAQQAoArjTgIAAIgQgCGoiBSAETQ0AIAUgA00NAQtBACEDQQBBMDYC+NOAgAAMCgtBAC0AxNOAgABBBHENBAJAAkACQEEAKAKg0ICAACIERQ0AQcjTgIAAIQMDQAJAIAMoAgAiBSAESw0AIAUgAygCBGogBEsNAwsgAygCCCIDDQALC0EAEMuAgIAAIgBBf0YNBSAIIQYCQEEAKALk04CAACIDQX9qIgQgAHFFDQAgCCAAayAEIABqQQAgA2txaiEGCyAGIAJNDQUgBkH+////B0sNBQJAQQAoAsDTgIAAIgNFDQBBACgCuNOAgAAiBCAGaiIFIARNDQYgBSADSw0GCyAGEMuAgIAAIgMgAEcNAQwHCyAGIABrIAtxIgZB/v///wdLDQQgBhDLgICAACIAIAMoAgAgAygCBGpGDQMgACEDCwJAIANBf0YNACACQcgAaiAGTQ0AAkAgByAGa0EAKALo04CAACIEakEAIARrcSIEQf7///8HTQ0AIAMhAAwHCwJAIAQQy4CAgABBf0YNACAEIAZqIQYgAyEADAcLQQAgBmsQy4CAgAAaDAQLIAMhACADQX9HDQUMAwtBACEIDAcLQQAhAAwFCyAAQX9HDQILQQBBACgCxNOAgABBBHI2AsTTgIAACyAIQf7///8HSw0BIAgQy4CAgAAhAEEAEMuAgIAAIQMgAEF/Rg0BIANBf0YNASAAIANPDQEgAyAAayIGIAJBOGpNDQELQQBBACgCuNOAgAAgBmoiAzYCuNOAgAACQCADQQAoArzTgIAATQ0AQQAgAzYCvNOAgAALAkACQAJAAkBBACgCoNCAgAAiBEUNAEHI04CAACEDA0AgACADKAIAIgUgAygCBCIIakYNAiADKAIIIgMNAAwDCwsCQAJAQQAoApjQgIAAIgNFDQAgACADTw0BC0EAIAA2ApjQgIAAC0EAIQNBACAGNgLM04CAAEEAIAA2AsjTgIAAQQBBfzYCqNCAgABBAEEAKALg04CAADYCrNCAgABBAEEANgLU04CAAANAIANBxNCAgABqIANBuNCAgABqIgQ2AgAgBCADQbDQgIAAaiIFNgIAIANBvNCAgABqIAU2AgAgA0HM0ICAAGogA0HA0ICAAGoiBTYCACAFIAQ2AgAgA0HU0ICAAGogA0HI0ICAAGoiBDYCACAEIAU2AgAgA0HQ0ICAAGogBDYCACADQSBqIgNBgAJHDQALIABBeCAAa0EPcUEAIABBCGpBD3EbIgNqIgQgBkFIaiIFIANrIgNBAXI2AgRBAEEAKALw04CAADYCpNCAgABBACADNgKU0ICAAEEAIAQ2AqDQgIAAIAAgBWpBODYCBAwCCyADLQAMQQhxDQAgBCAFSQ0AIAQgAE8NACAEQXggBGtBD3FBACAEQQhqQQ9xGyIFaiIAQQAoApTQgIAAIAZqIgsgBWsiBUEBcjYCBCADIAggBmo2AgRBAEEAKALw04CAADYCpNCAgABBACAFNgKU0ICAAEEAIAA2AqDQgIAAIAQgC2pBODYCBAwBCwJAIABBACgCmNCAgAAiCE8NAEEAIAA2ApjQgIAAIAAhCAsgACAGaiEFQcjTgIAAIQMCQAJAAkACQAJAAkACQANAIAMoAgAgBUYNASADKAIIIgMNAAwCCwsgAy0ADEEIcUUNAQtByNOAgAAhAwNAAkAgAygCACIFIARLDQAgBSADKAIEaiIFIARLDQMLIAMoAgghAwwACwsgAyAANgIAIAMgAygCBCAGajYCBCAAQXggAGtBD3FBACAAQQhqQQ9xG2oiCyACQQNyNgIEIAVBeCAFa0EPcUEAIAVBCGpBD3EbaiIGIAsgAmoiAmshAwJAIAYgBEcNAEEAIAI2AqDQgIAAQQBBACgClNCAgAAgA2oiAzYClNCAgAAgAiADQQFyNgIEDAMLAkAgBkEAKAKc0ICAAEcNAEEAIAI2ApzQgIAAQQBBACgCkNCAgAAgA2oiAzYCkNCAgAAgAiADQQFyNgIEIAIgA2ogAzYCAAwDCwJAIAYoAgQiBEEDcUEBRw0AIARBeHEhBwJAAkAgBEH/AUsNACAGKAIIIgUgBEEDdiIIQQN0QbDQgIAAaiIARhoCQCAGKAIMIgQgBUcNAEEAQQAoAojQgIAAQX4gCHdxNgKI0ICAAAwCCyAEIABGGiAEIAU2AgggBSAENgIMDAELIAYoAhghCQJAAkAgBigCDCIAIAZGDQAgBigCCCIEIAhJGiAAIAQ2AgggBCAANgIMDAELAkAgBkEUaiIEKAIAIgUNACAGQRBqIgQoAgAiBQ0AQQAhAAwBCwNAIAQhCCAFIgBBFGoiBCgCACIFDQAgAEEQaiEEIAAoAhAiBQ0ACyAIQQA2AgALIAlFDQACQAJAIAYgBigCHCIFQQJ0QbjSgIAAaiIEKAIARw0AIAQgADYCACAADQFBAEEAKAKM0ICAAEF+IAV3cTYCjNCAgAAMAgsgCUEQQRQgCSgCECAGRhtqIAA2AgAgAEUNAQsgACAJNgIYAkAgBigCECIERQ0AIAAgBDYCECAEIAA2AhgLIAYoAhQiBEUNACAAQRRqIAQ2AgAgBCAANgIYCyAHIANqIQMgBiAHaiIGKAIEIQQLIAYgBEF+cTYCBCACIANqIAM2AgAgAiADQQFyNgIEAkAgA0H/AUsNACADQXhxQbDQgIAAaiEEAkACQEEAKAKI0ICAACIFQQEgA0EDdnQiA3ENAEEAIAUgA3I2AojQgIAAIAQhAwwBCyAEKAIIIQMLIAMgAjYCDCAEIAI2AgggAiAENgIMIAIgAzYCCAwDC0EfIQQCQCADQf///wdLDQAgA0EIdiIEIARBgP4/akEQdkEIcSIEdCIFIAVBgOAfakEQdkEEcSIFdCIAIABBgIAPakEQdkECcSIAdEEPdiAEIAVyIAByayIEQQF0IAMgBEEVanZBAXFyQRxqIQQLIAIgBDYCHCACQgA3AhAgBEECdEG40oCAAGohBQJAQQAoAozQgIAAIgBBASAEdCIIcQ0AIAUgAjYCAEEAIAAgCHI2AozQgIAAIAIgBTYCGCACIAI2AgggAiACNgIMDAMLIANBAEEZIARBAXZrIARBH0YbdCEEIAUoAgAhAANAIAAiBSgCBEF4cSADRg0CIARBHXYhACAEQQF0IQQgBSAAQQRxakEQaiIIKAIAIgANAAsgCCACNgIAIAIgBTYCGCACIAI2AgwgAiACNgIIDAILIABBeCAAa0EPcUEAIABBCGpBD3EbIgNqIgsgBkFIaiIIIANrIgNBAXI2AgQgACAIakE4NgIEIAQgBUE3IAVrQQ9xQQAgBUFJakEPcRtqQUFqIgggCCAEQRBqSRsiCEEjNgIEQQBBACgC8NOAgAA2AqTQgIAAQQAgAzYClNCAgABBACALNgKg0ICAACAIQRBqQQApAtDTgIAANwIAIAhBACkCyNOAgAA3AghBACAIQQhqNgLQ04CAAEEAIAY2AszTgIAAQQAgADYCyNOAgABBAEEANgLU04CAACAIQSRqIQMDQCADQQc2AgAgA0EEaiIDIAVJDQALIAggBEYNAyAIIAgoAgRBfnE2AgQgCCAIIARrIgA2AgAgBCAAQQFyNgIEAkAgAEH/AUsNACAAQXhxQbDQgIAAaiEDAkACQEEAKAKI0ICAACIFQQEgAEEDdnQiAHENAEEAIAUgAHI2AojQgIAAIAMhBQwBCyADKAIIIQULIAUgBDYCDCADIAQ2AgggBCADNgIMIAQgBTYCCAwEC0EfIQMCQCAAQf///wdLDQAgAEEIdiIDIANBgP4/akEQdkEIcSIDdCIFIAVBgOAfakEQdkEEcSIFdCIIIAhBgIAPakEQdkECcSIIdEEPdiADIAVyIAhyayIDQQF0IAAgA0EVanZBAXFyQRxqIQMLIAQgAzYCHCAEQgA3AhAgA0ECdEG40oCAAGohBQJAQQAoAozQgIAAIghBASADdCIGcQ0AIAUgBDYCAEEAIAggBnI2AozQgIAAIAQgBTYCGCAEIAQ2AgggBCAENgIMDAQLIABBAEEZIANBAXZrIANBH0YbdCEDIAUoAgAhCANAIAgiBSgCBEF4cSAARg0DIANBHXYhCCADQQF0IQMgBSAIQQRxakEQaiIGKAIAIggNAAsgBiAENgIAIAQgBTYCGCAEIAQ2AgwgBCAENgIIDAMLIAUoAggiAyACNgIMIAUgAjYCCCACQQA2AhggAiAFNgIMIAIgAzYCCAsgC0EIaiEDDAULIAUoAggiAyAENgIMIAUgBDYCCCAEQQA2AhggBCAFNgIMIAQgAzYCCAtBACgClNCAgAAiAyACTQ0AQQAoAqDQgIAAIgQgAmoiBSADIAJrIgNBAXI2AgRBACADNgKU0ICAAEEAIAU2AqDQgIAAIAQgAkEDcjYCBCAEQQhqIQMMAwtBACEDQQBBMDYC+NOAgAAMAgsCQCALRQ0AAkACQCAIIAgoAhwiBUECdEG40oCAAGoiAygCAEcNACADIAA2AgAgAA0BQQAgB0F+IAV3cSIHNgKM0ICAAAwCCyALQRBBFCALKAIQIAhGG2ogADYCACAARQ0BCyAAIAs2AhgCQCAIKAIQIgNFDQAgACADNgIQIAMgADYCGAsgCEEUaigCACIDRQ0AIABBFGogAzYCACADIAA2AhgLAkACQCAEQQ9LDQAgCCAEIAJqIgNBA3I2AgQgCCADaiIDIAMoAgRBAXI2AgQMAQsgCCACaiIAIARBAXI2AgQgCCACQQNyNgIEIAAgBGogBDYCAAJAIARB/wFLDQAgBEF4cUGw0ICAAGohAwJAAkBBACgCiNCAgAAiBUEBIARBA3Z0IgRxDQBBACAFIARyNgKI0ICAACADIQQMAQsgAygCCCEECyAEIAA2AgwgAyAANgIIIAAgAzYCDCAAIAQ2AggMAQtBHyEDAkAgBEH///8HSw0AIARBCHYiAyADQYD+P2pBEHZBCHEiA3QiBSAFQYDgH2pBEHZBBHEiBXQiAiACQYCAD2pBEHZBAnEiAnRBD3YgAyAFciACcmsiA0EBdCAEIANBFWp2QQFxckEcaiEDCyAAIAM2AhwgAEIANwIQIANBAnRBuNKAgABqIQUCQCAHQQEgA3QiAnENACAFIAA2AgBBACAHIAJyNgKM0ICAACAAIAU2AhggACAANgIIIAAgADYCDAwBCyAEQQBBGSADQQF2ayADQR9GG3QhAyAFKAIAIQICQANAIAIiBSgCBEF4cSAERg0BIANBHXYhAiADQQF0IQMgBSACQQRxakEQaiIGKAIAIgINAAsgBiAANgIAIAAgBTYCGCAAIAA2AgwgACAANgIIDAELIAUoAggiAyAANgIMIAUgADYCCCAAQQA2AhggACAFNgIMIAAgAzYCCAsgCEEIaiEDDAELAkAgCkUNAAJAAkAgACAAKAIcIgVBAnRBuNKAgABqIgMoAgBHDQAgAyAINgIAIAgNAUEAIAlBfiAFd3E2AozQgIAADAILIApBEEEUIAooAhAgAEYbaiAINgIAIAhFDQELIAggCjYCGAJAIAAoAhAiA0UNACAIIAM2AhAgAyAINgIYCyAAQRRqKAIAIgNFDQAgCEEUaiADNgIAIAMgCDYCGAsCQAJAIARBD0sNACAAIAQgAmoiA0EDcjYCBCAAIANqIgMgAygCBEEBcjYCBAwBCyAAIAJqIgUgBEEBcjYCBCAAIAJBA3I2AgQgBSAEaiAENgIAAkAgB0UNACAHQXhxQbDQgIAAaiECQQAoApzQgIAAIQMCQAJAQQEgB0EDdnQiCCAGcQ0AQQAgCCAGcjYCiNCAgAAgAiEIDAELIAIoAgghCAsgCCADNgIMIAIgAzYCCCADIAI2AgwgAyAINgIIC0EAIAU2ApzQgIAAQQAgBDYCkNCAgAALIABBCGohAwsgAUEQaiSAgICAACADCwoAIAAQyYCAgAAL4g0BB38CQCAARQ0AIABBeGoiASAAQXxqKAIAIgJBeHEiAGohAwJAIAJBAXENACACQQNxRQ0BIAEgASgCACICayIBQQAoApjQgIAAIgRJDQEgAiAAaiEAAkAgAUEAKAKc0ICAAEYNAAJAIAJB/wFLDQAgASgCCCIEIAJBA3YiBUEDdEGw0ICAAGoiBkYaAkAgASgCDCICIARHDQBBAEEAKAKI0ICAAEF+IAV3cTYCiNCAgAAMAwsgAiAGRhogAiAENgIIIAQgAjYCDAwCCyABKAIYIQcCQAJAIAEoAgwiBiABRg0AIAEoAggiAiAESRogBiACNgIIIAIgBjYCDAwBCwJAIAFBFGoiAigCACIEDQAgAUEQaiICKAIAIgQNAEEAIQYMAQsDQCACIQUgBCIGQRRqIgIoAgAiBA0AIAZBEGohAiAGKAIQIgQNAAsgBUEANgIACyAHRQ0BAkACQCABIAEoAhwiBEECdEG40oCAAGoiAigCAEcNACACIAY2AgAgBg0BQQBBACgCjNCAgABBfiAEd3E2AozQgIAADAMLIAdBEEEUIAcoAhAgAUYbaiAGNgIAIAZFDQILIAYgBzYCGAJAIAEoAhAiAkUNACAGIAI2AhAgAiAGNgIYCyABKAIUIgJFDQEgBkEUaiACNgIAIAIgBjYCGAwBCyADKAIEIgJBA3FBA0cNACADIAJBfnE2AgRBACAANgKQ0ICAACABIABqIAA2AgAgASAAQQFyNgIEDwsgASADTw0AIAMoAgQiAkEBcUUNAAJAAkAgAkECcQ0AAkAgA0EAKAKg0ICAAEcNAEEAIAE2AqDQgIAAQQBBACgClNCAgAAgAGoiADYClNCAgAAgASAAQQFyNgIEIAFBACgCnNCAgABHDQNBAEEANgKQ0ICAAEEAQQA2ApzQgIAADwsCQCADQQAoApzQgIAARw0AQQAgATYCnNCAgABBAEEAKAKQ0ICAACAAaiIANgKQ0ICAACABIABBAXI2AgQgASAAaiAANgIADwsgAkF4cSAAaiEAAkACQCACQf8BSw0AIAMoAggiBCACQQN2IgVBA3RBsNCAgABqIgZGGgJAIAMoAgwiAiAERw0AQQBBACgCiNCAgABBfiAFd3E2AojQgIAADAILIAIgBkYaIAIgBDYCCCAEIAI2AgwMAQsgAygCGCEHAkACQCADKAIMIgYgA0YNACADKAIIIgJBACgCmNCAgABJGiAGIAI2AgggAiAGNgIMDAELAkAgA0EUaiICKAIAIgQNACADQRBqIgIoAgAiBA0AQQAhBgwBCwNAIAIhBSAEIgZBFGoiAigCACIEDQAgBkEQaiECIAYoAhAiBA0ACyAFQQA2AgALIAdFDQACQAJAIAMgAygCHCIEQQJ0QbjSgIAAaiICKAIARw0AIAIgBjYCACAGDQFBAEEAKAKM0ICAAEF+IAR3cTYCjNCAgAAMAgsgB0EQQRQgBygCECADRhtqIAY2AgAgBkUNAQsgBiAHNgIYAkAgAygCECICRQ0AIAYgAjYCECACIAY2AhgLIAMoAhQiAkUNACAGQRRqIAI2AgAgAiAGNgIYCyABIABqIAA2AgAgASAAQQFyNgIEIAFBACgCnNCAgABHDQFBACAANgKQ0ICAAA8LIAMgAkF+cTYCBCABIABqIAA2AgAgASAAQQFyNgIECwJAIABB/wFLDQAgAEF4cUGw0ICAAGohAgJAAkBBACgCiNCAgAAiBEEBIABBA3Z0IgBxDQBBACAEIAByNgKI0ICAACACIQAMAQsgAigCCCEACyAAIAE2AgwgAiABNgIIIAEgAjYCDCABIAA2AggPC0EfIQICQCAAQf///wdLDQAgAEEIdiICIAJBgP4/akEQdkEIcSICdCIEIARBgOAfakEQdkEEcSIEdCIGIAZBgIAPakEQdkECcSIGdEEPdiACIARyIAZyayICQQF0IAAgAkEVanZBAXFyQRxqIQILIAEgAjYCHCABQgA3AhAgAkECdEG40oCAAGohBAJAAkBBACgCjNCAgAAiBkEBIAJ0IgNxDQAgBCABNgIAQQAgBiADcjYCjNCAgAAgASAENgIYIAEgATYCCCABIAE2AgwMAQsgAEEAQRkgAkEBdmsgAkEfRht0IQIgBCgCACEGAkADQCAGIgQoAgRBeHEgAEYNASACQR12IQYgAkEBdCECIAQgBkEEcWpBEGoiAygCACIGDQALIAMgATYCACABIAQ2AhggASABNgIMIAEgATYCCAwBCyAEKAIIIgAgATYCDCAEIAE2AgggAUEANgIYIAEgBDYCDCABIAA2AggLQQBBACgCqNCAgABBf2oiAUF/IAEbNgKo0ICAAAsLBAAAAAtOAAJAIAANAD8AQRB0DwsCQCAAQf//A3ENACAAQX9MDQACQCAAQRB2QAAiAEF/Rw0AQQBBMDYC+NOAgABBfw8LIABBEHQPCxDKgICAAAAL8gICA38BfgJAIAJFDQAgACABOgAAIAIgAGoiA0F/aiABOgAAIAJBA0kNACAAIAE6AAIgACABOgABIANBfWogAToAACADQX5qIAE6AAAgAkEHSQ0AIAAgAToAAyADQXxqIAE6AAAgAkEJSQ0AIABBACAAa0EDcSIEaiIDIAFB/wFxQYGChAhsIgE2AgAgAyACIARrQXxxIgRqIgJBfGogATYCACAEQQlJDQAgAyABNgIIIAMgATYCBCACQXhqIAE2AgAgAkF0aiABNgIAIARBGUkNACADIAE2AhggAyABNgIUIAMgATYCECADIAE2AgwgAkFwaiABNgIAIAJBbGogATYCACACQWhqIAE2AgAgAkFkaiABNgIAIAQgA0EEcUEYciIFayICQSBJDQAgAa1CgYCAgBB+IQYgAyAFaiEBA0AgASAGNwMYIAEgBjcDECABIAY3AwggASAGNwMAIAFBIGohASACQWBqIgJBH0sNAAsLIAALC45IAQBBgAgLhkgBAAAAAgAAAAMAAAAAAAAAAAAAAAQAAAAFAAAAAAAAAAAAAAAGAAAABwAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEludmFsaWQgY2hhciBpbiB1cmwgcXVlcnkAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9ib2R5AENvbnRlbnQtTGVuZ3RoIG92ZXJmbG93AENodW5rIHNpemUgb3ZlcmZsb3cAUmVzcG9uc2Ugb3ZlcmZsb3cASW52YWxpZCBtZXRob2QgZm9yIEhUVFAveC54IHJlcXVlc3QASW52YWxpZCBtZXRob2QgZm9yIFJUU1AveC54IHJlcXVlc3QARXhwZWN0ZWQgU09VUkNFIG1ldGhvZCBmb3IgSUNFL3gueCByZXF1ZXN0AEludmFsaWQgY2hhciBpbiB1cmwgZnJhZ21lbnQgc3RhcnQARXhwZWN0ZWQgZG90AFNwYW4gY2FsbGJhY2sgZXJyb3IgaW4gb25fc3RhdHVzAEludmFsaWQgcmVzcG9uc2Ugc3RhdHVzAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIGV4dGVuc2lvbnMAVXNlciBjYWxsYmFjayBlcnJvcgBgb25fcmVzZXRgIGNhbGxiYWNrIGVycm9yAGBvbl9jaHVua19oZWFkZXJgIGNhbGxiYWNrIGVycm9yAGBvbl9tZXNzYWdlX2JlZ2luYCBjYWxsYmFjayBlcnJvcgBgb25fY2h1bmtfZXh0ZW5zaW9uX3ZhbHVlYCBjYWxsYmFjayBlcnJvcgBgb25fc3RhdHVzX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fdmVyc2lvbl9jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX3VybF9jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX2NodW5rX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25faGVhZGVyX3ZhbHVlX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fbWVzc2FnZV9jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX21ldGhvZF9jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX2hlYWRlcl9maWVsZF9jb21wbGV0ZWAgY2FsbGJhY2sgZXJyb3IAYG9uX2NodW5rX2V4dGVuc2lvbl9uYW1lYCBjYWxsYmFjayBlcnJvcgBVbmV4cGVjdGVkIGNoYXIgaW4gdXJsIHNlcnZlcgBJbnZhbGlkIGhlYWRlciB2YWx1ZSBjaGFyAEludmFsaWQgaGVhZGVyIGZpZWxkIGNoYXIAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl92ZXJzaW9uAEludmFsaWQgbWlub3IgdmVyc2lvbgBJbnZhbGlkIG1ham9yIHZlcnNpb24ARXhwZWN0ZWQgc3BhY2UgYWZ0ZXIgdmVyc2lvbgBFeHBlY3RlZCBDUkxGIGFmdGVyIHZlcnNpb24ASW52YWxpZCBIVFRQIHZlcnNpb24ASW52YWxpZCBoZWFkZXIgdG9rZW4AU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl91cmwASW52YWxpZCBjaGFyYWN0ZXJzIGluIHVybABVbmV4cGVjdGVkIHN0YXJ0IGNoYXIgaW4gdXJsAERvdWJsZSBAIGluIHVybABFbXB0eSBDb250ZW50LUxlbmd0aABJbnZhbGlkIGNoYXJhY3RlciBpbiBDb250ZW50LUxlbmd0aABEdXBsaWNhdGUgQ29udGVudC1MZW5ndGgASW52YWxpZCBjaGFyIGluIHVybCBwYXRoAENvbnRlbnQtTGVuZ3RoIGNhbid0IGJlIHByZXNlbnQgd2l0aCBUcmFuc2Zlci1FbmNvZGluZwBJbnZhbGlkIGNoYXJhY3RlciBpbiBjaHVuayBzaXplAFNwYW4gY2FsbGJhY2sgZXJyb3IgaW4gb25faGVhZGVyX3ZhbHVlAFNwYW4gY2FsbGJhY2sgZXJyb3IgaW4gb25fY2h1bmtfZXh0ZW5zaW9uX3ZhbHVlAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIGV4dGVuc2lvbnMgdmFsdWUATWlzc2luZyBleHBlY3RlZCBMRiBhZnRlciBoZWFkZXIgdmFsdWUASW52YWxpZCBgVHJhbnNmZXItRW5jb2RpbmdgIGhlYWRlciB2YWx1ZQBJbnZhbGlkIGNoYXJhY3RlciBpbiBjaHVuayBleHRlbnNpb25zIHF1b3RlIHZhbHVlAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIGV4dGVuc2lvbnMgcXVvdGVkIHZhbHVlAFBhdXNlZCBieSBvbl9oZWFkZXJzX2NvbXBsZXRlAEludmFsaWQgRU9GIHN0YXRlAG9uX3Jlc2V0IHBhdXNlAG9uX2NodW5rX2hlYWRlciBwYXVzZQBvbl9tZXNzYWdlX2JlZ2luIHBhdXNlAG9uX2NodW5rX2V4dGVuc2lvbl92YWx1ZSBwYXVzZQBvbl9zdGF0dXNfY29tcGxldGUgcGF1c2UAb25fdmVyc2lvbl9jb21wbGV0ZSBwYXVzZQBvbl91cmxfY29tcGxldGUgcGF1c2UAb25fY2h1bmtfY29tcGxldGUgcGF1c2UAb25faGVhZGVyX3ZhbHVlX2NvbXBsZXRlIHBhdXNlAG9uX21lc3NhZ2VfY29tcGxldGUgcGF1c2UAb25fbWV0aG9kX2NvbXBsZXRlIHBhdXNlAG9uX2hlYWRlcl9maWVsZF9jb21wbGV0ZSBwYXVzZQBvbl9jaHVua19leHRlbnNpb25fbmFtZSBwYXVzZQBVbmV4cGVjdGVkIHNwYWNlIGFmdGVyIHN0YXJ0IGxpbmUAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9jaHVua19leHRlbnNpb25fbmFtZQBJbnZhbGlkIGNoYXJhY3RlciBpbiBjaHVuayBleHRlbnNpb25zIG5hbWUAUGF1c2Ugb24gQ09OTkVDVC9VcGdyYWRlAFBhdXNlIG9uIFBSSS9VcGdyYWRlAEV4cGVjdGVkIEhUVFAvMiBDb25uZWN0aW9uIFByZWZhY2UAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9tZXRob2QARXhwZWN0ZWQgc3BhY2UgYWZ0ZXIgbWV0aG9kAFNwYW4gY2FsbGJhY2sgZXJyb3IgaW4gb25faGVhZGVyX2ZpZWxkAFBhdXNlZABJbnZhbGlkIHdvcmQgZW5jb3VudGVyZWQASW52YWxpZCBtZXRob2QgZW5jb3VudGVyZWQAVW5leHBlY3RlZCBjaGFyIGluIHVybCBzY2hlbWEAUmVxdWVzdCBoYXMgaW52YWxpZCBgVHJhbnNmZXItRW5jb2RpbmdgAFNXSVRDSF9QUk9YWQBVU0VfUFJPWFkATUtBQ1RJVklUWQBVTlBST0NFU1NBQkxFX0VOVElUWQBDT1BZAE1PVkVEX1BFUk1BTkVOVExZAFRPT19FQVJMWQBOT1RJRlkARkFJTEVEX0RFUEVOREVOQ1kAQkFEX0dBVEVXQVkAUExBWQBQVVQAQ0hFQ0tPVVQAR0FURVdBWV9USU1FT1VUAFJFUVVFU1RfVElNRU9VVABORVRXT1JLX0NPTk5FQ1RfVElNRU9VVABDT05ORUNUSU9OX1RJTUVPVVQATE9HSU5fVElNRU9VVABORVRXT1JLX1JFQURfVElNRU9VVABQT1NUAE1JU0RJUkVDVEVEX1JFUVVFU1QAQ0xJRU5UX0NMT1NFRF9SRVFVRVNUAENMSUVOVF9DTE9TRURfTE9BRF9CQUxBTkNFRF9SRVFVRVNUAEJBRF9SRVFVRVNUAEhUVFBfUkVRVUVTVF9TRU5UX1RPX0hUVFBTX1BPUlQAUkVQT1JUAElNX0FfVEVBUE9UAFJFU0VUX0NPTlRFTlQATk9fQ09OVEVOVABQQVJUSUFMX0NPTlRFTlQASFBFX0lOVkFMSURfQ09OU1RBTlQASFBFX0NCX1JFU0VUAEdFVABIUEVfU1RSSUNUAENPTkZMSUNUAFRFTVBPUkFSWV9SRURJUkVDVABQRVJNQU5FTlRfUkVESVJFQ1QAQ09OTkVDVABNVUxUSV9TVEFUVVMASFBFX0lOVkFMSURfU1RBVFVTAFRPT19NQU5ZX1JFUVVFU1RTAEVBUkxZX0hJTlRTAFVOQVZBSUxBQkxFX0ZPUl9MRUdBTF9SRUFTT05TAE9QVElPTlMAU1dJVENISU5HX1BST1RPQ09MUwBWQVJJQU5UX0FMU09fTkVHT1RJQVRFUwBNVUxUSVBMRV9DSE9JQ0VTAElOVEVSTkFMX1NFUlZFUl9FUlJPUgBXRUJfU0VSVkVSX1VOS05PV05fRVJST1IAUkFJTEdVTl9FUlJPUgBJREVOVElUWV9QUk9WSURFUl9BVVRIRU5USUNBVElPTl9FUlJPUgBTU0xfQ0VSVElGSUNBVEVfRVJST1IASU5WQUxJRF9YX0ZPUldBUkRFRF9GT1IAU0VUX1BBUkFNRVRFUgBHRVRfUEFSQU1FVEVSAEhQRV9VU0VSAFNFRV9PVEhFUgBIUEVfQ0JfQ0hVTktfSEVBREVSAE1LQ0FMRU5EQVIAU0VUVVAAV0VCX1NFUlZFUl9JU19ET1dOAFRFQVJET1dOAEhQRV9DTE9TRURfQ09OTkVDVElPTgBIRVVSSVNUSUNfRVhQSVJBVElPTgBESVNDT05ORUNURURfT1BFUkFUSU9OAE5PTl9BVVRIT1JJVEFUSVZFX0lORk9STUFUSU9OAEhQRV9JTlZBTElEX1ZFUlNJT04ASFBFX0NCX01FU1NBR0VfQkVHSU4AU0lURV9JU19GUk9aRU4ASFBFX0lOVkFMSURfSEVBREVSX1RPS0VOAElOVkFMSURfVE9LRU4ARk9SQklEREVOAEVOSEFOQ0VfWU9VUl9DQUxNAEhQRV9JTlZBTElEX1VSTABCTE9DS0VEX0JZX1BBUkVOVEFMX0NPTlRST0wATUtDT0wAQUNMAEhQRV9JTlRFUk5BTABSRVFVRVNUX0hFQURFUl9GSUVMRFNfVE9PX0xBUkdFX1VOT0ZGSUNJQUwASFBFX09LAFVOTElOSwBVTkxPQ0sAUFJJAFJFVFJZX1dJVEgASFBFX0lOVkFMSURfQ09OVEVOVF9MRU5HVEgASFBFX1VORVhQRUNURURfQ09OVEVOVF9MRU5HVEgARkxVU0gAUFJPUFBBVENIAE0tU0VBUkNIAFVSSV9UT09fTE9ORwBQUk9DRVNTSU5HAE1JU0NFTExBTkVPVVNfUEVSU0lTVEVOVF9XQVJOSU5HAE1JU0NFTExBTkVPVVNfV0FSTklORwBIUEVfSU5WQUxJRF9UUkFOU0ZFUl9FTkNPRElORwBFeHBlY3RlZCBDUkxGAEhQRV9JTlZBTElEX0NIVU5LX1NJWkUATU9WRQBDT05USU5VRQBIUEVfQ0JfU1RBVFVTX0NPTVBMRVRFAEhQRV9DQl9IRUFERVJTX0NPTVBMRVRFAEhQRV9DQl9WRVJTSU9OX0NPTVBMRVRFAEhQRV9DQl9VUkxfQ09NUExFVEUASFBFX0NCX0NIVU5LX0NPTVBMRVRFAEhQRV9DQl9IRUFERVJfVkFMVUVfQ09NUExFVEUASFBFX0NCX0NIVU5LX0VYVEVOU0lPTl9WQUxVRV9DT01QTEVURQBIUEVfQ0JfQ0hVTktfRVhURU5TSU9OX05BTUVfQ09NUExFVEUASFBFX0NCX01FU1NBR0VfQ09NUExFVEUASFBFX0NCX01FVEhPRF9DT01QTEVURQBIUEVfQ0JfSEVBREVSX0ZJRUxEX0NPTVBMRVRFAERFTEVURQBIUEVfSU5WQUxJRF9FT0ZfU1RBVEUASU5WQUxJRF9TU0xfQ0VSVElGSUNBVEUAUEFVU0UATk9fUkVTUE9OU0UAVU5TVVBQT1JURURfTUVESUFfVFlQRQBHT05FAE5PVF9BQ0NFUFRBQkxFAFNFUlZJQ0VfVU5BVkFJTEFCTEUAUkFOR0VfTk9UX1NBVElTRklBQkxFAE9SSUdJTl9JU19VTlJFQUNIQUJMRQBSRVNQT05TRV9JU19TVEFMRQBQVVJHRQBNRVJHRQBSRVFVRVNUX0hFQURFUl9GSUVMRFNfVE9PX0xBUkdFAFJFUVVFU1RfSEVBREVSX1RPT19MQVJHRQBQQVlMT0FEX1RPT19MQVJHRQBJTlNVRkZJQ0lFTlRfU1RPUkFHRQBIUEVfUEFVU0VEX1VQR1JBREUASFBFX1BBVVNFRF9IMl9VUEdSQURFAFNPVVJDRQBBTk5PVU5DRQBUUkFDRQBIUEVfVU5FWFBFQ1RFRF9TUEFDRQBERVNDUklCRQBVTlNVQlNDUklCRQBSRUNPUkQASFBFX0lOVkFMSURfTUVUSE9EAE5PVF9GT1VORABQUk9QRklORABVTkJJTkQAUkVCSU5EAFVOQVVUSE9SSVpFRABNRVRIT0RfTk9UX0FMTE9XRUQASFRUUF9WRVJTSU9OX05PVF9TVVBQT1JURUQAQUxSRUFEWV9SRVBPUlRFRABBQ0NFUFRFRABOT1RfSU1QTEVNRU5URUQATE9PUF9ERVRFQ1RFRABIUEVfQ1JfRVhQRUNURUQASFBFX0xGX0VYUEVDVEVEAENSRUFURUQASU1fVVNFRABIUEVfUEFVU0VEAFRJTUVPVVRfT0NDVVJFRABQQVlNRU5UX1JFUVVJUkVEAFBSRUNPTkRJVElPTl9SRVFVSVJFRABQUk9YWV9BVVRIRU5USUNBVElPTl9SRVFVSVJFRABORVRXT1JLX0FVVEhFTlRJQ0FUSU9OX1JFUVVJUkVEAExFTkdUSF9SRVFVSVJFRABTU0xfQ0VSVElGSUNBVEVfUkVRVUlSRUQAVVBHUkFERV9SRVFVSVJFRABQQUdFX0VYUElSRUQAUFJFQ09ORElUSU9OX0ZBSUxFRABFWFBFQ1RBVElPTl9GQUlMRUQAUkVWQUxJREFUSU9OX0ZBSUxFRABTU0xfSEFORFNIQUtFX0ZBSUxFRABMT0NLRUQAVFJBTlNGT1JNQVRJT05fQVBQTElFRABOT1RfTU9ESUZJRUQATk9UX0VYVEVOREVEAEJBTkRXSURUSF9MSU1JVF9FWENFRURFRABTSVRFX0lTX09WRVJMT0FERUQASEVBRABFeHBlY3RlZCBIVFRQLwAAXhMAACYTAAAwEAAA8BcAAJ0TAAAVEgAAORcAAPASAAAKEAAAdRIAAK0SAACCEwAATxQAAH8QAACgFQAAIxQAAIkSAACLFAAATRUAANQRAADPFAAAEBgAAMkWAADcFgAAwREAAOAXAAC7FAAAdBQAAHwVAADlFAAACBcAAB8QAABlFQAAoxQAACgVAAACFQAAmRUAACwQAACLGQAATw8AANQOAABqEAAAzhAAAAIXAACJDgAAbhMAABwTAABmFAAAVhcAAMETAADNEwAAbBMAAGgXAABmFwAAXxcAACITAADODwAAaQ4AANgOAABjFgAAyxMAAKoOAAAoFwAAJhcAAMUTAABdFgAA6BEAAGcTAABlEwAA8hYAAHMTAAAdFwAA+RYAAPMRAADPDgAAzhUAAAwSAACzEQAApREAAGEQAAAyFwAAuxMAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQIBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAIDAgICAgIAAAICAAICAAICAgICAgICAgIABAAAAAAAAgICAgICAgICAgICAgICAgICAgICAgICAgIAAAACAgICAgICAgICAgICAgICAgICAgICAgICAgICAgACAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAACAAICAgICAAACAgACAgACAgICAgICAgICAAMABAAAAAICAgICAgICAgICAgICAgICAgICAgICAgICAAAAAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAAgACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbG9zZWVlcC1hbGl2ZQAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQIBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBY2h1bmtlZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEAAQEBAQEAAAEBAAEBAAEBAQEBAQEBAQEAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABlY3Rpb25lbnQtbGVuZ3Rob25yb3h5LWNvbm5lY3Rpb24AAAAAAAAAAAAAAAAAAAByYW5zZmVyLWVuY29kaW5ncGdyYWRlDQoNCg0KU00NCg0KVFRQL0NFL1RTUC8AAAAAAAAAAAAAAAABAgABAwAAAAAAAAAAAAAAAAAAAAAAAAQBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAQIAAQMAAAAAAAAAAAAAAAAAAAAAAAAEAQEFAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAEAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAAAAQAAAgAAAAAAAAAAAAAAAAAAAAAAAAMEAAAEBAQEBAQEBAQEBAUEBAQEBAQEBAQEBAQABAAGBwQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEAAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAADAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwAAAAAAAAMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAABAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAIAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAAAAAAAADAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABOT1VOQ0VFQ0tPVVRORUNURVRFQ1JJQkVMVVNIRVRFQURTRUFSQ0hSR0VDVElWSVRZTEVOREFSVkVPVElGWVBUSU9OU0NIU0VBWVNUQVRDSEdFT1JESVJFQ1RPUlRSQ0hQQVJBTUVURVJVUkNFQlNDUklCRUFSRE9XTkFDRUlORE5LQ0tVQlNDUklCRUhUVFAvQURUUC8="; - } -}); - -// node_modules/undici/lib/llhttp/llhttp_simd-wasm.js -var require_llhttp_simd_wasm = __commonJS({ - "node_modules/undici/lib/llhttp/llhttp_simd-wasm.js"(exports2, module2) { - module2.exports = "AGFzbQEAAAABMAhgAX8Bf2ADf39/AX9gBH9/f38Bf2AAAGADf39/AGABfwBgAn9/AGAGf39/f39/AALLAQgDZW52GHdhc21fb25faGVhZGVyc19jb21wbGV0ZQACA2VudhV3YXNtX29uX21lc3NhZ2VfYmVnaW4AAANlbnYLd2FzbV9vbl91cmwAAQNlbnYOd2FzbV9vbl9zdGF0dXMAAQNlbnYUd2FzbV9vbl9oZWFkZXJfZmllbGQAAQNlbnYUd2FzbV9vbl9oZWFkZXJfdmFsdWUAAQNlbnYMd2FzbV9vbl9ib2R5AAEDZW52GHdhc21fb25fbWVzc2FnZV9jb21wbGV0ZQAAA0ZFAwMEAAAFAAAAAAAABQEFAAUFBQAABgAAAAAGBgYGAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAAABAQcAAAUFAwABBAUBcAESEgUDAQACBggBfwFBgNQECwfRBSIGbWVtb3J5AgALX2luaXRpYWxpemUACRlfX2luZGlyZWN0X2Z1bmN0aW9uX3RhYmxlAQALbGxodHRwX2luaXQAChhsbGh0dHBfc2hvdWxkX2tlZXBfYWxpdmUAQQxsbGh0dHBfYWxsb2MADAZtYWxsb2MARgtsbGh0dHBfZnJlZQANBGZyZWUASA9sbGh0dHBfZ2V0X3R5cGUADhVsbGh0dHBfZ2V0X2h0dHBfbWFqb3IADxVsbGh0dHBfZ2V0X2h0dHBfbWlub3IAEBFsbGh0dHBfZ2V0X21ldGhvZAARFmxsaHR0cF9nZXRfc3RhdHVzX2NvZGUAEhJsbGh0dHBfZ2V0X3VwZ3JhZGUAEwxsbGh0dHBfcmVzZXQAFA5sbGh0dHBfZXhlY3V0ZQAVFGxsaHR0cF9zZXR0aW5nc19pbml0ABYNbGxodHRwX2ZpbmlzaAAXDGxsaHR0cF9wYXVzZQAYDWxsaHR0cF9yZXN1bWUAGRtsbGh0dHBfcmVzdW1lX2FmdGVyX3VwZ3JhZGUAGhBsbGh0dHBfZ2V0X2Vycm5vABsXbGxodHRwX2dldF9lcnJvcl9yZWFzb24AHBdsbGh0dHBfc2V0X2Vycm9yX3JlYXNvbgAdFGxsaHR0cF9nZXRfZXJyb3JfcG9zAB4RbGxodHRwX2Vycm5vX25hbWUAHxJsbGh0dHBfbWV0aG9kX25hbWUAIBJsbGh0dHBfc3RhdHVzX25hbWUAIRpsbGh0dHBfc2V0X2xlbmllbnRfaGVhZGVycwAiIWxsaHR0cF9zZXRfbGVuaWVudF9jaHVua2VkX2xlbmd0aAAjHWxsaHR0cF9zZXRfbGVuaWVudF9rZWVwX2FsaXZlACQkbGxodHRwX3NldF9sZW5pZW50X3RyYW5zZmVyX2VuY29kaW5nACUYbGxodHRwX21lc3NhZ2VfbmVlZHNfZW9mAD8JFwEAQQELEQECAwQFCwYHNTk3MS8tJyspCrLgAkUCAAsIABCIgICAAAsZACAAEMKAgIAAGiAAIAI2AjggACABOgAoCxwAIAAgAC8BMiAALQAuIAAQwYCAgAAQgICAgAALKgEBf0HAABDGgICAACIBEMKAgIAAGiABQYCIgIAANgI4IAEgADoAKCABCwoAIAAQyICAgAALBwAgAC0AKAsHACAALQAqCwcAIAAtACsLBwAgAC0AKQsHACAALwEyCwcAIAAtAC4LRQEEfyAAKAIYIQEgAC0ALSECIAAtACghAyAAKAI4IQQgABDCgICAABogACAENgI4IAAgAzoAKCAAIAI6AC0gACABNgIYCxEAIAAgASABIAJqEMOAgIAACxAAIABBAEHcABDMgICAABoLZwEBf0EAIQECQCAAKAIMDQACQAJAAkACQCAALQAvDgMBAAMCCyAAKAI4IgFFDQAgASgCLCIBRQ0AIAAgARGAgICAAAAiAQ0DC0EADwsQyoCAgAAACyAAQcOWgIAANgIQQQ4hAQsgAQseAAJAIAAoAgwNACAAQdGbgIAANgIQIABBFTYCDAsLFgACQCAAKAIMQRVHDQAgAEEANgIMCwsWAAJAIAAoAgxBFkcNACAAQQA2AgwLCwcAIAAoAgwLBwAgACgCEAsJACAAIAE2AhALBwAgACgCFAsiAAJAIABBJEkNABDKgICAAAALIABBAnRBoLOAgABqKAIACyIAAkAgAEEuSQ0AEMqAgIAAAAsgAEECdEGwtICAAGooAgAL7gsBAX9B66iAgAAhAQJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIABBnH9qDvQDY2IAAWFhYWFhYQIDBAVhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhBgcICQoLDA0OD2FhYWFhEGFhYWFhYWFhYWFhEWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYRITFBUWFxgZGhthYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhHB0eHyAhIiMkJSYnKCkqKywtLi8wMTIzNDU2YTc4OTphYWFhYWFhYTthYWE8YWFhYT0+P2FhYWFhYWFhQGFhQWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYUJDREVGR0hJSktMTU5PUFFSU2FhYWFhYWFhVFVWV1hZWlthXF1hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFeYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhX2BhC0Hhp4CAAA8LQaShgIAADwtBy6yAgAAPC0H+sYCAAA8LQcCkgIAADwtBq6SAgAAPC0GNqICAAA8LQeKmgIAADwtBgLCAgAAPC0G5r4CAAA8LQdekgIAADwtB75+AgAAPC0Hhn4CAAA8LQfqfgIAADwtB8qCAgAAPC0Gor4CAAA8LQa6ygIAADwtBiLCAgAAPC0Hsp4CAAA8LQYKigIAADwtBjp2AgAAPC0HQroCAAA8LQcqjgIAADwtBxbKAgAAPC0HfnICAAA8LQdKcgIAADwtBxKCAgAAPC0HXoICAAA8LQaKfgIAADwtB7a6AgAAPC0GrsICAAA8LQdSlgIAADwtBzK6AgAAPC0H6roCAAA8LQfyrgIAADwtB0rCAgAAPC0HxnYCAAA8LQbuggIAADwtB96uAgAAPC0GQsYCAAA8LQdexgIAADwtBoq2AgAAPC0HUp4CAAA8LQeCrgIAADwtBn6yAgAAPC0HrsYCAAA8LQdWfgIAADwtByrGAgAAPC0HepYCAAA8LQdSegIAADwtB9JyAgAAPC0GnsoCAAA8LQbGdgIAADwtBoJ2AgAAPC0G5sYCAAA8LQbywgIAADwtBkqGAgAAPC0GzpoCAAA8LQemsgIAADwtBrJ6AgAAPC0HUq4CAAA8LQfemgIAADwtBgKaAgAAPC0GwoYCAAA8LQf6egIAADwtBjaOAgAAPC0GJrYCAAA8LQfeigIAADwtBoLGAgAAPC0Gun4CAAA8LQcalgIAADwtB6J6AgAAPC0GTooCAAA8LQcKvgIAADwtBw52AgAAPC0GLrICAAA8LQeGdgIAADwtBja+AgAAPC0HqoYCAAA8LQbStgIAADwtB0q+AgAAPC0HfsoCAAA8LQdKygIAADwtB8LCAgAAPC0GpooCAAA8LQfmjgIAADwtBmZ6AgAAPC0G1rICAAA8LQZuwgIAADwtBkrKAgAAPC0G2q4CAAA8LQcKigIAADwtB+LKAgAAPC0GepYCAAA8LQdCigIAADwtBup6AgAAPC0GBnoCAAA8LEMqAgIAAAAtB1qGAgAAhAQsgAQsWACAAIAAtAC1B/gFxIAFBAEdyOgAtCxkAIAAgAC0ALUH9AXEgAUEAR0EBdHI6AC0LGQAgACAALQAtQfsBcSABQQBHQQJ0cjoALQsZACAAIAAtAC1B9wFxIAFBAEdBA3RyOgAtCy4BAn9BACEDAkAgACgCOCIERQ0AIAQoAgAiBEUNACAAIAQRgICAgAAAIQMLIAMLSQECf0EAIQMCQCAAKAI4IgRFDQAgBCgCBCIERQ0AIAAgASACIAFrIAQRgYCAgAAAIgNBf0cNACAAQcaRgIAANgIQQRghAwsgAwsuAQJ/QQAhAwJAIAAoAjgiBEUNACAEKAIwIgRFDQAgACAEEYCAgIAAACEDCyADC0kBAn9BACEDAkAgACgCOCIERQ0AIAQoAggiBEUNACAAIAEgAiABayAEEYGAgIAAACIDQX9HDQAgAEH2ioCAADYCEEEYIQMLIAMLLgECf0EAIQMCQCAAKAI4IgRFDQAgBCgCNCIERQ0AIAAgBBGAgICAAAAhAwsgAwtJAQJ/QQAhAwJAIAAoAjgiBEUNACAEKAIMIgRFDQAgACABIAIgAWsgBBGBgICAAAAiA0F/Rw0AIABB7ZqAgAA2AhBBGCEDCyADCy4BAn9BACEDAkAgACgCOCIERQ0AIAQoAjgiBEUNACAAIAQRgICAgAAAIQMLIAMLSQECf0EAIQMCQCAAKAI4IgRFDQAgBCgCECIERQ0AIAAgASACIAFrIAQRgYCAgAAAIgNBf0cNACAAQZWQgIAANgIQQRghAwsgAwsuAQJ/QQAhAwJAIAAoAjgiBEUNACAEKAI8IgRFDQAgACAEEYCAgIAAACEDCyADC0kBAn9BACEDAkAgACgCOCIERQ0AIAQoAhQiBEUNACAAIAEgAiABayAEEYGAgIAAACIDQX9HDQAgAEGqm4CAADYCEEEYIQMLIAMLLgECf0EAIQMCQCAAKAI4IgRFDQAgBCgCQCIERQ0AIAAgBBGAgICAAAAhAwsgAwtJAQJ/QQAhAwJAIAAoAjgiBEUNACAEKAIYIgRFDQAgACABIAIgAWsgBBGBgICAAAAiA0F/Rw0AIABB7ZOAgAA2AhBBGCEDCyADCy4BAn9BACEDAkAgACgCOCIERQ0AIAQoAkQiBEUNACAAIAQRgICAgAAAIQMLIAMLLgECf0EAIQMCQCAAKAI4IgRFDQAgBCgCJCIERQ0AIAAgBBGAgICAAAAhAwsgAwsuAQJ/QQAhAwJAIAAoAjgiBEUNACAEKAIsIgRFDQAgACAEEYCAgIAAACEDCyADC0kBAn9BACEDAkAgACgCOCIERQ0AIAQoAigiBEUNACAAIAEgAiABayAEEYGAgIAAACIDQX9HDQAgAEH2iICAADYCEEEYIQMLIAMLLgECf0EAIQMCQCAAKAI4IgRFDQAgBCgCUCIERQ0AIAAgBBGAgICAAAAhAwsgAwtJAQJ/QQAhAwJAIAAoAjgiBEUNACAEKAIcIgRFDQAgACABIAIgAWsgBBGBgICAAAAiA0F/Rw0AIABBwpmAgAA2AhBBGCEDCyADCy4BAn9BACEDAkAgACgCOCIERQ0AIAQoAkgiBEUNACAAIAQRgICAgAAAIQMLIAMLSQECf0EAIQMCQCAAKAI4IgRFDQAgBCgCICIERQ0AIAAgASACIAFrIAQRgYCAgAAAIgNBf0cNACAAQZSUgIAANgIQQRghAwsgAwsuAQJ/QQAhAwJAIAAoAjgiBEUNACAEKAJMIgRFDQAgACAEEYCAgIAAACEDCyADCy4BAn9BACEDAkAgACgCOCIERQ0AIAQoAlQiBEUNACAAIAQRgICAgAAAIQMLIAMLLgECf0EAIQMCQCAAKAI4IgRFDQAgBCgCWCIERQ0AIAAgBBGAgICAAAAhAwsgAwtFAQF/AkACQCAALwEwQRRxQRRHDQBBASEDIAAtAChBAUYNASAALwEyQeUARiEDDAELIAAtAClBBUYhAwsgACADOgAuQQAL/gEBA39BASEDAkAgAC8BMCIEQQhxDQAgACkDIEIAUiEDCwJAAkAgAC0ALkUNAEEBIQUgAC0AKUEFRg0BQQEhBSAEQcAAcUUgA3FBAUcNAQtBACEFIARBwABxDQBBAiEFIARB//8DcSIDQQhxDQACQCADQYAEcUUNAAJAIAAtAChBAUcNACAALQAtQQpxDQBBBQ8LQQQPCwJAIANBIHENAAJAIAAtAChBAUYNACAALwEyQf//A3EiAEGcf2pB5ABJDQAgAEHMAUYNACAAQbACRg0AQQQhBSAEQShxRQ0CIANBiARxQYAERg0CC0EADwtBAEEDIAApAyBQGyEFCyAFC2IBAn9BACEBAkAgAC0AKEEBRg0AIAAvATJB//8DcSICQZx/akHkAEkNACACQcwBRg0AIAJBsAJGDQAgAC8BMCIAQcAAcQ0AQQEhASAAQYgEcUGABEYNACAAQShxRSEBCyABC6cBAQN/AkACQAJAIAAtACpFDQAgAC0AK0UNAEEAIQMgAC8BMCIEQQJxRQ0BDAILQQAhAyAALwEwIgRBAXFFDQELQQEhAyAALQAoQQFGDQAgAC8BMkH//wNxIgVBnH9qQeQASQ0AIAVBzAFGDQAgBUGwAkYNACAEQcAAcQ0AQQAhAyAEQYgEcUGABEYNACAEQShxQQBHIQMLIABBADsBMCAAQQA6AC8gAwuZAQECfwJAAkACQCAALQAqRQ0AIAAtACtFDQBBACEBIAAvATAiAkECcUUNAQwCC0EAIQEgAC8BMCICQQFxRQ0BC0EBIQEgAC0AKEEBRg0AIAAvATJB//8DcSIAQZx/akHkAEkNACAAQcwBRg0AIABBsAJGDQAgAkHAAHENAEEAIQEgAkGIBHFBgARGDQAgAkEocUEARyEBCyABC0kBAXsgAEEQav0MAAAAAAAAAAAAAAAAAAAAACIB/QsDACAAIAH9CwMAIABBMGogAf0LAwAgAEEgaiAB/QsDACAAQd0BNgIcQQALewEBfwJAIAAoAgwiAw0AAkAgACgCBEUNACAAIAE2AgQLAkAgACABIAIQxICAgAAiAw0AIAAoAgwPCyAAIAM2AhxBACEDIAAoAgQiAUUNACAAIAEgAiAAKAIIEYGAgIAAACIBRQ0AIAAgAjYCFCAAIAE2AgwgASEDCyADC+TzAQMOfwN+BH8jgICAgABBEGsiAySAgICAACABIQQgASEFIAEhBiABIQcgASEIIAEhCSABIQogASELIAEhDCABIQ0gASEOIAEhDwJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCAAKAIcIhBBf2oO3QHaAQHZAQIDBAUGBwgJCgsMDQ7YAQ8Q1wEREtYBExQVFhcYGRob4AHfARwdHtUBHyAhIiMkJdQBJicoKSorLNMB0gEtLtEB0AEvMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUbbAUdISUrPAc4BS80BTMwBTU5PUFFSU1RVVldYWVpbXF1eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX5/gAGBAYIBgwGEAYUBhgGHAYgBiQGKAYsBjAGNAY4BjwGQAZEBkgGTAZQBlQGWAZcBmAGZAZoBmwGcAZ0BngGfAaABoQGiAaMBpAGlAaYBpwGoAakBqgGrAawBrQGuAa8BsAGxAbIBswG0AbUBtgG3AcsBygG4AckBuQHIAboBuwG8Ab0BvgG/AcABwQHCAcMBxAHFAcYBANwBC0EAIRAMxgELQQ4hEAzFAQtBDSEQDMQBC0EPIRAMwwELQRAhEAzCAQtBEyEQDMEBC0EUIRAMwAELQRUhEAy/AQtBFiEQDL4BC0EXIRAMvQELQRghEAy8AQtBGSEQDLsBC0EaIRAMugELQRshEAy5AQtBHCEQDLgBC0EIIRAMtwELQR0hEAy2AQtBICEQDLUBC0EfIRAMtAELQQchEAyzAQtBISEQDLIBC0EiIRAMsQELQR4hEAywAQtBIyEQDK8BC0ESIRAMrgELQREhEAytAQtBJCEQDKwBC0ElIRAMqwELQSYhEAyqAQtBJyEQDKkBC0HDASEQDKgBC0EpIRAMpwELQSshEAymAQtBLCEQDKUBC0EtIRAMpAELQS4hEAyjAQtBLyEQDKIBC0HEASEQDKEBC0EwIRAMoAELQTQhEAyfAQtBDCEQDJ4BC0ExIRAMnQELQTIhEAycAQtBMyEQDJsBC0E5IRAMmgELQTUhEAyZAQtBxQEhEAyYAQtBCyEQDJcBC0E6IRAMlgELQTYhEAyVAQtBCiEQDJQBC0E3IRAMkwELQTghEAySAQtBPCEQDJEBC0E7IRAMkAELQT0hEAyPAQtBCSEQDI4BC0EoIRAMjQELQT4hEAyMAQtBPyEQDIsBC0HAACEQDIoBC0HBACEQDIkBC0HCACEQDIgBC0HDACEQDIcBC0HEACEQDIYBC0HFACEQDIUBC0HGACEQDIQBC0EqIRAMgwELQccAIRAMggELQcgAIRAMgQELQckAIRAMgAELQcoAIRAMfwtBywAhEAx+C0HNACEQDH0LQcwAIRAMfAtBzgAhEAx7C0HPACEQDHoLQdAAIRAMeQtB0QAhEAx4C0HSACEQDHcLQdMAIRAMdgtB1AAhEAx1C0HWACEQDHQLQdUAIRAMcwtBBiEQDHILQdcAIRAMcQtBBSEQDHALQdgAIRAMbwtBBCEQDG4LQdkAIRAMbQtB2gAhEAxsC0HbACEQDGsLQdwAIRAMagtBAyEQDGkLQd0AIRAMaAtB3gAhEAxnC0HfACEQDGYLQeEAIRAMZQtB4AAhEAxkC0HiACEQDGMLQeMAIRAMYgtBAiEQDGELQeQAIRAMYAtB5QAhEAxfC0HmACEQDF4LQecAIRAMXQtB6AAhEAxcC0HpACEQDFsLQeoAIRAMWgtB6wAhEAxZC0HsACEQDFgLQe0AIRAMVwtB7gAhEAxWC0HvACEQDFULQfAAIRAMVAtB8QAhEAxTC0HyACEQDFILQfMAIRAMUQtB9AAhEAxQC0H1ACEQDE8LQfYAIRAMTgtB9wAhEAxNC0H4ACEQDEwLQfkAIRAMSwtB+gAhEAxKC0H7ACEQDEkLQfwAIRAMSAtB/QAhEAxHC0H+ACEQDEYLQf8AIRAMRQtBgAEhEAxEC0GBASEQDEMLQYIBIRAMQgtBgwEhEAxBC0GEASEQDEALQYUBIRAMPwtBhgEhEAw+C0GHASEQDD0LQYgBIRAMPAtBiQEhEAw7C0GKASEQDDoLQYsBIRAMOQtBjAEhEAw4C0GNASEQDDcLQY4BIRAMNgtBjwEhEAw1C0GQASEQDDQLQZEBIRAMMwtBkgEhEAwyC0GTASEQDDELQZQBIRAMMAtBlQEhEAwvC0GWASEQDC4LQZcBIRAMLQtBmAEhEAwsC0GZASEQDCsLQZoBIRAMKgtBmwEhEAwpC0GcASEQDCgLQZ0BIRAMJwtBngEhEAwmC0GfASEQDCULQaABIRAMJAtBoQEhEAwjC0GiASEQDCILQaMBIRAMIQtBpAEhEAwgC0GlASEQDB8LQaYBIRAMHgtBpwEhEAwdC0GoASEQDBwLQakBIRAMGwtBqgEhEAwaC0GrASEQDBkLQawBIRAMGAtBrQEhEAwXC0GuASEQDBYLQQEhEAwVC0GvASEQDBQLQbABIRAMEwtBsQEhEAwSC0GzASEQDBELQbIBIRAMEAtBtAEhEAwPC0G1ASEQDA4LQbYBIRAMDQtBtwEhEAwMC0G4ASEQDAsLQbkBIRAMCgtBugEhEAwJC0G7ASEQDAgLQcYBIRAMBwtBvAEhEAwGC0G9ASEQDAULQb4BIRAMBAtBvwEhEAwDC0HAASEQDAILQcIBIRAMAQtBwQEhEAsDQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIBAOxwEAAQIDBAUGBwgJCgsMDQ4PEBESExQVFhcYGRobHB4fICEjJSg/QEFERUZHSElKS0xNT1BRUlPeA1dZW1xdYGJlZmdoaWprbG1vcHFyc3R1dnd4eXp7fH1+gAGCAYUBhgGHAYkBiwGMAY0BjgGPAZABkQGUAZUBlgGXAZgBmQGaAZsBnAGdAZ4BnwGgAaEBogGjAaQBpQGmAacBqAGpAaoBqwGsAa0BrgGvAbABsQGyAbMBtAG1AbYBtwG4AbkBugG7AbwBvQG+Ab8BwAHBAcIBwwHEAcUBxgHHAcgByQHKAcsBzAHNAc4BzwHQAdEB0gHTAdQB1QHWAdcB2AHZAdoB2wHcAd0B3gHgAeEB4gHjAeQB5QHmAecB6AHpAeoB6wHsAe0B7gHvAfAB8QHyAfMBmQKkArAC/gL+AgsgASIEIAJHDfMBQd0BIRAM/wMLIAEiECACRw3dAUHDASEQDP4DCyABIgEgAkcNkAFB9wAhEAz9AwsgASIBIAJHDYYBQe8AIRAM/AMLIAEiASACRw1/QeoAIRAM+wMLIAEiASACRw17QegAIRAM+gMLIAEiASACRw14QeYAIRAM+QMLIAEiASACRw0aQRghEAz4AwsgASIBIAJHDRRBEiEQDPcDCyABIgEgAkcNWUHFACEQDPYDCyABIgEgAkcNSkE/IRAM9QMLIAEiASACRw1IQTwhEAz0AwsgASIBIAJHDUFBMSEQDPMDCyAALQAuQQFGDesDDIcCCyAAIAEiASACEMCAgIAAQQFHDeYBIABCADcDIAznAQsgACABIgEgAhC0gICAACIQDecBIAEhAQz1AgsCQCABIgEgAkcNAEEGIRAM8AMLIAAgAUEBaiIBIAIQu4CAgAAiEA3oASABIQEMMQsgAEIANwMgQRIhEAzVAwsgASIQIAJHDStBHSEQDO0DCwJAIAEiASACRg0AIAFBAWohAUEQIRAM1AMLQQchEAzsAwsgAEIAIAApAyAiESACIAEiEGutIhJ9IhMgEyARVhs3AyAgESASViIURQ3lAUEIIRAM6wMLAkAgASIBIAJGDQAgAEGJgICAADYCCCAAIAE2AgQgASEBQRQhEAzSAwtBCSEQDOoDCyABIQEgACkDIFAN5AEgASEBDPICCwJAIAEiASACRw0AQQshEAzpAwsgACABQQFqIgEgAhC2gICAACIQDeUBIAEhAQzyAgsgACABIgEgAhC4gICAACIQDeUBIAEhAQzyAgsgACABIgEgAhC4gICAACIQDeYBIAEhAQwNCyAAIAEiASACELqAgIAAIhAN5wEgASEBDPACCwJAIAEiASACRw0AQQ8hEAzlAwsgAS0AACIQQTtGDQggEEENRw3oASABQQFqIQEM7wILIAAgASIBIAIQuoCAgAAiEA3oASABIQEM8gILA0ACQCABLQAAQfC1gIAAai0AACIQQQFGDQAgEEECRw3rASAAKAIEIRAgAEEANgIEIAAgECABQQFqIgEQuYCAgAAiEA3qASABIQEM9AILIAFBAWoiASACRw0AC0ESIRAM4gMLIAAgASIBIAIQuoCAgAAiEA3pASABIQEMCgsgASIBIAJHDQZBGyEQDOADCwJAIAEiASACRw0AQRYhEAzgAwsgAEGKgICAADYCCCAAIAE2AgQgACABIAIQuICAgAAiEA3qASABIQFBICEQDMYDCwJAIAEiASACRg0AA0ACQCABLQAAQfC3gIAAai0AACIQQQJGDQACQCAQQX9qDgTlAewBAOsB7AELIAFBAWohAUEIIRAMyAMLIAFBAWoiASACRw0AC0EVIRAM3wMLQRUhEAzeAwsDQAJAIAEtAABB8LmAgABqLQAAIhBBAkYNACAQQX9qDgTeAewB4AHrAewBCyABQQFqIgEgAkcNAAtBGCEQDN0DCwJAIAEiASACRg0AIABBi4CAgAA2AgggACABNgIEIAEhAUEHIRAMxAMLQRkhEAzcAwsgAUEBaiEBDAILAkAgASIUIAJHDQBBGiEQDNsDCyAUIQECQCAULQAAQXNqDhTdAu4C7gLuAu4C7gLuAu4C7gLuAu4C7gLuAu4C7gLuAu4C7gLuAgDuAgtBACEQIABBADYCHCAAQa+LgIAANgIQIABBAjYCDCAAIBRBAWo2AhQM2gMLAkAgAS0AACIQQTtGDQAgEEENRw3oASABQQFqIQEM5QILIAFBAWohAQtBIiEQDL8DCwJAIAEiECACRw0AQRwhEAzYAwtCACERIBAhASAQLQAAQVBqDjfnAeYBAQIDBAUGBwgAAAAAAAAACQoLDA0OAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPEBESExQAC0EeIRAMvQMLQgIhEQzlAQtCAyERDOQBC0IEIREM4wELQgUhEQziAQtCBiERDOEBC0IHIREM4AELQgghEQzfAQtCCSERDN4BC0IKIREM3QELQgshEQzcAQtCDCERDNsBC0INIREM2gELQg4hEQzZAQtCDyERDNgBC0IKIREM1wELQgshEQzWAQtCDCERDNUBC0INIREM1AELQg4hEQzTAQtCDyERDNIBC0IAIRECQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAIBAtAABBUGoON+UB5AEAAQIDBAUGB+YB5gHmAeYB5gHmAeYBCAkKCwwN5gHmAeYB5gHmAeYB5gHmAeYB5gHmAeYB5gHmAeYB5gHmAeYB5gHmAeYB5gHmAeYB5gHmAQ4PEBESE+YBC0ICIREM5AELQgMhEQzjAQtCBCERDOIBC0IFIREM4QELQgYhEQzgAQtCByERDN8BC0IIIREM3gELQgkhEQzdAQtCCiERDNwBC0ILIREM2wELQgwhEQzaAQtCDSERDNkBC0IOIREM2AELQg8hEQzXAQtCCiERDNYBC0ILIREM1QELQgwhEQzUAQtCDSERDNMBC0IOIREM0gELQg8hEQzRAQsgAEIAIAApAyAiESACIAEiEGutIhJ9IhMgEyARVhs3AyAgESASViIURQ3SAUEfIRAMwAMLAkAgASIBIAJGDQAgAEGJgICAADYCCCAAIAE2AgQgASEBQSQhEAynAwtBICEQDL8DCyAAIAEiECACEL6AgIAAQX9qDgW2AQDFAgHRAdIBC0ERIRAMpAMLIABBAToALyAQIQEMuwMLIAEiASACRw3SAUEkIRAMuwMLIAEiDSACRw0eQcYAIRAMugMLIAAgASIBIAIQsoCAgAAiEA3UASABIQEMtQELIAEiECACRw0mQdAAIRAMuAMLAkAgASIBIAJHDQBBKCEQDLgDCyAAQQA2AgQgAEGMgICAADYCCCAAIAEgARCxgICAACIQDdMBIAEhAQzYAQsCQCABIhAgAkcNAEEpIRAMtwMLIBAtAAAiAUEgRg0UIAFBCUcN0wEgEEEBaiEBDBULAkAgASIBIAJGDQAgAUEBaiEBDBcLQSohEAy1AwsCQCABIhAgAkcNAEErIRAMtQMLAkAgEC0AACIBQQlGDQAgAUEgRw3VAQsgAC0ALEEIRg3TASAQIQEMkQMLAkAgASIBIAJHDQBBLCEQDLQDCyABLQAAQQpHDdUBIAFBAWohAQzJAgsgASIOIAJHDdUBQS8hEAyyAwsDQAJAIAEtAAAiEEEgRg0AAkAgEEF2ag4EANwB3AEA2gELIAEhAQzgAQsgAUEBaiIBIAJHDQALQTEhEAyxAwtBMiEQIAEiFCACRg2wAyACIBRrIAAoAgAiAWohFSAUIAFrQQNqIRYCQANAIBQtAAAiF0EgciAXIBdBv39qQf8BcUEaSRtB/wFxIAFB8LuAgABqLQAARw0BAkAgAUEDRw0AQQYhAQyWAwsgAUEBaiEBIBRBAWoiFCACRw0ACyAAIBU2AgAMsQMLIABBADYCACAUIQEM2QELQTMhECABIhQgAkYNrwMgAiAUayAAKAIAIgFqIRUgFCABa0EIaiEWAkADQCAULQAAIhdBIHIgFyAXQb9/akH/AXFBGkkbQf8BcSABQfS7gIAAai0AAEcNAQJAIAFBCEcNAEEFIQEMlQMLIAFBAWohASAUQQFqIhQgAkcNAAsgACAVNgIADLADCyAAQQA2AgAgFCEBDNgBC0E0IRAgASIUIAJGDa4DIAIgFGsgACgCACIBaiEVIBQgAWtBBWohFgJAA0AgFC0AACIXQSByIBcgF0G/f2pB/wFxQRpJG0H/AXEgAUHQwoCAAGotAABHDQECQCABQQVHDQBBByEBDJQDCyABQQFqIQEgFEEBaiIUIAJHDQALIAAgFTYCAAyvAwsgAEEANgIAIBQhAQzXAQsCQCABIgEgAkYNAANAAkAgAS0AAEGAvoCAAGotAAAiEEEBRg0AIBBBAkYNCiABIQEM3QELIAFBAWoiASACRw0AC0EwIRAMrgMLQTAhEAytAwsCQCABIgEgAkYNAANAAkAgAS0AACIQQSBGDQAgEEF2ag4E2QHaAdoB2QHaAQsgAUEBaiIBIAJHDQALQTghEAytAwtBOCEQDKwDCwNAAkAgAS0AACIQQSBGDQAgEEEJRw0DCyABQQFqIgEgAkcNAAtBPCEQDKsDCwNAAkAgAS0AACIQQSBGDQACQAJAIBBBdmoOBNoBAQHaAQALIBBBLEYN2wELIAEhAQwECyABQQFqIgEgAkcNAAtBPyEQDKoDCyABIQEM2wELQcAAIRAgASIUIAJGDagDIAIgFGsgACgCACIBaiEWIBQgAWtBBmohFwJAA0AgFC0AAEEgciABQYDAgIAAai0AAEcNASABQQZGDY4DIAFBAWohASAUQQFqIhQgAkcNAAsgACAWNgIADKkDCyAAQQA2AgAgFCEBC0E2IRAMjgMLAkAgASIPIAJHDQBBwQAhEAynAwsgAEGMgICAADYCCCAAIA82AgQgDyEBIAAtACxBf2oOBM0B1QHXAdkBhwMLIAFBAWohAQzMAQsCQCABIgEgAkYNAANAAkAgAS0AACIQQSByIBAgEEG/f2pB/wFxQRpJG0H/AXEiEEEJRg0AIBBBIEYNAAJAAkACQAJAIBBBnX9qDhMAAwMDAwMDAwEDAwMDAwMDAwMCAwsgAUEBaiEBQTEhEAyRAwsgAUEBaiEBQTIhEAyQAwsgAUEBaiEBQTMhEAyPAwsgASEBDNABCyABQQFqIgEgAkcNAAtBNSEQDKUDC0E1IRAMpAMLAkAgASIBIAJGDQADQAJAIAEtAABBgLyAgABqLQAAQQFGDQAgASEBDNMBCyABQQFqIgEgAkcNAAtBPSEQDKQDC0E9IRAMowMLIAAgASIBIAIQsICAgAAiEA3WASABIQEMAQsgEEEBaiEBC0E8IRAMhwMLAkAgASIBIAJHDQBBwgAhEAygAwsCQANAAkAgAS0AAEF3ag4YAAL+Av4ChAP+Av4C/gL+Av4C/gL+Av4C/gL+Av4C/gL+Av4C/gL+Av4C/gIA/gILIAFBAWoiASACRw0AC0HCACEQDKADCyABQQFqIQEgAC0ALUEBcUUNvQEgASEBC0EsIRAMhQMLIAEiASACRw3TAUHEACEQDJ0DCwNAAkAgAS0AAEGQwICAAGotAABBAUYNACABIQEMtwILIAFBAWoiASACRw0AC0HFACEQDJwDCyANLQAAIhBBIEYNswEgEEE6Rw2BAyAAKAIEIQEgAEEANgIEIAAgASANEK+AgIAAIgEN0AEgDUEBaiEBDLMCC0HHACEQIAEiDSACRg2aAyACIA1rIAAoAgAiAWohFiANIAFrQQVqIRcDQCANLQAAIhRBIHIgFCAUQb9/akH/AXFBGkkbQf8BcSABQZDCgIAAai0AAEcNgAMgAUEFRg30AiABQQFqIQEgDUEBaiINIAJHDQALIAAgFjYCAAyaAwtByAAhECABIg0gAkYNmQMgAiANayAAKAIAIgFqIRYgDSABa0EJaiEXA0AgDS0AACIUQSByIBQgFEG/f2pB/wFxQRpJG0H/AXEgAUGWwoCAAGotAABHDf8CAkAgAUEJRw0AQQIhAQz1AgsgAUEBaiEBIA1BAWoiDSACRw0ACyAAIBY2AgAMmQMLAkAgASINIAJHDQBByQAhEAyZAwsCQAJAIA0tAAAiAUEgciABIAFBv39qQf8BcUEaSRtB/wFxQZJ/ag4HAIADgAOAA4ADgAMBgAMLIA1BAWohAUE+IRAMgAMLIA1BAWohAUE/IRAM/wILQcoAIRAgASINIAJGDZcDIAIgDWsgACgCACIBaiEWIA0gAWtBAWohFwNAIA0tAAAiFEEgciAUIBRBv39qQf8BcUEaSRtB/wFxIAFBoMKAgABqLQAARw39AiABQQFGDfACIAFBAWohASANQQFqIg0gAkcNAAsgACAWNgIADJcDC0HLACEQIAEiDSACRg2WAyACIA1rIAAoAgAiAWohFiANIAFrQQ5qIRcDQCANLQAAIhRBIHIgFCAUQb9/akH/AXFBGkkbQf8BcSABQaLCgIAAai0AAEcN/AIgAUEORg3wAiABQQFqIQEgDUEBaiINIAJHDQALIAAgFjYCAAyWAwtBzAAhECABIg0gAkYNlQMgAiANayAAKAIAIgFqIRYgDSABa0EPaiEXA0AgDS0AACIUQSByIBQgFEG/f2pB/wFxQRpJG0H/AXEgAUHAwoCAAGotAABHDfsCAkAgAUEPRw0AQQMhAQzxAgsgAUEBaiEBIA1BAWoiDSACRw0ACyAAIBY2AgAMlQMLQc0AIRAgASINIAJGDZQDIAIgDWsgACgCACIBaiEWIA0gAWtBBWohFwNAIA0tAAAiFEEgciAUIBRBv39qQf8BcUEaSRtB/wFxIAFB0MKAgABqLQAARw36AgJAIAFBBUcNAEEEIQEM8AILIAFBAWohASANQQFqIg0gAkcNAAsgACAWNgIADJQDCwJAIAEiDSACRw0AQc4AIRAMlAMLAkACQAJAAkAgDS0AACIBQSByIAEgAUG/f2pB/wFxQRpJG0H/AXFBnX9qDhMA/QL9Av0C/QL9Av0C/QL9Av0C/QL9Av0CAf0C/QL9AgID/QILIA1BAWohAUHBACEQDP0CCyANQQFqIQFBwgAhEAz8AgsgDUEBaiEBQcMAIRAM+wILIA1BAWohAUHEACEQDPoCCwJAIAEiASACRg0AIABBjYCAgAA2AgggACABNgIEIAEhAUHFACEQDPoCC0HPACEQDJIDCyAQIQECQAJAIBAtAABBdmoOBAGoAqgCAKgCCyAQQQFqIQELQSchEAz4AgsCQCABIgEgAkcNAEHRACEQDJEDCwJAIAEtAABBIEYNACABIQEMjQELIAFBAWohASAALQAtQQFxRQ3HASABIQEMjAELIAEiFyACRw3IAUHSACEQDI8DC0HTACEQIAEiFCACRg2OAyACIBRrIAAoAgAiAWohFiAUIAFrQQFqIRcDQCAULQAAIAFB1sKAgABqLQAARw3MASABQQFGDccBIAFBAWohASAUQQFqIhQgAkcNAAsgACAWNgIADI4DCwJAIAEiASACRw0AQdUAIRAMjgMLIAEtAABBCkcNzAEgAUEBaiEBDMcBCwJAIAEiASACRw0AQdYAIRAMjQMLAkACQCABLQAAQXZqDgQAzQHNAQHNAQsgAUEBaiEBDMcBCyABQQFqIQFBygAhEAzzAgsgACABIgEgAhCugICAACIQDcsBIAEhAUHNACEQDPICCyAALQApQSJGDYUDDKYCCwJAIAEiASACRw0AQdsAIRAMigMLQQAhFEEBIRdBASEWQQAhEAJAAkACQAJAAkACQAJAAkACQCABLQAAQVBqDgrUAdMBAAECAwQFBgjVAQtBAiEQDAYLQQMhEAwFC0EEIRAMBAtBBSEQDAMLQQYhEAwCC0EHIRAMAQtBCCEQC0EAIRdBACEWQQAhFAzMAQtBCSEQQQEhFEEAIRdBACEWDMsBCwJAIAEiASACRw0AQd0AIRAMiQMLIAEtAABBLkcNzAEgAUEBaiEBDKYCCyABIgEgAkcNzAFB3wAhEAyHAwsCQCABIgEgAkYNACAAQY6AgIAANgIIIAAgATYCBCABIQFB0AAhEAzuAgtB4AAhEAyGAwtB4QAhECABIgEgAkYNhQMgAiABayAAKAIAIhRqIRYgASAUa0EDaiEXA0AgAS0AACAUQeLCgIAAai0AAEcNzQEgFEEDRg3MASAUQQFqIRQgAUEBaiIBIAJHDQALIAAgFjYCAAyFAwtB4gAhECABIgEgAkYNhAMgAiABayAAKAIAIhRqIRYgASAUa0ECaiEXA0AgAS0AACAUQebCgIAAai0AAEcNzAEgFEECRg3OASAUQQFqIRQgAUEBaiIBIAJHDQALIAAgFjYCAAyEAwtB4wAhECABIgEgAkYNgwMgAiABayAAKAIAIhRqIRYgASAUa0EDaiEXA0AgAS0AACAUQenCgIAAai0AAEcNywEgFEEDRg3OASAUQQFqIRQgAUEBaiIBIAJHDQALIAAgFjYCAAyDAwsCQCABIgEgAkcNAEHlACEQDIMDCyAAIAFBAWoiASACEKiAgIAAIhANzQEgASEBQdYAIRAM6QILAkAgASIBIAJGDQADQAJAIAEtAAAiEEEgRg0AAkACQAJAIBBBuH9qDgsAAc8BzwHPAc8BzwHPAc8BzwECzwELIAFBAWohAUHSACEQDO0CCyABQQFqIQFB0wAhEAzsAgsgAUEBaiEBQdQAIRAM6wILIAFBAWoiASACRw0AC0HkACEQDIIDC0HkACEQDIEDCwNAAkAgAS0AAEHwwoCAAGotAAAiEEEBRg0AIBBBfmoOA88B0AHRAdIBCyABQQFqIgEgAkcNAAtB5gAhEAyAAwsCQCABIgEgAkYNACABQQFqIQEMAwtB5wAhEAz/AgsDQAJAIAEtAABB8MSAgABqLQAAIhBBAUYNAAJAIBBBfmoOBNIB0wHUAQDVAQsgASEBQdcAIRAM5wILIAFBAWoiASACRw0AC0HoACEQDP4CCwJAIAEiASACRw0AQekAIRAM/gILAkAgAS0AACIQQXZqDhq6AdUB1QG8AdUB1QHVAdUB1QHVAdUB1QHVAdUB1QHVAdUB1QHVAdUB1QHVAcoB1QHVAQDTAQsgAUEBaiEBC0EGIRAM4wILA0ACQCABLQAAQfDGgIAAai0AAEEBRg0AIAEhAQyeAgsgAUEBaiIBIAJHDQALQeoAIRAM+wILAkAgASIBIAJGDQAgAUEBaiEBDAMLQesAIRAM+gILAkAgASIBIAJHDQBB7AAhEAz6AgsgAUEBaiEBDAELAkAgASIBIAJHDQBB7QAhEAz5AgsgAUEBaiEBC0EEIRAM3gILAkAgASIUIAJHDQBB7gAhEAz3AgsgFCEBAkACQAJAIBQtAABB8MiAgABqLQAAQX9qDgfUAdUB1gEAnAIBAtcBCyAUQQFqIQEMCgsgFEEBaiEBDM0BC0EAIRAgAEEANgIcIABBm5KAgAA2AhAgAEEHNgIMIAAgFEEBajYCFAz2AgsCQANAAkAgAS0AAEHwyICAAGotAAAiEEEERg0AAkACQCAQQX9qDgfSAdMB1AHZAQAEAdkBCyABIQFB2gAhEAzgAgsgAUEBaiEBQdwAIRAM3wILIAFBAWoiASACRw0AC0HvACEQDPYCCyABQQFqIQEMywELAkAgASIUIAJHDQBB8AAhEAz1AgsgFC0AAEEvRw3UASAUQQFqIQEMBgsCQCABIhQgAkcNAEHxACEQDPQCCwJAIBQtAAAiAUEvRw0AIBRBAWohAUHdACEQDNsCCyABQXZqIgRBFksN0wFBASAEdEGJgIACcUUN0wEMygILAkAgASIBIAJGDQAgAUEBaiEBQd4AIRAM2gILQfIAIRAM8gILAkAgASIUIAJHDQBB9AAhEAzyAgsgFCEBAkAgFC0AAEHwzICAAGotAABBf2oOA8kClAIA1AELQeEAIRAM2AILAkAgASIUIAJGDQADQAJAIBQtAABB8MqAgABqLQAAIgFBA0YNAAJAIAFBf2oOAssCANUBCyAUIQFB3wAhEAzaAgsgFEEBaiIUIAJHDQALQfMAIRAM8QILQfMAIRAM8AILAkAgASIBIAJGDQAgAEGPgICAADYCCCAAIAE2AgQgASEBQeAAIRAM1wILQfUAIRAM7wILAkAgASIBIAJHDQBB9gAhEAzvAgsgAEGPgICAADYCCCAAIAE2AgQgASEBC0EDIRAM1AILA0AgAS0AAEEgRw3DAiABQQFqIgEgAkcNAAtB9wAhEAzsAgsCQCABIgEgAkcNAEH4ACEQDOwCCyABLQAAQSBHDc4BIAFBAWohAQzvAQsgACABIgEgAhCsgICAACIQDc4BIAEhAQyOAgsCQCABIgQgAkcNAEH6ACEQDOoCCyAELQAAQcwARw3RASAEQQFqIQFBEyEQDM8BCwJAIAEiBCACRw0AQfsAIRAM6QILIAIgBGsgACgCACIBaiEUIAQgAWtBBWohEANAIAQtAAAgAUHwzoCAAGotAABHDdABIAFBBUYNzgEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBB+wAhEAzoAgsCQCABIgQgAkcNAEH8ACEQDOgCCwJAAkAgBC0AAEG9f2oODADRAdEB0QHRAdEB0QHRAdEB0QHRAQHRAQsgBEEBaiEBQeYAIRAMzwILIARBAWohAUHnACEQDM4CCwJAIAEiBCACRw0AQf0AIRAM5wILIAIgBGsgACgCACIBaiEUIAQgAWtBAmohEAJAA0AgBC0AACABQe3PgIAAai0AAEcNzwEgAUECRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQf0AIRAM5wILIABBADYCACAQQQFqIQFBECEQDMwBCwJAIAEiBCACRw0AQf4AIRAM5gILIAIgBGsgACgCACIBaiEUIAQgAWtBBWohEAJAA0AgBC0AACABQfbOgIAAai0AAEcNzgEgAUEFRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQf4AIRAM5gILIABBADYCACAQQQFqIQFBFiEQDMsBCwJAIAEiBCACRw0AQf8AIRAM5QILIAIgBGsgACgCACIBaiEUIAQgAWtBA2ohEAJAA0AgBC0AACABQfzOgIAAai0AAEcNzQEgAUEDRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQf8AIRAM5QILIABBADYCACAQQQFqIQFBBSEQDMoBCwJAIAEiBCACRw0AQYABIRAM5AILIAQtAABB2QBHDcsBIARBAWohAUEIIRAMyQELAkAgASIEIAJHDQBBgQEhEAzjAgsCQAJAIAQtAABBsn9qDgMAzAEBzAELIARBAWohAUHrACEQDMoCCyAEQQFqIQFB7AAhEAzJAgsCQCABIgQgAkcNAEGCASEQDOICCwJAAkAgBC0AAEG4f2oOCADLAcsBywHLAcsBywEBywELIARBAWohAUHqACEQDMkCCyAEQQFqIQFB7QAhEAzIAgsCQCABIgQgAkcNAEGDASEQDOECCyACIARrIAAoAgAiAWohECAEIAFrQQJqIRQCQANAIAQtAAAgAUGAz4CAAGotAABHDckBIAFBAkYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgEDYCAEGDASEQDOECC0EAIRAgAEEANgIAIBRBAWohAQzGAQsCQCABIgQgAkcNAEGEASEQDOACCyACIARrIAAoAgAiAWohFCAEIAFrQQRqIRACQANAIAQtAAAgAUGDz4CAAGotAABHDcgBIAFBBEYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEGEASEQDOACCyAAQQA2AgAgEEEBaiEBQSMhEAzFAQsCQCABIgQgAkcNAEGFASEQDN8CCwJAAkAgBC0AAEG0f2oOCADIAcgByAHIAcgByAEByAELIARBAWohAUHvACEQDMYCCyAEQQFqIQFB8AAhEAzFAgsCQCABIgQgAkcNAEGGASEQDN4CCyAELQAAQcUARw3FASAEQQFqIQEMgwILAkAgASIEIAJHDQBBhwEhEAzdAgsgAiAEayAAKAIAIgFqIRQgBCABa0EDaiEQAkADQCAELQAAIAFBiM+AgABqLQAARw3FASABQQNGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBBhwEhEAzdAgsgAEEANgIAIBBBAWohAUEtIRAMwgELAkAgASIEIAJHDQBBiAEhEAzcAgsgAiAEayAAKAIAIgFqIRQgBCABa0EIaiEQAkADQCAELQAAIAFB0M+AgABqLQAARw3EASABQQhGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBBiAEhEAzcAgsgAEEANgIAIBBBAWohAUEpIRAMwQELAkAgASIBIAJHDQBBiQEhEAzbAgtBASEQIAEtAABB3wBHDcABIAFBAWohAQyBAgsCQCABIgQgAkcNAEGKASEQDNoCCyACIARrIAAoAgAiAWohFCAEIAFrQQFqIRADQCAELQAAIAFBjM+AgABqLQAARw3BASABQQFGDa8CIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQYoBIRAM2QILAkAgASIEIAJHDQBBiwEhEAzZAgsgAiAEayAAKAIAIgFqIRQgBCABa0ECaiEQAkADQCAELQAAIAFBjs+AgABqLQAARw3BASABQQJGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBBiwEhEAzZAgsgAEEANgIAIBBBAWohAUECIRAMvgELAkAgASIEIAJHDQBBjAEhEAzYAgsgAiAEayAAKAIAIgFqIRQgBCABa0EBaiEQAkADQCAELQAAIAFB8M+AgABqLQAARw3AASABQQFGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBBjAEhEAzYAgsgAEEANgIAIBBBAWohAUEfIRAMvQELAkAgASIEIAJHDQBBjQEhEAzXAgsgAiAEayAAKAIAIgFqIRQgBCABa0EBaiEQAkADQCAELQAAIAFB8s+AgABqLQAARw2/ASABQQFGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBBjQEhEAzXAgsgAEEANgIAIBBBAWohAUEJIRAMvAELAkAgASIEIAJHDQBBjgEhEAzWAgsCQAJAIAQtAABBt39qDgcAvwG/Ab8BvwG/AQG/AQsgBEEBaiEBQfgAIRAMvQILIARBAWohAUH5ACEQDLwCCwJAIAEiBCACRw0AQY8BIRAM1QILIAIgBGsgACgCACIBaiEUIAQgAWtBBWohEAJAA0AgBC0AACABQZHPgIAAai0AAEcNvQEgAUEFRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQY8BIRAM1QILIABBADYCACAQQQFqIQFBGCEQDLoBCwJAIAEiBCACRw0AQZABIRAM1AILIAIgBGsgACgCACIBaiEUIAQgAWtBAmohEAJAA0AgBC0AACABQZfPgIAAai0AAEcNvAEgAUECRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQZABIRAM1AILIABBADYCACAQQQFqIQFBFyEQDLkBCwJAIAEiBCACRw0AQZEBIRAM0wILIAIgBGsgACgCACIBaiEUIAQgAWtBBmohEAJAA0AgBC0AACABQZrPgIAAai0AAEcNuwEgAUEGRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQZEBIRAM0wILIABBADYCACAQQQFqIQFBFSEQDLgBCwJAIAEiBCACRw0AQZIBIRAM0gILIAIgBGsgACgCACIBaiEUIAQgAWtBBWohEAJAA0AgBC0AACABQaHPgIAAai0AAEcNugEgAUEFRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQZIBIRAM0gILIABBADYCACAQQQFqIQFBHiEQDLcBCwJAIAEiBCACRw0AQZMBIRAM0QILIAQtAABBzABHDbgBIARBAWohAUEKIRAMtgELAkAgBCACRw0AQZQBIRAM0AILAkACQCAELQAAQb9/ag4PALkBuQG5AbkBuQG5AbkBuQG5AbkBuQG5AbkBAbkBCyAEQQFqIQFB/gAhEAy3AgsgBEEBaiEBQf8AIRAMtgILAkAgBCACRw0AQZUBIRAMzwILAkACQCAELQAAQb9/ag4DALgBAbgBCyAEQQFqIQFB/QAhEAy2AgsgBEEBaiEEQYABIRAMtQILAkAgBCACRw0AQZYBIRAMzgILIAIgBGsgACgCACIBaiEUIAQgAWtBAWohEAJAA0AgBC0AACABQafPgIAAai0AAEcNtgEgAUEBRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQZYBIRAMzgILIABBADYCACAQQQFqIQFBCyEQDLMBCwJAIAQgAkcNAEGXASEQDM0CCwJAAkACQAJAIAQtAABBU2oOIwC4AbgBuAG4AbgBuAG4AbgBuAG4AbgBuAG4AbgBuAG4AbgBuAG4AbgBuAG4AbgBAbgBuAG4AbgBuAECuAG4AbgBA7gBCyAEQQFqIQFB+wAhEAy2AgsgBEEBaiEBQfwAIRAMtQILIARBAWohBEGBASEQDLQCCyAEQQFqIQRBggEhEAyzAgsCQCAEIAJHDQBBmAEhEAzMAgsgAiAEayAAKAIAIgFqIRQgBCABa0EEaiEQAkADQCAELQAAIAFBqc+AgABqLQAARw20ASABQQRGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBBmAEhEAzMAgsgAEEANgIAIBBBAWohAUEZIRAMsQELAkAgBCACRw0AQZkBIRAMywILIAIgBGsgACgCACIBaiEUIAQgAWtBBWohEAJAA0AgBC0AACABQa7PgIAAai0AAEcNswEgAUEFRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQZkBIRAMywILIABBADYCACAQQQFqIQFBBiEQDLABCwJAIAQgAkcNAEGaASEQDMoCCyACIARrIAAoAgAiAWohFCAEIAFrQQFqIRACQANAIAQtAAAgAUG0z4CAAGotAABHDbIBIAFBAUYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEGaASEQDMoCCyAAQQA2AgAgEEEBaiEBQRwhEAyvAQsCQCAEIAJHDQBBmwEhEAzJAgsgAiAEayAAKAIAIgFqIRQgBCABa0EBaiEQAkADQCAELQAAIAFBts+AgABqLQAARw2xASABQQFGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBBmwEhEAzJAgsgAEEANgIAIBBBAWohAUEnIRAMrgELAkAgBCACRw0AQZwBIRAMyAILAkACQCAELQAAQax/ag4CAAGxAQsgBEEBaiEEQYYBIRAMrwILIARBAWohBEGHASEQDK4CCwJAIAQgAkcNAEGdASEQDMcCCyACIARrIAAoAgAiAWohFCAEIAFrQQFqIRACQANAIAQtAAAgAUG4z4CAAGotAABHDa8BIAFBAUYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEGdASEQDMcCCyAAQQA2AgAgEEEBaiEBQSYhEAysAQsCQCAEIAJHDQBBngEhEAzGAgsgAiAEayAAKAIAIgFqIRQgBCABa0EBaiEQAkADQCAELQAAIAFBus+AgABqLQAARw2uASABQQFGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBBngEhEAzGAgsgAEEANgIAIBBBAWohAUEDIRAMqwELAkAgBCACRw0AQZ8BIRAMxQILIAIgBGsgACgCACIBaiEUIAQgAWtBAmohEAJAA0AgBC0AACABQe3PgIAAai0AAEcNrQEgAUECRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQZ8BIRAMxQILIABBADYCACAQQQFqIQFBDCEQDKoBCwJAIAQgAkcNAEGgASEQDMQCCyACIARrIAAoAgAiAWohFCAEIAFrQQNqIRACQANAIAQtAAAgAUG8z4CAAGotAABHDawBIAFBA0YNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEGgASEQDMQCCyAAQQA2AgAgEEEBaiEBQQ0hEAypAQsCQCAEIAJHDQBBoQEhEAzDAgsCQAJAIAQtAABBun9qDgsArAGsAawBrAGsAawBrAGsAawBAawBCyAEQQFqIQRBiwEhEAyqAgsgBEEBaiEEQYwBIRAMqQILAkAgBCACRw0AQaIBIRAMwgILIAQtAABB0ABHDakBIARBAWohBAzpAQsCQCAEIAJHDQBBowEhEAzBAgsCQAJAIAQtAABBt39qDgcBqgGqAaoBqgGqAQCqAQsgBEEBaiEEQY4BIRAMqAILIARBAWohAUEiIRAMpgELAkAgBCACRw0AQaQBIRAMwAILIAIgBGsgACgCACIBaiEUIAQgAWtBAWohEAJAA0AgBC0AACABQcDPgIAAai0AAEcNqAEgAUEBRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQaQBIRAMwAILIABBADYCACAQQQFqIQFBHSEQDKUBCwJAIAQgAkcNAEGlASEQDL8CCwJAAkAgBC0AAEGuf2oOAwCoAQGoAQsgBEEBaiEEQZABIRAMpgILIARBAWohAUEEIRAMpAELAkAgBCACRw0AQaYBIRAMvgILAkACQAJAAkACQCAELQAAQb9/ag4VAKoBqgGqAaoBqgGqAaoBqgGqAaoBAaoBqgECqgGqAQOqAaoBBKoBCyAEQQFqIQRBiAEhEAyoAgsgBEEBaiEEQYkBIRAMpwILIARBAWohBEGKASEQDKYCCyAEQQFqIQRBjwEhEAylAgsgBEEBaiEEQZEBIRAMpAILAkAgBCACRw0AQacBIRAMvQILIAIgBGsgACgCACIBaiEUIAQgAWtBAmohEAJAA0AgBC0AACABQe3PgIAAai0AAEcNpQEgAUECRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQacBIRAMvQILIABBADYCACAQQQFqIQFBESEQDKIBCwJAIAQgAkcNAEGoASEQDLwCCyACIARrIAAoAgAiAWohFCAEIAFrQQJqIRACQANAIAQtAAAgAUHCz4CAAGotAABHDaQBIAFBAkYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEGoASEQDLwCCyAAQQA2AgAgEEEBaiEBQSwhEAyhAQsCQCAEIAJHDQBBqQEhEAy7AgsgAiAEayAAKAIAIgFqIRQgBCABa0EEaiEQAkADQCAELQAAIAFBxc+AgABqLQAARw2jASABQQRGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBBqQEhEAy7AgsgAEEANgIAIBBBAWohAUErIRAMoAELAkAgBCACRw0AQaoBIRAMugILIAIgBGsgACgCACIBaiEUIAQgAWtBAmohEAJAA0AgBC0AACABQcrPgIAAai0AAEcNogEgAUECRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQaoBIRAMugILIABBADYCACAQQQFqIQFBFCEQDJ8BCwJAIAQgAkcNAEGrASEQDLkCCwJAAkACQAJAIAQtAABBvn9qDg8AAQKkAaQBpAGkAaQBpAGkAaQBpAGkAaQBA6QBCyAEQQFqIQRBkwEhEAyiAgsgBEEBaiEEQZQBIRAMoQILIARBAWohBEGVASEQDKACCyAEQQFqIQRBlgEhEAyfAgsCQCAEIAJHDQBBrAEhEAy4AgsgBC0AAEHFAEcNnwEgBEEBaiEEDOABCwJAIAQgAkcNAEGtASEQDLcCCyACIARrIAAoAgAiAWohFCAEIAFrQQJqIRACQANAIAQtAAAgAUHNz4CAAGotAABHDZ8BIAFBAkYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEGtASEQDLcCCyAAQQA2AgAgEEEBaiEBQQ4hEAycAQsCQCAEIAJHDQBBrgEhEAy2AgsgBC0AAEHQAEcNnQEgBEEBaiEBQSUhEAybAQsCQCAEIAJHDQBBrwEhEAy1AgsgAiAEayAAKAIAIgFqIRQgBCABa0EIaiEQAkADQCAELQAAIAFB0M+AgABqLQAARw2dASABQQhGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBBrwEhEAy1AgsgAEEANgIAIBBBAWohAUEqIRAMmgELAkAgBCACRw0AQbABIRAMtAILAkACQCAELQAAQat/ag4LAJ0BnQGdAZ0BnQGdAZ0BnQGdAQGdAQsgBEEBaiEEQZoBIRAMmwILIARBAWohBEGbASEQDJoCCwJAIAQgAkcNAEGxASEQDLMCCwJAAkAgBC0AAEG/f2oOFACcAZwBnAGcAZwBnAGcAZwBnAGcAZwBnAGcAZwBnAGcAZwBnAEBnAELIARBAWohBEGZASEQDJoCCyAEQQFqIQRBnAEhEAyZAgsCQCAEIAJHDQBBsgEhEAyyAgsgAiAEayAAKAIAIgFqIRQgBCABa0EDaiEQAkADQCAELQAAIAFB2c+AgABqLQAARw2aASABQQNGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBBsgEhEAyyAgsgAEEANgIAIBBBAWohAUEhIRAMlwELAkAgBCACRw0AQbMBIRAMsQILIAIgBGsgACgCACIBaiEUIAQgAWtBBmohEAJAA0AgBC0AACABQd3PgIAAai0AAEcNmQEgAUEGRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQbMBIRAMsQILIABBADYCACAQQQFqIQFBGiEQDJYBCwJAIAQgAkcNAEG0ASEQDLACCwJAAkACQCAELQAAQbt/ag4RAJoBmgGaAZoBmgGaAZoBmgGaAQGaAZoBmgGaAZoBApoBCyAEQQFqIQRBnQEhEAyYAgsgBEEBaiEEQZ4BIRAMlwILIARBAWohBEGfASEQDJYCCwJAIAQgAkcNAEG1ASEQDK8CCyACIARrIAAoAgAiAWohFCAEIAFrQQVqIRACQANAIAQtAAAgAUHkz4CAAGotAABHDZcBIAFBBUYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEG1ASEQDK8CCyAAQQA2AgAgEEEBaiEBQSghEAyUAQsCQCAEIAJHDQBBtgEhEAyuAgsgAiAEayAAKAIAIgFqIRQgBCABa0ECaiEQAkADQCAELQAAIAFB6s+AgABqLQAARw2WASABQQJGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBBtgEhEAyuAgsgAEEANgIAIBBBAWohAUEHIRAMkwELAkAgBCACRw0AQbcBIRAMrQILAkACQCAELQAAQbt/ag4OAJYBlgGWAZYBlgGWAZYBlgGWAZYBlgGWAQGWAQsgBEEBaiEEQaEBIRAMlAILIARBAWohBEGiASEQDJMCCwJAIAQgAkcNAEG4ASEQDKwCCyACIARrIAAoAgAiAWohFCAEIAFrQQJqIRACQANAIAQtAAAgAUHtz4CAAGotAABHDZQBIAFBAkYNASABQQFqIQEgBEEBaiIEIAJHDQALIAAgFDYCAEG4ASEQDKwCCyAAQQA2AgAgEEEBaiEBQRIhEAyRAQsCQCAEIAJHDQBBuQEhEAyrAgsgAiAEayAAKAIAIgFqIRQgBCABa0EBaiEQAkADQCAELQAAIAFB8M+AgABqLQAARw2TASABQQFGDQEgAUEBaiEBIARBAWoiBCACRw0ACyAAIBQ2AgBBuQEhEAyrAgsgAEEANgIAIBBBAWohAUEgIRAMkAELAkAgBCACRw0AQboBIRAMqgILIAIgBGsgACgCACIBaiEUIAQgAWtBAWohEAJAA0AgBC0AACABQfLPgIAAai0AAEcNkgEgAUEBRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQboBIRAMqgILIABBADYCACAQQQFqIQFBDyEQDI8BCwJAIAQgAkcNAEG7ASEQDKkCCwJAAkAgBC0AAEG3f2oOBwCSAZIBkgGSAZIBAZIBCyAEQQFqIQRBpQEhEAyQAgsgBEEBaiEEQaYBIRAMjwILAkAgBCACRw0AQbwBIRAMqAILIAIgBGsgACgCACIBaiEUIAQgAWtBB2ohEAJAA0AgBC0AACABQfTPgIAAai0AAEcNkAEgAUEHRg0BIAFBAWohASAEQQFqIgQgAkcNAAsgACAUNgIAQbwBIRAMqAILIABBADYCACAQQQFqIQFBGyEQDI0BCwJAIAQgAkcNAEG9ASEQDKcCCwJAAkACQCAELQAAQb5/ag4SAJEBkQGRAZEBkQGRAZEBkQGRAQGRAZEBkQGRAZEBkQECkQELIARBAWohBEGkASEQDI8CCyAEQQFqIQRBpwEhEAyOAgsgBEEBaiEEQagBIRAMjQILAkAgBCACRw0AQb4BIRAMpgILIAQtAABBzgBHDY0BIARBAWohBAzPAQsCQCAEIAJHDQBBvwEhEAylAgsCQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCAELQAAQb9/ag4VAAECA5wBBAUGnAGcAZwBBwgJCgucAQwNDg+cAQsgBEEBaiEBQegAIRAMmgILIARBAWohAUHpACEQDJkCCyAEQQFqIQFB7gAhEAyYAgsgBEEBaiEBQfIAIRAMlwILIARBAWohAUHzACEQDJYCCyAEQQFqIQFB9gAhEAyVAgsgBEEBaiEBQfcAIRAMlAILIARBAWohAUH6ACEQDJMCCyAEQQFqIQRBgwEhEAySAgsgBEEBaiEEQYQBIRAMkQILIARBAWohBEGFASEQDJACCyAEQQFqIQRBkgEhEAyPAgsgBEEBaiEEQZgBIRAMjgILIARBAWohBEGgASEQDI0CCyAEQQFqIQRBowEhEAyMAgsgBEEBaiEEQaoBIRAMiwILAkAgBCACRg0AIABBkICAgAA2AgggACAENgIEQasBIRAMiwILQcABIRAMowILIAAgBSACEKqAgIAAIgENiwEgBSEBDFwLAkAgBiACRg0AIAZBAWohBQyNAQtBwgEhEAyhAgsDQAJAIBAtAABBdmoOBIwBAACPAQALIBBBAWoiECACRw0AC0HDASEQDKACCwJAIAcgAkYNACAAQZGAgIAANgIIIAAgBzYCBCAHIQFBASEQDIcCC0HEASEQDJ8CCwJAIAcgAkcNAEHFASEQDJ8CCwJAAkAgBy0AAEF2ag4EAc4BzgEAzgELIAdBAWohBgyNAQsgB0EBaiEFDIkBCwJAIAcgAkcNAEHGASEQDJ4CCwJAAkAgBy0AAEF2ag4XAY8BjwEBjwGPAY8BjwGPAY8BjwGPAY8BjwGPAY8BjwGPAY8BjwGPAY8BAI8BCyAHQQFqIQcLQbABIRAMhAILAkAgCCACRw0AQcgBIRAMnQILIAgtAABBIEcNjQEgAEEAOwEyIAhBAWohAUGzASEQDIMCCyABIRcCQANAIBciByACRg0BIActAABBUGpB/wFxIhBBCk8NzAECQCAALwEyIhRBmTNLDQAgACAUQQpsIhQ7ATIgEEH//wNzIBRB/v8DcUkNACAHQQFqIRcgACAUIBBqIhA7ATIgEEH//wNxQegHSQ0BCwtBACEQIABBADYCHCAAQcGJgIAANgIQIABBDTYCDCAAIAdBAWo2AhQMnAILQccBIRAMmwILIAAgCCACEK6AgIAAIhBFDcoBIBBBFUcNjAEgAEHIATYCHCAAIAg2AhQgAEHJl4CAADYCECAAQRU2AgxBACEQDJoCCwJAIAkgAkcNAEHMASEQDJoCC0EAIRRBASEXQQEhFkEAIRACQAJAAkACQAJAAkACQAJAAkAgCS0AAEFQag4KlgGVAQABAgMEBQYIlwELQQIhEAwGC0EDIRAMBQtBBCEQDAQLQQUhEAwDC0EGIRAMAgtBByEQDAELQQghEAtBACEXQQAhFkEAIRQMjgELQQkhEEEBIRRBACEXQQAhFgyNAQsCQCAKIAJHDQBBzgEhEAyZAgsgCi0AAEEuRw2OASAKQQFqIQkMygELIAsgAkcNjgFB0AEhEAyXAgsCQCALIAJGDQAgAEGOgICAADYCCCAAIAs2AgRBtwEhEAz+AQtB0QEhEAyWAgsCQCAEIAJHDQBB0gEhEAyWAgsgAiAEayAAKAIAIhBqIRQgBCAQa0EEaiELA0AgBC0AACAQQfzPgIAAai0AAEcNjgEgEEEERg3pASAQQQFqIRAgBEEBaiIEIAJHDQALIAAgFDYCAEHSASEQDJUCCyAAIAwgAhCsgICAACIBDY0BIAwhAQy4AQsCQCAEIAJHDQBB1AEhEAyUAgsgAiAEayAAKAIAIhBqIRQgBCAQa0EBaiEMA0AgBC0AACAQQYHQgIAAai0AAEcNjwEgEEEBRg2OASAQQQFqIRAgBEEBaiIEIAJHDQALIAAgFDYCAEHUASEQDJMCCwJAIAQgAkcNAEHWASEQDJMCCyACIARrIAAoAgAiEGohFCAEIBBrQQJqIQsDQCAELQAAIBBBg9CAgABqLQAARw2OASAQQQJGDZABIBBBAWohECAEQQFqIgQgAkcNAAsgACAUNgIAQdYBIRAMkgILAkAgBCACRw0AQdcBIRAMkgILAkACQCAELQAAQbt/ag4QAI8BjwGPAY8BjwGPAY8BjwGPAY8BjwGPAY8BjwEBjwELIARBAWohBEG7ASEQDPkBCyAEQQFqIQRBvAEhEAz4AQsCQCAEIAJHDQBB2AEhEAyRAgsgBC0AAEHIAEcNjAEgBEEBaiEEDMQBCwJAIAQgAkYNACAAQZCAgIAANgIIIAAgBDYCBEG+ASEQDPcBC0HZASEQDI8CCwJAIAQgAkcNAEHaASEQDI8CCyAELQAAQcgARg3DASAAQQE6ACgMuQELIABBAjoALyAAIAQgAhCmgICAACIQDY0BQcIBIRAM9AELIAAtAChBf2oOArcBuQG4AQsDQAJAIAQtAABBdmoOBACOAY4BAI4BCyAEQQFqIgQgAkcNAAtB3QEhEAyLAgsgAEEAOgAvIAAtAC1BBHFFDYQCCyAAQQA6AC8gAEEBOgA0IAEhAQyMAQsgEEEVRg3aASAAQQA2AhwgACABNgIUIABBp46AgAA2AhAgAEESNgIMQQAhEAyIAgsCQCAAIBAgAhC0gICAACIEDQAgECEBDIECCwJAIARBFUcNACAAQQM2AhwgACAQNgIUIABBsJiAgAA2AhAgAEEVNgIMQQAhEAyIAgsgAEEANgIcIAAgEDYCFCAAQaeOgIAANgIQIABBEjYCDEEAIRAMhwILIBBBFUYN1gEgAEEANgIcIAAgATYCFCAAQdqNgIAANgIQIABBFDYCDEEAIRAMhgILIAAoAgQhFyAAQQA2AgQgECARp2oiFiEBIAAgFyAQIBYgFBsiEBC1gICAACIURQ2NASAAQQc2AhwgACAQNgIUIAAgFDYCDEEAIRAMhQILIAAgAC8BMEGAAXI7ATAgASEBC0EqIRAM6gELIBBBFUYN0QEgAEEANgIcIAAgATYCFCAAQYOMgIAANgIQIABBEzYCDEEAIRAMggILIBBBFUYNzwEgAEEANgIcIAAgATYCFCAAQZqPgIAANgIQIABBIjYCDEEAIRAMgQILIAAoAgQhECAAQQA2AgQCQCAAIBAgARC3gICAACIQDQAgAUEBaiEBDI0BCyAAQQw2AhwgACAQNgIMIAAgAUEBajYCFEEAIRAMgAILIBBBFUYNzAEgAEEANgIcIAAgATYCFCAAQZqPgIAANgIQIABBIjYCDEEAIRAM/wELIAAoAgQhECAAQQA2AgQCQCAAIBAgARC3gICAACIQDQAgAUEBaiEBDIwBCyAAQQ02AhwgACAQNgIMIAAgAUEBajYCFEEAIRAM/gELIBBBFUYNyQEgAEEANgIcIAAgATYCFCAAQcaMgIAANgIQIABBIzYCDEEAIRAM/QELIAAoAgQhECAAQQA2AgQCQCAAIBAgARC5gICAACIQDQAgAUEBaiEBDIsBCyAAQQ42AhwgACAQNgIMIAAgAUEBajYCFEEAIRAM/AELIABBADYCHCAAIAE2AhQgAEHAlYCAADYCECAAQQI2AgxBACEQDPsBCyAQQRVGDcUBIABBADYCHCAAIAE2AhQgAEHGjICAADYCECAAQSM2AgxBACEQDPoBCyAAQRA2AhwgACABNgIUIAAgEDYCDEEAIRAM+QELIAAoAgQhBCAAQQA2AgQCQCAAIAQgARC5gICAACIEDQAgAUEBaiEBDPEBCyAAQRE2AhwgACAENgIMIAAgAUEBajYCFEEAIRAM+AELIBBBFUYNwQEgAEEANgIcIAAgATYCFCAAQcaMgIAANgIQIABBIzYCDEEAIRAM9wELIAAoAgQhECAAQQA2AgQCQCAAIBAgARC5gICAACIQDQAgAUEBaiEBDIgBCyAAQRM2AhwgACAQNgIMIAAgAUEBajYCFEEAIRAM9gELIAAoAgQhBCAAQQA2AgQCQCAAIAQgARC5gICAACIEDQAgAUEBaiEBDO0BCyAAQRQ2AhwgACAENgIMIAAgAUEBajYCFEEAIRAM9QELIBBBFUYNvQEgAEEANgIcIAAgATYCFCAAQZqPgIAANgIQIABBIjYCDEEAIRAM9AELIAAoAgQhECAAQQA2AgQCQCAAIBAgARC3gICAACIQDQAgAUEBaiEBDIYBCyAAQRY2AhwgACAQNgIMIAAgAUEBajYCFEEAIRAM8wELIAAoAgQhBCAAQQA2AgQCQCAAIAQgARC3gICAACIEDQAgAUEBaiEBDOkBCyAAQRc2AhwgACAENgIMIAAgAUEBajYCFEEAIRAM8gELIABBADYCHCAAIAE2AhQgAEHNk4CAADYCECAAQQw2AgxBACEQDPEBC0IBIRELIBBBAWohAQJAIAApAyAiEkL//////////w9WDQAgACASQgSGIBGENwMgIAEhAQyEAQsgAEEANgIcIAAgATYCFCAAQa2JgIAANgIQIABBDDYCDEEAIRAM7wELIABBADYCHCAAIBA2AhQgAEHNk4CAADYCECAAQQw2AgxBACEQDO4BCyAAKAIEIRcgAEEANgIEIBAgEadqIhYhASAAIBcgECAWIBQbIhAQtYCAgAAiFEUNcyAAQQU2AhwgACAQNgIUIAAgFDYCDEEAIRAM7QELIABBADYCHCAAIBA2AhQgAEGqnICAADYCECAAQQ82AgxBACEQDOwBCyAAIBAgAhC0gICAACIBDQEgECEBC0EOIRAM0QELAkAgAUEVRw0AIABBAjYCHCAAIBA2AhQgAEGwmICAADYCECAAQRU2AgxBACEQDOoBCyAAQQA2AhwgACAQNgIUIABBp46AgAA2AhAgAEESNgIMQQAhEAzpAQsgAUEBaiEQAkAgAC8BMCIBQYABcUUNAAJAIAAgECACELuAgIAAIgENACAQIQEMcAsgAUEVRw26ASAAQQU2AhwgACAQNgIUIABB+ZeAgAA2AhAgAEEVNgIMQQAhEAzpAQsCQCABQaAEcUGgBEcNACAALQAtQQJxDQAgAEEANgIcIAAgEDYCFCAAQZaTgIAANgIQIABBBDYCDEEAIRAM6QELIAAgECACEL2AgIAAGiAQIQECQAJAAkACQAJAIAAgECACELOAgIAADhYCAQAEBAQEBAQEBAQEBAQEBAQEBAQDBAsgAEEBOgAuCyAAIAAvATBBwAByOwEwIBAhAQtBJiEQDNEBCyAAQSM2AhwgACAQNgIUIABBpZaAgAA2AhAgAEEVNgIMQQAhEAzpAQsgAEEANgIcIAAgEDYCFCAAQdWLgIAANgIQIABBETYCDEEAIRAM6AELIAAtAC1BAXFFDQFBwwEhEAzOAQsCQCANIAJGDQADQAJAIA0tAABBIEYNACANIQEMxAELIA1BAWoiDSACRw0AC0ElIRAM5wELQSUhEAzmAQsgACgCBCEEIABBADYCBCAAIAQgDRCvgICAACIERQ2tASAAQSY2AhwgACAENgIMIAAgDUEBajYCFEEAIRAM5QELIBBBFUYNqwEgAEEANgIcIAAgATYCFCAAQf2NgIAANgIQIABBHTYCDEEAIRAM5AELIABBJzYCHCAAIAE2AhQgACAQNgIMQQAhEAzjAQsgECEBQQEhFAJAAkACQAJAAkACQAJAIAAtACxBfmoOBwYFBQMBAgAFCyAAIAAvATBBCHI7ATAMAwtBAiEUDAELQQQhFAsgAEEBOgAsIAAgAC8BMCAUcjsBMAsgECEBC0ErIRAMygELIABBADYCHCAAIBA2AhQgAEGrkoCAADYCECAAQQs2AgxBACEQDOIBCyAAQQA2AhwgACABNgIUIABB4Y+AgAA2AhAgAEEKNgIMQQAhEAzhAQsgAEEAOgAsIBAhAQy9AQsgECEBQQEhFAJAAkACQAJAAkAgAC0ALEF7ag4EAwECAAULIAAgAC8BMEEIcjsBMAwDC0ECIRQMAQtBBCEUCyAAQQE6ACwgACAALwEwIBRyOwEwCyAQIQELQSkhEAzFAQsgAEEANgIcIAAgATYCFCAAQfCUgIAANgIQIABBAzYCDEEAIRAM3QELAkAgDi0AAEENRw0AIAAoAgQhASAAQQA2AgQCQCAAIAEgDhCxgICAACIBDQAgDkEBaiEBDHULIABBLDYCHCAAIAE2AgwgACAOQQFqNgIUQQAhEAzdAQsgAC0ALUEBcUUNAUHEASEQDMMBCwJAIA4gAkcNAEEtIRAM3AELAkACQANAAkAgDi0AAEF2ag4EAgAAAwALIA5BAWoiDiACRw0AC0EtIRAM3QELIAAoAgQhASAAQQA2AgQCQCAAIAEgDhCxgICAACIBDQAgDiEBDHQLIABBLDYCHCAAIA42AhQgACABNgIMQQAhEAzcAQsgACgCBCEBIABBADYCBAJAIAAgASAOELGAgIAAIgENACAOQQFqIQEMcwsgAEEsNgIcIAAgATYCDCAAIA5BAWo2AhRBACEQDNsBCyAAKAIEIQQgAEEANgIEIAAgBCAOELGAgIAAIgQNoAEgDiEBDM4BCyAQQSxHDQEgAUEBaiEQQQEhAQJAAkACQAJAAkAgAC0ALEF7ag4EAwECBAALIBAhAQwEC0ECIQEMAQtBBCEBCyAAQQE6ACwgACAALwEwIAFyOwEwIBAhAQwBCyAAIAAvATBBCHI7ATAgECEBC0E5IRAMvwELIABBADoALCABIQELQTQhEAy9AQsgACAALwEwQSByOwEwIAEhAQwCCyAAKAIEIQQgAEEANgIEAkAgACAEIAEQsYCAgAAiBA0AIAEhAQzHAQsgAEE3NgIcIAAgATYCFCAAIAQ2AgxBACEQDNQBCyAAQQg6ACwgASEBC0EwIRAMuQELAkAgAC0AKEEBRg0AIAEhAQwECyAALQAtQQhxRQ2TASABIQEMAwsgAC0AMEEgcQ2UAUHFASEQDLcBCwJAIA8gAkYNAAJAA0ACQCAPLQAAQVBqIgFB/wFxQQpJDQAgDyEBQTUhEAy6AQsgACkDICIRQpmz5syZs+bMGVYNASAAIBFCCn4iETcDICARIAGtQv8BgyISQn+FVg0BIAAgESASfDcDICAPQQFqIg8gAkcNAAtBOSEQDNEBCyAAKAIEIQIgAEEANgIEIAAgAiAPQQFqIgQQsYCAgAAiAg2VASAEIQEMwwELQTkhEAzPAQsCQCAALwEwIgFBCHFFDQAgAC0AKEEBRw0AIAAtAC1BCHFFDZABCyAAIAFB9/sDcUGABHI7ATAgDyEBC0E3IRAMtAELIAAgAC8BMEEQcjsBMAyrAQsgEEEVRg2LASAAQQA2AhwgACABNgIUIABB8I6AgAA2AhAgAEEcNgIMQQAhEAzLAQsgAEHDADYCHCAAIAE2AgwgACANQQFqNgIUQQAhEAzKAQsCQCABLQAAQTpHDQAgACgCBCEQIABBADYCBAJAIAAgECABEK+AgIAAIhANACABQQFqIQEMYwsgAEHDADYCHCAAIBA2AgwgACABQQFqNgIUQQAhEAzKAQsgAEEANgIcIAAgATYCFCAAQbGRgIAANgIQIABBCjYCDEEAIRAMyQELIABBADYCHCAAIAE2AhQgAEGgmYCAADYCECAAQR42AgxBACEQDMgBCyAAQQA2AgALIABBgBI7ASogACAXQQFqIgEgAhCogICAACIQDQEgASEBC0HHACEQDKwBCyAQQRVHDYMBIABB0QA2AhwgACABNgIUIABB45eAgAA2AhAgAEEVNgIMQQAhEAzEAQsgACgCBCEQIABBADYCBAJAIAAgECABEKeAgIAAIhANACABIQEMXgsgAEHSADYCHCAAIAE2AhQgACAQNgIMQQAhEAzDAQsgAEEANgIcIAAgFDYCFCAAQcGogIAANgIQIABBBzYCDCAAQQA2AgBBACEQDMIBCyAAKAIEIRAgAEEANgIEAkAgACAQIAEQp4CAgAAiEA0AIAEhAQxdCyAAQdMANgIcIAAgATYCFCAAIBA2AgxBACEQDMEBC0EAIRAgAEEANgIcIAAgATYCFCAAQYCRgIAANgIQIABBCTYCDAzAAQsgEEEVRg19IABBADYCHCAAIAE2AhQgAEGUjYCAADYCECAAQSE2AgxBACEQDL8BC0EBIRZBACEXQQAhFEEBIRALIAAgEDoAKyABQQFqIQECQAJAIAAtAC1BEHENAAJAAkACQCAALQAqDgMBAAIECyAWRQ0DDAILIBQNAQwCCyAXRQ0BCyAAKAIEIRAgAEEANgIEAkAgACAQIAEQrYCAgAAiEA0AIAEhAQxcCyAAQdgANgIcIAAgATYCFCAAIBA2AgxBACEQDL4BCyAAKAIEIQQgAEEANgIEAkAgACAEIAEQrYCAgAAiBA0AIAEhAQytAQsgAEHZADYCHCAAIAE2AhQgACAENgIMQQAhEAy9AQsgACgCBCEEIABBADYCBAJAIAAgBCABEK2AgIAAIgQNACABIQEMqwELIABB2gA2AhwgACABNgIUIAAgBDYCDEEAIRAMvAELIAAoAgQhBCAAQQA2AgQCQCAAIAQgARCtgICAACIEDQAgASEBDKkBCyAAQdwANgIcIAAgATYCFCAAIAQ2AgxBACEQDLsBCwJAIAEtAABBUGoiEEH/AXFBCk8NACAAIBA6ACogAUEBaiEBQc8AIRAMogELIAAoAgQhBCAAQQA2AgQCQCAAIAQgARCtgICAACIEDQAgASEBDKcBCyAAQd4ANgIcIAAgATYCFCAAIAQ2AgxBACEQDLoBCyAAQQA2AgAgF0EBaiEBAkAgAC0AKUEjTw0AIAEhAQxZCyAAQQA2AhwgACABNgIUIABB04mAgAA2AhAgAEEINgIMQQAhEAy5AQsgAEEANgIAC0EAIRAgAEEANgIcIAAgATYCFCAAQZCzgIAANgIQIABBCDYCDAy3AQsgAEEANgIAIBdBAWohAQJAIAAtAClBIUcNACABIQEMVgsgAEEANgIcIAAgATYCFCAAQZuKgIAANgIQIABBCDYCDEEAIRAMtgELIABBADYCACAXQQFqIQECQCAALQApIhBBXWpBC08NACABIQEMVQsCQCAQQQZLDQBBASAQdEHKAHFFDQAgASEBDFULQQAhECAAQQA2AhwgACABNgIUIABB94mAgAA2AhAgAEEINgIMDLUBCyAQQRVGDXEgAEEANgIcIAAgATYCFCAAQbmNgIAANgIQIABBGjYCDEEAIRAMtAELIAAoAgQhECAAQQA2AgQCQCAAIBAgARCngICAACIQDQAgASEBDFQLIABB5QA2AhwgACABNgIUIAAgEDYCDEEAIRAMswELIAAoAgQhECAAQQA2AgQCQCAAIBAgARCngICAACIQDQAgASEBDE0LIABB0gA2AhwgACABNgIUIAAgEDYCDEEAIRAMsgELIAAoAgQhECAAQQA2AgQCQCAAIBAgARCngICAACIQDQAgASEBDE0LIABB0wA2AhwgACABNgIUIAAgEDYCDEEAIRAMsQELIAAoAgQhECAAQQA2AgQCQCAAIBAgARCngICAACIQDQAgASEBDFELIABB5QA2AhwgACABNgIUIAAgEDYCDEEAIRAMsAELIABBADYCHCAAIAE2AhQgAEHGioCAADYCECAAQQc2AgxBACEQDK8BCyAAKAIEIRAgAEEANgIEAkAgACAQIAEQp4CAgAAiEA0AIAEhAQxJCyAAQdIANgIcIAAgATYCFCAAIBA2AgxBACEQDK4BCyAAKAIEIRAgAEEANgIEAkAgACAQIAEQp4CAgAAiEA0AIAEhAQxJCyAAQdMANgIcIAAgATYCFCAAIBA2AgxBACEQDK0BCyAAKAIEIRAgAEEANgIEAkAgACAQIAEQp4CAgAAiEA0AIAEhAQxNCyAAQeUANgIcIAAgATYCFCAAIBA2AgxBACEQDKwBCyAAQQA2AhwgACABNgIUIABB3IiAgAA2AhAgAEEHNgIMQQAhEAyrAQsgEEE/Rw0BIAFBAWohAQtBBSEQDJABC0EAIRAgAEEANgIcIAAgATYCFCAAQf2SgIAANgIQIABBBzYCDAyoAQsgACgCBCEQIABBADYCBAJAIAAgECABEKeAgIAAIhANACABIQEMQgsgAEHSADYCHCAAIAE2AhQgACAQNgIMQQAhEAynAQsgACgCBCEQIABBADYCBAJAIAAgECABEKeAgIAAIhANACABIQEMQgsgAEHTADYCHCAAIAE2AhQgACAQNgIMQQAhEAymAQsgACgCBCEQIABBADYCBAJAIAAgECABEKeAgIAAIhANACABIQEMRgsgAEHlADYCHCAAIAE2AhQgACAQNgIMQQAhEAylAQsgACgCBCEBIABBADYCBAJAIAAgASAUEKeAgIAAIgENACAUIQEMPwsgAEHSADYCHCAAIBQ2AhQgACABNgIMQQAhEAykAQsgACgCBCEBIABBADYCBAJAIAAgASAUEKeAgIAAIgENACAUIQEMPwsgAEHTADYCHCAAIBQ2AhQgACABNgIMQQAhEAyjAQsgACgCBCEBIABBADYCBAJAIAAgASAUEKeAgIAAIgENACAUIQEMQwsgAEHlADYCHCAAIBQ2AhQgACABNgIMQQAhEAyiAQsgAEEANgIcIAAgFDYCFCAAQcOPgIAANgIQIABBBzYCDEEAIRAMoQELIABBADYCHCAAIAE2AhQgAEHDj4CAADYCECAAQQc2AgxBACEQDKABC0EAIRAgAEEANgIcIAAgFDYCFCAAQYycgIAANgIQIABBBzYCDAyfAQsgAEEANgIcIAAgFDYCFCAAQYycgIAANgIQIABBBzYCDEEAIRAMngELIABBADYCHCAAIBQ2AhQgAEH+kYCAADYCECAAQQc2AgxBACEQDJ0BCyAAQQA2AhwgACABNgIUIABBjpuAgAA2AhAgAEEGNgIMQQAhEAycAQsgEEEVRg1XIABBADYCHCAAIAE2AhQgAEHMjoCAADYCECAAQSA2AgxBACEQDJsBCyAAQQA2AgAgEEEBaiEBQSQhEAsgACAQOgApIAAoAgQhECAAQQA2AgQgACAQIAEQq4CAgAAiEA1UIAEhAQw+CyAAQQA2AgALQQAhECAAQQA2AhwgACAENgIUIABB8ZuAgAA2AhAgAEEGNgIMDJcBCyABQRVGDVAgAEEANgIcIAAgBTYCFCAAQfCMgIAANgIQIABBGzYCDEEAIRAMlgELIAAoAgQhBSAAQQA2AgQgACAFIBAQqYCAgAAiBQ0BIBBBAWohBQtBrQEhEAx7CyAAQcEBNgIcIAAgBTYCDCAAIBBBAWo2AhRBACEQDJMBCyAAKAIEIQYgAEEANgIEIAAgBiAQEKmAgIAAIgYNASAQQQFqIQYLQa4BIRAMeAsgAEHCATYCHCAAIAY2AgwgACAQQQFqNgIUQQAhEAyQAQsgAEEANgIcIAAgBzYCFCAAQZeLgIAANgIQIABBDTYCDEEAIRAMjwELIABBADYCHCAAIAg2AhQgAEHjkICAADYCECAAQQk2AgxBACEQDI4BCyAAQQA2AhwgACAINgIUIABBlI2AgAA2AhAgAEEhNgIMQQAhEAyNAQtBASEWQQAhF0EAIRRBASEQCyAAIBA6ACsgCUEBaiEIAkACQCAALQAtQRBxDQACQAJAAkAgAC0AKg4DAQACBAsgFkUNAwwCCyAUDQEMAgsgF0UNAQsgACgCBCEQIABBADYCBCAAIBAgCBCtgICAACIQRQ09IABByQE2AhwgACAINgIUIAAgEDYCDEEAIRAMjAELIAAoAgQhBCAAQQA2AgQgACAEIAgQrYCAgAAiBEUNdiAAQcoBNgIcIAAgCDYCFCAAIAQ2AgxBACEQDIsBCyAAKAIEIQQgAEEANgIEIAAgBCAJEK2AgIAAIgRFDXQgAEHLATYCHCAAIAk2AhQgACAENgIMQQAhEAyKAQsgACgCBCEEIABBADYCBCAAIAQgChCtgICAACIERQ1yIABBzQE2AhwgACAKNgIUIAAgBDYCDEEAIRAMiQELAkAgCy0AAEFQaiIQQf8BcUEKTw0AIAAgEDoAKiALQQFqIQpBtgEhEAxwCyAAKAIEIQQgAEEANgIEIAAgBCALEK2AgIAAIgRFDXAgAEHPATYCHCAAIAs2AhQgACAENgIMQQAhEAyIAQsgAEEANgIcIAAgBDYCFCAAQZCzgIAANgIQIABBCDYCDCAAQQA2AgBBACEQDIcBCyABQRVGDT8gAEEANgIcIAAgDDYCFCAAQcyOgIAANgIQIABBIDYCDEEAIRAMhgELIABBgQQ7ASggACgCBCEQIABCADcDACAAIBAgDEEBaiIMEKuAgIAAIhBFDTggAEHTATYCHCAAIAw2AhQgACAQNgIMQQAhEAyFAQsgAEEANgIAC0EAIRAgAEEANgIcIAAgBDYCFCAAQdibgIAANgIQIABBCDYCDAyDAQsgACgCBCEQIABCADcDACAAIBAgC0EBaiILEKuAgIAAIhANAUHGASEQDGkLIABBAjoAKAxVCyAAQdUBNgIcIAAgCzYCFCAAIBA2AgxBACEQDIABCyAQQRVGDTcgAEEANgIcIAAgBDYCFCAAQaSMgIAANgIQIABBEDYCDEEAIRAMfwsgAC0ANEEBRw00IAAgBCACELyAgIAAIhBFDTQgEEEVRw01IABB3AE2AhwgACAENgIUIABB1ZaAgAA2AhAgAEEVNgIMQQAhEAx+C0EAIRAgAEEANgIcIABBr4uAgAA2AhAgAEECNgIMIAAgFEEBajYCFAx9C0EAIRAMYwtBAiEQDGILQQ0hEAxhC0EPIRAMYAtBJSEQDF8LQRMhEAxeC0EVIRAMXQtBFiEQDFwLQRchEAxbC0EYIRAMWgtBGSEQDFkLQRohEAxYC0EbIRAMVwtBHCEQDFYLQR0hEAxVC0EfIRAMVAtBISEQDFMLQSMhEAxSC0HGACEQDFELQS4hEAxQC0EvIRAMTwtBOyEQDE4LQT0hEAxNC0HIACEQDEwLQckAIRAMSwtBywAhEAxKC0HMACEQDEkLQc4AIRAMSAtB0QAhEAxHC0HVACEQDEYLQdgAIRAMRQtB2QAhEAxEC0HbACEQDEMLQeQAIRAMQgtB5QAhEAxBC0HxACEQDEALQfQAIRAMPwtBjQEhEAw+C0GXASEQDD0LQakBIRAMPAtBrAEhEAw7C0HAASEQDDoLQbkBIRAMOQtBrwEhEAw4C0GxASEQDDcLQbIBIRAMNgtBtAEhEAw1C0G1ASEQDDQLQboBIRAMMwtBvQEhEAwyC0G/ASEQDDELQcEBIRAMMAsgAEEANgIcIAAgBDYCFCAAQemLgIAANgIQIABBHzYCDEEAIRAMSAsgAEHbATYCHCAAIAQ2AhQgAEH6loCAADYCECAAQRU2AgxBACEQDEcLIABB+AA2AhwgACAMNgIUIABBypiAgAA2AhAgAEEVNgIMQQAhEAxGCyAAQdEANgIcIAAgBTYCFCAAQbCXgIAANgIQIABBFTYCDEEAIRAMRQsgAEH5ADYCHCAAIAE2AhQgACAQNgIMQQAhEAxECyAAQfgANgIcIAAgATYCFCAAQcqYgIAANgIQIABBFTYCDEEAIRAMQwsgAEHkADYCHCAAIAE2AhQgAEHjl4CAADYCECAAQRU2AgxBACEQDEILIABB1wA2AhwgACABNgIUIABByZeAgAA2AhAgAEEVNgIMQQAhEAxBCyAAQQA2AhwgACABNgIUIABBuY2AgAA2AhAgAEEaNgIMQQAhEAxACyAAQcIANgIcIAAgATYCFCAAQeOYgIAANgIQIABBFTYCDEEAIRAMPwsgAEEANgIEIAAgDyAPELGAgIAAIgRFDQEgAEE6NgIcIAAgBDYCDCAAIA9BAWo2AhRBACEQDD4LIAAoAgQhBCAAQQA2AgQCQCAAIAQgARCxgICAACIERQ0AIABBOzYCHCAAIAQ2AgwgACABQQFqNgIUQQAhEAw+CyABQQFqIQEMLQsgD0EBaiEBDC0LIABBADYCHCAAIA82AhQgAEHkkoCAADYCECAAQQQ2AgxBACEQDDsLIABBNjYCHCAAIAQ2AhQgACACNgIMQQAhEAw6CyAAQS42AhwgACAONgIUIAAgBDYCDEEAIRAMOQsgAEHQADYCHCAAIAE2AhQgAEGRmICAADYCECAAQRU2AgxBACEQDDgLIA1BAWohAQwsCyAAQRU2AhwgACABNgIUIABBgpmAgAA2AhAgAEEVNgIMQQAhEAw2CyAAQRs2AhwgACABNgIUIABBkZeAgAA2AhAgAEEVNgIMQQAhEAw1CyAAQQ82AhwgACABNgIUIABBkZeAgAA2AhAgAEEVNgIMQQAhEAw0CyAAQQs2AhwgACABNgIUIABBkZeAgAA2AhAgAEEVNgIMQQAhEAwzCyAAQRo2AhwgACABNgIUIABBgpmAgAA2AhAgAEEVNgIMQQAhEAwyCyAAQQs2AhwgACABNgIUIABBgpmAgAA2AhAgAEEVNgIMQQAhEAwxCyAAQQo2AhwgACABNgIUIABB5JaAgAA2AhAgAEEVNgIMQQAhEAwwCyAAQR42AhwgACABNgIUIABB+ZeAgAA2AhAgAEEVNgIMQQAhEAwvCyAAQQA2AhwgACAQNgIUIABB2o2AgAA2AhAgAEEUNgIMQQAhEAwuCyAAQQQ2AhwgACABNgIUIABBsJiAgAA2AhAgAEEVNgIMQQAhEAwtCyAAQQA2AgAgC0EBaiELC0G4ASEQDBILIABBADYCACAQQQFqIQFB9QAhEAwRCyABIQECQCAALQApQQVHDQBB4wAhEAwRC0HiACEQDBALQQAhECAAQQA2AhwgAEHkkYCAADYCECAAQQc2AgwgACAUQQFqNgIUDCgLIABBADYCACAXQQFqIQFBwAAhEAwOC0EBIQELIAAgAToALCAAQQA2AgAgF0EBaiEBC0EoIRAMCwsgASEBC0E4IRAMCQsCQCABIg8gAkYNAANAAkAgDy0AAEGAvoCAAGotAAAiAUEBRg0AIAFBAkcNAyAPQQFqIQEMBAsgD0EBaiIPIAJHDQALQT4hEAwiC0E+IRAMIQsgAEEAOgAsIA8hAQwBC0ELIRAMBgtBOiEQDAULIAFBAWohAUEtIRAMBAsgACABOgAsIABBADYCACAWQQFqIQFBDCEQDAMLIABBADYCACAXQQFqIQFBCiEQDAILIABBADYCAAsgAEEAOgAsIA0hAUEJIRAMAAsLQQAhECAAQQA2AhwgACALNgIUIABBzZCAgAA2AhAgAEEJNgIMDBcLQQAhECAAQQA2AhwgACAKNgIUIABB6YqAgAA2AhAgAEEJNgIMDBYLQQAhECAAQQA2AhwgACAJNgIUIABBt5CAgAA2AhAgAEEJNgIMDBULQQAhECAAQQA2AhwgACAINgIUIABBnJGAgAA2AhAgAEEJNgIMDBQLQQAhECAAQQA2AhwgACABNgIUIABBzZCAgAA2AhAgAEEJNgIMDBMLQQAhECAAQQA2AhwgACABNgIUIABB6YqAgAA2AhAgAEEJNgIMDBILQQAhECAAQQA2AhwgACABNgIUIABBt5CAgAA2AhAgAEEJNgIMDBELQQAhECAAQQA2AhwgACABNgIUIABBnJGAgAA2AhAgAEEJNgIMDBALQQAhECAAQQA2AhwgACABNgIUIABBl5WAgAA2AhAgAEEPNgIMDA8LQQAhECAAQQA2AhwgACABNgIUIABBl5WAgAA2AhAgAEEPNgIMDA4LQQAhECAAQQA2AhwgACABNgIUIABBwJKAgAA2AhAgAEELNgIMDA0LQQAhECAAQQA2AhwgACABNgIUIABBlYmAgAA2AhAgAEELNgIMDAwLQQAhECAAQQA2AhwgACABNgIUIABB4Y+AgAA2AhAgAEEKNgIMDAsLQQAhECAAQQA2AhwgACABNgIUIABB+4+AgAA2AhAgAEEKNgIMDAoLQQAhECAAQQA2AhwgACABNgIUIABB8ZmAgAA2AhAgAEECNgIMDAkLQQAhECAAQQA2AhwgACABNgIUIABBxJSAgAA2AhAgAEECNgIMDAgLQQAhECAAQQA2AhwgACABNgIUIABB8pWAgAA2AhAgAEECNgIMDAcLIABBAjYCHCAAIAE2AhQgAEGcmoCAADYCECAAQRY2AgxBACEQDAYLQQEhEAwFC0HUACEQIAEiBCACRg0EIANBCGogACAEIAJB2MKAgABBChDFgICAACADKAIMIQQgAygCCA4DAQQCAAsQyoCAgAAACyAAQQA2AhwgAEG1moCAADYCECAAQRc2AgwgACAEQQFqNgIUQQAhEAwCCyAAQQA2AhwgACAENgIUIABBypqAgAA2AhAgAEEJNgIMQQAhEAwBCwJAIAEiBCACRw0AQSIhEAwBCyAAQYmAgIAANgIIIAAgBDYCBEEhIRALIANBEGokgICAgAAgEAuvAQECfyABKAIAIQYCQAJAIAIgA0YNACAEIAZqIQQgBiADaiACayEHIAIgBkF/cyAFaiIGaiEFA0ACQCACLQAAIAQtAABGDQBBAiEEDAMLAkAgBg0AQQAhBCAFIQIMAwsgBkF/aiEGIARBAWohBCACQQFqIgIgA0cNAAsgByEGIAMhAgsgAEEBNgIAIAEgBjYCACAAIAI2AgQPCyABQQA2AgAgACAENgIAIAAgAjYCBAsKACAAEMeAgIAAC/I2AQt/I4CAgIAAQRBrIgEkgICAgAACQEEAKAKg0ICAAA0AQQAQy4CAgABBgNSEgABrIgJB2QBJDQBBACEDAkBBACgC4NOAgAAiBA0AQQBCfzcC7NOAgABBAEKAgISAgIDAADcC5NOAgABBACABQQhqQXBxQdiq1aoFcyIENgLg04CAAEEAQQA2AvTTgIAAQQBBADYCxNOAgAALQQAgAjYCzNOAgABBAEGA1ISAADYCyNOAgABBAEGA1ISAADYCmNCAgABBACAENgKs0ICAAEEAQX82AqjQgIAAA0AgA0HE0ICAAGogA0G40ICAAGoiBDYCACAEIANBsNCAgABqIgU2AgAgA0G80ICAAGogBTYCACADQczQgIAAaiADQcDQgIAAaiIFNgIAIAUgBDYCACADQdTQgIAAaiADQcjQgIAAaiIENgIAIAQgBTYCACADQdDQgIAAaiAENgIAIANBIGoiA0GAAkcNAAtBgNSEgABBeEGA1ISAAGtBD3FBAEGA1ISAAEEIakEPcRsiA2oiBEEEaiACQUhqIgUgA2siA0EBcjYCAEEAQQAoAvDTgIAANgKk0ICAAEEAIAM2ApTQgIAAQQAgBDYCoNCAgABBgNSEgAAgBWpBODYCBAsCQAJAAkACQAJAAkACQAJAAkACQAJAAkAgAEHsAUsNAAJAQQAoAojQgIAAIgZBECAAQRNqQXBxIABBC0kbIgJBA3YiBHYiA0EDcUUNAAJAAkAgA0EBcSAEckEBcyIFQQN0IgRBsNCAgABqIgMgBEG40ICAAGooAgAiBCgCCCICRw0AQQAgBkF+IAV3cTYCiNCAgAAMAQsgAyACNgIIIAIgAzYCDAsgBEEIaiEDIAQgBUEDdCIFQQNyNgIEIAQgBWoiBCAEKAIEQQFyNgIEDAwLIAJBACgCkNCAgAAiB00NAQJAIANFDQACQAJAIAMgBHRBAiAEdCIDQQAgA2tycSIDQQAgA2txQX9qIgMgA0EMdkEQcSIDdiIEQQV2QQhxIgUgA3IgBCAFdiIDQQJ2QQRxIgRyIAMgBHYiA0EBdkECcSIEciADIAR2IgNBAXZBAXEiBHIgAyAEdmoiBEEDdCIDQbDQgIAAaiIFIANBuNCAgABqKAIAIgMoAggiAEcNAEEAIAZBfiAEd3EiBjYCiNCAgAAMAQsgBSAANgIIIAAgBTYCDAsgAyACQQNyNgIEIAMgBEEDdCIEaiAEIAJrIgU2AgAgAyACaiIAIAVBAXI2AgQCQCAHRQ0AIAdBeHFBsNCAgABqIQJBACgCnNCAgAAhBAJAAkAgBkEBIAdBA3Z0IghxDQBBACAGIAhyNgKI0ICAACACIQgMAQsgAigCCCEICyAIIAQ2AgwgAiAENgIIIAQgAjYCDCAEIAg2AggLIANBCGohA0EAIAA2ApzQgIAAQQAgBTYCkNCAgAAMDAtBACgCjNCAgAAiCUUNASAJQQAgCWtxQX9qIgMgA0EMdkEQcSIDdiIEQQV2QQhxIgUgA3IgBCAFdiIDQQJ2QQRxIgRyIAMgBHYiA0EBdkECcSIEciADIAR2IgNBAXZBAXEiBHIgAyAEdmpBAnRBuNKAgABqKAIAIgAoAgRBeHEgAmshBCAAIQUCQANAAkAgBSgCECIDDQAgBUEUaigCACIDRQ0CCyADKAIEQXhxIAJrIgUgBCAFIARJIgUbIQQgAyAAIAUbIQAgAyEFDAALCyAAKAIYIQoCQCAAKAIMIgggAEYNACAAKAIIIgNBACgCmNCAgABJGiAIIAM2AgggAyAINgIMDAsLAkAgAEEUaiIFKAIAIgMNACAAKAIQIgNFDQMgAEEQaiEFCwNAIAUhCyADIghBFGoiBSgCACIDDQAgCEEQaiEFIAgoAhAiAw0ACyALQQA2AgAMCgtBfyECIABBv39LDQAgAEETaiIDQXBxIQJBACgCjNCAgAAiB0UNAEEAIQsCQCACQYACSQ0AQR8hCyACQf///wdLDQAgA0EIdiIDIANBgP4/akEQdkEIcSIDdCIEIARBgOAfakEQdkEEcSIEdCIFIAVBgIAPakEQdkECcSIFdEEPdiADIARyIAVyayIDQQF0IAIgA0EVanZBAXFyQRxqIQsLQQAgAmshBAJAAkACQAJAIAtBAnRBuNKAgABqKAIAIgUNAEEAIQNBACEIDAELQQAhAyACQQBBGSALQQF2ayALQR9GG3QhAEEAIQgDQAJAIAUoAgRBeHEgAmsiBiAETw0AIAYhBCAFIQggBg0AQQAhBCAFIQggBSEDDAMLIAMgBUEUaigCACIGIAYgBSAAQR12QQRxakEQaigCACIFRhsgAyAGGyEDIABBAXQhACAFDQALCwJAIAMgCHINAEEAIQhBAiALdCIDQQAgA2tyIAdxIgNFDQMgA0EAIANrcUF/aiIDIANBDHZBEHEiA3YiBUEFdkEIcSIAIANyIAUgAHYiA0ECdkEEcSIFciADIAV2IgNBAXZBAnEiBXIgAyAFdiIDQQF2QQFxIgVyIAMgBXZqQQJ0QbjSgIAAaigCACEDCyADRQ0BCwNAIAMoAgRBeHEgAmsiBiAESSEAAkAgAygCECIFDQAgA0EUaigCACEFCyAGIAQgABshBCADIAggABshCCAFIQMgBQ0ACwsgCEUNACAEQQAoApDQgIAAIAJrTw0AIAgoAhghCwJAIAgoAgwiACAIRg0AIAgoAggiA0EAKAKY0ICAAEkaIAAgAzYCCCADIAA2AgwMCQsCQCAIQRRqIgUoAgAiAw0AIAgoAhAiA0UNAyAIQRBqIQULA0AgBSEGIAMiAEEUaiIFKAIAIgMNACAAQRBqIQUgACgCECIDDQALIAZBADYCAAwICwJAQQAoApDQgIAAIgMgAkkNAEEAKAKc0ICAACEEAkACQCADIAJrIgVBEEkNACAEIAJqIgAgBUEBcjYCBEEAIAU2ApDQgIAAQQAgADYCnNCAgAAgBCADaiAFNgIAIAQgAkEDcjYCBAwBCyAEIANBA3I2AgQgBCADaiIDIAMoAgRBAXI2AgRBAEEANgKc0ICAAEEAQQA2ApDQgIAACyAEQQhqIQMMCgsCQEEAKAKU0ICAACIAIAJNDQBBACgCoNCAgAAiAyACaiIEIAAgAmsiBUEBcjYCBEEAIAU2ApTQgIAAQQAgBDYCoNCAgAAgAyACQQNyNgIEIANBCGohAwwKCwJAAkBBACgC4NOAgABFDQBBACgC6NOAgAAhBAwBC0EAQn83AuzTgIAAQQBCgICEgICAwAA3AuTTgIAAQQAgAUEMakFwcUHYqtWqBXM2AuDTgIAAQQBBADYC9NOAgABBAEEANgLE04CAAEGAgAQhBAtBACEDAkAgBCACQccAaiIHaiIGQQAgBGsiC3EiCCACSw0AQQBBMDYC+NOAgAAMCgsCQEEAKALA04CAACIDRQ0AAkBBACgCuNOAgAAiBCAIaiIFIARNDQAgBSADTQ0BC0EAIQNBAEEwNgL404CAAAwKC0EALQDE04CAAEEEcQ0EAkACQAJAQQAoAqDQgIAAIgRFDQBByNOAgAAhAwNAAkAgAygCACIFIARLDQAgBSADKAIEaiAESw0DCyADKAIIIgMNAAsLQQAQy4CAgAAiAEF/Rg0FIAghBgJAQQAoAuTTgIAAIgNBf2oiBCAAcUUNACAIIABrIAQgAGpBACADa3FqIQYLIAYgAk0NBSAGQf7///8HSw0FAkBBACgCwNOAgAAiA0UNAEEAKAK404CAACIEIAZqIgUgBE0NBiAFIANLDQYLIAYQy4CAgAAiAyAARw0BDAcLIAYgAGsgC3EiBkH+////B0sNBCAGEMuAgIAAIgAgAygCACADKAIEakYNAyAAIQMLAkAgA0F/Rg0AIAJByABqIAZNDQACQCAHIAZrQQAoAujTgIAAIgRqQQAgBGtxIgRB/v///wdNDQAgAyEADAcLAkAgBBDLgICAAEF/Rg0AIAQgBmohBiADIQAMBwtBACAGaxDLgICAABoMBAsgAyEAIANBf0cNBQwDC0EAIQgMBwtBACEADAULIABBf0cNAgtBAEEAKALE04CAAEEEcjYCxNOAgAALIAhB/v///wdLDQEgCBDLgICAACEAQQAQy4CAgAAhAyAAQX9GDQEgA0F/Rg0BIAAgA08NASADIABrIgYgAkE4ak0NAQtBAEEAKAK404CAACAGaiIDNgK404CAAAJAIANBACgCvNOAgABNDQBBACADNgK804CAAAsCQAJAAkACQEEAKAKg0ICAACIERQ0AQcjTgIAAIQMDQCAAIAMoAgAiBSADKAIEIghqRg0CIAMoAggiAw0ADAMLCwJAAkBBACgCmNCAgAAiA0UNACAAIANPDQELQQAgADYCmNCAgAALQQAhA0EAIAY2AszTgIAAQQAgADYCyNOAgABBAEF/NgKo0ICAAEEAQQAoAuDTgIAANgKs0ICAAEEAQQA2AtTTgIAAA0AgA0HE0ICAAGogA0G40ICAAGoiBDYCACAEIANBsNCAgABqIgU2AgAgA0G80ICAAGogBTYCACADQczQgIAAaiADQcDQgIAAaiIFNgIAIAUgBDYCACADQdTQgIAAaiADQcjQgIAAaiIENgIAIAQgBTYCACADQdDQgIAAaiAENgIAIANBIGoiA0GAAkcNAAsgAEF4IABrQQ9xQQAgAEEIakEPcRsiA2oiBCAGQUhqIgUgA2siA0EBcjYCBEEAQQAoAvDTgIAANgKk0ICAAEEAIAM2ApTQgIAAQQAgBDYCoNCAgAAgACAFakE4NgIEDAILIAMtAAxBCHENACAEIAVJDQAgBCAATw0AIARBeCAEa0EPcUEAIARBCGpBD3EbIgVqIgBBACgClNCAgAAgBmoiCyAFayIFQQFyNgIEIAMgCCAGajYCBEEAQQAoAvDTgIAANgKk0ICAAEEAIAU2ApTQgIAAQQAgADYCoNCAgAAgBCALakE4NgIEDAELAkAgAEEAKAKY0ICAACIITw0AQQAgADYCmNCAgAAgACEICyAAIAZqIQVByNOAgAAhAwJAAkACQAJAAkACQAJAA0AgAygCACAFRg0BIAMoAggiAw0ADAILCyADLQAMQQhxRQ0BC0HI04CAACEDA0ACQCADKAIAIgUgBEsNACAFIAMoAgRqIgUgBEsNAwsgAygCCCEDDAALCyADIAA2AgAgAyADKAIEIAZqNgIEIABBeCAAa0EPcUEAIABBCGpBD3EbaiILIAJBA3I2AgQgBUF4IAVrQQ9xQQAgBUEIakEPcRtqIgYgCyACaiICayEDAkAgBiAERw0AQQAgAjYCoNCAgABBAEEAKAKU0ICAACADaiIDNgKU0ICAACACIANBAXI2AgQMAwsCQCAGQQAoApzQgIAARw0AQQAgAjYCnNCAgABBAEEAKAKQ0ICAACADaiIDNgKQ0ICAACACIANBAXI2AgQgAiADaiADNgIADAMLAkAgBigCBCIEQQNxQQFHDQAgBEF4cSEHAkACQCAEQf8BSw0AIAYoAggiBSAEQQN2IghBA3RBsNCAgABqIgBGGgJAIAYoAgwiBCAFRw0AQQBBACgCiNCAgABBfiAId3E2AojQgIAADAILIAQgAEYaIAQgBTYCCCAFIAQ2AgwMAQsgBigCGCEJAkACQCAGKAIMIgAgBkYNACAGKAIIIgQgCEkaIAAgBDYCCCAEIAA2AgwMAQsCQCAGQRRqIgQoAgAiBQ0AIAZBEGoiBCgCACIFDQBBACEADAELA0AgBCEIIAUiAEEUaiIEKAIAIgUNACAAQRBqIQQgACgCECIFDQALIAhBADYCAAsgCUUNAAJAAkAgBiAGKAIcIgVBAnRBuNKAgABqIgQoAgBHDQAgBCAANgIAIAANAUEAQQAoAozQgIAAQX4gBXdxNgKM0ICAAAwCCyAJQRBBFCAJKAIQIAZGG2ogADYCACAARQ0BCyAAIAk2AhgCQCAGKAIQIgRFDQAgACAENgIQIAQgADYCGAsgBigCFCIERQ0AIABBFGogBDYCACAEIAA2AhgLIAcgA2ohAyAGIAdqIgYoAgQhBAsgBiAEQX5xNgIEIAIgA2ogAzYCACACIANBAXI2AgQCQCADQf8BSw0AIANBeHFBsNCAgABqIQQCQAJAQQAoAojQgIAAIgVBASADQQN2dCIDcQ0AQQAgBSADcjYCiNCAgAAgBCEDDAELIAQoAgghAwsgAyACNgIMIAQgAjYCCCACIAQ2AgwgAiADNgIIDAMLQR8hBAJAIANB////B0sNACADQQh2IgQgBEGA/j9qQRB2QQhxIgR0IgUgBUGA4B9qQRB2QQRxIgV0IgAgAEGAgA9qQRB2QQJxIgB0QQ92IAQgBXIgAHJrIgRBAXQgAyAEQRVqdkEBcXJBHGohBAsgAiAENgIcIAJCADcCECAEQQJ0QbjSgIAAaiEFAkBBACgCjNCAgAAiAEEBIAR0IghxDQAgBSACNgIAQQAgACAIcjYCjNCAgAAgAiAFNgIYIAIgAjYCCCACIAI2AgwMAwsgA0EAQRkgBEEBdmsgBEEfRht0IQQgBSgCACEAA0AgACIFKAIEQXhxIANGDQIgBEEddiEAIARBAXQhBCAFIABBBHFqQRBqIggoAgAiAA0ACyAIIAI2AgAgAiAFNgIYIAIgAjYCDCACIAI2AggMAgsgAEF4IABrQQ9xQQAgAEEIakEPcRsiA2oiCyAGQUhqIgggA2siA0EBcjYCBCAAIAhqQTg2AgQgBCAFQTcgBWtBD3FBACAFQUlqQQ9xG2pBQWoiCCAIIARBEGpJGyIIQSM2AgRBAEEAKALw04CAADYCpNCAgABBACADNgKU0ICAAEEAIAs2AqDQgIAAIAhBEGpBACkC0NOAgAA3AgAgCEEAKQLI04CAADcCCEEAIAhBCGo2AtDTgIAAQQAgBjYCzNOAgABBACAANgLI04CAAEEAQQA2AtTTgIAAIAhBJGohAwNAIANBBzYCACADQQRqIgMgBUkNAAsgCCAERg0DIAggCCgCBEF+cTYCBCAIIAggBGsiADYCACAEIABBAXI2AgQCQCAAQf8BSw0AIABBeHFBsNCAgABqIQMCQAJAQQAoAojQgIAAIgVBASAAQQN2dCIAcQ0AQQAgBSAAcjYCiNCAgAAgAyEFDAELIAMoAgghBQsgBSAENgIMIAMgBDYCCCAEIAM2AgwgBCAFNgIIDAQLQR8hAwJAIABB////B0sNACAAQQh2IgMgA0GA/j9qQRB2QQhxIgN0IgUgBUGA4B9qQRB2QQRxIgV0IgggCEGAgA9qQRB2QQJxIgh0QQ92IAMgBXIgCHJrIgNBAXQgACADQRVqdkEBcXJBHGohAwsgBCADNgIcIARCADcCECADQQJ0QbjSgIAAaiEFAkBBACgCjNCAgAAiCEEBIAN0IgZxDQAgBSAENgIAQQAgCCAGcjYCjNCAgAAgBCAFNgIYIAQgBDYCCCAEIAQ2AgwMBAsgAEEAQRkgA0EBdmsgA0EfRht0IQMgBSgCACEIA0AgCCIFKAIEQXhxIABGDQMgA0EddiEIIANBAXQhAyAFIAhBBHFqQRBqIgYoAgAiCA0ACyAGIAQ2AgAgBCAFNgIYIAQgBDYCDCAEIAQ2AggMAwsgBSgCCCIDIAI2AgwgBSACNgIIIAJBADYCGCACIAU2AgwgAiADNgIICyALQQhqIQMMBQsgBSgCCCIDIAQ2AgwgBSAENgIIIARBADYCGCAEIAU2AgwgBCADNgIIC0EAKAKU0ICAACIDIAJNDQBBACgCoNCAgAAiBCACaiIFIAMgAmsiA0EBcjYCBEEAIAM2ApTQgIAAQQAgBTYCoNCAgAAgBCACQQNyNgIEIARBCGohAwwDC0EAIQNBAEEwNgL404CAAAwCCwJAIAtFDQACQAJAIAggCCgCHCIFQQJ0QbjSgIAAaiIDKAIARw0AIAMgADYCACAADQFBACAHQX4gBXdxIgc2AozQgIAADAILIAtBEEEUIAsoAhAgCEYbaiAANgIAIABFDQELIAAgCzYCGAJAIAgoAhAiA0UNACAAIAM2AhAgAyAANgIYCyAIQRRqKAIAIgNFDQAgAEEUaiADNgIAIAMgADYCGAsCQAJAIARBD0sNACAIIAQgAmoiA0EDcjYCBCAIIANqIgMgAygCBEEBcjYCBAwBCyAIIAJqIgAgBEEBcjYCBCAIIAJBA3I2AgQgACAEaiAENgIAAkAgBEH/AUsNACAEQXhxQbDQgIAAaiEDAkACQEEAKAKI0ICAACIFQQEgBEEDdnQiBHENAEEAIAUgBHI2AojQgIAAIAMhBAwBCyADKAIIIQQLIAQgADYCDCADIAA2AgggACADNgIMIAAgBDYCCAwBC0EfIQMCQCAEQf///wdLDQAgBEEIdiIDIANBgP4/akEQdkEIcSIDdCIFIAVBgOAfakEQdkEEcSIFdCICIAJBgIAPakEQdkECcSICdEEPdiADIAVyIAJyayIDQQF0IAQgA0EVanZBAXFyQRxqIQMLIAAgAzYCHCAAQgA3AhAgA0ECdEG40oCAAGohBQJAIAdBASADdCICcQ0AIAUgADYCAEEAIAcgAnI2AozQgIAAIAAgBTYCGCAAIAA2AgggACAANgIMDAELIARBAEEZIANBAXZrIANBH0YbdCEDIAUoAgAhAgJAA0AgAiIFKAIEQXhxIARGDQEgA0EddiECIANBAXQhAyAFIAJBBHFqQRBqIgYoAgAiAg0ACyAGIAA2AgAgACAFNgIYIAAgADYCDCAAIAA2AggMAQsgBSgCCCIDIAA2AgwgBSAANgIIIABBADYCGCAAIAU2AgwgACADNgIICyAIQQhqIQMMAQsCQCAKRQ0AAkACQCAAIAAoAhwiBUECdEG40oCAAGoiAygCAEcNACADIAg2AgAgCA0BQQAgCUF+IAV3cTYCjNCAgAAMAgsgCkEQQRQgCigCECAARhtqIAg2AgAgCEUNAQsgCCAKNgIYAkAgACgCECIDRQ0AIAggAzYCECADIAg2AhgLIABBFGooAgAiA0UNACAIQRRqIAM2AgAgAyAINgIYCwJAAkAgBEEPSw0AIAAgBCACaiIDQQNyNgIEIAAgA2oiAyADKAIEQQFyNgIEDAELIAAgAmoiBSAEQQFyNgIEIAAgAkEDcjYCBCAFIARqIAQ2AgACQCAHRQ0AIAdBeHFBsNCAgABqIQJBACgCnNCAgAAhAwJAAkBBASAHQQN2dCIIIAZxDQBBACAIIAZyNgKI0ICAACACIQgMAQsgAigCCCEICyAIIAM2AgwgAiADNgIIIAMgAjYCDCADIAg2AggLQQAgBTYCnNCAgABBACAENgKQ0ICAAAsgAEEIaiEDCyABQRBqJICAgIAAIAMLCgAgABDJgICAAAviDQEHfwJAIABFDQAgAEF4aiIBIABBfGooAgAiAkF4cSIAaiEDAkAgAkEBcQ0AIAJBA3FFDQEgASABKAIAIgJrIgFBACgCmNCAgAAiBEkNASACIABqIQACQCABQQAoApzQgIAARg0AAkAgAkH/AUsNACABKAIIIgQgAkEDdiIFQQN0QbDQgIAAaiIGRhoCQCABKAIMIgIgBEcNAEEAQQAoAojQgIAAQX4gBXdxNgKI0ICAAAwDCyACIAZGGiACIAQ2AgggBCACNgIMDAILIAEoAhghBwJAAkAgASgCDCIGIAFGDQAgASgCCCICIARJGiAGIAI2AgggAiAGNgIMDAELAkAgAUEUaiICKAIAIgQNACABQRBqIgIoAgAiBA0AQQAhBgwBCwNAIAIhBSAEIgZBFGoiAigCACIEDQAgBkEQaiECIAYoAhAiBA0ACyAFQQA2AgALIAdFDQECQAJAIAEgASgCHCIEQQJ0QbjSgIAAaiICKAIARw0AIAIgBjYCACAGDQFBAEEAKAKM0ICAAEF+IAR3cTYCjNCAgAAMAwsgB0EQQRQgBygCECABRhtqIAY2AgAgBkUNAgsgBiAHNgIYAkAgASgCECICRQ0AIAYgAjYCECACIAY2AhgLIAEoAhQiAkUNASAGQRRqIAI2AgAgAiAGNgIYDAELIAMoAgQiAkEDcUEDRw0AIAMgAkF+cTYCBEEAIAA2ApDQgIAAIAEgAGogADYCACABIABBAXI2AgQPCyABIANPDQAgAygCBCICQQFxRQ0AAkACQCACQQJxDQACQCADQQAoAqDQgIAARw0AQQAgATYCoNCAgABBAEEAKAKU0ICAACAAaiIANgKU0ICAACABIABBAXI2AgQgAUEAKAKc0ICAAEcNA0EAQQA2ApDQgIAAQQBBADYCnNCAgAAPCwJAIANBACgCnNCAgABHDQBBACABNgKc0ICAAEEAQQAoApDQgIAAIABqIgA2ApDQgIAAIAEgAEEBcjYCBCABIABqIAA2AgAPCyACQXhxIABqIQACQAJAIAJB/wFLDQAgAygCCCIEIAJBA3YiBUEDdEGw0ICAAGoiBkYaAkAgAygCDCICIARHDQBBAEEAKAKI0ICAAEF+IAV3cTYCiNCAgAAMAgsgAiAGRhogAiAENgIIIAQgAjYCDAwBCyADKAIYIQcCQAJAIAMoAgwiBiADRg0AIAMoAggiAkEAKAKY0ICAAEkaIAYgAjYCCCACIAY2AgwMAQsCQCADQRRqIgIoAgAiBA0AIANBEGoiAigCACIEDQBBACEGDAELA0AgAiEFIAQiBkEUaiICKAIAIgQNACAGQRBqIQIgBigCECIEDQALIAVBADYCAAsgB0UNAAJAAkAgAyADKAIcIgRBAnRBuNKAgABqIgIoAgBHDQAgAiAGNgIAIAYNAUEAQQAoAozQgIAAQX4gBHdxNgKM0ICAAAwCCyAHQRBBFCAHKAIQIANGG2ogBjYCACAGRQ0BCyAGIAc2AhgCQCADKAIQIgJFDQAgBiACNgIQIAIgBjYCGAsgAygCFCICRQ0AIAZBFGogAjYCACACIAY2AhgLIAEgAGogADYCACABIABBAXI2AgQgAUEAKAKc0ICAAEcNAUEAIAA2ApDQgIAADwsgAyACQX5xNgIEIAEgAGogADYCACABIABBAXI2AgQLAkAgAEH/AUsNACAAQXhxQbDQgIAAaiECAkACQEEAKAKI0ICAACIEQQEgAEEDdnQiAHENAEEAIAQgAHI2AojQgIAAIAIhAAwBCyACKAIIIQALIAAgATYCDCACIAE2AgggASACNgIMIAEgADYCCA8LQR8hAgJAIABB////B0sNACAAQQh2IgIgAkGA/j9qQRB2QQhxIgJ0IgQgBEGA4B9qQRB2QQRxIgR0IgYgBkGAgA9qQRB2QQJxIgZ0QQ92IAIgBHIgBnJrIgJBAXQgACACQRVqdkEBcXJBHGohAgsgASACNgIcIAFCADcCECACQQJ0QbjSgIAAaiEEAkACQEEAKAKM0ICAACIGQQEgAnQiA3ENACAEIAE2AgBBACAGIANyNgKM0ICAACABIAQ2AhggASABNgIIIAEgATYCDAwBCyAAQQBBGSACQQF2ayACQR9GG3QhAiAEKAIAIQYCQANAIAYiBCgCBEF4cSAARg0BIAJBHXYhBiACQQF0IQIgBCAGQQRxakEQaiIDKAIAIgYNAAsgAyABNgIAIAEgBDYCGCABIAE2AgwgASABNgIIDAELIAQoAggiACABNgIMIAQgATYCCCABQQA2AhggASAENgIMIAEgADYCCAtBAEEAKAKo0ICAAEF/aiIBQX8gARs2AqjQgIAACwsEAAAAC04AAkAgAA0APwBBEHQPCwJAIABB//8DcQ0AIABBf0wNAAJAIABBEHZAACIAQX9HDQBBAEEwNgL404CAAEF/DwsgAEEQdA8LEMqAgIAAAAvyAgIDfwF+AkAgAkUNACAAIAE6AAAgAiAAaiIDQX9qIAE6AAAgAkEDSQ0AIAAgAToAAiAAIAE6AAEgA0F9aiABOgAAIANBfmogAToAACACQQdJDQAgACABOgADIANBfGogAToAACACQQlJDQAgAEEAIABrQQNxIgRqIgMgAUH/AXFBgYKECGwiATYCACADIAIgBGtBfHEiBGoiAkF8aiABNgIAIARBCUkNACADIAE2AgggAyABNgIEIAJBeGogATYCACACQXRqIAE2AgAgBEEZSQ0AIAMgATYCGCADIAE2AhQgAyABNgIQIAMgATYCDCACQXBqIAE2AgAgAkFsaiABNgIAIAJBaGogATYCACACQWRqIAE2AgAgBCADQQRxQRhyIgVrIgJBIEkNACABrUKBgICAEH4hBiADIAVqIQEDQCABIAY3AxggASAGNwMQIAEgBjcDCCABIAY3AwAgAUEgaiEBIAJBYGoiAkEfSw0ACwsgAAsLjkgBAEGACAuGSAEAAAACAAAAAwAAAAAAAAAAAAAABAAAAAUAAAAAAAAAAAAAAAYAAAAHAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASW52YWxpZCBjaGFyIGluIHVybCBxdWVyeQBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX2JvZHkAQ29udGVudC1MZW5ndGggb3ZlcmZsb3cAQ2h1bmsgc2l6ZSBvdmVyZmxvdwBSZXNwb25zZSBvdmVyZmxvdwBJbnZhbGlkIG1ldGhvZCBmb3IgSFRUUC94LnggcmVxdWVzdABJbnZhbGlkIG1ldGhvZCBmb3IgUlRTUC94LnggcmVxdWVzdABFeHBlY3RlZCBTT1VSQ0UgbWV0aG9kIGZvciBJQ0UveC54IHJlcXVlc3QASW52YWxpZCBjaGFyIGluIHVybCBmcmFnbWVudCBzdGFydABFeHBlY3RlZCBkb3QAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9zdGF0dXMASW52YWxpZCByZXNwb25zZSBzdGF0dXMASW52YWxpZCBjaGFyYWN0ZXIgaW4gY2h1bmsgZXh0ZW5zaW9ucwBVc2VyIGNhbGxiYWNrIGVycm9yAGBvbl9yZXNldGAgY2FsbGJhY2sgZXJyb3IAYG9uX2NodW5rX2hlYWRlcmAgY2FsbGJhY2sgZXJyb3IAYG9uX21lc3NhZ2VfYmVnaW5gIGNhbGxiYWNrIGVycm9yAGBvbl9jaHVua19leHRlbnNpb25fdmFsdWVgIGNhbGxiYWNrIGVycm9yAGBvbl9zdGF0dXNfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl92ZXJzaW9uX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fdXJsX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fY2h1bmtfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl9oZWFkZXJfdmFsdWVfY29tcGxldGVgIGNhbGxiYWNrIGVycm9yAGBvbl9tZXNzYWdlX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fbWV0aG9kX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25faGVhZGVyX2ZpZWxkX2NvbXBsZXRlYCBjYWxsYmFjayBlcnJvcgBgb25fY2h1bmtfZXh0ZW5zaW9uX25hbWVgIGNhbGxiYWNrIGVycm9yAFVuZXhwZWN0ZWQgY2hhciBpbiB1cmwgc2VydmVyAEludmFsaWQgaGVhZGVyIHZhbHVlIGNoYXIASW52YWxpZCBoZWFkZXIgZmllbGQgY2hhcgBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX3ZlcnNpb24ASW52YWxpZCBtaW5vciB2ZXJzaW9uAEludmFsaWQgbWFqb3IgdmVyc2lvbgBFeHBlY3RlZCBzcGFjZSBhZnRlciB2ZXJzaW9uAEV4cGVjdGVkIENSTEYgYWZ0ZXIgdmVyc2lvbgBJbnZhbGlkIEhUVFAgdmVyc2lvbgBJbnZhbGlkIGhlYWRlciB0b2tlbgBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX3VybABJbnZhbGlkIGNoYXJhY3RlcnMgaW4gdXJsAFVuZXhwZWN0ZWQgc3RhcnQgY2hhciBpbiB1cmwARG91YmxlIEAgaW4gdXJsAEVtcHR5IENvbnRlbnQtTGVuZ3RoAEludmFsaWQgY2hhcmFjdGVyIGluIENvbnRlbnQtTGVuZ3RoAER1cGxpY2F0ZSBDb250ZW50LUxlbmd0aABJbnZhbGlkIGNoYXIgaW4gdXJsIHBhdGgAQ29udGVudC1MZW5ndGggY2FuJ3QgYmUgcHJlc2VudCB3aXRoIFRyYW5zZmVyLUVuY29kaW5nAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIHNpemUAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9oZWFkZXJfdmFsdWUAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9jaHVua19leHRlbnNpb25fdmFsdWUASW52YWxpZCBjaGFyYWN0ZXIgaW4gY2h1bmsgZXh0ZW5zaW9ucyB2YWx1ZQBNaXNzaW5nIGV4cGVjdGVkIExGIGFmdGVyIGhlYWRlciB2YWx1ZQBJbnZhbGlkIGBUcmFuc2Zlci1FbmNvZGluZ2AgaGVhZGVyIHZhbHVlAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIGV4dGVuc2lvbnMgcXVvdGUgdmFsdWUASW52YWxpZCBjaGFyYWN0ZXIgaW4gY2h1bmsgZXh0ZW5zaW9ucyBxdW90ZWQgdmFsdWUAUGF1c2VkIGJ5IG9uX2hlYWRlcnNfY29tcGxldGUASW52YWxpZCBFT0Ygc3RhdGUAb25fcmVzZXQgcGF1c2UAb25fY2h1bmtfaGVhZGVyIHBhdXNlAG9uX21lc3NhZ2VfYmVnaW4gcGF1c2UAb25fY2h1bmtfZXh0ZW5zaW9uX3ZhbHVlIHBhdXNlAG9uX3N0YXR1c19jb21wbGV0ZSBwYXVzZQBvbl92ZXJzaW9uX2NvbXBsZXRlIHBhdXNlAG9uX3VybF9jb21wbGV0ZSBwYXVzZQBvbl9jaHVua19jb21wbGV0ZSBwYXVzZQBvbl9oZWFkZXJfdmFsdWVfY29tcGxldGUgcGF1c2UAb25fbWVzc2FnZV9jb21wbGV0ZSBwYXVzZQBvbl9tZXRob2RfY29tcGxldGUgcGF1c2UAb25faGVhZGVyX2ZpZWxkX2NvbXBsZXRlIHBhdXNlAG9uX2NodW5rX2V4dGVuc2lvbl9uYW1lIHBhdXNlAFVuZXhwZWN0ZWQgc3BhY2UgYWZ0ZXIgc3RhcnQgbGluZQBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX2NodW5rX2V4dGVuc2lvbl9uYW1lAEludmFsaWQgY2hhcmFjdGVyIGluIGNodW5rIGV4dGVuc2lvbnMgbmFtZQBQYXVzZSBvbiBDT05ORUNUL1VwZ3JhZGUAUGF1c2Ugb24gUFJJL1VwZ3JhZGUARXhwZWN0ZWQgSFRUUC8yIENvbm5lY3Rpb24gUHJlZmFjZQBTcGFuIGNhbGxiYWNrIGVycm9yIGluIG9uX21ldGhvZABFeHBlY3RlZCBzcGFjZSBhZnRlciBtZXRob2QAU3BhbiBjYWxsYmFjayBlcnJvciBpbiBvbl9oZWFkZXJfZmllbGQAUGF1c2VkAEludmFsaWQgd29yZCBlbmNvdW50ZXJlZABJbnZhbGlkIG1ldGhvZCBlbmNvdW50ZXJlZABVbmV4cGVjdGVkIGNoYXIgaW4gdXJsIHNjaGVtYQBSZXF1ZXN0IGhhcyBpbnZhbGlkIGBUcmFuc2Zlci1FbmNvZGluZ2AAU1dJVENIX1BST1hZAFVTRV9QUk9YWQBNS0FDVElWSVRZAFVOUFJPQ0VTU0FCTEVfRU5USVRZAENPUFkATU9WRURfUEVSTUFORU5UTFkAVE9PX0VBUkxZAE5PVElGWQBGQUlMRURfREVQRU5ERU5DWQBCQURfR0FURVdBWQBQTEFZAFBVVABDSEVDS09VVABHQVRFV0FZX1RJTUVPVVQAUkVRVUVTVF9USU1FT1VUAE5FVFdPUktfQ09OTkVDVF9USU1FT1VUAENPTk5FQ1RJT05fVElNRU9VVABMT0dJTl9USU1FT1VUAE5FVFdPUktfUkVBRF9USU1FT1VUAFBPU1QATUlTRElSRUNURURfUkVRVUVTVABDTElFTlRfQ0xPU0VEX1JFUVVFU1QAQ0xJRU5UX0NMT1NFRF9MT0FEX0JBTEFOQ0VEX1JFUVVFU1QAQkFEX1JFUVVFU1QASFRUUF9SRVFVRVNUX1NFTlRfVE9fSFRUUFNfUE9SVABSRVBPUlQASU1fQV9URUFQT1QAUkVTRVRfQ09OVEVOVABOT19DT05URU5UAFBBUlRJQUxfQ09OVEVOVABIUEVfSU5WQUxJRF9DT05TVEFOVABIUEVfQ0JfUkVTRVQAR0VUAEhQRV9TVFJJQ1QAQ09ORkxJQ1QAVEVNUE9SQVJZX1JFRElSRUNUAFBFUk1BTkVOVF9SRURJUkVDVABDT05ORUNUAE1VTFRJX1NUQVRVUwBIUEVfSU5WQUxJRF9TVEFUVVMAVE9PX01BTllfUkVRVUVTVFMARUFSTFlfSElOVFMAVU5BVkFJTEFCTEVfRk9SX0xFR0FMX1JFQVNPTlMAT1BUSU9OUwBTV0lUQ0hJTkdfUFJPVE9DT0xTAFZBUklBTlRfQUxTT19ORUdPVElBVEVTAE1VTFRJUExFX0NIT0lDRVMASU5URVJOQUxfU0VSVkVSX0VSUk9SAFdFQl9TRVJWRVJfVU5LTk9XTl9FUlJPUgBSQUlMR1VOX0VSUk9SAElERU5USVRZX1BST1ZJREVSX0FVVEhFTlRJQ0FUSU9OX0VSUk9SAFNTTF9DRVJUSUZJQ0FURV9FUlJPUgBJTlZBTElEX1hfRk9SV0FSREVEX0ZPUgBTRVRfUEFSQU1FVEVSAEdFVF9QQVJBTUVURVIASFBFX1VTRVIAU0VFX09USEVSAEhQRV9DQl9DSFVOS19IRUFERVIATUtDQUxFTkRBUgBTRVRVUABXRUJfU0VSVkVSX0lTX0RPV04AVEVBUkRPV04ASFBFX0NMT1NFRF9DT05ORUNUSU9OAEhFVVJJU1RJQ19FWFBJUkFUSU9OAERJU0NPTk5FQ1RFRF9PUEVSQVRJT04ATk9OX0FVVEhPUklUQVRJVkVfSU5GT1JNQVRJT04ASFBFX0lOVkFMSURfVkVSU0lPTgBIUEVfQ0JfTUVTU0FHRV9CRUdJTgBTSVRFX0lTX0ZST1pFTgBIUEVfSU5WQUxJRF9IRUFERVJfVE9LRU4ASU5WQUxJRF9UT0tFTgBGT1JCSURERU4ARU5IQU5DRV9ZT1VSX0NBTE0ASFBFX0lOVkFMSURfVVJMAEJMT0NLRURfQllfUEFSRU5UQUxfQ09OVFJPTABNS0NPTABBQ0wASFBFX0lOVEVSTkFMAFJFUVVFU1RfSEVBREVSX0ZJRUxEU19UT09fTEFSR0VfVU5PRkZJQ0lBTABIUEVfT0sAVU5MSU5LAFVOTE9DSwBQUkkAUkVUUllfV0lUSABIUEVfSU5WQUxJRF9DT05URU5UX0xFTkdUSABIUEVfVU5FWFBFQ1RFRF9DT05URU5UX0xFTkdUSABGTFVTSABQUk9QUEFUQ0gATS1TRUFSQ0gAVVJJX1RPT19MT05HAFBST0NFU1NJTkcATUlTQ0VMTEFORU9VU19QRVJTSVNURU5UX1dBUk5JTkcATUlTQ0VMTEFORU9VU19XQVJOSU5HAEhQRV9JTlZBTElEX1RSQU5TRkVSX0VOQ09ESU5HAEV4cGVjdGVkIENSTEYASFBFX0lOVkFMSURfQ0hVTktfU0laRQBNT1ZFAENPTlRJTlVFAEhQRV9DQl9TVEFUVVNfQ09NUExFVEUASFBFX0NCX0hFQURFUlNfQ09NUExFVEUASFBFX0NCX1ZFUlNJT05fQ09NUExFVEUASFBFX0NCX1VSTF9DT01QTEVURQBIUEVfQ0JfQ0hVTktfQ09NUExFVEUASFBFX0NCX0hFQURFUl9WQUxVRV9DT01QTEVURQBIUEVfQ0JfQ0hVTktfRVhURU5TSU9OX1ZBTFVFX0NPTVBMRVRFAEhQRV9DQl9DSFVOS19FWFRFTlNJT05fTkFNRV9DT01QTEVURQBIUEVfQ0JfTUVTU0FHRV9DT01QTEVURQBIUEVfQ0JfTUVUSE9EX0NPTVBMRVRFAEhQRV9DQl9IRUFERVJfRklFTERfQ09NUExFVEUAREVMRVRFAEhQRV9JTlZBTElEX0VPRl9TVEFURQBJTlZBTElEX1NTTF9DRVJUSUZJQ0FURQBQQVVTRQBOT19SRVNQT05TRQBVTlNVUFBPUlRFRF9NRURJQV9UWVBFAEdPTkUATk9UX0FDQ0VQVEFCTEUAU0VSVklDRV9VTkFWQUlMQUJMRQBSQU5HRV9OT1RfU0FUSVNGSUFCTEUAT1JJR0lOX0lTX1VOUkVBQ0hBQkxFAFJFU1BPTlNFX0lTX1NUQUxFAFBVUkdFAE1FUkdFAFJFUVVFU1RfSEVBREVSX0ZJRUxEU19UT09fTEFSR0UAUkVRVUVTVF9IRUFERVJfVE9PX0xBUkdFAFBBWUxPQURfVE9PX0xBUkdFAElOU1VGRklDSUVOVF9TVE9SQUdFAEhQRV9QQVVTRURfVVBHUkFERQBIUEVfUEFVU0VEX0gyX1VQR1JBREUAU09VUkNFAEFOTk9VTkNFAFRSQUNFAEhQRV9VTkVYUEVDVEVEX1NQQUNFAERFU0NSSUJFAFVOU1VCU0NSSUJFAFJFQ09SRABIUEVfSU5WQUxJRF9NRVRIT0QATk9UX0ZPVU5EAFBST1BGSU5EAFVOQklORABSRUJJTkQAVU5BVVRIT1JJWkVEAE1FVEhPRF9OT1RfQUxMT1dFRABIVFRQX1ZFUlNJT05fTk9UX1NVUFBPUlRFRABBTFJFQURZX1JFUE9SVEVEAEFDQ0VQVEVEAE5PVF9JTVBMRU1FTlRFRABMT09QX0RFVEVDVEVEAEhQRV9DUl9FWFBFQ1RFRABIUEVfTEZfRVhQRUNURUQAQ1JFQVRFRABJTV9VU0VEAEhQRV9QQVVTRUQAVElNRU9VVF9PQ0NVUkVEAFBBWU1FTlRfUkVRVUlSRUQAUFJFQ09ORElUSU9OX1JFUVVJUkVEAFBST1hZX0FVVEhFTlRJQ0FUSU9OX1JFUVVJUkVEAE5FVFdPUktfQVVUSEVOVElDQVRJT05fUkVRVUlSRUQATEVOR1RIX1JFUVVJUkVEAFNTTF9DRVJUSUZJQ0FURV9SRVFVSVJFRABVUEdSQURFX1JFUVVJUkVEAFBBR0VfRVhQSVJFRABQUkVDT05ESVRJT05fRkFJTEVEAEVYUEVDVEFUSU9OX0ZBSUxFRABSRVZBTElEQVRJT05fRkFJTEVEAFNTTF9IQU5EU0hBS0VfRkFJTEVEAExPQ0tFRABUUkFOU0ZPUk1BVElPTl9BUFBMSUVEAE5PVF9NT0RJRklFRABOT1RfRVhURU5ERUQAQkFORFdJRFRIX0xJTUlUX0VYQ0VFREVEAFNJVEVfSVNfT1ZFUkxPQURFRABIRUFEAEV4cGVjdGVkIEhUVFAvAABeEwAAJhMAADAQAADwFwAAnRMAABUSAAA5FwAA8BIAAAoQAAB1EgAArRIAAIITAABPFAAAfxAAAKAVAAAjFAAAiRIAAIsUAABNFQAA1BEAAM8UAAAQGAAAyRYAANwWAADBEQAA4BcAALsUAAB0FAAAfBUAAOUUAAAIFwAAHxAAAGUVAACjFAAAKBUAAAIVAACZFQAALBAAAIsZAABPDwAA1A4AAGoQAADOEAAAAhcAAIkOAABuEwAAHBMAAGYUAABWFwAAwRMAAM0TAABsEwAAaBcAAGYXAABfFwAAIhMAAM4PAABpDgAA2A4AAGMWAADLEwAAqg4AACgXAAAmFwAAxRMAAF0WAADoEQAAZxMAAGUTAADyFgAAcxMAAB0XAAD5FgAA8xEAAM8OAADOFQAADBIAALMRAAClEQAAYRAAADIXAAC7EwAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAgEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAgMCAgICAgAAAgIAAgIAAgICAgICAgICAgAEAAAAAAACAgICAgICAgICAgICAgICAgICAgICAgICAgAAAAICAgICAgICAgICAgICAgICAgICAgICAgICAgICAAIAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAIAAgICAgIAAAICAAICAAICAgICAgICAgIAAwAEAAAAAgICAgICAgICAgICAgICAgICAgICAgICAgIAAAACAgICAgICAgICAgICAgICAgICAgICAgICAgICAgACAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABsb3NlZWVwLWFsaXZlAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAgEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQFjaHVua2VkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQABAQEBAQAAAQEAAQEAAQEBAQEBAQEBAQAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGVjdGlvbmVudC1sZW5ndGhvbnJveHktY29ubmVjdGlvbgAAAAAAAAAAAAAAAAAAAHJhbnNmZXItZW5jb2RpbmdwZ3JhZGUNCg0KDQpTTQ0KDQpUVFAvQ0UvVFNQLwAAAAAAAAAAAAAAAAECAAEDAAAAAAAAAAAAAAAAAAAAAAAABAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAAAAAABAgABAwAAAAAAAAAAAAAAAAAAAAAAAAQBAQUBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAAAAAQAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAQEAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAAAAAABAAACAAAAAAAAAAAAAAAAAAAAAAAAAwQAAAQEBAQEBAQEBAQEBQQEBAQEBAQEBAQEBAAEAAYHBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAQABAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAQAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAAAAAAAAAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAEAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAgAAAAACAAAAAAAAAAAAAAAAAAAAAAADAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwAAAAAAAAMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE5PVU5DRUVDS09VVE5FQ1RFVEVDUklCRUxVU0hFVEVBRFNFQVJDSFJHRUNUSVZJVFlMRU5EQVJWRU9USUZZUFRJT05TQ0hTRUFZU1RBVENIR0VPUkRJUkVDVE9SVFJDSFBBUkFNRVRFUlVSQ0VCU0NSSUJFQVJET1dOQUNFSU5ETktDS1VCU0NSSUJFSFRUUC9BRFRQLw=="; - } -}); - -// node_modules/undici/lib/client.js -var require_client4 = __commonJS({ - "node_modules/undici/lib/client.js"(exports2, module2) { - "use strict"; - var assert = require("assert"); - var net = require("net"); - var util = require_util4(); - var timers = require_timers(); - var Request = require_request(); - var DispatcherBase = require_dispatcher_base(); - var { - RequestContentLengthMismatchError, - ResponseContentLengthMismatchError, - InvalidArgumentError, - RequestAbortedError, - HeadersTimeoutError, - HeadersOverflowError, - SocketError, - InformationalError, - BodyTimeoutError, - HTTPParserError, - ResponseExceededMaxSizeError, - ClientDestroyedError - } = require_errors(); - var buildConnector = require_connect2(); - var { - kUrl, - kReset, - kServerName, - kClient, - kBusy, - kParser, - kConnect, - kBlocking, - kResuming, - kRunning, - kPending, - kSize, - kWriting, - kQueue, - kConnected, - kConnecting, - kNeedDrain, - kNoRef, - kKeepAliveDefaultTimeout, - kHostHeader, - kPendingIdx, - kRunningIdx, - kError, - kPipelining, - kSocket, - kKeepAliveTimeoutValue, - kMaxHeadersSize, - kKeepAliveMaxTimeout, - kKeepAliveTimeoutThreshold, - kHeadersTimeout, - kBodyTimeout, - kStrictContentLength, - kConnector, - kMaxRedirections, - kMaxRequests, - kCounter, - kClose, - kDestroy, - kDispatch, - kInterceptors, - kLocalAddress, - kMaxResponseSize - } = require_symbols(); - var FastBuffer = Buffer[Symbol.species]; - var kClosedResolve = Symbol("kClosedResolve"); - var channels = {}; - try { - const diagnosticsChannel = require("diagnostics_channel"); - channels.sendHeaders = diagnosticsChannel.channel("undici:client:sendHeaders"); - channels.beforeConnect = diagnosticsChannel.channel("undici:client:beforeConnect"); - channels.connectError = diagnosticsChannel.channel("undici:client:connectError"); - channels.connected = diagnosticsChannel.channel("undici:client:connected"); - } catch { - channels.sendHeaders = { hasSubscribers: false }; - channels.beforeConnect = { hasSubscribers: false }; - channels.connectError = { hasSubscribers: false }; - channels.connected = { hasSubscribers: false }; - } - var Client = class extends DispatcherBase { - /** - * - * @param {string|URL} url - * @param {import('../types/client').Client.Options} options - */ - constructor(url, { - interceptors, - maxHeaderSize, - headersTimeout, - socketTimeout, - requestTimeout, - connectTimeout, - bodyTimeout, - idleTimeout, - keepAlive, - keepAliveTimeout, - maxKeepAliveTimeout, - keepAliveMaxTimeout, - keepAliveTimeoutThreshold, - socketPath, - pipelining, - tls, - strictContentLength, - maxCachedSessions, - maxRedirections, - connect: connect2, - maxRequestsPerClient, - localAddress, - maxResponseSize, - autoSelectFamily, - autoSelectFamilyAttemptTimeout - } = {}) { - super(); - if (keepAlive !== void 0) { - throw new InvalidArgumentError("unsupported keepAlive, use pipelining=0 instead"); - } - if (socketTimeout !== void 0) { - throw new InvalidArgumentError("unsupported socketTimeout, use headersTimeout & bodyTimeout instead"); - } - if (requestTimeout !== void 0) { - throw new InvalidArgumentError("unsupported requestTimeout, use headersTimeout & bodyTimeout instead"); - } - if (idleTimeout !== void 0) { - throw new InvalidArgumentError("unsupported idleTimeout, use keepAliveTimeout instead"); - } - if (maxKeepAliveTimeout !== void 0) { - throw new InvalidArgumentError("unsupported maxKeepAliveTimeout, use keepAliveMaxTimeout instead"); - } - if (maxHeaderSize != null && !Number.isFinite(maxHeaderSize)) { - throw new InvalidArgumentError("invalid maxHeaderSize"); - } - if (socketPath != null && typeof socketPath !== "string") { - throw new InvalidArgumentError("invalid socketPath"); - } - if (connectTimeout != null && (!Number.isFinite(connectTimeout) || connectTimeout < 0)) { - throw new InvalidArgumentError("invalid connectTimeout"); - } - if (keepAliveTimeout != null && (!Number.isFinite(keepAliveTimeout) || keepAliveTimeout <= 0)) { - throw new InvalidArgumentError("invalid keepAliveTimeout"); - } - if (keepAliveMaxTimeout != null && (!Number.isFinite(keepAliveMaxTimeout) || keepAliveMaxTimeout <= 0)) { - throw new InvalidArgumentError("invalid keepAliveMaxTimeout"); - } - if (keepAliveTimeoutThreshold != null && !Number.isFinite(keepAliveTimeoutThreshold)) { - throw new InvalidArgumentError("invalid keepAliveTimeoutThreshold"); - } - if (headersTimeout != null && (!Number.isInteger(headersTimeout) || headersTimeout < 0)) { - throw new InvalidArgumentError("headersTimeout must be a positive integer or zero"); - } - if (bodyTimeout != null && (!Number.isInteger(bodyTimeout) || bodyTimeout < 0)) { - throw new InvalidArgumentError("bodyTimeout must be a positive integer or zero"); - } - if (connect2 != null && typeof connect2 !== "function" && typeof connect2 !== "object") { - throw new InvalidArgumentError("connect must be a function or an object"); - } - if (maxRedirections != null && (!Number.isInteger(maxRedirections) || maxRedirections < 0)) { - throw new InvalidArgumentError("maxRedirections must be a positive number"); - } - if (maxRequestsPerClient != null && (!Number.isInteger(maxRequestsPerClient) || maxRequestsPerClient < 0)) { - throw new InvalidArgumentError("maxRequestsPerClient must be a positive number"); - } - if (localAddress != null && (typeof localAddress !== "string" || net.isIP(localAddress) === 0)) { - throw new InvalidArgumentError("localAddress must be valid string IP address"); - } - if (maxResponseSize != null && (!Number.isInteger(maxResponseSize) || maxResponseSize < -1)) { - throw new InvalidArgumentError("maxResponseSize must be a positive number"); - } - if (autoSelectFamilyAttemptTimeout != null && (!Number.isInteger(autoSelectFamilyAttemptTimeout) || autoSelectFamilyAttemptTimeout < -1)) { - throw new InvalidArgumentError("autoSelectFamilyAttemptTimeout must be a positive number"); - } - if (typeof connect2 !== "function") { - connect2 = buildConnector({ - ...tls, - maxCachedSessions, - socketPath, - timeout: connectTimeout, - ...util.nodeHasAutoSelectFamily && autoSelectFamily ? { autoSelectFamily, autoSelectFamilyAttemptTimeout } : void 0, - ...connect2 - }); - } - this[kInterceptors] = interceptors && interceptors.Client && Array.isArray(interceptors.Client) ? interceptors.Client : [createRedirectInterceptor({ maxRedirections })]; - this[kUrl] = util.parseOrigin(url); - this[kConnector] = connect2; - this[kSocket] = null; - this[kPipelining] = pipelining != null ? pipelining : 1; - this[kMaxHeadersSize] = maxHeaderSize || 16384; - this[kKeepAliveDefaultTimeout] = keepAliveTimeout == null ? 4e3 : keepAliveTimeout; - this[kKeepAliveMaxTimeout] = keepAliveMaxTimeout == null ? 6e5 : keepAliveMaxTimeout; - this[kKeepAliveTimeoutThreshold] = keepAliveTimeoutThreshold == null ? 1e3 : keepAliveTimeoutThreshold; - this[kKeepAliveTimeoutValue] = this[kKeepAliveDefaultTimeout]; - this[kServerName] = null; - this[kLocalAddress] = localAddress != null ? localAddress : null; - this[kResuming] = 0; - this[kNeedDrain] = 0; - this[kHostHeader] = `host: ${this[kUrl].hostname}${this[kUrl].port ? `:${this[kUrl].port}` : ""}\r -`; - this[kBodyTimeout] = bodyTimeout != null ? bodyTimeout : 3e5; - this[kHeadersTimeout] = headersTimeout != null ? headersTimeout : 3e5; - this[kStrictContentLength] = strictContentLength == null ? true : strictContentLength; - this[kMaxRedirections] = maxRedirections; - this[kMaxRequests] = maxRequestsPerClient; - this[kClosedResolve] = null; - this[kMaxResponseSize] = maxResponseSize > -1 ? maxResponseSize : -1; - this[kQueue] = []; - this[kRunningIdx] = 0; - this[kPendingIdx] = 0; - } - get pipelining() { - return this[kPipelining]; - } - set pipelining(value) { - this[kPipelining] = value; - resume(this, true); - } - get [kPending]() { - return this[kQueue].length - this[kPendingIdx]; - } - get [kRunning]() { - return this[kPendingIdx] - this[kRunningIdx]; - } - get [kSize]() { - return this[kQueue].length - this[kRunningIdx]; - } - get [kConnected]() { - return !!this[kSocket] && !this[kConnecting] && !this[kSocket].destroyed; - } - get [kBusy]() { - const socket = this[kSocket]; - return socket && (socket[kReset] || socket[kWriting] || socket[kBlocking]) || this[kSize] >= (this[kPipelining] || 1) || this[kPending] > 0; - } - /* istanbul ignore: only used for test */ - [kConnect](cb) { - connect(this); - this.once("connect", cb); - } - [kDispatch](opts, handler2) { - const origin = opts.origin || this[kUrl].origin; - const request = new Request(origin, opts, handler2); - this[kQueue].push(request); - if (this[kResuming]) { - } else if (util.bodyLength(request.body) == null && util.isIterable(request.body)) { - this[kResuming] = 1; - process.nextTick(resume, this); - } else { - resume(this, true); - } - if (this[kResuming] && this[kNeedDrain] !== 2 && this[kBusy]) { - this[kNeedDrain] = 2; - } - return this[kNeedDrain] < 2; - } - async [kClose]() { - return new Promise((resolve) => { - if (!this[kSize]) { - resolve(null); - } else { - this[kClosedResolve] = resolve; - } - }); - } - async [kDestroy](err) { - return new Promise((resolve) => { - const requests = this[kQueue].splice(this[kPendingIdx]); - for (let i = 0; i < requests.length; i++) { - const request = requests[i]; - errorRequest(this, request, err); - } - const callback = () => { - if (this[kClosedResolve]) { - this[kClosedResolve](); - this[kClosedResolve] = null; - } - resolve(); - }; - if (!this[kSocket]) { - queueMicrotask(callback); - } else { - util.destroy(this[kSocket].on("close", callback), err); - } - resume(this); - }); - } - }; - var constants = require_constants3(); - var createRedirectInterceptor = require_redirectInterceptor(); - var EMPTY_BUF = Buffer.alloc(0); - async function lazyllhttp() { - const llhttpWasmData = process.env.JEST_WORKER_ID ? require_llhttp_wasm() : void 0; - let mod2; - try { - mod2 = await WebAssembly.compile(Buffer.from(require_llhttp_simd_wasm(), "base64")); - } catch (e) { - mod2 = await WebAssembly.compile(Buffer.from(llhttpWasmData || require_llhttp_wasm(), "base64")); - } - return await WebAssembly.instantiate(mod2, { - env: { - /* eslint-disable camelcase */ - wasm_on_url: (p, at2, len) => { - return 0; - }, - wasm_on_status: (p, at2, len) => { - assert.strictEqual(currentParser.ptr, p); - const start = at2 - currentBufferPtr + currentBufferRef.byteOffset; - return currentParser.onStatus(new FastBuffer(currentBufferRef.buffer, start, len)) || 0; - }, - wasm_on_message_begin: (p) => { - assert.strictEqual(currentParser.ptr, p); - return currentParser.onMessageBegin() || 0; - }, - wasm_on_header_field: (p, at2, len) => { - assert.strictEqual(currentParser.ptr, p); - const start = at2 - currentBufferPtr + currentBufferRef.byteOffset; - return currentParser.onHeaderField(new FastBuffer(currentBufferRef.buffer, start, len)) || 0; - }, - wasm_on_header_value: (p, at2, len) => { - assert.strictEqual(currentParser.ptr, p); - const start = at2 - currentBufferPtr + currentBufferRef.byteOffset; - return currentParser.onHeaderValue(new FastBuffer(currentBufferRef.buffer, start, len)) || 0; - }, - wasm_on_headers_complete: (p, statusCode, upgrade, shouldKeepAlive) => { - assert.strictEqual(currentParser.ptr, p); - return currentParser.onHeadersComplete(statusCode, Boolean(upgrade), Boolean(shouldKeepAlive)) || 0; - }, - wasm_on_body: (p, at2, len) => { - assert.strictEqual(currentParser.ptr, p); - const start = at2 - currentBufferPtr + currentBufferRef.byteOffset; - return currentParser.onBody(new FastBuffer(currentBufferRef.buffer, start, len)) || 0; - }, - wasm_on_message_complete: (p) => { - assert.strictEqual(currentParser.ptr, p); - return currentParser.onMessageComplete() || 0; - } - /* eslint-enable camelcase */ - } - }); - } - var llhttpInstance = null; - var llhttpPromise = lazyllhttp(); - llhttpPromise.catch(); - var currentParser = null; - var currentBufferRef = null; - var currentBufferSize = 0; - var currentBufferPtr = null; - var TIMEOUT_HEADERS = 1; - var TIMEOUT_BODY = 2; - var TIMEOUT_IDLE = 3; - var Parser = class { - constructor(client, socket, { exports: exports3 }) { - assert(Number.isFinite(client[kMaxHeadersSize]) && client[kMaxHeadersSize] > 0); - this.llhttp = exports3; - this.ptr = this.llhttp.llhttp_alloc(constants.TYPE.RESPONSE); - this.client = client; - this.socket = socket; - this.timeout = null; - this.timeoutValue = null; - this.timeoutType = null; - this.statusCode = null; - this.statusText = ""; - this.upgrade = false; - this.headers = []; - this.headersSize = 0; - this.headersMaxSize = client[kMaxHeadersSize]; - this.shouldKeepAlive = false; - this.paused = false; - this.resume = this.resume.bind(this); - this.bytesRead = 0; - this.keepAlive = ""; - this.contentLength = ""; - this.connection = ""; - this.maxResponseSize = client[kMaxResponseSize]; - } - setTimeout(value, type) { - this.timeoutType = type; - if (value !== this.timeoutValue) { - timers.clearTimeout(this.timeout); - if (value) { - this.timeout = timers.setTimeout(onParserTimeout, value, this); - if (this.timeout.unref) { - this.timeout.unref(); - } - } else { - this.timeout = null; - } - this.timeoutValue = value; - } else if (this.timeout) { - if (this.timeout.refresh) { - this.timeout.refresh(); - } - } - } - resume() { - if (this.socket.destroyed || !this.paused) { - return; - } - assert(this.ptr != null); - assert(currentParser == null); - this.llhttp.llhttp_resume(this.ptr); - assert(this.timeoutType === TIMEOUT_BODY); - if (this.timeout) { - if (this.timeout.refresh) { - this.timeout.refresh(); - } - } - this.paused = false; - this.execute(this.socket.read() || EMPTY_BUF); - this.readMore(); - } - readMore() { - while (!this.paused && this.ptr) { - const chunk = this.socket.read(); - if (chunk === null) { - break; - } - this.execute(chunk); - } - } - execute(data) { - assert(this.ptr != null); - assert(currentParser == null); - assert(!this.paused); - const { socket, llhttp } = this; - if (data.length > currentBufferSize) { - if (currentBufferPtr) { - llhttp.free(currentBufferPtr); - } - currentBufferSize = Math.ceil(data.length / 4096) * 4096; - currentBufferPtr = llhttp.malloc(currentBufferSize); - } - new Uint8Array(llhttp.memory.buffer, currentBufferPtr, currentBufferSize).set(data); - try { - let ret; - try { - currentBufferRef = data; - currentParser = this; - ret = llhttp.llhttp_execute(this.ptr, currentBufferPtr, data.length); - } catch (err) { - throw err; - } finally { - currentParser = null; - currentBufferRef = null; - } - const offset = llhttp.llhttp_get_error_pos(this.ptr) - currentBufferPtr; - if (ret === constants.ERROR.PAUSED_UPGRADE) { - this.onUpgrade(data.slice(offset)); - } else if (ret === constants.ERROR.PAUSED) { - this.paused = true; - socket.unshift(data.slice(offset)); - } else if (ret !== constants.ERROR.OK) { - const ptr = llhttp.llhttp_get_error_reason(this.ptr); - let message = ""; - if (ptr) { - const len = new Uint8Array(llhttp.memory.buffer, ptr).indexOf(0); - message = "Response does not match the HTTP/1.1 protocol (" + Buffer.from(llhttp.memory.buffer, ptr, len).toString() + ")"; - } - throw new HTTPParserError(message, constants.ERROR[ret], data.slice(offset)); - } - } catch (err) { - util.destroy(socket, err); - } - } - destroy() { - assert(this.ptr != null); - assert(currentParser == null); - this.llhttp.llhttp_free(this.ptr); - this.ptr = null; - timers.clearTimeout(this.timeout); - this.timeout = null; - this.timeoutValue = null; - this.timeoutType = null; - this.paused = false; - } - onStatus(buf) { - this.statusText = buf.toString(); - } - onMessageBegin() { - const { socket, client } = this; - if (socket.destroyed) { - return -1; - } - const request = client[kQueue][client[kRunningIdx]]; - if (!request) { - return -1; - } - } - onHeaderField(buf) { - const len = this.headers.length; - if ((len & 1) === 0) { - this.headers.push(buf); - } else { - this.headers[len - 1] = Buffer.concat([this.headers[len - 1], buf]); - } - this.trackHeader(buf.length); - } - onHeaderValue(buf) { - let len = this.headers.length; - if ((len & 1) === 1) { - this.headers.push(buf); - len += 1; - } else { - this.headers[len - 1] = Buffer.concat([this.headers[len - 1], buf]); - } - const key = this.headers[len - 2]; - if (key.length === 10 && key.toString().toLowerCase() === "keep-alive") { - this.keepAlive += buf.toString(); - } else if (key.length === 10 && key.toString().toLowerCase() === "connection") { - this.connection += buf.toString(); - } else if (key.length === 14 && key.toString().toLowerCase() === "content-length") { - this.contentLength += buf.toString(); - } - this.trackHeader(buf.length); - } - trackHeader(len) { - this.headersSize += len; - if (this.headersSize >= this.headersMaxSize) { - util.destroy(this.socket, new HeadersOverflowError()); - } - } - onUpgrade(head) { - const { upgrade, client, socket, headers, statusCode } = this; - assert(upgrade); - const request = client[kQueue][client[kRunningIdx]]; - assert(request); - assert(!socket.destroyed); - assert(socket === client[kSocket]); - assert(!this.paused); - assert(request.upgrade || request.method === "CONNECT"); - this.statusCode = null; - this.statusText = ""; - this.shouldKeepAlive = null; - assert(this.headers.length % 2 === 0); - this.headers = []; - this.headersSize = 0; - socket.unshift(head); - socket[kParser].destroy(); - socket[kParser] = null; - socket[kClient] = null; - socket[kError] = null; - socket.removeListener("error", onSocketError).removeListener("readable", onSocketReadable).removeListener("end", onSocketEnd).removeListener("close", onSocketClose); - client[kSocket] = null; - client[kQueue][client[kRunningIdx]++] = null; - client.emit("disconnect", client[kUrl], [client], new InformationalError("upgrade")); - try { - request.onUpgrade(statusCode, headers, socket); - } catch (err) { - util.destroy(socket, err); - } - resume(client); - } - onHeadersComplete(statusCode, upgrade, shouldKeepAlive) { - const { client, socket, headers, statusText } = this; - if (socket.destroyed) { - return -1; - } - const request = client[kQueue][client[kRunningIdx]]; - if (!request) { - return -1; - } - assert(!this.upgrade); - assert(this.statusCode < 200); - if (statusCode === 100) { - util.destroy(socket, new SocketError("bad response", util.getSocketInfo(socket))); - return -1; - } - if (upgrade && !request.upgrade) { - util.destroy(socket, new SocketError("bad upgrade", util.getSocketInfo(socket))); - return -1; - } - assert.strictEqual(this.timeoutType, TIMEOUT_HEADERS); - this.statusCode = statusCode; - this.shouldKeepAlive = shouldKeepAlive || // Override llhttp value which does not allow keepAlive for HEAD. - request.method === "HEAD" && !socket[kReset] && this.connection.toLowerCase() === "keep-alive"; - if (this.statusCode >= 200) { - const bodyTimeout = request.bodyTimeout != null ? request.bodyTimeout : client[kBodyTimeout]; - this.setTimeout(bodyTimeout, TIMEOUT_BODY); - } else if (this.timeout) { - if (this.timeout.refresh) { - this.timeout.refresh(); - } - } - if (request.method === "CONNECT") { - assert(client[kRunning] === 1); - this.upgrade = true; - return 2; - } - if (upgrade) { - assert(client[kRunning] === 1); - this.upgrade = true; - return 2; - } - assert(this.headers.length % 2 === 0); - this.headers = []; - this.headersSize = 0; - if (this.shouldKeepAlive && client[kPipelining]) { - const keepAliveTimeout = this.keepAlive ? util.parseKeepAliveTimeout(this.keepAlive) : null; - if (keepAliveTimeout != null) { - const timeout = Math.min( - keepAliveTimeout - client[kKeepAliveTimeoutThreshold], - client[kKeepAliveMaxTimeout] - ); - if (timeout <= 0) { - socket[kReset] = true; - } else { - client[kKeepAliveTimeoutValue] = timeout; - } - } else { - client[kKeepAliveTimeoutValue] = client[kKeepAliveDefaultTimeout]; - } - } else { - socket[kReset] = true; - } - let pause; - try { - pause = request.onHeaders(statusCode, headers, this.resume, statusText) === false; - } catch (err) { - util.destroy(socket, err); - return -1; - } - if (request.method === "HEAD") { - return 1; - } - if (statusCode < 200) { - return 1; - } - if (socket[kBlocking]) { - socket[kBlocking] = false; - resume(client); - } - return pause ? constants.ERROR.PAUSED : 0; - } - onBody(buf) { - const { client, socket, statusCode, maxResponseSize } = this; - if (socket.destroyed) { - return -1; - } - const request = client[kQueue][client[kRunningIdx]]; - assert(request); - assert.strictEqual(this.timeoutType, TIMEOUT_BODY); - if (this.timeout) { - if (this.timeout.refresh) { - this.timeout.refresh(); - } - } - assert(statusCode >= 200); - if (maxResponseSize > -1 && this.bytesRead + buf.length > maxResponseSize) { - util.destroy(socket, new ResponseExceededMaxSizeError()); - return -1; - } - this.bytesRead += buf.length; - try { - if (request.onData(buf) === false) { - return constants.ERROR.PAUSED; - } - } catch (err) { - util.destroy(socket, err); - return -1; - } - } - onMessageComplete() { - const { client, socket, statusCode, upgrade, headers, contentLength, bytesRead, shouldKeepAlive } = this; - if (socket.destroyed && (!statusCode || shouldKeepAlive)) { - return -1; - } - if (upgrade) { - return; - } - const request = client[kQueue][client[kRunningIdx]]; - assert(request); - assert(statusCode >= 100); - this.statusCode = null; - this.statusText = ""; - this.bytesRead = 0; - this.contentLength = ""; - this.keepAlive = ""; - this.connection = ""; - assert(this.headers.length % 2 === 0); - this.headers = []; - this.headersSize = 0; - if (statusCode < 200) { - return; - } - if (request.method !== "HEAD" && contentLength && bytesRead !== parseInt(contentLength, 10)) { - util.destroy(socket, new ResponseContentLengthMismatchError()); - return -1; - } - try { - request.onComplete(headers); - } catch (err) { - errorRequest(client, request, err); - } - client[kQueue][client[kRunningIdx]++] = null; - if (socket[kWriting]) { - assert.strictEqual(client[kRunning], 0); - util.destroy(socket, new InformationalError("reset")); - return constants.ERROR.PAUSED; - } else if (!shouldKeepAlive) { - util.destroy(socket, new InformationalError("reset")); - return constants.ERROR.PAUSED; - } else if (socket[kReset] && client[kRunning] === 0) { - util.destroy(socket, new InformationalError("reset")); - return constants.ERROR.PAUSED; - } else if (client[kPipelining] === 1) { - setImmediate(resume, client); - } else { - resume(client); - } - } - }; - function onParserTimeout(parser) { - const { socket, timeoutType, client } = parser; - if (timeoutType === TIMEOUT_HEADERS) { - if (!socket[kWriting] || socket.writableNeedDrain || client[kRunning] > 1) { - assert(!parser.paused, "cannot be paused while waiting for headers"); - util.destroy(socket, new HeadersTimeoutError()); - } - } else if (timeoutType === TIMEOUT_BODY) { - if (!parser.paused) { - util.destroy(socket, new BodyTimeoutError()); - } - } else if (timeoutType === TIMEOUT_IDLE) { - assert(client[kRunning] === 0 && client[kKeepAliveTimeoutValue]); - util.destroy(socket, new InformationalError("socket idle timeout")); - } - } - function onSocketReadable() { - const { [kParser]: parser } = this; - parser.readMore(); - } - function onSocketError(err) { - const { [kParser]: parser } = this; - assert(err.code !== "ERR_TLS_CERT_ALTNAME_INVALID"); - if (err.code === "ECONNRESET" && parser.statusCode && !parser.shouldKeepAlive) { - parser.onMessageComplete(); - return; - } - this[kError] = err; - onError(this[kClient], err); - } - function onError(client, err) { - if (client[kRunning] === 0 && err.code !== "UND_ERR_INFO" && err.code !== "UND_ERR_SOCKET") { - assert(client[kPendingIdx] === client[kRunningIdx]); - const requests = client[kQueue].splice(client[kRunningIdx]); - for (let i = 0; i < requests.length; i++) { - const request = requests[i]; - errorRequest(client, request, err); - } - assert(client[kSize] === 0); - } - } - function onSocketEnd() { - const { [kParser]: parser } = this; - if (parser.statusCode && !parser.shouldKeepAlive) { - parser.onMessageComplete(); - return; - } - util.destroy(this, new SocketError("other side closed", util.getSocketInfo(this))); - } - function onSocketClose() { - const { [kClient]: client } = this; - if (!this[kError] && this[kParser].statusCode && !this[kParser].shouldKeepAlive) { - this[kParser].onMessageComplete(); - } - this[kParser].destroy(); - this[kParser] = null; - const err = this[kError] || new SocketError("closed", util.getSocketInfo(this)); - client[kSocket] = null; - if (client.destroyed) { - assert(client[kPending] === 0); - const requests = client[kQueue].splice(client[kRunningIdx]); - for (let i = 0; i < requests.length; i++) { - const request = requests[i]; - errorRequest(client, request, err); - } - } else if (client[kRunning] > 0 && err.code !== "UND_ERR_INFO") { - const request = client[kQueue][client[kRunningIdx]]; - client[kQueue][client[kRunningIdx]++] = null; - errorRequest(client, request, err); - } - client[kPendingIdx] = client[kRunningIdx]; - assert(client[kRunning] === 0); - client.emit("disconnect", client[kUrl], [client], err); - resume(client); - } - async function connect(client) { - assert(!client[kConnecting]); - assert(!client[kSocket]); - let { host, hostname, protocol, port } = client[kUrl]; - if (hostname[0] === "[") { - const idx = hostname.indexOf("]"); - assert(idx !== -1); - const ip2 = hostname.substr(1, idx - 1); - assert(net.isIP(ip2)); - hostname = ip2; - } - client[kConnecting] = true; - if (channels.beforeConnect.hasSubscribers) { - channels.beforeConnect.publish({ - connectParams: { - host, - hostname, - protocol, - port, - servername: client[kServerName], - localAddress: client[kLocalAddress] - }, - connector: client[kConnector] - }); - } - try { - const socket = await new Promise((resolve, reject) => { - client[kConnector]({ - host, - hostname, - protocol, - port, - servername: client[kServerName], - localAddress: client[kLocalAddress] - }, (err, socket2) => { - if (err) { - reject(err); - } else { - resolve(socket2); - } - }); - }); - if (client.destroyed) { - util.destroy(socket.on("error", () => { - }), new ClientDestroyedError()); - return; - } - if (!llhttpInstance) { - llhttpInstance = await llhttpPromise; - llhttpPromise = null; - } - client[kConnecting] = false; - assert(socket); - socket[kNoRef] = false; - socket[kWriting] = false; - socket[kReset] = false; - socket[kBlocking] = false; - socket[kError] = null; - socket[kParser] = new Parser(client, socket, llhttpInstance); - socket[kClient] = client; - socket[kCounter] = 0; - socket[kMaxRequests] = client[kMaxRequests]; - socket.on("error", onSocketError).on("readable", onSocketReadable).on("end", onSocketEnd).on("close", onSocketClose); - client[kSocket] = socket; - if (channels.connected.hasSubscribers) { - channels.connected.publish({ - connectParams: { - host, - hostname, - protocol, - port, - servername: client[kServerName], - localAddress: client[kLocalAddress] - }, - connector: client[kConnector], - socket - }); - } - client.emit("connect", client[kUrl], [client]); - } catch (err) { - if (client.destroyed) { - return; - } - client[kConnecting] = false; - if (channels.connectError.hasSubscribers) { - channels.connectError.publish({ - connectParams: { - host, - hostname, - protocol, - port, - servername: client[kServerName], - localAddress: client[kLocalAddress] - }, - connector: client[kConnector], - error: err - }); - } - if (err.code === "ERR_TLS_CERT_ALTNAME_INVALID") { - assert(client[kRunning] === 0); - while (client[kPending] > 0 && client[kQueue][client[kPendingIdx]].servername === client[kServerName]) { - const request = client[kQueue][client[kPendingIdx]++]; - errorRequest(client, request, err); - } - } else { - onError(client, err); - } - client.emit("connectionError", client[kUrl], [client], err); - } - resume(client); - } - function emitDrain(client) { - client[kNeedDrain] = 0; - client.emit("drain", client[kUrl], [client]); - } - function resume(client, sync) { - if (client[kResuming] === 2) { - return; - } - client[kResuming] = 2; - _resume(client, sync); - client[kResuming] = 0; - if (client[kRunningIdx] > 256) { - client[kQueue].splice(0, client[kRunningIdx]); - client[kPendingIdx] -= client[kRunningIdx]; - client[kRunningIdx] = 0; - } - } - function _resume(client, sync) { - while (true) { - if (client.destroyed) { - assert(client[kPending] === 0); - return; - } - if (client[kClosedResolve] && !client[kSize]) { - client[kClosedResolve](); - client[kClosedResolve] = null; - return; - } - const socket = client[kSocket]; - if (socket && !socket.destroyed) { - if (client[kSize] === 0) { - if (!socket[kNoRef] && socket.unref) { - socket.unref(); - socket[kNoRef] = true; - } - } else if (socket[kNoRef] && socket.ref) { - socket.ref(); - socket[kNoRef] = false; - } - if (client[kSize] === 0) { - if (socket[kParser].timeoutType !== TIMEOUT_IDLE) { - socket[kParser].setTimeout(client[kKeepAliveTimeoutValue], TIMEOUT_IDLE); - } - } else if (client[kRunning] > 0 && socket[kParser].statusCode < 200) { - if (socket[kParser].timeoutType !== TIMEOUT_HEADERS) { - const request2 = client[kQueue][client[kRunningIdx]]; - const headersTimeout = request2.headersTimeout != null ? request2.headersTimeout : client[kHeadersTimeout]; - socket[kParser].setTimeout(headersTimeout, TIMEOUT_HEADERS); - } - } - } - if (client[kBusy]) { - client[kNeedDrain] = 2; - } else if (client[kNeedDrain] === 2) { - if (sync) { - client[kNeedDrain] = 1; - process.nextTick(emitDrain, client); - } else { - emitDrain(client); - } - continue; - } - if (client[kPending] === 0) { - return; - } - if (client[kRunning] >= (client[kPipelining] || 1)) { - return; - } - const request = client[kQueue][client[kPendingIdx]]; - if (client[kUrl].protocol === "https:" && client[kServerName] !== request.servername) { - if (client[kRunning] > 0) { - return; - } - client[kServerName] = request.servername; - if (socket && socket.servername !== request.servername) { - util.destroy(socket, new InformationalError("servername changed")); - return; - } - } - if (client[kConnecting]) { - return; - } - if (!socket) { - connect(client); - return; - } - if (socket.destroyed || socket[kWriting] || socket[kReset] || socket[kBlocking]) { - return; - } - if (client[kRunning] > 0 && !request.idempotent) { - return; - } - if (client[kRunning] > 0 && (request.upgrade || request.method === "CONNECT")) { - return; - } - if (util.isStream(request.body) && util.bodyLength(request.body) === 0) { - request.body.on( - "data", - /* istanbul ignore next */ - function() { - assert(false); - } - ).on("error", function(err) { - errorRequest(client, request, err); - }).on("end", function() { - util.destroy(this); - }); - request.body = null; - } - if (client[kRunning] > 0 && (util.isStream(request.body) || util.isAsyncIterable(request.body))) { - return; - } - if (!request.aborted && write(client, request)) { - client[kPendingIdx]++; - } else { - client[kQueue].splice(client[kPendingIdx], 1); - } - } - } - function write(client, request) { - const { body, method, path, host, upgrade, headers, blocking, reset } = request; - const expectsPayload = method === "PUT" || method === "POST" || method === "PATCH"; - if (body && typeof body.read === "function") { - body.read(0); - } - let contentLength = util.bodyLength(body); - if (contentLength === null) { - contentLength = request.contentLength; - } - if (contentLength === 0 && !expectsPayload) { - contentLength = null; - } - if (request.contentLength !== null && request.contentLength !== contentLength) { - if (client[kStrictContentLength]) { - errorRequest(client, request, new RequestContentLengthMismatchError()); - return false; - } - process.emitWarning(new RequestContentLengthMismatchError()); - } - const socket = client[kSocket]; - try { - request.onConnect((err) => { - if (request.aborted || request.completed) { - return; - } - errorRequest(client, request, err || new RequestAbortedError()); - util.destroy(socket, new InformationalError("aborted")); - }); - } catch (err) { - errorRequest(client, request, err); - } - if (request.aborted) { - return false; - } - if (method === "HEAD") { - socket[kReset] = true; - } - if (upgrade || method === "CONNECT") { - socket[kReset] = true; - } - if (reset != null) { - socket[kReset] = reset; - } - if (client[kMaxRequests] && socket[kCounter]++ >= client[kMaxRequests]) { - socket[kReset] = true; - } - if (blocking) { - socket[kBlocking] = true; - } - let header = `${method} ${path} HTTP/1.1\r -`; - if (typeof host === "string") { - header += `host: ${host}\r -`; - } else { - header += client[kHostHeader]; - } - if (upgrade) { - header += `connection: upgrade\r -upgrade: ${upgrade}\r -`; - } else if (client[kPipelining] && !socket[kReset]) { - header += "connection: keep-alive\r\n"; - } else { - header += "connection: close\r\n"; - } - if (headers) { - header += headers; - } - if (channels.sendHeaders.hasSubscribers) { - channels.sendHeaders.publish({ request, headers: header, socket }); - } - if (!body) { - if (contentLength === 0) { - socket.write(`${header}content-length: 0\r -\r -`, "latin1"); - } else { - assert(contentLength === null, "no body must not have content length"); - socket.write(`${header}\r -`, "latin1"); - } - request.onRequestSent(); - } else if (util.isBuffer(body)) { - assert(contentLength === body.byteLength, "buffer body must have content length"); - socket.cork(); - socket.write(`${header}content-length: ${contentLength}\r -\r -`, "latin1"); - socket.write(body); - socket.uncork(); - request.onBodySent(body); - request.onRequestSent(); - if (!expectsPayload) { - socket[kReset] = true; - } - } else if (util.isBlobLike(body)) { - if (typeof body.stream === "function") { - writeIterable({ body: body.stream(), client, request, socket, contentLength, header, expectsPayload }); - } else { - writeBlob({ body, client, request, socket, contentLength, header, expectsPayload }); - } - } else if (util.isStream(body)) { - writeStream({ body, client, request, socket, contentLength, header, expectsPayload }); - } else if (util.isIterable(body)) { - writeIterable({ body, client, request, socket, contentLength, header, expectsPayload }); - } else { - assert(false); - } - return true; - } - function writeStream({ body, client, request, socket, contentLength, header, expectsPayload }) { - assert(contentLength !== 0 || client[kRunning] === 0, "stream body cannot be pipelined"); - let finished = false; - const writer = new AsyncWriter({ socket, request, contentLength, client, expectsPayload, header }); - const onData = function(chunk) { - if (finished) { - return; - } - try { - if (!writer.write(chunk) && this.pause) { - this.pause(); - } - } catch (err) { - util.destroy(this, err); - } - }; - const onDrain = function() { - if (finished) { - return; - } - if (body.resume) { - body.resume(); - } - }; - const onAbort = function() { - onFinished(new RequestAbortedError()); - }; - const onFinished = function(err) { - if (finished) { - return; - } - finished = true; - assert(socket.destroyed || socket[kWriting] && client[kRunning] <= 1); - socket.off("drain", onDrain).off("error", onFinished); - body.removeListener("data", onData).removeListener("end", onFinished).removeListener("error", onFinished).removeListener("close", onAbort); - if (!err) { - try { - writer.end(); - } catch (er) { - err = er; - } - } - writer.destroy(err); - if (err && (err.code !== "UND_ERR_INFO" || err.message !== "reset")) { - util.destroy(body, err); - } else { - util.destroy(body); - } - }; - body.on("data", onData).on("end", onFinished).on("error", onFinished).on("close", onAbort); - if (body.resume) { - body.resume(); - } - socket.on("drain", onDrain).on("error", onFinished); - } - async function writeBlob({ body, client, request, socket, contentLength, header, expectsPayload }) { - assert(contentLength === body.size, "blob body must have content length"); - try { - if (contentLength != null && contentLength !== body.size) { - throw new RequestContentLengthMismatchError(); - } - const buffer = Buffer.from(await body.arrayBuffer()); - socket.cork(); - socket.write(`${header}content-length: ${contentLength}\r -\r -`, "latin1"); - socket.write(buffer); - socket.uncork(); - request.onBodySent(buffer); - request.onRequestSent(); - if (!expectsPayload) { - socket[kReset] = true; - } - resume(client); - } catch (err) { - util.destroy(socket, err); - } - } - async function writeIterable({ body, client, request, socket, contentLength, header, expectsPayload }) { - assert(contentLength !== 0 || client[kRunning] === 0, "iterator body cannot be pipelined"); - let callback = null; - function onDrain() { - if (callback) { - const cb = callback; - callback = null; - cb(); - } - } - const waitForDrain = () => new Promise((resolve, reject) => { - assert(callback === null); - if (socket[kError]) { - reject(socket[kError]); - } else { - callback = resolve; - } - }); - socket.on("close", onDrain).on("drain", onDrain); - const writer = new AsyncWriter({ socket, request, contentLength, client, expectsPayload, header }); - try { - for await (const chunk of body) { - if (socket[kError]) { - throw socket[kError]; - } - if (!writer.write(chunk)) { - await waitForDrain(); - } - } - writer.end(); - } catch (err) { - writer.destroy(err); - } finally { - socket.off("close", onDrain).off("drain", onDrain); - } - } - var AsyncWriter = class { - constructor({ socket, request, contentLength, client, expectsPayload, header }) { - this.socket = socket; - this.request = request; - this.contentLength = contentLength; - this.client = client; - this.bytesWritten = 0; - this.expectsPayload = expectsPayload; - this.header = header; - socket[kWriting] = true; - } - write(chunk) { - const { socket, request, contentLength, client, bytesWritten, expectsPayload, header } = this; - if (socket[kError]) { - throw socket[kError]; - } - if (socket.destroyed) { - return false; - } - const len = Buffer.byteLength(chunk); - if (!len) { - return true; - } - if (contentLength !== null && bytesWritten + len > contentLength) { - if (client[kStrictContentLength]) { - throw new RequestContentLengthMismatchError(); - } - process.emitWarning(new RequestContentLengthMismatchError()); - } - socket.cork(); - if (bytesWritten === 0) { - if (!expectsPayload) { - socket[kReset] = true; - } - if (contentLength === null) { - socket.write(`${header}transfer-encoding: chunked\r -`, "latin1"); - } else { - socket.write(`${header}content-length: ${contentLength}\r -\r -`, "latin1"); - } - } - if (contentLength === null) { - socket.write(`\r -${len.toString(16)}\r -`, "latin1"); - } - this.bytesWritten += len; - const ret = socket.write(chunk); - socket.uncork(); - request.onBodySent(chunk); - if (!ret) { - if (socket[kParser].timeout && socket[kParser].timeoutType === TIMEOUT_HEADERS) { - if (socket[kParser].timeout.refresh) { - socket[kParser].timeout.refresh(); - } - } - } - return ret; - } - end() { - const { socket, contentLength, client, bytesWritten, expectsPayload, header, request } = this; - request.onRequestSent(); - socket[kWriting] = false; - if (socket[kError]) { - throw socket[kError]; - } - if (socket.destroyed) { - return; - } - if (bytesWritten === 0) { - if (expectsPayload) { - socket.write(`${header}content-length: 0\r -\r -`, "latin1"); - } else { - socket.write(`${header}\r -`, "latin1"); - } - } else if (contentLength === null) { - socket.write("\r\n0\r\n\r\n", "latin1"); - } - if (contentLength !== null && bytesWritten !== contentLength) { - if (client[kStrictContentLength]) { - throw new RequestContentLengthMismatchError(); - } else { - process.emitWarning(new RequestContentLengthMismatchError()); - } - } - if (socket[kParser].timeout && socket[kParser].timeoutType === TIMEOUT_HEADERS) { - if (socket[kParser].timeout.refresh) { - socket[kParser].timeout.refresh(); - } - } - resume(client); - } - destroy(err) { - const { socket, client } = this; - socket[kWriting] = false; - if (err) { - assert(client[kRunning] <= 1, "pipeline should only contain this request"); - util.destroy(socket, err); - } - } - }; - function errorRequest(client, request, err) { - try { - request.onError(err); - assert(request.aborted); - } catch (err2) { - client.emit("error", err2); - } - } - module2.exports = Client; - } -}); - -// node_modules/undici/lib/node/fixed-queue.js -var require_fixed_queue = __commonJS({ - "node_modules/undici/lib/node/fixed-queue.js"(exports2, module2) { - "use strict"; - var kSize = 2048; - var kMask = kSize - 1; - var FixedCircularBuffer = class { - constructor() { - this.bottom = 0; - this.top = 0; - this.list = new Array(kSize); - this.next = null; - } - isEmpty() { - return this.top === this.bottom; - } - isFull() { - return (this.top + 1 & kMask) === this.bottom; - } - push(data) { - this.list[this.top] = data; - this.top = this.top + 1 & kMask; - } - shift() { - const nextItem = this.list[this.bottom]; - if (nextItem === void 0) - return null; - this.list[this.bottom] = void 0; - this.bottom = this.bottom + 1 & kMask; - return nextItem; - } - }; - module2.exports = class FixedQueue { - constructor() { - this.head = this.tail = new FixedCircularBuffer(); - } - isEmpty() { - return this.head.isEmpty(); - } - push(data) { - if (this.head.isFull()) { - this.head = this.head.next = new FixedCircularBuffer(); - } - this.head.push(data); - } - shift() { - const tail = this.tail; - const next = tail.shift(); - if (tail.isEmpty() && tail.next !== null) { - this.tail = tail.next; - } - return next; - } - }; - } -}); - -// node_modules/undici/lib/pool-stats.js -var require_pool_stats = __commonJS({ - "node_modules/undici/lib/pool-stats.js"(exports2, module2) { - var { kFree, kConnected, kPending, kQueued, kRunning, kSize } = require_symbols(); - var kPool = Symbol("pool"); - var PoolStats = class { - constructor(pool) { - this[kPool] = pool; - } - get connected() { - return this[kPool][kConnected]; - } - get free() { - return this[kPool][kFree]; - } - get pending() { - return this[kPool][kPending]; - } - get queued() { - return this[kPool][kQueued]; - } - get running() { - return this[kPool][kRunning]; - } - get size() { - return this[kPool][kSize]; - } - }; - module2.exports = PoolStats; - } -}); - -// node_modules/undici/lib/pool-base.js -var require_pool_base = __commonJS({ - "node_modules/undici/lib/pool-base.js"(exports2, module2) { - "use strict"; - var DispatcherBase = require_dispatcher_base(); - var FixedQueue = require_fixed_queue(); - var { kConnected, kSize, kRunning, kPending, kQueued, kBusy, kFree, kUrl, kClose, kDestroy, kDispatch } = require_symbols(); - var PoolStats = require_pool_stats(); - var kClients = Symbol("clients"); - var kNeedDrain = Symbol("needDrain"); - var kQueue = Symbol("queue"); - var kClosedResolve = Symbol("closed resolve"); - var kOnDrain = Symbol("onDrain"); - var kOnConnect = Symbol("onConnect"); - var kOnDisconnect = Symbol("onDisconnect"); - var kOnConnectionError = Symbol("onConnectionError"); - var kGetDispatcher = Symbol("get dispatcher"); - var kAddClient = Symbol("add client"); - var kRemoveClient = Symbol("remove client"); - var kStats = Symbol("stats"); - var PoolBase = class extends DispatcherBase { - constructor() { - super(); - this[kQueue] = new FixedQueue(); - this[kClients] = []; - this[kQueued] = 0; - const pool = this; - this[kOnDrain] = function onDrain(origin, targets) { - const queue = pool[kQueue]; - let needDrain = false; - while (!needDrain) { - const item = queue.shift(); - if (!item) { - break; - } - pool[kQueued]--; - needDrain = !this.dispatch(item.opts, item.handler); - } - this[kNeedDrain] = needDrain; - if (!this[kNeedDrain] && pool[kNeedDrain]) { - pool[kNeedDrain] = false; - pool.emit("drain", origin, [pool, ...targets]); - } - if (pool[kClosedResolve] && queue.isEmpty()) { - Promise.all(pool[kClients].map((c) => c.close())).then(pool[kClosedResolve]); - } - }; - this[kOnConnect] = (origin, targets) => { - pool.emit("connect", origin, [pool, ...targets]); - }; - this[kOnDisconnect] = (origin, targets, err) => { - pool.emit("disconnect", origin, [pool, ...targets], err); - }; - this[kOnConnectionError] = (origin, targets, err) => { - pool.emit("connectionError", origin, [pool, ...targets], err); - }; - this[kStats] = new PoolStats(this); - } - get [kBusy]() { - return this[kNeedDrain]; - } - get [kConnected]() { - return this[kClients].filter((client) => client[kConnected]).length; - } - get [kFree]() { - return this[kClients].filter((client) => client[kConnected] && !client[kNeedDrain]).length; - } - get [kPending]() { - let ret = this[kQueued]; - for (const { [kPending]: pending } of this[kClients]) { - ret += pending; - } - return ret; - } - get [kRunning]() { - let ret = 0; - for (const { [kRunning]: running } of this[kClients]) { - ret += running; - } - return ret; - } - get [kSize]() { - let ret = this[kQueued]; - for (const { [kSize]: size } of this[kClients]) { - ret += size; - } - return ret; - } - get stats() { - return this[kStats]; - } - async [kClose]() { - if (this[kQueue].isEmpty()) { - return Promise.all(this[kClients].map((c) => c.close())); - } else { - return new Promise((resolve) => { - this[kClosedResolve] = resolve; - }); - } - } - async [kDestroy](err) { - while (true) { - const item = this[kQueue].shift(); - if (!item) { - break; - } - item.handler.onError(err); - } - return Promise.all(this[kClients].map((c) => c.destroy(err))); - } - [kDispatch](opts, handler2) { - const dispatcher = this[kGetDispatcher](); - if (!dispatcher) { - this[kNeedDrain] = true; - this[kQueue].push({ opts, handler: handler2 }); - this[kQueued]++; - } else if (!dispatcher.dispatch(opts, handler2)) { - dispatcher[kNeedDrain] = true; - this[kNeedDrain] = !this[kGetDispatcher](); - } - return !this[kNeedDrain]; - } - [kAddClient](client) { - client.on("drain", this[kOnDrain]).on("connect", this[kOnConnect]).on("disconnect", this[kOnDisconnect]).on("connectionError", this[kOnConnectionError]); - this[kClients].push(client); - if (this[kNeedDrain]) { - process.nextTick(() => { - if (this[kNeedDrain]) { - this[kOnDrain](client[kUrl], [this, client]); - } - }); - } - return this; - } - [kRemoveClient](client) { - client.close(() => { - const idx = this[kClients].indexOf(client); - if (idx !== -1) { - this[kClients].splice(idx, 1); - } - }); - this[kNeedDrain] = this[kClients].some((dispatcher) => !dispatcher[kNeedDrain] && dispatcher.closed !== true && dispatcher.destroyed !== true); - } - }; - module2.exports = { - PoolBase, - kClients, - kNeedDrain, - kAddClient, - kRemoveClient, - kGetDispatcher - }; - } -}); - -// node_modules/undici/lib/pool.js -var require_pool2 = __commonJS({ - "node_modules/undici/lib/pool.js"(exports2, module2) { - "use strict"; - var { - PoolBase, - kClients, - kNeedDrain, - kAddClient, - kGetDispatcher - } = require_pool_base(); - var Client = require_client4(); - var { - InvalidArgumentError - } = require_errors(); - var util = require_util4(); - var { kUrl, kInterceptors } = require_symbols(); - var buildConnector = require_connect2(); - var kOptions = Symbol("options"); - var kConnections = Symbol("connections"); - var kFactory = Symbol("factory"); - function defaultFactory(origin, opts) { - return new Client(origin, opts); - } - var Pool = class extends PoolBase { - constructor(origin, { - connections, - factory = defaultFactory, - connect, - connectTimeout, - tls, - maxCachedSessions, - socketPath, - autoSelectFamily, - autoSelectFamilyAttemptTimeout, - ...options2 - } = {}) { - super(); - if (connections != null && (!Number.isFinite(connections) || connections < 0)) { - throw new InvalidArgumentError("invalid connections"); - } - if (typeof factory !== "function") { - throw new InvalidArgumentError("factory must be a function."); - } - if (connect != null && typeof connect !== "function" && typeof connect !== "object") { - throw new InvalidArgumentError("connect must be a function or an object"); - } - if (typeof connect !== "function") { - connect = buildConnector({ - ...tls, - maxCachedSessions, - socketPath, - timeout: connectTimeout == null ? 1e4 : connectTimeout, - ...util.nodeHasAutoSelectFamily && autoSelectFamily ? { autoSelectFamily, autoSelectFamilyAttemptTimeout } : void 0, - ...connect - }); - } - this[kInterceptors] = options2.interceptors && options2.interceptors.Pool && Array.isArray(options2.interceptors.Pool) ? options2.interceptors.Pool : []; - this[kConnections] = connections || null; - this[kUrl] = util.parseOrigin(origin); - this[kOptions] = { ...util.deepClone(options2), connect }; - this[kOptions].interceptors = options2.interceptors ? { ...options2.interceptors } : void 0; - this[kFactory] = factory; - } - [kGetDispatcher]() { - let dispatcher = this[kClients].find((dispatcher2) => !dispatcher2[kNeedDrain]); - if (dispatcher) { - return dispatcher; - } - if (!this[kConnections] || this[kClients].length < this[kConnections]) { - dispatcher = this[kFactory](this[kUrl], this[kOptions]); - this[kAddClient](dispatcher); - } - return dispatcher; - } - }; - module2.exports = Pool; - } -}); - -// node_modules/undici/lib/balanced-pool.js -var require_balanced_pool = __commonJS({ - "node_modules/undici/lib/balanced-pool.js"(exports2, module2) { - "use strict"; - var { - BalancedPoolMissingUpstreamError, - InvalidArgumentError - } = require_errors(); - var { - PoolBase, - kClients, - kNeedDrain, - kAddClient, - kRemoveClient, - kGetDispatcher - } = require_pool_base(); - var Pool = require_pool2(); - var { kUrl, kInterceptors } = require_symbols(); - var { parseOrigin } = require_util4(); - var kFactory = Symbol("factory"); - var kOptions = Symbol("options"); - var kGreatestCommonDivisor = Symbol("kGreatestCommonDivisor"); - var kCurrentWeight = Symbol("kCurrentWeight"); - var kIndex = Symbol("kIndex"); - var kWeight = Symbol("kWeight"); - var kMaxWeightPerServer = Symbol("kMaxWeightPerServer"); - var kErrorPenalty = Symbol("kErrorPenalty"); - function getGreatestCommonDivisor(a, b) { - if (b === 0) - return a; - return getGreatestCommonDivisor(b, a % b); - } - function defaultFactory(origin, opts) { - return new Pool(origin, opts); - } - var BalancedPool = class extends PoolBase { - constructor(upstreams = [], { factory = defaultFactory, ...opts } = {}) { - super(); - this[kOptions] = opts; - this[kIndex] = -1; - this[kCurrentWeight] = 0; - this[kMaxWeightPerServer] = this[kOptions].maxWeightPerServer || 100; - this[kErrorPenalty] = this[kOptions].errorPenalty || 15; - if (!Array.isArray(upstreams)) { - upstreams = [upstreams]; - } - if (typeof factory !== "function") { - throw new InvalidArgumentError("factory must be a function."); - } - this[kInterceptors] = opts.interceptors && opts.interceptors.BalancedPool && Array.isArray(opts.interceptors.BalancedPool) ? opts.interceptors.BalancedPool : []; - this[kFactory] = factory; - for (const upstream of upstreams) { - this.addUpstream(upstream); - } - this._updateBalancedPoolStats(); - } - addUpstream(upstream) { - const upstreamOrigin = parseOrigin(upstream).origin; - if (this[kClients].find((pool2) => pool2[kUrl].origin === upstreamOrigin && pool2.closed !== true && pool2.destroyed !== true)) { - return this; - } - const pool = this[kFactory](upstreamOrigin, Object.assign({}, this[kOptions])); - this[kAddClient](pool); - pool.on("connect", () => { - pool[kWeight] = Math.min(this[kMaxWeightPerServer], pool[kWeight] + this[kErrorPenalty]); - }); - pool.on("connectionError", () => { - pool[kWeight] = Math.max(1, pool[kWeight] - this[kErrorPenalty]); - this._updateBalancedPoolStats(); - }); - pool.on("disconnect", (...args) => { - const err = args[2]; - if (err && err.code === "UND_ERR_SOCKET") { - pool[kWeight] = Math.max(1, pool[kWeight] - this[kErrorPenalty]); - this._updateBalancedPoolStats(); - } - }); - for (const client of this[kClients]) { - client[kWeight] = this[kMaxWeightPerServer]; - } - this._updateBalancedPoolStats(); - return this; - } - _updateBalancedPoolStats() { - this[kGreatestCommonDivisor] = this[kClients].map((p) => p[kWeight]).reduce(getGreatestCommonDivisor, 0); - } - removeUpstream(upstream) { - const upstreamOrigin = parseOrigin(upstream).origin; - const pool = this[kClients].find((pool2) => pool2[kUrl].origin === upstreamOrigin && pool2.closed !== true && pool2.destroyed !== true); - if (pool) { - this[kRemoveClient](pool); - } - return this; - } - get upstreams() { - return this[kClients].filter((dispatcher) => dispatcher.closed !== true && dispatcher.destroyed !== true).map((p) => p[kUrl].origin); - } - [kGetDispatcher]() { - if (this[kClients].length === 0) { - throw new BalancedPoolMissingUpstreamError(); - } - const dispatcher = this[kClients].find((dispatcher2) => !dispatcher2[kNeedDrain] && dispatcher2.closed !== true && dispatcher2.destroyed !== true); - if (!dispatcher) { - return; - } - const allClientsBusy = this[kClients].map((pool) => pool[kNeedDrain]).reduce((a, b) => a && b, true); - if (allClientsBusy) { - return; - } - let counter = 0; - let maxWeightIndex = this[kClients].findIndex((pool) => !pool[kNeedDrain]); - while (counter++ < this[kClients].length) { - this[kIndex] = (this[kIndex] + 1) % this[kClients].length; - const pool = this[kClients][this[kIndex]]; - if (pool[kWeight] > this[kClients][maxWeightIndex][kWeight] && !pool[kNeedDrain]) { - maxWeightIndex = this[kIndex]; - } - if (this[kIndex] === 0) { - this[kCurrentWeight] = this[kCurrentWeight] - this[kGreatestCommonDivisor]; - if (this[kCurrentWeight] <= 0) { - this[kCurrentWeight] = this[kMaxWeightPerServer]; - } - } - if (pool[kWeight] >= this[kCurrentWeight] && !pool[kNeedDrain]) { - return pool; - } - } - this[kCurrentWeight] = this[kClients][maxWeightIndex][kWeight]; - this[kIndex] = maxWeightIndex; - return this[kClients][maxWeightIndex]; - } - }; - module2.exports = BalancedPool; - } -}); - -// node_modules/undici/lib/compat/dispatcher-weakref.js -var require_dispatcher_weakref = __commonJS({ - "node_modules/undici/lib/compat/dispatcher-weakref.js"(exports2, module2) { - "use strict"; - var { kConnected, kSize } = require_symbols(); - var CompatWeakRef = class { - constructor(value) { - this.value = value; - } - deref() { - return this.value[kConnected] === 0 && this.value[kSize] === 0 ? void 0 : this.value; - } - }; - var CompatFinalizer = class { - constructor(finalizer) { - this.finalizer = finalizer; - } - register(dispatcher, key) { - dispatcher.on("disconnect", () => { - if (dispatcher[kConnected] === 0 && dispatcher[kSize] === 0) { - this.finalizer(key); - } - }); - } - }; - module2.exports = function() { - return { - WeakRef: global.WeakRef || CompatWeakRef, - FinalizationRegistry: global.FinalizationRegistry || CompatFinalizer - }; - }; - } -}); - -// node_modules/undici/lib/agent.js -var require_agent = __commonJS({ - "node_modules/undici/lib/agent.js"(exports2, module2) { - "use strict"; - var { InvalidArgumentError } = require_errors(); - var { kClients, kRunning, kClose, kDestroy, kDispatch, kInterceptors } = require_symbols(); - var DispatcherBase = require_dispatcher_base(); - var Pool = require_pool2(); - var Client = require_client4(); - var util = require_util4(); - var createRedirectInterceptor = require_redirectInterceptor(); - var { WeakRef: WeakRef2, FinalizationRegistry } = require_dispatcher_weakref()(); - var kOnConnect = Symbol("onConnect"); - var kOnDisconnect = Symbol("onDisconnect"); - var kOnConnectionError = Symbol("onConnectionError"); - var kMaxRedirections = Symbol("maxRedirections"); - var kOnDrain = Symbol("onDrain"); - var kFactory = Symbol("factory"); - var kFinalizer = Symbol("finalizer"); - var kOptions = Symbol("options"); - function defaultFactory(origin, opts) { - return opts && opts.connections === 1 ? new Client(origin, opts) : new Pool(origin, opts); - } - var Agent = class extends DispatcherBase { - constructor({ factory = defaultFactory, maxRedirections = 0, connect, ...options2 } = {}) { - super(); - if (typeof factory !== "function") { - throw new InvalidArgumentError("factory must be a function."); - } - if (connect != null && typeof connect !== "function" && typeof connect !== "object") { - throw new InvalidArgumentError("connect must be a function or an object"); - } - if (!Number.isInteger(maxRedirections) || maxRedirections < 0) { - throw new InvalidArgumentError("maxRedirections must be a positive number"); - } - if (connect && typeof connect !== "function") { - connect = { ...connect }; - } - this[kInterceptors] = options2.interceptors && options2.interceptors.Agent && Array.isArray(options2.interceptors.Agent) ? options2.interceptors.Agent : [createRedirectInterceptor({ maxRedirections })]; - this[kOptions] = { ...util.deepClone(options2), connect }; - this[kOptions].interceptors = options2.interceptors ? { ...options2.interceptors } : void 0; - this[kMaxRedirections] = maxRedirections; - this[kFactory] = factory; - this[kClients] = /* @__PURE__ */ new Map(); - this[kFinalizer] = new FinalizationRegistry( - /* istanbul ignore next: gc is undeterministic */ - (key) => { - const ref = this[kClients].get(key); - if (ref !== void 0 && ref.deref() === void 0) { - this[kClients].delete(key); - } - } - ); - const agent = this; - this[kOnDrain] = (origin, targets) => { - agent.emit("drain", origin, [agent, ...targets]); - }; - this[kOnConnect] = (origin, targets) => { - agent.emit("connect", origin, [agent, ...targets]); - }; - this[kOnDisconnect] = (origin, targets, err) => { - agent.emit("disconnect", origin, [agent, ...targets], err); - }; - this[kOnConnectionError] = (origin, targets, err) => { - agent.emit("connectionError", origin, [agent, ...targets], err); - }; - } - get [kRunning]() { - let ret = 0; - for (const ref of this[kClients].values()) { - const client = ref.deref(); - if (client) { - ret += client[kRunning]; - } - } - return ret; - } - [kDispatch](opts, handler2) { - let key; - if (opts.origin && (typeof opts.origin === "string" || opts.origin instanceof URL)) { - key = String(opts.origin); - } else { - throw new InvalidArgumentError("opts.origin must be a non-empty string or URL."); - } - const ref = this[kClients].get(key); - let dispatcher = ref ? ref.deref() : null; - if (!dispatcher) { - dispatcher = this[kFactory](opts.origin, this[kOptions]).on("drain", this[kOnDrain]).on("connect", this[kOnConnect]).on("disconnect", this[kOnDisconnect]).on("connectionError", this[kOnConnectionError]); - this[kClients].set(key, new WeakRef2(dispatcher)); - this[kFinalizer].register(dispatcher, key); - } - return dispatcher.dispatch(opts, handler2); - } - async [kClose]() { - const closePromises = []; - for (const ref of this[kClients].values()) { - const client = ref.deref(); - if (client) { - closePromises.push(client.close()); - } - } - await Promise.all(closePromises); - } - async [kDestroy](err) { - const destroyPromises = []; - for (const ref of this[kClients].values()) { - const client = ref.deref(); - if (client) { - destroyPromises.push(client.destroy(err)); - } - } - await Promise.all(destroyPromises); - } - }; - module2.exports = Agent; - } -}); - -// node_modules/undici/lib/api/readable.js -var require_readable = __commonJS({ - "node_modules/undici/lib/api/readable.js"(exports2, module2) { - "use strict"; - var assert = require("assert"); - var { Readable } = require("stream"); - var { RequestAbortedError, NotSupportedError, InvalidArgumentError } = require_errors(); - var util = require_util4(); - var { ReadableStreamFrom, toUSVString } = require_util4(); - var Blob2; - var kConsume = Symbol("kConsume"); - var kReading = Symbol("kReading"); - var kBody = Symbol("kBody"); - var kAbort = Symbol("abort"); - var kContentType = Symbol("kContentType"); - module2.exports = class BodyReadable extends Readable { - constructor({ - resume, - abort, - contentType = "", - highWaterMark = 64 * 1024 - // Same as nodejs fs streams. - }) { - super({ - autoDestroy: true, - read: resume, - highWaterMark - }); - this._readableState.dataEmitted = false; - this[kAbort] = abort; - this[kConsume] = null; - this[kBody] = null; - this[kContentType] = contentType; - this[kReading] = false; - } - destroy(err) { - if (this.destroyed) { - return this; - } - if (!err && !this._readableState.endEmitted) { - err = new RequestAbortedError(); - } - if (err) { - this[kAbort](); - } - return super.destroy(err); - } - emit(ev, ...args) { - if (ev === "data") { - this._readableState.dataEmitted = true; - } else if (ev === "error") { - this._readableState.errorEmitted = true; - } - return super.emit(ev, ...args); - } - on(ev, ...args) { - if (ev === "data" || ev === "readable") { - this[kReading] = true; - } - return super.on(ev, ...args); - } - addListener(ev, ...args) { - return this.on(ev, ...args); - } - off(ev, ...args) { - const ret = super.off(ev, ...args); - if (ev === "data" || ev === "readable") { - this[kReading] = this.listenerCount("data") > 0 || this.listenerCount("readable") > 0; - } - return ret; - } - removeListener(ev, ...args) { - return this.off(ev, ...args); - } - push(chunk) { - if (this[kConsume] && chunk !== null && this.readableLength === 0) { - consumePush(this[kConsume], chunk); - return this[kReading] ? super.push(chunk) : true; - } - return super.push(chunk); - } - // https://fetch.spec.whatwg.org/#dom-body-text - async text() { - return consume(this, "text"); - } - // https://fetch.spec.whatwg.org/#dom-body-json - async json() { - return consume(this, "json"); - } - // https://fetch.spec.whatwg.org/#dom-body-blob - async blob() { - return consume(this, "blob"); - } - // https://fetch.spec.whatwg.org/#dom-body-arraybuffer - async arrayBuffer() { - return consume(this, "arrayBuffer"); - } - // https://fetch.spec.whatwg.org/#dom-body-formdata - async formData() { - throw new NotSupportedError(); - } - // https://fetch.spec.whatwg.org/#dom-body-bodyused - get bodyUsed() { - return util.isDisturbed(this); - } - // https://fetch.spec.whatwg.org/#dom-body-body - get body() { - if (!this[kBody]) { - this[kBody] = ReadableStreamFrom(this); - if (this[kConsume]) { - this[kBody].getReader(); - assert(this[kBody].locked); - } - } - return this[kBody]; - } - async dump(opts) { - let limit = opts && Number.isFinite(opts.limit) ? opts.limit : 262144; - const signal = opts && opts.signal; - const abortFn = () => { - this.destroy(); - }; - let signalListenerCleanup; - if (signal) { - if (typeof signal !== "object" || !("aborted" in signal)) { - throw new InvalidArgumentError("signal must be an AbortSignal"); - } - util.throwIfAborted(signal); - signalListenerCleanup = util.addAbortListener(signal, abortFn); - } - try { - for await (const chunk of this) { - util.throwIfAborted(signal); - limit -= Buffer.byteLength(chunk); - if (limit < 0) { - return; - } - } - } catch { - util.throwIfAborted(signal); - } finally { - if (typeof signalListenerCleanup === "function") { - signalListenerCleanup(); - } else if (signalListenerCleanup) { - signalListenerCleanup[Symbol.dispose](); - } - } - } - }; - function isLocked(self2) { - return self2[kBody] && self2[kBody].locked === true || self2[kConsume]; - } - function isUnusable(self2) { - return util.isDisturbed(self2) || isLocked(self2); - } - async function consume(stream, type) { - if (isUnusable(stream)) { - throw new TypeError("unusable"); - } - assert(!stream[kConsume]); - return new Promise((resolve, reject) => { - stream[kConsume] = { - type, - stream, - resolve, - reject, - length: 0, - body: [] - }; - stream.on("error", function(err) { - consumeFinish(this[kConsume], err); - }).on("close", function() { - if (this[kConsume].body !== null) { - consumeFinish(this[kConsume], new RequestAbortedError()); - } - }); - process.nextTick(consumeStart, stream[kConsume]); - }); - } - function consumeStart(consume2) { - if (consume2.body === null) { - return; - } - const { _readableState: state } = consume2.stream; - for (const chunk of state.buffer) { - consumePush(consume2, chunk); - } - if (state.endEmitted) { - consumeEnd(this[kConsume]); - } else { - consume2.stream.on("end", function() { - consumeEnd(this[kConsume]); - }); - } - consume2.stream.resume(); - while (consume2.stream.read() != null) { - } - } - function consumeEnd(consume2) { - const { type, body, resolve, stream, length } = consume2; - try { - if (type === "text") { - resolve(toUSVString(Buffer.concat(body))); - } else if (type === "json") { - resolve(JSON.parse(Buffer.concat(body))); - } else if (type === "arrayBuffer") { - const dst = new Uint8Array(length); - let pos = 0; - for (const buf of body) { - dst.set(buf, pos); - pos += buf.byteLength; - } - resolve(dst); - } else if (type === "blob") { - if (!Blob2) { - Blob2 = require("buffer").Blob; - } - resolve(new Blob2(body, { type: stream[kContentType] })); - } - consumeFinish(consume2); - } catch (err) { - stream.destroy(err); - } - } - function consumePush(consume2, chunk) { - consume2.length += chunk.length; - consume2.body.push(chunk); - } - function consumeFinish(consume2, err) { - if (consume2.body === null) { - return; - } - if (err) { - consume2.reject(err); - } else { - consume2.resolve(); - } - consume2.type = null; - consume2.stream = null; - consume2.resolve = null; - consume2.reject = null; - consume2.length = 0; - consume2.body = null; - } - } -}); - -// node_modules/undici/lib/api/util.js -var require_util6 = __commonJS({ - "node_modules/undici/lib/api/util.js"(exports2, module2) { - var assert = require("assert"); - var { - ResponseStatusCodeError - } = require_errors(); - var { toUSVString } = require_util4(); - async function getResolveErrorBodyCallback({ callback, body, contentType, statusCode, statusMessage, headers }) { - assert(body); - let chunks = []; - let limit = 0; - for await (const chunk of body) { - chunks.push(chunk); - limit += chunk.length; - if (limit > 128 * 1024) { - chunks = null; - break; - } - } - if (statusCode === 204 || !contentType || !chunks) { - process.nextTick(callback, new ResponseStatusCodeError(`Response status code ${statusCode}${statusMessage ? `: ${statusMessage}` : ""}`, statusCode, headers)); - return; - } - try { - if (contentType.startsWith("application/json")) { - const payload = JSON.parse(toUSVString(Buffer.concat(chunks))); - process.nextTick(callback, new ResponseStatusCodeError(`Response status code ${statusCode}${statusMessage ? `: ${statusMessage}` : ""}`, statusCode, headers, payload)); - return; - } - if (contentType.startsWith("text/")) { - const payload = toUSVString(Buffer.concat(chunks)); - process.nextTick(callback, new ResponseStatusCodeError(`Response status code ${statusCode}${statusMessage ? `: ${statusMessage}` : ""}`, statusCode, headers, payload)); - return; - } - } catch (err) { - } - process.nextTick(callback, new ResponseStatusCodeError(`Response status code ${statusCode}${statusMessage ? `: ${statusMessage}` : ""}`, statusCode, headers)); - } - module2.exports = { getResolveErrorBodyCallback }; - } -}); - -// node_modules/undici/lib/api/abort-signal.js -var require_abort_signal = __commonJS({ - "node_modules/undici/lib/api/abort-signal.js"(exports2, module2) { - var { addAbortListener } = require_util4(); - var { RequestAbortedError } = require_errors(); - var kListener = Symbol("kListener"); - var kSignal = Symbol("kSignal"); - function abort(self2) { - if (self2.abort) { - self2.abort(); - } else { - self2.onError(new RequestAbortedError()); - } - } - function addSignal(self2, signal) { - self2[kSignal] = null; - self2[kListener] = null; - if (!signal) { - return; - } - if (signal.aborted) { - abort(self2); - return; - } - self2[kSignal] = signal; - self2[kListener] = () => { - abort(self2); - }; - addAbortListener(self2[kSignal], self2[kListener]); - } - function removeSignal(self2) { - if (!self2[kSignal]) { - return; - } - if ("removeEventListener" in self2[kSignal]) { - self2[kSignal].removeEventListener("abort", self2[kListener]); - } else { - self2[kSignal].removeListener("abort", self2[kListener]); - } - self2[kSignal] = null; - self2[kListener] = null; - } - module2.exports = { - addSignal, - removeSignal - }; - } -}); - -// node_modules/undici/lib/api/api-request.js -var require_api_request = __commonJS({ - "node_modules/undici/lib/api/api-request.js"(exports2, module2) { - "use strict"; - var Readable = require_readable(); - var { - InvalidArgumentError, - RequestAbortedError - } = require_errors(); - var util = require_util4(); - var { getResolveErrorBodyCallback } = require_util6(); - var { AsyncResource } = require("async_hooks"); - var { addSignal, removeSignal } = require_abort_signal(); - var RequestHandler = class extends AsyncResource { - constructor(opts, callback) { - if (!opts || typeof opts !== "object") { - throw new InvalidArgumentError("invalid opts"); - } - const { signal, method, opaque, body, onInfo, responseHeaders, throwOnError, highWaterMark } = opts; - try { - if (typeof callback !== "function") { - throw new InvalidArgumentError("invalid callback"); - } - if (highWaterMark && (typeof highWaterMark !== "number" || highWaterMark < 0)) { - throw new InvalidArgumentError("invalid highWaterMark"); - } - if (signal && typeof signal.on !== "function" && typeof signal.addEventListener !== "function") { - throw new InvalidArgumentError("signal must be an EventEmitter or EventTarget"); - } - if (method === "CONNECT") { - throw new InvalidArgumentError("invalid method"); - } - if (onInfo && typeof onInfo !== "function") { - throw new InvalidArgumentError("invalid onInfo callback"); - } - super("UNDICI_REQUEST"); - } catch (err) { - if (util.isStream(body)) { - util.destroy(body.on("error", util.nop), err); - } - throw err; - } - this.responseHeaders = responseHeaders || null; - this.opaque = opaque || null; - this.callback = callback; - this.res = null; - this.abort = null; - this.body = body; - this.trailers = {}; - this.context = null; - this.onInfo = onInfo || null; - this.throwOnError = throwOnError; - this.highWaterMark = highWaterMark; - if (util.isStream(body)) { - body.on("error", (err) => { - this.onError(err); - }); - } - addSignal(this, signal); - } - onConnect(abort, context) { - if (!this.callback) { - throw new RequestAbortedError(); - } - this.abort = abort; - this.context = context; - } - onHeaders(statusCode, rawHeaders, resume, statusMessage) { - const { callback, opaque, abort, context, responseHeaders, highWaterMark } = this; - const headers = responseHeaders === "raw" ? util.parseRawHeaders(rawHeaders) : util.parseHeaders(rawHeaders); - if (statusCode < 200) { - if (this.onInfo) { - this.onInfo({ statusCode, headers }); - } - return; - } - const parsedHeaders = responseHeaders === "raw" ? util.parseHeaders(rawHeaders) : headers; - const contentType = parsedHeaders["content-type"]; - const body = new Readable({ resume, abort, contentType, highWaterMark }); - this.callback = null; - this.res = body; - if (callback !== null) { - if (this.throwOnError && statusCode >= 400) { - this.runInAsyncScope( - getResolveErrorBodyCallback, - null, - { callback, body, contentType, statusCode, statusMessage, headers } - ); - } else { - this.runInAsyncScope(callback, null, null, { - statusCode, - headers, - trailers: this.trailers, - opaque, - body, - context - }); - } - } - } - onData(chunk) { - const { res } = this; - return res.push(chunk); - } - onComplete(trailers) { - const { res } = this; - removeSignal(this); - util.parseHeaders(trailers, this.trailers); - res.push(null); - } - onError(err) { - const { res, callback, body, opaque } = this; - removeSignal(this); - if (callback) { - this.callback = null; - queueMicrotask(() => { - this.runInAsyncScope(callback, null, err, { opaque }); - }); - } - if (res) { - this.res = null; - queueMicrotask(() => { - util.destroy(res, err); - }); - } - if (body) { - this.body = null; - util.destroy(body, err); - } - } - }; - function request(opts, callback) { - if (callback === void 0) { - return new Promise((resolve, reject) => { - request.call(this, opts, (err, data) => { - return err ? reject(err) : resolve(data); - }); - }); - } - try { - this.dispatch(opts, new RequestHandler(opts, callback)); - } catch (err) { - if (typeof callback !== "function") { - throw err; - } - const opaque = opts && opts.opaque; - queueMicrotask(() => callback(err, { opaque })); - } - } - module2.exports = request; - } -}); - -// node_modules/undici/lib/api/api-stream.js -var require_api_stream = __commonJS({ - "node_modules/undici/lib/api/api-stream.js"(exports2, module2) { - "use strict"; - var { finished, PassThrough } = require("stream"); - var { - InvalidArgumentError, - InvalidReturnValueError, - RequestAbortedError - } = require_errors(); - var util = require_util4(); - var { getResolveErrorBodyCallback } = require_util6(); - var { AsyncResource } = require("async_hooks"); - var { addSignal, removeSignal } = require_abort_signal(); - var StreamHandler = class extends AsyncResource { - constructor(opts, factory, callback) { - if (!opts || typeof opts !== "object") { - throw new InvalidArgumentError("invalid opts"); - } - const { signal, method, opaque, body, onInfo, responseHeaders, throwOnError } = opts; - try { - if (typeof callback !== "function") { - throw new InvalidArgumentError("invalid callback"); - } - if (typeof factory !== "function") { - throw new InvalidArgumentError("invalid factory"); - } - if (signal && typeof signal.on !== "function" && typeof signal.addEventListener !== "function") { - throw new InvalidArgumentError("signal must be an EventEmitter or EventTarget"); - } - if (method === "CONNECT") { - throw new InvalidArgumentError("invalid method"); - } - if (onInfo && typeof onInfo !== "function") { - throw new InvalidArgumentError("invalid onInfo callback"); - } - super("UNDICI_STREAM"); - } catch (err) { - if (util.isStream(body)) { - util.destroy(body.on("error", util.nop), err); - } - throw err; - } - this.responseHeaders = responseHeaders || null; - this.opaque = opaque || null; - this.factory = factory; - this.callback = callback; - this.res = null; - this.abort = null; - this.context = null; - this.trailers = null; - this.body = body; - this.onInfo = onInfo || null; - this.throwOnError = throwOnError || false; - if (util.isStream(body)) { - body.on("error", (err) => { - this.onError(err); - }); - } - addSignal(this, signal); - } - onConnect(abort, context) { - if (!this.callback) { - throw new RequestAbortedError(); - } - this.abort = abort; - this.context = context; - } - onHeaders(statusCode, rawHeaders, resume, statusMessage) { - const { factory, opaque, context, callback, responseHeaders } = this; - const headers = responseHeaders === "raw" ? util.parseRawHeaders(rawHeaders) : util.parseHeaders(rawHeaders); - if (statusCode < 200) { - if (this.onInfo) { - this.onInfo({ statusCode, headers }); - } - return; - } - this.factory = null; - let res; - if (this.throwOnError && statusCode >= 400) { - const parsedHeaders = responseHeaders === "raw" ? util.parseHeaders(rawHeaders) : headers; - const contentType = parsedHeaders["content-type"]; - res = new PassThrough(); - this.callback = null; - this.runInAsyncScope( - getResolveErrorBodyCallback, - null, - { callback, body: res, contentType, statusCode, statusMessage, headers } - ); - } else { - res = this.runInAsyncScope(factory, null, { - statusCode, - headers, - opaque, - context - }); - if (!res || typeof res.write !== "function" || typeof res.end !== "function" || typeof res.on !== "function") { - throw new InvalidReturnValueError("expected Writable"); - } - finished(res, { readable: false }, (err) => { - const { callback: callback2, res: res2, opaque: opaque2, trailers, abort } = this; - this.res = null; - if (err || !res2.readable) { - util.destroy(res2, err); - } - this.callback = null; - this.runInAsyncScope(callback2, null, err || null, { opaque: opaque2, trailers }); - if (err) { - abort(); - } - }); - } - res.on("drain", resume); - this.res = res; - const needDrain = res.writableNeedDrain !== void 0 ? res.writableNeedDrain : res._writableState && res._writableState.needDrain; - return needDrain !== true; - } - onData(chunk) { - const { res } = this; - return res.write(chunk); - } - onComplete(trailers) { - const { res } = this; - removeSignal(this); - this.trailers = util.parseHeaders(trailers); - res.end(); - } - onError(err) { - const { res, callback, opaque, body } = this; - removeSignal(this); - this.factory = null; - if (res) { - this.res = null; - util.destroy(res, err); - } else if (callback) { - this.callback = null; - queueMicrotask(() => { - this.runInAsyncScope(callback, null, err, { opaque }); - }); - } - if (body) { - this.body = null; - util.destroy(body, err); - } - } - }; - function stream(opts, factory, callback) { - if (callback === void 0) { - return new Promise((resolve, reject) => { - stream.call(this, opts, factory, (err, data) => { - return err ? reject(err) : resolve(data); - }); - }); - } - try { - this.dispatch(opts, new StreamHandler(opts, factory, callback)); - } catch (err) { - if (typeof callback !== "function") { - throw err; - } - const opaque = opts && opts.opaque; - queueMicrotask(() => callback(err, { opaque })); - } - } - module2.exports = stream; - } -}); - -// node_modules/undici/lib/api/api-pipeline.js -var require_api_pipeline = __commonJS({ - "node_modules/undici/lib/api/api-pipeline.js"(exports2, module2) { - "use strict"; - var { - Readable, - Duplex, - PassThrough - } = require("stream"); - var { - InvalidArgumentError, - InvalidReturnValueError, - RequestAbortedError - } = require_errors(); - var util = require_util4(); - var { AsyncResource } = require("async_hooks"); - var { addSignal, removeSignal } = require_abort_signal(); - var assert = require("assert"); - var kResume = Symbol("resume"); - var PipelineRequest = class extends Readable { - constructor() { - super({ autoDestroy: true }); - this[kResume] = null; - } - _read() { - const { [kResume]: resume } = this; - if (resume) { - this[kResume] = null; - resume(); - } - } - _destroy(err, callback) { - this._read(); - callback(err); - } - }; - var PipelineResponse = class extends Readable { - constructor(resume) { - super({ autoDestroy: true }); - this[kResume] = resume; - } - _read() { - this[kResume](); - } - _destroy(err, callback) { - if (!err && !this._readableState.endEmitted) { - err = new RequestAbortedError(); - } - callback(err); - } - }; - var PipelineHandler = class extends AsyncResource { - constructor(opts, handler2) { - if (!opts || typeof opts !== "object") { - throw new InvalidArgumentError("invalid opts"); - } - if (typeof handler2 !== "function") { - throw new InvalidArgumentError("invalid handler"); - } - const { signal, method, opaque, onInfo, responseHeaders } = opts; - if (signal && typeof signal.on !== "function" && typeof signal.addEventListener !== "function") { - throw new InvalidArgumentError("signal must be an EventEmitter or EventTarget"); - } - if (method === "CONNECT") { - throw new InvalidArgumentError("invalid method"); - } - if (onInfo && typeof onInfo !== "function") { - throw new InvalidArgumentError("invalid onInfo callback"); - } - super("UNDICI_PIPELINE"); - this.opaque = opaque || null; - this.responseHeaders = responseHeaders || null; - this.handler = handler2; - this.abort = null; - this.context = null; - this.onInfo = onInfo || null; - this.req = new PipelineRequest().on("error", util.nop); - this.ret = new Duplex({ - readableObjectMode: opts.objectMode, - autoDestroy: true, - read: () => { - const { body } = this; - if (body && body.resume) { - body.resume(); - } - }, - write: (chunk, encoding, callback) => { - const { req } = this; - if (req.push(chunk, encoding) || req._readableState.destroyed) { - callback(); - } else { - req[kResume] = callback; - } - }, - destroy: (err, callback) => { - const { body, req, res, ret, abort } = this; - if (!err && !ret._readableState.endEmitted) { - err = new RequestAbortedError(); - } - if (abort && err) { - abort(); - } - util.destroy(body, err); - util.destroy(req, err); - util.destroy(res, err); - removeSignal(this); - callback(err); - } - }).on("prefinish", () => { - const { req } = this; - req.push(null); - }); - this.res = null; - addSignal(this, signal); - } - onConnect(abort, context) { - const { ret, res } = this; - assert(!res, "pipeline cannot be retried"); - if (ret.destroyed) { - throw new RequestAbortedError(); - } - this.abort = abort; - this.context = context; - } - onHeaders(statusCode, rawHeaders, resume) { - const { opaque, handler: handler2, context } = this; - if (statusCode < 200) { - if (this.onInfo) { - const headers = this.responseHeaders === "raw" ? util.parseRawHeaders(rawHeaders) : util.parseHeaders(rawHeaders); - this.onInfo({ statusCode, headers }); - } - return; - } - this.res = new PipelineResponse(resume); - let body; - try { - this.handler = null; - const headers = this.responseHeaders === "raw" ? util.parseRawHeaders(rawHeaders) : util.parseHeaders(rawHeaders); - body = this.runInAsyncScope(handler2, null, { - statusCode, - headers, - opaque, - body: this.res, - context - }); - } catch (err) { - this.res.on("error", util.nop); - throw err; - } - if (!body || typeof body.on !== "function") { - throw new InvalidReturnValueError("expected Readable"); - } - body.on("data", (chunk) => { - const { ret, body: body2 } = this; - if (!ret.push(chunk) && body2.pause) { - body2.pause(); - } - }).on("error", (err) => { - const { ret } = this; - util.destroy(ret, err); - }).on("end", () => { - const { ret } = this; - ret.push(null); - }).on("close", () => { - const { ret } = this; - if (!ret._readableState.ended) { - util.destroy(ret, new RequestAbortedError()); - } - }); - this.body = body; - } - onData(chunk) { - const { res } = this; - return res.push(chunk); - } - onComplete(trailers) { - const { res } = this; - res.push(null); - } - onError(err) { - const { ret } = this; - this.handler = null; - util.destroy(ret, err); - } - }; - function pipeline(opts, handler2) { - try { - const pipelineHandler = new PipelineHandler(opts, handler2); - this.dispatch({ ...opts, body: pipelineHandler.req }, pipelineHandler); - return pipelineHandler.ret; - } catch (err) { - return new PassThrough().destroy(err); - } - } - module2.exports = pipeline; - } -}); - -// node_modules/undici/lib/api/api-upgrade.js -var require_api_upgrade = __commonJS({ - "node_modules/undici/lib/api/api-upgrade.js"(exports2, module2) { - "use strict"; - var { InvalidArgumentError, RequestAbortedError, SocketError } = require_errors(); - var { AsyncResource } = require("async_hooks"); - var util = require_util4(); - var { addSignal, removeSignal } = require_abort_signal(); - var assert = require("assert"); - var UpgradeHandler = class extends AsyncResource { - constructor(opts, callback) { - if (!opts || typeof opts !== "object") { - throw new InvalidArgumentError("invalid opts"); - } - if (typeof callback !== "function") { - throw new InvalidArgumentError("invalid callback"); - } - const { signal, opaque, responseHeaders } = opts; - if (signal && typeof signal.on !== "function" && typeof signal.addEventListener !== "function") { - throw new InvalidArgumentError("signal must be an EventEmitter or EventTarget"); - } - super("UNDICI_UPGRADE"); - this.responseHeaders = responseHeaders || null; - this.opaque = opaque || null; - this.callback = callback; - this.abort = null; - this.context = null; - addSignal(this, signal); - } - onConnect(abort, context) { - if (!this.callback) { - throw new RequestAbortedError(); - } - this.abort = abort; - this.context = null; - } - onHeaders() { - throw new SocketError("bad upgrade", null); - } - onUpgrade(statusCode, rawHeaders, socket) { - const { callback, opaque, context } = this; - assert.strictEqual(statusCode, 101); - removeSignal(this); - this.callback = null; - const headers = this.responseHeaders === "raw" ? util.parseRawHeaders(rawHeaders) : util.parseHeaders(rawHeaders); - this.runInAsyncScope(callback, null, null, { - headers, - socket, - opaque, - context - }); - } - onError(err) { - const { callback, opaque } = this; - removeSignal(this); - if (callback) { - this.callback = null; - queueMicrotask(() => { - this.runInAsyncScope(callback, null, err, { opaque }); - }); - } - } - }; - function upgrade(opts, callback) { - if (callback === void 0) { - return new Promise((resolve, reject) => { - upgrade.call(this, opts, (err, data) => { - return err ? reject(err) : resolve(data); - }); - }); - } - try { - const upgradeHandler = new UpgradeHandler(opts, callback); - this.dispatch({ - ...opts, - method: opts.method || "GET", - upgrade: opts.protocol || "Websocket" - }, upgradeHandler); - } catch (err) { - if (typeof callback !== "function") { - throw err; - } - const opaque = opts && opts.opaque; - queueMicrotask(() => callback(err, { opaque })); - } - } - module2.exports = upgrade; - } -}); - -// node_modules/undici/lib/api/api-connect.js -var require_api_connect = __commonJS({ - "node_modules/undici/lib/api/api-connect.js"(exports2, module2) { - "use strict"; - var { InvalidArgumentError, RequestAbortedError, SocketError } = require_errors(); - var { AsyncResource } = require("async_hooks"); - var util = require_util4(); - var { addSignal, removeSignal } = require_abort_signal(); - var ConnectHandler = class extends AsyncResource { - constructor(opts, callback) { - if (!opts || typeof opts !== "object") { - throw new InvalidArgumentError("invalid opts"); - } - if (typeof callback !== "function") { - throw new InvalidArgumentError("invalid callback"); - } - const { signal, opaque, responseHeaders } = opts; - if (signal && typeof signal.on !== "function" && typeof signal.addEventListener !== "function") { - throw new InvalidArgumentError("signal must be an EventEmitter or EventTarget"); - } - super("UNDICI_CONNECT"); - this.opaque = opaque || null; - this.responseHeaders = responseHeaders || null; - this.callback = callback; - this.abort = null; - addSignal(this, signal); - } - onConnect(abort, context) { - if (!this.callback) { - throw new RequestAbortedError(); - } - this.abort = abort; - this.context = context; - } - onHeaders() { - throw new SocketError("bad connect", null); - } - onUpgrade(statusCode, rawHeaders, socket) { - const { callback, opaque, context } = this; - removeSignal(this); - this.callback = null; - const headers = this.responseHeaders === "raw" ? util.parseRawHeaders(rawHeaders) : util.parseHeaders(rawHeaders); - this.runInAsyncScope(callback, null, null, { - statusCode, - headers, - socket, - opaque, - context - }); - } - onError(err) { - const { callback, opaque } = this; - removeSignal(this); - if (callback) { - this.callback = null; - queueMicrotask(() => { - this.runInAsyncScope(callback, null, err, { opaque }); - }); - } - } - }; - function connect(opts, callback) { - if (callback === void 0) { - return new Promise((resolve, reject) => { - connect.call(this, opts, (err, data) => { - return err ? reject(err) : resolve(data); - }); - }); - } - try { - const connectHandler = new ConnectHandler(opts, callback); - this.dispatch({ ...opts, method: "CONNECT" }, connectHandler); - } catch (err) { - if (typeof callback !== "function") { - throw err; - } - const opaque = opts && opts.opaque; - queueMicrotask(() => callback(err, { opaque })); - } - } - module2.exports = connect; - } -}); - -// node_modules/undici/lib/api/index.js -var require_api2 = __commonJS({ - "node_modules/undici/lib/api/index.js"(exports2, module2) { - "use strict"; - module2.exports.request = require_api_request(); - module2.exports.stream = require_api_stream(); - module2.exports.pipeline = require_api_pipeline(); - module2.exports.upgrade = require_api_upgrade(); - module2.exports.connect = require_api_connect(); - } -}); - -// node_modules/undici/lib/mock/mock-errors.js -var require_mock_errors = __commonJS({ - "node_modules/undici/lib/mock/mock-errors.js"(exports2, module2) { - "use strict"; - var { UndiciError } = require_errors(); - var MockNotMatchedError = class _MockNotMatchedError extends UndiciError { - constructor(message) { - super(message); - Error.captureStackTrace(this, _MockNotMatchedError); - this.name = "MockNotMatchedError"; - this.message = message || "The request does not match any registered mock dispatches"; - this.code = "UND_MOCK_ERR_MOCK_NOT_MATCHED"; - } - }; - module2.exports = { - MockNotMatchedError - }; - } -}); - -// node_modules/undici/lib/mock/mock-symbols.js -var require_mock_symbols = __commonJS({ - "node_modules/undici/lib/mock/mock-symbols.js"(exports2, module2) { - "use strict"; - module2.exports = { - kAgent: Symbol("agent"), - kOptions: Symbol("options"), - kFactory: Symbol("factory"), - kDispatches: Symbol("dispatches"), - kDispatchKey: Symbol("dispatch key"), - kDefaultHeaders: Symbol("default headers"), - kDefaultTrailers: Symbol("default trailers"), - kContentLength: Symbol("content length"), - kMockAgent: Symbol("mock agent"), - kMockAgentSet: Symbol("mock agent set"), - kMockAgentGet: Symbol("mock agent get"), - kMockDispatch: Symbol("mock dispatch"), - kClose: Symbol("close"), - kOriginalClose: Symbol("original agent close"), - kOrigin: Symbol("origin"), - kIsMockActive: Symbol("is mock active"), - kNetConnect: Symbol("net connect"), - kGetNetConnect: Symbol("get net connect"), - kConnected: Symbol("connected") - }; - } -}); - -// node_modules/undici/lib/mock/mock-utils.js -var require_mock_utils = __commonJS({ - "node_modules/undici/lib/mock/mock-utils.js"(exports2, module2) { - "use strict"; - var { MockNotMatchedError } = require_mock_errors(); - var { - kDispatches, - kMockAgent, - kOriginalDispatch, - kOrigin, - kGetNetConnect - } = require_mock_symbols(); - var { buildURL, nop } = require_util4(); - var { STATUS_CODES } = require("http"); - var { - types: { - isPromise - } - } = require("util"); - function matchValue(match, value) { - if (typeof match === "string") { - return match === value; - } - if (match instanceof RegExp) { - return match.test(value); - } - if (typeof match === "function") { - return match(value) === true; - } - return false; - } - function lowerCaseEntries(headers) { - return Object.fromEntries( - Object.entries(headers).map(([headerName, headerValue]) => { - return [headerName.toLocaleLowerCase(), headerValue]; - }) - ); - } - function getHeaderByName(headers, key) { - if (Array.isArray(headers)) { - for (let i = 0; i < headers.length; i += 2) { - if (headers[i].toLocaleLowerCase() === key.toLocaleLowerCase()) { - return headers[i + 1]; - } - } - return void 0; - } else if (typeof headers.get === "function") { - return headers.get(key); - } else { - return lowerCaseEntries(headers)[key.toLocaleLowerCase()]; - } - } - function buildHeadersFromArray(headers) { - const clone = headers.slice(); - const entries = []; - for (let index = 0; index < clone.length; index += 2) { - entries.push([clone[index], clone[index + 1]]); - } - return Object.fromEntries(entries); - } - function matchHeaders(mockDispatch2, headers) { - if (typeof mockDispatch2.headers === "function") { - if (Array.isArray(headers)) { - headers = buildHeadersFromArray(headers); - } - return mockDispatch2.headers(headers ? lowerCaseEntries(headers) : {}); - } - if (typeof mockDispatch2.headers === "undefined") { - return true; - } - if (typeof headers !== "object" || typeof mockDispatch2.headers !== "object") { - return false; - } - for (const [matchHeaderName, matchHeaderValue] of Object.entries(mockDispatch2.headers)) { - const headerValue = getHeaderByName(headers, matchHeaderName); - if (!matchValue(matchHeaderValue, headerValue)) { - return false; - } - } - return true; - } - function safeUrl(path) { - if (typeof path !== "string") { - return path; - } - const pathSegments = path.split("?"); - if (pathSegments.length !== 2) { - return path; - } - const qp2 = new URLSearchParams(pathSegments.pop()); - qp2.sort(); - return [...pathSegments, qp2.toString()].join("?"); - } - function matchKey(mockDispatch2, { path, method, body, headers }) { - const pathMatch = matchValue(mockDispatch2.path, path); - const methodMatch = matchValue(mockDispatch2.method, method); - const bodyMatch = typeof mockDispatch2.body !== "undefined" ? matchValue(mockDispatch2.body, body) : true; - const headersMatch = matchHeaders(mockDispatch2, headers); - return pathMatch && methodMatch && bodyMatch && headersMatch; - } - function getResponseData(data) { - if (Buffer.isBuffer(data)) { - return data; - } else if (typeof data === "object") { - return JSON.stringify(data); - } else { - return data.toString(); - } - } - function getMockDispatch(mockDispatches, key) { - const basePath = key.query ? buildURL(key.path, key.query) : key.path; - const resolvedPath = typeof basePath === "string" ? safeUrl(basePath) : basePath; - let matchedMockDispatches = mockDispatches.filter(({ consumed }) => !consumed).filter(({ path }) => matchValue(safeUrl(path), resolvedPath)); - if (matchedMockDispatches.length === 0) { - throw new MockNotMatchedError(`Mock dispatch not matched for path '${resolvedPath}'`); - } - matchedMockDispatches = matchedMockDispatches.filter(({ method }) => matchValue(method, key.method)); - if (matchedMockDispatches.length === 0) { - throw new MockNotMatchedError(`Mock dispatch not matched for method '${key.method}'`); - } - matchedMockDispatches = matchedMockDispatches.filter(({ body }) => typeof body !== "undefined" ? matchValue(body, key.body) : true); - if (matchedMockDispatches.length === 0) { - throw new MockNotMatchedError(`Mock dispatch not matched for body '${key.body}'`); - } - matchedMockDispatches = matchedMockDispatches.filter((mockDispatch2) => matchHeaders(mockDispatch2, key.headers)); - if (matchedMockDispatches.length === 0) { - throw new MockNotMatchedError(`Mock dispatch not matched for headers '${typeof key.headers === "object" ? JSON.stringify(key.headers) : key.headers}'`); - } - return matchedMockDispatches[0]; - } - function addMockDispatch(mockDispatches, key, data) { - const baseData = { timesInvoked: 0, times: 1, persist: false, consumed: false }; - const replyData = typeof data === "function" ? { callback: data } : { ...data }; - const newMockDispatch = { ...baseData, ...key, pending: true, data: { error: null, ...replyData } }; - mockDispatches.push(newMockDispatch); - return newMockDispatch; - } - function deleteMockDispatch(mockDispatches, key) { - const index = mockDispatches.findIndex((dispatch) => { - if (!dispatch.consumed) { - return false; - } - return matchKey(dispatch, key); - }); - if (index !== -1) { - mockDispatches.splice(index, 1); - } - } - function buildKey(opts) { - const { path, method, body, headers, query } = opts; - return { - path, - method, - body, - headers, - query - }; - } - function generateKeyValues(data) { - return Object.entries(data).reduce((keyValuePairs, [key, value]) => [ - ...keyValuePairs, - Buffer.from(`${key}`), - Array.isArray(value) ? value.map((x) => Buffer.from(`${x}`)) : Buffer.from(`${value}`) - ], []); - } - function getStatusText(statusCode) { - return STATUS_CODES[statusCode] || "unknown"; - } - async function getResponse(body) { - const buffers = []; - for await (const data of body) { - buffers.push(data); - } - return Buffer.concat(buffers).toString("utf8"); - } - function mockDispatch(opts, handler2) { - const key = buildKey(opts); - const mockDispatch2 = getMockDispatch(this[kDispatches], key); - mockDispatch2.timesInvoked++; - if (mockDispatch2.data.callback) { - mockDispatch2.data = { ...mockDispatch2.data, ...mockDispatch2.data.callback(opts) }; - } - const { data: { statusCode, data, headers, trailers, error: error2 }, delay, persist } = mockDispatch2; - const { timesInvoked, times } = mockDispatch2; - mockDispatch2.consumed = !persist && timesInvoked >= times; - mockDispatch2.pending = timesInvoked < times; - if (error2 !== null) { - deleteMockDispatch(this[kDispatches], key); - handler2.onError(error2); - return true; - } - if (typeof delay === "number" && delay > 0) { - setTimeout(() => { - handleReply(this[kDispatches]); - }, delay); - } else { - handleReply(this[kDispatches]); - } - function handleReply(mockDispatches, _data = data) { - const optsHeaders = Array.isArray(opts.headers) ? buildHeadersFromArray(opts.headers) : opts.headers; - const body = typeof _data === "function" ? _data({ ...opts, headers: optsHeaders }) : _data; - if (isPromise(body)) { - body.then((newData) => handleReply(mockDispatches, newData)); - return; - } - const responseData = getResponseData(body); - const responseHeaders = generateKeyValues(headers); - const responseTrailers = generateKeyValues(trailers); - handler2.abort = nop; - handler2.onHeaders(statusCode, responseHeaders, resume, getStatusText(statusCode)); - handler2.onData(Buffer.from(responseData)); - handler2.onComplete(responseTrailers); - deleteMockDispatch(mockDispatches, key); - } - function resume() { - } - return true; - } - function buildMockDispatch() { - const agent = this[kMockAgent]; - const origin = this[kOrigin]; - const originalDispatch = this[kOriginalDispatch]; - return function dispatch(opts, handler2) { - if (agent.isMockActive) { - try { - mockDispatch.call(this, opts, handler2); - } catch (error2) { - if (error2 instanceof MockNotMatchedError) { - const netConnect = agent[kGetNetConnect](); - if (netConnect === false) { - throw new MockNotMatchedError(`${error2.message}: subsequent request to origin ${origin} was not allowed (net.connect disabled)`); - } - if (checkNetConnect(netConnect, origin)) { - originalDispatch.call(this, opts, handler2); - } else { - throw new MockNotMatchedError(`${error2.message}: subsequent request to origin ${origin} was not allowed (net.connect is not enabled for this origin)`); - } - } else { - throw error2; - } - } - } else { - originalDispatch.call(this, opts, handler2); - } - }; - } - function checkNetConnect(netConnect, origin) { - const url = new URL(origin); - if (netConnect === true) { - return true; - } else if (Array.isArray(netConnect) && netConnect.some((matcher) => matchValue(matcher, url.host))) { - return true; - } - return false; - } - function buildMockOptions(opts) { - if (opts) { - const { agent, ...mockOptions } = opts; - return mockOptions; - } - } - module2.exports = { - getResponseData, - getMockDispatch, - addMockDispatch, - deleteMockDispatch, - buildKey, - generateKeyValues, - matchValue, - getResponse, - getStatusText, - mockDispatch, - buildMockDispatch, - checkNetConnect, - buildMockOptions, - getHeaderByName - }; - } -}); - -// node_modules/undici/lib/mock/mock-interceptor.js -var require_mock_interceptor = __commonJS({ - "node_modules/undici/lib/mock/mock-interceptor.js"(exports2, module2) { - "use strict"; - var { getResponseData, buildKey, addMockDispatch } = require_mock_utils(); - var { - kDispatches, - kDispatchKey, - kDefaultHeaders, - kDefaultTrailers, - kContentLength, - kMockDispatch - } = require_mock_symbols(); - var { InvalidArgumentError } = require_errors(); - var { buildURL } = require_util4(); - var MockScope = class { - constructor(mockDispatch) { - this[kMockDispatch] = mockDispatch; - } - /** - * Delay a reply by a set amount in ms. - */ - delay(waitInMs) { - if (typeof waitInMs !== "number" || !Number.isInteger(waitInMs) || waitInMs <= 0) { - throw new InvalidArgumentError("waitInMs must be a valid integer > 0"); - } - this[kMockDispatch].delay = waitInMs; - return this; - } - /** - * For a defined reply, never mark as consumed. - */ - persist() { - this[kMockDispatch].persist = true; - return this; - } - /** - * Allow one to define a reply for a set amount of matching requests. - */ - times(repeatTimes) { - if (typeof repeatTimes !== "number" || !Number.isInteger(repeatTimes) || repeatTimes <= 0) { - throw new InvalidArgumentError("repeatTimes must be a valid integer > 0"); - } - this[kMockDispatch].times = repeatTimes; - return this; - } - }; - var MockInterceptor = class { - constructor(opts, mockDispatches) { - if (typeof opts !== "object") { - throw new InvalidArgumentError("opts must be an object"); - } - if (typeof opts.path === "undefined") { - throw new InvalidArgumentError("opts.path must be defined"); - } - if (typeof opts.method === "undefined") { - opts.method = "GET"; - } - if (typeof opts.path === "string") { - if (opts.query) { - opts.path = buildURL(opts.path, opts.query); - } else { - const parsedURL = new URL(opts.path, "data://"); - opts.path = parsedURL.pathname + parsedURL.search; - } - } - if (typeof opts.method === "string") { - opts.method = opts.method.toUpperCase(); - } - this[kDispatchKey] = buildKey(opts); - this[kDispatches] = mockDispatches; - this[kDefaultHeaders] = {}; - this[kDefaultTrailers] = {}; - this[kContentLength] = false; - } - createMockScopeDispatchData(statusCode, data, responseOptions = {}) { - const responseData = getResponseData(data); - const contentLength = this[kContentLength] ? { "content-length": responseData.length } : {}; - const headers = { ...this[kDefaultHeaders], ...contentLength, ...responseOptions.headers }; - const trailers = { ...this[kDefaultTrailers], ...responseOptions.trailers }; - return { statusCode, data, headers, trailers }; - } - validateReplyParameters(statusCode, data, responseOptions) { - if (typeof statusCode === "undefined") { - throw new InvalidArgumentError("statusCode must be defined"); - } - if (typeof data === "undefined") { - throw new InvalidArgumentError("data must be defined"); - } - if (typeof responseOptions !== "object") { - throw new InvalidArgumentError("responseOptions must be an object"); - } - } - /** - * Mock an undici request with a defined reply. - */ - reply(replyData) { - if (typeof replyData === "function") { - const wrappedDefaultsCallback = (opts) => { - const resolvedData = replyData(opts); - if (typeof resolvedData !== "object") { - throw new InvalidArgumentError("reply options callback must return an object"); - } - const { statusCode: statusCode2, data: data2 = "", responseOptions: responseOptions2 = {} } = resolvedData; - this.validateReplyParameters(statusCode2, data2, responseOptions2); - return { - ...this.createMockScopeDispatchData(statusCode2, data2, responseOptions2) - }; - }; - const newMockDispatch2 = addMockDispatch(this[kDispatches], this[kDispatchKey], wrappedDefaultsCallback); - return new MockScope(newMockDispatch2); - } - const [statusCode, data = "", responseOptions = {}] = [...arguments]; - this.validateReplyParameters(statusCode, data, responseOptions); - const dispatchData = this.createMockScopeDispatchData(statusCode, data, responseOptions); - const newMockDispatch = addMockDispatch(this[kDispatches], this[kDispatchKey], dispatchData); - return new MockScope(newMockDispatch); - } - /** - * Mock an undici request with a defined error. - */ - replyWithError(error2) { - if (typeof error2 === "undefined") { - throw new InvalidArgumentError("error must be defined"); - } - const newMockDispatch = addMockDispatch(this[kDispatches], this[kDispatchKey], { error: error2 }); - return new MockScope(newMockDispatch); - } - /** - * Set default reply headers on the interceptor for subsequent replies - */ - defaultReplyHeaders(headers) { - if (typeof headers === "undefined") { - throw new InvalidArgumentError("headers must be defined"); - } - this[kDefaultHeaders] = headers; - return this; - } - /** - * Set default reply trailers on the interceptor for subsequent replies - */ - defaultReplyTrailers(trailers) { - if (typeof trailers === "undefined") { - throw new InvalidArgumentError("trailers must be defined"); - } - this[kDefaultTrailers] = trailers; - return this; - } - /** - * Set reply content length header for replies on the interceptor - */ - replyContentLength() { - this[kContentLength] = true; - return this; - } - }; - module2.exports.MockInterceptor = MockInterceptor; - module2.exports.MockScope = MockScope; - } -}); - -// node_modules/undici/lib/mock/mock-client.js -var require_mock_client = __commonJS({ - "node_modules/undici/lib/mock/mock-client.js"(exports2, module2) { - "use strict"; - var { promisify } = require("util"); - var Client = require_client4(); - var { buildMockDispatch } = require_mock_utils(); - var { - kDispatches, - kMockAgent, - kClose, - kOriginalClose, - kOrigin, - kOriginalDispatch, - kConnected - } = require_mock_symbols(); - var { MockInterceptor } = require_mock_interceptor(); - var Symbols = require_symbols(); - var { InvalidArgumentError } = require_errors(); - var MockClient = class extends Client { - constructor(origin, opts) { - super(origin, opts); - if (!opts || !opts.agent || typeof opts.agent.dispatch !== "function") { - throw new InvalidArgumentError("Argument opts.agent must implement Agent"); - } - this[kMockAgent] = opts.agent; - this[kOrigin] = origin; - this[kDispatches] = []; - this[kConnected] = 1; - this[kOriginalDispatch] = this.dispatch; - this[kOriginalClose] = this.close.bind(this); - this.dispatch = buildMockDispatch.call(this); - this.close = this[kClose]; - } - get [Symbols.kConnected]() { - return this[kConnected]; - } - /** - * Sets up the base interceptor for mocking replies from undici. - */ - intercept(opts) { - return new MockInterceptor(opts, this[kDispatches]); - } - async [kClose]() { - await promisify(this[kOriginalClose])(); - this[kConnected] = 0; - this[kMockAgent][Symbols.kClients].delete(this[kOrigin]); - } - }; - module2.exports = MockClient; - } -}); - -// node_modules/undici/lib/mock/mock-pool.js -var require_mock_pool = __commonJS({ - "node_modules/undici/lib/mock/mock-pool.js"(exports2, module2) { - "use strict"; - var { promisify } = require("util"); - var Pool = require_pool2(); - var { buildMockDispatch } = require_mock_utils(); - var { - kDispatches, - kMockAgent, - kClose, - kOriginalClose, - kOrigin, - kOriginalDispatch, - kConnected - } = require_mock_symbols(); - var { MockInterceptor } = require_mock_interceptor(); - var Symbols = require_symbols(); - var { InvalidArgumentError } = require_errors(); - var MockPool = class extends Pool { - constructor(origin, opts) { - super(origin, opts); - if (!opts || !opts.agent || typeof opts.agent.dispatch !== "function") { - throw new InvalidArgumentError("Argument opts.agent must implement Agent"); - } - this[kMockAgent] = opts.agent; - this[kOrigin] = origin; - this[kDispatches] = []; - this[kConnected] = 1; - this[kOriginalDispatch] = this.dispatch; - this[kOriginalClose] = this.close.bind(this); - this.dispatch = buildMockDispatch.call(this); - this.close = this[kClose]; - } - get [Symbols.kConnected]() { - return this[kConnected]; - } - /** - * Sets up the base interceptor for mocking replies from undici. - */ - intercept(opts) { - return new MockInterceptor(opts, this[kDispatches]); - } - async [kClose]() { - await promisify(this[kOriginalClose])(); - this[kConnected] = 0; - this[kMockAgent][Symbols.kClients].delete(this[kOrigin]); - } - }; - module2.exports = MockPool; - } -}); - -// node_modules/undici/lib/mock/pluralizer.js -var require_pluralizer = __commonJS({ - "node_modules/undici/lib/mock/pluralizer.js"(exports2, module2) { - "use strict"; - var singulars = { - pronoun: "it", - is: "is", - was: "was", - this: "this" - }; - var plurals = { - pronoun: "they", - is: "are", - was: "were", - this: "these" - }; - module2.exports = class Pluralizer { - constructor(singular, plural) { - this.singular = singular; - this.plural = plural; - } - pluralize(count) { - const one = count === 1; - const keys = one ? singulars : plurals; - const noun = one ? this.singular : this.plural; - return { ...keys, count, noun }; - } - }; - } -}); - -// node_modules/undici/lib/mock/pending-interceptors-formatter.js -var require_pending_interceptors_formatter = __commonJS({ - "node_modules/undici/lib/mock/pending-interceptors-formatter.js"(exports2, module2) { - "use strict"; - var { Transform } = require("stream"); - var { Console } = require("console"); - module2.exports = class PendingInterceptorsFormatter { - constructor({ disableColors } = {}) { - this.transform = new Transform({ - transform(chunk, _enc, cb) { - cb(null, chunk); - } - }); - this.logger = new Console({ - stdout: this.transform, - inspectOptions: { - colors: !disableColors && !process.env.CI - } - }); - } - format(pendingInterceptors) { - const withPrettyHeaders = pendingInterceptors.map( - ({ method, path, data: { statusCode }, persist, times, timesInvoked, origin }) => ({ - Method: method, - Origin: origin, - Path: path, - "Status code": statusCode, - Persistent: persist ? "\u2705" : "\u274C", - Invocations: timesInvoked, - Remaining: persist ? Infinity : times - timesInvoked - }) - ); - this.logger.table(withPrettyHeaders); - return this.transform.read().toString(); - } - }; - } -}); - -// node_modules/undici/lib/mock/mock-agent.js -var require_mock_agent = __commonJS({ - "node_modules/undici/lib/mock/mock-agent.js"(exports2, module2) { - "use strict"; - var { kClients } = require_symbols(); - var Agent = require_agent(); - var { - kAgent, - kMockAgentSet, - kMockAgentGet, - kDispatches, - kIsMockActive, - kNetConnect, - kGetNetConnect, - kOptions, - kFactory - } = require_mock_symbols(); - var MockClient = require_mock_client(); - var MockPool = require_mock_pool(); - var { matchValue, buildMockOptions } = require_mock_utils(); - var { InvalidArgumentError, UndiciError } = require_errors(); - var Dispatcher = require_dispatcher(); - var Pluralizer = require_pluralizer(); - var PendingInterceptorsFormatter = require_pending_interceptors_formatter(); - var FakeWeakRef = class { - constructor(value) { - this.value = value; - } - deref() { - return this.value; - } - }; - var MockAgent = class extends Dispatcher { - constructor(opts) { - super(opts); - this[kNetConnect] = true; - this[kIsMockActive] = true; - if (opts && opts.agent && typeof opts.agent.dispatch !== "function") { - throw new InvalidArgumentError("Argument opts.agent must implement Agent"); - } - const agent = opts && opts.agent ? opts.agent : new Agent(opts); - this[kAgent] = agent; - this[kClients] = agent[kClients]; - this[kOptions] = buildMockOptions(opts); - } - get(origin) { - let dispatcher = this[kMockAgentGet](origin); - if (!dispatcher) { - dispatcher = this[kFactory](origin); - this[kMockAgentSet](origin, dispatcher); - } - return dispatcher; - } - dispatch(opts, handler2) { - this.get(opts.origin); - return this[kAgent].dispatch(opts, handler2); - } - async close() { - await this[kAgent].close(); - this[kClients].clear(); - } - deactivate() { - this[kIsMockActive] = false; - } - activate() { - this[kIsMockActive] = true; - } - enableNetConnect(matcher) { - if (typeof matcher === "string" || typeof matcher === "function" || matcher instanceof RegExp) { - if (Array.isArray(this[kNetConnect])) { - this[kNetConnect].push(matcher); - } else { - this[kNetConnect] = [matcher]; - } - } else if (typeof matcher === "undefined") { - this[kNetConnect] = true; - } else { - throw new InvalidArgumentError("Unsupported matcher. Must be one of String|Function|RegExp."); - } - } - disableNetConnect() { - this[kNetConnect] = false; - } - // This is required to bypass issues caused by using global symbols - see: - // https://github.com/nodejs/undici/issues/1447 - get isMockActive() { - return this[kIsMockActive]; - } - [kMockAgentSet](origin, dispatcher) { - this[kClients].set(origin, new FakeWeakRef(dispatcher)); - } - [kFactory](origin) { - const mockOptions = Object.assign({ agent: this }, this[kOptions]); - return this[kOptions] && this[kOptions].connections === 1 ? new MockClient(origin, mockOptions) : new MockPool(origin, mockOptions); - } - [kMockAgentGet](origin) { - const ref = this[kClients].get(origin); - if (ref) { - return ref.deref(); - } - if (typeof origin !== "string") { - const dispatcher = this[kFactory]("http://localhost:9999"); - this[kMockAgentSet](origin, dispatcher); - return dispatcher; - } - for (const [keyMatcher, nonExplicitRef] of Array.from(this[kClients])) { - const nonExplicitDispatcher = nonExplicitRef.deref(); - if (nonExplicitDispatcher && typeof keyMatcher !== "string" && matchValue(keyMatcher, origin)) { - const dispatcher = this[kFactory](origin); - this[kMockAgentSet](origin, dispatcher); - dispatcher[kDispatches] = nonExplicitDispatcher[kDispatches]; - return dispatcher; - } - } - } - [kGetNetConnect]() { - return this[kNetConnect]; - } - pendingInterceptors() { - const mockAgentClients = this[kClients]; - return Array.from(mockAgentClients.entries()).flatMap(([origin, scope]) => scope.deref()[kDispatches].map((dispatch) => ({ ...dispatch, origin }))).filter(({ pending }) => pending); - } - assertNoPendingInterceptors({ pendingInterceptorsFormatter = new PendingInterceptorsFormatter() } = {}) { - const pending = this.pendingInterceptors(); - if (pending.length === 0) { - return; - } - const pluralizer = new Pluralizer("interceptor", "interceptors").pluralize(pending.length); - throw new UndiciError(` -${pluralizer.count} ${pluralizer.noun} ${pluralizer.is} pending: - -${pendingInterceptorsFormatter.format(pending)} -`.trim()); - } - }; - module2.exports = MockAgent; - } -}); - -// node_modules/undici/lib/proxy-agent.js -var require_proxy_agent = __commonJS({ - "node_modules/undici/lib/proxy-agent.js"(exports2, module2) { - "use strict"; - var { kProxy, kClose, kDestroy, kInterceptors } = require_symbols(); - var { URL: URL2 } = require("url"); - var Agent = require_agent(); - var Pool = require_pool2(); - var DispatcherBase = require_dispatcher_base(); - var { InvalidArgumentError, RequestAbortedError } = require_errors(); - var buildConnector = require_connect2(); - var kAgent = Symbol("proxy agent"); - var kClient = Symbol("proxy client"); - var kProxyHeaders = Symbol("proxy headers"); - var kRequestTls = Symbol("request tls settings"); - var kProxyTls = Symbol("proxy tls settings"); - var kConnectEndpoint = Symbol("connect endpoint function"); - function defaultProtocolPort(protocol) { - return protocol === "https:" ? 443 : 80; - } - function buildProxyOptions(opts) { - if (typeof opts === "string") { - opts = { uri: opts }; - } - if (!opts || !opts.uri) { - throw new InvalidArgumentError("Proxy opts.uri is mandatory"); - } - return { - uri: opts.uri, - protocol: opts.protocol || "https" - }; - } - function defaultFactory(origin, opts) { - return new Pool(origin, opts); - } - var ProxyAgent = class extends DispatcherBase { - constructor(opts) { - super(opts); - this[kProxy] = buildProxyOptions(opts); - this[kAgent] = new Agent(opts); - this[kInterceptors] = opts.interceptors && opts.interceptors.ProxyAgent && Array.isArray(opts.interceptors.ProxyAgent) ? opts.interceptors.ProxyAgent : []; - if (typeof opts === "string") { - opts = { uri: opts }; - } - if (!opts || !opts.uri) { - throw new InvalidArgumentError("Proxy opts.uri is mandatory"); - } - const { clientFactory = defaultFactory } = opts; - if (typeof clientFactory !== "function") { - throw new InvalidArgumentError("Proxy opts.clientFactory must be a function."); - } - this[kRequestTls] = opts.requestTls; - this[kProxyTls] = opts.proxyTls; - this[kProxyHeaders] = opts.headers || {}; - if (opts.auth && opts.token) { - throw new InvalidArgumentError("opts.auth cannot be used in combination with opts.token"); - } else if (opts.auth) { - this[kProxyHeaders]["proxy-authorization"] = `Basic ${opts.auth}`; - } else if (opts.token) { - this[kProxyHeaders]["proxy-authorization"] = opts.token; - } - const resolvedUrl = new URL2(opts.uri); - const { origin, port, host } = resolvedUrl; - const connect = buildConnector({ ...opts.proxyTls }); - this[kConnectEndpoint] = buildConnector({ ...opts.requestTls }); - this[kClient] = clientFactory(resolvedUrl, { connect }); - this[kAgent] = new Agent({ - ...opts, - connect: async (opts2, callback) => { - let requestedHost = opts2.host; - if (!opts2.port) { - requestedHost += `:${defaultProtocolPort(opts2.protocol)}`; - } - try { - const { socket, statusCode } = await this[kClient].connect({ - origin, - port, - path: requestedHost, - signal: opts2.signal, - headers: { - ...this[kProxyHeaders], - host - } - }); - if (statusCode !== 200) { - socket.on("error", () => { - }).destroy(); - callback(new RequestAbortedError("Proxy response !== 200 when HTTP Tunneling")); - } - if (opts2.protocol !== "https:") { - callback(null, socket); - return; - } - let servername; - if (this[kRequestTls]) { - servername = this[kRequestTls].servername; - } else { - servername = opts2.servername; - } - this[kConnectEndpoint]({ ...opts2, servername, httpSocket: socket }, callback); - } catch (err) { - callback(err); - } - } - }); - } - dispatch(opts, handler2) { - const { host } = new URL2(opts.origin); - const headers = buildHeaders(opts.headers); - throwIfProxyAuthIsSent(headers); - return this[kAgent].dispatch( - { - ...opts, - headers: { - ...headers, - host - } - }, - handler2 - ); - } - async [kClose]() { - await this[kAgent].close(); - await this[kClient].close(); - } - async [kDestroy]() { - await this[kAgent].destroy(); - await this[kClient].destroy(); - } - }; - function buildHeaders(headers) { - if (Array.isArray(headers)) { - const headersPair = {}; - for (let i = 0; i < headers.length; i += 2) { - headersPair[headers[i]] = headers[i + 1]; - } - return headersPair; - } - return headers; - } - function throwIfProxyAuthIsSent(headers) { - const existProxyAuth = headers && Object.keys(headers).find((key) => key.toLowerCase() === "proxy-authorization"); - if (existProxyAuth) { - throw new InvalidArgumentError("Proxy-Authorization should be sent in ProxyAgent constructor"); - } - } - module2.exports = ProxyAgent; - } -}); - -// node_modules/undici/lib/global.js -var require_global2 = __commonJS({ - "node_modules/undici/lib/global.js"(exports2, module2) { - "use strict"; - var globalDispatcher = Symbol.for("undici.globalDispatcher.1"); - var { InvalidArgumentError } = require_errors(); - var Agent = require_agent(); - if (getGlobalDispatcher() === void 0) { - setGlobalDispatcher(new Agent()); - } - function setGlobalDispatcher(agent) { - if (!agent || typeof agent.dispatch !== "function") { - throw new InvalidArgumentError("Argument agent must implement Agent"); - } - Object.defineProperty(globalThis, globalDispatcher, { - value: agent, - writable: true, - enumerable: false, - configurable: false - }); - } - function getGlobalDispatcher() { - return globalThis[globalDispatcher]; - } - module2.exports = { - setGlobalDispatcher, - getGlobalDispatcher - }; - } -}); - -// node_modules/undici/lib/handler/DecoratorHandler.js -var require_DecoratorHandler = __commonJS({ - "node_modules/undici/lib/handler/DecoratorHandler.js"(exports2, module2) { - "use strict"; - module2.exports = class DecoratorHandler { - constructor(handler2) { - this.handler = handler2; - } - onConnect(...args) { - return this.handler.onConnect(...args); - } - onError(...args) { - return this.handler.onError(...args); - } - onUpgrade(...args) { - return this.handler.onUpgrade(...args); - } - onHeaders(...args) { - return this.handler.onHeaders(...args); - } - onData(...args) { - return this.handler.onData(...args); - } - onComplete(...args) { - return this.handler.onComplete(...args); - } - onBodySent(...args) { - return this.handler.onBodySent(...args); - } - }; - } -}); - -// node_modules/undici/lib/fetch/headers.js -var require_headers = __commonJS({ - "node_modules/undici/lib/fetch/headers.js"(exports2, module2) { - "use strict"; - var { kHeadersList } = require_symbols(); - var { kGuard } = require_symbols2(); - var { kEnumerableProperty } = require_util4(); - var { - makeIterator, - isValidHeaderName, - isValidHeaderValue - } = require_util5(); - var { webidl } = require_webidl(); - var assert = require("assert"); - var kHeadersMap = Symbol("headers map"); - var kHeadersSortedMap = Symbol("headers map sorted"); - function headerValueNormalize(potentialValue) { - let i = potentialValue.length; - while (/[\r\n\t ]/.test(potentialValue.charAt(--i))) - ; - return potentialValue.slice(0, i + 1).replace(/^[\r\n\t ]+/, ""); - } - function fill(headers, object) { - if (Array.isArray(object)) { - for (const header of object) { - if (header.length !== 2) { - throw webidl.errors.exception({ - header: "Headers constructor", - message: `expected name/value pair to be length 2, found ${header.length}.` - }); - } - headers.append(header[0], header[1]); - } - } else if (typeof object === "object" && object !== null) { - for (const [key, value] of Object.entries(object)) { - headers.append(key, value); - } - } else { - throw webidl.errors.conversionFailed({ - prefix: "Headers constructor", - argument: "Argument 1", - types: ["sequence>", "record"] - }); - } - } - var HeadersList = class _HeadersList { - /** @type {[string, string][]|null} */ - cookies = null; - constructor(init) { - if (init instanceof _HeadersList) { - this[kHeadersMap] = new Map(init[kHeadersMap]); - this[kHeadersSortedMap] = init[kHeadersSortedMap]; - this.cookies = init.cookies; - } else { - this[kHeadersMap] = new Map(init); - this[kHeadersSortedMap] = null; - } - } - // https://fetch.spec.whatwg.org/#header-list-contains - contains(name) { - name = name.toLowerCase(); - return this[kHeadersMap].has(name); - } - clear() { - this[kHeadersMap].clear(); - this[kHeadersSortedMap] = null; - this.cookies = null; - } - // https://fetch.spec.whatwg.org/#concept-header-list-append - append(name, value) { - this[kHeadersSortedMap] = null; - const lowercaseName = name.toLowerCase(); - const exists = this[kHeadersMap].get(lowercaseName); - if (exists) { - const delimiter = lowercaseName === "cookie" ? "; " : ", "; - this[kHeadersMap].set(lowercaseName, { - name: exists.name, - value: `${exists.value}${delimiter}${value}` - }); - } else { - this[kHeadersMap].set(lowercaseName, { name, value }); - } - if (lowercaseName === "set-cookie") { - this.cookies ??= []; - this.cookies.push(value); - } - } - // https://fetch.spec.whatwg.org/#concept-header-list-set - set(name, value) { - this[kHeadersSortedMap] = null; - const lowercaseName = name.toLowerCase(); - if (lowercaseName === "set-cookie") { - this.cookies = [value]; - } - return this[kHeadersMap].set(lowercaseName, { name, value }); - } - // https://fetch.spec.whatwg.org/#concept-header-list-delete - delete(name) { - this[kHeadersSortedMap] = null; - name = name.toLowerCase(); - if (name === "set-cookie") { - this.cookies = null; - } - return this[kHeadersMap].delete(name); - } - // https://fetch.spec.whatwg.org/#concept-header-list-get - get(name) { - if (!this.contains(name)) { - return null; - } - return this[kHeadersMap].get(name.toLowerCase())?.value ?? null; - } - *[Symbol.iterator]() { - for (const [name, { value }] of this[kHeadersMap]) { - yield [name, value]; - } - } - get entries() { - const headers = {}; - if (this[kHeadersMap].size) { - for (const { name, value } of this[kHeadersMap].values()) { - headers[name] = value; - } - } - return headers; - } - }; - var Headers = class _Headers { - constructor(init = void 0) { - this[kHeadersList] = new HeadersList(); - this[kGuard] = "none"; - if (init !== void 0) { - init = webidl.converters.HeadersInit(init); - fill(this, init); - } - } - // https://fetch.spec.whatwg.org/#dom-headers-append - append(name, value) { - webidl.brandCheck(this, _Headers); - webidl.argumentLengthCheck(arguments, 2, { header: "Headers.append" }); - name = webidl.converters.ByteString(name); - value = webidl.converters.ByteString(value); - value = headerValueNormalize(value); - if (!isValidHeaderName(name)) { - throw webidl.errors.invalidArgument({ - prefix: "Headers.append", - value: name, - type: "header name" - }); - } else if (!isValidHeaderValue(value)) { - throw webidl.errors.invalidArgument({ - prefix: "Headers.append", - value, - type: "header value" - }); - } - if (this[kGuard] === "immutable") { - throw new TypeError("immutable"); - } else if (this[kGuard] === "request-no-cors") { - } - return this[kHeadersList].append(name, value); - } - // https://fetch.spec.whatwg.org/#dom-headers-delete - delete(name) { - webidl.brandCheck(this, _Headers); - webidl.argumentLengthCheck(arguments, 1, { header: "Headers.delete" }); - name = webidl.converters.ByteString(name); - if (!isValidHeaderName(name)) { - throw webidl.errors.invalidArgument({ - prefix: "Headers.delete", - value: name, - type: "header name" - }); - } - if (this[kGuard] === "immutable") { - throw new TypeError("immutable"); - } else if (this[kGuard] === "request-no-cors") { - } - if (!this[kHeadersList].contains(name)) { - return; - } - return this[kHeadersList].delete(name); - } - // https://fetch.spec.whatwg.org/#dom-headers-get - get(name) { - webidl.brandCheck(this, _Headers); - webidl.argumentLengthCheck(arguments, 1, { header: "Headers.get" }); - name = webidl.converters.ByteString(name); - if (!isValidHeaderName(name)) { - throw webidl.errors.invalidArgument({ - prefix: "Headers.get", - value: name, - type: "header name" - }); - } - return this[kHeadersList].get(name); - } - // https://fetch.spec.whatwg.org/#dom-headers-has - has(name) { - webidl.brandCheck(this, _Headers); - webidl.argumentLengthCheck(arguments, 1, { header: "Headers.has" }); - name = webidl.converters.ByteString(name); - if (!isValidHeaderName(name)) { - throw webidl.errors.invalidArgument({ - prefix: "Headers.has", - value: name, - type: "header name" - }); - } - return this[kHeadersList].contains(name); - } - // https://fetch.spec.whatwg.org/#dom-headers-set - set(name, value) { - webidl.brandCheck(this, _Headers); - webidl.argumentLengthCheck(arguments, 2, { header: "Headers.set" }); - name = webidl.converters.ByteString(name); - value = webidl.converters.ByteString(value); - value = headerValueNormalize(value); - if (!isValidHeaderName(name)) { - throw webidl.errors.invalidArgument({ - prefix: "Headers.set", - value: name, - type: "header name" - }); - } else if (!isValidHeaderValue(value)) { - throw webidl.errors.invalidArgument({ - prefix: "Headers.set", - value, - type: "header value" - }); - } - if (this[kGuard] === "immutable") { - throw new TypeError("immutable"); - } else if (this[kGuard] === "request-no-cors") { - } - return this[kHeadersList].set(name, value); - } - // https://fetch.spec.whatwg.org/#dom-headers-getsetcookie - getSetCookie() { - webidl.brandCheck(this, _Headers); - const list = this[kHeadersList].cookies; - if (list) { - return [...list]; - } - return []; - } - // https://fetch.spec.whatwg.org/#concept-header-list-sort-and-combine - get [kHeadersSortedMap]() { - if (this[kHeadersList][kHeadersSortedMap]) { - return this[kHeadersList][kHeadersSortedMap]; - } - const headers = []; - const names = [...this[kHeadersList]].sort((a, b) => a[0] < b[0] ? -1 : 1); - const cookies = this[kHeadersList].cookies; - for (const [name, value] of names) { - if (name === "set-cookie") { - for (const value2 of cookies) { - headers.push([name, value2]); - } - } else { - assert(value !== null); - headers.push([name, value]); - } - } - this[kHeadersList][kHeadersSortedMap] = headers; - return headers; - } - keys() { - webidl.brandCheck(this, _Headers); - return makeIterator( - () => [...this[kHeadersSortedMap].values()], - "Headers", - "key" - ); - } - values() { - webidl.brandCheck(this, _Headers); - return makeIterator( - () => [...this[kHeadersSortedMap].values()], - "Headers", - "value" - ); - } - entries() { - webidl.brandCheck(this, _Headers); - return makeIterator( - () => [...this[kHeadersSortedMap].values()], - "Headers", - "key+value" - ); - } - /** - * @param {(value: string, key: string, self: Headers) => void} callbackFn - * @param {unknown} thisArg - */ - forEach(callbackFn, thisArg = globalThis) { - webidl.brandCheck(this, _Headers); - webidl.argumentLengthCheck(arguments, 1, { header: "Headers.forEach" }); - if (typeof callbackFn !== "function") { - throw new TypeError( - "Failed to execute 'forEach' on 'Headers': parameter 1 is not of type 'Function'." - ); - } - for (const [key, value] of this) { - callbackFn.apply(thisArg, [value, key, this]); - } - } - [Symbol.for("nodejs.util.inspect.custom")]() { - webidl.brandCheck(this, _Headers); - return this[kHeadersList]; - } - }; - Headers.prototype[Symbol.iterator] = Headers.prototype.entries; - Object.defineProperties(Headers.prototype, { - append: kEnumerableProperty, - delete: kEnumerableProperty, - get: kEnumerableProperty, - has: kEnumerableProperty, - set: kEnumerableProperty, - getSetCookie: kEnumerableProperty, - keys: kEnumerableProperty, - values: kEnumerableProperty, - entries: kEnumerableProperty, - forEach: kEnumerableProperty, - [Symbol.iterator]: { enumerable: false }, - [Symbol.toStringTag]: { - value: "Headers", - configurable: true - } - }); - webidl.converters.HeadersInit = function(V) { - if (webidl.util.Type(V) === "Object") { - if (V[Symbol.iterator]) { - return webidl.converters["sequence>"](V); - } - return webidl.converters["record"](V); - } - throw webidl.errors.conversionFailed({ - prefix: "Headers constructor", - argument: "Argument 1", - types: ["sequence>", "record"] - }); - }; - module2.exports = { - fill, - Headers, - HeadersList - }; - } -}); - -// node_modules/undici/lib/fetch/response.js -var require_response = __commonJS({ - "node_modules/undici/lib/fetch/response.js"(exports2, module2) { - "use strict"; - var { Headers, HeadersList, fill } = require_headers(); - var { extractBody, cloneBody, mixinBody } = require_body(); - var util = require_util4(); - var { kEnumerableProperty } = util; - var { - isValidReasonPhrase, - isCancelled, - isAborted, - isBlobLike, - serializeJavascriptValueToJSONString, - isErrorLike, - isomorphicEncode - } = require_util5(); - var { - redirectStatus, - nullBodyStatus, - DOMException: DOMException2 - } = require_constants2(); - var { kState, kHeaders, kGuard, kRealm } = require_symbols2(); - var { webidl } = require_webidl(); - var { FormData } = require_formdata(); - var { getGlobalOrigin } = require_global(); - var { URLSerializer } = require_dataURL(); - var { kHeadersList } = require_symbols(); - var assert = require("assert"); - var { types } = require("util"); - var ReadableStream = globalThis.ReadableStream || require("stream/web").ReadableStream; - var Response = class _Response { - // Creates network error Response. - static error() { - const relevantRealm = { settingsObject: {} }; - const responseObject = new _Response(); - responseObject[kState] = makeNetworkError(); - responseObject[kRealm] = relevantRealm; - responseObject[kHeaders][kHeadersList] = responseObject[kState].headersList; - responseObject[kHeaders][kGuard] = "immutable"; - responseObject[kHeaders][kRealm] = relevantRealm; - return responseObject; - } - // https://fetch.spec.whatwg.org/#dom-response-json - static json(data = void 0, init = {}) { - webidl.argumentLengthCheck(arguments, 1, { header: "Response.json" }); - if (init !== null) { - init = webidl.converters.ResponseInit(init); - } - const bytes = new TextEncoder("utf-8").encode( - serializeJavascriptValueToJSONString(data) - ); - const body = extractBody(bytes); - const relevantRealm = { settingsObject: {} }; - const responseObject = new _Response(); - responseObject[kRealm] = relevantRealm; - responseObject[kHeaders][kGuard] = "response"; - responseObject[kHeaders][kRealm] = relevantRealm; - initializeResponse(responseObject, init, { body: body[0], type: "application/json" }); - return responseObject; - } - // Creates a redirect Response that redirects to url with status status. - static redirect(url, status2 = 302) { - const relevantRealm = { settingsObject: {} }; - webidl.argumentLengthCheck(arguments, 1, { header: "Response.redirect" }); - url = webidl.converters.USVString(url); - status2 = webidl.converters["unsigned short"](status2); - let parsedURL; - try { - parsedURL = new URL(url, getGlobalOrigin()); - } catch (err) { - throw Object.assign(new TypeError("Failed to parse URL from " + url), { - cause: err - }); - } - if (!redirectStatus.includes(status2)) { - throw new RangeError("Invalid status code " + status2); - } - const responseObject = new _Response(); - responseObject[kRealm] = relevantRealm; - responseObject[kHeaders][kGuard] = "immutable"; - responseObject[kHeaders][kRealm] = relevantRealm; - responseObject[kState].status = status2; - const value = isomorphicEncode(URLSerializer(parsedURL)); - responseObject[kState].headersList.append("location", value); - return responseObject; - } - // https://fetch.spec.whatwg.org/#dom-response - constructor(body = null, init = {}) { - if (body !== null) { - body = webidl.converters.BodyInit(body); - } - init = webidl.converters.ResponseInit(init); - this[kRealm] = { settingsObject: {} }; - this[kState] = makeResponse({}); - this[kHeaders] = new Headers(); - this[kHeaders][kGuard] = "response"; - this[kHeaders][kHeadersList] = this[kState].headersList; - this[kHeaders][kRealm] = this[kRealm]; - let bodyWithType = null; - if (body != null) { - const [extractedBody, type] = extractBody(body); - bodyWithType = { body: extractedBody, type }; - } - initializeResponse(this, init, bodyWithType); - } - // Returns response’s type, e.g., "cors". - get type() { - webidl.brandCheck(this, _Response); - return this[kState].type; - } - // Returns response’s URL, if it has one; otherwise the empty string. - get url() { - webidl.brandCheck(this, _Response); - const urlList = this[kState].urlList; - const url = urlList[urlList.length - 1] ?? null; - if (url === null) { - return ""; - } - return URLSerializer(url, true); - } - // Returns whether response was obtained through a redirect. - get redirected() { - webidl.brandCheck(this, _Response); - return this[kState].urlList.length > 1; - } - // Returns response’s status. - get status() { - webidl.brandCheck(this, _Response); - return this[kState].status; - } - // Returns whether response’s status is an ok status. - get ok() { - webidl.brandCheck(this, _Response); - return this[kState].status >= 200 && this[kState].status <= 299; - } - // Returns response’s status message. - get statusText() { - webidl.brandCheck(this, _Response); - return this[kState].statusText; - } - // Returns response’s headers as Headers. - get headers() { - webidl.brandCheck(this, _Response); - return this[kHeaders]; - } - get body() { - webidl.brandCheck(this, _Response); - return this[kState].body ? this[kState].body.stream : null; - } - get bodyUsed() { - webidl.brandCheck(this, _Response); - return !!this[kState].body && util.isDisturbed(this[kState].body.stream); - } - // Returns a clone of response. - clone() { - webidl.brandCheck(this, _Response); - if (this.bodyUsed || this.body && this.body.locked) { - throw webidl.errors.exception({ - header: "Response.clone", - message: "Body has already been consumed." - }); - } - const clonedResponse = cloneResponse(this[kState]); - const clonedResponseObject = new _Response(); - clonedResponseObject[kState] = clonedResponse; - clonedResponseObject[kRealm] = this[kRealm]; - clonedResponseObject[kHeaders][kHeadersList] = clonedResponse.headersList; - clonedResponseObject[kHeaders][kGuard] = this[kHeaders][kGuard]; - clonedResponseObject[kHeaders][kRealm] = this[kHeaders][kRealm]; - return clonedResponseObject; - } - }; - mixinBody(Response); - Object.defineProperties(Response.prototype, { - type: kEnumerableProperty, - url: kEnumerableProperty, - status: kEnumerableProperty, - ok: kEnumerableProperty, - redirected: kEnumerableProperty, - statusText: kEnumerableProperty, - headers: kEnumerableProperty, - clone: kEnumerableProperty, - body: kEnumerableProperty, - bodyUsed: kEnumerableProperty, - [Symbol.toStringTag]: { - value: "Response", - configurable: true - } - }); - Object.defineProperties(Response, { - json: kEnumerableProperty, - redirect: kEnumerableProperty, - error: kEnumerableProperty - }); - function cloneResponse(response) { - if (response.internalResponse) { - return filterResponse( - cloneResponse(response.internalResponse), - response.type - ); - } - const newResponse = makeResponse({ ...response, body: null }); - if (response.body != null) { - newResponse.body = cloneBody(response.body); - } - return newResponse; - } - function makeResponse(init) { - return { - aborted: false, - rangeRequested: false, - timingAllowPassed: false, - requestIncludesCredentials: false, - type: "default", - status: 200, - timingInfo: null, - cacheState: "", - statusText: "", - ...init, - headersList: init.headersList ? new HeadersList(init.headersList) : new HeadersList(), - urlList: init.urlList ? [...init.urlList] : [] - }; - } - function makeNetworkError(reason) { - const isError = isErrorLike(reason); - return makeResponse({ - type: "error", - status: 0, - error: isError ? reason : new Error(reason ? String(reason) : reason), - aborted: reason && reason.name === "AbortError" - }); - } - function makeFilteredResponse(response, state) { - state = { - internalResponse: response, - ...state - }; - return new Proxy(response, { - get(target, p) { - return p in state ? state[p] : target[p]; - }, - set(target, p, value) { - assert(!(p in state)); - target[p] = value; - return true; - } - }); - } - function filterResponse(response, type) { - if (type === "basic") { - return makeFilteredResponse(response, { - type: "basic", - headersList: response.headersList - }); - } else if (type === "cors") { - return makeFilteredResponse(response, { - type: "cors", - headersList: response.headersList - }); - } else if (type === "opaque") { - return makeFilteredResponse(response, { - type: "opaque", - urlList: Object.freeze([]), - status: 0, - statusText: "", - body: null - }); - } else if (type === "opaqueredirect") { - return makeFilteredResponse(response, { - type: "opaqueredirect", - status: 0, - statusText: "", - headersList: [], - body: null - }); - } else { - assert(false); - } - } - function makeAppropriateNetworkError(fetchParams) { - assert(isCancelled(fetchParams)); - return isAborted(fetchParams) ? makeNetworkError(new DOMException2("The operation was aborted.", "AbortError")) : makeNetworkError("Request was cancelled."); - } - function initializeResponse(response, init, body) { - if (init.status !== null && (init.status < 200 || init.status > 599)) { - throw new RangeError('init["status"] must be in the range of 200 to 599, inclusive.'); - } - if ("statusText" in init && init.statusText != null) { - if (!isValidReasonPhrase(String(init.statusText))) { - throw new TypeError("Invalid statusText"); - } - } - if ("status" in init && init.status != null) { - response[kState].status = init.status; - } - if ("statusText" in init && init.statusText != null) { - response[kState].statusText = init.statusText; - } - if ("headers" in init && init.headers != null) { - fill(response[kHeaders], init.headers); - } - if (body) { - if (nullBodyStatus.includes(response.status)) { - throw webidl.errors.exception({ - header: "Response constructor", - message: "Invalid response status code " + response.status - }); - } - response[kState].body = body.body; - if (body.type != null && !response[kState].headersList.contains("Content-Type")) { - response[kState].headersList.append("content-type", body.type); - } - } - } - webidl.converters.ReadableStream = webidl.interfaceConverter( - ReadableStream - ); - webidl.converters.FormData = webidl.interfaceConverter( - FormData - ); - webidl.converters.URLSearchParams = webidl.interfaceConverter( - URLSearchParams - ); - webidl.converters.XMLHttpRequestBodyInit = function(V) { - if (typeof V === "string") { - return webidl.converters.USVString(V); - } - if (isBlobLike(V)) { - return webidl.converters.Blob(V, { strict: false }); - } - if (types.isAnyArrayBuffer(V) || types.isTypedArray(V) || types.isDataView(V)) { - return webidl.converters.BufferSource(V); - } - if (util.isFormDataLike(V)) { - return webidl.converters.FormData(V, { strict: false }); - } - if (V instanceof URLSearchParams) { - return webidl.converters.URLSearchParams(V); - } - return webidl.converters.DOMString(V); - }; - webidl.converters.BodyInit = function(V) { - if (V instanceof ReadableStream) { - return webidl.converters.ReadableStream(V); - } - if (V?.[Symbol.asyncIterator]) { - return V; - } - return webidl.converters.XMLHttpRequestBodyInit(V); - }; - webidl.converters.ResponseInit = webidl.dictionaryConverter([ - { - key: "status", - converter: webidl.converters["unsigned short"], - defaultValue: 200 - }, - { - key: "statusText", - converter: webidl.converters.ByteString, - defaultValue: "" - }, - { - key: "headers", - converter: webidl.converters.HeadersInit - } - ]); - module2.exports = { - makeNetworkError, - makeResponse, - makeAppropriateNetworkError, - filterResponse, - Response, - cloneResponse - }; - } -}); - -// node_modules/undici/lib/fetch/request.js -var require_request2 = __commonJS({ - "node_modules/undici/lib/fetch/request.js"(exports2, module2) { - "use strict"; - var { extractBody, mixinBody, cloneBody } = require_body(); - var { Headers, fill: fillHeaders, HeadersList } = require_headers(); - var { FinalizationRegistry } = require_dispatcher_weakref()(); - var util = require_util4(); - var { - isValidHTTPToken, - sameOrigin, - normalizeMethod, - makePolicyContainer - } = require_util5(); - var { - forbiddenMethods, - corsSafeListedMethods, - referrerPolicy, - requestRedirect, - requestMode, - requestCredentials, - requestCache, - requestDuplex - } = require_constants2(); - var { kEnumerableProperty } = util; - var { kHeaders, kSignal, kState, kGuard, kRealm } = require_symbols2(); - var { webidl } = require_webidl(); - var { getGlobalOrigin } = require_global(); - var { URLSerializer } = require_dataURL(); - var { kHeadersList } = require_symbols(); - var assert = require("assert"); - var { getMaxListeners, setMaxListeners, getEventListeners, defaultMaxListeners } = require("events"); - var TransformStream = globalThis.TransformStream; - var kInit = Symbol("init"); - var kAbortController = Symbol("abortController"); - var requestFinalizer = new FinalizationRegistry(({ signal, abort }) => { - signal.removeEventListener("abort", abort); - }); - var Request = class _Request { - // https://fetch.spec.whatwg.org/#dom-request - constructor(input, init = {}) { - if (input === kInit) { - return; - } - webidl.argumentLengthCheck(arguments, 1, { header: "Request constructor" }); - input = webidl.converters.RequestInfo(input); - init = webidl.converters.RequestInit(init); - this[kRealm] = { - settingsObject: { - baseUrl: getGlobalOrigin(), - get origin() { - return this.baseUrl?.origin; - }, - policyContainer: makePolicyContainer() - } - }; - let request = null; - let fallbackMode = null; - const baseUrl = this[kRealm].settingsObject.baseUrl; - let signal = null; - if (typeof input === "string") { - let parsedURL; - try { - parsedURL = new URL(input, baseUrl); - } catch (err) { - throw new TypeError("Failed to parse URL from " + input, { cause: err }); - } - if (parsedURL.username || parsedURL.password) { - throw new TypeError( - "Request cannot be constructed from a URL that includes credentials: " + input - ); - } - request = makeRequest({ urlList: [parsedURL] }); - fallbackMode = "cors"; - } else { - assert(input instanceof _Request); - request = input[kState]; - signal = input[kSignal]; - } - const origin = this[kRealm].settingsObject.origin; - let window2 = "client"; - if (request.window?.constructor?.name === "EnvironmentSettingsObject" && sameOrigin(request.window, origin)) { - window2 = request.window; - } - if (init.window != null) { - throw new TypeError(`'window' option '${window2}' must be null`); - } - if ("window" in init) { - window2 = "no-window"; - } - request = makeRequest({ - // URL request’s URL. - // undici implementation note: this is set as the first item in request's urlList in makeRequest - // method request’s method. - method: request.method, - // header list A copy of request’s header list. - // undici implementation note: headersList is cloned in makeRequest - headersList: request.headersList, - // unsafe-request flag Set. - unsafeRequest: request.unsafeRequest, - // client This’s relevant settings object. - client: this[kRealm].settingsObject, - // window window. - window: window2, - // priority request’s priority. - priority: request.priority, - // origin request’s origin. The propagation of the origin is only significant for navigation requests - // being handled by a service worker. In this scenario a request can have an origin that is different - // from the current client. - origin: request.origin, - // referrer request’s referrer. - referrer: request.referrer, - // referrer policy request’s referrer policy. - referrerPolicy: request.referrerPolicy, - // mode request’s mode. - mode: request.mode, - // credentials mode request’s credentials mode. - credentials: request.credentials, - // cache mode request’s cache mode. - cache: request.cache, - // redirect mode request’s redirect mode. - redirect: request.redirect, - // integrity metadata request’s integrity metadata. - integrity: request.integrity, - // keepalive request’s keepalive. - keepalive: request.keepalive, - // reload-navigation flag request’s reload-navigation flag. - reloadNavigation: request.reloadNavigation, - // history-navigation flag request’s history-navigation flag. - historyNavigation: request.historyNavigation, - // URL list A clone of request’s URL list. - urlList: [...request.urlList] - }); - if (Object.keys(init).length > 0) { - if (request.mode === "navigate") { - request.mode = "same-origin"; - } - request.reloadNavigation = false; - request.historyNavigation = false; - request.origin = "client"; - request.referrer = "client"; - request.referrerPolicy = ""; - request.url = request.urlList[request.urlList.length - 1]; - request.urlList = [request.url]; - } - if (init.referrer !== void 0) { - const referrer = init.referrer; - if (referrer === "") { - request.referrer = "no-referrer"; - } else { - let parsedReferrer; - try { - parsedReferrer = new URL(referrer, baseUrl); - } catch (err) { - throw new TypeError(`Referrer "${referrer}" is not a valid URL.`, { cause: err }); - } - if (parsedReferrer.protocol === "about:" && parsedReferrer.hostname === "client" || origin && !sameOrigin(parsedReferrer, this[kRealm].settingsObject.baseUrl)) { - request.referrer = "client"; - } else { - request.referrer = parsedReferrer; - } - } - } - if (init.referrerPolicy !== void 0) { - request.referrerPolicy = init.referrerPolicy; - } - let mode; - if (init.mode !== void 0) { - mode = init.mode; - } else { - mode = fallbackMode; - } - if (mode === "navigate") { - throw webidl.errors.exception({ - header: "Request constructor", - message: "invalid request mode navigate." - }); - } - if (mode != null) { - request.mode = mode; - } - if (init.credentials !== void 0) { - request.credentials = init.credentials; - } - if (init.cache !== void 0) { - request.cache = init.cache; - } - if (request.cache === "only-if-cached" && request.mode !== "same-origin") { - throw new TypeError( - "'only-if-cached' can be set only with 'same-origin' mode" - ); - } - if (init.redirect !== void 0) { - request.redirect = init.redirect; - } - if (init.integrity !== void 0 && init.integrity != null) { - request.integrity = String(init.integrity); - } - if (init.keepalive !== void 0) { - request.keepalive = Boolean(init.keepalive); - } - if (init.method !== void 0) { - let method = init.method; - if (!isValidHTTPToken(init.method)) { - throw TypeError(`'${init.method}' is not a valid HTTP method.`); - } - if (forbiddenMethods.indexOf(method.toUpperCase()) !== -1) { - throw TypeError(`'${init.method}' HTTP method is unsupported.`); - } - method = normalizeMethod(init.method); - request.method = method; - } - if (init.signal !== void 0) { - signal = init.signal; - } - this[kState] = request; - const ac2 = new AbortController(); - this[kSignal] = ac2.signal; - this[kSignal][kRealm] = this[kRealm]; - if (signal != null) { - if (!signal || typeof signal.aborted !== "boolean" || typeof signal.addEventListener !== "function") { - throw new TypeError( - "Failed to construct 'Request': member signal is not of type AbortSignal." - ); - } - if (signal.aborted) { - ac2.abort(signal.reason); - } else { - this[kAbortController] = ac2; - const acRef = new WeakRef(ac2); - const abort = function() { - const ac3 = acRef.deref(); - if (ac3 !== void 0) { - ac3.abort(this.reason); - } - }; - try { - if (typeof getMaxListeners === "function" && getMaxListeners(signal) === defaultMaxListeners) { - setMaxListeners(100, signal); - } else if (getEventListeners(signal, "abort").length >= defaultMaxListeners) { - setMaxListeners(100, signal); - } - } catch { - } - util.addAbortListener(signal, abort); - requestFinalizer.register(ac2, { signal, abort }); - } - } - this[kHeaders] = new Headers(); - this[kHeaders][kHeadersList] = request.headersList; - this[kHeaders][kGuard] = "request"; - this[kHeaders][kRealm] = this[kRealm]; - if (mode === "no-cors") { - if (!corsSafeListedMethods.includes(request.method)) { - throw new TypeError( - `'${request.method} is unsupported in no-cors mode.` - ); - } - this[kHeaders][kGuard] = "request-no-cors"; - } - if (Object.keys(init).length !== 0) { - let headers = new Headers(this[kHeaders]); - if (init.headers !== void 0) { - headers = init.headers; - } - this[kHeaders][kHeadersList].clear(); - if (headers.constructor.name === "Headers") { - for (const [key, val] of headers) { - this[kHeaders].append(key, val); - } - } else { - fillHeaders(this[kHeaders], headers); - } - } - const inputBody = input instanceof _Request ? input[kState].body : null; - if ((init.body != null || inputBody != null) && (request.method === "GET" || request.method === "HEAD")) { - throw new TypeError("Request with GET/HEAD method cannot have body."); - } - let initBody = null; - if (init.body != null) { - const [extractedBody, contentType] = extractBody( - init.body, - request.keepalive - ); - initBody = extractedBody; - if (contentType && !this[kHeaders][kHeadersList].contains("content-type")) { - this[kHeaders].append("content-type", contentType); - } - } - const inputOrInitBody = initBody ?? inputBody; - if (inputOrInitBody != null && inputOrInitBody.source == null) { - if (initBody != null && init.duplex == null) { - throw new TypeError("RequestInit: duplex option is required when sending a body."); - } - if (request.mode !== "same-origin" && request.mode !== "cors") { - throw new TypeError( - 'If request is made from ReadableStream, mode should be "same-origin" or "cors"' - ); - } - request.useCORSPreflightFlag = true; - } - let finalBody = inputOrInitBody; - if (initBody == null && inputBody != null) { - if (util.isDisturbed(inputBody.stream) || inputBody.stream.locked) { - throw new TypeError( - "Cannot construct a Request with a Request object that has already been used." - ); - } - if (!TransformStream) { - TransformStream = require("stream/web").TransformStream; - } - const identityTransform = new TransformStream(); - inputBody.stream.pipeThrough(identityTransform); - finalBody = { - source: inputBody.source, - length: inputBody.length, - stream: identityTransform.readable - }; - } - this[kState].body = finalBody; - } - // Returns request’s HTTP method, which is "GET" by default. - get method() { - webidl.brandCheck(this, _Request); - return this[kState].method; - } - // Returns the URL of request as a string. - get url() { - webidl.brandCheck(this, _Request); - return URLSerializer(this[kState].url); - } - // Returns a Headers object consisting of the headers associated with request. - // Note that headers added in the network layer by the user agent will not - // be accounted for in this object, e.g., the "Host" header. - get headers() { - webidl.brandCheck(this, _Request); - return this[kHeaders]; - } - // Returns the kind of resource requested by request, e.g., "document" - // or "script". - get destination() { - webidl.brandCheck(this, _Request); - return this[kState].destination; - } - // Returns the referrer of request. Its value can be a same-origin URL if - // explicitly set in init, the empty string to indicate no referrer, and - // "about:client" when defaulting to the global’s default. This is used - // during fetching to determine the value of the `Referer` header of the - // request being made. - get referrer() { - webidl.brandCheck(this, _Request); - if (this[kState].referrer === "no-referrer") { - return ""; - } - if (this[kState].referrer === "client") { - return "about:client"; - } - return this[kState].referrer.toString(); - } - // Returns the referrer policy associated with request. - // This is used during fetching to compute the value of the request’s - // referrer. - get referrerPolicy() { - webidl.brandCheck(this, _Request); - return this[kState].referrerPolicy; - } - // Returns the mode associated with request, which is a string indicating - // whether the request will use CORS, or will be restricted to same-origin - // URLs. - get mode() { - webidl.brandCheck(this, _Request); - return this[kState].mode; - } - // Returns the credentials mode associated with request, - // which is a string indicating whether credentials will be sent with the - // request always, never, or only when sent to a same-origin URL. - get credentials() { - return this[kState].credentials; - } - // Returns the cache mode associated with request, - // which is a string indicating how the request will - // interact with the browser’s cache when fetching. - get cache() { - webidl.brandCheck(this, _Request); - return this[kState].cache; - } - // Returns the redirect mode associated with request, - // which is a string indicating how redirects for the - // request will be handled during fetching. A request - // will follow redirects by default. - get redirect() { - webidl.brandCheck(this, _Request); - return this[kState].redirect; - } - // Returns request’s subresource integrity metadata, which is a - // cryptographic hash of the resource being fetched. Its value - // consists of multiple hashes separated by whitespace. [SRI] - get integrity() { - webidl.brandCheck(this, _Request); - return this[kState].integrity; - } - // Returns a boolean indicating whether or not request can outlive the - // global in which it was created. - get keepalive() { - webidl.brandCheck(this, _Request); - return this[kState].keepalive; - } - // Returns a boolean indicating whether or not request is for a reload - // navigation. - get isReloadNavigation() { - webidl.brandCheck(this, _Request); - return this[kState].reloadNavigation; - } - // Returns a boolean indicating whether or not request is for a history - // navigation (a.k.a. back-foward navigation). - get isHistoryNavigation() { - webidl.brandCheck(this, _Request); - return this[kState].historyNavigation; - } - // Returns the signal associated with request, which is an AbortSignal - // object indicating whether or not request has been aborted, and its - // abort event handler. - get signal() { - webidl.brandCheck(this, _Request); - return this[kSignal]; - } - get body() { - webidl.brandCheck(this, _Request); - return this[kState].body ? this[kState].body.stream : null; - } - get bodyUsed() { - webidl.brandCheck(this, _Request); - return !!this[kState].body && util.isDisturbed(this[kState].body.stream); - } - get duplex() { - webidl.brandCheck(this, _Request); - return "half"; - } - // Returns a clone of request. - clone() { - webidl.brandCheck(this, _Request); - if (this.bodyUsed || this.body?.locked) { - throw new TypeError("unusable"); - } - const clonedRequest = cloneRequest(this[kState]); - const clonedRequestObject = new _Request(kInit); - clonedRequestObject[kState] = clonedRequest; - clonedRequestObject[kRealm] = this[kRealm]; - clonedRequestObject[kHeaders] = new Headers(); - clonedRequestObject[kHeaders][kHeadersList] = clonedRequest.headersList; - clonedRequestObject[kHeaders][kGuard] = this[kHeaders][kGuard]; - clonedRequestObject[kHeaders][kRealm] = this[kHeaders][kRealm]; - const ac2 = new AbortController(); - if (this.signal.aborted) { - ac2.abort(this.signal.reason); - } else { - util.addAbortListener( - this.signal, - () => { - ac2.abort(this.signal.reason); - } - ); - } - clonedRequestObject[kSignal] = ac2.signal; - return clonedRequestObject; - } - }; - mixinBody(Request); - function makeRequest(init) { - const request = { - method: "GET", - localURLsOnly: false, - unsafeRequest: false, - body: null, - client: null, - reservedClient: null, - replacesClientId: "", - window: "client", - keepalive: false, - serviceWorkers: "all", - initiator: "", - destination: "", - priority: null, - origin: "client", - policyContainer: "client", - referrer: "client", - referrerPolicy: "", - mode: "no-cors", - useCORSPreflightFlag: false, - credentials: "same-origin", - useCredentials: false, - cache: "default", - redirect: "follow", - integrity: "", - cryptoGraphicsNonceMetadata: "", - parserMetadata: "", - reloadNavigation: false, - historyNavigation: false, - userActivation: false, - taintedOrigin: false, - redirectCount: 0, - responseTainting: "basic", - preventNoCacheCacheControlHeaderModification: false, - done: false, - timingAllowFailed: false, - ...init, - headersList: init.headersList ? new HeadersList(init.headersList) : new HeadersList() - }; - request.url = request.urlList[0]; - return request; - } - function cloneRequest(request) { - const newRequest = makeRequest({ ...request, body: null }); - if (request.body != null) { - newRequest.body = cloneBody(request.body); - } - return newRequest; - } - Object.defineProperties(Request.prototype, { - method: kEnumerableProperty, - url: kEnumerableProperty, - headers: kEnumerableProperty, - redirect: kEnumerableProperty, - clone: kEnumerableProperty, - signal: kEnumerableProperty, - duplex: kEnumerableProperty, - destination: kEnumerableProperty, - body: kEnumerableProperty, - bodyUsed: kEnumerableProperty, - isHistoryNavigation: kEnumerableProperty, - isReloadNavigation: kEnumerableProperty, - keepalive: kEnumerableProperty, - integrity: kEnumerableProperty, - cache: kEnumerableProperty, - credentials: kEnumerableProperty, - attribute: kEnumerableProperty, - referrerPolicy: kEnumerableProperty, - referrer: kEnumerableProperty, - mode: kEnumerableProperty, - [Symbol.toStringTag]: { - value: "Request", - configurable: true - } - }); - webidl.converters.Request = webidl.interfaceConverter( - Request - ); - webidl.converters.RequestInfo = function(V) { - if (typeof V === "string") { - return webidl.converters.USVString(V); - } - if (V instanceof Request) { - return webidl.converters.Request(V); - } - return webidl.converters.USVString(V); - }; - webidl.converters.AbortSignal = webidl.interfaceConverter( - AbortSignal - ); - webidl.converters.RequestInit = webidl.dictionaryConverter([ - { - key: "method", - converter: webidl.converters.ByteString - }, - { - key: "headers", - converter: webidl.converters.HeadersInit - }, - { - key: "body", - converter: webidl.nullableConverter( - webidl.converters.BodyInit - ) - }, - { - key: "referrer", - converter: webidl.converters.USVString - }, - { - key: "referrerPolicy", - converter: webidl.converters.DOMString, - // https://w3c.github.io/webappsec-referrer-policy/#referrer-policy - allowedValues: referrerPolicy - }, - { - key: "mode", - converter: webidl.converters.DOMString, - // https://fetch.spec.whatwg.org/#concept-request-mode - allowedValues: requestMode - }, - { - key: "credentials", - converter: webidl.converters.DOMString, - // https://fetch.spec.whatwg.org/#requestcredentials - allowedValues: requestCredentials - }, - { - key: "cache", - converter: webidl.converters.DOMString, - // https://fetch.spec.whatwg.org/#requestcache - allowedValues: requestCache - }, - { - key: "redirect", - converter: webidl.converters.DOMString, - // https://fetch.spec.whatwg.org/#requestredirect - allowedValues: requestRedirect - }, - { - key: "integrity", - converter: webidl.converters.DOMString - }, - { - key: "keepalive", - converter: webidl.converters.boolean - }, - { - key: "signal", - converter: webidl.nullableConverter( - (signal) => webidl.converters.AbortSignal( - signal, - { strict: false } - ) - ) - }, - { - key: "window", - converter: webidl.converters.any - }, - { - key: "duplex", - converter: webidl.converters.DOMString, - allowedValues: requestDuplex - } - ]); - module2.exports = { Request, makeRequest }; - } -}); - -// node_modules/undici/lib/fetch/index.js -var require_fetch2 = __commonJS({ - "node_modules/undici/lib/fetch/index.js"(exports2, module2) { - "use strict"; - var { - Response, - makeNetworkError, - makeAppropriateNetworkError, - filterResponse, - makeResponse - } = require_response(); - var { Headers } = require_headers(); - var { Request, makeRequest } = require_request2(); - var zlib = require("zlib"); - var { - bytesMatch, - makePolicyContainer, - clonePolicyContainer, - requestBadPort, - TAOCheck, - appendRequestOriginHeader, - responseLocationURL, - requestCurrentURL, - setRequestReferrerPolicyOnRedirect, - tryUpgradeRequestToAPotentiallyTrustworthyURL, - createOpaqueTimingInfo, - appendFetchMetadata, - corsCheck, - crossOriginResourcePolicyCheck, - determineRequestsReferrer, - coarsenedSharedCurrentTime, - createDeferredPromise, - isBlobLike, - sameOrigin, - isCancelled, - isAborted, - isErrorLike, - fullyReadBody, - readableStreamClose, - isomorphicEncode, - urlIsLocal, - urlIsHttpHttpsScheme, - urlHasHttpsScheme - } = require_util5(); - var { kState, kHeaders, kGuard, kRealm } = require_symbols2(); - var assert = require("assert"); - var { safelyExtractBody } = require_body(); - var { - redirectStatus, - nullBodyStatus, - safeMethods, - requestBodyHeader, - subresource, - DOMException: DOMException2 - } = require_constants2(); - var { kHeadersList } = require_symbols(); - var EE = require("events"); - var { Readable, pipeline } = require("stream"); - var { addAbortListener, isErrored, isReadable, nodeMajor, nodeMinor } = require_util4(); - var { dataURLProcessor, serializeAMimeType } = require_dataURL(); - var { TransformStream } = require("stream/web"); - var { getGlobalDispatcher } = require_global2(); - var { webidl } = require_webidl(); - var { STATUS_CODES } = require("http"); - var resolveObjectURL; - var ReadableStream = globalThis.ReadableStream; - var Fetch = class extends EE { - constructor(dispatcher) { - super(); - this.dispatcher = dispatcher; - this.connection = null; - this.dump = false; - this.state = "ongoing"; - this.setMaxListeners(21); - } - terminate(reason) { - if (this.state !== "ongoing") { - return; - } - this.state = "terminated"; - this.connection?.destroy(reason); - this.emit("terminated", reason); - } - // https://fetch.spec.whatwg.org/#fetch-controller-abort - abort(error2) { - if (this.state !== "ongoing") { - return; - } - this.state = "aborted"; - if (!error2) { - error2 = new DOMException2("The operation was aborted.", "AbortError"); - } - this.serializedAbortReason = error2; - this.connection?.destroy(error2); - this.emit("terminated", error2); - } - }; - async function fetch(input, init = {}) { - webidl.argumentLengthCheck(arguments, 1, { header: "globalThis.fetch" }); - const p = createDeferredPromise(); - let requestObject; - try { - requestObject = new Request(input, init); - } catch (e) { - p.reject(e); - return p.promise; - } - const request = requestObject[kState]; - if (requestObject.signal.aborted) { - abortFetch(p, request, null, requestObject.signal.reason); - return p.promise; - } - const globalObject = request.client.globalObject; - if (globalObject?.constructor?.name === "ServiceWorkerGlobalScope") { - request.serviceWorkers = "none"; - } - let responseObject = null; - const relevantRealm = null; - let locallyAborted = false; - let controller = null; - addAbortListener( - requestObject.signal, - () => { - locallyAborted = true; - assert(controller != null); - controller.abort(requestObject.signal.reason); - abortFetch(p, request, responseObject, requestObject.signal.reason); - } - ); - const handleFetchDone = (response) => finalizeAndReportTiming(response, "fetch"); - const processResponse = (response) => { - if (locallyAborted) { - return; - } - if (response.aborted) { - abortFetch(p, request, responseObject, controller.serializedAbortReason); - return; - } - if (response.type === "error") { - p.reject( - Object.assign(new TypeError("fetch failed"), { cause: response.error }) - ); - return; - } - responseObject = new Response(); - responseObject[kState] = response; - responseObject[kRealm] = relevantRealm; - responseObject[kHeaders][kHeadersList] = response.headersList; - responseObject[kHeaders][kGuard] = "immutable"; - responseObject[kHeaders][kRealm] = relevantRealm; - p.resolve(responseObject); - }; - controller = fetching({ - request, - processResponseEndOfBody: handleFetchDone, - processResponse, - dispatcher: init.dispatcher ?? getGlobalDispatcher() - // undici - }); - return p.promise; - } - function finalizeAndReportTiming(response, initiatorType = "other") { - if (response.type === "error" && response.aborted) { - return; - } - if (!response.urlList?.length) { - return; - } - const originalURL = response.urlList[0]; - let timingInfo = response.timingInfo; - let cacheState = response.cacheState; - if (!urlIsHttpHttpsScheme(originalURL)) { - return; - } - if (timingInfo === null) { - return; - } - if (!timingInfo.timingAllowPassed) { - timingInfo = createOpaqueTimingInfo({ - startTime: timingInfo.startTime - }); - cacheState = ""; - } - timingInfo.endTime = coarsenedSharedCurrentTime(); - response.timingInfo = timingInfo; - markResourceTiming( - timingInfo, - originalURL, - initiatorType, - globalThis, - cacheState - ); - } - function markResourceTiming(timingInfo, originalURL, initiatorType, globalThis2, cacheState) { - if (nodeMajor > 18 || nodeMajor === 18 && nodeMinor >= 2) { - performance.markResourceTiming(timingInfo, originalURL.href, initiatorType, globalThis2, cacheState); - } - } - function abortFetch(p, request, responseObject, error2) { - if (!error2) { - error2 = new DOMException2("The operation was aborted.", "AbortError"); - } - p.reject(error2); - if (request.body != null && isReadable(request.body?.stream)) { - request.body.stream.cancel(error2).catch((err) => { - if (err.code === "ERR_INVALID_STATE") { - return; - } - throw err; - }); - } - if (responseObject == null) { - return; - } - const response = responseObject[kState]; - if (response.body != null && isReadable(response.body?.stream)) { - response.body.stream.cancel(error2).catch((err) => { - if (err.code === "ERR_INVALID_STATE") { - return; - } - throw err; - }); - } - } - function fetching({ - request, - processRequestBodyChunkLength, - processRequestEndOfBody, - processResponse, - processResponseEndOfBody, - processResponseConsumeBody, - useParallelQueue = false, - dispatcher - // undici - }) { - let taskDestination = null; - let crossOriginIsolatedCapability = false; - if (request.client != null) { - taskDestination = request.client.globalObject; - crossOriginIsolatedCapability = request.client.crossOriginIsolatedCapability; - } - const currenTime = coarsenedSharedCurrentTime(crossOriginIsolatedCapability); - const timingInfo = createOpaqueTimingInfo({ - startTime: currenTime - }); - const fetchParams = { - controller: new Fetch(dispatcher), - request, - timingInfo, - processRequestBodyChunkLength, - processRequestEndOfBody, - processResponse, - processResponseConsumeBody, - processResponseEndOfBody, - taskDestination, - crossOriginIsolatedCapability - }; - assert(!request.body || request.body.stream); - if (request.window === "client") { - request.window = request.client?.globalObject?.constructor?.name === "Window" ? request.client : "no-window"; - } - if (request.origin === "client") { - request.origin = request.client?.origin; - } - if (request.policyContainer === "client") { - if (request.client != null) { - request.policyContainer = clonePolicyContainer( - request.client.policyContainer - ); - } else { - request.policyContainer = makePolicyContainer(); - } - } - if (!request.headersList.contains("accept")) { - const value = "*/*"; - request.headersList.append("accept", value); - } - if (!request.headersList.contains("accept-language")) { - request.headersList.append("accept-language", "*"); - } - if (request.priority === null) { - } - if (subresource.includes(request.destination)) { - } - mainFetch(fetchParams).catch((err) => { - fetchParams.controller.terminate(err); - }); - return fetchParams.controller; - } - async function mainFetch(fetchParams, recursive = false) { - const request = fetchParams.request; - let response = null; - if (request.localURLsOnly && !urlIsLocal(requestCurrentURL(request))) { - response = makeNetworkError("local URLs only"); - } - tryUpgradeRequestToAPotentiallyTrustworthyURL(request); - if (requestBadPort(request) === "blocked") { - response = makeNetworkError("bad port"); - } - if (request.referrerPolicy === "") { - request.referrerPolicy = request.policyContainer.referrerPolicy; - } - if (request.referrer !== "no-referrer") { - request.referrer = determineRequestsReferrer(request); - } - if (response === null) { - response = await (async () => { - const currentURL = requestCurrentURL(request); - if ( - // - request’s current URL’s origin is same origin with request’s origin, - // and request’s response tainting is "basic" - sameOrigin(currentURL, request.url) && request.responseTainting === "basic" || // request’s current URL’s scheme is "data" - currentURL.protocol === "data:" || // - request’s mode is "navigate" or "websocket" - (request.mode === "navigate" || request.mode === "websocket") - ) { - request.responseTainting = "basic"; - return await schemeFetch(fetchParams); - } - if (request.mode === "same-origin") { - return makeNetworkError('request mode cannot be "same-origin"'); - } - if (request.mode === "no-cors") { - if (request.redirect !== "follow") { - return makeNetworkError( - 'redirect mode cannot be "follow" for "no-cors" request' - ); - } - request.responseTainting = "opaque"; - return await schemeFetch(fetchParams); - } - if (!urlIsHttpHttpsScheme(requestCurrentURL(request))) { - return makeNetworkError("URL scheme must be a HTTP(S) scheme"); - } - request.responseTainting = "cors"; - return await httpFetch(fetchParams); - })(); - } - if (recursive) { - return response; - } - if (response.status !== 0 && !response.internalResponse) { - if (request.responseTainting === "cors") { - } - if (request.responseTainting === "basic") { - response = filterResponse(response, "basic"); - } else if (request.responseTainting === "cors") { - response = filterResponse(response, "cors"); - } else if (request.responseTainting === "opaque") { - response = filterResponse(response, "opaque"); - } else { - assert(false); - } - } - let internalResponse = response.status === 0 ? response : response.internalResponse; - if (internalResponse.urlList.length === 0) { - internalResponse.urlList.push(...request.urlList); - } - if (!request.timingAllowFailed) { - response.timingAllowPassed = true; - } - if (response.type === "opaque" && internalResponse.status === 206 && internalResponse.rangeRequested && !request.headers.contains("range")) { - response = internalResponse = makeNetworkError(); - } - if (response.status !== 0 && (request.method === "HEAD" || request.method === "CONNECT" || nullBodyStatus.includes(internalResponse.status))) { - internalResponse.body = null; - fetchParams.controller.dump = true; - } - if (request.integrity) { - const processBodyError = (reason) => fetchFinale(fetchParams, makeNetworkError(reason)); - if (request.responseTainting === "opaque" || response.body == null) { - processBodyError(response.error); - return; - } - const processBody = (bytes) => { - if (!bytesMatch(bytes, request.integrity)) { - processBodyError("integrity mismatch"); - return; - } - response.body = safelyExtractBody(bytes)[0]; - fetchFinale(fetchParams, response); - }; - await fullyReadBody(response.body, processBody, processBodyError); - } else { - fetchFinale(fetchParams, response); - } - } - async function schemeFetch(fetchParams) { - if (isCancelled(fetchParams) && fetchParams.request.redirectCount === 0) { - return makeAppropriateNetworkError(fetchParams); - } - const { request } = fetchParams; - const { protocol: scheme } = requestCurrentURL(request); - switch (scheme) { - case "about:": { - return makeNetworkError("about scheme is not supported"); - } - case "blob:": { - if (!resolveObjectURL) { - resolveObjectURL = require("buffer").resolveObjectURL; - } - const blobURLEntry = requestCurrentURL(request); - if (blobURLEntry.search.length !== 0) { - return makeNetworkError("NetworkError when attempting to fetch resource."); - } - const blobURLEntryObject = resolveObjectURL(blobURLEntry.toString()); - if (request.method !== "GET" || !isBlobLike(blobURLEntryObject)) { - return makeNetworkError("invalid method"); - } - const bodyWithType = safelyExtractBody(blobURLEntryObject); - const body = bodyWithType[0]; - const length = isomorphicEncode(`${body.length}`); - const type = bodyWithType[1] ?? ""; - const response = makeResponse({ - statusText: "OK", - headersList: [ - ["content-length", { name: "Content-Length", value: length }], - ["content-type", { name: "Content-Type", value: type }] - ] - }); - response.body = body; - return response; - } - case "data:": { - const currentURL = requestCurrentURL(request); - const dataURLStruct = dataURLProcessor(currentURL); - if (dataURLStruct === "failure") { - return makeNetworkError("failed to fetch the data URL"); - } - const mimeType = serializeAMimeType(dataURLStruct.mimeType); - return makeResponse({ - statusText: "OK", - headersList: [ - ["content-type", { name: "Content-Type", value: mimeType }] - ], - body: safelyExtractBody(dataURLStruct.body)[0] - }); - } - case "file:": { - return makeNetworkError("not implemented... yet..."); - } - case "http:": - case "https:": { - return await httpFetch(fetchParams).catch((err) => makeNetworkError(err)); - } - default: { - return makeNetworkError("unknown scheme"); - } - } - } - function finalizeResponse(fetchParams, response) { - fetchParams.request.done = true; - if (fetchParams.processResponseDone != null) { - queueMicrotask(() => fetchParams.processResponseDone(response)); - } - } - async function fetchFinale(fetchParams, response) { - if (response.type === "error") { - response.urlList = [fetchParams.request.urlList[0]]; - response.timingInfo = createOpaqueTimingInfo({ - startTime: fetchParams.timingInfo.startTime - }); - } - const processResponseEndOfBody = () => { - fetchParams.request.done = true; - if (fetchParams.processResponseEndOfBody != null) { - queueMicrotask(() => fetchParams.processResponseEndOfBody(response)); - } - }; - if (fetchParams.processResponse != null) { - queueMicrotask(() => fetchParams.processResponse(response)); - } - if (response.body == null) { - processResponseEndOfBody(); - } else { - const identityTransformAlgorithm = (chunk, controller) => { - controller.enqueue(chunk); - }; - const transformStream = new TransformStream({ - start() { - }, - transform: identityTransformAlgorithm, - flush: processResponseEndOfBody - }, { - size() { - return 1; - } - }, { - size() { - return 1; - } - }); - response.body = { stream: response.body.stream.pipeThrough(transformStream) }; - } - if (fetchParams.processResponseConsumeBody != null) { - const processBody = (nullOrBytes) => fetchParams.processResponseConsumeBody(response, nullOrBytes); - const processBodyError = (failure) => fetchParams.processResponseConsumeBody(response, failure); - if (response.body == null) { - queueMicrotask(() => processBody(null)); - } else { - await fullyReadBody(response.body, processBody, processBodyError); - } - } - } - async function httpFetch(fetchParams) { - const request = fetchParams.request; - let response = null; - let actualResponse = null; - const timingInfo = fetchParams.timingInfo; - if (request.serviceWorkers === "all") { - } - if (response === null) { - if (request.redirect === "follow") { - request.serviceWorkers = "none"; - } - actualResponse = response = await httpNetworkOrCacheFetch(fetchParams); - if (request.responseTainting === "cors" && corsCheck(request, response) === "failure") { - return makeNetworkError("cors failure"); - } - if (TAOCheck(request, response) === "failure") { - request.timingAllowFailed = true; - } - } - if ((request.responseTainting === "opaque" || response.type === "opaque") && crossOriginResourcePolicyCheck( - request.origin, - request.client, - request.destination, - actualResponse - ) === "blocked") { - return makeNetworkError("blocked"); - } - if (redirectStatus.includes(actualResponse.status)) { - if (request.redirect !== "manual") { - fetchParams.controller.connection.destroy(); - } - if (request.redirect === "error") { - response = makeNetworkError("unexpected redirect"); - } else if (request.redirect === "manual") { - response = actualResponse; - } else if (request.redirect === "follow") { - response = await httpRedirectFetch(fetchParams, response); - } else { - assert(false); - } - } - response.timingInfo = timingInfo; - return response; - } - async function httpRedirectFetch(fetchParams, response) { - const request = fetchParams.request; - const actualResponse = response.internalResponse ? response.internalResponse : response; - let locationURL; - try { - locationURL = responseLocationURL( - actualResponse, - requestCurrentURL(request).hash - ); - if (locationURL == null) { - return response; - } - } catch (err) { - return makeNetworkError(err); - } - if (!urlIsHttpHttpsScheme(locationURL)) { - return makeNetworkError("URL scheme must be a HTTP(S) scheme"); - } - if (request.redirectCount === 20) { - return makeNetworkError("redirect count exceeded"); - } - request.redirectCount += 1; - if (request.mode === "cors" && (locationURL.username || locationURL.password) && !sameOrigin(request, locationURL)) { - return makeNetworkError('cross origin not allowed for request mode "cors"'); - } - if (request.responseTainting === "cors" && (locationURL.username || locationURL.password)) { - return makeNetworkError( - 'URL cannot contain credentials for request mode "cors"' - ); - } - if (actualResponse.status !== 303 && request.body != null && request.body.source == null) { - return makeNetworkError(); - } - if ([301, 302].includes(actualResponse.status) && request.method === "POST" || actualResponse.status === 303 && !["GET", "HEAD"].includes(request.method)) { - request.method = "GET"; - request.body = null; - for (const headerName of requestBodyHeader) { - request.headersList.delete(headerName); - } - } - if (!sameOrigin(requestCurrentURL(request), locationURL)) { - request.headersList.delete("authorization"); - } - if (request.body != null) { - assert(request.body.source != null); - request.body = safelyExtractBody(request.body.source)[0]; - } - const timingInfo = fetchParams.timingInfo; - timingInfo.redirectEndTime = timingInfo.postRedirectStartTime = coarsenedSharedCurrentTime(fetchParams.crossOriginIsolatedCapability); - if (timingInfo.redirectStartTime === 0) { - timingInfo.redirectStartTime = timingInfo.startTime; - } - request.urlList.push(locationURL); - setRequestReferrerPolicyOnRedirect(request, actualResponse); - return mainFetch(fetchParams, true); - } - async function httpNetworkOrCacheFetch(fetchParams, isAuthenticationFetch = false, isNewConnectionFetch = false) { - const request = fetchParams.request; - let httpFetchParams = null; - let httpRequest = null; - let response = null; - const httpCache = null; - const revalidatingFlag = false; - if (request.window === "no-window" && request.redirect === "error") { - httpFetchParams = fetchParams; - httpRequest = request; - } else { - httpRequest = makeRequest(request); - httpFetchParams = { ...fetchParams }; - httpFetchParams.request = httpRequest; - } - const includeCredentials = request.credentials === "include" || request.credentials === "same-origin" && request.responseTainting === "basic"; - const contentLength = httpRequest.body ? httpRequest.body.length : null; - let contentLengthHeaderValue = null; - if (httpRequest.body == null && ["POST", "PUT"].includes(httpRequest.method)) { - contentLengthHeaderValue = "0"; - } - if (contentLength != null) { - contentLengthHeaderValue = isomorphicEncode(`${contentLength}`); - } - if (contentLengthHeaderValue != null) { - httpRequest.headersList.append("content-length", contentLengthHeaderValue); - } - if (contentLength != null && httpRequest.keepalive) { - } - if (httpRequest.referrer instanceof URL) { - httpRequest.headersList.append("referer", isomorphicEncode(httpRequest.referrer.href)); - } - appendRequestOriginHeader(httpRequest); - appendFetchMetadata(httpRequest); - if (!httpRequest.headersList.contains("user-agent")) { - httpRequest.headersList.append("user-agent", "undici"); - } - if (httpRequest.cache === "default" && (httpRequest.headersList.contains("if-modified-since") || httpRequest.headersList.contains("if-none-match") || httpRequest.headersList.contains("if-unmodified-since") || httpRequest.headersList.contains("if-match") || httpRequest.headersList.contains("if-range"))) { - httpRequest.cache = "no-store"; - } - if (httpRequest.cache === "no-cache" && !httpRequest.preventNoCacheCacheControlHeaderModification && !httpRequest.headersList.contains("cache-control")) { - httpRequest.headersList.append("cache-control", "max-age=0"); - } - if (httpRequest.cache === "no-store" || httpRequest.cache === "reload") { - if (!httpRequest.headersList.contains("pragma")) { - httpRequest.headersList.append("pragma", "no-cache"); - } - if (!httpRequest.headersList.contains("cache-control")) { - httpRequest.headersList.append("cache-control", "no-cache"); - } - } - if (httpRequest.headersList.contains("range")) { - httpRequest.headersList.append("accept-encoding", "identity"); - } - if (!httpRequest.headersList.contains("accept-encoding")) { - if (urlHasHttpsScheme(requestCurrentURL(httpRequest))) { - httpRequest.headersList.append("accept-encoding", "br, gzip, deflate"); - } else { - httpRequest.headersList.append("accept-encoding", "gzip, deflate"); - } - } - if (includeCredentials) { - } - if (httpCache == null) { - httpRequest.cache = "no-store"; - } - if (httpRequest.mode !== "no-store" && httpRequest.mode !== "reload") { - } - if (response == null) { - if (httpRequest.mode === "only-if-cached") { - return makeNetworkError("only if cached"); - } - const forwardResponse = await httpNetworkFetch( - httpFetchParams, - includeCredentials, - isNewConnectionFetch - ); - if (!safeMethods.includes(httpRequest.method) && forwardResponse.status >= 200 && forwardResponse.status <= 399) { - } - if (revalidatingFlag && forwardResponse.status === 304) { - } - if (response == null) { - response = forwardResponse; - } - } - response.urlList = [...httpRequest.urlList]; - if (httpRequest.headersList.contains("range")) { - response.rangeRequested = true; - } - response.requestIncludesCredentials = includeCredentials; - if (response.status === 407) { - if (request.window === "no-window") { - return makeNetworkError(); - } - if (isCancelled(fetchParams)) { - return makeAppropriateNetworkError(fetchParams); - } - return makeNetworkError("proxy authentication required"); - } - if ( - // response’s status is 421 - response.status === 421 && // isNewConnectionFetch is false - !isNewConnectionFetch && // request’s body is null, or request’s body is non-null and request’s body’s source is non-null - (request.body == null || request.body.source != null) - ) { - if (isCancelled(fetchParams)) { - return makeAppropriateNetworkError(fetchParams); - } - fetchParams.controller.connection.destroy(); - response = await httpNetworkOrCacheFetch( - fetchParams, - isAuthenticationFetch, - true - ); - } - if (isAuthenticationFetch) { - } - return response; - } - async function httpNetworkFetch(fetchParams, includeCredentials = false, forceNewConnection = false) { - assert(!fetchParams.controller.connection || fetchParams.controller.connection.destroyed); - fetchParams.controller.connection = { - abort: null, - destroyed: false, - destroy(err) { - if (!this.destroyed) { - this.destroyed = true; - this.abort?.(err ?? new DOMException2("The operation was aborted.", "AbortError")); - } - } - }; - const request = fetchParams.request; - let response = null; - const timingInfo = fetchParams.timingInfo; - const httpCache = null; - if (httpCache == null) { - request.cache = "no-store"; - } - const newConnection = forceNewConnection ? "yes" : "no"; - if (request.mode === "websocket") { - } else { - } - let requestBody = null; - if (request.body == null && fetchParams.processRequestEndOfBody) { - queueMicrotask(() => fetchParams.processRequestEndOfBody()); - } else if (request.body != null) { - const processBodyChunk = async function* (bytes) { - if (isCancelled(fetchParams)) { - return; - } - yield bytes; - fetchParams.processRequestBodyChunkLength?.(bytes.byteLength); - }; - const processEndOfBody = () => { - if (isCancelled(fetchParams)) { - return; - } - if (fetchParams.processRequestEndOfBody) { - fetchParams.processRequestEndOfBody(); - } - }; - const processBodyError = (e) => { - if (isCancelled(fetchParams)) { - return; - } - if (e.name === "AbortError") { - fetchParams.controller.abort(); - } else { - fetchParams.controller.terminate(e); - } - }; - requestBody = async function* () { - try { - for await (const bytes of request.body.stream) { - yield* processBodyChunk(bytes); - } - processEndOfBody(); - } catch (err) { - processBodyError(err); - } - }(); - } - try { - const { body, status: status2, statusText, headersList, socket } = await dispatch({ body: requestBody }); - if (socket) { - response = makeResponse({ status: status2, statusText, headersList, socket }); - } else { - const iterator = body[Symbol.asyncIterator](); - fetchParams.controller.next = () => iterator.next(); - response = makeResponse({ status: status2, statusText, headersList }); - } - } catch (err) { - if (err.name === "AbortError") { - fetchParams.controller.connection.destroy(); - return makeAppropriateNetworkError(fetchParams); - } - return makeNetworkError(err); - } - const pullAlgorithm = () => { - fetchParams.controller.resume(); - }; - const cancelAlgorithm = (reason) => { - fetchParams.controller.abort(reason); - }; - if (!ReadableStream) { - ReadableStream = require("stream/web").ReadableStream; - } - const stream = new ReadableStream( - { - async start(controller) { - fetchParams.controller.controller = controller; - }, - async pull(controller) { - await pullAlgorithm(controller); - }, - async cancel(reason) { - await cancelAlgorithm(reason); - } - }, - { - highWaterMark: 0, - size() { - return 1; - } - } - ); - response.body = { stream }; - fetchParams.controller.on("terminated", onAborted); - fetchParams.controller.resume = async () => { - while (true) { - let bytes; - let isFailure; - try { - const { done, value } = await fetchParams.controller.next(); - if (isAborted(fetchParams)) { - break; - } - bytes = done ? void 0 : value; - } catch (err) { - if (fetchParams.controller.ended && !timingInfo.encodedBodySize) { - bytes = void 0; - } else { - bytes = err; - isFailure = true; - } - } - if (bytes === void 0) { - readableStreamClose(fetchParams.controller.controller); - finalizeResponse(fetchParams, response); - return; - } - timingInfo.decodedBodySize += bytes?.byteLength ?? 0; - if (isFailure) { - fetchParams.controller.terminate(bytes); - return; - } - fetchParams.controller.controller.enqueue(new Uint8Array(bytes)); - if (isErrored(stream)) { - fetchParams.controller.terminate(); - return; - } - if (!fetchParams.controller.controller.desiredSize) { - return; - } - } - }; - function onAborted(reason) { - if (isAborted(fetchParams)) { - response.aborted = true; - if (isReadable(stream)) { - fetchParams.controller.controller.error( - fetchParams.controller.serializedAbortReason - ); - } - } else { - if (isReadable(stream)) { - fetchParams.controller.controller.error(new TypeError("terminated", { - cause: isErrorLike(reason) ? reason : void 0 - })); - } - } - fetchParams.controller.connection.destroy(); - } - return response; - async function dispatch({ body }) { - const url = requestCurrentURL(request); - const agent = fetchParams.controller.dispatcher; - return new Promise((resolve, reject) => agent.dispatch( - { - path: url.pathname + url.search, - origin: url.origin, - method: request.method, - body: fetchParams.controller.dispatcher.isMockActive ? request.body && request.body.source : body, - headers: request.headersList.entries, - maxRedirections: 0, - upgrade: request.mode === "websocket" ? "websocket" : void 0 - }, - { - body: null, - abort: null, - onConnect(abort) { - const { connection } = fetchParams.controller; - if (connection.destroyed) { - abort(new DOMException2("The operation was aborted.", "AbortError")); - } else { - fetchParams.controller.on("terminated", abort); - this.abort = connection.abort = abort; - } - }, - onHeaders(status2, headersList, resume, statusText) { - if (status2 < 200) { - return; - } - let codings = []; - let location = ""; - const headers = new Headers(); - for (let n = 0; n < headersList.length; n += 2) { - const key = headersList[n + 0].toString("latin1"); - const val = headersList[n + 1].toString("latin1"); - if (key.toLowerCase() === "content-encoding") { - codings = val.toLowerCase().split(",").map((x) => x.trim()).reverse(); - } else if (key.toLowerCase() === "location") { - location = val; - } - headers.append(key, val); - } - this.body = new Readable({ read: resume }); - const decoders = []; - const willFollow = request.redirect === "follow" && location && redirectStatus.includes(status2); - if (request.method !== "HEAD" && request.method !== "CONNECT" && !nullBodyStatus.includes(status2) && !willFollow) { - for (const coding of codings) { - if (coding === "x-gzip" || coding === "gzip") { - decoders.push(zlib.createGunzip({ - // Be less strict when decoding compressed responses, since sometimes - // servers send slightly invalid responses that are still accepted - // by common browsers. - // Always using Z_SYNC_FLUSH is what cURL does. - flush: zlib.constants.Z_SYNC_FLUSH, - finishFlush: zlib.constants.Z_SYNC_FLUSH - })); - } else if (coding === "deflate") { - decoders.push(zlib.createInflate()); - } else if (coding === "br") { - decoders.push(zlib.createBrotliDecompress()); - } else { - decoders.length = 0; - break; - } - } - } - resolve({ - status: status2, - statusText, - headersList: headers[kHeadersList], - body: decoders.length ? pipeline(this.body, ...decoders, () => { - }) : this.body.on("error", () => { - }) - }); - return true; - }, - onData(chunk) { - if (fetchParams.controller.dump) { - return; - } - const bytes = chunk; - timingInfo.encodedBodySize += bytes.byteLength; - return this.body.push(bytes); - }, - onComplete() { - if (this.abort) { - fetchParams.controller.off("terminated", this.abort); - } - fetchParams.controller.ended = true; - this.body.push(null); - }, - onError(error2) { - if (this.abort) { - fetchParams.controller.off("terminated", this.abort); - } - this.body?.destroy(error2); - fetchParams.controller.terminate(error2); - reject(error2); - }, - onUpgrade(status2, headersList, socket) { - if (status2 !== 101) { - return; - } - const headers = new Headers(); - for (let n = 0; n < headersList.length; n += 2) { - const key = headersList[n + 0].toString("latin1"); - const val = headersList[n + 1].toString("latin1"); - headers.append(key, val); - } - resolve({ - status: status2, - statusText: STATUS_CODES[status2], - headersList: headers[kHeadersList], - socket - }); - return true; - } - } - )); - } - } - module2.exports = { - fetch, - Fetch, - fetching, - finalizeAndReportTiming - }; - } -}); - -// node_modules/undici/lib/fileapi/symbols.js -var require_symbols3 = __commonJS({ - "node_modules/undici/lib/fileapi/symbols.js"(exports2, module2) { - "use strict"; - module2.exports = { - kState: Symbol("FileReader state"), - kResult: Symbol("FileReader result"), - kError: Symbol("FileReader error"), - kLastProgressEventFired: Symbol("FileReader last progress event fired timestamp"), - kEvents: Symbol("FileReader events"), - kAborted: Symbol("FileReader aborted") - }; - } -}); - -// node_modules/undici/lib/fileapi/progressevent.js -var require_progressevent = __commonJS({ - "node_modules/undici/lib/fileapi/progressevent.js"(exports2, module2) { - "use strict"; - var { webidl } = require_webidl(); - var kState = Symbol("ProgressEvent state"); - var ProgressEvent = class _ProgressEvent extends Event { - constructor(type, eventInitDict = {}) { - type = webidl.converters.DOMString(type); - eventInitDict = webidl.converters.ProgressEventInit(eventInitDict ?? {}); - super(type, eventInitDict); - this[kState] = { - lengthComputable: eventInitDict.lengthComputable, - loaded: eventInitDict.loaded, - total: eventInitDict.total - }; - } - get lengthComputable() { - webidl.brandCheck(this, _ProgressEvent); - return this[kState].lengthComputable; - } - get loaded() { - webidl.brandCheck(this, _ProgressEvent); - return this[kState].loaded; - } - get total() { - webidl.brandCheck(this, _ProgressEvent); - return this[kState].total; - } - }; - webidl.converters.ProgressEventInit = webidl.dictionaryConverter([ - { - key: "lengthComputable", - converter: webidl.converters.boolean, - defaultValue: false - }, - { - key: "loaded", - converter: webidl.converters["unsigned long long"], - defaultValue: 0 - }, - { - key: "total", - converter: webidl.converters["unsigned long long"], - defaultValue: 0 - }, - { - key: "bubbles", - converter: webidl.converters.boolean, - defaultValue: false - }, - { - key: "cancelable", - converter: webidl.converters.boolean, - defaultValue: false - }, - { - key: "composed", - converter: webidl.converters.boolean, - defaultValue: false - } - ]); - module2.exports = { - ProgressEvent - }; - } -}); - -// node_modules/undici/lib/fileapi/encoding.js -var require_encoding = __commonJS({ - "node_modules/undici/lib/fileapi/encoding.js"(exports2, module2) { - "use strict"; - function getEncoding(label) { - if (!label) { - return "failure"; - } - switch (label.trim().toLowerCase()) { - case "unicode-1-1-utf-8": - case "unicode11utf8": - case "unicode20utf8": - case "utf-8": - case "utf8": - case "x-unicode20utf8": - return "UTF-8"; - case "866": - case "cp866": - case "csibm866": - case "ibm866": - return "IBM866"; - case "csisolatin2": - case "iso-8859-2": - case "iso-ir-101": - case "iso8859-2": - case "iso88592": - case "iso_8859-2": - case "iso_8859-2:1987": - case "l2": - case "latin2": - return "ISO-8859-2"; - case "csisolatin3": - case "iso-8859-3": - case "iso-ir-109": - case "iso8859-3": - case "iso88593": - case "iso_8859-3": - case "iso_8859-3:1988": - case "l3": - case "latin3": - return "ISO-8859-3"; - case "csisolatin4": - case "iso-8859-4": - case "iso-ir-110": - case "iso8859-4": - case "iso88594": - case "iso_8859-4": - case "iso_8859-4:1988": - case "l4": - case "latin4": - return "ISO-8859-4"; - case "csisolatincyrillic": - case "cyrillic": - case "iso-8859-5": - case "iso-ir-144": - case "iso8859-5": - case "iso88595": - case "iso_8859-5": - case "iso_8859-5:1988": - return "ISO-8859-5"; - case "arabic": - case "asmo-708": - case "csiso88596e": - case "csiso88596i": - case "csisolatinarabic": - case "ecma-114": - case "iso-8859-6": - case "iso-8859-6-e": - case "iso-8859-6-i": - case "iso-ir-127": - case "iso8859-6": - case "iso88596": - case "iso_8859-6": - case "iso_8859-6:1987": - return "ISO-8859-6"; - case "csisolatingreek": - case "ecma-118": - case "elot_928": - case "greek": - case "greek8": - case "iso-8859-7": - case "iso-ir-126": - case "iso8859-7": - case "iso88597": - case "iso_8859-7": - case "iso_8859-7:1987": - case "sun_eu_greek": - return "ISO-8859-7"; - case "csiso88598e": - case "csisolatinhebrew": - case "hebrew": - case "iso-8859-8": - case "iso-8859-8-e": - case "iso-ir-138": - case "iso8859-8": - case "iso88598": - case "iso_8859-8": - case "iso_8859-8:1988": - case "visual": - return "ISO-8859-8"; - case "csiso88598i": - case "iso-8859-8-i": - case "logical": - return "ISO-8859-8-I"; - case "csisolatin6": - case "iso-8859-10": - case "iso-ir-157": - case "iso8859-10": - case "iso885910": - case "l6": - case "latin6": - return "ISO-8859-10"; - case "iso-8859-13": - case "iso8859-13": - case "iso885913": - return "ISO-8859-13"; - case "iso-8859-14": - case "iso8859-14": - case "iso885914": - return "ISO-8859-14"; - case "csisolatin9": - case "iso-8859-15": - case "iso8859-15": - case "iso885915": - case "iso_8859-15": - case "l9": - return "ISO-8859-15"; - case "iso-8859-16": - return "ISO-8859-16"; - case "cskoi8r": - case "koi": - case "koi8": - case "koi8-r": - case "koi8_r": - return "KOI8-R"; - case "koi8-ru": - case "koi8-u": - return "KOI8-U"; - case "csmacintosh": - case "mac": - case "macintosh": - case "x-mac-roman": - return "macintosh"; - case "iso-8859-11": - case "iso8859-11": - case "iso885911": - case "tis-620": - case "windows-874": - return "windows-874"; - case "cp1250": - case "windows-1250": - case "x-cp1250": - return "windows-1250"; - case "cp1251": - case "windows-1251": - case "x-cp1251": - return "windows-1251"; - case "ansi_x3.4-1968": - case "ascii": - case "cp1252": - case "cp819": - case "csisolatin1": - case "ibm819": - case "iso-8859-1": - case "iso-ir-100": - case "iso8859-1": - case "iso88591": - case "iso_8859-1": - case "iso_8859-1:1987": - case "l1": - case "latin1": - case "us-ascii": - case "windows-1252": - case "x-cp1252": - return "windows-1252"; - case "cp1253": - case "windows-1253": - case "x-cp1253": - return "windows-1253"; - case "cp1254": - case "csisolatin5": - case "iso-8859-9": - case "iso-ir-148": - case "iso8859-9": - case "iso88599": - case "iso_8859-9": - case "iso_8859-9:1989": - case "l5": - case "latin5": - case "windows-1254": - case "x-cp1254": - return "windows-1254"; - case "cp1255": - case "windows-1255": - case "x-cp1255": - return "windows-1255"; - case "cp1256": - case "windows-1256": - case "x-cp1256": - return "windows-1256"; - case "cp1257": - case "windows-1257": - case "x-cp1257": - return "windows-1257"; - case "cp1258": - case "windows-1258": - case "x-cp1258": - return "windows-1258"; - case "x-mac-cyrillic": - case "x-mac-ukrainian": - return "x-mac-cyrillic"; - case "chinese": - case "csgb2312": - case "csiso58gb231280": - case "gb2312": - case "gb_2312": - case "gb_2312-80": - case "gbk": - case "iso-ir-58": - case "x-gbk": - return "GBK"; - case "gb18030": - return "gb18030"; - case "big5": - case "big5-hkscs": - case "cn-big5": - case "csbig5": - case "x-x-big5": - return "Big5"; - case "cseucpkdfmtjapanese": - case "euc-jp": - case "x-euc-jp": - return "EUC-JP"; - case "csiso2022jp": - case "iso-2022-jp": - return "ISO-2022-JP"; - case "csshiftjis": - case "ms932": - case "ms_kanji": - case "shift-jis": - case "shift_jis": - case "sjis": - case "windows-31j": - case "x-sjis": - return "Shift_JIS"; - case "cseuckr": - case "csksc56011987": - case "euc-kr": - case "iso-ir-149": - case "korean": - case "ks_c_5601-1987": - case "ks_c_5601-1989": - case "ksc5601": - case "ksc_5601": - case "windows-949": - return "EUC-KR"; - case "csiso2022kr": - case "hz-gb-2312": - case "iso-2022-cn": - case "iso-2022-cn-ext": - case "iso-2022-kr": - case "replacement": - return "replacement"; - case "unicodefffe": - case "utf-16be": - return "UTF-16BE"; - case "csunicode": - case "iso-10646-ucs-2": - case "ucs-2": - case "unicode": - case "unicodefeff": - case "utf-16": - case "utf-16le": - return "UTF-16LE"; - case "x-user-defined": - return "x-user-defined"; - default: - return "failure"; - } - } - module2.exports = { - getEncoding - }; - } -}); - -// node_modules/undici/lib/fileapi/util.js -var require_util7 = __commonJS({ - "node_modules/undici/lib/fileapi/util.js"(exports2, module2) { - "use strict"; - var { - kState, - kError, - kResult, - kAborted, - kLastProgressEventFired - } = require_symbols3(); - var { ProgressEvent } = require_progressevent(); - var { getEncoding } = require_encoding(); - var { DOMException: DOMException2 } = require_constants2(); - var { serializeAMimeType, parseMIMEType } = require_dataURL(); - var { types } = require("util"); - var { StringDecoder } = require("string_decoder"); - var { btoa } = require("buffer"); - var staticPropertyDescriptors = { - enumerable: true, - writable: false, - configurable: false - }; - function readOperation(fr2, blob, type, encodingName) { - if (fr2[kState] === "loading") { - throw new DOMException2("Invalid state", "InvalidStateError"); - } - fr2[kState] = "loading"; - fr2[kResult] = null; - fr2[kError] = null; - const stream = blob.stream(); - const reader = stream.getReader(); - const bytes = []; - let chunkPromise = reader.read(); - let isFirstChunk = true; - (async () => { - while (!fr2[kAborted]) { - try { - const { done, value } = await chunkPromise; - if (isFirstChunk && !fr2[kAborted]) { - queueMicrotask(() => { - fireAProgressEvent("loadstart", fr2); - }); - } - isFirstChunk = false; - if (!done && types.isUint8Array(value)) { - bytes.push(value); - if ((fr2[kLastProgressEventFired] === void 0 || Date.now() - fr2[kLastProgressEventFired] >= 50) && !fr2[kAborted]) { - fr2[kLastProgressEventFired] = Date.now(); - queueMicrotask(() => { - fireAProgressEvent("progress", fr2); - }); - } - chunkPromise = reader.read(); - } else if (done) { - queueMicrotask(() => { - fr2[kState] = "done"; - try { - const result = packageData(bytes, type, blob.type, encodingName); - if (fr2[kAborted]) { - return; - } - fr2[kResult] = result; - fireAProgressEvent("load", fr2); - } catch (error2) { - fr2[kError] = error2; - fireAProgressEvent("error", fr2); - } - if (fr2[kState] !== "loading") { - fireAProgressEvent("loadend", fr2); - } - }); - break; - } - } catch (error2) { - if (fr2[kAborted]) { - return; - } - queueMicrotask(() => { - fr2[kState] = "done"; - fr2[kError] = error2; - fireAProgressEvent("error", fr2); - if (fr2[kState] !== "loading") { - fireAProgressEvent("loadend", fr2); - } - }); - break; - } - } - })(); - } - function fireAProgressEvent(e, reader) { - const event = new ProgressEvent(e, { - bubbles: false, - cancelable: false - }); - reader.dispatchEvent(event); - } - function packageData(bytes, type, mimeType, encodingName) { - switch (type) { - case "DataURL": { - let dataURL = "data:"; - const parsed = parseMIMEType(mimeType || "application/octet-stream"); - if (parsed !== "failure") { - dataURL += serializeAMimeType(parsed); - } - dataURL += ";base64,"; - const decoder = new StringDecoder("latin1"); - for (const chunk of bytes) { - dataURL += btoa(decoder.write(chunk)); - } - dataURL += btoa(decoder.end()); - return dataURL; - } - case "Text": { - let encoding = "failure"; - if (encodingName) { - encoding = getEncoding(encodingName); - } - if (encoding === "failure" && mimeType) { - const type2 = parseMIMEType(mimeType); - if (type2 !== "failure") { - encoding = getEncoding(type2.parameters.get("charset")); - } - } - if (encoding === "failure") { - encoding = "UTF-8"; - } - return decode(bytes, encoding); - } - case "ArrayBuffer": { - const sequence = combineByteSequences(bytes); - return sequence.buffer; - } - case "BinaryString": { - let binaryString = ""; - const decoder = new StringDecoder("latin1"); - for (const chunk of bytes) { - binaryString += decoder.write(chunk); - } - binaryString += decoder.end(); - return binaryString; - } - } - } - function decode(ioQueue, encoding) { - const bytes = combineByteSequences(ioQueue); - const BOMEncoding = BOMSniffing(bytes); - let slice = 0; - if (BOMEncoding !== null) { - encoding = BOMEncoding; - slice = BOMEncoding === "UTF-8" ? 3 : 2; - } - const sliced = bytes.slice(slice); - return new TextDecoder(encoding).decode(sliced); - } - function BOMSniffing(ioQueue) { - const [a, b, c] = ioQueue; - if (a === 239 && b === 187 && c === 191) { - return "UTF-8"; - } else if (a === 254 && b === 255) { - return "UTF-16BE"; - } else if (a === 255 && b === 254) { - return "UTF-16LE"; - } - return null; - } - function combineByteSequences(sequences) { - const size = sequences.reduce((a, b) => { - return a + b.byteLength; - }, 0); - let offset = 0; - return sequences.reduce((a, b) => { - a.set(b, offset); - offset += b.byteLength; - return a; - }, new Uint8Array(size)); - } - module2.exports = { - staticPropertyDescriptors, - readOperation, - fireAProgressEvent - }; - } -}); - -// node_modules/undici/lib/fileapi/filereader.js -var require_filereader = __commonJS({ - "node_modules/undici/lib/fileapi/filereader.js"(exports2, module2) { - "use strict"; - var { - staticPropertyDescriptors, - readOperation, - fireAProgressEvent - } = require_util7(); - var { - kState, - kError, - kResult, - kEvents, - kAborted - } = require_symbols3(); - var { webidl } = require_webidl(); - var { kEnumerableProperty } = require_util4(); - var FileReader = class _FileReader extends EventTarget { - constructor() { - super(); - this[kState] = "empty"; - this[kResult] = null; - this[kError] = null; - this[kEvents] = { - loadend: null, - error: null, - abort: null, - load: null, - progress: null, - loadstart: null - }; - } - /** - * @see https://w3c.github.io/FileAPI/#dfn-readAsArrayBuffer - * @param {import('buffer').Blob} blob - */ - readAsArrayBuffer(blob) { - webidl.brandCheck(this, _FileReader); - webidl.argumentLengthCheck(arguments, 1, { header: "FileReader.readAsArrayBuffer" }); - blob = webidl.converters.Blob(blob, { strict: false }); - readOperation(this, blob, "ArrayBuffer"); - } - /** - * @see https://w3c.github.io/FileAPI/#readAsBinaryString - * @param {import('buffer').Blob} blob - */ - readAsBinaryString(blob) { - webidl.brandCheck(this, _FileReader); - webidl.argumentLengthCheck(arguments, 1, { header: "FileReader.readAsBinaryString" }); - blob = webidl.converters.Blob(blob, { strict: false }); - readOperation(this, blob, "BinaryString"); - } - /** - * @see https://w3c.github.io/FileAPI/#readAsDataText - * @param {import('buffer').Blob} blob - * @param {string?} encoding - */ - readAsText(blob, encoding = void 0) { - webidl.brandCheck(this, _FileReader); - webidl.argumentLengthCheck(arguments, 1, { header: "FileReader.readAsText" }); - blob = webidl.converters.Blob(blob, { strict: false }); - if (encoding !== void 0) { - encoding = webidl.converters.DOMString(encoding); - } - readOperation(this, blob, "Text", encoding); - } - /** - * @see https://w3c.github.io/FileAPI/#dfn-readAsDataURL - * @param {import('buffer').Blob} blob - */ - readAsDataURL(blob) { - webidl.brandCheck(this, _FileReader); - webidl.argumentLengthCheck(arguments, 1, { header: "FileReader.readAsDataURL" }); - blob = webidl.converters.Blob(blob, { strict: false }); - readOperation(this, blob, "DataURL"); - } - /** - * @see https://w3c.github.io/FileAPI/#dfn-abort - */ - abort() { - if (this[kState] === "empty" || this[kState] === "done") { - this[kResult] = null; - return; - } - if (this[kState] === "loading") { - this[kState] = "done"; - this[kResult] = null; - } - this[kAborted] = true; - fireAProgressEvent("abort", this); - if (this[kState] !== "loading") { - fireAProgressEvent("loadend", this); - } - } - /** - * @see https://w3c.github.io/FileAPI/#dom-filereader-readystate - */ - get readyState() { - webidl.brandCheck(this, _FileReader); - switch (this[kState]) { - case "empty": - return this.EMPTY; - case "loading": - return this.LOADING; - case "done": - return this.DONE; - } - } - /** - * @see https://w3c.github.io/FileAPI/#dom-filereader-result - */ - get result() { - webidl.brandCheck(this, _FileReader); - return this[kResult]; - } - /** - * @see https://w3c.github.io/FileAPI/#dom-filereader-error - */ - get error() { - webidl.brandCheck(this, _FileReader); - return this[kError]; - } - get onloadend() { - webidl.brandCheck(this, _FileReader); - return this[kEvents].loadend; - } - set onloadend(fn) { - webidl.brandCheck(this, _FileReader); - if (this[kEvents].loadend) { - this.removeEventListener("loadend", this[kEvents].loadend); - } - if (typeof fn === "function") { - this[kEvents].loadend = fn; - this.addEventListener("loadend", fn); - } else { - this[kEvents].loadend = null; - } - } - get onerror() { - webidl.brandCheck(this, _FileReader); - return this[kEvents].error; - } - set onerror(fn) { - webidl.brandCheck(this, _FileReader); - if (this[kEvents].error) { - this.removeEventListener("error", this[kEvents].error); - } - if (typeof fn === "function") { - this[kEvents].error = fn; - this.addEventListener("error", fn); - } else { - this[kEvents].error = null; - } - } - get onloadstart() { - webidl.brandCheck(this, _FileReader); - return this[kEvents].loadstart; - } - set onloadstart(fn) { - webidl.brandCheck(this, _FileReader); - if (this[kEvents].loadstart) { - this.removeEventListener("loadstart", this[kEvents].loadstart); - } - if (typeof fn === "function") { - this[kEvents].loadstart = fn; - this.addEventListener("loadstart", fn); - } else { - this[kEvents].loadstart = null; - } - } - get onprogress() { - webidl.brandCheck(this, _FileReader); - return this[kEvents].progress; - } - set onprogress(fn) { - webidl.brandCheck(this, _FileReader); - if (this[kEvents].progress) { - this.removeEventListener("progress", this[kEvents].progress); - } - if (typeof fn === "function") { - this[kEvents].progress = fn; - this.addEventListener("progress", fn); - } else { - this[kEvents].progress = null; - } - } - get onload() { - webidl.brandCheck(this, _FileReader); - return this[kEvents].load; - } - set onload(fn) { - webidl.brandCheck(this, _FileReader); - if (this[kEvents].load) { - this.removeEventListener("load", this[kEvents].load); - } - if (typeof fn === "function") { - this[kEvents].load = fn; - this.addEventListener("load", fn); - } else { - this[kEvents].load = null; - } - } - get onabort() { - webidl.brandCheck(this, _FileReader); - return this[kEvents].abort; - } - set onabort(fn) { - webidl.brandCheck(this, _FileReader); - if (this[kEvents].abort) { - this.removeEventListener("abort", this[kEvents].abort); - } - if (typeof fn === "function") { - this[kEvents].abort = fn; - this.addEventListener("abort", fn); - } else { - this[kEvents].abort = null; - } - } - }; - FileReader.EMPTY = FileReader.prototype.EMPTY = 0; - FileReader.LOADING = FileReader.prototype.LOADING = 1; - FileReader.DONE = FileReader.prototype.DONE = 2; - Object.defineProperties(FileReader.prototype, { - EMPTY: staticPropertyDescriptors, - LOADING: staticPropertyDescriptors, - DONE: staticPropertyDescriptors, - readAsArrayBuffer: kEnumerableProperty, - readAsBinaryString: kEnumerableProperty, - readAsText: kEnumerableProperty, - readAsDataURL: kEnumerableProperty, - abort: kEnumerableProperty, - readyState: kEnumerableProperty, - result: kEnumerableProperty, - error: kEnumerableProperty, - onloadstart: kEnumerableProperty, - onprogress: kEnumerableProperty, - onload: kEnumerableProperty, - onabort: kEnumerableProperty, - onerror: kEnumerableProperty, - onloadend: kEnumerableProperty, - [Symbol.toStringTag]: { - value: "FileReader", - writable: false, - enumerable: false, - configurable: true - } - }); - Object.defineProperties(FileReader, { - EMPTY: staticPropertyDescriptors, - LOADING: staticPropertyDescriptors, - DONE: staticPropertyDescriptors - }); - module2.exports = { - FileReader - }; - } -}); - -// node_modules/undici/lib/cache/symbols.js -var require_symbols4 = __commonJS({ - "node_modules/undici/lib/cache/symbols.js"(exports2, module2) { - "use strict"; - module2.exports = { - kConstruct: Symbol("constructable") - }; - } -}); - -// node_modules/undici/lib/cache/util.js -var require_util8 = __commonJS({ - "node_modules/undici/lib/cache/util.js"(exports2, module2) { - "use strict"; - var assert = require("assert"); - var { URLSerializer } = require_dataURL(); - var { isValidHeaderName } = require_util5(); - function urlEquals(A2, B2, excludeFragment = false) { - const serializedA = URLSerializer(A2, excludeFragment); - const serializedB = URLSerializer(B2, excludeFragment); - return serializedA === serializedB; - } - function fieldValues(header) { - assert(header !== null); - const values = []; - for (let value of header.split(",")) { - value = value.trim(); - if (!value.length) { - continue; - } else if (!isValidHeaderName(value)) { - continue; - } - values.push(value); - } - return values; - } - module2.exports = { - urlEquals, - fieldValues - }; - } -}); - -// node_modules/undici/lib/cache/cache.js -var require_cache = __commonJS({ - "node_modules/undici/lib/cache/cache.js"(exports2, module2) { - "use strict"; - var { kConstruct } = require_symbols4(); - var { urlEquals, fieldValues: getFieldValues } = require_util8(); - var { kEnumerableProperty, isDisturbed } = require_util4(); - var { kHeadersList } = require_symbols(); - var { webidl } = require_webidl(); - var { Response, cloneResponse } = require_response(); - var { Request } = require_request2(); - var { kState, kHeaders, kGuard, kRealm } = require_symbols2(); - var { fetching } = require_fetch2(); - var { urlIsHttpHttpsScheme, createDeferredPromise, readAllBytes } = require_util5(); - var assert = require("assert"); - var { getGlobalDispatcher } = require_global2(); - var Cache = class _Cache { - /** - * @see https://w3c.github.io/ServiceWorker/#dfn-relevant-request-response-list - * @type {requestResponseList} - */ - #relevantRequestResponseList; - constructor() { - if (arguments[0] !== kConstruct) { - webidl.illegalConstructor(); - } - this.#relevantRequestResponseList = arguments[1]; - } - async match(request, options2 = {}) { - webidl.brandCheck(this, _Cache); - webidl.argumentLengthCheck(arguments, 1, { header: "Cache.match" }); - request = webidl.converters.RequestInfo(request); - options2 = webidl.converters.CacheQueryOptions(options2); - const p = await this.matchAll(request, options2); - if (p.length === 0) { - return; - } - return p[0]; - } - async matchAll(request = void 0, options2 = {}) { - webidl.brandCheck(this, _Cache); - if (request !== void 0) - request = webidl.converters.RequestInfo(request); - options2 = webidl.converters.CacheQueryOptions(options2); - let r = null; - if (request !== void 0) { - if (request instanceof Request) { - r = request[kState]; - if (r.method !== "GET" && !options2.ignoreMethod) { - return []; - } - } else if (typeof request === "string") { - r = new Request(request)[kState]; - } - } - const responses = []; - if (request === void 0) { - for (const requestResponse of this.#relevantRequestResponseList) { - responses.push(requestResponse[1]); - } - } else { - const requestResponses = this.#queryCache(r, options2); - for (const requestResponse of requestResponses) { - responses.push(requestResponse[1]); - } - } - const responseList = []; - for (const response of responses) { - const responseObject = new Response(response.body?.source ?? null); - const body = responseObject[kState].body; - responseObject[kState] = response; - responseObject[kState].body = body; - responseObject[kHeaders][kHeadersList] = response.headersList; - responseObject[kHeaders][kGuard] = "immutable"; - responseList.push(responseObject); - } - return Object.freeze(responseList); - } - async add(request) { - webidl.brandCheck(this, _Cache); - webidl.argumentLengthCheck(arguments, 1, { header: "Cache.add" }); - request = webidl.converters.RequestInfo(request); - const requests = [request]; - const responseArrayPromise = this.addAll(requests); - return await responseArrayPromise; - } - async addAll(requests) { - webidl.brandCheck(this, _Cache); - webidl.argumentLengthCheck(arguments, 1, { header: "Cache.addAll" }); - requests = webidl.converters["sequence"](requests); - const responsePromises = []; - const requestList = []; - for (const request of requests) { - if (typeof request === "string") { - continue; - } - const r = request[kState]; - if (!urlIsHttpHttpsScheme(r.url) || r.method !== "GET") { - throw webidl.errors.exception({ - header: "Cache.addAll", - message: "Expected http/s scheme when method is not GET." - }); - } - } - const fetchControllers = []; - for (const request of requests) { - const r = new Request(request)[kState]; - if (!urlIsHttpHttpsScheme(r.url)) { - throw webidl.errors.exception({ - header: "Cache.addAll", - message: "Expected http/s scheme." - }); - } - r.initiator = "fetch"; - r.destination = "subresource"; - requestList.push(r); - const responsePromise = createDeferredPromise(); - fetchControllers.push(fetching({ - request: r, - dispatcher: getGlobalDispatcher(), - processResponse(response) { - if (response.type === "error" || response.status === 206 || response.status < 200 || response.status > 299) { - responsePromise.reject(webidl.errors.exception({ - header: "Cache.addAll", - message: "Received an invalid status code or the request failed." - })); - } else if (response.headersList.contains("vary")) { - const fieldValues = getFieldValues(response.headersList.get("vary")); - for (const fieldValue of fieldValues) { - if (fieldValue === "*") { - responsePromise.reject(webidl.errors.exception({ - header: "Cache.addAll", - message: "invalid vary field value" - })); - for (const controller of fetchControllers) { - controller.abort(); - } - return; - } - } - } - }, - processResponseEndOfBody(response) { - if (response.aborted) { - responsePromise.reject(new DOMException("aborted", "AbortError")); - return; - } - responsePromise.resolve(response); - } - })); - responsePromises.push(responsePromise.promise); - } - const p = Promise.all(responsePromises); - const responses = await p; - const operations = []; - let index = 0; - for (const response of responses) { - const operation = { - type: "put", - // 7.3.2 - request: requestList[index], - // 7.3.3 - response - // 7.3.4 - }; - operations.push(operation); - index++; - } - const cacheJobPromise = createDeferredPromise(); - let errorData = null; - try { - this.#batchCacheOperations(operations); - } catch (e) { - errorData = e; - } - queueMicrotask(() => { - if (errorData === null) { - cacheJobPromise.resolve(void 0); - } else { - cacheJobPromise.reject(errorData); - } - }); - return cacheJobPromise.promise; - } - async put(request, response) { - webidl.brandCheck(this, _Cache); - webidl.argumentLengthCheck(arguments, 2, { header: "Cache.put" }); - request = webidl.converters.RequestInfo(request); - response = webidl.converters.Response(response); - let innerRequest = null; - if (request instanceof Request) { - innerRequest = request[kState]; - } else { - innerRequest = new Request(request)[kState]; - } - if (!urlIsHttpHttpsScheme(innerRequest.url) || innerRequest.method !== "GET") { - throw webidl.errors.exception({ - header: "Cache.put", - message: "Expected an http/s scheme when method is not GET" - }); - } - const innerResponse = response[kState]; - if (innerResponse.status === 206) { - throw webidl.errors.exception({ - header: "Cache.put", - message: "Got 206 status" - }); - } - if (innerResponse.headersList.contains("vary")) { - const fieldValues = getFieldValues(innerResponse.headersList.get("vary")); - for (const fieldValue of fieldValues) { - if (fieldValue === "*") { - throw webidl.errors.exception({ - header: "Cache.put", - message: "Got * vary field value" - }); - } - } - } - if (innerResponse.body && (isDisturbed(innerResponse.body.stream) || innerResponse.body.stream.locked)) { - throw webidl.errors.exception({ - header: "Cache.put", - message: "Response body is locked or disturbed" - }); - } - const clonedResponse = cloneResponse(innerResponse); - const bodyReadPromise = createDeferredPromise(); - if (innerResponse.body != null) { - const stream = innerResponse.body.stream; - const reader = stream.getReader(); - readAllBytes( - reader, - (bytes2) => bodyReadPromise.resolve(bytes2), - (error2) => bodyReadPromise.reject(error2) - ); - } else { - bodyReadPromise.resolve(void 0); - } - const operations = []; - const operation = { - type: "put", - // 14. - request: innerRequest, - // 15. - response: clonedResponse - // 16. - }; - operations.push(operation); - const bytes = await bodyReadPromise.promise; - if (clonedResponse.body != null) { - clonedResponse.body.source = bytes; - } - const cacheJobPromise = createDeferredPromise(); - let errorData = null; - try { - this.#batchCacheOperations(operations); - } catch (e) { - errorData = e; - } - queueMicrotask(() => { - if (errorData === null) { - cacheJobPromise.resolve(); - } else { - cacheJobPromise.reject(errorData); - } - }); - return cacheJobPromise.promise; - } - async delete(request, options2 = {}) { - webidl.brandCheck(this, _Cache); - webidl.argumentLengthCheck(arguments, 1, { header: "Cache.delete" }); - request = webidl.converters.RequestInfo(request); - options2 = webidl.converters.CacheQueryOptions(options2); - let r = null; - if (request instanceof Request) { - r = request[kState]; - if (r.method !== "GET" && !options2.ignoreMethod) { - return false; - } - } else { - assert(typeof request === "string"); - r = new Request(request)[kState]; - } - const operations = []; - const operation = { - type: "delete", - request: r, - options: options2 - }; - operations.push(operation); - const cacheJobPromise = createDeferredPromise(); - let errorData = null; - let requestResponses; - try { - requestResponses = this.#batchCacheOperations(operations); - } catch (e) { - errorData = e; - } - queueMicrotask(() => { - if (errorData === null) { - cacheJobPromise.resolve(!!requestResponses?.length); - } else { - cacheJobPromise.reject(errorData); - } - }); - return cacheJobPromise.promise; - } - /** - * @see https://w3c.github.io/ServiceWorker/#dom-cache-keys - * @param {any} request - * @param {import('../../types/cache').CacheQueryOptions} options - * @returns {readonly Request[]} - */ - async keys(request = void 0, options2 = {}) { - webidl.brandCheck(this, _Cache); - if (request !== void 0) - request = webidl.converters.RequestInfo(request); - options2 = webidl.converters.CacheQueryOptions(options2); - let r = null; - if (request !== void 0) { - if (request instanceof Request) { - r = request[kState]; - if (r.method !== "GET" && !options2.ignoreMethod) { - return []; - } - } else if (typeof request === "string") { - r = new Request(request)[kState]; - } - } - const promise = createDeferredPromise(); - const requests = []; - if (request === void 0) { - for (const requestResponse of this.#relevantRequestResponseList) { - requests.push(requestResponse[0]); - } - } else { - const requestResponses = this.#queryCache(r, options2); - for (const requestResponse of requestResponses) { - requests.push(requestResponse[0]); - } - } - queueMicrotask(() => { - const requestList = []; - for (const request2 of requests) { - const requestObject = new Request("https://a"); - requestObject[kState] = request2; - requestObject[kHeaders][kHeadersList] = request2.headersList; - requestObject[kHeaders][kGuard] = "immutable"; - requestObject[kRealm] = request2.client; - requestList.push(requestObject); - } - promise.resolve(Object.freeze(requestList)); - }); - return promise.promise; - } - /** - * @see https://w3c.github.io/ServiceWorker/#batch-cache-operations-algorithm - * @param {CacheBatchOperation[]} operations - * @returns {requestResponseList} - */ - #batchCacheOperations(operations) { - const cache = this.#relevantRequestResponseList; - const backupCache = [...cache]; - const addedItems = []; - const resultList = []; - try { - for (const operation of operations) { - if (operation.type !== "delete" && operation.type !== "put") { - throw webidl.errors.exception({ - header: "Cache.#batchCacheOperations", - message: 'operation type does not match "delete" or "put"' - }); - } - if (operation.type === "delete" && operation.response != null) { - throw webidl.errors.exception({ - header: "Cache.#batchCacheOperations", - message: "delete operation should not have an associated response" - }); - } - if (this.#queryCache(operation.request, operation.options, addedItems).length) { - throw new DOMException("???", "InvalidStateError"); - } - let requestResponses; - if (operation.type === "delete") { - requestResponses = this.#queryCache(operation.request, operation.options); - if (requestResponses.length === 0) { - return []; - } - for (const requestResponse of requestResponses) { - const idx = cache.indexOf(requestResponse); - assert(idx !== -1); - cache.splice(idx, 1); - } - } else if (operation.type === "put") { - if (operation.response == null) { - throw webidl.errors.exception({ - header: "Cache.#batchCacheOperations", - message: "put operation should have an associated response" - }); - } - const r = operation.request; - if (!urlIsHttpHttpsScheme(r.url)) { - throw webidl.errors.exception({ - header: "Cache.#batchCacheOperations", - message: "expected http or https scheme" - }); - } - if (r.method !== "GET") { - throw webidl.errors.exception({ - header: "Cache.#batchCacheOperations", - message: "not get method" - }); - } - if (operation.options != null) { - throw webidl.errors.exception({ - header: "Cache.#batchCacheOperations", - message: "options must not be defined" - }); - } - requestResponses = this.#queryCache(operation.request); - for (const requestResponse of requestResponses) { - const idx = cache.indexOf(requestResponse); - assert(idx !== -1); - cache.splice(idx, 1); - } - cache.push([operation.request, operation.response]); - addedItems.push([operation.request, operation.response]); - } - resultList.push([operation.request, operation.response]); - } - return resultList; - } catch (e) { - this.#relevantRequestResponseList.length = 0; - this.#relevantRequestResponseList = backupCache; - throw e; - } - } - /** - * @see https://w3c.github.io/ServiceWorker/#query-cache - * @param {any} requestQuery - * @param {import('../../types/cache').CacheQueryOptions} options - * @param {requestResponseList} targetStorage - * @returns {requestResponseList} - */ - #queryCache(requestQuery, options2, targetStorage) { - const resultList = []; - const storage = targetStorage ?? this.#relevantRequestResponseList; - for (const requestResponse of storage) { - const [cachedRequest, cachedResponse] = requestResponse; - if (this.#requestMatchesCachedItem(requestQuery, cachedRequest, cachedResponse, options2)) { - resultList.push(requestResponse); - } - } - return resultList; - } - /** - * @see https://w3c.github.io/ServiceWorker/#request-matches-cached-item-algorithm - * @param {any} requestQuery - * @param {any} request - * @param {any | null} response - * @param {import('../../types/cache').CacheQueryOptions | undefined} options - * @returns {boolean} - */ - #requestMatchesCachedItem(requestQuery, request, response = null, options2) { - const queryURL = new URL(requestQuery.url); - const cachedURL = new URL(request.url); - if (options2?.ignoreSearch) { - cachedURL.search = ""; - queryURL.search = ""; - } - if (!urlEquals(queryURL, cachedURL, true)) { - return false; - } - if (response == null || options2?.ignoreVary || !response.headersList.contains("vary")) { - return true; - } - const fieldValues = getFieldValues(response.headersList.get("vary")); - for (const fieldValue of fieldValues) { - if (fieldValue === "*") { - return false; - } - const requestValue = request.headersList.get(fieldValue); - const queryValue = requestQuery.headersList.get(fieldValue); - if (requestValue !== queryValue) { - return false; - } - } - return true; - } - }; - Object.defineProperties(Cache.prototype, { - [Symbol.toStringTag]: { - value: "Cache", - configurable: true - }, - match: kEnumerableProperty, - matchAll: kEnumerableProperty, - add: kEnumerableProperty, - addAll: kEnumerableProperty, - put: kEnumerableProperty, - delete: kEnumerableProperty, - keys: kEnumerableProperty - }); - var cacheQueryOptionConverters = [ - { - key: "ignoreSearch", - converter: webidl.converters.boolean, - defaultValue: false - }, - { - key: "ignoreMethod", - converter: webidl.converters.boolean, - defaultValue: false - }, - { - key: "ignoreVary", - converter: webidl.converters.boolean, - defaultValue: false - } - ]; - webidl.converters.CacheQueryOptions = webidl.dictionaryConverter(cacheQueryOptionConverters); - webidl.converters.MultiCacheQueryOptions = webidl.dictionaryConverter([ - ...cacheQueryOptionConverters, - { - key: "cacheName", - converter: webidl.converters.DOMString - } - ]); - webidl.converters.Response = webidl.interfaceConverter(Response); - webidl.converters["sequence"] = webidl.sequenceConverter( - webidl.converters.RequestInfo - ); - module2.exports = { - Cache - }; - } -}); - -// node_modules/undici/lib/cache/cachestorage.js -var require_cachestorage = __commonJS({ - "node_modules/undici/lib/cache/cachestorage.js"(exports2, module2) { - "use strict"; - var { kConstruct } = require_symbols4(); - var { Cache } = require_cache(); - var { webidl } = require_webidl(); - var { kEnumerableProperty } = require_util4(); - var CacheStorage = class _CacheStorage { - /** - * @see https://w3c.github.io/ServiceWorker/#dfn-relevant-name-to-cache-map - * @type {Map} - */ - async has(cacheName) { - webidl.brandCheck(this, _CacheStorage); - webidl.argumentLengthCheck(arguments, 1, { header: "CacheStorage.has" }); - cacheName = webidl.converters.DOMString(cacheName); - return this.#caches.has(cacheName); - } - /** - * @see https://w3c.github.io/ServiceWorker/#dom-cachestorage-open - * @param {string} cacheName - * @returns {Promise} - */ - async open(cacheName) { - webidl.brandCheck(this, _CacheStorage); - webidl.argumentLengthCheck(arguments, 1, { header: "CacheStorage.open" }); - cacheName = webidl.converters.DOMString(cacheName); - if (this.#caches.has(cacheName)) { - const cache2 = this.#caches.get(cacheName); - return new Cache(kConstruct, cache2); - } - const cache = []; - this.#caches.set(cacheName, cache); - return new Cache(kConstruct, cache); - } - /** - * @see https://w3c.github.io/ServiceWorker/#cache-storage-delete - * @param {string} cacheName - * @returns {Promise} - */ - async delete(cacheName) { - webidl.brandCheck(this, _CacheStorage); - webidl.argumentLengthCheck(arguments, 1, { header: "CacheStorage.delete" }); - cacheName = webidl.converters.DOMString(cacheName); - return this.#caches.delete(cacheName); - } - /** - * @see https://w3c.github.io/ServiceWorker/#cache-storage-keys - * @returns {string[]} - */ - async keys() { - webidl.brandCheck(this, _CacheStorage); - const keys = this.#caches.keys(); - return [...keys]; - } - }; - Object.defineProperties(CacheStorage.prototype, { - [Symbol.toStringTag]: { - value: "CacheStorage", - configurable: true - }, - match: kEnumerableProperty, - has: kEnumerableProperty, - open: kEnumerableProperty, - delete: kEnumerableProperty, - keys: kEnumerableProperty - }); - module2.exports = { - CacheStorage - }; - } -}); - -// node_modules/undici/lib/cookies/constants.js -var require_constants4 = __commonJS({ - "node_modules/undici/lib/cookies/constants.js"(exports2, module2) { - "use strict"; - var maxAttributeValueSize = 1024; - var maxNameValuePairSize = 4096; - module2.exports = { - maxAttributeValueSize, - maxNameValuePairSize - }; - } -}); - -// node_modules/undici/lib/cookies/util.js -var require_util9 = __commonJS({ - "node_modules/undici/lib/cookies/util.js"(exports2, module2) { - "use strict"; - var assert = require("assert"); - var { kHeadersList } = require_symbols(); - function isCTLExcludingHtab(value) { - if (value.length === 0) { - return false; - } - for (const char of value) { - const code = char.charCodeAt(0); - if (code >= 0 || code <= 8 || (code >= 10 || code <= 31) || code === 127) { - return false; - } - } - } - function validateCookieName(name) { - for (const char of name) { - const code = char.charCodeAt(0); - if (code <= 32 || code > 127 || char === "(" || char === ")" || char === ">" || char === "<" || char === "@" || char === "," || char === ";" || char === ":" || char === "\\" || char === '"' || char === "/" || char === "[" || char === "]" || char === "?" || char === "=" || char === "{" || char === "}") { - throw new Error("Invalid cookie name"); - } - } - } - function validateCookieValue(value) { - for (const char of value) { - const code = char.charCodeAt(0); - if (code < 33 || // exclude CTLs (0-31) - code === 34 || code === 44 || code === 59 || code === 92 || code > 126) { - throw new Error("Invalid header value"); - } - } - } - function validateCookiePath(path) { - for (const char of path) { - const code = char.charCodeAt(0); - if (code < 33 || char === ";") { - throw new Error("Invalid cookie path"); - } - } - } - function validateCookieDomain(domain) { - if (domain.startsWith("-") || domain.endsWith(".") || domain.endsWith("-")) { - throw new Error("Invalid cookie domain"); - } - } - function toIMFDate(date) { - if (typeof date === "number") { - date = new Date(date); - } - const days = [ - "Sun", - "Mon", - "Tue", - "Wed", - "Thu", - "Fri", - "Sat" - ]; - const months = [ - "Jan", - "Feb", - "Mar", - "Apr", - "May", - "Jun", - "Jul", - "Aug", - "Sep", - "Oct", - "Nov", - "Dec" - ]; - const dayName = days[date.getUTCDay()]; - const day = date.getUTCDate().toString().padStart(2, "0"); - const month = months[date.getUTCMonth()]; - const year = date.getUTCFullYear(); - const hour = date.getUTCHours().toString().padStart(2, "0"); - const minute = date.getUTCMinutes().toString().padStart(2, "0"); - const second = date.getUTCSeconds().toString().padStart(2, "0"); - return `${dayName}, ${day} ${month} ${year} ${hour}:${minute}:${second} GMT`; - } - function validateCookieMaxAge(maxAge) { - if (maxAge < 0) { - throw new Error("Invalid cookie max-age"); - } - } - function stringify(cookie) { - if (cookie.name.length === 0) { - return null; - } - validateCookieName(cookie.name); - validateCookieValue(cookie.value); - const out = [`${cookie.name}=${cookie.value}`]; - if (cookie.name.startsWith("__Secure-")) { - cookie.secure = true; - } - if (cookie.name.startsWith("__Host-")) { - cookie.secure = true; - cookie.domain = null; - cookie.path = "/"; - } - if (cookie.secure) { - out.push("Secure"); - } - if (cookie.httpOnly) { - out.push("HttpOnly"); - } - if (typeof cookie.maxAge === "number") { - validateCookieMaxAge(cookie.maxAge); - out.push(`Max-Age=${cookie.maxAge}`); - } - if (cookie.domain) { - validateCookieDomain(cookie.domain); - out.push(`Domain=${cookie.domain}`); - } - if (cookie.path) { - validateCookiePath(cookie.path); - out.push(`Path=${cookie.path}`); - } - if (cookie.expires && cookie.expires.toString() !== "Invalid Date") { - out.push(`Expires=${toIMFDate(cookie.expires)}`); - } - if (cookie.sameSite) { - out.push(`SameSite=${cookie.sameSite}`); - } - for (const part of cookie.unparsed) { - if (!part.includes("=")) { - throw new Error("Invalid unparsed"); - } - const [key, ...value] = part.split("="); - out.push(`${key.trim()}=${value.join("=")}`); - } - return out.join("; "); - } - var kHeadersListNode; - function getHeadersList(headers) { - if (headers[kHeadersList]) { - return headers[kHeadersList]; - } - if (!kHeadersListNode) { - kHeadersListNode = Object.getOwnPropertySymbols(headers).find( - (symbol) => symbol.description === "headers list" - ); - assert(kHeadersListNode, "Headers cannot be parsed"); - } - const headersList = headers[kHeadersListNode]; - assert(headersList); - return headersList; - } - module2.exports = { - isCTLExcludingHtab, - stringify, - getHeadersList - }; - } -}); - -// node_modules/undici/lib/cookies/parse.js -var require_parse3 = __commonJS({ - "node_modules/undici/lib/cookies/parse.js"(exports2, module2) { - "use strict"; - var { maxNameValuePairSize, maxAttributeValueSize } = require_constants4(); - var { isCTLExcludingHtab } = require_util9(); - var { collectASequenceOfCodePointsFast } = require_dataURL(); - var assert = require("assert"); - function parseSetCookie(header) { - if (isCTLExcludingHtab(header)) { - return null; - } - let nameValuePair = ""; - let unparsedAttributes = ""; - let name = ""; - let value = ""; - if (header.includes(";")) { - const position = { position: 0 }; - nameValuePair = collectASequenceOfCodePointsFast(";", header, position); - unparsedAttributes = header.slice(position.position); - } else { - nameValuePair = header; - } - if (!nameValuePair.includes("=")) { - value = nameValuePair; - } else { - const position = { position: 0 }; - name = collectASequenceOfCodePointsFast( - "=", - nameValuePair, - position - ); - value = nameValuePair.slice(position.position + 1); - } - name = name.trim(); - value = value.trim(); - if (name.length + value.length > maxNameValuePairSize) { - return null; - } - return { - name, - value, - ...parseUnparsedAttributes(unparsedAttributes) - }; - } - function parseUnparsedAttributes(unparsedAttributes, cookieAttributeList = {}) { - if (unparsedAttributes.length === 0) { - return cookieAttributeList; - } - assert(unparsedAttributes[0] === ";"); - unparsedAttributes = unparsedAttributes.slice(1); - let cookieAv = ""; - if (unparsedAttributes.includes(";")) { - cookieAv = collectASequenceOfCodePointsFast( - ";", - unparsedAttributes, - { position: 0 } - ); - unparsedAttributes = unparsedAttributes.slice(cookieAv.length); - } else { - cookieAv = unparsedAttributes; - unparsedAttributes = ""; - } - let attributeName = ""; - let attributeValue = ""; - if (cookieAv.includes("=")) { - const position = { position: 0 }; - attributeName = collectASequenceOfCodePointsFast( - "=", - cookieAv, - position - ); - attributeValue = cookieAv.slice(position.position + 1); - } else { - attributeName = cookieAv; - } - attributeName = attributeName.trim(); - attributeValue = attributeValue.trim(); - if (attributeValue.length > maxAttributeValueSize) { - return parseUnparsedAttributes(unparsedAttributes, cookieAttributeList); - } - const attributeNameLowercase = attributeName.toLowerCase(); - if (attributeNameLowercase === "expires") { - const expiryTime = new Date(attributeValue); - cookieAttributeList.expires = expiryTime; - } else if (attributeNameLowercase === "max-age") { - const charCode = attributeValue.charCodeAt(0); - if ((charCode < 48 || charCode > 57) && attributeValue[0] !== "-") { - return parseUnparsedAttributes(unparsedAttributes, cookieAttributeList); - } - if (!/^\d+$/.test(attributeValue)) { - return parseUnparsedAttributes(unparsedAttributes, cookieAttributeList); - } - const deltaSeconds = Number(attributeValue); - cookieAttributeList.maxAge = deltaSeconds; - } else if (attributeNameLowercase === "domain") { - let cookieDomain = attributeValue; - if (cookieDomain[0] === ".") { - cookieDomain = cookieDomain.slice(1); - } - cookieDomain = cookieDomain.toLowerCase(); - cookieAttributeList.domain = cookieDomain; - } else if (attributeNameLowercase === "path") { - let cookiePath = ""; - if (attributeValue.length === 0 || attributeValue[0] !== "/") { - cookiePath = "/"; - } else { - cookiePath = attributeValue; - } - cookieAttributeList.path = cookiePath; - } else if (attributeNameLowercase === "secure") { - cookieAttributeList.secure = true; - } else if (attributeNameLowercase === "httponly") { - cookieAttributeList.httpOnly = true; - } else if (attributeNameLowercase === "samesite") { - let enforcement = "Default"; - const attributeValueLowercase = attributeValue.toLowerCase(); - if (attributeValueLowercase.includes("none")) { - enforcement = "None"; - } - if (attributeValueLowercase.includes("strict")) { - enforcement = "Strict"; - } - if (attributeValueLowercase.includes("lax")) { - enforcement = "Lax"; - } - cookieAttributeList.sameSite = enforcement; - } else { - cookieAttributeList.unparsed ??= []; - cookieAttributeList.unparsed.push(`${attributeName}=${attributeValue}`); - } - return parseUnparsedAttributes(unparsedAttributes, cookieAttributeList); - } - module2.exports = { - parseSetCookie, - parseUnparsedAttributes - }; - } -}); - -// node_modules/undici/lib/cookies/index.js -var require_cookies = __commonJS({ - "node_modules/undici/lib/cookies/index.js"(exports2, module2) { - "use strict"; - var { parseSetCookie } = require_parse3(); - var { stringify, getHeadersList } = require_util9(); - var { webidl } = require_webidl(); - var { Headers } = require_headers(); - function getCookies(headers) { - webidl.argumentLengthCheck(arguments, 1, { header: "getCookies" }); - webidl.brandCheck(headers, Headers, { strict: false }); - const cookie = headers.get("cookie"); - const out = {}; - if (!cookie) { - return out; - } - for (const piece of cookie.split(";")) { - const [name, ...value] = piece.split("="); - out[name.trim()] = value.join("="); - } - return out; - } - function deleteCookie(headers, name, attributes) { - webidl.argumentLengthCheck(arguments, 2, { header: "deleteCookie" }); - webidl.brandCheck(headers, Headers, { strict: false }); - name = webidl.converters.DOMString(name); - attributes = webidl.converters.DeleteCookieAttributes(attributes); - setCookie(headers, { - name, - value: "", - expires: /* @__PURE__ */ new Date(0), - ...attributes - }); - } - function getSetCookies(headers) { - webidl.argumentLengthCheck(arguments, 1, { header: "getSetCookies" }); - webidl.brandCheck(headers, Headers, { strict: false }); - const cookies = getHeadersList(headers).cookies; - if (!cookies) { - return []; - } - return cookies.map((pair) => parseSetCookie(Array.isArray(pair) ? pair[1] : pair)); - } - function setCookie(headers, cookie) { - webidl.argumentLengthCheck(arguments, 2, { header: "setCookie" }); - webidl.brandCheck(headers, Headers, { strict: false }); - cookie = webidl.converters.Cookie(cookie); - const str = stringify(cookie); - if (str) { - headers.append("Set-Cookie", stringify(cookie)); - } - } - webidl.converters.DeleteCookieAttributes = webidl.dictionaryConverter([ - { - converter: webidl.nullableConverter(webidl.converters.DOMString), - key: "path", - defaultValue: null - }, - { - converter: webidl.nullableConverter(webidl.converters.DOMString), - key: "domain", - defaultValue: null - } - ]); - webidl.converters.Cookie = webidl.dictionaryConverter([ - { - converter: webidl.converters.DOMString, - key: "name" - }, - { - converter: webidl.converters.DOMString, - key: "value" - }, - { - converter: webidl.nullableConverter((value) => { - if (typeof value === "number") { - return webidl.converters["unsigned long long"](value); - } - return new Date(value); - }), - key: "expires", - defaultValue: null - }, - { - converter: webidl.nullableConverter(webidl.converters["long long"]), - key: "maxAge", - defaultValue: null - }, - { - converter: webidl.nullableConverter(webidl.converters.DOMString), - key: "domain", - defaultValue: null - }, - { - converter: webidl.nullableConverter(webidl.converters.DOMString), - key: "path", - defaultValue: null - }, - { - converter: webidl.nullableConverter(webidl.converters.boolean), - key: "secure", - defaultValue: null - }, - { - converter: webidl.nullableConverter(webidl.converters.boolean), - key: "httpOnly", - defaultValue: null - }, - { - converter: webidl.converters.USVString, - key: "sameSite", - allowedValues: ["Strict", "Lax", "None"] - }, - { - converter: webidl.sequenceConverter(webidl.converters.DOMString), - key: "unparsed", - defaultValue: [] - } - ]); - module2.exports = { - getCookies, - deleteCookie, - getSetCookies, - setCookie - }; - } -}); - -// node_modules/undici/lib/websocket/constants.js -var require_constants5 = __commonJS({ - "node_modules/undici/lib/websocket/constants.js"(exports2, module2) { - "use strict"; - var uid = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11"; - var staticPropertyDescriptors = { - enumerable: true, - writable: false, - configurable: false - }; - var states = { - CONNECTING: 0, - OPEN: 1, - CLOSING: 2, - CLOSED: 3 - }; - var opcodes = { - CONTINUATION: 0, - TEXT: 1, - BINARY: 2, - CLOSE: 8, - PING: 9, - PONG: 10 - }; - var maxUnsigned16Bit = 2 ** 16 - 1; - var parserStates = { - INFO: 0, - PAYLOADLENGTH_16: 2, - PAYLOADLENGTH_64: 3, - READ_DATA: 4 - }; - var emptyBuffer = Buffer.allocUnsafe(0); - module2.exports = { - uid, - staticPropertyDescriptors, - states, - opcodes, - maxUnsigned16Bit, - parserStates, - emptyBuffer - }; - } -}); - -// node_modules/undici/lib/websocket/symbols.js -var require_symbols5 = __commonJS({ - "node_modules/undici/lib/websocket/symbols.js"(exports2, module2) { - "use strict"; - module2.exports = { - kWebSocketURL: Symbol("url"), - kReadyState: Symbol("ready state"), - kController: Symbol("controller"), - kResponse: Symbol("response"), - kBinaryType: Symbol("binary type"), - kSentClose: Symbol("sent close"), - kReceivedClose: Symbol("received close"), - kByteParser: Symbol("byte parser") - }; - } -}); - -// node_modules/undici/lib/websocket/events.js -var require_events = __commonJS({ - "node_modules/undici/lib/websocket/events.js"(exports2, module2) { - "use strict"; - var { webidl } = require_webidl(); - var { kEnumerableProperty } = require_util4(); - var { MessagePort } = require("worker_threads"); - var MessageEvent = class _MessageEvent extends Event { - #eventInit; - constructor(type, eventInitDict = {}) { - webidl.argumentLengthCheck(arguments, 1, { header: "MessageEvent constructor" }); - type = webidl.converters.DOMString(type); - eventInitDict = webidl.converters.MessageEventInit(eventInitDict); - super(type, eventInitDict); - this.#eventInit = eventInitDict; - } - get data() { - webidl.brandCheck(this, _MessageEvent); - return this.#eventInit.data; - } - get origin() { - webidl.brandCheck(this, _MessageEvent); - return this.#eventInit.origin; - } - get lastEventId() { - webidl.brandCheck(this, _MessageEvent); - return this.#eventInit.lastEventId; - } - get source() { - webidl.brandCheck(this, _MessageEvent); - return this.#eventInit.source; - } - get ports() { - webidl.brandCheck(this, _MessageEvent); - if (!Object.isFrozen(this.#eventInit.ports)) { - Object.freeze(this.#eventInit.ports); - } - return this.#eventInit.ports; - } - initMessageEvent(type, bubbles = false, cancelable = false, data = null, origin = "", lastEventId = "", source = null, ports = []) { - webidl.brandCheck(this, _MessageEvent); - webidl.argumentLengthCheck(arguments, 1, { header: "MessageEvent.initMessageEvent" }); - return new _MessageEvent(type, { - bubbles, - cancelable, - data, - origin, - lastEventId, - source, - ports - }); - } - }; - var CloseEvent = class _CloseEvent extends Event { - #eventInit; - constructor(type, eventInitDict = {}) { - webidl.argumentLengthCheck(arguments, 1, { header: "CloseEvent constructor" }); - type = webidl.converters.DOMString(type); - eventInitDict = webidl.converters.CloseEventInit(eventInitDict); - super(type, eventInitDict); - this.#eventInit = eventInitDict; - } - get wasClean() { - webidl.brandCheck(this, _CloseEvent); - return this.#eventInit.wasClean; - } - get code() { - webidl.brandCheck(this, _CloseEvent); - return this.#eventInit.code; - } - get reason() { - webidl.brandCheck(this, _CloseEvent); - return this.#eventInit.reason; - } - }; - var ErrorEvent = class _ErrorEvent extends Event { - #eventInit; - constructor(type, eventInitDict) { - webidl.argumentLengthCheck(arguments, 1, { header: "ErrorEvent constructor" }); - super(type, eventInitDict); - type = webidl.converters.DOMString(type); - eventInitDict = webidl.converters.ErrorEventInit(eventInitDict ?? {}); - this.#eventInit = eventInitDict; - } - get message() { - webidl.brandCheck(this, _ErrorEvent); - return this.#eventInit.message; - } - get filename() { - webidl.brandCheck(this, _ErrorEvent); - return this.#eventInit.filename; - } - get lineno() { - webidl.brandCheck(this, _ErrorEvent); - return this.#eventInit.lineno; - } - get colno() { - webidl.brandCheck(this, _ErrorEvent); - return this.#eventInit.colno; - } - get error() { - webidl.brandCheck(this, _ErrorEvent); - return this.#eventInit.error; - } - }; - Object.defineProperties(MessageEvent.prototype, { - [Symbol.toStringTag]: { - value: "MessageEvent", - configurable: true - }, - data: kEnumerableProperty, - origin: kEnumerableProperty, - lastEventId: kEnumerableProperty, - source: kEnumerableProperty, - ports: kEnumerableProperty, - initMessageEvent: kEnumerableProperty - }); - Object.defineProperties(CloseEvent.prototype, { - [Symbol.toStringTag]: { - value: "CloseEvent", - configurable: true - }, - reason: kEnumerableProperty, - code: kEnumerableProperty, - wasClean: kEnumerableProperty - }); - Object.defineProperties(ErrorEvent.prototype, { - [Symbol.toStringTag]: { - value: "ErrorEvent", - configurable: true - }, - message: kEnumerableProperty, - filename: kEnumerableProperty, - lineno: kEnumerableProperty, - colno: kEnumerableProperty, - error: kEnumerableProperty - }); - webidl.converters.MessagePort = webidl.interfaceConverter(MessagePort); - webidl.converters["sequence"] = webidl.sequenceConverter( - webidl.converters.MessagePort - ); - var eventInit = [ - { - key: "bubbles", - converter: webidl.converters.boolean, - defaultValue: false - }, - { - key: "cancelable", - converter: webidl.converters.boolean, - defaultValue: false - }, - { - key: "composed", - converter: webidl.converters.boolean, - defaultValue: false - } - ]; - webidl.converters.MessageEventInit = webidl.dictionaryConverter([ - ...eventInit, - { - key: "data", - converter: webidl.converters.any, - defaultValue: null - }, - { - key: "origin", - converter: webidl.converters.USVString, - defaultValue: "" - }, - { - key: "lastEventId", - converter: webidl.converters.DOMString, - defaultValue: "" - }, - { - key: "source", - // Node doesn't implement WindowProxy or ServiceWorker, so the only - // valid value for source is a MessagePort. - converter: webidl.nullableConverter(webidl.converters.MessagePort), - defaultValue: null - }, - { - key: "ports", - converter: webidl.converters["sequence"], - get defaultValue() { - return []; - } - } - ]); - webidl.converters.CloseEventInit = webidl.dictionaryConverter([ - ...eventInit, - { - key: "wasClean", - converter: webidl.converters.boolean, - defaultValue: false - }, - { - key: "code", - converter: webidl.converters["unsigned short"], - defaultValue: 0 - }, - { - key: "reason", - converter: webidl.converters.USVString, - defaultValue: "" - } - ]); - webidl.converters.ErrorEventInit = webidl.dictionaryConverter([ - ...eventInit, - { - key: "message", - converter: webidl.converters.DOMString, - defaultValue: "" - }, - { - key: "filename", - converter: webidl.converters.USVString, - defaultValue: "" - }, - { - key: "lineno", - converter: webidl.converters["unsigned long"], - defaultValue: 0 - }, - { - key: "colno", - converter: webidl.converters["unsigned long"], - defaultValue: 0 - }, - { - key: "error", - converter: webidl.converters.any - } - ]); - module2.exports = { - MessageEvent, - CloseEvent, - ErrorEvent - }; - } -}); - -// node_modules/undici/lib/websocket/util.js -var require_util10 = __commonJS({ - "node_modules/undici/lib/websocket/util.js"(exports2, module2) { - "use strict"; - var { kReadyState, kController, kResponse, kBinaryType, kWebSocketURL } = require_symbols5(); - var { states, opcodes } = require_constants5(); - var { MessageEvent, ErrorEvent } = require_events(); - function isEstablished(ws2) { - return ws2[kReadyState] === states.OPEN; - } - function isClosing(ws2) { - return ws2[kReadyState] === states.CLOSING; - } - function isClosed(ws2) { - return ws2[kReadyState] === states.CLOSED; - } - function fireEvent(e, target, eventConstructor = Event, eventInitDict) { - const event = new eventConstructor(e, eventInitDict); - target.dispatchEvent(event); - } - function websocketMessageReceived(ws2, type, data) { - if (ws2[kReadyState] !== states.OPEN) { - return; - } - let dataForEvent; - if (type === opcodes.TEXT) { - try { - dataForEvent = new TextDecoder("utf-8", { fatal: true }).decode(data); - } catch { - failWebsocketConnection(ws2, "Received invalid UTF-8 in text frame."); - return; - } - } else if (type === opcodes.BINARY) { - if (ws2[kBinaryType] === "blob") { - dataForEvent = new Blob([data]); - } else { - dataForEvent = new Uint8Array(data).buffer; - } - } - fireEvent("message", ws2, MessageEvent, { - origin: ws2[kWebSocketURL].origin, - data: dataForEvent - }); - } - function isValidSubprotocol(protocol) { - if (protocol.length === 0) { - return false; - } - for (const char of protocol) { - const code = char.charCodeAt(0); - if (code < 33 || code > 126 || char === "(" || char === ")" || char === "<" || char === ">" || char === "@" || char === "," || char === ";" || char === ":" || char === "\\" || char === '"' || char === "/" || char === "[" || char === "]" || char === "?" || char === "=" || char === "{" || char === "}" || code === 32 || // SP - code === 9) { - return false; - } - } - return true; - } - function isValidStatusCode(code) { - if (code >= 1e3 && code < 1015) { - return code !== 1004 && // reserved - code !== 1005 && // "MUST NOT be set as a status code" - code !== 1006; - } - return code >= 3e3 && code <= 4999; - } - function failWebsocketConnection(ws2, reason) { - const { [kController]: controller, [kResponse]: response } = ws2; - controller.abort(); - if (response?.socket && !response.socket.destroyed) { - response.socket.destroy(); - } - if (reason) { - fireEvent("error", ws2, ErrorEvent, { - error: new Error(reason) - }); - } - } - module2.exports = { - isEstablished, - isClosing, - isClosed, - fireEvent, - isValidSubprotocol, - isValidStatusCode, - failWebsocketConnection, - websocketMessageReceived - }; - } -}); - -// node_modules/undici/lib/websocket/connection.js -var require_connection2 = __commonJS({ - "node_modules/undici/lib/websocket/connection.js"(exports2, module2) { - "use strict"; - var { randomBytes, createHash } = require("crypto"); - var diagnosticsChannel = require("diagnostics_channel"); - var { uid, states } = require_constants5(); - var { - kReadyState, - kSentClose, - kByteParser, - kReceivedClose - } = require_symbols5(); - var { fireEvent, failWebsocketConnection } = require_util10(); - var { CloseEvent } = require_events(); - var { makeRequest } = require_request2(); - var { fetching } = require_fetch2(); - var { Headers } = require_headers(); - var { getGlobalDispatcher } = require_global2(); - var { kHeadersList } = require_symbols(); - var channels = {}; - channels.open = diagnosticsChannel.channel("undici:websocket:open"); - channels.close = diagnosticsChannel.channel("undici:websocket:close"); - channels.socketError = diagnosticsChannel.channel("undici:websocket:socket_error"); - function establishWebSocketConnection(url, protocols, ws2, onEstablish, options2) { - const requestURL = url; - requestURL.protocol = url.protocol === "ws:" ? "http:" : "https:"; - const request = makeRequest({ - urlList: [requestURL], - serviceWorkers: "none", - referrer: "no-referrer", - mode: "websocket", - credentials: "include", - cache: "no-store", - redirect: "error" - }); - if (options2.headers) { - const headersList = new Headers(options2.headers)[kHeadersList]; - request.headersList = headersList; - } - const keyValue = randomBytes(16).toString("base64"); - request.headersList.append("sec-websocket-key", keyValue); - request.headersList.append("sec-websocket-version", "13"); - for (const protocol of protocols) { - request.headersList.append("sec-websocket-protocol", protocol); - } - const permessageDeflate = ""; - const controller = fetching({ - request, - useParallelQueue: true, - dispatcher: options2.dispatcher ?? getGlobalDispatcher(), - processResponse(response) { - if (response.type === "error" || response.status !== 101) { - failWebsocketConnection(ws2, "Received network error or non-101 status code."); - return; - } - if (protocols.length !== 0 && !response.headersList.get("Sec-WebSocket-Protocol")) { - failWebsocketConnection(ws2, "Server did not respond with sent protocols."); - return; - } - if (response.headersList.get("Upgrade")?.toLowerCase() !== "websocket") { - failWebsocketConnection(ws2, 'Server did not set Upgrade header to "websocket".'); - return; - } - if (response.headersList.get("Connection")?.toLowerCase() !== "upgrade") { - failWebsocketConnection(ws2, 'Server did not set Connection header to "upgrade".'); - return; - } - const secWSAccept = response.headersList.get("Sec-WebSocket-Accept"); - const digest = createHash("sha1").update(keyValue + uid).digest("base64"); - if (secWSAccept !== digest) { - failWebsocketConnection(ws2, "Incorrect hash received in Sec-WebSocket-Accept header."); - return; - } - const secExtension = response.headersList.get("Sec-WebSocket-Extensions"); - if (secExtension !== null && secExtension !== permessageDeflate) { - failWebsocketConnection(ws2, "Received different permessage-deflate than the one set."); - return; - } - const secProtocol = response.headersList.get("Sec-WebSocket-Protocol"); - if (secProtocol !== null && secProtocol !== request.headersList.get("Sec-WebSocket-Protocol")) { - failWebsocketConnection(ws2, "Protocol was not set in the opening handshake."); - return; - } - response.socket.on("data", onSocketData); - response.socket.on("close", onSocketClose); - response.socket.on("error", onSocketError); - if (channels.open.hasSubscribers) { - channels.open.publish({ - address: response.socket.address(), - protocol: secProtocol, - extensions: secExtension - }); - } - onEstablish(response); - } - }); - return controller; - } - function onSocketData(chunk) { - if (!this.ws[kByteParser].write(chunk)) { - this.pause(); - } - } - function onSocketClose() { - const { ws: ws2 } = this; - const wasClean = ws2[kSentClose] && ws2[kReceivedClose]; - let code = 1005; - let reason = ""; - const result = ws2[kByteParser].closingInfo; - if (result) { - code = result.code ?? 1005; - reason = result.reason; - } else if (!ws2[kSentClose]) { - code = 1006; - } - ws2[kReadyState] = states.CLOSED; - fireEvent("close", ws2, CloseEvent, { - wasClean, - code, - reason - }); - if (channels.close.hasSubscribers) { - channels.close.publish({ - websocket: ws2, - code, - reason - }); - } - } - function onSocketError(error2) { - const { ws: ws2 } = this; - ws2[kReadyState] = states.CLOSING; - if (channels.socketError.hasSubscribers) { - channels.socketError.publish(error2); - } - this.destroy(); - } - module2.exports = { - establishWebSocketConnection - }; - } -}); - -// node_modules/undici/lib/websocket/frame.js -var require_frame2 = __commonJS({ - "node_modules/undici/lib/websocket/frame.js"(exports2, module2) { - "use strict"; - var { randomBytes } = require("crypto"); - var { maxUnsigned16Bit } = require_constants5(); - var WebsocketFrameSend = class { - /** - * @param {Buffer|undefined} data - */ - constructor(data) { - this.frameData = data; - this.maskKey = randomBytes(4); - } - createFrame(opcode) { - const bodyLength = this.frameData?.byteLength ?? 0; - let payloadLength = bodyLength; - let offset = 6; - if (bodyLength > maxUnsigned16Bit) { - offset += 8; - payloadLength = 127; - } else if (bodyLength > 125) { - offset += 2; - payloadLength = 126; - } - const buffer = Buffer.allocUnsafe(bodyLength + offset); - buffer[0] = buffer[1] = 0; - buffer[0] |= 128; - buffer[0] = (buffer[0] & 240) + opcode; - buffer[offset - 4] = this.maskKey[0]; - buffer[offset - 3] = this.maskKey[1]; - buffer[offset - 2] = this.maskKey[2]; - buffer[offset - 1] = this.maskKey[3]; - buffer[1] = payloadLength; - if (payloadLength === 126) { - buffer.writeUInt16BE(bodyLength, 2); - } else if (payloadLength === 127) { - buffer[2] = buffer[3] = 0; - buffer.writeUIntBE(bodyLength, 4, 6); - } - buffer[1] |= 128; - for (let i = 0; i < bodyLength; i++) { - buffer[offset + i] = this.frameData[i] ^ this.maskKey[i % 4]; - } - return buffer; - } - }; - module2.exports = { - WebsocketFrameSend - }; - } -}); - -// node_modules/undici/lib/websocket/receiver.js -var require_receiver = __commonJS({ - "node_modules/undici/lib/websocket/receiver.js"(exports2, module2) { - "use strict"; - var { Writable } = require("stream"); - var diagnosticsChannel = require("diagnostics_channel"); - var { parserStates, opcodes, states, emptyBuffer } = require_constants5(); - var { kReadyState, kSentClose, kResponse, kReceivedClose } = require_symbols5(); - var { isValidStatusCode, failWebsocketConnection, websocketMessageReceived } = require_util10(); - var { WebsocketFrameSend } = require_frame2(); - var channels = {}; - channels.ping = diagnosticsChannel.channel("undici:websocket:ping"); - channels.pong = diagnosticsChannel.channel("undici:websocket:pong"); - var ByteParser = class extends Writable { - #buffers = []; - #byteOffset = 0; - #state = parserStates.INFO; - #info = {}; - #fragments = []; - constructor(ws2) { - super(); - this.ws = ws2; - } - /** - * @param {Buffer} chunk - * @param {() => void} callback - */ - _write(chunk, _2, callback) { - this.#buffers.push(chunk); - this.#byteOffset += chunk.length; - this.run(callback); - } - /** - * Runs whenever a new chunk is received. - * Callback is called whenever there are no more chunks buffering, - * or not enough bytes are buffered to parse. - */ - run(callback) { - while (true) { - if (this.#state === parserStates.INFO) { - if (this.#byteOffset < 2) { - return callback(); - } - const buffer = this.consume(2); - this.#info.fin = (buffer[0] & 128) !== 0; - this.#info.opcode = buffer[0] & 15; - this.#info.originalOpcode ??= this.#info.opcode; - this.#info.fragmented = !this.#info.fin && this.#info.opcode !== opcodes.CONTINUATION; - if (this.#info.fragmented && this.#info.opcode !== opcodes.BINARY && this.#info.opcode !== opcodes.TEXT) { - failWebsocketConnection(this.ws, "Invalid frame type was fragmented."); - return; - } - const payloadLength = buffer[1] & 127; - if (payloadLength <= 125) { - this.#info.payloadLength = payloadLength; - this.#state = parserStates.READ_DATA; - } else if (payloadLength === 126) { - this.#state = parserStates.PAYLOADLENGTH_16; - } else if (payloadLength === 127) { - this.#state = parserStates.PAYLOADLENGTH_64; - } - if (this.#info.fragmented && payloadLength > 125) { - failWebsocketConnection(this.ws, "Fragmented frame exceeded 125 bytes."); - return; - } else if ((this.#info.opcode === opcodes.PING || this.#info.opcode === opcodes.PONG || this.#info.opcode === opcodes.CLOSE) && payloadLength > 125) { - failWebsocketConnection(this.ws, "Payload length for control frame exceeded 125 bytes."); - return; - } else if (this.#info.opcode === opcodes.CLOSE) { - if (payloadLength === 1) { - failWebsocketConnection(this.ws, "Received close frame with a 1-byte body."); - return; - } - const body = this.consume(payloadLength); - this.#info.closeInfo = this.parseCloseBody(false, body); - if (!this.ws[kSentClose]) { - const body2 = Buffer.allocUnsafe(2); - body2.writeUInt16BE(this.#info.closeInfo.code, 0); - const closeFrame = new WebsocketFrameSend(body2); - this.ws[kResponse].socket.write( - closeFrame.createFrame(opcodes.CLOSE), - (err) => { - if (!err) { - this.ws[kSentClose] = true; - } - } - ); - } - this.ws[kReadyState] = states.CLOSING; - this.ws[kReceivedClose] = true; - this.end(); - return; - } else if (this.#info.opcode === opcodes.PING) { - const body = this.consume(payloadLength); - if (!this.ws[kReceivedClose]) { - const frame = new WebsocketFrameSend(body); - this.ws[kResponse].socket.write(frame.createFrame(opcodes.PONG)); - if (channels.ping.hasSubscribers) { - channels.ping.publish({ - payload: body - }); - } - } - this.#state = parserStates.INFO; - if (this.#byteOffset > 0) { - continue; - } else { - callback(); - return; - } - } else if (this.#info.opcode === opcodes.PONG) { - const body = this.consume(payloadLength); - if (channels.pong.hasSubscribers) { - channels.pong.publish({ - payload: body - }); - } - if (this.#byteOffset > 0) { - continue; - } else { - callback(); - return; - } - } - } else if (this.#state === parserStates.PAYLOADLENGTH_16) { - if (this.#byteOffset < 2) { - return callback(); - } - const buffer = this.consume(2); - this.#info.payloadLength = buffer.readUInt16BE(0); - this.#state = parserStates.READ_DATA; - } else if (this.#state === parserStates.PAYLOADLENGTH_64) { - if (this.#byteOffset < 8) { - return callback(); - } - const buffer = this.consume(8); - const upper = buffer.readUInt32BE(0); - if (upper > 2 ** 31 - 1) { - failWebsocketConnection(this.ws, "Received payload length > 2^31 bytes."); - return; - } - const lower = buffer.readUInt32BE(4); - this.#info.payloadLength = (upper << 8) + lower; - this.#state = parserStates.READ_DATA; - } else if (this.#state === parserStates.READ_DATA) { - if (this.#byteOffset < this.#info.payloadLength) { - return callback(); - } else if (this.#byteOffset >= this.#info.payloadLength) { - const body = this.consume(this.#info.payloadLength); - this.#fragments.push(body); - if (!this.#info.fragmented || this.#info.fin && this.#info.opcode === opcodes.CONTINUATION) { - const fullMessage = Buffer.concat(this.#fragments); - websocketMessageReceived(this.ws, this.#info.originalOpcode, fullMessage); - this.#info = {}; - this.#fragments.length = 0; - } - this.#state = parserStates.INFO; - } - } - if (this.#byteOffset > 0) { - continue; - } else { - callback(); - break; - } - } - } - /** - * Take n bytes from the buffered Buffers - * @param {number} n - * @returns {Buffer|null} - */ - consume(n) { - if (n > this.#byteOffset) { - return null; - } else if (n === 0) { - return emptyBuffer; - } - if (this.#buffers[0].length === n) { - this.#byteOffset -= this.#buffers[0].length; - return this.#buffers.shift(); - } - const buffer = Buffer.allocUnsafe(n); - let offset = 0; - while (offset !== n) { - const next = this.#buffers[0]; - const { length } = next; - if (length + offset === n) { - buffer.set(this.#buffers.shift(), offset); - break; - } else if (length + offset > n) { - buffer.set(next.subarray(0, n - offset), offset); - this.#buffers[0] = next.subarray(n - offset); - break; - } else { - buffer.set(this.#buffers.shift(), offset); - offset += next.length; - } - } - this.#byteOffset -= n; - return buffer; - } - parseCloseBody(onlyCode, data) { - let code; - if (data.length >= 2) { - code = data.readUInt16BE(0); - } - if (onlyCode) { - if (!isValidStatusCode(code)) { - return null; - } - return { code }; - } - let reason = data.subarray(2); - if (reason[0] === 239 && reason[1] === 187 && reason[2] === 191) { - reason = reason.subarray(3); - } - if (code !== void 0 && !isValidStatusCode(code)) { - return null; - } - try { - reason = new TextDecoder("utf-8", { fatal: true }).decode(reason); - } catch { - return null; - } - return { code, reason }; - } - get closingInfo() { - return this.#info.closeInfo; - } - }; - module2.exports = { - ByteParser - }; - } -}); - -// node_modules/undici/lib/websocket/websocket.js -var require_websocket = __commonJS({ - "node_modules/undici/lib/websocket/websocket.js"(exports2, module2) { - "use strict"; - var { webidl } = require_webidl(); - var { DOMException: DOMException2 } = require_constants2(); - var { URLSerializer } = require_dataURL(); - var { staticPropertyDescriptors, states, opcodes, emptyBuffer } = require_constants5(); - var { - kWebSocketURL, - kReadyState, - kController, - kBinaryType, - kResponse, - kSentClose, - kByteParser - } = require_symbols5(); - var { isEstablished, isClosing, isValidSubprotocol, failWebsocketConnection, fireEvent } = require_util10(); - var { establishWebSocketConnection } = require_connection2(); - var { WebsocketFrameSend } = require_frame2(); - var { ByteParser } = require_receiver(); - var { kEnumerableProperty, isBlobLike } = require_util4(); - var { getGlobalDispatcher } = require_global2(); - var { types } = require("util"); - var experimentalWarned = false; - var WebSocket = class _WebSocket extends EventTarget { - #events = { - open: null, - error: null, - close: null, - message: null - }; - #bufferedAmount = 0; - #protocol = ""; - #extensions = ""; - /** - * @param {string} url - * @param {string|string[]} protocols - */ - constructor(url, protocols = []) { - super(); - webidl.argumentLengthCheck(arguments, 1, { header: "WebSocket constructor" }); - if (!experimentalWarned) { - experimentalWarned = true; - process.emitWarning("WebSockets are experimental, expect them to change at any time.", { - code: "UNDICI-WS" - }); - } - const options2 = webidl.converters["DOMString or sequence or WebSocketInit"](protocols); - url = webidl.converters.USVString(url); - protocols = options2.protocols; - let urlRecord; - try { - urlRecord = new URL(url); - } catch (e) { - throw new DOMException2(e, "SyntaxError"); - } - if (urlRecord.protocol !== "ws:" && urlRecord.protocol !== "wss:") { - throw new DOMException2( - `Expected a ws: or wss: protocol, got ${urlRecord.protocol}`, - "SyntaxError" - ); - } - if (urlRecord.hash) { - throw new DOMException2("Got fragment", "SyntaxError"); - } - if (typeof protocols === "string") { - protocols = [protocols]; - } - if (protocols.length !== new Set(protocols.map((p) => p.toLowerCase())).size) { - throw new DOMException2("Invalid Sec-WebSocket-Protocol value", "SyntaxError"); - } - if (protocols.length > 0 && !protocols.every((p) => isValidSubprotocol(p))) { - throw new DOMException2("Invalid Sec-WebSocket-Protocol value", "SyntaxError"); - } - this[kWebSocketURL] = urlRecord; - this[kController] = establishWebSocketConnection( - urlRecord, - protocols, - this, - (response) => this.#onConnectionEstablished(response), - options2 - ); - this[kReadyState] = _WebSocket.CONNECTING; - this[kBinaryType] = "blob"; - } - /** - * @see https://websockets.spec.whatwg.org/#dom-websocket-close - * @param {number|undefined} code - * @param {string|undefined} reason - */ - close(code = void 0, reason = void 0) { - webidl.brandCheck(this, _WebSocket); - if (code !== void 0) { - code = webidl.converters["unsigned short"](code, { clamp: true }); - } - if (reason !== void 0) { - reason = webidl.converters.USVString(reason); - } - if (code !== void 0) { - if (code !== 1e3 && (code < 3e3 || code > 4999)) { - throw new DOMException2("invalid code", "InvalidAccessError"); - } - } - let reasonByteLength = 0; - if (reason !== void 0) { - reasonByteLength = Buffer.byteLength(reason); - if (reasonByteLength > 123) { - throw new DOMException2( - `Reason must be less than 123 bytes; received ${reasonByteLength}`, - "SyntaxError" - ); - } - } - if (this[kReadyState] === _WebSocket.CLOSING || this[kReadyState] === _WebSocket.CLOSED) { - } else if (!isEstablished(this)) { - failWebsocketConnection(this, "Connection was closed before it was established."); - this[kReadyState] = _WebSocket.CLOSING; - } else if (!isClosing(this)) { - const frame = new WebsocketFrameSend(); - if (code !== void 0 && reason === void 0) { - frame.frameData = Buffer.allocUnsafe(2); - frame.frameData.writeUInt16BE(code, 0); - } else if (code !== void 0 && reason !== void 0) { - frame.frameData = Buffer.allocUnsafe(2 + reasonByteLength); - frame.frameData.writeUInt16BE(code, 0); - frame.frameData.write(reason, 2, "utf-8"); - } else { - frame.frameData = emptyBuffer; - } - const socket = this[kResponse].socket; - socket.write(frame.createFrame(opcodes.CLOSE), (err) => { - if (!err) { - this[kSentClose] = true; - } - }); - this[kReadyState] = states.CLOSING; - } else { - this[kReadyState] = _WebSocket.CLOSING; - } - } - /** - * @see https://websockets.spec.whatwg.org/#dom-websocket-send - * @param {NodeJS.TypedArray|ArrayBuffer|Blob|string} data - */ - send(data) { - webidl.brandCheck(this, _WebSocket); - webidl.argumentLengthCheck(arguments, 1, { header: "WebSocket.send" }); - data = webidl.converters.WebSocketSendData(data); - if (this[kReadyState] === _WebSocket.CONNECTING) { - throw new DOMException2("Sent before connected.", "InvalidStateError"); - } - if (!isEstablished(this) || isClosing(this)) { - return; - } - const socket = this[kResponse].socket; - if (typeof data === "string") { - const value = Buffer.from(data); - const frame = new WebsocketFrameSend(value); - const buffer = frame.createFrame(opcodes.TEXT); - this.#bufferedAmount += value.byteLength; - socket.write(buffer, () => { - this.#bufferedAmount -= value.byteLength; - }); - } else if (types.isArrayBuffer(data)) { - const value = Buffer.from(data); - const frame = new WebsocketFrameSend(value); - const buffer = frame.createFrame(opcodes.BINARY); - this.#bufferedAmount += value.byteLength; - socket.write(buffer, () => { - this.#bufferedAmount -= value.byteLength; - }); - } else if (ArrayBuffer.isView(data)) { - const ab = Buffer.from(data, data.byteOffset, data.byteLength); - const frame = new WebsocketFrameSend(ab); - const buffer = frame.createFrame(opcodes.BINARY); - this.#bufferedAmount += ab.byteLength; - socket.write(buffer, () => { - this.#bufferedAmount -= ab.byteLength; - }); - } else if (isBlobLike(data)) { - const frame = new WebsocketFrameSend(); - data.arrayBuffer().then((ab) => { - const value = Buffer.from(ab); - frame.frameData = value; - const buffer = frame.createFrame(opcodes.BINARY); - this.#bufferedAmount += value.byteLength; - socket.write(buffer, () => { - this.#bufferedAmount -= value.byteLength; - }); - }); - } - } - get readyState() { - webidl.brandCheck(this, _WebSocket); - return this[kReadyState]; - } - get bufferedAmount() { - webidl.brandCheck(this, _WebSocket); - return this.#bufferedAmount; - } - get url() { - webidl.brandCheck(this, _WebSocket); - return URLSerializer(this[kWebSocketURL]); - } - get extensions() { - webidl.brandCheck(this, _WebSocket); - return this.#extensions; - } - get protocol() { - webidl.brandCheck(this, _WebSocket); - return this.#protocol; - } - get onopen() { - webidl.brandCheck(this, _WebSocket); - return this.#events.open; - } - set onopen(fn) { - webidl.brandCheck(this, _WebSocket); - if (this.#events.open) { - this.removeEventListener("open", this.#events.open); - } - if (typeof fn === "function") { - this.#events.open = fn; - this.addEventListener("open", fn); - } else { - this.#events.open = null; - } - } - get onerror() { - webidl.brandCheck(this, _WebSocket); - return this.#events.error; - } - set onerror(fn) { - webidl.brandCheck(this, _WebSocket); - if (this.#events.error) { - this.removeEventListener("error", this.#events.error); - } - if (typeof fn === "function") { - this.#events.error = fn; - this.addEventListener("error", fn); - } else { - this.#events.error = null; - } - } - get onclose() { - webidl.brandCheck(this, _WebSocket); - return this.#events.close; - } - set onclose(fn) { - webidl.brandCheck(this, _WebSocket); - if (this.#events.close) { - this.removeEventListener("close", this.#events.close); - } - if (typeof fn === "function") { - this.#events.close = fn; - this.addEventListener("close", fn); - } else { - this.#events.close = null; - } - } - get onmessage() { - webidl.brandCheck(this, _WebSocket); - return this.#events.message; - } - set onmessage(fn) { - webidl.brandCheck(this, _WebSocket); - if (this.#events.message) { - this.removeEventListener("message", this.#events.message); - } - if (typeof fn === "function") { - this.#events.message = fn; - this.addEventListener("message", fn); - } else { - this.#events.message = null; - } - } - get binaryType() { - webidl.brandCheck(this, _WebSocket); - return this[kBinaryType]; - } - set binaryType(type) { - webidl.brandCheck(this, _WebSocket); - if (type !== "blob" && type !== "arraybuffer") { - this[kBinaryType] = "blob"; - } else { - this[kBinaryType] = type; - } - } - /** - * @see https://websockets.spec.whatwg.org/#feedback-from-the-protocol - */ - #onConnectionEstablished(response) { - this[kResponse] = response; - const parser = new ByteParser(this); - parser.on("drain", function onParserDrain() { - this.ws[kResponse].socket.resume(); - }); - response.socket.ws = this; - this[kByteParser] = parser; - this[kReadyState] = states.OPEN; - const extensions = response.headersList.get("sec-websocket-extensions"); - if (extensions !== null) { - this.#extensions = extensions; - } - const protocol = response.headersList.get("sec-websocket-protocol"); - if (protocol !== null) { - this.#protocol = protocol; - } - fireEvent("open", this); - } - }; - WebSocket.CONNECTING = WebSocket.prototype.CONNECTING = states.CONNECTING; - WebSocket.OPEN = WebSocket.prototype.OPEN = states.OPEN; - WebSocket.CLOSING = WebSocket.prototype.CLOSING = states.CLOSING; - WebSocket.CLOSED = WebSocket.prototype.CLOSED = states.CLOSED; - Object.defineProperties(WebSocket.prototype, { - CONNECTING: staticPropertyDescriptors, - OPEN: staticPropertyDescriptors, - CLOSING: staticPropertyDescriptors, - CLOSED: staticPropertyDescriptors, - url: kEnumerableProperty, - readyState: kEnumerableProperty, - bufferedAmount: kEnumerableProperty, - onopen: kEnumerableProperty, - onerror: kEnumerableProperty, - onclose: kEnumerableProperty, - close: kEnumerableProperty, - onmessage: kEnumerableProperty, - binaryType: kEnumerableProperty, - send: kEnumerableProperty, - extensions: kEnumerableProperty, - protocol: kEnumerableProperty, - [Symbol.toStringTag]: { - value: "WebSocket", - writable: false, - enumerable: false, - configurable: true - } - }); - Object.defineProperties(WebSocket, { - CONNECTING: staticPropertyDescriptors, - OPEN: staticPropertyDescriptors, - CLOSING: staticPropertyDescriptors, - CLOSED: staticPropertyDescriptors - }); - webidl.converters["sequence"] = webidl.sequenceConverter( - webidl.converters.DOMString - ); - webidl.converters["DOMString or sequence"] = function(V) { - if (webidl.util.Type(V) === "Object" && Symbol.iterator in V) { - return webidl.converters["sequence"](V); - } - return webidl.converters.DOMString(V); - }; - webidl.converters.WebSocketInit = webidl.dictionaryConverter([ - { - key: "protocols", - converter: webidl.converters["DOMString or sequence"], - get defaultValue() { - return []; - } - }, - { - key: "dispatcher", - converter: (V) => V, - get defaultValue() { - return getGlobalDispatcher(); - } - }, - { - key: "headers", - converter: webidl.nullableConverter(webidl.converters.HeadersInit) - } - ]); - webidl.converters["DOMString or sequence or WebSocketInit"] = function(V) { - if (webidl.util.Type(V) === "Object" && !(Symbol.iterator in V)) { - return webidl.converters.WebSocketInit(V); - } - return { protocols: webidl.converters["DOMString or sequence"](V) }; - }; - webidl.converters.WebSocketSendData = function(V) { - if (webidl.util.Type(V) === "Object") { - if (isBlobLike(V)) { - return webidl.converters.Blob(V, { strict: false }); - } - if (ArrayBuffer.isView(V) || types.isAnyArrayBuffer(V)) { - return webidl.converters.BufferSource(V); - } - } - return webidl.converters.USVString(V); - }; - module2.exports = { - WebSocket - }; - } -}); - -// node_modules/undici/index.js -var require_undici = __commonJS({ - "node_modules/undici/index.js"(exports2, module2) { - "use strict"; - var Client = require_client4(); - var Dispatcher = require_dispatcher(); - var errors = require_errors(); - var Pool = require_pool2(); - var BalancedPool = require_balanced_pool(); - var Agent = require_agent(); - var util = require_util4(); - var { InvalidArgumentError } = errors; - var api = require_api2(); - var buildConnector = require_connect2(); - var MockClient = require_mock_client(); - var MockAgent = require_mock_agent(); - var MockPool = require_mock_pool(); - var mockErrors = require_mock_errors(); - var ProxyAgent = require_proxy_agent(); - var { getGlobalDispatcher, setGlobalDispatcher } = require_global2(); - var DecoratorHandler = require_DecoratorHandler(); - var RedirectHandler = require_RedirectHandler(); - var createRedirectInterceptor = require_redirectInterceptor(); - var hasCrypto; - try { - require("crypto"); - hasCrypto = true; - } catch { - hasCrypto = false; - } - Object.assign(Dispatcher.prototype, api); - module2.exports.Dispatcher = Dispatcher; - module2.exports.Client = Client; - module2.exports.Pool = Pool; - module2.exports.BalancedPool = BalancedPool; - module2.exports.Agent = Agent; - module2.exports.ProxyAgent = ProxyAgent; - module2.exports.DecoratorHandler = DecoratorHandler; - module2.exports.RedirectHandler = RedirectHandler; - module2.exports.createRedirectInterceptor = createRedirectInterceptor; - module2.exports.buildConnector = buildConnector; - module2.exports.errors = errors; - function makeDispatcher(fn) { - return (url, opts, handler2) => { - if (typeof opts === "function") { - handler2 = opts; - opts = null; - } - if (!url || typeof url !== "string" && typeof url !== "object" && !(url instanceof URL)) { - throw new InvalidArgumentError("invalid url"); - } - if (opts != null && typeof opts !== "object") { - throw new InvalidArgumentError("invalid opts"); - } - if (opts && opts.path != null) { - if (typeof opts.path !== "string") { - throw new InvalidArgumentError("invalid opts.path"); - } - let path = opts.path; - if (!opts.path.startsWith("/")) { - path = `/${path}`; - } - url = new URL(util.parseOrigin(url).origin + path); - } else { - if (!opts) { - opts = typeof url === "object" ? url : {}; - } - url = util.parseURL(url); - } - const { agent, dispatcher = getGlobalDispatcher() } = opts; - if (agent) { - throw new InvalidArgumentError("unsupported opts.agent. Did you mean opts.client?"); - } - return fn.call(dispatcher, { - ...opts, - origin: url.origin, - path: url.search ? `${url.pathname}${url.search}` : url.pathname, - method: opts.method || (opts.body ? "PUT" : "GET") - }, handler2); - }; - } - module2.exports.setGlobalDispatcher = setGlobalDispatcher; - module2.exports.getGlobalDispatcher = getGlobalDispatcher; - if (util.nodeMajor > 16 || util.nodeMajor === 16 && util.nodeMinor >= 8) { - let fetchImpl = null; - module2.exports.fetch = async function fetch(resource) { - if (!fetchImpl) { - fetchImpl = require_fetch2().fetch; - } - try { - return await fetchImpl(...arguments); - } catch (err) { - Error.captureStackTrace(err, this); - throw err; - } - }; - module2.exports.Headers = require_headers().Headers; - module2.exports.Response = require_response().Response; - module2.exports.Request = require_request2().Request; - module2.exports.FormData = require_formdata().FormData; - module2.exports.File = require_file().File; - module2.exports.FileReader = require_filereader().FileReader; - const { setGlobalOrigin, getGlobalOrigin } = require_global(); - module2.exports.setGlobalOrigin = setGlobalOrigin; - module2.exports.getGlobalOrigin = getGlobalOrigin; - const { CacheStorage } = require_cachestorage(); - const { kConstruct } = require_symbols4(); - module2.exports.caches = new CacheStorage(kConstruct); - } - if (util.nodeMajor >= 16) { - const { deleteCookie, getCookies, getSetCookies, setCookie } = require_cookies(); - module2.exports.deleteCookie = deleteCookie; - module2.exports.getCookies = getCookies; - module2.exports.getSetCookies = getSetCookies; - module2.exports.setCookie = setCookie; - const { parseMIMEType, serializeAMimeType } = require_dataURL(); - module2.exports.parseMIMEType = parseMIMEType; - module2.exports.serializeAMimeType = serializeAMimeType; - } - if (util.nodeMajor >= 18 && hasCrypto) { - const { WebSocket } = require_websocket(); - module2.exports.WebSocket = WebSocket; - } - module2.exports.request = makeDispatcher(api.request); - module2.exports.stream = makeDispatcher(api.stream); - module2.exports.pipeline = makeDispatcher(api.pipeline); - module2.exports.connect = makeDispatcher(api.connect); - module2.exports.upgrade = makeDispatcher(api.upgrade); - module2.exports.MockClient = MockClient; - module2.exports.MockPool = MockPool; - module2.exports.MockAgent = MockAgent; - module2.exports.mockErrors = mockErrors; - } -}); - -// node_modules/native-fetch/cjs/src/index-node.js -var require_index_node = __commonJS({ - "node_modules/native-fetch/cjs/src/index-node.js"(exports2) { - "use strict"; - Object.defineProperty(exports2, "__esModule", { value: true }); - var undici = require_undici(); - function _interopNamespace(e) { - if (e && e.__esModule) - return e; - var n = /* @__PURE__ */ Object.create(null); - if (e) { - Object.keys(e).forEach(function(k2) { - if (k2 !== "default") { - var d = Object.getOwnPropertyDescriptor(e, k2); - Object.defineProperty(n, k2, d.get ? d : { - enumerable: true, - get: function() { - return e[k2]; - } - }); - } - }); - } - n["default"] = e; - return Object.freeze(n); - } - var undici__namespace = /* @__PURE__ */ _interopNamespace(undici); - var fetch = globalThis.fetch ? globalThis.fetch : undici__namespace.fetch; - var Headers = globalThis.Headers ? globalThis.Headers : undici__namespace.Headers; - var Request = globalThis.Request ? globalThis.Request : undici__namespace.Request; - var Response = globalThis.Response ? globalThis.Response : undici__namespace.Response; - exports2.Headers = Headers; - exports2.Request = Request; - exports2.Response = Response; - exports2.fetch = fetch; - } -}); - -// node_modules/@plunk/node/dist/errors/PlunkError.js -var require_PlunkError = __commonJS({ - "node_modules/@plunk/node/dist/errors/PlunkError.js"(exports2) { - "use strict"; - Object.defineProperty(exports2, "__esModule", { value: true }); - exports2.PlunkError = void 0; - var PlunkError = class _PlunkError extends Error { - constructor(msg2) { - super(msg2); - Object.setPrototypeOf(this, _PlunkError.prototype); - } - }; - exports2.PlunkError = PlunkError; - } -}); - -// node_modules/@plunk/node/dist/errors/NotFound.js -var require_NotFound = __commonJS({ - "node_modules/@plunk/node/dist/errors/NotFound.js"(exports2) { - "use strict"; - Object.defineProperty(exports2, "__esModule", { value: true }); - exports2.NotFoundError = void 0; - var PlunkError_1 = require_PlunkError(); - var NotFoundError2 = class _NotFoundError extends PlunkError_1.PlunkError { - constructor(msg2 = "That resource could not be found") { - super(msg2); - Object.setPrototypeOf(this, _NotFoundError.prototype); - } - }; - exports2.NotFoundError = NotFoundError2; - } -}); - -// node_modules/@plunk/node/dist/errors/TokenError.js -var require_TokenError = __commonJS({ - "node_modules/@plunk/node/dist/errors/TokenError.js"(exports2) { - "use strict"; - Object.defineProperty(exports2, "__esModule", { value: true }); - exports2.TokenError = void 0; - var PlunkError_1 = require_PlunkError(); - var TokenError = class _TokenError extends PlunkError_1.PlunkError { - constructor(msg2 = "Invalid API Credentials Provided") { - super(msg2); - Object.setPrototypeOf(this, _TokenError.prototype); - } - }; - exports2.TokenError = TokenError; - } -}); - -// node_modules/@plunk/node/dist/lib/Plunk.js -var require_Plunk = __commonJS({ - "node_modules/@plunk/node/dist/lib/Plunk.js"(exports2) { - "use strict"; - Object.defineProperty(exports2, "__esModule", { value: true }); - exports2.Plunk = void 0; - var tslib_1 = (init_tslib_es6(), __toCommonJS(tslib_es6_exports)); - var native_fetch_1 = require_index_node(); - var NotFound_1 = require_NotFound(); - var TokenError_1 = require_TokenError(); - var Plunk2 = class { - constructor(key) { - this.events = { - /** - * Publishes an event to Plunk - * @param {string} event.event - The event you want to publish - * @param {string} event.email - The email associated with this event - * @param {Object=} event.data - The user data associated with this event - */ - track: (event) => tslib_1.__awaiter(this, void 0, void 0, function* () { - return yield this.fetch({ - method: "POST", - url: "track", - json: Object.assign({}, event) - }); - }) - }; - this.emails = { - /** - * Sends a transactional email with Plunk - * - * @param {string} body.to - The email you want to send to - * @param {string} body.subject - The subject of the email - * @param {string} body.body - The body of the email - * @param {string=} body.from - The email you want to send from - * @param {string=} body.name - The name you want to send as - * @param {string=html} body.type - The type of email you want to send - * @param {boolean=false} body.withUnsubscribe - Whether to include an unsubscribe link - */ - send: (body) => tslib_1.__awaiter(this, void 0, void 0, function* () { - return yield this.fetch({ - method: "POST", - url: "send", - json: Object.assign({}, body) - }); - }) - }; - this.key = key; - } - fetch(_a2) { - var _b; - var { json, url } = _a2, options2 = tslib_1.__rest(_a2, ["json", "url"]); - return tslib_1.__awaiter(this, void 0, void 0, function* () { - const res = yield (0, native_fetch_1.fetch)(new URL(url, "https://api.useplunk.com/v1/").toString(), Object.assign(Object.assign({}, options2), { headers: Object.assign(Object.assign({ Authorization: `Bearer ${this.key}` }, json && { "Content-Type": "application/json" }), options2.headers), body: json ? JSON.stringify(json) : void 0 })); - const text = yield res.text(); - const data = safeJsonParse(text); - if ((res === null || res === void 0 ? void 0 : res.status) === 401) { - throw new TokenError_1.TokenError(data === null || data === void 0 ? void 0 : data.message); - } - if ((res === null || res === void 0 ? void 0 : res.status) === 404) { - throw new NotFound_1.NotFoundError(data === null || data === void 0 ? void 0 : data.message); - } - if (!res.ok) { - throw new Error((_b = data === null || data === void 0 ? void 0 : data.message) !== null && _b !== void 0 ? _b : "Unknown API Error"); - } - return data; - }); - } - }; - exports2.Plunk = Plunk2; - function safeJsonParse(text) { - try { - return JSON.parse(text); - } catch (e) { - return text; - } - } - } -}); - -// node_modules/@plunk/node/dist/index.js -var require_dist = __commonJS({ - "node_modules/@plunk/node/dist/index.js"(exports2) { - "use strict"; - Object.defineProperty(exports2, "__esModule", { value: true }); - var Plunk_1 = require_Plunk(); - exports2.default = Plunk_1.Plunk; - } -}); - -// src/server.ts -var server_exports = {}; -__export(server_exports, { - default: () => server_default -}); -module.exports = __toCommonJS(server_exports); - -// node_modules/dotenv/config.js -(function() { - require_main().config( - Object.assign( - {}, - require_env_options(), - require_cli_options()(process.argv) - ) - ); -})(); - -// src/server.ts -var import_path = require("path"); -var import_proto_loader = __toESM(require_src2()); -var import_grpc_js3 = __toESM(require_src3()); - -// src/lib/log.ts -function getStackTrace() { - let stack; - try { - throw new Error(""); - } catch (error2) { - stack = error2.stack || ""; - } - stack = stack.split("\n").map((line) => line.trim()); - return stack.splice(stack[0] === "Error" ? 2 : 1); -} -var getInitiator = () => { - const [, , caller] = getStackTrace(); - const file = caller.split("/").at(-1) || ""; - return file.replace(")", ""); -}; -var warn = (...args) => { - console.group( - `\x1B[33m${(/* @__PURE__ */ new Date()).toISOString()} - WARN - ${getInitiator()}\x1B[0m` - ); - console.warn(...args); - console.groupEnd(); -}; -var error = (...args) => { - console.group( - `\x1B[31m${(/* @__PURE__ */ new Date()).toISOString()} - ERROR - ${getInitiator()}\x1B[0m` - ); - console.error(...args); - console.groupEnd(); -}; -var info = (...args) => { - console.group( - `\x1B[34m${(/* @__PURE__ */ new Date()).toISOString()} - INFO - ${getInitiator()}\x1B[0m` - ); - console.log(...args); - console.groupEnd(); -}; -var debug = (...args) => { - console.log(...args); -}; -var log = { - warn, - error, - info, - debug -}; -var utils = { - bold: (text) => `\x1B[1m${text}\x1B[0m`, - red: (text) => `\x1B[31m${text}\x1B[0m`, - green: (text) => `\x1B[32m${text}\x1B[0m`, - yellow: (text) => `\x1B[33m${text}\x1B[0m`, - blue: (text) => `\x1B[34m${text}\x1B[0m`, - magenta: (text) => `\x1B[35m${text}\x1B[0m`, - cyan: (text) => `\x1B[36m${text}\x1B[0m`, - white: (text) => `\x1B[37m${text}\x1B[0m`, - gray: (text) => `\x1B[90m${text}\x1B[0m` -}; - -// src/resources/protoloader-options.ts -var options = { - keepCase: true, - longs: String, - enums: String, - defaults: true, - oneofs: true -}; - -// src/resources/grpc-credentials.ts -var import_grpc_js = __toESM(require_src3()); -var insecure = import_grpc_js.credentials.createInsecure(); -var serverInsecure = import_grpc_js.ServerCredentials.createInsecure(); - -// src/lib/prisma.ts -var import_client = __toESM(require_client3()); -var prisma; -var OPTIONS = { - log: process.env.NEXT_PUBLIC_APP_ENV !== "production" ? ["info", "warn"] : void 0 -}; -if (process.env.NODE_ENV === "production") { - prisma = new import_client.PrismaClient(OPTIONS); -} else { - if (!("prisma" in global)) { - global.prisma = new import_client.PrismaClient(OPTIONS); - } - prisma = global.prisma; -} -var prisma_default = prisma; - -// src/handler/create.ts -var CreateNotification = async ({ request }, callback) => { - try { - const { message, message_type, title } = request; - const notifications = await prisma_default.notification.create({ - data: { - title, - message, - message_type - } - }); - callback(null, notifications); - } catch (error2) { - log.error(error2); - callback(error2, null); - } -}; - -// src/handler/get.ts -var GetNotification = async ({ request }, callback) => { - try { - const { id } = request; - const notification = await prisma_default.notification.findFirstOrThrow({ where: { id } }); - callback(null, notification); - } catch (error2) { - log.error(error2); - callback(error2, null); - } -}; - -// src/handler/update.ts -var UpdateNotification = async ({ request }, callback) => { - try { - const { id, title, message, message_type } = request; - const notification = await prisma_default.notification.update({ - where: { id }, - data: { - title, - message, - message_type - } - }); - callback(null, notification); - } catch (error2) { - log.error(error2); - callback(error2, null); - } -}; - -// src/handler/delete.ts -var DeleteNotification = async ({ request }, callback) => { - try { - const { id } = request; - await prisma_default.notification.delete({ where: { id } }); - callback(null, null); - } catch (error2) { - log.error(error2); - callback(error2, null); - } -}; - -// src/handler/listByType.ts -var GetNotifications = async ({ request }, callback) => { - try { - const { message_type } = request; - log.debug(message_type); - const notifications = { - notifications: await prisma_default.notification.findMany({ where: { message_type } }) - }; - callback(null, notifications); - } catch (error2) { - log.error(error2); - callback(error2, null); - } -}; - -// src/handler/index.ts -var handler_default = { - CreateNotification, - GetNotification, - UpdateNotification, - DeleteNotification, - GetNotifications -}; - -// src/lib/proxy.ts -var import_grpc_js2 = __toESM(require_src3()); -var getType = (method) => { - if (method.requestStream === false && method.responseStream === false) { - return "unary"; - } - return "unknown"; -}; -var lookupServiceMetadata = (service) => { - const serviceKeys = Object.keys(service); - const intersectingMethods = serviceKeys.reduce((acc, k2) => { - const method = service[k2]; - if (!method) { - throw new Error(`cannot find method ${k2} on service`); - } - const components = method.path.split("/"); - acc[k2] = { - name: components[1], - method: components[2], - type: getType(method), - path: method.path, - responseType: method.responseType, - requestType: method.requestType - }; - return acc; - }, {}); - return (key) => intersectingMethods[key]; -}; -var handler = { - get(target, propKey) { - if (propKey !== "addService") { - return target[propKey]; - } - return (service, implementation) => { - const newImplementation = {}; - const lookup = lookupServiceMetadata(service); - for (const k2 in implementation) { - const name = k2; - const fn = implementation[k2]; - newImplementation[name] = (call, callback) => { - const ctx = { - call, - name, - service: lookup(name), - status: { - code: import_grpc_js2.status.UNKNOWN, - details: "" - } - }; - const newCallback = (callback2) => { - return (...args) => { - ctx.status = { - code: import_grpc_js2.status.OK, - details: "" - }; - const err = args[0]; - if (err) { - ctx.status = { - code: import_grpc_js2.status.UNKNOWN, - details: err - }; - } - callback2(...args); - }; - }; - const interceptors = target.intercept(); - const first = interceptors.next(); - if (!first.value) { - return new Promise((resolve) => { - return resolve(fn(call, newCallback(callback))); - }); - } - first.value(ctx, function next() { - return new Promise((resolve) => { - const i = interceptors.next(); - if (i.done) { - return resolve(fn(call, newCallback(callback))); - } - return resolve(i.value(ctx, next)); - }); - }); - }; - } - return target.addService(service, newImplementation); - }; - } -}; -var createServerProxy = (server2) => { - server2.interceptors = []; - server2.use = (fn) => { - server2.interceptors.push(fn); - }; - server2.intercept = function* intercept() { - let i = 0; - while (i < server2.interceptors.length) { - yield server2.interceptors[i]; - i++; - } - }; - return new Proxy(server2, handler); -}; - -// src/lib/amqp.ts -var import_amqplib = __toESM(require_channel_api()); - -// src/lib/plunk.ts -var import_node = __toESM(require_dist()); -var plunkKey = process.env.PLUNK_PUBLIC_KEY; -if (!plunkKey) - throw new Error("Plunk API key not found"); -var plunk = new import_node.default(plunkKey); -var plunk_default = plunk; - -// src/lib/amqp.ts -var DEFAULT_QUEUE = "log"; -var DEFAULT_SUB_QUEUE = "notification"; -async function connectQueue(queue = DEFAULT_QUEUE) { - try { - const connection = await import_amqplib.default.connect(process.env.AMQP_URL || ""); - const channel = await connection.createChannel(); - await channel.assertExchange(queue, "fanout", { durable: true }); - return channel; - } catch (error2) { - return error2; - } -} -var toLog = (message) => { - const { request, path } = message; - return { event_message: path, metadata: { request } }; -}; -var publish = async (message, queue = DEFAULT_QUEUE) => { - const channel = await connectQueue(queue); - if (channel instanceof Error) - return console.log("Error to connect to queue: ", channel); - channel.sendToQueue(queue, Buffer.from(JSON.stringify(toLog(message)))); - log.debug( - msg("AMQP", `${queue} (queue)`, /* @__PURE__ */ new Date(), /* @__PURE__ */ new Date()), - JSON.stringify(message) - ); -}; -var toNotification = (message) => { - const { email, title, messageTexte } = JSON.parse(message.content.toString()); - return { email, title, messageTexte, messageType: "OUTPUT" /* OUTPUT */ }; -}; -var subscribe = async (queue = DEFAULT_SUB_QUEUE) => { - const channel = await connectQueue(queue); - if (channel instanceof Error) - return console.log("Error to connect to queue: ", channel); - channel.consume( - queue, - async function(message) { - const { email, title, messageTexte, messageType } = toNotification(message); - const notification = { - request: { - title, - message: messageTexte, - message_type: messageType - } - }; - CreateNotification(notification, () => { - }); - const { success } = await plunk_default.emails.send({ - to: email, - body: messageTexte, - subject: title - }); - if (success) - log.debug( - msg("AMQP", `${queue} (queue)`, /* @__PURE__ */ new Date(), /* @__PURE__ */ new Date()), - "Email send" - ); - else - log.debug( - msg("AMQP", `${queue} (queue)`, /* @__PURE__ */ new Date(), /* @__PURE__ */ new Date()), - "Email not send" - ); - }, - { - noAck: true - } - ); -}; - -// src/middleware/log.ts -var parseContext = (ctx) => { - const { - call: { request }, - service: { path } - } = ctx; - return { request, path }; -}; -var msg = (type, path, requestAt, responseAt) => `${utils.magenta(requestAt.toISOString())} | ${utils[type === "GRPC" ? "cyan" : "red"](type)}${path ? ` | ${utils.yellow(path)}` : ""} | ${utils.green( - responseAt.getTime() - requestAt.getTime() + "ms" -)} |`; -var logGRPC = async (ctx, next) => { - const requestAt = /* @__PURE__ */ new Date(); - await next(); - const responseAt = /* @__PURE__ */ new Date(); - let { request, path } = parseContext(ctx); - path = path?.split(".").at(-1) || ""; - publish({ request, path }, "log"); - log.debug(msg("GRPC", path, requestAt, responseAt), JSON.stringify(request)); -}; - -// src/server.ts -var PORT = process.env.PORT || 50022; -var ADDRESS = `0.0.0.0:${PORT}`; -var PROTO_PATH = (0, import_path.resolve)(__dirname + "/../../proto/notification.proto"); -var packageDefinition = (0, import_proto_loader.loadSync)(PROTO_PATH, options); -var grpc = (0, import_grpc_js3.loadPackageDefinition)(packageDefinition); -var { - NotificationService: { service: ns2 } -} = grpc.com.goodfood.notification; -subscribe(); -var server = createServerProxy(new import_grpc_js3.Server()); -server.addService(ns2, handler_default); -server.use(logGRPC); -server.bindAsync(ADDRESS, serverInsecure, () => { - server.start(); - const message = `---- ${utils.green("good")}${utils.yellow( - "food" - )} Notification Service ---- -started on: ${utils.bold(ADDRESS)} ${utils.green( - "\u2713" - )} -`; - log.debug(message); -}); -var server_default = server; -/*! Bundled license information: - -@grpc/proto-loader/build/src/util.js: - (** - * @license - * Copyright 2018 gRPC authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - *) - -@grpc/proto-loader/build/src/index.js: - (** - * @license - * Copyright 2018 gRPC authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - *) - -@prisma/client/runtime/library.js: - (*! - * decimal.js v10.4.3 - * An arbitrary-precision Decimal type for JavaScript. - * https://github.com/MikeMcl/decimal.js - * Copyright (c) 2022 Michael Mclaughlin - * MIT Licence - *) - -amqplib/lib/defs.js: - (** @preserve This file is generated by the script - * ../bin/generate-defs.js, which is not in general included in a - * distribution, but is available in the source repository e.g. at - * https://github.com/squaremo/amqp.node/ - *) - -undici/lib/fetch/body.js: - (*! formdata-polyfill. MIT License. Jimmy Wärting *) - -undici/lib/websocket/frame.js: - (*! ws. MIT License. Einar Otto Stangvik *) -*/ From 1de138a6227b667d00196807a689b7b725637b28 Mon Sep 17 00:00:00 2001 From: Florian Leroux <10078837+floriaaan@users.noreply.github.com> Date: Sun, 20 Aug 2023 14:34:20 +0200 Subject: [PATCH 430/883] fix(docker): change expose port --- services/notification/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/notification/Dockerfile b/services/notification/Dockerfile index 4eaf1348..e8685fd5 100644 --- a/services/notification/Dockerfile +++ b/services/notification/Dockerfile @@ -32,7 +32,7 @@ COPY --from=builder /app/proto/ /proto/ COPY --from=builder /app/node_modules/.prisma /.prisma # Expose the gRPC port -EXPOSE 50006 +EXPOSE 50022 # Start the server CMD [ "node", "index.js"] From 95fc7999e939f3adc37a7c905dfe5311639c6225 Mon Sep 17 00:00:00 2001 From: Florian Leroux <10078837+floriaaan@users.noreply.github.com> Date: Sun, 20 Aug 2023 14:34:38 +0200 Subject: [PATCH 431/883] fix(git): add dist to gitignore --- services/notification/.gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/services/notification/.gitignore b/services/notification/.gitignore index 11ddd8db..5240516d 100644 --- a/services/notification/.gitignore +++ b/services/notification/.gitignore @@ -1,3 +1,4 @@ node_modules # Keep environment variables out of version control .env +dist/ From cd1c3a4059985c5c761f87bbcba86e797a309ece Mon Sep 17 00:00:00 2001 From: Florian Leroux <10078837+floriaaan@users.noreply.github.com> Date: Sun, 20 Aug 2023 14:35:03 +0200 Subject: [PATCH 432/883] ref(build): add minify param to esbuild cmd --- services/notification/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/notification/package.json b/services/notification/package.json index 077b603c..61f2828b 100644 --- a/services/notification/package.json +++ b/services/notification/package.json @@ -4,7 +4,7 @@ "scripts": { "start": "node dist/index.js", "dev": "nodemon --watch 'src/**/*.ts' --exec 'ts-node' src/server.ts", - "build": "esbuild src/server.ts --bundle --platform=node --target=node18 --outfile=dist/index.js", + "build": "esbuild src/server.ts --bundle --platform=node --target=node18 --outfile=dist/index.js --minify", "test": "echo 'tests are disabled'", "prisma:generate": "prisma generate", "postinstall": "npm run prisma:generate" From ed7566180ae5a30725a5d7e24014871fc564522e Mon Sep 17 00:00:00 2001 From: Anatole-Godard <48732483+Anatole-Godard@users.noreply.github.com> Date: Sun, 20 Aug 2023 14:43:36 +0200 Subject: [PATCH 433/883] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 29c495bc..155f8b10 100644 --- a/README.md +++ b/README.md @@ -29,7 +29,7 @@ a high volume of concurrent users, up to several thousand. | Stock | 50009 | NodeJS (ts) | PostgreSQL | ⚠️ | @floriaaan | | Reporting | 50020 | C# (dotnet) | PostgreSQL | ⚠️ | @floriaaan | | Log | 50021 | Go | PostgreSQL | ✅ | @floriaaan | -| Notification | 50022 | NodeJS (ts) | PostgreSQL | ❌ | @PierreLbg | +| Notification | 50022 | NodeJS (ts) | PostgreSQL | ✅ | @PierreLbg | | (...) | (...) | (...) | (...) | (...) | ## File Hierarchy From 427323984438117355a70e7baba1c5054cd4e9f2 Mon Sep 17 00:00:00 2001 From: anatole Date: Sun, 20 Aug 2023 15:57:56 +0200 Subject: [PATCH 434/883] feat(global): add restaurant service to the docker compose --- services/docker-compose.yml | 151 +++++++++++++----- .../restaurant/restaurant.controller.ts | 90 +++++++++++ .../src/controller/user/user.controller.ts | 3 +- .../src/lib/swagger/swagger-output.json | 91 ++++++++++- services/gateway/src/server.ts | 5 +- .../src/services/clients/restaurant.client.ts | 8 + services/user/.env.docker | 6 - services/user/.gitignore | 3 +- services/user/dev.env | 6 + 9 files changed, 309 insertions(+), 54 deletions(-) create mode 100644 services/gateway/src/controller/restaurant/restaurant.controller.ts create mode 100644 services/gateway/src/services/clients/restaurant.client.ts delete mode 100644 services/user/.env.docker create mode 100644 services/user/dev.env diff --git a/services/docker-compose.yml b/services/docker-compose.yml index 0676de1f..e25b402f 100644 --- a/services/docker-compose.yml +++ b/services/docker-compose.yml @@ -1,7 +1,7 @@ version: "3" services: - # Gateway : + # Gateway gateway: image: goodfood-gateway:1.0.0 @@ -105,39 +105,54 @@ services: POSTGRES_DB: postgres PGDATA: /var/lib/postgresql/data/pgdata - # Delivery service + # Product service - delivery-service: - image: goodfood-delivery:1.0.0 + product-service: + image: goodfood-product:1.0.0 build: context: . - dockerfile: ./delivery/Dockerfile + dockerfile: ./product/Dockerfile env_file: - - delivery/.env.docker + - product/.env.docker ports: - - "50008" + - "50004" networks: - goodfood-network - delivery-redis: - image: redis:latest + product-postgres: + image: postgres:latest ports: - - "6379" + - "5432" volumes: - - goodfood-delivery-volume:/data + - goodfood-product-volume:/var/lib/postgresql/data networks: - goodfood-network - command: redis-server --appendonly yes environment: - REDIS_USERNAME: redis - REDIS_PASSWORD: password + POSTGRES_USER: postgres + POSTGRES_PASSWORD: password + POSTGRES_DB: postgres + PGDATA: /var/lib/postgresql/data/pgdata - delivery-postgres: + # Restaurant service + + restaurant-service: + image: goodfood-restaurant:1.0.0 + build: + context: . + dockerfile: ./restaurant/Dockerfile + env_file: + - restaurant/.env.docker + ports: + - "50005" + networks: + - goodfood-network + + restaurant-postgres: image: postgres:latest ports: - "5432" volumes: - - goodfood-delivery-volume:/var/lib/postgresql/data + - goodfood-restaurant-volume:/var/lib/postgresql/data networks: - goodfood-network environment: @@ -146,26 +161,26 @@ services: POSTGRES_DB: postgres PGDATA: /var/lib/postgresql/data/pgdata - # Order service + # Promotion service - order-service: - image: goodfood-order:1.0.0 + promotion-service: + image: goodfood-promotion:1.0.0 build: context: . - dockerfile: ./order/Dockerfile + dockerfile: ./promotions/Dockerfile env_file: - - order/.env.docker + - promotions/.env.docker ports: - - "50007" + - "50006" networks: - goodfood-network - order-postgres: + promotion-postgres: image: postgres:latest ports: - "5432" volumes: - - goodfood-order-volume:/var/lib/postgresql/data + - goodfood-promotion-volume:/var/lib/postgresql/data networks: - goodfood-network environment: @@ -174,26 +189,26 @@ services: POSTGRES_DB: postgres PGDATA: /var/lib/postgresql/data/pgdata - # Product service + # Order service - product-service: - image: goodfood-product:1.0.0 + order-service: + image: goodfood-order:1.0.0 build: context: . - dockerfile: ./product/Dockerfile + dockerfile: ./order/Dockerfile env_file: - - product/.env.docker + - order/.env.docker ports: - - "50004" + - "50007" networks: - goodfood-network - product-postgres: + order-postgres: image: postgres:latest ports: - "5432" volumes: - - goodfood-product-volume:/var/lib/postgresql/data + - goodfood-order-volume:/var/lib/postgresql/data networks: - goodfood-network environment: @@ -202,26 +217,39 @@ services: POSTGRES_DB: postgres PGDATA: /var/lib/postgresql/data/pgdata - # Promotion service + # Delivery service - promotion-service: - image: goodfood-promotion:1.0.0 + delivery-service: + image: goodfood-delivery:1.0.0 build: context: . - dockerfile: ./promotions/Dockerfile + dockerfile: ./delivery/Dockerfile env_file: - - promotions/.env.docker + - delivery/.env.docker ports: - - "50006" + - "50008" networks: - goodfood-network - promotion-postgres: + delivery-redis: + image: redis:latest + ports: + - "6379" + volumes: + - goodfood-delivery-volume:/data + networks: + - goodfood-network + command: redis-server --appendonly yes + environment: + REDIS_USERNAME: redis + REDIS_PASSWORD: password + + delivery-postgres: image: postgres:latest ports: - "5432" volumes: - - goodfood-promotion-volume:/var/lib/postgresql/data + - goodfood-delivery-volume:/var/lib/postgresql/data networks: - goodfood-network environment: @@ -260,6 +288,44 @@ services: # Log service + log-service: + depends_on: + - log-postgres + - log-rabbitmq + restart: + always + image: floriaaan/goodfood-log:latest + build: + context: . + dockerfile: ./log/Dockerfile + env_file: + - ./log/.env.docker + ports: + - "50021" + networks: + - goodfood-network + + log-rabbitmq: + restart: always + image: rabbitmq:3-management + ports: + - "5672" + - "15672" + networks: + - goodfood-network + + log-postgres: + image: postgres:15.2 + environment: + - POSTGRES_USER=postgres + - POSTGRES_PASSWORD=password + ports: + - "5432" + volumes: + - goodfood-log-volume:/var/lib/postgresql/data + networks: + # Log service + log-service: depends_on: - log-postgres @@ -302,10 +368,11 @@ volumes: goodfood-user-volume: goodfood-basket-volume: goodfood-payment-volume: - goodfood-delivery-volume: - goodfood-order-volume: goodfood-product-volume: + goodfood-restaurant-volume: goodfood-promotion-volume: + goodfood-order-volume: + goodfood-delivery-volume: goodfood-stock-volume: goodfood-log-volume: diff --git a/services/gateway/src/controller/restaurant/restaurant.controller.ts b/services/gateway/src/controller/restaurant/restaurant.controller.ts new file mode 100644 index 00000000..8501fe45 --- /dev/null +++ b/services/gateway/src/controller/restaurant/restaurant.controller.ts @@ -0,0 +1,90 @@ +import {Request, Response, Router} from "express"; +import {restaurantServiceClient} from "@gateway/services/clients/restaurant.client"; +import {RestaurantId} from "@gateway/proto/product_pb"; +import {Empty} from "google-protobuf/google/protobuf/empty_pb"; +import {ByLocationInput, Restaurant, RestaurantCreateInput} from "@gateway/proto/restaurant_pb"; + +export const restaurantRoutes = Router(); + +restaurantRoutes.get('/api/restaurant/:id', (req: Request, res: Response) => { + const {id} = req.params; + + restaurantServiceClient.getRestaurant(new RestaurantId().setId(id), (error, response) => { + if (error) { + res.status(500).send({error: error.message}); + } else { + res.json(response.toObject()); + } + }); +}); + +restaurantRoutes.get('/api/restaurant', (req: Request, res: Response) => { + restaurantServiceClient.getRestaurants(new Empty(), (error, response) => { + if (error) { + res.status(500).send({error: error.message}); + } else { + res.json(response.toObject()); + } + }); +}); + +restaurantRoutes.post('/api/restaurant/by-location', (req: Request, res: Response) => { + const {locationList} = req.body; + restaurantServiceClient.getRestaurantsByLocation(new ByLocationInput().setLocationList(locationList), (error, response) => { + if (error) { + res.status(500).send({error: error.message}); + } else { + res.json(response.toObject()); + } + }); +}); + +restaurantRoutes.post('/api/restaurant', (req: Request, res: Response) => { + const {name, description, locationList, address, openingHoursList, phone} = req.body; + const restaurantCreateInput = new RestaurantCreateInput().setName(name) + .setDescription(description) + .setLocationList(locationList) + .setAddress(address) + .setOpeninghoursList(openingHoursList) + .setPhone(phone); + + restaurantServiceClient.createRestaurant(restaurantCreateInput, (error, response) => { + if (error) { + res.status(500).send({error: error.message}); + } else { + res.json(response.toObject()); + } + }); +}); + +restaurantRoutes.put('/api/restaurant/:id', (req: Request, res: Response) => { + const {id} = req.params; + const {name, description, locationList, address, openingHoursList, phone} = req.body; + const restaurantCreateInput = new Restaurant().setId(id) + .setName(name) + .setDescription(description) + .setLocationList(locationList) + .setAddress(address) + .setOpeninghoursList(openingHoursList) + .setPhone(phone); + + restaurantServiceClient.updateRestaurant(restaurantCreateInput, (error, response) => { + if (error) { + res.status(500).send({error: error.message}); + } else { + res.json(response.toObject()); + } + }); +}); + +restaurantRoutes.delete('/api/restaurant/:id', (req: Request, res: Response) => { + const {id} = req.params; + + restaurantServiceClient.deleteRestaurant(new RestaurantId().setId(id), (error, response) => { + if (error) { + res.status(500).send({error: error.message}); + } else { + res.json(response.toObject()); + } + }); +}); \ No newline at end of file diff --git a/services/gateway/src/controller/user/user.controller.ts b/services/gateway/src/controller/user/user.controller.ts index ae9e4496..39bcf1f9 100644 --- a/services/gateway/src/controller/user/user.controller.ts +++ b/services/gateway/src/controller/user/user.controller.ts @@ -35,7 +35,7 @@ userRoutes.get('/api/user', (req: Request, res: Response) => { }); }); -userRoutes.post('/api/user', (req: Request, res: Response) => { +userRoutes.post('/api/user/register', (req: Request, res: Response) => { const {firstName, lastName, email, phone, country, zipCode, street, lat, lng, roleCode} = req.body; const userInput = new UserCreateInput(); try { @@ -192,5 +192,4 @@ userRoutes.put('/api/user/:id/role', (req: Request, res: Response) => { res.json(response.toObject()); } }); - }); \ No newline at end of file diff --git a/services/gateway/src/lib/swagger/swagger-output.json b/services/gateway/src/lib/swagger/swagger-output.json index cb06b981..850aecbe 100644 --- a/services/gateway/src/lib/swagger/swagger-output.json +++ b/services/gateway/src/lib/swagger/swagger-output.json @@ -139,7 +139,9 @@ "description": "Internal Server Error" } } - }, + } + }, + "/api/user/register": { "post": { "tags": [ "User" @@ -494,6 +496,93 @@ } } }, + "/api/payment/{id}": { + "get": { + "tags": [ + "Payment" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/payment/by-user/{userId}": { + "get": { + "tags": [ + "Payment" + ], + "description": "", + "parameters": [ + { + "name": "userId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/payment/stripe": { + "post": { + "tags": [ + "Payment" + ], + "description": "", + "parameters": [ + { + "name": "body", + "in": "body", + "schema": { + "type": "object", + "properties": { + "userId": { + "example": "any" + }, + "name": { + "example": "any" + }, + "email": { + "example": "any" + }, + "total": { + "example": "any" + } + } + } + } + ], + "responses": { + "200": { + "description": "OK" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, "/api/order/{id}": { "get": { "tags": [ diff --git a/services/gateway/src/server.ts b/services/gateway/src/server.ts index fce1c329..018bc60c 100644 --- a/services/gateway/src/server.ts +++ b/services/gateway/src/server.ts @@ -15,8 +15,9 @@ import {log, utils} from "@gateway/lib/log/log"; import {stripeRoutes} from "@gateway/controller/payment/stripe.controller"; import {paymentRoutes} from "@gateway/controller/payment/payment.controller"; -const express = require('express'); -const bodyParser = require('body-parser'); +import bodyParser from "body-parser"; + +import express from "express"; const app = express(); app.use(bodyParser.json()); diff --git a/services/gateway/src/services/clients/restaurant.client.ts b/services/gateway/src/services/clients/restaurant.client.ts new file mode 100644 index 00000000..2ae98036 --- /dev/null +++ b/services/gateway/src/services/clients/restaurant.client.ts @@ -0,0 +1,8 @@ +import services from '../../proto/restaurant_grpc_pb'; +import * as grpc from '@grpc/grpc-js'; + +const url = process.env.GATEWAY_RESTAURANT_URL || "localhost:50005"; + +export const restaurantServiceClient = new services.RestaurantServiceClient( + url, + grpc.credentials.createInsecure()); \ No newline at end of file diff --git a/services/user/.env.docker b/services/user/.env.docker deleted file mode 100644 index aa4be548..00000000 --- a/services/user/.env.docker +++ /dev/null @@ -1,6 +0,0 @@ -PORT=50001 -DB_URL=postgres://:@:/ -JWT_SECRET_KEY=example -DEFAULT_USER_EMAIL=example -DEFAULT_USER_PASSWORD=example -LOG_FILE_PATH=./logs/app.log diff --git a/services/user/.gitignore b/services/user/.gitignore index a640ce06..eac1434a 100644 --- a/services/user/.gitignore +++ b/services/user/.gitignore @@ -1,3 +1,4 @@ logs/* -*.env \ No newline at end of file +*.env +!dev.env \ No newline at end of file diff --git a/services/user/dev.env b/services/user/dev.env new file mode 100644 index 00000000..95b299d9 --- /dev/null +++ b/services/user/dev.env @@ -0,0 +1,6 @@ +PORT=50001 +DB_URL=postgres://postgres:password@user-postgres:5432/postgres +JWT_SECRET_KEY=example +DEFAULT_USER_EMAIL=example +DEFAULT_USER_PASSWORD=example +LOG_FILE_PATH=./logs/app.log \ No newline at end of file From 1246b4443f4c52c0270f577f28e6f1bccdce86e5 Mon Sep 17 00:00:00 2001 From: anatole Date: Sun, 20 Aug 2023 15:57:56 +0200 Subject: [PATCH 435/883] feat(global): add restaurant service to the docker compose --- services/docker-compose.yml | 151 +++++++++++++----- .../restaurant/restaurant.controller.ts | 90 +++++++++++ .../src/controller/user/user.controller.ts | 3 +- .../src/lib/swagger/swagger-output.json | 91 ++++++++++- services/gateway/src/server.ts | 5 +- .../src/services/clients/restaurant.client.ts | 8 + services/restaurant/.env.docker | 4 + services/restaurant/.gitignore | 3 +- services/user/.env.docker | 6 - services/user/.gitignore | 3 +- services/user/dev.env | 6 + 11 files changed, 315 insertions(+), 55 deletions(-) create mode 100644 services/gateway/src/controller/restaurant/restaurant.controller.ts create mode 100644 services/gateway/src/services/clients/restaurant.client.ts create mode 100644 services/restaurant/.env.docker delete mode 100644 services/user/.env.docker create mode 100644 services/user/dev.env diff --git a/services/docker-compose.yml b/services/docker-compose.yml index 0676de1f..e25b402f 100644 --- a/services/docker-compose.yml +++ b/services/docker-compose.yml @@ -1,7 +1,7 @@ version: "3" services: - # Gateway : + # Gateway gateway: image: goodfood-gateway:1.0.0 @@ -105,39 +105,54 @@ services: POSTGRES_DB: postgres PGDATA: /var/lib/postgresql/data/pgdata - # Delivery service + # Product service - delivery-service: - image: goodfood-delivery:1.0.0 + product-service: + image: goodfood-product:1.0.0 build: context: . - dockerfile: ./delivery/Dockerfile + dockerfile: ./product/Dockerfile env_file: - - delivery/.env.docker + - product/.env.docker ports: - - "50008" + - "50004" networks: - goodfood-network - delivery-redis: - image: redis:latest + product-postgres: + image: postgres:latest ports: - - "6379" + - "5432" volumes: - - goodfood-delivery-volume:/data + - goodfood-product-volume:/var/lib/postgresql/data networks: - goodfood-network - command: redis-server --appendonly yes environment: - REDIS_USERNAME: redis - REDIS_PASSWORD: password + POSTGRES_USER: postgres + POSTGRES_PASSWORD: password + POSTGRES_DB: postgres + PGDATA: /var/lib/postgresql/data/pgdata - delivery-postgres: + # Restaurant service + + restaurant-service: + image: goodfood-restaurant:1.0.0 + build: + context: . + dockerfile: ./restaurant/Dockerfile + env_file: + - restaurant/.env.docker + ports: + - "50005" + networks: + - goodfood-network + + restaurant-postgres: image: postgres:latest ports: - "5432" volumes: - - goodfood-delivery-volume:/var/lib/postgresql/data + - goodfood-restaurant-volume:/var/lib/postgresql/data networks: - goodfood-network environment: @@ -146,26 +161,26 @@ services: POSTGRES_DB: postgres PGDATA: /var/lib/postgresql/data/pgdata - # Order service + # Promotion service - order-service: - image: goodfood-order:1.0.0 + promotion-service: + image: goodfood-promotion:1.0.0 build: context: . - dockerfile: ./order/Dockerfile + dockerfile: ./promotions/Dockerfile env_file: - - order/.env.docker + - promotions/.env.docker ports: - - "50007" + - "50006" networks: - goodfood-network - order-postgres: + promotion-postgres: image: postgres:latest ports: - "5432" volumes: - - goodfood-order-volume:/var/lib/postgresql/data + - goodfood-promotion-volume:/var/lib/postgresql/data networks: - goodfood-network environment: @@ -174,26 +189,26 @@ services: POSTGRES_DB: postgres PGDATA: /var/lib/postgresql/data/pgdata - # Product service + # Order service - product-service: - image: goodfood-product:1.0.0 + order-service: + image: goodfood-order:1.0.0 build: context: . - dockerfile: ./product/Dockerfile + dockerfile: ./order/Dockerfile env_file: - - product/.env.docker + - order/.env.docker ports: - - "50004" + - "50007" networks: - goodfood-network - product-postgres: + order-postgres: image: postgres:latest ports: - "5432" volumes: - - goodfood-product-volume:/var/lib/postgresql/data + - goodfood-order-volume:/var/lib/postgresql/data networks: - goodfood-network environment: @@ -202,26 +217,39 @@ services: POSTGRES_DB: postgres PGDATA: /var/lib/postgresql/data/pgdata - # Promotion service + # Delivery service - promotion-service: - image: goodfood-promotion:1.0.0 + delivery-service: + image: goodfood-delivery:1.0.0 build: context: . - dockerfile: ./promotions/Dockerfile + dockerfile: ./delivery/Dockerfile env_file: - - promotions/.env.docker + - delivery/.env.docker ports: - - "50006" + - "50008" networks: - goodfood-network - promotion-postgres: + delivery-redis: + image: redis:latest + ports: + - "6379" + volumes: + - goodfood-delivery-volume:/data + networks: + - goodfood-network + command: redis-server --appendonly yes + environment: + REDIS_USERNAME: redis + REDIS_PASSWORD: password + + delivery-postgres: image: postgres:latest ports: - "5432" volumes: - - goodfood-promotion-volume:/var/lib/postgresql/data + - goodfood-delivery-volume:/var/lib/postgresql/data networks: - goodfood-network environment: @@ -260,6 +288,44 @@ services: # Log service + log-service: + depends_on: + - log-postgres + - log-rabbitmq + restart: + always + image: floriaaan/goodfood-log:latest + build: + context: . + dockerfile: ./log/Dockerfile + env_file: + - ./log/.env.docker + ports: + - "50021" + networks: + - goodfood-network + + log-rabbitmq: + restart: always + image: rabbitmq:3-management + ports: + - "5672" + - "15672" + networks: + - goodfood-network + + log-postgres: + image: postgres:15.2 + environment: + - POSTGRES_USER=postgres + - POSTGRES_PASSWORD=password + ports: + - "5432" + volumes: + - goodfood-log-volume:/var/lib/postgresql/data + networks: + # Log service + log-service: depends_on: - log-postgres @@ -302,10 +368,11 @@ volumes: goodfood-user-volume: goodfood-basket-volume: goodfood-payment-volume: - goodfood-delivery-volume: - goodfood-order-volume: goodfood-product-volume: + goodfood-restaurant-volume: goodfood-promotion-volume: + goodfood-order-volume: + goodfood-delivery-volume: goodfood-stock-volume: goodfood-log-volume: diff --git a/services/gateway/src/controller/restaurant/restaurant.controller.ts b/services/gateway/src/controller/restaurant/restaurant.controller.ts new file mode 100644 index 00000000..8501fe45 --- /dev/null +++ b/services/gateway/src/controller/restaurant/restaurant.controller.ts @@ -0,0 +1,90 @@ +import {Request, Response, Router} from "express"; +import {restaurantServiceClient} from "@gateway/services/clients/restaurant.client"; +import {RestaurantId} from "@gateway/proto/product_pb"; +import {Empty} from "google-protobuf/google/protobuf/empty_pb"; +import {ByLocationInput, Restaurant, RestaurantCreateInput} from "@gateway/proto/restaurant_pb"; + +export const restaurantRoutes = Router(); + +restaurantRoutes.get('/api/restaurant/:id', (req: Request, res: Response) => { + const {id} = req.params; + + restaurantServiceClient.getRestaurant(new RestaurantId().setId(id), (error, response) => { + if (error) { + res.status(500).send({error: error.message}); + } else { + res.json(response.toObject()); + } + }); +}); + +restaurantRoutes.get('/api/restaurant', (req: Request, res: Response) => { + restaurantServiceClient.getRestaurants(new Empty(), (error, response) => { + if (error) { + res.status(500).send({error: error.message}); + } else { + res.json(response.toObject()); + } + }); +}); + +restaurantRoutes.post('/api/restaurant/by-location', (req: Request, res: Response) => { + const {locationList} = req.body; + restaurantServiceClient.getRestaurantsByLocation(new ByLocationInput().setLocationList(locationList), (error, response) => { + if (error) { + res.status(500).send({error: error.message}); + } else { + res.json(response.toObject()); + } + }); +}); + +restaurantRoutes.post('/api/restaurant', (req: Request, res: Response) => { + const {name, description, locationList, address, openingHoursList, phone} = req.body; + const restaurantCreateInput = new RestaurantCreateInput().setName(name) + .setDescription(description) + .setLocationList(locationList) + .setAddress(address) + .setOpeninghoursList(openingHoursList) + .setPhone(phone); + + restaurantServiceClient.createRestaurant(restaurantCreateInput, (error, response) => { + if (error) { + res.status(500).send({error: error.message}); + } else { + res.json(response.toObject()); + } + }); +}); + +restaurantRoutes.put('/api/restaurant/:id', (req: Request, res: Response) => { + const {id} = req.params; + const {name, description, locationList, address, openingHoursList, phone} = req.body; + const restaurantCreateInput = new Restaurant().setId(id) + .setName(name) + .setDescription(description) + .setLocationList(locationList) + .setAddress(address) + .setOpeninghoursList(openingHoursList) + .setPhone(phone); + + restaurantServiceClient.updateRestaurant(restaurantCreateInput, (error, response) => { + if (error) { + res.status(500).send({error: error.message}); + } else { + res.json(response.toObject()); + } + }); +}); + +restaurantRoutes.delete('/api/restaurant/:id', (req: Request, res: Response) => { + const {id} = req.params; + + restaurantServiceClient.deleteRestaurant(new RestaurantId().setId(id), (error, response) => { + if (error) { + res.status(500).send({error: error.message}); + } else { + res.json(response.toObject()); + } + }); +}); \ No newline at end of file diff --git a/services/gateway/src/controller/user/user.controller.ts b/services/gateway/src/controller/user/user.controller.ts index ae9e4496..39bcf1f9 100644 --- a/services/gateway/src/controller/user/user.controller.ts +++ b/services/gateway/src/controller/user/user.controller.ts @@ -35,7 +35,7 @@ userRoutes.get('/api/user', (req: Request, res: Response) => { }); }); -userRoutes.post('/api/user', (req: Request, res: Response) => { +userRoutes.post('/api/user/register', (req: Request, res: Response) => { const {firstName, lastName, email, phone, country, zipCode, street, lat, lng, roleCode} = req.body; const userInput = new UserCreateInput(); try { @@ -192,5 +192,4 @@ userRoutes.put('/api/user/:id/role', (req: Request, res: Response) => { res.json(response.toObject()); } }); - }); \ No newline at end of file diff --git a/services/gateway/src/lib/swagger/swagger-output.json b/services/gateway/src/lib/swagger/swagger-output.json index cb06b981..850aecbe 100644 --- a/services/gateway/src/lib/swagger/swagger-output.json +++ b/services/gateway/src/lib/swagger/swagger-output.json @@ -139,7 +139,9 @@ "description": "Internal Server Error" } } - }, + } + }, + "/api/user/register": { "post": { "tags": [ "User" @@ -494,6 +496,93 @@ } } }, + "/api/payment/{id}": { + "get": { + "tags": [ + "Payment" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/payment/by-user/{userId}": { + "get": { + "tags": [ + "Payment" + ], + "description": "", + "parameters": [ + { + "name": "userId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/payment/stripe": { + "post": { + "tags": [ + "Payment" + ], + "description": "", + "parameters": [ + { + "name": "body", + "in": "body", + "schema": { + "type": "object", + "properties": { + "userId": { + "example": "any" + }, + "name": { + "example": "any" + }, + "email": { + "example": "any" + }, + "total": { + "example": "any" + } + } + } + } + ], + "responses": { + "200": { + "description": "OK" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, "/api/order/{id}": { "get": { "tags": [ diff --git a/services/gateway/src/server.ts b/services/gateway/src/server.ts index fce1c329..018bc60c 100644 --- a/services/gateway/src/server.ts +++ b/services/gateway/src/server.ts @@ -15,8 +15,9 @@ import {log, utils} from "@gateway/lib/log/log"; import {stripeRoutes} from "@gateway/controller/payment/stripe.controller"; import {paymentRoutes} from "@gateway/controller/payment/payment.controller"; -const express = require('express'); -const bodyParser = require('body-parser'); +import bodyParser from "body-parser"; + +import express from "express"; const app = express(); app.use(bodyParser.json()); diff --git a/services/gateway/src/services/clients/restaurant.client.ts b/services/gateway/src/services/clients/restaurant.client.ts new file mode 100644 index 00000000..2ae98036 --- /dev/null +++ b/services/gateway/src/services/clients/restaurant.client.ts @@ -0,0 +1,8 @@ +import services from '../../proto/restaurant_grpc_pb'; +import * as grpc from '@grpc/grpc-js'; + +const url = process.env.GATEWAY_RESTAURANT_URL || "localhost:50005"; + +export const restaurantServiceClient = new services.RestaurantServiceClient( + url, + grpc.credentials.createInsecure()); \ No newline at end of file diff --git a/services/restaurant/.env.docker b/services/restaurant/.env.docker new file mode 100644 index 00000000..ff13c41a --- /dev/null +++ b/services/restaurant/.env.docker @@ -0,0 +1,4 @@ +DATABASE_URL=postgresql://postgres:postgres@restaurant-postgres:5432/postgres +AMQP_URL=amqp://guest:guest@log-rabbitmq + +PORT=50005 \ No newline at end of file diff --git a/services/restaurant/.gitignore b/services/restaurant/.gitignore index bab9187d..7de297b6 100644 --- a/services/restaurant/.gitignore +++ b/services/restaurant/.gitignore @@ -2,4 +2,5 @@ node_modules/ dist/ bin/ *.env* -!*.env.example \ No newline at end of file +!*.env.example +!*.env.docker \ No newline at end of file diff --git a/services/user/.env.docker b/services/user/.env.docker deleted file mode 100644 index aa4be548..00000000 --- a/services/user/.env.docker +++ /dev/null @@ -1,6 +0,0 @@ -PORT=50001 -DB_URL=postgres://:@:/ -JWT_SECRET_KEY=example -DEFAULT_USER_EMAIL=example -DEFAULT_USER_PASSWORD=example -LOG_FILE_PATH=./logs/app.log diff --git a/services/user/.gitignore b/services/user/.gitignore index a640ce06..eac1434a 100644 --- a/services/user/.gitignore +++ b/services/user/.gitignore @@ -1,3 +1,4 @@ logs/* -*.env \ No newline at end of file +*.env +!dev.env \ No newline at end of file diff --git a/services/user/dev.env b/services/user/dev.env new file mode 100644 index 00000000..95b299d9 --- /dev/null +++ b/services/user/dev.env @@ -0,0 +1,6 @@ +PORT=50001 +DB_URL=postgres://postgres:password@user-postgres:5432/postgres +JWT_SECRET_KEY=example +DEFAULT_USER_EMAIL=example +DEFAULT_USER_PASSWORD=example +LOG_FILE_PATH=./logs/app.log \ No newline at end of file From a370db9911896c4bd532727b9ed52f5f803af06b Mon Sep 17 00:00:00 2001 From: anatole Date: Sun, 20 Aug 2023 16:24:57 +0200 Subject: [PATCH 436/883] feat(gateway): add restaurant service to the server.ts --- services/gateway/src/server.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/services/gateway/src/server.ts b/services/gateway/src/server.ts index 018bc60c..c1a58831 100644 --- a/services/gateway/src/server.ts +++ b/services/gateway/src/server.ts @@ -13,10 +13,10 @@ import {metricRoutes} from "@gateway/controller/metric/metric.controller"; import {basketRoutes} from "@gateway/controller/basket/basket.controller"; import {log, utils} from "@gateway/lib/log/log"; import {stripeRoutes} from "@gateway/controller/payment/stripe.controller"; +import {restaurantRoutes} from "@gateway/controller/restaurant/restaurant.controller"; import {paymentRoutes} from "@gateway/controller/payment/payment.controller"; import bodyParser from "body-parser"; - import express from "express"; const app = express(); @@ -48,6 +48,9 @@ app.use('/', allergenRoutes app.use('/', productRoutes // #swagger.tags = ['Product'] ); +app.use('/', restaurantRoutes +// #swagger.tags = ['Restaurant'] +); app.use('/', deliveryRoutes // #swagger.tags = ['Delivery'] ); From 4c39b9a751a6d410f118c122106bd4e7c2fbafac Mon Sep 17 00:00:00 2001 From: anatole Date: Sun, 20 Aug 2023 16:42:17 +0200 Subject: [PATCH 437/883] feat(gateway): update .env.example --- services/gateway/.env.example | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/gateway/.env.example b/services/gateway/.env.example index c90c7eda..ff1215ae 100644 --- a/services/gateway/.env.example +++ b/services/gateway/.env.example @@ -3,7 +3,7 @@ GATEWAY_USER_URL=user-service:50001 GATEWAY_BASKET_URL=basket-service:50002 GATEWAY_PAYMENT_URL=payment-service:50003 GATEWAY_PRODUCT_URL=product-service:50004 -GATEWAY_RESTAURANT_URL=50005 +GATEWAY_RESTAURANT_URL=restaurant-service:50005 GATEWAY_PROMOTION_URL=promotion-service:50006 GATEWAY_ORDER_URL=order-service:50007 GATEWAY_DELIVERY_URL=delivery-service:50008 From b23a32b6daadae87aa7cc93aab197b9326bed080 Mon Sep 17 00:00:00 2001 From: anatole Date: Sun, 20 Aug 2023 17:54:25 +0200 Subject: [PATCH 438/883] feat(user): fix delete user condition --- services/user/pkg/services/user.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/user/pkg/services/user.go b/services/user/pkg/services/user.go index 686d7fc0..a8266f30 100644 --- a/services/user/pkg/services/user.go +++ b/services/user/pkg/services/user.go @@ -124,7 +124,7 @@ func (s *Server) DeleteUser(_ context.Context, req *pb.DeleteInput) (*pb.DeleteU }, nil } - if user.Role.Code == "ADMIN" || user.Id == connectedUser.Id { + if connectedUser.Role.Code == "ADMIN" || user.Id == connectedUser.Id { s.H.DB.Delete(&user) s.H.DB.Delete(&mainAddress) From 64c082c2a5f7dc98b1b0e9f7dc629924f3027dac Mon Sep 17 00:00:00 2001 From: anatole Date: Sun, 20 Aug 2023 17:55:15 +0200 Subject: [PATCH 439/883] feat(gateway): fix register issue --- services/gateway/src/controller/user/user.controller.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/services/gateway/src/controller/user/user.controller.ts b/services/gateway/src/controller/user/user.controller.ts index 39bcf1f9..fc7e986b 100644 --- a/services/gateway/src/controller/user/user.controller.ts +++ b/services/gateway/src/controller/user/user.controller.ts @@ -36,13 +36,14 @@ userRoutes.get('/api/user', (req: Request, res: Response) => { }); userRoutes.post('/api/user/register', (req: Request, res: Response) => { - const {firstName, lastName, email, phone, country, zipCode, street, lat, lng, roleCode} = req.body; + const {firstName, lastName, email, password, phone, country, zipCode, street, lat, lng, roleCode} = req.body; const userInput = new UserCreateInput(); try { const address = new MainAddress().setCountry(country).setZipcode(zipCode).setStreet(street).setLat(lat).setLng(lng) userInput.setFirstName(firstName) .setLastName(lastName) .setEmail(email) + .setPassword(password) .setPhone(phone) .setMainaddress(address) .setRole(new RoleInput().setCode(roleCode)); From dea157f0e317f5e46b7969d3357bb4c72acaffd1 Mon Sep 17 00:00:00 2001 From: Florian LEROUX Date: Sun, 20 Aug 2023 15:53:45 +0200 Subject: [PATCH 440/883] fix(docker): add npm lockfiles to ensure docker compose build --- scripts/npm-install-all.sh | 24 + scripts/pnpm-install-all.sh | 24 + services/basket/package-lock.json | 165 - services/basket/pnpm-lock.yaml | 192 +- services/delivery/package-lock.json | 4071 +++++++++++++++++ services/gateway/.gitignore | 2 + services/gateway/package-lock.json | 1675 ++++--- services/gateway/package.json | 8 +- services/gateway/pnpm-lock.yaml | 2978 +++++++++++++ services/order/package-lock.json | 4254 ++++++++++++++++++ services/payment/package-lock.json | 4979 +++++++++++++++++++++ services/product/package-lock.json | 5753 +++++++++++++++++++++++++ services/promotions/package-lock.json | 1439 +++++++ services/restaurant/package-lock.json | 1445 +++++++ services/stock/package-lock.json | 4256 ++++++++++++++++++ 15 files changed, 30325 insertions(+), 940 deletions(-) create mode 100755 scripts/npm-install-all.sh create mode 100755 scripts/pnpm-install-all.sh create mode 100644 services/delivery/package-lock.json create mode 100644 services/gateway/pnpm-lock.yaml create mode 100644 services/order/package-lock.json create mode 100644 services/payment/package-lock.json create mode 100644 services/product/package-lock.json create mode 100644 services/promotions/package-lock.json create mode 100644 services/restaurant/package-lock.json create mode 100644 services/stock/package-lock.json diff --git a/scripts/npm-install-all.sh b/scripts/npm-install-all.sh new file mode 100755 index 00000000..139d3f6a --- /dev/null +++ b/scripts/npm-install-all.sh @@ -0,0 +1,24 @@ +#!/bin/bash + +# Loop through each directory in the services directory +for dir in ./services/*; do + + # Check if the directory has a node_modules directory + if [ -d "$dir/node_modules" ]; then + # Remove the node_modules directory + echo "Removing node_modules directory from $dir" + rm -rf "$dir/node_modules" + fi + + # Check if the directory has a package.json file + if [ -f "$dir/package.json" ]; then + # Change directory to the directory with the package.json file + cd "$dir" + echo "Installing dependencies for $dir" + # Run pnpm install + npm install + # Change directory back to the parent directory of the services directory + cd ../.. + + fi +done \ No newline at end of file diff --git a/scripts/pnpm-install-all.sh b/scripts/pnpm-install-all.sh new file mode 100755 index 00000000..82499251 --- /dev/null +++ b/scripts/pnpm-install-all.sh @@ -0,0 +1,24 @@ +#!/bin/bash + +# Loop through each directory in the services directory +for dir in ./services/*; do + + # Check if the directory has a node_modules directory + if [ -d "$dir/node_modules" ]; then + # Remove the node_modules directory + echo "Removing node_modules directory from $dir" + rm -rf "$dir/node_modules" + fi + + # Check if the directory has a package.json file + if [ -f "$dir/package.json" ]; then + # Change directory to the directory with the package.json file + cd "$dir" + echo "Installing dependencies for $dir" + # Run pnpm install + pnpm install + # Change directory back to the parent directory of the services directory + cd ../.. + + fi +done \ No newline at end of file diff --git a/services/basket/package-lock.json b/services/basket/package-lock.json index 92e624ce..a56a6e57 100644 --- a/services/basket/package-lock.json +++ b/services/basket/package-lock.json @@ -8,10 +8,8 @@ "dependencies": { "@grpc/grpc-js": "^1.8.13", "@grpc/proto-loader": "0.7.6", - "@prisma/client": "4.16.2", "amqplib": "^0.10.3", "dotenv": "^16.0.3", - "prisma-redis-middleware": "4.8.0", "protobufjs": "7.2.2", "redis": "^4.6.7" }, @@ -25,7 +23,6 @@ "esbuild": "^0.17.14", "nodemon": "^2.0.22", "pkg": "^5.8.1", - "prisma": "4.16.2", "ts-node": "10.9.1", "tsconfig-paths": "^4.1.2", "typescript": "5.0.2", @@ -508,11 +505,6 @@ "node": ">=6" } }, - "node_modules/@ioredis/commands": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@ioredis/commands/-/commands-1.2.0.tgz", - "integrity": "sha512-Sx1pU8EM64o2BrqNpEO1CNLtKQwyhuXuqyfH7oGKCk+1a33d2r5saW8zNwm3j6BTExtjrv2BxTgzzkMwts6vGg==" - }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", @@ -596,38 +588,6 @@ "node": ">= 8" } }, - "node_modules/@prisma/client": { - "version": "4.16.2", - "resolved": "https://registry.npmjs.org/@prisma/client/-/client-4.16.2.tgz", - "integrity": "sha512-qCoEyxv1ZrQ4bKy39GnylE8Zq31IRmm8bNhNbZx7bF2cU5aiCCnSa93J2imF88MBjn7J9eUQneNxUQVJdl/rPQ==", - "hasInstallScript": true, - "dependencies": { - "@prisma/engines-version": "4.16.1-1.4bc8b6e1b66cb932731fb1bdbbc550d1e010de81" - }, - "engines": { - "node": ">=14.17" - }, - "peerDependencies": { - "prisma": "*" - }, - "peerDependenciesMeta": { - "prisma": { - "optional": true - } - } - }, - "node_modules/@prisma/engines": { - "version": "4.16.2", - "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-4.16.2.tgz", - "integrity": "sha512-vx1nxVvN4QeT/cepQce68deh/Turxy5Mr+4L4zClFuK1GlxN3+ivxfuv+ej/gvidWn1cE1uAhW7ALLNlYbRUAw==", - "devOptional": true, - "hasInstallScript": true - }, - "node_modules/@prisma/engines-version": { - "version": "4.16.1-1.4bc8b6e1b66cb932731fb1bdbbc550d1e010de81", - "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-4.16.1-1.4bc8b6e1b66cb932731fb1bdbbc550d1e010de81.tgz", - "integrity": "sha512-q617EUWfRIDTriWADZ4YiWRZXCa/WuhNgLTVd+HqWLffjMSPzyM5uOWoauX91wvQClSKZU4pzI4JJLQ9Kl62Qg==" - }, "node_modules/@protobufjs/aspromise": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", @@ -967,15 +927,6 @@ "node": "*" } }, - "node_modules/async-cache-dedupe": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/async-cache-dedupe/-/async-cache-dedupe-1.12.0.tgz", - "integrity": "sha512-LKumaBNhzvZrbrRi3DtIf0ETgjqcGOa/M2U+0DpTp8f+RzIiWubiQmBjuYUaihxetR3cWWC6hQj/uDVBuYajRA==", - "dependencies": { - "mnemonist": "^0.39.2", - "safe-stable-stringify": "^2.3.1" - } - }, "node_modules/at-least-node": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", @@ -1387,14 +1338,6 @@ "node": ">=4.0.0" } }, - "node_modules/denque": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz", - "integrity": "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==", - "engines": { - "node": ">=0.10" - } - }, "node_modules/detect-libc": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.2.tgz", @@ -1800,29 +1743,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/ioredis": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/ioredis/-/ioredis-5.3.2.tgz", - "integrity": "sha512-1DKMMzlIHM02eBBVOFQ1+AolGjs6+xEcM4PDL7NqOS6szq7H9jSaEkIUH6/a5Hl241LzW6JLSiAbNvTQjUupUA==", - "dependencies": { - "@ioredis/commands": "^1.1.1", - "cluster-key-slot": "^1.1.0", - "debug": "^4.3.4", - "denque": "^2.1.0", - "lodash.defaults": "^4.2.0", - "lodash.isarguments": "^3.1.0", - "redis-errors": "^1.2.0", - "redis-parser": "^3.0.0", - "standard-as-callback": "^2.1.0" - }, - "engines": { - "node": ">=12.22.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/ioredis" - } - }, "node_modules/is-binary-path": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", @@ -1953,16 +1873,6 @@ "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==" }, - "node_modules/lodash.defaults": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", - "integrity": "sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==" - }, - "node_modules/lodash.isarguments": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", - "integrity": "sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==" - }, "node_modules/long": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", @@ -2068,14 +1978,6 @@ "ufo": "^1.1.2" } }, - "node_modules/mnemonist": { - "version": "0.39.5", - "resolved": "https://registry.npmjs.org/mnemonist/-/mnemonist-0.39.5.tgz", - "integrity": "sha512-FPUtkhtJ0efmEFGpU14x7jGbTB+s18LrzRL2KgoWz9YvcY3cPomz8tih01GbHwnGk/OmkOKfqd/RAQoc8Lm7DQ==", - "dependencies": { - "obliterator": "^2.0.1" - } - }, "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -2280,11 +2182,6 @@ "node": ">=0.10.0" } }, - "node_modules/obliterator": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/obliterator/-/obliterator-2.0.4.tgz", - "integrity": "sha512-lgHwxlxV1qIg1Eap7LgIeoBWIMFibOjbrYPIPJZcI1mmGAI2m3lNYpK12Y+GBdPQ0U1hRwSord7GIaawz962qQ==" - }, "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -2524,36 +2421,6 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/prisma": { - "version": "4.16.2", - "resolved": "https://registry.npmjs.org/prisma/-/prisma-4.16.2.tgz", - "integrity": "sha512-SYCsBvDf0/7XSJyf2cHTLjLeTLVXYfqp7pG5eEVafFLeT0u/hLFz/9W196nDRGUOo1JfPatAEb+uEnTQImQC1g==", - "devOptional": true, - "hasInstallScript": true, - "dependencies": { - "@prisma/engines": "4.16.2" - }, - "bin": { - "prisma": "build/index.js", - "prisma2": "build/index.js" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/prisma-redis-middleware": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/prisma-redis-middleware/-/prisma-redis-middleware-4.8.0.tgz", - "integrity": "sha512-d1B7TVLiR8aSiOY2GPKKDb5EWGTK+EmlIkztAZCPWxs4/IHGfIAZiDoLklp6CcK+5ckjcaJq8aWE5AjRJ3+Rpg==", - "dependencies": { - "async-cache-dedupe": "1.12.0", - "ioredis": "5.3.2" - }, - "engines": { - "node": "^16.x || ^18.x", - "npm": "^7.x || ^8.x || ^9.x" - } - }, "node_modules/process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", @@ -2695,25 +2562,6 @@ "@redis/time-series": "1.0.4" } }, - "node_modules/redis-errors": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/redis-errors/-/redis-errors-1.2.0.tgz", - "integrity": "sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w==", - "engines": { - "node": ">=4" - } - }, - "node_modules/redis-parser": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/redis-parser/-/redis-parser-3.0.0.tgz", - "integrity": "sha512-DJnGAeenTdpMEH6uAJRK/uiyEIH9WVsUmoLwzudwGJUwZPp80PDBWPHXSAGNPwNvIXAbe7MSUB1zQFugFml66A==", - "dependencies": { - "redis-errors": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -2810,14 +2658,6 @@ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, - "node_modules/safe-stable-stringify": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz", - "integrity": "sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==", - "engines": { - "node": ">=10" - } - }, "node_modules/semver": { "version": "5.7.2", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", @@ -2960,11 +2800,6 @@ "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", "dev": true }, - "node_modules/standard-as-callback": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/standard-as-callback/-/standard-as-callback-2.1.0.tgz", - "integrity": "sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A==" - }, "node_modules/std-env": { "version": "3.3.3", "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.3.3.tgz", diff --git a/services/basket/pnpm-lock.yaml b/services/basket/pnpm-lock.yaml index 3afeb09a..b64a0d94 100644 --- a/services/basket/pnpm-lock.yaml +++ b/services/basket/pnpm-lock.yaml @@ -11,24 +11,18 @@ dependencies: '@grpc/proto-loader': specifier: 0.7.6 version: 0.7.6 - '@prisma/client': - specifier: 4.16.2 - version: 4.16.2(prisma@4.16.2) amqplib: specifier: ^0.10.3 version: 0.10.3 dotenv: specifier: ^16.0.3 version: 16.0.3 - ioredis: - specifier: 5.3.2 - version: 5.3.2 - prisma-redis-middleware: - specifier: 4.8.0 - version: 4.8.0 protobufjs: specifier: 7.2.2 version: 7.2.2 + redis: + specifier: ^4.6.7 + version: 4.6.7 devDependencies: '@types/amqplib': @@ -37,6 +31,9 @@ devDependencies: '@types/node': specifier: 18.15.9 version: 18.15.9 + '@types/redis': + specifier: ^4.0.11 + version: 4.0.11 esbuild: specifier: ^0.17.14 version: 0.17.14 @@ -46,9 +43,6 @@ devDependencies: pkg: specifier: ^5.8.1 version: 5.8.1 - prisma: - specifier: 4.16.2 - version: 4.16.2 ts-node: specifier: 10.9.1 version: 10.9.1(@types/node@18.15.9)(typescript@5.0.2) @@ -339,10 +333,6 @@ packages: yargs: 16.2.0 dev: false - /@ioredis/commands@1.2.0: - resolution: {integrity: sha512-Sx1pU8EM64o2BrqNpEO1CNLtKQwyhuXuqyfH7oGKCk+1a33d2r5saW8zNwm3j6BTExtjrv2BxTgzzkMwts6vGg==} - dev: false - /@jridgewell/gen-mapping@0.3.2: resolution: {integrity: sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==} engines: {node: '>=6.0.0'} @@ -394,28 +384,6 @@ packages: fastq: 1.15.0 dev: true - /@prisma/client@4.16.2(prisma@4.16.2): - resolution: {integrity: sha512-qCoEyxv1ZrQ4bKy39GnylE8Zq31IRmm8bNhNbZx7bF2cU5aiCCnSa93J2imF88MBjn7J9eUQneNxUQVJdl/rPQ==} - engines: {node: '>=14.17'} - requiresBuild: true - peerDependencies: - prisma: '*' - peerDependenciesMeta: - prisma: - optional: true - dependencies: - '@prisma/engines-version': 4.16.1-1.4bc8b6e1b66cb932731fb1bdbbc550d1e010de81 - prisma: 4.16.2 - dev: false - - /@prisma/engines-version@4.16.1-1.4bc8b6e1b66cb932731fb1bdbbc550d1e010de81: - resolution: {integrity: sha512-q617EUWfRIDTriWADZ4YiWRZXCa/WuhNgLTVd+HqWLffjMSPzyM5uOWoauX91wvQClSKZU4pzI4JJLQ9Kl62Qg==} - dev: false - - /@prisma/engines@4.16.2: - resolution: {integrity: sha512-vx1nxVvN4QeT/cepQce68deh/Turxy5Mr+4L4zClFuK1GlxN3+ivxfuv+ej/gvidWn1cE1uAhW7ALLNlYbRUAw==} - requiresBuild: true - /@protobufjs/aspromise@1.1.2: resolution: {integrity: sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==} dev: false @@ -459,6 +427,49 @@ packages: resolution: {integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==} dev: false + /@redis/bloom@1.2.0(@redis/client@1.5.8): + resolution: {integrity: sha512-HG2DFjYKbpNmVXsa0keLHp/3leGJz1mjh09f2RLGGLQZzSHpkmZWuwJbAvo3QcRY8p80m5+ZdXZdYOSBLlp7Cg==} + peerDependencies: + '@redis/client': ^1.0.0 + dependencies: + '@redis/client': 1.5.8 + + /@redis/client@1.5.8: + resolution: {integrity: sha512-xzElwHIO6rBAqzPeVnCzgvrnBEcFL1P0w8P65VNLRkdVW8rOE58f52hdj0BDgmsdOm4f1EoXPZtH4Fh7M/qUpw==} + engines: {node: '>=14'} + dependencies: + cluster-key-slot: 1.1.2 + generic-pool: 3.9.0 + yallist: 4.0.0 + + /@redis/graph@1.1.0(@redis/client@1.5.8): + resolution: {integrity: sha512-16yZWngxyXPd+MJxeSr0dqh2AIOi8j9yXKcKCwVaKDbH3HTuETpDVPcLujhFYVPtYrngSco31BUcSa9TH31Gqg==} + peerDependencies: + '@redis/client': ^1.0.0 + dependencies: + '@redis/client': 1.5.8 + + /@redis/json@1.0.4(@redis/client@1.5.8): + resolution: {integrity: sha512-LUZE2Gdrhg0Rx7AN+cZkb1e6HjoSKaeeW8rYnt89Tly13GBI5eP4CwDVr+MY8BAYfCg4/N15OUrtLoona9uSgw==} + peerDependencies: + '@redis/client': ^1.0.0 + dependencies: + '@redis/client': 1.5.8 + + /@redis/search@1.1.3(@redis/client@1.5.8): + resolution: {integrity: sha512-4Dg1JjvCevdiCBTZqjhKkGoC5/BcB7k9j99kdMnaXFXg8x4eyOIVg9487CMv7/BUVkFLZCaIh8ead9mU15DNng==} + peerDependencies: + '@redis/client': ^1.0.0 + dependencies: + '@redis/client': 1.5.8 + + /@redis/time-series@1.0.4(@redis/client@1.5.8): + resolution: {integrity: sha512-ThUIgo2U/g7cCuZavucQTQzA9g9JbDDY2f64u3AbAoz/8vE2lt2U37LamDUVChhaDA3IRT9R6VvJwqnUfTJzng==} + peerDependencies: + '@redis/client': ^1.0.0 + dependencies: + '@redis/client': 1.5.8 + /@tsconfig/node10@1.0.9: resolution: {integrity: sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==} dev: true @@ -498,6 +509,13 @@ packages: /@types/node@18.15.9: resolution: {integrity: sha512-dUxhiNzBLr6IqlZXz6e/rN2YQXlFgOei/Dxy+e3cyXTJ4txSUbGT2/fmnD6zd/75jDMeW5bDee+YXxlFKHoV0A==} + /@types/redis@4.0.11: + resolution: {integrity: sha512-bI+gth8La8Wg/QCR1+V1fhrL9+LZUSWfcqpOj2Kc80ZQ4ffbdL173vQd5wovmoV9i071FU9oP2g6etLuEwb6Rg==} + deprecated: This is a stub types definition. redis provides its own type definitions, so you do not need this installed. + dependencies: + redis: 4.6.7 + dev: true + /@vitest/expect@0.29.8: resolution: {integrity: sha512-xlcVXn5I5oTq6NiZSY3ykyWixBxr5mG8HYtjvpgg6KaqHm0mvhX18xuwl5YGxIRNt/A5jidd7CWcNHrSvgaQqQ==} dependencies: @@ -611,13 +629,6 @@ packages: resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} dev: true - /async-cache-dedupe@1.12.0: - resolution: {integrity: sha512-LKumaBNhzvZrbrRi3DtIf0ETgjqcGOa/M2U+0DpTp8f+RzIiWubiQmBjuYUaihxetR3cWWC6hQj/uDVBuYajRA==} - dependencies: - mnemonist: 0.39.5 - safe-stable-stringify: 2.4.3 - dev: false - /at-least-node@1.0.0: resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} engines: {node: '>= 4.0.0'} @@ -736,7 +747,6 @@ packages: /cluster-key-slot@1.1.2: resolution: {integrity: sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==} engines: {node: '>=0.10.0'} - dev: false /color-convert@2.0.1: resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} @@ -800,11 +810,6 @@ packages: engines: {node: '>=4.0.0'} dev: true - /denque@2.1.0: - resolution: {integrity: sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==} - engines: {node: '>=0.10'} - dev: false - /detect-libc@2.0.1: resolution: {integrity: sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==} engines: {node: '>=8'} @@ -945,6 +950,10 @@ packages: resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} dev: true + /generic-pool@3.9.0: + resolution: {integrity: sha512-hymDOu5B53XvN4QT9dBmZxPX4CWhBPPLguTZ9MMFeFa/Kg0xWVfylOVNlJji/E7yTZWFd/q9GO5TxDLq156D7g==} + engines: {node: '>= 4'} + /get-caller-file@2.0.5: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} @@ -1039,23 +1048,6 @@ packages: p-is-promise: 3.0.0 dev: true - /ioredis@5.3.2: - resolution: {integrity: sha512-1DKMMzlIHM02eBBVOFQ1+AolGjs6+xEcM4PDL7NqOS6szq7H9jSaEkIUH6/a5Hl241LzW6JLSiAbNvTQjUupUA==} - engines: {node: '>=12.22.0'} - dependencies: - '@ioredis/commands': 1.2.0 - cluster-key-slot: 1.1.2 - debug: 4.3.4 - denque: 2.1.0 - lodash.defaults: 4.2.0 - lodash.isarguments: 3.1.0 - redis-errors: 1.2.0 - redis-parser: 3.0.0 - standard-as-callback: 2.1.0 - transitivePeerDependencies: - - supports-color - dev: false - /is-binary-path@2.1.0: resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} engines: {node: '>=8'} @@ -1136,14 +1128,6 @@ packages: resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} dev: false - /lodash.defaults@4.2.0: - resolution: {integrity: sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==} - dev: false - - /lodash.isarguments@3.1.0: - resolution: {integrity: sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==} - dev: false - /long@4.0.0: resolution: {integrity: sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==} dev: false @@ -1210,12 +1194,6 @@ packages: ufo: 1.1.1 dev: true - /mnemonist@0.39.5: - resolution: {integrity: sha512-FPUtkhtJ0efmEFGpU14x7jGbTB+s18LrzRL2KgoWz9YvcY3cPomz8tih01GbHwnGk/OmkOKfqd/RAQoc8Lm7DQ==} - dependencies: - obliterator: 2.0.4 - dev: false - /ms@2.1.2: resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} @@ -1288,10 +1266,6 @@ packages: engines: {node: '>=0.10.0'} dev: true - /obliterator@2.0.4: - resolution: {integrity: sha512-lgHwxlxV1qIg1Eap7LgIeoBWIMFibOjbrYPIPJZcI1mmGAI2m3lNYpK12Y+GBdPQ0U1hRwSord7GIaawz962qQ==} - dev: false - /once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} dependencies: @@ -1426,24 +1400,6 @@ packages: react-is: 17.0.2 dev: true - /prisma-redis-middleware@4.8.0: - resolution: {integrity: sha512-d1B7TVLiR8aSiOY2GPKKDb5EWGTK+EmlIkztAZCPWxs4/IHGfIAZiDoLklp6CcK+5ckjcaJq8aWE5AjRJ3+Rpg==} - engines: {node: ^16.x || ^18.x, npm: ^7.x || ^8.x || ^9.x} - dependencies: - async-cache-dedupe: 1.12.0 - ioredis: 5.3.2 - transitivePeerDependencies: - - supports-color - dev: false - - /prisma@4.16.2: - resolution: {integrity: sha512-SYCsBvDf0/7XSJyf2cHTLjLeTLVXYfqp7pG5eEVafFLeT0u/hLFz/9W196nDRGUOo1JfPatAEb+uEnTQImQC1g==} - engines: {node: '>=14.17'} - hasBin: true - requiresBuild: true - dependencies: - '@prisma/engines': 4.16.2 - /process-nextick-args@2.0.1: resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} dev: true @@ -1542,17 +1498,15 @@ packages: picomatch: 2.3.1 dev: true - /redis-errors@1.2.0: - resolution: {integrity: sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w==} - engines: {node: '>=4'} - dev: false - - /redis-parser@3.0.0: - resolution: {integrity: sha512-DJnGAeenTdpMEH6uAJRK/uiyEIH9WVsUmoLwzudwGJUwZPp80PDBWPHXSAGNPwNvIXAbe7MSUB1zQFugFml66A==} - engines: {node: '>=4'} + /redis@4.6.7: + resolution: {integrity: sha512-KrkuNJNpCwRm5vFJh0tteMxW8SaUzkm5fBH7eL5hd/D0fAkzvapxbfGPP/r+4JAXdQuX7nebsBkBqA2RHB7Usw==} dependencies: - redis-errors: 1.2.0 - dev: false + '@redis/bloom': 1.2.0(@redis/client@1.5.8) + '@redis/client': 1.5.8 + '@redis/graph': 1.1.0(@redis/client@1.5.8) + '@redis/json': 1.0.4(@redis/client@1.5.8) + '@redis/search': 1.1.3(@redis/client@1.5.8) + '@redis/time-series': 1.0.4(@redis/client@1.5.8) /require-directory@2.1.1: resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} @@ -1597,11 +1551,6 @@ packages: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} dev: true - /safe-stable-stringify@2.4.3: - resolution: {integrity: sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==} - engines: {node: '>=10'} - dev: false - /semver@5.7.1: resolution: {integrity: sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==} hasBin: true @@ -1670,10 +1619,6 @@ packages: resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} dev: true - /standard-as-callback@2.1.0: - resolution: {integrity: sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A==} - dev: false - /std-env@3.3.2: resolution: {integrity: sha512-uUZI65yrV2Qva5gqE0+A7uVAvO40iPo6jGhs7s8keRfHCmtg+uB2X6EiLGCI9IgL1J17xGhvoOqSz79lzICPTA==} dev: true @@ -2093,7 +2038,6 @@ packages: /yallist@4.0.0: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} - dev: true /yargs-parser@20.2.9: resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} diff --git a/services/delivery/package-lock.json b/services/delivery/package-lock.json new file mode 100644 index 00000000..7ea7054c --- /dev/null +++ b/services/delivery/package-lock.json @@ -0,0 +1,4071 @@ +{ + "name": "@goodfood/delivery", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "@goodfood/delivery", + "hasInstallScript": true, + "dependencies": { + "@grpc/grpc-js": "^1.8.13", + "@grpc/proto-loader": "0.7.6", + "@prisma/client": "4.16.2", + "amqplib": "^0.10.3", + "dotenv": "^16.0.3", + "ioredis": "5.3.2", + "prisma-redis-middleware": "4.8.0", + "protobufjs": "7.2.2" + }, + "bin": { + "delivery": "dist/index.js" + }, + "devDependencies": { + "@types/amqplib": "^0.10.1", + "@types/node": "18.15.9", + "esbuild": "^0.17.14", + "nodemon": "^2.0.22", + "pkg": "^5.8.1", + "prisma": "4.16.2", + "ts-node": "10.9.1", + "tsconfig-paths": "^4.1.2", + "typescript": "5.0.2", + "vite-tsconfig-paths": "^4.0.7", + "vitest": "^0.29.8" + } + }, + "node_modules/@acuminous/bitsyntax": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@acuminous/bitsyntax/-/bitsyntax-0.1.2.tgz", + "integrity": "sha512-29lUK80d1muEQqiUsSo+3A0yP6CdspgC95EnKBMi22Xlwt79i/En4Vr67+cXhU+cZjbti3TgGGC5wy1stIywVQ==", + "dependencies": { + "buffer-more-ints": "~1.0.0", + "debug": "^4.3.4", + "safe-buffer": "~5.1.2" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/@babel/generator": { + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.2.tgz", + "integrity": "sha512-W1lG5vUwFvfMd8HVXqdfbuG7RuaSrTCCD8cl8fP8wOivdbtbIg2Db3IWUcgvfxKbbn6ZBGYRW/Zk1MIwK49mgw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.18.2", + "@jridgewell/gen-mapping": "^0.3.0", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", + "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz", + "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.18.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.4.tgz", + "integrity": "sha512-FDge0dFazETFcxGw/EXzOkN8uJp0PC7Qbm+Pe9T+av2zlBpOgunFHkQPPn+eRuClU73JF+98D531UgayY89tow==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/types": { + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.19.0.tgz", + "integrity": "sha512-YuGopBq3ke25BVSiS6fgF49Ul9gH1x70Bcr6bqRLjWCkcX8Hre1/5+z+IiWOIerRMSSEfGZVB9z9kyq7wVs9YA==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.18.10", + "@babel/helper-validator-identifier": "^7.18.6", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.19.tgz", + "integrity": "sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.19.tgz", + "integrity": "sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.19.tgz", + "integrity": "sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.19.tgz", + "integrity": "sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.19.tgz", + "integrity": "sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.19.tgz", + "integrity": "sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.19.tgz", + "integrity": "sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.19.tgz", + "integrity": "sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.19.tgz", + "integrity": "sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.19.tgz", + "integrity": "sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.19.tgz", + "integrity": "sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.19.tgz", + "integrity": "sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.19.tgz", + "integrity": "sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.19.tgz", + "integrity": "sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.19.tgz", + "integrity": "sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.19.tgz", + "integrity": "sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.19.tgz", + "integrity": "sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.19.tgz", + "integrity": "sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.19.tgz", + "integrity": "sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.19.tgz", + "integrity": "sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.19.tgz", + "integrity": "sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.19.tgz", + "integrity": "sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@grpc/grpc-js": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.9.0.tgz", + "integrity": "sha512-H8+iZh+kCE6VR/Krj6W28Y/ZlxoZ1fOzsNt77nrdE3knkbSelW1Uus192xOFCxHyeszLj8i4APQkSIXjAoOxXg==", + "dependencies": { + "@grpc/proto-loader": "^0.7.0", + "@types/node": ">=12.12.47" + }, + "engines": { + "node": "^8.13.0 || >=10.10.0" + } + }, + "node_modules/@grpc/proto-loader": { + "version": "0.7.6", + "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.6.tgz", + "integrity": "sha512-QyAXR8Hyh7uMDmveWxDSUcJr9NAWaZ2I6IXgAYvQmfflwouTM+rArE2eEaCtLlRqO81j7pRLCt81IefUei6Zbw==", + "dependencies": { + "@types/long": "^4.0.1", + "lodash.camelcase": "^4.3.0", + "long": "^4.0.0", + "protobufjs": "^7.0.0", + "yargs": "^16.2.0" + }, + "bin": { + "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@ioredis/commands": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ioredis/commands/-/commands-1.2.0.tgz", + "integrity": "sha512-Sx1pU8EM64o2BrqNpEO1CNLtKQwyhuXuqyfH7oGKCk+1a33d2r5saW8zNwm3j6BTExtjrv2BxTgzzkMwts6vGg==" + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.19", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz", + "integrity": "sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@prisma/client": { + "version": "4.16.2", + "resolved": "https://registry.npmjs.org/@prisma/client/-/client-4.16.2.tgz", + "integrity": "sha512-qCoEyxv1ZrQ4bKy39GnylE8Zq31IRmm8bNhNbZx7bF2cU5aiCCnSa93J2imF88MBjn7J9eUQneNxUQVJdl/rPQ==", + "hasInstallScript": true, + "dependencies": { + "@prisma/engines-version": "4.16.1-1.4bc8b6e1b66cb932731fb1bdbbc550d1e010de81" + }, + "engines": { + "node": ">=14.17" + }, + "peerDependencies": { + "prisma": "*" + }, + "peerDependenciesMeta": { + "prisma": { + "optional": true + } + } + }, + "node_modules/@prisma/engines": { + "version": "4.16.2", + "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-4.16.2.tgz", + "integrity": "sha512-vx1nxVvN4QeT/cepQce68deh/Turxy5Mr+4L4zClFuK1GlxN3+ivxfuv+ej/gvidWn1cE1uAhW7ALLNlYbRUAw==", + "devOptional": true, + "hasInstallScript": true + }, + "node_modules/@prisma/engines-version": { + "version": "4.16.1-1.4bc8b6e1b66cb932731fb1bdbbc550d1e010de81", + "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-4.16.1-1.4bc8b6e1b66cb932731fb1bdbbc550d1e010de81.tgz", + "integrity": "sha512-q617EUWfRIDTriWADZ4YiWRZXCa/WuhNgLTVd+HqWLffjMSPzyM5uOWoauX91wvQClSKZU4pzI4JJLQ9Kl62Qg==" + }, + "node_modules/@protobufjs/aspromise": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==" + }, + "node_modules/@protobufjs/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" + }, + "node_modules/@protobufjs/codegen": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", + "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" + }, + "node_modules/@protobufjs/eventemitter": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", + "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==" + }, + "node_modules/@protobufjs/fetch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", + "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", + "dependencies": { + "@protobufjs/aspromise": "^1.1.1", + "@protobufjs/inquire": "^1.1.0" + } + }, + "node_modules/@protobufjs/float": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", + "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==" + }, + "node_modules/@protobufjs/inquire": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", + "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==" + }, + "node_modules/@protobufjs/path": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==" + }, + "node_modules/@protobufjs/pool": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==" + }, + "node_modules/@protobufjs/utf8": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", + "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==" + }, + "node_modules/@tsconfig/node10": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", + "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", + "dev": true + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", + "dev": true + }, + "node_modules/@types/amqplib": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/@types/amqplib/-/amqplib-0.10.1.tgz", + "integrity": "sha512-j6ANKT79ncUDnAs/+9r9eDujxbeJoTjoVu33gHHcaPfmLQaMhvfbH2GqSe8KUM444epAp1Vl3peVOQfZk3UIqA==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/chai": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.5.tgz", + "integrity": "sha512-mEo1sAde+UCE6b2hxn332f1g1E8WfYRu6p5SvTKr2ZKC1f7gFJXk4h5PyGP9Dt6gCaG8y8XhwnXWC6Iy2cmBng==", + "dev": true + }, + "node_modules/@types/chai-subset": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@types/chai-subset/-/chai-subset-1.3.3.tgz", + "integrity": "sha512-frBecisrNGz+F4T6bcc+NLeolfiojh5FxW2klu669+8BARtyQv2C/GkNW6FUodVe4BroGMP/wER/YDGc7rEllw==", + "dev": true, + "dependencies": { + "@types/chai": "*" + } + }, + "node_modules/@types/long": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz", + "integrity": "sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==" + }, + "node_modules/@types/node": { + "version": "18.15.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.9.tgz", + "integrity": "sha512-dUxhiNzBLr6IqlZXz6e/rN2YQXlFgOei/Dxy+e3cyXTJ4txSUbGT2/fmnD6zd/75jDMeW5bDee+YXxlFKHoV0A==" + }, + "node_modules/@vitest/expect": { + "version": "0.29.8", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-0.29.8.tgz", + "integrity": "sha512-xlcVXn5I5oTq6NiZSY3ykyWixBxr5mG8HYtjvpgg6KaqHm0mvhX18xuwl5YGxIRNt/A5jidd7CWcNHrSvgaQqQ==", + "dev": true, + "dependencies": { + "@vitest/spy": "0.29.8", + "@vitest/utils": "0.29.8", + "chai": "^4.3.7" + } + }, + "node_modules/@vitest/runner": { + "version": "0.29.8", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-0.29.8.tgz", + "integrity": "sha512-FzdhnRDwEr/A3Oo1jtIk/B952BBvP32n1ObMEb23oEJNO+qO5cBet6M2XWIDQmA7BDKGKvmhUf2naXyp/2JEwQ==", + "dev": true, + "dependencies": { + "@vitest/utils": "0.29.8", + "p-limit": "^4.0.0", + "pathe": "^1.1.0" + } + }, + "node_modules/@vitest/spy": { + "version": "0.29.8", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-0.29.8.tgz", + "integrity": "sha512-VdjBe9w34vOMl5I5mYEzNX8inTxrZ+tYUVk9jxaZJmHFwmDFC/GV3KBFTA/JKswr3XHvZL+FE/yq5EVhb6pSAw==", + "dev": true, + "dependencies": { + "tinyspy": "^1.0.2" + } + }, + "node_modules/@vitest/utils": { + "version": "0.29.8", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-0.29.8.tgz", + "integrity": "sha512-qGzuf3vrTbnoY+RjjVVIBYfuWMjn3UMUqyQtdGNZ6ZIIyte7B37exj6LaVkrZiUTvzSadVvO/tJm8AEgbGCBPg==", + "dev": true, + "dependencies": { + "cli-truncate": "^3.1.0", + "diff": "^5.1.0", + "loupe": "^2.3.6", + "pretty-format": "^27.5.1" + } + }, + "node_modules/@vitest/utils/node_modules/diff": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.1.0.tgz", + "integrity": "sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true + }, + "node_modules/acorn": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/amqplib": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/amqplib/-/amqplib-0.10.3.tgz", + "integrity": "sha512-UHmuSa7n8vVW/a5HGh2nFPqAEr8+cD4dEZ6u9GjP91nHfr1a54RyAKyra7Sb5NH7NBKOUlyQSMXIp0qAixKexw==", + "dependencies": { + "@acuminous/bitsyntax": "^0.1.2", + "buffer-more-ints": "~1.0.0", + "readable-stream": "1.x >=1.1.9", + "url-parse": "~1.5.10" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/async-cache-dedupe": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/async-cache-dedupe/-/async-cache-dedupe-1.12.0.tgz", + "integrity": "sha512-LKumaBNhzvZrbrRi3DtIf0ETgjqcGOa/M2U+0DpTp8f+RzIiWubiQmBjuYUaihxetR3cWWC6hQj/uDVBuYajRA==", + "dependencies": { + "mnemonist": "^0.39.2", + "safe-stable-stringify": "^2.3.1" + } + }, + "node_modules/at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dev": true, + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/bl/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/bl/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/bl/node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/buffer-more-ints": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-more-ints/-/buffer-more-ints-1.0.0.tgz", + "integrity": "sha512-EMetuGFz5SLsT0QTnXzINh4Ksr+oo4i+UGTXEshiGCQWnsgSs7ZhJ8fzlwQ+OzEMs0MpDAMr1hxnblp5a4vcHg==" + }, + "node_modules/cac": { + "version": "6.7.14", + "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", + "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/chai": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.7.tgz", + "integrity": "sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==", + "dev": true, + "dependencies": { + "assertion-error": "^1.1.0", + "check-error": "^1.0.2", + "deep-eql": "^4.1.2", + "get-func-name": "^2.0.0", + "loupe": "^2.3.1", + "pathval": "^1.1.1", + "type-detect": "^4.0.5" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chalk/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/chalk/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/check-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", + "integrity": "sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "dev": true + }, + "node_modules/cli-truncate": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-3.1.0.tgz", + "integrity": "sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==", + "dev": true, + "dependencies": { + "slice-ansi": "^5.0.0", + "string-width": "^5.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/cliui/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/cliui/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cluster-key-slot": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/cluster-key-slot/-/cluster-key-slot-1.1.2.tgz", + "integrity": "sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "dev": true, + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/deep-eql": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz", + "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==", + "dev": true, + "dependencies": { + "type-detect": "^4.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "dev": true, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/denque": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz", + "integrity": "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/detect-libc": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.2.tgz", + "integrity": "sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dotenv": { + "version": "16.3.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.3.1.tgz", + "integrity": "sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/motdotla/dotenv?sponsor=1" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/esbuild": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.19.tgz", + "integrity": "sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.17.19", + "@esbuild/android-arm64": "0.17.19", + "@esbuild/android-x64": "0.17.19", + "@esbuild/darwin-arm64": "0.17.19", + "@esbuild/darwin-x64": "0.17.19", + "@esbuild/freebsd-arm64": "0.17.19", + "@esbuild/freebsd-x64": "0.17.19", + "@esbuild/linux-arm": "0.17.19", + "@esbuild/linux-arm64": "0.17.19", + "@esbuild/linux-ia32": "0.17.19", + "@esbuild/linux-loong64": "0.17.19", + "@esbuild/linux-mips64el": "0.17.19", + "@esbuild/linux-ppc64": "0.17.19", + "@esbuild/linux-riscv64": "0.17.19", + "@esbuild/linux-s390x": "0.17.19", + "@esbuild/linux-x64": "0.17.19", + "@esbuild/netbsd-x64": "0.17.19", + "@esbuild/openbsd-x64": "0.17.19", + "@esbuild/sunos-x64": "0.17.19", + "@esbuild/win32-arm64": "0.17.19", + "@esbuild/win32-ia32": "0.17.19", + "@esbuild/win32-x64": "0.17.19" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "engines": { + "node": ">=6" + } + }, + "node_modules/expand-template": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", + "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/fast-glob": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", + "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + } + }, + "node_modules/from2/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "node_modules/from2/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/from2/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "dev": true + }, + "node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-func-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", + "integrity": "sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/github-from-package": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", + "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==", + "dev": true + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globrex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz", + "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==", + "dev": true + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dev": true, + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/ignore": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/ignore-by-default": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", + "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==", + "dev": true + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true + }, + "node_modules/into-stream": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/into-stream/-/into-stream-6.0.0.tgz", + "integrity": "sha512-XHbaOAvP+uFKUFsOgoNPRjLkwB+I22JFPFe5OjTkQ0nwgj6+pSjb4NmB6VMxaPshLiOf+zcpOCBQuLwC1KHhZA==", + "dev": true, + "dependencies": { + "from2": "^2.3.0", + "p-is-promise": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ioredis": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ioredis/-/ioredis-5.3.2.tgz", + "integrity": "sha512-1DKMMzlIHM02eBBVOFQ1+AolGjs6+xEcM4PDL7NqOS6szq7H9jSaEkIUH6/a5Hl241LzW6JLSiAbNvTQjUupUA==", + "dependencies": { + "@ioredis/commands": "^1.1.1", + "cluster-key-slot": "^1.1.0", + "debug": "^4.3.4", + "denque": "^2.1.0", + "lodash.defaults": "^4.2.0", + "lodash.isarguments": "^3.1.0", + "redis-errors": "^1.2.0", + "redis-parser": "^3.0.0", + "standard-as-callback": "^2.1.0" + }, + "engines": { + "node": ">=12.22.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/ioredis" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz", + "integrity": "sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", + "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonc-parser": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", + "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", + "dev": true + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/local-pkg": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.4.3.tgz", + "integrity": "sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==" + }, + "node_modules/lodash.defaults": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", + "integrity": "sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==" + }, + "node_modules/lodash.isarguments": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", + "integrity": "sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==" + }, + "node_modules/long": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", + "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" + }, + "node_modules/loupe": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.6.tgz", + "integrity": "sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==", + "dev": true, + "dependencies": { + "get-func-name": "^2.0.0" + } + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/mkdirp-classic": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", + "dev": true + }, + "node_modules/mlly": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.4.0.tgz", + "integrity": "sha512-ua8PAThnTwpprIaU47EPeZ/bPUVp2QYBbWMphUQpVdBI3Lgqzm5KZQ45Agm3YJedHXaIHl6pBGabaLSUPPSptg==", + "dev": true, + "dependencies": { + "acorn": "^8.9.0", + "pathe": "^1.1.1", + "pkg-types": "^1.0.3", + "ufo": "^1.1.2" + } + }, + "node_modules/mnemonist": { + "version": "0.39.5", + "resolved": "https://registry.npmjs.org/mnemonist/-/mnemonist-0.39.5.tgz", + "integrity": "sha512-FPUtkhtJ0efmEFGpU14x7jGbTB+s18LrzRL2KgoWz9YvcY3cPomz8tih01GbHwnGk/OmkOKfqd/RAQoc8Lm7DQ==", + "dependencies": { + "obliterator": "^2.0.1" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/multistream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/multistream/-/multistream-4.1.0.tgz", + "integrity": "sha512-J1XDiAmmNpRCBfIWJv+n0ymC4ABcf/Pl+5YvC5B/D2f/2+8PtHvCNxMPKiQcZyi922Hq69J2YOpb1pTywfifyw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "once": "^1.4.0", + "readable-stream": "^3.6.0" + } + }, + "node_modules/multistream/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/multistream/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/multistream/node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/nanoid": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", + "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/napi-build-utils": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", + "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==", + "dev": true + }, + "node_modules/node-abi": { + "version": "3.47.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.47.0.tgz", + "integrity": "sha512-2s6B2CWZM//kPgwnuI0KrYwNjfdByE25zvAaEpq9IH4zcNsarH8Ihu/UuX6XMPEogDAxkuUFeZn60pXNHAqn3A==", + "dev": true, + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/node-abi/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/node-fetch": { + "version": "2.6.13", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.13.tgz", + "integrity": "sha512-StxNAxh15zr77QvvkmveSQ8uCQ4+v5FkvNTj0OESmiHu+VRi/gXArXtkWMElOsOUNLtUEvI4yS+rdtOHZTwlQA==", + "dev": true, + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/nodemon": { + "version": "2.0.22", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.22.tgz", + "integrity": "sha512-B8YqaKMmyuCO7BowF1Z1/mkPqLk6cs/l63Ojtd6otKjMx47Dq1utxfRxcavH1I7VSaL8n5BUaoutadnsX3AAVQ==", + "dev": true, + "dependencies": { + "chokidar": "^3.5.2", + "debug": "^3.2.7", + "ignore-by-default": "^1.0.1", + "minimatch": "^3.1.2", + "pstree.remy": "^1.1.8", + "semver": "^5.7.1", + "simple-update-notifier": "^1.0.7", + "supports-color": "^5.5.0", + "touch": "^3.1.0", + "undefsafe": "^2.0.5" + }, + "bin": { + "nodemon": "bin/nodemon.js" + }, + "engines": { + "node": ">=8.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/nodemon" + } + }, + "node_modules/nodemon/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/nopt": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", + "integrity": "sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==", + "dev": true, + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "*" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/obliterator": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/obliterator/-/obliterator-2.0.4.tgz", + "integrity": "sha512-lgHwxlxV1qIg1Eap7LgIeoBWIMFibOjbrYPIPJZcI1mmGAI2m3lNYpK12Y+GBdPQ0U1hRwSord7GIaawz962qQ==" + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/p-is-promise": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-3.0.0.tgz", + "integrity": "sha512-Wo8VsW4IRQSKVXsJCn7TomUaVtyfjVDn3nUP7kE967BQk0CwFpdbZs0X0uk5sW9mkBa9eNM7hCMaG93WUAwxYQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-limit": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", + "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^1.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/pathe": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.1.tgz", + "integrity": "sha512-d+RQGp0MAYTIaDBIMmOfMwz3E+LOZnxx1HZd5R18mmCZY0QBlK0LDZfPc8FW8Ed2DlvsuE6PRjroDY+wg4+j/Q==", + "dev": true + }, + "node_modules/pathval": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", + "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pkg": { + "version": "5.8.1", + "resolved": "https://registry.npmjs.org/pkg/-/pkg-5.8.1.tgz", + "integrity": "sha512-CjBWtFStCfIiT4Bde9QpJy0KeH19jCfwZRJqHFDFXfhUklCx8JoFmMj3wgnEYIwGmZVNkhsStPHEOnrtrQhEXA==", + "dev": true, + "dependencies": { + "@babel/generator": "7.18.2", + "@babel/parser": "7.18.4", + "@babel/types": "7.19.0", + "chalk": "^4.1.2", + "fs-extra": "^9.1.0", + "globby": "^11.1.0", + "into-stream": "^6.0.0", + "is-core-module": "2.9.0", + "minimist": "^1.2.6", + "multistream": "^4.1.0", + "pkg-fetch": "3.4.2", + "prebuild-install": "7.1.1", + "resolve": "^1.22.0", + "stream-meter": "^1.0.4" + }, + "bin": { + "pkg": "lib-es5/bin.js" + }, + "peerDependencies": { + "node-notifier": ">=9.0.1" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/pkg-fetch": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/pkg-fetch/-/pkg-fetch-3.4.2.tgz", + "integrity": "sha512-0+uijmzYcnhC0hStDjm/cl2VYdrmVVBpe7Q8k9YBojxmR5tG8mvR9/nooQq3QSXiQqORDVOTY3XqMEqJVIzkHA==", + "dev": true, + "dependencies": { + "chalk": "^4.1.2", + "fs-extra": "^9.1.0", + "https-proxy-agent": "^5.0.0", + "node-fetch": "^2.6.6", + "progress": "^2.0.3", + "semver": "^7.3.5", + "tar-fs": "^2.1.1", + "yargs": "^16.2.0" + }, + "bin": { + "pkg-fetch": "lib-es5/bin.js" + } + }, + "node_modules/pkg-fetch/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/pkg-types": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.0.3.tgz", + "integrity": "sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==", + "dev": true, + "dependencies": { + "jsonc-parser": "^3.2.0", + "mlly": "^1.2.0", + "pathe": "^1.1.0" + } + }, + "node_modules/postcss": { + "version": "8.4.28", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.28.tgz", + "integrity": "sha512-Z7V5j0cq8oEKyejIKfpD8b4eBy9cwW2JWPk0+fB1HOAMsfHbnAXLLS+PfVWlzMSLQaWttKDt607I0XHmpE67Vw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/prebuild-install": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.1.tgz", + "integrity": "sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==", + "dev": true, + "dependencies": { + "detect-libc": "^2.0.0", + "expand-template": "^2.0.3", + "github-from-package": "0.0.0", + "minimist": "^1.2.3", + "mkdirp-classic": "^0.5.3", + "napi-build-utils": "^1.0.1", + "node-abi": "^3.3.0", + "pump": "^3.0.0", + "rc": "^1.2.7", + "simple-get": "^4.0.0", + "tar-fs": "^2.0.0", + "tunnel-agent": "^0.6.0" + }, + "bin": { + "prebuild-install": "bin.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/pretty-format": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", + "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/prisma": { + "version": "4.16.2", + "resolved": "https://registry.npmjs.org/prisma/-/prisma-4.16.2.tgz", + "integrity": "sha512-SYCsBvDf0/7XSJyf2cHTLjLeTLVXYfqp7pG5eEVafFLeT0u/hLFz/9W196nDRGUOo1JfPatAEb+uEnTQImQC1g==", + "devOptional": true, + "hasInstallScript": true, + "dependencies": { + "@prisma/engines": "4.16.2" + }, + "bin": { + "prisma": "build/index.js", + "prisma2": "build/index.js" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/prisma-redis-middleware": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/prisma-redis-middleware/-/prisma-redis-middleware-4.8.0.tgz", + "integrity": "sha512-d1B7TVLiR8aSiOY2GPKKDb5EWGTK+EmlIkztAZCPWxs4/IHGfIAZiDoLklp6CcK+5ckjcaJq8aWE5AjRJ3+Rpg==", + "dependencies": { + "async-cache-dedupe": "1.12.0", + "ioredis": "5.3.2" + }, + "engines": { + "node": "^16.x || ^18.x", + "npm": "^7.x || ^8.x || ^9.x" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/protobufjs": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.2.2.tgz", + "integrity": "sha512-++PrQIjrom+bFDPpfmqXfAGSQs40116JRrqqyf53dymUMvvb5d/LMRyicRoF1AUKoXVS1/IgJXlEgcpr4gTF3Q==", + "hasInstallScript": true, + "dependencies": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/node": ">=13.7.0", + "long": "^5.0.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/protobufjs/node_modules/long": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", + "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==" + }, + "node_modules/pstree.remy": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", + "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", + "dev": true + }, + "node_modules/pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==" + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dev": true, + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, + "node_modules/react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", + "dev": true + }, + "node_modules/readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/redis-errors": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/redis-errors/-/redis-errors-1.2.0.tgz", + "integrity": "sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w==", + "engines": { + "node": ">=4" + } + }, + "node_modules/redis-parser": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redis-parser/-/redis-parser-3.0.0.tgz", + "integrity": "sha512-DJnGAeenTdpMEH6uAJRK/uiyEIH9WVsUmoLwzudwGJUwZPp80PDBWPHXSAGNPwNvIXAbe7MSUB1zQFugFml66A==", + "dependencies": { + "redis-errors": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==" + }, + "node_modules/resolve": { + "version": "1.22.4", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.4.tgz", + "integrity": "sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==", + "dev": true, + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve/node_modules/is-core-module": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", + "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rollup": { + "version": "3.28.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.28.0.tgz", + "integrity": "sha512-d7zhvo1OUY2SXSM6pfNjgD5+d0Nz87CUp4mt8l/GgVP3oBsPwzNvSzyu1me6BSG9JIgWNTVcafIXBIyM8yQ3yw==", + "dev": true, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=14.18.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/safe-stable-stringify": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz", + "integrity": "sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==", + "engines": { + "node": ">=10" + } + }, + "node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/siginfo": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", + "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", + "dev": true + }, + "node_modules/simple-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/simple-get": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", + "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "decompress-response": "^6.0.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } + }, + "node_modules/simple-update-notifier": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-1.1.0.tgz", + "integrity": "sha512-VpsrsJSUcJEseSbMHkrsrAVSdvVS5I96Qo1QAQ4FxQ9wXFcB+pjj7FB7/us9+GcgfW4ziHtYMc1J0PLczb55mg==", + "dev": true, + "dependencies": { + "semver": "~7.0.0" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/simple-update-notifier/node_modules/semver": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", + "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/slice-ansi": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", + "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.0.0", + "is-fullwidth-code-point": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/slice-ansi/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stackback": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", + "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", + "dev": true + }, + "node_modules/standard-as-callback": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/standard-as-callback/-/standard-as-callback-2.1.0.tgz", + "integrity": "sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A==" + }, + "node_modules/std-env": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.4.0.tgz", + "integrity": "sha512-YqHeQIIQ8r1VtUZOTOyjsAXAsjr369SplZ5rlQaiJTBsvodvPSCME7vuz8pnQltbQ0Cw0lyFo5Q8uyNwYQ58Xw==", + "dev": true + }, + "node_modules/stream-meter": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/stream-meter/-/stream-meter-1.0.4.tgz", + "integrity": "sha512-4sOEtrbgFotXwnEuzzsQBYEV1elAeFSO8rSGeTwabuX1RRn/kEq9JVH7I0MRBhKVRR0sJkr0M0QCH7yOLf9fhQ==", + "dev": true, + "dependencies": { + "readable-stream": "^2.1.4" + } + }, + "node_modules/stream-meter/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "node_modules/stream-meter/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/stream-meter/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==" + }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/strip-ansi/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-literal": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-1.3.0.tgz", + "integrity": "sha512-PugKzOsyXpArk0yWmUwqOZecSO0GH0bPoctLcqNDH9J04pVW3lflYE0ujElBGTloevcxF5MofAOZ7C5l2b+wLg==", + "dev": true, + "dependencies": { + "acorn": "^8.10.0" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tar-fs": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", + "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", + "dev": true, + "dependencies": { + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.1.4" + } + }, + "node_modules/tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "dev": true, + "dependencies": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tar-stream/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/tar-stream/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/tar-stream/node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/tinybench": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.5.0.tgz", + "integrity": "sha512-kRwSG8Zx4tjF9ZiyH4bhaebu+EDz1BOx9hOigYHlUW4xxI/wKIUQUqo018UlU4ar6ATPBsaMrdbKZ+tmPdohFA==", + "dev": true + }, + "node_modules/tinypool": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-0.4.0.tgz", + "integrity": "sha512-2ksntHOKf893wSAH4z/+JbPpi92esw8Gn9N2deXX+B0EO92hexAVI9GIZZPx7P5aYo5KULfeOSt3kMOmSOy6uA==", + "dev": true, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tinyspy": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-1.1.1.tgz", + "integrity": "sha512-UVq5AXt/gQlti7oxoIg5oi/9r0WpF7DGEVwXgqWSMmyN16+e3tl5lIvTaOpJ3TAtu5xFzWccFRM4R5NaWHF+4g==", + "dev": true, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/touch": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", + "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", + "dev": true, + "dependencies": { + "nopt": "~1.0.10" + }, + "bin": { + "nodetouch": "bin/nodetouch.js" + } + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "dev": true + }, + "node_modules/ts-node": { + "version": "10.9.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", + "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", + "dev": true, + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "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 + } + } + }, + "node_modules/tsconfck": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/tsconfck/-/tsconfck-2.1.2.tgz", + "integrity": "sha512-ghqN1b0puy3MhhviwO2kGF8SeMDNhEbnKxjK7h6+fvY9JAxqvXi8y5NAHSQv687OVboS2uZIByzGd45/YxrRHg==", + "dev": true, + "bin": { + "tsconfck": "bin/tsconfck.js" + }, + "engines": { + "node": "^14.13.1 || ^16 || >=18" + }, + "peerDependencies": { + "typescript": "^4.3.5 || ^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/tsconfig-paths": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", + "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==", + "dev": true, + "dependencies": { + "json5": "^2.2.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "dev": true, + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/typescript": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.2.tgz", + "integrity": "sha512-wVORMBGO/FAs/++blGNeAVdbNKtIh1rbBL2EyQ1+J9lClJ93KiiKe8PmFIVdXhHcyv44SL9oglmfeSsndo0jRw==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=12.20" + } + }, + "node_modules/ufo": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.2.0.tgz", + "integrity": "sha512-RsPyTbqORDNDxqAdQPQBpgqhWle1VcTSou/FraClYlHf6TZnQcGslpLcAphNR+sQW4q5lLWLbOsRlh9j24baQg==", + "dev": true + }, + "node_modules/undefsafe": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", + "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", + "dev": true + }, + "node_modules/universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/url-parse": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true + }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true + }, + "node_modules/vite": { + "version": "4.4.9", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.4.9.tgz", + "integrity": "sha512-2mbUn2LlUmNASWwSCNSJ/EG2HuSRTnVNaydp6vMCm5VIqJsjMfbIWtbH2kDuwUVW5mMUKKZvGPX/rqeqVvv1XA==", + "dev": true, + "dependencies": { + "esbuild": "^0.18.10", + "postcss": "^8.4.27", + "rollup": "^3.27.1" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + }, + "peerDependencies": { + "@types/node": ">= 14", + "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 + } + } + }, + "node_modules/vite-node": { + "version": "0.29.8", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-0.29.8.tgz", + "integrity": "sha512-b6OtCXfk65L6SElVM20q5G546yu10/kNrhg08afEoWlFRJXFq9/6glsvSVY+aI6YeC1tu2TtAqI2jHEQmOmsFw==", + "dev": true, + "dependencies": { + "cac": "^6.7.14", + "debug": "^4.3.4", + "mlly": "^1.1.0", + "pathe": "^1.1.0", + "picocolors": "^1.0.0", + "vite": "^3.0.0 || ^4.0.0" + }, + "bin": { + "vite-node": "vite-node.mjs" + }, + "engines": { + "node": ">=v14.16.0" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/vite-tsconfig-paths": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/vite-tsconfig-paths/-/vite-tsconfig-paths-4.2.0.tgz", + "integrity": "sha512-jGpus0eUy5qbbMVGiTxCL1iB9ZGN6Bd37VGLJU39kTDD6ZfULTTb1bcc5IeTWqWJKiWV5YihCaibeASPiGi8kw==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "globrex": "^0.1.2", + "tsconfck": "^2.1.0" + }, + "peerDependencies": { + "vite": "*" + }, + "peerDependenciesMeta": { + "vite": { + "optional": true + } + } + }, + "node_modules/vite/node_modules/@esbuild/android-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", + "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/android-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz", + "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/android-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz", + "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/darwin-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz", + "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/darwin-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz", + "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/freebsd-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz", + "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/freebsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz", + "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz", + "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz", + "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz", + "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-loong64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", + "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-mips64el": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz", + "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-ppc64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz", + "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-riscv64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz", + "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-s390x": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz", + "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz", + "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/netbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz", + "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/openbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz", + "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/sunos-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz", + "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/win32-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", + "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/win32-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz", + "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/win32-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", + "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/esbuild": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", + "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.18.20", + "@esbuild/android-arm64": "0.18.20", + "@esbuild/android-x64": "0.18.20", + "@esbuild/darwin-arm64": "0.18.20", + "@esbuild/darwin-x64": "0.18.20", + "@esbuild/freebsd-arm64": "0.18.20", + "@esbuild/freebsd-x64": "0.18.20", + "@esbuild/linux-arm": "0.18.20", + "@esbuild/linux-arm64": "0.18.20", + "@esbuild/linux-ia32": "0.18.20", + "@esbuild/linux-loong64": "0.18.20", + "@esbuild/linux-mips64el": "0.18.20", + "@esbuild/linux-ppc64": "0.18.20", + "@esbuild/linux-riscv64": "0.18.20", + "@esbuild/linux-s390x": "0.18.20", + "@esbuild/linux-x64": "0.18.20", + "@esbuild/netbsd-x64": "0.18.20", + "@esbuild/openbsd-x64": "0.18.20", + "@esbuild/sunos-x64": "0.18.20", + "@esbuild/win32-arm64": "0.18.20", + "@esbuild/win32-ia32": "0.18.20", + "@esbuild/win32-x64": "0.18.20" + } + }, + "node_modules/vitest": { + "version": "0.29.8", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-0.29.8.tgz", + "integrity": "sha512-JIAVi2GK5cvA6awGpH0HvH/gEG9PZ0a/WoxdiV3PmqK+3CjQMf8c+J/Vhv4mdZ2nRyXFw66sAg6qz7VNkaHfDQ==", + "dev": true, + "dependencies": { + "@types/chai": "^4.3.4", + "@types/chai-subset": "^1.3.3", + "@types/node": "*", + "@vitest/expect": "0.29.8", + "@vitest/runner": "0.29.8", + "@vitest/spy": "0.29.8", + "@vitest/utils": "0.29.8", + "acorn": "^8.8.1", + "acorn-walk": "^8.2.0", + "cac": "^6.7.14", + "chai": "^4.3.7", + "debug": "^4.3.4", + "local-pkg": "^0.4.2", + "pathe": "^1.1.0", + "picocolors": "^1.0.0", + "source-map": "^0.6.1", + "std-env": "^3.3.1", + "strip-literal": "^1.0.0", + "tinybench": "^2.3.1", + "tinypool": "^0.4.0", + "tinyspy": "^1.0.2", + "vite": "^3.0.0 || ^4.0.0", + "vite-node": "0.29.8", + "why-is-node-running": "^2.2.2" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": ">=v14.16.0" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@vitest/browser": "*", + "@vitest/ui": "*", + "happy-dom": "*", + "jsdom": "*", + "playwright": "*", + "safaridriver": "*", + "webdriverio": "*" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@vitest/browser": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + }, + "playwright": { + "optional": true + }, + "safaridriver": { + "optional": true + }, + "webdriverio": { + "optional": true + } + } + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "dev": true + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dev": true, + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/why-is-node-running": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.2.2.tgz", + "integrity": "sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==", + "dev": true, + "dependencies": { + "siginfo": "^2.0.0", + "stackback": "0.0.2" + }, + "bin": { + "why-is-node-running": "cli.js" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/wrap-ansi/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/yargs/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/yocto-queue": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", + "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", + "dev": true, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/services/gateway/.gitignore b/services/gateway/.gitignore index 82abeb3b..214d8053 100644 --- a/services/gateway/.gitignore +++ b/services/gateway/.gitignore @@ -4,3 +4,5 @@ bin/ *.env* !*.env.example !*.env.docker + +src/proto/* diff --git a/services/gateway/package-lock.json b/services/gateway/package-lock.json index 9f8565a9..25c6b278 100644 --- a/services/gateway/package-lock.json +++ b/services/gateway/package-lock.json @@ -25,8 +25,7 @@ "@types/amqplib": "^0.10.1", "@types/google-protobuf": "^3.15.6", "@types/node": "^18.15.9", - "@vitest/coverage-c8": "^0.33.0", - "esbuild": "^0.17.18", + "esbuild": "^0.19.2", "grpc_tools_node_protoc_ts": "^5.3.3", "grpc-tools": "^1.12.4", "nodemon": "^3.0.1", @@ -35,21 +34,7 @@ "tsconfig-paths": "^4.2.0", "typescript": "5.0.2", "vite-tsconfig-paths": "^4.2.0", - "vitest": "^0.33.0", - "vitest-mock-extended": "^1.1.4" - } - }, - "node_modules/@ampproject/remapping": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", - "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", - "dev": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" + "vitest": "^0.33.0" } }, "node_modules/@babel/generator": { @@ -110,12 +95,6 @@ "node": ">=6.9.0" } }, - "node_modules/@bcoe/v8-coverage": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", - "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", - "dev": true - }, "node_modules/@cspotcode/source-map-support": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", @@ -138,10 +117,250 @@ "@jridgewell/sourcemap-codec": "^1.4.10" } }, + "node_modules/@esbuild/android-arm": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.2.tgz", + "integrity": "sha512-tM8yLeYVe7pRyAu9VMi/Q7aunpLwD139EY1S99xbQkT4/q2qa6eA4ige/WJQYdJ8GBL1K33pPFhPfPdJ/WzT8Q==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.2.tgz", + "integrity": "sha512-lsB65vAbe90I/Qe10OjkmrdxSX4UJDjosDgb8sZUKcg3oefEuW2OT2Vozz8ef7wrJbMcmhvCC+hciF8jY/uAkw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.2.tgz", + "integrity": "sha512-qK/TpmHt2M/Hg82WXHRc/W/2SGo/l1thtDHZWqFq7oi24AjZ4O/CpPSu6ZuYKFkEgmZlFoa7CooAyYmuvnaG8w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.2.tgz", + "integrity": "sha512-Ora8JokrvrzEPEpZO18ZYXkH4asCdc1DLdcVy8TGf5eWtPO1Ie4WroEJzwI52ZGtpODy3+m0a2yEX9l+KUn0tA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.2.tgz", + "integrity": "sha512-tP+B5UuIbbFMj2hQaUr6EALlHOIOmlLM2FK7jeFBobPy2ERdohI4Ka6ZFjZ1ZYsrHE/hZimGuU90jusRE0pwDw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.2.tgz", + "integrity": "sha512-YbPY2kc0acfzL1VPVK6EnAlig4f+l8xmq36OZkU0jzBVHcOTyQDhnKQaLzZudNJQyymd9OqQezeaBgkTGdTGeQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.2.tgz", + "integrity": "sha512-nSO5uZT2clM6hosjWHAsS15hLrwCvIWx+b2e3lZ3MwbYSaXwvfO528OF+dLjas1g3bZonciivI8qKR/Hm7IWGw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.2.tgz", + "integrity": "sha512-Odalh8hICg7SOD7XCj0YLpYCEc+6mkoq63UnExDCiRA2wXEmGlK5JVrW50vZR9Qz4qkvqnHcpH+OFEggO3PgTg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.2.tgz", + "integrity": "sha512-ig2P7GeG//zWlU0AggA3pV1h5gdix0MA3wgB+NsnBXViwiGgY77fuN9Wr5uoCrs2YzaYfogXgsWZbm+HGr09xg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.2.tgz", + "integrity": "sha512-mLfp0ziRPOLSTek0Gd9T5B8AtzKAkoZE70fneiiyPlSnUKKI4lp+mGEnQXcQEHLJAcIYDPSyBvsUbKUG2ri/XQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.2.tgz", + "integrity": "sha512-hn28+JNDTxxCpnYjdDYVMNTR3SKavyLlCHHkufHV91fkewpIyQchS1d8wSbmXhs1fiYDpNww8KTFlJ1dHsxeSw==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.2.tgz", + "integrity": "sha512-KbXaC0Sejt7vD2fEgPoIKb6nxkfYW9OmFUK9XQE4//PvGIxNIfPk1NmlHmMg6f25x57rpmEFrn1OotASYIAaTg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.2.tgz", + "integrity": "sha512-dJ0kE8KTqbiHtA3Fc/zn7lCd7pqVr4JcT0JqOnbj4LLzYnp+7h8Qi4yjfq42ZlHfhOCM42rBh0EwHYLL6LEzcw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.2.tgz", + "integrity": "sha512-7Z/jKNFufZ/bbu4INqqCN6DDlrmOTmdw6D0gH+6Y7auok2r02Ur661qPuXidPOJ+FSgbEeQnnAGgsVynfLuOEw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.2.tgz", + "integrity": "sha512-U+RinR6aXXABFCcAY4gSlv4CL1oOVvSSCdseQmGO66H+XyuQGZIUdhG56SZaDJQcLmrSfRmx5XZOWyCJPRqS7g==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, "node_modules/@esbuild/linux-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.19.tgz", - "integrity": "sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==", + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.2.tgz", + "integrity": "sha512-oxzHTEv6VPm3XXNaHPyUTTte+3wGv7qVQtqaZCrgstI16gCuhNOtBXLEBkBREP57YTd68P0VgDgG73jSD8bwXQ==", "cpu": [ "x64" ], @@ -154,6 +373,102 @@ "node": ">=12" } }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.2.tgz", + "integrity": "sha512-WNa5zZk1XpTTwMDompZmvQLHszDDDN7lYjEHCUmAGB83Bgs20EMs7ICD+oKeT6xt4phV4NDdSi/8OfjPbSbZfQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.2.tgz", + "integrity": "sha512-S6kI1aT3S++Dedb7vxIuUOb3oAxqxk2Rh5rOXOTYnzN8JzW1VzBd+IqPiSpgitu45042SYD3HCoEyhLKQcDFDw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.2.tgz", + "integrity": "sha512-VXSSMsmb+Z8LbsQGcBMiM+fYObDNRm8p7tkUDMPG/g4fhFX5DEFmjxIEa3N8Zr96SjsJ1woAhF0DUnS3MF3ARw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.2.tgz", + "integrity": "sha512-5NayUlSAyb5PQYFAU9x3bHdsqB88RC3aM9lKDAz4X1mo/EchMIT1Q+pSeBXNgkfNmRecLXA0O8xP+x8V+g/LKg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.2.tgz", + "integrity": "sha512-47gL/ek1v36iN0wL9L4Q2MFdujR0poLZMJwhO2/N3gA89jgHp4MR8DKCmwYtGNksbfJb9JoTtbkoe6sDhg2QTA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.2.tgz", + "integrity": "sha512-tcuhV7ncXBqbt/Ybf0IyrMcwVOAPDckMK9rXNHtF17UTK18OKLpg08glminN06pt2WCoALhXdLfSPbVvK/6fxw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, "node_modules/@grpc/grpc-js": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.9.0.tgz", @@ -222,15 +537,6 @@ "node": ">=12" } }, - "node_modules/@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/@jest/schemas": { "version": "29.6.0", "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.0.tgz", @@ -510,12 +816,6 @@ "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.1.tgz", "integrity": "sha512-/K3ds8TRAfBvi5vfjuz8y6+GiAYBZ0x4tXv1Av6CWBWn0IlADc+ZX9pMq7oU0fNQPnBwIZl3rmeLp6SBApbxSQ==" }, - "node_modules/@types/istanbul-lib-coverage": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", - "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", - "dev": true - }, "node_modules/@types/long": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz", @@ -560,25 +860,6 @@ "@types/node": "*" } }, - "node_modules/@vitest/coverage-c8": { - "version": "0.33.0", - "resolved": "https://registry.npmjs.org/@vitest/coverage-c8/-/coverage-c8-0.33.0.tgz", - "integrity": "sha512-DaF1zJz4dcOZS4k/neiQJokmOWqsGXwhthfmUdPGorXIQHjdPvV6JQSYhQDI41MyI8c+IieQUdIDs5XAMHtDDw==", - "dev": true, - "dependencies": { - "@ampproject/remapping": "^2.2.1", - "c8": "^7.14.0", - "magic-string": "^0.30.1", - "picocolors": "^1.0.0", - "std-env": "^3.3.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "vitest": ">=0.30.0 <1" - } - }, "node_modules/@vitest/expect": { "version": "0.33.0", "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-0.33.0.tgz", @@ -966,32 +1247,6 @@ "node": ">= 0.8" } }, - "node_modules/c8": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/c8/-/c8-7.14.0.tgz", - "integrity": "sha512-i04rtkkcNcCf7zsQcSv/T9EbUn4RXQ6mropeMcjFOsQXQ0iGLAr/xT6TImQg4+U9hmNpN9XdvPkjUL1IzbgxJw==", - "dev": true, - "dependencies": { - "@bcoe/v8-coverage": "^0.2.3", - "@istanbuljs/schema": "^0.1.3", - "find-up": "^5.0.0", - "foreground-child": "^2.0.0", - "istanbul-lib-coverage": "^3.2.0", - "istanbul-lib-report": "^3.0.0", - "istanbul-reports": "^3.1.4", - "rimraf": "^3.0.2", - "test-exclude": "^6.0.0", - "v8-to-istanbul": "^9.0.0", - "yargs": "^16.2.0", - "yargs-parser": "^20.2.9" - }, - "bin": { - "c8": "bin/c8.js" - }, - "engines": { - "node": ">=10.12.0" - } - }, "node_modules/cac": { "version": "6.7.14", "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", @@ -1169,12 +1424,6 @@ "node": ">= 0.6" } }, - "node_modules/convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", - "dev": true - }, "node_modules/cookie": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", @@ -1200,20 +1449,6 @@ "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", "dev": true }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, "node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -1384,9 +1619,9 @@ } }, "node_modules/esbuild": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.19.tgz", - "integrity": "sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==", + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.2.tgz", + "integrity": "sha512-G6hPax8UbFakEj3hWO0Vs52LQ8k3lnBhxZWomUJDxfz3rZTLqF5k/FCzuNdLx2RbpBiQQF9H9onlDDH1lZsnjg==", "dev": true, "hasInstallScript": true, "bin": { @@ -1396,28 +1631,28 @@ "node": ">=12" }, "optionalDependencies": { - "@esbuild/android-arm": "0.17.19", - "@esbuild/android-arm64": "0.17.19", - "@esbuild/android-x64": "0.17.19", - "@esbuild/darwin-arm64": "0.17.19", - "@esbuild/darwin-x64": "0.17.19", - "@esbuild/freebsd-arm64": "0.17.19", - "@esbuild/freebsd-x64": "0.17.19", - "@esbuild/linux-arm": "0.17.19", - "@esbuild/linux-arm64": "0.17.19", - "@esbuild/linux-ia32": "0.17.19", - "@esbuild/linux-loong64": "0.17.19", - "@esbuild/linux-mips64el": "0.17.19", - "@esbuild/linux-ppc64": "0.17.19", - "@esbuild/linux-riscv64": "0.17.19", - "@esbuild/linux-s390x": "0.17.19", - "@esbuild/linux-x64": "0.17.19", - "@esbuild/netbsd-x64": "0.17.19", - "@esbuild/openbsd-x64": "0.17.19", - "@esbuild/sunos-x64": "0.17.19", - "@esbuild/win32-arm64": "0.17.19", - "@esbuild/win32-ia32": "0.17.19", - "@esbuild/win32-x64": "0.17.19" + "@esbuild/android-arm": "0.19.2", + "@esbuild/android-arm64": "0.19.2", + "@esbuild/android-x64": "0.19.2", + "@esbuild/darwin-arm64": "0.19.2", + "@esbuild/darwin-x64": "0.19.2", + "@esbuild/freebsd-arm64": "0.19.2", + "@esbuild/freebsd-x64": "0.19.2", + "@esbuild/linux-arm": "0.19.2", + "@esbuild/linux-arm64": "0.19.2", + "@esbuild/linux-ia32": "0.19.2", + "@esbuild/linux-loong64": "0.19.2", + "@esbuild/linux-mips64el": "0.19.2", + "@esbuild/linux-ppc64": "0.19.2", + "@esbuild/linux-riscv64": "0.19.2", + "@esbuild/linux-s390x": "0.19.2", + "@esbuild/linux-x64": "0.19.2", + "@esbuild/netbsd-x64": "0.19.2", + "@esbuild/openbsd-x64": "0.19.2", + "@esbuild/sunos-x64": "0.19.2", + "@esbuild/win32-arm64": "0.19.2", + "@esbuild/win32-ia32": "0.19.2", + "@esbuild/win32-x64": "0.19.2" } }, "node_modules/escalade": { @@ -1608,22 +1843,6 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, - "node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/follow-redirects": { "version": "1.15.2", "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", @@ -1643,19 +1862,6 @@ } } }, - "node_modules/foreground-child": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", - "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": ">=8.0.0" - } - }, "node_modules/form-data": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", @@ -2007,12 +2213,6 @@ "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", "dev": true }, - "node_modules/html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true - }, "node_modules/http-errors": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", @@ -2199,48 +2399,6 @@ "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", "dev": true }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "node_modules/istanbul-lib-coverage": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", - "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", - "dev": true, - "dependencies": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^3.0.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-reports": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", - "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", - "dev": true, - "dependencies": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/jsesc": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", @@ -2294,21 +2452,6 @@ "url": "https://github.com/sponsors/antfu" } }, - "node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/lodash.camelcase": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", @@ -2790,36 +2933,6 @@ "node": ">=8" } }, - "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", @@ -2828,15 +2941,6 @@ "node": ">= 0.8" } }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", @@ -2845,15 +2949,6 @@ "node": ">=0.10.0" } }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/path-parse": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", @@ -3435,27 +3530,6 @@ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/side-channel": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", @@ -3784,20 +3858,6 @@ "node": ">=6" } }, - "node_modules/test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", - "dev": true, - "dependencies": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/tinybench": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.5.0.tgz", @@ -3884,15 +3944,6 @@ "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", "dev": true }, - "node_modules/ts-essentials": { - "version": "9.3.2", - "resolved": "https://registry.npmjs.org/ts-essentials/-/ts-essentials-9.3.2.tgz", - "integrity": "sha512-JxKJzuWqH1MmH4ZFHtJzGEhkfN3QvVR3C3w+4BIoWeoY68UVVoA2Np/Bca9z0IPSErVCWhv439aT0We4Dks8kQ==", - "dev": true, - "peerDependencies": { - "typescript": ">=4.1.0" - } - }, "node_modules/ts-node": { "version": "10.9.1", "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", @@ -4058,20 +4109,6 @@ "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", "dev": true }, - "node_modules/v8-to-istanbul": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.1.0.tgz", - "integrity": "sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA==", - "dev": true, - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.12", - "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^1.6.0" - }, - "engines": { - "node": ">=10.12.0" - } - }, "node_modules/vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", @@ -4212,6 +4249,246 @@ "node": ">=14.17" } }, + "node_modules/vite/node_modules/@esbuild/android-arm": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.12.tgz", + "integrity": "sha512-LIxaNIQfkFZbTLb4+cX7dozHlAbAshhFE5PKdro0l+FnCpx1GDJaQ2WMcqm+ToXKMt8p8Uojk/MFRuGyz3V5Sw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/android-arm64": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.12.tgz", + "integrity": "sha512-BMAlczRqC/LUt2P97E4apTBbkvS9JTJnp2DKFbCwpZ8vBvXVbNdqmvzW/OsdtI/+mGr+apkkpqGM8WecLkPgrA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/android-x64": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.12.tgz", + "integrity": "sha512-zU5MyluNsykf5cOJ0LZZZjgAHbhPJ1cWfdH1ZXVMXxVMhEV0VZiZXQdwBBVvmvbF28EizeK7obG9fs+fpmS0eQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/darwin-arm64": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.12.tgz", + "integrity": "sha512-zUZMep7YONnp6954QOOwEBwFX9svlKd3ov6PkxKd53LGTHsp/gy7vHaPGhhjBmEpqXEXShi6dddjIkmd+NgMsA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/darwin-x64": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.12.tgz", + "integrity": "sha512-ohqLPc7i67yunArPj1+/FeeJ7AgwAjHqKZ512ADk3WsE3FHU9l+m5aa7NdxXr0HmN1bjDlUslBjWNbFlD9y12Q==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/freebsd-arm64": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.12.tgz", + "integrity": "sha512-GIIHtQXqgeOOqdG16a/A9N28GpkvjJnjYMhOnXVbn3EDJcoItdR58v/pGN31CHjyXDc8uCcRnFWmqaJt24AYJg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/freebsd-x64": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.12.tgz", + "integrity": "sha512-zK0b9a1/0wZY+6FdOS3BpZcPc1kcx2G5yxxfEJtEUzVxI6n/FrC2Phsxj/YblPuBchhBZ/1wwn7AyEBUyNSa6g==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-arm": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.12.tgz", + "integrity": "sha512-y75OijvrBE/1XRrXq1jtrJfG26eHeMoqLJ2dwQNwviwTuTtHGCojsDO6BJNF8gU+3jTn1KzJEMETytwsFSvc+Q==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-arm64": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.12.tgz", + "integrity": "sha512-JKgG8Q/LL/9sw/iHHxQyVMoQYu3rU3+a5Z87DxC+wAu3engz+EmctIrV+FGOgI6gWG1z1+5nDDbXiRMGQZXqiw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-ia32": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.12.tgz", + "integrity": "sha512-yoRIAqc0B4lDIAAEFEIu9ttTRFV84iuAl0KNCN6MhKLxNPfzwCBvEMgwco2f71GxmpBcTtn7KdErueZaM2rEvw==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-loong64": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.12.tgz", + "integrity": "sha512-qYgt3dHPVvf/MgbIBpJ4Sup/yb9DAopZ3a2JgMpNKIHUpOdnJ2eHBo/aQdnd8dJ21X/+sS58wxHtA9lEazYtXQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-mips64el": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.12.tgz", + "integrity": "sha512-wHphlMLK4ufNOONqukELfVIbnGQJrHJ/mxZMMrP2jYrPgCRZhOtf0kC4yAXBwnfmULimV1qt5UJJOw4Kh13Yfg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-ppc64": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.12.tgz", + "integrity": "sha512-TeN//1Ft20ZZW41+zDSdOI/Os1bEq5dbvBvYkberB7PHABbRcsteeoNVZFlI0YLpGdlBqohEpjrn06kv8heCJg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-riscv64": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.12.tgz", + "integrity": "sha512-AgUebVS4DoAblBgiB2ACQ/8l4eGE5aWBb8ZXtkXHiET9mbj7GuWt3OnsIW/zX+XHJt2RYJZctbQ2S/mDjbp0UA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-s390x": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.12.tgz", + "integrity": "sha512-dJ3Rb3Ei2u/ysSXd6pzleGtfDdc2MuzKt8qc6ls8vreP1G3B7HInX3i7gXS4BGeVd24pp0yqyS7bJ5NHaI9ing==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, "node_modules/vite/node_modules/@esbuild/linux-x64": { "version": "0.18.12", "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.12.tgz", @@ -4228,6 +4505,102 @@ "node": ">=12" } }, + "node_modules/vite/node_modules/@esbuild/netbsd-x64": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.12.tgz", + "integrity": "sha512-55FzVCAiwE9FK8wWeCRuvjazNRJ1QqLCYGZVB6E8RuQuTeStSwotpSW4xoRGwp3a1wUsaVCdYcj5LGCASVJmMg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/openbsd-x64": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.12.tgz", + "integrity": "sha512-qnluf8rfb6Y5Lw2tirfK2quZOBbVqmwxut7GPCIJsM8lc4AEUj9L8y0YPdLaPK0TECt4IdyBdBD/KRFKorlK3g==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/sunos-x64": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.12.tgz", + "integrity": "sha512-+RkKpVQR7bICjTOPUpkTBTaJ4TFqQBX5Ywyd/HSdDkQGn65VPkTsR/pL4AMvuMWy+wnXgIl4EY6q4mVpJal8Kg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/win32-arm64": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.12.tgz", + "integrity": "sha512-GNHuciv0mFM7ouzsU0+AwY+7eV4Mgo5WnbhfDCQGtpvOtD1vbOiRjPYG6dhmMoFyBjj+pNqQu2X+7DKn0KQ/Gw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/win32-ia32": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.12.tgz", + "integrity": "sha512-kR8cezhYipbbypGkaqCTWIeu4zID17gamC8YTPXYtcN3E5BhhtTnwKBn9I0PJur/T6UVwIEGYzkffNL0lFvxEw==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/win32-x64": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.12.tgz", + "integrity": "sha512-O0UYQVkvfM/jO8a4OwoV0mAKSJw+mjWTAd1MJd/1FCX6uiMdLmMRPK/w6e9OQ0ob2WGxzIm9va/KG0Ja4zIOgg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, "node_modules/vite/node_modules/esbuild": { "version": "0.18.12", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.12.tgz", @@ -4342,19 +4715,6 @@ } } }, - "node_modules/vitest-mock-extended": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/vitest-mock-extended/-/vitest-mock-extended-1.1.4.tgz", - "integrity": "sha512-MKPdepFjk0CE7Ocb5txntHK/sloHO9s0Kk9dr630uL03shRSHMkZtSs5CBPsbJ8K/CvYLv0GHUmMt2zWks2eXg==", - "dev": true, - "dependencies": { - "ts-essentials": "^9.3.2" - }, - "peerDependencies": { - "typescript": "3.x || 4.x || 5.x", - "vitest": ">=0.31.1" - } - }, "node_modules/webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", @@ -4371,21 +4731,6 @@ "webidl-conversions": "^3.0.0" } }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, "node_modules/why-is-node-running": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.2.2.tgz", @@ -4487,31 +4832,9 @@ "engines": { "node": ">=6" } - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - } - }, - "dependencies": { - "@ampproject/remapping": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", - "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", - "dev": true, - "requires": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" - } - }, + } + }, + "dependencies": { "@babel/generator": { "version": "7.18.2", "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.2.tgz", @@ -4552,12 +4875,6 @@ "to-fast-properties": "^2.0.0" } }, - "@bcoe/v8-coverage": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", - "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", - "dev": true - }, "@cspotcode/source-map-support": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", @@ -4579,10 +4896,157 @@ } } }, + "@esbuild/android-arm": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.2.tgz", + "integrity": "sha512-tM8yLeYVe7pRyAu9VMi/Q7aunpLwD139EY1S99xbQkT4/q2qa6eA4ige/WJQYdJ8GBL1K33pPFhPfPdJ/WzT8Q==", + "dev": true, + "optional": true + }, + "@esbuild/android-arm64": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.2.tgz", + "integrity": "sha512-lsB65vAbe90I/Qe10OjkmrdxSX4UJDjosDgb8sZUKcg3oefEuW2OT2Vozz8ef7wrJbMcmhvCC+hciF8jY/uAkw==", + "dev": true, + "optional": true + }, + "@esbuild/android-x64": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.2.tgz", + "integrity": "sha512-qK/TpmHt2M/Hg82WXHRc/W/2SGo/l1thtDHZWqFq7oi24AjZ4O/CpPSu6ZuYKFkEgmZlFoa7CooAyYmuvnaG8w==", + "dev": true, + "optional": true + }, + "@esbuild/darwin-arm64": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.2.tgz", + "integrity": "sha512-Ora8JokrvrzEPEpZO18ZYXkH4asCdc1DLdcVy8TGf5eWtPO1Ie4WroEJzwI52ZGtpODy3+m0a2yEX9l+KUn0tA==", + "dev": true, + "optional": true + }, + "@esbuild/darwin-x64": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.2.tgz", + "integrity": "sha512-tP+B5UuIbbFMj2hQaUr6EALlHOIOmlLM2FK7jeFBobPy2ERdohI4Ka6ZFjZ1ZYsrHE/hZimGuU90jusRE0pwDw==", + "dev": true, + "optional": true + }, + "@esbuild/freebsd-arm64": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.2.tgz", + "integrity": "sha512-YbPY2kc0acfzL1VPVK6EnAlig4f+l8xmq36OZkU0jzBVHcOTyQDhnKQaLzZudNJQyymd9OqQezeaBgkTGdTGeQ==", + "dev": true, + "optional": true + }, + "@esbuild/freebsd-x64": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.2.tgz", + "integrity": "sha512-nSO5uZT2clM6hosjWHAsS15hLrwCvIWx+b2e3lZ3MwbYSaXwvfO528OF+dLjas1g3bZonciivI8qKR/Hm7IWGw==", + "dev": true, + "optional": true + }, + "@esbuild/linux-arm": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.2.tgz", + "integrity": "sha512-Odalh8hICg7SOD7XCj0YLpYCEc+6mkoq63UnExDCiRA2wXEmGlK5JVrW50vZR9Qz4qkvqnHcpH+OFEggO3PgTg==", + "dev": true, + "optional": true + }, + "@esbuild/linux-arm64": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.2.tgz", + "integrity": "sha512-ig2P7GeG//zWlU0AggA3pV1h5gdix0MA3wgB+NsnBXViwiGgY77fuN9Wr5uoCrs2YzaYfogXgsWZbm+HGr09xg==", + "dev": true, + "optional": true + }, + "@esbuild/linux-ia32": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.2.tgz", + "integrity": "sha512-mLfp0ziRPOLSTek0Gd9T5B8AtzKAkoZE70fneiiyPlSnUKKI4lp+mGEnQXcQEHLJAcIYDPSyBvsUbKUG2ri/XQ==", + "dev": true, + "optional": true + }, + "@esbuild/linux-loong64": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.2.tgz", + "integrity": "sha512-hn28+JNDTxxCpnYjdDYVMNTR3SKavyLlCHHkufHV91fkewpIyQchS1d8wSbmXhs1fiYDpNww8KTFlJ1dHsxeSw==", + "dev": true, + "optional": true + }, + "@esbuild/linux-mips64el": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.2.tgz", + "integrity": "sha512-KbXaC0Sejt7vD2fEgPoIKb6nxkfYW9OmFUK9XQE4//PvGIxNIfPk1NmlHmMg6f25x57rpmEFrn1OotASYIAaTg==", + "dev": true, + "optional": true + }, + "@esbuild/linux-ppc64": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.2.tgz", + "integrity": "sha512-dJ0kE8KTqbiHtA3Fc/zn7lCd7pqVr4JcT0JqOnbj4LLzYnp+7h8Qi4yjfq42ZlHfhOCM42rBh0EwHYLL6LEzcw==", + "dev": true, + "optional": true + }, + "@esbuild/linux-riscv64": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.2.tgz", + "integrity": "sha512-7Z/jKNFufZ/bbu4INqqCN6DDlrmOTmdw6D0gH+6Y7auok2r02Ur661qPuXidPOJ+FSgbEeQnnAGgsVynfLuOEw==", + "dev": true, + "optional": true + }, + "@esbuild/linux-s390x": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.2.tgz", + "integrity": "sha512-U+RinR6aXXABFCcAY4gSlv4CL1oOVvSSCdseQmGO66H+XyuQGZIUdhG56SZaDJQcLmrSfRmx5XZOWyCJPRqS7g==", + "dev": true, + "optional": true + }, "@esbuild/linux-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.19.tgz", - "integrity": "sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==", + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.2.tgz", + "integrity": "sha512-oxzHTEv6VPm3XXNaHPyUTTte+3wGv7qVQtqaZCrgstI16gCuhNOtBXLEBkBREP57YTd68P0VgDgG73jSD8bwXQ==", + "dev": true, + "optional": true + }, + "@esbuild/netbsd-x64": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.2.tgz", + "integrity": "sha512-WNa5zZk1XpTTwMDompZmvQLHszDDDN7lYjEHCUmAGB83Bgs20EMs7ICD+oKeT6xt4phV4NDdSi/8OfjPbSbZfQ==", + "dev": true, + "optional": true + }, + "@esbuild/openbsd-x64": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.2.tgz", + "integrity": "sha512-S6kI1aT3S++Dedb7vxIuUOb3oAxqxk2Rh5rOXOTYnzN8JzW1VzBd+IqPiSpgitu45042SYD3HCoEyhLKQcDFDw==", + "dev": true, + "optional": true + }, + "@esbuild/sunos-x64": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.2.tgz", + "integrity": "sha512-VXSSMsmb+Z8LbsQGcBMiM+fYObDNRm8p7tkUDMPG/g4fhFX5DEFmjxIEa3N8Zr96SjsJ1woAhF0DUnS3MF3ARw==", + "dev": true, + "optional": true + }, + "@esbuild/win32-arm64": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.2.tgz", + "integrity": "sha512-5NayUlSAyb5PQYFAU9x3bHdsqB88RC3aM9lKDAz4X1mo/EchMIT1Q+pSeBXNgkfNmRecLXA0O8xP+x8V+g/LKg==", + "dev": true, + "optional": true + }, + "@esbuild/win32-ia32": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.2.tgz", + "integrity": "sha512-47gL/ek1v36iN0wL9L4Q2MFdujR0poLZMJwhO2/N3gA89jgHp4MR8DKCmwYtGNksbfJb9JoTtbkoe6sDhg2QTA==", + "dev": true, + "optional": true + }, + "@esbuild/win32-x64": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.2.tgz", + "integrity": "sha512-tcuhV7ncXBqbt/Ybf0IyrMcwVOAPDckMK9rXNHtF17UTK18OKLpg08glminN06pt2WCoALhXdLfSPbVvK/6fxw==", "dev": true, "optional": true }, @@ -4638,12 +5102,6 @@ } } }, - "@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "dev": true - }, "@jest/schemas": { "version": "29.6.0", "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.0.tgz", @@ -4901,12 +5359,6 @@ "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.1.tgz", "integrity": "sha512-/K3ds8TRAfBvi5vfjuz8y6+GiAYBZ0x4tXv1Av6CWBWn0IlADc+ZX9pMq7oU0fNQPnBwIZl3rmeLp6SBApbxSQ==" }, - "@types/istanbul-lib-coverage": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", - "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", - "dev": true - }, "@types/long": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz", @@ -4951,19 +5403,6 @@ "@types/node": "*" } }, - "@vitest/coverage-c8": { - "version": "0.33.0", - "resolved": "https://registry.npmjs.org/@vitest/coverage-c8/-/coverage-c8-0.33.0.tgz", - "integrity": "sha512-DaF1zJz4dcOZS4k/neiQJokmOWqsGXwhthfmUdPGorXIQHjdPvV6JQSYhQDI41MyI8c+IieQUdIDs5XAMHtDDw==", - "dev": true, - "requires": { - "@ampproject/remapping": "^2.2.1", - "c8": "^7.14.0", - "magic-string": "^0.30.1", - "picocolors": "^1.0.0", - "std-env": "^3.3.3" - } - }, "@vitest/expect": { "version": "0.33.0", "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-0.33.0.tgz", @@ -5248,26 +5687,6 @@ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" }, - "c8": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/c8/-/c8-7.14.0.tgz", - "integrity": "sha512-i04rtkkcNcCf7zsQcSv/T9EbUn4RXQ6mropeMcjFOsQXQ0iGLAr/xT6TImQg4+U9hmNpN9XdvPkjUL1IzbgxJw==", - "dev": true, - "requires": { - "@bcoe/v8-coverage": "^0.2.3", - "@istanbuljs/schema": "^0.1.3", - "find-up": "^5.0.0", - "foreground-child": "^2.0.0", - "istanbul-lib-coverage": "^3.2.0", - "istanbul-lib-report": "^3.0.0", - "istanbul-reports": "^3.1.4", - "rimraf": "^3.0.2", - "test-exclude": "^6.0.0", - "v8-to-istanbul": "^9.0.0", - "yargs": "^16.2.0", - "yargs-parser": "^20.2.9" - } - }, "cac": { "version": "6.7.14", "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", @@ -5398,12 +5817,6 @@ "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==" }, - "convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", - "dev": true - }, "cookie": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", @@ -5426,17 +5839,6 @@ "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", "dev": true }, - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, "debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -5553,33 +5955,33 @@ } }, "esbuild": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.19.tgz", - "integrity": "sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==", - "dev": true, - "requires": { - "@esbuild/android-arm": "0.17.19", - "@esbuild/android-arm64": "0.17.19", - "@esbuild/android-x64": "0.17.19", - "@esbuild/darwin-arm64": "0.17.19", - "@esbuild/darwin-x64": "0.17.19", - "@esbuild/freebsd-arm64": "0.17.19", - "@esbuild/freebsd-x64": "0.17.19", - "@esbuild/linux-arm": "0.17.19", - "@esbuild/linux-arm64": "0.17.19", - "@esbuild/linux-ia32": "0.17.19", - "@esbuild/linux-loong64": "0.17.19", - "@esbuild/linux-mips64el": "0.17.19", - "@esbuild/linux-ppc64": "0.17.19", - "@esbuild/linux-riscv64": "0.17.19", - "@esbuild/linux-s390x": "0.17.19", - "@esbuild/linux-x64": "0.17.19", - "@esbuild/netbsd-x64": "0.17.19", - "@esbuild/openbsd-x64": "0.17.19", - "@esbuild/sunos-x64": "0.17.19", - "@esbuild/win32-arm64": "0.17.19", - "@esbuild/win32-ia32": "0.17.19", - "@esbuild/win32-x64": "0.17.19" + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.2.tgz", + "integrity": "sha512-G6hPax8UbFakEj3hWO0Vs52LQ8k3lnBhxZWomUJDxfz3rZTLqF5k/FCzuNdLx2RbpBiQQF9H9onlDDH1lZsnjg==", + "dev": true, + "requires": { + "@esbuild/android-arm": "0.19.2", + "@esbuild/android-arm64": "0.19.2", + "@esbuild/android-x64": "0.19.2", + "@esbuild/darwin-arm64": "0.19.2", + "@esbuild/darwin-x64": "0.19.2", + "@esbuild/freebsd-arm64": "0.19.2", + "@esbuild/freebsd-x64": "0.19.2", + "@esbuild/linux-arm": "0.19.2", + "@esbuild/linux-arm64": "0.19.2", + "@esbuild/linux-ia32": "0.19.2", + "@esbuild/linux-loong64": "0.19.2", + "@esbuild/linux-mips64el": "0.19.2", + "@esbuild/linux-ppc64": "0.19.2", + "@esbuild/linux-riscv64": "0.19.2", + "@esbuild/linux-s390x": "0.19.2", + "@esbuild/linux-x64": "0.19.2", + "@esbuild/netbsd-x64": "0.19.2", + "@esbuild/openbsd-x64": "0.19.2", + "@esbuild/sunos-x64": "0.19.2", + "@esbuild/win32-arm64": "0.19.2", + "@esbuild/win32-ia32": "0.19.2", + "@esbuild/win32-x64": "0.19.2" } }, "escalade": { @@ -5746,31 +6148,11 @@ } } }, - "find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "requires": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - } - }, "follow-redirects": { "version": "1.15.2", "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==" }, - "foreground-child": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", - "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", - "dev": true, - "requires": { - "cross-spawn": "^7.0.0", - "signal-exit": "^3.0.2" - } - }, "form-data": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", @@ -6049,12 +6431,6 @@ "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", "dev": true }, - "html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true - }, "http-errors": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", @@ -6188,39 +6564,6 @@ "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", "dev": true }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "istanbul-lib-coverage": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", - "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", - "dev": true - }, - "istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", - "dev": true, - "requires": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^3.0.0", - "supports-color": "^7.1.0" - } - }, - "istanbul-reports": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", - "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", - "dev": true, - "requires": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - } - }, "jsesc": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", @@ -6254,15 +6597,6 @@ "integrity": "sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==", "dev": true }, - "locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "requires": { - "p-locate": "^5.0.0" - } - }, "lodash.camelcase": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", @@ -6604,46 +6938,16 @@ "integrity": "sha512-Wo8VsW4IRQSKVXsJCn7TomUaVtyfjVDn3nUP7kE967BQk0CwFpdbZs0X0uk5sW9mkBa9eNM7hCMaG93WUAwxYQ==", "dev": true }, - "p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "requires": { - "yocto-queue": "^0.1.0" - } - }, - "p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "requires": { - "p-limit": "^3.0.2" - } - }, "parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true - }, "path-parse": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", @@ -7063,21 +7367,6 @@ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true - }, "side-channel": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", @@ -7330,17 +7619,6 @@ "readable-stream": "^3.1.1" } }, - "test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", - "dev": true, - "requires": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - } - }, "tinybench": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.5.0.tgz", @@ -7405,13 +7683,6 @@ "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", "dev": true }, - "ts-essentials": { - "version": "9.3.2", - "resolved": "https://registry.npmjs.org/ts-essentials/-/ts-essentials-9.3.2.tgz", - "integrity": "sha512-JxKJzuWqH1MmH4ZFHtJzGEhkfN3QvVR3C3w+4BIoWeoY68UVVoA2Np/Bca9z0IPSErVCWhv439aT0We4Dks8kQ==", - "dev": true, - "requires": {} - }, "ts-node": { "version": "10.9.1", "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", @@ -7521,17 +7792,6 @@ "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", "dev": true }, - "v8-to-istanbul": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.1.0.tgz", - "integrity": "sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA==", - "dev": true, - "requires": { - "@jridgewell/trace-mapping": "^0.3.12", - "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^1.6.0" - } - }, "vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", @@ -7549,6 +7809,111 @@ "rollup": "^3.25.2" }, "dependencies": { + "@esbuild/android-arm": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.12.tgz", + "integrity": "sha512-LIxaNIQfkFZbTLb4+cX7dozHlAbAshhFE5PKdro0l+FnCpx1GDJaQ2WMcqm+ToXKMt8p8Uojk/MFRuGyz3V5Sw==", + "dev": true, + "optional": true + }, + "@esbuild/android-arm64": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.12.tgz", + "integrity": "sha512-BMAlczRqC/LUt2P97E4apTBbkvS9JTJnp2DKFbCwpZ8vBvXVbNdqmvzW/OsdtI/+mGr+apkkpqGM8WecLkPgrA==", + "dev": true, + "optional": true + }, + "@esbuild/android-x64": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.12.tgz", + "integrity": "sha512-zU5MyluNsykf5cOJ0LZZZjgAHbhPJ1cWfdH1ZXVMXxVMhEV0VZiZXQdwBBVvmvbF28EizeK7obG9fs+fpmS0eQ==", + "dev": true, + "optional": true + }, + "@esbuild/darwin-arm64": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.12.tgz", + "integrity": "sha512-zUZMep7YONnp6954QOOwEBwFX9svlKd3ov6PkxKd53LGTHsp/gy7vHaPGhhjBmEpqXEXShi6dddjIkmd+NgMsA==", + "dev": true, + "optional": true + }, + "@esbuild/darwin-x64": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.12.tgz", + "integrity": "sha512-ohqLPc7i67yunArPj1+/FeeJ7AgwAjHqKZ512ADk3WsE3FHU9l+m5aa7NdxXr0HmN1bjDlUslBjWNbFlD9y12Q==", + "dev": true, + "optional": true + }, + "@esbuild/freebsd-arm64": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.12.tgz", + "integrity": "sha512-GIIHtQXqgeOOqdG16a/A9N28GpkvjJnjYMhOnXVbn3EDJcoItdR58v/pGN31CHjyXDc8uCcRnFWmqaJt24AYJg==", + "dev": true, + "optional": true + }, + "@esbuild/freebsd-x64": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.12.tgz", + "integrity": "sha512-zK0b9a1/0wZY+6FdOS3BpZcPc1kcx2G5yxxfEJtEUzVxI6n/FrC2Phsxj/YblPuBchhBZ/1wwn7AyEBUyNSa6g==", + "dev": true, + "optional": true + }, + "@esbuild/linux-arm": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.12.tgz", + "integrity": "sha512-y75OijvrBE/1XRrXq1jtrJfG26eHeMoqLJ2dwQNwviwTuTtHGCojsDO6BJNF8gU+3jTn1KzJEMETytwsFSvc+Q==", + "dev": true, + "optional": true + }, + "@esbuild/linux-arm64": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.12.tgz", + "integrity": "sha512-JKgG8Q/LL/9sw/iHHxQyVMoQYu3rU3+a5Z87DxC+wAu3engz+EmctIrV+FGOgI6gWG1z1+5nDDbXiRMGQZXqiw==", + "dev": true, + "optional": true + }, + "@esbuild/linux-ia32": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.12.tgz", + "integrity": "sha512-yoRIAqc0B4lDIAAEFEIu9ttTRFV84iuAl0KNCN6MhKLxNPfzwCBvEMgwco2f71GxmpBcTtn7KdErueZaM2rEvw==", + "dev": true, + "optional": true + }, + "@esbuild/linux-loong64": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.12.tgz", + "integrity": "sha512-qYgt3dHPVvf/MgbIBpJ4Sup/yb9DAopZ3a2JgMpNKIHUpOdnJ2eHBo/aQdnd8dJ21X/+sS58wxHtA9lEazYtXQ==", + "dev": true, + "optional": true + }, + "@esbuild/linux-mips64el": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.12.tgz", + "integrity": "sha512-wHphlMLK4ufNOONqukELfVIbnGQJrHJ/mxZMMrP2jYrPgCRZhOtf0kC4yAXBwnfmULimV1qt5UJJOw4Kh13Yfg==", + "dev": true, + "optional": true + }, + "@esbuild/linux-ppc64": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.12.tgz", + "integrity": "sha512-TeN//1Ft20ZZW41+zDSdOI/Os1bEq5dbvBvYkberB7PHABbRcsteeoNVZFlI0YLpGdlBqohEpjrn06kv8heCJg==", + "dev": true, + "optional": true + }, + "@esbuild/linux-riscv64": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.12.tgz", + "integrity": "sha512-AgUebVS4DoAblBgiB2ACQ/8l4eGE5aWBb8ZXtkXHiET9mbj7GuWt3OnsIW/zX+XHJt2RYJZctbQ2S/mDjbp0UA==", + "dev": true, + "optional": true + }, + "@esbuild/linux-s390x": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.12.tgz", + "integrity": "sha512-dJ3Rb3Ei2u/ysSXd6pzleGtfDdc2MuzKt8qc6ls8vreP1G3B7HInX3i7gXS4BGeVd24pp0yqyS7bJ5NHaI9ing==", + "dev": true, + "optional": true + }, "@esbuild/linux-x64": { "version": "0.18.12", "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.12.tgz", @@ -7556,6 +7921,48 @@ "dev": true, "optional": true }, + "@esbuild/netbsd-x64": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.12.tgz", + "integrity": "sha512-55FzVCAiwE9FK8wWeCRuvjazNRJ1QqLCYGZVB6E8RuQuTeStSwotpSW4xoRGwp3a1wUsaVCdYcj5LGCASVJmMg==", + "dev": true, + "optional": true + }, + "@esbuild/openbsd-x64": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.12.tgz", + "integrity": "sha512-qnluf8rfb6Y5Lw2tirfK2quZOBbVqmwxut7GPCIJsM8lc4AEUj9L8y0YPdLaPK0TECt4IdyBdBD/KRFKorlK3g==", + "dev": true, + "optional": true + }, + "@esbuild/sunos-x64": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.12.tgz", + "integrity": "sha512-+RkKpVQR7bICjTOPUpkTBTaJ4TFqQBX5Ywyd/HSdDkQGn65VPkTsR/pL4AMvuMWy+wnXgIl4EY6q4mVpJal8Kg==", + "dev": true, + "optional": true + }, + "@esbuild/win32-arm64": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.12.tgz", + "integrity": "sha512-GNHuciv0mFM7ouzsU0+AwY+7eV4Mgo5WnbhfDCQGtpvOtD1vbOiRjPYG6dhmMoFyBjj+pNqQu2X+7DKn0KQ/Gw==", + "dev": true, + "optional": true + }, + "@esbuild/win32-ia32": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.12.tgz", + "integrity": "sha512-kR8cezhYipbbypGkaqCTWIeu4zID17gamC8YTPXYtcN3E5BhhtTnwKBn9I0PJur/T6UVwIEGYzkffNL0lFvxEw==", + "dev": true, + "optional": true + }, + "@esbuild/win32-x64": { + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.12.tgz", + "integrity": "sha512-O0UYQVkvfM/jO8a4OwoV0mAKSJw+mjWTAd1MJd/1FCX6uiMdLmMRPK/w6e9OQ0ob2WGxzIm9va/KG0Ja4zIOgg==", + "dev": true, + "optional": true + }, "esbuild": { "version": "0.18.12", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.12.tgz", @@ -7662,15 +8069,6 @@ "why-is-node-running": "^2.2.2" } }, - "vitest-mock-extended": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/vitest-mock-extended/-/vitest-mock-extended-1.1.4.tgz", - "integrity": "sha512-MKPdepFjk0CE7Ocb5txntHK/sloHO9s0Kk9dr630uL03shRSHMkZtSs5CBPsbJ8K/CvYLv0GHUmMt2zWks2eXg==", - "dev": true, - "requires": { - "ts-essentials": "^9.3.2" - } - }, "webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", @@ -7687,15 +8085,6 @@ "webidl-conversions": "^3.0.0" } }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, "why-is-node-running": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.2.2.tgz", @@ -7773,12 +8162,6 @@ "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", "dev": true - }, - "yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true } } } diff --git a/services/gateway/package.json b/services/gateway/package.json index 3701cf5e..48f09aff 100644 --- a/services/gateway/package.json +++ b/services/gateway/package.json @@ -26,18 +26,16 @@ "@types/amqplib": "^0.10.1", "@types/google-protobuf": "^3.15.6", "@types/node": "^18.15.9", - "@vitest/coverage-c8": "^0.33.0", - "esbuild": "^0.17.18", - "grpc_tools_node_protoc_ts": "^5.3.3", + "esbuild": "^0.19.2", "grpc-tools": "^1.12.4", + "grpc_tools_node_protoc_ts": "^5.3.3", "nodemon": "^3.0.1", "pkg": "^5.8.1", "ts-node": "10.9.1", "tsconfig-paths": "^4.2.0", "typescript": "5.0.2", "vite-tsconfig-paths": "^4.2.0", - "vitest": "^0.33.0", - "vitest-mock-extended": "^1.1.4" + "vitest": "^0.33.0" }, "pkg": { "scripts": "./src/dist/index.js", diff --git a/services/gateway/pnpm-lock.yaml b/services/gateway/pnpm-lock.yaml new file mode 100644 index 00000000..2e906873 --- /dev/null +++ b/services/gateway/pnpm-lock.yaml @@ -0,0 +1,2978 @@ +lockfileVersion: '6.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +dependencies: + '@grpc/grpc-js': + specifier: ^1.9.0 + version: 1.9.0 + '@types/express': + specifier: ^4.17.17 + version: 4.17.17 + axios: + specifier: ^1.4.0 + version: 1.4.0 + body-parser: + specifier: ^1.20.2 + version: 1.20.2 + dotenv: + specifier: ^16.0.3 + version: 16.3.1 + express: + specifier: ^4.18.2 + version: 4.18.2 + google-protobuf: + specifier: ^3.21.2 + version: 3.21.2 + swagger-autogen: + specifier: ^2.23.5 + version: 2.23.5 + +devDependencies: + '@types/amqplib': + specifier: ^0.10.1 + version: 0.10.1 + '@types/google-protobuf': + specifier: ^3.15.6 + version: 3.15.6 + '@types/node': + specifier: ^18.15.9 + version: 18.17.6 + esbuild: + specifier: ^0.19.2 + version: 0.19.2 + grpc-tools: + specifier: ^1.12.4 + version: 1.12.4 + grpc_tools_node_protoc_ts: + specifier: ^5.3.3 + version: 5.3.3 + nodemon: + specifier: ^3.0.1 + version: 3.0.1 + pkg: + specifier: ^5.8.1 + version: 5.8.1 + ts-node: + specifier: 10.9.1 + version: 10.9.1(@types/node@18.17.6)(typescript@5.0.2) + tsconfig-paths: + specifier: ^4.2.0 + version: 4.2.0 + typescript: + specifier: 5.0.2 + version: 5.0.2 + vite-tsconfig-paths: + specifier: ^4.2.0 + version: 4.2.0(typescript@5.0.2) + vitest: + specifier: ^0.33.0 + version: 0.33.0 + +packages: + + /@babel/generator@7.18.2: + resolution: {integrity: sha512-W1lG5vUwFvfMd8HVXqdfbuG7RuaSrTCCD8cl8fP8wOivdbtbIg2Db3IWUcgvfxKbbn6ZBGYRW/Zk1MIwK49mgw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.19.0 + '@jridgewell/gen-mapping': 0.3.3 + jsesc: 2.5.2 + 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.5: + resolution: {integrity: sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/parser@7.18.4: + resolution: {integrity: sha512-FDge0dFazETFcxGw/EXzOkN8uJp0PC7Qbm+Pe9T+av2zlBpOgunFHkQPPn+eRuClU73JF+98D531UgayY89tow==} + engines: {node: '>=6.0.0'} + hasBin: true + dependencies: + '@babel/types': 7.19.0 + dev: true + + /@babel/types@7.19.0: + resolution: {integrity: sha512-YuGopBq3ke25BVSiS6fgF49Ul9gH1x70Bcr6bqRLjWCkcX8Hre1/5+z+IiWOIerRMSSEfGZVB9z9kyq7wVs9YA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-string-parser': 7.22.5 + '@babel/helper-validator-identifier': 7.22.5 + to-fast-properties: 2.0.0 + 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 + + /@esbuild/android-arm64@0.18.20: + resolution: {integrity: sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-arm64@0.19.2: + resolution: {integrity: sha512-lsB65vAbe90I/Qe10OjkmrdxSX4UJDjosDgb8sZUKcg3oefEuW2OT2Vozz8ef7wrJbMcmhvCC+hciF8jY/uAkw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-arm@0.18.20: + resolution: {integrity: sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-arm@0.19.2: + resolution: {integrity: sha512-tM8yLeYVe7pRyAu9VMi/Q7aunpLwD139EY1S99xbQkT4/q2qa6eA4ige/WJQYdJ8GBL1K33pPFhPfPdJ/WzT8Q==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-x64@0.18.20: + resolution: {integrity: sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-x64@0.19.2: + resolution: {integrity: sha512-qK/TpmHt2M/Hg82WXHRc/W/2SGo/l1thtDHZWqFq7oi24AjZ4O/CpPSu6ZuYKFkEgmZlFoa7CooAyYmuvnaG8w==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-arm64@0.18.20: + resolution: {integrity: sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-arm64@0.19.2: + resolution: {integrity: sha512-Ora8JokrvrzEPEpZO18ZYXkH4asCdc1DLdcVy8TGf5eWtPO1Ie4WroEJzwI52ZGtpODy3+m0a2yEX9l+KUn0tA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-x64@0.18.20: + resolution: {integrity: sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-x64@0.19.2: + resolution: {integrity: sha512-tP+B5UuIbbFMj2hQaUr6EALlHOIOmlLM2FK7jeFBobPy2ERdohI4Ka6ZFjZ1ZYsrHE/hZimGuU90jusRE0pwDw==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-arm64@0.18.20: + resolution: {integrity: sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-arm64@0.19.2: + resolution: {integrity: sha512-YbPY2kc0acfzL1VPVK6EnAlig4f+l8xmq36OZkU0jzBVHcOTyQDhnKQaLzZudNJQyymd9OqQezeaBgkTGdTGeQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-x64@0.18.20: + resolution: {integrity: sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-x64@0.19.2: + resolution: {integrity: sha512-nSO5uZT2clM6hosjWHAsS15hLrwCvIWx+b2e3lZ3MwbYSaXwvfO528OF+dLjas1g3bZonciivI8qKR/Hm7IWGw==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm64@0.18.20: + resolution: {integrity: sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm64@0.19.2: + resolution: {integrity: sha512-ig2P7GeG//zWlU0AggA3pV1h5gdix0MA3wgB+NsnBXViwiGgY77fuN9Wr5uoCrs2YzaYfogXgsWZbm+HGr09xg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm@0.18.20: + resolution: {integrity: sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm@0.19.2: + resolution: {integrity: sha512-Odalh8hICg7SOD7XCj0YLpYCEc+6mkoq63UnExDCiRA2wXEmGlK5JVrW50vZR9Qz4qkvqnHcpH+OFEggO3PgTg==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ia32@0.18.20: + resolution: {integrity: sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ia32@0.19.2: + resolution: {integrity: sha512-mLfp0ziRPOLSTek0Gd9T5B8AtzKAkoZE70fneiiyPlSnUKKI4lp+mGEnQXcQEHLJAcIYDPSyBvsUbKUG2ri/XQ==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-loong64@0.18.20: + resolution: {integrity: sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-loong64@0.19.2: + resolution: {integrity: sha512-hn28+JNDTxxCpnYjdDYVMNTR3SKavyLlCHHkufHV91fkewpIyQchS1d8wSbmXhs1fiYDpNww8KTFlJ1dHsxeSw==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-mips64el@0.18.20: + resolution: {integrity: sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-mips64el@0.19.2: + resolution: {integrity: sha512-KbXaC0Sejt7vD2fEgPoIKb6nxkfYW9OmFUK9XQE4//PvGIxNIfPk1NmlHmMg6f25x57rpmEFrn1OotASYIAaTg==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ppc64@0.18.20: + resolution: {integrity: sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ppc64@0.19.2: + resolution: {integrity: sha512-dJ0kE8KTqbiHtA3Fc/zn7lCd7pqVr4JcT0JqOnbj4LLzYnp+7h8Qi4yjfq42ZlHfhOCM42rBh0EwHYLL6LEzcw==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-riscv64@0.18.20: + resolution: {integrity: sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-riscv64@0.19.2: + resolution: {integrity: sha512-7Z/jKNFufZ/bbu4INqqCN6DDlrmOTmdw6D0gH+6Y7auok2r02Ur661qPuXidPOJ+FSgbEeQnnAGgsVynfLuOEw==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-s390x@0.18.20: + resolution: {integrity: sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-s390x@0.19.2: + resolution: {integrity: sha512-U+RinR6aXXABFCcAY4gSlv4CL1oOVvSSCdseQmGO66H+XyuQGZIUdhG56SZaDJQcLmrSfRmx5XZOWyCJPRqS7g==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-x64@0.18.20: + resolution: {integrity: sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-x64@0.19.2: + resolution: {integrity: sha512-oxzHTEv6VPm3XXNaHPyUTTte+3wGv7qVQtqaZCrgstI16gCuhNOtBXLEBkBREP57YTd68P0VgDgG73jSD8bwXQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/netbsd-x64@0.18.20: + resolution: {integrity: sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/netbsd-x64@0.19.2: + resolution: {integrity: sha512-WNa5zZk1XpTTwMDompZmvQLHszDDDN7lYjEHCUmAGB83Bgs20EMs7ICD+oKeT6xt4phV4NDdSi/8OfjPbSbZfQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/openbsd-x64@0.18.20: + resolution: {integrity: sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/openbsd-x64@0.19.2: + resolution: {integrity: sha512-S6kI1aT3S++Dedb7vxIuUOb3oAxqxk2Rh5rOXOTYnzN8JzW1VzBd+IqPiSpgitu45042SYD3HCoEyhLKQcDFDw==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/sunos-x64@0.18.20: + resolution: {integrity: sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: true + optional: true + + /@esbuild/sunos-x64@0.19.2: + resolution: {integrity: sha512-VXSSMsmb+Z8LbsQGcBMiM+fYObDNRm8p7tkUDMPG/g4fhFX5DEFmjxIEa3N8Zr96SjsJ1woAhF0DUnS3MF3ARw==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-arm64@0.18.20: + resolution: {integrity: sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-arm64@0.19.2: + resolution: {integrity: sha512-5NayUlSAyb5PQYFAU9x3bHdsqB88RC3aM9lKDAz4X1mo/EchMIT1Q+pSeBXNgkfNmRecLXA0O8xP+x8V+g/LKg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-ia32@0.18.20: + resolution: {integrity: sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-ia32@0.19.2: + resolution: {integrity: sha512-47gL/ek1v36iN0wL9L4Q2MFdujR0poLZMJwhO2/N3gA89jgHp4MR8DKCmwYtGNksbfJb9JoTtbkoe6sDhg2QTA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-x64@0.18.20: + resolution: {integrity: sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-x64@0.19.2: + resolution: {integrity: sha512-tcuhV7ncXBqbt/Ybf0IyrMcwVOAPDckMK9rXNHtF17UTK18OKLpg08glminN06pt2WCoALhXdLfSPbVvK/6fxw==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@grpc/grpc-js@1.9.0: + resolution: {integrity: sha512-H8+iZh+kCE6VR/Krj6W28Y/ZlxoZ1fOzsNt77nrdE3knkbSelW1Uus192xOFCxHyeszLj8i4APQkSIXjAoOxXg==} + engines: {node: ^8.13.0 || >=10.10.0} + dependencies: + '@grpc/proto-loader': 0.7.8 + '@types/node': 18.17.6 + dev: false + + /@grpc/proto-loader@0.7.8: + resolution: {integrity: sha512-GU12e2c8dmdXb7XUlOgYWZ2o2i+z9/VeACkxTA/zzAe2IjclC5PnVL0lpgjhrqfpDYHzM8B1TF6pqWegMYAzlA==} + engines: {node: '>=6'} + hasBin: true + dependencies: + '@types/long': 4.0.2 + lodash.camelcase: 4.3.0 + long: 4.0.0 + protobufjs: 7.2.4 + yargs: 17.7.2 + dev: false + + /@jest/schemas@29.6.0: + resolution: {integrity: sha512-rxLjXyJBTL4LQeJW3aKo0M/+GkCOXsO+8i9Iu7eDb6KwtP65ayoDsitrdPBtujxQ88k4wI2FNYfa6TOGwSn6cQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@sinclair/typebox': 0.27.8 + 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 + + /@mapbox/node-pre-gyp@1.0.11: + resolution: {integrity: sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==} + hasBin: true + dependencies: + detect-libc: 2.0.2 + https-proxy-agent: 5.0.1 + make-dir: 3.1.0 + node-fetch: 2.6.13 + nopt: 5.0.0 + npmlog: 5.0.1 + rimraf: 3.0.2 + semver: 7.5.4 + tar: 6.1.15 + transitivePeerDependencies: + - encoding + - supports-color + dev: true + + /@nodelib/fs.scandir@2.1.5: + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + dev: true + + /@nodelib/fs.stat@2.0.5: + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + dev: true + + /@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: true + + /@protobufjs/aspromise@1.1.2: + resolution: {integrity: sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==} + dev: false + + /@protobufjs/base64@1.1.2: + resolution: {integrity: sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==} + dev: false + + /@protobufjs/codegen@2.0.4: + resolution: {integrity: sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==} + dev: false + + /@protobufjs/eventemitter@1.1.0: + resolution: {integrity: sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==} + dev: false + + /@protobufjs/fetch@1.1.0: + resolution: {integrity: sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==} + dependencies: + '@protobufjs/aspromise': 1.1.2 + '@protobufjs/inquire': 1.1.0 + dev: false + + /@protobufjs/float@1.0.2: + resolution: {integrity: sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==} + dev: false + + /@protobufjs/inquire@1.1.0: + resolution: {integrity: sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==} + dev: false + + /@protobufjs/path@1.1.2: + resolution: {integrity: sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==} + dev: false + + /@protobufjs/pool@1.1.0: + resolution: {integrity: sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==} + dev: false + + /@protobufjs/utf8@1.1.0: + resolution: {integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==} + dev: false + + /@sinclair/typebox@0.27.8: + resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} + dev: true + + /@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/amqplib@0.10.1: + resolution: {integrity: sha512-j6ANKT79ncUDnAs/+9r9eDujxbeJoTjoVu33gHHcaPfmLQaMhvfbH2GqSe8KUM444epAp1Vl3peVOQfZk3UIqA==} + dependencies: + '@types/node': 18.17.6 + dev: true + + /@types/body-parser@1.19.2: + resolution: {integrity: sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==} + dependencies: + '@types/connect': 3.4.35 + '@types/node': 18.17.6 + dev: false + + /@types/chai-subset@1.3.3: + resolution: {integrity: sha512-frBecisrNGz+F4T6bcc+NLeolfiojh5FxW2klu669+8BARtyQv2C/GkNW6FUodVe4BroGMP/wER/YDGc7rEllw==} + dependencies: + '@types/chai': 4.3.5 + dev: true + + /@types/chai@4.3.5: + resolution: {integrity: sha512-mEo1sAde+UCE6b2hxn332f1g1E8WfYRu6p5SvTKr2ZKC1f7gFJXk4h5PyGP9Dt6gCaG8y8XhwnXWC6Iy2cmBng==} + dev: true + + /@types/connect@3.4.35: + resolution: {integrity: sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==} + dependencies: + '@types/node': 18.17.6 + dev: false + + /@types/express-serve-static-core@4.17.35: + resolution: {integrity: sha512-wALWQwrgiB2AWTT91CB62b6Yt0sNHpznUXeZEcnPU3DRdlDIz74x8Qg1UUYKSVFi+va5vKOLYRBI1bRKiLLKIg==} + dependencies: + '@types/node': 18.17.6 + '@types/qs': 6.9.7 + '@types/range-parser': 1.2.4 + '@types/send': 0.17.1 + dev: false + + /@types/express@4.17.17: + resolution: {integrity: sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==} + dependencies: + '@types/body-parser': 1.19.2 + '@types/express-serve-static-core': 4.17.35 + '@types/qs': 6.9.7 + '@types/serve-static': 1.15.2 + dev: false + + /@types/google-protobuf@3.15.6: + resolution: {integrity: sha512-pYVNNJ+winC4aek+lZp93sIKxnXt5qMkuKmaqS3WGuTq0Bw1ZDYNBgzG5kkdtwcv+GmYJGo3yEg6z2cKKAiEdw==} + dev: true + + /@types/http-errors@2.0.1: + resolution: {integrity: sha512-/K3ds8TRAfBvi5vfjuz8y6+GiAYBZ0x4tXv1Av6CWBWn0IlADc+ZX9pMq7oU0fNQPnBwIZl3rmeLp6SBApbxSQ==} + dev: false + + /@types/long@4.0.2: + resolution: {integrity: sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==} + dev: false + + /@types/mime@1.3.2: + resolution: {integrity: sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==} + dev: false + + /@types/mime@3.0.1: + resolution: {integrity: sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA==} + dev: false + + /@types/node@18.17.6: + resolution: {integrity: sha512-fGmT/P7z7ecA6bv/ia5DlaWCH4YeZvAQMNpUhrJjtAhOhZfoxS1VLUgU2pdk63efSjQaOJWdXMuAJsws+8I6dg==} + + /@types/qs@6.9.7: + resolution: {integrity: sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==} + dev: false + + /@types/range-parser@1.2.4: + resolution: {integrity: sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==} + dev: false + + /@types/send@0.17.1: + resolution: {integrity: sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q==} + dependencies: + '@types/mime': 1.3.2 + '@types/node': 18.17.6 + dev: false + + /@types/serve-static@1.15.2: + resolution: {integrity: sha512-J2LqtvFYCzaj8pVYKw8klQXrLLk7TBZmQ4ShlcdkELFKGwGMfevMLneMMRkMgZxotOD9wg497LpC7O8PcvAmfw==} + dependencies: + '@types/http-errors': 2.0.1 + '@types/mime': 3.0.1 + '@types/node': 18.17.6 + dev: false + + /@vitest/expect@0.33.0: + resolution: {integrity: sha512-sVNf+Gla3mhTCxNJx+wJLDPp/WcstOe0Ksqz4Vec51MmgMth/ia0MGFEkIZmVGeTL5HtjYR4Wl/ZxBxBXZJTzQ==} + dependencies: + '@vitest/spy': 0.33.0 + '@vitest/utils': 0.33.0 + chai: 4.3.7 + dev: true + + /@vitest/runner@0.33.0: + resolution: {integrity: sha512-UPfACnmCB6HKRHTlcgCoBh6ppl6fDn+J/xR8dTufWiKt/74Y9bHci5CKB8tESSV82zKYtkBJo9whU3mNvfaisg==} + dependencies: + '@vitest/utils': 0.33.0 + p-limit: 4.0.0 + pathe: 1.1.1 + dev: true + + /@vitest/snapshot@0.33.0: + resolution: {integrity: sha512-tJjrl//qAHbyHajpFvr8Wsk8DIOODEebTu7pgBrP07iOepR5jYkLFiqLq2Ltxv+r0uptUb4izv1J8XBOwKkVYA==} + dependencies: + magic-string: 0.30.2 + pathe: 1.1.1 + pretty-format: 29.6.2 + dev: true + + /@vitest/spy@0.33.0: + resolution: {integrity: sha512-Kv+yZ4hnH1WdiAkPUQTpRxW8kGtH8VRTnus7ZTGovFYM1ZezJpvGtb9nPIjPnptHbsyIAxYZsEpVPYgtpjGnrg==} + dependencies: + tinyspy: 2.1.1 + dev: true + + /@vitest/utils@0.33.0: + resolution: {integrity: sha512-pF1w22ic965sv+EN6uoePkAOTkAPWM03Ri/jXNyMIKBb/XHLDPfhLvf/Fa9g0YECevAIz56oVYXhodLvLQ/awA==} + dependencies: + diff-sequences: 29.4.3 + loupe: 2.3.6 + pretty-format: 29.6.2 + dev: true + + /abbrev@1.1.1: + resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} + dev: true + + /accepts@1.3.8: + resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} + engines: {node: '>= 0.6'} + dependencies: + mime-types: 2.1.35 + negotiator: 0.6.3 + dev: false + + /acorn-walk@8.2.0: + resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} + 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.10.0: + resolution: {integrity: sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==} + engines: {node: '>=0.4.0'} + hasBin: true + dev: true + + /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 + dev: true + + /ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + /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 + + /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 + + /aproba@2.0.0: + resolution: {integrity: sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==} + dev: true + + /are-we-there-yet@2.0.0: + resolution: {integrity: sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==} + engines: {node: '>=10'} + dependencies: + delegates: 1.0.0 + readable-stream: 3.6.2 + dev: true + + /arg@4.1.3: + resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} + dev: true + + /array-flatten@1.1.1: + resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} + dev: false + + /array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + dev: true + + /assertion-error@1.1.0: + resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} + dev: true + + /asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + dev: false + + /at-least-node@1.0.0: + resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} + engines: {node: '>= 4.0.0'} + dev: true + + /axios@1.4.0: + resolution: {integrity: sha512-S4XCWMEmzvo64T9GfvQDOXgYRDJ/wsSZc7Jvdgx5u1sd0JwsuPLqb3SYmusag+edF6ziyMensPVqLTSc1PiSEA==} + dependencies: + follow-redirects: 1.15.2 + form-data: 4.0.0 + proxy-from-env: 1.1.0 + transitivePeerDependencies: + - debug + dev: false + + /balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + /base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + dev: true + + /binary-extensions@2.2.0: + resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} + engines: {node: '>=8'} + dev: true + + /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: true + + /body-parser@1.20.1: + resolution: {integrity: sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + dependencies: + bytes: 3.1.2 + content-type: 1.0.5 + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + on-finished: 2.4.1 + qs: 6.11.0 + raw-body: 2.5.1 + type-is: 1.6.18 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color + dev: false + + /body-parser@1.20.2: + resolution: {integrity: sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + dependencies: + bytes: 3.1.2 + content-type: 1.0.5 + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + on-finished: 2.4.1 + qs: 6.11.0 + raw-body: 2.5.2 + type-is: 1.6.18 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color + dev: false + + /brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + /braces@3.0.2: + resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + engines: {node: '>=8'} + dependencies: + fill-range: 7.0.1 + dev: true + + /buffer@5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + dev: true + + /bytes@3.1.2: + resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} + engines: {node: '>= 0.8'} + dev: false + + /cac@6.7.14: + resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} + engines: {node: '>=8'} + dev: true + + /call-bind@1.0.2: + resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==} + dependencies: + function-bind: 1.1.1 + get-intrinsic: 1.2.1 + dev: false + + /chai@4.3.7: + resolution: {integrity: sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==} + engines: {node: '>=4'} + dependencies: + assertion-error: 1.1.0 + check-error: 1.0.2 + deep-eql: 4.1.3 + get-func-name: 2.0.0 + loupe: 2.3.6 + pathval: 1.1.1 + type-detect: 4.0.8 + dev: true + + /chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + dev: true + + /check-error@1.0.2: + resolution: {integrity: sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==} + dev: true + + /chokidar@3.5.3: + resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} + engines: {node: '>= 8.10.0'} + dependencies: + anymatch: 3.1.3 + braces: 3.0.2 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.2 + dev: true + + /chownr@1.1.4: + resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} + dev: true + + /chownr@2.0.0: + resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} + engines: {node: '>=10'} + dev: true + + /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: true + + /cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + dev: 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 + + /color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + /color-support@1.1.3: + resolution: {integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==} + hasBin: true + dev: true + + /combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + dependencies: + delayed-stream: 1.0.0 + dev: false + + /concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + /console-control-strings@1.1.0: + resolution: {integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==} + dev: true + + /content-disposition@0.5.4: + resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} + engines: {node: '>= 0.6'} + dependencies: + safe-buffer: 5.2.1 + dev: false + + /content-type@1.0.5: + resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} + engines: {node: '>= 0.6'} + dev: false + + /cookie-signature@1.0.6: + resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} + dev: false + + /cookie@0.5.0: + resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==} + engines: {node: '>= 0.6'} + dev: false + + /core-util-is@1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + dev: true + + /create-require@1.1.1: + resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} + dev: true + + /debug@2.6.9: + resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.0.0 + dev: false + + /debug@3.2.7(supports-color@5.5.0): + resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.3 + supports-color: 5.5.0 + dev: true + + /debug@4.3.4: + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.2 + dev: true + + /decompress-response@6.0.0: + resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} + engines: {node: '>=10'} + dependencies: + mimic-response: 3.1.0 + dev: true + + /deep-eql@4.1.3: + resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==} + engines: {node: '>=6'} + dependencies: + type-detect: 4.0.8 + dev: true + + /deep-extend@0.6.0: + resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} + engines: {node: '>=4.0.0'} + dev: true + + /deepmerge@4.3.1: + resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} + engines: {node: '>=0.10.0'} + dev: false + + /delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + dev: false + + /delegates@1.0.0: + resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==} + dev: true + + /depd@2.0.0: + resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} + engines: {node: '>= 0.8'} + dev: false + + /destroy@1.2.0: + resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + dev: false + + /detect-libc@2.0.2: + resolution: {integrity: sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==} + engines: {node: '>=8'} + dev: true + + /diff-sequences@29.4.3: + resolution: {integrity: sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA==} + 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 + dev: true + + /dotenv@16.3.1: + resolution: {integrity: sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==} + engines: {node: '>=12'} + dev: false + + /ee-first@1.1.1: + resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + dev: false + + /emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + /encodeurl@1.0.2: + resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} + engines: {node: '>= 0.8'} + dev: false + + /end-of-stream@1.4.4: + resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + dependencies: + once: 1.4.0 + dev: true + + /esbuild@0.18.20: + resolution: {integrity: sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/android-arm': 0.18.20 + '@esbuild/android-arm64': 0.18.20 + '@esbuild/android-x64': 0.18.20 + '@esbuild/darwin-arm64': 0.18.20 + '@esbuild/darwin-x64': 0.18.20 + '@esbuild/freebsd-arm64': 0.18.20 + '@esbuild/freebsd-x64': 0.18.20 + '@esbuild/linux-arm': 0.18.20 + '@esbuild/linux-arm64': 0.18.20 + '@esbuild/linux-ia32': 0.18.20 + '@esbuild/linux-loong64': 0.18.20 + '@esbuild/linux-mips64el': 0.18.20 + '@esbuild/linux-ppc64': 0.18.20 + '@esbuild/linux-riscv64': 0.18.20 + '@esbuild/linux-s390x': 0.18.20 + '@esbuild/linux-x64': 0.18.20 + '@esbuild/netbsd-x64': 0.18.20 + '@esbuild/openbsd-x64': 0.18.20 + '@esbuild/sunos-x64': 0.18.20 + '@esbuild/win32-arm64': 0.18.20 + '@esbuild/win32-ia32': 0.18.20 + '@esbuild/win32-x64': 0.18.20 + dev: true + + /esbuild@0.19.2: + resolution: {integrity: sha512-G6hPax8UbFakEj3hWO0Vs52LQ8k3lnBhxZWomUJDxfz3rZTLqF5k/FCzuNdLx2RbpBiQQF9H9onlDDH1lZsnjg==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/android-arm': 0.19.2 + '@esbuild/android-arm64': 0.19.2 + '@esbuild/android-x64': 0.19.2 + '@esbuild/darwin-arm64': 0.19.2 + '@esbuild/darwin-x64': 0.19.2 + '@esbuild/freebsd-arm64': 0.19.2 + '@esbuild/freebsd-x64': 0.19.2 + '@esbuild/linux-arm': 0.19.2 + '@esbuild/linux-arm64': 0.19.2 + '@esbuild/linux-ia32': 0.19.2 + '@esbuild/linux-loong64': 0.19.2 + '@esbuild/linux-mips64el': 0.19.2 + '@esbuild/linux-ppc64': 0.19.2 + '@esbuild/linux-riscv64': 0.19.2 + '@esbuild/linux-s390x': 0.19.2 + '@esbuild/linux-x64': 0.19.2 + '@esbuild/netbsd-x64': 0.19.2 + '@esbuild/openbsd-x64': 0.19.2 + '@esbuild/sunos-x64': 0.19.2 + '@esbuild/win32-arm64': 0.19.2 + '@esbuild/win32-ia32': 0.19.2 + '@esbuild/win32-x64': 0.19.2 + dev: true + + /escalade@3.1.1: + resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} + engines: {node: '>=6'} + + /escape-html@1.0.3: + resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + dev: false + + /etag@1.8.1: + resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} + engines: {node: '>= 0.6'} + dev: false + + /expand-template@2.0.3: + resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} + engines: {node: '>=6'} + dev: true + + /express@4.18.2: + resolution: {integrity: sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==} + engines: {node: '>= 0.10.0'} + dependencies: + accepts: 1.3.8 + array-flatten: 1.1.1 + body-parser: 1.20.1 + content-disposition: 0.5.4 + content-type: 1.0.5 + cookie: 0.5.0 + cookie-signature: 1.0.6 + debug: 2.6.9 + depd: 2.0.0 + encodeurl: 1.0.2 + escape-html: 1.0.3 + etag: 1.8.1 + finalhandler: 1.2.0 + fresh: 0.5.2 + http-errors: 2.0.0 + merge-descriptors: 1.0.1 + methods: 1.1.2 + on-finished: 2.4.1 + parseurl: 1.3.3 + path-to-regexp: 0.1.7 + proxy-addr: 2.0.7 + qs: 6.11.0 + range-parser: 1.2.1 + safe-buffer: 5.2.1 + send: 0.18.0 + serve-static: 1.15.0 + setprototypeof: 1.2.0 + statuses: 2.0.1 + type-is: 1.6.18 + utils-merge: 1.0.1 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + 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: true + + /fastq@1.15.0: + resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} + dependencies: + reusify: 1.0.4 + dev: true + + /fill-range@7.0.1: + resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} + engines: {node: '>=8'} + dependencies: + to-regex-range: 5.0.1 + dev: true + + /finalhandler@1.2.0: + resolution: {integrity: sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==} + engines: {node: '>= 0.8'} + dependencies: + debug: 2.6.9 + encodeurl: 1.0.2 + escape-html: 1.0.3 + on-finished: 2.4.1 + parseurl: 1.3.3 + statuses: 2.0.1 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color + dev: false + + /follow-redirects@1.15.2: + resolution: {integrity: sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + 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'} + dev: false + + /fresh@0.5.2: + resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} + engines: {node: '>= 0.6'} + dev: false + + /from2@2.3.0: + resolution: {integrity: sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==} + dependencies: + inherits: 2.0.4 + readable-stream: 2.3.8 + dev: true + + /fs-constants@1.0.0: + resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} + dev: true + + /fs-extra@9.1.0: + resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==} + engines: {node: '>=10'} + dependencies: + at-least-node: 1.0.0 + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.0 + dev: true + + /fs-minipass@2.1.0: + resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} + engines: {node: '>= 8'} + dependencies: + minipass: 3.3.6 + dev: true + + /fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + + /fsevents@2.3.2: + resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /function-bind@1.1.1: + resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} + + /gauge@3.0.2: + resolution: {integrity: sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==} + engines: {node: '>=10'} + dependencies: + aproba: 2.0.0 + color-support: 1.1.3 + console-control-strings: 1.1.0 + has-unicode: 2.0.1 + object-assign: 4.1.1 + signal-exit: 3.0.7 + string-width: 4.2.3 + strip-ansi: 6.0.1 + wide-align: 1.1.5 + dev: true + + /get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + + /get-func-name@2.0.0: + resolution: {integrity: sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==} + dev: true + + /get-intrinsic@1.2.1: + resolution: {integrity: sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==} + dependencies: + function-bind: 1.1.1 + has: 1.0.3 + has-proto: 1.0.1 + has-symbols: 1.0.3 + dev: false + + /github-from-package@0.0.0: + resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==} + dev: true + + /glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + dependencies: + is-glob: 4.0.3 + dev: true + + /glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + + /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 + dev: true + + /globrex@0.1.2: + resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} + dev: true + + /google-protobuf@3.15.8: + resolution: {integrity: sha512-2jtfdqTaSxk0cuBJBtTTWsot4WtR9RVr2rXg7x7OoqiuOKopPrwXpM1G4dXIkLcUNRh3RKzz76C8IOkksZSeOw==} + dev: true + + /google-protobuf@3.21.2: + resolution: {integrity: sha512-3MSOYFO5U9mPGikIYCzK0SaThypfGgS6bHqrUGXG3DPHCrb+txNqeEcns1W0lkGfk0rCyNXm7xB9rMxnCiZOoA==} + dev: false + + /graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + dev: true + + /grpc-tools@1.12.4: + resolution: {integrity: sha512-5+mLAJJma3BjnW/KQp6JBjUMgvu7Mu3dBvBPd1dcbNIb+qiR0817zDpgPjS7gRb+l/8EVNIa3cB02xI9JLToKg==} + hasBin: true + requiresBuild: true + dependencies: + '@mapbox/node-pre-gyp': 1.0.11 + transitivePeerDependencies: + - encoding + - supports-color + dev: true + + /grpc_tools_node_protoc_ts@5.3.3: + resolution: {integrity: sha512-M/YrklvVXMtuuj9kb42PxeouZhs7Ul+R4e/31XwrankUcKL8cQQP50Q9q+KEHGyHQaPt6VtKKsxMgLaKbCxeww==} + hasBin: true + dependencies: + google-protobuf: 3.15.8 + handlebars: 4.7.7 + dev: true + + /handlebars@4.7.7: + resolution: {integrity: sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==} + engines: {node: '>=0.4.7'} + hasBin: true + dependencies: + minimist: 1.2.8 + neo-async: 2.6.2 + source-map: 0.6.1 + wordwrap: 1.0.0 + optionalDependencies: + uglify-js: 3.17.4 + dev: true + + /has-flag@3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + dev: true + + /has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + dev: true + + /has-proto@1.0.1: + resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} + engines: {node: '>= 0.4'} + dev: false + + /has-symbols@1.0.3: + resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} + engines: {node: '>= 0.4'} + dev: false + + /has-unicode@2.0.1: + resolution: {integrity: sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==} + dev: true + + /has@1.0.3: + resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} + engines: {node: '>= 0.4.0'} + dependencies: + function-bind: 1.1.1 + + /http-errors@2.0.0: + resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} + engines: {node: '>= 0.8'} + dependencies: + depd: 2.0.0 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 2.0.1 + toidentifier: 1.0.1 + 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 + 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 + + /ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + dev: true + + /ignore-by-default@1.0.1: + resolution: {integrity: sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==} + dev: true + + /ignore@5.2.4: + resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} + engines: {node: '>= 4'} + dev: true + + /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==} + + /ini@1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + dev: true + + /into-stream@6.0.0: + resolution: {integrity: sha512-XHbaOAvP+uFKUFsOgoNPRjLkwB+I22JFPFe5OjTkQ0nwgj6+pSjb4NmB6VMxaPshLiOf+zcpOCBQuLwC1KHhZA==} + engines: {node: '>=10'} + dependencies: + from2: 2.3.0 + p-is-promise: 3.0.0 + dev: true + + /ipaddr.js@1.9.1: + resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} + engines: {node: '>= 0.10'} + dev: false + + /is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + dependencies: + binary-extensions: 2.2.0 + dev: true + + /is-core-module@2.13.0: + resolution: {integrity: sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==} + dependencies: + has: 1.0.3 + dev: true + + /is-core-module@2.9.0: + resolution: {integrity: sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==} + dependencies: + has: 1.0.3 + dev: true + + /is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + dev: true + + /is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + /is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + dependencies: + is-extglob: 2.1.1 + dev: true + + /is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + dev: true + + /isarray@1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + dev: true + + /jsesc@2.5.2: + resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} + engines: {node: '>=4'} + hasBin: true + dev: true + + /json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + + /jsonc-parser@3.2.0: + resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} + dev: true + + /jsonfile@6.1.0: + resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + dependencies: + universalify: 2.0.0 + optionalDependencies: + graceful-fs: 4.2.11 + dev: true + + /local-pkg@0.4.3: + resolution: {integrity: sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==} + engines: {node: '>=14'} + dev: true + + /lodash.camelcase@4.3.0: + resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} + dev: false + + /long@4.0.0: + resolution: {integrity: sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==} + dev: false + + /long@5.2.3: + resolution: {integrity: sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==} + dev: false + + /loupe@2.3.6: + resolution: {integrity: sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==} + dependencies: + get-func-name: 2.0.0 + dev: true + + /lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + dependencies: + yallist: 4.0.0 + dev: true + + /magic-string@0.30.2: + resolution: {integrity: sha512-lNZdu7pewtq/ZvWUp9Wpf/x7WzMTsR26TWV03BRZrXFsv+BI6dy8RAiKgm1uM/kyR0rCfUcqvOlXKG66KhIGug==} + engines: {node: '>=12'} + 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 + dev: true + + /make-error@1.3.6: + resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + dev: true + + /media-typer@0.3.0: + resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} + engines: {node: '>= 0.6'} + dev: false + + /merge-descriptors@1.0.1: + resolution: {integrity: sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==} + dev: false + + /merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + dev: true + + /methods@1.1.2: + resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} + engines: {node: '>= 0.6'} + 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: true + + /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 + + /mime@1.6.0: + resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} + engines: {node: '>=4'} + hasBin: true + dev: false + + /mimic-response@3.1.0: + resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} + engines: {node: '>=10'} + dev: true + + /minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + dependencies: + brace-expansion: 1.1.11 + + /minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + dev: true + + /minipass@3.3.6: + resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} + engines: {node: '>=8'} + dependencies: + yallist: 4.0.0 + dev: true + + /minipass@5.0.0: + resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} + engines: {node: '>=8'} + dev: true + + /minizlib@2.1.2: + resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} + engines: {node: '>= 8'} + dependencies: + minipass: 3.3.6 + yallist: 4.0.0 + dev: true + + /mkdirp-classic@0.5.3: + resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} + dev: true + + /mkdirp@1.0.4: + resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} + engines: {node: '>=10'} + hasBin: true + dev: true + + /mlly@1.4.0: + resolution: {integrity: sha512-ua8PAThnTwpprIaU47EPeZ/bPUVp2QYBbWMphUQpVdBI3Lgqzm5KZQ45Agm3YJedHXaIHl6pBGabaLSUPPSptg==} + dependencies: + acorn: 8.10.0 + pathe: 1.1.1 + pkg-types: 1.0.3 + ufo: 1.2.0 + dev: true + + /ms@2.0.0: + resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} + dev: false + + /ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + dev: true + + /ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + /multistream@4.1.0: + resolution: {integrity: sha512-J1XDiAmmNpRCBfIWJv+n0ymC4ABcf/Pl+5YvC5B/D2f/2+8PtHvCNxMPKiQcZyi922Hq69J2YOpb1pTywfifyw==} + dependencies: + once: 1.4.0 + readable-stream: 3.6.2 + dev: true + + /nanoid@3.3.6: + resolution: {integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + dev: true + + /napi-build-utils@1.0.2: + resolution: {integrity: sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==} + dev: true + + /negotiator@0.6.3: + resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} + engines: {node: '>= 0.6'} + dev: false + + /neo-async@2.6.2: + resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} + dev: true + + /node-abi@3.47.0: + resolution: {integrity: sha512-2s6B2CWZM//kPgwnuI0KrYwNjfdByE25zvAaEpq9IH4zcNsarH8Ihu/UuX6XMPEogDAxkuUFeZn60pXNHAqn3A==} + engines: {node: '>=10'} + dependencies: + semver: 7.5.4 + dev: true + + /node-fetch@2.6.13: + resolution: {integrity: sha512-StxNAxh15zr77QvvkmveSQ8uCQ4+v5FkvNTj0OESmiHu+VRi/gXArXtkWMElOsOUNLtUEvI4yS+rdtOHZTwlQA==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + dependencies: + whatwg-url: 5.0.0 + dev: true + + /nodemon@3.0.1: + resolution: {integrity: sha512-g9AZ7HmkhQkqXkRc20w+ZfQ73cHLbE8hnPbtaFbFtCumZsjyMhKk9LajQ07U5Ux28lvFjZ5X7HvWR1xzU8jHVw==} + engines: {node: '>=10'} + hasBin: true + dependencies: + chokidar: 3.5.3 + debug: 3.2.7(supports-color@5.5.0) + ignore-by-default: 1.0.1 + minimatch: 3.1.2 + pstree.remy: 1.1.8 + semver: 7.5.4 + simple-update-notifier: 2.0.0 + supports-color: 5.5.0 + touch: 3.1.0 + undefsafe: 2.0.5 + dev: true + + /nopt@1.0.10: + resolution: {integrity: sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==} + hasBin: true + dependencies: + abbrev: 1.1.1 + dev: true + + /nopt@5.0.0: + resolution: {integrity: sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==} + engines: {node: '>=6'} + hasBin: true + dependencies: + abbrev: 1.1.1 + dev: true + + /normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + dev: true + + /npmlog@5.0.1: + resolution: {integrity: sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==} + dependencies: + are-we-there-yet: 2.0.0 + console-control-strings: 1.1.0 + gauge: 3.0.2 + set-blocking: 2.0.0 + dev: true + + /object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + dev: true + + /object-inspect@1.12.3: + resolution: {integrity: sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==} + dev: false + + /on-finished@2.4.1: + resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} + engines: {node: '>= 0.8'} + dependencies: + ee-first: 1.1.1 + dev: false + + /once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + dependencies: + wrappy: 1.0.2 + + /p-is-promise@3.0.0: + resolution: {integrity: sha512-Wo8VsW4IRQSKVXsJCn7TomUaVtyfjVDn3nUP7kE967BQk0CwFpdbZs0X0uk5sW9mkBa9eNM7hCMaG93WUAwxYQ==} + engines: {node: '>=8'} + dev: true + + /p-limit@4.0.0: + resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + yocto-queue: 1.0.0 + dev: true + + /parseurl@1.3.3: + resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} + engines: {node: '>= 0.8'} + dev: false + + /path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + + /path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + dev: true + + /path-to-regexp@0.1.7: + resolution: {integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==} + dev: false + + /path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + dev: true + + /pathe@1.1.1: + resolution: {integrity: sha512-d+RQGp0MAYTIaDBIMmOfMwz3E+LOZnxx1HZd5R18mmCZY0QBlK0LDZfPc8FW8Ed2DlvsuE6PRjroDY+wg4+j/Q==} + dev: true + + /pathval@1.1.1: + resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} + dev: true + + /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'} + dev: true + + /pkg-fetch@3.4.2: + resolution: {integrity: sha512-0+uijmzYcnhC0hStDjm/cl2VYdrmVVBpe7Q8k9YBojxmR5tG8mvR9/nooQq3QSXiQqORDVOTY3XqMEqJVIzkHA==} + hasBin: true + dependencies: + chalk: 4.1.2 + fs-extra: 9.1.0 + https-proxy-agent: 5.0.1 + node-fetch: 2.6.13 + progress: 2.0.3 + semver: 7.5.4 + tar-fs: 2.1.1 + yargs: 16.2.0 + transitivePeerDependencies: + - encoding + - supports-color + dev: true + + /pkg-types@1.0.3: + resolution: {integrity: sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==} + dependencies: + jsonc-parser: 3.2.0 + mlly: 1.4.0 + pathe: 1.1.1 + dev: true + + /pkg@5.8.1: + resolution: {integrity: sha512-CjBWtFStCfIiT4Bde9QpJy0KeH19jCfwZRJqHFDFXfhUklCx8JoFmMj3wgnEYIwGmZVNkhsStPHEOnrtrQhEXA==} + hasBin: true + peerDependencies: + node-notifier: '>=9.0.1' + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@babel/generator': 7.18.2 + '@babel/parser': 7.18.4 + '@babel/types': 7.19.0 + chalk: 4.1.2 + fs-extra: 9.1.0 + globby: 11.1.0 + into-stream: 6.0.0 + is-core-module: 2.9.0 + minimist: 1.2.8 + multistream: 4.1.0 + pkg-fetch: 3.4.2 + prebuild-install: 7.1.1 + resolve: 1.22.4 + stream-meter: 1.0.4 + transitivePeerDependencies: + - encoding + - supports-color + dev: true + + /postcss@8.4.28: + resolution: {integrity: sha512-Z7V5j0cq8oEKyejIKfpD8b4eBy9cwW2JWPk0+fB1HOAMsfHbnAXLLS+PfVWlzMSLQaWttKDt607I0XHmpE67Vw==} + engines: {node: ^10 || ^12 || >=14} + dependencies: + nanoid: 3.3.6 + picocolors: 1.0.0 + source-map-js: 1.0.2 + dev: true + + /prebuild-install@7.1.1: + resolution: {integrity: sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==} + engines: {node: '>=10'} + hasBin: true + dependencies: + detect-libc: 2.0.2 + expand-template: 2.0.3 + github-from-package: 0.0.0 + minimist: 1.2.8 + mkdirp-classic: 0.5.3 + napi-build-utils: 1.0.2 + node-abi: 3.47.0 + pump: 3.0.0 + rc: 1.2.8 + simple-get: 4.0.1 + tar-fs: 2.1.1 + tunnel-agent: 0.6.0 + dev: true + + /pretty-format@29.6.2: + resolution: {integrity: sha512-1q0oC8eRveTg5nnBEWMXAU2qpv65Gnuf2eCQzSjxpWFkPaPARwqZZDGuNE0zPAZfTCHzIk3A8dIjwlQKKLphyg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/schemas': 29.6.0 + 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: true + + /progress@2.0.3: + resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} + engines: {node: '>=0.4.0'} + dev: true + + /protobufjs@7.2.4: + resolution: {integrity: sha512-AT+RJgD2sH8phPmCf7OUZR8xGdcJRga4+1cOaXJ64hvcSkVhNcRHOwIxUatPH15+nj59WAGTDv3LSGZPEQbJaQ==} + engines: {node: '>=12.0.0'} + requiresBuild: true + dependencies: + '@protobufjs/aspromise': 1.1.2 + '@protobufjs/base64': 1.1.2 + '@protobufjs/codegen': 2.0.4 + '@protobufjs/eventemitter': 1.1.0 + '@protobufjs/fetch': 1.1.0 + '@protobufjs/float': 1.0.2 + '@protobufjs/inquire': 1.1.0 + '@protobufjs/path': 1.1.2 + '@protobufjs/pool': 1.1.0 + '@protobufjs/utf8': 1.1.0 + '@types/node': 18.17.6 + long: 5.2.3 + dev: false + + /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 + dev: false + + /proxy-from-env@1.1.0: + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + dev: false + + /pstree.remy@1.1.8: + resolution: {integrity: sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==} + dev: true + + /pump@3.0.0: + resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} + dependencies: + end-of-stream: 1.4.4 + once: 1.4.0 + dev: true + + /qs@6.11.0: + resolution: {integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==} + engines: {node: '>=0.6'} + dependencies: + side-channel: 1.0.4 + dev: false + + /queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + dev: true + + /range-parser@1.2.1: + resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} + engines: {node: '>= 0.6'} + dev: false + + /raw-body@2.5.1: + resolution: {integrity: sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==} + engines: {node: '>= 0.8'} + dependencies: + bytes: 3.1.2 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + unpipe: 1.0.0 + dev: false + + /raw-body@2.5.2: + resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} + engines: {node: '>= 0.8'} + dependencies: + bytes: 3.1.2 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + unpipe: 1.0.0 + dev: false + + /rc@1.2.8: + resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} + hasBin: true + dependencies: + deep-extend: 0.6.0 + ini: 1.3.8 + minimist: 1.2.8 + strip-json-comments: 2.0.1 + dev: true + + /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: true + + /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: true + + /readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + dependencies: + picomatch: 2.3.1 + dev: true + + /require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + + /resolve@1.22.4: + resolution: {integrity: sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==} + hasBin: true + dependencies: + is-core-module: 2.13.0 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + dev: true + + /reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + dev: true + + /rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + hasBin: true + dependencies: + glob: 7.2.3 + dev: true + + /rollup@3.28.0: + resolution: {integrity: sha512-d7zhvo1OUY2SXSM6pfNjgD5+d0Nz87CUp4mt8l/GgVP3oBsPwzNvSzyu1me6BSG9JIgWNTVcafIXBIyM8yQ3yw==} + engines: {node: '>=14.18.0', npm: '>=8.0.0'} + hasBin: true + optionalDependencies: + fsevents: 2.3.2 + dev: true + + /run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + dependencies: + queue-microtask: 1.2.3 + dev: true + + /safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + dev: true + + /safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + /safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + dev: false + + /semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + dev: 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 + dev: true + + /send@0.18.0: + resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==} + engines: {node: '>= 0.8.0'} + dependencies: + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + encodeurl: 1.0.2 + escape-html: 1.0.3 + etag: 1.8.1 + fresh: 0.5.2 + http-errors: 2.0.0 + mime: 1.6.0 + ms: 2.1.3 + on-finished: 2.4.1 + range-parser: 1.2.1 + statuses: 2.0.1 + transitivePeerDependencies: + - supports-color + dev: false + + /serve-static@1.15.0: + resolution: {integrity: sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==} + engines: {node: '>= 0.8.0'} + dependencies: + encodeurl: 1.0.2 + escape-html: 1.0.3 + parseurl: 1.3.3 + send: 0.18.0 + transitivePeerDependencies: + - supports-color + dev: false + + /set-blocking@2.0.0: + resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} + dev: true + + /setprototypeof@1.2.0: + resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + dev: false + + /side-channel@1.0.4: + resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.2.1 + object-inspect: 1.12.3 + dev: false + + /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==} + dev: true + + /simple-concat@1.0.1: + resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} + dev: true + + /simple-get@4.0.1: + resolution: {integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==} + dependencies: + decompress-response: 6.0.0 + once: 1.4.0 + simple-concat: 1.0.1 + dev: true + + /simple-update-notifier@2.0.0: + resolution: {integrity: sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==} + engines: {node: '>=10'} + dependencies: + semver: 7.5.4 + dev: true + + /slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + dev: true + + /source-map-js@1.0.2: + resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} + engines: {node: '>=0.10.0'} + dev: true + + /source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + dev: true + + /stackback@0.0.2: + resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + dev: true + + /statuses@2.0.1: + resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} + engines: {node: '>= 0.8'} + dev: false + + /std-env@3.4.0: + resolution: {integrity: sha512-YqHeQIIQ8r1VtUZOTOyjsAXAsjr369SplZ5rlQaiJTBsvodvPSCME7vuz8pnQltbQ0Cw0lyFo5Q8uyNwYQ58Xw==} + dev: true + + /stream-meter@1.0.4: + resolution: {integrity: sha512-4sOEtrbgFotXwnEuzzsQBYEV1elAeFSO8rSGeTwabuX1RRn/kEq9JVH7I0MRBhKVRR0sJkr0M0QCH7yOLf9fhQ==} + dependencies: + readable-stream: 2.3.8 + 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_decoder@1.1.1: + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + dependencies: + safe-buffer: 5.1.2 + dev: true + + /string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + dependencies: + safe-buffer: 5.2.1 + dev: true + + /strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + dependencies: + ansi-regex: 5.0.1 + + /strip-bom@3.0.0: + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} + dev: true + + /strip-json-comments@2.0.1: + resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} + engines: {node: '>=0.10.0'} + dev: true + + /strip-literal@1.3.0: + resolution: {integrity: sha512-PugKzOsyXpArk0yWmUwqOZecSO0GH0bPoctLcqNDH9J04pVW3lflYE0ujElBGTloevcxF5MofAOZ7C5l2b+wLg==} + dependencies: + acorn: 8.10.0 + dev: true + + /supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + dependencies: + has-flag: 3.0.0 + dev: true + + /supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + dependencies: + has-flag: 4.0.0 + dev: true + + /supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + dev: true + + /swagger-autogen@2.23.5: + resolution: {integrity: sha512-4Tl2+XhZMyHoBYkABnScHtQE0lKPKUD3NBt09mClrI6UKOUYljKlYw1xiFVwsHCTGR2hAXmhT4PpgjruCtt1ZA==} + dependencies: + acorn: 7.4.1 + deepmerge: 4.3.1 + glob: 7.2.3 + json5: 2.2.3 + 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: true + + /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: true + + /tar@6.1.15: + resolution: {integrity: sha512-/zKt9UyngnxIT/EAGYuxaMYgOIJiP81ab9ZfkILq4oNLPFX50qyYmu7jRj9qeXoxmJHjGlbH0+cm2uy1WCs10A==} + engines: {node: '>=10'} + dependencies: + chownr: 2.0.0 + fs-minipass: 2.1.0 + minipass: 5.0.0 + minizlib: 2.1.2 + mkdirp: 1.0.4 + yallist: 4.0.0 + dev: true + + /tinybench@2.5.0: + resolution: {integrity: sha512-kRwSG8Zx4tjF9ZiyH4bhaebu+EDz1BOx9hOigYHlUW4xxI/wKIUQUqo018UlU4ar6ATPBsaMrdbKZ+tmPdohFA==} + dev: true + + /tinypool@0.6.0: + resolution: {integrity: sha512-FdswUUo5SxRizcBc6b1GSuLpLjisa8N8qMyYoP3rl+bym+QauhtJP5bvZY1ytt8krKGmMLYIRl36HBZfeAoqhQ==} + engines: {node: '>=14.0.0'} + dev: true + + /tinyspy@2.1.1: + resolution: {integrity: sha512-XPJL2uSzcOyBMky6OFrusqWlzfFrXtE0hPuMgW8A2HmaqrPo4ZQHRN/V0QXN3FSjKxpsbRrFc5LI7KOwBsT1/w==} + engines: {node: '>=14.0.0'} + 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 + dev: true + + /toidentifier@1.0.1: + resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} + engines: {node: '>=0.6'} + dev: false + + /touch@3.1.0: + resolution: {integrity: sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==} + hasBin: true + dependencies: + nopt: 1.0.10 + dev: true + + /tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + dev: true + + /ts-node@10.9.1(@types/node@18.17.6)(typescript@5.0.2): + 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.17.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.0.2 + v8-compile-cache-lib: 3.0.1 + yn: 3.1.1 + dev: true + + /tsconfck@2.1.2(typescript@5.0.2): + resolution: {integrity: sha512-ghqN1b0puy3MhhviwO2kGF8SeMDNhEbnKxjK7h6+fvY9JAxqvXi8y5NAHSQv687OVboS2uZIByzGd45/YxrRHg==} + engines: {node: ^14.13.1 || ^16 || >=18} + hasBin: true + peerDependencies: + typescript: ^4.3.5 || ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + dependencies: + typescript: 5.0.2 + 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 + + /tunnel-agent@0.6.0: + resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} + dependencies: + safe-buffer: 5.2.1 + dev: true + + /type-detect@4.0.8: + resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} + engines: {node: '>=4'} + dev: true + + /type-is@1.6.18: + resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} + engines: {node: '>= 0.6'} + dependencies: + media-typer: 0.3.0 + mime-types: 2.1.35 + dev: false + + /typescript@5.0.2: + resolution: {integrity: sha512-wVORMBGO/FAs/++blGNeAVdbNKtIh1rbBL2EyQ1+J9lClJ93KiiKe8PmFIVdXhHcyv44SL9oglmfeSsndo0jRw==} + engines: {node: '>=12.20'} + hasBin: true + dev: true + + /ufo@1.2.0: + resolution: {integrity: sha512-RsPyTbqORDNDxqAdQPQBpgqhWle1VcTSou/FraClYlHf6TZnQcGslpLcAphNR+sQW4q5lLWLbOsRlh9j24baQg==} + dev: true + + /uglify-js@3.17.4: + resolution: {integrity: sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==} + engines: {node: '>=0.8.0'} + hasBin: true + requiresBuild: true + dev: true + optional: true + + /undefsafe@2.0.5: + resolution: {integrity: sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==} + dev: true + + /universalify@2.0.0: + resolution: {integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==} + engines: {node: '>= 10.0.0'} + dev: true + + /unpipe@1.0.0: + resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} + engines: {node: '>= 0.8'} + dev: false + + /util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + dev: true + + /utils-merge@1.0.1: + resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} + engines: {node: '>= 0.4.0'} + dev: false + + /v8-compile-cache-lib@3.0.1: + resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} + dev: true + + /vary@1.1.2: + resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} + engines: {node: '>= 0.8'} + dev: false + + /vite-node@0.33.0(@types/node@18.17.6): + resolution: {integrity: sha512-19FpHYbwWWxDr73ruNahC+vtEdza52kA90Qb3La98yZ0xULqV8A5JLNPUff0f5zID4984tW7l3DH2przTJUZSw==} + engines: {node: '>=v14.18.0'} + hasBin: true + dependencies: + cac: 6.7.14 + debug: 4.3.4 + mlly: 1.4.0 + pathe: 1.1.1 + picocolors: 1.0.0 + vite: 4.4.9(@types/node@18.17.6) + transitivePeerDependencies: + - '@types/node' + - less + - lightningcss + - sass + - stylus + - sugarss + - supports-color + - terser + dev: true + + /vite-tsconfig-paths@4.2.0(typescript@5.0.2): + resolution: {integrity: sha512-jGpus0eUy5qbbMVGiTxCL1iB9ZGN6Bd37VGLJU39kTDD6ZfULTTb1bcc5IeTWqWJKiWV5YihCaibeASPiGi8kw==} + peerDependencies: + vite: '*' + peerDependenciesMeta: + vite: + optional: true + dependencies: + debug: 4.3.4 + globrex: 0.1.2 + tsconfck: 2.1.2(typescript@5.0.2) + transitivePeerDependencies: + - supports-color + - typescript + dev: true + + /vite@4.4.9(@types/node@18.17.6): + resolution: {integrity: sha512-2mbUn2LlUmNASWwSCNSJ/EG2HuSRTnVNaydp6vMCm5VIqJsjMfbIWtbH2kDuwUVW5mMUKKZvGPX/rqeqVvv1XA==} + engines: {node: ^14.18.0 || >=16.0.0} + hasBin: true + peerDependencies: + '@types/node': '>= 14' + less: '*' + lightningcss: ^1.21.0 + sass: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + dependencies: + '@types/node': 18.17.6 + esbuild: 0.18.20 + postcss: 8.4.28 + rollup: 3.28.0 + optionalDependencies: + fsevents: 2.3.2 + dev: true + + /vitest@0.33.0: + resolution: {integrity: sha512-1CxaugJ50xskkQ0e969R/hW47za4YXDUfWJDxip1hwbnhUjYolpfUn2AMOulqG/Dtd9WYAtkHmM/m3yKVrEejQ==} + engines: {node: '>=v14.18.0'} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@vitest/browser': '*' + '@vitest/ui': '*' + happy-dom: '*' + jsdom: '*' + playwright: '*' + safaridriver: '*' + webdriverio: '*' + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@vitest/browser': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true + playwright: + optional: true + safaridriver: + optional: true + webdriverio: + optional: true + dependencies: + '@types/chai': 4.3.5 + '@types/chai-subset': 1.3.3 + '@types/node': 18.17.6 + '@vitest/expect': 0.33.0 + '@vitest/runner': 0.33.0 + '@vitest/snapshot': 0.33.0 + '@vitest/spy': 0.33.0 + '@vitest/utils': 0.33.0 + acorn: 8.10.0 + acorn-walk: 8.2.0 + cac: 6.7.14 + chai: 4.3.7 + debug: 4.3.4 + local-pkg: 0.4.3 + magic-string: 0.30.2 + pathe: 1.1.1 + picocolors: 1.0.0 + std-env: 3.4.0 + strip-literal: 1.3.0 + tinybench: 2.5.0 + tinypool: 0.6.0 + vite: 4.4.9(@types/node@18.17.6) + vite-node: 0.33.0(@types/node@18.17.6) + why-is-node-running: 2.2.2 + transitivePeerDependencies: + - less + - lightningcss + - sass + - stylus + - sugarss + - supports-color + - terser + dev: true + + /webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + dev: true + + /whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + 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 + + /wide-align@1.1.5: + resolution: {integrity: sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==} + dependencies: + string-width: 4.2.3 + dev: true + + /wordwrap@1.0.0: + resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} + 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 + + /wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + /y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + + /yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + dev: true + + /yargs-parser@20.2.9: + resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} + engines: {node: '>=10'} + dev: true + + /yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + dev: false + + /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: true + + /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 + dev: false + + /yn@3.1.1: + resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} + engines: {node: '>=6'} + dev: true + + /yocto-queue@1.0.0: + resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} + engines: {node: '>=12.20'} + dev: true diff --git a/services/order/package-lock.json b/services/order/package-lock.json new file mode 100644 index 00000000..1911f53e --- /dev/null +++ b/services/order/package-lock.json @@ -0,0 +1,4254 @@ +{ + "name": "@goodfood/order", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "@goodfood/order", + "hasInstallScript": true, + "dependencies": { + "@grpc/grpc-js": "1.8.14", + "@grpc/proto-loader": "0.7.6", + "@prisma/client": "4.16.2", + "amqplib": "^0.10.3", + "dotenv": "^16.0.3", + "grpc-server-reflection": "^0.1.5", + "protobufjs": "7.2.2" + }, + "bin": { + "order": "dist/index.js" + }, + "devDependencies": { + "@types/amqplib": "^0.10.1", + "@types/node": "18.15.9", + "esbuild": "^0.17.18", + "grpc-tools": "^1.12.4", + "nodemon": "^2.0.22", + "pkg": "^5.8.1", + "prisma": "4.16.2", + "ts-node": "10.9.1", + "tsconfig-paths": "^4.2.0", + "typescript": "5.0.2", + "vite-tsconfig-paths": "^4.2.0", + "vitest": "^0.29.8" + } + }, + "node_modules/@acuminous/bitsyntax": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@acuminous/bitsyntax/-/bitsyntax-0.1.2.tgz", + "integrity": "sha512-29lUK80d1muEQqiUsSo+3A0yP6CdspgC95EnKBMi22Xlwt79i/En4Vr67+cXhU+cZjbti3TgGGC5wy1stIywVQ==", + "dependencies": { + "buffer-more-ints": "~1.0.0", + "debug": "^4.3.4", + "safe-buffer": "~5.1.2" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/@babel/generator": { + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.2.tgz", + "integrity": "sha512-W1lG5vUwFvfMd8HVXqdfbuG7RuaSrTCCD8cl8fP8wOivdbtbIg2Db3IWUcgvfxKbbn6ZBGYRW/Zk1MIwK49mgw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.18.2", + "@jridgewell/gen-mapping": "^0.3.0", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", + "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz", + "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.18.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.4.tgz", + "integrity": "sha512-FDge0dFazETFcxGw/EXzOkN8uJp0PC7Qbm+Pe9T+av2zlBpOgunFHkQPPn+eRuClU73JF+98D531UgayY89tow==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/types": { + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.19.0.tgz", + "integrity": "sha512-YuGopBq3ke25BVSiS6fgF49Ul9gH1x70Bcr6bqRLjWCkcX8Hre1/5+z+IiWOIerRMSSEfGZVB9z9kyq7wVs9YA==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.18.10", + "@babel/helper-validator-identifier": "^7.18.6", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.19.tgz", + "integrity": "sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.19.tgz", + "integrity": "sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.19.tgz", + "integrity": "sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.19.tgz", + "integrity": "sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.19.tgz", + "integrity": "sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.19.tgz", + "integrity": "sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.19.tgz", + "integrity": "sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.19.tgz", + "integrity": "sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.19.tgz", + "integrity": "sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.19.tgz", + "integrity": "sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.19.tgz", + "integrity": "sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.19.tgz", + "integrity": "sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.19.tgz", + "integrity": "sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.19.tgz", + "integrity": "sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.19.tgz", + "integrity": "sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.19.tgz", + "integrity": "sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.19.tgz", + "integrity": "sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.19.tgz", + "integrity": "sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.19.tgz", + "integrity": "sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.19.tgz", + "integrity": "sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.19.tgz", + "integrity": "sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.19.tgz", + "integrity": "sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@grpc/grpc-js": { + "version": "1.8.14", + "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.8.14.tgz", + "integrity": "sha512-w84maJ6CKl5aApCMzFll0hxtFNT6or9WwMslobKaqWUEf1K+zhlL43bSQhFreyYWIWR+Z0xnVFC1KtLm4ZpM/A==", + "dependencies": { + "@grpc/proto-loader": "^0.7.0", + "@types/node": ">=12.12.47" + }, + "engines": { + "node": "^8.13.0 || >=10.10.0" + } + }, + "node_modules/@grpc/proto-loader": { + "version": "0.7.6", + "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.6.tgz", + "integrity": "sha512-QyAXR8Hyh7uMDmveWxDSUcJr9NAWaZ2I6IXgAYvQmfflwouTM+rArE2eEaCtLlRqO81j7pRLCt81IefUei6Zbw==", + "dependencies": { + "@types/long": "^4.0.1", + "lodash.camelcase": "^4.3.0", + "long": "^4.0.0", + "protobufjs": "^7.0.0", + "yargs": "^16.2.0" + }, + "bin": { + "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.19", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz", + "integrity": "sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@mapbox/node-pre-gyp": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.11.tgz", + "integrity": "sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==", + "dev": true, + "dependencies": { + "detect-libc": "^2.0.0", + "https-proxy-agent": "^5.0.0", + "make-dir": "^3.1.0", + "node-fetch": "^2.6.7", + "nopt": "^5.0.0", + "npmlog": "^5.0.1", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.11" + }, + "bin": { + "node-pre-gyp": "bin/node-pre-gyp" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@prisma/client": { + "version": "4.16.2", + "resolved": "https://registry.npmjs.org/@prisma/client/-/client-4.16.2.tgz", + "integrity": "sha512-qCoEyxv1ZrQ4bKy39GnylE8Zq31IRmm8bNhNbZx7bF2cU5aiCCnSa93J2imF88MBjn7J9eUQneNxUQVJdl/rPQ==", + "hasInstallScript": true, + "dependencies": { + "@prisma/engines-version": "4.16.1-1.4bc8b6e1b66cb932731fb1bdbbc550d1e010de81" + }, + "engines": { + "node": ">=14.17" + }, + "peerDependencies": { + "prisma": "*" + }, + "peerDependenciesMeta": { + "prisma": { + "optional": true + } + } + }, + "node_modules/@prisma/engines": { + "version": "4.16.2", + "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-4.16.2.tgz", + "integrity": "sha512-vx1nxVvN4QeT/cepQce68deh/Turxy5Mr+4L4zClFuK1GlxN3+ivxfuv+ej/gvidWn1cE1uAhW7ALLNlYbRUAw==", + "devOptional": true, + "hasInstallScript": true + }, + "node_modules/@prisma/engines-version": { + "version": "4.16.1-1.4bc8b6e1b66cb932731fb1bdbbc550d1e010de81", + "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-4.16.1-1.4bc8b6e1b66cb932731fb1bdbbc550d1e010de81.tgz", + "integrity": "sha512-q617EUWfRIDTriWADZ4YiWRZXCa/WuhNgLTVd+HqWLffjMSPzyM5uOWoauX91wvQClSKZU4pzI4JJLQ9Kl62Qg==" + }, + "node_modules/@protobufjs/aspromise": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==" + }, + "node_modules/@protobufjs/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" + }, + "node_modules/@protobufjs/codegen": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", + "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" + }, + "node_modules/@protobufjs/eventemitter": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", + "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==" + }, + "node_modules/@protobufjs/fetch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", + "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", + "dependencies": { + "@protobufjs/aspromise": "^1.1.1", + "@protobufjs/inquire": "^1.1.0" + } + }, + "node_modules/@protobufjs/float": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", + "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==" + }, + "node_modules/@protobufjs/inquire": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", + "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==" + }, + "node_modules/@protobufjs/path": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==" + }, + "node_modules/@protobufjs/pool": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==" + }, + "node_modules/@protobufjs/utf8": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", + "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==" + }, + "node_modules/@tsconfig/node10": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", + "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", + "dev": true + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", + "dev": true + }, + "node_modules/@types/amqplib": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/@types/amqplib/-/amqplib-0.10.1.tgz", + "integrity": "sha512-j6ANKT79ncUDnAs/+9r9eDujxbeJoTjoVu33gHHcaPfmLQaMhvfbH2GqSe8KUM444epAp1Vl3peVOQfZk3UIqA==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/chai": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.5.tgz", + "integrity": "sha512-mEo1sAde+UCE6b2hxn332f1g1E8WfYRu6p5SvTKr2ZKC1f7gFJXk4h5PyGP9Dt6gCaG8y8XhwnXWC6Iy2cmBng==", + "dev": true + }, + "node_modules/@types/chai-subset": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@types/chai-subset/-/chai-subset-1.3.3.tgz", + "integrity": "sha512-frBecisrNGz+F4T6bcc+NLeolfiojh5FxW2klu669+8BARtyQv2C/GkNW6FUodVe4BroGMP/wER/YDGc7rEllw==", + "dev": true, + "dependencies": { + "@types/chai": "*" + } + }, + "node_modules/@types/long": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz", + "integrity": "sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==" + }, + "node_modules/@types/node": { + "version": "18.15.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.9.tgz", + "integrity": "sha512-dUxhiNzBLr6IqlZXz6e/rN2YQXlFgOei/Dxy+e3cyXTJ4txSUbGT2/fmnD6zd/75jDMeW5bDee+YXxlFKHoV0A==" + }, + "node_modules/@vitest/expect": { + "version": "0.29.8", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-0.29.8.tgz", + "integrity": "sha512-xlcVXn5I5oTq6NiZSY3ykyWixBxr5mG8HYtjvpgg6KaqHm0mvhX18xuwl5YGxIRNt/A5jidd7CWcNHrSvgaQqQ==", + "dev": true, + "dependencies": { + "@vitest/spy": "0.29.8", + "@vitest/utils": "0.29.8", + "chai": "^4.3.7" + } + }, + "node_modules/@vitest/runner": { + "version": "0.29.8", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-0.29.8.tgz", + "integrity": "sha512-FzdhnRDwEr/A3Oo1jtIk/B952BBvP32n1ObMEb23oEJNO+qO5cBet6M2XWIDQmA7BDKGKvmhUf2naXyp/2JEwQ==", + "dev": true, + "dependencies": { + "@vitest/utils": "0.29.8", + "p-limit": "^4.0.0", + "pathe": "^1.1.0" + } + }, + "node_modules/@vitest/spy": { + "version": "0.29.8", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-0.29.8.tgz", + "integrity": "sha512-VdjBe9w34vOMl5I5mYEzNX8inTxrZ+tYUVk9jxaZJmHFwmDFC/GV3KBFTA/JKswr3XHvZL+FE/yq5EVhb6pSAw==", + "dev": true, + "dependencies": { + "tinyspy": "^1.0.2" + } + }, + "node_modules/@vitest/utils": { + "version": "0.29.8", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-0.29.8.tgz", + "integrity": "sha512-qGzuf3vrTbnoY+RjjVVIBYfuWMjn3UMUqyQtdGNZ6ZIIyte7B37exj6LaVkrZiUTvzSadVvO/tJm8AEgbGCBPg==", + "dev": true, + "dependencies": { + "cli-truncate": "^3.1.0", + "diff": "^5.1.0", + "loupe": "^2.3.6", + "pretty-format": "^27.5.1" + } + }, + "node_modules/@vitest/utils/node_modules/diff": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.1.0.tgz", + "integrity": "sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true + }, + "node_modules/acorn": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/amqplib": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/amqplib/-/amqplib-0.10.3.tgz", + "integrity": "sha512-UHmuSa7n8vVW/a5HGh2nFPqAEr8+cD4dEZ6u9GjP91nHfr1a54RyAKyra7Sb5NH7NBKOUlyQSMXIp0qAixKexw==", + "dependencies": { + "@acuminous/bitsyntax": "^0.1.2", + "buffer-more-ints": "~1.0.0", + "readable-stream": "1.x >=1.1.9", + "url-parse": "~1.5.10" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/aproba": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", + "dev": true + }, + "node_modules/are-we-there-yet": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", + "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", + "dev": true, + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/are-we-there-yet/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/are-we-there-yet/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/are-we-there-yet/node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dev": true, + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/bl/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/bl/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/bl/node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/buffer-more-ints": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-more-ints/-/buffer-more-ints-1.0.0.tgz", + "integrity": "sha512-EMetuGFz5SLsT0QTnXzINh4Ksr+oo4i+UGTXEshiGCQWnsgSs7ZhJ8fzlwQ+OzEMs0MpDAMr1hxnblp5a4vcHg==" + }, + "node_modules/cac": { + "version": "6.7.14", + "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", + "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/chai": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.7.tgz", + "integrity": "sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==", + "dev": true, + "dependencies": { + "assertion-error": "^1.1.0", + "check-error": "^1.0.2", + "deep-eql": "^4.1.2", + "get-func-name": "^2.0.0", + "loupe": "^2.3.1", + "pathval": "^1.1.1", + "type-detect": "^4.0.5" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chalk/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/chalk/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/check-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", + "integrity": "sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/cli-truncate": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-3.1.0.tgz", + "integrity": "sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==", + "dev": true, + "dependencies": { + "slice-ansi": "^5.0.0", + "string-width": "^5.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-truncate/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/cli-truncate/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, + "node_modules/cli-truncate/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-truncate/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "dev": true, + "bin": { + "color-support": "bin.js" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", + "dev": true + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "dev": true, + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/deep-eql": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz", + "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==", + "dev": true, + "dependencies": { + "type-detect": "^4.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "dev": true, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", + "dev": true + }, + "node_modules/detect-libc": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.2.tgz", + "integrity": "sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dotenv": { + "version": "16.3.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.3.1.tgz", + "integrity": "sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/motdotla/dotenv?sponsor=1" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/esbuild": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.19.tgz", + "integrity": "sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.17.19", + "@esbuild/android-arm64": "0.17.19", + "@esbuild/android-x64": "0.17.19", + "@esbuild/darwin-arm64": "0.17.19", + "@esbuild/darwin-x64": "0.17.19", + "@esbuild/freebsd-arm64": "0.17.19", + "@esbuild/freebsd-x64": "0.17.19", + "@esbuild/linux-arm": "0.17.19", + "@esbuild/linux-arm64": "0.17.19", + "@esbuild/linux-ia32": "0.17.19", + "@esbuild/linux-loong64": "0.17.19", + "@esbuild/linux-mips64el": "0.17.19", + "@esbuild/linux-ppc64": "0.17.19", + "@esbuild/linux-riscv64": "0.17.19", + "@esbuild/linux-s390x": "0.17.19", + "@esbuild/linux-x64": "0.17.19", + "@esbuild/netbsd-x64": "0.17.19", + "@esbuild/openbsd-x64": "0.17.19", + "@esbuild/sunos-x64": "0.17.19", + "@esbuild/win32-arm64": "0.17.19", + "@esbuild/win32-ia32": "0.17.19", + "@esbuild/win32-x64": "0.17.19" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "engines": { + "node": ">=6" + } + }, + "node_modules/expand-template": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", + "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/fast-glob": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", + "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + } + }, + "node_modules/from2/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "node_modules/from2/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/from2/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "dev": true + }, + "node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/fs-minipass/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "node_modules/gauge": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", + "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", + "dev": true, + "dependencies": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.2", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.1", + "object-assign": "^4.1.1", + "signal-exit": "^3.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-func-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", + "integrity": "sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/github-from-package": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", + "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==", + "dev": true + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globrex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz", + "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==", + "dev": true + }, + "node_modules/google-protobuf": { + "version": "3.21.2", + "resolved": "https://registry.npmjs.org/google-protobuf/-/google-protobuf-3.21.2.tgz", + "integrity": "sha512-3MSOYFO5U9mPGikIYCzK0SaThypfGgS6bHqrUGXG3DPHCrb+txNqeEcns1W0lkGfk0rCyNXm7xB9rMxnCiZOoA==" + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true + }, + "node_modules/grpc-server-reflection": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/grpc-server-reflection/-/grpc-server-reflection-0.1.5.tgz", + "integrity": "sha512-i69RYu6v65enzknNAPUgerFuVQfo+L3n9g4c1A/Sv5jUHMpxMIjSbBA+YWls9Sr4Flac4oohp4Gx8f389CaHuw==", + "dependencies": { + "google-protobuf": "^3.19.1" + } + }, + "node_modules/grpc-tools": { + "version": "1.12.4", + "resolved": "https://registry.npmjs.org/grpc-tools/-/grpc-tools-1.12.4.tgz", + "integrity": "sha512-5+mLAJJma3BjnW/KQp6JBjUMgvu7Mu3dBvBPd1dcbNIb+qiR0817zDpgPjS7gRb+l/8EVNIa3cB02xI9JLToKg==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "@mapbox/node-pre-gyp": "^1.0.5" + }, + "bin": { + "grpc_tools_node_protoc": "bin/protoc.js", + "grpc_tools_node_protoc_plugin": "bin/protoc_plugin.js" + } + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", + "dev": true + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dev": true, + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/ignore": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/ignore-by-default": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", + "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==", + "dev": true + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true + }, + "node_modules/into-stream": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/into-stream/-/into-stream-6.0.0.tgz", + "integrity": "sha512-XHbaOAvP+uFKUFsOgoNPRjLkwB+I22JFPFe5OjTkQ0nwgj6+pSjb4NmB6VMxaPshLiOf+zcpOCBQuLwC1KHhZA==", + "dev": true, + "dependencies": { + "from2": "^2.3.0", + "p-is-promise": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz", + "integrity": "sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonc-parser": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", + "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", + "dev": true + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/local-pkg": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.4.3.tgz", + "integrity": "sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==" + }, + "node_modules/long": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", + "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" + }, + "node_modules/loupe": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.6.tgz", + "integrity": "sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==", + "dev": true, + "dependencies": { + "get-func-name": "^2.0.0" + } + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minizlib/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mkdirp-classic": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", + "dev": true + }, + "node_modules/mlly": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.4.0.tgz", + "integrity": "sha512-ua8PAThnTwpprIaU47EPeZ/bPUVp2QYBbWMphUQpVdBI3Lgqzm5KZQ45Agm3YJedHXaIHl6pBGabaLSUPPSptg==", + "dev": true, + "dependencies": { + "acorn": "^8.9.0", + "pathe": "^1.1.1", + "pkg-types": "^1.0.3", + "ufo": "^1.1.2" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/multistream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/multistream/-/multistream-4.1.0.tgz", + "integrity": "sha512-J1XDiAmmNpRCBfIWJv+n0ymC4ABcf/Pl+5YvC5B/D2f/2+8PtHvCNxMPKiQcZyi922Hq69J2YOpb1pTywfifyw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "once": "^1.4.0", + "readable-stream": "^3.6.0" + } + }, + "node_modules/multistream/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/multistream/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/multistream/node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/nanoid": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", + "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/napi-build-utils": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", + "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==", + "dev": true + }, + "node_modules/node-abi": { + "version": "3.47.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.47.0.tgz", + "integrity": "sha512-2s6B2CWZM//kPgwnuI0KrYwNjfdByE25zvAaEpq9IH4zcNsarH8Ihu/UuX6XMPEogDAxkuUFeZn60pXNHAqn3A==", + "dev": true, + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/node-fetch": { + "version": "2.6.13", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.13.tgz", + "integrity": "sha512-StxNAxh15zr77QvvkmveSQ8uCQ4+v5FkvNTj0OESmiHu+VRi/gXArXtkWMElOsOUNLtUEvI4yS+rdtOHZTwlQA==", + "dev": true, + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/nodemon": { + "version": "2.0.22", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.22.tgz", + "integrity": "sha512-B8YqaKMmyuCO7BowF1Z1/mkPqLk6cs/l63Ojtd6otKjMx47Dq1utxfRxcavH1I7VSaL8n5BUaoutadnsX3AAVQ==", + "dev": true, + "dependencies": { + "chokidar": "^3.5.2", + "debug": "^3.2.7", + "ignore-by-default": "^1.0.1", + "minimatch": "^3.1.2", + "pstree.remy": "^1.1.8", + "semver": "^5.7.1", + "simple-update-notifier": "^1.0.7", + "supports-color": "^5.5.0", + "touch": "^3.1.0", + "undefsafe": "^2.0.5" + }, + "bin": { + "nodemon": "bin/nodemon.js" + }, + "engines": { + "node": ">=8.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/nodemon" + } + }, + "node_modules/nodemon/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/nodemon/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "dev": true, + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npmlog": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", + "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", + "dev": true, + "dependencies": { + "are-we-there-yet": "^2.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^3.0.0", + "set-blocking": "^2.0.0" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/p-is-promise": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-3.0.0.tgz", + "integrity": "sha512-Wo8VsW4IRQSKVXsJCn7TomUaVtyfjVDn3nUP7kE967BQk0CwFpdbZs0X0uk5sW9mkBa9eNM7hCMaG93WUAwxYQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-limit": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", + "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^1.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/pathe": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.1.tgz", + "integrity": "sha512-d+RQGp0MAYTIaDBIMmOfMwz3E+LOZnxx1HZd5R18mmCZY0QBlK0LDZfPc8FW8Ed2DlvsuE6PRjroDY+wg4+j/Q==", + "dev": true + }, + "node_modules/pathval": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", + "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pkg": { + "version": "5.8.1", + "resolved": "https://registry.npmjs.org/pkg/-/pkg-5.8.1.tgz", + "integrity": "sha512-CjBWtFStCfIiT4Bde9QpJy0KeH19jCfwZRJqHFDFXfhUklCx8JoFmMj3wgnEYIwGmZVNkhsStPHEOnrtrQhEXA==", + "dev": true, + "dependencies": { + "@babel/generator": "7.18.2", + "@babel/parser": "7.18.4", + "@babel/types": "7.19.0", + "chalk": "^4.1.2", + "fs-extra": "^9.1.0", + "globby": "^11.1.0", + "into-stream": "^6.0.0", + "is-core-module": "2.9.0", + "minimist": "^1.2.6", + "multistream": "^4.1.0", + "pkg-fetch": "3.4.2", + "prebuild-install": "7.1.1", + "resolve": "^1.22.0", + "stream-meter": "^1.0.4" + }, + "bin": { + "pkg": "lib-es5/bin.js" + }, + "peerDependencies": { + "node-notifier": ">=9.0.1" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/pkg-fetch": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/pkg-fetch/-/pkg-fetch-3.4.2.tgz", + "integrity": "sha512-0+uijmzYcnhC0hStDjm/cl2VYdrmVVBpe7Q8k9YBojxmR5tG8mvR9/nooQq3QSXiQqORDVOTY3XqMEqJVIzkHA==", + "dev": true, + "dependencies": { + "chalk": "^4.1.2", + "fs-extra": "^9.1.0", + "https-proxy-agent": "^5.0.0", + "node-fetch": "^2.6.6", + "progress": "^2.0.3", + "semver": "^7.3.5", + "tar-fs": "^2.1.1", + "yargs": "^16.2.0" + }, + "bin": { + "pkg-fetch": "lib-es5/bin.js" + } + }, + "node_modules/pkg-types": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.0.3.tgz", + "integrity": "sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==", + "dev": true, + "dependencies": { + "jsonc-parser": "^3.2.0", + "mlly": "^1.2.0", + "pathe": "^1.1.0" + } + }, + "node_modules/postcss": { + "version": "8.4.28", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.28.tgz", + "integrity": "sha512-Z7V5j0cq8oEKyejIKfpD8b4eBy9cwW2JWPk0+fB1HOAMsfHbnAXLLS+PfVWlzMSLQaWttKDt607I0XHmpE67Vw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/prebuild-install": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.1.tgz", + "integrity": "sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==", + "dev": true, + "dependencies": { + "detect-libc": "^2.0.0", + "expand-template": "^2.0.3", + "github-from-package": "0.0.0", + "minimist": "^1.2.3", + "mkdirp-classic": "^0.5.3", + "napi-build-utils": "^1.0.1", + "node-abi": "^3.3.0", + "pump": "^3.0.0", + "rc": "^1.2.7", + "simple-get": "^4.0.0", + "tar-fs": "^2.0.0", + "tunnel-agent": "^0.6.0" + }, + "bin": { + "prebuild-install": "bin.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/pretty-format": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", + "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/prisma": { + "version": "4.16.2", + "resolved": "https://registry.npmjs.org/prisma/-/prisma-4.16.2.tgz", + "integrity": "sha512-SYCsBvDf0/7XSJyf2cHTLjLeTLVXYfqp7pG5eEVafFLeT0u/hLFz/9W196nDRGUOo1JfPatAEb+uEnTQImQC1g==", + "devOptional": true, + "hasInstallScript": true, + "dependencies": { + "@prisma/engines": "4.16.2" + }, + "bin": { + "prisma": "build/index.js", + "prisma2": "build/index.js" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/protobufjs": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.2.2.tgz", + "integrity": "sha512-++PrQIjrom+bFDPpfmqXfAGSQs40116JRrqqyf53dymUMvvb5d/LMRyicRoF1AUKoXVS1/IgJXlEgcpr4gTF3Q==", + "hasInstallScript": true, + "dependencies": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/node": ">=13.7.0", + "long": "^5.0.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/protobufjs/node_modules/long": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", + "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==" + }, + "node_modules/pstree.remy": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", + "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", + "dev": true + }, + "node_modules/pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==" + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dev": true, + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, + "node_modules/react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", + "dev": true + }, + "node_modules/readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==" + }, + "node_modules/resolve": { + "version": "1.22.4", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.4.tgz", + "integrity": "sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==", + "dev": true, + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve/node_modules/is-core-module": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", + "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rollup": { + "version": "3.28.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.28.0.tgz", + "integrity": "sha512-d7zhvo1OUY2SXSM6pfNjgD5+d0Nz87CUp4mt8l/GgVP3oBsPwzNvSzyu1me6BSG9JIgWNTVcafIXBIyM8yQ3yw==", + "dev": true, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=14.18.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "dev": true + }, + "node_modules/siginfo": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", + "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", + "dev": true + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "node_modules/simple-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/simple-get": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", + "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "decompress-response": "^6.0.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } + }, + "node_modules/simple-update-notifier": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-1.1.0.tgz", + "integrity": "sha512-VpsrsJSUcJEseSbMHkrsrAVSdvVS5I96Qo1QAQ4FxQ9wXFcB+pjj7FB7/us9+GcgfW4ziHtYMc1J0PLczb55mg==", + "dev": true, + "dependencies": { + "semver": "~7.0.0" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/simple-update-notifier/node_modules/semver": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", + "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/slice-ansi": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", + "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.0.0", + "is-fullwidth-code-point": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/slice-ansi/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/slice-ansi/node_modules/is-fullwidth-code-point": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", + "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stackback": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", + "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", + "dev": true + }, + "node_modules/std-env": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.4.0.tgz", + "integrity": "sha512-YqHeQIIQ8r1VtUZOTOyjsAXAsjr369SplZ5rlQaiJTBsvodvPSCME7vuz8pnQltbQ0Cw0lyFo5Q8uyNwYQ58Xw==", + "dev": true + }, + "node_modules/stream-meter": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/stream-meter/-/stream-meter-1.0.4.tgz", + "integrity": "sha512-4sOEtrbgFotXwnEuzzsQBYEV1elAeFSO8rSGeTwabuX1RRn/kEq9JVH7I0MRBhKVRR0sJkr0M0QCH7yOLf9fhQ==", + "dev": true, + "dependencies": { + "readable-stream": "^2.1.4" + } + }, + "node_modules/stream-meter/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "node_modules/stream-meter/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/stream-meter/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==" + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-literal": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-1.3.0.tgz", + "integrity": "sha512-PugKzOsyXpArk0yWmUwqOZecSO0GH0bPoctLcqNDH9J04pVW3lflYE0ujElBGTloevcxF5MofAOZ7C5l2b+wLg==", + "dev": true, + "dependencies": { + "acorn": "^8.10.0" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tar": { + "version": "6.1.15", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.15.tgz", + "integrity": "sha512-/zKt9UyngnxIT/EAGYuxaMYgOIJiP81ab9ZfkILq4oNLPFX50qyYmu7jRj9qeXoxmJHjGlbH0+cm2uy1WCs10A==", + "dev": true, + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/tar-fs": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", + "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", + "dev": true, + "dependencies": { + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.1.4" + } + }, + "node_modules/tar-fs/node_modules/chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "dev": true + }, + "node_modules/tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "dev": true, + "dependencies": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tar-stream/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/tar-stream/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/tar-stream/node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/tinybench": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.5.0.tgz", + "integrity": "sha512-kRwSG8Zx4tjF9ZiyH4bhaebu+EDz1BOx9hOigYHlUW4xxI/wKIUQUqo018UlU4ar6ATPBsaMrdbKZ+tmPdohFA==", + "dev": true + }, + "node_modules/tinypool": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-0.4.0.tgz", + "integrity": "sha512-2ksntHOKf893wSAH4z/+JbPpi92esw8Gn9N2deXX+B0EO92hexAVI9GIZZPx7P5aYo5KULfeOSt3kMOmSOy6uA==", + "dev": true, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tinyspy": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-1.1.1.tgz", + "integrity": "sha512-UVq5AXt/gQlti7oxoIg5oi/9r0WpF7DGEVwXgqWSMmyN16+e3tl5lIvTaOpJ3TAtu5xFzWccFRM4R5NaWHF+4g==", + "dev": true, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/touch": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", + "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", + "dev": true, + "dependencies": { + "nopt": "~1.0.10" + }, + "bin": { + "nodetouch": "bin/nodetouch.js" + } + }, + "node_modules/touch/node_modules/nopt": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", + "integrity": "sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==", + "dev": true, + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "*" + } + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "dev": true + }, + "node_modules/ts-node": { + "version": "10.9.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", + "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", + "dev": true, + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "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 + } + } + }, + "node_modules/tsconfck": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/tsconfck/-/tsconfck-2.1.2.tgz", + "integrity": "sha512-ghqN1b0puy3MhhviwO2kGF8SeMDNhEbnKxjK7h6+fvY9JAxqvXi8y5NAHSQv687OVboS2uZIByzGd45/YxrRHg==", + "dev": true, + "bin": { + "tsconfck": "bin/tsconfck.js" + }, + "engines": { + "node": "^14.13.1 || ^16 || >=18" + }, + "peerDependencies": { + "typescript": "^4.3.5 || ^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/tsconfig-paths": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", + "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==", + "dev": true, + "dependencies": { + "json5": "^2.2.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "dev": true, + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/typescript": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.2.tgz", + "integrity": "sha512-wVORMBGO/FAs/++blGNeAVdbNKtIh1rbBL2EyQ1+J9lClJ93KiiKe8PmFIVdXhHcyv44SL9oglmfeSsndo0jRw==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=12.20" + } + }, + "node_modules/ufo": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.2.0.tgz", + "integrity": "sha512-RsPyTbqORDNDxqAdQPQBpgqhWle1VcTSou/FraClYlHf6TZnQcGslpLcAphNR+sQW4q5lLWLbOsRlh9j24baQg==", + "dev": true + }, + "node_modules/undefsafe": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", + "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", + "dev": true + }, + "node_modules/universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/url-parse": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true + }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true + }, + "node_modules/vite": { + "version": "4.4.9", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.4.9.tgz", + "integrity": "sha512-2mbUn2LlUmNASWwSCNSJ/EG2HuSRTnVNaydp6vMCm5VIqJsjMfbIWtbH2kDuwUVW5mMUKKZvGPX/rqeqVvv1XA==", + "dev": true, + "dependencies": { + "esbuild": "^0.18.10", + "postcss": "^8.4.27", + "rollup": "^3.27.1" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + }, + "peerDependencies": { + "@types/node": ">= 14", + "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 + } + } + }, + "node_modules/vite-node": { + "version": "0.29.8", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-0.29.8.tgz", + "integrity": "sha512-b6OtCXfk65L6SElVM20q5G546yu10/kNrhg08afEoWlFRJXFq9/6glsvSVY+aI6YeC1tu2TtAqI2jHEQmOmsFw==", + "dev": true, + "dependencies": { + "cac": "^6.7.14", + "debug": "^4.3.4", + "mlly": "^1.1.0", + "pathe": "^1.1.0", + "picocolors": "^1.0.0", + "vite": "^3.0.0 || ^4.0.0" + }, + "bin": { + "vite-node": "vite-node.mjs" + }, + "engines": { + "node": ">=v14.16.0" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/vite-tsconfig-paths": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/vite-tsconfig-paths/-/vite-tsconfig-paths-4.2.0.tgz", + "integrity": "sha512-jGpus0eUy5qbbMVGiTxCL1iB9ZGN6Bd37VGLJU39kTDD6ZfULTTb1bcc5IeTWqWJKiWV5YihCaibeASPiGi8kw==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "globrex": "^0.1.2", + "tsconfck": "^2.1.0" + }, + "peerDependencies": { + "vite": "*" + }, + "peerDependenciesMeta": { + "vite": { + "optional": true + } + } + }, + "node_modules/vite/node_modules/@esbuild/android-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", + "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/android-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz", + "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/android-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz", + "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/darwin-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz", + "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/darwin-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz", + "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/freebsd-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz", + "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/freebsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz", + "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz", + "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz", + "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz", + "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-loong64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", + "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-mips64el": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz", + "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-ppc64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz", + "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-riscv64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz", + "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-s390x": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz", + "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz", + "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/netbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz", + "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/openbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz", + "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/sunos-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz", + "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/win32-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", + "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/win32-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz", + "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/win32-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", + "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/esbuild": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", + "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.18.20", + "@esbuild/android-arm64": "0.18.20", + "@esbuild/android-x64": "0.18.20", + "@esbuild/darwin-arm64": "0.18.20", + "@esbuild/darwin-x64": "0.18.20", + "@esbuild/freebsd-arm64": "0.18.20", + "@esbuild/freebsd-x64": "0.18.20", + "@esbuild/linux-arm": "0.18.20", + "@esbuild/linux-arm64": "0.18.20", + "@esbuild/linux-ia32": "0.18.20", + "@esbuild/linux-loong64": "0.18.20", + "@esbuild/linux-mips64el": "0.18.20", + "@esbuild/linux-ppc64": "0.18.20", + "@esbuild/linux-riscv64": "0.18.20", + "@esbuild/linux-s390x": "0.18.20", + "@esbuild/linux-x64": "0.18.20", + "@esbuild/netbsd-x64": "0.18.20", + "@esbuild/openbsd-x64": "0.18.20", + "@esbuild/sunos-x64": "0.18.20", + "@esbuild/win32-arm64": "0.18.20", + "@esbuild/win32-ia32": "0.18.20", + "@esbuild/win32-x64": "0.18.20" + } + }, + "node_modules/vitest": { + "version": "0.29.8", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-0.29.8.tgz", + "integrity": "sha512-JIAVi2GK5cvA6awGpH0HvH/gEG9PZ0a/WoxdiV3PmqK+3CjQMf8c+J/Vhv4mdZ2nRyXFw66sAg6qz7VNkaHfDQ==", + "dev": true, + "dependencies": { + "@types/chai": "^4.3.4", + "@types/chai-subset": "^1.3.3", + "@types/node": "*", + "@vitest/expect": "0.29.8", + "@vitest/runner": "0.29.8", + "@vitest/spy": "0.29.8", + "@vitest/utils": "0.29.8", + "acorn": "^8.8.1", + "acorn-walk": "^8.2.0", + "cac": "^6.7.14", + "chai": "^4.3.7", + "debug": "^4.3.4", + "local-pkg": "^0.4.2", + "pathe": "^1.1.0", + "picocolors": "^1.0.0", + "source-map": "^0.6.1", + "std-env": "^3.3.1", + "strip-literal": "^1.0.0", + "tinybench": "^2.3.1", + "tinypool": "^0.4.0", + "tinyspy": "^1.0.2", + "vite": "^3.0.0 || ^4.0.0", + "vite-node": "0.29.8", + "why-is-node-running": "^2.2.2" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": ">=v14.16.0" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@vitest/browser": "*", + "@vitest/ui": "*", + "happy-dom": "*", + "jsdom": "*", + "playwright": "*", + "safaridriver": "*", + "webdriverio": "*" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@vitest/browser": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + }, + "playwright": { + "optional": true + }, + "safaridriver": { + "optional": true + }, + "webdriverio": { + "optional": true + } + } + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "dev": true + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dev": true, + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/why-is-node-running": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.2.2.tgz", + "integrity": "sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==", + "dev": true, + "dependencies": { + "siginfo": "^2.0.0", + "stackback": "0.0.2" + }, + "bin": { + "why-is-node-running": "cli.js" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wide-align": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", + "dev": true, + "dependencies": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "engines": { + "node": ">=10" + } + }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/yocto-queue": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", + "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", + "dev": true, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/services/payment/package-lock.json b/services/payment/package-lock.json new file mode 100644 index 00000000..85fde9a4 --- /dev/null +++ b/services/payment/package-lock.json @@ -0,0 +1,4979 @@ +{ + "name": "@goodfood/payment", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "@goodfood/payment", + "hasInstallScript": true, + "dependencies": { + "@grpc/grpc-js": "1.8.14", + "@grpc/proto-loader": "0.7.6", + "@prisma/client": "5.1.1", + "amqplib": "^0.10.3", + "dotenv": "^16.0.3", + "express": "^4.18.2", + "grpc-server-reflection": "^0.1.5", + "protobufjs": "7.2.2", + "stripe": "^12.17.0" + }, + "bin": { + "payment": "dist/index.js" + }, + "devDependencies": { + "@types/amqplib": "^0.10.1", + "@types/express": "^4.17.17", + "@types/node": "18.15.9", + "esbuild": "^0.17.18", + "grpc-tools": "^1.12.4", + "nodemon": "^2.0.22", + "pkg": "^5.8.1", + "prisma": "5.1.1", + "ts-node": "10.9.1", + "tsconfig-paths": "^4.2.0", + "typescript": "5.0.2", + "vite-tsconfig-paths": "^4.2.0", + "vitest": "^0.29.8" + } + }, + "node_modules/@acuminous/bitsyntax": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@acuminous/bitsyntax/-/bitsyntax-0.1.2.tgz", + "integrity": "sha512-29lUK80d1muEQqiUsSo+3A0yP6CdspgC95EnKBMi22Xlwt79i/En4Vr67+cXhU+cZjbti3TgGGC5wy1stIywVQ==", + "dependencies": { + "buffer-more-ints": "~1.0.0", + "debug": "^4.3.4", + "safe-buffer": "~5.1.2" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/@babel/generator": { + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.2.tgz", + "integrity": "sha512-W1lG5vUwFvfMd8HVXqdfbuG7RuaSrTCCD8cl8fP8wOivdbtbIg2Db3IWUcgvfxKbbn6ZBGYRW/Zk1MIwK49mgw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.18.2", + "@jridgewell/gen-mapping": "^0.3.0", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", + "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz", + "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.18.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.4.tgz", + "integrity": "sha512-FDge0dFazETFcxGw/EXzOkN8uJp0PC7Qbm+Pe9T+av2zlBpOgunFHkQPPn+eRuClU73JF+98D531UgayY89tow==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/types": { + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.19.0.tgz", + "integrity": "sha512-YuGopBq3ke25BVSiS6fgF49Ul9gH1x70Bcr6bqRLjWCkcX8Hre1/5+z+IiWOIerRMSSEfGZVB9z9kyq7wVs9YA==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.18.10", + "@babel/helper-validator-identifier": "^7.18.6", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.19.tgz", + "integrity": "sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.19.tgz", + "integrity": "sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.19.tgz", + "integrity": "sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.19.tgz", + "integrity": "sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.19.tgz", + "integrity": "sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.19.tgz", + "integrity": "sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.19.tgz", + "integrity": "sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.19.tgz", + "integrity": "sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.19.tgz", + "integrity": "sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.19.tgz", + "integrity": "sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.19.tgz", + "integrity": "sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.19.tgz", + "integrity": "sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.19.tgz", + "integrity": "sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.19.tgz", + "integrity": "sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.19.tgz", + "integrity": "sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.19.tgz", + "integrity": "sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.19.tgz", + "integrity": "sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.19.tgz", + "integrity": "sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.19.tgz", + "integrity": "sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.19.tgz", + "integrity": "sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.19.tgz", + "integrity": "sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.19.tgz", + "integrity": "sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@grpc/grpc-js": { + "version": "1.8.14", + "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.8.14.tgz", + "integrity": "sha512-w84maJ6CKl5aApCMzFll0hxtFNT6or9WwMslobKaqWUEf1K+zhlL43bSQhFreyYWIWR+Z0xnVFC1KtLm4ZpM/A==", + "dependencies": { + "@grpc/proto-loader": "^0.7.0", + "@types/node": ">=12.12.47" + }, + "engines": { + "node": "^8.13.0 || >=10.10.0" + } + }, + "node_modules/@grpc/proto-loader": { + "version": "0.7.6", + "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.6.tgz", + "integrity": "sha512-QyAXR8Hyh7uMDmveWxDSUcJr9NAWaZ2I6IXgAYvQmfflwouTM+rArE2eEaCtLlRqO81j7pRLCt81IefUei6Zbw==", + "dependencies": { + "@types/long": "^4.0.1", + "lodash.camelcase": "^4.3.0", + "long": "^4.0.0", + "protobufjs": "^7.0.0", + "yargs": "^16.2.0" + }, + "bin": { + "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.19", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz", + "integrity": "sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@mapbox/node-pre-gyp": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.11.tgz", + "integrity": "sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==", + "dev": true, + "dependencies": { + "detect-libc": "^2.0.0", + "https-proxy-agent": "^5.0.0", + "make-dir": "^3.1.0", + "node-fetch": "^2.6.7", + "nopt": "^5.0.0", + "npmlog": "^5.0.1", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.11" + }, + "bin": { + "node-pre-gyp": "bin/node-pre-gyp" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@prisma/client": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@prisma/client/-/client-5.1.1.tgz", + "integrity": "sha512-fxcCeK5pMQGcgCqCrWsi+I2rpIbk0rAhdrN+ke7f34tIrgPwA68ensrpin+9+fZvuV2OtzHmuipwduSY6HswdA==", + "hasInstallScript": true, + "dependencies": { + "@prisma/engines-version": "5.1.1-1.6a3747c37ff169c90047725a05a6ef02e32ac97e" + }, + "engines": { + "node": ">=16.13" + }, + "peerDependencies": { + "prisma": "*" + }, + "peerDependenciesMeta": { + "prisma": { + "optional": true + } + } + }, + "node_modules/@prisma/engines": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-5.1.1.tgz", + "integrity": "sha512-NV/4nVNWFZSJCCIA3HIFJbbDKO/NARc9ej0tX5S9k2EVbkrFJC4Xt9b0u4rNZWL4V+F5LAjvta8vzEUw0rw+HA==", + "devOptional": true, + "hasInstallScript": true + }, + "node_modules/@prisma/engines-version": { + "version": "5.1.1-1.6a3747c37ff169c90047725a05a6ef02e32ac97e", + "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-5.1.1-1.6a3747c37ff169c90047725a05a6ef02e32ac97e.tgz", + "integrity": "sha512-owZqbY/wucbr65bXJ/ljrHPgQU5xXTSkmcE/JcbqE1kusuAXV/TLN3/exmz21SZ5rJ7WDkyk70J2G/n68iogbQ==" + }, + "node_modules/@protobufjs/aspromise": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==" + }, + "node_modules/@protobufjs/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" + }, + "node_modules/@protobufjs/codegen": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", + "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" + }, + "node_modules/@protobufjs/eventemitter": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", + "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==" + }, + "node_modules/@protobufjs/fetch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", + "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", + "dependencies": { + "@protobufjs/aspromise": "^1.1.1", + "@protobufjs/inquire": "^1.1.0" + } + }, + "node_modules/@protobufjs/float": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", + "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==" + }, + "node_modules/@protobufjs/inquire": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", + "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==" + }, + "node_modules/@protobufjs/path": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==" + }, + "node_modules/@protobufjs/pool": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==" + }, + "node_modules/@protobufjs/utf8": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", + "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==" + }, + "node_modules/@tsconfig/node10": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", + "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", + "dev": true + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", + "dev": true + }, + "node_modules/@types/amqplib": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/@types/amqplib/-/amqplib-0.10.1.tgz", + "integrity": "sha512-j6ANKT79ncUDnAs/+9r9eDujxbeJoTjoVu33gHHcaPfmLQaMhvfbH2GqSe8KUM444epAp1Vl3peVOQfZk3UIqA==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/body-parser": { + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", + "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", + "dev": true, + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/chai": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.5.tgz", + "integrity": "sha512-mEo1sAde+UCE6b2hxn332f1g1E8WfYRu6p5SvTKr2ZKC1f7gFJXk4h5PyGP9Dt6gCaG8y8XhwnXWC6Iy2cmBng==", + "dev": true + }, + "node_modules/@types/chai-subset": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@types/chai-subset/-/chai-subset-1.3.3.tgz", + "integrity": "sha512-frBecisrNGz+F4T6bcc+NLeolfiojh5FxW2klu669+8BARtyQv2C/GkNW6FUodVe4BroGMP/wER/YDGc7rEllw==", + "dev": true, + "dependencies": { + "@types/chai": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.35", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", + "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/express": { + "version": "4.17.17", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.17.tgz", + "integrity": "sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==", + "dev": true, + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "4.17.35", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.35.tgz", + "integrity": "sha512-wALWQwrgiB2AWTT91CB62b6Yt0sNHpznUXeZEcnPU3DRdlDIz74x8Qg1UUYKSVFi+va5vKOLYRBI1bRKiLLKIg==", + "dev": true, + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/http-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-/K3ds8TRAfBvi5vfjuz8y6+GiAYBZ0x4tXv1Av6CWBWn0IlADc+ZX9pMq7oU0fNQPnBwIZl3rmeLp6SBApbxSQ==", + "dev": true + }, + "node_modules/@types/long": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz", + "integrity": "sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==" + }, + "node_modules/@types/mime": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", + "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==", + "dev": true + }, + "node_modules/@types/node": { + "version": "18.15.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.9.tgz", + "integrity": "sha512-dUxhiNzBLr6IqlZXz6e/rN2YQXlFgOei/Dxy+e3cyXTJ4txSUbGT2/fmnD6zd/75jDMeW5bDee+YXxlFKHoV0A==" + }, + "node_modules/@types/qs": { + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==", + "dev": true + }, + "node_modules/@types/range-parser": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", + "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==", + "dev": true + }, + "node_modules/@types/send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.1.tgz", + "integrity": "sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q==", + "dev": true, + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.2.tgz", + "integrity": "sha512-J2LqtvFYCzaj8pVYKw8klQXrLLk7TBZmQ4ShlcdkELFKGwGMfevMLneMMRkMgZxotOD9wg497LpC7O8PcvAmfw==", + "dev": true, + "dependencies": { + "@types/http-errors": "*", + "@types/mime": "*", + "@types/node": "*" + } + }, + "node_modules/@vitest/expect": { + "version": "0.29.8", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-0.29.8.tgz", + "integrity": "sha512-xlcVXn5I5oTq6NiZSY3ykyWixBxr5mG8HYtjvpgg6KaqHm0mvhX18xuwl5YGxIRNt/A5jidd7CWcNHrSvgaQqQ==", + "dev": true, + "dependencies": { + "@vitest/spy": "0.29.8", + "@vitest/utils": "0.29.8", + "chai": "^4.3.7" + } + }, + "node_modules/@vitest/runner": { + "version": "0.29.8", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-0.29.8.tgz", + "integrity": "sha512-FzdhnRDwEr/A3Oo1jtIk/B952BBvP32n1ObMEb23oEJNO+qO5cBet6M2XWIDQmA7BDKGKvmhUf2naXyp/2JEwQ==", + "dev": true, + "dependencies": { + "@vitest/utils": "0.29.8", + "p-limit": "^4.0.0", + "pathe": "^1.1.0" + } + }, + "node_modules/@vitest/spy": { + "version": "0.29.8", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-0.29.8.tgz", + "integrity": "sha512-VdjBe9w34vOMl5I5mYEzNX8inTxrZ+tYUVk9jxaZJmHFwmDFC/GV3KBFTA/JKswr3XHvZL+FE/yq5EVhb6pSAw==", + "dev": true, + "dependencies": { + "tinyspy": "^1.0.2" + } + }, + "node_modules/@vitest/utils": { + "version": "0.29.8", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-0.29.8.tgz", + "integrity": "sha512-qGzuf3vrTbnoY+RjjVVIBYfuWMjn3UMUqyQtdGNZ6ZIIyte7B37exj6LaVkrZiUTvzSadVvO/tJm8AEgbGCBPg==", + "dev": true, + "dependencies": { + "cli-truncate": "^3.1.0", + "diff": "^5.1.0", + "loupe": "^2.3.6", + "pretty-format": "^27.5.1" + } + }, + "node_modules/@vitest/utils/node_modules/diff": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.1.0.tgz", + "integrity": "sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/amqplib": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/amqplib/-/amqplib-0.10.3.tgz", + "integrity": "sha512-UHmuSa7n8vVW/a5HGh2nFPqAEr8+cD4dEZ6u9GjP91nHfr1a54RyAKyra7Sb5NH7NBKOUlyQSMXIp0qAixKexw==", + "dependencies": { + "@acuminous/bitsyntax": "^0.1.2", + "buffer-more-ints": "~1.0.0", + "readable-stream": "1.x >=1.1.9", + "url-parse": "~1.5.10" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/aproba": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", + "dev": true + }, + "node_modules/are-we-there-yet": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", + "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", + "dev": true, + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/are-we-there-yet/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/are-we-there-yet/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/are-we-there-yet/node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dev": true, + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/bl/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/bl/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/bl/node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/body-parser": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/buffer-more-ints": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-more-ints/-/buffer-more-ints-1.0.0.tgz", + "integrity": "sha512-EMetuGFz5SLsT0QTnXzINh4Ksr+oo4i+UGTXEshiGCQWnsgSs7ZhJ8fzlwQ+OzEMs0MpDAMr1hxnblp5a4vcHg==" + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/cac": { + "version": "6.7.14", + "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", + "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/chai": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.7.tgz", + "integrity": "sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==", + "dev": true, + "dependencies": { + "assertion-error": "^1.1.0", + "check-error": "^1.0.2", + "deep-eql": "^4.1.2", + "get-func-name": "^2.0.0", + "loupe": "^2.3.1", + "pathval": "^1.1.1", + "type-detect": "^4.0.5" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chalk/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/chalk/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/check-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", + "integrity": "sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/cli-truncate": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-3.1.0.tgz", + "integrity": "sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==", + "dev": true, + "dependencies": { + "slice-ansi": "^5.0.0", + "string-width": "^5.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-truncate/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/cli-truncate/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, + "node_modules/cli-truncate/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-truncate/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "dev": true, + "bin": { + "color-support": "bin.js" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", + "dev": true + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-disposition/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "dev": true, + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/deep-eql": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz", + "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==", + "dev": true, + "dependencies": { + "type-detect": "^4.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "dev": true, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", + "dev": true + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detect-libc": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.2.tgz", + "integrity": "sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dotenv": { + "version": "16.3.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.3.1.tgz", + "integrity": "sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/motdotla/dotenv?sponsor=1" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/esbuild": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.19.tgz", + "integrity": "sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.17.19", + "@esbuild/android-arm64": "0.17.19", + "@esbuild/android-x64": "0.17.19", + "@esbuild/darwin-arm64": "0.17.19", + "@esbuild/darwin-x64": "0.17.19", + "@esbuild/freebsd-arm64": "0.17.19", + "@esbuild/freebsd-x64": "0.17.19", + "@esbuild/linux-arm": "0.17.19", + "@esbuild/linux-arm64": "0.17.19", + "@esbuild/linux-ia32": "0.17.19", + "@esbuild/linux-loong64": "0.17.19", + "@esbuild/linux-mips64el": "0.17.19", + "@esbuild/linux-ppc64": "0.17.19", + "@esbuild/linux-riscv64": "0.17.19", + "@esbuild/linux-s390x": "0.17.19", + "@esbuild/linux-x64": "0.17.19", + "@esbuild/netbsd-x64": "0.17.19", + "@esbuild/openbsd-x64": "0.17.19", + "@esbuild/sunos-x64": "0.17.19", + "@esbuild/win32-arm64": "0.17.19", + "@esbuild/win32-ia32": "0.17.19", + "@esbuild/win32-x64": "0.17.19" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/expand-template": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", + "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/express": { + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.1", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.5.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/express/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/fast-glob": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", + "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + } + }, + "node_modules/from2/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "node_modules/from2/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/from2/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "dev": true + }, + "node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/fs-minipass/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "node_modules/gauge": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", + "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", + "dev": true, + "dependencies": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.2", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.1", + "object-assign": "^4.1.1", + "signal-exit": "^3.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-func-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", + "integrity": "sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/github-from-package": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", + "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==", + "dev": true + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globrex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz", + "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==", + "dev": true + }, + "node_modules/google-protobuf": { + "version": "3.21.2", + "resolved": "https://registry.npmjs.org/google-protobuf/-/google-protobuf-3.21.2.tgz", + "integrity": "sha512-3MSOYFO5U9mPGikIYCzK0SaThypfGgS6bHqrUGXG3DPHCrb+txNqeEcns1W0lkGfk0rCyNXm7xB9rMxnCiZOoA==" + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true + }, + "node_modules/grpc-server-reflection": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/grpc-server-reflection/-/grpc-server-reflection-0.1.5.tgz", + "integrity": "sha512-i69RYu6v65enzknNAPUgerFuVQfo+L3n9g4c1A/Sv5jUHMpxMIjSbBA+YWls9Sr4Flac4oohp4Gx8f389CaHuw==", + "dependencies": { + "google-protobuf": "^3.19.1" + } + }, + "node_modules/grpc-tools": { + "version": "1.12.4", + "resolved": "https://registry.npmjs.org/grpc-tools/-/grpc-tools-1.12.4.tgz", + "integrity": "sha512-5+mLAJJma3BjnW/KQp6JBjUMgvu7Mu3dBvBPd1dcbNIb+qiR0817zDpgPjS7gRb+l/8EVNIa3cB02xI9JLToKg==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "@mapbox/node-pre-gyp": "^1.0.5" + }, + "bin": { + "grpc_tools_node_protoc": "bin/protoc.js", + "grpc_tools_node_protoc_plugin": "bin/protoc_plugin.js" + } + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", + "dev": true + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dev": true, + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/ignore": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/ignore-by-default": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", + "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==", + "dev": true + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true + }, + "node_modules/into-stream": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/into-stream/-/into-stream-6.0.0.tgz", + "integrity": "sha512-XHbaOAvP+uFKUFsOgoNPRjLkwB+I22JFPFe5OjTkQ0nwgj6+pSjb4NmB6VMxaPshLiOf+zcpOCBQuLwC1KHhZA==", + "dev": true, + "dependencies": { + "from2": "^2.3.0", + "p-is-promise": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz", + "integrity": "sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonc-parser": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", + "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", + "dev": true + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/local-pkg": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.4.3.tgz", + "integrity": "sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==" + }, + "node_modules/long": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", + "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" + }, + "node_modules/loupe": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.6.tgz", + "integrity": "sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==", + "dev": true, + "dependencies": { + "get-func-name": "^2.0.0" + } + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minizlib/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mkdirp-classic": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", + "dev": true + }, + "node_modules/mlly": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.4.0.tgz", + "integrity": "sha512-ua8PAThnTwpprIaU47EPeZ/bPUVp2QYBbWMphUQpVdBI3Lgqzm5KZQ45Agm3YJedHXaIHl6pBGabaLSUPPSptg==", + "dev": true, + "dependencies": { + "acorn": "^8.9.0", + "pathe": "^1.1.1", + "pkg-types": "^1.0.3", + "ufo": "^1.1.2" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/multistream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/multistream/-/multistream-4.1.0.tgz", + "integrity": "sha512-J1XDiAmmNpRCBfIWJv+n0ymC4ABcf/Pl+5YvC5B/D2f/2+8PtHvCNxMPKiQcZyi922Hq69J2YOpb1pTywfifyw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "once": "^1.4.0", + "readable-stream": "^3.6.0" + } + }, + "node_modules/multistream/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/multistream/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/multistream/node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/nanoid": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", + "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/napi-build-utils": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", + "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==", + "dev": true + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/node-abi": { + "version": "3.47.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.47.0.tgz", + "integrity": "sha512-2s6B2CWZM//kPgwnuI0KrYwNjfdByE25zvAaEpq9IH4zcNsarH8Ihu/UuX6XMPEogDAxkuUFeZn60pXNHAqn3A==", + "dev": true, + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/node-fetch": { + "version": "2.6.13", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.13.tgz", + "integrity": "sha512-StxNAxh15zr77QvvkmveSQ8uCQ4+v5FkvNTj0OESmiHu+VRi/gXArXtkWMElOsOUNLtUEvI4yS+rdtOHZTwlQA==", + "dev": true, + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/nodemon": { + "version": "2.0.22", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.22.tgz", + "integrity": "sha512-B8YqaKMmyuCO7BowF1Z1/mkPqLk6cs/l63Ojtd6otKjMx47Dq1utxfRxcavH1I7VSaL8n5BUaoutadnsX3AAVQ==", + "dev": true, + "dependencies": { + "chokidar": "^3.5.2", + "debug": "^3.2.7", + "ignore-by-default": "^1.0.1", + "minimatch": "^3.1.2", + "pstree.remy": "^1.1.8", + "semver": "^5.7.1", + "simple-update-notifier": "^1.0.7", + "supports-color": "^5.5.0", + "touch": "^3.1.0", + "undefsafe": "^2.0.5" + }, + "bin": { + "nodemon": "bin/nodemon.js" + }, + "engines": { + "node": ">=8.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/nodemon" + } + }, + "node_modules/nodemon/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/nodemon/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "dev": true, + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npmlog": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", + "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", + "dev": true, + "dependencies": { + "are-we-there-yet": "^2.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^3.0.0", + "set-blocking": "^2.0.0" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/p-is-promise": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-3.0.0.tgz", + "integrity": "sha512-Wo8VsW4IRQSKVXsJCn7TomUaVtyfjVDn3nUP7kE967BQk0CwFpdbZs0X0uk5sW9mkBa9eNM7hCMaG93WUAwxYQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-limit": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", + "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^1.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/pathe": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.1.tgz", + "integrity": "sha512-d+RQGp0MAYTIaDBIMmOfMwz3E+LOZnxx1HZd5R18mmCZY0QBlK0LDZfPc8FW8Ed2DlvsuE6PRjroDY+wg4+j/Q==", + "dev": true + }, + "node_modules/pathval": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", + "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pkg": { + "version": "5.8.1", + "resolved": "https://registry.npmjs.org/pkg/-/pkg-5.8.1.tgz", + "integrity": "sha512-CjBWtFStCfIiT4Bde9QpJy0KeH19jCfwZRJqHFDFXfhUklCx8JoFmMj3wgnEYIwGmZVNkhsStPHEOnrtrQhEXA==", + "dev": true, + "dependencies": { + "@babel/generator": "7.18.2", + "@babel/parser": "7.18.4", + "@babel/types": "7.19.0", + "chalk": "^4.1.2", + "fs-extra": "^9.1.0", + "globby": "^11.1.0", + "into-stream": "^6.0.0", + "is-core-module": "2.9.0", + "minimist": "^1.2.6", + "multistream": "^4.1.0", + "pkg-fetch": "3.4.2", + "prebuild-install": "7.1.1", + "resolve": "^1.22.0", + "stream-meter": "^1.0.4" + }, + "bin": { + "pkg": "lib-es5/bin.js" + }, + "peerDependencies": { + "node-notifier": ">=9.0.1" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/pkg-fetch": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/pkg-fetch/-/pkg-fetch-3.4.2.tgz", + "integrity": "sha512-0+uijmzYcnhC0hStDjm/cl2VYdrmVVBpe7Q8k9YBojxmR5tG8mvR9/nooQq3QSXiQqORDVOTY3XqMEqJVIzkHA==", + "dev": true, + "dependencies": { + "chalk": "^4.1.2", + "fs-extra": "^9.1.0", + "https-proxy-agent": "^5.0.0", + "node-fetch": "^2.6.6", + "progress": "^2.0.3", + "semver": "^7.3.5", + "tar-fs": "^2.1.1", + "yargs": "^16.2.0" + }, + "bin": { + "pkg-fetch": "lib-es5/bin.js" + } + }, + "node_modules/pkg-types": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.0.3.tgz", + "integrity": "sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==", + "dev": true, + "dependencies": { + "jsonc-parser": "^3.2.0", + "mlly": "^1.2.0", + "pathe": "^1.1.0" + } + }, + "node_modules/postcss": { + "version": "8.4.28", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.28.tgz", + "integrity": "sha512-Z7V5j0cq8oEKyejIKfpD8b4eBy9cwW2JWPk0+fB1HOAMsfHbnAXLLS+PfVWlzMSLQaWttKDt607I0XHmpE67Vw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/prebuild-install": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.1.tgz", + "integrity": "sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==", + "dev": true, + "dependencies": { + "detect-libc": "^2.0.0", + "expand-template": "^2.0.3", + "github-from-package": "0.0.0", + "minimist": "^1.2.3", + "mkdirp-classic": "^0.5.3", + "napi-build-utils": "^1.0.1", + "node-abi": "^3.3.0", + "pump": "^3.0.0", + "rc": "^1.2.7", + "simple-get": "^4.0.0", + "tar-fs": "^2.0.0", + "tunnel-agent": "^0.6.0" + }, + "bin": { + "prebuild-install": "bin.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/pretty-format": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", + "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/prisma": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/prisma/-/prisma-5.1.1.tgz", + "integrity": "sha512-WJFG/U7sMmcc6TjJTTifTfpI6Wjoh55xl4AzopVwAdyK68L9/ogNo8QQ2cxuUjJf/Wa82z/uhyh3wMzvRIBphg==", + "devOptional": true, + "hasInstallScript": true, + "dependencies": { + "@prisma/engines": "5.1.1" + }, + "bin": { + "prisma": "build/index.js" + }, + "engines": { + "node": ">=16.13" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/protobufjs": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.2.2.tgz", + "integrity": "sha512-++PrQIjrom+bFDPpfmqXfAGSQs40116JRrqqyf53dymUMvvb5d/LMRyicRoF1AUKoXVS1/IgJXlEgcpr4gTF3Q==", + "hasInstallScript": true, + "dependencies": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/node": ">=13.7.0", + "long": "^5.0.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/protobufjs/node_modules/long": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", + "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==" + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/pstree.remy": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", + "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", + "dev": true + }, + "node_modules/pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==" + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dev": true, + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, + "node_modules/react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", + "dev": true + }, + "node_modules/readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==" + }, + "node_modules/resolve": { + "version": "1.22.4", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.4.tgz", + "integrity": "sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==", + "dev": true, + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve/node_modules/is-core-module": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", + "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rollup": { + "version": "3.28.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.28.0.tgz", + "integrity": "sha512-d7zhvo1OUY2SXSM6pfNjgD5+d0Nz87CUp4mt8l/GgVP3oBsPwzNvSzyu1me6BSG9JIgWNTVcafIXBIyM8yQ3yw==", + "dev": true, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=14.18.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "dev": true + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/siginfo": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", + "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", + "dev": true + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "node_modules/simple-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/simple-get": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", + "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "decompress-response": "^6.0.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } + }, + "node_modules/simple-update-notifier": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-1.1.0.tgz", + "integrity": "sha512-VpsrsJSUcJEseSbMHkrsrAVSdvVS5I96Qo1QAQ4FxQ9wXFcB+pjj7FB7/us9+GcgfW4ziHtYMc1J0PLczb55mg==", + "dev": true, + "dependencies": { + "semver": "~7.0.0" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/simple-update-notifier/node_modules/semver": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", + "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/slice-ansi": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", + "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.0.0", + "is-fullwidth-code-point": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/slice-ansi/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/slice-ansi/node_modules/is-fullwidth-code-point": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", + "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stackback": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", + "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", + "dev": true + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/std-env": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.4.0.tgz", + "integrity": "sha512-YqHeQIIQ8r1VtUZOTOyjsAXAsjr369SplZ5rlQaiJTBsvodvPSCME7vuz8pnQltbQ0Cw0lyFo5Q8uyNwYQ58Xw==", + "dev": true + }, + "node_modules/stream-meter": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/stream-meter/-/stream-meter-1.0.4.tgz", + "integrity": "sha512-4sOEtrbgFotXwnEuzzsQBYEV1elAeFSO8rSGeTwabuX1RRn/kEq9JVH7I0MRBhKVRR0sJkr0M0QCH7yOLf9fhQ==", + "dev": true, + "dependencies": { + "readable-stream": "^2.1.4" + } + }, + "node_modules/stream-meter/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "node_modules/stream-meter/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/stream-meter/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==" + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-literal": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-1.3.0.tgz", + "integrity": "sha512-PugKzOsyXpArk0yWmUwqOZecSO0GH0bPoctLcqNDH9J04pVW3lflYE0ujElBGTloevcxF5MofAOZ7C5l2b+wLg==", + "dev": true, + "dependencies": { + "acorn": "^8.10.0" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/stripe": { + "version": "12.18.0", + "resolved": "https://registry.npmjs.org/stripe/-/stripe-12.18.0.tgz", + "integrity": "sha512-cYjgBM2SY/dTm8Lr6eMyyONaHTZHA/QjHxFUIW5WH8FevSRIGAVtXEmBkUXF1fsqe7QvvRgQSGSJZmjDacegGg==", + "dependencies": { + "@types/node": ">=8.1.0", + "qs": "^6.11.0" + }, + "engines": { + "node": ">=12.*" + } + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tar": { + "version": "6.1.15", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.15.tgz", + "integrity": "sha512-/zKt9UyngnxIT/EAGYuxaMYgOIJiP81ab9ZfkILq4oNLPFX50qyYmu7jRj9qeXoxmJHjGlbH0+cm2uy1WCs10A==", + "dev": true, + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/tar-fs": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", + "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", + "dev": true, + "dependencies": { + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.1.4" + } + }, + "node_modules/tar-fs/node_modules/chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "dev": true + }, + "node_modules/tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "dev": true, + "dependencies": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tar-stream/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/tar-stream/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/tar-stream/node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/tinybench": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.5.0.tgz", + "integrity": "sha512-kRwSG8Zx4tjF9ZiyH4bhaebu+EDz1BOx9hOigYHlUW4xxI/wKIUQUqo018UlU4ar6ATPBsaMrdbKZ+tmPdohFA==", + "dev": true + }, + "node_modules/tinypool": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-0.4.0.tgz", + "integrity": "sha512-2ksntHOKf893wSAH4z/+JbPpi92esw8Gn9N2deXX+B0EO92hexAVI9GIZZPx7P5aYo5KULfeOSt3kMOmSOy6uA==", + "dev": true, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tinyspy": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-1.1.1.tgz", + "integrity": "sha512-UVq5AXt/gQlti7oxoIg5oi/9r0WpF7DGEVwXgqWSMmyN16+e3tl5lIvTaOpJ3TAtu5xFzWccFRM4R5NaWHF+4g==", + "dev": true, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/touch": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", + "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", + "dev": true, + "dependencies": { + "nopt": "~1.0.10" + }, + "bin": { + "nodetouch": "bin/nodetouch.js" + } + }, + "node_modules/touch/node_modules/nopt": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", + "integrity": "sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==", + "dev": true, + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "*" + } + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "dev": true + }, + "node_modules/ts-node": { + "version": "10.9.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", + "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", + "dev": true, + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "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 + } + } + }, + "node_modules/tsconfck": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/tsconfck/-/tsconfck-2.1.2.tgz", + "integrity": "sha512-ghqN1b0puy3MhhviwO2kGF8SeMDNhEbnKxjK7h6+fvY9JAxqvXi8y5NAHSQv687OVboS2uZIByzGd45/YxrRHg==", + "dev": true, + "bin": { + "tsconfck": "bin/tsconfck.js" + }, + "engines": { + "node": "^14.13.1 || ^16 || >=18" + }, + "peerDependencies": { + "typescript": "^4.3.5 || ^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/tsconfig-paths": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", + "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==", + "dev": true, + "dependencies": { + "json5": "^2.2.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "dev": true, + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typescript": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.2.tgz", + "integrity": "sha512-wVORMBGO/FAs/++blGNeAVdbNKtIh1rbBL2EyQ1+J9lClJ93KiiKe8PmFIVdXhHcyv44SL9oglmfeSsndo0jRw==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=12.20" + } + }, + "node_modules/ufo": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.2.0.tgz", + "integrity": "sha512-RsPyTbqORDNDxqAdQPQBpgqhWle1VcTSou/FraClYlHf6TZnQcGslpLcAphNR+sQW4q5lLWLbOsRlh9j24baQg==", + "dev": true + }, + "node_modules/undefsafe": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", + "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", + "dev": true + }, + "node_modules/universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/url-parse": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/vite": { + "version": "4.4.9", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.4.9.tgz", + "integrity": "sha512-2mbUn2LlUmNASWwSCNSJ/EG2HuSRTnVNaydp6vMCm5VIqJsjMfbIWtbH2kDuwUVW5mMUKKZvGPX/rqeqVvv1XA==", + "dev": true, + "dependencies": { + "esbuild": "^0.18.10", + "postcss": "^8.4.27", + "rollup": "^3.27.1" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + }, + "peerDependencies": { + "@types/node": ">= 14", + "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 + } + } + }, + "node_modules/vite-node": { + "version": "0.29.8", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-0.29.8.tgz", + "integrity": "sha512-b6OtCXfk65L6SElVM20q5G546yu10/kNrhg08afEoWlFRJXFq9/6glsvSVY+aI6YeC1tu2TtAqI2jHEQmOmsFw==", + "dev": true, + "dependencies": { + "cac": "^6.7.14", + "debug": "^4.3.4", + "mlly": "^1.1.0", + "pathe": "^1.1.0", + "picocolors": "^1.0.0", + "vite": "^3.0.0 || ^4.0.0" + }, + "bin": { + "vite-node": "vite-node.mjs" + }, + "engines": { + "node": ">=v14.16.0" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/vite-tsconfig-paths": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/vite-tsconfig-paths/-/vite-tsconfig-paths-4.2.0.tgz", + "integrity": "sha512-jGpus0eUy5qbbMVGiTxCL1iB9ZGN6Bd37VGLJU39kTDD6ZfULTTb1bcc5IeTWqWJKiWV5YihCaibeASPiGi8kw==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "globrex": "^0.1.2", + "tsconfck": "^2.1.0" + }, + "peerDependencies": { + "vite": "*" + }, + "peerDependenciesMeta": { + "vite": { + "optional": true + } + } + }, + "node_modules/vite/node_modules/@esbuild/android-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", + "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/android-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz", + "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/android-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz", + "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/darwin-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz", + "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/darwin-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz", + "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/freebsd-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz", + "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/freebsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz", + "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz", + "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz", + "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz", + "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-loong64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", + "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-mips64el": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz", + "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-ppc64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz", + "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-riscv64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz", + "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-s390x": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz", + "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz", + "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/netbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz", + "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/openbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz", + "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/sunos-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz", + "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/win32-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", + "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/win32-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz", + "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/win32-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", + "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/esbuild": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", + "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.18.20", + "@esbuild/android-arm64": "0.18.20", + "@esbuild/android-x64": "0.18.20", + "@esbuild/darwin-arm64": "0.18.20", + "@esbuild/darwin-x64": "0.18.20", + "@esbuild/freebsd-arm64": "0.18.20", + "@esbuild/freebsd-x64": "0.18.20", + "@esbuild/linux-arm": "0.18.20", + "@esbuild/linux-arm64": "0.18.20", + "@esbuild/linux-ia32": "0.18.20", + "@esbuild/linux-loong64": "0.18.20", + "@esbuild/linux-mips64el": "0.18.20", + "@esbuild/linux-ppc64": "0.18.20", + "@esbuild/linux-riscv64": "0.18.20", + "@esbuild/linux-s390x": "0.18.20", + "@esbuild/linux-x64": "0.18.20", + "@esbuild/netbsd-x64": "0.18.20", + "@esbuild/openbsd-x64": "0.18.20", + "@esbuild/sunos-x64": "0.18.20", + "@esbuild/win32-arm64": "0.18.20", + "@esbuild/win32-ia32": "0.18.20", + "@esbuild/win32-x64": "0.18.20" + } + }, + "node_modules/vitest": { + "version": "0.29.8", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-0.29.8.tgz", + "integrity": "sha512-JIAVi2GK5cvA6awGpH0HvH/gEG9PZ0a/WoxdiV3PmqK+3CjQMf8c+J/Vhv4mdZ2nRyXFw66sAg6qz7VNkaHfDQ==", + "dev": true, + "dependencies": { + "@types/chai": "^4.3.4", + "@types/chai-subset": "^1.3.3", + "@types/node": "*", + "@vitest/expect": "0.29.8", + "@vitest/runner": "0.29.8", + "@vitest/spy": "0.29.8", + "@vitest/utils": "0.29.8", + "acorn": "^8.8.1", + "acorn-walk": "^8.2.0", + "cac": "^6.7.14", + "chai": "^4.3.7", + "debug": "^4.3.4", + "local-pkg": "^0.4.2", + "pathe": "^1.1.0", + "picocolors": "^1.0.0", + "source-map": "^0.6.1", + "std-env": "^3.3.1", + "strip-literal": "^1.0.0", + "tinybench": "^2.3.1", + "tinypool": "^0.4.0", + "tinyspy": "^1.0.2", + "vite": "^3.0.0 || ^4.0.0", + "vite-node": "0.29.8", + "why-is-node-running": "^2.2.2" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": ">=v14.16.0" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@vitest/browser": "*", + "@vitest/ui": "*", + "happy-dom": "*", + "jsdom": "*", + "playwright": "*", + "safaridriver": "*", + "webdriverio": "*" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@vitest/browser": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + }, + "playwright": { + "optional": true + }, + "safaridriver": { + "optional": true + }, + "webdriverio": { + "optional": true + } + } + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "dev": true + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dev": true, + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/why-is-node-running": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.2.2.tgz", + "integrity": "sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==", + "dev": true, + "dependencies": { + "siginfo": "^2.0.0", + "stackback": "0.0.2" + }, + "bin": { + "why-is-node-running": "cli.js" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wide-align": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", + "dev": true, + "dependencies": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "engines": { + "node": ">=10" + } + }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/yocto-queue": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", + "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", + "dev": true, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/services/product/package-lock.json b/services/product/package-lock.json new file mode 100644 index 00000000..46afd284 --- /dev/null +++ b/services/product/package-lock.json @@ -0,0 +1,5753 @@ +{ + "name": "@goodfood/product", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "@goodfood/product", + "hasInstallScript": true, + "dependencies": { + "@azure/storage-blob": "^12.14.0", + "@grpc/grpc-js": "^1.8.14", + "@grpc/proto-loader": "^0.7.6", + "@prisma/client": "^4.16.2", + "amqplib": "^0.10.3", + "base64-arraybuffer": "^1.0.2", + "express": "^4.18.2", + "nodemon": "^1.14.9", + "pkg": "^5.8.1", + "vite-tsconfig-paths": "^4.2.0" + }, + "bin": { + "product": "dist/index.js" + }, + "devDependencies": { + "@types/amqplib": "^0.10.1", + "@types/node": "^18.16.7", + "esbuild": "^0.18.11", + "prisma": "^4.16.2", + "ts-node": "^10.9.1", + "tsconfig-paths": "^4.2.0", + "typescript": "^5.0.2" + } + }, + "node_modules/@acuminous/bitsyntax": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@acuminous/bitsyntax/-/bitsyntax-0.1.2.tgz", + "integrity": "sha512-29lUK80d1muEQqiUsSo+3A0yP6CdspgC95EnKBMi22Xlwt79i/En4Vr67+cXhU+cZjbti3TgGGC5wy1stIywVQ==", + "dependencies": { + "buffer-more-ints": "~1.0.0", + "debug": "^4.3.4", + "safe-buffer": "~5.1.2" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/@azure/abort-controller": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@azure/abort-controller/-/abort-controller-1.1.0.tgz", + "integrity": "sha512-TrRLIoSQVzfAJX9H1JeFjzAoDGcoK1IYX1UImfceTZpsyYfWr09Ss1aHW1y5TrrR3iq6RZLBwJ3E24uwPhwahw==", + "dependencies": { + "tslib": "^2.2.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/@azure/core-auth": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@azure/core-auth/-/core-auth-1.5.0.tgz", + "integrity": "sha512-udzoBuYG1VBoHVohDTrvKjyzel34zt77Bhp7dQntVGGD0ehVq48owENbBG8fIgkHRNUBQH5k1r0hpoMu5L8+kw==", + "dependencies": { + "@azure/abort-controller": "^1.0.0", + "@azure/core-util": "^1.1.0", + "tslib": "^2.2.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@azure/core-http": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@azure/core-http/-/core-http-3.0.2.tgz", + "integrity": "sha512-o1wR9JrmoM0xEAa0Ue7Sp8j+uJvmqYaGoHOCT5qaVYmvgmnZDC0OvQimPA/JR3u77Sz6D1y3Xmk1y69cDU9q9A==", + "dependencies": { + "@azure/abort-controller": "^1.0.0", + "@azure/core-auth": "^1.3.0", + "@azure/core-tracing": "1.0.0-preview.13", + "@azure/core-util": "^1.1.1", + "@azure/logger": "^1.0.0", + "@types/node-fetch": "^2.5.0", + "@types/tunnel": "^0.0.3", + "form-data": "^4.0.0", + "node-fetch": "^2.6.7", + "process": "^0.11.10", + "tslib": "^2.2.0", + "tunnel": "^0.0.6", + "uuid": "^8.3.0", + "xml2js": "^0.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@azure/core-lro": { + "version": "2.5.4", + "resolved": "https://registry.npmjs.org/@azure/core-lro/-/core-lro-2.5.4.tgz", + "integrity": "sha512-3GJiMVH7/10bulzOKGrrLeG/uCBH/9VtxqaMcB9lIqAeamI/xYQSHJL/KcsLDuH+yTjYpro/u6D/MuRe4dN70Q==", + "dependencies": { + "@azure/abort-controller": "^1.0.0", + "@azure/core-util": "^1.2.0", + "@azure/logger": "^1.0.0", + "tslib": "^2.2.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@azure/core-paging": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@azure/core-paging/-/core-paging-1.5.0.tgz", + "integrity": "sha512-zqWdVIt+2Z+3wqxEOGzR5hXFZ8MGKK52x4vFLw8n58pR6ZfKRx3EXYTxTaYxYHc/PexPUTyimcTWFJbji9Z6Iw==", + "dependencies": { + "tslib": "^2.2.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@azure/core-tracing": { + "version": "1.0.0-preview.13", + "resolved": "https://registry.npmjs.org/@azure/core-tracing/-/core-tracing-1.0.0-preview.13.tgz", + "integrity": "sha512-KxDlhXyMlh2Jhj2ykX6vNEU0Vou4nHr025KoSEiz7cS3BNiHNaZcdECk/DmLkEB0as5T7b/TpRcehJ5yV6NeXQ==", + "dependencies": { + "@opentelemetry/api": "^1.0.1", + "tslib": "^2.2.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/@azure/core-util": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@azure/core-util/-/core-util-1.4.0.tgz", + "integrity": "sha512-eGAyJpm3skVQoLiRqm/xPa+SXi/NPDdSHMxbRAz2lSprd+Zs+qrpQGQQ2VQ3Nttu+nSZR4XoYQC71LbEI7jsig==", + "dependencies": { + "@azure/abort-controller": "^1.0.0", + "tslib": "^2.2.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@azure/logger": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@azure/logger/-/logger-1.0.4.tgz", + "integrity": "sha512-ustrPY8MryhloQj7OWGe+HrYx+aoiOxzbXTtgblbV3xwCqpzUK36phH3XNHQKj3EPonyFUuDTfR3qFhTEAuZEg==", + "dependencies": { + "tslib": "^2.2.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@azure/storage-blob": { + "version": "12.15.0", + "resolved": "https://registry.npmjs.org/@azure/storage-blob/-/storage-blob-12.15.0.tgz", + "integrity": "sha512-e7JBKLOFi0QVJqqLzrjx1eL3je3/Ug2IQj24cTM9b85CsnnFjLGeGjJVIjbGGZaytewiCEG7r3lRwQX7fKj0/w==", + "dependencies": { + "@azure/abort-controller": "^1.0.0", + "@azure/core-http": "^3.0.0", + "@azure/core-lro": "^2.2.0", + "@azure/core-paging": "^1.1.1", + "@azure/core-tracing": "1.0.0-preview.13", + "@azure/logger": "^1.0.0", + "events": "^3.0.0", + "tslib": "^2.2.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@babel/generator": { + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.2.tgz", + "integrity": "sha512-W1lG5vUwFvfMd8HVXqdfbuG7RuaSrTCCD8cl8fP8wOivdbtbIg2Db3IWUcgvfxKbbn6ZBGYRW/Zk1MIwK49mgw==", + "dependencies": { + "@babel/types": "^7.18.2", + "@jridgewell/gen-mapping": "^0.3.0", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", + "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz", + "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.18.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.4.tgz", + "integrity": "sha512-FDge0dFazETFcxGw/EXzOkN8uJp0PC7Qbm+Pe9T+av2zlBpOgunFHkQPPn+eRuClU73JF+98D531UgayY89tow==", + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/types": { + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.19.0.tgz", + "integrity": "sha512-YuGopBq3ke25BVSiS6fgF49Ul9gH1x70Bcr6bqRLjWCkcX8Hre1/5+z+IiWOIerRMSSEfGZVB9z9kyq7wVs9YA==", + "dependencies": { + "@babel/helper-string-parser": "^7.18.10", + "@babel/helper-validator-identifier": "^7.18.6", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", + "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz", + "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz", + "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz", + "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz", + "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz", + "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz", + "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz", + "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz", + "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz", + "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", + "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz", + "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz", + "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz", + "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz", + "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz", + "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz", + "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz", + "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz", + "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", + "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz", + "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", + "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@grpc/grpc-js": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.9.0.tgz", + "integrity": "sha512-H8+iZh+kCE6VR/Krj6W28Y/ZlxoZ1fOzsNt77nrdE3knkbSelW1Uus192xOFCxHyeszLj8i4APQkSIXjAoOxXg==", + "dependencies": { + "@grpc/proto-loader": "^0.7.0", + "@types/node": ">=12.12.47" + }, + "engines": { + "node": "^8.13.0 || >=10.10.0" + } + }, + "node_modules/@grpc/proto-loader": { + "version": "0.7.8", + "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.8.tgz", + "integrity": "sha512-GU12e2c8dmdXb7XUlOgYWZ2o2i+z9/VeACkxTA/zzAe2IjclC5PnVL0lpgjhrqfpDYHzM8B1TF6pqWegMYAzlA==", + "dependencies": { + "@types/long": "^4.0.1", + "lodash.camelcase": "^4.3.0", + "long": "^4.0.0", + "protobufjs": "^7.2.4", + "yargs": "^17.7.2" + }, + "bin": { + "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.19", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz", + "integrity": "sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@opentelemetry/api": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.4.1.tgz", + "integrity": "sha512-O2yRJce1GOc6PAy3QxFM4NzFiWzvScDC1/5ihYBL6BUEVdq0XMWN01sppE+H6bBXbaFYipjwFLEWLg5PaSOThA==", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@prisma/client": { + "version": "4.16.2", + "resolved": "https://registry.npmjs.org/@prisma/client/-/client-4.16.2.tgz", + "integrity": "sha512-qCoEyxv1ZrQ4bKy39GnylE8Zq31IRmm8bNhNbZx7bF2cU5aiCCnSa93J2imF88MBjn7J9eUQneNxUQVJdl/rPQ==", + "hasInstallScript": true, + "dependencies": { + "@prisma/engines-version": "4.16.1-1.4bc8b6e1b66cb932731fb1bdbbc550d1e010de81" + }, + "engines": { + "node": ">=14.17" + }, + "peerDependencies": { + "prisma": "*" + }, + "peerDependenciesMeta": { + "prisma": { + "optional": true + } + } + }, + "node_modules/@prisma/engines": { + "version": "4.16.2", + "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-4.16.2.tgz", + "integrity": "sha512-vx1nxVvN4QeT/cepQce68deh/Turxy5Mr+4L4zClFuK1GlxN3+ivxfuv+ej/gvidWn1cE1uAhW7ALLNlYbRUAw==", + "devOptional": true, + "hasInstallScript": true + }, + "node_modules/@prisma/engines-version": { + "version": "4.16.1-1.4bc8b6e1b66cb932731fb1bdbbc550d1e010de81", + "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-4.16.1-1.4bc8b6e1b66cb932731fb1bdbbc550d1e010de81.tgz", + "integrity": "sha512-q617EUWfRIDTriWADZ4YiWRZXCa/WuhNgLTVd+HqWLffjMSPzyM5uOWoauX91wvQClSKZU4pzI4JJLQ9Kl62Qg==" + }, + "node_modules/@protobufjs/aspromise": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==" + }, + "node_modules/@protobufjs/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" + }, + "node_modules/@protobufjs/codegen": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", + "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" + }, + "node_modules/@protobufjs/eventemitter": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", + "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==" + }, + "node_modules/@protobufjs/fetch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", + "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", + "dependencies": { + "@protobufjs/aspromise": "^1.1.1", + "@protobufjs/inquire": "^1.1.0" + } + }, + "node_modules/@protobufjs/float": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", + "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==" + }, + "node_modules/@protobufjs/inquire": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", + "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==" + }, + "node_modules/@protobufjs/path": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==" + }, + "node_modules/@protobufjs/pool": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==" + }, + "node_modules/@protobufjs/utf8": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", + "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==" + }, + "node_modules/@tsconfig/node10": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", + "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", + "dev": true + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", + "dev": true + }, + "node_modules/@types/amqplib": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/@types/amqplib/-/amqplib-0.10.1.tgz", + "integrity": "sha512-j6ANKT79ncUDnAs/+9r9eDujxbeJoTjoVu33gHHcaPfmLQaMhvfbH2GqSe8KUM444epAp1Vl3peVOQfZk3UIqA==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/long": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz", + "integrity": "sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==" + }, + "node_modules/@types/node": { + "version": "18.17.6", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.17.6.tgz", + "integrity": "sha512-fGmT/P7z7ecA6bv/ia5DlaWCH4YeZvAQMNpUhrJjtAhOhZfoxS1VLUgU2pdk63efSjQaOJWdXMuAJsws+8I6dg==" + }, + "node_modules/@types/node-fetch": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.4.tgz", + "integrity": "sha512-1ZX9fcN4Rvkvgv4E6PAY5WXUFWFcRWxZa3EW83UjycOB9ljJCedb2CupIP4RZMEwF/M3eTcCihbBRgwtGbg5Rg==", + "dependencies": { + "@types/node": "*", + "form-data": "^3.0.0" + } + }, + "node_modules/@types/node-fetch/node_modules/form-data": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", + "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@types/tunnel": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/@types/tunnel/-/tunnel-0.0.3.tgz", + "integrity": "sha512-sOUTGn6h1SfQ+gbgqC364jLFBw2lnFqkgF3q0WovEHRLMrVD1sd5aufqi/aJObLekJO+Aq5z646U4Oxy6shXMA==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/amqplib": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/amqplib/-/amqplib-0.10.3.tgz", + "integrity": "sha512-UHmuSa7n8vVW/a5HGh2nFPqAEr8+cD4dEZ6u9GjP91nHfr1a54RyAKyra7Sb5NH7NBKOUlyQSMXIp0qAixKexw==", + "dependencies": { + "@acuminous/bitsyntax": "^0.1.2", + "buffer-more-ints": "~1.0.0", + "readable-stream": "1.x >=1.1.9", + "url-parse": "~1.5.10" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/ansi-align": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-2.0.0.tgz", + "integrity": "sha512-TdlOggdA/zURfMYa7ABC66j+oqfMew58KpJMbUlH3bcZP1b+cBHIHDDn5uH9INsxrHBPjsqM0tDB4jPTF/vgJA==", + "dependencies": { + "string-width": "^2.0.0" + } + }, + "node_modules/ansi-regex": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", + "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dependencies": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + } + }, + "node_modules/anymatch/node_modules/normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==", + "dependencies": { + "remove-trailing-separator": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true + }, + "node_modules/arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/async-each": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.6.tgz", + "integrity": "sha512-c646jH1avxr+aVpndVMeAfYw7wAa6idufrlN3LPA4PmKS0QEGp6PIC9nwz0WQkkvBGAMEki3pFdtxaF39J9vvg==", + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ] + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "node_modules/at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "bin": { + "atob": "bin/atob.js" + }, + "engines": { + "node": ">= 4.5.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dependencies": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base64-arraybuffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz", + "integrity": "sha512-I3yl4r9QB5ZRY3XuJVEPfc2XhZO6YweFPI+UovAzn+8/hb3oJ6lnysaFcjVpkCPfVWFUDvoZ8kmVDP7WyRtYtQ==", + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "optional": true, + "dependencies": { + "file-uri-to-path": "1.0.0" + } + }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/bl/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/bl/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/bl/node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/body-parser": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/boxen": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-1.3.0.tgz", + "integrity": "sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw==", + "dependencies": { + "ansi-align": "^2.0.0", + "camelcase": "^4.0.0", + "chalk": "^2.0.1", + "cli-boxes": "^1.0.0", + "string-width": "^2.0.0", + "term-size": "^1.2.0", + "widest-line": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/boxen/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/boxen/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/boxen/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/boxen/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dependencies": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/buffer-more-ints": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-more-ints/-/buffer-more-ints-1.0.0.tgz", + "integrity": "sha512-EMetuGFz5SLsT0QTnXzINh4Ksr+oo4i+UGTXEshiGCQWnsgSs7ZhJ8fzlwQ+OzEMs0MpDAMr1hxnblp5a4vcHg==" + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dependencies": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha512-FxAv7HpHrXbh3aPo4o2qxHay2lkLY3x5Mw3KeE4KQE8ysVfziWeRZDwcjauvwBSGEC/nXUPzZy8zeh4HokqOnw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/capture-stack-trace": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.2.tgz", + "integrity": "sha512-X/WM2UQs6VMHUtjUDnZTRI+i1crWteJySFzr9UpGoQa4WQffXVTTXuekjl7TjZRlcF2XfjgITT0HxZ9RnxeT0w==", + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chalk/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/chalk/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "deprecated": "Chokidar 2 does not receive security updates since 2019. Upgrade to chokidar 3 with 15x fewer dependencies", + "dependencies": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + }, + "optionalDependencies": { + "fsevents": "^1.2.7" + } + }, + "node_modules/chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" + }, + "node_modules/ci-info": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.6.0.tgz", + "integrity": "sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==" + }, + "node_modules/class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "dependencies": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/is-descriptor/node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cli-boxes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz", + "integrity": "sha512-3Fo5wu8Ytle8q9iCzS4D2MWVL2X7JVWRiS1BnXbTFDhS9c/REkM9vd1AmabsoZoY5/dGi5TT9iKL8Kb6DeBRQg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/cliui/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw==", + "dependencies": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "node_modules/configstore": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.5.tgz", + "integrity": "sha512-nlOhI4+fdzoK5xmJ+NY+1gZK56bwEaWZr8fYuXohZ9Vkc1o3a4T/R3M+yE/w7x/ZVJ1zF8c+oaOvF0dztdUgmA==", + "dependencies": { + "dot-prop": "^4.2.1", + "graceful-fs": "^4.1.2", + "make-dir": "^1.0.0", + "unique-string": "^1.0.0", + "write-file-atomic": "^2.0.0", + "xdg-basedir": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-disposition/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" + }, + "node_modules/copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "node_modules/create-error-class": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz", + "integrity": "sha512-gYTKKexFO3kh200H1Nit76sRwRtOY32vQd3jpAQKpLtZqyNsSQNfI4N7o3eP2wUjV35pTWKRYqFUDBvUha/Pkw==", + "dependencies": { + "capture-stack-trace": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true + }, + "node_modules/cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==", + "dependencies": { + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "node_modules/crypto-random-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", + "integrity": "sha512-GsVpkFPlycH7/fRR7Dhcmnoii54gV1nz7y4CWyeFS14N+JVBBhY+r8amRHE4BwSYal7BPTDp8isvAlCxyFt3Hg==", + "engines": { + "node": ">=4" + } + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decode-uri-component": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", + "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dependencies": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detect-libc": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.2.tgz", + "integrity": "sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dot-prop": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.1.tgz", + "integrity": "sha512-l0p4+mIuJIua0mhxGoh4a+iNL9bmeK5DvnSVQa6T0OhrVmaEa1XScX5Etc673FePCJOArq/4Pa2cLGODUWTPOQ==", + "dependencies": { + "is-obj": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/duplexer3": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.5.tgz", + "integrity": "sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA==" + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/esbuild": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", + "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.18.20", + "@esbuild/android-arm64": "0.18.20", + "@esbuild/android-x64": "0.18.20", + "@esbuild/darwin-arm64": "0.18.20", + "@esbuild/darwin-x64": "0.18.20", + "@esbuild/freebsd-arm64": "0.18.20", + "@esbuild/freebsd-x64": "0.18.20", + "@esbuild/linux-arm": "0.18.20", + "@esbuild/linux-arm64": "0.18.20", + "@esbuild/linux-ia32": "0.18.20", + "@esbuild/linux-loong64": "0.18.20", + "@esbuild/linux-mips64el": "0.18.20", + "@esbuild/linux-ppc64": "0.18.20", + "@esbuild/linux-riscv64": "0.18.20", + "@esbuild/linux-s390x": "0.18.20", + "@esbuild/linux-x64": "0.18.20", + "@esbuild/netbsd-x64": "0.18.20", + "@esbuild/openbsd-x64": "0.18.20", + "@esbuild/sunos-x64": "0.18.20", + "@esbuild/win32-arm64": "0.18.20", + "@esbuild/win32-ia32": "0.18.20", + "@esbuild/win32-x64": "0.18.20" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/execa": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", + "integrity": "sha512-RztN09XglpYI7aBBrJCPW95jEH7YF1UEPOoX9yDhUTPdp7mK+CQvnLTuD10BNXZ3byLTu2uehZ8EcKT/4CGiFw==", + "dependencies": { + "cross-spawn": "^5.0.1", + "get-stream": "^3.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==", + "dependencies": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/expand-brackets/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/is-descriptor/node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/expand-template": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", + "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/express": { + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.1", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.5.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/express/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dependencies": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-glob": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", + "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fast-glob/node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-glob/node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/fast-glob/node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/fast-glob/node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "optional": true + }, + "node_modules/fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==", + "dependencies": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA==", + "dependencies": { + "map-cache": "^0.2.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==", + "dependencies": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + } + }, + "node_modules/from2/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "node_modules/from2/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/from2/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" + }, + "node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/fsevents": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", + "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", + "deprecated": "The v1 package contains DANGEROUS / INSECURE binaries. Upgrade to safe fsevents v2", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "dependencies": { + "bindings": "^1.5.0", + "nan": "^2.12.1" + }, + "engines": { + "node": ">= 4.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/github-from-package": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", + "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==" + }, + "node_modules/glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA==", + "dependencies": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + } + }, + "node_modules/glob-parent/node_modules/is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw==", + "dependencies": { + "is-extglob": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/global-dirs": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", + "integrity": "sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg==", + "dependencies": { + "ini": "^1.3.4" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globrex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz", + "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==" + }, + "node_modules/got": { + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz", + "integrity": "sha512-Y/K3EDuiQN9rTZhBvPRWMLXIKdeD1Rj0nzunfoi0Yyn5WBEbzxXKU9Ub2X41oZBagVWOBU3MuDonFMgPWQFnwg==", + "dependencies": { + "create-error-class": "^3.0.0", + "duplexer3": "^0.1.4", + "get-stream": "^3.0.0", + "is-redirect": "^1.0.0", + "is-retry-allowed": "^1.0.0", + "is-stream": "^1.0.0", + "lowercase-keys": "^1.0.0", + "safe-buffer": "^5.0.1", + "timed-out": "^4.0.0", + "unzip-response": "^2.0.1", + "url-parse-lax": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw==", + "dependencies": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ==", + "dependencies": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values/node_modules/kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw==", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/ignore": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "engines": { + "node": ">= 4" + } + }, + "node_modules/ignore-by-default": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", + "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==" + }, + "node_modules/import-lazy": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", + "integrity": "sha512-m7ZEHgtw69qOGw+jwxXkHlrlIPdTGkyh66zXZ1ajZbxkDBNjSY/LGbmjc7h0s2ELsUDTAhFr55TrPSSqJGPG0A==", + "engines": { + "node": ">=4" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" + }, + "node_modules/into-stream": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/into-stream/-/into-stream-6.0.0.tgz", + "integrity": "sha512-XHbaOAvP+uFKUFsOgoNPRjLkwB+I22JFPFe5OjTkQ0nwgj6+pSjb4NmB6VMxaPshLiOf+zcpOCBQuLwC1KHhZA==", + "dependencies": { + "from2": "^2.3.0", + "p-is-promise": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-accessor-descriptor/node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha512-9fRVlXc0uCxEDj1nQzaWONSpbTfx0FmJfzHF7pwlI8DkWGoHBBea4Pg5Ky0ojwwxQmnSifgbKkI06Qv0Ljgj+Q==", + "dependencies": { + "binary-extensions": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" + }, + "node_modules/is-ci": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.2.1.tgz", + "integrity": "sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg==", + "dependencies": { + "ci-info": "^1.5.0" + }, + "bin": { + "is-ci": "bin.js" + } + }, + "node_modules/is-core-module": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz", + "integrity": "sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==", + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-data-descriptor/node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dependencies": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-descriptor/node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", + "engines": { + "node": ">=4" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-installed-globally": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.1.0.tgz", + "integrity": "sha512-ERNhMg+i/XgDwPIPF3u24qpajVreaiSuvpb1Uu0jugw7KKcxGyCX8cgp8P5fwTmAuXku6beDHHECdKArjlg7tw==", + "dependencies": { + "global-dirs": "^0.1.0", + "is-path-inside": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/is-npm": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-1.0.0.tgz", + "integrity": "sha512-9r39FIr3d+KD9SbX0sfMsHzb5PP3uimOiwr3YupUaUFG4W0l1U57Rx3utpttV7qz5U3jmrO5auUa04LU9pyHsg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-path-inside": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", + "integrity": "sha512-qhsCR/Esx4U4hg/9I19OVUAJkGWtjRYHMRgUMZE2TDdj+Ag+kttZanLupfddNyglzz50cUlmWzUaI37GDfNx/g==", + "dependencies": { + "path-is-inside": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-redirect": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz", + "integrity": "sha512-cr/SlUEe5zOGmzvj9bUyC4LVvkNVAXu4GytXLNMr1pny+a65MpQ9IJzFHD5vi7FyJgb4qt27+eS3TuQnqB+RQw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-retry-allowed": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz", + "integrity": "sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + }, + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/latest-version": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-3.1.0.tgz", + "integrity": "sha512-Be1YRHWWlZaSsrz2U+VInk+tO0EwLIyV+23RhWLINJYwg/UIikxjlj3MhH37/6/EDCAusjajvMkMMUXRaMWl/w==", + "dependencies": { + "package-json": "^4.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==" + }, + "node_modules/long": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", + "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" + }, + "node_modules/lowercase-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dependencies": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "node_modules/make-dir": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", + "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", + "dependencies": { + "pify": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, + "node_modules/map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w==", + "dependencies": { + "object-visit": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/micromatch/node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/micromatch/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/micromatch/node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "dependencies": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mixin-deep/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mkdirp-classic": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==" + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/multistream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/multistream/-/multistream-4.1.0.tgz", + "integrity": "sha512-J1XDiAmmNpRCBfIWJv+n0ymC4ABcf/Pl+5YvC5B/D2f/2+8PtHvCNxMPKiQcZyi922Hq69J2YOpb1pTywfifyw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "once": "^1.4.0", + "readable-stream": "^3.6.0" + } + }, + "node_modules/multistream/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/multistream/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/multistream/node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/nan": { + "version": "2.17.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.17.0.tgz", + "integrity": "sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ==", + "optional": true + }, + "node_modules/nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nanomatch/node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nanomatch/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nanomatch/node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/napi-build-utils": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", + "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==" + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/node-abi": { + "version": "3.47.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.47.0.tgz", + "integrity": "sha512-2s6B2CWZM//kPgwnuI0KrYwNjfdByE25zvAaEpq9IH4zcNsarH8Ihu/UuX6XMPEogDAxkuUFeZn60pXNHAqn3A==", + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/node-abi/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/node-abi/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/node-abi/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/node-fetch": { + "version": "2.6.13", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.13.tgz", + "integrity": "sha512-StxNAxh15zr77QvvkmveSQ8uCQ4+v5FkvNTj0OESmiHu+VRi/gXArXtkWMElOsOUNLtUEvI4yS+rdtOHZTwlQA==", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/nodemon": { + "version": "1.19.4", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-1.19.4.tgz", + "integrity": "sha512-VGPaqQBNk193lrJFotBU8nvWZPqEZY2eIzymy2jjY0fJ9qIsxA0sxQ8ATPl0gZC645gijYEc1jtZvpS8QWzJGQ==", + "hasInstallScript": true, + "dependencies": { + "chokidar": "^2.1.8", + "debug": "^3.2.6", + "ignore-by-default": "^1.0.1", + "minimatch": "^3.0.4", + "pstree.remy": "^1.1.7", + "semver": "^5.7.1", + "supports-color": "^5.5.0", + "touch": "^3.1.0", + "undefsafe": "^2.0.2", + "update-notifier": "^2.5.0" + }, + "bin": { + "nodemon": "bin/nodemon.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/nodemon/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/nopt": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", + "integrity": "sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==", + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "*" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==", + "dependencies": { + "path-key": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ==", + "dependencies": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/is-descriptor/node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA==", + "dependencies": { + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", + "engines": { + "node": ">=4" + } + }, + "node_modules/p-is-promise": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-3.0.0.tgz", + "integrity": "sha512-Wo8VsW4IRQSKVXsJCn7TomUaVtyfjVDn3nUP7kE967BQk0CwFpdbZs0X0uk5sW9mkBa9eNM7hCMaG93WUAwxYQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/package-json": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-4.0.1.tgz", + "integrity": "sha512-q/R5GrMek0vzgoomq6rm9OX+3PQve8sLwTirmK30YB3Cu0Bbt9OX9M/SIUnroN5BGJkzwGsFwDaRGD9EwBOlCA==", + "dependencies": { + "got": "^6.7.1", + "registry-auth-token": "^3.0.1", + "registry-url": "^3.0.3", + "semver": "^5.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha512-ALzNPpyNq9AqXMBjeymIjFDAkAFH06mHJH/cSBHAgU0s4vfpBn6b2nf8tiRLvagKD8RbTpq2FKTBg7cl9l3c7Q==" + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==" + }, + "node_modules/path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "node_modules/path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", + "engines": { + "node": ">=4" + } + }, + "node_modules/pkg": { + "version": "5.8.1", + "resolved": "https://registry.npmjs.org/pkg/-/pkg-5.8.1.tgz", + "integrity": "sha512-CjBWtFStCfIiT4Bde9QpJy0KeH19jCfwZRJqHFDFXfhUklCx8JoFmMj3wgnEYIwGmZVNkhsStPHEOnrtrQhEXA==", + "dependencies": { + "@babel/generator": "7.18.2", + "@babel/parser": "7.18.4", + "@babel/types": "7.19.0", + "chalk": "^4.1.2", + "fs-extra": "^9.1.0", + "globby": "^11.1.0", + "into-stream": "^6.0.0", + "is-core-module": "2.9.0", + "minimist": "^1.2.6", + "multistream": "^4.1.0", + "pkg-fetch": "3.4.2", + "prebuild-install": "7.1.1", + "resolve": "^1.22.0", + "stream-meter": "^1.0.4" + }, + "bin": { + "pkg": "lib-es5/bin.js" + }, + "peerDependencies": { + "node-notifier": ">=9.0.1" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/pkg-fetch": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/pkg-fetch/-/pkg-fetch-3.4.2.tgz", + "integrity": "sha512-0+uijmzYcnhC0hStDjm/cl2VYdrmVVBpe7Q8k9YBojxmR5tG8mvR9/nooQq3QSXiQqORDVOTY3XqMEqJVIzkHA==", + "dependencies": { + "chalk": "^4.1.2", + "fs-extra": "^9.1.0", + "https-proxy-agent": "^5.0.0", + "node-fetch": "^2.6.6", + "progress": "^2.0.3", + "semver": "^7.3.5", + "tar-fs": "^2.1.1", + "yargs": "^16.2.0" + }, + "bin": { + "pkg-fetch": "lib-es5/bin.js" + } + }, + "node_modules/pkg-fetch/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-fetch/node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/pkg-fetch/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-fetch/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/pkg-fetch/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/pkg-fetch/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-fetch/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-fetch/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/pkg-fetch/node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/pkg-fetch/node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "engines": { + "node": ">=10" + } + }, + "node_modules/posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/prebuild-install": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.1.tgz", + "integrity": "sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==", + "dependencies": { + "detect-libc": "^2.0.0", + "expand-template": "^2.0.3", + "github-from-package": "0.0.0", + "minimist": "^1.2.3", + "mkdirp-classic": "^0.5.3", + "napi-build-utils": "^1.0.1", + "node-abi": "^3.3.0", + "pump": "^3.0.0", + "rc": "^1.2.7", + "simple-get": "^4.0.0", + "tar-fs": "^2.0.0", + "tunnel-agent": "^0.6.0" + }, + "bin": { + "prebuild-install": "bin.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/prepend-http": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", + "integrity": "sha512-PhmXi5XmoyKw1Un4E+opM2KcsJInDvKyuOumcjjw3waw86ZNjHwVUOOWLc4bCzLdcKNaWBH9e99sbWzDQsVaYg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/prisma": { + "version": "4.16.2", + "resolved": "https://registry.npmjs.org/prisma/-/prisma-4.16.2.tgz", + "integrity": "sha512-SYCsBvDf0/7XSJyf2cHTLjLeTLVXYfqp7pG5eEVafFLeT0u/hLFz/9W196nDRGUOo1JfPatAEb+uEnTQImQC1g==", + "devOptional": true, + "hasInstallScript": true, + "dependencies": { + "@prisma/engines": "4.16.2" + }, + "bin": { + "prisma": "build/index.js", + "prisma2": "build/index.js" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/protobufjs": { + "version": "7.2.4", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.2.4.tgz", + "integrity": "sha512-AT+RJgD2sH8phPmCf7OUZR8xGdcJRga4+1cOaXJ64hvcSkVhNcRHOwIxUatPH15+nj59WAGTDv3LSGZPEQbJaQ==", + "hasInstallScript": true, + "dependencies": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/node": ">=13.7.0", + "long": "^5.0.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/protobufjs/node_modules/long": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", + "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==" + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==" + }, + "node_modules/pstree.remy": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", + "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==" + }, + "node_modules/pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==" + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, + "node_modules/readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "node_modules/readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "dependencies": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/readdirp/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "node_modules/readdirp/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/readdirp/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dependencies": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/regex-not/node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/regex-not/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/registry-auth-token": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.4.0.tgz", + "integrity": "sha512-4LM6Fw8eBQdwMYcES4yTnn2TqIasbXuwDx3um+QRs7S55aMKCBKBxvPXl2RiUjHwuJLTyYfxSpmfSAjQpcuP+A==", + "dependencies": { + "rc": "^1.1.6", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/registry-url": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz", + "integrity": "sha512-ZbgR5aZEdf4UKZVBPYIgaglBmSF2Hi94s2PcIHhRGFjKYu+chjJdYfHn4rt3hB6eCKLJ8giVIIfgMa1ehDfZKA==", + "dependencies": { + "rc": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==" + }, + "node_modules/repeat-element": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz", + "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==" + }, + "node_modules/resolve": { + "version": "1.22.4", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.4.tgz", + "integrity": "sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==", + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==", + "deprecated": "https://github.com/lydell/resolve-url#deprecated" + }, + "node_modules/resolve/node_modules/is-core-module": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", + "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "engines": { + "node": ">=0.12" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==", + "dependencies": { + "ret": "~0.1.10" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" + }, + "node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/semver-diff": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz", + "integrity": "sha512-gL8F8L4ORwsS0+iQ34yCYv///jsOq0ZL7WP55d1HnJ32o7tyFYEFQZQA22mrLIacZdU6xecaBBZ+uEiffGNyXw==", + "dependencies": { + "semver": "^5.0.3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/set-value": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "dependencies": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, + "node_modules/shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", + "dependencies": { + "shebang-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + }, + "node_modules/simple-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/simple-get": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", + "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "decompress-response": "^6.0.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "dependencies": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "dependencies": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dependencies": { + "kind-of": "^3.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/snapdragon/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/is-descriptor/node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-resolve": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", + "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", + "deprecated": "See https://github.com/lydell/source-map-resolve#deprecated", + "dependencies": { + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "node_modules/source-map-url": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz", + "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==", + "deprecated": "See https://github.com/lydell/source-map-url#deprecated" + }, + "node_modules/split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "dependencies": { + "extend-shallow": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/split-string/node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/split-string/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g==", + "dependencies": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/is-descriptor/node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/stream-meter": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/stream-meter/-/stream-meter-1.0.4.tgz", + "integrity": "sha512-4sOEtrbgFotXwnEuzzsQBYEV1elAeFSO8rSGeTwabuX1RRn/kEq9JVH7I0MRBhKVRR0sJkr0M0QCH7yOLf9fhQ==", + "dependencies": { + "readable-stream": "^2.1.4" + } + }, + "node_modules/stream-meter/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "node_modules/stream-meter/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/stream-meter/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==" + }, + "node_modules/string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dependencies": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", + "dependencies": { + "ansi-regex": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tar-fs": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", + "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", + "dependencies": { + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.1.4" + } + }, + "node_modules/tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "dependencies": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tar-stream/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/tar-stream/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/tar-stream/node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/term-size": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz", + "integrity": "sha512-7dPUZQGy/+m3/wjVz3ZW5dobSoD/02NxJpoXUX0WIyjfVS3l0c+b/+9phIDFA7FHzkYtwtMFgeGZ/Y8jVTeqQQ==", + "dependencies": { + "execa": "^0.7.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/timed-out": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", + "integrity": "sha512-G7r3AhovYtr5YKOWQkta8RKAPb+J9IsO4uVmzjl8AZwfhs8UcUwTiD6gcJYSgOtzyjvQKrKYn41syHbUWMkafA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "engines": { + "node": ">=4" + } + }, + "node_modules/to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dependencies": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==", + "dependencies": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex/node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/touch": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", + "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", + "dependencies": { + "nopt": "~1.0.10" + }, + "bin": { + "nodetouch": "bin/nodetouch.js" + } + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, + "node_modules/ts-node": { + "version": "10.9.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", + "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", + "dev": true, + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "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 + } + } + }, + "node_modules/tsconfck": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/tsconfck/-/tsconfck-2.1.2.tgz", + "integrity": "sha512-ghqN1b0puy3MhhviwO2kGF8SeMDNhEbnKxjK7h6+fvY9JAxqvXi8y5NAHSQv687OVboS2uZIByzGd45/YxrRHg==", + "bin": { + "tsconfck": "bin/tsconfck.js" + }, + "engines": { + "node": "^14.13.1 || ^16 || >=18" + }, + "peerDependencies": { + "typescript": "^4.3.5 || ^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/tsconfig-paths": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", + "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==", + "dev": true, + "dependencies": { + "json5": "^2.2.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + }, + "node_modules/tunnel": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz", + "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==", + "engines": { + "node": ">=0.6.11 <=0.7.0 || >=0.7.3" + } + }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typescript": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz", + "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==", + "devOptional": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undefsafe": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", + "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==" + }, + "node_modules/union-value": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "dependencies": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unique-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", + "integrity": "sha512-ODgiYu03y5g76A1I9Gt0/chLCzQjvzDy7DsZGsLOE/1MrF6wriEskSncj1+/C58Xk/kPZDppSctDybCwOSaGAg==", + "dependencies": { + "crypto-random-string": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ==", + "dependencies": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q==", + "dependencies": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-value/node_modules/isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==", + "dependencies": { + "isarray": "1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "node_modules/unzip-response": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz", + "integrity": "sha512-N0XH6lqDtFH84JxptQoZYmloF4nzrQqqrAymNj+/gW60AO2AZgOcf4O/nUXJcYfyQkqvMo9lSupBZmmgvuVXlw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/upath": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", + "engines": { + "node": ">=4", + "yarn": "*" + } + }, + "node_modules/update-notifier": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-2.5.0.tgz", + "integrity": "sha512-gwMdhgJHGuj/+wHJJs9e6PcCszpxR1b236igrOkUofGhqJuG+amlIKwApH1IW1WWl7ovZxsX49lMBWLxSdm5Dw==", + "dependencies": { + "boxen": "^1.2.1", + "chalk": "^2.0.1", + "configstore": "^3.0.0", + "import-lazy": "^2.1.0", + "is-ci": "^1.0.10", + "is-installed-globally": "^0.1.0", + "is-npm": "^1.0.0", + "latest-version": "^3.0.0", + "semver-diff": "^2.0.0", + "xdg-basedir": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/update-notifier/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/update-notifier/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/update-notifier/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/update-notifier/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "node_modules/urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==", + "deprecated": "Please see https://github.com/lydell/urix#deprecated" + }, + "node_modules/url-parse": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "node_modules/url-parse-lax": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", + "integrity": "sha512-BVA4lR5PIviy2PMseNd2jbFQ+jwSwQGdJejf5ctd1rEXt0Ypd7yanUK9+lYechVlN5VaTJGsu2U/3MDDu6KgBA==", + "dependencies": { + "prepend-http": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/vite-tsconfig-paths": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/vite-tsconfig-paths/-/vite-tsconfig-paths-4.2.0.tgz", + "integrity": "sha512-jGpus0eUy5qbbMVGiTxCL1iB9ZGN6Bd37VGLJU39kTDD6ZfULTTb1bcc5IeTWqWJKiWV5YihCaibeASPiGi8kw==", + "dependencies": { + "debug": "^4.1.1", + "globrex": "^0.1.2", + "tsconfck": "^2.1.0" + }, + "peerDependencies": { + "vite": "*" + }, + "peerDependenciesMeta": { + "vite": { + "optional": true + } + } + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/widest-line": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-2.0.1.tgz", + "integrity": "sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA==", + "dependencies": { + "string-width": "^2.1.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "node_modules/write-file-atomic": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz", + "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==", + "dependencies": { + "graceful-fs": "^4.1.11", + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.2" + } + }, + "node_modules/xdg-basedir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz", + "integrity": "sha512-1Dly4xqlulvPD3fZUQJLY+FUIeqN3N2MM3uqe4rCJftAvOjFa3jFGfctOgluGx4ahPbUCsZkmJILiP0Vi4T6lQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/xml2js": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.5.0.tgz", + "integrity": "sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==", + "dependencies": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/xmlbuilder": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==" + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "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.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true, + "engines": { + "node": ">=6" + } + } + } +} diff --git a/services/promotions/package-lock.json b/services/promotions/package-lock.json new file mode 100644 index 00000000..72b7b036 --- /dev/null +++ b/services/promotions/package-lock.json @@ -0,0 +1,1439 @@ +{ + "name": "@goodfood/delivery", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "@goodfood/delivery", + "hasInstallScript": true, + "dependencies": { + "@grpc/grpc-js": "^1.8.18", + "@grpc/proto-loader": "^0.7.8", + "@prisma/client": "5.0.0", + "amqplib": "^0.10.3", + "dotenv": "^16.3.1", + "esbuild": "^0.18.15", + "nodemon": "^3.0.1", + "path": "^0.12.7", + "ts-node": "^10.9.1", + "tsconfig-paths": "^4.2.0" + }, + "bin": { + "delivery": "dist/index.js" + }, + "devDependencies": { + "@types/amqplib": "^0.10.1", + "prisma": "^5.0.0", + "typescript": "^5.1.6" + } + }, + "node_modules/@acuminous/bitsyntax": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@acuminous/bitsyntax/-/bitsyntax-0.1.2.tgz", + "integrity": "sha512-29lUK80d1muEQqiUsSo+3A0yP6CdspgC95EnKBMi22Xlwt79i/En4Vr67+cXhU+cZjbti3TgGGC5wy1stIywVQ==", + "dependencies": { + "buffer-more-ints": "~1.0.0", + "debug": "^4.3.4", + "safe-buffer": "~5.1.2" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", + "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz", + "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz", + "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz", + "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz", + "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz", + "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz", + "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz", + "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz", + "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz", + "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", + "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", + "cpu": [ + "loong64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz", + "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==", + "cpu": [ + "mips64el" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz", + "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==", + "cpu": [ + "ppc64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz", + "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==", + "cpu": [ + "riscv64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz", + "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==", + "cpu": [ + "s390x" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz", + "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz", + "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz", + "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz", + "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", + "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz", + "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", + "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@grpc/grpc-js": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.9.0.tgz", + "integrity": "sha512-H8+iZh+kCE6VR/Krj6W28Y/ZlxoZ1fOzsNt77nrdE3knkbSelW1Uus192xOFCxHyeszLj8i4APQkSIXjAoOxXg==", + "dependencies": { + "@grpc/proto-loader": "^0.7.0", + "@types/node": ">=12.12.47" + }, + "engines": { + "node": "^8.13.0 || >=10.10.0" + } + }, + "node_modules/@grpc/proto-loader": { + "version": "0.7.8", + "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.8.tgz", + "integrity": "sha512-GU12e2c8dmdXb7XUlOgYWZ2o2i+z9/VeACkxTA/zzAe2IjclC5PnVL0lpgjhrqfpDYHzM8B1TF6pqWegMYAzlA==", + "dependencies": { + "@types/long": "^4.0.1", + "lodash.camelcase": "^4.3.0", + "long": "^4.0.0", + "protobufjs": "^7.2.4", + "yargs": "^17.7.2" + }, + "bin": { + "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@prisma/client": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@prisma/client/-/client-5.0.0.tgz", + "integrity": "sha512-XlO5ELNAQ7rV4cXIDJUNBEgdLwX3pjtt9Q/RHqDpGf43szpNJx2hJnggfFs7TKNx0cOFsl6KJCSfqr5duEU/bQ==", + "hasInstallScript": true, + "dependencies": { + "@prisma/engines-version": "4.17.0-26.6b0aef69b7cdfc787f822ecd7cdc76d5f1991584" + }, + "engines": { + "node": ">=16.13" + }, + "peerDependencies": { + "prisma": "*" + }, + "peerDependenciesMeta": { + "prisma": { + "optional": true + } + } + }, + "node_modules/@prisma/engines": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-5.1.1.tgz", + "integrity": "sha512-NV/4nVNWFZSJCCIA3HIFJbbDKO/NARc9ej0tX5S9k2EVbkrFJC4Xt9b0u4rNZWL4V+F5LAjvta8vzEUw0rw+HA==", + "devOptional": true, + "hasInstallScript": true + }, + "node_modules/@prisma/engines-version": { + "version": "4.17.0-26.6b0aef69b7cdfc787f822ecd7cdc76d5f1991584", + "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-4.17.0-26.6b0aef69b7cdfc787f822ecd7cdc76d5f1991584.tgz", + "integrity": "sha512-HHiUF6NixsldsP3JROq07TYBLEjXFKr6PdH8H4gK/XAoTmIplOJBCgrIUMrsRAnEuGyRoRLXKXWUb943+PFoKQ==" + }, + "node_modules/@protobufjs/aspromise": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==" + }, + "node_modules/@protobufjs/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" + }, + "node_modules/@protobufjs/codegen": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", + "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" + }, + "node_modules/@protobufjs/eventemitter": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", + "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==" + }, + "node_modules/@protobufjs/fetch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", + "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", + "dependencies": { + "@protobufjs/aspromise": "^1.1.1", + "@protobufjs/inquire": "^1.1.0" + } + }, + "node_modules/@protobufjs/float": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", + "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==" + }, + "node_modules/@protobufjs/inquire": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", + "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==" + }, + "node_modules/@protobufjs/path": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==" + }, + "node_modules/@protobufjs/pool": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==" + }, + "node_modules/@protobufjs/utf8": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", + "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==" + }, + "node_modules/@tsconfig/node10": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", + "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==" + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==" + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==" + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==" + }, + "node_modules/@types/amqplib": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/@types/amqplib/-/amqplib-0.10.1.tgz", + "integrity": "sha512-j6ANKT79ncUDnAs/+9r9eDujxbeJoTjoVu33gHHcaPfmLQaMhvfbH2GqSe8KUM444epAp1Vl3peVOQfZk3UIqA==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/long": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz", + "integrity": "sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==" + }, + "node_modules/@types/node": { + "version": "20.5.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.5.1.tgz", + "integrity": "sha512-4tT2UrL5LBqDwoed9wZ6N3umC4Yhz3W3FloMmiiG4JwmUJWpie0c7lcnUNd4gtMKuDEO4wRVS8B6Xa0uMRsMKg==" + }, + "node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" + }, + "node_modules/acorn": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/amqplib": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/amqplib/-/amqplib-0.10.3.tgz", + "integrity": "sha512-UHmuSa7n8vVW/a5HGh2nFPqAEr8+cD4dEZ6u9GjP91nHfr1a54RyAKyra7Sb5NH7NBKOUlyQSMXIp0qAixKexw==", + "dependencies": { + "@acuminous/bitsyntax": "^0.1.2", + "buffer-more-ints": "~1.0.0", + "readable-stream": "1.x >=1.1.9", + "url-parse": "~1.5.10" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==" + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/buffer-more-ints": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-more-ints/-/buffer-more-ints-1.0.0.tgz", + "integrity": "sha512-EMetuGFz5SLsT0QTnXzINh4Ksr+oo4i+UGTXEshiGCQWnsgSs7ZhJ8fzlwQ+OzEMs0MpDAMr1hxnblp5a4vcHg==" + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==" + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/dotenv": { + "version": "16.3.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.3.1.tgz", + "integrity": "sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/motdotla/dotenv?sponsor=1" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/esbuild": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", + "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.18.20", + "@esbuild/android-arm64": "0.18.20", + "@esbuild/android-x64": "0.18.20", + "@esbuild/darwin-arm64": "0.18.20", + "@esbuild/darwin-x64": "0.18.20", + "@esbuild/freebsd-arm64": "0.18.20", + "@esbuild/freebsd-x64": "0.18.20", + "@esbuild/linux-arm": "0.18.20", + "@esbuild/linux-arm64": "0.18.20", + "@esbuild/linux-ia32": "0.18.20", + "@esbuild/linux-loong64": "0.18.20", + "@esbuild/linux-mips64el": "0.18.20", + "@esbuild/linux-ppc64": "0.18.20", + "@esbuild/linux-riscv64": "0.18.20", + "@esbuild/linux-s390x": "0.18.20", + "@esbuild/linux-x64": "0.18.20", + "@esbuild/netbsd-x64": "0.18.20", + "@esbuild/openbsd-x64": "0.18.20", + "@esbuild/sunos-x64": "0.18.20", + "@esbuild/win32-arm64": "0.18.20", + "@esbuild/win32-ia32": "0.18.20", + "@esbuild/win32-x64": "0.18.20" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "engines": { + "node": ">=6" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/ignore-by-default": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", + "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==" + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==" + }, + "node_modules/long": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", + "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==" + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/nodemon": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.0.1.tgz", + "integrity": "sha512-g9AZ7HmkhQkqXkRc20w+ZfQ73cHLbE8hnPbtaFbFtCumZsjyMhKk9LajQ07U5Ux28lvFjZ5X7HvWR1xzU8jHVw==", + "dependencies": { + "chokidar": "^3.5.2", + "debug": "^3.2.7", + "ignore-by-default": "^1.0.1", + "minimatch": "^3.1.2", + "pstree.remy": "^1.1.8", + "semver": "^7.5.3", + "simple-update-notifier": "^2.0.0", + "supports-color": "^5.5.0", + "touch": "^3.1.0", + "undefsafe": "^2.0.5" + }, + "bin": { + "nodemon": "bin/nodemon.js" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/nodemon" + } + }, + "node_modules/nodemon/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/nopt": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", + "integrity": "sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==", + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "*" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path": { + "version": "0.12.7", + "resolved": "https://registry.npmjs.org/path/-/path-0.12.7.tgz", + "integrity": "sha512-aXXC6s+1w7otVF9UletFkFcDsJeO7lSZBPUQhtb5O0xJe8LtYhj/GxldoL09bBj9+ZmE2hNoHqQSFMN5fikh4Q==", + "dependencies": { + "process": "^0.11.1", + "util": "^0.10.3" + } + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/prisma": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/prisma/-/prisma-5.1.1.tgz", + "integrity": "sha512-WJFG/U7sMmcc6TjJTTifTfpI6Wjoh55xl4AzopVwAdyK68L9/ogNo8QQ2cxuUjJf/Wa82z/uhyh3wMzvRIBphg==", + "devOptional": true, + "hasInstallScript": true, + "dependencies": { + "@prisma/engines": "5.1.1" + }, + "bin": { + "prisma": "build/index.js" + }, + "engines": { + "node": ">=16.13" + } + }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/protobufjs": { + "version": "7.2.4", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.2.4.tgz", + "integrity": "sha512-AT+RJgD2sH8phPmCf7OUZR8xGdcJRga4+1cOaXJ64hvcSkVhNcRHOwIxUatPH15+nj59WAGTDv3LSGZPEQbJaQ==", + "hasInstallScript": true, + "dependencies": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/node": ">=13.7.0", + "long": "^5.0.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/protobufjs/node_modules/long": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", + "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==" + }, + "node_modules/pstree.remy": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", + "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==" + }, + "node_modules/querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==" + }, + "node_modules/readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==" + }, + "node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/simple-update-notifier": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", + "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==", + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==" + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "engines": { + "node": ">=4" + } + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/touch": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", + "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", + "dependencies": { + "nopt": "~1.0.10" + }, + "bin": { + "nodetouch": "bin/nodetouch.js" + } + }, + "node_modules/ts-node": { + "version": "10.9.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", + "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "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 + } + } + }, + "node_modules/tsconfig-paths": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", + "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==", + "dependencies": { + "json5": "^2.2.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/typescript": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz", + "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undefsafe": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", + "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==" + }, + "node_modules/url-parse": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "node_modules/util": { + "version": "0.10.4", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", + "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==", + "dependencies": { + "inherits": "2.0.3" + } + }, + "node_modules/util/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==" + }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==" + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "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.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "engines": { + "node": ">=12" + } + }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "engines": { + "node": ">=6" + } + } + } +} diff --git a/services/restaurant/package-lock.json b/services/restaurant/package-lock.json new file mode 100644 index 00000000..d13bb054 --- /dev/null +++ b/services/restaurant/package-lock.json @@ -0,0 +1,1445 @@ +{ + "name": "@goodfood/restaurant", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "@goodfood/restaurant", + "hasInstallScript": true, + "dependencies": { + "@grpc/grpc-js": "^1.8.18", + "@grpc/proto-loader": "^0.7.8", + "@prisma/client": "5.1.1", + "amqplib": "^0.10.3", + "dotenv": "^16.3.1", + "esbuild": "^0.18.15", + "geolib": "^3.3.4", + "nodemon": "^3.0.1", + "path": "^0.12.7", + "ts-node": "^10.9.1", + "tsconfig-paths": "^4.2.0" + }, + "bin": { + "restaurant": "dist/index.js" + }, + "devDependencies": { + "@types/amqplib": "^0.10.1", + "prisma": "^5.1.1", + "typescript": "^5.1.6" + } + }, + "node_modules/@acuminous/bitsyntax": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@acuminous/bitsyntax/-/bitsyntax-0.1.2.tgz", + "integrity": "sha512-29lUK80d1muEQqiUsSo+3A0yP6CdspgC95EnKBMi22Xlwt79i/En4Vr67+cXhU+cZjbti3TgGGC5wy1stIywVQ==", + "dependencies": { + "buffer-more-ints": "~1.0.0", + "debug": "^4.3.4", + "safe-buffer": "~5.1.2" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", + "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz", + "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz", + "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz", + "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz", + "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz", + "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz", + "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz", + "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz", + "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz", + "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", + "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", + "cpu": [ + "loong64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz", + "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==", + "cpu": [ + "mips64el" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz", + "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==", + "cpu": [ + "ppc64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz", + "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==", + "cpu": [ + "riscv64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz", + "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==", + "cpu": [ + "s390x" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz", + "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz", + "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz", + "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz", + "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", + "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz", + "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", + "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@grpc/grpc-js": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.9.0.tgz", + "integrity": "sha512-H8+iZh+kCE6VR/Krj6W28Y/ZlxoZ1fOzsNt77nrdE3knkbSelW1Uus192xOFCxHyeszLj8i4APQkSIXjAoOxXg==", + "dependencies": { + "@grpc/proto-loader": "^0.7.0", + "@types/node": ">=12.12.47" + }, + "engines": { + "node": "^8.13.0 || >=10.10.0" + } + }, + "node_modules/@grpc/proto-loader": { + "version": "0.7.8", + "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.8.tgz", + "integrity": "sha512-GU12e2c8dmdXb7XUlOgYWZ2o2i+z9/VeACkxTA/zzAe2IjclC5PnVL0lpgjhrqfpDYHzM8B1TF6pqWegMYAzlA==", + "dependencies": { + "@types/long": "^4.0.1", + "lodash.camelcase": "^4.3.0", + "long": "^4.0.0", + "protobufjs": "^7.2.4", + "yargs": "^17.7.2" + }, + "bin": { + "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@prisma/client": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@prisma/client/-/client-5.1.1.tgz", + "integrity": "sha512-fxcCeK5pMQGcgCqCrWsi+I2rpIbk0rAhdrN+ke7f34tIrgPwA68ensrpin+9+fZvuV2OtzHmuipwduSY6HswdA==", + "hasInstallScript": true, + "dependencies": { + "@prisma/engines-version": "5.1.1-1.6a3747c37ff169c90047725a05a6ef02e32ac97e" + }, + "engines": { + "node": ">=16.13" + }, + "peerDependencies": { + "prisma": "*" + }, + "peerDependenciesMeta": { + "prisma": { + "optional": true + } + } + }, + "node_modules/@prisma/engines": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-5.1.1.tgz", + "integrity": "sha512-NV/4nVNWFZSJCCIA3HIFJbbDKO/NARc9ej0tX5S9k2EVbkrFJC4Xt9b0u4rNZWL4V+F5LAjvta8vzEUw0rw+HA==", + "devOptional": true, + "hasInstallScript": true + }, + "node_modules/@prisma/engines-version": { + "version": "5.1.1-1.6a3747c37ff169c90047725a05a6ef02e32ac97e", + "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-5.1.1-1.6a3747c37ff169c90047725a05a6ef02e32ac97e.tgz", + "integrity": "sha512-owZqbY/wucbr65bXJ/ljrHPgQU5xXTSkmcE/JcbqE1kusuAXV/TLN3/exmz21SZ5rJ7WDkyk70J2G/n68iogbQ==" + }, + "node_modules/@protobufjs/aspromise": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==" + }, + "node_modules/@protobufjs/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" + }, + "node_modules/@protobufjs/codegen": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", + "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" + }, + "node_modules/@protobufjs/eventemitter": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", + "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==" + }, + "node_modules/@protobufjs/fetch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", + "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", + "dependencies": { + "@protobufjs/aspromise": "^1.1.1", + "@protobufjs/inquire": "^1.1.0" + } + }, + "node_modules/@protobufjs/float": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", + "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==" + }, + "node_modules/@protobufjs/inquire": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", + "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==" + }, + "node_modules/@protobufjs/path": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==" + }, + "node_modules/@protobufjs/pool": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==" + }, + "node_modules/@protobufjs/utf8": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", + "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==" + }, + "node_modules/@tsconfig/node10": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", + "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==" + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==" + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==" + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==" + }, + "node_modules/@types/amqplib": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/@types/amqplib/-/amqplib-0.10.1.tgz", + "integrity": "sha512-j6ANKT79ncUDnAs/+9r9eDujxbeJoTjoVu33gHHcaPfmLQaMhvfbH2GqSe8KUM444epAp1Vl3peVOQfZk3UIqA==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/long": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz", + "integrity": "sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==" + }, + "node_modules/@types/node": { + "version": "20.5.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.5.1.tgz", + "integrity": "sha512-4tT2UrL5LBqDwoed9wZ6N3umC4Yhz3W3FloMmiiG4JwmUJWpie0c7lcnUNd4gtMKuDEO4wRVS8B6Xa0uMRsMKg==" + }, + "node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" + }, + "node_modules/acorn": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/amqplib": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/amqplib/-/amqplib-0.10.3.tgz", + "integrity": "sha512-UHmuSa7n8vVW/a5HGh2nFPqAEr8+cD4dEZ6u9GjP91nHfr1a54RyAKyra7Sb5NH7NBKOUlyQSMXIp0qAixKexw==", + "dependencies": { + "@acuminous/bitsyntax": "^0.1.2", + "buffer-more-ints": "~1.0.0", + "readable-stream": "1.x >=1.1.9", + "url-parse": "~1.5.10" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==" + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/buffer-more-ints": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-more-ints/-/buffer-more-ints-1.0.0.tgz", + "integrity": "sha512-EMetuGFz5SLsT0QTnXzINh4Ksr+oo4i+UGTXEshiGCQWnsgSs7ZhJ8fzlwQ+OzEMs0MpDAMr1hxnblp5a4vcHg==" + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==" + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/dotenv": { + "version": "16.3.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.3.1.tgz", + "integrity": "sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/motdotla/dotenv?sponsor=1" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/esbuild": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", + "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.18.20", + "@esbuild/android-arm64": "0.18.20", + "@esbuild/android-x64": "0.18.20", + "@esbuild/darwin-arm64": "0.18.20", + "@esbuild/darwin-x64": "0.18.20", + "@esbuild/freebsd-arm64": "0.18.20", + "@esbuild/freebsd-x64": "0.18.20", + "@esbuild/linux-arm": "0.18.20", + "@esbuild/linux-arm64": "0.18.20", + "@esbuild/linux-ia32": "0.18.20", + "@esbuild/linux-loong64": "0.18.20", + "@esbuild/linux-mips64el": "0.18.20", + "@esbuild/linux-ppc64": "0.18.20", + "@esbuild/linux-riscv64": "0.18.20", + "@esbuild/linux-s390x": "0.18.20", + "@esbuild/linux-x64": "0.18.20", + "@esbuild/netbsd-x64": "0.18.20", + "@esbuild/openbsd-x64": "0.18.20", + "@esbuild/sunos-x64": "0.18.20", + "@esbuild/win32-arm64": "0.18.20", + "@esbuild/win32-ia32": "0.18.20", + "@esbuild/win32-x64": "0.18.20" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "engines": { + "node": ">=6" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/geolib": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/geolib/-/geolib-3.3.4.tgz", + "integrity": "sha512-EicrlLLL3S42gE9/wde+11uiaYAaeSVDwCUIv2uMIoRBfNJCn8EsSI+6nS3r4TCKDO6+RQNM9ayLq2at+oZQWQ==" + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/ignore-by-default": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", + "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==" + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==" + }, + "node_modules/long": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", + "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==" + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/nodemon": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.0.1.tgz", + "integrity": "sha512-g9AZ7HmkhQkqXkRc20w+ZfQ73cHLbE8hnPbtaFbFtCumZsjyMhKk9LajQ07U5Ux28lvFjZ5X7HvWR1xzU8jHVw==", + "dependencies": { + "chokidar": "^3.5.2", + "debug": "^3.2.7", + "ignore-by-default": "^1.0.1", + "minimatch": "^3.1.2", + "pstree.remy": "^1.1.8", + "semver": "^7.5.3", + "simple-update-notifier": "^2.0.0", + "supports-color": "^5.5.0", + "touch": "^3.1.0", + "undefsafe": "^2.0.5" + }, + "bin": { + "nodemon": "bin/nodemon.js" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/nodemon" + } + }, + "node_modules/nodemon/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/nopt": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", + "integrity": "sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==", + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "*" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path": { + "version": "0.12.7", + "resolved": "https://registry.npmjs.org/path/-/path-0.12.7.tgz", + "integrity": "sha512-aXXC6s+1w7otVF9UletFkFcDsJeO7lSZBPUQhtb5O0xJe8LtYhj/GxldoL09bBj9+ZmE2hNoHqQSFMN5fikh4Q==", + "dependencies": { + "process": "^0.11.1", + "util": "^0.10.3" + } + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/prisma": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/prisma/-/prisma-5.1.1.tgz", + "integrity": "sha512-WJFG/U7sMmcc6TjJTTifTfpI6Wjoh55xl4AzopVwAdyK68L9/ogNo8QQ2cxuUjJf/Wa82z/uhyh3wMzvRIBphg==", + "devOptional": true, + "hasInstallScript": true, + "dependencies": { + "@prisma/engines": "5.1.1" + }, + "bin": { + "prisma": "build/index.js" + }, + "engines": { + "node": ">=16.13" + } + }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/protobufjs": { + "version": "7.2.4", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.2.4.tgz", + "integrity": "sha512-AT+RJgD2sH8phPmCf7OUZR8xGdcJRga4+1cOaXJ64hvcSkVhNcRHOwIxUatPH15+nj59WAGTDv3LSGZPEQbJaQ==", + "hasInstallScript": true, + "dependencies": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/node": ">=13.7.0", + "long": "^5.0.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/protobufjs/node_modules/long": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", + "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==" + }, + "node_modules/pstree.remy": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", + "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==" + }, + "node_modules/querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==" + }, + "node_modules/readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==" + }, + "node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/simple-update-notifier": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", + "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==", + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==" + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "engines": { + "node": ">=4" + } + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/touch": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", + "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", + "dependencies": { + "nopt": "~1.0.10" + }, + "bin": { + "nodetouch": "bin/nodetouch.js" + } + }, + "node_modules/ts-node": { + "version": "10.9.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", + "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "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 + } + } + }, + "node_modules/tsconfig-paths": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", + "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==", + "dependencies": { + "json5": "^2.2.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/typescript": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz", + "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undefsafe": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", + "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==" + }, + "node_modules/url-parse": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "node_modules/util": { + "version": "0.10.4", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", + "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==", + "dependencies": { + "inherits": "2.0.3" + } + }, + "node_modules/util/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==" + }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==" + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "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.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "engines": { + "node": ">=12" + } + }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "engines": { + "node": ">=6" + } + } + } +} diff --git a/services/stock/package-lock.json b/services/stock/package-lock.json new file mode 100644 index 00000000..02973c86 --- /dev/null +++ b/services/stock/package-lock.json @@ -0,0 +1,4256 @@ +{ + "name": "@goodfood/stock", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "@goodfood/stock", + "version": "1.0.0", + "hasInstallScript": true, + "dependencies": { + "@grpc/grpc-js": "1.8.14", + "@grpc/proto-loader": "0.7.6", + "@prisma/client": "4.16.2", + "amqplib": "^0.10.3", + "dotenv": "^16.0.3", + "grpc-server-reflection": "^0.1.5", + "protobufjs": "7.2.2" + }, + "bin": { + "stock": "dist/index.js" + }, + "devDependencies": { + "@types/amqplib": "^0.10.1", + "@types/node": "18.15.9", + "esbuild": "^0.17.18", + "grpc-tools": "^1.12.4", + "nodemon": "^2.0.22", + "pkg": "^5.8.1", + "prisma": "4.16.2", + "ts-node": "10.9.1", + "tsconfig-paths": "^4.2.0", + "typescript": "5.0.2", + "vite-tsconfig-paths": "^4.2.0", + "vitest": "^0.29.8" + } + }, + "node_modules/@acuminous/bitsyntax": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@acuminous/bitsyntax/-/bitsyntax-0.1.2.tgz", + "integrity": "sha512-29lUK80d1muEQqiUsSo+3A0yP6CdspgC95EnKBMi22Xlwt79i/En4Vr67+cXhU+cZjbti3TgGGC5wy1stIywVQ==", + "dependencies": { + "buffer-more-ints": "~1.0.0", + "debug": "^4.3.4", + "safe-buffer": "~5.1.2" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/@babel/generator": { + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.2.tgz", + "integrity": "sha512-W1lG5vUwFvfMd8HVXqdfbuG7RuaSrTCCD8cl8fP8wOivdbtbIg2Db3IWUcgvfxKbbn6ZBGYRW/Zk1MIwK49mgw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.18.2", + "@jridgewell/gen-mapping": "^0.3.0", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", + "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz", + "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.18.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.4.tgz", + "integrity": "sha512-FDge0dFazETFcxGw/EXzOkN8uJp0PC7Qbm+Pe9T+av2zlBpOgunFHkQPPn+eRuClU73JF+98D531UgayY89tow==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/types": { + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.19.0.tgz", + "integrity": "sha512-YuGopBq3ke25BVSiS6fgF49Ul9gH1x70Bcr6bqRLjWCkcX8Hre1/5+z+IiWOIerRMSSEfGZVB9z9kyq7wVs9YA==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.18.10", + "@babel/helper-validator-identifier": "^7.18.6", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.19.tgz", + "integrity": "sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.19.tgz", + "integrity": "sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.19.tgz", + "integrity": "sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.19.tgz", + "integrity": "sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.19.tgz", + "integrity": "sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.19.tgz", + "integrity": "sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.19.tgz", + "integrity": "sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.19.tgz", + "integrity": "sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.19.tgz", + "integrity": "sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.19.tgz", + "integrity": "sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.19.tgz", + "integrity": "sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.19.tgz", + "integrity": "sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.19.tgz", + "integrity": "sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.19.tgz", + "integrity": "sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.19.tgz", + "integrity": "sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.19.tgz", + "integrity": "sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.19.tgz", + "integrity": "sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.19.tgz", + "integrity": "sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.19.tgz", + "integrity": "sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.19.tgz", + "integrity": "sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.19.tgz", + "integrity": "sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.19.tgz", + "integrity": "sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@grpc/grpc-js": { + "version": "1.8.14", + "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.8.14.tgz", + "integrity": "sha512-w84maJ6CKl5aApCMzFll0hxtFNT6or9WwMslobKaqWUEf1K+zhlL43bSQhFreyYWIWR+Z0xnVFC1KtLm4ZpM/A==", + "dependencies": { + "@grpc/proto-loader": "^0.7.0", + "@types/node": ">=12.12.47" + }, + "engines": { + "node": "^8.13.0 || >=10.10.0" + } + }, + "node_modules/@grpc/proto-loader": { + "version": "0.7.6", + "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.6.tgz", + "integrity": "sha512-QyAXR8Hyh7uMDmveWxDSUcJr9NAWaZ2I6IXgAYvQmfflwouTM+rArE2eEaCtLlRqO81j7pRLCt81IefUei6Zbw==", + "dependencies": { + "@types/long": "^4.0.1", + "lodash.camelcase": "^4.3.0", + "long": "^4.0.0", + "protobufjs": "^7.0.0", + "yargs": "^16.2.0" + }, + "bin": { + "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.19", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz", + "integrity": "sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@mapbox/node-pre-gyp": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.11.tgz", + "integrity": "sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==", + "dev": true, + "dependencies": { + "detect-libc": "^2.0.0", + "https-proxy-agent": "^5.0.0", + "make-dir": "^3.1.0", + "node-fetch": "^2.6.7", + "nopt": "^5.0.0", + "npmlog": "^5.0.1", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.11" + }, + "bin": { + "node-pre-gyp": "bin/node-pre-gyp" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@prisma/client": { + "version": "4.16.2", + "resolved": "https://registry.npmjs.org/@prisma/client/-/client-4.16.2.tgz", + "integrity": "sha512-qCoEyxv1ZrQ4bKy39GnylE8Zq31IRmm8bNhNbZx7bF2cU5aiCCnSa93J2imF88MBjn7J9eUQneNxUQVJdl/rPQ==", + "hasInstallScript": true, + "dependencies": { + "@prisma/engines-version": "4.16.1-1.4bc8b6e1b66cb932731fb1bdbbc550d1e010de81" + }, + "engines": { + "node": ">=14.17" + }, + "peerDependencies": { + "prisma": "*" + }, + "peerDependenciesMeta": { + "prisma": { + "optional": true + } + } + }, + "node_modules/@prisma/engines": { + "version": "4.16.2", + "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-4.16.2.tgz", + "integrity": "sha512-vx1nxVvN4QeT/cepQce68deh/Turxy5Mr+4L4zClFuK1GlxN3+ivxfuv+ej/gvidWn1cE1uAhW7ALLNlYbRUAw==", + "devOptional": true, + "hasInstallScript": true + }, + "node_modules/@prisma/engines-version": { + "version": "4.16.1-1.4bc8b6e1b66cb932731fb1bdbbc550d1e010de81", + "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-4.16.1-1.4bc8b6e1b66cb932731fb1bdbbc550d1e010de81.tgz", + "integrity": "sha512-q617EUWfRIDTriWADZ4YiWRZXCa/WuhNgLTVd+HqWLffjMSPzyM5uOWoauX91wvQClSKZU4pzI4JJLQ9Kl62Qg==" + }, + "node_modules/@protobufjs/aspromise": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==" + }, + "node_modules/@protobufjs/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" + }, + "node_modules/@protobufjs/codegen": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", + "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" + }, + "node_modules/@protobufjs/eventemitter": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", + "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==" + }, + "node_modules/@protobufjs/fetch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", + "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", + "dependencies": { + "@protobufjs/aspromise": "^1.1.1", + "@protobufjs/inquire": "^1.1.0" + } + }, + "node_modules/@protobufjs/float": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", + "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==" + }, + "node_modules/@protobufjs/inquire": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", + "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==" + }, + "node_modules/@protobufjs/path": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==" + }, + "node_modules/@protobufjs/pool": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==" + }, + "node_modules/@protobufjs/utf8": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", + "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==" + }, + "node_modules/@tsconfig/node10": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", + "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", + "dev": true + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", + "dev": true + }, + "node_modules/@types/amqplib": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/@types/amqplib/-/amqplib-0.10.1.tgz", + "integrity": "sha512-j6ANKT79ncUDnAs/+9r9eDujxbeJoTjoVu33gHHcaPfmLQaMhvfbH2GqSe8KUM444epAp1Vl3peVOQfZk3UIqA==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/chai": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.5.tgz", + "integrity": "sha512-mEo1sAde+UCE6b2hxn332f1g1E8WfYRu6p5SvTKr2ZKC1f7gFJXk4h5PyGP9Dt6gCaG8y8XhwnXWC6Iy2cmBng==", + "dev": true + }, + "node_modules/@types/chai-subset": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@types/chai-subset/-/chai-subset-1.3.3.tgz", + "integrity": "sha512-frBecisrNGz+F4T6bcc+NLeolfiojh5FxW2klu669+8BARtyQv2C/GkNW6FUodVe4BroGMP/wER/YDGc7rEllw==", + "dev": true, + "dependencies": { + "@types/chai": "*" + } + }, + "node_modules/@types/long": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz", + "integrity": "sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==" + }, + "node_modules/@types/node": { + "version": "18.15.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.9.tgz", + "integrity": "sha512-dUxhiNzBLr6IqlZXz6e/rN2YQXlFgOei/Dxy+e3cyXTJ4txSUbGT2/fmnD6zd/75jDMeW5bDee+YXxlFKHoV0A==" + }, + "node_modules/@vitest/expect": { + "version": "0.29.8", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-0.29.8.tgz", + "integrity": "sha512-xlcVXn5I5oTq6NiZSY3ykyWixBxr5mG8HYtjvpgg6KaqHm0mvhX18xuwl5YGxIRNt/A5jidd7CWcNHrSvgaQqQ==", + "dev": true, + "dependencies": { + "@vitest/spy": "0.29.8", + "@vitest/utils": "0.29.8", + "chai": "^4.3.7" + } + }, + "node_modules/@vitest/runner": { + "version": "0.29.8", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-0.29.8.tgz", + "integrity": "sha512-FzdhnRDwEr/A3Oo1jtIk/B952BBvP32n1ObMEb23oEJNO+qO5cBet6M2XWIDQmA7BDKGKvmhUf2naXyp/2JEwQ==", + "dev": true, + "dependencies": { + "@vitest/utils": "0.29.8", + "p-limit": "^4.0.0", + "pathe": "^1.1.0" + } + }, + "node_modules/@vitest/spy": { + "version": "0.29.8", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-0.29.8.tgz", + "integrity": "sha512-VdjBe9w34vOMl5I5mYEzNX8inTxrZ+tYUVk9jxaZJmHFwmDFC/GV3KBFTA/JKswr3XHvZL+FE/yq5EVhb6pSAw==", + "dev": true, + "dependencies": { + "tinyspy": "^1.0.2" + } + }, + "node_modules/@vitest/utils": { + "version": "0.29.8", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-0.29.8.tgz", + "integrity": "sha512-qGzuf3vrTbnoY+RjjVVIBYfuWMjn3UMUqyQtdGNZ6ZIIyte7B37exj6LaVkrZiUTvzSadVvO/tJm8AEgbGCBPg==", + "dev": true, + "dependencies": { + "cli-truncate": "^3.1.0", + "diff": "^5.1.0", + "loupe": "^2.3.6", + "pretty-format": "^27.5.1" + } + }, + "node_modules/@vitest/utils/node_modules/diff": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.1.0.tgz", + "integrity": "sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true + }, + "node_modules/acorn": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/amqplib": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/amqplib/-/amqplib-0.10.3.tgz", + "integrity": "sha512-UHmuSa7n8vVW/a5HGh2nFPqAEr8+cD4dEZ6u9GjP91nHfr1a54RyAKyra7Sb5NH7NBKOUlyQSMXIp0qAixKexw==", + "dependencies": { + "@acuminous/bitsyntax": "^0.1.2", + "buffer-more-ints": "~1.0.0", + "readable-stream": "1.x >=1.1.9", + "url-parse": "~1.5.10" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/aproba": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", + "dev": true + }, + "node_modules/are-we-there-yet": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", + "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", + "dev": true, + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/are-we-there-yet/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/are-we-there-yet/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/are-we-there-yet/node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dev": true, + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/bl/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/bl/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/bl/node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/buffer-more-ints": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-more-ints/-/buffer-more-ints-1.0.0.tgz", + "integrity": "sha512-EMetuGFz5SLsT0QTnXzINh4Ksr+oo4i+UGTXEshiGCQWnsgSs7ZhJ8fzlwQ+OzEMs0MpDAMr1hxnblp5a4vcHg==" + }, + "node_modules/cac": { + "version": "6.7.14", + "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", + "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/chai": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.7.tgz", + "integrity": "sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==", + "dev": true, + "dependencies": { + "assertion-error": "^1.1.0", + "check-error": "^1.0.2", + "deep-eql": "^4.1.2", + "get-func-name": "^2.0.0", + "loupe": "^2.3.1", + "pathval": "^1.1.1", + "type-detect": "^4.0.5" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chalk/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/chalk/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/check-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", + "integrity": "sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/cli-truncate": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-3.1.0.tgz", + "integrity": "sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==", + "dev": true, + "dependencies": { + "slice-ansi": "^5.0.0", + "string-width": "^5.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-truncate/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/cli-truncate/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, + "node_modules/cli-truncate/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-truncate/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "dev": true, + "bin": { + "color-support": "bin.js" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", + "dev": true + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "dev": true, + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/deep-eql": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz", + "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==", + "dev": true, + "dependencies": { + "type-detect": "^4.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "dev": true, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", + "dev": true + }, + "node_modules/detect-libc": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.2.tgz", + "integrity": "sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dotenv": { + "version": "16.3.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.3.1.tgz", + "integrity": "sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/motdotla/dotenv?sponsor=1" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/esbuild": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.19.tgz", + "integrity": "sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.17.19", + "@esbuild/android-arm64": "0.17.19", + "@esbuild/android-x64": "0.17.19", + "@esbuild/darwin-arm64": "0.17.19", + "@esbuild/darwin-x64": "0.17.19", + "@esbuild/freebsd-arm64": "0.17.19", + "@esbuild/freebsd-x64": "0.17.19", + "@esbuild/linux-arm": "0.17.19", + "@esbuild/linux-arm64": "0.17.19", + "@esbuild/linux-ia32": "0.17.19", + "@esbuild/linux-loong64": "0.17.19", + "@esbuild/linux-mips64el": "0.17.19", + "@esbuild/linux-ppc64": "0.17.19", + "@esbuild/linux-riscv64": "0.17.19", + "@esbuild/linux-s390x": "0.17.19", + "@esbuild/linux-x64": "0.17.19", + "@esbuild/netbsd-x64": "0.17.19", + "@esbuild/openbsd-x64": "0.17.19", + "@esbuild/sunos-x64": "0.17.19", + "@esbuild/win32-arm64": "0.17.19", + "@esbuild/win32-ia32": "0.17.19", + "@esbuild/win32-x64": "0.17.19" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "engines": { + "node": ">=6" + } + }, + "node_modules/expand-template": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", + "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/fast-glob": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", + "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + } + }, + "node_modules/from2/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "node_modules/from2/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/from2/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "dev": true + }, + "node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/fs-minipass/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "node_modules/gauge": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", + "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", + "dev": true, + "dependencies": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.2", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.1", + "object-assign": "^4.1.1", + "signal-exit": "^3.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-func-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", + "integrity": "sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/github-from-package": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", + "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==", + "dev": true + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globrex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz", + "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==", + "dev": true + }, + "node_modules/google-protobuf": { + "version": "3.21.2", + "resolved": "https://registry.npmjs.org/google-protobuf/-/google-protobuf-3.21.2.tgz", + "integrity": "sha512-3MSOYFO5U9mPGikIYCzK0SaThypfGgS6bHqrUGXG3DPHCrb+txNqeEcns1W0lkGfk0rCyNXm7xB9rMxnCiZOoA==" + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true + }, + "node_modules/grpc-server-reflection": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/grpc-server-reflection/-/grpc-server-reflection-0.1.5.tgz", + "integrity": "sha512-i69RYu6v65enzknNAPUgerFuVQfo+L3n9g4c1A/Sv5jUHMpxMIjSbBA+YWls9Sr4Flac4oohp4Gx8f389CaHuw==", + "dependencies": { + "google-protobuf": "^3.19.1" + } + }, + "node_modules/grpc-tools": { + "version": "1.12.4", + "resolved": "https://registry.npmjs.org/grpc-tools/-/grpc-tools-1.12.4.tgz", + "integrity": "sha512-5+mLAJJma3BjnW/KQp6JBjUMgvu7Mu3dBvBPd1dcbNIb+qiR0817zDpgPjS7gRb+l/8EVNIa3cB02xI9JLToKg==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "@mapbox/node-pre-gyp": "^1.0.5" + }, + "bin": { + "grpc_tools_node_protoc": "bin/protoc.js", + "grpc_tools_node_protoc_plugin": "bin/protoc_plugin.js" + } + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", + "dev": true + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dev": true, + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/ignore": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/ignore-by-default": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", + "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==", + "dev": true + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true + }, + "node_modules/into-stream": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/into-stream/-/into-stream-6.0.0.tgz", + "integrity": "sha512-XHbaOAvP+uFKUFsOgoNPRjLkwB+I22JFPFe5OjTkQ0nwgj6+pSjb4NmB6VMxaPshLiOf+zcpOCBQuLwC1KHhZA==", + "dev": true, + "dependencies": { + "from2": "^2.3.0", + "p-is-promise": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz", + "integrity": "sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonc-parser": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", + "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", + "dev": true + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/local-pkg": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.4.3.tgz", + "integrity": "sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==" + }, + "node_modules/long": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", + "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" + }, + "node_modules/loupe": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.6.tgz", + "integrity": "sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==", + "dev": true, + "dependencies": { + "get-func-name": "^2.0.0" + } + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minizlib/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mkdirp-classic": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", + "dev": true + }, + "node_modules/mlly": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.4.0.tgz", + "integrity": "sha512-ua8PAThnTwpprIaU47EPeZ/bPUVp2QYBbWMphUQpVdBI3Lgqzm5KZQ45Agm3YJedHXaIHl6pBGabaLSUPPSptg==", + "dev": true, + "dependencies": { + "acorn": "^8.9.0", + "pathe": "^1.1.1", + "pkg-types": "^1.0.3", + "ufo": "^1.1.2" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/multistream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/multistream/-/multistream-4.1.0.tgz", + "integrity": "sha512-J1XDiAmmNpRCBfIWJv+n0ymC4ABcf/Pl+5YvC5B/D2f/2+8PtHvCNxMPKiQcZyi922Hq69J2YOpb1pTywfifyw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "once": "^1.4.0", + "readable-stream": "^3.6.0" + } + }, + "node_modules/multistream/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/multistream/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/multistream/node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/nanoid": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", + "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/napi-build-utils": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", + "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==", + "dev": true + }, + "node_modules/node-abi": { + "version": "3.47.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.47.0.tgz", + "integrity": "sha512-2s6B2CWZM//kPgwnuI0KrYwNjfdByE25zvAaEpq9IH4zcNsarH8Ihu/UuX6XMPEogDAxkuUFeZn60pXNHAqn3A==", + "dev": true, + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/node-fetch": { + "version": "2.6.13", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.13.tgz", + "integrity": "sha512-StxNAxh15zr77QvvkmveSQ8uCQ4+v5FkvNTj0OESmiHu+VRi/gXArXtkWMElOsOUNLtUEvI4yS+rdtOHZTwlQA==", + "dev": true, + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/nodemon": { + "version": "2.0.22", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.22.tgz", + "integrity": "sha512-B8YqaKMmyuCO7BowF1Z1/mkPqLk6cs/l63Ojtd6otKjMx47Dq1utxfRxcavH1I7VSaL8n5BUaoutadnsX3AAVQ==", + "dev": true, + "dependencies": { + "chokidar": "^3.5.2", + "debug": "^3.2.7", + "ignore-by-default": "^1.0.1", + "minimatch": "^3.1.2", + "pstree.remy": "^1.1.8", + "semver": "^5.7.1", + "simple-update-notifier": "^1.0.7", + "supports-color": "^5.5.0", + "touch": "^3.1.0", + "undefsafe": "^2.0.5" + }, + "bin": { + "nodemon": "bin/nodemon.js" + }, + "engines": { + "node": ">=8.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/nodemon" + } + }, + "node_modules/nodemon/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/nodemon/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "dev": true, + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npmlog": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", + "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", + "dev": true, + "dependencies": { + "are-we-there-yet": "^2.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^3.0.0", + "set-blocking": "^2.0.0" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/p-is-promise": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-3.0.0.tgz", + "integrity": "sha512-Wo8VsW4IRQSKVXsJCn7TomUaVtyfjVDn3nUP7kE967BQk0CwFpdbZs0X0uk5sW9mkBa9eNM7hCMaG93WUAwxYQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-limit": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", + "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^1.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/pathe": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.1.tgz", + "integrity": "sha512-d+RQGp0MAYTIaDBIMmOfMwz3E+LOZnxx1HZd5R18mmCZY0QBlK0LDZfPc8FW8Ed2DlvsuE6PRjroDY+wg4+j/Q==", + "dev": true + }, + "node_modules/pathval": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", + "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pkg": { + "version": "5.8.1", + "resolved": "https://registry.npmjs.org/pkg/-/pkg-5.8.1.tgz", + "integrity": "sha512-CjBWtFStCfIiT4Bde9QpJy0KeH19jCfwZRJqHFDFXfhUklCx8JoFmMj3wgnEYIwGmZVNkhsStPHEOnrtrQhEXA==", + "dev": true, + "dependencies": { + "@babel/generator": "7.18.2", + "@babel/parser": "7.18.4", + "@babel/types": "7.19.0", + "chalk": "^4.1.2", + "fs-extra": "^9.1.0", + "globby": "^11.1.0", + "into-stream": "^6.0.0", + "is-core-module": "2.9.0", + "minimist": "^1.2.6", + "multistream": "^4.1.0", + "pkg-fetch": "3.4.2", + "prebuild-install": "7.1.1", + "resolve": "^1.22.0", + "stream-meter": "^1.0.4" + }, + "bin": { + "pkg": "lib-es5/bin.js" + }, + "peerDependencies": { + "node-notifier": ">=9.0.1" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/pkg-fetch": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/pkg-fetch/-/pkg-fetch-3.4.2.tgz", + "integrity": "sha512-0+uijmzYcnhC0hStDjm/cl2VYdrmVVBpe7Q8k9YBojxmR5tG8mvR9/nooQq3QSXiQqORDVOTY3XqMEqJVIzkHA==", + "dev": true, + "dependencies": { + "chalk": "^4.1.2", + "fs-extra": "^9.1.0", + "https-proxy-agent": "^5.0.0", + "node-fetch": "^2.6.6", + "progress": "^2.0.3", + "semver": "^7.3.5", + "tar-fs": "^2.1.1", + "yargs": "^16.2.0" + }, + "bin": { + "pkg-fetch": "lib-es5/bin.js" + } + }, + "node_modules/pkg-types": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.0.3.tgz", + "integrity": "sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==", + "dev": true, + "dependencies": { + "jsonc-parser": "^3.2.0", + "mlly": "^1.2.0", + "pathe": "^1.1.0" + } + }, + "node_modules/postcss": { + "version": "8.4.28", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.28.tgz", + "integrity": "sha512-Z7V5j0cq8oEKyejIKfpD8b4eBy9cwW2JWPk0+fB1HOAMsfHbnAXLLS+PfVWlzMSLQaWttKDt607I0XHmpE67Vw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/prebuild-install": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.1.tgz", + "integrity": "sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==", + "dev": true, + "dependencies": { + "detect-libc": "^2.0.0", + "expand-template": "^2.0.3", + "github-from-package": "0.0.0", + "minimist": "^1.2.3", + "mkdirp-classic": "^0.5.3", + "napi-build-utils": "^1.0.1", + "node-abi": "^3.3.0", + "pump": "^3.0.0", + "rc": "^1.2.7", + "simple-get": "^4.0.0", + "tar-fs": "^2.0.0", + "tunnel-agent": "^0.6.0" + }, + "bin": { + "prebuild-install": "bin.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/pretty-format": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", + "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/prisma": { + "version": "4.16.2", + "resolved": "https://registry.npmjs.org/prisma/-/prisma-4.16.2.tgz", + "integrity": "sha512-SYCsBvDf0/7XSJyf2cHTLjLeTLVXYfqp7pG5eEVafFLeT0u/hLFz/9W196nDRGUOo1JfPatAEb+uEnTQImQC1g==", + "devOptional": true, + "hasInstallScript": true, + "dependencies": { + "@prisma/engines": "4.16.2" + }, + "bin": { + "prisma": "build/index.js", + "prisma2": "build/index.js" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/protobufjs": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.2.2.tgz", + "integrity": "sha512-++PrQIjrom+bFDPpfmqXfAGSQs40116JRrqqyf53dymUMvvb5d/LMRyicRoF1AUKoXVS1/IgJXlEgcpr4gTF3Q==", + "hasInstallScript": true, + "dependencies": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/node": ">=13.7.0", + "long": "^5.0.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/protobufjs/node_modules/long": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", + "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==" + }, + "node_modules/pstree.remy": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", + "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", + "dev": true + }, + "node_modules/pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==" + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dev": true, + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, + "node_modules/react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", + "dev": true + }, + "node_modules/readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==" + }, + "node_modules/resolve": { + "version": "1.22.4", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.4.tgz", + "integrity": "sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==", + "dev": true, + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve/node_modules/is-core-module": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", + "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rollup": { + "version": "3.28.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.28.0.tgz", + "integrity": "sha512-d7zhvo1OUY2SXSM6pfNjgD5+d0Nz87CUp4mt8l/GgVP3oBsPwzNvSzyu1me6BSG9JIgWNTVcafIXBIyM8yQ3yw==", + "dev": true, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=14.18.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "dev": true + }, + "node_modules/siginfo": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", + "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", + "dev": true + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "node_modules/simple-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/simple-get": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", + "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "decompress-response": "^6.0.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } + }, + "node_modules/simple-update-notifier": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-1.1.0.tgz", + "integrity": "sha512-VpsrsJSUcJEseSbMHkrsrAVSdvVS5I96Qo1QAQ4FxQ9wXFcB+pjj7FB7/us9+GcgfW4ziHtYMc1J0PLczb55mg==", + "dev": true, + "dependencies": { + "semver": "~7.0.0" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/simple-update-notifier/node_modules/semver": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", + "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/slice-ansi": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", + "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.0.0", + "is-fullwidth-code-point": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/slice-ansi/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/slice-ansi/node_modules/is-fullwidth-code-point": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", + "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stackback": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", + "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", + "dev": true + }, + "node_modules/std-env": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.4.0.tgz", + "integrity": "sha512-YqHeQIIQ8r1VtUZOTOyjsAXAsjr369SplZ5rlQaiJTBsvodvPSCME7vuz8pnQltbQ0Cw0lyFo5Q8uyNwYQ58Xw==", + "dev": true + }, + "node_modules/stream-meter": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/stream-meter/-/stream-meter-1.0.4.tgz", + "integrity": "sha512-4sOEtrbgFotXwnEuzzsQBYEV1elAeFSO8rSGeTwabuX1RRn/kEq9JVH7I0MRBhKVRR0sJkr0M0QCH7yOLf9fhQ==", + "dev": true, + "dependencies": { + "readable-stream": "^2.1.4" + } + }, + "node_modules/stream-meter/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "node_modules/stream-meter/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/stream-meter/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==" + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-literal": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-1.3.0.tgz", + "integrity": "sha512-PugKzOsyXpArk0yWmUwqOZecSO0GH0bPoctLcqNDH9J04pVW3lflYE0ujElBGTloevcxF5MofAOZ7C5l2b+wLg==", + "dev": true, + "dependencies": { + "acorn": "^8.10.0" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tar": { + "version": "6.1.15", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.15.tgz", + "integrity": "sha512-/zKt9UyngnxIT/EAGYuxaMYgOIJiP81ab9ZfkILq4oNLPFX50qyYmu7jRj9qeXoxmJHjGlbH0+cm2uy1WCs10A==", + "dev": true, + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/tar-fs": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", + "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", + "dev": true, + "dependencies": { + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.1.4" + } + }, + "node_modules/tar-fs/node_modules/chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "dev": true + }, + "node_modules/tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "dev": true, + "dependencies": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tar-stream/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/tar-stream/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/tar-stream/node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/tinybench": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.5.0.tgz", + "integrity": "sha512-kRwSG8Zx4tjF9ZiyH4bhaebu+EDz1BOx9hOigYHlUW4xxI/wKIUQUqo018UlU4ar6ATPBsaMrdbKZ+tmPdohFA==", + "dev": true + }, + "node_modules/tinypool": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-0.4.0.tgz", + "integrity": "sha512-2ksntHOKf893wSAH4z/+JbPpi92esw8Gn9N2deXX+B0EO92hexAVI9GIZZPx7P5aYo5KULfeOSt3kMOmSOy6uA==", + "dev": true, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tinyspy": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-1.1.1.tgz", + "integrity": "sha512-UVq5AXt/gQlti7oxoIg5oi/9r0WpF7DGEVwXgqWSMmyN16+e3tl5lIvTaOpJ3TAtu5xFzWccFRM4R5NaWHF+4g==", + "dev": true, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/touch": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", + "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", + "dev": true, + "dependencies": { + "nopt": "~1.0.10" + }, + "bin": { + "nodetouch": "bin/nodetouch.js" + } + }, + "node_modules/touch/node_modules/nopt": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", + "integrity": "sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==", + "dev": true, + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "*" + } + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "dev": true + }, + "node_modules/ts-node": { + "version": "10.9.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", + "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", + "dev": true, + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "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 + } + } + }, + "node_modules/tsconfck": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/tsconfck/-/tsconfck-2.1.2.tgz", + "integrity": "sha512-ghqN1b0puy3MhhviwO2kGF8SeMDNhEbnKxjK7h6+fvY9JAxqvXi8y5NAHSQv687OVboS2uZIByzGd45/YxrRHg==", + "dev": true, + "bin": { + "tsconfck": "bin/tsconfck.js" + }, + "engines": { + "node": "^14.13.1 || ^16 || >=18" + }, + "peerDependencies": { + "typescript": "^4.3.5 || ^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/tsconfig-paths": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", + "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==", + "dev": true, + "dependencies": { + "json5": "^2.2.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "dev": true, + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/typescript": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.2.tgz", + "integrity": "sha512-wVORMBGO/FAs/++blGNeAVdbNKtIh1rbBL2EyQ1+J9lClJ93KiiKe8PmFIVdXhHcyv44SL9oglmfeSsndo0jRw==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=12.20" + } + }, + "node_modules/ufo": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.2.0.tgz", + "integrity": "sha512-RsPyTbqORDNDxqAdQPQBpgqhWle1VcTSou/FraClYlHf6TZnQcGslpLcAphNR+sQW4q5lLWLbOsRlh9j24baQg==", + "dev": true + }, + "node_modules/undefsafe": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", + "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", + "dev": true + }, + "node_modules/universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/url-parse": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true + }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true + }, + "node_modules/vite": { + "version": "4.4.9", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.4.9.tgz", + "integrity": "sha512-2mbUn2LlUmNASWwSCNSJ/EG2HuSRTnVNaydp6vMCm5VIqJsjMfbIWtbH2kDuwUVW5mMUKKZvGPX/rqeqVvv1XA==", + "dev": true, + "dependencies": { + "esbuild": "^0.18.10", + "postcss": "^8.4.27", + "rollup": "^3.27.1" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + }, + "peerDependencies": { + "@types/node": ">= 14", + "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 + } + } + }, + "node_modules/vite-node": { + "version": "0.29.8", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-0.29.8.tgz", + "integrity": "sha512-b6OtCXfk65L6SElVM20q5G546yu10/kNrhg08afEoWlFRJXFq9/6glsvSVY+aI6YeC1tu2TtAqI2jHEQmOmsFw==", + "dev": true, + "dependencies": { + "cac": "^6.7.14", + "debug": "^4.3.4", + "mlly": "^1.1.0", + "pathe": "^1.1.0", + "picocolors": "^1.0.0", + "vite": "^3.0.0 || ^4.0.0" + }, + "bin": { + "vite-node": "vite-node.mjs" + }, + "engines": { + "node": ">=v14.16.0" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/vite-tsconfig-paths": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/vite-tsconfig-paths/-/vite-tsconfig-paths-4.2.0.tgz", + "integrity": "sha512-jGpus0eUy5qbbMVGiTxCL1iB9ZGN6Bd37VGLJU39kTDD6ZfULTTb1bcc5IeTWqWJKiWV5YihCaibeASPiGi8kw==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "globrex": "^0.1.2", + "tsconfck": "^2.1.0" + }, + "peerDependencies": { + "vite": "*" + }, + "peerDependenciesMeta": { + "vite": { + "optional": true + } + } + }, + "node_modules/vite/node_modules/@esbuild/android-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", + "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/android-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz", + "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/android-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz", + "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/darwin-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz", + "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/darwin-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz", + "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/freebsd-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz", + "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/freebsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz", + "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz", + "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz", + "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz", + "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-loong64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", + "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-mips64el": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz", + "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-ppc64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz", + "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-riscv64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz", + "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-s390x": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz", + "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz", + "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/netbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz", + "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/openbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz", + "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/sunos-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz", + "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/win32-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", + "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/win32-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz", + "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/win32-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", + "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/esbuild": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", + "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.18.20", + "@esbuild/android-arm64": "0.18.20", + "@esbuild/android-x64": "0.18.20", + "@esbuild/darwin-arm64": "0.18.20", + "@esbuild/darwin-x64": "0.18.20", + "@esbuild/freebsd-arm64": "0.18.20", + "@esbuild/freebsd-x64": "0.18.20", + "@esbuild/linux-arm": "0.18.20", + "@esbuild/linux-arm64": "0.18.20", + "@esbuild/linux-ia32": "0.18.20", + "@esbuild/linux-loong64": "0.18.20", + "@esbuild/linux-mips64el": "0.18.20", + "@esbuild/linux-ppc64": "0.18.20", + "@esbuild/linux-riscv64": "0.18.20", + "@esbuild/linux-s390x": "0.18.20", + "@esbuild/linux-x64": "0.18.20", + "@esbuild/netbsd-x64": "0.18.20", + "@esbuild/openbsd-x64": "0.18.20", + "@esbuild/sunos-x64": "0.18.20", + "@esbuild/win32-arm64": "0.18.20", + "@esbuild/win32-ia32": "0.18.20", + "@esbuild/win32-x64": "0.18.20" + } + }, + "node_modules/vitest": { + "version": "0.29.8", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-0.29.8.tgz", + "integrity": "sha512-JIAVi2GK5cvA6awGpH0HvH/gEG9PZ0a/WoxdiV3PmqK+3CjQMf8c+J/Vhv4mdZ2nRyXFw66sAg6qz7VNkaHfDQ==", + "dev": true, + "dependencies": { + "@types/chai": "^4.3.4", + "@types/chai-subset": "^1.3.3", + "@types/node": "*", + "@vitest/expect": "0.29.8", + "@vitest/runner": "0.29.8", + "@vitest/spy": "0.29.8", + "@vitest/utils": "0.29.8", + "acorn": "^8.8.1", + "acorn-walk": "^8.2.0", + "cac": "^6.7.14", + "chai": "^4.3.7", + "debug": "^4.3.4", + "local-pkg": "^0.4.2", + "pathe": "^1.1.0", + "picocolors": "^1.0.0", + "source-map": "^0.6.1", + "std-env": "^3.3.1", + "strip-literal": "^1.0.0", + "tinybench": "^2.3.1", + "tinypool": "^0.4.0", + "tinyspy": "^1.0.2", + "vite": "^3.0.0 || ^4.0.0", + "vite-node": "0.29.8", + "why-is-node-running": "^2.2.2" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": ">=v14.16.0" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@vitest/browser": "*", + "@vitest/ui": "*", + "happy-dom": "*", + "jsdom": "*", + "playwright": "*", + "safaridriver": "*", + "webdriverio": "*" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@vitest/browser": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + }, + "playwright": { + "optional": true + }, + "safaridriver": { + "optional": true + }, + "webdriverio": { + "optional": true + } + } + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "dev": true + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dev": true, + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/why-is-node-running": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.2.2.tgz", + "integrity": "sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==", + "dev": true, + "dependencies": { + "siginfo": "^2.0.0", + "stackback": "0.0.2" + }, + "bin": { + "why-is-node-running": "cli.js" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wide-align": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", + "dev": true, + "dependencies": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "engines": { + "node": ">=10" + } + }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/yocto-queue": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", + "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", + "dev": true, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} From 3a51e957797b488f14d63c32fd56026c17b3c720 Mon Sep 17 00:00:00 2001 From: Florian LEROUX Date: Sun, 20 Aug 2023 18:03:50 +0200 Subject: [PATCH 441/883] feat(middleware): add auth middleware --- .../src/controller/user/user.controller.ts | 386 ++++++++++-------- services/gateway/src/middleware/auth.ts | 56 +++ services/gateway/src/services/user.service.ts | 59 ++- 3 files changed, 323 insertions(+), 178 deletions(-) create mode 100644 services/gateway/src/middleware/auth.ts diff --git a/services/gateway/src/controller/user/user.controller.ts b/services/gateway/src/controller/user/user.controller.ts index fc7e986b..fd48734b 100644 --- a/services/gateway/src/controller/user/user.controller.ts +++ b/services/gateway/src/controller/user/user.controller.ts @@ -1,196 +1,242 @@ -import {Request, Response, Router} from 'express'; -import {userServiceClient} from '../../services/clients/user.client'; +import { Request, Response, Router } from "express"; +import { userServiceClient } from "../../services/clients/user.client"; import { - changePasswordInput, - changeRoleInput, - DeleteInput, - logInInput, - MainAddress, - RoleInput, - UpdateUserInput, - User, - UserCreateInput, - validateInput + changePasswordInput, + changeRoleInput, + DeleteInput, + logInInput, + MainAddress, + RoleInput, + UpdateUserInput, + User, + UserCreateInput, + validateInput, } from "@gateway/proto/user_pb"; -import {Empty} from "google-protobuf/google/protobuf/empty_pb"; -import {getUser} from "@gateway/services/user.service"; +import { Empty } from "google-protobuf/google/protobuf/empty_pb"; +import { getUser } from "@gateway/services/user.service"; +import { check, withCheck } from "@gateway/middleware/auth"; export const userRoutes = Router(); -userRoutes.get('/api/user/:id', (req: Request, res: Response) => { - const {id} = req.params; - try { - res.json(getUser(Number(id))); - } catch (e: any) { - res.json({error: e.message}); - } +userRoutes.get("/api/user/:id", async (req: Request, res: Response) => { + const { id } = req.params; + + // Auth check and :id check + const { authorization } = req.headers; + if (!authorization) return res.status(401).json({ message: "Unauthorized" }); + const token = authorization.split("Bearer ")[1]; + if (!(await check(token, { id: Number(id) }))) + return res.status(403).json({ message: "Forbidden" }); + + try { + res.json(getUser(Number(id))); + } catch (e: any) { + res.json({ error: e.message }); + } }); -userRoutes.get('/api/user', (req: Request, res: Response) => { +userRoutes.get( + "/api/user", + withCheck({ role: "ADMIN" }), + (req: Request, res: Response) => { userServiceClient.listUser(new Empty(), (error, response) => { - if (error) { - res.status(500).send({error: error.message}); - } else { - res.json(response.toObject()); - } + if (error) res.status(500).send({ error: error.message }); + else res.json(response.toObject()); }); -}); - -userRoutes.post('/api/user/register', (req: Request, res: Response) => { - const {firstName, lastName, email, password, phone, country, zipCode, street, lat, lng, roleCode} = req.body; - const userInput = new UserCreateInput(); - try { - const address = new MainAddress().setCountry(country).setZipcode(zipCode).setStreet(street).setLat(lat).setLng(lng) - userInput.setFirstName(firstName) - .setLastName(lastName) - .setEmail(email) - .setPassword(password) - .setPhone(phone) - .setMainaddress(address) - .setRole(new RoleInput().setCode(roleCode)); - - } catch (e: any) { - res.json({error: e.message}); + } +); + +userRoutes.post("/api/user", (req: Request, res: Response) => { + const { + firstName, + lastName, + email, + phone, + country, + zipCode, + street, + lat, + lng, + roleCode, + } = req.body; + const userInput = new UserCreateInput(); + try { + const address = new MainAddress() + .setCountry(country) + .setZipcode(zipCode) + .setStreet(street) + .setLat(lat) + .setLng(lng); + userInput + .setFirstName(firstName) + .setLastName(lastName) + .setEmail(email) + .setPhone(phone) + .setMainaddress(address) + .setRole(new RoleInput().setCode(roleCode)); + } catch (e: any) { + res.json({ error: e.message }); + } + + userServiceClient.register(userInput, (error, response) => { + if (error) { + res.status(500).send({ error: error.message }); + } else { + res.json(response.toObject()); } - - userServiceClient.register(userInput, (error, response) => { - if (error) { - res.status(500).send({error: error.message}); - } else { - res.json(response.toObject()); - } - }); + }); }); -userRoutes.put('/api/user/:id', (req: Request, res: Response) => { - const {authorization} = req.headers; - if (!authorization) { - res.json({error: 'Not authorized'}); - return; - } - const {firstName, lastName, email, phone, country, zipCode, street, lat, lng, role} = req.body; - const userInput = new UpdateUserInput() - - try { - const address = new MainAddress().setCountry(country).setZipcode(zipCode).setStreet(street).setLat(lat).setLng(lng) - const user = new User().setId(Number(req.params.id)) - .setFirstName(firstName) - .setLastName(lastName) - .setEmail(email) - .setPhone(phone) - .setMainaddress(address) - .setRole(role); - - userInput.setUser(user).setToken(authorization); - - } catch (e: any) { - res.json({error: e.message}); +userRoutes.put("/api/user/:id", (req: Request, res: Response) => { + const { authorization } = req.headers; + if (!authorization) { + res.json({ error: "Not authorized" }); + return; + } + const { + firstName, + lastName, + email, + phone, + country, + zipCode, + street, + lat, + lng, + role, + } = req.body; + const userInput = new UpdateUserInput(); + + try { + const address = new MainAddress() + .setCountry(country) + .setZipcode(zipCode) + .setStreet(street) + .setLat(lat) + .setLng(lng); + const user = new User() + .setId(Number(req.params.id)) + .setFirstName(firstName) + .setLastName(lastName) + .setEmail(email) + .setPhone(phone) + .setMainaddress(address) + .setRole(role); + + userInput.setUser(user).setToken(authorization); + } catch (e: any) { + res.json({ error: e.message }); + } + + userServiceClient.updateUser(userInput, (error, response) => { + if (error) { + res.status(500).send({ error: error.message }); + } else { + res.json(response.toObject()); } - - userServiceClient.updateUser(userInput, (error, response) => { - if (error) { - res.status(500).send({error: error.message}); - } else { - res.json(response.toObject()); - } - }); + }); }); -userRoutes.delete('/api/user/:id', (req: Request, res: Response) => { - const {id} = req.params; - const {authorization} = req.headers; - if (!authorization) { - res.json({error: 'Not authorized'}); - return; +userRoutes.delete("/api/user/:id", (req: Request, res: Response) => { + const { id } = req.params; + const { authorization } = req.headers; + if (!authorization) { + res.json({ error: "Not authorized" }); + return; + } + + userServiceClient.deleteUser( + new DeleteInput().setUserid(Number(id)).setToken(authorization), + (error, response) => { + if (error) { + res.status(500).send({ error: error.message }); + } else { + res.json(response.toObject()); + } } - - userServiceClient.deleteUser(new DeleteInput().setUserid(Number(id)).setToken(authorization), (error, response) => { - if (error) { - res.status(500).send({error: error.message}); - } else { - res.json(response.toObject()); - } - }); + ); }); -userRoutes.post('/api/user/login', (req: Request, res: Response) => { - const body = req.body; - const inInput = new logInInput().setEmail(body.email).setPassword(body.password); - - userServiceClient.logIn(inInput, (error, response) => { - if (error) { - res.status(500).send({error: error.message}); - } else { - res.json(response.toObject()); - } - }); -}); - -userRoutes.post('/api/user/validate', (req: Request, res: Response) => { - const {authorization} = req.headers; - if (!authorization) { - res.json({error: 'Not authorized'}); - return; +userRoutes.post("/api/user/login", (req: Request, res: Response) => { + const body = req.body; + const inInput = new logInInput() + .setEmail(body.email) + .setPassword(body.password); + + userServiceClient.logIn(inInput, (error, response) => { + if (error) { + res.status(500).send({ error: error.message }); + } else { + res.json(response.toObject()); } - const validate = new validateInput().setToken(authorization); - - userServiceClient.validate(validate, (error, response) => { - if (error) { - res.status(500).send({error: error.message}); - } else { - res.json(response.toObject()); - } - }); + }); }); -userRoutes.put('/api/user/:id/password', (req: Request, res: Response) => { - const {authorization} = req.headers; - if (!authorization) { - res.json({error: 'Not authorized'}); - return; +userRoutes.post("/api/user/validate", (req: Request, res: Response) => { + const { authorization } = req.headers; + if (!authorization) { + res.json({ error: "Not authorized" }); + return; + } + const validate = new validateInput().setToken(authorization); + + userServiceClient.validate(validate, (error, response) => { + if (error) { + res.status(500).send({ error: error.message }); + } else { + res.json(response.toObject()); } + }); +}); - const body = req.body; - const updatePasswordInput = new changePasswordInput(); - try { - updatePasswordInput - .setToken(authorization) - .setOldpassword(body.oldpassword) - .setNewpassword(body.password); - } catch (e: any) { - res.json({error: e.message}); +userRoutes.put("/api/user/:id/password", (req: Request, res: Response) => { + const { authorization } = req.headers; + if (!authorization) { + res.json({ error: "Not authorized" }); + return; + } + + const body = req.body; + const updatePasswordInput = new changePasswordInput(); + try { + updatePasswordInput + .setToken(authorization) + .setOldpassword(body.oldpassword) + .setNewpassword(body.password); + } catch (e: any) { + res.json({ error: e.message }); + } + + userServiceClient.changePassword(updatePasswordInput, (error, response) => { + if (error) { + res.status(500).send({ error: error.message }); + } else { + res.json(response.toObject()); } - - userServiceClient.changePassword(updatePasswordInput, (error, response) => { - if (error) { - res.status(500).send({error: error.message}); - } else { - res.json(response.toObject()); - } - }); + }); }); -userRoutes.put('/api/user/:id/role', (req: Request, res: Response) => { - const {authorization} = req.headers; - if (!authorization) { - res.json({error: 'Not authorized'}); - return; - } - const body = req.body; - const id = req.params.id; - const updatePasswordInput = new changeRoleInput(); - try { - updatePasswordInput - .setToken(authorization) - .setUserid(Number(id)) - .setRolecode(body.role); - } catch (e: any) { - res.json({error: e.message}); +userRoutes.put("/api/user/:id/role", (req: Request, res: Response) => { + const { authorization } = req.headers; + if (!authorization) { + res.json({ error: "Not authorized" }); + return; + } + const body = req.body; + const id = req.params.id; + const updatePasswordInput = new changeRoleInput(); + try { + updatePasswordInput + .setToken(authorization) + .setUserid(Number(id)) + .setRolecode(body.role); + } catch (e: any) { + res.json({ error: e.message }); + } + userServiceClient.changeRole(updatePasswordInput, (error, response) => { + if (error) { + res.status(500).send({ error: error.message }); + } else { + res.json(response.toObject()); } - userServiceClient.changeRole(updatePasswordInput, (error, response) => { - if (error) { - res.status(500).send({error: error.message}); - } else { - res.json(response.toObject()); - } - }); -}); \ No newline at end of file + }); +}); diff --git a/services/gateway/src/middleware/auth.ts b/services/gateway/src/middleware/auth.ts new file mode 100644 index 00000000..68ae9d35 --- /dev/null +++ b/services/gateway/src/middleware/auth.ts @@ -0,0 +1,56 @@ +import { User } from "@gateway/proto/user_pb"; +import { user_service_promises } from "@gateway/services/user.service"; + +export const ROLES = { + ADMIN: "ADMIN", + USER: "USER", + ACCOUNTANT: "ACCOUNTANT", + DELIVERER: "DELIVERER", +}; + +const checkRole = async (token: string, expectedRole: keyof typeof ROLES) => { + const userId = await user_service_promises.getUserIdFromToken(token); + if (userId === undefined) return false; + const user = await user_service_promises.getUser(userId); + if (user === undefined) return false; + return user.getRole()?.getCode() === expectedRole; +}; + +const checkRight = async (token: string, expectedId: number) => { + const userId = await user_service_promises.getUserIdFromToken(token); + if (userId === undefined) return false; + return userId === expectedId; +}; + +export const check = async ( + token: string, + expect: { + role?: keyof typeof ROLES; + id?: number; + } +) => { + const { role, id } = expect; + if (role !== undefined && id !== undefined) + return (await checkRole(token, role)) && (await checkRight(token, id)); + else if (role !== undefined) return await checkRole(token, role); + else if (id !== undefined) return await checkRight(token, id); + else return false; +}; + +import { Request, Response, NextFunction } from "express"; + +export const withCheck = + (expect: { role?: keyof typeof ROLES; id?: number }) => + async (req: Request, res: Response, next: NextFunction) => { + const { role, id } = expect; + const token = req.headers.authorization?.split("Bearer ")[0]; + if (!token) return res.status(401).json({ message: "Unauthorized" }); + + try { + const authorized = await check(token, { role, id }); + if (authorized) return next(); + else return res.status(403).json({ message: "Forbidden" }); + } catch (error) { + return res.status(500).json({ message: "Internal Server Error" }); + } + }; diff --git a/services/gateway/src/services/user.service.ts b/services/gateway/src/services/user.service.ts index 06328da1..fa2d4dba 100644 --- a/services/gateway/src/services/user.service.ts +++ b/services/gateway/src/services/user.service.ts @@ -1,16 +1,59 @@ -import {User, UserId} from "@gateway/proto/user_pb"; -import {userServiceClient} from "@gateway/services/clients/user.client"; +import { User, UserId, validateInput } from "@gateway/proto/user_pb"; +import { userServiceClient } from "@gateway/services/clients/user.client"; export const getUser = (id: number): User | undefined => { + const userId = new UserId(); + userId.setId(Number(id)); + let user: User | undefined = undefined; + userServiceClient.getUser(userId, (error, response) => { + if (error) { + throw Error(error.message); + } else { + user = response.getUser(); + } + }); + return user; +}; + +export const getUserIdFromToken = (token: string): number | undefined => { + const userToken = new validateInput(); + userToken.setToken(token); + let user: number | undefined = undefined; + userServiceClient.validate(userToken, (error, response) => { + if (error) { + throw Error(error.message); + } else { + user = response.getUserid(); + } + }); + return user; +}; + +export const user_service_promises = { + getUser: (id: number): Promise => { const userId = new UserId(); userId.setId(Number(id)); - let user: User | undefined = undefined; - userServiceClient.getUser(userId, (error, response) => { + return new Promise((resolve, reject) => { + userServiceClient.getUser(userId, (error, response) => { + if (error) { + reject(error); + } else { + resolve(response.getUser()); + } + }); + }); + }, + getUserIdFromToken: (token: string): Promise => { + const userToken = new validateInput(); + userToken.setToken(token); + return new Promise((resolve, reject) => { + userServiceClient.validate(userToken, (error, response) => { if (error) { - throw Error(error.message); + reject(error); } else { - user = response.getUser() + resolve(response.getUserid()); } + }); }); - return user; -} \ No newline at end of file + }, +}; From 4a120dcdc1af7dfabcf5fedde683b31b1f1d8ecc Mon Sep 17 00:00:00 2001 From: Florian LEROUX Date: Sun, 20 Aug 2023 18:08:23 +0200 Subject: [PATCH 442/883] Revert "feat(middleware): add auth middleware" This reverts commit 07752cbf7c5278b75028bfc86d78bdf06707c0c4. --- .../src/controller/user/user.controller.ts | 386 ++++++++---------- services/gateway/src/middleware/auth.ts | 56 --- services/gateway/src/services/user.service.ts | 59 +-- 3 files changed, 178 insertions(+), 323 deletions(-) delete mode 100644 services/gateway/src/middleware/auth.ts diff --git a/services/gateway/src/controller/user/user.controller.ts b/services/gateway/src/controller/user/user.controller.ts index fd48734b..fc7e986b 100644 --- a/services/gateway/src/controller/user/user.controller.ts +++ b/services/gateway/src/controller/user/user.controller.ts @@ -1,242 +1,196 @@ -import { Request, Response, Router } from "express"; -import { userServiceClient } from "../../services/clients/user.client"; +import {Request, Response, Router} from 'express'; +import {userServiceClient} from '../../services/clients/user.client'; import { - changePasswordInput, - changeRoleInput, - DeleteInput, - logInInput, - MainAddress, - RoleInput, - UpdateUserInput, - User, - UserCreateInput, - validateInput, + changePasswordInput, + changeRoleInput, + DeleteInput, + logInInput, + MainAddress, + RoleInput, + UpdateUserInput, + User, + UserCreateInput, + validateInput } from "@gateway/proto/user_pb"; -import { Empty } from "google-protobuf/google/protobuf/empty_pb"; -import { getUser } from "@gateway/services/user.service"; -import { check, withCheck } from "@gateway/middleware/auth"; +import {Empty} from "google-protobuf/google/protobuf/empty_pb"; +import {getUser} from "@gateway/services/user.service"; export const userRoutes = Router(); -userRoutes.get("/api/user/:id", async (req: Request, res: Response) => { - const { id } = req.params; - - // Auth check and :id check - const { authorization } = req.headers; - if (!authorization) return res.status(401).json({ message: "Unauthorized" }); - const token = authorization.split("Bearer ")[1]; - if (!(await check(token, { id: Number(id) }))) - return res.status(403).json({ message: "Forbidden" }); - - try { - res.json(getUser(Number(id))); - } catch (e: any) { - res.json({ error: e.message }); - } +userRoutes.get('/api/user/:id', (req: Request, res: Response) => { + const {id} = req.params; + try { + res.json(getUser(Number(id))); + } catch (e: any) { + res.json({error: e.message}); + } }); -userRoutes.get( - "/api/user", - withCheck({ role: "ADMIN" }), - (req: Request, res: Response) => { +userRoutes.get('/api/user', (req: Request, res: Response) => { userServiceClient.listUser(new Empty(), (error, response) => { - if (error) res.status(500).send({ error: error.message }); - else res.json(response.toObject()); + if (error) { + res.status(500).send({error: error.message}); + } else { + res.json(response.toObject()); + } }); - } -); - -userRoutes.post("/api/user", (req: Request, res: Response) => { - const { - firstName, - lastName, - email, - phone, - country, - zipCode, - street, - lat, - lng, - roleCode, - } = req.body; - const userInput = new UserCreateInput(); - try { - const address = new MainAddress() - .setCountry(country) - .setZipcode(zipCode) - .setStreet(street) - .setLat(lat) - .setLng(lng); - userInput - .setFirstName(firstName) - .setLastName(lastName) - .setEmail(email) - .setPhone(phone) - .setMainaddress(address) - .setRole(new RoleInput().setCode(roleCode)); - } catch (e: any) { - res.json({ error: e.message }); - } - - userServiceClient.register(userInput, (error, response) => { - if (error) { - res.status(500).send({ error: error.message }); - } else { - res.json(response.toObject()); - } - }); }); -userRoutes.put("/api/user/:id", (req: Request, res: Response) => { - const { authorization } = req.headers; - if (!authorization) { - res.json({ error: "Not authorized" }); - return; - } - const { - firstName, - lastName, - email, - phone, - country, - zipCode, - street, - lat, - lng, - role, - } = req.body; - const userInput = new UpdateUserInput(); - - try { - const address = new MainAddress() - .setCountry(country) - .setZipcode(zipCode) - .setStreet(street) - .setLat(lat) - .setLng(lng); - const user = new User() - .setId(Number(req.params.id)) - .setFirstName(firstName) - .setLastName(lastName) - .setEmail(email) - .setPhone(phone) - .setMainaddress(address) - .setRole(role); - - userInput.setUser(user).setToken(authorization); - } catch (e: any) { - res.json({ error: e.message }); - } - - userServiceClient.updateUser(userInput, (error, response) => { - if (error) { - res.status(500).send({ error: error.message }); - } else { - res.json(response.toObject()); +userRoutes.post('/api/user/register', (req: Request, res: Response) => { + const {firstName, lastName, email, password, phone, country, zipCode, street, lat, lng, roleCode} = req.body; + const userInput = new UserCreateInput(); + try { + const address = new MainAddress().setCountry(country).setZipcode(zipCode).setStreet(street).setLat(lat).setLng(lng) + userInput.setFirstName(firstName) + .setLastName(lastName) + .setEmail(email) + .setPassword(password) + .setPhone(phone) + .setMainaddress(address) + .setRole(new RoleInput().setCode(roleCode)); + + } catch (e: any) { + res.json({error: e.message}); } - }); + + userServiceClient.register(userInput, (error, response) => { + if (error) { + res.status(500).send({error: error.message}); + } else { + res.json(response.toObject()); + } + }); }); -userRoutes.delete("/api/user/:id", (req: Request, res: Response) => { - const { id } = req.params; - const { authorization } = req.headers; - if (!authorization) { - res.json({ error: "Not authorized" }); - return; - } - - userServiceClient.deleteUser( - new DeleteInput().setUserid(Number(id)).setToken(authorization), - (error, response) => { - if (error) { - res.status(500).send({ error: error.message }); - } else { - res.json(response.toObject()); - } +userRoutes.put('/api/user/:id', (req: Request, res: Response) => { + const {authorization} = req.headers; + if (!authorization) { + res.json({error: 'Not authorized'}); + return; + } + const {firstName, lastName, email, phone, country, zipCode, street, lat, lng, role} = req.body; + const userInput = new UpdateUserInput() + + try { + const address = new MainAddress().setCountry(country).setZipcode(zipCode).setStreet(street).setLat(lat).setLng(lng) + const user = new User().setId(Number(req.params.id)) + .setFirstName(firstName) + .setLastName(lastName) + .setEmail(email) + .setPhone(phone) + .setMainaddress(address) + .setRole(role); + + userInput.setUser(user).setToken(authorization); + + } catch (e: any) { + res.json({error: e.message}); } - ); + + userServiceClient.updateUser(userInput, (error, response) => { + if (error) { + res.status(500).send({error: error.message}); + } else { + res.json(response.toObject()); + } + }); }); -userRoutes.post("/api/user/login", (req: Request, res: Response) => { - const body = req.body; - const inInput = new logInInput() - .setEmail(body.email) - .setPassword(body.password); - - userServiceClient.logIn(inInput, (error, response) => { - if (error) { - res.status(500).send({ error: error.message }); - } else { - res.json(response.toObject()); +userRoutes.delete('/api/user/:id', (req: Request, res: Response) => { + const {id} = req.params; + const {authorization} = req.headers; + if (!authorization) { + res.json({error: 'Not authorized'}); + return; } - }); + + userServiceClient.deleteUser(new DeleteInput().setUserid(Number(id)).setToken(authorization), (error, response) => { + if (error) { + res.status(500).send({error: error.message}); + } else { + res.json(response.toObject()); + } + }); }); -userRoutes.post("/api/user/validate", (req: Request, res: Response) => { - const { authorization } = req.headers; - if (!authorization) { - res.json({ error: "Not authorized" }); - return; - } - const validate = new validateInput().setToken(authorization); - - userServiceClient.validate(validate, (error, response) => { - if (error) { - res.status(500).send({ error: error.message }); - } else { - res.json(response.toObject()); - } - }); +userRoutes.post('/api/user/login', (req: Request, res: Response) => { + const body = req.body; + const inInput = new logInInput().setEmail(body.email).setPassword(body.password); + + userServiceClient.logIn(inInput, (error, response) => { + if (error) { + res.status(500).send({error: error.message}); + } else { + res.json(response.toObject()); + } + }); }); -userRoutes.put("/api/user/:id/password", (req: Request, res: Response) => { - const { authorization } = req.headers; - if (!authorization) { - res.json({ error: "Not authorized" }); - return; - } - - const body = req.body; - const updatePasswordInput = new changePasswordInput(); - try { - updatePasswordInput - .setToken(authorization) - .setOldpassword(body.oldpassword) - .setNewpassword(body.password); - } catch (e: any) { - res.json({ error: e.message }); - } - - userServiceClient.changePassword(updatePasswordInput, (error, response) => { - if (error) { - res.status(500).send({ error: error.message }); - } else { - res.json(response.toObject()); +userRoutes.post('/api/user/validate', (req: Request, res: Response) => { + const {authorization} = req.headers; + if (!authorization) { + res.json({error: 'Not authorized'}); + return; } - }); + const validate = new validateInput().setToken(authorization); + + userServiceClient.validate(validate, (error, response) => { + if (error) { + res.status(500).send({error: error.message}); + } else { + res.json(response.toObject()); + } + }); }); -userRoutes.put("/api/user/:id/role", (req: Request, res: Response) => { - const { authorization } = req.headers; - if (!authorization) { - res.json({ error: "Not authorized" }); - return; - } - const body = req.body; - const id = req.params.id; - const updatePasswordInput = new changeRoleInput(); - try { - updatePasswordInput - .setToken(authorization) - .setUserid(Number(id)) - .setRolecode(body.role); - } catch (e: any) { - res.json({ error: e.message }); - } - userServiceClient.changeRole(updatePasswordInput, (error, response) => { - if (error) { - res.status(500).send({ error: error.message }); - } else { - res.json(response.toObject()); +userRoutes.put('/api/user/:id/password', (req: Request, res: Response) => { + const {authorization} = req.headers; + if (!authorization) { + res.json({error: 'Not authorized'}); + return; } - }); + + const body = req.body; + const updatePasswordInput = new changePasswordInput(); + try { + updatePasswordInput + .setToken(authorization) + .setOldpassword(body.oldpassword) + .setNewpassword(body.password); + } catch (e: any) { + res.json({error: e.message}); + } + + userServiceClient.changePassword(updatePasswordInput, (error, response) => { + if (error) { + res.status(500).send({error: error.message}); + } else { + res.json(response.toObject()); + } + }); }); + +userRoutes.put('/api/user/:id/role', (req: Request, res: Response) => { + const {authorization} = req.headers; + if (!authorization) { + res.json({error: 'Not authorized'}); + return; + } + const body = req.body; + const id = req.params.id; + const updatePasswordInput = new changeRoleInput(); + try { + updatePasswordInput + .setToken(authorization) + .setUserid(Number(id)) + .setRolecode(body.role); + } catch (e: any) { + res.json({error: e.message}); + } + userServiceClient.changeRole(updatePasswordInput, (error, response) => { + if (error) { + res.status(500).send({error: error.message}); + } else { + res.json(response.toObject()); + } + }); +}); \ No newline at end of file diff --git a/services/gateway/src/middleware/auth.ts b/services/gateway/src/middleware/auth.ts deleted file mode 100644 index 68ae9d35..00000000 --- a/services/gateway/src/middleware/auth.ts +++ /dev/null @@ -1,56 +0,0 @@ -import { User } from "@gateway/proto/user_pb"; -import { user_service_promises } from "@gateway/services/user.service"; - -export const ROLES = { - ADMIN: "ADMIN", - USER: "USER", - ACCOUNTANT: "ACCOUNTANT", - DELIVERER: "DELIVERER", -}; - -const checkRole = async (token: string, expectedRole: keyof typeof ROLES) => { - const userId = await user_service_promises.getUserIdFromToken(token); - if (userId === undefined) return false; - const user = await user_service_promises.getUser(userId); - if (user === undefined) return false; - return user.getRole()?.getCode() === expectedRole; -}; - -const checkRight = async (token: string, expectedId: number) => { - const userId = await user_service_promises.getUserIdFromToken(token); - if (userId === undefined) return false; - return userId === expectedId; -}; - -export const check = async ( - token: string, - expect: { - role?: keyof typeof ROLES; - id?: number; - } -) => { - const { role, id } = expect; - if (role !== undefined && id !== undefined) - return (await checkRole(token, role)) && (await checkRight(token, id)); - else if (role !== undefined) return await checkRole(token, role); - else if (id !== undefined) return await checkRight(token, id); - else return false; -}; - -import { Request, Response, NextFunction } from "express"; - -export const withCheck = - (expect: { role?: keyof typeof ROLES; id?: number }) => - async (req: Request, res: Response, next: NextFunction) => { - const { role, id } = expect; - const token = req.headers.authorization?.split("Bearer ")[0]; - if (!token) return res.status(401).json({ message: "Unauthorized" }); - - try { - const authorized = await check(token, { role, id }); - if (authorized) return next(); - else return res.status(403).json({ message: "Forbidden" }); - } catch (error) { - return res.status(500).json({ message: "Internal Server Error" }); - } - }; diff --git a/services/gateway/src/services/user.service.ts b/services/gateway/src/services/user.service.ts index fa2d4dba..06328da1 100644 --- a/services/gateway/src/services/user.service.ts +++ b/services/gateway/src/services/user.service.ts @@ -1,59 +1,16 @@ -import { User, UserId, validateInput } from "@gateway/proto/user_pb"; -import { userServiceClient } from "@gateway/services/clients/user.client"; +import {User, UserId} from "@gateway/proto/user_pb"; +import {userServiceClient} from "@gateway/services/clients/user.client"; export const getUser = (id: number): User | undefined => { - const userId = new UserId(); - userId.setId(Number(id)); - let user: User | undefined = undefined; - userServiceClient.getUser(userId, (error, response) => { - if (error) { - throw Error(error.message); - } else { - user = response.getUser(); - } - }); - return user; -}; - -export const getUserIdFromToken = (token: string): number | undefined => { - const userToken = new validateInput(); - userToken.setToken(token); - let user: number | undefined = undefined; - userServiceClient.validate(userToken, (error, response) => { - if (error) { - throw Error(error.message); - } else { - user = response.getUserid(); - } - }); - return user; -}; - -export const user_service_promises = { - getUser: (id: number): Promise => { const userId = new UserId(); userId.setId(Number(id)); - return new Promise((resolve, reject) => { - userServiceClient.getUser(userId, (error, response) => { - if (error) { - reject(error); - } else { - resolve(response.getUser()); - } - }); - }); - }, - getUserIdFromToken: (token: string): Promise => { - const userToken = new validateInput(); - userToken.setToken(token); - return new Promise((resolve, reject) => { - userServiceClient.validate(userToken, (error, response) => { + let user: User | undefined = undefined; + userServiceClient.getUser(userId, (error, response) => { if (error) { - reject(error); + throw Error(error.message); } else { - resolve(response.getUserid()); + user = response.getUser() } - }); }); - }, -}; + return user; +} \ No newline at end of file From 905b3aa29a29893d24ae683a4dd85ebc1c72ba0c Mon Sep 17 00:00:00 2001 From: anatole Date: Sun, 20 Aug 2023 18:10:42 +0200 Subject: [PATCH 443/883] feat(global): add reporting service --- services/docker-compose.yml | 33 ++++++------------- services/reporting/Dockerfile | 1 + services/reporting/Server/Database/Context.cs | 2 +- services/reporting/Server/appsettings.json | 3 +- 4 files changed, 14 insertions(+), 25 deletions(-) diff --git a/services/docker-compose.yml b/services/docker-compose.yml index e25b402f..2c1822ab 100644 --- a/services/docker-compose.yml +++ b/services/docker-compose.yml @@ -286,35 +286,19 @@ services: POSTGRES_DB: postgres PGDATA: /var/lib/postgresql/data/pgdata - # Log service + # Reporting service - log-service: - depends_on: - - log-postgres - - log-rabbitmq - restart: - always - image: floriaaan/goodfood-log:latest + reporting-service: + image: floriaaan/goodfood-reporting:latest build: context: . - dockerfile: ./log/Dockerfile - env_file: - - ./log/.env.docker + dockerfile: ./reporting/Dockerfile ports: - - "50021" + - "50020" networks: - goodfood-network - log-rabbitmq: - restart: always - image: rabbitmq:3-management - ports: - - "5672" - - "15672" - networks: - - goodfood-network - - log-postgres: + reporting-postgres: image: postgres:15.2 environment: - POSTGRES_USER=postgres @@ -322,8 +306,10 @@ services: ports: - "5432" volumes: - - goodfood-log-volume:/var/lib/postgresql/data + - goodfood-reporting-volume:/var/lib/postgresql/data networks: + - goodfood-network + # Log service log-service: @@ -374,6 +360,7 @@ volumes: goodfood-order-volume: goodfood-delivery-volume: goodfood-stock-volume: + goodfood-reporting-volume: goodfood-log-volume: networks: diff --git a/services/reporting/Dockerfile b/services/reporting/Dockerfile index 46fb43f0..5db33392 100644 --- a/services/reporting/Dockerfile +++ b/services/reporting/Dockerfile @@ -8,6 +8,7 @@ RUN dotnet restore # Copy the rest of the application files and build COPY ./reporting/Server . +COPY ./reporting/docker-entrypoint.sh . COPY ./proto ./Protos RUN dotnet build -c Release -o out diff --git a/services/reporting/Server/Database/Context.cs b/services/reporting/Server/Database/Context.cs index eaa3b3c7..da8c0a1c 100644 --- a/services/reporting/Server/Database/Context.cs +++ b/services/reporting/Server/Database/Context.cs @@ -19,6 +19,6 @@ public ReportingContext() protected override void OnConfiguring(DbContextOptionsBuilder options) { // TODO: Move to config - options.UseNpgsql("Host=localhost;Database=postgres;Username=postgres;Password=password"); + options.UseNpgsql("Host=reporting-postgres;Database=postgres;Username=postgres;Password=password"); } } \ No newline at end of file diff --git a/services/reporting/Server/appsettings.json b/services/reporting/Server/appsettings.json index 1de5e152..89e74186 100644 --- a/services/reporting/Server/appsettings.json +++ b/services/reporting/Server/appsettings.json @@ -12,6 +12,7 @@ } }, "ConnectionStrings": { - "RabbitMQ": "amqp://guest:guest@localhost:5672/" + "RabbitMQ": "amqp://guest:guest@localhost:5672/", + "Postgres": "Host=localhost;Port=5432;Database=postgres;Username=postgres;Password=postgres" } } From 936265b65a448d042bce50dcab12f316f0f6f468 Mon Sep 17 00:00:00 2001 From: Florian LEROUX Date: Sun, 20 Aug 2023 18:15:20 +0200 Subject: [PATCH 444/883] fix(git): fix git issues --- services/gateway/src/middleware/auth.ts | 56 +++++++++++++++++++ services/gateway/src/services/user.service.ts | 2 +- 2 files changed, 57 insertions(+), 1 deletion(-) create mode 100644 services/gateway/src/middleware/auth.ts diff --git a/services/gateway/src/middleware/auth.ts b/services/gateway/src/middleware/auth.ts new file mode 100644 index 00000000..f9029076 --- /dev/null +++ b/services/gateway/src/middleware/auth.ts @@ -0,0 +1,56 @@ +import { User } from "@gateway/proto/user_pb"; +import { user_service_promises } from "@gateway/services/user.service"; + +export const ROLES = { + ADMIN: "ADMIN", + USER: "USER", + ACCOUNTANT: "ACCOUNTANT", + DELIVERER: "DELIVERER", +}; + +const checkRole = async (token: string, expectedRole: keyof typeof ROLES) => { + const userId = await user_service_promises.getUserIdFromToken(token); + if (userId === undefined) return false; + const user = await user_service_promises.getUser(userId); + if (user === undefined) return false; + return user.getRole()?.getCode() === expectedRole; +}; + +const checkRight = async (token: string, expectedId: number) => { + const userId = await user_service_promises.getUserIdFromToken(token); + if (userId === undefined) return false; + return userId === expectedId; +}; + +export const check = async ( + token: string, + expect: { + role?: keyof typeof ROLES; + id?: number; + } +) => { + const { role, id } = expect; + if (role !== undefined && id !== undefined) + return (await checkRole(token, role)) && (await checkRight(token, id)); + else if (role !== undefined) return await checkRole(token, role); + else if (id !== undefined) return await checkRight(token, id); + else return false; +}; + +import { Request, Response, NextFunction } from "express"; + +export const withCheck = + (expect: { role?: keyof typeof ROLES; id?: number }) => + async (req: Request, res: Response, next: NextFunction) => { + const { role, id } = expect; + const token = req.headers.authorization?.split("Bearer ")[0]; + if (!token) return res.status(401).json({ message: "Unauthorized" }); + + try { + const authorized = await check(token, { role, id }); + if (authorized) return next(); + else return res.status(403).json({ message: "Forbidden" }); + } catch (error) { + return res.status(500).json({ message: "Internal Server Error" }); + } + }; \ No newline at end of file diff --git a/services/gateway/src/services/user.service.ts b/services/gateway/src/services/user.service.ts index 06328da1..f50e31cb 100644 --- a/services/gateway/src/services/user.service.ts +++ b/services/gateway/src/services/user.service.ts @@ -13,4 +13,4 @@ export const getUser = (id: number): User | undefined => { } }); return user; -} \ No newline at end of file +} From 14b8e428474d81df9941d2620b4dfff0dd5a761d Mon Sep 17 00:00:00 2001 From: Florian LEROUX Date: Sun, 20 Aug 2023 18:16:11 +0200 Subject: [PATCH 445/883] fix(git): fix git issues 2 --- services/gateway/src/middleware/auth.ts | 1 - services/gateway/src/services/user.service.ts | 59 ++++++++++++++++--- 2 files changed, 51 insertions(+), 9 deletions(-) diff --git a/services/gateway/src/middleware/auth.ts b/services/gateway/src/middleware/auth.ts index f9029076..221c8f89 100644 --- a/services/gateway/src/middleware/auth.ts +++ b/services/gateway/src/middleware/auth.ts @@ -1,4 +1,3 @@ -import { User } from "@gateway/proto/user_pb"; import { user_service_promises } from "@gateway/services/user.service"; export const ROLES = { diff --git a/services/gateway/src/services/user.service.ts b/services/gateway/src/services/user.service.ts index f50e31cb..fa2d4dba 100644 --- a/services/gateway/src/services/user.service.ts +++ b/services/gateway/src/services/user.service.ts @@ -1,16 +1,59 @@ -import {User, UserId} from "@gateway/proto/user_pb"; -import {userServiceClient} from "@gateway/services/clients/user.client"; +import { User, UserId, validateInput } from "@gateway/proto/user_pb"; +import { userServiceClient } from "@gateway/services/clients/user.client"; export const getUser = (id: number): User | undefined => { + const userId = new UserId(); + userId.setId(Number(id)); + let user: User | undefined = undefined; + userServiceClient.getUser(userId, (error, response) => { + if (error) { + throw Error(error.message); + } else { + user = response.getUser(); + } + }); + return user; +}; + +export const getUserIdFromToken = (token: string): number | undefined => { + const userToken = new validateInput(); + userToken.setToken(token); + let user: number | undefined = undefined; + userServiceClient.validate(userToken, (error, response) => { + if (error) { + throw Error(error.message); + } else { + user = response.getUserid(); + } + }); + return user; +}; + +export const user_service_promises = { + getUser: (id: number): Promise => { const userId = new UserId(); userId.setId(Number(id)); - let user: User | undefined = undefined; - userServiceClient.getUser(userId, (error, response) => { + return new Promise((resolve, reject) => { + userServiceClient.getUser(userId, (error, response) => { + if (error) { + reject(error); + } else { + resolve(response.getUser()); + } + }); + }); + }, + getUserIdFromToken: (token: string): Promise => { + const userToken = new validateInput(); + userToken.setToken(token); + return new Promise((resolve, reject) => { + userServiceClient.validate(userToken, (error, response) => { if (error) { - throw Error(error.message); + reject(error); } else { - user = response.getUser() + resolve(response.getUserid()); } + }); }); - return user; -} + }, +}; From 629d3805825d13f19c32261a8381f09d821e4cdb Mon Sep 17 00:00:00 2001 From: anatole Date: Mon, 21 Aug 2023 15:51:37 +0200 Subject: [PATCH 446/883] feat(gateway): add mainAddress routes in the server.ts --- .../controller/user/mainAddress.controller.ts | 6 +- .../src/lib/swagger/swagger-output.json | 262 ++++++++++++++++++ services/gateway/src/server.ts | 5 +- 3 files changed, 269 insertions(+), 4 deletions(-) diff --git a/services/gateway/src/controller/user/mainAddress.controller.ts b/services/gateway/src/controller/user/mainAddress.controller.ts index 717d297e..d7cef42f 100644 --- a/services/gateway/src/controller/user/mainAddress.controller.ts +++ b/services/gateway/src/controller/user/mainAddress.controller.ts @@ -2,9 +2,9 @@ import {Request, Response, Router} from 'express'; import {mainAddressServiceClient} from "@gateway/services/clients/user.client"; import {MainAddress, MainAddressId, MainAddressUpdateInput} from "@gateway/proto/user_pb"; -export const userRoutes = Router(); +export const mainAddressRoutes = Router(); -userRoutes.get('/api/user/main-address/:id', async (req: Request, res: Response) => { +mainAddressRoutes.get('/api/user/main-address/:id', async (req: Request, res: Response) => { const {id} = req.params; mainAddressServiceClient.getMainAddress(new MainAddressId().setId(Number(id)), (err, response) => { if (err) { @@ -14,7 +14,7 @@ userRoutes.get('/api/user/main-address/:id', async (req: Request, res: Response) }); }); -userRoutes.put('/api/user/main-address/:id', async (req: Request, res: Response) => { +mainAddressRoutes.put('/api/user/main-address/:id', async (req: Request, res: Response) => { const {authorization} = req.headers; if (!authorization) { res.json({error: 'Not authorized'}); diff --git a/services/gateway/src/lib/swagger/swagger-output.json b/services/gateway/src/lib/swagger/swagger-output.json index 850aecbe..b542c166 100644 --- a/services/gateway/src/lib/swagger/swagger-output.json +++ b/services/gateway/src/lib/swagger/swagger-output.json @@ -163,6 +163,9 @@ "email": { "example": "any" }, + "password": { + "example": "any" + }, "phone": { "example": "any" }, @@ -339,6 +342,81 @@ } } }, + "/api/user/main-address/{id}": { + "get": { + "tags": [ + "User" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + }, + "500": { + "description": "Internal Server Error" + } + } + }, + "put": { + "tags": [ + "User" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "authorization", + "in": "header", + "type": "string" + }, + { + "name": "body", + "in": "body", + "schema": { + "type": "object", + "properties": { + "country": { + "example": "any" + }, + "zipCode": { + "example": "any" + }, + "street": { + "example": "any" + }, + "lat": { + "example": "any" + }, + "lng": { + "example": "any" + } + } + } + } + ], + "responses": { + "200": { + "description": "OK" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, "/api/basket/{userId}": { "get": { "tags": [ @@ -1324,6 +1402,190 @@ } } }, + "/api/restaurant/{id}": { + "get": { + "tags": [ + "Restaurant" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + }, + "500": { + "description": "Internal Server Error" + } + } + }, + "put": { + "tags": [ + "Restaurant" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "body", + "in": "body", + "schema": { + "type": "object", + "properties": { + "name": { + "example": "any" + }, + "description": { + "example": "any" + }, + "locationList": { + "example": "any" + }, + "address": { + "example": "any" + }, + "openingHoursList": { + "example": "any" + }, + "phone": { + "example": "any" + } + } + } + } + ], + "responses": { + "200": { + "description": "OK" + }, + "500": { + "description": "Internal Server Error" + } + } + }, + "delete": { + "tags": [ + "Restaurant" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/restaurant": { + "get": { + "tags": [ + "Restaurant" + ], + "description": "", + "responses": { + "200": { + "description": "OK" + }, + "500": { + "description": "Internal Server Error" + } + } + }, + "post": { + "tags": [ + "Restaurant" + ], + "description": "", + "parameters": [ + { + "name": "body", + "in": "body", + "schema": { + "type": "object", + "properties": { + "name": { + "example": "any" + }, + "description": { + "example": "any" + }, + "locationList": { + "example": "any" + }, + "address": { + "example": "any" + }, + "openingHoursList": { + "example": "any" + }, + "phone": { + "example": "any" + } + } + } + } + ], + "responses": { + "200": { + "description": "OK" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/restaurant/by-location": { + "post": { + "tags": [ + "Restaurant" + ], + "description": "", + "parameters": [ + { + "name": "body", + "in": "body", + "schema": { + "type": "object", + "properties": { + "locationList": { + "example": "any" + } + } + } + } + ], + "responses": { + "200": { + "description": "OK" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, "/api/delivery/{id}": { "get": { "tags": [ diff --git a/services/gateway/src/server.ts b/services/gateway/src/server.ts index c1a58831..485bc057 100644 --- a/services/gateway/src/server.ts +++ b/services/gateway/src/server.ts @@ -15,7 +15,7 @@ import {log, utils} from "@gateway/lib/log/log"; import {stripeRoutes} from "@gateway/controller/payment/stripe.controller"; import {restaurantRoutes} from "@gateway/controller/restaurant/restaurant.controller"; import {paymentRoutes} from "@gateway/controller/payment/payment.controller"; - +import {mainAddressRoutes} from "@gateway/controller/user/mainAddress.controller"; import bodyParser from "body-parser"; import express from "express"; @@ -27,6 +27,9 @@ const PORT = process.env.GATEWAY_PORT || 50000; app.use('/', userRoutes // #swagger.tags = ['User'] ); +app.use('/', mainAddressRoutes +// #swagger.tags = ['User'] +); app.use('/', basketRoutes // #swagger.tags = ['Basket'] ); From e0506390004bc932fc651cc7f720a649fed88208 Mon Sep 17 00:00:00 2001 From: anatole Date: Mon, 21 Aug 2023 17:25:20 +0200 Subject: [PATCH 447/883] feat(gateway): add basket schema in the swagger --- .../controller/basket/basket.controller.ts | 43 +++++++++++- .../controller/payment/stripe.controller.ts | 10 +++ .../src/lib/swagger/swagger-output.json | 68 ++++++++++++++----- 3 files changed, 103 insertions(+), 18 deletions(-) diff --git a/services/gateway/src/controller/basket/basket.controller.ts b/services/gateway/src/controller/basket/basket.controller.ts index abdcb2e3..028a5edb 100644 --- a/services/gateway/src/controller/basket/basket.controller.ts +++ b/services/gateway/src/controller/basket/basket.controller.ts @@ -5,6 +5,14 @@ import {basketServiceClient} from "@gateway/services/clients/basket.client"; export const basketRoutes = Router(); basketRoutes.get('/api/basket/:userId', (req: Request, res: Response) => { + /* #swagger.parameters['params'] = { + in: 'params', + required: true, + schema: { + userId: 1 + } + } */ + const {userId} = req.params; basketServiceClient.getBasket(new UserId().setId(Number(userId)), (error, response) => { @@ -17,6 +25,15 @@ basketRoutes.get('/api/basket/:userId', (req: Request, res: Response) => { }); basketRoutes.post('/api/basket', (req: Request, res: Response) => { + /* #swagger.parameters['body'] = { + in: 'body', + required: true, + schema: { + userId: 0, + productId: "stringId", + restaurantId:"stringId" + } + } */ const {userId, productId, restaurantId} = req.body; const basketRequest = new ProductRequest().setUserId(userId).setProductId(productId).setRestaurantId(restaurantId); basketServiceClient.addProduct(basketRequest, (error, response) => { @@ -29,7 +46,16 @@ basketRoutes.post('/api/basket', (req: Request, res: Response) => { ); }); -basketRoutes.delete('/api/basket', (req: Request, res: Response) => { +basketRoutes.put('/api/basket/remove-product', (req: Request, res: Response) => { + /* #swagger.parameters['body'] = { + in: 'body', + required: true, + schema: { + userId: 0, + productId: "stringId", + restaurantId:"stringId" + } + } */ const {userId, productId, restaurantId} = req.body; const basketRequest = new ProductRequest().setUserId(userId).setProductId(productId).setRestaurantId(restaurantId); basketServiceClient.deleteProduct(basketRequest, (error, response) => { @@ -43,6 +69,14 @@ basketRoutes.delete('/api/basket', (req: Request, res: Response) => { }); basketRoutes.put('/api/basket/restaurant', (req: Request, res: Response) => { + /* #swagger.parameters['body'] = { + in: 'body', + required: true, + schema: { + userId: 0, + restaurantId:"stringId" + } + } */ const {restaurantId, userId} = req.body; basketServiceClient.updateRestaurant(new RestaurantRequest().setRestaurantId(restaurantId).setUserId(userId), (error, response) => { if (error) { @@ -55,6 +89,13 @@ basketRoutes.put('/api/basket/restaurant', (req: Request, res: Response) => { }); basketRoutes.post('/api/basket/reset', (req: Request, res: Response) => { + /* #swagger.parameters['body'] = { + in: 'body', + required: true, + schema: { + userId: 0, + } + } */ const {userId} = req.body; basketServiceClient.reset(new UserId().setId(userId), (error, response) => { if (error) { diff --git a/services/gateway/src/controller/payment/stripe.controller.ts b/services/gateway/src/controller/payment/stripe.controller.ts index 6efbbdf0..67760b45 100644 --- a/services/gateway/src/controller/payment/stripe.controller.ts +++ b/services/gateway/src/controller/payment/stripe.controller.ts @@ -5,6 +5,16 @@ import {stripeServiceClient} from "@gateway/services/clients/payment.client"; export const stripeRoutes = Router(); stripeRoutes.post('/api/payment/stripe', (req: Request, res: Response) => { + /* #swagger.parameters['body'] = { + in: 'body', + required: true, + schema: { + userId: "Id", + name: "John", + email: "mail", + total: 12 + } + } */ const {userId, name, email, total} = req.body; const createCheckoutSessionRequest = new CreateCheckoutSessionRequest().setUserId(userId).setName(name).setEmail(email).setTotal(total); stripeServiceClient.createCheckoutSession(createCheckoutSessionRequest, (error, response) => { diff --git a/services/gateway/src/lib/swagger/swagger-output.json b/services/gateway/src/lib/swagger/swagger-output.json index b542c166..0ebffa68 100644 --- a/services/gateway/src/lib/swagger/swagger-output.json +++ b/services/gateway/src/lib/swagger/swagger-output.json @@ -429,6 +429,20 @@ "in": "path", "required": true, "type": "string" + }, + { + "name": "params", + "in": "params", + "required": true, + "schema": { + "type": "object", + "properties": { + "userId": { + "type": "number", + "example": 1 + } + } + } } ], "responses": { @@ -451,17 +465,21 @@ { "name": "body", "in": "body", + "required": true, "schema": { "type": "object", "properties": { "userId": { - "example": "any" + "type": "number", + "example": 0 }, "productId": { - "example": "any" + "type": "string", + "example": "stringId" }, "restaurantId": { - "example": "any" + "type": "string", + "example": "stringId" } } } @@ -475,8 +493,10 @@ "description": "Internal Server Error" } } - }, - "delete": { + } + }, + "/api/basket/remove-product": { + "put": { "tags": [ "Basket" ], @@ -485,17 +505,21 @@ { "name": "body", "in": "body", + "required": true, "schema": { "type": "object", "properties": { "userId": { - "example": "any" + "type": "number", + "example": 0 }, "productId": { - "example": "any" + "type": "string", + "example": "stringId" }, "restaurantId": { - "example": "any" + "type": "string", + "example": "stringId" } } } @@ -521,14 +545,17 @@ { "name": "body", "in": "body", + "required": true, "schema": { "type": "object", "properties": { - "restaurantId": { - "example": "any" - }, "userId": { - "example": "any" + "type": "number", + "example": 0 + }, + "restaurantId": { + "type": "string", + "example": "stringId" } } } @@ -554,11 +581,13 @@ { "name": "body", "in": "body", + "required": true, "schema": { "type": "object", "properties": { "userId": { - "example": "any" + "type": "number", + "example": 0 } } } @@ -632,20 +661,25 @@ { "name": "body", "in": "body", + "required": true, "schema": { "type": "object", "properties": { "userId": { - "example": "any" + "type": "string", + "example": "Id" }, "name": { - "example": "any" + "type": "string", + "example": "John" }, "email": { - "example": "any" + "type": "string", + "example": "mail" }, "total": { - "example": "any" + "type": "number", + "example": 12 } } } From 750157226802efb41b214e39ad60d026858451c1 Mon Sep 17 00:00:00 2001 From: anatole Date: Mon, 21 Aug 2023 18:33:26 +0200 Subject: [PATCH 448/883] feat(gateway): add delivery schema in the swagger --- .../controller/basket/basket.controller.ts | 1 - .../delivery/delivery.controller.ts | 50 +++++++++++++---- .../src/lib/swagger/swagger-output.json | 53 ++++++++++++++----- .../gateway/src/lib/swagger/swagger.utils.js | 12 ++++- 4 files changed, 91 insertions(+), 25 deletions(-) diff --git a/services/gateway/src/controller/basket/basket.controller.ts b/services/gateway/src/controller/basket/basket.controller.ts index 028a5edb..b4620aee 100644 --- a/services/gateway/src/controller/basket/basket.controller.ts +++ b/services/gateway/src/controller/basket/basket.controller.ts @@ -12,7 +12,6 @@ basketRoutes.get('/api/basket/:userId', (req: Request, res: Response) => { userId: 1 } } */ - const {userId} = req.params; basketServiceClient.getBasket(new UserId().setId(Number(userId)), (error, response) => { diff --git a/services/gateway/src/controller/delivery/delivery.controller.ts b/services/gateway/src/controller/delivery/delivery.controller.ts index 120857c4..6d54326f 100644 --- a/services/gateway/src/controller/delivery/delivery.controller.ts +++ b/services/gateway/src/controller/delivery/delivery.controller.ts @@ -43,23 +43,33 @@ deliveryRoutes.get('/api/delivery/by-user/:id', (req: Request, res: Response) => }); deliveryRoutes.post('/api/delivery', (req: Request, res: Response) => { - const {eta, address, status, deliveryPersonId, userId, restaurantId}: { - eta: string, - address: string, - status: Status, - deliveryPersonId: string, - userId: string, - restaurantId: string - } = req.body; + /* #swagger.parameters['body'] = { + in: 'body', + required: true, + schema: { + eta: "2022-01-01T00:00:00.000Z", + address: "10 Rue de la République, 75003 Paris, France", + status: {'$ref': '#/definitions/Status'}, + deliveryPersonId: "cllcdmeci0000pm01su98mxtb", + userId: "user_id:1", + restaurantId: "restaurant_id:1" + } + } + */ + const {eta, address, status, deliveryPersonId, userId, restaurantId} = req.body; + const deliveryStatus = Status[status] as unknown as Status; + if (!deliveryStatus) { + res.status(400).send({error: "Status not found"}); + return; + } const deliveryCreateInput = new DeliveryCreateInput().setEta(eta) .setAddress(address) - .setStatus(status) + .setStatus(deliveryStatus) .setDeliveryPersonId(deliveryPersonId) .setUserId(userId) .setRestaurantId(restaurantId); deliveryServiceClient.createDelivery(deliveryCreateInput, (error, response) => { - console.log(error, response) if (error) { res.status(500).send({error: error.message}); } else { @@ -69,11 +79,29 @@ deliveryRoutes.post('/api/delivery', (req: Request, res: Response) => { }); deliveryRoutes.put('/api/delivery/:id', (req: Request, res: Response) => { + /* #swagger.parameters['body'] = { + in: 'body', + required: true, + schema: { + eta: "2022-01-01T00:00:00.000Z", + address: "10 Rue de la République, 75003 Paris, France", + status: {'$ref': '#/definitions/Status'}, + deliveryPersonId: "cllcdmeci0000pm01su98mxtb", + userId: "user_id:1", + restaurantId: "restaurant_id:1" + } + } + */ const {id} = req.params; const {eta, address, status, deliveryPersonId, userId, restaurantId} = req.body; + const deliveryStatus = Status[status] as unknown as Status; + if (!deliveryStatus) { + res.status(400).send({error: "Status not found"}); + return; + } const delivery = new Delivery().setId(id).setEta(eta) .setAddress(address) - .setStatus(status) + .setStatus(deliveryStatus) .setDeliveryPersonId(deliveryPersonId) .setUserId(userId) .setRestaurantId(restaurantId); diff --git a/services/gateway/src/lib/swagger/swagger-output.json b/services/gateway/src/lib/swagger/swagger-output.json index 0ebffa68..80ffd0ff 100644 --- a/services/gateway/src/lib/swagger/swagger-output.json +++ b/services/gateway/src/lib/swagger/swagger-output.json @@ -1658,26 +1658,32 @@ { "name": "body", "in": "body", + "required": true, "schema": { "type": "object", "properties": { "eta": { - "example": "any" + "type": "string", + "example": "2022-01-01T00:00:00.000Z" }, "address": { - "example": "any" + "type": "string", + "example": "10 Rue de la République, 75003 Paris, France" }, "status": { - "example": "any" + "$ref": "#/definitions/Status" }, "deliveryPersonId": { - "example": "any" + "type": "string", + "example": "cllcdmeci0000pm01su98mxtb" }, "userId": { - "example": "any" + "type": "string", + "example": "user_id:1" }, "restaurantId": { - "example": "any" + "type": "string", + "example": "restaurant_id:1" } } } @@ -1687,6 +1693,9 @@ "200": { "description": "OK" }, + "400": { + "description": "Bad Request" + }, "500": { "description": "Internal Server Error" } @@ -1773,26 +1782,32 @@ { "name": "body", "in": "body", + "required": true, "schema": { "type": "object", "properties": { "eta": { - "example": "any" + "type": "string", + "example": "2022-01-01T00:00:00.000Z" }, "address": { - "example": "any" + "type": "string", + "example": "10 Rue de la République, 75003 Paris, France" }, "status": { - "example": "any" + "$ref": "#/definitions/Status" }, "deliveryPersonId": { - "example": "any" + "type": "string", + "example": "cllcdmeci0000pm01su98mxtb" }, "userId": { - "example": "any" + "type": "string", + "example": "user_id:1" }, "restaurantId": { - "example": "any" + "type": "string", + "example": "restaurant_id:1" } } } @@ -1802,6 +1817,9 @@ "200": { "description": "OK" }, + "400": { + "description": "Bad Request" + }, "500": { "description": "Internal Server Error" } @@ -2908,5 +2926,16 @@ } } } + }, + "definitions": { + "Status": { + "type": "string", + "enum": [ + "PENDING", + "IN_PROGRESS", + "FULFILLED", + "REJECTED" + ] + } } } \ No newline at end of file diff --git a/services/gateway/src/lib/swagger/swagger.utils.js b/services/gateway/src/lib/swagger/swagger.utils.js index f1f701c7..a8371b8f 100644 --- a/services/gateway/src/lib/swagger/swagger.utils.js +++ b/services/gateway/src/lib/swagger/swagger.utils.js @@ -5,7 +5,17 @@ const doc = { title: 'The Gateway API', description: 'The Gateway API for the Microservices', }, - host: `localhost:${process.env.GATEWAY_PORT || 50000}` + host: `localhost:${process.env.GATEWAY_PORT || 50000}`, + definitions: { + Status: { + '@enum': [ + "PENDING", + "IN_PROGRESS", + "FULFILLED", + "REJECTED" + ] + } + } }; const outputFile = './swagger-output.json'; From de301f80582e687c20607d91eefcf9ecca070968 Mon Sep 17 00:00:00 2001 From: anatole Date: Mon, 21 Aug 2023 18:36:13 +0200 Subject: [PATCH 449/883] feat(gateway): remove useless basket schema in the swagger --- .../controller/basket/basket.controller.ts | 7 ----- .../src/lib/swagger/swagger-output.json | 26 +++++-------------- services/gateway/src/server.ts | 4 +-- 3 files changed, 8 insertions(+), 29 deletions(-) diff --git a/services/gateway/src/controller/basket/basket.controller.ts b/services/gateway/src/controller/basket/basket.controller.ts index b4620aee..1567cae4 100644 --- a/services/gateway/src/controller/basket/basket.controller.ts +++ b/services/gateway/src/controller/basket/basket.controller.ts @@ -5,13 +5,6 @@ import {basketServiceClient} from "@gateway/services/clients/basket.client"; export const basketRoutes = Router(); basketRoutes.get('/api/basket/:userId', (req: Request, res: Response) => { - /* #swagger.parameters['params'] = { - in: 'params', - required: true, - schema: { - userId: 1 - } - } */ const {userId} = req.params; basketServiceClient.getBasket(new UserId().setId(Number(userId)), (error, response) => { diff --git a/services/gateway/src/lib/swagger/swagger-output.json b/services/gateway/src/lib/swagger/swagger-output.json index 80ffd0ff..3481db02 100644 --- a/services/gateway/src/lib/swagger/swagger-output.json +++ b/services/gateway/src/lib/swagger/swagger-output.json @@ -429,20 +429,6 @@ "in": "path", "required": true, "type": "string" - }, - { - "name": "params", - "in": "params", - "required": true, - "schema": { - "type": "object", - "properties": { - "userId": { - "type": "number", - "example": 1 - } - } - } } ], "responses": { @@ -1829,7 +1815,7 @@ "/api/delivery-person/{id}": { "get": { "tags": [ - "DeliveryPerson" + "Delivery" ], "description": "", "parameters": [ @@ -1851,7 +1837,7 @@ }, "put": { "tags": [ - "DeliveryPerson" + "Delivery" ], "description": "", "parameters": [ @@ -1894,7 +1880,7 @@ }, "delete": { "tags": [ - "DeliveryPerson" + "Delivery" ], "description": "", "parameters": [ @@ -1918,7 +1904,7 @@ "/api/delivery-person": { "get": { "tags": [ - "DeliveryPerson" + "Delivery" ], "description": "", "responses": { @@ -1932,7 +1918,7 @@ }, "post": { "tags": [ - "DeliveryPerson" + "Delivery" ], "description": "", "parameters": [ @@ -2890,7 +2876,7 @@ "/api/stock/outcomes/by-restaurant/{id}": { "post": { "tags": [ - "StockPerson" + "Stock" ], "description": "", "parameters": [ diff --git a/services/gateway/src/server.ts b/services/gateway/src/server.ts index 485bc057..b68674c1 100644 --- a/services/gateway/src/server.ts +++ b/services/gateway/src/server.ts @@ -58,7 +58,7 @@ app.use('/', deliveryRoutes // #swagger.tags = ['Delivery'] ); app.use('/', deliveryPersonRoutes -// #swagger.tags = ['DeliveryPerson'] +// #swagger.tags = ['Delivery'] ); app.use('/', logRoutes // #swagger.tags = ['Log'] @@ -73,7 +73,7 @@ app.use('/', stockRoutes // #swagger.tags = ['Stock'] ); app.use('/', stockPersonRoutes -// #swagger.tags = ['StockPerson'] +// #swagger.tags = ['Stock'] ); app.listen(PORT, () => { From 6338ded8dcdbaf370fb5ccd880d4767c90f63303 Mon Sep 17 00:00:00 2001 From: anatole Date: Mon, 21 Aug 2023 18:55:29 +0200 Subject: [PATCH 450/883] feat(gateway): add type on basket route param --- .../controller/basket/basket.controller.ts | 6 +- .../src/lib/swagger/swagger-output.json | 99 ++++++++++++++++++- 2 files changed, 99 insertions(+), 6 deletions(-) diff --git a/services/gateway/src/controller/basket/basket.controller.ts b/services/gateway/src/controller/basket/basket.controller.ts index 1567cae4..02354b8b 100644 --- a/services/gateway/src/controller/basket/basket.controller.ts +++ b/services/gateway/src/controller/basket/basket.controller.ts @@ -5,8 +5,12 @@ import {basketServiceClient} from "@gateway/services/clients/basket.client"; export const basketRoutes = Router(); basketRoutes.get('/api/basket/:userId', (req: Request, res: Response) => { + /* #swagger.parameters['userId'] = { + in: 'path', + required: true, + type: 'integer' + }*/ const {userId} = req.params; - basketServiceClient.getBasket(new UserId().setId(Number(userId)), (error, response) => { if (error) { res.status(500).send({error: error.message}); diff --git a/services/gateway/src/lib/swagger/swagger-output.json b/services/gateway/src/lib/swagger/swagger-output.json index 3481db02..9232a535 100644 --- a/services/gateway/src/lib/swagger/swagger-output.json +++ b/services/gateway/src/lib/swagger/swagger-output.json @@ -428,7 +428,7 @@ "name": "userId", "in": "path", "required": true, - "type": "string" + "type": "integer" } ], "responses": { @@ -2018,6 +2018,90 @@ } } }, + "/api/metric/by-restaurant-and-date": { + "post": { + "tags": [ + "Metric" + ], + "description": "", + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "type": "object", + "properties": { + "restaurantId": { + "type": "string", + "example": "restaurant_id:1" + }, + "date": { + "type": "string", + "example": "2022-01-01T00:00:00.000Z" + } + } + } + } + ], + "responses": { + "200": { + "description": "OK" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/metric/by-restaurant/{restaurantId}": { + "get": { + "tags": [ + "Metric" + ], + "description": "", + "parameters": [ + { + "name": "restaurantId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/metric/by-restaurant-group/{restaurantGroupId}": { + "get": { + "tags": [ + "Metric" + ], + "description": "", + "parameters": [ + { + "name": "restaurantGroupId", + "in": "path", + "required": true, + "type": "integer" + } + ], + "responses": { + "200": { + "description": "OK" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, "/api/metric": { "post": { "tags": [ @@ -2028,20 +2112,25 @@ { "name": "body", "in": "body", + "required": true, "schema": { "type": "object", "properties": { "restaurantId": { - "example": "any" + "type": "string", + "example": "restaurant_id:1" }, "code": { - "example": "any" + "type": "string", + "example": "income_1h" }, "value": { - "example": "any" + "type": "string", + "example": "99.99" }, "key": { - "example": "any" + "type": "string", + "example": "example_key" } } } From 2059eafd70ea2022cec8d8877e2ef580d48d3254 Mon Sep 17 00:00:00 2001 From: anatole Date: Mon, 21 Aug 2023 19:34:21 +0200 Subject: [PATCH 451/883] feat(gateway): finish metric controller --- .../controller/metric/metric.controller.ts | 241 ++++++++++++++++- .../src/lib/swagger/swagger-output.json | 252 ++++++++++++++++++ 2 files changed, 492 insertions(+), 1 deletion(-) diff --git a/services/gateway/src/controller/metric/metric.controller.ts b/services/gateway/src/controller/metric/metric.controller.ts index 186f9482..1020cc88 100644 --- a/services/gateway/src/controller/metric/metric.controller.ts +++ b/services/gateway/src/controller/metric/metric.controller.ts @@ -1,6 +1,20 @@ import metricService from '../../services/clients/metric.client'; import {Router} from "express"; -import {GetMetricRequest, Metric} from "@gateway/proto/metric_pb"; +import { + CreateRestaurantGroupRequest, + CreateRestaurantRequest, + DeleteRestaurantGroupRequest, + DeleteRestaurantRequest, + GetMetricRequest, + GetMetricsByRestaurantAndDateRequest, + GetMetricsByRestaurantGroupRequest, + GetMetricsByRestaurantRequest, + GetRestaurantGroupRequest, + GetRestaurantRequest, + Metric, + UpdateRestaurantGroupRequest, + UpdateRestaurantRequest +} from "@gateway/proto/metric_pb"; export const metricRoutes = Router(); @@ -16,8 +30,233 @@ metricRoutes.get('/api/metric/:key', (req, res) => { }); }); +metricRoutes.post('/api/metric/by-restaurant-and-date', (req, res) => { + /* #swagger.parameters['body'] = { + in: 'body', + required: true, + schema: { + restaurantId: "restaurant_id:1", + date: "2022-01-01T00:00:00.000Z", + } + }*/ + const {restaurantId, date} = req.body; + const getMetricsByRestaurantAndDateRequest = new GetMetricsByRestaurantAndDateRequest().setRestaurantId(restaurantId).setDate(date); + metricService.getMetricsByRestaurantAndDate(getMetricsByRestaurantAndDateRequest, (error, response) => { + if (error) { + res.status(500).send({error: error.message}); + } else { + res.json(response.toObject()); + } + }); +}); + +metricRoutes.get('/api/metric/by-restaurant/:restaurantId', (req, res) => { + const {restaurantId} = req.params; + const getMetricsByRestaurantRequest = new GetMetricsByRestaurantRequest().setRestaurantId(restaurantId); + metricService.getMetricsByRestaurant(getMetricsByRestaurantRequest, (error, response) => { + if (error) { + res.status(500).send({error: error.message}); + } else { + res.json(response.toObject()); + } + }); +}); + +metricRoutes.get('/api/metric/by-restaurant-group/:restaurantGroupId', (req, res) => { + /* #swagger.parameters['restaurantGroupId'] = { + in: 'path', + required: true, + type: 'integer' + }*/ + const {restaurantGroupId} = req.params; + const getMetricsByRestaurantGroupRequest = new GetMetricsByRestaurantGroupRequest().setRestaurantGroupId(Number(restaurantGroupId)); + metricService.getMetricsByRestaurantGroup(getMetricsByRestaurantGroupRequest, (error, response) => { + if (error) { + res.status(500).send({error: error.message}); + } else { + res.json(response.toObject()); + } + }); +}); + +metricRoutes.get('/api/metric/restaurant/:restaurantId', (req, res) => { + const {restaurantId} = req.params; + const getRestaurantRequest = new GetRestaurantRequest().setId(restaurantId); + metricService.getRestaurant(getRestaurantRequest, (error, response) => { + if (error) { + res.status(500).send({error: error.message}); + } else { + res.json(response.toObject()); + } + }); +}); + +metricRoutes.get('/api/metric/restaurant-group/:restaurantGroupId', (req, res) => { + /* #swagger.parameters['restaurantGroupId'] = { + in: 'path', + required: true, + type: 'integer' + }*/ + const {restaurantGroupId} = req.params; + const getRestaurantGroupRequest = new GetRestaurantGroupRequest().setId(Number(restaurantGroupId)); + metricService.getRestaurantGroup(getRestaurantGroupRequest, (error, response) => { + if (error) { + res.status(500).send({error: error.message}); + } else { + res.json(response.toObject()); + } + }); +}); + +metricRoutes.post('/api/metric/restaurant', (req, res) => { + /* #swagger.parameters['body'] = { + in: 'body', + required: true, + schema: { + "name": "example_name", + "key": "example_key", + "address": "example_address", + "group_id": 1 + } + } */ + const {name, key, address, groupId} = req.body; + const createRestaurantRequest = new CreateRestaurantRequest() + .setName(name) + .setKey(key) + .setAddress(address) + .setGroupId(groupId); + + metricService.createRestaurant(createRestaurantRequest, (error, response) => { + if (error) { + res.status(500).send({error: error.message}); + } else { + res.json(response.toObject()); + } + }); +}); + +metricRoutes.post('/api/metric/restaurant-group', (req, res) => { + /* #swagger.parameters['body'] = { + in: 'body', + required: true, + schema: { + "name": "example_name", + } + } */ + const {name} = req.body; + const createRestaurantGroupRequest = new CreateRestaurantGroupRequest() + .setName(name); + + metricService.createRestaurantGroup(createRestaurantGroupRequest, (error, response) => { + if (error) { + res.status(500).send({error: error.message}); + } else { + res.json(response.toObject()); + } + }); +}); + +metricRoutes.put('/api/metric/restaurant/:restaurantId', (req, res) => { + /* #swagger.parameters['body'] = { + in: 'body', + required: true, + schema: { + "name": "example_name", + "key": "example_key", + "address": "example_address", + "group_id": 1 + } + } */ + const {restaurantId} = req.params; + const {name, key, address, groupId} = req.body; + const updateRestaurantRequest = new UpdateRestaurantRequest().setId(restaurantId) + .setName(name) + .setKey(key) + .setAddress(address) + .setGroupId(groupId); + + + metricService.updateRestaurant(updateRestaurantRequest, (error, response) => { + if (error) { + res.status(500).send({error: error.message}); + } else { + res.json(response.toObject()); + } + }); +}); + +metricRoutes.put('/api/metric/restaurant-group/:restaurantGroupId', (req, res) => { + /* #swagger.parameters['restaurantGroupId'] = { + in: 'path', + required: true, + type: 'integer' + } + #swagger.parameters['body'] = { + in: 'body', + required: true, + schema: { + "name": "example_name", + } + } */ + const {restaurantGroupId} = req.params; + const {name} = req.body; + const updateRestaurantGroupRequest = new UpdateRestaurantGroupRequest().setId(Number(restaurantGroupId)) + .setName(name); + + metricService.updateRestaurantGroup(updateRestaurantGroupRequest, (error, response) => { + if (error) { + res.status(500).send({error: error.message}); + } else { + res.json(response.toObject()); + } + }); +}); + +metricRoutes.delete('/api/metric/restaurant/:restaurantId', (req, res) => { + const {restaurantId} = req.params; + const deleteRestaurantRequest = new DeleteRestaurantRequest() + .setId(restaurantId); + + metricService.deleteRestaurant(deleteRestaurantRequest, (error, response) => { + if (error) { + res.status(500).send({error: error.message}); + } else { + res.json(response.toObject()); + } + }); +}); + +metricRoutes.delete('/api/metric/restaurant-group/:restaurantGroupId', (req, res) => { + /* #swagger.parameters['restaurantGroupId'] = { + in: 'path', + required: true, + type: 'integer' + }*/ + const {restaurantGroupId} = req.params; + const deleteRestaurantGroupRequest = new DeleteRestaurantGroupRequest() + .setId(Number(restaurantGroupId)); + + metricService.deleteRestaurantGroup(deleteRestaurantGroupRequest, (error, response) => { + if (error) { + res.status(500).send({error: error.message}); + } else { + res.json(response.toObject()); + } + }); +}); + metricRoutes.post('/api/metric', (req, res) => { + /* #swagger.parameters['body'] = { + in: 'body', + required: true, + schema: { + restaurantId: "restaurant_id:1", + code: "income_1h", + value: "99.99", + key :"example_key" + } + }*/ const {restaurantId, code, value, key} = req.body const newMetric = new Metric().setKey(key).setRestaurantId(restaurantId).setCode(code).setValue(value) diff --git a/services/gateway/src/lib/swagger/swagger-output.json b/services/gateway/src/lib/swagger/swagger-output.json index 9232a535..cfb56579 100644 --- a/services/gateway/src/lib/swagger/swagger-output.json +++ b/services/gateway/src/lib/swagger/swagger-output.json @@ -2102,6 +2102,258 @@ } } }, + "/api/metric/restaurant/{restaurantId}": { + "get": { + "tags": [ + "Metric" + ], + "description": "", + "parameters": [ + { + "name": "restaurantId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + }, + "500": { + "description": "Internal Server Error" + } + } + }, + "put": { + "tags": [ + "Metric" + ], + "description": "", + "parameters": [ + { + "name": "restaurantId", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "type": "object", + "properties": { + "name": { + "type": "string", + "example": "example_name" + }, + "key": { + "type": "string", + "example": "example_key" + }, + "address": { + "type": "string", + "example": "example_address" + }, + "group_id": { + "type": "number", + "example": 1 + } + } + } + } + ], + "responses": { + "200": { + "description": "OK" + }, + "500": { + "description": "Internal Server Error" + } + } + }, + "delete": { + "tags": [ + "Metric" + ], + "description": "", + "parameters": [ + { + "name": "restaurantId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/metric/restaurant-group/{restaurantGroupId}": { + "get": { + "tags": [ + "Metric" + ], + "description": "", + "parameters": [ + { + "name": "restaurantGroupId", + "in": "path", + "required": true, + "type": "integer" + } + ], + "responses": { + "200": { + "description": "OK" + }, + "500": { + "description": "Internal Server Error" + } + } + }, + "put": { + "tags": [ + "Metric" + ], + "description": "", + "parameters": [ + { + "name": "restaurantGroupId", + "in": "path", + "required": true, + "type": "integer" + }, + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "type": "object", + "properties": { + "name": { + "type": "string", + "example": "example_name" + } + } + } + } + ], + "responses": { + "200": { + "description": "OK" + }, + "500": { + "description": "Internal Server Error" + } + } + }, + "delete": { + "tags": [ + "Metric" + ], + "description": "", + "parameters": [ + { + "name": "restaurantGroupId", + "in": "path", + "required": true, + "type": "integer" + } + ], + "responses": { + "200": { + "description": "OK" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/metric/restaurant": { + "post": { + "tags": [ + "Metric" + ], + "description": "", + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "type": "object", + "properties": { + "name": { + "type": "string", + "example": "example_name" + }, + "key": { + "type": "string", + "example": "example_key" + }, + "address": { + "type": "string", + "example": "example_address" + }, + "group_id": { + "type": "number", + "example": 1 + } + } + } + } + ], + "responses": { + "200": { + "description": "OK" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/metric/restaurant-group": { + "post": { + "tags": [ + "Metric" + ], + "description": "", + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "type": "object", + "properties": { + "name": { + "type": "string", + "example": "example_name" + } + } + } + } + ], + "responses": { + "200": { + "description": "OK" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, "/api/metric": { "post": { "tags": [ From 9b8d7dc0c067dcfba7a9a8a8f5f11e34017e60aa Mon Sep 17 00:00:00 2001 From: anatole Date: Tue, 22 Aug 2023 18:11:37 +0200 Subject: [PATCH 452/883] feat(gateway): add order schema in the swagger --- .../src/controller/order/order.controller.ts | 66 +++++++++++++++---- .../src/lib/swagger/swagger-output.json | 44 +++++++++---- .../gateway/src/lib/swagger/swagger.utils.js | 6 ++ .../gateway/src/services/basket.service.ts | 16 +++++ 4 files changed, 107 insertions(+), 25 deletions(-) create mode 100644 services/gateway/src/services/basket.service.ts diff --git a/services/gateway/src/controller/order/order.controller.ts b/services/gateway/src/controller/order/order.controller.ts index 992f587f..5ba0049b 100644 --- a/services/gateway/src/controller/order/order.controller.ts +++ b/services/gateway/src/controller/order/order.controller.ts @@ -1,6 +1,7 @@ import orderService from '../../services/clients/order.client'; import {Request, Response, Router} from "express"; import { + Basket as BasketSnapshot, CreateOrderRequest, DeleteOrderRequest, GetOrderByDeliveryRequest, @@ -13,6 +14,7 @@ import { } from "@gateway/proto/order_pb"; import {getUser} from "@gateway/services/user.service"; import {User} from "@gateway/proto/user_pb"; +import {getBasketByUser} from "@gateway/services/basket.service"; export const orderRoutes = Router(); @@ -30,17 +32,29 @@ orderRoutes.get('/api/order/:id', (req: Request, res: Response) => { }); }); +//TODO: to test this route with the user and basket service orderRoutes.post('/api/order', (req: Request, res: Response) => { - const body = req.body; + /* #swagger.parameters['body'] = { + in: 'body', + required: true, + schema: { + userId: 0, + paymentId: "payment_id:1", + deliveryId: "delivery_id:1", + deliveryType :{'$ref': '#/definitions/DeliveryType'}, + restaurantId :"restaurant_id:1" + } + }*/ + const {userId, paymentId, deliveryId, deliveryType, restaurantId} = req.body; let user: User | undefined = undefined; try { - user = getUser(Number(req.body.userId)); + user = getUser(Number(userId)); } catch (e: any) { - res.json({error: e.message}); + res.status(500).send({error: e.message}); } if (!user) { - res.json({error: "User not found"}); + res.status(404).send({error: "User not found"}); return; } @@ -50,13 +64,21 @@ orderRoutes.post('/api/order', (req: Request, res: Response) => { .setLastName(user.getLastName()) .setPhone(user.getPhone()); + let orderBasket: BasketSnapshot | undefined = undefined; + try { + const basket = getBasketByUser(userId); + if (basket !== undefined) orderBasket = new BasketSnapshot().setString(basket.toString()); + } catch (e: any) { + res.status(500).send({error: e.message}); + } + let orderInput = new CreateOrderRequest() .setUser(miniUser) - .setPaymentId(body.paymentId) - .setDeliveryId(body.deliveryId) - .setDeliveryType(body.deliveryType) - .setBasketSnapshot(body.basketSnapshot) - .setRestaurantId(body.restaurantId); + .setPaymentId(paymentId) + .setDeliveryId(deliveryId) + .setDeliveryType(deliveryType) + .setBasketSnapshot(orderBasket) + .setRestaurantId(restaurantId); orderService.createOrder(orderInput, (error, response) => { if (error) { @@ -80,6 +102,13 @@ orderRoutes.get('/api/order/by-user/:userId', (req: Request, res: Response) => { }); orderRoutes.post('/api/order/by-status', (req: Request, res: Response) => { + /* #swagger.parameters['body'] = { + in: 'body', + required: true, + schema: { + status :{'$ref': '#/definitions/Status'}, + } + }*/ const orderInput = new GetOrdersByStatusRequest().setStatus(req.body.status); orderService.getOrdersByStatus(orderInput, (error, response) => { @@ -116,13 +145,24 @@ orderRoutes.get('/api/order/by-payment/:paymentId', (req: Request, res: Response }); orderRoutes.put('/api/order/:orderId', (req: Request, res: Response) => { + /* #swagger.parameters['body'] = { + in: 'body', + required: true, + schema: { + status :{'$ref': '#/definitions/Status'}, + deliveryId: "delivery_id:1", + paymentId: "payment_id:1", + restaurantId :"restaurant_id:1" + } + }*/ const {orderId} = req.params; + const {status, deliveryId, paymentId, restaurantId} = req.body; const orderInput = new UpdateOrderRequest() .setId(orderId) - .setStatus(req.body.status) - .setDeliveryId(req.body.deliveryId) - .setPaymentId(req.body.paymentId) - .setRestaurantId(req.body.restaurantId); + .setStatus(status) + .setDeliveryId(deliveryId) + .setPaymentId(paymentId) + .setRestaurantId(restaurantId); orderService.updateOrder(orderInput, (error, response) => { if (error) { res.status(500).send({error: error.message}); diff --git a/services/gateway/src/lib/swagger/swagger-output.json b/services/gateway/src/lib/swagger/swagger-output.json index cfb56579..0f0a8969 100644 --- a/services/gateway/src/lib/swagger/swagger-output.json +++ b/services/gateway/src/lib/swagger/swagger-output.json @@ -715,23 +715,28 @@ { "name": "body", "in": "body", + "required": true, "schema": { "type": "object", "properties": { + "userId": { + "type": "number", + "example": 0 + }, "paymentId": { - "example": "any" + "type": "string", + "example": "payment_id:1" }, "deliveryId": { - "example": "any" + "type": "string", + "example": "delivery_id:1" }, "deliveryType": { - "example": "any" - }, - "basketSnapshot": { - "example": "any" + "$ref": "#/definitions/DeliveryType" }, "restaurantId": { - "example": "any" + "type": "string", + "example": "restaurant_id:1" } } } @@ -741,6 +746,9 @@ "200": { "description": "OK" }, + "404": { + "description": "Not Found" + }, "500": { "description": "Internal Server Error" } @@ -781,11 +789,12 @@ { "name": "body", "in": "body", + "required": true, "schema": { "type": "object", "properties": { "status": { - "example": "any" + "$ref": "#/definitions/Status" } } } @@ -865,20 +874,24 @@ { "name": "body", "in": "body", + "required": true, "schema": { "type": "object", "properties": { "status": { - "example": "any" + "$ref": "#/definitions/Status" }, "deliveryId": { - "example": "any" + "type": "string", + "example": "delivery_id:1" }, "paymentId": { - "example": "any" + "type": "string", + "example": "payment_id:1" }, "restaurantId": { - "example": "any" + "type": "string", + "example": "restaurant_id:1" } } } @@ -3263,6 +3276,13 @@ "FULFILLED", "REJECTED" ] + }, + "DeliveryType": { + "type": "string", + "enum": [ + "TAKEAWAY", + "DELIVERY" + ] } } } \ No newline at end of file diff --git a/services/gateway/src/lib/swagger/swagger.utils.js b/services/gateway/src/lib/swagger/swagger.utils.js index a8371b8f..8c567e02 100644 --- a/services/gateway/src/lib/swagger/swagger.utils.js +++ b/services/gateway/src/lib/swagger/swagger.utils.js @@ -14,6 +14,12 @@ const doc = { "FULFILLED", "REJECTED" ] + }, + DeliveryType: { + '@enum': [ + "TAKEAWAY", + "DELIVERY" + ] } } }; diff --git a/services/gateway/src/services/basket.service.ts b/services/gateway/src/services/basket.service.ts new file mode 100644 index 00000000..fbe3a3d4 --- /dev/null +++ b/services/gateway/src/services/basket.service.ts @@ -0,0 +1,16 @@ +import {basketServiceClient} from "@gateway/services/clients/basket.client"; +import {Basket, UserId} from "@gateway/proto/basket_pb"; + +export const getBasketByUser = (id: string): Basket | undefined => { + const userId = new UserId(); + userId.setId(Number(id)); + let basket: Basket | undefined = undefined; + basketServiceClient.getBasket(userId, (error, response) => { + if (error) { + throw Error(error.message); + } else { + basket = response + } + }); + return basket; +} \ No newline at end of file From 15a9fb20aa820672ca0d2c355ab824baeb2d0e49 Mon Sep 17 00:00:00 2001 From: anatole Date: Tue, 22 Aug 2023 18:52:59 +0200 Subject: [PATCH 453/883] feat(gateway): add product schema in the swagger --- .../controller/product/allergen.controller.ts | 14 +++++ .../controller/product/category.controller.ts | 18 ++++++ .../controller/product/product.controller.ts | 58 ++++++++++++++++++- 3 files changed, 88 insertions(+), 2 deletions(-) diff --git a/services/gateway/src/controller/product/allergen.controller.ts b/services/gateway/src/controller/product/allergen.controller.ts index 6a892df9..1ba77335 100644 --- a/services/gateway/src/controller/product/allergen.controller.ts +++ b/services/gateway/src/controller/product/allergen.controller.ts @@ -29,6 +29,13 @@ allergenRoutes.get('/api/allergen/:id', (req: Request, res: Response) => { }); allergenRoutes.post('/api/allergen', (req: Request, res: Response) => { + /* #swagger.parameters['body'] = { + in: 'body', + required: true, + schema: { + label: "allergen-label", + } + } */ const {label} = req.body; const allergen = new Allergen().setLibelle(label); allergenServiceClient.createAllergen(allergen, (error, response) => { @@ -41,6 +48,13 @@ allergenRoutes.post('/api/allergen', (req: Request, res: Response) => { }); allergenRoutes.put('/api/allergen/:id', (req: Request, res: Response) => { + /* #swagger.parameters['body'] = { + in: 'body', + required: true, + schema: { + label: "allergen-label", + } + } */ const {id} = req.params; const {label} = req.body; const allergen = new Allergen().setId(id).setLibelle(label); diff --git a/services/gateway/src/controller/product/category.controller.ts b/services/gateway/src/controller/product/category.controller.ts index 2838aa8b..2d01a70d 100644 --- a/services/gateway/src/controller/product/category.controller.ts +++ b/services/gateway/src/controller/product/category.controller.ts @@ -29,6 +29,15 @@ categoryRoutes.get('/api/category/:id', (req: Request, res: Response) => { }); categoryRoutes.post('/api/category', (req: Request, res: Response) => { + /* #swagger.parameters['body'] = { + in: 'body', + required: true, + schema: { + label: "category-label", + icon: "category-icon", + hexaColor: "#ffffff", + } + } */ const {label, icon, hexaColor} = req.body; const category = new Category().setLibelle(label).setIcon(icon).setHexaColor(hexaColor) categoryServiceClient.createCategory(category, (error, response) => { @@ -41,6 +50,15 @@ categoryRoutes.post('/api/category', (req: Request, res: Response) => { }); categoryRoutes.put('/api/category/:id', (req: Request, res: Response) => { + /* #swagger.parameters['body'] = { + in: 'body', + required: true, + schema: { + label: "category-label", + icon: "category-icon", + hexaColor: "#ffffff", + } + } */ const {id} = req.params; const {label, icon, hexaColor} = req.body; const category = new Category().setId(id).setLibelle(label).setIcon(icon).setHexaColor(hexaColor) diff --git a/services/gateway/src/controller/product/product.controller.ts b/services/gateway/src/controller/product/product.controller.ts index f5098c65..e66c6bc3 100644 --- a/services/gateway/src/controller/product/product.controller.ts +++ b/services/gateway/src/controller/product/product.controller.ts @@ -55,6 +55,33 @@ productRoutes.delete('/api/product/:id', (req: Request, res: Response) => { }); productRoutes.post('/api/product', (req: Request, res: Response) => { + /* #swagger.parameters['body'] = { + in: 'body', + required: true, + schema: { + restaurantId: 0, + type: "type", + name: "name", + image: "image", + comment: "comment", + price: 0, + preparation: "preparation", + weight: "weight", + kilocalories: "0", + nutriscore: 0, + categories: [ + { + label: "category-label", + icon: "category-icon", + hexaColor: "#ffffff", + }], + allergens: [ + { + label: "allergen-label", + } + ], + } + } */ const { restaurantId, type, @@ -98,6 +125,33 @@ productRoutes.post('/api/product', (req: Request, res: Response) => { }); productRoutes.put('/api/product/:id', (req: Request, res: Response) => { + /* #swagger.parameters['body'] = { + in: 'body', + required: true, + schema: { + restaurantId: 0, + type: "type", + name: "name", + image: "image", + comment: "comment", + price: 0, + preparation: "preparation", + weight: "weight", + kilocalories: "0", + nutriscore: 0, + categories: [ + { + label: "category-label", + icon: "category-icon", + hexaColor: "#ffffff", + }], + allergens: [ + { + label: "allergen-label", + } + ], + } + } */ const {id} = req.params const { restaurantId, @@ -143,8 +197,8 @@ productRoutes.put('/api/product/:id', (req: Request, res: Response) => { productRoutes.post('/api/product/image', (req: Request, res: Response) => { const {input_file} = req.body; - var bitmap = fs.readFileSync(input_file); - var base64File = new Buffer(bitmap).toString('base64'); + const bitmap = fs.readFileSync(input_file); + const base64File = new Buffer(bitmap).toString('base64'); const file = new File().setName(input_file).setData(base64File); productServiceClient.uploadImage(file, (error, response) => { From 50d8c1d1c7a542382655bb19bfda884141706b33 Mon Sep 17 00:00:00 2001 From: anatole Date: Tue, 22 Aug 2023 18:53:10 +0200 Subject: [PATCH 454/883] feat(gateway): update basket schema in the swagger --- .../gateway/src/controller/basket/basket.controller.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/services/gateway/src/controller/basket/basket.controller.ts b/services/gateway/src/controller/basket/basket.controller.ts index 02354b8b..6822e2f0 100644 --- a/services/gateway/src/controller/basket/basket.controller.ts +++ b/services/gateway/src/controller/basket/basket.controller.ts @@ -26,8 +26,8 @@ basketRoutes.post('/api/basket', (req: Request, res: Response) => { required: true, schema: { userId: 0, - productId: "stringId", - restaurantId:"stringId" + productId: "product_id:0", + restaurantId:"restaurant_id:0" } } */ const {userId, productId, restaurantId} = req.body; @@ -48,8 +48,8 @@ basketRoutes.put('/api/basket/remove-product', (req: Request, res: Response) => required: true, schema: { userId: 0, - productId: "stringId", - restaurantId:"stringId" + productId: "product_id:0", + restaurantId:"restaurant_id:0" } } */ const {userId, productId, restaurantId} = req.body; @@ -70,7 +70,7 @@ basketRoutes.put('/api/basket/restaurant', (req: Request, res: Response) => { required: true, schema: { userId: 0, - restaurantId:"stringId" + restaurantId:"restaurant_id:0" } } */ const {restaurantId, userId} = req.body; From 9879dc5b2afabd5af4d91781d76f6177cffd6c32 Mon Sep 17 00:00:00 2001 From: anatole Date: Tue, 22 Aug 2023 18:53:25 +0200 Subject: [PATCH 455/883] feat(gateway): add promotion schema in the swagger --- .../promotion/promotion.controller.ts | 20 ++ .../src/lib/swagger/swagger-output.json | 191 +++++++++++++----- .../gateway/src/lib/swagger/swagger.utils.js | 6 + 3 files changed, 172 insertions(+), 45 deletions(-) diff --git a/services/gateway/src/controller/promotion/promotion.controller.ts b/services/gateway/src/controller/promotion/promotion.controller.ts index 4b8b9d62..5f23385a 100644 --- a/services/gateway/src/controller/promotion/promotion.controller.ts +++ b/services/gateway/src/controller/promotion/promotion.controller.ts @@ -38,6 +38,16 @@ promotionRoutes.get('/api/promotion/by-restaurant/:restaurantId', (req, res) => }); promotionRoutes.post('/api/promotion', (req, res) => { + /* #swagger.parameters['body'] = { + in: 'body', + required: true, + schema: { + code: "code-example", + reduction: "reduction-example", + method: {'$ref': '#/definitions/Method'}, + restaurantId: "restaurant_id:0", + } + } */ const {code, reduction, method, restaurantId} = req.body; const promotionCreateInput = new PromotionCreateInput().setCode(code) .setReduction(reduction) @@ -53,6 +63,16 @@ promotionRoutes.post('/api/promotion', (req, res) => { }); promotionRoutes.put('/api/promotion/:id', (req, res) => { + /* #swagger.parameters['body'] = { + in: 'body', + required: true, + schema: { + code: "code-example", + reduction: "reduction-example", + method: {'$ref': '#/definitions/Method'}, + restaurantId: "restaurant_id:0", + } + } */ const {id} = req.params; const {code, reduction, method, restaurantId} = req.body; const promotionUpdateInput = new Promotion().setId(id).setCode(code) diff --git a/services/gateway/src/lib/swagger/swagger-output.json b/services/gateway/src/lib/swagger/swagger-output.json index 0f0a8969..300dd962 100644 --- a/services/gateway/src/lib/swagger/swagger-output.json +++ b/services/gateway/src/lib/swagger/swagger-output.json @@ -461,11 +461,11 @@ }, "productId": { "type": "string", - "example": "stringId" + "example": "product_id:0" }, "restaurantId": { "type": "string", - "example": "stringId" + "example": "restaurant_id:0" } } } @@ -501,11 +501,11 @@ }, "productId": { "type": "string", - "example": "stringId" + "example": "product_id:0" }, "restaurantId": { "type": "string", - "example": "stringId" + "example": "restaurant_id:0" } } } @@ -541,7 +541,7 @@ }, "restaurantId": { "type": "string", - "example": "stringId" + "example": "restaurant_id:0" } } } @@ -953,17 +953,21 @@ { "name": "body", "in": "body", + "required": true, "schema": { "type": "object", "properties": { "label": { - "example": "any" + "type": "string", + "example": "category-label" }, "icon": { - "example": "any" + "type": "string", + "example": "category-icon" }, "hexaColor": { - "example": "any" + "type": "string", + "example": "#ffffff" } } } @@ -1017,17 +1021,21 @@ { "name": "body", "in": "body", + "required": true, "schema": { "type": "object", "properties": { "label": { - "example": "any" + "type": "string", + "example": "category-label" }, "icon": { - "example": "any" + "type": "string", + "example": "category-icon" }, "hexaColor": { - "example": "any" + "type": "string", + "example": "#ffffff" } } } @@ -1089,11 +1097,13 @@ { "name": "body", "in": "body", + "required": true, "schema": { "type": "object", "properties": { "label": { - "example": "any" + "type": "string", + "example": "allergen-label" } } } @@ -1147,11 +1157,13 @@ { "name": "body", "in": "body", + "required": true, "schema": { "type": "object", "properties": { "label": { - "example": "any" + "type": "string", + "example": "allergen-label" } } } @@ -1273,44 +1285,81 @@ { "name": "body", "in": "body", + "required": true, "schema": { "type": "object", "properties": { "restaurantId": { - "example": "any" + "type": "number", + "example": 0 }, "type": { - "example": "any" + "type": "string", + "example": "type" }, "name": { - "example": "any" + "type": "string", + "example": "name" }, "image": { - "example": "any" + "type": "string", + "example": "image" }, "comment": { - "example": "any" + "type": "string", + "example": "comment" }, "price": { - "example": "any" + "type": "number", + "example": 0 }, "preparation": { - "example": "any" + "type": "string", + "example": "preparation" }, "weight": { - "example": "any" + "type": "string", + "example": "weight" }, "kilocalories": { - "example": "any" + "type": "string", + "example": "0" }, "nutriscore": { - "example": "any" + "type": "number", + "example": 0 }, "categories": { - "example": "any" + "type": "array", + "items": { + "type": "object", + "properties": { + "label": { + "type": "string", + "example": "category-label" + }, + "icon": { + "type": "string", + "example": "category-icon" + }, + "hexaColor": { + "type": "string", + "example": "#ffffff" + } + } + } }, "allergens": { - "example": "any" + "type": "array", + "items": { + "type": "object", + "properties": { + "label": { + "type": "string", + "example": "allergen-label" + } + } + } } } } @@ -1352,44 +1401,81 @@ { "name": "body", "in": "body", + "required": true, "schema": { "type": "object", "properties": { "restaurantId": { - "example": "any" + "type": "number", + "example": 0 }, "type": { - "example": "any" + "type": "string", + "example": "type" }, "name": { - "example": "any" + "type": "string", + "example": "name" }, "image": { - "example": "any" + "type": "string", + "example": "image" }, "comment": { - "example": "any" + "type": "string", + "example": "comment" }, "price": { - "example": "any" + "type": "number", + "example": 0 }, "preparation": { - "example": "any" + "type": "string", + "example": "preparation" }, "weight": { - "example": "any" + "type": "string", + "example": "weight" }, "kilocalories": { - "example": "any" + "type": "string", + "example": "0" }, "nutriscore": { - "example": "any" + "type": "number", + "example": 0 }, "categories": { - "example": "any" + "type": "array", + "items": { + "type": "object", + "properties": { + "label": { + "type": "string", + "example": "category-label" + }, + "icon": { + "type": "string", + "example": "category-icon" + }, + "hexaColor": { + "type": "string", + "example": "#ffffff" + } + } + } }, "allergens": { - "example": "any" + "type": "array", + "items": { + "type": "object", + "properties": { + "label": { + "type": "string", + "example": "allergen-label" + } + } + } } } } @@ -2459,20 +2545,24 @@ { "name": "body", "in": "body", + "required": true, "schema": { "type": "object", "properties": { "code": { - "example": "any" + "type": "string", + "example": "code-example" }, "reduction": { - "example": "any" + "type": "string", + "example": "reduction-example" }, "method": { - "example": "any" + "$ref": "#/definitions/Method" }, "restaurantId": { - "example": "any" + "type": "string", + "example": "restaurant_id:0" } } } @@ -2528,20 +2618,24 @@ { "name": "body", "in": "body", + "required": true, "schema": { "type": "object", "properties": { "code": { - "example": "any" + "type": "string", + "example": "code-example" }, "reduction": { - "example": "any" + "type": "string", + "example": "reduction-example" }, "method": { - "example": "any" + "$ref": "#/definitions/Method" }, "restaurantId": { - "example": "any" + "type": "string", + "example": "restaurant_id:0" } } } @@ -3283,6 +3377,13 @@ "TAKEAWAY", "DELIVERY" ] + }, + "Method": { + "type": "string", + "enum": [ + "PERCENT", + "VALUE" + ] } } } \ No newline at end of file diff --git a/services/gateway/src/lib/swagger/swagger.utils.js b/services/gateway/src/lib/swagger/swagger.utils.js index 8c567e02..1da107fc 100644 --- a/services/gateway/src/lib/swagger/swagger.utils.js +++ b/services/gateway/src/lib/swagger/swagger.utils.js @@ -20,6 +20,12 @@ const doc = { "TAKEAWAY", "DELIVERY" ] + }, + Method: { + '@enum': [ + "PERCENT", + "VALUE" + ] } } }; From 9c85253e1b81b791a0f65c673e8379a33b0f51d3 Mon Sep 17 00:00:00 2001 From: anatole Date: Tue, 22 Aug 2023 18:59:32 +0200 Subject: [PATCH 456/883] feat(gateway): add restaurant schema in the swagger --- .../restaurant/restaurant.controller.ts | 31 ++++++++ .../src/lib/swagger/swagger-output.json | 72 +++++++++++++++---- 2 files changed, 90 insertions(+), 13 deletions(-) diff --git a/services/gateway/src/controller/restaurant/restaurant.controller.ts b/services/gateway/src/controller/restaurant/restaurant.controller.ts index 8501fe45..5877dace 100644 --- a/services/gateway/src/controller/restaurant/restaurant.controller.ts +++ b/services/gateway/src/controller/restaurant/restaurant.controller.ts @@ -29,6 +29,13 @@ restaurantRoutes.get('/api/restaurant', (req: Request, res: Response) => { }); restaurantRoutes.post('/api/restaurant/by-location', (req: Request, res: Response) => { + /* #swagger.parameters['body'] = { + in: 'body', + required: true, + schema: { + locationList: [1.099, 49.443] + } + } */ const {locationList} = req.body; restaurantServiceClient.getRestaurantsByLocation(new ByLocationInput().setLocationList(locationList), (error, response) => { if (error) { @@ -40,6 +47,18 @@ restaurantRoutes.post('/api/restaurant/by-location', (req: Request, res: Respons }); restaurantRoutes.post('/api/restaurant', (req: Request, res: Response) => { + /* #swagger.parameters['body'] = { + in: 'body', + required: true, + schema: { + name: "restaurant-name", + description: "restaurant-desc", + locationList: [1.099, 49.443], + address: "restaurant-address", + openingHoursList: ["12h-14h", "19h-22h"], + phone: "restaurant-phone" + } + } */ const {name, description, locationList, address, openingHoursList, phone} = req.body; const restaurantCreateInput = new RestaurantCreateInput().setName(name) .setDescription(description) @@ -58,6 +77,18 @@ restaurantRoutes.post('/api/restaurant', (req: Request, res: Response) => { }); restaurantRoutes.put('/api/restaurant/:id', (req: Request, res: Response) => { + /* #swagger.parameters['body'] = { + in: 'body', + required: true, + schema: { + name: "restaurant-name", + description: "restaurant-desc", + locationList: [1.099, 49.443], + address: "restaurant-address", + openingHoursList: ["12h-14h", "19h-22h"], + phone: "restaurant-phone" + } + } */ const {id} = req.params; const {name, description, locationList, address, openingHoursList, phone} = req.body; const restaurantCreateInput = new Restaurant().setId(id) diff --git a/services/gateway/src/lib/swagger/swagger-output.json b/services/gateway/src/lib/swagger/swagger-output.json index 300dd962..889ef089 100644 --- a/services/gateway/src/lib/swagger/swagger-output.json +++ b/services/gateway/src/lib/swagger/swagger-output.json @@ -1559,26 +1559,45 @@ { "name": "body", "in": "body", + "required": true, "schema": { "type": "object", "properties": { "name": { - "example": "any" + "type": "string", + "example": "restaurant-name" }, "description": { - "example": "any" + "type": "string", + "example": "restaurant-desc" }, "locationList": { - "example": "any" + "type": "array", + "example": [ + 1.099, + 49.443 + ], + "items": { + "type": "number" + } }, "address": { - "example": "any" + "type": "string", + "example": "restaurant-address" }, "openingHoursList": { - "example": "any" + "type": "array", + "example": [ + "12h-14h", + "19h-22h" + ], + "items": { + "type": "string" + } }, "phone": { - "example": "any" + "type": "string", + "example": "restaurant-phone" } } } @@ -1640,26 +1659,45 @@ { "name": "body", "in": "body", + "required": true, "schema": { "type": "object", "properties": { "name": { - "example": "any" + "type": "string", + "example": "restaurant-name" }, "description": { - "example": "any" + "type": "string", + "example": "restaurant-desc" }, "locationList": { - "example": "any" + "type": "array", + "example": [ + 1.099, + 49.443 + ], + "items": { + "type": "number" + } }, "address": { - "example": "any" + "type": "string", + "example": "restaurant-address" }, "openingHoursList": { - "example": "any" + "type": "array", + "example": [ + "12h-14h", + "19h-22h" + ], + "items": { + "type": "string" + } }, "phone": { - "example": "any" + "type": "string", + "example": "restaurant-phone" } } } @@ -1685,11 +1723,19 @@ { "name": "body", "in": "body", + "required": true, "schema": { "type": "object", "properties": { "locationList": { - "example": "any" + "type": "array", + "example": [ + 1.099, + 49.443 + ], + "items": { + "type": "number" + } } } } From 58beed778eb07167bc508052e28ecbfaf1899bbb Mon Sep 17 00:00:00 2001 From: anatole Date: Tue, 22 Aug 2023 19:28:37 +0200 Subject: [PATCH 457/883] feat(gateway): add stock schema in the swagger --- .../src/controller/stock/stock.controller.ts | 156 ++++++++++++++++++ .../stock/stockPerson.controller.ts | 8 + .../src/lib/swagger/swagger-output.json | 136 ++++++++++----- 3 files changed, 256 insertions(+), 44 deletions(-) diff --git a/services/gateway/src/controller/stock/stock.controller.ts b/services/gateway/src/controller/stock/stock.controller.ts index f9a63d4e..88622ffc 100644 --- a/services/gateway/src/controller/stock/stock.controller.ts +++ b/services/gateway/src/controller/stock/stock.controller.ts @@ -32,6 +32,11 @@ export const stockRoutes = Router(); */ stockRoutes.get('/api/stock/supplier/:id', (req: Request, res: Response) => { + /* #swagger.parameters['id'] = { + in: 'path', + required: true, + type: 'integer' + }*/ const {id} = req.params; const supplierRequest = new GetSupplierRequest().setId(Number(id)); @@ -56,6 +61,11 @@ stockRoutes.get('/api/stock/supplier', (req: Request, res: Response) => { }); stockRoutes.get('/api/stock/ingredient/:id', (req: Request, res: Response) => { + /* #swagger.parameters['id'] = { + in: 'path', + required: true, + type: 'integer' + }*/ const {id} = req.params; const ingredientRequest = new GetIngredientRequest().setId(Number(id)); @@ -80,6 +90,14 @@ stockRoutes.get('/api/stock/ingredient', (req: Request, res: Response) => { }); stockRoutes.post('/api/stock/ingredient', (req: Request, res: Response) => { + /* #swagger.parameters['body'] = { + in: 'body', + required: true, + schema: { + name: "ingredient-name", + description: "ingredient-desc", + } + } */ const {name, desciption} = req.body const ingredientRequest = new CreateIngredientRequest().setName(name).setDescription(desciption) @@ -93,6 +111,19 @@ stockRoutes.post('/api/stock/ingredient', (req: Request, res: Response) => { }); stockRoutes.put('/api/stock/ingredient/:id', (req: Request, res: Response) => { + /* #swagger.parameters['id'] = { + in: 'path', + required: true, + type: 'integer' + } + #swagger.parameters['body'] = { + in: 'body', + required: true, + schema: { + name: "ingredient-name", + description: "ingredient-desc", + } + } */ const {id} = req.params const {name, desciption} = req.body const ingredientRequest = new UpdateIngredientRequest().setId(Number(id)).setName(name).setDescription(desciption) @@ -107,6 +138,11 @@ stockRoutes.put('/api/stock/ingredient/:id', (req: Request, res: Response) => { }); stockRoutes.delete('/api/stock/ingredient/:id', (req: Request, res: Response) => { + /* #swagger.parameters['id'] = { + in: 'path', + required: true, + type: 'integer' + }*/ const {id} = req.params const ingredientRequest = new DeleteIngredientRequest().setId(Number(id)); @@ -120,6 +156,11 @@ stockRoutes.delete('/api/stock/ingredient/:id', (req: Request, res: Response) => }); stockRoutes.delete('/api/stock/ingredient/:id', (req: Request, res: Response) => { + /* #swagger.parameters['id'] = { + in: 'path', + required: true, + type: 'integer' + }*/ const {id} = req.params const ingredientRequest = new DeleteIngredientRequest().setId(Number(id)); @@ -137,6 +178,11 @@ stockRoutes.delete('/api/stock/ingredient/:id', (req: Request, res: Response) => */ stockRoutes.get('/api/stock/ingredient/restaurant/:id', (req: Request, res: Response) => { + /* #swagger.parameters['id'] = { + in: 'path', + required: true, + type: 'integer' + }*/ const {id} = req.params; const ingredientRestaurantRequest = new GetIngredientRestaurantRequest().setId(Number(id)); @@ -176,6 +222,19 @@ stockRoutes.get('/api/stock/ingredient/restaurant/by-product/:id', (req: Request }); stockRoutes.post('/api/stock/ingredient/restaurant', (req: Request, res: Response) => { + /* #swagger.parameters['body'] = { + in: 'body', + required: true, + schema: { + alertThreshold: 5, + quantity: 2, + productList: ["product_id:1", "product_id:2"], + unitPrice: 2, + pricePerKilo: 1.5, + restaurantId: "restaurant_id:1", + ingredientId: 1, + } + } */ const {alertThreshold, quantity, productList, unitPrice, pricePerKilo, restaurantId, ingredientId} = req.body; const ingredientRestaurant = new CreateIngredientRestaurantRequest().setAlertThreshold(alertThreshold) .setQuantity(quantity) @@ -196,6 +255,24 @@ stockRoutes.post('/api/stock/ingredient/restaurant', (req: Request, res: Respons }); stockRoutes.put('/api/stock/ingredient/restaurant/:id', (req: Request, res: Response) => { + /* #swagger.parameters['id'] = { + in: 'path', + required: true, + type: 'integer' + } + #swagger.parameters['body'] = { + in: 'body', + required: true, + schema: { + alertThreshold: 5, + quantity: 2, + productList: ["product_id:1", "product_id:2"], + unitPrice: 2, + pricePerKilo: 1.5, + restaurantId: "restaurant_id:1", + ingredientId: 1, + } + } */ const {id} = req.params; const {alertThreshold, quantity, productList, unitPrice, pricePerKilo, restaurantId, ingredientId} = req.body; const ingredientRestaurant = new UpdateIngredientRestaurantRequest().setId(Number(id)).setAlertThreshold(alertThreshold) @@ -217,6 +294,11 @@ stockRoutes.put('/api/stock/ingredient/restaurant/:id', (req: Request, res: Resp }); stockRoutes.delete('/api/stock/ingredient/restaurant/:id', (req: Request, res: Response) => { + /* #swagger.parameters['id'] = { + in: 'path', + required: true, + type: 'integer' + }*/ const {id} = req.params; stockServiceClient.deleteIngredientRestaurant(new DeleteIngredientRestaurantRequest().setId(Number(id)), (error, response) => { @@ -233,6 +315,11 @@ stockRoutes.delete('/api/stock/ingredient/restaurant/:id', (req: Request, res: R */ stockRoutes.get('/api/stock/supplier/:id', (req: Request, res: Response) => { + /* #swagger.parameters['id'] = { + in: 'path', + required: true, + type: 'integer' + }*/ const {id} = req.params; stockServiceClient.getSupplier(new GetSupplierRequest().setId(Number(id)), (error, response) => { @@ -255,6 +342,14 @@ stockRoutes.get('/api/stock/supplier', (req: Request, res: Response) => { }); stockRoutes.post('/api/stock/supplier', (req: Request, res: Response) => { + /* #swagger.parameters['body'] = { + in: 'body', + required: true, + schema: { + name: "supplier-name", + contact: "supplier-contact" + } + } */ const {name, contact} = req.body; const supplierRequest = new CreateSupplierRequest().setName(name).setContact(contact) @@ -268,6 +363,19 @@ stockRoutes.post('/api/stock/supplier', (req: Request, res: Response) => { }); stockRoutes.put('/api/stock/supplier/:id', (req: Request, res: Response) => { + /* #swagger.parameters['id'] = { + in: 'path', + required: true, + type: 'integer' + } + #swagger.parameters['body'] = { + in: 'body', + required: true, + schema: { + name: "supplier-name", + contact: "supplier-contact" + } + } */ const {id} = req.params; const {name, contact} = req.body; const supplierRequest = new UpdateSupplierRequest().setId(Number(id)).setName(name).setContact(contact) @@ -282,6 +390,11 @@ stockRoutes.put('/api/stock/supplier/:id', (req: Request, res: Response) => { }); stockRoutes.delete('/api/stock/supplier/:id', (req: Request, res: Response) => { + /* #swagger.parameters['id'] = { + in: 'path', + required: true, + type: 'integer' + }*/ const {id} = req.params; stockServiceClient.deleteSupplier(new DeleteSupplierRequest().setId(Number(id)), (error, response) => { @@ -298,6 +411,11 @@ stockRoutes.delete('/api/stock/supplier/:id', (req: Request, res: Response) => { */ stockRoutes.get('/api/stock/supply/order/:id', (req: Request, res: Response) => { + /* #swagger.parameters['id'] = { + in: 'path', + required: true, + type: 'integer' + }*/ const {id} = req.params; stockServiceClient.getSupplyOrder(new GetSupplyOrderRequest().setId(Number(id)), (error, response) => { @@ -321,6 +439,11 @@ stockRoutes.get('/api/stock/supply/order/by-restaurant/:id', (req: Request, res: }); stockRoutes.get('/api/stock/supply/order/by-supplier/:id', (req: Request, res: Response) => { + /* #swagger.parameters['id'] = { + in: 'path', + required: true, + type: 'integer' + }*/ const {id} = req.params; stockServiceClient.getSupplyOrdersBySupplier(new GetSupplyOrdersBySupplierRequest().setSupplierId(Number(id)), (error, response) => { if (error) { @@ -332,6 +455,11 @@ stockRoutes.get('/api/stock/supply/order/by-supplier/:id', (req: Request, res: R }); stockRoutes.get('/api/stock/supply/order/by-ingredient-restaurant/:id', (req: Request, res: Response) => { + /* #swagger.parameters['id'] = { + in: 'path', + required: true, + type: 'integer' + }*/ const {id} = req.params; stockServiceClient.getSupplyOrdersByIngredientRestaurant(new GetSupplyOrdersByIngredientRestaurantRequest().setIngredientRestaurantId(Number(id)), (error, response) => { if (error) { @@ -343,6 +471,15 @@ stockRoutes.get('/api/stock/supply/order/by-ingredient-restaurant/:id', (req: Re }); stockRoutes.post('/api/stock/supply/order', (req: Request, res: Response) => { + /* #swagger.parameters['body'] = { + in: 'body', + required: true, + schema: { + quantity: 3, + ingredientRestaurantId: 1, + supplierId: 1 + } + } */ const {quantity, ingredientRestaurantId, supplierId} = req.body; const supplyOrderRequest = new CreateSupplyOrderRequest().setQuantity(quantity) .setIngredientRestaurantId(ingredientRestaurantId) @@ -358,6 +495,20 @@ stockRoutes.post('/api/stock/supply/order', (req: Request, res: Response) => { }); stockRoutes.put('/api/stock/supply/order/:id', (req: Request, res: Response) => { + /* #swagger.parameters['id'] = { + in: 'path', + required: true, + type: 'integer' + } + #swagger.parameters['body'] = { + in: 'body', + required: true, + schema: { + quantity: 3, + ingredientRestaurantId: 1, + supplierId: 1 + } + } */ const {id} = req.params; const {quantity, ingredientRestaurantId, supplierId} = req.body; const supplyOrderRequest = new UpdateSupplyOrderRequest().setId(Number(id)).setQuantity(quantity) @@ -374,6 +525,11 @@ stockRoutes.put('/api/stock/supply/order/:id', (req: Request, res: Response) => }); stockRoutes.delete('/api/stock/supply/order/:id', (req: Request, res: Response) => { + /* #swagger.parameters['id'] = { + in: 'path', + required: true, + type: 'integer' + }*/ const {id} = req.params; stockServiceClient.deleteSupplyOrder(new DeleteSupplyOrderRequest().setId(Number(id)), (error, response) => { if (error) { diff --git a/services/gateway/src/controller/stock/stockPerson.controller.ts b/services/gateway/src/controller/stock/stockPerson.controller.ts index cc8c9bf8..a1a14eea 100644 --- a/services/gateway/src/controller/stock/stockPerson.controller.ts +++ b/services/gateway/src/controller/stock/stockPerson.controller.ts @@ -5,6 +5,14 @@ import {GetOutcomesByRestaurantRequest} from "@gateway/proto/stock_pb"; export const stockPersonRoutes = Router(); stockPersonRoutes.post('/api/stock/outcomes/by-restaurant/:id', (req: Request, res: Response) => { + /* #swagger.parameters['body'] = { + in: 'body', + required: true, + schema: { + date: "2022-01-01T00:00:00.000Z", + interval: "interval-example" + } + } */ const {id} = req.params; const {date, interval} = req.body; const outcomesByRestaurantRequest = new GetOutcomesByRestaurantRequest().setRestaurantId(id).setDate(date).setInterval(interval); diff --git a/services/gateway/src/lib/swagger/swagger-output.json b/services/gateway/src/lib/swagger/swagger-output.json index 889ef089..700102ac 100644 --- a/services/gateway/src/lib/swagger/swagger-output.json +++ b/services/gateway/src/lib/swagger/swagger-output.json @@ -2730,7 +2730,7 @@ "name": "id", "in": "path", "required": true, - "type": "string" + "type": "integer" } ], "responses": { @@ -2752,19 +2752,22 @@ "name": "id", "in": "path", "required": true, - "type": "string" + "type": "integer" }, { "name": "body", "in": "body", + "required": true, "schema": { "type": "object", "properties": { "name": { - "example": "any" + "type": "string", + "example": "supplier-name" }, "contact": { - "example": "any" + "type": "string", + "example": "supplier-contact" } } } @@ -2789,7 +2792,7 @@ "name": "id", "in": "path", "required": true, - "type": "string" + "type": "integer" } ], "responses": { @@ -2826,14 +2829,17 @@ { "name": "body", "in": "body", + "required": true, "schema": { "type": "object", "properties": { "name": { - "example": "any" + "type": "string", + "example": "supplier-name" }, "contact": { - "example": "any" + "type": "string", + "example": "supplier-contact" } } } @@ -2860,7 +2866,7 @@ "name": "id", "in": "path", "required": true, - "type": "string" + "type": "integer" } ], "responses": { @@ -2882,19 +2888,22 @@ "name": "id", "in": "path", "required": true, - "type": "string" + "type": "integer" }, { "name": "body", "in": "body", + "required": true, "schema": { "type": "object", "properties": { "name": { - "example": "any" + "type": "string", + "example": "ingredient-name" }, - "desciption": { - "example": "any" + "description": { + "type": "string", + "example": "ingredient-desc" } } } @@ -2919,7 +2928,7 @@ "name": "id", "in": "path", "required": true, - "type": "string" + "type": "integer" } ], "responses": { @@ -2956,14 +2965,17 @@ { "name": "body", "in": "body", + "required": true, "schema": { "type": "object", "properties": { "name": { - "example": "any" + "type": "string", + "example": "ingredient-name" }, - "desciption": { - "example": "any" + "description": { + "type": "string", + "example": "ingredient-desc" } } } @@ -2990,7 +3002,7 @@ "name": "id", "in": "path", "required": true, - "type": "string" + "type": "integer" } ], "responses": { @@ -3012,34 +3024,48 @@ "name": "id", "in": "path", "required": true, - "type": "string" + "type": "integer" }, { "name": "body", "in": "body", + "required": true, "schema": { "type": "object", "properties": { "alertThreshold": { - "example": "any" + "type": "number", + "example": 5 }, "quantity": { - "example": "any" + "type": "number", + "example": 2 }, "productList": { - "example": "any" + "type": "array", + "example": [ + "product_id:1", + "product_id:2" + ], + "items": { + "type": "string" + } }, "unitPrice": { - "example": "any" + "type": "number", + "example": 2 }, "pricePerKilo": { - "example": "any" + "type": "number", + "example": 1.5 }, "restaurantId": { - "example": "any" + "type": "string", + "example": "restaurant_id:1" }, "ingredientId": { - "example": "any" + "type": "number", + "example": 1 } } } @@ -3064,7 +3090,7 @@ "name": "id", "in": "path", "required": true, - "type": "string" + "type": "integer" } ], "responses": { @@ -3135,29 +3161,43 @@ { "name": "body", "in": "body", + "required": true, "schema": { "type": "object", "properties": { "alertThreshold": { - "example": "any" + "type": "number", + "example": 5 }, "quantity": { - "example": "any" + "type": "number", + "example": 2 }, "productList": { - "example": "any" + "type": "array", + "example": [ + "product_id:1", + "product_id:2" + ], + "items": { + "type": "string" + } }, "unitPrice": { - "example": "any" + "type": "number", + "example": 2 }, "pricePerKilo": { - "example": "any" + "type": "number", + "example": 1.5 }, "restaurantId": { - "example": "any" + "type": "string", + "example": "restaurant_id:1" }, "ingredientId": { - "example": "any" + "type": "number", + "example": 1 } } } @@ -3184,7 +3224,7 @@ "name": "id", "in": "path", "required": true, - "type": "string" + "type": "integer" } ], "responses": { @@ -3206,22 +3246,26 @@ "name": "id", "in": "path", "required": true, - "type": "string" + "type": "integer" }, { "name": "body", "in": "body", + "required": true, "schema": { "type": "object", "properties": { "quantity": { - "example": "any" + "type": "number", + "example": 3 }, "ingredientRestaurantId": { - "example": "any" + "type": "number", + "example": 1 }, "supplierId": { - "example": "any" + "type": "number", + "example": 1 } } } @@ -3246,7 +3290,7 @@ "name": "id", "in": "path", "required": true, - "type": "string" + "type": "integer" } ], "responses": { @@ -3294,7 +3338,7 @@ "name": "id", "in": "path", "required": true, - "type": "string" + "type": "integer" } ], "responses": { @@ -3318,7 +3362,7 @@ "name": "id", "in": "path", "required": true, - "type": "string" + "type": "integer" } ], "responses": { @@ -3341,17 +3385,21 @@ { "name": "body", "in": "body", + "required": true, "schema": { "type": "object", "properties": { "quantity": { - "example": "any" + "type": "number", + "example": 3 }, "ingredientRestaurantId": { - "example": "any" + "type": "number", + "example": 1 }, "supplierId": { - "example": "any" + "type": "number", + "example": 1 } } } From 5455c0fc30d07f0ad13da86853b5ecdd94b265e7 Mon Sep 17 00:00:00 2001 From: anatole Date: Tue, 22 Aug 2023 19:57:33 +0200 Subject: [PATCH 458/883] feat(gateway): add user schema in the swagger --- .../controller/user/mainAddress.controller.ts | 24 +++- .../src/controller/user/user.controller.ts | 95 +++++++++++-- .../src/lib/swagger/swagger-output.json | 130 ++++++++++++------ .../gateway/src/lib/swagger/swagger.utils.js | 8 ++ 4 files changed, 207 insertions(+), 50 deletions(-) diff --git a/services/gateway/src/controller/user/mainAddress.controller.ts b/services/gateway/src/controller/user/mainAddress.controller.ts index d7cef42f..f5e7e90c 100644 --- a/services/gateway/src/controller/user/mainAddress.controller.ts +++ b/services/gateway/src/controller/user/mainAddress.controller.ts @@ -5,6 +5,11 @@ import {MainAddress, MainAddressId, MainAddressUpdateInput} from "@gateway/proto export const mainAddressRoutes = Router(); mainAddressRoutes.get('/api/user/main-address/:id', async (req: Request, res: Response) => { + /* #swagger.parameters['id'] = { + in: 'path', + required: true, + type: 'integer' + }*/ const {id} = req.params; mainAddressServiceClient.getMainAddress(new MainAddressId().setId(Number(id)), (err, response) => { if (err) { @@ -15,14 +20,31 @@ mainAddressRoutes.get('/api/user/main-address/:id', async (req: Request, res: Re }); mainAddressRoutes.put('/api/user/main-address/:id', async (req: Request, res: Response) => { + /* #swagger.parameters['id'] = { + in: 'path', + required: true, + type: 'integer' + } + #swagger.parameters['body'] = { + in: 'body', + required: true, + schema: { + country: "France", + zipCode: "76000", + street: "7 rue de la paix", + lat: 49.443232, + lng: 1.099971 + } + } */ const {authorization} = req.headers; if (!authorization) { res.json({error: 'Not authorized'}); return; } + const {id} = req.params; const {country, zipCode, street, lat, lng} = req.body; - const address = new MainAddress().setCountry(country).setZipcode(zipCode).setStreet(street).setLat(lat).setLng(lng) + const address = new MainAddress().setId(Number(id)).setCountry(country).setZipcode(zipCode).setStreet(street).setLat(lat).setLng(lng) const mainAddressUpdateInput = new MainAddressUpdateInput().setToken(authorization).setMainaddress(address) mainAddressServiceClient.updateMainAddress(mainAddressUpdateInput, (err, response) => { diff --git a/services/gateway/src/controller/user/user.controller.ts b/services/gateway/src/controller/user/user.controller.ts index fc7e986b..dc3fb666 100644 --- a/services/gateway/src/controller/user/user.controller.ts +++ b/services/gateway/src/controller/user/user.controller.ts @@ -6,6 +6,7 @@ import { DeleteInput, logInInput, MainAddress, + Role, RoleInput, UpdateUserInput, User, @@ -17,6 +18,11 @@ import {getUser} from "@gateway/services/user.service"; export const userRoutes = Router(); userRoutes.get('/api/user/:id', (req: Request, res: Response) => { + /* #swagger.parameters['id'] = { + in: 'path', + required: true, + type: 'integer' + }*/ const {id} = req.params; try { res.json(getUser(Number(id))); @@ -36,6 +42,23 @@ userRoutes.get('/api/user', (req: Request, res: Response) => { }); userRoutes.post('/api/user/register', (req: Request, res: Response) => { + /* #swagger.parameters['body'] = { + in: 'body', + required: true, + schema: { + firstName: "John", + lastName: "Doe", + email: "johnDoe@mail.com", + password: "password", + phone: "0642424242", + country: "France", + zipCode: "76000", + street: "7 rue de la paix", + lat: 49.443232, + lng: 1.099971, + roleCode: {'$ref': '#/definitions/RoleCode'}, + } + } */ const {firstName, lastName, email, password, phone, country, zipCode, street, lat, lng, roleCode} = req.body; const userInput = new UserCreateInput(); try { @@ -62,12 +85,34 @@ userRoutes.post('/api/user/register', (req: Request, res: Response) => { }); userRoutes.put('/api/user/:id', (req: Request, res: Response) => { + /* #swagger.parameters['id'] = { + in: 'path', + required: true, + type: 'integer' + } + #swagger.parameters['body'] = { + in: 'body', + required: true, + schema: { + firstName: "John", + lastName: "Doe", + email: "johnDoe@mail.com", + password: "password", + phone: "0642424242", + country: "France", + zipCode: "76000", + street: "7 rue de la paix", + lat: 49.443232, + lng: 1.099971, + roleCode: {'$ref': '#/definitions/RoleCode'}, + } + } */ const {authorization} = req.headers; if (!authorization) { res.json({error: 'Not authorized'}); return; } - const {firstName, lastName, email, phone, country, zipCode, street, lat, lng, role} = req.body; + const {firstName, lastName, email, phone, country, zipCode, street, lat, lng, roleCode} = req.body; const userInput = new UpdateUserInput() try { @@ -78,7 +123,7 @@ userRoutes.put('/api/user/:id', (req: Request, res: Response) => { .setEmail(email) .setPhone(phone) .setMainaddress(address) - .setRole(role); + .setRole(new Role().setCode(roleCode)); userInput.setUser(user).setToken(authorization); @@ -96,6 +141,11 @@ userRoutes.put('/api/user/:id', (req: Request, res: Response) => { }); userRoutes.delete('/api/user/:id', (req: Request, res: Response) => { + /* #swagger.parameters['id'] = { + in: 'path', + required: true, + type: 'integer' + } */ const {id} = req.params; const {authorization} = req.headers; if (!authorization) { @@ -113,8 +163,16 @@ userRoutes.delete('/api/user/:id', (req: Request, res: Response) => { }); userRoutes.post('/api/user/login', (req: Request, res: Response) => { - const body = req.body; - const inInput = new logInInput().setEmail(body.email).setPassword(body.password); + /* #swagger.parameters['body'] = { + in: 'body', + required: true, + schema: { + email: "johnDoe@mail.com", + password: "password", + } + } */ + const {email, password} = req.body; + const inInput = new logInInput().setEmail(email).setPassword(password); userServiceClient.logIn(inInput, (error, response) => { if (error) { @@ -143,19 +201,27 @@ userRoutes.post('/api/user/validate', (req: Request, res: Response) => { }); userRoutes.put('/api/user/:id/password', (req: Request, res: Response) => { + /* #swagger.parameters['body'] = { + in: 'body', + required: true, + schema: { + oldpassword: "oldpassword", + password: "newPassword", + } + } */ const {authorization} = req.headers; if (!authorization) { res.json({error: 'Not authorized'}); return; } - const body = req.body; + const {oldpassword, password} = req.body; const updatePasswordInput = new changePasswordInput(); try { updatePasswordInput .setToken(authorization) - .setOldpassword(body.oldpassword) - .setNewpassword(body.password); + .setOldpassword(oldpassword) + .setNewpassword(password); } catch (e: any) { res.json({error: e.message}); } @@ -170,19 +236,30 @@ userRoutes.put('/api/user/:id/password', (req: Request, res: Response) => { }); userRoutes.put('/api/user/:id/role', (req: Request, res: Response) => { + /* #swagger.parameters['id'] = { + in: 'path', + required: true, + type: 'integer' + } + #swagger.parameters['body'] = { + in: 'body', + required: true, + schema: { + role: {'$ref': '#/definitions/RoleCode'}, + } + } */ const {authorization} = req.headers; if (!authorization) { res.json({error: 'Not authorized'}); return; } - const body = req.body; const id = req.params.id; const updatePasswordInput = new changeRoleInput(); try { updatePasswordInput .setToken(authorization) .setUserid(Number(id)) - .setRolecode(body.role); + .setRolecode(req.body.role); } catch (e: any) { res.json({error: e.message}); } diff --git a/services/gateway/src/lib/swagger/swagger-output.json b/services/gateway/src/lib/swagger/swagger-output.json index 700102ac..f05931fa 100644 --- a/services/gateway/src/lib/swagger/swagger-output.json +++ b/services/gateway/src/lib/swagger/swagger-output.json @@ -22,7 +22,7 @@ "name": "id", "in": "path", "required": true, - "type": "string" + "type": "integer" } ], "responses": { @@ -41,7 +41,7 @@ "name": "id", "in": "path", "required": true, - "type": "string" + "type": "integer" }, { "name": "authorization", @@ -51,38 +51,52 @@ { "name": "body", "in": "body", + "required": true, "schema": { "type": "object", "properties": { "firstName": { - "example": "any" + "type": "string", + "example": "John" }, "lastName": { - "example": "any" + "type": "string", + "example": "Doe" }, "email": { - "example": "any" + "type": "string", + "example": "johnDoe@mail.com" + }, + "password": { + "type": "string", + "example": "password" }, "phone": { - "example": "any" + "type": "string", + "example": "0642424242" }, "country": { - "example": "any" + "type": "string", + "example": "France" }, "zipCode": { - "example": "any" + "type": "string", + "example": "76000" }, "street": { - "example": "any" + "type": "string", + "example": "7 rue de la paix" }, "lat": { - "example": "any" + "type": "number", + "example": 49.443232 }, "lng": { - "example": "any" + "type": "number", + "example": 1.099971 }, - "role": { - "example": "any" + "roleCode": { + "$ref": "#/definitions/RoleCode" } } } @@ -107,7 +121,7 @@ "name": "id", "in": "path", "required": true, - "type": "string" + "type": "integer" }, { "name": "authorization", @@ -151,41 +165,52 @@ { "name": "body", "in": "body", + "required": true, "schema": { "type": "object", "properties": { "firstName": { - "example": "any" + "type": "string", + "example": "John" }, "lastName": { - "example": "any" + "type": "string", + "example": "Doe" }, "email": { - "example": "any" + "type": "string", + "example": "johnDoe@mail.com" }, "password": { - "example": "any" + "type": "string", + "example": "password" }, "phone": { - "example": "any" + "type": "string", + "example": "0642424242" }, "country": { - "example": "any" + "type": "string", + "example": "France" }, "zipCode": { - "example": "any" + "type": "string", + "example": "76000" }, "street": { - "example": "any" + "type": "string", + "example": "7 rue de la paix" }, "lat": { - "example": "any" + "type": "number", + "example": 49.443232 }, "lng": { - "example": "any" + "type": "number", + "example": 1.099971 }, "roleCode": { - "example": "any" + "$ref": "#/definitions/RoleCode" } } } @@ -211,14 +236,17 @@ { "name": "body", "in": "body", + "required": true, "schema": { "type": "object", "properties": { "email": { - "example": "any" + "type": "string", + "example": "johnDoe@mail.com" }, "password": { - "example": "any" + "type": "string", + "example": "password" } } } @@ -278,14 +306,17 @@ { "name": "body", "in": "body", + "required": true, "schema": { "type": "object", "properties": { "oldpassword": { - "example": "any" + "type": "string", + "example": "oldpassword" }, "password": { - "example": "any" + "type": "string", + "example": "newPassword" } } } @@ -312,7 +343,7 @@ "name": "id", "in": "path", "required": true, - "type": "string" + "type": "integer" }, { "name": "authorization", @@ -322,11 +353,12 @@ { "name": "body", "in": "body", + "required": true, "schema": { "type": "object", "properties": { "role": { - "example": "any" + "$ref": "#/definitions/RoleCode" } } } @@ -353,7 +385,7 @@ "name": "id", "in": "path", "required": true, - "type": "string" + "type": "integer" } ], "responses": { @@ -375,7 +407,7 @@ "name": "id", "in": "path", "required": true, - "type": "string" + "type": "integer" }, { "name": "authorization", @@ -385,23 +417,29 @@ { "name": "body", "in": "body", + "required": true, "schema": { "type": "object", "properties": { "country": { - "example": "any" + "type": "string", + "example": "France" }, "zipCode": { - "example": "any" + "type": "string", + "example": "76000" }, "street": { - "example": "any" + "type": "string", + "example": "7 rue de la paix" }, "lat": { - "example": "any" + "type": "number", + "example": 49.443232 }, "lng": { - "example": "any" + "type": "number", + "example": 1.099971 } } } @@ -3431,14 +3469,17 @@ { "name": "body", "in": "body", + "required": true, "schema": { "type": "object", "properties": { "date": { - "example": "any" + "type": "string", + "example": "2022-01-01T00:00:00.000Z" }, "interval": { - "example": "any" + "type": "string", + "example": "interval-example" } } } @@ -3478,6 +3519,15 @@ "PERCENT", "VALUE" ] + }, + "RoleCode": { + "type": "string", + "enum": [ + "ADMIN", + "USER", + "ACCOUNTANT", + "DELIVERER" + ] } } } \ No newline at end of file diff --git a/services/gateway/src/lib/swagger/swagger.utils.js b/services/gateway/src/lib/swagger/swagger.utils.js index 1da107fc..86f756b5 100644 --- a/services/gateway/src/lib/swagger/swagger.utils.js +++ b/services/gateway/src/lib/swagger/swagger.utils.js @@ -26,6 +26,14 @@ const doc = { "PERCENT", "VALUE" ] + }, + RoleCode: { + '@enum': [ + "ADMIN", + "USER", + "ACCOUNTANT", + "DELIVERER" + ] } } }; From ff879309bf00007bb6ec6da1791df1dad8e07f2a Mon Sep 17 00:00:00 2001 From: anatole Date: Tue, 22 Aug 2023 21:55:13 +0200 Subject: [PATCH 459/883] feat(user): remove useless documentation --- services/user/README.md | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/services/user/README.md b/services/user/README.md index ceaf8c7d..c2f2e845 100644 --- a/services/user/README.md +++ b/services/user/README.md @@ -56,18 +56,6 @@ If protos are updated, you will need to regenerate the gRPC code using the follo You can now access the microservice at `http://localhost:50001`. -### 2. Create and seed the database - -Run the following command to create your Postgres database structure. This also creates the models tables that are -defined in [`prisma/schema.prisma`](./prisma/schema.prisma): - -``` -npx prisma migrate dev --name init -``` - -When `npx prisma migrate dev` is executed against a newly created database, seeding is also triggered. The seed file -in [`prisma/seed.ts`](./prisma/seed.ts) will be executed and your database will be populated with the sample data. - ## Build and Run with Docker ### Build From 9edd24b0f9f25ae7cc6476d5d8ac8caddc430024 Mon Sep 17 00:00:00 2001 From: anatole Date: Wed, 23 Aug 2023 15:45:22 +0200 Subject: [PATCH 460/883] feat(user): add return handler --- services/user/pkg/db/db.go | 1 + 1 file changed, 1 insertion(+) diff --git a/services/user/pkg/db/db.go b/services/user/pkg/db/db.go index fc363740..d08a1a6f 100644 --- a/services/user/pkg/db/db.go +++ b/services/user/pkg/db/db.go @@ -17,6 +17,7 @@ func Init(url string) Handler { if err != nil { log.Fatal(err) + return Handler{} } err = db.AutoMigrate(&models.Role{}) From d87e25a0ebff6f0e5a9cb908419008f03692a98d Mon Sep 17 00:00:00 2001 From: anatole Date: Wed, 23 Aug 2023 16:36:50 +0200 Subject: [PATCH 461/883] feat(gateway): add linter and prettier --- services/gateway/.eslintrc.js | 18 + services/gateway/.prettierrc | 4 + services/gateway/package-lock.json | 2318 +++++++++++++++++++++++++++- services/gateway/package.json | 7 + 4 files changed, 2309 insertions(+), 38 deletions(-) create mode 100644 services/gateway/.eslintrc.js create mode 100644 services/gateway/.prettierrc diff --git a/services/gateway/.eslintrc.js b/services/gateway/.eslintrc.js new file mode 100644 index 00000000..c2b0b775 --- /dev/null +++ b/services/gateway/.eslintrc.js @@ -0,0 +1,18 @@ +module.exports = { + env: { + es2021: true, + node: true, + }, + extends: ["eslint:recommended", "plugin:@typescript-eslint/recommended", "plugin:prettier/recommended"], + overrides: [], + parser: "@typescript-eslint/parser", + parserOptions: { + ecmaVersion: "latest", + sourceType: "module", + }, + plugins: ["@typescript-eslint"], + rules: { + "@typescript-eslint/ban-ts-comment": "warn", + }, + ignorePatterns: ["node_modules/", "dist/"], +}; \ No newline at end of file diff --git a/services/gateway/.prettierrc b/services/gateway/.prettierrc new file mode 100644 index 00000000..73e070e8 --- /dev/null +++ b/services/gateway/.prettierrc @@ -0,0 +1,4 @@ +{ + "printWidth": 120, + "trailingComma": "all" +} \ No newline at end of file diff --git a/services/gateway/package-lock.json b/services/gateway/package-lock.json index 9f8565a9..f12f8cca 100644 --- a/services/gateway/package-lock.json +++ b/services/gateway/package-lock.json @@ -25,12 +25,17 @@ "@types/amqplib": "^0.10.1", "@types/google-protobuf": "^3.15.6", "@types/node": "^18.15.9", + "@typescript-eslint/eslint-plugin": "^6.4.1", "@vitest/coverage-c8": "^0.33.0", "esbuild": "^0.17.18", + "eslint": "^8.47.0", + "eslint-config-prettier": "^9.0.0", + "eslint-plugin-prettier": "^5.0.0", "grpc_tools_node_protoc_ts": "^5.3.3", "grpc-tools": "^1.12.4", "nodemon": "^3.0.1", "pkg": "^5.8.1", + "prettier": "3.0.2", "ts-node": "10.9.1", "tsconfig-paths": "^4.2.0", "typescript": "5.0.2", @@ -39,6 +44,15 @@ "vitest-mock-extended": "^1.1.4" } }, + "node_modules/@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/@ampproject/remapping": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", @@ -154,6 +168,74 @@ "node": ">=12" } }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.7.0.tgz", + "integrity": "sha512-+HencqxU7CFJnQb7IKtuNBqS6Yx3Tz4kOL8BJXo+JyeiBm5MEX6pO8onXDkjrkCRlfYXS1Axro15ZjVFe9YgsA==", + "dev": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.2.tgz", + "integrity": "sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/js": { + "version": "8.47.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.47.0.tgz", + "integrity": "sha512-P6omY1zv5MItm93kLM8s2vr1HICJH8v0dvddDhysbIuZ+vcjOHg5Zbkf1mTkcmi2JA9oBG2anOkRnW8WJTS8Og==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, "node_modules/@grpc/grpc-js": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.9.0.tgz", @@ -222,6 +304,39 @@ "node": ">=12" } }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.10.tgz", + "integrity": "sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==", + "dev": true, + "dependencies": { + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "dev": true + }, "node_modules/@istanbuljs/schema": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", @@ -352,6 +467,26 @@ "node": ">= 8" } }, + "node_modules/@pkgr/utils": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/@pkgr/utils/-/utils-2.4.2.tgz", + "integrity": "sha512-POgTXhjrTfbTV63DiFXav4lBHiICLKKwDeaKn9Nphwj7WH6m0hMMCaJkMyRWjgtPFyRKRVoMXXjczsTQRDEhYw==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "fast-glob": "^3.3.0", + "is-glob": "^4.0.3", + "open": "^9.1.0", + "picocolors": "^1.0.0", + "tslib": "^2.6.0" + }, + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" + } + }, "node_modules/@protobufjs/aspromise": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", @@ -516,6 +651,12 @@ "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", "dev": true }, + "node_modules/@types/json-schema": { + "version": "7.0.12", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.12.tgz", + "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==", + "dev": true + }, "node_modules/@types/long": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz", @@ -541,6 +682,12 @@ "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==" }, + "node_modules/@types/semver": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.0.tgz", + "integrity": "sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==", + "dev": true + }, "node_modules/@types/send": { "version": "0.17.1", "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.1.tgz", @@ -560,6 +707,196 @@ "@types/node": "*" } }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.4.1.tgz", + "integrity": "sha512-3F5PtBzUW0dYlq77Lcqo13fv+58KDwUib3BddilE8ajPJT+faGgxmI9Sw+I8ZS22BYwoir9ZhNXcLi+S+I2bkw==", + "dev": true, + "dependencies": { + "@eslint-community/regexpp": "^4.5.1", + "@typescript-eslint/scope-manager": "6.4.1", + "@typescript-eslint/type-utils": "6.4.1", + "@typescript-eslint/utils": "6.4.1", + "@typescript-eslint/visitor-keys": "6.4.1", + "debug": "^4.3.4", + "graphemer": "^1.4.0", + "ignore": "^5.2.4", + "natural-compare": "^1.4.0", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha", + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.4.1.tgz", + "integrity": "sha512-610G6KHymg9V7EqOaNBMtD1GgpAmGROsmfHJPXNLCU9bfIuLrkdOygltK784F6Crboyd5tBFayPB7Sf0McrQwg==", + "dev": true, + "peer": true, + "dependencies": { + "@typescript-eslint/scope-manager": "6.4.1", + "@typescript-eslint/types": "6.4.1", + "@typescript-eslint/typescript-estree": "6.4.1", + "@typescript-eslint/visitor-keys": "6.4.1", + "debug": "^4.3.4" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.4.1.tgz", + "integrity": "sha512-p/OavqOQfm4/Hdrr7kvacOSFjwQ2rrDVJRPxt/o0TOWdFnjJptnjnZ+sYDR7fi4OimvIuKp+2LCkc+rt9fIW+A==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.4.1", + "@typescript-eslint/visitor-keys": "6.4.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.4.1.tgz", + "integrity": "sha512-7ON8M8NXh73SGZ5XvIqWHjgX2f+vvaOarNliGhjrJnv1vdjG0LVIz+ToYfPirOoBi56jxAKLfsLm40+RvxVVXA==", + "dev": true, + "dependencies": { + "@typescript-eslint/typescript-estree": "6.4.1", + "@typescript-eslint/utils": "6.4.1", + "debug": "^4.3.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/types": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.4.1.tgz", + "integrity": "sha512-zAAopbNuYu++ijY1GV2ylCsQsi3B8QvfPHVqhGdDcbx/NK5lkqMnCGU53amAjccSpk+LfeONxwzUhDzArSfZJg==", + "dev": true, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.4.1.tgz", + "integrity": "sha512-xF6Y7SatVE/OyV93h1xGgfOkHr2iXuo8ip0gbfzaKeGGuKiAnzS+HtVhSPx8Www243bwlW8IF7X0/B62SzFftg==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.4.1", + "@typescript-eslint/visitor-keys": "6.4.1", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.4.1.tgz", + "integrity": "sha512-F/6r2RieNeorU0zhqZNv89s9bDZSovv3bZQpUNOmmQK1L80/cV4KEu95YUJWi75u5PhboFoKUJBnZ4FQcoqhDw==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@types/json-schema": "^7.0.12", + "@types/semver": "^7.5.0", + "@typescript-eslint/scope-manager": "6.4.1", + "@typescript-eslint/types": "6.4.1", + "@typescript-eslint/typescript-estree": "6.4.1", + "semver": "^7.5.4" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.4.1.tgz", + "integrity": "sha512-y/TyRJsbZPkJIZQXrHfdnxVnxyKegnpEvnRGNam7s3TRR2ykGefEWOhaef00/UUN3IZxizS7BTO3svd3lCOJRQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.4.1", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, "node_modules/@vitest/coverage-c8": { "version": "0.33.0", "resolved": "https://registry.npmjs.org/@vitest/coverage-c8/-/coverage-c8-0.33.0.tgz", @@ -704,6 +1041,15 @@ "node": ">=0.4.0" } }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, "node_modules/acorn-walk": { "version": "8.2.0", "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", @@ -725,6 +1071,22 @@ "node": ">= 6.0.0" } }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, "node_modules/ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", @@ -785,6 +1147,12 @@ "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", "dev": true }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, "node_modules/array-flatten": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", @@ -857,6 +1225,15 @@ } ] }, + "node_modules/big-integer": { + "version": "1.6.51", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz", + "integrity": "sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==", + "dev": true, + "engines": { + "node": ">=0.6" + } + }, "node_modules/binary-extensions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", @@ -913,6 +1290,18 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, + "node_modules/bplist-parser": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.2.0.tgz", + "integrity": "sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==", + "dev": true, + "dependencies": { + "big-integer": "^1.6.44" + }, + "engines": { + "node": ">= 5.10.0" + } + }, "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -958,6 +1347,21 @@ "ieee754": "^1.1.13" } }, + "node_modules/bundle-name": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-3.0.0.tgz", + "integrity": "sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw==", + "dev": true, + "dependencies": { + "run-applescript": "^5.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/bytes": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", @@ -1013,6 +1417,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/chai": { "version": "4.3.7", "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.7.tgz", @@ -1267,6 +1680,12 @@ "node": ">=4.0.0" } }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, "node_modules/deepmerge": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", @@ -1275,6 +1694,52 @@ "node": ">=0.10.0" } }, + "node_modules/default-browser": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-4.0.0.tgz", + "integrity": "sha512-wX5pXO1+BrhMkSbROFsyxUm0i/cJEScyNhA4PPxc41ICuv05ZZB/MX28s8aZx6xjmatvebIapF6hLEKEcpneUA==", + "dev": true, + "dependencies": { + "bundle-name": "^3.0.0", + "default-browser-id": "^3.0.0", + "execa": "^7.1.1", + "titleize": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser-id": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-3.0.0.tgz", + "integrity": "sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA==", + "dev": true, + "dependencies": { + "bplist-parser": "^0.2.0", + "untildify": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/define-lazy-prop": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", + "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -1345,6 +1810,18 @@ "node": ">=8" } }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/dotenv": { "version": "16.3.1", "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.3.1.tgz", @@ -1433,6 +1910,230 @@ "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "8.47.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.47.0.tgz", + "integrity": "sha512-spUQWrdPt+pRVP1TTJLmfRNJJHHZryFmptzcafwSvHsceV81djHOdnEeDmkdotZyLNjDhrOasNK8nikkoG1O8Q==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.2", + "@eslint/js": "^8.47.0", + "@humanwhocodes/config-array": "^0.11.10", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "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" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-config-prettier": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.0.0.tgz", + "integrity": "sha512-IcJsTkJae2S35pRsRAwoCE+925rJJStOdkKnLVgtE+tEpqU0EVVM7OqrwxqgptKdX29NUwC82I5pXsGFIgSevw==", + "dev": true, + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/eslint-plugin-prettier": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.0.0.tgz", + "integrity": "sha512-AgaZCVuYDXHUGxj/ZGu1u8H8CYgDY3iG6w5kUFw4AzMVXzB7VvbKgYR4nATIN+OvUrghMbiDLeimVjVY5ilq3w==", + "dev": true, + "dependencies": { + "prettier-linter-helpers": "^1.0.0", + "synckit": "^0.8.5" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/prettier" + }, + "peerDependencies": { + "@types/eslint": ">=8.0.0", + "eslint": ">=8.0.0", + "prettier": ">=3.0.0" + }, + "peerDependenciesMeta": { + "@types/eslint": { + "optional": true + }, + "eslint-config-prettier": { + "optional": true + } + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/eslint/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esquery/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/etag": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", @@ -1441,6 +2142,29 @@ "node": ">= 0.6" } }, + "node_modules/execa": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-7.2.0.tgz", + "integrity": "sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.1", + "human-signals": "^4.3.0", + "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" + }, + "engines": { + "node": "^14.18.0 || ^16.14.0 || >=18.0.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, "node_modules/expand-template": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", @@ -1541,6 +2265,18 @@ "node": ">= 0.8" } }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/fast-diff": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", + "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", + "dev": true + }, "node_modules/fast-glob": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.0.tgz", @@ -1557,6 +2293,18 @@ "node": ">=8.6.0" } }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, "node_modules/fastq": { "version": "1.15.0", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", @@ -1566,6 +2314,18 @@ "reusify": "^1.0.4" } }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, "node_modules/fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", @@ -1624,6 +2384,25 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dev": true, + "dependencies": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", + "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", + "dev": true + }, "node_modules/follow-redirects": { "version": "1.15.2", "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", @@ -1831,6 +2610,18 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/github-from-package": { "version": "0.0.0", "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", @@ -1868,6 +2659,21 @@ "node": ">= 6" } }, + "node_modules/globals": { + "version": "13.21.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.21.0.tgz", + "integrity": "sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/globby": { "version": "11.1.0", "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", @@ -1905,6 +2711,12 @@ "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", "dev": true }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true + }, "node_modules/grpc_tools_node_protoc_ts": { "version": "5.3.3", "resolved": "https://registry.npmjs.org/grpc_tools_node_protoc_ts/-/grpc_tools_node_protoc_ts-5.3.3.tgz", @@ -2041,6 +2853,15 @@ "node": ">= 6" } }, + "node_modules/human-signals": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz", + "integrity": "sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==", + "dev": true, + "engines": { + "node": ">=14.18.0" + } + }, "node_modules/iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", @@ -2087,6 +2908,31 @@ "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==", "dev": true }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, "node_modules/inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -2155,6 +3001,21 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-docker": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", + "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", + "dev": true, + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -2184,6 +3045,24 @@ "node": ">=0.10.0" } }, + "node_modules/is-inside-container": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", + "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", + "dev": true, + "dependencies": { + "is-docker": "^3.0.0" + }, + "bin": { + "is-inside-container": "cli.js" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", @@ -2193,6 +3072,54 @@ "node": ">=0.12.0" } }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-wsl/node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "dev": true, + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", @@ -2241,6 +3168,18 @@ "node": ">=8" } }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, "node_modules/jsesc": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", @@ -2253,6 +3192,18 @@ "node": ">=4" } }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true + }, "node_modules/json5": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", @@ -2282,6 +3233,19 @@ "graceful-fs": "^4.1.6" } }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/local-pkg": { "version": "0.4.3", "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.4.3.tgz", @@ -2314,6 +3278,12 @@ "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==" }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, "node_modules/long": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", @@ -2395,6 +3365,12 @@ "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, "node_modules/merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", @@ -2455,6 +3431,18 @@ "node": ">= 0.6" } }, + "node_modules/mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/mimic-response": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", @@ -2605,6 +3593,12 @@ "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==", "dev": true }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, "node_modules/negotiator": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", @@ -2733,6 +3727,33 @@ "node": ">=0.10.0" } }, + "node_modules/npm-run-path": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", + "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==", + "dev": true, + "dependencies": { + "path-key": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm-run-path/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/npmlog": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", @@ -2781,6 +3802,56 @@ "wrappy": "1" } }, + "node_modules/onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "dev": true, + "dependencies": { + "mimic-fn": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/open": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/open/-/open-9.1.0.tgz", + "integrity": "sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg==", + "dev": true, + "dependencies": { + "default-browser": "^4.0.0", + "define-lazy-prop": "^3.0.0", + "is-inside-container": "^1.0.0", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/optionator": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", + "dev": true, + "dependencies": { + "@aashutoshrathi/word-wrap": "^1.2.3", + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/p-is-promise": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-3.0.0.tgz", @@ -2820,6 +3891,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", @@ -3024,6 +4107,42 @@ "node": ">=10" } }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prettier": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.0.2.tgz", + "integrity": "sha512-o2YR9qtniXvwEZlOKbveKfDQVyqxbEIWn48Z8m3ZJjBjcCmUy3xZGIv+7AkaeuaTr6yPXJjwv07ZWlsWbEy1rQ==", + "dev": true, + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/prettier-linter-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "dev": true, + "dependencies": { + "fast-diff": "^1.1.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/pretty-format": { "version": "29.6.1", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.1.tgz", @@ -3126,6 +4245,15 @@ "once": "^1.3.1" } }, + "node_modules/punycode": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/qs": { "version": "6.11.0", "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", @@ -3254,6 +4382,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, "node_modules/resolve/node_modules/is-core-module": { "version": "2.12.1", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz", @@ -3307,6 +4444,110 @@ "fsevents": "~2.3.2" } }, + "node_modules/run-applescript": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-5.0.0.tgz", + "integrity": "sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg==", + "dev": true, + "dependencies": { + "execa": "^5.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/run-applescript/node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/run-applescript/node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/run-applescript/node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/run-applescript/node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/run-applescript/node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/run-applescript/node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/run-applescript/node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", @@ -3659,11 +4900,23 @@ }, "node_modules/strip-bom": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-final-newline": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", "dev": true, "engines": { - "node": ">=4" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/strip-json-comments": { @@ -3733,6 +4986,22 @@ "node": ">=0.4.0" } }, + "node_modules/synckit": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.8.5.tgz", + "integrity": "sha512-L1dapNV6vu2s/4Sputv8xGsCdAVlb5nRDMFU/E27D44l5U6cw1g0dGd45uLc+OXjNMmF4ntiMdCimzcjFKQI8Q==", + "dev": true, + "dependencies": { + "@pkgr/utils": "^2.3.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" + } + }, "node_modules/tar": { "version": "6.1.15", "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.15.tgz", @@ -3798,6 +5067,12 @@ "node": ">=8" } }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true + }, "node_modules/tinybench": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.5.0.tgz", @@ -3822,6 +5097,18 @@ "node": ">=14.0.0" } }, + "node_modules/titleize": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/titleize/-/titleize-3.0.0.tgz", + "integrity": "sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", @@ -3884,6 +5171,18 @@ "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", "dev": true }, + "node_modules/ts-api-utils": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.2.tgz", + "integrity": "sha512-Cbu4nIqnEdd+THNEsBdkolnOXhg0I8XteoHaEKgvsxpsbWda4IsUut2c187HxywQCvveojow0Dgw/amxtSKVkQ==", + "dev": true, + "engines": { + "node": ">=16.13.0" + }, + "peerDependencies": { + "typescript": ">=4.2.0" + } + }, "node_modules/ts-essentials": { "version": "9.3.2", "resolved": "https://registry.npmjs.org/ts-essentials/-/ts-essentials-9.3.2.tgz", @@ -3950,6 +5249,12 @@ "node": ">=6" } }, + "node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true + }, "node_modules/tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", @@ -3962,6 +5267,18 @@ "node": "*" } }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/type-detect": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", @@ -3971,6 +5288,18 @@ "node": ">=4" } }, + "node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/type-is": { "version": "1.6.18", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", @@ -4038,6 +5367,24 @@ "node": ">= 0.8" } }, + "node_modules/untildify": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", + "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -4502,6 +5849,12 @@ } }, "dependencies": { + "@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", + "dev": true + }, "@ampproject/remapping": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", @@ -4586,6 +5939,52 @@ "dev": true, "optional": true }, + "@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^3.3.0" + } + }, + "@eslint-community/regexpp": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.7.0.tgz", + "integrity": "sha512-+HencqxU7CFJnQb7IKtuNBqS6Yx3Tz4kOL8BJXo+JyeiBm5MEX6pO8onXDkjrkCRlfYXS1Axro15ZjVFe9YgsA==", + "dev": true + }, + "@eslint/eslintrc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.2.tgz", + "integrity": "sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==", + "dev": true, + "requires": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "dependencies": { + "strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true + } + } + }, + "@eslint/js": { + "version": "8.47.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.47.0.tgz", + "integrity": "sha512-P6omY1zv5MItm93kLM8s2vr1HICJH8v0dvddDhysbIuZ+vcjOHg5Zbkf1mTkcmi2JA9oBG2anOkRnW8WJTS8Og==", + "dev": true + }, "@grpc/grpc-js": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.9.0.tgz", @@ -4638,6 +6037,29 @@ } } }, + "@humanwhocodes/config-array": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.10.tgz", + "integrity": "sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==", + "dev": true, + "requires": { + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.1", + "minimatch": "^3.0.5" + } + }, + "@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true + }, + "@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "dev": true + }, "@istanbuljs/schema": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", @@ -4743,6 +6165,20 @@ "fastq": "^1.6.0" } }, + "@pkgr/utils": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/@pkgr/utils/-/utils-2.4.2.tgz", + "integrity": "sha512-POgTXhjrTfbTV63DiFXav4lBHiICLKKwDeaKn9Nphwj7WH6m0hMMCaJkMyRWjgtPFyRKRVoMXXjczsTQRDEhYw==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.3", + "fast-glob": "^3.3.0", + "is-glob": "^4.0.3", + "open": "^9.1.0", + "picocolors": "^1.0.0", + "tslib": "^2.6.0" + } + }, "@protobufjs/aspromise": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", @@ -4907,6 +6343,12 @@ "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", "dev": true }, + "@types/json-schema": { + "version": "7.0.12", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.12.tgz", + "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==", + "dev": true + }, "@types/long": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz", @@ -4932,6 +6374,12 @@ "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==" }, + "@types/semver": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.0.tgz", + "integrity": "sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==", + "dev": true + }, "@types/send": { "version": "0.17.1", "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.1.tgz", @@ -4951,6 +6399,107 @@ "@types/node": "*" } }, + "@typescript-eslint/eslint-plugin": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.4.1.tgz", + "integrity": "sha512-3F5PtBzUW0dYlq77Lcqo13fv+58KDwUib3BddilE8ajPJT+faGgxmI9Sw+I8ZS22BYwoir9ZhNXcLi+S+I2bkw==", + "dev": true, + "requires": { + "@eslint-community/regexpp": "^4.5.1", + "@typescript-eslint/scope-manager": "6.4.1", + "@typescript-eslint/type-utils": "6.4.1", + "@typescript-eslint/utils": "6.4.1", + "@typescript-eslint/visitor-keys": "6.4.1", + "debug": "^4.3.4", + "graphemer": "^1.4.0", + "ignore": "^5.2.4", + "natural-compare": "^1.4.0", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + } + }, + "@typescript-eslint/parser": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.4.1.tgz", + "integrity": "sha512-610G6KHymg9V7EqOaNBMtD1GgpAmGROsmfHJPXNLCU9bfIuLrkdOygltK784F6Crboyd5tBFayPB7Sf0McrQwg==", + "dev": true, + "peer": true, + "requires": { + "@typescript-eslint/scope-manager": "6.4.1", + "@typescript-eslint/types": "6.4.1", + "@typescript-eslint/typescript-estree": "6.4.1", + "@typescript-eslint/visitor-keys": "6.4.1", + "debug": "^4.3.4" + } + }, + "@typescript-eslint/scope-manager": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.4.1.tgz", + "integrity": "sha512-p/OavqOQfm4/Hdrr7kvacOSFjwQ2rrDVJRPxt/o0TOWdFnjJptnjnZ+sYDR7fi4OimvIuKp+2LCkc+rt9fIW+A==", + "dev": true, + "requires": { + "@typescript-eslint/types": "6.4.1", + "@typescript-eslint/visitor-keys": "6.4.1" + } + }, + "@typescript-eslint/type-utils": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.4.1.tgz", + "integrity": "sha512-7ON8M8NXh73SGZ5XvIqWHjgX2f+vvaOarNliGhjrJnv1vdjG0LVIz+ToYfPirOoBi56jxAKLfsLm40+RvxVVXA==", + "dev": true, + "requires": { + "@typescript-eslint/typescript-estree": "6.4.1", + "@typescript-eslint/utils": "6.4.1", + "debug": "^4.3.4", + "ts-api-utils": "^1.0.1" + } + }, + "@typescript-eslint/types": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.4.1.tgz", + "integrity": "sha512-zAAopbNuYu++ijY1GV2ylCsQsi3B8QvfPHVqhGdDcbx/NK5lkqMnCGU53amAjccSpk+LfeONxwzUhDzArSfZJg==", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.4.1.tgz", + "integrity": "sha512-xF6Y7SatVE/OyV93h1xGgfOkHr2iXuo8ip0gbfzaKeGGuKiAnzS+HtVhSPx8Www243bwlW8IF7X0/B62SzFftg==", + "dev": true, + "requires": { + "@typescript-eslint/types": "6.4.1", + "@typescript-eslint/visitor-keys": "6.4.1", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + } + }, + "@typescript-eslint/utils": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.4.1.tgz", + "integrity": "sha512-F/6r2RieNeorU0zhqZNv89s9bDZSovv3bZQpUNOmmQK1L80/cV4KEu95YUJWi75u5PhboFoKUJBnZ4FQcoqhDw==", + "dev": true, + "requires": { + "@eslint-community/eslint-utils": "^4.4.0", + "@types/json-schema": "^7.0.12", + "@types/semver": "^7.5.0", + "@typescript-eslint/scope-manager": "6.4.1", + "@typescript-eslint/types": "6.4.1", + "@typescript-eslint/typescript-estree": "6.4.1", + "semver": "^7.5.4" + } + }, + "@typescript-eslint/visitor-keys": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.4.1.tgz", + "integrity": "sha512-y/TyRJsbZPkJIZQXrHfdnxVnxyKegnpEvnRGNam7s3TRR2ykGefEWOhaef00/UUN3IZxizS7BTO3svd3lCOJRQ==", + "dev": true, + "requires": { + "@typescript-eslint/types": "6.4.1", + "eslint-visitor-keys": "^3.4.1" + } + }, "@vitest/coverage-c8": { "version": "0.33.0", "resolved": "https://registry.npmjs.org/@vitest/coverage-c8/-/coverage-c8-0.33.0.tgz", @@ -5055,6 +6604,13 @@ "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", "dev": true }, + "acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "requires": {} + }, "acorn-walk": { "version": "8.2.0", "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", @@ -5070,6 +6626,18 @@ "debug": "4" } }, + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, "ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", @@ -5115,6 +6683,12 @@ "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", "dev": true }, + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, "array-flatten": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", @@ -5164,6 +6738,12 @@ "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", "dev": true }, + "big-integer": { + "version": "1.6.51", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz", + "integrity": "sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==", + "dev": true + }, "binary-extensions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", @@ -5215,6 +6795,15 @@ } } }, + "bplist-parser": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.2.0.tgz", + "integrity": "sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==", + "dev": true, + "requires": { + "big-integer": "^1.6.44" + } + }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -5243,6 +6832,15 @@ "ieee754": "^1.1.13" } }, + "bundle-name": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-3.0.0.tgz", + "integrity": "sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw==", + "dev": true, + "requires": { + "run-applescript": "^5.0.0" + } + }, "bytes": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", @@ -5283,6 +6881,12 @@ "get-intrinsic": "^1.0.2" } }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true + }, "chai": { "version": "4.3.7", "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.7.tgz", @@ -5470,11 +7074,45 @@ "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", "dev": true }, + "deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, "deepmerge": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==" }, + "default-browser": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-4.0.0.tgz", + "integrity": "sha512-wX5pXO1+BrhMkSbROFsyxUm0i/cJEScyNhA4PPxc41ICuv05ZZB/MX28s8aZx6xjmatvebIapF6hLEKEcpneUA==", + "dev": true, + "requires": { + "bundle-name": "^3.0.0", + "default-browser-id": "^3.0.0", + "execa": "^7.1.1", + "titleize": "^3.0.0" + } + }, + "default-browser-id": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-3.0.0.tgz", + "integrity": "sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA==", + "dev": true, + "requires": { + "bplist-parser": "^0.2.0", + "untildify": "^4.0.0" + } + }, + "define-lazy-prop": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", + "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", + "dev": true + }, "delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -5523,6 +7161,15 @@ "path-type": "^4.0.0" } }, + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, "dotenv": { "version": "16.3.1", "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.3.1.tgz", @@ -5549,54 +7196,223 @@ "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", "dev": true, "requires": { - "once": "^1.4.0" + "once": "^1.4.0" + } + }, + "esbuild": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.19.tgz", + "integrity": "sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==", + "dev": true, + "requires": { + "@esbuild/android-arm": "0.17.19", + "@esbuild/android-arm64": "0.17.19", + "@esbuild/android-x64": "0.17.19", + "@esbuild/darwin-arm64": "0.17.19", + "@esbuild/darwin-x64": "0.17.19", + "@esbuild/freebsd-arm64": "0.17.19", + "@esbuild/freebsd-x64": "0.17.19", + "@esbuild/linux-arm": "0.17.19", + "@esbuild/linux-arm64": "0.17.19", + "@esbuild/linux-ia32": "0.17.19", + "@esbuild/linux-loong64": "0.17.19", + "@esbuild/linux-mips64el": "0.17.19", + "@esbuild/linux-ppc64": "0.17.19", + "@esbuild/linux-riscv64": "0.17.19", + "@esbuild/linux-s390x": "0.17.19", + "@esbuild/linux-x64": "0.17.19", + "@esbuild/netbsd-x64": "0.17.19", + "@esbuild/openbsd-x64": "0.17.19", + "@esbuild/sunos-x64": "0.17.19", + "@esbuild/win32-arm64": "0.17.19", + "@esbuild/win32-ia32": "0.17.19", + "@esbuild/win32-x64": "0.17.19" + } + }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + }, + "escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true + }, + "eslint": { + "version": "8.47.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.47.0.tgz", + "integrity": "sha512-spUQWrdPt+pRVP1TTJLmfRNJJHHZryFmptzcafwSvHsceV81djHOdnEeDmkdotZyLNjDhrOasNK8nikkoG1O8Q==", + "dev": true, + "requires": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.2", + "@eslint/js": "^8.47.0", + "@humanwhocodes/config-array": "^0.11.10", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "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" + }, + "dependencies": { + "eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + } + }, + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + }, + "glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "requires": { + "is-glob": "^4.0.3" + } + } + } + }, + "eslint-config-prettier": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.0.0.tgz", + "integrity": "sha512-IcJsTkJae2S35pRsRAwoCE+925rJJStOdkKnLVgtE+tEpqU0EVVM7OqrwxqgptKdX29NUwC82I5pXsGFIgSevw==", + "dev": true, + "requires": {} + }, + "eslint-plugin-prettier": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.0.0.tgz", + "integrity": "sha512-AgaZCVuYDXHUGxj/ZGu1u8H8CYgDY3iG6w5kUFw4AzMVXzB7VvbKgYR4nATIN+OvUrghMbiDLeimVjVY5ilq3w==", + "dev": true, + "requires": { + "prettier-linter-helpers": "^1.0.0", + "synckit": "^0.8.5" + } + }, + "eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true + }, + "espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "requires": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" } }, - "esbuild": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.19.tgz", - "integrity": "sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==", + "esquery": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", "dev": true, "requires": { - "@esbuild/android-arm": "0.17.19", - "@esbuild/android-arm64": "0.17.19", - "@esbuild/android-x64": "0.17.19", - "@esbuild/darwin-arm64": "0.17.19", - "@esbuild/darwin-x64": "0.17.19", - "@esbuild/freebsd-arm64": "0.17.19", - "@esbuild/freebsd-x64": "0.17.19", - "@esbuild/linux-arm": "0.17.19", - "@esbuild/linux-arm64": "0.17.19", - "@esbuild/linux-ia32": "0.17.19", - "@esbuild/linux-loong64": "0.17.19", - "@esbuild/linux-mips64el": "0.17.19", - "@esbuild/linux-ppc64": "0.17.19", - "@esbuild/linux-riscv64": "0.17.19", - "@esbuild/linux-s390x": "0.17.19", - "@esbuild/linux-x64": "0.17.19", - "@esbuild/netbsd-x64": "0.17.19", - "@esbuild/openbsd-x64": "0.17.19", - "@esbuild/sunos-x64": "0.17.19", - "@esbuild/win32-arm64": "0.17.19", - "@esbuild/win32-ia32": "0.17.19", - "@esbuild/win32-x64": "0.17.19" + "estraverse": "^5.1.0" + }, + "dependencies": { + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + } } }, - "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" + "esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "requires": { + "estraverse": "^5.2.0" + }, + "dependencies": { + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + } + } }, - "escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true }, "etag": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==" }, + "execa": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-7.2.0.tgz", + "integrity": "sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.1", + "human-signals": "^4.3.0", + "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" + } + }, "expand-template": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", @@ -5686,6 +7502,18 @@ } } }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "fast-diff": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", + "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", + "dev": true + }, "fast-glob": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.0.tgz", @@ -5699,6 +7527,18 @@ "micromatch": "^4.0.4" } }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, "fastq": { "version": "1.15.0", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", @@ -5708,6 +7548,15 @@ "reusify": "^1.0.4" } }, + "file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "requires": { + "flat-cache": "^3.0.4" + } + }, "fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", @@ -5756,6 +7605,22 @@ "path-exists": "^4.0.0" } }, + "flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dev": true, + "requires": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + } + }, + "flatted": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", + "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", + "dev": true + }, "follow-redirects": { "version": "1.15.2", "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", @@ -5920,6 +7785,12 @@ "has-symbols": "^1.0.3" } }, + "get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true + }, "github-from-package": { "version": "0.0.0", "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", @@ -5948,6 +7819,15 @@ "is-glob": "^4.0.1" } }, + "globals": { + "version": "13.21.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.21.0.tgz", + "integrity": "sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg==", + "dev": true, + "requires": { + "type-fest": "^0.20.2" + } + }, "globby": { "version": "11.1.0", "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", @@ -5979,6 +7859,12 @@ "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", "dev": true }, + "graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true + }, "grpc_tools_node_protoc_ts": { "version": "5.3.3", "resolved": "https://registry.npmjs.org/grpc_tools_node_protoc_ts/-/grpc_tools_node_protoc_ts-5.3.3.tgz", @@ -6077,6 +7963,12 @@ "debug": "4" } }, + "human-signals": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz", + "integrity": "sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==", + "dev": true + }, "iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", @@ -6103,6 +7995,22 @@ "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==", "dev": true }, + "import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true + }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -6156,6 +8064,12 @@ "has": "^1.0.3" } }, + "is-docker": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", + "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", + "dev": true + }, "is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -6176,12 +8090,50 @@ "is-extglob": "^2.1.1" } }, + "is-inside-container": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", + "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", + "dev": true, + "requires": { + "is-docker": "^3.0.0" + } + }, "is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true }, + "is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true + }, + "is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "dev": true + }, + "is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "requires": { + "is-docker": "^2.0.0" + }, + "dependencies": { + "is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "dev": true + } + } + }, "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", @@ -6221,12 +8173,33 @@ "istanbul-lib-report": "^3.0.0" } }, + "js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "requires": { + "argparse": "^2.0.1" + } + }, "jsesc": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", "dev": true }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true + }, "json5": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", @@ -6248,6 +8221,16 @@ "universalify": "^2.0.0" } }, + "levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + } + }, "local-pkg": { "version": "0.4.3", "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.4.3.tgz", @@ -6268,6 +8251,12 @@ "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==" }, + "lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, "long": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", @@ -6333,6 +8322,12 @@ "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" }, + "merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, "merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", @@ -6372,6 +8367,12 @@ "mime-db": "1.52.0" } }, + "mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "dev": true + }, "mimic-response": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", @@ -6471,6 +8472,12 @@ "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==", "dev": true }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, "negotiator": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", @@ -6559,6 +8566,23 @@ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "dev": true }, + "npm-run-path": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", + "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==", + "dev": true, + "requires": { + "path-key": "^4.0.0" + }, + "dependencies": { + "path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "dev": true + } + } + }, "npmlog": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", @@ -6598,6 +8622,41 @@ "wrappy": "1" } }, + "onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "dev": true, + "requires": { + "mimic-fn": "^4.0.0" + } + }, + "open": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/open/-/open-9.1.0.tgz", + "integrity": "sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg==", + "dev": true, + "requires": { + "default-browser": "^4.0.0", + "define-lazy-prop": "^3.0.0", + "is-inside-container": "^1.0.0", + "is-wsl": "^2.2.0" + } + }, + "optionator": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", + "dev": true, + "requires": { + "@aashutoshrathi/word-wrap": "^1.2.3", + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0" + } + }, "p-is-promise": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-3.0.0.tgz", @@ -6622,6 +8681,15 @@ "p-limit": "^3.0.2" } }, + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "requires": { + "callsites": "^3.0.0" + } + }, "parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", @@ -6765,6 +8833,27 @@ "tunnel-agent": "^0.6.0" } }, + "prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true + }, + "prettier": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.0.2.tgz", + "integrity": "sha512-o2YR9qtniXvwEZlOKbveKfDQVyqxbEIWn48Z8m3ZJjBjcCmUy3xZGIv+7AkaeuaTr6yPXJjwv07ZWlsWbEy1rQ==", + "dev": true + }, + "prettier-linter-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "dev": true, + "requires": { + "fast-diff": "^1.1.2" + } + }, "pretty-format": { "version": "29.6.1", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.1.tgz", @@ -6852,6 +8941,12 @@ "once": "^1.3.1" } }, + "punycode": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "dev": true + }, "qs": { "version": "6.11.0", "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", @@ -6947,6 +9042,12 @@ } } }, + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true + }, "reusify": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", @@ -6971,6 +9072,76 @@ "fsevents": "~2.3.2" } }, + "run-applescript": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-5.0.0.tgz", + "integrity": "sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg==", + "dev": true, + "requires": { + "execa": "^5.0.0" + }, + "dependencies": { + "execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + } + }, + "human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true + }, + "is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + }, + "npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "requires": { + "path-key": "^3.0.0" + } + }, + "onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true + } + } + }, "run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", @@ -7235,6 +9406,12 @@ "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", "dev": true }, + "strip-final-newline": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "dev": true + }, "strip-json-comments": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", @@ -7283,6 +9460,16 @@ } } }, + "synckit": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.8.5.tgz", + "integrity": "sha512-L1dapNV6vu2s/4Sputv8xGsCdAVlb5nRDMFU/E27D44l5U6cw1g0dGd45uLc+OXjNMmF4ntiMdCimzcjFKQI8Q==", + "dev": true, + "requires": { + "@pkgr/utils": "^2.3.1", + "tslib": "^2.5.0" + } + }, "tar": { "version": "6.1.15", "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.15.tgz", @@ -7341,6 +9528,12 @@ "minimatch": "^3.0.4" } }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true + }, "tinybench": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.5.0.tgz", @@ -7359,6 +9552,12 @@ "integrity": "sha512-XPJL2uSzcOyBMky6OFrusqWlzfFrXtE0hPuMgW8A2HmaqrPo4ZQHRN/V0QXN3FSjKxpsbRrFc5LI7KOwBsT1/w==", "dev": true }, + "titleize": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/titleize/-/titleize-3.0.0.tgz", + "integrity": "sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ==", + "dev": true + }, "to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", @@ -7405,6 +9604,13 @@ "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", "dev": true }, + "ts-api-utils": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.2.tgz", + "integrity": "sha512-Cbu4nIqnEdd+THNEsBdkolnOXhg0I8XteoHaEKgvsxpsbWda4IsUut2c187HxywQCvveojow0Dgw/amxtSKVkQ==", + "dev": true, + "requires": {} + }, "ts-essentials": { "version": "9.3.2", "resolved": "https://registry.npmjs.org/ts-essentials/-/ts-essentials-9.3.2.tgz", @@ -7444,6 +9650,12 @@ "strip-bom": "^3.0.0" } }, + "tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true + }, "tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", @@ -7453,12 +9665,27 @@ "safe-buffer": "^5.0.1" } }, + "type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1" + } + }, "type-detect": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", "dev": true }, + "type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true + }, "type-is": { "version": "1.6.18", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", @@ -7504,6 +9731,21 @@ "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==" }, + "untildify": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", + "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", + "dev": true + }, + "uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", diff --git a/services/gateway/package.json b/services/gateway/package.json index 3701cf5e..ff2e7aff 100644 --- a/services/gateway/package.json +++ b/services/gateway/package.json @@ -10,6 +10,8 @@ "coverage": "vitest --coverage", "generate:proto": "sh proto/build-protos.sh", "swagger": "node src/lib/swagger/swagger.utils.js", + "format": "prettier --write \"src/**/*.ts\"", + "lint": "eslint --ext .ts,.tsx .", "pkg": "pkg ." }, "dependencies": { @@ -26,12 +28,17 @@ "@types/amqplib": "^0.10.1", "@types/google-protobuf": "^3.15.6", "@types/node": "^18.15.9", + "@typescript-eslint/eslint-plugin": "^6.4.1", "@vitest/coverage-c8": "^0.33.0", "esbuild": "^0.17.18", + "eslint": "^8.47.0", + "eslint-config-prettier": "^9.0.0", + "eslint-plugin-prettier": "^5.0.0", "grpc_tools_node_protoc_ts": "^5.3.3", "grpc-tools": "^1.12.4", "nodemon": "^3.0.1", "pkg": "^5.8.1", + "prettier": "3.0.2", "ts-node": "10.9.1", "tsconfig-paths": "^4.2.0", "typescript": "5.0.2", From 8f832477569a551b8b9dcaea47667c600012a554 Mon Sep 17 00:00:00 2001 From: anatole Date: Thu, 24 Aug 2023 14:42:24 +0200 Subject: [PATCH 462/883] fix(gateway): fix create order route --- services/basket/src/types/basket.ts | 2 +- .../src/controller/order/order.controller.ts | 28 +++++++++---------- .../gateway/src/services/basket.service.ts | 22 +++++++-------- services/gateway/src/services/user.service.ts | 26 ++++++++--------- services/order/src/handlers/order/create.ts | 11 ++++---- 5 files changed, 44 insertions(+), 45 deletions(-) diff --git a/services/basket/src/types/basket.ts b/services/basket/src/types/basket.ts index f82c4f34..20c75f5e 100644 --- a/services/basket/src/types/basket.ts +++ b/services/basket/src/types/basket.ts @@ -7,7 +7,7 @@ export type ProductRequest = { export type UserId = { id: number; }; - +// todo: change to product minimum ({count: number, id: string, price: number}}}) export type Basket = { user_id: number; products_ids: string[]; diff --git a/services/gateway/src/controller/order/order.controller.ts b/services/gateway/src/controller/order/order.controller.ts index 5ba0049b..51e34d59 100644 --- a/services/gateway/src/controller/order/order.controller.ts +++ b/services/gateway/src/controller/order/order.controller.ts @@ -33,7 +33,7 @@ orderRoutes.get('/api/order/:id', (req: Request, res: Response) => { }); //TODO: to test this route with the user and basket service -orderRoutes.post('/api/order', (req: Request, res: Response) => { +orderRoutes.post('/api/order', async (req: Request, res: Response) => { /* #swagger.parameters['body'] = { in: 'body', required: true, @@ -48,15 +48,14 @@ orderRoutes.post('/api/order', (req: Request, res: Response) => { const {userId, paymentId, deliveryId, deliveryType, restaurantId} = req.body; let user: User | undefined = undefined; try { - user = getUser(Number(userId)); - } catch (e: any) { - res.status(500).send({error: e.message}); + user = await getUser(Number(userId)); + } catch (e) { + return res.status(500).send({error: e}); } - if (!user) { - res.status(404).send({error: "User not found"}); - return; - } + if (!user) + return res.status(404).send({error: "User not found"}); + const miniUser = new UserMinimum().setId(String(user.getId())) .setEmail(user.getEmail()) @@ -66,8 +65,8 @@ orderRoutes.post('/api/order', (req: Request, res: Response) => { let orderBasket: BasketSnapshot | undefined = undefined; try { - const basket = getBasketByUser(userId); - if (basket !== undefined) orderBasket = new BasketSnapshot().setString(basket.toString()); + const basket = (await getBasketByUser(userId))?.toObject(); + if (basket) orderBasket = new BasketSnapshot().setString(JSON.stringify(basket)); } catch (e: any) { res.status(500).send({error: e.message}); } @@ -81,11 +80,10 @@ orderRoutes.post('/api/order', (req: Request, res: Response) => { .setRestaurantId(restaurantId); orderService.createOrder(orderInput, (error, response) => { - if (error) { - res.status(500).send({error: error.message}); - } else { - res.json(response.toObject()); - } + if (error) + return res.status(500).send({error: error.message}); + else + return res.json(response.toObject()); }); }); diff --git a/services/gateway/src/services/basket.service.ts b/services/gateway/src/services/basket.service.ts index fbe3a3d4..15eb5681 100644 --- a/services/gateway/src/services/basket.service.ts +++ b/services/gateway/src/services/basket.service.ts @@ -1,16 +1,16 @@ import {basketServiceClient} from "@gateway/services/clients/basket.client"; import {Basket, UserId} from "@gateway/proto/basket_pb"; -export const getBasketByUser = (id: string): Basket | undefined => { +export const getBasketByUser = (id: string): Promise => { const userId = new UserId(); userId.setId(Number(id)); - let basket: Basket | undefined = undefined; - basketServiceClient.getBasket(userId, (error, response) => { - if (error) { - throw Error(error.message); - } else { - basket = response - } - }); - return basket; -} \ No newline at end of file + return new Promise((resolve, reject) => { + basketServiceClient.getBasket(userId, (error, response) => { + if (error) { + reject(error); + } else { + resolve(response) + } + }); + }) +} diff --git a/services/gateway/src/services/user.service.ts b/services/gateway/src/services/user.service.ts index 06328da1..4060a050 100644 --- a/services/gateway/src/services/user.service.ts +++ b/services/gateway/src/services/user.service.ts @@ -1,16 +1,16 @@ -import {User, UserId} from "@gateway/proto/user_pb"; -import {userServiceClient} from "@gateway/services/clients/user.client"; +import { User, UserId } from "@gateway/proto/user_pb"; +import { userServiceClient } from "@gateway/services/clients/user.client"; -export const getUser = (id: number): User | undefined => { +export const getUser = (id: number): Promise => { const userId = new UserId(); userId.setId(Number(id)); - let user: User | undefined = undefined; - userServiceClient.getUser(userId, (error, response) => { - if (error) { - throw Error(error.message); - } else { - user = response.getUser() - } - }); - return user; -} \ No newline at end of file + return new Promise((resolve, reject) => { + userServiceClient.getUser(userId, (error, response) => { + if (error) { + reject(error); + } else { + resolve(response.getUser()) + } + }); + }) +} diff --git a/services/order/src/handlers/order/create.ts b/services/order/src/handlers/order/create.ts index 06f5056e..dffe3d94 100644 --- a/services/order/src/handlers/order/create.ts +++ b/services/order/src/handlers/order/create.ts @@ -21,10 +21,10 @@ export const CreateOrder = async ( const json = // (parseStruct(basket_snapshot.json) || JSON.parse(basket_snapshot.string) as { - [key: string]: { count: number; price: number }; - }; - - const total = Object.values(json).reduce((acc, cur) => acc + cur.price, 0); + user_id: number; + products_ids: string[]; // todo: change to product minimum ({count: number, id: string, price: number}}}) + restaurant_id: string; + }; const user_in_db = await prisma.userMinimum.findFirst({ where: { email: user.email }, @@ -41,7 +41,8 @@ export const CreateOrder = async ( create: { string: basket_snapshot.string, json, - total, + // todo: get total from basket_snapshot from product minimum + total: 0 }, }, restaurant_id, From 3f0d5ff334727796f24e1c160d9bb9a7e42bad1a Mon Sep 17 00:00:00 2001 From: anatole Date: Thu, 24 Aug 2023 14:49:17 +0200 Subject: [PATCH 463/883] feat(gateway): add package lock --- services/gateway/package-lock.json | 6000 +++++----------------------- 1 file changed, 997 insertions(+), 5003 deletions(-) diff --git a/services/gateway/package-lock.json b/services/gateway/package-lock.json index d2a1731d..44f62478 100644 --- a/services/gateway/package-lock.json +++ b/services/gateway/package-lock.json @@ -1,7 +1,7 @@ { "name": "@goodfood/gateway", "version": "1.0.0", - "lockfileVersion": 2, + "lockfileVersion": 3, "requires": true, "packages": { "": { @@ -25,7 +25,11 @@ "@types/amqplib": "^0.10.1", "@types/google-protobuf": "^3.15.6", "@types/node": "^18.15.9", - "esbuild": "^0.19.2", + "@typescript-eslint/eslint-plugin": "^6.4.1", + "esbuild": "^0.17.18", + "eslint": "^8.47.0", + "eslint-config-prettier": "^9.0.0", + "eslint-plugin-prettier": "^5.0.0", "grpc_tools_node_protoc_ts": "^5.3.3", "grpc-tools": "^1.12.4", "nodemon": "^3.0.1", @@ -38,6 +42,28 @@ "vitest": "^0.33.0" } }, + "node_modules/@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", + "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/@babel/generator": { "version": "7.18.2", "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.2.tgz", @@ -96,6 +122,12 @@ "node": ">=6.9.0" } }, + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true + }, "node_modules/@cspotcode/source-map-support": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", @@ -118,459 +150,233 @@ "@jridgewell/sourcemap-codec": "^1.4.10" } }, - "node_modules/@esbuild/android-arm": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.2.tgz", - "integrity": "sha512-tM8yLeYVe7pRyAu9VMi/Q7aunpLwD139EY1S99xbQkT4/q2qa6eA4ige/WJQYdJ8GBL1K33pPFhPfPdJ/WzT8Q==", + "node_modules/@esbuild/linux-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.19.tgz", + "integrity": "sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==", "cpu": [ - "arm" + "x64" ], "dev": true, "optional": true, "os": [ - "android" + "linux" ], "engines": { "node": ">=12" } }, - "node_modules/@esbuild/android-arm64": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.2.tgz", - "integrity": "sha512-lsB65vAbe90I/Qe10OjkmrdxSX4UJDjosDgb8sZUKcg3oefEuW2OT2Vozz8ef7wrJbMcmhvCC+hciF8jY/uAkw==", - "cpu": [ - "arm64" - ], + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", "dev": true, - "optional": true, - "os": [ - "android" - ], + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, "engines": { - "node": ">=12" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, - "node_modules/@esbuild/android-x64": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.2.tgz", - "integrity": "sha512-qK/TpmHt2M/Hg82WXHRc/W/2SGo/l1thtDHZWqFq7oi24AjZ4O/CpPSu6ZuYKFkEgmZlFoa7CooAyYmuvnaG8w==", - "cpu": [ - "x64" - ], + "node_modules/@eslint-community/regexpp": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.7.0.tgz", + "integrity": "sha512-+HencqxU7CFJnQb7IKtuNBqS6Yx3Tz4kOL8BJXo+JyeiBm5MEX6pO8onXDkjrkCRlfYXS1Axro15ZjVFe9YgsA==", "dev": true, - "optional": true, - "os": [ - "android" - ], "engines": { - "node": ">=12" + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.2.tgz", - "integrity": "sha512-Ora8JokrvrzEPEpZO18ZYXkH4asCdc1DLdcVy8TGf5eWtPO1Ie4WroEJzwI52ZGtpODy3+m0a2yEX9l+KUn0tA==", - "cpu": [ - "arm64" - ], + "node_modules/@eslint/eslintrc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.2.tgz", + "integrity": "sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==", "dev": true, - "optional": true, - "os": [ - "darwin" - ], + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, "engines": { - "node": ">=12" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.2.tgz", - "integrity": "sha512-tP+B5UuIbbFMj2hQaUr6EALlHOIOmlLM2FK7jeFBobPy2ERdohI4Ka6ZFjZ1ZYsrHE/hZimGuU90jusRE0pwDw==", - "cpu": [ - "x64" - ], + "node_modules/@eslint/eslintrc/node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "dev": true, - "optional": true, - "os": [ - "darwin" - ], "engines": { - "node": ">=12" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.2.tgz", - "integrity": "sha512-YbPY2kc0acfzL1VPVK6EnAlig4f+l8xmq36OZkU0jzBVHcOTyQDhnKQaLzZudNJQyymd9OqQezeaBgkTGdTGeQ==", - "cpu": [ - "arm64" - ], + "node_modules/@eslint/js": { + "version": "8.47.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.47.0.tgz", + "integrity": "sha512-P6omY1zv5MItm93kLM8s2vr1HICJH8v0dvddDhysbIuZ+vcjOHg5Zbkf1mTkcmi2JA9oBG2anOkRnW8WJTS8Og==", "dev": true, - "optional": true, - "os": [ - "freebsd" - ], "engines": { - "node": ">=12" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.2.tgz", - "integrity": "sha512-nSO5uZT2clM6hosjWHAsS15hLrwCvIWx+b2e3lZ3MwbYSaXwvfO528OF+dLjas1g3bZonciivI8qKR/Hm7IWGw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], + "node_modules/@grpc/grpc-js": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.9.0.tgz", + "integrity": "sha512-H8+iZh+kCE6VR/Krj6W28Y/ZlxoZ1fOzsNt77nrdE3knkbSelW1Uus192xOFCxHyeszLj8i4APQkSIXjAoOxXg==", + "dependencies": { + "@grpc/proto-loader": "^0.7.0", + "@types/node": ">=12.12.47" + }, "engines": { - "node": ">=12" + "node": "^8.13.0 || >=10.10.0" } }, - "node_modules/@esbuild/linux-arm": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.2.tgz", - "integrity": "sha512-Odalh8hICg7SOD7XCj0YLpYCEc+6mkoq63UnExDCiRA2wXEmGlK5JVrW50vZR9Qz4qkvqnHcpH+OFEggO3PgTg==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], + "node_modules/@grpc/proto-loader": { + "version": "0.7.8", + "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.8.tgz", + "integrity": "sha512-GU12e2c8dmdXb7XUlOgYWZ2o2i+z9/VeACkxTA/zzAe2IjclC5PnVL0lpgjhrqfpDYHzM8B1TF6pqWegMYAzlA==", + "dependencies": { + "@types/long": "^4.0.1", + "lodash.camelcase": "^4.3.0", + "long": "^4.0.0", + "protobufjs": "^7.2.4", + "yargs": "^17.7.2" + }, + "bin": { + "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" + }, "engines": { - "node": ">=12" + "node": ">=6" } }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.2.tgz", - "integrity": "sha512-ig2P7GeG//zWlU0AggA3pV1h5gdix0MA3wgB+NsnBXViwiGgY77fuN9Wr5uoCrs2YzaYfogXgsWZbm+HGr09xg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], + "node_modules/@grpc/proto-loader/node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, "engines": { "node": ">=12" } }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.2.tgz", - "integrity": "sha512-mLfp0ziRPOLSTek0Gd9T5B8AtzKAkoZE70fneiiyPlSnUKKI4lp+mGEnQXcQEHLJAcIYDPSyBvsUbKUG2ri/XQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], + "node_modules/@grpc/proto-loader/node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "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.5", + "yargs-parser": "^21.1.1" + }, "engines": { "node": ">=12" } }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.2.tgz", - "integrity": "sha512-hn28+JNDTxxCpnYjdDYVMNTR3SKavyLlCHHkufHV91fkewpIyQchS1d8wSbmXhs1fiYDpNww8KTFlJ1dHsxeSw==", - "cpu": [ - "loong64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], + "node_modules/@grpc/proto-loader/node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", "engines": { "node": ">=12" } }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.2.tgz", - "integrity": "sha512-KbXaC0Sejt7vD2fEgPoIKb6nxkfYW9OmFUK9XQE4//PvGIxNIfPk1NmlHmMg6f25x57rpmEFrn1OotASYIAaTg==", - "cpu": [ - "mips64el" - ], + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.10.tgz", + "integrity": "sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==", "dev": true, - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.1", + "minimatch": "^3.0.5" + }, "engines": { - "node": ">=12" + "node": ">=10.10.0" } }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.2.tgz", - "integrity": "sha512-dJ0kE8KTqbiHtA3Fc/zn7lCd7pqVr4JcT0JqOnbj4LLzYnp+7h8Qi4yjfq42ZlHfhOCM42rBh0EwHYLL6LEzcw==", - "cpu": [ - "ppc64" - ], + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", "dev": true, - "optional": true, - "os": [ - "linux" - ], "engines": { - "node": ">=12" + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" } }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.2.tgz", - "integrity": "sha512-7Z/jKNFufZ/bbu4INqqCN6DDlrmOTmdw6D0gH+6Y7auok2r02Ur661qPuXidPOJ+FSgbEeQnnAGgsVynfLuOEw==", - "cpu": [ - "riscv64" - ], + "node_modules/@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "dev": true + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", "dev": true, - "optional": true, - "os": [ - "linux" - ], "engines": { - "node": ">=12" + "node": ">=8" } }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.2.tgz", - "integrity": "sha512-U+RinR6aXXABFCcAY4gSlv4CL1oOVvSSCdseQmGO66H+XyuQGZIUdhG56SZaDJQcLmrSfRmx5XZOWyCJPRqS7g==", - "cpu": [ - "s390x" - ], + "node_modules/@jest/schemas": { + "version": "29.6.0", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.0.tgz", + "integrity": "sha512-rxLjXyJBTL4LQeJW3aKo0M/+GkCOXsO+8i9Iu7eDb6KwtP65ayoDsitrdPBtujxQ88k4wI2FNYfa6TOGwSn6cQ==", "dev": true, - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "@sinclair/typebox": "^0.27.8" + }, "engines": { - "node": ">=12" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@esbuild/linux-x64": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.2.tgz", - "integrity": "sha512-oxzHTEv6VPm3XXNaHPyUTTte+3wGv7qVQtqaZCrgstI16gCuhNOtBXLEBkBREP57YTd68P0VgDgG73jSD8bwXQ==", - "cpu": [ - "x64" - ], + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", "dev": true, - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, "engines": { - "node": ">=12" + "node": ">=6.0.0" } }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.2.tgz", - "integrity": "sha512-WNa5zZk1XpTTwMDompZmvQLHszDDDN7lYjEHCUmAGB83Bgs20EMs7ICD+oKeT6xt4phV4NDdSi/8OfjPbSbZfQ==", - "cpu": [ - "x64" - ], + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", "dev": true, - "optional": true, - "os": [ - "netbsd" - ], "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.2.tgz", - "integrity": "sha512-S6kI1aT3S++Dedb7vxIuUOb3oAxqxk2Rh5rOXOTYnzN8JzW1VzBd+IqPiSpgitu45042SYD3HCoEyhLKQcDFDw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.2.tgz", - "integrity": "sha512-VXSSMsmb+Z8LbsQGcBMiM+fYObDNRm8p7tkUDMPG/g4fhFX5DEFmjxIEa3N8Zr96SjsJ1woAhF0DUnS3MF3ARw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.2.tgz", - "integrity": "sha512-5NayUlSAyb5PQYFAU9x3bHdsqB88RC3aM9lKDAz4X1mo/EchMIT1Q+pSeBXNgkfNmRecLXA0O8xP+x8V+g/LKg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.2.tgz", - "integrity": "sha512-47gL/ek1v36iN0wL9L4Q2MFdujR0poLZMJwhO2/N3gA89jgHp4MR8DKCmwYtGNksbfJb9JoTtbkoe6sDhg2QTA==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.2.tgz", - "integrity": "sha512-tcuhV7ncXBqbt/Ybf0IyrMcwVOAPDckMK9rXNHtF17UTK18OKLpg08glminN06pt2WCoALhXdLfSPbVvK/6fxw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@grpc/grpc-js": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.9.0.tgz", - "integrity": "sha512-H8+iZh+kCE6VR/Krj6W28Y/ZlxoZ1fOzsNt77nrdE3knkbSelW1Uus192xOFCxHyeszLj8i4APQkSIXjAoOxXg==", - "dependencies": { - "@grpc/proto-loader": "^0.7.0", - "@types/node": ">=12.12.47" - }, - "engines": { - "node": "^8.13.0 || >=10.10.0" - } - }, - "node_modules/@grpc/proto-loader": { - "version": "0.7.8", - "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.8.tgz", - "integrity": "sha512-GU12e2c8dmdXb7XUlOgYWZ2o2i+z9/VeACkxTA/zzAe2IjclC5PnVL0lpgjhrqfpDYHzM8B1TF6pqWegMYAzlA==", - "dependencies": { - "@types/long": "^4.0.1", - "lodash.camelcase": "^4.3.0", - "long": "^4.0.0", - "protobufjs": "^7.2.4", - "yargs": "^17.7.2" - }, - "bin": { - "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@grpc/proto-loader/node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@grpc/proto-loader/node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "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.5", - "yargs-parser": "^21.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@grpc/proto-loader/node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "engines": { - "node": ">=12" - } - }, - "node_modules/@jest/schemas": { - "version": "29.6.0", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.0.tgz", - "integrity": "sha512-rxLjXyJBTL4LQeJW3aKo0M/+GkCOXsO+8i9Iu7eDb6KwtP65ayoDsitrdPBtujxQ88k4wI2FNYfa6TOGwSn6cQ==", - "dev": true, - "dependencies": { - "@sinclair/typebox": "^0.27.8" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", - "dev": true, - "dependencies": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", - "dev": true, - "engines": { - "node": ">=6.0.0" + "node": ">=6.0.0" } }, "node_modules/@jridgewell/set-array": { @@ -837,6 +643,18 @@ "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.1.tgz", "integrity": "sha512-/K3ds8TRAfBvi5vfjuz8y6+GiAYBZ0x4tXv1Av6CWBWn0IlADc+ZX9pMq7oU0fNQPnBwIZl3rmeLp6SBApbxSQ==" }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", + "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", + "dev": true + }, + "node_modules/@types/json-schema": { + "version": "7.0.12", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.12.tgz", + "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==", + "dev": true + }, "node_modules/@types/long": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz", @@ -887,89 +705,298 @@ "@types/node": "*" } }, - "node_modules/@vitest/expect": { - "version": "0.33.0", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-0.33.0.tgz", - "integrity": "sha512-sVNf+Gla3mhTCxNJx+wJLDPp/WcstOe0Ksqz4Vec51MmgMth/ia0MGFEkIZmVGeTL5HtjYR4Wl/ZxBxBXZJTzQ==", + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.4.1.tgz", + "integrity": "sha512-3F5PtBzUW0dYlq77Lcqo13fv+58KDwUib3BddilE8ajPJT+faGgxmI9Sw+I8ZS22BYwoir9ZhNXcLi+S+I2bkw==", "dev": true, "dependencies": { - "@vitest/spy": "0.33.0", - "@vitest/utils": "0.33.0", - "chai": "^4.3.7" + "@eslint-community/regexpp": "^4.5.1", + "@typescript-eslint/scope-manager": "6.4.1", + "@typescript-eslint/type-utils": "6.4.1", + "@typescript-eslint/utils": "6.4.1", + "@typescript-eslint/visitor-keys": "6.4.1", + "debug": "^4.3.4", + "graphemer": "^1.4.0", + "ignore": "^5.2.4", + "natural-compare": "^1.4.0", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" }, "funding": { - "url": "https://opencollective.com/vitest" + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha", + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/@vitest/runner": { - "version": "0.33.0", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-0.33.0.tgz", - "integrity": "sha512-UPfACnmCB6HKRHTlcgCoBh6ppl6fDn+J/xR8dTufWiKt/74Y9bHci5CKB8tESSV82zKYtkBJo9whU3mNvfaisg==", + "node_modules/@typescript-eslint/parser": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.4.1.tgz", + "integrity": "sha512-610G6KHymg9V7EqOaNBMtD1GgpAmGROsmfHJPXNLCU9bfIuLrkdOygltK784F6Crboyd5tBFayPB7Sf0McrQwg==", "dev": true, + "peer": true, "dependencies": { - "@vitest/utils": "0.33.0", - "p-limit": "^4.0.0", - "pathe": "^1.1.1" + "@typescript-eslint/scope-manager": "6.4.1", + "@typescript-eslint/types": "6.4.1", + "@typescript-eslint/typescript-estree": "6.4.1", + "@typescript-eslint/visitor-keys": "6.4.1", + "debug": "^4.3.4" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" }, "funding": { - "url": "https://opencollective.com/vitest" + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/@vitest/runner/node_modules/p-limit": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", - "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", + "node_modules/@typescript-eslint/scope-manager": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.4.1.tgz", + "integrity": "sha512-p/OavqOQfm4/Hdrr7kvacOSFjwQ2rrDVJRPxt/o0TOWdFnjJptnjnZ+sYDR7fi4OimvIuKp+2LCkc+rt9fIW+A==", "dev": true, "dependencies": { - "yocto-queue": "^1.0.0" + "@typescript-eslint/types": "6.4.1", + "@typescript-eslint/visitor-keys": "6.4.1" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@vitest/runner/node_modules/yocto-queue": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", - "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", + "node_modules/@typescript-eslint/type-utils": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.4.1.tgz", + "integrity": "sha512-7ON8M8NXh73SGZ5XvIqWHjgX2f+vvaOarNliGhjrJnv1vdjG0LVIz+ToYfPirOoBi56jxAKLfsLm40+RvxVVXA==", "dev": true, + "dependencies": { + "@typescript-eslint/typescript-estree": "6.4.1", + "@typescript-eslint/utils": "6.4.1", + "debug": "^4.3.4", + "ts-api-utils": "^1.0.1" + }, "engines": { - "node": ">=12.20" + "node": "^16.0.0 || >=18.0.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/@vitest/snapshot": { - "version": "0.33.0", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-0.33.0.tgz", - "integrity": "sha512-tJjrl//qAHbyHajpFvr8Wsk8DIOODEebTu7pgBrP07iOepR5jYkLFiqLq2Ltxv+r0uptUb4izv1J8XBOwKkVYA==", + "node_modules/@typescript-eslint/types": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.4.1.tgz", + "integrity": "sha512-zAAopbNuYu++ijY1GV2ylCsQsi3B8QvfPHVqhGdDcbx/NK5lkqMnCGU53amAjccSpk+LfeONxwzUhDzArSfZJg==", "dev": true, - "dependencies": { - "magic-string": "^0.30.1", - "pathe": "^1.1.1", - "pretty-format": "^29.5.0" + "engines": { + "node": "^16.0.0 || >=18.0.0" }, "funding": { - "url": "https://opencollective.com/vitest" + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@vitest/spy": { - "version": "0.33.0", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-0.33.0.tgz", - "integrity": "sha512-Kv+yZ4hnH1WdiAkPUQTpRxW8kGtH8VRTnus7ZTGovFYM1ZezJpvGtb9nPIjPnptHbsyIAxYZsEpVPYgtpjGnrg==", + "node_modules/@typescript-eslint/typescript-estree": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.4.1.tgz", + "integrity": "sha512-xF6Y7SatVE/OyV93h1xGgfOkHr2iXuo8ip0gbfzaKeGGuKiAnzS+HtVhSPx8Www243bwlW8IF7X0/B62SzFftg==", "dev": true, "dependencies": { - "tinyspy": "^2.1.1" + "@typescript-eslint/types": "6.4.1", + "@typescript-eslint/visitor-keys": "6.4.1", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" }, "funding": { - "url": "https://opencollective.com/vitest" + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/@vitest/utils": { - "version": "0.33.0", + "node_modules/@typescript-eslint/utils": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.4.1.tgz", + "integrity": "sha512-F/6r2RieNeorU0zhqZNv89s9bDZSovv3bZQpUNOmmQK1L80/cV4KEu95YUJWi75u5PhboFoKUJBnZ4FQcoqhDw==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@types/json-schema": "^7.0.12", + "@types/semver": "^7.5.0", + "@typescript-eslint/scope-manager": "6.4.1", + "@typescript-eslint/types": "6.4.1", + "@typescript-eslint/typescript-estree": "6.4.1", + "semver": "^7.5.4" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.4.1.tgz", + "integrity": "sha512-y/TyRJsbZPkJIZQXrHfdnxVnxyKegnpEvnRGNam7s3TRR2ykGefEWOhaef00/UUN3IZxizS7BTO3svd3lCOJRQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.4.1", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@vitest/coverage-c8": { + "version": "0.33.0", + "resolved": "https://registry.npmjs.org/@vitest/coverage-c8/-/coverage-c8-0.33.0.tgz", + "integrity": "sha512-DaF1zJz4dcOZS4k/neiQJokmOWqsGXwhthfmUdPGorXIQHjdPvV6JQSYhQDI41MyI8c+IieQUdIDs5XAMHtDDw==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.2.1", + "c8": "^7.14.0", + "magic-string": "^0.30.1", + "picocolors": "^1.0.0", + "std-env": "^3.3.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "vitest": ">=0.30.0 <1" + } + }, + "node_modules/@vitest/expect": { + "version": "0.33.0", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-0.33.0.tgz", + "integrity": "sha512-sVNf+Gla3mhTCxNJx+wJLDPp/WcstOe0Ksqz4Vec51MmgMth/ia0MGFEkIZmVGeTL5HtjYR4Wl/ZxBxBXZJTzQ==", + "dev": true, + "dependencies": { + "@vitest/spy": "0.33.0", + "@vitest/utils": "0.33.0", + "chai": "^4.3.7" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/runner": { + "version": "0.33.0", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-0.33.0.tgz", + "integrity": "sha512-UPfACnmCB6HKRHTlcgCoBh6ppl6fDn+J/xR8dTufWiKt/74Y9bHci5CKB8tESSV82zKYtkBJo9whU3mNvfaisg==", + "dev": true, + "dependencies": { + "@vitest/utils": "0.33.0", + "p-limit": "^4.0.0", + "pathe": "^1.1.1" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/runner/node_modules/p-limit": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", + "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^1.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@vitest/runner/node_modules/yocto-queue": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", + "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", + "dev": true, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@vitest/snapshot": { + "version": "0.33.0", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-0.33.0.tgz", + "integrity": "sha512-tJjrl//qAHbyHajpFvr8Wsk8DIOODEebTu7pgBrP07iOepR5jYkLFiqLq2Ltxv+r0uptUb4izv1J8XBOwKkVYA==", + "dev": true, + "dependencies": { + "magic-string": "^0.30.1", + "pathe": "^1.1.1", + "pretty-format": "^29.5.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/spy": { + "version": "0.33.0", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-0.33.0.tgz", + "integrity": "sha512-Kv+yZ4hnH1WdiAkPUQTpRxW8kGtH8VRTnus7ZTGovFYM1ZezJpvGtb9nPIjPnptHbsyIAxYZsEpVPYgtpjGnrg==", + "dev": true, + "dependencies": { + "tinyspy": "^2.1.1" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/utils": { + "version": "0.33.0", "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-0.33.0.tgz", "integrity": "sha512-pF1w22ic965sv+EN6uoePkAOTkAPWM03Ri/jXNyMIKBb/XHLDPfhLvf/Fa9g0YECevAIz56oVYXhodLvLQ/awA==", "dev": true, @@ -1341,6 +1368,32 @@ "node": ">= 0.8" } }, + "node_modules/c8": { + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/c8/-/c8-7.14.0.tgz", + "integrity": "sha512-i04rtkkcNcCf7zsQcSv/T9EbUn4RXQ6mropeMcjFOsQXQ0iGLAr/xT6TImQg4+U9hmNpN9XdvPkjUL1IzbgxJw==", + "dev": true, + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@istanbuljs/schema": "^0.1.3", + "find-up": "^5.0.0", + "foreground-child": "^2.0.0", + "istanbul-lib-coverage": "^3.2.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-reports": "^3.1.4", + "rimraf": "^3.0.2", + "test-exclude": "^6.0.0", + "v8-to-istanbul": "^9.0.0", + "yargs": "^16.2.0", + "yargs-parser": "^20.2.9" + }, + "bin": { + "c8": "bin/c8.js" + }, + "engines": { + "node": ">=10.12.0" + } + }, "node_modules/cac": { "version": "6.7.14", "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", @@ -1527,6 +1580,12 @@ "node": ">= 0.6" } }, + "node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true + }, "node_modules/cookie": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", @@ -1552,6 +1611,20 @@ "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", "dev": true }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, "node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -1786,9 +1859,9 @@ } }, "node_modules/esbuild": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.2.tgz", - "integrity": "sha512-G6hPax8UbFakEj3hWO0Vs52LQ8k3lnBhxZWomUJDxfz3rZTLqF5k/FCzuNdLx2RbpBiQQF9H9onlDDH1lZsnjg==", + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.19.tgz", + "integrity": "sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==", "dev": true, "hasInstallScript": true, "bin": { @@ -1798,28 +1871,28 @@ "node": ">=12" }, "optionalDependencies": { - "@esbuild/android-arm": "0.19.2", - "@esbuild/android-arm64": "0.19.2", - "@esbuild/android-x64": "0.19.2", - "@esbuild/darwin-arm64": "0.19.2", - "@esbuild/darwin-x64": "0.19.2", - "@esbuild/freebsd-arm64": "0.19.2", - "@esbuild/freebsd-x64": "0.19.2", - "@esbuild/linux-arm": "0.19.2", - "@esbuild/linux-arm64": "0.19.2", - "@esbuild/linux-ia32": "0.19.2", - "@esbuild/linux-loong64": "0.19.2", - "@esbuild/linux-mips64el": "0.19.2", - "@esbuild/linux-ppc64": "0.19.2", - "@esbuild/linux-riscv64": "0.19.2", - "@esbuild/linux-s390x": "0.19.2", - "@esbuild/linux-x64": "0.19.2", - "@esbuild/netbsd-x64": "0.19.2", - "@esbuild/openbsd-x64": "0.19.2", - "@esbuild/sunos-x64": "0.19.2", - "@esbuild/win32-arm64": "0.19.2", - "@esbuild/win32-ia32": "0.19.2", - "@esbuild/win32-x64": "0.19.2" + "@esbuild/android-arm": "0.17.19", + "@esbuild/android-arm64": "0.17.19", + "@esbuild/android-x64": "0.17.19", + "@esbuild/darwin-arm64": "0.17.19", + "@esbuild/darwin-x64": "0.17.19", + "@esbuild/freebsd-arm64": "0.17.19", + "@esbuild/freebsd-x64": "0.17.19", + "@esbuild/linux-arm": "0.17.19", + "@esbuild/linux-arm64": "0.17.19", + "@esbuild/linux-ia32": "0.17.19", + "@esbuild/linux-loong64": "0.17.19", + "@esbuild/linux-mips64el": "0.17.19", + "@esbuild/linux-ppc64": "0.17.19", + "@esbuild/linux-riscv64": "0.17.19", + "@esbuild/linux-s390x": "0.17.19", + "@esbuild/linux-x64": "0.17.19", + "@esbuild/netbsd-x64": "0.17.19", + "@esbuild/openbsd-x64": "0.17.19", + "@esbuild/sunos-x64": "0.17.19", + "@esbuild/win32-arm64": "0.17.19", + "@esbuild/win32-ia32": "0.17.19", + "@esbuild/win32-x64": "0.17.19" } }, "node_modules/escalade": { @@ -2293,6 +2366,41 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dev": true, + "dependencies": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", + "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", + "dev": true + }, "node_modules/follow-redirects": { "version": "1.15.2", "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", @@ -2312,6 +2420,19 @@ } } }, + "node_modules/foreground-child": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", + "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8.0.0" + } + }, "node_modules/form-data": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", @@ -2696,6 +2817,12 @@ "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", "dev": true }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, "node_modules/http-errors": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", @@ -2997,6 +3124,60 @@ "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", "dev": true }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", + "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "dev": true, + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-reports": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", + "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", + "dev": true, + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, "node_modules/jsesc": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", @@ -3075,6 +3256,21 @@ "url": "https://github.com/sponsors/antfu" } }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/lodash.camelcase": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", @@ -3663,6 +3859,48 @@ "node": ">=8" } }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", @@ -3671,6 +3909,15 @@ "node": ">= 0.8" } }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", @@ -3679,6 +3926,15 @@ "node": ">=0.10.0" } }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/path-parse": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", @@ -4418,11 +4674,32 @@ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" }, - "node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "dependencies": { + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dependencies": { "call-bind": "^1.0.0", "get-intrinsic": "^1.0.2", "object-inspect": "^1.9.0" @@ -4774,6 +5051,26 @@ "node": ">=6" } }, + "node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true + }, "node_modules/tinybench": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.5.0.tgz", @@ -4872,6 +5169,27 @@ "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", "dev": true }, + "node_modules/ts-api-utils": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.2.tgz", + "integrity": "sha512-Cbu4nIqnEdd+THNEsBdkolnOXhg0I8XteoHaEKgvsxpsbWda4IsUut2c187HxywQCvveojow0Dgw/amxtSKVkQ==", + "dev": true, + "engines": { + "node": ">=16.13.0" + }, + "peerDependencies": { + "typescript": ">=4.2.0" + } + }, + "node_modules/ts-essentials": { + "version": "9.3.2", + "resolved": "https://registry.npmjs.org/ts-essentials/-/ts-essentials-9.3.2.tgz", + "integrity": "sha512-JxKJzuWqH1MmH4ZFHtJzGEhkfN3QvVR3C3w+4BIoWeoY68UVVoA2Np/Bca9z0IPSErVCWhv439aT0We4Dks8kQ==", + "dev": true, + "peerDependencies": { + "typescript": ">=4.1.0" + } + }, "node_modules/ts-node": { "version": "10.9.1", "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", @@ -5085,6 +5403,20 @@ "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", "dev": true }, + "node_modules/v8-to-istanbul": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.1.0.tgz", + "integrity": "sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.12", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^1.6.0" + }, + "engines": { + "node": ">=10.12.0" + } + }, "node_modules/vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", @@ -5225,4611 +5557,252 @@ "node": ">=14.17" } }, - "node_modules/vite/node_modules/@esbuild/android-arm": { + "node_modules/vite/node_modules/@esbuild/linux-x64": { "version": "0.18.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.12.tgz", - "integrity": "sha512-LIxaNIQfkFZbTLb4+cX7dozHlAbAshhFE5PKdro0l+FnCpx1GDJaQ2WMcqm+ToXKMt8p8Uojk/MFRuGyz3V5Sw==", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.12.tgz", + "integrity": "sha512-OrNJMGQbPaVyHHcDF8ybNSwu7TDOfX8NGpXCbetwOSP6txOJiWlgQnRymfC9ocR1S0Y5PW0Wb1mV6pUddqmvmQ==", "cpu": [ - "arm" + "x64" ], "dev": true, "optional": true, "os": [ - "android" + "linux" ], "engines": { "node": ">=12" } }, - "node_modules/vite/node_modules/@esbuild/android-arm64": { + "node_modules/vite/node_modules/esbuild": { "version": "0.18.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.12.tgz", - "integrity": "sha512-BMAlczRqC/LUt2P97E4apTBbkvS9JTJnp2DKFbCwpZ8vBvXVbNdqmvzW/OsdtI/+mGr+apkkpqGM8WecLkPgrA==", - "cpu": [ - "arm64" - ], + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.12.tgz", + "integrity": "sha512-XuOVLDdtsDslXStStduT41op21Ytmf4/BDS46aa3xPJ7X5h2eMWBF1oAe3QjUH3bDksocNXgzGUZ7XHIBya6Tg==", "dev": true, - "optional": true, - "os": [ - "android" - ], + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, "engines": { "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.18.12", + "@esbuild/android-arm64": "0.18.12", + "@esbuild/android-x64": "0.18.12", + "@esbuild/darwin-arm64": "0.18.12", + "@esbuild/darwin-x64": "0.18.12", + "@esbuild/freebsd-arm64": "0.18.12", + "@esbuild/freebsd-x64": "0.18.12", + "@esbuild/linux-arm": "0.18.12", + "@esbuild/linux-arm64": "0.18.12", + "@esbuild/linux-ia32": "0.18.12", + "@esbuild/linux-loong64": "0.18.12", + "@esbuild/linux-mips64el": "0.18.12", + "@esbuild/linux-ppc64": "0.18.12", + "@esbuild/linux-riscv64": "0.18.12", + "@esbuild/linux-s390x": "0.18.12", + "@esbuild/linux-x64": "0.18.12", + "@esbuild/netbsd-x64": "0.18.12", + "@esbuild/openbsd-x64": "0.18.12", + "@esbuild/sunos-x64": "0.18.12", + "@esbuild/win32-arm64": "0.18.12", + "@esbuild/win32-ia32": "0.18.12", + "@esbuild/win32-x64": "0.18.12" } }, - "node_modules/vite/node_modules/@esbuild/android-x64": { - "version": "0.18.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.12.tgz", - "integrity": "sha512-zU5MyluNsykf5cOJ0LZZZjgAHbhPJ1cWfdH1ZXVMXxVMhEV0VZiZXQdwBBVvmvbF28EizeK7obG9fs+fpmS0eQ==", - "cpu": [ - "x64" - ], + "node_modules/vitest": { + "version": "0.33.0", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-0.33.0.tgz", + "integrity": "sha512-1CxaugJ50xskkQ0e969R/hW47za4YXDUfWJDxip1hwbnhUjYolpfUn2AMOulqG/Dtd9WYAtkHmM/m3yKVrEejQ==", "dev": true, - "optional": true, - "os": [ - "android" - ], + "dependencies": { + "@types/chai": "^4.3.5", + "@types/chai-subset": "^1.3.3", + "@types/node": "*", + "@vitest/expect": "0.33.0", + "@vitest/runner": "0.33.0", + "@vitest/snapshot": "0.33.0", + "@vitest/spy": "0.33.0", + "@vitest/utils": "0.33.0", + "acorn": "^8.9.0", + "acorn-walk": "^8.2.0", + "cac": "^6.7.14", + "chai": "^4.3.7", + "debug": "^4.3.4", + "local-pkg": "^0.4.3", + "magic-string": "^0.30.1", + "pathe": "^1.1.1", + "picocolors": "^1.0.0", + "std-env": "^3.3.3", + "strip-literal": "^1.0.1", + "tinybench": "^2.5.0", + "tinypool": "^0.6.0", + "vite": "^3.0.0 || ^4.0.0", + "vite-node": "0.33.0", + "why-is-node-running": "^2.2.2" + }, + "bin": { + "vitest": "vitest.mjs" + }, "engines": { - "node": ">=12" + "node": ">=v14.18.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@vitest/browser": "*", + "@vitest/ui": "*", + "happy-dom": "*", + "jsdom": "*", + "playwright": "*", + "safaridriver": "*", + "webdriverio": "*" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@vitest/browser": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + }, + "playwright": { + "optional": true + }, + "safaridriver": { + "optional": true + }, + "webdriverio": { + "optional": true + } } }, - "node_modules/vite/node_modules/@esbuild/darwin-arm64": { - "version": "0.18.12", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.12.tgz", - "integrity": "sha512-zUZMep7YONnp6954QOOwEBwFX9svlKd3ov6PkxKd53LGTHsp/gy7vHaPGhhjBmEpqXEXShi6dddjIkmd+NgMsA==", - "cpu": [ - "arm64" - ], + "node_modules/vitest-mock-extended": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/vitest-mock-extended/-/vitest-mock-extended-1.1.4.tgz", + "integrity": "sha512-MKPdepFjk0CE7Ocb5txntHK/sloHO9s0Kk9dr630uL03shRSHMkZtSs5CBPsbJ8K/CvYLv0GHUmMt2zWks2eXg==", "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" + "dependencies": { + "ts-essentials": "^9.3.2" + }, + "peerDependencies": { + "typescript": "3.x || 4.x || 5.x", + "vitest": ">=0.31.1" } }, - "node_modules/vite/node_modules/@esbuild/darwin-x64": { - "version": "0.18.12", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.12.tgz", - "integrity": "sha512-ohqLPc7i67yunArPj1+/FeeJ7AgwAjHqKZ512ADk3WsE3FHU9l+m5aa7NdxXr0HmN1bjDlUslBjWNbFlD9y12Q==", - "cpu": [ - "x64" - ], + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "dev": true + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" } }, - "node_modules/vite/node_modules/@esbuild/freebsd-arm64": { - "version": "0.18.12", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.12.tgz", - "integrity": "sha512-GIIHtQXqgeOOqdG16a/A9N28GpkvjJnjYMhOnXVbn3EDJcoItdR58v/pGN31CHjyXDc8uCcRnFWmqaJt24AYJg==", - "cpu": [ - "arm64" - ], + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, - "optional": true, - "os": [ - "freebsd" - ], + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, "engines": { - "node": ">=12" + "node": ">= 8" } }, - "node_modules/vite/node_modules/@esbuild/freebsd-x64": { - "version": "0.18.12", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.12.tgz", - "integrity": "sha512-zK0b9a1/0wZY+6FdOS3BpZcPc1kcx2G5yxxfEJtEUzVxI6n/FrC2Phsxj/YblPuBchhBZ/1wwn7AyEBUyNSa6g==", - "cpu": [ - "x64" - ], + "node_modules/why-is-node-running": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.2.2.tgz", + "integrity": "sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==", "dev": true, - "optional": true, - "os": [ - "freebsd" - ], + "dependencies": { + "siginfo": "^2.0.0", + "stackback": "0.0.2" + }, + "bin": { + "why-is-node-running": "cli.js" + }, "engines": { - "node": ">=12" + "node": ">=8" } }, - "node_modules/vite/node_modules/@esbuild/linux-arm": { - "version": "0.18.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.12.tgz", - "integrity": "sha512-y75OijvrBE/1XRrXq1jtrJfG26eHeMoqLJ2dwQNwviwTuTtHGCojsDO6BJNF8gU+3jTn1KzJEMETytwsFSvc+Q==", - "cpu": [ - "arm" - ], + "node_modules/wide-align": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" + "dependencies": { + "string-width": "^1.0.2 || 2 || 3 || 4" } }, - "node_modules/vite/node_modules/@esbuild/linux-arm64": { - "version": "0.18.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.12.tgz", - "integrity": "sha512-JKgG8Q/LL/9sw/iHHxQyVMoQYu3rU3+a5Z87DxC+wAu3engz+EmctIrV+FGOgI6gWG1z1+5nDDbXiRMGQZXqiw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-ia32": { - "version": "0.18.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.12.tgz", - "integrity": "sha512-yoRIAqc0B4lDIAAEFEIu9ttTRFV84iuAl0KNCN6MhKLxNPfzwCBvEMgwco2f71GxmpBcTtn7KdErueZaM2rEvw==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-loong64": { - "version": "0.18.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.12.tgz", - "integrity": "sha512-qYgt3dHPVvf/MgbIBpJ4Sup/yb9DAopZ3a2JgMpNKIHUpOdnJ2eHBo/aQdnd8dJ21X/+sS58wxHtA9lEazYtXQ==", - "cpu": [ - "loong64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-mips64el": { - "version": "0.18.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.12.tgz", - "integrity": "sha512-wHphlMLK4ufNOONqukELfVIbnGQJrHJ/mxZMMrP2jYrPgCRZhOtf0kC4yAXBwnfmULimV1qt5UJJOw4Kh13Yfg==", - "cpu": [ - "mips64el" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-ppc64": { - "version": "0.18.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.12.tgz", - "integrity": "sha512-TeN//1Ft20ZZW41+zDSdOI/Os1bEq5dbvBvYkberB7PHABbRcsteeoNVZFlI0YLpGdlBqohEpjrn06kv8heCJg==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-riscv64": { - "version": "0.18.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.12.tgz", - "integrity": "sha512-AgUebVS4DoAblBgiB2ACQ/8l4eGE5aWBb8ZXtkXHiET9mbj7GuWt3OnsIW/zX+XHJt2RYJZctbQ2S/mDjbp0UA==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-s390x": { - "version": "0.18.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.12.tgz", - "integrity": "sha512-dJ3Rb3Ei2u/ysSXd6pzleGtfDdc2MuzKt8qc6ls8vreP1G3B7HInX3i7gXS4BGeVd24pp0yqyS7bJ5NHaI9ing==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-x64": { - "version": "0.18.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.12.tgz", - "integrity": "sha512-OrNJMGQbPaVyHHcDF8ybNSwu7TDOfX8NGpXCbetwOSP6txOJiWlgQnRymfC9ocR1S0Y5PW0Wb1mV6pUddqmvmQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/netbsd-x64": { - "version": "0.18.12", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.12.tgz", - "integrity": "sha512-55FzVCAiwE9FK8wWeCRuvjazNRJ1QqLCYGZVB6E8RuQuTeStSwotpSW4xoRGwp3a1wUsaVCdYcj5LGCASVJmMg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/openbsd-x64": { - "version": "0.18.12", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.12.tgz", - "integrity": "sha512-qnluf8rfb6Y5Lw2tirfK2quZOBbVqmwxut7GPCIJsM8lc4AEUj9L8y0YPdLaPK0TECt4IdyBdBD/KRFKorlK3g==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/sunos-x64": { - "version": "0.18.12", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.12.tgz", - "integrity": "sha512-+RkKpVQR7bICjTOPUpkTBTaJ4TFqQBX5Ywyd/HSdDkQGn65VPkTsR/pL4AMvuMWy+wnXgIl4EY6q4mVpJal8Kg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/win32-arm64": { - "version": "0.18.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.12.tgz", - "integrity": "sha512-GNHuciv0mFM7ouzsU0+AwY+7eV4Mgo5WnbhfDCQGtpvOtD1vbOiRjPYG6dhmMoFyBjj+pNqQu2X+7DKn0KQ/Gw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/win32-ia32": { - "version": "0.18.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.12.tgz", - "integrity": "sha512-kR8cezhYipbbypGkaqCTWIeu4zID17gamC8YTPXYtcN3E5BhhtTnwKBn9I0PJur/T6UVwIEGYzkffNL0lFvxEw==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/win32-x64": { - "version": "0.18.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.12.tgz", - "integrity": "sha512-O0UYQVkvfM/jO8a4OwoV0mAKSJw+mjWTAd1MJd/1FCX6uiMdLmMRPK/w6e9OQ0ob2WGxzIm9va/KG0Ja4zIOgg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/esbuild": { - "version": "0.18.12", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.12.tgz", - "integrity": "sha512-XuOVLDdtsDslXStStduT41op21Ytmf4/BDS46aa3xPJ7X5h2eMWBF1oAe3QjUH3bDksocNXgzGUZ7XHIBya6Tg==", - "dev": true, - "hasInstallScript": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/android-arm": "0.18.12", - "@esbuild/android-arm64": "0.18.12", - "@esbuild/android-x64": "0.18.12", - "@esbuild/darwin-arm64": "0.18.12", - "@esbuild/darwin-x64": "0.18.12", - "@esbuild/freebsd-arm64": "0.18.12", - "@esbuild/freebsd-x64": "0.18.12", - "@esbuild/linux-arm": "0.18.12", - "@esbuild/linux-arm64": "0.18.12", - "@esbuild/linux-ia32": "0.18.12", - "@esbuild/linux-loong64": "0.18.12", - "@esbuild/linux-mips64el": "0.18.12", - "@esbuild/linux-ppc64": "0.18.12", - "@esbuild/linux-riscv64": "0.18.12", - "@esbuild/linux-s390x": "0.18.12", - "@esbuild/linux-x64": "0.18.12", - "@esbuild/netbsd-x64": "0.18.12", - "@esbuild/openbsd-x64": "0.18.12", - "@esbuild/sunos-x64": "0.18.12", - "@esbuild/win32-arm64": "0.18.12", - "@esbuild/win32-ia32": "0.18.12", - "@esbuild/win32-x64": "0.18.12" - } - }, - "node_modules/vitest": { - "version": "0.33.0", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-0.33.0.tgz", - "integrity": "sha512-1CxaugJ50xskkQ0e969R/hW47za4YXDUfWJDxip1hwbnhUjYolpfUn2AMOulqG/Dtd9WYAtkHmM/m3yKVrEejQ==", - "dev": true, - "dependencies": { - "@types/chai": "^4.3.5", - "@types/chai-subset": "^1.3.3", - "@types/node": "*", - "@vitest/expect": "0.33.0", - "@vitest/runner": "0.33.0", - "@vitest/snapshot": "0.33.0", - "@vitest/spy": "0.33.0", - "@vitest/utils": "0.33.0", - "acorn": "^8.9.0", - "acorn-walk": "^8.2.0", - "cac": "^6.7.14", - "chai": "^4.3.7", - "debug": "^4.3.4", - "local-pkg": "^0.4.3", - "magic-string": "^0.30.1", - "pathe": "^1.1.1", - "picocolors": "^1.0.0", - "std-env": "^3.3.3", - "strip-literal": "^1.0.1", - "tinybench": "^2.5.0", - "tinypool": "^0.6.0", - "vite": "^3.0.0 || ^4.0.0", - "vite-node": "0.33.0", - "why-is-node-running": "^2.2.2" - }, - "bin": { - "vitest": "vitest.mjs" - }, - "engines": { - "node": ">=v14.18.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "@edge-runtime/vm": "*", - "@vitest/browser": "*", - "@vitest/ui": "*", - "happy-dom": "*", - "jsdom": "*", - "playwright": "*", - "safaridriver": "*", - "webdriverio": "*" - }, - "peerDependenciesMeta": { - "@edge-runtime/vm": { - "optional": true - }, - "@vitest/browser": { - "optional": true - }, - "@vitest/ui": { - "optional": true - }, - "happy-dom": { - "optional": true - }, - "jsdom": { - "optional": true - }, - "playwright": { - "optional": true - }, - "safaridriver": { - "optional": true - }, - "webdriverio": { - "optional": true - } - } - }, - "node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "dev": true - }, - "node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dev": true, - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "node_modules/why-is-node-running": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.2.2.tgz", - "integrity": "sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==", - "dev": true, - "dependencies": { - "siginfo": "^2.0.0", - "stackback": "0.0.2" - }, - "bin": { - "why-is-node-running": "cli.js" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wide-align": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", - "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", - "dev": true, - "dependencies": { - "string-width": "^1.0.2 || 2 || 3 || 4" - } - }, - "node_modules/wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", - "dev": true - }, - "node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" - }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "engines": { - "node": ">=10" - } - }, - "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, - "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true, - "engines": { - "node": ">=6" - } - } - }, - "dependencies": { - "@babel/generator": { - "version": "7.18.2", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.2.tgz", - "integrity": "sha512-W1lG5vUwFvfMd8HVXqdfbuG7RuaSrTCCD8cl8fP8wOivdbtbIg2Db3IWUcgvfxKbbn6ZBGYRW/Zk1MIwK49mgw==", - "dev": true, - "requires": { - "@babel/types": "^7.18.2", - "@jridgewell/gen-mapping": "^0.3.0", - "jsesc": "^2.5.1" - } - }, - "@babel/helper-string-parser": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", - "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", - "dev": true - }, - "@babel/helper-validator-identifier": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz", - "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==", - "dev": true - }, - "@babel/parser": { - "version": "7.18.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.4.tgz", - "integrity": "sha512-FDge0dFazETFcxGw/EXzOkN8uJp0PC7Qbm+Pe9T+av2zlBpOgunFHkQPPn+eRuClU73JF+98D531UgayY89tow==", - "dev": true - }, - "@babel/types": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.19.0.tgz", - "integrity": "sha512-YuGopBq3ke25BVSiS6fgF49Ul9gH1x70Bcr6bqRLjWCkcX8Hre1/5+z+IiWOIerRMSSEfGZVB9z9kyq7wVs9YA==", - "dev": true, - "requires": { - "@babel/helper-string-parser": "^7.18.10", - "@babel/helper-validator-identifier": "^7.18.6", - "to-fast-properties": "^2.0.0" - } - }, - "@cspotcode/source-map-support": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", - "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", - "dev": true, - "requires": { - "@jridgewell/trace-mapping": "0.3.9" - }, - "dependencies": { - "@jridgewell/trace-mapping": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", - "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", - "dev": true, - "requires": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - } - } - }, - "@esbuild/android-arm": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.2.tgz", - "integrity": "sha512-tM8yLeYVe7pRyAu9VMi/Q7aunpLwD139EY1S99xbQkT4/q2qa6eA4ige/WJQYdJ8GBL1K33pPFhPfPdJ/WzT8Q==", - "dev": true, - "optional": true - }, - "@esbuild/android-arm64": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.2.tgz", - "integrity": "sha512-lsB65vAbe90I/Qe10OjkmrdxSX4UJDjosDgb8sZUKcg3oefEuW2OT2Vozz8ef7wrJbMcmhvCC+hciF8jY/uAkw==", - "dev": true, - "optional": true - }, - "@esbuild/android-x64": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.2.tgz", - "integrity": "sha512-qK/TpmHt2M/Hg82WXHRc/W/2SGo/l1thtDHZWqFq7oi24AjZ4O/CpPSu6ZuYKFkEgmZlFoa7CooAyYmuvnaG8w==", - "dev": true, - "optional": true - }, - "@esbuild/darwin-arm64": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.2.tgz", - "integrity": "sha512-Ora8JokrvrzEPEpZO18ZYXkH4asCdc1DLdcVy8TGf5eWtPO1Ie4WroEJzwI52ZGtpODy3+m0a2yEX9l+KUn0tA==", - "dev": true, - "optional": true - }, - "@esbuild/darwin-x64": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.2.tgz", - "integrity": "sha512-tP+B5UuIbbFMj2hQaUr6EALlHOIOmlLM2FK7jeFBobPy2ERdohI4Ka6ZFjZ1ZYsrHE/hZimGuU90jusRE0pwDw==", - "dev": true, - "optional": true - }, - "@esbuild/freebsd-arm64": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.2.tgz", - "integrity": "sha512-YbPY2kc0acfzL1VPVK6EnAlig4f+l8xmq36OZkU0jzBVHcOTyQDhnKQaLzZudNJQyymd9OqQezeaBgkTGdTGeQ==", - "dev": true, - "optional": true - }, - "@esbuild/freebsd-x64": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.2.tgz", - "integrity": "sha512-nSO5uZT2clM6hosjWHAsS15hLrwCvIWx+b2e3lZ3MwbYSaXwvfO528OF+dLjas1g3bZonciivI8qKR/Hm7IWGw==", - "dev": true, - "optional": true - }, - "@esbuild/linux-arm": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.2.tgz", - "integrity": "sha512-Odalh8hICg7SOD7XCj0YLpYCEc+6mkoq63UnExDCiRA2wXEmGlK5JVrW50vZR9Qz4qkvqnHcpH+OFEggO3PgTg==", - "dev": true, - "optional": true - }, - "@esbuild/linux-arm64": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.2.tgz", - "integrity": "sha512-ig2P7GeG//zWlU0AggA3pV1h5gdix0MA3wgB+NsnBXViwiGgY77fuN9Wr5uoCrs2YzaYfogXgsWZbm+HGr09xg==", - "dev": true, - "optional": true - }, - "@esbuild/linux-ia32": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.2.tgz", - "integrity": "sha512-mLfp0ziRPOLSTek0Gd9T5B8AtzKAkoZE70fneiiyPlSnUKKI4lp+mGEnQXcQEHLJAcIYDPSyBvsUbKUG2ri/XQ==", - "dev": true, - "optional": true - }, - "@esbuild/linux-loong64": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.2.tgz", - "integrity": "sha512-hn28+JNDTxxCpnYjdDYVMNTR3SKavyLlCHHkufHV91fkewpIyQchS1d8wSbmXhs1fiYDpNww8KTFlJ1dHsxeSw==", - "dev": true, - "optional": true - }, - "@esbuild/linux-mips64el": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.2.tgz", - "integrity": "sha512-KbXaC0Sejt7vD2fEgPoIKb6nxkfYW9OmFUK9XQE4//PvGIxNIfPk1NmlHmMg6f25x57rpmEFrn1OotASYIAaTg==", - "dev": true, - "optional": true - }, - "@esbuild/linux-ppc64": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.2.tgz", - "integrity": "sha512-dJ0kE8KTqbiHtA3Fc/zn7lCd7pqVr4JcT0JqOnbj4LLzYnp+7h8Qi4yjfq42ZlHfhOCM42rBh0EwHYLL6LEzcw==", - "dev": true, - "optional": true - }, - "@esbuild/linux-riscv64": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.2.tgz", - "integrity": "sha512-7Z/jKNFufZ/bbu4INqqCN6DDlrmOTmdw6D0gH+6Y7auok2r02Ur661qPuXidPOJ+FSgbEeQnnAGgsVynfLuOEw==", - "dev": true, - "optional": true - }, - "@esbuild/linux-s390x": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.2.tgz", - "integrity": "sha512-U+RinR6aXXABFCcAY4gSlv4CL1oOVvSSCdseQmGO66H+XyuQGZIUdhG56SZaDJQcLmrSfRmx5XZOWyCJPRqS7g==", - "dev": true, - "optional": true - }, - "@esbuild/linux-x64": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.2.tgz", - "integrity": "sha512-oxzHTEv6VPm3XXNaHPyUTTte+3wGv7qVQtqaZCrgstI16gCuhNOtBXLEBkBREP57YTd68P0VgDgG73jSD8bwXQ==", - "dev": true, - "optional": true - }, - "@esbuild/netbsd-x64": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.2.tgz", - "integrity": "sha512-WNa5zZk1XpTTwMDompZmvQLHszDDDN7lYjEHCUmAGB83Bgs20EMs7ICD+oKeT6xt4phV4NDdSi/8OfjPbSbZfQ==", - "dev": true, - "optional": true - }, - "@esbuild/openbsd-x64": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.2.tgz", - "integrity": "sha512-S6kI1aT3S++Dedb7vxIuUOb3oAxqxk2Rh5rOXOTYnzN8JzW1VzBd+IqPiSpgitu45042SYD3HCoEyhLKQcDFDw==", - "dev": true, - "optional": true - }, - "@esbuild/sunos-x64": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.2.tgz", - "integrity": "sha512-VXSSMsmb+Z8LbsQGcBMiM+fYObDNRm8p7tkUDMPG/g4fhFX5DEFmjxIEa3N8Zr96SjsJ1woAhF0DUnS3MF3ARw==", - "dev": true, - "optional": true - }, - "@esbuild/win32-arm64": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.2.tgz", - "integrity": "sha512-5NayUlSAyb5PQYFAU9x3bHdsqB88RC3aM9lKDAz4X1mo/EchMIT1Q+pSeBXNgkfNmRecLXA0O8xP+x8V+g/LKg==", - "dev": true, - "optional": true - }, - "@esbuild/win32-ia32": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.2.tgz", - "integrity": "sha512-47gL/ek1v36iN0wL9L4Q2MFdujR0poLZMJwhO2/N3gA89jgHp4MR8DKCmwYtGNksbfJb9JoTtbkoe6sDhg2QTA==", - "dev": true, - "optional": true - }, - "@esbuild/win32-x64": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.2.tgz", - "integrity": "sha512-tcuhV7ncXBqbt/Ybf0IyrMcwVOAPDckMK9rXNHtF17UTK18OKLpg08glminN06pt2WCoALhXdLfSPbVvK/6fxw==", - "dev": true, - "optional": true - }, - "@eslint-community/eslint-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^3.3.0" - } - }, - "@eslint-community/regexpp": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.7.0.tgz", - "integrity": "sha512-+HencqxU7CFJnQb7IKtuNBqS6Yx3Tz4kOL8BJXo+JyeiBm5MEX6pO8onXDkjrkCRlfYXS1Axro15ZjVFe9YgsA==", - "dev": true - }, - "@eslint/eslintrc": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.2.tgz", - "integrity": "sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==", - "dev": true, - "requires": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.6.0", - "globals": "^13.19.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, - "dependencies": { - "strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true - } - } - }, - "@eslint/js": { - "version": "8.47.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.47.0.tgz", - "integrity": "sha512-P6omY1zv5MItm93kLM8s2vr1HICJH8v0dvddDhysbIuZ+vcjOHg5Zbkf1mTkcmi2JA9oBG2anOkRnW8WJTS8Og==", - "dev": true - }, - "@grpc/grpc-js": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.9.0.tgz", - "integrity": "sha512-H8+iZh+kCE6VR/Krj6W28Y/ZlxoZ1fOzsNt77nrdE3knkbSelW1Uus192xOFCxHyeszLj8i4APQkSIXjAoOxXg==", - "requires": { - "@grpc/proto-loader": "^0.7.0", - "@types/node": ">=12.12.47" - } - }, - "@grpc/proto-loader": { - "version": "0.7.8", - "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.8.tgz", - "integrity": "sha512-GU12e2c8dmdXb7XUlOgYWZ2o2i+z9/VeACkxTA/zzAe2IjclC5PnVL0lpgjhrqfpDYHzM8B1TF6pqWegMYAzlA==", - "requires": { - "@types/long": "^4.0.1", - "lodash.camelcase": "^4.3.0", - "long": "^4.0.0", - "protobufjs": "^7.2.4", - "yargs": "^17.7.2" - }, - "dependencies": { - "cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - } - }, - "yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "requires": { - "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.5", - "yargs-parser": "^21.1.1" - } - }, - "yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==" - } - } - }, - "@jest/schemas": { - "version": "29.6.0", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.0.tgz", - "integrity": "sha512-rxLjXyJBTL4LQeJW3aKo0M/+GkCOXsO+8i9Iu7eDb6KwtP65ayoDsitrdPBtujxQ88k4wI2FNYfa6TOGwSn6cQ==", - "dev": true, - "requires": { - "@sinclair/typebox": "^0.27.8" - } - }, - "@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", - "dev": true, - "requires": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - } - }, - "@jridgewell/resolve-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", - "dev": true - }, - "@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", - "dev": true - }, - "@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", - "dev": true - }, - "@jridgewell/trace-mapping": { - "version": "0.3.18", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", - "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", - "dev": true, - "requires": { - "@jridgewell/resolve-uri": "3.1.0", - "@jridgewell/sourcemap-codec": "1.4.14" - }, - "dependencies": { - "@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", - "dev": true - } - } - }, - "@mapbox/node-pre-gyp": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.11.tgz", - "integrity": "sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==", - "dev": true, - "requires": { - "detect-libc": "^2.0.0", - "https-proxy-agent": "^5.0.0", - "make-dir": "^3.1.0", - "node-fetch": "^2.6.7", - "nopt": "^5.0.0", - "npmlog": "^5.0.1", - "rimraf": "^3.0.2", - "semver": "^7.3.5", - "tar": "^6.1.11" - } - }, - "@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - } - }, - "@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true - }, - "@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "requires": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - } - }, - "@pkgr/utils": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/@pkgr/utils/-/utils-2.4.2.tgz", - "integrity": "sha512-POgTXhjrTfbTV63DiFXav4lBHiICLKKwDeaKn9Nphwj7WH6m0hMMCaJkMyRWjgtPFyRKRVoMXXjczsTQRDEhYw==", - "dev": true, - "requires": { - "cross-spawn": "^7.0.3", - "fast-glob": "^3.3.0", - "is-glob": "^4.0.3", - "open": "^9.1.0", - "picocolors": "^1.0.0", - "tslib": "^2.6.0" - } - }, - "@protobufjs/aspromise": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", - "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==" - }, - "@protobufjs/base64": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", - "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" - }, - "@protobufjs/codegen": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", - "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" - }, - "@protobufjs/eventemitter": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", - "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==" - }, - "@protobufjs/fetch": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", - "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", - "requires": { - "@protobufjs/aspromise": "^1.1.1", - "@protobufjs/inquire": "^1.1.0" - } - }, - "@protobufjs/float": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", - "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==" - }, - "@protobufjs/inquire": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", - "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==" - }, - "@protobufjs/path": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", - "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==" - }, - "@protobufjs/pool": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", - "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==" - }, - "@protobufjs/utf8": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", - "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==" - }, - "@sinclair/typebox": { - "version": "0.27.8", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", - "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", - "dev": true - }, - "@tsconfig/node10": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", - "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", - "dev": true - }, - "@tsconfig/node12": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", - "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", - "dev": true - }, - "@tsconfig/node14": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", - "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", - "dev": true - }, - "@tsconfig/node16": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", - "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", - "dev": true - }, - "@types/amqplib": { - "version": "0.10.1", - "resolved": "https://registry.npmjs.org/@types/amqplib/-/amqplib-0.10.1.tgz", - "integrity": "sha512-j6ANKT79ncUDnAs/+9r9eDujxbeJoTjoVu33gHHcaPfmLQaMhvfbH2GqSe8KUM444epAp1Vl3peVOQfZk3UIqA==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/body-parser": { - "version": "1.19.2", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", - "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", - "requires": { - "@types/connect": "*", - "@types/node": "*" - } - }, - "@types/chai": { - "version": "4.3.5", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.5.tgz", - "integrity": "sha512-mEo1sAde+UCE6b2hxn332f1g1E8WfYRu6p5SvTKr2ZKC1f7gFJXk4h5PyGP9Dt6gCaG8y8XhwnXWC6Iy2cmBng==", - "dev": true - }, - "@types/chai-subset": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/@types/chai-subset/-/chai-subset-1.3.3.tgz", - "integrity": "sha512-frBecisrNGz+F4T6bcc+NLeolfiojh5FxW2klu669+8BARtyQv2C/GkNW6FUodVe4BroGMP/wER/YDGc7rEllw==", - "dev": true, - "requires": { - "@types/chai": "*" - } - }, - "@types/connect": { - "version": "3.4.35", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", - "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", - "requires": { - "@types/node": "*" - } - }, - "@types/express": { - "version": "4.17.17", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.17.tgz", - "integrity": "sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==", - "requires": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "^4.17.33", - "@types/qs": "*", - "@types/serve-static": "*" - } - }, - "@types/express-serve-static-core": { - "version": "4.17.35", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.35.tgz", - "integrity": "sha512-wALWQwrgiB2AWTT91CB62b6Yt0sNHpznUXeZEcnPU3DRdlDIz74x8Qg1UUYKSVFi+va5vKOLYRBI1bRKiLLKIg==", - "requires": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*", - "@types/send": "*" - } - }, - "@types/google-protobuf": { - "version": "3.15.6", - "resolved": "https://registry.npmjs.org/@types/google-protobuf/-/google-protobuf-3.15.6.tgz", - "integrity": "sha512-pYVNNJ+winC4aek+lZp93sIKxnXt5qMkuKmaqS3WGuTq0Bw1ZDYNBgzG5kkdtwcv+GmYJGo3yEg6z2cKKAiEdw==", - "dev": true - }, - "@types/http-errors": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.1.tgz", - "integrity": "sha512-/K3ds8TRAfBvi5vfjuz8y6+GiAYBZ0x4tXv1Av6CWBWn0IlADc+ZX9pMq7oU0fNQPnBwIZl3rmeLp6SBApbxSQ==" - }, - "@types/long": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz", - "integrity": "sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==" - }, - "@types/mime": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", - "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==" - }, - "@types/node": { - "version": "18.15.9", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.9.tgz", - "integrity": "sha512-dUxhiNzBLr6IqlZXz6e/rN2YQXlFgOei/Dxy+e3cyXTJ4txSUbGT2/fmnD6zd/75jDMeW5bDee+YXxlFKHoV0A==" - }, - "@types/qs": { - "version": "6.9.7", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", - "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==" - }, - "@types/range-parser": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", - "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==" - }, - "@types/semver": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.0.tgz", - "integrity": "sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==", - "dev": true - }, - "@types/send": { - "version": "0.17.1", - "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.1.tgz", - "integrity": "sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q==", - "requires": { - "@types/mime": "^1", - "@types/node": "*" - } - }, - "@types/serve-static": { - "version": "1.15.2", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.2.tgz", - "integrity": "sha512-J2LqtvFYCzaj8pVYKw8klQXrLLk7TBZmQ4ShlcdkELFKGwGMfevMLneMMRkMgZxotOD9wg497LpC7O8PcvAmfw==", - "requires": { - "@types/http-errors": "*", - "@types/mime": "*", - "@types/node": "*" - } - }, - "@vitest/expect": { - "version": "0.33.0", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-0.33.0.tgz", - "integrity": "sha512-sVNf+Gla3mhTCxNJx+wJLDPp/WcstOe0Ksqz4Vec51MmgMth/ia0MGFEkIZmVGeTL5HtjYR4Wl/ZxBxBXZJTzQ==", - "dev": true, - "requires": { - "@vitest/spy": "0.33.0", - "@vitest/utils": "0.33.0", - "chai": "^4.3.7" - } - }, - "@vitest/runner": { - "version": "0.33.0", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-0.33.0.tgz", - "integrity": "sha512-UPfACnmCB6HKRHTlcgCoBh6ppl6fDn+J/xR8dTufWiKt/74Y9bHci5CKB8tESSV82zKYtkBJo9whU3mNvfaisg==", - "dev": true, - "requires": { - "@vitest/utils": "0.33.0", - "p-limit": "^4.0.0", - "pathe": "^1.1.1" - }, - "dependencies": { - "p-limit": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", - "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", - "dev": true, - "requires": { - "yocto-queue": "^1.0.0" - } - }, - "yocto-queue": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", - "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", - "dev": true - } - } - }, - "@vitest/snapshot": { - "version": "0.33.0", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-0.33.0.tgz", - "integrity": "sha512-tJjrl//qAHbyHajpFvr8Wsk8DIOODEebTu7pgBrP07iOepR5jYkLFiqLq2Ltxv+r0uptUb4izv1J8XBOwKkVYA==", - "dev": true, - "requires": { - "magic-string": "^0.30.1", - "pathe": "^1.1.1", - "pretty-format": "^29.5.0" - } - }, - "@vitest/spy": { - "version": "0.33.0", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-0.33.0.tgz", - "integrity": "sha512-Kv+yZ4hnH1WdiAkPUQTpRxW8kGtH8VRTnus7ZTGovFYM1ZezJpvGtb9nPIjPnptHbsyIAxYZsEpVPYgtpjGnrg==", - "dev": true, - "requires": { - "tinyspy": "^2.1.1" - } - }, - "@vitest/utils": { - "version": "0.33.0", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-0.33.0.tgz", - "integrity": "sha512-pF1w22ic965sv+EN6uoePkAOTkAPWM03Ri/jXNyMIKBb/XHLDPfhLvf/Fa9g0YECevAIz56oVYXhodLvLQ/awA==", - "dev": true, - "requires": { - "diff-sequences": "^29.4.3", - "loupe": "^2.3.6", - "pretty-format": "^29.5.0" - } - }, - "abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "dev": true - }, - "accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "requires": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - } - }, - "acorn": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", - "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", - "dev": true - }, - "acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "requires": {} - }, - "acorn-walk": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", - "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", - "dev": true - }, - "agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dev": true, - "requires": { - "debug": "4" - } - }, - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "aproba": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", - "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", - "dev": true - }, - "are-we-there-yet": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", - "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", - "dev": true, - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^3.6.0" - } - }, - "arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true - }, - "argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" - }, - "array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true - }, - "assertion-error": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", - "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", - "dev": true - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" - }, - "at-least-node": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", - "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", - "dev": true - }, - "axios": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.4.0.tgz", - "integrity": "sha512-S4XCWMEmzvo64T9GfvQDOXgYRDJ/wsSZc7Jvdgx5u1sd0JwsuPLqb3SYmusag+edF6ziyMensPVqLTSc1PiSEA==", - "requires": { - "follow-redirects": "^1.15.0", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" - } - }, - "balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" - }, - "base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "dev": true - }, - "big-integer": { - "version": "1.6.51", - "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz", - "integrity": "sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==", - "dev": true - }, - "binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true - }, - "bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "dev": true, - "requires": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, - "body-parser": { - "version": "1.20.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", - "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", - "requires": { - "bytes": "3.1.2", - "content-type": "~1.0.5", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.11.0", - "raw-body": "2.5.2", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - } - } - }, - "bplist-parser": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.2.0.tgz", - "integrity": "sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==", - "dev": true, - "requires": { - "big-integer": "^1.6.44" - } - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "dev": true, - "requires": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "bundle-name": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-3.0.0.tgz", - "integrity": "sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw==", - "dev": true, - "requires": { - "run-applescript": "^5.0.0" - } - }, - "bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" - }, - "cac": { - "version": "6.7.14", - "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", - "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", - "dev": true - }, - "call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "requires": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - } - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true - }, - "chai": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.7.tgz", - "integrity": "sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==", - "dev": true, - "requires": { - "assertion-error": "^1.1.0", - "check-error": "^1.0.2", - "deep-eql": "^4.1.2", - "get-func-name": "^2.0.0", - "loupe": "^2.3.1", - "pathval": "^1.1.1", - "type-detect": "^4.0.5" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "check-error": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", - "integrity": "sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==", - "dev": true - }, - "chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "dev": true, - "requires": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "fsevents": "~2.3.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - } - }, - "chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", - "dev": true - }, - "cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "color-support": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", - "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", - "dev": true - }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" - }, - "console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", - "dev": true - }, - "content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", - "requires": { - "safe-buffer": "5.2.1" - } - }, - "content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==" - }, - "cookie": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", - "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==" - }, - "cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" - }, - "core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "dev": true - }, - "create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "dev": true - }, - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "decompress-response": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", - "dev": true, - "requires": { - "mimic-response": "^3.1.0" - } - }, - "deep-eql": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz", - "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==", - "dev": true, - "requires": { - "type-detect": "^4.0.0" - } - }, - "deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "dev": true - }, - "deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true - }, - "deepmerge": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", - "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==" - }, - "default-browser": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-4.0.0.tgz", - "integrity": "sha512-wX5pXO1+BrhMkSbROFsyxUm0i/cJEScyNhA4PPxc41ICuv05ZZB/MX28s8aZx6xjmatvebIapF6hLEKEcpneUA==", - "dev": true, - "requires": { - "bundle-name": "^3.0.0", - "default-browser-id": "^3.0.0", - "execa": "^7.1.1", - "titleize": "^3.0.0" - } - }, - "default-browser-id": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-3.0.0.tgz", - "integrity": "sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA==", - "dev": true, - "requires": { - "bplist-parser": "^0.2.0", - "untildify": "^4.0.0" - } - }, - "define-lazy-prop": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", - "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", - "dev": true - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" - }, - "delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", - "dev": true - }, - "depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" - }, - "destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==" - }, - "detect-libc": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz", - "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==", - "dev": true - }, - "diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true - }, - "diff-sequences": { - "version": "29.4.3", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.4.3.tgz", - "integrity": "sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA==", - "dev": true - }, - "dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "requires": { - "path-type": "^4.0.0" - } - }, - "doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "dotenv": { - "version": "16.3.1", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.3.1.tgz", - "integrity": "sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==" - }, - "ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==" - }, - "end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dev": true, - "requires": { - "once": "^1.4.0" - } - }, - "esbuild": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.2.tgz", - "integrity": "sha512-G6hPax8UbFakEj3hWO0Vs52LQ8k3lnBhxZWomUJDxfz3rZTLqF5k/FCzuNdLx2RbpBiQQF9H9onlDDH1lZsnjg==", - "dev": true, - "requires": { - "@esbuild/android-arm": "0.19.2", - "@esbuild/android-arm64": "0.19.2", - "@esbuild/android-x64": "0.19.2", - "@esbuild/darwin-arm64": "0.19.2", - "@esbuild/darwin-x64": "0.19.2", - "@esbuild/freebsd-arm64": "0.19.2", - "@esbuild/freebsd-x64": "0.19.2", - "@esbuild/linux-arm": "0.19.2", - "@esbuild/linux-arm64": "0.19.2", - "@esbuild/linux-ia32": "0.19.2", - "@esbuild/linux-loong64": "0.19.2", - "@esbuild/linux-mips64el": "0.19.2", - "@esbuild/linux-ppc64": "0.19.2", - "@esbuild/linux-riscv64": "0.19.2", - "@esbuild/linux-s390x": "0.19.2", - "@esbuild/linux-x64": "0.19.2", - "@esbuild/netbsd-x64": "0.19.2", - "@esbuild/openbsd-x64": "0.19.2", - "@esbuild/sunos-x64": "0.19.2", - "@esbuild/win32-arm64": "0.19.2", - "@esbuild/win32-ia32": "0.19.2", - "@esbuild/win32-x64": "0.19.2" - } - }, - "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" - }, - "escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" - }, - "escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true - }, - "eslint": { - "version": "8.47.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.47.0.tgz", - "integrity": "sha512-spUQWrdPt+pRVP1TTJLmfRNJJHHZryFmptzcafwSvHsceV81djHOdnEeDmkdotZyLNjDhrOasNK8nikkoG1O8Q==", - "dev": true, - "requires": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.2", - "@eslint/js": "^8.47.0", - "@humanwhocodes/config-array": "^0.11.10", - "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "ajv": "^6.12.4", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.2", - "eslint-visitor-keys": "^3.4.3", - "espree": "^9.6.1", - "esquery": "^1.4.2", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "graphemer": "^1.4.0", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "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" - }, - "dependencies": { - "eslint-scope": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", - "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", - "dev": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - } - }, - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - }, - "glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "requires": { - "is-glob": "^4.0.3" - } - } - } - }, - "eslint-config-prettier": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.0.0.tgz", - "integrity": "sha512-IcJsTkJae2S35pRsRAwoCE+925rJJStOdkKnLVgtE+tEpqU0EVVM7OqrwxqgptKdX29NUwC82I5pXsGFIgSevw==", - "dev": true, - "requires": {} - }, - "eslint-plugin-prettier": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.0.0.tgz", - "integrity": "sha512-AgaZCVuYDXHUGxj/ZGu1u8H8CYgDY3iG6w5kUFw4AzMVXzB7VvbKgYR4nATIN+OvUrghMbiDLeimVjVY5ilq3w==", - "dev": true, - "requires": { - "prettier-linter-helpers": "^1.0.0", - "synckit": "^0.8.5" - } - }, - "eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true - }, - "espree": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", - "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", - "dev": true, - "requires": { - "acorn": "^8.9.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" - } - }, - "esquery": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", - "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", - "dev": true, - "requires": { - "estraverse": "^5.1.0" - }, - "dependencies": { - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - } - } - }, - "esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "requires": { - "estraverse": "^5.2.0" - }, - "dependencies": { - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - } - } - }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true - }, - "etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==" - }, - "execa": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-7.2.0.tgz", - "integrity": "sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==", - "dev": true, - "requires": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.1", - "human-signals": "^4.3.0", - "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" - } - }, - "expand-template": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", - "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", - "dev": true - }, - "express": { - "version": "4.18.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", - "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", - "requires": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.1", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.5.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.2.0", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.7", - "qs": "6.11.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.18.0", - "serve-static": "1.15.0", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "dependencies": { - "body-parser": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", - "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", - "requires": { - "bytes": "3.1.2", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.11.0", - "raw-body": "2.5.1", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - } - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "raw-body": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", - "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", - "requires": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - } - } - } - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "fast-diff": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", - "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", - "dev": true - }, - "fast-glob": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.0.tgz", - "integrity": "sha512-ChDuvbOypPuNjO8yIDf36x7BlZX1smcUMTTcyoIjycexOxd6DFsKsg21qVBzEmr3G7fUKIRy2/psii+CIUt7FA==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - } - }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true - }, - "fastq": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", - "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", - "dev": true, - "requires": { - "reusify": "^1.0.4" - } - }, - "file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, - "requires": { - "flat-cache": "^3.0.4" - } - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "finalhandler": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", - "requires": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - } - } - }, - "follow-redirects": { - "version": "1.15.2", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", - "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==" - }, - "form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - } - }, - "forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" - }, - "fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==" - }, - "from2": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", - "integrity": "sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.0" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "fs-constants": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", - "dev": true - }, - "fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "dev": true, - "requires": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - } - }, - "fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "dev": true, - "requires": { - "minipass": "^3.0.0" - }, - "dependencies": { - "minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - } - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" - }, - "gauge": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", - "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", - "dev": true, - "requires": { - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.2", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.1", - "object-assign": "^4.1.1", - "signal-exit": "^3.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wide-align": "^1.1.2" - } - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" - }, - "get-func-name": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", - "integrity": "sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==", - "dev": true - }, - "get-intrinsic": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", - "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", - "requires": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3" - } - }, - "get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true - }, - "github-from-package": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", - "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==", - "dev": true - }, - "glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "globals": { - "version": "13.21.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.21.0.tgz", - "integrity": "sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg==", - "dev": true, - "requires": { - "type-fest": "^0.20.2" - } - }, - "globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "requires": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - } - }, - "globrex": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz", - "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==", - "dev": true - }, - "google-protobuf": { - "version": "3.21.2", - "resolved": "https://registry.npmjs.org/google-protobuf/-/google-protobuf-3.21.2.tgz", - "integrity": "sha512-3MSOYFO5U9mPGikIYCzK0SaThypfGgS6bHqrUGXG3DPHCrb+txNqeEcns1W0lkGfk0rCyNXm7xB9rMxnCiZOoA==" - }, - "graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true - }, - "graphemer": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "dev": true - }, - "grpc_tools_node_protoc_ts": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/grpc_tools_node_protoc_ts/-/grpc_tools_node_protoc_ts-5.3.3.tgz", - "integrity": "sha512-M/YrklvVXMtuuj9kb42PxeouZhs7Ul+R4e/31XwrankUcKL8cQQP50Q9q+KEHGyHQaPt6VtKKsxMgLaKbCxeww==", - "dev": true, - "requires": { - "google-protobuf": "3.15.8", - "handlebars": "4.7.7" - }, - "dependencies": { - "google-protobuf": { - "version": "3.15.8", - "resolved": "https://registry.npmjs.org/google-protobuf/-/google-protobuf-3.15.8.tgz", - "integrity": "sha512-2jtfdqTaSxk0cuBJBtTTWsot4WtR9RVr2rXg7x7OoqiuOKopPrwXpM1G4dXIkLcUNRh3RKzz76C8IOkksZSeOw==", - "dev": true - } - } - }, - "grpc-tools": { - "version": "1.12.4", - "resolved": "https://registry.npmjs.org/grpc-tools/-/grpc-tools-1.12.4.tgz", - "integrity": "sha512-5+mLAJJma3BjnW/KQp6JBjUMgvu7Mu3dBvBPd1dcbNIb+qiR0817zDpgPjS7gRb+l/8EVNIa3cB02xI9JLToKg==", - "dev": true, - "requires": { - "@mapbox/node-pre-gyp": "^1.0.5" - } - }, - "handlebars": { - "version": "4.7.7", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz", - "integrity": "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==", - "dev": true, - "requires": { - "minimist": "^1.2.5", - "neo-async": "^2.6.0", - "source-map": "^0.6.1", - "uglify-js": "^3.1.4", - "wordwrap": "^1.0.0" - } - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "has-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", - "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==" - }, - "has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" - }, - "has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", - "dev": true - }, - "http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "requires": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - } - }, - "https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "dev": true, - "requires": { - "agent-base": "6", - "debug": "4" - } - }, - "human-signals": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz", - "integrity": "sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==", - "dev": true - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "dev": true - }, - "ignore": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", - "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", - "dev": true - }, - "ignore-by-default": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", - "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==", - "dev": true - }, - "import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - } - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true - }, - "into-stream": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/into-stream/-/into-stream-6.0.0.tgz", - "integrity": "sha512-XHbaOAvP+uFKUFsOgoNPRjLkwB+I22JFPFe5OjTkQ0nwgj6+pSjb4NmB6VMxaPshLiOf+zcpOCBQuLwC1KHhZA==", - "dev": true, - "requires": { - "from2": "^2.3.0", - "p-is-promise": "^3.0.0" - } - }, - "ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" - }, - "is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "requires": { - "binary-extensions": "^2.0.0" - } - }, - "is-core-module": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz", - "integrity": "sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==", - "dev": true, - "requires": { - "has": "^1.0.3" - } - }, - "is-docker": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", - "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", - "dev": true - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" - }, - "is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-inside-container": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", - "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", - "dev": true, - "requires": { - "is-docker": "^3.0.0" - } - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true - }, - "is-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", - "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", - "dev": true - }, - "is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "dev": true, - "requires": { - "is-docker": "^2.0.0" - }, - "dependencies": { - "is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", - "dev": true - } - } - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true - }, - "json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==" - }, - "jsonc-parser": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", - "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", - "dev": true - }, - "jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^2.0.0" - } - }, - "levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "requires": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - } - }, - "local-pkg": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.4.3.tgz", - "integrity": "sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==", - "dev": true - }, - "lodash.camelcase": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", - "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==" - }, - "lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, - "long": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", - "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" - }, - "loupe": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.6.tgz", - "integrity": "sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==", - "dev": true, - "requires": { - "get-func-name": "^2.0.0" - } - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "magic-string": { - "version": "0.30.1", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.1.tgz", - "integrity": "sha512-mbVKXPmS0z0G4XqFDCTllmDQ6coZzn94aMlb0o/A4HEHJCKcanlDZwYJgwnkmgD3jyWhUgj9VsPrfd972yPffA==", - "dev": true, - "requires": { - "@jridgewell/sourcemap-codec": "^1.4.15" - } - }, - "make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, - "requires": { - "semver": "^6.0.0" - }, - "dependencies": { - "semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true - } - } - }, - "make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true - }, - "media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==" - }, - "merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" - }, - "merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true - }, - "merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true - }, - "methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==" - }, - "micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "requires": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - } - }, - "mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" - }, - "mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" - }, - "mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "requires": { - "mime-db": "1.52.0" - } - }, - "mimic-fn": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", - "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", - "dev": true - }, - "mimic-response": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", - "dev": true - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "dev": true - }, - "minipass": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", - "dev": true - }, - "minizlib": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", - "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", - "dev": true, - "requires": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - }, - "dependencies": { - "minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - } - } - }, - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true - }, - "mkdirp-classic": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", - "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", - "dev": true - }, - "mlly": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.4.0.tgz", - "integrity": "sha512-ua8PAThnTwpprIaU47EPeZ/bPUVp2QYBbWMphUQpVdBI3Lgqzm5KZQ45Agm3YJedHXaIHl6pBGabaLSUPPSptg==", - "dev": true, - "requires": { - "acorn": "^8.9.0", - "pathe": "^1.1.1", - "pkg-types": "^1.0.3", - "ufo": "^1.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "multistream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/multistream/-/multistream-4.1.0.tgz", - "integrity": "sha512-J1XDiAmmNpRCBfIWJv+n0ymC4ABcf/Pl+5YvC5B/D2f/2+8PtHvCNxMPKiQcZyi922Hq69J2YOpb1pTywfifyw==", - "dev": true, - "requires": { - "once": "^1.4.0", - "readable-stream": "^3.6.0" - } - }, - "nanoid": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", - "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", - "dev": true - }, - "napi-build-utils": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", - "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==", - "dev": true - }, - "natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true - }, - "negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==" - }, - "neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "dev": true - }, - "node-abi": { - "version": "3.45.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.45.0.tgz", - "integrity": "sha512-iwXuFrMAcFVi/ZoZiqq8BzAdsLw9kxDfTC0HMyjXfSL/6CSDAGD5UmR7azrAgWV1zKYq7dUUMj4owusBWKLsiQ==", - "dev": true, - "requires": { - "semver": "^7.3.5" - } - }, - "node-fetch": { - "version": "2.6.12", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.12.tgz", - "integrity": "sha512-C/fGU2E8ToujUivIO0H+tpQ6HWo4eEmchoPIoXtxCrVghxdKq+QOHqEZW7tuP3KlV3bC8FRMO5nMCC7Zm1VP6g==", - "dev": true, - "requires": { - "whatwg-url": "^5.0.0" - } - }, - "nodemon": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.0.1.tgz", - "integrity": "sha512-g9AZ7HmkhQkqXkRc20w+ZfQ73cHLbE8hnPbtaFbFtCumZsjyMhKk9LajQ07U5Ux28lvFjZ5X7HvWR1xzU8jHVw==", - "dev": true, - "requires": { - "chokidar": "^3.5.2", - "debug": "^3.2.7", - "ignore-by-default": "^1.0.1", - "minimatch": "^3.1.2", - "pstree.remy": "^1.1.8", - "semver": "^7.5.3", - "simple-update-notifier": "^2.0.0", - "supports-color": "^5.5.0", - "touch": "^3.1.0", - "undefsafe": "^2.0.5" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "nopt": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", - "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", - "dev": true, - "requires": { - "abbrev": "1" - } - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true - }, - "npm-run-path": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", - "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==", - "dev": true, - "requires": { - "path-key": "^4.0.0" - }, - "dependencies": { - "path-key": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", - "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", - "dev": true - } - } - }, - "npmlog": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", - "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", - "dev": true, - "requires": { - "are-we-there-yet": "^2.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^3.0.0", - "set-blocking": "^2.0.0" - } - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "dev": true - }, - "object-inspect": { - "version": "1.12.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", - "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==" - }, - "on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "requires": { - "ee-first": "1.1.1" - } - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "requires": { - "wrappy": "1" - } - }, - "onetime": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", - "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", - "dev": true, - "requires": { - "mimic-fn": "^4.0.0" - } - }, - "open": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/open/-/open-9.1.0.tgz", - "integrity": "sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg==", - "dev": true, - "requires": { - "default-browser": "^4.0.0", - "define-lazy-prop": "^3.0.0", - "is-inside-container": "^1.0.0", - "is-wsl": "^2.2.0" - } - }, - "optionator": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", - "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", - "dev": true, - "requires": { - "@aashutoshrathi/word-wrap": "^1.2.3", - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0" - } - }, - "p-is-promise": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-3.0.0.tgz", - "integrity": "sha512-Wo8VsW4IRQSKVXsJCn7TomUaVtyfjVDn3nUP7kE967BQk0CwFpdbZs0X0uk5sW9mkBa9eNM7hCMaG93WUAwxYQ==", - "dev": true - }, - "parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" - }, - "path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" - }, - "path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true - }, - "pathe": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.1.tgz", - "integrity": "sha512-d+RQGp0MAYTIaDBIMmOfMwz3E+LOZnxx1HZd5R18mmCZY0QBlK0LDZfPc8FW8Ed2DlvsuE6PRjroDY+wg4+j/Q==", - "dev": true - }, - "pathval": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", - "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", - "dev": true - }, - "picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true - }, - "picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true - }, - "pkg": { - "version": "5.8.1", - "resolved": "https://registry.npmjs.org/pkg/-/pkg-5.8.1.tgz", - "integrity": "sha512-CjBWtFStCfIiT4Bde9QpJy0KeH19jCfwZRJqHFDFXfhUklCx8JoFmMj3wgnEYIwGmZVNkhsStPHEOnrtrQhEXA==", - "dev": true, - "requires": { - "@babel/generator": "7.18.2", - "@babel/parser": "7.18.4", - "@babel/types": "7.19.0", - "chalk": "^4.1.2", - "fs-extra": "^9.1.0", - "globby": "^11.1.0", - "into-stream": "^6.0.0", - "is-core-module": "2.9.0", - "minimist": "^1.2.6", - "multistream": "^4.1.0", - "pkg-fetch": "3.4.2", - "prebuild-install": "7.1.1", - "resolve": "^1.22.0", - "stream-meter": "^1.0.4" - } - }, - "pkg-fetch": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/pkg-fetch/-/pkg-fetch-3.4.2.tgz", - "integrity": "sha512-0+uijmzYcnhC0hStDjm/cl2VYdrmVVBpe7Q8k9YBojxmR5tG8mvR9/nooQq3QSXiQqORDVOTY3XqMEqJVIzkHA==", - "dev": true, - "requires": { - "chalk": "^4.1.2", - "fs-extra": "^9.1.0", - "https-proxy-agent": "^5.0.0", - "node-fetch": "^2.6.6", - "progress": "^2.0.3", - "semver": "^7.3.5", - "tar-fs": "^2.1.1", - "yargs": "^16.2.0" - } - }, - "pkg-types": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.0.3.tgz", - "integrity": "sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==", - "dev": true, - "requires": { - "jsonc-parser": "^3.2.0", - "mlly": "^1.2.0", - "pathe": "^1.1.0" - } - }, - "postcss": { - "version": "8.4.26", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.26.tgz", - "integrity": "sha512-jrXHFF8iTloAenySjM/ob3gSj7pCu0Ji49hnjqzsgSRa50hkWCKD0HQ+gMNJkW38jBI68MpAAg7ZWwHwX8NMMw==", - "dev": true, - "requires": { - "nanoid": "^3.3.6", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - } - }, - "prebuild-install": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.1.tgz", - "integrity": "sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==", - "dev": true, - "requires": { - "detect-libc": "^2.0.0", - "expand-template": "^2.0.3", - "github-from-package": "0.0.0", - "minimist": "^1.2.3", - "mkdirp-classic": "^0.5.3", - "napi-build-utils": "^1.0.1", - "node-abi": "^3.3.0", - "pump": "^3.0.0", - "rc": "^1.2.7", - "simple-get": "^4.0.0", - "tar-fs": "^2.0.0", - "tunnel-agent": "^0.6.0" - } - }, - "prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true - }, - "prettier": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.0.2.tgz", - "integrity": "sha512-o2YR9qtniXvwEZlOKbveKfDQVyqxbEIWn48Z8m3ZJjBjcCmUy3xZGIv+7AkaeuaTr6yPXJjwv07ZWlsWbEy1rQ==", - "dev": true - }, - "prettier-linter-helpers": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", - "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", - "dev": true, - "requires": { - "fast-diff": "^1.1.2" - } - }, - "pretty-format": { - "version": "29.6.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.1.tgz", - "integrity": "sha512-7jRj+yXO0W7e4/tSJKoR7HRIHLPPjtNaUGG2xxKQnGvPNRkgWcQ0AZX6P4KBRJN4FcTBWb3sa7DVUJmocYuoog==", - "dev": true, - "requires": { - "@jest/schemas": "^29.6.0", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true - } - } - }, - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true - }, - "progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true - }, - "protobufjs": { - "version": "7.2.4", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.2.4.tgz", - "integrity": "sha512-AT+RJgD2sH8phPmCf7OUZR8xGdcJRga4+1cOaXJ64hvcSkVhNcRHOwIxUatPH15+nj59WAGTDv3LSGZPEQbJaQ==", - "requires": { - "@protobufjs/aspromise": "^1.1.2", - "@protobufjs/base64": "^1.1.2", - "@protobufjs/codegen": "^2.0.4", - "@protobufjs/eventemitter": "^1.1.0", - "@protobufjs/fetch": "^1.1.0", - "@protobufjs/float": "^1.0.2", - "@protobufjs/inquire": "^1.1.0", - "@protobufjs/path": "^1.1.2", - "@protobufjs/pool": "^1.1.0", - "@protobufjs/utf8": "^1.1.0", - "@types/node": ">=13.7.0", - "long": "^5.0.0" - }, - "dependencies": { - "long": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", - "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==" - } - } - }, - "proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "requires": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - } - }, - "proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" - }, - "pstree.remy": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", - "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", - "dev": true - }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "punycode": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", - "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", - "dev": true - }, - "qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", - "requires": { - "side-channel": "^1.0.4" - } - }, - "queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true - }, - "range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" - }, - "raw-body": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", - "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", - "requires": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - } - }, - "rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "dev": true, - "requires": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - } - }, - "react-is": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", - "dev": true - }, - "readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "requires": { - "picomatch": "^2.2.1" - } - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==" - }, - "resolve": { - "version": "1.22.2", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", - "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", - "dev": true, - "requires": { - "is-core-module": "^2.11.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "dependencies": { - "is-core-module": { - "version": "2.12.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz", - "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==", - "dev": true, - "requires": { - "has": "^1.0.3" - } - } - } - }, - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true - }, - "reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "rollup": { - "version": "3.26.2", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.26.2.tgz", - "integrity": "sha512-6umBIGVz93er97pMgQO08LuH3m6PUb3jlDUUGFsNJB6VgTCUaDFpupf5JfU30529m/UKOgmiX+uY6Sx8cOYpLA==", - "dev": true, - "requires": { - "fsevents": "~2.3.2" - } - }, - "run-applescript": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-5.0.0.tgz", - "integrity": "sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg==", - "dev": true, - "requires": { - "execa": "^5.0.0" - }, - "dependencies": { - "execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dev": true, - "requires": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - } - }, - "human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "dev": true - }, - "is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true - }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true - }, - "npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, - "requires": { - "path-key": "^3.0.0" - } - }, - "onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "requires": { - "mimic-fn": "^2.1.0" - } - }, - "strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true - } - } - }, - "run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "requires": { - "queue-microtask": "^1.2.2" - } - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "send": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", - "requires": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.0.1" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - }, - "dependencies": { - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - } - } - }, - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - } - } - }, - "serve-static": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", - "requires": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.18.0" - } - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", - "dev": true - }, - "setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" - }, - "side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "requires": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - } - }, - "siginfo": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", - "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", - "dev": true - }, - "signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, - "simple-concat": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", - "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", - "dev": true - }, - "simple-get": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", - "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", - "dev": true, - "requires": { - "decompress-response": "^6.0.0", - "once": "^1.3.1", - "simple-concat": "^1.0.0" - } - }, - "simple-update-notifier": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", - "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==", - "dev": true, - "requires": { - "semver": "^7.5.3" - } - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", - "dev": true - }, - "stackback": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", - "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", - "dev": true - }, - "statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" - }, - "std-env": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.3.3.tgz", - "integrity": "sha512-Rz6yejtVyWnVjC1RFvNmYL10kgjC49EOghxWn0RFqlCHGFpQx+Xe7yW3I4ceK1SGrWIGMjD5Kbue8W/udkbMJg==", - "dev": true - }, - "stream-meter": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/stream-meter/-/stream-meter-1.0.4.tgz", - "integrity": "sha512-4sOEtrbgFotXwnEuzzsQBYEV1elAeFSO8rSGeTwabuX1RRn/kEq9JVH7I0MRBhKVRR0sJkr0M0QCH7yOLf9fhQ==", - "dev": true, - "requires": { - "readable-stream": "^2.1.4" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dev": true, - "requires": { - "safe-buffer": "~5.2.0" - } - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true - }, - "strip-final-newline": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", - "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", - "dev": true - }, - "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", - "dev": true - }, - "strip-literal": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-1.0.1.tgz", - "integrity": "sha512-QZTsipNpa2Ppr6v1AmJHESqJ3Uz247MUS0OjrnnZjFAvEoWqxuyFuXn2xLgMtRnijJShAa1HL0gtJyUs7u7n3Q==", - "dev": true, - "requires": { - "acorn": "^8.8.2" - } - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - }, - "supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true - }, - "swagger-autogen": { - "version": "2.23.5", - "resolved": "https://registry.npmjs.org/swagger-autogen/-/swagger-autogen-2.23.5.tgz", - "integrity": "sha512-4Tl2+XhZMyHoBYkABnScHtQE0lKPKUD3NBt09mClrI6UKOUYljKlYw1xiFVwsHCTGR2hAXmhT4PpgjruCtt1ZA==", - "requires": { - "acorn": "^7.4.1", - "deepmerge": "^4.2.2", - "glob": "^7.1.7", - "json5": "^2.2.3" - }, - "dependencies": { - "acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==" - } - } - }, - "synckit": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.8.5.tgz", - "integrity": "sha512-L1dapNV6vu2s/4Sputv8xGsCdAVlb5nRDMFU/E27D44l5U6cw1g0dGd45uLc+OXjNMmF4ntiMdCimzcjFKQI8Q==", - "dev": true, - "requires": { - "@pkgr/utils": "^2.3.1", - "tslib": "^2.5.0" - } - }, - "tar": { - "version": "6.1.15", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.15.tgz", - "integrity": "sha512-/zKt9UyngnxIT/EAGYuxaMYgOIJiP81ab9ZfkILq4oNLPFX50qyYmu7jRj9qeXoxmJHjGlbH0+cm2uy1WCs10A==", - "dev": true, - "requires": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^5.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - } - }, - "tar-fs": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", - "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", - "dev": true, - "requires": { - "chownr": "^1.1.1", - "mkdirp-classic": "^0.5.2", - "pump": "^3.0.0", - "tar-stream": "^2.1.4" - }, - "dependencies": { - "chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", - "dev": true - } - } - }, - "tar-stream": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", - "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", - "dev": true, - "requires": { - "bl": "^4.0.3", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" - } - }, - "tinybench": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.5.0.tgz", - "integrity": "sha512-kRwSG8Zx4tjF9ZiyH4bhaebu+EDz1BOx9hOigYHlUW4xxI/wKIUQUqo018UlU4ar6ATPBsaMrdbKZ+tmPdohFA==", - "dev": true - }, - "tinypool": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-0.6.0.tgz", - "integrity": "sha512-FdswUUo5SxRizcBc6b1GSuLpLjisa8N8qMyYoP3rl+bym+QauhtJP5bvZY1ytt8krKGmMLYIRl36HBZfeAoqhQ==", - "dev": true - }, - "tinyspy": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-2.1.1.tgz", - "integrity": "sha512-XPJL2uSzcOyBMky6OFrusqWlzfFrXtE0hPuMgW8A2HmaqrPo4ZQHRN/V0QXN3FSjKxpsbRrFc5LI7KOwBsT1/w==", - "dev": true - }, - "titleize": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/titleize/-/titleize-3.0.0.tgz", - "integrity": "sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ==", - "dev": true - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "dev": true - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - }, - "toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" - }, - "touch": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", - "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", - "dev": true, - "requires": { - "nopt": "~1.0.10" - }, - "dependencies": { - "nopt": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", - "integrity": "sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==", - "dev": true, - "requires": { - "abbrev": "1" - } - } - } - }, - "tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "dev": true - }, - "ts-node": { - "version": "10.9.1", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", - "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", - "dev": true, - "requires": { - "@cspotcode/source-map-support": "^0.8.0", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "v8-compile-cache-lib": "^3.0.1", - "yn": "3.1.1" - } - }, - "tsconfig-paths": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", - "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==", - "dev": true, - "requires": { - "json5": "^2.2.2", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" - } - }, - "tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", - "dev": true - }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", - "dev": true, - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "requires": { - "prelude-ls": "^1.2.1" - } - }, - "type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true - }, - "type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true - }, - "type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "requires": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - } - }, - "typescript": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.2.tgz", - "integrity": "sha512-wVORMBGO/FAs/++blGNeAVdbNKtIh1rbBL2EyQ1+J9lClJ93KiiKe8PmFIVdXhHcyv44SL9oglmfeSsndo0jRw==", - "dev": true - }, - "ufo": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.1.2.tgz", - "integrity": "sha512-TrY6DsjTQQgyS3E3dBaOXf0TpPD8u9FVrVYmKVegJuFw51n/YB9XPt+U6ydzFG5ZIN7+DIjPbNmXoBj9esYhgQ==", - "dev": true - }, - "uglify-js": { - "version": "3.17.4", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz", - "integrity": "sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==", - "dev": true, - "optional": true - }, - "undefsafe": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", - "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", - "dev": true - }, - "universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true - }, - "unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==" - }, - "untildify": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", - "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", - "dev": true - }, - "uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "requires": { - "punycode": "^2.1.0" - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true - }, - "utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==" - }, - "v8-compile-cache-lib": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", - "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", - "dev": true - }, - "vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==" - }, - "vite": { - "version": "4.4.4", - "resolved": "https://registry.npmjs.org/vite/-/vite-4.4.4.tgz", - "integrity": "sha512-4mvsTxjkveWrKDJI70QmelfVqTm+ihFAb6+xf4sjEU2TmUCTlVX87tmg/QooPEMQb/lM9qGHT99ebqPziEd3wg==", - "dev": true, - "requires": { - "esbuild": "^0.18.10", - "fsevents": "~2.3.2", - "postcss": "^8.4.25", - "rollup": "^3.25.2" - }, - "dependencies": { - "@esbuild/android-arm": { - "version": "0.18.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.12.tgz", - "integrity": "sha512-LIxaNIQfkFZbTLb4+cX7dozHlAbAshhFE5PKdro0l+FnCpx1GDJaQ2WMcqm+ToXKMt8p8Uojk/MFRuGyz3V5Sw==", - "dev": true, - "optional": true - }, - "@esbuild/android-arm64": { - "version": "0.18.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.12.tgz", - "integrity": "sha512-BMAlczRqC/LUt2P97E4apTBbkvS9JTJnp2DKFbCwpZ8vBvXVbNdqmvzW/OsdtI/+mGr+apkkpqGM8WecLkPgrA==", - "dev": true, - "optional": true - }, - "@esbuild/android-x64": { - "version": "0.18.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.12.tgz", - "integrity": "sha512-zU5MyluNsykf5cOJ0LZZZjgAHbhPJ1cWfdH1ZXVMXxVMhEV0VZiZXQdwBBVvmvbF28EizeK7obG9fs+fpmS0eQ==", - "dev": true, - "optional": true - }, - "@esbuild/darwin-arm64": { - "version": "0.18.12", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.12.tgz", - "integrity": "sha512-zUZMep7YONnp6954QOOwEBwFX9svlKd3ov6PkxKd53LGTHsp/gy7vHaPGhhjBmEpqXEXShi6dddjIkmd+NgMsA==", - "dev": true, - "optional": true - }, - "@esbuild/darwin-x64": { - "version": "0.18.12", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.12.tgz", - "integrity": "sha512-ohqLPc7i67yunArPj1+/FeeJ7AgwAjHqKZ512ADk3WsE3FHU9l+m5aa7NdxXr0HmN1bjDlUslBjWNbFlD9y12Q==", - "dev": true, - "optional": true - }, - "@esbuild/freebsd-arm64": { - "version": "0.18.12", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.12.tgz", - "integrity": "sha512-GIIHtQXqgeOOqdG16a/A9N28GpkvjJnjYMhOnXVbn3EDJcoItdR58v/pGN31CHjyXDc8uCcRnFWmqaJt24AYJg==", - "dev": true, - "optional": true - }, - "@esbuild/freebsd-x64": { - "version": "0.18.12", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.12.tgz", - "integrity": "sha512-zK0b9a1/0wZY+6FdOS3BpZcPc1kcx2G5yxxfEJtEUzVxI6n/FrC2Phsxj/YblPuBchhBZ/1wwn7AyEBUyNSa6g==", - "dev": true, - "optional": true - }, - "@esbuild/linux-arm": { - "version": "0.18.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.12.tgz", - "integrity": "sha512-y75OijvrBE/1XRrXq1jtrJfG26eHeMoqLJ2dwQNwviwTuTtHGCojsDO6BJNF8gU+3jTn1KzJEMETytwsFSvc+Q==", - "dev": true, - "optional": true - }, - "@esbuild/linux-arm64": { - "version": "0.18.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.12.tgz", - "integrity": "sha512-JKgG8Q/LL/9sw/iHHxQyVMoQYu3rU3+a5Z87DxC+wAu3engz+EmctIrV+FGOgI6gWG1z1+5nDDbXiRMGQZXqiw==", - "dev": true, - "optional": true - }, - "@esbuild/linux-ia32": { - "version": "0.18.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.12.tgz", - "integrity": "sha512-yoRIAqc0B4lDIAAEFEIu9ttTRFV84iuAl0KNCN6MhKLxNPfzwCBvEMgwco2f71GxmpBcTtn7KdErueZaM2rEvw==", - "dev": true, - "optional": true - }, - "@esbuild/linux-loong64": { - "version": "0.18.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.12.tgz", - "integrity": "sha512-qYgt3dHPVvf/MgbIBpJ4Sup/yb9DAopZ3a2JgMpNKIHUpOdnJ2eHBo/aQdnd8dJ21X/+sS58wxHtA9lEazYtXQ==", - "dev": true, - "optional": true - }, - "@esbuild/linux-mips64el": { - "version": "0.18.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.12.tgz", - "integrity": "sha512-wHphlMLK4ufNOONqukELfVIbnGQJrHJ/mxZMMrP2jYrPgCRZhOtf0kC4yAXBwnfmULimV1qt5UJJOw4Kh13Yfg==", - "dev": true, - "optional": true - }, - "@esbuild/linux-ppc64": { - "version": "0.18.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.12.tgz", - "integrity": "sha512-TeN//1Ft20ZZW41+zDSdOI/Os1bEq5dbvBvYkberB7PHABbRcsteeoNVZFlI0YLpGdlBqohEpjrn06kv8heCJg==", - "dev": true, - "optional": true - }, - "@esbuild/linux-riscv64": { - "version": "0.18.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.12.tgz", - "integrity": "sha512-AgUebVS4DoAblBgiB2ACQ/8l4eGE5aWBb8ZXtkXHiET9mbj7GuWt3OnsIW/zX+XHJt2RYJZctbQ2S/mDjbp0UA==", - "dev": true, - "optional": true - }, - "@esbuild/linux-s390x": { - "version": "0.18.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.12.tgz", - "integrity": "sha512-dJ3Rb3Ei2u/ysSXd6pzleGtfDdc2MuzKt8qc6ls8vreP1G3B7HInX3i7gXS4BGeVd24pp0yqyS7bJ5NHaI9ing==", - "dev": true, - "optional": true - }, - "@esbuild/linux-x64": { - "version": "0.18.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.12.tgz", - "integrity": "sha512-OrNJMGQbPaVyHHcDF8ybNSwu7TDOfX8NGpXCbetwOSP6txOJiWlgQnRymfC9ocR1S0Y5PW0Wb1mV6pUddqmvmQ==", - "dev": true, - "optional": true - }, - "@esbuild/netbsd-x64": { - "version": "0.18.12", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.12.tgz", - "integrity": "sha512-55FzVCAiwE9FK8wWeCRuvjazNRJ1QqLCYGZVB6E8RuQuTeStSwotpSW4xoRGwp3a1wUsaVCdYcj5LGCASVJmMg==", - "dev": true, - "optional": true - }, - "@esbuild/openbsd-x64": { - "version": "0.18.12", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.12.tgz", - "integrity": "sha512-qnluf8rfb6Y5Lw2tirfK2quZOBbVqmwxut7GPCIJsM8lc4AEUj9L8y0YPdLaPK0TECt4IdyBdBD/KRFKorlK3g==", - "dev": true, - "optional": true - }, - "@esbuild/sunos-x64": { - "version": "0.18.12", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.12.tgz", - "integrity": "sha512-+RkKpVQR7bICjTOPUpkTBTaJ4TFqQBX5Ywyd/HSdDkQGn65VPkTsR/pL4AMvuMWy+wnXgIl4EY6q4mVpJal8Kg==", - "dev": true, - "optional": true - }, - "@esbuild/win32-arm64": { - "version": "0.18.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.12.tgz", - "integrity": "sha512-GNHuciv0mFM7ouzsU0+AwY+7eV4Mgo5WnbhfDCQGtpvOtD1vbOiRjPYG6dhmMoFyBjj+pNqQu2X+7DKn0KQ/Gw==", - "dev": true, - "optional": true - }, - "@esbuild/win32-ia32": { - "version": "0.18.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.12.tgz", - "integrity": "sha512-kR8cezhYipbbypGkaqCTWIeu4zID17gamC8YTPXYtcN3E5BhhtTnwKBn9I0PJur/T6UVwIEGYzkffNL0lFvxEw==", - "dev": true, - "optional": true - }, - "@esbuild/win32-x64": { - "version": "0.18.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.12.tgz", - "integrity": "sha512-O0UYQVkvfM/jO8a4OwoV0mAKSJw+mjWTAd1MJd/1FCX6uiMdLmMRPK/w6e9OQ0ob2WGxzIm9va/KG0Ja4zIOgg==", - "dev": true, - "optional": true - }, - "esbuild": { - "version": "0.18.12", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.12.tgz", - "integrity": "sha512-XuOVLDdtsDslXStStduT41op21Ytmf4/BDS46aa3xPJ7X5h2eMWBF1oAe3QjUH3bDksocNXgzGUZ7XHIBya6Tg==", - "dev": true, - "requires": { - "@esbuild/android-arm": "0.18.12", - "@esbuild/android-arm64": "0.18.12", - "@esbuild/android-x64": "0.18.12", - "@esbuild/darwin-arm64": "0.18.12", - "@esbuild/darwin-x64": "0.18.12", - "@esbuild/freebsd-arm64": "0.18.12", - "@esbuild/freebsd-x64": "0.18.12", - "@esbuild/linux-arm": "0.18.12", - "@esbuild/linux-arm64": "0.18.12", - "@esbuild/linux-ia32": "0.18.12", - "@esbuild/linux-loong64": "0.18.12", - "@esbuild/linux-mips64el": "0.18.12", - "@esbuild/linux-ppc64": "0.18.12", - "@esbuild/linux-riscv64": "0.18.12", - "@esbuild/linux-s390x": "0.18.12", - "@esbuild/linux-x64": "0.18.12", - "@esbuild/netbsd-x64": "0.18.12", - "@esbuild/openbsd-x64": "0.18.12", - "@esbuild/sunos-x64": "0.18.12", - "@esbuild/win32-arm64": "0.18.12", - "@esbuild/win32-ia32": "0.18.12", - "@esbuild/win32-x64": "0.18.12" - } - } - } - }, - "vite-node": { - "version": "0.33.0", - "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-0.33.0.tgz", - "integrity": "sha512-19FpHYbwWWxDr73ruNahC+vtEdza52kA90Qb3La98yZ0xULqV8A5JLNPUff0f5zID4984tW7l3DH2przTJUZSw==", - "dev": true, - "requires": { - "cac": "^6.7.14", - "debug": "^4.3.4", - "mlly": "^1.4.0", - "pathe": "^1.1.1", - "picocolors": "^1.0.0", - "vite": "^3.0.0 || ^4.0.0" - } - }, - "vite-tsconfig-paths": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/vite-tsconfig-paths/-/vite-tsconfig-paths-4.2.0.tgz", - "integrity": "sha512-jGpus0eUy5qbbMVGiTxCL1iB9ZGN6Bd37VGLJU39kTDD6ZfULTTb1bcc5IeTWqWJKiWV5YihCaibeASPiGi8kw==", - "dev": true, - "requires": { - "debug": "^4.1.1", - "globrex": "^0.1.2", - "tsconfck": "^2.1.0" - }, - "dependencies": { - "tsconfck": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/tsconfck/-/tsconfck-2.1.2.tgz", - "integrity": "sha512-ghqN1b0puy3MhhviwO2kGF8SeMDNhEbnKxjK7h6+fvY9JAxqvXi8y5NAHSQv687OVboS2uZIByzGd45/YxrRHg==", - "dev": true, - "requires": {} - }, - "typescript": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz", - "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==", - "dev": true, - "optional": true, - "peer": true - } - } - }, - "vitest": { - "version": "0.33.0", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-0.33.0.tgz", - "integrity": "sha512-1CxaugJ50xskkQ0e969R/hW47za4YXDUfWJDxip1hwbnhUjYolpfUn2AMOulqG/Dtd9WYAtkHmM/m3yKVrEejQ==", - "dev": true, - "requires": { - "@types/chai": "^4.3.5", - "@types/chai-subset": "^1.3.3", - "@types/node": "*", - "@vitest/expect": "0.33.0", - "@vitest/runner": "0.33.0", - "@vitest/snapshot": "0.33.0", - "@vitest/spy": "0.33.0", - "@vitest/utils": "0.33.0", - "acorn": "^8.9.0", - "acorn-walk": "^8.2.0", - "cac": "^6.7.14", - "chai": "^4.3.7", - "debug": "^4.3.4", - "local-pkg": "^0.4.3", - "magic-string": "^0.30.1", - "pathe": "^1.1.1", - "picocolors": "^1.0.0", - "std-env": "^3.3.3", - "strip-literal": "^1.0.1", - "tinybench": "^2.5.0", - "tinypool": "^0.6.0", - "vite": "^3.0.0 || ^4.0.0", - "vite-node": "0.33.0", - "why-is-node-running": "^2.2.2" - } - }, - "webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "dev": true - }, - "whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dev": true, - "requires": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "why-is-node-running": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.2.2.tgz", - "integrity": "sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==", - "dev": true, - "requires": { - "siginfo": "^2.0.0", - "stackback": "0.0.2" - } - }, - "wide-align": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", - "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", - "dev": true, - "requires": { - "string-width": "^1.0.2 || 2 || 3 || 4" - } - }, - "wordwrap": { + "node_modules/wordwrap": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", "dev": true }, - "wrap-ansi": { + "node_modules/wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "requires": { + "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "wrappy": { + "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" }, - "y18n": { + "node_modules/y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==" + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "engines": { + "node": ">=10" + } }, - "yallist": { + "node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true }, - "yargs": { + "node_modules/yargs": { "version": "16.2.0", "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", "dev": true, - "requires": { + "dependencies": { "cliui": "^7.0.2", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", @@ -9837,19 +5810,40 @@ "string-width": "^4.2.0", "y18n": "^5.0.5", "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" } }, - "yargs-parser": { + "node_modules/yargs-parser": { "version": "20.2.9", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "dev": true + "dev": true, + "engines": { + "node": ">=10" + } }, - "yn": { + "node_modules/yn": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } } } } From 32bb9be68eb8759c7ca15cbc2c02ed6501403be0 Mon Sep 17 00:00:00 2001 From: Florian LEROUX Date: Thu, 24 Aug 2023 15:20:53 +0200 Subject: [PATCH 464/883] feat(basket): add auth checkguards in routes --- services/gateway/package-lock.json | 190 ------------------ .../controller/basket/basket.controller.ts | 189 ++++++++++------- services/gateway/src/middleware/auth.ts | 21 +- services/gateway/src/services/user.service.ts | 69 ++----- 4 files changed, 148 insertions(+), 321 deletions(-) diff --git a/services/gateway/package-lock.json b/services/gateway/package-lock.json index 44f62478..24969dd9 100644 --- a/services/gateway/package-lock.json +++ b/services/gateway/package-lock.json @@ -51,19 +51,6 @@ "node": ">=0.10.0" } }, - "node_modules/@ampproject/remapping": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", - "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", - "dev": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/@babel/generator": { "version": "7.18.2", "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.2.tgz", @@ -122,12 +109,6 @@ "node": ">=6.9.0" } }, - "node_modules/@bcoe/v8-coverage": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", - "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", - "dev": true - }, "node_modules/@cspotcode/source-map-support": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", @@ -335,15 +316,6 @@ "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", "dev": true }, - "node_modules/@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/@jest/schemas": { "version": "29.6.0", "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.0.tgz", @@ -643,12 +615,6 @@ "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.1.tgz", "integrity": "sha512-/K3ds8TRAfBvi5vfjuz8y6+GiAYBZ0x4tXv1Av6CWBWn0IlADc+ZX9pMq7oU0fNQPnBwIZl3rmeLp6SBApbxSQ==" }, - "node_modules/@types/istanbul-lib-coverage": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", - "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", - "dev": true - }, "node_modules/@types/json-schema": { "version": "7.0.12", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.12.tgz", @@ -895,25 +861,6 @@ "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@vitest/coverage-c8": { - "version": "0.33.0", - "resolved": "https://registry.npmjs.org/@vitest/coverage-c8/-/coverage-c8-0.33.0.tgz", - "integrity": "sha512-DaF1zJz4dcOZS4k/neiQJokmOWqsGXwhthfmUdPGorXIQHjdPvV6JQSYhQDI41MyI8c+IieQUdIDs5XAMHtDDw==", - "dev": true, - "dependencies": { - "@ampproject/remapping": "^2.2.1", - "c8": "^7.14.0", - "magic-string": "^0.30.1", - "picocolors": "^1.0.0", - "std-env": "^3.3.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "vitest": ">=0.30.0 <1" - } - }, "node_modules/@vitest/expect": { "version": "0.33.0", "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-0.33.0.tgz", @@ -1368,32 +1315,6 @@ "node": ">= 0.8" } }, - "node_modules/c8": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/c8/-/c8-7.14.0.tgz", - "integrity": "sha512-i04rtkkcNcCf7zsQcSv/T9EbUn4RXQ6mropeMcjFOsQXQ0iGLAr/xT6TImQg4+U9hmNpN9XdvPkjUL1IzbgxJw==", - "dev": true, - "dependencies": { - "@bcoe/v8-coverage": "^0.2.3", - "@istanbuljs/schema": "^0.1.3", - "find-up": "^5.0.0", - "foreground-child": "^2.0.0", - "istanbul-lib-coverage": "^3.2.0", - "istanbul-lib-report": "^3.0.0", - "istanbul-reports": "^3.1.4", - "rimraf": "^3.0.2", - "test-exclude": "^6.0.0", - "v8-to-istanbul": "^9.0.0", - "yargs": "^16.2.0", - "yargs-parser": "^20.2.9" - }, - "bin": { - "c8": "bin/c8.js" - }, - "engines": { - "node": ">=10.12.0" - } - }, "node_modules/cac": { "version": "6.7.14", "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", @@ -1580,12 +1501,6 @@ "node": ">= 0.6" } }, - "node_modules/convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", - "dev": true - }, "node_modules/cookie": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", @@ -2420,19 +2335,6 @@ } } }, - "node_modules/foreground-child": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", - "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": ">=8.0.0" - } - }, "node_modules/form-data": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", @@ -2817,12 +2719,6 @@ "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", "dev": true }, - "node_modules/html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true - }, "node_modules/http-errors": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", @@ -3130,42 +3026,6 @@ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "dev": true }, - "node_modules/istanbul-lib-coverage": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", - "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", - "dev": true, - "dependencies": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^3.0.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-reports": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", - "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", - "dev": true, - "dependencies": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/js-yaml": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", @@ -5051,20 +4911,6 @@ "node": ">=6" } }, - "node_modules/test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", - "dev": true, - "dependencies": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", @@ -5181,15 +5027,6 @@ "typescript": ">=4.2.0" } }, - "node_modules/ts-essentials": { - "version": "9.3.2", - "resolved": "https://registry.npmjs.org/ts-essentials/-/ts-essentials-9.3.2.tgz", - "integrity": "sha512-JxKJzuWqH1MmH4ZFHtJzGEhkfN3QvVR3C3w+4BIoWeoY68UVVoA2Np/Bca9z0IPSErVCWhv439aT0We4Dks8kQ==", - "dev": true, - "peerDependencies": { - "typescript": ">=4.1.0" - } - }, "node_modules/ts-node": { "version": "10.9.1", "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", @@ -5403,20 +5240,6 @@ "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", "dev": true }, - "node_modules/v8-to-istanbul": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.1.0.tgz", - "integrity": "sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA==", - "dev": true, - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.12", - "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^1.6.0" - }, - "engines": { - "node": ">=10.12.0" - } - }, "node_modules/vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", @@ -5687,19 +5510,6 @@ } } }, - "node_modules/vitest-mock-extended": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/vitest-mock-extended/-/vitest-mock-extended-1.1.4.tgz", - "integrity": "sha512-MKPdepFjk0CE7Ocb5txntHK/sloHO9s0Kk9dr630uL03shRSHMkZtSs5CBPsbJ8K/CvYLv0GHUmMt2zWks2eXg==", - "dev": true, - "dependencies": { - "ts-essentials": "^9.3.2" - }, - "peerDependencies": { - "typescript": "3.x || 4.x || 5.x", - "vitest": ">=0.31.1" - } - }, "node_modules/webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", diff --git a/services/gateway/src/controller/basket/basket.controller.ts b/services/gateway/src/controller/basket/basket.controller.ts index 6822e2f0..b70e1a50 100644 --- a/services/gateway/src/controller/basket/basket.controller.ts +++ b/services/gateway/src/controller/basket/basket.controller.ts @@ -1,104 +1,153 @@ -import {Request, Response, Router} from "express"; -import {ProductRequest, RestaurantRequest, UserId} from "@gateway/proto/basket_pb"; -import {basketServiceClient} from "@gateway/services/clients/basket.client"; +import { Request, Response, Router } from "express"; +import { ProductRequest, RestaurantRequest, UserId } from "@gateway/proto/basket_pb"; +import { basketServiceClient } from "@gateway/services/clients/basket.client"; +import { getUserIdFromToken } from "@gateway/services/user.service"; export const basketRoutes = Router(); -basketRoutes.get('/api/basket/:userId', (req: Request, res: Response) => { - /* #swagger.parameters['userId'] = { - in: 'path', - required: true, - type: 'integer' - }*/ - const {userId} = req.params; - basketServiceClient.getBasket(new UserId().setId(Number(userId)), (error, response) => { - if (error) { - res.status(500).send({error: error.message}); - } else { - res.json(response.toObject()); +basketRoutes.get("/api/basket/", async (req: Request, res: Response) => { + /* #swagger.parameters['headers'] = { + in: 'header', + required: true, + schema: { + Authorization: "Bearer " } - }); + } */ + + // Auth check and :id check --- + const { authorization } = req.headers; + if (!authorization) return res.status(401).json({ message: "Unauthorized" }); + const token = authorization.split("Bearer ")[1]; + const userId = await getUserIdFromToken(token); + if (!userId) return res.status(401).json({ message: "Unauthorized" }); + // ---------------------------- + + basketServiceClient.getBasket(new UserId().setId(Number(userId)), (error, response) => { + if (error) return res.status(500).send({ error }); + else return res.status(200).json(response.toObject()); + }); }); -basketRoutes.post('/api/basket', (req: Request, res: Response) => { - /* #swagger.parameters['body'] = { +basketRoutes.post("/api/basket", async (req: Request, res: Response) => { + /* #swagger.parameters['body'] = { in: 'body', required: true, schema: { - userId: 0, productId: "product_id:0", restaurantId:"restaurant_id:0" } - } */ - const {userId, productId, restaurantId} = req.body; - const basketRequest = new ProductRequest().setUserId(userId).setProductId(productId).setRestaurantId(restaurantId); - basketServiceClient.addProduct(basketRequest, (error, response) => { - if (error) { - res.status(500).send({error: error.message}); - } else { - res.json(response.toObject()); - } + } + #swagger.parameters['headers'] = { + in: 'header', + required: true, + schema: { + Authorization: "Bearer " } - ); + } */ + + // Auth check and :id check --- + const { authorization } = req.headers; + if (!authorization) return res.status(401).json({ message: "Unauthorized" }); + const token = authorization.split("Bearer ")[1]; + const userId = await getUserIdFromToken(token); + if (!userId) return res.status(401).json({ message: "Unauthorized" }); + // ---------------------------- + + const { productId, restaurantId } = req.body; + const basketRequest = new ProductRequest().setUserId(userId).setProductId(productId).setRestaurantId(restaurantId); + basketServiceClient.addProduct(basketRequest, (error, response) => { + if (error) return res.status(500).send({ error }); + else return res.status(200).json(response.toObject()); + }); }); -basketRoutes.put('/api/basket/remove-product', (req: Request, res: Response) => { - /* #swagger.parameters['body'] = { +basketRoutes.put("/api/basket/remove-product", async (req: Request, res: Response) => { + /* #swagger.parameters['body'] = { in: 'body', required: true, schema: { - userId: 0, productId: "product_id:0", restaurantId:"restaurant_id:0" } - } */ - const {userId, productId, restaurantId} = req.body; - const basketRequest = new ProductRequest().setUserId(userId).setProductId(productId).setRestaurantId(restaurantId); - basketServiceClient.deleteProduct(basketRequest, (error, response) => { - if (error) { - res.status(500).send({error: error.message}); - } else { - res.json(response.toObject()); - } + } + #swagger.parameters['headers'] = { + in: 'header', + required: true, + schema: { + Authorization: "Bearer " } - ); + } */ + + // Auth check and :id check --- + const { authorization } = req.headers; + if (!authorization) return res.status(401).json({ message: "Unauthorized" }); + const token = authorization.split("Bearer ")[1]; + const userId = await getUserIdFromToken(token); + if (!userId) return res.status(401).json({ message: "Unauthorized" }); + // ---------------------------- + + const { productId, restaurantId } = req.body; + + const basketRequest = new ProductRequest().setUserId(userId).setProductId(productId).setRestaurantId(restaurantId); + basketServiceClient.deleteProduct(basketRequest, (error, response) => { + if (error) return res.status(500).send({ error }); + else return res.status(200).json(response.toObject()); + }); }); -basketRoutes.put('/api/basket/restaurant', (req: Request, res: Response) => { - /* #swagger.parameters['body'] = { +basketRoutes.put("/api/basket/restaurant", async (req: Request, res: Response) => { + /* #swagger.parameters['body'] = { in: 'body', required: true, schema: { - userId: 0, restaurantId:"restaurant_id:0" } - } */ - const {restaurantId, userId} = req.body; - basketServiceClient.updateRestaurant(new RestaurantRequest().setRestaurantId(restaurantId).setUserId(userId), (error, response) => { - if (error) { - res.status(500).send({error: error.message}); - } else { - res.json(response.toObject()); - } + } + #swagger.parameters['headers'] = { + in: 'header', + required: true, + schema: { + Authorization: "Bearer " } - ); + } */ + + // Auth check and :id check --- + const { authorization } = req.headers; + if (!authorization) return res.status(401).json({ message: "Unauthorized" }); + const token = authorization.split("Bearer ")[1]; + const userId = await getUserIdFromToken(token); + if (!userId) return res.status(401).json({ message: "Unauthorized" }); + // ---------------------------- + + const { restaurantId } = req.body; + basketServiceClient.updateRestaurant( + new RestaurantRequest().setRestaurantId(restaurantId).setUserId(userId), + (error, response) => { + if (error) return res.status(500).send({ error }); + else return res.status(200).json(response.toObject()); + }, + ); }); -basketRoutes.post('/api/basket/reset', (req: Request, res: Response) => { - /* #swagger.parameters['body'] = { - in: 'body', - required: true, - schema: { - userId: 0, - } - } */ - const {userId} = req.body; - basketServiceClient.reset(new UserId().setId(userId), (error, response) => { - if (error) { - res.status(500).send({error: error.message}); - } else { - res.json(response.toObject()); - } +basketRoutes.post("/api/basket/reset", async (req: Request, res: Response) => { + /* #swagger.parameters['headers'] = { + in: 'header', + required: true, + schema: { + Authorization: "Bearer " } - ); + } */ + + // Auth check and :id check --- + const { authorization } = req.headers; + if (!authorization) return res.status(401).json({ message: "Unauthorized" }); + const token = authorization.split("Bearer ")[1]; + const userId = await getUserIdFromToken(token); + if (!userId) return res.status(401).json({ message: "Unauthorized" }); + // ---------------------------- + + basketServiceClient.reset(new UserId().setId(userId), (error, response) => { + if (error) return res.status(500).send({ error }); + else return res.status(200).json(response.toObject()); + }); }); diff --git a/services/gateway/src/middleware/auth.ts b/services/gateway/src/middleware/auth.ts index 221c8f89..c77b7a12 100644 --- a/services/gateway/src/middleware/auth.ts +++ b/services/gateway/src/middleware/auth.ts @@ -1,4 +1,5 @@ -import { user_service_promises } from "@gateway/services/user.service"; +import { getUser, getUserIdFromToken } from "@gateway/services/user.service"; +import { Request, Response, NextFunction } from "express"; export const ROLES = { ADMIN: "ADMIN", @@ -8,15 +9,15 @@ export const ROLES = { }; const checkRole = async (token: string, expectedRole: keyof typeof ROLES) => { - const userId = await user_service_promises.getUserIdFromToken(token); + const userId = await getUserIdFromToken(token); if (userId === undefined) return false; - const user = await user_service_promises.getUser(userId); + const user = await getUser(userId); if (user === undefined) return false; return user.getRole()?.getCode() === expectedRole; }; const checkRight = async (token: string, expectedId: number) => { - const userId = await user_service_promises.getUserIdFromToken(token); + const userId = await getUserIdFromToken(token); if (userId === undefined) return false; return userId === expectedId; }; @@ -26,21 +27,17 @@ export const check = async ( expect: { role?: keyof typeof ROLES; id?: number; - } + }, ) => { const { role, id } = expect; - if (role !== undefined && id !== undefined) - return (await checkRole(token, role)) && (await checkRight(token, id)); + if (role !== undefined && id !== undefined) return (await checkRole(token, role)) && (await checkRight(token, id)); else if (role !== undefined) return await checkRole(token, role); else if (id !== undefined) return await checkRight(token, id); else return false; }; -import { Request, Response, NextFunction } from "express"; - export const withCheck = - (expect: { role?: keyof typeof ROLES; id?: number }) => - async (req: Request, res: Response, next: NextFunction) => { + (expect: { role?: keyof typeof ROLES; id?: number }) => async (req: Request, res: Response, next: NextFunction) => { const { role, id } = expect; const token = req.headers.authorization?.split("Bearer ")[0]; if (!token) return res.status(401).json({ message: "Unauthorized" }); @@ -52,4 +49,4 @@ export const withCheck = } catch (error) { return res.status(500).json({ message: "Internal Server Error" }); } - }; \ No newline at end of file + }; diff --git a/services/gateway/src/services/user.service.ts b/services/gateway/src/services/user.service.ts index c0921d37..0acfc636 100644 --- a/services/gateway/src/services/user.service.ts +++ b/services/gateway/src/services/user.service.ts @@ -2,58 +2,29 @@ import { User, UserId, validateInput } from "@gateway/proto/user_pb"; import { userServiceClient } from "@gateway/services/clients/user.client"; export const getUser = (id: number): Promise => { - const userId = new UserId(); - userId.setId(Number(id)); - return new Promise((resolve, reject) => { - userServiceClient.getUser(userId, (error, response) => { - if (error) { - reject(error); - } else { - resolve(response.getUser()) - } - }); - }) + const userId = new UserId(); + userId.setId(Number(id)); + return new Promise((resolve, reject) => { + userServiceClient.getUser(userId, (error, response) => { + if (error) { + reject(error); + } else { + resolve(response.getUser()); + } + }); + }); }; -export const getUserIdFromToken = (token: string): number | undefined => { +export const getUserIdFromToken = (token: string): Promise => { const userToken = new validateInput(); userToken.setToken(token); - let user: number | undefined = undefined; - userServiceClient.validate(userToken, (error, response) => { - if (error) { - throw Error(error.message); - } else { - user = response.getUserid(); - } - }); - return user; -}; - -export const user_service_promises = { - getUser: (id: number): Promise => { - const userId = new UserId(); - userId.setId(Number(id)); - return new Promise((resolve, reject) => { - userServiceClient.getUser(userId, (error, response) => { - if (error) { - reject(error); - } else { - resolve(response.getUser()); - } - }); - }); - }, - getUserIdFromToken: (token: string): Promise => { - const userToken = new validateInput(); - userToken.setToken(token); - return new Promise((resolve, reject) => { - userServiceClient.validate(userToken, (error, response) => { - if (error) { - reject(error); - } else { - resolve(response.getUserid()); - } - }); + return new Promise((resolve, reject) => { + userServiceClient.validate(userToken, (error, response) => { + if (error) { + reject(error); + } else { + resolve(response.getUserid()); + } }); - }, + }); }; From df6d06127e0279f9f3f1f3c2f4ef939c3ee2ef93 Mon Sep 17 00:00:00 2001 From: Florian LEROUX Date: Thu, 24 Aug 2023 16:27:11 +0200 Subject: [PATCH 465/883] feat(delivery): add auth checkguards in routes --- .../delivery/delivery.controller.ts | 255 ++++++++++++------ .../delivery/deliveryPerson.controller.ts | 227 +++++++++++----- 2 files changed, 331 insertions(+), 151 deletions(-) diff --git a/services/gateway/src/controller/delivery/delivery.controller.ts b/services/gateway/src/controller/delivery/delivery.controller.ts index 6d54326f..4a1c7642 100644 --- a/services/gateway/src/controller/delivery/delivery.controller.ts +++ b/services/gateway/src/controller/delivery/delivery.controller.ts @@ -1,49 +1,92 @@ -import {Request, Response, Router} from "express"; -import {deliveryServiceClient} from "@gateway/services/clients/delivery.client"; -import {Delivery, DeliveryCreateInput, DeliveryId, RestaurantId, Status, UserId} from "@gateway/proto/delivery_pb"; +import { Request, Response, Router } from "express"; +import { deliveryServiceClient } from "@gateway/services/clients/delivery.client"; +import { Delivery, DeliveryCreateInput, DeliveryId, RestaurantId, Status, UserId } from "@gateway/proto/delivery_pb"; +import { getUserIdFromToken } from "@gateway/services/user.service"; +import { check, withCheck } from "@gateway/middleware/auth"; export const deliveryRoutes = Router(); -deliveryRoutes.get('/api/delivery/:id', (req: Request, res: Response) => { - const {id} = req.params; - - deliveryServiceClient.getDelivery(new DeliveryId().setId(id), (error, response) => { - if (error) { - res.status(500).send({error: error.message}); - } else { - res.json(response.toObject()); +deliveryRoutes.get("/api/delivery/:id", async (req: Request, res: Response) => { + /* #swagger.parameters['headers'] = { + in: 'header', + required: true, + schema: { + Authorization: "Bearer " } + } */ + + // Auth check and :id check --- + const { authorization } = req.headers; + if (!authorization) return res.status(401).json({ message: "Unauthorized" }); + const token = authorization.split("Bearer ")[1]; + const userId = await getUserIdFromToken(token); + if (!userId) return res.status(401).json({ message: "Unauthorized" }); + // ---------------------------- + + const { id } = req.params; + + try { + const delivery: Delivery.AsObject = await new Promise((resolve, reject) => { + deliveryServiceClient.getDelivery(new DeliveryId().setId(id), (error, response) => { + if (error) reject(error); + else resolve(response.toObject()); + }); }); + + if (Number(delivery.userId) !== userId) return res.status(401).json({ message: "Unauthorized" }); + else return res.status(200).json(delivery); + } catch (error) { + return res.status(500).send({ error }); + } }); -deliveryRoutes.get('/api/delivery/by-restaurant/:id', (req: Request, res: Response) => { - const {id} = req.params; +deliveryRoutes.get( + "/api/delivery/by-restaurant/:id", + withCheck({ role: "ACCOUNTANT" }), + (req: Request, res: Response) => { + /* #swagger.parameters['headers'] = { + in: 'header', + required: true, + schema: { + Authorization: "Bearer " + } + } */ + + const { id } = req.params; const restaurantId = new RestaurantId().setId(id); deliveryServiceClient.listDeliveriesByRestaurant(restaurantId, (error, response) => { - if (error) { - res.status(500).send({error: error.message}); - } else { - res.json(response.toObject()); - } + if (error) return res.status(500).send({ error }); + else return res.status(200).json(response.toObject()); }); -}); - -deliveryRoutes.get('/api/delivery/by-user/:id', (req: Request, res: Response) => { - const {id} = req.params; - const userId = new UserId().setId(id); + }, +); - deliveryServiceClient.listDeliveriesByUser(userId, (error, response) => { - if (error) { - res.status(500).send({error: error.message}); - } else { - res.json(response.toObject()); +deliveryRoutes.get("/api/delivery/by-user", async (req: Request, res: Response) => { + /* #swagger.parameters['headers'] = { + in: 'header', + required: true, + schema: { + Authorization: "Bearer " } - }); + } */ + + // Auth check and :id check --- + const { authorization } = req.headers; + if (!authorization) return res.status(401).json({ message: "Unauthorized" }); + const token = authorization.split("Bearer ")[1]; + const userId = await getUserIdFromToken(token); + if (!userId) return res.status(401).json({ message: "Unauthorized" }); + // ---------------------------- + + deliveryServiceClient.listDeliveriesByUser(new UserId().setId(userId.toString()), (error, response) => { + if (error) return res.status(500).send({ error }); + else return res.status(200).json(response.toObject()); + }); }); -deliveryRoutes.post('/api/delivery', (req: Request, res: Response) => { - /* #swagger.parameters['body'] = { +deliveryRoutes.post("/api/delivery", async (req: Request, res: Response) => { + /* #swagger.parameters['body'] = { in: 'body', required: true, schema: { @@ -51,35 +94,45 @@ deliveryRoutes.post('/api/delivery', (req: Request, res: Response) => { address: "10 Rue de la République, 75003 Paris, France", status: {'$ref': '#/definitions/Status'}, deliveryPersonId: "cllcdmeci0000pm01su98mxtb", - userId: "user_id:1", restaurantId: "restaurant_id:1" } } - */ - const {eta, address, status, deliveryPersonId, userId, restaurantId} = req.body; - const deliveryStatus = Status[status] as unknown as Status; - if (!deliveryStatus) { - res.status(400).send({error: "Status not found"}); - return; - } - const deliveryCreateInput = new DeliveryCreateInput().setEta(eta) - .setAddress(address) - .setStatus(deliveryStatus) - .setDeliveryPersonId(deliveryPersonId) - .setUserId(userId) - .setRestaurantId(restaurantId); - - deliveryServiceClient.createDelivery(deliveryCreateInput, (error, response) => { - if (error) { - res.status(500).send({error: error.message}); - } else { - res.json(response.toObject()); + #swagger.parameters['headers'] = { + in: 'header', + required: true, + schema: { + Authorization: "Bearer " } - }); + } + */ + // Auth check and :id check --- + const { authorization } = req.headers; + if (!authorization) return res.status(401).json({ message: "Unauthorized" }); + const token = authorization.split("Bearer ")[1]; + const userId = await getUserIdFromToken(token); + if (!userId) return res.status(401).json({ message: "Unauthorized" }); + // ---------------------------- + + const { eta, address, status, deliveryPersonId, restaurantId } = req.body; + const deliveryStatus = Status[status] as unknown as Status; + if (!deliveryStatus) return res.status(400).send({ error: "Status not found" }); + + const deliveryCreateInput = new DeliveryCreateInput() + .setEta(eta) + .setAddress(address) + .setStatus(deliveryStatus) + .setDeliveryPersonId(deliveryPersonId) + .setUserId(userId.toString()) + .setRestaurantId(restaurantId); + + deliveryServiceClient.createDelivery(deliveryCreateInput, (error, response) => { + if (error) return res.status(500).send({ error: error.message }); + else return res.status(201).json(response.toObject()); + }); }); -deliveryRoutes.put('/api/delivery/:id', (req: Request, res: Response) => { - /* #swagger.parameters['body'] = { +deliveryRoutes.put("/api/delivery/:id", async (req: Request, res: Response) => { + /* #swagger.parameters['body'] = { in: 'body', required: true, schema: { @@ -91,38 +144,76 @@ deliveryRoutes.put('/api/delivery/:id', (req: Request, res: Response) => { restaurantId: "restaurant_id:1" } } + #swagger.parameters['headers'] = { + in: 'header', + required: true, + schema: { + Authorization: "Bearer " + } + } */ - const {id} = req.params; - const {eta, address, status, deliveryPersonId, userId, restaurantId} = req.body; - const deliveryStatus = Status[status] as unknown as Status; - if (!deliveryStatus) { - res.status(400).send({error: "Status not found"}); - return; - } - const delivery = new Delivery().setId(id).setEta(eta) - .setAddress(address) - .setStatus(deliveryStatus) - .setDeliveryPersonId(deliveryPersonId) - .setUserId(userId) - .setRestaurantId(restaurantId); - - deliveryServiceClient.updateDelivery(delivery, (error, response) => { - if (error) { - res.status(500).send({error: error.message}); - } else { - res.json(response.toObject()); + // Auth check and :id check --- + const { authorization } = req.headers; + if (!authorization) return res.status(401).json({ message: "Unauthorized" }); + const token = authorization.split("Bearer ")[1]; + const isAuthentified = (await getUserIdFromToken(token)) !== undefined; + if (!isAuthentified) return res.status(401).json({ message: "Unauthorized" }); + // ---------------------------- + + const { id } = req.params; + const { eta, address, status, deliveryPersonId, userId, restaurantId } = req.body; + const deliveryStatus = Status[status] as unknown as Status; + if (!deliveryStatus) return res.status(400).send({ error: "Status not found" }); + + const delivery = new Delivery() + .setId(id) + .setEta(eta) + .setAddress(address) + .setStatus(deliveryStatus) + .setDeliveryPersonId(deliveryPersonId) + .setUserId(userId) + .setRestaurantId(restaurantId); + + deliveryServiceClient.updateDelivery(delivery, (error, response) => { + if (error) return res.status(500).send({ error: error.message }); + else return res.json(response.toObject()); + }); +}); + +deliveryRoutes.delete("/api/delivery/:id", async (req: Request, res: Response) => { + /*#swagger.parameters['headers'] = { + in: 'header', + required: true, + schema: { + Authorization: "Bearer " } + } */ + // Auth check and :id check --- + const { authorization } = req.headers; + if (!authorization) return res.status(401).json({ message: "Unauthorized" }); + const token = authorization.split("Bearer ")[1]; + const userId = await getUserIdFromToken(token); + if (!userId) return res.status(401).json({ message: "Unauthorized" }); + // ---------------------------- + + const { id } = req.params; + + try { + const delivery: Delivery.AsObject = await new Promise((resolve, reject) => { + deliveryServiceClient.getDelivery(new DeliveryId().setId(id), (error, response) => { + if (error) reject(error); + else resolve(response.toObject()); + }); }); -}); -deliveryRoutes.delete('/api/delivery/:id', (req: Request, res: Response) => { - const {id} = req.params; + if (Number(delivery.userId) !== userId || !(await check(token, { role: "ADMIN" }))) + return res.status(401).json({ message: "Unauthorized" }); deliveryServiceClient.deleteDelivery(new DeliveryId().setId(id), (error, response) => { - if (error) { - res.status(500).send({error: error.message}); - } else { - res.json(response.toObject()); - } + if (error) return res.status(500).send({ error }); + else return res.status(200).json(response.toObject()); }); -}); \ No newline at end of file + } catch (error) { + res.status(500).send({ error }); + } +}); diff --git a/services/gateway/src/controller/delivery/deliveryPerson.controller.ts b/services/gateway/src/controller/delivery/deliveryPerson.controller.ts index 0df72e62..476c1f3c 100644 --- a/services/gateway/src/controller/delivery/deliveryPerson.controller.ts +++ b/services/gateway/src/controller/delivery/deliveryPerson.controller.ts @@ -1,88 +1,177 @@ -import {Router} from "express"; -import {deliveryPersonServiceClient} from "@gateway/services/clients/delivery.client"; -import {DeliveryPerson, DeliveryPersonCreateInput, DeliveryPersonId, Location} from "@gateway/proto/delivery_pb"; -import {Empty} from "google-protobuf/google/protobuf/empty_pb"; +import { Router } from "express"; +import { deliveryPersonServiceClient } from "@gateway/services/clients/delivery.client"; +import { DeliveryPerson, DeliveryPersonCreateInput, DeliveryPersonId, Location } from "@gateway/proto/delivery_pb"; +import { Empty } from "google-protobuf/google/protobuf/empty_pb"; +import { getUserIdFromToken } from "@gateway/services/user.service"; +import { withCheck } from "@gateway/middleware/auth"; export const deliveryPersonRoutes = Router(); -deliveryPersonRoutes.get('/api/delivery-person/:id', (req, res) => { - const {id} = req.params; - - deliveryPersonServiceClient.getDeliveryPerson(new DeliveryPersonId().setId(id), (error, response) => { - if (error) { - res.status(500).send({error: error.message}); - } else { - res.json(response.toObject()); +deliveryPersonRoutes.get("/api/delivery-person/:id", async (req, res) => { + /* + #swagger.parameters['headers'] = { + in: 'header', + required: true, + schema: { + Authorization: "Bearer " } - }); + } */ + + // Auth check and :id check --- + const { authorization } = req.headers; + if (!authorization) return res.status(401).json({ message: "Unauthorized" }); + const token = authorization.split("Bearer ")[1]; + const userId = await getUserIdFromToken(token); + if (!userId) return res.status(401).json({ message: "Unauthorized" }); + // ---------------------------- + + const { id } = req.params; + + deliveryPersonServiceClient.getDeliveryPerson(new DeliveryPersonId().setId(id), (error, response) => { + if (error) return res.status(500).send({ error: error }); + else return res.status(200).json(response.toObject()); + }); }); -deliveryPersonRoutes.get('/api/delivery-person', (req, res) => { - deliveryPersonServiceClient.listDeliveryPersons(new Empty(), (error, response) => { - if (error) { - res.status(500).send({error: error.message}); - } else { - res.json(response.toObject()); +deliveryPersonRoutes.get("/api/delivery-person", withCheck({ role: "ADMIN" }), async (_, res) => { + /* + #swagger.parameters['headers'] = { + in: 'header', + required: true, + schema: { + Authorization: "Bearer " } - }); + } */ + + deliveryPersonServiceClient.listDeliveryPersons(new Empty(), (error, response) => { + if (error) return res.status(500).send({ error }); + else return res.status(200).json(response.toObject()); + }); }); -deliveryPersonRoutes.get('/api/delivery-person', (req, res) => { - const {lat, lng} = req.body; - const location = new Location() - .setLatitude(lat) - .setLongitude(lng); - deliveryPersonServiceClient.listNearDeliveryPersons(location, (error, response) => { - if (error) { - res.status(500).send({error: error.message}); - } else { - res.json(response.toObject()); +deliveryPersonRoutes.get("/api/delivery-person/near", async (req, res) => { + /* #swagger.parameters['query'] = { + in: 'query', + required: true, + schema: { + lat: "0", + lng: "0" } - }); + } + #swagger.parameters['headers'] = { + in: 'header', + required: true, + schema: { + Authorization: "Bearer " + } + } */ + + // Auth check and :id check --- + const { authorization } = req.headers; + if (!authorization) return res.status(401).json({ message: "Unauthorized" }); + const token = authorization.split("Bearer ")[1]; + const userId = await getUserIdFromToken(token); + if (!userId) return res.status(401).json({ message: "Unauthorized" }); + // ---------------------------- + + const { lat, lng } = req.query as { lat: string; lng: string }; + const location = new Location().setLatitude(Number(lat)).setLongitude(Number(lng)); + deliveryPersonServiceClient.listNearDeliveryPersons(location, (error, response) => { + if (error) return res.status(500).send({ error }); + else return res.status(200).json(response.toObject()); + }); }); -deliveryPersonRoutes.post('/api/delivery-person', (req, res) => { - const {firstName, lastName, phone, locationList} = req.body; - const deliveryPerson = new DeliveryPersonCreateInput() - .setFirstName(firstName) - .setLastName(lastName) - .setPhone(phone) - .setLocationList(locationList); - deliveryPersonServiceClient.createDeliveryPerson(deliveryPerson, (error, response) => { - if (error) { - res.status(500).send({error: error.message}); - } else { - res.json(response.toObject()); +deliveryPersonRoutes.post("/api/delivery-person", withCheck({ role: "ADMIN" }), async (req, res) => { + /* #swagger.parameters['body'] = { + in: 'body', + required: true, + schema: { + firstName:"John", + lastName:"Doe", + phone:"0612345678", + locationList:[41.40338, 2.17403] + } + } + #swagger.parameters['headers'] = { + in: 'header', + required: true, + schema: { + Authorization: "Bearer " } - }); + } */ + + const { firstName, lastName, phone, locationList } = req.body; + const deliveryPerson = new DeliveryPersonCreateInput() + .setFirstName(firstName) + .setLastName(lastName) + .setPhone(phone) + .setLocationList(locationList); + deliveryPersonServiceClient.createDeliveryPerson(deliveryPerson, (error, response) => { + if (error) return res.status(500).send({ error }); + else return res.status(201).json(response.toObject()); + }); }); -deliveryPersonRoutes.put('/api/delivery-person/:id', (req, res) => { - const {id} = req.params; - const {firstName, lastName, phone, locationList} = req.body; - const deliveryPerson = new DeliveryPerson().setId(id) - .setFirstName(firstName) - .setLastName(lastName) - .setPhone(phone) - .setLocationList(locationList); - - deliveryPersonServiceClient.updateDeliveryPerson(deliveryPerson, (error, response) => { - if (error) { - res.status(500).send({error: error.message}); - } else { - res.json(response.toObject()); +deliveryPersonRoutes.put("/api/delivery-person/:id", withCheck({ role: "ADMIN" }), (req, res) => { + /* #swagger.parameters['query'] = { + in: 'query', + required: true, + schema: { + id: "delivery_person_id:1" } - }); -}); + } + #swagger.parameters['body'] = { + in: 'body', + required: true, + schema: { + firstName:"John", + lastName:"Doe", + phone:"0612345678", + locationList:[41.40338, 2.17403] + } + } + #swagger.parameters['headers'] = { + in: 'header', + required: true, + schema: { + Authorization: "Bearer " + } + } */ + const { id } = req.params; + const { firstName, lastName, phone, locationList } = req.body; + const deliveryPerson = new DeliveryPerson() + .setId(id) + .setFirstName(firstName) + .setLastName(lastName) + .setPhone(phone) + .setLocationList(locationList); -deliveryPersonRoutes.delete('/api/delivery-person/:id', (req, res) => { - const {id} = req.params; + deliveryPersonServiceClient.updateDeliveryPerson(deliveryPerson, (error, response) => { + if (error) return res.status(500).send({ error }); + else return res.status(200).json(response.toObject()); + }); +}); - deliveryPersonServiceClient.deleteDeliveryPerson(new DeliveryPersonId().setId(id), (error, response) => { - if (error) { - res.status(500).send({error: error.message}); - } else { - res.json(response.toObject()); +deliveryPersonRoutes.delete("/api/delivery-person/:id", withCheck({ role: "ADMIN" }), (req, res) => { + /* #swagger.parameters['query'] = { + in: 'query', + required: true, + schema: { + id: "delivery_person_id:1" + } + } + #swagger.parameters['headers'] = { + in: 'header', + required: true, + schema: { + Authorization: "Bearer " } - }); -}); \ No newline at end of file + } */ + const { id } = req.params; + + deliveryPersonServiceClient.deleteDeliveryPerson(new DeliveryPersonId().setId(id), (error, response) => { + if (error) return res.status(500).send({ error }); + else return res.status(200).json(response.toObject()); + }); +}); From ea347fae8883e8f575b906e38a24e71e5279c34e Mon Sep 17 00:00:00 2001 From: anatole Date: Thu, 24 Aug 2023 16:30:43 +0200 Subject: [PATCH 466/883] feat(gateway): add authorisation checks in the user controller --- .../src/controller/user/user.controller.ts | 414 ++++++++++-------- services/gateway/src/services/user.service.ts | 20 +- 2 files changed, 239 insertions(+), 195 deletions(-) diff --git a/services/gateway/src/controller/user/user.controller.ts b/services/gateway/src/controller/user/user.controller.ts index dc3fb666..b67ae3a9 100644 --- a/services/gateway/src/controller/user/user.controller.ts +++ b/services/gateway/src/controller/user/user.controller.ts @@ -1,96 +1,117 @@ -import {Request, Response, Router} from 'express'; -import {userServiceClient} from '../../services/clients/user.client'; +import { Request, Response, Router } from "express"; +import { userServiceClient } from "../../services/clients/user.client"; import { - changePasswordInput, - changeRoleInput, - DeleteInput, - logInInput, - MainAddress, - Role, - RoleInput, - UpdateUserInput, - User, - UserCreateInput, - validateInput + changePasswordInput, + changeRoleInput, + DeleteInput, + logInInput, + MainAddress, + Role, + RoleInput, + UpdateUserInput, + User, + UserCreateInput, + validateInput, } from "@gateway/proto/user_pb"; -import {Empty} from "google-protobuf/google/protobuf/empty_pb"; -import {getUser} from "@gateway/services/user.service"; +import { Empty } from "google-protobuf/google/protobuf/empty_pb"; +import { getUser, getUserIdFromToken } from "@gateway/services/user.service"; +import {check, withCheck} from "@gateway/middleware/auth"; export const userRoutes = Router(); -userRoutes.get('/api/user/:id', (req: Request, res: Response) => { - /* #swagger.parameters['id'] = { - in: 'path', - required: true, - type: 'integer' - }*/ - const {id} = req.params; - try { - res.json(getUser(Number(id))); - } catch (e: any) { - res.json({error: e.message}); - } +userRoutes.get("/api/user/:id", async (req: Request, res: Response) => { + /* #swagger.parameters['header'] = { + in: 'header', + required: true, + schema: { + Authorization: "Bearer " + } + } + #swagger.parameters['id'] = { + in: 'path', + required: true, + type: 'integer' + }*/ + const { id } = req.params; + + // Auth check and :id check + const { authorization } = req.headers; + if (!authorization) return res.status(401).json({ message: "Unauthorized" }); + const token = authorization.split("Bearer ")[1]; + if (!(await check(token, { id: Number(id) }))) return res.status(403).json({ message: "Forbidden" }); + + try { + res.json(getUser(Number(id))); + } catch (e: any) { + res.json({ error: e.message }); + } }); -userRoutes.get('/api/user', (req: Request, res: Response) => { - userServiceClient.listUser(new Empty(), (error, response) => { - if (error) { - res.status(500).send({error: error.message}); - } else { - res.json(response.toObject()); +userRoutes.get("/api/user", withCheck({ role: "ADMIN" }), (req: Request, res: Response) => { + /* #swagger.parameters['header'] = { + in: 'header', + required: true, + schema: { + Authorization: "Bearer " } - }); + } */ + userServiceClient.listUser(new Empty(), (error, response) => { + if (error) res.status(500).send({ error: error.message }); + else res.json(response.toObject()); + }); }); -userRoutes.post('/api/user/register', (req: Request, res: Response) => { - /* #swagger.parameters['body'] = { - in: 'body', - required: true, - schema: { - firstName: "John", - lastName: "Doe", - email: "johnDoe@mail.com", - password: "password", - phone: "0642424242", - country: "France", - zipCode: "76000", - street: "7 rue de la paix", - lat: 49.443232, - lng: 1.099971, - roleCode: {'$ref': '#/definitions/RoleCode'}, - } - } */ - const {firstName, lastName, email, password, phone, country, zipCode, street, lat, lng, roleCode} = req.body; - const userInput = new UserCreateInput(); - try { - const address = new MainAddress().setCountry(country).setZipcode(zipCode).setStreet(street).setLat(lat).setLng(lng) - userInput.setFirstName(firstName) - .setLastName(lastName) - .setEmail(email) - .setPassword(password) - .setPhone(phone) - .setMainaddress(address) - .setRole(new RoleInput().setCode(roleCode)); +userRoutes.post("/api/user/register", (req: Request, res: Response) => { + /* #swagger.parameters['body'] = { + in: 'body', + required: true, + schema: { + firstName: "John", + lastName: "Doe", + email: "johnDoe@mail.com", + password: "password", + phone: "0642424242", + country: "France", + zipCode: "76000", + street: "7 rue de la paix", + lat: 49.443232, + lng: 1.099971, + roleCode: {'$ref': '#/definitions/RoleCode'}, + } + } */ + const { firstName, lastName, email, password, phone, country, zipCode, street, lat, lng, roleCode } = req.body; + const userInput = new UserCreateInput(); + try { + const address = new MainAddress().setCountry(country).setZipcode(zipCode).setStreet(street).setLat(lat).setLng(lng); + userInput + .setFirstName(firstName) + .setLastName(lastName) + .setEmail(email) + .setPassword(password) + .setPhone(phone) + .setMainaddress(address) + .setRole(new RoleInput().setCode(roleCode)); + } catch (e: any) { + res.json({ error: e.message }); + } - } catch (e: any) { - res.json({error: e.message}); + userServiceClient.register(userInput, (error, response) => { + if (error) { + res.status(500).send({ error: error.message }); + } else { + res.json(response.toObject()); } - - userServiceClient.register(userInput, (error, response) => { - if (error) { - res.status(500).send({error: error.message}); - } else { - res.json(response.toObject()); - } - }); + }); }); -userRoutes.put('/api/user/:id', (req: Request, res: Response) => { - /* #swagger.parameters['id'] = { - in: 'path', - required: true, - type: 'integer' - } - #swagger.parameters['body'] = { +userRoutes.put("/api/user", async (req: Request, res: Response) => { + /* #swagger.parameters['header'] = { + in: 'header', + required: true, + schema: { + Authorization: "Bearer " + } + } + #swagger.parameters['body'] = { in: 'body', required: true, schema: { @@ -106,137 +127,160 @@ userRoutes.put('/api/user/:id', (req: Request, res: Response) => { lng: 1.099971, roleCode: {'$ref': '#/definitions/RoleCode'}, } - } */ - const {authorization} = req.headers; - if (!authorization) { - res.json({error: 'Not authorized'}); - return; - } - const {firstName, lastName, email, phone, country, zipCode, street, lat, lng, roleCode} = req.body; - const userInput = new UpdateUserInput() + } */ - try { - const address = new MainAddress().setCountry(country).setZipcode(zipCode).setStreet(street).setLat(lat).setLng(lng) - const user = new User().setId(Number(req.params.id)) - .setFirstName(firstName) - .setLastName(lastName) - .setEmail(email) - .setPhone(phone) - .setMainaddress(address) - .setRole(new Role().setCode(roleCode)); + // Auth check and :id check --- + const { authorization } = req.headers; + if (!authorization) return res.status(401).json({ message: "Unauthorized" }); + const token = authorization.split("Bearer ")[1]; + const userId = await getUserIdFromToken(token); + if (!userId) return res.status(401).json({ message: "Unauthorized" }); + if (!(await check(token, { id: Number(userId) }))) return res.status(403).json({ message: "Forbidden" }); - userInput.setUser(user).setToken(authorization); + const { firstName, lastName, email, phone, country, zipCode, street, lat, lng, roleCode } = req.body; + const userInput = new UpdateUserInput(); - } catch (e: any) { - res.json({error: e.message}); - } + try { + const address = new MainAddress().setCountry(country).setZipcode(zipCode).setStreet(street).setLat(lat).setLng(lng); + const user = new User() + .setId(Number(req.params.id)) + .setFirstName(firstName) + .setLastName(lastName) + .setEmail(email) + .setPhone(phone) + .setMainaddress(address) + .setRole(new Role().setCode(roleCode)); - userServiceClient.updateUser(userInput, (error, response) => { - if (error) { - res.status(500).send({error: error.message}); - } else { - res.json(response.toObject()); - } - }); + userInput.setUser(user).setToken(authorization); + } catch (e: any) { + res.json({ error: e.message }); + } + + userServiceClient.updateUser(userInput, (error, response) => { + if (error) { + res.status(500).send({ error: error.message }); + } else { + res.json(response.toObject()); + } + }); }); userRoutes.delete('/api/user/:id', (req: Request, res: Response) => { - /* #swagger.parameters['id'] = { + /* #swagger.parameters['header'] = { + in: 'header', + required: true, + schema: { + Authorization: "Bearer " + } + } + #swagger.parameters['id'] = { in: 'path', required: true, type: 'integer' - } */ + } */ const {id} = req.params; const {authorization} = req.headers; - if (!authorization) { - res.json({error: 'Not authorized'}); - return; - } + if (!authorization) return res.status(401).json({ message: "Unauthorized" }); - userServiceClient.deleteUser(new DeleteInput().setUserid(Number(id)).setToken(authorization), (error, response) => { - if (error) { - res.status(500).send({error: error.message}); - } else { - res.json(response.toObject()); - } - }); + // The delete route in the user service implement the user validation + userServiceClient.deleteUser(new DeleteInput().setUserid(Number(id)).setToken(authorization), (error, response) => { + if (error) { + res.status(500).send({ error: error.message }); + } else { + res.json(response.toObject()); + } + }); }); -userRoutes.post('/api/user/login', (req: Request, res: Response) => { - /* #swagger.parameters['body'] = { - in: 'body', - required: true, - schema: { - email: "johnDoe@mail.com", - password: "password", - } - } */ - const {email, password} = req.body; - const inInput = new logInInput().setEmail(email).setPassword(password); - - userServiceClient.logIn(inInput, (error, response) => { - if (error) { - res.status(500).send({error: error.message}); - } else { - res.json(response.toObject()); - } - }); -}); +userRoutes.post("/api/user/login", (req: Request, res: Response) => { + /* #swagger.parameters['body'] = { + in: 'body', + required: true, + schema: { + email: "johnDoe@mail.com", + password: "password", + } + } */ + const { email, password } = req.body; + const inInput = new logInInput().setEmail(email).setPassword(password); -userRoutes.post('/api/user/validate', (req: Request, res: Response) => { - const {authorization} = req.headers; - if (!authorization) { - res.json({error: 'Not authorized'}); - return; + userServiceClient.logIn(inInput, (error, response) => { + if (error) { + res.status(500).send({ error: error.message }); + } else { + res.json(response.toObject()); } - const validate = new validateInput().setToken(authorization); + }); +}); - userServiceClient.validate(validate, (error, response) => { - if (error) { - res.status(500).send({error: error.message}); - } else { - res.json(response.toObject()); +userRoutes.post("/api/user/validate", (req: Request, res: Response) => { + /* #swagger.parameters['header'] = { + in: 'header', + required: true, + schema: { + Authorization: "Bearer " } - }); + } */ + const { authorization } = req.headers; + if (!authorization) return res.status(401).json({ message: "Unauthorized" }); + + const validate = new validateInput().setToken(authorization); + + userServiceClient.validate(validate, (error, response) => { + if (error) { + res.status(500).send({ error: error.message }); + } else { + res.json(response.toObject()); + } + }); }); -userRoutes.put('/api/user/:id/password', (req: Request, res: Response) => { - /* #swagger.parameters['body'] = { - in: 'body', - required: true, - schema: { - oldpassword: "oldpassword", - password: "newPassword", - } +userRoutes.put('/api/user/password', (req: Request, res: Response) => { + /* #swagger.parameters['header'] = { + in: 'header', + required: true, + schema: { + Authorization: "Bearer " + } + } + #swagger.parameters['body'] = { + in: 'body', + required: true, + schema: { + oldpassword: "oldpassword", + password: "newPassword", + } } */ + const {authorization} = req.headers; - if (!authorization) { - res.json({error: 'Not authorized'}); - return; - } + if (!authorization) return res.status(401).json({ message: "Unauthorized" }); - const {oldpassword, password} = req.body; - const updatePasswordInput = new changePasswordInput(); - try { - updatePasswordInput - .setToken(authorization) - .setOldpassword(oldpassword) - .setNewpassword(password); - } catch (e: any) { - res.json({error: e.message}); - } + const { oldpassword, password } = req.body; + const updatePasswordInput = new changePasswordInput(); + try { + updatePasswordInput.setToken(authorization).setOldpassword(oldpassword).setNewpassword(password); + } catch (e: any) { + res.json({ error: e.message }); + } - userServiceClient.changePassword(updatePasswordInput, (error, response) => { - if (error) { - res.status(500).send({error: error.message}); - } else { - res.json(response.toObject()); - } - }); + userServiceClient.changePassword(updatePasswordInput, (error, response) => { + if (error) { + res.status(500).send({ error: error.message }); + } else { + res.json(response.toObject()); + } + }); }); -userRoutes.put('/api/user/:id/role', (req: Request, res: Response) => { - /* #swagger.parameters['id'] = { +userRoutes.put('/api/user/:id/role', withCheck({ role: "ADMIN" }), (req: Request, res: Response) => { + /* #swagger.parameters['header'] = { + in: 'header', + required: true, + schema: { + Authorization: "Bearer " + } + } + #swagger.parameters['id'] = { in: 'path', required: true, type: 'integer' @@ -270,4 +314,4 @@ userRoutes.put('/api/user/:id/role', (req: Request, res: Response) => { res.json(response.toObject()); } }); -}); \ No newline at end of file +}); diff --git a/services/gateway/src/services/user.service.ts b/services/gateway/src/services/user.service.ts index c0921d37..1d2b5d80 100644 --- a/services/gateway/src/services/user.service.ts +++ b/services/gateway/src/services/user.service.ts @@ -15,18 +15,18 @@ export const getUser = (id: number): Promise => { }) }; -export const getUserIdFromToken = (token: string): number | undefined => { +export const getUserIdFromToken = (token: string): Promise => { const userToken = new validateInput(); userToken.setToken(token); - let user: number | undefined = undefined; - userServiceClient.validate(userToken, (error, response) => { - if (error) { - throw Error(error.message); - } else { - user = response.getUserid(); - } - }); - return user; + return new Promise((resolve, reject) => { + userServiceClient.validate(userToken, (error, response) => { + if (error) { + reject(error); + } else { + resolve(response.getUserid()); + } + }); + }); }; export const user_service_promises = { From 3844d0c0c6ed4f8d5d72af774501dbc95b17172d Mon Sep 17 00:00:00 2001 From: Florian LEROUX Date: Thu, 24 Aug 2023 16:32:29 +0200 Subject: [PATCH 467/883] feat(log): add auth checkguards in routes --- .../src/controller/log/log.controller.ts | 59 ++++++++++++------- 1 file changed, 37 insertions(+), 22 deletions(-) diff --git a/services/gateway/src/controller/log/log.controller.ts b/services/gateway/src/controller/log/log.controller.ts index 2dd59a70..93169020 100644 --- a/services/gateway/src/controller/log/log.controller.ts +++ b/services/gateway/src/controller/log/log.controller.ts @@ -1,29 +1,44 @@ -import express, {Router} from "express"; -import {logServiceClient} from "@gateway/services/clients/log.client"; -import {Empty} from "google-protobuf/google/protobuf/empty_pb"; -import {GetLogRequest} from "@gateway/proto/log_pb"; +import { Request, Response, Router } from "express"; +import { logServiceClient } from "@gateway/services/clients/log.client"; +import { Empty } from "google-protobuf/google/protobuf/empty_pb"; +import { GetLogRequest } from "@gateway/proto/log_pb"; +import { withCheck } from "@gateway/middleware/auth"; export const logRoutes = Router(); -logRoutes.get('/api/log', (req: express.Request, res: express.Response) => { - - logServiceClient.listLog(new Empty(), (error, response) => { - if (error) { - res.status(500).send({error: error.message}); - } else { - res.json(response.toObject()); +logRoutes.get("/api/log", withCheck({ role: "ADMIN" }), (_: Request, res: Response) => { + /* #swagger.parameters['headers'] = { + in: 'header', + required: true, + schema: { + Authorization: "Bearer " } - }); + } */ + logServiceClient.listLog(new Empty(), (error, response) => { + if (error) return res.status(500).send({ error: error.message }); + else return res.status(200).json(response.toObject()); + }); }); -logRoutes.get('/api/log/:id', (req: express.Request, res: express.Response) => { - const {id} = req.params - - logServiceClient.getLog(new GetLogRequest().setId(Number(id)), (error, response) => { - if (error) { - res.status(500).send({error: error.message}); - } else { - res.json(response.toObject()); +logRoutes.get("/api/log/:id", withCheck({ role: "ADMIN" }), (req: Request, res: Response) => { + /* #swagger.parameters['query'] = { + in: 'query', + required: true, + schema: { + id: "delivery_person_id:1" + } + } + #swagger.parameters['headers'] = { + in: 'header', + required: true, + schema: { + Authorization: "Bearer " } - }); -}); \ No newline at end of file + } */ + const { id } = req.query as { id: string }; + + logServiceClient.getLog(new GetLogRequest().setId(Number(id)), (error, response) => { + if (error) return res.status(500).send({ error: error.message }); + else return res.status(200).json(response.toObject()); + }); +}); From b22f226d583f19f8174d203b8bd98beeb18875ad Mon Sep 17 00:00:00 2001 From: anatole Date: Thu, 24 Aug 2023 16:41:28 +0200 Subject: [PATCH 468/883] feat(gateway): remove useless condition in user controller --- services/gateway/src/controller/user/user.controller.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/services/gateway/src/controller/user/user.controller.ts b/services/gateway/src/controller/user/user.controller.ts index b67ae3a9..77424457 100644 --- a/services/gateway/src/controller/user/user.controller.ts +++ b/services/gateway/src/controller/user/user.controller.ts @@ -135,7 +135,6 @@ userRoutes.put("/api/user", async (req: Request, res: Response) => { const token = authorization.split("Bearer ")[1]; const userId = await getUserIdFromToken(token); if (!userId) return res.status(401).json({ message: "Unauthorized" }); - if (!(await check(token, { id: Number(userId) }))) return res.status(403).json({ message: "Forbidden" }); const { firstName, lastName, email, phone, country, zipCode, street, lat, lng, roleCode } = req.body; const userInput = new UpdateUserInput(); From 5cae18eee924c022017b045e8539af803d7ef09d Mon Sep 17 00:00:00 2001 From: Florian LEROUX Date: Thu, 24 Aug 2023 17:13:35 +0200 Subject: [PATCH 469/883] feat(metric): add auth checkguards in routes --- .../controller/metric/metric.controller.ts | 470 ++++++++++-------- 1 file changed, 274 insertions(+), 196 deletions(-) diff --git a/services/gateway/src/controller/metric/metric.controller.ts b/services/gateway/src/controller/metric/metric.controller.ts index 1020cc88..2596476f 100644 --- a/services/gateway/src/controller/metric/metric.controller.ts +++ b/services/gateway/src/controller/metric/metric.controller.ts @@ -1,115 +1,156 @@ -import metricService from '../../services/clients/metric.client'; -import {Router} from "express"; +import metricService from "../../services/clients/metric.client"; +import { Router } from "express"; import { - CreateRestaurantGroupRequest, - CreateRestaurantRequest, - DeleteRestaurantGroupRequest, - DeleteRestaurantRequest, - GetMetricRequest, - GetMetricsByRestaurantAndDateRequest, - GetMetricsByRestaurantGroupRequest, - GetMetricsByRestaurantRequest, - GetRestaurantGroupRequest, - GetRestaurantRequest, - Metric, - UpdateRestaurantGroupRequest, - UpdateRestaurantRequest + CreateRestaurantGroupRequest, + CreateRestaurantRequest, + DeleteRestaurantGroupRequest, + DeleteRestaurantRequest, + GetMetricRequest, + GetMetricsByRestaurantAndDateRequest, + GetMetricsByRestaurantGroupRequest, + GetMetricsByRestaurantRequest, + GetRestaurantGroupRequest, + GetRestaurantRequest, + Metric, + UpdateRestaurantGroupRequest, + UpdateRestaurantRequest, } from "@gateway/proto/metric_pb"; +import { withCheck } from "@gateway/middleware/auth"; export const metricRoutes = Router(); -metricRoutes.get('/api/metric/:key', (req, res) => { - const {key} = req.params; - const metricInput = new GetMetricRequest().setKey(key); - metricService.getMetric(metricInput, (error, response) => { - if (error) { - res.status(500).send({error: error.message}); - } else { - res.json(response.toObject()); +metricRoutes.get("/api/metric/:key", withCheck({ role: "ACCOUNTANT" }), (req, res) => { + /* #swagger.parameters['query'] = { + in: 'query', + required: true, + schema: { + key: "key_example" } - }); -}); - -metricRoutes.post('/api/metric/by-restaurant-and-date', (req, res) => { - /* #swagger.parameters['body'] = { - in: 'body', - required: true, - schema: { - restaurantId: "restaurant_id:1", - date: "2022-01-01T00:00:00.000Z", - } - }*/ - const {restaurantId, date} = req.body; - const getMetricsByRestaurantAndDateRequest = new GetMetricsByRestaurantAndDateRequest().setRestaurantId(restaurantId).setDate(date); - metricService.getMetricsByRestaurantAndDate(getMetricsByRestaurantAndDateRequest, (error, response) => { - if (error) { - res.status(500).send({error: error.message}); - } else { - res.json(response.toObject()); + } + #swagger.parameters['headers'] = { + in: 'header', + required: true, + schema: { + Authorization: "Bearer " } - }); + } */ + const { key } = req.params; + const metricInput = new GetMetricRequest().setKey(key); + metricService.getMetric(metricInput, (error, response) => { + if (error) return res.status(500).send({ error }); + else return res.status(200).json(response.toObject()); + }); }); -metricRoutes.get('/api/metric/by-restaurant/:restaurantId', (req, res) => { - const {restaurantId} = req.params; - const getMetricsByRestaurantRequest = new GetMetricsByRestaurantRequest().setRestaurantId(restaurantId); - metricService.getMetricsByRestaurant(getMetricsByRestaurantRequest, (error, response) => { - if (error) { - res.status(500).send({error: error.message}); - } else { - res.json(response.toObject()); +metricRoutes.post("/api/metric/by-restaurant-and-date", withCheck({ role: "ACCOUNTANT" }), (req, res) => { + /* #swagger.parameters['body'] = { + in: 'body', + required: true, + schema: { + restaurantId: "restaurant_id:1", + date: "2022-01-01T00:00:00.000Z", } - }); + } + #swagger.parameters['headers'] = { + in: 'header', + required: true, + schema: { + Authorization: "Bearer " + } + } */ + const { restaurantId, date } = req.body; + const getMetricsByRestaurantAndDateRequest = new GetMetricsByRestaurantAndDateRequest() + .setRestaurantId(restaurantId) + .setDate(date); + metricService.getMetricsByRestaurantAndDate(getMetricsByRestaurantAndDateRequest, (error, response) => { + if (error) return res.status(500).send({ error }); + else return res.status(200).json(response.toObject()); + }); }); -metricRoutes.get('/api/metric/by-restaurant-group/:restaurantGroupId', (req, res) => { - /* #swagger.parameters['restaurantGroupId'] = { - in: 'path', - required: true, - type: 'integer' - }*/ - const {restaurantGroupId} = req.params; - const getMetricsByRestaurantGroupRequest = new GetMetricsByRestaurantGroupRequest().setRestaurantGroupId(Number(restaurantGroupId)); - metricService.getMetricsByRestaurantGroup(getMetricsByRestaurantGroupRequest, (error, response) => { - if (error) { - res.status(500).send({error: error.message}); - } else { - res.json(response.toObject()); +metricRoutes.get("/api/metric/by-restaurant/:restaurantId", withCheck({ role: "ACCOUNTANT" }), (req, res) => { + /* #swagger.parameters['query'] = { + in: 'query', + required: true, + schema: { + restaurantId: "restaurant_id:1" } - }); + } + #swagger.parameters['headers'] = { + in: 'header', + required: true, + schema: { + Authorization: "Bearer " + } + } */ + const { restaurantId } = req.params; + const getMetricsByRestaurantRequest = new GetMetricsByRestaurantRequest().setRestaurantId(restaurantId); + metricService.getMetricsByRestaurant(getMetricsByRestaurantRequest, (error, response) => { + if (error) return res.status(500).send({ error }); + else return res.status(200).json(response.toObject()); + }); }); -metricRoutes.get('/api/metric/restaurant/:restaurantId', (req, res) => { - const {restaurantId} = req.params; - const getRestaurantRequest = new GetRestaurantRequest().setId(restaurantId); - metricService.getRestaurant(getRestaurantRequest, (error, response) => { - if (error) { - res.status(500).send({error: error.message}); - } else { - res.json(response.toObject()); +metricRoutes.get( + "/api/metric/by-restaurant-group/:restaurantGroupId", + withCheck({ role: "ACCOUNTANT" }), + (req, res) => { + /* #swagger.parameters['query'] = { + in: 'query', + required: true, + schema: { + restaurantGroupId: "restaurant_group_id:1" } + } + #swagger.parameters['headers'] = { + in: 'header', + required: true, + schema: { + Authorization: "Bearer " + } + } */ + const { restaurantGroupId } = req.params; + const getMetricsByRestaurantGroupRequest = new GetMetricsByRestaurantGroupRequest().setRestaurantGroupId( + Number(restaurantGroupId), + ); + metricService.getMetricsByRestaurantGroup(getMetricsByRestaurantGroupRequest, (error, response) => { + if (error) return res.status(500).send({ error }); + else return res.status(200).json(response.toObject()); }); + }, +); + +metricRoutes.get("/api/metric/restaurant/:restaurantId", (req, res) => { + const { restaurantId } = req.params; + const getRestaurantRequest = new GetRestaurantRequest().setId(restaurantId); + metricService.getRestaurant(getRestaurantRequest, (error, response) => { + if (error) { + res.status(500).send({ error: error.message }); + } else { + res.json(response.toObject()); + } + }); }); -metricRoutes.get('/api/metric/restaurant-group/:restaurantGroupId', (req, res) => { - /* #swagger.parameters['restaurantGroupId'] = { +metricRoutes.get("/api/metric/restaurant-group/:restaurantGroupId", (req, res) => { + /* #swagger.parameters['restaurantGroupId'] = { in: 'path', required: true, type: 'integer' }*/ - const {restaurantGroupId} = req.params; - const getRestaurantGroupRequest = new GetRestaurantGroupRequest().setId(Number(restaurantGroupId)); - metricService.getRestaurantGroup(getRestaurantGroupRequest, (error, response) => { - if (error) { - res.status(500).send({error: error.message}); - } else { - res.json(response.toObject()); - } - }); + const { restaurantGroupId } = req.params; + const getRestaurantGroupRequest = new GetRestaurantGroupRequest().setId(Number(restaurantGroupId)); + metricService.getRestaurantGroup(getRestaurantGroupRequest, (error, response) => { + if (error) { + res.status(500).send({ error: error.message }); + } else { + res.json(response.toObject()); + } + }); }); -metricRoutes.post('/api/metric/restaurant', (req, res) => { - /* #swagger.parameters['body'] = { +metricRoutes.post("/api/metric/restaurant", withCheck({ role: "ACCOUNTANT" }), (req, res) => { + /* #swagger.parameters['body'] = { in: 'body', required: true, schema: { @@ -118,46 +159,61 @@ metricRoutes.post('/api/metric/restaurant', (req, res) => { "address": "example_address", "group_id": 1 } + } + #swagger.parameters['headers'] = { + in: 'header', + required: true, + schema: { + Authorization: "Bearer " + } } */ - const {name, key, address, groupId} = req.body; - const createRestaurantRequest = new CreateRestaurantRequest() - .setName(name) - .setKey(key) - .setAddress(address) - .setGroupId(groupId); + const { name, key, address, groupId } = req.body; + const createRestaurantRequest = new CreateRestaurantRequest() + .setName(name) + .setKey(key) + .setAddress(address) + .setGroupId(groupId); - metricService.createRestaurant(createRestaurantRequest, (error, response) => { - if (error) { - res.status(500).send({error: error.message}); - } else { - res.json(response.toObject()); - } - }); + metricService.createRestaurant(createRestaurantRequest, (error, response) => { + if (error) return res.status(500).send({ error }); + else return res.status(201).json(response.toObject()); + }); }); -metricRoutes.post('/api/metric/restaurant-group', (req, res) => { - /* #swagger.parameters['body'] = { +metricRoutes.post("/api/metric/restaurant-group", withCheck({ role: "ACCOUNTANT" }), (req, res) => { + /* #swagger.parameters['body'] = { in: 'body', required: true, schema: { "name": "example_name", } + } + #swagger.parameters['headers'] = { + in: 'header', + required: true, + schema: { + Authorization: "Bearer " + } } */ - const {name} = req.body; - const createRestaurantGroupRequest = new CreateRestaurantGroupRequest() - .setName(name); + const { name } = req.body; + const createRestaurantGroupRequest = new CreateRestaurantGroupRequest().setName(name); - metricService.createRestaurantGroup(createRestaurantGroupRequest, (error, response) => { - if (error) { - res.status(500).send({error: error.message}); - } else { - res.json(response.toObject()); - } - }); + metricService.createRestaurantGroup(createRestaurantGroupRequest, (error, response) => { + if (error) return res.status(500).send({ error }); + else return res.status(201).json(response.toObject()); + }); }); -metricRoutes.put('/api/metric/restaurant/:restaurantId', (req, res) => { - /* #swagger.parameters['body'] = { +metricRoutes.put("/api/metric/restaurant/:restaurantId", withCheck({ role: "ACCOUNTANT" }), (req, res) => { + /* + #swagger.parameters['query'] = { + in: 'query', + required: true, + schema: { + restaurantId: "restaurant_id:1" + } + } + #swagger.parameters['body'] = { in: 'body', required: true, schema: { @@ -166,106 +222,128 @@ metricRoutes.put('/api/metric/restaurant/:restaurantId', (req, res) => { "address": "example_address", "group_id": 1 } + } + #swagger.parameters['headers'] = { + in: 'header', + required: true, + schema: { + Authorization: "Bearer " + } } */ - const {restaurantId} = req.params; - const {name, key, address, groupId} = req.body; - const updateRestaurantRequest = new UpdateRestaurantRequest().setId(restaurantId) - .setName(name) - .setKey(key) - .setAddress(address) - .setGroupId(groupId); - + const { restaurantId } = req.query as { restaurantId: string }; + const { name, key, address, groupId } = req.body; + const updateRestaurantRequest = new UpdateRestaurantRequest() + .setId(restaurantId) + .setName(name) + .setKey(key) + .setAddress(address) + .setGroupId(groupId); - metricService.updateRestaurant(updateRestaurantRequest, (error, response) => { - if (error) { - res.status(500).send({error: error.message}); - } else { - res.json(response.toObject()); - } - }); + metricService.updateRestaurant(updateRestaurantRequest, (error, response) => { + if (error) return res.status(500).send({ error }); + else return res.status(200).json(response.toObject()); + }); }); -metricRoutes.put('/api/metric/restaurant-group/:restaurantGroupId', (req, res) => { - /* #swagger.parameters['restaurantGroupId'] = { - in: 'path', - required: true, - type: 'integer' - } - #swagger.parameters['body'] = { +metricRoutes.put("/api/metric/restaurant-group/:restaurantGroupId", withCheck({ role: "ACCOUNTANT" }), (req, res) => { + /* #swagger.parameters['query'] = { + in: 'query', + required: true, + schema: { + restaurantGroupId: "restaurant_group_id:1" + } + } + #swagger.parameters['body'] = { in: 'body', required: true, schema: { "name": "example_name", } } */ - const {restaurantGroupId} = req.params; - const {name} = req.body; - const updateRestaurantGroupRequest = new UpdateRestaurantGroupRequest().setId(Number(restaurantGroupId)) - .setName(name); + const { restaurantGroupId } = req.query as { restaurantGroupId: string }; + const { name } = req.body; + const updateRestaurantGroupRequest = new UpdateRestaurantGroupRequest() + .setId(Number(restaurantGroupId)) + .setName(name); - metricService.updateRestaurantGroup(updateRestaurantGroupRequest, (error, response) => { - if (error) { - res.status(500).send({error: error.message}); - } else { - res.json(response.toObject()); - } - }); + metricService.updateRestaurantGroup(updateRestaurantGroupRequest, (error, response) => { + if (error) return res.status(500).send({ error }); + else return res.status(200).json(response.toObject()); + }); }); -metricRoutes.delete('/api/metric/restaurant/:restaurantId', (req, res) => { - const {restaurantId} = req.params; - const deleteRestaurantRequest = new DeleteRestaurantRequest() - .setId(restaurantId); - - metricService.deleteRestaurant(deleteRestaurantRequest, (error, response) => { - if (error) { - res.status(500).send({error: error.message}); - } else { - res.json(response.toObject()); +metricRoutes.delete("/api/metric/restaurant/:restaurantId", withCheck({ role: "ACCOUNTANT" }), (req, res) => { + /* #swagger.parameters['query'] = { + in: 'query', + required: true, + schema: { + restaurantId: "restaurant_id:1" } - }); -}); - -metricRoutes.delete('/api/metric/restaurant-group/:restaurantGroupId', (req, res) => { - /* #swagger.parameters['restaurantGroupId'] = { - in: 'path', - required: true, - type: 'integer' - }*/ - const {restaurantGroupId} = req.params; - const deleteRestaurantGroupRequest = new DeleteRestaurantGroupRequest() - .setId(Number(restaurantGroupId)); - - metricService.deleteRestaurantGroup(deleteRestaurantGroupRequest, (error, response) => { - if (error) { - res.status(500).send({error: error.message}); - } else { - res.json(response.toObject()); + } + #swagger.parameters['headers'] = { + in: 'header', + required: true, + schema: { + Authorization: "Bearer " } - }); + } */ + const { restaurantId } = req.query as { restaurantId: string }; + const deleteRestaurantRequest = new DeleteRestaurantRequest().setId(restaurantId); + + metricService.deleteRestaurant(deleteRestaurantRequest, (error, response) => { + if (error) return res.status(500).send({ error }); + else return res.status(200).json(response.toObject()); + }); }); +metricRoutes.delete("/api/metric/restaurant-group/:restaurantGroupId", (req, res) => { + /* #swagger.parameters['query'] = { + in: 'query', + required: true, + schema: { + restaurantGroupId: "restaurant_group_id:1" + } + } + #swagger.parameters['headers'] = { + in: 'header', + required: true, + schema: { + Authorization: "Bearer " + } + } */ + const { restaurantGroupId } = req.query as { restaurantGroupId: string }; + const deleteRestaurantGroupRequest = new DeleteRestaurantGroupRequest().setId(Number(restaurantGroupId)); -metricRoutes.post('/api/metric', (req, res) => { - /* #swagger.parameters['body'] = { - in: 'body', - required: true, - schema: { - restaurantId: "restaurant_id:1", - code: "income_1h", - value: "99.99", - key :"example_key" - } - }*/ - const {restaurantId, code, value, key} = req.body - const newMetric = new Metric().setKey(key).setRestaurantId(restaurantId).setCode(code).setValue(value) + metricService.deleteRestaurantGroup(deleteRestaurantGroupRequest, (error, response) => { + if (error) return res.status(500).send({ error }); + else return res.status(200).json(response.toObject()); + }); +}); - metricService.pushMetric(newMetric, (error, response) => { - if (error) { - res.status(500).send({error: error.message}); - } else { - res.json(response.toObject()); +// route should not be accessible since other services publish metrics into reporting via AMQP +metricRoutes.post("/api/metric", withCheck({ role: "ACCOUNTANT" }), (req, res) => { + /* #swagger.parameters['body'] = { + in: 'body', + required: true, + schema: { + restaurantId: "restaurant_id:1", + code: "income_1h", + value: "99.99", + key :"example_key" } - }); -}); + } + #swagger.parameters['headers'] = { + in: 'header', + required: true, + schema: { + Authorization: "Bearer " + } + }*/ + const { restaurantId, code, value, key } = req.body; + const newMetric = new Metric().setKey(key).setRestaurantId(restaurantId).setCode(code).setValue(value); + metricService.pushMetric(newMetric, (error, response) => { + if (error) return res.status(500).send({ error }); + else return res.status(201).json(response.toObject()); + }); +}); From 33be3ccbbbedf2c9ed0a93cfcf50b783ed989115 Mon Sep 17 00:00:00 2001 From: Florian LEROUX Date: Fri, 25 Aug 2023 10:39:59 +0200 Subject: [PATCH 470/883] feat(order): add auth checkguards in routes --- .../delivery/delivery.controller.ts | 2 +- .../src/controller/order/order.controller.ts | 429 ++++++++++++------ 2 files changed, 285 insertions(+), 146 deletions(-) diff --git a/services/gateway/src/controller/delivery/delivery.controller.ts b/services/gateway/src/controller/delivery/delivery.controller.ts index 4a1c7642..7d46fd82 100644 --- a/services/gateway/src/controller/delivery/delivery.controller.ts +++ b/services/gateway/src/controller/delivery/delivery.controller.ts @@ -33,7 +33,7 @@ deliveryRoutes.get("/api/delivery/:id", async (req: Request, res: Response) => { }); }); - if (Number(delivery.userId) !== userId) return res.status(401).json({ message: "Unauthorized" }); + if (delivery.userId !== userId.toString()) return res.status(401).json({ message: "Unauthorized" }); else return res.status(200).json(delivery); } catch (error) { return res.status(500).send({ error }); diff --git a/services/gateway/src/controller/order/order.controller.ts b/services/gateway/src/controller/order/order.controller.ts index 51e34d59..b22efce9 100644 --- a/services/gateway/src/controller/order/order.controller.ts +++ b/services/gateway/src/controller/order/order.controller.ts @@ -1,183 +1,322 @@ -import orderService from '../../services/clients/order.client'; -import {Request, Response, Router} from "express"; +import orderService from "../../services/clients/order.client"; +import { Request, Response, Router } from "express"; import { - Basket as BasketSnapshot, - CreateOrderRequest, - DeleteOrderRequest, - GetOrderByDeliveryRequest, - GetOrderByPaymentRequest, - GetOrderRequest, - GetOrdersByStatusRequest, - GetOrdersByUserRequest, - UpdateOrderRequest, - UserMinimum + Basket as BasketSnapshot, + CreateOrderRequest, + DeleteOrderRequest, + GetOrderByDeliveryRequest, + GetOrderByPaymentRequest, + GetOrderRequest, + GetOrdersByStatusRequest, + GetOrdersByUserRequest, + Order, + UpdateOrderRequest, + UserMinimum, } from "@gateway/proto/order_pb"; -import {getUser} from "@gateway/services/user.service"; -import {User} from "@gateway/proto/user_pb"; -import {getBasketByUser} from "@gateway/services/basket.service"; +import { getUser, getUserIdFromToken } from "@gateway/services/user.service"; +import { User } from "@gateway/proto/user_pb"; +import { getBasketByUser } from "@gateway/services/basket.service"; +import { check, withCheck } from "@gateway/middleware/auth"; export const orderRoutes = Router(); -orderRoutes.get('/api/order/:id', (req: Request, res: Response) => { - const {id} = req.params; - const orderId = new GetOrderRequest(); - orderId.setId(id); - - orderService.getOrder(orderId, (error, response) => { - if (error) { - res.status(500).send({error: error.message}); - } else { - res.json(response.toObject()); +orderRoutes.get("/api/order/:id", async (req: Request, res: Response) => { + /* #swagger.parameters['query'] = { + in: 'query', + required: true, + schema: { + id: "order_id:1" + } + } + #swagger.parameters['headers'] = { + in: 'header', + required: true, + schema: { + Authorization: "Bearer " } + } */ + + // Auth check and :id check --- + const { authorization } = req.headers; + if (!authorization) return res.status(401).json({ message: "Unauthorized" }); + const token = authorization.split("Bearer ")[1]; + const userId = await getUserIdFromToken(token); + if (!userId) return res.status(401).json({ message: "Unauthorized" }); + // ---------------------------- + + const { id } = req.query as { id: string }; + const orderId = new GetOrderRequest(); + orderId.setId(id); + + try { + const order: Order.AsObject = await new Promise((resolve, reject) => { + orderService.getOrder(orderId, (error, response) => { + if (error) reject(error); + else resolve(response.toObject()); + }); }); + + if (!order) return res.status(404).send({ error: "Order not found" }); + if (order.user?.id !== userId.toString() || !(await check(token, { role: "ADMIN" }))) + return res.status(401).send({ error: "Unauthorized" }); + + return res.status(200).json(order); + } catch (error) { + return res.status(500).send({ error }); + } }); //TODO: to test this route with the user and basket service -orderRoutes.post('/api/order', async (req: Request, res: Response) => { - /* #swagger.parameters['body'] = { +orderRoutes.post("/api/order", async (req: Request, res: Response) => { + /* #swagger.parameters['body'] = { in: 'body', required: true, schema: { - userId: 0, paymentId: "payment_id:1", deliveryId: "delivery_id:1", deliveryType :{'$ref': '#/definitions/DeliveryType'}, restaurantId :"restaurant_id:1" } - }*/ - const {userId, paymentId, deliveryId, deliveryType, restaurantId} = req.body; - let user: User | undefined = undefined; - try { - user = await getUser(Number(userId)); - } catch (e) { - return res.status(500).send({error: e}); - } + } + #swagger.parameters['headers'] = { + in: 'header', + required: true, + schema: { + Authorization: "Bearer " + } + } */ - if (!user) - return res.status(404).send({error: "User not found"}); - - - const miniUser = new UserMinimum().setId(String(user.getId())) - .setEmail(user.getEmail()) - .setFirstName(user.getFirstName()) - .setLastName(user.getLastName()) - .setPhone(user.getPhone()); - - let orderBasket: BasketSnapshot | undefined = undefined; - try { - const basket = (await getBasketByUser(userId))?.toObject(); - if (basket) orderBasket = new BasketSnapshot().setString(JSON.stringify(basket)); - } catch (e: any) { - res.status(500).send({error: e.message}); - } + // Auth check and :id check --- + const { authorization } = req.headers; + if (!authorization) return res.status(401).json({ message: "Unauthorized" }); + const token = authorization.split("Bearer ")[1]; + const userId = await getUserIdFromToken(token); + if (!userId) return res.status(401).json({ message: "Unauthorized" }); + // ---------------------------- - let orderInput = new CreateOrderRequest() - .setUser(miniUser) - .setPaymentId(paymentId) - .setDeliveryId(deliveryId) - .setDeliveryType(deliveryType) - .setBasketSnapshot(orderBasket) - .setRestaurantId(restaurantId); - - orderService.createOrder(orderInput, (error, response) => { - if (error) - return res.status(500).send({error: error.message}); - else - return res.json(response.toObject()); - }); + const { paymentId, deliveryId, deliveryType, restaurantId } = req.body; + let user: User | undefined = undefined; + try { + user = await getUser(userId); + } catch (error) { + return res.status(500).send({ error }); + } + + if (!user) return res.status(404).send({ error: "User not found" }); + + const miniUser = new UserMinimum() + .setId(String(user.getId())) + .setEmail(user.getEmail()) + .setFirstName(user.getFirstName()) + .setLastName(user.getLastName()) + .setPhone(user.getPhone()); + + let orderBasket: BasketSnapshot | undefined = undefined; + try { + const basket = (await getBasketByUser(userId.toString()))?.toObject(); + if (basket) orderBasket = new BasketSnapshot().setString(JSON.stringify(basket)); + } catch (error) { + return res.status(500).send({ error }); + } + + const orderInput = new CreateOrderRequest() + .setUser(miniUser) + .setPaymentId(paymentId) + .setDeliveryId(deliveryId) + .setDeliveryType(deliveryType) + .setBasketSnapshot(orderBasket) + .setRestaurantId(restaurantId); + + orderService.createOrder(orderInput, (error, response) => { + if (error) return res.status(500).send({ error }); + else return res.status(200).json(response.toObject()); + }); }); -orderRoutes.get('/api/order/by-user/:userId', (req: Request, res: Response) => { - const {userId} = req.params; - const orderInput = new GetOrdersByUserRequest().setId(userId); - orderService.getOrdersByUser(orderInput, (error, response) => { - if (error) { - res.status(500).send({error: error.message}); - } else { - res.json(response.toObject()); +orderRoutes.get("/api/order/by-user/:userId", async (req: Request, res: Response) => { + /* #swagger.parameters['query'] = { + in: 'query', + required: true, + schema: { + userId: "user_id:1" } - }); -}); + } + #swagger.parameters['headers'] = { + in: 'header', + required: true, + schema: { + Authorization: "Bearer " + } + } */ -orderRoutes.post('/api/order/by-status', (req: Request, res: Response) => { - /* #swagger.parameters['body'] = { - in: 'body', - required: true, - schema: { - status :{'$ref': '#/definitions/Status'}, - } - }*/ - const orderInput = new GetOrdersByStatusRequest().setStatus(req.body.status); + // Auth check and :id check --- + const { authorization } = req.headers; + if (!authorization) return res.status(401).json({ message: "Unauthorized" }); + const token = authorization.split("Bearer ")[1]; + + const userId = req.query.userId as string; + if (!userId) return res.status(401).json({ message: "Unauthorized" }); + if (!(await check(token, { role: "ADMIN" })) || !(await check(token, { id: Number(userId) }))) + return res.status(401).send({ error: "Unauthorized" }); + // ---------------------------- - orderService.getOrdersByStatus(orderInput, (error, response) => { - if (error) { - res.status(500).send({error: error.message}); - } else { - res.json(response.toObject()); + const orderInput = new GetOrdersByUserRequest().setId(userId); + orderService.getOrdersByUser(orderInput, (error, response) => { + if (error) return res.status(500).send({ error }); + else return res.status(200).json(response.toObject()); + }); +}); + +orderRoutes.post("/api/order/by-status", withCheck({ role: "ACCOUNTANT" }), (req: Request, res: Response) => { + /* #swagger.parameters['body'] = { + in: 'body', + required: true, + schema: { + status :{'$ref': '#/definitions/Status'}, } - }); + } + #swagger.parameters['headers'] = { + in: 'header', + required: true, + schema: { + Authorization: "Bearer " + } + } */ + const orderInput = new GetOrdersByStatusRequest().setStatus(req.body.status); + + orderService.getOrdersByStatus(orderInput, (error, response) => { + if (error) return res.status(500).send({ error }); + else return res.status(200).json(response.toObject()); + }); }); -orderRoutes.get('/api/order/by-delivery/:deliveryId', (req: Request, res: Response) => { - const {deliveryId} = req.params; - const orderInput = new GetOrderByDeliveryRequest().setId(deliveryId); - orderService.getOrderByDelivery(orderInput, (error, response) => { - if (error) { - res.status(500).send({error: error.message}); - } else { - res.json(response.toObject()); +orderRoutes.get("/api/order/by-delivery/:deliveryId", async (req: Request, res: Response) => { + /* #swagger.parameters['query'] = { + in: 'query', + required: true, + schema: { + deliveryId: "delivery_id:1" } - }); + } + #swagger.parameters['headers'] = { + in: 'header', + required: true, + schema: { + Authorization: "Bearer " + } + } */ + // Auth check and :id check --- + const { authorization } = req.headers; + if (!authorization) return res.status(401).json({ message: "Unauthorized" }); + const token = authorization.split("Bearer ")[1]; + const userId = await getUserIdFromToken(token); + if (!userId) return res.status(401).json({ message: "Unauthorized" }); + // ---------------------------- + + // TODO: check for user in deliveries + + const { deliveryId } = req.query as { deliveryId: string }; + const orderInput = new GetOrderByDeliveryRequest().setId(deliveryId); + orderService.getOrderByDelivery(orderInput, (error, response) => { + if (error) return res.status(500).send({ error }); + else return res.status(200).json(response.toObject()); + }); }); -orderRoutes.get('/api/order/by-payment/:paymentId', (req: Request, res: Response) => { - const {paymentId} = req.params; - const orderInput = new GetOrderByPaymentRequest().setId(paymentId); - orderService.getOrderByPayment(orderInput, (error, response) => { - if (error) { - res.status(500).send({error: error.message}); - } else { - res.json(response.toObject()); +orderRoutes.get("/api/order/by-payment/:paymentId", async (req: Request, res: Response) => { + /* #swagger.parameters['query'] = { + in: 'query', + required: true, + schema: { + paymentId: "payment_id:1" } - }); + } + #swagger.parameters['headers'] = { + in: 'header', + required: true, + schema: { + Authorization: "Bearer " + } + } */ + // Auth check and :id check --- + const { authorization } = req.headers; + if (!authorization) return res.status(401).json({ message: "Unauthorized" }); + const token = authorization.split("Bearer ")[1]; + const userId = await getUserIdFromToken(token); + if (!userId) return res.status(401).json({ message: "Unauthorized" }); + // ---------------------------- + + // TODO: check for user in payments + + const { paymentId } = req.query as { paymentId: string }; + const orderInput = new GetOrderByPaymentRequest().setId(paymentId); + orderService.getOrderByPayment(orderInput, (error, response) => { + if (error) { + res.status(500).send({ error: error.message }); + } else { + res.json(response.toObject()); + } + }); }); -orderRoutes.put('/api/order/:orderId', (req: Request, res: Response) => { - /* #swagger.parameters['body'] = { - in: 'body', - required: true, - schema: { - status :{'$ref': '#/definitions/Status'}, - deliveryId: "delivery_id:1", - paymentId: "payment_id:1", - restaurantId :"restaurant_id:1" - } - }*/ - const {orderId} = req.params; - const {status, deliveryId, paymentId, restaurantId} = req.body; - const orderInput = new UpdateOrderRequest() - .setId(orderId) - .setStatus(status) - .setDeliveryId(deliveryId) - .setPaymentId(paymentId) - .setRestaurantId(restaurantId); - orderService.updateOrder(orderInput, (error, response) => { - if (error) { - res.status(500).send({error: error.message}); - } else { - res.json(response.toObject()); +orderRoutes.put("/api/order/:orderId", withCheck({ role: "ADMIN" }), (req: Request, res: Response) => { + /* #swagger.parameters['query'] = { + in: 'query', + required: true, + schema: { + orderId: "order_id:1" } - }); + } + #swagger.parameters['body'] = { + in: 'body', + required: true, + schema: { + status :{'$ref': '#/definitions/Status'}, + deliveryId: "delivery_id:1", + paymentId: "payment_id:1", + restaurantId :"restaurant_id:1" + } + } + #swagger.parameters['headers'] = { + in: 'header', + required: true, + schema: { + Authorization: "Bearer " + } + }*/ + const { orderId } = req.query as { orderId: string }; + const { status, deliveryId, paymentId, restaurantId } = req.body; + const orderInput = new UpdateOrderRequest() + .setId(orderId) + .setStatus(status) + .setDeliveryId(deliveryId) + .setPaymentId(paymentId) + .setRestaurantId(restaurantId); + orderService.updateOrder(orderInput, (error, response) => { + if (error) return res.status(500).send({ error }); + else return res.status(200).json(response.toObject()); + }); }); -orderRoutes.delete('/api/order/:orderId', (req: Request, res: Response) => { - const {orderId} = req.params; - const orderInput = new DeleteOrderRequest().setId(orderId); - orderService.deleteOrder(orderInput, (error, response) => { - if (error) { - res.status(500).send({error: error.message}); - } else { - res.json(response.toObject()); +orderRoutes.delete("/api/order/:orderId", withCheck({ role: "ADMIN" }), (req: Request, res: Response) => { + /* #swagger.parameters['query'] = { + in: 'query', + required: true, + schema: { + orderId: "order_id:1" } - }); -}); \ No newline at end of file + } + #swagger.parameters['headers'] = { + in: 'header', + required: true, + schema: { + Authorization: "Bearer " + } + }*/ + const { orderId } = req.query as { orderId: string }; + const orderInput = new DeleteOrderRequest().setId(orderId); + orderService.deleteOrder(orderInput, (error, response) => { + if (error) return res.status(500).send({ error }); + else return res.status(200).json(response.toObject()); + }); +}); From 372e1abec281f8ebddb3735317f8f16715c2fca1 Mon Sep 17 00:00:00 2001 From: Florian LEROUX Date: Fri, 25 Aug 2023 11:31:23 +0200 Subject: [PATCH 471/883] feat(payment): add auth checkguards in routes --- .../controller/payment/payment.controller.ts | 93 ++++++++++++++----- .../controller/payment/stripe.controller.ts | 30 +++--- 2 files changed, 88 insertions(+), 35 deletions(-) diff --git a/services/gateway/src/controller/payment/payment.controller.ts b/services/gateway/src/controller/payment/payment.controller.ts index e7b10a5c..646577fb 100644 --- a/services/gateway/src/controller/payment/payment.controller.ts +++ b/services/gateway/src/controller/payment/payment.controller.ts @@ -1,29 +1,80 @@ -import {Request, Response, Router} from "express"; -import {GetPaymentRequest, GetPaymentsByUserRequest} from "@gateway/proto/payment_pb"; -import {paymentServiceClient} from "@gateway/services/clients/payment.client"; +import { Request, Response, Router } from "express"; +import { GetPaymentRequest, GetPaymentsByUserRequest, Payment } from "@gateway/proto/payment_pb"; +import { paymentServiceClient } from "@gateway/services/clients/payment.client"; +import { getUserIdFromToken } from "@gateway/services/user.service"; +import { check } from "@gateway/middleware/auth"; export const paymentRoutes = Router(); -paymentRoutes.get('/api/payment/:id', (req: Request, res: Response) => { - const {id} = req.params; - - paymentServiceClient.getPayment(new GetPaymentRequest().setId(id), (error, response) => { - if (error) { - res.status(500).send({error: error.message}); - } else { - res.json(response.toObject()); +paymentRoutes.get("/api/payment/:id", async (req: Request, res: Response) => { + /* #swagger.parameters['id'] = { + in: 'path', + required: true, + schema: { + id: "payment_id:1" + } + } + #swagger.parameters['headers'] = { + in: 'header', + required: true, + schema: { + Authorization: "Bearer " } + } */ + + // Auth check and :id check --- + const { authorization } = req.headers; + if (!authorization) return res.status(401).json({ message: "Unauthorized" }); + const token = authorization.split("Bearer ")[1]; + const userId = await getUserIdFromToken(token); + if (!userId) return res.status(401).json({ message: "Unauthorized" }); + // ---------------------------- + const { id } = req.params; + + try { + const payment: Payment.AsObject = await new Promise((resolve, reject) => { + paymentServiceClient.getPayment(new GetPaymentRequest().setId(id), (error, response) => { + if (error) reject(error); + else resolve(response.toObject()); + }); }); -}); -paymentRoutes.get('/api/payment/by-user/:userId', (req: Request, res: Response) => { - const {id} = req.params; + if (payment.userId !== userId.toString() || (await check(token, { role: "ADMIN" }))) + return res.status(401).json({ message: "Unauthorized" }); + } catch (error) { + return res.status(500).send({ error }); + } +}); - paymentServiceClient.getPaymentsByUser(new GetPaymentsByUserRequest().setId(id), (error, response) => { - if (error) { - res.status(500).send({error: error.message}); - } else { - res.json(response.toObject()); +paymentRoutes.get("/api/payment/by-user/:userId", async (req: Request, res: Response) => { + /* #swagger.parameters['userId'] = { + in: 'path', + required: true, + schema: { + userId: "user_id:1" } - }); -}); \ No newline at end of file + } + #swagger.parameters['headers'] = { + in: 'header', + required: true, + schema: { + Authorization: "Bearer " + } + } */ + + // Auth check and :id check --- + const { authorization } = req.headers; + if (!authorization) return res.status(401).json({ message: "Unauthorized" }); + const token = authorization.split("Bearer ")[1]; + const userId = await getUserIdFromToken(token); + if (!userId) return res.status(401).json({ message: "Unauthorized" }); + // ---------------------------- + const { id } = req.params; + if (!(await check(token, { role: "ADMIN" })) || !(await check(token, { id: Number(id) }))) + return res.status(401).json({ message: "Unauthorized" }); + + paymentServiceClient.getPaymentsByUser(new GetPaymentsByUserRequest().setId(id), (error, response) => { + if (error) return res.status(500).send({ error }); + else return res.status(200).json(response.toObject()); + }); +}); diff --git a/services/gateway/src/controller/payment/stripe.controller.ts b/services/gateway/src/controller/payment/stripe.controller.ts index 67760b45..3ff909e9 100644 --- a/services/gateway/src/controller/payment/stripe.controller.ts +++ b/services/gateway/src/controller/payment/stripe.controller.ts @@ -1,11 +1,12 @@ -import {Request, Response, Router} from "express"; -import {CreateCheckoutSessionRequest} from "@gateway/proto/payment_pb"; -import {stripeServiceClient} from "@gateway/services/clients/payment.client"; +import { Request, Response, Router } from "express"; +import { CreateCheckoutSessionRequest } from "@gateway/proto/payment_pb"; +import { stripeServiceClient } from "@gateway/services/clients/payment.client"; export const stripeRoutes = Router(); -stripeRoutes.post('/api/payment/stripe', (req: Request, res: Response) => { - /* #swagger.parameters['body'] = { +// TODO: check if user can modify this payment request +stripeRoutes.post("/api/payment/stripe", (req: Request, res: Response) => { + /* #swagger.parameters['body'] = { in: 'body', required: true, schema: { @@ -15,13 +16,14 @@ stripeRoutes.post('/api/payment/stripe', (req: Request, res: Response) => { total: 12 } } */ - const {userId, name, email, total} = req.body; - const createCheckoutSessionRequest = new CreateCheckoutSessionRequest().setUserId(userId).setName(name).setEmail(email).setTotal(total); - stripeServiceClient.createCheckoutSession(createCheckoutSessionRequest, (error, response) => { - if (error) { - res.status(500).send({error: error.message}); - } else { - res.json(response.toObject()); - } - }); + const { userId, name, email, total } = req.body; + const createCheckoutSessionRequest = new CreateCheckoutSessionRequest() + .setUserId(userId) + .setName(name) + .setEmail(email) + .setTotal(total); + stripeServiceClient.createCheckoutSession(createCheckoutSessionRequest, (error, response) => { + if (error) return res.status(500).send({ error }); + else return res.status(200).json(response.toObject()); + }); }); From 5872362c873260ac74fcfb6e5987977c8f1edf7e Mon Sep 17 00:00:00 2001 From: Florian LEROUX Date: Fri, 25 Aug 2023 11:31:53 +0200 Subject: [PATCH 472/883] fix(controller): revert -> change req.params to req.query --- .../delivery/delivery.controller.ts | 56 ++++++++++++---- .../delivery/deliveryPerson.controller.ts | 22 ++++--- .../src/controller/log/log.controller.ts | 8 +-- .../controller/metric/metric.controller.ts | 65 ++++++++++--------- .../src/controller/order/order.controller.ts | 41 ++++++------ 5 files changed, 115 insertions(+), 77 deletions(-) diff --git a/services/gateway/src/controller/delivery/delivery.controller.ts b/services/gateway/src/controller/delivery/delivery.controller.ts index 7d46fd82..38fcfe01 100644 --- a/services/gateway/src/controller/delivery/delivery.controller.ts +++ b/services/gateway/src/controller/delivery/delivery.controller.ts @@ -7,7 +7,14 @@ import { check, withCheck } from "@gateway/middleware/auth"; export const deliveryRoutes = Router(); deliveryRoutes.get("/api/delivery/:id", async (req: Request, res: Response) => { - /* #swagger.parameters['headers'] = { + /* #swagger.parameters['id'] = { + in: 'path', + required: true, + schema: { + id: "delivery_id:1" + } + } + #swagger.parameters['headers'] = { in: 'header', required: true, schema: { @@ -44,7 +51,14 @@ deliveryRoutes.get( "/api/delivery/by-restaurant/:id", withCheck({ role: "ACCOUNTANT" }), (req: Request, res: Response) => { - /* #swagger.parameters['headers'] = { + /* #swagger.parameters['id'] = { + in: 'path', + required: true, + schema: { + id: "restaurant_id:1" + } + } + #swagger.parameters['headers'] = { in: 'header', required: true, schema: { @@ -133,16 +147,16 @@ deliveryRoutes.post("/api/delivery", async (req: Request, res: Response) => { deliveryRoutes.put("/api/delivery/:id", async (req: Request, res: Response) => { /* #swagger.parameters['body'] = { - in: 'body', - required: true, - schema: { - eta: "2022-01-01T00:00:00.000Z", - address: "10 Rue de la République, 75003 Paris, France", - status: {'$ref': '#/definitions/Status'}, - deliveryPersonId: "cllcdmeci0000pm01su98mxtb", - userId: "user_id:1", - restaurantId: "restaurant_id:1" - } + in: 'body', + required: true, + schema: { + eta: "2022-01-01T00:00:00.000Z", + address: "10 Rue de la République, 75003 Paris, France", + status: {'$ref': '#/definitions/Status'}, + deliveryPersonId: "cllcdmeci0000pm01su98mxtb", + userId: "user_id:1", + restaurantId: "restaurant_id:1" + } } #swagger.parameters['headers'] = { in: 'header', @@ -151,6 +165,13 @@ deliveryRoutes.put("/api/delivery/:id", async (req: Request, res: Response) => { Authorization: "Bearer " } } + #swagger.parameters['id'] = { + in: 'path', + required: true, + schema: { + id: "delivery_id:1" + } + } */ // Auth check and :id check --- const { authorization } = req.headers; @@ -181,13 +202,20 @@ deliveryRoutes.put("/api/delivery/:id", async (req: Request, res: Response) => { }); deliveryRoutes.delete("/api/delivery/:id", async (req: Request, res: Response) => { - /*#swagger.parameters['headers'] = { + /* #swagger.parameters['id'] = { + in: 'path', + required: true, + schema: { + id: "delivery_id:1" + } + } + #swagger.parameters['headers'] = { in: 'header', required: true, schema: { Authorization: "Bearer " } - } */ + } */ // Auth check and :id check --- const { authorization } = req.headers; if (!authorization) return res.status(401).json({ message: "Unauthorized" }); diff --git a/services/gateway/src/controller/delivery/deliveryPerson.controller.ts b/services/gateway/src/controller/delivery/deliveryPerson.controller.ts index 476c1f3c..cda62d8d 100644 --- a/services/gateway/src/controller/delivery/deliveryPerson.controller.ts +++ b/services/gateway/src/controller/delivery/deliveryPerson.controller.ts @@ -8,14 +8,20 @@ import { withCheck } from "@gateway/middleware/auth"; export const deliveryPersonRoutes = Router(); deliveryPersonRoutes.get("/api/delivery-person/:id", async (req, res) => { - /* - #swagger.parameters['headers'] = { + /* #swagger.parameters['id'] = { + in: 'path', + required: true, + schema: { + id: "delivery_person_id:1" + } + } + #swagger.parameters['headers'] = { in: 'header', required: true, schema: { Authorization: "Bearer " } - } */ + } */ // Auth check and :id check --- const { authorization } = req.headers; @@ -28,7 +34,7 @@ deliveryPersonRoutes.get("/api/delivery-person/:id", async (req, res) => { const { id } = req.params; deliveryPersonServiceClient.getDeliveryPerson(new DeliveryPersonId().setId(id), (error, response) => { - if (error) return res.status(500).send({ error: error }); + if (error) return res.status(500).send({ error }); else return res.status(200).json(response.toObject()); }); }); @@ -114,8 +120,8 @@ deliveryPersonRoutes.post("/api/delivery-person", withCheck({ role: "ADMIN" }), }); deliveryPersonRoutes.put("/api/delivery-person/:id", withCheck({ role: "ADMIN" }), (req, res) => { - /* #swagger.parameters['query'] = { - in: 'query', + /* #swagger.parameters['id'] = { + in: 'path', required: true, schema: { id: "delivery_person_id:1" @@ -154,8 +160,8 @@ deliveryPersonRoutes.put("/api/delivery-person/:id", withCheck({ role: "ADMIN" } }); deliveryPersonRoutes.delete("/api/delivery-person/:id", withCheck({ role: "ADMIN" }), (req, res) => { - /* #swagger.parameters['query'] = { - in: 'query', + /* #swagger.parameters['id'] = { + in: 'path', required: true, schema: { id: "delivery_person_id:1" diff --git a/services/gateway/src/controller/log/log.controller.ts b/services/gateway/src/controller/log/log.controller.ts index 93169020..3f1f623d 100644 --- a/services/gateway/src/controller/log/log.controller.ts +++ b/services/gateway/src/controller/log/log.controller.ts @@ -21,11 +21,11 @@ logRoutes.get("/api/log", withCheck({ role: "ADMIN" }), (_: Request, res: Respon }); logRoutes.get("/api/log/:id", withCheck({ role: "ADMIN" }), (req: Request, res: Response) => { - /* #swagger.parameters['query'] = { - in: 'query', + /* #swagger.parameters['id'] = { + in: 'path', required: true, schema: { - id: "delivery_person_id:1" + id: "log_id:1" } } #swagger.parameters['headers'] = { @@ -35,7 +35,7 @@ logRoutes.get("/api/log/:id", withCheck({ role: "ADMIN" }), (req: Request, res: Authorization: "Bearer " } } */ - const { id } = req.query as { id: string }; + const { id } = req.params; logServiceClient.getLog(new GetLogRequest().setId(Number(id)), (error, response) => { if (error) return res.status(500).send({ error: error.message }); diff --git a/services/gateway/src/controller/metric/metric.controller.ts b/services/gateway/src/controller/metric/metric.controller.ts index 2596476f..646b3a98 100644 --- a/services/gateway/src/controller/metric/metric.controller.ts +++ b/services/gateway/src/controller/metric/metric.controller.ts @@ -20,8 +20,8 @@ import { withCheck } from "@gateway/middleware/auth"; export const metricRoutes = Router(); metricRoutes.get("/api/metric/:key", withCheck({ role: "ACCOUNTANT" }), (req, res) => { - /* #swagger.parameters['query'] = { - in: 'query', + /* #swagger.parameters['key'] = { + in: 'path', required: true, schema: { key: "key_example" @@ -69,8 +69,8 @@ metricRoutes.post("/api/metric/by-restaurant-and-date", withCheck({ role: "ACCOU }); metricRoutes.get("/api/metric/by-restaurant/:restaurantId", withCheck({ role: "ACCOUNTANT" }), (req, res) => { - /* #swagger.parameters['query'] = { - in: 'query', + /* #swagger.parameters['restaurantId'] = { + in: 'path', required: true, schema: { restaurantId: "restaurant_id:1" @@ -95,8 +95,8 @@ metricRoutes.get( "/api/metric/by-restaurant-group/:restaurantGroupId", withCheck({ role: "ACCOUNTANT" }), (req, res) => { - /* #swagger.parameters['query'] = { - in: 'query', + /* #swagger.parameters['restaurantGroupId'] = { + in: 'path', required: true, schema: { restaurantGroupId: "restaurant_group_id:1" @@ -120,19 +120,29 @@ metricRoutes.get( }, ); -metricRoutes.get("/api/metric/restaurant/:restaurantId", (req, res) => { - const { restaurantId } = req.params; - const getRestaurantRequest = new GetRestaurantRequest().setId(restaurantId); - metricService.getRestaurant(getRestaurantRequest, (error, response) => { - if (error) { - res.status(500).send({ error: error.message }); - } else { - res.json(response.toObject()); +metricRoutes.get("/api/metric/restaurant/:restaurantId", withCheck({ role: "ACCOUNTANT" }), (req, res) => { + /* #swagger.parameters['restaurantId'] = { + in: 'path', + required: true, + schema: { + restaurantId: "restaurant_id:1" + } } + #swagger.parameters['headers'] = { + in: 'header', + required: true, + schema: { + Authorization: "Bearer " + } + } */ + const { restaurantId } = req.params; + metricService.getRestaurant(new GetRestaurantRequest().setId(restaurantId), (error, response) => { + if (error) return res.status(500).send({ error }); + else return res.status(200).json(response.toObject()); }); }); -metricRoutes.get("/api/metric/restaurant-group/:restaurantGroupId", (req, res) => { +metricRoutes.get("/api/metric/restaurant-group/:restaurantGroupId", withCheck({ role: "ACCOUNTANT" }), (req, res) => { /* #swagger.parameters['restaurantGroupId'] = { in: 'path', required: true, @@ -141,11 +151,8 @@ metricRoutes.get("/api/metric/restaurant-group/:restaurantGroupId", (req, res) = const { restaurantGroupId } = req.params; const getRestaurantGroupRequest = new GetRestaurantGroupRequest().setId(Number(restaurantGroupId)); metricService.getRestaurantGroup(getRestaurantGroupRequest, (error, response) => { - if (error) { - res.status(500).send({ error: error.message }); - } else { - res.json(response.toObject()); - } + if (error) return res.status(500).send({ error }); + else return res.status(200).json(response.toObject()); }); }); @@ -206,8 +213,8 @@ metricRoutes.post("/api/metric/restaurant-group", withCheck({ role: "ACCOUNTANT" metricRoutes.put("/api/metric/restaurant/:restaurantId", withCheck({ role: "ACCOUNTANT" }), (req, res) => { /* - #swagger.parameters['query'] = { - in: 'query', + #swagger.parameters['restaurantId'] = { + in: 'path', required: true, schema: { restaurantId: "restaurant_id:1" @@ -230,7 +237,7 @@ metricRoutes.put("/api/metric/restaurant/:restaurantId", withCheck({ role: "ACCO Authorization: "Bearer " } } */ - const { restaurantId } = req.query as { restaurantId: string }; + const { restaurantId } = req.params; const { name, key, address, groupId } = req.body; const updateRestaurantRequest = new UpdateRestaurantRequest() .setId(restaurantId) @@ -273,8 +280,8 @@ metricRoutes.put("/api/metric/restaurant-group/:restaurantGroupId", withCheck({ }); metricRoutes.delete("/api/metric/restaurant/:restaurantId", withCheck({ role: "ACCOUNTANT" }), (req, res) => { - /* #swagger.parameters['query'] = { - in: 'query', + /* #swagger.parameters['restaurantId'] = { + in: 'path', required: true, schema: { restaurantId: "restaurant_id:1" @@ -287,7 +294,7 @@ metricRoutes.delete("/api/metric/restaurant/:restaurantId", withCheck({ role: "A Authorization: "Bearer " } } */ - const { restaurantId } = req.query as { restaurantId: string }; + const { restaurantId } = req.params; const deleteRestaurantRequest = new DeleteRestaurantRequest().setId(restaurantId); metricService.deleteRestaurant(deleteRestaurantRequest, (error, response) => { @@ -297,8 +304,8 @@ metricRoutes.delete("/api/metric/restaurant/:restaurantId", withCheck({ role: "A }); metricRoutes.delete("/api/metric/restaurant-group/:restaurantGroupId", (req, res) => { - /* #swagger.parameters['query'] = { - in: 'query', + /* #swagger.parameters['restaurantGroupId'] = { + in: 'path', required: true, schema: { restaurantGroupId: "restaurant_group_id:1" @@ -311,7 +318,7 @@ metricRoutes.delete("/api/metric/restaurant-group/:restaurantGroupId", (req, res Authorization: "Bearer " } } */ - const { restaurantGroupId } = req.query as { restaurantGroupId: string }; + const { restaurantGroupId } = req.params; const deleteRestaurantGroupRequest = new DeleteRestaurantGroupRequest().setId(Number(restaurantGroupId)); metricService.deleteRestaurantGroup(deleteRestaurantGroupRequest, (error, response) => { diff --git a/services/gateway/src/controller/order/order.controller.ts b/services/gateway/src/controller/order/order.controller.ts index b22efce9..7168b902 100644 --- a/services/gateway/src/controller/order/order.controller.ts +++ b/services/gateway/src/controller/order/order.controller.ts @@ -21,8 +21,8 @@ import { check, withCheck } from "@gateway/middleware/auth"; export const orderRoutes = Router(); orderRoutes.get("/api/order/:id", async (req: Request, res: Response) => { - /* #swagger.parameters['query'] = { - in: 'query', + /* #swagger.parameters['id'] = { + in: 'path', required: true, schema: { id: "order_id:1" @@ -44,7 +44,7 @@ orderRoutes.get("/api/order/:id", async (req: Request, res: Response) => { if (!userId) return res.status(401).json({ message: "Unauthorized" }); // ---------------------------- - const { id } = req.query as { id: string }; + const { id } = req.params; const orderId = new GetOrderRequest(); orderId.setId(id); @@ -134,8 +134,8 @@ orderRoutes.post("/api/order", async (req: Request, res: Response) => { }); orderRoutes.get("/api/order/by-user/:userId", async (req: Request, res: Response) => { - /* #swagger.parameters['query'] = { - in: 'query', + /* #swagger.parameters['userId'] = { + in: 'path', required: true, schema: { userId: "user_id:1" @@ -154,7 +154,7 @@ orderRoutes.get("/api/order/by-user/:userId", async (req: Request, res: Response if (!authorization) return res.status(401).json({ message: "Unauthorized" }); const token = authorization.split("Bearer ")[1]; - const userId = req.query.userId as string; + const { userId } = req.params; if (!userId) return res.status(401).json({ message: "Unauthorized" }); if (!(await check(token, { role: "ADMIN" })) || !(await check(token, { id: Number(userId) }))) return res.status(401).send({ error: "Unauthorized" }); @@ -191,8 +191,8 @@ orderRoutes.post("/api/order/by-status", withCheck({ role: "ACCOUNTANT" }), (req }); orderRoutes.get("/api/order/by-delivery/:deliveryId", async (req: Request, res: Response) => { - /* #swagger.parameters['query'] = { - in: 'query', + /* #swagger.parameters['deliveryId'] = { + in: 'path', required: true, schema: { deliveryId: "delivery_id:1" @@ -224,8 +224,8 @@ orderRoutes.get("/api/order/by-delivery/:deliveryId", async (req: Request, res: }); orderRoutes.get("/api/order/by-payment/:paymentId", async (req: Request, res: Response) => { - /* #swagger.parameters['query'] = { - in: 'query', + /* #swagger.parameters['paymentId'] = { + in: 'path', required: true, schema: { paymentId: "payment_id:1" @@ -248,20 +248,17 @@ orderRoutes.get("/api/order/by-payment/:paymentId", async (req: Request, res: Re // TODO: check for user in payments - const { paymentId } = req.query as { paymentId: string }; + const { paymentId } = req.params; const orderInput = new GetOrderByPaymentRequest().setId(paymentId); orderService.getOrderByPayment(orderInput, (error, response) => { - if (error) { - res.status(500).send({ error: error.message }); - } else { - res.json(response.toObject()); - } + if (error) return res.status(500).send({ error }); + else return res.status(200).json(response.toObject()); }); }); orderRoutes.put("/api/order/:orderId", withCheck({ role: "ADMIN" }), (req: Request, res: Response) => { - /* #swagger.parameters['query'] = { - in: 'query', + /* #swagger.parameters['orderId'] = { + in: 'path', required: true, schema: { orderId: "order_id:1" @@ -284,7 +281,7 @@ orderRoutes.put("/api/order/:orderId", withCheck({ role: "ADMIN" }), (req: Reque Authorization: "Bearer " } }*/ - const { orderId } = req.query as { orderId: string }; + const { orderId } = req.params; const { status, deliveryId, paymentId, restaurantId } = req.body; const orderInput = new UpdateOrderRequest() .setId(orderId) @@ -299,8 +296,8 @@ orderRoutes.put("/api/order/:orderId", withCheck({ role: "ADMIN" }), (req: Reque }); orderRoutes.delete("/api/order/:orderId", withCheck({ role: "ADMIN" }), (req: Request, res: Response) => { - /* #swagger.parameters['query'] = { - in: 'query', + /* #swagger.parameters['orderId'] = { + in: 'path', required: true, schema: { orderId: "order_id:1" @@ -313,7 +310,7 @@ orderRoutes.delete("/api/order/:orderId", withCheck({ role: "ADMIN" }), (req: Re Authorization: "Bearer " } }*/ - const { orderId } = req.query as { orderId: string }; + const { orderId } = req.params; const orderInput = new DeleteOrderRequest().setId(orderId); orderService.deleteOrder(orderInput, (error, response) => { if (error) return res.status(500).send({ error }); From 1ee10d484ec9559524cb188b95c2742be9ff6620 Mon Sep 17 00:00:00 2001 From: Florian LEROUX Date: Fri, 25 Aug 2023 12:15:04 +0200 Subject: [PATCH 473/883] feat(product): add auth checkguards in routes --- .../controller/product/allergen.controller.ts | 161 +++++---- .../controller/product/category.controller.ts | 136 +++++--- .../controller/product/product.controller.ts | 323 ++++++++++-------- 3 files changed, 363 insertions(+), 257 deletions(-) diff --git a/services/gateway/src/controller/product/allergen.controller.ts b/services/gateway/src/controller/product/allergen.controller.ts index 1ba77335..7a7d6064 100644 --- a/services/gateway/src/controller/product/allergen.controller.ts +++ b/services/gateway/src/controller/product/allergen.controller.ts @@ -1,79 +1,112 @@ -import {Request, Response, Router} from 'express'; -import {allergenServiceClient} from '../../services/clients/product.client'; -import {Empty} from "google-protobuf/google/protobuf/empty_pb"; -import {Allergen, AllergenId} from "@gateway/proto/product_pb"; +import { Request, Response, Router } from "express"; +import { allergenServiceClient } from "../../services/clients/product.client"; +import { Empty } from "google-protobuf/google/protobuf/empty_pb"; +import { Allergen, AllergenId } from "@gateway/proto/product_pb"; +import { withCheck } from "@gateway/middleware/auth"; export const allergenRoutes = Router(); -allergenRoutes.get('/api/allergen', (req: Request, res: Response) => { - allergenServiceClient.getAllergenList(new Empty(), (error, response) => { - if (error) { - res.status(500).send({error: error.message}); - } else { - res.json(response.toObject()); - } - }); +// TODO: check if route should be accessible +allergenRoutes.get("/api/allergen", (_: Request, res: Response) => { + allergenServiceClient.getAllergenList(new Empty(), (error, response) => { + if (error) return res.status(500).send({ error }); + else return res.status(200).json(response.toObject()); + }); }); -allergenRoutes.get('/api/allergen/:id', (req: Request, res: Response) => { - const {id} = req.params; - const allergenId = new AllergenId().setId(id) - - allergenServiceClient.readAllergen(allergenId, (error, response) => { - if (error) { - res.status(500).send({error: error.message}); - } else { - res.json(response.toObject()); +// TODO: check if route should be accessible +allergenRoutes.get("/api/allergen/:id", (req: Request, res: Response) => { + /* #swagger.parameters['id'] = { + in: 'path', + required: true, + schema: { + id: "allergen_id:1" } - }); + } + */ + const { id } = req.params; + + allergenServiceClient.readAllergen(new AllergenId().setId(id), (error, response) => { + if (error) return res.status(500).send({ error }); + else return res.status(200).json(response.toObject()); + }); }); -allergenRoutes.post('/api/allergen', (req: Request, res: Response) => { - /* #swagger.parameters['body'] = { - in: 'body', - required: true, - schema: { - label: "allergen-label", - } - } */ - const {label} = req.body; - const allergen = new Allergen().setLibelle(label); - allergenServiceClient.createAllergen(allergen, (error, response) => { - if (error) { - res.status(500).send({error: error.message}); - } else { - res.json(response.toObject()); +allergenRoutes.post("/api/allergen", withCheck({ role: "ACCOUNTANT" }), (req: Request, res: Response) => { + /* #swagger.parameters['body'] = { + in: 'body', + required: true, + schema: { + label: "allergen-label", + } + } + #swagger.parameters['headers'] = { + in: 'header', + required: true, + schema: { + Authorization: "Bearer " } - }); + } + */ + const { label } = req.body; + const allergen = new Allergen().setLibelle(label); + allergenServiceClient.createAllergen(allergen, (error, response) => { + if (error) return res.status(500).send({ error }); + else return res.status(201).json(response.toObject()); + }); }); -allergenRoutes.put('/api/allergen/:id', (req: Request, res: Response) => { - /* #swagger.parameters['body'] = { - in: 'body', - required: true, - schema: { - label: "allergen-label", - } - } */ - const {id} = req.params; - const {label} = req.body; - const allergen = new Allergen().setId(id).setLibelle(label); - allergenServiceClient.updateAllergen(allergen, (error, response) => { - if (error) { - res.status(500).send({error: error.message}); - } else { - res.json(response.toObject()); +allergenRoutes.put("/api/allergen/:id", withCheck({ role: "ACCOUNTANT" }), (req: Request, res: Response) => { + /* #swagger.parameters['id'] = { + in: 'path', + required: true, + schema: { + id: "allergen_id:1" } - }); + } + #swagger.parameters['body'] = { + in: 'body', + required: true, + schema: { + label: "allergen-label", + } + } + #swagger.parameters['headers'] = { + in: 'header', + required: true, + schema: { + Authorization: "Bearer " + } + } + */ + const { id } = req.params; + const { label } = req.body; + const allergen = new Allergen().setId(id).setLibelle(label); + allergenServiceClient.updateAllergen(allergen, (error, response) => { + if (error) return res.status(500).send({ error }); + else return res.status(200).json(response.toObject()); + }); }); -allergenRoutes.delete('/api/allergen/:id', (req: Request, res: Response) => { - const {id} = req.params; - allergenServiceClient.deleteAllergen(new AllergenId().setId(id), (error, response) => { - if (error) { - res.status(500).send({error: error.message}); - } else { - res.json(response.toObject()); +allergenRoutes.delete("/api/allergen/:id", withCheck({ role: "ACCOUNTANT" }), (req: Request, res: Response) => { + /* #swagger.parameters['id'] = { + in: 'path', + required: true, + schema: { + id: "allergen_id:1" } - }); -}); \ No newline at end of file + } + #swagger.parameters['headers'] = { + in: 'header', + required: true, + schema: { + Authorization: "Bearer " + } + } + */ + const { id } = req.params; + allergenServiceClient.deleteAllergen(new AllergenId().setId(id), (error, response) => { + if (error) return res.status(500).send({ error }); + else return res.status(200).json(response.toObject()); + }); +}); diff --git a/services/gateway/src/controller/product/category.controller.ts b/services/gateway/src/controller/product/category.controller.ts index 2d01a70d..68dab4dd 100644 --- a/services/gateway/src/controller/product/category.controller.ts +++ b/services/gateway/src/controller/product/category.controller.ts @@ -1,35 +1,36 @@ -import {Request, Response, Router} from 'express'; -import {categoryServiceClient} from '../../services/clients/product.client'; -import {Empty} from "google-protobuf/google/protobuf/empty_pb"; -import {Category, CategoryId} from "@gateway/proto/product_pb"; +import { Request, Response, Router } from "express"; +import { categoryServiceClient } from "../../services/clients/product.client"; +import { Empty } from "google-protobuf/google/protobuf/empty_pb"; +import { Category, CategoryId } from "@gateway/proto/product_pb"; +import { withCheck } from "@gateway/middleware/auth"; export const categoryRoutes = Router(); -categoryRoutes.get('/api/category', (req: Request, res: Response) => { - categoryServiceClient.getCategoryList(new Empty(), (error, response) => { - if (error) { - res.status(500).send({error: error.message}); - } else { - res.json(response.toObject()); - } - }); +categoryRoutes.get("/api/category", (_: Request, res: Response) => { + categoryServiceClient.getCategoryList(new Empty(), (error, response) => { + if (error) return res.status(500).send({ error }); + else return res.status(200).json(response.toObject()); + }); }); -categoryRoutes.get('/api/category/:id', (req: Request, res: Response) => { - const {id} = req.params; - const categoryId = new CategoryId().setId(id) - - categoryServiceClient.readCategory(categoryId, (error, response) => { - if (error) { - res.status(500).send({error: error.message}); - } else { - res.json(response.toObject()); +categoryRoutes.get("/api/category/:id", (req: Request, res: Response) => { + /* #swagger.parameters['id'] = { + in: 'path', + required: true, + schema: { + id: "category_id:1" } - }); + } */ + const { id } = req.params; + + categoryServiceClient.readCategory(new CategoryId().setId(id), (error, response) => { + if (error) return res.status(500).send({ error }); + else return res.status(200).json(response.toObject()); + }); }); -categoryRoutes.post('/api/category', (req: Request, res: Response) => { - /* #swagger.parameters['body'] = { +categoryRoutes.post("/api/category", withCheck({ role: "ACCOUNTANT" }), (req: Request, res: Response) => { + /* #swagger.parameters['body'] = { in: 'body', required: true, schema: { @@ -37,20 +38,31 @@ categoryRoutes.post('/api/category', (req: Request, res: Response) => { icon: "category-icon", hexaColor: "#ffffff", } - } */ - const {label, icon, hexaColor} = req.body; - const category = new Category().setLibelle(label).setIcon(icon).setHexaColor(hexaColor) - categoryServiceClient.createCategory(category, (error, response) => { - if (error) { - res.status(500).send({error: error.message}); - } else { - res.json(response.toObject()); + } + #swagger.parameters['headers'] = { + in: 'header', + required: true, + schema: { + Authorization: "Bearer " } - }); + } */ + const { label, icon, hexaColor } = req.body; + const category = new Category().setLibelle(label).setIcon(icon).setHexaColor(hexaColor); + categoryServiceClient.createCategory(category, (error, response) => { + if (error) return res.status(500).send({ error }); + else return res.status(201).json(response.toObject()); + }); }); -categoryRoutes.put('/api/category/:id', (req: Request, res: Response) => { - /* #swagger.parameters['body'] = { +categoryRoutes.put("/api/category/:id", withCheck({ role: "ACCOUNTANT" }), (req: Request, res: Response) => { + /* #swagger.parameters['id'] = { + in: 'path', + required: true, + schema: { + id: "category_id:1" + } + } + #swagger.parameters['body'] = { in: 'body', required: true, schema: { @@ -58,26 +70,42 @@ categoryRoutes.put('/api/category/:id', (req: Request, res: Response) => { icon: "category-icon", hexaColor: "#ffffff", } - } */ - const {id} = req.params; - const {label, icon, hexaColor} = req.body; - const category = new Category().setId(id).setLibelle(label).setIcon(icon).setHexaColor(hexaColor) - categoryServiceClient.updateCategory(category, (error, response) => { - if (error) { - res.status(500).send({error: error.message}); - } else { - res.json(response.toObject()); + } + #swagger.parameters['headers'] = { + in: 'header', + required: true, + schema: { + Authorization: "Bearer " } - }); + } */ + const { id } = req.params; + const { label, icon, hexaColor } = req.body; + const category = new Category().setId(id).setLibelle(label).setIcon(icon).setHexaColor(hexaColor); + categoryServiceClient.updateCategory(category, (error, response) => { + if (error) return res.status(500).send({ error }); + else return res.status(200).json(response.toObject()); + }); }); -categoryRoutes.delete('/api/category/:id', (req: Request, res: Response) => { - const {id} = req.params; - categoryServiceClient.deleteCategory(new CategoryId().setId(id), (error, response) => { - if (error) { - res.status(500).send({error: error.message}); - } else { - res.json(response.toObject()); +categoryRoutes.delete("/api/category/:id", withCheck({ role: "ACCOUNTANT" }), (req: Request, res: Response) => { + /* #swagger.parameters['id'] = { + in: 'path', + required: true, + schema: { + id: "category_id:1" + } + } + + #swagger.parameters['headers'] = { + in: 'header', + required: true, + schema: { + Authorization: "Bearer " } - }); -}); \ No newline at end of file + } */ + const { id } = req.params; + categoryServiceClient.deleteCategory(new CategoryId().setId(id), (error, response) => { + if (error) return res.status(500).send({ error }); + else return res.status(200).json(response.toObject()); + }); +}); diff --git a/services/gateway/src/controller/product/product.controller.ts b/services/gateway/src/controller/product/product.controller.ts index e66c6bc3..f2413144 100644 --- a/services/gateway/src/controller/product/product.controller.ts +++ b/services/gateway/src/controller/product/product.controller.ts @@ -1,61 +1,75 @@ -import {Request, Response, Router} from 'express'; -import {productServiceClient} from '../../services/clients/product.client'; -import {Allergen, Category, File, Product, ProductId, RestaurantId} from '../../proto/product_pb'; -import {Empty} from "google-protobuf/google/protobuf/empty_pb"; +import { Request, Response, Router } from "express"; +import { productServiceClient } from "../../services/clients/product.client"; +import { Allergen, Category, File, Product, ProductId, RestaurantId } from "../../proto/product_pb"; +import { Empty } from "google-protobuf/google/protobuf/empty_pb"; import * as fs from "fs"; +import { withCheck } from "@gateway/middleware/auth"; export const productRoutes = Router(); -productRoutes.get('/api/product/by-restaurant/:id', (req: Request, res: Response) => { - const {id} = req.params; - const restaurantId = new RestaurantId().setId(id) - - productServiceClient.getProductList(restaurantId, (error, response) => { - if (error) { - res.status(500).send({error: error.message}); - } else { - res.json(response.toObject()); +productRoutes.get("/api/product/by-restaurant/:id", (req: Request, res: Response) => { + /* #swagger.parameters['id'] = { + in: 'path', + required: true, + schema: { + id: "restaurant_id:1" } - }); -}); + } */ + const { id } = req.params; -productRoutes.get('/api/product/:id', (req: Request, res: Response) => { - const {id} = req.params; - const productId = new ProductId().setId(id) + productServiceClient.getProductList(new RestaurantId().setId(id), (error, response) => { + if (error) return res.status(500).send({ error }); + else return res.status(200).json(response.toObject()); + }); +}); - productServiceClient.readProduct(productId, (error, response) => { - if (error) { - res.status(500).send({error: error.message}); - } else { - res.json(response.toObject()); +productRoutes.get("/api/product/:id", (req: Request, res: Response) => { + /* #swagger.parameters['id'] = { + in: 'path', + required: true, + schema: { + id: "product_id:1" } - }); + } */ + const { id } = req.params; + productServiceClient.readProduct(new ProductId().setId(id), (error, response) => { + if (error) return res.status(500).send({ error }); + else return res.status(200).json(response.toObject()); + }); }); -productRoutes.get('/api/product/type', (req: Request, res: Response) => { - productServiceClient.getProductTypeList(new Empty(), (error, response) => { - if (error) { - res.status(500).send({error: error.message}); - } else { - res.json(response.toObject()); - } - }); +productRoutes.get("/api/product/type", (_: Request, res: Response) => { + productServiceClient.getProductTypeList(new Empty(), (error, response) => { + if (error) return res.status(500).send({ error }); + else return res.status(200).json(response.toObject()); + }); }); -productRoutes.delete('/api/product/:id', (req: Request, res: Response) => { - const {id} = req.params; - const productId = new ProductId().setId(id) - productServiceClient.deleteProduct(productId, (error, response) => { - if (error) { - res.status(500).send({error: error.message}); - } else { - res.json(response.toObject()); +productRoutes.delete("/api/product/:id", withCheck({ role: "ACCOUNTANT" }), (req: Request, res: Response) => { + /* #swagger.parameters['id'] = { + in: 'path', + required: true, + schema: { + id: "product_id:1" } - }); + } + #swagger.parameters['headers'] = { + in: 'header', + required: true, + schema: { + Authorization: "Bearer " + } + } */ + const { id } = req.params; + const productId = new ProductId().setId(id); + productServiceClient.deleteProduct(productId, (error, response) => { + if (error) return res.status(500).send({ error }); + else return res.status(200).json(response.toObject()); + }); }); -productRoutes.post('/api/product', (req: Request, res: Response) => { - /* #swagger.parameters['body'] = { +productRoutes.post("/api/product", withCheck({ role: "ACCOUNTANT" }), (req: Request, res: Response) => { + /* #swagger.parameters['body'] = { in: 'body', required: true, schema: { @@ -81,51 +95,64 @@ productRoutes.post('/api/product', (req: Request, res: Response) => { } ], } - } */ - const { - restaurantId, - type, - name, - image, - comment, - price, - preparation, - weight, - kilocalories, - nutriscore, - categories, - allergens - } = req.body; - - const allergensList = allergens.map((allergen: any) => new Allergen().setLibelle(allergen.label)); - const categoryList = categories.map((category: any) => new Category() - .setLibelle(category.label) - .setHexaColor(category.hexaColor) - .setIcon(category.icon)); - - const productId = new Product().setRestaurantId(Number(restaurantId)).setType(type) - .setName(name) - .setImage(image) - .setComment(comment) - .setPrice(price) - .setPreparation(preparation) - .setWeight(weight) - .setKilocalories(kilocalories) - .setNutriscore(nutriscore) - .setCategoriesList(categoryList) - .setAllergensList(allergensList); - - productServiceClient.createProduct(productId, (error, response) => { - if (error) { - res.status(500).send({error: error.message}); - } else { - res.json(response.toObject()); + } + #swagger.parameters['headers'] = { + in: 'header', + required: true, + schema: { + Authorization: "Bearer " } - }); + } */ + const { + restaurantId, + type, + name, + image, + comment, + price, + preparation, + weight, + kilocalories, + nutriscore, + categories, + allergens, + } = req.body; + + const allergensList = allergens.map((allergen: { label: string }) => new Allergen().setLibelle(allergen.label)); + const categoryList = categories.map((category: { label: string; hexaColor: string; icon: string }) => + new Category().setLibelle(category.label).setHexaColor(category.hexaColor).setIcon(category.icon), + ); + + const productId = new Product() + .setRestaurantId(Number(restaurantId)) + .setType(type) + .setName(name) + .setImage(image) + .setComment(comment) + .setPrice(price) + .setPreparation(preparation) + .setWeight(weight) + .setKilocalories(kilocalories) + .setNutriscore(nutriscore) + .setCategoriesList(categoryList) + .setAllergensList(allergensList); + + productServiceClient.createProduct(productId, (error, response) => { + if (error) return res.status(500).send({ error }); + else return res.status(201).json(response.toObject()); + }); }); -productRoutes.put('/api/product/:id', (req: Request, res: Response) => { - /* #swagger.parameters['body'] = { +productRoutes.put("/api/product/:id", withCheck({ role: "ACCOUNTANT" }), (req: Request, res: Response) => { + /* #swagger.parameters['id'] = { + in: 'path', + required: true, + schema: { + id: "product_id:1" + } + } + + #swagger.parameters['body'] = { in: 'body', required: true, schema: { @@ -151,61 +178,79 @@ productRoutes.put('/api/product/:id', (req: Request, res: Response) => { } ], } - } */ - const {id} = req.params - const { - restaurantId, - type, - name, - image, - comment, - price, - preparation, - weight, - kilocalories, - nutriscore, - categories, - allergens - } = req.body; - - const allergensList = allergens.map((allergen: any) => new Allergen().setLibelle(allergen.label)); - const categoryList = categories.map((category: any) => new Category() - .setLibelle(category.label) - .setHexaColor(category.hexaColor) - .setIcon(category.icon)); - - const productId = new Product().setId(id).setRestaurantId(Number(restaurantId)).setType(type) - .setName(name) - .setImage(image) - .setComment(comment) - .setPrice(price) - .setPreparation(preparation) - .setWeight(weight) - .setKilocalories(kilocalories) - .setNutriscore(nutriscore) - .setCategoriesList(categoryList) - .setAllergensList(allergensList); - - productServiceClient.createProduct(productId, (error, response) => { - if (error) { - res.status(500).send({error: error.message}); - } else { - res.json(response.toObject()); + } + #swagger.parameters['headers'] = { + in: 'header', + required: true, + schema: { + Authorization: "Bearer " } - }); + } */ + const { id } = req.params; + const { + restaurantId, + type, + name, + image, + comment, + price, + preparation, + weight, + kilocalories, + nutriscore, + categories, + allergens, + } = req.body; + + const allergensList = allergens.map((allergen: { label: string }) => new Allergen().setLibelle(allergen.label)); + const categoryList = categories.map((category: { label: string; hexaColor: string; icon: string }) => + new Category().setLibelle(category.label).setHexaColor(category.hexaColor).setIcon(category.icon), + ); + + const productId = new Product() + .setId(id) + .setRestaurantId(Number(restaurantId)) + .setType(type) + .setName(name) + .setImage(image) + .setComment(comment) + .setPrice(price) + .setPreparation(preparation) + .setWeight(weight) + .setKilocalories(kilocalories) + .setNutriscore(nutriscore) + .setCategoriesList(categoryList) + .setAllergensList(allergensList); + + productServiceClient.updateProduct(productId, (error, response) => { + if (error) return res.status(500).send({ error }); + else return res.status(200).json(response.toObject()); + }); }); -productRoutes.post('/api/product/image', (req: Request, res: Response) => { - const {input_file} = req.body; - const bitmap = fs.readFileSync(input_file); - const base64File = new Buffer(bitmap).toString('base64'); - - const file = new File().setName(input_file).setData(base64File); - productServiceClient.uploadImage(file, (error, response) => { - if (error) { - res.status(500).send({error: error.message}); - } else { - res.json(response.toObject()); +productRoutes.post("/api/product/image", withCheck({ role: "ACCOUNTANT" }), (req: Request, res: Response) => { + /* #swagger.parameters['body'] = { + in: 'body', + required: true, + schema: { + input_file: Buffer } - }); -}); \ No newline at end of file + } + #swagger.parameters['headers'] = { + in: 'header', + required: true, + schema: { + Authorization: "Bearer " + } + } + */ + const { input_file } = req.body; + const bitmap = fs.readFileSync(input_file); + const base64File = new Buffer(bitmap).toString("base64"); + + const file = new File().setName(input_file).setData(base64File); + productServiceClient.uploadImage(file, (error, response) => { + if (error) return res.status(500).send({ error }); + else return res.status(200).json(response.toObject()); + }); +}); From 1ff4cedeee83659e08f1d13c92d75844aa9d5339 Mon Sep 17 00:00:00 2001 From: Florian LEROUX Date: Fri, 25 Aug 2023 16:28:54 +0200 Subject: [PATCH 474/883] feat(promotion): add auth checkguards in routes --- .../promotion/promotion.controller.ts | 214 ++++++++++++------ 1 file changed, 146 insertions(+), 68 deletions(-) diff --git a/services/gateway/src/controller/promotion/promotion.controller.ts b/services/gateway/src/controller/promotion/promotion.controller.ts index 5f23385a..15e38a44 100644 --- a/services/gateway/src/controller/promotion/promotion.controller.ts +++ b/services/gateway/src/controller/promotion/promotion.controller.ts @@ -1,44 +1,91 @@ -import {Router} from "express"; -import {promotionServiceClient} from "@gateway/services/clients/promotion.client"; -import {Empty} from "google-protobuf/google/protobuf/empty_pb"; -import {Promotion, PromotionCode, PromotionCreateInput, PromotionId, RestaurantId} from "@gateway/proto/promotions_pb"; +import { Router } from "express"; +import { promotionServiceClient } from "@gateway/services/clients/promotion.client"; +import { Empty } from "google-protobuf/google/protobuf/empty_pb"; +import { + Promotion, + PromotionCode, + PromotionCreateInput, + PromotionId, + RestaurantId, +} from "@gateway/proto/promotions_pb"; +import { getUserIdFromToken } from "@gateway/services/user.service"; +import { withCheck } from "@gateway/middleware/auth"; export const promotionRoutes = Router(); -promotionRoutes.get('/api/promotion/:code', (req, res) => { - const {code} = req.params; - promotionServiceClient.getPromotion(new PromotionCode().setCode(code), (error, response) => { - if (error) { - res.status(500).send({error: error.message}); - } else { - res.json(response.toObject()); +promotionRoutes.get("/api/promotion/:code", async (req, res) => { + /* #swagger.parameters['code'] = { + in: 'path', + required: true, + schema: { + code: "code-example" } - }); + } + #swagger.parameters['headers'] = { + in: 'header', + required: true, + schema: { + Authorization: "Bearer " + } + } */ + + // Auth check and :id check --- + const { authorization } = req.headers; + if (!authorization) return res.status(401).json({ message: "Unauthorized" }); + const token = authorization.split("Bearer ")[1]; + const userId = await getUserIdFromToken(token); + if (!userId) return res.status(401).json({ message: "Unauthorized" }); + // ---------------------------- + const { code } = req.params; + promotionServiceClient.getPromotion(new PromotionCode().setCode(code), (error, response) => { + if (error) return res.status(500).send({ error }); + else return res.status(200).json(response.toObject()); + }); }); -promotionRoutes.get('/api/promotion', (req, res) => { - promotionServiceClient.getPromotions(new Empty(), (error, response) => { - if (error) { - res.status(500).send({error: error.message}); - } else { - res.json(response.toObject()); - } - }); +promotionRoutes.get("/api/promotion", withCheck({ role: "ACCOUNTANT" }), (_, res) => { + promotionServiceClient.getPromotions(new Empty(), (error, response) => { + if (error) return res.status(500).send({ error }); + else return res.status(200).json(response.toObject()); + }); }); -promotionRoutes.get('/api/promotion/by-restaurant/:restaurantId', (req, res) => { - const {restaurantId} = req.params; - promotionServiceClient.getPromotionsByRestaurant(new RestaurantId().setId(restaurantId), (error, response) => { - if (error) { - res.status(500).send({error: error.message}); - } else { - res.json(response.toObject()); +promotionRoutes.get( + "/api/promotion/by-restaurant/:restaurantId", + withCheck({ role: "ACCOUNTANT" }), + async (req, res) => { + /* #swagger.parameters['restaurantId'] = { + in: 'path', + required: true, + schema: { + restaurantId: "restaurant_id:0" } + } + #swagger.parameters['headers'] = { + in: 'header', + required: true, + schema: { + Authorization: "Bearer " + } + } */ + + // Auth check and :id check --- + const { authorization } = req.headers; + if (!authorization) return res.status(401).json({ message: "Unauthorized" }); + const token = authorization.split("Bearer ")[1]; + const userId = await getUserIdFromToken(token); + if (!userId) return res.status(401).json({ message: "Unauthorized" }); + // ---------------------------- + const { restaurantId } = req.params; + promotionServiceClient.getPromotionsByRestaurant(new RestaurantId().setId(restaurantId), (error, response) => { + if (error) return res.status(500).send({ error }); + else return res.status(200).json(response.toObject()); }); -}); + }, +); -promotionRoutes.post('/api/promotion', (req, res) => { - /* #swagger.parameters['body'] = { +promotionRoutes.post("/api/promotion", withCheck({ role: "ACCOUNTANT" }), (req, res) => { + /* #swagger.parameters['body'] = { in: 'body', required: true, schema: { @@ -47,23 +94,35 @@ promotionRoutes.post('/api/promotion', (req, res) => { method: {'$ref': '#/definitions/Method'}, restaurantId: "restaurant_id:0", } - } */ - const {code, reduction, method, restaurantId} = req.body; - const promotionCreateInput = new PromotionCreateInput().setCode(code) - .setReduction(reduction) - .setMethod(method) - .setRestaurantId(restaurantId); - promotionServiceClient.createPromotion(promotionCreateInput, (error, response) => { - if (error) { - res.status(500).send({error: error.message}); - } else { - res.json(response.toObject()); + } #swagger.parameters['headers'] = { + in: 'header', + required: true, + schema: { + Authorization: "Bearer " } - }); + } */ + const { code, reduction, method, restaurantId } = req.body; + const promotionCreateInput = new PromotionCreateInput() + .setCode(code) + .setReduction(reduction) + .setMethod(method) + .setRestaurantId(restaurantId); + promotionServiceClient.createPromotion(promotionCreateInput, (error, response) => { + if (error) return res.status(500).send({ error }); + else return res.status(201).json(response.toObject()); + }); }); -promotionRoutes.put('/api/promotion/:id', (req, res) => { - /* #swagger.parameters['body'] = { +promotionRoutes.put("/api/promotion/:id", withCheck({ role: "ACCOUNTANT" }), (req, res) => { + /* #swagger.parameters['id'] = { + in: 'path', + required: true, + schema: { + id: "promotion_id:1" + } + } + + #swagger.parameters['body'] = { in: 'body', required: true, schema: { @@ -72,31 +131,50 @@ promotionRoutes.put('/api/promotion/:id', (req, res) => { method: {'$ref': '#/definitions/Method'}, restaurantId: "restaurant_id:0", } - } */ - const {id} = req.params; - const {code, reduction, method, restaurantId} = req.body; - const promotionUpdateInput = new Promotion().setId(id).setCode(code) - .setReduction(reduction) - .setMethod(method) - .setRestaurantId(restaurantId); - - promotionServiceClient.createPromotion(promotionUpdateInput, (error, response) => { - if (error) { - res.status(500).send({error: error.message}); - } else { - res.json(response.toObject()); + } + #swagger.parameters['headers'] = { + in: 'header', + required: true, + schema: { + Authorization: "Bearer " } - }); -}); + } + */ + const { id } = req.params; + const { code, reduction, method, restaurantId } = req.body; + const promotionUpdateInput = new Promotion() + .setId(id) + .setCode(code) + .setReduction(reduction) + .setMethod(method) + .setRestaurantId(restaurantId); -promotionRoutes.delete('/api/promotion/:id', (req, res) => { - const {id} = req.params; + promotionServiceClient.updatePromotion(promotionUpdateInput, (error, response) => { + if (error) return res.status(500).send({ error }); + else return res.status(200).json(response.toObject()); + }); +}); - promotionServiceClient.deletePromotion(new PromotionId().setId(id), (error, response) => { - if (error) { - res.status(500).send({error: error.message}); - } else { - res.json(response.toObject()); +promotionRoutes.delete("/api/promotion/:id", withCheck({ role: "ACCOUNTANT" }), (req, res) => { + /* #swagger.parameters['id'] = { + in: 'path', + required: true, + schema: { + id: "promotion_id:1" } - }); -}); \ No newline at end of file + } + #swagger.parameters['headers'] = { + in: 'header', + required: true, + schema: { + Authorization: "Bearer " + } + } + */ + const { id } = req.params; + + promotionServiceClient.deletePromotion(new PromotionId().setId(id), (error, response) => { + if (error) return res.status(500).send({ error }); + else return res.status(200).json(response.toObject()); + }); +}); From 303a9527e0976afc58a26b71811ec8c4690a0340 Mon Sep 17 00:00:00 2001 From: Florian LEROUX Date: Fri, 25 Aug 2023 16:36:16 +0200 Subject: [PATCH 475/883] ref(withCheck): add support for multiple roles --- services/gateway/src/middleware/auth.ts | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/services/gateway/src/middleware/auth.ts b/services/gateway/src/middleware/auth.ts index c77b7a12..faa17650 100644 --- a/services/gateway/src/middleware/auth.ts +++ b/services/gateway/src/middleware/auth.ts @@ -8,11 +8,15 @@ export const ROLES = { DELIVERER: "DELIVERER", }; -const checkRole = async (token: string, expectedRole: keyof typeof ROLES) => { +export type Role = keyof typeof ROLES; + +const checkRole = async (token: string, expectedRole: Role | Role[]) => { const userId = await getUserIdFromToken(token); if (userId === undefined) return false; const user = await getUser(userId); if (user === undefined) return false; + + if (Array.isArray(expectedRole)) return expectedRole.includes(user.getRole()?.getCode() as Role); return user.getRole()?.getCode() === expectedRole; }; @@ -25,7 +29,7 @@ const checkRight = async (token: string, expectedId: number) => { export const check = async ( token: string, expect: { - role?: keyof typeof ROLES; + role?: Role | Role[]; id?: number; }, ) => { @@ -37,7 +41,7 @@ export const check = async ( }; export const withCheck = - (expect: { role?: keyof typeof ROLES; id?: number }) => async (req: Request, res: Response, next: NextFunction) => { + (expect: { role?: Role | Role[]; id?: number }) => async (req: Request, res: Response, next: NextFunction) => { const { role, id } = expect; const token = req.headers.authorization?.split("Bearer ")[0]; if (!token) return res.status(401).json({ message: "Unauthorized" }); From 979fd3f0f1c601b5095ec40a45ca66bfdab2500b Mon Sep 17 00:00:00 2001 From: Florian LEROUX Date: Fri, 25 Aug 2023 16:40:27 +0200 Subject: [PATCH 476/883] feat(restaurant): add auth checkguards in routes --- .../restaurant/restaurant.controller.ts | 218 +++++++++++------- 1 file changed, 130 insertions(+), 88 deletions(-) diff --git a/services/gateway/src/controller/restaurant/restaurant.controller.ts b/services/gateway/src/controller/restaurant/restaurant.controller.ts index 5877dace..403054bf 100644 --- a/services/gateway/src/controller/restaurant/restaurant.controller.ts +++ b/services/gateway/src/controller/restaurant/restaurant.controller.ts @@ -1,53 +1,105 @@ -import {Request, Response, Router} from "express"; -import {restaurantServiceClient} from "@gateway/services/clients/restaurant.client"; -import {RestaurantId} from "@gateway/proto/product_pb"; -import {Empty} from "google-protobuf/google/protobuf/empty_pb"; -import {ByLocationInput, Restaurant, RestaurantCreateInput} from "@gateway/proto/restaurant_pb"; +import { Request, Response, Router } from "express"; +import { restaurantServiceClient } from "@gateway/services/clients/restaurant.client"; +import { RestaurantId } from "@gateway/proto/product_pb"; +import { Empty } from "google-protobuf/google/protobuf/empty_pb"; +import { ByLocationInput, Restaurant, RestaurantCreateInput } from "@gateway/proto/restaurant_pb"; +import { withCheck } from "@gateway/middleware/auth"; export const restaurantRoutes = Router(); -restaurantRoutes.get('/api/restaurant/:id', (req: Request, res: Response) => { - const {id} = req.params; +restaurantRoutes.get("/api/restaurant/:id", (req: Request, res: Response) => { + /* #swagger.parameters['id'] = { + in: 'query', + required: true, + schema: { + id: "restaurant-id:1" + } + } + */ + const { id } = req.params; + + restaurantServiceClient.getRestaurant(new RestaurantId().setId(id), (error, response) => { + if (error) return res.status(500).send({ error }); + else return res.status(200).json(response.toObject()); + }); +}); + +restaurantRoutes.get("/api/restaurant", (_: Request, res: Response) => { + restaurantServiceClient.getRestaurants(new Empty(), (error, response) => { + if (error) return res.status(500).send({ error }); + else return res.status(200).json(response.toObject()); + }); +}); - restaurantServiceClient.getRestaurant(new RestaurantId().setId(id), (error, response) => { - if (error) { - res.status(500).send({error: error.message}); - } else { - res.json(response.toObject()); +restaurantRoutes.post("/api/restaurant/by-location", async (req: Request, res: Response) => { + /* #swagger.parameters['body'] = { + in: 'body', + required: true, + schema: { + locationList: [1.099, 49.443] } - }); + } + */ + + const { locationList } = req.body; + restaurantServiceClient.getRestaurantsByLocation( + new ByLocationInput().setLocationList(locationList), + (error, response) => { + if (error) return res.status(500).send({ error }); + else return res.status(200).json(response.toObject()); + }, + ); }); -restaurantRoutes.get('/api/restaurant', (req: Request, res: Response) => { - restaurantServiceClient.getRestaurants(new Empty(), (error, response) => { - if (error) { - res.status(500).send({error: error.message}); - } else { - res.json(response.toObject()); +restaurantRoutes.post("/api/restaurant", withCheck({ role: "ADMIN" }), (req: Request, res: Response) => { + /* #swagger.parameters['body'] = { + in: 'body', + required: true, + schema: { + name: "restaurant-name", + description: "restaurant-desc", + locationList: [1.099, 49.443], + address: "restaurant-address", + openingHoursList: ["12h-14h", "19h-22h"], + phone: "restaurant-phone" } - }); + } + #swagger.parameters['headers'] = { + in: 'header', + required: true, + schema: { + Authorization: "Bearer " + } + } + */ + const { name, description, locationList, address, openingHoursList, phone } = req.body; + const restaurantCreateInput = new RestaurantCreateInput() + .setName(name) + .setDescription(description) + .setLocationList(locationList) + .setAddress(address) + .setOpeninghoursList(openingHoursList) + .setPhone(phone); + + restaurantServiceClient.createRestaurant(restaurantCreateInput, (error, response) => { + if (error) return res.status(500).send({ error }); + else return res.status(201).json(response.toObject()); + }); }); -restaurantRoutes.post('/api/restaurant/by-location', (req: Request, res: Response) => { - /* #swagger.parameters['body'] = { - in: 'body', +restaurantRoutes.put( + "/api/restaurant/:id", + withCheck({ role: ["ADMIN", "ACCOUNTANT"] }), + (req: Request, res: Response) => { + /* + #swagger.parameters['id'] = { + in: 'path', required: true, schema: { - locationList: [1.099, 49.443] + id: "restaurant-id:1" } - } */ - const {locationList} = req.body; - restaurantServiceClient.getRestaurantsByLocation(new ByLocationInput().setLocationList(locationList), (error, response) => { - if (error) { - res.status(500).send({error: error.message}); - } else { - res.json(response.toObject()); } - }); -}); - -restaurantRoutes.post('/api/restaurant', (req: Request, res: Response) => { - /* #swagger.parameters['body'] = { + #swagger.parameters['body'] = { in: 'body', required: true, schema: { @@ -58,64 +110,54 @@ restaurantRoutes.post('/api/restaurant', (req: Request, res: Response) => { openingHoursList: ["12h-14h", "19h-22h"], phone: "restaurant-phone" } - } */ - const {name, description, locationList, address, openingHoursList, phone} = req.body; - const restaurantCreateInput = new RestaurantCreateInput().setName(name) - .setDescription(description) - .setLocationList(locationList) - .setAddress(address) - .setOpeninghoursList(openingHoursList) - .setPhone(phone); - - restaurantServiceClient.createRestaurant(restaurantCreateInput, (error, response) => { - if (error) { - res.status(500).send({error: error.message}); - } else { - res.json(response.toObject()); } - }); -}); - -restaurantRoutes.put('/api/restaurant/:id', (req: Request, res: Response) => { - /* #swagger.parameters['body'] = { - in: 'body', + #swagger.parameters['headers'] = { + in: 'header', required: true, schema: { - name: "restaurant-name", - description: "restaurant-desc", - locationList: [1.099, 49.443], - address: "restaurant-address", - openingHoursList: ["12h-14h", "19h-22h"], - phone: "restaurant-phone" + Authorization: "Bearer " } - } */ - const {id} = req.params; - const {name, description, locationList, address, openingHoursList, phone} = req.body; - const restaurantCreateInput = new Restaurant().setId(id) - .setName(name) - .setDescription(description) - .setLocationList(locationList) - .setAddress(address) - .setOpeninghoursList(openingHoursList) - .setPhone(phone); + } + */ + const { id } = req.params; + const { name, description, locationList, address, openingHoursList, phone } = req.body; + const restaurantCreateInput = new Restaurant() + .setId(id) + .setName(name) + .setDescription(description) + .setLocationList(locationList) + .setAddress(address) + .setOpeninghoursList(openingHoursList) + .setPhone(phone); restaurantServiceClient.updateRestaurant(restaurantCreateInput, (error, response) => { - if (error) { - res.status(500).send({error: error.message}); - } else { - res.json(response.toObject()); - } + if (error) return res.status(500).send({ error }); + else return res.status(200).json(response.toObject()); }); -}); + }, +); -restaurantRoutes.delete('/api/restaurant/:id', (req: Request, res: Response) => { - const {id} = req.params; - - restaurantServiceClient.deleteRestaurant(new RestaurantId().setId(id), (error, response) => { - if (error) { - res.status(500).send({error: error.message}); - } else { - res.json(response.toObject()); +restaurantRoutes.delete("/api/restaurant/:id", withCheck({ role: "ADMIN" }), (req: Request, res: Response) => { + /* + #swagger.parameters['id'] = { + in: 'path', + required: true, + schema: { + id: "restaurant-id:1" + } } - }); -}); \ No newline at end of file + #swagger.parameters['headers'] = { + in: 'header', + required: true, + schema: { + Authorization: "Bearer " + } + } + */ + const { id } = req.params; + + restaurantServiceClient.deleteRestaurant(new RestaurantId().setId(id), (error, response) => { + if (error) return res.status(500).send({ error }); + else return res.status(200).json(response.toObject()); + }); +}); From 063860be1406ae4762fa926914eb0563d5b1281b Mon Sep 17 00:00:00 2001 From: anatole Date: Fri, 25 Aug 2023 16:53:46 +0200 Subject: [PATCH 477/883] feat(gateway): remove useless swagger doc --- .../controller/basket/basket.controller.ts | 37 ------------------- 1 file changed, 37 deletions(-) diff --git a/services/gateway/src/controller/basket/basket.controller.ts b/services/gateway/src/controller/basket/basket.controller.ts index b70e1a50..ea58e732 100644 --- a/services/gateway/src/controller/basket/basket.controller.ts +++ b/services/gateway/src/controller/basket/basket.controller.ts @@ -6,14 +6,6 @@ import { getUserIdFromToken } from "@gateway/services/user.service"; export const basketRoutes = Router(); basketRoutes.get("/api/basket/", async (req: Request, res: Response) => { - /* #swagger.parameters['headers'] = { - in: 'header', - required: true, - schema: { - Authorization: "Bearer " - } - } */ - // Auth check and :id check --- const { authorization } = req.headers; if (!authorization) return res.status(401).json({ message: "Unauthorized" }); @@ -36,13 +28,6 @@ basketRoutes.post("/api/basket", async (req: Request, res: Response) => { productId: "product_id:0", restaurantId:"restaurant_id:0" } - } - #swagger.parameters['headers'] = { - in: 'header', - required: true, - schema: { - Authorization: "Bearer " - } } */ // Auth check and :id check --- @@ -69,13 +54,6 @@ basketRoutes.put("/api/basket/remove-product", async (req: Request, res: Respons productId: "product_id:0", restaurantId:"restaurant_id:0" } - } - #swagger.parameters['headers'] = { - in: 'header', - required: true, - schema: { - Authorization: "Bearer " - } } */ // Auth check and :id check --- @@ -102,13 +80,6 @@ basketRoutes.put("/api/basket/restaurant", async (req: Request, res: Response) = schema: { restaurantId:"restaurant_id:0" } - } - #swagger.parameters['headers'] = { - in: 'header', - required: true, - schema: { - Authorization: "Bearer " - } } */ // Auth check and :id check --- @@ -130,14 +101,6 @@ basketRoutes.put("/api/basket/restaurant", async (req: Request, res: Response) = }); basketRoutes.post("/api/basket/reset", async (req: Request, res: Response) => { - /* #swagger.parameters['headers'] = { - in: 'header', - required: true, - schema: { - Authorization: "Bearer " - } - } */ - // Auth check and :id check --- const { authorization } = req.headers; if (!authorization) return res.status(401).json({ message: "Unauthorized" }); From 2c22130423ec433573f3254009cc4bd77f2f7eae Mon Sep 17 00:00:00 2001 From: anatole Date: Fri, 25 Aug 2023 18:21:23 +0200 Subject: [PATCH 478/883] feat(gateway): clean the swagger --- .../delivery/delivery.controller.ts | 84 +-- .../delivery/deliveryPerson.controller.ts | 80 +-- .../src/controller/log/log.controller.ts | 26 +- .../controller/metric/metric.controller.ts | 137 ++-- .../src/controller/order/order.controller.ts | 99 +-- .../controller/payment/payment.controller.ts | 40 +- .../controller/product/allergen.controller.ts | 53 +- .../controller/product/category.controller.ts | 61 +- .../controller/product/product.controller.ts | 78 +-- .../promotion/promotion.controller.ts | 22 +- .../restaurant/restaurant.controller.ts | 5 + .../src/controller/stock/stock.controller.ts | 18 - .../stock/stockPerson.controller.ts | 6 +- .../src/controller/user/user.controller.ts | 50 +- .../src/lib/swagger/swagger-output.json | 634 ++++++++++++++---- 15 files changed, 767 insertions(+), 626 deletions(-) diff --git a/services/gateway/src/controller/delivery/delivery.controller.ts b/services/gateway/src/controller/delivery/delivery.controller.ts index 38fcfe01..b1886a6e 100644 --- a/services/gateway/src/controller/delivery/delivery.controller.ts +++ b/services/gateway/src/controller/delivery/delivery.controller.ts @@ -7,20 +7,16 @@ import { check, withCheck } from "@gateway/middleware/auth"; export const deliveryRoutes = Router(); deliveryRoutes.get("/api/delivery/:id", async (req: Request, res: Response) => { - /* #swagger.parameters['id'] = { - in: 'path', - required: true, - schema: { - id: "delivery_id:1" - } - } - #swagger.parameters['headers'] = { + /* #swagger.parameters['authorization'] = { in: 'header', required: true, - schema: { - Authorization: "Bearer " - } - } */ + type: 'string' + } + #swagger.parameters['id'] = { + in: 'path', + required: true, + type: 'string' + } */ // Auth check and :id check --- const { authorization } = req.headers; @@ -51,20 +47,16 @@ deliveryRoutes.get( "/api/delivery/by-restaurant/:id", withCheck({ role: "ACCOUNTANT" }), (req: Request, res: Response) => { - /* #swagger.parameters['id'] = { - in: 'path', - required: true, - schema: { - id: "restaurant_id:1" - } - } - #swagger.parameters['headers'] = { + /* #swagger.parameters['authorization'] = { in: 'header', required: true, - schema: { - Authorization: "Bearer " - } - } */ + type: 'string' + } + #swagger.parameters['id'] = { + in: 'path', + required: true, + type: 'string' + } */ const { id } = req.params; const restaurantId = new RestaurantId().setId(id); @@ -77,12 +69,10 @@ deliveryRoutes.get( ); deliveryRoutes.get("/api/delivery/by-user", async (req: Request, res: Response) => { - /* #swagger.parameters['headers'] = { + /* #swagger.parameters['authorization'] = { in: 'header', required: true, - schema: { - Authorization: "Bearer " - } + type: 'string' } */ // Auth check and :id check --- @@ -111,12 +101,10 @@ deliveryRoutes.post("/api/delivery", async (req: Request, res: Response) => { restaurantId: "restaurant_id:1" } } - #swagger.parameters['headers'] = { + #swagger.parameters['authorization'] = { in: 'header', required: true, - schema: { - Authorization: "Bearer " - } + type: 'string' } */ // Auth check and :id check --- @@ -158,21 +146,16 @@ deliveryRoutes.put("/api/delivery/:id", async (req: Request, res: Response) => { restaurantId: "restaurant_id:1" } } - #swagger.parameters['headers'] = { + #swagger.parameters['authorization'] = { in: 'header', required: true, - schema: { - Authorization: "Bearer " - } - } - #swagger.parameters['id'] = { - in: 'path', - required: true, - schema: { - id: "delivery_id:1" - } + type: 'string' } - */ + #swagger.parameters['id'] = { + in: 'path', + required: true, + type: 'string' + } */ // Auth check and :id check --- const { authorization } = req.headers; if (!authorization) return res.status(401).json({ message: "Unauthorized" }); @@ -202,19 +185,10 @@ deliveryRoutes.put("/api/delivery/:id", async (req: Request, res: Response) => { }); deliveryRoutes.delete("/api/delivery/:id", async (req: Request, res: Response) => { - /* #swagger.parameters['id'] = { - in: 'path', - required: true, - schema: { - id: "delivery_id:1" - } - } - #swagger.parameters['headers'] = { + /* #swagger.parameters['authorization'] = { in: 'header', required: true, - schema: { - Authorization: "Bearer " - } + type: 'string' } */ // Auth check and :id check --- const { authorization } = req.headers; diff --git a/services/gateway/src/controller/delivery/deliveryPerson.controller.ts b/services/gateway/src/controller/delivery/deliveryPerson.controller.ts index cda62d8d..d93540b9 100644 --- a/services/gateway/src/controller/delivery/deliveryPerson.controller.ts +++ b/services/gateway/src/controller/delivery/deliveryPerson.controller.ts @@ -8,21 +8,6 @@ import { withCheck } from "@gateway/middleware/auth"; export const deliveryPersonRoutes = Router(); deliveryPersonRoutes.get("/api/delivery-person/:id", async (req, res) => { - /* #swagger.parameters['id'] = { - in: 'path', - required: true, - schema: { - id: "delivery_person_id:1" - } - } - #swagger.parameters['headers'] = { - in: 'header', - required: true, - schema: { - Authorization: "Bearer " - } - } */ - // Auth check and :id check --- const { authorization } = req.headers; if (!authorization) return res.status(401).json({ message: "Unauthorized" }); @@ -40,15 +25,11 @@ deliveryPersonRoutes.get("/api/delivery-person/:id", async (req, res) => { }); deliveryPersonRoutes.get("/api/delivery-person", withCheck({ role: "ADMIN" }), async (_, res) => { - /* - #swagger.parameters['headers'] = { + /* #swagger.parameters['authorization'] = { in: 'header', required: true, - schema: { - Authorization: "Bearer " - } - } */ - + type: 'string' + } */ deliveryPersonServiceClient.listDeliveryPersons(new Empty(), (error, response) => { if (error) return res.status(500).send({ error }); else return res.status(200).json(response.toObject()); @@ -56,20 +37,15 @@ deliveryPersonRoutes.get("/api/delivery-person", withCheck({ role: "ADMIN" }), a }); deliveryPersonRoutes.get("/api/delivery-person/near", async (req, res) => { - /* #swagger.parameters['query'] = { + /* #swagger.parameters['lat'] = { in: 'query', required: true, - schema: { - lat: "0", - lng: "0" - } - } - #swagger.parameters['headers'] = { - in: 'header', + type: 'integer' + } + #swagger.parameters['lng'] = { + in: 'query', required: true, - schema: { - Authorization: "Bearer " - } + type: 'integer' } */ // Auth check and :id check --- @@ -98,13 +74,11 @@ deliveryPersonRoutes.post("/api/delivery-person", withCheck({ role: "ADMIN" }), phone:"0612345678", locationList:[41.40338, 2.17403] } - } - #swagger.parameters['headers'] = { + } + #swagger.parameters['authorization'] = { in: 'header', required: true, - schema: { - Authorization: "Bearer " - } + type: 'string' } */ const { firstName, lastName, phone, locationList } = req.body; @@ -120,14 +94,7 @@ deliveryPersonRoutes.post("/api/delivery-person", withCheck({ role: "ADMIN" }), }); deliveryPersonRoutes.put("/api/delivery-person/:id", withCheck({ role: "ADMIN" }), (req, res) => { - /* #swagger.parameters['id'] = { - in: 'path', - required: true, - schema: { - id: "delivery_person_id:1" - } - } - #swagger.parameters['body'] = { + /* #swagger.parameters['body'] = { in: 'body', required: true, schema: { @@ -136,13 +103,11 @@ deliveryPersonRoutes.put("/api/delivery-person/:id", withCheck({ role: "ADMIN" } phone:"0612345678", locationList:[41.40338, 2.17403] } - } - #swagger.parameters['headers'] = { + } + #swagger.parameters['authorization'] = { in: 'header', required: true, - schema: { - Authorization: "Bearer " - } + type: 'string' } */ const { id } = req.params; const { firstName, lastName, phone, locationList } = req.body; @@ -160,19 +125,10 @@ deliveryPersonRoutes.put("/api/delivery-person/:id", withCheck({ role: "ADMIN" } }); deliveryPersonRoutes.delete("/api/delivery-person/:id", withCheck({ role: "ADMIN" }), (req, res) => { - /* #swagger.parameters['id'] = { - in: 'path', - required: true, - schema: { - id: "delivery_person_id:1" - } - } - #swagger.parameters['headers'] = { + /* #swagger.parameters['authorization'] = { in: 'header', required: true, - schema: { - Authorization: "Bearer " - } + type: 'string' } */ const { id } = req.params; diff --git a/services/gateway/src/controller/log/log.controller.ts b/services/gateway/src/controller/log/log.controller.ts index 3f1f623d..fcc39571 100644 --- a/services/gateway/src/controller/log/log.controller.ts +++ b/services/gateway/src/controller/log/log.controller.ts @@ -7,12 +7,10 @@ import { withCheck } from "@gateway/middleware/auth"; export const logRoutes = Router(); logRoutes.get("/api/log", withCheck({ role: "ADMIN" }), (_: Request, res: Response) => { - /* #swagger.parameters['headers'] = { + /* #swagger.parameters['authorization'] = { in: 'header', required: true, - schema: { - Authorization: "Bearer " - } + type: 'string' } */ logServiceClient.listLog(new Empty(), (error, response) => { if (error) return res.status(500).send({ error: error.message }); @@ -21,20 +19,16 @@ logRoutes.get("/api/log", withCheck({ role: "ADMIN" }), (_: Request, res: Respon }); logRoutes.get("/api/log/:id", withCheck({ role: "ADMIN" }), (req: Request, res: Response) => { - /* #swagger.parameters['id'] = { - in: 'path', - required: true, - schema: { - id: "log_id:1" - } - } - #swagger.parameters['headers'] = { + /* #swagger.parameters['authorization'] = { in: 'header', required: true, - schema: { - Authorization: "Bearer " - } - } */ + type: 'string' + } + #swagger.parameters['id'] = { + in: 'path', + required: true, + type: 'number' + } */ const { id } = req.params; logServiceClient.getLog(new GetLogRequest().setId(Number(id)), (error, response) => { diff --git a/services/gateway/src/controller/metric/metric.controller.ts b/services/gateway/src/controller/metric/metric.controller.ts index 646b3a98..128220a7 100644 --- a/services/gateway/src/controller/metric/metric.controller.ts +++ b/services/gateway/src/controller/metric/metric.controller.ts @@ -20,20 +20,16 @@ import { withCheck } from "@gateway/middleware/auth"; export const metricRoutes = Router(); metricRoutes.get("/api/metric/:key", withCheck({ role: "ACCOUNTANT" }), (req, res) => { - /* #swagger.parameters['key'] = { - in: 'path', - required: true, - schema: { - key: "key_example" - } - } - #swagger.parameters['headers'] = { + /* #swagger.parameters['authorization'] = { in: 'header', required: true, - schema: { - Authorization: "Bearer " - } - } */ + type: 'string' + } + #swagger.parameters['key'] = { + in: 'path', + required: true, + type: 'string' + } */ const { key } = req.params; const metricInput = new GetMetricRequest().setKey(key); metricService.getMetric(metricInput, (error, response) => { @@ -51,12 +47,10 @@ metricRoutes.post("/api/metric/by-restaurant-and-date", withCheck({ role: "ACCOU date: "2022-01-01T00:00:00.000Z", } } - #swagger.parameters['headers'] = { + #swagger.parameters['authorization'] = { in: 'header', required: true, - schema: { - Authorization: "Bearer " - } + type: 'string' } */ const { restaurantId, date } = req.body; const getMetricsByRestaurantAndDateRequest = new GetMetricsByRestaurantAndDateRequest() @@ -69,19 +63,10 @@ metricRoutes.post("/api/metric/by-restaurant-and-date", withCheck({ role: "ACCOU }); metricRoutes.get("/api/metric/by-restaurant/:restaurantId", withCheck({ role: "ACCOUNTANT" }), (req, res) => { - /* #swagger.parameters['restaurantId'] = { - in: 'path', - required: true, - schema: { - restaurantId: "restaurant_id:1" - } - } - #swagger.parameters['headers'] = { + /* #swagger.parameters['authorization'] = { in: 'header', required: true, - schema: { - Authorization: "Bearer " - } + type: 'string' } */ const { restaurantId } = req.params; const getMetricsByRestaurantRequest = new GetMetricsByRestaurantRequest().setRestaurantId(restaurantId); @@ -95,19 +80,10 @@ metricRoutes.get( "/api/metric/by-restaurant-group/:restaurantGroupId", withCheck({ role: "ACCOUNTANT" }), (req, res) => { - /* #swagger.parameters['restaurantGroupId'] = { - in: 'path', - required: true, - schema: { - restaurantGroupId: "restaurant_group_id:1" - } - } - #swagger.parameters['headers'] = { + /* #swagger.parameters['authorization'] = { in: 'header', required: true, - schema: { - Authorization: "Bearer " - } + type: 'string' } */ const { restaurantGroupId } = req.params; const getMetricsByRestaurantGroupRequest = new GetMetricsByRestaurantGroupRequest().setRestaurantGroupId( @@ -121,19 +97,10 @@ metricRoutes.get( ); metricRoutes.get("/api/metric/restaurant/:restaurantId", withCheck({ role: "ACCOUNTANT" }), (req, res) => { - /* #swagger.parameters['restaurantId'] = { - in: 'path', - required: true, - schema: { - restaurantId: "restaurant_id:1" - } - } - #swagger.parameters['headers'] = { + /* #swagger.parameters['authorization'] = { in: 'header', required: true, - schema: { - Authorization: "Bearer " - } + type: 'string' } */ const { restaurantId } = req.params; metricService.getRestaurant(new GetRestaurantRequest().setId(restaurantId), (error, response) => { @@ -167,12 +134,10 @@ metricRoutes.post("/api/metric/restaurant", withCheck({ role: "ACCOUNTANT" }), ( "group_id": 1 } } - #swagger.parameters['headers'] = { + #swagger.parameters['authorization'] = { in: 'header', required: true, - schema: { - Authorization: "Bearer " - } + type: 'string' } */ const { name, key, address, groupId } = req.body; const createRestaurantRequest = new CreateRestaurantRequest() @@ -195,12 +160,10 @@ metricRoutes.post("/api/metric/restaurant-group", withCheck({ role: "ACCOUNTANT" "name": "example_name", } } - #swagger.parameters['headers'] = { + #swagger.parameters['authorization'] = { in: 'header', required: true, - schema: { - Authorization: "Bearer " - } + type: 'string' } */ const { name } = req.body; const createRestaurantGroupRequest = new CreateRestaurantGroupRequest().setName(name); @@ -212,15 +175,7 @@ metricRoutes.post("/api/metric/restaurant-group", withCheck({ role: "ACCOUNTANT" }); metricRoutes.put("/api/metric/restaurant/:restaurantId", withCheck({ role: "ACCOUNTANT" }), (req, res) => { - /* - #swagger.parameters['restaurantId'] = { - in: 'path', - required: true, - schema: { - restaurantId: "restaurant_id:1" - } - } - #swagger.parameters['body'] = { + /* #swagger.parameters['body'] = { in: 'body', required: true, schema: { @@ -230,12 +185,10 @@ metricRoutes.put("/api/metric/restaurant/:restaurantId", withCheck({ role: "ACCO "group_id": 1 } } - #swagger.parameters['headers'] = { + #swagger.parameters['authorization'] = { in: 'header', required: true, - schema: { - Authorization: "Bearer " - } + type: 'string' } */ const { restaurantId } = req.params; const { name, key, address, groupId } = req.body; @@ -253,12 +206,10 @@ metricRoutes.put("/api/metric/restaurant/:restaurantId", withCheck({ role: "ACCO }); metricRoutes.put("/api/metric/restaurant-group/:restaurantGroupId", withCheck({ role: "ACCOUNTANT" }), (req, res) => { - /* #swagger.parameters['query'] = { - in: 'query', + /* #swagger.parameters['restaurantGroupId'] = { + in: 'path', required: true, - schema: { - restaurantGroupId: "restaurant_group_id:1" - } + type: 'integer' } #swagger.parameters['body'] = { in: 'body', @@ -266,6 +217,11 @@ metricRoutes.put("/api/metric/restaurant-group/:restaurantGroupId", withCheck({ schema: { "name": "example_name", } + } + #swagger.parameters['authorization'] = { + in: 'header', + required: true, + type: 'string' } */ const { restaurantGroupId } = req.query as { restaurantGroupId: string }; const { name } = req.body; @@ -280,19 +236,10 @@ metricRoutes.put("/api/metric/restaurant-group/:restaurantGroupId", withCheck({ }); metricRoutes.delete("/api/metric/restaurant/:restaurantId", withCheck({ role: "ACCOUNTANT" }), (req, res) => { - /* #swagger.parameters['restaurantId'] = { - in: 'path', - required: true, - schema: { - restaurantId: "restaurant_id:1" - } - } - #swagger.parameters['headers'] = { + /* #swagger.parameters['authorization'] = { in: 'header', required: true, - schema: { - Authorization: "Bearer " - } + type: 'string' } */ const { restaurantId } = req.params; const deleteRestaurantRequest = new DeleteRestaurantRequest().setId(restaurantId); @@ -307,16 +254,12 @@ metricRoutes.delete("/api/metric/restaurant-group/:restaurantGroupId", (req, res /* #swagger.parameters['restaurantGroupId'] = { in: 'path', required: true, - schema: { - restaurantGroupId: "restaurant_group_id:1" - } + type: 'integer' } - #swagger.parameters['headers'] = { + #swagger.parameters['authorization'] = { in: 'header', required: true, - schema: { - Authorization: "Bearer " - } + type: 'string' } */ const { restaurantGroupId } = req.params; const deleteRestaurantGroupRequest = new DeleteRestaurantGroupRequest().setId(Number(restaurantGroupId)); @@ -339,13 +282,11 @@ metricRoutes.post("/api/metric", withCheck({ role: "ACCOUNTANT" }), (req, res) = key :"example_key" } } - #swagger.parameters['headers'] = { + #swagger.parameters['authorization'] = { in: 'header', required: true, - schema: { - Authorization: "Bearer " - } - }*/ + type: 'string' + } */ const { restaurantId, code, value, key } = req.body; const newMetric = new Metric().setKey(key).setRestaurantId(restaurantId).setCode(code).setValue(value); diff --git a/services/gateway/src/controller/order/order.controller.ts b/services/gateway/src/controller/order/order.controller.ts index 7168b902..8178e6ec 100644 --- a/services/gateway/src/controller/order/order.controller.ts +++ b/services/gateway/src/controller/order/order.controller.ts @@ -21,20 +21,16 @@ import { check, withCheck } from "@gateway/middleware/auth"; export const orderRoutes = Router(); orderRoutes.get("/api/order/:id", async (req: Request, res: Response) => { - /* #swagger.parameters['id'] = { - in: 'path', - required: true, - schema: { - id: "order_id:1" - } - } - #swagger.parameters['headers'] = { + /* #swagger.parameters['authorization'] = { in: 'header', required: true, - schema: { - Authorization: "Bearer " - } - } */ + type: 'string' + } + #swagger.parameters['id'] = { + in: 'path', + required: true, + type: 'string' + } */ // Auth check and :id check --- const { authorization } = req.headers; @@ -78,12 +74,10 @@ orderRoutes.post("/api/order", async (req: Request, res: Response) => { restaurantId :"restaurant_id:1" } } - #swagger.parameters['headers'] = { + #swagger.parameters['authorization'] = { in: 'header', required: true, - schema: { - Authorization: "Bearer " - } + type: 'string' } */ // Auth check and :id check --- @@ -134,19 +128,10 @@ orderRoutes.post("/api/order", async (req: Request, res: Response) => { }); orderRoutes.get("/api/order/by-user/:userId", async (req: Request, res: Response) => { - /* #swagger.parameters['userId'] = { - in: 'path', - required: true, - schema: { - userId: "user_id:1" - } - } - #swagger.parameters['headers'] = { + /* #swagger.parameters['authorization'] = { in: 'header', required: true, - schema: { - Authorization: "Bearer " - } + type: 'string' } */ // Auth check and :id check --- @@ -175,12 +160,10 @@ orderRoutes.post("/api/order/by-status", withCheck({ role: "ACCOUNTANT" }), (req status :{'$ref': '#/definitions/Status'}, } } - #swagger.parameters['headers'] = { + #swagger.parameters['authorization'] = { in: 'header', required: true, - schema: { - Authorization: "Bearer " - } + type: 'string' } */ const orderInput = new GetOrdersByStatusRequest().setStatus(req.body.status); @@ -191,19 +174,10 @@ orderRoutes.post("/api/order/by-status", withCheck({ role: "ACCOUNTANT" }), (req }); orderRoutes.get("/api/order/by-delivery/:deliveryId", async (req: Request, res: Response) => { - /* #swagger.parameters['deliveryId'] = { - in: 'path', - required: true, - schema: { - deliveryId: "delivery_id:1" - } - } - #swagger.parameters['headers'] = { + /* #swagger.parameters['authorization'] = { in: 'header', required: true, - schema: { - Authorization: "Bearer " - } + type: 'string' } */ // Auth check and :id check --- const { authorization } = req.headers; @@ -224,19 +198,10 @@ orderRoutes.get("/api/order/by-delivery/:deliveryId", async (req: Request, res: }); orderRoutes.get("/api/order/by-payment/:paymentId", async (req: Request, res: Response) => { - /* #swagger.parameters['paymentId'] = { - in: 'path', - required: true, - schema: { - paymentId: "payment_id:1" - } - } - #swagger.parameters['headers'] = { + /* #swagger.parameters['authorization'] = { in: 'header', required: true, - schema: { - Authorization: "Bearer " - } + type: 'string' } */ // Auth check and :id check --- const { authorization } = req.headers; @@ -257,14 +222,7 @@ orderRoutes.get("/api/order/by-payment/:paymentId", async (req: Request, res: Re }); orderRoutes.put("/api/order/:orderId", withCheck({ role: "ADMIN" }), (req: Request, res: Response) => { - /* #swagger.parameters['orderId'] = { - in: 'path', - required: true, - schema: { - orderId: "order_id:1" - } - } - #swagger.parameters['body'] = { + /* #swagger.parameters['body'] = { in: 'body', required: true, schema: { @@ -274,12 +232,10 @@ orderRoutes.put("/api/order/:orderId", withCheck({ role: "ADMIN" }), (req: Reque restaurantId :"restaurant_id:1" } } - #swagger.parameters['headers'] = { + #swagger.parameters['authorization'] = { in: 'header', required: true, - schema: { - Authorization: "Bearer " - } + type: 'string' }*/ const { orderId } = req.params; const { status, deliveryId, paymentId, restaurantId } = req.body; @@ -296,19 +252,10 @@ orderRoutes.put("/api/order/:orderId", withCheck({ role: "ADMIN" }), (req: Reque }); orderRoutes.delete("/api/order/:orderId", withCheck({ role: "ADMIN" }), (req: Request, res: Response) => { - /* #swagger.parameters['orderId'] = { - in: 'path', - required: true, - schema: { - orderId: "order_id:1" - } - } - #swagger.parameters['headers'] = { + /* #swagger.parameters['authorization'] = { in: 'header', required: true, - schema: { - Authorization: "Bearer " - } + type: 'string' }*/ const { orderId } = req.params; const orderInput = new DeleteOrderRequest().setId(orderId); diff --git a/services/gateway/src/controller/payment/payment.controller.ts b/services/gateway/src/controller/payment/payment.controller.ts index 646577fb..07ab5393 100644 --- a/services/gateway/src/controller/payment/payment.controller.ts +++ b/services/gateway/src/controller/payment/payment.controller.ts @@ -7,20 +7,16 @@ import { check } from "@gateway/middleware/auth"; export const paymentRoutes = Router(); paymentRoutes.get("/api/payment/:id", async (req: Request, res: Response) => { - /* #swagger.parameters['id'] = { - in: 'path', - required: true, - schema: { - id: "payment_id:1" - } - } - #swagger.parameters['headers'] = { + /* #swagger.parameters['authorization'] = { in: 'header', required: true, - schema: { - Authorization: "Bearer " - } - } */ + type: 'string' + } + #swagger.parameters['id'] = { + in: 'path', + required: true, + type: 'string' + } */ // Auth check and :id check --- const { authorization } = req.headers; @@ -47,20 +43,16 @@ paymentRoutes.get("/api/payment/:id", async (req: Request, res: Response) => { }); paymentRoutes.get("/api/payment/by-user/:userId", async (req: Request, res: Response) => { - /* #swagger.parameters['userId'] = { - in: 'path', - required: true, - schema: { - userId: "user_id:1" - } - } - #swagger.parameters['headers'] = { + /* #swagger.parameters['authorization'] = { in: 'header', required: true, - schema: { - Authorization: "Bearer " - } - } */ + type: 'string' + } + #swagger.parameters['userId'] = { + in: 'path', + required: true, + type: 'string' + } */ // Auth check and :id check --- const { authorization } = req.headers; diff --git a/services/gateway/src/controller/product/allergen.controller.ts b/services/gateway/src/controller/product/allergen.controller.ts index 7a7d6064..5e2130bd 100644 --- a/services/gateway/src/controller/product/allergen.controller.ts +++ b/services/gateway/src/controller/product/allergen.controller.ts @@ -16,14 +16,6 @@ allergenRoutes.get("/api/allergen", (_: Request, res: Response) => { // TODO: check if route should be accessible allergenRoutes.get("/api/allergen/:id", (req: Request, res: Response) => { - /* #swagger.parameters['id'] = { - in: 'path', - required: true, - schema: { - id: "allergen_id:1" - } - } - */ const { id } = req.params; allergenServiceClient.readAllergen(new AllergenId().setId(id), (error, response) => { @@ -40,14 +32,11 @@ allergenRoutes.post("/api/allergen", withCheck({ role: "ACCOUNTANT" }), (req: Re label: "allergen-label", } } - #swagger.parameters['headers'] = { + #swagger.parameters['authorization'] = { in: 'header', required: true, - schema: { - Authorization: "Bearer " - } - } - */ + type: 'string' + } */ const { label } = req.body; const allergen = new Allergen().setLibelle(label); allergenServiceClient.createAllergen(allergen, (error, response) => { @@ -57,28 +46,18 @@ allergenRoutes.post("/api/allergen", withCheck({ role: "ACCOUNTANT" }), (req: Re }); allergenRoutes.put("/api/allergen/:id", withCheck({ role: "ACCOUNTANT" }), (req: Request, res: Response) => { - /* #swagger.parameters['id'] = { - in: 'path', - required: true, - schema: { - id: "allergen_id:1" - } - } - #swagger.parameters['body'] = { + /* #swagger.parameters['body'] = { in: 'body', required: true, schema: { label: "allergen-label", } - } - #swagger.parameters['headers'] = { + } + #swagger.parameters['authorization'] = { in: 'header', required: true, - schema: { - Authorization: "Bearer " - } - } - */ + type: 'string' + } */ const { id } = req.params; const { label } = req.body; const allergen = new Allergen().setId(id).setLibelle(label); @@ -89,21 +68,11 @@ allergenRoutes.put("/api/allergen/:id", withCheck({ role: "ACCOUNTANT" }), (req: }); allergenRoutes.delete("/api/allergen/:id", withCheck({ role: "ACCOUNTANT" }), (req: Request, res: Response) => { - /* #swagger.parameters['id'] = { - in: 'path', - required: true, - schema: { - id: "allergen_id:1" - } - } - #swagger.parameters['headers'] = { + /* #swagger.parameters['authorization'] = { in: 'header', required: true, - schema: { - Authorization: "Bearer " - } - } - */ + type: 'string' + }*/ const { id } = req.params; allergenServiceClient.deleteAllergen(new AllergenId().setId(id), (error, response) => { if (error) return res.status(500).send({ error }); diff --git a/services/gateway/src/controller/product/category.controller.ts b/services/gateway/src/controller/product/category.controller.ts index 68dab4dd..5958f073 100644 --- a/services/gateway/src/controller/product/category.controller.ts +++ b/services/gateway/src/controller/product/category.controller.ts @@ -15,12 +15,10 @@ categoryRoutes.get("/api/category", (_: Request, res: Response) => { categoryRoutes.get("/api/category/:id", (req: Request, res: Response) => { /* #swagger.parameters['id'] = { - in: 'path', - required: true, - schema: { - id: "category_id:1" - } - } */ + in: 'path', + required: true, + type: 'string' + } */ const { id } = req.params; categoryServiceClient.readCategory(new CategoryId().setId(id), (error, response) => { @@ -39,13 +37,11 @@ categoryRoutes.post("/api/category", withCheck({ role: "ACCOUNTANT" }), (req: Re hexaColor: "#ffffff", } } - #swagger.parameters['headers'] = { + #swagger.parameters['authorization'] = { in: 'header', required: true, - schema: { - Authorization: "Bearer " - } - } */ + type: 'string' + } */ const { label, icon, hexaColor } = req.body; const category = new Category().setLibelle(label).setIcon(icon).setHexaColor(hexaColor); categoryServiceClient.createCategory(category, (error, response) => { @@ -55,14 +51,7 @@ categoryRoutes.post("/api/category", withCheck({ role: "ACCOUNTANT" }), (req: Re }); categoryRoutes.put("/api/category/:id", withCheck({ role: "ACCOUNTANT" }), (req: Request, res: Response) => { - /* #swagger.parameters['id'] = { - in: 'path', - required: true, - schema: { - id: "category_id:1" - } - } - #swagger.parameters['body'] = { + /* #swagger.parameters['body'] = { in: 'body', required: true, schema: { @@ -71,13 +60,16 @@ categoryRoutes.put("/api/category/:id", withCheck({ role: "ACCOUNTANT" }), (req: hexaColor: "#ffffff", } } - #swagger.parameters['headers'] = { + #swagger.parameters['authorization'] = { in: 'header', required: true, - schema: { - Authorization: "Bearer " - } - } */ + type: 'string' + } + #swagger.parameters['id'] = { + in: 'path', + required: true, + type: 'string' + } */ const { id } = req.params; const { label, icon, hexaColor } = req.body; const category = new Category().setId(id).setLibelle(label).setIcon(icon).setHexaColor(hexaColor); @@ -88,21 +80,16 @@ categoryRoutes.put("/api/category/:id", withCheck({ role: "ACCOUNTANT" }), (req: }); categoryRoutes.delete("/api/category/:id", withCheck({ role: "ACCOUNTANT" }), (req: Request, res: Response) => { - /* #swagger.parameters['id'] = { - in: 'path', - required: true, - schema: { - id: "category_id:1" - } - } - - #swagger.parameters['headers'] = { + /* #swagger.parameters['authorization'] = { in: 'header', required: true, - schema: { - Authorization: "Bearer " - } - } */ + type: 'string' + } + #swagger.parameters['id'] = { + in: 'path', + required: true, + type: 'string' + } */ const { id } = req.params; categoryServiceClient.deleteCategory(new CategoryId().setId(id), (error, response) => { if (error) return res.status(500).send({ error }); diff --git a/services/gateway/src/controller/product/product.controller.ts b/services/gateway/src/controller/product/product.controller.ts index f2413144..0649808f 100644 --- a/services/gateway/src/controller/product/product.controller.ts +++ b/services/gateway/src/controller/product/product.controller.ts @@ -9,12 +9,10 @@ export const productRoutes = Router(); productRoutes.get("/api/product/by-restaurant/:id", (req: Request, res: Response) => { /* #swagger.parameters['id'] = { - in: 'path', - required: true, - schema: { - id: "restaurant_id:1" - } - } */ + in: 'path', + required: true, + type: 'string' + } */ const { id } = req.params; productServiceClient.getProductList(new RestaurantId().setId(id), (error, response) => { @@ -25,12 +23,10 @@ productRoutes.get("/api/product/by-restaurant/:id", (req: Request, res: Response productRoutes.get("/api/product/:id", (req: Request, res: Response) => { /* #swagger.parameters['id'] = { - in: 'path', - required: true, - schema: { - id: "product_id:1" - } - } */ + in: 'path', + required: true, + type: 'string' + } */ const { id } = req.params; productServiceClient.readProduct(new ProductId().setId(id), (error, response) => { if (error) return res.status(500).send({ error }); @@ -46,20 +42,16 @@ productRoutes.get("/api/product/type", (_: Request, res: Response) => { }); productRoutes.delete("/api/product/:id", withCheck({ role: "ACCOUNTANT" }), (req: Request, res: Response) => { - /* #swagger.parameters['id'] = { - in: 'path', - required: true, - schema: { - id: "product_id:1" - } - } - #swagger.parameters['headers'] = { + /* #swagger.parameters['authorization'] = { in: 'header', required: true, - schema: { - Authorization: "Bearer " - } - } */ + type: 'string' + } + #swagger.parameters['id'] = { + in: 'path', + required: true, + type: 'string' + } */ const { id } = req.params; const productId = new ProductId().setId(id); productServiceClient.deleteProduct(productId, (error, response) => { @@ -96,12 +88,10 @@ productRoutes.post("/api/product", withCheck({ role: "ACCOUNTANT" }), (req: Requ ], } } - #swagger.parameters['headers'] = { + #swagger.parameters['authorization'] = { in: 'header', required: true, - schema: { - Authorization: "Bearer " - } + type: 'string' } */ const { restaurantId, @@ -144,15 +134,7 @@ productRoutes.post("/api/product", withCheck({ role: "ACCOUNTANT" }), (req: Requ }); productRoutes.put("/api/product/:id", withCheck({ role: "ACCOUNTANT" }), (req: Request, res: Response) => { - /* #swagger.parameters['id'] = { - in: 'path', - required: true, - schema: { - id: "product_id:1" - } - } - - #swagger.parameters['body'] = { + /* #swagger.parameters['body'] = { in: 'body', required: true, schema: { @@ -179,13 +161,16 @@ productRoutes.put("/api/product/:id", withCheck({ role: "ACCOUNTANT" }), (req: R ], } } - #swagger.parameters['headers'] = { + #swagger.parameters['authorization'] = { in: 'header', required: true, - schema: { - Authorization: "Bearer " - } - } */ + type: 'string' + } + #swagger.parameters['id'] = { + in: 'path', + required: true, + type: 'string' + } */ const { id } = req.params; const { restaurantId, @@ -236,14 +221,11 @@ productRoutes.post("/api/product/image", withCheck({ role: "ACCOUNTANT" }), (req input_file: Buffer } } - #swagger.parameters['headers'] = { + #swagger.parameters['authorization'] = { in: 'header', required: true, - schema: { - Authorization: "Bearer " - } - } - */ + type: 'string' + } */ const { input_file } = req.body; const bitmap = fs.readFileSync(input_file); const base64File = new Buffer(bitmap).toString("base64"); diff --git a/services/gateway/src/controller/promotion/promotion.controller.ts b/services/gateway/src/controller/promotion/promotion.controller.ts index 5f23385a..a1ed6b74 100644 --- a/services/gateway/src/controller/promotion/promotion.controller.ts +++ b/services/gateway/src/controller/promotion/promotion.controller.ts @@ -6,6 +6,11 @@ import {Promotion, PromotionCode, PromotionCreateInput, PromotionId, RestaurantI export const promotionRoutes = Router(); promotionRoutes.get('/api/promotion/:code', (req, res) => { + /* #swagger.parameters['code'] = { + in: 'path', + required: true, + type: 'string' + } */ const {code} = req.params; promotionServiceClient.getPromotion(new PromotionCode().setCode(code), (error, response) => { if (error) { @@ -27,6 +32,11 @@ promotionRoutes.get('/api/promotion', (req, res) => { }); promotionRoutes.get('/api/promotion/by-restaurant/:restaurantId', (req, res) => { + /* #swagger.parameters['restaurantId'] = { + in: 'path', + required: true, + type: 'string' + } */ const {restaurantId} = req.params; promotionServiceClient.getPromotionsByRestaurant(new RestaurantId().setId(restaurantId), (error, response) => { if (error) { @@ -72,7 +82,12 @@ promotionRoutes.put('/api/promotion/:id', (req, res) => { method: {'$ref': '#/definitions/Method'}, restaurantId: "restaurant_id:0", } - } */ + } + #swagger.parameters['id'] = { + in: 'path', + required: true, + type: 'string' + } */ const {id} = req.params; const {code, reduction, method, restaurantId} = req.body; const promotionUpdateInput = new Promotion().setId(id).setCode(code) @@ -90,6 +105,11 @@ promotionRoutes.put('/api/promotion/:id', (req, res) => { }); promotionRoutes.delete('/api/promotion/:id', (req, res) => { + /* #swagger.parameters['id'] = { + in: 'path', + required: true, + type: 'string' + } */ const {id} = req.params; promotionServiceClient.deletePromotion(new PromotionId().setId(id), (error, response) => { diff --git a/services/gateway/src/controller/restaurant/restaurant.controller.ts b/services/gateway/src/controller/restaurant/restaurant.controller.ts index 5877dace..106733f2 100644 --- a/services/gateway/src/controller/restaurant/restaurant.controller.ts +++ b/services/gateway/src/controller/restaurant/restaurant.controller.ts @@ -7,6 +7,11 @@ import {ByLocationInput, Restaurant, RestaurantCreateInput} from "@gateway/proto export const restaurantRoutes = Router(); restaurantRoutes.get('/api/restaurant/:id', (req: Request, res: Response) => { + /* #swagger.parameters['id'] = { + in: 'path', + required: true, + type: 'string' + } */ const {id} = req.params; restaurantServiceClient.getRestaurant(new RestaurantId().setId(id), (error, response) => { diff --git a/services/gateway/src/controller/stock/stock.controller.ts b/services/gateway/src/controller/stock/stock.controller.ts index 88622ffc..574cadb9 100644 --- a/services/gateway/src/controller/stock/stock.controller.ts +++ b/services/gateway/src/controller/stock/stock.controller.ts @@ -155,24 +155,6 @@ stockRoutes.delete('/api/stock/ingredient/:id', (req: Request, res: Response) => }); }); -stockRoutes.delete('/api/stock/ingredient/:id', (req: Request, res: Response) => { - /* #swagger.parameters['id'] = { - in: 'path', - required: true, - type: 'integer' - }*/ - const {id} = req.params - const ingredientRequest = new DeleteIngredientRequest().setId(Number(id)); - - stockServiceClient.deleteIngredient(ingredientRequest, (error, response) => { - if (error) { - res.status(500).send({error: error.message}); - } else { - res.json(response.toObject()); - } - }); -}); - /** * Ingredient Restaurant Routes */ diff --git a/services/gateway/src/controller/stock/stockPerson.controller.ts b/services/gateway/src/controller/stock/stockPerson.controller.ts index a1a14eea..ba929c09 100644 --- a/services/gateway/src/controller/stock/stockPerson.controller.ts +++ b/services/gateway/src/controller/stock/stockPerson.controller.ts @@ -12,7 +12,11 @@ stockPersonRoutes.post('/api/stock/outcomes/by-restaurant/:id', (req: Request, r date: "2022-01-01T00:00:00.000Z", interval: "interval-example" } - } */ + } #swagger.parameters['id'] = { + in: 'path', + required: true, + type: 'string' + } */ const {id} = req.params; const {date, interval} = req.body; const outcomesByRestaurantRequest = new GetOutcomesByRestaurantRequest().setRestaurantId(id).setDate(date).setInterval(interval); diff --git a/services/gateway/src/controller/user/user.controller.ts b/services/gateway/src/controller/user/user.controller.ts index 77424457..80117177 100644 --- a/services/gateway/src/controller/user/user.controller.ts +++ b/services/gateway/src/controller/user/user.controller.ts @@ -19,14 +19,12 @@ import {check, withCheck} from "@gateway/middleware/auth"; export const userRoutes = Router(); userRoutes.get("/api/user/:id", async (req: Request, res: Response) => { - /* #swagger.parameters['header'] = { - in: 'header', - required: true, - schema: { - Authorization: "Bearer " - } - } - #swagger.parameters['id'] = { + /* #swagger.parameters['authorization'] = { + in: 'header', + required: true, + type: 'string' + } + #swagger.parameters['id'] = { in: 'path', required: true, type: 'integer' @@ -47,12 +45,10 @@ userRoutes.get("/api/user/:id", async (req: Request, res: Response) => { }); userRoutes.get("/api/user", withCheck({ role: "ADMIN" }), (req: Request, res: Response) => { - /* #swagger.parameters['header'] = { + /* #swagger.parameters['authorization'] = { in: 'header', required: true, - schema: { - Authorization: "Bearer " - } + type: 'string' } */ userServiceClient.listUser(new Empty(), (error, response) => { if (error) res.status(500).send({ error: error.message }); @@ -104,12 +100,10 @@ userRoutes.post("/api/user/register", (req: Request, res: Response) => { }); userRoutes.put("/api/user", async (req: Request, res: Response) => { - /* #swagger.parameters['header'] = { + /* #swagger.parameters['authorization'] = { in: 'header', required: true, - schema: { - Authorization: "Bearer " - } + type: 'string' } #swagger.parameters['body'] = { in: 'body', @@ -165,12 +159,10 @@ userRoutes.put("/api/user", async (req: Request, res: Response) => { }); userRoutes.delete('/api/user/:id', (req: Request, res: Response) => { - /* #swagger.parameters['header'] = { + /* #swagger.parameters['authorization'] = { in: 'header', required: true, - schema: { - Authorization: "Bearer " - } + type: 'string' } #swagger.parameters['id'] = { in: 'path', @@ -213,12 +205,10 @@ userRoutes.post("/api/user/login", (req: Request, res: Response) => { }); userRoutes.post("/api/user/validate", (req: Request, res: Response) => { - /* #swagger.parameters['header'] = { + /* #swagger.parameters['authorization'] = { in: 'header', required: true, - schema: { - Authorization: "Bearer " - } + type: 'string' } */ const { authorization } = req.headers; if (!authorization) return res.status(401).json({ message: "Unauthorized" }); @@ -235,12 +225,10 @@ userRoutes.post("/api/user/validate", (req: Request, res: Response) => { }); userRoutes.put('/api/user/password', (req: Request, res: Response) => { - /* #swagger.parameters['header'] = { + /* #swagger.parameters['authorization'] = { in: 'header', required: true, - schema: { - Authorization: "Bearer " - } + type: 'string' } #swagger.parameters['body'] = { in: 'body', @@ -272,12 +260,10 @@ userRoutes.put('/api/user/password', (req: Request, res: Response) => { }); userRoutes.put('/api/user/:id/role', withCheck({ role: "ADMIN" }), (req: Request, res: Response) => { - /* #swagger.parameters['header'] = { + /* #swagger.parameters['authorization'] = { in: 'header', required: true, - schema: { - Authorization: "Bearer " - } + type: 'string' } #swagger.parameters['id'] = { in: 'path', diff --git a/services/gateway/src/lib/swagger/swagger-output.json b/services/gateway/src/lib/swagger/swagger-output.json index f05931fa..584364ec 100644 --- a/services/gateway/src/lib/swagger/swagger-output.json +++ b/services/gateway/src/lib/swagger/swagger-output.json @@ -23,15 +23,27 @@ "in": "path", "required": true, "type": "integer" + }, + { + "name": "authorization", + "in": "header", + "required": true, + "type": "string" } ], "responses": { "200": { "description": "OK" + }, + "401": { + "description": "Unauthorized" + }, + "403": { + "description": "Forbidden" } } }, - "put": { + "delete": { "tags": [ "User" ], @@ -46,6 +58,56 @@ { "name": "authorization", "in": "header", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + }, + "401": { + "description": "Unauthorized" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/user": { + "get": { + "tags": [ + "User" + ], + "description": "", + "parameters": [ + { + "name": "authorization", + "in": "header", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + }, + "500": { + "description": "Internal Server Error" + } + } + }, + "put": { + "tags": [ + "User" + ], + "description": "", + "parameters": [ + { + "name": "authorization", + "in": "header", + "required": true, "type": "string" }, { @@ -106,48 +168,8 @@ "200": { "description": "OK" }, - "500": { - "description": "Internal Server Error" - } - } - }, - "delete": { - "tags": [ - "User" - ], - "description": "", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "type": "integer" - }, - { - "name": "authorization", - "in": "header", - "type": "string" - } - ], - "responses": { - "200": { - "description": "OK" - }, - "500": { - "description": "Internal Server Error" - } - } - } - }, - "/api/user": { - "get": { - "tags": [ - "User" - ], - "description": "", - "responses": { - "200": { - "description": "OK" + "401": { + "description": "Unauthorized" }, "500": { "description": "Internal Server Error" @@ -272,6 +294,7 @@ { "name": "authorization", "in": "header", + "required": true, "type": "string" } ], @@ -279,28 +302,26 @@ "200": { "description": "OK" }, + "401": { + "description": "Unauthorized" + }, "500": { "description": "Internal Server Error" } } } }, - "/api/user/{id}/password": { + "/api/user/password": { "put": { "tags": [ "User" ], "description": "", "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "type": "string" - }, { "name": "authorization", "in": "header", + "required": true, "type": "string" }, { @@ -326,6 +347,9 @@ "200": { "description": "OK" }, + "401": { + "description": "Unauthorized" + }, "500": { "description": "Internal Server Error" } @@ -348,6 +372,7 @@ { "name": "authorization", "in": "header", + "required": true, "type": "string" }, { @@ -455,7 +480,7 @@ } } }, - "/api/basket/{userId}": { + "/api/basket/": { "get": { "tags": [ "Basket" @@ -463,16 +488,18 @@ "description": "", "parameters": [ { - "name": "userId", - "in": "path", - "required": true, - "type": "integer" + "name": "authorization", + "in": "header", + "type": "string" } ], "responses": { "200": { "description": "OK" }, + "401": { + "description": "Unauthorized" + }, "500": { "description": "Internal Server Error" } @@ -486,6 +513,11 @@ ], "description": "", "parameters": [ + { + "name": "authorization", + "in": "header", + "type": "string" + }, { "name": "body", "in": "body", @@ -493,10 +525,6 @@ "schema": { "type": "object", "properties": { - "userId": { - "type": "number", - "example": 0 - }, "productId": { "type": "string", "example": "product_id:0" @@ -513,6 +541,9 @@ "200": { "description": "OK" }, + "401": { + "description": "Unauthorized" + }, "500": { "description": "Internal Server Error" } @@ -526,6 +557,11 @@ ], "description": "", "parameters": [ + { + "name": "authorization", + "in": "header", + "type": "string" + }, { "name": "body", "in": "body", @@ -533,10 +569,6 @@ "schema": { "type": "object", "properties": { - "userId": { - "type": "number", - "example": 0 - }, "productId": { "type": "string", "example": "product_id:0" @@ -553,6 +585,9 @@ "200": { "description": "OK" }, + "401": { + "description": "Unauthorized" + }, "500": { "description": "Internal Server Error" } @@ -566,6 +601,11 @@ ], "description": "", "parameters": [ + { + "name": "authorization", + "in": "header", + "type": "string" + }, { "name": "body", "in": "body", @@ -573,10 +613,6 @@ "schema": { "type": "object", "properties": { - "userId": { - "type": "number", - "example": 0 - }, "restaurantId": { "type": "string", "example": "restaurant_id:0" @@ -589,6 +625,9 @@ "200": { "description": "OK" }, + "401": { + "description": "Unauthorized" + }, "500": { "description": "Internal Server Error" } @@ -603,24 +642,18 @@ "description": "", "parameters": [ { - "name": "body", - "in": "body", - "required": true, - "schema": { - "type": "object", - "properties": { - "userId": { - "type": "number", - "example": 0 - } - } - } + "name": "authorization", + "in": "header", + "type": "string" } ], "responses": { "200": { "description": "OK" }, + "401": { + "description": "Unauthorized" + }, "500": { "description": "Internal Server Error" } @@ -639,11 +672,17 @@ "in": "path", "required": true, "type": "string" + }, + { + "name": "authorization", + "in": "header", + "required": true, + "type": "string" } ], "responses": { - "200": { - "description": "OK" + "401": { + "description": "Unauthorized" }, "500": { "description": "Internal Server Error" @@ -663,12 +702,21 @@ "in": "path", "required": true, "type": "string" + }, + { + "name": "authorization", + "in": "header", + "required": true, + "type": "string" } ], "responses": { "200": { "description": "OK" }, + "401": { + "description": "Unauthorized" + }, "500": { "description": "Internal Server Error" } @@ -731,12 +779,24 @@ "in": "path", "required": true, "type": "string" + }, + { + "name": "authorization", + "in": "header", + "required": true, + "type": "string" } ], "responses": { "200": { "description": "OK" }, + "401": { + "description": "Unauthorized" + }, + "404": { + "description": "Not Found" + }, "500": { "description": "Internal Server Error" } @@ -757,10 +817,6 @@ "schema": { "type": "object", "properties": { - "userId": { - "type": "number", - "example": 0 - }, "paymentId": { "type": "string", "example": "payment_id:1" @@ -778,12 +834,21 @@ } } } + }, + { + "name": "authorization", + "in": "header", + "required": true, + "type": "string" } ], "responses": { "200": { "description": "OK" }, + "401": { + "description": "Unauthorized" + }, "404": { "description": "Not Found" }, @@ -805,12 +870,21 @@ "in": "path", "required": true, "type": "string" + }, + { + "name": "authorization", + "in": "header", + "required": true, + "type": "string" } ], "responses": { "200": { "description": "OK" }, + "401": { + "description": "Unauthorized" + }, "500": { "description": "Internal Server Error" } @@ -836,6 +910,12 @@ } } } + }, + { + "name": "authorization", + "in": "header", + "required": true, + "type": "string" } ], "responses": { @@ -860,12 +940,26 @@ "in": "path", "required": true, "type": "string" + }, + { + "name": "deliveryId", + "in": "query", + "type": "string" + }, + { + "name": "authorization", + "in": "header", + "required": true, + "type": "string" } ], "responses": { "200": { "description": "OK" }, + "401": { + "description": "Unauthorized" + }, "500": { "description": "Internal Server Error" } @@ -884,12 +978,21 @@ "in": "path", "required": true, "type": "string" + }, + { + "name": "authorization", + "in": "header", + "required": true, + "type": "string" } ], "responses": { "200": { "description": "OK" }, + "401": { + "description": "Unauthorized" + }, "500": { "description": "Internal Server Error" } @@ -933,6 +1036,12 @@ } } } + }, + { + "name": "authorization", + "in": "header", + "required": true, + "type": "string" } ], "responses": { @@ -955,6 +1064,12 @@ "in": "path", "required": true, "type": "string" + }, + { + "name": "authorization", + "in": "header", + "required": true, + "type": "string" } ], "responses": { @@ -1009,11 +1124,17 @@ } } } + }, + { + "name": "authorization", + "in": "header", + "required": true, + "type": "string" } ], "responses": { - "200": { - "description": "OK" + "201": { + "description": "Created" }, "500": { "description": "Internal Server Error" @@ -1077,6 +1198,12 @@ } } } + }, + { + "name": "authorization", + "in": "header", + "required": true, + "type": "string" } ], "responses": { @@ -1099,6 +1226,12 @@ "in": "path", "required": true, "type": "string" + }, + { + "name": "authorization", + "in": "header", + "required": true, + "type": "string" } ], "responses": { @@ -1145,11 +1278,17 @@ } } } + }, + { + "name": "authorization", + "in": "header", + "required": true, + "type": "string" } ], "responses": { - "200": { - "description": "OK" + "201": { + "description": "Created" }, "500": { "description": "Internal Server Error" @@ -1205,6 +1344,12 @@ } } } + }, + { + "name": "authorization", + "in": "header", + "required": true, + "type": "string" } ], "responses": { @@ -1227,6 +1372,12 @@ "in": "path", "required": true, "type": "string" + }, + { + "name": "authorization", + "in": "header", + "required": true, + "type": "string" } ], "responses": { @@ -1297,6 +1448,12 @@ "in": "path", "required": true, "type": "string" + }, + { + "name": "authorization", + "in": "header", + "required": true, + "type": "string" } ], "responses": { @@ -1401,6 +1558,12 @@ } } } + }, + { + "name": "authorization", + "in": "header", + "required": true, + "type": "string" } ], "responses": { @@ -1517,11 +1680,17 @@ } } } + }, + { + "name": "authorization", + "in": "header", + "required": true, + "type": "string" } ], "responses": { - "200": { - "description": "OK" + "201": { + "description": "Created" }, "500": { "description": "Internal Server Error" @@ -1539,14 +1708,21 @@ { "name": "body", "in": "body", + "required": true, "schema": { "type": "object", "properties": { "input_file": { - "example": "any" + "type": "function" } } } + }, + { + "name": "authorization", + "in": "header", + "required": true, + "type": "string" } ], "responses": { @@ -1801,12 +1977,21 @@ "in": "path", "required": true, "type": "string" + }, + { + "name": "authorization", + "in": "header", + "required": true, + "type": "string" } ], "responses": { "200": { "description": "OK" }, + "401": { + "description": "Unauthorized" + }, "500": { "description": "Internal Server Error" } @@ -1856,6 +2041,12 @@ } } } + }, + { + "name": "authorization", + "in": "header", + "required": true, + "type": "string" } ], "responses": { @@ -1865,6 +2056,9 @@ "400": { "description": "Bad Request" }, + "401": { + "description": "Unauthorized" + }, "500": { "description": "Internal Server Error" } @@ -1881,12 +2075,21 @@ "in": "path", "required": true, "type": "string" + }, + { + "name": "authorization", + "in": "header", + "required": true, + "type": "string" } ], "responses": { "200": { "description": "OK" }, + "401": { + "description": "Unauthorized" + }, "500": { "description": "Internal Server Error" } @@ -1905,6 +2108,12 @@ "in": "path", "required": true, "type": "string" + }, + { + "name": "authorization", + "in": "header", + "required": true, + "type": "string" } ], "responses": { @@ -1917,7 +2126,7 @@ } } }, - "/api/delivery/by-user/{id}": { + "/api/delivery/by-user": { "get": { "tags": [ "Delivery" @@ -1925,8 +2134,8 @@ "description": "", "parameters": [ { - "name": "id", - "in": "path", + "name": "authorization", + "in": "header", "required": true, "type": "string" } @@ -1935,6 +2144,9 @@ "200": { "description": "OK" }, + "401": { + "description": "Unauthorized" + }, "500": { "description": "Internal Server Error" } @@ -1970,25 +2182,30 @@ "type": "string", "example": "cllcdmeci0000pm01su98mxtb" }, - "userId": { - "type": "string", - "example": "user_id:1" - }, "restaurantId": { "type": "string", "example": "restaurant_id:1" } } } + }, + { + "name": "authorization", + "in": "header", + "required": true, + "type": "string" } ], "responses": { - "200": { - "description": "OK" + "201": { + "description": "Created" }, "400": { "description": "Bad Request" }, + "401": { + "description": "Unauthorized" + }, "500": { "description": "Internal Server Error" } @@ -2007,12 +2224,20 @@ "in": "path", "required": true, "type": "string" + }, + { + "name": "authorization", + "in": "header", + "type": "string" } ], "responses": { "200": { "description": "OK" }, + "401": { + "description": "Unauthorized" + }, "500": { "description": "Internal Server Error" } @@ -2033,23 +2258,40 @@ { "name": "body", "in": "body", + "required": true, "schema": { "type": "object", "properties": { "firstName": { - "example": "any" + "type": "string", + "example": "John" }, "lastName": { - "example": "any" + "type": "string", + "example": "Doe" }, "phone": { - "example": "any" + "type": "string", + "example": "0612345678" }, "locationList": { - "example": "any" + "type": "array", + "example": [ + 41.40338, + 2.17403 + ], + "items": { + "type": "number" + } } } } + }, + { + "name": "authorization", + "in": "header", + "required": true, + "type": "string" } ], "responses": { @@ -2072,6 +2314,12 @@ "in": "path", "required": true, "type": "string" + }, + { + "name": "authorization", + "in": "header", + "required": true, + "type": "string" } ], "responses": { @@ -2090,6 +2338,14 @@ "Delivery" ], "description": "", + "parameters": [ + { + "name": "authorization", + "in": "header", + "required": true, + "type": "string" + } + ], "responses": { "200": { "description": "OK" @@ -2108,29 +2364,84 @@ { "name": "body", "in": "body", + "required": true, "schema": { "type": "object", "properties": { "firstName": { - "example": "any" + "type": "string", + "example": "John" }, "lastName": { - "example": "any" + "type": "string", + "example": "Doe" }, "phone": { - "example": "any" + "type": "string", + "example": "0612345678" }, "locationList": { - "example": "any" + "type": "array", + "example": [ + 41.40338, + 2.17403 + ], + "items": { + "type": "number" + } } } } + }, + { + "name": "authorization", + "in": "header", + "required": true, + "type": "string" + } + ], + "responses": { + "201": { + "description": "Created" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/delivery-person/near": { + "get": { + "tags": [ + "Delivery" + ], + "description": "", + "parameters": [ + { + "name": "authorization", + "in": "header", + "type": "string" + }, + { + "name": "lat", + "in": "query", + "required": true, + "type": "integer" + }, + { + "name": "lng", + "in": "query", + "required": true, + "type": "integer" } ], "responses": { "200": { "description": "OK" }, + "401": { + "description": "Unauthorized" + }, "500": { "description": "Internal Server Error" } @@ -2143,6 +2454,14 @@ "Log" ], "description": "", + "parameters": [ + { + "name": "authorization", + "in": "header", + "required": true, + "type": "string" + } + ], "responses": { "200": { "description": "OK" @@ -2164,6 +2483,12 @@ "name": "id", "in": "path", "required": true, + "type": "number" + }, + { + "name": "authorization", + "in": "header", + "required": true, "type": "string" } ], @@ -2189,6 +2514,12 @@ "in": "path", "required": true, "type": "string" + }, + { + "name": "authorization", + "in": "header", + "required": true, + "type": "string" } ], "responses": { @@ -2225,6 +2556,12 @@ } } } + }, + { + "name": "authorization", + "in": "header", + "required": true, + "type": "string" } ], "responses": { @@ -2249,6 +2586,12 @@ "in": "path", "required": true, "type": "string" + }, + { + "name": "authorization", + "in": "header", + "required": true, + "type": "string" } ], "responses": { @@ -2272,7 +2615,13 @@ "name": "restaurantGroupId", "in": "path", "required": true, - "type": "integer" + "type": "string" + }, + { + "name": "authorization", + "in": "header", + "required": true, + "type": "string" } ], "responses": { @@ -2297,6 +2646,12 @@ "in": "path", "required": true, "type": "string" + }, + { + "name": "authorization", + "in": "header", + "required": true, + "type": "string" } ], "responses": { @@ -2345,6 +2700,12 @@ } } } + }, + { + "name": "authorization", + "in": "header", + "required": true, + "type": "string" } ], "responses": { @@ -2367,6 +2728,12 @@ "in": "path", "required": true, "type": "string" + }, + { + "name": "authorization", + "in": "header", + "required": true, + "type": "string" } ], "responses": { @@ -2414,6 +2781,11 @@ "required": true, "type": "integer" }, + { + "name": "restaurantGroupId", + "in": "query", + "type": "string" + }, { "name": "body", "in": "body", @@ -2427,6 +2799,12 @@ } } } + }, + { + "name": "authorization", + "in": "header", + "required": true, + "type": "string" } ], "responses": { @@ -2449,6 +2827,12 @@ "in": "path", "required": true, "type": "integer" + }, + { + "name": "authorization", + "in": "header", + "required": true, + "type": "string" } ], "responses": { @@ -2493,11 +2877,17 @@ } } } + }, + { + "name": "authorization", + "in": "header", + "required": true, + "type": "string" } ], "responses": { - "200": { - "description": "OK" + "201": { + "description": "Created" }, "500": { "description": "Internal Server Error" @@ -2525,11 +2915,17 @@ } } } + }, + { + "name": "authorization", + "in": "header", + "required": true, + "type": "string" } ], "responses": { - "200": { - "description": "OK" + "201": { + "description": "Created" }, "500": { "description": "Internal Server Error" @@ -2569,11 +2965,17 @@ } } } + }, + { + "name": "authorization", + "in": "header", + "required": true, + "type": "string" } ], "responses": { - "200": { - "description": "OK" + "201": { + "description": "Created" }, "500": { "description": "Internal Server Error" From 036fd2438142ccc94cb24a719028f280d8efbdcc Mon Sep 17 00:00:00 2001 From: anatole Date: Fri, 25 Aug 2023 18:34:57 +0200 Subject: [PATCH 479/883] feat(gateway): clean the swagger in promotion and restaurant controller --- .../promotion/promotion.controller.ts | 54 ++++----------- .../restaurant/restaurant.controller.ts | 53 ++++++--------- .../src/lib/swagger/swagger-output.json | 67 +++++++++++++++++-- 3 files changed, 96 insertions(+), 78 deletions(-) diff --git a/services/gateway/src/controller/promotion/promotion.controller.ts b/services/gateway/src/controller/promotion/promotion.controller.ts index 0a0cbe3a..4e32e60d 100644 --- a/services/gateway/src/controller/promotion/promotion.controller.ts +++ b/services/gateway/src/controller/promotion/promotion.controller.ts @@ -51,18 +51,14 @@ promotionRoutes.get( withCheck({ role: "ACCOUNTANT" }), async (req, res) => { /* #swagger.parameters['restaurantId'] = { - in: 'path', - required: true, - schema: { - restaurantId: "restaurant_id:0" - } - } - #swagger.parameters['headers'] = { + in: 'path', + required: true, + type: 'string' + } + #swagger.parameters['header'] = { in: 'header', required: true, - schema: { - Authorization: "Bearer " - } + type: 'string' } */ // Auth check and :id check --- @@ -95,12 +91,10 @@ promotionRoutes.post("/api/promotion", withCheck({ role: "ACCOUNTANT" }), (req, method: {'$ref': '#/definitions/Method'}, restaurantId: "restaurant_id:0", } - } #swagger.parameters['headers'] = { + } #swagger.parameters['header'] = { in: 'header', required: true, - schema: { - Authorization: "Bearer " - } + type: 'string' } */ const { code, reduction, method, restaurantId } = req.body; const promotionCreateInput = new PromotionCreateInput() @@ -115,15 +109,7 @@ promotionRoutes.post("/api/promotion", withCheck({ role: "ACCOUNTANT" }), (req, }); promotionRoutes.put("/api/promotion/:id", withCheck({ role: "ACCOUNTANT" }), (req, res) => { - /* #swagger.parameters['id'] = { - in: 'path', - required: true, - schema: { - id: "promotion_id:1" - } - } - - #swagger.parameters['body'] = { + /* #swagger.parameters['body'] = { in: 'body', required: true, schema: { @@ -133,12 +119,10 @@ promotionRoutes.put("/api/promotion/:id", withCheck({ role: "ACCOUNTANT" }), (re restaurantId: "restaurant_id:0", } } - #swagger.parameters['headers'] = { + #swagger.parameters['header'] = { in: 'header', required: true, - schema: { - Authorization: "Bearer " - } + type: 'string' } #swagger.parameters['id'] = { in: 'path', @@ -161,22 +145,12 @@ promotionRoutes.put("/api/promotion/:id", withCheck({ role: "ACCOUNTANT" }), (re }); promotionRoutes.delete("/api/promotion/:id", withCheck({ role: "ACCOUNTANT" }), (req, res) => { - /* #swagger.parameters['id'] = { - in: 'path', - required: true, - schema: { - id: "promotion_id:1" - } - } - #swagger.parameters['headers'] = { + /* #swagger.parameters['header'] = { in: 'header', required: true, - schema: { - Authorization: "Bearer " - } + type: 'string' } - */ - /* #swagger.parameters['id'] = { + #swagger.parameters['id'] = { in: 'path', required: true, type: 'string' diff --git a/services/gateway/src/controller/restaurant/restaurant.controller.ts b/services/gateway/src/controller/restaurant/restaurant.controller.ts index 7c89d688..f7fb77d5 100644 --- a/services/gateway/src/controller/restaurant/restaurant.controller.ts +++ b/services/gateway/src/controller/restaurant/restaurant.controller.ts @@ -12,8 +12,7 @@ restaurantRoutes.get("/api/restaurant/:id", (req: Request, res: Response) => { in: 'path', required: true, type: 'string' - } - */ + } */ const { id } = req.params; restaurantServiceClient.getRestaurant(new RestaurantId().setId(id), (error, response) => { @@ -62,14 +61,11 @@ restaurantRoutes.post("/api/restaurant", withCheck({ role: "ADMIN" }), (req: Req phone: "restaurant-phone" } } - #swagger.parameters['headers'] = { + #swagger.parameters['header'] = { in: 'header', required: true, - schema: { - Authorization: "Bearer " - } - } - */ + type: 'string' + } */ const { name, description, locationList, address, openingHoursList, phone } = req.body; const restaurantCreateInput = new RestaurantCreateInput() .setName(name) @@ -89,13 +85,10 @@ restaurantRoutes.put( "/api/restaurant/:id", withCheck({ role: ["ADMIN", "ACCOUNTANT"] }), (req: Request, res: Response) => { - /* - #swagger.parameters['id'] = { + /* #swagger.parameters['id'] = { in: 'path', required: true, - schema: { - id: "restaurant-id:1" - } + type: 'string' } #swagger.parameters['body'] = { in: 'body', @@ -109,14 +102,11 @@ restaurantRoutes.put( phone: "restaurant-phone" } } - #swagger.parameters['headers'] = { + #swagger.parameters['header'] = { in: 'header', required: true, - schema: { - Authorization: "Bearer " - } - } - */ + type: 'string' + } */ const { id } = req.params; const { name, description, locationList, address, openingHoursList, phone } = req.body; const restaurantCreateInput = new Restaurant() @@ -136,21 +126,16 @@ restaurantRoutes.put( ); restaurantRoutes.delete("/api/restaurant/:id", withCheck({ role: "ADMIN" }), (req: Request, res: Response) => { - /* - #swagger.parameters['id'] = { - in: 'path', - required: true, - schema: { - id: "restaurant-id:1" - } - } - #swagger.parameters['headers'] = { - in: 'header', - required: true, - schema: { - Authorization: "Bearer " - } - } + /* #swagger.parameters['id'] = { + in: 'path', + required: true, + type: 'string' + } + #swagger.parameters['header'] = { + in: 'header', + required: true, + type: 'string' + } */ const { id } = req.params; diff --git a/services/gateway/src/lib/swagger/swagger-output.json b/services/gateway/src/lib/swagger/swagger-output.json index 584364ec..46e5d828 100644 --- a/services/gateway/src/lib/swagger/swagger-output.json +++ b/services/gateway/src/lib/swagger/swagger-output.json @@ -1815,6 +1815,12 @@ } } } + }, + { + "name": "header", + "in": "header", + "required": true, + "type": "string" } ], "responses": { @@ -1837,6 +1843,12 @@ "in": "path", "required": true, "type": "string" + }, + { + "name": "header", + "in": "header", + "required": true, + "type": "string" } ], "responses": { @@ -1915,11 +1927,17 @@ } } } + }, + { + "name": "header", + "in": "header", + "required": true, + "type": "string" } ], "responses": { - "200": { - "description": "OK" + "201": { + "description": "Created" }, "500": { "description": "Internal Server Error" @@ -2995,12 +3013,21 @@ "in": "path", "required": true, "type": "string" + }, + { + "name": "authorization", + "in": "header", + "required": true, + "type": "string" } ], "responses": { "200": { "description": "OK" }, + "401": { + "description": "Unauthorized" + }, "500": { "description": "Internal Server Error" } @@ -3052,11 +3079,17 @@ } } } + }, + { + "name": "header", + "in": "header", + "required": true, + "type": "string" } ], "responses": { - "200": { - "description": "OK" + "201": { + "description": "Created" }, "500": { "description": "Internal Server Error" @@ -3076,12 +3109,26 @@ "in": "path", "required": true, "type": "string" + }, + { + "name": "authorization", + "in": "header", + "type": "string" + }, + { + "name": "header", + "in": "header", + "required": true, + "type": "string" } ], "responses": { "200": { "description": "OK" }, + "401": { + "description": "Unauthorized" + }, "500": { "description": "Internal Server Error" } @@ -3125,6 +3172,12 @@ } } } + }, + { + "name": "header", + "in": "header", + "required": true, + "type": "string" } ], "responses": { @@ -3147,6 +3200,12 @@ "in": "path", "required": true, "type": "string" + }, + { + "name": "header", + "in": "header", + "required": true, + "type": "string" } ], "responses": { From 639d4f88fdd02f60f626b3ce9a082c215e212845 Mon Sep 17 00:00:00 2001 From: anatole Date: Fri, 25 Aug 2023 18:57:31 +0200 Subject: [PATCH 480/883] feat(gateway): fix the middleware and user controller --- services/gateway/src/controller/user/user.controller.ts | 3 ++- services/gateway/src/middleware/auth.ts | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/services/gateway/src/controller/user/user.controller.ts b/services/gateway/src/controller/user/user.controller.ts index 80117177..b3279e04 100644 --- a/services/gateway/src/controller/user/user.controller.ts +++ b/services/gateway/src/controller/user/user.controller.ts @@ -38,7 +38,8 @@ userRoutes.get("/api/user/:id", async (req: Request, res: Response) => { if (!(await check(token, { id: Number(id) }))) return res.status(403).json({ message: "Forbidden" }); try { - res.json(getUser(Number(id))); + const user = await getUser(Number(id)) + res.json(user?.toObject()); } catch (e: any) { res.json({ error: e.message }); } diff --git a/services/gateway/src/middleware/auth.ts b/services/gateway/src/middleware/auth.ts index faa17650..02538223 100644 --- a/services/gateway/src/middleware/auth.ts +++ b/services/gateway/src/middleware/auth.ts @@ -43,7 +43,7 @@ export const check = async ( export const withCheck = (expect: { role?: Role | Role[]; id?: number }) => async (req: Request, res: Response, next: NextFunction) => { const { role, id } = expect; - const token = req.headers.authorization?.split("Bearer ")[0]; + const token = req.headers.authorization?.split("Bearer ")[1]; if (!token) return res.status(401).json({ message: "Unauthorized" }); try { From 1f14c429d2c3467fa1d5915018bd29c0e15382af Mon Sep 17 00:00:00 2001 From: Pierre Lebigre Date: Sat, 26 Aug 2023 11:47:43 +0200 Subject: [PATCH 481/883] Entrypoint pour restaurant --- services/basket/package-lock.json | 165 - services/basket/pnpm-lock.yaml | 2122 ------------ services/gateway/.gitignore | 1 + services/restaurant/.env.docker | 2 +- services/restaurant/Dockerfile | 8 +- services/restaurant/package-lock.json | 1434 +++++++++ services/restaurant/pnpm-lock.yaml | 999 ------ services/restaurant/script.sh | 5 + services/stock/package-lock.json | 4256 +++++++++++++++++++++++++ services/stock/pnpm-lock.yaml | 2504 --------------- 10 files changed, 5704 insertions(+), 5792 deletions(-) delete mode 100644 services/basket/pnpm-lock.yaml create mode 100644 services/restaurant/package-lock.json delete mode 100644 services/restaurant/pnpm-lock.yaml create mode 100644 services/restaurant/script.sh create mode 100644 services/stock/package-lock.json delete mode 100644 services/stock/pnpm-lock.yaml diff --git a/services/basket/package-lock.json b/services/basket/package-lock.json index 92e624ce..a56a6e57 100644 --- a/services/basket/package-lock.json +++ b/services/basket/package-lock.json @@ -8,10 +8,8 @@ "dependencies": { "@grpc/grpc-js": "^1.8.13", "@grpc/proto-loader": "0.7.6", - "@prisma/client": "4.16.2", "amqplib": "^0.10.3", "dotenv": "^16.0.3", - "prisma-redis-middleware": "4.8.0", "protobufjs": "7.2.2", "redis": "^4.6.7" }, @@ -25,7 +23,6 @@ "esbuild": "^0.17.14", "nodemon": "^2.0.22", "pkg": "^5.8.1", - "prisma": "4.16.2", "ts-node": "10.9.1", "tsconfig-paths": "^4.1.2", "typescript": "5.0.2", @@ -508,11 +505,6 @@ "node": ">=6" } }, - "node_modules/@ioredis/commands": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@ioredis/commands/-/commands-1.2.0.tgz", - "integrity": "sha512-Sx1pU8EM64o2BrqNpEO1CNLtKQwyhuXuqyfH7oGKCk+1a33d2r5saW8zNwm3j6BTExtjrv2BxTgzzkMwts6vGg==" - }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", @@ -596,38 +588,6 @@ "node": ">= 8" } }, - "node_modules/@prisma/client": { - "version": "4.16.2", - "resolved": "https://registry.npmjs.org/@prisma/client/-/client-4.16.2.tgz", - "integrity": "sha512-qCoEyxv1ZrQ4bKy39GnylE8Zq31IRmm8bNhNbZx7bF2cU5aiCCnSa93J2imF88MBjn7J9eUQneNxUQVJdl/rPQ==", - "hasInstallScript": true, - "dependencies": { - "@prisma/engines-version": "4.16.1-1.4bc8b6e1b66cb932731fb1bdbbc550d1e010de81" - }, - "engines": { - "node": ">=14.17" - }, - "peerDependencies": { - "prisma": "*" - }, - "peerDependenciesMeta": { - "prisma": { - "optional": true - } - } - }, - "node_modules/@prisma/engines": { - "version": "4.16.2", - "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-4.16.2.tgz", - "integrity": "sha512-vx1nxVvN4QeT/cepQce68deh/Turxy5Mr+4L4zClFuK1GlxN3+ivxfuv+ej/gvidWn1cE1uAhW7ALLNlYbRUAw==", - "devOptional": true, - "hasInstallScript": true - }, - "node_modules/@prisma/engines-version": { - "version": "4.16.1-1.4bc8b6e1b66cb932731fb1bdbbc550d1e010de81", - "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-4.16.1-1.4bc8b6e1b66cb932731fb1bdbbc550d1e010de81.tgz", - "integrity": "sha512-q617EUWfRIDTriWADZ4YiWRZXCa/WuhNgLTVd+HqWLffjMSPzyM5uOWoauX91wvQClSKZU4pzI4JJLQ9Kl62Qg==" - }, "node_modules/@protobufjs/aspromise": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", @@ -967,15 +927,6 @@ "node": "*" } }, - "node_modules/async-cache-dedupe": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/async-cache-dedupe/-/async-cache-dedupe-1.12.0.tgz", - "integrity": "sha512-LKumaBNhzvZrbrRi3DtIf0ETgjqcGOa/M2U+0DpTp8f+RzIiWubiQmBjuYUaihxetR3cWWC6hQj/uDVBuYajRA==", - "dependencies": { - "mnemonist": "^0.39.2", - "safe-stable-stringify": "^2.3.1" - } - }, "node_modules/at-least-node": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", @@ -1387,14 +1338,6 @@ "node": ">=4.0.0" } }, - "node_modules/denque": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz", - "integrity": "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==", - "engines": { - "node": ">=0.10" - } - }, "node_modules/detect-libc": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.2.tgz", @@ -1800,29 +1743,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/ioredis": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/ioredis/-/ioredis-5.3.2.tgz", - "integrity": "sha512-1DKMMzlIHM02eBBVOFQ1+AolGjs6+xEcM4PDL7NqOS6szq7H9jSaEkIUH6/a5Hl241LzW6JLSiAbNvTQjUupUA==", - "dependencies": { - "@ioredis/commands": "^1.1.1", - "cluster-key-slot": "^1.1.0", - "debug": "^4.3.4", - "denque": "^2.1.0", - "lodash.defaults": "^4.2.0", - "lodash.isarguments": "^3.1.0", - "redis-errors": "^1.2.0", - "redis-parser": "^3.0.0", - "standard-as-callback": "^2.1.0" - }, - "engines": { - "node": ">=12.22.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/ioredis" - } - }, "node_modules/is-binary-path": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", @@ -1953,16 +1873,6 @@ "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==" }, - "node_modules/lodash.defaults": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", - "integrity": "sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==" - }, - "node_modules/lodash.isarguments": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", - "integrity": "sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==" - }, "node_modules/long": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", @@ -2068,14 +1978,6 @@ "ufo": "^1.1.2" } }, - "node_modules/mnemonist": { - "version": "0.39.5", - "resolved": "https://registry.npmjs.org/mnemonist/-/mnemonist-0.39.5.tgz", - "integrity": "sha512-FPUtkhtJ0efmEFGpU14x7jGbTB+s18LrzRL2KgoWz9YvcY3cPomz8tih01GbHwnGk/OmkOKfqd/RAQoc8Lm7DQ==", - "dependencies": { - "obliterator": "^2.0.1" - } - }, "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -2280,11 +2182,6 @@ "node": ">=0.10.0" } }, - "node_modules/obliterator": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/obliterator/-/obliterator-2.0.4.tgz", - "integrity": "sha512-lgHwxlxV1qIg1Eap7LgIeoBWIMFibOjbrYPIPJZcI1mmGAI2m3lNYpK12Y+GBdPQ0U1hRwSord7GIaawz962qQ==" - }, "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -2524,36 +2421,6 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/prisma": { - "version": "4.16.2", - "resolved": "https://registry.npmjs.org/prisma/-/prisma-4.16.2.tgz", - "integrity": "sha512-SYCsBvDf0/7XSJyf2cHTLjLeTLVXYfqp7pG5eEVafFLeT0u/hLFz/9W196nDRGUOo1JfPatAEb+uEnTQImQC1g==", - "devOptional": true, - "hasInstallScript": true, - "dependencies": { - "@prisma/engines": "4.16.2" - }, - "bin": { - "prisma": "build/index.js", - "prisma2": "build/index.js" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/prisma-redis-middleware": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/prisma-redis-middleware/-/prisma-redis-middleware-4.8.0.tgz", - "integrity": "sha512-d1B7TVLiR8aSiOY2GPKKDb5EWGTK+EmlIkztAZCPWxs4/IHGfIAZiDoLklp6CcK+5ckjcaJq8aWE5AjRJ3+Rpg==", - "dependencies": { - "async-cache-dedupe": "1.12.0", - "ioredis": "5.3.2" - }, - "engines": { - "node": "^16.x || ^18.x", - "npm": "^7.x || ^8.x || ^9.x" - } - }, "node_modules/process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", @@ -2695,25 +2562,6 @@ "@redis/time-series": "1.0.4" } }, - "node_modules/redis-errors": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/redis-errors/-/redis-errors-1.2.0.tgz", - "integrity": "sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w==", - "engines": { - "node": ">=4" - } - }, - "node_modules/redis-parser": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/redis-parser/-/redis-parser-3.0.0.tgz", - "integrity": "sha512-DJnGAeenTdpMEH6uAJRK/uiyEIH9WVsUmoLwzudwGJUwZPp80PDBWPHXSAGNPwNvIXAbe7MSUB1zQFugFml66A==", - "dependencies": { - "redis-errors": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -2810,14 +2658,6 @@ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, - "node_modules/safe-stable-stringify": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz", - "integrity": "sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==", - "engines": { - "node": ">=10" - } - }, "node_modules/semver": { "version": "5.7.2", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", @@ -2960,11 +2800,6 @@ "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", "dev": true }, - "node_modules/standard-as-callback": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/standard-as-callback/-/standard-as-callback-2.1.0.tgz", - "integrity": "sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A==" - }, "node_modules/std-env": { "version": "3.3.3", "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.3.3.tgz", diff --git a/services/basket/pnpm-lock.yaml b/services/basket/pnpm-lock.yaml deleted file mode 100644 index 3afeb09a..00000000 --- a/services/basket/pnpm-lock.yaml +++ /dev/null @@ -1,2122 +0,0 @@ -lockfileVersion: '6.0' - -settings: - autoInstallPeers: true - excludeLinksFromLockfile: false - -dependencies: - '@grpc/grpc-js': - specifier: ^1.8.13 - version: 1.8.13 - '@grpc/proto-loader': - specifier: 0.7.6 - version: 0.7.6 - '@prisma/client': - specifier: 4.16.2 - version: 4.16.2(prisma@4.16.2) - amqplib: - specifier: ^0.10.3 - version: 0.10.3 - dotenv: - specifier: ^16.0.3 - version: 16.0.3 - ioredis: - specifier: 5.3.2 - version: 5.3.2 - prisma-redis-middleware: - specifier: 4.8.0 - version: 4.8.0 - protobufjs: - specifier: 7.2.2 - version: 7.2.2 - -devDependencies: - '@types/amqplib': - specifier: ^0.10.1 - version: 0.10.1 - '@types/node': - specifier: 18.15.9 - version: 18.15.9 - esbuild: - specifier: ^0.17.14 - version: 0.17.14 - nodemon: - specifier: ^2.0.22 - version: 2.0.22 - pkg: - specifier: ^5.8.1 - version: 5.8.1 - prisma: - specifier: 4.16.2 - version: 4.16.2 - ts-node: - specifier: 10.9.1 - version: 10.9.1(@types/node@18.15.9)(typescript@5.0.2) - tsconfig-paths: - specifier: ^4.1.2 - version: 4.1.2 - typescript: - specifier: 5.0.2 - version: 5.0.2 - vite-tsconfig-paths: - specifier: ^4.0.7 - version: 4.0.7(typescript@5.0.2) - vitest: - specifier: ^0.29.8 - version: 0.29.8 - -packages: - - /@acuminous/bitsyntax@0.1.2: - resolution: {integrity: sha512-29lUK80d1muEQqiUsSo+3A0yP6CdspgC95EnKBMi22Xlwt79i/En4Vr67+cXhU+cZjbti3TgGGC5wy1stIywVQ==} - engines: {node: '>=0.8'} - dependencies: - buffer-more-ints: 1.0.0 - debug: 4.3.4 - safe-buffer: 5.1.2 - transitivePeerDependencies: - - supports-color - dev: false - - /@babel/generator@7.18.2: - resolution: {integrity: sha512-W1lG5vUwFvfMd8HVXqdfbuG7RuaSrTCCD8cl8fP8wOivdbtbIg2Db3IWUcgvfxKbbn6ZBGYRW/Zk1MIwK49mgw==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.19.0 - '@jridgewell/gen-mapping': 0.3.2 - jsesc: 2.5.2 - dev: true - - /@babel/helper-string-parser@7.19.4: - resolution: {integrity: sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==} - engines: {node: '>=6.9.0'} - dev: true - - /@babel/helper-validator-identifier@7.19.1: - resolution: {integrity: sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==} - engines: {node: '>=6.9.0'} - dev: true - - /@babel/parser@7.18.4: - resolution: {integrity: sha512-FDge0dFazETFcxGw/EXzOkN8uJp0PC7Qbm+Pe9T+av2zlBpOgunFHkQPPn+eRuClU73JF+98D531UgayY89tow==} - engines: {node: '>=6.0.0'} - hasBin: true - dependencies: - '@babel/types': 7.19.0 - dev: true - - /@babel/types@7.19.0: - resolution: {integrity: sha512-YuGopBq3ke25BVSiS6fgF49Ul9gH1x70Bcr6bqRLjWCkcX8Hre1/5+z+IiWOIerRMSSEfGZVB9z9kyq7wVs9YA==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-string-parser': 7.19.4 - '@babel/helper-validator-identifier': 7.19.1 - to-fast-properties: 2.0.0 - 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 - - /@esbuild/android-arm64@0.17.14: - resolution: {integrity: sha512-eLOpPO1RvtsP71afiFTvS7tVFShJBCT0txiv/xjFBo5a7R7Gjw7X0IgIaFoLKhqXYAXhahoXm7qAmRXhY4guJg==} - engines: {node: '>=12'} - cpu: [arm64] - os: [android] - requiresBuild: true - dev: true - optional: true - - /@esbuild/android-arm@0.17.14: - resolution: {integrity: sha512-0CnlwnjDU8cks0yJLXfkaU/uoLyRf9VZJs4p1PskBr2AlAHeEsFEwJEo0of/Z3g+ilw5mpyDwThlxzNEIxOE4g==} - engines: {node: '>=12'} - cpu: [arm] - os: [android] - requiresBuild: true - dev: true - optional: true - - /@esbuild/android-x64@0.17.14: - resolution: {integrity: sha512-nrfQYWBfLGfSGLvRVlt6xi63B5IbfHm3tZCdu/82zuFPQ7zez4XjmRtF/wIRYbJQ/DsZrxJdEvYFE67avYXyng==} - engines: {node: '>=12'} - cpu: [x64] - os: [android] - requiresBuild: true - dev: true - optional: true - - /@esbuild/darwin-arm64@0.17.14: - resolution: {integrity: sha512-eoSjEuDsU1ROwgBH/c+fZzuSyJUVXQTOIN9xuLs9dE/9HbV/A5IqdXHU1p2OfIMwBwOYJ9SFVGGldxeRCUJFyw==} - engines: {node: '>=12'} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /@esbuild/darwin-x64@0.17.14: - resolution: {integrity: sha512-zN0U8RWfrDttdFNkHqFYZtOH8hdi22z0pFm0aIJPsNC4QQZv7je8DWCX5iA4Zx6tRhS0CCc0XC2m7wKsbWEo5g==} - engines: {node: '>=12'} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /@esbuild/freebsd-arm64@0.17.14: - resolution: {integrity: sha512-z0VcD4ibeZWVQCW1O7szaLxGsx54gcCnajEJMdYoYjLiq4g1jrP2lMq6pk71dbS5+7op/L2Aod+erw+EUr28/A==} - engines: {node: '>=12'} - cpu: [arm64] - os: [freebsd] - requiresBuild: true - dev: true - optional: true - - /@esbuild/freebsd-x64@0.17.14: - resolution: {integrity: sha512-hd9mPcxfTgJlolrPlcXkQk9BMwNBvNBsVaUe5eNUqXut6weDQH8whcNaKNF2RO8NbpT6GY8rHOK2A9y++s+ehw==} - engines: {node: '>=12'} - cpu: [x64] - os: [freebsd] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-arm64@0.17.14: - resolution: {integrity: sha512-FhAMNYOq3Iblcj9i+K0l1Fp/MHt+zBeRu/Qkf0LtrcFu3T45jcwB6A1iMsemQ42vR3GBhjNZJZTaCe3VFPbn9g==} - engines: {node: '>=12'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-arm@0.17.14: - resolution: {integrity: sha512-BNTl+wSJ1omsH8s3TkQmIIIQHwvwJrU9u1ggb9XU2KTVM4TmthRIVyxSp2qxROJHhZuW/r8fht46/QE8hU8Qvg==} - engines: {node: '>=12'} - cpu: [arm] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-ia32@0.17.14: - resolution: {integrity: sha512-91OK/lQ5y2v7AsmnFT+0EyxdPTNhov3y2CWMdizyMfxSxRqHazXdzgBKtlmkU2KYIc+9ZK3Vwp2KyXogEATYxQ==} - engines: {node: '>=12'} - cpu: [ia32] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-loong64@0.17.14: - resolution: {integrity: sha512-vp15H+5NR6hubNgMluqqKza85HcGJgq7t6rMH7O3Y6ApiOWPkvW2AJfNojUQimfTp6OUrACUXfR4hmpcENXoMQ==} - engines: {node: '>=12'} - cpu: [loong64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-mips64el@0.17.14: - resolution: {integrity: sha512-90TOdFV7N+fgi6c2+GO9ochEkmm9kBAKnuD5e08GQMgMINOdOFHuYLPQ91RYVrnWwQ5683sJKuLi9l4SsbJ7Hg==} - engines: {node: '>=12'} - cpu: [mips64el] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-ppc64@0.17.14: - resolution: {integrity: sha512-NnBGeoqKkTugpBOBZZoktQQ1Yqb7aHKmHxsw43NddPB2YWLAlpb7THZIzsRsTr0Xw3nqiPxbA1H31ZMOG+VVPQ==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-riscv64@0.17.14: - resolution: {integrity: sha512-0qdlKScLXA8MGVy21JUKvMzCYWovctuP8KKqhtE5A6IVPq4onxXhSuhwDd2g5sRCzNDlDjitc5sX31BzDoL5Fw==} - engines: {node: '>=12'} - cpu: [riscv64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-s390x@0.17.14: - resolution: {integrity: sha512-Hdm2Jo1yaaOro4v3+6/zJk6ygCqIZuSDJHdHaf8nVH/tfOuoEX5Riv03Ka15LmQBYJObUTNS1UdyoMk0WUn9Ww==} - engines: {node: '>=12'} - cpu: [s390x] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-x64@0.17.14: - resolution: {integrity: sha512-8KHF17OstlK4DuzeF/KmSgzrTWQrkWj5boluiiq7kvJCiQVzUrmSkaBvcLB2UgHpKENO2i6BthPkmUhNDaJsVw==} - engines: {node: '>=12'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/netbsd-x64@0.17.14: - resolution: {integrity: sha512-nVwpqvb3yyXztxIT2+VsxJhB5GCgzPdk1n0HHSnchRAcxqKO6ghXwHhJnr0j/B+5FSyEqSxF4q03rbA2fKXtUQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [netbsd] - requiresBuild: true - dev: true - optional: true - - /@esbuild/openbsd-x64@0.17.14: - resolution: {integrity: sha512-1RZ7uQQ9zcy/GSAJL1xPdN7NDdOOtNEGiJalg/MOzeakZeTrgH/DoCkbq7TaPDiPhWqnDF+4bnydxRqQD7il6g==} - engines: {node: '>=12'} - cpu: [x64] - os: [openbsd] - requiresBuild: true - dev: true - optional: true - - /@esbuild/sunos-x64@0.17.14: - resolution: {integrity: sha512-nqMjDsFwv7vp7msrwWRysnM38Sd44PKmW8EzV01YzDBTcTWUpczQg6mGao9VLicXSgW/iookNK6AxeogNVNDZA==} - engines: {node: '>=12'} - cpu: [x64] - os: [sunos] - requiresBuild: true - dev: true - optional: true - - /@esbuild/win32-arm64@0.17.14: - resolution: {integrity: sha512-xrD0mccTKRBBIotrITV7WVQAwNJ5+1va6L0H9zN92v2yEdjfAN7864cUaZwJS7JPEs53bDTzKFbfqVlG2HhyKQ==} - engines: {node: '>=12'} - cpu: [arm64] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /@esbuild/win32-ia32@0.17.14: - resolution: {integrity: sha512-nXpkz9bbJrLLyUTYtRotSS3t5b+FOuljg8LgLdINWFs3FfqZMtbnBCZFUmBzQPyxqU87F8Av+3Nco/M3hEcu1w==} - engines: {node: '>=12'} - cpu: [ia32] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /@esbuild/win32-x64@0.17.14: - resolution: {integrity: sha512-gPQmsi2DKTaEgG14hc3CHXHp62k8g6qr0Pas+I4lUxRMugGSATh/Bi8Dgusoz9IQ0IfdrvLpco6kujEIBoaogA==} - engines: {node: '>=12'} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /@grpc/grpc-js@1.8.13: - resolution: {integrity: sha512-iY3jsdfbc0ARoCLFvbvUB8optgyb0r1XLPb142u+QtgBcKJYkCIFt3Fd/881KqjLYWjsBJF57N3b8Eop9NDfUA==} - engines: {node: ^8.13.0 || >=10.10.0} - dependencies: - '@grpc/proto-loader': 0.7.6 - '@types/node': 18.15.9 - dev: false - - /@grpc/proto-loader@0.7.6: - resolution: {integrity: sha512-QyAXR8Hyh7uMDmveWxDSUcJr9NAWaZ2I6IXgAYvQmfflwouTM+rArE2eEaCtLlRqO81j7pRLCt81IefUei6Zbw==} - engines: {node: '>=6'} - hasBin: true - dependencies: - '@types/long': 4.0.2 - lodash.camelcase: 4.3.0 - long: 4.0.0 - protobufjs: 7.2.2 - yargs: 16.2.0 - dev: false - - /@ioredis/commands@1.2.0: - resolution: {integrity: sha512-Sx1pU8EM64o2BrqNpEO1CNLtKQwyhuXuqyfH7oGKCk+1a33d2r5saW8zNwm3j6BTExtjrv2BxTgzzkMwts6vGg==} - dev: false - - /@jridgewell/gen-mapping@0.3.2: - resolution: {integrity: sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==} - engines: {node: '>=6.0.0'} - dependencies: - '@jridgewell/set-array': 1.1.2 - '@jridgewell/sourcemap-codec': 1.4.14 - '@jridgewell/trace-mapping': 0.3.9 - dev: true - - /@jridgewell/resolve-uri@3.1.0: - resolution: {integrity: sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==} - 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.14: - resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==} - dev: true - - /@jridgewell/trace-mapping@0.3.9: - resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} - dependencies: - '@jridgewell/resolve-uri': 3.1.0 - '@jridgewell/sourcemap-codec': 1.4.14 - dev: true - - /@nodelib/fs.scandir@2.1.5: - resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} - engines: {node: '>= 8'} - dependencies: - '@nodelib/fs.stat': 2.0.5 - run-parallel: 1.2.0 - dev: true - - /@nodelib/fs.stat@2.0.5: - resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} - engines: {node: '>= 8'} - dev: true - - /@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: true - - /@prisma/client@4.16.2(prisma@4.16.2): - resolution: {integrity: sha512-qCoEyxv1ZrQ4bKy39GnylE8Zq31IRmm8bNhNbZx7bF2cU5aiCCnSa93J2imF88MBjn7J9eUQneNxUQVJdl/rPQ==} - engines: {node: '>=14.17'} - requiresBuild: true - peerDependencies: - prisma: '*' - peerDependenciesMeta: - prisma: - optional: true - dependencies: - '@prisma/engines-version': 4.16.1-1.4bc8b6e1b66cb932731fb1bdbbc550d1e010de81 - prisma: 4.16.2 - dev: false - - /@prisma/engines-version@4.16.1-1.4bc8b6e1b66cb932731fb1bdbbc550d1e010de81: - resolution: {integrity: sha512-q617EUWfRIDTriWADZ4YiWRZXCa/WuhNgLTVd+HqWLffjMSPzyM5uOWoauX91wvQClSKZU4pzI4JJLQ9Kl62Qg==} - dev: false - - /@prisma/engines@4.16.2: - resolution: {integrity: sha512-vx1nxVvN4QeT/cepQce68deh/Turxy5Mr+4L4zClFuK1GlxN3+ivxfuv+ej/gvidWn1cE1uAhW7ALLNlYbRUAw==} - requiresBuild: true - - /@protobufjs/aspromise@1.1.2: - resolution: {integrity: sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==} - dev: false - - /@protobufjs/base64@1.1.2: - resolution: {integrity: sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==} - dev: false - - /@protobufjs/codegen@2.0.4: - resolution: {integrity: sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==} - dev: false - - /@protobufjs/eventemitter@1.1.0: - resolution: {integrity: sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==} - dev: false - - /@protobufjs/fetch@1.1.0: - resolution: {integrity: sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==} - dependencies: - '@protobufjs/aspromise': 1.1.2 - '@protobufjs/inquire': 1.1.0 - dev: false - - /@protobufjs/float@1.0.2: - resolution: {integrity: sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==} - dev: false - - /@protobufjs/inquire@1.1.0: - resolution: {integrity: sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==} - dev: false - - /@protobufjs/path@1.1.2: - resolution: {integrity: sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==} - dev: false - - /@protobufjs/pool@1.1.0: - resolution: {integrity: sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==} - dev: false - - /@protobufjs/utf8@1.1.0: - resolution: {integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==} - 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.3: - resolution: {integrity: sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==} - dev: true - - /@types/amqplib@0.10.1: - resolution: {integrity: sha512-j6ANKT79ncUDnAs/+9r9eDujxbeJoTjoVu33gHHcaPfmLQaMhvfbH2GqSe8KUM444epAp1Vl3peVOQfZk3UIqA==} - dependencies: - '@types/node': 18.15.9 - dev: true - - /@types/chai-subset@1.3.3: - resolution: {integrity: sha512-frBecisrNGz+F4T6bcc+NLeolfiojh5FxW2klu669+8BARtyQv2C/GkNW6FUodVe4BroGMP/wER/YDGc7rEllw==} - dependencies: - '@types/chai': 4.3.4 - dev: true - - /@types/chai@4.3.4: - resolution: {integrity: sha512-KnRanxnpfpjUTqTCXslZSEdLfXExwgNxYPdiO2WGUj8+HDjFi8R3k5RVKPeSCzLjCcshCAtVO2QBbVuAV4kTnw==} - dev: true - - /@types/long@4.0.2: - resolution: {integrity: sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==} - dev: false - - /@types/node@18.15.9: - resolution: {integrity: sha512-dUxhiNzBLr6IqlZXz6e/rN2YQXlFgOei/Dxy+e3cyXTJ4txSUbGT2/fmnD6zd/75jDMeW5bDee+YXxlFKHoV0A==} - - /@vitest/expect@0.29.8: - resolution: {integrity: sha512-xlcVXn5I5oTq6NiZSY3ykyWixBxr5mG8HYtjvpgg6KaqHm0mvhX18xuwl5YGxIRNt/A5jidd7CWcNHrSvgaQqQ==} - dependencies: - '@vitest/spy': 0.29.8 - '@vitest/utils': 0.29.8 - chai: 4.3.7 - dev: true - - /@vitest/runner@0.29.8: - resolution: {integrity: sha512-FzdhnRDwEr/A3Oo1jtIk/B952BBvP32n1ObMEb23oEJNO+qO5cBet6M2XWIDQmA7BDKGKvmhUf2naXyp/2JEwQ==} - dependencies: - '@vitest/utils': 0.29.8 - p-limit: 4.0.0 - pathe: 1.1.0 - dev: true - - /@vitest/spy@0.29.8: - resolution: {integrity: sha512-VdjBe9w34vOMl5I5mYEzNX8inTxrZ+tYUVk9jxaZJmHFwmDFC/GV3KBFTA/JKswr3XHvZL+FE/yq5EVhb6pSAw==} - dependencies: - tinyspy: 1.1.1 - dev: true - - /@vitest/utils@0.29.8: - resolution: {integrity: sha512-qGzuf3vrTbnoY+RjjVVIBYfuWMjn3UMUqyQtdGNZ6ZIIyte7B37exj6LaVkrZiUTvzSadVvO/tJm8AEgbGCBPg==} - dependencies: - cli-truncate: 3.1.0 - diff: 5.1.0 - loupe: 2.3.6 - pretty-format: 27.5.1 - dev: true - - /abbrev@1.1.1: - resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} - dev: true - - /acorn-walk@8.2.0: - resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} - engines: {node: '>=0.4.0'} - dev: true - - /acorn@8.8.2: - resolution: {integrity: sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==} - engines: {node: '>=0.4.0'} - hasBin: true - dev: true - - /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 - dev: true - - /amqplib@0.10.3: - resolution: {integrity: sha512-UHmuSa7n8vVW/a5HGh2nFPqAEr8+cD4dEZ6u9GjP91nHfr1a54RyAKyra7Sb5NH7NBKOUlyQSMXIp0qAixKexw==} - engines: {node: '>=10'} - dependencies: - '@acuminous/bitsyntax': 0.1.2 - buffer-more-ints: 1.0.0 - readable-stream: 1.1.14 - url-parse: 1.5.10 - transitivePeerDependencies: - - supports-color - dev: false - - /ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} - - /ansi-regex@6.0.1: - resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} - engines: {node: '>=12'} - dev: true - - /ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} - dependencies: - color-convert: 2.0.1 - - /ansi-styles@5.2.0: - resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} - engines: {node: '>=10'} - dev: true - - /ansi-styles@6.2.1: - resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} - engines: {node: '>=12'} - dev: true - - /anymatch@3.1.3: - resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} - engines: {node: '>= 8'} - dependencies: - normalize-path: 3.0.0 - picomatch: 2.3.1 - dev: true - - /arg@4.1.3: - resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} - dev: true - - /array-union@2.1.0: - resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} - engines: {node: '>=8'} - dev: true - - /assertion-error@1.1.0: - resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} - dev: true - - /async-cache-dedupe@1.12.0: - resolution: {integrity: sha512-LKumaBNhzvZrbrRi3DtIf0ETgjqcGOa/M2U+0DpTp8f+RzIiWubiQmBjuYUaihxetR3cWWC6hQj/uDVBuYajRA==} - dependencies: - mnemonist: 0.39.5 - safe-stable-stringify: 2.4.3 - dev: false - - /at-least-node@1.0.0: - resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} - engines: {node: '>= 4.0.0'} - dev: true - - /balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - dev: true - - /base64-js@1.5.1: - resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - dev: true - - /binary-extensions@2.2.0: - resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} - engines: {node: '>=8'} - dev: true - - /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: true - - /brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} - dependencies: - balanced-match: 1.0.2 - concat-map: 0.0.1 - dev: true - - /braces@3.0.2: - resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} - engines: {node: '>=8'} - dependencies: - fill-range: 7.0.1 - dev: true - - /buffer-more-ints@1.0.0: - resolution: {integrity: sha512-EMetuGFz5SLsT0QTnXzINh4Ksr+oo4i+UGTXEshiGCQWnsgSs7ZhJ8fzlwQ+OzEMs0MpDAMr1hxnblp5a4vcHg==} - dev: false - - /buffer@5.7.1: - resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} - dependencies: - base64-js: 1.5.1 - ieee754: 1.2.1 - dev: true - - /cac@6.7.14: - resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} - engines: {node: '>=8'} - dev: true - - /chai@4.3.7: - resolution: {integrity: sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==} - engines: {node: '>=4'} - dependencies: - assertion-error: 1.1.0 - check-error: 1.0.2 - deep-eql: 4.1.3 - get-func-name: 2.0.0 - loupe: 2.3.6 - pathval: 1.1.1 - type-detect: 4.0.8 - dev: true - - /chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - dev: true - - /check-error@1.0.2: - resolution: {integrity: sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==} - dev: true - - /chokidar@3.5.3: - resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} - engines: {node: '>= 8.10.0'} - dependencies: - anymatch: 3.1.3 - braces: 3.0.2 - glob-parent: 5.1.2 - is-binary-path: 2.1.0 - is-glob: 4.0.3 - normalize-path: 3.0.0 - readdirp: 3.6.0 - optionalDependencies: - fsevents: 2.3.2 - dev: true - - /chownr@1.1.4: - resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} - dev: true - - /cli-truncate@3.1.0: - resolution: {integrity: sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dependencies: - slice-ansi: 5.0.0 - string-width: 5.1.2 - dev: true - - /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 - - /cluster-key-slot@1.1.2: - resolution: {integrity: sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==} - engines: {node: '>=0.10.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 - - /color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - - /concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - dev: true - - /core-util-is@1.0.3: - resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} - - /create-require@1.1.1: - resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} - dev: true - - /debug@3.2.7(supports-color@5.5.0): - resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - dependencies: - ms: 2.1.3 - supports-color: 5.5.0 - dev: true - - /debug@4.3.4: - resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - dependencies: - ms: 2.1.2 - - /decompress-response@6.0.0: - resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} - engines: {node: '>=10'} - dependencies: - mimic-response: 3.1.0 - dev: true - - /deep-eql@4.1.3: - resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==} - engines: {node: '>=6'} - dependencies: - type-detect: 4.0.8 - dev: true - - /deep-extend@0.6.0: - resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} - engines: {node: '>=4.0.0'} - dev: true - - /denque@2.1.0: - resolution: {integrity: sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==} - engines: {node: '>=0.10'} - dev: false - - /detect-libc@2.0.1: - resolution: {integrity: sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==} - engines: {node: '>=8'} - dev: true - - /diff@4.0.2: - resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} - engines: {node: '>=0.3.1'} - dev: true - - /diff@5.1.0: - resolution: {integrity: sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==} - 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 - dev: true - - /dotenv@16.0.3: - resolution: {integrity: sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==} - engines: {node: '>=12'} - dev: false - - /eastasianwidth@0.2.0: - resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} - dev: true - - /emoji-regex@8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - - /emoji-regex@9.2.2: - resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} - dev: true - - /end-of-stream@1.4.4: - resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} - dependencies: - once: 1.4.0 - dev: true - - /esbuild@0.17.14: - resolution: {integrity: sha512-vOO5XhmVj/1XQR9NQ1UPq6qvMYL7QFJU57J5fKBKBKxp17uDt5PgxFDb4A2nEiXhr1qQs4x0F5+66hVVw4ruNw==} - engines: {node: '>=12'} - hasBin: true - requiresBuild: true - optionalDependencies: - '@esbuild/android-arm': 0.17.14 - '@esbuild/android-arm64': 0.17.14 - '@esbuild/android-x64': 0.17.14 - '@esbuild/darwin-arm64': 0.17.14 - '@esbuild/darwin-x64': 0.17.14 - '@esbuild/freebsd-arm64': 0.17.14 - '@esbuild/freebsd-x64': 0.17.14 - '@esbuild/linux-arm': 0.17.14 - '@esbuild/linux-arm64': 0.17.14 - '@esbuild/linux-ia32': 0.17.14 - '@esbuild/linux-loong64': 0.17.14 - '@esbuild/linux-mips64el': 0.17.14 - '@esbuild/linux-ppc64': 0.17.14 - '@esbuild/linux-riscv64': 0.17.14 - '@esbuild/linux-s390x': 0.17.14 - '@esbuild/linux-x64': 0.17.14 - '@esbuild/netbsd-x64': 0.17.14 - '@esbuild/openbsd-x64': 0.17.14 - '@esbuild/sunos-x64': 0.17.14 - '@esbuild/win32-arm64': 0.17.14 - '@esbuild/win32-ia32': 0.17.14 - '@esbuild/win32-x64': 0.17.14 - dev: true - - /escalade@3.1.1: - resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} - engines: {node: '>=6'} - - /expand-template@2.0.3: - resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} - engines: {node: '>=6'} - dev: true - - /fast-glob@3.2.12: - resolution: {integrity: sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==} - 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: true - - /fastq@1.15.0: - resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} - dependencies: - reusify: 1.0.4 - dev: true - - /fill-range@7.0.1: - resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} - engines: {node: '>=8'} - dependencies: - to-regex-range: 5.0.1 - dev: true - - /from2@2.3.0: - resolution: {integrity: sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==} - dependencies: - inherits: 2.0.4 - readable-stream: 2.3.8 - dev: true - - /fs-constants@1.0.0: - resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} - dev: true - - /fs-extra@9.1.0: - resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==} - engines: {node: '>=10'} - dependencies: - at-least-node: 1.0.0 - graceful-fs: 4.2.11 - jsonfile: 6.1.0 - universalify: 2.0.0 - dev: true - - /fsevents@2.3.2: - resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /function-bind@1.1.1: - resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} - dev: true - - /get-caller-file@2.0.5: - resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} - engines: {node: 6.* || 8.* || >= 10.*} - - /get-func-name@2.0.0: - resolution: {integrity: sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==} - dev: true - - /github-from-package@0.0.0: - resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==} - dev: true - - /glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} - dependencies: - is-glob: 4.0.3 - 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.2.12 - ignore: 5.2.4 - merge2: 1.4.1 - slash: 3.0.0 - dev: true - - /globrex@0.1.2: - resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} - dev: true - - /graceful-fs@4.2.11: - resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - dev: true - - /has-flag@3.0.0: - resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} - engines: {node: '>=4'} - dev: true - - /has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} - dev: true - - /has@1.0.3: - resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} - engines: {node: '>= 0.4.0'} - dependencies: - function-bind: 1.1.1 - dev: true - - /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 - dev: true - - /ieee754@1.2.1: - resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - dev: true - - /ignore-by-default@1.0.1: - resolution: {integrity: sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==} - dev: true - - /ignore@5.2.4: - resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} - engines: {node: '>= 4'} - dev: true - - /inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - - /ini@1.3.8: - resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} - dev: true - - /into-stream@6.0.0: - resolution: {integrity: sha512-XHbaOAvP+uFKUFsOgoNPRjLkwB+I22JFPFe5OjTkQ0nwgj6+pSjb4NmB6VMxaPshLiOf+zcpOCBQuLwC1KHhZA==} - engines: {node: '>=10'} - dependencies: - from2: 2.3.0 - p-is-promise: 3.0.0 - dev: true - - /ioredis@5.3.2: - resolution: {integrity: sha512-1DKMMzlIHM02eBBVOFQ1+AolGjs6+xEcM4PDL7NqOS6szq7H9jSaEkIUH6/a5Hl241LzW6JLSiAbNvTQjUupUA==} - engines: {node: '>=12.22.0'} - dependencies: - '@ioredis/commands': 1.2.0 - cluster-key-slot: 1.1.2 - debug: 4.3.4 - denque: 2.1.0 - lodash.defaults: 4.2.0 - lodash.isarguments: 3.1.0 - redis-errors: 1.2.0 - redis-parser: 3.0.0 - standard-as-callback: 2.1.0 - transitivePeerDependencies: - - supports-color - dev: false - - /is-binary-path@2.1.0: - resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} - engines: {node: '>=8'} - dependencies: - binary-extensions: 2.2.0 - dev: true - - /is-core-module@2.9.0: - resolution: {integrity: sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==} - dependencies: - has: 1.0.3 - dev: true - - /is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} - dev: true - - /is-fullwidth-code-point@3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} - engines: {node: '>=8'} - - /is-fullwidth-code-point@4.0.0: - resolution: {integrity: sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==} - engines: {node: '>=12'} - dev: true - - /is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} - dependencies: - is-extglob: 2.1.1 - dev: true - - /is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} - dev: true - - /isarray@0.0.1: - resolution: {integrity: sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==} - dev: false - - /isarray@1.0.0: - resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} - dev: true - - /jsesc@2.5.2: - resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} - engines: {node: '>=4'} - hasBin: true - dev: true - - /json5@2.2.3: - resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} - engines: {node: '>=6'} - hasBin: true - dev: true - - /jsonc-parser@3.2.0: - resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} - dev: true - - /jsonfile@6.1.0: - resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} - dependencies: - universalify: 2.0.0 - optionalDependencies: - graceful-fs: 4.2.11 - dev: true - - /local-pkg@0.4.3: - resolution: {integrity: sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==} - engines: {node: '>=14'} - dev: true - - /lodash.camelcase@4.3.0: - resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} - dev: false - - /lodash.defaults@4.2.0: - resolution: {integrity: sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==} - dev: false - - /lodash.isarguments@3.1.0: - resolution: {integrity: sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==} - dev: false - - /long@4.0.0: - resolution: {integrity: sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==} - dev: false - - /long@5.2.1: - resolution: {integrity: sha512-GKSNGeNAtw8IryjjkhZxuKB3JzlcLTwjtiQCHKvqQet81I93kXslhDQruGI/QsddO83mcDToBVy7GqGS/zYf/A==} - dev: false - - /loupe@2.3.6: - resolution: {integrity: sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==} - dependencies: - get-func-name: 2.0.0 - dev: true - - /lru-cache@6.0.0: - resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} - engines: {node: '>=10'} - dependencies: - yallist: 4.0.0 - dev: true - - /make-error@1.3.6: - resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} - dev: true - - /merge2@1.4.1: - resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} - engines: {node: '>= 8'} - dev: true - - /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: true - - /mimic-response@3.1.0: - resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} - engines: {node: '>=10'} - dev: true - - /minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} - dependencies: - brace-expansion: 1.1.11 - dev: true - - /minimist@1.2.8: - resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - dev: true - - /mkdirp-classic@0.5.3: - resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} - dev: true - - /mlly@1.2.0: - resolution: {integrity: sha512-+c7A3CV0KGdKcylsI6khWyts/CYrGTrRVo4R/I7u/cUsy0Conxa6LUhiEzVKIw14lc2L5aiO4+SeVe4TeGRKww==} - dependencies: - acorn: 8.8.2 - pathe: 1.1.0 - pkg-types: 1.0.2 - ufo: 1.1.1 - dev: true - - /mnemonist@0.39.5: - resolution: {integrity: sha512-FPUtkhtJ0efmEFGpU14x7jGbTB+s18LrzRL2KgoWz9YvcY3cPomz8tih01GbHwnGk/OmkOKfqd/RAQoc8Lm7DQ==} - dependencies: - obliterator: 2.0.4 - dev: false - - /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: true - - /multistream@4.1.0: - resolution: {integrity: sha512-J1XDiAmmNpRCBfIWJv+n0ymC4ABcf/Pl+5YvC5B/D2f/2+8PtHvCNxMPKiQcZyi922Hq69J2YOpb1pTywfifyw==} - dependencies: - once: 1.4.0 - readable-stream: 3.6.2 - dev: true - - /nanoid@3.3.6: - resolution: {integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true - dev: true - - /napi-build-utils@1.0.2: - resolution: {integrity: sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==} - dev: true - - /node-abi@3.33.0: - resolution: {integrity: sha512-7GGVawqyHF4pfd0YFybhv/eM9JwTtPqx0mAanQ146O3FlSh3pA24zf9IRQTOsfTSqXTNzPSP5iagAJ94jjuVog==} - engines: {node: '>=10'} - dependencies: - semver: 7.3.8 - dev: true - - /node-fetch@2.6.9: - resolution: {integrity: sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg==} - engines: {node: 4.x || >=6.0.0} - peerDependencies: - encoding: ^0.1.0 - peerDependenciesMeta: - encoding: - optional: true - dependencies: - whatwg-url: 5.0.0 - dev: true - - /nodemon@2.0.22: - resolution: {integrity: sha512-B8YqaKMmyuCO7BowF1Z1/mkPqLk6cs/l63Ojtd6otKjMx47Dq1utxfRxcavH1I7VSaL8n5BUaoutadnsX3AAVQ==} - engines: {node: '>=8.10.0'} - hasBin: true - dependencies: - chokidar: 3.5.3 - debug: 3.2.7(supports-color@5.5.0) - ignore-by-default: 1.0.1 - minimatch: 3.1.2 - pstree.remy: 1.1.8 - semver: 5.7.1 - simple-update-notifier: 1.1.0 - supports-color: 5.5.0 - touch: 3.1.0 - undefsafe: 2.0.5 - dev: true - - /nopt@1.0.10: - resolution: {integrity: sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==} - hasBin: true - dependencies: - abbrev: 1.1.1 - dev: true - - /normalize-path@3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} - engines: {node: '>=0.10.0'} - dev: true - - /obliterator@2.0.4: - resolution: {integrity: sha512-lgHwxlxV1qIg1Eap7LgIeoBWIMFibOjbrYPIPJZcI1mmGAI2m3lNYpK12Y+GBdPQ0U1hRwSord7GIaawz962qQ==} - dev: false - - /once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - dependencies: - wrappy: 1.0.2 - dev: true - - /p-is-promise@3.0.0: - resolution: {integrity: sha512-Wo8VsW4IRQSKVXsJCn7TomUaVtyfjVDn3nUP7kE967BQk0CwFpdbZs0X0uk5sW9mkBa9eNM7hCMaG93WUAwxYQ==} - engines: {node: '>=8'} - dev: true - - /p-limit@4.0.0: - resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dependencies: - yocto-queue: 1.0.0 - dev: true - - /path-parse@1.0.7: - resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} - dev: true - - /path-type@4.0.0: - resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} - engines: {node: '>=8'} - dev: true - - /pathe@1.1.0: - resolution: {integrity: sha512-ODbEPR0KKHqECXW1GoxdDb+AZvULmXjVPy4rt+pGo2+TnjJTIPJQSVS6N63n8T2Ip+syHhbn52OewKicV0373w==} - dev: true - - /pathval@1.1.1: - resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} - dev: true - - /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'} - dev: true - - /pkg-fetch@3.4.2: - resolution: {integrity: sha512-0+uijmzYcnhC0hStDjm/cl2VYdrmVVBpe7Q8k9YBojxmR5tG8mvR9/nooQq3QSXiQqORDVOTY3XqMEqJVIzkHA==} - hasBin: true - dependencies: - chalk: 4.1.2 - fs-extra: 9.1.0 - https-proxy-agent: 5.0.1 - node-fetch: 2.6.9 - progress: 2.0.3 - semver: 7.3.8 - tar-fs: 2.1.1 - yargs: 16.2.0 - transitivePeerDependencies: - - encoding - - supports-color - dev: true - - /pkg-types@1.0.2: - resolution: {integrity: sha512-hM58GKXOcj8WTqUXnsQyJYXdeAPbythQgEF3nTcEo+nkD49chjQ9IKm/QJy9xf6JakXptz86h7ecP2024rrLaQ==} - dependencies: - jsonc-parser: 3.2.0 - mlly: 1.2.0 - pathe: 1.1.0 - dev: true - - /pkg@5.8.1: - resolution: {integrity: sha512-CjBWtFStCfIiT4Bde9QpJy0KeH19jCfwZRJqHFDFXfhUklCx8JoFmMj3wgnEYIwGmZVNkhsStPHEOnrtrQhEXA==} - hasBin: true - peerDependencies: - node-notifier: '>=9.0.1' - peerDependenciesMeta: - node-notifier: - optional: true - dependencies: - '@babel/generator': 7.18.2 - '@babel/parser': 7.18.4 - '@babel/types': 7.19.0 - chalk: 4.1.2 - fs-extra: 9.1.0 - globby: 11.1.0 - into-stream: 6.0.0 - is-core-module: 2.9.0 - minimist: 1.2.8 - multistream: 4.1.0 - pkg-fetch: 3.4.2 - prebuild-install: 7.1.1 - resolve: 1.22.1 - stream-meter: 1.0.4 - transitivePeerDependencies: - - encoding - - supports-color - dev: true - - /postcss@8.4.21: - resolution: {integrity: sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==} - engines: {node: ^10 || ^12 || >=14} - dependencies: - nanoid: 3.3.6 - picocolors: 1.0.0 - source-map-js: 1.0.2 - dev: true - - /prebuild-install@7.1.1: - resolution: {integrity: sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==} - engines: {node: '>=10'} - hasBin: true - dependencies: - detect-libc: 2.0.1 - expand-template: 2.0.3 - github-from-package: 0.0.0 - minimist: 1.2.8 - mkdirp-classic: 0.5.3 - napi-build-utils: 1.0.2 - node-abi: 3.33.0 - pump: 3.0.0 - rc: 1.2.8 - simple-get: 4.0.1 - tar-fs: 2.1.1 - tunnel-agent: 0.6.0 - dev: true - - /pretty-format@27.5.1: - resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - dependencies: - ansi-regex: 5.0.1 - ansi-styles: 5.2.0 - react-is: 17.0.2 - dev: true - - /prisma-redis-middleware@4.8.0: - resolution: {integrity: sha512-d1B7TVLiR8aSiOY2GPKKDb5EWGTK+EmlIkztAZCPWxs4/IHGfIAZiDoLklp6CcK+5ckjcaJq8aWE5AjRJ3+Rpg==} - engines: {node: ^16.x || ^18.x, npm: ^7.x || ^8.x || ^9.x} - dependencies: - async-cache-dedupe: 1.12.0 - ioredis: 5.3.2 - transitivePeerDependencies: - - supports-color - dev: false - - /prisma@4.16.2: - resolution: {integrity: sha512-SYCsBvDf0/7XSJyf2cHTLjLeTLVXYfqp7pG5eEVafFLeT0u/hLFz/9W196nDRGUOo1JfPatAEb+uEnTQImQC1g==} - engines: {node: '>=14.17'} - hasBin: true - requiresBuild: true - dependencies: - '@prisma/engines': 4.16.2 - - /process-nextick-args@2.0.1: - resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} - dev: true - - /progress@2.0.3: - resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} - engines: {node: '>=0.4.0'} - dev: true - - /protobufjs@7.2.2: - resolution: {integrity: sha512-++PrQIjrom+bFDPpfmqXfAGSQs40116JRrqqyf53dymUMvvb5d/LMRyicRoF1AUKoXVS1/IgJXlEgcpr4gTF3Q==} - engines: {node: '>=12.0.0'} - requiresBuild: true - dependencies: - '@protobufjs/aspromise': 1.1.2 - '@protobufjs/base64': 1.1.2 - '@protobufjs/codegen': 2.0.4 - '@protobufjs/eventemitter': 1.1.0 - '@protobufjs/fetch': 1.1.0 - '@protobufjs/float': 1.0.2 - '@protobufjs/inquire': 1.1.0 - '@protobufjs/path': 1.1.2 - '@protobufjs/pool': 1.1.0 - '@protobufjs/utf8': 1.1.0 - '@types/node': 18.15.9 - long: 5.2.1 - dev: false - - /pstree.remy@1.1.8: - resolution: {integrity: sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==} - dev: true - - /pump@3.0.0: - resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} - dependencies: - end-of-stream: 1.4.4 - once: 1.4.0 - dev: true - - /querystringify@2.2.0: - resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} - dev: false - - /queue-microtask@1.2.3: - resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - dev: true - - /rc@1.2.8: - resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} - hasBin: true - dependencies: - deep-extend: 0.6.0 - ini: 1.3.8 - minimist: 1.2.8 - strip-json-comments: 2.0.1 - dev: true - - /react-is@17.0.2: - resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} - dev: true - - /readable-stream@1.1.14: - resolution: {integrity: sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==} - dependencies: - core-util-is: 1.0.3 - inherits: 2.0.4 - isarray: 0.0.1 - string_decoder: 0.10.31 - dev: false - - /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: true - - /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: true - - /readdirp@3.6.0: - resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} - engines: {node: '>=8.10.0'} - dependencies: - picomatch: 2.3.1 - dev: true - - /redis-errors@1.2.0: - resolution: {integrity: sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w==} - engines: {node: '>=4'} - dev: false - - /redis-parser@3.0.0: - resolution: {integrity: sha512-DJnGAeenTdpMEH6uAJRK/uiyEIH9WVsUmoLwzudwGJUwZPp80PDBWPHXSAGNPwNvIXAbe7MSUB1zQFugFml66A==} - engines: {node: '>=4'} - dependencies: - redis-errors: 1.2.0 - dev: false - - /require-directory@2.1.1: - resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} - engines: {node: '>=0.10.0'} - - /requires-port@1.0.0: - resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} - dev: false - - /resolve@1.22.1: - resolution: {integrity: sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==} - hasBin: true - dependencies: - is-core-module: 2.9.0 - path-parse: 1.0.7 - supports-preserve-symlinks-flag: 1.0.0 - dev: true - - /reusify@1.0.4: - resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} - engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - dev: true - - /rollup@3.20.2: - resolution: {integrity: sha512-3zwkBQl7Ai7MFYQE0y1MeQ15+9jsi7XxfrqwTb/9EK8D9C9+//EBR4M+CuA1KODRaNbFez/lWxA5vhEGZp4MUg==} - engines: {node: '>=14.18.0', npm: '>=8.0.0'} - hasBin: true - optionalDependencies: - fsevents: 2.3.2 - dev: true - - /run-parallel@1.2.0: - resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} - dependencies: - queue-microtask: 1.2.3 - dev: true - - /safe-buffer@5.1.2: - resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} - - /safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - dev: true - - /safe-stable-stringify@2.4.3: - resolution: {integrity: sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==} - engines: {node: '>=10'} - dev: false - - /semver@5.7.1: - resolution: {integrity: sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==} - hasBin: true - dev: true - - /semver@7.0.0: - resolution: {integrity: sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==} - hasBin: true - dev: true - - /semver@7.3.8: - resolution: {integrity: sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==} - engines: {node: '>=10'} - hasBin: true - dependencies: - lru-cache: 6.0.0 - dev: true - - /siginfo@2.0.0: - resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} - dev: true - - /simple-concat@1.0.1: - resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} - dev: true - - /simple-get@4.0.1: - resolution: {integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==} - dependencies: - decompress-response: 6.0.0 - once: 1.4.0 - simple-concat: 1.0.1 - dev: true - - /simple-update-notifier@1.1.0: - resolution: {integrity: sha512-VpsrsJSUcJEseSbMHkrsrAVSdvVS5I96Qo1QAQ4FxQ9wXFcB+pjj7FB7/us9+GcgfW4ziHtYMc1J0PLczb55mg==} - engines: {node: '>=8.10.0'} - dependencies: - semver: 7.0.0 - dev: true - - /slash@3.0.0: - resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} - engines: {node: '>=8'} - dev: true - - /slice-ansi@5.0.0: - resolution: {integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==} - engines: {node: '>=12'} - dependencies: - ansi-styles: 6.2.1 - is-fullwidth-code-point: 4.0.0 - dev: true - - /source-map-js@1.0.2: - resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} - engines: {node: '>=0.10.0'} - dev: true - - /source-map@0.6.1: - resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} - engines: {node: '>=0.10.0'} - dev: true - - /stackback@0.0.2: - resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} - dev: true - - /standard-as-callback@2.1.0: - resolution: {integrity: sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A==} - dev: false - - /std-env@3.3.2: - resolution: {integrity: sha512-uUZI65yrV2Qva5gqE0+A7uVAvO40iPo6jGhs7s8keRfHCmtg+uB2X6EiLGCI9IgL1J17xGhvoOqSz79lzICPTA==} - dev: true - - /stream-meter@1.0.4: - resolution: {integrity: sha512-4sOEtrbgFotXwnEuzzsQBYEV1elAeFSO8rSGeTwabuX1RRn/kEq9JVH7I0MRBhKVRR0sJkr0M0QCH7yOLf9fhQ==} - dependencies: - readable-stream: 2.3.8 - 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.0.1 - dev: true - - /string_decoder@0.10.31: - resolution: {integrity: sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==} - dev: false - - /string_decoder@1.1.1: - resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} - dependencies: - safe-buffer: 5.1.2 - dev: true - - /string_decoder@1.3.0: - resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} - dependencies: - safe-buffer: 5.2.1 - dev: true - - /strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} - dependencies: - ansi-regex: 5.0.1 - - /strip-ansi@7.0.1: - resolution: {integrity: sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==} - engines: {node: '>=12'} - dependencies: - ansi-regex: 6.0.1 - dev: true - - /strip-bom@3.0.0: - resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} - engines: {node: '>=4'} - dev: true - - /strip-json-comments@2.0.1: - resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} - engines: {node: '>=0.10.0'} - dev: true - - /strip-literal@1.0.1: - resolution: {integrity: sha512-QZTsipNpa2Ppr6v1AmJHESqJ3Uz247MUS0OjrnnZjFAvEoWqxuyFuXn2xLgMtRnijJShAa1HL0gtJyUs7u7n3Q==} - dependencies: - acorn: 8.8.2 - dev: true - - /supports-color@5.5.0: - resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} - engines: {node: '>=4'} - dependencies: - has-flag: 3.0.0 - dev: true - - /supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} - dependencies: - has-flag: 4.0.0 - dev: true - - /supports-preserve-symlinks-flag@1.0.0: - resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} - engines: {node: '>= 0.4'} - dev: true - - /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: true - - /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: true - - /tinybench@2.4.0: - resolution: {integrity: sha512-iyziEiyFxX4kyxSp+MtY1oCH/lvjH3PxFN8PGCDeqcZWAJ/i+9y+nL85w99PxVzrIvew/GSkSbDYtiGVa85Afg==} - dev: true - - /tinypool@0.4.0: - resolution: {integrity: sha512-2ksntHOKf893wSAH4z/+JbPpi92esw8Gn9N2deXX+B0EO92hexAVI9GIZZPx7P5aYo5KULfeOSt3kMOmSOy6uA==} - engines: {node: '>=14.0.0'} - dev: true - - /tinyspy@1.1.1: - resolution: {integrity: sha512-UVq5AXt/gQlti7oxoIg5oi/9r0WpF7DGEVwXgqWSMmyN16+e3tl5lIvTaOpJ3TAtu5xFzWccFRM4R5NaWHF+4g==} - engines: {node: '>=14.0.0'} - 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 - dev: true - - /touch@3.1.0: - resolution: {integrity: sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==} - hasBin: true - dependencies: - nopt: 1.0.10 - dev: true - - /tr46@0.0.3: - resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} - dev: true - - /ts-node@10.9.1(@types/node@18.15.9)(typescript@5.0.2): - 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.3 - '@types/node': 18.15.9 - acorn: 8.8.2 - 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.0.2 - v8-compile-cache-lib: 3.0.1 - yn: 3.1.1 - dev: true - - /tsconfck@2.1.1(typescript@5.0.2): - resolution: {integrity: sha512-ZPCkJBKASZBmBUNqGHmRhdhM8pJYDdOXp4nRgj/O0JwUwsMq50lCDRQP/M5GBNAA0elPrq4gAeu4dkaVCuKWww==} - engines: {node: ^14.13.1 || ^16 || >=18} - hasBin: true - peerDependencies: - typescript: ^4.3.5 || ^5.0.0 - peerDependenciesMeta: - typescript: - optional: true - dependencies: - typescript: 5.0.2 - dev: true - - /tsconfig-paths@4.1.2: - resolution: {integrity: sha512-uhxiMgnXQp1IR622dUXI+9Ehnws7i/y6xvpZB9IbUVOPy0muvdvgXeZOn88UcGPiT98Vp3rJPTa8bFoalZ3Qhw==} - engines: {node: '>=6'} - dependencies: - json5: 2.2.3 - minimist: 1.2.8 - strip-bom: 3.0.0 - dev: true - - /tunnel-agent@0.6.0: - resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} - dependencies: - safe-buffer: 5.2.1 - dev: true - - /type-detect@4.0.8: - resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} - engines: {node: '>=4'} - dev: true - - /typescript@5.0.2: - resolution: {integrity: sha512-wVORMBGO/FAs/++blGNeAVdbNKtIh1rbBL2EyQ1+J9lClJ93KiiKe8PmFIVdXhHcyv44SL9oglmfeSsndo0jRw==} - engines: {node: '>=12.20'} - hasBin: true - dev: true - - /ufo@1.1.1: - resolution: {integrity: sha512-MvlCc4GHrmZdAllBc0iUDowff36Q9Ndw/UzqmEKyrfSzokTd9ZCy1i+IIk5hrYKkjoYVQyNbrw7/F8XJ2rEwTg==} - dev: true - - /undefsafe@2.0.5: - resolution: {integrity: sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==} - dev: true - - /universalify@2.0.0: - resolution: {integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==} - engines: {node: '>= 10.0.0'} - dev: true - - /url-parse@1.5.10: - resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} - dependencies: - querystringify: 2.2.0 - requires-port: 1.0.0 - dev: false - - /util-deprecate@1.0.2: - resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - dev: true - - /v8-compile-cache-lib@3.0.1: - resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} - dev: true - - /vite-node@0.29.8(@types/node@18.15.9): - resolution: {integrity: sha512-b6OtCXfk65L6SElVM20q5G546yu10/kNrhg08afEoWlFRJXFq9/6glsvSVY+aI6YeC1tu2TtAqI2jHEQmOmsFw==} - engines: {node: '>=v14.16.0'} - hasBin: true - dependencies: - cac: 6.7.14 - debug: 4.3.4 - mlly: 1.2.0 - pathe: 1.1.0 - picocolors: 1.0.0 - vite: 4.2.1(@types/node@18.15.9) - transitivePeerDependencies: - - '@types/node' - - less - - sass - - stylus - - sugarss - - supports-color - - terser - dev: true - - /vite-tsconfig-paths@4.0.7(typescript@5.0.2): - resolution: {integrity: sha512-MwIYaby6kcbQGZqMH+gAK6h0UYQGOkjsuAgw4q6bP/5vWkn8VKvnmLuCQHA2+IzHAJHnE8OFTO4lnJLFMf9+7Q==} - peerDependencies: - vite: '*' - peerDependenciesMeta: - vite: - optional: true - dependencies: - debug: 4.3.4 - globrex: 0.1.2 - tsconfck: 2.1.1(typescript@5.0.2) - transitivePeerDependencies: - - supports-color - - typescript - dev: true - - /vite@4.2.1(@types/node@18.15.9): - resolution: {integrity: sha512-7MKhqdy0ISo4wnvwtqZkjke6XN4taqQ2TBaTccLIpOKv7Vp2h4Y+NpmWCnGDeSvvn45KxvWgGyb0MkHvY1vgbg==} - engines: {node: ^14.18.0 || >=16.0.0} - hasBin: true - peerDependencies: - '@types/node': '>= 14' - less: '*' - sass: '*' - stylus: '*' - sugarss: '*' - terser: ^5.4.0 - peerDependenciesMeta: - '@types/node': - optional: true - less: - optional: true - sass: - optional: true - stylus: - optional: true - sugarss: - optional: true - terser: - optional: true - dependencies: - '@types/node': 18.15.9 - esbuild: 0.17.14 - postcss: 8.4.21 - resolve: 1.22.1 - rollup: 3.20.2 - optionalDependencies: - fsevents: 2.3.2 - dev: true - - /vitest@0.29.8: - resolution: {integrity: sha512-JIAVi2GK5cvA6awGpH0HvH/gEG9PZ0a/WoxdiV3PmqK+3CjQMf8c+J/Vhv4mdZ2nRyXFw66sAg6qz7VNkaHfDQ==} - engines: {node: '>=v14.16.0'} - hasBin: true - peerDependencies: - '@edge-runtime/vm': '*' - '@vitest/browser': '*' - '@vitest/ui': '*' - happy-dom: '*' - jsdom: '*' - playwright: '*' - safaridriver: '*' - webdriverio: '*' - peerDependenciesMeta: - '@edge-runtime/vm': - optional: true - '@vitest/browser': - optional: true - '@vitest/ui': - optional: true - happy-dom: - optional: true - jsdom: - optional: true - playwright: - optional: true - safaridriver: - optional: true - webdriverio: - optional: true - dependencies: - '@types/chai': 4.3.4 - '@types/chai-subset': 1.3.3 - '@types/node': 18.15.9 - '@vitest/expect': 0.29.8 - '@vitest/runner': 0.29.8 - '@vitest/spy': 0.29.8 - '@vitest/utils': 0.29.8 - acorn: 8.8.2 - acorn-walk: 8.2.0 - cac: 6.7.14 - chai: 4.3.7 - debug: 4.3.4 - local-pkg: 0.4.3 - pathe: 1.1.0 - picocolors: 1.0.0 - source-map: 0.6.1 - std-env: 3.3.2 - strip-literal: 1.0.1 - tinybench: 2.4.0 - tinypool: 0.4.0 - tinyspy: 1.1.1 - vite: 4.2.1(@types/node@18.15.9) - vite-node: 0.29.8(@types/node@18.15.9) - why-is-node-running: 2.2.2 - transitivePeerDependencies: - - less - - sass - - stylus - - sugarss - - supports-color - - terser - dev: true - - /webidl-conversions@3.0.1: - resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} - dev: true - - /whatwg-url@5.0.0: - resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} - dependencies: - tr46: 0.0.3 - webidl-conversions: 3.0.1 - 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'} - dependencies: - ansi-styles: 4.3.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 - - /wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - dev: true - - /y18n@5.0.8: - resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} - engines: {node: '>=10'} - - /yallist@4.0.0: - resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} - dev: true - - /yargs-parser@20.2.9: - resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} - engines: {node: '>=10'} - - /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 - - /yn@3.1.1: - resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} - engines: {node: '>=6'} - dev: true - - /yocto-queue@1.0.0: - resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} - engines: {node: '>=12.20'} - dev: true diff --git a/services/gateway/.gitignore b/services/gateway/.gitignore index 82abeb3b..e1d91141 100644 --- a/services/gateway/.gitignore +++ b/services/gateway/.gitignore @@ -4,3 +4,4 @@ bin/ *.env* !*.env.example !*.env.docker +/src/proto/ \ No newline at end of file diff --git a/services/restaurant/.env.docker b/services/restaurant/.env.docker index ff13c41a..20f88df7 100644 --- a/services/restaurant/.env.docker +++ b/services/restaurant/.env.docker @@ -1,4 +1,4 @@ -DATABASE_URL=postgresql://postgres:postgres@restaurant-postgres:5432/postgres +DATABASE_URL=postgres://postgres:password@restaurant-postgres:5432/postgres AMQP_URL=amqp://guest:guest@log-rabbitmq PORT=50005 \ No newline at end of file diff --git a/services/restaurant/Dockerfile b/services/restaurant/Dockerfile index c8ec816f..ffcc5d17 100644 --- a/services/restaurant/Dockerfile +++ b/services/restaurant/Dockerfile @@ -6,6 +6,9 @@ WORKDIR /app # Copy the application code COPY ./restaurant/ . +# Get permision +RUN chmod +x ./script.sh + # Install dependencies RUN npm install @@ -28,11 +31,14 @@ WORKDIR /app # Copy the application package COPY --from=builder /app/dist . COPY --from=builder /app/prisma/ . +COPY --from=builder /app/script.sh ./script.sh COPY --from=builder /app/proto/ /proto/ COPY --from=builder /app/node_modules/.prisma /.prisma +RUN chmod 755 ./script.sh + # Expose the gRPC port EXPOSE 50005 # Start the server -CMD [ "node", "index.js"] +CMD ["sh", "script.sh"] \ No newline at end of file diff --git a/services/restaurant/package-lock.json b/services/restaurant/package-lock.json new file mode 100644 index 00000000..f0f99ecb --- /dev/null +++ b/services/restaurant/package-lock.json @@ -0,0 +1,1434 @@ +{ + "name": "@goodfood/restaurant", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "@goodfood/restaurant", + "hasInstallScript": true, + "dependencies": { + "@grpc/grpc-js": "^1.8.18", + "@grpc/proto-loader": "^0.7.8", + "@prisma/client": "5.1.1", + "amqplib": "^0.10.3", + "dotenv": "^16.3.1", + "esbuild": "^0.18.15", + "geolib": "^3.3.4", + "nodemon": "^3.0.1", + "path": "^0.12.7", + "ts-node": "^10.9.1", + "tsconfig-paths": "^4.2.0" + }, + "bin": { + "restaurant": "dist/index.js" + }, + "devDependencies": { + "@types/amqplib": "^0.10.1", + "prisma": "^5.1.1", + "typescript": "^5.1.6" + } + }, + "node_modules/@acuminous/bitsyntax": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@acuminous/bitsyntax/-/bitsyntax-0.1.2.tgz", + "integrity": "sha512-29lUK80d1muEQqiUsSo+3A0yP6CdspgC95EnKBMi22Xlwt79i/En4Vr67+cXhU+cZjbti3TgGGC5wy1stIywVQ==", + "dependencies": { + "buffer-more-ints": "~1.0.0", + "debug": "^4.3.4", + "safe-buffer": "~5.1.2" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", + "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz", + "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz", + "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz", + "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz", + "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz", + "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz", + "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz", + "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz", + "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz", + "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", + "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", + "cpu": [ + "loong64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz", + "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==", + "cpu": [ + "mips64el" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz", + "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==", + "cpu": [ + "ppc64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz", + "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==", + "cpu": [ + "riscv64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz", + "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==", + "cpu": [ + "s390x" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz", + "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz", + "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz", + "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz", + "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", + "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz", + "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", + "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@grpc/grpc-js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.9.1.tgz", + "integrity": "sha512-AvDEPQT4teS+J8++cTE5tku4rYCwpPwPguESJUummLs/Ug/O5Bouofnc1mxaDORmwA9QkrJ+PfRQ1Qs7adQgJg==", + "dependencies": { + "@grpc/proto-loader": "^0.7.8", + "@types/node": ">=12.12.47" + }, + "engines": { + "node": "^8.13.0 || >=10.10.0" + } + }, + "node_modules/@grpc/proto-loader": { + "version": "0.7.9", + "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.9.tgz", + "integrity": "sha512-YJsOehVXzgurc+lLAxYnlSMc1p/Gu6VAvnfx0ATi2nzvr0YZcjhmZDeY8SeAKv1M7zE3aEJH0Xo9mK1iZ8GYoQ==", + "dependencies": { + "lodash.camelcase": "^4.3.0", + "long": "^5.0.0", + "protobufjs": "^7.2.4", + "yargs": "^17.7.2" + }, + "bin": { + "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@prisma/client": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@prisma/client/-/client-5.1.1.tgz", + "integrity": "sha512-fxcCeK5pMQGcgCqCrWsi+I2rpIbk0rAhdrN+ke7f34tIrgPwA68ensrpin+9+fZvuV2OtzHmuipwduSY6HswdA==", + "hasInstallScript": true, + "dependencies": { + "@prisma/engines-version": "5.1.1-1.6a3747c37ff169c90047725a05a6ef02e32ac97e" + }, + "engines": { + "node": ">=16.13" + }, + "peerDependencies": { + "prisma": "*" + }, + "peerDependenciesMeta": { + "prisma": { + "optional": true + } + } + }, + "node_modules/@prisma/engines": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-5.2.0.tgz", + "integrity": "sha512-dT7FOLUCdZmq+AunLqB1Iz+ZH/IIS1Fz2THmKZQ6aFONrQD/BQ5ecJ7g2wGS2OgyUFf4OaLam6/bxmgdOBDqig==", + "devOptional": true, + "hasInstallScript": true + }, + "node_modules/@prisma/engines-version": { + "version": "5.1.1-1.6a3747c37ff169c90047725a05a6ef02e32ac97e", + "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-5.1.1-1.6a3747c37ff169c90047725a05a6ef02e32ac97e.tgz", + "integrity": "sha512-owZqbY/wucbr65bXJ/ljrHPgQU5xXTSkmcE/JcbqE1kusuAXV/TLN3/exmz21SZ5rJ7WDkyk70J2G/n68iogbQ==" + }, + "node_modules/@protobufjs/aspromise": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==" + }, + "node_modules/@protobufjs/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" + }, + "node_modules/@protobufjs/codegen": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", + "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" + }, + "node_modules/@protobufjs/eventemitter": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", + "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==" + }, + "node_modules/@protobufjs/fetch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", + "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", + "dependencies": { + "@protobufjs/aspromise": "^1.1.1", + "@protobufjs/inquire": "^1.1.0" + } + }, + "node_modules/@protobufjs/float": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", + "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==" + }, + "node_modules/@protobufjs/inquire": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", + "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==" + }, + "node_modules/@protobufjs/path": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==" + }, + "node_modules/@protobufjs/pool": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==" + }, + "node_modules/@protobufjs/utf8": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", + "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==" + }, + "node_modules/@tsconfig/node10": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", + "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==" + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==" + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==" + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==" + }, + "node_modules/@types/amqplib": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/@types/amqplib/-/amqplib-0.10.1.tgz", + "integrity": "sha512-j6ANKT79ncUDnAs/+9r9eDujxbeJoTjoVu33gHHcaPfmLQaMhvfbH2GqSe8KUM444epAp1Vl3peVOQfZk3UIqA==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/node": { + "version": "20.5.4", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.5.4.tgz", + "integrity": "sha512-Y9vbIAoM31djQZrPYjpTLo0XlaSwOIsrlfE3LpulZeRblttsLQRFRlBAppW0LOxyT3ALj2M5vU1ucQQayQH3jA==" + }, + "node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" + }, + "node_modules/acorn": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/amqplib": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/amqplib/-/amqplib-0.10.3.tgz", + "integrity": "sha512-UHmuSa7n8vVW/a5HGh2nFPqAEr8+cD4dEZ6u9GjP91nHfr1a54RyAKyra7Sb5NH7NBKOUlyQSMXIp0qAixKexw==", + "dependencies": { + "@acuminous/bitsyntax": "^0.1.2", + "buffer-more-ints": "~1.0.0", + "readable-stream": "1.x >=1.1.9", + "url-parse": "~1.5.10" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==" + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/buffer-more-ints": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-more-ints/-/buffer-more-ints-1.0.0.tgz", + "integrity": "sha512-EMetuGFz5SLsT0QTnXzINh4Ksr+oo4i+UGTXEshiGCQWnsgSs7ZhJ8fzlwQ+OzEMs0MpDAMr1hxnblp5a4vcHg==" + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==" + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/dotenv": { + "version": "16.3.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.3.1.tgz", + "integrity": "sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/motdotla/dotenv?sponsor=1" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/esbuild": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", + "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.18.20", + "@esbuild/android-arm64": "0.18.20", + "@esbuild/android-x64": "0.18.20", + "@esbuild/darwin-arm64": "0.18.20", + "@esbuild/darwin-x64": "0.18.20", + "@esbuild/freebsd-arm64": "0.18.20", + "@esbuild/freebsd-x64": "0.18.20", + "@esbuild/linux-arm": "0.18.20", + "@esbuild/linux-arm64": "0.18.20", + "@esbuild/linux-ia32": "0.18.20", + "@esbuild/linux-loong64": "0.18.20", + "@esbuild/linux-mips64el": "0.18.20", + "@esbuild/linux-ppc64": "0.18.20", + "@esbuild/linux-riscv64": "0.18.20", + "@esbuild/linux-s390x": "0.18.20", + "@esbuild/linux-x64": "0.18.20", + "@esbuild/netbsd-x64": "0.18.20", + "@esbuild/openbsd-x64": "0.18.20", + "@esbuild/sunos-x64": "0.18.20", + "@esbuild/win32-arm64": "0.18.20", + "@esbuild/win32-ia32": "0.18.20", + "@esbuild/win32-x64": "0.18.20" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "engines": { + "node": ">=6" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/geolib": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/geolib/-/geolib-3.3.4.tgz", + "integrity": "sha512-EicrlLLL3S42gE9/wde+11uiaYAaeSVDwCUIv2uMIoRBfNJCn8EsSI+6nS3r4TCKDO6+RQNM9ayLq2at+oZQWQ==" + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/ignore-by-default": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", + "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==" + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==" + }, + "node_modules/long": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", + "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==" + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==" + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/nodemon": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.0.1.tgz", + "integrity": "sha512-g9AZ7HmkhQkqXkRc20w+ZfQ73cHLbE8hnPbtaFbFtCumZsjyMhKk9LajQ07U5Ux28lvFjZ5X7HvWR1xzU8jHVw==", + "dependencies": { + "chokidar": "^3.5.2", + "debug": "^3.2.7", + "ignore-by-default": "^1.0.1", + "minimatch": "^3.1.2", + "pstree.remy": "^1.1.8", + "semver": "^7.5.3", + "simple-update-notifier": "^2.0.0", + "supports-color": "^5.5.0", + "touch": "^3.1.0", + "undefsafe": "^2.0.5" + }, + "bin": { + "nodemon": "bin/nodemon.js" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/nodemon" + } + }, + "node_modules/nodemon/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/nopt": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", + "integrity": "sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==", + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "*" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path": { + "version": "0.12.7", + "resolved": "https://registry.npmjs.org/path/-/path-0.12.7.tgz", + "integrity": "sha512-aXXC6s+1w7otVF9UletFkFcDsJeO7lSZBPUQhtb5O0xJe8LtYhj/GxldoL09bBj9+ZmE2hNoHqQSFMN5fikh4Q==", + "dependencies": { + "process": "^0.11.1", + "util": "^0.10.3" + } + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/prisma": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/prisma/-/prisma-5.2.0.tgz", + "integrity": "sha512-FfFlpjVCkZwrqxDnP4smlNYSH1so+CbfjgdpioFzGGqlQAEm6VHAYSzV7jJgC3ebtY9dNOhDMS2+4/1DDSM7bQ==", + "devOptional": true, + "hasInstallScript": true, + "dependencies": { + "@prisma/engines": "5.2.0" + }, + "bin": { + "prisma": "build/index.js" + }, + "engines": { + "node": ">=16.13" + } + }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/protobufjs": { + "version": "7.2.5", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.2.5.tgz", + "integrity": "sha512-gGXRSXvxQ7UiPgfw8gevrfRWcTlSbOFg+p/N+JVJEK5VhueL2miT6qTymqAmjr1Q5WbOCyJbyrk6JfWKwlFn6A==", + "hasInstallScript": true, + "dependencies": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/node": ">=13.7.0", + "long": "^5.0.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/pstree.remy": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", + "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==" + }, + "node_modules/querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==" + }, + "node_modules/readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==" + }, + "node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/simple-update-notifier": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", + "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==", + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==" + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "engines": { + "node": ">=4" + } + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/touch": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", + "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", + "dependencies": { + "nopt": "~1.0.10" + }, + "bin": { + "nodetouch": "bin/nodetouch.js" + } + }, + "node_modules/ts-node": { + "version": "10.9.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", + "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "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 + } + } + }, + "node_modules/tsconfig-paths": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", + "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==", + "dependencies": { + "json5": "^2.2.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/typescript": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", + "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undefsafe": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", + "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==" + }, + "node_modules/url-parse": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "node_modules/util": { + "version": "0.10.4", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", + "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==", + "dependencies": { + "inherits": "2.0.3" + } + }, + "node_modules/util/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==" + }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==" + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "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.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "engines": { + "node": ">=12" + } + }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "engines": { + "node": ">=6" + } + } + } +} diff --git a/services/restaurant/pnpm-lock.yaml b/services/restaurant/pnpm-lock.yaml deleted file mode 100644 index 0aef035e..00000000 --- a/services/restaurant/pnpm-lock.yaml +++ /dev/null @@ -1,999 +0,0 @@ -lockfileVersion: '6.0' - -settings: - autoInstallPeers: true - excludeLinksFromLockfile: false - -dependencies: - '@grpc/grpc-js': - specifier: ^1.8.18 - version: 1.8.18 - '@grpc/proto-loader': - specifier: ^0.7.8 - version: 0.7.8 - '@prisma/client': - specifier: 5.1.1 - version: 5.1.1(prisma@5.1.1) - amqplib: - specifier: ^0.10.3 - version: 0.10.3 - dotenv: - specifier: ^16.3.1 - version: 16.3.1 - esbuild: - specifier: ^0.18.15 - version: 0.18.15 - geolib: - specifier: ^3.3.4 - version: 3.3.4 - nodemon: - specifier: ^3.0.1 - version: 3.0.1 - path: - specifier: ^0.12.7 - version: 0.12.7 - ts-node: - specifier: ^10.9.1 - version: 10.9.1(@types/node@20.4.2)(typescript@5.1.6) - tsconfig-paths: - specifier: ^4.2.0 - version: 4.2.0 - -devDependencies: - '@types/amqplib': - specifier: ^0.10.1 - version: 0.10.1 - prisma: - specifier: ^5.1.1 - version: 5.1.1 - typescript: - specifier: ^5.1.6 - version: 5.1.6 - -packages: - - /@acuminous/bitsyntax@0.1.2: - resolution: {integrity: sha512-29lUK80d1muEQqiUsSo+3A0yP6CdspgC95EnKBMi22Xlwt79i/En4Vr67+cXhU+cZjbti3TgGGC5wy1stIywVQ==} - engines: {node: '>=0.8'} - dependencies: - buffer-more-ints: 1.0.0 - debug: 4.3.4 - safe-buffer: 5.1.2 - transitivePeerDependencies: - - supports-color - dev: false - - /@cspotcode/source-map-support@0.8.1: - resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} - engines: {node: '>=12'} - dependencies: - '@jridgewell/trace-mapping': 0.3.9 - dev: false - - /@esbuild/android-arm64@0.18.15: - resolution: {integrity: sha512-NI/gnWcMl2kXt1HJKOn2H69SYn4YNheKo6NZt1hyfKWdMbaGadxjZIkcj4Gjk/WPxnbFXs9/3HjGHaknCqjrww==} - engines: {node: '>=12'} - cpu: [arm64] - os: [android] - requiresBuild: true - dev: false - optional: true - - /@esbuild/android-arm@0.18.15: - resolution: {integrity: sha512-wlkQBWb79/jeEEoRmrxt/yhn5T1lU236OCNpnfRzaCJHZ/5gf82uYx1qmADTBWE0AR/v7FiozE1auk2riyQd3w==} - engines: {node: '>=12'} - cpu: [arm] - os: [android] - requiresBuild: true - dev: false - optional: true - - /@esbuild/android-x64@0.18.15: - resolution: {integrity: sha512-FM9NQamSaEm/IZIhegF76aiLnng1kEsZl2eve/emxDeReVfRuRNmvT28l6hoFD9TsCxpK+i4v8LPpEj74T7yjA==} - engines: {node: '>=12'} - cpu: [x64] - os: [android] - requiresBuild: true - dev: false - optional: true - - /@esbuild/darwin-arm64@0.18.15: - resolution: {integrity: sha512-XmrFwEOYauKte9QjS6hz60FpOCnw4zaPAb7XV7O4lx1r39XjJhTN7ZpXqJh4sN6q60zbP6QwAVVA8N/wUyBH/w==} - engines: {node: '>=12'} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: false - optional: true - - /@esbuild/darwin-x64@0.18.15: - resolution: {integrity: sha512-bMqBmpw1e//7Fh5GLetSZaeo9zSC4/CMtrVFdj+bqKPGJuKyfNJ5Nf2m3LknKZTS+Q4oyPiON+v3eaJ59sLB5A==} - engines: {node: '>=12'} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: false - optional: true - - /@esbuild/freebsd-arm64@0.18.15: - resolution: {integrity: sha512-LoTK5N3bOmNI9zVLCeTgnk5Rk0WdUTrr9dyDAQGVMrNTh9EAPuNwSTCgaKOKiDpverOa0htPcO9NwslSE5xuLA==} - engines: {node: '>=12'} - cpu: [arm64] - os: [freebsd] - requiresBuild: true - dev: false - optional: true - - /@esbuild/freebsd-x64@0.18.15: - resolution: {integrity: sha512-62jX5n30VzgrjAjOk5orYeHFq6sqjvsIj1QesXvn5OZtdt5Gdj0vUNJy9NIpjfdNdqr76jjtzBJKf+h2uzYuTQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [freebsd] - requiresBuild: true - dev: false - optional: true - - /@esbuild/linux-arm64@0.18.15: - resolution: {integrity: sha512-BWncQeuWDgYv0jTNzJjaNgleduV4tMbQjmk/zpPh/lUdMcNEAxy+jvneDJ6RJkrqloG7tB9S9rCrtfk/kuplsQ==} - engines: {node: '>=12'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@esbuild/linux-arm@0.18.15: - resolution: {integrity: sha512-dT4URUv6ir45ZkBqhwZwyFV6cH61k8MttIwhThp2BGiVtagYvCToF+Bggyx2VI57RG4Fbt21f9TmXaYx0DeUJg==} - engines: {node: '>=12'} - cpu: [arm] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@esbuild/linux-ia32@0.18.15: - resolution: {integrity: sha512-JPXORvgHRHITqfms1dWT/GbEY89u848dC08o0yK3fNskhp0t2TuNUnsrrSgOdH28ceb1hJuwyr8R/1RnyPwocw==} - engines: {node: '>=12'} - cpu: [ia32] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@esbuild/linux-loong64@0.18.15: - resolution: {integrity: sha512-kArPI0DopjJCEplsVj/H+2Qgzz7vdFSacHNsgoAKpPS6W/Ndh8Oe24HRDQ5QCu4jHgN6XOtfFfLpRx3TXv/mEg==} - engines: {node: '>=12'} - cpu: [loong64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@esbuild/linux-mips64el@0.18.15: - resolution: {integrity: sha512-b/tmngUfO02E00c1XnNTw/0DmloKjb6XQeqxaYuzGwHe0fHVgx5/D6CWi+XH1DvkszjBUkK9BX7n1ARTOst59w==} - engines: {node: '>=12'} - cpu: [mips64el] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@esbuild/linux-ppc64@0.18.15: - resolution: {integrity: sha512-KXPY69MWw79QJkyvUYb2ex/OgnN/8N/Aw5UDPlgoRtoEfcBqfeLodPr42UojV3NdkoO4u10NXQdamWm1YEzSKw==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@esbuild/linux-riscv64@0.18.15: - resolution: {integrity: sha512-komK3NEAeeGRnvFEjX1SfVg6EmkfIi5aKzevdvJqMydYr9N+pRQK0PGJXk+bhoPZwOUgLO4l99FZmLGk/L1jWg==} - engines: {node: '>=12'} - cpu: [riscv64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@esbuild/linux-s390x@0.18.15: - resolution: {integrity: sha512-632T5Ts6gQ2WiMLWRRyeflPAm44u2E/s/TJvn+BP6M5mnHSk93cieaypj3VSMYO2ePTCRqAFXtuYi1yv8uZJNA==} - engines: {node: '>=12'} - cpu: [s390x] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@esbuild/linux-x64@0.18.15: - resolution: {integrity: sha512-MsHtX0NgvRHsoOtYkuxyk4Vkmvk3PLRWfA4okK7c+6dT0Fu4SUqXAr9y4Q3d8vUf1VWWb6YutpL4XNe400iQ1g==} - engines: {node: '>=12'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - /@esbuild/netbsd-x64@0.18.15: - resolution: {integrity: sha512-djST6s+jQiwxMIVQ5rlt24JFIAr4uwUnzceuFL7BQT4CbrRtqBPueS4GjXSiIpmwVri1Icj/9pFRJ7/aScvT+A==} - engines: {node: '>=12'} - cpu: [x64] - os: [netbsd] - requiresBuild: true - dev: false - optional: true - - /@esbuild/openbsd-x64@0.18.15: - resolution: {integrity: sha512-naeRhUIvhsgeounjkF5mvrNAVMGAm6EJWiabskeE5yOeBbLp7T89tAEw0j5Jm/CZAwyLe3c67zyCWH6fsBLCpw==} - engines: {node: '>=12'} - cpu: [x64] - os: [openbsd] - requiresBuild: true - dev: false - optional: true - - /@esbuild/sunos-x64@0.18.15: - resolution: {integrity: sha512-qkT2+WxyKbNIKV1AEhI8QiSIgTHMcRctzSaa/I3kVgMS5dl3fOeoqkb7pW76KwxHoriImhx7Mg3TwN/auMDsyQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [sunos] - requiresBuild: true - dev: false - optional: true - - /@esbuild/win32-arm64@0.18.15: - resolution: {integrity: sha512-HC4/feP+pB2Vb+cMPUjAnFyERs+HJN7E6KaeBlFdBv799MhD+aPJlfi/yk36SED58J9TPwI8MAcVpJgej4ud0A==} - engines: {node: '>=12'} - cpu: [arm64] - os: [win32] - requiresBuild: true - dev: false - optional: true - - /@esbuild/win32-ia32@0.18.15: - resolution: {integrity: sha512-ovjwoRXI+gf52EVF60u9sSDj7myPixPxqzD5CmkEUmvs+W9Xd0iqISVBQn8xcx4ciIaIVlWCuTbYDOXOnOL44Q==} - engines: {node: '>=12'} - cpu: [ia32] - os: [win32] - requiresBuild: true - dev: false - optional: true - - /@esbuild/win32-x64@0.18.15: - resolution: {integrity: sha512-imUxH9a3WJARyAvrG7srLyiK73XdX83NXQkjKvQ+7vPh3ZxoLrzvPkQKKw2DwZ+RV2ZB6vBfNHP8XScAmQC3aA==} - engines: {node: '>=12'} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: false - optional: true - - /@grpc/grpc-js@1.8.18: - resolution: {integrity: sha512-2uWPtxhsXmVgd8WzDhfamSjHpZDXfMjMDciY6VRTq4Sn7rFzazyf0LLDa0oav+61UHIoEZb4KKaAV6S7NuJFbQ==} - engines: {node: ^8.13.0 || >=10.10.0} - dependencies: - '@grpc/proto-loader': 0.7.8 - '@types/node': 20.4.2 - dev: false - - /@grpc/proto-loader@0.7.8: - resolution: {integrity: sha512-GU12e2c8dmdXb7XUlOgYWZ2o2i+z9/VeACkxTA/zzAe2IjclC5PnVL0lpgjhrqfpDYHzM8B1TF6pqWegMYAzlA==} - engines: {node: '>=6'} - hasBin: true - dependencies: - '@types/long': 4.0.2 - lodash.camelcase: 4.3.0 - long: 4.0.0 - protobufjs: 7.2.4 - yargs: 17.7.2 - dev: false - - /@jridgewell/resolve-uri@3.1.1: - resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} - engines: {node: '>=6.0.0'} - dev: false - - /@jridgewell/sourcemap-codec@1.4.15: - resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} - dev: false - - /@jridgewell/trace-mapping@0.3.9: - resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} - dependencies: - '@jridgewell/resolve-uri': 3.1.1 - '@jridgewell/sourcemap-codec': 1.4.15 - dev: false - - /@prisma/client@5.1.1(prisma@5.1.1): - resolution: {integrity: sha512-fxcCeK5pMQGcgCqCrWsi+I2rpIbk0rAhdrN+ke7f34tIrgPwA68ensrpin+9+fZvuV2OtzHmuipwduSY6HswdA==} - engines: {node: '>=16.13'} - requiresBuild: true - peerDependencies: - prisma: '*' - peerDependenciesMeta: - prisma: - optional: true - dependencies: - '@prisma/engines-version': 5.1.1-1.6a3747c37ff169c90047725a05a6ef02e32ac97e - prisma: 5.1.1 - dev: false - - /@prisma/engines-version@5.1.1-1.6a3747c37ff169c90047725a05a6ef02e32ac97e: - resolution: {integrity: sha512-owZqbY/wucbr65bXJ/ljrHPgQU5xXTSkmcE/JcbqE1kusuAXV/TLN3/exmz21SZ5rJ7WDkyk70J2G/n68iogbQ==} - dev: false - - /@prisma/engines@5.1.1: - resolution: {integrity: sha512-NV/4nVNWFZSJCCIA3HIFJbbDKO/NARc9ej0tX5S9k2EVbkrFJC4Xt9b0u4rNZWL4V+F5LAjvta8vzEUw0rw+HA==} - requiresBuild: true - - /@protobufjs/aspromise@1.1.2: - resolution: {integrity: sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==} - dev: false - - /@protobufjs/base64@1.1.2: - resolution: {integrity: sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==} - dev: false - - /@protobufjs/codegen@2.0.4: - resolution: {integrity: sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==} - dev: false - - /@protobufjs/eventemitter@1.1.0: - resolution: {integrity: sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==} - dev: false - - /@protobufjs/fetch@1.1.0: - resolution: {integrity: sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==} - dependencies: - '@protobufjs/aspromise': 1.1.2 - '@protobufjs/inquire': 1.1.0 - dev: false - - /@protobufjs/float@1.0.2: - resolution: {integrity: sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==} - dev: false - - /@protobufjs/inquire@1.1.0: - resolution: {integrity: sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==} - dev: false - - /@protobufjs/path@1.1.2: - resolution: {integrity: sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==} - dev: false - - /@protobufjs/pool@1.1.0: - resolution: {integrity: sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==} - dev: false - - /@protobufjs/utf8@1.1.0: - resolution: {integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==} - dev: false - - /@tsconfig/node10@1.0.9: - resolution: {integrity: sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==} - dev: false - - /@tsconfig/node12@1.0.11: - resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} - dev: false - - /@tsconfig/node14@1.0.3: - resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} - dev: false - - /@tsconfig/node16@1.0.4: - resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} - dev: false - - /@types/amqplib@0.10.1: - resolution: {integrity: sha512-j6ANKT79ncUDnAs/+9r9eDujxbeJoTjoVu33gHHcaPfmLQaMhvfbH2GqSe8KUM444epAp1Vl3peVOQfZk3UIqA==} - dependencies: - '@types/node': 20.4.2 - dev: true - - /@types/long@4.0.2: - resolution: {integrity: sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==} - dev: false - - /@types/node@20.4.2: - resolution: {integrity: sha512-Dd0BYtWgnWJKwO1jkmTrzofjK2QXXcai0dmtzvIBhcA+RsG5h8R3xlyta0kGOZRNfL9GuRtb1knmPEhQrePCEw==} - - /abbrev@1.1.1: - resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} - dev: false - - /acorn-walk@8.2.0: - resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} - engines: {node: '>=0.4.0'} - dev: false - - /acorn@8.10.0: - resolution: {integrity: sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==} - engines: {node: '>=0.4.0'} - hasBin: true - dev: false - - /amqplib@0.10.3: - resolution: {integrity: sha512-UHmuSa7n8vVW/a5HGh2nFPqAEr8+cD4dEZ6u9GjP91nHfr1a54RyAKyra7Sb5NH7NBKOUlyQSMXIp0qAixKexw==} - engines: {node: '>=10'} - dependencies: - '@acuminous/bitsyntax': 0.1.2 - buffer-more-ints: 1.0.0 - readable-stream: 1.1.14 - url-parse: 1.5.10 - transitivePeerDependencies: - - supports-color - dev: false - - /ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} - dev: false - - /ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} - dependencies: - color-convert: 2.0.1 - dev: false - - /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: false - - /arg@4.1.3: - resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} - dev: false - - /balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - dev: false - - /binary-extensions@2.2.0: - resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} - engines: {node: '>=8'} - 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 - - /buffer-more-ints@1.0.0: - resolution: {integrity: sha512-EMetuGFz5SLsT0QTnXzINh4Ksr+oo4i+UGTXEshiGCQWnsgSs7ZhJ8fzlwQ+OzEMs0MpDAMr1hxnblp5a4vcHg==} - dev: false - - /chokidar@3.5.3: - resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} - engines: {node: '>= 8.10.0'} - dependencies: - anymatch: 3.1.3 - braces: 3.0.2 - glob-parent: 5.1.2 - is-binary-path: 2.1.0 - is-glob: 4.0.3 - normalize-path: 3.0.0 - readdirp: 3.6.0 - optionalDependencies: - fsevents: 2.3.2 - 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 - 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 - - /core-util-is@1.0.3: - resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} - dev: false - - /create-require@1.1.1: - resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} - dev: false - - /debug@3.2.7(supports-color@5.5.0): - resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - dependencies: - ms: 2.1.3 - supports-color: 5.5.0 - 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 - dev: false - - /diff@4.0.2: - resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} - engines: {node: '>=0.3.1'} - dev: false - - /dotenv@16.3.1: - resolution: {integrity: sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==} - engines: {node: '>=12'} - dev: false - - /emoji-regex@8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - dev: false - - /esbuild@0.18.15: - resolution: {integrity: sha512-3WOOLhrvuTGPRzQPU6waSDWrDTnQriia72McWcn6UCi43GhCHrXH4S59hKMeez+IITmdUuUyvbU9JIp+t3xlPQ==} - engines: {node: '>=12'} - hasBin: true - requiresBuild: true - optionalDependencies: - '@esbuild/android-arm': 0.18.15 - '@esbuild/android-arm64': 0.18.15 - '@esbuild/android-x64': 0.18.15 - '@esbuild/darwin-arm64': 0.18.15 - '@esbuild/darwin-x64': 0.18.15 - '@esbuild/freebsd-arm64': 0.18.15 - '@esbuild/freebsd-x64': 0.18.15 - '@esbuild/linux-arm': 0.18.15 - '@esbuild/linux-arm64': 0.18.15 - '@esbuild/linux-ia32': 0.18.15 - '@esbuild/linux-loong64': 0.18.15 - '@esbuild/linux-mips64el': 0.18.15 - '@esbuild/linux-ppc64': 0.18.15 - '@esbuild/linux-riscv64': 0.18.15 - '@esbuild/linux-s390x': 0.18.15 - '@esbuild/linux-x64': 0.18.15 - '@esbuild/netbsd-x64': 0.18.15 - '@esbuild/openbsd-x64': 0.18.15 - '@esbuild/sunos-x64': 0.18.15 - '@esbuild/win32-arm64': 0.18.15 - '@esbuild/win32-ia32': 0.18.15 - '@esbuild/win32-x64': 0.18.15 - dev: false - - /escalade@3.1.1: - resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} - engines: {node: '>=6'} - 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 - - /fsevents@2.3.2: - resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - requiresBuild: true - dev: false - optional: true - - /geolib@3.3.4: - resolution: {integrity: sha512-EicrlLLL3S42gE9/wde+11uiaYAaeSVDwCUIv2uMIoRBfNJCn8EsSI+6nS3r4TCKDO6+RQNM9ayLq2at+oZQWQ==} - dev: false - - /get-caller-file@2.0.5: - resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} - engines: {node: 6.* || 8.* || >= 10.*} - dev: false - - /glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} - dependencies: - is-glob: 4.0.3 - dev: false - - /has-flag@3.0.0: - resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} - engines: {node: '>=4'} - dev: false - - /ignore-by-default@1.0.1: - resolution: {integrity: sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==} - dev: false - - /inherits@2.0.3: - resolution: {integrity: sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==} - dev: false - - /is-binary-path@2.1.0: - resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} - engines: {node: '>=8'} - dependencies: - binary-extensions: 2.2.0 - dev: false - - /is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} - dev: false - - /is-fullwidth-code-point@3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} - engines: {node: '>=8'} - 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-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} - dev: false - - /isarray@0.0.1: - resolution: {integrity: sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==} - dev: false - - /json5@2.2.3: - resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} - engines: {node: '>=6'} - hasBin: true - dev: false - - /lodash.camelcase@4.3.0: - resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} - dev: false - - /long@4.0.0: - resolution: {integrity: sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==} - dev: false - - /long@5.2.3: - resolution: {integrity: sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==} - dev: false - - /lru-cache@6.0.0: - resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} - engines: {node: '>=10'} - dependencies: - yallist: 4.0.0 - dev: false - - /make-error@1.3.6: - resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} - dev: false - - /minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} - dependencies: - brace-expansion: 1.1.11 - dev: false - - /minimist@1.2.8: - resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - dev: false - - /ms@2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - dev: false - - /ms@2.1.3: - resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - dev: false - - /nodemon@3.0.1: - resolution: {integrity: sha512-g9AZ7HmkhQkqXkRc20w+ZfQ73cHLbE8hnPbtaFbFtCumZsjyMhKk9LajQ07U5Ux28lvFjZ5X7HvWR1xzU8jHVw==} - engines: {node: '>=10'} - hasBin: true - dependencies: - chokidar: 3.5.3 - debug: 3.2.7(supports-color@5.5.0) - ignore-by-default: 1.0.1 - minimatch: 3.1.2 - pstree.remy: 1.1.8 - semver: 7.5.4 - simple-update-notifier: 2.0.0 - supports-color: 5.5.0 - touch: 3.1.0 - undefsafe: 2.0.5 - dev: false - - /nopt@1.0.10: - resolution: {integrity: sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==} - hasBin: true - dependencies: - abbrev: 1.1.1 - dev: false - - /normalize-path@3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} - engines: {node: '>=0.10.0'} - dev: false - - /path@0.12.7: - resolution: {integrity: sha512-aXXC6s+1w7otVF9UletFkFcDsJeO7lSZBPUQhtb5O0xJe8LtYhj/GxldoL09bBj9+ZmE2hNoHqQSFMN5fikh4Q==} - dependencies: - process: 0.11.10 - util: 0.10.4 - dev: false - - /picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} - dev: false - - /prisma@5.1.1: - resolution: {integrity: sha512-WJFG/U7sMmcc6TjJTTifTfpI6Wjoh55xl4AzopVwAdyK68L9/ogNo8QQ2cxuUjJf/Wa82z/uhyh3wMzvRIBphg==} - engines: {node: '>=16.13'} - hasBin: true - requiresBuild: true - dependencies: - '@prisma/engines': 5.1.1 - - /process@0.11.10: - resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} - engines: {node: '>= 0.6.0'} - dev: false - - /protobufjs@7.2.4: - resolution: {integrity: sha512-AT+RJgD2sH8phPmCf7OUZR8xGdcJRga4+1cOaXJ64hvcSkVhNcRHOwIxUatPH15+nj59WAGTDv3LSGZPEQbJaQ==} - engines: {node: '>=12.0.0'} - requiresBuild: true - dependencies: - '@protobufjs/aspromise': 1.1.2 - '@protobufjs/base64': 1.1.2 - '@protobufjs/codegen': 2.0.4 - '@protobufjs/eventemitter': 1.1.0 - '@protobufjs/fetch': 1.1.0 - '@protobufjs/float': 1.0.2 - '@protobufjs/inquire': 1.1.0 - '@protobufjs/path': 1.1.2 - '@protobufjs/pool': 1.1.0 - '@protobufjs/utf8': 1.1.0 - '@types/node': 20.4.2 - long: 5.2.3 - dev: false - - /pstree.remy@1.1.8: - resolution: {integrity: sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==} - dev: false - - /querystringify@2.2.0: - resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} - dev: false - - /readable-stream@1.1.14: - resolution: {integrity: sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==} - dependencies: - core-util-is: 1.0.3 - inherits: 2.0.3 - isarray: 0.0.1 - string_decoder: 0.10.31 - dev: false - - /readdirp@3.6.0: - resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} - engines: {node: '>=8.10.0'} - dependencies: - picomatch: 2.3.1 - dev: false - - /require-directory@2.1.1: - resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} - engines: {node: '>=0.10.0'} - dev: false - - /requires-port@1.0.0: - resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} - dev: false - - /safe-buffer@5.1.2: - resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} - dev: false - - /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 - dev: false - - /simple-update-notifier@2.0.0: - resolution: {integrity: sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==} - engines: {node: '>=10'} - dependencies: - semver: 7.5.4 - dev: false - - /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 - dev: false - - /string_decoder@0.10.31: - resolution: {integrity: sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==} - dev: false - - /strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} - dependencies: - ansi-regex: 5.0.1 - dev: false - - /strip-bom@3.0.0: - resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} - engines: {node: '>=4'} - dev: false - - /supports-color@5.5.0: - resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} - engines: {node: '>=4'} - dependencies: - has-flag: 3.0.0 - 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 - - /touch@3.1.0: - resolution: {integrity: sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==} - hasBin: true - dependencies: - nopt: 1.0.10 - dev: false - - /ts-node@10.9.1(@types/node@20.4.2)(typescript@5.1.6): - 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': 20.4.2 - 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.1.6 - v8-compile-cache-lib: 3.0.1 - yn: 3.1.1 - dev: false - - /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: false - - /typescript@5.1.6: - resolution: {integrity: sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==} - engines: {node: '>=14.17'} - hasBin: true - - /undefsafe@2.0.5: - resolution: {integrity: sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==} - dev: false - - /url-parse@1.5.10: - resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} - dependencies: - querystringify: 2.2.0 - requires-port: 1.0.0 - dev: false - - /util@0.10.4: - resolution: {integrity: sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==} - dependencies: - inherits: 2.0.3 - dev: false - - /v8-compile-cache-lib@3.0.1: - resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} - dev: false - - /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 - dev: false - - /y18n@5.0.8: - resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} - engines: {node: '>=10'} - dev: false - - /yallist@4.0.0: - resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} - dev: false - - /yargs-parser@21.1.1: - resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} - engines: {node: '>=12'} - 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 - dev: false - - /yn@3.1.1: - resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} - engines: {node: '>=6'} - dev: false diff --git a/services/restaurant/script.sh b/services/restaurant/script.sh new file mode 100644 index 00000000..71759243 --- /dev/null +++ b/services/restaurant/script.sh @@ -0,0 +1,5 @@ +#!/bin/bash + +npx prisma migrate deploy + +node index.js \ No newline at end of file diff --git a/services/stock/package-lock.json b/services/stock/package-lock.json new file mode 100644 index 00000000..0c4c9d3c --- /dev/null +++ b/services/stock/package-lock.json @@ -0,0 +1,4256 @@ +{ + "name": "@goodfood/stock", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "@goodfood/stock", + "version": "1.0.0", + "hasInstallScript": true, + "dependencies": { + "@grpc/grpc-js": "1.8.14", + "@grpc/proto-loader": "0.7.6", + "@prisma/client": "4.16.2", + "amqplib": "^0.10.3", + "dotenv": "^16.0.3", + "grpc-server-reflection": "^0.1.5", + "protobufjs": "7.2.2" + }, + "bin": { + "stock": "dist/index.js" + }, + "devDependencies": { + "@types/amqplib": "^0.10.1", + "@types/node": "18.15.9", + "esbuild": "^0.17.18", + "grpc-tools": "^1.12.4", + "nodemon": "^2.0.22", + "pkg": "^5.8.1", + "prisma": "4.16.2", + "ts-node": "10.9.1", + "tsconfig-paths": "^4.2.0", + "typescript": "5.0.2", + "vite-tsconfig-paths": "^4.2.0", + "vitest": "^0.29.8" + } + }, + "node_modules/@acuminous/bitsyntax": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@acuminous/bitsyntax/-/bitsyntax-0.1.2.tgz", + "integrity": "sha512-29lUK80d1muEQqiUsSo+3A0yP6CdspgC95EnKBMi22Xlwt79i/En4Vr67+cXhU+cZjbti3TgGGC5wy1stIywVQ==", + "dependencies": { + "buffer-more-ints": "~1.0.0", + "debug": "^4.3.4", + "safe-buffer": "~5.1.2" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/@babel/generator": { + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.2.tgz", + "integrity": "sha512-W1lG5vUwFvfMd8HVXqdfbuG7RuaSrTCCD8cl8fP8wOivdbtbIg2Db3IWUcgvfxKbbn6ZBGYRW/Zk1MIwK49mgw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.18.2", + "@jridgewell/gen-mapping": "^0.3.0", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", + "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz", + "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.18.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.4.tgz", + "integrity": "sha512-FDge0dFazETFcxGw/EXzOkN8uJp0PC7Qbm+Pe9T+av2zlBpOgunFHkQPPn+eRuClU73JF+98D531UgayY89tow==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/types": { + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.19.0.tgz", + "integrity": "sha512-YuGopBq3ke25BVSiS6fgF49Ul9gH1x70Bcr6bqRLjWCkcX8Hre1/5+z+IiWOIerRMSSEfGZVB9z9kyq7wVs9YA==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.18.10", + "@babel/helper-validator-identifier": "^7.18.6", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.19.tgz", + "integrity": "sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.19.tgz", + "integrity": "sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.19.tgz", + "integrity": "sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.19.tgz", + "integrity": "sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.19.tgz", + "integrity": "sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.19.tgz", + "integrity": "sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.19.tgz", + "integrity": "sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.19.tgz", + "integrity": "sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.19.tgz", + "integrity": "sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.19.tgz", + "integrity": "sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.19.tgz", + "integrity": "sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.19.tgz", + "integrity": "sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.19.tgz", + "integrity": "sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.19.tgz", + "integrity": "sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.19.tgz", + "integrity": "sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.19.tgz", + "integrity": "sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.19.tgz", + "integrity": "sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.19.tgz", + "integrity": "sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.19.tgz", + "integrity": "sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.19.tgz", + "integrity": "sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.19.tgz", + "integrity": "sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.19.tgz", + "integrity": "sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@grpc/grpc-js": { + "version": "1.8.14", + "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.8.14.tgz", + "integrity": "sha512-w84maJ6CKl5aApCMzFll0hxtFNT6or9WwMslobKaqWUEf1K+zhlL43bSQhFreyYWIWR+Z0xnVFC1KtLm4ZpM/A==", + "dependencies": { + "@grpc/proto-loader": "^0.7.0", + "@types/node": ">=12.12.47" + }, + "engines": { + "node": "^8.13.0 || >=10.10.0" + } + }, + "node_modules/@grpc/proto-loader": { + "version": "0.7.6", + "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.6.tgz", + "integrity": "sha512-QyAXR8Hyh7uMDmveWxDSUcJr9NAWaZ2I6IXgAYvQmfflwouTM+rArE2eEaCtLlRqO81j7pRLCt81IefUei6Zbw==", + "dependencies": { + "@types/long": "^4.0.1", + "lodash.camelcase": "^4.3.0", + "long": "^4.0.0", + "protobufjs": "^7.0.0", + "yargs": "^16.2.0" + }, + "bin": { + "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.19", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz", + "integrity": "sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@mapbox/node-pre-gyp": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.11.tgz", + "integrity": "sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==", + "dev": true, + "dependencies": { + "detect-libc": "^2.0.0", + "https-proxy-agent": "^5.0.0", + "make-dir": "^3.1.0", + "node-fetch": "^2.6.7", + "nopt": "^5.0.0", + "npmlog": "^5.0.1", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.11" + }, + "bin": { + "node-pre-gyp": "bin/node-pre-gyp" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@prisma/client": { + "version": "4.16.2", + "resolved": "https://registry.npmjs.org/@prisma/client/-/client-4.16.2.tgz", + "integrity": "sha512-qCoEyxv1ZrQ4bKy39GnylE8Zq31IRmm8bNhNbZx7bF2cU5aiCCnSa93J2imF88MBjn7J9eUQneNxUQVJdl/rPQ==", + "hasInstallScript": true, + "dependencies": { + "@prisma/engines-version": "4.16.1-1.4bc8b6e1b66cb932731fb1bdbbc550d1e010de81" + }, + "engines": { + "node": ">=14.17" + }, + "peerDependencies": { + "prisma": "*" + }, + "peerDependenciesMeta": { + "prisma": { + "optional": true + } + } + }, + "node_modules/@prisma/engines": { + "version": "4.16.2", + "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-4.16.2.tgz", + "integrity": "sha512-vx1nxVvN4QeT/cepQce68deh/Turxy5Mr+4L4zClFuK1GlxN3+ivxfuv+ej/gvidWn1cE1uAhW7ALLNlYbRUAw==", + "devOptional": true, + "hasInstallScript": true + }, + "node_modules/@prisma/engines-version": { + "version": "4.16.1-1.4bc8b6e1b66cb932731fb1bdbbc550d1e010de81", + "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-4.16.1-1.4bc8b6e1b66cb932731fb1bdbbc550d1e010de81.tgz", + "integrity": "sha512-q617EUWfRIDTriWADZ4YiWRZXCa/WuhNgLTVd+HqWLffjMSPzyM5uOWoauX91wvQClSKZU4pzI4JJLQ9Kl62Qg==" + }, + "node_modules/@protobufjs/aspromise": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==" + }, + "node_modules/@protobufjs/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" + }, + "node_modules/@protobufjs/codegen": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", + "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" + }, + "node_modules/@protobufjs/eventemitter": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", + "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==" + }, + "node_modules/@protobufjs/fetch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", + "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", + "dependencies": { + "@protobufjs/aspromise": "^1.1.1", + "@protobufjs/inquire": "^1.1.0" + } + }, + "node_modules/@protobufjs/float": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", + "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==" + }, + "node_modules/@protobufjs/inquire": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", + "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==" + }, + "node_modules/@protobufjs/path": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==" + }, + "node_modules/@protobufjs/pool": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==" + }, + "node_modules/@protobufjs/utf8": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", + "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==" + }, + "node_modules/@tsconfig/node10": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", + "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", + "dev": true + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", + "dev": true + }, + "node_modules/@types/amqplib": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/@types/amqplib/-/amqplib-0.10.1.tgz", + "integrity": "sha512-j6ANKT79ncUDnAs/+9r9eDujxbeJoTjoVu33gHHcaPfmLQaMhvfbH2GqSe8KUM444epAp1Vl3peVOQfZk3UIqA==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/chai": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.5.tgz", + "integrity": "sha512-mEo1sAde+UCE6b2hxn332f1g1E8WfYRu6p5SvTKr2ZKC1f7gFJXk4h5PyGP9Dt6gCaG8y8XhwnXWC6Iy2cmBng==", + "dev": true + }, + "node_modules/@types/chai-subset": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@types/chai-subset/-/chai-subset-1.3.3.tgz", + "integrity": "sha512-frBecisrNGz+F4T6bcc+NLeolfiojh5FxW2klu669+8BARtyQv2C/GkNW6FUodVe4BroGMP/wER/YDGc7rEllw==", + "dev": true, + "dependencies": { + "@types/chai": "*" + } + }, + "node_modules/@types/long": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz", + "integrity": "sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==" + }, + "node_modules/@types/node": { + "version": "18.15.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.9.tgz", + "integrity": "sha512-dUxhiNzBLr6IqlZXz6e/rN2YQXlFgOei/Dxy+e3cyXTJ4txSUbGT2/fmnD6zd/75jDMeW5bDee+YXxlFKHoV0A==" + }, + "node_modules/@vitest/expect": { + "version": "0.29.8", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-0.29.8.tgz", + "integrity": "sha512-xlcVXn5I5oTq6NiZSY3ykyWixBxr5mG8HYtjvpgg6KaqHm0mvhX18xuwl5YGxIRNt/A5jidd7CWcNHrSvgaQqQ==", + "dev": true, + "dependencies": { + "@vitest/spy": "0.29.8", + "@vitest/utils": "0.29.8", + "chai": "^4.3.7" + } + }, + "node_modules/@vitest/runner": { + "version": "0.29.8", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-0.29.8.tgz", + "integrity": "sha512-FzdhnRDwEr/A3Oo1jtIk/B952BBvP32n1ObMEb23oEJNO+qO5cBet6M2XWIDQmA7BDKGKvmhUf2naXyp/2JEwQ==", + "dev": true, + "dependencies": { + "@vitest/utils": "0.29.8", + "p-limit": "^4.0.0", + "pathe": "^1.1.0" + } + }, + "node_modules/@vitest/spy": { + "version": "0.29.8", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-0.29.8.tgz", + "integrity": "sha512-VdjBe9w34vOMl5I5mYEzNX8inTxrZ+tYUVk9jxaZJmHFwmDFC/GV3KBFTA/JKswr3XHvZL+FE/yq5EVhb6pSAw==", + "dev": true, + "dependencies": { + "tinyspy": "^1.0.2" + } + }, + "node_modules/@vitest/utils": { + "version": "0.29.8", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-0.29.8.tgz", + "integrity": "sha512-qGzuf3vrTbnoY+RjjVVIBYfuWMjn3UMUqyQtdGNZ6ZIIyte7B37exj6LaVkrZiUTvzSadVvO/tJm8AEgbGCBPg==", + "dev": true, + "dependencies": { + "cli-truncate": "^3.1.0", + "diff": "^5.1.0", + "loupe": "^2.3.6", + "pretty-format": "^27.5.1" + } + }, + "node_modules/@vitest/utils/node_modules/diff": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.1.0.tgz", + "integrity": "sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true + }, + "node_modules/acorn": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/amqplib": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/amqplib/-/amqplib-0.10.3.tgz", + "integrity": "sha512-UHmuSa7n8vVW/a5HGh2nFPqAEr8+cD4dEZ6u9GjP91nHfr1a54RyAKyra7Sb5NH7NBKOUlyQSMXIp0qAixKexw==", + "dependencies": { + "@acuminous/bitsyntax": "^0.1.2", + "buffer-more-ints": "~1.0.0", + "readable-stream": "1.x >=1.1.9", + "url-parse": "~1.5.10" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/aproba": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", + "dev": true + }, + "node_modules/are-we-there-yet": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", + "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", + "dev": true, + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/are-we-there-yet/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/are-we-there-yet/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/are-we-there-yet/node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dev": true, + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/bl/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/bl/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/bl/node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/buffer-more-ints": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-more-ints/-/buffer-more-ints-1.0.0.tgz", + "integrity": "sha512-EMetuGFz5SLsT0QTnXzINh4Ksr+oo4i+UGTXEshiGCQWnsgSs7ZhJ8fzlwQ+OzEMs0MpDAMr1hxnblp5a4vcHg==" + }, + "node_modules/cac": { + "version": "6.7.14", + "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", + "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/chai": { + "version": "4.3.8", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.8.tgz", + "integrity": "sha512-vX4YvVVtxlfSZ2VecZgFUTU5qPCYsobVI2O9FmwEXBhDigYGQA6jRXCycIs1yJnnWbZ6/+a2zNIF5DfVCcJBFQ==", + "dev": true, + "dependencies": { + "assertion-error": "^1.1.0", + "check-error": "^1.0.2", + "deep-eql": "^4.1.2", + "get-func-name": "^2.0.0", + "loupe": "^2.3.1", + "pathval": "^1.1.1", + "type-detect": "^4.0.5" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chalk/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/chalk/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/check-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", + "integrity": "sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/cli-truncate": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-3.1.0.tgz", + "integrity": "sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==", + "dev": true, + "dependencies": { + "slice-ansi": "^5.0.0", + "string-width": "^5.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-truncate/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/cli-truncate/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, + "node_modules/cli-truncate/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-truncate/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "dev": true, + "bin": { + "color-support": "bin.js" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", + "dev": true + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "dev": true, + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/deep-eql": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz", + "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==", + "dev": true, + "dependencies": { + "type-detect": "^4.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "dev": true, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", + "dev": true + }, + "node_modules/detect-libc": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.2.tgz", + "integrity": "sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dotenv": { + "version": "16.3.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.3.1.tgz", + "integrity": "sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/motdotla/dotenv?sponsor=1" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/esbuild": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.19.tgz", + "integrity": "sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.17.19", + "@esbuild/android-arm64": "0.17.19", + "@esbuild/android-x64": "0.17.19", + "@esbuild/darwin-arm64": "0.17.19", + "@esbuild/darwin-x64": "0.17.19", + "@esbuild/freebsd-arm64": "0.17.19", + "@esbuild/freebsd-x64": "0.17.19", + "@esbuild/linux-arm": "0.17.19", + "@esbuild/linux-arm64": "0.17.19", + "@esbuild/linux-ia32": "0.17.19", + "@esbuild/linux-loong64": "0.17.19", + "@esbuild/linux-mips64el": "0.17.19", + "@esbuild/linux-ppc64": "0.17.19", + "@esbuild/linux-riscv64": "0.17.19", + "@esbuild/linux-s390x": "0.17.19", + "@esbuild/linux-x64": "0.17.19", + "@esbuild/netbsd-x64": "0.17.19", + "@esbuild/openbsd-x64": "0.17.19", + "@esbuild/sunos-x64": "0.17.19", + "@esbuild/win32-arm64": "0.17.19", + "@esbuild/win32-ia32": "0.17.19", + "@esbuild/win32-x64": "0.17.19" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "engines": { + "node": ">=6" + } + }, + "node_modules/expand-template": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", + "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/fast-glob": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", + "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + } + }, + "node_modules/from2/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "node_modules/from2/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/from2/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "dev": true + }, + "node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/fs-minipass/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "node_modules/gauge": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", + "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", + "dev": true, + "dependencies": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.2", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.1", + "object-assign": "^4.1.1", + "signal-exit": "^3.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-func-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", + "integrity": "sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/github-from-package": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", + "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==", + "dev": true + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globrex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz", + "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==", + "dev": true + }, + "node_modules/google-protobuf": { + "version": "3.21.2", + "resolved": "https://registry.npmjs.org/google-protobuf/-/google-protobuf-3.21.2.tgz", + "integrity": "sha512-3MSOYFO5U9mPGikIYCzK0SaThypfGgS6bHqrUGXG3DPHCrb+txNqeEcns1W0lkGfk0rCyNXm7xB9rMxnCiZOoA==" + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true + }, + "node_modules/grpc-server-reflection": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/grpc-server-reflection/-/grpc-server-reflection-0.1.5.tgz", + "integrity": "sha512-i69RYu6v65enzknNAPUgerFuVQfo+L3n9g4c1A/Sv5jUHMpxMIjSbBA+YWls9Sr4Flac4oohp4Gx8f389CaHuw==", + "dependencies": { + "google-protobuf": "^3.19.1" + } + }, + "node_modules/grpc-tools": { + "version": "1.12.4", + "resolved": "https://registry.npmjs.org/grpc-tools/-/grpc-tools-1.12.4.tgz", + "integrity": "sha512-5+mLAJJma3BjnW/KQp6JBjUMgvu7Mu3dBvBPd1dcbNIb+qiR0817zDpgPjS7gRb+l/8EVNIa3cB02xI9JLToKg==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "@mapbox/node-pre-gyp": "^1.0.5" + }, + "bin": { + "grpc_tools_node_protoc": "bin/protoc.js", + "grpc_tools_node_protoc_plugin": "bin/protoc_plugin.js" + } + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", + "dev": true + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dev": true, + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/ignore": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/ignore-by-default": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", + "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==", + "dev": true + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true + }, + "node_modules/into-stream": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/into-stream/-/into-stream-6.0.0.tgz", + "integrity": "sha512-XHbaOAvP+uFKUFsOgoNPRjLkwB+I22JFPFe5OjTkQ0nwgj6+pSjb4NmB6VMxaPshLiOf+zcpOCBQuLwC1KHhZA==", + "dev": true, + "dependencies": { + "from2": "^2.3.0", + "p-is-promise": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz", + "integrity": "sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonc-parser": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", + "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", + "dev": true + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/local-pkg": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.4.3.tgz", + "integrity": "sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==" + }, + "node_modules/long": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", + "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" + }, + "node_modules/loupe": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.6.tgz", + "integrity": "sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==", + "dev": true, + "dependencies": { + "get-func-name": "^2.0.0" + } + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minizlib/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mkdirp-classic": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", + "dev": true + }, + "node_modules/mlly": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.4.0.tgz", + "integrity": "sha512-ua8PAThnTwpprIaU47EPeZ/bPUVp2QYBbWMphUQpVdBI3Lgqzm5KZQ45Agm3YJedHXaIHl6pBGabaLSUPPSptg==", + "dev": true, + "dependencies": { + "acorn": "^8.9.0", + "pathe": "^1.1.1", + "pkg-types": "^1.0.3", + "ufo": "^1.1.2" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/multistream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/multistream/-/multistream-4.1.0.tgz", + "integrity": "sha512-J1XDiAmmNpRCBfIWJv+n0ymC4ABcf/Pl+5YvC5B/D2f/2+8PtHvCNxMPKiQcZyi922Hq69J2YOpb1pTywfifyw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "once": "^1.4.0", + "readable-stream": "^3.6.0" + } + }, + "node_modules/multistream/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/multistream/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/multistream/node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/nanoid": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", + "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/napi-build-utils": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", + "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==", + "dev": true + }, + "node_modules/node-abi": { + "version": "3.47.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.47.0.tgz", + "integrity": "sha512-2s6B2CWZM//kPgwnuI0KrYwNjfdByE25zvAaEpq9IH4zcNsarH8Ihu/UuX6XMPEogDAxkuUFeZn60pXNHAqn3A==", + "dev": true, + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "dev": true, + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/nodemon": { + "version": "2.0.22", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.22.tgz", + "integrity": "sha512-B8YqaKMmyuCO7BowF1Z1/mkPqLk6cs/l63Ojtd6otKjMx47Dq1utxfRxcavH1I7VSaL8n5BUaoutadnsX3AAVQ==", + "dev": true, + "dependencies": { + "chokidar": "^3.5.2", + "debug": "^3.2.7", + "ignore-by-default": "^1.0.1", + "minimatch": "^3.1.2", + "pstree.remy": "^1.1.8", + "semver": "^5.7.1", + "simple-update-notifier": "^1.0.7", + "supports-color": "^5.5.0", + "touch": "^3.1.0", + "undefsafe": "^2.0.5" + }, + "bin": { + "nodemon": "bin/nodemon.js" + }, + "engines": { + "node": ">=8.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/nodemon" + } + }, + "node_modules/nodemon/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/nodemon/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "dev": true, + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npmlog": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", + "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", + "dev": true, + "dependencies": { + "are-we-there-yet": "^2.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^3.0.0", + "set-blocking": "^2.0.0" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/p-is-promise": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-3.0.0.tgz", + "integrity": "sha512-Wo8VsW4IRQSKVXsJCn7TomUaVtyfjVDn3nUP7kE967BQk0CwFpdbZs0X0uk5sW9mkBa9eNM7hCMaG93WUAwxYQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-limit": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", + "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^1.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/pathe": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.1.tgz", + "integrity": "sha512-d+RQGp0MAYTIaDBIMmOfMwz3E+LOZnxx1HZd5R18mmCZY0QBlK0LDZfPc8FW8Ed2DlvsuE6PRjroDY+wg4+j/Q==", + "dev": true + }, + "node_modules/pathval": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", + "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pkg": { + "version": "5.8.1", + "resolved": "https://registry.npmjs.org/pkg/-/pkg-5.8.1.tgz", + "integrity": "sha512-CjBWtFStCfIiT4Bde9QpJy0KeH19jCfwZRJqHFDFXfhUklCx8JoFmMj3wgnEYIwGmZVNkhsStPHEOnrtrQhEXA==", + "dev": true, + "dependencies": { + "@babel/generator": "7.18.2", + "@babel/parser": "7.18.4", + "@babel/types": "7.19.0", + "chalk": "^4.1.2", + "fs-extra": "^9.1.0", + "globby": "^11.1.0", + "into-stream": "^6.0.0", + "is-core-module": "2.9.0", + "minimist": "^1.2.6", + "multistream": "^4.1.0", + "pkg-fetch": "3.4.2", + "prebuild-install": "7.1.1", + "resolve": "^1.22.0", + "stream-meter": "^1.0.4" + }, + "bin": { + "pkg": "lib-es5/bin.js" + }, + "peerDependencies": { + "node-notifier": ">=9.0.1" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/pkg-fetch": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/pkg-fetch/-/pkg-fetch-3.4.2.tgz", + "integrity": "sha512-0+uijmzYcnhC0hStDjm/cl2VYdrmVVBpe7Q8k9YBojxmR5tG8mvR9/nooQq3QSXiQqORDVOTY3XqMEqJVIzkHA==", + "dev": true, + "dependencies": { + "chalk": "^4.1.2", + "fs-extra": "^9.1.0", + "https-proxy-agent": "^5.0.0", + "node-fetch": "^2.6.6", + "progress": "^2.0.3", + "semver": "^7.3.5", + "tar-fs": "^2.1.1", + "yargs": "^16.2.0" + }, + "bin": { + "pkg-fetch": "lib-es5/bin.js" + } + }, + "node_modules/pkg-types": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.0.3.tgz", + "integrity": "sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==", + "dev": true, + "dependencies": { + "jsonc-parser": "^3.2.0", + "mlly": "^1.2.0", + "pathe": "^1.1.0" + } + }, + "node_modules/postcss": { + "version": "8.4.28", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.28.tgz", + "integrity": "sha512-Z7V5j0cq8oEKyejIKfpD8b4eBy9cwW2JWPk0+fB1HOAMsfHbnAXLLS+PfVWlzMSLQaWttKDt607I0XHmpE67Vw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/prebuild-install": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.1.tgz", + "integrity": "sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==", + "dev": true, + "dependencies": { + "detect-libc": "^2.0.0", + "expand-template": "^2.0.3", + "github-from-package": "0.0.0", + "minimist": "^1.2.3", + "mkdirp-classic": "^0.5.3", + "napi-build-utils": "^1.0.1", + "node-abi": "^3.3.0", + "pump": "^3.0.0", + "rc": "^1.2.7", + "simple-get": "^4.0.0", + "tar-fs": "^2.0.0", + "tunnel-agent": "^0.6.0" + }, + "bin": { + "prebuild-install": "bin.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/pretty-format": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", + "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/prisma": { + "version": "4.16.2", + "resolved": "https://registry.npmjs.org/prisma/-/prisma-4.16.2.tgz", + "integrity": "sha512-SYCsBvDf0/7XSJyf2cHTLjLeTLVXYfqp7pG5eEVafFLeT0u/hLFz/9W196nDRGUOo1JfPatAEb+uEnTQImQC1g==", + "devOptional": true, + "hasInstallScript": true, + "dependencies": { + "@prisma/engines": "4.16.2" + }, + "bin": { + "prisma": "build/index.js", + "prisma2": "build/index.js" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/protobufjs": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.2.2.tgz", + "integrity": "sha512-++PrQIjrom+bFDPpfmqXfAGSQs40116JRrqqyf53dymUMvvb5d/LMRyicRoF1AUKoXVS1/IgJXlEgcpr4gTF3Q==", + "hasInstallScript": true, + "dependencies": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/node": ">=13.7.0", + "long": "^5.0.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/protobufjs/node_modules/long": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", + "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==" + }, + "node_modules/pstree.remy": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", + "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", + "dev": true + }, + "node_modules/pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==" + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dev": true, + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, + "node_modules/react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", + "dev": true + }, + "node_modules/readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==" + }, + "node_modules/resolve": { + "version": "1.22.4", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.4.tgz", + "integrity": "sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==", + "dev": true, + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve/node_modules/is-core-module": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", + "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rollup": { + "version": "3.28.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.28.1.tgz", + "integrity": "sha512-R9OMQmIHJm9znrU3m3cpE8uhN0fGdXiawME7aZIpQqvpS/85+Vt1Hq1/yVIcYfOmaQiHjvXkQAoJukvLpau6Yw==", + "dev": true, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=14.18.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "dev": true + }, + "node_modules/siginfo": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", + "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", + "dev": true + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "node_modules/simple-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/simple-get": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", + "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "decompress-response": "^6.0.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } + }, + "node_modules/simple-update-notifier": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-1.1.0.tgz", + "integrity": "sha512-VpsrsJSUcJEseSbMHkrsrAVSdvVS5I96Qo1QAQ4FxQ9wXFcB+pjj7FB7/us9+GcgfW4ziHtYMc1J0PLczb55mg==", + "dev": true, + "dependencies": { + "semver": "~7.0.0" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/simple-update-notifier/node_modules/semver": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", + "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/slice-ansi": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", + "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.0.0", + "is-fullwidth-code-point": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/slice-ansi/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/slice-ansi/node_modules/is-fullwidth-code-point": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", + "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stackback": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", + "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", + "dev": true + }, + "node_modules/std-env": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.4.3.tgz", + "integrity": "sha512-f9aPhy8fYBuMN+sNfakZV18U39PbalgjXG3lLB9WkaYTxijru61wb57V9wxxNthXM5Sd88ETBWi29qLAsHO52Q==", + "dev": true + }, + "node_modules/stream-meter": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/stream-meter/-/stream-meter-1.0.4.tgz", + "integrity": "sha512-4sOEtrbgFotXwnEuzzsQBYEV1elAeFSO8rSGeTwabuX1RRn/kEq9JVH7I0MRBhKVRR0sJkr0M0QCH7yOLf9fhQ==", + "dev": true, + "dependencies": { + "readable-stream": "^2.1.4" + } + }, + "node_modules/stream-meter/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "node_modules/stream-meter/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/stream-meter/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==" + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-literal": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-1.3.0.tgz", + "integrity": "sha512-PugKzOsyXpArk0yWmUwqOZecSO0GH0bPoctLcqNDH9J04pVW3lflYE0ujElBGTloevcxF5MofAOZ7C5l2b+wLg==", + "dev": true, + "dependencies": { + "acorn": "^8.10.0" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tar": { + "version": "6.1.15", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.15.tgz", + "integrity": "sha512-/zKt9UyngnxIT/EAGYuxaMYgOIJiP81ab9ZfkILq4oNLPFX50qyYmu7jRj9qeXoxmJHjGlbH0+cm2uy1WCs10A==", + "dev": true, + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/tar-fs": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", + "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", + "dev": true, + "dependencies": { + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.1.4" + } + }, + "node_modules/tar-fs/node_modules/chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "dev": true + }, + "node_modules/tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "dev": true, + "dependencies": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tar-stream/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/tar-stream/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/tar-stream/node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/tinybench": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.5.0.tgz", + "integrity": "sha512-kRwSG8Zx4tjF9ZiyH4bhaebu+EDz1BOx9hOigYHlUW4xxI/wKIUQUqo018UlU4ar6ATPBsaMrdbKZ+tmPdohFA==", + "dev": true + }, + "node_modules/tinypool": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-0.4.0.tgz", + "integrity": "sha512-2ksntHOKf893wSAH4z/+JbPpi92esw8Gn9N2deXX+B0EO92hexAVI9GIZZPx7P5aYo5KULfeOSt3kMOmSOy6uA==", + "dev": true, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tinyspy": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-1.1.1.tgz", + "integrity": "sha512-UVq5AXt/gQlti7oxoIg5oi/9r0WpF7DGEVwXgqWSMmyN16+e3tl5lIvTaOpJ3TAtu5xFzWccFRM4R5NaWHF+4g==", + "dev": true, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/touch": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", + "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", + "dev": true, + "dependencies": { + "nopt": "~1.0.10" + }, + "bin": { + "nodetouch": "bin/nodetouch.js" + } + }, + "node_modules/touch/node_modules/nopt": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", + "integrity": "sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==", + "dev": true, + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "*" + } + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "dev": true + }, + "node_modules/ts-node": { + "version": "10.9.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", + "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", + "dev": true, + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "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 + } + } + }, + "node_modules/tsconfck": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/tsconfck/-/tsconfck-2.1.2.tgz", + "integrity": "sha512-ghqN1b0puy3MhhviwO2kGF8SeMDNhEbnKxjK7h6+fvY9JAxqvXi8y5NAHSQv687OVboS2uZIByzGd45/YxrRHg==", + "dev": true, + "bin": { + "tsconfck": "bin/tsconfck.js" + }, + "engines": { + "node": "^14.13.1 || ^16 || >=18" + }, + "peerDependencies": { + "typescript": "^4.3.5 || ^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/tsconfig-paths": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", + "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==", + "dev": true, + "dependencies": { + "json5": "^2.2.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "dev": true, + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/typescript": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.2.tgz", + "integrity": "sha512-wVORMBGO/FAs/++blGNeAVdbNKtIh1rbBL2EyQ1+J9lClJ93KiiKe8PmFIVdXhHcyv44SL9oglmfeSsndo0jRw==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=12.20" + } + }, + "node_modules/ufo": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.3.0.tgz", + "integrity": "sha512-bRn3CsoojyNStCZe0BG0Mt4Nr/4KF+rhFlnNXybgqt5pXHNFRlqinSoQaTrGyzE4X8aHplSb+TorH+COin9Yxw==", + "dev": true + }, + "node_modules/undefsafe": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", + "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", + "dev": true + }, + "node_modules/universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/url-parse": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true + }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true + }, + "node_modules/vite": { + "version": "4.4.9", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.4.9.tgz", + "integrity": "sha512-2mbUn2LlUmNASWwSCNSJ/EG2HuSRTnVNaydp6vMCm5VIqJsjMfbIWtbH2kDuwUVW5mMUKKZvGPX/rqeqVvv1XA==", + "dev": true, + "dependencies": { + "esbuild": "^0.18.10", + "postcss": "^8.4.27", + "rollup": "^3.27.1" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + }, + "peerDependencies": { + "@types/node": ">= 14", + "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 + } + } + }, + "node_modules/vite-node": { + "version": "0.29.8", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-0.29.8.tgz", + "integrity": "sha512-b6OtCXfk65L6SElVM20q5G546yu10/kNrhg08afEoWlFRJXFq9/6glsvSVY+aI6YeC1tu2TtAqI2jHEQmOmsFw==", + "dev": true, + "dependencies": { + "cac": "^6.7.14", + "debug": "^4.3.4", + "mlly": "^1.1.0", + "pathe": "^1.1.0", + "picocolors": "^1.0.0", + "vite": "^3.0.0 || ^4.0.0" + }, + "bin": { + "vite-node": "vite-node.mjs" + }, + "engines": { + "node": ">=v14.16.0" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/vite-tsconfig-paths": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/vite-tsconfig-paths/-/vite-tsconfig-paths-4.2.0.tgz", + "integrity": "sha512-jGpus0eUy5qbbMVGiTxCL1iB9ZGN6Bd37VGLJU39kTDD6ZfULTTb1bcc5IeTWqWJKiWV5YihCaibeASPiGi8kw==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "globrex": "^0.1.2", + "tsconfck": "^2.1.0" + }, + "peerDependencies": { + "vite": "*" + }, + "peerDependenciesMeta": { + "vite": { + "optional": true + } + } + }, + "node_modules/vite/node_modules/@esbuild/android-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", + "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/android-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz", + "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/android-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz", + "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/darwin-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz", + "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/darwin-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz", + "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/freebsd-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz", + "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/freebsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz", + "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz", + "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz", + "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz", + "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-loong64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", + "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-mips64el": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz", + "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-ppc64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz", + "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-riscv64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz", + "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-s390x": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz", + "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz", + "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/netbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz", + "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/openbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz", + "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/sunos-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz", + "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/win32-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", + "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/win32-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz", + "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/win32-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", + "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/esbuild": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", + "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.18.20", + "@esbuild/android-arm64": "0.18.20", + "@esbuild/android-x64": "0.18.20", + "@esbuild/darwin-arm64": "0.18.20", + "@esbuild/darwin-x64": "0.18.20", + "@esbuild/freebsd-arm64": "0.18.20", + "@esbuild/freebsd-x64": "0.18.20", + "@esbuild/linux-arm": "0.18.20", + "@esbuild/linux-arm64": "0.18.20", + "@esbuild/linux-ia32": "0.18.20", + "@esbuild/linux-loong64": "0.18.20", + "@esbuild/linux-mips64el": "0.18.20", + "@esbuild/linux-ppc64": "0.18.20", + "@esbuild/linux-riscv64": "0.18.20", + "@esbuild/linux-s390x": "0.18.20", + "@esbuild/linux-x64": "0.18.20", + "@esbuild/netbsd-x64": "0.18.20", + "@esbuild/openbsd-x64": "0.18.20", + "@esbuild/sunos-x64": "0.18.20", + "@esbuild/win32-arm64": "0.18.20", + "@esbuild/win32-ia32": "0.18.20", + "@esbuild/win32-x64": "0.18.20" + } + }, + "node_modules/vitest": { + "version": "0.29.8", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-0.29.8.tgz", + "integrity": "sha512-JIAVi2GK5cvA6awGpH0HvH/gEG9PZ0a/WoxdiV3PmqK+3CjQMf8c+J/Vhv4mdZ2nRyXFw66sAg6qz7VNkaHfDQ==", + "dev": true, + "dependencies": { + "@types/chai": "^4.3.4", + "@types/chai-subset": "^1.3.3", + "@types/node": "*", + "@vitest/expect": "0.29.8", + "@vitest/runner": "0.29.8", + "@vitest/spy": "0.29.8", + "@vitest/utils": "0.29.8", + "acorn": "^8.8.1", + "acorn-walk": "^8.2.0", + "cac": "^6.7.14", + "chai": "^4.3.7", + "debug": "^4.3.4", + "local-pkg": "^0.4.2", + "pathe": "^1.1.0", + "picocolors": "^1.0.0", + "source-map": "^0.6.1", + "std-env": "^3.3.1", + "strip-literal": "^1.0.0", + "tinybench": "^2.3.1", + "tinypool": "^0.4.0", + "tinyspy": "^1.0.2", + "vite": "^3.0.0 || ^4.0.0", + "vite-node": "0.29.8", + "why-is-node-running": "^2.2.2" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": ">=v14.16.0" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@vitest/browser": "*", + "@vitest/ui": "*", + "happy-dom": "*", + "jsdom": "*", + "playwright": "*", + "safaridriver": "*", + "webdriverio": "*" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@vitest/browser": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + }, + "playwright": { + "optional": true + }, + "safaridriver": { + "optional": true + }, + "webdriverio": { + "optional": true + } + } + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "dev": true + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dev": true, + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/why-is-node-running": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.2.2.tgz", + "integrity": "sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==", + "dev": true, + "dependencies": { + "siginfo": "^2.0.0", + "stackback": "0.0.2" + }, + "bin": { + "why-is-node-running": "cli.js" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wide-align": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", + "dev": true, + "dependencies": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "engines": { + "node": ">=10" + } + }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/yocto-queue": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", + "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", + "dev": true, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/services/stock/pnpm-lock.yaml b/services/stock/pnpm-lock.yaml deleted file mode 100644 index 18c44778..00000000 --- a/services/stock/pnpm-lock.yaml +++ /dev/null @@ -1,2504 +0,0 @@ -lockfileVersion: '6.0' - -settings: - autoInstallPeers: true - excludeLinksFromLockfile: false - -dependencies: - '@grpc/grpc-js': - specifier: 1.8.14 - version: 1.8.14 - '@grpc/proto-loader': - specifier: 0.7.6 - version: 0.7.6 - '@prisma/client': - specifier: 4.16.2 - version: 4.16.2(prisma@4.16.2) - amqplib: - specifier: ^0.10.3 - version: 0.10.3 - dotenv: - specifier: ^16.0.3 - version: 16.0.3 - grpc-server-reflection: - specifier: ^0.1.5 - version: 0.1.5 - protobufjs: - specifier: 7.2.2 - version: 7.2.2 - -devDependencies: - '@types/amqplib': - specifier: ^0.10.1 - version: 0.10.1 - '@types/node': - specifier: 18.15.9 - version: 18.15.9 - esbuild: - specifier: ^0.17.18 - version: 0.17.18 - grpc-tools: - specifier: ^1.12.4 - version: 1.12.4 - nodemon: - specifier: ^2.0.22 - version: 2.0.22 - pkg: - specifier: ^5.8.1 - version: 5.8.1 - prisma: - specifier: 4.16.2 - version: 4.16.2 - ts-node: - specifier: 10.9.1 - version: 10.9.1(@types/node@18.15.9)(typescript@5.0.2) - tsconfig-paths: - specifier: ^4.2.0 - version: 4.2.0 - typescript: - specifier: 5.0.2 - version: 5.0.2 - vite-tsconfig-paths: - specifier: ^4.2.0 - version: 4.2.0(typescript@5.0.2) - vitest: - specifier: ^0.29.8 - version: 0.29.8 - -packages: - - /@acuminous/bitsyntax@0.1.2: - resolution: {integrity: sha512-29lUK80d1muEQqiUsSo+3A0yP6CdspgC95EnKBMi22Xlwt79i/En4Vr67+cXhU+cZjbti3TgGGC5wy1stIywVQ==} - engines: {node: '>=0.8'} - dependencies: - buffer-more-ints: 1.0.0 - debug: 4.3.4 - safe-buffer: 5.1.2 - transitivePeerDependencies: - - supports-color - dev: false - - /@babel/generator@7.18.2: - resolution: {integrity: sha512-W1lG5vUwFvfMd8HVXqdfbuG7RuaSrTCCD8cl8fP8wOivdbtbIg2Db3IWUcgvfxKbbn6ZBGYRW/Zk1MIwK49mgw==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.19.0 - '@jridgewell/gen-mapping': 0.3.3 - jsesc: 2.5.2 - 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.5: - resolution: {integrity: sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==} - engines: {node: '>=6.9.0'} - dev: true - - /@babel/parser@7.18.4: - resolution: {integrity: sha512-FDge0dFazETFcxGw/EXzOkN8uJp0PC7Qbm+Pe9T+av2zlBpOgunFHkQPPn+eRuClU73JF+98D531UgayY89tow==} - engines: {node: '>=6.0.0'} - hasBin: true - dependencies: - '@babel/types': 7.19.0 - dev: true - - /@babel/types@7.19.0: - resolution: {integrity: sha512-YuGopBq3ke25BVSiS6fgF49Ul9gH1x70Bcr6bqRLjWCkcX8Hre1/5+z+IiWOIerRMSSEfGZVB9z9kyq7wVs9YA==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-string-parser': 7.22.5 - '@babel/helper-validator-identifier': 7.22.5 - to-fast-properties: 2.0.0 - 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 - - /@esbuild/android-arm64@0.17.18: - resolution: {integrity: sha512-/iq0aK0eeHgSC3z55ucMAHO05OIqmQehiGay8eP5l/5l+iEr4EIbh4/MI8xD9qRFjqzgkc0JkX0LculNC9mXBw==} - engines: {node: '>=12'} - cpu: [arm64] - os: [android] - requiresBuild: true - dev: true - optional: true - - /@esbuild/android-arm64@0.18.11: - resolution: {integrity: sha512-snieiq75Z1z5LJX9cduSAjUr7vEI1OdlzFPMw0HH5YI7qQHDd3qs+WZoMrWYDsfRJSq36lIA6mfZBkvL46KoIw==} - engines: {node: '>=12'} - cpu: [arm64] - os: [android] - requiresBuild: true - dev: true - optional: true - - /@esbuild/android-arm@0.17.18: - resolution: {integrity: sha512-EmwL+vUBZJ7mhFCs5lA4ZimpUH3WMAoqvOIYhVQwdIgSpHC8ImHdsRyhHAVxpDYUSm0lWvd63z0XH1IlImS2Qw==} - engines: {node: '>=12'} - cpu: [arm] - os: [android] - requiresBuild: true - dev: true - optional: true - - /@esbuild/android-arm@0.18.11: - resolution: {integrity: sha512-q4qlUf5ucwbUJZXF5tEQ8LF7y0Nk4P58hOsGk3ucY0oCwgQqAnqXVbUuahCddVHfrxmpyewRpiTHwVHIETYu7Q==} - engines: {node: '>=12'} - cpu: [arm] - os: [android] - requiresBuild: true - dev: true - optional: true - - /@esbuild/android-x64@0.17.18: - resolution: {integrity: sha512-x+0efYNBF3NPW2Xc5bFOSFW7tTXdAcpfEg2nXmxegm4mJuVeS+i109m/7HMiOQ6M12aVGGFlqJX3RhNdYM2lWg==} - engines: {node: '>=12'} - cpu: [x64] - os: [android] - requiresBuild: true - dev: true - optional: true - - /@esbuild/android-x64@0.18.11: - resolution: {integrity: sha512-iPuoxQEV34+hTF6FT7om+Qwziv1U519lEOvekXO9zaMMlT9+XneAhKL32DW3H7okrCOBQ44BMihE8dclbZtTuw==} - engines: {node: '>=12'} - cpu: [x64] - os: [android] - requiresBuild: true - dev: true - optional: true - - /@esbuild/darwin-arm64@0.17.18: - resolution: {integrity: sha512-6tY+djEAdF48M1ONWnQb1C+6LiXrKjmqjzPNPWXhu/GzOHTHX2nh8Mo2ZAmBFg0kIodHhciEgUBtcYCAIjGbjQ==} - engines: {node: '>=12'} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /@esbuild/darwin-arm64@0.18.11: - resolution: {integrity: sha512-Gm0QkI3k402OpfMKyQEEMG0RuW2LQsSmI6OeO4El2ojJMoF5NLYb3qMIjvbG/lbMeLOGiW6ooU8xqc+S0fgz2w==} - engines: {node: '>=12'} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /@esbuild/darwin-x64@0.17.18: - resolution: {integrity: sha512-Qq84ykvLvya3dO49wVC9FFCNUfSrQJLbxhoQk/TE1r6MjHo3sFF2tlJCwMjhkBVq3/ahUisj7+EpRSz0/+8+9A==} - engines: {node: '>=12'} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /@esbuild/darwin-x64@0.18.11: - resolution: {integrity: sha512-N15Vzy0YNHu6cfyDOjiyfJlRJCB/ngKOAvoBf1qybG3eOq0SL2Lutzz9N7DYUbb7Q23XtHPn6lMDF6uWbGv9Fw==} - engines: {node: '>=12'} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /@esbuild/freebsd-arm64@0.17.18: - resolution: {integrity: sha512-fw/ZfxfAzuHfaQeMDhbzxp9mc+mHn1Y94VDHFHjGvt2Uxl10mT4CDavHm+/L9KG441t1QdABqkVYwakMUeyLRA==} - engines: {node: '>=12'} - cpu: [arm64] - os: [freebsd] - requiresBuild: true - dev: true - optional: true - - /@esbuild/freebsd-arm64@0.18.11: - resolution: {integrity: sha512-atEyuq6a3omEY5qAh5jIORWk8MzFnCpSTUruBgeyN9jZq1K/QI9uke0ATi3MHu4L8c59CnIi4+1jDKMuqmR71A==} - engines: {node: '>=12'} - cpu: [arm64] - os: [freebsd] - requiresBuild: true - dev: true - optional: true - - /@esbuild/freebsd-x64@0.17.18: - resolution: {integrity: sha512-FQFbRtTaEi8ZBi/A6kxOC0V0E9B/97vPdYjY9NdawyLd4Qk5VD5g2pbWN2VR1c0xhzcJm74HWpObPszWC+qTew==} - engines: {node: '>=12'} - cpu: [x64] - os: [freebsd] - requiresBuild: true - dev: true - optional: true - - /@esbuild/freebsd-x64@0.18.11: - resolution: {integrity: sha512-XtuPrEfBj/YYYnAAB7KcorzzpGTvOr/dTtXPGesRfmflqhA4LMF0Gh/n5+a9JBzPuJ+CGk17CA++Hmr1F/gI0Q==} - engines: {node: '>=12'} - cpu: [x64] - os: [freebsd] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-arm64@0.17.18: - resolution: {integrity: sha512-R7pZvQZFOY2sxUG8P6A21eq6q+eBv7JPQYIybHVf1XkQYC+lT7nDBdC7wWKTrbvMXKRaGudp/dzZCwL/863mZQ==} - engines: {node: '>=12'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-arm64@0.18.11: - resolution: {integrity: sha512-c6Vh2WS9VFKxKZ2TvJdA7gdy0n6eSy+yunBvv4aqNCEhSWVor1TU43wNRp2YLO9Vng2G+W94aRz+ILDSwAiYog==} - engines: {node: '>=12'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-arm@0.17.18: - resolution: {integrity: sha512-jW+UCM40LzHcouIaqv3e/oRs0JM76JfhHjCavPxMUti7VAPh8CaGSlS7cmyrdpzSk7A+8f0hiedHqr/LMnfijg==} - engines: {node: '>=12'} - cpu: [arm] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-arm@0.18.11: - resolution: {integrity: sha512-Idipz+Taso/toi2ETugShXjQ3S59b6m62KmLHkJlSq/cBejixmIydqrtM2XTvNCywFl3VC7SreSf6NV0i6sRyg==} - engines: {node: '>=12'} - cpu: [arm] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-ia32@0.17.18: - resolution: {integrity: sha512-ygIMc3I7wxgXIxk6j3V00VlABIjq260i967Cp9BNAk5pOOpIXmd1RFQJQX9Io7KRsthDrQYrtcx7QCof4o3ZoQ==} - engines: {node: '>=12'} - cpu: [ia32] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-ia32@0.18.11: - resolution: {integrity: sha512-S3hkIF6KUqRh9n1Q0dSyYcWmcVa9Cg+mSoZEfFuzoYXXsk6196qndrM+ZiHNwpZKi3XOXpShZZ+9dfN5ykqjjw==} - engines: {node: '>=12'} - cpu: [ia32] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-loong64@0.17.18: - resolution: {integrity: sha512-bvPG+MyFs5ZlwYclCG1D744oHk1Pv7j8psF5TfYx7otCVmcJsEXgFEhQkbhNW8otDHL1a2KDINW20cfCgnzgMQ==} - engines: {node: '>=12'} - cpu: [loong64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-loong64@0.18.11: - resolution: {integrity: sha512-MRESANOoObQINBA+RMZW+Z0TJWpibtE7cPFnahzyQHDCA9X9LOmGh68MVimZlM9J8n5Ia8lU773te6O3ILW8kw==} - engines: {node: '>=12'} - cpu: [loong64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-mips64el@0.17.18: - resolution: {integrity: sha512-oVqckATOAGuiUOa6wr8TXaVPSa+6IwVJrGidmNZS1cZVx0HqkTMkqFGD2HIx9H1RvOwFeWYdaYbdY6B89KUMxA==} - engines: {node: '>=12'} - cpu: [mips64el] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-mips64el@0.18.11: - resolution: {integrity: sha512-qVyPIZrXNMOLYegtD1u8EBccCrBVshxMrn5MkuFc3mEVsw7CCQHaqZ4jm9hbn4gWY95XFnb7i4SsT3eflxZsUg==} - engines: {node: '>=12'} - cpu: [mips64el] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-ppc64@0.17.18: - resolution: {integrity: sha512-3dLlQO+b/LnQNxgH4l9rqa2/IwRJVN9u/bK63FhOPB4xqiRqlQAU0qDU3JJuf0BmaH0yytTBdoSBHrb2jqc5qQ==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-ppc64@0.18.11: - resolution: {integrity: sha512-T3yd8vJXfPirZaUOoA9D2ZjxZX4Gr3QuC3GztBJA6PklLotc/7sXTOuuRkhE9W/5JvJP/K9b99ayPNAD+R+4qQ==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-riscv64@0.17.18: - resolution: {integrity: sha512-/x7leOyDPjZV3TcsdfrSI107zItVnsX1q2nho7hbbQoKnmoeUWjs+08rKKt4AUXju7+3aRZSsKrJtaRmsdL1xA==} - engines: {node: '>=12'} - cpu: [riscv64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-riscv64@0.18.11: - resolution: {integrity: sha512-evUoRPWiwuFk++snjH9e2cAjF5VVSTj+Dnf+rkO/Q20tRqv+644279TZlPK8nUGunjPAtQRCj1jQkDAvL6rm2w==} - engines: {node: '>=12'} - cpu: [riscv64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-s390x@0.17.18: - resolution: {integrity: sha512-cX0I8Q9xQkL/6F5zWdYmVf5JSQt+ZfZD2bJudZrWD+4mnUvoZ3TDDXtDX2mUaq6upMFv9FlfIh4Gfun0tbGzuw==} - engines: {node: '>=12'} - cpu: [s390x] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-s390x@0.18.11: - resolution: {integrity: sha512-/SlRJ15XR6i93gRWquRxYCfhTeC5PdqEapKoLbX63PLCmAkXZHY2uQm2l9bN0oPHBsOw2IswRZctMYS0MijFcg==} - engines: {node: '>=12'} - cpu: [s390x] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-x64@0.17.18: - resolution: {integrity: sha512-66RmRsPlYy4jFl0vG80GcNRdirx4nVWAzJmXkevgphP1qf4dsLQCpSKGM3DUQCojwU1hnepI63gNZdrr02wHUA==} - engines: {node: '>=12'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-x64@0.18.11: - resolution: {integrity: sha512-xcncej+wF16WEmIwPtCHi0qmx1FweBqgsRtEL1mSHLFR6/mb3GEZfLQnx+pUDfRDEM4DQF8dpXIW7eDOZl1IbA==} - engines: {node: '>=12'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/netbsd-x64@0.17.18: - resolution: {integrity: sha512-95IRY7mI2yrkLlTLb1gpDxdC5WLC5mZDi+kA9dmM5XAGxCME0F8i4bYH4jZreaJ6lIZ0B8hTrweqG1fUyW7jbg==} - engines: {node: '>=12'} - cpu: [x64] - os: [netbsd] - requiresBuild: true - dev: true - optional: true - - /@esbuild/netbsd-x64@0.18.11: - resolution: {integrity: sha512-aSjMHj/F7BuS1CptSXNg6S3M4F3bLp5wfFPIJM+Km2NfIVfFKhdmfHF9frhiCLIGVzDziggqWll0B+9AUbud/Q==} - engines: {node: '>=12'} - cpu: [x64] - os: [netbsd] - requiresBuild: true - dev: true - optional: true - - /@esbuild/openbsd-x64@0.17.18: - resolution: {integrity: sha512-WevVOgcng+8hSZ4Q3BKL3n1xTv5H6Nb53cBrtzzEjDbbnOmucEVcZeGCsCOi9bAOcDYEeBZbD2SJNBxlfP3qiA==} - engines: {node: '>=12'} - cpu: [x64] - os: [openbsd] - requiresBuild: true - dev: true - optional: true - - /@esbuild/openbsd-x64@0.18.11: - resolution: {integrity: sha512-tNBq+6XIBZtht0xJGv7IBB5XaSyvYPCm1PxJ33zLQONdZoLVM0bgGqUrXnJyiEguD9LU4AHiu+GCXy/Hm9LsdQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [openbsd] - requiresBuild: true - dev: true - optional: true - - /@esbuild/sunos-x64@0.17.18: - resolution: {integrity: sha512-Rzf4QfQagnwhQXVBS3BYUlxmEbcV7MY+BH5vfDZekU5eYpcffHSyjU8T0xucKVuOcdCsMo+Ur5wmgQJH2GfNrg==} - engines: {node: '>=12'} - cpu: [x64] - os: [sunos] - requiresBuild: true - dev: true - optional: true - - /@esbuild/sunos-x64@0.18.11: - resolution: {integrity: sha512-kxfbDOrH4dHuAAOhr7D7EqaYf+W45LsAOOhAet99EyuxxQmjbk8M9N4ezHcEiCYPaiW8Dj3K26Z2V17Gt6p3ng==} - engines: {node: '>=12'} - cpu: [x64] - os: [sunos] - requiresBuild: true - dev: true - optional: true - - /@esbuild/win32-arm64@0.17.18: - resolution: {integrity: sha512-Kb3Ko/KKaWhjeAm2YoT/cNZaHaD1Yk/pa3FTsmqo9uFh1D1Rfco7BBLIPdDOozrObj2sahslFuAQGvWbgWldAg==} - engines: {node: '>=12'} - cpu: [arm64] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /@esbuild/win32-arm64@0.18.11: - resolution: {integrity: sha512-Sh0dDRyk1Xi348idbal7lZyfSkjhJsdFeuC13zqdipsvMetlGiFQNdO+Yfp6f6B4FbyQm7qsk16yaZk25LChzg==} - engines: {node: '>=12'} - cpu: [arm64] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /@esbuild/win32-ia32@0.17.18: - resolution: {integrity: sha512-0/xUMIdkVHwkvxfbd5+lfG7mHOf2FRrxNbPiKWg9C4fFrB8H0guClmaM3BFiRUYrznVoyxTIyC/Ou2B7QQSwmw==} - engines: {node: '>=12'} - cpu: [ia32] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /@esbuild/win32-ia32@0.18.11: - resolution: {integrity: sha512-o9JUIKF1j0rqJTFbIoF4bXj6rvrTZYOrfRcGyL0Vm5uJ/j5CkBD/51tpdxe9lXEDouhRgdr/BYzUrDOvrWwJpg==} - engines: {node: '>=12'} - cpu: [ia32] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /@esbuild/win32-x64@0.17.18: - resolution: {integrity: sha512-qU25Ma1I3NqTSHJUOKi9sAH1/Mzuvlke0ioMJRthLXKm7JiSKVwFghlGbDLOO2sARECGhja4xYfRAZNPAkooYg==} - engines: {node: '>=12'} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /@esbuild/win32-x64@0.18.11: - resolution: {integrity: sha512-rQI4cjLHd2hGsM1LqgDI7oOCYbQ6IBOVsX9ejuRMSze0GqXUG2ekwiKkiBU1pRGSeCqFFHxTrcEydB2Hyoz9CA==} - engines: {node: '>=12'} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /@grpc/grpc-js@1.8.14: - resolution: {integrity: sha512-w84maJ6CKl5aApCMzFll0hxtFNT6or9WwMslobKaqWUEf1K+zhlL43bSQhFreyYWIWR+Z0xnVFC1KtLm4ZpM/A==} - engines: {node: ^8.13.0 || >=10.10.0} - dependencies: - '@grpc/proto-loader': 0.7.6 - '@types/node': 18.15.9 - dev: false - - /@grpc/proto-loader@0.7.6: - resolution: {integrity: sha512-QyAXR8Hyh7uMDmveWxDSUcJr9NAWaZ2I6IXgAYvQmfflwouTM+rArE2eEaCtLlRqO81j7pRLCt81IefUei6Zbw==} - engines: {node: '>=6'} - hasBin: true - dependencies: - '@types/long': 4.0.2 - lodash.camelcase: 4.3.0 - long: 4.0.0 - protobufjs: 7.2.2 - yargs: 16.2.0 - dev: false - - /@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.18 - dev: true - - /@jridgewell/resolve-uri@3.1.0: - resolution: {integrity: sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==} - engines: {node: '>=6.0.0'} - 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.14: - resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==} - dev: true - - /@jridgewell/sourcemap-codec@1.4.15: - resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} - dev: true - - /@jridgewell/trace-mapping@0.3.18: - resolution: {integrity: sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==} - dependencies: - '@jridgewell/resolve-uri': 3.1.0 - '@jridgewell/sourcemap-codec': 1.4.14 - 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 - - /@mapbox/node-pre-gyp@1.0.10: - resolution: {integrity: sha512-4ySo4CjzStuprMwk35H5pPbkymjv1SF3jGLj6rAHp/xT/RF7TL7bd9CTm1xDY49K2qF7jmR/g7k+SkLETP6opA==} - hasBin: true - dependencies: - detect-libc: 2.0.1 - https-proxy-agent: 5.0.1 - make-dir: 3.1.0 - node-fetch: 2.6.12 - nopt: 5.0.0 - npmlog: 5.0.1 - rimraf: 3.0.2 - semver: 7.5.3 - tar: 6.1.15 - transitivePeerDependencies: - - encoding - - supports-color - dev: true - - /@nodelib/fs.scandir@2.1.5: - resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} - engines: {node: '>= 8'} - dependencies: - '@nodelib/fs.stat': 2.0.5 - run-parallel: 1.2.0 - dev: true - - /@nodelib/fs.stat@2.0.5: - resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} - engines: {node: '>= 8'} - dev: true - - /@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: true - - /@prisma/client@4.16.2(prisma@4.16.2): - resolution: {integrity: sha512-qCoEyxv1ZrQ4bKy39GnylE8Zq31IRmm8bNhNbZx7bF2cU5aiCCnSa93J2imF88MBjn7J9eUQneNxUQVJdl/rPQ==} - engines: {node: '>=14.17'} - requiresBuild: true - peerDependencies: - prisma: '*' - peerDependenciesMeta: - prisma: - optional: true - dependencies: - '@prisma/engines-version': 4.16.1-1.4bc8b6e1b66cb932731fb1bdbbc550d1e010de81 - prisma: 4.16.2 - dev: false - - /@prisma/engines-version@4.16.1-1.4bc8b6e1b66cb932731fb1bdbbc550d1e010de81: - resolution: {integrity: sha512-q617EUWfRIDTriWADZ4YiWRZXCa/WuhNgLTVd+HqWLffjMSPzyM5uOWoauX91wvQClSKZU4pzI4JJLQ9Kl62Qg==} - dev: false - - /@prisma/engines@4.16.2: - resolution: {integrity: sha512-vx1nxVvN4QeT/cepQce68deh/Turxy5Mr+4L4zClFuK1GlxN3+ivxfuv+ej/gvidWn1cE1uAhW7ALLNlYbRUAw==} - requiresBuild: true - - /@protobufjs/aspromise@1.1.2: - resolution: {integrity: sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==} - dev: false - - /@protobufjs/base64@1.1.2: - resolution: {integrity: sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==} - dev: false - - /@protobufjs/codegen@2.0.4: - resolution: {integrity: sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==} - dev: false - - /@protobufjs/eventemitter@1.1.0: - resolution: {integrity: sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==} - dev: false - - /@protobufjs/fetch@1.1.0: - resolution: {integrity: sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==} - dependencies: - '@protobufjs/aspromise': 1.1.2 - '@protobufjs/inquire': 1.1.0 - dev: false - - /@protobufjs/float@1.0.2: - resolution: {integrity: sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==} - dev: false - - /@protobufjs/inquire@1.1.0: - resolution: {integrity: sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==} - dev: false - - /@protobufjs/path@1.1.2: - resolution: {integrity: sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==} - dev: false - - /@protobufjs/pool@1.1.0: - resolution: {integrity: sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==} - dev: false - - /@protobufjs/utf8@1.1.0: - resolution: {integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==} - 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/amqplib@0.10.1: - resolution: {integrity: sha512-j6ANKT79ncUDnAs/+9r9eDujxbeJoTjoVu33gHHcaPfmLQaMhvfbH2GqSe8KUM444epAp1Vl3peVOQfZk3UIqA==} - dependencies: - '@types/node': 18.15.9 - dev: true - - /@types/chai-subset@1.3.3: - resolution: {integrity: sha512-frBecisrNGz+F4T6bcc+NLeolfiojh5FxW2klu669+8BARtyQv2C/GkNW6FUodVe4BroGMP/wER/YDGc7rEllw==} - dependencies: - '@types/chai': 4.3.5 - dev: true - - /@types/chai@4.3.5: - resolution: {integrity: sha512-mEo1sAde+UCE6b2hxn332f1g1E8WfYRu6p5SvTKr2ZKC1f7gFJXk4h5PyGP9Dt6gCaG8y8XhwnXWC6Iy2cmBng==} - dev: true - - /@types/long@4.0.2: - resolution: {integrity: sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==} - dev: false - - /@types/node@18.15.9: - resolution: {integrity: sha512-dUxhiNzBLr6IqlZXz6e/rN2YQXlFgOei/Dxy+e3cyXTJ4txSUbGT2/fmnD6zd/75jDMeW5bDee+YXxlFKHoV0A==} - - /@vitest/expect@0.29.8: - resolution: {integrity: sha512-xlcVXn5I5oTq6NiZSY3ykyWixBxr5mG8HYtjvpgg6KaqHm0mvhX18xuwl5YGxIRNt/A5jidd7CWcNHrSvgaQqQ==} - dependencies: - '@vitest/spy': 0.29.8 - '@vitest/utils': 0.29.8 - chai: 4.3.7 - dev: true - - /@vitest/runner@0.29.8: - resolution: {integrity: sha512-FzdhnRDwEr/A3Oo1jtIk/B952BBvP32n1ObMEb23oEJNO+qO5cBet6M2XWIDQmA7BDKGKvmhUf2naXyp/2JEwQ==} - dependencies: - '@vitest/utils': 0.29.8 - p-limit: 4.0.0 - pathe: 1.1.1 - dev: true - - /@vitest/spy@0.29.8: - resolution: {integrity: sha512-VdjBe9w34vOMl5I5mYEzNX8inTxrZ+tYUVk9jxaZJmHFwmDFC/GV3KBFTA/JKswr3XHvZL+FE/yq5EVhb6pSAw==} - dependencies: - tinyspy: 1.1.1 - dev: true - - /@vitest/utils@0.29.8: - resolution: {integrity: sha512-qGzuf3vrTbnoY+RjjVVIBYfuWMjn3UMUqyQtdGNZ6ZIIyte7B37exj6LaVkrZiUTvzSadVvO/tJm8AEgbGCBPg==} - dependencies: - cli-truncate: 3.1.0 - diff: 5.1.0 - loupe: 2.3.6 - pretty-format: 27.5.1 - dev: true - - /abbrev@1.1.1: - resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} - dev: true - - /acorn-walk@8.2.0: - resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} - engines: {node: '>=0.4.0'} - dev: true - - /acorn@8.10.0: - resolution: {integrity: sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==} - engines: {node: '>=0.4.0'} - hasBin: true - dev: true - - /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 - dev: true - - /amqplib@0.10.3: - resolution: {integrity: sha512-UHmuSa7n8vVW/a5HGh2nFPqAEr8+cD4dEZ6u9GjP91nHfr1a54RyAKyra7Sb5NH7NBKOUlyQSMXIp0qAixKexw==} - engines: {node: '>=10'} - dependencies: - '@acuminous/bitsyntax': 0.1.2 - buffer-more-ints: 1.0.0 - readable-stream: 1.1.14 - url-parse: 1.5.10 - transitivePeerDependencies: - - supports-color - dev: false - - /ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} - - /ansi-regex@6.0.1: - resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} - engines: {node: '>=12'} - dev: true - - /ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} - dependencies: - color-convert: 2.0.1 - - /ansi-styles@5.2.0: - resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} - engines: {node: '>=10'} - dev: true - - /ansi-styles@6.2.1: - resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} - engines: {node: '>=12'} - dev: true - - /anymatch@3.1.3: - resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} - engines: {node: '>= 8'} - dependencies: - normalize-path: 3.0.0 - picomatch: 2.3.1 - dev: true - - /aproba@2.0.0: - resolution: {integrity: sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==} - dev: true - - /are-we-there-yet@2.0.0: - resolution: {integrity: sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==} - engines: {node: '>=10'} - dependencies: - delegates: 1.0.0 - readable-stream: 3.6.2 - dev: true - - /arg@4.1.3: - resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} - dev: true - - /array-union@2.1.0: - resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} - engines: {node: '>=8'} - dev: true - - /assertion-error@1.1.0: - resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} - dev: true - - /at-least-node@1.0.0: - resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} - engines: {node: '>= 4.0.0'} - dev: true - - /balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - dev: true - - /base64-js@1.5.1: - resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - dev: true - - /binary-extensions@2.2.0: - resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} - engines: {node: '>=8'} - dev: true - - /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: true - - /brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} - dependencies: - balanced-match: 1.0.2 - concat-map: 0.0.1 - dev: true - - /braces@3.0.2: - resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} - engines: {node: '>=8'} - dependencies: - fill-range: 7.0.1 - dev: true - - /buffer-more-ints@1.0.0: - resolution: {integrity: sha512-EMetuGFz5SLsT0QTnXzINh4Ksr+oo4i+UGTXEshiGCQWnsgSs7ZhJ8fzlwQ+OzEMs0MpDAMr1hxnblp5a4vcHg==} - dev: false - - /buffer@5.7.1: - resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} - dependencies: - base64-js: 1.5.1 - ieee754: 1.2.1 - dev: true - - /cac@6.7.14: - resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} - engines: {node: '>=8'} - dev: true - - /chai@4.3.7: - resolution: {integrity: sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==} - engines: {node: '>=4'} - dependencies: - assertion-error: 1.1.0 - check-error: 1.0.2 - deep-eql: 4.1.3 - get-func-name: 2.0.0 - loupe: 2.3.6 - pathval: 1.1.1 - type-detect: 4.0.8 - dev: true - - /chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - dev: true - - /check-error@1.0.2: - resolution: {integrity: sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==} - dev: true - - /chokidar@3.5.3: - resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} - engines: {node: '>= 8.10.0'} - dependencies: - anymatch: 3.1.3 - braces: 3.0.2 - glob-parent: 5.1.2 - is-binary-path: 2.1.0 - is-glob: 4.0.3 - normalize-path: 3.0.0 - readdirp: 3.6.0 - optionalDependencies: - fsevents: 2.3.2 - dev: true - - /chownr@1.1.4: - resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} - dev: true - - /chownr@2.0.0: - resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} - engines: {node: '>=10'} - dev: true - - /cli-truncate@3.1.0: - resolution: {integrity: sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dependencies: - slice-ansi: 5.0.0 - string-width: 5.1.2 - dev: true - - /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 - - /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.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - - /color-support@1.1.3: - resolution: {integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==} - hasBin: true - dev: true - - /concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - dev: true - - /console-control-strings@1.1.0: - resolution: {integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==} - dev: true - - /core-util-is@1.0.3: - resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} - - /create-require@1.1.1: - resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} - dev: true - - /debug@3.2.7(supports-color@5.5.0): - resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - dependencies: - ms: 2.1.3 - supports-color: 5.5.0 - dev: true - - /debug@4.3.4: - resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - dependencies: - ms: 2.1.2 - - /decompress-response@6.0.0: - resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} - engines: {node: '>=10'} - dependencies: - mimic-response: 3.1.0 - dev: true - - /deep-eql@4.1.3: - resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==} - engines: {node: '>=6'} - dependencies: - type-detect: 4.0.8 - dev: true - - /deep-extend@0.6.0: - resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} - engines: {node: '>=4.0.0'} - dev: true - - /delegates@1.0.0: - resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==} - dev: true - - /detect-libc@2.0.1: - resolution: {integrity: sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==} - engines: {node: '>=8'} - dev: true - - /diff@4.0.2: - resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} - engines: {node: '>=0.3.1'} - dev: true - - /diff@5.1.0: - resolution: {integrity: sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==} - 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 - dev: true - - /dotenv@16.0.3: - resolution: {integrity: sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==} - engines: {node: '>=12'} - dev: false - - /eastasianwidth@0.2.0: - resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} - dev: true - - /emoji-regex@8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - - /emoji-regex@9.2.2: - resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} - dev: true - - /end-of-stream@1.4.4: - resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} - dependencies: - once: 1.4.0 - dev: true - - /esbuild@0.17.18: - resolution: {integrity: sha512-z1lix43jBs6UKjcZVKOw2xx69ffE2aG0PygLL5qJ9OS/gy0Ewd1gW/PUQIOIQGXBHWNywSc0floSKoMFF8aK2w==} - engines: {node: '>=12'} - hasBin: true - requiresBuild: true - optionalDependencies: - '@esbuild/android-arm': 0.17.18 - '@esbuild/android-arm64': 0.17.18 - '@esbuild/android-x64': 0.17.18 - '@esbuild/darwin-arm64': 0.17.18 - '@esbuild/darwin-x64': 0.17.18 - '@esbuild/freebsd-arm64': 0.17.18 - '@esbuild/freebsd-x64': 0.17.18 - '@esbuild/linux-arm': 0.17.18 - '@esbuild/linux-arm64': 0.17.18 - '@esbuild/linux-ia32': 0.17.18 - '@esbuild/linux-loong64': 0.17.18 - '@esbuild/linux-mips64el': 0.17.18 - '@esbuild/linux-ppc64': 0.17.18 - '@esbuild/linux-riscv64': 0.17.18 - '@esbuild/linux-s390x': 0.17.18 - '@esbuild/linux-x64': 0.17.18 - '@esbuild/netbsd-x64': 0.17.18 - '@esbuild/openbsd-x64': 0.17.18 - '@esbuild/sunos-x64': 0.17.18 - '@esbuild/win32-arm64': 0.17.18 - '@esbuild/win32-ia32': 0.17.18 - '@esbuild/win32-x64': 0.17.18 - dev: true - - /esbuild@0.18.11: - resolution: {integrity: sha512-i8u6mQF0JKJUlGR3OdFLKldJQMMs8OqM9Cc3UCi9XXziJ9WERM5bfkHaEAy0YAvPRMgqSW55W7xYn84XtEFTtA==} - engines: {node: '>=12'} - hasBin: true - requiresBuild: true - optionalDependencies: - '@esbuild/android-arm': 0.18.11 - '@esbuild/android-arm64': 0.18.11 - '@esbuild/android-x64': 0.18.11 - '@esbuild/darwin-arm64': 0.18.11 - '@esbuild/darwin-x64': 0.18.11 - '@esbuild/freebsd-arm64': 0.18.11 - '@esbuild/freebsd-x64': 0.18.11 - '@esbuild/linux-arm': 0.18.11 - '@esbuild/linux-arm64': 0.18.11 - '@esbuild/linux-ia32': 0.18.11 - '@esbuild/linux-loong64': 0.18.11 - '@esbuild/linux-mips64el': 0.18.11 - '@esbuild/linux-ppc64': 0.18.11 - '@esbuild/linux-riscv64': 0.18.11 - '@esbuild/linux-s390x': 0.18.11 - '@esbuild/linux-x64': 0.18.11 - '@esbuild/netbsd-x64': 0.18.11 - '@esbuild/openbsd-x64': 0.18.11 - '@esbuild/sunos-x64': 0.18.11 - '@esbuild/win32-arm64': 0.18.11 - '@esbuild/win32-ia32': 0.18.11 - '@esbuild/win32-x64': 0.18.11 - dev: true - - /escalade@3.1.1: - resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} - engines: {node: '>=6'} - - /expand-template@2.0.3: - resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} - engines: {node: '>=6'} - dev: true - - /fast-glob@3.3.0: - resolution: {integrity: sha512-ChDuvbOypPuNjO8yIDf36x7BlZX1smcUMTTcyoIjycexOxd6DFsKsg21qVBzEmr3G7fUKIRy2/psii+CIUt7FA==} - 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: true - - /fastq@1.15.0: - resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} - dependencies: - reusify: 1.0.4 - dev: true - - /fill-range@7.0.1: - resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} - engines: {node: '>=8'} - dependencies: - to-regex-range: 5.0.1 - dev: true - - /from2@2.3.0: - resolution: {integrity: sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==} - dependencies: - inherits: 2.0.4 - readable-stream: 2.3.8 - dev: true - - /fs-constants@1.0.0: - resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} - dev: true - - /fs-extra@9.1.0: - resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==} - engines: {node: '>=10'} - dependencies: - at-least-node: 1.0.0 - graceful-fs: 4.2.11 - jsonfile: 6.1.0 - universalify: 2.0.0 - dev: true - - /fs-minipass@2.1.0: - resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} - engines: {node: '>= 8'} - dependencies: - minipass: 3.3.6 - dev: true - - /fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - dev: true - - /fsevents@2.3.2: - resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /function-bind@1.1.1: - resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} - dev: true - - /gauge@3.0.2: - resolution: {integrity: sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==} - engines: {node: '>=10'} - dependencies: - aproba: 2.0.0 - color-support: 1.1.3 - console-control-strings: 1.1.0 - has-unicode: 2.0.1 - object-assign: 4.1.1 - signal-exit: 3.0.7 - string-width: 4.2.3 - strip-ansi: 6.0.1 - wide-align: 1.1.5 - dev: true - - /get-caller-file@2.0.5: - resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} - engines: {node: 6.* || 8.* || >= 10.*} - - /get-func-name@2.0.0: - resolution: {integrity: sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==} - dev: true - - /github-from-package@0.0.0: - resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==} - dev: true - - /glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} - dependencies: - is-glob: 4.0.3 - dev: true - - /glob@7.2.3: - resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - dev: true - - /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.0 - ignore: 5.2.4 - merge2: 1.4.1 - slash: 3.0.0 - dev: true - - /globrex@0.1.2: - resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} - dev: true - - /google-protobuf@3.21.2: - resolution: {integrity: sha512-3MSOYFO5U9mPGikIYCzK0SaThypfGgS6bHqrUGXG3DPHCrb+txNqeEcns1W0lkGfk0rCyNXm7xB9rMxnCiZOoA==} - dev: false - - /graceful-fs@4.2.11: - resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - dev: true - - /grpc-server-reflection@0.1.5: - resolution: {integrity: sha512-i69RYu6v65enzknNAPUgerFuVQfo+L3n9g4c1A/Sv5jUHMpxMIjSbBA+YWls9Sr4Flac4oohp4Gx8f389CaHuw==} - dependencies: - google-protobuf: 3.21.2 - dev: false - - /grpc-tools@1.12.4: - resolution: {integrity: sha512-5+mLAJJma3BjnW/KQp6JBjUMgvu7Mu3dBvBPd1dcbNIb+qiR0817zDpgPjS7gRb+l/8EVNIa3cB02xI9JLToKg==} - hasBin: true - requiresBuild: true - dependencies: - '@mapbox/node-pre-gyp': 1.0.10 - transitivePeerDependencies: - - encoding - - supports-color - dev: true - - /has-flag@3.0.0: - resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} - engines: {node: '>=4'} - dev: true - - /has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} - dev: true - - /has-unicode@2.0.1: - resolution: {integrity: sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==} - dev: true - - /has@1.0.3: - resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} - engines: {node: '>= 0.4.0'} - dependencies: - function-bind: 1.1.1 - dev: true - - /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 - dev: true - - /ieee754@1.2.1: - resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - dev: true - - /ignore-by-default@1.0.1: - resolution: {integrity: sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==} - dev: true - - /ignore@5.2.4: - resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} - engines: {node: '>= 4'} - dev: true - - /inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} - dependencies: - once: 1.4.0 - wrappy: 1.0.2 - dev: true - - /inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - - /ini@1.3.8: - resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} - dev: true - - /into-stream@6.0.0: - resolution: {integrity: sha512-XHbaOAvP+uFKUFsOgoNPRjLkwB+I22JFPFe5OjTkQ0nwgj6+pSjb4NmB6VMxaPshLiOf+zcpOCBQuLwC1KHhZA==} - engines: {node: '>=10'} - dependencies: - from2: 2.3.0 - p-is-promise: 3.0.0 - dev: true - - /is-binary-path@2.1.0: - resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} - engines: {node: '>=8'} - dependencies: - binary-extensions: 2.2.0 - dev: true - - /is-core-module@2.12.1: - resolution: {integrity: sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==} - dependencies: - has: 1.0.3 - dev: true - - /is-core-module@2.9.0: - resolution: {integrity: sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==} - dependencies: - has: 1.0.3 - dev: true - - /is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} - dev: true - - /is-fullwidth-code-point@3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} - engines: {node: '>=8'} - - /is-fullwidth-code-point@4.0.0: - resolution: {integrity: sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==} - engines: {node: '>=12'} - dev: true - - /is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} - dependencies: - is-extglob: 2.1.1 - dev: true - - /is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} - dev: true - - /isarray@0.0.1: - resolution: {integrity: sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==} - dev: false - - /isarray@1.0.0: - resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} - dev: true - - /jsesc@2.5.2: - resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} - engines: {node: '>=4'} - hasBin: true - dev: true - - /json5@2.2.3: - resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} - engines: {node: '>=6'} - hasBin: true - dev: true - - /jsonc-parser@3.2.0: - resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} - dev: true - - /jsonfile@6.1.0: - resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} - dependencies: - universalify: 2.0.0 - optionalDependencies: - graceful-fs: 4.2.11 - dev: true - - /local-pkg@0.4.3: - resolution: {integrity: sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==} - engines: {node: '>=14'} - dev: true - - /lodash.camelcase@4.3.0: - resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} - dev: false - - /long@4.0.0: - resolution: {integrity: sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==} - dev: false - - /long@5.2.3: - resolution: {integrity: sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==} - dev: false - - /loupe@2.3.6: - resolution: {integrity: sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==} - dependencies: - get-func-name: 2.0.0 - dev: true - - /lru-cache@6.0.0: - resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} - engines: {node: '>=10'} - dependencies: - yallist: 4.0.0 - dev: true - - /make-dir@3.1.0: - resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} - engines: {node: '>=8'} - dependencies: - semver: 6.3.0 - dev: true - - /make-error@1.3.6: - resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} - dev: true - - /merge2@1.4.1: - resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} - engines: {node: '>= 8'} - dev: true - - /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: true - - /mimic-response@3.1.0: - resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} - engines: {node: '>=10'} - dev: true - - /minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} - dependencies: - brace-expansion: 1.1.11 - dev: true - - /minimist@1.2.8: - resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - dev: true - - /minipass@3.3.6: - resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} - engines: {node: '>=8'} - dependencies: - yallist: 4.0.0 - dev: true - - /minipass@5.0.0: - resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} - engines: {node: '>=8'} - dev: true - - /minizlib@2.1.2: - resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} - engines: {node: '>= 8'} - dependencies: - minipass: 3.3.6 - yallist: 4.0.0 - dev: true - - /mkdirp-classic@0.5.3: - resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} - dev: true - - /mkdirp@1.0.4: - resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} - engines: {node: '>=10'} - hasBin: true - dev: true - - /mlly@1.4.0: - resolution: {integrity: sha512-ua8PAThnTwpprIaU47EPeZ/bPUVp2QYBbWMphUQpVdBI3Lgqzm5KZQ45Agm3YJedHXaIHl6pBGabaLSUPPSptg==} - dependencies: - acorn: 8.10.0 - pathe: 1.1.1 - pkg-types: 1.0.3 - ufo: 1.1.2 - dev: true - - /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: true - - /multistream@4.1.0: - resolution: {integrity: sha512-J1XDiAmmNpRCBfIWJv+n0ymC4ABcf/Pl+5YvC5B/D2f/2+8PtHvCNxMPKiQcZyi922Hq69J2YOpb1pTywfifyw==} - dependencies: - once: 1.4.0 - readable-stream: 3.6.2 - dev: true - - /nanoid@3.3.6: - resolution: {integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true - dev: true - - /napi-build-utils@1.0.2: - resolution: {integrity: sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==} - dev: true - - /node-abi@3.45.0: - resolution: {integrity: sha512-iwXuFrMAcFVi/ZoZiqq8BzAdsLw9kxDfTC0HMyjXfSL/6CSDAGD5UmR7azrAgWV1zKYq7dUUMj4owusBWKLsiQ==} - engines: {node: '>=10'} - dependencies: - semver: 7.5.3 - dev: true - - /node-fetch@2.6.12: - resolution: {integrity: sha512-C/fGU2E8ToujUivIO0H+tpQ6HWo4eEmchoPIoXtxCrVghxdKq+QOHqEZW7tuP3KlV3bC8FRMO5nMCC7Zm1VP6g==} - engines: {node: 4.x || >=6.0.0} - peerDependencies: - encoding: ^0.1.0 - peerDependenciesMeta: - encoding: - optional: true - dependencies: - whatwg-url: 5.0.0 - dev: true - - /nodemon@2.0.22: - resolution: {integrity: sha512-B8YqaKMmyuCO7BowF1Z1/mkPqLk6cs/l63Ojtd6otKjMx47Dq1utxfRxcavH1I7VSaL8n5BUaoutadnsX3AAVQ==} - engines: {node: '>=8.10.0'} - hasBin: true - dependencies: - chokidar: 3.5.3 - debug: 3.2.7(supports-color@5.5.0) - ignore-by-default: 1.0.1 - minimatch: 3.1.2 - pstree.remy: 1.1.8 - semver: 5.7.1 - simple-update-notifier: 1.1.0 - supports-color: 5.5.0 - touch: 3.1.0 - undefsafe: 2.0.5 - dev: true - - /nopt@1.0.10: - resolution: {integrity: sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==} - hasBin: true - dependencies: - abbrev: 1.1.1 - dev: true - - /nopt@5.0.0: - resolution: {integrity: sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==} - engines: {node: '>=6'} - hasBin: true - dependencies: - abbrev: 1.1.1 - dev: true - - /normalize-path@3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} - engines: {node: '>=0.10.0'} - dev: true - - /npmlog@5.0.1: - resolution: {integrity: sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==} - dependencies: - are-we-there-yet: 2.0.0 - console-control-strings: 1.1.0 - gauge: 3.0.2 - set-blocking: 2.0.0 - dev: true - - /object-assign@4.1.1: - resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} - engines: {node: '>=0.10.0'} - dev: true - - /once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - dependencies: - wrappy: 1.0.2 - dev: true - - /p-is-promise@3.0.0: - resolution: {integrity: sha512-Wo8VsW4IRQSKVXsJCn7TomUaVtyfjVDn3nUP7kE967BQk0CwFpdbZs0X0uk5sW9mkBa9eNM7hCMaG93WUAwxYQ==} - engines: {node: '>=8'} - dev: true - - /p-limit@4.0.0: - resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dependencies: - yocto-queue: 1.0.0 - dev: true - - /path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} - dev: true - - /path-parse@1.0.7: - resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} - dev: true - - /path-type@4.0.0: - resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} - engines: {node: '>=8'} - dev: true - - /pathe@1.1.1: - resolution: {integrity: sha512-d+RQGp0MAYTIaDBIMmOfMwz3E+LOZnxx1HZd5R18mmCZY0QBlK0LDZfPc8FW8Ed2DlvsuE6PRjroDY+wg4+j/Q==} - dev: true - - /pathval@1.1.1: - resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} - dev: true - - /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'} - dev: true - - /pkg-fetch@3.4.2: - resolution: {integrity: sha512-0+uijmzYcnhC0hStDjm/cl2VYdrmVVBpe7Q8k9YBojxmR5tG8mvR9/nooQq3QSXiQqORDVOTY3XqMEqJVIzkHA==} - hasBin: true - dependencies: - chalk: 4.1.2 - fs-extra: 9.1.0 - https-proxy-agent: 5.0.1 - node-fetch: 2.6.12 - progress: 2.0.3 - semver: 7.5.3 - tar-fs: 2.1.1 - yargs: 16.2.0 - transitivePeerDependencies: - - encoding - - supports-color - dev: true - - /pkg-types@1.0.3: - resolution: {integrity: sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==} - dependencies: - jsonc-parser: 3.2.0 - mlly: 1.4.0 - pathe: 1.1.1 - dev: true - - /pkg@5.8.1: - resolution: {integrity: sha512-CjBWtFStCfIiT4Bde9QpJy0KeH19jCfwZRJqHFDFXfhUklCx8JoFmMj3wgnEYIwGmZVNkhsStPHEOnrtrQhEXA==} - hasBin: true - peerDependencies: - node-notifier: '>=9.0.1' - peerDependenciesMeta: - node-notifier: - optional: true - dependencies: - '@babel/generator': 7.18.2 - '@babel/parser': 7.18.4 - '@babel/types': 7.19.0 - chalk: 4.1.2 - fs-extra: 9.1.0 - globby: 11.1.0 - into-stream: 6.0.0 - is-core-module: 2.9.0 - minimist: 1.2.8 - multistream: 4.1.0 - pkg-fetch: 3.4.2 - prebuild-install: 7.1.1 - resolve: 1.22.2 - stream-meter: 1.0.4 - transitivePeerDependencies: - - encoding - - supports-color - dev: true - - /postcss@8.4.25: - resolution: {integrity: sha512-7taJ/8t2av0Z+sQEvNzCkpDynl0tX3uJMCODi6nT3PfASC7dYCWV9aQ+uiCf+KBD4SEFcu+GvJdGdwzQ6OSjCw==} - engines: {node: ^10 || ^12 || >=14} - dependencies: - nanoid: 3.3.6 - picocolors: 1.0.0 - source-map-js: 1.0.2 - dev: true - - /prebuild-install@7.1.1: - resolution: {integrity: sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==} - engines: {node: '>=10'} - hasBin: true - dependencies: - detect-libc: 2.0.1 - expand-template: 2.0.3 - github-from-package: 0.0.0 - minimist: 1.2.8 - mkdirp-classic: 0.5.3 - napi-build-utils: 1.0.2 - node-abi: 3.45.0 - pump: 3.0.0 - rc: 1.2.8 - simple-get: 4.0.1 - tar-fs: 2.1.1 - tunnel-agent: 0.6.0 - dev: true - - /pretty-format@27.5.1: - resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - dependencies: - ansi-regex: 5.0.1 - ansi-styles: 5.2.0 - react-is: 17.0.2 - dev: true - - /prisma@4.16.2: - resolution: {integrity: sha512-SYCsBvDf0/7XSJyf2cHTLjLeTLVXYfqp7pG5eEVafFLeT0u/hLFz/9W196nDRGUOo1JfPatAEb+uEnTQImQC1g==} - engines: {node: '>=14.17'} - hasBin: true - requiresBuild: true - dependencies: - '@prisma/engines': 4.16.2 - - /process-nextick-args@2.0.1: - resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} - dev: true - - /progress@2.0.3: - resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} - engines: {node: '>=0.4.0'} - dev: true - - /protobufjs@7.2.2: - resolution: {integrity: sha512-++PrQIjrom+bFDPpfmqXfAGSQs40116JRrqqyf53dymUMvvb5d/LMRyicRoF1AUKoXVS1/IgJXlEgcpr4gTF3Q==} - engines: {node: '>=12.0.0'} - requiresBuild: true - dependencies: - '@protobufjs/aspromise': 1.1.2 - '@protobufjs/base64': 1.1.2 - '@protobufjs/codegen': 2.0.4 - '@protobufjs/eventemitter': 1.1.0 - '@protobufjs/fetch': 1.1.0 - '@protobufjs/float': 1.0.2 - '@protobufjs/inquire': 1.1.0 - '@protobufjs/path': 1.1.2 - '@protobufjs/pool': 1.1.0 - '@protobufjs/utf8': 1.1.0 - '@types/node': 18.15.9 - long: 5.2.3 - dev: false - - /pstree.remy@1.1.8: - resolution: {integrity: sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==} - dev: true - - /pump@3.0.0: - resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} - dependencies: - end-of-stream: 1.4.4 - once: 1.4.0 - dev: true - - /querystringify@2.2.0: - resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} - dev: false - - /queue-microtask@1.2.3: - resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - dev: true - - /rc@1.2.8: - resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} - hasBin: true - dependencies: - deep-extend: 0.6.0 - ini: 1.3.8 - minimist: 1.2.8 - strip-json-comments: 2.0.1 - dev: true - - /react-is@17.0.2: - resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} - dev: true - - /readable-stream@1.1.14: - resolution: {integrity: sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==} - dependencies: - core-util-is: 1.0.3 - inherits: 2.0.4 - isarray: 0.0.1 - string_decoder: 0.10.31 - dev: false - - /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: true - - /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: true - - /readdirp@3.6.0: - resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} - engines: {node: '>=8.10.0'} - dependencies: - picomatch: 2.3.1 - dev: true - - /require-directory@2.1.1: - resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} - engines: {node: '>=0.10.0'} - - /requires-port@1.0.0: - resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} - dev: false - - /resolve@1.22.2: - resolution: {integrity: sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==} - hasBin: true - dependencies: - is-core-module: 2.12.1 - path-parse: 1.0.7 - supports-preserve-symlinks-flag: 1.0.0 - dev: true - - /reusify@1.0.4: - resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} - engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - dev: true - - /rimraf@3.0.2: - resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} - hasBin: true - dependencies: - glob: 7.2.3 - dev: true - - /rollup@3.26.2: - resolution: {integrity: sha512-6umBIGVz93er97pMgQO08LuH3m6PUb3jlDUUGFsNJB6VgTCUaDFpupf5JfU30529m/UKOgmiX+uY6Sx8cOYpLA==} - engines: {node: '>=14.18.0', npm: '>=8.0.0'} - hasBin: true - optionalDependencies: - fsevents: 2.3.2 - dev: true - - /run-parallel@1.2.0: - resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} - dependencies: - queue-microtask: 1.2.3 - dev: true - - /safe-buffer@5.1.2: - resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} - - /safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - dev: true - - /semver@5.7.1: - resolution: {integrity: sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==} - hasBin: true - dev: true - - /semver@6.3.0: - resolution: {integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==} - hasBin: true - dev: true - - /semver@7.0.0: - resolution: {integrity: sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==} - hasBin: true - dev: true - - /semver@7.5.3: - resolution: {integrity: sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==} - engines: {node: '>=10'} - hasBin: true - dependencies: - lru-cache: 6.0.0 - dev: true - - /set-blocking@2.0.0: - resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} - 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==} - dev: true - - /simple-concat@1.0.1: - resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} - dev: true - - /simple-get@4.0.1: - resolution: {integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==} - dependencies: - decompress-response: 6.0.0 - once: 1.4.0 - simple-concat: 1.0.1 - dev: true - - /simple-update-notifier@1.1.0: - resolution: {integrity: sha512-VpsrsJSUcJEseSbMHkrsrAVSdvVS5I96Qo1QAQ4FxQ9wXFcB+pjj7FB7/us9+GcgfW4ziHtYMc1J0PLczb55mg==} - engines: {node: '>=8.10.0'} - dependencies: - semver: 7.0.0 - dev: true - - /slash@3.0.0: - resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} - engines: {node: '>=8'} - dev: true - - /slice-ansi@5.0.0: - resolution: {integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==} - engines: {node: '>=12'} - dependencies: - ansi-styles: 6.2.1 - is-fullwidth-code-point: 4.0.0 - dev: true - - /source-map-js@1.0.2: - resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} - engines: {node: '>=0.10.0'} - dev: true - - /source-map@0.6.1: - resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} - engines: {node: '>=0.10.0'} - dev: true - - /stackback@0.0.2: - resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} - dev: true - - /std-env@3.3.3: - resolution: {integrity: sha512-Rz6yejtVyWnVjC1RFvNmYL10kgjC49EOghxWn0RFqlCHGFpQx+Xe7yW3I4ceK1SGrWIGMjD5Kbue8W/udkbMJg==} - dev: true - - /stream-meter@1.0.4: - resolution: {integrity: sha512-4sOEtrbgFotXwnEuzzsQBYEV1elAeFSO8rSGeTwabuX1RRn/kEq9JVH7I0MRBhKVRR0sJkr0M0QCH7yOLf9fhQ==} - dependencies: - readable-stream: 2.3.8 - 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 - dev: true - - /string_decoder@0.10.31: - resolution: {integrity: sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==} - dev: false - - /string_decoder@1.1.1: - resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} - dependencies: - safe-buffer: 5.1.2 - dev: true - - /string_decoder@1.3.0: - resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} - dependencies: - safe-buffer: 5.2.1 - dev: true - - /strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} - dependencies: - ansi-regex: 5.0.1 - - /strip-ansi@7.1.0: - resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} - engines: {node: '>=12'} - dependencies: - ansi-regex: 6.0.1 - dev: true - - /strip-bom@3.0.0: - resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} - engines: {node: '>=4'} - dev: true - - /strip-json-comments@2.0.1: - resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} - engines: {node: '>=0.10.0'} - dev: true - - /strip-literal@1.0.1: - resolution: {integrity: sha512-QZTsipNpa2Ppr6v1AmJHESqJ3Uz247MUS0OjrnnZjFAvEoWqxuyFuXn2xLgMtRnijJShAa1HL0gtJyUs7u7n3Q==} - dependencies: - acorn: 8.10.0 - dev: true - - /supports-color@5.5.0: - resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} - engines: {node: '>=4'} - dependencies: - has-flag: 3.0.0 - dev: true - - /supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} - dependencies: - has-flag: 4.0.0 - dev: true - - /supports-preserve-symlinks-flag@1.0.0: - resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} - engines: {node: '>= 0.4'} - dev: true - - /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: true - - /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: true - - /tar@6.1.15: - resolution: {integrity: sha512-/zKt9UyngnxIT/EAGYuxaMYgOIJiP81ab9ZfkILq4oNLPFX50qyYmu7jRj9qeXoxmJHjGlbH0+cm2uy1WCs10A==} - engines: {node: '>=10'} - dependencies: - chownr: 2.0.0 - fs-minipass: 2.1.0 - minipass: 5.0.0 - minizlib: 2.1.2 - mkdirp: 1.0.4 - yallist: 4.0.0 - dev: true - - /tinybench@2.5.0: - resolution: {integrity: sha512-kRwSG8Zx4tjF9ZiyH4bhaebu+EDz1BOx9hOigYHlUW4xxI/wKIUQUqo018UlU4ar6ATPBsaMrdbKZ+tmPdohFA==} - dev: true - - /tinypool@0.4.0: - resolution: {integrity: sha512-2ksntHOKf893wSAH4z/+JbPpi92esw8Gn9N2deXX+B0EO92hexAVI9GIZZPx7P5aYo5KULfeOSt3kMOmSOy6uA==} - engines: {node: '>=14.0.0'} - dev: true - - /tinyspy@1.1.1: - resolution: {integrity: sha512-UVq5AXt/gQlti7oxoIg5oi/9r0WpF7DGEVwXgqWSMmyN16+e3tl5lIvTaOpJ3TAtu5xFzWccFRM4R5NaWHF+4g==} - engines: {node: '>=14.0.0'} - 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 - dev: true - - /touch@3.1.0: - resolution: {integrity: sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==} - hasBin: true - dependencies: - nopt: 1.0.10 - dev: true - - /tr46@0.0.3: - resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} - dev: true - - /ts-node@10.9.1(@types/node@18.15.9)(typescript@5.0.2): - 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.15.9 - 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.0.2 - v8-compile-cache-lib: 3.0.1 - yn: 3.1.1 - dev: true - - /tsconfck@2.1.1(typescript@5.0.2): - resolution: {integrity: sha512-ZPCkJBKASZBmBUNqGHmRhdhM8pJYDdOXp4nRgj/O0JwUwsMq50lCDRQP/M5GBNAA0elPrq4gAeu4dkaVCuKWww==} - engines: {node: ^14.13.1 || ^16 || >=18} - hasBin: true - peerDependencies: - typescript: ^4.3.5 || ^5.0.0 - peerDependenciesMeta: - typescript: - optional: true - dependencies: - typescript: 5.0.2 - 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 - - /tunnel-agent@0.6.0: - resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} - dependencies: - safe-buffer: 5.2.1 - dev: true - - /type-detect@4.0.8: - resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} - engines: {node: '>=4'} - dev: true - - /typescript@5.0.2: - resolution: {integrity: sha512-wVORMBGO/FAs/++blGNeAVdbNKtIh1rbBL2EyQ1+J9lClJ93KiiKe8PmFIVdXhHcyv44SL9oglmfeSsndo0jRw==} - engines: {node: '>=12.20'} - hasBin: true - dev: true - - /ufo@1.1.2: - resolution: {integrity: sha512-TrY6DsjTQQgyS3E3dBaOXf0TpPD8u9FVrVYmKVegJuFw51n/YB9XPt+U6ydzFG5ZIN7+DIjPbNmXoBj9esYhgQ==} - dev: true - - /undefsafe@2.0.5: - resolution: {integrity: sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==} - dev: true - - /universalify@2.0.0: - resolution: {integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==} - engines: {node: '>= 10.0.0'} - dev: true - - /url-parse@1.5.10: - resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} - dependencies: - querystringify: 2.2.0 - requires-port: 1.0.0 - dev: false - - /util-deprecate@1.0.2: - resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - dev: true - - /v8-compile-cache-lib@3.0.1: - resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} - dev: true - - /vite-node@0.29.8(@types/node@18.15.9): - resolution: {integrity: sha512-b6OtCXfk65L6SElVM20q5G546yu10/kNrhg08afEoWlFRJXFq9/6glsvSVY+aI6YeC1tu2TtAqI2jHEQmOmsFw==} - engines: {node: '>=v14.16.0'} - hasBin: true - dependencies: - cac: 6.7.14 - debug: 4.3.4 - mlly: 1.4.0 - pathe: 1.1.1 - picocolors: 1.0.0 - vite: 4.4.0(@types/node@18.15.9) - transitivePeerDependencies: - - '@types/node' - - less - - lightningcss - - sass - - stylus - - sugarss - - supports-color - - terser - dev: true - - /vite-tsconfig-paths@4.2.0(typescript@5.0.2): - resolution: {integrity: sha512-jGpus0eUy5qbbMVGiTxCL1iB9ZGN6Bd37VGLJU39kTDD6ZfULTTb1bcc5IeTWqWJKiWV5YihCaibeASPiGi8kw==} - peerDependencies: - vite: '*' - peerDependenciesMeta: - vite: - optional: true - dependencies: - debug: 4.3.4 - globrex: 0.1.2 - tsconfck: 2.1.1(typescript@5.0.2) - transitivePeerDependencies: - - supports-color - - typescript - dev: true - - /vite@4.4.0(@types/node@18.15.9): - resolution: {integrity: sha512-Wf+DCEjuM8aGavEYiF77hnbxEZ+0+/jC9nABR46sh5Xi+GYeSvkeEFRiVuI3x+tPjxgZeS91h1jTAQTPFgePpA==} - engines: {node: ^14.18.0 || >=16.0.0} - hasBin: true - peerDependencies: - '@types/node': '>= 14' - less: '*' - lightningcss: ^1.21.0 - sass: '*' - stylus: '*' - sugarss: '*' - terser: ^5.4.0 - peerDependenciesMeta: - '@types/node': - optional: true - less: - optional: true - lightningcss: - optional: true - sass: - optional: true - stylus: - optional: true - sugarss: - optional: true - terser: - optional: true - dependencies: - '@types/node': 18.15.9 - esbuild: 0.18.11 - postcss: 8.4.25 - rollup: 3.26.2 - optionalDependencies: - fsevents: 2.3.2 - dev: true - - /vitest@0.29.8: - resolution: {integrity: sha512-JIAVi2GK5cvA6awGpH0HvH/gEG9PZ0a/WoxdiV3PmqK+3CjQMf8c+J/Vhv4mdZ2nRyXFw66sAg6qz7VNkaHfDQ==} - engines: {node: '>=v14.16.0'} - hasBin: true - peerDependencies: - '@edge-runtime/vm': '*' - '@vitest/browser': '*' - '@vitest/ui': '*' - happy-dom: '*' - jsdom: '*' - playwright: '*' - safaridriver: '*' - webdriverio: '*' - peerDependenciesMeta: - '@edge-runtime/vm': - optional: true - '@vitest/browser': - optional: true - '@vitest/ui': - optional: true - happy-dom: - optional: true - jsdom: - optional: true - playwright: - optional: true - safaridriver: - optional: true - webdriverio: - optional: true - dependencies: - '@types/chai': 4.3.5 - '@types/chai-subset': 1.3.3 - '@types/node': 18.15.9 - '@vitest/expect': 0.29.8 - '@vitest/runner': 0.29.8 - '@vitest/spy': 0.29.8 - '@vitest/utils': 0.29.8 - acorn: 8.10.0 - acorn-walk: 8.2.0 - cac: 6.7.14 - chai: 4.3.7 - debug: 4.3.4 - local-pkg: 0.4.3 - pathe: 1.1.1 - picocolors: 1.0.0 - source-map: 0.6.1 - std-env: 3.3.3 - strip-literal: 1.0.1 - tinybench: 2.5.0 - tinypool: 0.4.0 - tinyspy: 1.1.1 - vite: 4.4.0(@types/node@18.15.9) - vite-node: 0.29.8(@types/node@18.15.9) - why-is-node-running: 2.2.2 - transitivePeerDependencies: - - less - - lightningcss - - sass - - stylus - - sugarss - - supports-color - - terser - dev: true - - /webidl-conversions@3.0.1: - resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} - dev: true - - /whatwg-url@5.0.0: - resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} - dependencies: - tr46: 0.0.3 - webidl-conversions: 3.0.1 - 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 - - /wide-align@1.1.5: - resolution: {integrity: sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==} - dependencies: - string-width: 4.2.3 - 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 - - /wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - dev: true - - /y18n@5.0.8: - resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} - engines: {node: '>=10'} - - /yallist@4.0.0: - resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} - dev: true - - /yargs-parser@20.2.9: - resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} - engines: {node: '>=10'} - - /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 - - /yn@3.1.1: - resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} - engines: {node: '>=6'} - dev: true - - /yocto-queue@1.0.0: - resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} - engines: {node: '>=12.20'} - dev: true From 82a1c193981fb40bf35d4f1650093d126f571528 Mon Sep 17 00:00:00 2001 From: Florian LEROUX Date: Sat, 26 Aug 2023 11:52:02 +0200 Subject: [PATCH 482/883] feat(stock): add auth checkguards in routes --- .../promotion/promotion.controller.ts | 2 +- .../src/controller/stock/stock.controller.ts | 824 +++++++++++------- .../stock/stockPerson.controller.ts | 35 +- 3 files changed, 515 insertions(+), 346 deletions(-) diff --git a/services/gateway/src/controller/promotion/promotion.controller.ts b/services/gateway/src/controller/promotion/promotion.controller.ts index 4e32e60d..d773a010 100644 --- a/services/gateway/src/controller/promotion/promotion.controller.ts +++ b/services/gateway/src/controller/promotion/promotion.controller.ts @@ -155,7 +155,7 @@ promotionRoutes.delete("/api/promotion/:id", withCheck({ role: "ACCOUNTANT" }), required: true, type: 'string' } */ - const {id} = req.params; + const { id } = req.params; promotionServiceClient.deletePromotion(new PromotionId().setId(id), (error, response) => { if (error) return res.status(500).send({ error }); diff --git a/services/gateway/src/controller/stock/stock.controller.ts b/services/gateway/src/controller/stock/stock.controller.ts index 574cadb9..b402d330 100644 --- a/services/gateway/src/controller/stock/stock.controller.ts +++ b/services/gateway/src/controller/stock/stock.controller.ts @@ -1,210 +1,269 @@ -import {Request, Response, Router} from 'express'; -import {stockServiceClient} from '../../services/clients/stock.client'; +import { Request, Response, Router } from "express"; +import { stockServiceClient } from "../../services/clients/stock.client"; import { - CreateIngredientRequest, - CreateIngredientRestaurantRequest, - CreateSupplierRequest, - CreateSupplyOrderRequest, - DeleteIngredientRequest, - DeleteIngredientRestaurantRequest, - DeleteSupplierRequest, - DeleteSupplyOrderRequest, - GetIngredientRequest, - GetIngredientRestaurantRequest, - GetIngredientRestaurantsByProductRequest, - GetIngredientRestaurantsByRestaurantRequest, - GetSupplierRequest, - GetSupplyOrderRequest, - GetSupplyOrdersByIngredientRestaurantRequest, - GetSupplyOrdersByRestaurantRequest, - GetSupplyOrdersBySupplierRequest, - UpdateIngredientRequest, - UpdateIngredientRestaurantRequest, - UpdateSupplierRequest, - UpdateSupplyOrderRequest + CreateIngredientRequest, + CreateIngredientRestaurantRequest, + CreateSupplierRequest, + CreateSupplyOrderRequest, + DeleteIngredientRequest, + DeleteIngredientRestaurantRequest, + DeleteSupplierRequest, + DeleteSupplyOrderRequest, + GetIngredientRequest, + GetIngredientRestaurantRequest, + GetIngredientRestaurantsByProductRequest, + GetIngredientRestaurantsByRestaurantRequest, + GetSupplierRequest, + GetSupplyOrderRequest, + GetSupplyOrdersByIngredientRestaurantRequest, + GetSupplyOrdersByRestaurantRequest, + GetSupplyOrdersBySupplierRequest, + UpdateIngredientRequest, + UpdateIngredientRestaurantRequest, + UpdateSupplierRequest, + UpdateSupplyOrderRequest, } from "@gateway/proto/stock_pb"; -import {Empty} from "google-protobuf/google/protobuf/empty_pb"; - +import { Empty } from "google-protobuf/google/protobuf/empty_pb"; +import { withCheck } from "@gateway/middleware/auth"; export const stockRoutes = Router(); /** * Ingredient Routes */ -stockRoutes.get('/api/stock/supplier/:id', (req: Request, res: Response) => { - /* #swagger.parameters['id'] = { - in: 'path', - required: true, - type: 'integer' - }*/ - const {id} = req.params; - const supplierRequest = new GetSupplierRequest().setId(Number(id)); +stockRoutes.get("/api/stock/supplier/:id", withCheck({ role: "ACCOUNTANT" }), (req: Request, res: Response) => { + /* #swagger.parameters['id'] = { + in: 'path', + required: true, + type: 'integer' + } + #swagger.parameters['authorization'] = { + in: 'header', + required: true, + type: 'string' + } */ + const { id } = req.params; + const supplierRequest = new GetSupplierRequest().setId(Number(id)); - stockServiceClient.getSupplier(supplierRequest, (error, response) => { - if (error) { - res.status(500).send({error: error.message}); - } else { - res.json(response.toObject()); - } - }); + stockServiceClient.getSupplier(supplierRequest, (error, response) => { + if (error) return res.status(500).send({ error }); + else return res.status(200).json(response.toObject()); + }); }); -stockRoutes.get('/api/stock/supplier', (req: Request, res: Response) => { - - stockServiceClient.getSuppliers(new Empty(), (error, response) => { - if (error) { - res.status(500).send({error: error.message}); - } else { - res.json(response.toObject()); +stockRoutes.get("/api/stock/supplier", withCheck({ role: "ACCOUNTANT" }), (_: Request, res: Response) => { + /* #swagger.parameters['authorization'] = { + in: 'header', + required: true, + type: 'string' } - }); + */ + stockServiceClient.getSuppliers(new Empty(), (error, response) => { + if (error) return res.status(500).send({ error }); + else return res.status(200).json(response.toObject()); + }); }); -stockRoutes.get('/api/stock/ingredient/:id', (req: Request, res: Response) => { - /* #swagger.parameters['id'] = { +stockRoutes.get("/api/stock/ingredient/:id", withCheck({ role: "ACCOUNTANT" }), (req: Request, res: Response) => { + /* #swagger.parameters['id'] = { in: 'path', required: true, type: 'integer' - }*/ - const {id} = req.params; - const ingredientRequest = new GetIngredientRequest().setId(Number(id)); - - stockServiceClient.getIngredient(ingredientRequest, (error, response) => { - if (error) { - res.status(500).send({error: error.message}); - } else { - res.json(response.toObject()); } - }); + #swagger.parameters['authorization'] = { + in: 'header', + required: true, + type: 'string' + } + */ + const { id } = req.params; + const ingredientRequest = new GetIngredientRequest().setId(Number(id)); + + stockServiceClient.getIngredient(ingredientRequest, (error, response) => { + if (error) return res.status(500).send({ error }); + else return res.status(200).json(response.toObject()); + }); }); -stockRoutes.get('/api/stock/ingredient', (req: Request, res: Response) => { - - stockServiceClient.getIngredients(new Empty(), (error, response) => { - if (error) { - res.status(500).send({error: error.message}); - } else { - res.json(response.toObject()); +stockRoutes.get("/api/stock/ingredient", withCheck({ role: ["ACCOUNTANT", "ADMIN"] }), (_: Request, res: Response) => { + /* #swagger.parameters['authorization'] = { + in: 'header', + required: true, + type: 'string' } - }); + */ + stockServiceClient.getIngredients(new Empty(), (error, response) => { + if (error) return res.status(500).send({ error }); + else return res.status(200).json(response.toObject()); + }); }); -stockRoutes.post('/api/stock/ingredient', (req: Request, res: Response) => { - /* #swagger.parameters['body'] = { +stockRoutes.post( + "/api/stock/ingredient", + withCheck({ role: ["ACCOUNTANT", "ADMIN"] }), + (req: Request, res: Response) => { + /* #swagger.parameters['body'] = { in: 'body', required: true, schema: { name: "ingredient-name", description: "ingredient-desc", } - } */ - const {name, desciption} = req.body - const ingredientRequest = new CreateIngredientRequest().setName(name).setDescription(desciption) + } + #swagger.parameters['authorization'] = { + in: 'header', + required: true, + type: 'string' + } + */ + const { name, desciption } = req.body; + const ingredientRequest = new CreateIngredientRequest().setName(name).setDescription(desciption); stockServiceClient.createIngredient(ingredientRequest, (error, response) => { - if (error) { - res.status(500).send({error: error.message}); - } else { - res.json(response.toObject()); - } + if (error) return res.status(500).send({ error }); + else return res.status(201).json(response.toObject()); }); -}); - -stockRoutes.put('/api/stock/ingredient/:id', (req: Request, res: Response) => { - /* #swagger.parameters['id'] = { + }, +); + +stockRoutes.put( + "/api/stock/ingredient/:id", + withCheck({ role: ["ACCOUNTANT", "ADMIN"] }), + (req: Request, res: Response) => { + /* #swagger.parameters['id'] = { in: 'path', required: true, type: 'integer' - } - #swagger.parameters['body'] = { + } + #swagger.parameters['body'] = { in: 'body', required: true, schema: { name: "ingredient-name", description: "ingredient-desc", } - } */ - const {id} = req.params - const {name, desciption} = req.body - const ingredientRequest = new UpdateIngredientRequest().setId(Number(id)).setName(name).setDescription(desciption) + } + #swagger.parameters['authorization'] = { + in: 'header', + required: true, + type: 'string' + } + */ + const { id } = req.params; + const { name, desciption } = req.body; + const ingredientRequest = new UpdateIngredientRequest().setId(Number(id)).setName(name).setDescription(desciption); stockServiceClient.updateIngredient(ingredientRequest, (error, response) => { - if (error) { - res.status(500).send({error: error.message}); - } else { - res.json(response.toObject()); - } + if (error) return res.status(500).send({ error }); + else return res.status(200).json(response.toObject()); }); -}); - -stockRoutes.delete('/api/stock/ingredient/:id', (req: Request, res: Response) => { - /* #swagger.parameters['id'] = { + }, +); + +stockRoutes.delete( + "/api/stock/ingredient/:id", + withCheck({ role: ["ACCOUNTANT", "ADMIN"] }), + (req: Request, res: Response) => { + /* #swagger.parameters['id'] = { in: 'path', required: true, type: 'integer' - }*/ - const {id} = req.params + } + #swagger.parameters['authorization'] = { + in: 'header', + required: true, + type: 'string' + } + */ + const { id } = req.params; const ingredientRequest = new DeleteIngredientRequest().setId(Number(id)); stockServiceClient.deleteIngredient(ingredientRequest, (error, response) => { - if (error) { - res.status(500).send({error: error.message}); - } else { - res.json(response.toObject()); - } + if (error) return res.status(500).send({ error }); + else return res.status(200).json(response.toObject()); }); -}); + }, +); /** * Ingredient Restaurant Routes */ -stockRoutes.get('/api/stock/ingredient/restaurant/:id', (req: Request, res: Response) => { - /* #swagger.parameters['id'] = { +stockRoutes.get( + "/api/stock/ingredient/restaurant/:id", + withCheck({ role: ["ACCOUNTANT", "ADMIN"] }), + (req: Request, res: Response) => { + /* #swagger.parameters['id'] = { in: 'path', required: true, type: 'integer' - }*/ - const {id} = req.params; + } + #swagger.parameters['authorization'] = { + in: 'header', + required: true, + type: 'string' + } + */ + const { id } = req.params; const ingredientRestaurantRequest = new GetIngredientRestaurantRequest().setId(Number(id)); stockServiceClient.getIngredientRestaurant(ingredientRestaurantRequest, (error, response) => { - if (error) { - res.status(500).send({error: error.message}); - } else { - res.json(response.toObject()); - } + if (error) return res.status(500).send({ error }); + else return res.status(200).json(response.toObject()); }); -}); - -stockRoutes.get('/api/stock/ingredient/restaurant/by-restaurant/:id', (req: Request, res: Response) => { - const {id} = req.params; - const ingredientRestaurantsByRestaurantRequest = new GetIngredientRestaurantsByRestaurantRequest().setRestaurantId(id); - - stockServiceClient.getIngredientRestaurantsByRestaurant(ingredientRestaurantsByRestaurantRequest, (error, response) => { - if (error) { - res.status(500).send({error: error.message}); - } else { - res.json(response.toObject()); + }, +); + +stockRoutes.get( + "/api/stock/ingredient/restaurant/by-restaurant/:id", + withCheck({ role: ["ACCOUNTANT", "ADMIN"] }), + (req: Request, res: Response) => { + /* #swagger.parameters['authorization'] = { + in: 'header', + required: true, + type: 'string' } - }); -}); - -stockRoutes.get('/api/stock/ingredient/restaurant/by-product/:id', (req: Request, res: Response) => { - const {id} = req.params; + */ + const { id } = req.params; + const ingredientRestaurantsByRestaurantRequest = new GetIngredientRestaurantsByRestaurantRequest().setRestaurantId( + id, + ); + + stockServiceClient.getIngredientRestaurantsByRestaurant( + ingredientRestaurantsByRestaurantRequest, + (error, response) => { + if (error) return res.status(500).send({ error }); + else return res.status(200).json(response.toObject()); + }, + ); + }, +); + +stockRoutes.get( + "/api/stock/ingredient/restaurant/by-product/:id", + withCheck({ role: ["ACCOUNTANT", "ADMIN"] }), + (req: Request, res: Response) => { + /* #swagger.parameters['authorization'] = { + in: 'header', + required: true, + type: 'string' + } + */ + const { id } = req.params; const ingredientRestaurantsByProductRequest = new GetIngredientRestaurantsByProductRequest().setProductId(id); stockServiceClient.getIngredientRestaurantsByProduct(ingredientRestaurantsByProductRequest, (error, response) => { - if (error) { - res.status(500).send({error: error.message}); - } else { - res.json(response.toObject()); - } + if (error) return res.status(500).send({ error }); + else return res.status(200).json(response.toObject()); }); -}); - -stockRoutes.post('/api/stock/ingredient/restaurant', (req: Request, res: Response) => { - /* #swagger.parameters['body'] = { + }, +); + +stockRoutes.post( + "/api/stock/ingredient/restaurant", + withCheck({ role: ["ACCOUNTANT", "ADMIN"] }), + (req: Request, res: Response) => { + /* #swagger.parameters['body'] = { in: 'body', required: true, schema: { @@ -216,33 +275,40 @@ stockRoutes.post('/api/stock/ingredient/restaurant', (req: Request, res: Respons restaurantId: "restaurant_id:1", ingredientId: 1, } - } */ - const {alertThreshold, quantity, productList, unitPrice, pricePerKilo, restaurantId, ingredientId} = req.body; - const ingredientRestaurant = new CreateIngredientRestaurantRequest().setAlertThreshold(alertThreshold) - .setQuantity(quantity) - .setInProductListList(productList) - .setUnitPrice(unitPrice) - .setPricePerKilo(pricePerKilo) - .setRestaurantId(restaurantId) - .setIngredientId(ingredientId) - + } + #swagger.parameters['authorization'] = { + in: 'header', + required: true, + type: 'string' + } + */ + const { alertThreshold, quantity, productList, unitPrice, pricePerKilo, restaurantId, ingredientId } = req.body; + const ingredientRestaurant = new CreateIngredientRestaurantRequest() + .setAlertThreshold(alertThreshold) + .setQuantity(quantity) + .setInProductListList(productList) + .setUnitPrice(unitPrice) + .setPricePerKilo(pricePerKilo) + .setRestaurantId(restaurantId) + .setIngredientId(ingredientId); stockServiceClient.createIngredientRestaurant(ingredientRestaurant, (error, response) => { - if (error) { - res.status(500).send({error: error.message}); - } else { - res.json(response.toObject()); - } + if (error) return res.status(500).send({ error }); + else return res.status(201).json(response.toObject()); }); -}); - -stockRoutes.put('/api/stock/ingredient/restaurant/:id', (req: Request, res: Response) => { - /* #swagger.parameters['id'] = { + }, +); + +stockRoutes.put( + "/api/stock/ingredient/restaurant/:id", + withCheck({ role: ["ACCOUNTANT", "ADMIN"] }), + (req: Request, res: Response) => { + /* #swagger.parameters['id'] = { in: 'path', required: true, type: 'integer' - } - #swagger.parameters['body'] = { + } + #swagger.parameters['body'] = { in: 'body', required: true, schema: { @@ -254,206 +320,285 @@ stockRoutes.put('/api/stock/ingredient/restaurant/:id', (req: Request, res: Resp restaurantId: "restaurant_id:1", ingredientId: 1, } - } */ - const {id} = req.params; - const {alertThreshold, quantity, productList, unitPrice, pricePerKilo, restaurantId, ingredientId} = req.body; - const ingredientRestaurant = new UpdateIngredientRestaurantRequest().setId(Number(id)).setAlertThreshold(alertThreshold) - .setQuantity(quantity) - .setInProductListList(productList) - .setUnitPrice(unitPrice) - .setPricePerKilo(pricePerKilo) - .setRestaurantId(restaurantId) - .setIngredientId(ingredientId) - + } + #swagger.parameters['authorization'] = { + in: 'header', + required: true, + type: 'string' + } + */ + const { id } = req.params; + const { alertThreshold, quantity, productList, unitPrice, pricePerKilo, restaurantId, ingredientId } = req.body; + const ingredientRestaurant = new UpdateIngredientRestaurantRequest() + .setId(Number(id)) + .setAlertThreshold(alertThreshold) + .setQuantity(quantity) + .setInProductListList(productList) + .setUnitPrice(unitPrice) + .setPricePerKilo(pricePerKilo) + .setRestaurantId(restaurantId) + .setIngredientId(ingredientId); stockServiceClient.updateIngredientRestaurant(ingredientRestaurant, (error, response) => { - if (error) { - res.status(500).send({error: error.message}); - } else { - res.json(response.toObject()); - } + if (error) return res.status(500).send({ error }); + else return res.status(200).json(response.toObject()); }); -}); - -stockRoutes.delete('/api/stock/ingredient/restaurant/:id', (req: Request, res: Response) => { - /* #swagger.parameters['id'] = { + }, +); + +stockRoutes.delete( + "/api/stock/ingredient/restaurant/:id", + withCheck({ role: ["ACCOUNTANT", "ADMIN"] }), + (req: Request, res: Response) => { + /* #swagger.parameters['id'] = { in: 'path', required: true, type: 'integer' - }*/ - const {id} = req.params; - - stockServiceClient.deleteIngredientRestaurant(new DeleteIngredientRestaurantRequest().setId(Number(id)), (error, response) => { - if (error) { - res.status(500).send({error: error.message}); - } else { - res.json(response.toObject()); } - }); -}); + #swagger.parameters['authorization'] = { + in: 'header', + required: true, + type: 'string' + } + */ + const { id } = req.params; + + stockServiceClient.deleteIngredientRestaurant( + new DeleteIngredientRestaurantRequest().setId(Number(id)), + (error, response) => { + if (error) return res.status(500).send({ error }); + else return res.status(200).json(response.toObject()); + }, + ); + }, +); /** * Supplier Routes */ -stockRoutes.get('/api/stock/supplier/:id', (req: Request, res: Response) => { - /* #swagger.parameters['id'] = { +stockRoutes.get( + "/api/stock/supplier/:id", + withCheck({ role: ["ACCOUNTANT", "ADMIN"] }), + (req: Request, res: Response) => { + /* #swagger.parameters['id'] = { in: 'path', required: true, type: 'integer' - }*/ - const {id} = req.params; + } + #swagger.parameters['authorization'] = { + in: 'header', + required: true, + type: 'string' + } + */ + const { id } = req.params; stockServiceClient.getSupplier(new GetSupplierRequest().setId(Number(id)), (error, response) => { - if (error) { - res.status(500).send({error: error.message}); - } else { - res.json(response.toObject()); - } + if (error) return res.status(500).send({ error }); + else return res.status(200).json(response.toObject()); }); -}); + }, +); -stockRoutes.get('/api/stock/supplier', (req: Request, res: Response) => { - stockServiceClient.getSuppliers(new Empty(), (error, response) => { - if (error) { - res.status(500).send({error: error.message}); - } else { - res.json(response.toObject()); +stockRoutes.get("/api/stock/supplier", withCheck({ role: ["ACCOUNTANT", "ADMIN"] }), (req: Request, res: Response) => { + /* #swagger.parameters['authorization'] = { + in: 'header', + required: true, + type: 'string' } - }); + */ + stockServiceClient.getSuppliers(new Empty(), (error, response) => { + if (error) return res.status(500).send({ error }); + else return res.status(200).json(response.toObject()); + }); }); -stockRoutes.post('/api/stock/supplier', (req: Request, res: Response) => { - /* #swagger.parameters['body'] = { +stockRoutes.post("/api/stock/supplier", withCheck({ role: ["ACCOUNTANT", "ADMIN"] }), (req: Request, res: Response) => { + /* #swagger.parameters['body'] = { in: 'body', required: true, schema: { name: "supplier-name", contact: "supplier-contact" } - } */ - const {name, contact} = req.body; - const supplierRequest = new CreateSupplierRequest().setName(name).setContact(contact) - - stockServiceClient.createSupplier(supplierRequest, (error, response) => { - if (error) { - res.status(500).send({error: error.message}); - } else { - res.json(response.toObject()); + } + #swagger.parameters['authorization'] = { + in: 'header', + required: true, + type: 'string' } - }); + */ + const { name, contact } = req.body; + const supplierRequest = new CreateSupplierRequest().setName(name).setContact(contact); + + stockServiceClient.createSupplier(supplierRequest, (error, response) => { + if (error) return res.status(500).send({ error }); + else return res.status(201).json(response.toObject()); + }); }); -stockRoutes.put('/api/stock/supplier/:id', (req: Request, res: Response) => { - /* #swagger.parameters['id'] = { +stockRoutes.put( + "/api/stock/supplier/:id", + withCheck({ role: ["ACCOUNTANT", "ADMIN"] }), + (req: Request, res: Response) => { + /* #swagger.parameters['id'] = { in: 'path', required: true, type: 'integer' - } - #swagger.parameters['body'] = { + } + #swagger.parameters['body'] = { in: 'body', required: true, schema: { name: "supplier-name", contact: "supplier-contact" } - } */ - const {id} = req.params; - const {name, contact} = req.body; - const supplierRequest = new UpdateSupplierRequest().setId(Number(id)).setName(name).setContact(contact) + } + #swagger.parameters['authorization'] = { + in: 'header', + required: true, + type: 'string' + } + */ + const { id } = req.params; + const { name, contact } = req.body; + const supplierRequest = new UpdateSupplierRequest().setId(Number(id)).setName(name).setContact(contact); stockServiceClient.updateSupplier(supplierRequest, (error, response) => { - if (error) { - res.status(500).send({error: error.message}); - } else { - res.json(response.toObject()); - } + if (error) return res.status(500).send({ error }); + else return res.status(200).json(response.toObject()); }); -}); - -stockRoutes.delete('/api/stock/supplier/:id', (req: Request, res: Response) => { - /* #swagger.parameters['id'] = { + }, +); + +stockRoutes.delete( + "/api/stock/supplier/:id", + withCheck({ role: ["ACCOUNTANT", "ADMIN"] }), + (req: Request, res: Response) => { + /* #swagger.parameters['id'] = { in: 'path', required: true, type: 'integer' - }*/ - const {id} = req.params; + } + #swagger.parameters['authorization'] = { + in: 'header', + required: true, + type: 'string' + } + */ + const { id } = req.params; stockServiceClient.deleteSupplier(new DeleteSupplierRequest().setId(Number(id)), (error, response) => { - if (error) { - res.status(500).send({error: error.message}); - } else { - res.json(response.toObject()); - } + if (error) { + res.status(500).send({ error: error.message }); + } else { + res.json(response.toObject()); + } }); -}); + }, +); /** * Supply Order Routes */ -stockRoutes.get('/api/stock/supply/order/:id', (req: Request, res: Response) => { - /* #swagger.parameters['id'] = { +stockRoutes.get( + "/api/stock/supply/order/:id", + withCheck({ role: ["ACCOUNTANT", "ADMIN"] }), + (req: Request, res: Response) => { + /* #swagger.parameters['id'] = { in: 'path', required: true, type: 'integer' - }*/ - const {id} = req.params; - - stockServiceClient.getSupplyOrder(new GetSupplyOrderRequest().setId(Number(id)), (error, response) => { - if (error) { - res.status(500).send({error: error.message}); - } else { - res.json(response.toObject()); } - }); -}); - -stockRoutes.get('/api/stock/supply/order/by-restaurant/:id', (req: Request, res: Response) => { - const {id} = req.params; - stockServiceClient.getSupplyOrdersByRestaurant(new GetSupplyOrdersByRestaurantRequest().setRestaurantId(id), (error, response) => { - if (error) { - res.status(500).send({error: error.message}); - } else { - res.json(response.toObject()); + #swagger.parameters['authorization'] = { + in: 'header', + required: true, + type: 'string' } - }); -}); + */ + const { id } = req.params; -stockRoutes.get('/api/stock/supply/order/by-supplier/:id', (req: Request, res: Response) => { - /* #swagger.parameters['id'] = { + stockServiceClient.getSupplyOrder(new GetSupplyOrderRequest().setId(Number(id)), (error, response) => { + if (error) return res.status(500).send({ error }); + else return res.status(200).json(response.toObject()); + }); + }, +); + +stockRoutes.get( + "/api/stock/supply/order/by-restaurant/:id", + withCheck({ role: ["ACCOUNTANT", "ADMIN"] }), + (req: Request, res: Response) => { + const { id } = req.params; + stockServiceClient.getSupplyOrdersByRestaurant( + new GetSupplyOrdersByRestaurantRequest().setRestaurantId(id), + (error, response) => { + if (error) return res.status(500).send({ error }); + else return res.status(200).json(response.toObject()); + }, + ); + }, +); + +stockRoutes.get( + "/api/stock/supply/order/by-supplier/:id", + withCheck({ role: ["ACCOUNTANT", "ADMIN"] }), + (req: Request, res: Response) => { + /* #swagger.parameters['id'] = { in: 'path', required: true, type: 'integer' - }*/ - const {id} = req.params; - stockServiceClient.getSupplyOrdersBySupplier(new GetSupplyOrdersBySupplierRequest().setSupplierId(Number(id)), (error, response) => { - if (error) { - res.status(500).send({error: error.message}); - } else { - res.json(response.toObject()); } - }); -}); - -stockRoutes.get('/api/stock/supply/order/by-ingredient-restaurant/:id', (req: Request, res: Response) => { - /* #swagger.parameters['id'] = { + #swagger.parameters['authorization'] = { + in: 'header', + required: true, + type: 'string' + } + */ + const { id } = req.params; + stockServiceClient.getSupplyOrdersBySupplier( + new GetSupplyOrdersBySupplierRequest().setSupplierId(Number(id)), + (error, response) => { + if (error) return res.status(500).send({ error }); + else return res.status(200).json(response.toObject()); + }, + ); + }, +); + +stockRoutes.get( + "/api/stock/supply/order/by-ingredient-restaurant/:id", + withCheck({ role: ["ACCOUNTANT", "ADMIN"] }), + (req: Request, res: Response) => { + /* #swagger.parameters['id'] = { in: 'path', required: true, type: 'integer' - }*/ - const {id} = req.params; - stockServiceClient.getSupplyOrdersByIngredientRestaurant(new GetSupplyOrdersByIngredientRestaurantRequest().setIngredientRestaurantId(Number(id)), (error, response) => { - if (error) { - res.status(500).send({error: error.message}); - } else { - res.json(response.toObject()); } - }); -}); - -stockRoutes.post('/api/stock/supply/order', (req: Request, res: Response) => { - /* #swagger.parameters['body'] = { + #swagger.parameters['authorization'] = { + in: 'header', + required: true, + type: 'string' + } + */ + const { id } = req.params; + stockServiceClient.getSupplyOrdersByIngredientRestaurant( + new GetSupplyOrdersByIngredientRestaurantRequest().setIngredientRestaurantId(Number(id)), + (error, response) => { + if (error) return res.status(500).send({ error }); + else return res.status(200).json(response.toObject()); + }, + ); + }, +); + +stockRoutes.post( + "/api/stock/supply/order", + withCheck({ role: ["ACCOUNTANT", "ADMIN"] }), + (req: Request, res: Response) => { + /* #swagger.parameters['body'] = { in: 'body', required: true, schema: { @@ -461,28 +606,36 @@ stockRoutes.post('/api/stock/supply/order', (req: Request, res: Response) => { ingredientRestaurantId: 1, supplierId: 1 } - } */ - const {quantity, ingredientRestaurantId, supplierId} = req.body; - const supplyOrderRequest = new CreateSupplyOrderRequest().setQuantity(quantity) - .setIngredientRestaurantId(ingredientRestaurantId) - .setSupplierId(supplierId); + } + #swagger.parameters['authorization'] = { + in: 'header', + required: true, + type: 'string' + } + */ + const { quantity, ingredientRestaurantId, supplierId } = req.body; + const supplyOrderRequest = new CreateSupplyOrderRequest() + .setQuantity(quantity) + .setIngredientRestaurantId(ingredientRestaurantId) + .setSupplierId(supplierId); stockServiceClient.createSupplyOrder(supplyOrderRequest, (error, response) => { - if (error) { - res.status(500).send({error: error.message}); - } else { - res.json(response.toObject()); - } + if (error) return res.status(500).send({ error }); + else return res.status(201).json(response.toObject()); }); -}); - -stockRoutes.put('/api/stock/supply/order/:id', (req: Request, res: Response) => { - /* #swagger.parameters['id'] = { + }, +); + +stockRoutes.put( + "/api/stock/supply/order/:id", + withCheck({ role: ["ACCOUNTANT", "ADMIN"] }), + (req: Request, res: Response) => { + /* #swagger.parameters['id'] = { in: 'path', required: true, type: 'integer' - } - #swagger.parameters['body'] = { + } + #swagger.parameters['body'] = { in: 'body', required: true, schema: { @@ -490,34 +643,47 @@ stockRoutes.put('/api/stock/supply/order/:id', (req: Request, res: Response) => ingredientRestaurantId: 1, supplierId: 1 } - } */ - const {id} = req.params; - const {quantity, ingredientRestaurantId, supplierId} = req.body; - const supplyOrderRequest = new UpdateSupplyOrderRequest().setId(Number(id)).setQuantity(quantity) - .setIngredientRestaurantId(ingredientRestaurantId) - .setSupplierId(supplierId); + } + #swagger.parameters['authorization'] = { + in: 'header', + required: true, + type: 'string' + } + */ + const { id } = req.params; + const { quantity, ingredientRestaurantId, supplierId } = req.body; + const supplyOrderRequest = new UpdateSupplyOrderRequest() + .setId(Number(id)) + .setQuantity(quantity) + .setIngredientRestaurantId(ingredientRestaurantId) + .setSupplierId(supplierId); stockServiceClient.updateSupplyOrder(supplyOrderRequest, (error, response) => { - if (error) { - res.status(500).send({error: error.message}); - } else { - res.json(response.toObject()); - } + if (error) return res.status(500).send({ error }); + else return res.status(200).json(response.toObject()); }); -}); + }, +); -stockRoutes.delete('/api/stock/supply/order/:id', (req: Request, res: Response) => { +stockRoutes.delete( + "/api/stock/supply/order/:id", + withCheck({ role: ["ACCOUNTANT", "ADMIN"] }), + (req: Request, res: Response) => { /* #swagger.parameters['id'] = { in: 'path', required: true, type: 'integer' - }*/ - const {id} = req.params; - stockServiceClient.deleteSupplyOrder(new DeleteSupplyOrderRequest().setId(Number(id)), (error, response) => { - if (error) { - res.status(500).send({error: error.message}); - } else { - res.json(response.toObject()); } + #swagger.parameters['authorization'] = { + in: 'header', + required: true, + type: 'string' + } + */ + const { id } = req.params; + stockServiceClient.deleteSupplyOrder(new DeleteSupplyOrderRequest().setId(Number(id)), (error, response) => { + if (error) return res.status(500).send({ error }); + else return res.status(200).json(response.toObject()); }); -}); \ No newline at end of file + }, +); diff --git a/services/gateway/src/controller/stock/stockPerson.controller.ts b/services/gateway/src/controller/stock/stockPerson.controller.ts index ba929c09..45407977 100644 --- a/services/gateway/src/controller/stock/stockPerson.controller.ts +++ b/services/gateway/src/controller/stock/stockPerson.controller.ts @@ -1,11 +1,11 @@ -import {stockPersonServiceClient} from "@gateway/services/clients/stock.client"; -import {Request, Response, Router} from "express"; -import {GetOutcomesByRestaurantRequest} from "@gateway/proto/stock_pb"; +import { stockPersonServiceClient } from "@gateway/services/clients/stock.client"; +import { Request, Response, Router } from "express"; +import { GetOutcomesByRestaurantRequest } from "@gateway/proto/stock_pb"; export const stockPersonRoutes = Router(); -stockPersonRoutes.post('/api/stock/outcomes/by-restaurant/:id', (req: Request, res: Response) => { - /* #swagger.parameters['body'] = { +stockPersonRoutes.post("/api/stock/outcomes/by-restaurant/:id", (req: Request, res: Response) => { + /* #swagger.parameters['body'] = { in: 'body', required: true, schema: { @@ -17,15 +17,18 @@ stockPersonRoutes.post('/api/stock/outcomes/by-restaurant/:id', (req: Request, r required: true, type: 'string' } */ - const {id} = req.params; - const {date, interval} = req.body; - const outcomesByRestaurantRequest = new GetOutcomesByRestaurantRequest().setRestaurantId(id).setDate(date).setInterval(interval); + const { id } = req.params; + const { date, interval } = req.body; + const outcomesByRestaurantRequest = new GetOutcomesByRestaurantRequest() + .setRestaurantId(id) + .setDate(date) + .setInterval(interval); - stockPersonServiceClient.getOutcomesByRestaurant(outcomesByRestaurantRequest, (error, response) => { - if (error) { - res.status(500).send({error: error.message}); - } else { - res.json(response.toObject()); - } - }); -}); \ No newline at end of file + stockPersonServiceClient.getOutcomesByRestaurant(outcomesByRestaurantRequest, (error, response) => { + if (error) { + res.status(500).send({ error: error.message }); + } else { + res.json(response.toObject()); + } + }); +}); From be17314437d4bd82d3a67ec9bbd898d2574a70f8 Mon Sep 17 00:00:00 2001 From: Pierre Lebigre Date: Sat, 26 Aug 2023 12:57:07 +0200 Subject: [PATCH 483/883] Add entrypoint for all service with prisma --- services/delivery/Dockerfile | 3 ++- services/delivery/script.sh | 5 +++++ services/order/Dockerfile | 3 ++- services/order/script.sh | 5 +++++ services/payment/Dockerfile | 3 ++- services/payment/script.sh | 5 +++++ services/product/Dockerfile | 3 ++- services/product/script.sh | 5 +++++ services/promotions/Dockerfile | 3 ++- services/promotions/script.sh | 5 +++++ services/stock/Dockerfile | 3 ++- services/stock/script.sh | 5 +++++ 12 files changed, 42 insertions(+), 6 deletions(-) create mode 100644 services/delivery/script.sh create mode 100644 services/order/script.sh create mode 100644 services/payment/script.sh create mode 100644 services/product/script.sh create mode 100644 services/promotions/script.sh create mode 100644 services/stock/script.sh diff --git a/services/delivery/Dockerfile b/services/delivery/Dockerfile index 19327c3e..8f156f9e 100644 --- a/services/delivery/Dockerfile +++ b/services/delivery/Dockerfile @@ -28,6 +28,7 @@ WORKDIR /app # Copy the application package COPY --from=builder /app/dist . COPY --from=builder /app/prisma/ . +COPY --from=builder /app/script.sh ./script.sh COPY --from=builder /app/proto/ /proto/ COPY --from=builder /app/node_modules/.prisma /.prisma @@ -35,4 +36,4 @@ COPY --from=builder /app/node_modules/.prisma /.prisma EXPOSE 50008 # Start the server -CMD [ "node", "index.js"] +CMD ["sh", "script.sh"] diff --git a/services/delivery/script.sh b/services/delivery/script.sh new file mode 100644 index 00000000..71759243 --- /dev/null +++ b/services/delivery/script.sh @@ -0,0 +1,5 @@ +#!/bin/bash + +npx prisma migrate deploy + +node index.js \ No newline at end of file diff --git a/services/order/Dockerfile b/services/order/Dockerfile index 6e37d753..1ba4f373 100644 --- a/services/order/Dockerfile +++ b/services/order/Dockerfile @@ -28,6 +28,7 @@ WORKDIR /app # Copy the application package COPY --from=builder /app/dist . COPY --from=builder /app/prisma/ . +COPY --from=builder /app/script.sh ./script.sh COPY --from=builder /app/proto/ /proto/ COPY --from=builder /app/node_modules/.prisma /.prisma @@ -35,4 +36,4 @@ COPY --from=builder /app/node_modules/.prisma /.prisma EXPOSE 50007 # Start the server -CMD [ "node", "index.js"] +CMD ["sh", "script.sh"] diff --git a/services/order/script.sh b/services/order/script.sh new file mode 100644 index 00000000..71759243 --- /dev/null +++ b/services/order/script.sh @@ -0,0 +1,5 @@ +#!/bin/bash + +npx prisma migrate deploy + +node index.js \ No newline at end of file diff --git a/services/payment/Dockerfile b/services/payment/Dockerfile index 76707cef..7e543165 100644 --- a/services/payment/Dockerfile +++ b/services/payment/Dockerfile @@ -28,6 +28,7 @@ WORKDIR /app # Copy the application package COPY --from=builder /app/dist . COPY --from=builder /app/prisma/ . +COPY --from=builder /app/script.sh ./script.sh COPY --from=builder /app/proto/ /proto/ COPY --from=builder /app/node_modules/.prisma /.prisma @@ -38,4 +39,4 @@ EXPOSE 50003 EXPOSE 4242 # Start the server -CMD [ "node", "index.js"] +CMD ["sh", "script.sh"] diff --git a/services/payment/script.sh b/services/payment/script.sh new file mode 100644 index 00000000..71759243 --- /dev/null +++ b/services/payment/script.sh @@ -0,0 +1,5 @@ +#!/bin/bash + +npx prisma migrate deploy + +node index.js \ No newline at end of file diff --git a/services/product/Dockerfile b/services/product/Dockerfile index f16d0ba6..e98eca3b 100644 --- a/services/product/Dockerfile +++ b/services/product/Dockerfile @@ -28,6 +28,7 @@ WORKDIR /app # Copy the application package COPY --from=builder /app/dist . COPY --from=builder /app/prisma/ . +COPY --from=builder /app/script.sh ./script.sh COPY --from=builder /app/proto/ /proto/ COPY --from=builder /app/node_modules/.prisma /.prisma @@ -35,4 +36,4 @@ COPY --from=builder /app/node_modules/.prisma /.prisma EXPOSE 50004 # Start the server -CMD [ "node", "index.js"] \ No newline at end of file +CMD ["sh", "script.sh"] \ No newline at end of file diff --git a/services/product/script.sh b/services/product/script.sh new file mode 100644 index 00000000..71759243 --- /dev/null +++ b/services/product/script.sh @@ -0,0 +1,5 @@ +#!/bin/bash + +npx prisma migrate deploy + +node index.js \ No newline at end of file diff --git a/services/promotions/Dockerfile b/services/promotions/Dockerfile index a1fc70da..aeca64fe 100644 --- a/services/promotions/Dockerfile +++ b/services/promotions/Dockerfile @@ -29,10 +29,11 @@ WORKDIR /app COPY --from=builder /app/dist . COPY --from=builder /app/prisma/ . COPY --from=builder /app/proto/ /proto/ +COPY --from=builder /app/script.sh ./script.sh COPY --from=builder /app/node_modules/.prisma /.prisma # Expose the gRPC port EXPOSE 50006 # Start the server -CMD [ "node", "index.js"] +CMD ["sh", "script.sh"] diff --git a/services/promotions/script.sh b/services/promotions/script.sh new file mode 100644 index 00000000..71759243 --- /dev/null +++ b/services/promotions/script.sh @@ -0,0 +1,5 @@ +#!/bin/bash + +npx prisma migrate deploy + +node index.js \ No newline at end of file diff --git a/services/stock/Dockerfile b/services/stock/Dockerfile index 713afa23..d4f2052f 100644 --- a/services/stock/Dockerfile +++ b/services/stock/Dockerfile @@ -28,6 +28,7 @@ WORKDIR /app # Copy the application package COPY --from=builder /app/dist . COPY --from=builder /app/prisma/ . +COPY --from=builder /app/script.sh ./script.sh COPY --from=builder /app/proto/ /proto/ COPY --from=builder /app/node_modules/.prisma /.prisma @@ -35,4 +36,4 @@ COPY --from=builder /app/node_modules/.prisma /.prisma EXPOSE 50009 # Start the server -CMD ["node", "index.js"] +CMD ["sh", "script.sh"] diff --git a/services/stock/script.sh b/services/stock/script.sh new file mode 100644 index 00000000..71759243 --- /dev/null +++ b/services/stock/script.sh @@ -0,0 +1,5 @@ +#!/bin/bash + +npx prisma migrate deploy + +node index.js \ No newline at end of file From b166c4cb8c67214aaca33560685a03dc30ca87ef Mon Sep 17 00:00:00 2001 From: anatole Date: Sat, 26 Aug 2023 15:58:30 +0200 Subject: [PATCH 484/883] feat(gateway): rename rabitmq service --- services/basket/.env.docker | 2 +- services/basket/.env.example | 2 +- services/delivery/.env.docker | 2 +- services/delivery/.env.example | 2 +- services/docker-compose.yml | 26 +++++++++++-------- .../promotion/promotion.controller.ts | 8 +++--- .../restaurant/restaurant.controller.ts | 6 ++--- .../src/lib/swagger/swagger-output.json | 17 +++++------- services/log/.env.docker | 2 +- services/notification/.env.docker | 6 +++++ services/notification/.env.example | 2 +- services/order/.env.docker | 2 +- services/order/.env.example | 2 +- services/payment/.env.docker | 2 +- services/payment/.env.example | 2 +- services/product/.env.docker | 2 +- services/product/.env.example | 2 +- services/promotions/.env.docker | 2 +- services/promotions/.env.example | 2 +- services/restaurant/.env.docker | 2 +- services/stock/.env.docker | 2 +- services/stock/.env.example | 2 +- 22 files changed, 51 insertions(+), 46 deletions(-) create mode 100644 services/notification/.env.docker diff --git a/services/basket/.env.docker b/services/basket/.env.docker index c0e31609..45c61cc0 100644 --- a/services/basket/.env.docker +++ b/services/basket/.env.docker @@ -1,3 +1,3 @@ REDIS_URL=redis://basket-redis:6379 PORT=50002 -AMQP_URL=amqp://guest:guest@log-rabbitmq \ No newline at end of file +AMQP_URL=amqp://guest:guest@event-broker \ No newline at end of file diff --git a/services/basket/.env.example b/services/basket/.env.example index 97d7165f..1084d85d 100644 --- a/services/basket/.env.example +++ b/services/basket/.env.example @@ -1,3 +1,3 @@ REDIS_URL=redis://localhost:6379/0 PORT=50002 -AMQP_URL=amqp://guest:guest@log-rabbitmq \ No newline at end of file +AMQP_URL=amqp://guest:guest@event-broker \ No newline at end of file diff --git a/services/delivery/.env.docker b/services/delivery/.env.docker index 9d480629..f5b5ec20 100644 --- a/services/delivery/.env.docker +++ b/services/delivery/.env.docker @@ -1,4 +1,4 @@ DATABASE_URL=postgres://postgres:password@delivery-postgres:5432/postgres PORT=50008 -AMQP_URL=amqp://guest:guest@log-rabbitmq +AMQP_URL=amqp://guest:guest@event-broker REDIS_HOST: delivery-redis \ No newline at end of file diff --git a/services/delivery/.env.example b/services/delivery/.env.example index 1564809d..fde281d7 100644 --- a/services/delivery/.env.example +++ b/services/delivery/.env.example @@ -1,5 +1,5 @@ DATABASE_URL=postgres://postgres:password@localhost:5432/postgres PORT=50008 -AMQP_URL=amqp://guest:guest@log-rabbitmq +AMQP_URL=amqp://guest:guest@event-broker # with docker add : # REDIS_HOST: delivery-redis \ No newline at end of file diff --git a/services/docker-compose.yml b/services/docker-compose.yml index 2c1822ab..f0951d12 100644 --- a/services/docker-compose.yml +++ b/services/docker-compose.yml @@ -315,7 +315,7 @@ services: log-service: depends_on: - log-postgres - - log-rabbitmq + - event-broker restart: always image: floriaaan/goodfood-log:latest @@ -329,15 +329,6 @@ services: networks: - goodfood-network - log-rabbitmq: - restart: always - image: rabbitmq:3-management - ports: - - "5672" - - "15672" - networks: - - goodfood-network - log-postgres: image: postgres:15.2 environment: @@ -350,6 +341,19 @@ services: networks: - goodfood-network +# RabbitMQ + + event-broker: + restart: always + image: rabbitmq:3-management + ports: + - "5672" + - "15672" + networks: + - goodfood-network + +# Volumes + volumes: goodfood-user-volume: goodfood-basket-volume: @@ -364,4 +368,4 @@ volumes: goodfood-log-volume: networks: - goodfood-network: \ No newline at end of file + goodfood-network: diff --git a/services/gateway/src/controller/promotion/promotion.controller.ts b/services/gateway/src/controller/promotion/promotion.controller.ts index 4e32e60d..8843bfa8 100644 --- a/services/gateway/src/controller/promotion/promotion.controller.ts +++ b/services/gateway/src/controller/promotion/promotion.controller.ts @@ -55,7 +55,7 @@ promotionRoutes.get( required: true, type: 'string' } - #swagger.parameters['header'] = { + #swagger.parameters['authorization'] = { in: 'header', required: true, type: 'string' @@ -91,7 +91,7 @@ promotionRoutes.post("/api/promotion", withCheck({ role: "ACCOUNTANT" }), (req, method: {'$ref': '#/definitions/Method'}, restaurantId: "restaurant_id:0", } - } #swagger.parameters['header'] = { + } #swagger.parameters['authorization'] = { in: 'header', required: true, type: 'string' @@ -119,7 +119,7 @@ promotionRoutes.put("/api/promotion/:id", withCheck({ role: "ACCOUNTANT" }), (re restaurantId: "restaurant_id:0", } } - #swagger.parameters['header'] = { + #swagger.parameters['authorization'] = { in: 'header', required: true, type: 'string' @@ -145,7 +145,7 @@ promotionRoutes.put("/api/promotion/:id", withCheck({ role: "ACCOUNTANT" }), (re }); promotionRoutes.delete("/api/promotion/:id", withCheck({ role: "ACCOUNTANT" }), (req, res) => { - /* #swagger.parameters['header'] = { + /* #swagger.parameters['authorization'] = { in: 'header', required: true, type: 'string' diff --git a/services/gateway/src/controller/restaurant/restaurant.controller.ts b/services/gateway/src/controller/restaurant/restaurant.controller.ts index f7fb77d5..0e7f4ef4 100644 --- a/services/gateway/src/controller/restaurant/restaurant.controller.ts +++ b/services/gateway/src/controller/restaurant/restaurant.controller.ts @@ -61,7 +61,7 @@ restaurantRoutes.post("/api/restaurant", withCheck({ role: "ADMIN" }), (req: Req phone: "restaurant-phone" } } - #swagger.parameters['header'] = { + #swagger.parameters['authorization'] = { in: 'header', required: true, type: 'string' @@ -102,7 +102,7 @@ restaurantRoutes.put( phone: "restaurant-phone" } } - #swagger.parameters['header'] = { + #swagger.parameters['authorization'] = { in: 'header', required: true, type: 'string' @@ -131,7 +131,7 @@ restaurantRoutes.delete("/api/restaurant/:id", withCheck({ role: "ADMIN" }), (re required: true, type: 'string' } - #swagger.parameters['header'] = { + #swagger.parameters['authorization'] = { in: 'header', required: true, type: 'string' diff --git a/services/gateway/src/lib/swagger/swagger-output.json b/services/gateway/src/lib/swagger/swagger-output.json index 46e5d828..c4617ea3 100644 --- a/services/gateway/src/lib/swagger/swagger-output.json +++ b/services/gateway/src/lib/swagger/swagger-output.json @@ -1817,7 +1817,7 @@ } }, { - "name": "header", + "name": "authorization", "in": "header", "required": true, "type": "string" @@ -1845,7 +1845,7 @@ "type": "string" }, { - "name": "header", + "name": "authorization", "in": "header", "required": true, "type": "string" @@ -1929,7 +1929,7 @@ } }, { - "name": "header", + "name": "authorization", "in": "header", "required": true, "type": "string" @@ -3081,7 +3081,7 @@ } }, { - "name": "header", + "name": "authorization", "in": "header", "required": true, "type": "string" @@ -3113,11 +3113,6 @@ { "name": "authorization", "in": "header", - "type": "string" - }, - { - "name": "header", - "in": "header", "required": true, "type": "string" } @@ -3174,7 +3169,7 @@ } }, { - "name": "header", + "name": "authorization", "in": "header", "required": true, "type": "string" @@ -3202,7 +3197,7 @@ "type": "string" }, { - "name": "header", + "name": "authorization", "in": "header", "required": true, "type": "string" diff --git a/services/log/.env.docker b/services/log/.env.docker index c42a8786..4f42198e 100644 --- a/services/log/.env.docker +++ b/services/log/.env.docker @@ -1,3 +1,3 @@ DATABASE_URL=postgres://postgres:password@log-postgres:5432/postgres PORT=50021 -AMQP_URL=amqp://guest:guest@log-rabbitmq:5672 \ No newline at end of file +AMQP_URL=amqp://guest:guest@event-broker:5672 \ No newline at end of file diff --git a/services/notification/.env.docker b/services/notification/.env.docker new file mode 100644 index 00000000..da5dea14 --- /dev/null +++ b/services/notification/.env.docker @@ -0,0 +1,6 @@ +DATABASE_URL=postgresql://postgres:postgres@localhost:5432/notification +AMQP_URL=amqp://guest:guest@event-broker +PLUNK_PUBLIC_KEY="exemple" +PLUNK_PROJECT_NAME=goodfood + +PORT=50022 \ No newline at end of file diff --git a/services/notification/.env.example b/services/notification/.env.example index c8470406..3003a6c9 100644 --- a/services/notification/.env.example +++ b/services/notification/.env.example @@ -1,6 +1,6 @@ DATABASE_URL=postgresql://postgres:postgres@localhost:5432/notifications AMQP_URL=amqp://guest:guest@localhost PLUNK_PUBLIC_KEY="exemple" -PLUNk_PROJECT_NAME=goodfood +PLUNK_PROJECT_NAME=goodfood PORT=50022 \ No newline at end of file diff --git a/services/order/.env.docker b/services/order/.env.docker index 6c59b038..e0e494cb 100644 --- a/services/order/.env.docker +++ b/services/order/.env.docker @@ -1,3 +1,3 @@ DATABASE_URL=postgres://postgres:password@order-postgres:5432/postgres -AMQP_URL=amqp://guest:guest@log-rabbitmq +AMQP_URL=amqp://guest:guest@event-broker PORT=50007 \ No newline at end of file diff --git a/services/order/.env.example b/services/order/.env.example index 5a5e841f..5126258b 100644 --- a/services/order/.env.example +++ b/services/order/.env.example @@ -1,4 +1,4 @@ DATABASE_URL=postgres://postgres:password@localhost:5432/postgres -AMQP_URL=amqp://guest:guest@log-rabbitmq +AMQP_URL=amqp://guest:guest@event-broker PORT=50007 \ No newline at end of file diff --git a/services/payment/.env.docker b/services/payment/.env.docker index 8e253ab1..92115ed9 100644 --- a/services/payment/.env.docker +++ b/services/payment/.env.docker @@ -1,5 +1,5 @@ DATABASE_URL=postgres://postgres:password@payment-postgres:5432/postgres -AMQP_URL=amqp://guest:guest@log-rabbitmq +AMQP_URL=amqp://guest:guest@event-broker PORT=50003 diff --git a/services/payment/.env.example b/services/payment/.env.example index 9951b5de..0ae91c0f 100644 --- a/services/payment/.env.example +++ b/services/payment/.env.example @@ -1,5 +1,5 @@ DATABASE_URL=postgres://postgres:password@localhost:5432/postgres -AMQP_URL=amqp://guest:guest@log-rabbitmq +AMQP_URL=amqp://guest:guest@event-broker PORT=50003 diff --git a/services/product/.env.docker b/services/product/.env.docker index 6dd3b8a4..0995d73c 100644 --- a/services/product/.env.docker +++ b/services/product/.env.docker @@ -1,5 +1,5 @@ DATABASE_URL=postgres://postgres:password@product-postgres:5432/postgres PORT=50004 -AMQP_URL=amqp://guest:guest@log-rabbitmq +AMQP_URL=amqp://guest:guest@event-broker AZURE_STORAGE_SAS_TOKEN=example AZURE_STORAGE_RESOURCE_NAME=exemple \ No newline at end of file diff --git a/services/product/.env.example b/services/product/.env.example index 0b930c52..fc818080 100644 --- a/services/product/.env.example +++ b/services/product/.env.example @@ -1,5 +1,5 @@ DATABASE_URL=postgres://postgres:password@postgres:5432/postgres PORT=50004 -AMQP_URL=amqp://guest:guest@log-rabbitmq +AMQP_URL=amqp://guest:guest@event-broker AZURE_STORAGE_SAS_TOKEN=example AZURE_STORAGE_RESOURCE_NAME=exemple \ No newline at end of file diff --git a/services/promotions/.env.docker b/services/promotions/.env.docker index ba4b2670..f8627f20 100644 --- a/services/promotions/.env.docker +++ b/services/promotions/.env.docker @@ -1,4 +1,4 @@ DATABASE_URL=postgres://postgres:password@promotion-postgres:5432/promotions -AMQP_URL=amqp://guest:guest@log-rabbitmq +AMQP_URL=amqp://guest:guest@event-broker PORT=50006 \ No newline at end of file diff --git a/services/promotions/.env.example b/services/promotions/.env.example index b4ee39bc..3b3a4a5d 100644 --- a/services/promotions/.env.example +++ b/services/promotions/.env.example @@ -1,4 +1,4 @@ DATABASE_URL=postgres://postgres:password@localhost:5432/promotions -AMQP_URL=amqp://guest:guest@log-rabbitmq +AMQP_URL=amqp://guest:guest@event-broker PORT=50006 \ No newline at end of file diff --git a/services/restaurant/.env.docker b/services/restaurant/.env.docker index 20f88df7..0739fa99 100644 --- a/services/restaurant/.env.docker +++ b/services/restaurant/.env.docker @@ -1,4 +1,4 @@ DATABASE_URL=postgres://postgres:password@restaurant-postgres:5432/postgres -AMQP_URL=amqp://guest:guest@log-rabbitmq +AMQP_URL=amqp://guest:guest@event-broker PORT=50005 \ No newline at end of file diff --git a/services/stock/.env.docker b/services/stock/.env.docker index fc521070..c05acb48 100644 --- a/services/stock/.env.docker +++ b/services/stock/.env.docker @@ -1,4 +1,4 @@ DATABASE_URL=postgres://postgres:password@stock-postgres:5432/postgres -AMQP_URL=amqp://guest:guest@log-rabbitmq +AMQP_URL=amqp://guest:guest@event-broker PORT=50009 \ No newline at end of file diff --git a/services/stock/.env.example b/services/stock/.env.example index dbda1a0e..8c07f0e0 100644 --- a/services/stock/.env.example +++ b/services/stock/.env.example @@ -1,4 +1,4 @@ DATABASE_URL=postgres://postgres:password@localhost:5432/postgres -AMQP_URL=amqp://guest:guest@log-rabbitmq +AMQP_URL=amqp://guest:guest@event-broker PORT=50009 \ No newline at end of file From fe90e8b83b89f7ee4d0419cfd4c522a79d0af792 Mon Sep 17 00:00:00 2001 From: anatole Date: Sat, 26 Aug 2023 17:00:56 +0200 Subject: [PATCH 485/883] feat(product service): rename get product list --- services/product/src/handler/Product/index.ts | 4 ++-- services/product/src/handler/Product/list.ts | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/services/product/src/handler/Product/index.ts b/services/product/src/handler/Product/index.ts index 136ee915..b9e5c700 100644 --- a/services/product/src/handler/Product/index.ts +++ b/services/product/src/handler/Product/index.ts @@ -2,7 +2,7 @@ import { CreateProduct } from "./create"; import { ReadProduct } from "./read"; import { UpdateProduct } from "./update"; import { DeleteProduct } from "./delete"; -import { ListProduct } from "./list"; +import { getProductList } from "./list"; import { GetProductTypeList } from "./listType"; import { UploadImage } from "../Image/upload"; @@ -11,7 +11,7 @@ export default { ReadProduct, UpdateProduct, DeleteProduct, - ListProduct, + getProductList, GetProductTypeList, UploadImage, }; \ No newline at end of file diff --git a/services/product/src/handler/Product/list.ts b/services/product/src/handler/Product/list.ts index b1a498c4..8166cea2 100644 --- a/services/product/src/handler/Product/list.ts +++ b/services/product/src/handler/Product/list.ts @@ -4,7 +4,7 @@ import { log } from "@product/lib/log"; import prisma from "@product/lib/prisma"; import { ServerErrorResponse } from "@grpc/grpc-js"; -export const ListProduct = async ( +export const getProductList = async ( { request }: Data, callback: (err: ServerErrorResponse | any, response: ProductList | null) => void ) => { From 05dd3fb0a8c1e4ae9f8d1c94badf94b9e6776f83 Mon Sep 17 00:00:00 2001 From: anatole Date: Sat, 26 Aug 2023 17:06:39 +0200 Subject: [PATCH 486/883] feat(restaurant): rename rename handler --- services/restaurant/src/server.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/services/restaurant/src/server.ts b/services/restaurant/src/server.ts index 76257c6d..bb85a544 100644 --- a/services/restaurant/src/server.ts +++ b/services/restaurant/src/server.ts @@ -8,7 +8,7 @@ import { log, utils } from "@restaurant/lib/log"; import { options } from "@restaurant/resources/protoloader-options"; import { serverInsecure } from "@restaurant/resources/grpc-credentials"; -import promotionHandler from "@restaurant/handler"; +import restaurantHandler from "@restaurant/handler"; import { createServerProxy } from "@restaurant/lib/proxy"; import { logGRPC } from "@restaurant/middleware/log"; @@ -23,7 +23,7 @@ const { } = grpc.com.goodfood.restaurant; const server = createServerProxy(new Server()); -server.addService(rs, promotionHandler); +server.addService(rs, restaurantHandler); server.use(logGRPC); server.bindAsync(ADDRESS, serverInsecure, () => { From 64ddf2e47eebc12671d931311fa4dae34a2a02fe Mon Sep 17 00:00:00 2001 From: anatole Date: Sat, 26 Aug 2023 21:17:10 +0200 Subject: [PATCH 487/883] feat(order controller gateway): fix status enum --- services/gateway/src/controller/order/order.controller.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/services/gateway/src/controller/order/order.controller.ts b/services/gateway/src/controller/order/order.controller.ts index 8178e6ec..85d500a3 100644 --- a/services/gateway/src/controller/order/order.controller.ts +++ b/services/gateway/src/controller/order/order.controller.ts @@ -10,6 +10,7 @@ import { GetOrdersByStatusRequest, GetOrdersByUserRequest, Order, + Status, UpdateOrderRequest, UserMinimum, } from "@gateway/proto/order_pb"; @@ -165,7 +166,8 @@ orderRoutes.post("/api/order/by-status", withCheck({ role: "ACCOUNTANT" }), (req required: true, type: 'string' } */ - const orderInput = new GetOrdersByStatusRequest().setStatus(req.body.status); + const { status }: { status: keyof typeof Status } = req.body; + const orderInput = new GetOrdersByStatusRequest().setStatus(Status[status]); orderService.getOrdersByStatus(orderInput, (error, response) => { if (error) return res.status(500).send({ error }); @@ -253,7 +255,7 @@ orderRoutes.put("/api/order/:orderId", withCheck({ role: "ADMIN" }), (req: Reque orderRoutes.delete("/api/order/:orderId", withCheck({ role: "ADMIN" }), (req: Request, res: Response) => { /* #swagger.parameters['authorization'] = { - in: 'header', +) in: 'header', required: true, type: 'string' }*/ From d458e75b66df34d7ca66890bdcb6d5b6604a36d9 Mon Sep 17 00:00:00 2001 From: anatole Date: Sat, 26 Aug 2023 23:11:28 +0200 Subject: [PATCH 488/883] feat(restaurant service): fix the usage of a geolib method --- .../src/lib/swagger/swagger-output.json | 46 ++++++++----------- .../gateway/src/lib/swagger/swagger.utils.js | 9 ++++ .../src/handler/list-by-location.ts | 4 +- 3 files changed, 30 insertions(+), 29 deletions(-) diff --git a/services/gateway/src/lib/swagger/swagger-output.json b/services/gateway/src/lib/swagger/swagger-output.json index c4617ea3..83b5238d 100644 --- a/services/gateway/src/lib/swagger/swagger-output.json +++ b/services/gateway/src/lib/swagger/swagger-output.json @@ -1064,20 +1064,11 @@ "in": "path", "required": true, "type": "string" - }, - { - "name": "authorization", - "in": "header", - "required": true, - "type": "string" } ], "responses": { - "200": { - "description": "OK" - }, - "500": { - "description": "Internal Server Error" + "default": { + "description": "" } } } @@ -1611,8 +1602,7 @@ "example": 0 }, "type": { - "type": "string", - "example": "type" + "$ref": "#/definitions/ProductType" }, "name": { "type": "string", @@ -1646,34 +1636,26 @@ "type": "number", "example": 0 }, - "categories": { + "categoryIds": { "type": "array", "items": { "type": "object", "properties": { - "label": { + "id": { "type": "string", - "example": "category-label" - }, - "icon": { - "type": "string", - "example": "category-icon" - }, - "hexaColor": { - "type": "string", - "example": "#ffffff" + "example": "category:id" } } } }, - "allergens": { + "allergenIds": { "type": "array", "items": { "type": "object", "properties": { - "label": { + "id": { "type": "string", - "example": "allergen-label" + "example": "allergen:id" } } } @@ -3984,6 +3966,16 @@ "ACCOUNTANT", "DELIVERER" ] + }, + "ProductType": { + "type": "string", + "enum": [ + "ENTREES", + "PLATS", + "DESSERTS", + "BOISSONS", + "SNACKS" + ] } } } \ No newline at end of file diff --git a/services/gateway/src/lib/swagger/swagger.utils.js b/services/gateway/src/lib/swagger/swagger.utils.js index 86f756b5..48ab9eb1 100644 --- a/services/gateway/src/lib/swagger/swagger.utils.js +++ b/services/gateway/src/lib/swagger/swagger.utils.js @@ -34,6 +34,15 @@ const doc = { "ACCOUNTANT", "DELIVERER" ] + }, + ProductType: { + '@enum': [ + "ENTREES", + "PLATS", + "DESSERTS", + "BOISSONS", + "SNACKS" + ] } } }; diff --git a/services/restaurant/src/handler/list-by-location.ts b/services/restaurant/src/handler/list-by-location.ts index be687f4b..3b866c2b 100644 --- a/services/restaurant/src/handler/list-by-location.ts +++ b/services/restaurant/src/handler/list-by-location.ts @@ -6,7 +6,7 @@ import { Restaurant, RestaurantList, } from "@restaurant/types/restaurant"; -import geolib from "geolib"; +import { getDistance } from 'geolib'; interface RestaurantWithDistance extends Restaurant { distance: number; @@ -19,7 +19,7 @@ export const sortRestaurantsByDistance = ( return restaurants .map((restaurant) => ({ ...restaurant, - distance: geolib.getDistance(location, restaurant.location), + distance: getDistance(location, restaurant.location), })) .sort((a, b) => a.distance - b.distance); }; From ae53d3d52a5f33527828e1ab323b0f230e22dc7f Mon Sep 17 00:00:00 2001 From: anatole Date: Sat, 26 Aug 2023 23:18:08 +0200 Subject: [PATCH 489/883] feat(error): fix notification syntax error --- services/proto/notification.proto | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/services/proto/notification.proto b/services/proto/notification.proto index 2406bea9..0276bd88 100644 --- a/services/proto/notification.proto +++ b/services/proto/notification.proto @@ -4,8 +4,8 @@ import "google/protobuf/empty.proto"; package com.goodfood.notification; enum MessageType { - USER_REQUEST = 1; - OUTPUT = 2; + USER_REQUEST = 0; + OUTPUT = 1; } message MessageTypeInput { From 6ce2fb1fc80d8c12b3d50a7c03ee4ce5ef43357a Mon Sep 17 00:00:00 2001 From: anatole Date: Sun, 27 Aug 2023 01:16:50 +0200 Subject: [PATCH 490/883] feat(gateway): add the notification controller --- services/docker-compose.yml | 29 +++ services/gateway/.env.example | 1 + .../notification/notification.controller.ts | 134 ++++++++++++ .../src/lib/swagger/swagger-output.json | 204 +++++++++++++++++- .../gateway/src/lib/swagger/swagger.utils.js | 6 + services/gateway/src/server.ts | 8 +- .../services/clients/notification.client.ts | 8 + services/notification/.env.docker | 2 +- services/notification/.env.example | 2 +- 9 files changed, 380 insertions(+), 14 deletions(-) create mode 100644 services/gateway/src/controller/notification/notification.controller.ts create mode 100644 services/gateway/src/services/clients/notification.client.ts diff --git a/services/docker-compose.yml b/services/docker-compose.yml index f0951d12..0427bb7f 100644 --- a/services/docker-compose.yml +++ b/services/docker-compose.yml @@ -341,6 +341,34 @@ services: networks: - goodfood-network +# Notification service + + notification-service: + image: goodfood-notification:1.0.0 + build: + context: . + dockerfile: ./notification/Dockerfile + env_file: + - notification/.env.docker + ports: + - "50022" + networks: + - goodfood-network + + notification-postgres: + image: postgres:15.2 + environment: + POSTGRES_USER: postgres + POSTGRES_PASSWORD: password + POSTGRES_DB: notification + PGDATA: /var/lib/postgresql/data/pgdata + ports: + - "5432" + volumes: + - goodfood-notification-volume:/var/lib/postgresql/data + networks: + - goodfood-network + # RabbitMQ event-broker: @@ -366,6 +394,7 @@ volumes: goodfood-stock-volume: goodfood-reporting-volume: goodfood-log-volume: + goodfood-notification-volume: networks: goodfood-network: diff --git a/services/gateway/.env.example b/services/gateway/.env.example index ff1215ae..0f4b7a37 100644 --- a/services/gateway/.env.example +++ b/services/gateway/.env.example @@ -10,3 +10,4 @@ GATEWAY_DELIVERY_URL=delivery-service:50008 GATEWAY_STOCK_URL=stock-service:50009 GATEWAY_REPORTING_URL=reporting-service:50020 GATEWAY_LOG_URL=log-service:50021 +GATEWAY_NOTIFICATION_URL=notification-service:50022 diff --git a/services/gateway/src/controller/notification/notification.controller.ts b/services/gateway/src/controller/notification/notification.controller.ts new file mode 100644 index 00000000..30c1e6f0 --- /dev/null +++ b/services/gateway/src/controller/notification/notification.controller.ts @@ -0,0 +1,134 @@ +import { Router } from "express"; +import { notificationServiceClient } from "@gateway/services/clients/notification.client"; +import { + MessageType, + MessageTypeInput, + Notification, + NotificationCreateInput, + NotificationId, +} from "@gateway/proto/notification_pb"; +import { withCheck } from "@gateway/middleware/auth"; + +export const notificationRoutes = Router(); + +notificationRoutes.post("/api/notification/by-message-type", (req, res) => { + /* #swagger.parameters['body'] = { + in: 'body', + required: true, + schema: { + messageType: {'$ref': "#/definitions/MessageType"} + } + } */ + + const { messageType }: { messageType: keyof typeof MessageType } = req.body; + + notificationServiceClient.getNotifications( + new MessageTypeInput().setMessageType(MessageType[messageType]), + (error, response) => { + if (error) return res.status(500).send({ error }); + else return res.status(200).json(response.toObject()); + }, + ); +}); + +notificationRoutes.get("/api/notification/:id", (req, res) => { + /* #swagger.parameters['id'] = { + in: 'path', + required: true, + type: 'string' + } */ + + const { id } = req.params; + + notificationServiceClient.getNotification(new NotificationId().setId(id), (error, response) => { + if (error) return res.status(500).send({ error }); + else return res.status(200).json(response.toObject()); + }); +}); + +notificationRoutes.post("/api/notification", withCheck({ role: ["ADMIN"] }), (req, res) => { + /* #swagger.parameters['body'] = { + in: 'body', + required: true, + schema: { + title: "notification-title", + message: "notification-message", + messageType: {'$ref': "#/definitions/MessageType"} + } + } + #swagger.parameters['authorization'] = { + in: 'header', + required: true, + type: 'string' + } + #swagger.parameters['authorization'] = { + in: 'header', + required: true, + type: 'string' + } */ + + const { title, message, messageType }: { title: string; message: string; messageType: keyof typeof MessageType } = + req.body; + const notificationCreateInput = new NotificationCreateInput() + .setTitle(title) + .setMessage(message) + .setMessageType(MessageType[messageType]); + notificationServiceClient.createNotification(notificationCreateInput, (error, response) => { + if (error) return res.status(500).send({ error }); + else return res.status(200).json(response.toObject()); + }); +}); + +notificationRoutes.put("/api/notification/:id", withCheck({ role: ["ADMIN"] }), (req, res) => { + /* #swagger.parameters['body'] = { + in: 'body', + required: true, + schema: { + title: "notification-title", + message: "notification-message", + messageType: {'$ref': "#/definitions/MessageType"} + } + } + #swagger.parameters['authorization'] = { + in: 'header', + required: true, + type: 'string' + } + #swagger.parameters['id'] = { + in: 'path', + required: true, + type: 'string' + } */ + + const { id } = req.params; + const { title, message, messageType }: { title: string; message: string; messageType: keyof typeof MessageType } = + req.body; + const notificationCreateInput = new Notification() + .setId(id) + .setTitle(title) + .setMessage(message) + .setMessageType(MessageType[messageType]); + notificationServiceClient.updateNotification(notificationCreateInput, (error, response) => { + if (error) return res.status(500).send({ error }); + else return res.status(200).json(response.toObject()); + }); +}); + +notificationRoutes.delete("/api/notification/:id", withCheck({ role: ["ADMIN"] }), (req, res) => { + /* #swagger.parameters['authorization'] = { + in: 'header', + required: true, + type: 'string' + } + #swagger.parameters['id'] = { + in: 'path', + required: true, + type: 'string' + } */ + + const { id } = req.params; + notificationServiceClient.deleteNotification(new NotificationId().setId(id), (error, response) => { + if (error) return res.status(500).send({ error }); + else return res.status(200).json(response.toObject()); + }); +}); diff --git a/services/gateway/src/lib/swagger/swagger-output.json b/services/gateway/src/lib/swagger/swagger-output.json index 83b5238d..b14c2f1d 100644 --- a/services/gateway/src/lib/swagger/swagger-output.json +++ b/services/gateway/src/lib/swagger/swagger-output.json @@ -1076,7 +1076,7 @@ "/api/category": { "get": { "tags": [ - "Category" + "Order" ], "description": "", "responses": { @@ -1090,7 +1090,7 @@ }, "post": { "tags": [ - "Category" + "Order" ], "description": "", "parameters": [ @@ -1136,7 +1136,7 @@ "/api/category/{id}": { "get": { "tags": [ - "Category" + "Order" ], "description": "", "parameters": [ @@ -1158,7 +1158,7 @@ }, "put": { "tags": [ - "Category" + "Order" ], "description": "", "parameters": [ @@ -1208,7 +1208,7 @@ }, "delete": { "tags": [ - "Category" + "Order" ], "description": "", "parameters": [ @@ -1238,7 +1238,7 @@ "/api/allergen": { "get": { "tags": [ - "Allergen" + "Order" ], "description": "", "responses": { @@ -1252,7 +1252,7 @@ }, "post": { "tags": [ - "Allergen" + "Order" ], "description": "", "parameters": [ @@ -1290,7 +1290,7 @@ "/api/allergen/{id}": { "get": { "tags": [ - "Allergen" + "Order" ], "description": "", "parameters": [ @@ -1312,7 +1312,7 @@ }, "put": { "tags": [ - "Allergen" + "Order" ], "description": "", "parameters": [ @@ -1354,7 +1354,7 @@ }, "delete": { "tags": [ - "Allergen" + "Order" ], "description": "", "parameters": [ @@ -3932,6 +3932,183 @@ } } } + }, + "/api/notification/by-message-type": { + "post": { + "tags": [ + "Notification" + ], + "description": "", + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "type": "object", + "properties": { + "messageType": { + "$ref": "#/definitions/MessageType" + } + } + } + } + ], + "responses": { + "200": { + "description": "OK" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/notification/{id}": { + "get": { + "tags": [ + "Notification" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + }, + "500": { + "description": "Internal Server Error" + } + } + }, + "put": { + "tags": [ + "Notification" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "type": "object", + "properties": { + "title": { + "type": "string", + "example": "notification-title" + }, + "message": { + "type": "string", + "example": "notification-message" + }, + "messageType": { + "$ref": "#/definitions/MessageType" + } + } + } + }, + { + "name": "authorization", + "in": "header", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + }, + "500": { + "description": "Internal Server Error" + } + } + }, + "delete": { + "tags": [ + "Notification" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "authorization", + "in": "header", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/notification": { + "post": { + "tags": [ + "Notification" + ], + "description": "", + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "type": "object", + "properties": { + "title": { + "type": "string", + "example": "notification-title" + }, + "message": { + "type": "string", + "example": "notification-message" + }, + "messageType": { + "$ref": "#/definitions/MessageType" + } + } + } + }, + { + "name": "authorization", + "in": "header", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + }, + "500": { + "description": "Internal Server Error" + } + } + } } }, "definitions": { @@ -3976,6 +4153,13 @@ "BOISSONS", "SNACKS" ] + }, + "MessageType": { + "type": "string", + "enum": [ + "USER_REQUEST", + "OUTPUT" + ] } } } \ No newline at end of file diff --git a/services/gateway/src/lib/swagger/swagger.utils.js b/services/gateway/src/lib/swagger/swagger.utils.js index 48ab9eb1..8f43b132 100644 --- a/services/gateway/src/lib/swagger/swagger.utils.js +++ b/services/gateway/src/lib/swagger/swagger.utils.js @@ -43,6 +43,12 @@ const doc = { "BOISSONS", "SNACKS" ] + }, + MessageType:{ + '@enum': [ + "USER_REQUEST", + "OUTPUT" + ] } } }; diff --git a/services/gateway/src/server.ts b/services/gateway/src/server.ts index b68674c1..609f1936 100644 --- a/services/gateway/src/server.ts +++ b/services/gateway/src/server.ts @@ -16,6 +16,7 @@ import {stripeRoutes} from "@gateway/controller/payment/stripe.controller"; import {restaurantRoutes} from "@gateway/controller/restaurant/restaurant.controller"; import {paymentRoutes} from "@gateway/controller/payment/payment.controller"; import {mainAddressRoutes} from "@gateway/controller/user/mainAddress.controller"; +import {notificationRoutes} from "@gateway/controller/notification/notification.controller"; import bodyParser from "body-parser"; import express from "express"; @@ -43,10 +44,10 @@ app.use('/', orderRoutes // #swagger.tags = ['Order'] ); app.use('/', categoryRoutes -// #swagger.tags = ['Category'] +// #swagger.tags = ['Order'] ); app.use('/', allergenRoutes -// #swagger.tags = ['Allergen'] +// #swagger.tags = ['Order'] ); app.use('/', productRoutes // #swagger.tags = ['Product'] @@ -75,6 +76,9 @@ app.use('/', stockRoutes app.use('/', stockPersonRoutes // #swagger.tags = ['Stock'] ); +app.use('/', notificationRoutes +// #swagger.tags = ['Notification'] +); app.listen(PORT, () => { const message = `---- ${utils.green("good")}${utils.yellow( diff --git a/services/gateway/src/services/clients/notification.client.ts b/services/gateway/src/services/clients/notification.client.ts new file mode 100644 index 00000000..eadc2cec --- /dev/null +++ b/services/gateway/src/services/clients/notification.client.ts @@ -0,0 +1,8 @@ +import services from '../../proto/notification_grpc_pb'; +import * as grpc from '@grpc/grpc-js'; + +const url = process.env.GATEWAY_NOTIFICATION_URL || "localhost:50022"; + +export const notificationServiceClient = new services.NotificationServiceClient( + url, + grpc.credentials.createInsecure()); \ No newline at end of file diff --git a/services/notification/.env.docker b/services/notification/.env.docker index da5dea14..0c0911c7 100644 --- a/services/notification/.env.docker +++ b/services/notification/.env.docker @@ -1,4 +1,4 @@ -DATABASE_URL=postgresql://postgres:postgres@localhost:5432/notification +DATABASE_URL=postgres://postgres:password@notification-postgres:5432/notification AMQP_URL=amqp://guest:guest@event-broker PLUNK_PUBLIC_KEY="exemple" PLUNK_PROJECT_NAME=goodfood diff --git a/services/notification/.env.example b/services/notification/.env.example index 3003a6c9..1f55e8b1 100644 --- a/services/notification/.env.example +++ b/services/notification/.env.example @@ -1,4 +1,4 @@ -DATABASE_URL=postgresql://postgres:postgres@localhost:5432/notifications +DATABASE_URL=postgres://postgres:password@localhost:5432/notification AMQP_URL=amqp://guest:guest@localhost PLUNK_PUBLIC_KEY="exemple" PLUNK_PROJECT_NAME=goodfood From 2384d6b6d8a841ad5750b59fd6c6326e944cec63 Mon Sep 17 00:00:00 2001 From: anatole Date: Sun, 27 Aug 2023 01:19:13 +0200 Subject: [PATCH 491/883] feat(gateway): run format script --- .../promotion/promotion.controller.ts | 2 +- .../src/controller/stock/stock.controller.ts | 664 +++++++++--------- .../stock/stockPerson.controller.ts | 35 +- .../controller/user/mainAddress.controller.ts | 66 +- .../src/controller/user/user.controller.ts | 65 +- services/gateway/src/lib/log/log.ts | 76 +- services/gateway/src/server.ts | 192 ++--- .../gateway/src/services/basket.service.ts | 28 +- .../src/services/clients/basket.client.ts | 8 +- .../src/services/clients/delivery.client.ts | 13 +- .../src/services/clients/log.client.ts | 8 +- .../src/services/clients/metric.client.ts | 8 +- .../services/clients/notification.client.ts | 8 +- .../src/services/clients/order.client.ts | 8 +- .../src/services/clients/payment.client.ts | 12 +- .../src/services/clients/product.client.ts | 16 +- .../src/services/clients/promotion.client.ts | 8 +- .../src/services/clients/restaurant.client.ts | 8 +- .../src/services/clients/stock.client.ts | 13 +- .../src/services/clients/user.client.ts | 12 +- services/gateway/src/services/user.service.ts | 38 +- 21 files changed, 655 insertions(+), 633 deletions(-) diff --git a/services/gateway/src/controller/promotion/promotion.controller.ts b/services/gateway/src/controller/promotion/promotion.controller.ts index 8843bfa8..8b776db7 100644 --- a/services/gateway/src/controller/promotion/promotion.controller.ts +++ b/services/gateway/src/controller/promotion/promotion.controller.ts @@ -155,7 +155,7 @@ promotionRoutes.delete("/api/promotion/:id", withCheck({ role: "ACCOUNTANT" }), required: true, type: 'string' } */ - const {id} = req.params; + const { id } = req.params; promotionServiceClient.deletePromotion(new PromotionId().setId(id), (error, response) => { if (error) return res.status(500).send({ error }); diff --git a/services/gateway/src/controller/stock/stock.controller.ts b/services/gateway/src/controller/stock/stock.controller.ts index 574cadb9..1e339777 100644 --- a/services/gateway/src/controller/stock/stock.controller.ts +++ b/services/gateway/src/controller/stock/stock.controller.ts @@ -1,96 +1,93 @@ -import {Request, Response, Router} from 'express'; -import {stockServiceClient} from '../../services/clients/stock.client'; +import { Request, Response, Router } from "express"; +import { stockServiceClient } from "../../services/clients/stock.client"; import { - CreateIngredientRequest, - CreateIngredientRestaurantRequest, - CreateSupplierRequest, - CreateSupplyOrderRequest, - DeleteIngredientRequest, - DeleteIngredientRestaurantRequest, - DeleteSupplierRequest, - DeleteSupplyOrderRequest, - GetIngredientRequest, - GetIngredientRestaurantRequest, - GetIngredientRestaurantsByProductRequest, - GetIngredientRestaurantsByRestaurantRequest, - GetSupplierRequest, - GetSupplyOrderRequest, - GetSupplyOrdersByIngredientRestaurantRequest, - GetSupplyOrdersByRestaurantRequest, - GetSupplyOrdersBySupplierRequest, - UpdateIngredientRequest, - UpdateIngredientRestaurantRequest, - UpdateSupplierRequest, - UpdateSupplyOrderRequest + CreateIngredientRequest, + CreateIngredientRestaurantRequest, + CreateSupplierRequest, + CreateSupplyOrderRequest, + DeleteIngredientRequest, + DeleteIngredientRestaurantRequest, + DeleteSupplierRequest, + DeleteSupplyOrderRequest, + GetIngredientRequest, + GetIngredientRestaurantRequest, + GetIngredientRestaurantsByProductRequest, + GetIngredientRestaurantsByRestaurantRequest, + GetSupplierRequest, + GetSupplyOrderRequest, + GetSupplyOrdersByIngredientRestaurantRequest, + GetSupplyOrdersByRestaurantRequest, + GetSupplyOrdersBySupplierRequest, + UpdateIngredientRequest, + UpdateIngredientRestaurantRequest, + UpdateSupplierRequest, + UpdateSupplyOrderRequest, } from "@gateway/proto/stock_pb"; -import {Empty} from "google-protobuf/google/protobuf/empty_pb"; - +import { Empty } from "google-protobuf/google/protobuf/empty_pb"; export const stockRoutes = Router(); /** * Ingredient Routes */ -stockRoutes.get('/api/stock/supplier/:id', (req: Request, res: Response) => { - /* #swagger.parameters['id'] = { +stockRoutes.get("/api/stock/supplier/:id", (req: Request, res: Response) => { + /* #swagger.parameters['id'] = { in: 'path', required: true, type: 'integer' }*/ - const {id} = req.params; - const supplierRequest = new GetSupplierRequest().setId(Number(id)); - - stockServiceClient.getSupplier(supplierRequest, (error, response) => { - if (error) { - res.status(500).send({error: error.message}); - } else { - res.json(response.toObject()); - } - }); + const { id } = req.params; + const supplierRequest = new GetSupplierRequest().setId(Number(id)); + + stockServiceClient.getSupplier(supplierRequest, (error, response) => { + if (error) { + res.status(500).send({ error: error.message }); + } else { + res.json(response.toObject()); + } + }); }); -stockRoutes.get('/api/stock/supplier', (req: Request, res: Response) => { - - stockServiceClient.getSuppliers(new Empty(), (error, response) => { - if (error) { - res.status(500).send({error: error.message}); - } else { - res.json(response.toObject()); - } - }); +stockRoutes.get("/api/stock/supplier", (req: Request, res: Response) => { + stockServiceClient.getSuppliers(new Empty(), (error, response) => { + if (error) { + res.status(500).send({ error: error.message }); + } else { + res.json(response.toObject()); + } + }); }); -stockRoutes.get('/api/stock/ingredient/:id', (req: Request, res: Response) => { - /* #swagger.parameters['id'] = { +stockRoutes.get("/api/stock/ingredient/:id", (req: Request, res: Response) => { + /* #swagger.parameters['id'] = { in: 'path', required: true, type: 'integer' }*/ - const {id} = req.params; - const ingredientRequest = new GetIngredientRequest().setId(Number(id)); - - stockServiceClient.getIngredient(ingredientRequest, (error, response) => { - if (error) { - res.status(500).send({error: error.message}); - } else { - res.json(response.toObject()); - } - }); + const { id } = req.params; + const ingredientRequest = new GetIngredientRequest().setId(Number(id)); + + stockServiceClient.getIngredient(ingredientRequest, (error, response) => { + if (error) { + res.status(500).send({ error: error.message }); + } else { + res.json(response.toObject()); + } + }); }); -stockRoutes.get('/api/stock/ingredient', (req: Request, res: Response) => { - - stockServiceClient.getIngredients(new Empty(), (error, response) => { - if (error) { - res.status(500).send({error: error.message}); - } else { - res.json(response.toObject()); - } - }); +stockRoutes.get("/api/stock/ingredient", (req: Request, res: Response) => { + stockServiceClient.getIngredients(new Empty(), (error, response) => { + if (error) { + res.status(500).send({ error: error.message }); + } else { + res.json(response.toObject()); + } + }); }); -stockRoutes.post('/api/stock/ingredient', (req: Request, res: Response) => { - /* #swagger.parameters['body'] = { +stockRoutes.post("/api/stock/ingredient", (req: Request, res: Response) => { + /* #swagger.parameters['body'] = { in: 'body', required: true, schema: { @@ -98,20 +95,20 @@ stockRoutes.post('/api/stock/ingredient', (req: Request, res: Response) => { description: "ingredient-desc", } } */ - const {name, desciption} = req.body - const ingredientRequest = new CreateIngredientRequest().setName(name).setDescription(desciption) - - stockServiceClient.createIngredient(ingredientRequest, (error, response) => { - if (error) { - res.status(500).send({error: error.message}); - } else { - res.json(response.toObject()); - } - }); + const { name, desciption } = req.body; + const ingredientRequest = new CreateIngredientRequest().setName(name).setDescription(desciption); + + stockServiceClient.createIngredient(ingredientRequest, (error, response) => { + if (error) { + res.status(500).send({ error: error.message }); + } else { + res.json(response.toObject()); + } + }); }); -stockRoutes.put('/api/stock/ingredient/:id', (req: Request, res: Response) => { - /* #swagger.parameters['id'] = { +stockRoutes.put("/api/stock/ingredient/:id", (req: Request, res: Response) => { + /* #swagger.parameters['id'] = { in: 'path', required: true, type: 'integer' @@ -124,87 +121,92 @@ stockRoutes.put('/api/stock/ingredient/:id', (req: Request, res: Response) => { description: "ingredient-desc", } } */ - const {id} = req.params - const {name, desciption} = req.body - const ingredientRequest = new UpdateIngredientRequest().setId(Number(id)).setName(name).setDescription(desciption) - - stockServiceClient.updateIngredient(ingredientRequest, (error, response) => { - if (error) { - res.status(500).send({error: error.message}); - } else { - res.json(response.toObject()); - } - }); + const { id } = req.params; + const { name, desciption } = req.body; + const ingredientRequest = new UpdateIngredientRequest().setId(Number(id)).setName(name).setDescription(desciption); + + stockServiceClient.updateIngredient(ingredientRequest, (error, response) => { + if (error) { + res.status(500).send({ error: error.message }); + } else { + res.json(response.toObject()); + } + }); }); -stockRoutes.delete('/api/stock/ingredient/:id', (req: Request, res: Response) => { - /* #swagger.parameters['id'] = { +stockRoutes.delete("/api/stock/ingredient/:id", (req: Request, res: Response) => { + /* #swagger.parameters['id'] = { in: 'path', required: true, type: 'integer' }*/ - const {id} = req.params - const ingredientRequest = new DeleteIngredientRequest().setId(Number(id)); - - stockServiceClient.deleteIngredient(ingredientRequest, (error, response) => { - if (error) { - res.status(500).send({error: error.message}); - } else { - res.json(response.toObject()); - } - }); + const { id } = req.params; + const ingredientRequest = new DeleteIngredientRequest().setId(Number(id)); + + stockServiceClient.deleteIngredient(ingredientRequest, (error, response) => { + if (error) { + res.status(500).send({ error: error.message }); + } else { + res.json(response.toObject()); + } + }); }); /** * Ingredient Restaurant Routes */ -stockRoutes.get('/api/stock/ingredient/restaurant/:id', (req: Request, res: Response) => { - /* #swagger.parameters['id'] = { +stockRoutes.get("/api/stock/ingredient/restaurant/:id", (req: Request, res: Response) => { + /* #swagger.parameters['id'] = { in: 'path', required: true, type: 'integer' }*/ - const {id} = req.params; - const ingredientRestaurantRequest = new GetIngredientRestaurantRequest().setId(Number(id)); - - stockServiceClient.getIngredientRestaurant(ingredientRestaurantRequest, (error, response) => { - if (error) { - res.status(500).send({error: error.message}); - } else { - res.json(response.toObject()); - } - }); + const { id } = req.params; + const ingredientRestaurantRequest = new GetIngredientRestaurantRequest().setId(Number(id)); + + stockServiceClient.getIngredientRestaurant(ingredientRestaurantRequest, (error, response) => { + if (error) { + res.status(500).send({ error: error.message }); + } else { + res.json(response.toObject()); + } + }); }); -stockRoutes.get('/api/stock/ingredient/restaurant/by-restaurant/:id', (req: Request, res: Response) => { - const {id} = req.params; - const ingredientRestaurantsByRestaurantRequest = new GetIngredientRestaurantsByRestaurantRequest().setRestaurantId(id); - - stockServiceClient.getIngredientRestaurantsByRestaurant(ingredientRestaurantsByRestaurantRequest, (error, response) => { - if (error) { - res.status(500).send({error: error.message}); - } else { - res.json(response.toObject()); - } - }); +stockRoutes.get("/api/stock/ingredient/restaurant/by-restaurant/:id", (req: Request, res: Response) => { + const { id } = req.params; + const ingredientRestaurantsByRestaurantRequest = new GetIngredientRestaurantsByRestaurantRequest().setRestaurantId( + id, + ); + + stockServiceClient.getIngredientRestaurantsByRestaurant( + ingredientRestaurantsByRestaurantRequest, + (error, response) => { + if (error) { + res.status(500).send({ error: error.message }); + } else { + res.json(response.toObject()); + } + }, + ); }); -stockRoutes.get('/api/stock/ingredient/restaurant/by-product/:id', (req: Request, res: Response) => { - const {id} = req.params; - const ingredientRestaurantsByProductRequest = new GetIngredientRestaurantsByProductRequest().setProductId(id); - - stockServiceClient.getIngredientRestaurantsByProduct(ingredientRestaurantsByProductRequest, (error, response) => { - if (error) { - res.status(500).send({error: error.message}); - } else { - res.json(response.toObject()); - } - }); +stockRoutes.get("/api/stock/ingredient/restaurant/by-product/:id", (req: Request, res: Response) => { + const { id } = req.params; + const ingredientRestaurantsByProductRequest = new GetIngredientRestaurantsByProductRequest().setProductId(id); + + stockServiceClient.getIngredientRestaurantsByProduct(ingredientRestaurantsByProductRequest, (error, response) => { + if (error) { + res.status(500).send({ error: error.message }); + } else { + res.json(response.toObject()); + } + }); }); -stockRoutes.post('/api/stock/ingredient/restaurant', (req: Request, res: Response) => { - /* #swagger.parameters['body'] = { +stockRoutes.post("/api/stock/ingredient/restaurant", (req: Request, res: Response) => { + /* #swagger.parameters['body'] = { in: 'body', required: true, schema: { @@ -217,27 +219,27 @@ stockRoutes.post('/api/stock/ingredient/restaurant', (req: Request, res: Respons ingredientId: 1, } } */ - const {alertThreshold, quantity, productList, unitPrice, pricePerKilo, restaurantId, ingredientId} = req.body; - const ingredientRestaurant = new CreateIngredientRestaurantRequest().setAlertThreshold(alertThreshold) - .setQuantity(quantity) - .setInProductListList(productList) - .setUnitPrice(unitPrice) - .setPricePerKilo(pricePerKilo) - .setRestaurantId(restaurantId) - .setIngredientId(ingredientId) - - - stockServiceClient.createIngredientRestaurant(ingredientRestaurant, (error, response) => { - if (error) { - res.status(500).send({error: error.message}); - } else { - res.json(response.toObject()); - } - }); + const { alertThreshold, quantity, productList, unitPrice, pricePerKilo, restaurantId, ingredientId } = req.body; + const ingredientRestaurant = new CreateIngredientRestaurantRequest() + .setAlertThreshold(alertThreshold) + .setQuantity(quantity) + .setInProductListList(productList) + .setUnitPrice(unitPrice) + .setPricePerKilo(pricePerKilo) + .setRestaurantId(restaurantId) + .setIngredientId(ingredientId); + + stockServiceClient.createIngredientRestaurant(ingredientRestaurant, (error, response) => { + if (error) { + res.status(500).send({ error: error.message }); + } else { + res.json(response.toObject()); + } + }); }); -stockRoutes.put('/api/stock/ingredient/restaurant/:id', (req: Request, res: Response) => { - /* #swagger.parameters['id'] = { +stockRoutes.put("/api/stock/ingredient/restaurant/:id", (req: Request, res: Response) => { + /* #swagger.parameters['id'] = { in: 'path', required: true, type: 'integer' @@ -255,76 +257,80 @@ stockRoutes.put('/api/stock/ingredient/restaurant/:id', (req: Request, res: Resp ingredientId: 1, } } */ - const {id} = req.params; - const {alertThreshold, quantity, productList, unitPrice, pricePerKilo, restaurantId, ingredientId} = req.body; - const ingredientRestaurant = new UpdateIngredientRestaurantRequest().setId(Number(id)).setAlertThreshold(alertThreshold) - .setQuantity(quantity) - .setInProductListList(productList) - .setUnitPrice(unitPrice) - .setPricePerKilo(pricePerKilo) - .setRestaurantId(restaurantId) - .setIngredientId(ingredientId) - - - stockServiceClient.updateIngredientRestaurant(ingredientRestaurant, (error, response) => { - if (error) { - res.status(500).send({error: error.message}); - } else { - res.json(response.toObject()); - } - }); + const { id } = req.params; + const { alertThreshold, quantity, productList, unitPrice, pricePerKilo, restaurantId, ingredientId } = req.body; + const ingredientRestaurant = new UpdateIngredientRestaurantRequest() + .setId(Number(id)) + .setAlertThreshold(alertThreshold) + .setQuantity(quantity) + .setInProductListList(productList) + .setUnitPrice(unitPrice) + .setPricePerKilo(pricePerKilo) + .setRestaurantId(restaurantId) + .setIngredientId(ingredientId); + + stockServiceClient.updateIngredientRestaurant(ingredientRestaurant, (error, response) => { + if (error) { + res.status(500).send({ error: error.message }); + } else { + res.json(response.toObject()); + } + }); }); -stockRoutes.delete('/api/stock/ingredient/restaurant/:id', (req: Request, res: Response) => { - /* #swagger.parameters['id'] = { +stockRoutes.delete("/api/stock/ingredient/restaurant/:id", (req: Request, res: Response) => { + /* #swagger.parameters['id'] = { in: 'path', required: true, type: 'integer' }*/ - const {id} = req.params; - - stockServiceClient.deleteIngredientRestaurant(new DeleteIngredientRestaurantRequest().setId(Number(id)), (error, response) => { - if (error) { - res.status(500).send({error: error.message}); - } else { - res.json(response.toObject()); - } - }); + const { id } = req.params; + + stockServiceClient.deleteIngredientRestaurant( + new DeleteIngredientRestaurantRequest().setId(Number(id)), + (error, response) => { + if (error) { + res.status(500).send({ error: error.message }); + } else { + res.json(response.toObject()); + } + }, + ); }); /** * Supplier Routes */ -stockRoutes.get('/api/stock/supplier/:id', (req: Request, res: Response) => { - /* #swagger.parameters['id'] = { +stockRoutes.get("/api/stock/supplier/:id", (req: Request, res: Response) => { + /* #swagger.parameters['id'] = { in: 'path', required: true, type: 'integer' }*/ - const {id} = req.params; - - stockServiceClient.getSupplier(new GetSupplierRequest().setId(Number(id)), (error, response) => { - if (error) { - res.status(500).send({error: error.message}); - } else { - res.json(response.toObject()); - } - }); + const { id } = req.params; + + stockServiceClient.getSupplier(new GetSupplierRequest().setId(Number(id)), (error, response) => { + if (error) { + res.status(500).send({ error: error.message }); + } else { + res.json(response.toObject()); + } + }); }); -stockRoutes.get('/api/stock/supplier', (req: Request, res: Response) => { - stockServiceClient.getSuppliers(new Empty(), (error, response) => { - if (error) { - res.status(500).send({error: error.message}); - } else { - res.json(response.toObject()); - } - }); +stockRoutes.get("/api/stock/supplier", (req: Request, res: Response) => { + stockServiceClient.getSuppliers(new Empty(), (error, response) => { + if (error) { + res.status(500).send({ error: error.message }); + } else { + res.json(response.toObject()); + } + }); }); -stockRoutes.post('/api/stock/supplier', (req: Request, res: Response) => { - /* #swagger.parameters['body'] = { +stockRoutes.post("/api/stock/supplier", (req: Request, res: Response) => { + /* #swagger.parameters['body'] = { in: 'body', required: true, schema: { @@ -332,20 +338,20 @@ stockRoutes.post('/api/stock/supplier', (req: Request, res: Response) => { contact: "supplier-contact" } } */ - const {name, contact} = req.body; - const supplierRequest = new CreateSupplierRequest().setName(name).setContact(contact) - - stockServiceClient.createSupplier(supplierRequest, (error, response) => { - if (error) { - res.status(500).send({error: error.message}); - } else { - res.json(response.toObject()); - } - }); + const { name, contact } = req.body; + const supplierRequest = new CreateSupplierRequest().setName(name).setContact(contact); + + stockServiceClient.createSupplier(supplierRequest, (error, response) => { + if (error) { + res.status(500).send({ error: error.message }); + } else { + res.json(response.toObject()); + } + }); }); -stockRoutes.put('/api/stock/supplier/:id', (req: Request, res: Response) => { - /* #swagger.parameters['id'] = { +stockRoutes.put("/api/stock/supplier/:id", (req: Request, res: Response) => { + /* #swagger.parameters['id'] = { in: 'path', required: true, type: 'integer' @@ -358,102 +364,111 @@ stockRoutes.put('/api/stock/supplier/:id', (req: Request, res: Response) => { contact: "supplier-contact" } } */ - const {id} = req.params; - const {name, contact} = req.body; - const supplierRequest = new UpdateSupplierRequest().setId(Number(id)).setName(name).setContact(contact) - - stockServiceClient.updateSupplier(supplierRequest, (error, response) => { - if (error) { - res.status(500).send({error: error.message}); - } else { - res.json(response.toObject()); - } - }); + const { id } = req.params; + const { name, contact } = req.body; + const supplierRequest = new UpdateSupplierRequest().setId(Number(id)).setName(name).setContact(contact); + + stockServiceClient.updateSupplier(supplierRequest, (error, response) => { + if (error) { + res.status(500).send({ error: error.message }); + } else { + res.json(response.toObject()); + } + }); }); -stockRoutes.delete('/api/stock/supplier/:id', (req: Request, res: Response) => { - /* #swagger.parameters['id'] = { +stockRoutes.delete("/api/stock/supplier/:id", (req: Request, res: Response) => { + /* #swagger.parameters['id'] = { in: 'path', required: true, type: 'integer' }*/ - const {id} = req.params; - - stockServiceClient.deleteSupplier(new DeleteSupplierRequest().setId(Number(id)), (error, response) => { - if (error) { - res.status(500).send({error: error.message}); - } else { - res.json(response.toObject()); - } - }); + const { id } = req.params; + + stockServiceClient.deleteSupplier(new DeleteSupplierRequest().setId(Number(id)), (error, response) => { + if (error) { + res.status(500).send({ error: error.message }); + } else { + res.json(response.toObject()); + } + }); }); /** * Supply Order Routes */ -stockRoutes.get('/api/stock/supply/order/:id', (req: Request, res: Response) => { - /* #swagger.parameters['id'] = { +stockRoutes.get("/api/stock/supply/order/:id", (req: Request, res: Response) => { + /* #swagger.parameters['id'] = { in: 'path', required: true, type: 'integer' }*/ - const {id} = req.params; - - stockServiceClient.getSupplyOrder(new GetSupplyOrderRequest().setId(Number(id)), (error, response) => { - if (error) { - res.status(500).send({error: error.message}); - } else { - res.json(response.toObject()); - } - }); + const { id } = req.params; + + stockServiceClient.getSupplyOrder(new GetSupplyOrderRequest().setId(Number(id)), (error, response) => { + if (error) { + res.status(500).send({ error: error.message }); + } else { + res.json(response.toObject()); + } + }); }); -stockRoutes.get('/api/stock/supply/order/by-restaurant/:id', (req: Request, res: Response) => { - const {id} = req.params; - stockServiceClient.getSupplyOrdersByRestaurant(new GetSupplyOrdersByRestaurantRequest().setRestaurantId(id), (error, response) => { - if (error) { - res.status(500).send({error: error.message}); - } else { - res.json(response.toObject()); - } - }); +stockRoutes.get("/api/stock/supply/order/by-restaurant/:id", (req: Request, res: Response) => { + const { id } = req.params; + stockServiceClient.getSupplyOrdersByRestaurant( + new GetSupplyOrdersByRestaurantRequest().setRestaurantId(id), + (error, response) => { + if (error) { + res.status(500).send({ error: error.message }); + } else { + res.json(response.toObject()); + } + }, + ); }); -stockRoutes.get('/api/stock/supply/order/by-supplier/:id', (req: Request, res: Response) => { - /* #swagger.parameters['id'] = { +stockRoutes.get("/api/stock/supply/order/by-supplier/:id", (req: Request, res: Response) => { + /* #swagger.parameters['id'] = { in: 'path', required: true, type: 'integer' }*/ - const {id} = req.params; - stockServiceClient.getSupplyOrdersBySupplier(new GetSupplyOrdersBySupplierRequest().setSupplierId(Number(id)), (error, response) => { - if (error) { - res.status(500).send({error: error.message}); - } else { - res.json(response.toObject()); - } - }); + const { id } = req.params; + stockServiceClient.getSupplyOrdersBySupplier( + new GetSupplyOrdersBySupplierRequest().setSupplierId(Number(id)), + (error, response) => { + if (error) { + res.status(500).send({ error: error.message }); + } else { + res.json(response.toObject()); + } + }, + ); }); -stockRoutes.get('/api/stock/supply/order/by-ingredient-restaurant/:id', (req: Request, res: Response) => { - /* #swagger.parameters['id'] = { +stockRoutes.get("/api/stock/supply/order/by-ingredient-restaurant/:id", (req: Request, res: Response) => { + /* #swagger.parameters['id'] = { in: 'path', required: true, type: 'integer' }*/ - const {id} = req.params; - stockServiceClient.getSupplyOrdersByIngredientRestaurant(new GetSupplyOrdersByIngredientRestaurantRequest().setIngredientRestaurantId(Number(id)), (error, response) => { - if (error) { - res.status(500).send({error: error.message}); - } else { - res.json(response.toObject()); - } - }); + const { id } = req.params; + stockServiceClient.getSupplyOrdersByIngredientRestaurant( + new GetSupplyOrdersByIngredientRestaurantRequest().setIngredientRestaurantId(Number(id)), + (error, response) => { + if (error) { + res.status(500).send({ error: error.message }); + } else { + res.json(response.toObject()); + } + }, + ); }); -stockRoutes.post('/api/stock/supply/order', (req: Request, res: Response) => { - /* #swagger.parameters['body'] = { +stockRoutes.post("/api/stock/supply/order", (req: Request, res: Response) => { + /* #swagger.parameters['body'] = { in: 'body', required: true, schema: { @@ -462,22 +477,23 @@ stockRoutes.post('/api/stock/supply/order', (req: Request, res: Response) => { supplierId: 1 } } */ - const {quantity, ingredientRestaurantId, supplierId} = req.body; - const supplyOrderRequest = new CreateSupplyOrderRequest().setQuantity(quantity) - .setIngredientRestaurantId(ingredientRestaurantId) - .setSupplierId(supplierId); - - stockServiceClient.createSupplyOrder(supplyOrderRequest, (error, response) => { - if (error) { - res.status(500).send({error: error.message}); - } else { - res.json(response.toObject()); - } - }); + const { quantity, ingredientRestaurantId, supplierId } = req.body; + const supplyOrderRequest = new CreateSupplyOrderRequest() + .setQuantity(quantity) + .setIngredientRestaurantId(ingredientRestaurantId) + .setSupplierId(supplierId); + + stockServiceClient.createSupplyOrder(supplyOrderRequest, (error, response) => { + if (error) { + res.status(500).send({ error: error.message }); + } else { + res.json(response.toObject()); + } + }); }); -stockRoutes.put('/api/stock/supply/order/:id', (req: Request, res: Response) => { - /* #swagger.parameters['id'] = { +stockRoutes.put("/api/stock/supply/order/:id", (req: Request, res: Response) => { + /* #swagger.parameters['id'] = { in: 'path', required: true, type: 'integer' @@ -491,33 +507,35 @@ stockRoutes.put('/api/stock/supply/order/:id', (req: Request, res: Response) => supplierId: 1 } } */ - const {id} = req.params; - const {quantity, ingredientRestaurantId, supplierId} = req.body; - const supplyOrderRequest = new UpdateSupplyOrderRequest().setId(Number(id)).setQuantity(quantity) - .setIngredientRestaurantId(ingredientRestaurantId) - .setSupplierId(supplierId); - - stockServiceClient.updateSupplyOrder(supplyOrderRequest, (error, response) => { - if (error) { - res.status(500).send({error: error.message}); - } else { - res.json(response.toObject()); - } - }); + const { id } = req.params; + const { quantity, ingredientRestaurantId, supplierId } = req.body; + const supplyOrderRequest = new UpdateSupplyOrderRequest() + .setId(Number(id)) + .setQuantity(quantity) + .setIngredientRestaurantId(ingredientRestaurantId) + .setSupplierId(supplierId); + + stockServiceClient.updateSupplyOrder(supplyOrderRequest, (error, response) => { + if (error) { + res.status(500).send({ error: error.message }); + } else { + res.json(response.toObject()); + } + }); }); -stockRoutes.delete('/api/stock/supply/order/:id', (req: Request, res: Response) => { - /* #swagger.parameters['id'] = { +stockRoutes.delete("/api/stock/supply/order/:id", (req: Request, res: Response) => { + /* #swagger.parameters['id'] = { in: 'path', required: true, type: 'integer' }*/ - const {id} = req.params; - stockServiceClient.deleteSupplyOrder(new DeleteSupplyOrderRequest().setId(Number(id)), (error, response) => { - if (error) { - res.status(500).send({error: error.message}); - } else { - res.json(response.toObject()); - } - }); -}); \ No newline at end of file + const { id } = req.params; + stockServiceClient.deleteSupplyOrder(new DeleteSupplyOrderRequest().setId(Number(id)), (error, response) => { + if (error) { + res.status(500).send({ error: error.message }); + } else { + res.json(response.toObject()); + } + }); +}); diff --git a/services/gateway/src/controller/stock/stockPerson.controller.ts b/services/gateway/src/controller/stock/stockPerson.controller.ts index ba929c09..45407977 100644 --- a/services/gateway/src/controller/stock/stockPerson.controller.ts +++ b/services/gateway/src/controller/stock/stockPerson.controller.ts @@ -1,11 +1,11 @@ -import {stockPersonServiceClient} from "@gateway/services/clients/stock.client"; -import {Request, Response, Router} from "express"; -import {GetOutcomesByRestaurantRequest} from "@gateway/proto/stock_pb"; +import { stockPersonServiceClient } from "@gateway/services/clients/stock.client"; +import { Request, Response, Router } from "express"; +import { GetOutcomesByRestaurantRequest } from "@gateway/proto/stock_pb"; export const stockPersonRoutes = Router(); -stockPersonRoutes.post('/api/stock/outcomes/by-restaurant/:id', (req: Request, res: Response) => { - /* #swagger.parameters['body'] = { +stockPersonRoutes.post("/api/stock/outcomes/by-restaurant/:id", (req: Request, res: Response) => { + /* #swagger.parameters['body'] = { in: 'body', required: true, schema: { @@ -17,15 +17,18 @@ stockPersonRoutes.post('/api/stock/outcomes/by-restaurant/:id', (req: Request, r required: true, type: 'string' } */ - const {id} = req.params; - const {date, interval} = req.body; - const outcomesByRestaurantRequest = new GetOutcomesByRestaurantRequest().setRestaurantId(id).setDate(date).setInterval(interval); + const { id } = req.params; + const { date, interval } = req.body; + const outcomesByRestaurantRequest = new GetOutcomesByRestaurantRequest() + .setRestaurantId(id) + .setDate(date) + .setInterval(interval); - stockPersonServiceClient.getOutcomesByRestaurant(outcomesByRestaurantRequest, (error, response) => { - if (error) { - res.status(500).send({error: error.message}); - } else { - res.json(response.toObject()); - } - }); -}); \ No newline at end of file + stockPersonServiceClient.getOutcomesByRestaurant(outcomesByRestaurantRequest, (error, response) => { + if (error) { + res.status(500).send({ error: error.message }); + } else { + res.json(response.toObject()); + } + }); +}); diff --git a/services/gateway/src/controller/user/mainAddress.controller.ts b/services/gateway/src/controller/user/mainAddress.controller.ts index f5e7e90c..0f8469ae 100644 --- a/services/gateway/src/controller/user/mainAddress.controller.ts +++ b/services/gateway/src/controller/user/mainAddress.controller.ts @@ -1,26 +1,26 @@ -import {Request, Response, Router} from 'express'; -import {mainAddressServiceClient} from "@gateway/services/clients/user.client"; -import {MainAddress, MainAddressId, MainAddressUpdateInput} from "@gateway/proto/user_pb"; +import { Request, Response, Router } from "express"; +import { mainAddressServiceClient } from "@gateway/services/clients/user.client"; +import { MainAddress, MainAddressId, MainAddressUpdateInput } from "@gateway/proto/user_pb"; export const mainAddressRoutes = Router(); -mainAddressRoutes.get('/api/user/main-address/:id', async (req: Request, res: Response) => { - /* #swagger.parameters['id'] = { +mainAddressRoutes.get("/api/user/main-address/:id", async (req: Request, res: Response) => { + /* #swagger.parameters['id'] = { in: 'path', required: true, type: 'integer' }*/ - const {id} = req.params; - mainAddressServiceClient.getMainAddress(new MainAddressId().setId(Number(id)), (err, response) => { - if (err) { - return res.status(500).json({message: err.message}); - } - return res.json(response.toObject()); - }); + const { id } = req.params; + mainAddressServiceClient.getMainAddress(new MainAddressId().setId(Number(id)), (err, response) => { + if (err) { + return res.status(500).json({ message: err.message }); + } + return res.json(response.toObject()); + }); }); -mainAddressRoutes.put('/api/user/main-address/:id', async (req: Request, res: Response) => { - /* #swagger.parameters['id'] = { +mainAddressRoutes.put("/api/user/main-address/:id", async (req: Request, res: Response) => { + /* #swagger.parameters['id'] = { in: 'path', required: true, type: 'integer' @@ -36,21 +36,27 @@ mainAddressRoutes.put('/api/user/main-address/:id', async (req: Request, res: Re lng: 1.099971 } } */ - const {authorization} = req.headers; - if (!authorization) { - res.json({error: 'Not authorized'}); - return; - } + const { authorization } = req.headers; + if (!authorization) { + res.json({ error: "Not authorized" }); + return; + } - const {id} = req.params; - const {country, zipCode, street, lat, lng} = req.body; - const address = new MainAddress().setId(Number(id)).setCountry(country).setZipcode(zipCode).setStreet(street).setLat(lat).setLng(lng) + const { id } = req.params; + const { country, zipCode, street, lat, lng } = req.body; + const address = new MainAddress() + .setId(Number(id)) + .setCountry(country) + .setZipcode(zipCode) + .setStreet(street) + .setLat(lat) + .setLng(lng); - const mainAddressUpdateInput = new MainAddressUpdateInput().setToken(authorization).setMainaddress(address) - mainAddressServiceClient.updateMainAddress(mainAddressUpdateInput, (err, response) => { - if (err) { - return res.status(500).json({message: err.message}); - } - return res.json(response.toObject()); - }); -}); \ No newline at end of file + const mainAddressUpdateInput = new MainAddressUpdateInput().setToken(authorization).setMainaddress(address); + mainAddressServiceClient.updateMainAddress(mainAddressUpdateInput, (err, response) => { + if (err) { + return res.status(500).json({ message: err.message }); + } + return res.json(response.toObject()); + }); +}); diff --git a/services/gateway/src/controller/user/user.controller.ts b/services/gateway/src/controller/user/user.controller.ts index b3279e04..1eb56b73 100644 --- a/services/gateway/src/controller/user/user.controller.ts +++ b/services/gateway/src/controller/user/user.controller.ts @@ -15,7 +15,7 @@ import { } from "@gateway/proto/user_pb"; import { Empty } from "google-protobuf/google/protobuf/empty_pb"; import { getUser, getUserIdFromToken } from "@gateway/services/user.service"; -import {check, withCheck} from "@gateway/middleware/auth"; +import { check, withCheck } from "@gateway/middleware/auth"; export const userRoutes = Router(); userRoutes.get("/api/user/:id", async (req: Request, res: Response) => { @@ -38,7 +38,7 @@ userRoutes.get("/api/user/:id", async (req: Request, res: Response) => { if (!(await check(token, { id: Number(id) }))) return res.status(403).json({ message: "Forbidden" }); try { - const user = await getUser(Number(id)) + const user = await getUser(Number(id)); res.json(user?.toObject()); } catch (e: any) { res.json({ error: e.message }); @@ -159,8 +159,8 @@ userRoutes.put("/api/user", async (req: Request, res: Response) => { }); }); -userRoutes.delete('/api/user/:id', (req: Request, res: Response) => { - /* #swagger.parameters['authorization'] = { +userRoutes.delete("/api/user/:id", (req: Request, res: Response) => { + /* #swagger.parameters['authorization'] = { in: 'header', required: true, type: 'string' @@ -170,9 +170,9 @@ userRoutes.delete('/api/user/:id', (req: Request, res: Response) => { required: true, type: 'integer' } */ - const {id} = req.params; - const {authorization} = req.headers; - if (!authorization) return res.status(401).json({ message: "Unauthorized" }); + const { id } = req.params; + const { authorization } = req.headers; + if (!authorization) return res.status(401).json({ message: "Unauthorized" }); // The delete route in the user service implement the user validation userServiceClient.deleteUser(new DeleteInput().setUserid(Number(id)).setToken(authorization), (error, response) => { @@ -225,8 +225,8 @@ userRoutes.post("/api/user/validate", (req: Request, res: Response) => { }); }); -userRoutes.put('/api/user/password', (req: Request, res: Response) => { - /* #swagger.parameters['authorization'] = { +userRoutes.put("/api/user/password", (req: Request, res: Response) => { + /* #swagger.parameters['authorization'] = { in: 'header', required: true, type: 'string' @@ -240,8 +240,8 @@ userRoutes.put('/api/user/password', (req: Request, res: Response) => { } } */ - const {authorization} = req.headers; - if (!authorization) return res.status(401).json({ message: "Unauthorized" }); + const { authorization } = req.headers; + if (!authorization) return res.status(401).json({ message: "Unauthorized" }); const { oldpassword, password } = req.body; const updatePasswordInput = new changePasswordInput(); @@ -260,8 +260,8 @@ userRoutes.put('/api/user/password', (req: Request, res: Response) => { }); }); -userRoutes.put('/api/user/:id/role', withCheck({ role: "ADMIN" }), (req: Request, res: Response) => { - /* #swagger.parameters['authorization'] = { +userRoutes.put("/api/user/:id/role", withCheck({ role: "ADMIN" }), (req: Request, res: Response) => { + /* #swagger.parameters['authorization'] = { in: 'header', required: true, type: 'string' @@ -278,26 +278,23 @@ userRoutes.put('/api/user/:id/role', withCheck({ role: "ADMIN" }), (req: Request role: {'$ref': '#/definitions/RoleCode'}, } } */ - const {authorization} = req.headers; - if (!authorization) { - res.json({error: 'Not authorized'}); - return; - } - const id = req.params.id; - const updatePasswordInput = new changeRoleInput(); - try { - updatePasswordInput - .setToken(authorization) - .setUserid(Number(id)) - .setRolecode(req.body.role); - } catch (e: any) { - res.json({error: e.message}); + const { authorization } = req.headers; + if (!authorization) { + res.json({ error: "Not authorized" }); + return; + } + const id = req.params.id; + const updatePasswordInput = new changeRoleInput(); + try { + updatePasswordInput.setToken(authorization).setUserid(Number(id)).setRolecode(req.body.role); + } catch (e: any) { + res.json({ error: e.message }); + } + userServiceClient.changeRole(updatePasswordInput, (error, response) => { + if (error) { + res.status(500).send({ error: error.message }); + } else { + res.json(response.toObject()); } - userServiceClient.changeRole(updatePasswordInput, (error, response) => { - if (error) { - res.status(500).send({error: error.message}); - } else { - res.json(response.toObject()); - } - }); + }); }); diff --git a/services/gateway/src/lib/log/log.ts b/services/gateway/src/lib/log/log.ts index 3dc6f37a..92b2772a 100644 --- a/services/gateway/src/lib/log/log.ts +++ b/services/gateway/src/lib/log/log.ts @@ -2,48 +2,42 @@ /* eslint-disable no-console */ function getStackTrace() { - let stack; + let stack; - try { - throw new Error(""); - } catch (error) { - stack = (error as Error).stack || ""; - } + try { + throw new Error(""); + } catch (error) { + stack = (error as Error).stack || ""; + } - stack = stack.split("\n").map((line) => line.trim()); - return stack.splice(stack[0] === "Error" ? 2 : 1); + stack = stack.split("\n").map((line) => line.trim()); + return stack.splice(stack[0] === "Error" ? 2 : 1); } const getInitiator = () => { - // _getInitiatorLine, _ObjectInfoLine, caller - const [, , caller] = getStackTrace(); - const file = caller.split("/").at(-1) || ""; - return file.replace(")", ""); + // _getInitiatorLine, _ObjectInfoLine, caller + const [, , caller] = getStackTrace(); + const file = caller.split("/").at(-1) || ""; + return file.replace(")", ""); }; const warn = (...args: any[]) => { - console.group( - `\x1b[33m${new Date().toISOString()} - WARN - ${getInitiator()}\x1b[0m` - ); - console.warn(...args); - console.groupEnd(); + console.group(`\x1b[33m${new Date().toISOString()} - WARN - ${getInitiator()}\x1b[0m`); + console.warn(...args); + console.groupEnd(); }; const error = (...args: any[]) => { - console.group( - `\x1b[31m${new Date().toISOString()} - ERROR - ${getInitiator()}\x1b[0m` - ); - console.error(...args); - console.groupEnd(); + console.group(`\x1b[31m${new Date().toISOString()} - ERROR - ${getInitiator()}\x1b[0m`); + console.error(...args); + console.groupEnd(); }; const info = (...args: any[]) => { - console.group( - `\x1b[34m${new Date().toISOString()} - INFO - ${getInitiator()}\x1b[0m` - ); - console.log(...args); - console.groupEnd(); + console.group(`\x1b[34m${new Date().toISOString()} - INFO - ${getInitiator()}\x1b[0m`); + console.log(...args); + console.groupEnd(); }; const debug = (...args: any[]) => { - console.log(...args); + console.log(...args); }; /** @@ -55,20 +49,20 @@ const debug = (...args: any[]) => { * @exports log */ export const log = { - warn, - error, - info, - debug, + warn, + error, + info, + debug, }; export const utils = { - bold: (text: string) => `\x1b[1m${text}\x1b[0m`, - red: (text: string) => `\x1b[31m${text}\x1b[0m`, - green: (text: string) => `\x1b[32m${text}\x1b[0m`, - yellow: (text: string) => `\x1b[33m${text}\x1b[0m`, - blue: (text: string) => `\x1b[34m${text}\x1b[0m`, - magenta: (text: string) => `\x1b[35m${text}\x1b[0m`, - cyan: (text: string) => `\x1b[36m${text}\x1b[0m`, - white: (text: string) => `\x1b[37m${text}\x1b[0m`, - gray: (text: string) => `\x1b[90m${text}\x1b[0m`, + bold: (text: string) => `\x1b[1m${text}\x1b[0m`, + red: (text: string) => `\x1b[31m${text}\x1b[0m`, + green: (text: string) => `\x1b[32m${text}\x1b[0m`, + yellow: (text: string) => `\x1b[33m${text}\x1b[0m`, + blue: (text: string) => `\x1b[34m${text}\x1b[0m`, + magenta: (text: string) => `\x1b[35m${text}\x1b[0m`, + cyan: (text: string) => `\x1b[36m${text}\x1b[0m`, + white: (text: string) => `\x1b[37m${text}\x1b[0m`, + gray: (text: string) => `\x1b[90m${text}\x1b[0m`, }; diff --git a/services/gateway/src/server.ts b/services/gateway/src/server.ts index 609f1936..541f5201 100644 --- a/services/gateway/src/server.ts +++ b/services/gateway/src/server.ts @@ -1,22 +1,22 @@ -import {userRoutes} from "@gateway/controller/user/user.controller"; -import {orderRoutes} from "@gateway/controller/order/order.controller"; -import {productRoutes} from "@gateway/controller/product/product.controller"; -import {categoryRoutes} from "@gateway/controller/product/category.controller"; -import {allergenRoutes} from "@gateway/controller/product/allergen.controller"; -import {deliveryRoutes} from "@gateway/controller/delivery/delivery.controller"; -import {deliveryPersonRoutes} from "@gateway/controller/delivery/deliveryPerson.controller"; -import {promotionRoutes} from "@gateway/controller/promotion/promotion.controller"; -import {stockPersonRoutes} from "@gateway/controller/stock/stockPerson.controller"; -import {stockRoutes} from "@gateway/controller/stock/stock.controller"; -import {logRoutes} from "@gateway/controller/log/log.controller"; -import {metricRoutes} from "@gateway/controller/metric/metric.controller"; -import {basketRoutes} from "@gateway/controller/basket/basket.controller"; -import {log, utils} from "@gateway/lib/log/log"; -import {stripeRoutes} from "@gateway/controller/payment/stripe.controller"; -import {restaurantRoutes} from "@gateway/controller/restaurant/restaurant.controller"; -import {paymentRoutes} from "@gateway/controller/payment/payment.controller"; -import {mainAddressRoutes} from "@gateway/controller/user/mainAddress.controller"; -import {notificationRoutes} from "@gateway/controller/notification/notification.controller"; +import { userRoutes } from "@gateway/controller/user/user.controller"; +import { orderRoutes } from "@gateway/controller/order/order.controller"; +import { productRoutes } from "@gateway/controller/product/product.controller"; +import { categoryRoutes } from "@gateway/controller/product/category.controller"; +import { allergenRoutes } from "@gateway/controller/product/allergen.controller"; +import { deliveryRoutes } from "@gateway/controller/delivery/delivery.controller"; +import { deliveryPersonRoutes } from "@gateway/controller/delivery/deliveryPerson.controller"; +import { promotionRoutes } from "@gateway/controller/promotion/promotion.controller"; +import { stockPersonRoutes } from "@gateway/controller/stock/stockPerson.controller"; +import { stockRoutes } from "@gateway/controller/stock/stock.controller"; +import { logRoutes } from "@gateway/controller/log/log.controller"; +import { metricRoutes } from "@gateway/controller/metric/metric.controller"; +import { basketRoutes } from "@gateway/controller/basket/basket.controller"; +import { log, utils } from "@gateway/lib/log/log"; +import { stripeRoutes } from "@gateway/controller/payment/stripe.controller"; +import { restaurantRoutes } from "@gateway/controller/restaurant/restaurant.controller"; +import { paymentRoutes } from "@gateway/controller/payment/payment.controller"; +import { mainAddressRoutes } from "@gateway/controller/user/mainAddress.controller"; +import { notificationRoutes } from "@gateway/controller/notification/notification.controller"; import bodyParser from "body-parser"; import express from "express"; @@ -25,66 +25,100 @@ app.use(bodyParser.json()); const PORT = process.env.GATEWAY_PORT || 50000; -app.use('/', userRoutes -// #swagger.tags = ['User'] -); -app.use('/', mainAddressRoutes -// #swagger.tags = ['User'] -); -app.use('/', basketRoutes -// #swagger.tags = ['Basket'] -); -app.use('/', paymentRoutes -// #swagger.tags = ['Payment'] -); -app.use('/', stripeRoutes -// #swagger.tags = ['Payment'] -); -app.use('/', orderRoutes -// #swagger.tags = ['Order'] -); -app.use('/', categoryRoutes -// #swagger.tags = ['Order'] -); -app.use('/', allergenRoutes -// #swagger.tags = ['Order'] -); -app.use('/', productRoutes -// #swagger.tags = ['Product'] -); -app.use('/', restaurantRoutes -// #swagger.tags = ['Restaurant'] -); -app.use('/', deliveryRoutes -// #swagger.tags = ['Delivery'] -); -app.use('/', deliveryPersonRoutes -// #swagger.tags = ['Delivery'] -); -app.use('/', logRoutes -// #swagger.tags = ['Log'] -); -app.use('/', metricRoutes -// #swagger.tags = ['Metric'] -); -app.use('/', promotionRoutes -// #swagger.tags = ['Promotion'] -); -app.use('/', stockRoutes -// #swagger.tags = ['Stock'] -); -app.use('/', stockPersonRoutes -// #swagger.tags = ['Stock'] -); -app.use('/', notificationRoutes -// #swagger.tags = ['Notification'] +app.use( + "/", + userRoutes, + // #swagger.tags = ['User'] +); +app.use( + "/", + mainAddressRoutes, + // #swagger.tags = ['User'] +); +app.use( + "/", + basketRoutes, + // #swagger.tags = ['Basket'] +); +app.use( + "/", + paymentRoutes, + // #swagger.tags = ['Payment'] +); +app.use( + "/", + stripeRoutes, + // #swagger.tags = ['Payment'] +); +app.use( + "/", + orderRoutes, + // #swagger.tags = ['Order'] +); +app.use( + "/", + categoryRoutes, + // #swagger.tags = ['Order'] +); +app.use( + "/", + allergenRoutes, + // #swagger.tags = ['Order'] +); +app.use( + "/", + productRoutes, + // #swagger.tags = ['Product'] +); +app.use( + "/", + restaurantRoutes, + // #swagger.tags = ['Restaurant'] +); +app.use( + "/", + deliveryRoutes, + // #swagger.tags = ['Delivery'] +); +app.use( + "/", + deliveryPersonRoutes, + // #swagger.tags = ['Delivery'] +); +app.use( + "/", + logRoutes, + // #swagger.tags = ['Log'] +); +app.use( + "/", + metricRoutes, + // #swagger.tags = ['Metric'] +); +app.use( + "/", + promotionRoutes, + // #swagger.tags = ['Promotion'] +); +app.use( + "/", + stockRoutes, + // #swagger.tags = ['Stock'] +); +app.use( + "/", + stockPersonRoutes, + // #swagger.tags = ['Stock'] +); +app.use( + "/", + notificationRoutes, + // #swagger.tags = ['Notification'] ); app.listen(PORT, () => { - const message = `---- ${utils.green("good")}${utils.yellow( - "food" - )} Gateway ----\nstarted on: ${utils.bold(`0.0.0.0:${PORT}`)} ${utils.green( - "✓" - )}\n`; - log.debug(message); -}); \ No newline at end of file + const message = `---- ${utils.green("good")}${utils.yellow("food")} Gateway ----\nstarted on: ${utils.bold( + `0.0.0.0:${PORT}`, + )} ${utils.green("✓")}\n`; + log.debug(message); +}); diff --git a/services/gateway/src/services/basket.service.ts b/services/gateway/src/services/basket.service.ts index 15eb5681..b9b02a13 100644 --- a/services/gateway/src/services/basket.service.ts +++ b/services/gateway/src/services/basket.service.ts @@ -1,16 +1,16 @@ -import {basketServiceClient} from "@gateway/services/clients/basket.client"; -import {Basket, UserId} from "@gateway/proto/basket_pb"; +import { basketServiceClient } from "@gateway/services/clients/basket.client"; +import { Basket, UserId } from "@gateway/proto/basket_pb"; export const getBasketByUser = (id: string): Promise => { - const userId = new UserId(); - userId.setId(Number(id)); - return new Promise((resolve, reject) => { - basketServiceClient.getBasket(userId, (error, response) => { - if (error) { - reject(error); - } else { - resolve(response) - } - }); - }) -} + const userId = new UserId(); + userId.setId(Number(id)); + return new Promise((resolve, reject) => { + basketServiceClient.getBasket(userId, (error, response) => { + if (error) { + reject(error); + } else { + resolve(response); + } + }); + }); +}; diff --git a/services/gateway/src/services/clients/basket.client.ts b/services/gateway/src/services/clients/basket.client.ts index 073dbc11..f90fbef2 100644 --- a/services/gateway/src/services/clients/basket.client.ts +++ b/services/gateway/src/services/clients/basket.client.ts @@ -1,8 +1,6 @@ -import services from '../../proto/basket_grpc_pb'; -import * as grpc from '@grpc/grpc-js'; +import services from "../../proto/basket_grpc_pb"; +import * as grpc from "@grpc/grpc-js"; const url = process.env.GATEWAY_BASKET_URL || "localhost:50002"; -export const basketServiceClient = new services.BasketServiceClient( - url, - grpc.credentials.createInsecure()); \ No newline at end of file +export const basketServiceClient = new services.BasketServiceClient(url, grpc.credentials.createInsecure()); diff --git a/services/gateway/src/services/clients/delivery.client.ts b/services/gateway/src/services/clients/delivery.client.ts index a7cb34ca..c20e37ec 100644 --- a/services/gateway/src/services/clients/delivery.client.ts +++ b/services/gateway/src/services/clients/delivery.client.ts @@ -1,12 +1,11 @@ -import services from '../../proto/delivery_grpc_pb'; -import * as grpc from '@grpc/grpc-js'; +import services from "../../proto/delivery_grpc_pb"; +import * as grpc from "@grpc/grpc-js"; const url = process.env.GATEWAY_DELIVERY_URL || "localhost:50008"; -export const deliveryServiceClient = new services.DeliveryServiceClient( - url, - grpc.credentials.createInsecure()); +export const deliveryServiceClient = new services.DeliveryServiceClient(url, grpc.credentials.createInsecure()); export const deliveryPersonServiceClient = new services.DeliveryPersonServiceClient( - url, - grpc.credentials.createInsecure()); \ No newline at end of file + url, + grpc.credentials.createInsecure(), +); diff --git a/services/gateway/src/services/clients/log.client.ts b/services/gateway/src/services/clients/log.client.ts index bcc4e818..c5c415e3 100644 --- a/services/gateway/src/services/clients/log.client.ts +++ b/services/gateway/src/services/clients/log.client.ts @@ -1,8 +1,6 @@ -import services from '../../proto/log_grpc_pb'; -import * as grpc from '@grpc/grpc-js'; +import services from "../../proto/log_grpc_pb"; +import * as grpc from "@grpc/grpc-js"; const url = process.env.GATEWAY_LOG_URL || "localhost:50021"; -export const logServiceClient = new services.LogServiceClient( - url, - grpc.credentials.createInsecure()); \ No newline at end of file +export const logServiceClient = new services.LogServiceClient(url, grpc.credentials.createInsecure()); diff --git a/services/gateway/src/services/clients/metric.client.ts b/services/gateway/src/services/clients/metric.client.ts index 0d9a2a7b..b835b690 100644 --- a/services/gateway/src/services/clients/metric.client.ts +++ b/services/gateway/src/services/clients/metric.client.ts @@ -1,8 +1,6 @@ -import services from '../../proto/metric_grpc_pb'; -import * as grpc from '@grpc/grpc-js'; +import services from "../../proto/metric_grpc_pb"; +import * as grpc from "@grpc/grpc-js"; const url = process.env.GATEWAY_REPORTING_URL || "localhost:50020"; -export default new services.ReportingServiceClient( - url, - grpc.credentials.createInsecure()); \ No newline at end of file +export default new services.ReportingServiceClient(url, grpc.credentials.createInsecure()); diff --git a/services/gateway/src/services/clients/notification.client.ts b/services/gateway/src/services/clients/notification.client.ts index eadc2cec..f68d0f16 100644 --- a/services/gateway/src/services/clients/notification.client.ts +++ b/services/gateway/src/services/clients/notification.client.ts @@ -1,8 +1,6 @@ -import services from '../../proto/notification_grpc_pb'; -import * as grpc from '@grpc/grpc-js'; +import services from "../../proto/notification_grpc_pb"; +import * as grpc from "@grpc/grpc-js"; const url = process.env.GATEWAY_NOTIFICATION_URL || "localhost:50022"; -export const notificationServiceClient = new services.NotificationServiceClient( - url, - grpc.credentials.createInsecure()); \ No newline at end of file +export const notificationServiceClient = new services.NotificationServiceClient(url, grpc.credentials.createInsecure()); diff --git a/services/gateway/src/services/clients/order.client.ts b/services/gateway/src/services/clients/order.client.ts index 22d034ca..1ff529b7 100644 --- a/services/gateway/src/services/clients/order.client.ts +++ b/services/gateway/src/services/clients/order.client.ts @@ -1,8 +1,6 @@ -import services from '../../proto/order_grpc_pb'; -import * as grpc from '@grpc/grpc-js'; +import services from "../../proto/order_grpc_pb"; +import * as grpc from "@grpc/grpc-js"; const url = process.env.GATEWAY_ORDER_URL || "localhost:50007"; -export default new services.OrderServiceClient( - url, - grpc.credentials.createInsecure()); \ No newline at end of file +export default new services.OrderServiceClient(url, grpc.credentials.createInsecure()); diff --git a/services/gateway/src/services/clients/payment.client.ts b/services/gateway/src/services/clients/payment.client.ts index 5a9c5039..40ab8a2a 100644 --- a/services/gateway/src/services/clients/payment.client.ts +++ b/services/gateway/src/services/clients/payment.client.ts @@ -1,12 +1,8 @@ -import services from '../../proto/payment_grpc_pb'; -import * as grpc from '@grpc/grpc-js'; +import services from "../../proto/payment_grpc_pb"; +import * as grpc from "@grpc/grpc-js"; const url = process.env.GATEWAY_PAYMENT_URL || "localhost:50003"; -export const paymentServiceClient = new services.PaymentServiceClient( - url, - grpc.credentials.createInsecure()); +export const paymentServiceClient = new services.PaymentServiceClient(url, grpc.credentials.createInsecure()); -export const stripeServiceClient = new services.StripeServiceClient( - url, - grpc.credentials.createInsecure()); \ No newline at end of file +export const stripeServiceClient = new services.StripeServiceClient(url, grpc.credentials.createInsecure()); diff --git a/services/gateway/src/services/clients/product.client.ts b/services/gateway/src/services/clients/product.client.ts index b19c3b97..a858b638 100644 --- a/services/gateway/src/services/clients/product.client.ts +++ b/services/gateway/src/services/clients/product.client.ts @@ -1,16 +1,10 @@ -import * as grpc from '@grpc/grpc-js'; -import {AllergenServiceClient, CategoryServiceClient, ProductServiceClient} from "@gateway/proto/product_grpc_pb"; +import * as grpc from "@grpc/grpc-js"; +import { AllergenServiceClient, CategoryServiceClient, ProductServiceClient } from "@gateway/proto/product_grpc_pb"; const url = process.env.GATEWAY_PRODUCT_URL || "localhost:50004"; -export const categoryServiceClient = new CategoryServiceClient( - url, - grpc.credentials.createInsecure()); +export const categoryServiceClient = new CategoryServiceClient(url, grpc.credentials.createInsecure()); -export const allergenServiceClient = new AllergenServiceClient( - url, - grpc.credentials.createInsecure()); +export const allergenServiceClient = new AllergenServiceClient(url, grpc.credentials.createInsecure()); -export const productServiceClient = new ProductServiceClient( - url, - grpc.credentials.createInsecure()); \ No newline at end of file +export const productServiceClient = new ProductServiceClient(url, grpc.credentials.createInsecure()); diff --git a/services/gateway/src/services/clients/promotion.client.ts b/services/gateway/src/services/clients/promotion.client.ts index 38326c3a..37aee4ae 100644 --- a/services/gateway/src/services/clients/promotion.client.ts +++ b/services/gateway/src/services/clients/promotion.client.ts @@ -1,8 +1,6 @@ -import services from '../../proto/promotions_grpc_pb'; -import * as grpc from '@grpc/grpc-js'; +import services from "../../proto/promotions_grpc_pb"; +import * as grpc from "@grpc/grpc-js"; const url = process.env.GATEWAY_PROMOTION_URL || "localhost:50006"; -export const promotionServiceClient = new services.PromotionServiceClient( - url, - grpc.credentials.createInsecure()); \ No newline at end of file +export const promotionServiceClient = new services.PromotionServiceClient(url, grpc.credentials.createInsecure()); diff --git a/services/gateway/src/services/clients/restaurant.client.ts b/services/gateway/src/services/clients/restaurant.client.ts index 2ae98036..e0d55ed3 100644 --- a/services/gateway/src/services/clients/restaurant.client.ts +++ b/services/gateway/src/services/clients/restaurant.client.ts @@ -1,8 +1,6 @@ -import services from '../../proto/restaurant_grpc_pb'; -import * as grpc from '@grpc/grpc-js'; +import services from "../../proto/restaurant_grpc_pb"; +import * as grpc from "@grpc/grpc-js"; const url = process.env.GATEWAY_RESTAURANT_URL || "localhost:50005"; -export const restaurantServiceClient = new services.RestaurantServiceClient( - url, - grpc.credentials.createInsecure()); \ No newline at end of file +export const restaurantServiceClient = new services.RestaurantServiceClient(url, grpc.credentials.createInsecure()); diff --git a/services/gateway/src/services/clients/stock.client.ts b/services/gateway/src/services/clients/stock.client.ts index f06291cb..65d5389d 100644 --- a/services/gateway/src/services/clients/stock.client.ts +++ b/services/gateway/src/services/clients/stock.client.ts @@ -1,12 +1,11 @@ -import services from '../../proto/stock_grpc_pb'; -import * as grpc from '@grpc/grpc-js'; +import services from "../../proto/stock_grpc_pb"; +import * as grpc from "@grpc/grpc-js"; const url = process.env.GATEWAY_STOCK_URL || "localhost:50009"; -export const stockServiceClient = new services.StockServiceClient( - url, - grpc.credentials.createInsecure()); +export const stockServiceClient = new services.StockServiceClient(url, grpc.credentials.createInsecure()); export const stockPersonServiceClient = new services.StockReportingServiceClient( - url, - grpc.credentials.createInsecure()); \ No newline at end of file + url, + grpc.credentials.createInsecure(), +); diff --git a/services/gateway/src/services/clients/user.client.ts b/services/gateway/src/services/clients/user.client.ts index 2828d883..a822e8ef 100644 --- a/services/gateway/src/services/clients/user.client.ts +++ b/services/gateway/src/services/clients/user.client.ts @@ -1,12 +1,8 @@ -import services from '../../proto/user_grpc_pb'; -import * as grpc from '@grpc/grpc-js'; +import services from "../../proto/user_grpc_pb"; +import * as grpc from "@grpc/grpc-js"; const url = process.env.GATEWAY_USER_URL || "localhost:50001"; -export const userServiceClient = new services.UserServiceClient( - url, - grpc.credentials.createInsecure()); +export const userServiceClient = new services.UserServiceClient(url, grpc.credentials.createInsecure()); -export const mainAddressServiceClient = new services.MainAddressServiceClient( - url, - grpc.credentials.createInsecure()); \ No newline at end of file +export const mainAddressServiceClient = new services.MainAddressServiceClient(url, grpc.credentials.createInsecure()); diff --git a/services/gateway/src/services/user.service.ts b/services/gateway/src/services/user.service.ts index 45634ffe..0acfc636 100644 --- a/services/gateway/src/services/user.service.ts +++ b/services/gateway/src/services/user.service.ts @@ -2,29 +2,29 @@ import { User, UserId, validateInput } from "@gateway/proto/user_pb"; import { userServiceClient } from "@gateway/services/clients/user.client"; export const getUser = (id: number): Promise => { - const userId = new UserId(); - userId.setId(Number(id)); - return new Promise((resolve, reject) => { - userServiceClient.getUser(userId, (error, response) => { - if (error) { - reject(error); - } else { - resolve(response.getUser()) - } - }); - }) + const userId = new UserId(); + userId.setId(Number(id)); + return new Promise((resolve, reject) => { + userServiceClient.getUser(userId, (error, response) => { + if (error) { + reject(error); + } else { + resolve(response.getUser()); + } + }); + }); }; export const getUserIdFromToken = (token: string): Promise => { const userToken = new validateInput(); userToken.setToken(token); - return new Promise((resolve, reject) => { - userServiceClient.validate(userToken, (error, response) => { - if (error) { - reject(error); - } else { - resolve(response.getUserid()); - } - }); + return new Promise((resolve, reject) => { + userServiceClient.validate(userToken, (error, response) => { + if (error) { + reject(error); + } else { + resolve(response.getUserid()); + } }); + }); }; From 0a56fdb046bcd29841005463ae3ba5a5a08554d4 Mon Sep 17 00:00:00 2001 From: anatole Date: Sun, 27 Aug 2023 11:59:57 +0200 Subject: [PATCH 492/883] feat(gateway): reorder swagger tags --- .../src/lib/swagger/swagger-output.json | 4102 +---------------- services/gateway/src/server.ts | 12 +- 2 files changed, 7 insertions(+), 4107 deletions(-) diff --git a/services/gateway/src/lib/swagger/swagger-output.json b/services/gateway/src/lib/swagger/swagger-output.json index b14c2f1d..4351cc64 100644 --- a/services/gateway/src/lib/swagger/swagger-output.json +++ b/services/gateway/src/lib/swagger/swagger-output.json @@ -10,4107 +10,7 @@ "schemes": [ "http" ], - "paths": { - "/api/user/{id}": { - "get": { - "tags": [ - "User" - ], - "description": "", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "type": "integer" - }, - { - "name": "authorization", - "in": "header", - "required": true, - "type": "string" - } - ], - "responses": { - "200": { - "description": "OK" - }, - "401": { - "description": "Unauthorized" - }, - "403": { - "description": "Forbidden" - } - } - }, - "delete": { - "tags": [ - "User" - ], - "description": "", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "type": "integer" - }, - { - "name": "authorization", - "in": "header", - "required": true, - "type": "string" - } - ], - "responses": { - "200": { - "description": "OK" - }, - "401": { - "description": "Unauthorized" - }, - "500": { - "description": "Internal Server Error" - } - } - } - }, - "/api/user": { - "get": { - "tags": [ - "User" - ], - "description": "", - "parameters": [ - { - "name": "authorization", - "in": "header", - "required": true, - "type": "string" - } - ], - "responses": { - "200": { - "description": "OK" - }, - "500": { - "description": "Internal Server Error" - } - } - }, - "put": { - "tags": [ - "User" - ], - "description": "", - "parameters": [ - { - "name": "authorization", - "in": "header", - "required": true, - "type": "string" - }, - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "type": "object", - "properties": { - "firstName": { - "type": "string", - "example": "John" - }, - "lastName": { - "type": "string", - "example": "Doe" - }, - "email": { - "type": "string", - "example": "johnDoe@mail.com" - }, - "password": { - "type": "string", - "example": "password" - }, - "phone": { - "type": "string", - "example": "0642424242" - }, - "country": { - "type": "string", - "example": "France" - }, - "zipCode": { - "type": "string", - "example": "76000" - }, - "street": { - "type": "string", - "example": "7 rue de la paix" - }, - "lat": { - "type": "number", - "example": 49.443232 - }, - "lng": { - "type": "number", - "example": 1.099971 - }, - "roleCode": { - "$ref": "#/definitions/RoleCode" - } - } - } - } - ], - "responses": { - "200": { - "description": "OK" - }, - "401": { - "description": "Unauthorized" - }, - "500": { - "description": "Internal Server Error" - } - } - } - }, - "/api/user/register": { - "post": { - "tags": [ - "User" - ], - "description": "", - "parameters": [ - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "type": "object", - "properties": { - "firstName": { - "type": "string", - "example": "John" - }, - "lastName": { - "type": "string", - "example": "Doe" - }, - "email": { - "type": "string", - "example": "johnDoe@mail.com" - }, - "password": { - "type": "string", - "example": "password" - }, - "phone": { - "type": "string", - "example": "0642424242" - }, - "country": { - "type": "string", - "example": "France" - }, - "zipCode": { - "type": "string", - "example": "76000" - }, - "street": { - "type": "string", - "example": "7 rue de la paix" - }, - "lat": { - "type": "number", - "example": 49.443232 - }, - "lng": { - "type": "number", - "example": 1.099971 - }, - "roleCode": { - "$ref": "#/definitions/RoleCode" - } - } - } - } - ], - "responses": { - "200": { - "description": "OK" - }, - "500": { - "description": "Internal Server Error" - } - } - } - }, - "/api/user/login": { - "post": { - "tags": [ - "User" - ], - "description": "", - "parameters": [ - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "type": "object", - "properties": { - "email": { - "type": "string", - "example": "johnDoe@mail.com" - }, - "password": { - "type": "string", - "example": "password" - } - } - } - } - ], - "responses": { - "200": { - "description": "OK" - }, - "500": { - "description": "Internal Server Error" - } - } - } - }, - "/api/user/validate": { - "post": { - "tags": [ - "User" - ], - "description": "", - "parameters": [ - { - "name": "authorization", - "in": "header", - "required": true, - "type": "string" - } - ], - "responses": { - "200": { - "description": "OK" - }, - "401": { - "description": "Unauthorized" - }, - "500": { - "description": "Internal Server Error" - } - } - } - }, - "/api/user/password": { - "put": { - "tags": [ - "User" - ], - "description": "", - "parameters": [ - { - "name": "authorization", - "in": "header", - "required": true, - "type": "string" - }, - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "type": "object", - "properties": { - "oldpassword": { - "type": "string", - "example": "oldpassword" - }, - "password": { - "type": "string", - "example": "newPassword" - } - } - } - } - ], - "responses": { - "200": { - "description": "OK" - }, - "401": { - "description": "Unauthorized" - }, - "500": { - "description": "Internal Server Error" - } - } - } - }, - "/api/user/{id}/role": { - "put": { - "tags": [ - "User" - ], - "description": "", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "type": "integer" - }, - { - "name": "authorization", - "in": "header", - "required": true, - "type": "string" - }, - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "type": "object", - "properties": { - "role": { - "$ref": "#/definitions/RoleCode" - } - } - } - } - ], - "responses": { - "200": { - "description": "OK" - }, - "500": { - "description": "Internal Server Error" - } - } - } - }, - "/api/user/main-address/{id}": { - "get": { - "tags": [ - "User" - ], - "description": "", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "type": "integer" - } - ], - "responses": { - "200": { - "description": "OK" - }, - "500": { - "description": "Internal Server Error" - } - } - }, - "put": { - "tags": [ - "User" - ], - "description": "", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "type": "integer" - }, - { - "name": "authorization", - "in": "header", - "type": "string" - }, - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "type": "object", - "properties": { - "country": { - "type": "string", - "example": "France" - }, - "zipCode": { - "type": "string", - "example": "76000" - }, - "street": { - "type": "string", - "example": "7 rue de la paix" - }, - "lat": { - "type": "number", - "example": 49.443232 - }, - "lng": { - "type": "number", - "example": 1.099971 - } - } - } - } - ], - "responses": { - "200": { - "description": "OK" - }, - "500": { - "description": "Internal Server Error" - } - } - } - }, - "/api/basket/": { - "get": { - "tags": [ - "Basket" - ], - "description": "", - "parameters": [ - { - "name": "authorization", - "in": "header", - "type": "string" - } - ], - "responses": { - "200": { - "description": "OK" - }, - "401": { - "description": "Unauthorized" - }, - "500": { - "description": "Internal Server Error" - } - } - } - }, - "/api/basket": { - "post": { - "tags": [ - "Basket" - ], - "description": "", - "parameters": [ - { - "name": "authorization", - "in": "header", - "type": "string" - }, - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "type": "object", - "properties": { - "productId": { - "type": "string", - "example": "product_id:0" - }, - "restaurantId": { - "type": "string", - "example": "restaurant_id:0" - } - } - } - } - ], - "responses": { - "200": { - "description": "OK" - }, - "401": { - "description": "Unauthorized" - }, - "500": { - "description": "Internal Server Error" - } - } - } - }, - "/api/basket/remove-product": { - "put": { - "tags": [ - "Basket" - ], - "description": "", - "parameters": [ - { - "name": "authorization", - "in": "header", - "type": "string" - }, - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "type": "object", - "properties": { - "productId": { - "type": "string", - "example": "product_id:0" - }, - "restaurantId": { - "type": "string", - "example": "restaurant_id:0" - } - } - } - } - ], - "responses": { - "200": { - "description": "OK" - }, - "401": { - "description": "Unauthorized" - }, - "500": { - "description": "Internal Server Error" - } - } - } - }, - "/api/basket/restaurant": { - "put": { - "tags": [ - "Basket" - ], - "description": "", - "parameters": [ - { - "name": "authorization", - "in": "header", - "type": "string" - }, - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "type": "object", - "properties": { - "restaurantId": { - "type": "string", - "example": "restaurant_id:0" - } - } - } - } - ], - "responses": { - "200": { - "description": "OK" - }, - "401": { - "description": "Unauthorized" - }, - "500": { - "description": "Internal Server Error" - } - } - } - }, - "/api/basket/reset": { - "post": { - "tags": [ - "Basket" - ], - "description": "", - "parameters": [ - { - "name": "authorization", - "in": "header", - "type": "string" - } - ], - "responses": { - "200": { - "description": "OK" - }, - "401": { - "description": "Unauthorized" - }, - "500": { - "description": "Internal Server Error" - } - } - } - }, - "/api/payment/{id}": { - "get": { - "tags": [ - "Payment" - ], - "description": "", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "type": "string" - }, - { - "name": "authorization", - "in": "header", - "required": true, - "type": "string" - } - ], - "responses": { - "401": { - "description": "Unauthorized" - }, - "500": { - "description": "Internal Server Error" - } - } - } - }, - "/api/payment/by-user/{userId}": { - "get": { - "tags": [ - "Payment" - ], - "description": "", - "parameters": [ - { - "name": "userId", - "in": "path", - "required": true, - "type": "string" - }, - { - "name": "authorization", - "in": "header", - "required": true, - "type": "string" - } - ], - "responses": { - "200": { - "description": "OK" - }, - "401": { - "description": "Unauthorized" - }, - "500": { - "description": "Internal Server Error" - } - } - } - }, - "/api/payment/stripe": { - "post": { - "tags": [ - "Payment" - ], - "description": "", - "parameters": [ - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "type": "object", - "properties": { - "userId": { - "type": "string", - "example": "Id" - }, - "name": { - "type": "string", - "example": "John" - }, - "email": { - "type": "string", - "example": "mail" - }, - "total": { - "type": "number", - "example": 12 - } - } - } - } - ], - "responses": { - "200": { - "description": "OK" - }, - "500": { - "description": "Internal Server Error" - } - } - } - }, - "/api/order/{id}": { - "get": { - "tags": [ - "Order" - ], - "description": "", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "type": "string" - }, - { - "name": "authorization", - "in": "header", - "required": true, - "type": "string" - } - ], - "responses": { - "200": { - "description": "OK" - }, - "401": { - "description": "Unauthorized" - }, - "404": { - "description": "Not Found" - }, - "500": { - "description": "Internal Server Error" - } - } - } - }, - "/api/order": { - "post": { - "tags": [ - "Order" - ], - "description": "", - "parameters": [ - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "type": "object", - "properties": { - "paymentId": { - "type": "string", - "example": "payment_id:1" - }, - "deliveryId": { - "type": "string", - "example": "delivery_id:1" - }, - "deliveryType": { - "$ref": "#/definitions/DeliveryType" - }, - "restaurantId": { - "type": "string", - "example": "restaurant_id:1" - } - } - } - }, - { - "name": "authorization", - "in": "header", - "required": true, - "type": "string" - } - ], - "responses": { - "200": { - "description": "OK" - }, - "401": { - "description": "Unauthorized" - }, - "404": { - "description": "Not Found" - }, - "500": { - "description": "Internal Server Error" - } - } - } - }, - "/api/order/by-user/{userId}": { - "get": { - "tags": [ - "Order" - ], - "description": "", - "parameters": [ - { - "name": "userId", - "in": "path", - "required": true, - "type": "string" - }, - { - "name": "authorization", - "in": "header", - "required": true, - "type": "string" - } - ], - "responses": { - "200": { - "description": "OK" - }, - "401": { - "description": "Unauthorized" - }, - "500": { - "description": "Internal Server Error" - } - } - } - }, - "/api/order/by-status": { - "post": { - "tags": [ - "Order" - ], - "description": "", - "parameters": [ - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "type": "object", - "properties": { - "status": { - "$ref": "#/definitions/Status" - } - } - } - }, - { - "name": "authorization", - "in": "header", - "required": true, - "type": "string" - } - ], - "responses": { - "200": { - "description": "OK" - }, - "500": { - "description": "Internal Server Error" - } - } - } - }, - "/api/order/by-delivery/{deliveryId}": { - "get": { - "tags": [ - "Order" - ], - "description": "", - "parameters": [ - { - "name": "deliveryId", - "in": "path", - "required": true, - "type": "string" - }, - { - "name": "deliveryId", - "in": "query", - "type": "string" - }, - { - "name": "authorization", - "in": "header", - "required": true, - "type": "string" - } - ], - "responses": { - "200": { - "description": "OK" - }, - "401": { - "description": "Unauthorized" - }, - "500": { - "description": "Internal Server Error" - } - } - } - }, - "/api/order/by-payment/{paymentId}": { - "get": { - "tags": [ - "Order" - ], - "description": "", - "parameters": [ - { - "name": "paymentId", - "in": "path", - "required": true, - "type": "string" - }, - { - "name": "authorization", - "in": "header", - "required": true, - "type": "string" - } - ], - "responses": { - "200": { - "description": "OK" - }, - "401": { - "description": "Unauthorized" - }, - "500": { - "description": "Internal Server Error" - } - } - } - }, - "/api/order/{orderId}": { - "put": { - "tags": [ - "Order" - ], - "description": "", - "parameters": [ - { - "name": "orderId", - "in": "path", - "required": true, - "type": "string" - }, - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "type": "object", - "properties": { - "status": { - "$ref": "#/definitions/Status" - }, - "deliveryId": { - "type": "string", - "example": "delivery_id:1" - }, - "paymentId": { - "type": "string", - "example": "payment_id:1" - }, - "restaurantId": { - "type": "string", - "example": "restaurant_id:1" - } - } - } - }, - { - "name": "authorization", - "in": "header", - "required": true, - "type": "string" - } - ], - "responses": { - "200": { - "description": "OK" - }, - "500": { - "description": "Internal Server Error" - } - } - }, - "delete": { - "tags": [ - "Order" - ], - "description": "", - "parameters": [ - { - "name": "orderId", - "in": "path", - "required": true, - "type": "string" - } - ], - "responses": { - "default": { - "description": "" - } - } - } - }, - "/api/category": { - "get": { - "tags": [ - "Order" - ], - "description": "", - "responses": { - "200": { - "description": "OK" - }, - "500": { - "description": "Internal Server Error" - } - } - }, - "post": { - "tags": [ - "Order" - ], - "description": "", - "parameters": [ - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "type": "object", - "properties": { - "label": { - "type": "string", - "example": "category-label" - }, - "icon": { - "type": "string", - "example": "category-icon" - }, - "hexaColor": { - "type": "string", - "example": "#ffffff" - } - } - } - }, - { - "name": "authorization", - "in": "header", - "required": true, - "type": "string" - } - ], - "responses": { - "201": { - "description": "Created" - }, - "500": { - "description": "Internal Server Error" - } - } - } - }, - "/api/category/{id}": { - "get": { - "tags": [ - "Order" - ], - "description": "", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "type": "string" - } - ], - "responses": { - "200": { - "description": "OK" - }, - "500": { - "description": "Internal Server Error" - } - } - }, - "put": { - "tags": [ - "Order" - ], - "description": "", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "type": "string" - }, - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "type": "object", - "properties": { - "label": { - "type": "string", - "example": "category-label" - }, - "icon": { - "type": "string", - "example": "category-icon" - }, - "hexaColor": { - "type": "string", - "example": "#ffffff" - } - } - } - }, - { - "name": "authorization", - "in": "header", - "required": true, - "type": "string" - } - ], - "responses": { - "200": { - "description": "OK" - }, - "500": { - "description": "Internal Server Error" - } - } - }, - "delete": { - "tags": [ - "Order" - ], - "description": "", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "type": "string" - }, - { - "name": "authorization", - "in": "header", - "required": true, - "type": "string" - } - ], - "responses": { - "200": { - "description": "OK" - }, - "500": { - "description": "Internal Server Error" - } - } - } - }, - "/api/allergen": { - "get": { - "tags": [ - "Order" - ], - "description": "", - "responses": { - "200": { - "description": "OK" - }, - "500": { - "description": "Internal Server Error" - } - } - }, - "post": { - "tags": [ - "Order" - ], - "description": "", - "parameters": [ - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "type": "object", - "properties": { - "label": { - "type": "string", - "example": "allergen-label" - } - } - } - }, - { - "name": "authorization", - "in": "header", - "required": true, - "type": "string" - } - ], - "responses": { - "201": { - "description": "Created" - }, - "500": { - "description": "Internal Server Error" - } - } - } - }, - "/api/allergen/{id}": { - "get": { - "tags": [ - "Order" - ], - "description": "", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "type": "string" - } - ], - "responses": { - "200": { - "description": "OK" - }, - "500": { - "description": "Internal Server Error" - } - } - }, - "put": { - "tags": [ - "Order" - ], - "description": "", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "type": "string" - }, - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "type": "object", - "properties": { - "label": { - "type": "string", - "example": "allergen-label" - } - } - } - }, - { - "name": "authorization", - "in": "header", - "required": true, - "type": "string" - } - ], - "responses": { - "200": { - "description": "OK" - }, - "500": { - "description": "Internal Server Error" - } - } - }, - "delete": { - "tags": [ - "Order" - ], - "description": "", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "type": "string" - }, - { - "name": "authorization", - "in": "header", - "required": true, - "type": "string" - } - ], - "responses": { - "200": { - "description": "OK" - }, - "500": { - "description": "Internal Server Error" - } - } - } - }, - "/api/product/by-restaurant/{id}": { - "get": { - "tags": [ - "Product" - ], - "description": "", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "type": "string" - } - ], - "responses": { - "200": { - "description": "OK" - }, - "500": { - "description": "Internal Server Error" - } - } - } - }, - "/api/product/{id}": { - "get": { - "tags": [ - "Product" - ], - "description": "", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "type": "string" - } - ], - "responses": { - "200": { - "description": "OK" - }, - "500": { - "description": "Internal Server Error" - } - } - }, - "delete": { - "tags": [ - "Product" - ], - "description": "", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "type": "string" - }, - { - "name": "authorization", - "in": "header", - "required": true, - "type": "string" - } - ], - "responses": { - "200": { - "description": "OK" - }, - "500": { - "description": "Internal Server Error" - } - } - }, - "put": { - "tags": [ - "Product" - ], - "description": "", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "type": "string" - }, - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "type": "object", - "properties": { - "restaurantId": { - "type": "number", - "example": 0 - }, - "type": { - "type": "string", - "example": "type" - }, - "name": { - "type": "string", - "example": "name" - }, - "image": { - "type": "string", - "example": "image" - }, - "comment": { - "type": "string", - "example": "comment" - }, - "price": { - "type": "number", - "example": 0 - }, - "preparation": { - "type": "string", - "example": "preparation" - }, - "weight": { - "type": "string", - "example": "weight" - }, - "kilocalories": { - "type": "string", - "example": "0" - }, - "nutriscore": { - "type": "number", - "example": 0 - }, - "categories": { - "type": "array", - "items": { - "type": "object", - "properties": { - "label": { - "type": "string", - "example": "category-label" - }, - "icon": { - "type": "string", - "example": "category-icon" - }, - "hexaColor": { - "type": "string", - "example": "#ffffff" - } - } - } - }, - "allergens": { - "type": "array", - "items": { - "type": "object", - "properties": { - "label": { - "type": "string", - "example": "allergen-label" - } - } - } - } - } - } - }, - { - "name": "authorization", - "in": "header", - "required": true, - "type": "string" - } - ], - "responses": { - "200": { - "description": "OK" - }, - "500": { - "description": "Internal Server Error" - } - } - } - }, - "/api/product/type": { - "get": { - "tags": [ - "Product" - ], - "description": "", - "responses": { - "200": { - "description": "OK" - }, - "500": { - "description": "Internal Server Error" - } - } - } - }, - "/api/product": { - "post": { - "tags": [ - "Product" - ], - "description": "", - "parameters": [ - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "type": "object", - "properties": { - "restaurantId": { - "type": "number", - "example": 0 - }, - "type": { - "$ref": "#/definitions/ProductType" - }, - "name": { - "type": "string", - "example": "name" - }, - "image": { - "type": "string", - "example": "image" - }, - "comment": { - "type": "string", - "example": "comment" - }, - "price": { - "type": "number", - "example": 0 - }, - "preparation": { - "type": "string", - "example": "preparation" - }, - "weight": { - "type": "string", - "example": "weight" - }, - "kilocalories": { - "type": "string", - "example": "0" - }, - "nutriscore": { - "type": "number", - "example": 0 - }, - "categoryIds": { - "type": "array", - "items": { - "type": "object", - "properties": { - "id": { - "type": "string", - "example": "category:id" - } - } - } - }, - "allergenIds": { - "type": "array", - "items": { - "type": "object", - "properties": { - "id": { - "type": "string", - "example": "allergen:id" - } - } - } - } - } - } - }, - { - "name": "authorization", - "in": "header", - "required": true, - "type": "string" - } - ], - "responses": { - "201": { - "description": "Created" - }, - "500": { - "description": "Internal Server Error" - } - } - } - }, - "/api/product/image": { - "post": { - "tags": [ - "Product" - ], - "description": "", - "parameters": [ - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "type": "object", - "properties": { - "input_file": { - "type": "function" - } - } - } - }, - { - "name": "authorization", - "in": "header", - "required": true, - "type": "string" - } - ], - "responses": { - "200": { - "description": "OK" - }, - "500": { - "description": "Internal Server Error" - } - } - } - }, - "/api/restaurant/{id}": { - "get": { - "tags": [ - "Restaurant" - ], - "description": "", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "type": "string" - } - ], - "responses": { - "200": { - "description": "OK" - }, - "500": { - "description": "Internal Server Error" - } - } - }, - "put": { - "tags": [ - "Restaurant" - ], - "description": "", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "type": "string" - }, - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "type": "object", - "properties": { - "name": { - "type": "string", - "example": "restaurant-name" - }, - "description": { - "type": "string", - "example": "restaurant-desc" - }, - "locationList": { - "type": "array", - "example": [ - 1.099, - 49.443 - ], - "items": { - "type": "number" - } - }, - "address": { - "type": "string", - "example": "restaurant-address" - }, - "openingHoursList": { - "type": "array", - "example": [ - "12h-14h", - "19h-22h" - ], - "items": { - "type": "string" - } - }, - "phone": { - "type": "string", - "example": "restaurant-phone" - } - } - } - }, - { - "name": "authorization", - "in": "header", - "required": true, - "type": "string" - } - ], - "responses": { - "200": { - "description": "OK" - }, - "500": { - "description": "Internal Server Error" - } - } - }, - "delete": { - "tags": [ - "Restaurant" - ], - "description": "", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "type": "string" - }, - { - "name": "authorization", - "in": "header", - "required": true, - "type": "string" - } - ], - "responses": { - "200": { - "description": "OK" - }, - "500": { - "description": "Internal Server Error" - } - } - } - }, - "/api/restaurant": { - "get": { - "tags": [ - "Restaurant" - ], - "description": "", - "responses": { - "200": { - "description": "OK" - }, - "500": { - "description": "Internal Server Error" - } - } - }, - "post": { - "tags": [ - "Restaurant" - ], - "description": "", - "parameters": [ - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "type": "object", - "properties": { - "name": { - "type": "string", - "example": "restaurant-name" - }, - "description": { - "type": "string", - "example": "restaurant-desc" - }, - "locationList": { - "type": "array", - "example": [ - 1.099, - 49.443 - ], - "items": { - "type": "number" - } - }, - "address": { - "type": "string", - "example": "restaurant-address" - }, - "openingHoursList": { - "type": "array", - "example": [ - "12h-14h", - "19h-22h" - ], - "items": { - "type": "string" - } - }, - "phone": { - "type": "string", - "example": "restaurant-phone" - } - } - } - }, - { - "name": "authorization", - "in": "header", - "required": true, - "type": "string" - } - ], - "responses": { - "201": { - "description": "Created" - }, - "500": { - "description": "Internal Server Error" - } - } - } - }, - "/api/restaurant/by-location": { - "post": { - "tags": [ - "Restaurant" - ], - "description": "", - "parameters": [ - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "type": "object", - "properties": { - "locationList": { - "type": "array", - "example": [ - 1.099, - 49.443 - ], - "items": { - "type": "number" - } - } - } - } - } - ], - "responses": { - "200": { - "description": "OK" - }, - "500": { - "description": "Internal Server Error" - } - } - } - }, - "/api/delivery/{id}": { - "get": { - "tags": [ - "Delivery" - ], - "description": "", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "type": "string" - }, - { - "name": "authorization", - "in": "header", - "required": true, - "type": "string" - } - ], - "responses": { - "200": { - "description": "OK" - }, - "401": { - "description": "Unauthorized" - }, - "500": { - "description": "Internal Server Error" - } - } - }, - "put": { - "tags": [ - "Delivery" - ], - "description": "", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "type": "string" - }, - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "type": "object", - "properties": { - "eta": { - "type": "string", - "example": "2022-01-01T00:00:00.000Z" - }, - "address": { - "type": "string", - "example": "10 Rue de la République, 75003 Paris, France" - }, - "status": { - "$ref": "#/definitions/Status" - }, - "deliveryPersonId": { - "type": "string", - "example": "cllcdmeci0000pm01su98mxtb" - }, - "userId": { - "type": "string", - "example": "user_id:1" - }, - "restaurantId": { - "type": "string", - "example": "restaurant_id:1" - } - } - } - }, - { - "name": "authorization", - "in": "header", - "required": true, - "type": "string" - } - ], - "responses": { - "200": { - "description": "OK" - }, - "400": { - "description": "Bad Request" - }, - "401": { - "description": "Unauthorized" - }, - "500": { - "description": "Internal Server Error" - } - } - }, - "delete": { - "tags": [ - "Delivery" - ], - "description": "", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "type": "string" - }, - { - "name": "authorization", - "in": "header", - "required": true, - "type": "string" - } - ], - "responses": { - "200": { - "description": "OK" - }, - "401": { - "description": "Unauthorized" - }, - "500": { - "description": "Internal Server Error" - } - } - } - }, - "/api/delivery/by-restaurant/{id}": { - "get": { - "tags": [ - "Delivery" - ], - "description": "", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "type": "string" - }, - { - "name": "authorization", - "in": "header", - "required": true, - "type": "string" - } - ], - "responses": { - "200": { - "description": "OK" - }, - "500": { - "description": "Internal Server Error" - } - } - } - }, - "/api/delivery/by-user": { - "get": { - "tags": [ - "Delivery" - ], - "description": "", - "parameters": [ - { - "name": "authorization", - "in": "header", - "required": true, - "type": "string" - } - ], - "responses": { - "200": { - "description": "OK" - }, - "401": { - "description": "Unauthorized" - }, - "500": { - "description": "Internal Server Error" - } - } - } - }, - "/api/delivery": { - "post": { - "tags": [ - "Delivery" - ], - "description": "", - "parameters": [ - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "type": "object", - "properties": { - "eta": { - "type": "string", - "example": "2022-01-01T00:00:00.000Z" - }, - "address": { - "type": "string", - "example": "10 Rue de la République, 75003 Paris, France" - }, - "status": { - "$ref": "#/definitions/Status" - }, - "deliveryPersonId": { - "type": "string", - "example": "cllcdmeci0000pm01su98mxtb" - }, - "restaurantId": { - "type": "string", - "example": "restaurant_id:1" - } - } - } - }, - { - "name": "authorization", - "in": "header", - "required": true, - "type": "string" - } - ], - "responses": { - "201": { - "description": "Created" - }, - "400": { - "description": "Bad Request" - }, - "401": { - "description": "Unauthorized" - }, - "500": { - "description": "Internal Server Error" - } - } - } - }, - "/api/delivery-person/{id}": { - "get": { - "tags": [ - "Delivery" - ], - "description": "", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "type": "string" - }, - { - "name": "authorization", - "in": "header", - "type": "string" - } - ], - "responses": { - "200": { - "description": "OK" - }, - "401": { - "description": "Unauthorized" - }, - "500": { - "description": "Internal Server Error" - } - } - }, - "put": { - "tags": [ - "Delivery" - ], - "description": "", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "type": "string" - }, - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "type": "object", - "properties": { - "firstName": { - "type": "string", - "example": "John" - }, - "lastName": { - "type": "string", - "example": "Doe" - }, - "phone": { - "type": "string", - "example": "0612345678" - }, - "locationList": { - "type": "array", - "example": [ - 41.40338, - 2.17403 - ], - "items": { - "type": "number" - } - } - } - } - }, - { - "name": "authorization", - "in": "header", - "required": true, - "type": "string" - } - ], - "responses": { - "200": { - "description": "OK" - }, - "500": { - "description": "Internal Server Error" - } - } - }, - "delete": { - "tags": [ - "Delivery" - ], - "description": "", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "type": "string" - }, - { - "name": "authorization", - "in": "header", - "required": true, - "type": "string" - } - ], - "responses": { - "200": { - "description": "OK" - }, - "500": { - "description": "Internal Server Error" - } - } - } - }, - "/api/delivery-person": { - "get": { - "tags": [ - "Delivery" - ], - "description": "", - "parameters": [ - { - "name": "authorization", - "in": "header", - "required": true, - "type": "string" - } - ], - "responses": { - "200": { - "description": "OK" - }, - "500": { - "description": "Internal Server Error" - } - } - }, - "post": { - "tags": [ - "Delivery" - ], - "description": "", - "parameters": [ - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "type": "object", - "properties": { - "firstName": { - "type": "string", - "example": "John" - }, - "lastName": { - "type": "string", - "example": "Doe" - }, - "phone": { - "type": "string", - "example": "0612345678" - }, - "locationList": { - "type": "array", - "example": [ - 41.40338, - 2.17403 - ], - "items": { - "type": "number" - } - } - } - } - }, - { - "name": "authorization", - "in": "header", - "required": true, - "type": "string" - } - ], - "responses": { - "201": { - "description": "Created" - }, - "500": { - "description": "Internal Server Error" - } - } - } - }, - "/api/delivery-person/near": { - "get": { - "tags": [ - "Delivery" - ], - "description": "", - "parameters": [ - { - "name": "authorization", - "in": "header", - "type": "string" - }, - { - "name": "lat", - "in": "query", - "required": true, - "type": "integer" - }, - { - "name": "lng", - "in": "query", - "required": true, - "type": "integer" - } - ], - "responses": { - "200": { - "description": "OK" - }, - "401": { - "description": "Unauthorized" - }, - "500": { - "description": "Internal Server Error" - } - } - } - }, - "/api/log": { - "get": { - "tags": [ - "Log" - ], - "description": "", - "parameters": [ - { - "name": "authorization", - "in": "header", - "required": true, - "type": "string" - } - ], - "responses": { - "200": { - "description": "OK" - }, - "500": { - "description": "Internal Server Error" - } - } - } - }, - "/api/log/{id}": { - "get": { - "tags": [ - "Log" - ], - "description": "", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "type": "number" - }, - { - "name": "authorization", - "in": "header", - "required": true, - "type": "string" - } - ], - "responses": { - "200": { - "description": "OK" - }, - "500": { - "description": "Internal Server Error" - } - } - } - }, - "/api/metric/{key}": { - "get": { - "tags": [ - "Metric" - ], - "description": "", - "parameters": [ - { - "name": "key", - "in": "path", - "required": true, - "type": "string" - }, - { - "name": "authorization", - "in": "header", - "required": true, - "type": "string" - } - ], - "responses": { - "200": { - "description": "OK" - }, - "500": { - "description": "Internal Server Error" - } - } - } - }, - "/api/metric/by-restaurant-and-date": { - "post": { - "tags": [ - "Metric" - ], - "description": "", - "parameters": [ - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "type": "object", - "properties": { - "restaurantId": { - "type": "string", - "example": "restaurant_id:1" - }, - "date": { - "type": "string", - "example": "2022-01-01T00:00:00.000Z" - } - } - } - }, - { - "name": "authorization", - "in": "header", - "required": true, - "type": "string" - } - ], - "responses": { - "200": { - "description": "OK" - }, - "500": { - "description": "Internal Server Error" - } - } - } - }, - "/api/metric/by-restaurant/{restaurantId}": { - "get": { - "tags": [ - "Metric" - ], - "description": "", - "parameters": [ - { - "name": "restaurantId", - "in": "path", - "required": true, - "type": "string" - }, - { - "name": "authorization", - "in": "header", - "required": true, - "type": "string" - } - ], - "responses": { - "200": { - "description": "OK" - }, - "500": { - "description": "Internal Server Error" - } - } - } - }, - "/api/metric/by-restaurant-group/{restaurantGroupId}": { - "get": { - "tags": [ - "Metric" - ], - "description": "", - "parameters": [ - { - "name": "restaurantGroupId", - "in": "path", - "required": true, - "type": "string" - }, - { - "name": "authorization", - "in": "header", - "required": true, - "type": "string" - } - ], - "responses": { - "200": { - "description": "OK" - }, - "500": { - "description": "Internal Server Error" - } - } - } - }, - "/api/metric/restaurant/{restaurantId}": { - "get": { - "tags": [ - "Metric" - ], - "description": "", - "parameters": [ - { - "name": "restaurantId", - "in": "path", - "required": true, - "type": "string" - }, - { - "name": "authorization", - "in": "header", - "required": true, - "type": "string" - } - ], - "responses": { - "200": { - "description": "OK" - }, - "500": { - "description": "Internal Server Error" - } - } - }, - "put": { - "tags": [ - "Metric" - ], - "description": "", - "parameters": [ - { - "name": "restaurantId", - "in": "path", - "required": true, - "type": "string" - }, - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "type": "object", - "properties": { - "name": { - "type": "string", - "example": "example_name" - }, - "key": { - "type": "string", - "example": "example_key" - }, - "address": { - "type": "string", - "example": "example_address" - }, - "group_id": { - "type": "number", - "example": 1 - } - } - } - }, - { - "name": "authorization", - "in": "header", - "required": true, - "type": "string" - } - ], - "responses": { - "200": { - "description": "OK" - }, - "500": { - "description": "Internal Server Error" - } - } - }, - "delete": { - "tags": [ - "Metric" - ], - "description": "", - "parameters": [ - { - "name": "restaurantId", - "in": "path", - "required": true, - "type": "string" - }, - { - "name": "authorization", - "in": "header", - "required": true, - "type": "string" - } - ], - "responses": { - "200": { - "description": "OK" - }, - "500": { - "description": "Internal Server Error" - } - } - } - }, - "/api/metric/restaurant-group/{restaurantGroupId}": { - "get": { - "tags": [ - "Metric" - ], - "description": "", - "parameters": [ - { - "name": "restaurantGroupId", - "in": "path", - "required": true, - "type": "integer" - } - ], - "responses": { - "200": { - "description": "OK" - }, - "500": { - "description": "Internal Server Error" - } - } - }, - "put": { - "tags": [ - "Metric" - ], - "description": "", - "parameters": [ - { - "name": "restaurantGroupId", - "in": "path", - "required": true, - "type": "integer" - }, - { - "name": "restaurantGroupId", - "in": "query", - "type": "string" - }, - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "type": "object", - "properties": { - "name": { - "type": "string", - "example": "example_name" - } - } - } - }, - { - "name": "authorization", - "in": "header", - "required": true, - "type": "string" - } - ], - "responses": { - "200": { - "description": "OK" - }, - "500": { - "description": "Internal Server Error" - } - } - }, - "delete": { - "tags": [ - "Metric" - ], - "description": "", - "parameters": [ - { - "name": "restaurantGroupId", - "in": "path", - "required": true, - "type": "integer" - }, - { - "name": "authorization", - "in": "header", - "required": true, - "type": "string" - } - ], - "responses": { - "200": { - "description": "OK" - }, - "500": { - "description": "Internal Server Error" - } - } - } - }, - "/api/metric/restaurant": { - "post": { - "tags": [ - "Metric" - ], - "description": "", - "parameters": [ - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "type": "object", - "properties": { - "name": { - "type": "string", - "example": "example_name" - }, - "key": { - "type": "string", - "example": "example_key" - }, - "address": { - "type": "string", - "example": "example_address" - }, - "group_id": { - "type": "number", - "example": 1 - } - } - } - }, - { - "name": "authorization", - "in": "header", - "required": true, - "type": "string" - } - ], - "responses": { - "201": { - "description": "Created" - }, - "500": { - "description": "Internal Server Error" - } - } - } - }, - "/api/metric/restaurant-group": { - "post": { - "tags": [ - "Metric" - ], - "description": "", - "parameters": [ - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "type": "object", - "properties": { - "name": { - "type": "string", - "example": "example_name" - } - } - } - }, - { - "name": "authorization", - "in": "header", - "required": true, - "type": "string" - } - ], - "responses": { - "201": { - "description": "Created" - }, - "500": { - "description": "Internal Server Error" - } - } - } - }, - "/api/metric": { - "post": { - "tags": [ - "Metric" - ], - "description": "", - "parameters": [ - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "type": "object", - "properties": { - "restaurantId": { - "type": "string", - "example": "restaurant_id:1" - }, - "code": { - "type": "string", - "example": "income_1h" - }, - "value": { - "type": "string", - "example": "99.99" - }, - "key": { - "type": "string", - "example": "example_key" - } - } - } - }, - { - "name": "authorization", - "in": "header", - "required": true, - "type": "string" - } - ], - "responses": { - "201": { - "description": "Created" - }, - "500": { - "description": "Internal Server Error" - } - } - } - }, - "/api/promotion/{code}": { - "get": { - "tags": [ - "Promotion" - ], - "description": "", - "parameters": [ - { - "name": "code", - "in": "path", - "required": true, - "type": "string" - }, - { - "name": "authorization", - "in": "header", - "required": true, - "type": "string" - } - ], - "responses": { - "200": { - "description": "OK" - }, - "401": { - "description": "Unauthorized" - }, - "500": { - "description": "Internal Server Error" - } - } - } - }, - "/api/promotion": { - "get": { - "tags": [ - "Promotion" - ], - "description": "", - "responses": { - "200": { - "description": "OK" - }, - "500": { - "description": "Internal Server Error" - } - } - }, - "post": { - "tags": [ - "Promotion" - ], - "description": "", - "parameters": [ - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "type": "object", - "properties": { - "code": { - "type": "string", - "example": "code-example" - }, - "reduction": { - "type": "string", - "example": "reduction-example" - }, - "method": { - "$ref": "#/definitions/Method" - }, - "restaurantId": { - "type": "string", - "example": "restaurant_id:0" - } - } - } - }, - { - "name": "authorization", - "in": "header", - "required": true, - "type": "string" - } - ], - "responses": { - "201": { - "description": "Created" - }, - "500": { - "description": "Internal Server Error" - } - } - } - }, - "/api/promotion/by-restaurant/{restaurantId}": { - "get": { - "tags": [ - "Promotion" - ], - "description": "", - "parameters": [ - { - "name": "restaurantId", - "in": "path", - "required": true, - "type": "string" - }, - { - "name": "authorization", - "in": "header", - "required": true, - "type": "string" - } - ], - "responses": { - "200": { - "description": "OK" - }, - "401": { - "description": "Unauthorized" - }, - "500": { - "description": "Internal Server Error" - } - } - } - }, - "/api/promotion/{id}": { - "put": { - "tags": [ - "Promotion" - ], - "description": "", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "type": "string" - }, - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "type": "object", - "properties": { - "code": { - "type": "string", - "example": "code-example" - }, - "reduction": { - "type": "string", - "example": "reduction-example" - }, - "method": { - "$ref": "#/definitions/Method" - }, - "restaurantId": { - "type": "string", - "example": "restaurant_id:0" - } - } - } - }, - { - "name": "authorization", - "in": "header", - "required": true, - "type": "string" - } - ], - "responses": { - "200": { - "description": "OK" - }, - "500": { - "description": "Internal Server Error" - } - } - }, - "delete": { - "tags": [ - "Promotion" - ], - "description": "", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "type": "string" - }, - { - "name": "authorization", - "in": "header", - "required": true, - "type": "string" - } - ], - "responses": { - "200": { - "description": "OK" - }, - "500": { - "description": "Internal Server Error" - } - } - } - }, - "/api/stock/supplier/{id}": { - "get": { - "tags": [ - "Stock" - ], - "description": "", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "type": "integer" - } - ], - "responses": { - "200": { - "description": "OK" - }, - "500": { - "description": "Internal Server Error" - } - } - }, - "put": { - "tags": [ - "Stock" - ], - "description": "", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "type": "integer" - }, - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "type": "object", - "properties": { - "name": { - "type": "string", - "example": "supplier-name" - }, - "contact": { - "type": "string", - "example": "supplier-contact" - } - } - } - } - ], - "responses": { - "200": { - "description": "OK" - }, - "500": { - "description": "Internal Server Error" - } - } - }, - "delete": { - "tags": [ - "Stock" - ], - "description": "", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "type": "integer" - } - ], - "responses": { - "200": { - "description": "OK" - }, - "500": { - "description": "Internal Server Error" - } - } - } - }, - "/api/stock/supplier": { - "get": { - "tags": [ - "Stock" - ], - "description": "", - "responses": { - "200": { - "description": "OK" - }, - "500": { - "description": "Internal Server Error" - } - } - }, - "post": { - "tags": [ - "Stock" - ], - "description": "", - "parameters": [ - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "type": "object", - "properties": { - "name": { - "type": "string", - "example": "supplier-name" - }, - "contact": { - "type": "string", - "example": "supplier-contact" - } - } - } - } - ], - "responses": { - "200": { - "description": "OK" - }, - "500": { - "description": "Internal Server Error" - } - } - } - }, - "/api/stock/ingredient/{id}": { - "get": { - "tags": [ - "Stock" - ], - "description": "", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "type": "integer" - } - ], - "responses": { - "200": { - "description": "OK" - }, - "500": { - "description": "Internal Server Error" - } - } - }, - "put": { - "tags": [ - "Stock" - ], - "description": "", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "type": "integer" - }, - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "type": "object", - "properties": { - "name": { - "type": "string", - "example": "ingredient-name" - }, - "description": { - "type": "string", - "example": "ingredient-desc" - } - } - } - } - ], - "responses": { - "200": { - "description": "OK" - }, - "500": { - "description": "Internal Server Error" - } - } - }, - "delete": { - "tags": [ - "Stock" - ], - "description": "", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "type": "integer" - } - ], - "responses": { - "200": { - "description": "OK" - }, - "500": { - "description": "Internal Server Error" - } - } - } - }, - "/api/stock/ingredient": { - "get": { - "tags": [ - "Stock" - ], - "description": "", - "responses": { - "200": { - "description": "OK" - }, - "500": { - "description": "Internal Server Error" - } - } - }, - "post": { - "tags": [ - "Stock" - ], - "description": "", - "parameters": [ - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "type": "object", - "properties": { - "name": { - "type": "string", - "example": "ingredient-name" - }, - "description": { - "type": "string", - "example": "ingredient-desc" - } - } - } - } - ], - "responses": { - "200": { - "description": "OK" - }, - "500": { - "description": "Internal Server Error" - } - } - } - }, - "/api/stock/ingredient/restaurant/{id}": { - "get": { - "tags": [ - "Stock" - ], - "description": "", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "type": "integer" - } - ], - "responses": { - "200": { - "description": "OK" - }, - "500": { - "description": "Internal Server Error" - } - } - }, - "put": { - "tags": [ - "Stock" - ], - "description": "", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "type": "integer" - }, - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "type": "object", - "properties": { - "alertThreshold": { - "type": "number", - "example": 5 - }, - "quantity": { - "type": "number", - "example": 2 - }, - "productList": { - "type": "array", - "example": [ - "product_id:1", - "product_id:2" - ], - "items": { - "type": "string" - } - }, - "unitPrice": { - "type": "number", - "example": 2 - }, - "pricePerKilo": { - "type": "number", - "example": 1.5 - }, - "restaurantId": { - "type": "string", - "example": "restaurant_id:1" - }, - "ingredientId": { - "type": "number", - "example": 1 - } - } - } - } - ], - "responses": { - "200": { - "description": "OK" - }, - "500": { - "description": "Internal Server Error" - } - } - }, - "delete": { - "tags": [ - "Stock" - ], - "description": "", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "type": "integer" - } - ], - "responses": { - "200": { - "description": "OK" - }, - "500": { - "description": "Internal Server Error" - } - } - } - }, - "/api/stock/ingredient/restaurant/by-restaurant/{id}": { - "get": { - "tags": [ - "Stock" - ], - "description": "", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "type": "string" - } - ], - "responses": { - "200": { - "description": "OK" - }, - "500": { - "description": "Internal Server Error" - } - } - } - }, - "/api/stock/ingredient/restaurant/by-product/{id}": { - "get": { - "tags": [ - "Stock" - ], - "description": "", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "type": "string" - } - ], - "responses": { - "200": { - "description": "OK" - }, - "500": { - "description": "Internal Server Error" - } - } - } - }, - "/api/stock/ingredient/restaurant": { - "post": { - "tags": [ - "Stock" - ], - "description": "", - "parameters": [ - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "type": "object", - "properties": { - "alertThreshold": { - "type": "number", - "example": 5 - }, - "quantity": { - "type": "number", - "example": 2 - }, - "productList": { - "type": "array", - "example": [ - "product_id:1", - "product_id:2" - ], - "items": { - "type": "string" - } - }, - "unitPrice": { - "type": "number", - "example": 2 - }, - "pricePerKilo": { - "type": "number", - "example": 1.5 - }, - "restaurantId": { - "type": "string", - "example": "restaurant_id:1" - }, - "ingredientId": { - "type": "number", - "example": 1 - } - } - } - } - ], - "responses": { - "200": { - "description": "OK" - }, - "500": { - "description": "Internal Server Error" - } - } - } - }, - "/api/stock/supply/order/{id}": { - "get": { - "tags": [ - "Stock" - ], - "description": "", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "type": "integer" - } - ], - "responses": { - "200": { - "description": "OK" - }, - "500": { - "description": "Internal Server Error" - } - } - }, - "put": { - "tags": [ - "Stock" - ], - "description": "", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "type": "integer" - }, - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "type": "object", - "properties": { - "quantity": { - "type": "number", - "example": 3 - }, - "ingredientRestaurantId": { - "type": "number", - "example": 1 - }, - "supplierId": { - "type": "number", - "example": 1 - } - } - } - } - ], - "responses": { - "200": { - "description": "OK" - }, - "500": { - "description": "Internal Server Error" - } - } - }, - "delete": { - "tags": [ - "Stock" - ], - "description": "", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "type": "integer" - } - ], - "responses": { - "200": { - "description": "OK" - }, - "500": { - "description": "Internal Server Error" - } - } - } - }, - "/api/stock/supply/order/by-restaurant/{id}": { - "get": { - "tags": [ - "Stock" - ], - "description": "", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "type": "string" - } - ], - "responses": { - "200": { - "description": "OK" - }, - "500": { - "description": "Internal Server Error" - } - } - } - }, - "/api/stock/supply/order/by-supplier/{id}": { - "get": { - "tags": [ - "Stock" - ], - "description": "", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "type": "integer" - } - ], - "responses": { - "200": { - "description": "OK" - }, - "500": { - "description": "Internal Server Error" - } - } - } - }, - "/api/stock/supply/order/by-ingredient-restaurant/{id}": { - "get": { - "tags": [ - "Stock" - ], - "description": "", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "type": "integer" - } - ], - "responses": { - "200": { - "description": "OK" - }, - "500": { - "description": "Internal Server Error" - } - } - } - }, - "/api/stock/supply/order": { - "post": { - "tags": [ - "Stock" - ], - "description": "", - "parameters": [ - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "type": "object", - "properties": { - "quantity": { - "type": "number", - "example": 3 - }, - "ingredientRestaurantId": { - "type": "number", - "example": 1 - }, - "supplierId": { - "type": "number", - "example": 1 - } - } - } - } - ], - "responses": { - "200": { - "description": "OK" - }, - "500": { - "description": "Internal Server Error" - } - } - } - }, - "/api/stock/outcomes/by-restaurant/{id}": { - "post": { - "tags": [ - "Stock" - ], - "description": "", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "type": "string" - }, - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "type": "object", - "properties": { - "date": { - "type": "string", - "example": "2022-01-01T00:00:00.000Z" - }, - "interval": { - "type": "string", - "example": "interval-example" - } - } - } - } - ], - "responses": { - "200": { - "description": "OK" - }, - "500": { - "description": "Internal Server Error" - } - } - } - }, - "/api/notification/by-message-type": { - "post": { - "tags": [ - "Notification" - ], - "description": "", - "parameters": [ - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "type": "object", - "properties": { - "messageType": { - "$ref": "#/definitions/MessageType" - } - } - } - } - ], - "responses": { - "200": { - "description": "OK" - }, - "500": { - "description": "Internal Server Error" - } - } - } - }, - "/api/notification/{id}": { - "get": { - "tags": [ - "Notification" - ], - "description": "", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "type": "string" - } - ], - "responses": { - "200": { - "description": "OK" - }, - "500": { - "description": "Internal Server Error" - } - } - }, - "put": { - "tags": [ - "Notification" - ], - "description": "", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "type": "string" - }, - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "type": "object", - "properties": { - "title": { - "type": "string", - "example": "notification-title" - }, - "message": { - "type": "string", - "example": "notification-message" - }, - "messageType": { - "$ref": "#/definitions/MessageType" - } - } - } - }, - { - "name": "authorization", - "in": "header", - "required": true, - "type": "string" - } - ], - "responses": { - "200": { - "description": "OK" - }, - "500": { - "description": "Internal Server Error" - } - } - }, - "delete": { - "tags": [ - "Notification" - ], - "description": "", - "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "type": "string" - }, - { - "name": "authorization", - "in": "header", - "required": true, - "type": "string" - } - ], - "responses": { - "200": { - "description": "OK" - }, - "500": { - "description": "Internal Server Error" - } - } - } - }, - "/api/notification": { - "post": { - "tags": [ - "Notification" - ], - "description": "", - "parameters": [ - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "type": "object", - "properties": { - "title": { - "type": "string", - "example": "notification-title" - }, - "message": { - "type": "string", - "example": "notification-message" - }, - "messageType": { - "$ref": "#/definitions/MessageType" - } - } - } - }, - { - "name": "authorization", - "in": "header", - "required": true, - "type": "string" - } - ], - "responses": { - "200": { - "description": "OK" - }, - "500": { - "description": "Internal Server Error" - } - } - } - } - }, + "paths": {}, "definitions": { "Status": { "type": "string", diff --git a/services/gateway/src/server.ts b/services/gateway/src/server.ts index 541f5201..d64c919e 100644 --- a/services/gateway/src/server.ts +++ b/services/gateway/src/server.ts @@ -56,18 +56,18 @@ app.use( // #swagger.tags = ['Order'] ); app.use( - "/", - categoryRoutes, - // #swagger.tags = ['Order'] + "/", + productRoutes, + // #swagger.tags = ['Product'] ); app.use( "/", - allergenRoutes, - // #swagger.tags = ['Order'] + categoryRoutes, + // #swagger.tags = ['Product'] ); app.use( "/", - productRoutes, + allergenRoutes, // #swagger.tags = ['Product'] ); app.use( From 35e9c5bba40301c0600c3e45e566c1d40e13f19c Mon Sep 17 00:00:00 2001 From: Florian LEROUX Date: Sun, 27 Aug 2023 12:36:52 +0200 Subject: [PATCH 493/883] feat(mainAddress): add auth checkguards in routes --- .../controller/user/mainAddress.controller.ts | 94 ++++++++++++------- 1 file changed, 59 insertions(+), 35 deletions(-) diff --git a/services/gateway/src/controller/user/mainAddress.controller.ts b/services/gateway/src/controller/user/mainAddress.controller.ts index 0f8469ae..9bee4930 100644 --- a/services/gateway/src/controller/user/mainAddress.controller.ts +++ b/services/gateway/src/controller/user/mainAddress.controller.ts @@ -1,46 +1,72 @@ import { Request, Response, Router } from "express"; import { mainAddressServiceClient } from "@gateway/services/clients/user.client"; import { MainAddress, MainAddressId, MainAddressUpdateInput } from "@gateway/proto/user_pb"; +import { getUserIdFromToken } from "@gateway/services/user.service"; +import { check } from "@gateway/middleware/auth"; export const mainAddressRoutes = Router(); mainAddressRoutes.get("/api/user/main-address/:id", async (req: Request, res: Response) => { - /* #swagger.parameters['id'] = { - in: 'path', - required: true, - type: 'integer' - }*/ + /* #swagger.parameters['id'] = { + in: 'path', + required: true, + type: 'integer' + } + #swagger.parameters['authorization'] = { + in: 'header', + required: true, + type: 'string' + } + */ + + // Auth check and :id check --- + const { authorization } = req.headers; + if (!authorization) return res.status(401).json({ message: "Unauthorized" }); + const token = authorization.split("Bearer ")[1]; + const userId = await getUserIdFromToken(token); + if (!userId) return res.status(401).json({ message: "Unauthorized" }); + if (!(await check(token, { id: userId }))) return res.status(401).json({ message: "Unauthorized" }); + // ---------------------------- + const { id } = req.params; - mainAddressServiceClient.getMainAddress(new MainAddressId().setId(Number(id)), (err, response) => { - if (err) { - return res.status(500).json({ message: err.message }); - } - return res.json(response.toObject()); + mainAddressServiceClient.getMainAddress(new MainAddressId().setId(Number(id)), (error, response) => { + if (error) return res.status(500).send({ error }); + else return res.status(200).json(response.toObject()); }); }); mainAddressRoutes.put("/api/user/main-address/:id", async (req: Request, res: Response) => { - /* #swagger.parameters['id'] = { - in: 'path', - required: true, - type: 'integer' - } - #swagger.parameters['body'] = { - in: 'body', - required: true, - schema: { - country: "France", - zipCode: "76000", - street: "7 rue de la paix", - lat: 49.443232, - lng: 1.099971 - } - } */ + /* #swagger.parameters['id'] = { + in: 'path', + required: true, + type: 'integer' + } + #swagger.parameters['body'] = { + in: 'body', + required: true, + schema: { + country: "France", + zipCode: "76000", + street: "7 rue de la paix", + lat: 49.443232, + lng: 1.099971 + } + } + #swagger.parameters['authorization'] = { + in: 'header', + required: true, + type: 'string' + } + */ + + // Auth check and :id check --- const { authorization } = req.headers; - if (!authorization) { - res.json({ error: "Not authorized" }); - return; - } + if (!authorization) return res.status(401).json({ message: "Unauthorized" }); + const token = authorization.split("Bearer ")[1]; + const userId = await getUserIdFromToken(token); + if (!userId) return res.status(401).json({ message: "Unauthorized" }); + if (!(await check(token, { id: userId }))) return res.status(401).json({ message: "Unauthorized" }); + // ---------------------------- const { id } = req.params; const { country, zipCode, street, lat, lng } = req.body; @@ -53,10 +79,8 @@ mainAddressRoutes.put("/api/user/main-address/:id", async (req: Request, res: Re .setLng(lng); const mainAddressUpdateInput = new MainAddressUpdateInput().setToken(authorization).setMainaddress(address); - mainAddressServiceClient.updateMainAddress(mainAddressUpdateInput, (err, response) => { - if (err) { - return res.status(500).json({ message: err.message }); - } - return res.json(response.toObject()); + mainAddressServiceClient.updateMainAddress(mainAddressUpdateInput, (error, response) => { + if (error) return res.status(500).send({ error }); + else return res.status(200).json(response.toObject()); }); }); From 0e574abe93e1b6f5cd3bef82b1f2f19cf64228c2 Mon Sep 17 00:00:00 2001 From: anatole Date: Sun, 27 Aug 2023 13:21:47 +0200 Subject: [PATCH 494/883] feat(gateway): fix swagger comments --- .../controller/product/product.controller.ts | 47 +- .../src/lib/swagger/swagger-output.json | 4254 ++++++++++++++++- services/gateway/src/server.ts | 142 +- 3 files changed, 4336 insertions(+), 107 deletions(-) diff --git a/services/gateway/src/controller/product/product.controller.ts b/services/gateway/src/controller/product/product.controller.ts index 0649808f..9630ac82 100644 --- a/services/gateway/src/controller/product/product.controller.ts +++ b/services/gateway/src/controller/product/product.controller.ts @@ -1,6 +1,6 @@ import { Request, Response, Router } from "express"; import { productServiceClient } from "../../services/clients/product.client"; -import { Allergen, Category, File, Product, ProductId, RestaurantId } from "../../proto/product_pb"; +import { Allergen, Category, File, Product, ProductId, ProductType, RestaurantId } from "../../proto/product_pb"; import { Empty } from "google-protobuf/google/protobuf/empty_pb"; import * as fs from "fs"; import { withCheck } from "@gateway/middleware/auth"; @@ -65,29 +65,30 @@ productRoutes.post("/api/product", withCheck({ role: "ACCOUNTANT" }), (req: Requ in: 'body', required: true, schema: { - restaurantId: 0, - type: "type", + restaurantId: "restaurant:id", + type: {'$ref': '#/definitions/ProductType'}, name: "name", - image: "image", + image: "bucket_url_to_image", comment: "comment", price: 0, preparation: "preparation", weight: "weight", kilocalories: "0", nutriscore: 0, - categories: [ - { + categories: [{ + id: "category:id|null", label: "category-label", icon: "category-icon", hexaColor: "#ffffff", }], allergens: [ { + id:"allergen:id|null", label: "allergen-label", } ], } - } + } #swagger.parameters['authorization'] = { in: 'header', required: true, @@ -104,18 +105,29 @@ productRoutes.post("/api/product", withCheck({ role: "ACCOUNTANT" }), (req: Requ weight, kilocalories, nutriscore, - categories, allergens, + categories, } = req.body; - const allergensList = allergens.map((allergen: { label: string }) => new Allergen().setLibelle(allergen.label)); - const categoryList = categories.map((category: { label: string; hexaColor: string; icon: string }) => - new Category().setLibelle(category.label).setHexaColor(category.hexaColor).setIcon(category.icon), + const allergenList = allergens.map((allergen: { id: string | null; label: string }) => { + const newAllergen = new Allergen().setLibelle(allergen.label); + if (allergen.id) newAllergen.setId(allergen.id); + return newAllergen; + }); + const categoryList = categories.map( + (category: { id: string | null; label: string; hexaColor: string; icon: string }) => { + const newCategory = new Category() + .setLibelle(category.label) + .setHexaColor(category.hexaColor) + .setIcon(category.icon); + if (category.id) newCategory.setId(category.id); + return newCategory; + }, ); const productId = new Product() .setRestaurantId(Number(restaurantId)) - .setType(type) + .setType(ProductType[type as keyof typeof ProductType]) .setName(name) .setImage(image) .setComment(comment) @@ -125,11 +137,12 @@ productRoutes.post("/api/product", withCheck({ role: "ACCOUNTANT" }), (req: Requ .setKilocalories(kilocalories) .setNutriscore(nutriscore) .setCategoriesList(categoryList) - .setAllergensList(allergensList); + .setAllergensList(allergenList); productServiceClient.createProduct(productId, (error, response) => { - if (error) return res.status(500).send({ error }); - else return res.status(201).json(response.toObject()); + if (error) { + return res.status(500).send({ error }); + } else return res.status(201).json(response.toObject()); }); }); @@ -141,7 +154,7 @@ productRoutes.put("/api/product/:id", withCheck({ role: "ACCOUNTANT" }), (req: R restaurantId: 0, type: "type", name: "name", - image: "image", + image: "bucket_url_to_image", comment: "comment", price: 0, preparation: "preparation", @@ -160,7 +173,7 @@ productRoutes.put("/api/product/:id", withCheck({ role: "ACCOUNTANT" }), (req: R } ], } - } + } #swagger.parameters['authorization'] = { in: 'header', required: true, diff --git a/services/gateway/src/lib/swagger/swagger-output.json b/services/gateway/src/lib/swagger/swagger-output.json index 4351cc64..dd59cc1b 100644 --- a/services/gateway/src/lib/swagger/swagger-output.json +++ b/services/gateway/src/lib/swagger/swagger-output.json @@ -10,7 +10,4259 @@ "schemes": [ "http" ], - "paths": {}, + "paths": { + "/api/user/{id}": { + "get": { + "tags": [ + "User" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "integer" + }, + { + "name": "authorization", + "in": "header", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + }, + "401": { + "description": "Unauthorized" + }, + "403": { + "description": "Forbidden" + } + } + }, + "delete": { + "tags": [ + "User" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "integer" + }, + { + "name": "authorization", + "in": "header", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + }, + "401": { + "description": "Unauthorized" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/user": { + "get": { + "tags": [ + "User" + ], + "description": "", + "parameters": [ + { + "name": "authorization", + "in": "header", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + }, + "500": { + "description": "Internal Server Error" + } + } + }, + "put": { + "tags": [ + "User" + ], + "description": "", + "parameters": [ + { + "name": "authorization", + "in": "header", + "required": true, + "type": "string" + }, + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "type": "object", + "properties": { + "firstName": { + "type": "string", + "example": "John" + }, + "lastName": { + "type": "string", + "example": "Doe" + }, + "email": { + "type": "string", + "example": "johnDoe@mail.com" + }, + "password": { + "type": "string", + "example": "password" + }, + "phone": { + "type": "string", + "example": "0642424242" + }, + "country": { + "type": "string", + "example": "France" + }, + "zipCode": { + "type": "string", + "example": "76000" + }, + "street": { + "type": "string", + "example": "7 rue de la paix" + }, + "lat": { + "type": "number", + "example": 49.443232 + }, + "lng": { + "type": "number", + "example": 1.099971 + }, + "roleCode": { + "$ref": "#/definitions/RoleCode" + } + } + } + } + ], + "responses": { + "200": { + "description": "OK" + }, + "401": { + "description": "Unauthorized" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/user/register": { + "post": { + "tags": [ + "User" + ], + "description": "", + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "type": "object", + "properties": { + "firstName": { + "type": "string", + "example": "John" + }, + "lastName": { + "type": "string", + "example": "Doe" + }, + "email": { + "type": "string", + "example": "johnDoe@mail.com" + }, + "password": { + "type": "string", + "example": "password" + }, + "phone": { + "type": "string", + "example": "0642424242" + }, + "country": { + "type": "string", + "example": "France" + }, + "zipCode": { + "type": "string", + "example": "76000" + }, + "street": { + "type": "string", + "example": "7 rue de la paix" + }, + "lat": { + "type": "number", + "example": 49.443232 + }, + "lng": { + "type": "number", + "example": 1.099971 + }, + "roleCode": { + "$ref": "#/definitions/RoleCode" + } + } + } + } + ], + "responses": { + "200": { + "description": "OK" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/user/login": { + "post": { + "tags": [ + "User" + ], + "description": "", + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "type": "object", + "properties": { + "email": { + "type": "string", + "example": "johnDoe@mail.com" + }, + "password": { + "type": "string", + "example": "password" + } + } + } + } + ], + "responses": { + "200": { + "description": "OK" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/user/validate": { + "post": { + "tags": [ + "User" + ], + "description": "", + "parameters": [ + { + "name": "authorization", + "in": "header", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + }, + "401": { + "description": "Unauthorized" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/user/password": { + "put": { + "tags": [ + "User" + ], + "description": "", + "parameters": [ + { + "name": "authorization", + "in": "header", + "required": true, + "type": "string" + }, + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "type": "object", + "properties": { + "oldpassword": { + "type": "string", + "example": "oldpassword" + }, + "password": { + "type": "string", + "example": "newPassword" + } + } + } + } + ], + "responses": { + "200": { + "description": "OK" + }, + "401": { + "description": "Unauthorized" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/user/{id}/role": { + "put": { + "tags": [ + "User" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "integer" + }, + { + "name": "authorization", + "in": "header", + "required": true, + "type": "string" + }, + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "type": "object", + "properties": { + "role": { + "$ref": "#/definitions/RoleCode" + } + } + } + } + ], + "responses": { + "200": { + "description": "OK" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/user/main-address/{id}": { + "get": { + "tags": [ + "User" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "integer" + } + ], + "responses": { + "200": { + "description": "OK" + }, + "500": { + "description": "Internal Server Error" + } + } + }, + "put": { + "tags": [ + "User" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "integer" + }, + { + "name": "authorization", + "in": "header", + "type": "string" + }, + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "type": "object", + "properties": { + "country": { + "type": "string", + "example": "France" + }, + "zipCode": { + "type": "string", + "example": "76000" + }, + "street": { + "type": "string", + "example": "7 rue de la paix" + }, + "lat": { + "type": "number", + "example": 49.443232 + }, + "lng": { + "type": "number", + "example": 1.099971 + } + } + } + } + ], + "responses": { + "200": { + "description": "OK" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/basket/": { + "get": { + "tags": [ + "Basket" + ], + "description": "", + "parameters": [ + { + "name": "authorization", + "in": "header", + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + }, + "401": { + "description": "Unauthorized" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/basket": { + "post": { + "tags": [ + "Basket" + ], + "description": "", + "parameters": [ + { + "name": "authorization", + "in": "header", + "type": "string" + }, + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "type": "object", + "properties": { + "productId": { + "type": "string", + "example": "product_id:0" + }, + "restaurantId": { + "type": "string", + "example": "restaurant_id:0" + } + } + } + } + ], + "responses": { + "200": { + "description": "OK" + }, + "401": { + "description": "Unauthorized" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/basket/remove-product": { + "put": { + "tags": [ + "Basket" + ], + "description": "", + "parameters": [ + { + "name": "authorization", + "in": "header", + "type": "string" + }, + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "type": "object", + "properties": { + "productId": { + "type": "string", + "example": "product_id:0" + }, + "restaurantId": { + "type": "string", + "example": "restaurant_id:0" + } + } + } + } + ], + "responses": { + "200": { + "description": "OK" + }, + "401": { + "description": "Unauthorized" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/basket/restaurant": { + "put": { + "tags": [ + "Basket" + ], + "description": "", + "parameters": [ + { + "name": "authorization", + "in": "header", + "type": "string" + }, + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "type": "object", + "properties": { + "restaurantId": { + "type": "string", + "example": "restaurant_id:0" + } + } + } + } + ], + "responses": { + "200": { + "description": "OK" + }, + "401": { + "description": "Unauthorized" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/basket/reset": { + "post": { + "tags": [ + "Basket" + ], + "description": "", + "parameters": [ + { + "name": "authorization", + "in": "header", + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + }, + "401": { + "description": "Unauthorized" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/payment/{id}": { + "get": { + "tags": [ + "Payment" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "authorization", + "in": "header", + "required": true, + "type": "string" + } + ], + "responses": { + "401": { + "description": "Unauthorized" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/payment/by-user/{userId}": { + "get": { + "tags": [ + "Payment" + ], + "description": "", + "parameters": [ + { + "name": "userId", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "authorization", + "in": "header", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + }, + "401": { + "description": "Unauthorized" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/payment/stripe": { + "post": { + "tags": [ + "Payment" + ], + "description": "", + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "type": "object", + "properties": { + "userId": { + "type": "string", + "example": "Id" + }, + "name": { + "type": "string", + "example": "John" + }, + "email": { + "type": "string", + "example": "mail" + }, + "total": { + "type": "number", + "example": 12 + } + } + } + } + ], + "responses": { + "200": { + "description": "OK" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/order/{id}": { + "get": { + "tags": [ + "Order" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "authorization", + "in": "header", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + }, + "401": { + "description": "Unauthorized" + }, + "404": { + "description": "Not Found" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/order": { + "post": { + "tags": [ + "Order" + ], + "description": "", + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "type": "object", + "properties": { + "paymentId": { + "type": "string", + "example": "payment_id:1" + }, + "deliveryId": { + "type": "string", + "example": "delivery_id:1" + }, + "deliveryType": { + "$ref": "#/definitions/DeliveryType" + }, + "restaurantId": { + "type": "string", + "example": "restaurant_id:1" + } + } + } + }, + { + "name": "authorization", + "in": "header", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + }, + "401": { + "description": "Unauthorized" + }, + "404": { + "description": "Not Found" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/order/by-user/{userId}": { + "get": { + "tags": [ + "Order" + ], + "description": "", + "parameters": [ + { + "name": "userId", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "authorization", + "in": "header", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + }, + "401": { + "description": "Unauthorized" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/order/by-status": { + "post": { + "tags": [ + "Order" + ], + "description": "", + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "type": "object", + "properties": { + "status": { + "$ref": "#/definitions/Status" + } + } + } + }, + { + "name": "authorization", + "in": "header", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/order/by-delivery/{deliveryId}": { + "get": { + "tags": [ + "Order" + ], + "description": "", + "parameters": [ + { + "name": "deliveryId", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "deliveryId", + "in": "query", + "type": "string" + }, + { + "name": "authorization", + "in": "header", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + }, + "401": { + "description": "Unauthorized" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/order/by-payment/{paymentId}": { + "get": { + "tags": [ + "Order" + ], + "description": "", + "parameters": [ + { + "name": "paymentId", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "authorization", + "in": "header", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + }, + "401": { + "description": "Unauthorized" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/order/{orderId}": { + "put": { + "tags": [ + "Order" + ], + "description": "", + "parameters": [ + { + "name": "orderId", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "type": "object", + "properties": { + "status": { + "$ref": "#/definitions/Status" + }, + "deliveryId": { + "type": "string", + "example": "delivery_id:1" + }, + "paymentId": { + "type": "string", + "example": "payment_id:1" + }, + "restaurantId": { + "type": "string", + "example": "restaurant_id:1" + } + } + } + }, + { + "name": "authorization", + "in": "header", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + }, + "500": { + "description": "Internal Server Error" + } + } + }, + "delete": { + "tags": [ + "Order" + ], + "description": "", + "parameters": [ + { + "name": "orderId", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "default": { + "description": "" + } + } + } + }, + "/api/product/by-restaurant/{id}": { + "get": { + "tags": [ + "Product" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/product/{id}": { + "get": { + "tags": [ + "Product" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + }, + "500": { + "description": "Internal Server Error" + } + } + }, + "delete": { + "tags": [ + "Product" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "authorization", + "in": "header", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + }, + "500": { + "description": "Internal Server Error" + } + } + }, + "put": { + "tags": [ + "Product" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "type": "object", + "properties": { + "restaurantId": { + "type": "number", + "example": 0 + }, + "type": { + "type": "string", + "example": "type" + }, + "name": { + "type": "string", + "example": "name" + }, + "image": { + "type": "string", + "example": "bucket_url_to_image" + }, + "comment": { + "type": "string", + "example": "comment" + }, + "price": { + "type": "number", + "example": 0 + }, + "preparation": { + "type": "string", + "example": "preparation" + }, + "weight": { + "type": "string", + "example": "weight" + }, + "kilocalories": { + "type": "string", + "example": "0" + }, + "nutriscore": { + "type": "number", + "example": 0 + }, + "categories": { + "type": "array", + "items": { + "type": "object", + "properties": { + "label": { + "type": "string", + "example": "category-label" + }, + "icon": { + "type": "string", + "example": "category-icon" + }, + "hexaColor": { + "type": "string", + "example": "#ffffff" + } + } + } + }, + "allergens": { + "type": "array", + "items": { + "type": "object", + "properties": { + "label": { + "type": "string", + "example": "allergen-label" + } + } + } + } + } + } + }, + { + "name": "authorization", + "in": "header", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/product/type": { + "get": { + "tags": [ + "Product" + ], + "description": "", + "responses": { + "200": { + "description": "OK" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/product": { + "post": { + "tags": [ + "Product" + ], + "description": "", + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "type": "object", + "properties": { + "restaurantId": { + "type": "string", + "example": "restaurant:id" + }, + "type": { + "$ref": "#/definitions/ProductType" + }, + "name": { + "type": "string", + "example": "name" + }, + "image": { + "type": "string", + "example": "bucket_url_to_image" + }, + "comment": { + "type": "string", + "example": "comment" + }, + "price": { + "type": "number", + "example": 0 + }, + "preparation": { + "type": "string", + "example": "preparation" + }, + "weight": { + "type": "string", + "example": "weight" + }, + "kilocalories": { + "type": "string", + "example": "0" + }, + "nutriscore": { + "type": "number", + "example": 0 + }, + "categories": { + "type": "array", + "items": { + "type": "object", + "properties": { + "id": { + "type": "string", + "example": "category:id|null" + }, + "label": { + "type": "string", + "example": "category-label" + }, + "icon": { + "type": "string", + "example": "category-icon" + }, + "hexaColor": { + "type": "string", + "example": "#ffffff" + } + } + } + }, + "allergens": { + "type": "array", + "items": { + "type": "object", + "properties": { + "id": { + "type": "string", + "example": "allergen:id|null" + }, + "label": { + "type": "string", + "example": "allergen-label" + } + } + } + } + } + } + }, + { + "name": "authorization", + "in": "header", + "required": true, + "type": "string" + } + ], + "responses": { + "201": { + "description": "Created" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/product/image": { + "post": { + "tags": [ + "Product" + ], + "description": "", + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "type": "object", + "properties": { + "input_file": { + "type": "function" + } + } + } + }, + { + "name": "authorization", + "in": "header", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/category": { + "get": { + "tags": [ + "Product" + ], + "description": "", + "responses": { + "200": { + "description": "OK" + }, + "500": { + "description": "Internal Server Error" + } + } + }, + "post": { + "tags": [ + "Product" + ], + "description": "", + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "type": "object", + "properties": { + "label": { + "type": "string", + "example": "category-label" + }, + "icon": { + "type": "string", + "example": "category-icon" + }, + "hexaColor": { + "type": "string", + "example": "#ffffff" + } + } + } + }, + { + "name": "authorization", + "in": "header", + "required": true, + "type": "string" + } + ], + "responses": { + "201": { + "description": "Created" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/category/{id}": { + "get": { + "tags": [ + "Product" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + }, + "500": { + "description": "Internal Server Error" + } + } + }, + "put": { + "tags": [ + "Product" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "type": "object", + "properties": { + "label": { + "type": "string", + "example": "category-label" + }, + "icon": { + "type": "string", + "example": "category-icon" + }, + "hexaColor": { + "type": "string", + "example": "#ffffff" + } + } + } + }, + { + "name": "authorization", + "in": "header", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + }, + "500": { + "description": "Internal Server Error" + } + } + }, + "delete": { + "tags": [ + "Product" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "authorization", + "in": "header", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/allergen": { + "get": { + "tags": [ + "Product" + ], + "description": "", + "responses": { + "200": { + "description": "OK" + }, + "500": { + "description": "Internal Server Error" + } + } + }, + "post": { + "tags": [ + "Product" + ], + "description": "", + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "type": "object", + "properties": { + "label": { + "type": "string", + "example": "allergen-label" + } + } + } + }, + { + "name": "authorization", + "in": "header", + "required": true, + "type": "string" + } + ], + "responses": { + "201": { + "description": "Created" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/allergen/{id}": { + "get": { + "tags": [ + "Product" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + }, + "500": { + "description": "Internal Server Error" + } + } + }, + "put": { + "tags": [ + "Product" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "type": "object", + "properties": { + "label": { + "type": "string", + "example": "allergen-label" + } + } + } + }, + { + "name": "authorization", + "in": "header", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + }, + "500": { + "description": "Internal Server Error" + } + } + }, + "delete": { + "tags": [ + "Product" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "authorization", + "in": "header", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/restaurant/{id}": { + "get": { + "tags": [ + "Restaurant" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + }, + "500": { + "description": "Internal Server Error" + } + } + }, + "put": { + "tags": [ + "Restaurant" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "type": "object", + "properties": { + "name": { + "type": "string", + "example": "restaurant-name" + }, + "description": { + "type": "string", + "example": "restaurant-desc" + }, + "locationList": { + "type": "array", + "example": [ + 1.099, + 49.443 + ], + "items": { + "type": "number" + } + }, + "address": { + "type": "string", + "example": "restaurant-address" + }, + "openingHoursList": { + "type": "array", + "example": [ + "12h-14h", + "19h-22h" + ], + "items": { + "type": "string" + } + }, + "phone": { + "type": "string", + "example": "restaurant-phone" + } + } + } + }, + { + "name": "authorization", + "in": "header", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + }, + "500": { + "description": "Internal Server Error" + } + } + }, + "delete": { + "tags": [ + "Restaurant" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "authorization", + "in": "header", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/restaurant": { + "get": { + "tags": [ + "Restaurant" + ], + "description": "", + "responses": { + "200": { + "description": "OK" + }, + "500": { + "description": "Internal Server Error" + } + } + }, + "post": { + "tags": [ + "Restaurant" + ], + "description": "", + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "type": "object", + "properties": { + "name": { + "type": "string", + "example": "restaurant-name" + }, + "description": { + "type": "string", + "example": "restaurant-desc" + }, + "locationList": { + "type": "array", + "example": [ + 1.099, + 49.443 + ], + "items": { + "type": "number" + } + }, + "address": { + "type": "string", + "example": "restaurant-address" + }, + "openingHoursList": { + "type": "array", + "example": [ + "12h-14h", + "19h-22h" + ], + "items": { + "type": "string" + } + }, + "phone": { + "type": "string", + "example": "restaurant-phone" + } + } + } + }, + { + "name": "authorization", + "in": "header", + "required": true, + "type": "string" + } + ], + "responses": { + "201": { + "description": "Created" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/restaurant/by-location": { + "post": { + "tags": [ + "Restaurant" + ], + "description": "", + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "type": "object", + "properties": { + "locationList": { + "type": "array", + "example": [ + 1.099, + 49.443 + ], + "items": { + "type": "number" + } + } + } + } + } + ], + "responses": { + "200": { + "description": "OK" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/delivery/{id}": { + "get": { + "tags": [ + "Delivery" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "authorization", + "in": "header", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + }, + "401": { + "description": "Unauthorized" + }, + "500": { + "description": "Internal Server Error" + } + } + }, + "put": { + "tags": [ + "Delivery" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "type": "object", + "properties": { + "eta": { + "type": "string", + "example": "2022-01-01T00:00:00.000Z" + }, + "address": { + "type": "string", + "example": "10 Rue de la République, 75003 Paris, France" + }, + "status": { + "$ref": "#/definitions/Status" + }, + "deliveryPersonId": { + "type": "string", + "example": "cllcdmeci0000pm01su98mxtb" + }, + "userId": { + "type": "string", + "example": "user_id:1" + }, + "restaurantId": { + "type": "string", + "example": "restaurant_id:1" + } + } + } + }, + { + "name": "authorization", + "in": "header", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + }, + "400": { + "description": "Bad Request" + }, + "401": { + "description": "Unauthorized" + }, + "500": { + "description": "Internal Server Error" + } + } + }, + "delete": { + "tags": [ + "Delivery" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "authorization", + "in": "header", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + }, + "401": { + "description": "Unauthorized" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/delivery/by-restaurant/{id}": { + "get": { + "tags": [ + "Delivery" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "authorization", + "in": "header", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/delivery/by-user": { + "get": { + "tags": [ + "Delivery" + ], + "description": "", + "parameters": [ + { + "name": "authorization", + "in": "header", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + }, + "401": { + "description": "Unauthorized" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/delivery": { + "post": { + "tags": [ + "Delivery" + ], + "description": "", + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "type": "object", + "properties": { + "eta": { + "type": "string", + "example": "2022-01-01T00:00:00.000Z" + }, + "address": { + "type": "string", + "example": "10 Rue de la République, 75003 Paris, France" + }, + "status": { + "$ref": "#/definitions/Status" + }, + "deliveryPersonId": { + "type": "string", + "example": "cllcdmeci0000pm01su98mxtb" + }, + "restaurantId": { + "type": "string", + "example": "restaurant_id:1" + } + } + } + }, + { + "name": "authorization", + "in": "header", + "required": true, + "type": "string" + } + ], + "responses": { + "201": { + "description": "Created" + }, + "400": { + "description": "Bad Request" + }, + "401": { + "description": "Unauthorized" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/delivery-person/{id}": { + "get": { + "tags": [ + "Delivery" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "authorization", + "in": "header", + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + }, + "401": { + "description": "Unauthorized" + }, + "500": { + "description": "Internal Server Error" + } + } + }, + "put": { + "tags": [ + "Delivery" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "type": "object", + "properties": { + "firstName": { + "type": "string", + "example": "John" + }, + "lastName": { + "type": "string", + "example": "Doe" + }, + "phone": { + "type": "string", + "example": "0612345678" + }, + "locationList": { + "type": "array", + "example": [ + 41.40338, + 2.17403 + ], + "items": { + "type": "number" + } + } + } + } + }, + { + "name": "authorization", + "in": "header", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + }, + "500": { + "description": "Internal Server Error" + } + } + }, + "delete": { + "tags": [ + "Delivery" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "authorization", + "in": "header", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/delivery-person": { + "get": { + "tags": [ + "Delivery" + ], + "description": "", + "parameters": [ + { + "name": "authorization", + "in": "header", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + }, + "500": { + "description": "Internal Server Error" + } + } + }, + "post": { + "tags": [ + "Delivery" + ], + "description": "", + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "type": "object", + "properties": { + "firstName": { + "type": "string", + "example": "John" + }, + "lastName": { + "type": "string", + "example": "Doe" + }, + "phone": { + "type": "string", + "example": "0612345678" + }, + "locationList": { + "type": "array", + "example": [ + 41.40338, + 2.17403 + ], + "items": { + "type": "number" + } + } + } + } + }, + { + "name": "authorization", + "in": "header", + "required": true, + "type": "string" + } + ], + "responses": { + "201": { + "description": "Created" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/delivery-person/near": { + "get": { + "tags": [ + "Delivery" + ], + "description": "", + "parameters": [ + { + "name": "authorization", + "in": "header", + "type": "string" + }, + { + "name": "lat", + "in": "query", + "required": true, + "type": "integer" + }, + { + "name": "lng", + "in": "query", + "required": true, + "type": "integer" + } + ], + "responses": { + "200": { + "description": "OK" + }, + "401": { + "description": "Unauthorized" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/log": { + "get": { + "tags": [ + "Log" + ], + "description": "", + "parameters": [ + { + "name": "authorization", + "in": "header", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/log/{id}": { + "get": { + "tags": [ + "Log" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "number" + }, + { + "name": "authorization", + "in": "header", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/metric/{key}": { + "get": { + "tags": [ + "Metric" + ], + "description": "", + "parameters": [ + { + "name": "key", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "authorization", + "in": "header", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/metric/by-restaurant-and-date": { + "post": { + "tags": [ + "Metric" + ], + "description": "", + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "type": "object", + "properties": { + "restaurantId": { + "type": "string", + "example": "restaurant_id:1" + }, + "date": { + "type": "string", + "example": "2022-01-01T00:00:00.000Z" + } + } + } + }, + { + "name": "authorization", + "in": "header", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/metric/by-restaurant/{restaurantId}": { + "get": { + "tags": [ + "Metric" + ], + "description": "", + "parameters": [ + { + "name": "restaurantId", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "authorization", + "in": "header", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/metric/by-restaurant-group/{restaurantGroupId}": { + "get": { + "tags": [ + "Metric" + ], + "description": "", + "parameters": [ + { + "name": "restaurantGroupId", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "authorization", + "in": "header", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/metric/restaurant/{restaurantId}": { + "get": { + "tags": [ + "Metric" + ], + "description": "", + "parameters": [ + { + "name": "restaurantId", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "authorization", + "in": "header", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + }, + "500": { + "description": "Internal Server Error" + } + } + }, + "put": { + "tags": [ + "Metric" + ], + "description": "", + "parameters": [ + { + "name": "restaurantId", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "type": "object", + "properties": { + "name": { + "type": "string", + "example": "example_name" + }, + "key": { + "type": "string", + "example": "example_key" + }, + "address": { + "type": "string", + "example": "example_address" + }, + "group_id": { + "type": "number", + "example": 1 + } + } + } + }, + { + "name": "authorization", + "in": "header", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + }, + "500": { + "description": "Internal Server Error" + } + } + }, + "delete": { + "tags": [ + "Metric" + ], + "description": "", + "parameters": [ + { + "name": "restaurantId", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "authorization", + "in": "header", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/metric/restaurant-group/{restaurantGroupId}": { + "get": { + "tags": [ + "Metric" + ], + "description": "", + "parameters": [ + { + "name": "restaurantGroupId", + "in": "path", + "required": true, + "type": "integer" + } + ], + "responses": { + "200": { + "description": "OK" + }, + "500": { + "description": "Internal Server Error" + } + } + }, + "put": { + "tags": [ + "Metric" + ], + "description": "", + "parameters": [ + { + "name": "restaurantGroupId", + "in": "path", + "required": true, + "type": "integer" + }, + { + "name": "restaurantGroupId", + "in": "query", + "type": "string" + }, + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "type": "object", + "properties": { + "name": { + "type": "string", + "example": "example_name" + } + } + } + }, + { + "name": "authorization", + "in": "header", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + }, + "500": { + "description": "Internal Server Error" + } + } + }, + "delete": { + "tags": [ + "Metric" + ], + "description": "", + "parameters": [ + { + "name": "restaurantGroupId", + "in": "path", + "required": true, + "type": "integer" + }, + { + "name": "authorization", + "in": "header", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/metric/restaurant": { + "post": { + "tags": [ + "Metric" + ], + "description": "", + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "type": "object", + "properties": { + "name": { + "type": "string", + "example": "example_name" + }, + "key": { + "type": "string", + "example": "example_key" + }, + "address": { + "type": "string", + "example": "example_address" + }, + "group_id": { + "type": "number", + "example": 1 + } + } + } + }, + { + "name": "authorization", + "in": "header", + "required": true, + "type": "string" + } + ], + "responses": { + "201": { + "description": "Created" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/metric/restaurant-group": { + "post": { + "tags": [ + "Metric" + ], + "description": "", + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "type": "object", + "properties": { + "name": { + "type": "string", + "example": "example_name" + } + } + } + }, + { + "name": "authorization", + "in": "header", + "required": true, + "type": "string" + } + ], + "responses": { + "201": { + "description": "Created" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/metric": { + "post": { + "tags": [ + "Metric" + ], + "description": "", + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "type": "object", + "properties": { + "restaurantId": { + "type": "string", + "example": "restaurant_id:1" + }, + "code": { + "type": "string", + "example": "income_1h" + }, + "value": { + "type": "string", + "example": "99.99" + }, + "key": { + "type": "string", + "example": "example_key" + } + } + } + }, + { + "name": "authorization", + "in": "header", + "required": true, + "type": "string" + } + ], + "responses": { + "201": { + "description": "Created" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/promotion/{code}": { + "get": { + "tags": [ + "Promotion" + ], + "description": "", + "parameters": [ + { + "name": "code", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "authorization", + "in": "header", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + }, + "401": { + "description": "Unauthorized" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/promotion": { + "get": { + "tags": [ + "Promotion" + ], + "description": "", + "responses": { + "200": { + "description": "OK" + }, + "500": { + "description": "Internal Server Error" + } + } + }, + "post": { + "tags": [ + "Promotion" + ], + "description": "", + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "type": "object", + "properties": { + "code": { + "type": "string", + "example": "code-example" + }, + "reduction": { + "type": "string", + "example": "reduction-example" + }, + "method": { + "$ref": "#/definitions/Method" + }, + "restaurantId": { + "type": "string", + "example": "restaurant_id:0" + } + } + } + }, + { + "name": "authorization", + "in": "header", + "required": true, + "type": "string" + } + ], + "responses": { + "201": { + "description": "Created" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/promotion/by-restaurant/{restaurantId}": { + "get": { + "tags": [ + "Promotion" + ], + "description": "", + "parameters": [ + { + "name": "restaurantId", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "authorization", + "in": "header", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + }, + "401": { + "description": "Unauthorized" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/promotion/{id}": { + "put": { + "tags": [ + "Promotion" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "type": "object", + "properties": { + "code": { + "type": "string", + "example": "code-example" + }, + "reduction": { + "type": "string", + "example": "reduction-example" + }, + "method": { + "$ref": "#/definitions/Method" + }, + "restaurantId": { + "type": "string", + "example": "restaurant_id:0" + } + } + } + }, + { + "name": "authorization", + "in": "header", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + }, + "500": { + "description": "Internal Server Error" + } + } + }, + "delete": { + "tags": [ + "Promotion" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "authorization", + "in": "header", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/stock/supplier/{id}": { + "get": { + "tags": [ + "Stock" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "integer" + }, + { + "name": "authorization", + "in": "header", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + }, + "500": { + "description": "Internal Server Error" + } + } + }, + "put": { + "tags": [ + "Stock" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "integer" + }, + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "type": "object", + "properties": { + "name": { + "type": "string", + "example": "supplier-name" + }, + "contact": { + "type": "string", + "example": "supplier-contact" + } + } + } + }, + { + "name": "authorization", + "in": "header", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + }, + "500": { + "description": "Internal Server Error" + } + } + }, + "delete": { + "tags": [ + "Stock" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "integer" + }, + { + "name": "authorization", + "in": "header", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/stock/supplier": { + "get": { + "tags": [ + "Stock" + ], + "description": "", + "parameters": [ + { + "name": "authorization", + "in": "header", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + }, + "500": { + "description": "Internal Server Error" + } + } + }, + "post": { + "tags": [ + "Stock" + ], + "description": "", + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "type": "object", + "properties": { + "name": { + "type": "string", + "example": "supplier-name" + }, + "contact": { + "type": "string", + "example": "supplier-contact" + } + } + } + }, + { + "name": "authorization", + "in": "header", + "required": true, + "type": "string" + } + ], + "responses": { + "201": { + "description": "Created" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/stock/ingredient/{id}": { + "get": { + "tags": [ + "Stock" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "integer" + }, + { + "name": "authorization", + "in": "header", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + }, + "500": { + "description": "Internal Server Error" + } + } + }, + "put": { + "tags": [ + "Stock" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "integer" + }, + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "type": "object", + "properties": { + "name": { + "type": "string", + "example": "ingredient-name" + }, + "description": { + "type": "string", + "example": "ingredient-desc" + } + } + } + }, + { + "name": "authorization", + "in": "header", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + }, + "500": { + "description": "Internal Server Error" + } + } + }, + "delete": { + "tags": [ + "Stock" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "integer" + }, + { + "name": "authorization", + "in": "header", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/stock/ingredient": { + "get": { + "tags": [ + "Stock" + ], + "description": "", + "parameters": [ + { + "name": "authorization", + "in": "header", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + }, + "500": { + "description": "Internal Server Error" + } + } + }, + "post": { + "tags": [ + "Stock" + ], + "description": "", + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "type": "object", + "properties": { + "name": { + "type": "string", + "example": "ingredient-name" + }, + "description": { + "type": "string", + "example": "ingredient-desc" + } + } + } + }, + { + "name": "authorization", + "in": "header", + "required": true, + "type": "string" + } + ], + "responses": { + "201": { + "description": "Created" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/stock/ingredient/restaurant/{id}": { + "get": { + "tags": [ + "Stock" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "integer" + }, + { + "name": "authorization", + "in": "header", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + }, + "500": { + "description": "Internal Server Error" + } + } + }, + "put": { + "tags": [ + "Stock" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "integer" + }, + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "type": "object", + "properties": { + "alertThreshold": { + "type": "number", + "example": 5 + }, + "quantity": { + "type": "number", + "example": 2 + }, + "productList": { + "type": "array", + "example": [ + "product_id:1", + "product_id:2" + ], + "items": { + "type": "string" + } + }, + "unitPrice": { + "type": "number", + "example": 2 + }, + "pricePerKilo": { + "type": "number", + "example": 1.5 + }, + "restaurantId": { + "type": "string", + "example": "restaurant_id:1" + }, + "ingredientId": { + "type": "number", + "example": 1 + } + } + } + }, + { + "name": "authorization", + "in": "header", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + }, + "500": { + "description": "Internal Server Error" + } + } + }, + "delete": { + "tags": [ + "Stock" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "integer" + }, + { + "name": "authorization", + "in": "header", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/stock/ingredient/restaurant/by-restaurant/{id}": { + "get": { + "tags": [ + "Stock" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "authorization", + "in": "header", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/stock/ingredient/restaurant/by-product/{id}": { + "get": { + "tags": [ + "Stock" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "authorization", + "in": "header", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/stock/ingredient/restaurant": { + "post": { + "tags": [ + "Stock" + ], + "description": "", + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "type": "object", + "properties": { + "alertThreshold": { + "type": "number", + "example": 5 + }, + "quantity": { + "type": "number", + "example": 2 + }, + "productList": { + "type": "array", + "example": [ + "product_id:1", + "product_id:2" + ], + "items": { + "type": "string" + } + }, + "unitPrice": { + "type": "number", + "example": 2 + }, + "pricePerKilo": { + "type": "number", + "example": 1.5 + }, + "restaurantId": { + "type": "string", + "example": "restaurant_id:1" + }, + "ingredientId": { + "type": "number", + "example": 1 + } + } + } + }, + { + "name": "authorization", + "in": "header", + "required": true, + "type": "string" + } + ], + "responses": { + "201": { + "description": "Created" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/stock/supply/order/{id}": { + "get": { + "tags": [ + "Stock" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "integer" + }, + { + "name": "authorization", + "in": "header", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + }, + "500": { + "description": "Internal Server Error" + } + } + }, + "put": { + "tags": [ + "Stock" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "integer" + }, + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "type": "object", + "properties": { + "quantity": { + "type": "number", + "example": 3 + }, + "ingredientRestaurantId": { + "type": "number", + "example": 1 + }, + "supplierId": { + "type": "number", + "example": 1 + } + } + } + }, + { + "name": "authorization", + "in": "header", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + }, + "500": { + "description": "Internal Server Error" + } + } + }, + "delete": { + "tags": [ + "Stock" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "integer" + }, + { + "name": "authorization", + "in": "header", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/stock/supply/order/by-restaurant/{id}": { + "get": { + "tags": [ + "Stock" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/stock/supply/order/by-supplier/{id}": { + "get": { + "tags": [ + "Stock" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "integer" + }, + { + "name": "authorization", + "in": "header", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/stock/supply/order/by-ingredient-restaurant/{id}": { + "get": { + "tags": [ + "Stock" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "integer" + }, + { + "name": "authorization", + "in": "header", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/stock/supply/order": { + "post": { + "tags": [ + "Stock" + ], + "description": "", + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "type": "object", + "properties": { + "quantity": { + "type": "number", + "example": 3 + }, + "ingredientRestaurantId": { + "type": "number", + "example": 1 + }, + "supplierId": { + "type": "number", + "example": 1 + } + } + } + }, + { + "name": "authorization", + "in": "header", + "required": true, + "type": "string" + } + ], + "responses": { + "201": { + "description": "Created" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/stock/outcomes/by-restaurant/{id}": { + "post": { + "tags": [ + "Stock" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "type": "object", + "properties": { + "date": { + "type": "string", + "example": "2022-01-01T00:00:00.000Z" + }, + "interval": { + "type": "string", + "example": "interval-example" + } + } + } + } + ], + "responses": { + "200": { + "description": "OK" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/notification/by-message-type": { + "post": { + "tags": [ + "Notification" + ], + "description": "", + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "type": "object", + "properties": { + "messageType": { + "$ref": "#/definitions/MessageType" + } + } + } + } + ], + "responses": { + "200": { + "description": "OK" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/notification/{id}": { + "get": { + "tags": [ + "Notification" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + }, + "500": { + "description": "Internal Server Error" + } + } + }, + "put": { + "tags": [ + "Notification" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "type": "object", + "properties": { + "title": { + "type": "string", + "example": "notification-title" + }, + "message": { + "type": "string", + "example": "notification-message" + }, + "messageType": { + "$ref": "#/definitions/MessageType" + } + } + } + }, + { + "name": "authorization", + "in": "header", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + }, + "500": { + "description": "Internal Server Error" + } + } + }, + "delete": { + "tags": [ + "Notification" + ], + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "string" + }, + { + "name": "authorization", + "in": "header", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, + "/api/notification": { + "post": { + "tags": [ + "Notification" + ], + "description": "", + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "type": "object", + "properties": { + "title": { + "type": "string", + "example": "notification-title" + }, + "message": { + "type": "string", + "example": "notification-message" + }, + "messageType": { + "$ref": "#/definitions/MessageType" + } + } + } + }, + { + "name": "authorization", + "in": "header", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + }, + "500": { + "description": "Internal Server Error" + } + } + } + } + }, "definitions": { "Status": { "type": "string", diff --git a/services/gateway/src/server.ts b/services/gateway/src/server.ts index d64c919e..a5cad389 100644 --- a/services/gateway/src/server.ts +++ b/services/gateway/src/server.ts @@ -25,95 +25,59 @@ app.use(bodyParser.json()); const PORT = process.env.GATEWAY_PORT || 50000; -app.use( - "/", - userRoutes, - // #swagger.tags = ['User'] -); -app.use( - "/", - mainAddressRoutes, - // #swagger.tags = ['User'] -); -app.use( - "/", - basketRoutes, - // #swagger.tags = ['Basket'] -); -app.use( - "/", - paymentRoutes, - // #swagger.tags = ['Payment'] -); -app.use( - "/", - stripeRoutes, - // #swagger.tags = ['Payment'] -); -app.use( - "/", - orderRoutes, - // #swagger.tags = ['Order'] -); -app.use( - "/", - productRoutes, - // #swagger.tags = ['Product'] -); -app.use( - "/", - categoryRoutes, - // #swagger.tags = ['Product'] -); -app.use( - "/", - allergenRoutes, - // #swagger.tags = ['Product'] -); -app.use( - "/", - restaurantRoutes, - // #swagger.tags = ['Restaurant'] -); -app.use( - "/", - deliveryRoutes, - // #swagger.tags = ['Delivery'] -); -app.use( - "/", - deliveryPersonRoutes, - // #swagger.tags = ['Delivery'] -); -app.use( - "/", - logRoutes, - // #swagger.tags = ['Log'] -); -app.use( - "/", - metricRoutes, - // #swagger.tags = ['Metric'] -); -app.use( - "/", - promotionRoutes, - // #swagger.tags = ['Promotion'] -); -app.use( - "/", - stockRoutes, - // #swagger.tags = ['Stock'] -); -app.use( - "/", - stockPersonRoutes, - // #swagger.tags = ['Stock'] -); -app.use( - "/", - notificationRoutes, - // #swagger.tags = ['Notification'] +app.use('/', userRoutes +// #swagger.tags = ['User'] +); +app.use('/', mainAddressRoutes +// #swagger.tags = ['User'] +); +app.use('/', basketRoutes +// #swagger.tags = ['Basket'] +); +app.use('/', paymentRoutes +// #swagger.tags = ['Payment'] +); +app.use('/', stripeRoutes +// #swagger.tags = ['Payment'] +); +app.use('/', orderRoutes +// #swagger.tags = ['Order'] +); +app.use('/', productRoutes +// #swagger.tags = ['Product'] +); +app.use('/', categoryRoutes +// #swagger.tags = ['Product'] +); +app.use('/', allergenRoutes +// #swagger.tags = ['Product'] +); +app.use('/', restaurantRoutes +// #swagger.tags = ['Restaurant'] +); +app.use('/', deliveryRoutes +// #swagger.tags = ['Delivery'] +); +app.use('/', deliveryPersonRoutes +// #swagger.tags = ['Delivery'] +); +app.use('/', logRoutes +// #swagger.tags = ['Log'] +); +app.use('/', metricRoutes +// #swagger.tags = ['Metric'] +); +app.use('/', promotionRoutes +// #swagger.tags = ['Promotion'] +); +app.use('/', stockRoutes +// #swagger.tags = ['Stock'] +); +app.use('/', stockPersonRoutes +// #swagger.tags = ['Stock'] +); +app.use('/', notificationRoutes +// #swagger.tags = ['Notification'] ); app.listen(PORT, () => { From 73f5ad9365f03fd6735eca25de8194da1429c217 Mon Sep 17 00:00:00 2001 From: Pierre Lebigre Date: Sun, 27 Aug 2023 13:46:58 +0200 Subject: [PATCH 495/883] Create channel for notification --- services/notification/src/lib/amqp.ts | 50 +++++++++++++++++---------- 1 file changed, 32 insertions(+), 18 deletions(-) diff --git a/services/notification/src/lib/amqp.ts b/services/notification/src/lib/amqp.ts index 22333df5..af2cbe04 100644 --- a/services/notification/src/lib/amqp.ts +++ b/services/notification/src/lib/amqp.ts @@ -9,6 +9,18 @@ import { CreateNotification } from "@notifications/handler/create"; const DEFAULT_QUEUE = "log"; const DEFAULT_SUB_QUEUE = "notification"; + +async function createQueue(queue = DEFAULT_QUEUE) { + try { + const connection = await amqp.connect(process.env.AMQP_URL || ""); + const channel = await connection.createChannel(); + await channel.assertQueue(queue, { durable: false }); + return channel; + } catch (error) { + return error as Error; + } +} + async function connectQueue(queue = DEFAULT_QUEUE) { try { const connection = await amqp.connect(process.env.AMQP_URL || ""); @@ -37,36 +49,38 @@ export const publish = async (message: any, queue = DEFAULT_QUEUE) => { }; const toNotification = (message: any) => { - const { email, title, messageTexte } = JSON.parse(message.content.toString()); - return { email: email, title: title, messageTexte: messageTexte, messageType: MessageType.OUTPUT }; + const { email, title, messageText: messageText } = JSON.parse(message.content.toString()); + return { email: email, title: title, messageText: messageText, messageType: MessageType.OUTPUT }; } export const subscribe = async (queue = DEFAULT_SUB_QUEUE) => { - const channel = await connectQueue(queue); + const channel = await createQueue(queue); if (channel instanceof Error) - return console.log("Error to connect to queue: ", channel); - channel.consume( - queue, - async function(message) { - const { email, title, messageTexte, messageType } = toNotification(message); + return console.log("Error to create queue: ", channel); + + await channel.consume( + queue, + async function (message) { + const {email, title, messageText, messageType} = toNotification(message); const notification = { - request: - { - title: title, - message: messageTexte, - message_type: messageType as unknown as MessageType - } + request: + { + title: title, + message: messageText, + message_type: messageType as unknown as MessageType + } } as Data - CreateNotification(notification, () => {}); + await CreateNotification(notification, () => { + }); - const { success } = await plunk.emails.send({ + const {success} = await plunk.emails.send({ to: email, - body: messageTexte, + body: messageText, subject: title }); - if(success) + if (success) log.debug( msg("AMQP", `${queue} (queue)`, new Date(), new Date()), "Email send" From cf2c0a6d725cac4a18e655945a8e5a672128fe96 Mon Sep 17 00:00:00 2001 From: anatole Date: Sun, 27 Aug 2023 13:51:20 +0200 Subject: [PATCH 496/883] feat(gateway): map port event broker --- services/docker-compose.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/docker-compose.yml b/services/docker-compose.yml index 0427bb7f..64d0a249 100644 --- a/services/docker-compose.yml +++ b/services/docker-compose.yml @@ -376,7 +376,7 @@ services: image: rabbitmq:3-management ports: - "5672" - - "15672" + - "15672:15672" networks: - goodfood-network From ed2037c4a890bd523fff2b5c5e71b49db2066202 Mon Sep 17 00:00:00 2001 From: Pierre Lebigre Date: Sun, 27 Aug 2023 15:50:40 +0200 Subject: [PATCH 497/883] Update create product --- .../product/src/handler/Product/create.ts | 53 ++++++++++++------- 1 file changed, 33 insertions(+), 20 deletions(-) diff --git a/services/product/src/handler/Product/create.ts b/services/product/src/handler/Product/create.ts index 1810df36..05d14f5a 100644 --- a/services/product/src/handler/Product/create.ts +++ b/services/product/src/handler/Product/create.ts @@ -8,6 +8,8 @@ import { Category } from "@product/types/Category"; import { Product } from "@product/types/Product"; import prisma from "@product/lib/prisma"; import { ServerErrorResponse } from "@grpc/grpc-js"; +import {ReadCategory} from "@product/handler/Category/read"; +import {CreateCategory} from "@product/handler/Category/create"; export const CreateProduct = async ( { request }: Data, @@ -16,23 +18,42 @@ export const CreateProduct = async ( try { const { name, image, comment, price, preparation, weight, kilocalories, nutriscore, restaurant_id, type, categories, allergens } = request; + const handleMapRequest = (err: any, response: Allergen | Category | null) => { + if (err) { + log.error(err); + } else { + return response; + } + }; + allergens.map(async allergen => { if(allergen.id != "" && allergen.id != null) - ReadAllergen({ - request: { id: allergen.id } - }, handlMapAllergen); + await ReadAllergen({ + request: {id: allergen.id} + }, () =>{ + CreateAllergen({ + request: allergen + }, handleMapRequest) + }); else - CreateAllergen({ - request: allergen - }, handlMapAllergen); + await CreateAllergen({ + request: allergen + }, handleMapRequest); }); - categories.map(async categorie => { - const categorieFind = await prisma.category.findFirst({ - where : { libelle: categorie.libelle } - }) as Category - if(categorieFind) - categorie = categorieFind; + categories.map(async category => { + if(category.id != "" && category.id != null) + await ReadCategory({ + request: {id: category.id} + }, () =>{ + CreateCategory({ + request: category + }, handleMapRequest) + }); + else + await CreateCategory({ + request: category + }, handleMapRequest); }); const product = await prisma.product.create({ @@ -61,13 +82,5 @@ export const CreateProduct = async ( log.error(error); callback(error, null); } - - const handlMapAllergen = (err: any, response: Allergen | null) => { - if (err) { - log.error(err); - } else { - return response; - } - }; }; From 27548d0f50a284d3203a991e41c0032910ea71d0 Mon Sep 17 00:00:00 2001 From: anatole Date: Sun, 27 Aug 2023 18:04:52 +0200 Subject: [PATCH 498/883] fix(product): fix create product method --- .../controller/product/product.controller.ts | 81 ++++----- .../src/lib/swagger/swagger-output.json | 38 +++- .../product/src/handler/Product/create.ts | 172 ++++++++++-------- services/proto/product.proto | 2 +- 4 files changed, 167 insertions(+), 126 deletions(-) diff --git a/services/gateway/src/controller/product/product.controller.ts b/services/gateway/src/controller/product/product.controller.ts index 9630ac82..e82bdce9 100644 --- a/services/gateway/src/controller/product/product.controller.ts +++ b/services/gateway/src/controller/product/product.controller.ts @@ -81,12 +81,10 @@ productRoutes.post("/api/product", withCheck({ role: "ACCOUNTANT" }), (req: Requ icon: "category-icon", hexaColor: "#ffffff", }], - allergens: [ - { + allergens: [{ id:"allergen:id|null", label: "allergen-label", - } - ], + }], } } #swagger.parameters['authorization'] = { @@ -94,6 +92,7 @@ productRoutes.post("/api/product", withCheck({ role: "ACCOUNTANT" }), (req: Requ required: true, type: 'string' } */ + const { restaurantId, type, @@ -109,24 +108,8 @@ productRoutes.post("/api/product", withCheck({ role: "ACCOUNTANT" }), (req: Requ categories, } = req.body; - const allergenList = allergens.map((allergen: { id: string | null; label: string }) => { - const newAllergen = new Allergen().setLibelle(allergen.label); - if (allergen.id) newAllergen.setId(allergen.id); - return newAllergen; - }); - const categoryList = categories.map( - (category: { id: string | null; label: string; hexaColor: string; icon: string }) => { - const newCategory = new Category() - .setLibelle(category.label) - .setHexaColor(category.hexaColor) - .setIcon(category.icon); - if (category.id) newCategory.setId(category.id); - return newCategory; - }, - ); - - const productId = new Product() - .setRestaurantId(Number(restaurantId)) + const product = new Product() + .setRestaurantId(restaurantId) .setType(ProductType[type as keyof typeof ProductType]) .setName(name) .setImage(image) @@ -135,12 +118,26 @@ productRoutes.post("/api/product", withCheck({ role: "ACCOUNTANT" }), (req: Requ .setPreparation(preparation) .setWeight(weight) .setKilocalories(kilocalories) - .setNutriscore(nutriscore) - .setCategoriesList(categoryList) - .setAllergensList(allergenList); + .setNutriscore(nutriscore); + + categories.map((category: { id: string | null; label: string; hexaColor: string; icon: string }) => { + const newCategory = new Category() + .setLibelle(category.label) + .setHexaColor(category.hexaColor) + .setIcon(category.icon); + if (category.id) newCategory.setId(category.id); + product.addCategories(newCategory); + }); + + allergens.map((allergen: { id: string | null; label: string }) => { + const newAllergen = new Allergen().setLibelle(allergen.label); + if (allergen.id) newAllergen.setId(allergen.id); + product.addAllergens(newAllergen); + }); - productServiceClient.createProduct(productId, (error, response) => { + productServiceClient.createProduct(product, (error, response) => { if (error) { + console.log(error) return res.status(500).send({ error }); } else return res.status(201).json(response.toObject()); }); @@ -151,8 +148,8 @@ productRoutes.put("/api/product/:id", withCheck({ role: "ACCOUNTANT" }), (req: R in: 'body', required: true, schema: { - restaurantId: 0, - type: "type", + restaurantId: "restaurant:id", + type: {'$ref': '#/definitions/ProductType'}, name: "name", image: "bucket_url_to_image", comment: "comment", @@ -161,17 +158,16 @@ productRoutes.put("/api/product/:id", withCheck({ role: "ACCOUNTANT" }), (req: R weight: "weight", kilocalories: "0", nutriscore: 0, - categories: [ - { + categories: [{ + id: "category:id", label: "category-label", icon: "category-icon", hexaColor: "#ffffff", }], - allergens: [ - { + allergens: [{ + id:"allergen:id", label: "allergen-label", - } - ], + }], } } #swagger.parameters['authorization'] = { @@ -200,14 +196,17 @@ productRoutes.put("/api/product/:id", withCheck({ role: "ACCOUNTANT" }), (req: R allergens, } = req.body; - const allergensList = allergens.map((allergen: { label: string }) => new Allergen().setLibelle(allergen.label)); - const categoryList = categories.map((category: { label: string; hexaColor: string; icon: string }) => - new Category().setLibelle(category.label).setHexaColor(category.hexaColor).setIcon(category.icon), + const allergenList = allergens.map((allergen: { id: string; label: string }) => new Allergen().setLibelle(allergen.label).setId(allergen.id)); + const categoryList = categories.map( + (category: { id: string; label: string; hexaColor: string; icon: string }) => + new Category().setLibelle(category.label) + .setHexaColor(category.hexaColor) + .setIcon(category.icon).setId(category.id) ); - const productId = new Product() + const product = new Product() .setId(id) - .setRestaurantId(Number(restaurantId)) + .setRestaurantId(restaurantId) .setType(type) .setName(name) .setImage(image) @@ -218,9 +217,9 @@ productRoutes.put("/api/product/:id", withCheck({ role: "ACCOUNTANT" }), (req: R .setKilocalories(kilocalories) .setNutriscore(nutriscore) .setCategoriesList(categoryList) - .setAllergensList(allergensList); + .setAllergensList(allergenList); - productServiceClient.updateProduct(productId, (error, response) => { + productServiceClient.updateProduct(product, (error, response) => { if (error) return res.status(500).send({ error }); else return res.status(200).json(response.toObject()); }); diff --git a/services/gateway/src/lib/swagger/swagger-output.json b/services/gateway/src/lib/swagger/swagger-output.json index dd59cc1b..21dea176 100644 --- a/services/gateway/src/lib/swagger/swagger-output.json +++ b/services/gateway/src/lib/swagger/swagger-output.json @@ -411,12 +411,21 @@ "in": "path", "required": true, "type": "integer" + }, + { + "name": "authorization", + "in": "header", + "required": true, + "type": "string" } ], "responses": { "200": { "description": "OK" }, + "401": { + "description": "Unauthorized" + }, "500": { "description": "Internal Server Error" } @@ -434,11 +443,6 @@ "required": true, "type": "integer" }, - { - "name": "authorization", - "in": "header", - "type": "string" - }, { "name": "body", "in": "body", @@ -468,12 +472,21 @@ } } } + }, + { + "name": "authorization", + "in": "header", + "required": true, + "type": "string" } ], "responses": { "200": { "description": "OK" }, + "401": { + "description": "Unauthorized" + }, "500": { "description": "Internal Server Error" } @@ -1168,12 +1181,11 @@ "type": "object", "properties": { "restaurantId": { - "type": "number", - "example": 0 + "type": "string", + "example": "restaurant:id" }, "type": { - "type": "string", - "example": "type" + "$ref": "#/definitions/ProductType" }, "name": { "type": "string", @@ -1212,6 +1224,10 @@ "items": { "type": "object", "properties": { + "id": { + "type": "string", + "example": "category:id" + }, "label": { "type": "string", "example": "category-label" @@ -1232,6 +1248,10 @@ "items": { "type": "object", "properties": { + "id": { + "type": "string", + "example": "allergen:id" + }, "label": { "type": "string", "example": "allergen-label" diff --git a/services/product/src/handler/Product/create.ts b/services/product/src/handler/Product/create.ts index 05d14f5a..9a85de1d 100644 --- a/services/product/src/handler/Product/create.ts +++ b/services/product/src/handler/Product/create.ts @@ -1,86 +1,108 @@ -import { Product_type } from "@prisma/client"; -import { CreateAllergen } from "@product/handler/Allergen/create"; -import { ReadAllergen } from "@product/handler/Allergen/read"; -import { log } from "@product/lib/log"; -import { Data } from "@product/types"; -import { Allergen } from "@product/types/Allergen"; -import { Category } from "@product/types/Category"; -import { Product } from "@product/types/Product"; +import {Product_type} from "@prisma/client"; +import {CreateAllergen} from "@product/handler/Allergen/create"; +import {ReadAllergen} from "@product/handler/Allergen/read"; +import {log} from "@product/lib/log"; +import {Data} from "@product/types"; +import {Product} from "@product/types/Product"; import prisma from "@product/lib/prisma"; -import { ServerErrorResponse } from "@grpc/grpc-js"; +import {ServerErrorResponse} from "@grpc/grpc-js"; import {ReadCategory} from "@product/handler/Category/read"; import {CreateCategory} from "@product/handler/Category/create"; export const CreateProduct = async ( - { request }: Data, - callback: (err: ServerErrorResponse | null, response: Product | null) => void + {request}: Data, + callback: (err: ServerErrorResponse | null, response: Product | null) => void ) => { - try { - const { name, image, comment, price, preparation, weight, kilocalories, nutriscore, restaurant_id, type, categories, allergens } = request; + try { + const { + name, + image, + comment, + price, + preparation, + weight, + kilocalories, + nutriscore, + restaurant_id, + type, + categories, + allergens + } = request; + const allergenIds: { id: string }[] = []; + const categoryIds: { id: string }[] = []; + allergens.map(async allergen => { + if (allergen.id != "" && allergen.id != null) { + await ReadAllergen({request: {id: allergen.id}}, + (err, response) => { + if (err) { + log.error(err); + throw err; + } else { + if (response) allergenIds.push({id: response.id}); + } + }); + } else { + await CreateAllergen({request: allergen}, + (err, response) => { + if (err) { + log.error(err); + throw err; + } else { + if (response) allergenIds.push({id: response.id}); + } + }); + } + }); - const handleMapRequest = (err: any, response: Allergen | Category | null) => { - if (err) { - log.error(err); - } else { - return response; - } - }; + categories.map(async category => { + if (category.id != "" && category.id != null) { + await ReadCategory({request: {id: category.id}}, + (err, response) => { + if (err) { + log.error(err); + throw err; + } else { + if (response) categoryIds.push({id: response.id}); + } + }); + } else { + await CreateCategory({request: category}, + (err, response) => { + if (err) { + log.error(err); + throw err; + } else { + if (response) categoryIds.push({id: response.id}); + } + }); + } + }); - allergens.map(async allergen => { - if(allergen.id != "" && allergen.id != null) - await ReadAllergen({ - request: {id: allergen.id} - }, () =>{ - CreateAllergen({ - request: allergen - }, handleMapRequest) - }); - else - await CreateAllergen({ - request: allergen - }, handleMapRequest); - }); + const product = await prisma.product.create({ + data: { + name, + image, + comment, + price, + preparation, + weight, + kilocalories, + nutriscore, + restaurant_id, + type: type as unknown as Product_type, + categories: { + connect: categoryIds + }, + allergens: { + connect: allergenIds + } + }, + }) as unknown as Product; - categories.map(async category => { - if(category.id != "" && category.id != null) - await ReadCategory({ - request: {id: category.id} - }, () =>{ - CreateCategory({ - request: category - }, handleMapRequest) - }); - else - await CreateCategory({ - request: category - }, handleMapRequest); - }); - - const product = await prisma.product.create({ - data: { - name, - image, - comment, - price, - preparation, - weight, - kilocalories, - nutriscore, - restaurant_id, - type: type as unknown as Product_type, - categories: { - connect: categories - }, - allergens: { - connect: allergens - } - }, - }) as unknown as Product; - - callback(null, product); - } catch (error: ServerErrorResponse | any) { - log.error(error); - callback(error, null); - } + callback(null, product); + } catch (error: ServerErrorResponse | any) { + log.error(error); + callback(error, null); + } }; diff --git a/services/proto/product.proto b/services/proto/product.proto index a5842c75..15f3fc68 100644 --- a/services/proto/product.proto +++ b/services/proto/product.proto @@ -40,7 +40,7 @@ message Product { string weight = 7; string kilocalories = 8; int32 nutriscore = 9; - int32 restaurant_id = 10; + string restaurant_id = 10; ProductType type = 11; repeated Category categories = 12; repeated Allergen allergens = 13; From a3c49c9a574072b21241631340a8ba2ac530dae7 Mon Sep 17 00:00:00 2001 From: anatole Date: Sun, 27 Aug 2023 20:44:24 +0200 Subject: [PATCH 499/883] fix(product): fix create and update product method --- .../controller/product/product.controller.ts | 208 ++++++++---------- .../src/lib/swagger/swagger-output.json | 36 +-- .../product/src/handler/Product/create.ts | 61 +---- .../product/src/handler/Product/update.ts | 85 ++++--- 4 files changed, 153 insertions(+), 237 deletions(-) diff --git a/services/gateway/src/controller/product/product.controller.ts b/services/gateway/src/controller/product/product.controller.ts index e82bdce9..333e6681 100644 --- a/services/gateway/src/controller/product/product.controller.ts +++ b/services/gateway/src/controller/product/product.controller.ts @@ -9,10 +9,10 @@ export const productRoutes = Router(); productRoutes.get("/api/product/by-restaurant/:id", (req: Request, res: Response) => { /* #swagger.parameters['id'] = { - in: 'path', - required: true, - type: 'string' - } */ + in: 'path', + required: true, + type: 'string' + } */ const { id } = req.params; productServiceClient.getProductList(new RestaurantId().setId(id), (error, response) => { @@ -23,10 +23,10 @@ productRoutes.get("/api/product/by-restaurant/:id", (req: Request, res: Response productRoutes.get("/api/product/:id", (req: Request, res: Response) => { /* #swagger.parameters['id'] = { - in: 'path', - required: true, - type: 'string' - } */ + in: 'path', + required: true, + type: 'string' + } */ const { id } = req.params; productServiceClient.readProduct(new ProductId().setId(id), (error, response) => { if (error) return res.status(500).send({ error }); @@ -43,15 +43,15 @@ productRoutes.get("/api/product/type", (_: Request, res: Response) => { productRoutes.delete("/api/product/:id", withCheck({ role: "ACCOUNTANT" }), (req: Request, res: Response) => { /* #swagger.parameters['authorization'] = { - in: 'header', - required: true, - type: 'string' - } - #swagger.parameters['id'] = { - in: 'path', - required: true, - type: 'string' - } */ + in: 'header', + required: true, + type: 'string' + } + #swagger.parameters['id'] = { + in: 'path', + required: true, + type: 'string' + } */ const { id } = req.params; const productId = new ProductId().setId(id); productServiceClient.deleteProduct(productId, (error, response) => { @@ -62,36 +62,32 @@ productRoutes.delete("/api/product/:id", withCheck({ role: "ACCOUNTANT" }), (req productRoutes.post("/api/product", withCheck({ role: "ACCOUNTANT" }), (req: Request, res: Response) => { /* #swagger.parameters['body'] = { - in: 'body', - required: true, - schema: { - restaurantId: "restaurant:id", - type: {'$ref': '#/definitions/ProductType'}, - name: "name", - image: "bucket_url_to_image", - comment: "comment", - price: 0, - preparation: "preparation", - weight: "weight", - kilocalories: "0", - nutriscore: 0, - categories: [{ - id: "category:id|null", - label: "category-label", - icon: "category-icon", - hexaColor: "#ffffff", - }], - allergens: [{ - id:"allergen:id|null", - label: "allergen-label", - }], + in: 'body', + required: true, + schema: { + restaurantId: "restaurant:id", + type: {'$ref': '#/definitions/ProductType'}, + name: "name", + image: "bucket_url_to_image", + comment: "comment", + price: 0, + preparation: "preparation", + weight: "weight", + kilocalories: "0", + nutriscore: 0, + categories: [{ + id: "category:id", + }], + allergens: [{ + id:"allergen:id" + }], + } } - } - #swagger.parameters['authorization'] = { - in: 'header', - required: true, - type: 'string' - } */ + #swagger.parameters['authorization'] = { + in: 'header', + required: true, + type: 'string' + } */ const { restaurantId, @@ -108,6 +104,9 @@ productRoutes.post("/api/product", withCheck({ role: "ACCOUNTANT" }), (req: Requ categories, } = req.body; + const categoryList = categories.map((category: { id: string }) => new Category().setId(category.id)); + const allergenList = allergens.map((allergen: { id: string }) => new Allergen().setId(allergen.id)); + const product = new Product() .setRestaurantId(restaurantId) .setType(ProductType[type as keyof typeof ProductType]) @@ -118,26 +117,13 @@ productRoutes.post("/api/product", withCheck({ role: "ACCOUNTANT" }), (req: Requ .setPreparation(preparation) .setWeight(weight) .setKilocalories(kilocalories) - .setNutriscore(nutriscore); - - categories.map((category: { id: string | null; label: string; hexaColor: string; icon: string }) => { - const newCategory = new Category() - .setLibelle(category.label) - .setHexaColor(category.hexaColor) - .setIcon(category.icon); - if (category.id) newCategory.setId(category.id); - product.addCategories(newCategory); - }); - - allergens.map((allergen: { id: string | null; label: string }) => { - const newAllergen = new Allergen().setLibelle(allergen.label); - if (allergen.id) newAllergen.setId(allergen.id); - product.addAllergens(newAllergen); - }); + .setNutriscore(nutriscore) + .setCategoriesList(categoryList) + .setAllergensList(allergenList); productServiceClient.createProduct(product, (error, response) => { if (error) { - console.log(error) + console.log(error); return res.status(500).send({ error }); } else return res.status(201).json(response.toObject()); }); @@ -145,41 +131,37 @@ productRoutes.post("/api/product", withCheck({ role: "ACCOUNTANT" }), (req: Requ productRoutes.put("/api/product/:id", withCheck({ role: "ACCOUNTANT" }), (req: Request, res: Response) => { /* #swagger.parameters['body'] = { - in: 'body', - required: true, - schema: { - restaurantId: "restaurant:id", - type: {'$ref': '#/definitions/ProductType'}, - name: "name", - image: "bucket_url_to_image", - comment: "comment", - price: 0, - preparation: "preparation", - weight: "weight", - kilocalories: "0", - nutriscore: 0, - categories: [{ - id: "category:id", - label: "category-label", - icon: "category-icon", - hexaColor: "#ffffff", - }], - allergens: [{ - id:"allergen:id", - label: "allergen-label", - }], + in: 'body', + required: true, + schema: { + restaurantId: "restaurant:id", + type: {'$ref': '#/definitions/ProductType'}, + name: "name", + image: "bucket_url_to_image", + comment: "comment", + price: 0, + preparation: "preparation", + weight: "weight", + kilocalories: "0", + nutriscore: 0, + categories: [{ + id: "category:id" + }], + allergens: [{ + id:"allergen:id" + }], + } + } + #swagger.parameters['authorization'] = { + in: 'header', + required: true, + type: 'string' } - } - #swagger.parameters['authorization'] = { - in: 'header', - required: true, - type: 'string' - } - #swagger.parameters['id'] = { - in: 'path', - required: true, - type: 'string' - } */ + #swagger.parameters['id'] = { + in: 'path', + required: true, + type: 'string' + } */ const { id } = req.params; const { restaurantId, @@ -196,18 +178,14 @@ productRoutes.put("/api/product/:id", withCheck({ role: "ACCOUNTANT" }), (req: R allergens, } = req.body; - const allergenList = allergens.map((allergen: { id: string; label: string }) => new Allergen().setLibelle(allergen.label).setId(allergen.id)); - const categoryList = categories.map( - (category: { id: string; label: string; hexaColor: string; icon: string }) => - new Category().setLibelle(category.label) - .setHexaColor(category.hexaColor) - .setIcon(category.icon).setId(category.id) - ); + + const categoryList = categories.map((category: { id: string }) => new Category().setId(category.id)); + const allergenList = allergens.map((allergen: { id: string }) => new Allergen().setId(allergen.id)); const product = new Product() .setId(id) .setRestaurantId(restaurantId) - .setType(type) + .setType(ProductType[type as keyof typeof ProductType]) .setName(name) .setImage(image) .setComment(comment) @@ -227,17 +205,17 @@ productRoutes.put("/api/product/:id", withCheck({ role: "ACCOUNTANT" }), (req: R productRoutes.post("/api/product/image", withCheck({ role: "ACCOUNTANT" }), (req: Request, res: Response) => { /* #swagger.parameters['body'] = { - in: 'body', - required: true, - schema: { - input_file: Buffer + in: 'body', + required: true, + schema: { + input_file: Buffer + } } - } - #swagger.parameters['authorization'] = { - in: 'header', - required: true, - type: 'string' - } */ + #swagger.parameters['authorization'] = { + in: 'header', + required: true, + type: 'string' + } */ const { input_file } = req.body; const bitmap = fs.readFileSync(input_file); const base64File = new Buffer(bitmap).toString("base64"); diff --git a/services/gateway/src/lib/swagger/swagger-output.json b/services/gateway/src/lib/swagger/swagger-output.json index 21dea176..557f47a0 100644 --- a/services/gateway/src/lib/swagger/swagger-output.json +++ b/services/gateway/src/lib/swagger/swagger-output.json @@ -1227,18 +1227,6 @@ "id": { "type": "string", "example": "category:id" - }, - "label": { - "type": "string", - "example": "category-label" - }, - "icon": { - "type": "string", - "example": "category-icon" - }, - "hexaColor": { - "type": "string", - "example": "#ffffff" } } } @@ -1251,10 +1239,6 @@ "id": { "type": "string", "example": "allergen:id" - }, - "label": { - "type": "string", - "example": "allergen-label" } } } @@ -1355,19 +1339,7 @@ "properties": { "id": { "type": "string", - "example": "category:id|null" - }, - "label": { - "type": "string", - "example": "category-label" - }, - "icon": { - "type": "string", - "example": "category-icon" - }, - "hexaColor": { - "type": "string", - "example": "#ffffff" + "example": "category:id" } } } @@ -1379,11 +1351,7 @@ "properties": { "id": { "type": "string", - "example": "allergen:id|null" - }, - "label": { - "type": "string", - "example": "allergen-label" + "example": "allergen:id" } } } diff --git a/services/product/src/handler/Product/create.ts b/services/product/src/handler/Product/create.ts index 9a85de1d..e558c886 100644 --- a/services/product/src/handler/Product/create.ts +++ b/services/product/src/handler/Product/create.ts @@ -1,13 +1,9 @@ import {Product_type} from "@prisma/client"; -import {CreateAllergen} from "@product/handler/Allergen/create"; -import {ReadAllergen} from "@product/handler/Allergen/read"; import {log} from "@product/lib/log"; import {Data} from "@product/types"; import {Product} from "@product/types/Product"; import prisma from "@product/lib/prisma"; import {ServerErrorResponse} from "@grpc/grpc-js"; -import {ReadCategory} from "@product/handler/Category/read"; -import {CreateCategory} from "@product/handler/Category/create"; export const CreateProduct = async ( {request}: Data, @@ -28,55 +24,6 @@ export const CreateProduct = async ( categories, allergens } = request; - const allergenIds: { id: string }[] = []; - const categoryIds: { id: string }[] = []; - allergens.map(async allergen => { - if (allergen.id != "" && allergen.id != null) { - await ReadAllergen({request: {id: allergen.id}}, - (err, response) => { - if (err) { - log.error(err); - throw err; - } else { - if (response) allergenIds.push({id: response.id}); - } - }); - } else { - await CreateAllergen({request: allergen}, - (err, response) => { - if (err) { - log.error(err); - throw err; - } else { - if (response) allergenIds.push({id: response.id}); - } - }); - } - }); - - categories.map(async category => { - if (category.id != "" && category.id != null) { - await ReadCategory({request: {id: category.id}}, - (err, response) => { - if (err) { - log.error(err); - throw err; - } else { - if (response) categoryIds.push({id: response.id}); - } - }); - } else { - await CreateCategory({request: category}, - (err, response) => { - if (err) { - log.error(err); - throw err; - } else { - if (response) categoryIds.push({id: response.id}); - } - }); - } - }); const product = await prisma.product.create({ data: { @@ -91,12 +38,16 @@ export const CreateProduct = async ( restaurant_id, type: type as unknown as Product_type, categories: { - connect: categoryIds + connect: categories.map((category) => ({id: category.id})) }, allergens: { - connect: allergenIds + connect: allergens.map((allergen) => ({id: allergen.id})) } }, + include: { + categories: true, + allergens: true, + } }) as unknown as Product; callback(null, product); diff --git a/services/product/src/handler/Product/update.ts b/services/product/src/handler/Product/update.ts index 5e3935b3..3b36b763 100644 --- a/services/product/src/handler/Product/update.ts +++ b/services/product/src/handler/Product/update.ts @@ -1,42 +1,61 @@ -import { Product } from "@product/types/Product"; -import { Data } from "@product/types"; -import { prisma } from "@product/lib/prisma"; -import { log } from "@product/lib/log"; -import { Product_type } from "@prisma/client"; -import { ServerErrorResponse } from "@grpc/grpc-js"; +import {Product} from "@product/types/Product"; +import {Data} from "@product/types"; +import {prisma} from "@product/lib/prisma"; +import {log} from "@product/lib/log"; +import {Product_type} from "@prisma/client"; +import {ServerErrorResponse} from "@grpc/grpc-js"; export const UpdateProduct = async ( - { request }: Data, - callback: (err: ServerErrorResponse | null, response: any) => void + {request}: Data, + callback: (err: ServerErrorResponse | null, response: any) => void ) => { - try { - const { id, name, image, comment, price, preparation, weight, kilocalories, nutriscore, restaurant_id, type, categories, allergens } = request; + log.error(request); + try { + const { + id, + name, + image, + comment, + price, + preparation, + weight, + kilocalories, + nutriscore, + restaurant_id, + type, + categories, + allergens + } = request; - const product = await prisma.product.update({ - where : { id }, + const product = await prisma.product.update({ + where: {id}, data: { - name, - image, - comment, - price, - preparation, - weight, - kilocalories, - nutriscore, - restaurant_id, - type: type as unknown as Product_type, - categories: { - connect: categories - }, - allergens: { - connect: allergens - } + name, + image, + comment, + price, + preparation, + weight, + kilocalories, + nutriscore, + restaurant_id, + type: type as unknown as Product_type, + categories: { + connect: categories.map((category) => ({id: category.id})) + }, + allergens: { + connect: allergens.map((allergen) => ({id: allergen.id})) + } }, + include: { + categories: true, + allergens: true, + } }) as unknown as Product; - callback(null, product); - } catch (error: ServerErrorResponse | any) { - log.error(error); - callback(error, null); - } + callback(null, product); + } catch (error: ServerErrorResponse | any) { + log.error(error); + callback(error, null); + } }; \ No newline at end of file From 55197c10c4f3f926e87354c436195ec3984a1897 Mon Sep 17 00:00:00 2001 From: Pierre Lebigre Date: Sun, 27 Aug 2023 20:56:25 +0200 Subject: [PATCH 500/883] Fix parseContext of middleware log --- services/product/src/middleware/log.ts | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/services/product/src/middleware/log.ts b/services/product/src/middleware/log.ts index fd54a9f8..378e19c8 100644 --- a/services/product/src/middleware/log.ts +++ b/services/product/src/middleware/log.ts @@ -13,9 +13,17 @@ type Context = { const parseContext = (ctx: Context) => { const { - call: { request }, - service: { path }, - } = ctx; + call, + service, + } = ctx || {}; + + const { + request + } = call || {}; + const { + path + } = service || { path: "" }; + return { request, path }; }; From a26b0b8df7d1b4a338f885b22523526aea52f891 Mon Sep 17 00:00:00 2001 From: anatole Date: Sun, 27 Aug 2023 21:04:15 +0200 Subject: [PATCH 501/883] fix(product): fix list method --- services/product/src/handler/Product/list.ts | 34 ++++++++++++-------- 1 file changed, 20 insertions(+), 14 deletions(-) diff --git a/services/product/src/handler/Product/list.ts b/services/product/src/handler/Product/list.ts index 8166cea2..23f6e3be 100644 --- a/services/product/src/handler/Product/list.ts +++ b/services/product/src/handler/Product/list.ts @@ -1,21 +1,27 @@ -import { ProductList, RestaurantId } from "@product/types/Product"; -import { Data } from "@product/types"; -import { log } from "@product/lib/log"; +import {Product, ProductList, RestaurantId} from "@product/types/Product"; +import {Data} from "@product/types"; +import {log} from "@product/lib/log"; import prisma from "@product/lib/prisma"; -import { ServerErrorResponse } from "@grpc/grpc-js"; +import {ServerErrorResponse} from "@grpc/grpc-js"; export const getProductList = async ( - { request }: Data, - callback: (err: ServerErrorResponse | any, response: ProductList | null) => void + {request}: Data, + callback: (err: ServerErrorResponse | any, response: ProductList | null) => void ) => { - try { - const { id } = request; + try { + const {id} = request; - const products = await prisma.product.findMany({ where : {restaurant_id: id} }) as unknown as ProductList; + const products = await prisma.product.findMany({ + where: {restaurant_id: id}, + include: { + categories: true, + allergens: true, + } + }) as unknown as Product[]; - callback(null, products); - } catch (error: ServerErrorResponse | any) { - log.error(error); - callback(error, null); - } + callback(null, {products}); + } catch (error: ServerErrorResponse | any) { + log.error(error); + callback(error, null); + } }; \ No newline at end of file From 133fcf76cf8791d42b5acc780cb58f44a4344183 Mon Sep 17 00:00:00 2001 From: anatole Date: Sun, 27 Aug 2023 21:18:49 +0200 Subject: [PATCH 502/883] feat(gateway): change roles acces --- .../delivery/delivery.controller.ts | 2 +- .../controller/metric/metric.controller.ts | 110 ++++++++++-------- .../src/controller/order/order.controller.ts | 22 ++-- .../controller/product/allergen.controller.ts | 24 ++-- .../controller/product/category.controller.ts | 24 ++-- .../controller/product/product.controller.ts | 58 ++++----- .../promotion/promotion.controller.ts | 10 +- .../src/controller/stock/stock.controller.ts | 46 +++++--- 8 files changed, 169 insertions(+), 127 deletions(-) diff --git a/services/gateway/src/controller/delivery/delivery.controller.ts b/services/gateway/src/controller/delivery/delivery.controller.ts index b1886a6e..95ad4b2e 100644 --- a/services/gateway/src/controller/delivery/delivery.controller.ts +++ b/services/gateway/src/controller/delivery/delivery.controller.ts @@ -45,7 +45,7 @@ deliveryRoutes.get("/api/delivery/:id", async (req: Request, res: Response) => { deliveryRoutes.get( "/api/delivery/by-restaurant/:id", - withCheck({ role: "ACCOUNTANT" }), + withCheck({ role: ["ACCOUNTANT", "ADMIN"] }), (req: Request, res: Response) => { /* #swagger.parameters['authorization'] = { in: 'header', diff --git a/services/gateway/src/controller/metric/metric.controller.ts b/services/gateway/src/controller/metric/metric.controller.ts index 128220a7..1e535dca 100644 --- a/services/gateway/src/controller/metric/metric.controller.ts +++ b/services/gateway/src/controller/metric/metric.controller.ts @@ -19,7 +19,7 @@ import { withCheck } from "@gateway/middleware/auth"; export const metricRoutes = Router(); -metricRoutes.get("/api/metric/:key", withCheck({ role: "ACCOUNTANT" }), (req, res) => { +metricRoutes.get("/api/metric/:key", withCheck({ role: ["ACCOUNTANT", "ADMIN"] }), (req, res) => { /* #swagger.parameters['authorization'] = { in: 'header', required: true, @@ -38,7 +38,7 @@ metricRoutes.get("/api/metric/:key", withCheck({ role: "ACCOUNTANT" }), (req, re }); }); -metricRoutes.post("/api/metric/by-restaurant-and-date", withCheck({ role: "ACCOUNTANT" }), (req, res) => { +metricRoutes.post("/api/metric/by-restaurant-and-date", withCheck({ role: ["ACCOUNTANT", "ADMIN"] }), (req, res) => { /* #swagger.parameters['body'] = { in: 'body', required: true, @@ -62,23 +62,27 @@ metricRoutes.post("/api/metric/by-restaurant-and-date", withCheck({ role: "ACCOU }); }); -metricRoutes.get("/api/metric/by-restaurant/:restaurantId", withCheck({ role: "ACCOUNTANT" }), (req, res) => { - /* #swagger.parameters['authorization'] = { +metricRoutes.get( + "/api/metric/by-restaurant/:restaurantId", + withCheck({ role: ["ACCOUNTANT", "ADMIN"] }), + (req, res) => { + /* #swagger.parameters['authorization'] = { in: 'header', required: true, type: 'string' } */ - const { restaurantId } = req.params; - const getMetricsByRestaurantRequest = new GetMetricsByRestaurantRequest().setRestaurantId(restaurantId); - metricService.getMetricsByRestaurant(getMetricsByRestaurantRequest, (error, response) => { - if (error) return res.status(500).send({ error }); - else return res.status(200).json(response.toObject()); - }); -}); + const { restaurantId } = req.params; + const getMetricsByRestaurantRequest = new GetMetricsByRestaurantRequest().setRestaurantId(restaurantId); + metricService.getMetricsByRestaurant(getMetricsByRestaurantRequest, (error, response) => { + if (error) return res.status(500).send({ error }); + else return res.status(200).json(response.toObject()); + }); + }, +); metricRoutes.get( "/api/metric/by-restaurant-group/:restaurantGroupId", - withCheck({ role: "ACCOUNTANT" }), + withCheck({ role: ["ACCOUNTANT", "ADMIN"] }), (req, res) => { /* #swagger.parameters['authorization'] = { in: 'header', @@ -96,7 +100,7 @@ metricRoutes.get( }, ); -metricRoutes.get("/api/metric/restaurant/:restaurantId", withCheck({ role: "ACCOUNTANT" }), (req, res) => { +metricRoutes.get("/api/metric/restaurant/:restaurantId", withCheck({ role: ["ACCOUNTANT", "ADMIN"] }), (req, res) => { /* #swagger.parameters['authorization'] = { in: 'header', required: true, @@ -109,21 +113,25 @@ metricRoutes.get("/api/metric/restaurant/:restaurantId", withCheck({ role: "ACCO }); }); -metricRoutes.get("/api/metric/restaurant-group/:restaurantGroupId", withCheck({ role: "ACCOUNTANT" }), (req, res) => { - /* #swagger.parameters['restaurantGroupId'] = { +metricRoutes.get( + "/api/metric/restaurant-group/:restaurantGroupId", + withCheck({ role: ["ACCOUNTANT", "ADMIN"] }), + (req, res) => { + /* #swagger.parameters['restaurantGroupId'] = { in: 'path', required: true, type: 'integer' }*/ - const { restaurantGroupId } = req.params; - const getRestaurantGroupRequest = new GetRestaurantGroupRequest().setId(Number(restaurantGroupId)); - metricService.getRestaurantGroup(getRestaurantGroupRequest, (error, response) => { - if (error) return res.status(500).send({ error }); - else return res.status(200).json(response.toObject()); - }); -}); + const { restaurantGroupId } = req.params; + const getRestaurantGroupRequest = new GetRestaurantGroupRequest().setId(Number(restaurantGroupId)); + metricService.getRestaurantGroup(getRestaurantGroupRequest, (error, response) => { + if (error) return res.status(500).send({ error }); + else return res.status(200).json(response.toObject()); + }); + }, +); -metricRoutes.post("/api/metric/restaurant", withCheck({ role: "ACCOUNTANT" }), (req, res) => { +metricRoutes.post("/api/metric/restaurant", withCheck({ role: ["ACCOUNTANT", "ADMIN"] }), (req, res) => { /* #swagger.parameters['body'] = { in: 'body', required: true, @@ -152,7 +160,7 @@ metricRoutes.post("/api/metric/restaurant", withCheck({ role: "ACCOUNTANT" }), ( }); }); -metricRoutes.post("/api/metric/restaurant-group", withCheck({ role: "ACCOUNTANT" }), (req, res) => { +metricRoutes.post("/api/metric/restaurant-group", withCheck({ role: ["ACCOUNTANT", "ADMIN"] }), (req, res) => { /* #swagger.parameters['body'] = { in: 'body', required: true, @@ -174,7 +182,7 @@ metricRoutes.post("/api/metric/restaurant-group", withCheck({ role: "ACCOUNTANT" }); }); -metricRoutes.put("/api/metric/restaurant/:restaurantId", withCheck({ role: "ACCOUNTANT" }), (req, res) => { +metricRoutes.put("/api/metric/restaurant/:restaurantId", withCheck({ role: ["ACCOUNTANT", "ADMIN"] }), (req, res) => { /* #swagger.parameters['body'] = { in: 'body', required: true, @@ -205,8 +213,11 @@ metricRoutes.put("/api/metric/restaurant/:restaurantId", withCheck({ role: "ACCO }); }); -metricRoutes.put("/api/metric/restaurant-group/:restaurantGroupId", withCheck({ role: "ACCOUNTANT" }), (req, res) => { - /* #swagger.parameters['restaurantGroupId'] = { +metricRoutes.put( + "/api/metric/restaurant-group/:restaurantGroupId", + withCheck({ role: ["ACCOUNTANT", "ADMIN"] }), + (req, res) => { + /* #swagger.parameters['restaurantGroupId'] = { in: 'path', required: true, type: 'integer' @@ -223,32 +234,37 @@ metricRoutes.put("/api/metric/restaurant-group/:restaurantGroupId", withCheck({ required: true, type: 'string' } */ - const { restaurantGroupId } = req.query as { restaurantGroupId: string }; - const { name } = req.body; - const updateRestaurantGroupRequest = new UpdateRestaurantGroupRequest() - .setId(Number(restaurantGroupId)) - .setName(name); + const { restaurantGroupId } = req.query as { restaurantGroupId: string }; + const { name } = req.body; + const updateRestaurantGroupRequest = new UpdateRestaurantGroupRequest() + .setId(Number(restaurantGroupId)) + .setName(name); - metricService.updateRestaurantGroup(updateRestaurantGroupRequest, (error, response) => { - if (error) return res.status(500).send({ error }); - else return res.status(200).json(response.toObject()); - }); -}); + metricService.updateRestaurantGroup(updateRestaurantGroupRequest, (error, response) => { + if (error) return res.status(500).send({ error }); + else return res.status(200).json(response.toObject()); + }); + }, +); -metricRoutes.delete("/api/metric/restaurant/:restaurantId", withCheck({ role: "ACCOUNTANT" }), (req, res) => { - /* #swagger.parameters['authorization'] = { +metricRoutes.delete( + "/api/metric/restaurant/:restaurantId", + withCheck({ role: ["ACCOUNTANT", "ADMIN"] }), + (req, res) => { + /* #swagger.parameters['authorization'] = { in: 'header', required: true, type: 'string' } */ - const { restaurantId } = req.params; - const deleteRestaurantRequest = new DeleteRestaurantRequest().setId(restaurantId); + const { restaurantId } = req.params; + const deleteRestaurantRequest = new DeleteRestaurantRequest().setId(restaurantId); - metricService.deleteRestaurant(deleteRestaurantRequest, (error, response) => { - if (error) return res.status(500).send({ error }); - else return res.status(200).json(response.toObject()); - }); -}); + metricService.deleteRestaurant(deleteRestaurantRequest, (error, response) => { + if (error) return res.status(500).send({ error }); + else return res.status(200).json(response.toObject()); + }); + }, +); metricRoutes.delete("/api/metric/restaurant-group/:restaurantGroupId", (req, res) => { /* #swagger.parameters['restaurantGroupId'] = { @@ -271,7 +287,7 @@ metricRoutes.delete("/api/metric/restaurant-group/:restaurantGroupId", (req, res }); // route should not be accessible since other services publish metrics into reporting via AMQP -metricRoutes.post("/api/metric", withCheck({ role: "ACCOUNTANT" }), (req, res) => { +metricRoutes.post("/api/metric", withCheck({ role: ["ACCOUNTANT", "ADMIN"] }), (req, res) => { /* #swagger.parameters['body'] = { in: 'body', required: true, diff --git a/services/gateway/src/controller/order/order.controller.ts b/services/gateway/src/controller/order/order.controller.ts index 85d500a3..82e6cc8c 100644 --- a/services/gateway/src/controller/order/order.controller.ts +++ b/services/gateway/src/controller/order/order.controller.ts @@ -153,8 +153,11 @@ orderRoutes.get("/api/order/by-user/:userId", async (req: Request, res: Response }); }); -orderRoutes.post("/api/order/by-status", withCheck({ role: "ACCOUNTANT" }), (req: Request, res: Response) => { - /* #swagger.parameters['body'] = { +orderRoutes.post( + "/api/order/by-status", + withCheck({ role: ["ACCOUNTANT", "ADMIN"] }), + (req: Request, res: Response) => { + /* #swagger.parameters['body'] = { in: 'body', required: true, schema: { @@ -166,14 +169,15 @@ orderRoutes.post("/api/order/by-status", withCheck({ role: "ACCOUNTANT" }), (req required: true, type: 'string' } */ - const { status }: { status: keyof typeof Status } = req.body; - const orderInput = new GetOrdersByStatusRequest().setStatus(Status[status]); + const { status }: { status: keyof typeof Status } = req.body; + const orderInput = new GetOrdersByStatusRequest().setStatus(Status[status]); - orderService.getOrdersByStatus(orderInput, (error, response) => { - if (error) return res.status(500).send({ error }); - else return res.status(200).json(response.toObject()); - }); -}); + orderService.getOrdersByStatus(orderInput, (error, response) => { + if (error) return res.status(500).send({ error }); + else return res.status(200).json(response.toObject()); + }); + }, +); orderRoutes.get("/api/order/by-delivery/:deliveryId", async (req: Request, res: Response) => { /* #swagger.parameters['authorization'] = { diff --git a/services/gateway/src/controller/product/allergen.controller.ts b/services/gateway/src/controller/product/allergen.controller.ts index 5e2130bd..a22dd9fd 100644 --- a/services/gateway/src/controller/product/allergen.controller.ts +++ b/services/gateway/src/controller/product/allergen.controller.ts @@ -24,7 +24,7 @@ allergenRoutes.get("/api/allergen/:id", (req: Request, res: Response) => { }); }); -allergenRoutes.post("/api/allergen", withCheck({ role: "ACCOUNTANT" }), (req: Request, res: Response) => { +allergenRoutes.post("/api/allergen", withCheck({ role: ["ACCOUNTANT", "ADMIN"] }), (req: Request, res: Response) => { /* #swagger.parameters['body'] = { in: 'body', required: true, @@ -45,7 +45,7 @@ allergenRoutes.post("/api/allergen", withCheck({ role: "ACCOUNTANT" }), (req: Re }); }); -allergenRoutes.put("/api/allergen/:id", withCheck({ role: "ACCOUNTANT" }), (req: Request, res: Response) => { +allergenRoutes.put("/api/allergen/:id", withCheck({ role: ["ACCOUNTANT", "ADMIN"] }), (req: Request, res: Response) => { /* #swagger.parameters['body'] = { in: 'body', required: true, @@ -67,15 +67,19 @@ allergenRoutes.put("/api/allergen/:id", withCheck({ role: "ACCOUNTANT" }), (req: }); }); -allergenRoutes.delete("/api/allergen/:id", withCheck({ role: "ACCOUNTANT" }), (req: Request, res: Response) => { - /* #swagger.parameters['authorization'] = { +allergenRoutes.delete( + "/api/allergen/:id", + withCheck({ role: ["ACCOUNTANT", "ADMIN"] }), + (req: Request, res: Response) => { + /* #swagger.parameters['authorization'] = { in: 'header', required: true, type: 'string' }*/ - const { id } = req.params; - allergenServiceClient.deleteAllergen(new AllergenId().setId(id), (error, response) => { - if (error) return res.status(500).send({ error }); - else return res.status(200).json(response.toObject()); - }); -}); + const { id } = req.params; + allergenServiceClient.deleteAllergen(new AllergenId().setId(id), (error, response) => { + if (error) return res.status(500).send({ error }); + else return res.status(200).json(response.toObject()); + }); + }, +); diff --git a/services/gateway/src/controller/product/category.controller.ts b/services/gateway/src/controller/product/category.controller.ts index 5958f073..9c408aef 100644 --- a/services/gateway/src/controller/product/category.controller.ts +++ b/services/gateway/src/controller/product/category.controller.ts @@ -27,7 +27,7 @@ categoryRoutes.get("/api/category/:id", (req: Request, res: Response) => { }); }); -categoryRoutes.post("/api/category", withCheck({ role: "ACCOUNTANT" }), (req: Request, res: Response) => { +categoryRoutes.post("/api/category", withCheck({ role: ["ACCOUNTANT", "ADMIN"] }), (req: Request, res: Response) => { /* #swagger.parameters['body'] = { in: 'body', required: true, @@ -50,7 +50,7 @@ categoryRoutes.post("/api/category", withCheck({ role: "ACCOUNTANT" }), (req: Re }); }); -categoryRoutes.put("/api/category/:id", withCheck({ role: "ACCOUNTANT" }), (req: Request, res: Response) => { +categoryRoutes.put("/api/category/:id", withCheck({ role: ["ACCOUNTANT", "ADMIN"] }), (req: Request, res: Response) => { /* #swagger.parameters['body'] = { in: 'body', required: true, @@ -79,8 +79,11 @@ categoryRoutes.put("/api/category/:id", withCheck({ role: "ACCOUNTANT" }), (req: }); }); -categoryRoutes.delete("/api/category/:id", withCheck({ role: "ACCOUNTANT" }), (req: Request, res: Response) => { - /* #swagger.parameters['authorization'] = { +categoryRoutes.delete( + "/api/category/:id", + withCheck({ role: ["ACCOUNTANT", "ADMIN"] }), + (req: Request, res: Response) => { + /* #swagger.parameters['authorization'] = { in: 'header', required: true, type: 'string' @@ -90,9 +93,10 @@ categoryRoutes.delete("/api/category/:id", withCheck({ role: "ACCOUNTANT" }), (r required: true, type: 'string' } */ - const { id } = req.params; - categoryServiceClient.deleteCategory(new CategoryId().setId(id), (error, response) => { - if (error) return res.status(500).send({ error }); - else return res.status(200).json(response.toObject()); - }); -}); + const { id } = req.params; + categoryServiceClient.deleteCategory(new CategoryId().setId(id), (error, response) => { + if (error) return res.status(500).send({ error }); + else return res.status(200).json(response.toObject()); + }); + }, +); diff --git a/services/gateway/src/controller/product/product.controller.ts b/services/gateway/src/controller/product/product.controller.ts index 333e6681..31632ddc 100644 --- a/services/gateway/src/controller/product/product.controller.ts +++ b/services/gateway/src/controller/product/product.controller.ts @@ -41,8 +41,11 @@ productRoutes.get("/api/product/type", (_: Request, res: Response) => { }); }); -productRoutes.delete("/api/product/:id", withCheck({ role: "ACCOUNTANT" }), (req: Request, res: Response) => { - /* #swagger.parameters['authorization'] = { +productRoutes.delete( + "/api/product/:id", + withCheck({ role: ["ACCOUNTANT", "ADMIN"] }), + (req: Request, res: Response) => { + /* #swagger.parameters['authorization'] = { in: 'header', required: true, type: 'string' @@ -52,15 +55,16 @@ productRoutes.delete("/api/product/:id", withCheck({ role: "ACCOUNTANT" }), (req required: true, type: 'string' } */ - const { id } = req.params; - const productId = new ProductId().setId(id); - productServiceClient.deleteProduct(productId, (error, response) => { - if (error) return res.status(500).send({ error }); - else return res.status(200).json(response.toObject()); - }); -}); - -productRoutes.post("/api/product", withCheck({ role: "ACCOUNTANT" }), (req: Request, res: Response) => { + const { id } = req.params; + const productId = new ProductId().setId(id); + productServiceClient.deleteProduct(productId, (error, response) => { + if (error) return res.status(500).send({ error }); + else return res.status(200).json(response.toObject()); + }); + }, +); + +productRoutes.post("/api/product", withCheck({ role: ["ACCOUNTANT", "ADMIN"] }), (req: Request, res: Response) => { /* #swagger.parameters['body'] = { in: 'body', required: true, @@ -123,13 +127,12 @@ productRoutes.post("/api/product", withCheck({ role: "ACCOUNTANT" }), (req: Requ productServiceClient.createProduct(product, (error, response) => { if (error) { - console.log(error); return res.status(500).send({ error }); } else return res.status(201).json(response.toObject()); }); }); -productRoutes.put("/api/product/:id", withCheck({ role: "ACCOUNTANT" }), (req: Request, res: Response) => { +productRoutes.put("/api/product/:id", withCheck({ role: ["ACCOUNTANT", "ADMIN"] }), (req: Request, res: Response) => { /* #swagger.parameters['body'] = { in: 'body', required: true, @@ -178,7 +181,6 @@ productRoutes.put("/api/product/:id", withCheck({ role: "ACCOUNTANT" }), (req: R allergens, } = req.body; - const categoryList = categories.map((category: { id: string }) => new Category().setId(category.id)); const allergenList = allergens.map((allergen: { id: string }) => new Allergen().setId(allergen.id)); @@ -203,8 +205,11 @@ productRoutes.put("/api/product/:id", withCheck({ role: "ACCOUNTANT" }), (req: R }); }); -productRoutes.post("/api/product/image", withCheck({ role: "ACCOUNTANT" }), (req: Request, res: Response) => { - /* #swagger.parameters['body'] = { +productRoutes.post( + "/api/product/image", + withCheck({ role: ["ACCOUNTANT", "ADMIN"] }), + (req: Request, res: Response) => { + /* #swagger.parameters['body'] = { in: 'body', required: true, schema: { @@ -216,13 +221,14 @@ productRoutes.post("/api/product/image", withCheck({ role: "ACCOUNTANT" }), (req required: true, type: 'string' } */ - const { input_file } = req.body; - const bitmap = fs.readFileSync(input_file); - const base64File = new Buffer(bitmap).toString("base64"); - - const file = new File().setName(input_file).setData(base64File); - productServiceClient.uploadImage(file, (error, response) => { - if (error) return res.status(500).send({ error }); - else return res.status(200).json(response.toObject()); - }); -}); + const { input_file } = req.body; + const bitmap = fs.readFileSync(input_file); + const base64File = new Buffer(bitmap).toString("base64"); + + const file = new File().setName(input_file).setData(base64File); + productServiceClient.uploadImage(file, (error, response) => { + if (error) return res.status(500).send({ error }); + else return res.status(200).json(response.toObject()); + }); + }, +); diff --git a/services/gateway/src/controller/promotion/promotion.controller.ts b/services/gateway/src/controller/promotion/promotion.controller.ts index 8b776db7..ebd88ee9 100644 --- a/services/gateway/src/controller/promotion/promotion.controller.ts +++ b/services/gateway/src/controller/promotion/promotion.controller.ts @@ -39,7 +39,7 @@ promotionRoutes.get("/api/promotion/:code", async (req, res) => { }); }); -promotionRoutes.get("/api/promotion", withCheck({ role: "ACCOUNTANT" }), (_, res) => { +promotionRoutes.get("/api/promotion", withCheck({ role: ["ACCOUNTANT", "ADMIN"] }), (_, res) => { promotionServiceClient.getPromotions(new Empty(), (error, response) => { if (error) return res.status(500).send({ error }); else return res.status(200).json(response.toObject()); @@ -48,7 +48,7 @@ promotionRoutes.get("/api/promotion", withCheck({ role: "ACCOUNTANT" }), (_, res promotionRoutes.get( "/api/promotion/by-restaurant/:restaurantId", - withCheck({ role: "ACCOUNTANT" }), + withCheck({ role: ["ACCOUNTANT", "ADMIN"] }), async (req, res) => { /* #swagger.parameters['restaurantId'] = { in: 'path', @@ -81,7 +81,7 @@ promotionRoutes.get( }, ); -promotionRoutes.post("/api/promotion", withCheck({ role: "ACCOUNTANT" }), (req, res) => { +promotionRoutes.post("/api/promotion", withCheck({ role: ["ACCOUNTANT", "ADMIN"] }), (req, res) => { /* #swagger.parameters['body'] = { in: 'body', required: true, @@ -108,7 +108,7 @@ promotionRoutes.post("/api/promotion", withCheck({ role: "ACCOUNTANT" }), (req, }); }); -promotionRoutes.put("/api/promotion/:id", withCheck({ role: "ACCOUNTANT" }), (req, res) => { +promotionRoutes.put("/api/promotion/:id", withCheck({ role: ["ACCOUNTANT", "ADMIN"] }), (req, res) => { /* #swagger.parameters['body'] = { in: 'body', required: true, @@ -144,7 +144,7 @@ promotionRoutes.put("/api/promotion/:id", withCheck({ role: "ACCOUNTANT" }), (re }); }); -promotionRoutes.delete("/api/promotion/:id", withCheck({ role: "ACCOUNTANT" }), (req, res) => { +promotionRoutes.delete("/api/promotion/:id", withCheck({ role: ["ACCOUNTANT", "ADMIN"] }), (req, res) => { /* #swagger.parameters['authorization'] = { in: 'header', required: true, diff --git a/services/gateway/src/controller/stock/stock.controller.ts b/services/gateway/src/controller/stock/stock.controller.ts index b402d330..6577b6dd 100644 --- a/services/gateway/src/controller/stock/stock.controller.ts +++ b/services/gateway/src/controller/stock/stock.controller.ts @@ -31,8 +31,11 @@ export const stockRoutes = Router(); * Ingredient Routes */ -stockRoutes.get("/api/stock/supplier/:id", withCheck({ role: "ACCOUNTANT" }), (req: Request, res: Response) => { - /* #swagger.parameters['id'] = { +stockRoutes.get( + "/api/stock/supplier/:id", + withCheck({ role: ["ACCOUNTANT", "ADMIN"] }), + (req: Request, res: Response) => { + /* #swagger.parameters['id'] = { in: 'path', required: true, type: 'integer' @@ -42,16 +45,17 @@ stockRoutes.get("/api/stock/supplier/:id", withCheck({ role: "ACCOUNTANT" }), (r required: true, type: 'string' } */ - const { id } = req.params; - const supplierRequest = new GetSupplierRequest().setId(Number(id)); + const { id } = req.params; + const supplierRequest = new GetSupplierRequest().setId(Number(id)); - stockServiceClient.getSupplier(supplierRequest, (error, response) => { - if (error) return res.status(500).send({ error }); - else return res.status(200).json(response.toObject()); - }); -}); + stockServiceClient.getSupplier(supplierRequest, (error, response) => { + if (error) return res.status(500).send({ error }); + else return res.status(200).json(response.toObject()); + }); + }, +); -stockRoutes.get("/api/stock/supplier", withCheck({ role: "ACCOUNTANT" }), (_: Request, res: Response) => { +stockRoutes.get("/api/stock/supplier", withCheck({ role: ["ACCOUNTANT", "ADMIN"] }), (_: Request, res: Response) => { /* #swagger.parameters['authorization'] = { in: 'header', required: true, @@ -64,8 +68,11 @@ stockRoutes.get("/api/stock/supplier", withCheck({ role: "ACCOUNTANT" }), (_: Re }); }); -stockRoutes.get("/api/stock/ingredient/:id", withCheck({ role: "ACCOUNTANT" }), (req: Request, res: Response) => { - /* #swagger.parameters['id'] = { +stockRoutes.get( + "/api/stock/ingredient/:id", + withCheck({ role: ["ACCOUNTANT", "ADMIN"] }), + (req: Request, res: Response) => { + /* #swagger.parameters['id'] = { in: 'path', required: true, type: 'integer' @@ -76,14 +83,15 @@ stockRoutes.get("/api/stock/ingredient/:id", withCheck({ role: "ACCOUNTANT" }), type: 'string' } */ - const { id } = req.params; - const ingredientRequest = new GetIngredientRequest().setId(Number(id)); + const { id } = req.params; + const ingredientRequest = new GetIngredientRequest().setId(Number(id)); - stockServiceClient.getIngredient(ingredientRequest, (error, response) => { - if (error) return res.status(500).send({ error }); - else return res.status(200).json(response.toObject()); - }); -}); + stockServiceClient.getIngredient(ingredientRequest, (error, response) => { + if (error) return res.status(500).send({ error }); + else return res.status(200).json(response.toObject()); + }); + }, +); stockRoutes.get("/api/stock/ingredient", withCheck({ role: ["ACCOUNTANT", "ADMIN"] }), (_: Request, res: Response) => { /* #swagger.parameters['authorization'] = { From dda534ec26ae5d8fd2e9b1d0e60f3f7505d05d72 Mon Sep 17 00:00:00 2001 From: Florian LEROUX Date: Sun, 27 Aug 2023 22:09:59 +0200 Subject: [PATCH 503/883] feat(restaurant): add userIds in restaurant service --- services/proto/restaurant.proto | 4 ++++ .../migration.sql | 2 ++ services/restaurant/prisma/schema.prisma | 5 ++++- services/restaurant/src/handler/create.ts | 12 ++++++++++-- services/restaurant/src/handler/update.ts | 13 +++++++++++-- services/restaurant/src/types/restaurant.d.ts | 2 ++ 6 files changed, 33 insertions(+), 5 deletions(-) create mode 100644 services/restaurant/prisma/migrations/20230827200541_add_restaurant_user_ids/migration.sql diff --git a/services/proto/restaurant.proto b/services/proto/restaurant.proto index ecf87eec..a9398062 100644 --- a/services/proto/restaurant.proto +++ b/services/proto/restaurant.proto @@ -15,6 +15,8 @@ message Restaurant { repeated string openingHours = 6; optional string phone = 7; + repeated string userIds = 10; + string createdAt = 8; string updatedAt = 9; } @@ -28,6 +30,8 @@ message RestaurantCreateInput{ repeated string openingHours = 5; optional string phone = 6; + + repeated string userIds = 7; } message RestaurantList { diff --git a/services/restaurant/prisma/migrations/20230827200541_add_restaurant_user_ids/migration.sql b/services/restaurant/prisma/migrations/20230827200541_add_restaurant_user_ids/migration.sql new file mode 100644 index 00000000..ee5f4ad8 --- /dev/null +++ b/services/restaurant/prisma/migrations/20230827200541_add_restaurant_user_ids/migration.sql @@ -0,0 +1,2 @@ +-- AlterTable +ALTER TABLE "Restaurant" ADD COLUMN "userIds" TEXT[]; diff --git a/services/restaurant/prisma/schema.prisma b/services/restaurant/prisma/schema.prisma index 538832e8..9531079e 100644 --- a/services/restaurant/prisma/schema.prisma +++ b/services/restaurant/prisma/schema.prisma @@ -17,7 +17,10 @@ model Restaurant { openingHours String[] - phone String? + phone String? + + userIds String[] + createdAt DateTime @default(now()) updatedAt DateTime @updatedAt } diff --git a/services/restaurant/src/handler/create.ts b/services/restaurant/src/handler/create.ts index c1f52d85..85f09680 100644 --- a/services/restaurant/src/handler/create.ts +++ b/services/restaurant/src/handler/create.ts @@ -11,8 +11,15 @@ export const CreateRestaurant = async ( callback: (err: any, response: Restaurant | null) => void ) => { try { - const { location, name, openingHours, address, description, phone } = - request; + const { + location, + name, + openingHours, + address, + description, + phone, + userIds, + } = request; const restaurant = (await prisma.restaurant.create({ data: { @@ -22,6 +29,7 @@ export const CreateRestaurant = async ( address, description, phone, + userIds, }, })) as unknown as Restaurant; diff --git a/services/restaurant/src/handler/update.ts b/services/restaurant/src/handler/update.ts index 8327c15b..bd6abd5b 100644 --- a/services/restaurant/src/handler/update.ts +++ b/services/restaurant/src/handler/update.ts @@ -8,8 +8,16 @@ export const UpdateRestaurant = async ( callback: (err: any, response: Restaurant | null) => void ) => { try { - const { id, location, name, openingHours, address, description, phone } = - request; + const { + id, + location, + name, + openingHours, + address, + description, + phone, + userIds, + } = request; const restaurant = (await prisma.restaurant.update({ where: { id }, @@ -20,6 +28,7 @@ export const UpdateRestaurant = async ( address, description, phone, + userIds, }, })) as unknown as Restaurant; diff --git a/services/restaurant/src/types/restaurant.d.ts b/services/restaurant/src/types/restaurant.d.ts index 8c073d1a..4a837979 100644 --- a/services/restaurant/src/types/restaurant.d.ts +++ b/services/restaurant/src/types/restaurant.d.ts @@ -10,6 +10,8 @@ export type Restaurant = { openingHours: string[]; phone?: string; + userIds: string[]; + createdAt: Date | string; updatedAt: Date | string; }; From 8b026bf9435e9df7ed366420323dfe35e8a023c9 Mon Sep 17 00:00:00 2001 From: Florian LEROUX Date: Sun, 27 Aug 2023 22:15:08 +0200 Subject: [PATCH 504/883] fix(build-proto): change grpc-out param --- services/proto/build-protos.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) mode change 100644 => 100755 services/proto/build-protos.sh diff --git a/services/proto/build-protos.sh b/services/proto/build-protos.sh old mode 100644 new mode 100755 index b2c08606..0cf8dca2 --- a/services/proto/build-protos.sh +++ b/services/proto/build-protos.sh @@ -10,7 +10,7 @@ mkdir -p ${PROTO_DEST} # JavaScript code generation yarn run grpc_tools_node_protoc \ --js_out=import_style=commonjs,binary:${PROTO_DEST} \ - --grpc_out=${PROTO_DEST} \ + --grpc_out=grpc_js:${PROTO_DEST} \ --plugin=protoc-gen-grpc=./node_modules/.bin/grpc_tools_node_protoc_plugin \ -I ./proto \ proto/*.proto From 964d3fb55eac9adc60191234aae16fd1002cc3c2 Mon Sep 17 00:00:00 2001 From: Florian LEROUX Date: Sun, 27 Aug 2023 22:17:24 +0200 Subject: [PATCH 505/883] ref(gateway/restaurant): add support for userIds --- .../restaurant/restaurant.controller.ts | 20 +++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/services/gateway/src/controller/restaurant/restaurant.controller.ts b/services/gateway/src/controller/restaurant/restaurant.controller.ts index 0e7f4ef4..e56b0532 100644 --- a/services/gateway/src/controller/restaurant/restaurant.controller.ts +++ b/services/gateway/src/controller/restaurant/restaurant.controller.ts @@ -58,7 +58,8 @@ restaurantRoutes.post("/api/restaurant", withCheck({ role: "ADMIN" }), (req: Req locationList: [1.099, 49.443], address: "restaurant-address", openingHoursList: ["12h-14h", "19h-22h"], - phone: "restaurant-phone" + phone: "restaurant-phone", + userIds: ["user-id-1", "user-id-2"] } } #swagger.parameters['authorization'] = { @@ -66,14 +67,15 @@ restaurantRoutes.post("/api/restaurant", withCheck({ role: "ADMIN" }), (req: Req required: true, type: 'string' } */ - const { name, description, locationList, address, openingHoursList, phone } = req.body; + const { name, description, locationList, address, openingHoursList, phone, userIds } = req.body; const restaurantCreateInput = new RestaurantCreateInput() .setName(name) .setDescription(description) .setLocationList(locationList) .setAddress(address) .setOpeninghoursList(openingHoursList) - .setPhone(phone); + .setPhone(phone) + .setUseridsList(userIds); restaurantServiceClient.createRestaurant(restaurantCreateInput, (error, response) => { if (error) return res.status(500).send({ error }); @@ -99,7 +101,8 @@ restaurantRoutes.put( locationList: [1.099, 49.443], address: "restaurant-address", openingHoursList: ["12h-14h", "19h-22h"], - phone: "restaurant-phone" + phone: "restaurant-phone", + userIds: ["user-id-1", "user-id-2"] } } #swagger.parameters['authorization'] = { @@ -108,17 +111,18 @@ restaurantRoutes.put( type: 'string' } */ const { id } = req.params; - const { name, description, locationList, address, openingHoursList, phone } = req.body; - const restaurantCreateInput = new Restaurant() + const { name, description, locationList, address, openingHoursList, phone, userIds } = req.body; + const restaurantInput = new Restaurant() .setId(id) .setName(name) .setDescription(description) .setLocationList(locationList) .setAddress(address) .setOpeninghoursList(openingHoursList) - .setPhone(phone); + .setPhone(phone) + .setUseridsList(userIds); - restaurantServiceClient.updateRestaurant(restaurantCreateInput, (error, response) => { + restaurantServiceClient.updateRestaurant(restaurantInput, (error, response) => { if (error) return res.status(500).send({ error }); else return res.status(200).json(response.toObject()); }); From 106877cf39d7ba7e765652c029529ed0fb6fee02 Mon Sep 17 00:00:00 2001 From: Florian LEROUX Date: Sun, 27 Aug 2023 23:39:20 +0200 Subject: [PATCH 506/883] ref(gateway/stock): add protection for ACCOUNTANT role **he only has access to his restaurants** --- .../src/controller/stock/stock.controller.ts | 490 ++++++++++++++++-- 1 file changed, 435 insertions(+), 55 deletions(-) diff --git a/services/gateway/src/controller/stock/stock.controller.ts b/services/gateway/src/controller/stock/stock.controller.ts index 6577b6dd..c8490519 100644 --- a/services/gateway/src/controller/stock/stock.controller.ts +++ b/services/gateway/src/controller/stock/stock.controller.ts @@ -18,13 +18,18 @@ import { GetSupplyOrdersByIngredientRestaurantRequest, GetSupplyOrdersByRestaurantRequest, GetSupplyOrdersBySupplierRequest, + IngredientRestaurant, + SupplyOrder, UpdateIngredientRequest, UpdateIngredientRestaurantRequest, UpdateSupplierRequest, UpdateSupplyOrderRequest, } from "@gateway/proto/stock_pb"; import { Empty } from "google-protobuf/google/protobuf/empty_pb"; -import { withCheck } from "@gateway/middleware/auth"; +import { check, withCheck } from "@gateway/middleware/auth"; +import { getUserIdFromToken } from "@gateway/services/user.service"; +import { restaurantServiceClient } from "@gateway/services/clients/restaurant.client"; +import { Restaurant, RestaurantId } from "@gateway/proto/restaurant_pb"; export const stockRoutes = Router(); /** @@ -168,11 +173,8 @@ stockRoutes.put( }, ); -stockRoutes.delete( - "/api/stock/ingredient/:id", - withCheck({ role: ["ACCOUNTANT", "ADMIN"] }), - (req: Request, res: Response) => { - /* #swagger.parameters['id'] = { +stockRoutes.delete("/api/stock/ingredient/:id", withCheck({ role: ["ADMIN"] }), (req: Request, res: Response) => { + /* #swagger.parameters['id'] = { in: 'path', required: true, type: 'integer' @@ -183,15 +185,14 @@ stockRoutes.delete( type: 'string' } */ - const { id } = req.params; - const ingredientRequest = new DeleteIngredientRequest().setId(Number(id)); + const { id } = req.params; + const ingredientRequest = new DeleteIngredientRequest().setId(Number(id)); - stockServiceClient.deleteIngredient(ingredientRequest, (error, response) => { - if (error) return res.status(500).send({ error }); - else return res.status(200).json(response.toObject()); - }); - }, -); + stockServiceClient.deleteIngredient(ingredientRequest, (error, response) => { + if (error) return res.status(500).send({ error }); + else return res.status(200).json(response.toObject()); + }); +}); /** * Ingredient Restaurant Routes @@ -200,7 +201,7 @@ stockRoutes.delete( stockRoutes.get( "/api/stock/ingredient/restaurant/:id", withCheck({ role: ["ACCOUNTANT", "ADMIN"] }), - (req: Request, res: Response) => { + async (req: Request, res: Response) => { /* #swagger.parameters['id'] = { in: 'path', required: true, @@ -212,31 +213,85 @@ stockRoutes.get( type: 'string' } */ + // Auth check and :id check --- + const { authorization } = req.headers; + if (!authorization) return res.status(401).json({ message: "Unauthorized" }); + const token = authorization.split("Bearer ")[1]; + const userId = await getUserIdFromToken(token); + if (!userId) return res.status(401).json({ message: "Unauthorized" }); + // ---------------------------- + const { id } = req.params; const ingredientRestaurantRequest = new GetIngredientRestaurantRequest().setId(Number(id)); - stockServiceClient.getIngredientRestaurant(ingredientRestaurantRequest, (error, response) => { - if (error) return res.status(500).send({ error }); - else return res.status(200).json(response.toObject()); - }); + try { + // todo: refactor this into a getter + const ingredient_restaurant: IngredientRestaurant.AsObject = await new Promise((resolve, reject) => { + stockServiceClient.getIngredientRestaurant(ingredientRestaurantRequest, (error, response) => { + if (error) reject(error); + else resolve(response.toObject()); + }); + }); + + // todo: refactor this into a getter + const restaurant: Restaurant.AsObject = await new Promise((resolve, reject) => { + restaurantServiceClient.getRestaurant( + new RestaurantId().setId(ingredient_restaurant.restaurantId), + (error, response) => { + if (error) reject(error); + else resolve(response.toObject()); + }, + ); + }); + + if (!(await check(token, { role: "ADMIN" })) && !restaurant.useridsList.includes(userId.toString())) + return res.status(401).json({ message: "Unauthorized" }); + + return res.status(200).json(ingredient_restaurant); + } catch (error) { + return res.status(500).send({ error }); + } }, ); stockRoutes.get( "/api/stock/ingredient/restaurant/by-restaurant/:id", withCheck({ role: ["ACCOUNTANT", "ADMIN"] }), - (req: Request, res: Response) => { + async (req: Request, res: Response) => { /* #swagger.parameters['authorization'] = { in: 'header', required: true, type: 'string' } */ + + // Auth check and :id check --- + const { authorization } = req.headers; + if (!authorization) return res.status(401).json({ message: "Unauthorized" }); + const token = authorization.split("Bearer ")[1]; + const userId = await getUserIdFromToken(token); + if (!userId) return res.status(401).json({ message: "Unauthorized" }); + // ---------------------------- const { id } = req.params; const ingredientRestaurantsByRestaurantRequest = new GetIngredientRestaurantsByRestaurantRequest().setRestaurantId( id, ); + try { + // todo: refactor this into a getter + const restaurant: Restaurant.AsObject = await new Promise((resolve, reject) => { + restaurantServiceClient.getRestaurant(new RestaurantId().setId(id), (error, response) => { + if (error) reject(error); + else resolve(response.toObject()); + }); + }); + + if (!(await check(token, { role: "ADMIN" })) && !restaurant.useridsList.includes(userId.toString())) + return res.status(401).json({ message: "Unauthorized" }); + } catch (error) { + return res.status(500).send({ error }); + } + stockServiceClient.getIngredientRestaurantsByRestaurant( ingredientRestaurantsByRestaurantRequest, (error, response) => { @@ -270,7 +325,7 @@ stockRoutes.get( stockRoutes.post( "/api/stock/ingredient/restaurant", withCheck({ role: ["ACCOUNTANT", "ADMIN"] }), - (req: Request, res: Response) => { + async (req: Request, res: Response) => { /* #swagger.parameters['body'] = { in: 'body', required: true, @@ -290,6 +345,14 @@ stockRoutes.post( type: 'string' } */ + // Auth check and :id check --- + const { authorization } = req.headers; + if (!authorization) return res.status(401).json({ message: "Unauthorized" }); + const token = authorization.split("Bearer ")[1]; + const userId = await getUserIdFromToken(token); + if (!userId) return res.status(401).json({ message: "Unauthorized" }); + // ---------------------------- + const { alertThreshold, quantity, productList, unitPrice, pricePerKilo, restaurantId, ingredientId } = req.body; const ingredientRestaurant = new CreateIngredientRestaurantRequest() .setAlertThreshold(alertThreshold) @@ -300,6 +363,21 @@ stockRoutes.post( .setRestaurantId(restaurantId) .setIngredientId(ingredientId); + try { + // todo: refactor this into a getter + const restaurant: Restaurant.AsObject = await new Promise((resolve, reject) => { + restaurantServiceClient.getRestaurant(new RestaurantId().setId(restaurantId), (error, response) => { + if (error) reject(error); + else resolve(response.toObject()); + }); + }); + + if (!(await check(token, { role: "ADMIN" })) && !restaurant.useridsList.includes(userId.toString())) + return res.status(401).json({ message: "Unauthorized" }); + } catch (error) { + return res.status(500).send({ error }); + } + stockServiceClient.createIngredientRestaurant(ingredientRestaurant, (error, response) => { if (error) return res.status(500).send({ error }); else return res.status(201).json(response.toObject()); @@ -310,31 +388,39 @@ stockRoutes.post( stockRoutes.put( "/api/stock/ingredient/restaurant/:id", withCheck({ role: ["ACCOUNTANT", "ADMIN"] }), - (req: Request, res: Response) => { - /* #swagger.parameters['id'] = { - in: 'path', - required: true, - type: 'integer' - } - #swagger.parameters['body'] = { - in: 'body', - required: true, - schema: { - alertThreshold: 5, - quantity: 2, - productList: ["product_id:1", "product_id:2"], - unitPrice: 2, - pricePerKilo: 1.5, - restaurantId: "restaurant_id:1", - ingredientId: 1, - } - } - #swagger.parameters['authorization'] = { - in: 'header', - required: true, - type: 'string' + async (req: Request, res: Response) => { + /* + #swagger.parameters['id'] = { + in: 'path', + required: true, + type: 'integer' + } + #swagger.parameters['body'] = { + in: 'body', + required: true, + schema: { + alertThreshold: 5, + quantity: 2, + productList: ["product_id:1", "product_id:2"], + unitPrice: 2, + pricePerKilo: 1.5, + restaurantId: "restaurant_id:1", + ingredientId: 1, } + } + #swagger.parameters['authorization'] = { + in: 'header', + required: true, + type: 'string' + } */ + // Auth check and :id check --- + const { authorization } = req.headers; + if (!authorization) return res.status(401).json({ message: "Unauthorized" }); + const token = authorization.split("Bearer ")[1]; + const userId = await getUserIdFromToken(token); + if (!userId) return res.status(401).json({ message: "Unauthorized" }); + // ---------------------------- const { id } = req.params; const { alertThreshold, quantity, productList, unitPrice, pricePerKilo, restaurantId, ingredientId } = req.body; const ingredientRestaurant = new UpdateIngredientRestaurantRequest() @@ -347,6 +433,21 @@ stockRoutes.put( .setRestaurantId(restaurantId) .setIngredientId(ingredientId); + try { + // todo: refactor this into a getter + const restaurant: Restaurant.AsObject = await new Promise((resolve, reject) => { + restaurantServiceClient.getRestaurant(new RestaurantId().setId(restaurantId), (error, response) => { + if (error) reject(error); + else resolve(response.toObject()); + }); + }); + + if (!(await check(token, { role: "ADMIN" })) && !restaurant.useridsList.includes(userId.toString())) + return res.status(401).json({ message: "Unauthorized" }); + } catch (error) { + return res.status(500).send({ error }); + } + stockServiceClient.updateIngredientRestaurant(ingredientRestaurant, (error, response) => { if (error) return res.status(500).send({ error }); else return res.status(200).json(response.toObject()); @@ -357,7 +458,7 @@ stockRoutes.put( stockRoutes.delete( "/api/stock/ingredient/restaurant/:id", withCheck({ role: ["ACCOUNTANT", "ADMIN"] }), - (req: Request, res: Response) => { + async (req: Request, res: Response) => { /* #swagger.parameters['id'] = { in: 'path', required: true, @@ -369,8 +470,44 @@ stockRoutes.delete( type: 'string' } */ + // Auth check and :id check --- + const { authorization } = req.headers; + if (!authorization) return res.status(401).json({ message: "Unauthorized" }); + const token = authorization.split("Bearer ")[1]; + const userId = await getUserIdFromToken(token); + if (!userId) return res.status(401).json({ message: "Unauthorized" }); + // ---------------------------- const { id } = req.params; + try { + // todo: refactor this into a getter + const ingredientRestaurant: IngredientRestaurant.AsObject = await new Promise((resolve, reject) => { + stockServiceClient.getIngredientRestaurant( + new GetIngredientRestaurantRequest().setId(Number(id)), + (error, response) => { + if (error) reject(error); + else resolve(response.toObject()); + }, + ); + }); + + // todo: refactor this into a getter + const restaurant: Restaurant.AsObject = await new Promise((resolve, reject) => { + restaurantServiceClient.getRestaurant( + new RestaurantId().setId(ingredientRestaurant.restaurantId), + (error, response) => { + if (error) reject(error); + else resolve(response.toObject()); + }, + ); + }); + + if (!(await check(token, { role: "ADMIN" })) && !restaurant.useridsList.includes(userId.toString())) + return res.status(401).json({ message: "Unauthorized" }); + } catch (error) { + return res.status(500).send({ error }); + } + stockServiceClient.deleteIngredientRestaurant( new DeleteIngredientRestaurantRequest().setId(Number(id)), (error, response) => { @@ -514,7 +651,7 @@ stockRoutes.delete( stockRoutes.get( "/api/stock/supply/order/:id", withCheck({ role: ["ACCOUNTANT", "ADMIN"] }), - (req: Request, res: Response) => { + async (req: Request, res: Response) => { /* #swagger.parameters['id'] = { in: 'path', required: true, @@ -526,20 +663,96 @@ stockRoutes.get( type: 'string' } */ + // Auth check and :id check --- + const { authorization } = req.headers; + if (!authorization) return res.status(401).json({ message: "Unauthorized" }); + const token = authorization.split("Bearer ")[1]; + const userId = await getUserIdFromToken(token); + if (!userId) return res.status(401).json({ message: "Unauthorized" }); + // ---------------------------- const { id } = req.params; - stockServiceClient.getSupplyOrder(new GetSupplyOrderRequest().setId(Number(id)), (error, response) => { - if (error) return res.status(500).send({ error }); - else return res.status(200).json(response.toObject()); - }); + try { + // todo: refactor this into a getter + const supplyOrder: SupplyOrder.AsObject = await new Promise((resolve, reject) => { + stockServiceClient.getSupplyOrder(new GetSupplyOrderRequest().setId(Number(id)), (error, response) => { + if (error) reject(error); + else resolve(response.toObject()); + }); + }); + + // todo: WARN - supplyOrder support only one product by one product so it work for now + // todo: refactor this into a getter + const ingredient_restaurant: IngredientRestaurant.AsObject = await new Promise((resolve, reject) => { + stockServiceClient.getIngredientRestaurant( + new GetIngredientRestaurantRequest().setId(supplyOrder.ingredientRestaurantId), + (error, response) => { + if (error) reject(error); + else resolve(response.toObject()); + }, + ); + }); + + // todo: refactor this into a getter + const restaurant: Restaurant.AsObject = await new Promise((resolve, reject) => { + restaurantServiceClient.getRestaurant( + new RestaurantId().setId(ingredient_restaurant.restaurantId), + (error, response) => { + if (error) reject(error); + else resolve(response.toObject()); + }, + ); + }); + + if (!(await check(token, { role: "ADMIN" })) && !restaurant.useridsList.includes(userId.toString())) + return res.status(401).json({ message: "Unauthorized" }); + + return res.status(200).json(supplyOrder); + } catch (error) { + return res.status(500).send({ error }); + } }, ); stockRoutes.get( "/api/stock/supply/order/by-restaurant/:id", withCheck({ role: ["ACCOUNTANT", "ADMIN"] }), - (req: Request, res: Response) => { + async (req: Request, res: Response) => { + /* #swagger.parameters['id'] = { + in: 'path', + required: true, + type: 'integer' + } + #swagger.parameters['authorization'] = { + in: 'header', + required: true, + type: 'string' + } + */ + // Auth check and :id check --- + const { authorization } = req.headers; + if (!authorization) return res.status(401).json({ message: "Unauthorized" }); + const token = authorization.split("Bearer ")[1]; + const userId = await getUserIdFromToken(token); + if (!userId) return res.status(401).json({ message: "Unauthorized" }); + // ---------------------------- const { id } = req.params; + + try { + // todo: refactor this into a getter + const restaurant: Restaurant.AsObject = await new Promise((resolve, reject) => { + restaurantServiceClient.getRestaurant(new RestaurantId().setId(id), (error, response) => { + if (error) reject(error); + else resolve(response.toObject()); + }); + }); + + if (!(await check(token, { role: "ADMIN" })) && !restaurant.useridsList.includes(userId.toString())) + return res.status(401).json({ message: "Unauthorized" }); + } catch (error) { + return res.status(500).send({ error }); + } + stockServiceClient.getSupplyOrdersByRestaurant( new GetSupplyOrdersByRestaurantRequest().setRestaurantId(id), (error, response) => { @@ -579,7 +792,7 @@ stockRoutes.get( stockRoutes.get( "/api/stock/supply/order/by-ingredient-restaurant/:id", withCheck({ role: ["ACCOUNTANT", "ADMIN"] }), - (req: Request, res: Response) => { + async (req: Request, res: Response) => { /* #swagger.parameters['id'] = { in: 'path', required: true, @@ -591,6 +804,43 @@ stockRoutes.get( type: 'string' } */ + // Auth check and :id check --- + const { authorization } = req.headers; + if (!authorization) return res.status(401).json({ message: "Unauthorized" }); + const token = authorization.split("Bearer ")[1]; + const userId = await getUserIdFromToken(token); + if (!userId) return res.status(401).json({ message: "Unauthorized" }); + // ---------------------------- + + try { + // todo: refactor this into a getter + const ingredient_restaurant: IngredientRestaurant.AsObject = await new Promise((resolve, reject) => { + stockServiceClient.getIngredientRestaurant( + new GetIngredientRestaurantRequest().setId(Number(req.params.id)), + (error, response) => { + if (error) reject(error); + else resolve(response.toObject()); + }, + ); + }); + + // todo: refactor this into a getter + const restaurant: Restaurant.AsObject = await new Promise((resolve, reject) => { + restaurantServiceClient.getRestaurant( + new RestaurantId().setId(ingredient_restaurant.restaurantId), + (error, response) => { + if (error) reject(error); + else resolve(response.toObject()); + }, + ); + }); + + if (!(await check(token, { role: "ADMIN" })) && !restaurant.useridsList.includes(userId.toString())) + return res.status(401).json({ message: "Unauthorized" }); + } catch (error) { + return res.status(500).send({ error }); + } + const { id } = req.params; stockServiceClient.getSupplyOrdersByIngredientRestaurant( new GetSupplyOrdersByIngredientRestaurantRequest().setIngredientRestaurantId(Number(id)), @@ -605,7 +855,7 @@ stockRoutes.get( stockRoutes.post( "/api/stock/supply/order", withCheck({ role: ["ACCOUNTANT", "ADMIN"] }), - (req: Request, res: Response) => { + async (req: Request, res: Response) => { /* #swagger.parameters['body'] = { in: 'body', required: true, @@ -621,12 +871,50 @@ stockRoutes.post( type: 'string' } */ + // Auth check and :id check --- + const { authorization } = req.headers; + if (!authorization) return res.status(401).json({ message: "Unauthorized" }); + const token = authorization.split("Bearer ")[1]; + const userId = await getUserIdFromToken(token); + if (!userId) return res.status(401).json({ message: "Unauthorized" }); + // ---------------------------- + const { quantity, ingredientRestaurantId, supplierId } = req.body; const supplyOrderRequest = new CreateSupplyOrderRequest() .setQuantity(quantity) .setIngredientRestaurantId(ingredientRestaurantId) .setSupplierId(supplierId); + try { + // todo: WARN - supplyOrder support only one product by one product so it work for now + // todo: refactor this into a getter + const ingredient_restaurant: IngredientRestaurant.AsObject = await new Promise((resolve, reject) => { + stockServiceClient.getIngredientRestaurant( + new GetIngredientRestaurantRequest().setId(ingredientRestaurantId), + (error, response) => { + if (error) reject(error); + else resolve(response.toObject()); + }, + ); + }); + + // todo: refactor this into a getter + const restaurant: Restaurant.AsObject = await new Promise((resolve, reject) => { + restaurantServiceClient.getRestaurant( + new RestaurantId().setId(ingredient_restaurant.restaurantId), + (error, response) => { + if (error) reject(error); + else resolve(response.toObject()); + }, + ); + }); + + if (!(await check(token, { role: "ADMIN" })) && !restaurant.useridsList.includes(userId.toString())) + return res.status(401).json({ message: "Unauthorized" }); + } catch (error) { + return res.status(500).send({ error }); + } + stockServiceClient.createSupplyOrder(supplyOrderRequest, (error, response) => { if (error) return res.status(500).send({ error }); else return res.status(201).json(response.toObject()); @@ -637,7 +925,7 @@ stockRoutes.post( stockRoutes.put( "/api/stock/supply/order/:id", withCheck({ role: ["ACCOUNTANT", "ADMIN"] }), - (req: Request, res: Response) => { + async (req: Request, res: Response) => { /* #swagger.parameters['id'] = { in: 'path', required: true, @@ -658,6 +946,52 @@ stockRoutes.put( type: 'string' } */ + // Auth check and :id check --- + const { authorization } = req.headers; + if (!authorization) return res.status(401).json({ message: "Unauthorized" }); + const token = authorization.split("Bearer ")[1]; + const userId = await getUserIdFromToken(token); + if (!userId) return res.status(401).json({ message: "Unauthorized" }); + // ---------------------------- + + try { + // todo: refactor this into a getter + const supplyOrder: SupplyOrder.AsObject = await new Promise((resolve, reject) => { + stockServiceClient.getSupplyOrder(new GetSupplyOrderRequest().setId(Number(id)), (error, response) => { + if (error) reject(error); + else resolve(response.toObject()); + }); + }); + + // todo: WARN - supplyOrder support only one product by one product so it work for now + // todo: refactor this into a getter + const ingredient_restaurant: IngredientRestaurant.AsObject = await new Promise((resolve, reject) => { + stockServiceClient.getIngredientRestaurant( + new GetIngredientRestaurantRequest().setId(supplyOrder.ingredientRestaurantId), + (error, response) => { + if (error) reject(error); + else resolve(response.toObject()); + }, + ); + }); + + // todo: refactor this into a getter + const restaurant: Restaurant.AsObject = await new Promise((resolve, reject) => { + restaurantServiceClient.getRestaurant( + new RestaurantId().setId(ingredient_restaurant.restaurantId), + (error, response) => { + if (error) reject(error); + else resolve(response.toObject()); + }, + ); + }); + + if (!(await check(token, { role: "ADMIN" })) && !restaurant.useridsList.includes(userId.toString())) + return res.status(401).json({ message: "Unauthorized" }); + } catch (error) { + return res.status(500).send({ error }); + } + const { id } = req.params; const { quantity, ingredientRestaurantId, supplierId } = req.body; const supplyOrderRequest = new UpdateSupplyOrderRequest() @@ -676,7 +1010,7 @@ stockRoutes.put( stockRoutes.delete( "/api/stock/supply/order/:id", withCheck({ role: ["ACCOUNTANT", "ADMIN"] }), - (req: Request, res: Response) => { + async (req: Request, res: Response) => { /* #swagger.parameters['id'] = { in: 'path', required: true, @@ -688,7 +1022,53 @@ stockRoutes.delete( type: 'string' } */ + // Auth check and :id check --- + const { authorization } = req.headers; + if (!authorization) return res.status(401).json({ message: "Unauthorized" }); + const token = authorization.split("Bearer ")[1]; + const userId = await getUserIdFromToken(token); + if (!userId) return res.status(401).json({ message: "Unauthorized" }); + // ---------------------------- + const { id } = req.params; + + try { + // todo: refactor this into a getter + const supplyOrder: SupplyOrder.AsObject = await new Promise((resolve, reject) => { + stockServiceClient.getSupplyOrder(new GetSupplyOrderRequest().setId(Number(id)), (error, response) => { + if (error) reject(error); + else resolve(response.toObject()); + }); + }); + + // todo: WARN - supplyOrder support only one product by one product so it work for now + // todo: refactor this into a getter + const ingredient_restaurant: IngredientRestaurant.AsObject = await new Promise((resolve, reject) => { + stockServiceClient.getIngredientRestaurant( + new GetIngredientRestaurantRequest().setId(supplyOrder.ingredientRestaurantId), + (error, response) => { + if (error) reject(error); + else resolve(response.toObject()); + }, + ); + }); + + // todo: refactor this into a getter + const restaurant: Restaurant.AsObject = await new Promise((resolve, reject) => { + restaurantServiceClient.getRestaurant( + new RestaurantId().setId(ingredient_restaurant.restaurantId), + (error, response) => { + if (error) reject(error); + else resolve(response.toObject()); + }, + ); + }); + + if (!(await check(token, { role: "ADMIN" })) && !restaurant.useridsList.includes(userId.toString())) + return res.status(401).json({ message: "Unauthorized" }); + } catch (error) { + return res.status(500).send({ error }); + } stockServiceClient.deleteSupplyOrder(new DeleteSupplyOrderRequest().setId(Number(id)), (error, response) => { if (error) return res.status(500).send({ error }); else return res.status(200).json(response.toObject()); From 7a22fec135d5b03e36ecb8df9e2f0a886a5e1c4d Mon Sep 17 00:00:00 2001 From: Florian LEROUX Date: Sun, 27 Aug 2023 23:47:59 +0200 Subject: [PATCH 507/883] doc: update readme files --- README.md | 22 ++++++++++++++++++---- services/gateway/README.md | 17 ++++++++++------- 2 files changed, 28 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index 155f8b10..eb09be82 100644 --- a/README.md +++ b/README.md @@ -17,13 +17,13 @@ a high volume of concurrent users, up to several thousand. | Service | Port | Language | Database | Status | Assignee | | ------------ | ----- | ----------- | ---------- | ------ | --------------- | -| Gateway | 50000 | Go | ❌ | ❌ | @Anatole-Godard | +| Gateway | 50000 | Go | ❌ | ⚠️ | @Anatole-Godard | | User (auth) | 50001 | Go | PostgreSQL | ⚠️ | @Anatole-Godard | | Basket | 50002 | NodeJS (ts) | Redis | ⚠️ | @Anatole-Godard | | Payment | 50003 | NodeJS (ts) | PostgreSQL | ✅ | @floriaaan | -| Product | 50004 | NodeJS (ts) | PostgreSQL | ❌ | @PierreLbg | -| Restaurant | 50005 | NodeJS (ts) | PostgreSQL | ❌ | @floriaaan | -| Promotion | 50006 | NodeJS (ts) | PostgreSQL | ❌ | @PierreLbg | +| Product | 50004 | NodeJS (ts) | PostgreSQL | ⚠️ | @PierreLbg | +| Restaurant | 50005 | NodeJS (ts) | PostgreSQL | ⚠️ | @floriaaan | +| Promotion | 50006 | NodeJS (ts) | PostgreSQL | ⚠️ | @PierreLbg | | Order | 50007 | NodeJS (ts) | PostgreSQL | ✅ | @floriaaan | | Delivery | 50008 | NodeJS (ts) | PostgreSQL | ✅ | @floriaaan | | Stock | 50009 | NodeJS (ts) | PostgreSQL | ⚠️ | @floriaaan | @@ -67,6 +67,20 @@ The file hierarchy for this project is as follows: ## Installation & usage +### Docker + +You can use Docker to run the microservices and the gateway. + +To do so, you will need to have Docker installed on your system. + +You can then run the following command to start the microservices and the gateway: + +```shell +docker-compose up -f services/docker-compose.yml -d --build +``` + +### Development + Each service has its own README.md file with installation and usage instructions. Please refer to the README.md file of the service you want to install and use. diff --git a/services/gateway/README.md b/services/gateway/README.md index b74ab276..8f1569fb 100644 --- a/services/gateway/README.md +++ b/services/gateway/README.md @@ -1,7 +1,7 @@ # Gateway Microservice | Informations | -|------------------------------------| +| ---------------------------------- | | **Port:** 50000 | | **Developer:** @Anatole-Godard | | **Status:** In progress | @@ -14,7 +14,7 @@ The gateway provides the following routes: -[//]: # (TODO: Add routes) +[//]: # "TODO: Add routes" ## Requirements @@ -25,7 +25,7 @@ To run this microservice, you will need to have the following installed on your You can use the following tools to help you with the setup: - You can use nvm to set your Node version using: - - `nvm use`. + - `nvm use`. ## Getting started @@ -36,9 +36,12 @@ You can use the following tools to help you with the setup: 3. Run `npm install` to install the necessary dependencies. 4. Create a `.env` file at the root of the project directory and add the environment variables values ( see `.env.example`). -5. Run `sh proto/build-protos.sh` to generate js file to create the clients. -5.1. Then replace all "import * as grpc from "grpc";" package iteration by "import * as grpc from "@grpc/grpc-js";" -All the occurence of the package "grpc" must be replaced by "@grpc/grpc-js" in the folder "services/gateway/src/proto" +5. Run `sh proto/build-protos.sh` to generate js file to create the clients. + 6. Run `npm run start` to start the microservice. You can now access the microservice at `http://localhost:50000`. @@ -49,4 +52,4 @@ NB: If you want to run the microservice in development mode, you can run `npm ru ### Requests examples -[//]: # (TODO: Add requests examples) \ No newline at end of file +[//]: # "TODO: Add requests examples" From 1047a41000dd51bd054349554fb4873b55a0c2f3 Mon Sep 17 00:00:00 2001 From: Florian LEROUX Date: Sun, 27 Aug 2023 23:56:04 +0200 Subject: [PATCH 508/883] doc(readmes): update readme --- README.md | 2 +- services/delivery/README.md | 34 +++++++++++++++++----------------- services/log/README.md | 18 ++++++++---------- services/order/README.md | 18 +++++++++--------- services/payment/README.md | 17 +++++++++-------- services/promotions/README.md | 22 +++++++++++----------- services/restaurant/README.md | 4 ++-- services/stock/README.md | 2 +- 8 files changed, 58 insertions(+), 59 deletions(-) diff --git a/README.md b/README.md index eb09be82..4280f9d3 100644 --- a/README.md +++ b/README.md @@ -22,7 +22,7 @@ a high volume of concurrent users, up to several thousand. | Basket | 50002 | NodeJS (ts) | Redis | ⚠️ | @Anatole-Godard | | Payment | 50003 | NodeJS (ts) | PostgreSQL | ✅ | @floriaaan | | Product | 50004 | NodeJS (ts) | PostgreSQL | ⚠️ | @PierreLbg | -| Restaurant | 50005 | NodeJS (ts) | PostgreSQL | ⚠️ | @floriaaan | +| Restaurant | 50005 | NodeJS (ts) | PostgreSQL | ✅ | @floriaaan | | Promotion | 50006 | NodeJS (ts) | PostgreSQL | ⚠️ | @PierreLbg | | Order | 50007 | NodeJS (ts) | PostgreSQL | ✅ | @floriaaan | | Delivery | 50008 | NodeJS (ts) | PostgreSQL | ✅ | @floriaaan | diff --git a/services/delivery/README.md b/services/delivery/README.md index c94da1c2..faae0141 100644 --- a/services/delivery/README.md +++ b/services/delivery/README.md @@ -1,10 +1,10 @@ # Delivery Microservice | Informations | -|--------------------------------------------------------------------| +| ------------------------------------------------------------------ | | **Port:** 50008 | | **Developer:** @floriaaan | -| **Status:** In progress | +| **Status:** Done (may have some improvements) | | **Last update:** 2023-04-09 | | **Language:** NodeJS | | **Dependencies:** TypeScript, Prisma, gRPC, Postgres | @@ -14,20 +14,20 @@ - Delivery model: - - `CreateDelivery`: Creates a new delivery in the system. - - `GetDelivery`: Retrieves a delivery by its ID. - - `UpdateDelivery`: Updates the status of an existing delivery. - - `DeleteDelivery`: Deletes a delivery by its ID. - - `ListDeliveriesByUser`: Retrieves all deliveries for a given user. - - `ListDeliveriesByRestaurant`: Retrieves all deliveries for a given restaurant. + - `CreateDelivery`: Creates a new delivery in the system. + - `GetDelivery`: Retrieves a delivery by its ID. + - `UpdateDelivery`: Updates the status of an existing delivery. + - `DeleteDelivery`: Deletes a delivery by its ID. + - `ListDeliveriesByUser`: Retrieves all deliveries for a given user. + - `ListDeliveriesByRestaurant`: Retrieves all deliveries for a given restaurant. - Delivery person model: - - `CreateDeliveryPerson`: Creates a new delivery person in the system. - - `GetDeliveryPerson`: Retrieves a delivery person by its ID. - - `UpdateDeliveryPerson`: Updates an existing delivery person. - - `DeleteDeliveryPerson`: Deletes a delivery person by its ID. - - `ListDeliveryPersons`: Retrieves all delivery persons. - - `ListNearDeliveryPersons`: Retrieves all delivery persons near a given location. + - `CreateDeliveryPerson`: Creates a new delivery person in the system. + - `GetDeliveryPerson`: Retrieves a delivery person by its ID. + - `UpdateDeliveryPerson`: Updates an existing delivery person. + - `DeleteDeliveryPerson`: Deletes a delivery person by its ID. + - `ListDeliveryPersons`: Retrieves all delivery persons. + - `ListNearDeliveryPersons`: Retrieves all delivery persons near a given location. ## Requirements @@ -39,9 +39,9 @@ To run this microservice, you will need to have the following installed on your You can use the following tools to help you with the setup: - You can use nvm to set your Node version using: - - `nvm use`. + - `nvm use`. - You can use docker to run your Postgres database using: - - `docker run --name postgres -p 5432:5432 -e POSTGRES_PASSWORD=password -d postgres` + - `docker run --name postgres -p 5432:5432 -e POSTGRES_PASSWORD=password -d postgres` ## Getting started @@ -86,5 +86,5 @@ docker build -t goodfood-delivery:1.0.0 -f ./delivery/Dockerfile . Create the .env base on the .env.example. Then run the following command: ``` -docker run --env-file=.env goodfood-delivery:1.0.0 +docker run --env-file=.env goodfood-delivery:1.0.0 ``` diff --git a/services/log/README.md b/services/log/README.md index 2f23d53b..c2a84ad5 100644 --- a/services/log/README.md +++ b/services/log/README.md @@ -1,13 +1,13 @@ # Log Microservice -| Informations | -| ---------------------------------- | -| **Port:** 50021 | -| **Developer:** @floriaaan | -| **Status:** In progress | -| **Last update:** 2023-04-18 | -| **Language:** Go | -| **Dependencies:** gRPC, Gorm, AMQP | +| Informations | +| --------------------------------------------- | +| **Port:** 50021 | +| **Developer:** @floriaaan | +| **Status:** Done (may have some improvements) | +| **Last update:** 2023-04-18 | +| **Language:** Go | +| **Dependencies:** gRPC, Gorm, AMQP | ## gRPC Methods @@ -34,8 +34,6 @@ You can use the following tools to help you with the setup: ## Getting started - - ### 1. Clone the repository and install dependencies 1. Clone the `goodfood` repository to your local machine. diff --git a/services/order/README.md b/services/order/README.md index 16dd1739..c3a78c7a 100644 --- a/services/order/README.md +++ b/services/order/README.md @@ -1,14 +1,14 @@ # Order Microservice -| Informations | -| -------------------------------------------------- | -| **Port:** 50007 | -| **Developer:** @floriaaan | -| **Status:** In progress | -| **Last update:** 2023-05-10 | -| **Language:** NodeJS | -| **Dependencies:** TypeScript, gRPC, Postgres, AMQP | -| **Models:** | +| Informations | +| ------------------------------------------------------------------ | +| **Port:** 50007 | +| **Developer:** @floriaaan | +| **Status:** Done (may have some improvements) | +| **Last update:** 2023-05-10 | +| **Language:** NodeJS | +| **Dependencies:** TypeScript, gRPC, Postgres, AMQP | +| **Models:** (see [`prisma/schema.prisma`](./prisma/schema.prisma)) | ## gRPC Methods diff --git a/services/payment/README.md b/services/payment/README.md index d9310988..8319bb54 100644 --- a/services/payment/README.md +++ b/services/payment/README.md @@ -1,13 +1,14 @@ # Payment Microservice -| Informations | -| -------------------------------------------------- | -| **Port:** 50003 | -| **Developer:** @Anatole-Godard & @floriaaan | -| **Status:** In progress | -| **Last update:** 2023-08-04 | -| **Language:** NodeJS | -| **Dependencies:** TypeScript, gRPC, Postgres, AMQP | +| Informations | +| ------------------------------------------------------------------ | +| **Port:** 50003 | +| **Developer:** @Anatole-Godard & @floriaaan | +| **Status:** Done (may have some improvements) | +| **Last update:** 2023-08-04 | +| **Language:** NodeJS | +| **Dependencies:** TypeScript, gRPC, Postgres, AMQP | +| **Models:** (see [`prisma/schema.prisma`](./prisma/schema.prisma)) | ## gRPC Methods diff --git a/services/promotions/README.md b/services/promotions/README.md index 8aa04cda..cb990ac0 100644 --- a/services/promotions/README.md +++ b/services/promotions/README.md @@ -1,11 +1,11 @@ # Delivery Microservice | Informations | -|--------------------------------------------------------------------| +| ------------------------------------------------------------------ | | **Port:** 50006 | | **Developer:** @PierreLgb | | **Status:** In progress | -| **Last update:** 2023-07-20 | +| **Last update:** 2023-07-20 | | **Language:** NodeJS | | **Dependencies:** TypeScript, Prisma, gRPC, Postgres | | **Models:** (see [`prisma/schema.prisma`](./prisma/schema.prisma)) | @@ -14,12 +14,12 @@ - Promotions model: - - `CreatePromotion`: Creates a new promotion in the system. - - `GetPromotion`: Retrieves a promotion by its ID. - - `UpdatePromotion`: Updates an existing promotion. - - `DeletePromotion`: Deletes a promotion by its ID. - - `GetPromotions`: Retrieves all promotions. - - `ListPromotionsByRestaurant`: Retrieves all promotion for a given restaurant. + - `CreatePromotion`: Creates a new promotion in the system. + - `GetPromotion`: Retrieves a promotion by its ID. + - `UpdatePromotion`: Updates an existing promotion. + - `DeletePromotion`: Deletes a promotion by its ID. + - `GetPromotions`: Retrieves all promotions. + - `ListPromotionsByRestaurant`: Retrieves all promotion for a given restaurant. ## Requirements @@ -31,9 +31,9 @@ To run this microservice, you will need to have the following installed on your You can use the following tools to help you with the setup: - You can use nvm to set your Node version using: - - `nvm use`. + - `nvm use`. - You can use docker to run your Postgres database using: - - `docker run --name postgres -p 5432:5432 -e POSTGRES_PASSWORD=password -d postgres` + - `docker run --name postgres -p 5432:5432 -e POSTGRES_PASSWORD=password -d postgres` ## Getting started @@ -80,5 +80,5 @@ docker push pierrelbg/goodfood-promotions:1.0.0 Create the .env base on the .env.example. Then run the following command: ``` -docker run --env-file=.env goodfood-delivery:1.0.0 +docker run --env-file=.env goodfood-delivery:1.0.0 ``` diff --git a/services/restaurant/README.md b/services/restaurant/README.md index e94e1bc8..d1ba8581 100644 --- a/services/restaurant/README.md +++ b/services/restaurant/README.md @@ -4,8 +4,8 @@ | ------------------------------------------------------------------ | | **Port:** 50005 | | **Developer:** @floriaaan | -| **Status:** In progress | -| **Last update:** 2023-08-19 | +| **Status:** Done (may have some improvements) | +| **Last update:** 2023-08-27 | | **Language:** NodeJS | | **Dependencies:** TypeScript, Prisma, gRPC, Postgres | | **Models:** (see [`prisma/schema.prisma`](./prisma/schema.prisma)) | diff --git a/services/stock/README.md b/services/stock/README.md index baf17114..b335b88b 100644 --- a/services/stock/README.md +++ b/services/stock/README.md @@ -5,7 +5,7 @@ | **Port:** 50009 | | **Developer:** @floriaaan | | **Status:** In progress | -| **Last update:** 2023-04-11 | +| **Last update:** 2023-07-07 | | **Language:** NodeJS | | **Dependencies:** TypeScript, Prisma, gRPC, Postgres | | **Models:** (see [`prisma/schema.prisma`](./prisma/schema.prisma)) | From 4e7c0b641ebf15277a26240e1929514eb659c920 Mon Sep 17 00:00:00 2001 From: Florian LEROUX Date: Mon, 28 Aug 2023 08:37:04 +0200 Subject: [PATCH 509/883] fix(product/types): change nutriscore and price types --- services/product/package-lock.json | 39 +++++++++---------- services/product/package.json | 4 +- .../migration.sql | 3 ++ services/product/prisma/schema.prisma | 4 +- services/product/proto | 1 + services/proto/product.proto | 4 +- 6 files changed, 29 insertions(+), 26 deletions(-) create mode 100644 services/product/prisma/migrations/20230828063429_change_price_and_nutriscore_type/migration.sql create mode 120000 services/product/proto diff --git a/services/product/package-lock.json b/services/product/package-lock.json index 46afd284..9cd82839 100644 --- a/services/product/package-lock.json +++ b/services/product/package-lock.json @@ -10,7 +10,7 @@ "@azure/storage-blob": "^12.14.0", "@grpc/grpc-js": "^1.8.14", "@grpc/proto-loader": "^0.7.6", - "@prisma/client": "^4.16.2", + "@prisma/client": "^5.2.0", "amqplib": "^0.10.3", "base64-arraybuffer": "^1.0.2", "express": "^4.18.2", @@ -25,7 +25,7 @@ "@types/amqplib": "^0.10.1", "@types/node": "^18.16.7", "esbuild": "^0.18.11", - "prisma": "^4.16.2", + "prisma": "^5.2.0", "ts-node": "^10.9.1", "tsconfig-paths": "^4.2.0", "typescript": "^5.0.2" @@ -711,15 +711,15 @@ } }, "node_modules/@prisma/client": { - "version": "4.16.2", - "resolved": "https://registry.npmjs.org/@prisma/client/-/client-4.16.2.tgz", - "integrity": "sha512-qCoEyxv1ZrQ4bKy39GnylE8Zq31IRmm8bNhNbZx7bF2cU5aiCCnSa93J2imF88MBjn7J9eUQneNxUQVJdl/rPQ==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@prisma/client/-/client-5.2.0.tgz", + "integrity": "sha512-AiTjJwR4J5Rh6Z/9ZKrBBLel3/5DzUNntMohOy7yObVnVoTNVFi2kvpLZlFuKO50d7yDspOtW6XBpiAd0BVXbQ==", "hasInstallScript": true, "dependencies": { - "@prisma/engines-version": "4.16.1-1.4bc8b6e1b66cb932731fb1bdbbc550d1e010de81" + "@prisma/engines-version": "5.2.0-25.2804dc98259d2ea960602aca6b8e7fdc03c1758f" }, "engines": { - "node": ">=14.17" + "node": ">=16.13" }, "peerDependencies": { "prisma": "*" @@ -731,16 +731,16 @@ } }, "node_modules/@prisma/engines": { - "version": "4.16.2", - "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-4.16.2.tgz", - "integrity": "sha512-vx1nxVvN4QeT/cepQce68deh/Turxy5Mr+4L4zClFuK1GlxN3+ivxfuv+ej/gvidWn1cE1uAhW7ALLNlYbRUAw==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-5.2.0.tgz", + "integrity": "sha512-dT7FOLUCdZmq+AunLqB1Iz+ZH/IIS1Fz2THmKZQ6aFONrQD/BQ5ecJ7g2wGS2OgyUFf4OaLam6/bxmgdOBDqig==", "devOptional": true, "hasInstallScript": true }, "node_modules/@prisma/engines-version": { - "version": "4.16.1-1.4bc8b6e1b66cb932731fb1bdbbc550d1e010de81", - "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-4.16.1-1.4bc8b6e1b66cb932731fb1bdbbc550d1e010de81.tgz", - "integrity": "sha512-q617EUWfRIDTriWADZ4YiWRZXCa/WuhNgLTVd+HqWLffjMSPzyM5uOWoauX91wvQClSKZU4pzI4JJLQ9Kl62Qg==" + "version": "5.2.0-25.2804dc98259d2ea960602aca6b8e7fdc03c1758f", + "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-5.2.0-25.2804dc98259d2ea960602aca6b8e7fdc03c1758f.tgz", + "integrity": "sha512-jsnKT5JIDIE01lAeCj2ghY9IwxkedhKNvxQeoyLs6dr4ZXynetD0vTy7u6wMJt8vVPv8I5DPy/I4CFaoXAgbtg==" }, "node_modules/@protobufjs/aspromise": { "version": "1.1.2", @@ -4018,20 +4018,19 @@ } }, "node_modules/prisma": { - "version": "4.16.2", - "resolved": "https://registry.npmjs.org/prisma/-/prisma-4.16.2.tgz", - "integrity": "sha512-SYCsBvDf0/7XSJyf2cHTLjLeTLVXYfqp7pG5eEVafFLeT0u/hLFz/9W196nDRGUOo1JfPatAEb+uEnTQImQC1g==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/prisma/-/prisma-5.2.0.tgz", + "integrity": "sha512-FfFlpjVCkZwrqxDnP4smlNYSH1so+CbfjgdpioFzGGqlQAEm6VHAYSzV7jJgC3ebtY9dNOhDMS2+4/1DDSM7bQ==", "devOptional": true, "hasInstallScript": true, "dependencies": { - "@prisma/engines": "4.16.2" + "@prisma/engines": "5.2.0" }, "bin": { - "prisma": "build/index.js", - "prisma2": "build/index.js" + "prisma": "build/index.js" }, "engines": { - "node": ">=14.17" + "node": ">=16.13" } }, "node_modules/process": { diff --git a/services/product/package.json b/services/product/package.json index 45115615..0cdef090 100644 --- a/services/product/package.json +++ b/services/product/package.json @@ -15,7 +15,7 @@ "@types/amqplib": "^0.10.1", "@types/node": "^18.16.7", "esbuild": "^0.18.11", - "prisma": "^4.16.2", + "prisma": "^5.2.0", "ts-node": "^10.9.1", "tsconfig-paths": "^4.2.0", "typescript": "^5.0.2" @@ -24,7 +24,7 @@ "@azure/storage-blob": "^12.14.0", "@grpc/grpc-js": "^1.8.14", "@grpc/proto-loader": "^0.7.6", - "@prisma/client": "^4.16.2", + "@prisma/client": "^5.2.0", "amqplib": "^0.10.3", "base64-arraybuffer": "^1.0.2", "express": "^4.18.2", diff --git a/services/product/prisma/migrations/20230828063429_change_price_and_nutriscore_type/migration.sql b/services/product/prisma/migrations/20230828063429_change_price_and_nutriscore_type/migration.sql new file mode 100644 index 00000000..f15d8167 --- /dev/null +++ b/services/product/prisma/migrations/20230828063429_change_price_and_nutriscore_type/migration.sql @@ -0,0 +1,3 @@ +-- AlterTable +ALTER TABLE "Product" ALTER COLUMN "price" SET DATA TYPE DOUBLE PRECISION, +ALTER COLUMN "nutriscore" SET DATA TYPE TEXT; diff --git a/services/product/prisma/schema.prisma b/services/product/prisma/schema.prisma index 97f19a1f..28feca1a 100644 --- a/services/product/prisma/schema.prisma +++ b/services/product/prisma/schema.prisma @@ -12,11 +12,11 @@ model Product { name String image String comment String - price Int + price Float preparation String weight String kilocalories String - nutriscore Int + nutriscore String restaurant_id String type Product_type diff --git a/services/product/proto b/services/product/proto new file mode 120000 index 00000000..5c8d3525 --- /dev/null +++ b/services/product/proto @@ -0,0 +1 @@ +../proto \ No newline at end of file diff --git a/services/proto/product.proto b/services/proto/product.proto index 15f3fc68..af7d6b9e 100644 --- a/services/proto/product.proto +++ b/services/proto/product.proto @@ -35,11 +35,11 @@ message Product { string name = 2; string image = 3; string comment = 4; - int32 price = 5; + float price = 5; string preparation = 6; string weight = 7; string kilocalories = 8; - int32 nutriscore = 9; + string nutriscore = 9; string restaurant_id = 10; ProductType type = 11; repeated Category categories = 12; From 99df2703731557c0a9d7409c0d8e545ea2041653 Mon Sep 17 00:00:00 2001 From: anatole Date: Mon, 28 Aug 2023 08:56:52 +0200 Subject: [PATCH 510/883] feat(gateway): map external docker postgres ports --- services/docker-compose.yml | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/services/docker-compose.yml b/services/docker-compose.yml index 64d0a249..e660974e 100644 --- a/services/docker-compose.yml +++ b/services/docker-compose.yml @@ -35,7 +35,7 @@ services: user-postgres: image: postgres:latest ports: - - "5432" + - "51001:5432" volumes: - goodfood-user-volume:/var/lib/postgresql/data networks: @@ -94,7 +94,7 @@ services: payment-postgres: image: postgres:latest ports: - - "5432" + - "51003:5432" volumes: - goodfood-payment-volume:/var/lib/postgresql/data networks: @@ -122,7 +122,7 @@ services: product-postgres: image: postgres:latest ports: - - "5432" + - "51004:5432" volumes: - goodfood-product-volume:/var/lib/postgresql/data networks: @@ -150,7 +150,7 @@ services: restaurant-postgres: image: postgres:latest ports: - - "5432" + - "51005:5432" volumes: - goodfood-restaurant-volume:/var/lib/postgresql/data networks: @@ -178,7 +178,7 @@ services: promotion-postgres: image: postgres:latest ports: - - "5432" + - "51006:5432" volumes: - goodfood-promotion-volume:/var/lib/postgresql/data networks: @@ -206,7 +206,7 @@ services: order-postgres: image: postgres:latest ports: - - "5432" + - "51007:5432" volumes: - goodfood-order-volume:/var/lib/postgresql/data networks: @@ -247,7 +247,7 @@ services: delivery-postgres: image: postgres:latest ports: - - "5432" + - "51008:5432" volumes: - goodfood-delivery-volume:/var/lib/postgresql/data networks: @@ -275,7 +275,7 @@ services: stock-postgres: image: postgres:latest ports: - - "5432" + - "51009:5432" volumes: - goodfood-stock-volume:/var/lib/postgresql/data networks: @@ -304,7 +304,7 @@ services: - POSTGRES_USER=postgres - POSTGRES_PASSWORD=password ports: - - "5432" + - "51020:5432" volumes: - goodfood-reporting-volume:/var/lib/postgresql/data networks: @@ -335,7 +335,7 @@ services: - POSTGRES_USER=postgres - POSTGRES_PASSWORD=password ports: - - "5432" + - "51021:5432" volumes: - goodfood-log-volume:/var/lib/postgresql/data networks: @@ -363,7 +363,7 @@ services: POSTGRES_DB: notification PGDATA: /var/lib/postgresql/data/pgdata ports: - - "5432" + - "51022:5432" volumes: - goodfood-notification-volume:/var/lib/postgresql/data networks: From d789d2d8a949e8e0e0c93430c02e4b50a53c59ec Mon Sep 17 00:00:00 2001 From: anatole Date: Mon, 28 Aug 2023 09:32:11 +0200 Subject: [PATCH 511/883] fix(gateway): fix syntax error in stock controller --- services/gateway/src/controller/stock/stock.controller.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/services/gateway/src/controller/stock/stock.controller.ts b/services/gateway/src/controller/stock/stock.controller.ts index c8490519..17685efe 100644 --- a/services/gateway/src/controller/stock/stock.controller.ts +++ b/services/gateway/src/controller/stock/stock.controller.ts @@ -129,8 +129,8 @@ stockRoutes.post( type: 'string' } */ - const { name, desciption } = req.body; - const ingredientRequest = new CreateIngredientRequest().setName(name).setDescription(desciption); + const { name, description } = req.body; + const ingredientRequest = new CreateIngredientRequest().setName(name).setDescription(description); stockServiceClient.createIngredient(ingredientRequest, (error, response) => { if (error) return res.status(500).send({ error }); @@ -163,8 +163,8 @@ stockRoutes.put( } */ const { id } = req.params; - const { name, desciption } = req.body; - const ingredientRequest = new UpdateIngredientRequest().setId(Number(id)).setName(name).setDescription(desciption); + const { name, description } = req.body; + const ingredientRequest = new UpdateIngredientRequest().setId(Number(id)).setName(name).setDescription(description); stockServiceClient.updateIngredient(ingredientRequest, (error, response) => { if (error) return res.status(500).send({ error }); From 0a0b22573356b2c3f0bc2053c14db2fe0d9c090c Mon Sep 17 00:00:00 2001 From: anatole Date: Mon, 28 Aug 2023 10:44:49 +0200 Subject: [PATCH 512/883] feat(gateway): add supplierId in stock post/put --- .../gateway/src/controller/stock/stock.controller.ts | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/services/gateway/src/controller/stock/stock.controller.ts b/services/gateway/src/controller/stock/stock.controller.ts index 17685efe..b1c77311 100644 --- a/services/gateway/src/controller/stock/stock.controller.ts +++ b/services/gateway/src/controller/stock/stock.controller.ts @@ -337,6 +337,7 @@ stockRoutes.post( pricePerKilo: 1.5, restaurantId: "restaurant_id:1", ingredientId: 1, + supplierId: 1, } } #swagger.parameters['authorization'] = { @@ -353,7 +354,7 @@ stockRoutes.post( if (!userId) return res.status(401).json({ message: "Unauthorized" }); // ---------------------------- - const { alertThreshold, quantity, productList, unitPrice, pricePerKilo, restaurantId, ingredientId } = req.body; + const { alertThreshold, quantity, productList, unitPrice, pricePerKilo, restaurantId, ingredientId, supplierId } = req.body; const ingredientRestaurant = new CreateIngredientRestaurantRequest() .setAlertThreshold(alertThreshold) .setQuantity(quantity) @@ -361,7 +362,8 @@ stockRoutes.post( .setUnitPrice(unitPrice) .setPricePerKilo(pricePerKilo) .setRestaurantId(restaurantId) - .setIngredientId(ingredientId); + .setIngredientId(ingredientId) + .setSupplierId(Number(supplierId)); try { // todo: refactor this into a getter @@ -406,6 +408,7 @@ stockRoutes.put( pricePerKilo: 1.5, restaurantId: "restaurant_id:1", ingredientId: 1, + supplierId: 1, } } #swagger.parameters['authorization'] = { @@ -422,7 +425,7 @@ stockRoutes.put( if (!userId) return res.status(401).json({ message: "Unauthorized" }); // ---------------------------- const { id } = req.params; - const { alertThreshold, quantity, productList, unitPrice, pricePerKilo, restaurantId, ingredientId } = req.body; + const { alertThreshold, quantity, productList, unitPrice, pricePerKilo, restaurantId, ingredientId, supplierId } = req.body; const ingredientRestaurant = new UpdateIngredientRestaurantRequest() .setId(Number(id)) .setAlertThreshold(alertThreshold) @@ -431,7 +434,8 @@ stockRoutes.put( .setUnitPrice(unitPrice) .setPricePerKilo(pricePerKilo) .setRestaurantId(restaurantId) - .setIngredientId(ingredientId); + .setIngredientId(ingredientId) + .setSupplierId(Number(supplierId)); try { // todo: refactor this into a getter From bd3badf7289115031fc9728f8aba9f21ab24ec49 Mon Sep 17 00:00:00 2001 From: anatole Date: Mon, 28 Aug 2023 10:45:23 +0200 Subject: [PATCH 513/883] feat(gateway): generate swagger --- .../src/lib/swagger/swagger-output.json | 67 +++++++++++++++++++ 1 file changed, 67 insertions(+) diff --git a/services/gateway/src/lib/swagger/swagger-output.json b/services/gateway/src/lib/swagger/swagger-output.json index 557f47a0..c05ad2b4 100644 --- a/services/gateway/src/lib/swagger/swagger-output.json +++ b/services/gateway/src/lib/swagger/swagger-output.json @@ -1798,6 +1798,16 @@ "phone": { "type": "string", "example": "restaurant-phone" + }, + "userIds": { + "type": "array", + "example": [ + "user-id-1", + "user-id-2" + ], + "items": { + "type": "string" + } } } } @@ -1910,6 +1920,16 @@ "phone": { "type": "string", "example": "restaurant-phone" + }, + "userIds": { + "type": "array", + "example": [ + "user-id-1", + "user-id-2" + ], + "items": { + "type": "string" + } } } } @@ -3559,6 +3579,9 @@ "200": { "description": "OK" }, + "401": { + "description": "Unauthorized" + }, "500": { "description": "Internal Server Error" } @@ -3616,6 +3639,10 @@ "ingredientId": { "type": "number", "example": 1 + }, + "supplierId": { + "type": "number", + "example": 1 } } } @@ -3631,6 +3658,9 @@ "200": { "description": "OK" }, + "401": { + "description": "Unauthorized" + }, "500": { "description": "Internal Server Error" } @@ -3659,6 +3689,9 @@ "200": { "description": "OK" }, + "401": { + "description": "Unauthorized" + }, "500": { "description": "Internal Server Error" } @@ -3689,6 +3722,9 @@ "200": { "description": "OK" }, + "401": { + "description": "Unauthorized" + }, "500": { "description": "Internal Server Error" } @@ -3772,6 +3808,10 @@ "ingredientId": { "type": "number", "example": 1 + }, + "supplierId": { + "type": "number", + "example": 1 } } } @@ -3787,6 +3827,9 @@ "201": { "description": "Created" }, + "401": { + "description": "Unauthorized" + }, "500": { "description": "Internal Server Error" } @@ -3817,6 +3860,9 @@ "200": { "description": "OK" }, + "401": { + "description": "Unauthorized" + }, "500": { "description": "Internal Server Error" } @@ -3867,6 +3913,9 @@ "200": { "description": "OK" }, + "401": { + "description": "Unauthorized" + }, "500": { "description": "Internal Server Error" } @@ -3895,6 +3944,9 @@ "200": { "description": "OK" }, + "401": { + "description": "Unauthorized" + }, "500": { "description": "Internal Server Error" } @@ -3912,6 +3964,12 @@ "name": "id", "in": "path", "required": true, + "type": "integer" + }, + { + "name": "authorization", + "in": "header", + "required": true, "type": "string" } ], @@ -3919,6 +3977,9 @@ "200": { "description": "OK" }, + "401": { + "description": "Unauthorized" + }, "500": { "description": "Internal Server Error" } @@ -3979,6 +4040,9 @@ "200": { "description": "OK" }, + "401": { + "description": "Unauthorized" + }, "500": { "description": "Internal Server Error" } @@ -4025,6 +4089,9 @@ "201": { "description": "Created" }, + "401": { + "description": "Unauthorized" + }, "500": { "description": "Internal Server Error" } From dfc09259a96db5ce6b1c929501d2e55209eb6fca Mon Sep 17 00:00:00 2001 From: Florian LEROUX Date: Mon, 28 Aug 2023 11:08:42 +0200 Subject: [PATCH 514/883] fix(gateway/payment): change stripe create checkout request body --- .../controller/payment/stripe.controller.ts | 56 +++++++++++++++++-- 1 file changed, 51 insertions(+), 5 deletions(-) diff --git a/services/gateway/src/controller/payment/stripe.controller.ts b/services/gateway/src/controller/payment/stripe.controller.ts index 3ff909e9..1658a7f0 100644 --- a/services/gateway/src/controller/payment/stripe.controller.ts +++ b/services/gateway/src/controller/payment/stripe.controller.ts @@ -1,24 +1,70 @@ import { Request, Response, Router } from "express"; import { CreateCheckoutSessionRequest } from "@gateway/proto/payment_pb"; import { stripeServiceClient } from "@gateway/services/clients/payment.client"; +import { getUser, getUserIdFromToken } from "@gateway/services/user.service"; +import { basketServiceClient } from "@gateway/services/clients/basket.client"; +import { Basket, UserId } from "@gateway/proto/basket_pb"; +import { productServiceClient } from "@gateway/services/clients/product.client"; +import { Product, ProductId } from "@gateway/proto/product_pb"; export const stripeRoutes = Router(); // TODO: check if user can modify this payment request -stripeRoutes.post("/api/payment/stripe", (req: Request, res: Response) => { +stripeRoutes.post("/api/payment/stripe", async (req: Request, res: Response) => { /* #swagger.parameters['body'] = { in: 'body', required: true, schema: { - userId: "Id", name: "John", email: "mail", total: 12 } - } */ - const { userId, name, email, total } = req.body; + } + #swagger.parameters['authorization'] = { + in: 'header', + required: true, + type: 'string' + } + */ + // Auth check and :id check --- + const { authorization } = req.headers; + if (!authorization) return res.status(401).json({ message: "Unauthorized" }); + const token = authorization.split("Bearer ")[1]; + const userId = await getUserIdFromToken(token); + if (!userId) return res.status(401).json({ message: "Unauthorized" }); + const user = await getUser(userId); + // ---------------------------- + + if (!user?.getFirstName() || !user.getLastName() || !user.getEmail()) + return res.status(400).send({ error: "User is missing information" }); + + const name = `${user.getFirstName()} ${user.getLastName()}`; + const email = user.getEmail(); + + const basket: Basket.AsObject = await new Promise((resolve, reject) => { + basketServiceClient.getBasket(new UserId().setId(userId), (error, response) => { + if (error) reject(error); + else resolve(response.toObject()); + }); + }); + + const products = await Promise.all( + basket.productsIdsList.map(async (product) => { + return (await new Promise((resolve, reject) => { + productServiceClient.readProduct(new ProductId().setId(product), (error, response) => { + if (error) reject(error); + else resolve(response.toObject()); + }); + })) as Product.AsObject; + }), + ); + + const total = products.reduce((acc, product) => { + return acc + product.price; + }, 0); + const createCheckoutSessionRequest = new CreateCheckoutSessionRequest() - .setUserId(userId) + .setUserId(userId.toString()) .setName(name) .setEmail(email) .setTotal(total); From 19aaf4eb1f85aed2c090b41bbbc092b1a8708ea5 Mon Sep 17 00:00:00 2001 From: Florian LEROUX Date: Mon, 28 Aug 2023 11:09:16 +0200 Subject: [PATCH 515/883] feat(lockfiles): add lockfiles --- services/gateway/pnpm-lock.yaml | 1097 +++++++++- services/notification/package-lock.json | 1481 ++++++++++++++ services/product/pnpm-lock.yaml | 34 +- services/restaurant/pnpm-lock.yaml | 1003 +++++++++ services/stock/pnpm-lock.yaml | 2495 +++++++++++++++++++++++ 5 files changed, 5987 insertions(+), 123 deletions(-) create mode 100644 services/notification/package-lock.json create mode 100644 services/restaurant/pnpm-lock.yaml create mode 100644 services/stock/pnpm-lock.yaml diff --git a/services/gateway/pnpm-lock.yaml b/services/gateway/pnpm-lock.yaml index 2e906873..134d5a1f 100644 --- a/services/gateway/pnpm-lock.yaml +++ b/services/gateway/pnpm-lock.yaml @@ -40,9 +40,21 @@ devDependencies: '@types/node': specifier: ^18.15.9 version: 18.17.6 + '@typescript-eslint/eslint-plugin': + specifier: ^6.4.1 + version: 6.4.1(@typescript-eslint/parser@6.4.1)(eslint@8.47.0)(typescript@5.0.2) esbuild: - specifier: ^0.19.2 - version: 0.19.2 + specifier: ^0.17.18 + version: 0.17.18 + eslint: + specifier: ^8.47.0 + version: 8.47.0 + eslint-config-prettier: + specifier: ^9.0.0 + version: 9.0.0(eslint@8.47.0) + eslint-plugin-prettier: + specifier: ^5.0.0 + version: 5.0.0(eslint-config-prettier@9.0.0)(eslint@8.47.0)(prettier@3.0.2) grpc-tools: specifier: ^1.12.4 version: 1.12.4 @@ -55,6 +67,9 @@ devDependencies: pkg: specifier: ^5.8.1 version: 5.8.1 + prettier: + specifier: 3.0.2 + version: 3.0.2 ts-node: specifier: 10.9.1 version: 10.9.1(@types/node@18.17.6)(typescript@5.0.2) @@ -73,6 +88,11 @@ devDependencies: packages: + /@aashutoshrathi/word-wrap@1.2.6: + resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} + engines: {node: '>=0.10.0'} + dev: true + /@babel/generator@7.18.2: resolution: {integrity: sha512-W1lG5vUwFvfMd8HVXqdfbuG7RuaSrTCCD8cl8fP8wOivdbtbIg2Db3IWUcgvfxKbbn6ZBGYRW/Zk1MIwK49mgw==} engines: {node: '>=6.9.0'} @@ -116,6 +136,15 @@ packages: '@jridgewell/trace-mapping': 0.3.9 dev: true + /@esbuild/android-arm64@0.17.18: + resolution: {integrity: sha512-/iq0aK0eeHgSC3z55ucMAHO05OIqmQehiGay8eP5l/5l+iEr4EIbh4/MI8xD9qRFjqzgkc0JkX0LculNC9mXBw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + /@esbuild/android-arm64@0.18.20: resolution: {integrity: sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==} engines: {node: '>=12'} @@ -125,10 +154,10 @@ packages: dev: true optional: true - /@esbuild/android-arm64@0.19.2: - resolution: {integrity: sha512-lsB65vAbe90I/Qe10OjkmrdxSX4UJDjosDgb8sZUKcg3oefEuW2OT2Vozz8ef7wrJbMcmhvCC+hciF8jY/uAkw==} + /@esbuild/android-arm@0.17.18: + resolution: {integrity: sha512-EmwL+vUBZJ7mhFCs5lA4ZimpUH3WMAoqvOIYhVQwdIgSpHC8ImHdsRyhHAVxpDYUSm0lWvd63z0XH1IlImS2Qw==} engines: {node: '>=12'} - cpu: [arm64] + cpu: [arm] os: [android] requiresBuild: true dev: true @@ -143,10 +172,10 @@ packages: dev: true optional: true - /@esbuild/android-arm@0.19.2: - resolution: {integrity: sha512-tM8yLeYVe7pRyAu9VMi/Q7aunpLwD139EY1S99xbQkT4/q2qa6eA4ige/WJQYdJ8GBL1K33pPFhPfPdJ/WzT8Q==} + /@esbuild/android-x64@0.17.18: + resolution: {integrity: sha512-x+0efYNBF3NPW2Xc5bFOSFW7tTXdAcpfEg2nXmxegm4mJuVeS+i109m/7HMiOQ6M12aVGGFlqJX3RhNdYM2lWg==} engines: {node: '>=12'} - cpu: [arm] + cpu: [x64] os: [android] requiresBuild: true dev: true @@ -161,11 +190,11 @@ packages: dev: true optional: true - /@esbuild/android-x64@0.19.2: - resolution: {integrity: sha512-qK/TpmHt2M/Hg82WXHRc/W/2SGo/l1thtDHZWqFq7oi24AjZ4O/CpPSu6ZuYKFkEgmZlFoa7CooAyYmuvnaG8w==} + /@esbuild/darwin-arm64@0.17.18: + resolution: {integrity: sha512-6tY+djEAdF48M1ONWnQb1C+6LiXrKjmqjzPNPWXhu/GzOHTHX2nh8Mo2ZAmBFg0kIodHhciEgUBtcYCAIjGbjQ==} engines: {node: '>=12'} - cpu: [x64] - os: [android] + cpu: [arm64] + os: [darwin] requiresBuild: true dev: true optional: true @@ -179,10 +208,10 @@ packages: dev: true optional: true - /@esbuild/darwin-arm64@0.19.2: - resolution: {integrity: sha512-Ora8JokrvrzEPEpZO18ZYXkH4asCdc1DLdcVy8TGf5eWtPO1Ie4WroEJzwI52ZGtpODy3+m0a2yEX9l+KUn0tA==} + /@esbuild/darwin-x64@0.17.18: + resolution: {integrity: sha512-Qq84ykvLvya3dO49wVC9FFCNUfSrQJLbxhoQk/TE1r6MjHo3sFF2tlJCwMjhkBVq3/ahUisj7+EpRSz0/+8+9A==} engines: {node: '>=12'} - cpu: [arm64] + cpu: [x64] os: [darwin] requiresBuild: true dev: true @@ -197,11 +226,11 @@ packages: dev: true optional: true - /@esbuild/darwin-x64@0.19.2: - resolution: {integrity: sha512-tP+B5UuIbbFMj2hQaUr6EALlHOIOmlLM2FK7jeFBobPy2ERdohI4Ka6ZFjZ1ZYsrHE/hZimGuU90jusRE0pwDw==} + /@esbuild/freebsd-arm64@0.17.18: + resolution: {integrity: sha512-fw/ZfxfAzuHfaQeMDhbzxp9mc+mHn1Y94VDHFHjGvt2Uxl10mT4CDavHm+/L9KG441t1QdABqkVYwakMUeyLRA==} engines: {node: '>=12'} - cpu: [x64] - os: [darwin] + cpu: [arm64] + os: [freebsd] requiresBuild: true dev: true optional: true @@ -215,10 +244,10 @@ packages: dev: true optional: true - /@esbuild/freebsd-arm64@0.19.2: - resolution: {integrity: sha512-YbPY2kc0acfzL1VPVK6EnAlig4f+l8xmq36OZkU0jzBVHcOTyQDhnKQaLzZudNJQyymd9OqQezeaBgkTGdTGeQ==} + /@esbuild/freebsd-x64@0.17.18: + resolution: {integrity: sha512-FQFbRtTaEi8ZBi/A6kxOC0V0E9B/97vPdYjY9NdawyLd4Qk5VD5g2pbWN2VR1c0xhzcJm74HWpObPszWC+qTew==} engines: {node: '>=12'} - cpu: [arm64] + cpu: [x64] os: [freebsd] requiresBuild: true dev: true @@ -233,11 +262,11 @@ packages: dev: true optional: true - /@esbuild/freebsd-x64@0.19.2: - resolution: {integrity: sha512-nSO5uZT2clM6hosjWHAsS15hLrwCvIWx+b2e3lZ3MwbYSaXwvfO528OF+dLjas1g3bZonciivI8qKR/Hm7IWGw==} + /@esbuild/linux-arm64@0.17.18: + resolution: {integrity: sha512-R7pZvQZFOY2sxUG8P6A21eq6q+eBv7JPQYIybHVf1XkQYC+lT7nDBdC7wWKTrbvMXKRaGudp/dzZCwL/863mZQ==} engines: {node: '>=12'} - cpu: [x64] - os: [freebsd] + cpu: [arm64] + os: [linux] requiresBuild: true dev: true optional: true @@ -251,10 +280,10 @@ packages: dev: true optional: true - /@esbuild/linux-arm64@0.19.2: - resolution: {integrity: sha512-ig2P7GeG//zWlU0AggA3pV1h5gdix0MA3wgB+NsnBXViwiGgY77fuN9Wr5uoCrs2YzaYfogXgsWZbm+HGr09xg==} + /@esbuild/linux-arm@0.17.18: + resolution: {integrity: sha512-jW+UCM40LzHcouIaqv3e/oRs0JM76JfhHjCavPxMUti7VAPh8CaGSlS7cmyrdpzSk7A+8f0hiedHqr/LMnfijg==} engines: {node: '>=12'} - cpu: [arm64] + cpu: [arm] os: [linux] requiresBuild: true dev: true @@ -269,10 +298,10 @@ packages: dev: true optional: true - /@esbuild/linux-arm@0.19.2: - resolution: {integrity: sha512-Odalh8hICg7SOD7XCj0YLpYCEc+6mkoq63UnExDCiRA2wXEmGlK5JVrW50vZR9Qz4qkvqnHcpH+OFEggO3PgTg==} + /@esbuild/linux-ia32@0.17.18: + resolution: {integrity: sha512-ygIMc3I7wxgXIxk6j3V00VlABIjq260i967Cp9BNAk5pOOpIXmd1RFQJQX9Io7KRsthDrQYrtcx7QCof4o3ZoQ==} engines: {node: '>=12'} - cpu: [arm] + cpu: [ia32] os: [linux] requiresBuild: true dev: true @@ -287,10 +316,10 @@ packages: dev: true optional: true - /@esbuild/linux-ia32@0.19.2: - resolution: {integrity: sha512-mLfp0ziRPOLSTek0Gd9T5B8AtzKAkoZE70fneiiyPlSnUKKI4lp+mGEnQXcQEHLJAcIYDPSyBvsUbKUG2ri/XQ==} + /@esbuild/linux-loong64@0.17.18: + resolution: {integrity: sha512-bvPG+MyFs5ZlwYclCG1D744oHk1Pv7j8psF5TfYx7otCVmcJsEXgFEhQkbhNW8otDHL1a2KDINW20cfCgnzgMQ==} engines: {node: '>=12'} - cpu: [ia32] + cpu: [loong64] os: [linux] requiresBuild: true dev: true @@ -305,10 +334,10 @@ packages: dev: true optional: true - /@esbuild/linux-loong64@0.19.2: - resolution: {integrity: sha512-hn28+JNDTxxCpnYjdDYVMNTR3SKavyLlCHHkufHV91fkewpIyQchS1d8wSbmXhs1fiYDpNww8KTFlJ1dHsxeSw==} + /@esbuild/linux-mips64el@0.17.18: + resolution: {integrity: sha512-oVqckATOAGuiUOa6wr8TXaVPSa+6IwVJrGidmNZS1cZVx0HqkTMkqFGD2HIx9H1RvOwFeWYdaYbdY6B89KUMxA==} engines: {node: '>=12'} - cpu: [loong64] + cpu: [mips64el] os: [linux] requiresBuild: true dev: true @@ -323,10 +352,10 @@ packages: dev: true optional: true - /@esbuild/linux-mips64el@0.19.2: - resolution: {integrity: sha512-KbXaC0Sejt7vD2fEgPoIKb6nxkfYW9OmFUK9XQE4//PvGIxNIfPk1NmlHmMg6f25x57rpmEFrn1OotASYIAaTg==} + /@esbuild/linux-ppc64@0.17.18: + resolution: {integrity: sha512-3dLlQO+b/LnQNxgH4l9rqa2/IwRJVN9u/bK63FhOPB4xqiRqlQAU0qDU3JJuf0BmaH0yytTBdoSBHrb2jqc5qQ==} engines: {node: '>=12'} - cpu: [mips64el] + cpu: [ppc64] os: [linux] requiresBuild: true dev: true @@ -341,10 +370,10 @@ packages: dev: true optional: true - /@esbuild/linux-ppc64@0.19.2: - resolution: {integrity: sha512-dJ0kE8KTqbiHtA3Fc/zn7lCd7pqVr4JcT0JqOnbj4LLzYnp+7h8Qi4yjfq42ZlHfhOCM42rBh0EwHYLL6LEzcw==} + /@esbuild/linux-riscv64@0.17.18: + resolution: {integrity: sha512-/x7leOyDPjZV3TcsdfrSI107zItVnsX1q2nho7hbbQoKnmoeUWjs+08rKKt4AUXju7+3aRZSsKrJtaRmsdL1xA==} engines: {node: '>=12'} - cpu: [ppc64] + cpu: [riscv64] os: [linux] requiresBuild: true dev: true @@ -359,10 +388,10 @@ packages: dev: true optional: true - /@esbuild/linux-riscv64@0.19.2: - resolution: {integrity: sha512-7Z/jKNFufZ/bbu4INqqCN6DDlrmOTmdw6D0gH+6Y7auok2r02Ur661qPuXidPOJ+FSgbEeQnnAGgsVynfLuOEw==} + /@esbuild/linux-s390x@0.17.18: + resolution: {integrity: sha512-cX0I8Q9xQkL/6F5zWdYmVf5JSQt+ZfZD2bJudZrWD+4mnUvoZ3TDDXtDX2mUaq6upMFv9FlfIh4Gfun0tbGzuw==} engines: {node: '>=12'} - cpu: [riscv64] + cpu: [s390x] os: [linux] requiresBuild: true dev: true @@ -377,10 +406,10 @@ packages: dev: true optional: true - /@esbuild/linux-s390x@0.19.2: - resolution: {integrity: sha512-U+RinR6aXXABFCcAY4gSlv4CL1oOVvSSCdseQmGO66H+XyuQGZIUdhG56SZaDJQcLmrSfRmx5XZOWyCJPRqS7g==} + /@esbuild/linux-x64@0.17.18: + resolution: {integrity: sha512-66RmRsPlYy4jFl0vG80GcNRdirx4nVWAzJmXkevgphP1qf4dsLQCpSKGM3DUQCojwU1hnepI63gNZdrr02wHUA==} engines: {node: '>=12'} - cpu: [s390x] + cpu: [x64] os: [linux] requiresBuild: true dev: true @@ -395,11 +424,11 @@ packages: dev: true optional: true - /@esbuild/linux-x64@0.19.2: - resolution: {integrity: sha512-oxzHTEv6VPm3XXNaHPyUTTte+3wGv7qVQtqaZCrgstI16gCuhNOtBXLEBkBREP57YTd68P0VgDgG73jSD8bwXQ==} + /@esbuild/netbsd-x64@0.17.18: + resolution: {integrity: sha512-95IRY7mI2yrkLlTLb1gpDxdC5WLC5mZDi+kA9dmM5XAGxCME0F8i4bYH4jZreaJ6lIZ0B8hTrweqG1fUyW7jbg==} engines: {node: '>=12'} cpu: [x64] - os: [linux] + os: [netbsd] requiresBuild: true dev: true optional: true @@ -413,11 +442,11 @@ packages: dev: true optional: true - /@esbuild/netbsd-x64@0.19.2: - resolution: {integrity: sha512-WNa5zZk1XpTTwMDompZmvQLHszDDDN7lYjEHCUmAGB83Bgs20EMs7ICD+oKeT6xt4phV4NDdSi/8OfjPbSbZfQ==} + /@esbuild/openbsd-x64@0.17.18: + resolution: {integrity: sha512-WevVOgcng+8hSZ4Q3BKL3n1xTv5H6Nb53cBrtzzEjDbbnOmucEVcZeGCsCOi9bAOcDYEeBZbD2SJNBxlfP3qiA==} engines: {node: '>=12'} cpu: [x64] - os: [netbsd] + os: [openbsd] requiresBuild: true dev: true optional: true @@ -431,11 +460,11 @@ packages: dev: true optional: true - /@esbuild/openbsd-x64@0.19.2: - resolution: {integrity: sha512-S6kI1aT3S++Dedb7vxIuUOb3oAxqxk2Rh5rOXOTYnzN8JzW1VzBd+IqPiSpgitu45042SYD3HCoEyhLKQcDFDw==} + /@esbuild/sunos-x64@0.17.18: + resolution: {integrity: sha512-Rzf4QfQagnwhQXVBS3BYUlxmEbcV7MY+BH5vfDZekU5eYpcffHSyjU8T0xucKVuOcdCsMo+Ur5wmgQJH2GfNrg==} engines: {node: '>=12'} cpu: [x64] - os: [openbsd] + os: [sunos] requiresBuild: true dev: true optional: true @@ -449,11 +478,11 @@ packages: dev: true optional: true - /@esbuild/sunos-x64@0.19.2: - resolution: {integrity: sha512-VXSSMsmb+Z8LbsQGcBMiM+fYObDNRm8p7tkUDMPG/g4fhFX5DEFmjxIEa3N8Zr96SjsJ1woAhF0DUnS3MF3ARw==} + /@esbuild/win32-arm64@0.17.18: + resolution: {integrity: sha512-Kb3Ko/KKaWhjeAm2YoT/cNZaHaD1Yk/pa3FTsmqo9uFh1D1Rfco7BBLIPdDOozrObj2sahslFuAQGvWbgWldAg==} engines: {node: '>=12'} - cpu: [x64] - os: [sunos] + cpu: [arm64] + os: [win32] requiresBuild: true dev: true optional: true @@ -467,10 +496,10 @@ packages: dev: true optional: true - /@esbuild/win32-arm64@0.19.2: - resolution: {integrity: sha512-5NayUlSAyb5PQYFAU9x3bHdsqB88RC3aM9lKDAz4X1mo/EchMIT1Q+pSeBXNgkfNmRecLXA0O8xP+x8V+g/LKg==} + /@esbuild/win32-ia32@0.17.18: + resolution: {integrity: sha512-0/xUMIdkVHwkvxfbd5+lfG7mHOf2FRrxNbPiKWg9C4fFrB8H0guClmaM3BFiRUYrznVoyxTIyC/Ou2B7QQSwmw==} engines: {node: '>=12'} - cpu: [arm64] + cpu: [ia32] os: [win32] requiresBuild: true dev: true @@ -485,10 +514,10 @@ packages: dev: true optional: true - /@esbuild/win32-ia32@0.19.2: - resolution: {integrity: sha512-47gL/ek1v36iN0wL9L4Q2MFdujR0poLZMJwhO2/N3gA89jgHp4MR8DKCmwYtGNksbfJb9JoTtbkoe6sDhg2QTA==} + /@esbuild/win32-x64@0.17.18: + resolution: {integrity: sha512-qU25Ma1I3NqTSHJUOKi9sAH1/Mzuvlke0ioMJRthLXKm7JiSKVwFghlGbDLOO2sARECGhja4xYfRAZNPAkooYg==} engines: {node: '>=12'} - cpu: [ia32] + cpu: [x64] os: [win32] requiresBuild: true dev: true @@ -503,14 +532,42 @@ packages: dev: true optional: true - /@esbuild/win32-x64@0.19.2: - resolution: {integrity: sha512-tcuhV7ncXBqbt/Ybf0IyrMcwVOAPDckMK9rXNHtF17UTK18OKLpg08glminN06pt2WCoALhXdLfSPbVvK/6fxw==} - engines: {node: '>=12'} - cpu: [x64] - os: [win32] - requiresBuild: true + /@eslint-community/eslint-utils@4.4.0(eslint@8.47.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.47.0 + eslint-visitor-keys: 3.4.3 + dev: true + + /@eslint-community/regexpp@4.8.0: + resolution: {integrity: sha512-JylOEEzDiOryeUnFbQz+oViCXS0KsvR1mvHkoMiu5+UiBvy+RYX7tzlIIIEstF/gVa2tj9AQXk3dgnxv6KxhFg==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + dev: true + + /@eslint/eslintrc@2.1.2: + resolution: {integrity: sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==} + 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.21.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.48.0: + resolution: {integrity: sha512-ZSjtmelB7IJfWD2Fvb7+Z+ChTIKWq6kjda95fLcQKNS5aheVHn4IkfgRQE3sIIzTcSLwLcLZUD9UBt+V7+h+Pw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true - optional: true /@grpc/grpc-js@1.9.0: resolution: {integrity: sha512-H8+iZh+kCE6VR/Krj6W28Y/ZlxoZ1fOzsNt77nrdE3knkbSelW1Uus192xOFCxHyeszLj8i4APQkSIXjAoOxXg==} @@ -532,6 +589,26 @@ packages: yargs: 17.7.2 dev: false + /@humanwhocodes/config-array@0.11.10: + resolution: {integrity: sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==} + engines: {node: '>=10.10.0'} + dependencies: + '@humanwhocodes/object-schema': 1.2.1 + 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@1.2.1: + resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} + dev: true + /@jest/schemas@29.6.0: resolution: {integrity: sha512-rxLjXyJBTL4LQeJW3aKo0M/+GkCOXsO+8i9Iu7eDb6KwtP65ayoDsitrdPBtujxQ88k4wI2FNYfa6TOGwSn6cQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -615,6 +692,18 @@ packages: fastq: 1.15.0 dev: true + /@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: true + /@protobufjs/aspromise@1.1.2: resolution: {integrity: sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==} dev: false @@ -733,6 +822,10 @@ packages: resolution: {integrity: sha512-/K3ds8TRAfBvi5vfjuz8y6+GiAYBZ0x4tXv1Av6CWBWn0IlADc+ZX9pMq7oU0fNQPnBwIZl3rmeLp6SBApbxSQ==} dev: false + /@types/json-schema@7.0.12: + resolution: {integrity: sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==} + dev: true + /@types/long@4.0.2: resolution: {integrity: sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==} dev: false @@ -756,6 +849,10 @@ packages: resolution: {integrity: sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==} dev: false + /@types/semver@7.5.0: + resolution: {integrity: sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==} + dev: true + /@types/send@0.17.1: resolution: {integrity: sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q==} dependencies: @@ -771,6 +868,137 @@ packages: '@types/node': 18.17.6 dev: false + /@typescript-eslint/eslint-plugin@6.4.1(@typescript-eslint/parser@6.4.1)(eslint@8.47.0)(typescript@5.0.2): + resolution: {integrity: sha512-3F5PtBzUW0dYlq77Lcqo13fv+58KDwUib3BddilE8ajPJT+faGgxmI9Sw+I8ZS22BYwoir9ZhNXcLi+S+I2bkw==} + 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.8.0 + '@typescript-eslint/parser': 6.4.1(eslint@8.47.0)(typescript@5.0.2) + '@typescript-eslint/scope-manager': 6.4.1 + '@typescript-eslint/type-utils': 6.4.1(eslint@8.47.0)(typescript@5.0.2) + '@typescript-eslint/utils': 6.4.1(eslint@8.47.0)(typescript@5.0.2) + '@typescript-eslint/visitor-keys': 6.4.1 + debug: 4.3.4 + eslint: 8.47.0 + graphemer: 1.4.0 + ignore: 5.2.4 + natural-compare: 1.4.0 + semver: 7.5.4 + ts-api-utils: 1.0.2(typescript@5.0.2) + typescript: 5.0.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/parser@6.4.1(eslint@8.47.0)(typescript@5.0.2): + resolution: {integrity: sha512-610G6KHymg9V7EqOaNBMtD1GgpAmGROsmfHJPXNLCU9bfIuLrkdOygltK784F6Crboyd5tBFayPB7Sf0McrQwg==} + 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.4.1 + '@typescript-eslint/types': 6.4.1 + '@typescript-eslint/typescript-estree': 6.4.1(typescript@5.0.2) + '@typescript-eslint/visitor-keys': 6.4.1 + debug: 4.3.4 + eslint: 8.47.0 + typescript: 5.0.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/scope-manager@6.4.1: + resolution: {integrity: sha512-p/OavqOQfm4/Hdrr7kvacOSFjwQ2rrDVJRPxt/o0TOWdFnjJptnjnZ+sYDR7fi4OimvIuKp+2LCkc+rt9fIW+A==} + engines: {node: ^16.0.0 || >=18.0.0} + dependencies: + '@typescript-eslint/types': 6.4.1 + '@typescript-eslint/visitor-keys': 6.4.1 + dev: true + + /@typescript-eslint/type-utils@6.4.1(eslint@8.47.0)(typescript@5.0.2): + resolution: {integrity: sha512-7ON8M8NXh73SGZ5XvIqWHjgX2f+vvaOarNliGhjrJnv1vdjG0LVIz+ToYfPirOoBi56jxAKLfsLm40+RvxVVXA==} + 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.4.1(typescript@5.0.2) + '@typescript-eslint/utils': 6.4.1(eslint@8.47.0)(typescript@5.0.2) + debug: 4.3.4 + eslint: 8.47.0 + ts-api-utils: 1.0.2(typescript@5.0.2) + typescript: 5.0.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/types@6.4.1: + resolution: {integrity: sha512-zAAopbNuYu++ijY1GV2ylCsQsi3B8QvfPHVqhGdDcbx/NK5lkqMnCGU53amAjccSpk+LfeONxwzUhDzArSfZJg==} + engines: {node: ^16.0.0 || >=18.0.0} + dev: true + + /@typescript-eslint/typescript-estree@6.4.1(typescript@5.0.2): + resolution: {integrity: sha512-xF6Y7SatVE/OyV93h1xGgfOkHr2iXuo8ip0gbfzaKeGGuKiAnzS+HtVhSPx8Www243bwlW8IF7X0/B62SzFftg==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/types': 6.4.1 + '@typescript-eslint/visitor-keys': 6.4.1 + debug: 4.3.4 + globby: 11.1.0 + is-glob: 4.0.3 + semver: 7.5.4 + ts-api-utils: 1.0.2(typescript@5.0.2) + typescript: 5.0.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/utils@6.4.1(eslint@8.47.0)(typescript@5.0.2): + resolution: {integrity: sha512-F/6r2RieNeorU0zhqZNv89s9bDZSovv3bZQpUNOmmQK1L80/cV4KEu95YUJWi75u5PhboFoKUJBnZ4FQcoqhDw==} + 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.47.0) + '@types/json-schema': 7.0.12 + '@types/semver': 7.5.0 + '@typescript-eslint/scope-manager': 6.4.1 + '@typescript-eslint/types': 6.4.1 + '@typescript-eslint/typescript-estree': 6.4.1(typescript@5.0.2) + eslint: 8.47.0 + semver: 7.5.4 + transitivePeerDependencies: + - supports-color + - typescript + dev: true + + /@typescript-eslint/visitor-keys@6.4.1: + resolution: {integrity: sha512-y/TyRJsbZPkJIZQXrHfdnxVnxyKegnpEvnRGNam7s3TRR2ykGefEWOhaef00/UUN3IZxizS7BTO3svd3lCOJRQ==} + engines: {node: ^16.0.0 || >=18.0.0} + dependencies: + '@typescript-eslint/types': 6.4.1 + eslint-visitor-keys: 3.4.3 + dev: true + /@vitest/expect@0.33.0: resolution: {integrity: sha512-sVNf+Gla3mhTCxNJx+wJLDPp/WcstOe0Ksqz4Vec51MmgMth/ia0MGFEkIZmVGeTL5HtjYR4Wl/ZxBxBXZJTzQ==} dependencies: @@ -821,6 +1049,14 @@ packages: negotiator: 0.6.3 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-walk@8.2.0: resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} engines: {node: '>=0.4.0'} @@ -847,6 +1083,15 @@ packages: - supports-color dev: true + /ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + dev: true + /ansi-regex@5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} @@ -886,6 +1131,10 @@ packages: resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} dev: true + /argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + dev: true + /array-flatten@1.1.1: resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} dev: false @@ -925,6 +1174,11 @@ packages: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} dev: true + /big-integer@1.6.51: + resolution: {integrity: sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==} + engines: {node: '>=0.6'} + dev: true + /binary-extensions@2.2.0: resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} engines: {node: '>=8'} @@ -978,6 +1232,13 @@ packages: - supports-color dev: false + /bplist-parser@0.2.0: + resolution: {integrity: sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==} + engines: {node: '>= 5.10.0'} + dependencies: + big-integer: 1.6.51 + dev: true + /brace-expansion@1.1.11: resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} dependencies: @@ -998,6 +1259,13 @@ packages: ieee754: 1.2.1 dev: true + /bundle-name@3.0.0: + resolution: {integrity: sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw==} + engines: {node: '>=12'} + dependencies: + run-applescript: 5.0.0 + dev: true + /bytes@3.1.2: resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} engines: {node: '>= 0.8'} @@ -1015,6 +1283,11 @@ packages: get-intrinsic: 1.2.1 dev: false + /callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + dev: true + /chai@4.3.7: resolution: {integrity: sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==} engines: {node: '>=4'} @@ -1138,6 +1411,15 @@ packages: resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} dev: true + /cross-spawn@7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + dev: true + /debug@2.6.9: resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} peerDependencies: @@ -1192,11 +1474,38 @@ packages: engines: {node: '>=4.0.0'} 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: 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: true + + /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: true + + /define-lazy-prop@3.0.0: + resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==} + engines: {node: '>=12'} + dev: true + /delayed-stream@1.0.0: resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} engines: {node: '>=0.4.0'} @@ -1238,6 +1547,13 @@ packages: path-type: 4.0.0 dev: true + /doctrine@3.0.0: + resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} + engines: {node: '>=6.0.0'} + dependencies: + esutils: 2.0.3 + dev: true + /dotenv@16.3.1: resolution: {integrity: sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==} engines: {node: '>=12'} @@ -1261,6 +1577,36 @@ packages: once: 1.4.0 dev: true + /esbuild@0.17.18: + resolution: {integrity: sha512-z1lix43jBs6UKjcZVKOw2xx69ffE2aG0PygLL5qJ9OS/gy0Ewd1gW/PUQIOIQGXBHWNywSc0floSKoMFF8aK2w==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/android-arm': 0.17.18 + '@esbuild/android-arm64': 0.17.18 + '@esbuild/android-x64': 0.17.18 + '@esbuild/darwin-arm64': 0.17.18 + '@esbuild/darwin-x64': 0.17.18 + '@esbuild/freebsd-arm64': 0.17.18 + '@esbuild/freebsd-x64': 0.17.18 + '@esbuild/linux-arm': 0.17.18 + '@esbuild/linux-arm64': 0.17.18 + '@esbuild/linux-ia32': 0.17.18 + '@esbuild/linux-loong64': 0.17.18 + '@esbuild/linux-mips64el': 0.17.18 + '@esbuild/linux-ppc64': 0.17.18 + '@esbuild/linux-riscv64': 0.17.18 + '@esbuild/linux-s390x': 0.17.18 + '@esbuild/linux-x64': 0.17.18 + '@esbuild/netbsd-x64': 0.17.18 + '@esbuild/openbsd-x64': 0.17.18 + '@esbuild/sunos-x64': 0.17.18 + '@esbuild/win32-arm64': 0.17.18 + '@esbuild/win32-ia32': 0.17.18 + '@esbuild/win32-x64': 0.17.18 + dev: true + /esbuild@0.18.20: resolution: {integrity: sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==} engines: {node: '>=12'} @@ -1291,36 +1637,6 @@ packages: '@esbuild/win32-x64': 0.18.20 dev: true - /esbuild@0.19.2: - resolution: {integrity: sha512-G6hPax8UbFakEj3hWO0Vs52LQ8k3lnBhxZWomUJDxfz3rZTLqF5k/FCzuNdLx2RbpBiQQF9H9onlDDH1lZsnjg==} - engines: {node: '>=12'} - hasBin: true - requiresBuild: true - optionalDependencies: - '@esbuild/android-arm': 0.19.2 - '@esbuild/android-arm64': 0.19.2 - '@esbuild/android-x64': 0.19.2 - '@esbuild/darwin-arm64': 0.19.2 - '@esbuild/darwin-x64': 0.19.2 - '@esbuild/freebsd-arm64': 0.19.2 - '@esbuild/freebsd-x64': 0.19.2 - '@esbuild/linux-arm': 0.19.2 - '@esbuild/linux-arm64': 0.19.2 - '@esbuild/linux-ia32': 0.19.2 - '@esbuild/linux-loong64': 0.19.2 - '@esbuild/linux-mips64el': 0.19.2 - '@esbuild/linux-ppc64': 0.19.2 - '@esbuild/linux-riscv64': 0.19.2 - '@esbuild/linux-s390x': 0.19.2 - '@esbuild/linux-x64': 0.19.2 - '@esbuild/netbsd-x64': 0.19.2 - '@esbuild/openbsd-x64': 0.19.2 - '@esbuild/sunos-x64': 0.19.2 - '@esbuild/win32-arm64': 0.19.2 - '@esbuild/win32-ia32': 0.19.2 - '@esbuild/win32-x64': 0.19.2 - dev: true - /escalade@3.1.1: resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} engines: {node: '>=6'} @@ -1329,11 +1645,168 @@ packages: resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} dev: false + /escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + dev: true + + /eslint-config-prettier@9.0.0(eslint@8.47.0): + resolution: {integrity: sha512-IcJsTkJae2S35pRsRAwoCE+925rJJStOdkKnLVgtE+tEpqU0EVVM7OqrwxqgptKdX29NUwC82I5pXsGFIgSevw==} + hasBin: true + peerDependencies: + eslint: '>=7.0.0' + dependencies: + eslint: 8.47.0 + dev: true + + /eslint-plugin-prettier@5.0.0(eslint-config-prettier@9.0.0)(eslint@8.47.0)(prettier@3.0.2): + resolution: {integrity: sha512-AgaZCVuYDXHUGxj/ZGu1u8H8CYgDY3iG6w5kUFw4AzMVXzB7VvbKgYR4nATIN+OvUrghMbiDLeimVjVY5ilq3w==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + '@types/eslint': '>=8.0.0' + eslint: '>=8.0.0' + eslint-config-prettier: '*' + prettier: '>=3.0.0' + peerDependenciesMeta: + '@types/eslint': + optional: true + eslint-config-prettier: + optional: true + dependencies: + eslint: 8.47.0 + eslint-config-prettier: 9.0.0(eslint@8.47.0) + prettier: 3.0.2 + prettier-linter-helpers: 1.0.0 + synckit: 0.8.5 + dev: true + + /eslint-scope@7.2.2: + resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + dev: true + + /eslint-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.47.0: + resolution: {integrity: sha512-spUQWrdPt+pRVP1TTJLmfRNJJHHZryFmptzcafwSvHsceV81djHOdnEeDmkdotZyLNjDhrOasNK8nikkoG1O8Q==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + hasBin: true + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.47.0) + '@eslint-community/regexpp': 4.8.0 + '@eslint/eslintrc': 2.1.2 + '@eslint/js': 8.48.0 + '@humanwhocodes/config-array': 0.11.10 + '@humanwhocodes/module-importer': 1.0.1 + '@nodelib/fs.walk': 1.2.8 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.3 + debug: 4.3.4 + doctrine: 3.0.0 + escape-string-regexp: 4.0.0 + eslint-scope: 7.2.2 + eslint-visitor-keys: 3.4.3 + espree: 9.6.1 + esquery: 1.5.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 6.0.1 + find-up: 5.0.0 + glob-parent: 6.0.2 + globals: 13.21.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 + + /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 + + /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'} + dev: true + + /esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + dev: true + /etag@1.8.1: resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} engines: {node: '>= 0.6'} 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 + + /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: true + /expand-template@2.0.3: resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} engines: {node: '>=6'} @@ -1378,6 +1851,14 @@ packages: - supports-color dev: false + /fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + dev: true + + /fast-diff@1.3.0: + resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} + dev: true + /fast-glob@3.3.1: resolution: {integrity: sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==} engines: {node: '>=8.6.0'} @@ -1389,12 +1870,27 @@ packages: micromatch: 4.0.5 dev: true + /fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + dev: true + + /fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + dev: true + /fastq@1.15.0: resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} dependencies: reusify: 1.0.4 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.0 + dev: true + /fill-range@7.0.1: resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} engines: {node: '>=8'} @@ -1417,6 +1913,27 @@ packages: - supports-color dev: false + /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.0: + resolution: {integrity: sha512-OHx4Qwrrt0E4jEIcI5/Xb+f+QmJYNj2rrK8wiIdQOIrB9WrrJL8cjZvXdXuBTkkEwEqLycb5BeZDV1o2i9bTew==} + engines: {node: '>=12.0.0'} + dependencies: + flatted: 3.2.7 + keyv: 4.5.3 + rimraf: 3.0.2 + dev: true + + /flatted@3.2.7: + resolution: {integrity: sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==} + dev: true + /follow-redirects@1.15.2: resolution: {integrity: sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==} engines: {node: '>=4.0'} @@ -1520,6 +2037,11 @@ packages: has-symbols: 1.0.3 dev: false + /get-stream@6.0.1: + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} + dev: true + /github-from-package@0.0.0: resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==} dev: true @@ -1531,6 +2053,13 @@ packages: is-glob: 4.0.3 dev: true + /glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + dependencies: + is-glob: 4.0.3 + dev: true + /glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} dependencies: @@ -1541,6 +2070,13 @@ packages: once: 1.4.0 path-is-absolute: 1.0.1 + /globals@13.21.0: + resolution: {integrity: sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg==} + engines: {node: '>=8'} + dependencies: + type-fest: 0.20.2 + dev: true + /globby@11.1.0: resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} engines: {node: '>=10'} @@ -1569,6 +2105,10 @@ packages: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} dev: true + /graphemer@1.4.0: + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + dev: true + /grpc-tools@1.12.4: resolution: {integrity: sha512-5+mLAJJma3BjnW/KQp6JBjUMgvu7Mu3dBvBPd1dcbNIb+qiR0817zDpgPjS7gRb+l/8EVNIa3cB02xI9JLToKg==} hasBin: true @@ -1652,6 +2192,16 @@ packages: - supports-color dev: true + /human-signals@2.1.0: + resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} + engines: {node: '>=10.17.0'} + dev: true + + /human-signals@4.3.1: + resolution: {integrity: sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==} + engines: {node: '>=14.18.0'} + dev: true + /iconv-lite@0.4.24: resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} engines: {node: '>=0.10.0'} @@ -1672,6 +2222,19 @@ packages: engines: {node: '>= 4'} dev: true + /import-fresh@3.3.0: + resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + engines: {node: '>=6'} + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + dev: true + + /imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + dev: true + /inflight@1.0.6: resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} dependencies: @@ -1717,6 +2280,18 @@ packages: has: 1.0.3 dev: true + /is-docker@2.2.1: + resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} + engines: {node: '>=8'} + hasBin: true + dev: true + + /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: true + /is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} @@ -1733,21 +2308,74 @@ packages: is-extglob: 2.1.1 dev: true + /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: true + /is-number@7.0.0: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} dev: true + /is-path-inside@3.0.3: + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: '>=8'} + dev: true + + /is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + dev: true + + /is-stream@3.0.0: + resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: true + + /is-wsl@2.2.0: + resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} + engines: {node: '>=8'} + dependencies: + is-docker: 2.2.1 + dev: true + /isarray@1.0.0: resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} dev: true + /isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + dev: true + + /js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + dependencies: + argparse: 2.0.1 + dev: true + /jsesc@2.5.2: resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} engines: {node: '>=4'} hasBin: true dev: true + /json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + dev: true + + /json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + dev: true + + /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'} @@ -1765,15 +2393,40 @@ packages: graceful-fs: 4.2.11 dev: true + /keyv@4.5.3: + resolution: {integrity: sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug==} + dependencies: + json-buffer: 3.0.1 + 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 + /local-pkg@0.4.3: resolution: {integrity: sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==} engines: {node: '>=14'} dev: true + /locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + dependencies: + p-locate: 5.0.0 + dev: true + /lodash.camelcase@4.3.0: resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} dev: false + /lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + dev: true + /long@4.0.0: resolution: {integrity: sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==} dev: false @@ -1822,6 +2475,10 @@ packages: resolution: {integrity: sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==} dev: false + /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'} @@ -1858,6 +2515,16 @@ packages: hasBin: true dev: false + /mimic-fn@2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + dev: true + + /mimic-fn@4.0.0: + resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} + engines: {node: '>=12'} + dev: true + /mimic-response@3.1.0: resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} engines: {node: '>=10'} @@ -1939,6 +2606,10 @@ packages: resolution: {integrity: sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==} dev: true + /natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + dev: true + /negotiator@0.6.3: resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} engines: {node: '>= 0.6'} @@ -2004,6 +2675,20 @@ packages: engines: {node: '>=0.10.0'} dev: true + /npm-run-path@4.0.1: + resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} + engines: {node: '>=8'} + dependencies: + path-key: 3.1.1 + dev: true + + /npm-run-path@5.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: true + /npmlog@5.0.1: resolution: {integrity: sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==} dependencies: @@ -2034,11 +2719,54 @@ packages: dependencies: wrappy: 1.0.2 + /onetime@5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + dependencies: + mimic-fn: 2.1.0 + dev: true + + /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@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: true + + /optionator@0.9.3: + resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} + engines: {node: '>= 0.8.0'} + dependencies: + '@aashutoshrathi/word-wrap': 1.2.6 + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + dev: true + /p-is-promise@3.0.0: resolution: {integrity: sha512-Wo8VsW4IRQSKVXsJCn7TomUaVtyfjVDn3nUP7kE967BQk0CwFpdbZs0X0uk5sW9mkBa9eNM7hCMaG93WUAwxYQ==} engines: {node: '>=8'} dev: true + /p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + dependencies: + yocto-queue: 0.1.0 + dev: true + /p-limit@4.0.0: resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -2046,15 +2774,44 @@ packages: yocto-queue: 1.0.0 dev: true + /p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + dependencies: + p-limit: 3.1.0 + dev: true + + /parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + dependencies: + callsites: 3.1.0 + dev: true + /parseurl@1.3.3: resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} engines: {node: '>= 0.8'} dev: false + /path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + dev: true + /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'} + dev: true + + /path-key@4.0.0: + resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} + engines: {node: '>=12'} + dev: true + /path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} dev: true @@ -2166,6 +2923,24 @@ packages: tunnel-agent: 0.6.0 dev: true + /prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + dev: true + + /prettier-linter-helpers@1.0.0: + resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} + engines: {node: '>=6.0.0'} + dependencies: + fast-diff: 1.3.0 + dev: true + + /prettier@3.0.2: + resolution: {integrity: sha512-o2YR9qtniXvwEZlOKbveKfDQVyqxbEIWn48Z8m3ZJjBjcCmUy3xZGIv+7AkaeuaTr6yPXJjwv07ZWlsWbEy1rQ==} + engines: {node: '>=14'} + hasBin: true + dev: true + /pretty-format@29.6.2: resolution: {integrity: sha512-1q0oC8eRveTg5nnBEWMXAU2qpv65Gnuf2eCQzSjxpWFkPaPARwqZZDGuNE0zPAZfTCHzIk3A8dIjwlQKKLphyg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -2226,6 +3001,11 @@ packages: once: 1.4.0 dev: true + /punycode@2.3.0: + resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==} + engines: {node: '>=6'} + dev: true + /qs@6.11.0: resolution: {integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==} engines: {node: '>=0.6'} @@ -2308,6 +3088,11 @@ packages: resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} engines: {node: '>=0.10.0'} + /resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + dev: true + /resolve@1.22.4: resolution: {integrity: sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==} hasBin: true @@ -2337,6 +3122,13 @@ packages: fsevents: 2.3.2 dev: true + /run-applescript@5.0.0: + resolution: {integrity: sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg==} + engines: {node: '>=12'} + dependencies: + execa: 5.1.1 + dev: true + /run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} dependencies: @@ -2408,6 +3200,18 @@ packages: resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} dev: false + /shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + dependencies: + shebang-regex: 3.0.0 + dev: true + + /shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + dev: true + /side-channel@1.0.4: resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} dependencies: @@ -2508,11 +3312,26 @@ packages: engines: {node: '>=4'} dev: true + /strip-final-newline@2.0.0: + resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} + engines: {node: '>=6'} + dev: true + + /strip-final-newline@3.0.0: + resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} + engines: {node: '>=12'} + dev: true + /strip-json-comments@2.0.1: resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} engines: {node: '>=0.10.0'} dev: true + /strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + dev: true + /strip-literal@1.3.0: resolution: {integrity: sha512-PugKzOsyXpArk0yWmUwqOZecSO0GH0bPoctLcqNDH9J04pVW3lflYE0ujElBGTloevcxF5MofAOZ7C5l2b+wLg==} dependencies: @@ -2547,6 +3366,14 @@ packages: json5: 2.2.3 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: true + /tar-fs@2.1.1: resolution: {integrity: sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==} dependencies: @@ -2579,6 +3406,10 @@ packages: yallist: 4.0.0 dev: true + /text-table@0.2.0: + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + dev: true + /tinybench@2.5.0: resolution: {integrity: sha512-kRwSG8Zx4tjF9ZiyH4bhaebu+EDz1BOx9hOigYHlUW4xxI/wKIUQUqo018UlU4ar6ATPBsaMrdbKZ+tmPdohFA==} dev: true @@ -2593,6 +3424,11 @@ packages: engines: {node: '>=14.0.0'} dev: true + /titleize@3.0.0: + resolution: {integrity: sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ==} + engines: {node: '>=12'} + dev: true + /to-fast-properties@2.0.0: resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} engines: {node: '>=4'} @@ -2621,6 +3457,15 @@ packages: resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} dev: true + /ts-api-utils@1.0.2(typescript@5.0.2): + resolution: {integrity: sha512-Cbu4nIqnEdd+THNEsBdkolnOXhg0I8XteoHaEKgvsxpsbWda4IsUut2c187HxywQCvveojow0Dgw/amxtSKVkQ==} + engines: {node: '>=16.13.0'} + peerDependencies: + typescript: '>=4.2.0' + dependencies: + typescript: 5.0.2 + dev: true + /ts-node@10.9.1(@types/node@18.17.6)(typescript@5.0.2): resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} hasBin: true @@ -2674,17 +3519,33 @@ packages: strip-bom: 3.0.0 dev: true + /tslib@2.6.2: + resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} + dev: true + /tunnel-agent@0.6.0: resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} dependencies: safe-buffer: 5.2.1 dev: true + /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-is@1.6.18: resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} engines: {node: '>= 0.6'} @@ -2725,6 +3586,17 @@ packages: engines: {node: '>= 0.8'} dev: false + /untildify@4.0.0: + resolution: {integrity: sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==} + engines: {node: '>=8'} + dev: true + + /uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + dependencies: + punycode: 2.3.0 + dev: true + /util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} dev: true @@ -2893,6 +3765,14 @@ packages: webidl-conversions: 3.0.1 dev: true + /which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + dependencies: + isexe: 2.0.0 + dev: true + /why-is-node-running@2.2.2: resolution: {integrity: sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==} engines: {node: '>=8'} @@ -2972,6 +3852,11 @@ packages: engines: {node: '>=6'} dev: true + /yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + dev: true + /yocto-queue@1.0.0: resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} engines: {node: '>=12.20'} diff --git a/services/notification/package-lock.json b/services/notification/package-lock.json new file mode 100644 index 00000000..62a042ee --- /dev/null +++ b/services/notification/package-lock.json @@ -0,0 +1,1481 @@ +{ + "name": "@goodfood/notification", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "@goodfood/notification", + "hasInstallScript": true, + "dependencies": { + "@grpc/grpc-js": "^1.9.0", + "@grpc/proto-loader": "^0.7.8", + "@plunk/node": "^2.0.0", + "@prisma/client": "5.1.0", + "@types/amqplib": "^0.10.1", + "amqplib": "^0.10.3", + "dotenv": "^16.3.1", + "esbuild": "^0.19.2", + "nodemon": "^3.0.1", + "path": "^0.12.7", + "ts-node": "^10.9.1", + "tsconfig-paths": "^4.2.0" + }, + "bin": { + "notification": "dist/index.js" + }, + "devDependencies": { + "prisma": "^5.1.1", + "typescript": "^5.1.6" + } + }, + "node_modules/@acuminous/bitsyntax": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@acuminous/bitsyntax/-/bitsyntax-0.1.2.tgz", + "integrity": "sha512-29lUK80d1muEQqiUsSo+3A0yP6CdspgC95EnKBMi22Xlwt79i/En4Vr67+cXhU+cZjbti3TgGGC5wy1stIywVQ==", + "dependencies": { + "buffer-more-ints": "~1.0.0", + "debug": "^4.3.4", + "safe-buffer": "~5.1.2" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.2.tgz", + "integrity": "sha512-tM8yLeYVe7pRyAu9VMi/Q7aunpLwD139EY1S99xbQkT4/q2qa6eA4ige/WJQYdJ8GBL1K33pPFhPfPdJ/WzT8Q==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.2.tgz", + "integrity": "sha512-lsB65vAbe90I/Qe10OjkmrdxSX4UJDjosDgb8sZUKcg3oefEuW2OT2Vozz8ef7wrJbMcmhvCC+hciF8jY/uAkw==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.2.tgz", + "integrity": "sha512-qK/TpmHt2M/Hg82WXHRc/W/2SGo/l1thtDHZWqFq7oi24AjZ4O/CpPSu6ZuYKFkEgmZlFoa7CooAyYmuvnaG8w==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.2.tgz", + "integrity": "sha512-Ora8JokrvrzEPEpZO18ZYXkH4asCdc1DLdcVy8TGf5eWtPO1Ie4WroEJzwI52ZGtpODy3+m0a2yEX9l+KUn0tA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.2.tgz", + "integrity": "sha512-tP+B5UuIbbFMj2hQaUr6EALlHOIOmlLM2FK7jeFBobPy2ERdohI4Ka6ZFjZ1ZYsrHE/hZimGuU90jusRE0pwDw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.2.tgz", + "integrity": "sha512-YbPY2kc0acfzL1VPVK6EnAlig4f+l8xmq36OZkU0jzBVHcOTyQDhnKQaLzZudNJQyymd9OqQezeaBgkTGdTGeQ==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.2.tgz", + "integrity": "sha512-nSO5uZT2clM6hosjWHAsS15hLrwCvIWx+b2e3lZ3MwbYSaXwvfO528OF+dLjas1g3bZonciivI8qKR/Hm7IWGw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.2.tgz", + "integrity": "sha512-Odalh8hICg7SOD7XCj0YLpYCEc+6mkoq63UnExDCiRA2wXEmGlK5JVrW50vZR9Qz4qkvqnHcpH+OFEggO3PgTg==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.2.tgz", + "integrity": "sha512-ig2P7GeG//zWlU0AggA3pV1h5gdix0MA3wgB+NsnBXViwiGgY77fuN9Wr5uoCrs2YzaYfogXgsWZbm+HGr09xg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.2.tgz", + "integrity": "sha512-mLfp0ziRPOLSTek0Gd9T5B8AtzKAkoZE70fneiiyPlSnUKKI4lp+mGEnQXcQEHLJAcIYDPSyBvsUbKUG2ri/XQ==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.2.tgz", + "integrity": "sha512-hn28+JNDTxxCpnYjdDYVMNTR3SKavyLlCHHkufHV91fkewpIyQchS1d8wSbmXhs1fiYDpNww8KTFlJ1dHsxeSw==", + "cpu": [ + "loong64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.2.tgz", + "integrity": "sha512-KbXaC0Sejt7vD2fEgPoIKb6nxkfYW9OmFUK9XQE4//PvGIxNIfPk1NmlHmMg6f25x57rpmEFrn1OotASYIAaTg==", + "cpu": [ + "mips64el" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.2.tgz", + "integrity": "sha512-dJ0kE8KTqbiHtA3Fc/zn7lCd7pqVr4JcT0JqOnbj4LLzYnp+7h8Qi4yjfq42ZlHfhOCM42rBh0EwHYLL6LEzcw==", + "cpu": [ + "ppc64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.2.tgz", + "integrity": "sha512-7Z/jKNFufZ/bbu4INqqCN6DDlrmOTmdw6D0gH+6Y7auok2r02Ur661qPuXidPOJ+FSgbEeQnnAGgsVynfLuOEw==", + "cpu": [ + "riscv64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.2.tgz", + "integrity": "sha512-U+RinR6aXXABFCcAY4gSlv4CL1oOVvSSCdseQmGO66H+XyuQGZIUdhG56SZaDJQcLmrSfRmx5XZOWyCJPRqS7g==", + "cpu": [ + "s390x" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.2.tgz", + "integrity": "sha512-oxzHTEv6VPm3XXNaHPyUTTte+3wGv7qVQtqaZCrgstI16gCuhNOtBXLEBkBREP57YTd68P0VgDgG73jSD8bwXQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.2.tgz", + "integrity": "sha512-WNa5zZk1XpTTwMDompZmvQLHszDDDN7lYjEHCUmAGB83Bgs20EMs7ICD+oKeT6xt4phV4NDdSi/8OfjPbSbZfQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.2.tgz", + "integrity": "sha512-S6kI1aT3S++Dedb7vxIuUOb3oAxqxk2Rh5rOXOTYnzN8JzW1VzBd+IqPiSpgitu45042SYD3HCoEyhLKQcDFDw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.2.tgz", + "integrity": "sha512-VXSSMsmb+Z8LbsQGcBMiM+fYObDNRm8p7tkUDMPG/g4fhFX5DEFmjxIEa3N8Zr96SjsJ1woAhF0DUnS3MF3ARw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.2.tgz", + "integrity": "sha512-5NayUlSAyb5PQYFAU9x3bHdsqB88RC3aM9lKDAz4X1mo/EchMIT1Q+pSeBXNgkfNmRecLXA0O8xP+x8V+g/LKg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.2.tgz", + "integrity": "sha512-47gL/ek1v36iN0wL9L4Q2MFdujR0poLZMJwhO2/N3gA89jgHp4MR8DKCmwYtGNksbfJb9JoTtbkoe6sDhg2QTA==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.2.tgz", + "integrity": "sha512-tcuhV7ncXBqbt/Ybf0IyrMcwVOAPDckMK9rXNHtF17UTK18OKLpg08glminN06pt2WCoALhXdLfSPbVvK/6fxw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@grpc/grpc-js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.9.1.tgz", + "integrity": "sha512-AvDEPQT4teS+J8++cTE5tku4rYCwpPwPguESJUummLs/Ug/O5Bouofnc1mxaDORmwA9QkrJ+PfRQ1Qs7adQgJg==", + "dependencies": { + "@grpc/proto-loader": "^0.7.8", + "@types/node": ">=12.12.47" + }, + "engines": { + "node": "^8.13.0 || >=10.10.0" + } + }, + "node_modules/@grpc/proto-loader": { + "version": "0.7.9", + "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.9.tgz", + "integrity": "sha512-YJsOehVXzgurc+lLAxYnlSMc1p/Gu6VAvnfx0ATi2nzvr0YZcjhmZDeY8SeAKv1M7zE3aEJH0Xo9mK1iZ8GYoQ==", + "dependencies": { + "lodash.camelcase": "^4.3.0", + "long": "^5.0.0", + "protobufjs": "^7.2.4", + "yargs": "^17.7.2" + }, + "bin": { + "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@plunk/node": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@plunk/node/-/node-2.0.0.tgz", + "integrity": "sha512-53lgots3fWGAo1QdS18BdEpJl7A29O1F9rYVn/7DfJ07SpJ1ZlzUeeWGVrWGL7PRRZb4a9Tw7Tt8Wnw0Xorhjg==", + "dependencies": { + "native-fetch": "^4.0.2", + "tslib": "^2.4.0", + "undici": "^5.22.1" + } + }, + "node_modules/@prisma/client": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@prisma/client/-/client-5.1.0.tgz", + "integrity": "sha512-aIxuXlH3p3Vy91buodQhYgAD9m0yuxJzpXMhc1ejQ/WN3pNNWzBA0iDcBObLq8DMdszcXmoLAk3hiRq/ZwBsOw==", + "hasInstallScript": true, + "dependencies": { + "@prisma/engines-version": "5.1.0-28.a9b7003df90aa623086e4d6f4e43c72468e6339b" + }, + "engines": { + "node": ">=16.13" + }, + "peerDependencies": { + "prisma": "*" + }, + "peerDependenciesMeta": { + "prisma": { + "optional": true + } + } + }, + "node_modules/@prisma/engines": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-5.2.0.tgz", + "integrity": "sha512-dT7FOLUCdZmq+AunLqB1Iz+ZH/IIS1Fz2THmKZQ6aFONrQD/BQ5ecJ7g2wGS2OgyUFf4OaLam6/bxmgdOBDqig==", + "devOptional": true, + "hasInstallScript": true + }, + "node_modules/@prisma/engines-version": { + "version": "5.1.0-28.a9b7003df90aa623086e4d6f4e43c72468e6339b", + "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-5.1.0-28.a9b7003df90aa623086e4d6f4e43c72468e6339b.tgz", + "integrity": "sha512-jTwE2oy1yjICmTfnCR0ASIpuMZXZ18sUzQXB7V0RMbrM9OlcmbUwXPuYhnxXuWN8XwRmujeIhsXs/Zeh+fjPOQ==" + }, + "node_modules/@protobufjs/aspromise": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==" + }, + "node_modules/@protobufjs/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" + }, + "node_modules/@protobufjs/codegen": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", + "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" + }, + "node_modules/@protobufjs/eventemitter": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", + "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==" + }, + "node_modules/@protobufjs/fetch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", + "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", + "dependencies": { + "@protobufjs/aspromise": "^1.1.1", + "@protobufjs/inquire": "^1.1.0" + } + }, + "node_modules/@protobufjs/float": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", + "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==" + }, + "node_modules/@protobufjs/inquire": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", + "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==" + }, + "node_modules/@protobufjs/path": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==" + }, + "node_modules/@protobufjs/pool": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==" + }, + "node_modules/@protobufjs/utf8": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", + "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==" + }, + "node_modules/@tsconfig/node10": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", + "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==" + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==" + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==" + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==" + }, + "node_modules/@types/amqplib": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/@types/amqplib/-/amqplib-0.10.1.tgz", + "integrity": "sha512-j6ANKT79ncUDnAs/+9r9eDujxbeJoTjoVu33gHHcaPfmLQaMhvfbH2GqSe8KUM444epAp1Vl3peVOQfZk3UIqA==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/node": { + "version": "20.5.7", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.5.7.tgz", + "integrity": "sha512-dP7f3LdZIysZnmvP3ANJYTSwg+wLLl8p7RqniVlV7j+oXSXAbt9h0WIBFmJy5inWZoX9wZN6eXx+YXd9Rh3RBA==" + }, + "node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" + }, + "node_modules/acorn": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/amqplib": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/amqplib/-/amqplib-0.10.3.tgz", + "integrity": "sha512-UHmuSa7n8vVW/a5HGh2nFPqAEr8+cD4dEZ6u9GjP91nHfr1a54RyAKyra7Sb5NH7NBKOUlyQSMXIp0qAixKexw==", + "dependencies": { + "@acuminous/bitsyntax": "^0.1.2", + "buffer-more-ints": "~1.0.0", + "readable-stream": "1.x >=1.1.9", + "url-parse": "~1.5.10" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==" + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/buffer-more-ints": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-more-ints/-/buffer-more-ints-1.0.0.tgz", + "integrity": "sha512-EMetuGFz5SLsT0QTnXzINh4Ksr+oo4i+UGTXEshiGCQWnsgSs7ZhJ8fzlwQ+OzEMs0MpDAMr1hxnblp5a4vcHg==" + }, + "node_modules/busboy": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", + "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", + "dependencies": { + "streamsearch": "^1.1.0" + }, + "engines": { + "node": ">=10.16.0" + } + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==" + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/dotenv": { + "version": "16.3.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.3.1.tgz", + "integrity": "sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/motdotla/dotenv?sponsor=1" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/esbuild": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.2.tgz", + "integrity": "sha512-G6hPax8UbFakEj3hWO0Vs52LQ8k3lnBhxZWomUJDxfz3rZTLqF5k/FCzuNdLx2RbpBiQQF9H9onlDDH1lZsnjg==", + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.19.2", + "@esbuild/android-arm64": "0.19.2", + "@esbuild/android-x64": "0.19.2", + "@esbuild/darwin-arm64": "0.19.2", + "@esbuild/darwin-x64": "0.19.2", + "@esbuild/freebsd-arm64": "0.19.2", + "@esbuild/freebsd-x64": "0.19.2", + "@esbuild/linux-arm": "0.19.2", + "@esbuild/linux-arm64": "0.19.2", + "@esbuild/linux-ia32": "0.19.2", + "@esbuild/linux-loong64": "0.19.2", + "@esbuild/linux-mips64el": "0.19.2", + "@esbuild/linux-ppc64": "0.19.2", + "@esbuild/linux-riscv64": "0.19.2", + "@esbuild/linux-s390x": "0.19.2", + "@esbuild/linux-x64": "0.19.2", + "@esbuild/netbsd-x64": "0.19.2", + "@esbuild/openbsd-x64": "0.19.2", + "@esbuild/sunos-x64": "0.19.2", + "@esbuild/win32-arm64": "0.19.2", + "@esbuild/win32-ia32": "0.19.2", + "@esbuild/win32-x64": "0.19.2" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "engines": { + "node": ">=6" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/ignore-by-default": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", + "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==" + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==" + }, + "node_modules/long": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", + "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==" + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==" + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/native-fetch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/native-fetch/-/native-fetch-4.0.2.tgz", + "integrity": "sha512-4QcVlKFtv2EYVS5MBgsGX5+NWKtbDbIECdUXDBGDMAZXq3Jkv9zf+y8iS7Ub8fEdga3GpYeazp9gauNqXHJOCg==", + "peerDependencies": { + "undici": "*" + } + }, + "node_modules/nodemon": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.0.1.tgz", + "integrity": "sha512-g9AZ7HmkhQkqXkRc20w+ZfQ73cHLbE8hnPbtaFbFtCumZsjyMhKk9LajQ07U5Ux28lvFjZ5X7HvWR1xzU8jHVw==", + "dependencies": { + "chokidar": "^3.5.2", + "debug": "^3.2.7", + "ignore-by-default": "^1.0.1", + "minimatch": "^3.1.2", + "pstree.remy": "^1.1.8", + "semver": "^7.5.3", + "simple-update-notifier": "^2.0.0", + "supports-color": "^5.5.0", + "touch": "^3.1.0", + "undefsafe": "^2.0.5" + }, + "bin": { + "nodemon": "bin/nodemon.js" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/nodemon" + } + }, + "node_modules/nodemon/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/nopt": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", + "integrity": "sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==", + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "*" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path": { + "version": "0.12.7", + "resolved": "https://registry.npmjs.org/path/-/path-0.12.7.tgz", + "integrity": "sha512-aXXC6s+1w7otVF9UletFkFcDsJeO7lSZBPUQhtb5O0xJe8LtYhj/GxldoL09bBj9+ZmE2hNoHqQSFMN5fikh4Q==", + "dependencies": { + "process": "^0.11.1", + "util": "^0.10.3" + } + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/prisma": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/prisma/-/prisma-5.2.0.tgz", + "integrity": "sha512-FfFlpjVCkZwrqxDnP4smlNYSH1so+CbfjgdpioFzGGqlQAEm6VHAYSzV7jJgC3ebtY9dNOhDMS2+4/1DDSM7bQ==", + "devOptional": true, + "hasInstallScript": true, + "dependencies": { + "@prisma/engines": "5.2.0" + }, + "bin": { + "prisma": "build/index.js" + }, + "engines": { + "node": ">=16.13" + } + }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/protobufjs": { + "version": "7.2.5", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.2.5.tgz", + "integrity": "sha512-gGXRSXvxQ7UiPgfw8gevrfRWcTlSbOFg+p/N+JVJEK5VhueL2miT6qTymqAmjr1Q5WbOCyJbyrk6JfWKwlFn6A==", + "hasInstallScript": true, + "dependencies": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/node": ">=13.7.0", + "long": "^5.0.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/pstree.remy": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", + "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==" + }, + "node_modules/querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==" + }, + "node_modules/readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==" + }, + "node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/simple-update-notifier": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", + "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==", + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/streamsearch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", + "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==" + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "engines": { + "node": ">=4" + } + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/touch": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", + "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", + "dependencies": { + "nopt": "~1.0.10" + }, + "bin": { + "nodetouch": "bin/nodetouch.js" + } + }, + "node_modules/ts-node": { + "version": "10.9.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", + "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "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 + } + } + }, + "node_modules/tsconfig-paths": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", + "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==", + "dependencies": { + "json5": "^2.2.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + }, + "node_modules/typescript": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", + "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undefsafe": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", + "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==" + }, + "node_modules/undici": { + "version": "5.23.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.23.0.tgz", + "integrity": "sha512-1D7w+fvRsqlQ9GscLBwcAJinqcZGHUKjbOmXdlE/v8BvEGXjeWAax+341q44EuTcHXXnfyKNbKRq4Lg7OzhMmg==", + "dependencies": { + "busboy": "^1.6.0" + }, + "engines": { + "node": ">=14.0" + } + }, + "node_modules/url-parse": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "node_modules/util": { + "version": "0.10.4", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", + "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==", + "dependencies": { + "inherits": "2.0.3" + } + }, + "node_modules/util/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==" + }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==" + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "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.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "engines": { + "node": ">=12" + } + }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "engines": { + "node": ">=6" + } + } + } +} diff --git a/services/product/pnpm-lock.yaml b/services/product/pnpm-lock.yaml index 7c69ab14..afd5a6d6 100644 --- a/services/product/pnpm-lock.yaml +++ b/services/product/pnpm-lock.yaml @@ -15,8 +15,8 @@ dependencies: specifier: ^0.7.6 version: 0.7.6 '@prisma/client': - specifier: ^4.16.2 - version: 4.16.2(prisma@4.16.2) + specifier: ^5.2.0 + version: 5.2.0(prisma@5.2.0) amqplib: specifier: ^0.10.3 version: 0.10.3 @@ -47,8 +47,8 @@ devDependencies: specifier: ^0.18.11 version: 0.18.11 prisma: - specifier: ^4.16.2 - version: 4.16.2 + specifier: ^5.2.0 + version: 5.2.0 ts-node: specifier: ^10.9.1 version: 10.9.1(@types/node@18.16.7)(typescript@5.0.2) @@ -497,9 +497,9 @@ packages: engines: {node: '>=8.0.0'} dev: false - /@prisma/client@4.16.2(prisma@4.16.2): - resolution: {integrity: sha512-qCoEyxv1ZrQ4bKy39GnylE8Zq31IRmm8bNhNbZx7bF2cU5aiCCnSa93J2imF88MBjn7J9eUQneNxUQVJdl/rPQ==} - engines: {node: '>=14.17'} + /@prisma/client@5.2.0(prisma@5.2.0): + resolution: {integrity: sha512-AiTjJwR4J5Rh6Z/9ZKrBBLel3/5DzUNntMohOy7yObVnVoTNVFi2kvpLZlFuKO50d7yDspOtW6XBpiAd0BVXbQ==} + engines: {node: '>=16.13'} requiresBuild: true peerDependencies: prisma: '*' @@ -507,16 +507,16 @@ packages: prisma: optional: true dependencies: - '@prisma/engines-version': 4.16.1-1.4bc8b6e1b66cb932731fb1bdbbc550d1e010de81 - prisma: 4.16.2 + '@prisma/engines-version': 5.2.0-25.2804dc98259d2ea960602aca6b8e7fdc03c1758f + prisma: 5.2.0 dev: false - /@prisma/engines-version@4.16.1-1.4bc8b6e1b66cb932731fb1bdbbc550d1e010de81: - resolution: {integrity: sha512-q617EUWfRIDTriWADZ4YiWRZXCa/WuhNgLTVd+HqWLffjMSPzyM5uOWoauX91wvQClSKZU4pzI4JJLQ9Kl62Qg==} + /@prisma/engines-version@5.2.0-25.2804dc98259d2ea960602aca6b8e7fdc03c1758f: + resolution: {integrity: sha512-jsnKT5JIDIE01lAeCj2ghY9IwxkedhKNvxQeoyLs6dr4ZXynetD0vTy7u6wMJt8vVPv8I5DPy/I4CFaoXAgbtg==} dev: false - /@prisma/engines@4.16.2: - resolution: {integrity: sha512-vx1nxVvN4QeT/cepQce68deh/Turxy5Mr+4L4zClFuK1GlxN3+ivxfuv+ej/gvidWn1cE1uAhW7ALLNlYbRUAw==} + /@prisma/engines@5.2.0: + resolution: {integrity: sha512-dT7FOLUCdZmq+AunLqB1Iz+ZH/IIS1Fz2THmKZQ6aFONrQD/BQ5ecJ7g2wGS2OgyUFf4OaLam6/bxmgdOBDqig==} requiresBuild: true /@protobufjs/aspromise@1.1.2: @@ -2572,13 +2572,13 @@ packages: engines: {node: '>=0.10.0'} dev: false - /prisma@4.16.2: - resolution: {integrity: sha512-SYCsBvDf0/7XSJyf2cHTLjLeTLVXYfqp7pG5eEVafFLeT0u/hLFz/9W196nDRGUOo1JfPatAEb+uEnTQImQC1g==} - engines: {node: '>=14.17'} + /prisma@5.2.0: + resolution: {integrity: sha512-FfFlpjVCkZwrqxDnP4smlNYSH1so+CbfjgdpioFzGGqlQAEm6VHAYSzV7jJgC3ebtY9dNOhDMS2+4/1DDSM7bQ==} + engines: {node: '>=16.13'} hasBin: true requiresBuild: true dependencies: - '@prisma/engines': 4.16.2 + '@prisma/engines': 5.2.0 /process-nextick-args@2.0.1: resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} diff --git a/services/restaurant/pnpm-lock.yaml b/services/restaurant/pnpm-lock.yaml new file mode 100644 index 00000000..23083ef2 --- /dev/null +++ b/services/restaurant/pnpm-lock.yaml @@ -0,0 +1,1003 @@ +lockfileVersion: '6.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +dependencies: + '@grpc/grpc-js': + specifier: ^1.8.18 + version: 1.8.18 + '@grpc/proto-loader': + specifier: ^0.7.8 + version: 0.7.8 + '@prisma/client': + specifier: 5.1.1 + version: 5.1.1(prisma@5.1.1) + amqplib: + specifier: ^0.10.3 + version: 0.10.3 + dotenv: + specifier: ^16.3.1 + version: 16.3.1 + esbuild: + specifier: ^0.18.15 + version: 0.18.15 + geolib: + specifier: ^3.3.4 + version: 3.3.4 + nodemon: + specifier: ^3.0.1 + version: 3.0.1 + path: + specifier: ^0.12.7 + version: 0.12.7 + ts-node: + specifier: ^10.9.1 + version: 10.9.1(@types/node@20.5.7)(typescript@5.1.6) + tsconfig-paths: + specifier: ^4.2.0 + version: 4.2.0 + +devDependencies: + '@types/amqplib': + specifier: ^0.10.1 + version: 0.10.1 + prisma: + specifier: ^5.1.1 + version: 5.1.1 + typescript: + specifier: ^5.1.6 + version: 5.1.6 + +packages: + + /@acuminous/bitsyntax@0.1.2: + resolution: {integrity: sha512-29lUK80d1muEQqiUsSo+3A0yP6CdspgC95EnKBMi22Xlwt79i/En4Vr67+cXhU+cZjbti3TgGGC5wy1stIywVQ==} + engines: {node: '>=0.8'} + dependencies: + buffer-more-ints: 1.0.0 + debug: 4.3.4 + safe-buffer: 5.1.2 + transitivePeerDependencies: + - supports-color + dev: false + + /@cspotcode/source-map-support@0.8.1: + resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} + engines: {node: '>=12'} + dependencies: + '@jridgewell/trace-mapping': 0.3.9 + dev: false + + /@esbuild/android-arm64@0.18.15: + resolution: {integrity: sha512-NI/gnWcMl2kXt1HJKOn2H69SYn4YNheKo6NZt1hyfKWdMbaGadxjZIkcj4Gjk/WPxnbFXs9/3HjGHaknCqjrww==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: false + optional: true + + /@esbuild/android-arm@0.18.15: + resolution: {integrity: sha512-wlkQBWb79/jeEEoRmrxt/yhn5T1lU236OCNpnfRzaCJHZ/5gf82uYx1qmADTBWE0AR/v7FiozE1auk2riyQd3w==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + requiresBuild: true + dev: false + optional: true + + /@esbuild/android-x64@0.18.15: + resolution: {integrity: sha512-FM9NQamSaEm/IZIhegF76aiLnng1kEsZl2eve/emxDeReVfRuRNmvT28l6hoFD9TsCxpK+i4v8LPpEj74T7yjA==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + requiresBuild: true + dev: false + optional: true + + /@esbuild/darwin-arm64@0.18.15: + resolution: {integrity: sha512-XmrFwEOYauKte9QjS6hz60FpOCnw4zaPAb7XV7O4lx1r39XjJhTN7ZpXqJh4sN6q60zbP6QwAVVA8N/wUyBH/w==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@esbuild/darwin-x64@0.18.15: + resolution: {integrity: sha512-bMqBmpw1e//7Fh5GLetSZaeo9zSC4/CMtrVFdj+bqKPGJuKyfNJ5Nf2m3LknKZTS+Q4oyPiON+v3eaJ59sLB5A==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@esbuild/freebsd-arm64@0.18.15: + resolution: {integrity: sha512-LoTK5N3bOmNI9zVLCeTgnk5Rk0WdUTrr9dyDAQGVMrNTh9EAPuNwSTCgaKOKiDpverOa0htPcO9NwslSE5xuLA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: false + optional: true + + /@esbuild/freebsd-x64@0.18.15: + resolution: {integrity: sha512-62jX5n30VzgrjAjOk5orYeHFq6sqjvsIj1QesXvn5OZtdt5Gdj0vUNJy9NIpjfdNdqr76jjtzBJKf+h2uzYuTQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-arm64@0.18.15: + resolution: {integrity: sha512-BWncQeuWDgYv0jTNzJjaNgleduV4tMbQjmk/zpPh/lUdMcNEAxy+jvneDJ6RJkrqloG7tB9S9rCrtfk/kuplsQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-arm@0.18.15: + resolution: {integrity: sha512-dT4URUv6ir45ZkBqhwZwyFV6cH61k8MttIwhThp2BGiVtagYvCToF+Bggyx2VI57RG4Fbt21f9TmXaYx0DeUJg==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-ia32@0.18.15: + resolution: {integrity: sha512-JPXORvgHRHITqfms1dWT/GbEY89u848dC08o0yK3fNskhp0t2TuNUnsrrSgOdH28ceb1hJuwyr8R/1RnyPwocw==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-loong64@0.18.15: + resolution: {integrity: sha512-kArPI0DopjJCEplsVj/H+2Qgzz7vdFSacHNsgoAKpPS6W/Ndh8Oe24HRDQ5QCu4jHgN6XOtfFfLpRx3TXv/mEg==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-mips64el@0.18.15: + resolution: {integrity: sha512-b/tmngUfO02E00c1XnNTw/0DmloKjb6XQeqxaYuzGwHe0fHVgx5/D6CWi+XH1DvkszjBUkK9BX7n1ARTOst59w==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-ppc64@0.18.15: + resolution: {integrity: sha512-KXPY69MWw79QJkyvUYb2ex/OgnN/8N/Aw5UDPlgoRtoEfcBqfeLodPr42UojV3NdkoO4u10NXQdamWm1YEzSKw==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-riscv64@0.18.15: + resolution: {integrity: sha512-komK3NEAeeGRnvFEjX1SfVg6EmkfIi5aKzevdvJqMydYr9N+pRQK0PGJXk+bhoPZwOUgLO4l99FZmLGk/L1jWg==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-s390x@0.18.15: + resolution: {integrity: sha512-632T5Ts6gQ2WiMLWRRyeflPAm44u2E/s/TJvn+BP6M5mnHSk93cieaypj3VSMYO2ePTCRqAFXtuYi1yv8uZJNA==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-x64@0.18.15: + resolution: {integrity: sha512-MsHtX0NgvRHsoOtYkuxyk4Vkmvk3PLRWfA4okK7c+6dT0Fu4SUqXAr9y4Q3d8vUf1VWWb6YutpL4XNe400iQ1g==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/netbsd-x64@0.18.15: + resolution: {integrity: sha512-djST6s+jQiwxMIVQ5rlt24JFIAr4uwUnzceuFL7BQT4CbrRtqBPueS4GjXSiIpmwVri1Icj/9pFRJ7/aScvT+A==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: false + optional: true + + /@esbuild/openbsd-x64@0.18.15: + resolution: {integrity: sha512-naeRhUIvhsgeounjkF5mvrNAVMGAm6EJWiabskeE5yOeBbLp7T89tAEw0j5Jm/CZAwyLe3c67zyCWH6fsBLCpw==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: false + optional: true + + /@esbuild/sunos-x64@0.18.15: + resolution: {integrity: sha512-qkT2+WxyKbNIKV1AEhI8QiSIgTHMcRctzSaa/I3kVgMS5dl3fOeoqkb7pW76KwxHoriImhx7Mg3TwN/auMDsyQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: false + optional: true + + /@esbuild/win32-arm64@0.18.15: + resolution: {integrity: sha512-HC4/feP+pB2Vb+cMPUjAnFyERs+HJN7E6KaeBlFdBv799MhD+aPJlfi/yk36SED58J9TPwI8MAcVpJgej4ud0A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@esbuild/win32-ia32@0.18.15: + resolution: {integrity: sha512-ovjwoRXI+gf52EVF60u9sSDj7myPixPxqzD5CmkEUmvs+W9Xd0iqISVBQn8xcx4ciIaIVlWCuTbYDOXOnOL44Q==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@esbuild/win32-x64@0.18.15: + resolution: {integrity: sha512-imUxH9a3WJARyAvrG7srLyiK73XdX83NXQkjKvQ+7vPh3ZxoLrzvPkQKKw2DwZ+RV2ZB6vBfNHP8XScAmQC3aA==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@grpc/grpc-js@1.8.18: + resolution: {integrity: sha512-2uWPtxhsXmVgd8WzDhfamSjHpZDXfMjMDciY6VRTq4Sn7rFzazyf0LLDa0oav+61UHIoEZb4KKaAV6S7NuJFbQ==} + engines: {node: ^8.13.0 || >=10.10.0} + dependencies: + '@grpc/proto-loader': 0.7.8 + '@types/node': 20.5.7 + dev: false + + /@grpc/proto-loader@0.7.8: + resolution: {integrity: sha512-GU12e2c8dmdXb7XUlOgYWZ2o2i+z9/VeACkxTA/zzAe2IjclC5PnVL0lpgjhrqfpDYHzM8B1TF6pqWegMYAzlA==} + engines: {node: '>=6'} + hasBin: true + dependencies: + '@types/long': 4.0.2 + lodash.camelcase: 4.3.0 + long: 4.0.0 + protobufjs: 7.2.5 + yargs: 17.7.2 + dev: false + + /@jridgewell/resolve-uri@3.1.1: + resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} + engines: {node: '>=6.0.0'} + dev: false + + /@jridgewell/sourcemap-codec@1.4.15: + resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + dev: false + + /@jridgewell/trace-mapping@0.3.9: + resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} + dependencies: + '@jridgewell/resolve-uri': 3.1.1 + '@jridgewell/sourcemap-codec': 1.4.15 + dev: false + + /@prisma/client@5.1.1(prisma@5.1.1): + resolution: {integrity: sha512-fxcCeK5pMQGcgCqCrWsi+I2rpIbk0rAhdrN+ke7f34tIrgPwA68ensrpin+9+fZvuV2OtzHmuipwduSY6HswdA==} + engines: {node: '>=16.13'} + requiresBuild: true + peerDependencies: + prisma: '*' + peerDependenciesMeta: + prisma: + optional: true + dependencies: + '@prisma/engines-version': 5.1.1-1.6a3747c37ff169c90047725a05a6ef02e32ac97e + prisma: 5.1.1 + dev: false + + /@prisma/engines-version@5.1.1-1.6a3747c37ff169c90047725a05a6ef02e32ac97e: + resolution: {integrity: sha512-owZqbY/wucbr65bXJ/ljrHPgQU5xXTSkmcE/JcbqE1kusuAXV/TLN3/exmz21SZ5rJ7WDkyk70J2G/n68iogbQ==} + dev: false + + /@prisma/engines@5.1.1: + resolution: {integrity: sha512-NV/4nVNWFZSJCCIA3HIFJbbDKO/NARc9ej0tX5S9k2EVbkrFJC4Xt9b0u4rNZWL4V+F5LAjvta8vzEUw0rw+HA==} + requiresBuild: true + + /@protobufjs/aspromise@1.1.2: + resolution: {integrity: sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==} + dev: false + + /@protobufjs/base64@1.1.2: + resolution: {integrity: sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==} + dev: false + + /@protobufjs/codegen@2.0.4: + resolution: {integrity: sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==} + dev: false + + /@protobufjs/eventemitter@1.1.0: + resolution: {integrity: sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==} + dev: false + + /@protobufjs/fetch@1.1.0: + resolution: {integrity: sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==} + dependencies: + '@protobufjs/aspromise': 1.1.2 + '@protobufjs/inquire': 1.1.0 + dev: false + + /@protobufjs/float@1.0.2: + resolution: {integrity: sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==} + dev: false + + /@protobufjs/inquire@1.1.0: + resolution: {integrity: sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==} + dev: false + + /@protobufjs/path@1.1.2: + resolution: {integrity: sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==} + dev: false + + /@protobufjs/pool@1.1.0: + resolution: {integrity: sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==} + dev: false + + /@protobufjs/utf8@1.1.0: + resolution: {integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==} + dev: false + + /@tsconfig/node10@1.0.9: + resolution: {integrity: sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==} + dev: false + + /@tsconfig/node12@1.0.11: + resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} + dev: false + + /@tsconfig/node14@1.0.3: + resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} + dev: false + + /@tsconfig/node16@1.0.4: + resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} + dev: false + + /@types/amqplib@0.10.1: + resolution: {integrity: sha512-j6ANKT79ncUDnAs/+9r9eDujxbeJoTjoVu33gHHcaPfmLQaMhvfbH2GqSe8KUM444epAp1Vl3peVOQfZk3UIqA==} + dependencies: + '@types/node': 20.5.7 + dev: true + + /@types/long@4.0.2: + resolution: {integrity: sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==} + dev: false + + /@types/node@20.5.7: + resolution: {integrity: sha512-dP7f3LdZIysZnmvP3ANJYTSwg+wLLl8p7RqniVlV7j+oXSXAbt9h0WIBFmJy5inWZoX9wZN6eXx+YXd9Rh3RBA==} + + /abbrev@1.1.1: + resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} + dev: false + + /acorn-walk@8.2.0: + resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} + engines: {node: '>=0.4.0'} + dev: false + + /acorn@8.10.0: + resolution: {integrity: sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==} + engines: {node: '>=0.4.0'} + hasBin: true + dev: false + + /amqplib@0.10.3: + resolution: {integrity: sha512-UHmuSa7n8vVW/a5HGh2nFPqAEr8+cD4dEZ6u9GjP91nHfr1a54RyAKyra7Sb5NH7NBKOUlyQSMXIp0qAixKexw==} + engines: {node: '>=10'} + dependencies: + '@acuminous/bitsyntax': 0.1.2 + buffer-more-ints: 1.0.0 + readable-stream: 1.1.14 + url-parse: 1.5.10 + transitivePeerDependencies: + - supports-color + dev: false + + /ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + dev: false + + /ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + dependencies: + color-convert: 2.0.1 + dev: false + + /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: false + + /arg@4.1.3: + resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} + dev: false + + /balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + dev: false + + /binary-extensions@2.2.0: + resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} + engines: {node: '>=8'} + 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 + + /buffer-more-ints@1.0.0: + resolution: {integrity: sha512-EMetuGFz5SLsT0QTnXzINh4Ksr+oo4i+UGTXEshiGCQWnsgSs7ZhJ8fzlwQ+OzEMs0MpDAMr1hxnblp5a4vcHg==} + dev: false + + /chokidar@3.5.3: + resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} + engines: {node: '>= 8.10.0'} + dependencies: + anymatch: 3.1.3 + braces: 3.0.2 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + dev: 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 + 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 + + /core-util-is@1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + dev: false + + /create-require@1.1.1: + resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} + dev: false + + /debug@3.2.7(supports-color@5.5.0): + resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.3 + supports-color: 5.5.0 + 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 + dev: false + + /diff@4.0.2: + resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} + engines: {node: '>=0.3.1'} + dev: false + + /dotenv@16.3.1: + resolution: {integrity: sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==} + engines: {node: '>=12'} + dev: false + + /emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + dev: false + + /esbuild@0.18.15: + resolution: {integrity: sha512-3WOOLhrvuTGPRzQPU6waSDWrDTnQriia72McWcn6UCi43GhCHrXH4S59hKMeez+IITmdUuUyvbU9JIp+t3xlPQ==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/android-arm': 0.18.15 + '@esbuild/android-arm64': 0.18.15 + '@esbuild/android-x64': 0.18.15 + '@esbuild/darwin-arm64': 0.18.15 + '@esbuild/darwin-x64': 0.18.15 + '@esbuild/freebsd-arm64': 0.18.15 + '@esbuild/freebsd-x64': 0.18.15 + '@esbuild/linux-arm': 0.18.15 + '@esbuild/linux-arm64': 0.18.15 + '@esbuild/linux-ia32': 0.18.15 + '@esbuild/linux-loong64': 0.18.15 + '@esbuild/linux-mips64el': 0.18.15 + '@esbuild/linux-ppc64': 0.18.15 + '@esbuild/linux-riscv64': 0.18.15 + '@esbuild/linux-s390x': 0.18.15 + '@esbuild/linux-x64': 0.18.15 + '@esbuild/netbsd-x64': 0.18.15 + '@esbuild/openbsd-x64': 0.18.15 + '@esbuild/sunos-x64': 0.18.15 + '@esbuild/win32-arm64': 0.18.15 + '@esbuild/win32-ia32': 0.18.15 + '@esbuild/win32-x64': 0.18.15 + dev: false + + /escalade@3.1.1: + resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} + engines: {node: '>=6'} + 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 + + /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: false + optional: true + + /geolib@3.3.4: + resolution: {integrity: sha512-EicrlLLL3S42gE9/wde+11uiaYAaeSVDwCUIv2uMIoRBfNJCn8EsSI+6nS3r4TCKDO6+RQNM9ayLq2at+oZQWQ==} + dev: false + + /get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + dev: false + + /glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + dependencies: + is-glob: 4.0.3 + dev: false + + /has-flag@3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + dev: false + + /ignore-by-default@1.0.1: + resolution: {integrity: sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==} + dev: false + + /inherits@2.0.3: + resolution: {integrity: sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==} + dev: false + + /inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + dev: false + + /is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + dependencies: + binary-extensions: 2.2.0 + dev: false + + /is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + dev: false + + /is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + 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-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + dev: false + + /isarray@0.0.1: + resolution: {integrity: sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==} + dev: false + + /json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + dev: false + + /lodash.camelcase@4.3.0: + resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} + dev: false + + /long@4.0.0: + resolution: {integrity: sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==} + dev: false + + /long@5.2.3: + resolution: {integrity: sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==} + dev: false + + /lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + dependencies: + yallist: 4.0.0 + dev: false + + /make-error@1.3.6: + resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + dev: false + + /minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + dependencies: + brace-expansion: 1.1.11 + dev: false + + /minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + dev: false + + /ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + dev: false + + /ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + dev: false + + /nodemon@3.0.1: + resolution: {integrity: sha512-g9AZ7HmkhQkqXkRc20w+ZfQ73cHLbE8hnPbtaFbFtCumZsjyMhKk9LajQ07U5Ux28lvFjZ5X7HvWR1xzU8jHVw==} + engines: {node: '>=10'} + hasBin: true + dependencies: + chokidar: 3.5.3 + debug: 3.2.7(supports-color@5.5.0) + ignore-by-default: 1.0.1 + minimatch: 3.1.2 + pstree.remy: 1.1.8 + semver: 7.5.4 + simple-update-notifier: 2.0.0 + supports-color: 5.5.0 + touch: 3.1.0 + undefsafe: 2.0.5 + dev: false + + /nopt@1.0.10: + resolution: {integrity: sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==} + hasBin: true + dependencies: + abbrev: 1.1.1 + dev: false + + /normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + dev: false + + /path@0.12.7: + resolution: {integrity: sha512-aXXC6s+1w7otVF9UletFkFcDsJeO7lSZBPUQhtb5O0xJe8LtYhj/GxldoL09bBj9+ZmE2hNoHqQSFMN5fikh4Q==} + dependencies: + process: 0.11.10 + util: 0.10.4 + dev: false + + /picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + dev: false + + /prisma@5.1.1: + resolution: {integrity: sha512-WJFG/U7sMmcc6TjJTTifTfpI6Wjoh55xl4AzopVwAdyK68L9/ogNo8QQ2cxuUjJf/Wa82z/uhyh3wMzvRIBphg==} + engines: {node: '>=16.13'} + hasBin: true + requiresBuild: true + dependencies: + '@prisma/engines': 5.1.1 + + /process@0.11.10: + resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} + engines: {node: '>= 0.6.0'} + dev: false + + /protobufjs@7.2.5: + resolution: {integrity: sha512-gGXRSXvxQ7UiPgfw8gevrfRWcTlSbOFg+p/N+JVJEK5VhueL2miT6qTymqAmjr1Q5WbOCyJbyrk6JfWKwlFn6A==} + engines: {node: '>=12.0.0'} + requiresBuild: true + dependencies: + '@protobufjs/aspromise': 1.1.2 + '@protobufjs/base64': 1.1.2 + '@protobufjs/codegen': 2.0.4 + '@protobufjs/eventemitter': 1.1.0 + '@protobufjs/fetch': 1.1.0 + '@protobufjs/float': 1.0.2 + '@protobufjs/inquire': 1.1.0 + '@protobufjs/path': 1.1.2 + '@protobufjs/pool': 1.1.0 + '@protobufjs/utf8': 1.1.0 + '@types/node': 20.5.7 + long: 5.2.3 + dev: false + + /pstree.remy@1.1.8: + resolution: {integrity: sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==} + dev: false + + /querystringify@2.2.0: + resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} + dev: false + + /readable-stream@1.1.14: + resolution: {integrity: sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==} + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 0.0.1 + string_decoder: 0.10.31 + dev: false + + /readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + dependencies: + picomatch: 2.3.1 + dev: false + + /require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + dev: false + + /requires-port@1.0.0: + resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} + dev: false + + /safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + dev: false + + /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 + dev: false + + /simple-update-notifier@2.0.0: + resolution: {integrity: sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==} + engines: {node: '>=10'} + dependencies: + semver: 7.5.4 + dev: false + + /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 + dev: false + + /string_decoder@0.10.31: + resolution: {integrity: sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==} + dev: false + + /strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + dependencies: + ansi-regex: 5.0.1 + dev: false + + /strip-bom@3.0.0: + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} + dev: false + + /supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + dependencies: + has-flag: 3.0.0 + 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 + + /touch@3.1.0: + resolution: {integrity: sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==} + hasBin: true + dependencies: + nopt: 1.0.10 + dev: false + + /ts-node@10.9.1(@types/node@20.5.7)(typescript@5.1.6): + 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': 20.5.7 + 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.1.6 + v8-compile-cache-lib: 3.0.1 + yn: 3.1.1 + dev: false + + /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: false + + /typescript@5.1.6: + resolution: {integrity: sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==} + engines: {node: '>=14.17'} + hasBin: true + + /undefsafe@2.0.5: + resolution: {integrity: sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==} + dev: false + + /url-parse@1.5.10: + resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} + dependencies: + querystringify: 2.2.0 + requires-port: 1.0.0 + dev: false + + /util@0.10.4: + resolution: {integrity: sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==} + dependencies: + inherits: 2.0.3 + dev: false + + /v8-compile-cache-lib@3.0.1: + resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} + dev: false + + /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 + dev: false + + /y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + dev: false + + /yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + dev: false + + /yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + 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 + dev: false + + /yn@3.1.1: + resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} + engines: {node: '>=6'} + dev: false diff --git a/services/stock/pnpm-lock.yaml b/services/stock/pnpm-lock.yaml new file mode 100644 index 00000000..8126a913 --- /dev/null +++ b/services/stock/pnpm-lock.yaml @@ -0,0 +1,2495 @@ +lockfileVersion: '6.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +dependencies: + '@grpc/grpc-js': + specifier: 1.8.14 + version: 1.8.14 + '@grpc/proto-loader': + specifier: 0.7.6 + version: 0.7.6 + '@prisma/client': + specifier: 4.16.2 + version: 4.16.2(prisma@4.16.2) + amqplib: + specifier: ^0.10.3 + version: 0.10.3 + dotenv: + specifier: ^16.0.3 + version: 16.0.3 + grpc-server-reflection: + specifier: ^0.1.5 + version: 0.1.5 + protobufjs: + specifier: 7.2.2 + version: 7.2.2 + +devDependencies: + '@types/amqplib': + specifier: ^0.10.1 + version: 0.10.1 + '@types/node': + specifier: 18.15.9 + version: 18.15.9 + esbuild: + specifier: ^0.17.18 + version: 0.17.18 + grpc-tools: + specifier: ^1.12.4 + version: 1.12.4 + nodemon: + specifier: ^2.0.22 + version: 2.0.22 + pkg: + specifier: ^5.8.1 + version: 5.8.1 + prisma: + specifier: 4.16.2 + version: 4.16.2 + ts-node: + specifier: 10.9.1 + version: 10.9.1(@types/node@18.15.9)(typescript@5.0.2) + tsconfig-paths: + specifier: ^4.2.0 + version: 4.2.0 + typescript: + specifier: 5.0.2 + version: 5.0.2 + vite-tsconfig-paths: + specifier: ^4.2.0 + version: 4.2.0(typescript@5.0.2) + vitest: + specifier: ^0.29.8 + version: 0.29.8 + +packages: + + /@acuminous/bitsyntax@0.1.2: + resolution: {integrity: sha512-29lUK80d1muEQqiUsSo+3A0yP6CdspgC95EnKBMi22Xlwt79i/En4Vr67+cXhU+cZjbti3TgGGC5wy1stIywVQ==} + engines: {node: '>=0.8'} + dependencies: + buffer-more-ints: 1.0.0 + debug: 4.3.4 + safe-buffer: 5.1.2 + transitivePeerDependencies: + - supports-color + dev: false + + /@babel/generator@7.18.2: + resolution: {integrity: sha512-W1lG5vUwFvfMd8HVXqdfbuG7RuaSrTCCD8cl8fP8wOivdbtbIg2Db3IWUcgvfxKbbn6ZBGYRW/Zk1MIwK49mgw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.19.0 + '@jridgewell/gen-mapping': 0.3.3 + jsesc: 2.5.2 + 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.5: + resolution: {integrity: sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/parser@7.18.4: + resolution: {integrity: sha512-FDge0dFazETFcxGw/EXzOkN8uJp0PC7Qbm+Pe9T+av2zlBpOgunFHkQPPn+eRuClU73JF+98D531UgayY89tow==} + engines: {node: '>=6.0.0'} + hasBin: true + dependencies: + '@babel/types': 7.19.0 + dev: true + + /@babel/types@7.19.0: + resolution: {integrity: sha512-YuGopBq3ke25BVSiS6fgF49Ul9gH1x70Bcr6bqRLjWCkcX8Hre1/5+z+IiWOIerRMSSEfGZVB9z9kyq7wVs9YA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-string-parser': 7.22.5 + '@babel/helper-validator-identifier': 7.22.5 + to-fast-properties: 2.0.0 + 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 + + /@esbuild/android-arm64@0.17.18: + resolution: {integrity: sha512-/iq0aK0eeHgSC3z55ucMAHO05OIqmQehiGay8eP5l/5l+iEr4EIbh4/MI8xD9qRFjqzgkc0JkX0LculNC9mXBw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-arm64@0.18.20: + resolution: {integrity: sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-arm@0.17.18: + resolution: {integrity: sha512-EmwL+vUBZJ7mhFCs5lA4ZimpUH3WMAoqvOIYhVQwdIgSpHC8ImHdsRyhHAVxpDYUSm0lWvd63z0XH1IlImS2Qw==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-arm@0.18.20: + resolution: {integrity: sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-x64@0.17.18: + resolution: {integrity: sha512-x+0efYNBF3NPW2Xc5bFOSFW7tTXdAcpfEg2nXmxegm4mJuVeS+i109m/7HMiOQ6M12aVGGFlqJX3RhNdYM2lWg==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-x64@0.18.20: + resolution: {integrity: sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-arm64@0.17.18: + resolution: {integrity: sha512-6tY+djEAdF48M1ONWnQb1C+6LiXrKjmqjzPNPWXhu/GzOHTHX2nh8Mo2ZAmBFg0kIodHhciEgUBtcYCAIjGbjQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-arm64@0.18.20: + resolution: {integrity: sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-x64@0.17.18: + resolution: {integrity: sha512-Qq84ykvLvya3dO49wVC9FFCNUfSrQJLbxhoQk/TE1r6MjHo3sFF2tlJCwMjhkBVq3/ahUisj7+EpRSz0/+8+9A==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-x64@0.18.20: + resolution: {integrity: sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-arm64@0.17.18: + resolution: {integrity: sha512-fw/ZfxfAzuHfaQeMDhbzxp9mc+mHn1Y94VDHFHjGvt2Uxl10mT4CDavHm+/L9KG441t1QdABqkVYwakMUeyLRA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-arm64@0.18.20: + resolution: {integrity: sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-x64@0.17.18: + resolution: {integrity: sha512-FQFbRtTaEi8ZBi/A6kxOC0V0E9B/97vPdYjY9NdawyLd4Qk5VD5g2pbWN2VR1c0xhzcJm74HWpObPszWC+qTew==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-x64@0.18.20: + resolution: {integrity: sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm64@0.17.18: + resolution: {integrity: sha512-R7pZvQZFOY2sxUG8P6A21eq6q+eBv7JPQYIybHVf1XkQYC+lT7nDBdC7wWKTrbvMXKRaGudp/dzZCwL/863mZQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm64@0.18.20: + resolution: {integrity: sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm@0.17.18: + resolution: {integrity: sha512-jW+UCM40LzHcouIaqv3e/oRs0JM76JfhHjCavPxMUti7VAPh8CaGSlS7cmyrdpzSk7A+8f0hiedHqr/LMnfijg==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm@0.18.20: + resolution: {integrity: sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ia32@0.17.18: + resolution: {integrity: sha512-ygIMc3I7wxgXIxk6j3V00VlABIjq260i967Cp9BNAk5pOOpIXmd1RFQJQX9Io7KRsthDrQYrtcx7QCof4o3ZoQ==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ia32@0.18.20: + resolution: {integrity: sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-loong64@0.17.18: + resolution: {integrity: sha512-bvPG+MyFs5ZlwYclCG1D744oHk1Pv7j8psF5TfYx7otCVmcJsEXgFEhQkbhNW8otDHL1a2KDINW20cfCgnzgMQ==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-loong64@0.18.20: + resolution: {integrity: sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-mips64el@0.17.18: + resolution: {integrity: sha512-oVqckATOAGuiUOa6wr8TXaVPSa+6IwVJrGidmNZS1cZVx0HqkTMkqFGD2HIx9H1RvOwFeWYdaYbdY6B89KUMxA==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-mips64el@0.18.20: + resolution: {integrity: sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ppc64@0.17.18: + resolution: {integrity: sha512-3dLlQO+b/LnQNxgH4l9rqa2/IwRJVN9u/bK63FhOPB4xqiRqlQAU0qDU3JJuf0BmaH0yytTBdoSBHrb2jqc5qQ==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ppc64@0.18.20: + resolution: {integrity: sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-riscv64@0.17.18: + resolution: {integrity: sha512-/x7leOyDPjZV3TcsdfrSI107zItVnsX1q2nho7hbbQoKnmoeUWjs+08rKKt4AUXju7+3aRZSsKrJtaRmsdL1xA==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-riscv64@0.18.20: + resolution: {integrity: sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-s390x@0.17.18: + resolution: {integrity: sha512-cX0I8Q9xQkL/6F5zWdYmVf5JSQt+ZfZD2bJudZrWD+4mnUvoZ3TDDXtDX2mUaq6upMFv9FlfIh4Gfun0tbGzuw==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-s390x@0.18.20: + resolution: {integrity: sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-x64@0.17.18: + resolution: {integrity: sha512-66RmRsPlYy4jFl0vG80GcNRdirx4nVWAzJmXkevgphP1qf4dsLQCpSKGM3DUQCojwU1hnepI63gNZdrr02wHUA==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-x64@0.18.20: + resolution: {integrity: sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/netbsd-x64@0.17.18: + resolution: {integrity: sha512-95IRY7mI2yrkLlTLb1gpDxdC5WLC5mZDi+kA9dmM5XAGxCME0F8i4bYH4jZreaJ6lIZ0B8hTrweqG1fUyW7jbg==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/netbsd-x64@0.18.20: + resolution: {integrity: sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/openbsd-x64@0.17.18: + resolution: {integrity: sha512-WevVOgcng+8hSZ4Q3BKL3n1xTv5H6Nb53cBrtzzEjDbbnOmucEVcZeGCsCOi9bAOcDYEeBZbD2SJNBxlfP3qiA==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/openbsd-x64@0.18.20: + resolution: {integrity: sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/sunos-x64@0.17.18: + resolution: {integrity: sha512-Rzf4QfQagnwhQXVBS3BYUlxmEbcV7MY+BH5vfDZekU5eYpcffHSyjU8T0xucKVuOcdCsMo+Ur5wmgQJH2GfNrg==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: true + optional: true + + /@esbuild/sunos-x64@0.18.20: + resolution: {integrity: sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-arm64@0.17.18: + resolution: {integrity: sha512-Kb3Ko/KKaWhjeAm2YoT/cNZaHaD1Yk/pa3FTsmqo9uFh1D1Rfco7BBLIPdDOozrObj2sahslFuAQGvWbgWldAg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-arm64@0.18.20: + resolution: {integrity: sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-ia32@0.17.18: + resolution: {integrity: sha512-0/xUMIdkVHwkvxfbd5+lfG7mHOf2FRrxNbPiKWg9C4fFrB8H0guClmaM3BFiRUYrznVoyxTIyC/Ou2B7QQSwmw==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-ia32@0.18.20: + resolution: {integrity: sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-x64@0.17.18: + resolution: {integrity: sha512-qU25Ma1I3NqTSHJUOKi9sAH1/Mzuvlke0ioMJRthLXKm7JiSKVwFghlGbDLOO2sARECGhja4xYfRAZNPAkooYg==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-x64@0.18.20: + resolution: {integrity: sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@grpc/grpc-js@1.8.14: + resolution: {integrity: sha512-w84maJ6CKl5aApCMzFll0hxtFNT6or9WwMslobKaqWUEf1K+zhlL43bSQhFreyYWIWR+Z0xnVFC1KtLm4ZpM/A==} + engines: {node: ^8.13.0 || >=10.10.0} + dependencies: + '@grpc/proto-loader': 0.7.6 + '@types/node': 18.15.9 + dev: false + + /@grpc/proto-loader@0.7.6: + resolution: {integrity: sha512-QyAXR8Hyh7uMDmveWxDSUcJr9NAWaZ2I6IXgAYvQmfflwouTM+rArE2eEaCtLlRqO81j7pRLCt81IefUei6Zbw==} + engines: {node: '>=6'} + hasBin: true + dependencies: + '@types/long': 4.0.2 + lodash.camelcase: 4.3.0 + long: 4.0.0 + protobufjs: 7.2.2 + yargs: 16.2.0 + dev: false + + /@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 + + /@mapbox/node-pre-gyp@1.0.11: + resolution: {integrity: sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==} + hasBin: true + dependencies: + detect-libc: 2.0.2 + https-proxy-agent: 5.0.1 + make-dir: 3.1.0 + node-fetch: 2.7.0 + nopt: 5.0.0 + npmlog: 5.0.1 + rimraf: 3.0.2 + semver: 7.5.4 + tar: 6.1.15 + transitivePeerDependencies: + - encoding + - supports-color + dev: true + + /@nodelib/fs.scandir@2.1.5: + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + dev: true + + /@nodelib/fs.stat@2.0.5: + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + dev: true + + /@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: true + + /@prisma/client@4.16.2(prisma@4.16.2): + resolution: {integrity: sha512-qCoEyxv1ZrQ4bKy39GnylE8Zq31IRmm8bNhNbZx7bF2cU5aiCCnSa93J2imF88MBjn7J9eUQneNxUQVJdl/rPQ==} + engines: {node: '>=14.17'} + requiresBuild: true + peerDependencies: + prisma: '*' + peerDependenciesMeta: + prisma: + optional: true + dependencies: + '@prisma/engines-version': 4.16.1-1.4bc8b6e1b66cb932731fb1bdbbc550d1e010de81 + prisma: 4.16.2 + dev: false + + /@prisma/engines-version@4.16.1-1.4bc8b6e1b66cb932731fb1bdbbc550d1e010de81: + resolution: {integrity: sha512-q617EUWfRIDTriWADZ4YiWRZXCa/WuhNgLTVd+HqWLffjMSPzyM5uOWoauX91wvQClSKZU4pzI4JJLQ9Kl62Qg==} + dev: false + + /@prisma/engines@4.16.2: + resolution: {integrity: sha512-vx1nxVvN4QeT/cepQce68deh/Turxy5Mr+4L4zClFuK1GlxN3+ivxfuv+ej/gvidWn1cE1uAhW7ALLNlYbRUAw==} + requiresBuild: true + + /@protobufjs/aspromise@1.1.2: + resolution: {integrity: sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==} + dev: false + + /@protobufjs/base64@1.1.2: + resolution: {integrity: sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==} + dev: false + + /@protobufjs/codegen@2.0.4: + resolution: {integrity: sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==} + dev: false + + /@protobufjs/eventemitter@1.1.0: + resolution: {integrity: sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==} + dev: false + + /@protobufjs/fetch@1.1.0: + resolution: {integrity: sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==} + dependencies: + '@protobufjs/aspromise': 1.1.2 + '@protobufjs/inquire': 1.1.0 + dev: false + + /@protobufjs/float@1.0.2: + resolution: {integrity: sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==} + dev: false + + /@protobufjs/inquire@1.1.0: + resolution: {integrity: sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==} + dev: false + + /@protobufjs/path@1.1.2: + resolution: {integrity: sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==} + dev: false + + /@protobufjs/pool@1.1.0: + resolution: {integrity: sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==} + dev: false + + /@protobufjs/utf8@1.1.0: + resolution: {integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==} + 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/amqplib@0.10.1: + resolution: {integrity: sha512-j6ANKT79ncUDnAs/+9r9eDujxbeJoTjoVu33gHHcaPfmLQaMhvfbH2GqSe8KUM444epAp1Vl3peVOQfZk3UIqA==} + dependencies: + '@types/node': 18.15.9 + dev: true + + /@types/chai-subset@1.3.3: + resolution: {integrity: sha512-frBecisrNGz+F4T6bcc+NLeolfiojh5FxW2klu669+8BARtyQv2C/GkNW6FUodVe4BroGMP/wER/YDGc7rEllw==} + dependencies: + '@types/chai': 4.3.5 + dev: true + + /@types/chai@4.3.5: + resolution: {integrity: sha512-mEo1sAde+UCE6b2hxn332f1g1E8WfYRu6p5SvTKr2ZKC1f7gFJXk4h5PyGP9Dt6gCaG8y8XhwnXWC6Iy2cmBng==} + dev: true + + /@types/long@4.0.2: + resolution: {integrity: sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==} + dev: false + + /@types/node@18.15.9: + resolution: {integrity: sha512-dUxhiNzBLr6IqlZXz6e/rN2YQXlFgOei/Dxy+e3cyXTJ4txSUbGT2/fmnD6zd/75jDMeW5bDee+YXxlFKHoV0A==} + + /@vitest/expect@0.29.8: + resolution: {integrity: sha512-xlcVXn5I5oTq6NiZSY3ykyWixBxr5mG8HYtjvpgg6KaqHm0mvhX18xuwl5YGxIRNt/A5jidd7CWcNHrSvgaQqQ==} + dependencies: + '@vitest/spy': 0.29.8 + '@vitest/utils': 0.29.8 + chai: 4.3.8 + dev: true + + /@vitest/runner@0.29.8: + resolution: {integrity: sha512-FzdhnRDwEr/A3Oo1jtIk/B952BBvP32n1ObMEb23oEJNO+qO5cBet6M2XWIDQmA7BDKGKvmhUf2naXyp/2JEwQ==} + dependencies: + '@vitest/utils': 0.29.8 + p-limit: 4.0.0 + pathe: 1.1.1 + dev: true + + /@vitest/spy@0.29.8: + resolution: {integrity: sha512-VdjBe9w34vOMl5I5mYEzNX8inTxrZ+tYUVk9jxaZJmHFwmDFC/GV3KBFTA/JKswr3XHvZL+FE/yq5EVhb6pSAw==} + dependencies: + tinyspy: 1.1.1 + dev: true + + /@vitest/utils@0.29.8: + resolution: {integrity: sha512-qGzuf3vrTbnoY+RjjVVIBYfuWMjn3UMUqyQtdGNZ6ZIIyte7B37exj6LaVkrZiUTvzSadVvO/tJm8AEgbGCBPg==} + dependencies: + cli-truncate: 3.1.0 + diff: 5.1.0 + loupe: 2.3.6 + pretty-format: 27.5.1 + dev: true + + /abbrev@1.1.1: + resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} + dev: true + + /acorn-walk@8.2.0: + resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} + engines: {node: '>=0.4.0'} + dev: true + + /acorn@8.10.0: + resolution: {integrity: sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==} + engines: {node: '>=0.4.0'} + hasBin: true + dev: true + + /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 + dev: true + + /amqplib@0.10.3: + resolution: {integrity: sha512-UHmuSa7n8vVW/a5HGh2nFPqAEr8+cD4dEZ6u9GjP91nHfr1a54RyAKyra7Sb5NH7NBKOUlyQSMXIp0qAixKexw==} + engines: {node: '>=10'} + dependencies: + '@acuminous/bitsyntax': 0.1.2 + buffer-more-ints: 1.0.0 + readable-stream: 1.1.14 + url-parse: 1.5.10 + transitivePeerDependencies: + - supports-color + dev: false + + /ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + /ansi-regex@6.0.1: + resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} + engines: {node: '>=12'} + dev: true + + /ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + dependencies: + color-convert: 2.0.1 + + /ansi-styles@5.2.0: + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} + engines: {node: '>=10'} + dev: true + + /ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + dev: true + + /anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + dev: true + + /aproba@2.0.0: + resolution: {integrity: sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==} + dev: true + + /are-we-there-yet@2.0.0: + resolution: {integrity: sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==} + engines: {node: '>=10'} + dependencies: + delegates: 1.0.0 + readable-stream: 3.6.2 + dev: true + + /arg@4.1.3: + resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} + dev: true + + /array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + dev: true + + /assertion-error@1.1.0: + resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} + dev: true + + /at-least-node@1.0.0: + resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} + engines: {node: '>= 4.0.0'} + dev: true + + /balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + dev: true + + /base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + dev: true + + /binary-extensions@2.2.0: + resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} + engines: {node: '>=8'} + dev: true + + /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: true + + /brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + dev: true + + /braces@3.0.2: + resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + engines: {node: '>=8'} + dependencies: + fill-range: 7.0.1 + dev: true + + /buffer-more-ints@1.0.0: + resolution: {integrity: sha512-EMetuGFz5SLsT0QTnXzINh4Ksr+oo4i+UGTXEshiGCQWnsgSs7ZhJ8fzlwQ+OzEMs0MpDAMr1hxnblp5a4vcHg==} + dev: false + + /buffer@5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + dev: true + + /cac@6.7.14: + resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} + engines: {node: '>=8'} + dev: true + + /chai@4.3.8: + resolution: {integrity: sha512-vX4YvVVtxlfSZ2VecZgFUTU5qPCYsobVI2O9FmwEXBhDigYGQA6jRXCycIs1yJnnWbZ6/+a2zNIF5DfVCcJBFQ==} + engines: {node: '>=4'} + dependencies: + assertion-error: 1.1.0 + check-error: 1.0.2 + deep-eql: 4.1.3 + get-func-name: 2.0.0 + loupe: 2.3.6 + pathval: 1.1.1 + type-detect: 4.0.8 + dev: true + + /chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + dev: true + + /check-error@1.0.2: + resolution: {integrity: sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==} + dev: true + + /chokidar@3.5.3: + resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} + engines: {node: '>= 8.10.0'} + dependencies: + anymatch: 3.1.3 + braces: 3.0.2 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + dev: true + + /chownr@1.1.4: + resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} + dev: true + + /chownr@2.0.0: + resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} + engines: {node: '>=10'} + dev: true + + /cli-truncate@3.1.0: + resolution: {integrity: sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + slice-ansi: 5.0.0 + string-width: 5.1.2 + dev: true + + /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 + + /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.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + /color-support@1.1.3: + resolution: {integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==} + hasBin: true + dev: true + + /concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + dev: true + + /console-control-strings@1.1.0: + resolution: {integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==} + dev: true + + /core-util-is@1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + + /create-require@1.1.1: + resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} + dev: true + + /debug@3.2.7(supports-color@5.5.0): + resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.3 + supports-color: 5.5.0 + dev: true + + /debug@4.3.4: + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.2 + + /decompress-response@6.0.0: + resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} + engines: {node: '>=10'} + dependencies: + mimic-response: 3.1.0 + dev: true + + /deep-eql@4.1.3: + resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==} + engines: {node: '>=6'} + dependencies: + type-detect: 4.0.8 + dev: true + + /deep-extend@0.6.0: + resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} + engines: {node: '>=4.0.0'} + dev: true + + /delegates@1.0.0: + resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==} + dev: true + + /detect-libc@2.0.2: + resolution: {integrity: sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==} + engines: {node: '>=8'} + dev: true + + /diff@4.0.2: + resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} + engines: {node: '>=0.3.1'} + dev: true + + /diff@5.1.0: + resolution: {integrity: sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==} + 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 + dev: true + + /dotenv@16.0.3: + resolution: {integrity: sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==} + engines: {node: '>=12'} + dev: false + + /eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + dev: true + + /emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + /emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + dev: true + + /end-of-stream@1.4.4: + resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + dependencies: + once: 1.4.0 + dev: true + + /esbuild@0.17.18: + resolution: {integrity: sha512-z1lix43jBs6UKjcZVKOw2xx69ffE2aG0PygLL5qJ9OS/gy0Ewd1gW/PUQIOIQGXBHWNywSc0floSKoMFF8aK2w==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/android-arm': 0.17.18 + '@esbuild/android-arm64': 0.17.18 + '@esbuild/android-x64': 0.17.18 + '@esbuild/darwin-arm64': 0.17.18 + '@esbuild/darwin-x64': 0.17.18 + '@esbuild/freebsd-arm64': 0.17.18 + '@esbuild/freebsd-x64': 0.17.18 + '@esbuild/linux-arm': 0.17.18 + '@esbuild/linux-arm64': 0.17.18 + '@esbuild/linux-ia32': 0.17.18 + '@esbuild/linux-loong64': 0.17.18 + '@esbuild/linux-mips64el': 0.17.18 + '@esbuild/linux-ppc64': 0.17.18 + '@esbuild/linux-riscv64': 0.17.18 + '@esbuild/linux-s390x': 0.17.18 + '@esbuild/linux-x64': 0.17.18 + '@esbuild/netbsd-x64': 0.17.18 + '@esbuild/openbsd-x64': 0.17.18 + '@esbuild/sunos-x64': 0.17.18 + '@esbuild/win32-arm64': 0.17.18 + '@esbuild/win32-ia32': 0.17.18 + '@esbuild/win32-x64': 0.17.18 + dev: true + + /esbuild@0.18.20: + resolution: {integrity: sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/android-arm': 0.18.20 + '@esbuild/android-arm64': 0.18.20 + '@esbuild/android-x64': 0.18.20 + '@esbuild/darwin-arm64': 0.18.20 + '@esbuild/darwin-x64': 0.18.20 + '@esbuild/freebsd-arm64': 0.18.20 + '@esbuild/freebsd-x64': 0.18.20 + '@esbuild/linux-arm': 0.18.20 + '@esbuild/linux-arm64': 0.18.20 + '@esbuild/linux-ia32': 0.18.20 + '@esbuild/linux-loong64': 0.18.20 + '@esbuild/linux-mips64el': 0.18.20 + '@esbuild/linux-ppc64': 0.18.20 + '@esbuild/linux-riscv64': 0.18.20 + '@esbuild/linux-s390x': 0.18.20 + '@esbuild/linux-x64': 0.18.20 + '@esbuild/netbsd-x64': 0.18.20 + '@esbuild/openbsd-x64': 0.18.20 + '@esbuild/sunos-x64': 0.18.20 + '@esbuild/win32-arm64': 0.18.20 + '@esbuild/win32-ia32': 0.18.20 + '@esbuild/win32-x64': 0.18.20 + dev: true + + /escalade@3.1.1: + resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} + engines: {node: '>=6'} + + /expand-template@2.0.3: + resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} + engines: {node: '>=6'} + dev: true + + /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: true + + /fastq@1.15.0: + resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} + dependencies: + reusify: 1.0.4 + dev: true + + /fill-range@7.0.1: + resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} + engines: {node: '>=8'} + dependencies: + to-regex-range: 5.0.1 + dev: true + + /from2@2.3.0: + resolution: {integrity: sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==} + dependencies: + inherits: 2.0.4 + readable-stream: 2.3.8 + dev: true + + /fs-constants@1.0.0: + resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} + dev: true + + /fs-extra@9.1.0: + resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==} + engines: {node: '>=10'} + dependencies: + at-least-node: 1.0.0 + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.0 + dev: true + + /fs-minipass@2.1.0: + resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} + engines: {node: '>= 8'} + dependencies: + minipass: 3.3.6 + dev: true + + /fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + dev: true + + /fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /function-bind@1.1.1: + resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} + dev: true + + /gauge@3.0.2: + resolution: {integrity: sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==} + engines: {node: '>=10'} + dependencies: + aproba: 2.0.0 + color-support: 1.1.3 + console-control-strings: 1.1.0 + has-unicode: 2.0.1 + object-assign: 4.1.1 + signal-exit: 3.0.7 + string-width: 4.2.3 + strip-ansi: 6.0.1 + wide-align: 1.1.5 + dev: true + + /get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + + /get-func-name@2.0.0: + resolution: {integrity: sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==} + dev: true + + /github-from-package@0.0.0: + resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==} + dev: true + + /glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + dependencies: + is-glob: 4.0.3 + dev: true + + /glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + dev: true + + /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 + dev: true + + /globrex@0.1.2: + resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} + dev: true + + /google-protobuf@3.21.2: + resolution: {integrity: sha512-3MSOYFO5U9mPGikIYCzK0SaThypfGgS6bHqrUGXG3DPHCrb+txNqeEcns1W0lkGfk0rCyNXm7xB9rMxnCiZOoA==} + dev: false + + /graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + dev: true + + /grpc-server-reflection@0.1.5: + resolution: {integrity: sha512-i69RYu6v65enzknNAPUgerFuVQfo+L3n9g4c1A/Sv5jUHMpxMIjSbBA+YWls9Sr4Flac4oohp4Gx8f389CaHuw==} + dependencies: + google-protobuf: 3.21.2 + dev: false + + /grpc-tools@1.12.4: + resolution: {integrity: sha512-5+mLAJJma3BjnW/KQp6JBjUMgvu7Mu3dBvBPd1dcbNIb+qiR0817zDpgPjS7gRb+l/8EVNIa3cB02xI9JLToKg==} + hasBin: true + requiresBuild: true + dependencies: + '@mapbox/node-pre-gyp': 1.0.11 + transitivePeerDependencies: + - encoding + - supports-color + dev: true + + /has-flag@3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + dev: true + + /has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + dev: true + + /has-unicode@2.0.1: + resolution: {integrity: sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==} + dev: true + + /has@1.0.3: + resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} + engines: {node: '>= 0.4.0'} + dependencies: + function-bind: 1.1.1 + dev: true + + /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 + dev: true + + /ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + dev: true + + /ignore-by-default@1.0.1: + resolution: {integrity: sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==} + dev: true + + /ignore@5.2.4: + resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} + engines: {node: '>= 4'} + dev: true + + /inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + dev: true + + /inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + /ini@1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + dev: true + + /into-stream@6.0.0: + resolution: {integrity: sha512-XHbaOAvP+uFKUFsOgoNPRjLkwB+I22JFPFe5OjTkQ0nwgj6+pSjb4NmB6VMxaPshLiOf+zcpOCBQuLwC1KHhZA==} + engines: {node: '>=10'} + dependencies: + from2: 2.3.0 + p-is-promise: 3.0.0 + dev: true + + /is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + dependencies: + binary-extensions: 2.2.0 + dev: true + + /is-core-module@2.13.0: + resolution: {integrity: sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==} + dependencies: + has: 1.0.3 + dev: true + + /is-core-module@2.9.0: + resolution: {integrity: sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==} + dependencies: + has: 1.0.3 + dev: true + + /is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + dev: true + + /is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + /is-fullwidth-code-point@4.0.0: + resolution: {integrity: sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==} + engines: {node: '>=12'} + dev: true + + /is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + dependencies: + is-extglob: 2.1.1 + dev: true + + /is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + dev: true + + /isarray@0.0.1: + resolution: {integrity: sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==} + dev: false + + /isarray@1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + dev: true + + /jsesc@2.5.2: + resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} + engines: {node: '>=4'} + hasBin: true + dev: true + + /json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + dev: true + + /jsonc-parser@3.2.0: + resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} + dev: true + + /jsonfile@6.1.0: + resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + dependencies: + universalify: 2.0.0 + optionalDependencies: + graceful-fs: 4.2.11 + dev: true + + /local-pkg@0.4.3: + resolution: {integrity: sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==} + engines: {node: '>=14'} + dev: true + + /lodash.camelcase@4.3.0: + resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} + dev: false + + /long@4.0.0: + resolution: {integrity: sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==} + dev: false + + /long@5.2.3: + resolution: {integrity: sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==} + dev: false + + /loupe@2.3.6: + resolution: {integrity: sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==} + dependencies: + get-func-name: 2.0.0 + dev: true + + /lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + dependencies: + yallist: 4.0.0 + 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 + dev: true + + /make-error@1.3.6: + resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + dev: true + + /merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + dev: true + + /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: true + + /mimic-response@3.1.0: + resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} + engines: {node: '>=10'} + dev: true + + /minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + dependencies: + brace-expansion: 1.1.11 + dev: true + + /minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + dev: true + + /minipass@3.3.6: + resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} + engines: {node: '>=8'} + dependencies: + yallist: 4.0.0 + dev: true + + /minipass@5.0.0: + resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} + engines: {node: '>=8'} + dev: true + + /minizlib@2.1.2: + resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} + engines: {node: '>= 8'} + dependencies: + minipass: 3.3.6 + yallist: 4.0.0 + dev: true + + /mkdirp-classic@0.5.3: + resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} + dev: true + + /mkdirp@1.0.4: + resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} + engines: {node: '>=10'} + hasBin: true + dev: true + + /mlly@1.4.1: + resolution: {integrity: sha512-SCDs78Q2o09jiZiE2WziwVBEqXQ02XkGdUy45cbJf+BpYRIjArXRJ1Wbowxkb+NaM9DWvS3UC9GiO/6eqvQ/pg==} + dependencies: + acorn: 8.10.0 + pathe: 1.1.1 + pkg-types: 1.0.3 + ufo: 1.3.0 + dev: true + + /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: true + + /multistream@4.1.0: + resolution: {integrity: sha512-J1XDiAmmNpRCBfIWJv+n0ymC4ABcf/Pl+5YvC5B/D2f/2+8PtHvCNxMPKiQcZyi922Hq69J2YOpb1pTywfifyw==} + dependencies: + once: 1.4.0 + readable-stream: 3.6.2 + dev: true + + /nanoid@3.3.6: + resolution: {integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + dev: true + + /napi-build-utils@1.0.2: + resolution: {integrity: sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==} + dev: true + + /node-abi@3.47.0: + resolution: {integrity: sha512-2s6B2CWZM//kPgwnuI0KrYwNjfdByE25zvAaEpq9IH4zcNsarH8Ihu/UuX6XMPEogDAxkuUFeZn60pXNHAqn3A==} + engines: {node: '>=10'} + dependencies: + semver: 7.5.4 + dev: true + + /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: true + + /nodemon@2.0.22: + resolution: {integrity: sha512-B8YqaKMmyuCO7BowF1Z1/mkPqLk6cs/l63Ojtd6otKjMx47Dq1utxfRxcavH1I7VSaL8n5BUaoutadnsX3AAVQ==} + engines: {node: '>=8.10.0'} + hasBin: true + dependencies: + chokidar: 3.5.3 + debug: 3.2.7(supports-color@5.5.0) + ignore-by-default: 1.0.1 + minimatch: 3.1.2 + pstree.remy: 1.1.8 + semver: 5.7.2 + simple-update-notifier: 1.1.0 + supports-color: 5.5.0 + touch: 3.1.0 + undefsafe: 2.0.5 + dev: true + + /nopt@1.0.10: + resolution: {integrity: sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==} + hasBin: true + dependencies: + abbrev: 1.1.1 + dev: true + + /nopt@5.0.0: + resolution: {integrity: sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==} + engines: {node: '>=6'} + hasBin: true + dependencies: + abbrev: 1.1.1 + dev: true + + /normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + dev: true + + /npmlog@5.0.1: + resolution: {integrity: sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==} + dependencies: + are-we-there-yet: 2.0.0 + console-control-strings: 1.1.0 + gauge: 3.0.2 + set-blocking: 2.0.0 + dev: true + + /object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + dev: true + + /once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + dependencies: + wrappy: 1.0.2 + dev: true + + /p-is-promise@3.0.0: + resolution: {integrity: sha512-Wo8VsW4IRQSKVXsJCn7TomUaVtyfjVDn3nUP7kE967BQk0CwFpdbZs0X0uk5sW9mkBa9eNM7hCMaG93WUAwxYQ==} + engines: {node: '>=8'} + dev: true + + /p-limit@4.0.0: + resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + yocto-queue: 1.0.0 + dev: true + + /path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + dev: true + + /path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + dev: true + + /path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + dev: true + + /pathe@1.1.1: + resolution: {integrity: sha512-d+RQGp0MAYTIaDBIMmOfMwz3E+LOZnxx1HZd5R18mmCZY0QBlK0LDZfPc8FW8Ed2DlvsuE6PRjroDY+wg4+j/Q==} + dev: true + + /pathval@1.1.1: + resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} + dev: true + + /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'} + dev: true + + /pkg-fetch@3.4.2: + resolution: {integrity: sha512-0+uijmzYcnhC0hStDjm/cl2VYdrmVVBpe7Q8k9YBojxmR5tG8mvR9/nooQq3QSXiQqORDVOTY3XqMEqJVIzkHA==} + hasBin: true + dependencies: + chalk: 4.1.2 + fs-extra: 9.1.0 + https-proxy-agent: 5.0.1 + node-fetch: 2.7.0 + progress: 2.0.3 + semver: 7.5.4 + tar-fs: 2.1.1 + yargs: 16.2.0 + transitivePeerDependencies: + - encoding + - supports-color + dev: true + + /pkg-types@1.0.3: + resolution: {integrity: sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==} + dependencies: + jsonc-parser: 3.2.0 + mlly: 1.4.1 + pathe: 1.1.1 + dev: true + + /pkg@5.8.1: + resolution: {integrity: sha512-CjBWtFStCfIiT4Bde9QpJy0KeH19jCfwZRJqHFDFXfhUklCx8JoFmMj3wgnEYIwGmZVNkhsStPHEOnrtrQhEXA==} + hasBin: true + peerDependencies: + node-notifier: '>=9.0.1' + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@babel/generator': 7.18.2 + '@babel/parser': 7.18.4 + '@babel/types': 7.19.0 + chalk: 4.1.2 + fs-extra: 9.1.0 + globby: 11.1.0 + into-stream: 6.0.0 + is-core-module: 2.9.0 + minimist: 1.2.8 + multistream: 4.1.0 + pkg-fetch: 3.4.2 + prebuild-install: 7.1.1 + resolve: 1.22.4 + stream-meter: 1.0.4 + transitivePeerDependencies: + - encoding + - supports-color + dev: true + + /postcss@8.4.28: + resolution: {integrity: sha512-Z7V5j0cq8oEKyejIKfpD8b4eBy9cwW2JWPk0+fB1HOAMsfHbnAXLLS+PfVWlzMSLQaWttKDt607I0XHmpE67Vw==} + engines: {node: ^10 || ^12 || >=14} + dependencies: + nanoid: 3.3.6 + picocolors: 1.0.0 + source-map-js: 1.0.2 + dev: true + + /prebuild-install@7.1.1: + resolution: {integrity: sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==} + engines: {node: '>=10'} + hasBin: true + dependencies: + detect-libc: 2.0.2 + expand-template: 2.0.3 + github-from-package: 0.0.0 + minimist: 1.2.8 + mkdirp-classic: 0.5.3 + napi-build-utils: 1.0.2 + node-abi: 3.47.0 + pump: 3.0.0 + rc: 1.2.8 + simple-get: 4.0.1 + tar-fs: 2.1.1 + tunnel-agent: 0.6.0 + dev: true + + /pretty-format@27.5.1: + resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + ansi-regex: 5.0.1 + ansi-styles: 5.2.0 + react-is: 17.0.2 + dev: true + + /prisma@4.16.2: + resolution: {integrity: sha512-SYCsBvDf0/7XSJyf2cHTLjLeTLVXYfqp7pG5eEVafFLeT0u/hLFz/9W196nDRGUOo1JfPatAEb+uEnTQImQC1g==} + engines: {node: '>=14.17'} + hasBin: true + requiresBuild: true + dependencies: + '@prisma/engines': 4.16.2 + + /process-nextick-args@2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + dev: true + + /progress@2.0.3: + resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} + engines: {node: '>=0.4.0'} + dev: true + + /protobufjs@7.2.2: + resolution: {integrity: sha512-++PrQIjrom+bFDPpfmqXfAGSQs40116JRrqqyf53dymUMvvb5d/LMRyicRoF1AUKoXVS1/IgJXlEgcpr4gTF3Q==} + engines: {node: '>=12.0.0'} + requiresBuild: true + dependencies: + '@protobufjs/aspromise': 1.1.2 + '@protobufjs/base64': 1.1.2 + '@protobufjs/codegen': 2.0.4 + '@protobufjs/eventemitter': 1.1.0 + '@protobufjs/fetch': 1.1.0 + '@protobufjs/float': 1.0.2 + '@protobufjs/inquire': 1.1.0 + '@protobufjs/path': 1.1.2 + '@protobufjs/pool': 1.1.0 + '@protobufjs/utf8': 1.1.0 + '@types/node': 18.15.9 + long: 5.2.3 + dev: false + + /pstree.remy@1.1.8: + resolution: {integrity: sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==} + dev: true + + /pump@3.0.0: + resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} + dependencies: + end-of-stream: 1.4.4 + once: 1.4.0 + dev: true + + /querystringify@2.2.0: + resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} + dev: false + + /queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + dev: true + + /rc@1.2.8: + resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} + hasBin: true + dependencies: + deep-extend: 0.6.0 + ini: 1.3.8 + minimist: 1.2.8 + strip-json-comments: 2.0.1 + dev: true + + /react-is@17.0.2: + resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} + dev: true + + /readable-stream@1.1.14: + resolution: {integrity: sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==} + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 0.0.1 + string_decoder: 0.10.31 + dev: false + + /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: true + + /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: true + + /readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + dependencies: + picomatch: 2.3.1 + dev: true + + /require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + + /requires-port@1.0.0: + resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} + dev: false + + /resolve@1.22.4: + resolution: {integrity: sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==} + hasBin: true + dependencies: + is-core-module: 2.13.0 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + dev: true + + /reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + dev: true + + /rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + hasBin: true + dependencies: + glob: 7.2.3 + dev: true + + /rollup@3.28.1: + resolution: {integrity: sha512-R9OMQmIHJm9znrU3m3cpE8uhN0fGdXiawME7aZIpQqvpS/85+Vt1Hq1/yVIcYfOmaQiHjvXkQAoJukvLpau6Yw==} + engines: {node: '>=14.18.0', npm: '>=8.0.0'} + hasBin: true + optionalDependencies: + fsevents: 2.3.3 + dev: true + + /run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + dependencies: + queue-microtask: 1.2.3 + dev: true + + /safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + + /safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + dev: true + + /semver@5.7.2: + resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} + hasBin: true + dev: true + + /semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + dev: true + + /semver@7.0.0: + resolution: {integrity: sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==} + hasBin: true + dev: 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 + dev: true + + /set-blocking@2.0.0: + resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} + 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==} + dev: true + + /simple-concat@1.0.1: + resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} + dev: true + + /simple-get@4.0.1: + resolution: {integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==} + dependencies: + decompress-response: 6.0.0 + once: 1.4.0 + simple-concat: 1.0.1 + dev: true + + /simple-update-notifier@1.1.0: + resolution: {integrity: sha512-VpsrsJSUcJEseSbMHkrsrAVSdvVS5I96Qo1QAQ4FxQ9wXFcB+pjj7FB7/us9+GcgfW4ziHtYMc1J0PLczb55mg==} + engines: {node: '>=8.10.0'} + dependencies: + semver: 7.0.0 + dev: true + + /slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + dev: true + + /slice-ansi@5.0.0: + resolution: {integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==} + engines: {node: '>=12'} + dependencies: + ansi-styles: 6.2.1 + is-fullwidth-code-point: 4.0.0 + dev: true + + /source-map-js@1.0.2: + resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} + engines: {node: '>=0.10.0'} + dev: true + + /source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + dev: true + + /stackback@0.0.2: + resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + dev: true + + /std-env@3.4.3: + resolution: {integrity: sha512-f9aPhy8fYBuMN+sNfakZV18U39PbalgjXG3lLB9WkaYTxijru61wb57V9wxxNthXM5Sd88ETBWi29qLAsHO52Q==} + dev: true + + /stream-meter@1.0.4: + resolution: {integrity: sha512-4sOEtrbgFotXwnEuzzsQBYEV1elAeFSO8rSGeTwabuX1RRn/kEq9JVH7I0MRBhKVRR0sJkr0M0QCH7yOLf9fhQ==} + dependencies: + readable-stream: 2.3.8 + 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 + dev: true + + /string_decoder@0.10.31: + resolution: {integrity: sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==} + dev: false + + /string_decoder@1.1.1: + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + dependencies: + safe-buffer: 5.1.2 + dev: true + + /string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + dependencies: + safe-buffer: 5.2.1 + dev: true + + /strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + dependencies: + ansi-regex: 5.0.1 + + /strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} + dependencies: + ansi-regex: 6.0.1 + dev: true + + /strip-bom@3.0.0: + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} + dev: true + + /strip-json-comments@2.0.1: + resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} + engines: {node: '>=0.10.0'} + dev: true + + /strip-literal@1.3.0: + resolution: {integrity: sha512-PugKzOsyXpArk0yWmUwqOZecSO0GH0bPoctLcqNDH9J04pVW3lflYE0ujElBGTloevcxF5MofAOZ7C5l2b+wLg==} + dependencies: + acorn: 8.10.0 + dev: true + + /supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + dependencies: + has-flag: 3.0.0 + dev: true + + /supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + dependencies: + has-flag: 4.0.0 + dev: true + + /supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + dev: true + + /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: true + + /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: true + + /tar@6.1.15: + resolution: {integrity: sha512-/zKt9UyngnxIT/EAGYuxaMYgOIJiP81ab9ZfkILq4oNLPFX50qyYmu7jRj9qeXoxmJHjGlbH0+cm2uy1WCs10A==} + engines: {node: '>=10'} + dependencies: + chownr: 2.0.0 + fs-minipass: 2.1.0 + minipass: 5.0.0 + minizlib: 2.1.2 + mkdirp: 1.0.4 + yallist: 4.0.0 + dev: true + + /tinybench@2.5.0: + resolution: {integrity: sha512-kRwSG8Zx4tjF9ZiyH4bhaebu+EDz1BOx9hOigYHlUW4xxI/wKIUQUqo018UlU4ar6ATPBsaMrdbKZ+tmPdohFA==} + dev: true + + /tinypool@0.4.0: + resolution: {integrity: sha512-2ksntHOKf893wSAH4z/+JbPpi92esw8Gn9N2deXX+B0EO92hexAVI9GIZZPx7P5aYo5KULfeOSt3kMOmSOy6uA==} + engines: {node: '>=14.0.0'} + dev: true + + /tinyspy@1.1.1: + resolution: {integrity: sha512-UVq5AXt/gQlti7oxoIg5oi/9r0WpF7DGEVwXgqWSMmyN16+e3tl5lIvTaOpJ3TAtu5xFzWccFRM4R5NaWHF+4g==} + engines: {node: '>=14.0.0'} + 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 + dev: true + + /touch@3.1.0: + resolution: {integrity: sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==} + hasBin: true + dependencies: + nopt: 1.0.10 + dev: true + + /tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + dev: true + + /ts-node@10.9.1(@types/node@18.15.9)(typescript@5.0.2): + 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.15.9 + 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.0.2 + v8-compile-cache-lib: 3.0.1 + yn: 3.1.1 + dev: true + + /tsconfck@2.1.2(typescript@5.0.2): + resolution: {integrity: sha512-ghqN1b0puy3MhhviwO2kGF8SeMDNhEbnKxjK7h6+fvY9JAxqvXi8y5NAHSQv687OVboS2uZIByzGd45/YxrRHg==} + engines: {node: ^14.13.1 || ^16 || >=18} + hasBin: true + peerDependencies: + typescript: ^4.3.5 || ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + dependencies: + typescript: 5.0.2 + 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 + + /tunnel-agent@0.6.0: + resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} + dependencies: + safe-buffer: 5.2.1 + dev: true + + /type-detect@4.0.8: + resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} + engines: {node: '>=4'} + dev: true + + /typescript@5.0.2: + resolution: {integrity: sha512-wVORMBGO/FAs/++blGNeAVdbNKtIh1rbBL2EyQ1+J9lClJ93KiiKe8PmFIVdXhHcyv44SL9oglmfeSsndo0jRw==} + engines: {node: '>=12.20'} + hasBin: true + dev: true + + /ufo@1.3.0: + resolution: {integrity: sha512-bRn3CsoojyNStCZe0BG0Mt4Nr/4KF+rhFlnNXybgqt5pXHNFRlqinSoQaTrGyzE4X8aHplSb+TorH+COin9Yxw==} + dev: true + + /undefsafe@2.0.5: + resolution: {integrity: sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==} + dev: true + + /universalify@2.0.0: + resolution: {integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==} + engines: {node: '>= 10.0.0'} + dev: true + + /url-parse@1.5.10: + resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} + dependencies: + querystringify: 2.2.0 + requires-port: 1.0.0 + dev: false + + /util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + dev: true + + /v8-compile-cache-lib@3.0.1: + resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} + dev: true + + /vite-node@0.29.8(@types/node@18.15.9): + resolution: {integrity: sha512-b6OtCXfk65L6SElVM20q5G546yu10/kNrhg08afEoWlFRJXFq9/6glsvSVY+aI6YeC1tu2TtAqI2jHEQmOmsFw==} + engines: {node: '>=v14.16.0'} + hasBin: true + dependencies: + cac: 6.7.14 + debug: 4.3.4 + mlly: 1.4.1 + pathe: 1.1.1 + picocolors: 1.0.0 + vite: 4.4.9(@types/node@18.15.9) + transitivePeerDependencies: + - '@types/node' + - less + - lightningcss + - sass + - stylus + - sugarss + - supports-color + - terser + dev: true + + /vite-tsconfig-paths@4.2.0(typescript@5.0.2): + resolution: {integrity: sha512-jGpus0eUy5qbbMVGiTxCL1iB9ZGN6Bd37VGLJU39kTDD6ZfULTTb1bcc5IeTWqWJKiWV5YihCaibeASPiGi8kw==} + peerDependencies: + vite: '*' + peerDependenciesMeta: + vite: + optional: true + dependencies: + debug: 4.3.4 + globrex: 0.1.2 + tsconfck: 2.1.2(typescript@5.0.2) + transitivePeerDependencies: + - supports-color + - typescript + dev: true + + /vite@4.4.9(@types/node@18.15.9): + resolution: {integrity: sha512-2mbUn2LlUmNASWwSCNSJ/EG2HuSRTnVNaydp6vMCm5VIqJsjMfbIWtbH2kDuwUVW5mMUKKZvGPX/rqeqVvv1XA==} + engines: {node: ^14.18.0 || >=16.0.0} + hasBin: true + peerDependencies: + '@types/node': '>= 14' + less: '*' + lightningcss: ^1.21.0 + sass: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + dependencies: + '@types/node': 18.15.9 + esbuild: 0.18.20 + postcss: 8.4.28 + rollup: 3.28.1 + optionalDependencies: + fsevents: 2.3.3 + dev: true + + /vitest@0.29.8: + resolution: {integrity: sha512-JIAVi2GK5cvA6awGpH0HvH/gEG9PZ0a/WoxdiV3PmqK+3CjQMf8c+J/Vhv4mdZ2nRyXFw66sAg6qz7VNkaHfDQ==} + engines: {node: '>=v14.16.0'} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@vitest/browser': '*' + '@vitest/ui': '*' + happy-dom: '*' + jsdom: '*' + playwright: '*' + safaridriver: '*' + webdriverio: '*' + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@vitest/browser': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true + playwright: + optional: true + safaridriver: + optional: true + webdriverio: + optional: true + dependencies: + '@types/chai': 4.3.5 + '@types/chai-subset': 1.3.3 + '@types/node': 18.15.9 + '@vitest/expect': 0.29.8 + '@vitest/runner': 0.29.8 + '@vitest/spy': 0.29.8 + '@vitest/utils': 0.29.8 + acorn: 8.10.0 + acorn-walk: 8.2.0 + cac: 6.7.14 + chai: 4.3.8 + debug: 4.3.4 + local-pkg: 0.4.3 + pathe: 1.1.1 + picocolors: 1.0.0 + source-map: 0.6.1 + std-env: 3.4.3 + strip-literal: 1.3.0 + tinybench: 2.5.0 + tinypool: 0.4.0 + tinyspy: 1.1.1 + vite: 4.4.9(@types/node@18.15.9) + vite-node: 0.29.8(@types/node@18.15.9) + why-is-node-running: 2.2.2 + transitivePeerDependencies: + - less + - lightningcss + - sass + - stylus + - sugarss + - supports-color + - terser + dev: true + + /webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + dev: true + + /whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + 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 + + /wide-align@1.1.5: + resolution: {integrity: sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==} + dependencies: + string-width: 4.2.3 + 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 + + /wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + dev: true + + /y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + + /yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + dev: true + + /yargs-parser@20.2.9: + resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} + engines: {node: '>=10'} + + /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 + + /yn@3.1.1: + resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} + engines: {node: '>=6'} + dev: true + + /yocto-queue@1.0.0: + resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} + engines: {node: '>=12.20'} + dev: true From 70875fe3a6f148ee06aa9abb1e23d6070bba909e Mon Sep 17 00:00:00 2001 From: Florian LEROUX Date: Mon, 28 Aug 2023 11:09:25 +0200 Subject: [PATCH 516/883] feat(swagger): add swagger --- .../src/lib/swagger/swagger-output.json | 75 ++++++++++++++++++- 1 file changed, 71 insertions(+), 4 deletions(-) diff --git a/services/gateway/src/lib/swagger/swagger-output.json b/services/gateway/src/lib/swagger/swagger-output.json index 557f47a0..d4d946ba 100644 --- a/services/gateway/src/lib/swagger/swagger-output.json +++ b/services/gateway/src/lib/swagger/swagger-output.json @@ -750,10 +750,6 @@ "schema": { "type": "object", "properties": { - "userId": { - "type": "string", - "example": "Id" - }, "name": { "type": "string", "example": "John" @@ -768,12 +764,24 @@ } } } + }, + { + "name": "authorization", + "in": "header", + "required": true, + "type": "string" } ], "responses": { "200": { "description": "OK" }, + "400": { + "description": "Bad Request" + }, + "401": { + "description": "Unauthorized" + }, "500": { "description": "Internal Server Error" } @@ -1798,6 +1806,16 @@ "phone": { "type": "string", "example": "restaurant-phone" + }, + "userIds": { + "type": "array", + "example": [ + "user-id-1", + "user-id-2" + ], + "items": { + "type": "string" + } } } } @@ -1910,6 +1928,16 @@ "phone": { "type": "string", "example": "restaurant-phone" + }, + "userIds": { + "type": "array", + "example": [ + "user-id-1", + "user-id-2" + ], + "items": { + "type": "string" + } } } } @@ -3559,6 +3587,9 @@ "200": { "description": "OK" }, + "401": { + "description": "Unauthorized" + }, "500": { "description": "Internal Server Error" } @@ -3631,6 +3662,9 @@ "200": { "description": "OK" }, + "401": { + "description": "Unauthorized" + }, "500": { "description": "Internal Server Error" } @@ -3659,6 +3693,9 @@ "200": { "description": "OK" }, + "401": { + "description": "Unauthorized" + }, "500": { "description": "Internal Server Error" } @@ -3689,6 +3726,9 @@ "200": { "description": "OK" }, + "401": { + "description": "Unauthorized" + }, "500": { "description": "Internal Server Error" } @@ -3787,6 +3827,9 @@ "201": { "description": "Created" }, + "401": { + "description": "Unauthorized" + }, "500": { "description": "Internal Server Error" } @@ -3817,6 +3860,9 @@ "200": { "description": "OK" }, + "401": { + "description": "Unauthorized" + }, "500": { "description": "Internal Server Error" } @@ -3867,6 +3913,9 @@ "200": { "description": "OK" }, + "401": { + "description": "Unauthorized" + }, "500": { "description": "Internal Server Error" } @@ -3895,6 +3944,9 @@ "200": { "description": "OK" }, + "401": { + "description": "Unauthorized" + }, "500": { "description": "Internal Server Error" } @@ -3912,6 +3964,12 @@ "name": "id", "in": "path", "required": true, + "type": "integer" + }, + { + "name": "authorization", + "in": "header", + "required": true, "type": "string" } ], @@ -3919,6 +3977,9 @@ "200": { "description": "OK" }, + "401": { + "description": "Unauthorized" + }, "500": { "description": "Internal Server Error" } @@ -3979,6 +4040,9 @@ "200": { "description": "OK" }, + "401": { + "description": "Unauthorized" + }, "500": { "description": "Internal Server Error" } @@ -4025,6 +4089,9 @@ "201": { "description": "Created" }, + "401": { + "description": "Unauthorized" + }, "500": { "description": "Internal Server Error" } From 6436ecc6d83b4924ddcfd5769a945a4df66f5776 Mon Sep 17 00:00:00 2001 From: Florian LEROUX Date: Mon, 28 Aug 2023 13:29:24 +0200 Subject: [PATCH 517/883] fix(gateway/delivery): change order of handlers --- .../delivery/deliveryPerson.controller.ts | 34 +++++++++---------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/services/gateway/src/controller/delivery/deliveryPerson.controller.ts b/services/gateway/src/controller/delivery/deliveryPerson.controller.ts index d93540b9..55fef42f 100644 --- a/services/gateway/src/controller/delivery/deliveryPerson.controller.ts +++ b/services/gateway/src/controller/delivery/deliveryPerson.controller.ts @@ -7,23 +7,6 @@ import { withCheck } from "@gateway/middleware/auth"; export const deliveryPersonRoutes = Router(); -deliveryPersonRoutes.get("/api/delivery-person/:id", async (req, res) => { - // Auth check and :id check --- - const { authorization } = req.headers; - if (!authorization) return res.status(401).json({ message: "Unauthorized" }); - const token = authorization.split("Bearer ")[1]; - const userId = await getUserIdFromToken(token); - if (!userId) return res.status(401).json({ message: "Unauthorized" }); - // ---------------------------- - - const { id } = req.params; - - deliveryPersonServiceClient.getDeliveryPerson(new DeliveryPersonId().setId(id), (error, response) => { - if (error) return res.status(500).send({ error }); - else return res.status(200).json(response.toObject()); - }); -}); - deliveryPersonRoutes.get("/api/delivery-person", withCheck({ role: "ADMIN" }), async (_, res) => { /* #swagger.parameters['authorization'] = { in: 'header', @@ -64,6 +47,23 @@ deliveryPersonRoutes.get("/api/delivery-person/near", async (req, res) => { }); }); +deliveryPersonRoutes.get("/api/delivery-person/:id", async (req, res) => { + // Auth check and :id check --- + const { authorization } = req.headers; + if (!authorization) return res.status(401).json({ message: "Unauthorized" }); + const token = authorization.split("Bearer ")[1]; + const userId = await getUserIdFromToken(token); + if (!userId) return res.status(401).json({ message: "Unauthorized" }); + // ---------------------------- + + const { id } = req.params; + + deliveryPersonServiceClient.getDeliveryPerson(new DeliveryPersonId().setId(id), (error, response) => { + if (error) return res.status(500).send({ error }); + else return res.status(200).json(response.toObject()); + }); +}); + deliveryPersonRoutes.post("/api/delivery-person", withCheck({ role: "ADMIN" }), async (req, res) => { /* #swagger.parameters['body'] = { in: 'body', From 5cb0cc615e12a0d541956d54284c2371cb098110 Mon Sep 17 00:00:00 2001 From: Pierre Lebigre Date: Mon, 28 Aug 2023 13:34:42 +0200 Subject: [PATCH 518/883] Update post image --- .../gateway/src/controller/product/product.controller.ts | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/services/gateway/src/controller/product/product.controller.ts b/services/gateway/src/controller/product/product.controller.ts index 31632ddc..5e7f3835 100644 --- a/services/gateway/src/controller/product/product.controller.ts +++ b/services/gateway/src/controller/product/product.controller.ts @@ -213,7 +213,8 @@ productRoutes.post( in: 'body', required: true, schema: { - input_file: Buffer + name: 'string', + input_file: 'string'' } } #swagger.parameters['authorization'] = { @@ -221,11 +222,11 @@ productRoutes.post( required: true, type: 'string' } */ - const { input_file } = req.body; + const { name, input_file } = req.body; const bitmap = fs.readFileSync(input_file); const base64File = new Buffer(bitmap).toString("base64"); - const file = new File().setName(input_file).setData(base64File); + const file = new File().setName(name).setData(base64File); productServiceClient.uploadImage(file, (error, response) => { if (error) return res.status(500).send({ error }); else return res.status(200).json(response.toObject()); From e734bc196f5b4073eeca6c4feaec2ea1abe64ac7 Mon Sep 17 00:00:00 2001 From: anatole Date: Mon, 28 Aug 2023 14:13:55 +0200 Subject: [PATCH 519/883] feat(gateway): add post order tmp route --- .../src/controller/order/order.controller.ts | 88 +++++++++++++------ 1 file changed, 61 insertions(+), 27 deletions(-) diff --git a/services/gateway/src/controller/order/order.controller.ts b/services/gateway/src/controller/order/order.controller.ts index 82e6cc8c..c3db0169 100644 --- a/services/gateway/src/controller/order/order.controller.ts +++ b/services/gateway/src/controller/order/order.controller.ts @@ -16,8 +16,12 @@ import { } from "@gateway/proto/order_pb"; import { getUser, getUserIdFromToken } from "@gateway/services/user.service"; import { User } from "@gateway/proto/user_pb"; -import { getBasketByUser } from "@gateway/services/basket.service"; +import {getBasketByUser, resetBasketByUser} from "@gateway/services/basket.service"; import { check, withCheck } from "@gateway/middleware/auth"; +import {Restaurant, RestaurantId} from "@gateway/proto/restaurant_pb"; +import {restaurantServiceClient} from "@gateway/services/clients/restaurant.client"; +import {createDelivery} from "@gateway/services/delivery.service"; +import {Delivery} from "@gateway/proto/delivery_pb"; export const orderRoutes = Router(); @@ -64,15 +68,13 @@ orderRoutes.get("/api/order/:id", async (req: Request, res: Response) => { }); //TODO: to test this route with the user and basket service -orderRoutes.post("/api/order", async (req: Request, res: Response) => { +orderRoutes.post("/api/order/tmp", async (req: Request, res: Response) => { /* #swagger.parameters['body'] = { in: 'body', required: true, schema: { paymentId: "payment_id:1", - deliveryId: "delivery_id:1", deliveryType :{'$ref': '#/definitions/DeliveryType'}, - restaurantId :"restaurant_id:1" } } #swagger.parameters['authorization'] = { @@ -89,7 +91,7 @@ orderRoutes.post("/api/order", async (req: Request, res: Response) => { if (!userId) return res.status(401).json({ message: "Unauthorized" }); // ---------------------------- - const { paymentId, deliveryId, deliveryType, restaurantId } = req.body; + const { paymentId, deliveryType } = req.body; let user: User | undefined = undefined; try { user = await getUser(userId); @@ -98,18 +100,33 @@ orderRoutes.post("/api/order", async (req: Request, res: Response) => { } if (!user) return res.status(404).send({ error: "User not found" }); - + const userToObj = user.toObject(); const miniUser = new UserMinimum() - .setId(String(user.getId())) - .setEmail(user.getEmail()) - .setFirstName(user.getFirstName()) - .setLastName(user.getLastName()) - .setPhone(user.getPhone()); + .setId(String(userToObj.id)) + .setEmail(userToObj.email) + .setFirstName(userToObj.firstName) + .setLastName(userToObj.lastName) + .setPhone(userToObj.phone); let orderBasket: BasketSnapshot | undefined = undefined; + let restaurantId = ""; try { const basket = (await getBasketByUser(userId.toString()))?.toObject(); - if (basket) orderBasket = new BasketSnapshot().setString(JSON.stringify(basket)); + if (basket) { + orderBasket = new BasketSnapshot().setString(JSON.stringify(basket)); + restaurantId = basket.restaurantId; + } else { + return res.status(404).send({ error: "Basket not found" }); + } + } catch (error) { + return res.status(500).send({ error }); + } + + let delivery: Delivery | undefined = undefined; + try { + const userAddress = `${userToObj.mainaddress?.street} ${userToObj.mainaddress?.zipcode} ${userToObj.mainaddress?.country}`; + delivery = await createDelivery(userAddress, deliveryType, userId, restaurantId); + if (!delivery?.getId()) throw delivery; } catch (error) { return res.status(500).send({ error }); } @@ -117,15 +134,22 @@ orderRoutes.post("/api/order", async (req: Request, res: Response) => { const orderInput = new CreateOrderRequest() .setUser(miniUser) .setPaymentId(paymentId) - .setDeliveryId(deliveryId) + .setDeliveryId(delivery.getId()) .setDeliveryType(deliveryType) .setBasketSnapshot(orderBasket) .setRestaurantId(restaurantId); - - orderService.createOrder(orderInput, (error, response) => { - if (error) return res.status(500).send({ error }); - else return res.status(200).json(response.toObject()); - }); + try { + const order: Order.AsObject = await new Promise((resolve, reject) => { + orderService.createOrder(orderInput, (error, response) => { + if (error) reject(error); + else resolve(response.toObject()); + }); + }); + await resetBasketByUser(userId.toString()); + return res.status(200).json(order); + } catch (error) { + return res.status(500).send({ error }); + } }); orderRoutes.get("/api/order/by-user/:userId", async (req: Request, res: Response) => { @@ -149,7 +173,7 @@ orderRoutes.get("/api/order/by-user/:userId", async (req: Request, res: Response const orderInput = new GetOrdersByUserRequest().setId(userId); orderService.getOrdersByUser(orderInput, (error, response) => { if (error) return res.status(500).send({ error }); - else return res.status(200).json(response.toObject()); + else return res.status(201).json(response.toObject()); }); }); @@ -227,7 +251,7 @@ orderRoutes.get("/api/order/by-payment/:paymentId", async (req: Request, res: Re }); }); -orderRoutes.put("/api/order/:orderId", withCheck({ role: "ADMIN" }), (req: Request, res: Response) => { +orderRoutes.put("/api/order/:id", withCheck({ role: "ADMIN" }), (req: Request, res: Response) => { /* #swagger.parameters['body'] = { in: 'body', required: true, @@ -242,11 +266,16 @@ orderRoutes.put("/api/order/:orderId", withCheck({ role: "ADMIN" }), (req: Reque in: 'header', required: true, type: 'string' - }*/ - const { orderId } = req.params; + } + #swagger.parameters['id'] = { + in: 'path', + required: true, + type: 'string' + } */ + const { id } = req.params; const { status, deliveryId, paymentId, restaurantId } = req.body; const orderInput = new UpdateOrderRequest() - .setId(orderId) + .setId(id) .setStatus(status) .setDeliveryId(deliveryId) .setPaymentId(paymentId) @@ -257,14 +286,19 @@ orderRoutes.put("/api/order/:orderId", withCheck({ role: "ADMIN" }), (req: Reque }); }); -orderRoutes.delete("/api/order/:orderId", withCheck({ role: "ADMIN" }), (req: Request, res: Response) => { +orderRoutes.delete("/api/order/:id", withCheck({ role: "ADMIN" }), (req: Request, res: Response) => { /* #swagger.parameters['authorization'] = { ) in: 'header', required: true, type: 'string' - }*/ - const { orderId } = req.params; - const orderInput = new DeleteOrderRequest().setId(orderId); + } + #swagger.parameters['id'] = { + in: 'path', + required: true, + type: 'string' + } */ + const { id } = req.params; + const orderInput = new DeleteOrderRequest().setId(id); orderService.deleteOrder(orderInput, (error, response) => { if (error) return res.status(500).send({ error }); else return res.status(200).json(response.toObject()); From a6f12a0203e494489b3df27e0108e4af67ba87ae Mon Sep 17 00:00:00 2001 From: anatole Date: Mon, 28 Aug 2023 14:14:55 +0200 Subject: [PATCH 520/883] feat(gateway): add post order route --- .../src/controller/order/order.controller.ts | 64 +++++++++++++++++++ 1 file changed, 64 insertions(+) diff --git a/services/gateway/src/controller/order/order.controller.ts b/services/gateway/src/controller/order/order.controller.ts index c3db0169..984ac688 100644 --- a/services/gateway/src/controller/order/order.controller.ts +++ b/services/gateway/src/controller/order/order.controller.ts @@ -67,6 +67,70 @@ orderRoutes.get("/api/order/:id", async (req: Request, res: Response) => { } }); +orderRoutes.post("/api/order", async (req: Request, res: Response) => { + /* #swagger.parameters['body'] = { + in: 'body', + required: true, + schema: { + paymentId: "payment_id:1", + deliveryId: "delivery_id:1", + deliveryType :{'$ref': '#/definitions/DeliveryType'}, + restaurantId :"restaurant_id:1" + } + } + #swagger.parameters['authorization'] = { + in: 'header', + required: true, + type: 'string' + } */ + + // Auth check and :id check --- + const { authorization } = req.headers; + if (!authorization) return res.status(401).json({ message: "Unauthorized" }); + const token = authorization.split("Bearer ")[1]; + const userId = await getUserIdFromToken(token); + if (!userId) return res.status(401).json({ message: "Unauthorized" }); + // ---------------------------- + + const { paymentId, deliveryId, deliveryType, restaurantId } = req.body; + let user: User | undefined = undefined; + try { + user = await getUser(userId); + } catch (error) { + return res.status(500).send({ error }); + } + + if (!user) return res.status(404).send({ error: "User not found" }); + + const miniUser = new UserMinimum() + .setId(String(user.getId())) + .setEmail(user.getEmail()) + .setFirstName(user.getFirstName()) + .setLastName(user.getLastName()) + .setPhone(user.getPhone()); + + let orderBasket: BasketSnapshot | undefined = undefined; + try { + const basket = (await getBasketByUser(userId.toString()))?.toObject(); + if (basket) orderBasket = new BasketSnapshot().setString(JSON.stringify(basket)); + } catch (error) { + return res.status(500).send({ error }); + } + + const orderInput = new CreateOrderRequest() + .setUser(miniUser) + .setPaymentId(paymentId) + .setDeliveryId(deliveryId) + .setDeliveryType(deliveryType) + .setBasketSnapshot(orderBasket) + .setRestaurantId(restaurantId); + + orderService.createOrder(orderInput, (error, response) => { + if (error) return res.status(500).send({ error }); + else return res.status(200).json(response.toObject()); + }); +}); + //TODO: to test this route with the user and basket service orderRoutes.post("/api/order/tmp", async (req: Request, res: Response) => { /* #swagger.parameters['body'] = { From 8048eb8e4a468b84fd7f2dba4b90d0314bc7322d Mon Sep 17 00:00:00 2001 From: anatole Date: Mon, 28 Aug 2023 14:16:01 +0200 Subject: [PATCH 521/883] feat(gateway): add post order route --- .../controller/product/product.controller.ts | 4 +-- .../gateway/src/services/basket.service.ts | 14 +++++++++ .../gateway/src/services/delivery.service.ts | 31 +++++++++++++++++++ 3 files changed, 47 insertions(+), 2 deletions(-) create mode 100644 services/gateway/src/services/delivery.service.ts diff --git a/services/gateway/src/controller/product/product.controller.ts b/services/gateway/src/controller/product/product.controller.ts index 31632ddc..0c4dfee3 100644 --- a/services/gateway/src/controller/product/product.controller.ts +++ b/services/gateway/src/controller/product/product.controller.ts @@ -78,7 +78,7 @@ productRoutes.post("/api/product", withCheck({ role: ["ACCOUNTANT", "ADMIN"] }), preparation: "preparation", weight: "weight", kilocalories: "0", - nutriscore: 0, + nutriscore: "A", categories: [{ id: "category:id", }], @@ -146,7 +146,7 @@ productRoutes.put("/api/product/:id", withCheck({ role: ["ACCOUNTANT", "ADMIN"] preparation: "preparation", weight: "weight", kilocalories: "0", - nutriscore: 0, + nutriscore: "A", categories: [{ id: "category:id" }], diff --git a/services/gateway/src/services/basket.service.ts b/services/gateway/src/services/basket.service.ts index b9b02a13..504cecd4 100644 --- a/services/gateway/src/services/basket.service.ts +++ b/services/gateway/src/services/basket.service.ts @@ -14,3 +14,17 @@ export const getBasketByUser = (id: string): Promise => { }); }); }; + +export const resetBasketByUser = (id: string): Promise => { + const userId = new UserId(); + userId.setId(Number(id)); + return new Promise((resolve, reject) => { + basketServiceClient.reset(userId, (error, response) => { + if (error) { + reject(error); + } else { + resolve(response); + } + }); + }); +}; diff --git a/services/gateway/src/services/delivery.service.ts b/services/gateway/src/services/delivery.service.ts new file mode 100644 index 00000000..ac01d8c4 --- /dev/null +++ b/services/gateway/src/services/delivery.service.ts @@ -0,0 +1,31 @@ +import { deliveryServiceClient } from "@gateway/services/clients/delivery.client"; +import { Delivery, DeliveryCreateInput, Status } from "@gateway/proto/delivery_pb"; + +export const createDelivery = ( + address: string, + deliveryPersonId: string, + userId: number, + restaurantId: string, +): Promise => { + const deliveryCreateInput = new DeliveryCreateInput() + .setEta(getEtaByUserAddress(address)) + .setAddress(address) + .setStatus(Status.PENDING) + .setDeliveryPersonId(deliveryPersonId) + .setUserId(userId.toString()) + .setRestaurantId(restaurantId); + return new Promise((resolve, reject) => { + deliveryServiceClient.createDelivery(deliveryCreateInput, (error, response) => { + if (error) { + reject(error); + } else { + resolve(response); + } + }); + }); +}; + +// TODO: add google call +const getEtaByUserAddress = (address: string) => { + return new Date().toString(); +}; From 47da6969947111f8918f4d0601e60c3473bcac5a Mon Sep 17 00:00:00 2001 From: anatole Date: Mon, 28 Aug 2023 14:29:17 +0200 Subject: [PATCH 522/883] fix(build proto): fix bash script --- services/proto/build-protos.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/proto/build-protos.sh b/services/proto/build-protos.sh index 0cf8dca2..24d46bf6 100755 --- a/services/proto/build-protos.sh +++ b/services/proto/build-protos.sh @@ -18,6 +18,6 @@ yarn run grpc_tools_node_protoc \ # TypeScript code generation yarn run grpc_tools_node_protoc \ --plugin=protoc-gen-ts=./node_modules/.bin/protoc-gen-ts \ - --ts_out=${PROTO_DEST} \ + --ts_out=grpc_js:${PROTO_DEST} \ -I ./proto \ proto/*.proto From e5d9ebbf6125063f9fe232ba654869924995db4e Mon Sep 17 00:00:00 2001 From: Florian LEROUX Date: Mon, 28 Aug 2023 14:30:24 +0200 Subject: [PATCH 523/883] fix(gateway/delivery): remove delivery status in create delivery --- .../gateway/src/controller/delivery/delivery.controller.ts | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/services/gateway/src/controller/delivery/delivery.controller.ts b/services/gateway/src/controller/delivery/delivery.controller.ts index 95ad4b2e..4f7c083c 100644 --- a/services/gateway/src/controller/delivery/delivery.controller.ts +++ b/services/gateway/src/controller/delivery/delivery.controller.ts @@ -96,7 +96,6 @@ deliveryRoutes.post("/api/delivery", async (req: Request, res: Response) => { schema: { eta: "2022-01-01T00:00:00.000Z", address: "10 Rue de la République, 75003 Paris, France", - status: {'$ref': '#/definitions/Status'}, deliveryPersonId: "cllcdmeci0000pm01su98mxtb", restaurantId: "restaurant_id:1" } @@ -115,9 +114,9 @@ deliveryRoutes.post("/api/delivery", async (req: Request, res: Response) => { if (!userId) return res.status(401).json({ message: "Unauthorized" }); // ---------------------------- - const { eta, address, status, deliveryPersonId, restaurantId } = req.body; - const deliveryStatus = Status[status] as unknown as Status; - if (!deliveryStatus) return res.status(400).send({ error: "Status not found" }); + const { eta, address, deliveryPersonId, restaurantId } = req.body; + const deliveryStatus = Status.PENDING; + // if (!deliveryStatus) return res.status(400).send({ error: "Status not found" }); const deliveryCreateInput = new DeliveryCreateInput() .setEta(eta) From 3ac516a16230ac4332076f781f321ddecd203729 Mon Sep 17 00:00:00 2001 From: anatole Date: Mon, 28 Aug 2023 14:31:32 +0200 Subject: [PATCH 524/883] fix(gateway): fix swagger syntax error --- .../controller/product/product.controller.ts | 2 +- .../src/lib/swagger/swagger-output.json | 302 ++++++++++-------- 2 files changed, 177 insertions(+), 127 deletions(-) diff --git a/services/gateway/src/controller/product/product.controller.ts b/services/gateway/src/controller/product/product.controller.ts index 3158d195..7e3f29a8 100644 --- a/services/gateway/src/controller/product/product.controller.ts +++ b/services/gateway/src/controller/product/product.controller.ts @@ -214,7 +214,7 @@ productRoutes.post( required: true, schema: { name: 'string', - input_file: 'string'' + input_file: 'string' } } #swagger.parameters['authorization'] = { diff --git a/services/gateway/src/lib/swagger/swagger-output.json b/services/gateway/src/lib/swagger/swagger-output.json index 82777a2d..64476b0b 100644 --- a/services/gateway/src/lib/swagger/swagger-output.json +++ b/services/gateway/src/lib/swagger/swagger-output.json @@ -822,15 +822,19 @@ "description": "Internal Server Error" } } - } - }, - "/api/order": { - "post": { + }, + "put": { "tags": [ "Order" ], "description": "", "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "string" + }, { "name": "body", "in": "body", @@ -838,16 +842,16 @@ "schema": { "type": "object", "properties": { - "paymentId": { - "type": "string", - "example": "payment_id:1" + "status": { + "$ref": "#/definitions/Status" }, "deliveryId": { "type": "string", "example": "delivery_id:1" }, - "deliveryType": { - "$ref": "#/definitions/DeliveryType" + "paymentId": { + "type": "string", + "example": "payment_id:1" }, "restaurantId": { "type": "string", @@ -867,30 +871,62 @@ "200": { "description": "OK" }, - "401": { - "description": "Unauthorized" - }, - "404": { - "description": "Not Found" - }, "500": { "description": "Internal Server Error" } } - } - }, - "/api/order/by-user/{userId}": { - "get": { + }, + "delete": { "tags": [ "Order" ], "description": "", "parameters": [ { - "name": "userId", + "name": "id", "in": "path", "required": true, "type": "string" + } + ], + "responses": { + "default": { + "description": "" + } + } + } + }, + "/api/order": { + "post": { + "tags": [ + "Order" + ], + "description": "", + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "type": "object", + "properties": { + "paymentId": { + "type": "string", + "example": "payment_id:1" + }, + "deliveryId": { + "type": "string", + "example": "delivery_id:1" + }, + "deliveryType": { + "$ref": "#/definitions/DeliveryType" + }, + "restaurantId": { + "type": "string", + "example": "restaurant_id:1" + } + } + } }, { "name": "authorization", @@ -906,13 +942,16 @@ "401": { "description": "Unauthorized" }, + "404": { + "description": "Not Found" + }, "500": { "description": "Internal Server Error" } } } }, - "/api/order/by-status": { + "/api/order/tmp": { "post": { "tags": [ "Order" @@ -926,8 +965,12 @@ "schema": { "type": "object", "properties": { - "status": { - "$ref": "#/definitions/Status" + "paymentId": { + "type": "string", + "example": "payment_id:1" + }, + "deliveryType": { + "$ref": "#/definitions/DeliveryType" } } } @@ -943,13 +986,19 @@ "200": { "description": "OK" }, + "401": { + "description": "Unauthorized" + }, + "404": { + "description": "Not Found" + }, "500": { "description": "Internal Server Error" } } } }, - "/api/order/by-delivery/{deliveryId}": { + "/api/order/by-user/{userId}": { "get": { "tags": [ "Order" @@ -957,16 +1006,11 @@ "description": "", "parameters": [ { - "name": "deliveryId", + "name": "userId", "in": "path", "required": true, "type": "string" }, - { - "name": "deliveryId", - "in": "query", - "type": "string" - }, { "name": "authorization", "in": "header", @@ -975,8 +1019,8 @@ } ], "responses": { - "200": { - "description": "OK" + "201": { + "description": "Created" }, "401": { "description": "Unauthorized" @@ -987,18 +1031,25 @@ } } }, - "/api/order/by-payment/{paymentId}": { - "get": { + "/api/order/by-status": { + "post": { "tags": [ "Order" ], "description": "", "parameters": [ { - "name": "paymentId", - "in": "path", + "name": "body", + "in": "body", "required": true, - "type": "string" + "schema": { + "type": "object", + "properties": { + "status": { + "$ref": "#/definitions/Status" + } + } + } }, { "name": "authorization", @@ -1011,52 +1062,29 @@ "200": { "description": "OK" }, - "401": { - "description": "Unauthorized" - }, "500": { "description": "Internal Server Error" } } } }, - "/api/order/{orderId}": { - "put": { + "/api/order/by-delivery/{deliveryId}": { + "get": { "tags": [ "Order" ], "description": "", "parameters": [ { - "name": "orderId", + "name": "deliveryId", "in": "path", "required": true, "type": "string" }, { - "name": "body", - "in": "body", - "required": true, - "schema": { - "type": "object", - "properties": { - "status": { - "$ref": "#/definitions/Status" - }, - "deliveryId": { - "type": "string", - "example": "delivery_id:1" - }, - "paymentId": { - "type": "string", - "example": "payment_id:1" - }, - "restaurantId": { - "type": "string", - "example": "restaurant_id:1" - } - } - } + "name": "deliveryId", + "in": "query", + "type": "string" }, { "name": "authorization", @@ -1069,27 +1097,44 @@ "200": { "description": "OK" }, + "401": { + "description": "Unauthorized" + }, "500": { "description": "Internal Server Error" } } - }, - "delete": { + } + }, + "/api/order/by-payment/{paymentId}": { + "get": { "tags": [ "Order" ], "description": "", "parameters": [ { - "name": "orderId", + "name": "paymentId", "in": "path", "required": true, "type": "string" + }, + { + "name": "authorization", + "in": "header", + "required": true, + "type": "string" } ], "responses": { - "default": { - "description": "" + "200": { + "description": "OK" + }, + "401": { + "description": "Unauthorized" + }, + "500": { + "description": "Internal Server Error" } } } @@ -1224,8 +1269,8 @@ "example": "0" }, "nutriscore": { - "type": "number", - "example": 0 + "type": "string", + "example": "A" }, "categories": { "type": "array", @@ -1337,8 +1382,8 @@ "example": "0" }, "nutriscore": { - "type": "number", - "example": 0 + "type": "string", + "example": "A" }, "categories": { "type": "array", @@ -1398,8 +1443,13 @@ "schema": { "type": "object", "properties": { + "name": { + "type": "string", + "example": "string" + }, "input_file": { - "type": "function" + "type": "string", + "example": "string" } } } @@ -2244,22 +2294,17 @@ } } }, - "/api/delivery-person/{id}": { + "/api/delivery-person": { "get": { "tags": [ "Delivery" ], "description": "", "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "type": "string" - }, { "name": "authorization", "in": "header", + "required": true, "type": "string" } ], @@ -2267,26 +2312,17 @@ "200": { "description": "OK" }, - "401": { - "description": "Unauthorized" - }, "500": { "description": "Internal Server Error" } } }, - "put": { + "post": { "tags": [ "Delivery" ], "description": "", "parameters": [ - { - "name": "id", - "in": "path", - "required": true, - "type": "string" - }, { "name": "body", "in": "body", @@ -2327,54 +2363,69 @@ } ], "responses": { - "200": { - "description": "OK" + "201": { + "description": "Created" }, "500": { "description": "Internal Server Error" } } - }, - "delete": { + } + }, + "/api/delivery-person/near": { + "get": { "tags": [ "Delivery" ], "description": "", "parameters": [ { - "name": "id", - "in": "path", - "required": true, + "name": "authorization", + "in": "header", "type": "string" }, { - "name": "authorization", - "in": "header", + "name": "lat", + "in": "query", "required": true, - "type": "string" + "type": "integer" + }, + { + "name": "lng", + "in": "query", + "required": true, + "type": "integer" } ], "responses": { "200": { "description": "OK" }, + "401": { + "description": "Unauthorized" + }, "500": { "description": "Internal Server Error" } } } }, - "/api/delivery-person": { + "/api/delivery-person/{id}": { "get": { "tags": [ "Delivery" ], "description": "", "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "string" + }, { "name": "authorization", "in": "header", - "required": true, "type": "string" } ], @@ -2382,17 +2433,26 @@ "200": { "description": "OK" }, + "401": { + "description": "Unauthorized" + }, "500": { "description": "Internal Server Error" } } }, - "post": { + "put": { "tags": [ "Delivery" ], "description": "", "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "type": "string" + }, { "name": "body", "in": "body", @@ -2433,47 +2493,37 @@ } ], "responses": { - "201": { - "description": "Created" + "200": { + "description": "OK" }, "500": { "description": "Internal Server Error" } } - } - }, - "/api/delivery-person/near": { - "get": { + }, + "delete": { "tags": [ "Delivery" ], "description": "", "parameters": [ { - "name": "authorization", - "in": "header", - "type": "string" - }, - { - "name": "lat", - "in": "query", + "name": "id", + "in": "path", "required": true, - "type": "integer" + "type": "string" }, { - "name": "lng", - "in": "query", + "name": "authorization", + "in": "header", "required": true, - "type": "integer" + "type": "string" } ], "responses": { "200": { "description": "OK" }, - "401": { - "description": "Unauthorized" - }, "500": { "description": "Internal Server Error" } From 95ac75a88a27c0dfc79ba0fafce9aca4adff4cf1 Mon Sep 17 00:00:00 2001 From: anatole Date: Mon, 28 Aug 2023 15:47:15 +0200 Subject: [PATCH 525/883] feat(user): user service log errors --- .../controller/user/mainAddress.controller.ts | 2 +- .../src/controller/user/user.controller.ts | 38 ++++++++++--------- .../src/lib/swagger/swagger-output.json | 19 +++------- services/user/pkg/services/user.go | 4 ++ 4 files changed, 32 insertions(+), 31 deletions(-) diff --git a/services/gateway/src/controller/user/mainAddress.controller.ts b/services/gateway/src/controller/user/mainAddress.controller.ts index 9bee4930..4984c235 100644 --- a/services/gateway/src/controller/user/mainAddress.controller.ts +++ b/services/gateway/src/controller/user/mainAddress.controller.ts @@ -78,7 +78,7 @@ mainAddressRoutes.put("/api/user/main-address/:id", async (req: Request, res: Re .setLat(lat) .setLng(lng); - const mainAddressUpdateInput = new MainAddressUpdateInput().setToken(authorization).setMainaddress(address); + const mainAddressUpdateInput = new MainAddressUpdateInput().setToken(token).setMainaddress(address); mainAddressServiceClient.updateMainAddress(mainAddressUpdateInput, (error, response) => { if (error) return res.status(500).send({ error }); else return res.status(200).json(response.toObject()); diff --git a/services/gateway/src/controller/user/user.controller.ts b/services/gateway/src/controller/user/user.controller.ts index 1eb56b73..30380471 100644 --- a/services/gateway/src/controller/user/user.controller.ts +++ b/services/gateway/src/controller/user/user.controller.ts @@ -113,14 +113,12 @@ userRoutes.put("/api/user", async (req: Request, res: Response) => { firstName: "John", lastName: "Doe", email: "johnDoe@mail.com", - password: "password", phone: "0642424242", country: "France", zipCode: "76000", street: "7 rue de la paix", lat: 49.443232, - lng: 1.099971, - roleCode: {'$ref': '#/definitions/RoleCode'}, + lng: 1.099971 } } */ @@ -131,21 +129,20 @@ userRoutes.put("/api/user", async (req: Request, res: Response) => { const userId = await getUserIdFromToken(token); if (!userId) return res.status(401).json({ message: "Unauthorized" }); - const { firstName, lastName, email, phone, country, zipCode, street, lat, lng, roleCode } = req.body; + const { firstName, lastName, email, phone, country, zipCode, street, lat, lng } = req.body; const userInput = new UpdateUserInput(); try { const address = new MainAddress().setCountry(country).setZipcode(zipCode).setStreet(street).setLat(lat).setLng(lng); const user = new User() - .setId(Number(req.params.id)) + .setId(userId) .setFirstName(firstName) .setLastName(lastName) .setEmail(email) .setPhone(phone) - .setMainaddress(address) - .setRole(new Role().setCode(roleCode)); + .setMainaddress(address); - userInput.setUser(user).setToken(authorization); + userInput.setUser(user).setToken(token); } catch (e: any) { res.json({ error: e.message }); } @@ -173,9 +170,10 @@ userRoutes.delete("/api/user/:id", (req: Request, res: Response) => { const { id } = req.params; const { authorization } = req.headers; if (!authorization) return res.status(401).json({ message: "Unauthorized" }); + const token = authorization.split("Bearer ")[1]; // The delete route in the user service implement the user validation - userServiceClient.deleteUser(new DeleteInput().setUserid(Number(id)).setToken(authorization), (error, response) => { + userServiceClient.deleteUser(new DeleteInput().setUserid(Number(id)).setToken(token), (error, response) => { if (error) { res.status(500).send({ error: error.message }); } else { @@ -213,8 +211,9 @@ userRoutes.post("/api/user/validate", (req: Request, res: Response) => { } */ const { authorization } = req.headers; if (!authorization) return res.status(401).json({ message: "Unauthorized" }); + const token = authorization.split("Bearer ")[1]; - const validate = new validateInput().setToken(authorization); + const validate = new validateInput().setToken(token); userServiceClient.validate(validate, (error, response) => { if (error) { @@ -242,11 +241,12 @@ userRoutes.put("/api/user/password", (req: Request, res: Response) => { const { authorization } = req.headers; if (!authorization) return res.status(401).json({ message: "Unauthorized" }); + const token = authorization.split("Bearer ")[1]; const { oldpassword, password } = req.body; const updatePasswordInput = new changePasswordInput(); try { - updatePasswordInput.setToken(authorization).setOldpassword(oldpassword).setNewpassword(password); + updatePasswordInput.setToken(token).setOldpassword(oldpassword).setNewpassword(password); } catch (e: any) { res.json({ error: e.message }); } @@ -260,7 +260,7 @@ userRoutes.put("/api/user/password", (req: Request, res: Response) => { }); }); -userRoutes.put("/api/user/:id/role", withCheck({ role: "ADMIN" }), (req: Request, res: Response) => { +userRoutes.put("/api/user/:id/role", withCheck({ role: "ADMIN" }), async (req: Request, res: Response) => { /* #swagger.parameters['authorization'] = { in: 'header', required: true, @@ -278,15 +278,19 @@ userRoutes.put("/api/user/:id/role", withCheck({ role: "ADMIN" }), (req: Request role: {'$ref': '#/definitions/RoleCode'}, } } */ + + // Auth check and :id check --- const { authorization } = req.headers; - if (!authorization) { - res.json({ error: "Not authorized" }); - return; - } + const token = authorization!.split("Bearer ")[1]; + const userId = await getUserIdFromToken(token); + if (!userId) return res.status(401).json({ message: "Unauthorized" }); const id = req.params.id; + if (Number(id) === userId) return res.status(403).json({ message: "Forbidden" }); + // ---------------------------- + const updatePasswordInput = new changeRoleInput(); try { - updatePasswordInput.setToken(authorization).setUserid(Number(id)).setRolecode(req.body.role); + updatePasswordInput.setToken(token).setUserid(Number(id)).setRolecode(req.body.role); } catch (e: any) { res.json({ error: e.message }); } diff --git a/services/gateway/src/lib/swagger/swagger-output.json b/services/gateway/src/lib/swagger/swagger-output.json index 64476b0b..fd87c4b8 100644 --- a/services/gateway/src/lib/swagger/swagger-output.json +++ b/services/gateway/src/lib/swagger/swagger-output.json @@ -129,10 +129,6 @@ "type": "string", "example": "johnDoe@mail.com" }, - "password": { - "type": "string", - "example": "password" - }, "phone": { "type": "string", "example": "0642424242" @@ -156,9 +152,6 @@ "lng": { "type": "number", "example": 1.099971 - }, - "roleCode": { - "$ref": "#/definitions/RoleCode" } } } @@ -393,6 +386,12 @@ "200": { "description": "OK" }, + "401": { + "description": "Unauthorized" + }, + "403": { + "description": "Forbidden" + }, "500": { "description": "Internal Server Error" } @@ -2257,9 +2256,6 @@ "type": "string", "example": "10 Rue de la République, 75003 Paris, France" }, - "status": { - "$ref": "#/definitions/Status" - }, "deliveryPersonId": { "type": "string", "example": "cllcdmeci0000pm01su98mxtb" @@ -2282,9 +2278,6 @@ "201": { "description": "Created" }, - "400": { - "description": "Bad Request" - }, "401": { "description": "Unauthorized" }, diff --git a/services/user/pkg/services/user.go b/services/user/pkg/services/user.go index a8266f30..de7d209a 100644 --- a/services/user/pkg/services/user.go +++ b/services/user/pkg/services/user.go @@ -2,6 +2,7 @@ package services import ( "context" + "encoding/json" "github.com/golang/protobuf/ptypes/empty" "goodfood-user/pkg/mapper" "goodfood-user/pkg/models" @@ -24,6 +25,7 @@ func (s *Server) GetUser(_ context.Context, req *pb.UserId) (*pb.UserOutput, err } func (s *Server) UpdateUser(_ context.Context, req *pb.UpdateUserInput) (*pb.UserOutput, error) { + logger := utils.GetLogger() if req.User == nil || req.Token == "" { return &pb.UserOutput{ Error: "Invalid request", @@ -32,6 +34,7 @@ func (s *Server) UpdateUser(_ context.Context, req *pb.UpdateUserInput) (*pb.Use claims, err := s.Jwt.ValidateToken(req.Token) if err != nil { + logger.Fatalf("Error validating token: %v", err) return &pb.UserOutput{ Error: "Invalid token", }, nil @@ -42,6 +45,7 @@ func (s *Server) UpdateUser(_ context.Context, req *pb.UpdateUserInput) (*pb.Use Error: "User not found", }, nil } + var user = mapper.UpdateInputToModelUser(req.User) s.H.DB.Updates(&user) From 6f43e28c25e6afaae6a2fc1ab272bee0f33e262d Mon Sep 17 00:00:00 2001 From: anatole Date: Mon, 28 Aug 2023 15:49:19 +0200 Subject: [PATCH 526/883] feat(user): remove useless import --- services/user/pkg/services/user.go | 1 - 1 file changed, 1 deletion(-) diff --git a/services/user/pkg/services/user.go b/services/user/pkg/services/user.go index de7d209a..0795c458 100644 --- a/services/user/pkg/services/user.go +++ b/services/user/pkg/services/user.go @@ -2,7 +2,6 @@ package services import ( "context" - "encoding/json" "github.com/golang/protobuf/ptypes/empty" "goodfood-user/pkg/mapper" "goodfood-user/pkg/models" From 3a9c8e4d0d42c03a0090be2c3dd5d52159df1a0f Mon Sep 17 00:00:00 2001 From: Florian LEROUX Date: Mon, 28 Aug 2023 16:17:26 +0200 Subject: [PATCH 527/883] fix(reporting): change entrypoint --- services/reporting/Dockerfile | 4 ++-- services/reporting/{docker-entrypoint.sh => script.sh} | 0 2 files changed, 2 insertions(+), 2 deletions(-) rename services/reporting/{docker-entrypoint.sh => script.sh} (100%) diff --git a/services/reporting/Dockerfile b/services/reporting/Dockerfile index 5db33392..efe3edae 100644 --- a/services/reporting/Dockerfile +++ b/services/reporting/Dockerfile @@ -8,7 +8,7 @@ RUN dotnet restore # Copy the rest of the application files and build COPY ./reporting/Server . -COPY ./reporting/docker-entrypoint.sh . +COPY ./reporting/script.sh ./script.sh COPY ./proto ./Protos RUN dotnet build -c Release -o out @@ -22,4 +22,4 @@ ENV PATH="${PATH}:/root/.dotnet/tools" # Expose port and specify startup command EXPOSE 50020 -CMD ["bash", "/app/docker-entrypoint.sh"] +CMD ["sh", "script.sh"] diff --git a/services/reporting/docker-entrypoint.sh b/services/reporting/script.sh similarity index 100% rename from services/reporting/docker-entrypoint.sh rename to services/reporting/script.sh From 3a43ff858dab7c52adcd7670259b4a04f82faa2a Mon Sep 17 00:00:00 2001 From: anatole Date: Mon, 28 Aug 2023 16:22:41 +0200 Subject: [PATCH 528/883] feat(user): fix update role user --- services/user/pkg/services/user.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/services/user/pkg/services/user.go b/services/user/pkg/services/user.go index 0795c458..350ce283 100644 --- a/services/user/pkg/services/user.go +++ b/services/user/pkg/services/user.go @@ -152,7 +152,7 @@ func (s *Server) ChangeRole(_ context.Context, req *pb.ChangeRoleInput) (*pb.Cha var connectedUser models.User - if result := s.H.DB.Where(&models.User{Id: claims.Id}).First(&connectedUser); result.Error != nil { + if result := s.H.DB.Where(&models.User{Id: claims.Id}).Preload("Role").First(&connectedUser); result.Error != nil { return &pb.ChangeRoleOutput{ Error: "User not found", }, nil @@ -161,7 +161,7 @@ func (s *Server) ChangeRole(_ context.Context, req *pb.ChangeRoleInput) (*pb.Cha var user models.User var role models.Role - if result := s.H.DB.Where(&models.User{Id: req.UserId}).First(&user); result.Error != nil { + if result := s.H.DB.Where(&models.User{Id: req.UserId}).Preload("Role").First(&user); result.Error != nil { return &pb.ChangeRoleOutput{ Error: "User not found", }, nil @@ -172,8 +172,8 @@ func (s *Server) ChangeRole(_ context.Context, req *pb.ChangeRoleInput) (*pb.Cha Error: "User not found", }, nil } - - if user.Role.Code == "ADMIN" { + utils.GetLogger().Fatalf("Role code", connectedUser.Role.Code) + if connectedUser.Role.Code == "ADMIN" { user.Role = role s.H.DB.Save(&user) From 8d2bc3735ef59cca64a0467e856e09c41603f0b1 Mon Sep 17 00:00:00 2001 From: anatole Date: Mon, 28 Aug 2023 22:25:50 +0200 Subject: [PATCH 529/883] feat(node services): add minify option in the build --- services/delivery/package.json | 2 +- services/order/package.json | 2 +- services/payment/package.json | 2 +- services/product/package.json | 2 +- services/promotions/package.json | 2 +- services/restaurant/package.json | 2 +- services/stock/package.json | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/services/delivery/package.json b/services/delivery/package.json index 93d60e05..68be9466 100644 --- a/services/delivery/package.json +++ b/services/delivery/package.json @@ -4,7 +4,7 @@ "scripts": { "start": "node dist/index.js", "dev": "nodemon --watch 'src/**/*.ts' --exec 'ts-node' src/server.ts", - "build": "esbuild src/server.ts --bundle --platform=node --target=node18 --outfile=dist/index.js", + "build": "esbuild src/server.ts --bundle --platform=node --target=node18 --outfile=dist/index.js --minify", "test": "echo 'tests are disabled' # vitest", "coverage": "vitest --coverage", "pkg": "pkg .", diff --git a/services/order/package.json b/services/order/package.json index cfd63d95..79ea28f3 100644 --- a/services/order/package.json +++ b/services/order/package.json @@ -4,7 +4,7 @@ "scripts": { "start": "node dist/index.js", "dev": "nodemon --watch 'src/**/*.ts' --exec 'ts-node' src/server.ts", - "build": "esbuild src/server.ts --bundle --platform=node --target=node18 --outfile=dist/index.js", + "build": "esbuild src/server.ts --bundle --platform=node --target=node18 --outfile=dist/index.js --minify", "test": "vitest", "coverage": "vitest --coverage", "pkg": "pkg .", diff --git a/services/payment/package.json b/services/payment/package.json index 5be2196a..72f30500 100644 --- a/services/payment/package.json +++ b/services/payment/package.json @@ -4,7 +4,7 @@ "scripts": { "start": "node dist/index.js", "dev": "nodemon --watch 'src/**/*.ts' --exec 'ts-node' src/server.ts", - "build": "esbuild src/server.ts --bundle --platform=node --target=node18 --outfile=dist/index.js", + "build": "esbuild src/server.ts --bundle --platform=node --target=node18 --outfile=dist/index.js --minify", "test": "vitest", "coverage": "vitest --coverage", "pkg": "pkg .", diff --git a/services/product/package.json b/services/product/package.json index 0cdef090..5f4c3b82 100644 --- a/services/product/package.json +++ b/services/product/package.json @@ -4,7 +4,7 @@ "scripts": { "start": "node dist/index.js", "dev": "nodemon --watch 'src/**/*.ts' --exec 'ts-node' src/server.ts", - "build": "esbuild src/server.ts --bundle --platform=node --target=node18 --outfile=dist/index.js", + "build": "esbuild src/server.ts --bundle --platform=node --target=node18 --outfile=dist/index.js --minify", "test": "echo 'there is no test'", "pkg": "pkg .", "prisma:generate": "prisma generate", diff --git a/services/promotions/package.json b/services/promotions/package.json index 6506e8a7..52d999cf 100644 --- a/services/promotions/package.json +++ b/services/promotions/package.json @@ -4,7 +4,7 @@ "scripts": { "start": "node dist/index.js", "dev": "nodemon --watch 'src/**/*.ts' --exec 'ts-node' src/server.ts", - "build": "esbuild src/server.ts --bundle --platform=node --target=node18 --outfile=dist/index.js", + "build": "esbuild src/server.ts --bundle --platform=node --target=node18 --outfile=dist/index.js --minify", "test": "echo 'tests are disabled'", "prisma:generate": "prisma generate", "postinstall": "npm run prisma:generate" diff --git a/services/restaurant/package.json b/services/restaurant/package.json index 6189e4a1..f15cb85c 100644 --- a/services/restaurant/package.json +++ b/services/restaurant/package.json @@ -4,7 +4,7 @@ "scripts": { "start": "node dist/index.js", "dev": "nodemon --watch 'src/**/*.ts' --exec 'ts-node' src/server.ts", - "build": "esbuild src/server.ts --bundle --platform=node --target=node18 --outfile=dist/index.js", + "build": "esbuild src/server.ts --bundle --platform=node --target=node18 --outfile=dist/index.js --minify", "test": "echo 'tests are disabled'", "prisma:generate": "prisma generate", "postinstall": "npm run prisma:generate" diff --git a/services/stock/package.json b/services/stock/package.json index 8fd87b8f..63ab9070 100644 --- a/services/stock/package.json +++ b/services/stock/package.json @@ -5,7 +5,7 @@ "scripts": { "start": "node dist/index.js", "dev": "nodemon --watch 'src/**/*.ts' --exec 'ts-node' src/server.ts", - "build": "esbuild src/server.ts --bundle --platform=node --target=node18 --outfile=dist/index.js", + "build": "esbuild src/server.ts --bundle --platform=node --target=node18 --outfile=dist/index.js --minify", "test": "vitest", "coverage": "vitest --coverage", "prisma:generate": "prisma generate", From 9c30ccec29102ddd8ba1c946b923b9891d7d5d2d Mon Sep 17 00:00:00 2001 From: anatole Date: Mon, 28 Aug 2023 22:27:55 +0200 Subject: [PATCH 530/883] feat(roles): rename roles --- .../delivery/delivery.controller.ts | 2 +- .../controller/metric/metric.controller.ts | 24 +++++----- .../src/controller/order/order.controller.ts | 2 +- .../controller/product/allergen.controller.ts | 6 +-- .../controller/product/category.controller.ts | 6 +-- .../controller/product/product.controller.ts | 8 ++-- .../promotion/promotion.controller.ts | 10 ++-- .../restaurant/restaurant.controller.ts | 2 +- .../src/controller/stock/stock.controller.ts | 48 +++++++++---------- .../src/lib/swagger/swagger-output.json | 4 +- .../gateway/src/lib/swagger/swagger.utils.js | 4 +- services/gateway/src/middleware/auth.ts | 4 +- services/user/pkg/db/init/initialize.go | 8 ++-- 13 files changed, 64 insertions(+), 64 deletions(-) diff --git a/services/gateway/src/controller/delivery/delivery.controller.ts b/services/gateway/src/controller/delivery/delivery.controller.ts index 4f7c083c..8b14a79b 100644 --- a/services/gateway/src/controller/delivery/delivery.controller.ts +++ b/services/gateway/src/controller/delivery/delivery.controller.ts @@ -45,7 +45,7 @@ deliveryRoutes.get("/api/delivery/:id", async (req: Request, res: Response) => { deliveryRoutes.get( "/api/delivery/by-restaurant/:id", - withCheck({ role: ["ACCOUNTANT", "ADMIN"] }), + withCheck({ role: ["MANAGER", "ADMIN"] }), (req: Request, res: Response) => { /* #swagger.parameters['authorization'] = { in: 'header', diff --git a/services/gateway/src/controller/metric/metric.controller.ts b/services/gateway/src/controller/metric/metric.controller.ts index 1e535dca..3f6cfc44 100644 --- a/services/gateway/src/controller/metric/metric.controller.ts +++ b/services/gateway/src/controller/metric/metric.controller.ts @@ -19,7 +19,7 @@ import { withCheck } from "@gateway/middleware/auth"; export const metricRoutes = Router(); -metricRoutes.get("/api/metric/:key", withCheck({ role: ["ACCOUNTANT", "ADMIN"] }), (req, res) => { +metricRoutes.get("/api/metric/:key", withCheck({ role: ["MANAGER", "ADMIN"] }), (req, res) => { /* #swagger.parameters['authorization'] = { in: 'header', required: true, @@ -38,7 +38,7 @@ metricRoutes.get("/api/metric/:key", withCheck({ role: ["ACCOUNTANT", "ADMIN"] } }); }); -metricRoutes.post("/api/metric/by-restaurant-and-date", withCheck({ role: ["ACCOUNTANT", "ADMIN"] }), (req, res) => { +metricRoutes.post("/api/metric/by-restaurant-and-date", withCheck({ role: ["MANAGER", "ADMIN"] }), (req, res) => { /* #swagger.parameters['body'] = { in: 'body', required: true, @@ -64,7 +64,7 @@ metricRoutes.post("/api/metric/by-restaurant-and-date", withCheck({ role: ["ACCO metricRoutes.get( "/api/metric/by-restaurant/:restaurantId", - withCheck({ role: ["ACCOUNTANT", "ADMIN"] }), + withCheck({ role: ["MANAGER", "ADMIN"] }), (req, res) => { /* #swagger.parameters['authorization'] = { in: 'header', @@ -82,7 +82,7 @@ metricRoutes.get( metricRoutes.get( "/api/metric/by-restaurant-group/:restaurantGroupId", - withCheck({ role: ["ACCOUNTANT", "ADMIN"] }), + withCheck({ role: ["MANAGER", "ADMIN"] }), (req, res) => { /* #swagger.parameters['authorization'] = { in: 'header', @@ -100,7 +100,7 @@ metricRoutes.get( }, ); -metricRoutes.get("/api/metric/restaurant/:restaurantId", withCheck({ role: ["ACCOUNTANT", "ADMIN"] }), (req, res) => { +metricRoutes.get("/api/metric/restaurant/:restaurantId", withCheck({ role: ["MANAGER", "ADMIN"] }), (req, res) => { /* #swagger.parameters['authorization'] = { in: 'header', required: true, @@ -115,7 +115,7 @@ metricRoutes.get("/api/metric/restaurant/:restaurantId", withCheck({ role: ["ACC metricRoutes.get( "/api/metric/restaurant-group/:restaurantGroupId", - withCheck({ role: ["ACCOUNTANT", "ADMIN"] }), + withCheck({ role: ["MANAGER", "ADMIN"] }), (req, res) => { /* #swagger.parameters['restaurantGroupId'] = { in: 'path', @@ -131,7 +131,7 @@ metricRoutes.get( }, ); -metricRoutes.post("/api/metric/restaurant", withCheck({ role: ["ACCOUNTANT", "ADMIN"] }), (req, res) => { +metricRoutes.post("/api/metric/restaurant", withCheck({ role: ["MANAGER", "ADMIN"] }), (req, res) => { /* #swagger.parameters['body'] = { in: 'body', required: true, @@ -160,7 +160,7 @@ metricRoutes.post("/api/metric/restaurant", withCheck({ role: ["ACCOUNTANT", "AD }); }); -metricRoutes.post("/api/metric/restaurant-group", withCheck({ role: ["ACCOUNTANT", "ADMIN"] }), (req, res) => { +metricRoutes.post("/api/metric/restaurant-group", withCheck({ role: ["MANAGER", "ADMIN"] }), (req, res) => { /* #swagger.parameters['body'] = { in: 'body', required: true, @@ -182,7 +182,7 @@ metricRoutes.post("/api/metric/restaurant-group", withCheck({ role: ["ACCOUNTANT }); }); -metricRoutes.put("/api/metric/restaurant/:restaurantId", withCheck({ role: ["ACCOUNTANT", "ADMIN"] }), (req, res) => { +metricRoutes.put("/api/metric/restaurant/:restaurantId", withCheck({ role: ["MANAGER", "ADMIN"] }), (req, res) => { /* #swagger.parameters['body'] = { in: 'body', required: true, @@ -215,7 +215,7 @@ metricRoutes.put("/api/metric/restaurant/:restaurantId", withCheck({ role: ["ACC metricRoutes.put( "/api/metric/restaurant-group/:restaurantGroupId", - withCheck({ role: ["ACCOUNTANT", "ADMIN"] }), + withCheck({ role: ["MANAGER", "ADMIN"] }), (req, res) => { /* #swagger.parameters['restaurantGroupId'] = { in: 'path', @@ -249,7 +249,7 @@ metricRoutes.put( metricRoutes.delete( "/api/metric/restaurant/:restaurantId", - withCheck({ role: ["ACCOUNTANT", "ADMIN"] }), + withCheck({ role: ["MANAGER", "ADMIN"] }), (req, res) => { /* #swagger.parameters['authorization'] = { in: 'header', @@ -287,7 +287,7 @@ metricRoutes.delete("/api/metric/restaurant-group/:restaurantGroupId", (req, res }); // route should not be accessible since other services publish metrics into reporting via AMQP -metricRoutes.post("/api/metric", withCheck({ role: ["ACCOUNTANT", "ADMIN"] }), (req, res) => { +metricRoutes.post("/api/metric", withCheck({ role: ["MANAGER", "ADMIN"] }), (req, res) => { /* #swagger.parameters['body'] = { in: 'body', required: true, diff --git a/services/gateway/src/controller/order/order.controller.ts b/services/gateway/src/controller/order/order.controller.ts index 984ac688..63e35183 100644 --- a/services/gateway/src/controller/order/order.controller.ts +++ b/services/gateway/src/controller/order/order.controller.ts @@ -243,7 +243,7 @@ orderRoutes.get("/api/order/by-user/:userId", async (req: Request, res: Response orderRoutes.post( "/api/order/by-status", - withCheck({ role: ["ACCOUNTANT", "ADMIN"] }), + withCheck({ role: ["MANAGER", "ADMIN"] }), (req: Request, res: Response) => { /* #swagger.parameters['body'] = { in: 'body', diff --git a/services/gateway/src/controller/product/allergen.controller.ts b/services/gateway/src/controller/product/allergen.controller.ts index a22dd9fd..13a84134 100644 --- a/services/gateway/src/controller/product/allergen.controller.ts +++ b/services/gateway/src/controller/product/allergen.controller.ts @@ -24,7 +24,7 @@ allergenRoutes.get("/api/allergen/:id", (req: Request, res: Response) => { }); }); -allergenRoutes.post("/api/allergen", withCheck({ role: ["ACCOUNTANT", "ADMIN"] }), (req: Request, res: Response) => { +allergenRoutes.post("/api/allergen", withCheck({ role: ["MANAGER", "ADMIN"] }), (req: Request, res: Response) => { /* #swagger.parameters['body'] = { in: 'body', required: true, @@ -45,7 +45,7 @@ allergenRoutes.post("/api/allergen", withCheck({ role: ["ACCOUNTANT", "ADMIN"] } }); }); -allergenRoutes.put("/api/allergen/:id", withCheck({ role: ["ACCOUNTANT", "ADMIN"] }), (req: Request, res: Response) => { +allergenRoutes.put("/api/allergen/:id", withCheck({ role: ["MANAGER", "ADMIN"] }), (req: Request, res: Response) => { /* #swagger.parameters['body'] = { in: 'body', required: true, @@ -69,7 +69,7 @@ allergenRoutes.put("/api/allergen/:id", withCheck({ role: ["ACCOUNTANT", "ADMIN" allergenRoutes.delete( "/api/allergen/:id", - withCheck({ role: ["ACCOUNTANT", "ADMIN"] }), + withCheck({ role: ["MANAGER", "ADMIN"] }), (req: Request, res: Response) => { /* #swagger.parameters['authorization'] = { in: 'header', diff --git a/services/gateway/src/controller/product/category.controller.ts b/services/gateway/src/controller/product/category.controller.ts index 9c408aef..bf2d359a 100644 --- a/services/gateway/src/controller/product/category.controller.ts +++ b/services/gateway/src/controller/product/category.controller.ts @@ -27,7 +27,7 @@ categoryRoutes.get("/api/category/:id", (req: Request, res: Response) => { }); }); -categoryRoutes.post("/api/category", withCheck({ role: ["ACCOUNTANT", "ADMIN"] }), (req: Request, res: Response) => { +categoryRoutes.post("/api/category", withCheck({ role: ["MANAGER", "ADMIN"] }), (req: Request, res: Response) => { /* #swagger.parameters['body'] = { in: 'body', required: true, @@ -50,7 +50,7 @@ categoryRoutes.post("/api/category", withCheck({ role: ["ACCOUNTANT", "ADMIN"] } }); }); -categoryRoutes.put("/api/category/:id", withCheck({ role: ["ACCOUNTANT", "ADMIN"] }), (req: Request, res: Response) => { +categoryRoutes.put("/api/category/:id", withCheck({ role: ["MANAGER", "ADMIN"] }), (req: Request, res: Response) => { /* #swagger.parameters['body'] = { in: 'body', required: true, @@ -81,7 +81,7 @@ categoryRoutes.put("/api/category/:id", withCheck({ role: ["ACCOUNTANT", "ADMIN" categoryRoutes.delete( "/api/category/:id", - withCheck({ role: ["ACCOUNTANT", "ADMIN"] }), + withCheck({ role: ["MANAGER", "ADMIN"] }), (req: Request, res: Response) => { /* #swagger.parameters['authorization'] = { in: 'header', diff --git a/services/gateway/src/controller/product/product.controller.ts b/services/gateway/src/controller/product/product.controller.ts index 7e3f29a8..a94c30d1 100644 --- a/services/gateway/src/controller/product/product.controller.ts +++ b/services/gateway/src/controller/product/product.controller.ts @@ -43,7 +43,7 @@ productRoutes.get("/api/product/type", (_: Request, res: Response) => { productRoutes.delete( "/api/product/:id", - withCheck({ role: ["ACCOUNTANT", "ADMIN"] }), + withCheck({ role: ["MANAGER", "ADMIN"] }), (req: Request, res: Response) => { /* #swagger.parameters['authorization'] = { in: 'header', @@ -64,7 +64,7 @@ productRoutes.delete( }, ); -productRoutes.post("/api/product", withCheck({ role: ["ACCOUNTANT", "ADMIN"] }), (req: Request, res: Response) => { +productRoutes.post("/api/product", withCheck({ role: ["MANAGER", "ADMIN"] }), (req: Request, res: Response) => { /* #swagger.parameters['body'] = { in: 'body', required: true, @@ -132,7 +132,7 @@ productRoutes.post("/api/product", withCheck({ role: ["ACCOUNTANT", "ADMIN"] }), }); }); -productRoutes.put("/api/product/:id", withCheck({ role: ["ACCOUNTANT", "ADMIN"] }), (req: Request, res: Response) => { +productRoutes.put("/api/product/:id", withCheck({ role: ["MANAGER", "ADMIN"] }), (req: Request, res: Response) => { /* #swagger.parameters['body'] = { in: 'body', required: true, @@ -207,7 +207,7 @@ productRoutes.put("/api/product/:id", withCheck({ role: ["ACCOUNTANT", "ADMIN"] productRoutes.post( "/api/product/image", - withCheck({ role: ["ACCOUNTANT", "ADMIN"] }), + withCheck({ role: ["MANAGER", "ADMIN"] }), (req: Request, res: Response) => { /* #swagger.parameters['body'] = { in: 'body', diff --git a/services/gateway/src/controller/promotion/promotion.controller.ts b/services/gateway/src/controller/promotion/promotion.controller.ts index ebd88ee9..14ab7b39 100644 --- a/services/gateway/src/controller/promotion/promotion.controller.ts +++ b/services/gateway/src/controller/promotion/promotion.controller.ts @@ -39,7 +39,7 @@ promotionRoutes.get("/api/promotion/:code", async (req, res) => { }); }); -promotionRoutes.get("/api/promotion", withCheck({ role: ["ACCOUNTANT", "ADMIN"] }), (_, res) => { +promotionRoutes.get("/api/promotion", withCheck({ role: ["MANAGER", "ADMIN"] }), (_, res) => { promotionServiceClient.getPromotions(new Empty(), (error, response) => { if (error) return res.status(500).send({ error }); else return res.status(200).json(response.toObject()); @@ -48,7 +48,7 @@ promotionRoutes.get("/api/promotion", withCheck({ role: ["ACCOUNTANT", "ADMIN"] promotionRoutes.get( "/api/promotion/by-restaurant/:restaurantId", - withCheck({ role: ["ACCOUNTANT", "ADMIN"] }), + withCheck({ role: ["MANAGER", "ADMIN"] }), async (req, res) => { /* #swagger.parameters['restaurantId'] = { in: 'path', @@ -81,7 +81,7 @@ promotionRoutes.get( }, ); -promotionRoutes.post("/api/promotion", withCheck({ role: ["ACCOUNTANT", "ADMIN"] }), (req, res) => { +promotionRoutes.post("/api/promotion", withCheck({ role: ["MANAGER", "ADMIN"] }), (req, res) => { /* #swagger.parameters['body'] = { in: 'body', required: true, @@ -108,7 +108,7 @@ promotionRoutes.post("/api/promotion", withCheck({ role: ["ACCOUNTANT", "ADMIN"] }); }); -promotionRoutes.put("/api/promotion/:id", withCheck({ role: ["ACCOUNTANT", "ADMIN"] }), (req, res) => { +promotionRoutes.put("/api/promotion/:id", withCheck({ role: ["MANAGER", "ADMIN"] }), (req, res) => { /* #swagger.parameters['body'] = { in: 'body', required: true, @@ -144,7 +144,7 @@ promotionRoutes.put("/api/promotion/:id", withCheck({ role: ["ACCOUNTANT", "ADMI }); }); -promotionRoutes.delete("/api/promotion/:id", withCheck({ role: ["ACCOUNTANT", "ADMIN"] }), (req, res) => { +promotionRoutes.delete("/api/promotion/:id", withCheck({ role: ["MANAGER", "ADMIN"] }), (req, res) => { /* #swagger.parameters['authorization'] = { in: 'header', required: true, diff --git a/services/gateway/src/controller/restaurant/restaurant.controller.ts b/services/gateway/src/controller/restaurant/restaurant.controller.ts index e56b0532..0eff2125 100644 --- a/services/gateway/src/controller/restaurant/restaurant.controller.ts +++ b/services/gateway/src/controller/restaurant/restaurant.controller.ts @@ -85,7 +85,7 @@ restaurantRoutes.post("/api/restaurant", withCheck({ role: "ADMIN" }), (req: Req restaurantRoutes.put( "/api/restaurant/:id", - withCheck({ role: ["ADMIN", "ACCOUNTANT"] }), + withCheck({ role: ["ADMIN", "MANAGER"] }), (req: Request, res: Response) => { /* #swagger.parameters['id'] = { in: 'path', diff --git a/services/gateway/src/controller/stock/stock.controller.ts b/services/gateway/src/controller/stock/stock.controller.ts index b1c77311..4673d780 100644 --- a/services/gateway/src/controller/stock/stock.controller.ts +++ b/services/gateway/src/controller/stock/stock.controller.ts @@ -38,7 +38,7 @@ export const stockRoutes = Router(); stockRoutes.get( "/api/stock/supplier/:id", - withCheck({ role: ["ACCOUNTANT", "ADMIN"] }), + withCheck({ role: ["MANAGER", "ADMIN"] }), (req: Request, res: Response) => { /* #swagger.parameters['id'] = { in: 'path', @@ -60,7 +60,7 @@ stockRoutes.get( }, ); -stockRoutes.get("/api/stock/supplier", withCheck({ role: ["ACCOUNTANT", "ADMIN"] }), (_: Request, res: Response) => { +stockRoutes.get("/api/stock/supplier", withCheck({ role: ["MANAGER", "ADMIN"] }), (_: Request, res: Response) => { /* #swagger.parameters['authorization'] = { in: 'header', required: true, @@ -75,7 +75,7 @@ stockRoutes.get("/api/stock/supplier", withCheck({ role: ["ACCOUNTANT", "ADMIN"] stockRoutes.get( "/api/stock/ingredient/:id", - withCheck({ role: ["ACCOUNTANT", "ADMIN"] }), + withCheck({ role: ["MANAGER", "ADMIN"] }), (req: Request, res: Response) => { /* #swagger.parameters['id'] = { in: 'path', @@ -98,7 +98,7 @@ stockRoutes.get( }, ); -stockRoutes.get("/api/stock/ingredient", withCheck({ role: ["ACCOUNTANT", "ADMIN"] }), (_: Request, res: Response) => { +stockRoutes.get("/api/stock/ingredient", withCheck({ role: ["MANAGER", "ADMIN"] }), (_: Request, res: Response) => { /* #swagger.parameters['authorization'] = { in: 'header', required: true, @@ -113,7 +113,7 @@ stockRoutes.get("/api/stock/ingredient", withCheck({ role: ["ACCOUNTANT", "ADMIN stockRoutes.post( "/api/stock/ingredient", - withCheck({ role: ["ACCOUNTANT", "ADMIN"] }), + withCheck({ role: ["MANAGER", "ADMIN"] }), (req: Request, res: Response) => { /* #swagger.parameters['body'] = { in: 'body', @@ -141,7 +141,7 @@ stockRoutes.post( stockRoutes.put( "/api/stock/ingredient/:id", - withCheck({ role: ["ACCOUNTANT", "ADMIN"] }), + withCheck({ role: ["MANAGER", "ADMIN"] }), (req: Request, res: Response) => { /* #swagger.parameters['id'] = { in: 'path', @@ -200,7 +200,7 @@ stockRoutes.delete("/api/stock/ingredient/:id", withCheck({ role: ["ADMIN"] }), stockRoutes.get( "/api/stock/ingredient/restaurant/:id", - withCheck({ role: ["ACCOUNTANT", "ADMIN"] }), + withCheck({ role: ["MANAGER", "ADMIN"] }), async (req: Request, res: Response) => { /* #swagger.parameters['id'] = { in: 'path', @@ -256,7 +256,7 @@ stockRoutes.get( stockRoutes.get( "/api/stock/ingredient/restaurant/by-restaurant/:id", - withCheck({ role: ["ACCOUNTANT", "ADMIN"] }), + withCheck({ role: ["MANAGER", "ADMIN"] }), async (req: Request, res: Response) => { /* #swagger.parameters['authorization'] = { in: 'header', @@ -304,7 +304,7 @@ stockRoutes.get( stockRoutes.get( "/api/stock/ingredient/restaurant/by-product/:id", - withCheck({ role: ["ACCOUNTANT", "ADMIN"] }), + withCheck({ role: ["MANAGER", "ADMIN"] }), (req: Request, res: Response) => { /* #swagger.parameters['authorization'] = { in: 'header', @@ -324,7 +324,7 @@ stockRoutes.get( stockRoutes.post( "/api/stock/ingredient/restaurant", - withCheck({ role: ["ACCOUNTANT", "ADMIN"] }), + withCheck({ role: ["MANAGER", "ADMIN"] }), async (req: Request, res: Response) => { /* #swagger.parameters['body'] = { in: 'body', @@ -389,7 +389,7 @@ stockRoutes.post( stockRoutes.put( "/api/stock/ingredient/restaurant/:id", - withCheck({ role: ["ACCOUNTANT", "ADMIN"] }), + withCheck({ role: ["MANAGER", "ADMIN"] }), async (req: Request, res: Response) => { /* #swagger.parameters['id'] = { @@ -461,7 +461,7 @@ stockRoutes.put( stockRoutes.delete( "/api/stock/ingredient/restaurant/:id", - withCheck({ role: ["ACCOUNTANT", "ADMIN"] }), + withCheck({ role: ["MANAGER", "ADMIN"] }), async (req: Request, res: Response) => { /* #swagger.parameters['id'] = { in: 'path', @@ -528,7 +528,7 @@ stockRoutes.delete( stockRoutes.get( "/api/stock/supplier/:id", - withCheck({ role: ["ACCOUNTANT", "ADMIN"] }), + withCheck({ role: ["MANAGER", "ADMIN"] }), (req: Request, res: Response) => { /* #swagger.parameters['id'] = { in: 'path', @@ -550,7 +550,7 @@ stockRoutes.get( }, ); -stockRoutes.get("/api/stock/supplier", withCheck({ role: ["ACCOUNTANT", "ADMIN"] }), (req: Request, res: Response) => { +stockRoutes.get("/api/stock/supplier", withCheck({ role: ["MANAGER", "ADMIN"] }), (req: Request, res: Response) => { /* #swagger.parameters['authorization'] = { in: 'header', required: true, @@ -563,7 +563,7 @@ stockRoutes.get("/api/stock/supplier", withCheck({ role: ["ACCOUNTANT", "ADMIN"] }); }); -stockRoutes.post("/api/stock/supplier", withCheck({ role: ["ACCOUNTANT", "ADMIN"] }), (req: Request, res: Response) => { +stockRoutes.post("/api/stock/supplier", withCheck({ role: ["MANAGER", "ADMIN"] }), (req: Request, res: Response) => { /* #swagger.parameters['body'] = { in: 'body', required: true, @@ -589,7 +589,7 @@ stockRoutes.post("/api/stock/supplier", withCheck({ role: ["ACCOUNTANT", "ADMIN" stockRoutes.put( "/api/stock/supplier/:id", - withCheck({ role: ["ACCOUNTANT", "ADMIN"] }), + withCheck({ role: ["MANAGER", "ADMIN"] }), (req: Request, res: Response) => { /* #swagger.parameters['id'] = { in: 'path', @@ -623,7 +623,7 @@ stockRoutes.put( stockRoutes.delete( "/api/stock/supplier/:id", - withCheck({ role: ["ACCOUNTANT", "ADMIN"] }), + withCheck({ role: ["MANAGER", "ADMIN"] }), (req: Request, res: Response) => { /* #swagger.parameters['id'] = { in: 'path', @@ -654,7 +654,7 @@ stockRoutes.delete( stockRoutes.get( "/api/stock/supply/order/:id", - withCheck({ role: ["ACCOUNTANT", "ADMIN"] }), + withCheck({ role: ["MANAGER", "ADMIN"] }), async (req: Request, res: Response) => { /* #swagger.parameters['id'] = { in: 'path', @@ -720,7 +720,7 @@ stockRoutes.get( stockRoutes.get( "/api/stock/supply/order/by-restaurant/:id", - withCheck({ role: ["ACCOUNTANT", "ADMIN"] }), + withCheck({ role: ["MANAGER", "ADMIN"] }), async (req: Request, res: Response) => { /* #swagger.parameters['id'] = { in: 'path', @@ -769,7 +769,7 @@ stockRoutes.get( stockRoutes.get( "/api/stock/supply/order/by-supplier/:id", - withCheck({ role: ["ACCOUNTANT", "ADMIN"] }), + withCheck({ role: ["MANAGER", "ADMIN"] }), (req: Request, res: Response) => { /* #swagger.parameters['id'] = { in: 'path', @@ -795,7 +795,7 @@ stockRoutes.get( stockRoutes.get( "/api/stock/supply/order/by-ingredient-restaurant/:id", - withCheck({ role: ["ACCOUNTANT", "ADMIN"] }), + withCheck({ role: ["MANAGER", "ADMIN"] }), async (req: Request, res: Response) => { /* #swagger.parameters['id'] = { in: 'path', @@ -858,7 +858,7 @@ stockRoutes.get( stockRoutes.post( "/api/stock/supply/order", - withCheck({ role: ["ACCOUNTANT", "ADMIN"] }), + withCheck({ role: ["MANAGER", "ADMIN"] }), async (req: Request, res: Response) => { /* #swagger.parameters['body'] = { in: 'body', @@ -928,7 +928,7 @@ stockRoutes.post( stockRoutes.put( "/api/stock/supply/order/:id", - withCheck({ role: ["ACCOUNTANT", "ADMIN"] }), + withCheck({ role: ["MANAGER", "ADMIN"] }), async (req: Request, res: Response) => { /* #swagger.parameters['id'] = { in: 'path', @@ -1013,7 +1013,7 @@ stockRoutes.put( stockRoutes.delete( "/api/stock/supply/order/:id", - withCheck({ role: ["ACCOUNTANT", "ADMIN"] }), + withCheck({ role: ["MANAGER", "ADMIN"] }), async (req: Request, res: Response) => { /* #swagger.parameters['id'] = { in: 'path', diff --git a/services/gateway/src/lib/swagger/swagger-output.json b/services/gateway/src/lib/swagger/swagger-output.json index fd87c4b8..e04da70b 100644 --- a/services/gateway/src/lib/swagger/swagger-output.json +++ b/services/gateway/src/lib/swagger/swagger-output.json @@ -4398,8 +4398,8 @@ "enum": [ "ADMIN", "USER", - "ACCOUNTANT", - "DELIVERER" + "MANAGER", + "DELIVERY_PERSON" ] }, "ProductType": { diff --git a/services/gateway/src/lib/swagger/swagger.utils.js b/services/gateway/src/lib/swagger/swagger.utils.js index 8f43b132..3c1c7d70 100644 --- a/services/gateway/src/lib/swagger/swagger.utils.js +++ b/services/gateway/src/lib/swagger/swagger.utils.js @@ -31,8 +31,8 @@ const doc = { '@enum': [ "ADMIN", "USER", - "ACCOUNTANT", - "DELIVERER" + "MANAGER", + "DELIVERY_PERSON" ] }, ProductType: { diff --git a/services/gateway/src/middleware/auth.ts b/services/gateway/src/middleware/auth.ts index 02538223..754c8a1a 100644 --- a/services/gateway/src/middleware/auth.ts +++ b/services/gateway/src/middleware/auth.ts @@ -4,8 +4,8 @@ import { Request, Response, NextFunction } from "express"; export const ROLES = { ADMIN: "ADMIN", USER: "USER", - ACCOUNTANT: "ACCOUNTANT", - DELIVERER: "DELIVERER", + MANAGER: "MANAGER", + DELIVERY_PERSON: "DELIVERY_PERSON", }; export type Role = keyof typeof ROLES; diff --git a/services/user/pkg/db/init/initialize.go b/services/user/pkg/db/init/initialize.go index 154c4fbc..a2fb64b4 100644 --- a/services/user/pkg/db/init/initialize.go +++ b/services/user/pkg/db/init/initialize.go @@ -46,12 +46,12 @@ func InitRoles(handler db.Handler) error { Code: "USER", }, { - Label: "Accountant", - Code: "ACCOUNTANT", + Label: "manager", + Code: "MANAGER", }, { - Label: "Deliverer", - Code: "DELIVERER", + Label: "delivery_person", + Code: "DELIVERY_PERSON", }, } From 604a92ccfa9f6125fedcd1a1e9f2168b19644801 Mon Sep 17 00:00:00 2001 From: anatole Date: Mon, 28 Aug 2023 22:28:54 +0200 Subject: [PATCH 531/883] feat(delivery service and gateway): add user_id to the delivery person --- services/basket/package.json | 2 +- services/delivery/prisma/schema.prisma | 1 + services/delivery/prisma/seed.ts | 3 ++ .../delivery/src/handlers/person/create.ts | 3 +- .../delivery/src/types/delivery-person.d.ts | 2 + .../src/controller/user/user.controller.ts | 32 +++++++++---- .../gateway/src/services/delivery.service.ts | 28 ++++++++++- services/proto/delivery.proto | 47 ++++++++++--------- 8 files changed, 83 insertions(+), 35 deletions(-) diff --git a/services/basket/package.json b/services/basket/package.json index 0d8931a7..fdcd8f24 100644 --- a/services/basket/package.json +++ b/services/basket/package.json @@ -4,7 +4,7 @@ "scripts": { "start": "node dist/index.js", "dev": "nodemon --watch 'src/**/*.ts' --exec 'ts-node' src/server.ts", - "build": "esbuild src/server.ts --bundle --platform=node --target=node18 --outfile=dist/index.js", + "build": "esbuild src/server.ts --bundle --platform=node --target=node18 --outfile=dist/index.js --minify", "test": "echo 'tests are disabled' # vitest", "coverage": "vitest --coverage", "pkg": "pkg ." diff --git a/services/delivery/prisma/schema.prisma b/services/delivery/prisma/schema.prisma index abfaba00..7a9ca29f 100644 --- a/services/delivery/prisma/schema.prisma +++ b/services/delivery/prisma/schema.prisma @@ -31,6 +31,7 @@ model Delivery { model DeliveryPerson { id String @id @default(cuid()) + user_id String first_name String last_name String phone String @unique diff --git a/services/delivery/prisma/seed.ts b/services/delivery/prisma/seed.ts index 66207fd5..262bd55a 100644 --- a/services/delivery/prisma/seed.ts +++ b/services/delivery/prisma/seed.ts @@ -5,18 +5,21 @@ const prisma = new PrismaClient(); const deliveryPerson: Prisma.DeliveryPersonCreateInput[] = [ { // id: "random_id", + user_id: "random_id", first_name: "John", last_name: "Doe", phone: "0612345678", location: [4.123, 52.123], }, { + user_id: "random_id", first_name: "Jane", last_name: "Doe", phone: "0612345679", location: [4.123, 52.124], }, { + user_id: "random_id", first_name: "Jack", last_name: "Doe", phone: "0612345677", diff --git a/services/delivery/src/handlers/person/create.ts b/services/delivery/src/handlers/person/create.ts index 6e8d7701..6d210fad 100644 --- a/services/delivery/src/handlers/person/create.ts +++ b/services/delivery/src/handlers/person/create.ts @@ -8,10 +8,11 @@ export const CreateDeliveryPerson = async ( callback: (err: any, response: any) => void ) => { try { - const { first_name, last_name, phone, location } = request; + const { user_id, first_name, last_name, phone, location } = request; const deliveryPerson = await prisma.deliveryPerson.create({ data: { + user_id, first_name, last_name, phone, diff --git a/services/delivery/src/types/delivery-person.d.ts b/services/delivery/src/types/delivery-person.d.ts index 5bb6731d..aff0af96 100644 --- a/services/delivery/src/types/delivery-person.d.ts +++ b/services/delivery/src/types/delivery-person.d.ts @@ -2,6 +2,7 @@ import { Delivery } from "@delivery/types/delivery"; export type DeliveryPerson = { id: string; + user_id: string; first_name: string; last_name: string; phone: string; @@ -11,6 +12,7 @@ export type DeliveryPerson = { }; export type DeliveryPersonCreateInput = { + user_id: string, first_name: string; last_name: string; phone: string; diff --git a/services/gateway/src/controller/user/user.controller.ts b/services/gateway/src/controller/user/user.controller.ts index 30380471..23910e9c 100644 --- a/services/gateway/src/controller/user/user.controller.ts +++ b/services/gateway/src/controller/user/user.controller.ts @@ -6,7 +6,6 @@ import { DeleteInput, logInInput, MainAddress, - Role, RoleInput, UpdateUserInput, User, @@ -15,6 +14,7 @@ import { } from "@gateway/proto/user_pb"; import { Empty } from "google-protobuf/google/protobuf/empty_pb"; import { getUser, getUserIdFromToken } from "@gateway/services/user.service"; +import { createDeliveryPerson} from "@gateway/services/delivery.service"; import { check, withCheck } from "@gateway/middleware/auth"; export const userRoutes = Router(); @@ -288,17 +288,31 @@ userRoutes.put("/api/user/:id/role", withCheck({ role: "ADMIN" }), async (req: R if (Number(id) === userId) return res.status(403).json({ message: "Forbidden" }); // ---------------------------- - const updatePasswordInput = new changeRoleInput(); + const roleInput = new changeRoleInput(); + try { - updatePasswordInput.setToken(token).setUserid(Number(id)).setRolecode(req.body.role); + roleInput.setToken(token).setUserid(Number(id)).setRolecode(req.body.role); } catch (e: any) { res.json({ error: e.message }); } - userServiceClient.changeRole(updatePasswordInput, (error, response) => { - if (error) { - res.status(500).send({ error: error.message }); - } else { - res.json(response.toObject()); + let user: User.AsObject | undefined = undefined; + try { + user = await new Promise((resolve, reject) => { + userServiceClient.changeRole(roleInput, (error, response) => { + if (error) reject(error); + else resolve(response.toObject().user); + }); + }); + } catch (error) { + res.status(500).send({ error }); + } + + if (user && user.role?.code === "DELIVERY_PERSON") { + try { + await createDeliveryPerson(user.id, user.firstName, user.lastName, user.phone, []); + } catch (error) { + res.status(500).send({ error }); } - }); + } + res.json(user); }); diff --git a/services/gateway/src/services/delivery.service.ts b/services/gateway/src/services/delivery.service.ts index ac01d8c4..8e762fa3 100644 --- a/services/gateway/src/services/delivery.service.ts +++ b/services/gateway/src/services/delivery.service.ts @@ -1,5 +1,5 @@ -import { deliveryServiceClient } from "@gateway/services/clients/delivery.client"; -import { Delivery, DeliveryCreateInput, Status } from "@gateway/proto/delivery_pb"; +import { deliveryPersonServiceClient, deliveryServiceClient } from "@gateway/services/clients/delivery.client"; +import { Delivery, DeliveryCreateInput, DeliveryPersonCreateInput, Status } from "@gateway/proto/delivery_pb"; export const createDelivery = ( address: string, @@ -29,3 +29,27 @@ export const createDelivery = ( const getEtaByUserAddress = (address: string) => { return new Date().toString(); }; + +export const createDeliveryPerson = ( + idUser: number, + firstName: string, + lastName: string, + phone: string, + locationList: number[], +) => { + const deliveryPerson = new DeliveryPersonCreateInput() + .setUserId(String(idUser)) + .setFirstName(firstName) + .setLastName(lastName) + .setPhone(phone) + .setLocationList(locationList); + return new Promise((resolve, reject) => { + deliveryPersonServiceClient.createDeliveryPerson(deliveryPerson, (error, response) => { + if (error) { + reject(error); + } else { + resolve(response); + } + }); + }); +}; diff --git a/services/proto/delivery.proto b/services/proto/delivery.proto index 1e43d08e..fc5d5e16 100644 --- a/services/proto/delivery.proto +++ b/services/proto/delivery.proto @@ -19,12 +19,13 @@ message Delivery { message DeliveryPerson { string id = 1; - string first_name = 2; - string last_name = 3; - string phone = 4; - repeated float location = 5; + string user_id = 2; + string first_name = 3; + string last_name = 4; + string phone = 5; + repeated float location = 6; - repeated Delivery deliveries = 6; + repeated Delivery deliveries = 7; } enum Status { @@ -45,26 +46,27 @@ service DeliveryService { } service DeliveryPersonService { - rpc CreateDeliveryPerson (DeliveryPersonCreateInput) returns (DeliveryPerson) {} - rpc GetDeliveryPerson (DeliveryPersonId) returns (DeliveryPerson) {} - rpc UpdateDeliveryPerson (DeliveryPerson) returns (DeliveryPerson) {} - rpc DeleteDeliveryPerson (DeliveryPersonId) returns (google.protobuf.Empty) {} - rpc ListDeliveryPersons (google.protobuf.Empty) returns (DeliveryPersonList) {} - rpc ListNearDeliveryPersons (Location) returns (DeliveryPersonList) {} + rpc CreateDeliveryPerson (DeliveryPersonCreateInput) returns (DeliveryPerson) {} + rpc GetDeliveryPerson (DeliveryPersonId) returns (DeliveryPerson) {} + rpc UpdateDeliveryPerson (DeliveryPerson) returns (DeliveryPerson) {} + rpc DeleteDeliveryPerson (DeliveryPersonId) returns (google.protobuf.Empty) {} + rpc ListDeliveryPersons (google.protobuf.Empty) returns (DeliveryPersonList) {} + rpc ListNearDeliveryPersons (Location) returns (DeliveryPersonList) {} } message DeliveryId { - string id = 1; + string id = 1; } + message DeliveryCreateInput { - string eta = 1; - string address = 2; - Status status = 3; - string delivery_person_id = 4; + string eta = 1; + string address = 2; + Status status = 3; + string delivery_person_id = 4; - string user_id = 5; - string restaurant_id = 6; + string user_id = 5; + string restaurant_id = 6; } message UserId { @@ -87,10 +89,11 @@ message DeliveryPersonId { string id = 1; } message DeliveryPersonCreateInput { - string first_name = 1; - string last_name = 2; - string phone = 3; - repeated float location = 4; + string user_id = 1; + string first_name = 2; + string last_name = 3; + string phone = 4; + repeated float location = 5; } message Location { From 2403075f9c7eb622d244f617346a205f381d1d67 Mon Sep 17 00:00:00 2001 From: Florian LEROUX Date: Mon, 28 Aug 2023 23:24:06 +0200 Subject: [PATCH 532/883] fix(reporting): expose 8080 and change pushmetric request type --- .../gateway/src/controller/metric/metric.controller.ts | 9 ++++----- services/reporting/Dockerfile | 1 + 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/services/gateway/src/controller/metric/metric.controller.ts b/services/gateway/src/controller/metric/metric.controller.ts index 1e535dca..0027318b 100644 --- a/services/gateway/src/controller/metric/metric.controller.ts +++ b/services/gateway/src/controller/metric/metric.controller.ts @@ -11,7 +11,7 @@ import { GetMetricsByRestaurantRequest, GetRestaurantGroupRequest, GetRestaurantRequest, - Metric, + PushMetricRequest, UpdateRestaurantGroupRequest, UpdateRestaurantRequest, } from "@gateway/proto/metric_pb"; @@ -293,9 +293,8 @@ metricRoutes.post("/api/metric", withCheck({ role: ["ACCOUNTANT", "ADMIN"] }), ( required: true, schema: { restaurantId: "restaurant_id:1", - code: "income_1h", + code: "incomes_1h", value: "99.99", - key :"example_key" } } #swagger.parameters['authorization'] = { @@ -303,8 +302,8 @@ metricRoutes.post("/api/metric", withCheck({ role: ["ACCOUNTANT", "ADMIN"] }), ( required: true, type: 'string' } */ - const { restaurantId, code, value, key } = req.body; - const newMetric = new Metric().setKey(key).setRestaurantId(restaurantId).setCode(code).setValue(value); + const { restaurantId, code, value } = req.body; + const newMetric = new PushMetricRequest().setRestaurantId(restaurantId).setCode(code).setValue(value); metricService.pushMetric(newMetric, (error, response) => { if (error) return res.status(500).send({ error }); diff --git a/services/reporting/Dockerfile b/services/reporting/Dockerfile index efe3edae..c07595cf 100644 --- a/services/reporting/Dockerfile +++ b/services/reporting/Dockerfile @@ -22,4 +22,5 @@ ENV PATH="${PATH}:/root/.dotnet/tools" # Expose port and specify startup command EXPOSE 50020 +EXPOSE 8080 CMD ["sh", "script.sh"] From ce2146f357e9575cde152fdfbc713935a001688c Mon Sep 17 00:00:00 2001 From: anatole Date: Tue, 29 Aug 2023 00:23:03 +0200 Subject: [PATCH 533/883] feat(delivery service): add migration --- .../migration.sql | 8 ++++++++ .../20230828214342_make_user_id_unique/migration.sql | 8 ++++++++ services/delivery/prisma/schema.prisma | 2 +- 3 files changed, 17 insertions(+), 1 deletion(-) create mode 100644 services/delivery/prisma/migrations/20230828193437_add_user_id_in_delivery_person/migration.sql create mode 100644 services/delivery/prisma/migrations/20230828214342_make_user_id_unique/migration.sql diff --git a/services/delivery/prisma/migrations/20230828193437_add_user_id_in_delivery_person/migration.sql b/services/delivery/prisma/migrations/20230828193437_add_user_id_in_delivery_person/migration.sql new file mode 100644 index 00000000..af56f214 --- /dev/null +++ b/services/delivery/prisma/migrations/20230828193437_add_user_id_in_delivery_person/migration.sql @@ -0,0 +1,8 @@ +/* + Warnings: + + - Added the required column `user_id` to the `DeliveryPerson` table without a default value. This is not possible if the table is not empty. + +*/ +-- AlterTable +ALTER TABLE "DeliveryPerson" ADD COLUMN "user_id" TEXT NOT NULL; diff --git a/services/delivery/prisma/migrations/20230828214342_make_user_id_unique/migration.sql b/services/delivery/prisma/migrations/20230828214342_make_user_id_unique/migration.sql new file mode 100644 index 00000000..9f8f3fb5 --- /dev/null +++ b/services/delivery/prisma/migrations/20230828214342_make_user_id_unique/migration.sql @@ -0,0 +1,8 @@ +/* + Warnings: + + - A unique constraint covering the columns `[user_id]` on the table `DeliveryPerson` will be added. If there are existing duplicate values, this will fail. + +*/ +-- CreateIndex +CREATE UNIQUE INDEX "DeliveryPerson_user_id_key" ON "DeliveryPerson"("user_id"); diff --git a/services/delivery/prisma/schema.prisma b/services/delivery/prisma/schema.prisma index 7a9ca29f..e2b9d4d3 100644 --- a/services/delivery/prisma/schema.prisma +++ b/services/delivery/prisma/schema.prisma @@ -31,7 +31,7 @@ model Delivery { model DeliveryPerson { id String @id @default(cuid()) - user_id String + user_id String @unique first_name String last_name String phone String @unique From 0b13b2c276551cda68e5bc60c76f74bbde70d2c8 Mon Sep 17 00:00:00 2001 From: anatole Date: Tue, 29 Aug 2023 08:57:58 +0200 Subject: [PATCH 534/883] feat(delivery service): add get delivery person by user --- .../delivery/src/handlers/person/get-user.ts | 23 +++++++++++ .../delivery/src/handlers/person/index.ts | 2 + .../delivery/src/types/delivery-person.d.ts | 1 + .../delivery/deliveryPerson.controller.ts | 39 ++++++++++++++++++- .../src/lib/swagger/swagger-output.json | 34 +++++++++++++--- services/proto/delivery.proto | 5 +++ 6 files changed, 98 insertions(+), 6 deletions(-) create mode 100644 services/delivery/src/handlers/person/get-user.ts diff --git a/services/delivery/src/handlers/person/get-user.ts b/services/delivery/src/handlers/person/get-user.ts new file mode 100644 index 00000000..543694d8 --- /dev/null +++ b/services/delivery/src/handlers/person/get-user.ts @@ -0,0 +1,23 @@ +import { log } from "@delivery/lib/log"; +import prisma from "@delivery/lib/prisma"; +import { Data } from "@delivery/types"; +import { DeliveryPersonUserId } from "@delivery/types/delivery-person"; + +export const GetDeliveryPersonByUser = async ( + { request }: Data, + callback: (err: any, response: any) => void +) => { + try { + const { id } = request; + const deliveryPerson = await prisma.deliveryPerson.findUnique({ + where: { user_id: id }, + include:{ + deliveries: true, + } + }); + callback(null, deliveryPerson); + } catch (error) { + log.error(error); + callback(error, null); + } +}; diff --git a/services/delivery/src/handlers/person/index.ts b/services/delivery/src/handlers/person/index.ts index 7270442c..de610ec5 100644 --- a/services/delivery/src/handlers/person/index.ts +++ b/services/delivery/src/handlers/person/index.ts @@ -1,5 +1,6 @@ import { CreateDeliveryPerson } from "@delivery/handlers/person/create"; import { GetDeliveryPerson } from "@delivery/handlers/person/get"; +import { GetDeliveryPersonByUser } from "@delivery/handlers/person/get-user"; import { UpdateDeliveryPerson } from "@delivery/handlers/person/update"; import { DeleteDeliveryPerson } from "@delivery/handlers/person/delete"; import { ListDeliveryPersons } from "@delivery/handlers/person/list"; @@ -7,6 +8,7 @@ import { ListNearDeliveryPersons } from "@delivery/handlers/person/list-near"; export default { CreateDeliveryPerson, + GetDeliveryPersonByUser, GetDeliveryPerson, UpdateDeliveryPerson, DeleteDeliveryPerson, diff --git a/services/delivery/src/types/delivery-person.d.ts b/services/delivery/src/types/delivery-person.d.ts index aff0af96..1dec4c2b 100644 --- a/services/delivery/src/types/delivery-person.d.ts +++ b/services/delivery/src/types/delivery-person.d.ts @@ -25,3 +25,4 @@ export type LocationInput = { }; export type DeliveryPersonId = { id: DeliveryPerson["id"] }; +export type DeliveryPersonUserId = { id: DeliveryPerson["id"] }; diff --git a/services/gateway/src/controller/delivery/deliveryPerson.controller.ts b/services/gateway/src/controller/delivery/deliveryPerson.controller.ts index 55fef42f..0a1a4d30 100644 --- a/services/gateway/src/controller/delivery/deliveryPerson.controller.ts +++ b/services/gateway/src/controller/delivery/deliveryPerson.controller.ts @@ -1,9 +1,16 @@ import { Router } from "express"; import { deliveryPersonServiceClient } from "@gateway/services/clients/delivery.client"; -import { DeliveryPerson, DeliveryPersonCreateInput, DeliveryPersonId, Location } from "@gateway/proto/delivery_pb"; +import { + DeliveryPerson, + DeliveryPersonCreateInput, + DeliveryPersonId, + DeliveryPersonUserId, + Location +} from "@gateway/proto/delivery_pb"; import { Empty } from "google-protobuf/google/protobuf/empty_pb"; import { getUserIdFromToken } from "@gateway/services/user.service"; import { withCheck } from "@gateway/middleware/auth"; +import {log} from "@gateway/lib/log/log"; export const deliveryPersonRoutes = Router(); @@ -48,6 +55,12 @@ deliveryPersonRoutes.get("/api/delivery-person/near", async (req, res) => { }); deliveryPersonRoutes.get("/api/delivery-person/:id", async (req, res) => { + /* #swagger.parameters['authorization'] = { + in: 'header', + required: true, + type: 'string' + } */ + // Auth check and :id check --- const { authorization } = req.headers; if (!authorization) return res.status(401).json({ message: "Unauthorized" }); @@ -64,6 +77,27 @@ deliveryPersonRoutes.get("/api/delivery-person/:id", async (req, res) => { }); }); +deliveryPersonRoutes.get("/api/delivery-person/by-user", withCheck({ role: "MANAGER" }), async (req, res) => { + /* #swagger.parameters['authorization'] = { + in: 'header', + required: true, + type: 'string' + } */ + log.error(req) + // Auth check and :id check --- + const { authorization } = req.headers; + if (!authorization) return res.status(401).json({ message: "Unauthorized" }); + const token = authorization.split("Bearer ")[1]; + const userId = await getUserIdFromToken(token); + if (!userId) return res.status(401).json({ message: "Unauthorized" }); + // ---------------------------- + + deliveryPersonServiceClient.getDeliveryPersonByUser(new DeliveryPersonUserId().setId(String(userId)), (error, response) => { + if (error) return res.status(500).send({ error }); + else return res.status(200).json(response.toObject()); + }); +}); + deliveryPersonRoutes.post("/api/delivery-person", withCheck({ role: "ADMIN" }), async (req, res) => { /* #swagger.parameters['body'] = { in: 'body', @@ -88,6 +122,7 @@ deliveryPersonRoutes.post("/api/delivery-person", withCheck({ role: "ADMIN" }), .setPhone(phone) .setLocationList(locationList); deliveryPersonServiceClient.createDeliveryPerson(deliveryPerson, (error, response) => { + log.error(error) if (error) return res.status(500).send({ error }); else return res.status(201).json(response.toObject()); }); @@ -109,6 +144,7 @@ deliveryPersonRoutes.put("/api/delivery-person/:id", withCheck({ role: "ADMIN" } required: true, type: 'string' } */ + const { id } = req.params; const { firstName, lastName, phone, locationList } = req.body; const deliveryPerson = new DeliveryPerson() @@ -130,6 +166,7 @@ deliveryPersonRoutes.delete("/api/delivery-person/:id", withCheck({ role: "ADMIN required: true, type: 'string' } */ + const { id } = req.params; deliveryPersonServiceClient.deleteDeliveryPerson(new DeliveryPersonId().setId(id), (error, response) => { diff --git a/services/gateway/src/lib/swagger/swagger-output.json b/services/gateway/src/lib/swagger/swagger-output.json index e04da70b..c8dd526c 100644 --- a/services/gateway/src/lib/swagger/swagger-output.json +++ b/services/gateway/src/lib/swagger/swagger-output.json @@ -2419,6 +2419,7 @@ { "name": "authorization", "in": "header", + "required": true, "type": "string" } ], @@ -2523,6 +2524,33 @@ } } }, + "/api/delivery-person/by-user": { + "get": { + "tags": [ + "Delivery" + ], + "description": "", + "parameters": [ + { + "name": "authorization", + "in": "header", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "OK" + }, + "401": { + "description": "Unauthorized" + }, + "500": { + "description": "Internal Server Error" + } + } + } + }, "/api/log": { "get": { "tags": [ @@ -3028,15 +3056,11 @@ }, "code": { "type": "string", - "example": "income_1h" + "example": "incomes_1h" }, "value": { "type": "string", "example": "99.99" - }, - "key": { - "type": "string", - "example": "example_key" } } } diff --git a/services/proto/delivery.proto b/services/proto/delivery.proto index fc5d5e16..4faa5fe0 100644 --- a/services/proto/delivery.proto +++ b/services/proto/delivery.proto @@ -48,6 +48,7 @@ service DeliveryService { service DeliveryPersonService { rpc CreateDeliveryPerson (DeliveryPersonCreateInput) returns (DeliveryPerson) {} rpc GetDeliveryPerson (DeliveryPersonId) returns (DeliveryPerson) {} + rpc GetDeliveryPersonByUser (DeliveryPersonUserId) returns (DeliveryPerson) {} rpc UpdateDeliveryPerson (DeliveryPerson) returns (DeliveryPerson) {} rpc DeleteDeliveryPerson (DeliveryPersonId) returns (google.protobuf.Empty) {} rpc ListDeliveryPersons (google.protobuf.Empty) returns (DeliveryPersonList) {} @@ -88,6 +89,10 @@ message DeliveryPersonList { message DeliveryPersonId { string id = 1; } + +message DeliveryPersonUserId { + string id = 1; +} message DeliveryPersonCreateInput { string user_id = 1; string first_name = 2; From d69d7a0aa29d0069f5050f1a9d61e587f5eab449 Mon Sep 17 00:00:00 2001 From: Florian LEROUX Date: Tue, 29 Aug 2023 09:08:04 +0200 Subject: [PATCH 535/883] fix(docker): add restart always for gateway --- .gitignore | 3 +++ services/docker-compose.yml | 1 + 2 files changed, 4 insertions(+) diff --git a/.gitignore b/.gitignore index 311feb07..5c1bb120 100644 --- a/.gitignore +++ b/.gitignore @@ -42,6 +42,9 @@ terraform.rc !.vscode/extensions.json !.vscode/*.code-snippets +### IDEA ### +.idea + # Local History for Visual Studio Code .history/ diff --git a/services/docker-compose.yml b/services/docker-compose.yml index e660974e..f5b3936c 100644 --- a/services/docker-compose.yml +++ b/services/docker-compose.yml @@ -5,6 +5,7 @@ services: gateway: image: goodfood-gateway:1.0.0 + restart: always build: context: . dockerfile: ./gateway/Dockerfile From 5d8025a8fb326d97c7a218743fd7af9d580eb579 Mon Sep 17 00:00:00 2001 From: Florian LEROUX Date: Tue, 29 Aug 2023 09:22:46 +0200 Subject: [PATCH 536/883] ref(gateway/user): match codestyle --- .../src/controller/user/user.controller.ts | 74 +++++++------------ 1 file changed, 28 insertions(+), 46 deletions(-) diff --git a/services/gateway/src/controller/user/user.controller.ts b/services/gateway/src/controller/user/user.controller.ts index 23910e9c..9739c486 100644 --- a/services/gateway/src/controller/user/user.controller.ts +++ b/services/gateway/src/controller/user/user.controller.ts @@ -14,7 +14,7 @@ import { } from "@gateway/proto/user_pb"; import { Empty } from "google-protobuf/google/protobuf/empty_pb"; import { getUser, getUserIdFromToken } from "@gateway/services/user.service"; -import { createDeliveryPerson} from "@gateway/services/delivery.service"; +import { createDeliveryPerson } from "@gateway/services/delivery.service"; import { check, withCheck } from "@gateway/middleware/auth"; export const userRoutes = Router(); @@ -39,9 +39,9 @@ userRoutes.get("/api/user/:id", async (req: Request, res: Response) => { try { const user = await getUser(Number(id)); - res.json(user?.toObject()); - } catch (e: any) { - res.json({ error: e.message }); + return res.status(200).json(user?.toObject()); + } catch (error) { + return res.status(500).json({ error }); } }); @@ -53,7 +53,7 @@ userRoutes.get("/api/user", withCheck({ role: "ADMIN" }), (req: Request, res: Re } */ userServiceClient.listUser(new Empty(), (error, response) => { if (error) res.status(500).send({ error: error.message }); - else res.json(response.toObject()); + else return res.json(response.toObject()); }); }); @@ -87,16 +87,13 @@ userRoutes.post("/api/user/register", (req: Request, res: Response) => { .setPhone(phone) .setMainaddress(address) .setRole(new RoleInput().setCode(roleCode)); - } catch (e: any) { - res.json({ error: e.message }); + } catch (error) { + return res.status(500).json({ error }); } userServiceClient.register(userInput, (error, response) => { - if (error) { - res.status(500).send({ error: error.message }); - } else { - res.json(response.toObject()); - } + if (error) return res.status(500).send({ error }); + else return res.status(201).json(response.toObject()); }); }); @@ -143,16 +140,13 @@ userRoutes.put("/api/user", async (req: Request, res: Response) => { .setMainaddress(address); userInput.setUser(user).setToken(token); - } catch (e: any) { - res.json({ error: e.message }); + } catch (error) { + res.status(200).json({ error }); } userServiceClient.updateUser(userInput, (error, response) => { - if (error) { - res.status(500).send({ error: error.message }); - } else { - res.json(response.toObject()); - } + if (error) return res.status(500).send({ error }); + else return res.status(200).json(response.toObject()); }); }); @@ -174,11 +168,8 @@ userRoutes.delete("/api/user/:id", (req: Request, res: Response) => { // The delete route in the user service implement the user validation userServiceClient.deleteUser(new DeleteInput().setUserid(Number(id)).setToken(token), (error, response) => { - if (error) { - res.status(500).send({ error: error.message }); - } else { - res.json(response.toObject()); - } + if (error) return res.status(500).send({ error }); + else return res.status(200).json(response.toObject()); }); }); @@ -195,11 +186,8 @@ userRoutes.post("/api/user/login", (req: Request, res: Response) => { const inInput = new logInInput().setEmail(email).setPassword(password); userServiceClient.logIn(inInput, (error, response) => { - if (error) { - res.status(500).send({ error: error.message }); - } else { - res.json(response.toObject()); - } + if (error) return res.status(500).send({ error }); + else return res.status(200).json(response.toObject()); }); }); @@ -216,11 +204,8 @@ userRoutes.post("/api/user/validate", (req: Request, res: Response) => { const validate = new validateInput().setToken(token); userServiceClient.validate(validate, (error, response) => { - if (error) { - res.status(500).send({ error: error.message }); - } else { - res.json(response.toObject()); - } + if (error) return res.status(500).send({ error }); + else return res.status(200).json(response.toObject()); }); }); @@ -247,16 +232,13 @@ userRoutes.put("/api/user/password", (req: Request, res: Response) => { const updatePasswordInput = new changePasswordInput(); try { updatePasswordInput.setToken(token).setOldpassword(oldpassword).setNewpassword(password); - } catch (e: any) { - res.json({ error: e.message }); + } catch (error) { + return res.status(500).json({ error }); } userServiceClient.changePassword(updatePasswordInput, (error, response) => { - if (error) { - res.status(500).send({ error: error.message }); - } else { - res.json(response.toObject()); - } + if (error) return res.status(500).send({ error }); + else return res.status(200).json(response.toObject()); }); }); @@ -292,8 +274,8 @@ userRoutes.put("/api/user/:id/role", withCheck({ role: "ADMIN" }), async (req: R try { roleInput.setToken(token).setUserid(Number(id)).setRolecode(req.body.role); - } catch (e: any) { - res.json({ error: e.message }); + } catch (error) { + return res.status(500).json({ error }); } let user: User.AsObject | undefined = undefined; try { @@ -304,15 +286,15 @@ userRoutes.put("/api/user/:id/role", withCheck({ role: "ADMIN" }), async (req: R }); }); } catch (error) { - res.status(500).send({ error }); + return res.status(500).send({ error }); } if (user && user.role?.code === "DELIVERY_PERSON") { try { await createDeliveryPerson(user.id, user.firstName, user.lastName, user.phone, []); } catch (error) { - res.status(500).send({ error }); + return res.status(500).send({ error }); } } - res.json(user); + return res.status(200).json(user); }); From 5736e171e82c9e27921f75dc232e158b95e4b62c Mon Sep 17 00:00:00 2001 From: Florian LEROUX Date: Tue, 29 Aug 2023 09:28:23 +0200 Subject: [PATCH 537/883] fix(docker): add restart unless-stopped --- services/docker-compose.yml | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/services/docker-compose.yml b/services/docker-compose.yml index f5b3936c..1ed9d341 100644 --- a/services/docker-compose.yml +++ b/services/docker-compose.yml @@ -5,7 +5,7 @@ services: gateway: image: goodfood-gateway:1.0.0 - restart: always + restart: unless-stopped build: context: . dockerfile: ./gateway/Dockerfile @@ -20,12 +20,12 @@ services: user-service: image: goodfood-user:1.0.0 + restart: unless-stopped build: context: . dockerfile: ./user/Dockerfile depends_on: - user-postgres - restart: always env_file: - user/dev.env ports: @@ -51,6 +51,7 @@ services: basket-service: image: goodfood-basket:1.0.0 + restart: unless-stopped build: context: . dockerfile: ./basket/Dockerfile @@ -78,12 +79,12 @@ services: payment-service: image: goodfood-payment:1.0.0 + restart: unless-stopped build: context: . dockerfile: ./payment/Dockerfile depends_on: - payment-postgres - restart: always env_file: - payment/.env.docker ports: @@ -110,6 +111,7 @@ services: product-service: image: goodfood-product:1.0.0 + restart: unless-stopped build: context: . dockerfile: ./product/Dockerfile @@ -138,6 +140,7 @@ services: restaurant-service: image: goodfood-restaurant:1.0.0 + restart: unless-stopped build: context: . dockerfile: ./restaurant/Dockerfile @@ -150,6 +153,7 @@ services: restaurant-postgres: image: postgres:latest + restart: unless-stopped ports: - "51005:5432" volumes: @@ -166,6 +170,7 @@ services: promotion-service: image: goodfood-promotion:1.0.0 + restart: unless-stopped build: context: . dockerfile: ./promotions/Dockerfile @@ -194,6 +199,7 @@ services: order-service: image: goodfood-order:1.0.0 + restart: unless-stopped build: context: . dockerfile: ./order/Dockerfile @@ -222,6 +228,7 @@ services: delivery-service: image: goodfood-delivery:1.0.0 + restart: unless-stopped build: context: . dockerfile: ./delivery/Dockerfile @@ -263,6 +270,7 @@ services: stock-service: image: goodfood-stock:1.0.0 + restart: unless-stopped build: context: . dockerfile: ./stock/Dockerfile @@ -291,6 +299,7 @@ services: reporting-service: image: floriaaan/goodfood-reporting:latest + restart: unless-stopped build: context: . dockerfile: ./reporting/Dockerfile @@ -317,8 +326,7 @@ services: depends_on: - log-postgres - event-broker - restart: - always + restart: unless-stopped image: floriaaan/goodfood-log:latest build: context: . @@ -346,6 +354,7 @@ services: notification-service: image: goodfood-notification:1.0.0 + restart: unless-stopped build: context: . dockerfile: ./notification/Dockerfile From 1d7d2bdf8efcd731901301339bd06bb42376c3c1 Mon Sep 17 00:00:00 2001 From: Florian LEROUX Date: Tue, 29 Aug 2023 09:55:01 +0200 Subject: [PATCH 538/883] fix(gateway): change order of handlers in delivery person --- .../delivery/src/handlers/person/get-user.ts | 4 +- .../delivery/deliveryPerson.controller.ts | 46 ++++++++++--------- 2 files changed, 25 insertions(+), 25 deletions(-) diff --git a/services/delivery/src/handlers/person/get-user.ts b/services/delivery/src/handlers/person/get-user.ts index 543694d8..8690f03f 100644 --- a/services/delivery/src/handlers/person/get-user.ts +++ b/services/delivery/src/handlers/person/get-user.ts @@ -11,9 +11,7 @@ export const GetDeliveryPersonByUser = async ( const { id } = request; const deliveryPerson = await prisma.deliveryPerson.findUnique({ where: { user_id: id }, - include:{ - deliveries: true, - } + include: { deliveries: true }, }); callback(null, deliveryPerson); } catch (error) { diff --git a/services/gateway/src/controller/delivery/deliveryPerson.controller.ts b/services/gateway/src/controller/delivery/deliveryPerson.controller.ts index 0a1a4d30..d2eab2d9 100644 --- a/services/gateway/src/controller/delivery/deliveryPerson.controller.ts +++ b/services/gateway/src/controller/delivery/deliveryPerson.controller.ts @@ -5,12 +5,12 @@ import { DeliveryPersonCreateInput, DeliveryPersonId, DeliveryPersonUserId, - Location + Location, } from "@gateway/proto/delivery_pb"; import { Empty } from "google-protobuf/google/protobuf/empty_pb"; import { getUserIdFromToken } from "@gateway/services/user.service"; import { withCheck } from "@gateway/middleware/auth"; -import {log} from "@gateway/lib/log/log"; +import { log } from "@gateway/lib/log/log"; export const deliveryPersonRoutes = Router(); @@ -54,13 +54,12 @@ deliveryPersonRoutes.get("/api/delivery-person/near", async (req, res) => { }); }); -deliveryPersonRoutes.get("/api/delivery-person/:id", async (req, res) => { +deliveryPersonRoutes.get("/api/delivery-person/by-user", withCheck({ role: "DELIVERY_PERSON" }), async (req, res) => { /* #swagger.parameters['authorization'] = { - in: 'header', - required: true, - type: 'string' - } */ - + in: 'header', + required: true, + type: 'string' + } */ // Auth check and :id check --- const { authorization } = req.headers; if (!authorization) return res.status(401).json({ message: "Unauthorized" }); @@ -69,21 +68,22 @@ deliveryPersonRoutes.get("/api/delivery-person/:id", async (req, res) => { if (!userId) return res.status(401).json({ message: "Unauthorized" }); // ---------------------------- - const { id } = req.params; - - deliveryPersonServiceClient.getDeliveryPerson(new DeliveryPersonId().setId(id), (error, response) => { - if (error) return res.status(500).send({ error }); - else return res.status(200).json(response.toObject()); - }); + deliveryPersonServiceClient.getDeliveryPersonByUser( + new DeliveryPersonUserId().setId(String(userId)), + (error, response) => { + if (error) return res.status(500).send({ error }); + else return res.status(200).json(response.toObject()); + }, + ); }); -deliveryPersonRoutes.get("/api/delivery-person/by-user", withCheck({ role: "MANAGER" }), async (req, res) => { +deliveryPersonRoutes.get("/api/delivery-person/:id", async (req, res) => { /* #swagger.parameters['authorization'] = { - in: 'header', - required: true, - type: 'string' - } */ - log.error(req) + in: 'header', + required: true, + type: 'string' + } */ + // Auth check and :id check --- const { authorization } = req.headers; if (!authorization) return res.status(401).json({ message: "Unauthorized" }); @@ -92,7 +92,9 @@ deliveryPersonRoutes.get("/api/delivery-person/by-user", withCheck({ role: "MANA if (!userId) return res.status(401).json({ message: "Unauthorized" }); // ---------------------------- - deliveryPersonServiceClient.getDeliveryPersonByUser(new DeliveryPersonUserId().setId(String(userId)), (error, response) => { + const { id } = req.params; + + deliveryPersonServiceClient.getDeliveryPerson(new DeliveryPersonId().setId(id), (error, response) => { if (error) return res.status(500).send({ error }); else return res.status(200).json(response.toObject()); }); @@ -122,7 +124,7 @@ deliveryPersonRoutes.post("/api/delivery-person", withCheck({ role: "ADMIN" }), .setPhone(phone) .setLocationList(locationList); deliveryPersonServiceClient.createDeliveryPerson(deliveryPerson, (error, response) => { - log.error(error) + log.error(error); if (error) return res.status(500).send({ error }); else return res.status(201).json(response.toObject()); }); From c843cdd266a9c25ac8e31767f49e02694465eaed Mon Sep 17 00:00:00 2001 From: Florian LEROUX Date: Tue, 29 Aug 2023 10:15:04 +0200 Subject: [PATCH 539/883] fix(gateway/restaurant): fix delete --- .../controller/restaurant/restaurant.controller.ts | 11 +++++++++-- services/proto/restaurant.proto | 6 +++++- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/services/gateway/src/controller/restaurant/restaurant.controller.ts b/services/gateway/src/controller/restaurant/restaurant.controller.ts index 0eff2125..0f0e015d 100644 --- a/services/gateway/src/controller/restaurant/restaurant.controller.ts +++ b/services/gateway/src/controller/restaurant/restaurant.controller.ts @@ -2,7 +2,12 @@ import { Request, Response, Router } from "express"; import { restaurantServiceClient } from "@gateway/services/clients/restaurant.client"; import { RestaurantId } from "@gateway/proto/product_pb"; import { Empty } from "google-protobuf/google/protobuf/empty_pb"; -import { ByLocationInput, Restaurant, RestaurantCreateInput } from "@gateway/proto/restaurant_pb"; +import { + ByLocationInput, + Restaurant, + RestaurantCreateInput, + RestaurantDeleteInput, +} from "@gateway/proto/restaurant_pb"; import { withCheck } from "@gateway/middleware/auth"; export const restaurantRoutes = Router(); @@ -142,8 +147,10 @@ restaurantRoutes.delete("/api/restaurant/:id", withCheck({ role: "ADMIN" }), (re } */ const { id } = req.params; + const restaurantId = new RestaurantDeleteInput().setId(id.toString()); - restaurantServiceClient.deleteRestaurant(new RestaurantId().setId(id), (error, response) => { + restaurantServiceClient.deleteRestaurant(restaurantId, (error, response) => { + console.log({ error, response }); if (error) return res.status(500).send({ error }); else return res.status(200).json(response.toObject()); }); diff --git a/services/proto/restaurant.proto b/services/proto/restaurant.proto index a9398062..9fed13a0 100644 --- a/services/proto/restaurant.proto +++ b/services/proto/restaurant.proto @@ -46,12 +46,16 @@ message RestaurantId { string id = 1; } +message RestaurantDeleteInput { + string id = 1; +} + service RestaurantService { rpc CreateRestaurant (RestaurantCreateInput) returns (Restaurant) {} rpc GetRestaurant (RestaurantId) returns (Restaurant) {} rpc UpdateRestaurant (Restaurant) returns (Restaurant) {} - rpc DeleteRestaurant (RestaurantId) returns (google.protobuf.Empty) {} + rpc DeleteRestaurant (RestaurantDeleteInput) returns (google.protobuf.Empty) {} rpc GetRestaurants (google.protobuf.Empty) returns (RestaurantList) {} rpc GetRestaurantsByLocation (ByLocationInput) returns (RestaurantList) {} } From 412f71da6a3cac304d8d01a3f5a4f2581a03fa66 Mon Sep 17 00:00:00 2001 From: Florian LEROUX Date: Tue, 29 Aug 2023 11:24:56 +0200 Subject: [PATCH 540/883] fix(gateway/promotion): fix method support --- .../src/controller/promotion/promotion.controller.ts | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/services/gateway/src/controller/promotion/promotion.controller.ts b/services/gateway/src/controller/promotion/promotion.controller.ts index 14ab7b39..ba49ee01 100644 --- a/services/gateway/src/controller/promotion/promotion.controller.ts +++ b/services/gateway/src/controller/promotion/promotion.controller.ts @@ -2,6 +2,7 @@ import { Router } from "express"; import { promotionServiceClient } from "@gateway/services/clients/promotion.client"; import { Empty } from "google-protobuf/google/protobuf/empty_pb"; import { + Method, Promotion, PromotionCode, PromotionCreateInput, @@ -96,7 +97,10 @@ promotionRoutes.post("/api/promotion", withCheck({ role: ["MANAGER", "ADMIN"] }) required: true, type: 'string' } */ - const { code, reduction, method, restaurantId } = req.body; + const { code, reduction, method: inputMethod, restaurantId } = req.body; + const method = Method[inputMethod] as unknown as Method; + if (!method) return res.status(400).json({ message: "Invalid method" }); + const promotionCreateInput = new PromotionCreateInput() .setCode(code) .setReduction(reduction) @@ -130,7 +134,10 @@ promotionRoutes.put("/api/promotion/:id", withCheck({ role: ["MANAGER", "ADMIN"] type: 'string' } */ const { id } = req.params; - const { code, reduction, method, restaurantId } = req.body; + const { code, reduction, method: inputMethod, restaurantId } = req.body; + const method = Method[inputMethod] as unknown as Method; + if (!method) return res.status(400).json({ message: "Invalid method" }); + const promotionUpdateInput = new Promotion() .setId(id) .setCode(code) From 9a95b08420a693ea5303836970c96809bfa1b08a Mon Sep 17 00:00:00 2001 From: Florian LEROUX Date: Tue, 29 Aug 2023 12:57:38 +0200 Subject: [PATCH 541/883] fix(gateway/promotion): fix proto message for put --- .../src/controller/promotion/promotion.controller.ts | 3 ++- services/proto/promotions.proto | 12 +++++++++++- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/services/gateway/src/controller/promotion/promotion.controller.ts b/services/gateway/src/controller/promotion/promotion.controller.ts index ba49ee01..1e50091f 100644 --- a/services/gateway/src/controller/promotion/promotion.controller.ts +++ b/services/gateway/src/controller/promotion/promotion.controller.ts @@ -7,6 +7,7 @@ import { PromotionCode, PromotionCreateInput, PromotionId, + PromotionUpdateInput, RestaurantId, } from "@gateway/proto/promotions_pb"; import { getUserIdFromToken } from "@gateway/services/user.service"; @@ -138,7 +139,7 @@ promotionRoutes.put("/api/promotion/:id", withCheck({ role: ["MANAGER", "ADMIN"] const method = Method[inputMethod] as unknown as Method; if (!method) return res.status(400).json({ message: "Invalid method" }); - const promotionUpdateInput = new Promotion() + const promotionUpdateInput = new PromotionUpdateInput() .setId(id) .setCode(code) .setReduction(reduction) diff --git a/services/proto/promotions.proto b/services/proto/promotions.proto index 43333e43..985abc6e 100644 --- a/services/proto/promotions.proto +++ b/services/proto/promotions.proto @@ -42,10 +42,20 @@ enum Method { VALUE = 1; } +message PromotionUpdateInput { + string id = 1; + + string code = 2; + string reduction = 3; + Method method = 4; + + string restaurant_id = 5; +} + service PromotionService { rpc CreatePromotion (PromotionCreateInput) returns (Promotion) {} rpc GetPromotion (PromotionCode) returns (Promotion) {} - rpc UpdatePromotion (Promotion) returns (Promotion) {} + rpc UpdatePromotion (PromotionUpdateInput) returns (Promotion) {} rpc DeletePromotion (PromotionId) returns (google.protobuf.Empty) {} rpc GetPromotions (google.protobuf.Empty) returns (PromotionList) {} rpc GetPromotionsByRestaurant (RestaurantId) returns (PromotionList) {} From 9d4374c7ee0c6b5ae0f4148bdd6110d2ff47c1cb Mon Sep 17 00:00:00 2001 From: Florian LEROUX Date: Tue, 29 Aug 2023 12:58:31 +0200 Subject: [PATCH 542/883] ref(gateway/promotion): remove unused var --- .../gateway/src/controller/promotion/promotion.controller.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/services/gateway/src/controller/promotion/promotion.controller.ts b/services/gateway/src/controller/promotion/promotion.controller.ts index 1e50091f..292e810e 100644 --- a/services/gateway/src/controller/promotion/promotion.controller.ts +++ b/services/gateway/src/controller/promotion/promotion.controller.ts @@ -3,7 +3,6 @@ import { promotionServiceClient } from "@gateway/services/clients/promotion.clie import { Empty } from "google-protobuf/google/protobuf/empty_pb"; import { Method, - Promotion, PromotionCode, PromotionCreateInput, PromotionId, From 3fb6afa76497d8d1ddf59d2e7f9fe796f81384e4 Mon Sep 17 00:00:00 2001 From: anatole Date: Wed, 30 Aug 2023 09:05:31 +0200 Subject: [PATCH 543/883] feat(user): rename default admin --- services/user/dev.env | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/services/user/dev.env b/services/user/dev.env index 95b299d9..2f125e3b 100644 --- a/services/user/dev.env +++ b/services/user/dev.env @@ -1,6 +1,6 @@ PORT=50001 DB_URL=postgres://postgres:password@user-postgres:5432/postgres JWT_SECRET_KEY=example -DEFAULT_USER_EMAIL=example -DEFAULT_USER_PASSWORD=example +DEFAULT_USER_EMAIL=super.admin@mail.com +DEFAULT_USER_PASSWORD=password LOG_FILE_PATH=./logs/app.log \ No newline at end of file From 4a9bfece1c47ae719e2edac9beb4b370f083652e Mon Sep 17 00:00:00 2001 From: Florian LEROUX Date: Wed, 30 Aug 2023 13:06:41 +0200 Subject: [PATCH 544/883] fix(gitignore): add gateway js-protos files --- .gitignore | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.gitignore b/.gitignore index 311feb07..36d1bbe0 100644 --- a/.gitignore +++ b/.gitignore @@ -42,6 +42,9 @@ terraform.rc !.vscode/extensions.json !.vscode/*.code-snippets +### IDEA ### +.idea + # Local History for Visual Studio Code .history/ @@ -81,5 +84,8 @@ terraform.rc # log service /services/log/goodfood-log +# gateway service +/services/gateway/src/proto/ + # expo cache files /apps/mobile/.expo From c9917f32d501ab670f7721719b170f56f65c4e44 Mon Sep 17 00:00:00 2001 From: Florian LEROUX Date: Wed, 30 Aug 2023 13:45:59 +0200 Subject: [PATCH 545/883] init(web): add next.js project in /apps/web --- .github/workflows/web.yml | 66 + apps/web/.eslintrc.json | 3 + apps/web/.gitignore | 35 + apps/web/.prettierrc.json | 6 + apps/web/README.md | 34 + apps/web/app/favicon.ico | Bin 0 -> 25931 bytes apps/web/app/globals.css | 22 + apps/web/app/layout.tsx | 18 + apps/web/app/page.tsx | 7 + apps/web/next.config.js | 17 + apps/web/package.json | 31 + apps/web/pnpm-lock.yaml | 2917 +++++++++++++++++++++++++++++ apps/web/postcss.config.js | 1 + apps/web/{ => public}/.gitinclude | 0 apps/web/tailwind.config.ts | 14 + apps/web/tsconfig.json | 27 + 16 files changed, 3198 insertions(+) create mode 100644 .github/workflows/web.yml create mode 100644 apps/web/.eslintrc.json create mode 100644 apps/web/.gitignore create mode 100644 apps/web/.prettierrc.json create mode 100644 apps/web/README.md create mode 100644 apps/web/app/favicon.ico create mode 100644 apps/web/app/globals.css create mode 100644 apps/web/app/layout.tsx create mode 100644 apps/web/app/page.tsx create mode 100644 apps/web/next.config.js create mode 100644 apps/web/package.json create mode 100644 apps/web/pnpm-lock.yaml create mode 100644 apps/web/postcss.config.js rename apps/web/{ => public}/.gitinclude (100%) create mode 100644 apps/web/tailwind.config.ts create mode 100644 apps/web/tsconfig.json diff --git a/.github/workflows/web.yml b/.github/workflows/web.yml new file mode 100644 index 00000000..317bc400 --- /dev/null +++ b/.github/workflows/web.yml @@ -0,0 +1,66 @@ +name: Next.js CI + +on: + push: + branches: [main] + pull_request: + branches: [main] + +defaults: + run: + working-directory: ./apps/web + +jobs: + lint: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@master + - uses: pnpm/action-setup@v2 + with: + version: latest + - uses: actions/setup-node@v3 + with: + node-version: "18.x" + cache: "pnpm" + - name: Install dependencies + run: pnpm install --frozen-lockfile + + - name: Lint + run: pnpm lint + + format: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@master + - uses: pnpm/action-setup@v2 + with: + version: latest + - uses: actions/setup-node@v3 + with: + node-version: "18.x" + cache: "pnpm" + - name: Install dependencies + run: pnpm install --frozen-lockfile + + - name: Lint + run: pnpm format + + build: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@master + - uses: pnpm/action-setup@v2 + with: + version: latest + - uses: actions/setup-node@v3 + with: + node-version: "18.x" + cache: "pnpm" + - name: Install dependencies + run: pnpm install --frozen-lockfile + + - name: Lint + run: pnpm build diff --git a/apps/web/.eslintrc.json b/apps/web/.eslintrc.json new file mode 100644 index 00000000..c5d43a6e --- /dev/null +++ b/apps/web/.eslintrc.json @@ -0,0 +1,3 @@ +{ + "extends": ["next", "prettier"] +} diff --git a/apps/web/.gitignore b/apps/web/.gitignore new file mode 100644 index 00000000..8f322f0d --- /dev/null +++ b/apps/web/.gitignore @@ -0,0 +1,35 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.js + +# testing +/coverage + +# next.js +/.next/ +/out/ + +# production +/build + +# misc +.DS_Store +*.pem + +# debug +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# local env files +.env*.local + +# vercel +.vercel + +# typescript +*.tsbuildinfo +next-env.d.ts diff --git a/apps/web/.prettierrc.json b/apps/web/.prettierrc.json new file mode 100644 index 00000000..e68bd26a --- /dev/null +++ b/apps/web/.prettierrc.json @@ -0,0 +1,6 @@ +{ + "tabWidth": 2, + "printWidth": 120, + "trailingComma": "all", + "plugins": ["prettier-plugin-tailwindcss"] +} diff --git a/apps/web/README.md b/apps/web/README.md new file mode 100644 index 00000000..f4da3c4c --- /dev/null +++ b/apps/web/README.md @@ -0,0 +1,34 @@ +This is a [Next.js](https://nextjs.org/) project bootstrapped with [`create-next-app`](https://github.com/vercel/next.js/tree/canary/packages/create-next-app). + +## Getting Started + +First, run the development server: + +```bash +npm run dev +# or +yarn dev +# or +pnpm dev +``` + +Open [http://localhost:3000](http://localhost:3000) with your browser to see the result. + +You can start editing the page by modifying `app/page.tsx`. The page auto-updates as you edit the file. + +This project uses [`next/font`](https://nextjs.org/docs/basic-features/font-optimization) to automatically optimize and load Inter, a custom Google Font. + +## Learn More + +To learn more about Next.js, take a look at the following resources: + +- [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API. +- [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial. + +You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js/) - your feedback and contributions are welcome! + +## Deploy on Vercel + +The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js. + +Check out our [Next.js deployment documentation](https://nextjs.org/docs/deployment) for more details. diff --git a/apps/web/app/favicon.ico b/apps/web/app/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..718d6fea4835ec2d246af9800eddb7ffb276240c GIT binary patch literal 25931 zcmeHv30#a{`}aL_*G&7qml|y<+KVaDM2m#dVr!KsA!#An?kSQM(q<_dDNCpjEux83 zLb9Z^XxbDl(w>%i@8hT6>)&Gu{h#Oeyszu?xtw#Zb1mO{pgX9699l+Qppw7jXaYf~-84xW z)w4x8?=youko|}Vr~(D$UXIbiXABHh`p1?nn8Po~fxRJv}|0e(BPs|G`(TT%kKVJAdg5*Z|x0leQq0 zkdUBvb#>9F()jo|T~kx@OM8$9wzs~t2l;K=woNssA3l6|sx2r3+kdfVW@e^8e*E}v zA1y5{bRi+3Z`uD3{F7LgFJDdvm;nJilkzDku>BwXH(8ItVCXk*-lSJnR?-2UN%hJ){&rlvg`CDTj z)Bzo!3v7Ou#83zEDEFcKt(f1E0~=rqeEbTnMvWR#{+9pg%7G8y>u1OVRUSoox-ovF z2Ydma(;=YuBY(eI|04{hXzZD6_f(v~H;C~y5=DhAC{MMS>2fm~1H_t2$56pc$NH8( z5bH|<)71dV-_oCHIrzrT`2s-5w_+2CM0$95I6X8p^r!gHp+j_gd;9O<1~CEQQGS8) zS9Qh3#p&JM-G8rHekNmKVewU;pJRcTAog68KYo^dRo}(M>36U4Us zfgYWSiHZL3;lpWT=zNAW>Dh#mB!_@Lg%$ms8N-;aPqMn+C2HqZgz&9~Eu z4|Kp<`$q)Uw1R?y(~S>ePdonHxpV1#eSP1B;Ogo+-Pk}6#0GsZZ5!||ev2MGdh}_m z{DeR7?0-1^zVs&`AV6Vt;r3`I`OI_wgs*w=eO%_#7Kepl{B@xiyCANc(l zzIyd4y|c6PXWq9-|KM8(zIk8LPk(>a)zyFWjhT!$HJ$qX1vo@d25W<fvZQ2zUz5WRc(UnFMKHwe1| zWmlB1qdbiA(C0jmnV<}GfbKtmcu^2*P^O?MBLZKt|As~ge8&AAO~2K@zbXelK|4T<{|y4`raF{=72kC2Kn(L4YyenWgrPiv z@^mr$t{#X5VuIMeL!7Ab6_kG$&#&5p*Z{+?5U|TZ`B!7llpVmp@skYz&n^8QfPJzL z0G6K_OJM9x+Wu2gfN45phANGt{7=C>i34CV{Xqlx(fWpeAoj^N0Biu`w+MVcCUyU* zDZuzO0>4Z6fbu^T_arWW5n!E45vX8N=bxTVeFoep_G#VmNlQzAI_KTIc{6>c+04vr zx@W}zE5JNSU>!THJ{J=cqjz+4{L4A{Ob9$ZJ*S1?Ggg3klFp!+Y1@K+pK1DqI|_gq z5ZDXVpge8-cs!o|;K73#YXZ3AShj50wBvuq3NTOZ`M&qtjj#GOFfgExjg8Gn8>Vq5 z`85n+9|!iLCZF5$HJ$Iu($dm?8~-ofu}tEc+-pyke=3!im#6pk_Wo8IA|fJwD&~~F zc16osQ)EBo58U7XDuMexaPRjU@h8tXe%S{fA0NH3vGJFhuyyO!Uyl2^&EOpX{9As0 zWj+P>{@}jxH)8|r;2HdupP!vie{sJ28b&bo!8`D^x}TE$%zXNb^X1p@0PJ86`dZyj z%ce7*{^oo+6%&~I!8hQy-vQ7E)0t0ybH4l%KltWOo~8cO`T=157JqL(oq_rC%ea&4 z2NcTJe-HgFjNg-gZ$6!Y`SMHrlj}Etf7?r!zQTPPSv}{so2e>Fjs1{gzk~LGeesX%r(Lh6rbhSo_n)@@G-FTQy93;l#E)hgP@d_SGvyCp0~o(Y;Ee8{ zdVUDbHm5`2taPUOY^MAGOw*>=s7=Gst=D+p+2yON!0%Hk` zz5mAhyT4lS*T3LS^WSxUy86q&GnoHxzQ6vm8)VS}_zuqG?+3td68_x;etQAdu@sc6 zQJ&5|4(I?~3d-QOAODHpZ=hlSg(lBZ!JZWCtHHSj`0Wh93-Uk)_S%zsJ~aD>{`A0~ z9{AG(e|q3g5B%wYKRxiL2Y$8(4w6bzchKuloQW#e&S3n+P- z8!ds-%f;TJ1>)v)##>gd{PdS2Oc3VaR`fr=`O8QIO(6(N!A?pr5C#6fc~Ge@N%Vvu zaoAX2&(a6eWy_q&UwOhU)|P3J0Qc%OdhzW=F4D|pt0E4osw;%<%Dn58hAWD^XnZD= z>9~H(3bmLtxpF?a7su6J7M*x1By7YSUbxGi)Ot0P77`}P3{)&5Un{KD?`-e?r21!4vTTnN(4Y6Lin?UkSM z`MXCTC1@4A4~mvz%Rh2&EwY))LeoT=*`tMoqcEXI>TZU9WTP#l?uFv+@Dn~b(>xh2 z;>B?;Tz2SR&KVb>vGiBSB`@U7VIWFSo=LDSb9F{GF^DbmWAfpms8Sx9OX4CnBJca3 zlj9(x!dIjN?OG1X4l*imJNvRCk}F%!?SOfiOq5y^mZW)jFL@a|r-@d#f7 z2gmU8L3IZq0ynIws=}~m^#@&C%J6QFo~Mo4V`>v7MI-_!EBMMtb%_M&kvAaN)@ZVw z+`toz&WG#HkWDjnZE!6nk{e-oFdL^$YnbOCN}JC&{$#$O27@|Tn-skXr)2ml2~O!5 zX+gYoxhoc7qoU?C^3~&!U?kRFtnSEecWuH0B0OvLodgUAi}8p1 zrO6RSXHH}DMc$&|?D004DiOVMHV8kXCP@7NKB zgaZq^^O<7PoKEp72kby@W0Z!Y*Ay{&vfg#C&gG@YVR9g?FEocMUi1gSN$+V+ayF45{a zuDZDTN}mS|;BO%gEf}pjBfN2-gIrU#G5~cucA;dokXW89%>AyXJJI z9X4UlIWA|ZYHgbI z5?oFk@A=Ik7lrEQPDH!H+b`7_Y~aDb_qa=B2^Y&Ow41cU=4WDd40dp5(QS-WMN-=Y z9g;6_-JdNU;|6cPwf$ak*aJIcwL@1n$#l~zi{c{EW?T;DaW*E8DYq?Umtz{nJ&w-M zEMyTDrC&9K$d|kZe2#ws6)L=7K+{ zQw{XnV6UC$6-rW0emqm8wJoeZK)wJIcV?dST}Z;G0Arq{dVDu0&4kd%N!3F1*;*pW zR&qUiFzK=@44#QGw7k1`3t_d8&*kBV->O##t|tonFc2YWrL7_eqg+=+k;!F-`^b8> z#KWCE8%u4k@EprxqiV$VmmtiWxDLgnGu$Vs<8rppV5EajBXL4nyyZM$SWVm!wnCj-B!Wjqj5-5dNXukI2$$|Bu3Lrw}z65Lc=1G z^-#WuQOj$hwNGG?*CM_TO8Bg-1+qc>J7k5c51U8g?ZU5n?HYor;~JIjoWH-G>AoUP ztrWWLbRNqIjW#RT*WqZgPJXU7C)VaW5}MiijYbABmzoru6EmQ*N8cVK7a3|aOB#O& zBl8JY2WKfmj;h#Q!pN%9o@VNLv{OUL?rixHwOZuvX7{IJ{(EdPpuVFoQqIOa7giLVkBOKL@^smUA!tZ1CKRK}#SSM)iQHk)*R~?M!qkCruaS!#oIL1c z?J;U~&FfH#*98^G?i}pA{ z9Jg36t4=%6mhY(quYq*vSxptes9qy|7xSlH?G=S@>u>Ebe;|LVhs~@+06N<4CViBk zUiY$thvX;>Tby6z9Y1edAMQaiH zm^r3v#$Q#2T=X>bsY#D%s!bhs^M9PMAcHbCc0FMHV{u-dwlL;a1eJ63v5U*?Q_8JO zT#50!RD619#j_Uf))0ooADz~*9&lN!bBDRUgE>Vud-i5ck%vT=r^yD*^?Mp@Q^v+V zG#-?gKlr}Eeqifb{|So?HM&g91P8|av8hQoCmQXkd?7wIJwb z_^v8bbg`SAn{I*4bH$u(RZ6*xUhuA~hc=8czK8SHEKTzSxgbwi~9(OqJB&gwb^l4+m`k*Q;_?>Y-APi1{k zAHQ)P)G)f|AyjSgcCFps)Fh6Bca*Xznq36!pV6Az&m{O8$wGFD? zY&O*3*J0;_EqM#jh6^gMQKpXV?#1?>$ml1xvh8nSN>-?H=V;nJIwB07YX$e6vLxH( zqYwQ>qxwR(i4f)DLd)-$P>T-no_c!LsN@)8`e;W@)-Hj0>nJ-}Kla4-ZdPJzI&Mce zv)V_j;(3ERN3_@I$N<^|4Lf`B;8n+bX@bHbcZTopEmDI*Jfl)-pFDvo6svPRoo@(x z);_{lY<;);XzT`dBFpRmGrr}z5u1=pC^S-{ce6iXQlLGcItwJ^mZx{m$&DA_oEZ)B{_bYPq-HA zcH8WGoBG(aBU_j)vEy+_71T34@4dmSg!|M8Vf92Zj6WH7Q7t#OHQqWgFE3ARt+%!T z?oLovLVlnf?2c7pTc)~cc^($_8nyKwsN`RA-23ed3sdj(ys%pjjM+9JrctL;dy8a( z@en&CQmnV(()bu|Y%G1-4a(6x{aLytn$T-;(&{QIJB9vMox11U-1HpD@d(QkaJdEb zG{)+6Dos_L+O3NpWo^=gR?evp|CqEG?L&Ut#D*KLaRFOgOEK(Kq1@!EGcTfo+%A&I z=dLbB+d$u{sh?u)xP{PF8L%;YPPW53+@{>5W=Jt#wQpN;0_HYdw1{ksf_XhO4#2F= zyPx6Lx2<92L-;L5PD`zn6zwIH`Jk($?Qw({erA$^bC;q33hv!d!>%wRhj# zal^hk+WGNg;rJtb-EB(?czvOM=H7dl=vblBwAv>}%1@{}mnpUznfq1cE^sgsL0*4I zJ##!*B?=vI_OEVis5o+_IwMIRrpQyT_Sq~ZU%oY7c5JMIADzpD!Upz9h@iWg_>>~j zOLS;wp^i$-E?4<_cp?RiS%Rd?i;f*mOz=~(&3lo<=@(nR!_Rqiprh@weZlL!t#NCc zO!QTcInq|%#>OVgobj{~ixEUec`E25zJ~*DofsQdzIa@5^nOXj2T;8O`l--(QyU^$t?TGY^7#&FQ+2SS3B#qK*k3`ye?8jUYSajE5iBbJls75CCc(m3dk{t?- zopcER9{Z?TC)mk~gpi^kbbu>b-+a{m#8-y2^p$ka4n60w;Sc2}HMf<8JUvhCL0B&Btk)T`ctE$*qNW8L$`7!r^9T+>=<=2qaq-;ll2{`{Rg zc5a0ZUI$oG&j-qVOuKa=*v4aY#IsoM+1|c4Z)<}lEDvy;5huB@1RJPquU2U*U-;gu z=En2m+qjBzR#DEJDO`WU)hdd{Vj%^0V*KoyZ|5lzV87&g_j~NCjwv0uQVqXOb*QrQ zy|Qn`hxx(58c70$E;L(X0uZZ72M1!6oeg)(cdKO ze0gDaTz+ohR-#d)NbAH4x{I(21yjwvBQfmpLu$)|m{XolbgF!pmsqJ#D}(ylp6uC> z{bqtcI#hT#HW=wl7>p!38sKsJ`r8}lt-q%Keqy%u(xk=yiIJiUw6|5IvkS+#?JTBl z8H5(Q?l#wzazujH!8o>1xtn8#_w+397*_cy8!pQGP%K(Ga3pAjsaTbbXJlQF_+m+-UpUUent@xM zg%jqLUExj~o^vQ3Gl*>wh=_gOr2*|U64_iXb+-111aH}$TjeajM+I20xw(((>fej-@CIz4S1pi$(#}P7`4({6QS2CaQS4NPENDp>sAqD z$bH4KGzXGffkJ7R>V>)>tC)uax{UsN*dbeNC*v}#8Y#OWYwL4t$ePR?VTyIs!wea+ z5Urmc)X|^`MG~*dS6pGSbU+gPJoq*^a=_>$n4|P^w$sMBBy@f*Z^Jg6?n5?oId6f{ z$LW4M|4m502z0t7g<#Bx%X;9<=)smFolV&(V^(7Cv2-sxbxopQ!)*#ZRhTBpx1)Fc zNm1T%bONzv6@#|dz(w02AH8OXe>kQ#1FMCzO}2J_mST)+ExmBr9cva-@?;wnmWMOk z{3_~EX_xadgJGv&H@zK_8{(x84`}+c?oSBX*Ge3VdfTt&F}yCpFP?CpW+BE^cWY0^ zb&uBN!Ja3UzYHK-CTyA5=L zEMW{l3Usky#ly=7px648W31UNV@K)&Ub&zP1c7%)`{);I4b0Q<)B}3;NMG2JH=X$U zfIW4)4n9ZM`-yRj67I)YSLDK)qfUJ_ij}a#aZN~9EXrh8eZY2&=uY%2N0UFF7<~%M zsB8=erOWZ>Ct_#^tHZ|*q`H;A)5;ycw*IcmVxi8_0Xk}aJA^ath+E;xg!x+As(M#0=)3!NJR6H&9+zd#iP(m0PIW8$ z1Y^VX`>jm`W!=WpF*{ioM?C9`yOR>@0q=u7o>BP-eSHqCgMDj!2anwH?s%i2p+Q7D zzszIf5XJpE)IG4;d_(La-xenmF(tgAxK`Y4sQ}BSJEPs6N_U2vI{8=0C_F?@7<(G; zo$~G=8p+076G;`}>{MQ>t>7cm=zGtfbdDXm6||jUU|?X?CaE?(<6bKDYKeHlz}DA8 zXT={X=yp_R;HfJ9h%?eWvQ!dRgz&Su*JfNt!Wu>|XfU&68iRikRrHRW|ZxzRR^`eIGt zIeiDgVS>IeExKVRWW8-=A=yA`}`)ZkWBrZD`hpWIxBGkh&f#ijr449~m`j6{4jiJ*C!oVA8ZC?$1RM#K(_b zL9TW)kN*Y4%^-qPpMP7d4)o?Nk#>aoYHT(*g)qmRUb?**F@pnNiy6Fv9rEiUqD(^O zzyS?nBrX63BTRYduaG(0VVG2yJRe%o&rVrLjbxTaAFTd8s;<<@Qs>u(<193R8>}2_ zuwp{7;H2a*X7_jryzriZXMg?bTuegABb^87@SsKkr2)0Gyiax8KQWstw^v#ix45EVrcEhr>!NMhprl$InQMzjSFH54x5k9qHc`@9uKQzvL4ihcq{^B zPrVR=o_ic%Y>6&rMN)hTZsI7I<3&`#(nl+3y3ys9A~&^=4?PL&nd8)`OfG#n zwAMN$1&>K++c{^|7<4P=2y(B{jJsQ0a#U;HTo4ZmWZYvI{+s;Td{Yzem%0*k#)vjpB zia;J&>}ICate44SFYY3vEelqStQWFihx%^vQ@Do(sOy7yR2@WNv7Y9I^yL=nZr3mb zXKV5t@=?-Sk|b{XMhA7ZGB@2hqsx}4xwCW!in#C zI@}scZlr3-NFJ@NFaJlhyfcw{k^vvtGl`N9xSo**rDW4S}i zM9{fMPWo%4wYDG~BZ18BD+}h|GQKc-g^{++3MY>}W_uq7jGHx{mwE9fZiPCoxN$+7 zrODGGJrOkcPQUB(FD5aoS4g~7#6NR^ma7-!>mHuJfY5kTe6PpNNKC9GGRiu^L31uG z$7v`*JknQHsYB!Tm_W{a32TM099djW%5e+j0Ve_ct}IM>XLF1Ap+YvcrLV=|CKo6S zb+9Nl3_YdKP6%Cxy@6TxZ>;4&nTneadr z_ES90ydCev)LV!dN=#(*f}|ZORFdvkYBni^aLbUk>BajeWIOcmHP#8S)*2U~QKI%S zyrLmtPqb&TphJ;>yAxri#;{uyk`JJqODDw%(Z=2`1uc}br^V%>j!gS)D*q*f_-qf8&D;W1dJgQMlaH5er zN2U<%Smb7==vE}dDI8K7cKz!vs^73o9f>2sgiTzWcwY|BMYHH5%Vn7#kiw&eItCqa zIkR2~Q}>X=Ar8W|^Ms41Fm8o6IB2_j60eOeBB1Br!boW7JnoeX6Gs)?7rW0^5psc- zjS16yb>dFn>KPOF;imD}e!enuIniFzv}n$m2#gCCv4jM#ArwlzZ$7@9&XkFxZ4n!V zj3dyiwW4Ki2QG{@i>yuZXQizw_OkZI^-3otXC{!(lUpJF33gI60ak;Uqitp74|B6I zgg{b=Iz}WkhCGj1M=hu4#Aw173YxIVbISaoc z-nLZC*6Tgivd5V`K%GxhBsp@SUU60-rfc$=wb>zdJzXS&-5(NRRodFk;Kxk!S(O(a0e7oY=E( zAyS;Ow?6Q&XA+cnkCb{28_1N8H#?J!*$MmIwLq^*T_9-z^&UE@A(z9oGYtFy6EZef LrJugUA?W`A8`#=m literal 0 HcmV?d00001 diff --git a/apps/web/app/globals.css b/apps/web/app/globals.css new file mode 100644 index 00000000..b7fe784e --- /dev/null +++ b/apps/web/app/globals.css @@ -0,0 +1,22 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; + +:root { + --foreground-rgb: 0, 0, 0; + --background-start-rgb: 214, 219, 220; + --background-end-rgb: 255, 255, 255; +} + +@media (prefers-color-scheme: dark) { + :root { + --foreground-rgb: 255, 255, 255; + --background-start-rgb: 0, 0, 0; + --background-end-rgb: 0, 0, 0; + } +} + +body { + color: rgb(var(--foreground-rgb)); + background: linear-gradient(to bottom, transparent, rgb(var(--background-end-rgb))) rgb(var(--background-start-rgb)); +} diff --git a/apps/web/app/layout.tsx b/apps/web/app/layout.tsx new file mode 100644 index 00000000..db8bb4bb --- /dev/null +++ b/apps/web/app/layout.tsx @@ -0,0 +1,18 @@ +import "./globals.css"; +import type { Metadata } from "next"; +import { Inter } from "next/font/google"; + +const inter = Inter({ subsets: ["latin"] }); + +export const metadata: Metadata = { + title: "Create Next App", + description: "Generated by create next app", +}; + +export default function RootLayout({ children }: { children: React.ReactNode }) { + return ( + + {children} + + ); +} diff --git a/apps/web/app/page.tsx b/apps/web/app/page.tsx new file mode 100644 index 00000000..3afe659f --- /dev/null +++ b/apps/web/app/page.tsx @@ -0,0 +1,7 @@ +export default function Home() { + return ( +
+

Home

+
+ ); +} diff --git a/apps/web/next.config.js b/apps/web/next.config.js new file mode 100644 index 00000000..b2c1ed26 --- /dev/null +++ b/apps/web/next.config.js @@ -0,0 +1,17 @@ +/** @type {import('next').NextConfig} */ +const nextConfig = { + headers: () => [ + // HSTS + { + source: "/(.*)", + headers: [ + { + key: "Strict-Transport-Security", + value: "max-age=63072000; includeSubDomains; preload", + }, + ], + }, + ], +}; + +module.exports = nextConfig; diff --git a/apps/web/package.json b/apps/web/package.json new file mode 100644 index 00000000..10aeeced --- /dev/null +++ b/apps/web/package.json @@ -0,0 +1,31 @@ +{ + "name": "web", + "version": "0.1.0", + "private": true, + "scripts": { + "dev": "next dev", + "build": "next build", + "start": "next start", + "lint": "next lint", + "format": "prettier --write \"**/*.{js,jsx,ts,tsx,json,md}\"" + }, + "dependencies": { + "@types/node": "20.5.7", + "@types/react": "18.2.21", + "@types/react-dom": "18.2.7", + "autoprefixer": "10.4.15", + "eslint": "8.48.0", + "eslint-config-next": "13.4.19", + "next": "13.4.19", + "postcss": "8.4.29", + "react": "18.2.0", + "react-dom": "18.2.0", + "tailwindcss": "3.3.3", + "typescript": "5.2.2" + }, + "devDependencies": { + "eslint-config-prettier": "^9.0.0", + "prettier": "^3.0.3", + "prettier-plugin-tailwindcss": "^0.5.3" + } +} diff --git a/apps/web/pnpm-lock.yaml b/apps/web/pnpm-lock.yaml new file mode 100644 index 00000000..f2a20e51 --- /dev/null +++ b/apps/web/pnpm-lock.yaml @@ -0,0 +1,2917 @@ +lockfileVersion: "6.0" + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +dependencies: + "@types/node": + specifier: 20.5.7 + version: 20.5.7 + "@types/react": + specifier: 18.2.21 + version: 18.2.21 + "@types/react-dom": + specifier: 18.2.7 + version: 18.2.7 + autoprefixer: + specifier: 10.4.15 + version: 10.4.15(postcss@8.4.29) + eslint: + specifier: 8.48.0 + version: 8.48.0 + eslint-config-next: + specifier: 13.4.19 + version: 13.4.19(eslint@8.48.0)(typescript@5.2.2) + next: + specifier: 13.4.19 + version: 13.4.19(react-dom@18.2.0)(react@18.2.0) + postcss: + specifier: 8.4.29 + version: 8.4.29 + react: + specifier: 18.2.0 + version: 18.2.0 + react-dom: + specifier: 18.2.0 + version: 18.2.0(react@18.2.0) + tailwindcss: + specifier: 3.3.3 + version: 3.3.3 + typescript: + specifier: 5.2.2 + version: 5.2.2 + +devDependencies: + eslint-config-prettier: + specifier: ^9.0.0 + version: 9.0.0(eslint@8.48.0) + prettier: + specifier: ^3.0.3 + version: 3.0.3 + prettier-plugin-tailwindcss: + specifier: ^0.5.3 + version: 0.5.3(prettier@3.0.3) + +packages: + /@aashutoshrathi/word-wrap@1.2.6: + resolution: + { integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA== } + engines: { node: ">=0.10.0" } + + /@alloc/quick-lru@5.2.0: + resolution: + { integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw== } + engines: { node: ">=10" } + dev: false + + /@babel/runtime@7.22.11: + resolution: + { integrity: sha512-ee7jVNlWN09+KftVOu9n7S8gQzD/Z6hN/I8VBRXW4P1+Xe7kJGXMwu8vds4aGIMHZnNbdpSWCfZZtinytpcAvA== } + engines: { node: ">=6.9.0" } + dependencies: + regenerator-runtime: 0.14.0 + dev: false + + /@eslint-community/eslint-utils@4.4.0(eslint@8.48.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.48.0 + eslint-visitor-keys: 3.4.3 + + /@eslint-community/regexpp@4.8.0: + resolution: + { integrity: sha512-JylOEEzDiOryeUnFbQz+oViCXS0KsvR1mvHkoMiu5+UiBvy+RYX7tzlIIIEstF/gVa2tj9AQXk3dgnxv6KxhFg== } + engines: { node: ^12.0.0 || ^14.0.0 || >=16.0.0 } + + /@eslint/eslintrc@2.1.2: + resolution: + { integrity: sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g== } + 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.21.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 + + /@eslint/js@8.48.0: + resolution: + { integrity: sha512-ZSjtmelB7IJfWD2Fvb7+Z+ChTIKWq6kjda95fLcQKNS5aheVHn4IkfgRQE3sIIzTcSLwLcLZUD9UBt+V7+h+Pw== } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + + /@humanwhocodes/config-array@0.11.11: + resolution: + { integrity: sha512-N2brEuAadi0CcdeMXUkhbZB84eskAc8MEX1By6qEchoVywSgXPIjou4rYsl0V3Hj0ZnuGycGCjdNgockbzeWNA== } + engines: { node: ">=10.10.0" } + dependencies: + "@humanwhocodes/object-schema": 1.2.1 + debug: 4.3.4 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + + /@humanwhocodes/module-importer@1.0.1: + resolution: + { integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== } + engines: { node: ">=12.22" } + + /@humanwhocodes/object-schema@1.2.1: + resolution: + { integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== } + + /@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: false + + /@jridgewell/resolve-uri@3.1.1: + resolution: + { integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA== } + engines: { node: ">=6.0.0" } + dev: false + + /@jridgewell/set-array@1.1.2: + resolution: + { integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== } + engines: { node: ">=6.0.0" } + dev: false + + /@jridgewell/sourcemap-codec@1.4.15: + resolution: + { integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== } + dev: false + + /@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: false + + /@next/env@13.4.19: + resolution: + { integrity: sha512-FsAT5x0jF2kkhNkKkukhsyYOrRqtSxrEhfliniIq0bwWbuXLgyt3Gv0Ml+b91XwjwArmuP7NxCiGd++GGKdNMQ== } + dev: false + + /@next/eslint-plugin-next@13.4.19: + resolution: + { integrity: sha512-N/O+zGb6wZQdwu6atMZHbR7T9Np5SUFUjZqCbj0sXm+MwQO35M8TazVB4otm87GkXYs2l6OPwARd3/PUWhZBVQ== } + dependencies: + glob: 7.1.7 + dev: false + + /@next/swc-darwin-arm64@13.4.19: + resolution: + { integrity: sha512-vv1qrjXeGbuF2mOkhkdxMDtv9np7W4mcBtaDnHU+yJG+bBwa6rYsYSCI/9Xm5+TuF5SbZbrWO6G1NfTh1TMjvQ== } + engines: { node: ">= 10" } + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@next/swc-darwin-x64@13.4.19: + resolution: + { integrity: sha512-jyzO6wwYhx6F+7gD8ddZfuqO4TtpJdw3wyOduR4fxTUCm3aLw7YmHGYNjS0xRSYGAkLpBkH1E0RcelyId6lNsw== } + engines: { node: ">= 10" } + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@next/swc-linux-arm64-gnu@13.4.19: + resolution: + { integrity: sha512-vdlnIlaAEh6H+G6HrKZB9c2zJKnpPVKnA6LBwjwT2BTjxI7e0Hx30+FoWCgi50e+YO49p6oPOtesP9mXDRiiUg== } + engines: { node: ">= 10" } + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@next/swc-linux-arm64-musl@13.4.19: + resolution: + { integrity: sha512-aU0HkH2XPgxqrbNRBFb3si9Ahu/CpaR5RPmN2s9GiM9qJCiBBlZtRTiEca+DC+xRPyCThTtWYgxjWHgU7ZkyvA== } + engines: { node: ">= 10" } + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@next/swc-linux-x64-gnu@13.4.19: + resolution: + { integrity: sha512-htwOEagMa/CXNykFFeAHHvMJeqZfNQEoQvHfsA4wgg5QqGNqD5soeCer4oGlCol6NGUxknrQO6VEustcv+Md+g== } + engines: { node: ">= 10" } + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@next/swc-linux-x64-musl@13.4.19: + resolution: + { integrity: sha512-4Gj4vvtbK1JH8ApWTT214b3GwUh9EKKQjY41hH/t+u55Knxi/0wesMzwQRhppK6Ddalhu0TEttbiJ+wRcoEj5Q== } + engines: { node: ">= 10" } + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@next/swc-win32-arm64-msvc@13.4.19: + resolution: + { integrity: sha512-bUfDevQK4NsIAHXs3/JNgnvEY+LRyneDN788W2NYiRIIzmILjba7LaQTfihuFawZDhRtkYCv3JDC3B4TwnmRJw== } + engines: { node: ">= 10" } + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@next/swc-win32-ia32-msvc@13.4.19: + resolution: + { integrity: sha512-Y5kikILFAr81LYIFaw6j/NrOtmiM4Sf3GtOc0pn50ez2GCkr+oejYuKGcwAwq3jiTKuzF6OF4iT2INPoxRycEA== } + engines: { node: ">= 10" } + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@next/swc-win32-x64-msvc@13.4.19: + resolution: + { integrity: sha512-YzA78jBDXMYiINdPdJJwGgPNT3YqBNNGhsthsDoWHL9p24tEJn9ViQf/ZqTbwSpX/RrkPupLfuuTH2sf73JBAw== } + engines: { node: ">= 10" } + cpu: [x64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@nodelib/fs.scandir@2.1.5: + resolution: + { integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== } + engines: { node: ">= 8" } + dependencies: + "@nodelib/fs.stat": 2.0.5 + run-parallel: 1.2.0 + + /@nodelib/fs.stat@2.0.5: + resolution: + { integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== } + engines: { node: ">= 8" } + + /@nodelib/fs.walk@1.2.8: + resolution: + { integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== } + engines: { node: ">= 8" } + dependencies: + "@nodelib/fs.scandir": 2.1.5 + fastq: 1.15.0 + + /@rushstack/eslint-patch@1.3.3: + resolution: + { integrity: sha512-0xd7qez0AQ+MbHatZTlI1gu5vkG8r7MYRUJAHPAHJBmGLs16zpkrpAVLvjQKQOqaXPDUBwOiJzNc00znHSCVBw== } + dev: false + + /@swc/helpers@0.5.1: + resolution: + { integrity: sha512-sJ902EfIzn1Fa+qYmjdQqh8tPsoxyBz+8yBKC2HKUxyezKJFwPGOn7pv4WY6QuQW//ySQi5lJjA/ZT9sNWWNTg== } + dependencies: + tslib: 2.6.2 + dev: false + + /@types/json5@0.0.29: + resolution: + { integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== } + dev: false + + /@types/node@20.5.7: + resolution: + { integrity: sha512-dP7f3LdZIysZnmvP3ANJYTSwg+wLLl8p7RqniVlV7j+oXSXAbt9h0WIBFmJy5inWZoX9wZN6eXx+YXd9Rh3RBA== } + dev: false + + /@types/prop-types@15.7.5: + resolution: + { integrity: sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w== } + dev: false + + /@types/react-dom@18.2.7: + resolution: + { integrity: sha512-GRaAEriuT4zp9N4p1i8BDBYmEyfo+xQ3yHjJU4eiK5NDa1RmUZG+unZABUTK4/Ox/M+GaHwb6Ow8rUITrtjszA== } + dependencies: + "@types/react": 18.2.21 + dev: false + + /@types/react@18.2.21: + resolution: + { integrity: sha512-neFKG/sBAwGxHgXiIxnbm3/AAVQ/cMRS93hvBpg8xYRbeQSPVABp9U2bRnPf0iI4+Ucdv3plSxKK+3CW2ENJxA== } + dependencies: + "@types/prop-types": 15.7.5 + "@types/scheduler": 0.16.3 + csstype: 3.1.2 + dev: false + + /@types/scheduler@0.16.3: + resolution: + { integrity: sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ== } + dev: false + + /@typescript-eslint/parser@6.5.0(eslint@8.48.0)(typescript@5.2.2): + resolution: + { integrity: sha512-LMAVtR5GN8nY0G0BadkG0XIe4AcNMeyEy3DyhKGAh9k4pLSMBO7rF29JvDBpZGCmp5Pgz5RLHP6eCpSYZJQDuQ== } + 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.5.0 + "@typescript-eslint/types": 6.5.0 + "@typescript-eslint/typescript-estree": 6.5.0(typescript@5.2.2) + "@typescript-eslint/visitor-keys": 6.5.0 + debug: 4.3.4 + eslint: 8.48.0 + typescript: 5.2.2 + transitivePeerDependencies: + - supports-color + dev: false + + /@typescript-eslint/scope-manager@6.5.0: + resolution: + { integrity: sha512-A8hZ7OlxURricpycp5kdPTH3XnjG85UpJS6Fn4VzeoH4T388gQJ/PGP4ole5NfKt4WDVhmLaQ/dBLNDC4Xl/Kw== } + engines: { node: ^16.0.0 || >=18.0.0 } + dependencies: + "@typescript-eslint/types": 6.5.0 + "@typescript-eslint/visitor-keys": 6.5.0 + dev: false + + /@typescript-eslint/types@6.5.0: + resolution: + { integrity: sha512-eqLLOEF5/lU8jW3Bw+8auf4lZSbbljHR2saKnYqON12G/WsJrGeeDHWuQePoEf9ro22+JkbPfWQwKEC5WwLQ3w== } + engines: { node: ^16.0.0 || >=18.0.0 } + dev: false + + /@typescript-eslint/typescript-estree@6.5.0(typescript@5.2.2): + resolution: + { integrity: sha512-q0rGwSe9e5Kk/XzliB9h2LBc9tmXX25G0833r7kffbl5437FPWb2tbpIV9wAATebC/018pGa9fwPDuvGN+LxWQ== } + engines: { node: ^16.0.0 || >=18.0.0 } + peerDependencies: + typescript: "*" + peerDependenciesMeta: + typescript: + optional: true + dependencies: + "@typescript-eslint/types": 6.5.0 + "@typescript-eslint/visitor-keys": 6.5.0 + debug: 4.3.4 + globby: 11.1.0 + is-glob: 4.0.3 + semver: 7.5.4 + ts-api-utils: 1.0.2(typescript@5.2.2) + typescript: 5.2.2 + transitivePeerDependencies: + - supports-color + dev: false + + /@typescript-eslint/visitor-keys@6.5.0: + resolution: + { integrity: sha512-yCB/2wkbv3hPsh02ZS8dFQnij9VVQXJMN/gbQsaaY+zxALkZnxa/wagvLEFsAWMPv7d7lxQmNsIzGU1w/T/WyA== } + engines: { node: ^16.0.0 || >=18.0.0 } + dependencies: + "@typescript-eslint/types": 6.5.0 + eslint-visitor-keys: 3.4.3 + 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 + + /acorn@8.10.0: + resolution: + { integrity: sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw== } + engines: { node: ">=0.4.0" } + hasBin: true + + /ajv@6.12.6: + resolution: + { integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== } + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + + /ansi-regex@5.0.1: + resolution: + { integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== } + engines: { node: ">=8" } + + /ansi-styles@4.3.0: + resolution: + { integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== } + engines: { node: ">=8" } + dependencies: + color-convert: 2.0.1 + + /any-promise@1.3.0: + resolution: + { integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A== } + dev: false + + /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: false + + /arg@5.0.2: + resolution: + { integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg== } + dev: false + + /argparse@2.0.1: + resolution: + { integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== } + + /aria-query@5.3.0: + resolution: + { integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A== } + dependencies: + dequal: 2.0.3 + dev: false + + /array-buffer-byte-length@1.0.0: + resolution: + { integrity: sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A== } + dependencies: + call-bind: 1.0.2 + is-array-buffer: 3.0.2 + dev: false + + /array-includes@3.1.6: + resolution: + { integrity: sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw== } + engines: { node: ">= 0.4" } + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.22.1 + get-intrinsic: 1.2.1 + is-string: 1.0.7 + dev: false + + /array-union@2.1.0: + resolution: + { integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== } + engines: { node: ">=8" } + dev: false + + /array.prototype.findlastindex@1.2.3: + resolution: + { integrity: sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA== } + engines: { node: ">= 0.4" } + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.22.1 + es-shim-unscopables: 1.0.0 + get-intrinsic: 1.2.1 + dev: false + + /array.prototype.flat@1.3.1: + resolution: + { integrity: sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA== } + engines: { node: ">= 0.4" } + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.22.1 + es-shim-unscopables: 1.0.0 + dev: false + + /array.prototype.flatmap@1.3.1: + resolution: + { integrity: sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ== } + engines: { node: ">= 0.4" } + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.22.1 + es-shim-unscopables: 1.0.0 + dev: false + + /array.prototype.tosorted@1.1.1: + resolution: + { integrity: sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ== } + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.22.1 + es-shim-unscopables: 1.0.0 + get-intrinsic: 1.2.1 + dev: false + + /arraybuffer.prototype.slice@1.0.1: + resolution: + { integrity: sha512-09x0ZWFEjj4WD8PDbykUwo3t9arLn8NIzmmYEJFpYekOAQjpkGSyrQhNoRTcwwcFRu+ycWF78QZ63oWTqSjBcw== } + engines: { node: ">= 0.4" } + dependencies: + array-buffer-byte-length: 1.0.0 + call-bind: 1.0.2 + define-properties: 1.2.0 + get-intrinsic: 1.2.1 + is-array-buffer: 3.0.2 + is-shared-array-buffer: 1.0.2 + dev: false + + /ast-types-flow@0.0.7: + resolution: + { integrity: sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag== } + dev: false + + /asynciterator.prototype@1.0.0: + resolution: + { integrity: sha512-wwHYEIS0Q80f5mosx3L/dfG5t5rjEa9Ft51GTaNt862EnpyGHpgz2RkZvLPp1oF5TnAiTohkEKVEu8pQPJI7Vg== } + dependencies: + has-symbols: 1.0.3 + dev: false + + /autoprefixer@10.4.15(postcss@8.4.29): + resolution: + { integrity: sha512-KCuPB8ZCIqFdA4HwKXsvz7j6gvSDNhDP7WnUjBleRkKjPdvCmHFuQ77ocavI8FT6NdvlBnE2UFr2H4Mycn8Vew== } + engines: { node: ^10 || ^12 || >=14 } + hasBin: true + peerDependencies: + postcss: ^8.1.0 + dependencies: + browserslist: 4.21.10 + caniuse-lite: 1.0.30001524 + fraction.js: 4.3.1 + normalize-range: 0.1.2 + picocolors: 1.0.0 + postcss: 8.4.29 + postcss-value-parser: 4.2.0 + dev: false + + /available-typed-arrays@1.0.5: + resolution: + { integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== } + engines: { node: ">= 0.4" } + dev: false + + /axe-core@4.7.2: + resolution: + { integrity: sha512-zIURGIS1E1Q4pcrMjp+nnEh+16G56eG/MUllJH8yEvw7asDo7Ac9uhC9KIH5jzpITueEZolfYglnCGIuSBz39g== } + engines: { node: ">=4" } + dev: false + + /axobject-query@3.2.1: + resolution: + { integrity: sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg== } + dependencies: + dequal: 2.0.3 + dev: false + + /balanced-match@1.0.2: + resolution: + { integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== } + + /binary-extensions@2.2.0: + resolution: + { integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== } + engines: { node: ">=8" } + dev: false + + /brace-expansion@1.1.11: + resolution: + { integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== } + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + /braces@3.0.2: + resolution: + { integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== } + engines: { node: ">=8" } + dependencies: + fill-range: 7.0.1 + dev: false + + /browserslist@4.21.10: + resolution: + { integrity: sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ== } + engines: { node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7 } + hasBin: true + dependencies: + caniuse-lite: 1.0.30001524 + electron-to-chromium: 1.4.505 + node-releases: 2.0.13 + update-browserslist-db: 1.0.11(browserslist@4.21.10) + dev: false + + /busboy@1.6.0: + resolution: + { integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA== } + engines: { node: ">=10.16.0" } + dependencies: + streamsearch: 1.1.0 + dev: false + + /call-bind@1.0.2: + resolution: + { integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== } + dependencies: + function-bind: 1.1.1 + get-intrinsic: 1.2.1 + dev: false + + /callsites@3.1.0: + resolution: + { integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== } + engines: { node: ">=6" } + + /camelcase-css@2.0.1: + resolution: + { integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA== } + engines: { node: ">= 6" } + dev: false + + /caniuse-lite@1.0.30001524: + resolution: + { integrity: sha512-Jj917pJtYg9HSJBF95HVX3Cdr89JUyLT4IZ8SvM5aDRni95swKgYi3TgYLH5hnGfPE/U1dg6IfZ50UsIlLkwSA== } + dev: false + + /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 + + /chokidar@3.5.3: + resolution: + { integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== } + engines: { node: ">= 8.10.0" } + dependencies: + anymatch: 3.1.3 + braces: 3.0.2 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + dev: false + + /client-only@0.0.1: + resolution: + { integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA== } + 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 + + /color-name@1.1.4: + resolution: + { integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== } + + /commander@4.1.1: + resolution: + { integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== } + engines: { node: ">= 6" } + dev: false + + /concat-map@0.0.1: + resolution: + { integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== } + + /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 + + /cssesc@3.0.0: + resolution: + { integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== } + engines: { node: ">=4" } + hasBin: true + dev: false + + /csstype@3.1.2: + resolution: + { integrity: sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ== } + dev: false + + /damerau-levenshtein@1.0.8: + resolution: + { integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA== } + dev: false + + /debug@3.2.7: + resolution: + { integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== } + 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 + + /deep-is@0.1.4: + resolution: + { integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== } + + /define-properties@1.2.0: + resolution: + { integrity: sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA== } + engines: { node: ">= 0.4" } + dependencies: + has-property-descriptors: 1.0.0 + object-keys: 1.1.1 + dev: false + + /dequal@2.0.3: + resolution: + { integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA== } + engines: { node: ">=6" } + dev: false + + /didyoumean@1.2.2: + resolution: + { integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw== } + dev: false + + /dir-glob@3.0.1: + resolution: + { integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== } + engines: { node: ">=8" } + dependencies: + path-type: 4.0.0 + dev: false + + /dlv@1.1.3: + resolution: + { integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA== } + dev: false + + /doctrine@2.1.0: + resolution: + { integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== } + engines: { node: ">=0.10.0" } + dependencies: + esutils: 2.0.3 + dev: false + + /doctrine@3.0.0: + resolution: + { integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== } + engines: { node: ">=6.0.0" } + dependencies: + esutils: 2.0.3 + + /electron-to-chromium@1.4.505: + resolution: + { integrity: sha512-0A50eL5BCCKdxig2SsCXhpuztnB9PfUgRMojj5tMvt8O54lbwz3t6wNgnpiTRosw5QjlJB7ixhVyeg8daLQwSQ== } + dev: false + + /emoji-regex@9.2.2: + resolution: + { integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== } + dev: false + + /enhanced-resolve@5.15.0: + resolution: + { integrity: sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg== } + engines: { node: ">=10.13.0" } + dependencies: + graceful-fs: 4.2.11 + tapable: 2.2.1 + dev: false + + /es-abstract@1.22.1: + resolution: + { integrity: sha512-ioRRcXMO6OFyRpyzV3kE1IIBd4WG5/kltnzdxSCqoP8CMGs/Li+M1uF5o7lOkZVFjDs+NLesthnF66Pg/0q0Lw== } + engines: { node: ">= 0.4" } + dependencies: + array-buffer-byte-length: 1.0.0 + arraybuffer.prototype.slice: 1.0.1 + available-typed-arrays: 1.0.5 + call-bind: 1.0.2 + es-set-tostringtag: 2.0.1 + es-to-primitive: 1.2.1 + function.prototype.name: 1.1.6 + get-intrinsic: 1.2.1 + get-symbol-description: 1.0.0 + globalthis: 1.0.3 + gopd: 1.0.1 + has: 1.0.3 + has-property-descriptors: 1.0.0 + has-proto: 1.0.1 + has-symbols: 1.0.3 + internal-slot: 1.0.5 + is-array-buffer: 3.0.2 + is-callable: 1.2.7 + is-negative-zero: 2.0.2 + is-regex: 1.1.4 + is-shared-array-buffer: 1.0.2 + is-string: 1.0.7 + is-typed-array: 1.1.12 + is-weakref: 1.0.2 + object-inspect: 1.12.3 + object-keys: 1.1.1 + object.assign: 4.1.4 + regexp.prototype.flags: 1.5.0 + safe-array-concat: 1.0.0 + safe-regex-test: 1.0.0 + string.prototype.trim: 1.2.7 + string.prototype.trimend: 1.0.6 + string.prototype.trimstart: 1.0.6 + typed-array-buffer: 1.0.0 + typed-array-byte-length: 1.0.0 + typed-array-byte-offset: 1.0.0 + typed-array-length: 1.0.4 + unbox-primitive: 1.0.2 + which-typed-array: 1.1.11 + dev: false + + /es-iterator-helpers@1.0.14: + resolution: + { integrity: sha512-JgtVnwiuoRuzLvqelrvN3Xu7H9bu2ap/kQ2CrM62iidP8SKuD99rWU3CJy++s7IVL2qb/AjXPGR/E7i9ngd/Cw== } + dependencies: + asynciterator.prototype: 1.0.0 + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.22.1 + es-set-tostringtag: 2.0.1 + function-bind: 1.1.1 + get-intrinsic: 1.2.1 + globalthis: 1.0.3 + has-property-descriptors: 1.0.0 + has-proto: 1.0.1 + has-symbols: 1.0.3 + internal-slot: 1.0.5 + iterator.prototype: 1.1.0 + safe-array-concat: 1.0.0 + dev: false + + /es-set-tostringtag@2.0.1: + resolution: + { integrity: sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg== } + engines: { node: ">= 0.4" } + dependencies: + get-intrinsic: 1.2.1 + has: 1.0.3 + has-tostringtag: 1.0.0 + dev: false + + /es-shim-unscopables@1.0.0: + resolution: + { integrity: sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w== } + dependencies: + has: 1.0.3 + dev: false + + /es-to-primitive@1.2.1: + resolution: + { integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== } + engines: { node: ">= 0.4" } + dependencies: + is-callable: 1.2.7 + is-date-object: 1.0.5 + is-symbol: 1.0.4 + dev: false + + /escalade@3.1.1: + resolution: + { integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== } + engines: { node: ">=6" } + dev: false + + /escape-string-regexp@4.0.0: + resolution: + { integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== } + engines: { node: ">=10" } + + /eslint-config-next@13.4.19(eslint@8.48.0)(typescript@5.2.2): + resolution: + { integrity: sha512-WE8367sqMnjhWHvR5OivmfwENRQ1ixfNE9hZwQqNCsd+iM3KnuMc1V8Pt6ytgjxjf23D+xbesADv9x3xaKfT3g== } + peerDependencies: + eslint: ^7.23.0 || ^8.0.0 + typescript: ">=3.3.1" + peerDependenciesMeta: + typescript: + optional: true + dependencies: + "@next/eslint-plugin-next": 13.4.19 + "@rushstack/eslint-patch": 1.3.3 + "@typescript-eslint/parser": 6.5.0(eslint@8.48.0)(typescript@5.2.2) + eslint: 8.48.0 + eslint-import-resolver-node: 0.3.9 + eslint-import-resolver-typescript: 3.6.0(@typescript-eslint/parser@6.5.0)(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.28.1)(eslint@8.48.0) + eslint-plugin-import: 2.28.1(@typescript-eslint/parser@6.5.0)(eslint-import-resolver-typescript@3.6.0)(eslint@8.48.0) + eslint-plugin-jsx-a11y: 6.7.1(eslint@8.48.0) + eslint-plugin-react: 7.33.2(eslint@8.48.0) + eslint-plugin-react-hooks: 4.6.0(eslint@8.48.0) + typescript: 5.2.2 + transitivePeerDependencies: + - eslint-import-resolver-webpack + - supports-color + dev: false + + /eslint-config-prettier@9.0.0(eslint@8.48.0): + resolution: + { integrity: sha512-IcJsTkJae2S35pRsRAwoCE+925rJJStOdkKnLVgtE+tEpqU0EVVM7OqrwxqgptKdX29NUwC82I5pXsGFIgSevw== } + hasBin: true + peerDependencies: + eslint: ">=7.0.0" + dependencies: + eslint: 8.48.0 + dev: true + + /eslint-import-resolver-node@0.3.9: + resolution: + { integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g== } + dependencies: + debug: 3.2.7 + is-core-module: 2.13.0 + resolve: 1.22.4 + transitivePeerDependencies: + - supports-color + dev: false + + /eslint-import-resolver-typescript@3.6.0(@typescript-eslint/parser@6.5.0)(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.28.1)(eslint@8.48.0): + resolution: + { integrity: sha512-QTHR9ddNnn35RTxlaEnx2gCxqFlF2SEN0SE2d17SqwyM7YOSI2GHWRYp5BiRkObTUNYPupC/3Fq2a0PpT+EKpg== } + engines: { node: ^14.18.0 || >=16.0.0 } + peerDependencies: + eslint: "*" + eslint-plugin-import: "*" + dependencies: + debug: 4.3.4 + enhanced-resolve: 5.15.0 + eslint: 8.48.0 + eslint-module-utils: 2.8.0(@typescript-eslint/parser@6.5.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.0)(eslint@8.48.0) + eslint-plugin-import: 2.28.1(@typescript-eslint/parser@6.5.0)(eslint-import-resolver-typescript@3.6.0)(eslint@8.48.0) + fast-glob: 3.3.1 + get-tsconfig: 4.7.0 + is-core-module: 2.13.0 + is-glob: 4.0.3 + transitivePeerDependencies: + - "@typescript-eslint/parser" + - eslint-import-resolver-node + - eslint-import-resolver-webpack + - supports-color + dev: false + + /eslint-module-utils@2.8.0(@typescript-eslint/parser@6.5.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.0)(eslint@8.48.0): + resolution: + { integrity: sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw== } + engines: { node: ">=4" } + peerDependencies: + "@typescript-eslint/parser": "*" + eslint: "*" + eslint-import-resolver-node: "*" + eslint-import-resolver-typescript: "*" + eslint-import-resolver-webpack: "*" + peerDependenciesMeta: + "@typescript-eslint/parser": + optional: true + eslint: + optional: true + eslint-import-resolver-node: + optional: true + eslint-import-resolver-typescript: + optional: true + eslint-import-resolver-webpack: + optional: true + dependencies: + "@typescript-eslint/parser": 6.5.0(eslint@8.48.0)(typescript@5.2.2) + debug: 3.2.7 + eslint: 8.48.0 + eslint-import-resolver-node: 0.3.9 + eslint-import-resolver-typescript: 3.6.0(@typescript-eslint/parser@6.5.0)(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.28.1)(eslint@8.48.0) + transitivePeerDependencies: + - supports-color + dev: false + + /eslint-plugin-import@2.28.1(@typescript-eslint/parser@6.5.0)(eslint-import-resolver-typescript@3.6.0)(eslint@8.48.0): + resolution: + { integrity: sha512-9I9hFlITvOV55alzoKBI+K9q74kv0iKMeY6av5+umsNwayt59fz692daGyjR+oStBQgx6nwR9rXldDev3Clw+A== } + engines: { node: ">=4" } + peerDependencies: + "@typescript-eslint/parser": "*" + eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 + peerDependenciesMeta: + "@typescript-eslint/parser": + optional: true + dependencies: + "@typescript-eslint/parser": 6.5.0(eslint@8.48.0)(typescript@5.2.2) + array-includes: 3.1.6 + array.prototype.findlastindex: 1.2.3 + array.prototype.flat: 1.3.1 + array.prototype.flatmap: 1.3.1 + debug: 3.2.7 + doctrine: 2.1.0 + eslint: 8.48.0 + eslint-import-resolver-node: 0.3.9 + eslint-module-utils: 2.8.0(@typescript-eslint/parser@6.5.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.0)(eslint@8.48.0) + has: 1.0.3 + is-core-module: 2.13.0 + is-glob: 4.0.3 + minimatch: 3.1.2 + object.fromentries: 2.0.7 + object.groupby: 1.0.1 + object.values: 1.1.7 + semver: 6.3.1 + tsconfig-paths: 3.14.2 + transitivePeerDependencies: + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack + - supports-color + dev: false + + /eslint-plugin-jsx-a11y@6.7.1(eslint@8.48.0): + resolution: + { integrity: sha512-63Bog4iIethyo8smBklORknVjB0T2dwB8Mr/hIC+fBS0uyHdYYpzM/Ed+YC8VxTjlXHEWFOdmgwcDn1U2L9VCA== } + engines: { node: ">=4.0" } + peerDependencies: + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 + dependencies: + "@babel/runtime": 7.22.11 + aria-query: 5.3.0 + array-includes: 3.1.6 + array.prototype.flatmap: 1.3.1 + ast-types-flow: 0.0.7 + axe-core: 4.7.2 + axobject-query: 3.2.1 + damerau-levenshtein: 1.0.8 + emoji-regex: 9.2.2 + eslint: 8.48.0 + has: 1.0.3 + jsx-ast-utils: 3.3.5 + language-tags: 1.0.5 + minimatch: 3.1.2 + object.entries: 1.1.7 + object.fromentries: 2.0.7 + semver: 6.3.1 + dev: false + + /eslint-plugin-react-hooks@4.6.0(eslint@8.48.0): + resolution: + { integrity: sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g== } + engines: { node: ">=10" } + peerDependencies: + eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 + dependencies: + eslint: 8.48.0 + dev: false + + /eslint-plugin-react@7.33.2(eslint@8.48.0): + resolution: + { integrity: sha512-73QQMKALArI8/7xGLNI/3LylrEYrlKZSb5C9+q3OtOewTnMQi5cT+aE9E41sLCmli3I9PGGmD1yiZydyo4FEPw== } + engines: { node: ">=4" } + peerDependencies: + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 + dependencies: + array-includes: 3.1.6 + array.prototype.flatmap: 1.3.1 + array.prototype.tosorted: 1.1.1 + doctrine: 2.1.0 + es-iterator-helpers: 1.0.14 + eslint: 8.48.0 + estraverse: 5.3.0 + jsx-ast-utils: 3.3.5 + minimatch: 3.1.2 + object.entries: 1.1.7 + object.fromentries: 2.0.7 + object.hasown: 1.1.3 + object.values: 1.1.7 + prop-types: 15.8.1 + resolve: 2.0.0-next.4 + semver: 6.3.1 + string.prototype.matchall: 4.0.9 + dev: false + + /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 + + /eslint-visitor-keys@3.4.3: + resolution: + { integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + + /eslint@8.48.0: + resolution: + { integrity: sha512-sb6DLeIuRXxeM1YljSe1KEx9/YYeZFQWcV8Rq9HfigmdDEugjLEVEa1ozDjL6YDjBpQHPJxJzze+alxi4T3OLg== } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + hasBin: true + dependencies: + "@eslint-community/eslint-utils": 4.4.0(eslint@8.48.0) + "@eslint-community/regexpp": 4.8.0 + "@eslint/eslintrc": 2.1.2 + "@eslint/js": 8.48.0 + "@humanwhocodes/config-array": 0.11.11 + "@humanwhocodes/module-importer": 1.0.1 + "@nodelib/fs.walk": 1.2.8 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.3 + debug: 4.3.4 + doctrine: 3.0.0 + escape-string-regexp: 4.0.0 + eslint-scope: 7.2.2 + eslint-visitor-keys: 3.4.3 + espree: 9.6.1 + esquery: 1.5.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 6.0.1 + find-up: 5.0.0 + glob-parent: 6.0.2 + globals: 13.21.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 + + /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 + + /esquery@1.5.0: + resolution: + { integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg== } + engines: { node: ">=0.10" } + dependencies: + estraverse: 5.3.0 + + /esrecurse@4.3.0: + resolution: + { integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== } + engines: { node: ">=4.0" } + dependencies: + estraverse: 5.3.0 + + /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" } + + /fast-deep-equal@3.1.3: + resolution: + { integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== } + + /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 + + /fast-json-stable-stringify@2.1.0: + resolution: + { integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== } + + /fast-levenshtein@2.0.6: + resolution: + { integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== } + + /fastq@1.15.0: + resolution: + { integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw== } + dependencies: + reusify: 1.0.4 + + /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.0 + + /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@5.0.0: + resolution: + { integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== } + engines: { node: ">=10" } + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + + /flat-cache@3.1.0: + resolution: + { integrity: sha512-OHx4Qwrrt0E4jEIcI5/Xb+f+QmJYNj2rrK8wiIdQOIrB9WrrJL8cjZvXdXuBTkkEwEqLycb5BeZDV1o2i9bTew== } + engines: { node: ">=12.0.0" } + dependencies: + flatted: 3.2.7 + keyv: 4.5.3 + rimraf: 3.0.2 + + /flatted@3.2.7: + resolution: + { integrity: sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ== } + + /for-each@0.3.3: + resolution: + { integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== } + dependencies: + is-callable: 1.2.7 + dev: false + + /fraction.js@4.3.1: + resolution: + { integrity: sha512-nx0cki48JBA6ThPeUpeKCNpdhEl/9bRS+dAEYnRUod+Z1jhFfC3K/mBLorZZntqHM+GTH3/dkkpfoT3QITYe7g== } + dev: false + + /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: false + optional: true + + /function-bind@1.1.1: + resolution: + { integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== } + dev: false + + /function.prototype.name@1.1.6: + resolution: + { integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg== } + engines: { node: ">= 0.4" } + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.22.1 + functions-have-names: 1.2.3 + dev: false + + /functions-have-names@1.2.3: + resolution: + { integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== } + dev: false + + /get-intrinsic@1.2.1: + resolution: + { integrity: sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw== } + dependencies: + function-bind: 1.1.1 + has: 1.0.3 + has-proto: 1.0.1 + has-symbols: 1.0.3 + dev: false + + /get-symbol-description@1.0.0: + resolution: + { integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw== } + engines: { node: ">= 0.4" } + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.2.1 + dev: false + + /get-tsconfig@4.7.0: + resolution: + { integrity: sha512-pmjiZ7xtB8URYm74PlGJozDNyhvsVLUcpBa8DZBG3bWHwaHa9bPiRpiSfovw+fjhwONSCWKRyk+JQHEGZmMrzw== } + dependencies: + resolve-pkg-maps: 1.0.0 + dev: false + + /glob-parent@5.1.2: + resolution: + { integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== } + engines: { node: ">= 6" } + dependencies: + is-glob: 4.0.3 + dev: false + + /glob-parent@6.0.2: + resolution: + { integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== } + engines: { node: ">=10.13.0" } + dependencies: + is-glob: 4.0.3 + + /glob-to-regexp@0.4.1: + resolution: + { integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== } + dev: false + + /glob@7.1.6: + resolution: + { integrity: sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== } + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + dev: false + + /glob@7.1.7: + resolution: + { integrity: sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ== } + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + dev: false + + /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 + + /globals@13.21.0: + resolution: + { integrity: sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg== } + engines: { node: ">=8" } + dependencies: + type-fest: 0.20.2 + + /globalthis@1.0.3: + resolution: + { integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA== } + engines: { node: ">= 0.4" } + dependencies: + define-properties: 1.2.0 + dev: false + + /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 + dev: false + + /gopd@1.0.1: + resolution: + { integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== } + dependencies: + get-intrinsic: 1.2.1 + dev: false + + /graceful-fs@4.2.11: + resolution: + { integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== } + dev: false + + /graphemer@1.4.0: + resolution: + { integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== } + + /has-bigints@1.0.2: + resolution: + { integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== } + dev: false + + /has-flag@4.0.0: + resolution: + { integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== } + engines: { node: ">=8" } + + /has-property-descriptors@1.0.0: + resolution: + { integrity: sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ== } + dependencies: + get-intrinsic: 1.2.1 + dev: false + + /has-proto@1.0.1: + resolution: + { integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg== } + engines: { node: ">= 0.4" } + dev: false + + /has-symbols@1.0.3: + resolution: + { integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== } + engines: { node: ">= 0.4" } + dev: false + + /has-tostringtag@1.0.0: + resolution: + { integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== } + engines: { node: ">= 0.4" } + dependencies: + has-symbols: 1.0.3 + dev: false + + /has@1.0.3: + resolution: + { integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== } + engines: { node: ">= 0.4.0" } + dependencies: + function-bind: 1.1.1 + dev: false + + /ignore@5.2.4: + resolution: + { integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ== } + engines: { node: ">= 4" } + + /import-fresh@3.3.0: + resolution: + { integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== } + engines: { node: ">=6" } + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + + /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== } + + /internal-slot@1.0.5: + resolution: + { integrity: sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ== } + engines: { node: ">= 0.4" } + dependencies: + get-intrinsic: 1.2.1 + has: 1.0.3 + side-channel: 1.0.4 + dev: false + + /is-array-buffer@3.0.2: + resolution: + { integrity: sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w== } + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.2.1 + is-typed-array: 1.1.12 + dev: false + + /is-async-function@2.0.0: + resolution: + { integrity: sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA== } + engines: { node: ">= 0.4" } + dependencies: + has-tostringtag: 1.0.0 + dev: false + + /is-bigint@1.0.4: + resolution: + { integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== } + dependencies: + has-bigints: 1.0.2 + dev: false + + /is-binary-path@2.1.0: + resolution: + { integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== } + engines: { node: ">=8" } + dependencies: + binary-extensions: 2.2.0 + dev: false + + /is-boolean-object@1.1.2: + resolution: + { integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== } + engines: { node: ">= 0.4" } + dependencies: + call-bind: 1.0.2 + has-tostringtag: 1.0.0 + dev: false + + /is-callable@1.2.7: + resolution: + { integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== } + engines: { node: ">= 0.4" } + dev: false + + /is-core-module@2.13.0: + resolution: + { integrity: sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ== } + dependencies: + has: 1.0.3 + dev: false + + /is-date-object@1.0.5: + resolution: + { integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== } + engines: { node: ">= 0.4" } + dependencies: + has-tostringtag: 1.0.0 + dev: false + + /is-extglob@2.1.1: + resolution: + { integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== } + engines: { node: ">=0.10.0" } + + /is-finalizationregistry@1.0.2: + resolution: + { integrity: sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw== } + dependencies: + call-bind: 1.0.2 + dev: false + + /is-generator-function@1.0.10: + resolution: + { integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A== } + engines: { node: ">= 0.4" } + dependencies: + has-tostringtag: 1.0.0 + dev: false + + /is-glob@4.0.3: + resolution: + { integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== } + engines: { node: ">=0.10.0" } + dependencies: + is-extglob: 2.1.1 + + /is-map@2.0.2: + resolution: + { integrity: sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg== } + dev: false + + /is-negative-zero@2.0.2: + resolution: + { integrity: sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA== } + engines: { node: ">= 0.4" } + dev: false + + /is-number-object@1.0.7: + resolution: + { integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== } + engines: { node: ">= 0.4" } + dependencies: + has-tostringtag: 1.0.0 + dev: false + + /is-number@7.0.0: + resolution: + { integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== } + engines: { node: ">=0.12.0" } + dev: false + + /is-path-inside@3.0.3: + resolution: + { integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== } + engines: { node: ">=8" } + + /is-regex@1.1.4: + resolution: + { integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== } + engines: { node: ">= 0.4" } + dependencies: + call-bind: 1.0.2 + has-tostringtag: 1.0.0 + dev: false + + /is-set@2.0.2: + resolution: + { integrity: sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g== } + dev: false + + /is-shared-array-buffer@1.0.2: + resolution: + { integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA== } + dependencies: + call-bind: 1.0.2 + dev: false + + /is-string@1.0.7: + resolution: + { integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== } + engines: { node: ">= 0.4" } + dependencies: + has-tostringtag: 1.0.0 + dev: false + + /is-symbol@1.0.4: + resolution: + { integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== } + engines: { node: ">= 0.4" } + dependencies: + has-symbols: 1.0.3 + dev: false + + /is-typed-array@1.1.12: + resolution: + { integrity: sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg== } + engines: { node: ">= 0.4" } + dependencies: + which-typed-array: 1.1.11 + dev: false + + /is-weakmap@2.0.1: + resolution: + { integrity: sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA== } + dev: false + + /is-weakref@1.0.2: + resolution: + { integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== } + dependencies: + call-bind: 1.0.2 + dev: false + + /is-weakset@2.0.2: + resolution: + { integrity: sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg== } + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.2.1 + dev: false + + /isarray@2.0.5: + resolution: + { integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== } + dev: false + + /isexe@2.0.0: + resolution: + { integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== } + + /iterator.prototype@1.1.0: + resolution: + { integrity: sha512-rjuhAk1AJ1fssphHD0IFV6TWL40CwRZ53FrztKx43yk2v6rguBYsY4Bj1VU4HmoMmKwZUlx7mfnhDf9cOp4YTw== } + dependencies: + define-properties: 1.2.0 + get-intrinsic: 1.2.1 + has-symbols: 1.0.3 + has-tostringtag: 1.0.0 + reflect.getprototypeof: 1.0.3 + dev: false + + /jiti@1.19.3: + resolution: + { integrity: sha512-5eEbBDQT/jF1xg6l36P+mWGGoH9Spuy0PCdSr2dtWRDGC6ph/w9ZCL4lmESW8f8F7MwT3XKescfP0wnZWAKL9w== } + hasBin: true + dev: false + + /js-tokens@4.0.0: + resolution: + { integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== } + dev: false + + /js-yaml@4.1.0: + resolution: + { integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== } + hasBin: true + dependencies: + argparse: 2.0.1 + + /json-buffer@3.0.1: + resolution: + { integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== } + + /json-schema-traverse@0.4.1: + resolution: + { integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== } + + /json-stable-stringify-without-jsonify@1.0.1: + resolution: + { integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== } + + /json5@1.0.2: + resolution: + { integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA== } + hasBin: true + dependencies: + minimist: 1.2.8 + dev: false + + /jsx-ast-utils@3.3.5: + resolution: + { integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ== } + engines: { node: ">=4.0" } + dependencies: + array-includes: 3.1.6 + array.prototype.flat: 1.3.1 + object.assign: 4.1.4 + object.values: 1.1.7 + dev: false + + /keyv@4.5.3: + resolution: + { integrity: sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug== } + dependencies: + json-buffer: 3.0.1 + + /language-subtag-registry@0.3.22: + resolution: + { integrity: sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w== } + dev: false + + /language-tags@1.0.5: + resolution: + { integrity: sha512-qJhlO9cGXi6hBGKoxEG/sKZDAHD5Hnu9Hs4WbOY3pCWXDhw0N8x1NenNzm2EnNLkLkk7J2SdxAkDSbb6ftT+UQ== } + dependencies: + language-subtag-registry: 0.3.22 + dev: false + + /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 + + /lilconfig@2.1.0: + resolution: + { integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ== } + engines: { node: ">=10" } + dev: false + + /lines-and-columns@1.2.4: + resolution: + { integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== } + dev: false + + /locate-path@6.0.0: + resolution: + { integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== } + engines: { node: ">=10" } + dependencies: + p-locate: 5.0.0 + + /lodash.merge@4.6.2: + resolution: + { integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== } + + /loose-envify@1.4.0: + resolution: + { integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== } + hasBin: true + dependencies: + js-tokens: 4.0.0 + dev: false + + /lru-cache@6.0.0: + resolution: + { integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== } + engines: { node: ">=10" } + dependencies: + yallist: 4.0.0 + 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 + + /minimatch@3.1.2: + resolution: + { integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== } + dependencies: + brace-expansion: 1.1.11 + + /minimist@1.2.8: + resolution: + { integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== } + dev: false + + /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 + + /mz@2.7.0: + resolution: + { integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q== } + dependencies: + any-promise: 1.3.0 + object-assign: 4.1.1 + thenify-all: 1.6.0 + dev: false + + /nanoid@3.3.6: + resolution: + { integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA== } + engines: { node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1 } + hasBin: true + dev: false + + /natural-compare@1.4.0: + resolution: + { integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== } + + /next@13.4.19(react-dom@18.2.0)(react@18.2.0): + resolution: + { integrity: sha512-HuPSzzAbJ1T4BD8e0bs6B9C1kWQ6gv8ykZoRWs5AQoiIuqbGHHdQO7Ljuvg05Q0Z24E2ABozHe6FxDvI6HfyAw== } + engines: { node: ">=16.8.0" } + hasBin: true + peerDependencies: + "@opentelemetry/api": ^1.1.0 + react: ^18.2.0 + react-dom: ^18.2.0 + sass: ^1.3.0 + peerDependenciesMeta: + "@opentelemetry/api": + optional: true + sass: + optional: true + dependencies: + "@next/env": 13.4.19 + "@swc/helpers": 0.5.1 + busboy: 1.6.0 + caniuse-lite: 1.0.30001524 + postcss: 8.4.14 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + styled-jsx: 5.1.1(react@18.2.0) + watchpack: 2.4.0 + zod: 3.21.4 + optionalDependencies: + "@next/swc-darwin-arm64": 13.4.19 + "@next/swc-darwin-x64": 13.4.19 + "@next/swc-linux-arm64-gnu": 13.4.19 + "@next/swc-linux-arm64-musl": 13.4.19 + "@next/swc-linux-x64-gnu": 13.4.19 + "@next/swc-linux-x64-musl": 13.4.19 + "@next/swc-win32-arm64-msvc": 13.4.19 + "@next/swc-win32-ia32-msvc": 13.4.19 + "@next/swc-win32-x64-msvc": 13.4.19 + transitivePeerDependencies: + - "@babel/core" + - babel-plugin-macros + dev: false + + /node-releases@2.0.13: + resolution: + { integrity: sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ== } + dev: false + + /normalize-path@3.0.0: + resolution: + { integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== } + engines: { node: ">=0.10.0" } + dev: false + + /normalize-range@0.1.2: + resolution: + { integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA== } + engines: { node: ">=0.10.0" } + dev: false + + /object-assign@4.1.1: + resolution: + { integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== } + engines: { node: ">=0.10.0" } + dev: false + + /object-hash@3.0.0: + resolution: + { integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw== } + engines: { node: ">= 6" } + dev: false + + /object-inspect@1.12.3: + resolution: + { integrity: sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g== } + dev: false + + /object-keys@1.1.1: + resolution: + { integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== } + engines: { node: ">= 0.4" } + dev: false + + /object.assign@4.1.4: + resolution: + { integrity: sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ== } + engines: { node: ">= 0.4" } + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + has-symbols: 1.0.3 + object-keys: 1.1.1 + dev: false + + /object.entries@1.1.7: + resolution: + { integrity: sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA== } + engines: { node: ">= 0.4" } + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.22.1 + dev: false + + /object.fromentries@2.0.7: + resolution: + { integrity: sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA== } + engines: { node: ">= 0.4" } + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.22.1 + dev: false + + /object.groupby@1.0.1: + resolution: + { integrity: sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ== } + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.22.1 + get-intrinsic: 1.2.1 + dev: false + + /object.hasown@1.1.3: + resolution: + { integrity: sha512-fFI4VcYpRHvSLXxP7yiZOMAd331cPfd2p7PFDVbgUsYOfCT3tICVqXWngbjr4m49OvsBwUBQ6O2uQoJvy3RexA== } + dependencies: + define-properties: 1.2.0 + es-abstract: 1.22.1 + dev: false + + /object.values@1.1.7: + resolution: + { integrity: sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng== } + engines: { node: ">= 0.4" } + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.22.1 + dev: false + + /once@1.4.0: + resolution: + { integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== } + dependencies: + wrappy: 1.0.2 + + /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 + + /p-limit@3.1.0: + resolution: + { integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== } + engines: { node: ">=10" } + dependencies: + yocto-queue: 0.1.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 + + /parent-module@1.0.1: + resolution: + { integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== } + engines: { node: ">=6" } + dependencies: + callsites: 3.1.0 + + /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== } + 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 + + /pify@2.3.0: + resolution: + { integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog== } + engines: { node: ">=0.10.0" } + dev: false + + /pirates@4.0.6: + resolution: + { integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg== } + engines: { node: ">= 6" } + dev: false + + /postcss-import@15.1.0(postcss@8.4.29): + resolution: + { integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew== } + engines: { node: ">=14.0.0" } + peerDependencies: + postcss: ^8.0.0 + dependencies: + postcss: 8.4.29 + postcss-value-parser: 4.2.0 + read-cache: 1.0.0 + resolve: 1.22.4 + dev: false + + /postcss-js@4.0.1(postcss@8.4.29): + resolution: + { integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw== } + engines: { node: ^12 || ^14 || >= 16 } + peerDependencies: + postcss: ^8.4.21 + dependencies: + camelcase-css: 2.0.1 + postcss: 8.4.29 + dev: false + + /postcss-load-config@4.0.1(postcss@8.4.29): + resolution: + { integrity: sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA== } + engines: { node: ">= 14" } + peerDependencies: + postcss: ">=8.0.9" + ts-node: ">=9.0.0" + peerDependenciesMeta: + postcss: + optional: true + ts-node: + optional: true + dependencies: + lilconfig: 2.1.0 + postcss: 8.4.29 + yaml: 2.3.2 + dev: false + + /postcss-nested@6.0.1(postcss@8.4.29): + resolution: + { integrity: sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ== } + engines: { node: ">=12.0" } + peerDependencies: + postcss: ^8.2.14 + dependencies: + postcss: 8.4.29 + postcss-selector-parser: 6.0.13 + dev: false + + /postcss-selector-parser@6.0.13: + resolution: + { integrity: sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ== } + engines: { node: ">=4" } + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + dev: false + + /postcss-value-parser@4.2.0: + resolution: + { integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== } + dev: false + + /postcss@8.4.14: + resolution: + { integrity: sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig== } + engines: { node: ^10 || ^12 || >=14 } + dependencies: + nanoid: 3.3.6 + picocolors: 1.0.0 + source-map-js: 1.0.2 + dev: false + + /postcss@8.4.29: + resolution: + { integrity: sha512-cbI+jaqIeu/VGqXEarWkRCCffhjgXc0qjBtXpqJhTBohMUjUQnbBr0xqX3vEKudc4iviTewcJo5ajcec5+wdJw== } + engines: { node: ^10 || ^12 || >=14 } + dependencies: + nanoid: 3.3.6 + picocolors: 1.0.0 + source-map-js: 1.0.2 + dev: false + + /prelude-ls@1.2.1: + resolution: + { integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== } + engines: { node: ">= 0.8.0" } + + /prettier-plugin-tailwindcss@0.5.3(prettier@3.0.3): + resolution: + { integrity: sha512-M5K80V21yM+CTm/FEFYRv9/9LyInYbCSXpIoPAKMm8zy89IOwdiA2e4JVbcO7tvRtAQWz32zdj7/WKcsmFyAVg== } + engines: { node: ">=14.21.3" } + peerDependencies: + "@ianvs/prettier-plugin-sort-imports": "*" + "@prettier/plugin-pug": "*" + "@shopify/prettier-plugin-liquid": "*" + "@shufo/prettier-plugin-blade": "*" + "@trivago/prettier-plugin-sort-imports": "*" + prettier: ^3.0 + prettier-plugin-astro: "*" + prettier-plugin-css-order: "*" + prettier-plugin-import-sort: "*" + prettier-plugin-jsdoc: "*" + prettier-plugin-marko: "*" + prettier-plugin-organize-attributes: "*" + prettier-plugin-organize-imports: "*" + prettier-plugin-style-order: "*" + prettier-plugin-svelte: "*" + prettier-plugin-twig-melody: "*" + peerDependenciesMeta: + "@ianvs/prettier-plugin-sort-imports": + optional: true + "@prettier/plugin-pug": + optional: true + "@shopify/prettier-plugin-liquid": + optional: true + "@shufo/prettier-plugin-blade": + optional: true + "@trivago/prettier-plugin-sort-imports": + optional: true + prettier-plugin-astro: + optional: true + prettier-plugin-css-order: + optional: true + prettier-plugin-import-sort: + optional: true + prettier-plugin-jsdoc: + optional: true + prettier-plugin-marko: + optional: true + prettier-plugin-organize-attributes: + optional: true + prettier-plugin-organize-imports: + optional: true + prettier-plugin-style-order: + optional: true + prettier-plugin-svelte: + optional: true + prettier-plugin-twig-melody: + optional: true + dependencies: + prettier: 3.0.3 + dev: true + + /prettier@3.0.3: + resolution: + { integrity: sha512-L/4pUDMxcNa8R/EthV08Zt42WBO4h1rarVtK0K+QJG0X187OLo7l699jWw0GKuwzkPQ//jMFA/8Xm6Fh3J/DAg== } + engines: { node: ">=14" } + hasBin: true + dev: true + + /prop-types@15.8.1: + resolution: + { integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== } + dependencies: + loose-envify: 1.4.0 + object-assign: 4.1.1 + react-is: 16.13.1 + dev: false + + /punycode@2.3.0: + resolution: + { integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA== } + engines: { node: ">=6" } + + /queue-microtask@1.2.3: + resolution: + { integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== } + + /react-dom@18.2.0(react@18.2.0): + resolution: + { integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g== } + peerDependencies: + react: ^18.2.0 + dependencies: + loose-envify: 1.4.0 + react: 18.2.0 + scheduler: 0.23.0 + dev: false + + /react-is@16.13.1: + resolution: + { integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== } + dev: false + + /react@18.2.0: + resolution: + { integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ== } + engines: { node: ">=0.10.0" } + dependencies: + loose-envify: 1.4.0 + dev: false + + /read-cache@1.0.0: + resolution: + { integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA== } + dependencies: + pify: 2.3.0 + dev: false + + /readdirp@3.6.0: + resolution: + { integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== } + engines: { node: ">=8.10.0" } + dependencies: + picomatch: 2.3.1 + dev: false + + /reflect.getprototypeof@1.0.3: + resolution: + { integrity: sha512-TTAOZpkJ2YLxl7mVHWrNo3iDMEkYlva/kgFcXndqMgbo/AZUmmavEkdXV+hXtE4P8xdyEKRzalaFqZVuwIk/Nw== } + engines: { node: ">= 0.4" } + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.22.1 + get-intrinsic: 1.2.1 + globalthis: 1.0.3 + which-builtin-type: 1.1.3 + dev: false + + /regenerator-runtime@0.14.0: + resolution: + { integrity: sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA== } + dev: false + + /regexp.prototype.flags@1.5.0: + resolution: + { integrity: sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA== } + engines: { node: ">= 0.4" } + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + functions-have-names: 1.2.3 + dev: false + + /resolve-from@4.0.0: + resolution: + { integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== } + engines: { node: ">=4" } + + /resolve-pkg-maps@1.0.0: + resolution: + { integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw== } + dev: false + + /resolve@1.22.4: + resolution: + { integrity: sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg== } + hasBin: true + dependencies: + is-core-module: 2.13.0 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + dev: false + + /resolve@2.0.0-next.4: + resolution: + { integrity: sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ== } + hasBin: true + dependencies: + is-core-module: 2.13.0 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + dev: false + + /reusify@1.0.4: + resolution: + { integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== } + engines: { iojs: ">=1.0.0", node: ">=0.10.0" } + + /rimraf@3.0.2: + resolution: + { integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== } + hasBin: true + dependencies: + glob: 7.2.3 + + /run-parallel@1.2.0: + resolution: + { integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== } + dependencies: + queue-microtask: 1.2.3 + + /safe-array-concat@1.0.0: + resolution: + { integrity: sha512-9dVEFruWIsnie89yym+xWTAYASdpw3CJV7Li/6zBewGf9z2i1j31rP6jnY0pHEO4QZh6N0K11bFjWmdR8UGdPQ== } + engines: { node: ">=0.4" } + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.2.1 + has-symbols: 1.0.3 + isarray: 2.0.5 + dev: false + + /safe-regex-test@1.0.0: + resolution: + { integrity: sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA== } + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.2.1 + is-regex: 1.1.4 + dev: false + + /scheduler@0.23.0: + resolution: + { integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw== } + dependencies: + loose-envify: 1.4.0 + dev: false + + /semver@6.3.1: + resolution: + { integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== } + hasBin: true + dev: false + + /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 + 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" } + + /side-channel@1.0.4: + resolution: + { integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== } + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.2.1 + object-inspect: 1.12.3 + dev: false + + /slash@3.0.0: + resolution: + { integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== } + engines: { node: ">=8" } + dev: false + + /source-map-js@1.0.2: + resolution: + { integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== } + engines: { node: ">=0.10.0" } + dev: false + + /streamsearch@1.1.0: + resolution: + { integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg== } + engines: { node: ">=10.0.0" } + dev: false + + /string.prototype.matchall@4.0.9: + resolution: + { integrity: sha512-6i5hL3MqG/K2G43mWXWgP+qizFW/QH/7kCNN13JrJS5q48FN5IKksLDscexKP3dnmB6cdm9jlNgAsWNLpSykmA== } + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.22.1 + get-intrinsic: 1.2.1 + has-symbols: 1.0.3 + internal-slot: 1.0.5 + regexp.prototype.flags: 1.5.0 + side-channel: 1.0.4 + dev: false + + /string.prototype.trim@1.2.7: + resolution: + { integrity: sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg== } + engines: { node: ">= 0.4" } + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.22.1 + dev: false + + /string.prototype.trimend@1.0.6: + resolution: + { integrity: sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ== } + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.22.1 + dev: false + + /string.prototype.trimstart@1.0.6: + resolution: + { integrity: sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA== } + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.22.1 + dev: false + + /strip-ansi@6.0.1: + resolution: + { integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== } + engines: { node: ">=8" } + dependencies: + ansi-regex: 5.0.1 + + /strip-bom@3.0.0: + resolution: + { integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== } + engines: { node: ">=4" } + dev: false + + /strip-json-comments@3.1.1: + resolution: + { integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== } + engines: { node: ">=8" } + + /styled-jsx@5.1.1(react@18.2.0): + resolution: + { integrity: sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw== } + engines: { node: ">= 12.0.0" } + peerDependencies: + "@babel/core": "*" + babel-plugin-macros: "*" + react: ">= 16.8.0 || 17.x.x || ^18.0.0-0" + peerDependenciesMeta: + "@babel/core": + optional: true + babel-plugin-macros: + optional: true + dependencies: + client-only: 0.0.1 + react: 18.2.0 + dev: false + + /sucrase@3.34.0: + resolution: + { integrity: sha512-70/LQEZ07TEcxiU2dz51FKaE6hCTWC6vr7FOk3Gr0U60C3shtAN+H+BFr9XlYe5xqf3RA8nrc+VIwzCfnxuXJw== } + engines: { node: ">=8" } + hasBin: true + dependencies: + "@jridgewell/gen-mapping": 0.3.3 + commander: 4.1.1 + glob: 7.1.6 + lines-and-columns: 1.2.4 + mz: 2.7.0 + pirates: 4.0.6 + ts-interface-checker: 0.1.13 + dev: false + + /supports-color@7.2.0: + resolution: + { integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== } + engines: { node: ">=8" } + dependencies: + has-flag: 4.0.0 + + /supports-preserve-symlinks-flag@1.0.0: + resolution: + { integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== } + engines: { node: ">= 0.4" } + dev: false + + /tailwindcss@3.3.3: + resolution: + { integrity: sha512-A0KgSkef7eE4Mf+nKJ83i75TMyq8HqY3qmFIJSWy8bNt0v1lG7jUcpGpoTFxAwYcWOphcTBLPPJg+bDfhDf52w== } + engines: { node: ">=14.0.0" } + hasBin: true + dependencies: + "@alloc/quick-lru": 5.2.0 + arg: 5.0.2 + chokidar: 3.5.3 + didyoumean: 1.2.2 + dlv: 1.1.3 + fast-glob: 3.3.1 + glob-parent: 6.0.2 + is-glob: 4.0.3 + jiti: 1.19.3 + lilconfig: 2.1.0 + micromatch: 4.0.5 + normalize-path: 3.0.0 + object-hash: 3.0.0 + picocolors: 1.0.0 + postcss: 8.4.29 + postcss-import: 15.1.0(postcss@8.4.29) + postcss-js: 4.0.1(postcss@8.4.29) + postcss-load-config: 4.0.1(postcss@8.4.29) + postcss-nested: 6.0.1(postcss@8.4.29) + postcss-selector-parser: 6.0.13 + resolve: 1.22.4 + sucrase: 3.34.0 + transitivePeerDependencies: + - ts-node + dev: false + + /tapable@2.2.1: + resolution: + { integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== } + engines: { node: ">=6" } + dev: false + + /text-table@0.2.0: + resolution: + { integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== } + + /thenify-all@1.6.0: + resolution: + { integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA== } + engines: { node: ">=0.8" } + dependencies: + thenify: 3.3.1 + dev: false + + /thenify@3.3.1: + resolution: + { integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw== } + dependencies: + any-promise: 1.3.0 + 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 + + /ts-api-utils@1.0.2(typescript@5.2.2): + resolution: + { integrity: sha512-Cbu4nIqnEdd+THNEsBdkolnOXhg0I8XteoHaEKgvsxpsbWda4IsUut2c187HxywQCvveojow0Dgw/amxtSKVkQ== } + engines: { node: ">=16.13.0" } + peerDependencies: + typescript: ">=4.2.0" + dependencies: + typescript: 5.2.2 + dev: false + + /ts-interface-checker@0.1.13: + resolution: + { integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA== } + dev: false + + /tsconfig-paths@3.14.2: + resolution: + { integrity: sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g== } + dependencies: + "@types/json5": 0.0.29 + json5: 1.0.2 + minimist: 1.2.8 + strip-bom: 3.0.0 + dev: false + + /tslib@2.6.2: + resolution: + { integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== } + dev: false + + /type-check@0.4.0: + resolution: + { integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== } + engines: { node: ">= 0.8.0" } + dependencies: + prelude-ls: 1.2.1 + + /type-fest@0.20.2: + resolution: + { integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== } + engines: { node: ">=10" } + + /typed-array-buffer@1.0.0: + resolution: + { integrity: sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw== } + engines: { node: ">= 0.4" } + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.2.1 + is-typed-array: 1.1.12 + dev: false + + /typed-array-byte-length@1.0.0: + resolution: + { integrity: sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA== } + engines: { node: ">= 0.4" } + dependencies: + call-bind: 1.0.2 + for-each: 0.3.3 + has-proto: 1.0.1 + is-typed-array: 1.1.12 + dev: false + + /typed-array-byte-offset@1.0.0: + resolution: + { integrity: sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg== } + engines: { node: ">= 0.4" } + dependencies: + available-typed-arrays: 1.0.5 + call-bind: 1.0.2 + for-each: 0.3.3 + has-proto: 1.0.1 + is-typed-array: 1.1.12 + dev: false + + /typed-array-length@1.0.4: + resolution: + { integrity: sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng== } + dependencies: + call-bind: 1.0.2 + for-each: 0.3.3 + is-typed-array: 1.1.12 + dev: false + + /typescript@5.2.2: + resolution: + { integrity: sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w== } + engines: { node: ">=14.17" } + hasBin: true + dev: false + + /unbox-primitive@1.0.2: + resolution: + { integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw== } + dependencies: + call-bind: 1.0.2 + has-bigints: 1.0.2 + has-symbols: 1.0.3 + which-boxed-primitive: 1.0.2 + dev: false + + /update-browserslist-db@1.0.11(browserslist@4.21.10): + resolution: + { integrity: sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA== } + hasBin: true + peerDependencies: + browserslist: ">= 4.21.0" + dependencies: + browserslist: 4.21.10 + escalade: 3.1.1 + picocolors: 1.0.0 + dev: false + + /uri-js@4.4.1: + resolution: + { integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== } + dependencies: + punycode: 2.3.0 + + /util-deprecate@1.0.2: + resolution: + { integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== } + dev: false + + /watchpack@2.4.0: + resolution: + { integrity: sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg== } + engines: { node: ">=10.13.0" } + dependencies: + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.11 + dev: false + + /which-boxed-primitive@1.0.2: + resolution: + { integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== } + dependencies: + is-bigint: 1.0.4 + is-boolean-object: 1.1.2 + is-number-object: 1.0.7 + is-string: 1.0.7 + is-symbol: 1.0.4 + dev: false + + /which-builtin-type@1.1.3: + resolution: + { integrity: sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw== } + engines: { node: ">= 0.4" } + dependencies: + function.prototype.name: 1.1.6 + has-tostringtag: 1.0.0 + is-async-function: 2.0.0 + is-date-object: 1.0.5 + is-finalizationregistry: 1.0.2 + is-generator-function: 1.0.10 + is-regex: 1.1.4 + is-weakref: 1.0.2 + isarray: 2.0.5 + which-boxed-primitive: 1.0.2 + which-collection: 1.0.1 + which-typed-array: 1.1.11 + dev: false + + /which-collection@1.0.1: + resolution: + { integrity: sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A== } + dependencies: + is-map: 2.0.2 + is-set: 2.0.2 + is-weakmap: 2.0.1 + is-weakset: 2.0.2 + dev: false + + /which-typed-array@1.1.11: + resolution: + { integrity: sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew== } + engines: { node: ">= 0.4" } + dependencies: + available-typed-arrays: 1.0.5 + call-bind: 1.0.2 + for-each: 0.3.3 + gopd: 1.0.1 + has-tostringtag: 1.0.0 + dev: false + + /which@2.0.2: + resolution: + { integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== } + engines: { node: ">= 8" } + hasBin: true + dependencies: + isexe: 2.0.0 + + /wrappy@1.0.2: + resolution: + { integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== } + + /yallist@4.0.0: + resolution: + { integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== } + dev: false + + /yaml@2.3.2: + resolution: + { integrity: sha512-N/lyzTPaJasoDmfV7YTrYCI0G/3ivm/9wdG0aHuheKowWQwGTsK0Eoiw6utmzAnI6pkJa0DUVygvp3spqqEKXg== } + engines: { node: ">= 14" } + dev: false + + /yocto-queue@0.1.0: + resolution: + { integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== } + engines: { node: ">=10" } + + /zod@3.21.4: + resolution: + { integrity: sha512-m46AKbrzKVzOzs/DZgVnG5H55N1sv1M8qZU3A8RIKbs3mrACDNeIOeilDymVb2HdmP8uwshOCF4uJ8uM9rCqJw== } + dev: false diff --git a/apps/web/postcss.config.js b/apps/web/postcss.config.js new file mode 100644 index 00000000..cce4985f --- /dev/null +++ b/apps/web/postcss.config.js @@ -0,0 +1 @@ +module.exports = { plugins: { tailwindcss: {}, autoprefixer: {} } }; diff --git a/apps/web/.gitinclude b/apps/web/public/.gitinclude similarity index 100% rename from apps/web/.gitinclude rename to apps/web/public/.gitinclude diff --git a/apps/web/tailwind.config.ts b/apps/web/tailwind.config.ts new file mode 100644 index 00000000..35ba2d07 --- /dev/null +++ b/apps/web/tailwind.config.ts @@ -0,0 +1,14 @@ +import type { Config } from "tailwindcss"; + +const config: Config = { + content: [ + "./pages/**/*.{js,ts,jsx,tsx,mdx}", + "./components/**/*.{js,ts,jsx,tsx,mdx}", + "./app/**/*.{js,ts,jsx,tsx,mdx}", + ], + theme: { + extend: {}, + }, + plugins: [], +}; +export default config; diff --git a/apps/web/tsconfig.json b/apps/web/tsconfig.json new file mode 100644 index 00000000..c7146963 --- /dev/null +++ b/apps/web/tsconfig.json @@ -0,0 +1,27 @@ +{ + "compilerOptions": { + "target": "es5", + "lib": ["dom", "dom.iterable", "esnext"], + "allowJs": true, + "skipLibCheck": true, + "strict": true, + "noEmit": true, + "esModuleInterop": true, + "module": "esnext", + "moduleResolution": "bundler", + "resolveJsonModule": true, + "isolatedModules": true, + "jsx": "preserve", + "incremental": true, + "plugins": [ + { + "name": "next" + } + ], + "paths": { + "@/*": ["./*"] + } + }, + "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"], + "exclude": ["node_modules"] +} From 1b0c609032cad4405ac5c08aa3c2e3d29d210c8f Mon Sep 17 00:00:00 2001 From: Florian LEROUX Date: Wed, 30 Aug 2023 13:46:47 +0200 Subject: [PATCH 546/883] ref(ci): change events --- .github/workflows/web.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/web.yml b/.github/workflows/web.yml index 317bc400..7701f0c1 100644 --- a/.github/workflows/web.yml +++ b/.github/workflows/web.yml @@ -1,10 +1,10 @@ -name: Next.js CI +name: "Web App CI/CD" on: push: - branches: [main] + branches: [app/web] pull_request: - branches: [main] + branches: [dev, main] defaults: run: From 0ece5236dc5a5d1c42fbbb18fbb959e2ae1ab5cb Mon Sep 17 00:00:00 2001 From: Florian LEROUX Date: Wed, 30 Aug 2023 13:48:50 +0200 Subject: [PATCH 547/883] fix(ci): change cache dependency path --- .github/workflows/web.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/workflows/web.yml b/.github/workflows/web.yml index 7701f0c1..681e1b60 100644 --- a/.github/workflows/web.yml +++ b/.github/workflows/web.yml @@ -23,6 +23,8 @@ jobs: with: node-version: "18.x" cache: "pnpm" + cache-dependency-path: apps/web/pnpm-lock.yaml + - name: Install dependencies run: pnpm install --frozen-lockfile @@ -41,6 +43,7 @@ jobs: with: node-version: "18.x" cache: "pnpm" + cache-dependency-path: apps/web/pnpm-lock.yaml - name: Install dependencies run: pnpm install --frozen-lockfile @@ -59,6 +62,7 @@ jobs: with: node-version: "18.x" cache: "pnpm" + cache-dependency-path: apps/web/pnpm-lock.yaml - name: Install dependencies run: pnpm install --frozen-lockfile From a080ce196c8bf0310fa0b3551d34429c57351080 Mon Sep 17 00:00:00 2001 From: Florian LEROUX Date: Wed, 30 Aug 2023 13:59:54 +0200 Subject: [PATCH 548/883] feat(ci): add tests --- .github/workflows/web.yml | 22 +- apps/web/package.json | 9 +- apps/web/pnpm-lock.yaml | 2858 +++++++++++++++++++++++------------- apps/web/tests/sum.test.ts | 22 + apps/web/vitest.config.ts | 12 + 5 files changed, 1922 insertions(+), 1001 deletions(-) create mode 100644 apps/web/tests/sum.test.ts create mode 100644 apps/web/vitest.config.ts diff --git a/.github/workflows/web.yml b/.github/workflows/web.yml index 681e1b60..52bf9c5b 100644 --- a/.github/workflows/web.yml +++ b/.github/workflows/web.yml @@ -47,7 +47,7 @@ jobs: - name: Install dependencies run: pnpm install --frozen-lockfile - - name: Lint + - name: Format run: pnpm format build: @@ -66,5 +66,23 @@ jobs: - name: Install dependencies run: pnpm install --frozen-lockfile - - name: Lint + - name: Build run: pnpm build + + tests: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@master + - uses: pnpm/action-setup@v2 + with: + version: latest + - uses: actions/setup-node@v3 + with: + node-version: "18.x" + cache: "pnpm" + cache-dependency-path: apps/web/pnpm-lock.yaml + - name: Install dependencies + run: pnpm install --frozen-lockfile + - name: Test + run: pnpm test diff --git a/apps/web/package.json b/apps/web/package.json index 10aeeced..e87afaf7 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -7,7 +7,8 @@ "build": "next build", "start": "next start", "lint": "next lint", - "format": "prettier --write \"**/*.{js,jsx,ts,tsx,json,md}\"" + "format": "prettier --write \"**/*.{js,jsx,ts,tsx,json,md}\"", + "test": "vitest" }, "dependencies": { "@types/node": "20.5.7", @@ -24,8 +25,12 @@ "typescript": "5.2.2" }, "devDependencies": { + "@vitejs/plugin-react": "^4.0.4", "eslint-config-prettier": "^9.0.0", + "jsdom": "^22.1.0", "prettier": "^3.0.3", - "prettier-plugin-tailwindcss": "^0.5.3" + "prettier-plugin-tailwindcss": "^0.5.3", + "vite-tsconfig-paths": "^4.2.0", + "vitest": "^0.34.3" } } diff --git a/apps/web/pnpm-lock.yaml b/apps/web/pnpm-lock.yaml index f2a20e51..b733350e 100644 --- a/apps/web/pnpm-lock.yaml +++ b/apps/web/pnpm-lock.yaml @@ -1,17 +1,17 @@ -lockfileVersion: "6.0" +lockfileVersion: '6.0' settings: autoInstallPeers: true excludeLinksFromLockfile: false dependencies: - "@types/node": + '@types/node': specifier: 20.5.7 version: 20.5.7 - "@types/react": + '@types/react': specifier: 18.2.21 version: 18.2.21 - "@types/react-dom": + '@types/react-dom': specifier: 18.2.7 version: 18.2.7 autoprefixer: @@ -25,7 +25,7 @@ dependencies: version: 13.4.19(eslint@8.48.0)(typescript@5.2.2) next: specifier: 13.4.19 - version: 13.4.19(react-dom@18.2.0)(react@18.2.0) + version: 13.4.19(@babel/core@7.22.11)(react-dom@18.2.0)(react@18.2.0) postcss: specifier: 8.4.29 version: 8.4.29 @@ -43,40 +43,449 @@ dependencies: version: 5.2.2 devDependencies: + '@vitejs/plugin-react': + specifier: ^4.0.4 + version: 4.0.4(vite@4.4.9) eslint-config-prettier: specifier: ^9.0.0 version: 9.0.0(eslint@8.48.0) + jsdom: + specifier: ^22.1.0 + version: 22.1.0 prettier: specifier: ^3.0.3 version: 3.0.3 prettier-plugin-tailwindcss: specifier: ^0.5.3 version: 0.5.3(prettier@3.0.3) + vite-tsconfig-paths: + specifier: ^4.2.0 + version: 4.2.0(typescript@5.2.2)(vite@4.4.9) + vitest: + specifier: ^0.34.3 + version: 0.34.3(jsdom@22.1.0) packages: + /@aashutoshrathi/word-wrap@1.2.6: - resolution: - { integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA== } - engines: { node: ">=0.10.0" } + resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} + engines: {node: '>=0.10.0'} /@alloc/quick-lru@5.2.0: - resolution: - { integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw== } - engines: { node: ">=10" } - dev: false + resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} + engines: {node: '>=10'} + dev: false + + /@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 + + /@babel/code-frame@7.22.13: + resolution: {integrity: sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/highlight': 7.22.13 + chalk: 2.4.2 + + /@babel/compat-data@7.22.9: + resolution: {integrity: sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ==} + engines: {node: '>=6.9.0'} + + /@babel/core@7.22.11: + resolution: {integrity: sha512-lh7RJrtPdhibbxndr6/xx0w8+CVlY5FJZiaSz908Fpy+G0xkBFTvwLcKJFF4PJxVfGhVWNebikpWGnOoC71juQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@ampproject/remapping': 2.2.1 + '@babel/code-frame': 7.22.13 + '@babel/generator': 7.22.10 + '@babel/helper-compilation-targets': 7.22.10 + '@babel/helper-module-transforms': 7.22.9(@babel/core@7.22.11) + '@babel/helpers': 7.22.11 + '@babel/parser': 7.22.13 + '@babel/template': 7.22.5 + '@babel/traverse': 7.22.11 + '@babel/types': 7.22.11 + convert-source-map: 1.9.0 + debug: 4.3.4 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + /@babel/generator@7.22.10: + resolution: {integrity: sha512-79KIf7YiWjjdZ81JnLujDRApWtl7BxTqWD88+FFdQEIOG8LJ0etDOM7CXuIgGJa55sGOwZVwuEsaLEm0PJ5/+A==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.22.11 + '@jridgewell/gen-mapping': 0.3.3 + '@jridgewell/trace-mapping': 0.3.19 + jsesc: 2.5.2 + + /@babel/helper-compilation-targets@7.22.10: + resolution: {integrity: sha512-JMSwHD4J7SLod0idLq5PKgI+6g/hLD/iuWBq08ZX49xE14VpVEojJ5rHWptpirV2j020MvypRLAXAO50igCJ5Q==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/compat-data': 7.22.9 + '@babel/helper-validator-option': 7.22.5 + browserslist: 4.21.10 + lru-cache: 5.1.1 + semver: 6.3.1 + + /@babel/helper-environment-visitor@7.22.5: + resolution: {integrity: sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==} + engines: {node: '>=6.9.0'} + + /@babel/helper-function-name@7.22.5: + resolution: {integrity: sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.22.5 + '@babel/types': 7.22.11 + + /@babel/helper-hoist-variables@7.22.5: + resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.22.11 + + /@babel/helper-module-imports@7.22.5: + resolution: {integrity: sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.22.11 + + /@babel/helper-module-transforms@7.22.9(@babel/core@7.22.11): + resolution: {integrity: sha512-t+WA2Xn5K+rTeGtC8jCsdAH52bjggG5TKRuRrAGNM/mjIbO4GxvlLMFOEz9wXY5I2XQ60PMFsAG2WIcG82dQMQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.22.11 + '@babel/helper-environment-visitor': 7.22.5 + '@babel/helper-module-imports': 7.22.5 + '@babel/helper-simple-access': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/helper-validator-identifier': 7.22.5 + + /@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.22.11 + + /@babel/helper-split-export-declaration@7.22.6: + resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.22.11 + + /@babel/helper-string-parser@7.22.5: + resolution: {integrity: sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==} + engines: {node: '>=6.9.0'} + + /@babel/helper-validator-identifier@7.22.5: + resolution: {integrity: sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==} + engines: {node: '>=6.9.0'} + + /@babel/helper-validator-option@7.22.5: + resolution: {integrity: sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==} + engines: {node: '>=6.9.0'} + + /@babel/helpers@7.22.11: + resolution: {integrity: sha512-vyOXC8PBWaGc5h7GMsNx68OH33cypkEDJCHvYVVgVbbxJDROYVtexSk0gK5iCF1xNjRIN2s8ai7hwkWDq5szWg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.22.5 + '@babel/traverse': 7.22.11 + '@babel/types': 7.22.11 + transitivePeerDependencies: + - supports-color + + /@babel/highlight@7.22.13: + resolution: {integrity: sha512-C/BaXcnnvBCmHTpz/VGZ8jgtE2aYlW4hxDhseJAWZb7gqGM/qtCK6iZUb0TyKFf7BOUsBH7Q7fkRsDRhg1XklQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-validator-identifier': 7.22.5 + chalk: 2.4.2 + js-tokens: 4.0.0 + + /@babel/parser@7.22.13: + resolution: {integrity: sha512-3l6+4YOvc9wx7VlCSw4yQfcBo01ECA8TicQfbnCPuCEpRQrf+gTUyGdxNw+pyTUyywp6JRD1w0YQs9TpBXYlkw==} + engines: {node: '>=6.0.0'} + hasBin: true + dependencies: + '@babel/types': 7.22.11 + + /@babel/plugin-transform-react-jsx-self@7.22.5(@babel/core@7.22.11): + resolution: {integrity: sha512-nTh2ogNUtxbiSbxaT4Ds6aXnXEipHweN9YRgOX/oNXdf0cCrGn/+2LozFa3lnPV5D90MkjhgckCPBrsoSc1a7g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.11 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-transform-react-jsx-source@7.22.5(@babel/core@7.22.11): + resolution: {integrity: sha512-yIiRO6yobeEIaI0RTbIr8iAK9FcBHLtZq0S89ZPjDLQXBA4xvghaKqI0etp/tF3htTM0sazJKKLz9oEiGRtu7w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.11 + '@babel/helper-plugin-utils': 7.22.5 + dev: true /@babel/runtime@7.22.11: - resolution: - { integrity: sha512-ee7jVNlWN09+KftVOu9n7S8gQzD/Z6hN/I8VBRXW4P1+Xe7kJGXMwu8vds4aGIMHZnNbdpSWCfZZtinytpcAvA== } - engines: { node: ">=6.9.0" } + resolution: {integrity: sha512-ee7jVNlWN09+KftVOu9n7S8gQzD/Z6hN/I8VBRXW4P1+Xe7kJGXMwu8vds4aGIMHZnNbdpSWCfZZtinytpcAvA==} + engines: {node: '>=6.9.0'} dependencies: regenerator-runtime: 0.14.0 dev: false + /@babel/template@7.22.5: + resolution: {integrity: sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.22.13 + '@babel/parser': 7.22.13 + '@babel/types': 7.22.11 + + /@babel/traverse@7.22.11: + resolution: {integrity: sha512-mzAenteTfomcB7mfPtyi+4oe5BZ6MXxWcn4CX+h4IRJ+OOGXBrWU6jDQavkQI9Vuc5P+donFabBfFCcmWka9lQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.22.13 + '@babel/generator': 7.22.10 + '@babel/helper-environment-visitor': 7.22.5 + '@babel/helper-function-name': 7.22.5 + '@babel/helper-hoist-variables': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/parser': 7.22.13 + '@babel/types': 7.22.11 + debug: 4.3.4 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + + /@babel/types@7.22.11: + resolution: {integrity: sha512-siazHiGuZRz9aB9NpHy9GOs9xiQPKnMzgdr493iI1M67vRXpnEq8ZOOKzezC5q7zwuQ6sDhdSp4SD9ixKSqKZg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-string-parser': 7.22.5 + '@babel/helper-validator-identifier': 7.22.5 + to-fast-properties: 2.0.0 + + /@esbuild/android-arm64@0.18.20: + resolution: {integrity: sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-arm@0.18.20: + resolution: {integrity: sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-x64@0.18.20: + resolution: {integrity: sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-arm64@0.18.20: + resolution: {integrity: sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-x64@0.18.20: + resolution: {integrity: sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-arm64@0.18.20: + resolution: {integrity: sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-x64@0.18.20: + resolution: {integrity: sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm64@0.18.20: + resolution: {integrity: sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm@0.18.20: + resolution: {integrity: sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ia32@0.18.20: + resolution: {integrity: sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-loong64@0.18.20: + resolution: {integrity: sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-mips64el@0.18.20: + resolution: {integrity: sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ppc64@0.18.20: + resolution: {integrity: sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-riscv64@0.18.20: + resolution: {integrity: sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-s390x@0.18.20: + resolution: {integrity: sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-x64@0.18.20: + resolution: {integrity: sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/netbsd-x64@0.18.20: + resolution: {integrity: sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/openbsd-x64@0.18.20: + resolution: {integrity: sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/sunos-x64@0.18.20: + resolution: {integrity: sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-arm64@0.18.20: + resolution: {integrity: sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-ia32@0.18.20: + resolution: {integrity: sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-x64@0.18.20: + resolution: {integrity: sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + /@eslint-community/eslint-utils@4.4.0(eslint@8.48.0): - resolution: - { integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA== } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.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: @@ -84,14 +493,12 @@ packages: eslint-visitor-keys: 3.4.3 /@eslint-community/regexpp@4.8.0: - resolution: - { integrity: sha512-JylOEEzDiOryeUnFbQz+oViCXS0KsvR1mvHkoMiu5+UiBvy+RYX7tzlIIIEstF/gVa2tj9AQXk3dgnxv6KxhFg== } - engines: { node: ^12.0.0 || ^14.0.0 || >=16.0.0 } + resolution: {integrity: sha512-JylOEEzDiOryeUnFbQz+oViCXS0KsvR1mvHkoMiu5+UiBvy+RYX7tzlIIIEstF/gVa2tj9AQXk3dgnxv6KxhFg==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} /@eslint/eslintrc@2.1.2: - resolution: - { integrity: sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g== } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + resolution: {integrity: sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: ajv: 6.12.6 debug: 4.3.4 @@ -106,81 +513,71 @@ packages: - supports-color /@eslint/js@8.48.0: - resolution: - { integrity: sha512-ZSjtmelB7IJfWD2Fvb7+Z+ChTIKWq6kjda95fLcQKNS5aheVHn4IkfgRQE3sIIzTcSLwLcLZUD9UBt+V7+h+Pw== } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + resolution: {integrity: sha512-ZSjtmelB7IJfWD2Fvb7+Z+ChTIKWq6kjda95fLcQKNS5aheVHn4IkfgRQE3sIIzTcSLwLcLZUD9UBt+V7+h+Pw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} /@humanwhocodes/config-array@0.11.11: - resolution: - { integrity: sha512-N2brEuAadi0CcdeMXUkhbZB84eskAc8MEX1By6qEchoVywSgXPIjou4rYsl0V3Hj0ZnuGycGCjdNgockbzeWNA== } - engines: { node: ">=10.10.0" } + resolution: {integrity: sha512-N2brEuAadi0CcdeMXUkhbZB84eskAc8MEX1By6qEchoVywSgXPIjou4rYsl0V3Hj0ZnuGycGCjdNgockbzeWNA==} + engines: {node: '>=10.10.0'} dependencies: - "@humanwhocodes/object-schema": 1.2.1 + '@humanwhocodes/object-schema': 1.2.1 debug: 4.3.4 minimatch: 3.1.2 transitivePeerDependencies: - supports-color /@humanwhocodes/module-importer@1.0.1: - resolution: - { integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== } - engines: { node: ">=12.22" } + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} /@humanwhocodes/object-schema@1.2.1: - resolution: - { integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== } + resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} + + /@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 /@jridgewell/gen-mapping@0.3.3: - resolution: - { integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ== } - engines: { node: ">=6.0.0" } + 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: false + '@jridgewell/set-array': 1.1.2 + '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/trace-mapping': 0.3.19 /@jridgewell/resolve-uri@3.1.1: - resolution: - { integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA== } - engines: { node: ">=6.0.0" } - dev: false + resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} + engines: {node: '>=6.0.0'} /@jridgewell/set-array@1.1.2: - resolution: - { integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== } - engines: { node: ">=6.0.0" } - dev: false + resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} + engines: {node: '>=6.0.0'} /@jridgewell/sourcemap-codec@1.4.15: - resolution: - { integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== } - dev: false + resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} /@jridgewell/trace-mapping@0.3.19: - resolution: - { integrity: sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw== } + resolution: {integrity: sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==} dependencies: - "@jridgewell/resolve-uri": 3.1.1 - "@jridgewell/sourcemap-codec": 1.4.15 - dev: false + '@jridgewell/resolve-uri': 3.1.1 + '@jridgewell/sourcemap-codec': 1.4.15 /@next/env@13.4.19: - resolution: - { integrity: sha512-FsAT5x0jF2kkhNkKkukhsyYOrRqtSxrEhfliniIq0bwWbuXLgyt3Gv0Ml+b91XwjwArmuP7NxCiGd++GGKdNMQ== } + resolution: {integrity: sha512-FsAT5x0jF2kkhNkKkukhsyYOrRqtSxrEhfliniIq0bwWbuXLgyt3Gv0Ml+b91XwjwArmuP7NxCiGd++GGKdNMQ==} dev: false /@next/eslint-plugin-next@13.4.19: - resolution: - { integrity: sha512-N/O+zGb6wZQdwu6atMZHbR7T9Np5SUFUjZqCbj0sXm+MwQO35M8TazVB4otm87GkXYs2l6OPwARd3/PUWhZBVQ== } + resolution: {integrity: sha512-N/O+zGb6wZQdwu6atMZHbR7T9Np5SUFUjZqCbj0sXm+MwQO35M8TazVB4otm87GkXYs2l6OPwARd3/PUWhZBVQ==} dependencies: glob: 7.1.7 dev: false /@next/swc-darwin-arm64@13.4.19: - resolution: - { integrity: sha512-vv1qrjXeGbuF2mOkhkdxMDtv9np7W4mcBtaDnHU+yJG+bBwa6rYsYSCI/9Xm5+TuF5SbZbrWO6G1NfTh1TMjvQ== } - engines: { node: ">= 10" } + resolution: {integrity: sha512-vv1qrjXeGbuF2mOkhkdxMDtv9np7W4mcBtaDnHU+yJG+bBwa6rYsYSCI/9Xm5+TuF5SbZbrWO6G1NfTh1TMjvQ==} + engines: {node: '>= 10'} cpu: [arm64] os: [darwin] requiresBuild: true @@ -188,9 +585,8 @@ packages: optional: true /@next/swc-darwin-x64@13.4.19: - resolution: - { integrity: sha512-jyzO6wwYhx6F+7gD8ddZfuqO4TtpJdw3wyOduR4fxTUCm3aLw7YmHGYNjS0xRSYGAkLpBkH1E0RcelyId6lNsw== } - engines: { node: ">= 10" } + resolution: {integrity: sha512-jyzO6wwYhx6F+7gD8ddZfuqO4TtpJdw3wyOduR4fxTUCm3aLw7YmHGYNjS0xRSYGAkLpBkH1E0RcelyId6lNsw==} + engines: {node: '>= 10'} cpu: [x64] os: [darwin] requiresBuild: true @@ -198,9 +594,8 @@ packages: optional: true /@next/swc-linux-arm64-gnu@13.4.19: - resolution: - { integrity: sha512-vdlnIlaAEh6H+G6HrKZB9c2zJKnpPVKnA6LBwjwT2BTjxI7e0Hx30+FoWCgi50e+YO49p6oPOtesP9mXDRiiUg== } - engines: { node: ">= 10" } + resolution: {integrity: sha512-vdlnIlaAEh6H+G6HrKZB9c2zJKnpPVKnA6LBwjwT2BTjxI7e0Hx30+FoWCgi50e+YO49p6oPOtesP9mXDRiiUg==} + engines: {node: '>= 10'} cpu: [arm64] os: [linux] requiresBuild: true @@ -208,9 +603,8 @@ packages: optional: true /@next/swc-linux-arm64-musl@13.4.19: - resolution: - { integrity: sha512-aU0HkH2XPgxqrbNRBFb3si9Ahu/CpaR5RPmN2s9GiM9qJCiBBlZtRTiEca+DC+xRPyCThTtWYgxjWHgU7ZkyvA== } - engines: { node: ">= 10" } + resolution: {integrity: sha512-aU0HkH2XPgxqrbNRBFb3si9Ahu/CpaR5RPmN2s9GiM9qJCiBBlZtRTiEca+DC+xRPyCThTtWYgxjWHgU7ZkyvA==} + engines: {node: '>= 10'} cpu: [arm64] os: [linux] requiresBuild: true @@ -218,9 +612,8 @@ packages: optional: true /@next/swc-linux-x64-gnu@13.4.19: - resolution: - { integrity: sha512-htwOEagMa/CXNykFFeAHHvMJeqZfNQEoQvHfsA4wgg5QqGNqD5soeCer4oGlCol6NGUxknrQO6VEustcv+Md+g== } - engines: { node: ">= 10" } + resolution: {integrity: sha512-htwOEagMa/CXNykFFeAHHvMJeqZfNQEoQvHfsA4wgg5QqGNqD5soeCer4oGlCol6NGUxknrQO6VEustcv+Md+g==} + engines: {node: '>= 10'} cpu: [x64] os: [linux] requiresBuild: true @@ -228,9 +621,8 @@ packages: optional: true /@next/swc-linux-x64-musl@13.4.19: - resolution: - { integrity: sha512-4Gj4vvtbK1JH8ApWTT214b3GwUh9EKKQjY41hH/t+u55Knxi/0wesMzwQRhppK6Ddalhu0TEttbiJ+wRcoEj5Q== } - engines: { node: ">= 10" } + resolution: {integrity: sha512-4Gj4vvtbK1JH8ApWTT214b3GwUh9EKKQjY41hH/t+u55Knxi/0wesMzwQRhppK6Ddalhu0TEttbiJ+wRcoEj5Q==} + engines: {node: '>= 10'} cpu: [x64] os: [linux] requiresBuild: true @@ -238,9 +630,8 @@ packages: optional: true /@next/swc-win32-arm64-msvc@13.4.19: - resolution: - { integrity: sha512-bUfDevQK4NsIAHXs3/JNgnvEY+LRyneDN788W2NYiRIIzmILjba7LaQTfihuFawZDhRtkYCv3JDC3B4TwnmRJw== } - engines: { node: ">= 10" } + resolution: {integrity: sha512-bUfDevQK4NsIAHXs3/JNgnvEY+LRyneDN788W2NYiRIIzmILjba7LaQTfihuFawZDhRtkYCv3JDC3B4TwnmRJw==} + engines: {node: '>= 10'} cpu: [arm64] os: [win32] requiresBuild: true @@ -248,9 +639,8 @@ packages: optional: true /@next/swc-win32-ia32-msvc@13.4.19: - resolution: - { integrity: sha512-Y5kikILFAr81LYIFaw6j/NrOtmiM4Sf3GtOc0pn50ez2GCkr+oejYuKGcwAwq3jiTKuzF6OF4iT2INPoxRycEA== } - engines: { node: ">= 10" } + resolution: {integrity: sha512-Y5kikILFAr81LYIFaw6j/NrOtmiM4Sf3GtOc0pn50ez2GCkr+oejYuKGcwAwq3jiTKuzF6OF4iT2INPoxRycEA==} + engines: {node: '>= 10'} cpu: [ia32] os: [win32] requiresBuild: true @@ -258,9 +648,8 @@ packages: optional: true /@next/swc-win32-x64-msvc@13.4.19: - resolution: - { integrity: sha512-YzA78jBDXMYiINdPdJJwGgPNT3YqBNNGhsthsDoWHL9p24tEJn9ViQf/ZqTbwSpX/RrkPupLfuuTH2sf73JBAw== } - engines: { node: ">= 10" } + resolution: {integrity: sha512-YzA78jBDXMYiINdPdJJwGgPNT3YqBNNGhsthsDoWHL9p24tEJn9ViQf/ZqTbwSpX/RrkPupLfuuTH2sf73JBAw==} + engines: {node: '>= 10'} cpu: [x64] os: [win32] requiresBuild: true @@ -268,89 +657,95 @@ packages: optional: true /@nodelib/fs.scandir@2.1.5: - resolution: - { integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== } - engines: { node: ">= 8" } + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} dependencies: - "@nodelib/fs.stat": 2.0.5 + '@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" } + 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" } + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} dependencies: - "@nodelib/fs.scandir": 2.1.5 + '@nodelib/fs.scandir': 2.1.5 fastq: 1.15.0 /@rushstack/eslint-patch@1.3.3: - resolution: - { integrity: sha512-0xd7qez0AQ+MbHatZTlI1gu5vkG8r7MYRUJAHPAHJBmGLs16zpkrpAVLvjQKQOqaXPDUBwOiJzNc00znHSCVBw== } + resolution: {integrity: sha512-0xd7qez0AQ+MbHatZTlI1gu5vkG8r7MYRUJAHPAHJBmGLs16zpkrpAVLvjQKQOqaXPDUBwOiJzNc00znHSCVBw==} dev: false + /@sinclair/typebox@0.27.8: + resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} + dev: true + /@swc/helpers@0.5.1: - resolution: - { integrity: sha512-sJ902EfIzn1Fa+qYmjdQqh8tPsoxyBz+8yBKC2HKUxyezKJFwPGOn7pv4WY6QuQW//ySQi5lJjA/ZT9sNWWNTg== } + resolution: {integrity: sha512-sJ902EfIzn1Fa+qYmjdQqh8tPsoxyBz+8yBKC2HKUxyezKJFwPGOn7pv4WY6QuQW//ySQi5lJjA/ZT9sNWWNTg==} dependencies: tslib: 2.6.2 dev: false + /@tootallnate/once@2.0.0: + resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==} + engines: {node: '>= 10'} + dev: true + + /@types/chai-subset@1.3.3: + resolution: {integrity: sha512-frBecisrNGz+F4T6bcc+NLeolfiojh5FxW2klu669+8BARtyQv2C/GkNW6FUodVe4BroGMP/wER/YDGc7rEllw==} + dependencies: + '@types/chai': 4.3.5 + dev: true + + /@types/chai@4.3.5: + resolution: {integrity: sha512-mEo1sAde+UCE6b2hxn332f1g1E8WfYRu6p5SvTKr2ZKC1f7gFJXk4h5PyGP9Dt6gCaG8y8XhwnXWC6Iy2cmBng==} + dev: true + /@types/json5@0.0.29: - resolution: - { integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== } + resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} dev: false /@types/node@20.5.7: - resolution: - { integrity: sha512-dP7f3LdZIysZnmvP3ANJYTSwg+wLLl8p7RqniVlV7j+oXSXAbt9h0WIBFmJy5inWZoX9wZN6eXx+YXd9Rh3RBA== } - dev: false + resolution: {integrity: sha512-dP7f3LdZIysZnmvP3ANJYTSwg+wLLl8p7RqniVlV7j+oXSXAbt9h0WIBFmJy5inWZoX9wZN6eXx+YXd9Rh3RBA==} /@types/prop-types@15.7.5: - resolution: - { integrity: sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w== } + resolution: {integrity: sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==} dev: false /@types/react-dom@18.2.7: - resolution: - { integrity: sha512-GRaAEriuT4zp9N4p1i8BDBYmEyfo+xQ3yHjJU4eiK5NDa1RmUZG+unZABUTK4/Ox/M+GaHwb6Ow8rUITrtjszA== } + resolution: {integrity: sha512-GRaAEriuT4zp9N4p1i8BDBYmEyfo+xQ3yHjJU4eiK5NDa1RmUZG+unZABUTK4/Ox/M+GaHwb6Ow8rUITrtjszA==} dependencies: - "@types/react": 18.2.21 + '@types/react': 18.2.21 dev: false /@types/react@18.2.21: - resolution: - { integrity: sha512-neFKG/sBAwGxHgXiIxnbm3/AAVQ/cMRS93hvBpg8xYRbeQSPVABp9U2bRnPf0iI4+Ucdv3plSxKK+3CW2ENJxA== } + resolution: {integrity: sha512-neFKG/sBAwGxHgXiIxnbm3/AAVQ/cMRS93hvBpg8xYRbeQSPVABp9U2bRnPf0iI4+Ucdv3plSxKK+3CW2ENJxA==} dependencies: - "@types/prop-types": 15.7.5 - "@types/scheduler": 0.16.3 + '@types/prop-types': 15.7.5 + '@types/scheduler': 0.16.3 csstype: 3.1.2 dev: false /@types/scheduler@0.16.3: - resolution: - { integrity: sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ== } + resolution: {integrity: sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==} dev: false /@typescript-eslint/parser@6.5.0(eslint@8.48.0)(typescript@5.2.2): - resolution: - { integrity: sha512-LMAVtR5GN8nY0G0BadkG0XIe4AcNMeyEy3DyhKGAh9k4pLSMBO7rF29JvDBpZGCmp5Pgz5RLHP6eCpSYZJQDuQ== } - engines: { node: ^16.0.0 || >=18.0.0 } + resolution: {integrity: sha512-LMAVtR5GN8nY0G0BadkG0XIe4AcNMeyEy3DyhKGAh9k4pLSMBO7rF29JvDBpZGCmp5Pgz5RLHP6eCpSYZJQDuQ==} + engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: eslint: ^7.0.0 || ^8.0.0 - typescript: "*" + typescript: '*' peerDependenciesMeta: typescript: optional: true dependencies: - "@typescript-eslint/scope-manager": 6.5.0 - "@typescript-eslint/types": 6.5.0 - "@typescript-eslint/typescript-estree": 6.5.0(typescript@5.2.2) - "@typescript-eslint/visitor-keys": 6.5.0 + '@typescript-eslint/scope-manager': 6.5.0 + '@typescript-eslint/types': 6.5.0 + '@typescript-eslint/typescript-estree': 6.5.0(typescript@5.2.2) + '@typescript-eslint/visitor-keys': 6.5.0 debug: 4.3.4 eslint: 8.48.0 typescript: 5.2.2 @@ -359,32 +754,29 @@ packages: dev: false /@typescript-eslint/scope-manager@6.5.0: - resolution: - { integrity: sha512-A8hZ7OlxURricpycp5kdPTH3XnjG85UpJS6Fn4VzeoH4T388gQJ/PGP4ole5NfKt4WDVhmLaQ/dBLNDC4Xl/Kw== } - engines: { node: ^16.0.0 || >=18.0.0 } + resolution: {integrity: sha512-A8hZ7OlxURricpycp5kdPTH3XnjG85UpJS6Fn4VzeoH4T388gQJ/PGP4ole5NfKt4WDVhmLaQ/dBLNDC4Xl/Kw==} + engines: {node: ^16.0.0 || >=18.0.0} dependencies: - "@typescript-eslint/types": 6.5.0 - "@typescript-eslint/visitor-keys": 6.5.0 + '@typescript-eslint/types': 6.5.0 + '@typescript-eslint/visitor-keys': 6.5.0 dev: false /@typescript-eslint/types@6.5.0: - resolution: - { integrity: sha512-eqLLOEF5/lU8jW3Bw+8auf4lZSbbljHR2saKnYqON12G/WsJrGeeDHWuQePoEf9ro22+JkbPfWQwKEC5WwLQ3w== } - engines: { node: ^16.0.0 || >=18.0.0 } + resolution: {integrity: sha512-eqLLOEF5/lU8jW3Bw+8auf4lZSbbljHR2saKnYqON12G/WsJrGeeDHWuQePoEf9ro22+JkbPfWQwKEC5WwLQ3w==} + engines: {node: ^16.0.0 || >=18.0.0} dev: false /@typescript-eslint/typescript-estree@6.5.0(typescript@5.2.2): - resolution: - { integrity: sha512-q0rGwSe9e5Kk/XzliB9h2LBc9tmXX25G0833r7kffbl5437FPWb2tbpIV9wAATebC/018pGa9fwPDuvGN+LxWQ== } - engines: { node: ^16.0.0 || >=18.0.0 } + resolution: {integrity: sha512-q0rGwSe9e5Kk/XzliB9h2LBc9tmXX25G0833r7kffbl5437FPWb2tbpIV9wAATebC/018pGa9fwPDuvGN+LxWQ==} + engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: - typescript: "*" + typescript: '*' peerDependenciesMeta: typescript: optional: true dependencies: - "@typescript-eslint/types": 6.5.0 - "@typescript-eslint/visitor-keys": 6.5.0 + '@typescript-eslint/types': 6.5.0 + '@typescript-eslint/visitor-keys': 6.5.0 debug: 4.3.4 globby: 11.1.0 is-glob: 4.0.3 @@ -396,31 +788,98 @@ packages: dev: false /@typescript-eslint/visitor-keys@6.5.0: - resolution: - { integrity: sha512-yCB/2wkbv3hPsh02ZS8dFQnij9VVQXJMN/gbQsaaY+zxALkZnxa/wagvLEFsAWMPv7d7lxQmNsIzGU1w/T/WyA== } - engines: { node: ^16.0.0 || >=18.0.0 } + resolution: {integrity: sha512-yCB/2wkbv3hPsh02ZS8dFQnij9VVQXJMN/gbQsaaY+zxALkZnxa/wagvLEFsAWMPv7d7lxQmNsIzGU1w/T/WyA==} + engines: {node: ^16.0.0 || >=18.0.0} dependencies: - "@typescript-eslint/types": 6.5.0 + '@typescript-eslint/types': 6.5.0 eslint-visitor-keys: 3.4.3 dev: false + /@vitejs/plugin-react@4.0.4(vite@4.4.9): + resolution: {integrity: sha512-7wU921ABnNYkETiMaZy7XqpueMnpu5VxvVps13MjmCo+utBdD79sZzrApHawHtVX66cCJQQTXFcjH0y9dSUK8g==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + vite: ^4.2.0 + dependencies: + '@babel/core': 7.22.11 + '@babel/plugin-transform-react-jsx-self': 7.22.5(@babel/core@7.22.11) + '@babel/plugin-transform-react-jsx-source': 7.22.5(@babel/core@7.22.11) + react-refresh: 0.14.0 + vite: 4.4.9(@types/node@20.5.7) + transitivePeerDependencies: + - supports-color + dev: true + + /@vitest/expect@0.34.3: + resolution: {integrity: sha512-F8MTXZUYRBVsYL1uoIft1HHWhwDbSzwAU9Zgh8S6WFC3YgVb4AnFV2GXO3P5Em8FjEYaZtTnQYoNwwBrlOMXgg==} + dependencies: + '@vitest/spy': 0.34.3 + '@vitest/utils': 0.34.3 + chai: 4.3.8 + dev: true + + /@vitest/runner@0.34.3: + resolution: {integrity: sha512-lYNq7N3vR57VMKMPLVvmJoiN4bqwzZ1euTW+XXYH5kzr3W/+xQG3b41xJn9ChJ3AhYOSoweu974S1V3qDcFESA==} + dependencies: + '@vitest/utils': 0.34.3 + p-limit: 4.0.0 + pathe: 1.1.1 + dev: true + + /@vitest/snapshot@0.34.3: + resolution: {integrity: sha512-QyPaE15DQwbnIBp/yNJ8lbvXTZxS00kRly0kfFgAD5EYmCbYcA+1EEyRalc93M0gosL/xHeg3lKAClIXYpmUiQ==} + dependencies: + magic-string: 0.30.3 + pathe: 1.1.1 + pretty-format: 29.6.3 + dev: true + + /@vitest/spy@0.34.3: + resolution: {integrity: sha512-N1V0RFQ6AI7CPgzBq9kzjRdPIgThC340DGjdKdPSE8r86aUSmeliTUgkTqLSgtEwWWsGfBQ+UetZWhK0BgJmkQ==} + dependencies: + tinyspy: 2.1.1 + dev: true + + /@vitest/utils@0.34.3: + resolution: {integrity: sha512-kiSnzLG6m/tiT0XEl4U2H8JDBjFtwVlaE8I3QfGiMFR0QvnRDfYfdP3YvTBWM/6iJDAyaPY6yVQiCTUc7ZzTHA==} + dependencies: + diff-sequences: 29.6.3 + loupe: 2.3.6 + pretty-format: 29.6.3 + dev: true + + /abab@2.0.6: + resolution: {integrity: sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==} + dev: true + /acorn-jsx@5.3.2(acorn@8.10.0): - resolution: - { integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== } + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 dependencies: acorn: 8.10.0 + /acorn-walk@8.2.0: + resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} + engines: {node: '>=0.4.0'} + dev: true + /acorn@8.10.0: - resolution: - { integrity: sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw== } - engines: { node: ">=0.4.0" } + resolution: {integrity: sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==} + engines: {node: '>=0.4.0'} hasBin: true + /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 + dev: true + /ajv@6.12.6: - resolution: - { integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== } + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} dependencies: fast-deep-equal: 3.1.3 fast-json-stable-stringify: 2.1.0 @@ -428,59 +887,61 @@ packages: uri-js: 4.4.1 /ansi-regex@5.0.1: - resolution: - { integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== } - engines: { node: ">=8" } + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + /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" } + 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 + /any-promise@1.3.0: - resolution: - { integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A== } + resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} dev: false /anymatch@3.1.3: - resolution: - { integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== } - engines: { node: ">= 8" } + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} dependencies: normalize-path: 3.0.0 picomatch: 2.3.1 dev: false /arg@5.0.2: - resolution: - { integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg== } + resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} dev: false /argparse@2.0.1: - resolution: - { integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== } + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} /aria-query@5.3.0: - resolution: - { integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A== } + resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==} dependencies: dequal: 2.0.3 dev: false /array-buffer-byte-length@1.0.0: - resolution: - { integrity: sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A== } + resolution: {integrity: sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==} dependencies: call-bind: 1.0.2 is-array-buffer: 3.0.2 dev: false /array-includes@3.1.6: - resolution: - { integrity: sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw== } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==} + engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 define-properties: 1.2.0 @@ -490,15 +951,13 @@ packages: dev: false /array-union@2.1.0: - resolution: - { integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== } - engines: { node: ">=8" } + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} dev: false /array.prototype.findlastindex@1.2.3: - resolution: - { integrity: sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA== } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA==} + engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 define-properties: 1.2.0 @@ -508,9 +967,8 @@ packages: dev: false /array.prototype.flat@1.3.1: - resolution: - { integrity: sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA== } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==} + engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 define-properties: 1.2.0 @@ -519,9 +977,8 @@ packages: dev: false /array.prototype.flatmap@1.3.1: - resolution: - { integrity: sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ== } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==} + engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 define-properties: 1.2.0 @@ -530,8 +987,7 @@ packages: dev: false /array.prototype.tosorted@1.1.1: - resolution: - { integrity: sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ== } + resolution: {integrity: sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ==} dependencies: call-bind: 1.0.2 define-properties: 1.2.0 @@ -541,9 +997,8 @@ packages: dev: false /arraybuffer.prototype.slice@1.0.1: - resolution: - { integrity: sha512-09x0ZWFEjj4WD8PDbykUwo3t9arLn8NIzmmYEJFpYekOAQjpkGSyrQhNoRTcwwcFRu+ycWF78QZ63oWTqSjBcw== } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-09x0ZWFEjj4WD8PDbykUwo3t9arLn8NIzmmYEJFpYekOAQjpkGSyrQhNoRTcwwcFRu+ycWF78QZ63oWTqSjBcw==} + engines: {node: '>= 0.4'} dependencies: array-buffer-byte-length: 1.0.0 call-bind: 1.0.2 @@ -553,22 +1008,27 @@ packages: is-shared-array-buffer: 1.0.2 dev: false + /assertion-error@1.1.0: + resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} + dev: true + /ast-types-flow@0.0.7: - resolution: - { integrity: sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag== } + resolution: {integrity: sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag==} dev: false /asynciterator.prototype@1.0.0: - resolution: - { integrity: sha512-wwHYEIS0Q80f5mosx3L/dfG5t5rjEa9Ft51GTaNt862EnpyGHpgz2RkZvLPp1oF5TnAiTohkEKVEu8pQPJI7Vg== } + resolution: {integrity: sha512-wwHYEIS0Q80f5mosx3L/dfG5t5rjEa9Ft51GTaNt862EnpyGHpgz2RkZvLPp1oF5TnAiTohkEKVEu8pQPJI7Vg==} dependencies: has-symbols: 1.0.3 dev: false + /asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + dev: true + /autoprefixer@10.4.15(postcss@8.4.29): - resolution: - { integrity: sha512-KCuPB8ZCIqFdA4HwKXsvz7j6gvSDNhDP7WnUjBleRkKjPdvCmHFuQ77ocavI8FT6NdvlBnE2UFr2H4Mycn8Vew== } - engines: { node: ^10 || ^12 || >=14 } + resolution: {integrity: sha512-KCuPB8ZCIqFdA4HwKXsvz7j6gvSDNhDP7WnUjBleRkKjPdvCmHFuQ77ocavI8FT6NdvlBnE2UFr2H4Mycn8Vew==} + engines: {node: ^10 || ^12 || >=14} hasBin: true peerDependencies: postcss: ^8.1.0 @@ -583,105 +1043,118 @@ packages: dev: false /available-typed-arrays@1.0.5: - resolution: - { integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==} + engines: {node: '>= 0.4'} dev: false /axe-core@4.7.2: - resolution: - { integrity: sha512-zIURGIS1E1Q4pcrMjp+nnEh+16G56eG/MUllJH8yEvw7asDo7Ac9uhC9KIH5jzpITueEZolfYglnCGIuSBz39g== } - engines: { node: ">=4" } + resolution: {integrity: sha512-zIURGIS1E1Q4pcrMjp+nnEh+16G56eG/MUllJH8yEvw7asDo7Ac9uhC9KIH5jzpITueEZolfYglnCGIuSBz39g==} + engines: {node: '>=4'} dev: false /axobject-query@3.2.1: - resolution: - { integrity: sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg== } + resolution: {integrity: sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg==} dependencies: dequal: 2.0.3 dev: false /balanced-match@1.0.2: - resolution: - { integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== } + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} /binary-extensions@2.2.0: - resolution: - { integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== } - engines: { node: ">=8" } + resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} + engines: {node: '>=8'} dev: false /brace-expansion@1.1.11: - resolution: - { integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== } + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} dependencies: balanced-match: 1.0.2 concat-map: 0.0.1 /braces@3.0.2: - resolution: - { integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== } - engines: { node: ">=8" } + resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + engines: {node: '>=8'} dependencies: fill-range: 7.0.1 dev: false /browserslist@4.21.10: - resolution: - { integrity: sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ== } - engines: { node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7 } + resolution: {integrity: sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true dependencies: caniuse-lite: 1.0.30001524 electron-to-chromium: 1.4.505 node-releases: 2.0.13 update-browserslist-db: 1.0.11(browserslist@4.21.10) - dev: false /busboy@1.6.0: - resolution: - { integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA== } - engines: { node: ">=10.16.0" } + resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} + engines: {node: '>=10.16.0'} dependencies: streamsearch: 1.1.0 dev: false + /cac@6.7.14: + resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} + engines: {node: '>=8'} + dev: true + /call-bind@1.0.2: - resolution: - { integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== } + resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==} dependencies: function-bind: 1.1.1 get-intrinsic: 1.2.1 dev: false /callsites@3.1.0: - resolution: - { integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== } - engines: { node: ">=6" } + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} /camelcase-css@2.0.1: - resolution: - { integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA== } - engines: { node: ">= 6" } + resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} + engines: {node: '>= 6'} dev: false /caniuse-lite@1.0.30001524: - resolution: - { integrity: sha512-Jj917pJtYg9HSJBF95HVX3Cdr89JUyLT4IZ8SvM5aDRni95swKgYi3TgYLH5hnGfPE/U1dg6IfZ50UsIlLkwSA== } - dev: false + resolution: {integrity: sha512-Jj917pJtYg9HSJBF95HVX3Cdr89JUyLT4IZ8SvM5aDRni95swKgYi3TgYLH5hnGfPE/U1dg6IfZ50UsIlLkwSA==} + + /chai@4.3.8: + resolution: {integrity: sha512-vX4YvVVtxlfSZ2VecZgFUTU5qPCYsobVI2O9FmwEXBhDigYGQA6jRXCycIs1yJnnWbZ6/+a2zNIF5DfVCcJBFQ==} + engines: {node: '>=4'} + dependencies: + assertion-error: 1.1.0 + check-error: 1.0.2 + deep-eql: 4.1.3 + get-func-name: 2.0.0 + loupe: 2.3.6 + pathval: 1.1.1 + type-detect: 4.0.8 + dev: true + + /chalk@2.4.2: + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + engines: {node: '>=4'} + dependencies: + ansi-styles: 3.2.1 + escape-string-regexp: 1.0.5 + supports-color: 5.5.0 /chalk@4.1.2: - resolution: - { integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== } - engines: { node: ">=10" } + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} dependencies: ansi-styles: 4.3.0 supports-color: 7.2.0 + /check-error@1.0.2: + resolution: {integrity: sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==} + dev: true + /chokidar@3.5.3: - resolution: - { integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== } - engines: { node: ">= 8.10.0" } + resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} + engines: {node: '>= 8.10.0'} dependencies: anymatch: 3.1.3 braces: 3.0.2 @@ -695,62 +1168,86 @@ packages: dev: false /client-only@0.0.1: - resolution: - { integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA== } + resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} dev: false + /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" } + 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== } + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + /combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + dependencies: + delayed-stream: 1.0.0 + dev: true /commander@4.1.1: - resolution: - { integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== } - engines: { node: ">= 6" } + resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} + engines: {node: '>= 6'} dev: false /concat-map@0.0.1: - resolution: - { integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== } + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + /convert-source-map@1.9.0: + resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} /cross-spawn@7.0.3: - resolution: - { integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== } - engines: { node: ">= 8" } + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} dependencies: path-key: 3.1.1 shebang-command: 2.0.0 which: 2.0.2 /cssesc@3.0.0: - resolution: - { integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== } - engines: { node: ">=4" } + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} + engines: {node: '>=4'} hasBin: true dev: false + /cssstyle@3.0.0: + resolution: {integrity: sha512-N4u2ABATi3Qplzf0hWbVCdjenim8F3ojEXpBDF5hBpjzW182MjNGLqfmQ0SkSPeQ+V86ZXgeH8aXj6kayd4jgg==} + engines: {node: '>=14'} + dependencies: + rrweb-cssom: 0.6.0 + dev: true + /csstype@3.1.2: - resolution: - { integrity: sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ== } + resolution: {integrity: sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==} dev: false /damerau-levenshtein@1.0.8: - resolution: - { integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA== } + resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==} dev: false + /data-urls@4.0.0: + resolution: {integrity: sha512-/mMTei/JXPqvFqQtfyTowxmJVwr2PVAeCcDxyFf6LhoOu/09TX2OX3kb2wzi4DMXcfj4OItwDOnhl5oziPnT6g==} + engines: {node: '>=14'} + dependencies: + abab: 2.0.6 + whatwg-mimetype: 3.0.0 + whatwg-url: 12.0.1 + dev: true + /debug@3.2.7: - resolution: - { integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== } + resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} peerDependencies: - supports-color: "*" + supports-color: '*' peerDependenciesMeta: supports-color: optional: true @@ -759,92 +1256,111 @@ packages: dev: false /debug@4.3.4: - resolution: - { integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== } - engines: { node: ">=6.0" } + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} peerDependencies: - supports-color: "*" + supports-color: '*' peerDependenciesMeta: supports-color: optional: true dependencies: ms: 2.1.2 + /decimal.js@10.4.3: + resolution: {integrity: sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==} + dev: true + + /deep-eql@4.1.3: + resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==} + engines: {node: '>=6'} + dependencies: + type-detect: 4.0.8 + dev: true + /deep-is@0.1.4: - resolution: - { integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== } + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} /define-properties@1.2.0: - resolution: - { integrity: sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA== } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==} + engines: {node: '>= 0.4'} dependencies: has-property-descriptors: 1.0.0 object-keys: 1.1.1 dev: false + /delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + dev: true + /dequal@2.0.3: - resolution: - { integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA== } - engines: { node: ">=6" } + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} + engines: {node: '>=6'} dev: false /didyoumean@1.2.2: - resolution: - { integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw== } + resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} dev: false + /diff-sequences@29.6.3: + resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dev: true + /dir-glob@3.0.1: - resolution: - { integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== } - engines: { node: ">=8" } + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} dependencies: path-type: 4.0.0 dev: false /dlv@1.1.3: - resolution: - { integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA== } + resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} dev: false /doctrine@2.1.0: - resolution: - { integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== } - engines: { node: ">=0.10.0" } + resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} + engines: {node: '>=0.10.0'} dependencies: esutils: 2.0.3 dev: false /doctrine@3.0.0: - resolution: - { integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== } - engines: { node: ">=6.0.0" } + resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} + engines: {node: '>=6.0.0'} + dependencies: + esutils: 2.0.3 + + /domexception@4.0.0: + resolution: {integrity: sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==} + engines: {node: '>=12'} dependencies: - esutils: 2.0.3 + webidl-conversions: 7.0.0 + dev: true /electron-to-chromium@1.4.505: - resolution: - { integrity: sha512-0A50eL5BCCKdxig2SsCXhpuztnB9PfUgRMojj5tMvt8O54lbwz3t6wNgnpiTRosw5QjlJB7ixhVyeg8daLQwSQ== } - dev: false + resolution: {integrity: sha512-0A50eL5BCCKdxig2SsCXhpuztnB9PfUgRMojj5tMvt8O54lbwz3t6wNgnpiTRosw5QjlJB7ixhVyeg8daLQwSQ==} /emoji-regex@9.2.2: - resolution: - { integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== } + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} dev: false /enhanced-resolve@5.15.0: - resolution: - { integrity: sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg== } - engines: { node: ">=10.13.0" } + resolution: {integrity: sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==} + engines: {node: '>=10.13.0'} dependencies: graceful-fs: 4.2.11 tapable: 2.2.1 dev: false + /entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + dev: true + /es-abstract@1.22.1: - resolution: - { integrity: sha512-ioRRcXMO6OFyRpyzV3kE1IIBd4WG5/kltnzdxSCqoP8CMGs/Li+M1uF5o7lOkZVFjDs+NLesthnF66Pg/0q0Lw== } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-ioRRcXMO6OFyRpyzV3kE1IIBd4WG5/kltnzdxSCqoP8CMGs/Li+M1uF5o7lOkZVFjDs+NLesthnF66Pg/0q0Lw==} + engines: {node: '>= 0.4'} dependencies: array-buffer-byte-length: 1.0.0 arraybuffer.prototype.slice: 1.0.1 @@ -888,8 +1404,7 @@ packages: dev: false /es-iterator-helpers@1.0.14: - resolution: - { integrity: sha512-JgtVnwiuoRuzLvqelrvN3Xu7H9bu2ap/kQ2CrM62iidP8SKuD99rWU3CJy++s7IVL2qb/AjXPGR/E7i9ngd/Cw== } + resolution: {integrity: sha512-JgtVnwiuoRuzLvqelrvN3Xu7H9bu2ap/kQ2CrM62iidP8SKuD99rWU3CJy++s7IVL2qb/AjXPGR/E7i9ngd/Cw==} dependencies: asynciterator.prototype: 1.0.0 call-bind: 1.0.2 @@ -908,9 +1423,8 @@ packages: dev: false /es-set-tostringtag@2.0.1: - resolution: - { integrity: sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg== } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==} + engines: {node: '>= 0.4'} dependencies: get-intrinsic: 1.2.1 has: 1.0.3 @@ -918,46 +1432,74 @@ packages: dev: false /es-shim-unscopables@1.0.0: - resolution: - { integrity: sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w== } + resolution: {integrity: sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==} dependencies: has: 1.0.3 dev: false /es-to-primitive@1.2.1: - resolution: - { integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} + engines: {node: '>= 0.4'} dependencies: is-callable: 1.2.7 is-date-object: 1.0.5 is-symbol: 1.0.4 dev: false + /esbuild@0.18.20: + resolution: {integrity: sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/android-arm': 0.18.20 + '@esbuild/android-arm64': 0.18.20 + '@esbuild/android-x64': 0.18.20 + '@esbuild/darwin-arm64': 0.18.20 + '@esbuild/darwin-x64': 0.18.20 + '@esbuild/freebsd-arm64': 0.18.20 + '@esbuild/freebsd-x64': 0.18.20 + '@esbuild/linux-arm': 0.18.20 + '@esbuild/linux-arm64': 0.18.20 + '@esbuild/linux-ia32': 0.18.20 + '@esbuild/linux-loong64': 0.18.20 + '@esbuild/linux-mips64el': 0.18.20 + '@esbuild/linux-ppc64': 0.18.20 + '@esbuild/linux-riscv64': 0.18.20 + '@esbuild/linux-s390x': 0.18.20 + '@esbuild/linux-x64': 0.18.20 + '@esbuild/netbsd-x64': 0.18.20 + '@esbuild/openbsd-x64': 0.18.20 + '@esbuild/sunos-x64': 0.18.20 + '@esbuild/win32-arm64': 0.18.20 + '@esbuild/win32-ia32': 0.18.20 + '@esbuild/win32-x64': 0.18.20 + dev: true + /escalade@3.1.1: - resolution: - { integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== } - engines: { node: ">=6" } - dev: false + 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@4.0.0: - resolution: - { integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== } - engines: { node: ">=10" } + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} /eslint-config-next@13.4.19(eslint@8.48.0)(typescript@5.2.2): - resolution: - { integrity: sha512-WE8367sqMnjhWHvR5OivmfwENRQ1ixfNE9hZwQqNCsd+iM3KnuMc1V8Pt6ytgjxjf23D+xbesADv9x3xaKfT3g== } + resolution: {integrity: sha512-WE8367sqMnjhWHvR5OivmfwENRQ1ixfNE9hZwQqNCsd+iM3KnuMc1V8Pt6ytgjxjf23D+xbesADv9x3xaKfT3g==} peerDependencies: eslint: ^7.23.0 || ^8.0.0 - typescript: ">=3.3.1" + typescript: '>=3.3.1' peerDependenciesMeta: typescript: optional: true dependencies: - "@next/eslint-plugin-next": 13.4.19 - "@rushstack/eslint-patch": 1.3.3 - "@typescript-eslint/parser": 6.5.0(eslint@8.48.0)(typescript@5.2.2) + '@next/eslint-plugin-next': 13.4.19 + '@rushstack/eslint-patch': 1.3.3 + '@typescript-eslint/parser': 6.5.0(eslint@8.48.0)(typescript@5.2.2) eslint: 8.48.0 eslint-import-resolver-node: 0.3.9 eslint-import-resolver-typescript: 3.6.0(@typescript-eslint/parser@6.5.0)(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.28.1)(eslint@8.48.0) @@ -972,18 +1514,16 @@ packages: dev: false /eslint-config-prettier@9.0.0(eslint@8.48.0): - resolution: - { integrity: sha512-IcJsTkJae2S35pRsRAwoCE+925rJJStOdkKnLVgtE+tEpqU0EVVM7OqrwxqgptKdX29NUwC82I5pXsGFIgSevw== } + resolution: {integrity: sha512-IcJsTkJae2S35pRsRAwoCE+925rJJStOdkKnLVgtE+tEpqU0EVVM7OqrwxqgptKdX29NUwC82I5pXsGFIgSevw==} hasBin: true peerDependencies: - eslint: ">=7.0.0" + eslint: '>=7.0.0' dependencies: eslint: 8.48.0 dev: true /eslint-import-resolver-node@0.3.9: - resolution: - { integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g== } + resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} dependencies: debug: 3.2.7 is-core-module: 2.13.0 @@ -993,12 +1533,11 @@ packages: dev: false /eslint-import-resolver-typescript@3.6.0(@typescript-eslint/parser@6.5.0)(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.28.1)(eslint@8.48.0): - resolution: - { integrity: sha512-QTHR9ddNnn35RTxlaEnx2gCxqFlF2SEN0SE2d17SqwyM7YOSI2GHWRYp5BiRkObTUNYPupC/3Fq2a0PpT+EKpg== } - engines: { node: ^14.18.0 || >=16.0.0 } + resolution: {integrity: sha512-QTHR9ddNnn35RTxlaEnx2gCxqFlF2SEN0SE2d17SqwyM7YOSI2GHWRYp5BiRkObTUNYPupC/3Fq2a0PpT+EKpg==} + engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: - eslint: "*" - eslint-plugin-import: "*" + eslint: '*' + eslint-plugin-import: '*' dependencies: debug: 4.3.4 enhanced-resolve: 5.15.0 @@ -1010,24 +1549,23 @@ packages: is-core-module: 2.13.0 is-glob: 4.0.3 transitivePeerDependencies: - - "@typescript-eslint/parser" + - '@typescript-eslint/parser' - eslint-import-resolver-node - eslint-import-resolver-webpack - supports-color dev: false /eslint-module-utils@2.8.0(@typescript-eslint/parser@6.5.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.0)(eslint@8.48.0): - resolution: - { integrity: sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw== } - engines: { node: ">=4" } + resolution: {integrity: sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==} + engines: {node: '>=4'} peerDependencies: - "@typescript-eslint/parser": "*" - eslint: "*" - eslint-import-resolver-node: "*" - eslint-import-resolver-typescript: "*" - eslint-import-resolver-webpack: "*" + '@typescript-eslint/parser': '*' + eslint: '*' + eslint-import-resolver-node: '*' + eslint-import-resolver-typescript: '*' + eslint-import-resolver-webpack: '*' peerDependenciesMeta: - "@typescript-eslint/parser": + '@typescript-eslint/parser': optional: true eslint: optional: true @@ -1038,7 +1576,7 @@ packages: eslint-import-resolver-webpack: optional: true dependencies: - "@typescript-eslint/parser": 6.5.0(eslint@8.48.0)(typescript@5.2.2) + '@typescript-eslint/parser': 6.5.0(eslint@8.48.0)(typescript@5.2.2) debug: 3.2.7 eslint: 8.48.0 eslint-import-resolver-node: 0.3.9 @@ -1048,17 +1586,16 @@ packages: dev: false /eslint-plugin-import@2.28.1(@typescript-eslint/parser@6.5.0)(eslint-import-resolver-typescript@3.6.0)(eslint@8.48.0): - resolution: - { integrity: sha512-9I9hFlITvOV55alzoKBI+K9q74kv0iKMeY6av5+umsNwayt59fz692daGyjR+oStBQgx6nwR9rXldDev3Clw+A== } - engines: { node: ">=4" } + resolution: {integrity: sha512-9I9hFlITvOV55alzoKBI+K9q74kv0iKMeY6av5+umsNwayt59fz692daGyjR+oStBQgx6nwR9rXldDev3Clw+A==} + engines: {node: '>=4'} peerDependencies: - "@typescript-eslint/parser": "*" + '@typescript-eslint/parser': '*' eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 peerDependenciesMeta: - "@typescript-eslint/parser": + '@typescript-eslint/parser': optional: true dependencies: - "@typescript-eslint/parser": 6.5.0(eslint@8.48.0)(typescript@5.2.2) + '@typescript-eslint/parser': 6.5.0(eslint@8.48.0)(typescript@5.2.2) array-includes: 3.1.6 array.prototype.findlastindex: 1.2.3 array.prototype.flat: 1.3.1 @@ -1084,13 +1621,12 @@ packages: dev: false /eslint-plugin-jsx-a11y@6.7.1(eslint@8.48.0): - resolution: - { integrity: sha512-63Bog4iIethyo8smBklORknVjB0T2dwB8Mr/hIC+fBS0uyHdYYpzM/Ed+YC8VxTjlXHEWFOdmgwcDn1U2L9VCA== } - engines: { node: ">=4.0" } + resolution: {integrity: sha512-63Bog4iIethyo8smBklORknVjB0T2dwB8Mr/hIC+fBS0uyHdYYpzM/Ed+YC8VxTjlXHEWFOdmgwcDn1U2L9VCA==} + engines: {node: '>=4.0'} peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 dependencies: - "@babel/runtime": 7.22.11 + '@babel/runtime': 7.22.11 aria-query: 5.3.0 array-includes: 3.1.6 array.prototype.flatmap: 1.3.1 @@ -1110,9 +1646,8 @@ packages: dev: false /eslint-plugin-react-hooks@4.6.0(eslint@8.48.0): - resolution: - { integrity: sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g== } - engines: { node: ">=10" } + resolution: {integrity: sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==} + engines: {node: '>=10'} peerDependencies: eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 dependencies: @@ -1120,9 +1655,8 @@ packages: dev: false /eslint-plugin-react@7.33.2(eslint@8.48.0): - resolution: - { integrity: sha512-73QQMKALArI8/7xGLNI/3LylrEYrlKZSb5C9+q3OtOewTnMQi5cT+aE9E41sLCmli3I9PGGmD1yiZydyo4FEPw== } - engines: { node: ">=4" } + resolution: {integrity: sha512-73QQMKALArI8/7xGLNI/3LylrEYrlKZSb5C9+q3OtOewTnMQi5cT+aE9E41sLCmli3I9PGGmD1yiZydyo4FEPw==} + engines: {node: '>=4'} peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 dependencies: @@ -1146,31 +1680,28 @@ packages: dev: false /eslint-scope@7.2.2: - resolution: - { integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg== } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + 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 /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 } + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} /eslint@8.48.0: - resolution: - { integrity: sha512-sb6DLeIuRXxeM1YljSe1KEx9/YYeZFQWcV8Rq9HfigmdDEugjLEVEa1ozDjL6YDjBpQHPJxJzze+alxi4T3OLg== } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + resolution: {integrity: sha512-sb6DLeIuRXxeM1YljSe1KEx9/YYeZFQWcV8Rq9HfigmdDEugjLEVEa1ozDjL6YDjBpQHPJxJzze+alxi4T3OLg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} hasBin: true dependencies: - "@eslint-community/eslint-utils": 4.4.0(eslint@8.48.0) - "@eslint-community/regexpp": 4.8.0 - "@eslint/eslintrc": 2.1.2 - "@eslint/js": 8.48.0 - "@humanwhocodes/config-array": 0.11.11 - "@humanwhocodes/module-importer": 1.0.1 - "@nodelib/fs.walk": 1.2.8 + '@eslint-community/eslint-utils': 4.4.0(eslint@8.48.0) + '@eslint-community/regexpp': 4.8.0 + '@eslint/eslintrc': 2.1.2 + '@eslint/js': 8.48.0 + '@humanwhocodes/config-array': 0.11.11 + '@humanwhocodes/module-importer': 1.0.1 + '@nodelib/fs.walk': 1.2.8 ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.3 @@ -1205,138 +1736,125 @@ packages: - supports-color /espree@9.6.1: - resolution: - { integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ== } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + 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 /esquery@1.5.0: - resolution: - { integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg== } - engines: { node: ">=0.10" } + resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} + engines: {node: '>=0.10'} dependencies: estraverse: 5.3.0 /esrecurse@4.3.0: - resolution: - { integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== } - engines: { node: ">=4.0" } + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} dependencies: estraverse: 5.3.0 /estraverse@5.3.0: - resolution: - { integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== } - engines: { node: ">=4.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" } + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} /fast-deep-equal@3.1.3: - resolution: - { integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== } + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} /fast-glob@3.3.1: - resolution: - { integrity: sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg== } - engines: { node: ">=8.6.0" } + 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 + '@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 /fast-json-stable-stringify@2.1.0: - resolution: - { integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== } + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} /fast-levenshtein@2.0.6: - resolution: - { integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== } + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} /fastq@1.15.0: - resolution: - { integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw== } + resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} dependencies: reusify: 1.0.4 /file-entry-cache@6.0.1: - resolution: - { integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== } - engines: { node: ^10.12.0 || >=12.0.0 } + resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} + engines: {node: ^10.12.0 || >=12.0.0} dependencies: flat-cache: 3.1.0 /fill-range@7.0.1: - resolution: - { integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== } - engines: { node: ">=8" } + resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} + engines: {node: '>=8'} dependencies: to-regex-range: 5.0.1 dev: false /find-up@5.0.0: - resolution: - { integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== } - engines: { node: ">=10" } + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} dependencies: locate-path: 6.0.0 path-exists: 4.0.0 /flat-cache@3.1.0: - resolution: - { integrity: sha512-OHx4Qwrrt0E4jEIcI5/Xb+f+QmJYNj2rrK8wiIdQOIrB9WrrJL8cjZvXdXuBTkkEwEqLycb5BeZDV1o2i9bTew== } - engines: { node: ">=12.0.0" } + resolution: {integrity: sha512-OHx4Qwrrt0E4jEIcI5/Xb+f+QmJYNj2rrK8wiIdQOIrB9WrrJL8cjZvXdXuBTkkEwEqLycb5BeZDV1o2i9bTew==} + engines: {node: '>=12.0.0'} dependencies: flatted: 3.2.7 keyv: 4.5.3 rimraf: 3.0.2 /flatted@3.2.7: - resolution: - { integrity: sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ== } + resolution: {integrity: sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==} /for-each@0.3.3: - resolution: - { integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== } + resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} dependencies: is-callable: 1.2.7 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: true + /fraction.js@4.3.1: - resolution: - { integrity: sha512-nx0cki48JBA6ThPeUpeKCNpdhEl/9bRS+dAEYnRUod+Z1jhFfC3K/mBLorZZntqHM+GTH3/dkkpfoT3QITYe7g== } + resolution: {integrity: sha512-nx0cki48JBA6ThPeUpeKCNpdhEl/9bRS+dAEYnRUod+Z1jhFfC3K/mBLorZZntqHM+GTH3/dkkpfoT3QITYe7g==} dev: false /fs.realpath@1.0.0: - resolution: - { integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== } + 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 } + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} os: [darwin] requiresBuild: true - dev: false optional: true /function-bind@1.1.1: - resolution: - { integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== } + resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} dev: false /function.prototype.name@1.1.6: - resolution: - { integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg== } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==} + engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 define-properties: 1.2.0 @@ -1345,13 +1863,19 @@ packages: dev: false /functions-have-names@1.2.3: - resolution: - { integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== } + resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} dev: false + /gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + + /get-func-name@2.0.0: + resolution: {integrity: sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==} + dev: true + /get-intrinsic@1.2.1: - resolution: - { integrity: sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw== } + resolution: {integrity: sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==} dependencies: function-bind: 1.1.1 has: 1.0.3 @@ -1360,44 +1884,38 @@ packages: dev: false /get-symbol-description@1.0.0: - resolution: - { integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw== } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==} + engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 get-intrinsic: 1.2.1 dev: false /get-tsconfig@4.7.0: - resolution: - { integrity: sha512-pmjiZ7xtB8URYm74PlGJozDNyhvsVLUcpBa8DZBG3bWHwaHa9bPiRpiSfovw+fjhwONSCWKRyk+JQHEGZmMrzw== } + resolution: {integrity: sha512-pmjiZ7xtB8URYm74PlGJozDNyhvsVLUcpBa8DZBG3bWHwaHa9bPiRpiSfovw+fjhwONSCWKRyk+JQHEGZmMrzw==} dependencies: resolve-pkg-maps: 1.0.0 dev: false /glob-parent@5.1.2: - resolution: - { integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== } - engines: { node: ">= 6" } + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} dependencies: is-glob: 4.0.3 dev: false /glob-parent@6.0.2: - resolution: - { integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== } - engines: { node: ">=10.13.0" } + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} dependencies: is-glob: 4.0.3 /glob-to-regexp@0.4.1: - resolution: - { integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== } + resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} dev: false /glob@7.1.6: - resolution: - { integrity: sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== } + resolution: {integrity: sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==} dependencies: fs.realpath: 1.0.0 inflight: 1.0.6 @@ -1408,8 +1926,7 @@ packages: dev: false /glob@7.1.7: - resolution: - { integrity: sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ== } + resolution: {integrity: sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==} dependencies: fs.realpath: 1.0.0 inflight: 1.0.6 @@ -1420,8 +1937,7 @@ packages: dev: false /glob@7.2.3: - resolution: - { integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== } + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} dependencies: fs.realpath: 1.0.0 inflight: 1.0.6 @@ -1430,25 +1946,26 @@ packages: once: 1.4.0 path-is-absolute: 1.0.1 + /globals@11.12.0: + resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} + engines: {node: '>=4'} + /globals@13.21.0: - resolution: - { integrity: sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg== } - engines: { node: ">=8" } + resolution: {integrity: sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg==} + engines: {node: '>=8'} dependencies: type-fest: 0.20.2 /globalthis@1.0.3: - resolution: - { integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA== } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==} + engines: {node: '>= 0.4'} dependencies: define-properties: 1.2.0 dev: false /globby@11.1.0: - resolution: - { integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== } - engines: { node: ">=10" } + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} dependencies: array-union: 2.1.0 dir-glob: 3.0.1 @@ -1458,100 +1975,127 @@ packages: slash: 3.0.0 dev: false + /globrex@0.1.2: + resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} + dev: true + /gopd@1.0.1: - resolution: - { integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== } + resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} dependencies: get-intrinsic: 1.2.1 dev: false /graceful-fs@4.2.11: - resolution: - { integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== } + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} dev: false /graphemer@1.4.0: - resolution: - { integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== } + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} /has-bigints@1.0.2: - resolution: - { integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== } + resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} dev: false + /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" } + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} /has-property-descriptors@1.0.0: - resolution: - { integrity: sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ== } + resolution: {integrity: sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==} dependencies: get-intrinsic: 1.2.1 dev: false /has-proto@1.0.1: - resolution: - { integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg== } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} + engines: {node: '>= 0.4'} dev: false /has-symbols@1.0.3: - resolution: - { integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} + engines: {node: '>= 0.4'} dev: false /has-tostringtag@1.0.0: - resolution: - { integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==} + engines: {node: '>= 0.4'} dependencies: has-symbols: 1.0.3 dev: false /has@1.0.3: - resolution: - { integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== } - engines: { node: ">= 0.4.0" } + resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} + engines: {node: '>= 0.4.0'} dependencies: function-bind: 1.1.1 dev: false + /html-encoding-sniffer@3.0.0: + resolution: {integrity: sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==} + engines: {node: '>=12'} + dependencies: + whatwg-encoding: 2.0.0 + dev: true + + /http-proxy-agent@5.0.0: + resolution: {integrity: sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==} + engines: {node: '>= 6'} + dependencies: + '@tootallnate/once': 2.0.0 + agent-base: 6.0.2 + debug: 4.3.4 + transitivePeerDependencies: + - supports-color + dev: true + + /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 + dev: true + + /iconv-lite@0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + engines: {node: '>=0.10.0'} + dependencies: + safer-buffer: 2.1.2 + dev: true + /ignore@5.2.4: - resolution: - { integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ== } - engines: { node: ">= 4" } + resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} + engines: {node: '>= 4'} /import-fresh@3.3.0: - resolution: - { integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== } - engines: { node: ">=6" } + resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + engines: {node: '>=6'} dependencies: parent-module: 1.0.1 resolve-from: 4.0.0 /imurmurhash@0.1.4: - resolution: - { integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== } - engines: { node: ">=0.8.19" } + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} /inflight@1.0.6: - resolution: - { integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== } + 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== } + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} /internal-slot@1.0.5: - resolution: - { integrity: sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ== } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==} + engines: {node: '>= 0.4'} dependencies: get-intrinsic: 1.2.1 has: 1.0.3 @@ -1559,8 +2103,7 @@ packages: dev: false /is-array-buffer@3.0.2: - resolution: - { integrity: sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w== } + resolution: {integrity: sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==} dependencies: call-bind: 1.0.2 get-intrinsic: 1.2.1 @@ -1568,192 +2111,168 @@ packages: dev: false /is-async-function@2.0.0: - resolution: - { integrity: sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA== } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==} + engines: {node: '>= 0.4'} dependencies: has-tostringtag: 1.0.0 dev: false /is-bigint@1.0.4: - resolution: - { integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== } + resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} dependencies: has-bigints: 1.0.2 dev: false /is-binary-path@2.1.0: - resolution: - { integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== } - engines: { node: ">=8" } + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} dependencies: binary-extensions: 2.2.0 dev: false /is-boolean-object@1.1.2: - resolution: - { integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} + engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 has-tostringtag: 1.0.0 dev: false /is-callable@1.2.7: - resolution: - { integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} + engines: {node: '>= 0.4'} dev: false /is-core-module@2.13.0: - resolution: - { integrity: sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ== } + resolution: {integrity: sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==} dependencies: has: 1.0.3 dev: false /is-date-object@1.0.5: - resolution: - { integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} + engines: {node: '>= 0.4'} dependencies: has-tostringtag: 1.0.0 dev: false /is-extglob@2.1.1: - resolution: - { integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== } - engines: { node: ">=0.10.0" } + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} /is-finalizationregistry@1.0.2: - resolution: - { integrity: sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw== } + resolution: {integrity: sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==} dependencies: call-bind: 1.0.2 dev: false /is-generator-function@1.0.10: - resolution: - { integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A== } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} + engines: {node: '>= 0.4'} dependencies: has-tostringtag: 1.0.0 dev: false /is-glob@4.0.3: - resolution: - { integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== } - engines: { node: ">=0.10.0" } + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} dependencies: is-extglob: 2.1.1 /is-map@2.0.2: - resolution: - { integrity: sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg== } + resolution: {integrity: sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==} dev: false /is-negative-zero@2.0.2: - resolution: - { integrity: sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA== } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==} + engines: {node: '>= 0.4'} dev: false /is-number-object@1.0.7: - resolution: - { integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} + engines: {node: '>= 0.4'} dependencies: has-tostringtag: 1.0.0 dev: false /is-number@7.0.0: - resolution: - { integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== } - engines: { node: ">=0.12.0" } + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} dev: false /is-path-inside@3.0.3: - resolution: - { integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== } - engines: { node: ">=8" } + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: '>=8'} + + /is-potential-custom-element-name@1.0.1: + resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} + dev: true /is-regex@1.1.4: - resolution: - { integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} + engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 has-tostringtag: 1.0.0 dev: false /is-set@2.0.2: - resolution: - { integrity: sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g== } + resolution: {integrity: sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==} dev: false /is-shared-array-buffer@1.0.2: - resolution: - { integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA== } + resolution: {integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==} dependencies: call-bind: 1.0.2 dev: false /is-string@1.0.7: - resolution: - { integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} + engines: {node: '>= 0.4'} dependencies: has-tostringtag: 1.0.0 dev: false /is-symbol@1.0.4: - resolution: - { integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} + engines: {node: '>= 0.4'} dependencies: has-symbols: 1.0.3 dev: false /is-typed-array@1.1.12: - resolution: - { integrity: sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg== } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==} + engines: {node: '>= 0.4'} dependencies: which-typed-array: 1.1.11 dev: false /is-weakmap@2.0.1: - resolution: - { integrity: sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA== } + resolution: {integrity: sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==} dev: false /is-weakref@1.0.2: - resolution: - { integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== } + resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} dependencies: call-bind: 1.0.2 dev: false /is-weakset@2.0.2: - resolution: - { integrity: sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg== } + resolution: {integrity: sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==} dependencies: call-bind: 1.0.2 get-intrinsic: 1.2.1 dev: false /isarray@2.0.5: - resolution: - { integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== } + resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} dev: false /isexe@2.0.0: - resolution: - { integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== } + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} /iterator.prototype@1.1.0: - resolution: - { integrity: sha512-rjuhAk1AJ1fssphHD0IFV6TWL40CwRZ53FrztKx43yk2v6rguBYsY4Bj1VU4HmoMmKwZUlx7mfnhDf9cOp4YTw== } + resolution: {integrity: sha512-rjuhAk1AJ1fssphHD0IFV6TWL40CwRZ53FrztKx43yk2v6rguBYsY4Bj1VU4HmoMmKwZUlx7mfnhDf9cOp4YTw==} dependencies: define-properties: 1.2.0 get-intrinsic: 1.2.1 @@ -1763,47 +2282,90 @@ packages: dev: false /jiti@1.19.3: - resolution: - { integrity: sha512-5eEbBDQT/jF1xg6l36P+mWGGoH9Spuy0PCdSr2dtWRDGC6ph/w9ZCL4lmESW8f8F7MwT3XKescfP0wnZWAKL9w== } + resolution: {integrity: sha512-5eEbBDQT/jF1xg6l36P+mWGGoH9Spuy0PCdSr2dtWRDGC6ph/w9ZCL4lmESW8f8F7MwT3XKescfP0wnZWAKL9w==} hasBin: true dev: false /js-tokens@4.0.0: - resolution: - { integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== } - dev: false + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} /js-yaml@4.1.0: - resolution: - { integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== } + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} hasBin: true dependencies: argparse: 2.0.1 + /jsdom@22.1.0: + resolution: {integrity: sha512-/9AVW7xNbsBv6GfWho4TTNjEo9fe6Zhf9O7s0Fhhr3u+awPwAJMKwAMXnkk5vBxflqLW9hTHX/0cs+P3gW+cQw==} + engines: {node: '>=16'} + peerDependencies: + canvas: ^2.5.0 + peerDependenciesMeta: + canvas: + optional: true + dependencies: + abab: 2.0.6 + cssstyle: 3.0.0 + data-urls: 4.0.0 + decimal.js: 10.4.3 + domexception: 4.0.0 + form-data: 4.0.0 + html-encoding-sniffer: 3.0.0 + http-proxy-agent: 5.0.0 + https-proxy-agent: 5.0.1 + is-potential-custom-element-name: 1.0.1 + nwsapi: 2.2.7 + parse5: 7.1.2 + rrweb-cssom: 0.6.0 + saxes: 6.0.0 + symbol-tree: 3.2.4 + tough-cookie: 4.1.3 + w3c-xmlserializer: 4.0.0 + webidl-conversions: 7.0.0 + whatwg-encoding: 2.0.0 + whatwg-mimetype: 3.0.0 + whatwg-url: 12.0.1 + ws: 8.13.0 + xml-name-validator: 4.0.0 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: true + + /jsesc@2.5.2: + resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} + engines: {node: '>=4'} + hasBin: true + /json-buffer@3.0.1: - resolution: - { integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== } + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} /json-schema-traverse@0.4.1: - resolution: - { integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== } + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} /json-stable-stringify-without-jsonify@1.0.1: - resolution: - { integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== } + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} /json5@1.0.2: - resolution: - { integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA== } + resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} hasBin: true dependencies: minimist: 1.2.8 dev: false + /json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + + /jsonc-parser@3.2.0: + resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} + dev: true + /jsx-ast-utils@3.3.5: - resolution: - { integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ== } - engines: { node: ">=4.0" } + resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} + engines: {node: '>=4.0'} dependencies: array-includes: 3.1.6 array.prototype.flat: 1.3.1 @@ -1812,107 +2374,134 @@ packages: dev: false /keyv@4.5.3: - resolution: - { integrity: sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug== } + resolution: {integrity: sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug==} dependencies: json-buffer: 3.0.1 /language-subtag-registry@0.3.22: - resolution: - { integrity: sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w== } + resolution: {integrity: sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==} dev: false /language-tags@1.0.5: - resolution: - { integrity: sha512-qJhlO9cGXi6hBGKoxEG/sKZDAHD5Hnu9Hs4WbOY3pCWXDhw0N8x1NenNzm2EnNLkLkk7J2SdxAkDSbb6ftT+UQ== } + resolution: {integrity: sha512-qJhlO9cGXi6hBGKoxEG/sKZDAHD5Hnu9Hs4WbOY3pCWXDhw0N8x1NenNzm2EnNLkLkk7J2SdxAkDSbb6ftT+UQ==} dependencies: language-subtag-registry: 0.3.22 dev: false /levn@0.4.1: - resolution: - { integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== } - engines: { node: ">= 0.8.0" } + 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 /lilconfig@2.1.0: - resolution: - { integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ== } - engines: { node: ">=10" } + resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} + engines: {node: '>=10'} dev: false /lines-and-columns@1.2.4: - resolution: - { integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== } + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} dev: false + /local-pkg@0.4.3: + resolution: {integrity: sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==} + engines: {node: '>=14'} + dev: true + /locate-path@6.0.0: - resolution: - { integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== } - engines: { node: ">=10" } + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} dependencies: p-locate: 5.0.0 /lodash.merge@4.6.2: - resolution: - { integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== } + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} /loose-envify@1.4.0: - resolution: - { integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== } + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} hasBin: true dependencies: js-tokens: 4.0.0 dev: false + /loupe@2.3.6: + resolution: {integrity: sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==} + dependencies: + get-func-name: 2.0.0 + dev: true + + /lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + dependencies: + yallist: 3.1.1 + /lru-cache@6.0.0: - resolution: - { integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== } - engines: { node: ">=10" } + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} dependencies: yallist: 4.0.0 dev: false + /magic-string@0.30.3: + resolution: {integrity: sha512-B7xGbll2fG/VjP+SWg4sX3JynwIU0mjoTc6MPpKNuIvftk6u6vqhDnk1R80b8C2GBR6ywqy+1DcKBrevBg+bmw==} + engines: {node: '>=12'} + dependencies: + '@jridgewell/sourcemap-codec': 1.4.15 + dev: true + /merge2@1.4.1: - resolution: - { integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== } - engines: { node: ">= 8" } + 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" } + resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} + engines: {node: '>=8.6'} dependencies: braces: 3.0.2 picomatch: 2.3.1 dev: false + /mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + dev: true + + /mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + dependencies: + mime-db: 1.52.0 + dev: true + /minimatch@3.1.2: - resolution: - { integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== } + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} dependencies: brace-expansion: 1.1.11 /minimist@1.2.8: - resolution: - { integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== } + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} dev: false + /mlly@1.4.1: + resolution: {integrity: sha512-SCDs78Q2o09jiZiE2WziwVBEqXQ02XkGdUy45cbJf+BpYRIjArXRJ1Wbowxkb+NaM9DWvS3UC9GiO/6eqvQ/pg==} + dependencies: + acorn: 8.10.0 + pathe: 1.1.1 + pkg-types: 1.0.3 + ufo: 1.3.0 + dev: true + /ms@2.1.2: - resolution: - { integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== } + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} /ms@2.1.3: - resolution: - { integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== } + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} dev: false /mz@2.7.0: - resolution: - { integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q== } + resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} dependencies: any-promise: 1.3.0 object-assign: 4.1.1 @@ -1920,101 +2509,92 @@ packages: dev: false /nanoid@3.3.6: - resolution: - { integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA== } - engines: { node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1 } + resolution: {integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true - dev: false /natural-compare@1.4.0: - resolution: - { integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== } + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} - /next@13.4.19(react-dom@18.2.0)(react@18.2.0): - resolution: - { integrity: sha512-HuPSzzAbJ1T4BD8e0bs6B9C1kWQ6gv8ykZoRWs5AQoiIuqbGHHdQO7Ljuvg05Q0Z24E2ABozHe6FxDvI6HfyAw== } - engines: { node: ">=16.8.0" } + /next@13.4.19(@babel/core@7.22.11)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-HuPSzzAbJ1T4BD8e0bs6B9C1kWQ6gv8ykZoRWs5AQoiIuqbGHHdQO7Ljuvg05Q0Z24E2ABozHe6FxDvI6HfyAw==} + engines: {node: '>=16.8.0'} hasBin: true peerDependencies: - "@opentelemetry/api": ^1.1.0 + '@opentelemetry/api': ^1.1.0 react: ^18.2.0 react-dom: ^18.2.0 sass: ^1.3.0 peerDependenciesMeta: - "@opentelemetry/api": + '@opentelemetry/api': optional: true sass: optional: true dependencies: - "@next/env": 13.4.19 - "@swc/helpers": 0.5.1 + '@next/env': 13.4.19 + '@swc/helpers': 0.5.1 busboy: 1.6.0 caniuse-lite: 1.0.30001524 postcss: 8.4.14 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - styled-jsx: 5.1.1(react@18.2.0) + styled-jsx: 5.1.1(@babel/core@7.22.11)(react@18.2.0) watchpack: 2.4.0 zod: 3.21.4 optionalDependencies: - "@next/swc-darwin-arm64": 13.4.19 - "@next/swc-darwin-x64": 13.4.19 - "@next/swc-linux-arm64-gnu": 13.4.19 - "@next/swc-linux-arm64-musl": 13.4.19 - "@next/swc-linux-x64-gnu": 13.4.19 - "@next/swc-linux-x64-musl": 13.4.19 - "@next/swc-win32-arm64-msvc": 13.4.19 - "@next/swc-win32-ia32-msvc": 13.4.19 - "@next/swc-win32-x64-msvc": 13.4.19 + '@next/swc-darwin-arm64': 13.4.19 + '@next/swc-darwin-x64': 13.4.19 + '@next/swc-linux-arm64-gnu': 13.4.19 + '@next/swc-linux-arm64-musl': 13.4.19 + '@next/swc-linux-x64-gnu': 13.4.19 + '@next/swc-linux-x64-musl': 13.4.19 + '@next/swc-win32-arm64-msvc': 13.4.19 + '@next/swc-win32-ia32-msvc': 13.4.19 + '@next/swc-win32-x64-msvc': 13.4.19 transitivePeerDependencies: - - "@babel/core" + - '@babel/core' - babel-plugin-macros dev: false /node-releases@2.0.13: - resolution: - { integrity: sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ== } - dev: false + resolution: {integrity: sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==} /normalize-path@3.0.0: - resolution: - { integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== } - engines: { node: ">=0.10.0" } + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} dev: false /normalize-range@0.1.2: - resolution: - { integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA== } - engines: { node: ">=0.10.0" } + resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} + engines: {node: '>=0.10.0'} dev: false + /nwsapi@2.2.7: + resolution: {integrity: sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ==} + dev: true + /object-assign@4.1.1: - resolution: - { integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== } - engines: { node: ">=0.10.0" } + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} dev: false /object-hash@3.0.0: - resolution: - { integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw== } - engines: { node: ">= 6" } + resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} + engines: {node: '>= 6'} dev: false /object-inspect@1.12.3: - resolution: - { integrity: sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g== } + resolution: {integrity: sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==} dev: false /object-keys@1.1.1: - resolution: - { integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} dev: false /object.assign@4.1.4: - resolution: - { integrity: sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ== } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==} + engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 define-properties: 1.2.0 @@ -2023,9 +2603,8 @@ packages: dev: false /object.entries@1.1.7: - resolution: - { integrity: sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA== } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA==} + engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 define-properties: 1.2.0 @@ -2033,9 +2612,8 @@ packages: dev: false /object.fromentries@2.0.7: - resolution: - { integrity: sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA== } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==} + engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 define-properties: 1.2.0 @@ -2043,8 +2621,7 @@ packages: dev: false /object.groupby@1.0.1: - resolution: - { integrity: sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ== } + resolution: {integrity: sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ==} dependencies: call-bind: 1.0.2 define-properties: 1.2.0 @@ -2053,17 +2630,15 @@ packages: dev: false /object.hasown@1.1.3: - resolution: - { integrity: sha512-fFI4VcYpRHvSLXxP7yiZOMAd331cPfd2p7PFDVbgUsYOfCT3tICVqXWngbjr4m49OvsBwUBQ6O2uQoJvy3RexA== } + resolution: {integrity: sha512-fFI4VcYpRHvSLXxP7yiZOMAd331cPfd2p7PFDVbgUsYOfCT3tICVqXWngbjr4m49OvsBwUBQ6O2uQoJvy3RexA==} dependencies: define-properties: 1.2.0 es-abstract: 1.22.1 dev: false /object.values@1.1.7: - resolution: - { integrity: sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng== } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==} + engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 define-properties: 1.2.0 @@ -2071,17 +2646,15 @@ packages: dev: false /once@1.4.0: - resolution: - { integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== } + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} dependencies: wrappy: 1.0.2 /optionator@0.9.3: - resolution: - { integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg== } - engines: { node: ">= 0.8.0" } + resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} + engines: {node: '>= 0.8.0'} dependencies: - "@aashutoshrathi/word-wrap": 1.2.6 + '@aashutoshrathi/word-wrap': 1.2.6 deep-is: 0.1.4 fast-levenshtein: 2.0.6 levn: 0.4.1 @@ -2089,79 +2662,94 @@ packages: type-check: 0.4.0 /p-limit@3.1.0: - resolution: - { integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== } - engines: { node: ">=10" } + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} dependencies: yocto-queue: 0.1.0 + /p-limit@4.0.0: + resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + yocto-queue: 1.0.0 + dev: true + /p-locate@5.0.0: - resolution: - { integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== } - engines: { node: ">=10" } + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} dependencies: p-limit: 3.1.0 /parent-module@1.0.1: - resolution: - { integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== } - engines: { node: ">=6" } + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} dependencies: callsites: 3.1.0 + /parse5@7.1.2: + resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==} + dependencies: + entities: 4.5.0 + dev: true + /path-exists@4.0.0: - resolution: - { integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== } - engines: { node: ">=8" } + 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" } + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} /path-key@3.1.1: - resolution: - { integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== } - engines: { node: ">=8" } + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} /path-parse@1.0.7: - resolution: - { integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== } + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} dev: false /path-type@4.0.0: - resolution: - { integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== } - engines: { node: ">=8" } + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} dev: false + /pathe@1.1.1: + resolution: {integrity: sha512-d+RQGp0MAYTIaDBIMmOfMwz3E+LOZnxx1HZd5R18mmCZY0QBlK0LDZfPc8FW8Ed2DlvsuE6PRjroDY+wg4+j/Q==} + dev: true + + /pathval@1.1.1: + resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} + dev: true + /picocolors@1.0.0: - resolution: - { integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== } - dev: false + resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} /picomatch@2.3.1: - resolution: - { integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== } - engines: { node: ">=8.6" } + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} dev: false /pify@2.3.0: - resolution: - { integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog== } - engines: { node: ">=0.10.0" } + resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} + engines: {node: '>=0.10.0'} dev: false /pirates@4.0.6: - resolution: - { integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg== } - engines: { node: ">= 6" } + resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} + engines: {node: '>= 6'} dev: false + /pkg-types@1.0.3: + resolution: {integrity: sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==} + dependencies: + jsonc-parser: 3.2.0 + mlly: 1.4.1 + pathe: 1.1.1 + dev: true + /postcss-import@15.1.0(postcss@8.4.29): - resolution: - { integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew== } - engines: { node: ">=14.0.0" } + resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} + engines: {node: '>=14.0.0'} peerDependencies: postcss: ^8.0.0 dependencies: @@ -2172,9 +2760,8 @@ packages: dev: false /postcss-js@4.0.1(postcss@8.4.29): - resolution: - { integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw== } - engines: { node: ^12 || ^14 || >= 16 } + resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==} + engines: {node: ^12 || ^14 || >= 16} peerDependencies: postcss: ^8.4.21 dependencies: @@ -2183,12 +2770,11 @@ packages: dev: false /postcss-load-config@4.0.1(postcss@8.4.29): - resolution: - { integrity: sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA== } - engines: { node: ">= 14" } + resolution: {integrity: sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==} + engines: {node: '>= 14'} peerDependencies: - postcss: ">=8.0.9" - ts-node: ">=9.0.0" + postcss: '>=8.0.9' + ts-node: '>=9.0.0' peerDependenciesMeta: postcss: optional: true @@ -2201,9 +2787,8 @@ packages: dev: false /postcss-nested@6.0.1(postcss@8.4.29): - resolution: - { integrity: sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ== } - engines: { node: ">=12.0" } + resolution: {integrity: sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==} + engines: {node: '>=12.0'} peerDependencies: postcss: ^8.2.14 dependencies: @@ -2212,23 +2797,20 @@ packages: dev: false /postcss-selector-parser@6.0.13: - resolution: - { integrity: sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ== } - engines: { node: ">=4" } + resolution: {integrity: sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==} + engines: {node: '>=4'} dependencies: cssesc: 3.0.0 util-deprecate: 1.0.2 dev: false /postcss-value-parser@4.2.0: - resolution: - { integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== } + resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} dev: false /postcss@8.4.14: - resolution: - { integrity: sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig== } - engines: { node: ^10 || ^12 || >=14 } + resolution: {integrity: sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==} + engines: {node: ^10 || ^12 || >=14} dependencies: nanoid: 3.3.6 picocolors: 1.0.0 @@ -2236,51 +2818,47 @@ packages: dev: false /postcss@8.4.29: - resolution: - { integrity: sha512-cbI+jaqIeu/VGqXEarWkRCCffhjgXc0qjBtXpqJhTBohMUjUQnbBr0xqX3vEKudc4iviTewcJo5ajcec5+wdJw== } - engines: { node: ^10 || ^12 || >=14 } + resolution: {integrity: sha512-cbI+jaqIeu/VGqXEarWkRCCffhjgXc0qjBtXpqJhTBohMUjUQnbBr0xqX3vEKudc4iviTewcJo5ajcec5+wdJw==} + engines: {node: ^10 || ^12 || >=14} dependencies: nanoid: 3.3.6 picocolors: 1.0.0 source-map-js: 1.0.2 - dev: false /prelude-ls@1.2.1: - resolution: - { integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== } - engines: { node: ">= 0.8.0" } + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} /prettier-plugin-tailwindcss@0.5.3(prettier@3.0.3): - resolution: - { integrity: sha512-M5K80V21yM+CTm/FEFYRv9/9LyInYbCSXpIoPAKMm8zy89IOwdiA2e4JVbcO7tvRtAQWz32zdj7/WKcsmFyAVg== } - engines: { node: ">=14.21.3" } + resolution: {integrity: sha512-M5K80V21yM+CTm/FEFYRv9/9LyInYbCSXpIoPAKMm8zy89IOwdiA2e4JVbcO7tvRtAQWz32zdj7/WKcsmFyAVg==} + engines: {node: '>=14.21.3'} peerDependencies: - "@ianvs/prettier-plugin-sort-imports": "*" - "@prettier/plugin-pug": "*" - "@shopify/prettier-plugin-liquid": "*" - "@shufo/prettier-plugin-blade": "*" - "@trivago/prettier-plugin-sort-imports": "*" + '@ianvs/prettier-plugin-sort-imports': '*' + '@prettier/plugin-pug': '*' + '@shopify/prettier-plugin-liquid': '*' + '@shufo/prettier-plugin-blade': '*' + '@trivago/prettier-plugin-sort-imports': '*' prettier: ^3.0 - prettier-plugin-astro: "*" - prettier-plugin-css-order: "*" - prettier-plugin-import-sort: "*" - prettier-plugin-jsdoc: "*" - prettier-plugin-marko: "*" - prettier-plugin-organize-attributes: "*" - prettier-plugin-organize-imports: "*" - prettier-plugin-style-order: "*" - prettier-plugin-svelte: "*" - prettier-plugin-twig-melody: "*" + prettier-plugin-astro: '*' + prettier-plugin-css-order: '*' + prettier-plugin-import-sort: '*' + prettier-plugin-jsdoc: '*' + prettier-plugin-marko: '*' + prettier-plugin-organize-attributes: '*' + prettier-plugin-organize-imports: '*' + prettier-plugin-style-order: '*' + prettier-plugin-svelte: '*' + prettier-plugin-twig-melody: '*' peerDependenciesMeta: - "@ianvs/prettier-plugin-sort-imports": + '@ianvs/prettier-plugin-sort-imports': optional: true - "@prettier/plugin-pug": + '@prettier/plugin-pug': optional: true - "@shopify/prettier-plugin-liquid": + '@shopify/prettier-plugin-liquid': optional: true - "@shufo/prettier-plugin-blade": + '@shufo/prettier-plugin-blade': optional: true - "@trivago/prettier-plugin-sort-imports": + '@trivago/prettier-plugin-sort-imports': optional: true prettier-plugin-astro: optional: true @@ -2307,33 +2885,45 @@ packages: dev: true /prettier@3.0.3: - resolution: - { integrity: sha512-L/4pUDMxcNa8R/EthV08Zt42WBO4h1rarVtK0K+QJG0X187OLo7l699jWw0GKuwzkPQ//jMFA/8Xm6Fh3J/DAg== } - engines: { node: ">=14" } + resolution: {integrity: sha512-L/4pUDMxcNa8R/EthV08Zt42WBO4h1rarVtK0K+QJG0X187OLo7l699jWw0GKuwzkPQ//jMFA/8Xm6Fh3J/DAg==} + engines: {node: '>=14'} hasBin: true dev: true + /pretty-format@29.6.3: + resolution: {integrity: sha512-ZsBgjVhFAj5KeK+nHfF1305/By3lechHQSMWCTl8iHSbfOm2TN5nHEtFc/+W7fAyUeCs2n5iow72gld4gW0xDw==} + 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 + /prop-types@15.8.1: - resolution: - { integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== } + resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} dependencies: loose-envify: 1.4.0 object-assign: 4.1.1 react-is: 16.13.1 dev: false + /psl@1.9.0: + resolution: {integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==} + dev: true + /punycode@2.3.0: - resolution: - { integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA== } - engines: { node: ">=6" } + resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==} + engines: {node: '>=6'} + + /querystringify@2.2.0: + resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} + dev: true /queue-microtask@1.2.3: - resolution: - { integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== } + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} /react-dom@18.2.0(react@18.2.0): - resolution: - { integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g== } + resolution: {integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==} peerDependencies: react: ^18.2.0 dependencies: @@ -2343,37 +2933,41 @@ packages: dev: false /react-is@16.13.1: - resolution: - { integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== } + resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} dev: false + /react-is@18.2.0: + resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} + dev: true + + /react-refresh@0.14.0: + resolution: {integrity: sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==} + engines: {node: '>=0.10.0'} + dev: true + /react@18.2.0: - resolution: - { integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ== } - engines: { node: ">=0.10.0" } + resolution: {integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==} + engines: {node: '>=0.10.0'} dependencies: loose-envify: 1.4.0 dev: false /read-cache@1.0.0: - resolution: - { integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA== } + resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} dependencies: pify: 2.3.0 dev: false /readdirp@3.6.0: - resolution: - { integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== } - engines: { node: ">=8.10.0" } + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} dependencies: picomatch: 2.3.1 dev: false /reflect.getprototypeof@1.0.3: - resolution: - { integrity: sha512-TTAOZpkJ2YLxl7mVHWrNo3iDMEkYlva/kgFcXndqMgbo/AZUmmavEkdXV+hXtE4P8xdyEKRzalaFqZVuwIk/Nw== } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-TTAOZpkJ2YLxl7mVHWrNo3iDMEkYlva/kgFcXndqMgbo/AZUmmavEkdXV+hXtE4P8xdyEKRzalaFqZVuwIk/Nw==} + engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 define-properties: 1.2.0 @@ -2384,33 +2978,32 @@ packages: dev: false /regenerator-runtime@0.14.0: - resolution: - { integrity: sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA== } + resolution: {integrity: sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==} dev: false /regexp.prototype.flags@1.5.0: - resolution: - { integrity: sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA== } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==} + engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 define-properties: 1.2.0 functions-have-names: 1.2.3 dev: false + /requires-port@1.0.0: + resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} + dev: true + /resolve-from@4.0.0: - resolution: - { integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== } - engines: { node: ">=4" } + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} /resolve-pkg-maps@1.0.0: - resolution: - { integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw== } + resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} dev: false /resolve@1.22.4: - resolution: - { integrity: sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg== } + resolution: {integrity: sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==} hasBin: true dependencies: is-core-module: 2.13.0 @@ -2419,8 +3012,7 @@ packages: dev: false /resolve@2.0.0-next.4: - resolution: - { integrity: sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ== } + resolution: {integrity: sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==} hasBin: true dependencies: is-core-module: 2.13.0 @@ -2429,27 +3021,35 @@ packages: dev: false /reusify@1.0.4: - resolution: - { integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== } - engines: { iojs: ">=1.0.0", node: ">=0.10.0" } + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} /rimraf@3.0.2: - resolution: - { integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== } + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} hasBin: true dependencies: glob: 7.2.3 + /rollup@3.28.1: + resolution: {integrity: sha512-R9OMQmIHJm9znrU3m3cpE8uhN0fGdXiawME7aZIpQqvpS/85+Vt1Hq1/yVIcYfOmaQiHjvXkQAoJukvLpau6Yw==} + engines: {node: '>=14.18.0', npm: '>=8.0.0'} + hasBin: true + optionalDependencies: + fsevents: 2.3.3 + dev: true + + /rrweb-cssom@0.6.0: + resolution: {integrity: sha512-APM0Gt1KoXBz0iIkkdB/kfvGOwC4UuJFeG/c+yV7wSc7q96cG/kJ0HiYCnzivD9SB53cLV1MlHFNfOuPaadYSw==} + dev: true + /run-parallel@1.2.0: - resolution: - { integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== } + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} dependencies: queue-microtask: 1.2.3 /safe-array-concat@1.0.0: - resolution: - { integrity: sha512-9dVEFruWIsnie89yym+xWTAYASdpw3CJV7Li/6zBewGf9z2i1j31rP6jnY0pHEO4QZh6N0K11bFjWmdR8UGdPQ== } - engines: { node: ">=0.4" } + resolution: {integrity: sha512-9dVEFruWIsnie89yym+xWTAYASdpw3CJV7Li/6zBewGf9z2i1j31rP6jnY0pHEO4QZh6N0K11bFjWmdR8UGdPQ==} + engines: {node: '>=0.4'} dependencies: call-bind: 1.0.2 get-intrinsic: 1.2.1 @@ -2458,78 +3058,88 @@ packages: dev: false /safe-regex-test@1.0.0: - resolution: - { integrity: sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA== } + resolution: {integrity: sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==} dependencies: call-bind: 1.0.2 get-intrinsic: 1.2.1 is-regex: 1.1.4 dev: false + /safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + dev: true + + /saxes@6.0.0: + resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==} + engines: {node: '>=v12.22.7'} + dependencies: + xmlchars: 2.2.0 + dev: true + /scheduler@0.23.0: - resolution: - { integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw== } + resolution: {integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==} dependencies: loose-envify: 1.4.0 dev: false /semver@6.3.1: - resolution: - { integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== } + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true - dev: false /semver@7.5.4: - resolution: - { integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== } - engines: { node: ">=10" } + resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} + engines: {node: '>=10'} hasBin: true dependencies: lru-cache: 6.0.0 dev: false /shebang-command@2.0.0: - resolution: - { integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== } - engines: { node: ">=8" } + 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" } + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} /side-channel@1.0.4: - resolution: - { integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== } + resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} dependencies: call-bind: 1.0.2 get-intrinsic: 1.2.1 object-inspect: 1.12.3 dev: false + /siginfo@2.0.0: + resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} + dev: true + /slash@3.0.0: - resolution: - { integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== } - engines: { node: ">=8" } + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} dev: false /source-map-js@1.0.2: - resolution: - { integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== } - engines: { node: ">=0.10.0" } - dev: false + resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} + engines: {node: '>=0.10.0'} + + /stackback@0.0.2: + resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + dev: true + + /std-env@3.4.3: + resolution: {integrity: sha512-f9aPhy8fYBuMN+sNfakZV18U39PbalgjXG3lLB9WkaYTxijru61wb57V9wxxNthXM5Sd88ETBWi29qLAsHO52Q==} + dev: true /streamsearch@1.1.0: - resolution: - { integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg== } - engines: { node: ">=10.0.0" } + resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} + engines: {node: '>=10.0.0'} dev: false /string.prototype.matchall@4.0.9: - resolution: - { integrity: sha512-6i5hL3MqG/K2G43mWXWgP+qizFW/QH/7kCNN13JrJS5q48FN5IKksLDscexKP3dnmB6cdm9jlNgAsWNLpSykmA== } + resolution: {integrity: sha512-6i5hL3MqG/K2G43mWXWgP+qizFW/QH/7kCNN13JrJS5q48FN5IKksLDscexKP3dnmB6cdm9jlNgAsWNLpSykmA==} dependencies: call-bind: 1.0.2 define-properties: 1.2.0 @@ -2542,9 +3152,8 @@ packages: dev: false /string.prototype.trim@1.2.7: - resolution: - { integrity: sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg== } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==} + engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 define-properties: 1.2.0 @@ -2552,8 +3161,7 @@ packages: dev: false /string.prototype.trimend@1.0.6: - resolution: - { integrity: sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ== } + resolution: {integrity: sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==} dependencies: call-bind: 1.0.2 define-properties: 1.2.0 @@ -2561,8 +3169,7 @@ packages: dev: false /string.prototype.trimstart@1.0.6: - resolution: - { integrity: sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA== } + resolution: {integrity: sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==} dependencies: call-bind: 1.0.2 define-properties: 1.2.0 @@ -2570,48 +3177,50 @@ packages: dev: false /strip-ansi@6.0.1: - resolution: - { integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== } - engines: { node: ">=8" } + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} dependencies: ansi-regex: 5.0.1 /strip-bom@3.0.0: - resolution: - { integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== } - engines: { node: ">=4" } + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} dev: false /strip-json-comments@3.1.1: - resolution: - { integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== } - engines: { node: ">=8" } - - /styled-jsx@5.1.1(react@18.2.0): - resolution: - { integrity: sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw== } - engines: { node: ">= 12.0.0" } + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + + /strip-literal@1.3.0: + resolution: {integrity: sha512-PugKzOsyXpArk0yWmUwqOZecSO0GH0bPoctLcqNDH9J04pVW3lflYE0ujElBGTloevcxF5MofAOZ7C5l2b+wLg==} + dependencies: + acorn: 8.10.0 + dev: true + + /styled-jsx@5.1.1(@babel/core@7.22.11)(react@18.2.0): + resolution: {integrity: sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==} + engines: {node: '>= 12.0.0'} peerDependencies: - "@babel/core": "*" - babel-plugin-macros: "*" - react: ">= 16.8.0 || 17.x.x || ^18.0.0-0" + '@babel/core': '*' + babel-plugin-macros: '*' + react: '>= 16.8.0 || 17.x.x || ^18.0.0-0' peerDependenciesMeta: - "@babel/core": + '@babel/core': optional: true babel-plugin-macros: optional: true dependencies: + '@babel/core': 7.22.11 client-only: 0.0.1 react: 18.2.0 dev: false /sucrase@3.34.0: - resolution: - { integrity: sha512-70/LQEZ07TEcxiU2dz51FKaE6hCTWC6vr7FOk3Gr0U60C3shtAN+H+BFr9XlYe5xqf3RA8nrc+VIwzCfnxuXJw== } - engines: { node: ">=8" } + resolution: {integrity: sha512-70/LQEZ07TEcxiU2dz51FKaE6hCTWC6vr7FOk3Gr0U60C3shtAN+H+BFr9XlYe5xqf3RA8nrc+VIwzCfnxuXJw==} + engines: {node: '>=8'} hasBin: true dependencies: - "@jridgewell/gen-mapping": 0.3.3 + '@jridgewell/gen-mapping': 0.3.3 commander: 4.1.1 glob: 7.1.6 lines-and-columns: 1.2.4 @@ -2620,26 +3229,33 @@ packages: ts-interface-checker: 0.1.13 dev: false + /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" } + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} dependencies: has-flag: 4.0.0 /supports-preserve-symlinks-flag@1.0.0: - resolution: - { integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} dev: false + /symbol-tree@3.2.4: + resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} + dev: true + /tailwindcss@3.3.3: - resolution: - { integrity: sha512-A0KgSkef7eE4Mf+nKJ83i75TMyq8HqY3qmFIJSWy8bNt0v1lG7jUcpGpoTFxAwYcWOphcTBLPPJg+bDfhDf52w== } - engines: { node: ">=14.0.0" } + resolution: {integrity: sha512-A0KgSkef7eE4Mf+nKJ83i75TMyq8HqY3qmFIJSWy8bNt0v1lG7jUcpGpoTFxAwYcWOphcTBLPPJg+bDfhDf52w==} + engines: {node: '>=14.0.0'} hasBin: true dependencies: - "@alloc/quick-lru": 5.2.0 + '@alloc/quick-lru': 5.2.0 arg: 5.0.2 chokidar: 3.5.3 didyoumean: 1.2.2 @@ -2666,84 +3282,125 @@ packages: dev: false /tapable@2.2.1: - resolution: - { integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== } - engines: { node: ">=6" } + resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} + engines: {node: '>=6'} dev: false /text-table@0.2.0: - resolution: - { integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== } + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} /thenify-all@1.6.0: - resolution: - { integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA== } - engines: { node: ">=0.8" } + resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} + engines: {node: '>=0.8'} dependencies: thenify: 3.3.1 dev: false /thenify@3.3.1: - resolution: - { integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw== } + resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} dependencies: any-promise: 1.3.0 dev: false + /tinybench@2.5.0: + resolution: {integrity: sha512-kRwSG8Zx4tjF9ZiyH4bhaebu+EDz1BOx9hOigYHlUW4xxI/wKIUQUqo018UlU4ar6ATPBsaMrdbKZ+tmPdohFA==} + dev: true + + /tinypool@0.7.0: + resolution: {integrity: sha512-zSYNUlYSMhJ6Zdou4cJwo/p7w5nmAH17GRfU/ui3ctvjXFErXXkruT4MWW6poDeXgCaIBlGLrfU6TbTXxyGMww==} + engines: {node: '>=14.0.0'} + dev: true + + /tinyspy@2.1.1: + resolution: {integrity: sha512-XPJL2uSzcOyBMky6OFrusqWlzfFrXtE0hPuMgW8A2HmaqrPo4ZQHRN/V0QXN3FSjKxpsbRrFc5LI7KOwBsT1/w==} + engines: {node: '>=14.0.0'} + dev: true + + /to-fast-properties@2.0.0: + resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} + engines: {node: '>=4'} + /to-regex-range@5.0.1: - resolution: - { integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== } - engines: { node: ">=8.0" } + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} dependencies: is-number: 7.0.0 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: true + + /tr46@4.1.1: + resolution: {integrity: sha512-2lv/66T7e5yNyhAAC4NaKe5nVavzuGJQVVtRYLyQ2OI8tsJ61PMLlelehb0wi2Hx6+hT/OJUWZcw8MjlSRnxvw==} + engines: {node: '>=14'} + dependencies: + punycode: 2.3.0 + dev: true + /ts-api-utils@1.0.2(typescript@5.2.2): - resolution: - { integrity: sha512-Cbu4nIqnEdd+THNEsBdkolnOXhg0I8XteoHaEKgvsxpsbWda4IsUut2c187HxywQCvveojow0Dgw/amxtSKVkQ== } - engines: { node: ">=16.13.0" } + resolution: {integrity: sha512-Cbu4nIqnEdd+THNEsBdkolnOXhg0I8XteoHaEKgvsxpsbWda4IsUut2c187HxywQCvveojow0Dgw/amxtSKVkQ==} + engines: {node: '>=16.13.0'} peerDependencies: - typescript: ">=4.2.0" + typescript: '>=4.2.0' dependencies: typescript: 5.2.2 dev: false /ts-interface-checker@0.1.13: - resolution: - { integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA== } + resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} dev: false + /tsconfck@2.1.2(typescript@5.2.2): + resolution: {integrity: sha512-ghqN1b0puy3MhhviwO2kGF8SeMDNhEbnKxjK7h6+fvY9JAxqvXi8y5NAHSQv687OVboS2uZIByzGd45/YxrRHg==} + engines: {node: ^14.13.1 || ^16 || >=18} + hasBin: true + peerDependencies: + typescript: ^4.3.5 || ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + dependencies: + typescript: 5.2.2 + dev: true + /tsconfig-paths@3.14.2: - resolution: - { integrity: sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g== } + resolution: {integrity: sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==} dependencies: - "@types/json5": 0.0.29 + '@types/json5': 0.0.29 json5: 1.0.2 minimist: 1.2.8 strip-bom: 3.0.0 dev: false /tslib@2.6.2: - resolution: - { integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== } + resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} dev: false /type-check@0.4.0: - resolution: - { integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== } - engines: { node: ">= 0.8.0" } + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} dependencies: prelude-ls: 1.2.1 + /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" } + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} + engines: {node: '>=10'} /typed-array-buffer@1.0.0: - resolution: - { integrity: sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw== } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==} + engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 get-intrinsic: 1.2.1 @@ -2751,9 +3408,8 @@ packages: dev: false /typed-array-byte-length@1.0.0: - resolution: - { integrity: sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA== } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==} + engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 for-each: 0.3.3 @@ -2762,9 +3418,8 @@ packages: dev: false /typed-array-byte-offset@1.0.0: - resolution: - { integrity: sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg== } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==} + engines: {node: '>= 0.4'} dependencies: available-typed-arrays: 1.0.5 call-bind: 1.0.2 @@ -2774,8 +3429,7 @@ packages: dev: false /typed-array-length@1.0.4: - resolution: - { integrity: sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng== } + resolution: {integrity: sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==} dependencies: call-bind: 1.0.2 for-each: 0.3.3 @@ -2783,15 +3437,16 @@ packages: dev: false /typescript@5.2.2: - resolution: - { integrity: sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w== } - engines: { node: ">=14.17" } + resolution: {integrity: sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==} + engines: {node: '>=14.17'} hasBin: true - dev: false + + /ufo@1.3.0: + resolution: {integrity: sha512-bRn3CsoojyNStCZe0BG0Mt4Nr/4KF+rhFlnNXybgqt5pXHNFRlqinSoQaTrGyzE4X8aHplSb+TorH+COin9Yxw==} + dev: true /unbox-primitive@1.0.2: - resolution: - { integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw== } + resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} dependencies: call-bind: 1.0.2 has-bigints: 1.0.2 @@ -2799,41 +3454,220 @@ packages: which-boxed-primitive: 1.0.2 dev: false + /universalify@0.2.0: + resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==} + engines: {node: '>= 4.0.0'} + dev: true + /update-browserslist-db@1.0.11(browserslist@4.21.10): - resolution: - { integrity: sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA== } + resolution: {integrity: sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==} hasBin: true peerDependencies: - browserslist: ">= 4.21.0" + browserslist: '>= 4.21.0' dependencies: browserslist: 4.21.10 escalade: 3.1.1 picocolors: 1.0.0 - dev: false /uri-js@4.4.1: - resolution: - { integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== } + 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: true + /util-deprecate@1.0.2: - resolution: - { integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== } + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} dev: false + /vite-node@0.34.3(@types/node@20.5.7): + resolution: {integrity: sha512-+0TzJf1g0tYXj6tR2vEyiA42OPq68QkRZCu/ERSo2PtsDJfBpDyEfuKbRvLmZqi/CgC7SCBtyC+WjTGNMRIaig==} + engines: {node: '>=v14.18.0'} + hasBin: true + dependencies: + cac: 6.7.14 + debug: 4.3.4 + mlly: 1.4.1 + pathe: 1.1.1 + picocolors: 1.0.0 + vite: 4.4.9(@types/node@20.5.7) + transitivePeerDependencies: + - '@types/node' + - less + - lightningcss + - sass + - stylus + - sugarss + - supports-color + - terser + dev: true + + /vite-tsconfig-paths@4.2.0(typescript@5.2.2)(vite@4.4.9): + resolution: {integrity: sha512-jGpus0eUy5qbbMVGiTxCL1iB9ZGN6Bd37VGLJU39kTDD6ZfULTTb1bcc5IeTWqWJKiWV5YihCaibeASPiGi8kw==} + peerDependencies: + vite: '*' + peerDependenciesMeta: + vite: + optional: true + dependencies: + debug: 4.3.4 + globrex: 0.1.2 + tsconfck: 2.1.2(typescript@5.2.2) + vite: 4.4.9(@types/node@20.5.7) + transitivePeerDependencies: + - supports-color + - typescript + dev: true + + /vite@4.4.9(@types/node@20.5.7): + resolution: {integrity: sha512-2mbUn2LlUmNASWwSCNSJ/EG2HuSRTnVNaydp6vMCm5VIqJsjMfbIWtbH2kDuwUVW5mMUKKZvGPX/rqeqVvv1XA==} + engines: {node: ^14.18.0 || >=16.0.0} + hasBin: true + peerDependencies: + '@types/node': '>= 14' + less: '*' + lightningcss: ^1.21.0 + sass: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + dependencies: + '@types/node': 20.5.7 + esbuild: 0.18.20 + postcss: 8.4.29 + rollup: 3.28.1 + optionalDependencies: + fsevents: 2.3.3 + dev: true + + /vitest@0.34.3(jsdom@22.1.0): + resolution: {integrity: sha512-7+VA5Iw4S3USYk+qwPxHl8plCMhA5rtfwMjgoQXMT7rO5ldWcdsdo3U1QD289JgglGK4WeOzgoLTsGFu6VISyQ==} + engines: {node: '>=v14.18.0'} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@vitest/browser': '*' + '@vitest/ui': '*' + happy-dom: '*' + jsdom: '*' + playwright: '*' + safaridriver: '*' + webdriverio: '*' + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@vitest/browser': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true + playwright: + optional: true + safaridriver: + optional: true + webdriverio: + optional: true + dependencies: + '@types/chai': 4.3.5 + '@types/chai-subset': 1.3.3 + '@types/node': 20.5.7 + '@vitest/expect': 0.34.3 + '@vitest/runner': 0.34.3 + '@vitest/snapshot': 0.34.3 + '@vitest/spy': 0.34.3 + '@vitest/utils': 0.34.3 + acorn: 8.10.0 + acorn-walk: 8.2.0 + cac: 6.7.14 + chai: 4.3.8 + debug: 4.3.4 + jsdom: 22.1.0 + local-pkg: 0.4.3 + magic-string: 0.30.3 + pathe: 1.1.1 + picocolors: 1.0.0 + std-env: 3.4.3 + strip-literal: 1.3.0 + tinybench: 2.5.0 + tinypool: 0.7.0 + vite: 4.4.9(@types/node@20.5.7) + vite-node: 0.34.3(@types/node@20.5.7) + why-is-node-running: 2.2.2 + transitivePeerDependencies: + - less + - lightningcss + - sass + - stylus + - sugarss + - supports-color + - terser + dev: true + + /w3c-xmlserializer@4.0.0: + resolution: {integrity: sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw==} + engines: {node: '>=14'} + dependencies: + xml-name-validator: 4.0.0 + dev: true + /watchpack@2.4.0: - resolution: - { integrity: sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg== } - engines: { node: ">=10.13.0" } + resolution: {integrity: sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==} + engines: {node: '>=10.13.0'} dependencies: glob-to-regexp: 0.4.1 graceful-fs: 4.2.11 dev: false + /webidl-conversions@7.0.0: + resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} + engines: {node: '>=12'} + dev: true + + /whatwg-encoding@2.0.0: + resolution: {integrity: sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==} + engines: {node: '>=12'} + dependencies: + iconv-lite: 0.6.3 + dev: true + + /whatwg-mimetype@3.0.0: + resolution: {integrity: sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==} + engines: {node: '>=12'} + dev: true + + /whatwg-url@12.0.1: + resolution: {integrity: sha512-Ed/LrqB8EPlGxjS+TrsXcpUond1mhccS3pchLhzSgPCnTimUCKj3IZE75pAs5m6heB2U2TMerKFUXheyHY+VDQ==} + engines: {node: '>=14'} + dependencies: + tr46: 4.1.1 + webidl-conversions: 7.0.0 + dev: true + /which-boxed-primitive@1.0.2: - resolution: - { integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== } + resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} dependencies: is-bigint: 1.0.4 is-boolean-object: 1.1.2 @@ -2843,9 +3677,8 @@ packages: dev: false /which-builtin-type@1.1.3: - resolution: - { integrity: sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw== } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==} + engines: {node: '>= 0.4'} dependencies: function.prototype.name: 1.1.6 has-tostringtag: 1.0.0 @@ -2862,8 +3695,7 @@ packages: dev: false /which-collection@1.0.1: - resolution: - { integrity: sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A== } + resolution: {integrity: sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==} dependencies: is-map: 2.0.2 is-set: 2.0.2 @@ -2872,9 +3704,8 @@ packages: dev: false /which-typed-array@1.1.11: - resolution: - { integrity: sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew== } - engines: { node: ">= 0.4" } + resolution: {integrity: sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==} + engines: {node: '>= 0.4'} dependencies: available-typed-arrays: 1.0.5 call-bind: 1.0.2 @@ -2884,34 +3715,67 @@ packages: dev: false /which@2.0.2: - resolution: - { integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== } - engines: { node: ">= 8" } + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} hasBin: true dependencies: isexe: 2.0.0 + /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 + /wrappy@1.0.2: - resolution: - { integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== } + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + /ws@8.13.0: + resolution: {integrity: sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==} + 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: true + + /xml-name-validator@4.0.0: + resolution: {integrity: sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==} + engines: {node: '>=12'} + dev: true + + /xmlchars@2.2.0: + resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} + dev: true + + /yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} /yallist@4.0.0: - resolution: - { integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== } + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} dev: false /yaml@2.3.2: - resolution: - { integrity: sha512-N/lyzTPaJasoDmfV7YTrYCI0G/3ivm/9wdG0aHuheKowWQwGTsK0Eoiw6utmzAnI6pkJa0DUVygvp3spqqEKXg== } - engines: { node: ">= 14" } + resolution: {integrity: sha512-N/lyzTPaJasoDmfV7YTrYCI0G/3ivm/9wdG0aHuheKowWQwGTsK0Eoiw6utmzAnI6pkJa0DUVygvp3spqqEKXg==} + engines: {node: '>= 14'} dev: false /yocto-queue@0.1.0: - resolution: - { integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== } - engines: { node: ">=10" } + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + + /yocto-queue@1.0.0: + resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} + engines: {node: '>=12.20'} + dev: true /zod@3.21.4: - resolution: - { integrity: sha512-m46AKbrzKVzOzs/DZgVnG5H55N1sv1M8qZU3A8RIKbs3mrACDNeIOeilDymVb2HdmP8uwshOCF4uJ8uM9rCqJw== } + resolution: {integrity: sha512-m46AKbrzKVzOzs/DZgVnG5H55N1sv1M8qZU3A8RIKbs3mrACDNeIOeilDymVb2HdmP8uwshOCF4uJ8uM9rCqJw==} dev: false diff --git a/apps/web/tests/sum.test.ts b/apps/web/tests/sum.test.ts new file mode 100644 index 00000000..8b0865ca --- /dev/null +++ b/apps/web/tests/sum.test.ts @@ -0,0 +1,22 @@ +import { describe, expect, test } from "vitest"; + +const add = (a: number, b: number) => { + return a + b; +}; + +describe("test add function", () => { + test("should return the sum of two numbers", () => { + const result = add(2, 3); + expect(result).toBe(5); + }); + + test("should return zero when adding zero to a number", () => { + const result = add(10, 0); + expect(result).toBe(10); + }); + + test("should return a negative number when adding a negative and a positive number", () => { + const result = add(-5, 8); + expect(result).toBe(3); + }); +}); diff --git a/apps/web/vitest.config.ts b/apps/web/vitest.config.ts new file mode 100644 index 00000000..8941f6d2 --- /dev/null +++ b/apps/web/vitest.config.ts @@ -0,0 +1,12 @@ +import { defineConfig } from "vitest/config"; +import react from "@vitejs/plugin-react"; +import tsconfigPaths from "vite-tsconfig-paths"; + +export default defineConfig({ + plugins: [tsconfigPaths(), react()], + test: { + globals: true, + environment: "jsdom", + // setupFiles: ["./tests/setup/rendering.ts"], + }, +}); From 71a7615ef02723f401f8142a75646e51c905da52 Mon Sep 17 00:00:00 2001 From: Florian LEROUX Date: Wed, 30 Aug 2023 14:09:16 +0200 Subject: [PATCH 549/883] feat(ci): add docker image build and publish --- .github/workflows/web.yml | 21 +++++++++++++- apps/web/.dockerignore | 7 +++++ apps/web/Dockerfile | 61 +++++++++++++++++++++++++++++++++++++++ apps/web/next.config.js | 1 + 4 files changed, 89 insertions(+), 1 deletion(-) create mode 100644 apps/web/.dockerignore create mode 100644 apps/web/Dockerfile diff --git a/.github/workflows/web.yml b/.github/workflows/web.yml index 52bf9c5b..dbf460fa 100644 --- a/.github/workflows/web.yml +++ b/.github/workflows/web.yml @@ -69,7 +69,7 @@ jobs: - name: Build run: pnpm build - tests: + test: runs-on: ubuntu-latest steps: @@ -86,3 +86,22 @@ jobs: run: pnpm install --frozen-lockfile - name: Test run: pnpm test + + publish: + runs-on: ubuntu-latest + needs: [build, test] + steps: + - name: Checkout code + uses: actions/checkout@master + - name: Login to Docker Hub + uses: docker/login-action@v2 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + - name: Build and push + uses: docker/build-push-action@v4 + with: + context: ./services/ + file: ./services/notification/Dockerfile + push: true + tags: pierrelbg/goodfood-notification:lates diff --git a/apps/web/.dockerignore b/apps/web/.dockerignore new file mode 100644 index 00000000..72e9aa42 --- /dev/null +++ b/apps/web/.dockerignore @@ -0,0 +1,7 @@ +Dockerfile +.dockerignore +node_modules +npm-debug.log +README.md +.next +.git \ No newline at end of file diff --git a/apps/web/Dockerfile b/apps/web/Dockerfile new file mode 100644 index 00000000..665c2e1d --- /dev/null +++ b/apps/web/Dockerfile @@ -0,0 +1,61 @@ +FROM node:18-alpine AS base + +# Install dependencies only when needed +FROM base AS deps +# Check https://github.com/nodejs/docker-node/tree/b4117f9333da4138b03a546ec926ef50a31506c3#nodealpine to understand why libc6-compat might be needed. +RUN apk add --no-cache libc6-compat +WORKDIR /app + +# Install dependencies based on the preferred package manager +COPY package.json yarn.lock* package-lock.json* pnpm-lock.yaml* ./ +RUN \ + if [ -f yarn.lock ]; then yarn --frozen-lockfile; \ + elif [ -f package-lock.json ]; then npm ci; \ + elif [ -f pnpm-lock.yaml ]; then yarn global add pnpm && pnpm i --frozen-lockfile; \ + else echo "Lockfile not found." && exit 1; \ + fi + + +# Rebuild the source code only when needed +FROM base AS builder +WORKDIR /app +COPY --from=deps /app/node_modules ./node_modules +COPY . . + +# Next.js collects completely anonymous telemetry data about general usage. +# Learn more here: https://nextjs.org/telemetry +# Uncomment the following line in case you want to disable telemetry during the build. +ENV NEXT_TELEMETRY_DISABLED 1 + +RUN yarn build + +# If using npm comment out above and use below instead +# RUN npm run build + +# Production image, copy all the files and run next +FROM base AS runner +WORKDIR /app + +ENV NODE_ENV production +# Uncomment the following line in case you want to disable telemetry during runtime. +ENV NEXT_TELEMETRY_DISABLED 1 + +RUN addgroup --system --gid 1001 nodejs +RUN adduser --system --uid 1001 nextjs + +COPY --from=builder /app/public ./public + +# Automatically leverage output traces to reduce image size +# https://nextjs.org/docs/advanced-features/output-file-tracing +COPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./ +COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static + +USER nextjs + +EXPOSE 3000 + +ENV PORT 3000 +# set hostname to localhost +ENV HOSTNAME "0.0.0.0" + +CMD ["node", "server.js"] \ No newline at end of file diff --git a/apps/web/next.config.js b/apps/web/next.config.js index b2c1ed26..bfae3638 100644 --- a/apps/web/next.config.js +++ b/apps/web/next.config.js @@ -12,6 +12,7 @@ const nextConfig = { ], }, ], + output: "standalone", }; module.exports = nextConfig; From c72e4de693de88b85b2c56dec42fa016c66dcab0 Mon Sep 17 00:00:00 2001 From: Florian LEROUX Date: Wed, 30 Aug 2023 14:12:45 +0200 Subject: [PATCH 550/883] fix(ci): fix docker publish job --- .github/workflows/web.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/web.yml b/.github/workflows/web.yml index dbf460fa..5c706c3b 100644 --- a/.github/workflows/web.yml +++ b/.github/workflows/web.yml @@ -101,7 +101,7 @@ jobs: - name: Build and push uses: docker/build-push-action@v4 with: - context: ./services/ - file: ./services/notification/Dockerfile + context: ./apps/web/. + file: ./apps/web/Dockerfile push: true - tags: pierrelbg/goodfood-notification:lates + tags: floriaaan/goodfood-web:latest From 644404542a36a745fa2ad979a06db0adadccbd77 Mon Sep 17 00:00:00 2001 From: Florian LEROUX Date: Thu, 31 Aug 2023 12:00:55 +0200 Subject: [PATCH 551/883] feat(home): add navbar and heading section --- apps/web/app/(home)/page.tsx | 11 ++++ apps/web/app/(home)/rating.tsx | 42 +++++++++++++ apps/web/app/favicon.ico | Bin 25931 -> 0 bytes apps/web/app/globals.css | 22 ------- apps/web/app/layout.tsx | 6 +- apps/web/app/page.tsx | 7 --- apps/web/components/ui/Logo.tsx | 57 ++++++++++++++++++ .../components/ui/navbar/dropdown/basket.tsx | 9 +++ .../components/ui/navbar/dropdown/list.tsx | 14 +++++ .../ui/navbar/dropdown/location.tsx | 9 +++ .../components/ui/navbar/dropdown/menu.tsx | 9 +++ .../components/ui/navbar/dropdown/user.tsx | 9 +++ apps/web/components/ui/navbar/index.tsx | 22 +++++++ apps/web/components/ui/navbar/location.tsx | 17 ++++++ apps/web/hooks/useAuth.tsx | 8 +++ apps/web/next.config.js | 3 + apps/web/package.json | 3 + apps/web/pnpm-lock.yaml | 28 +++++++++ apps/web/styles/globals.css | 10 +++ 19 files changed, 254 insertions(+), 32 deletions(-) create mode 100644 apps/web/app/(home)/page.tsx create mode 100644 apps/web/app/(home)/rating.tsx delete mode 100644 apps/web/app/favicon.ico delete mode 100644 apps/web/app/globals.css delete mode 100644 apps/web/app/page.tsx create mode 100644 apps/web/components/ui/Logo.tsx create mode 100644 apps/web/components/ui/navbar/dropdown/basket.tsx create mode 100644 apps/web/components/ui/navbar/dropdown/list.tsx create mode 100644 apps/web/components/ui/navbar/dropdown/location.tsx create mode 100644 apps/web/components/ui/navbar/dropdown/menu.tsx create mode 100644 apps/web/components/ui/navbar/dropdown/user.tsx create mode 100644 apps/web/components/ui/navbar/index.tsx create mode 100644 apps/web/components/ui/navbar/location.tsx create mode 100644 apps/web/hooks/useAuth.tsx create mode 100644 apps/web/styles/globals.css diff --git a/apps/web/app/(home)/page.tsx b/apps/web/app/(home)/page.tsx new file mode 100644 index 00000000..b368b1a7 --- /dev/null +++ b/apps/web/app/(home)/page.tsx @@ -0,0 +1,11 @@ +import { RatingSection } from "@/app/(home)/rating"; +import { Navbar } from "@/components/ui/navbar"; + +export default function Home() { + return ( + <> + + + + ); +} diff --git a/apps/web/app/(home)/rating.tsx b/apps/web/app/(home)/rating.tsx new file mode 100644 index 00000000..638281d6 --- /dev/null +++ b/apps/web/app/(home)/rating.tsx @@ -0,0 +1,42 @@ +import Image from "next/image"; +import { Inria_Serif } from "next/font/google"; +import classNames from "classnames"; +import { MdOutlineStar, MdStar, MdStarOutline } from "react-icons/md"; +import { useAuth } from "@/hooks/useAuth"; + +const inria_serif = Inria_Serif({ subsets: ["latin"], weight: ["400", "700"] }); + +export const RatingSection = () => { + const { user } = useAuth(); + return ( +
+ bg +
+
+

{user.first_name}

+

{"Comment s'est passé votre repas mardi ?"}

+
+
+ {[...Array(5)].map((_, i) => ( +
+ + +
+ ))} +
+
+
+ ); +}; diff --git a/apps/web/app/favicon.ico b/apps/web/app/favicon.ico deleted file mode 100644 index 718d6fea4835ec2d246af9800eddb7ffb276240c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25931 zcmeHv30#a{`}aL_*G&7qml|y<+KVaDM2m#dVr!KsA!#An?kSQM(q<_dDNCpjEux83 zLb9Z^XxbDl(w>%i@8hT6>)&Gu{h#Oeyszu?xtw#Zb1mO{pgX9699l+Qppw7jXaYf~-84xW z)w4x8?=youko|}Vr~(D$UXIbiXABHh`p1?nn8Po~fxRJv}|0e(BPs|G`(TT%kKVJAdg5*Z|x0leQq0 zkdUBvb#>9F()jo|T~kx@OM8$9wzs~t2l;K=woNssA3l6|sx2r3+kdfVW@e^8e*E}v zA1y5{bRi+3Z`uD3{F7LgFJDdvm;nJilkzDku>BwXH(8ItVCXk*-lSJnR?-2UN%hJ){&rlvg`CDTj z)Bzo!3v7Ou#83zEDEFcKt(f1E0~=rqeEbTnMvWR#{+9pg%7G8y>u1OVRUSoox-ovF z2Ydma(;=YuBY(eI|04{hXzZD6_f(v~H;C~y5=DhAC{MMS>2fm~1H_t2$56pc$NH8( z5bH|<)71dV-_oCHIrzrT`2s-5w_+2CM0$95I6X8p^r!gHp+j_gd;9O<1~CEQQGS8) zS9Qh3#p&JM-G8rHekNmKVewU;pJRcTAog68KYo^dRo}(M>36U4Us zfgYWSiHZL3;lpWT=zNAW>Dh#mB!_@Lg%$ms8N-;aPqMn+C2HqZgz&9~Eu z4|Kp<`$q)Uw1R?y(~S>ePdonHxpV1#eSP1B;Ogo+-Pk}6#0GsZZ5!||ev2MGdh}_m z{DeR7?0-1^zVs&`AV6Vt;r3`I`OI_wgs*w=eO%_#7Kepl{B@xiyCANc(l zzIyd4y|c6PXWq9-|KM8(zIk8LPk(>a)zyFWjhT!$HJ$qX1vo@d25W<fvZQ2zUz5WRc(UnFMKHwe1| zWmlB1qdbiA(C0jmnV<}GfbKtmcu^2*P^O?MBLZKt|As~ge8&AAO~2K@zbXelK|4T<{|y4`raF{=72kC2Kn(L4YyenWgrPiv z@^mr$t{#X5VuIMeL!7Ab6_kG$&#&5p*Z{+?5U|TZ`B!7llpVmp@skYz&n^8QfPJzL z0G6K_OJM9x+Wu2gfN45phANGt{7=C>i34CV{Xqlx(fWpeAoj^N0Biu`w+MVcCUyU* zDZuzO0>4Z6fbu^T_arWW5n!E45vX8N=bxTVeFoep_G#VmNlQzAI_KTIc{6>c+04vr zx@W}zE5JNSU>!THJ{J=cqjz+4{L4A{Ob9$ZJ*S1?Ggg3klFp!+Y1@K+pK1DqI|_gq z5ZDXVpge8-cs!o|;K73#YXZ3AShj50wBvuq3NTOZ`M&qtjj#GOFfgExjg8Gn8>Vq5 z`85n+9|!iLCZF5$HJ$Iu($dm?8~-ofu}tEc+-pyke=3!im#6pk_Wo8IA|fJwD&~~F zc16osQ)EBo58U7XDuMexaPRjU@h8tXe%S{fA0NH3vGJFhuyyO!Uyl2^&EOpX{9As0 zWj+P>{@}jxH)8|r;2HdupP!vie{sJ28b&bo!8`D^x}TE$%zXNb^X1p@0PJ86`dZyj z%ce7*{^oo+6%&~I!8hQy-vQ7E)0t0ybH4l%KltWOo~8cO`T=157JqL(oq_rC%ea&4 z2NcTJe-HgFjNg-gZ$6!Y`SMHrlj}Etf7?r!zQTPPSv}{so2e>Fjs1{gzk~LGeesX%r(Lh6rbhSo_n)@@G-FTQy93;l#E)hgP@d_SGvyCp0~o(Y;Ee8{ zdVUDbHm5`2taPUOY^MAGOw*>=s7=Gst=D+p+2yON!0%Hk` zz5mAhyT4lS*T3LS^WSxUy86q&GnoHxzQ6vm8)VS}_zuqG?+3td68_x;etQAdu@sc6 zQJ&5|4(I?~3d-QOAODHpZ=hlSg(lBZ!JZWCtHHSj`0Wh93-Uk)_S%zsJ~aD>{`A0~ z9{AG(e|q3g5B%wYKRxiL2Y$8(4w6bzchKuloQW#e&S3n+P- z8!ds-%f;TJ1>)v)##>gd{PdS2Oc3VaR`fr=`O8QIO(6(N!A?pr5C#6fc~Ge@N%Vvu zaoAX2&(a6eWy_q&UwOhU)|P3J0Qc%OdhzW=F4D|pt0E4osw;%<%Dn58hAWD^XnZD= z>9~H(3bmLtxpF?a7su6J7M*x1By7YSUbxGi)Ot0P77`}P3{)&5Un{KD?`-e?r21!4vTTnN(4Y6Lin?UkSM z`MXCTC1@4A4~mvz%Rh2&EwY))LeoT=*`tMoqcEXI>TZU9WTP#l?uFv+@Dn~b(>xh2 z;>B?;Tz2SR&KVb>vGiBSB`@U7VIWFSo=LDSb9F{GF^DbmWAfpms8Sx9OX4CnBJca3 zlj9(x!dIjN?OG1X4l*imJNvRCk}F%!?SOfiOq5y^mZW)jFL@a|r-@d#f7 z2gmU8L3IZq0ynIws=}~m^#@&C%J6QFo~Mo4V`>v7MI-_!EBMMtb%_M&kvAaN)@ZVw z+`toz&WG#HkWDjnZE!6nk{e-oFdL^$YnbOCN}JC&{$#$O27@|Tn-skXr)2ml2~O!5 zX+gYoxhoc7qoU?C^3~&!U?kRFtnSEecWuH0B0OvLodgUAi}8p1 zrO6RSXHH}DMc$&|?D004DiOVMHV8kXCP@7NKB zgaZq^^O<7PoKEp72kby@W0Z!Y*Ay{&vfg#C&gG@YVR9g?FEocMUi1gSN$+V+ayF45{a zuDZDTN}mS|;BO%gEf}pjBfN2-gIrU#G5~cucA;dokXW89%>AyXJJI z9X4UlIWA|ZYHgbI z5?oFk@A=Ik7lrEQPDH!H+b`7_Y~aDb_qa=B2^Y&Ow41cU=4WDd40dp5(QS-WMN-=Y z9g;6_-JdNU;|6cPwf$ak*aJIcwL@1n$#l~zi{c{EW?T;DaW*E8DYq?Umtz{nJ&w-M zEMyTDrC&9K$d|kZe2#ws6)L=7K+{ zQw{XnV6UC$6-rW0emqm8wJoeZK)wJIcV?dST}Z;G0Arq{dVDu0&4kd%N!3F1*;*pW zR&qUiFzK=@44#QGw7k1`3t_d8&*kBV->O##t|tonFc2YWrL7_eqg+=+k;!F-`^b8> z#KWCE8%u4k@EprxqiV$VmmtiWxDLgnGu$Vs<8rppV5EajBXL4nyyZM$SWVm!wnCj-B!Wjqj5-5dNXukI2$$|Bu3Lrw}z65Lc=1G z^-#WuQOj$hwNGG?*CM_TO8Bg-1+qc>J7k5c51U8g?ZU5n?HYor;~JIjoWH-G>AoUP ztrWWLbRNqIjW#RT*WqZgPJXU7C)VaW5}MiijYbABmzoru6EmQ*N8cVK7a3|aOB#O& zBl8JY2WKfmj;h#Q!pN%9o@VNLv{OUL?rixHwOZuvX7{IJ{(EdPpuVFoQqIOa7giLVkBOKL@^smUA!tZ1CKRK}#SSM)iQHk)*R~?M!qkCruaS!#oIL1c z?J;U~&FfH#*98^G?i}pA{ z9Jg36t4=%6mhY(quYq*vSxptes9qy|7xSlH?G=S@>u>Ebe;|LVhs~@+06N<4CViBk zUiY$thvX;>Tby6z9Y1edAMQaiH zm^r3v#$Q#2T=X>bsY#D%s!bhs^M9PMAcHbCc0FMHV{u-dwlL;a1eJ63v5U*?Q_8JO zT#50!RD619#j_Uf))0ooADz~*9&lN!bBDRUgE>Vud-i5ck%vT=r^yD*^?Mp@Q^v+V zG#-?gKlr}Eeqifb{|So?HM&g91P8|av8hQoCmQXkd?7wIJwb z_^v8bbg`SAn{I*4bH$u(RZ6*xUhuA~hc=8czK8SHEKTzSxgbwi~9(OqJB&gwb^l4+m`k*Q;_?>Y-APi1{k zAHQ)P)G)f|AyjSgcCFps)Fh6Bca*Xznq36!pV6Az&m{O8$wGFD? zY&O*3*J0;_EqM#jh6^gMQKpXV?#1?>$ml1xvh8nSN>-?H=V;nJIwB07YX$e6vLxH( zqYwQ>qxwR(i4f)DLd)-$P>T-no_c!LsN@)8`e;W@)-Hj0>nJ-}Kla4-ZdPJzI&Mce zv)V_j;(3ERN3_@I$N<^|4Lf`B;8n+bX@bHbcZTopEmDI*Jfl)-pFDvo6svPRoo@(x z);_{lY<;);XzT`dBFpRmGrr}z5u1=pC^S-{ce6iXQlLGcItwJ^mZx{m$&DA_oEZ)B{_bYPq-HA zcH8WGoBG(aBU_j)vEy+_71T34@4dmSg!|M8Vf92Zj6WH7Q7t#OHQqWgFE3ARt+%!T z?oLovLVlnf?2c7pTc)~cc^($_8nyKwsN`RA-23ed3sdj(ys%pjjM+9JrctL;dy8a( z@en&CQmnV(()bu|Y%G1-4a(6x{aLytn$T-;(&{QIJB9vMox11U-1HpD@d(QkaJdEb zG{)+6Dos_L+O3NpWo^=gR?evp|CqEG?L&Ut#D*KLaRFOgOEK(Kq1@!EGcTfo+%A&I z=dLbB+d$u{sh?u)xP{PF8L%;YPPW53+@{>5W=Jt#wQpN;0_HYdw1{ksf_XhO4#2F= zyPx6Lx2<92L-;L5PD`zn6zwIH`Jk($?Qw({erA$^bC;q33hv!d!>%wRhj# zal^hk+WGNg;rJtb-EB(?czvOM=H7dl=vblBwAv>}%1@{}mnpUznfq1cE^sgsL0*4I zJ##!*B?=vI_OEVis5o+_IwMIRrpQyT_Sq~ZU%oY7c5JMIADzpD!Upz9h@iWg_>>~j zOLS;wp^i$-E?4<_cp?RiS%Rd?i;f*mOz=~(&3lo<=@(nR!_Rqiprh@weZlL!t#NCc zO!QTcInq|%#>OVgobj{~ixEUec`E25zJ~*DofsQdzIa@5^nOXj2T;8O`l--(QyU^$t?TGY^7#&FQ+2SS3B#qK*k3`ye?8jUYSajE5iBbJls75CCc(m3dk{t?- zopcER9{Z?TC)mk~gpi^kbbu>b-+a{m#8-y2^p$ka4n60w;Sc2}HMf<8JUvhCL0B&Btk)T`ctE$*qNW8L$`7!r^9T+>=<=2qaq-;ll2{`{Rg zc5a0ZUI$oG&j-qVOuKa=*v4aY#IsoM+1|c4Z)<}lEDvy;5huB@1RJPquU2U*U-;gu z=En2m+qjBzR#DEJDO`WU)hdd{Vj%^0V*KoyZ|5lzV87&g_j~NCjwv0uQVqXOb*QrQ zy|Qn`hxx(58c70$E;L(X0uZZ72M1!6oeg)(cdKO ze0gDaTz+ohR-#d)NbAH4x{I(21yjwvBQfmpLu$)|m{XolbgF!pmsqJ#D}(ylp6uC> z{bqtcI#hT#HW=wl7>p!38sKsJ`r8}lt-q%Keqy%u(xk=yiIJiUw6|5IvkS+#?JTBl z8H5(Q?l#wzazujH!8o>1xtn8#_w+397*_cy8!pQGP%K(Ga3pAjsaTbbXJlQF_+m+-UpUUent@xM zg%jqLUExj~o^vQ3Gl*>wh=_gOr2*|U64_iXb+-111aH}$TjeajM+I20xw(((>fej-@CIz4S1pi$(#}P7`4({6QS2CaQS4NPENDp>sAqD z$bH4KGzXGffkJ7R>V>)>tC)uax{UsN*dbeNC*v}#8Y#OWYwL4t$ePR?VTyIs!wea+ z5Urmc)X|^`MG~*dS6pGSbU+gPJoq*^a=_>$n4|P^w$sMBBy@f*Z^Jg6?n5?oId6f{ z$LW4M|4m502z0t7g<#Bx%X;9<=)smFolV&(V^(7Cv2-sxbxopQ!)*#ZRhTBpx1)Fc zNm1T%bONzv6@#|dz(w02AH8OXe>kQ#1FMCzO}2J_mST)+ExmBr9cva-@?;wnmWMOk z{3_~EX_xadgJGv&H@zK_8{(x84`}+c?oSBX*Ge3VdfTt&F}yCpFP?CpW+BE^cWY0^ zb&uBN!Ja3UzYHK-CTyA5=L zEMW{l3Usky#ly=7px648W31UNV@K)&Ub&zP1c7%)`{);I4b0Q<)B}3;NMG2JH=X$U zfIW4)4n9ZM`-yRj67I)YSLDK)qfUJ_ij}a#aZN~9EXrh8eZY2&=uY%2N0UFF7<~%M zsB8=erOWZ>Ct_#^tHZ|*q`H;A)5;ycw*IcmVxi8_0Xk}aJA^ath+E;xg!x+As(M#0=)3!NJR6H&9+zd#iP(m0PIW8$ z1Y^VX`>jm`W!=WpF*{ioM?C9`yOR>@0q=u7o>BP-eSHqCgMDj!2anwH?s%i2p+Q7D zzszIf5XJpE)IG4;d_(La-xenmF(tgAxK`Y4sQ}BSJEPs6N_U2vI{8=0C_F?@7<(G; zo$~G=8p+076G;`}>{MQ>t>7cm=zGtfbdDXm6||jUU|?X?CaE?(<6bKDYKeHlz}DA8 zXT={X=yp_R;HfJ9h%?eWvQ!dRgz&Su*JfNt!Wu>|XfU&68iRikRrHRW|ZxzRR^`eIGt zIeiDgVS>IeExKVRWW8-=A=yA`}`)ZkWBrZD`hpWIxBGkh&f#ijr449~m`j6{4jiJ*C!oVA8ZC?$1RM#K(_b zL9TW)kN*Y4%^-qPpMP7d4)o?Nk#>aoYHT(*g)qmRUb?**F@pnNiy6Fv9rEiUqD(^O zzyS?nBrX63BTRYduaG(0VVG2yJRe%o&rVrLjbxTaAFTd8s;<<@Qs>u(<193R8>}2_ zuwp{7;H2a*X7_jryzriZXMg?bTuegABb^87@SsKkr2)0Gyiax8KQWstw^v#ix45EVrcEhr>!NMhprl$InQMzjSFH54x5k9qHc`@9uKQzvL4ihcq{^B zPrVR=o_ic%Y>6&rMN)hTZsI7I<3&`#(nl+3y3ys9A~&^=4?PL&nd8)`OfG#n zwAMN$1&>K++c{^|7<4P=2y(B{jJsQ0a#U;HTo4ZmWZYvI{+s;Td{Yzem%0*k#)vjpB zia;J&>}ICate44SFYY3vEelqStQWFihx%^vQ@Do(sOy7yR2@WNv7Y9I^yL=nZr3mb zXKV5t@=?-Sk|b{XMhA7ZGB@2hqsx}4xwCW!in#C zI@}scZlr3-NFJ@NFaJlhyfcw{k^vvtGl`N9xSo**rDW4S}i zM9{fMPWo%4wYDG~BZ18BD+}h|GQKc-g^{++3MY>}W_uq7jGHx{mwE9fZiPCoxN$+7 zrODGGJrOkcPQUB(FD5aoS4g~7#6NR^ma7-!>mHuJfY5kTe6PpNNKC9GGRiu^L31uG z$7v`*JknQHsYB!Tm_W{a32TM099djW%5e+j0Ve_ct}IM>XLF1Ap+YvcrLV=|CKo6S zb+9Nl3_YdKP6%Cxy@6TxZ>;4&nTneadr z_ES90ydCev)LV!dN=#(*f}|ZORFdvkYBni^aLbUk>BajeWIOcmHP#8S)*2U~QKI%S zyrLmtPqb&TphJ;>yAxri#;{uyk`JJqODDw%(Z=2`1uc}br^V%>j!gS)D*q*f_-qf8&D;W1dJgQMlaH5er zN2U<%Smb7==vE}dDI8K7cKz!vs^73o9f>2sgiTzWcwY|BMYHH5%Vn7#kiw&eItCqa zIkR2~Q}>X=Ar8W|^Ms41Fm8o6IB2_j60eOeBB1Br!boW7JnoeX6Gs)?7rW0^5psc- zjS16yb>dFn>KPOF;imD}e!enuIniFzv}n$m2#gCCv4jM#ArwlzZ$7@9&XkFxZ4n!V zj3dyiwW4Ki2QG{@i>yuZXQizw_OkZI^-3otXC{!(lUpJF33gI60ak;Uqitp74|B6I zgg{b=Iz}WkhCGj1M=hu4#Aw173YxIVbISaoc z-nLZC*6Tgivd5V`K%GxhBsp@SUU60-rfc$=wb>zdJzXS&-5(NRRodFk;Kxk!S(O(a0e7oY=E( zAyS;Ow?6Q&XA+cnkCb{28_1N8H#?J!*$MmIwLq^*T_9-z^&UE@A(z9oGYtFy6EZef LrJugUA?W`A8`#=m diff --git a/apps/web/app/globals.css b/apps/web/app/globals.css deleted file mode 100644 index b7fe784e..00000000 --- a/apps/web/app/globals.css +++ /dev/null @@ -1,22 +0,0 @@ -@tailwind base; -@tailwind components; -@tailwind utilities; - -:root { - --foreground-rgb: 0, 0, 0; - --background-start-rgb: 214, 219, 220; - --background-end-rgb: 255, 255, 255; -} - -@media (prefers-color-scheme: dark) { - :root { - --foreground-rgb: 255, 255, 255; - --background-start-rgb: 0, 0, 0; - --background-end-rgb: 0, 0, 0; - } -} - -body { - color: rgb(var(--foreground-rgb)); - background: linear-gradient(to bottom, transparent, rgb(var(--background-end-rgb))) rgb(var(--background-start-rgb)); -} diff --git a/apps/web/app/layout.tsx b/apps/web/app/layout.tsx index db8bb4bb..726c3f00 100644 --- a/apps/web/app/layout.tsx +++ b/apps/web/app/layout.tsx @@ -1,12 +1,12 @@ -import "./globals.css"; +import "@/styles/globals.css"; import type { Metadata } from "next"; import { Inter } from "next/font/google"; const inter = Inter({ subsets: ["latin"] }); export const metadata: Metadata = { - title: "Create Next App", - description: "Generated by create next app", + title: "Goodfood", + description: "Goodfood", }; export default function RootLayout({ children }: { children: React.ReactNode }) { diff --git a/apps/web/app/page.tsx b/apps/web/app/page.tsx deleted file mode 100644 index 3afe659f..00000000 --- a/apps/web/app/page.tsx +++ /dev/null @@ -1,7 +0,0 @@ -export default function Home() { - return ( -
-

Home

-
- ); -} diff --git a/apps/web/components/ui/Logo.tsx b/apps/web/components/ui/Logo.tsx new file mode 100644 index 00000000..9c481647 --- /dev/null +++ b/apps/web/components/ui/Logo.tsx @@ -0,0 +1,57 @@ +import classNames from "classnames"; + +export const Logo = ({ className }: { className?: string }) => ( + <> + + + + + + + + + + + + + + +); diff --git a/apps/web/components/ui/navbar/dropdown/basket.tsx b/apps/web/components/ui/navbar/dropdown/basket.tsx new file mode 100644 index 00000000..7a4cec82 --- /dev/null +++ b/apps/web/components/ui/navbar/dropdown/basket.tsx @@ -0,0 +1,9 @@ +import { MdOutlineShoppingBasket } from "react-icons/md"; + +export const BasketDropdown = () => { + return ( + + ); +}; diff --git a/apps/web/components/ui/navbar/dropdown/list.tsx b/apps/web/components/ui/navbar/dropdown/list.tsx new file mode 100644 index 00000000..efb64d80 --- /dev/null +++ b/apps/web/components/ui/navbar/dropdown/list.tsx @@ -0,0 +1,14 @@ +import { BasketDropdown } from "@/components/ui/navbar/dropdown/basket"; +import { LocationDropdown } from "@/components/ui/navbar/dropdown/location"; +import { UserDropdown } from "@/components/ui/navbar/dropdown/user"; +import classNames from "classnames"; + +export const DropdownList = ({ className }: { className?: string }) => { + return ( +
+ + + +
+ ); +}; diff --git a/apps/web/components/ui/navbar/dropdown/location.tsx b/apps/web/components/ui/navbar/dropdown/location.tsx new file mode 100644 index 00000000..17ec5869 --- /dev/null +++ b/apps/web/components/ui/navbar/dropdown/location.tsx @@ -0,0 +1,9 @@ +import { MdOutlineLocationOn } from "react-icons/md"; + +export const LocationDropdown = () => { + return ( + + ); +}; diff --git a/apps/web/components/ui/navbar/dropdown/menu.tsx b/apps/web/components/ui/navbar/dropdown/menu.tsx new file mode 100644 index 00000000..dff6ed1f --- /dev/null +++ b/apps/web/components/ui/navbar/dropdown/menu.tsx @@ -0,0 +1,9 @@ +import { MdMenu } from "react-icons/md"; + +export const MenuDropdown = () => { + return ( + + ); +}; diff --git a/apps/web/components/ui/navbar/dropdown/user.tsx b/apps/web/components/ui/navbar/dropdown/user.tsx new file mode 100644 index 00000000..ea58f4ad --- /dev/null +++ b/apps/web/components/ui/navbar/dropdown/user.tsx @@ -0,0 +1,9 @@ +import { MdOutlineAccountBox } from "react-icons/md"; + +export const UserDropdown = () => { + return ( + + ); +}; diff --git a/apps/web/components/ui/navbar/index.tsx b/apps/web/components/ui/navbar/index.tsx new file mode 100644 index 00000000..ffac1367 --- /dev/null +++ b/apps/web/components/ui/navbar/index.tsx @@ -0,0 +1,22 @@ +import { Logo } from "@/components/ui/Logo"; +import { DropdownList } from "@/components/ui/navbar/dropdown/list"; +import { MenuDropdown } from "@/components/ui/navbar/dropdown/menu"; +import { Location } from "@/components/ui/navbar/location"; +import Link from "next/link"; + +export const Navbar = () => { + return ( + + ); +}; diff --git a/apps/web/components/ui/navbar/location.tsx b/apps/web/components/ui/navbar/location.tsx new file mode 100644 index 00000000..dd693d03 --- /dev/null +++ b/apps/web/components/ui/navbar/location.tsx @@ -0,0 +1,17 @@ +import classNames from "classnames"; +import { format } from "date-fns"; +import { fr } from "date-fns/locale"; +import { MdArrowForwardIos, MdOutlineLocationOn } from "react-icons/md"; + +export const Location = ({ className }: { className?: string }) => { + return ( +
+ +
+ 23 rue Amiral Cécille - 76100 Rouen + {`${format(new Date(), "eeee d MMMM", { locale: fr })} - (12:15 - 12:35)`} +
+ +
+ ); +}; diff --git a/apps/web/hooks/useAuth.tsx b/apps/web/hooks/useAuth.tsx new file mode 100644 index 00000000..231eeea2 --- /dev/null +++ b/apps/web/hooks/useAuth.tsx @@ -0,0 +1,8 @@ +export const useAuth = () => { + return { + user: { + first_name: "Anatole", + last_name: "Lebigroux", + }, + }; +}; diff --git a/apps/web/next.config.js b/apps/web/next.config.js index bfae3638..79299ba8 100644 --- a/apps/web/next.config.js +++ b/apps/web/next.config.js @@ -1,5 +1,8 @@ /** @type {import('next').NextConfig} */ const nextConfig = { + images: { + domains: ["localhost", "images.unsplash.com"], + }, headers: () => [ // HSTS { diff --git a/apps/web/package.json b/apps/web/package.json index e87afaf7..1925a37f 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -15,12 +15,15 @@ "@types/react": "18.2.21", "@types/react-dom": "18.2.7", "autoprefixer": "10.4.15", + "classnames": "^2.3.2", + "date-fns": "^2.30.0", "eslint": "8.48.0", "eslint-config-next": "13.4.19", "next": "13.4.19", "postcss": "8.4.29", "react": "18.2.0", "react-dom": "18.2.0", + "react-icons": "^4.10.1", "tailwindcss": "3.3.3", "typescript": "5.2.2" }, diff --git a/apps/web/pnpm-lock.yaml b/apps/web/pnpm-lock.yaml index b733350e..d0d038cb 100644 --- a/apps/web/pnpm-lock.yaml +++ b/apps/web/pnpm-lock.yaml @@ -17,6 +17,12 @@ dependencies: autoprefixer: specifier: 10.4.15 version: 10.4.15(postcss@8.4.29) + classnames: + specifier: ^2.3.2 + version: 2.3.2 + date-fns: + specifier: ^2.30.0 + version: 2.30.0 eslint: specifier: 8.48.0 version: 8.48.0 @@ -35,6 +41,9 @@ dependencies: react-dom: specifier: 18.2.0 version: 18.2.0(react@18.2.0) + react-icons: + specifier: ^4.10.1 + version: 4.10.1(react@18.2.0) tailwindcss: specifier: 3.3.3 version: 3.3.3 @@ -1167,6 +1176,10 @@ packages: fsevents: 2.3.3 dev: false + /classnames@2.3.2: + resolution: {integrity: sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw==} + dev: false + /client-only@0.0.1: resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} dev: false @@ -1244,6 +1257,13 @@ packages: whatwg-url: 12.0.1 dev: true + /date-fns@2.30.0: + resolution: {integrity: sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==} + engines: {node: '>=0.11'} + dependencies: + '@babel/runtime': 7.22.11 + dev: false + /debug@3.2.7: resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} peerDependencies: @@ -2932,6 +2952,14 @@ packages: scheduler: 0.23.0 dev: false + /react-icons@4.10.1(react@18.2.0): + resolution: {integrity: sha512-/ngzDP/77tlCfqthiiGNZeYFACw85fUjZtLbedmJ5DTlNDIwETxhwBzdOJ21zj4iJdvc0J3y7yOsX3PpxAJzrw==} + peerDependencies: + react: '*' + dependencies: + react: 18.2.0 + dev: false + /react-is@16.13.1: resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} dev: false diff --git a/apps/web/styles/globals.css b/apps/web/styles/globals.css new file mode 100644 index 00000000..5f9ddb7f --- /dev/null +++ b/apps/web/styles/globals.css @@ -0,0 +1,10 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; + + +@layer components { + .gf_shadow { + @apply transition-shadow duration-150 shadow-[3px_3px_0px_0px_#000000] active:shadow-[0px_0px_0px_0px_#000000] + } +} \ No newline at end of file From fddc0b68795a4fc8707542cf53d10411c02a0e37 Mon Sep 17 00:00:00 2001 From: Florian LEROUX Date: Fri, 1 Sep 2023 14:56:31 +0200 Subject: [PATCH 552/883] feat(init): add types and tmp data, init shadcn/ui components --- apps/web/.eslintrc.json | 18 +- apps/web/components.json | 16 ++ apps/web/constants/data.ts | 197 +++++++++++++ apps/web/lib/utils.ts | 6 + apps/web/package.json | 8 +- apps/web/pnpm-lock.yaml | 539 ++++++++++++++++++++++++++++++++++-- apps/web/public/favicon.ico | Bin 0 -> 15406 bytes apps/web/styles/globals.css | 72 +++++ apps/web/tailwind.config.ts | 114 +++++++- apps/web/tsconfig.json | 3 +- apps/web/types/delivery.ts | 25 ++ apps/web/types/global.ts | 6 + apps/web/types/order.ts | 40 +++ apps/web/types/payment.ts | 22 ++ apps/web/types/product.ts | 35 +++ 15 files changed, 1064 insertions(+), 37 deletions(-) create mode 100644 apps/web/components.json create mode 100644 apps/web/constants/data.ts create mode 100644 apps/web/lib/utils.ts create mode 100644 apps/web/public/favicon.ico create mode 100644 apps/web/types/delivery.ts create mode 100644 apps/web/types/global.ts create mode 100644 apps/web/types/order.ts create mode 100644 apps/web/types/payment.ts create mode 100644 apps/web/types/product.ts diff --git a/apps/web/.eslintrc.json b/apps/web/.eslintrc.json index c5d43a6e..ed1d9a4a 100644 --- a/apps/web/.eslintrc.json +++ b/apps/web/.eslintrc.json @@ -1,3 +1,19 @@ { - "extends": ["next", "prettier"] + "extends": ["next", "prettier"], + "plugins": ["@typescript-eslint", "prettier"], + "root": true, + "rules": { + "no-console": "error", + "no-unused-vars": "off", + "@typescript-eslint/no-unused-vars": ["warn", { "argsIgnorePattern": "^_" }], + "prettier/prettier": [ + "error", + { + "endOfLine": "auto" + } + ] + }, + "globals": { + "JSX": "readonly" + } } diff --git a/apps/web/components.json b/apps/web/components.json new file mode 100644 index 00000000..c90a3c77 --- /dev/null +++ b/apps/web/components.json @@ -0,0 +1,16 @@ +{ + "$schema": "https://ui.shadcn.com/schema.json", + "style": "default", + "rsc": true, + "tsx": true, + "tailwind": { + "config": "tailwind.config.js", + "css": "styles/globals.css", + "baseColor": "neutral", + "cssVariables": true + }, + "aliases": { + "components": "@/components", + "utils": "@/lib/utils" + } +} \ No newline at end of file diff --git a/apps/web/constants/data.ts b/apps/web/constants/data.ts new file mode 100644 index 00000000..9952f87b --- /dev/null +++ b/apps/web/constants/data.ts @@ -0,0 +1,197 @@ +import { Status } from "@/types/global"; +import { DeliveryType, Order } from "@/types/order"; +import { PaymentStatus } from "@/types/payment"; +import { Product, ProductType } from "@/types/product"; + +export const productList: Product[] = [ + { + id: "product-1", + name: "Pork qué prik thaï", + price: 8.5, + preparation: "15 min", + weight: "420g", + kilocalories: "182 kcal", + allergens: [ + { + id: "allergen-1", + libelle: "Gluten", + }, + ], + nutriscore: 3, + restaurant_id: "restaurant-1", + type: ProductType.PLATS, + image: "/images/tmp/pork.png", + categories: [ + { + id: "category-1", + libelle: "Épicé", + hexa_color: "#FBEAEF", + icon: "🌶️", + }, + ], + comment: `Vous cherchez un plat savoureux qui vous donne un peu de piquant pour faire passer la monotonie de votre journée ? Ne cherchez pas plus loin que notre Pork qué prik thaï !\nAvec des poivrons rouges, verts et jaunes, des edamames et une généreuse portion de riz, ce sauté de porc au poivre est tout ce dont vous avez besoin pour ajouter un peu de piquant à votre vie.\nMais pas de soucis, aucun porc épic n'a été blessé pendant la préparation de ce plat !`, + }, + { + id: "product-2", + name: "Goodwich au pesto verde", + price: 7.5, + preparation: "10 min", + weight: "300g", + kilocalories: "150 kcal", + allergens: [ + { + id: "allergen-1", + libelle: "Gluten", + }, + ], + nutriscore: 2, + restaurant_id: "restaurant-1", + type: ProductType.PLATS, + image: "/images/tmp/wich.png", + categories: [ + { + id: "category-2", + libelle: "Frais", + hexa_color: "#EAFBF5", + icon: "🥗", + }, + ], + comment: ``, + }, +]; + +export const restaurantList = [ + { + id: "restaurant-1", + name: "Rouen Gros Horloge", + address: "1 Rue du Gros Horloge, 76000 Rouen", + coordinates: [49.440459, 1.094853], + opening_hours: "11h30 - 14h30 / 18h30 - 22h30", + }, + { + id: "restaurant-2", + name: "Rouen Pierre Corneille", + address: "76 Rue Pierre Corneille, 76000 Rouen", + coordinates: [49.442459, 1.094853], + opening_hours: "11h30 - 14h30 / 18h30 - 22h30", + }, +]; + +export const orderList: Order[] = [ + { + id: "order_id:1", + payment_id: "payment_id:1", + payment: { + id: "payment_id:1", + total: 8.5, + status: PaymentStatus.APPROVED, + created_at: "2023-08-07T10:20:00.000Z", + updated_at: "2023-08-07T10:20:00.000Z", + user_id: "user_id:1", + user: { + id: "user_id:1", + name: "John Doe", + email: "john@doe.com", + }, + }, + + delivery_id: "delivery_id:1", + delivery: { + id: "delivery_id:1", + eta: "2023-08-07T10:20:00.000Z", + address: "9 rue des Champs, 27310 Saint-Ouen-de-Thouberville", + status: Status.PENDING, + restaurant_id: "restaurant_id:1", + person: { + id: "delivery_person_id:1", + first_name: "John", + last_name: "Doe", + phone: "0612345678", + location: [49.440459, 1.094853], + }, + delivery_person_id: "delivery_person_id:1", + user_id: "user_id:1", + }, + + delivery_type: DeliveryType.DELIVERY, + user: { + id: "user_id:1", + first_name: "John", + last_name: "Doe", + email: "john@doe.com", + phone: "0612345678", + }, + basket_snapshot: { + json: { + "product_id:1": { count: 1, price: 15 }, + "product_id:2": { count: 2, price: 10 }, + }, + string: JSON.stringify({ + "product_id:1": { count: 1, price: 15 }, + "product_id:2": { count: 2, price: 10 }, + }), + total: 35, + }, + status: Status.PENDING, + restaurant_id: "restaurant_id:1", + created_at: new Date("2000-01-01T12:00:00.000Z"), + updated_at: new Date("2000-01-01T12:00:00.000Z"), + }, + { + id: "order_id:2", + payment_id: "payment_id:2", + payment: { + id: "payment_id:2", + total: 8.5, + status: PaymentStatus.PENDING, + created_at: "2023-08-07T10:20:00.000Z", + updated_at: "2023-08-07T10:20:00.000Z", + user_id: "user_id:1", + user: { + id: "user_id:1", + name: "John Doe", + email: "john@doe.com", + }, + }, + delivery_id: "delivery_id:2", + delivery: { + id: "delivery_id:2", + eta: "2021-05-20T12:00:00.000Z", + address: "1 Rue du Gros Horloge, 76000 Rouen", + status: Status.PENDING, + restaurant_id: "restaurant_id:1", + person: { + id: "delivery_person_id:2", + first_name: "Jane", + last_name: "Doe", + phone: "0612345678", + location: [49.370459, 0.9], + }, + delivery_person_id: "delivery_person_id:1", + user_id: "user_id:1", + }, + delivery_type: DeliveryType.DELIVERY, + user: { + id: "user_id:1", + first_name: "John", + last_name: "Doe", + email: "john@doe.com", + phone: "0612345678", + }, + basket_snapshot: { + json: { + "product_id:1": { count: 1, price: 15 }, + "product_id:2": { count: 4, price: 5 }, + }, + string: JSON.stringify({ + "product_id:1": { count: 1, price: 15 }, + "product_id:2": { count: 4, price: 5 }, + }), + total: 35, + }, + status: Status.FULFILLED, + restaurant_id: "restaurant_id:2", + created_at: new Date("2000-01-01T12:00:00.000Z"), + updated_at: new Date("2000-01-01T12:00:00.000Z"), + }, +]; diff --git a/apps/web/lib/utils.ts b/apps/web/lib/utils.ts new file mode 100644 index 00000000..ec79801f --- /dev/null +++ b/apps/web/lib/utils.ts @@ -0,0 +1,6 @@ +import { type ClassValue, clsx } from "clsx" +import { twMerge } from "tailwind-merge" + +export function cn(...inputs: ClassValue[]) { + return twMerge(clsx(inputs)) +} diff --git a/apps/web/package.json b/apps/web/package.json index 1925a37f..be348b9b 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -11,23 +11,29 @@ "test": "vitest" }, "dependencies": { + "@radix-ui/react-dialog": "^1.0.4", "@types/node": "20.5.7", "@types/react": "18.2.21", "@types/react-dom": "18.2.7", "autoprefixer": "10.4.15", - "classnames": "^2.3.2", + "class-variance-authority": "^0.7.0", + "clsx": "^2.0.0", "date-fns": "^2.30.0", "eslint": "8.48.0", "eslint-config-next": "13.4.19", + "lucide-react": "^0.274.0", "next": "13.4.19", "postcss": "8.4.29", "react": "18.2.0", "react-dom": "18.2.0", "react-icons": "^4.10.1", + "tailwind-merge": "^1.14.0", "tailwindcss": "3.3.3", + "tailwindcss-animate": "^1.0.7", "typescript": "5.2.2" }, "devDependencies": { + "@typescript-eslint/eslint-plugin": "^6.5.0", "@vitejs/plugin-react": "^4.0.4", "eslint-config-prettier": "^9.0.0", "jsdom": "^22.1.0", diff --git a/apps/web/pnpm-lock.yaml b/apps/web/pnpm-lock.yaml index d0d038cb..39902ef1 100644 --- a/apps/web/pnpm-lock.yaml +++ b/apps/web/pnpm-lock.yaml @@ -5,6 +5,9 @@ settings: excludeLinksFromLockfile: false dependencies: + '@radix-ui/react-dialog': + specifier: ^1.0.4 + version: 1.0.4(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) '@types/node': specifier: 20.5.7 version: 20.5.7 @@ -17,9 +20,12 @@ dependencies: autoprefixer: specifier: 10.4.15 version: 10.4.15(postcss@8.4.29) - classnames: - specifier: ^2.3.2 - version: 2.3.2 + class-variance-authority: + specifier: ^0.7.0 + version: 0.7.0 + clsx: + specifier: ^2.0.0 + version: 2.0.0 date-fns: specifier: ^2.30.0 version: 2.30.0 @@ -29,6 +35,9 @@ dependencies: eslint-config-next: specifier: 13.4.19 version: 13.4.19(eslint@8.48.0)(typescript@5.2.2) + lucide-react: + specifier: ^0.274.0 + version: 0.274.0(react@18.2.0) next: specifier: 13.4.19 version: 13.4.19(@babel/core@7.22.11)(react-dom@18.2.0)(react@18.2.0) @@ -44,14 +53,23 @@ dependencies: react-icons: specifier: ^4.10.1 version: 4.10.1(react@18.2.0) + tailwind-merge: + specifier: ^1.14.0 + version: 1.14.0 tailwindcss: specifier: 3.3.3 version: 3.3.3 + tailwindcss-animate: + specifier: ^1.0.7 + version: 1.0.7(tailwindcss@3.3.3) typescript: specifier: 5.2.2 version: 5.2.2 devDependencies: + '@typescript-eslint/eslint-plugin': + specifier: ^6.5.0 + version: 6.5.0(@typescript-eslint/parser@6.5.0)(eslint@8.48.0)(typescript@5.2.2) '@vitejs/plugin-react': specifier: ^4.0.4 version: 4.0.4(vite@4.4.9) @@ -683,6 +701,288 @@ packages: '@nodelib/fs.scandir': 2.1.5 fastq: 1.15.0 + /@radix-ui/primitive@1.0.1: + resolution: {integrity: sha512-yQ8oGX2GVsEYMWGxcovu1uGWPCxV5BFfeeYxqPmuAzUyLT9qmaMXSAhXpb0WrspIeqYzdJpkh2vHModJPgRIaw==} + dependencies: + '@babel/runtime': 7.22.11 + dev: false + + /@radix-ui/react-compose-refs@1.0.1(@types/react@18.2.21)(react@18.2.0): + resolution: {integrity: sha512-fDSBgd44FKHa1FRMU59qBMPFcl2PZE+2nmqunj+BWFyYYjnhIDWL2ItDs3rrbJDQOtzt5nIebLCQc4QRfz6LJw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.22.11 + '@types/react': 18.2.21 + react: 18.2.0 + dev: false + + /@radix-ui/react-context@1.0.1(@types/react@18.2.21)(react@18.2.0): + resolution: {integrity: sha512-ebbrdFoYTcuZ0v4wG5tedGnp9tzcV8awzsxYph7gXUyvnNLuTIcCk1q17JEbnVhXAKG9oX3KtchwiMIAYp9NLg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.22.11 + '@types/react': 18.2.21 + react: 18.2.0 + dev: false + + /@radix-ui/react-dialog@1.0.4(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-hJtRy/jPULGQZceSAP2Re6/4NpKo8im6V8P2hUqZsdFiSL8l35kYsw3qbRI6Ay5mQd2+wlLqje770eq+RJ3yZg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@babel/runtime': 7.22.11 + '@radix-ui/primitive': 1.0.1 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-dismissable-layer': 1.0.4(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-focus-guards': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-focus-scope': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-id': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-portal': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-slot': 1.0.2(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@types/react': 18.2.21 + '@types/react-dom': 18.2.7 + aria-hidden: 1.2.3 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + react-remove-scroll: 2.5.5(@types/react@18.2.21)(react@18.2.0) + dev: false + + /@radix-ui/react-dismissable-layer@1.0.4(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-7UpBa/RKMoHJYjie1gkF1DlK8l1fdU/VKDpoS3rCCo8YBJR294GwcEHyxHw72yvphJ7ld0AXEcSLAzY2F/WyCg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@babel/runtime': 7.22.11 + '@radix-ui/primitive': 1.0.1 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-use-escape-keydown': 1.0.3(@types/react@18.2.21)(react@18.2.0) + '@types/react': 18.2.21 + '@types/react-dom': 18.2.7 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@radix-ui/react-focus-guards@1.0.1(@types/react@18.2.21)(react@18.2.0): + resolution: {integrity: sha512-Rect2dWbQ8waGzhMavsIbmSVCgYxkXLxxR3ZvCX79JOglzdEy4JXMb98lq4hPxUbLr77nP0UOGf4rcMU+s1pUA==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.22.11 + '@types/react': 18.2.21 + react: 18.2.0 + dev: false + + /@radix-ui/react-focus-scope@1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-upXdPfqI4islj2CslyfUBNlaJCPybbqRHAi1KER7Isel9Q2AtSJ0zRBZv8mWQiFXD2nyAJ4BhC3yXgZ6kMBSrQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@babel/runtime': 7.22.11 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@types/react': 18.2.21 + '@types/react-dom': 18.2.7 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@radix-ui/react-id@1.0.1(@types/react@18.2.21)(react@18.2.0): + resolution: {integrity: sha512-tI7sT/kqYp8p96yGWY1OAnLHrqDgzHefRBKQ2YAkBS5ja7QLcZ9Z/uY7bEjPUatf8RomoXM8/1sMj1IJaE5UzQ==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.22.11 + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@types/react': 18.2.21 + react: 18.2.0 + dev: false + + /@radix-ui/react-portal@1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-xLYZeHrWoPmA5mEKEfZZevoVRK/Q43GfzRXkWV6qawIWWK8t6ifIiLQdd7rmQ4Vk1bmI21XhqF9BN3jWf+phpA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@babel/runtime': 7.22.11 + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0) + '@types/react': 18.2.21 + '@types/react-dom': 18.2.7 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@radix-ui/react-presence@1.0.1(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-UXLW4UAbIY5ZjcvzjfRFo5gxva8QirC9hF7wRE4U5gz+TP0DbRk+//qyuAQ1McDxBt1xNMBTaciFGvEmJvAZCg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@babel/runtime': 7.22.11 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@types/react': 18.2.21 + '@types/react-dom': 18.2.7 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@radix-ui/react-primitive@1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.21)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-yi58uVyoAcK/Nq1inRY56ZSjKypBNKTa/1mcL8qdl6oJeEaDbOldlzrGn7P6Q3Id5d+SYNGc5AJgc4vGhjs5+g==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + dependencies: + '@babel/runtime': 7.22.11 + '@radix-ui/react-slot': 1.0.2(@types/react@18.2.21)(react@18.2.0) + '@types/react': 18.2.21 + '@types/react-dom': 18.2.7 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + dev: false + + /@radix-ui/react-slot@1.0.2(@types/react@18.2.21)(react@18.2.0): + resolution: {integrity: sha512-YeTpuq4deV+6DusvVUW4ivBgnkHwECUu0BiN43L5UCDFgdhsRUWAghhTF5MbvNTPzmiFOx90asDSUjWuCNapwg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.22.11 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@types/react': 18.2.21 + react: 18.2.0 + dev: false + + /@radix-ui/react-use-callback-ref@1.0.1(@types/react@18.2.21)(react@18.2.0): + resolution: {integrity: sha512-D94LjX4Sp0xJFVaoQOd3OO9k7tpBYNOXdVhkltUbGv2Qb9OXdrg/CpsjlZv7ia14Sylv398LswWBVVu5nqKzAQ==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.22.11 + '@types/react': 18.2.21 + react: 18.2.0 + dev: false + + /@radix-ui/react-use-controllable-state@1.0.1(@types/react@18.2.21)(react@18.2.0): + resolution: {integrity: sha512-Svl5GY5FQeN758fWKrjM6Qb7asvXeiZltlT4U2gVfl8Gx5UAv2sMR0LWo8yhsIZh2oQ0eFdZ59aoOOMV7b47VA==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.22.11 + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@types/react': 18.2.21 + react: 18.2.0 + dev: false + + /@radix-ui/react-use-escape-keydown@1.0.3(@types/react@18.2.21)(react@18.2.0): + resolution: {integrity: sha512-vyL82j40hcFicA+M4Ex7hVkB9vHgSse1ZWomAqV2Je3RleKGO5iM8KMOEtfoSB0PnIelMd2lATjTGMYqN5ylTg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.22.11 + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@types/react': 18.2.21 + react: 18.2.0 + dev: false + + /@radix-ui/react-use-layout-effect@1.0.1(@types/react@18.2.21)(react@18.2.0): + resolution: {integrity: sha512-v/5RegiJWYdoCvMnITBkNNx6bCj20fiaJnWtRkU18yITptraXjffz5Qbn05uOiQnOvi+dbkznkoaMltz1GnszQ==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.22.11 + '@types/react': 18.2.21 + react: 18.2.0 + dev: false + /@rushstack/eslint-patch@1.3.3: resolution: {integrity: sha512-0xd7qez0AQ+MbHatZTlI1gu5vkG8r7MYRUJAHPAHJBmGLs16zpkrpAVLvjQKQOqaXPDUBwOiJzNc00znHSCVBw==} dev: false @@ -712,6 +1012,10 @@ packages: resolution: {integrity: sha512-mEo1sAde+UCE6b2hxn332f1g1E8WfYRu6p5SvTKr2ZKC1f7gFJXk4h5PyGP9Dt6gCaG8y8XhwnXWC6Iy2cmBng==} dev: true + /@types/json-schema@7.0.12: + resolution: {integrity: sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==} + dev: true + /@types/json5@0.0.29: resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} dev: false @@ -741,6 +1045,39 @@ packages: resolution: {integrity: sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==} dev: false + /@types/semver@7.5.1: + resolution: {integrity: sha512-cJRQXpObxfNKkFAZbJl2yjWtJCqELQIdShsogr1d2MilP8dKD9TE/nEKHkJgUNHdGKCQaf9HbIynuV2csLGVLg==} + dev: true + + /@typescript-eslint/eslint-plugin@6.5.0(@typescript-eslint/parser@6.5.0)(eslint@8.48.0)(typescript@5.2.2): + resolution: {integrity: sha512-2pktILyjvMaScU6iK3925uvGU87E+N9rh372uGZgiMYwafaw9SXq86U04XPq3UH6tzRvNgBsub6x2DacHc33lw==} + 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.8.0 + '@typescript-eslint/parser': 6.5.0(eslint@8.48.0)(typescript@5.2.2) + '@typescript-eslint/scope-manager': 6.5.0 + '@typescript-eslint/type-utils': 6.5.0(eslint@8.48.0)(typescript@5.2.2) + '@typescript-eslint/utils': 6.5.0(eslint@8.48.0)(typescript@5.2.2) + '@typescript-eslint/visitor-keys': 6.5.0 + debug: 4.3.4 + eslint: 8.48.0 + graphemer: 1.4.0 + ignore: 5.2.4 + natural-compare: 1.4.0 + semver: 7.5.4 + ts-api-utils: 1.0.2(typescript@5.2.2) + typescript: 5.2.2 + transitivePeerDependencies: + - supports-color + dev: true + /@typescript-eslint/parser@6.5.0(eslint@8.48.0)(typescript@5.2.2): resolution: {integrity: sha512-LMAVtR5GN8nY0G0BadkG0XIe4AcNMeyEy3DyhKGAh9k4pLSMBO7rF29JvDBpZGCmp5Pgz5RLHP6eCpSYZJQDuQ==} engines: {node: ^16.0.0 || >=18.0.0} @@ -760,7 +1097,6 @@ packages: typescript: 5.2.2 transitivePeerDependencies: - supports-color - dev: false /@typescript-eslint/scope-manager@6.5.0: resolution: {integrity: sha512-A8hZ7OlxURricpycp5kdPTH3XnjG85UpJS6Fn4VzeoH4T388gQJ/PGP4ole5NfKt4WDVhmLaQ/dBLNDC4Xl/Kw==} @@ -768,12 +1104,30 @@ packages: dependencies: '@typescript-eslint/types': 6.5.0 '@typescript-eslint/visitor-keys': 6.5.0 - dev: false + + /@typescript-eslint/type-utils@6.5.0(eslint@8.48.0)(typescript@5.2.2): + resolution: {integrity: sha512-f7OcZOkRivtujIBQ4yrJNIuwyCQO1OjocVqntl9dgSIZAdKqicj3xFDqDOzHDlGCZX990LqhLQXWRnQvsapq8A==} + 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.5.0(typescript@5.2.2) + '@typescript-eslint/utils': 6.5.0(eslint@8.48.0)(typescript@5.2.2) + debug: 4.3.4 + eslint: 8.48.0 + ts-api-utils: 1.0.2(typescript@5.2.2) + typescript: 5.2.2 + transitivePeerDependencies: + - supports-color + dev: true /@typescript-eslint/types@6.5.0: resolution: {integrity: sha512-eqLLOEF5/lU8jW3Bw+8auf4lZSbbljHR2saKnYqON12G/WsJrGeeDHWuQePoEf9ro22+JkbPfWQwKEC5WwLQ3w==} engines: {node: ^16.0.0 || >=18.0.0} - dev: false /@typescript-eslint/typescript-estree@6.5.0(typescript@5.2.2): resolution: {integrity: sha512-q0rGwSe9e5Kk/XzliB9h2LBc9tmXX25G0833r7kffbl5437FPWb2tbpIV9wAATebC/018pGa9fwPDuvGN+LxWQ==} @@ -794,7 +1148,25 @@ packages: typescript: 5.2.2 transitivePeerDependencies: - supports-color - dev: false + + /@typescript-eslint/utils@6.5.0(eslint@8.48.0)(typescript@5.2.2): + resolution: {integrity: sha512-9nqtjkNykFzeVtt9Pj6lyR9WEdd8npPhhIPM992FWVkZuS6tmxHfGVnlUcjpUP2hv8r4w35nT33mlxd+Be1ACQ==} + 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.48.0) + '@types/json-schema': 7.0.12 + '@types/semver': 7.5.1 + '@typescript-eslint/scope-manager': 6.5.0 + '@typescript-eslint/types': 6.5.0 + '@typescript-eslint/typescript-estree': 6.5.0(typescript@5.2.2) + eslint: 8.48.0 + semver: 7.5.4 + transitivePeerDependencies: + - supports-color + - typescript + dev: true /@typescript-eslint/visitor-keys@6.5.0: resolution: {integrity: sha512-yCB/2wkbv3hPsh02ZS8dFQnij9VVQXJMN/gbQsaaY+zxALkZnxa/wagvLEFsAWMPv7d7lxQmNsIzGU1w/T/WyA==} @@ -802,7 +1174,6 @@ packages: dependencies: '@typescript-eslint/types': 6.5.0 eslint-visitor-keys: 3.4.3 - dev: false /@vitejs/plugin-react@4.0.4(vite@4.4.9): resolution: {integrity: sha512-7wU921ABnNYkETiMaZy7XqpueMnpu5VxvVps13MjmCo+utBdD79sZzrApHawHtVX66cCJQQTXFcjH0y9dSUK8g==} @@ -935,6 +1306,13 @@ packages: /argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + /aria-hidden@1.2.3: + resolution: {integrity: sha512-xcLxITLe2HYa1cnYnwCjkOO1PqUHQpozB8x9AR0OgWN2woOBi5kSDVxKfd0b7sb1hw5qFeJhXm9H1nu3xSfLeQ==} + engines: {node: '>=10'} + dependencies: + tslib: 2.6.2 + dev: false + /aria-query@5.3.0: resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==} dependencies: @@ -962,7 +1340,6 @@ packages: /array-union@2.1.0: resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} engines: {node: '>=8'} - dev: false /array.prototype.findlastindex@1.2.3: resolution: {integrity: sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA==} @@ -1086,7 +1463,6 @@ packages: engines: {node: '>=8'} dependencies: fill-range: 7.0.1 - dev: false /browserslist@4.21.10: resolution: {integrity: sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ==} @@ -1176,14 +1552,21 @@ packages: fsevents: 2.3.3 dev: false - /classnames@2.3.2: - resolution: {integrity: sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw==} + /class-variance-authority@0.7.0: + resolution: {integrity: sha512-jFI8IQw4hczaL4ALINxqLEXQbWcNjoSkloa4IaufXCJr6QawJyw7tuRysRsrE8w2p/4gGaxKIt/hX3qz/IbD1A==} + dependencies: + clsx: 2.0.0 dev: false /client-only@0.0.1: resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} dev: false + /clsx@2.0.0: + resolution: {integrity: sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q==} + engines: {node: '>=6'} + dev: false + /color-convert@1.9.3: resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} dependencies: @@ -1318,6 +1701,10 @@ packages: engines: {node: '>=6'} dev: false + /detect-node-es@1.1.0: + resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==} + dev: false + /didyoumean@1.2.2: resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} dev: false @@ -1332,7 +1719,6 @@ packages: engines: {node: '>=8'} dependencies: path-type: 4.0.0 - dev: false /dlv@1.1.3: resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} @@ -1795,7 +2181,6 @@ packages: glob-parent: 5.1.2 merge2: 1.4.1 micromatch: 4.0.5 - dev: false /fast-json-stable-stringify@2.1.0: resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} @@ -1819,7 +2204,6 @@ packages: engines: {node: '>=8'} dependencies: to-regex-range: 5.0.1 - dev: false /find-up@5.0.0: resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} @@ -1903,6 +2287,11 @@ packages: has-symbols: 1.0.3 dev: false + /get-nonce@1.0.1: + resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==} + engines: {node: '>=6'} + dev: false + /get-symbol-description@1.0.0: resolution: {integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==} engines: {node: '>= 0.4'} @@ -1922,7 +2311,6 @@ packages: engines: {node: '>= 6'} dependencies: is-glob: 4.0.3 - dev: false /glob-parent@6.0.2: resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} @@ -1993,7 +2381,6 @@ packages: ignore: 5.2.4 merge2: 1.4.1 slash: 3.0.0 - dev: false /globrex@0.1.2: resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} @@ -2122,6 +2509,12 @@ packages: side-channel: 1.0.4 dev: false + /invariant@2.2.4: + resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==} + dependencies: + loose-envify: 1.4.0 + dev: false + /is-array-buffer@3.0.2: resolution: {integrity: sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==} dependencies: @@ -2218,7 +2611,6 @@ packages: /is-number@7.0.0: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} - dev: false /is-path-inside@3.0.3: resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} @@ -2461,6 +2853,13 @@ packages: engines: {node: '>=10'} dependencies: yallist: 4.0.0 + + /lucide-react@0.274.0(react@18.2.0): + resolution: {integrity: sha512-qiWcojRXEwDiSimMX1+arnxha+ROJzZjJaVvCC0rsG6a9pUPjZePXSq7em4ZKMp0NDm1hyzPNkM7UaWC3LU2AA==} + peerDependencies: + react: ^16.5.1 || ^17.0.0 || ^18.0.0 + dependencies: + react: 18.2.0 dev: false /magic-string@0.30.3: @@ -2473,7 +2872,6 @@ packages: /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==} @@ -2481,7 +2879,6 @@ packages: dependencies: braces: 3.0.2 picomatch: 2.3.1 - dev: false /mime-db@1.52.0: resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} @@ -2731,7 +3128,6 @@ packages: /path-type@4.0.0: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} - dev: false /pathe@1.1.1: resolution: {integrity: sha512-d+RQGp0MAYTIaDBIMmOfMwz3E+LOZnxx1HZd5R18mmCZY0QBlK0LDZfPc8FW8Ed2DlvsuE6PRjroDY+wg4+j/Q==} @@ -2747,7 +3143,6 @@ packages: /picomatch@2.3.1: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} - dev: false /pify@2.3.0: resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} @@ -2973,6 +3368,58 @@ packages: engines: {node: '>=0.10.0'} dev: true + /react-remove-scroll-bar@2.3.4(@types/react@18.2.21)(react@18.2.0): + resolution: {integrity: sha512-63C4YQBUt0m6ALadE9XV56hV8BgJWDmmTPY758iIJjfQKt2nYwoUrPk0LXRXcB/yIj82T1/Ixfdpdk68LwIB0A==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@types/react': 18.2.21 + react: 18.2.0 + react-style-singleton: 2.2.1(@types/react@18.2.21)(react@18.2.0) + tslib: 2.6.2 + dev: false + + /react-remove-scroll@2.5.5(@types/react@18.2.21)(react@18.2.0): + resolution: {integrity: sha512-ImKhrzJJsyXJfBZ4bzu8Bwpka14c/fQt0k+cyFp/PBhTfyDnU5hjOtM4AG/0AMyy8oKzOTR0lDgJIM7pYXI0kw==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@types/react': 18.2.21 + react: 18.2.0 + react-remove-scroll-bar: 2.3.4(@types/react@18.2.21)(react@18.2.0) + react-style-singleton: 2.2.1(@types/react@18.2.21)(react@18.2.0) + tslib: 2.6.2 + use-callback-ref: 1.3.0(@types/react@18.2.21)(react@18.2.0) + use-sidecar: 1.1.2(@types/react@18.2.21)(react@18.2.0) + dev: false + + /react-style-singleton@2.2.1(@types/react@18.2.21)(react@18.2.0): + resolution: {integrity: sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@types/react': 18.2.21 + get-nonce: 1.0.1 + invariant: 2.2.4 + react: 18.2.0 + tslib: 2.6.2 + dev: false + /react@18.2.0: resolution: {integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==} engines: {node: '>=0.10.0'} @@ -3120,7 +3567,6 @@ packages: hasBin: true dependencies: lru-cache: 6.0.0 - dev: false /shebang-command@2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} @@ -3147,7 +3593,6 @@ packages: /slash@3.0.0: resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} engines: {node: '>=8'} - dev: false /source-map-js@1.0.2: resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} @@ -3278,6 +3723,18 @@ packages: resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} dev: true + /tailwind-merge@1.14.0: + resolution: {integrity: sha512-3mFKyCo/MBcgyOTlrY8T7odzZFx+w+qKSMAmdFzRvqBfLlSigU6TZnlFHK0lkMwj9Bj8OYU+9yW9lmGuS0QEnQ==} + dev: false + + /tailwindcss-animate@1.0.7(tailwindcss@3.3.3): + resolution: {integrity: sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA==} + peerDependencies: + tailwindcss: '>=3.0.0 || insiders' + dependencies: + tailwindcss: 3.3.3 + dev: false + /tailwindcss@3.3.3: resolution: {integrity: sha512-A0KgSkef7eE4Mf+nKJ83i75TMyq8HqY3qmFIJSWy8bNt0v1lG7jUcpGpoTFxAwYcWOphcTBLPPJg+bDfhDf52w==} engines: {node: '>=14.0.0'} @@ -3353,7 +3810,6 @@ packages: engines: {node: '>=8.0'} dependencies: is-number: 7.0.0 - dev: false /tough-cookie@4.1.3: resolution: {integrity: sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==} @@ -3379,7 +3835,6 @@ packages: typescript: '>=4.2.0' dependencies: typescript: 5.2.2 - dev: false /ts-interface-checker@0.1.13: resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} @@ -3509,6 +3964,37 @@ packages: requires-port: 1.0.0 dev: true + /use-callback-ref@1.3.0(@types/react@18.2.21)(react@18.2.0): + resolution: {integrity: sha512-3FT9PRuRdbB9HfXhEq35u4oZkvpJ5kuYbpqhCfmiZyReuRgpnhDlbr2ZEnnuS0RrJAPn6l23xjFg9kpDM+Ms7w==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@types/react': 18.2.21 + react: 18.2.0 + tslib: 2.6.2 + dev: false + + /use-sidecar@1.1.2(@types/react@18.2.21)(react@18.2.0): + resolution: {integrity: sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': ^16.9.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@types/react': 18.2.21 + detect-node-es: 1.1.0 + react: 18.2.0 + tslib: 2.6.2 + dev: false + /util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} dev: false @@ -3788,7 +4274,6 @@ packages: /yallist@4.0.0: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} - dev: false /yaml@2.3.2: resolution: {integrity: sha512-N/lyzTPaJasoDmfV7YTrYCI0G/3ivm/9wdG0aHuheKowWQwGTsK0Eoiw6utmzAnI6pkJa0DUVygvp3spqqEKXg==} diff --git a/apps/web/public/favicon.ico b/apps/web/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..e596e050ee1057cbc65fdcc8f7ae862e1bbad69d GIT binary patch literal 15406 zcmeHO32@X`8DA{gjx!3aZFSTtN*6e^b-auv#b zgg|pNgp!k7b$U*LVb0>R#e!sW;_sAy91~!{G?wfh}@Ba7y{@?F? z?|a|-uE=EbWcSGyE|l?gk<4YjO!kaSCR?<~@O|-vGMO*mTe9T#?@!2N*^kI%i}@KI z!Xpg#`7&vvIo`%JM1h4`I+m`XjCvhu_0tD@G)+U#c&O+`yY7yIOX?EnO3`OjQXfxw zHBr>iQAm2dj%*oU+m=IHeHYX4SRak6hegjQ^QY!+g-zpCno)9%{uAvD`4#O8eU3g2 zeU{dGJxZ4gPS`Xa6We_DaoXbh1RV(fEgj^3`qF#U(A`EGKL+KgpqM2tv~%;L0hla)1mV((*CgLX-qXp zm0fyz&PzqfH9C4bL`^Z}TB~(XG$he`t}@2FRQ&cu(hBh%{6lN#(^JY#9bIeCku`N< zzW36`GmFUW!e2k964b_+39UsZyB6P3W0L++W}h{WMj(Yk%lVAD-( ztpgMEUy;d{999txj!#b$>vUSW#5OkMa8K|rDe&rAI+wbh+%CQ*bU}MxwFM5GLC<>| zbU%3Dn{S|B$9j3kWeugXkD?s49Yavczi6rJm&6))#s7n}I)grkF2dTcJN+FhZ@OxM zVLQ{2__fD9adPZ!cU)hvqA$ytSfkt-cu@4~ahxMl)qwawQ<8N4l zS9}dT0G2lXzBb0-W9&`V5O`!u3rpW@qybuGx8%lQH7%JIzX6YV!yG@$($LB%HF@P| zY4rs)h4Nm|**10Ys*u!;7BtG6Qj8>OTeB^GGv|%*p?mzGXf*gd5})BSNUfwU-bjDt zsjm|D$xO7!tX;J9ghBq|a}V;d3faq$K%(Nyx7AS zS8;J)K=HXpCY22dBd(Z>+r`&KoV-(6XUvN`8b9g^b_D$Nc3kFux|p+9$iF$(sXil* zjdehb39_W)IHRNSL+*hA@eJg~6^&PT7wc(cOetc&9n9y+dRuQ5)wSnxZNuY2?pk^j zV&0C%58h^!`LWC|WE@Ws_HRM$1yL_h)to`qE!V7iSz|J#mY(Lih~IDw=RR8F^)O{~ zULQJXHt?gKC7WYeI|H9&S^61$=>9e1evsmjce<`}|GKD=nJxTSgR15 z{08$sm>`R@!GGWnxVmOqJeROTeo)tg*qoYU?0uYP*vk1A$!?Rb`{f$yyPS@0Aa2#=q2c9$_XdMrQNYhzBvmN^cLbkWhsKZv;fo^wwdZ3AHoX<-kUx|C0v z?7gU&*nP!Xe)h5anCFm?Qcg#lM?cdusw7{=og$* zu;G-$ZKC7so7mKh=Q#Ub=CXs&yOK=!0k>mNFZ>zQtzpkhCr31qCcZ<5A}@b7=>vNI z#4Hh{(>Ak_lT6&giPZ zkn;q-L+5`d><069LEk`UO89Zbd@%osHGxW=&YFuRJ@l%tnsS?TTr;VoJ)Dn~=H?Qu zrY>HWyKNfww@_1QjtQSn#r%zKvVCUW21mQ-aKwvN&!Ub2x&4U^XR&9thTb@*rkBt1 z9%j81rO?rz{Z&Ht5o5U*xdA=YZ)`sMLn}<4@qZ`eAk7>6lw(nUw0brw>yt_GV=Qzd zYB2Kotit)0#PzPInSdk96Y>o@Qz|FSn7XCTv zC7_q2=TPH;TAQIUlmBaat7AXmT;0dKmGu7yTwehHrM0I*__p9L>fmrL0RM8g`E=&; za<(&C9Sigh)ZjD5<{spl`ya7hd`O%L@Czz9=8%woRKzA$oO*!$gas6nvtQV5u=x=) z!udT{8uTR2uB5_K6wS3)7jr(Ph|KMj$n}TbiSLS-1J(oecv!dIp=MzZ!GE7?4Sa>Y ziC7!-C)NQzG4w9#2sVB31CABF# Date: Fri, 1 Sep 2023 14:56:48 +0200 Subject: [PATCH 553/883] feat(home): add home base components --- apps/web/app/(home)/page.tsx | 70 +++++++++ apps/web/app/(home)/rating.tsx | 18 +-- apps/web/app/layout.tsx | 3 + apps/web/components/basket/extra.tsx | 34 +++++ apps/web/components/basket/index.tsx | 56 +++++++ apps/web/components/basket/product.tsx | 39 +++++ apps/web/components/basket/promotion.tsx | 8 + apps/web/components/basket/taxes.tsx | 14 ++ apps/web/components/ui/Logo.tsx | 4 +- apps/web/components/ui/button/index.tsx | 5 + apps/web/components/ui/button/solid.tsx | 10 ++ apps/web/components/ui/header/gradient.tsx | 23 +++ .../components/ui/navbar/dropdown/list.tsx | 4 +- apps/web/components/ui/navbar/index.tsx | 2 +- apps/web/components/ui/navbar/location.tsx | 4 +- apps/web/components/ui/sheet.tsx | 144 ++++++++++++++++++ apps/web/public/images/gradient.png | Bin 0 -> 23335 bytes apps/web/public/images/tmp/pork.png | Bin 0 -> 56708 bytes apps/web/public/images/tmp/wich.png | Bin 0 -> 43264 bytes 19 files changed, 422 insertions(+), 16 deletions(-) create mode 100644 apps/web/components/basket/extra.tsx create mode 100644 apps/web/components/basket/index.tsx create mode 100644 apps/web/components/basket/product.tsx create mode 100644 apps/web/components/basket/promotion.tsx create mode 100644 apps/web/components/basket/taxes.tsx create mode 100644 apps/web/components/ui/button/index.tsx create mode 100644 apps/web/components/ui/button/solid.tsx create mode 100644 apps/web/components/ui/header/gradient.tsx create mode 100644 apps/web/components/ui/sheet.tsx create mode 100644 apps/web/public/images/gradient.png create mode 100644 apps/web/public/images/tmp/pork.png create mode 100644 apps/web/public/images/tmp/wich.png diff --git a/apps/web/app/(home)/page.tsx b/apps/web/app/(home)/page.tsx index b368b1a7..7a64c6cf 100644 --- a/apps/web/app/(home)/page.tsx +++ b/apps/web/app/(home)/page.tsx @@ -1,4 +1,5 @@ import { RatingSection } from "@/app/(home)/rating"; +import { BasketWrapper } from "@/components/basket"; import { Navbar } from "@/components/ui/navbar"; export default function Home() { @@ -6,6 +7,75 @@ export default function Home() { <> +
+
+
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit. Atque sint eum, dolorum architecto repellat, at + voluptatibus ut impedit harum maiores libero fuga quos! Veniam ratione voluptas illo vitae molestiae minus! + Lorem ipsum dolor sit amet, consectetur adipisicing elit. Atque sint eum, dolorum architecto repellat, at + voluptatibus ut impedit harum maiores libero fuga quos! Veniam ratione voluptas illo vitae molestiae minus! + Lorem ipsum dolor sit amet, consectetur adipisicing elit. Atque sint eum, dolorum architecto repellat, at + voluptatibus ut impedit harum maiores libero fuga quos! Veniam ratione voluptas illo vitae molestiae minus! + Lorem ipsum dolor sit amet, consectetur adipisicing elit. Atque sint eum, dolorum architecto repellat, at + voluptatibus ut impedit harum maiores libero fuga quos! Veniam ratione voluptas illo vitae molestiae minus! + Lorem ipsum dolor sit amet, consectetur adipisicing elit. Atque sint eum, dolorum architecto repellat, at + voluptatibus ut impedit harum maiores libero fuga quos! Veniam ratione voluptas illo vitae molestiae minus! + Lorem ipsum dolor sit amet, consectetur adipisicing elit. Atque sint eum, dolorum architecto repellat, at + voluptatibus ut impedit harum maiores libero fuga quos! Veniam ratione voluptas illo vitae molestiae minus! + Lorem ipsum dolor sit amet, consectetur adipisicing elit. Atque sint eum, dolorum architecto repellat, at + voluptatibus ut impedit harum maiores libero fuga quos! Veniam ratione voluptas illo vitae molestiae minus! + Lorem ipsum dolor sit amet, consectetur adipisicing elit. Atque sint eum, dolorum architecto repellat, at + voluptatibus ut impedit harum maiores libero fuga quos! Veniam ratione voluptas illo vitae molestiae minus! + Lorem ipsum dolor sit amet, consectetur adipisicing elit. Atque sint eum, dolorum architecto repellat, at + voluptatibus ut impedit harum maiores libero fuga quos! Veniam ratione voluptas illo vitae molestiae minus! + Lorem ipsum dolor sit amet, consectetur adipisicing elit. Atque sint eum, dolorum architecto repellat, at + voluptatibus ut impedit harum maiores libero fuga quos! Veniam ratione voluptas illo vitae molestiae minus! + Lorem ipsum dolor sit amet, consectetur adipisicing elit. Atque sint eum, dolorum architecto repellat, at + voluptatibus ut impedit harum maiores libero fuga quos! Veniam ratione voluptas illo vitae molestiae minus! + Lorem ipsum dolor sit amet, consectetur adipisicing elit. Atque sint eum, dolorum architecto repellat, at + voluptatibus ut impedit harum maiores libero fuga quos! Veniam ratione voluptas illo vitae molestiae minus! + Lorem ipsum dolor sit amet, consectetur adipisicing elit. Atque sint eum, dolorum architecto repellat, at + voluptatibus ut impedit harum maiores libero fuga quos! Veniam ratione voluptas illo vitae molestiae minus! + Lorem ipsum dolor sit amet, consectetur adipisicing elit. Atque sint eum, dolorum architecto repellat, at + voluptatibus ut impedit harum maiores libero fuga quos! Veniam ratione voluptas illo vitae molestiae minus! + Lorem ipsum dolor sit amet, consectetur adipisicing elit. Atque sint eum, dolorum architecto repellat, at + voluptatibus ut impedit harum maiores libero fuga quos! Veniam ratione voluptas illo vitae molestiae minus! + Lorem ipsum dolor sit amet, consectetur adipisicing elit. Atque sint eum, dolorum architecto repellat, at + voluptatibus ut impedit harum maiores libero fuga quos! Veniam ratione voluptas illo vitae molestiae minus! + Lorem ipsum dolor sit amet, consectetur adipisicing elit. Atque sint eum, dolorum architecto repellat, at + voluptatibus ut impedit harum maiores libero fuga quos! Veniam ratione voluptas illo vitae molestiae minus! + Lorem ipsum dolor sit amet, consectetur adipisicing elit. Atque sint eum, dolorum architecto repellat, at + voluptatibus ut impedit harum maiores libero fuga quos! Veniam ratione voluptas illo vitae molestiae minus! + Lorem ipsum dolor sit amet, consectetur adipisicing elit. Atque sint eum, dolorum architecto repellat, at + voluptatibus ut impedit harum maiores libero fuga quos! Veniam ratione voluptas illo vitae molestiae minus! + Lorem ipsum dolor sit amet, consectetur adipisicing elit. Atque sint eum, dolorum architecto repellat, at + voluptatibus ut impedit harum maiores libero fuga quos! Veniam ratione voluptas illo vitae molestiae minus! + Lorem ipsum dolor sit amet, consectetur adipisicing elit. Atque sint eum, dolorum architecto repellat, at + voluptatibus ut impedit harum maiores libero fuga quos! Veniam ratione voluptas illo vitae molestiae minus! + Lorem ipsum dolor sit amet, consectetur adipisicing elit. Atque sint eum, dolorum architecto repellat, at + voluptatibus ut impedit harum maiores libero fuga quos! Veniam ratione voluptas illo vitae molestiae minus! + Lorem ipsum dolor sit amet, consectetur adipisicing elit. Atque sint eum, dolorum architecto repellat, at + voluptatibus ut impedit harum maiores libero fuga quos! Veniam ratione voluptas illo vitae molestiae minus! + Lorem ipsum dolor sit amet, consectetur adipisicing elit. Atque sint eum, dolorum architecto repellat, at + voluptatibus ut impedit harum maiores libero fuga quos! Veniam ratione voluptas illo vitae molestiae minus! + Lorem ipsum dolor sit amet, consectetur adipisicing elit. Atque sint eum, dolorum architecto repellat, at + voluptatibus ut impedit harum maiores libero fuga quos! Veniam ratione voluptas illo vitae molestiae minus! + Lorem ipsum dolor sit amet, consectetur adipisicing elit. Atque sint eum, dolorum architecto repellat, at + voluptatibus ut impedit harum maiores libero fuga quos! Veniam ratione voluptas illo vitae molestiae minus! + Lorem ipsum dolor sit amet, consectetur adipisicing elit. Atque sint eum, dolorum architecto repellat, at + voluptatibus ut impedit harum maiores libero fuga quos! Veniam ratione voluptas illo vitae molestiae minus! + Lorem ipsum dolor sit amet, consectetur adipisicing elit. Atque sint eum, dolorum architecto repellat, at + voluptatibus ut impedit harum maiores libero fuga quos! Veniam ratione voluptas illo vitae molestiae minus! + Lorem ipsum dolor sit amet, consectetur adipisicing elit. Atque sint eum, dolorum architecto repellat, at + voluptatibus ut impedit harum maiores libero fuga quos! Veniam ratione voluptas illo vitae molestiae minus! + Lorem ipsum dolor sit amet, consectetur adipisicing elit. Atque sint eum, dolorum architecto repellat, at + voluptatibus ut impedit harum maiores libero fuga quos! Veniam ratione voluptas illo vitae molestiae minus! +
+ {/*
*/} + + {/*
*/} +
+
); } diff --git a/apps/web/app/(home)/rating.tsx b/apps/web/app/(home)/rating.tsx index 638281d6..2fb5014b 100644 --- a/apps/web/app/(home)/rating.tsx +++ b/apps/web/app/(home)/rating.tsx @@ -1,8 +1,8 @@ -import Image from "next/image"; -import { Inria_Serif } from "next/font/google"; -import classNames from "classnames"; -import { MdOutlineStar, MdStar, MdStarOutline } from "react-icons/md"; import { useAuth } from "@/hooks/useAuth"; +import { cn } from "@/lib/utils"; +import { Inria_Serif } from "next/font/google"; +import Image from "next/image"; +import { MdOutlineStar } from "react-icons/md"; const inria_serif = Inria_Serif({ subsets: ["latin"], weight: ["400", "700"] }); @@ -10,8 +10,8 @@ export const RatingSection = () => { const { user } = useAuth(); return (
@@ -23,7 +23,7 @@ export const RatingSection = () => { height={1580} className="absolute inset-0 z-0 h-80 object-cover" /> -
+

{user.first_name}

{"Comment s'est passé votre repas mardi ?"}

@@ -31,8 +31,8 @@ export const RatingSection = () => {
{[...Array(5)].map((_, i) => (
- - + {/* */} +
))}
diff --git a/apps/web/app/layout.tsx b/apps/web/app/layout.tsx index 726c3f00..e2dfe927 100644 --- a/apps/web/app/layout.tsx +++ b/apps/web/app/layout.tsx @@ -12,6 +12,9 @@ export const metadata: Metadata = { export default function RootLayout({ children }: { children: React.ReactNode }) { return ( + + + {children} ); diff --git a/apps/web/components/basket/extra.tsx b/apps/web/components/basket/extra.tsx new file mode 100644 index 00000000..e35d3958 --- /dev/null +++ b/apps/web/components/basket/extra.tsx @@ -0,0 +1,34 @@ +import { MdAdd } from "react-icons/md"; + +export const BasketExtra = () => { + return ( +
+
+ Pain +
+ + dès 0€15 + + +
+
+
+
+ Couverts +
+ + dès 0€15 + + +
+
+ Bio-dégradables 🌱 + Fourchette, couteau, cuillère et serviette +
+
+ ); +}; diff --git a/apps/web/components/basket/index.tsx b/apps/web/components/basket/index.tsx new file mode 100644 index 00000000..fa0c1433 --- /dev/null +++ b/apps/web/components/basket/index.tsx @@ -0,0 +1,56 @@ +import { BasketExtra } from "@/components/basket/extra"; +import { ProductBasketItem } from "@/components/basket/product"; +import { BasketPromotion } from "@/components/basket/promotion"; +import { BasketTaxes } from "@/components/basket/taxes"; +import { Button } from "@/components/ui/button"; +import { GradientHeader } from "@/components/ui/header/gradient"; +import { productList } from "@/constants/data"; +import Image from "next/image"; +import { MdArrowForward, MdOutlineShoppingBasket } from "react-icons/md"; + +export const BasketWrapper = () => { + return ( +
+
+ +
+ + Panier +
+ {/*
25€50
*/} +
+
+ Gradient +
+ {productList.map((product) => ( + + ))} +
+
+
+
+ + + + +
+ + Total +
+
25€50
+
+
+ +
+
+ ); +}; diff --git a/apps/web/components/basket/product.tsx b/apps/web/components/basket/product.tsx new file mode 100644 index 00000000..3d28f711 --- /dev/null +++ b/apps/web/components/basket/product.tsx @@ -0,0 +1,39 @@ +import { Product } from "@/types/product"; +import Image from "next/image"; +import { MdAdd, MdDelete, MdRemove } from "react-icons/md"; + +export const ProductBasketItem = (product: Product) => { + return ( +
+ {product.name} +
+ {product.name} +
+
+ + 1 + +
+
+ + + {product.price.toFixed(2).replace(".", "€")} + +
+
+
+
+ ); +}; diff --git a/apps/web/components/basket/promotion.tsx b/apps/web/components/basket/promotion.tsx new file mode 100644 index 00000000..6dea07c9 --- /dev/null +++ b/apps/web/components/basket/promotion.tsx @@ -0,0 +1,8 @@ +export const BasketPromotion = () => { + return ( + + ); +}; diff --git a/apps/web/components/basket/taxes.tsx b/apps/web/components/basket/taxes.tsx new file mode 100644 index 00000000..84a1e9f2 --- /dev/null +++ b/apps/web/components/basket/taxes.tsx @@ -0,0 +1,14 @@ +export const BasketTaxes = () => { + return ( +
+
+ Livraison +
On vous l'offre
+
+
+ Frais de service +
0€50
+
+
+ ); +}; diff --git a/apps/web/components/ui/Logo.tsx b/apps/web/components/ui/Logo.tsx index 9c481647..89d67934 100644 --- a/apps/web/components/ui/Logo.tsx +++ b/apps/web/components/ui/Logo.tsx @@ -1,4 +1,4 @@ -import classNames from "classnames"; +import { cn } from "@/lib/utils"; export const Logo = ({ className }: { className?: string }) => ( <> @@ -33,7 +33,7 @@ export const Logo = ({ className }: { className?: string }) => ( height="72" viewBox="0 0 292 72" fill="none" - className={classNames(className, "hidden shrink-0 lg:block")} + className={cn(className, "hidden shrink-0 lg:block")} xmlns="http://www.w3.org/2000/svg" > { + return <>{type === "solid" && {props.children}}; +}; diff --git a/apps/web/components/ui/button/solid.tsx b/apps/web/components/ui/button/solid.tsx new file mode 100644 index 00000000..beea286e --- /dev/null +++ b/apps/web/components/ui/button/solid.tsx @@ -0,0 +1,10 @@ +export const SolidButton = ({ children, className, ...props }: { children: React.ReactNode; className?: string }) => { + return ( + + ); +}; diff --git a/apps/web/components/ui/header/gradient.tsx b/apps/web/components/ui/header/gradient.tsx new file mode 100644 index 00000000..b2c24623 --- /dev/null +++ b/apps/web/components/ui/header/gradient.tsx @@ -0,0 +1,23 @@ +import { cn } from "@/lib/utils"; +import Image from "next/image"; + +export const GradientHeader = ({ + color, + wrapperClassName, + className, + children, +}: { + color: string; + wrapperClassName?: string; + className?: string; + children: React.ReactNode; +}) => { + return ( +
+ Gradient +
+ {children} +
+
+ ); +}; diff --git a/apps/web/components/ui/navbar/dropdown/list.tsx b/apps/web/components/ui/navbar/dropdown/list.tsx index efb64d80..2785cdd7 100644 --- a/apps/web/components/ui/navbar/dropdown/list.tsx +++ b/apps/web/components/ui/navbar/dropdown/list.tsx @@ -1,11 +1,11 @@ import { BasketDropdown } from "@/components/ui/navbar/dropdown/basket"; import { LocationDropdown } from "@/components/ui/navbar/dropdown/location"; import { UserDropdown } from "@/components/ui/navbar/dropdown/user"; -import classNames from "classnames"; +import { cn } from "@/lib/utils"; export const DropdownList = ({ className }: { className?: string }) => { return ( -
+
diff --git a/apps/web/components/ui/navbar/index.tsx b/apps/web/components/ui/navbar/index.tsx index ffac1367..f92947fc 100644 --- a/apps/web/components/ui/navbar/index.tsx +++ b/apps/web/components/ui/navbar/index.tsx @@ -6,7 +6,7 @@ import Link from "next/link"; export const Navbar = () => { return ( -